From 773f6015a58abccea39a3464d12ce069faff75e9 Mon Sep 17 00:00:00 2001 From: Adorilson Bezerra Date: Mon, 31 Aug 2020 21:54:15 -0300 Subject: [PATCH 0001/1261] Doc: Fix the array.fromfile method doc The check about the f argument type was removed in this commit: https://github.com/python/cpython/commit/2c94aa567e525c82041ad68a3174d8c3acbf37e2 Thanks for Pedro Arthur Duarte (pedroarthur.jedi at gmail.com) by the help with this bug. --- Doc/library/array.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Doc/library/array.rst b/Doc/library/array.rst index 78020738bf4f75..f2f7894e1bf0f0 100644 --- a/Doc/library/array.rst +++ b/Doc/library/array.rst @@ -160,8 +160,7 @@ The following data items and methods are also supported: Read *n* items (as machine values) from the :term:`file object` *f* and append them to the end of the array. If less than *n* items are available, :exc:`EOFError` is raised, but the items that were available are still - inserted into the array. *f* must be a real built-in file object; something - else with a :meth:`read` method won't do. + inserted into the array. .. method:: array.fromlist(list) From 62b99261f859fa0cd828f4b8e6e6a476adde8317 Mon Sep 17 00:00:00 2001 From: Adorilson Bezerra Date: Sat, 27 Feb 2021 20:09:10 -0300 Subject: [PATCH 0002/1261] [DOC] Added snipped code in str.capitalize --- Doc/library/stdtypes.rst | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 0929f3271e0519..9e5d1b832673a5 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1529,13 +1529,21 @@ expression support in the :mod:`re` module). .. method:: str.capitalize() Return a copy of the string with its first character capitalized and the - rest lowercased. + rest lowercased. For example:: + + >>> 'PYTHON IS AMAZING'.capitalize() + 'Python is amazing' + >>> 'Njemačka Starts With a non-english Digraph'.capitalize() + 'Njemačka starts with a non-english digraph' + + See also :meth:`title`. .. versionchanged:: 3.8 The first character is now put into titlecase rather than uppercase. This means that characters like digraphs will only have their first letter capitalized, instead of the full character. + .. method:: str.casefold() Return a casefolded copy of the string. Casefolded strings may be used for @@ -1853,7 +1861,7 @@ expression support in the :mod:`re` module). See :meth:`str.removeprefix` for a method that will remove a single prefix string rather than all of a set of characters. For example:: - >>> 'Arthur: three!'.lstrip('Arthur: ') + >>> 'Arthur: three!'.lstrip('Arthur: ' 'ee!' >>> 'Arthur: three!'.removeprefix('Arthur: ') 'three!' From 63c985dbd4bad01eb219b235bae674a05238ad38 Mon Sep 17 00:00:00 2001 From: Adorilson Bezerra Date: Sat, 27 Feb 2021 20:27:04 -0300 Subject: [PATCH 0003/1261] [DOC] Add snippet code in str.casefold and str.lower methods --- Doc/library/stdtypes.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 9e5d1b832673a5..a7f136769fd863 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1553,7 +1553,12 @@ expression support in the :mod:`re` module). intended to remove all case distinctions in a string. For example, the German lowercase letter ``'ß'`` is equivalent to ``"ss"``. Since it is already lowercase, :meth:`lower` would do nothing to ``'ß'``; :meth:`casefold` - converts it to ``"ss"``. + converts it to ``"ss"``, as follows:: + + >>> 'ß'.casefold() + 'ss' + >>> 'ß'.lower() + 'ß' The casefolding algorithm is described in section 3.13 of the Unicode Standard. @@ -1840,11 +1845,15 @@ expression support in the :mod:`re` module). .. method:: str.lower() Return a copy of the string with all the cased characters [4]_ converted to - lowercase. + lowercase. For example:: + + >>> 'Lower Method Example'.lower() + 'lower method example' The lowercasing algorithm used is described in section 3.13 of the Unicode Standard. + See also :meth:`casefold`. .. method:: str.lstrip([chars]) From 41f721cfa1448e67aabe83c4661d77d1e1642161 Mon Sep 17 00:00:00 2001 From: Adorilson Bezerra Date: Sat, 27 Feb 2021 20:36:28 -0300 Subject: [PATCH 0004/1261] [DOC] Added snippet code in str.count method --- Doc/library/stdtypes.rst | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index a7f136769fd863..3e6cf10d4895e5 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1570,8 +1570,14 @@ expression support in the :mod:`re` module). Return centered in a string of length *width*. Padding is done using the specified *fillchar* (default is an ASCII space). The original string is - returned if *width* is less than or equal to ``len(s)``. - + returned if *width* is less than or equal to ``len(s)``. For example:: + + >>> 'Python'.center(10) + ' Python ' + >>> 'Python'.center(10, '-') + '--Python--' + >>> 'Python'.center(4) + 'Python' .. method:: str.count(sub[, start[, end]]) From 7199327caf96ecff6107bfaf90f9990a8e4ab463 Mon Sep 17 00:00:00 2001 From: Adorilson Bezerra Date: Sat, 27 Feb 2021 20:52:46 -0300 Subject: [PATCH 0005/1261] [DOC] Added snippet code in str.count method --- Doc/library/stdtypes.rst | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 3e6cf10d4895e5..595f4bef643ad6 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1584,8 +1584,16 @@ expression support in the :mod:`re` module). Return the number of non-overlapping occurrences of substring *sub* in the range [*start*, *end*]. Optional arguments *start* and *end* are - interpreted as in slice notation. - + interpreted as in slice notation. For example:: + + >>> 'spam, spam, spam'.count('spam') + 3 + >>> 'spam, spam, spam'.count('spam', 5) + 2 + >>> 'spam, spam, spam'.count('spam', 5, 10) + 1 + >>> 'spam, spam, spam'.count('eggs') + 0 .. method:: str.encode(encoding="utf-8", errors="strict") From 439ce219b6fb4e3579f9587d1cab960ab57e5e52 Mon Sep 17 00:00:00 2001 From: Adorilson Bezerra Date: Sat, 27 Feb 2021 21:41:09 -0300 Subject: [PATCH 0006/1261] [DOC] fix typo --- Doc/library/stdtypes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 595f4bef643ad6..fdf38412e99c36 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1884,7 +1884,7 @@ expression support in the :mod:`re` module). See :meth:`str.removeprefix` for a method that will remove a single prefix string rather than all of a set of characters. For example:: - >>> 'Arthur: three!'.lstrip('Arthur: ' + >>> 'Arthur: three!'.lstrip('Arthur: ') 'ee!' >>> 'Arthur: three!'.removeprefix('Arthur: ') 'three!' From 04911d763a59413a910109dacdf3c643633f56bd Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Tue, 1 Sep 2020 03:07:29 -0300 Subject: [PATCH 0007/1261] [doc] Document VIRTUAL_ENV environment variable (GH-21970) --- Doc/using/venv-create.inc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc index c8f6e8f87d5674..8f850a74d413ce 100644 --- a/Doc/using/venv-create.inc +++ b/Doc/using/venv-create.inc @@ -126,6 +126,10 @@ directory containing the virtual environment): | | PowerShell | PS C:\\> \\Scripts\\Activate.ps1 | +-------------+-----------------+-----------------------------------------+ +When a virtual environment is active, the :envvar:`VIRTUAL_ENV` environment +variable is set to the path of the virtual environment. This can be used to +check if one is running inside a virtual environment. + You don't specifically *need* to activate an environment; activation just prepends the virtual environment's binary directory to your path, so that "python" invokes the virtual environment's Python interpreter and you can run From 6955b557d8fbb5a434fe19ff71e38571c172cc5d Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 1 Sep 2020 05:40:27 -0400 Subject: [PATCH 0008/1261] bpo-41685: Temporarily pin setuptools to 49.2.1 in Docs venv. (GH-22038) See https://github.com/pypa/setuptools/pull/2361 --- Doc/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/Makefile b/Doc/Makefile index b8ca1edfbc60a5..87d5d07665c863 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -142,7 +142,8 @@ clean: venv: $(PYTHON) -m venv $(VENVDIR) - $(VENVDIR)/bin/python3 -m pip install -U pip setuptools +# $(VENVDIR)/bin/python3 -m pip install -U pip setuptools + $(VENVDIR)/bin/python3 -m pip install -U pip setuptools==49.2.1 $(VENVDIR)/bin/python3 -m pip install -U Sphinx==2.3.1 blurb python-docs-theme @echo "The venv has been created in the $(VENVDIR) directory" From 2cce203508ddde3f3c77862bbf5ba62daba35f35 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Tue, 1 Sep 2020 09:59:46 -0300 Subject: [PATCH 0009/1261] [doc] Add link to FileHandler in logging (GH-21940) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andrés Delfino --- Doc/library/logging.rst | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index a446c80ece6048..19691d50937a71 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1166,9 +1166,9 @@ functions. +--------------+---------------------------------------------+ | Format | Description | +==============+=============================================+ - | *filename* | Specifies that a FileHandler be created, | - | | using the specified filename, rather than a | - | | StreamHandler. | + | *filename* | Specifies that a :class:`FileHandler` be | + | | created, using the specified filename, | + | | rather than a :class:`StreamHandler`. | +--------------+---------------------------------------------+ | *filemode* | If *filename* is specified, open the file | | | in this :ref:`mode `. Defaults | @@ -1192,9 +1192,10 @@ functions. | | :ref:`level `. | +--------------+---------------------------------------------+ | *stream* | Use the specified stream to initialize the | - | | StreamHandler. Note that this argument is | - | | incompatible with *filename* - if both | - | | are present, a ``ValueError`` is raised. | + | | :class:`StreamHandler`. Note that this | + | | argument is incompatible with *filename* - | + | | if both are present, a ``ValueError`` is | + | | raised. | +--------------+---------------------------------------------+ | *handlers* | If specified, this should be an iterable of | | | already created handlers to add to the root | @@ -1213,18 +1214,18 @@ functions. +--------------+---------------------------------------------+ | *encoding* | If this keyword argument is specified along | | | with *filename*, its value is used when the | - | | FileHandler is created, and thus used when | - | | opening the output file. | + | | :class:`FileHandler` is created, and thus | + | | used when opening the output file. | +--------------+---------------------------------------------+ | *errors* | If this keyword argument is specified along | | | with *filename*, its value is used when the | - | | FileHandler is created, and thus used when | - | | opening the output file. If not specified, | - | | the value 'backslashreplace' is used. Note | - | | that if ``None`` is specified, it will be | - | | passed as such to :func:`open`, which means | - | | that it will be treated the same as passing | - | | 'errors'. | + | | :class:`FileHandler` is created, and thus | + | | used when opening the output file. If not | + | | specified, the value 'backslashreplace' is | + | | used. Note that if ``None`` is specified, | + | | it will be passed as such to :func:`open`, | + | | which means that it will be treated the | + | | same as passing 'errors'. | +--------------+---------------------------------------------+ .. versionchanged:: 3.2 From 9e1a5eacf97432feed186cd13a76fddbe8d62758 Mon Sep 17 00:00:00 2001 From: han-solo Date: Tue, 1 Sep 2020 10:34:29 -0400 Subject: [PATCH 0010/1261] bpo-41681: Fix for `f-string/str.format` error description when using 2 `,` in format specifier (GH-22036) * Fixed `f-string/str.format` error description when using two `,` in format specifier. Co-authored-by: millefalcon --- Lib/test/test_format.py | 20 +++++++++++++++++++ Lib/test/test_fstring.py | 20 +++++++++++++++++++ .../2020-08-31-17-49-02.bpo-41681.3-VJiH.rst | 2 ++ Python/formatter_unicode.c | 6 ++++-- 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py index e9e5bb9cf00a62..dff8c690321878 100644 --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -1,6 +1,7 @@ from test.support import verbose, TestFailed import locale import sys +import re import test.support as support import unittest @@ -495,6 +496,25 @@ def test_g_format_has_no_trailing_zeros(self): self.assertEqual(format(12300050.0, ".6g"), "1.23e+07") self.assertEqual(format(12300050.0, "#.6g"), "1.23000e+07") + def test_with_two_commas_in_format_specifier(self): + error_msg = re.escape("Cannot specify ',' with ','.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:,,}'.format(1) + + def test_with_two_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify '_' with '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:__}'.format(1) + + def test_with_a_commas_and_an_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:,_}'.format(1) + + def test_with_an_underscore_and_a_comma_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:,_}'.format(1) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 35a62a0632e2e6..b9bede0d9b800e 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -9,6 +9,7 @@ import ast import os +import re import types import decimal import unittest @@ -1198,6 +1199,25 @@ def test_invalid_syntax_error_message(self): with self.assertRaisesRegex(SyntaxError, "f-string: invalid syntax"): compile("f'{a $ b}'", "?", "exec") + def test_with_two_commas_in_format_specifier(self): + error_msg = re.escape("Cannot specify ',' with ','.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:,,}' + + def test_with_two_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify '_' with '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:__}' + + def test_with_a_commas_and_an_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:,_}' + + def test_with_an_underscore_and_a_comma_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:,_}' if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst new file mode 100644 index 00000000000000..ed557f92d85cac --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst @@ -0,0 +1,2 @@ +Fixes the wrong error description in the error raised by using 2 `,` in +format string in f-string and :meth:`str.format`. diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c index 74638ca2237729..ed95f267d476c7 100644 --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -252,8 +252,10 @@ parse_internal_render_format_spec(PyObject *format_spec, ++pos; } if (end-pos && READ_spec(pos) == ',') { - invalid_comma_and_underscore(); - return 0; + if (format->thousands_separators == LT_UNDERSCORE_LOCALE) { + invalid_comma_and_underscore(); + return 0; + } } /* Parse field precision */ From 40344a4aa50070e999b343f4335974cd87d88dd9 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 1 Sep 2020 18:25:14 +0200 Subject: [PATCH 0011/1261] bpo-41617: Fix pycore_bitutils.h to support clang 3.0 (GH-22042) __builtin_bswap16() is not available in LLVM clang 3.0. --- Include/internal/pycore_bitutils.h | 10 ++++++---- .../Build/2020-08-24-18-34-01.bpo-41617.sKKXz7.rst | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-08-24-18-34-01.bpo-41617.sKKXz7.rst diff --git a/Include/internal/pycore_bitutils.h b/Include/internal/pycore_bitutils.h index 0bd3270fe82e5c..1602fc68d94074 100644 --- a/Include/internal/pycore_bitutils.h +++ b/Include/internal/pycore_bitutils.h @@ -17,10 +17,12 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#if defined(__clang__) || \ - (defined(__GNUC__) && \ - ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))) - /* __builtin_bswap16() is available since GCC 4.8, +#if ((defined(__GNUC__) \ + && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))) \ + || (defined(__clang__) \ + && (__clang_major__ >= 4 \ + || (__clang_major__ == 3 && __clang_minor__ >= 2)))) + /* __builtin_bswap16() is available since GCC 4.8 and clang 3.2, __builtin_bswap32() is available since GCC 4.3, __builtin_bswap64() is available since GCC 4.3. */ # define _PY_HAVE_BUILTIN_BSWAP diff --git a/Misc/NEWS.d/next/Build/2020-08-24-18-34-01.bpo-41617.sKKXz7.rst b/Misc/NEWS.d/next/Build/2020-08-24-18-34-01.bpo-41617.sKKXz7.rst new file mode 100644 index 00000000000000..715eadbee896f1 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-08-24-18-34-01.bpo-41617.sKKXz7.rst @@ -0,0 +1,2 @@ +Fix ``pycore_bitutils.h`` header file to support old clang versions: +``__builtin_bswap16()`` is not available in LLVM clang 3.0. From ce9cc7b328de9fd86346a098673107c4a36e0ff8 Mon Sep 17 00:00:00 2001 From: Marek Madejski Date: Tue, 1 Sep 2020 18:42:41 +0200 Subject: [PATCH 0012/1261] bpo-41528: Use math module in turtle (GH-21837) Use angle-related functions from math module instead of reinventing the wheel. --- Lib/turtle.py | 18 +++++++++--------- .../2020-08-12-07-43-31.bpo-41528.bu83oD.rst | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-08-12-07-43-31.bpo-41528.bu83oD.rst diff --git a/Lib/turtle.py b/Lib/turtle.py index ee67a351b54f19..92d4e5dda9c2db 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -263,12 +263,12 @@ def __sub__(self, other): def __neg__(self): return Vec2D(-self[0], -self[1]) def __abs__(self): - return (self[0]**2 + self[1]**2)**0.5 + return math.hypot(*self) def rotate(self, angle): """rotate self counterclockwise by angle """ perp = Vec2D(-self[1], self[0]) - angle = angle * math.pi / 180.0 + angle = math.radians(angle) c, s = math.cos(angle), math.sin(angle) return Vec2D(self[0]*c+perp[0]*s, self[1]*c+perp[1]*s) def __getnewargs__(self): @@ -1597,7 +1597,7 @@ def radians(self): >>> turtle.heading() 1.5707963267948966 """ - self._setDegreesPerAU(2*math.pi) + self._setDegreesPerAU(math.tau) def _go(self, distance): """move turtle forward by specified distance""" @@ -1888,7 +1888,7 @@ def towards(self, x, y=None): elif isinstance(x, TNavigator): pos = x._position x, y = pos - self._position - result = round(math.atan2(y, x)*180.0/math.pi, 10) % 360.0 + result = round(math.degrees(math.atan2(y, x)), 10) % 360.0 result /= self._degreesPerAU return (self._angleOffset + self._angleOrient*result) % self._fullcircle @@ -1903,7 +1903,7 @@ def heading(self): 67.0 """ x, y = self._orient - result = round(math.atan2(y, x)*180.0/math.pi, 10) % 360.0 + result = round(math.degrees(math.atan2(y, x)), 10) % 360.0 result /= self._degreesPerAU return (self._angleOffset + self._angleOrient*result) % self._fullcircle @@ -1976,7 +1976,7 @@ def circle(self, radius, extent = None, steps = None): steps = 1+int(min(11+abs(radius)/6.0, 59.0)*frac) w = 1.0 * extent / steps w2 = 0.5 * w - l = 2.0 * radius * math.sin(w2*math.pi/180.0*self._degreesPerAU) + l = 2.0 * radius * math.sin(math.radians(w2)*self._degreesPerAU) if radius < 0: l, w, w2 = -l, -w, -w2 tr = self._tracer() @@ -2861,7 +2861,7 @@ def settiltangle(self, angle): >>> turtle.fd(50) """ tilt = -angle * self._degreesPerAU * self._angleOrient - tilt = (tilt * math.pi / 180.0) % (2*math.pi) + tilt = math.radians(tilt) % math.tau self.pen(resizemode="user", tilt=tilt) def tiltangle(self, angle=None): @@ -2885,7 +2885,7 @@ def tiltangle(self, angle=None): >>> turtle.tiltangle() """ if angle is None: - tilt = -self._tilt * (180.0/math.pi) * self._angleOrient + tilt = -math.degrees(self._tilt) * self._angleOrient return (tilt / self._degreesPerAU) % self._fullcircle else: self.settiltangle(angle) @@ -2939,7 +2939,7 @@ def shapetransform(self, t11=None, t12=None, t21=None, t22=None): if t11 * t22 - t12 * t21 == 0: raise TurtleGraphicsError("Bad shape transform matrix: must not be singular") self._shapetrafo = (m11, m12, m21, m22) - alfa = math.atan2(-m21, m11) % (2 * math.pi) + alfa = math.atan2(-m21, m11) % math.tau sa, ca = math.sin(alfa), math.cos(alfa) a11, a12, a21, a22 = (ca*m11 - sa*m21, ca*m12 - sa*m22, sa*m11 + ca*m21, sa*m12 + ca*m22) diff --git a/Misc/NEWS.d/next/Library/2020-08-12-07-43-31.bpo-41528.bu83oD.rst b/Misc/NEWS.d/next/Library/2020-08-12-07-43-31.bpo-41528.bu83oD.rst new file mode 100644 index 00000000000000..a4ba57c2438ed6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-12-07-43-31.bpo-41528.bu83oD.rst @@ -0,0 +1 @@ +turtle uses math module functions to convert degrees to radians and vice versa and to calculate vector norm \ No newline at end of file From eedc61ea33d985cfa053dd01c7c4bbf3b9d4e12c Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 1 Sep 2020 19:39:46 +0100 Subject: [PATCH 0013/1261] bpo-41654: Fix deallocator of MemoryError to account for subclasses (GH-22020) When allocating MemoryError classes, there is some logic to use pre-allocated instances in a freelist only if the type that is being allocated is not a subclass of MemoryError. Unfortunately in the destructor this logic is not present so the freelist is altered even with subclasses of MemoryError. --- Lib/test/test_exceptions.py | 31 +++++++++++++++++++ .../2020-08-30-20-38-33.bpo-41654.HtnhAM.rst | 2 ++ Objects/exceptions.c | 14 +++++++-- 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-30-20-38-33.bpo-41654.HtnhAM.rst diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 2ffe8caa03f812..1ec446887770ea 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1,6 +1,7 @@ # Python test set -- part 5, built-in exceptions import copy +import gc import os import sys import unittest @@ -1330,6 +1331,36 @@ def test_assert_shadowing(self): del AssertionError self.fail('Expected exception') + def test_memory_error_subclasses(self): + # bpo-41654: MemoryError instances use a freelist of objects that are + # linked using the 'dict' attribute when they are inactive/dead. + # Subclasses of MemoryError should not participate in the freelist + # schema. This test creates a MemoryError object and keeps it alive + # (therefore advancing the freelist) and then it creates and destroys a + # subclass object. Finally, it checks that creating a new MemoryError + # succeeds, proving that the freelist is not corrupted. + + class TestException(MemoryError): + pass + + try: + raise MemoryError + except MemoryError as exc: + inst = exc + + try: + raise TestException + except Exception: + pass + + for _ in range(10): + try: + raise MemoryError + except MemoryError as exc: + pass + + gc_collect() + class ImportErrorTests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-30-20-38-33.bpo-41654.HtnhAM.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-30-20-38-33.bpo-41654.HtnhAM.rst new file mode 100644 index 00000000000000..e05c3133e12625 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-30-20-38-33.bpo-41654.HtnhAM.rst @@ -0,0 +1,2 @@ +Fix a crash that occurred when destroying subclasses of +:class:`MemoryError`. Patch by Pablo Galindo. diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 1195ba17922dd7..b08cbdd6aed357 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2286,8 +2286,11 @@ MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyBaseExceptionObject *self; - if (type != (PyTypeObject *) PyExc_MemoryError) + /* If this is a subclass of MemoryError, don't use the freelist + * and just return a fresh object */ + if (type != (PyTypeObject *) PyExc_MemoryError) { return BaseException_new(type, args, kwds); + } struct _Py_exc_state *state = get_exc_state(); if (state->memerrors_freelist == NULL) { @@ -2313,9 +2316,16 @@ MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds) static void MemoryError_dealloc(PyBaseExceptionObject *self) { - _PyObject_GC_UNTRACK(self); BaseException_clear(self); + /* If this is a subclass of MemoryError, we don't need to + * do anything in the free-list*/ + if (!Py_IS_TYPE(self, (PyTypeObject *) PyExc_MemoryError)) { + return Py_TYPE(self)->tp_free((PyObject *)self); + } + + _PyObject_GC_UNTRACK(self); + struct _Py_exc_state *state = get_exc_state(); if (state->memerrors_numfree >= MEMERRORS_SAVE) { Py_TYPE(self)->tp_free((PyObject *)self); From 97241b53c22c1685e287d36384a8af5c7df4633d Mon Sep 17 00:00:00 2001 From: Shantanu <12621235+hauntsaninja@users.noreply.github.com> Date: Tue, 1 Sep 2020 14:18:07 -0700 Subject: [PATCH 0014/1261] bpo-39349: Add cancel_futures to Executor.shutdown base class (GH-22023) * Add cancel_futures parameter to the Executor base class, since it was missed in the original PR (https://github.com/python/cpython/pull/18057) that added cancel_futures. --- Lib/concurrent/futures/_base.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index bf546f8ae1d1cc..00eb54881f2958 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -605,7 +605,7 @@ def result_iterator(): future.cancel() return result_iterator() - def shutdown(self, wait=True): + def shutdown(self, wait=True, *, cancel_futures=False): """Clean-up the resources associated with the Executor. It is safe to call this method several times. Otherwise, no other @@ -615,6 +615,9 @@ def shutdown(self, wait=True): wait: If True then shutdown will not return until all running futures have finished executing and the resources used by the executor have been reclaimed. + cancel_futures: If True then shutdown will cancel all pending + futures. Futures that are completed or running will not be + cancelled. """ pass From 27881033227c03a36fb1b11a7ae69acc1a22673e Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 1 Sep 2020 20:36:42 -0500 Subject: [PATCH 0015/1261] Note the buffer slots can be set with PyType_Spec with the unlimited API. (GH-22031) Follow up to f7c4e236429606e1c982cacf24e10fc86ef4462f. --- Doc/c-api/type.rst | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 7309d7ee2cd398..73f26875d8194a 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -225,7 +225,8 @@ The following functions and structs are used to create * ``Py_nb_add`` to set :c:member:`PyNumberMethods.nb_add` * ``Py_sq_length`` to set :c:member:`PySequenceMethods.sq_length` - The following fields cannot be set using :c:type:`PyType_Spec` and :c:type:`PyType_Slot`: + The following fields cannot be set at all using :c:type:`PyType_Spec` and + :c:type:`PyType_Slot`: * :c:member:`~PyTypeObject.tp_dict` * :c:member:`~PyTypeObject.tp_mro` @@ -239,6 +240,10 @@ The following functions and structs are used to create (see :ref:`PyMemberDef `) * :c:member:`~PyTypeObject.tp_vectorcall_offset` (see :ref:`PyMemberDef `) + + The following fields cannot be set using :c:type:`PyType_Spec` and + :c:type:`PyType_Slot` under the limited API: + * :c:member:`~PyBufferProcs.bf_getbuffer` * :c:member:`~PyBufferProcs.bf_releasebuffer` @@ -246,6 +251,10 @@ The following functions and structs are used to create To avoid issues, use the *bases* argument of :py:func:`PyType_FromSpecWithBases` instead. + .. versionchanged:: 3.9 + + Slots in :c:type:`PyBufferProcs` in may be set in the unlimited API. + .. c:member:: void *PyType_Slot.pfunc The desired value of the slot. In most cases, this is a pointer From bfec6d6169f9ef710b1351741bc42c291df15e86 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 2 Sep 2020 00:21:12 -0300 Subject: [PATCH 0016/1261] [doc] Remove references to PyChecker. (GH-22011) --- Doc/faq/design.rst | 3 +-- Doc/faq/programming.rst | 16 ++++------------ 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst index 4e3cc575ee1964..8cf271c3024084 100644 --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -573,8 +573,7 @@ whether an instance or a class implements a particular ABC. The :class:`~collections.abc.MutableMapping`. For Python, many of the advantages of interface specifications can be obtained -by an appropriate test discipline for components. There is also a tool, -PyChecker, which can be used to find problems due to subclassing. +by an appropriate test discipline for components. A good test suite for a module can both provide a regression test and serve as a module interface specification and a set of examples. Many Python modules can diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 0731e92f6dbc60..d6a2f2cfc67eed 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -57,22 +57,14 @@ They include: * PyCharm (https://www.jetbrains.com/pycharm/) -Is there a tool to help find bugs or perform static analysis? +Are there tools to help find bugs or perform static analysis? ------------------------------------------------------------- Yes. -PyChecker is a static analysis tool that finds bugs in Python source code and -warns about code complexity and style. You can get PyChecker from -http://pychecker.sourceforge.net/. - -`Pylint `_ is another tool that checks -if a module satisfies a coding standard, and also makes it possible to write -plug-ins to add a custom feature. In addition to the bug checking that -PyChecker performs, Pylint offers some additional features such as checking line -length, whether variable names are well-formed according to your coding -standard, whether declared interfaces are fully implemented, and more. -https://docs.pylint.org/ provides a full list of Pylint's features. +`Pylint `_ and +`Pyflakes `_ do basic checking that will +help you catch bugs sooner. Static type checkers such as `Mypy `_, `Pyre `_, and From b8c2403c0073feba31ef1a71e40a6384be6e6abc Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 2 Sep 2020 00:22:55 -0300 Subject: [PATCH 0017/1261] Remove reference to Boa Constructor. (GH-22012) --- Doc/faq/programming.rst | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index d6a2f2cfc67eed..66d210a55fac7e 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -35,12 +35,6 @@ for Windows Extensions `__ project an as a part of the ActivePython distribution (see https://www.activestate.com/activepython\ ). -`Boa Constructor `_ is an IDE and GUI -builder that uses wxWidgets. It offers visual frame creation and manipulation, -an object inspector, many views on the source like object browsers, inheritance -hierarchies, doc string generated html documentation, an advanced debugger, -integrated help, and Zope support. - `Eric `_ is an IDE built on PyQt and the Scintilla editing component. From 14b48b9f167e559d29c8f14be83b35f61a3b10f4 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 1 Sep 2020 22:00:50 -0700 Subject: [PATCH 0018/1261] Improve hypot() accuracy with three separate accumulators (GH-22032) --- Modules/mathmodule.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 6621951ee97d2b..d227a5d15dca2a 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2456,7 +2456,7 @@ Given that csum >= 1.0, we have: Since lo**2 is less than 1/2 ulp(csum), we have csum+lo*lo == csum. To minimize loss of information during the accumulation of fractional -values, the lo**2 term has a separate accumulator. +values, each term has a separate accumulator. The square root differential correction is needed because a correctly rounded square root of a correctly rounded sum of @@ -2487,7 +2487,7 @@ static inline double vector_norm(Py_ssize_t n, double *vec, double max, int found_nan) { const double T27 = 134217729.0; /* ldexp(1.0, 27)+1.0) */ - double x, csum = 1.0, oldcsum, frac = 0.0, frac_lo = 0.0, scale; + double x, csum = 1.0, oldcsum, scale, frac=0.0, frac_mid=0.0, frac_lo=0.0; double t, hi, lo, h; int max_e; Py_ssize_t i; @@ -2529,12 +2529,12 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan) assert(fabs(csum) >= fabs(x)); oldcsum = csum; csum += x; - frac += (oldcsum - csum) + x; + frac_mid += (oldcsum - csum) + x; assert(csum + lo * lo == csum); frac_lo += lo * lo; } - frac += frac_lo; + frac += frac_lo + frac_mid; h = sqrt(csum - 1.0 + frac); x = h; From 6f8bdb1b0f70c1a253a1748b4866003eef5cb1a7 Mon Sep 17 00:00:00 2001 From: han-solo Date: Wed, 2 Sep 2020 04:56:37 -0400 Subject: [PATCH 0019/1261] Fixed mistake in test for f-string error description (GH-22036) (GH-22059) --- Lib/test/test_format.py | 2 +- Lib/test/test_fstring.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py index dff8c690321878..d2744cdfdca60e 100644 --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -514,7 +514,7 @@ def test_with_a_commas_and_an_underscore_in_format_specifier(self): def test_with_an_underscore_and_a_comma_in_format_specifier(self): error_msg = re.escape("Cannot specify both ',' and '_'.") with self.assertRaisesRegex(ValueError, error_msg): - '{:,_}'.format(1) + '{:_,}'.format(1) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index b9bede0d9b800e..b53661aa0a46fc 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -1217,7 +1217,7 @@ def test_with_a_commas_and_an_underscore_in_format_specifier(self): def test_with_an_underscore_and_a_comma_in_format_specifier(self): error_msg = re.escape("Cannot specify both ',' and '_'.") with self.assertRaisesRegex(ValueError, error_msg): - f'{1:,_}' + f'{1:_,}' if __name__ == '__main__': unittest.main() From cb8f3f7d0c458865224f0903f1a5a9c79323eb4c Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Wed, 2 Sep 2020 04:45:13 -0500 Subject: [PATCH 0020/1261] bpo-1635741: Port _blake2 module to multi-phase init (GH-21856) Port the _blake2 extension module to the multi-phase initialization API (PEP 489). --- ...2020-08-13-07-18-05.bpo-1635741.FC13e7.rst | 1 + Modules/_blake2/blake2b_impl.c | 57 +++------ Modules/_blake2/blake2module.c | 121 ++++++++++++------ Modules/_blake2/blake2s_impl.c | 58 +++------ 4 files changed, 119 insertions(+), 118 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-18-05.bpo-1635741.FC13e7.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-18-05.bpo-1635741.FC13e7.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-18-05.bpo-1635741.FC13e7.rst new file mode 100644 index 00000000000000..cdfee874095fe5 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-18-05.bpo-1635741.FC13e7.rst @@ -0,0 +1 @@ +Port the :mod:`_blake2` extension module to the multi-phase initialization API (:pep:`489`). diff --git a/Modules/_blake2/blake2b_impl.c b/Modules/_blake2/blake2b_impl.c index 7fb1296f8b2b90..8e1acce56b1d29 100644 --- a/Modules/_blake2/blake2b_impl.c +++ b/Modules/_blake2/blake2b_impl.c @@ -34,7 +34,7 @@ #endif -extern PyTypeObject PyBlake2_BLAKE2bType; +extern PyType_Spec blake2b_type_spec; typedef struct { PyObject_HEAD @@ -391,47 +391,24 @@ py_blake2b_dealloc(PyObject *self) PyThread_free_lock(obj->lock); obj->lock = NULL; } + + PyTypeObject *type = Py_TYPE(self); PyObject_Del(self); + Py_DECREF(type); } +static PyType_Slot blake2b_type_slots[] = { + {Py_tp_dealloc, py_blake2b_dealloc}, + {Py_tp_doc, (char *)py_blake2b_new__doc__}, + {Py_tp_methods, py_blake2b_methods}, + {Py_tp_getset, py_blake2b_getsetters}, + {Py_tp_new, py_blake2b_new}, + {0,0} +}; -PyTypeObject PyBlake2_BLAKE2bType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_blake2.blake2b", /* tp_name */ - sizeof(BLAKE2bObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - py_blake2b_dealloc, /* tp_dealloc */ - 0, /*tp_vectorcall_offset*/ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - py_blake2b_new__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - py_blake2b_methods, /* tp_methods */ - 0, /* tp_members */ - py_blake2b_getsetters, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - py_blake2b_new, /* tp_new */ +PyType_Spec blake2b_type_spec = { + .name = "_blake2.blake2b", + .basicsize = sizeof(BLAKE2bObject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = blake2b_type_slots }; diff --git a/Modules/_blake2/blake2module.c b/Modules/_blake2/blake2module.c index ff142c9f3ed330..631de2cc0abc74 100644 --- a/Modules/_blake2/blake2module.c +++ b/Modules/_blake2/blake2module.c @@ -12,62 +12,81 @@ #include "impl/blake2.h" -extern PyTypeObject PyBlake2_BLAKE2bType; -extern PyTypeObject PyBlake2_BLAKE2sType; - +extern PyType_Spec blake2b_type_spec; +extern PyType_Spec blake2s_type_spec; PyDoc_STRVAR(blake2mod__doc__, "_blake2b provides BLAKE2b for hashlib\n" ); +typedef struct { + PyTypeObject* blake2b_type; + PyTypeObject* blake2s_type; +} Blake2State; + +static inline Blake2State* +blake2_get_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (Blake2State *)state; +} static struct PyMethodDef blake2mod_functions[] = { {NULL, NULL} }; -static struct PyModuleDef blake2_module = { - PyModuleDef_HEAD_INIT, - "_blake2", - blake2mod__doc__, - -1, - blake2mod_functions, - NULL, - NULL, - NULL, - NULL -}; +static int +_blake2_traverse(PyObject *module, visitproc visit, void *arg) +{ + Blake2State *state = blake2_get_state(module); + Py_VISIT(state->blake2b_type); + Py_VISIT(state->blake2s_type); + return 0; +} + +static int +_blake2_clear(PyObject *module) +{ + Blake2State *state = blake2_get_state(module); + Py_CLEAR(state->blake2b_type); + Py_CLEAR(state->blake2s_type); + return 0; +} + +static void +_blake2_free(void *module) +{ + _blake2_clear((PyObject *)module); +} #define ADD_INT(d, name, value) do { \ PyObject *x = PyLong_FromLong(value); \ - if (!x) { \ - Py_DECREF(m); \ - return NULL; \ - } \ + if (!x) \ + return -1; \ if (PyDict_SetItemString(d, name, x) < 0) { \ - Py_DECREF(m); \ - return NULL; \ + Py_DECREF(x); \ + return -1; \ } \ Py_DECREF(x); \ } while(0) - -PyMODINIT_FUNC -PyInit__blake2(void) +static int +blake2_exec(PyObject *m) { - PyObject *m; - PyObject *d; + Blake2State* st = blake2_get_state(m); - m = PyModule_Create(&blake2_module); - if (m == NULL) - return NULL; + st->blake2b_type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &blake2b_type_spec, NULL); + if (NULL == st->blake2b_type) + return -1; /* BLAKE2b */ - Py_SET_TYPE(&PyBlake2_BLAKE2bType, &PyType_Type); - if (PyModule_AddType(m, &PyBlake2_BLAKE2bType) < 0) { - return NULL; + if (PyModule_AddType(m, st->blake2b_type) < 0) { + return -1; } - d = PyBlake2_BLAKE2bType.tp_dict; + PyObject *d = st->blake2b_type->tp_dict; ADD_INT(d, "SALT_SIZE", BLAKE2B_SALTBYTES); ADD_INT(d, "PERSON_SIZE", BLAKE2B_PERSONALBYTES); ADD_INT(d, "MAX_KEY_SIZE", BLAKE2B_KEYBYTES); @@ -79,12 +98,17 @@ PyInit__blake2(void) PyModule_AddIntConstant(m, "BLAKE2B_MAX_DIGEST_SIZE", BLAKE2B_OUTBYTES); /* BLAKE2s */ - Py_SET_TYPE(&PyBlake2_BLAKE2sType, &PyType_Type); - if (PyModule_AddType(m, &PyBlake2_BLAKE2sType) < 0) { - return NULL; + st->blake2s_type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &blake2s_type_spec, NULL); + + if (NULL == st->blake2s_type) + return -1; + + if (PyModule_AddType(m, st->blake2s_type) < 0) { + return -1; } - d = PyBlake2_BLAKE2sType.tp_dict; + d = st->blake2s_type->tp_dict; ADD_INT(d, "SALT_SIZE", BLAKE2S_SALTBYTES); ADD_INT(d, "PERSON_SIZE", BLAKE2S_PERSONALBYTES); ADD_INT(d, "MAX_KEY_SIZE", BLAKE2S_KEYBYTES); @@ -95,5 +119,28 @@ PyInit__blake2(void) PyModule_AddIntConstant(m, "BLAKE2S_MAX_KEY_SIZE", BLAKE2S_KEYBYTES); PyModule_AddIntConstant(m, "BLAKE2S_MAX_DIGEST_SIZE", BLAKE2S_OUTBYTES); - return m; + return 0; } + +static PyModuleDef_Slot _blake2_slots[] = { + {Py_mod_exec, blake2_exec}, + {0, NULL} +}; + +static struct PyModuleDef blake2_module = { + PyModuleDef_HEAD_INIT, + "_blake2", + .m_doc = blake2mod__doc__, + .m_size = sizeof(Blake2State), + .m_methods = blake2mod_functions, + .m_slots = _blake2_slots, + .m_traverse = _blake2_traverse, + .m_clear = _blake2_clear, + .m_free = _blake2_free, +}; + +PyMODINIT_FUNC +PyInit__blake2(void) +{ + return PyModuleDef_Init(&blake2_module); +} \ No newline at end of file diff --git a/Modules/_blake2/blake2s_impl.c b/Modules/_blake2/blake2s_impl.c index e3e90d0587b805..e1de5df37d0988 100644 --- a/Modules/_blake2/blake2s_impl.c +++ b/Modules/_blake2/blake2s_impl.c @@ -33,8 +33,7 @@ #include "impl/blake2s-ref.c" #endif - -extern PyTypeObject PyBlake2_BLAKE2sType; +extern PyType_Spec blake2s_type_spec; typedef struct { PyObject_HEAD @@ -391,47 +390,24 @@ py_blake2s_dealloc(PyObject *self) PyThread_free_lock(obj->lock); obj->lock = NULL; } + + PyTypeObject *type = Py_TYPE(self); PyObject_Del(self); + Py_DECREF(type); } +static PyType_Slot blake2s_type_slots[] = { + {Py_tp_dealloc, py_blake2s_dealloc}, + {Py_tp_doc, (char *)py_blake2s_new__doc__}, + {Py_tp_methods, py_blake2s_methods}, + {Py_tp_getset, py_blake2s_getsetters}, + {Py_tp_new, py_blake2s_new}, + {0,0} +}; -PyTypeObject PyBlake2_BLAKE2sType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_blake2.blake2s", /* tp_name */ - sizeof(BLAKE2sObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - py_blake2s_dealloc, /* tp_dealloc */ - 0, /*tp_vectorcall_offset*/ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - py_blake2s_new__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - py_blake2s_methods, /* tp_methods */ - 0, /* tp_members */ - py_blake2s_getsetters, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - py_blake2s_new, /* tp_new */ +PyType_Spec blake2s_type_spec = { + .name = "_blake2.blake2s", + .basicsize = sizeof(BLAKE2sObject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = blake2s_type_slots }; From 10f87057d0e0f52311df435f618fa7944dff6600 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Wed, 2 Sep 2020 04:55:19 -0500 Subject: [PATCH 0021/1261] bpo-1635741: Port _sha3 module to multi-phase init (GH-21855) Port the _sha3 extension module to multi-phase init (PEP 489). Convert static types to heap types. --- ...2020-08-13-07-19-21.bpo-1653741.fubBkb.rst | 1 + Modules/_sha3/sha3module.c | 329 ++++++++++-------- 2 files changed, 194 insertions(+), 136 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-19-21.bpo-1653741.fubBkb.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-19-21.bpo-1653741.fubBkb.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-19-21.bpo-1653741.fubBkb.rst new file mode 100644 index 00000000000000..73a4fdbac48a24 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-19-21.bpo-1653741.fubBkb.rst @@ -0,0 +1 @@ +Port :mod:`_sha3` to multi-phase init. Convert static types to heap types. diff --git a/Modules/_sha3/sha3module.c b/Modules/_sha3/sha3module.c index c826b42df13f92..da6dde6812f264 100644 --- a/Modules/_sha3/sha3module.c +++ b/Modules/_sha3/sha3module.c @@ -122,6 +122,28 @@ #define SHA3_squeeze Keccak_HashSqueeze #define SHA3_copystate(dest, src) memcpy(&(dest), &(src), sizeof(SHA3_state)) +typedef struct { + PyTypeObject *sha3_224_type; + PyTypeObject *sha3_256_type; + PyTypeObject *sha3_384_type; + PyTypeObject *sha3_512_type; +#ifdef PY_WITH_KECCAK + PyTypeObject *keccak_224_type; + PyTypeObject *keccak_256_type; + PyTypeObject *keccak_384_type; + PyTypeObject *keccak_512_type; +#endif + PyTypeObject *shake_128_type; + PyTypeObject *shake_256_type; +} SHA3State; + +static inline SHA3State* +sha3_get_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (SHA3State *)state; +} /*[clinic input] module _sha3 @@ -142,19 +164,6 @@ typedef struct { PyThread_type_lock lock; } SHA3object; -static PyTypeObject SHA3_224type; -static PyTypeObject SHA3_256type; -static PyTypeObject SHA3_384type; -static PyTypeObject SHA3_512type; -#ifdef PY_WITH_KECCAK -static PyTypeObject Keccak_224type; -static PyTypeObject Keccak_256type; -static PyTypeObject Keccak_384type; -static PyTypeObject Keccak_512type; -#endif -static PyTypeObject SHAKE128type; -static PyTypeObject SHAKE256type; - #include "clinic/sha3module.c.h" static SHA3object * @@ -184,42 +193,43 @@ static PyObject * py_sha3_new_impl(PyTypeObject *type, PyObject *data, int usedforsecurity) /*[clinic end generated code: output=90409addc5d5e8b0 input=bcfcdf2e4368347a]*/ { - SHA3object *self = NULL; - Py_buffer buf = {NULL, NULL}; - HashReturn res; - - self = newSHA3object(type); + SHA3object *self = newSHA3object(type); if (self == NULL) { goto error; } - if (type == &SHA3_224type) { + SHA3State *state = PyType_GetModuleState(type); + assert(state != NULL); + + HashReturn res; + if (type == state->sha3_224_type) { res = Keccak_HashInitialize_SHA3_224(&self->hash_state); - } else if (type == &SHA3_256type) { + } else if (type == state->sha3_256_type) { res = Keccak_HashInitialize_SHA3_256(&self->hash_state); - } else if (type == &SHA3_384type) { + } else if (type == state->sha3_384_type) { res = Keccak_HashInitialize_SHA3_384(&self->hash_state); - } else if (type == &SHA3_512type) { + } else if (type == state->sha3_512_type) { res = Keccak_HashInitialize_SHA3_512(&self->hash_state); #ifdef PY_WITH_KECCAK - } else if (type == &Keccak_224type) { + } else if (type == state->keccak_224_type) { res = Keccak_HashInitialize(&self->hash_state, 1152, 448, 224, 0x01); - } else if (type == &Keccak_256type) { + } else if (type == state->keccak_256_type) { res = Keccak_HashInitialize(&self->hash_state, 1088, 512, 256, 0x01); - } else if (type == &Keccak_384type) { + } else if (type == state->keccak_384_type) { res = Keccak_HashInitialize(&self->hash_state, 832, 768, 384, 0x01); - } else if (type == &Keccak_512type) { + } else if (type == state->keccak_512_type) { res = Keccak_HashInitialize(&self->hash_state, 576, 1024, 512, 0x01); #endif - } else if (type == &SHAKE128type) { + } else if (type == state->shake_128_type) { res = Keccak_HashInitialize_SHAKE128(&self->hash_state); - } else if (type == &SHAKE256type) { + } else if (type == state->shake_256_type) { res = Keccak_HashInitialize_SHAKE256(&self->hash_state); } else { PyErr_BadInternalCall(); goto error; } + Py_buffer buf = {NULL, NULL}; if (data) { GET_BUFFER_VIEW_OR_ERROR(data, &buf, goto error); if (buf.len >= HASHLIB_GIL_MINSIZE) { @@ -262,7 +272,10 @@ SHA3_dealloc(SHA3object *self) if (self->lock) { PyThread_free_lock(self->lock); } + + PyTypeObject *tp = Py_TYPE(self); PyObject_Del(self); + Py_DECREF(tp); } @@ -416,27 +429,31 @@ static PyObject * SHA3_get_name(SHA3object *self, void *closure) { PyTypeObject *type = Py_TYPE(self); - if (type == &SHA3_224type) { + + SHA3State *state = PyType_GetModuleState(type); + assert(state != NULL); + + if (type == state->sha3_224_type) { return PyUnicode_FromString("sha3_224"); - } else if (type == &SHA3_256type) { + } else if (type == state->sha3_256_type) { return PyUnicode_FromString("sha3_256"); - } else if (type == &SHA3_384type) { + } else if (type == state->sha3_384_type) { return PyUnicode_FromString("sha3_384"); - } else if (type == &SHA3_512type) { + } else if (type == state->sha3_512_type) { return PyUnicode_FromString("sha3_512"); #ifdef PY_WITH_KECCAK - } else if (type == &Keccak_224type) { + } else if (type == state->keccak_224_type) { return PyUnicode_FromString("keccak_224"); - } else if (type == &Keccak_256type) { + } else if (type == state->keccak_256_type) { return PyUnicode_FromString("keccak_256"); - } else if (type == &Keccak_384type) { + } else if (type == state->keccak_384_type) { return PyUnicode_FromString("keccak_384"); - } else if (type == &Keccak_512type) { + } else if (type == state->keccak_512_type) { return PyUnicode_FromString("keccak_512"); #endif - } else if (type == &SHAKE128type) { + } else if (type == state->shake_128_type) { return PyUnicode_FromString("shake_128"); - } else if (type == &SHAKE256type) { + } else if (type == state->shake_256_type) { return PyUnicode_FromString("shake_256"); } else { PyErr_BadInternalCall(); @@ -476,7 +493,6 @@ SHA3_get_suffix(SHA3object *self, void *closure) return PyBytes_FromStringAndSize((const char *)suffix, 1); } - static PyGetSetDef SHA3_getseters[] = { {"block_size", (getter)SHA3_get_block_size, NULL, NULL, NULL}, {"name", (getter)SHA3_get_name, NULL, NULL, NULL}, @@ -487,48 +503,24 @@ static PyGetSetDef SHA3_getseters[] = { {NULL} /* Sentinel */ }; +#define SHA3_TYPE_SLOTS(type_slots_obj, type_doc, type_methods) \ + static PyType_Slot type_slots_obj[] = { \ + {Py_tp_dealloc, SHA3_dealloc}, \ + {Py_tp_doc, (char*)type_doc}, \ + {Py_tp_methods, type_methods}, \ + {Py_tp_getset, SHA3_getseters}, \ + {Py_tp_new, py_sha3_new}, \ + {0,0} \ + } -#define SHA3_TYPE(type_obj, type_name, type_doc, type_methods) \ - static PyTypeObject type_obj = { \ - PyVarObject_HEAD_INIT(NULL, 0) \ - type_name, /* tp_name */ \ - sizeof(SHA3object), /* tp_basicsize */ \ - 0, /* tp_itemsize */ \ - /* methods */ \ - (destructor)SHA3_dealloc, /* tp_dealloc */ \ - 0, /* tp_vectorcall_offset */ \ - 0, /* tp_getattr */ \ - 0, /* tp_setattr */ \ - 0, /* tp_as_async */ \ - 0, /* tp_repr */ \ - 0, /* tp_as_number */ \ - 0, /* tp_as_sequence */ \ - 0, /* tp_as_mapping */ \ - 0, /* tp_hash */ \ - 0, /* tp_call */ \ - 0, /* tp_str */ \ - 0, /* tp_getattro */ \ - 0, /* tp_setattro */ \ - 0, /* tp_as_buffer */ \ - Py_TPFLAGS_DEFAULT, /* tp_flags */ \ - type_doc, /* tp_doc */ \ - 0, /* tp_traverse */ \ - 0, /* tp_clear */ \ - 0, /* tp_richcompare */ \ - 0, /* tp_weaklistoffset */ \ - 0, /* tp_iter */ \ - 0, /* tp_iternext */ \ - type_methods, /* tp_methods */ \ - NULL, /* tp_members */ \ - SHA3_getseters, /* tp_getset */ \ - 0, /* tp_base */ \ - 0, /* tp_dict */ \ - 0, /* tp_descr_get */ \ - 0, /* tp_descr_set */ \ - 0, /* tp_dictoffset */ \ - 0, /* tp_init */ \ - 0, /* tp_alloc */ \ - py_sha3_new, /* tp_new */ \ +// Using PyType_GetModuleState() on these types is safe since they +// cannot be subclassed: it does not have the Py_TPFLAGS_BASETYPE flag. +#define SHA3_TYPE_SPEC(type_spec_obj, type_name, type_slots) \ + static PyType_Spec type_spec_obj = { \ + .name = "_sha3." type_name, \ + .basicsize = sizeof(SHA3object), \ + .flags = Py_TPFLAGS_DEFAULT, \ + .slots = type_slots \ } PyDoc_STRVAR(sha3_224__doc__, @@ -551,11 +543,6 @@ PyDoc_STRVAR(sha3_512__doc__, \n\ Return a new SHA3 hash object with a hashbit length of 64 bytes."); -SHA3_TYPE(SHA3_224type, "_sha3.sha3_224", sha3_224__doc__, SHA3_methods); -SHA3_TYPE(SHA3_256type, "_sha3.sha3_256", sha3_256__doc__, SHA3_methods); -SHA3_TYPE(SHA3_384type, "_sha3.sha3_384", sha3_384__doc__, SHA3_methods); -SHA3_TYPE(SHA3_512type, "_sha3.sha3_512", sha3_512__doc__, SHA3_methods); - #ifdef PY_WITH_KECCAK PyDoc_STRVAR(keccak_224__doc__, "keccak_224([data], *, usedforsecurity=True) -> Keccak object\n\ @@ -577,10 +564,32 @@ PyDoc_STRVAR(keccak_512__doc__, \n\ Return a new Keccak hash object with a hashbit length of 64 bytes."); -SHA3_TYPE(Keccak_224type, "_sha3.keccak_224", keccak_224__doc__, SHA3_methods); -SHA3_TYPE(Keccak_256type, "_sha3.keccak_256", keccak_256__doc__, SHA3_methods); -SHA3_TYPE(Keccak_384type, "_sha3.keccak_384", keccak_384__doc__, SHA3_methods); -SHA3_TYPE(Keccak_512type, "_sha3.keccak_512", keccak_512__doc__, SHA3_methods); +#endif + +SHA3_TYPE_SLOTS(sha3_224_slots, sha3_224__doc__, SHA3_methods); +SHA3_TYPE_SPEC(sha3_224_spec, "sha3_224", sha3_224_slots); + +SHA3_TYPE_SLOTS(sha3_256_slots, sha3_256__doc__, SHA3_methods); +SHA3_TYPE_SPEC(sha3_256_spec, "sha3_256", sha3_256_slots); + +SHA3_TYPE_SLOTS(sha3_384_slots, sha3_384__doc__, SHA3_methods); +SHA3_TYPE_SPEC(sha3_384_spec, "sha3_384", sha3_384_slots); + +SHA3_TYPE_SLOTS(sha3_512_slots, sha3_512__doc__, SHA3_methods); +SHA3_TYPE_SPEC(sha3_512_spec, "sha3_512", sha3_512_slots); + +#ifdef PY_WITH_KECCAK +SHA3_TYPE_SLOTS(Keccak_224_slots, keccak_224__doc__, SHA3_methods); +SHA3_TYPE_SPEC(Keccak_224_spec, "keccak_224", Keccak_224_slots); + +SHA3_TYPE_SLOTS(Keccak_256_slots, keccak_256__doc__, SHA3_methods); +SHA3_TYPE_SPEC(Keccak_256_spec, "keccak_256", Keccak_256_slots); + +SHA3_TYPE_SLOTS(Keccak_384_slots, keccak_384__doc__, SHA3_methods); +SHA3_TYPE_SPEC(Keccak_384_spec, "keccak_384", Keccak_384_slots); + +SHA3_TYPE_SLOTS(Keccak_512_slots, keccak_512__doc__, SHA3_methods); +SHA3_TYPE_SPEC(Keccak_512_spec, "keccak_512", Keccak_512_slots); #endif @@ -684,70 +693,118 @@ PyDoc_STRVAR(shake_256__doc__, \n\ Return a new SHAKE hash object."); -SHA3_TYPE(SHAKE128type, "_sha3.shake_128", shake_128__doc__, SHAKE_methods); -SHA3_TYPE(SHAKE256type, "_sha3.shake_256", shake_256__doc__, SHAKE_methods); +SHA3_TYPE_SLOTS(SHAKE128slots, shake_128__doc__, SHAKE_methods); +SHA3_TYPE_SPEC(SHAKE128_spec, "shake_128", SHAKE128slots); +SHA3_TYPE_SLOTS(SHAKE256slots, shake_256__doc__, SHAKE_methods); +SHA3_TYPE_SPEC(SHAKE256_spec, "shake_256", SHAKE256slots); -/* Initialize this module. */ -static struct PyModuleDef _SHA3module = { - PyModuleDef_HEAD_INIT, - "_sha3", - NULL, - -1, - NULL, - NULL, - NULL, - NULL, - NULL -}; +static int +_sha3_traverse(PyObject *module, visitproc visit, void *arg) +{ + SHA3State *state = sha3_get_state(module); + Py_VISIT(state->sha3_224_type); + Py_VISIT(state->sha3_256_type); + Py_VISIT(state->sha3_384_type); + Py_VISIT(state->sha3_512_type); +#ifdef PY_WITH_KECCAK + Py_VISIT(state->keccak_224_type); + Py_VISIT(state->keccak_256_type); + Py_VISIT(state->keccak_384_type); + Py_VISIT(state->keccak_512_type); +#endif + Py_VISIT(state->shake_128_type); + Py_VISIT(state->shake_256_type); + return 0; +} -PyMODINIT_FUNC -PyInit__sha3(void) +static int +_sha3_clear(PyObject *module) { - PyObject *m = NULL; + SHA3State *state = sha3_get_state(module); + Py_CLEAR(state->sha3_224_type); + Py_CLEAR(state->sha3_256_type); + Py_CLEAR(state->sha3_384_type); + Py_CLEAR(state->sha3_512_type); +#ifdef PY_WITH_KECCAK + Py_CLEAR(state->keccak_224_type); + Py_CLEAR(state->keccak_256_type); + Py_CLEAR(state->keccak_384_type); + Py_CLEAR(state->keccak_512_type); +#endif + Py_CLEAR(state->shake_128_type); + Py_CLEAR(state->shake_256_type); + return 0; +} - if ((m = PyModule_Create(&_SHA3module)) == NULL) { - return NULL; - } +static void +_sha3_free(void *module) +{ + _sha3_clear((PyObject *)module); +} -#define init_sha3type(name, type) \ - do { \ - Py_SET_TYPE(type, &PyType_Type); \ - if (PyType_Ready(type) < 0) { \ - goto error; \ - } \ - Py_INCREF((PyObject *)type); \ - if (PyModule_AddObject(m, name, (PyObject *)type) < 0) { \ - goto error; \ - } \ +static int +_sha3_exec(PyObject *m) +{ + SHA3State *st = sha3_get_state(m); + +#define init_sha3type(type, typespec) \ + do { \ + st->type = (PyTypeObject *)PyType_FromModuleAndSpec( \ + m, &typespec, NULL); \ + if (st->type == NULL) { \ + return -1; \ + } \ + if (PyModule_AddType(m, st->type) < 0) { \ + return -1; \ + } \ } while(0) - init_sha3type("sha3_224", &SHA3_224type); - init_sha3type("sha3_256", &SHA3_256type); - init_sha3type("sha3_384", &SHA3_384type); - init_sha3type("sha3_512", &SHA3_512type); + init_sha3type(sha3_224_type, sha3_224_spec); + init_sha3type(sha3_256_type, sha3_256_spec); + init_sha3type(sha3_384_type, sha3_384_spec); + init_sha3type(sha3_512_type, sha3_512_spec); #ifdef PY_WITH_KECCAK - init_sha3type("keccak_224", &Keccak_224type); - init_sha3type("keccak_256", &Keccak_256type); - init_sha3type("keccak_384", &Keccak_384type); - init_sha3type("keccak_512", &Keccak_512type); + init_sha3type(keccak_224_type, Keccak_224_spec); + init_sha3type(keccak_256_type, Keccak_256_spec); + init_sha3type(keccak_384_type, Keccak_384_spec); + init_sha3type(keccak_512_type, Keccak_512_spec); #endif - init_sha3type("shake_128", &SHAKE128type); - init_sha3type("shake_256", &SHAKE256type); - + init_sha3type(shake_128_type, SHAKE128_spec); + init_sha3type(shake_256_type, SHAKE256_spec); #undef init_sha3type if (PyModule_AddIntConstant(m, "keccakopt", KeccakOpt) < 0) { - goto error; + return -1; } if (PyModule_AddStringConstant(m, "implementation", KeccakP1600_implementation) < 0) { - goto error; + return -1; } - return m; - error: - Py_DECREF(m); - return NULL; + return 0; +} + +static PyModuleDef_Slot _sha3_slots[] = { + {Py_mod_exec, _sha3_exec}, + {0, NULL} +}; + +/* Initialize this module. */ +static struct PyModuleDef _sha3module = { + PyModuleDef_HEAD_INIT, + .m_name = "_sha3", + .m_size = sizeof(SHA3State), + .m_slots = _sha3_slots, + .m_traverse = _sha3_traverse, + .m_clear = _sha3_clear, + .m_free = _sha3_free, +}; + + +PyMODINIT_FUNC +PyInit__sha3(void) +{ + return PyModuleDef_Init(&_sha3module); } From 21184566610800cda907fc5efcbd0ca4ae804f2c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 2 Sep 2020 12:29:31 +0200 Subject: [PATCH 0022/1261] bpo-40204: Update Sphinx to version 3.2.1 in Doc/Makefile (GH-22043) --- Doc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/Makefile b/Doc/Makefile index 87d5d07665c863..f1d0a267dd89d5 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -144,7 +144,7 @@ venv: $(PYTHON) -m venv $(VENVDIR) # $(VENVDIR)/bin/python3 -m pip install -U pip setuptools $(VENVDIR)/bin/python3 -m pip install -U pip setuptools==49.2.1 - $(VENVDIR)/bin/python3 -m pip install -U Sphinx==2.3.1 blurb python-docs-theme + $(VENVDIR)/bin/python3 -m pip install -U Sphinx==3.2.1 blurb python-docs-theme @echo "The venv has been created in the $(VENVDIR) directory" dist: From 8a85c07c900c911ca6bfc1abbafadd8e7e5437f8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 2 Sep 2020 13:11:21 +0200 Subject: [PATCH 0023/1261] bpo-41685: Don't pin setuptools version anymore in Doc/Makefile (GH-22062) setuptools 50.0.2 is now compatible with Python 3.10: https://github.com/pypa/setuptools/pull/2361 --- Doc/Makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Doc/Makefile b/Doc/Makefile index f1d0a267dd89d5..c11a7ca5c1bcb7 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -142,8 +142,7 @@ clean: venv: $(PYTHON) -m venv $(VENVDIR) -# $(VENVDIR)/bin/python3 -m pip install -U pip setuptools - $(VENVDIR)/bin/python3 -m pip install -U pip setuptools==49.2.1 + $(VENVDIR)/bin/python3 -m pip install -U pip setuptools $(VENVDIR)/bin/python3 -m pip install -U Sphinx==3.2.1 blurb python-docs-theme @echo "The venv has been created in the $(VENVDIR) directory" From 1b22af57e078209098d1d8003e6cb84e6dc493eb Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 2 Sep 2020 15:29:12 +0100 Subject: [PATCH 0024/1261] bpo-41675: Modernize siginterrupt calls (GH-22028) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit siginterrupt is deprecated: ./Modules/signalmodule.c:667:5: warning: ‘siginterrupt’ is deprecated: Use sigaction with SA_RESTART instead [-Wdeprecated-declarations] 667 | if (siginterrupt(signalnum, flag)<0) { --- .../2020-08-31-14-53-17.bpo-41675.VSoqWU.rst | 3 +++ Modules/signalmodule.c | 14 +++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-31-14-53-17.bpo-41675.VSoqWU.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-31-14-53-17.bpo-41675.VSoqWU.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-31-14-53-17.bpo-41675.VSoqWU.rst new file mode 100644 index 00000000000000..aa102f8fe43845 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-31-14-53-17.bpo-41675.VSoqWU.rst @@ -0,0 +1,3 @@ +The implementation of :func:`signal.siginterrupt` now uses :c:func:`sigaction` +(if it is available in the system) instead of the deprecated :c:func:`siginterrupt`. +Patch by Pablo Galindo. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 7bc1b535e6e2ca..c49a3ea52e71de 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -664,7 +664,19 @@ signal_siginterrupt_impl(PyObject *module, int signalnum, int flag) "signal number out of range"); return NULL; } - if (siginterrupt(signalnum, flag)<0) { +#ifdef HAVE_SIGACTION + struct sigaction act; + (void) sigaction(signalnum, NULL, &act); + if (flag) { + act.sa_flags &= ~SA_RESTART; + } + else { + act.sa_flags |= SA_RESTART; + } + if (sigaction(signalnum, &act, NULL) < 0) { +#else + if (siginterrupt(signalnum, flag) < 0) { +#endif PyErr_SetFromErrno(PyExc_OSError); return NULL; } From d0b84df444325a4178480b6b334bfa65e34bd185 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 2 Sep 2020 15:29:38 +0100 Subject: [PATCH 0025/1261] Fix invalid escape sequences in the peg_highlight Sphinx extension (GH-22047) --- Doc/tools/extensions/peg_highlight.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tools/extensions/peg_highlight.py b/Doc/tools/extensions/peg_highlight.py index f02515d3919cf2..8bc24670fbe0ab 100644 --- a/Doc/tools/extensions/peg_highlight.py +++ b/Doc/tools/extensions/peg_highlight.py @@ -59,7 +59,7 @@ class PEGLexer(RegexLexer): include("variables"), (r"\b(?!(NULL|EXTRA))([A-Z_]+)\b\s*(?!\()", Text,), ( - r"^\s*" + _name + "\s*" + "(\[.*\])?" + "\s*" + "(\(.+\))?" + "\s*(:)", + r"^\s*" + _name + r"\s*" + r"(\[.*\])?" + r"\s*" + r"(\(.+\))?" + r"\s*(:)", bygroups(Name.Function, None, None, Punctuation), ), (_name, Name.Function), From ac5b1ad65a6fd835292d96a342f68a0dfa09ff18 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Wed, 2 Sep 2020 11:29:06 -0500 Subject: [PATCH 0026/1261] closes bpo-41689: Preserve text signature from tp_doc in C heap type creation. (GH-22058) --- Lib/test/test_capi.py | 4 +++ .../2020-09-01-23-39-45.bpo-41689.zxHbLB.rst | 2 ++ Modules/_testcapimodule.c | 30 +++++++++++++++++++ Objects/typeobject.c | 15 ++++++++-- 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-09-01-23-39-45.bpo-41689.zxHbLB.rst diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 892cc74ec39158..db62b47100ad3a 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -401,6 +401,10 @@ def __del__(self): del L self.assertEqual(PyList.num, 0) + def test_heap_ctype_doc_and_text_signature(self): + self.assertEqual(_testcapi.HeapDocCType.__doc__, "somedoc") + self.assertEqual(_testcapi.HeapDocCType.__text_signature__, "(arg1, arg2)") + def test_subclass_of_heap_gc_ctype_with_tpdealloc_decrefs_once(self): class HeapGcCTypeSubclass(_testcapi.HeapGcCType): def __init__(self): diff --git a/Misc/NEWS.d/next/C API/2020-09-01-23-39-45.bpo-41689.zxHbLB.rst b/Misc/NEWS.d/next/C API/2020-09-01-23-39-45.bpo-41689.zxHbLB.rst new file mode 100644 index 00000000000000..44cf58a4b06388 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-09-01-23-39-45.bpo-41689.zxHbLB.rst @@ -0,0 +1,2 @@ +Types created with :c:func:`PyType_FromSpec` now make any signature in their +``tp_doc`` slot accessible from ``__text_signature__``. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 593034ef65e2ca..7536d29535038c 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -6462,6 +6462,30 @@ static PyTypeObject MethodDescriptor2_Type = { .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL, }; +PyDoc_STRVAR(heapdocctype__doc__, +"HeapDocCType(arg1, arg2)\n" +"--\n" +"\n" +"somedoc"); + +typedef struct { + PyObject_HEAD +} HeapDocCTypeObject; + +static PyType_Slot HeapDocCType_slots[] = { + {Py_tp_doc, (char*)heapdocctype__doc__}, + {0}, +}; + +static PyType_Spec HeapDocCType_spec = { + "_testcapi.HeapDocCType", + sizeof(HeapDocCTypeObject), + 0, + Py_TPFLAGS_DEFAULT, + HeapDocCType_slots +}; + + PyDoc_STRVAR(heapgctype__doc__, "A heap type with GC, and with overridden dealloc.\n\n" "The 'value' attribute is set to 10 in __init__."); @@ -7130,6 +7154,12 @@ PyInit__testcapi(void) Py_INCREF(TestError); PyModule_AddObject(m, "error", TestError); + PyObject *HeapDocCType = PyType_FromSpec(&HeapDocCType_spec); + if (HeapDocCType == NULL) { + return NULL; + } + PyModule_AddObject(m, "HeapDocCType", HeapDocCType); + PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec); if (HeapGcCType == NULL) { return NULL; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index c66f8fcec8ed51..74040757a07021 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3018,15 +3018,14 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) else if (slot->slot == Py_tp_doc) { /* For the docstring slot, which usually points to a static string literal, we need to make a copy */ - const char *old_doc = _PyType_DocWithoutSignature(type->tp_name, slot->pfunc); - size_t len = strlen(old_doc)+1; + size_t len = strlen(slot->pfunc)+1; char *tp_doc = PyObject_MALLOC(len); if (tp_doc == NULL) { type->tp_doc = NULL; PyErr_NoMemory(); goto fail; } - memcpy(tp_doc, old_doc, len); + memcpy(tp_doc, slot->pfunc, len); type->tp_doc = tp_doc; } else if (slot->slot == Py_tp_members) { @@ -3058,6 +3057,16 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) res->ht_cached_keys = _PyDict_NewKeysForClass(); } + if (type->tp_doc) { + PyObject *__doc__ = PyUnicode_FromString(_PyType_DocWithoutSignature(type->tp_name, type->tp_doc)); + if (!__doc__) + goto fail; + int ret = _PyDict_SetItemId(type->tp_dict, &PyId___doc__, __doc__); + Py_DECREF(__doc__); + if (ret < 0) + goto fail; + } + if (weaklistoffset) { type->tp_weaklistoffset = weaklistoffset; if (PyDict_DelItemString((PyObject *)type->tp_dict, "__weaklistoffset__") < 0) From 4fa5f3849456a209110db6f2b6bcbff60a71265a Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 2 Sep 2020 17:44:19 +0100 Subject: [PATCH 0027/1261] bpo-41690: Use a loop to collect args in the parser instead of recursion (GH-22053) This program can segfault the parser by stack overflow: ``` import ast code = "f(" + ",".join(['a' for _ in range(100000)]) + ")" print("Ready!") ast.parse(code) ``` the reason is that the rule for arguments has a simple recursion when collecting args: args[expr_ty]: [...] | a=named_expression b=[',' c=args { c }] { [...] } --- Grammar/python.gram | 13 +- .../2020-09-02-12-00-57.bpo-41690.Ny-Sfy.rst | 2 + Parser/parser.c | 1092 +++++++++-------- Parser/pegen.c | 35 + Parser/pegen.h | 1 + 5 files changed, 628 insertions(+), 515 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-02-12-00-57.bpo-41690.Ny-Sfy.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index 1cba11407468d2..84835b731c540f 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -535,22 +535,11 @@ arguments[expr_ty] (memo): | a=args [','] &')' { a } | incorrect_arguments args[expr_ty]: - | a=starred_expression b=[',' c=args { c }] { - _Py_Call(_PyPegen_dummy_name(p), - (b) ? CHECK(_PyPegen_seq_insert_in_front(p, a, ((expr_ty) b)->v.Call.args)) - : CHECK(_PyPegen_singleton_seq(p, a)), - (b) ? ((expr_ty) b)->v.Call.keywords : NULL, - EXTRA) } + | a=','.(starred_expression | named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b) } | a=kwargs { _Py_Call(_PyPegen_dummy_name(p), CHECK_NULL_ALLOWED(_PyPegen_seq_extract_starred_exprs(p, a)), CHECK_NULL_ALLOWED(_PyPegen_seq_delete_starred_exprs(p, a)), EXTRA) } - | a=named_expression b=[',' c=args { c }] { - _Py_Call(_PyPegen_dummy_name(p), - (b) ? CHECK(_PyPegen_seq_insert_in_front(p, a, ((expr_ty) b)->v.Call.args)) - : CHECK(_PyPegen_singleton_seq(p, a)), - (b) ? ((expr_ty) b)->v.Call.keywords : NULL, - EXTRA) } kwargs[asdl_seq*]: | a=','.kwarg_or_starred+ ',' b=','.kwarg_or_double_starred+ { _PyPegen_join_sequences(p, a, b) } | ','.kwarg_or_starred+ diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-02-12-00-57.bpo-41690.Ny-Sfy.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-02-12-00-57.bpo-41690.Ny-Sfy.rst new file mode 100644 index 00000000000000..5711aa5a55f070 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-02-12-00-57.bpo-41690.Ny-Sfy.rst @@ -0,0 +1,2 @@ +Fix a possible stack overflow in the parser when parsing functions and +classes with a huge ammount of arguments. Patch by Pablo Galindo. diff --git a/Parser/parser.c b/Parser/parser.c index 75dc7176a5e756..3e724a260d90a9 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -334,34 +334,34 @@ static KeywordToken *reserved_keywords[] = { #define _loop1_105_type 1265 #define _loop0_106_type 1266 #define _loop0_107_type 1267 -#define _tmp_108_type 1268 -#define _tmp_109_type 1269 -#define _loop0_111_type 1270 -#define _gather_110_type 1271 -#define _loop0_113_type 1272 -#define _gather_112_type 1273 -#define _loop0_115_type 1274 -#define _gather_114_type 1275 -#define _loop0_117_type 1276 -#define _gather_116_type 1277 -#define _loop0_118_type 1278 -#define _loop0_120_type 1279 -#define _gather_119_type 1280 -#define _tmp_121_type 1281 -#define _loop0_123_type 1282 -#define _gather_122_type 1283 -#define _loop0_125_type 1284 -#define _gather_124_type 1285 -#define _tmp_126_type 1286 -#define _loop0_127_type 1287 +#define _loop0_109_type 1268 +#define _gather_108_type 1269 +#define _tmp_110_type 1270 +#define _loop0_112_type 1271 +#define _gather_111_type 1272 +#define _loop0_114_type 1273 +#define _gather_113_type 1274 +#define _loop0_116_type 1275 +#define _gather_115_type 1276 +#define _loop0_118_type 1277 +#define _gather_117_type 1278 +#define _loop0_119_type 1279 +#define _loop0_121_type 1280 +#define _gather_120_type 1281 +#define _tmp_122_type 1282 +#define _loop0_124_type 1283 +#define _gather_123_type 1284 +#define _loop0_126_type 1285 +#define _gather_125_type 1286 +#define _tmp_127_type 1287 #define _loop0_128_type 1288 #define _loop0_129_type 1289 -#define _tmp_130_type 1290 +#define _loop0_130_type 1290 #define _tmp_131_type 1291 -#define _loop0_132_type 1292 -#define _tmp_133_type 1293 -#define _loop0_134_type 1294 -#define _tmp_135_type 1295 +#define _tmp_132_type 1292 +#define _loop0_133_type 1293 +#define _tmp_134_type 1294 +#define _loop0_135_type 1295 #define _tmp_136_type 1296 #define _tmp_137_type 1297 #define _tmp_138_type 1298 @@ -377,10 +377,12 @@ static KeywordToken *reserved_keywords[] = { #define _tmp_148_type 1308 #define _tmp_149_type 1309 #define _tmp_150_type 1310 -#define _loop1_151_type 1311 -#define _loop1_152_type 1312 -#define _tmp_153_type 1313 -#define _tmp_154_type 1314 +#define _tmp_151_type 1311 +#define _tmp_152_type 1312 +#define _loop1_153_type 1313 +#define _loop1_154_type 1314 +#define _tmp_155_type 1315 +#define _tmp_156_type 1316 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -650,34 +652,34 @@ static asdl_seq *_gather_103_rule(Parser *p); static asdl_seq *_loop1_105_rule(Parser *p); static asdl_seq *_loop0_106_rule(Parser *p); static asdl_seq *_loop0_107_rule(Parser *p); -static void *_tmp_108_rule(Parser *p); -static void *_tmp_109_rule(Parser *p); -static asdl_seq *_loop0_111_rule(Parser *p); -static asdl_seq *_gather_110_rule(Parser *p); -static asdl_seq *_loop0_113_rule(Parser *p); -static asdl_seq *_gather_112_rule(Parser *p); -static asdl_seq *_loop0_115_rule(Parser *p); -static asdl_seq *_gather_114_rule(Parser *p); -static asdl_seq *_loop0_117_rule(Parser *p); -static asdl_seq *_gather_116_rule(Parser *p); +static asdl_seq *_loop0_109_rule(Parser *p); +static asdl_seq *_gather_108_rule(Parser *p); +static void *_tmp_110_rule(Parser *p); +static asdl_seq *_loop0_112_rule(Parser *p); +static asdl_seq *_gather_111_rule(Parser *p); +static asdl_seq *_loop0_114_rule(Parser *p); +static asdl_seq *_gather_113_rule(Parser *p); +static asdl_seq *_loop0_116_rule(Parser *p); +static asdl_seq *_gather_115_rule(Parser *p); static asdl_seq *_loop0_118_rule(Parser *p); -static asdl_seq *_loop0_120_rule(Parser *p); -static asdl_seq *_gather_119_rule(Parser *p); -static void *_tmp_121_rule(Parser *p); -static asdl_seq *_loop0_123_rule(Parser *p); -static asdl_seq *_gather_122_rule(Parser *p); -static asdl_seq *_loop0_125_rule(Parser *p); -static asdl_seq *_gather_124_rule(Parser *p); -static void *_tmp_126_rule(Parser *p); -static asdl_seq *_loop0_127_rule(Parser *p); +static asdl_seq *_gather_117_rule(Parser *p); +static asdl_seq *_loop0_119_rule(Parser *p); +static asdl_seq *_loop0_121_rule(Parser *p); +static asdl_seq *_gather_120_rule(Parser *p); +static void *_tmp_122_rule(Parser *p); +static asdl_seq *_loop0_124_rule(Parser *p); +static asdl_seq *_gather_123_rule(Parser *p); +static asdl_seq *_loop0_126_rule(Parser *p); +static asdl_seq *_gather_125_rule(Parser *p); +static void *_tmp_127_rule(Parser *p); static asdl_seq *_loop0_128_rule(Parser *p); static asdl_seq *_loop0_129_rule(Parser *p); -static void *_tmp_130_rule(Parser *p); +static asdl_seq *_loop0_130_rule(Parser *p); static void *_tmp_131_rule(Parser *p); -static asdl_seq *_loop0_132_rule(Parser *p); -static void *_tmp_133_rule(Parser *p); -static asdl_seq *_loop0_134_rule(Parser *p); -static void *_tmp_135_rule(Parser *p); +static void *_tmp_132_rule(Parser *p); +static asdl_seq *_loop0_133_rule(Parser *p); +static void *_tmp_134_rule(Parser *p); +static asdl_seq *_loop0_135_rule(Parser *p); static void *_tmp_136_rule(Parser *p); static void *_tmp_137_rule(Parser *p); static void *_tmp_138_rule(Parser *p); @@ -693,10 +695,12 @@ static void *_tmp_147_rule(Parser *p); static void *_tmp_148_rule(Parser *p); static void *_tmp_149_rule(Parser *p); static void *_tmp_150_rule(Parser *p); -static asdl_seq *_loop1_151_rule(Parser *p); -static asdl_seq *_loop1_152_rule(Parser *p); -static void *_tmp_153_rule(Parser *p); -static void *_tmp_154_rule(Parser *p); +static void *_tmp_151_rule(Parser *p); +static void *_tmp_152_rule(Parser *p); +static asdl_seq *_loop1_153_rule(Parser *p); +static asdl_seq *_loop1_154_rule(Parser *p); +static void *_tmp_155_rule(Parser *p); +static void *_tmp_156_rule(Parser *p); // file: statements? $ @@ -12198,7 +12202,7 @@ arguments_rule(Parser *p) return _res; } -// args: starred_expression [',' args] | kwargs | named_expression [',' args] +// args: ','.(starred_expression | named_expression !'=')+ [',' kwargs] | kwargs static expr_ty args_rule(Parser *p) { @@ -12218,31 +12222,22 @@ args_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // starred_expression [',' args] + { // ','.(starred_expression | named_expression !'=')+ [',' kwargs] if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> args[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression [',' args]")); - expr_ty a; + D(fprintf(stderr, "%*c> args[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); + asdl_seq * a; void *b; if ( - (a = starred_expression_rule(p)) // starred_expression + (a = _gather_108_rule(p)) // ','.(starred_expression | named_expression !'=')+ && - (b = _tmp_108_rule(p), 1) // [',' args] + (b = _tmp_110_rule(p), 1) // [',' kwargs] ) { - D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression [',' args]")); - Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); - if (_token == NULL) { - D(p->level--); - return NULL; - } - int _end_lineno = _token->end_lineno; - UNUSED(_end_lineno); // Only used by EXTRA macro - int _end_col_offset = _token->end_col_offset; - UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Call ( _PyPegen_dummy_name ( p ) , ( b ) ? CHECK ( _PyPegen_seq_insert_in_front ( p , a , ( ( expr_ty ) b ) -> v . Call . args ) ) : CHECK ( _PyPegen_singleton_seq ( p , a ) ) , ( b ) ? ( ( expr_ty ) b ) -> v . Call . keywords : NULL , EXTRA ); + D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); + _res = _PyPegen_collect_call_seqs ( p , a , b ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -12252,7 +12247,7 @@ args_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s args[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression [',' args]")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); } { // kwargs if (p->error_indicator) { @@ -12287,42 +12282,6 @@ args_rule(Parser *p) D(fprintf(stderr, "%*c%s args[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwargs")); } - { // named_expression [',' args] - if (p->error_indicator) { - D(p->level--); - return NULL; - } - D(fprintf(stderr, "%*c> args[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression [',' args]")); - expr_ty a; - void *b; - if ( - (a = named_expression_rule(p)) // named_expression - && - (b = _tmp_109_rule(p), 1) // [',' args] - ) - { - D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression [',' args]")); - Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); - if (_token == NULL) { - D(p->level--); - return NULL; - } - int _end_lineno = _token->end_lineno; - UNUSED(_end_lineno); // Only used by EXTRA macro - int _end_col_offset = _token->end_col_offset; - UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Call ( _PyPegen_dummy_name ( p ) , ( b ) ? CHECK ( _PyPegen_seq_insert_in_front ( p , a , ( ( expr_ty ) b ) -> v . Call . args ) ) : CHECK ( _PyPegen_singleton_seq ( p , a ) ) , ( b ) ? ( ( expr_ty ) b ) -> v . Call . keywords : NULL , EXTRA ); - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - D(p->level--); - return NULL; - } - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s args[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression [',' args]")); - } _res = NULL; done: D(p->level--); @@ -12353,11 +12312,11 @@ kwargs_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _gather_110_rule(p)) // ','.kwarg_or_starred+ + (a = _gather_111_rule(p)) // ','.kwarg_or_starred+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _gather_112_rule(p)) // ','.kwarg_or_double_starred+ + (b = _gather_113_rule(p)) // ','.kwarg_or_double_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+")); @@ -12379,13 +12338,13 @@ kwargs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); - asdl_seq * _gather_114_var; + asdl_seq * _gather_115_var; if ( - (_gather_114_var = _gather_114_rule(p)) // ','.kwarg_or_starred+ + (_gather_115_var = _gather_115_rule(p)) // ','.kwarg_or_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); - _res = _gather_114_var; + _res = _gather_115_var; goto done; } p->mark = _mark; @@ -12398,13 +12357,13 @@ kwargs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); - asdl_seq * _gather_116_var; + asdl_seq * _gather_117_var; if ( - (_gather_116_var = _gather_116_rule(p)) // ','.kwarg_or_double_starred+ + (_gather_117_var = _gather_117_rule(p)) // ','.kwarg_or_double_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); - _res = _gather_116_var; + _res = _gather_117_var; goto done; } p->mark = _mark; @@ -12766,7 +12725,7 @@ star_targets_rule(Parser *p) if ( (a = star_target_rule(p)) // star_target && - (b = _loop0_118_rule(p)) // ((',' star_target))* + (b = _loop0_119_rule(p)) // ((',' star_target))* && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -12820,7 +12779,7 @@ star_targets_seq_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_seq * a; if ( - (a = _gather_119_rule(p)) // ','.star_target+ + (a = _gather_120_rule(p)) // ','.star_target+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -12883,7 +12842,7 @@ star_target_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (a = _tmp_121_rule(p)) // !'*' star_target + (a = _tmp_122_rule(p)) // !'*' star_target ) { D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (!'*' star_target)")); @@ -13405,7 +13364,7 @@ del_targets_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_seq * a; if ( - (a = _gather_122_rule(p)) // ','.del_target+ + (a = _gather_123_rule(p)) // ','.del_target+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -13746,7 +13705,7 @@ targets_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_seq * a; if ( - (a = _gather_124_rule(p)) // ','.target+ + (a = _gather_125_rule(p)) // ','.target+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -14458,7 +14417,7 @@ incorrect_arguments_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_opt_var = _tmp_126_rule(p), 1) // [args | expression for_if_clauses] + (_opt_var = _tmp_127_rule(p), 1) // [args | expression for_if_clauses] ) { D(fprintf(stderr, "%*c+ incorrect_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); @@ -14716,7 +14675,7 @@ invalid_assignment_rule(Parser *p) D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); Token * _literal; Token * _literal_1; - asdl_seq * _loop0_127_var; + asdl_seq * _loop0_128_var; expr_ty a; expr_ty expression_var; if ( @@ -14724,7 +14683,7 @@ invalid_assignment_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_loop0_127_var = _loop0_127_rule(p)) // star_named_expressions* + (_loop0_128_var = _loop0_128_rule(p)) // star_named_expressions* && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -14781,10 +14740,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* star_expressions '='")); Token * _literal; - asdl_seq * _loop0_128_var; + asdl_seq * _loop0_129_var; expr_ty a; if ( - (_loop0_128_var = _loop0_128_rule(p)) // ((star_targets '='))* + (_loop0_129_var = _loop0_129_rule(p)) // ((star_targets '='))* && (a = star_expressions_rule(p)) // star_expressions && @@ -14811,10 +14770,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* yield_expr '='")); Token * _literal; - asdl_seq * _loop0_129_var; + asdl_seq * _loop0_130_var; expr_ty a; if ( - (_loop0_129_var = _loop0_129_rule(p)) // ((star_targets '='))* + (_loop0_130_var = _loop0_130_rule(p)) // ((star_targets '='))* && (a = yield_expr_rule(p)) // yield_expr && @@ -14840,7 +14799,7 @@ invalid_assignment_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); - void *_tmp_130_var; + void *_tmp_131_var; expr_ty a; AugOperator* augassign_var; if ( @@ -14848,7 +14807,7 @@ invalid_assignment_rule(Parser *p) && (augassign_var = augassign_rule(p)) // augassign && - (_tmp_130_var = _tmp_130_rule(p)) // yield_expr | star_expressions + (_tmp_131_var = _tmp_131_rule(p)) // yield_expr | star_expressions ) { D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); @@ -15059,11 +15018,11 @@ invalid_comprehension_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); - void *_tmp_131_var; + void *_tmp_132_var; expr_ty a; asdl_seq* for_if_clauses_var; if ( - (_tmp_131_var = _tmp_131_rule(p)) // '[' | '(' | '{' + (_tmp_132_var = _tmp_132_rule(p)) // '[' | '(' | '{' && (a = starred_expression_rule(p)) // starred_expression && @@ -15160,13 +15119,13 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* (slash_with_default | param_with_default+) param_no_default")); - asdl_seq * _loop0_132_var; - void *_tmp_133_var; + asdl_seq * _loop0_133_var; + void *_tmp_134_var; arg_ty param_no_default_var; if ( - (_loop0_132_var = _loop0_132_rule(p)) // param_no_default* + (_loop0_133_var = _loop0_133_rule(p)) // param_no_default* && - (_tmp_133_var = _tmp_133_rule(p)) // slash_with_default | param_with_default+ + (_tmp_134_var = _tmp_134_rule(p)) // slash_with_default | param_with_default+ && (param_no_default_var = param_no_default_rule(p)) // param_no_default ) @@ -15208,13 +15167,13 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default")); - asdl_seq * _loop0_134_var; - void *_tmp_135_var; + asdl_seq * _loop0_135_var; + void *_tmp_136_var; arg_ty lambda_param_no_default_var; if ( - (_loop0_134_var = _loop0_134_rule(p)) // lambda_param_no_default* + (_loop0_135_var = _loop0_135_rule(p)) // lambda_param_no_default* && - (_tmp_135_var = _tmp_135_rule(p)) // lambda_slash_with_default | lambda_param_with_default+ + (_tmp_136_var = _tmp_136_rule(p)) // lambda_slash_with_default | lambda_param_with_default+ && (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) @@ -15256,11 +15215,11 @@ invalid_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); Token * _literal; - void *_tmp_136_var; + void *_tmp_137_var; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_136_var = _tmp_136_rule(p)) // ')' | ',' (')' | '**') + (_tmp_137_var = _tmp_137_rule(p)) // ')' | ',' (')' | '**') ) { D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); @@ -15330,11 +15289,11 @@ invalid_lambda_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); Token * _literal; - void *_tmp_137_var; + void *_tmp_138_var; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_137_var = _tmp_137_rule(p)) // ':' | ',' (':' | '**') + (_tmp_138_var = _tmp_138_rule(p)) // ':' | ',' (':' | '**') ) { D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); @@ -16843,12 +16802,12 @@ _loop1_22_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_138_var; + void *_tmp_139_var; while ( - (_tmp_138_var = _tmp_138_rule(p)) // star_targets '=' + (_tmp_139_var = _tmp_139_rule(p)) // star_targets '=' ) { - _res = _tmp_138_var; + _res = _tmp_139_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17351,12 +17310,12 @@ _loop0_31_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_139_var; + void *_tmp_140_var; while ( - (_tmp_139_var = _tmp_139_rule(p)) // '.' | '...' + (_tmp_140_var = _tmp_140_rule(p)) // '.' | '...' ) { - _res = _tmp_139_var; + _res = _tmp_140_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17417,12 +17376,12 @@ _loop1_32_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_140_var; + void *_tmp_141_var; while ( - (_tmp_140_var = _tmp_140_rule(p)) // '.' | '...' + (_tmp_141_var = _tmp_141_rule(p)) // '.' | '...' ) { - _res = _tmp_140_var; + _res = _tmp_141_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19579,12 +19538,12 @@ _loop1_68_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); - void *_tmp_141_var; + void *_tmp_142_var; while ( - (_tmp_141_var = _tmp_141_rule(p)) // '@' named_expression NEWLINE + (_tmp_142_var = _tmp_142_rule(p)) // '@' named_expression NEWLINE ) { - _res = _tmp_141_var; + _res = _tmp_142_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19811,12 +19770,12 @@ _loop1_72_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); - void *_tmp_142_var; + void *_tmp_143_var; while ( - (_tmp_142_var = _tmp_142_rule(p)) // ',' star_expression + (_tmp_143_var = _tmp_143_rule(p)) // ',' star_expression ) { - _res = _tmp_142_var; + _res = _tmp_143_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19996,12 +19955,12 @@ _loop1_75_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); - void *_tmp_143_var; + void *_tmp_144_var; while ( - (_tmp_143_var = _tmp_143_rule(p)) // ',' expression + (_tmp_144_var = _tmp_144_rule(p)) // ',' expression ) { - _res = _tmp_143_var; + _res = _tmp_144_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21026,12 +20985,12 @@ _loop1_90_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); - void *_tmp_144_var; + void *_tmp_145_var; while ( - (_tmp_144_var = _tmp_144_rule(p)) // 'or' conjunction + (_tmp_145_var = _tmp_145_rule(p)) // 'or' conjunction ) { - _res = _tmp_144_var; + _res = _tmp_145_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21097,12 +21056,12 @@ _loop1_91_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); - void *_tmp_145_var; + void *_tmp_146_var; while ( - (_tmp_145_var = _tmp_145_rule(p)) // 'and' inversion + (_tmp_146_var = _tmp_146_rule(p)) // 'and' inversion ) { - _res = _tmp_145_var; + _res = _tmp_146_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22018,12 +21977,12 @@ _loop0_106_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_146_var; + void *_tmp_147_var; while ( - (_tmp_146_var = _tmp_146_rule(p)) // 'if' disjunction + (_tmp_147_var = _tmp_147_rule(p)) // 'if' disjunction ) { - _res = _tmp_146_var; + _res = _tmp_147_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22084,12 +22043,12 @@ _loop0_107_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_147_var; + void *_tmp_148_var; while ( - (_tmp_147_var = _tmp_147_rule(p)) // 'if' disjunction + (_tmp_148_var = _tmp_148_rule(p)) // 'if' disjunction ) { - _res = _tmp_147_var; + _res = _tmp_148_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22123,43 +22082,113 @@ _loop0_107_rule(Parser *p) return _seq; } -// _tmp_108: ',' args -static void * -_tmp_108_rule(Parser *p) +// _loop0_109: ',' (starred_expression | named_expression !'=') +static asdl_seq * +_loop0_109_rule(Parser *p) { D(p->level++); if (p->error_indicator) { D(p->level--); return NULL; } - void * _res = NULL; + void *_res = NULL; int _mark = p->mark; - { // ',' args + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' (starred_expression | named_expression !'=') if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' args")); + D(fprintf(stderr, "%*c> _loop0_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | named_expression !'=')")); Token * _literal; - expr_ty c; - if ( + void *elem; + while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (c = args_rule(p)) // args + (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' ) { - D(fprintf(stderr, "%*c+ _tmp_108[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' args")); - _res = c; + _res = elem; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; + PyMem_Free(_children); D(p->level--); return NULL; } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_109[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | named_expression !'=')")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_109_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_108: (starred_expression | named_expression !'=') _loop0_109 +static asdl_seq * +_gather_108_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // (starred_expression | named_expression !'=') _loop0_109 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_109")); + void *elem; + asdl_seq * seq; + if ( + (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' + && + (seq = _loop0_109_rule(p)) // _loop0_109 + ) + { + D(fprintf(stderr, "%*c+ _gather_108[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_109")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_108[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' args")); + D(fprintf(stderr, "%*c%s _gather_108[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_109")); } _res = NULL; done: @@ -22167,9 +22196,9 @@ _tmp_108_rule(Parser *p) return _res; } -// _tmp_109: ',' args +// _tmp_110: ',' kwargs static void * -_tmp_109_rule(Parser *p) +_tmp_110_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22178,22 +22207,22 @@ _tmp_109_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // ',' args + { // ',' kwargs if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' args")); + D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs")); Token * _literal; - expr_ty c; + asdl_seq* k; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (c = args_rule(p)) // args + (k = kwargs_rule(p)) // kwargs ) { - D(fprintf(stderr, "%*c+ _tmp_109[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' args")); - _res = c; + D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + _res = k; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -22202,8 +22231,8 @@ _tmp_109_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_109[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' args")); + D(fprintf(stderr, "%*c%s _tmp_110[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwargs")); } _res = NULL; done: @@ -22211,9 +22240,9 @@ _tmp_109_rule(Parser *p) return _res; } -// _loop0_111: ',' kwarg_or_starred +// _loop0_112: ',' kwarg_or_starred static asdl_seq * -_loop0_111_rule(Parser *p) +_loop0_112_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22237,7 +22266,7 @@ _loop0_111_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); + D(fprintf(stderr, "%*c> _loop0_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); Token * _literal; KeywordOrStarred* elem; while ( @@ -22268,7 +22297,7 @@ _loop0_111_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_111[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_112[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -22281,14 +22310,14 @@ _loop0_111_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_111_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_112_type, _seq); D(p->level--); return _seq; } -// _gather_110: kwarg_or_starred _loop0_111 +// _gather_111: kwarg_or_starred _loop0_112 static asdl_seq * -_gather_110_rule(Parser *p) +_gather_111_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22297,27 +22326,27 @@ _gather_110_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_starred _loop0_111 + { // kwarg_or_starred _loop0_112 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_111")); + D(fprintf(stderr, "%*c> _gather_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_112")); KeywordOrStarred* elem; asdl_seq * seq; if ( (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred && - (seq = _loop0_111_rule(p)) // _loop0_111 + (seq = _loop0_112_rule(p)) // _loop0_112 ) { - D(fprintf(stderr, "%*c+ _gather_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_111")); + D(fprintf(stderr, "%*c+ _gather_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_112")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_110[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_111")); + D(fprintf(stderr, "%*c%s _gather_111[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_112")); } _res = NULL; done: @@ -22325,9 +22354,9 @@ _gather_110_rule(Parser *p) return _res; } -// _loop0_113: ',' kwarg_or_double_starred +// _loop0_114: ',' kwarg_or_double_starred static asdl_seq * -_loop0_113_rule(Parser *p) +_loop0_114_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22351,7 +22380,7 @@ _loop0_113_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + D(fprintf(stderr, "%*c> _loop0_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); Token * _literal; KeywordOrStarred* elem; while ( @@ -22382,7 +22411,7 @@ _loop0_113_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_113[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_114[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -22395,14 +22424,14 @@ _loop0_113_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_113_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_114_type, _seq); D(p->level--); return _seq; } -// _gather_112: kwarg_or_double_starred _loop0_113 +// _gather_113: kwarg_or_double_starred _loop0_114 static asdl_seq * -_gather_112_rule(Parser *p) +_gather_113_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22411,27 +22440,27 @@ _gather_112_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_double_starred _loop0_113 + { // kwarg_or_double_starred _loop0_114 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_113")); + D(fprintf(stderr, "%*c> _gather_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_114")); KeywordOrStarred* elem; asdl_seq * seq; if ( (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred && - (seq = _loop0_113_rule(p)) // _loop0_113 + (seq = _loop0_114_rule(p)) // _loop0_114 ) { - D(fprintf(stderr, "%*c+ _gather_112[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_113")); + D(fprintf(stderr, "%*c+ _gather_113[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_114")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_112[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_113")); + D(fprintf(stderr, "%*c%s _gather_113[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_114")); } _res = NULL; done: @@ -22439,9 +22468,9 @@ _gather_112_rule(Parser *p) return _res; } -// _loop0_115: ',' kwarg_or_starred +// _loop0_116: ',' kwarg_or_starred static asdl_seq * -_loop0_115_rule(Parser *p) +_loop0_116_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22465,7 +22494,7 @@ _loop0_115_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); + D(fprintf(stderr, "%*c> _loop0_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); Token * _literal; KeywordOrStarred* elem; while ( @@ -22496,7 +22525,7 @@ _loop0_115_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_115[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_116[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -22509,14 +22538,14 @@ _loop0_115_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_115_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_116_type, _seq); D(p->level--); return _seq; } -// _gather_114: kwarg_or_starred _loop0_115 +// _gather_115: kwarg_or_starred _loop0_116 static asdl_seq * -_gather_114_rule(Parser *p) +_gather_115_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22525,27 +22554,27 @@ _gather_114_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_starred _loop0_115 + { // kwarg_or_starred _loop0_116 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_115")); + D(fprintf(stderr, "%*c> _gather_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_116")); KeywordOrStarred* elem; asdl_seq * seq; if ( (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred && - (seq = _loop0_115_rule(p)) // _loop0_115 + (seq = _loop0_116_rule(p)) // _loop0_116 ) { - D(fprintf(stderr, "%*c+ _gather_114[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_115")); + D(fprintf(stderr, "%*c+ _gather_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_116")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_114[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_115")); + D(fprintf(stderr, "%*c%s _gather_115[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_116")); } _res = NULL; done: @@ -22553,9 +22582,9 @@ _gather_114_rule(Parser *p) return _res; } -// _loop0_117: ',' kwarg_or_double_starred +// _loop0_118: ',' kwarg_or_double_starred static asdl_seq * -_loop0_117_rule(Parser *p) +_loop0_118_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22579,7 +22608,7 @@ _loop0_117_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + D(fprintf(stderr, "%*c> _loop0_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); Token * _literal; KeywordOrStarred* elem; while ( @@ -22610,7 +22639,7 @@ _loop0_117_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_117[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_118[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -22623,14 +22652,14 @@ _loop0_117_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_117_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_118_type, _seq); D(p->level--); return _seq; } -// _gather_116: kwarg_or_double_starred _loop0_117 +// _gather_117: kwarg_or_double_starred _loop0_118 static asdl_seq * -_gather_116_rule(Parser *p) +_gather_117_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22639,27 +22668,27 @@ _gather_116_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_double_starred _loop0_117 + { // kwarg_or_double_starred _loop0_118 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_117")); + D(fprintf(stderr, "%*c> _gather_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_118")); KeywordOrStarred* elem; asdl_seq * seq; if ( (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred && - (seq = _loop0_117_rule(p)) // _loop0_117 + (seq = _loop0_118_rule(p)) // _loop0_118 ) { - D(fprintf(stderr, "%*c+ _gather_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_117")); + D(fprintf(stderr, "%*c+ _gather_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_118")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_116[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_117")); + D(fprintf(stderr, "%*c%s _gather_117[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_118")); } _res = NULL; done: @@ -22667,9 +22696,9 @@ _gather_116_rule(Parser *p) return _res; } -// _loop0_118: (',' star_target) +// _loop0_119: (',' star_target) static asdl_seq * -_loop0_118_rule(Parser *p) +_loop0_119_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22693,13 +22722,13 @@ _loop0_118_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_148_var; + D(fprintf(stderr, "%*c> _loop0_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); + void *_tmp_150_var; while ( - (_tmp_148_var = _tmp_148_rule(p)) // ',' star_target + (_tmp_150_var = _tmp_150_rule(p)) // ',' star_target ) { - _res = _tmp_148_var; + _res = _tmp_150_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22715,7 +22744,7 @@ _loop0_118_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_118[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_119[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -22728,14 +22757,14 @@ _loop0_118_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_118_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_119_type, _seq); D(p->level--); return _seq; } -// _loop0_120: ',' star_target +// _loop0_121: ',' star_target static asdl_seq * -_loop0_120_rule(Parser *p) +_loop0_121_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22759,7 +22788,7 @@ _loop0_120_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _loop0_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty elem; while ( @@ -22790,7 +22819,7 @@ _loop0_120_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_120[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_121[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -22803,14 +22832,14 @@ _loop0_120_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_120_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_121_type, _seq); D(p->level--); return _seq; } -// _gather_119: star_target _loop0_120 +// _gather_120: star_target _loop0_121 static asdl_seq * -_gather_119_rule(Parser *p) +_gather_120_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22819,27 +22848,27 @@ _gather_119_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // star_target _loop0_120 + { // star_target _loop0_121 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_120")); + D(fprintf(stderr, "%*c> _gather_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_121")); expr_ty elem; asdl_seq * seq; if ( (elem = star_target_rule(p)) // star_target && - (seq = _loop0_120_rule(p)) // _loop0_120 + (seq = _loop0_121_rule(p)) // _loop0_121 ) { - D(fprintf(stderr, "%*c+ _gather_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_120")); + D(fprintf(stderr, "%*c+ _gather_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_121")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_119[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_120")); + D(fprintf(stderr, "%*c%s _gather_120[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_121")); } _res = NULL; done: @@ -22847,9 +22876,9 @@ _gather_119_rule(Parser *p) return _res; } -// _tmp_121: !'*' star_target +// _tmp_122: !'*' star_target static void * -_tmp_121_rule(Parser *p) +_tmp_122_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22863,7 +22892,7 @@ _tmp_121_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + D(fprintf(stderr, "%*c> _tmp_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); expr_ty star_target_var; if ( _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 16) // token='*' @@ -22871,12 +22900,12 @@ _tmp_121_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + D(fprintf(stderr, "%*c+ _tmp_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); _res = star_target_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_121[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_122[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "!'*' star_target")); } _res = NULL; @@ -22885,9 +22914,9 @@ _tmp_121_rule(Parser *p) return _res; } -// _loop0_123: ',' del_target +// _loop0_124: ',' del_target static asdl_seq * -_loop0_123_rule(Parser *p) +_loop0_124_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22911,7 +22940,7 @@ _loop0_123_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); + D(fprintf(stderr, "%*c> _loop0_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); Token * _literal; expr_ty elem; while ( @@ -22942,7 +22971,7 @@ _loop0_123_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_123[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_124[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' del_target")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -22955,14 +22984,14 @@ _loop0_123_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_123_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_124_type, _seq); D(p->level--); return _seq; } -// _gather_122: del_target _loop0_123 +// _gather_123: del_target _loop0_124 static asdl_seq * -_gather_122_rule(Parser *p) +_gather_123_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22971,27 +23000,27 @@ _gather_122_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // del_target _loop0_123 + { // del_target _loop0_124 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_123")); + D(fprintf(stderr, "%*c> _gather_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_124")); expr_ty elem; asdl_seq * seq; if ( (elem = del_target_rule(p)) // del_target && - (seq = _loop0_123_rule(p)) // _loop0_123 + (seq = _loop0_124_rule(p)) // _loop0_124 ) { - D(fprintf(stderr, "%*c+ _gather_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_123")); + D(fprintf(stderr, "%*c+ _gather_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_124")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_122[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_123")); + D(fprintf(stderr, "%*c%s _gather_123[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_124")); } _res = NULL; done: @@ -22999,9 +23028,9 @@ _gather_122_rule(Parser *p) return _res; } -// _loop0_125: ',' target +// _loop0_126: ',' target static asdl_seq * -_loop0_125_rule(Parser *p) +_loop0_126_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23025,7 +23054,7 @@ _loop0_125_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' target")); + D(fprintf(stderr, "%*c> _loop0_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' target")); Token * _literal; expr_ty elem; while ( @@ -23056,7 +23085,7 @@ _loop0_125_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_125[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_126[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' target")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -23069,14 +23098,14 @@ _loop0_125_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_125_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_126_type, _seq); D(p->level--); return _seq; } -// _gather_124: target _loop0_125 +// _gather_125: target _loop0_126 static asdl_seq * -_gather_124_rule(Parser *p) +_gather_125_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23085,27 +23114,27 @@ _gather_124_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // target _loop0_125 + { // target _loop0_126 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "target _loop0_125")); + D(fprintf(stderr, "%*c> _gather_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "target _loop0_126")); expr_ty elem; asdl_seq * seq; if ( (elem = target_rule(p)) // target && - (seq = _loop0_125_rule(p)) // _loop0_125 + (seq = _loop0_126_rule(p)) // _loop0_126 ) { - D(fprintf(stderr, "%*c+ _gather_124[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "target _loop0_125")); + D(fprintf(stderr, "%*c+ _gather_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "target _loop0_126")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_124[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "target _loop0_125")); + D(fprintf(stderr, "%*c%s _gather_125[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "target _loop0_126")); } _res = NULL; done: @@ -23113,9 +23142,9 @@ _gather_124_rule(Parser *p) return _res; } -// _tmp_126: args | expression for_if_clauses +// _tmp_127: args | expression for_if_clauses static void * -_tmp_126_rule(Parser *p) +_tmp_127_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23129,18 +23158,18 @@ _tmp_126_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); + D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); expr_ty args_var; if ( (args_var = args_rule(p)) // args ) { - D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); + D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); _res = args_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args")); } { // expression for_if_clauses @@ -23148,7 +23177,7 @@ _tmp_126_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); expr_ty expression_var; asdl_seq* for_if_clauses_var; if ( @@ -23157,12 +23186,12 @@ _tmp_126_rule(Parser *p) (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses ) { - D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); _res = _PyPegen_dummy_name(p, expression_var, for_if_clauses_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression for_if_clauses")); } _res = NULL; @@ -23171,9 +23200,9 @@ _tmp_126_rule(Parser *p) return _res; } -// _loop0_127: star_named_expressions +// _loop0_128: star_named_expressions static asdl_seq * -_loop0_127_rule(Parser *p) +_loop0_128_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23197,7 +23226,7 @@ _loop0_127_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); + D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); asdl_seq* star_named_expressions_var; while ( (star_named_expressions_var = star_named_expressions_rule(p)) // star_named_expressions @@ -23219,7 +23248,7 @@ _loop0_127_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_127[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_128[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -23232,14 +23261,14 @@ _loop0_127_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_127_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_128_type, _seq); D(p->level--); return _seq; } -// _loop0_128: (star_targets '=') +// _loop0_129: (star_targets '=') static asdl_seq * -_loop0_128_rule(Parser *p) +_loop0_129_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23263,13 +23292,13 @@ _loop0_128_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_149_var; + D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_151_var; while ( - (_tmp_149_var = _tmp_149_rule(p)) // star_targets '=' + (_tmp_151_var = _tmp_151_rule(p)) // star_targets '=' ) { - _res = _tmp_149_var; + _res = _tmp_151_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23285,7 +23314,7 @@ _loop0_128_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_128[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_129[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -23298,14 +23327,14 @@ _loop0_128_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_128_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_129_type, _seq); D(p->level--); return _seq; } -// _loop0_129: (star_targets '=') +// _loop0_130: (star_targets '=') static asdl_seq * -_loop0_129_rule(Parser *p) +_loop0_130_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23329,13 +23358,13 @@ _loop0_129_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_150_var; + D(fprintf(stderr, "%*c> _loop0_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_152_var; while ( - (_tmp_150_var = _tmp_150_rule(p)) // star_targets '=' + (_tmp_152_var = _tmp_152_rule(p)) // star_targets '=' ) { - _res = _tmp_150_var; + _res = _tmp_152_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23351,7 +23380,7 @@ _loop0_129_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_129[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_130[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -23364,14 +23393,14 @@ _loop0_129_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_129_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_130_type, _seq); D(p->level--); return _seq; } -// _tmp_130: yield_expr | star_expressions +// _tmp_131: yield_expr | star_expressions static void * -_tmp_130_rule(Parser *p) +_tmp_131_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23385,18 +23414,18 @@ _tmp_130_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_130[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -23404,18 +23433,18 @@ _tmp_130_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_130[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -23424,9 +23453,9 @@ _tmp_130_rule(Parser *p) return _res; } -// _tmp_131: '[' | '(' | '{' +// _tmp_132: '[' | '(' | '{' static void * -_tmp_131_rule(Parser *p) +_tmp_132_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23440,18 +23469,18 @@ _tmp_131_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '(' @@ -23459,18 +23488,18 @@ _tmp_131_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' ) { - D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); } { // '{' @@ -23478,18 +23507,18 @@ _tmp_131_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -23498,9 +23527,9 @@ _tmp_131_rule(Parser *p) return _res; } -// _loop0_132: param_no_default +// _loop0_133: param_no_default static asdl_seq * -_loop0_132_rule(Parser *p) +_loop0_133_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23524,7 +23553,7 @@ _loop0_132_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -23546,7 +23575,7 @@ _loop0_132_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_132[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_133[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -23559,14 +23588,14 @@ _loop0_132_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_132_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_133_type, _seq); D(p->level--); return _seq; } -// _tmp_133: slash_with_default | param_with_default+ +// _tmp_134: slash_with_default | param_with_default+ static void * -_tmp_133_rule(Parser *p) +_tmp_134_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23580,18 +23609,18 @@ _tmp_133_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); SlashWithDefault* slash_with_default_var; if ( (slash_with_default_var = slash_with_default_rule(p)) // slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); _res = slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_133[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default")); } { // param_with_default+ @@ -23599,18 +23628,18 @@ _tmp_133_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - asdl_seq * _loop1_151_var; + D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+")); + asdl_seq * _loop1_153_var; if ( - (_loop1_151_var = _loop1_151_rule(p)) // param_with_default+ + (_loop1_153_var = _loop1_153_rule(p)) // param_with_default+ ) { - D(fprintf(stderr, "%*c+ _tmp_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - _res = _loop1_151_var; + D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+")); + _res = _loop1_153_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_133[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default+")); } _res = NULL; @@ -23619,9 +23648,9 @@ _tmp_133_rule(Parser *p) return _res; } -// _loop0_134: lambda_param_no_default +// _loop0_135: lambda_param_no_default static asdl_seq * -_loop0_134_rule(Parser *p) +_loop0_135_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23645,7 +23674,7 @@ _loop0_134_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -23667,7 +23696,7 @@ _loop0_134_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_134[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_135[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); @@ -23680,14 +23709,14 @@ _loop0_134_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_134_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_135_type, _seq); D(p->level--); return _seq; } -// _tmp_135: lambda_slash_with_default | lambda_param_with_default+ +// _tmp_136: lambda_slash_with_default | lambda_param_with_default+ static void * -_tmp_135_rule(Parser *p) +_tmp_136_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23701,18 +23730,18 @@ _tmp_135_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); SlashWithDefault* lambda_slash_with_default_var; if ( (lambda_slash_with_default_var = lambda_slash_with_default_rule(p)) // lambda_slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); _res = lambda_slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_135[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default")); } { // lambda_param_with_default+ @@ -23720,18 +23749,18 @@ _tmp_135_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - asdl_seq * _loop1_152_var; + D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); + asdl_seq * _loop1_154_var; if ( - (_loop1_152_var = _loop1_152_rule(p)) // lambda_param_with_default+ + (_loop1_154_var = _loop1_154_rule(p)) // lambda_param_with_default+ ) { - D(fprintf(stderr, "%*c+ _tmp_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - _res = _loop1_152_var; + D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); + _res = _loop1_154_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_135[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default+")); } _res = NULL; @@ -23740,9 +23769,9 @@ _tmp_135_rule(Parser *p) return _res; } -// _tmp_136: ')' | ',' (')' | '**') +// _tmp_137: ')' | ',' (')' | '**') static void * -_tmp_136_rule(Parser *p) +_tmp_137_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23756,18 +23785,18 @@ _tmp_136_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ',' (')' | '**') @@ -23775,21 +23804,21 @@ _tmp_136_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); Token * _literal; - void *_tmp_153_var; + void *_tmp_155_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_153_var = _tmp_153_rule(p)) // ')' | '**' + (_tmp_155_var = _tmp_155_rule(p)) // ')' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_153_var); + D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_155_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (')' | '**')")); } _res = NULL; @@ -23798,9 +23827,9 @@ _tmp_136_rule(Parser *p) return _res; } -// _tmp_137: ':' | ',' (':' | '**') +// _tmp_138: ':' | ',' (':' | '**') static void * -_tmp_137_rule(Parser *p) +_tmp_138_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23814,18 +23843,18 @@ _tmp_137_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // ',' (':' | '**') @@ -23833,21 +23862,21 @@ _tmp_137_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); Token * _literal; - void *_tmp_154_var; + void *_tmp_156_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_154_var = _tmp_154_rule(p)) // ':' | '**' + (_tmp_156_var = _tmp_156_rule(p)) // ':' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_154_var); + D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_156_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (':' | '**')")); } _res = NULL; @@ -23856,9 +23885,9 @@ _tmp_137_rule(Parser *p) return _res; } -// _tmp_138: star_targets '=' +// _tmp_139: star_targets '=' static void * -_tmp_138_rule(Parser *p) +_tmp_139_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23872,7 +23901,7 @@ _tmp_138_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty z; if ( @@ -23881,7 +23910,7 @@ _tmp_138_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -23891,7 +23920,7 @@ _tmp_138_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -23900,9 +23929,9 @@ _tmp_138_rule(Parser *p) return _res; } -// _tmp_139: '.' | '...' +// _tmp_140: '.' | '...' static void * -_tmp_139_rule(Parser *p) +_tmp_140_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23916,18 +23945,18 @@ _tmp_139_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -23935,18 +23964,18 @@ _tmp_139_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -23955,9 +23984,9 @@ _tmp_139_rule(Parser *p) return _res; } -// _tmp_140: '.' | '...' +// _tmp_141: '.' | '...' static void * -_tmp_140_rule(Parser *p) +_tmp_141_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23971,18 +24000,18 @@ _tmp_140_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -23990,18 +24019,18 @@ _tmp_140_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -24010,9 +24039,9 @@ _tmp_140_rule(Parser *p) return _res; } -// _tmp_141: '@' named_expression NEWLINE +// _tmp_142: '@' named_expression NEWLINE static void * -_tmp_141_rule(Parser *p) +_tmp_142_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24026,7 +24055,7 @@ _tmp_141_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); Token * _literal; expr_ty f; Token * newline_var; @@ -24038,7 +24067,7 @@ _tmp_141_rule(Parser *p) (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); _res = f; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24048,7 +24077,7 @@ _tmp_141_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_142[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); } _res = NULL; @@ -24057,9 +24086,9 @@ _tmp_141_rule(Parser *p) return _res; } -// _tmp_142: ',' star_expression +// _tmp_143: ',' star_expression static void * -_tmp_142_rule(Parser *p) +_tmp_143_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24073,7 +24102,7 @@ _tmp_142_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); Token * _literal; expr_ty c; if ( @@ -24082,7 +24111,7 @@ _tmp_142_rule(Parser *p) (c = star_expression_rule(p)) // star_expression ) { - D(fprintf(stderr, "%*c+ _tmp_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24092,7 +24121,7 @@ _tmp_142_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_142[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } _res = NULL; @@ -24101,9 +24130,9 @@ _tmp_142_rule(Parser *p) return _res; } -// _tmp_143: ',' expression +// _tmp_144: ',' expression static void * -_tmp_143_rule(Parser *p) +_tmp_144_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24117,7 +24146,7 @@ _tmp_143_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty c; if ( @@ -24126,7 +24155,7 @@ _tmp_143_rule(Parser *p) (c = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24136,7 +24165,7 @@ _tmp_143_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -24145,9 +24174,9 @@ _tmp_143_rule(Parser *p) return _res; } -// _tmp_144: 'or' conjunction +// _tmp_145: 'or' conjunction static void * -_tmp_144_rule(Parser *p) +_tmp_145_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24161,7 +24190,7 @@ _tmp_144_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); Token * _keyword; expr_ty c; if ( @@ -24170,7 +24199,7 @@ _tmp_144_rule(Parser *p) (c = conjunction_rule(p)) // conjunction ) { - D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24180,7 +24209,7 @@ _tmp_144_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); } _res = NULL; @@ -24189,9 +24218,9 @@ _tmp_144_rule(Parser *p) return _res; } -// _tmp_145: 'and' inversion +// _tmp_146: 'and' inversion static void * -_tmp_145_rule(Parser *p) +_tmp_146_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24205,7 +24234,7 @@ _tmp_145_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); Token * _keyword; expr_ty c; if ( @@ -24214,7 +24243,7 @@ _tmp_145_rule(Parser *p) (c = inversion_rule(p)) // inversion ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24224,7 +24253,7 @@ _tmp_145_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); } _res = NULL; @@ -24233,9 +24262,9 @@ _tmp_145_rule(Parser *p) return _res; } -// _tmp_146: 'if' disjunction +// _tmp_147: 'if' disjunction static void * -_tmp_146_rule(Parser *p) +_tmp_147_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24249,7 +24278,7 @@ _tmp_146_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -24258,7 +24287,7 @@ _tmp_146_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24268,7 +24297,7 @@ _tmp_146_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -24277,9 +24306,9 @@ _tmp_146_rule(Parser *p) return _res; } -// _tmp_147: 'if' disjunction +// _tmp_148: 'if' disjunction static void * -_tmp_147_rule(Parser *p) +_tmp_148_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24293,7 +24322,7 @@ _tmp_147_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -24302,7 +24331,7 @@ _tmp_147_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24312,7 +24341,7 @@ _tmp_147_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -24321,9 +24350,66 @@ _tmp_147_rule(Parser *p) return _res; } -// _tmp_148: ',' star_target +// _tmp_149: starred_expression | named_expression !'=' static void * -_tmp_148_rule(Parser *p) +_tmp_149_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // starred_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + expr_ty starred_expression_var; + if ( + (starred_expression_var = starred_expression_rule(p)) // starred_expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + _res = starred_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); + } + { // named_expression !'=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + expr_ty named_expression_var; + if ( + (named_expression_var = named_expression_rule(p)) // named_expression + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + _res = named_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression !'='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_150: ',' star_target +static void * +_tmp_150_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24337,7 +24423,7 @@ _tmp_148_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -24346,7 +24432,7 @@ _tmp_148_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24356,7 +24442,7 @@ _tmp_148_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -24365,9 +24451,9 @@ _tmp_148_rule(Parser *p) return _res; } -// _tmp_149: star_targets '=' +// _tmp_151: star_targets '=' static void * -_tmp_149_rule(Parser *p) +_tmp_151_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24381,7 +24467,7 @@ _tmp_149_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -24390,12 +24476,12 @@ _tmp_149_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24404,9 +24490,9 @@ _tmp_149_rule(Parser *p) return _res; } -// _tmp_150: star_targets '=' +// _tmp_152: star_targets '=' static void * -_tmp_150_rule(Parser *p) +_tmp_152_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24420,7 +24506,7 @@ _tmp_150_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -24429,12 +24515,12 @@ _tmp_150_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24443,9 +24529,9 @@ _tmp_150_rule(Parser *p) return _res; } -// _loop1_151: param_with_default +// _loop1_153: param_with_default static asdl_seq * -_loop1_151_rule(Parser *p) +_loop1_153_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24469,7 +24555,7 @@ _loop1_151_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -24491,7 +24577,7 @@ _loop1_151_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -24509,14 +24595,14 @@ _loop1_151_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_151_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_153_type, _seq); D(p->level--); return _seq; } -// _loop1_152: lambda_param_with_default +// _loop1_154: lambda_param_with_default static asdl_seq * -_loop1_152_rule(Parser *p) +_loop1_154_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24540,7 +24626,7 @@ _loop1_152_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -24562,7 +24648,7 @@ _loop1_152_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -24580,14 +24666,14 @@ _loop1_152_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_152_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_154_type, _seq); D(p->level--); return _seq; } -// _tmp_153: ')' | '**' +// _tmp_155: ')' | '**' static void * -_tmp_153_rule(Parser *p) +_tmp_155_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24601,18 +24687,18 @@ _tmp_153_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // '**' @@ -24620,18 +24706,18 @@ _tmp_153_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -24640,9 +24726,9 @@ _tmp_153_rule(Parser *p) return _res; } -// _tmp_154: ':' | '**' +// _tmp_156: ':' | '**' static void * -_tmp_154_rule(Parser *p) +_tmp_156_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24656,18 +24742,18 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '**' @@ -24675,18 +24761,18 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; diff --git a/Parser/pegen.c b/Parser/pegen.c index f615907f5f571f..2507bc4b38280b 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -2217,3 +2217,38 @@ _PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args) "Generator expression must be parenthesized" ); } + + +expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_seq *a, asdl_seq *b) { + Py_ssize_t args_len = asdl_seq_LEN(a); + Py_ssize_t total_len = args_len; + + if (b == NULL) { + expr_ty first = asdl_seq_GET(a, 0); + expr_ty last = asdl_seq_GET(a, args_len - 1); + return _Py_Call(_PyPegen_dummy_name(p), a, NULL, EXTRA_EXPR(first, last)); + + } + + asdl_seq *starreds = _PyPegen_seq_extract_starred_exprs(p, b); + asdl_seq *keywords = _PyPegen_seq_delete_starred_exprs(p, b); + + if (starreds) { + total_len += asdl_seq_LEN(starreds); + } + + asdl_seq *args = _Py_asdl_seq_new(total_len, p->arena); + + Py_ssize_t i = 0; + for (i = 0; i < args_len; i++) { + asdl_seq_SET(args, i, asdl_seq_GET(a, i)); + } + for (; i < total_len; i++) { + asdl_seq_SET(args, i, asdl_seq_GET(starreds, i - args_len)); + } + + expr_ty first = asdl_seq_GET(args, 0); + expr_ty last = asdl_seq_GET(b, asdl_seq_LEN(b)-1); + + return _Py_Call(_PyPegen_dummy_name(p), args, keywords, EXTRA_EXPR(first, last)); +} diff --git a/Parser/pegen.h b/Parser/pegen.h index f407709863c69e..3e74e3ac73e0a3 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -257,6 +257,7 @@ stmt_ty _PyPegen_class_def_decorators(Parser *, asdl_seq *, stmt_ty); KeywordOrStarred *_PyPegen_keyword_or_starred(Parser *, void *, int); asdl_seq *_PyPegen_seq_extract_starred_exprs(Parser *, asdl_seq *); asdl_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *); +expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_seq *, asdl_seq *); expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_seq *); asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *); int _PyPegen_check_barry_as_flufl(Parser *); From 9e125a5938150b789cab6410d3631123644c9358 Mon Sep 17 00:00:00 2001 From: Shantanu <12621235+hauntsaninja@users.noreply.github.com> Date: Wed, 2 Sep 2020 21:54:46 -0700 Subject: [PATCH 0028/1261] bpo-41696: Fix handling of debug mode in asyncio.run (#22069) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * bpo-41696: Fix handling of debug mode in asyncio.run This allows PYTHONASYNCIODEBUG or -X dev to enable asyncio debug mode when using asyncio.run * 📜🤖 Added by blurb_it. Co-authored-by: hauntsaninja <> Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- Lib/asyncio/runners.py | 5 +++-- Lib/test/test_asyncio/test_runners.py | 3 +++ .../next/Library/2020-09-03-01-35-32.bpo-41696.zkYGre.rst | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-03-01-35-32.bpo-41696.zkYGre.rst diff --git a/Lib/asyncio/runners.py b/Lib/asyncio/runners.py index 03ce33300eba83..268635d68fb0c0 100644 --- a/Lib/asyncio/runners.py +++ b/Lib/asyncio/runners.py @@ -5,7 +5,7 @@ from . import tasks -def run(main, *, debug=False): +def run(main, *, debug=None): """Execute the coroutine and return the result. This function runs the passed coroutine, taking care of @@ -39,7 +39,8 @@ async def main(): loop = events.new_event_loop() try: events.set_event_loop(loop) - loop.set_debug(debug) + if debug is not None: + loop.set_debug(debug) return loop.run_until_complete(main) finally: try: diff --git a/Lib/test/test_asyncio/test_runners.py b/Lib/test/test_asyncio/test_runners.py index 3b58ddee443adf..b9ae02dc3c04e0 100644 --- a/Lib/test/test_asyncio/test_runners.py +++ b/Lib/test/test_asyncio/test_runners.py @@ -87,6 +87,9 @@ async def main(expected): asyncio.run(main(False)) asyncio.run(main(True), debug=True) + with mock.patch('asyncio.coroutines._is_debug_mode', lambda: True): + asyncio.run(main(True)) + asyncio.run(main(False), debug=False) def test_asyncio_run_from_running_loop(self): async def main(): diff --git a/Misc/NEWS.d/next/Library/2020-09-03-01-35-32.bpo-41696.zkYGre.rst b/Misc/NEWS.d/next/Library/2020-09-03-01-35-32.bpo-41696.zkYGre.rst new file mode 100644 index 00000000000000..67bbbb857f18cb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-03-01-35-32.bpo-41696.zkYGre.rst @@ -0,0 +1 @@ +Fix handling of debug mode in :func:`asyncio.run`. This allows setting ``PYTHONASYNCIODEBUG`` or ``-X dev`` to enable asyncio debug mode when using :func:`asyncio.run`. \ No newline at end of file From 318ff4525069fad01d9b4797a36576a5be47b414 Mon Sep 17 00:00:00 2001 From: Ben Darnell Date: Thu, 3 Sep 2020 00:58:50 -0400 Subject: [PATCH 0029/1261] bpo-39010: Improve test shutdown (#22066) Simply closing the event loop isn't enough to avoid warnings. If we don't also shut down the event loop's default executor, it sometimes logs a "dangling thread" warning. Follow-up to GH-22017 --- Lib/test/test_asyncio/test_windows_events.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py index 33388a87d48f3f..f276cd205a2f8e 100644 --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -225,10 +225,18 @@ def test_read_self_pipe_restart(self): self.loop.run_forever() self.loop.stop() self.loop.run_forever() - # If we don't wait for f to complete here, we may get another - # warning logged about a thread that didn't shut down cleanly. + + # Shut everything down cleanly. This is an important part of the + # test - in issue 39010, the error occurred during loop.close(), + # so we want to close the loop during the test instead of leaving + # it for tearDown. + # + # First wait for f to complete to avoid a "future's result was never + # retrieved" error. self.loop.run_until_complete(f) - self.loop.close() + # Now shut down the loop itself (self.close_loop also shuts down the + # loop's default executor). + self.close_loop(self.loop) self.assertFalse(self.loop.call_exception_handler.called) From eca3134cf3c1eda31a01f9818f51bd91d49666a3 Mon Sep 17 00:00:00 2001 From: Todd Date: Thu, 3 Sep 2020 01:22:36 -0400 Subject: [PATCH 0030/1261] bpo-39883: Use BSD0 license for code in docs (GH-17635) The PSF board approved this use. --- Doc/license.rst | 34 +++++++++++++++++++ LICENSE | 25 ++++++++++++++ .../2020-03-07-03-53-39.bpo-39883.1tnb4-.rst | 1 + 3 files changed, 60 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2020-03-07-03-53-39.bpo-39883.1tnb4-.rst diff --git a/Doc/license.rst b/Doc/license.rst index fa6d71a78042d1..4030825bbd28ee 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -72,6 +72,19 @@ make these releases possible. Terms and conditions for accessing or otherwise using Python ============================================================ +Python software and documentation are licensed under the +:ref:`PSF License Agreement `. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Agreement +and the :ref:`Zero-Clause BSD license `. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. +See :ref:`OtherLicenses` for an incomplete list of these licenses. + + +.. _PSF-license: PSF LICENSE AGREEMENT FOR PYTHON |release| ------------------------------------------ @@ -258,6 +271,27 @@ CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 SOFTWARE. +.. _BSD0: + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON |release| DOCUMENTATION +---------------------------------------------------------------------- + +.. parsed-literal:: + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + + +.. _OtherLicenses: + Licenses and Acknowledgements for Incorporated Software ======================================================= diff --git a/LICENSE b/LICENSE index 66a3ac80d729a3..f42f8adbed845d 100644 --- a/LICENSE +++ b/LICENSE @@ -59,6 +59,17 @@ direction to make these releases possible. B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON =============================================================== +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 -------------------------------------------- @@ -252,3 +263,17 @@ FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/Misc/NEWS.d/next/Documentation/2020-03-07-03-53-39.bpo-39883.1tnb4-.rst b/Misc/NEWS.d/next/Documentation/2020-03-07-03-53-39.bpo-39883.1tnb4-.rst new file mode 100644 index 00000000000000..4941d50a560e2e --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-03-07-03-53-39.bpo-39883.1tnb4-.rst @@ -0,0 +1 @@ +Make code, examples, and recipes in the Python documentation be licensed under the more permissive BSD0 license in addition to the existing Python 2.0 license. \ No newline at end of file From 122596b234444a12ea61543001845d5d1796d3d1 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Thu, 3 Sep 2020 03:21:06 -0500 Subject: [PATCH 0031/1261] bpo-1635741: Port _signal module to multi-phase init (PEP 489) (GH-22049) --- ...2020-09-01-17-07-20.bpo-1635741.7wSuCc.rst | 1 + Modules/signalmodule.c | 168 +++++++++--------- 2 files changed, 87 insertions(+), 82 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-07-20.bpo-1635741.7wSuCc.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-07-20.bpo-1635741.7wSuCc.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-07-20.bpo-1635741.7wSuCc.rst new file mode 100644 index 00000000000000..ff7cb352869a22 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-07-20.bpo-1635741.7wSuCc.rst @@ -0,0 +1 @@ +Port the :mod:`_signal` extension module to multi-phase initialization (:pep:`489`). diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index c49a3ea52e71de..262f2b66a57e29 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1377,77 +1377,63 @@ ITIMER_PROF -- decrements both when the process is executing and\n\ A signal handler function is called with two arguments:\n\ the first is the signal number, the second is the interrupted stack frame."); -static struct PyModuleDef signalmodule = { - PyModuleDef_HEAD_INIT, - "_signal", - module_doc, - -1, - signal_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit__signal(void) -{ - PyObject *m, *d; - int i; - /* Create the module and add the functions */ - m = PyModule_Create(&signalmodule); - if (m == NULL) - return NULL; +static int +signal_exec(PyObject *m) +{ + /* add the functions */ #if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT) if (!initialized) { - if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0) - return NULL; + if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0) { + return -1; + } + } + + if (PyModule_AddType(m, &SiginfoType) < 0) { + return -1; } - Py_INCREF((PyObject*) &SiginfoType); - PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType); initialized = 1; #endif /* Add some symbolic constants to the module */ - d = PyModule_GetDict(m); + PyObject *d = PyModule_GetDict(m); DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL); if (!DefaultHandler || PyDict_SetItemString(d, "SIG_DFL", DefaultHandler) < 0) { - goto finally; + return -1; } IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN); if (!IgnoreHandler || PyDict_SetItemString(d, "SIG_IGN", IgnoreHandler) < 0) { - goto finally; + return -1; } if (PyModule_AddIntMacro(m, NSIG)) - goto finally; + return -1; #ifdef SIG_BLOCK if (PyModule_AddIntMacro(m, SIG_BLOCK)) - goto finally; + return -1; #endif #ifdef SIG_UNBLOCK if (PyModule_AddIntMacro(m, SIG_UNBLOCK)) - goto finally; + return -1; #endif #ifdef SIG_SETMASK if (PyModule_AddIntMacro(m, SIG_SETMASK)) - goto finally; + return -1; #endif IntHandler = PyDict_GetItemString(d, "default_int_handler"); if (!IntHandler) - goto finally; + return -1; Py_INCREF(IntHandler); _Py_atomic_store_relaxed(&Handlers[0].tripped, 0); - for (i = 1; i < NSIG; i++) { + for (int i = 1; i < NSIG; i++) { void (*t)(int); t = PyOS_getsig(i); _Py_atomic_store_relaxed(&Handlers[i].tripped, 0); @@ -1468,168 +1454,168 @@ PyInit__signal(void) #ifdef SIGHUP if (PyModule_AddIntMacro(m, SIGHUP)) - goto finally; + return -1; #endif #ifdef SIGINT if (PyModule_AddIntMacro(m, SIGINT)) - goto finally; + return -1; #endif #ifdef SIGBREAK if (PyModule_AddIntMacro(m, SIGBREAK)) - goto finally; + return -1; #endif #ifdef SIGQUIT if (PyModule_AddIntMacro(m, SIGQUIT)) - goto finally; + return -1; #endif #ifdef SIGILL if (PyModule_AddIntMacro(m, SIGILL)) - goto finally; + return -1; #endif #ifdef SIGTRAP if (PyModule_AddIntMacro(m, SIGTRAP)) - goto finally; + return -1; #endif #ifdef SIGIOT if (PyModule_AddIntMacro(m, SIGIOT)) - goto finally; + return -1; #endif #ifdef SIGABRT if (PyModule_AddIntMacro(m, SIGABRT)) - goto finally; + return -1; #endif #ifdef SIGEMT if (PyModule_AddIntMacro(m, SIGEMT)) - goto finally; + return -1; #endif #ifdef SIGFPE if (PyModule_AddIntMacro(m, SIGFPE)) - goto finally; + return -1; #endif #ifdef SIGKILL if (PyModule_AddIntMacro(m, SIGKILL)) - goto finally; + return -1; #endif #ifdef SIGBUS if (PyModule_AddIntMacro(m, SIGBUS)) - goto finally; + return -1; #endif #ifdef SIGSEGV if (PyModule_AddIntMacro(m, SIGSEGV)) - goto finally; + return -1; #endif #ifdef SIGSYS if (PyModule_AddIntMacro(m, SIGSYS)) - goto finally; + return -1; #endif #ifdef SIGPIPE if (PyModule_AddIntMacro(m, SIGPIPE)) - goto finally; + return -1; #endif #ifdef SIGALRM if (PyModule_AddIntMacro(m, SIGALRM)) - goto finally; + return -1; #endif #ifdef SIGTERM if (PyModule_AddIntMacro(m, SIGTERM)) - goto finally; + return -1; #endif #ifdef SIGUSR1 if (PyModule_AddIntMacro(m, SIGUSR1)) - goto finally; + return -1; #endif #ifdef SIGUSR2 if (PyModule_AddIntMacro(m, SIGUSR2)) - goto finally; + return -1; #endif #ifdef SIGCLD if (PyModule_AddIntMacro(m, SIGCLD)) - goto finally; + return -1; #endif #ifdef SIGCHLD if (PyModule_AddIntMacro(m, SIGCHLD)) - goto finally; + return -1; #endif #ifdef SIGPWR if (PyModule_AddIntMacro(m, SIGPWR)) - goto finally; + return -1; #endif #ifdef SIGIO if (PyModule_AddIntMacro(m, SIGIO)) - goto finally; + return -1; #endif #ifdef SIGURG if (PyModule_AddIntMacro(m, SIGURG)) - goto finally; + return -1; #endif #ifdef SIGWINCH if (PyModule_AddIntMacro(m, SIGWINCH)) - goto finally; + return -1; #endif #ifdef SIGPOLL if (PyModule_AddIntMacro(m, SIGPOLL)) - goto finally; + return -1; #endif #ifdef SIGSTOP if (PyModule_AddIntMacro(m, SIGSTOP)) - goto finally; + return -1; #endif #ifdef SIGTSTP if (PyModule_AddIntMacro(m, SIGTSTP)) - goto finally; + return -1; #endif #ifdef SIGCONT if (PyModule_AddIntMacro(m, SIGCONT)) - goto finally; + return -1; #endif #ifdef SIGTTIN if (PyModule_AddIntMacro(m, SIGTTIN)) - goto finally; + return -1; #endif #ifdef SIGTTOU if (PyModule_AddIntMacro(m, SIGTTOU)) - goto finally; + return -1; #endif #ifdef SIGVTALRM if (PyModule_AddIntMacro(m, SIGVTALRM)) - goto finally; + return -1; #endif #ifdef SIGPROF if (PyModule_AddIntMacro(m, SIGPROF)) - goto finally; + return -1; #endif #ifdef SIGXCPU if (PyModule_AddIntMacro(m, SIGXCPU)) - goto finally; + return -1; #endif #ifdef SIGXFSZ if (PyModule_AddIntMacro(m, SIGXFSZ)) - goto finally; + return -1; #endif #ifdef SIGRTMIN if (PyModule_AddIntMacro(m, SIGRTMIN)) - goto finally; + return -1; #endif #ifdef SIGRTMAX if (PyModule_AddIntMacro(m, SIGRTMAX)) - goto finally; + return -1; #endif #ifdef SIGINFO if (PyModule_AddIntMacro(m, SIGINFO)) - goto finally; + return -1; #endif #ifdef ITIMER_REAL if (PyModule_AddIntMacro(m, ITIMER_REAL)) - goto finally; + return -1; #endif #ifdef ITIMER_VIRTUAL if (PyModule_AddIntMacro(m, ITIMER_VIRTUAL)) - goto finally; + return -1; #endif #ifdef ITIMER_PROF if (PyModule_AddIntMacro(m, ITIMER_PROF)) - goto finally; + return -1; #endif #if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER) @@ -1637,18 +1623,18 @@ PyInit__signal(void) PyExc_OSError, NULL); if (!ItimerError || PyDict_SetItemString(d, "ItimerError", ItimerError) < 0) { - goto finally; + return -1; } #endif #ifdef CTRL_C_EVENT if (PyModule_AddIntMacro(m, CTRL_C_EVENT)) - goto finally; + return -1; #endif #ifdef CTRL_BREAK_EVENT if (PyModule_AddIntMacro(m, CTRL_BREAK_EVENT)) - goto finally; + return -1; #endif #ifdef MS_WINDOWS @@ -1657,12 +1643,30 @@ PyInit__signal(void) #endif if (PyErr_Occurred()) { - Py_DECREF(m); - m = NULL; + return -1; } - finally: - return m; + return 0; +} + +static PyModuleDef_Slot signal_slots[] = { + {Py_mod_exec, signal_exec}, + {0, NULL} +}; + +static struct PyModuleDef signalmodule = { + PyModuleDef_HEAD_INIT, + "_signal", + .m_doc = module_doc, + .m_size = 0, + .m_methods = signal_methods, + .m_slots = signal_slots +}; + +PyMODINIT_FUNC +PyInit__signal(void) +{ + return PyModuleDef_Init(&signalmodule); } static void From 802770925df0210969687674143a7b4eb39c560e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20=C5=A0a=C5=A1ko?= Date: Thu, 3 Sep 2020 12:00:10 +0200 Subject: [PATCH 0032/1261] [doc] Fix a typo in the graphlib docs (#22030) --- Doc/library/graphlib.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/graphlib.rst b/Doc/library/graphlib.rst index 820615e7230157..0faca2186b268c 100644 --- a/Doc/library/graphlib.rst +++ b/Doc/library/graphlib.rst @@ -121,7 +121,7 @@ if ts.is_active(): ... - if possible to simply do:: + it is possible to simply do:: if ts: ... From c49cf0dbbbe054b65b0a2ebcf7355c775593fc12 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 3 Sep 2020 15:29:32 +0100 Subject: [PATCH 0033/1261] bpo-41697: Correctly handle KeywordOrStarred when parsing arguments in the parser (GH-22077) --- Grammar/python.gram | 2 +- Parser/parser.c | 11 ++++++++++- Parser/pegen.c | 17 +++++++++-------- Parser/pegen.h | 4 +++- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Grammar/python.gram b/Grammar/python.gram index 84835b731c540f..524e88eb389968 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -535,7 +535,7 @@ arguments[expr_ty] (memo): | a=args [','] &')' { a } | incorrect_arguments args[expr_ty]: - | a=','.(starred_expression | named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b) } + | a=','.(starred_expression | named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b, EXTRA) } | a=kwargs { _Py_Call(_PyPegen_dummy_name(p), CHECK_NULL_ALLOWED(_PyPegen_seq_extract_starred_exprs(p, a)), CHECK_NULL_ALLOWED(_PyPegen_seq_delete_starred_exprs(p, a)), diff --git a/Parser/parser.c b/Parser/parser.c index 3e724a260d90a9..8a7cb62fd7cf8d 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -12237,7 +12237,16 @@ args_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); - _res = _PyPegen_collect_call_seqs ( p , a , b ); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_collect_call_seqs ( p , a , b , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); diff --git a/Parser/pegen.c b/Parser/pegen.c index 2507bc4b38280b..4beb2abdd296aa 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -2219,14 +2219,15 @@ _PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args) } -expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_seq *a, asdl_seq *b) { +expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_seq *a, asdl_seq *b, + int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena) { Py_ssize_t args_len = asdl_seq_LEN(a); Py_ssize_t total_len = args_len; if (b == NULL) { - expr_ty first = asdl_seq_GET(a, 0); - expr_ty last = asdl_seq_GET(a, args_len - 1); - return _Py_Call(_PyPegen_dummy_name(p), a, NULL, EXTRA_EXPR(first, last)); + return _Py_Call(_PyPegen_dummy_name(p), a, NULL, lineno, col_offset, + end_lineno, end_col_offset, arena); } @@ -2237,7 +2238,7 @@ expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_seq *a, asdl_seq *b) { total_len += asdl_seq_LEN(starreds); } - asdl_seq *args = _Py_asdl_seq_new(total_len, p->arena); + asdl_seq *args = _Py_asdl_seq_new(total_len, arena); Py_ssize_t i = 0; for (i = 0; i < args_len; i++) { @@ -2247,8 +2248,8 @@ expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_seq *a, asdl_seq *b) { asdl_seq_SET(args, i, asdl_seq_GET(starreds, i - args_len)); } - expr_ty first = asdl_seq_GET(args, 0); - expr_ty last = asdl_seq_GET(b, asdl_seq_LEN(b)-1); + return _Py_Call(_PyPegen_dummy_name(p), args, keywords, lineno, + col_offset, end_lineno, end_col_offset, arena); + - return _Py_Call(_PyPegen_dummy_name(p), args, keywords, EXTRA_EXPR(first, last)); } diff --git a/Parser/pegen.h b/Parser/pegen.h index 3e74e3ac73e0a3..c81681efad2080 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -257,7 +257,9 @@ stmt_ty _PyPegen_class_def_decorators(Parser *, asdl_seq *, stmt_ty); KeywordOrStarred *_PyPegen_keyword_or_starred(Parser *, void *, int); asdl_seq *_PyPegen_seq_extract_starred_exprs(Parser *, asdl_seq *); asdl_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *); -expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_seq *, asdl_seq *); +expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_seq *, asdl_seq *, + int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_seq *); asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *); int _PyPegen_check_barry_as_flufl(Parser *); From 3a1fa0f090dd795dee2c4a2f1b80bc2940efc4c9 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 3 Sep 2020 15:29:55 +0100 Subject: [PATCH 0034/1261] Fix 'gather' rules in the python parser generator (GH-22021) Currently, empty sequences in gather rules make the conditional for gather rules fail as empty sequences evaluate as "False". We need to explicitly check for "None" (the failure condition) to avoid false negatives. --- Lib/test/test_peg_generator/test_pegen.py | 16 +++++++++++++++- Tools/peg_generator/pegen/python_generator.py | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_peg_generator/test_pegen.py b/Lib/test/test_peg_generator/test_pegen.py index 5b4e964d698ade..bcfee3f2c5f8c3 100644 --- a/Lib/test/test_peg_generator/test_pegen.py +++ b/Lib/test/test_peg_generator/test_pegen.py @@ -74,7 +74,7 @@ def test_typed_rules(self) -> None: "Rule('term', 'int', Rhs([Alt([NamedItem(None, NameLeaf('NUMBER'))])]))" ) - def test_repeat_with_separator_rules(self) -> None: + def test_gather(self) -> None: grammar = """ start: ','.thing+ NEWLINE thing: NUMBER @@ -85,6 +85,20 @@ def test_repeat_with_separator_rules(self) -> None: "Rule('start', None, Rhs([Alt([NamedItem(None, Gather(StringLeaf(\"','\"), NameLeaf('thing'" )) self.assertEqual(str(rules["thing"]), "thing: NUMBER") + parser_class = make_parser(grammar) + node = parse_string("42\n", parser_class) + assert node == [ + [[TokenInfo(NUMBER, string="42", start=(1, 0), end=(1, 2), line="42\n")]], + TokenInfo(NEWLINE, string="\n", start=(1, 2), end=(1, 3), line="42\n"), + ] + node = parse_string("1, 2\n", parser_class) + assert node == [ + [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1, 2\n")], + [TokenInfo(NUMBER, string="2", start=(1, 3), end=(1, 4), line="1, 2\n")], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 4), end=(1, 5), line="1, 2\n"), + ] def test_expr_grammar(self) -> None: grammar = """ diff --git a/Tools/peg_generator/pegen/python_generator.py b/Tools/peg_generator/pegen/python_generator.py index 45a75975dbf5e0..b786de7fee5b43 100644 --- a/Tools/peg_generator/pegen/python_generator.py +++ b/Tools/peg_generator/pegen/python_generator.py @@ -217,6 +217,9 @@ def visit_Alt(self, node: Alt, is_loop: bool, is_gather: bool) -> None: else: self.print("and") self.visit(item) + if is_gather: + self.print("is not None") + self.print("):") with self.indent(): action = node.action From 6b0856717f9276e0457a355ef5cc996372008be8 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Thu, 3 Sep 2020 19:44:12 +0100 Subject: [PATCH 0035/1261] [doc] Update documentation on logging optimization. (GH-22075) --- Doc/howto/logging.rst | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 6316e086ef43ba..b4dd9206c9d524 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -1078,20 +1078,22 @@ need more precise control over what logging information is collected. Here's a list of things you can do to avoid processing during logging which you don't need: -+-----------------------------------------------+----------------------------------------+ -| What you don't want to collect | How to avoid collecting it | -+===============================================+========================================+ -| Information about where calls were made from. | Set ``logging._srcfile`` to ``None``. | -| | This avoids calling | -| | :func:`sys._getframe`, which may help | -| | to speed up your code in environments | -| | like PyPy (which can't speed up code | -| | that uses :func:`sys._getframe`). | -+-----------------------------------------------+----------------------------------------+ -| Threading information. | Set ``logging.logThreads`` to ``0``. | -+-----------------------------------------------+----------------------------------------+ -| Process information. | Set ``logging.logProcesses`` to ``0``. | -+-----------------------------------------------+----------------------------------------+ ++-----------------------------------------------------+---------------------------------------------------+ +| What you don't want to collect | How to avoid collecting it | ++=====================================================+===================================================+ +| Information about where calls were made from. | Set ``logging._srcfile`` to ``None``. | +| | This avoids calling :func:`sys._getframe`, which | +| | may help to speed up your code in environments | +| | like PyPy (which can't speed up code that uses | +| | :func:`sys._getframe`). | ++-----------------------------------------------------+---------------------------------------------------+ +| Threading information. | Set ``logging.logThreads`` to ``False``. | ++-----------------------------------------------------+---------------------------------------------------+ +| Current process ID (:func:`os.getpid`) | Set ``logging.logProcesses`` to ``False``. | ++-----------------------------------------------------+---------------------------------------------------+ +| Current process name when using ``multiprocessing`` | Set ``logging.logMultiprocessing`` to ``False``. | +| to manage multiple processes. | | ++-----------------------------------------------------+---------------------------------------------------+ Also note that the core logging module only includes the basic handlers. If you don't import :mod:`logging.handlers` and :mod:`logging.config`, they won't From c5d4e7ce11b7df7019d5b4927df268088cbaed3d Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 4 Sep 2020 08:47:40 +0000 Subject: [PATCH 0036/1261] bpo-41700: Skip test if the locale is not supported (GH-22081) --- Lib/test/test_c_locale_coercion.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_c_locale_coercion.py b/Lib/test/test_c_locale_coercion.py index 8340a9eb2ea3a3..fcc85992345dbc 100644 --- a/Lib/test/test_c_locale_coercion.py +++ b/Lib/test/test_c_locale_coercion.py @@ -407,7 +407,10 @@ def test_PYTHONCOERCECLOCALE_set_to_one(self): # skip the test if the LC_CTYPE locale is C or coerced old_loc = locale.setlocale(locale.LC_CTYPE, None) self.addCleanup(locale.setlocale, locale.LC_CTYPE, old_loc) - loc = locale.setlocale(locale.LC_CTYPE, "") + try: + loc = locale.setlocale(locale.LC_CTYPE, "") + except locale.Error as e: + self.skipTest(str(e)) if loc == "C": self.skipTest("test requires LC_CTYPE locale different than C") if loc in TARGET_LOCALES : From 0cc32f2c9cfee3333af45e2ffa6a5a09a32c6231 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 4 Sep 2020 14:51:05 +0200 Subject: [PATCH 0037/1261] bpo-41713: _signal doesn't use multi-phase init (GH-22087) Partially revert commit 71d1bd9569c8a497e279f2fea6fe47cd70a87ea3: don't use multi-phase initialization (PEP 489) for the _signal extension module. --- ...2020-09-01-17-07-20.bpo-1635741.7wSuCc.rst | 1 - Modules/signalmodule.c | 20 ++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-07-20.bpo-1635741.7wSuCc.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-07-20.bpo-1635741.7wSuCc.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-07-20.bpo-1635741.7wSuCc.rst deleted file mode 100644 index ff7cb352869a22..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-07-20.bpo-1635741.7wSuCc.rst +++ /dev/null @@ -1 +0,0 @@ -Port the :mod:`_signal` extension module to multi-phase initialization (:pep:`489`). diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 262f2b66a57e29..3440894b2159d5 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1649,26 +1649,32 @@ signal_exec(PyObject *m) return 0; } -static PyModuleDef_Slot signal_slots[] = { - {Py_mod_exec, signal_exec}, - {0, NULL} -}; static struct PyModuleDef signalmodule = { PyModuleDef_HEAD_INIT, "_signal", .m_doc = module_doc, - .m_size = 0, + .m_size = -1, .m_methods = signal_methods, - .m_slots = signal_slots }; + PyMODINIT_FUNC PyInit__signal(void) { - return PyModuleDef_Init(&signalmodule); + PyObject *mod = PyModule_Create(&signalmodule); + if (mod == NULL) { + return NULL; + } + + if (signal_exec(mod) < 0) { + Py_DECREF(mod); + return NULL; + } + return mod; } + static void finisignal(void) { From 8bdf413f323163f84cccbf3eed516b28159cb8c1 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 4 Sep 2020 20:55:41 +0300 Subject: [PATCH 0038/1261] bpo-41638: Improve ProgrammingError message for absent parameter. (GH-21999) It contains now the name of the parameter instead of its index when parameters are supplied as a dict. --- .../next/Library/2020-08-29-16-45-12.bpo-41638.iZfW5N.rst | 3 +++ Modules/_sqlite/statement.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-08-29-16-45-12.bpo-41638.iZfW5N.rst diff --git a/Misc/NEWS.d/next/Library/2020-08-29-16-45-12.bpo-41638.iZfW5N.rst b/Misc/NEWS.d/next/Library/2020-08-29-16-45-12.bpo-41638.iZfW5N.rst new file mode 100644 index 00000000000000..8ab7b5e9903dcb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-29-16-45-12.bpo-41638.iZfW5N.rst @@ -0,0 +1,3 @@ +:exc:`~sqlite3.ProgrammingError` message for absent parameter in :mod:`sqlite3` +contains now the name of the parameter instead of its index when parameters +are supplied as a dict. diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 9de8f9b67228f5..26599b423eb8b9 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -295,7 +295,7 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para Py_DECREF(binding_name_obj); if (!current_param) { if (!PyErr_Occurred() || PyErr_ExceptionMatches(PyExc_LookupError)) { - PyErr_Format(pysqlite_ProgrammingError, "You did not supply a value for binding %d.", i); + PyErr_Format(pysqlite_ProgrammingError, "You did not supply a value for binding parameter :%s.", binding_name); } return; } From 9b91c5ba35bafce76872783d9ffcb9702b55b619 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 4 Sep 2020 21:19:30 +0300 Subject: [PATCH 0039/1261] bpo-40486: Specify what happens if directory content change diring iteration (GH-22025) --- Doc/library/glob.rst | 4 +++- Doc/library/os.rst | 11 +++++++++-- Doc/library/pathlib.rst | 5 +++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Doc/library/glob.rst b/Doc/library/glob.rst index 280e9f08266024..3fdba6937c1de0 100644 --- a/Doc/library/glob.rst +++ b/Doc/library/glob.rst @@ -43,7 +43,9 @@ For example, ``'[?]'`` matches the character ``'?'``. (like :file:`/usr/src/Python-1.5/Makefile`) or relative (like :file:`../../Tools/\*/\*.gif`), and can contain shell-style wildcards. Broken symlinks are included in the results (as in the shell). Whether or not the - results are sorted depends on the file system. + results are sorted depends on the file system. If a file that satisfies + conditions is removed or added during the call of this function, whether + a path name for that file be included is unspecified. If *root_dir* is not ``None``, it should be a :term:`path-like object` specifying the root directory for searching. It has the same effect on diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 275b2d390e7cf5..8c3bc5fb87d61b 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1852,6 +1852,8 @@ features: Return a list containing the names of the entries in the directory given by *path*. The list is in arbitrary order, and does not include the special entries ``'.'`` and ``'..'`` even if they are present in the directory. + If a file is removed from or added to the directory during the call of + this function, whether a name for that file be included is unspecified. *path* may be a :term:`path-like object`. If *path* is of type ``bytes`` (directly or indirectly through the :class:`PathLike` interface), @@ -2257,7 +2259,9 @@ features: Return an iterator of :class:`os.DirEntry` objects corresponding to the entries in the directory given by *path*. The entries are yielded in arbitrary order, and the special entries ``'.'`` and ``'..'`` are not - included. + included. If a file is removed from or added to the directory after + creating the iterator, whether an entry for that file be included is + unspecified. Using :func:`scandir` instead of :func:`listdir` can significantly increase the performance of code that also needs file type or file @@ -3007,7 +3011,10 @@ features: *filenames* is a list of the names of the non-directory files in *dirpath*. Note that the names in the lists contain no path components. To get a full path (which begins with *top*) to a file or directory in *dirpath*, do - ``os.path.join(dirpath, name)``. + ``os.path.join(dirpath, name)``. Whether or not the lists are sorted + depends on the file system. If a file is removed from or added to the + *dirpath* directory during generating the lists, whether a name for that + file be included is unspecified. If optional argument *topdown* is ``True`` or not specified, the triple for a directory is generated before the triples for any of its subdirectories diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 04810f5204397b..23486b625072f3 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -890,6 +890,11 @@ call fails (for example because the path doesn't exist). PosixPath('docs/_static') PosixPath('docs/Makefile') + The children are yielded in arbitrary order, and the special entries + ``'.'`` and ``'..'`` are not included. If a file is removed from or added + to the directory after creating the iterator, whether an path object for + that file be included is unspecified. + .. method:: Path.lchmod(mode) Like :meth:`Path.chmod` but, if the path points to a symbolic link, the From ce688ef81d0556c17328300d9b23d4ae2647c763 Mon Sep 17 00:00:00 2001 From: Stefan Krah Date: Fri, 4 Sep 2020 22:33:17 +0200 Subject: [PATCH 0040/1261] bpo-41721: Add xlc options (GH-22096) --- configure | 5 ++++- configure.ac | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 4c18ae7e364ca1..ad74754e9a7215 100755 --- a/configure +++ b/configure @@ -7592,11 +7592,14 @@ $as_echo "$MACOSX_DEPLOYMENT_TARGET" >&6; } ;; esac -# ICC needs -fp-model strict or floats behave badly case "$CC" in *icc*) + # ICC needs -fp-model strict or floats behave badly CFLAGS_NODIST="$CFLAGS_NODIST -fp-model strict" ;; +*xlc*) + CFLAGS_NODIST="$CFLAGS_NODIST -qalias=noansi -qmaxmem=-1" + ;; esac if test "$assertions" = 'true'; then diff --git a/configure.ac b/configure.ac index 3b40f39124dad5..f0bc8c625844b6 100644 --- a/configure.ac +++ b/configure.ac @@ -1993,11 +1993,14 @@ yes) ;; esac -# ICC needs -fp-model strict or floats behave badly case "$CC" in *icc*) + # ICC needs -fp-model strict or floats behave badly CFLAGS_NODIST="$CFLAGS_NODIST -fp-model strict" ;; +*xlc*) + CFLAGS_NODIST="$CFLAGS_NODIST -qalias=noansi -qmaxmem=-1" + ;; esac if test "$assertions" = 'true'; then From 30caedd91765dda40401d24768740568df553d21 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Fri, 4 Sep 2020 14:57:48 -0600 Subject: [PATCH 0041/1261] bpo-38585: Remove references to defusedexpat (GH-22095) defusedexpat is not maintained. --- Doc/library/xml.rst | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/Doc/library/xml.rst b/Doc/library/xml.rst index fb86b6f5564d76..1981cab7cd438d 100644 --- a/Doc/library/xml.rst +++ b/Doc/library/xml.rst @@ -20,7 +20,7 @@ Python's interfaces for processing XML are grouped in the ``xml`` package. The XML modules are not secure against erroneous or maliciously constructed data. If you need to parse untrusted or unauthenticated data see the :ref:`xml-vulnerabilities` and - :ref:`defused-packages` sections. + :ref:`defusedxml-package` sections. It is important to note that modules in the :mod:`xml` package require that there be at least one SAX-compliant XML parser available. The Expat parser is @@ -113,9 +113,9 @@ decompression bomb The documentation for `defusedxml`_ on PyPI has further information about all known attack vectors with examples and references. -.. _defused-packages: +.. _defusedxml-package: -The :mod:`defusedxml` and :mod:`defusedexpat` Packages +The :mod:`defusedxml` Package ------------------------------------------------------ `defusedxml`_ is a pure Python package with modified subclasses of all stdlib @@ -124,16 +124,8 @@ package is recommended for any server code that parses untrusted XML data. The package also ships with example exploits and extended documentation on more XML exploits such as XPath injection. -`defusedexpat`_ provides a modified libexpat and a patched -:mod:`pyexpat` module that have countermeasures against entity expansion -DoS attacks. The :mod:`defusedexpat` module still allows a sane and configurable amount of entity -expansions. The modifications may be included in some future release of Python, -but will not be included in any bugfix releases of -Python because they break backward compatibility. - .. _defusedxml: https://pypi.org/project/defusedxml/ -.. _defusedexpat: https://pypi.org/project/defusedexpat/ .. _Billion Laughs: https://en.wikipedia.org/wiki/Billion_laughs .. _ZIP bomb: https://en.wikipedia.org/wiki/Zip_bomb .. _DTD: https://en.wikipedia.org/wiki/Document_type_definition From 58ee03dab134adefa918608572a1ca523329fa01 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Sat, 5 Sep 2020 00:45:54 +0100 Subject: [PATCH 0042/1261] bpo-41627: Distinguish 32 and 64-bit user site packages on Windows (GH-22098) Also fixes the error message returned when sysconfig fails to interpolate a variable correctly. --- Lib/site.py | 3 ++- Lib/sysconfig.py | 22 +++++++++++-------- .../2020-09-04-21-35-28.bpo-41627.sx2KN1.rst | 2 ++ 3 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-09-04-21-35-28.bpo-41627.sx2KN1.rst diff --git a/Lib/site.py b/Lib/site.py index 8979365cafc37e..4c095774729c5e 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -274,7 +274,8 @@ def _get_path(userbase): version = sys.version_info if os.name == 'nt': - return f'{userbase}\\Python{version[0]}{version[1]}\\site-packages' + ver_nodot = sys.winver.replace('.', '') + return f'{userbase}\\Python{ver_nodot}\\site-packages' if sys.platform == 'darwin' and sys._framework: return f'{userbase}/lib/python/site-packages' diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index bf04ac541e6b02..6c87b06634c457 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -53,12 +53,12 @@ }, # NOTE: When modifying "purelib" scheme, update site._get_path() too. 'nt_user': { - 'stdlib': '{userbase}/Python{py_version_nodot}', - 'platstdlib': '{userbase}/Python{py_version_nodot}', - 'purelib': '{userbase}/Python{py_version_nodot}/site-packages', - 'platlib': '{userbase}/Python{py_version_nodot}/site-packages', - 'include': '{userbase}/Python{py_version_nodot}/Include', - 'scripts': '{userbase}/Python{py_version_nodot}/Scripts', + 'stdlib': '{userbase}/Python{py_version_nodot_plat}', + 'platstdlib': '{userbase}/Python{py_version_nodot_plat}', + 'purelib': '{userbase}/Python{py_version_nodot_plat}/site-packages', + 'platlib': '{userbase}/Python{py_version_nodot_plat}/site-packages', + 'include': '{userbase}/Python{py_version_nodot_plat}/Include', + 'scripts': '{userbase}/Python{py_version_nodot_plat}/Scripts', 'data': '{userbase}', }, 'posix_user': { @@ -149,10 +149,10 @@ def is_python_build(check_home=False): def _subst_vars(s, local_vars): try: return s.format(**local_vars) - except KeyError: + except KeyError as var: try: return s.format(**os.environ) - except KeyError as var: + except KeyError: raise AttributeError('{%s}' % var) from None def _extend_dict(target_dict, other_dict): @@ -431,6 +431,7 @@ def _init_non_posix(vars): vars['EXE'] = '.exe' vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + vars['TZPATH'] = '' # # public APIs @@ -543,10 +544,13 @@ def get_config_vars(*args): except AttributeError: # sys.abiflags may not be defined on all platforms. _CONFIG_VARS['abiflags'] = '' + try: + _CONFIG_VARS['py_version_nodot_plat'] = sys.winver.replace('.', '') + except AttributeError: + _CONFIG_VARS['py_version_nodot_plat'] = '' if os.name == 'nt': _init_non_posix(_CONFIG_VARS) - _CONFIG_VARS['TZPATH'] = '' if os.name == 'posix': _init_posix(_CONFIG_VARS) # For backward compatibility, see issue19555 diff --git a/Misc/NEWS.d/next/Windows/2020-09-04-21-35-28.bpo-41627.sx2KN1.rst b/Misc/NEWS.d/next/Windows/2020-09-04-21-35-28.bpo-41627.sx2KN1.rst new file mode 100644 index 00000000000000..043bd5e9341c3c --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-09-04-21-35-28.bpo-41627.sx2KN1.rst @@ -0,0 +1,2 @@ +The user site directory for 32-bit now includes a ``-32`` suffix to +distinguish it from the 64-bit interpreter's directory. From 91437692ceddfa3c455b88b5d9efbb39bcef552b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kul=C3=ADk?= Date: Sat, 5 Sep 2020 21:10:01 +0200 Subject: [PATCH 0043/1261] bpo-41687: Fix sendfile implementation to work with Solaris (#22040) --- Lib/test/test_asyncio/test_sendfile.py | 6 ++++++ .../2020-09-01-15-57-51.bpo-41687.m1b1KA.rst | 1 + Modules/posixmodule.c | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst diff --git a/Lib/test/test_asyncio/test_sendfile.py b/Lib/test/test_asyncio/test_sendfile.py index a30d9b9b4d9a01..01c698653ec67e 100644 --- a/Lib/test/test_asyncio/test_sendfile.py +++ b/Lib/test/test_asyncio/test_sendfile.py @@ -446,6 +446,12 @@ def test_sendfile_ssl_close_peer_after_receiving(self): self.assertEqual(srv_proto.data, self.DATA) self.assertEqual(self.file.tell(), len(self.DATA)) + # On Solaris, lowering SO_RCVBUF on a TCP connection after it has been + # established has no effect. Due to its age, this bug affects both Oracle + # Solaris as well as all other OpenSolaris forks (unless they fixed it + # themselves). + @unittest.skipIf(sys.platform.startswith('sunos'), + "Doesn't work on Solaris") def test_sendfile_close_peer_in_the_middle_of_receiving(self): srv_proto, cli_proto = self.prepare_sendfile(close_after=1024) with self.assertRaises(ConnectionError): diff --git a/Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst b/Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst new file mode 100644 index 00000000000000..284f500735701e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst @@ -0,0 +1 @@ +Fix implementation of sendfile to be compatible with Solaris. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index a6a4b9f012f009..00ba7580302bba 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -9518,6 +9518,25 @@ os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj, if (!Py_off_t_converter(offobj, &offset)) return NULL; +#if defined(__sun) && defined(__SVR4) + // On Solaris, sendfile raises EINVAL rather than returning 0 + // when the offset is equal or bigger than the in_fd size. + int res; + struct stat st; + + do { + Py_BEGIN_ALLOW_THREADS + res = fstat(in_fd, &st); + Py_END_ALLOW_THREADS + } while (res != 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); + if (ret < 0) + return (!async_err) ? posix_error() : NULL; + + if (offset >= st.st_size) { + return Py_BuildValue("i", 0); + } +#endif + do { Py_BEGIN_ALLOW_THREADS ret = sendfile(out_fd, in_fd, &offset, count); From 21d512206221c5be684a91103202ffbbdd07e6c2 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Sat, 5 Sep 2020 22:43:31 +0200 Subject: [PATCH 0044/1261] bpo-40318: Migrate to SQLite3 trace v2 API (GH-19581) Ref. https://sqlite.org/c3ref/trace_v2.html Co-authored-by: Pablo Galindo --- .../2020-04-18-14-16-02.bpo-40318.K2UdRx.rst | 1 + Modules/_sqlite/connection.c | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-04-18-14-16-02.bpo-40318.K2UdRx.rst diff --git a/Misc/NEWS.d/next/Library/2020-04-18-14-16-02.bpo-40318.K2UdRx.rst b/Misc/NEWS.d/next/Library/2020-04-18-14-16-02.bpo-40318.K2UdRx.rst new file mode 100644 index 00000000000000..3d5fcfb74a0fe5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-04-18-14-16-02.bpo-40318.K2UdRx.rst @@ -0,0 +1 @@ +Use SQLite3 trace v2 API, if it is available. diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 958be7d869794a..1bf9710763a5ab 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -43,6 +43,10 @@ #define HAVE_BACKUP_API #endif +#if SQLITE_VERSION_NUMBER >= 3014000 +#define HAVE_TRACE_V2 +#endif + _Py_IDENTIFIER(cursor); static const char * const begin_statements[] = { @@ -962,13 +966,29 @@ static int _progress_handler(void* user_arg) return rc; } +#ifdef HAVE_TRACE_V2 +/* + * From https://sqlite.org/c3ref/trace_v2.html: + * The integer return value from the callback is currently ignored, though this + * may change in future releases. Callback implementations should return zero + * to ensure future compatibility. + */ +static int _trace_callback(unsigned int type, void* user_arg, void* prepared_statement, void* statement_string) +#else static void _trace_callback(void* user_arg, const char* statement_string) +#endif { PyObject *py_statement = NULL; PyObject *ret = NULL; PyGILState_STATE gilstate; +#ifdef HAVE_TRACE_V2 + if (type != SQLITE_TRACE_STMT) { + return 0; + } +#endif + gilstate = PyGILState_Ensure(); py_statement = PyUnicode_DecodeUTF8(statement_string, strlen(statement_string), "replace"); @@ -988,6 +1008,9 @@ static void _trace_callback(void* user_arg, const char* statement_string) } PyGILState_Release(gilstate); +#ifdef HAVE_TRACE_V2 + return 0; +#endif } static PyObject* pysqlite_connection_set_authorizer(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) @@ -1046,6 +1069,11 @@ static PyObject* pysqlite_connection_set_progress_handler(pysqlite_Connection* s Py_RETURN_NONE; } +/* + * Ref. + * - https://sqlite.org/c3ref/c_trace.html + * - https://sqlite.org/c3ref/trace_v2.html + */ static PyObject* pysqlite_connection_set_trace_callback(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) { PyObject* trace_callback; @@ -1063,10 +1091,18 @@ static PyObject* pysqlite_connection_set_trace_callback(pysqlite_Connection* sel if (trace_callback == Py_None) { /* None clears the trace callback previously set */ +#ifdef HAVE_TRACE_V2 + sqlite3_trace_v2(self->db, SQLITE_TRACE_STMT, 0, 0); +#else sqlite3_trace(self->db, 0, (void*)0); +#endif Py_XSETREF(self->function_pinboard_trace_callback, NULL); } else { +#ifdef HAVE_TRACE_V2 + sqlite3_trace_v2(self->db, SQLITE_TRACE_STMT, _trace_callback, trace_callback); +#else sqlite3_trace(self->db, _trace_callback, trace_callback); +#endif Py_INCREF(trace_callback); Py_XSETREF(self->function_pinboard_trace_callback, trace_callback); } From be74da37786c5f8a6ade606a0dff50452c1017b5 Mon Sep 17 00:00:00 2001 From: johnthagen Date: Sat, 5 Sep 2020 16:53:47 -0400 Subject: [PATCH 0045/1261] Fix documented Python version for venv --upgrade-deps (GH-22113) Fixes incorrect Python version added for `venv` `--upgrade-deps` in #13100. This feature was added in Python 3.9 not 3.8. Relates to: - - https://github.com/python/cpython/commit/1cba1c9abadf76f458ecf883a48515aa3b534dbd Automerge-Triggered-By: @vsajip --- Doc/using/venv-create.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc index 8f850a74d413ce..ddb36f94667d9f 100644 --- a/Doc/using/venv-create.inc +++ b/Doc/using/venv-create.inc @@ -67,7 +67,7 @@ The command, if run with ``-h``, will show the available options:: Once an environment has been created, you may wish to activate it, e.g. by sourcing an activate script in its bin directory. -.. versionchanged:: 3.8 +.. versionchanged:: 3.9 Add ``--upgrade-deps`` option to upgrade pip + setuptools to the latest on PyPI .. versionchanged:: 3.4 From 822faba5735bb7ae9d96428d58a2a8eea6931f0b Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Sat, 5 Sep 2020 20:40:25 -0300 Subject: [PATCH 0046/1261] [doc] Fix padding in some typing definitions (GH-22114) Automerge-Triggered-By: @gvanrossum --- Doc/library/typing.rst | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 9f98f8ce3f642d..6d6b76c1d08956 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1195,7 +1195,7 @@ Corresponding to collections in :mod:`collections.abc` .. class:: AbstractSet(Sized, Collection[T_co]) - A generic version of :class:`collections.abc.Set`. + A generic version of :class:`collections.abc.Set`. .. deprecated:: 3.9 :class:`collections.abc.Set` now supports ``[]``. See :pep:`585`. @@ -1224,7 +1224,7 @@ Corresponding to collections in :mod:`collections.abc` .. class:: Container(Generic[T_co]) - A generic version of :class:`collections.abc.Container`. + A generic version of :class:`collections.abc.Container`. .. deprecated:: 3.9 :class:`collections.abc.Container` now supports ``[]``. See :pep:`585`. @@ -1245,11 +1245,11 @@ Corresponding to collections in :mod:`collections.abc` .. class:: Mapping(Sized, Collection[KT], Generic[VT_co]) - A generic version of :class:`collections.abc.Mapping`. - This type can be used as follows:: + A generic version of :class:`collections.abc.Mapping`. + This type can be used as follows:: - def get_position_in_index(word_list: Mapping[str, int], word: str) -> int: - return word_list[word] + def get_position_in_index(word_list: Mapping[str, int], word: str) -> int: + return word_list[word] .. deprecated:: 3.9 :class:`collections.abc.Mapping` now supports ``[]``. See :pep:`585`. @@ -1263,7 +1263,7 @@ Corresponding to collections in :mod:`collections.abc` .. class:: MutableMapping(Mapping[KT, VT]) - A generic version of :class:`collections.abc.MutableMapping`. + A generic version of :class:`collections.abc.MutableMapping`. .. deprecated:: 3.9 :class:`collections.abc.MutableMapping` now supports ``[]``. See :pep:`585`. @@ -1277,14 +1277,14 @@ Corresponding to collections in :mod:`collections.abc` .. class:: MutableSet(AbstractSet[T]) - A generic version of :class:`collections.abc.MutableSet`. + A generic version of :class:`collections.abc.MutableSet`. .. deprecated:: 3.9 :class:`collections.abc.MutableSet` now supports ``[]``. See :pep:`585`. .. class:: Sequence(Reversible[T_co], Collection[T_co]) - A generic version of :class:`collections.abc.Sequence`. + A generic version of :class:`collections.abc.Sequence`. .. deprecated:: 3.9 :class:`collections.abc.Sequence` now supports ``[]``. See :pep:`585`. @@ -1301,14 +1301,14 @@ Corresponding to other types in :mod:`collections.abc` .. class:: Iterable(Generic[T_co]) - A generic version of :class:`collections.abc.Iterable`. + A generic version of :class:`collections.abc.Iterable`. .. deprecated:: 3.9 :class:`collections.abc.Iterable` now supports ``[]``. See :pep:`585`. .. class:: Iterator(Iterable[T_co]) - A generic version of :class:`collections.abc.Iterator`. + A generic version of :class:`collections.abc.Iterator`. .. deprecated:: 3.9 :class:`collections.abc.Iterator` now supports ``[]``. See :pep:`585`. @@ -1353,7 +1353,7 @@ Corresponding to other types in :mod:`collections.abc` .. class:: Reversible(Iterable[T_co]) - A generic version of :class:`collections.abc.Reversible`. + A generic version of :class:`collections.abc.Reversible`. .. deprecated:: 3.9 :class:`collections.abc.Reversible` now supports ``[]``. See :pep:`585`. From 6d6ee050d5647849fcffaba85afe1aca1d62735a Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sat, 5 Sep 2020 21:39:23 -0600 Subject: [PATCH 0047/1261] closes bpo-41723: Fix an error in the py_compile documentation. (GH-22110) --- Doc/library/py_compile.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/py_compile.rst b/Doc/library/py_compile.rst index 9b5c8ee645a386..4fba4cba4d3568 100644 --- a/Doc/library/py_compile.rst +++ b/Doc/library/py_compile.rst @@ -35,7 +35,7 @@ byte-code cache files in the directory containing the source code. in ``.pyc``. For example, if *file* is ``/foo/bar/baz.py`` *cfile* will default to ``/foo/bar/__pycache__/baz.cpython-32.pyc`` for Python 3.2. If *dfile* is - specified, it is used as the name of the source file in error messages when + specified, it is used as the name of the source file in error messages instead of *file*. If *doraise* is true, a :exc:`PyCompileError` is raised when an error is encountered while compiling *file*. If *doraise* is false (the default), an error string is written to ``sys.stderr``, but no exception From c08f408ffcf191f7b8fedd3cad4ac7de67584822 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Sun, 6 Sep 2020 05:09:51 -0500 Subject: [PATCH 0048/1261] bpo-1635741: Port _sha1, _sha512, _md5 to multiphase init (GH-21818) Port the _sha1, _sha512, and _md5 extension modules to multi-phase initialization API (PEP 489). --- ...2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst | 2 + Modules/clinic/md5module.c.h | 21 +- Modules/clinic/sha1module.c.h | 21 +- Modules/clinic/sha512module.c.h | 21 +- Modules/md5module.c | 154 +++++++----- Modules/sha1module.c | 156 +++++++----- Modules/sha512module.c | 235 ++++++++++-------- 7 files changed, 359 insertions(+), 251 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst new file mode 100644 index 00000000000000..12af3d01ed8eff --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst @@ -0,0 +1,2 @@ +Port the :mod:`_sha1`, :mod:`_sha512`, and :mod:`_md5` extension modules +to multi-phase initialization API (:pep:`489`). diff --git a/Modules/clinic/md5module.c.h b/Modules/clinic/md5module.c.h index c109f9efec6b60..4762f2800d4b82 100644 --- a/Modules/clinic/md5module.c.h +++ b/Modules/clinic/md5module.c.h @@ -9,15 +9,26 @@ PyDoc_STRVAR(MD5Type_copy__doc__, "Return a copy of the hash object."); #define MD5TYPE_COPY_METHODDEF \ - {"copy", (PyCFunction)MD5Type_copy, METH_NOARGS, MD5Type_copy__doc__}, + {"copy", (PyCFunction)(void(*)(void))MD5Type_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, MD5Type_copy__doc__}, static PyObject * -MD5Type_copy_impl(MD5object *self); +MD5Type_copy_impl(MD5object *self, PyTypeObject *cls); static PyObject * -MD5Type_copy(MD5object *self, PyObject *Py_UNUSED(ignored)) +MD5Type_copy(MD5object *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return MD5Type_copy_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":copy", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = MD5Type_copy_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(MD5Type_digest__doc__, @@ -115,4 +126,4 @@ _md5_md5(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw exit: return return_value; } -/*[clinic end generated code: output=dbe3abc60086f3ef input=a9049054013a1b77]*/ +/*[clinic end generated code: output=53ff7f22dbaaea36 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha1module.c.h b/Modules/clinic/sha1module.c.h index fc37b1ab880ffa..3a3ab58c1233cf 100644 --- a/Modules/clinic/sha1module.c.h +++ b/Modules/clinic/sha1module.c.h @@ -9,15 +9,26 @@ PyDoc_STRVAR(SHA1Type_copy__doc__, "Return a copy of the hash object."); #define SHA1TYPE_COPY_METHODDEF \ - {"copy", (PyCFunction)SHA1Type_copy, METH_NOARGS, SHA1Type_copy__doc__}, + {"copy", (PyCFunction)(void(*)(void))SHA1Type_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, SHA1Type_copy__doc__}, static PyObject * -SHA1Type_copy_impl(SHA1object *self); +SHA1Type_copy_impl(SHA1object *self, PyTypeObject *cls); static PyObject * -SHA1Type_copy(SHA1object *self, PyObject *Py_UNUSED(ignored)) +SHA1Type_copy(SHA1object *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return SHA1Type_copy_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":copy", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = SHA1Type_copy_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(SHA1Type_digest__doc__, @@ -115,4 +126,4 @@ _sha1_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * exit: return return_value; } -/*[clinic end generated code: output=3ddd637ae17e14b3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=abf1ab2545cea5a2 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha512module.c.h b/Modules/clinic/sha512module.c.h index b8185b62bb6696..f1192d74f9a1ab 100644 --- a/Modules/clinic/sha512module.c.h +++ b/Modules/clinic/sha512module.c.h @@ -9,15 +9,26 @@ PyDoc_STRVAR(SHA512Type_copy__doc__, "Return a copy of the hash object."); #define SHA512TYPE_COPY_METHODDEF \ - {"copy", (PyCFunction)SHA512Type_copy, METH_NOARGS, SHA512Type_copy__doc__}, + {"copy", (PyCFunction)(void(*)(void))SHA512Type_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, SHA512Type_copy__doc__}, static PyObject * -SHA512Type_copy_impl(SHAobject *self); +SHA512Type_copy_impl(SHAobject *self, PyTypeObject *cls); static PyObject * -SHA512Type_copy(SHAobject *self, PyObject *Py_UNUSED(ignored)) +SHA512Type_copy(SHAobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return SHA512Type_copy_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":copy", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = SHA512Type_copy_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(SHA512Type_digest__doc__, @@ -166,4 +177,4 @@ _sha512_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje exit: return return_value; } -/*[clinic end generated code: output=bbfa72d8703c82b5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9ff9f11937fabf35 input=a9049054013a1b77]*/ diff --git a/Modules/md5module.c b/Modules/md5module.c index e4d9db40f22df3..5cd4e945101321 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -318,22 +318,32 @@ md5_done(struct md5_state *md5, unsigned char *out) * ------------------------------------------------------------------------ */ -static PyTypeObject MD5type; +typedef struct { + PyTypeObject* md5_type; +} MD5State; +static inline MD5State* +md5_get_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (MD5State *)state; +} static MD5object * -newMD5object(void) +newMD5object(MD5State * st) { - return (MD5object *)PyObject_New(MD5object, &MD5type); + return (MD5object *)PyObject_New(MD5object, st->md5_type); } - /* Internal methods for a hash object */ static void MD5_dealloc(PyObject *ptr) { + PyTypeObject *tp = Py_TYPE(ptr); PyObject_Del(ptr); + Py_DECREF(tp); } @@ -342,16 +352,19 @@ MD5_dealloc(PyObject *ptr) /*[clinic input] MD5Type.copy + cls: defining_class + Return a copy of the hash object. [clinic start generated code]*/ static PyObject * -MD5Type_copy_impl(MD5object *self) -/*[clinic end generated code: output=596eb36852f02071 input=2c09e6d2493f3079]*/ +MD5Type_copy_impl(MD5object *self, PyTypeObject *cls) +/*[clinic end generated code: output=bf055e08244bf5ee input=d89087dcfb2a8620]*/ { - MD5object *newobj; + MD5State *st = PyType_GetModuleState(cls); - if ((newobj = newMD5object())==NULL) + MD5object *newobj; + if ((newobj = newMD5object(st))==NULL) return NULL; newobj->hash_state = self->hash_state; @@ -445,7 +458,6 @@ md5_get_digest_size(PyObject *self, void *closure) return PyLong_FromLong(MD5_DIGESTSIZE); } - static PyGetSetDef MD5_getseters[] = { {"block_size", (getter)MD5_get_block_size, NULL, @@ -462,40 +474,19 @@ static PyGetSetDef MD5_getseters[] = { {NULL} /* Sentinel */ }; -static PyTypeObject MD5type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_md5.md5", /*tp_name*/ - sizeof(MD5object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - MD5_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - MD5_methods, /* tp_methods */ - NULL, /* tp_members */ - MD5_getseters, /* tp_getset */ +static PyType_Slot md5_type_slots[] = { + {Py_tp_dealloc, MD5_dealloc}, + {Py_tp_methods, MD5_methods}, + {Py_tp_getset, MD5_getseters}, + {0,0} }; +static PyType_Spec md5_type_spec = { + .name = "_md5.md5", + .basicsize = sizeof(MD5object), + .flags = Py_TPFLAGS_DEFAULT, + .slots = md5_type_slots +}; /* The single module-level function: new() */ @@ -519,7 +510,8 @@ _md5_md5_impl(PyObject *module, PyObject *string, int usedforsecurity) if (string) GET_BUFFER_VIEW_OR_ERROUT(string, &buf); - if ((new = newMD5object()) == NULL) { + MD5State *st = md5_get_state(module); + if ((new = newMD5object(st)) == NULL) { if (string) PyBuffer_Release(&buf); return NULL; @@ -549,37 +541,69 @@ static struct PyMethodDef MD5_functions[] = { {NULL, NULL} /* Sentinel */ }; +static int +_md5_traverse(PyObject *module, visitproc visit, void *arg) +{ + MD5State *state = md5_get_state(module); + Py_VISIT(state->md5_type); + return 0; +} + +static int +_md5_clear(PyObject *module) +{ + MD5State *state = md5_get_state(module); + Py_CLEAR(state->md5_type); + return 0; +} + +static void +_md5_free(void *module) +{ + _md5_clear((PyObject *)module); +} /* Initialize this module. */ +static int +md5_exec(PyObject *m) +{ + MD5State *st = md5_get_state(m); + + st->md5_type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &md5_type_spec, NULL); + + if (st->md5_type == NULL) { + return -1; + } + + Py_INCREF((PyObject *)st->md5_type); + if (PyModule_AddObject(m, "MD5Type", (PyObject *)st->md5_type) < 0) { + Py_DECREF(st->md5_type); + return -1; + } + + return 0; +} + +static PyModuleDef_Slot _md5_slots[] = { + {Py_mod_exec, md5_exec}, + {0, NULL} +}; + static struct PyModuleDef _md5module = { PyModuleDef_HEAD_INIT, - "_md5", - NULL, - -1, - MD5_functions, - NULL, - NULL, - NULL, - NULL + .m_name = "_md5", + .m_size = sizeof(MD5State), + .m_methods = MD5_functions, + .m_slots = _md5_slots, + .m_traverse = _md5_traverse, + .m_clear = _md5_clear, + .m_free = _md5_free, }; PyMODINIT_FUNC PyInit__md5(void) { - PyObject *m; - - Py_SET_TYPE(&MD5type, &PyType_Type); - if (PyType_Ready(&MD5type) < 0) { - return NULL; - } - - m = PyModule_Create(&_md5module); - if (m == NULL) { - return NULL; - } - - Py_INCREF((PyObject *)&MD5type); - PyModule_AddObject(m, "MD5Type", (PyObject *)&MD5type); - return m; + return PyModuleDef_Init(&_md5module); } diff --git a/Modules/sha1module.c b/Modules/sha1module.c index b0656d83b3ae8b..c22437de256b66 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -295,13 +295,22 @@ sha1_done(struct sha1_state *sha1, unsigned char *out) * ------------------------------------------------------------------------ */ -static PyTypeObject SHA1type; +typedef struct { + PyTypeObject* sha1_type; +} SHA1State; +static inline SHA1State* +sha1_get_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (SHA1State *)state; +} static SHA1object * -newSHA1object(void) +newSHA1object(SHA1State *st) { - return (SHA1object *)PyObject_New(SHA1object, &SHA1type); + return (SHA1object *)PyObject_New(SHA1object, st->sha1_type); } @@ -310,7 +319,9 @@ newSHA1object(void) static void SHA1_dealloc(PyObject *ptr) { + PyTypeObject *tp = Py_TYPE(ptr); PyObject_Del(ptr); + Py_DECREF(tp); } @@ -319,16 +330,19 @@ SHA1_dealloc(PyObject *ptr) /*[clinic input] SHA1Type.copy + cls: defining_class + Return a copy of the hash object. [clinic start generated code]*/ static PyObject * -SHA1Type_copy_impl(SHA1object *self) -/*[clinic end generated code: output=b4e001264620f02a input=b7eae10df6f89b36]*/ +SHA1Type_copy_impl(SHA1object *self, PyTypeObject *cls) +/*[clinic end generated code: output=b32d4461ce8bc7a7 input=6c22e66fcc34c58e]*/ { - SHA1object *newobj; + SHA1State *st = PyType_GetModuleState(cls); - if ((newobj = newSHA1object()) == NULL) + SHA1object *newobj; + if ((newobj = newSHA1object(st)) == NULL) return NULL; newobj->hash_state = self->hash_state; @@ -422,7 +436,6 @@ sha1_get_digest_size(PyObject *self, void *closure) return PyLong_FromLong(SHA1_DIGESTSIZE); } - static PyGetSetDef SHA1_getseters[] = { {"block_size", (getter)SHA1_get_block_size, NULL, @@ -439,40 +452,19 @@ static PyGetSetDef SHA1_getseters[] = { {NULL} /* Sentinel */ }; -static PyTypeObject SHA1type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha1.sha1", /*tp_name*/ - sizeof(SHA1object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA1_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - SHA1_methods, /* tp_methods */ - NULL, /* tp_members */ - SHA1_getseters, /* tp_getset */ +static PyType_Slot sha1_type_slots[] = { + {Py_tp_dealloc, SHA1_dealloc}, + {Py_tp_methods, SHA1_methods}, + {Py_tp_getset, SHA1_getseters}, + {0,0} }; +static PyType_Spec sha1_type_spec = { + .name = "_sha1.sha1", + .basicsize = sizeof(SHA1object), + .flags = Py_TPFLAGS_DEFAULT, + .slots = sha1_type_slots +}; /* The single module-level function: new() */ @@ -496,7 +488,8 @@ _sha1_sha1_impl(PyObject *module, PyObject *string, int usedforsecurity) if (string) GET_BUFFER_VIEW_OR_ERROUT(string, &buf); - if ((new = newSHA1object()) == NULL) { + SHA1State *st = sha1_get_state(module); + if ((new = newSHA1object(st)) == NULL) { if (string) PyBuffer_Release(&buf); return NULL; @@ -526,37 +519,72 @@ static struct PyMethodDef SHA1_functions[] = { {NULL, NULL} /* Sentinel */ }; +static int +_sha1_traverse(PyObject *module, visitproc visit, void *arg) +{ + SHA1State *state = sha1_get_state(module); + Py_VISIT(state->sha1_type); + return 0; +} + +static int +_sha1_clear(PyObject *module) +{ + SHA1State *state = sha1_get_state(module); + Py_CLEAR(state->sha1_type); + return 0; +} + +static void +_sha1_free(void *module) +{ + _sha1_clear((PyObject *)module); +} + +static int +_sha1_exec(PyObject *module) +{ + SHA1State* st = sha1_get_state(module); + + st->sha1_type = (PyTypeObject *)PyType_FromModuleAndSpec( + module, &sha1_type_spec, NULL); + + if (st->sha1_type == NULL) { + return -1; + } + + Py_INCREF(st->sha1_type); + if (PyModule_AddObject(module, + "SHA1Type", + (PyObject *)st->sha1_type) < 0) { + Py_DECREF(st->sha1_type); + return -1; + } + + return 0; +} + /* Initialize this module. */ +static PyModuleDef_Slot _sha1_slots[] = { + {Py_mod_exec, _sha1_exec}, + {0, NULL} +}; + static struct PyModuleDef _sha1module = { PyModuleDef_HEAD_INIT, - "_sha1", - NULL, - -1, - SHA1_functions, - NULL, - NULL, - NULL, - NULL + .m_name = "_sha1", + .m_size = sizeof(SHA1State), + .m_methods = SHA1_functions, + .m_slots = _sha1_slots, + .m_traverse = _sha1_traverse, + .m_clear = _sha1_clear, + .m_free = _sha1_free }; PyMODINIT_FUNC PyInit__sha1(void) { - PyObject *m; - - Py_SET_TYPE(&SHA1type, &PyType_Type); - if (PyType_Ready(&SHA1type) < 0) { - return NULL; - } - - m = PyModule_Create(&_sha1module); - if (m == NULL) { - return NULL; - } - - Py_INCREF((PyObject *)&SHA1type); - PyModule_AddObject(m, "SHA1Type", (PyObject *)&SHA1type); - return m; + return PyModuleDef_Init(&_sha1module); } diff --git a/Modules/sha512module.c b/Modules/sha512module.c index aa2aeedcc6c649..725098def4d062 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -422,20 +422,29 @@ sha512_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info) * ------------------------------------------------------------------------ */ -static PyTypeObject SHA384type; -static PyTypeObject SHA512type; +typedef struct { + PyTypeObject* sha384_type; + PyTypeObject* sha512_type; +} SHA512State; +static inline SHA512State* +sha512_get_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (SHA512State *)state; +} static SHAobject * -newSHA384object(void) +newSHA384object(SHA512State *st) { - return (SHAobject *)PyObject_New(SHAobject, &SHA384type); + return (SHAobject *)PyObject_New(SHAobject, st->sha384_type); } static SHAobject * -newSHA512object(void) +newSHA512object(SHA512State *st) { - return (SHAobject *)PyObject_New(SHAobject, &SHA512type); + return (SHAobject *)PyObject_New(SHAobject, st->sha512_type); } /* Internal methods for a hash object */ @@ -443,7 +452,9 @@ newSHA512object(void) static void SHA512_dealloc(PyObject *ptr) { + PyTypeObject *tp = Py_TYPE(ptr); PyObject_Del(ptr); + Py_DECREF(tp); } @@ -452,21 +463,27 @@ SHA512_dealloc(PyObject *ptr) /*[clinic input] SHA512Type.copy + cls: defining_class + Return a copy of the hash object. [clinic start generated code]*/ static PyObject * -SHA512Type_copy_impl(SHAobject *self) -/*[clinic end generated code: output=adea896ed3164821 input=9f5f31e6c457776a]*/ +SHA512Type_copy_impl(SHAobject *self, PyTypeObject *cls) +/*[clinic end generated code: output=85ea5b47837a08e6 input=f673a18f66527c90]*/ { SHAobject *newobj; + SHA512State *st = PyType_GetModuleState(cls); - if (Py_IS_TYPE((PyObject*)self, &SHA512type)) { - if ( (newobj = newSHA512object())==NULL) + if (Py_IS_TYPE((PyObject*)self, st->sha512_type)) { + if ( (newobj = newSHA512object(st))==NULL) { return NULL; - } else { - if ( (newobj = newSHA384object())==NULL) + } + } + else { + if ( (newobj = newSHA384object(st))==NULL) { return NULL; + } } SHAcopy(self, newobj); @@ -574,74 +591,37 @@ static PyMemberDef SHA_members[] = { {NULL} /* Sentinel */ }; -static PyTypeObject SHA384type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha512.sha384", /*tp_name*/ - sizeof(SHAobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA512_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - SHA_methods, /* tp_methods */ - SHA_members, /* tp_members */ - SHA_getseters, /* tp_getset */ +static PyType_Slot sha512_sha384_type_slots[] = { + {Py_tp_dealloc, SHA512_dealloc}, + {Py_tp_methods, SHA_methods}, + {Py_tp_members, SHA_members}, + {Py_tp_getset, SHA_getseters}, + {0,0} +}; + +static PyType_Spec sha512_sha384_type_spec = { + .name = "_sha512.sha384", + .basicsize = sizeof(SHAobject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = sha512_sha384_type_slots }; -static PyTypeObject SHA512type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha512.sha512", /*tp_name*/ - sizeof(SHAobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA512_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - SHA_methods, /* tp_methods */ - SHA_members, /* tp_members */ - SHA_getseters, /* tp_getset */ +static PyType_Slot sha512_sha512_type_slots[] = { + {Py_tp_dealloc, SHA512_dealloc}, + {Py_tp_methods, SHA_methods}, + {Py_tp_members, SHA_members}, + {Py_tp_getset, SHA_getseters}, + {0,0} }; +// Using PyType_GetModuleState() on this type is safe since +// it cannot be subclassed: it does not have the Py_TPFLAGS_BASETYPE flag. +static PyType_Spec sha512_sha512_type_spec = { + .name = "_sha512.sha512", + .basicsize = sizeof(SHAobject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = sha512_sha512_type_slots +}; /* The single module-level function: new() */ @@ -662,10 +642,12 @@ _sha512_sha512_impl(PyObject *module, PyObject *string, int usedforsecurity) SHAobject *new; Py_buffer buf; + SHA512State *st = sha512_get_state(module); + if (string) GET_BUFFER_VIEW_OR_ERROUT(string, &buf); - if ((new = newSHA512object()) == NULL) { + if ((new = newSHA512object(st)) == NULL) { if (string) PyBuffer_Release(&buf); return NULL; @@ -704,10 +686,12 @@ _sha512_sha384_impl(PyObject *module, PyObject *string, int usedforsecurity) SHAobject *new; Py_buffer buf; + SHA512State *st = sha512_get_state(module); + if (string) GET_BUFFER_VIEW_OR_ERROUT(string, &buf); - if ((new = newSHA384object()) == NULL) { + if ((new = newSHA384object(st)) == NULL) { if (string) PyBuffer_Release(&buf); return NULL; @@ -738,43 +722,80 @@ static struct PyMethodDef SHA_functions[] = { {NULL, NULL} /* Sentinel */ }; +static int +_sha512_traverse(PyObject *module, visitproc visit, void *arg) +{ + SHA512State *state = sha512_get_state(module); + Py_VISIT(state->sha384_type); + Py_VISIT(state->sha512_type); + return 0; +} -/* Initialize this module. */ +static int +_sha512_clear(PyObject *module) +{ + SHA512State *state = sha512_get_state(module); + Py_CLEAR(state->sha384_type); + Py_CLEAR(state->sha512_type); + return 0; +} -static struct PyModuleDef _sha512module = { - PyModuleDef_HEAD_INIT, - "_sha512", - NULL, - -1, - SHA_functions, - NULL, - NULL, - NULL, - NULL -}; +static void +_sha512_free(void *module) +{ + _sha512_clear((PyObject *)module); +} -PyMODINIT_FUNC -PyInit__sha512(void) + +/* Initialize this module. */ +static int +_sha512_exec(PyObject *m) { - PyObject *m; + SHA512State* st = sha512_get_state(m); - Py_SET_TYPE(&SHA384type, &PyType_Type); - if (PyType_Ready(&SHA384type) < 0) { - return NULL; + st->sha384_type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &sha512_sha384_type_spec, NULL); + + st->sha512_type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &sha512_sha512_type_spec, NULL); + + if (st->sha384_type == NULL || st->sha512_type == NULL) { + return -1; } - Py_SET_TYPE(&SHA512type, &PyType_Type); - if (PyType_Ready(&SHA512type) < 0) { - return NULL; + + Py_INCREF(st->sha384_type); + if (PyModule_AddObject(m, "SHA384Type", (PyObject *)st->sha384_type) < 0) { + Py_DECREF(st->sha384_type); + return -1; } - m = PyModule_Create(&_sha512module); - if (m == NULL) { - return NULL; + Py_INCREF(st->sha512_type); + if (PyModule_AddObject(m, "SHA384Type", (PyObject *)st->sha512_type) < 0) { + Py_DECREF(st->sha512_type); + return -1; } - Py_INCREF((PyObject *)&SHA384type); - PyModule_AddObject(m, "SHA384Type", (PyObject *)&SHA384type); - Py_INCREF((PyObject *)&SHA512type); - PyModule_AddObject(m, "SHA512Type", (PyObject *)&SHA512type); - return m; + return 0; +} + +static PyModuleDef_Slot _sha512_slots[] = { + {Py_mod_exec, _sha512_exec}, + {0, NULL} +}; + +static struct PyModuleDef _sha512module = { + PyModuleDef_HEAD_INIT, + .m_name = "_sha512", + .m_size = sizeof(SHA512State), + .m_methods = SHA_functions, + .m_slots = _sha512_slots, + .m_traverse = _sha512_traverse, + .m_clear = _sha512_clear, + .m_free = _sha512_free +}; + +PyMODINIT_FUNC +PyInit__sha512(void) +{ + return PyModuleDef_Init(&_sha512module); } From ed38c2cc6ab445a3d98584d5b12198089dcbde6e Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 6 Sep 2020 15:10:07 -0700 Subject: [PATCH 0049/1261] bpo-41513: Expand comments and add references for a better understanding (GH-22123) --- Modules/mathmodule.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index d227a5d15dca2a..29137ae91a22ff 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2419,9 +2419,9 @@ To avoid overflow/underflow and to achieve high accuracy giving results that are almost always correctly rounded, four techniques are used: * lossless scaling using a power-of-two scaling factor -* accurate squaring using Veltkamp-Dekker splitting -* compensated summation using a variant of the Neumaier algorithm -* differential correction of the square root +* accurate squaring using Veltkamp-Dekker splitting [1] +* compensated summation using a variant of the Neumaier algorithm [2] +* differential correction of the square root [3] The usual presentation of the Neumaier summation algorithm has an expensive branch depending on which operand has the larger @@ -2456,7 +2456,11 @@ Given that csum >= 1.0, we have: Since lo**2 is less than 1/2 ulp(csum), we have csum+lo*lo == csum. To minimize loss of information during the accumulation of fractional -values, each term has a separate accumulator. +values, each term has a separate accumulator. This also breaks up +sequential dependencies in the inner loop so the CPU can maximize +floating point throughput. [5] On a 2.6 GHz Haswell, adding one +dimension has an incremental cost of only 5ns -- for example when +moving from hypot(x,y) to hypot(x,y,z). The square root differential correction is needed because a correctly rounded square root of a correctly rounded sum of @@ -2466,7 +2470,7 @@ The differential correction starts with a value *x* that is the difference between the square of *h*, the possibly inaccurately rounded square root, and the accurately computed sum of squares. The correction is the first order term of the Maclaurin series -expansion of sqrt(h**2 + x) == h + x/(2*h) + O(x**2). +expansion of sqrt(h**2 + x) == h + x/(2*h) + O(x**2). [4] Essentially, this differential correction is equivalent to one refinement step in Newton's divide-and-average square root @@ -2474,12 +2478,24 @@ algorithm, effectively doubling the number of accurate bits. This technique is used in Dekker's SQRT2 algorithm and again in Borges' ALGORITHM 4 and 5. +Without proof for all cases, hypot() cannot claim to be always +correctly rounded. However for n <= 1000, prior to the final addition +that rounds the overall result, the internal accuracy of "h" together +with its correction of "x / (2.0 * h)" is at least 100 bits. [6] +Also, hypot() was tested against a Decimal implementation with +prec=300. After 100 million trials, no incorrectly rounded examples +were found. In addition, perfect commutativity (all permutations are +exactly equal) was verified for 1 billion random inputs with n=5. [7] + References: 1. Veltkamp-Dekker splitting: http://csclub.uwaterloo.ca/~pbarfuss/dekker1971.pdf 2. Compensated summation: http://www.ti3.tu-harburg.de/paper/rump/Ru08b.pdf 3. Square root differential correction: https://arxiv.org/pdf/1904.09481.pdf 4. https://www.wolframalpha.com/input/?i=Maclaurin+series+sqrt%28h**2+%2B+x%29+at+x%3D0 +5. https://bugs.python.org/file49439/hypot.png +6. https://bugs.python.org/file49435/best_frac.py +7. https://bugs.python.org/file49448/test_hypot_commutativity.py */ From 0947257740a25ee0747d3827aac367bbd27d5ac0 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Mon, 7 Sep 2020 02:29:38 -0300 Subject: [PATCH 0050/1261] [doc] Add link to Generic in typing (GH-22125) --- Doc/library/typing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 6d6b76c1d08956..3125ae97808a9e 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -818,7 +818,7 @@ These are not used in annotations. They are building blocks for creating generic Type variables exist primarily for the benefit of static type checkers. They serve as the parameters for generic types as well - as for generic function definitions. See class Generic for more + as for generic function definitions. See :class:`Generic` for more information on generic types. Generic functions work as follows:: def repeat(x: T, n: int) -> Sequence[T]: From b747b95dea7c28cbd78102a4377efb7e4d066528 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Mon, 7 Sep 2020 03:27:55 -0500 Subject: [PATCH 0051/1261] bpo-1635741 port zlib module to multi-phase init (GH-21995) Port the zlib extension module to multi-phase initialization (PEP 489). --- ...2020-08-28-20-54-04.bpo-1635741.7ijlcI.rst | 1 + Modules/clinic/zlibmodule.c.h | 236 ++++++----- Modules/zlibmodule.c | 378 ++++++++++-------- 3 files changed, 363 insertions(+), 252 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-28-20-54-04.bpo-1635741.7ijlcI.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-28-20-54-04.bpo-1635741.7ijlcI.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-28-20-54-04.bpo-1635741.7ijlcI.rst new file mode 100644 index 00000000000000..4d6ce1185ed936 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-28-20-54-04.bpo-1635741.7ijlcI.rst @@ -0,0 +1 @@ +Port the :mod:`zlib` extension module to multi-phase initialization (:pep:`489`). diff --git a/Modules/clinic/zlibmodule.c.h b/Modules/clinic/zlibmodule.c.h index 61dfa9a87b5fb6..14e955db64e729 100644 --- a/Modules/clinic/zlibmodule.c.h +++ b/Modules/clinic/zlibmodule.c.h @@ -329,25 +329,25 @@ PyDoc_STRVAR(zlib_Compress_compress__doc__, "Call the flush() method to clear these buffers."); #define ZLIB_COMPRESS_COMPRESS_METHODDEF \ - {"compress", (PyCFunction)zlib_Compress_compress, METH_O, zlib_Compress_compress__doc__}, + {"compress", (PyCFunction)(void(*)(void))zlib_Compress_compress, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress_compress__doc__}, static PyObject * -zlib_Compress_compress_impl(compobject *self, Py_buffer *data); +zlib_Compress_compress_impl(compobject *self, PyTypeObject *cls, + Py_buffer *data); static PyObject * -zlib_Compress_compress(compobject *self, PyObject *arg) +zlib_Compress_compress(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = {"y*:compress", _keywords, 0}; Py_buffer data = {NULL, NULL}; - if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &data)) { goto exit; } - if (!PyBuffer_IsContiguous(&data, 'C')) { - _PyArg_BadArgument("compress", "argument", "contiguous buffer", arg); - goto exit; - } - return_value = zlib_Compress_compress_impl(self, &data); + return_value = zlib_Compress_compress_impl(self, cls, &data); exit: /* Cleanup for data */ @@ -376,51 +376,26 @@ PyDoc_STRVAR(zlib_Decompress_decompress__doc__, "Call the flush() method to clear these buffers."); #define ZLIB_DECOMPRESS_DECOMPRESS_METHODDEF \ - {"decompress", (PyCFunction)(void(*)(void))zlib_Decompress_decompress, METH_FASTCALL|METH_KEYWORDS, zlib_Decompress_decompress__doc__}, + {"decompress", (PyCFunction)(void(*)(void))zlib_Decompress_decompress, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress_decompress__doc__}, static PyObject * -zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data, - Py_ssize_t max_length); +zlib_Decompress_decompress_impl(compobject *self, PyTypeObject *cls, + Py_buffer *data, Py_ssize_t max_length); static PyObject * -zlib_Decompress_decompress(compobject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +zlib_Decompress_decompress(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "max_length", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "decompress", 0}; - PyObject *argsbuf[2]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + static _PyArg_Parser _parser = {"y*|n:decompress", _keywords, 0}; Py_buffer data = {NULL, NULL}; Py_ssize_t max_length = 0; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); - if (!args) { - goto exit; - } - if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { - goto exit; - } - if (!PyBuffer_IsContiguous(&data, 'C')) { - _PyArg_BadArgument("decompress", "argument 1", "contiguous buffer", args[0]); + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &data, &max_length)) { goto exit; } - if (!noptargs) { - goto skip_optional_pos; - } - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[1]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - max_length = ival; - } -skip_optional_pos: - return_value = zlib_Decompress_decompress_impl(self, &data, max_length); + return_value = zlib_Decompress_decompress_impl(self, cls, &data, max_length); exit: /* Cleanup for data */ @@ -444,29 +419,24 @@ PyDoc_STRVAR(zlib_Compress_flush__doc__, " can still be compressed."); #define ZLIB_COMPRESS_FLUSH_METHODDEF \ - {"flush", (PyCFunction)(void(*)(void))zlib_Compress_flush, METH_FASTCALL, zlib_Compress_flush__doc__}, + {"flush", (PyCFunction)(void(*)(void))zlib_Compress_flush, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress_flush__doc__}, static PyObject * -zlib_Compress_flush_impl(compobject *self, int mode); +zlib_Compress_flush_impl(compobject *self, PyTypeObject *cls, int mode); static PyObject * -zlib_Compress_flush(compobject *self, PyObject *const *args, Py_ssize_t nargs) +zlib_Compress_flush(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = {"|i:flush", _keywords, 0}; int mode = Z_FINISH; - if (!_PyArg_CheckPositional("flush", nargs, 0, 1)) { - goto exit; - } - if (nargs < 1) { - goto skip_optional; - } - mode = _PyLong_AsInt(args[0]); - if (mode == -1 && PyErr_Occurred()) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &mode)) { goto exit; } -skip_optional: - return_value = zlib_Compress_flush_impl(self, mode); + return_value = zlib_Compress_flush_impl(self, cls, mode); exit: return return_value; @@ -481,15 +451,26 @@ PyDoc_STRVAR(zlib_Compress_copy__doc__, "Return a copy of the compression object."); #define ZLIB_COMPRESS_COPY_METHODDEF \ - {"copy", (PyCFunction)zlib_Compress_copy, METH_NOARGS, zlib_Compress_copy__doc__}, + {"copy", (PyCFunction)(void(*)(void))zlib_Compress_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress_copy__doc__}, static PyObject * -zlib_Compress_copy_impl(compobject *self); +zlib_Compress_copy_impl(compobject *self, PyTypeObject *cls); static PyObject * -zlib_Compress_copy(compobject *self, PyObject *Py_UNUSED(ignored)) +zlib_Compress_copy(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return zlib_Compress_copy_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":copy", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = zlib_Compress_copy_impl(self, cls); + +exit: + return return_value; } #endif /* defined(HAVE_ZLIB_COPY) */ @@ -502,15 +483,26 @@ PyDoc_STRVAR(zlib_Compress___copy____doc__, "\n"); #define ZLIB_COMPRESS___COPY___METHODDEF \ - {"__copy__", (PyCFunction)zlib_Compress___copy__, METH_NOARGS, zlib_Compress___copy____doc__}, + {"__copy__", (PyCFunction)(void(*)(void))zlib_Compress___copy__, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress___copy____doc__}, static PyObject * -zlib_Compress___copy___impl(compobject *self); +zlib_Compress___copy___impl(compobject *self, PyTypeObject *cls); static PyObject * -zlib_Compress___copy__(compobject *self, PyObject *Py_UNUSED(ignored)) +zlib_Compress___copy__(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return zlib_Compress___copy___impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":__copy__", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = zlib_Compress___copy___impl(self, cls); + +exit: + return return_value; } #endif /* defined(HAVE_ZLIB_COPY) */ @@ -523,7 +515,29 @@ PyDoc_STRVAR(zlib_Compress___deepcopy____doc__, "\n"); #define ZLIB_COMPRESS___DEEPCOPY___METHODDEF \ - {"__deepcopy__", (PyCFunction)zlib_Compress___deepcopy__, METH_O, zlib_Compress___deepcopy____doc__}, + {"__deepcopy__", (PyCFunction)(void(*)(void))zlib_Compress___deepcopy__, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress___deepcopy____doc__}, + +static PyObject * +zlib_Compress___deepcopy___impl(compobject *self, PyTypeObject *cls, + PyObject *memo); + +static PyObject * +zlib_Compress___deepcopy__(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = {"O:__deepcopy__", _keywords, 0}; + PyObject *memo; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &memo)) { + goto exit; + } + return_value = zlib_Compress___deepcopy___impl(self, cls, memo); + +exit: + return return_value; +} #endif /* defined(HAVE_ZLIB_COPY) */ @@ -536,15 +550,26 @@ PyDoc_STRVAR(zlib_Decompress_copy__doc__, "Return a copy of the decompression object."); #define ZLIB_DECOMPRESS_COPY_METHODDEF \ - {"copy", (PyCFunction)zlib_Decompress_copy, METH_NOARGS, zlib_Decompress_copy__doc__}, + {"copy", (PyCFunction)(void(*)(void))zlib_Decompress_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress_copy__doc__}, static PyObject * -zlib_Decompress_copy_impl(compobject *self); +zlib_Decompress_copy_impl(compobject *self, PyTypeObject *cls); static PyObject * -zlib_Decompress_copy(compobject *self, PyObject *Py_UNUSED(ignored)) +zlib_Decompress_copy(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return zlib_Decompress_copy_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":copy", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = zlib_Decompress_copy_impl(self, cls); + +exit: + return return_value; } #endif /* defined(HAVE_ZLIB_COPY) */ @@ -557,15 +582,26 @@ PyDoc_STRVAR(zlib_Decompress___copy____doc__, "\n"); #define ZLIB_DECOMPRESS___COPY___METHODDEF \ - {"__copy__", (PyCFunction)zlib_Decompress___copy__, METH_NOARGS, zlib_Decompress___copy____doc__}, + {"__copy__", (PyCFunction)(void(*)(void))zlib_Decompress___copy__, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress___copy____doc__}, static PyObject * -zlib_Decompress___copy___impl(compobject *self); +zlib_Decompress___copy___impl(compobject *self, PyTypeObject *cls); static PyObject * -zlib_Decompress___copy__(compobject *self, PyObject *Py_UNUSED(ignored)) +zlib_Decompress___copy__(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return zlib_Decompress___copy___impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":__copy__", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = zlib_Decompress___copy___impl(self, cls); + +exit: + return return_value; } #endif /* defined(HAVE_ZLIB_COPY) */ @@ -578,7 +614,29 @@ PyDoc_STRVAR(zlib_Decompress___deepcopy____doc__, "\n"); #define ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF \ - {"__deepcopy__", (PyCFunction)zlib_Decompress___deepcopy__, METH_O, zlib_Decompress___deepcopy____doc__}, + {"__deepcopy__", (PyCFunction)(void(*)(void))zlib_Decompress___deepcopy__, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress___deepcopy____doc__}, + +static PyObject * +zlib_Decompress___deepcopy___impl(compobject *self, PyTypeObject *cls, + PyObject *memo); + +static PyObject * +zlib_Decompress___deepcopy__(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = {"O:__deepcopy__", _keywords, 0}; + PyObject *memo; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &memo)) { + goto exit; + } + return_value = zlib_Decompress___deepcopy___impl(self, cls, memo); + +exit: + return return_value; +} #endif /* defined(HAVE_ZLIB_COPY) */ @@ -592,37 +650,25 @@ PyDoc_STRVAR(zlib_Decompress_flush__doc__, " the initial size of the output buffer."); #define ZLIB_DECOMPRESS_FLUSH_METHODDEF \ - {"flush", (PyCFunction)(void(*)(void))zlib_Decompress_flush, METH_FASTCALL, zlib_Decompress_flush__doc__}, + {"flush", (PyCFunction)(void(*)(void))zlib_Decompress_flush, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress_flush__doc__}, static PyObject * -zlib_Decompress_flush_impl(compobject *self, Py_ssize_t length); +zlib_Decompress_flush_impl(compobject *self, PyTypeObject *cls, + Py_ssize_t length); static PyObject * -zlib_Decompress_flush(compobject *self, PyObject *const *args, Py_ssize_t nargs) +zlib_Decompress_flush(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = {"|n:flush", _keywords, 0}; Py_ssize_t length = DEF_BUF_SIZE; - if (!_PyArg_CheckPositional("flush", nargs, 0, 1)) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &length)) { goto exit; } - if (nargs < 1) { - goto skip_optional; - } - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[0]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - length = ival; - } -skip_optional: - return_value = zlib_Decompress_flush_impl(self, length); + return_value = zlib_Decompress_flush_impl(self, cls, length); exit: return return_value; @@ -757,4 +803,4 @@ zlib_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs) #ifndef ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF #define ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF #endif /* !defined(ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF) */ -/*[clinic end generated code: output=be34f273564e39a8 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6736bae59fab268b input=a9049054013a1b77]*/ diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index fd3064952869bf..def617671f18fd 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -37,18 +37,16 @@ typedef struct { PyTypeObject *Comptype; PyTypeObject *Decomptype; PyObject *ZlibError; -} _zlibstate; +} zlibstate; -static inline _zlibstate* +static inline zlibstate* get_zlib_state(PyObject *module) { void *state = PyModule_GetState(module); assert(state != NULL); - return (_zlibstate *)state; + return (zlibstate *)state; } -#define _zlibstate_global ((_zlibstate *)PyModule_GetState(PyState_FindModule(&zlibmodule))) - typedef struct { PyObject_HEAD @@ -62,7 +60,7 @@ typedef struct } compobject; static void -zlib_error(z_stream zst, int err, const char *msg) +zlib_error(zlibstate *state, z_stream zst, int err, const char *msg) { const char *zmsg = Z_NULL; /* In case of a version mismatch, zst.msg won't be initialized. @@ -85,9 +83,9 @@ zlib_error(z_stream zst, int err, const char *msg) } } if (zmsg == Z_NULL) - PyErr_Format(_zlibstate_global->ZlibError, "Error %d %s", err, msg); + PyErr_Format(state->ZlibError, "Error %d %s", err, msg); else - PyErr_Format(_zlibstate_global->ZlibError, "Error %d %s: %.200s", err, msg, zmsg); + PyErr_Format(state->ZlibError, "Error %d %s: %.200s", err, msg, zmsg); } /*[clinic input] @@ -216,19 +214,20 @@ zlib_compress_impl(PyObject *module, Py_buffer *data, int level) /*[clinic end generated code: output=d80906d73f6294c8 input=638d54b6315dbed3]*/ { PyObject *RetVal = NULL; - Byte *ibuf; - Py_ssize_t ibuflen, obuflen = DEF_BUF_SIZE; - int err, flush; + Py_ssize_t obuflen = DEF_BUF_SIZE; + int flush; z_stream zst; - ibuf = data->buf; - ibuflen = data->len; + zlibstate *state = get_zlib_state(module); + + Byte *ibuf = data->buf; + Py_ssize_t ibuflen = data->len; zst.opaque = NULL; zst.zalloc = PyZlib_Malloc; zst.zfree = PyZlib_Free; zst.next_in = ibuf; - err = deflateInit(&zst, level); + int err = deflateInit(&zst, level); switch (err) { case Z_OK: @@ -238,11 +237,11 @@ zlib_compress_impl(PyObject *module, Py_buffer *data, int level) "Out of memory while compressing data"); goto error; case Z_STREAM_ERROR: - PyErr_SetString(_zlibstate_global->ZlibError, "Bad compression level"); + PyErr_SetString(state->ZlibError, "Bad compression level"); goto error; default: deflateEnd(&zst); - zlib_error(zst, err, "while compressing data"); + zlib_error(state, zst, err, "while compressing data"); goto error; } @@ -263,7 +262,7 @@ zlib_compress_impl(PyObject *module, Py_buffer *data, int level) if (err == Z_STREAM_ERROR) { deflateEnd(&zst); - zlib_error(zst, err, "while compressing data"); + zlib_error(state, zst, err, "while compressing data"); goto error; } @@ -281,7 +280,7 @@ zlib_compress_impl(PyObject *module, Py_buffer *data, int level) return RetVal; } else - zlib_error(zst, err, "while finishing compression"); + zlib_error(state, zst, err, "while finishing compression"); error: Py_XDECREF(RetVal); return NULL; @@ -312,6 +311,8 @@ zlib_decompress_impl(PyObject *module, Py_buffer *data, int wbits, int err, flush; z_stream zst; + zlibstate *state = get_zlib_state(module); + if (bufsize < 0) { PyErr_SetString(PyExc_ValueError, "bufsize must be non-negative"); return NULL; @@ -338,7 +339,7 @@ zlib_decompress_impl(PyObject *module, Py_buffer *data, int wbits, goto error; default: inflateEnd(&zst); - zlib_error(zst, err, "while preparing to decompress data"); + zlib_error(state, zst, err, "while preparing to decompress data"); goto error; } @@ -369,7 +370,7 @@ zlib_decompress_impl(PyObject *module, Py_buffer *data, int wbits, goto error; default: inflateEnd(&zst); - zlib_error(zst, err, "while decompressing data"); + zlib_error(state, zst, err, "while decompressing data"); goto error; } @@ -380,13 +381,13 @@ zlib_decompress_impl(PyObject *module, Py_buffer *data, int wbits, if (err != Z_STREAM_END) { inflateEnd(&zst); - zlib_error(zst, err, "while decompressing data"); + zlib_error(state, zst, err, "while decompressing data"); goto error; } err = inflateEnd(&zst); if (err != Z_OK) { - zlib_error(zst, err, "while finishing decompression"); + zlib_error(state, zst, err, "while finishing decompression"); goto error; } @@ -434,16 +435,14 @@ zlib_compressobj_impl(PyObject *module, int level, int method, int wbits, int memLevel, int strategy, Py_buffer *zdict) /*[clinic end generated code: output=8b5bed9c8fc3814d input=2fa3d026f90ab8d5]*/ { - compobject *self = NULL; - int err; - + zlibstate *state = get_zlib_state(module); if (zdict->buf != NULL && (size_t)zdict->len > UINT_MAX) { PyErr_SetString(PyExc_OverflowError, "zdict length does not fit in an unsigned int"); - goto error; + return NULL; } - self = newcompobject(_zlibstate_global->Comptype); + compobject *self = newcompobject(state->Comptype); if (self == NULL) goto error; self->zst.opaque = NULL; @@ -451,7 +450,7 @@ zlib_compressobj_impl(PyObject *module, int level, int method, int wbits, self->zst.zfree = PyZlib_Free; self->zst.next_in = NULL; self->zst.avail_in = 0; - err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy); + int err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy); switch (err) { case Z_OK: self->is_initialised = 1; @@ -479,7 +478,7 @@ zlib_compressobj_impl(PyObject *module, int level, int method, int wbits, PyErr_SetString(PyExc_ValueError, "Invalid initialization option"); goto error; default: - zlib_error(self->zst, err, "while creating compression object"); + zlib_error(state, self->zst, err, "while creating compression object"); goto error; } @@ -490,11 +489,9 @@ zlib_compressobj_impl(PyObject *module, int level, int method, int wbits, } static int -set_inflate_zdict(compobject *self) +set_inflate_zdict(zlibstate *state, compobject *self) { Py_buffer zdict_buf; - int err; - if (PyObject_GetBuffer(self->zdict, &zdict_buf, PyBUF_SIMPLE) == -1) { return -1; } @@ -504,11 +501,12 @@ set_inflate_zdict(compobject *self) PyBuffer_Release(&zdict_buf); return -1; } + int err; err = inflateSetDictionary(&self->zst, zdict_buf.buf, (unsigned int)zdict_buf.len); PyBuffer_Release(&zdict_buf); if (err != Z_OK) { - zlib_error(self->zst, err, "while setting zdict"); + zlib_error(state, self->zst, err, "while setting zdict"); return -1; } return 0; @@ -530,8 +528,7 @@ static PyObject * zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict) /*[clinic end generated code: output=3069b99994f36906 input=d3832b8511fc977b]*/ { - int err; - compobject *self; + zlibstate *state = get_zlib_state(module); if (zdict != NULL && !PyObject_CheckBuffer(zdict)) { PyErr_SetString(PyExc_TypeError, @@ -539,7 +536,7 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict) return NULL; } - self = newcompobject(_zlibstate_global->Decomptype); + compobject *self = newcompobject(state->Decomptype); if (self == NULL) return NULL; self->zst.opaque = NULL; @@ -551,18 +548,18 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict) Py_INCREF(zdict); self->zdict = zdict; } - err = inflateInit2(&self->zst, wbits); + int err = inflateInit2(&self->zst, wbits); switch (err) { case Z_OK: self->is_initialised = 1; if (self->zdict != NULL && wbits < 0) { #ifdef AT_LEAST_ZLIB_1_2_2_1 - if (set_inflate_zdict(self) < 0) { + if (set_inflate_zdict(state, self) < 0) { Py_DECREF(self); return NULL; } #else - PyErr_Format(_zlibstate_global->ZlibError, + PyErr_Format(state->ZlibError, "zlib version %s does not allow raw inflate with dictionary", ZLIB_VERSION); Py_DECREF(self); @@ -580,7 +577,7 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict) "Can't allocate memory for decompression object"); return NULL; default: - zlib_error(self->zst, err, "while creating decompression object"); + zlib_error(state, self->zst, err, "while creating decompression object"); Py_DECREF(self); return NULL; } @@ -617,6 +614,7 @@ Decomp_dealloc(compobject *self) /*[clinic input] zlib.Compress.compress + cls: defining_class data: Py_buffer Binary data to be compressed. / @@ -629,15 +627,18 @@ Call the flush() method to clear these buffers. [clinic start generated code]*/ static PyObject * -zlib_Compress_compress_impl(compobject *self, Py_buffer *data) -/*[clinic end generated code: output=5d5cd791cbc6a7f4 input=0d95908d6e64fab8]*/ +zlib_Compress_compress_impl(compobject *self, PyTypeObject *cls, + Py_buffer *data) +/*[clinic end generated code: output=6731b3f0ff357ca6 input=04d00f65ab01d260]*/ { PyObject *RetVal = NULL; - Py_ssize_t ibuflen, obuflen = DEF_BUF_SIZE; + Py_ssize_t obuflen = DEF_BUF_SIZE; int err; + zlibstate *state = PyType_GetModuleState(cls); + self->zst.next_in = data->buf; - ibuflen = data->len; + Py_ssize_t ibuflen = data->len; ENTER_ZLIB(self); @@ -654,7 +655,7 @@ zlib_Compress_compress_impl(compobject *self, Py_buffer *data) Py_END_ALLOW_THREADS if (err == Z_STREAM_ERROR) { - zlib_error(self->zst, err, "while compressing data"); + zlib_error(state, self->zst, err, "while compressing data"); goto error; } @@ -722,6 +723,7 @@ save_unconsumed_input(compobject *self, Py_buffer *data, int err) /*[clinic input] zlib.Decompress.decompress + cls: defining_class data: Py_buffer The binary data to decompress. / @@ -738,14 +740,19 @@ Call the flush() method to clear these buffers. [clinic start generated code]*/ static PyObject * -zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data, - Py_ssize_t max_length) -/*[clinic end generated code: output=6e5173c74e710352 input=0a95d05a3bceaeaa]*/ +zlib_Decompress_decompress_impl(compobject *self, PyTypeObject *cls, + Py_buffer *data, Py_ssize_t max_length) +/*[clinic end generated code: output=b024a93c2c922d57 input=bfb37b3864cfb606]*/ { int err = Z_OK; Py_ssize_t ibuflen, obuflen = DEF_BUF_SIZE, hard_limit; PyObject *RetVal = NULL; + PyObject *module = PyType_GetModule(cls); + if (module == NULL) + return NULL; + + zlibstate *state = get_zlib_state(module); if (max_length < 0) { PyErr_SetString(PyExc_ValueError, "max_length must be non-negative"); return NULL; @@ -790,8 +797,9 @@ zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data, break; default: if (err == Z_NEED_DICT && self->zdict != NULL) { - if (set_inflate_zdict(self) < 0) + if (set_inflate_zdict(state, self) < 0) { goto abort; + } else break; } @@ -815,7 +823,7 @@ zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data, but there wasn't more output when we tried again, so it is not an error condition. */ - zlib_error(self->zst, err, "while decompressing data"); + zlib_error(state, self->zst, err, "while decompressing data"); goto abort; } @@ -833,6 +841,7 @@ zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data, /*[clinic input] zlib.Compress.flush + cls: defining_class mode: int(c_default="Z_FINISH") = zlib.Z_FINISH One of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH. If mode == Z_FINISH, the compressor object can no longer be @@ -844,13 +853,14 @@ Return a bytes object containing any remaining compressed data. [clinic start generated code]*/ static PyObject * -zlib_Compress_flush_impl(compobject *self, int mode) -/*[clinic end generated code: output=a203f4cefc9de727 input=73ed066794bd15bc]*/ +zlib_Compress_flush_impl(compobject *self, PyTypeObject *cls, int mode) +/*[clinic end generated code: output=c7efd13efd62add2 input=286146e29442eb6c]*/ { int err; Py_ssize_t length = DEF_BUF_SIZE; PyObject *RetVal = NULL; + zlibstate *state = PyType_GetModuleState(cls); /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in doing any work at all; just return an empty string. */ if (mode == Z_NO_FLUSH) { @@ -873,7 +883,7 @@ zlib_Compress_flush_impl(compobject *self, int mode) Py_END_ALLOW_THREADS if (err == Z_STREAM_ERROR) { - zlib_error(self->zst, err, "while flushing"); + zlib_error(state, self->zst, err, "while flushing"); Py_CLEAR(RetVal); goto error; } @@ -886,7 +896,7 @@ zlib_Compress_flush_impl(compobject *self, int mode) if (err == Z_STREAM_END && mode == Z_FINISH) { err = deflateEnd(&self->zst); if (err != Z_OK) { - zlib_error(self->zst, err, "while finishing compression"); + zlib_error(state, self->zst, err, "while finishing compression"); Py_CLEAR(RetVal); goto error; } @@ -898,7 +908,7 @@ zlib_Compress_flush_impl(compobject *self, int mode) not an error condition. */ } else if (err != Z_OK && err != Z_BUF_ERROR) { - zlib_error(self->zst, err, "while flushing"); + zlib_error(state, self->zst, err, "while flushing"); Py_CLEAR(RetVal); goto error; } @@ -917,24 +927,25 @@ zlib_Compress_flush_impl(compobject *self, int mode) /*[clinic input] zlib.Compress.copy + cls: defining_class + Return a copy of the compression object. [clinic start generated code]*/ static PyObject * -zlib_Compress_copy_impl(compobject *self) -/*[clinic end generated code: output=5144aa153c21e805 input=c656351f94b82718]*/ +zlib_Compress_copy_impl(compobject *self, PyTypeObject *cls) +/*[clinic end generated code: output=c4d2cfb4b0d7350b input=235497e482d40986]*/ { - compobject *retval = NULL; - int err; + zlibstate *state = PyType_GetModuleState(cls); - retval = newcompobject(_zlibstate_global->Comptype); + compobject *retval = newcompobject(state->Comptype); if (!retval) return NULL; /* Copy the zstream state * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe */ ENTER_ZLIB(self); - err = deflateCopy(&retval->zst, &self->zst); + int err = deflateCopy(&retval->zst, &self->zst); switch (err) { case Z_OK: break; @@ -946,7 +957,7 @@ zlib_Compress_copy_impl(compobject *self) "Can't allocate memory for compression object"); goto error; default: - zlib_error(self->zst, err, "while copying compression object"); + zlib_error(state, self->zst, err, "while copying compression object"); goto error; } Py_INCREF(self->unused_data); @@ -971,51 +982,57 @@ zlib_Compress_copy_impl(compobject *self) /*[clinic input] zlib.Compress.__copy__ + + cls: defining_class + [clinic start generated code]*/ static PyObject * -zlib_Compress___copy___impl(compobject *self) -/*[clinic end generated code: output=1875e6791975442e input=be97a05a788dfd83]*/ +zlib_Compress___copy___impl(compobject *self, PyTypeObject *cls) +/*[clinic end generated code: output=074613db332cb668 input=5c0188367ab0fe64]*/ { - return zlib_Compress_copy_impl(self); + return zlib_Compress_copy_impl(self, cls); } /*[clinic input] zlib.Compress.__deepcopy__ + cls: defining_class memo: object / [clinic start generated code]*/ static PyObject * -zlib_Compress___deepcopy__(compobject *self, PyObject *memo) -/*[clinic end generated code: output=f47a2213282c9eb0 input=a9a8b0b40d83388e]*/ +zlib_Compress___deepcopy___impl(compobject *self, PyTypeObject *cls, + PyObject *memo) +/*[clinic end generated code: output=24b3aed785f54033 input=c90347319a514430]*/ { - return zlib_Compress_copy_impl(self); + return zlib_Compress_copy_impl(self, cls); } /*[clinic input] zlib.Decompress.copy + cls: defining_class + Return a copy of the decompression object. [clinic start generated code]*/ static PyObject * -zlib_Decompress_copy_impl(compobject *self) -/*[clinic end generated code: output=02a883a2a510c8cc input=ba6c3e96712a596b]*/ +zlib_Decompress_copy_impl(compobject *self, PyTypeObject *cls) +/*[clinic end generated code: output=a7ddc016e1d0a781 input=20ef3aa208282ff2]*/ { - compobject *retval = NULL; - int err; + zlibstate *state = PyType_GetModuleState(cls); - retval = newcompobject(_zlibstate_global->Decomptype); + compobject *retval = newcompobject(state->Decomptype); if (!retval) return NULL; /* Copy the zstream state * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe */ ENTER_ZLIB(self); - err = inflateCopy(&retval->zst, &self->zst); + int err = inflateCopy(&retval->zst, &self->zst); switch (err) { case Z_OK: break; @@ -1027,7 +1044,7 @@ zlib_Decompress_copy_impl(compobject *self) "Can't allocate memory for decompression object"); goto error; default: - zlib_error(self->zst, err, "while copying decompression object"); + zlib_error(state, self->zst, err, "while copying decompression object"); goto error; } @@ -1053,28 +1070,33 @@ zlib_Decompress_copy_impl(compobject *self) /*[clinic input] zlib.Decompress.__copy__ + + cls: defining_class + [clinic start generated code]*/ static PyObject * -zlib_Decompress___copy___impl(compobject *self) -/*[clinic end generated code: output=80bae8bc43498ad4 input=efcb98b5472c13d2]*/ +zlib_Decompress___copy___impl(compobject *self, PyTypeObject *cls) +/*[clinic end generated code: output=cf1e6473744f53fa input=cc3143067b622bdf]*/ { - return zlib_Decompress_copy_impl(self); + return zlib_Decompress_copy_impl(self, cls); } /*[clinic input] zlib.Decompress.__deepcopy__ + cls: defining_class memo: object / [clinic start generated code]*/ static PyObject * -zlib_Decompress___deepcopy__(compobject *self, PyObject *memo) -/*[clinic end generated code: output=1f77286ab490124b input=6e99bd0ac4b9cd8b]*/ +zlib_Decompress___deepcopy___impl(compobject *self, PyTypeObject *cls, + PyObject *memo) +/*[clinic end generated code: output=34f7b719a0c0d51b input=fc13b9c58622544e]*/ { - return zlib_Decompress_copy_impl(self); + return zlib_Decompress_copy_impl(self, cls); } #endif @@ -1082,6 +1104,7 @@ zlib_Decompress___deepcopy__(compobject *self, PyObject *memo) /*[clinic input] zlib.Decompress.flush + cls: defining_class length: Py_ssize_t(c_default="DEF_BUF_SIZE") = zlib.DEF_BUF_SIZE the initial size of the output buffer. / @@ -1090,21 +1113,30 @@ Return a bytes object containing any remaining decompressed data. [clinic start generated code]*/ static PyObject * -zlib_Decompress_flush_impl(compobject *self, Py_ssize_t length) -/*[clinic end generated code: output=68c75ea127cbe654 input=427f2a05a8c2113a]*/ +zlib_Decompress_flush_impl(compobject *self, PyTypeObject *cls, + Py_ssize_t length) +/*[clinic end generated code: output=4532fc280bd0f8f2 input=42f1f4b75230e2cd]*/ { int err, flush; Py_buffer data; PyObject *RetVal = NULL; Py_ssize_t ibuflen; + PyObject *module = PyType_GetModule(cls); + if (module == NULL) { + return NULL; + } + + zlibstate *state = get_zlib_state(module); + if (length <= 0) { PyErr_SetString(PyExc_ValueError, "length must be greater than zero"); return NULL; } - if (PyObject_GetBuffer(self->unconsumed_tail, &data, PyBUF_SIMPLE) == -1) + if (PyObject_GetBuffer(self->unconsumed_tail, &data, PyBUF_SIMPLE) == -1) { return NULL; + } ENTER_ZLIB(self); @@ -1131,8 +1163,9 @@ zlib_Decompress_flush_impl(compobject *self, Py_ssize_t length) break; default: if (err == Z_NEED_DICT && self->zdict != NULL) { - if (set_inflate_zdict(self) < 0) + if (set_inflate_zdict(state, self) < 0) { goto abort; + } else break; } @@ -1144,8 +1177,9 @@ zlib_Decompress_flush_impl(compobject *self, Py_ssize_t length) } while (err != Z_STREAM_END && ibuflen != 0); save: - if (save_unconsumed_input(self, &data, err) < 0) + if (save_unconsumed_input(self, &data, err) < 0) { goto abort; + } /* If at end of stream, clean up any memory allocated by zlib. */ if (err == Z_STREAM_END) { @@ -1153,14 +1187,15 @@ zlib_Decompress_flush_impl(compobject *self, Py_ssize_t length) self->is_initialised = 0; err = inflateEnd(&self->zst); if (err != Z_OK) { - zlib_error(self->zst, err, "while finishing decompression"); + zlib_error(state, self->zst, err, "while finishing decompression"); goto abort; } } if (_PyBytes_Resize(&RetVal, self->zst.next_out - - (Byte *)PyBytes_AS_STRING(RetVal)) == 0) + (Byte *)PyBytes_AS_STRING(RetVal)) == 0) { goto success; + } abort: Py_CLEAR(RetVal); @@ -1337,9 +1372,9 @@ PyDoc_STRVAR(zlib_module_documentation, "objects support decompress() and flush()."); static int -zlib_clear(PyObject *m) +zlib_clear(PyObject *mod) { - _zlibstate *state = get_zlib_state(m); + zlibstate *state = get_zlib_state(mod); Py_CLEAR(state->Comptype); Py_CLEAR(state->Decomptype); Py_CLEAR(state->ZlibError); @@ -1347,9 +1382,9 @@ zlib_clear(PyObject *m) } static int -zlib_traverse(PyObject *m, visitproc visit, void *arg) +zlib_traverse(PyObject *mod, visitproc visit, void *arg) { - _zlibstate *state = get_zlib_state(m); + zlibstate *state = get_zlib_state(mod); Py_VISIT(state->Comptype); Py_VISIT(state->Decomptype); Py_VISIT(state->ZlibError); @@ -1357,93 +1392,122 @@ zlib_traverse(PyObject *m, visitproc visit, void *arg) } static void -zlib_free(void *m) +zlib_free(void *mod) { - zlib_clear((PyObject *)m); + zlib_clear((PyObject *)mod); } -static struct PyModuleDef zlibmodule = { - PyModuleDef_HEAD_INIT, - "zlib", - zlib_module_documentation, - sizeof(_zlibstate), - zlib_methods, - NULL, - zlib_traverse, - zlib_clear, - zlib_free, -}; - -PyMODINIT_FUNC -PyInit_zlib(void) +static int +zlib_exec(PyObject *mod) { - PyObject *m, *ver; - m = PyState_FindModule(&zlibmodule); - if (m != NULL) { - Py_INCREF(m); - return m; + zlibstate *state = get_zlib_state(mod); + + state->Comptype = (PyTypeObject *)PyType_FromModuleAndSpec( + mod, &Comptype_spec, NULL); + if (state->Comptype == NULL) { + return -1; } - m = PyModule_Create(&zlibmodule); - if (m == NULL) - return NULL; - PyTypeObject *Comptype = (PyTypeObject *)PyType_FromSpec(&Comptype_spec); - if (Comptype == NULL) - return NULL; - get_zlib_state(m)->Comptype = Comptype; + state->Decomptype = (PyTypeObject *)PyType_FromModuleAndSpec( + mod, &Decomptype_spec, NULL); + if (state->Decomptype == NULL) { + return -1; + } - PyTypeObject *Decomptype = (PyTypeObject *)PyType_FromSpec(&Decomptype_spec); - if (Decomptype == NULL) - return NULL; - get_zlib_state(m)->Decomptype = Decomptype; + state->ZlibError = PyErr_NewException("zlib.error", NULL, NULL); + if (state->ZlibError == NULL) { + return -1; + } - PyObject *ZlibError = PyErr_NewException("zlib.error", NULL, NULL); - if (ZlibError != NULL) { - Py_INCREF(ZlibError); - PyModule_AddObject(m, "error", ZlibError); - get_zlib_state(m)->ZlibError = ZlibError; + Py_INCREF(state->ZlibError); + if (PyModule_AddObject(mod, "error", state->ZlibError) < 0) { + Py_DECREF(state->ZlibError); + return -1; } - PyModule_AddIntMacro(m, MAX_WBITS); - PyModule_AddIntMacro(m, DEFLATED); - PyModule_AddIntMacro(m, DEF_MEM_LEVEL); - PyModule_AddIntMacro(m, DEF_BUF_SIZE); + +#define ZLIB_ADD_INT_MACRO(c) \ + do { \ + if ((PyModule_AddIntConstant(mod, #c, c)) < 0) { \ + return -1; \ + } \ + } while(0) + + ZLIB_ADD_INT_MACRO(MAX_WBITS); + ZLIB_ADD_INT_MACRO(DEFLATED); + ZLIB_ADD_INT_MACRO(DEF_MEM_LEVEL); + ZLIB_ADD_INT_MACRO(DEF_BUF_SIZE); // compression levels - PyModule_AddIntMacro(m, Z_NO_COMPRESSION); - PyModule_AddIntMacro(m, Z_BEST_SPEED); - PyModule_AddIntMacro(m, Z_BEST_COMPRESSION); - PyModule_AddIntMacro(m, Z_DEFAULT_COMPRESSION); + ZLIB_ADD_INT_MACRO(Z_NO_COMPRESSION); + ZLIB_ADD_INT_MACRO(Z_BEST_SPEED); + ZLIB_ADD_INT_MACRO(Z_BEST_COMPRESSION); + ZLIB_ADD_INT_MACRO(Z_DEFAULT_COMPRESSION); // compression strategies - PyModule_AddIntMacro(m, Z_FILTERED); - PyModule_AddIntMacro(m, Z_HUFFMAN_ONLY); + ZLIB_ADD_INT_MACRO(Z_FILTERED); + ZLIB_ADD_INT_MACRO(Z_HUFFMAN_ONLY); #ifdef Z_RLE // 1.2.0.1 - PyModule_AddIntMacro(m, Z_RLE); + ZLIB_ADD_INT_MACRO(Z_RLE); #endif #ifdef Z_FIXED // 1.2.2.2 - PyModule_AddIntMacro(m, Z_FIXED); + ZLIB_ADD_INT_MACRO(Z_FIXED); #endif - PyModule_AddIntMacro(m, Z_DEFAULT_STRATEGY); + ZLIB_ADD_INT_MACRO(Z_DEFAULT_STRATEGY); // allowed flush values - PyModule_AddIntMacro(m, Z_NO_FLUSH); - PyModule_AddIntMacro(m, Z_PARTIAL_FLUSH); - PyModule_AddIntMacro(m, Z_SYNC_FLUSH); - PyModule_AddIntMacro(m, Z_FULL_FLUSH); - PyModule_AddIntMacro(m, Z_FINISH); + ZLIB_ADD_INT_MACRO(Z_NO_FLUSH); + ZLIB_ADD_INT_MACRO(Z_PARTIAL_FLUSH); + ZLIB_ADD_INT_MACRO(Z_SYNC_FLUSH); + ZLIB_ADD_INT_MACRO(Z_FULL_FLUSH); + ZLIB_ADD_INT_MACRO(Z_FINISH); #ifdef Z_BLOCK // 1.2.0.5 for inflate, 1.2.3.4 for deflate - PyModule_AddIntMacro(m, Z_BLOCK); + ZLIB_ADD_INT_MACRO(Z_BLOCK); #endif #ifdef Z_TREES // 1.2.3.4, only for inflate - PyModule_AddIntMacro(m, Z_TREES); + ZLIB_ADD_INT_MACRO(Z_TREES); #endif - ver = PyUnicode_FromString(ZLIB_VERSION); - if (ver != NULL) - PyModule_AddObject(m, "ZLIB_VERSION", ver); + PyObject *ver = PyUnicode_FromString(ZLIB_VERSION); + if (ver == NULL) { + return -1; + } + + if (PyModule_AddObject(mod, "ZLIB_VERSION", ver) < 0) { + Py_DECREF(ver); + return -1; + } ver = PyUnicode_FromString(zlibVersion()); - if (ver != NULL) - PyModule_AddObject(m, "ZLIB_RUNTIME_VERSION", ver); + if (ver == NULL) { + return -1; + } + + if (PyModule_AddObject(mod, "ZLIB_RUNTIME_VERSION", ver) < 0) { + Py_DECREF(ver); + return -1; + } + + if (PyModule_AddStringConstant(mod, "__version__", "1.0") < 0) { + return -1; + } + return 0; +} - PyModule_AddStringConstant(m, "__version__", "1.0"); +static PyModuleDef_Slot zlib_slots[] = { + {Py_mod_exec, zlib_exec}, + {0, NULL} +}; - PyState_AddModule(m, &zlibmodule); - return m; +static struct PyModuleDef zlibmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "zlib", + .m_doc = zlib_module_documentation, + .m_size = sizeof(zlibstate), + .m_methods = zlib_methods, + .m_slots = zlib_slots, + .m_traverse = zlib_traverse, + .m_clear = zlib_clear, + .m_free = zlib_free, +}; + +PyMODINIT_FUNC +PyInit_zlib(void) +{ + return PyModuleDef_Init(&zlibmodule); } From b2588b207126f2f22100145655450879a060f30d Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Mon, 7 Sep 2020 03:48:44 -0500 Subject: [PATCH 0052/1261] bpo-1635741: Port _opcode module to multi-phase init (PEP 489) (GH-22050) --- ...2020-09-01-17-06-02.bpo-1635741.5jZymK.rst | 2 ++ Modules/_opcode.c | 21 +++++++------------ 2 files changed, 9 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-06-02.bpo-1635741.5jZymK.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-06-02.bpo-1635741.5jZymK.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-06-02.bpo-1635741.5jZymK.rst new file mode 100644 index 00000000000000..c3bc9a78a2e054 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-06-02.bpo-1635741.5jZymK.rst @@ -0,0 +1,2 @@ +Port the :mod:`_opcode` extension module to multi-phase initialization +(:pep:`489`). diff --git a/Modules/_opcode.c b/Modules/_opcode.c index 42a8732694afef..d8de0762e765af 100644 --- a/Modules/_opcode.c +++ b/Modules/_opcode.c @@ -36,8 +36,9 @@ _opcode_stack_effect_impl(PyObject *module, int opcode, PyObject *oparg, return -1; } oparg_int = (int)PyLong_AsLong(oparg); - if ((oparg_int == -1) && PyErr_Occurred()) + if ((oparg_int == -1) && PyErr_Occurred()) { return -1; + } } else if (oparg != Py_None) { PyErr_SetString(PyExc_ValueError, @@ -67,30 +68,22 @@ _opcode_stack_effect_impl(PyObject *module, int opcode, PyObject *oparg, return effect; } - - - static PyMethodDef opcode_functions[] = { _OPCODE_STACK_EFFECT_METHODDEF {NULL, NULL, 0, NULL} }; - static struct PyModuleDef opcodemodule = { PyModuleDef_HEAD_INIT, - "_opcode", - "Opcode support module.", - -1, - opcode_functions, - NULL, - NULL, - NULL, - NULL + .m_name = "_opcode", + .m_doc = "Opcode support module.", + .m_size = 0, + .m_methods = opcode_functions }; PyMODINIT_FUNC PyInit__opcode(void) { - return PyModule_Create(&opcodemodule); + return PyModuleDef_Init(&opcodemodule); } From 7618c01052a9262602181666cb61e344c163c7fd Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Mon, 7 Sep 2020 08:12:40 -0500 Subject: [PATCH 0053/1261] bpo-1635741: Port _overlapped module to multi-phase init (GH-22051) Port the _overlapped extension module to multi-phase initialization (PEP 489). --- ...2020-09-01-17-22-35.bpo-1635741.CnRME3.rst | 2 + Modules/overlapped.c | 173 +++++++++++------- 2 files changed, 108 insertions(+), 67 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-22-35.bpo-1635741.CnRME3.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-22-35.bpo-1635741.CnRME3.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-22-35.bpo-1635741.CnRME3.rst new file mode 100644 index 00000000000000..76f985bb87b4e9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-22-35.bpo-1635741.CnRME3.rst @@ -0,0 +1,2 @@ +Port the :mod:`_overlapped` extension module to multi-phase initialization +(:pep:`489`). diff --git a/Modules/overlapped.c b/Modules/overlapped.c index 5e7a1bbba76787..3829932070a961 100644 --- a/Modules/overlapped.c +++ b/Modules/overlapped.c @@ -100,6 +100,19 @@ typedef struct { }; } OverlappedObject; +typedef struct { + PyTypeObject *overlapped_type; +} OverlappedState; + +static inline OverlappedState* +overlapped_get_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (OverlappedState *)state; +} + + /* * Map Windows error codes to subclasses of OSError */ @@ -706,8 +719,11 @@ Overlapped_dealloc(OverlappedObject *self) } Overlapped_clear(self); - PyObject_Del(self); SetLastError(olderr); + + PyTypeObject *tp = Py_TYPE(self); + PyObject_Del(self); + Py_DECREF(tp); } @@ -1846,45 +1862,22 @@ static PyGetSetDef Overlapped_getsets[] = { {NULL}, }; -PyTypeObject OverlappedType = { - PyVarObject_HEAD_INIT(NULL, 0) - /* tp_name */ "_overlapped.Overlapped", - /* tp_basicsize */ sizeof(OverlappedObject), - /* tp_itemsize */ 0, - /* tp_dealloc */ (destructor) Overlapped_dealloc, - /* tp_vectorcall_offset */ 0, - /* tp_getattr */ 0, - /* tp_setattr */ 0, - /* tp_as_async */ 0, - /* tp_repr */ 0, - /* tp_as_number */ 0, - /* tp_as_sequence */ 0, - /* tp_as_mapping */ 0, - /* tp_hash */ 0, - /* tp_call */ 0, - /* tp_str */ 0, - /* tp_getattro */ 0, - /* tp_setattro */ 0, - /* tp_as_buffer */ 0, - /* tp_flags */ Py_TPFLAGS_DEFAULT, - /* tp_doc */ _overlapped_Overlapped__doc__, - /* tp_traverse */ (traverseproc)Overlapped_traverse, - /* tp_clear */ 0, - /* tp_richcompare */ 0, - /* tp_weaklistoffset */ 0, - /* tp_iter */ 0, - /* tp_iternext */ 0, - /* tp_methods */ Overlapped_methods, - /* tp_members */ Overlapped_members, - /* tp_getset */ Overlapped_getsets, - /* tp_base */ 0, - /* tp_dict */ 0, - /* tp_descr_get */ 0, - /* tp_descr_set */ 0, - /* tp_dictoffset */ 0, - /* tp_init */ 0, - /* tp_alloc */ 0, - /* tp_new */ _overlapped_Overlapped, +static PyType_Slot overlapped_type_slots[] = { + {Py_tp_dealloc, Overlapped_dealloc}, + {Py_tp_doc, (char *)_overlapped_Overlapped__doc__}, + {Py_tp_traverse, Overlapped_traverse}, + {Py_tp_methods, Overlapped_methods}, + {Py_tp_members, Overlapped_members}, + {Py_tp_getset, Overlapped_getsets}, + {Py_tp_new, _overlapped_Overlapped}, + {0,0} +}; + +static PyType_Spec overlapped_type_spec = { + .name = "_overlapped.Overlapped", + .basicsize = sizeof(OverlappedObject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = overlapped_type_slots }; static PyMethodDef overlapped_functions[] = { @@ -1904,41 +1897,65 @@ static PyMethodDef overlapped_functions[] = { {NULL} }; -static struct PyModuleDef overlapped_module = { - PyModuleDef_HEAD_INIT, - "_overlapped", - NULL, - -1, - overlapped_functions, - NULL, - NULL, - NULL, - NULL -}; +static int +overlapped_traverse(PyObject *module, visitproc visit, void *arg) +{ + OverlappedState *state = overlapped_get_state(module); + Py_VISIT(state->overlapped_type); + return 0; +} -#define WINAPI_CONSTANT(fmt, con) \ - PyDict_SetItemString(d, #con, Py_BuildValue(fmt, con)) +static int +overlapped_clear(PyObject *module) +{ + OverlappedState *state = overlapped_get_state(module); + Py_CLEAR(state->overlapped_type); + return 0; +} -PyMODINIT_FUNC -PyInit__overlapped(void) +static void +overlapped_free(void *module) { - PyObject *m, *d; + overlapped_clear((PyObject *)module); +} +#define WINAPI_CONSTANT(fmt, con) \ + do { \ + PyObject *value = Py_BuildValue(fmt, con); \ + if (value == NULL) { \ + return -1; \ + } \ + if (PyModule_AddObject(module, #con, value) < 0 ) { \ + Py_DECREF(value); \ + return -1; \ + } \ + } while (0) + +static int +overlapped_exec(PyObject *module) +{ /* Ensure WSAStartup() called before initializing function pointers */ - m = PyImport_ImportModule("_socket"); - if (!m) - return NULL; - Py_DECREF(m); + PyObject *socket_module = PyImport_ImportModule("_socket"); + if (!socket_module) { + return -1; + } - if (initialize_function_pointers() < 0) - return NULL; + Py_DECREF(socket_module); - m = PyModule_Create(&overlapped_module); - if (PyModule_AddType(m, &OverlappedType) < 0) { - return NULL; + if (initialize_function_pointers() < 0) { + return -1; } - d = PyModule_GetDict(m); + OverlappedState *st = overlapped_get_state(module); + st->overlapped_type = (PyTypeObject *)PyType_FromModuleAndSpec( + module, &overlapped_type_spec, NULL); + if (st->overlapped_type == NULL) { + return -1; + } + + if (PyModule_AddType(module, st->overlapped_type) < 0) { + return -1; + } WINAPI_CONSTANT(F_DWORD, ERROR_IO_PENDING); WINAPI_CONSTANT(F_DWORD, ERROR_NETNAME_DELETED); @@ -1952,5 +1969,27 @@ PyInit__overlapped(void) WINAPI_CONSTANT(F_DWORD, SO_UPDATE_CONNECT_CONTEXT); WINAPI_CONSTANT(F_DWORD, TF_REUSE_SOCKET); - return m; + return 0; +} + +static PyModuleDef_Slot overlapped_slots[] = { + {Py_mod_exec, overlapped_exec}, + {0, NULL} +}; + +static struct PyModuleDef overlapped_module = { + PyModuleDef_HEAD_INIT, + .m_name = "_overlapped", + .m_size = sizeof(OverlappedState), + .m_methods = overlapped_functions, + .m_slots = overlapped_slots, + .m_traverse = overlapped_traverse, + .m_clear = overlapped_clear, + .m_free = overlapped_free +}; + +PyMODINIT_FUNC +PyInit__overlapped(void) +{ + return PyModuleDef_Init(&overlapped_module); } From 96a0b2b10af03d75d2453197a39e1b8cc6e8ca72 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Mon, 7 Sep 2020 10:14:25 -0500 Subject: [PATCH 0054/1261] bpo-1635741 port _curses_panel to multi-phase init (PEP 489) (GH-21986) --- ...2020-09-01-17-08-07.bpo-1635741.X9CZgo.rst | 2 + Modules/_curses_panel.c | 268 ++++++++++-------- Modules/clinic/_curses_panel.c.h | 158 ++++++++--- 3 files changed, 273 insertions(+), 155 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-08-07.bpo-1635741.X9CZgo.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-08-07.bpo-1635741.X9CZgo.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-08-07.bpo-1635741.X9CZgo.rst new file mode 100644 index 00000000000000..a39673a26307a9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-08-07.bpo-1635741.X9CZgo.rst @@ -0,0 +1,2 @@ +Port the :mod:`_curses_panel` extension module to multi-phase initialization +(:pep:`489`). diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c index f124803493d88b..1a8f0b636821ff 100644 --- a/Modules/_curses_panel.c +++ b/Modules/_curses_panel.c @@ -18,43 +18,42 @@ static const char PyCursesVersion[] = "2.1"; typedef struct { PyObject *PyCursesError; - PyObject *PyCursesPanel_Type; -} _curses_panelstate; + PyTypeObject *PyCursesPanel_Type; +} _curses_panel_state; -static inline _curses_panelstate* -get_curses_panelstate(PyObject *module) +static inline _curses_panel_state * +get_curses_panel_state(PyObject *module) { void *state = PyModule_GetState(module); assert(state != NULL); - return (_curses_panelstate *)state; + return (_curses_panel_state *)state; } static int -_curses_panel_clear(PyObject *m) +_curses_panel_clear(PyObject *mod) { - Py_CLEAR(get_curses_panelstate(m)->PyCursesError); + _curses_panel_state *state = get_curses_panel_state(mod); + Py_CLEAR(state->PyCursesError); + Py_CLEAR(state->PyCursesPanel_Type); return 0; } static int -_curses_panel_traverse(PyObject *m, visitproc visit, void *arg) +_curses_panel_traverse(PyObject *mod, visitproc visit, void *arg) { - Py_VISIT(Py_TYPE(m)); - Py_VISIT(get_curses_panelstate(m)->PyCursesError); + Py_VISIT(Py_TYPE(mod)); + _curses_panel_state *state = get_curses_panel_state(mod); + Py_VISIT(state->PyCursesError); + Py_VISIT(state->PyCursesPanel_Type); return 0; } static void -_curses_panel_free(void *m) +_curses_panel_free(void *mod) { - _curses_panel_clear((PyObject *) m); + _curses_panel_clear((PyObject *) mod); } -static struct PyModuleDef _curses_panelmodule; - -#define _curses_panelstate_global \ -((_curses_panelstate *) PyModule_GetState(PyState_FindModule(&_curses_panelmodule))) - /* Utility Functions */ /* @@ -63,15 +62,17 @@ static struct PyModuleDef _curses_panelmodule; */ static PyObject * -PyCursesCheckERR(int code, const char *fname) +PyCursesCheckERR(_curses_panel_state *state, int code, const char *fname) { if (code != ERR) { Py_RETURN_NONE; - } else { + } + else { if (fname == NULL) { - PyErr_SetString(_curses_panelstate_global->PyCursesError, catchall_ERR); - } else { - PyErr_Format(_curses_panelstate_global->PyCursesError, "%s() returned ERR", fname); + PyErr_SetString(state->PyCursesError, catchall_ERR); + } + else { + PyErr_Format(state->PyCursesError, "%s() returned ERR", fname); } return NULL; } @@ -89,9 +90,6 @@ typedef struct { PyCursesWindowObject *wo; /* for reference counts */ } PyCursesPanelObject; -#define PyCursesPanel_Check(v) \ - Py_IS_TYPE(v, _curses_panelstate_global->PyCursesPanel_Type) - /* Some helper functions. The problem is that there's always a window associated with a panel. To ensure that Python's GC doesn't pull this window from under our feet we need to keep track of references @@ -182,67 +180,81 @@ class _curses_panel.panel "PyCursesPanelObject *" "&PyCursesPanel_Type" /*[clinic input] _curses_panel.panel.bottom + cls: defining_class + Push the panel to the bottom of the stack. [clinic start generated code]*/ static PyObject * -_curses_panel_panel_bottom_impl(PyCursesPanelObject *self) -/*[clinic end generated code: output=7aa7d14d7e1d1ce6 input=b6c920c071b61e2e]*/ +_curses_panel_panel_bottom_impl(PyCursesPanelObject *self, PyTypeObject *cls) +/*[clinic end generated code: output=8ec7fbbc08554021 input=6b7d2c0578b5a1c4]*/ { - return PyCursesCheckERR(bottom_panel(self->pan), "bottom"); + _curses_panel_state *state = PyType_GetModuleState(cls); + return PyCursesCheckERR(state, bottom_panel(self->pan), "bottom"); } /*[clinic input] _curses_panel.panel.hide + cls: defining_class + Hide the panel. This does not delete the object, it just makes the window on screen invisible. [clinic start generated code]*/ static PyObject * -_curses_panel_panel_hide_impl(PyCursesPanelObject *self) -/*[clinic end generated code: output=a7bbbd523e1eab49 input=f6ab884e99386118]*/ +_curses_panel_panel_hide_impl(PyCursesPanelObject *self, PyTypeObject *cls) +/*[clinic end generated code: output=cc6ab7203cdc1450 input=1bfc741f473e6055]*/ { - return PyCursesCheckERR(hide_panel(self->pan), "hide"); + _curses_panel_state *state = PyType_GetModuleState(cls); + return PyCursesCheckERR(state, hide_panel(self->pan), "hide"); } /*[clinic input] _curses_panel.panel.show + cls: defining_class + Display the panel (which might have been hidden). [clinic start generated code]*/ static PyObject * -_curses_panel_panel_show_impl(PyCursesPanelObject *self) -/*[clinic end generated code: output=6b4553ab45c97769 input=57b167bbefaa3755]*/ +_curses_panel_panel_show_impl(PyCursesPanelObject *self, PyTypeObject *cls) +/*[clinic end generated code: output=dc3421de375f0409 input=8122e80151cb4379]*/ { - return PyCursesCheckERR(show_panel(self->pan), "show"); + _curses_panel_state *state = PyType_GetModuleState(cls); + return PyCursesCheckERR(state, show_panel(self->pan), "show"); } /*[clinic input] _curses_panel.panel.top + cls: defining_class + Push panel to the top of the stack. [clinic start generated code]*/ static PyObject * -_curses_panel_panel_top_impl(PyCursesPanelObject *self) -/*[clinic end generated code: output=0f5f2f8cdd2d1777 input=be33975ec3ca0e9a]*/ +_curses_panel_panel_top_impl(PyCursesPanelObject *self, PyTypeObject *cls) +/*[clinic end generated code: output=10a072e511e873f7 input=1f372d597dda3379]*/ { - return PyCursesCheckERR(top_panel(self->pan), "top"); + _curses_panel_state *state = PyType_GetModuleState(cls); + return PyCursesCheckERR(state, top_panel(self->pan), "top"); } /* Allocation and deallocation of Panel Objects */ static PyObject * -PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) +PyCursesPanel_New(_curses_panel_state *state, PANEL *pan, + PyCursesWindowObject *wo) { - PyCursesPanelObject *po; + PyCursesPanelObject *po = PyObject_New(PyCursesPanelObject, + state->PyCursesPanel_Type); + if (po == NULL) { + return NULL; + } - po = PyObject_New(PyCursesPanelObject, - (PyTypeObject *)(_curses_panelstate_global)->PyCursesPanel_Type); - if (po == NULL) return NULL; po->pan = pan; if (insert_lop(po) < 0) { po->wo = NULL; @@ -355,6 +367,7 @@ _curses_panel_panel_hidden_impl(PyCursesPanelObject *self) /*[clinic input] _curses_panel.panel.move + cls: defining_class y: int x: int / @@ -363,10 +376,12 @@ Move the panel to the screen coordinates (y, x). [clinic start generated code]*/ static PyObject * -_curses_panel_panel_move_impl(PyCursesPanelObject *self, int y, int x) -/*[clinic end generated code: output=d867535a89777415 input=e0b36b78acc03fba]*/ +_curses_panel_panel_move_impl(PyCursesPanelObject *self, PyTypeObject *cls, + int y, int x) +/*[clinic end generated code: output=ce546c93e56867da input=60a0e7912ff99849]*/ { - return PyCursesCheckERR(move_panel(self->pan, y, x), "move_panel"); + _curses_panel_state *state = PyType_GetModuleState(cls); + return PyCursesCheckERR(state, move_panel(self->pan, y, x), "move_panel"); } /*[clinic input] @@ -386,6 +401,7 @@ _curses_panel_panel_window_impl(PyCursesPanelObject *self) /*[clinic input] _curses_panel.panel.replace + cls: defining_class win: object(type="PyCursesWindowObject *", subclass_of="&PyCursesWindow_Type") / @@ -394,22 +410,22 @@ Change the window associated with the panel to the window win. static PyObject * _curses_panel_panel_replace_impl(PyCursesPanelObject *self, + PyTypeObject *cls, PyCursesWindowObject *win) -/*[clinic end generated code: output=2253a95f7b287255 input=4b1c4283987d9dfa]*/ +/*[clinic end generated code: output=c71f95c212d58ae7 input=dbec7180ece41ff5]*/ { - PyCursesPanelObject *po; - int rtn; + _curses_panel_state *state = PyType_GetModuleState(cls); - po = find_po(self->pan); + PyCursesPanelObject *po = find_po(self->pan); if (po == NULL) { PyErr_SetString(PyExc_RuntimeError, "replace_panel: can't find Panel Object"); return NULL; } - rtn = replace_panel(self->pan, win->win); + int rtn = replace_panel(self->pan, win->win); if (rtn == ERR) { - PyErr_SetString(_curses_panelstate_global->PyCursesError, "replace_panel() returned ERR"); + PyErr_SetString(state->PyCursesError, "replace_panel() returned ERR"); return NULL; } Py_INCREF(win); @@ -420,6 +436,7 @@ _curses_panel_panel_replace_impl(PyCursesPanelObject *self, /*[clinic input] _curses_panel.panel.set_userptr + cls: defining_class obj: object / @@ -427,38 +444,43 @@ Set the panel's user pointer to obj. [clinic start generated code]*/ static PyObject * -_curses_panel_panel_set_userptr(PyCursesPanelObject *self, PyObject *obj) -/*[clinic end generated code: output=6fb145b3af88cf4a input=d2c6a9dbefabbf39]*/ +_curses_panel_panel_set_userptr_impl(PyCursesPanelObject *self, + PyTypeObject *cls, PyObject *obj) +/*[clinic end generated code: output=db74f3db07b28080 input=e3fee2ff7b1b8e48]*/ { - PyObject *oldobj; - int rc; PyCursesInitialised; Py_INCREF(obj); - oldobj = (PyObject *) panel_userptr(self->pan); - rc = set_panel_userptr(self->pan, (void*)obj); + PyObject *oldobj = (PyObject *) panel_userptr(self->pan); + int rc = set_panel_userptr(self->pan, (void*)obj); if (rc == ERR) { /* In case of an ncurses error, decref the new object again */ Py_DECREF(obj); } Py_XDECREF(oldobj); - return PyCursesCheckERR(rc, "set_panel_userptr"); + + _curses_panel_state *state = PyType_GetModuleState(cls); + return PyCursesCheckERR(state, rc, "set_panel_userptr"); } /*[clinic input] _curses_panel.panel.userptr + cls: defining_class + Return the user pointer for the panel. [clinic start generated code]*/ static PyObject * -_curses_panel_panel_userptr_impl(PyCursesPanelObject *self) -/*[clinic end generated code: output=e849c307b5dc9237 input=f78b7a47aef0fd50]*/ +_curses_panel_panel_userptr_impl(PyCursesPanelObject *self, + PyTypeObject *cls) +/*[clinic end generated code: output=eea6e6f39ffc0179 input=f22ca4f115e30a80]*/ { - PyObject *obj; + _curses_panel_state *state = PyType_GetModuleState(cls); + PyCursesInitialised; - obj = (PyObject *) panel_userptr(self->pan); + PyObject *obj = (PyObject *) panel_userptr(self->pan); if (obj == NULL) { - PyErr_SetString(_curses_panelstate_global->PyCursesError, "no userptr set"); + PyErr_SetString(state->PyCursesError, "no userptr set"); return NULL; } @@ -494,11 +516,10 @@ static PyType_Slot PyCursesPanel_Type_slots[] = { }; static PyType_Spec PyCursesPanel_Type_spec = { - "_curses_panel.panel", - sizeof(PyCursesPanelObject), - 0, - Py_TPFLAGS_DEFAULT, - PyCursesPanel_Type_slots + .name = "_curses_panel.panel", + .basicsize = sizeof(PyCursesPanelObject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = PyCursesPanel_Type_slots }; /* Wrapper for panel_above(NULL). This function returns the bottom @@ -549,12 +570,14 @@ static PyObject * _curses_panel_new_panel_impl(PyObject *module, PyCursesWindowObject *win) /*[clinic end generated code: output=45e948e0176a9bd2 input=74d4754e0ebe4800]*/ { + _curses_panel_state *state = get_curses_panel_state(module); + PANEL *pan = new_panel(win->win); if (pan == NULL) { - PyErr_SetString(_curses_panelstate_global->PyCursesError, catchall_NULL); + PyErr_SetString(state->PyCursesError, catchall_NULL); return NULL; } - return (PyObject *)PyCursesPanel_New(pan, win); + return (PyObject *)PyCursesPanel_New(state, pan, win); } @@ -610,7 +633,6 @@ _curses_panel_update_panels_impl(PyObject *module) Py_RETURN_NONE; } - /* List of functions defined in the module */ static PyMethodDef PyCurses_methods[] = { @@ -622,57 +644,75 @@ static PyMethodDef PyCurses_methods[] = { }; /* Initialization function for the module */ - - -static struct PyModuleDef _curses_panelmodule = { - PyModuleDef_HEAD_INIT, - "_curses_panel", - NULL, - sizeof(_curses_panelstate), - PyCurses_methods, - NULL, - _curses_panel_traverse, - _curses_panel_clear, - _curses_panel_free -}; - -PyMODINIT_FUNC -PyInit__curses_panel(void) +static int +_curses_panel_exec(PyObject *mod) { - PyObject *m, *d, *v; - - /* Create the module and add the functions */ - m = PyModule_Create(&_curses_panelmodule); - if (m == NULL) - goto fail; - d = PyModule_GetDict(m); - + _curses_panel_state *state = get_curses_panel_state(mod); /* Initialize object type */ - v = PyType_FromSpec(&PyCursesPanel_Type_spec); - if (v == NULL) - goto fail; - ((PyTypeObject *)v)->tp_new = NULL; - get_curses_panelstate(m)->PyCursesPanel_Type = v; + state->PyCursesPanel_Type = (PyTypeObject *)PyType_FromModuleAndSpec( + mod, &PyCursesPanel_Type_spec, NULL); + if (state->PyCursesPanel_Type == NULL) { + return -1; + } + + if (PyModule_AddType(mod, state->PyCursesPanel_Type) < 0) { + return -1; + } import_curses(); - if (PyErr_Occurred()) - goto fail; + if (PyErr_Occurred()) { + return -1; + } /* For exception _curses_panel.error */ - get_curses_panelstate(m)->PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL); - PyDict_SetItemString(d, "error", get_curses_panelstate(m)->PyCursesError); + state->PyCursesError = PyErr_NewException( + "_curses_panel.error", NULL, NULL); + + Py_INCREF(state->PyCursesError); + if (PyModule_AddObject(mod, "error", state->PyCursesError) < 0) { + Py_DECREF(state->PyCursesError); + return -1; + } /* Make the version available */ - v = PyUnicode_FromString(PyCursesVersion); - PyDict_SetItemString(d, "version", v); - PyDict_SetItemString(d, "__version__", v); + PyObject *v = PyUnicode_FromString(PyCursesVersion); + if (v == NULL) { + return -1; + } + + PyObject *d = PyModule_GetDict(mod); + if (PyDict_SetItemString(d, "version", v) < 0) { + Py_DECREF(v); + return -1; + } + if (PyDict_SetItemString(d, "__version__", v) < 0) { + Py_DECREF(v); + return -1; + } + Py_DECREF(v); - Py_INCREF(get_curses_panelstate(m)->PyCursesPanel_Type); - PyModule_AddObject(m, "panel", - (PyObject *)get_curses_panelstate(m)->PyCursesPanel_Type); - return m; - fail: - Py_XDECREF(m); - return NULL; + return 0; } + +static PyModuleDef_Slot _curses_slots[] = { + {Py_mod_exec, _curses_panel_exec}, + {0, NULL} +}; + +static struct PyModuleDef _curses_panelmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_curses_panel", + .m_size = sizeof(_curses_panel_state), + .m_methods = PyCurses_methods, + .m_slots = _curses_slots, + .m_traverse = _curses_panel_traverse, + .m_clear = _curses_panel_clear, + .m_free = _curses_panel_free +}; + +PyMODINIT_FUNC +PyInit__curses_panel(void) +{ + return PyModuleDef_Init(&_curses_panelmodule); +} \ No newline at end of file diff --git a/Modules/clinic/_curses_panel.c.h b/Modules/clinic/_curses_panel.c.h index cff274657658ad..45898070b1f543 100644 --- a/Modules/clinic/_curses_panel.c.h +++ b/Modules/clinic/_curses_panel.c.h @@ -9,15 +9,26 @@ PyDoc_STRVAR(_curses_panel_panel_bottom__doc__, "Push the panel to the bottom of the stack."); #define _CURSES_PANEL_PANEL_BOTTOM_METHODDEF \ - {"bottom", (PyCFunction)_curses_panel_panel_bottom, METH_NOARGS, _curses_panel_panel_bottom__doc__}, + {"bottom", (PyCFunction)(void(*)(void))_curses_panel_panel_bottom, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_bottom__doc__}, static PyObject * -_curses_panel_panel_bottom_impl(PyCursesPanelObject *self); +_curses_panel_panel_bottom_impl(PyCursesPanelObject *self, PyTypeObject *cls); static PyObject * -_curses_panel_panel_bottom(PyCursesPanelObject *self, PyObject *Py_UNUSED(ignored)) +_curses_panel_panel_bottom(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _curses_panel_panel_bottom_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":bottom", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _curses_panel_panel_bottom_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(_curses_panel_panel_hide__doc__, @@ -29,15 +40,26 @@ PyDoc_STRVAR(_curses_panel_panel_hide__doc__, "This does not delete the object, it just makes the window on screen invisible."); #define _CURSES_PANEL_PANEL_HIDE_METHODDEF \ - {"hide", (PyCFunction)_curses_panel_panel_hide, METH_NOARGS, _curses_panel_panel_hide__doc__}, + {"hide", (PyCFunction)(void(*)(void))_curses_panel_panel_hide, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_hide__doc__}, static PyObject * -_curses_panel_panel_hide_impl(PyCursesPanelObject *self); +_curses_panel_panel_hide_impl(PyCursesPanelObject *self, PyTypeObject *cls); static PyObject * -_curses_panel_panel_hide(PyCursesPanelObject *self, PyObject *Py_UNUSED(ignored)) +_curses_panel_panel_hide(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _curses_panel_panel_hide_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":hide", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _curses_panel_panel_hide_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(_curses_panel_panel_show__doc__, @@ -47,15 +69,26 @@ PyDoc_STRVAR(_curses_panel_panel_show__doc__, "Display the panel (which might have been hidden)."); #define _CURSES_PANEL_PANEL_SHOW_METHODDEF \ - {"show", (PyCFunction)_curses_panel_panel_show, METH_NOARGS, _curses_panel_panel_show__doc__}, + {"show", (PyCFunction)(void(*)(void))_curses_panel_panel_show, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_show__doc__}, static PyObject * -_curses_panel_panel_show_impl(PyCursesPanelObject *self); +_curses_panel_panel_show_impl(PyCursesPanelObject *self, PyTypeObject *cls); static PyObject * -_curses_panel_panel_show(PyCursesPanelObject *self, PyObject *Py_UNUSED(ignored)) +_curses_panel_panel_show(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _curses_panel_panel_show_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":show", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _curses_panel_panel_show_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(_curses_panel_panel_top__doc__, @@ -65,15 +98,26 @@ PyDoc_STRVAR(_curses_panel_panel_top__doc__, "Push panel to the top of the stack."); #define _CURSES_PANEL_PANEL_TOP_METHODDEF \ - {"top", (PyCFunction)_curses_panel_panel_top, METH_NOARGS, _curses_panel_panel_top__doc__}, + {"top", (PyCFunction)(void(*)(void))_curses_panel_panel_top, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_top__doc__}, static PyObject * -_curses_panel_panel_top_impl(PyCursesPanelObject *self); +_curses_panel_panel_top_impl(PyCursesPanelObject *self, PyTypeObject *cls); static PyObject * -_curses_panel_panel_top(PyCursesPanelObject *self, PyObject *Py_UNUSED(ignored)) +_curses_panel_panel_top(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _curses_panel_panel_top_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":top", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _curses_panel_panel_top_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(_curses_panel_panel_above__doc__, @@ -137,30 +181,26 @@ PyDoc_STRVAR(_curses_panel_panel_move__doc__, "Move the panel to the screen coordinates (y, x)."); #define _CURSES_PANEL_PANEL_MOVE_METHODDEF \ - {"move", (PyCFunction)(void(*)(void))_curses_panel_panel_move, METH_FASTCALL, _curses_panel_panel_move__doc__}, + {"move", (PyCFunction)(void(*)(void))_curses_panel_panel_move, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_move__doc__}, static PyObject * -_curses_panel_panel_move_impl(PyCursesPanelObject *self, int y, int x); +_curses_panel_panel_move_impl(PyCursesPanelObject *self, PyTypeObject *cls, + int y, int x); static PyObject * -_curses_panel_panel_move(PyCursesPanelObject *self, PyObject *const *args, Py_ssize_t nargs) +_curses_panel_panel_move(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "", NULL}; + static _PyArg_Parser _parser = {"ii:move", _keywords, 0}; int y; int x; - if (!_PyArg_CheckPositional("move", nargs, 2, 2)) { - goto exit; - } - y = _PyLong_AsInt(args[0]); - if (y == -1 && PyErr_Occurred()) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &y, &x)) { goto exit; } - x = _PyLong_AsInt(args[1]); - if (x == -1 && PyErr_Occurred()) { - goto exit; - } - return_value = _curses_panel_panel_move_impl(self, y, x); + return_value = _curses_panel_panel_move_impl(self, cls, y, x); exit: return return_value; @@ -191,24 +231,26 @@ PyDoc_STRVAR(_curses_panel_panel_replace__doc__, "Change the window associated with the panel to the window win."); #define _CURSES_PANEL_PANEL_REPLACE_METHODDEF \ - {"replace", (PyCFunction)_curses_panel_panel_replace, METH_O, _curses_panel_panel_replace__doc__}, + {"replace", (PyCFunction)(void(*)(void))_curses_panel_panel_replace, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_replace__doc__}, static PyObject * _curses_panel_panel_replace_impl(PyCursesPanelObject *self, + PyTypeObject *cls, PyCursesWindowObject *win); static PyObject * -_curses_panel_panel_replace(PyCursesPanelObject *self, PyObject *arg) +_curses_panel_panel_replace(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = {"O!:replace", _keywords, 0}; PyCursesWindowObject *win; - if (!PyObject_TypeCheck(arg, &PyCursesWindow_Type)) { - _PyArg_BadArgument("replace", "argument", (&PyCursesWindow_Type)->tp_name, arg); + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &PyCursesWindow_Type, &win)) { goto exit; } - win = (PyCursesWindowObject *)arg; - return_value = _curses_panel_panel_replace_impl(self, win); + return_value = _curses_panel_panel_replace_impl(self, cls, win); exit: return return_value; @@ -221,7 +263,29 @@ PyDoc_STRVAR(_curses_panel_panel_set_userptr__doc__, "Set the panel\'s user pointer to obj."); #define _CURSES_PANEL_PANEL_SET_USERPTR_METHODDEF \ - {"set_userptr", (PyCFunction)_curses_panel_panel_set_userptr, METH_O, _curses_panel_panel_set_userptr__doc__}, + {"set_userptr", (PyCFunction)(void(*)(void))_curses_panel_panel_set_userptr, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_set_userptr__doc__}, + +static PyObject * +_curses_panel_panel_set_userptr_impl(PyCursesPanelObject *self, + PyTypeObject *cls, PyObject *obj); + +static PyObject * +_curses_panel_panel_set_userptr(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = {"O:set_userptr", _keywords, 0}; + PyObject *obj; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &obj)) { + goto exit; + } + return_value = _curses_panel_panel_set_userptr_impl(self, cls, obj); + +exit: + return return_value; +} PyDoc_STRVAR(_curses_panel_panel_userptr__doc__, "userptr($self, /)\n" @@ -230,15 +294,27 @@ PyDoc_STRVAR(_curses_panel_panel_userptr__doc__, "Return the user pointer for the panel."); #define _CURSES_PANEL_PANEL_USERPTR_METHODDEF \ - {"userptr", (PyCFunction)_curses_panel_panel_userptr, METH_NOARGS, _curses_panel_panel_userptr__doc__}, + {"userptr", (PyCFunction)(void(*)(void))_curses_panel_panel_userptr, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_userptr__doc__}, static PyObject * -_curses_panel_panel_userptr_impl(PyCursesPanelObject *self); +_curses_panel_panel_userptr_impl(PyCursesPanelObject *self, + PyTypeObject *cls); static PyObject * -_curses_panel_panel_userptr(PyCursesPanelObject *self, PyObject *Py_UNUSED(ignored)) +_curses_panel_panel_userptr(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _curses_panel_panel_userptr_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":userptr", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _curses_panel_panel_userptr_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(_curses_panel_bottom_panel__doc__, @@ -325,4 +401,4 @@ _curses_panel_update_panels(PyObject *module, PyObject *Py_UNUSED(ignored)) { return _curses_panel_update_panels_impl(module); } -/*[clinic end generated code: output=1226d5f94361ebfb input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3081ef24e5560cb0 input=a9049054013a1b77]*/ From ad7962af30a796caf597f2c5ebf983a18ba7bec1 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 7 Sep 2020 18:55:22 +0300 Subject: [PATCH 0055/1261] bpo-41720: Add "return NotImplemented" in turtle.Vec2D.__rmul__(). (GH-22092) --- Lib/test/test_turtle.py | 18 ++++++++++++++++-- Lib/turtle.py | 1 + .../2020-09-04-20-45-38.bpo-41720.PW9MzZ.rst | 2 ++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-04-20-45-38.bpo-41720.PW9MzZ.rst diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index 46ff4a3aac709a..86d65075144753 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -130,6 +130,14 @@ def assertVectorsAlmostEqual(self, vec1, vec2): self.assertAlmostEqual( i, j, msg='values at index {} do not match'.format(idx)) +class Multiplier: + + def __mul__(self, other): + return f'M*{other}' + + def __rmul__(self, other): + return f'{other}*M' + class TestVec2D(VectorComparisonMixin, unittest.TestCase): @@ -211,9 +219,15 @@ def test_vector_multiply(self): self.assertAlmostEqual(answer, expected) vec = Vec2D(0.5, 3) - answer = vec * 10 expected = Vec2D(5, 30) - self.assertVectorsAlmostEqual(answer, expected) + self.assertVectorsAlmostEqual(vec * 10, expected) + self.assertVectorsAlmostEqual(10 * vec, expected) + self.assertVectorsAlmostEqual(vec * 10.0, expected) + self.assertVectorsAlmostEqual(10.0 * vec, expected) + + M = Multiplier() + self.assertEqual(vec * M, Vec2D(f"{vec[0]}*M", f"{vec[1]}*M")) + self.assertEqual(M * vec, f'M*{vec}') def test_vector_negative(self): vec = Vec2D(10, -10) diff --git a/Lib/turtle.py b/Lib/turtle.py index 92d4e5dda9c2db..81cfcfe8a70144 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -258,6 +258,7 @@ def __mul__(self, other): def __rmul__(self, other): if isinstance(other, int) or isinstance(other, float): return Vec2D(self[0]*other, self[1]*other) + return NotImplemented def __sub__(self, other): return Vec2D(self[0]-other[0], self[1]-other[1]) def __neg__(self): diff --git a/Misc/NEWS.d/next/Library/2020-09-04-20-45-38.bpo-41720.PW9MzZ.rst b/Misc/NEWS.d/next/Library/2020-09-04-20-45-38.bpo-41720.PW9MzZ.rst new file mode 100644 index 00000000000000..5d2a5094ddeaa6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-04-20-45-38.bpo-41720.PW9MzZ.rst @@ -0,0 +1,2 @@ +Fixed :meth:`turtle.Vec2D.__rmul__` for arguments which are not int or +float. From 450713d3cee6c3c14c2119330ed29cf6423f5536 Mon Sep 17 00:00:00 2001 From: Artem Bulgakov Date: Mon, 7 Sep 2020 19:46:33 +0300 Subject: [PATCH 0056/1261] bpo-41316: Make tarfile follow specs for FNAME (GH-21511) tarfile writes full path to FNAME field of GZIP format instead of just basename if user specified absolute path. Some archive viewers may process file incorrectly. Also it creates security issue because anyone can know structure of directories on system and know username or other personal information. RFC1952 says about FNAME: This is the original name of the file being compressed, with any directory components removed. So tarfile must remove directory names from FNAME and write only basename of file. Automerge-Triggered-By: @jaraco --- Lib/tarfile.py | 2 ++ Lib/test/test_tarfile.py | 14 +++++++++++++- Misc/ACKS | 1 + .../2020-07-28-12-08-58.bpo-41316.bSCbK4.rst | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-07-28-12-08-58.bpo-41316.bSCbK4.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 6769066cabd6fc..1fae29430fefff 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -420,6 +420,8 @@ def _init_write_gz(self): self.__write(b"\037\213\010\010" + timestamp + b"\002\377") if self.name.endswith(".gz"): self.name = self.name[:-3] + # Honor "directory components removed" from RFC1952 + self.name = os.path.basename(self.name) # RFC1952 says we must use ISO-8859-1 for the FNAME field. self.__write(self.name.encode("iso-8859-1", "replace") + NUL) diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 4ef20db0971636..7b34d53d216013 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1417,12 +1417,15 @@ def write(self, data): pax_headers={'non': 'empty'}) self.assertFalse(f.closed) + class GzipWriteTest(GzipTest, WriteTest): pass + class Bz2WriteTest(Bz2Test, WriteTest): pass + class LzmaWriteTest(LzmaTest, WriteTest): pass @@ -1465,8 +1468,17 @@ def test_file_mode(self): finally: os.umask(original_umask) + class GzipStreamWriteTest(GzipTest, StreamWriteTest): - pass + def test_source_directory_not_leaked(self): + """ + Ensure the source directory is not included in the tar header + per bpo-41316. + """ + tarfile.open(tmpname, self.mode).close() + payload = pathlib.Path(tmpname).read_text(encoding='latin-1') + assert os.path.dirname(tmpname) not in payload + class Bz2StreamWriteTest(Bz2Test, StreamWriteTest): decompressor = bz2.BZ2Decompressor if bz2 else None diff --git a/Misc/ACKS b/Misc/ACKS index a2cdeb85040599..8b0d7a45da1695 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -242,6 +242,7 @@ Colm Buckley Erik de Bueger Jan-Hein Bührman Lars Buitinck +Artem Bulgakov Dick Bulterman Bill Bumgarner Jimmy Burgett diff --git a/Misc/NEWS.d/next/Library/2020-07-28-12-08-58.bpo-41316.bSCbK4.rst b/Misc/NEWS.d/next/Library/2020-07-28-12-08-58.bpo-41316.bSCbK4.rst new file mode 100644 index 00000000000000..139a170866ed49 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-07-28-12-08-58.bpo-41316.bSCbK4.rst @@ -0,0 +1 @@ +Fix the :mod:`tarfile` module to write only basename of TAR file to GZIP compression header. \ No newline at end of file From 4a63cea0c2f31d0b2fc66e0c6e61f986ed1aaefd Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Mon, 7 Sep 2020 23:26:54 +0200 Subject: [PATCH 0057/1261] bpo-40744: Drop support for SQLite pre 3.7.3 (GH-20909) Remove code required to support SQLite pre 3.7.3. Co-written-by: Berker Peksag Co-written-by: Sergey Fedoseev --- Doc/library/sqlite3.rst | 8 +-- Doc/whatsnew/3.10.rst | 5 ++ Lib/sqlite3/test/backup.py | 1 - Lib/sqlite3/test/dbapi.py | 6 -- Lib/sqlite3/test/hooks.py | 6 -- Lib/sqlite3/test/regression.py | 1 - Lib/sqlite3/test/transactions.py | 4 -- Lib/sqlite3/test/types.py | 2 - .../2020-05-30-08-10-23.bpo-40744.jKURVV.rst | 4 ++ Modules/_sqlite/connection.c | 57 +++---------------- Modules/_sqlite/module.c | 25 +++----- setup.py | 4 +- 12 files changed, 29 insertions(+), 94 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-05-30-08-10-23.bpo-40744.jKURVV.rst diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index ccb82278bdaa13..13aa8c512d0319 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -18,7 +18,8 @@ application using SQLite and then port the code to a larger database such as PostgreSQL or Oracle. The sqlite3 module was written by Gerhard Häring. It provides a SQL interface -compliant with the DB-API 2.0 specification described by :pep:`249`. +compliant with the DB-API 2.0 specification described by :pep:`249`, and +requires SQLite 3.7.3 or newer. To use the module, you must first create a :class:`Connection` object that represents the database. Here the data will be stored in the @@ -591,8 +592,6 @@ Connection Objects dest = sqlite3.connect(':memory:') source.backup(dest) - Availability: SQLite 3.6.11 or higher - .. versionadded:: 3.7 @@ -701,9 +700,6 @@ Cursor Objects statements because we cannot determine the number of rows a query produced until all rows were fetched. - With SQLite versions before 3.6.5, :attr:`rowcount` is set to 0 if - you make a ``DELETE FROM table`` without any condition. - .. attribute:: lastrowid This read-only attribute provides the rowid of the last modified row. It is diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index eb5ae01a7c04d4..f6f276a8bfa495 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -191,10 +191,15 @@ that may require changes to your code. Build Changes ============= + * The C99 functions :c:func:`snprintf` and :c:func:`vsnprintf` are now required to build Python. (Contributed by Victor Stinner in :issue:`36020`.) +* :mod:`sqlite3` requires SQLite 3.7.3 or higher. + (Contributed by Sergey Fedoseev and Erlend E. Aasland :issue:`40744`.) + + C API Changes ============= diff --git a/Lib/sqlite3/test/backup.py b/Lib/sqlite3/test/backup.py index 903bacf490301c..2752a4db337ddd 100644 --- a/Lib/sqlite3/test/backup.py +++ b/Lib/sqlite3/test/backup.py @@ -2,7 +2,6 @@ import unittest -@unittest.skipIf(sqlite.sqlite_version_info < (3, 6, 11), "Backup API not supported") class BackupTests(unittest.TestCase): def setUp(self): cx = self.cx = sqlite.connect(":memory:") diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py index 119da12170331f..a8dfeb9b2d6933 100644 --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -185,12 +185,6 @@ def CheckOpenUri(self): with self.assertRaises(sqlite.OperationalError): cx.execute('insert into test(id) values(1)') - @unittest.skipIf(sqlite.sqlite_version_info >= (3, 3, 1), - 'needs sqlite versions older than 3.3.1') - def CheckSameThreadErrorOnOldVersion(self): - with self.assertRaises(sqlite.NotSupportedError) as cm: - sqlite.connect(':memory:', check_same_thread=False) - self.assertEqual(str(cm.exception), 'shared connections not available') class CursorTests(unittest.TestCase): def setUp(self): diff --git a/Lib/sqlite3/test/hooks.py b/Lib/sqlite3/test/hooks.py index b08adf1d8097b3..2e620ecdf864cb 100644 --- a/Lib/sqlite3/test/hooks.py +++ b/Lib/sqlite3/test/hooks.py @@ -61,8 +61,6 @@ def upper(self): self.assertEqual(result[0][0], 'b') self.assertEqual(result[1][0], 'a') - @unittest.skipIf(sqlite.sqlite_version_info < (3, 2, 1), - 'old SQLite versions crash on this test') def CheckCollationIsUsed(self): def mycoll(x, y): # reverse order @@ -240,16 +238,12 @@ def trace(statement): traced_statements.append(statement) con.set_trace_callback(trace) con.execute("create table foo(x)") - # Can't execute bound parameters as their values don't appear - # in traced statements before SQLite 3.6.21 - # (cf. http://www.sqlite.org/draft/releaselog/3_6_21.html) con.execute('insert into foo(x) values ("%s")' % unicode_value) con.commit() self.assertTrue(any(unicode_value in stmt for stmt in traced_statements), "Unicode data %s garbled in trace callback: %s" % (ascii(unicode_value), ', '.join(map(ascii, traced_statements)))) - @unittest.skipIf(sqlite.sqlite_version_info < (3, 3, 9), "sqlite3_prepare_v2 is not available") def CheckTraceCallbackContent(self): # set_trace_callback() shouldn't produce duplicate content (bpo-26187) traced_statements = [] diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index cbd46d4978afb9..0735a5c129226d 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -87,7 +87,6 @@ def CheckStatementFinalizationOnCloseDb(self): cur.execute("select 1 x union select " + str(i)) con.close() - @unittest.skipIf(sqlite.sqlite_version_info < (3, 2, 2), 'needs sqlite 3.2.2 or newer') def CheckOnConflictRollback(self): con = sqlite.connect(":memory:") con.execute("create table foo(x, unique(x) on conflict rollback)") diff --git a/Lib/sqlite3/test/transactions.py b/Lib/sqlite3/test/transactions.py index b8a13de55bc720..c463f7490da573 100644 --- a/Lib/sqlite3/test/transactions.py +++ b/Lib/sqlite3/test/transactions.py @@ -111,16 +111,12 @@ def CheckToggleAutoCommit(self): res = self.cur2.fetchall() self.assertEqual(len(res), 1) - @unittest.skipIf(sqlite.sqlite_version_info < (3, 2, 2), - 'test hangs on sqlite versions older than 3.2.2') def CheckRaiseTimeout(self): self.cur1.execute("create table test(i)") self.cur1.execute("insert into test(i) values (5)") with self.assertRaises(sqlite.OperationalError): self.cur2.execute("insert into test(i) values (5)") - @unittest.skipIf(sqlite.sqlite_version_info < (3, 2, 2), - 'test hangs on sqlite versions older than 3.2.2') def CheckLocking(self): """ This tests the improved concurrency with pysqlite 2.3.4. You needed diff --git a/Lib/sqlite3/test/types.py b/Lib/sqlite3/test/types.py index d26a9cb93f0888..75a9d5601d5808 100644 --- a/Lib/sqlite3/test/types.py +++ b/Lib/sqlite3/test/types.py @@ -401,8 +401,6 @@ def CheckSqliteTimestamp(self): ts2 = self.cur.fetchone()[0] self.assertEqual(ts, ts2) - @unittest.skipIf(sqlite.sqlite_version_info < (3, 1), - 'the date functions are available on 3.1 or later') def CheckSqlTimestamp(self): now = datetime.datetime.utcnow() self.cur.execute("insert into test(ts) values (current_timestamp)") diff --git a/Misc/NEWS.d/next/Library/2020-05-30-08-10-23.bpo-40744.jKURVV.rst b/Misc/NEWS.d/next/Library/2020-05-30-08-10-23.bpo-40744.jKURVV.rst new file mode 100644 index 00000000000000..2d1d1f9a20e32e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-05-30-08-10-23.bpo-40744.jKURVV.rst @@ -0,0 +1,4 @@ +The :mod:`sqlite3` module uses SQLite API functions that require SQLite +v3.7.3 or higher. This patch removes support for older SQLite versions, and +explicitly requires SQLite 3.7.3 both at build, compile and runtime. Patch by +Sergey Fedoseev and Erlend E. Aasland. diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 1bf9710763a5ab..f765ba1df24669 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -33,16 +33,6 @@ #define ACTION_FINALIZE 1 #define ACTION_RESET 2 -#if SQLITE_VERSION_NUMBER >= 3003008 -#ifndef SQLITE_OMIT_LOAD_EXTENSION -#define HAVE_LOAD_EXTENSION -#endif -#endif - -#if SQLITE_VERSION_NUMBER >= 3006011 -#define HAVE_BACKUP_API -#endif - #if SQLITE_VERSION_NUMBER >= 3014000 #define HAVE_TRACE_V2 #endif @@ -61,18 +51,6 @@ static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, Py static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self); -static void _sqlite3_result_error(sqlite3_context* ctx, const char* errmsg, int len) -{ - /* in older SQLite versions, calling sqlite3_result_error in callbacks - * triggers a bug in SQLite that leads either to irritating results or - * segfaults, depending on the SQLite version */ -#if SQLITE_VERSION_NUMBER >= 3003003 - sqlite3_result_error(ctx, errmsg, len); -#else - PyErr_SetString(pysqlite_OperationalError, errmsg); -#endif -} - int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) { static char *kwlist[] = { @@ -182,10 +160,6 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject self->timeout = timeout; (void)sqlite3_busy_timeout(self->db, (int)(timeout*1000)); self->thread_ident = PyThread_get_thread_ident(); - if (!check_same_thread && sqlite3_libversion_number() < 3003001) { - PyErr_SetString(pysqlite_NotSupportedError, "shared connections not available"); - return -1; - } self->check_same_thread = check_same_thread; self->function_pinboard_trace_callback = NULL; @@ -620,7 +594,7 @@ void _pysqlite_func_callback(sqlite3_context* context, int argc, sqlite3_value** } else { PyErr_Clear(); } - _sqlite3_result_error(context, "user-defined function raised exception", -1); + sqlite3_result_error(context, "user-defined function raised exception", -1); } PyGILState_Release(threadstate); @@ -652,7 +626,7 @@ static void _pysqlite_step_callback(sqlite3_context *context, int argc, sqlite3_ } else { PyErr_Clear(); } - _sqlite3_result_error(context, "user-defined aggregate's '__init__' method raised error", -1); + sqlite3_result_error(context, "user-defined aggregate's '__init__' method raised error", -1); goto error; } } @@ -676,7 +650,7 @@ static void _pysqlite_step_callback(sqlite3_context *context, int argc, sqlite3_ } else { PyErr_Clear(); } - _sqlite3_result_error(context, "user-defined aggregate's 'step' method raised error", -1); + sqlite3_result_error(context, "user-defined aggregate's 'step' method raised error", -1); } error: @@ -693,7 +667,6 @@ void _pysqlite_final_callback(sqlite3_context* context) _Py_IDENTIFIER(finalize); int ok; PyObject *exception, *value, *tb; - int restore; PyGILState_STATE threadstate; @@ -709,7 +682,6 @@ void _pysqlite_final_callback(sqlite3_context* context) /* Keep the exception (if any) of the last call to step() */ PyErr_Fetch(&exception, &value, &tb); - restore = 1; function_result = _PyObject_CallMethodIdNoArgs(*aggregate_instance, &PyId_finalize); @@ -726,19 +698,12 @@ void _pysqlite_final_callback(sqlite3_context* context) } else { PyErr_Clear(); } - _sqlite3_result_error(context, "user-defined aggregate's 'finalize' method raised error", -1); -#if SQLITE_VERSION_NUMBER < 3003003 - /* with old SQLite versions, _sqlite3_result_error() sets a new Python - exception, so don't restore the previous exception */ - restore = 0; -#endif + sqlite3_result_error(context, "user-defined aggregate's 'finalize' method raised error", -1); } - if (restore) { - /* Restore the exception (if any) of the last call to step(), - but clear also the current exception if finalize() failed */ - PyErr_Restore(exception, value, tb); - } + /* Restore the exception (if any) of the last call to step(), + but clear also the current exception if finalize() failed */ + PyErr_Restore(exception, value, tb); error: PyGILState_Release(threadstate); @@ -1110,7 +1075,7 @@ static PyObject* pysqlite_connection_set_trace_callback(pysqlite_Connection* sel Py_RETURN_NONE; } -#ifdef HAVE_LOAD_EXTENSION +#ifndef SQLITE_OMIT_LOAD_EXTENSION static PyObject* pysqlite_enable_load_extension(pysqlite_Connection* self, PyObject* args) { int rc; @@ -1513,7 +1478,6 @@ pysqlite_connection_iterdump(pysqlite_Connection* self, PyObject* args) return retval; } -#ifdef HAVE_BACKUP_API static PyObject * pysqlite_connection_backup(pysqlite_Connection *self, PyObject *args, PyObject *kwds) { @@ -1664,7 +1628,6 @@ pysqlite_connection_backup(pysqlite_Connection *self, PyObject *args, PyObject * return NULL; } } -#endif static PyObject * pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) @@ -1816,7 +1779,7 @@ static PyMethodDef connection_methods[] = { PyDoc_STR("Creates a new aggregate. Non-standard.")}, {"set_authorizer", (PyCFunction)(void(*)(void))pysqlite_connection_set_authorizer, METH_VARARGS|METH_KEYWORDS, PyDoc_STR("Sets authorizer callback. Non-standard.")}, - #ifdef HAVE_LOAD_EXTENSION + #ifndef SQLITE_OMIT_LOAD_EXTENSION {"enable_load_extension", (PyCFunction)pysqlite_enable_load_extension, METH_VARARGS, PyDoc_STR("Enable dynamic loading of SQLite extension modules. Non-standard.")}, {"load_extension", (PyCFunction)pysqlite_load_extension, METH_VARARGS, @@ -1838,10 +1801,8 @@ static PyMethodDef connection_methods[] = { PyDoc_STR("Abort any pending database operation. Non-standard.")}, {"iterdump", (PyCFunction)pysqlite_connection_iterdump, METH_NOARGS, PyDoc_STR("Returns iterator to the dump of the database in an SQL text format. Non-standard.")}, - #ifdef HAVE_BACKUP_API {"backup", (PyCFunction)(void(*)(void))pysqlite_connection_backup, METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Makes a backup of the database. Non-standard.")}, - #endif {"__enter__", (PyCFunction)pysqlite_connection_enter, METH_NOARGS, PyDoc_STR("For context manager. Non-standard.")}, {"__exit__", (PyCFunction)pysqlite_connection_exit, METH_VARARGS, diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 71d951ee887e47..82f58eb2480261 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -29,8 +29,8 @@ #include "microprotocols.h" #include "row.h" -#if SQLITE_VERSION_NUMBER >= 3003003 -#define HAVE_SHARED_CACHE +#if SQLITE_VERSION_NUMBER < 3007003 +#error "SQLite 3.7.3 or higher required" #endif /* static objects at module-level */ @@ -131,7 +131,6 @@ PyDoc_STRVAR(module_complete_doc, \n\ Checks if a string contains a complete SQL statement. Non-standard."); -#ifdef HAVE_SHARED_CACHE static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyObject* kwargs) { @@ -159,7 +158,6 @@ PyDoc_STRVAR(module_enable_shared_cache_doc, \n\ Enable or disable shared cache mode for the calling thread.\n\ Experimental/Non-standard."); -#endif /* HAVE_SHARED_CACHE */ static PyObject* module_register_adapter(PyObject* self, PyObject* args) { @@ -253,10 +251,8 @@ static PyMethodDef module_methods[] = { METH_VARARGS | METH_KEYWORDS, module_connect_doc}, {"complete_statement", (PyCFunction)(void(*)(void))module_complete, METH_VARARGS | METH_KEYWORDS, module_complete_doc}, -#ifdef HAVE_SHARED_CACHE {"enable_shared_cache", (PyCFunction)(void(*)(void))module_enable_shared_cache, METH_VARARGS | METH_KEYWORDS, module_enable_shared_cache_doc}, -#endif {"register_adapter", (PyCFunction)module_register_adapter, METH_VARARGS, module_register_adapter_doc}, {"register_converter", (PyCFunction)module_register_converter, @@ -307,29 +303,17 @@ static const IntConstantPair _int_constants[] = { {"SQLITE_UPDATE", SQLITE_UPDATE}, {"SQLITE_ATTACH", SQLITE_ATTACH}, {"SQLITE_DETACH", SQLITE_DETACH}, -#if SQLITE_VERSION_NUMBER >= 3002001 {"SQLITE_ALTER_TABLE", SQLITE_ALTER_TABLE}, {"SQLITE_REINDEX", SQLITE_REINDEX}, -#endif -#if SQLITE_VERSION_NUMBER >= 3003000 {"SQLITE_ANALYZE", SQLITE_ANALYZE}, -#endif -#if SQLITE_VERSION_NUMBER >= 3003007 {"SQLITE_CREATE_VTABLE", SQLITE_CREATE_VTABLE}, {"SQLITE_DROP_VTABLE", SQLITE_DROP_VTABLE}, -#endif -#if SQLITE_VERSION_NUMBER >= 3003008 {"SQLITE_FUNCTION", SQLITE_FUNCTION}, -#endif -#if SQLITE_VERSION_NUMBER >= 3006008 {"SQLITE_SAVEPOINT", SQLITE_SAVEPOINT}, -#endif #if SQLITE_VERSION_NUMBER >= 3008003 {"SQLITE_RECURSIVE", SQLITE_RECURSIVE}, #endif -#if SQLITE_VERSION_NUMBER >= 3006011 {"SQLITE_DONE", SQLITE_DONE}, -#endif {(char*)NULL, 0} }; @@ -360,6 +344,11 @@ PyMODINIT_FUNC PyInit__sqlite3(void) PyObject *tmp_obj; int i; + if (sqlite3_libversion_number() < 3007003) { + PyErr_SetString(PyExc_ImportError, MODULE_NAME ": SQLite 3.7.3 or higher required"); + return NULL; + } + module = PyModule_Create(&_sqlite3module); if (!module || diff --git a/setup.py b/setup.py index 21a5a58981fc15..04b1358bc916e1 100644 --- a/setup.py +++ b/setup.py @@ -1452,7 +1452,6 @@ def detect_sqlite(self): sqlite_setup_debug = False # verbose debug prints from this script? # We hunt for #define SQLITE_VERSION "n.n.n" - # We need to find >= sqlite version 3.3.9, for sqlite3_prepare_v2 sqlite_incdir = sqlite_libdir = None sqlite_inc_paths = [ '/usr/include', '/usr/include/sqlite', @@ -1463,7 +1462,8 @@ def detect_sqlite(self): ] if CROSS_COMPILING: sqlite_inc_paths = [] - MIN_SQLITE_VERSION_NUMBER = (3, 7, 2) + # We need to find >= sqlite version 3.7.3, for sqlite3_create_function_v2() + MIN_SQLITE_VERSION_NUMBER = (3, 7, 3) MIN_SQLITE_VERSION = ".".join([str(x) for x in MIN_SQLITE_VERSION_NUMBER]) From e787cc1041430bf8e7eeda29a7568199a793b251 Mon Sep 17 00:00:00 2001 From: dxflores Date: Tue, 8 Sep 2020 08:28:45 +0100 Subject: [PATCH 0058/1261] bpo-41732: add iterator to memoryview (GH-22119) --- .../2020-09-06-20-27-10.bpo-41732.1SKv26.rst | 1 + Objects/memoryobject.c | 108 +++++++++++++++++- 2 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-06-20-27-10.bpo-41732.1SKv26.rst diff --git a/Misc/NEWS.d/next/Library/2020-09-06-20-27-10.bpo-41732.1SKv26.rst b/Misc/NEWS.d/next/Library/2020-09-06-20-27-10.bpo-41732.1SKv26.rst new file mode 100644 index 00000000000000..caf237f37f4dee --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-06-20-27-10.bpo-41732.1SKv26.rst @@ -0,0 +1 @@ +Added an :term:`iterator` to :class:`memoryview`. diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 13d883ae4d35d6..d328f4d40b7a42 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -3160,6 +3160,112 @@ static PyMethodDef memory_methods[] = { {NULL, NULL} }; +/**************************************************************************/ +/* Memoryview Iterator */ +/**************************************************************************/ + +static PyTypeObject PyMemoryIter_Type; + +typedef struct { + PyObject_HEAD + Py_ssize_t it_index; + PyMemoryViewObject *it_seq; // Set to NULL when iterator is exhausted + Py_ssize_t it_length; + const char *it_fmt; +} memoryiterobject; + +static void +memoryiter_dealloc(memoryiterobject *it) +{ + _PyObject_GC_UNTRACK(it); + Py_XDECREF(it->it_seq); + PyObject_GC_Del(it); +} + +static int +memoryiter_traverse(memoryiterobject *it, visitproc visit, void *arg) +{ + Py_VISIT(it->it_seq); + return 0; +} + +static PyObject * +memoryiter_next(memoryiterobject *it) +{ + PyMemoryViewObject *seq; + seq = it->it_seq; + if (seq == NULL) { + return NULL; + } + + if (it->it_index < it->it_length) { + CHECK_RELEASED(seq); + Py_buffer *view = &(seq->view); + char *ptr = (char *)seq->view.buf; + + ptr += view->strides[0] * it->it_index++; + ptr = ADJUST_PTR(ptr, view->suboffsets, 0); + if (ptr == NULL) { + return NULL; + } + return unpack_single(ptr, it->it_fmt); + } + + it->it_seq = NULL; + Py_DECREF(seq); + return NULL; +} + +static PyObject * +memory_iter(PyObject *seq) +{ + if (!PyMemoryView_Check(seq)) { + PyErr_BadInternalCall(); + return NULL; + } + PyMemoryViewObject *obj = (PyMemoryViewObject *)seq; + int ndims = obj->view.ndim; + if (ndims == 0) { + PyErr_SetString(PyExc_TypeError, "invalid indexing of 0-dim memory"); + return NULL; + } + if (ndims != 1) { + PyErr_SetString(PyExc_NotImplementedError, + "multi-dimensional sub-views are not implemented"); + return NULL; + } + + const char *fmt = adjust_fmt(&obj->view); + if (fmt == NULL) { + return NULL; + } + + memoryiterobject *it; + it = PyObject_GC_New(memoryiterobject, &PyMemoryIter_Type); + if (it == NULL) { + return NULL; + } + it->it_fmt = fmt; + it->it_length = memory_length(obj); + it->it_index = 0; + Py_INCREF(seq); + it->it_seq = obj; + _PyObject_GC_TRACK(it); + return (PyObject *)it; +} + +static PyTypeObject PyMemoryIter_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + .tp_name = "memory_iterator", + .tp_basicsize = sizeof(memoryiterobject), + // methods + .tp_dealloc = (destructor)memoryiter_dealloc, + .tp_getattro = PyObject_GenericGetAttr, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .tp_traverse = (traverseproc)memoryiter_traverse, + .tp_iter = PyObject_SelfIter, + .tp_iternext = (iternextfunc)memoryiter_next, +}; PyTypeObject PyMemoryView_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) @@ -3187,7 +3293,7 @@ PyTypeObject PyMemoryView_Type = { (inquiry)memory_clear, /* tp_clear */ memory_richcompare, /* tp_richcompare */ offsetof(PyMemoryViewObject, weakreflist),/* tp_weaklistoffset */ - 0, /* tp_iter */ + memory_iter, /* tp_iter */ 0, /* tp_iternext */ memory_methods, /* tp_methods */ 0, /* tp_members */ From 803c3569e05ac7ec6e95b9e116a0ac6fceac2373 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Tue, 8 Sep 2020 03:59:15 -0500 Subject: [PATCH 0059/1261] bpo-1635741: Port the termios to multi-phase init (PEP 489) (GH-22139) --- ...2020-09-07-11-35-02.bpo-1635741.rvIexb.rst | 2 + Modules/termios.c | 182 ++++++++++-------- 2 files changed, 103 insertions(+), 81 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-07-11-35-02.bpo-1635741.rvIexb.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-07-11-35-02.bpo-1635741.rvIexb.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-07-11-35-02.bpo-1635741.rvIexb.rst new file mode 100644 index 00000000000000..1e19b34b372d89 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-07-11-35-02.bpo-1635741.rvIexb.rst @@ -0,0 +1,2 @@ +Port the :mod:`termios` extension module to multi-phase initialization +(:pep:`489`). diff --git a/Modules/termios.c b/Modules/termios.c index 178ae4ee6e41dd..cc0d5853f85e35 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -51,8 +51,6 @@ get_termios_state(PyObject *module) return (termiosmodulestate *)state; } -#define modulestate_global get_termios_state(PyState_FindModule(&termiosmodule)) - static int fdconv(PyObject* obj, void* p) { int fd; @@ -79,31 +77,32 @@ indexing in the cc array must be done using the symbolic constants defined\n\ in this module."); static PyObject * -termios_tcgetattr(PyObject *self, PyObject *args) +termios_tcgetattr(PyObject *module, PyObject *args) { int fd; - struct termios mode; - PyObject *cc; - speed_t ispeed, ospeed; - PyObject *v; - int i; - char ch; - if (!PyArg_ParseTuple(args, "O&:tcgetattr", - fdconv, (void*)&fd)) + fdconv, (void*)&fd)) { return NULL; + } - if (tcgetattr(fd, &mode) == -1) - return PyErr_SetFromErrno(modulestate_global->TermiosError); + termiosmodulestate *state = PyModule_GetState(module); + struct termios mode; + if (tcgetattr(fd, &mode) == -1) { + return PyErr_SetFromErrno(state->TermiosError); + } - ispeed = cfgetispeed(&mode); - ospeed = cfgetospeed(&mode); + speed_t ispeed = cfgetispeed(&mode); + speed_t ospeed = cfgetospeed(&mode); - cc = PyList_New(NCCS); - if (cc == NULL) + PyObject *cc = PyList_New(NCCS); + if (cc == NULL) { return NULL; + } + + PyObject *v; + int i; for (i = 0; i < NCCS; i++) { - ch = (char)mode.c_cc[i]; + char ch = (char)mode.c_cc[i]; v = PyBytes_FromStringAndSize(&ch, 1); if (v == NULL) goto err; @@ -156,17 +155,15 @@ queued output, or termios.TCSAFLUSH to change after transmitting all\n\ queued output and discarding all queued input. "); static PyObject * -termios_tcsetattr(PyObject *self, PyObject *args) +termios_tcsetattr(PyObject *module, PyObject *args) { int fd, when; - struct termios mode; - speed_t ispeed, ospeed; - PyObject *term, *cc, *v; - int i; - + PyObject *term; if (!PyArg_ParseTuple(args, "O&iO:tcsetattr", - fdconv, &fd, &when, &term)) + fdconv, &fd, &when, &term)) { return NULL; + } + if (!PyList_Check(term) || PyList_Size(term) != 7) { PyErr_SetString(PyExc_TypeError, "tcsetattr, arg 3: must be 7 element list"); @@ -174,18 +171,22 @@ termios_tcsetattr(PyObject *self, PyObject *args) } /* Get the old mode, in case there are any hidden fields... */ - termiosmodulestate *state = modulestate_global; - if (tcgetattr(fd, &mode) == -1) + termiosmodulestate *state = PyModule_GetState(module); + struct termios mode; + if (tcgetattr(fd, &mode) == -1) { return PyErr_SetFromErrno(state->TermiosError); + } + mode.c_iflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 0)); mode.c_oflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 1)); mode.c_cflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 2)); mode.c_lflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 3)); - ispeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 4)); - ospeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 5)); - cc = PyList_GetItem(term, 6); - if (PyErr_Occurred()) + speed_t ispeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 4)); + speed_t ospeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 5)); + PyObject *cc = PyList_GetItem(term, 6); + if (PyErr_Occurred()) { return NULL; + } if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) { PyErr_Format(PyExc_TypeError, @@ -194,6 +195,8 @@ termios_tcsetattr(PyObject *self, PyObject *args) return NULL; } + int i; + PyObject *v; for (i = 0; i < NCCS; i++) { v = PyList_GetItem(cc, i); @@ -226,15 +229,18 @@ A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n\ has a system dependent meaning."); static PyObject * -termios_tcsendbreak(PyObject *self, PyObject *args) +termios_tcsendbreak(PyObject *module, PyObject *args) { int fd, duration; - if (!PyArg_ParseTuple(args, "O&i:tcsendbreak", - fdconv, &fd, &duration)) + fdconv, &fd, &duration)) { return NULL; - if (tcsendbreak(fd, duration) == -1) - return PyErr_SetFromErrno(modulestate_global->TermiosError); + } + + termiosmodulestate *state = PyModule_GetState(module); + if (tcsendbreak(fd, duration) == -1) { + return PyErr_SetFromErrno(state->TermiosError); + } Py_RETURN_NONE; } @@ -245,15 +251,18 @@ PyDoc_STRVAR(termios_tcdrain__doc__, Wait until all output written to file descriptor fd has been transmitted."); static PyObject * -termios_tcdrain(PyObject *self, PyObject *args) +termios_tcdrain(PyObject *module, PyObject *args) { int fd; - if (!PyArg_ParseTuple(args, "O&:tcdrain", - fdconv, &fd)) + fdconv, &fd)) { return NULL; - if (tcdrain(fd) == -1) - return PyErr_SetFromErrno(modulestate_global->TermiosError); + } + + termiosmodulestate *state = PyModule_GetState(module); + if (tcdrain(fd) == -1) { + return PyErr_SetFromErrno(state->TermiosError); + } Py_RETURN_NONE; } @@ -267,15 +276,18 @@ queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n\ both queues. "); static PyObject * -termios_tcflush(PyObject *self, PyObject *args) +termios_tcflush(PyObject *module, PyObject *args) { int fd, queue; - if (!PyArg_ParseTuple(args, "O&i:tcflush", - fdconv, &fd, &queue)) + fdconv, &fd, &queue)) { return NULL; - if (tcflush(fd, queue) == -1) - return PyErr_SetFromErrno(modulestate_global->TermiosError); + } + + termiosmodulestate *state = PyModule_GetState(module); + if (tcflush(fd, queue) == -1) { + return PyErr_SetFromErrno(state->TermiosError); + } Py_RETURN_NONE; } @@ -289,15 +301,18 @@ termios.TCOON to restart output, termios.TCIOFF to suspend input,\n\ or termios.TCION to restart input."); static PyObject * -termios_tcflow(PyObject *self, PyObject *args) +termios_tcflow(PyObject *module, PyObject *args) { int fd, action; - if (!PyArg_ParseTuple(args, "O&i:tcflow", - fdconv, &fd, &action)) + fdconv, &fd, &action)) { return NULL; - if (tcflow(fd, action) == -1) - return PyErr_SetFromErrno(modulestate_global->TermiosError); + } + + termiosmodulestate *state = PyModule_GetState(module); + if (tcflow(fd, action) == -1) { + return PyErr_SetFromErrno(state->TermiosError); + } Py_RETURN_NONE; } @@ -997,44 +1012,49 @@ static void termiosmodule_free(void *m) { termiosmodule_clear((PyObject *)m); } -static struct PyModuleDef termiosmodule = { - PyModuleDef_HEAD_INIT, - "termios", - termios__doc__, - sizeof(termiosmodulestate), - termios_methods, - NULL, - termiosmodule_traverse, - termiosmodule_clear, - termiosmodule_free, -}; - -PyMODINIT_FUNC -PyInit_termios(void) +static int +termios_exec(PyObject *mod) { - PyObject *m; struct constant *constant = termios_constants; - - if ((m = PyState_FindModule(&termiosmodule)) != NULL) { - Py_INCREF(m); - return m; - } - - if ((m = PyModule_Create(&termiosmodule)) == NULL) { - return NULL; - } - - termiosmodulestate *state = get_termios_state(m); + termiosmodulestate *state = get_termios_state(mod); state->TermiosError = PyErr_NewException("termios.error", NULL, NULL); if (state->TermiosError == NULL) { - return NULL; + return -1; } Py_INCREF(state->TermiosError); - PyModule_AddObject(m, "error", state->TermiosError); + if (PyModule_AddObject(mod, "error", state->TermiosError) < 0) { + Py_DECREF(state->TermiosError); + return -1; + } while (constant->name != NULL) { - PyModule_AddIntConstant(m, constant->name, constant->value); + if (PyModule_AddIntConstant( + mod, constant->name, constant->value) < 0) { + return -1; + } ++constant; } - return m; + return 0; +} + +static PyModuleDef_Slot termios_slots[] = { + {Py_mod_exec, termios_exec}, + {0, NULL} +}; + +static struct PyModuleDef termiosmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "termios", + .m_doc = termios__doc__, + .m_size = sizeof(termiosmodulestate), + .m_methods = termios_methods, + .m_slots = termios_slots, + .m_traverse = termiosmodule_traverse, + .m_clear = termiosmodule_clear, + .m_free = termiosmodule_free, +}; + +PyMODINIT_FUNC PyInit_termios(void) +{ + return PyModuleDef_Init(&termiosmodule); } From 087d7ef56c94074593bf2b0e42a3947eae128ddc Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Tue, 8 Sep 2020 04:16:14 -0500 Subject: [PATCH 0060/1261] bpo-1635741: Convert _sha256 types to heap types (GH-22134) Convert the _sha256 extension module types to heap types. --- ...2020-09-07-09-45-47.bpo-1635741.QuDIut.rst | 1 + Modules/clinic/sha256module.c.h | 21 +- Modules/sha256module.c | 208 +++++++++--------- 3 files changed, 127 insertions(+), 103 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-07-09-45-47.bpo-1635741.QuDIut.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-07-09-45-47.bpo-1635741.QuDIut.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-07-09-45-47.bpo-1635741.QuDIut.rst new file mode 100644 index 00000000000000..90e56542d1e97a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-07-09-45-47.bpo-1635741.QuDIut.rst @@ -0,0 +1 @@ +Convert the :mod:`_sha256` extension module types to heap types. diff --git a/Modules/clinic/sha256module.c.h b/Modules/clinic/sha256module.c.h index 2a788ea98499f3..89205c4f14f4e4 100644 --- a/Modules/clinic/sha256module.c.h +++ b/Modules/clinic/sha256module.c.h @@ -9,15 +9,26 @@ PyDoc_STRVAR(SHA256Type_copy__doc__, "Return a copy of the hash object."); #define SHA256TYPE_COPY_METHODDEF \ - {"copy", (PyCFunction)SHA256Type_copy, METH_NOARGS, SHA256Type_copy__doc__}, + {"copy", (PyCFunction)(void(*)(void))SHA256Type_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, SHA256Type_copy__doc__}, static PyObject * -SHA256Type_copy_impl(SHAobject *self); +SHA256Type_copy_impl(SHAobject *self, PyTypeObject *cls); static PyObject * -SHA256Type_copy(SHAobject *self, PyObject *Py_UNUSED(ignored)) +SHA256Type_copy(SHAobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return SHA256Type_copy_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":copy", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = SHA256Type_copy_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(SHA256Type_digest__doc__, @@ -166,4 +177,4 @@ _sha256_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje exit: return return_value; } -/*[clinic end generated code: output=c8cca8adbe72ec9a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b7283f75c9d08f30 input=a9049054013a1b77]*/ diff --git a/Modules/sha256module.c b/Modules/sha256module.c index 06e4430bd7c333..edd4d010928f38 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -51,6 +51,19 @@ typedef struct { #include "clinic/sha256module.c.h" +typedef struct { + PyTypeObject* sha224_type; + PyTypeObject* sha256_type; +} _sha256_state; + +static inline _sha256_state* +_sha256_get_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_sha256_state *)state; +} + /* When run on a little-endian CPU we need to perform byte reversal on an array of longwords. */ @@ -365,20 +378,17 @@ sha_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info) * ------------------------------------------------------------------------ */ -static PyTypeObject SHA224type; -static PyTypeObject SHA256type; - static SHAobject * -newSHA224object(void) +newSHA224object(_sha256_state *state) { - return (SHAobject *)PyObject_New(SHAobject, &SHA224type); + return (SHAobject *)PyObject_New(SHAobject, state->sha224_type); } static SHAobject * -newSHA256object(void) +newSHA256object(_sha256_state *state) { - return (SHAobject *)PyObject_New(SHAobject, &SHA256type); + return (SHAobject *)PyObject_New(SHAobject, state->sha256_type); } /* Internal methods for a hash object */ @@ -386,7 +396,9 @@ newSHA256object(void) static void SHA_dealloc(PyObject *ptr) { + PyTypeObject *tp = Py_TYPE(ptr); PyObject_Del(ptr); + Py_DECREF(tp); } @@ -395,21 +407,25 @@ SHA_dealloc(PyObject *ptr) /*[clinic input] SHA256Type.copy + cls:defining_class + Return a copy of the hash object. [clinic start generated code]*/ static PyObject * -SHA256Type_copy_impl(SHAobject *self) -/*[clinic end generated code: output=1a8bbd66a0c9c168 input=f58840a618d4f2a7]*/ +SHA256Type_copy_impl(SHAobject *self, PyTypeObject *cls) +/*[clinic end generated code: output=9273f92c382be12f input=3137146fcb88e212]*/ { SHAobject *newobj; - - if (Py_IS_TYPE(self, &SHA256type)) { - if ( (newobj = newSHA256object())==NULL) + _sha256_state *state = PyType_GetModuleState(cls); + if (Py_IS_TYPE(self, state->sha256_type)) { + if ( (newobj = newSHA256object(state)) == NULL) { return NULL; + } } else { - if ( (newobj = newSHA224object())==NULL) + if ( (newobj = newSHA224object(state))==NULL) { return NULL; + } } SHAcopy(self, newobj); @@ -517,74 +533,27 @@ static PyMemberDef SHA_members[] = { {NULL} /* Sentinel */ }; -static PyTypeObject SHA224type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha256.sha224", /*tp_name*/ - sizeof(SHAobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - SHA_methods, /* tp_methods */ - SHA_members, /* tp_members */ - SHA_getseters, /* tp_getset */ +static PyType_Slot sha256_types_slots[] = { + {Py_tp_dealloc, SHA_dealloc}, + {Py_tp_methods, SHA_methods}, + {Py_tp_members, SHA_members}, + {Py_tp_getset, SHA_getseters}, + {0,0} }; -static PyTypeObject SHA256type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha256.sha256", /*tp_name*/ - sizeof(SHAobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - SHA_methods, /* tp_methods */ - SHA_members, /* tp_members */ - SHA_getseters, /* tp_getset */ +static PyType_Spec sha224_type_spec = { + .name = "_sha256.sha224", + .basicsize = sizeof(SHAobject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = sha256_types_slots }; +static PyType_Spec sha256_type_spec = { + .name = "_sha256.sha256", + .basicsize = sizeof(SHAobject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = sha256_types_slots +}; /* The single module-level function: new() */ @@ -602,15 +571,19 @@ static PyObject * _sha256_sha256_impl(PyObject *module, PyObject *string, int usedforsecurity) /*[clinic end generated code: output=a1de327e8e1185cf input=9be86301aeb14ea5]*/ { - SHAobject *new; Py_buffer buf; - if (string) + if (string) { GET_BUFFER_VIEW_OR_ERROUT(string, &buf); + } - if ((new = newSHA256object()) == NULL) { - if (string) + _sha256_state *state = PyModule_GetState(module); + + SHAobject *new; + if ((new = newSHA256object(state)) == NULL) { + if (string) { PyBuffer_Release(&buf); + } return NULL; } @@ -618,8 +591,9 @@ _sha256_sha256_impl(PyObject *module, PyObject *string, int usedforsecurity) if (PyErr_Occurred()) { Py_DECREF(new); - if (string) + if (string) { PyBuffer_Release(&buf); + } return NULL; } if (string) { @@ -644,15 +618,17 @@ static PyObject * _sha256_sha224_impl(PyObject *module, PyObject *string, int usedforsecurity) /*[clinic end generated code: output=08be6b36569bc69c input=9fcfb46e460860ac]*/ { - SHAobject *new; Py_buffer buf; - - if (string) + if (string) { GET_BUFFER_VIEW_OR_ERROUT(string, &buf); + } - if ((new = newSHA224object()) == NULL) { - if (string) + _sha256_state *state = PyModule_GetState(module); + SHAobject *new; + if ((new = newSHA224object(state)) == NULL) { + if (string) { PyBuffer_Release(&buf); + } return NULL; } @@ -660,8 +636,9 @@ _sha256_sha224_impl(PyObject *module, PyObject *string, int usedforsecurity) if (PyErr_Occurred()) { Py_DECREF(new); - if (string) + if (string) { PyBuffer_Release(&buf); + } return NULL; } if (string) { @@ -681,25 +658,56 @@ static struct PyMethodDef SHA_functions[] = { {NULL, NULL} /* Sentinel */ }; +static int +_sha256_traverse(PyObject *module, visitproc visit, void *arg) +{ + _sha256_state *state = _sha256_get_state(module); + Py_VISIT(state->sha224_type); + Py_VISIT(state->sha256_type); + return 0; +} + +static int +_sha256_clear(PyObject *module) +{ + _sha256_state *state = _sha256_get_state(module); + Py_CLEAR(state->sha224_type); + Py_CLEAR(state->sha256_type); + return 0; +} + +static void +_sha256_free(void *module) +{ + _sha256_clear((PyObject *)module); +} + static int sha256_exec(PyObject *module) { - Py_SET_TYPE(&SHA224type, &PyType_Type); - if (PyType_Ready(&SHA224type) < 0) { + _sha256_state *state = _sha256_get_state(module); + + state->sha224_type = (PyTypeObject *)PyType_FromModuleAndSpec( + module, &sha224_type_spec, NULL); + + if (state->sha224_type == NULL) { return -1; } - Py_SET_TYPE(&SHA256type, &PyType_Type); - if (PyType_Ready(&SHA256type) < 0) { + + state->sha256_type = (PyTypeObject *)PyType_FromModuleAndSpec( + module, &sha256_type_spec, NULL); + + if (state->sha256_type == NULL) { return -1; } - Py_INCREF((PyObject *)&SHA224type); - if (PyModule_AddObject(module, "SHA224Type", (PyObject *)&SHA224type) < 0) { - Py_DECREF((PyObject *)&SHA224type); + Py_INCREF((PyObject *)state->sha224_type); + if (PyModule_AddObject(module, "SHA224Type", (PyObject *)state->sha224_type) < 0) { + Py_DECREF((PyObject *)state->sha224_type); return -1; } - Py_INCREF((PyObject *)&SHA256type); - if (PyModule_AddObject(module, "SHA256Type", (PyObject *)&SHA256type) < 0) { - Py_DECREF((PyObject *)&SHA256type); + Py_INCREF((PyObject *)state->sha256_type); + if (PyModule_AddObject(module, "SHA256Type", (PyObject *)state->sha256_type) < 0) { + Py_DECREF((PyObject *)state->sha256_type); return -1; } return 0; @@ -713,8 +721,12 @@ static PyModuleDef_Slot _sha256_slots[] = { static struct PyModuleDef _sha256module = { PyModuleDef_HEAD_INIT, .m_name = "_sha256", + .m_size = sizeof(_sha256_state), .m_methods = SHA_functions, .m_slots = _sha256_slots, + .m_traverse = _sha256_traverse, + .m_clear = _sha256_clear, + .m_free = _sha256_free }; /* Initialize this module. */ From acf98a747ac6b3f558aa7c9ef4ea48166e9ddddf Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 8 Sep 2020 15:33:08 +0200 Subject: [PATCH 0061/1261] bpo-1635741: Port _string module to multi-phase init (GH-22148) Port the _string extension module to the multi-phase initialization API (PEP 489). --- .../2020-09-08-13-51-16.bpo-1635741.wkPeoT.rst | 2 ++ Objects/unicodeobject.c | 14 +++++--------- 2 files changed, 7 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-08-13-51-16.bpo-1635741.wkPeoT.rst diff --git a/Misc/NEWS.d/next/Library/2020-09-08-13-51-16.bpo-1635741.wkPeoT.rst b/Misc/NEWS.d/next/Library/2020-09-08-13-51-16.bpo-1635741.wkPeoT.rst new file mode 100644 index 00000000000000..972d69b94b6ba6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-08-13-51-16.bpo-1635741.wkPeoT.rst @@ -0,0 +1,2 @@ +Port the ``_string`` extension module to the multi-phase initialization API +(:pep:`489`). diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 82e09ad05fcd13..fd0e8e008adae4 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -16243,20 +16243,16 @@ static PyMethodDef _string_methods[] = { static struct PyModuleDef _string_module = { PyModuleDef_HEAD_INIT, - "_string", - PyDoc_STR("string helper module"), - 0, - _string_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "_string", + .m_doc = PyDoc_STR("string helper module"), + .m_size = 0, + .m_methods = _string_methods, }; PyMODINIT_FUNC PyInit__string(void) { - return PyModule_Create(&_string_module); + return PyModuleDef_Init(&_string_module); } From cba93071b0b3f22e27f0cf40c2f387be856cc071 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 8 Sep 2020 15:33:52 +0200 Subject: [PATCH 0062/1261] bpo-1635741: Port mashal module to multi-phase init (#22149) Port the 'mashal' extension module to the multi-phase initialization API (PEP 489). --- ...2020-09-08-13-55-34.bpo-1635741.56MLP-.rst | 2 ++ Python/marshal.c | 34 ++++++++++--------- 2 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-08-13-55-34.bpo-1635741.56MLP-.rst diff --git a/Misc/NEWS.d/next/Library/2020-09-08-13-55-34.bpo-1635741.56MLP-.rst b/Misc/NEWS.d/next/Library/2020-09-08-13-55-34.bpo-1635741.56MLP-.rst new file mode 100644 index 00000000000000..8b5bd5efdc2c09 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-08-13-55-34.bpo-1635741.56MLP-.rst @@ -0,0 +1,2 @@ +Port the ``mashal`` extension module to the multi-phase initialization API +(:pep:`489`). diff --git a/Python/marshal.c b/Python/marshal.c index c4538bd373a82e..91a0f8acb12487 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -1785,28 +1785,30 @@ dumps() -- marshal value as a bytes object\n\ loads() -- read value from a bytes-like object"); +static int +marshal_module_exec(PyObject *mod) +{ + if (PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION) < 0) { + return -1; + } + return 0; +} + +static PyModuleDef_Slot marshalmodule_slots[] = { + {Py_mod_exec, marshal_module_exec}, + {0, NULL} +}; static struct PyModuleDef marshalmodule = { PyModuleDef_HEAD_INIT, - "marshal", - module_doc, - 0, - marshal_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "marshal", + .m_doc = module_doc, + .m_methods = marshal_methods, + .m_slots = marshalmodule_slots, }; PyMODINIT_FUNC PyMarshal_Init(void) { - PyObject *mod = PyModule_Create(&marshalmodule); - if (mod == NULL) - return NULL; - if (PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION) < 0) { - Py_DECREF(mod); - return NULL; - } - return mod; + return PyModuleDef_Init(&marshalmodule); } From 78b51b1bc18e4c1fb485baa69397c54a73572353 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Tue, 8 Sep 2020 17:47:14 +0100 Subject: [PATCH 0063/1261] Fix incorrect bpo number in change notes. (GH-22151) --- Misc/NEWS.d/3.9.0a2.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/3.9.0a2.rst b/Misc/NEWS.d/3.9.0a2.rst index 50478c08e90189..1fd23b763e2a1e 100644 --- a/Misc/NEWS.d/3.9.0a2.rst +++ b/Misc/NEWS.d/3.9.0a2.rst @@ -229,7 +229,7 @@ coroutine of an asynchronous generator. .. -.. bpo: 32949 +.. bpo: 33387 .. date: 2018-03-13-14-46-03 .. nonce: v821M7 .. section: Core and Builtins From c0c4ac4dca83cbc4802eedf3dc4d1692cb11327c Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Tue, 8 Sep 2020 20:40:04 +0100 Subject: [PATCH 0064/1261] bpo-38762: Extend logging.test_multiprocessing to cover missing cases. (GH-22142) --- Lib/test/test_logging.py | 62 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 00a4825d6da88d..d23fbfb4fe281b 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -4354,15 +4354,65 @@ def test_dict_arg(self): r.removeHandler(h) h.close() - def test_multiprocessing(self): - r = logging.makeLogRecord({}) - self.assertEqual(r.processName, 'MainProcess') + @staticmethod # pickled as target of child process in the following test + def _extract_logrecord_process_name(key, logMultiprocessing, conn=None): + prev_logMultiprocessing = logging.logMultiprocessing + logging.logMultiprocessing = logMultiprocessing try: import multiprocessing as mp + name = mp.current_process().name + + r1 = logging.makeLogRecord({'msg': f'msg1_{key}'}) + del sys.modules['multiprocessing'] + r2 = logging.makeLogRecord({'msg': f'msg2_{key}'}) + + results = {'processName' : name, + 'r1.processName': r1.processName, + 'r2.processName': r2.processName, + } + finally: + logging.logMultiprocessing = prev_logMultiprocessing + if conn: + conn.send(results) + else: + return results + + def test_multiprocessing(self): + multiprocessing_imported = 'multiprocessing' in sys.modules + try: + # logMultiprocessing is True by default + self.assertEqual(logging.logMultiprocessing, True) + + LOG_MULTI_PROCESSING = True + # When logMultiprocessing == True: + # In the main process processName = 'MainProcess' r = logging.makeLogRecord({}) - self.assertEqual(r.processName, mp.current_process().name) - except ImportError: - pass + self.assertEqual(r.processName, 'MainProcess') + + results = self._extract_logrecord_process_name(1, LOG_MULTI_PROCESSING) + self.assertEqual('MainProcess', results['processName']) + self.assertEqual('MainProcess', results['r1.processName']) + self.assertEqual('MainProcess', results['r2.processName']) + + # In other processes, processName is correct when multiprocessing in imported, + # but it is (incorrectly) defaulted to 'MainProcess' otherwise (bpo-38762). + import multiprocessing + parent_conn, child_conn = multiprocessing.Pipe() + p = multiprocessing.Process( + target=self._extract_logrecord_process_name, + args=(2, LOG_MULTI_PROCESSING, child_conn,) + ) + p.start() + results = parent_conn.recv() + self.assertNotEqual('MainProcess', results['processName']) + self.assertEqual(results['processName'], results['r1.processName']) + self.assertEqual('MainProcess', results['r2.processName']) + p.join() + + finally: + if multiprocessing_imported: + import multiprocessing + def test_optional(self): r = logging.makeLogRecord({}) From a710572b352de422c6ef8ef8fc4d5ee0cc0dbb3c Mon Sep 17 00:00:00 2001 From: Graham Bleaney Date: Tue, 8 Sep 2020 18:41:10 -0400 Subject: [PATCH 0065/1261] Fix typo in typing.py (GH-22121) This is a trivial PR to fix a typo in a docstring in typing.py. From reverences -> references --- Lib/typing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/typing.py b/Lib/typing.py index fce8da4fe3cf05..2899a0213d4340 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -245,7 +245,7 @@ def inner(*args, **kwds): def _eval_type(t, globalns, localns, recursive_guard=frozenset()): - """Evaluate all forward reverences in the given type t. + """Evaluate all forward references in the given type t. For use of globalns and localns see the docstring for get_type_hints(). recursive_guard is used to prevent prevent infinite recursion with recursive ForwardRef. From 05933c2d17b7b5589c0337e22d6c689d940cb8e3 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Tue, 8 Sep 2020 20:39:19 -0300 Subject: [PATCH 0066/1261] [doc] Fix padding in timeit (GH-22152) Compare -p and -u options help in rendered output to see the difference. --- Doc/library/timeit.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/timeit.rst b/Doc/library/timeit.rst index 46fa62c15fc2ef..668fcb860cea87 100644 --- a/Doc/library/timeit.rst +++ b/Doc/library/timeit.rst @@ -233,7 +233,7 @@ Where the following options are understood: .. cmdoption:: -u, --unit=U - specify a time unit for timer output; can select nsec, usec, msec, or sec + specify a time unit for timer output; can select nsec, usec, msec, or sec .. versionadded:: 3.5 From 3678e1f19fbc4f5f1a81652e8d0aefa648075fbd Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 9 Sep 2020 03:28:02 +0300 Subject: [PATCH 0067/1261] bpo-41525: Make the Python program help ASCII-only (GH-21836) --- Lib/test/test_cmd_line.py | 6 +++++- .../2020-08-12-07-35-07.bpo-41525.d9q3XL.rst | 1 + Misc/python.man | 2 +- Python/initconfig.c | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-12-07-35-07.bpo-41525.d9q3XL.rst diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 4794d446f08c79..fa3329efa28b82 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -46,7 +46,11 @@ def test_site_flag(self): def test_usage(self): rc, out, err = assert_python_ok('-h') - self.assertIn(b'usage', out) + lines = out.splitlines() + self.assertIn(b'usage', lines[0]) + # The first line contains the program name, + # but the rest should be ASCII-only + b''.join(lines[1:]).decode('ascii') def test_version(self): version = ('Python %d.%d' % sys.version_info[:2]).encode("ascii") diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-12-07-35-07.bpo-41525.d9q3XL.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-12-07-35-07.bpo-41525.d9q3XL.rst new file mode 100644 index 00000000000000..acc00f8b992c91 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-12-07-35-07.bpo-41525.d9q3XL.rst @@ -0,0 +1 @@ +The output of ``python --help`` contains now only ASCII characters. diff --git a/Misc/python.man b/Misc/python.man index 74b2d72939eeb4..225376574a26a9 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -291,7 +291,7 @@ Set implementation specific option. The following options are available: nested imports). Note that its output may be broken in multi-threaded application. Typical usage is python3 -X importtime -c 'import asyncio' - -X dev: enable CPython’s “development mode”, introducing additional runtime + -X dev: enable CPython's "development mode", introducing additional runtime checks which are too expensive to be enabled by default. It will not be more verbose than the default if the code is correct: new warnings are only emitted when an issue is detected. Effect of the developer mode: diff --git a/Python/initconfig.c b/Python/initconfig.c index 64286763b621ed..38d64b63afcc9c 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -83,7 +83,7 @@ static const char usage_3[] = "\ cumulative time (including nested imports) and self time (excluding\n\ nested imports). Note that its output may be broken in multi-threaded\n\ application. Typical usage is python3 -X importtime -c 'import asyncio'\n\ - -X dev: enable CPython’s “development mode”, introducing additional runtime\n\ + -X dev: enable CPython's \"development mode\", introducing additional runtime\n\ checks which are too expensive to be enabled by default. Effect of the\n\ developer mode:\n\ * Add default warning filter, as -W default\n\ From 7cdca4266544f41f15968c6862c6dfe378676168 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Tue, 8 Sep 2020 22:28:48 -0500 Subject: [PATCH 0068/1261] bpo-1635741: port scproxy to multi-phase init (GH-22164) --- ...2020-09-08-20-39-43.bpo-1635741.jiXmyT.rst | 2 ++ Modules/_scproxy.c | 22 ++++++++----------- 2 files changed, 11 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-08-20-39-43.bpo-1635741.jiXmyT.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-08-20-39-43.bpo-1635741.jiXmyT.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-08-20-39-43.bpo-1635741.jiXmyT.rst new file mode 100644 index 00000000000000..17752b2ccd3fad --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-08-20-39-43.bpo-1635741.jiXmyT.rst @@ -0,0 +1,2 @@ +Port the :mod:`_scproxy` extension module to multi-phase initialization +(:pep:`489`). diff --git a/Modules/_scproxy.c b/Modules/_scproxy.c index dbee3f7367edeb..4c1f1aa300c717 100644 --- a/Modules/_scproxy.c +++ b/Modules/_scproxy.c @@ -231,21 +231,18 @@ static PyMethodDef mod_methods[] = { { 0, 0, 0, 0 } }; +static PyModuleDef_Slot _scproxy_slots[] = { + {0, NULL} +}; - -static struct PyModuleDef mod_module = { +static struct PyModuleDef _scproxy_module = { PyModuleDef_HEAD_INIT, - "_scproxy", - NULL, - -1, - mod_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "_scproxy", + .m_size = 0, + .m_methods = mod_methods, + .m_slots = _scproxy_slots, }; - #ifdef __cplusplus extern "C" { #endif @@ -253,10 +250,9 @@ extern "C" { PyMODINIT_FUNC PyInit__scproxy(void) { - return PyModule_Create(&mod_module); + return PyModuleDef_Init(&_scproxy_module); } #ifdef __cplusplus } #endif - From 704bf67a74260295af21574fa04f29b88b4a186f Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Wed, 9 Sep 2020 17:48:44 +0800 Subject: [PATCH 0069/1261] bpo-41726: Update the refcounts info of PyType_FromModuleAndSpec in refcounts.dat (GH-22112) Update refcounts info of PyType_FromModuleAndSpec in refcounts.dat --- Doc/data/refcounts.dat | 5 +++++ .../Documentation/2020-09-08-16-57-09.bpo-41726.g0UXrn.rst | 1 + 2 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2020-09-08-16-57-09.bpo-41726.g0UXrn.rst diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index 882d7d6d62fc39..355a4d6d3fa7ba 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -2283,6 +2283,11 @@ PyType_CheckExact:PyObject*:o:0: PyType_FromSpec:PyObject*::+1: PyType_FromSpec:PyType_Spec*:spec:: +PyType_FromModuleAndSpec:PyObject*::+1: +PyType_FromModuleAndSpec:PyObject*:module:+1: +PyType_FromModuleAndSpec:PyType_Spec*:spec:: +PyType_FromModuleAndSpec:PyObject*:bases:0: + PyType_FromSpecWithBases:PyObject*::+1: PyType_FromSpecWithBases:PyType_Spec*:spec:: PyType_FromSpecWithBases:PyObject*:bases:0: diff --git a/Misc/NEWS.d/next/Documentation/2020-09-08-16-57-09.bpo-41726.g0UXrn.rst b/Misc/NEWS.d/next/Documentation/2020-09-08-16-57-09.bpo-41726.g0UXrn.rst new file mode 100644 index 00000000000000..1079a757c054ac --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-09-08-16-57-09.bpo-41726.g0UXrn.rst @@ -0,0 +1 @@ +Update the refcounts info of ``PyType_FromModuleAndSpec``. From 69d9bbda6e04d4350a9b7930473bd74fe5172974 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 9 Sep 2020 12:07:17 +0200 Subject: [PATCH 0070/1261] Fix compiler warnings in init_dump_ascii_wstr() (GH-22150) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix GCC 9.3 (using -O3) warnings on x86: initconfig.c: In function ‘init_dump_ascii_wstr’: initconfig.c:2679:34: warning: format ‘%lc’ expects argument of type ‘wint_t’, but argument 2 has type ‘wchar_t’ {aka ‘long int’} 2679 | PySys_WriteStderr("%lc", ch); initconfig.c:2682:38: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘wchar_t’ {aka ‘long int’} 2682 | PySys_WriteStderr("\\x%02x", ch); initconfig.c:2686:38: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘wchar_t’ {aka ‘long int’} 2686 | PySys_WriteStderr("\\U%08x", ch); initconfig.c:2690:38: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘wchar_t’ {aka ‘long int’} 2690 | PySys_WriteStderr("\\u%04x", ch); --- Python/initconfig.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/initconfig.c b/Python/initconfig.c index 38d64b63afcc9c..880e145ec031cd 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -2670,7 +2670,7 @@ init_dump_ascii_wstr(const wchar_t *str) PySys_WriteStderr("'"); for (; *str != L'\0'; str++) { - wchar_t ch = *str; + unsigned int ch = (unsigned int)*str; if (ch == L'\'') { PySys_WriteStderr("\\'"); } else if (0x20 <= ch && ch < 0x7f) { From 2d1ecd6604379f3adbe8ee78da1a1b84bf7570d4 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Wed, 9 Sep 2020 11:21:22 +0100 Subject: [PATCH 0071/1261] Add minor clarification in logging documentation. (GH-22167) --- Doc/library/logging.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 19691d50937a71..989016e649d651 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -575,9 +575,9 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on pickled and sent across the wire, but you should be careful if you have more than one :class:`Formatter` subclass which customizes the formatting of exception information. In this case, you will have to clear the cached - value after a formatter has done its formatting, so that the next - formatter to handle the event doesn't use the cached value but - recalculates it afresh. + value (by setting the *exc_text* attribute to ``None``) after a formatter + has done its formatting, so that the next formatter to handle the event + doesn't use the cached value, but recalculates it afresh. If stack information is available, it's appended after the exception information, using :meth:`formatStack` to transform it if necessary. From 24c5d09a1f20bebb9a61ba1699e04972fd8192c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kul=C3=ADk?= Date: Wed, 9 Sep 2020 21:29:42 +0200 Subject: [PATCH 0072/1261] bpo-41687: Fix error handling in Solaris sendfile implementation (GH-22128) I just realized that my recent PR with sendfile on Solaris ([PR 22040](https://github.com/python/cpython/pull/22040)) has broken error handling. Sorry for that, this simple followup fixes that. Automerge-Triggered-By: @1st1 --- Modules/posixmodule.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 00ba7580302bba..7c496938ed4c5e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -9521,14 +9521,13 @@ os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj, #if defined(__sun) && defined(__SVR4) // On Solaris, sendfile raises EINVAL rather than returning 0 // when the offset is equal or bigger than the in_fd size. - int res; struct stat st; do { Py_BEGIN_ALLOW_THREADS - res = fstat(in_fd, &st); + ret = fstat(in_fd, &st); Py_END_ALLOW_THREADS - } while (res != 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); + } while (ret != 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); if (ret < 0) return (!async_err) ? posix_error() : NULL; From 5bc927542b10faa7730d7a791907cb43e77285a3 Mon Sep 17 00:00:00 2001 From: Maggie Moss Date: Wed, 9 Sep 2020 13:23:24 -0700 Subject: [PATCH 0073/1261] bpo-41428: Implementation for PEP 604 (GH-21515) See https://www.python.org/dev/peps/pep-0604/ for more information. Co-authored-by: Pablo Galindo --- Include/internal/pycore_unionobject.h | 17 + Lib/test/test_isinstance.py | 32 ++ Lib/test/test_types.py | 114 +++++ Lib/test/test_typing.py | 6 - Lib/types.py | 1 + Lib/typing.py | 31 +- Makefile.pre.in | 2 + .../2020-07-28-22-43-27.bpo-41428.FM6xsI.rst | 1 + Objects/abstract.c | 15 +- Objects/typeobject.c | 19 +- Objects/unionobject.c | 464 ++++++++++++++++++ PCbuild/pythoncore.vcxproj | 2 + PCbuild/pythoncore.vcxproj.filters | 6 + 13 files changed, 693 insertions(+), 17 deletions(-) create mode 100644 Include/internal/pycore_unionobject.h create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-28-22-43-27.bpo-41428.FM6xsI.rst create mode 100644 Objects/unionobject.c diff --git a/Include/internal/pycore_unionobject.h b/Include/internal/pycore_unionobject.h new file mode 100644 index 00000000000000..fa8ba6ed944c1a --- /dev/null +++ b/Include/internal/pycore_unionobject.h @@ -0,0 +1,17 @@ +#ifndef Py_INTERNAL_UNIONOBJECT_H +#define Py_INTERNAL_UNIONOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +PyAPI_FUNC(PyObject *) _Py_Union(PyObject *args); +PyAPI_DATA(PyTypeObject) _Py_UnionType; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_UNIONOBJECT_H */ diff --git a/Lib/test/test_isinstance.py b/Lib/test/test_isinstance.py index 53639e984e48a7..91e79c295481db 100644 --- a/Lib/test/test_isinstance.py +++ b/Lib/test/test_isinstance.py @@ -4,6 +4,7 @@ import unittest import sys +import typing @@ -208,6 +209,25 @@ def test_isinstance_abstract(self): self.assertEqual(False, isinstance(AbstractChild(), Super)) self.assertEqual(False, isinstance(AbstractChild(), Child)) + def test_isinstance_with_or_union(self): + self.assertTrue(isinstance(Super(), Super | int)) + self.assertFalse(isinstance(None, str | int)) + self.assertTrue(isinstance(3, str | int)) + self.assertTrue(isinstance("", str | int)) + self.assertTrue(isinstance([], typing.List | typing.Tuple)) + self.assertTrue(isinstance(2, typing.List | int)) + self.assertFalse(isinstance(2, typing.List | typing.Tuple)) + self.assertTrue(isinstance(None, int | None)) + self.assertFalse(isinstance(3.14, int | str)) + with self.assertRaises(TypeError): + isinstance(2, list[int]) + with self.assertRaises(TypeError): + isinstance(2, list[int] | int) + with self.assertRaises(TypeError): + isinstance(2, int | str | list[int] | float) + + + def test_subclass_normal(self): # normal classes self.assertEqual(True, issubclass(Super, Super)) @@ -217,6 +237,8 @@ def test_subclass_normal(self): self.assertEqual(True, issubclass(Child, Child)) self.assertEqual(True, issubclass(Child, Super)) self.assertEqual(False, issubclass(Child, AbstractSuper)) + self.assertTrue(issubclass(typing.List, typing.List|typing.Tuple)) + self.assertFalse(issubclass(int, typing.List|typing.Tuple)) def test_subclass_abstract(self): # abstract classes @@ -251,6 +273,16 @@ def test_isinstance_recursion_limit(self): # blown self.assertRaises(RecursionError, blowstack, isinstance, '', str) + def test_subclass_with_union(self): + self.assertTrue(issubclass(int, int | float | int)) + self.assertTrue(issubclass(str, str | Child | str)) + self.assertFalse(issubclass(dict, float|str)) + self.assertFalse(issubclass(object, float|str)) + with self.assertRaises(TypeError): + issubclass(2, Child | Super) + with self.assertRaises(TypeError): + issubclass(int, list[int] | Child) + def test_issubclass_refcount_handling(self): # bpo-39382: abstract_issubclass() didn't hold item reference while # peeking in the bases tuple, in the single inheritance case. diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 49dc5bf40e3ed8..f499fb9c8c51a4 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -2,6 +2,7 @@ from test.support import run_with_locale import collections.abc +from collections import namedtuple import inspect import pickle import locale @@ -9,6 +10,12 @@ import types import unittest.mock import weakref +import typing + +class Example: + pass + +class Forward: ... class TypesTests(unittest.TestCase): @@ -598,6 +605,113 @@ def test_method_descriptor_types(self): self.assertIsInstance(int.from_bytes, types.BuiltinMethodType) self.assertIsInstance(int.__new__, types.BuiltinMethodType) + def test_or_types_operator(self): + self.assertEqual(int | str, typing.Union[int, str]) + self.assertNotEqual(int | list, typing.Union[int, str]) + self.assertEqual(str | int, typing.Union[int, str]) + self.assertEqual(int | None, typing.Union[int, None]) + self.assertEqual(None | int, typing.Union[int, None]) + self.assertEqual(int | str | list, typing.Union[int, str, list]) + self.assertEqual(int | (str | list), typing.Union[int, str, list]) + self.assertEqual(str | (int | list), typing.Union[int, str, list]) + self.assertEqual(typing.List | typing.Tuple, typing.Union[typing.List, typing.Tuple]) + self.assertEqual(typing.List[int] | typing.Tuple[int], typing.Union[typing.List[int], typing.Tuple[int]]) + self.assertEqual(typing.List[int] | None, typing.Union[typing.List[int], None]) + self.assertEqual(None | typing.List[int], typing.Union[None, typing.List[int]]) + self.assertEqual(str | float | int | complex | int, (int | str) | (float | complex)) + self.assertEqual(typing.Union[str, int, typing.List[int]], str | int | typing.List[int]) + self.assertEqual(int | int, int) + self.assertEqual( + BaseException | + bool | + bytes | + complex | + float | + int | + list | + map | + set, + typing.Union[ + BaseException, + bool, + bytes, + complex, + float, + int, + list, + map, + set, + ]) + with self.assertRaises(TypeError): + int | 3 + with self.assertRaises(TypeError): + 3 | int + with self.assertRaises(TypeError): + Example() | int + with self.assertRaises(TypeError): + (int | str) < typing.Union[str, int] + with self.assertRaises(TypeError): + (int | str) < (int | bool) + with self.assertRaises(TypeError): + (int | str) <= (int | str) + with self.assertRaises(TypeError): + # Check that we don't crash if typing.Union does not have a tuple in __args__ + x = typing.Union[str, int] + x.__args__ = [str, int] + (int | str ) == x + + def test_or_type_operator_with_TypeVar(self): + TV = typing.TypeVar('T') + assert TV | str == typing.Union[TV, str] + assert str | TV == typing.Union[str, TV] + + def test_or_type_operator_with_forward(self): + T = typing.TypeVar('T') + ForwardAfter = T | 'Forward' + ForwardBefore = 'Forward' | T + def forward_after(x: ForwardAfter[int]) -> None: ... + def forward_before(x: ForwardBefore[int]) -> None: ... + assert typing.get_args(typing.get_type_hints(forward_after)['x']) == (int, Forward) + assert typing.get_args(typing.get_type_hints(forward_before)['x']) == (int, Forward) + + def test_or_type_operator_with_Protocol(self): + class Proto(typing.Protocol): + def meth(self) -> int: + ... + assert Proto | str == typing.Union[Proto, str] + + def test_or_type_operator_with_Alias(self): + assert list | str == typing.Union[list, str] + assert typing.List | str == typing.Union[typing.List, str] + + def test_or_type_operator_with_NamedTuple(self): + NT=namedtuple('A', ['B', 'C', 'D']) + assert NT | str == typing.Union[NT,str] + + def test_or_type_operator_with_TypedDict(self): + class Point2D(typing.TypedDict): + x: int + y: int + label: str + assert Point2D | str == typing.Union[Point2D, str] + + def test_or_type_operator_with_NewType(self): + UserId = typing.NewType('UserId', int) + assert UserId | str == typing.Union[UserId, str] + + def test_or_type_operator_with_IO(self): + assert typing.IO | str == typing.Union[typing.IO, str] + + def test_or_type_operator_with_SpecialForm(self): + assert typing.Any | str == typing.Union[typing.Any, str] + assert typing.NoReturn | str == typing.Union[typing.NoReturn, str] + assert typing.Optional[int] | str == typing.Union[typing.Optional[int], str] + assert typing.Optional[int] | str == typing.Union[int, str, None] + assert typing.Union[int, bool] | str == typing.Union[int, bool, str] + + def test_or_type_repr(self): + assert repr(int | None) == "int | None" + assert repr(int | typing.GenericAlias(list, int)) == "int | list[int]" class MappingProxyTests(unittest.TestCase): mappingproxy = types.MappingProxyType diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index b3be99141afca9..05140fc61b9bf5 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -244,8 +244,6 @@ def test_subclass_error(self): issubclass(int, Union) with self.assertRaises(TypeError): issubclass(Union, int) - with self.assertRaises(TypeError): - issubclass(int, Union[int, str]) with self.assertRaises(TypeError): issubclass(Union[int, str], int) @@ -347,10 +345,6 @@ def test_empty(self): with self.assertRaises(TypeError): Union[()] - def test_union_instance_type_error(self): - with self.assertRaises(TypeError): - isinstance(42, Union[int, str]) - def test_no_eval_union(self): u = Union[int, str] def f(x: u): ... diff --git a/Lib/types.py b/Lib/types.py index ad2020ec69b637..9642e7212caac6 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -294,6 +294,7 @@ def wrapped(*args, **kwargs): GenericAlias = type(list[int]) +Union = type(int | str) __all__ = [n for n in globals() if n[:1] != '_'] diff --git a/Lib/typing.py b/Lib/typing.py index 2899a0213d4340..2aedbeb852a712 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -117,7 +117,6 @@ # namespace, but excluded from __all__ because they might stomp on # legitimate imports of those modules. - def _type_check(arg, msg, is_argument=True): """Check that the argument is a type, and return it (internal helper). @@ -145,7 +144,7 @@ def _type_check(arg, msg, is_argument=True): return arg if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol): raise TypeError(f"Plain {arg} is not valid as type argument") - if isinstance(arg, (type, TypeVar, ForwardRef)): + if isinstance(arg, (type, TypeVar, ForwardRef, types.Union)): return arg if not callable(arg): raise TypeError(f"{msg} Got {arg!r:.100}.") @@ -205,7 +204,7 @@ def _remove_dups_flatten(parameters): # Flatten out Union[Union[...], ...]. params = [] for p in parameters: - if isinstance(p, _UnionGenericAlias): + if isinstance(p, (_UnionGenericAlias, types.Union)): params.extend(p.__args__) elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union: params.extend(p[1:]) @@ -586,6 +585,12 @@ def __init__(self, name, *constraints, bound=None, if def_mod != 'typing': self.__module__ = def_mod + def __or__(self, right): + return Union[self, right] + + def __ror__(self, right): + return Union[self, right] + def __repr__(self): if self.__covariant__: prefix = '+' @@ -693,6 +698,12 @@ def __eq__(self, other): def __hash__(self): return hash((self.__origin__, self.__args__)) + def __or__(self, right): + return Union[self, right] + + def __ror__(self, right): + return Union[self, right] + @_tp_cache def __getitem__(self, params): if self.__origin__ in (Generic, Protocol): @@ -792,6 +803,11 @@ def __subclasscheck__(self, cls): def __reduce__(self): return self._name + def __or__(self, right): + return Union[self, right] + + def __ror__(self, right): + return Union[self, right] class _CallableGenericAlias(_GenericAlias, _root=True): def __repr__(self): @@ -878,6 +894,15 @@ def __repr__(self): return f'typing.Optional[{_type_repr(args[0])}]' return super().__repr__() + def __instancecheck__(self, obj): + return self.__subclasscheck__(type(obj)) + + def __subclasscheck__(self, cls): + for arg in self.__args__: + if issubclass(cls, arg): + return True + + class Generic: """Abstract base class for generic types. diff --git a/Makefile.pre.in b/Makefile.pre.in index 5d3ac705a36253..921bd08ea505d6 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -432,6 +432,7 @@ OBJECT_OBJS= \ Objects/typeobject.o \ Objects/unicodeobject.o \ Objects/unicodectype.o \ + Objects/unionobject.o \ Objects/weakrefobject.o ########################################################################## @@ -1128,6 +1129,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_sysmodule.h \ $(srcdir)/Include/internal/pycore_traceback.h \ $(srcdir)/Include/internal/pycore_tuple.h \ + $(srcdir)/Include/internal/pycore_unionobject.h \ $(srcdir)/Include/internal/pycore_warnings.h \ $(DTRACE_HEADERS) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-28-22-43-27.bpo-41428.FM6xsI.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-28-22-43-27.bpo-41428.FM6xsI.rst new file mode 100644 index 00000000000000..a6652de9275117 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-07-28-22-43-27.bpo-41428.FM6xsI.rst @@ -0,0 +1 @@ +Implement PEP 604. This supports (int | str) etc. in place of Union[str, int]. \ No newline at end of file diff --git a/Objects/abstract.c b/Objects/abstract.c index 7bd72c9b5dcc26..c471f184f6c848 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -1,6 +1,7 @@ /* Abstract Object Interface (many thanks to Jim Fulton) */ #include "Python.h" +#include "pycore_unionobject.h" // _Py_UnionType && _Py_Union() #include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_ceval.h" // _Py_EnterRecursiveCall() #include "pycore_pyerrors.h" // _PyErr_Occurred() @@ -839,7 +840,6 @@ binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name) Py_TYPE(w)->tp_name); return NULL; } - return binop_type_error(v, w, op_name); } return result; @@ -2412,7 +2412,6 @@ object_isinstance(PyObject *inst, PyObject *cls) PyObject *icls; int retval; _Py_IDENTIFIER(__class__); - if (PyType_Check(cls)) { retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls); if (retval == 0) { @@ -2432,7 +2431,7 @@ object_isinstance(PyObject *inst, PyObject *cls) } else { if (!check_class(cls, - "isinstance() arg 2 must be a type or tuple of types")) + "isinstance() arg 2 must be a type, a tuple of types or a union")) return -1; retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls); if (icls != NULL) { @@ -2525,10 +2524,14 @@ recursive_issubclass(PyObject *derived, PyObject *cls) if (!check_class(derived, "issubclass() arg 1 must be a class")) return -1; - if (!check_class(cls, - "issubclass() arg 2 must be a class" - " or tuple of classes")) + + PyTypeObject *type = Py_TYPE(cls); + int is_union = (PyType_Check(type) && type == &_Py_UnionType); + if (!is_union && !check_class(cls, + "issubclass() arg 2 must be a class," + " a tuple of classes, or a union.")) { return -1; + } return abstract_issubclass(derived, cls); } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 74040757a07021..3bb2c338fe0b53 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -6,6 +6,7 @@ #include "pycore_object.h" #include "pycore_pyerrors.h" #include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_unionobject.h" // _Py_Union() #include "frameobject.h" #include "structmember.h" // PyMemberDef @@ -3753,6 +3754,21 @@ type_is_gc(PyTypeObject *type) return type->tp_flags & Py_TPFLAGS_HEAPTYPE; } +static PyObject * +type_or(PyTypeObject* self, PyObject* param) { + PyObject *tuple = PyTuple_Pack(2, self, param); + if (tuple == NULL) { + return NULL; + } + PyObject *new_union = _Py_Union(tuple); + Py_DECREF(tuple); + return new_union; +} + +static PyNumberMethods type_as_number = { + .nb_or = (binaryfunc)type_or, // Add __or__ function +}; + PyTypeObject PyType_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "type", /* tp_name */ @@ -3764,7 +3780,7 @@ PyTypeObject PyType_Type = { 0, /* tp_setattr */ 0, /* tp_as_async */ (reprfunc)type_repr, /* tp_repr */ - 0, /* tp_as_number */ + &type_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ @@ -5598,7 +5614,6 @@ PyType_Ready(PyTypeObject *type) add_subclass((PyTypeObject *)b, type) < 0) goto error; } - /* All done -- set the ready flag */ type->tp_flags = (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY; diff --git a/Objects/unionobject.c b/Objects/unionobject.c new file mode 100644 index 00000000000000..0ef7abb4c55c28 --- /dev/null +++ b/Objects/unionobject.c @@ -0,0 +1,464 @@ +// types.Union -- used to represent e.g. Union[int, str], int | str +#include "Python.h" +#include "pycore_unionobject.h" +#include "structmember.h" + + +typedef struct { + PyObject_HEAD + PyObject *args; +} unionobject; + +static void +unionobject_dealloc(PyObject *self) +{ + unionobject *alias = (unionobject *)self; + + Py_XDECREF(alias->args); + self->ob_type->tp_free(self); +} + +static Py_hash_t +union_hash(PyObject *self) +{ + unionobject *alias = (unionobject *)self; + Py_hash_t h1 = PyObject_Hash(alias->args); + if (h1 == -1) { + return -1; + } + return h1; +} + +static int +is_generic_alias_in_args(PyObject *args) { + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { + PyObject *arg = PyTuple_GET_ITEM(args, iarg); + if (Py_TYPE(arg) == &Py_GenericAliasType) { + return 0; + } + } + return 1; +} + +static PyObject * +union_instancecheck(PyObject *self, PyObject *instance) +{ + unionobject *alias = (unionobject *) self; + Py_ssize_t nargs = PyTuple_GET_SIZE(alias->args); + if (!is_generic_alias_in_args(alias->args)) { + PyErr_SetString(PyExc_TypeError, + "isinstance() argument 2 cannot contain a parameterized generic"); + return NULL; + } + for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { + PyObject *arg = PyTuple_GET_ITEM(alias->args, iarg); + if (arg == Py_None) { + arg = (PyObject *)&_PyNone_Type; + } + if (PyType_Check(arg) && PyObject_IsInstance(instance, arg) != 0) { + Py_RETURN_TRUE; + } + } + Py_RETURN_FALSE; +} + +static PyObject * +union_subclasscheck(PyObject *self, PyObject *instance) +{ + if (!PyType_Check(instance)) { + PyErr_SetString(PyExc_TypeError, "issubclass() arg 1 must be a class"); + return NULL; + } + unionobject *alias = (unionobject *)self; + if (!is_generic_alias_in_args(alias->args)) { + PyErr_SetString(PyExc_TypeError, + "issubclass() argument 2 cannot contain a parameterized generic"); + return NULL; + } + Py_ssize_t nargs = PyTuple_GET_SIZE(alias->args); + for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { + PyObject *arg = PyTuple_GET_ITEM(alias->args, iarg); + if (PyType_Check(arg) && (PyType_IsSubtype((PyTypeObject *)instance, (PyTypeObject *)arg) != 0)) { + Py_RETURN_TRUE; + } + } + Py_RETURN_FALSE; +} + +static int +is_typing_module(PyObject *obj) { + PyObject *module = PyObject_GetAttrString(obj, "__module__"); + if (module == NULL) { + return -1; + } + int is_typing = PyUnicode_Check(module) && _PyUnicode_EqualToASCIIString(module, "typing"); + Py_DECREF(module); + return is_typing; +} + +static int +is_typing_name(PyObject *obj, char *name) +{ + PyTypeObject *type = Py_TYPE(obj); + if (strcmp(type->tp_name, name) != 0) { + return 0; + } + return is_typing_module(obj); +} + +static PyObject * +union_richcompare(PyObject *a, PyObject *b, int op) +{ + PyObject *result = NULL; + if (op != Py_EQ && op != Py_NE) { + result = Py_NotImplemented; + Py_INCREF(result); + return result; + } + + PyTypeObject *type = Py_TYPE(b); + + PyObject* a_set = PySet_New(((unionobject*)a)->args); + if (a_set == NULL) { + return NULL; + } + PyObject* b_set = PySet_New(NULL); + if (b_set == NULL) { + goto exit; + } + + // Populate b_set with the data from the right object + int is_typing_union = is_typing_name(b, "_UnionGenericAlias"); + if (is_typing_union < 0) { + goto exit; + } + if (is_typing_union) { + PyObject *b_args = PyObject_GetAttrString(b, "__args__"); + if (b_args == NULL) { + goto exit; + } + if (!PyTuple_CheckExact(b_args)) { + Py_DECREF(b_args); + PyErr_SetString(PyExc_TypeError, "__args__ argument of typing.Union object is not a tuple"); + goto exit; + } + Py_ssize_t b_arg_length = PyTuple_GET_SIZE(b_args); + for (Py_ssize_t i = 0; i < b_arg_length; i++) { + PyObject* arg = PyTuple_GET_ITEM(b_args, i); + if (arg == (PyObject *)&_PyNone_Type) { + arg = Py_None; + } + if (PySet_Add(b_set, arg) == -1) { + Py_DECREF(b_args); + goto exit; + } + } + Py_DECREF(b_args); + } else if (type == &_Py_UnionType) { + PyObject* args = ((unionobject*) b)->args; + Py_ssize_t arg_length = PyTuple_GET_SIZE(args); + for (Py_ssize_t i = 0; i < arg_length; i++) { + PyObject* arg = PyTuple_GET_ITEM(args, i); + if (PySet_Add(b_set, arg) == -1) { + goto exit; + } + } + } else { + if (PySet_Add(b_set, b) == -1) { + goto exit; + } + } + result = PyObject_RichCompare(a_set, b_set, op); +exit: + Py_XDECREF(a_set); + Py_XDECREF(b_set); + return result; +} + +static PyObject* +flatten_args(PyObject* args) +{ + int arg_length = PyTuple_GET_SIZE(args); + int total_args = 0; + // Get number of total args once it's flattened. + for (Py_ssize_t i = 0; i < arg_length; i++) { + PyObject *arg = PyTuple_GET_ITEM(args, i); + PyTypeObject* arg_type = Py_TYPE(arg); + if (arg_type == &_Py_UnionType) { + total_args += PyTuple_GET_SIZE(((unionobject*) arg)->args); + } else { + total_args++; + } + } + // Create new tuple of flattened args. + PyObject *flattened_args = PyTuple_New(total_args); + if (flattened_args == NULL) { + return NULL; + } + Py_ssize_t pos = 0; + for (Py_ssize_t i = 0; i < arg_length; i++) { + PyObject *arg = PyTuple_GET_ITEM(args, i); + PyTypeObject* arg_type = Py_TYPE(arg); + if (arg_type == &_Py_UnionType) { + PyObject* nested_args = ((unionobject*)arg)->args; + int nested_arg_length = PyTuple_GET_SIZE(nested_args); + for (int j = 0; j < nested_arg_length; j++) { + PyObject* nested_arg = PyTuple_GET_ITEM(nested_args, j); + Py_INCREF(nested_arg); + PyTuple_SET_ITEM(flattened_args, pos, nested_arg); + pos++; + } + } else { + Py_INCREF(arg); + PyTuple_SET_ITEM(flattened_args, pos, arg); + pos++; + } + } + return flattened_args; +} + +static PyObject* +dedup_and_flatten_args(PyObject* args) +{ + args = flatten_args(args); + if (args == NULL) { + return NULL; + } + Py_ssize_t arg_length = PyTuple_GET_SIZE(args); + PyObject *new_args = PyTuple_New(arg_length); + if (new_args == NULL) { + return NULL; + } + // Add unique elements to an array. + int added_items = 0; + for (Py_ssize_t i = 0; i < arg_length; i++) { + int is_duplicate = 0; + PyObject* i_element = PyTuple_GET_ITEM(args, i); + for (Py_ssize_t j = i + 1; j < arg_length; j++) { + PyObject* j_element = PyTuple_GET_ITEM(args, j); + if (i_element == j_element) { + is_duplicate = 1; + } + } + if (!is_duplicate) { + Py_INCREF(i_element); + PyTuple_SET_ITEM(new_args, added_items, i_element); + added_items++; + } + } + Py_DECREF(args); + _PyTuple_Resize(&new_args, added_items); + return new_args; +} + +static int +is_typevar(PyObject *obj) +{ + return is_typing_name(obj, "TypeVar"); +} + +static int +is_special_form(PyObject *obj) +{ + return is_typing_name(obj, "_SpecialForm"); +} + +static int +is_new_type(PyObject *obj) +{ + PyTypeObject *type = Py_TYPE(obj); + if (type != &PyFunction_Type) { + return 0; + } + return is_typing_module(obj); +} + +static int +is_unionable(PyObject *obj) +{ + if (obj == Py_None) { + return 1; + } + PyTypeObject *type = Py_TYPE(obj); + return ( + is_typevar(obj) || + is_new_type(obj) || + is_special_form(obj) || + PyType_Check(obj) || + type == &Py_GenericAliasType || + type == &_Py_UnionType); +} + +static PyObject * +type_or(PyTypeObject* self, PyObject* param) +{ + PyObject *tuple = PyTuple_Pack(2, self, param); + if (tuple == NULL) { + return NULL; + } + PyObject *new_union = _Py_Union(tuple); + Py_DECREF(tuple); + return new_union; +} + +static int +union_repr_item(_PyUnicodeWriter *writer, PyObject *p) +{ + _Py_IDENTIFIER(__module__); + _Py_IDENTIFIER(__qualname__); + _Py_IDENTIFIER(__origin__); + _Py_IDENTIFIER(__args__); + PyObject *qualname = NULL; + PyObject *module = NULL; + PyObject *r = NULL; + int err; + + int has_origin = _PyObject_HasAttrId(p, &PyId___origin__); + if (has_origin < 0) { + goto exit; + } + + if (has_origin) { + int has_args = _PyObject_HasAttrId(p, &PyId___args__); + if (has_args < 0) { + goto exit; + } + if (has_args) { + // It looks like a GenericAlias + goto use_repr; + } + } + + if (_PyObject_LookupAttrId(p, &PyId___qualname__, &qualname) < 0) { + goto exit; + } + if (qualname == NULL) { + goto use_repr; + } + if (_PyObject_LookupAttrId(p, &PyId___module__, &module) < 0) { + goto exit; + } + if (module == NULL || module == Py_None) { + goto use_repr; + } + + // Looks like a class + if (PyUnicode_Check(module) && + _PyUnicode_EqualToASCIIString(module, "builtins")) + { + // builtins don't need a module name + r = PyObject_Str(qualname); + goto exit; + } + else { + r = PyUnicode_FromFormat("%S.%S", module, qualname); + goto exit; + } + +use_repr: + r = PyObject_Repr(p); +exit: + Py_XDECREF(qualname); + Py_XDECREF(module); + if (r == NULL) { + return -1; + } + err = _PyUnicodeWriter_WriteStr(writer, r); + Py_DECREF(r); + return err; +} + +static PyObject * +union_repr(PyObject *self) +{ + unionobject *alias = (unionobject *)self; + Py_ssize_t len = PyTuple_GET_SIZE(alias->args); + + _PyUnicodeWriter writer; + _PyUnicodeWriter_Init(&writer); + for (Py_ssize_t i = 0; i < len; i++) { + if (i > 0 && _PyUnicodeWriter_WriteASCIIString(&writer, " | ", 3) < 0) { + goto error; + } + PyObject *p = PyTuple_GET_ITEM(alias->args, i); + if (union_repr_item(&writer, p) < 0) { + goto error; + } + } + return _PyUnicodeWriter_Finish(&writer); +error: + _PyUnicodeWriter_Dealloc(&writer); + return NULL; +} + +static PyMemberDef union_members[] = { + {"__args__", T_OBJECT, offsetof(unionobject, args), READONLY}, + {0} +}; + +static PyMethodDef union_methods[] = { + {"__instancecheck__", union_instancecheck, METH_O}, + {"__subclasscheck__", union_subclasscheck, METH_O}, + {0}}; + +static PyNumberMethods union_as_number = { + .nb_or = (binaryfunc)type_or, // Add __or__ function +}; + +PyTypeObject _Py_UnionType = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + .tp_name = "types.Union", + .tp_doc = "Represent a PEP 604 union type\n" + "\n" + "E.g. for int | str", + .tp_basicsize = sizeof(unionobject), + .tp_dealloc = unionobject_dealloc, + .tp_alloc = PyType_GenericAlloc, + .tp_free = PyObject_Del, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_hash = union_hash, + .tp_getattro = PyObject_GenericGetAttr, + .tp_members = union_members, + .tp_methods = union_methods, + .tp_richcompare = union_richcompare, + .tp_as_number = &union_as_number, + .tp_repr = union_repr, +}; + +PyObject * +_Py_Union(PyObject *args) +{ + assert(PyTuple_CheckExact(args)); + + unionobject* result = NULL; + + // Check arguments are unionable. + int nargs = PyTuple_GET_SIZE(args); + for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { + PyObject *arg = PyTuple_GET_ITEM(args, iarg); + if (arg == NULL) { + return NULL; + } + int is_arg_unionable = is_unionable(arg); + if (is_arg_unionable < 0) { + return NULL; + } + if (!is_arg_unionable) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + } + + result = PyObject_New(unionobject, &_Py_UnionType); + if (result == NULL) { + return NULL; + } + + result->args = dedup_and_flatten_args(args); + if (result->args == NULL) { + Py_DECREF(result); + return NULL; + } + return (PyObject*)result; +} diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 295b5e21eba5ce..266a193c1e86a3 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -196,6 +196,7 @@ + @@ -412,6 +413,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index ec82e42f61e8b0..22d9b791576987 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -573,6 +573,9 @@ Include\internal + + Include\internal + Modules\zlib @@ -1175,6 +1178,9 @@ Objects + + Objects + From d44c0151e3a00ca80d9a6759329eea4b9eff27a6 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 9 Sep 2020 19:17:14 -0300 Subject: [PATCH 0074/1261] Add missing colon to IDLE doc markup (GH-22007) --- Doc/library/idle.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 75b6fa3861b23d..43096b014fed34 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -491,7 +491,7 @@ in the settings dialog. (To prevent auto popups, set the delay to a large number of milliseconds, such as 100000000.) For imported module names or class or function attributes, type '.'. For filenames in the root directory, type :data:`os.sep` or -data:`os.altsep` immediately after an opening quote. (On Windows, +:data:`os.altsep` immediately after an opening quote. (On Windows, one can specify a drive first.) Move into subdirectories by typing a directory name and a separator. From ff80406b28a0fc7fb069b8ee351d38e61b909801 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Wed, 9 Sep 2020 18:53:18 -0400 Subject: [PATCH 0075/1261] Update idlelib/help.html to current IDLE doc (GH-22181) --- Lib/idlelib/help.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 81ce5100bb8ad5..b2853cffe0c26d 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -481,13 +481,13 @@

Automatic indentationos.sep or -data:os.altsep immediately after an opening quote. (On Windows, +os.altsep immediately after an opening quote. (On Windows, one can specify a drive first.) Move into subdirectories by typing a directory name and a separator.

-

Instead of waiting, or after a box is closed. open a completion box +

Instead of waiting, or after a box is closed, open a completion box immediately with Show Completions on the Edit menu. The default hot key is C-space. If one types a prefix for the desired name -before opening the box, the first match is displayed. +before opening the box, the first match or near miss is made visible. The result is the same as if one enters a prefix after the box is displayed. Show Completions after a quote completes filenames in the current directory instead of a root directory.

@@ -975,7 +975,7 @@

Navigation



- Last updated on Jul 08, 2020. + Last updated on Sep 09, 2020. Found a bug?
From b352c3e37160d0a54739aa567e6935fa596c35e9 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Thu, 10 Sep 2020 03:33:13 -0300 Subject: [PATCH 0076/1261] [doc] Remove superfluous comment about equal in f-strings (GH-22006) Automerge-Triggered-By: @kushaldas --- Doc/reference/lexical_analysis.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 4c0f5688da4d75..19ba83a5513d8a 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -702,7 +702,7 @@ defaults to the :func:`str` of the expression unless a conversion ``'!r'`` is declared. .. versionadded:: 3.8 - The equal sign ``'='`` was added in Python 3.8. + The equal sign ``'='``. If a conversion is specified, the result of evaluating the expression is converted before formatting. Conversion ``'!s'`` calls :func:`str` on From 718b00ba65bd1367f8c5bcc5eba0dfa198b90f13 Mon Sep 17 00:00:00 2001 From: Bar Harel Date: Thu, 10 Sep 2020 13:50:23 +0300 Subject: [PATCH 0077/1261] Update logging documentation to tidy up formatting (GH-22173) --- Doc/library/logging.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 989016e649d651..fb8ea705b0469f 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -529,8 +529,7 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on :ref:`logrecord-attributes`. -.. class:: Formatter(fmt=None, datefmt=None, style='%', validate=True, *, - defaults=None) +.. class:: Formatter(fmt=None, datefmt=None, style='%', validate=True, *, defaults=None) Returns a new instance of the :class:`Formatter` class. The instance is initialized with a format string for the message as a whole, as well as a From fb19f762ac1a100c0b87cf5d2182559a8a9c0028 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Thu, 10 Sep 2020 09:09:04 -0500 Subject: [PATCH 0078/1261] bpo-1635741: Port cmath to multi-phase init (PEP 489) (GH-22165) --- ...2020-09-08-21-58-47.bpo-1635741.vdjSLH.rst | 2 + Modules/cmathmodule.c | 78 ++++++++++++------- 2 files changed, 50 insertions(+), 30 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-08-21-58-47.bpo-1635741.vdjSLH.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-08-21-58-47.bpo-1635741.vdjSLH.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-08-21-58-47.bpo-1635741.vdjSLH.rst new file mode 100644 index 00000000000000..bc1a6c888e33bd --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-08-21-58-47.bpo-1635741.vdjSLH.rst @@ -0,0 +1,2 @@ +Port the :mod:`cmath` extension module to multi-phase initialization +(:pep:`489`). diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index 5eac4b4940bea4..0f22049a170848 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -1254,37 +1254,35 @@ static PyMethodDef cmath_methods[] = { {NULL, NULL} /* sentinel */ }; - -static struct PyModuleDef cmathmodule = { - PyModuleDef_HEAD_INIT, - "cmath", - module_doc, - -1, - cmath_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit_cmath(void) +static int +cmath_exec(PyObject *mod) { - PyObject *m; - - m = PyModule_Create(&cmathmodule); - if (m == NULL) - return NULL; - - PyModule_AddObject(m, "pi", - PyFloat_FromDouble(Py_MATH_PI)); - PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E)); - PyModule_AddObject(m, "tau", PyFloat_FromDouble(Py_MATH_TAU)); /* 2pi */ - PyModule_AddObject(m, "inf", PyFloat_FromDouble(m_inf())); - PyModule_AddObject(m, "infj", PyComplex_FromCComplex(c_infj())); + if (PyModule_AddObject(mod, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) { + return -1; + } + if (PyModule_AddObject(mod, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) { + return -1; + } + // 2pi + if (PyModule_AddObject(mod, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) { + return -1; + } + if (PyModule_AddObject(mod, "inf", PyFloat_FromDouble(m_inf())) < 0) { + return -1; + } + + if (PyModule_AddObject(mod, "infj", + PyComplex_FromCComplex(c_infj())) < 0) { + return -1; + } #if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN) - PyModule_AddObject(m, "nan", PyFloat_FromDouble(m_nan())); - PyModule_AddObject(m, "nanj", PyComplex_FromCComplex(c_nanj())); + if (PyModule_AddObject(mod, "nan", PyFloat_FromDouble(m_nan())) < 0) { + return -1; + } + if (PyModule_AddObject(mod, "nanj", + PyComplex_FromCComplex(c_nanj())) < 0) { + return -1; + } #endif /* initialize special value tables */ @@ -1401,5 +1399,25 @@ PyInit_cmath(void) C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N) C(N,N) C(N,N) C(N,0.) C(N,0.) C(N,N) C(N,N) C(N,N) }) - return m; + return 0; } + +static PyModuleDef_Slot cmath_slots[] = { + {Py_mod_exec, cmath_exec}, + {0, NULL} +}; + +static struct PyModuleDef cmathmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "cmath", + .m_doc = module_doc, + .m_size = 0, + .m_methods = cmath_methods, + .m_slots = cmath_slots +}; + +PyMODINIT_FUNC +PyInit_cmath(void) +{ + return PyModuleDef_Init(&cmathmodule); +} \ No newline at end of file From 4009bd05f6ac0b4c16dd6039cffd911f275126c3 Mon Sep 17 00:00:00 2001 From: Mark Roseman Date: Thu, 10 Sep 2020 13:04:20 -0700 Subject: [PATCH 0079/1261] bpo-37149: Change Shipman tkinter link from archive.org to TkDocs (GH-22188) The new link responds much faster and begins with a short explanation of the status of the doc. --- Doc/library/tkinter.rst | 2 +- .../next/Documentation/2020-09-10-07-48-02.bpo-37149.VD0rCv.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Documentation/2020-09-10-07-48-02.bpo-37149.VD0rCv.rst diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 9f954255c8b300..7739f2f60a7980 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -31,7 +31,7 @@ installed, so you can read the Tcl/Tk documentation specific to that version. `TKDocs `_ Extensive tutorial plus friendlier widget pages for some of the widgets. - `Tkinter 8.5 reference: a GUI for Python `_ + `Tkinter 8.5 reference: a GUI for Python `_ On-line reference material. `Tkinter docs from effbot `_ diff --git a/Misc/NEWS.d/next/Documentation/2020-09-10-07-48-02.bpo-37149.VD0rCv.rst b/Misc/NEWS.d/next/Documentation/2020-09-10-07-48-02.bpo-37149.VD0rCv.rst new file mode 100644 index 00000000000000..aeca652b4ed970 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-09-10-07-48-02.bpo-37149.VD0rCv.rst @@ -0,0 +1 @@ +Change Shipman tkinter doc link from archive.org to TkDocs. (The doc has been removed from the NMT server.) The new link responds much faster and includes a short explanatory note. From 6aa8818df4c77565b63e58fa678b12bcead37ffb Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Thu, 10 Sep 2020 18:59:02 -0500 Subject: [PATCH 0080/1261] Doc: Fix alphabetical ordering of removeprefix/suffix. (GH-22194) --- Doc/library/stdtypes.rst | 55 ++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 5a10faa7bbd293..0ffe7b7526fa76 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1568,33 +1568,6 @@ expression support in the :mod:`re` module). interpreted as in slice notation. -.. method:: str.removeprefix(prefix, /) - - If the string starts with the *prefix* string, return - ``string[len(prefix):]``. Otherwise, return a copy of the original - string:: - - >>> 'TestHook'.removeprefix('Test') - 'Hook' - >>> 'BaseTestCase'.removeprefix('Test') - 'BaseTestCase' - - .. versionadded:: 3.9 - -.. method:: str.removesuffix(suffix, /) - - If the string ends with the *suffix* string and that *suffix* is not empty, - return ``string[:-len(suffix)]``. Otherwise, return a copy of the - original string:: - - >>> 'MiscTests'.removesuffix('Tests') - 'Misc' - >>> 'TmpDirMixin'.removesuffix('Tests') - 'TmpDirMixin' - - .. versionadded:: 3.9 - - .. method:: str.encode(encoding="utf-8", errors="strict") Return an encoded version of the string as a bytes object. Default encoding @@ -1909,6 +1882,34 @@ expression support in the :mod:`re` module). the string itself, followed by two empty strings. +.. method:: str.removeprefix(prefix, /) + + If the string starts with the *prefix* string, return + ``string[len(prefix):]``. Otherwise, return a copy of the original + string:: + + >>> 'TestHook'.removeprefix('Test') + 'Hook' + >>> 'BaseTestCase'.removeprefix('Test') + 'BaseTestCase' + + .. versionadded:: 3.9 + + +.. method:: str.removesuffix(suffix, /) + + If the string ends with the *suffix* string and that *suffix* is not empty, + return ``string[:-len(suffix)]``. Otherwise, return a copy of the + original string:: + + >>> 'MiscTests'.removesuffix('Tests') + 'Misc' + >>> 'TmpDirMixin'.removesuffix('Tests') + 'TmpDirMixin' + + .. versionadded:: 3.9 + + .. method:: str.replace(old, new[, count]) Return a copy of the string with all occurrences of substring *old* replaced by From 597495c5c0f19a6525e0796e1558dacd2ccf312e Mon Sep 17 00:00:00 2001 From: Stargirl Flowers Date: Fri, 11 Sep 2020 08:20:12 -0700 Subject: [PATCH 0081/1261] [doc] struct: update note about network byte order form to be more helpful (GH-22201) Update the sentence to provide some context on why network byte order is defined as big endian. --- Doc/library/struct.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/struct.rst b/Doc/library/struct.rst index 856b6da8bb255d..eccba20fb8fe7e 100644 --- a/Doc/library/struct.rst +++ b/Doc/library/struct.rst @@ -159,8 +159,8 @@ the :ref:`format-characters` section. Note the difference between ``'@'`` and ``'='``: both use native byte order, but the size and alignment of the latter is standardized. -The form ``'!'`` is available for those poor souls who claim they can't remember -whether network byte order is big-endian or little-endian. +The form ``'!'`` represents the network byte order which is always big-endian +as defined in `IETF RFC 1700 `_. There is no way to indicate non-native byte order (force byte-swapping); use the appropriate choice of ``'<'`` or ``'>'``. @@ -467,3 +467,5 @@ The :mod:`struct` module also defines the following type: .. _half precision format: https://en.wikipedia.org/wiki/Half-precision_floating-point_format .. _ieee 754 standard: https://en.wikipedia.org/wiki/IEEE_floating_point#IEEE_754-2008 + +.. _IETF RFC 1700: https://tools.ietf.org/html/rfc1700 From 1f70edd29f88eaaa1b362f413f994403ced2d17b Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sat, 12 Sep 2020 01:51:52 -0400 Subject: [PATCH 0082/1261] bpo-41729: Fix test_winconsole failures (3) and hang (GH-22146) The problems occured with a repository build on machine with freshly updated Windows 10 Pro. --- PC/_testconsole.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/_testconsole.c b/PC/_testconsole.c index f6fcfcf1964b8a..b62f21c339aa41 100644 --- a/PC/_testconsole.c +++ b/PC/_testconsole.c @@ -63,7 +63,7 @@ _testconsole_write_input_impl(PyObject *module, PyObject *file, for (DWORD i = 0; i < size; ++i, ++p, ++prec) { prec->EventType = KEY_EVENT; prec->Event.KeyEvent.bKeyDown = TRUE; - prec->Event.KeyEvent.wRepeatCount = 10; + prec->Event.KeyEvent.wRepeatCount = 1; prec->Event.KeyEvent.uChar.UnicodeChar = *p; } From ac452a1af712315e1ae13ddb31ec53e75f252700 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sat, 12 Sep 2020 02:25:36 -0400 Subject: [PATCH 0083/1261] bpo-41731: Make test_cmd_line_script pass with -vv (GH-22206) Argument script_exec_args is usually an absolute file name, but twice has form ['-m', 'module_name']. --- Lib/test/test_cmd_line_script.py | 2 +- Misc/NEWS.d/next/Tests/2020-09-11-19-12-31.bpo-41731.Ivxh4U.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-09-11-19-12-31.bpo-41731.Ivxh4U.rst diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index 6c8c28f40b564b..f10ab40017a338 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -145,7 +145,7 @@ def _check_import_error(self, script_exec_args, expected_msg, *run_args, __isolated=False, __cwd=cwd, **env_vars ) if verbose > 1: - print('Output from test script %r:' % script_exec_args) + print(f'Output from test script {script_exec_args!r:}') print(repr(err)) print('Expected output: %r' % expected_msg) self.assertIn(expected_msg.encode('utf-8'), err) diff --git a/Misc/NEWS.d/next/Tests/2020-09-11-19-12-31.bpo-41731.Ivxh4U.rst b/Misc/NEWS.d/next/Tests/2020-09-11-19-12-31.bpo-41731.Ivxh4U.rst new file mode 100644 index 00000000000000..e368a60f77b1ea --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-09-11-19-12-31.bpo-41731.Ivxh4U.rst @@ -0,0 +1 @@ +Make test_cmd_line_script pass with option '-vv'. From 84416db25f6a0b5dc1a6b90c7a973d4c430ac184 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 12 Sep 2020 08:50:18 +0200 Subject: [PATCH 0084/1261] bpo-39651: Fix asyncio proactor _write_to_self() (GH-22197) Fix a race condition in the call_soon_threadsafe() method of asyncio.ProactorEventLoop: do nothing if the self-pipe socket has been closed. --- Lib/asyncio/proactor_events.py | 11 ++++++++++- Lib/asyncio/selector_events.py | 18 ++++++++++-------- .../2020-09-11-12-38-55.bpo-39651.JMp9l2.rst | 3 +++ 3 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-11-12-38-55.bpo-39651.JMp9l2.rst diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 4670bd683ab32c..45c11ee4b487ec 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -793,8 +793,17 @@ def _loop_self_reading(self, f=None): f.add_done_callback(self._loop_self_reading) def _write_to_self(self): + # This may be called from a different thread, possibly after + # _close_self_pipe() has been called or even while it is + # running. Guard for self._csock being None or closed. When + # a socket is closed, send() raises OSError (with errno set to + # EBADF, but let's not rely on the exact error code). + csock = self._csock + if csock is None: + return + try: - self._csock.send(b'\0') + csock.send(b'\0') except OSError: if self._debug: logger.debug("Fail to write a null byte into the " diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 8495a7901cd34c..59cb6b1babec54 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -133,14 +133,16 @@ def _write_to_self(self): # a socket is closed, send() raises OSError (with errno set to # EBADF, but let's not rely on the exact error code). csock = self._csock - if csock is not None: - try: - csock.send(b'\0') - except OSError: - if self._debug: - logger.debug("Fail to write a null byte into the " - "self-pipe socket", - exc_info=True) + if csock is None: + return + + try: + csock.send(b'\0') + except OSError: + if self._debug: + logger.debug("Fail to write a null byte into the " + "self-pipe socket", + exc_info=True) def _start_serving(self, protocol_factory, sock, sslcontext=None, server=None, backlog=100, diff --git a/Misc/NEWS.d/next/Library/2020-09-11-12-38-55.bpo-39651.JMp9l2.rst b/Misc/NEWS.d/next/Library/2020-09-11-12-38-55.bpo-39651.JMp9l2.rst new file mode 100644 index 00000000000000..78dcff13700292 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-11-12-38-55.bpo-39651.JMp9l2.rst @@ -0,0 +1,3 @@ +Fix a race condition in the ``call_soon_threadsafe()`` method of +``asyncio.ProactorEventLoop``: do nothing if the self-pipe socket has been +closed. From 9f5147f931d4a75d136d7bec0d8925a473a2ada8 Mon Sep 17 00:00:00 2001 From: Norbert Cyran Date: Sat, 12 Sep 2020 09:58:56 +0200 Subject: [PATCH 0085/1261] bpo-41672: Fix type mismatches in imaplib docs (GH-22207) --- Doc/library/imaplib.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/imaplib.rst b/Doc/library/imaplib.rst index 7c5b0750161598..02ecfd95d43767 100644 --- a/Doc/library/imaplib.rst +++ b/Doc/library/imaplib.rst @@ -143,7 +143,7 @@ The following utility functions are defined: .. function:: Int2AP(num) - Converts an integer into a string representation using characters from the set + Converts an integer into a bytes representation using characters from the set [``A`` .. ``P``]. @@ -197,7 +197,7 @@ you want to avoid having an argument string quoted (eg: the *flags* argument to Each command returns a tuple: ``(type, [data, ...])`` where *type* is usually ``'OK'`` or ``'NO'``, and *data* is either the text from the command response, -or mandated results from the command. Each *data* is either a string, or a +or mandated results from the command. Each *data* is either a ``bytes``, or a tuple. If a tuple, then the first part is the header of the response, and the second part contains the data (ie: 'literal' value). From f6719e475fa01d819d19e42c17b668a07de4c472 Mon Sep 17 00:00:00 2001 From: Sergey Fedoseev Date: Sun, 13 Sep 2020 22:59:01 +0500 Subject: [PATCH 0086/1261] bpo-33239: Fix default value of 'buffering' parameter in docs of tempfile.* functions (GH-21763) `None` doesn't work: ```python >>> import tempfile >>> tempfile.TemporaryFile(buffering=None) Traceback (most recent call last): File "", line 1, in File "/home/sergey/tmp/cpython-dev/Lib/tempfile.py", line 607, in TemporaryFile return _io.open(fd, mode, buffering=buffering, TypeError: 'NoneType' object cannot be interpreted as an integer ``` Automerge-Triggered-By: @vsajip --- Doc/library/tempfile.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index 3a2b88c0cb6a20..f9421da5fe7dfa 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -31,7 +31,7 @@ is recommended to use keyword arguments for clarity. The module defines the following user-callable items: -.. function:: TemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None) +.. function:: TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None) Return a :term:`file-like object` that can be used as a temporary storage area. The file is created securely, using the same rules as :func:`mkstemp`. It will be destroyed as soon @@ -72,7 +72,7 @@ The module defines the following user-callable items: Added *errors* parameter. -.. function:: NamedTemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None) +.. function:: NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None) This function operates exactly as :func:`TemporaryFile` does, except that the file is guaranteed to have a visible name in the file system (on @@ -93,7 +93,7 @@ The module defines the following user-callable items: Added *errors* parameter. -.. function:: SpooledTemporaryFile(max_size=0, mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None) +.. function:: SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None) This function operates exactly as :func:`TemporaryFile` does, except that data is spooled in memory until the file size exceeds *max_size*, or From 6b1e590a119f2107986129f7eb59640b9eead4fe Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sun, 13 Sep 2020 14:27:51 -0600 Subject: [PATCH 0087/1261] bpo-38967: Improve the error msg for reserved _sunder_ names in enum (GH-18370) --- Lib/enum.py | 3 ++- Lib/test/test_enum.py | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Lib/enum.py b/Lib/enum.py index 49b552ba0ecf6c..bc24f2ae2dfc01 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -76,7 +76,8 @@ def __setitem__(self, key, value): '_order_', '_create_pseudo_member_', '_generate_next_value_', '_missing_', '_ignore_', ): - raise ValueError('_names_ are reserved for future Enum use') + raise ValueError(f'_sunder_ names, such as "{key}", are ' + 'reserved for future Enum use') if key == '_generate_next_value_': # check if members already defined as auto() if self._auto_called: diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index e7bad624067731..b18f3b38a6619f 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -419,6 +419,11 @@ def red(self): green = 2 blue = 3 + def test_reserved__sunder_(self): + with self.assertRaisesRegex(ValueError, '_sunder_ names, such as ' + '"_bad_", are reserved'): + class Bad(Enum): + _bad_ = 1 def test_enum_with_value_name(self): class Huh(Enum): From f0ea6b7f1b4d9017e3a0aafaadec14d9d31ea939 Mon Sep 17 00:00:00 2001 From: Emmanuel Arias Date: Sun, 13 Sep 2020 18:05:44 -0300 Subject: [PATCH 0088/1261] bpo-41778: Change a punctuation on documentation. (GH-22229) On this paragrapah the clarification about IIS7 seems there's not connection beacuase is in other sentence. Move the punctuation to connect both the last sentence with the information in the parenthesis. I think the NEWS is not necessary here. Automerge-Triggered-By: @ericvsmith --- Doc/library/wsgiref.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/wsgiref.rst b/Doc/library/wsgiref.rst index 1e30aa4a898c13..e92a689de0b9ba 100644 --- a/Doc/library/wsgiref.rst +++ b/Doc/library/wsgiref.rst @@ -480,8 +480,8 @@ input, output, and error streams. rarely used and is not guaranteed by WSGI. On IIS<7, though, the setting can only be made on a vhost level, affecting all other script mappings, many of which break when exposed to the ``PATH_TRANSLATED`` bug. - For this reason IIS<7 is almost never deployed with the fix. (Even IIS7 - rarely uses it because there is still no UI for it.) + For this reason IIS<7 is almost never deployed with the fix (Even IIS7 + rarely uses it because there is still no UI for it.). There is no way for CGI code to tell whether the option was set, so a separate handler class is provided. It is used in the same way as From 783d9269884d926495fb2fb408f7b8644600ab0d Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Mon, 14 Sep 2020 01:18:01 -0400 Subject: [PATCH 0089/1261] bpo-39883: Update macOS installer copy of LICENSE. (GH-22235) --- Mac/BuildScript/resources/License.rtf | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/Mac/BuildScript/resources/License.rtf b/Mac/BuildScript/resources/License.rtf index 25d53386da01a5..1dfdc1edc17fab 100644 --- a/Mac/BuildScript/resources/License.rtf +++ b/Mac/BuildScript/resources/License.rtf @@ -1,9 +1,9 @@ -{\rtf1\ansi\ansicpg1252\cocoartf2511 +{\rtf1\ansi\ansicpg1252\cocoartf2513 \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; \f3\fmodern\fcharset0 CourierNewPSMT;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} -\margl1440\margr1440\vieww14620\viewh13380\viewkind0 +\margl1440\margr1440\vieww18500\viewh13520\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \f0\b\fs36 \cf0 \ul \ulc0 HISTORY AND LICENSE\ @@ -47,8 +47,17 @@ Thanks to the many outside volunteers who have worked under Guido's direction to \ \f0\b \ul TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\f1\b0 \ulnone \ +\f1\b0 \cf0 \ulnone Python software and documentation are licensed under the Python Software Foundation License Version 2.\ +\ +Starting with Python 3.8.6, examples, recipes, and other code in the documentation are dual licensed under the PSF License Version 2 and the Zero-Clause BSD license.\ +\ +Some software incorporated into Python is under different licenses. The licenses are listed with code falling under that license.\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ \f0\b PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2\ @@ -125,6 +134,18 @@ Permission to use, copy, modify, and distribute this software and its documentat STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\ \ \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\b \cf0 ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f1\b0 \cf0 \ +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.\ +\ +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\ \f0\b \ul LICENSES AND ACKNOWLEDGEMENTS FOR INCORPORATED SOFTWARE\ From 88785985ec54299b893009f4f5c138c5705e9c72 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 13 Sep 2020 23:33:41 -0700 Subject: [PATCH 0090/1261] bpo-41513: Add docs and tests for hypot() (GH-22238) --- Doc/library/math.rst | 5 +++++ Lib/test/test_math.py | 51 +++++++++++++++++++++++++++++++++++++++++++ Modules/mathmodule.c | 14 ++++++------ 3 files changed, 63 insertions(+), 7 deletions(-) diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 6ec1feee35a6dc..bbf64643ff59fc 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -481,6 +481,11 @@ Trigonometric functions Added support for n-dimensional points. Formerly, only the two dimensional case was supported. + .. versionchanged:: 3.10 + Improved the algorithm's accuracy so that the maximum error is + under 1 ulp (unit in the last place). More typically, the result + is almost always correctly rounded to within 1/2 ulp. + .. function:: sin(x) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 4d62eb1b119930..bbaa533c8489eb 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -803,6 +803,57 @@ def testHypot(self): scale = FLOAT_MIN / 2.0 ** exp self.assertEqual(math.hypot(4*scale, 3*scale), 5*scale) + def testHypotAccuracy(self): + # Verify improved accuracy in cases that were known to be inaccurate. + + hypot = math.hypot + Decimal = decimal.Decimal + high_precision = decimal.Context(prec=500) + + for hx, hy in [ + # Cases with a 1 ulp error in Python 3.7 compiled with Clang + ('0x1.10e89518dca48p+29', '0x1.1970f7565b7efp+30'), + ('0x1.10106eb4b44a2p+29', '0x1.ef0596cdc97f8p+29'), + ('0x1.459c058e20bb7p+30', '0x1.993ca009b9178p+29'), + ('0x1.378371ae67c0cp+30', '0x1.fbe6619854b4cp+29'), + ('0x1.f4cd0574fb97ap+29', '0x1.50fe31669340ep+30'), + ('0x1.494b2cdd3d446p+29', '0x1.212a5367b4c7cp+29'), + ('0x1.f84e649f1e46dp+29', '0x1.1fa56bef8eec4p+30'), + ('0x1.2e817edd3d6fap+30', '0x1.eb0814f1e9602p+29'), + ('0x1.0d3a6e3d04245p+29', '0x1.32a62fea52352p+30'), + ('0x1.888e19611bfc5p+29', '0x1.52b8e70b24353p+29'), + + # Cases with 2 ulp error in Python 3.8 + ('0x1.538816d48a13fp+29', '0x1.7967c5ca43e16p+29'), + ('0x1.57b47b7234530p+29', '0x1.74e2c7040e772p+29'), + ('0x1.821b685e9b168p+30', '0x1.677dc1c1e3dc6p+29'), + ('0x1.9e8247f67097bp+29', '0x1.24bd2dc4f4baep+29'), + ('0x1.b73b59e0cb5f9p+29', '0x1.da899ab784a97p+28'), + ('0x1.94a8d2842a7cfp+30', '0x1.326a51d4d8d8ap+30'), + ('0x1.e930b9cd99035p+29', '0x1.5a1030e18dff9p+30'), + ('0x1.1592bbb0e4690p+29', '0x1.a9c337b33fb9ap+29'), + ('0x1.1243a50751fd4p+29', '0x1.a5a10175622d9p+29'), + ('0x1.57a8596e74722p+30', '0x1.42d1af9d04da9p+30'), + + # Cases with 1 ulp error in version fff3c28052e6b0750d6218e00acacd2fded4991a + ('0x1.ee7dbd9565899p+29', '0x1.7ab4d6fc6e4b4p+29'), + ('0x1.5c6bfbec5c4dcp+30', '0x1.02511184b4970p+30'), + ('0x1.59dcebba995cap+30', '0x1.50ca7e7c38854p+29'), + ('0x1.768cdd94cf5aap+29', '0x1.9cfdc5571d38ep+29'), + ('0x1.dcf137d60262ep+29', '0x1.1101621990b3ep+30'), + ('0x1.3a2d006e288b0p+30', '0x1.e9a240914326cp+29'), + ('0x1.62a32f7f53c61p+29', '0x1.47eb6cd72684fp+29'), + ('0x1.d3bcb60748ef2p+29', '0x1.3f13c4056312cp+30'), + ('0x1.282bdb82f17f3p+30', '0x1.640ba4c4eed3ap+30'), + ('0x1.89d8c423ea0c6p+29', '0x1.d35dcfe902bc3p+29'), + ]: + with self.subTest(hx=hx, hy=hy): + x = float.fromhex(hx) + y = float.fromhex(hy) + with decimal.localcontext(high_precision): + z = float((Decimal(x)**2 + Decimal(y)**2).sqrt()) + self.assertEqual(hypot(x, y), z) + def testDist(self): from decimal import Decimal as D from fractions import Fraction as F diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 29137ae91a22ff..ecd291ecd1b4b0 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2429,7 +2429,7 @@ magnitude. We avoid this cost by arranging the calculation so that fabs(csum) is always as large as fabs(x). To establish the invariant, *csum* is initialized to 1.0 which is -always larger than x**2 after scaling or division by *max*. +always larger than x**2 after scaling or after division by *max*. After the loop is finished, the initial 1.0 is subtracted out for a net zero effect on the final sum. Since *csum* will be greater than 1.0, the subtraction of 1.0 will not cause fractional digits to be @@ -2458,7 +2458,7 @@ Since lo**2 is less than 1/2 ulp(csum), we have csum+lo*lo == csum. To minimize loss of information during the accumulation of fractional values, each term has a separate accumulator. This also breaks up sequential dependencies in the inner loop so the CPU can maximize -floating point throughput. [5] On a 2.6 GHz Haswell, adding one +floating point throughput. [4] On a 2.6 GHz Haswell, adding one dimension has an incremental cost of only 5ns -- for example when moving from hypot(x,y) to hypot(x,y,z). @@ -2470,7 +2470,7 @@ The differential correction starts with a value *x* that is the difference between the square of *h*, the possibly inaccurately rounded square root, and the accurately computed sum of squares. The correction is the first order term of the Maclaurin series -expansion of sqrt(h**2 + x) == h + x/(2*h) + O(x**2). [4] +expansion of sqrt(h**2 + x) == h + x/(2*h) + O(x**2). [5] Essentially, this differential correction is equivalent to one refinement step in Newton's divide-and-average square root @@ -2492,10 +2492,10 @@ exactly equal) was verified for 1 billion random inputs with n=5. [7] 1. Veltkamp-Dekker splitting: http://csclub.uwaterloo.ca/~pbarfuss/dekker1971.pdf 2. Compensated summation: http://www.ti3.tu-harburg.de/paper/rump/Ru08b.pdf 3. Square root differential correction: https://arxiv.org/pdf/1904.09481.pdf -4. https://www.wolframalpha.com/input/?i=Maclaurin+series+sqrt%28h**2+%2B+x%29+at+x%3D0 -5. https://bugs.python.org/file49439/hypot.png -6. https://bugs.python.org/file49435/best_frac.py -7. https://bugs.python.org/file49448/test_hypot_commutativity.py +4. Data dependency graph: https://bugs.python.org/file49439/hypot.png +5. https://www.wolframalpha.com/input/?i=Maclaurin+series+sqrt%28h**2+%2B+x%29+at+x%3D0 +6. Analysis of internal accuracy: https://bugs.python.org/file49435/best_frac.py +7. Commutativity test: https://bugs.python.org/file49448/test_hypot_commutativity.py */ From 333be8044b07542bf3fa924b2b5253c9f9b7f441 Mon Sep 17 00:00:00 2001 From: abdo Date: Mon, 14 Sep 2020 20:36:34 +0300 Subject: [PATCH 0091/1261] Fix a typo in locale Docs (#22233) --- Doc/library/locale.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst index bf57a083559168..678148a0dda294 100644 --- a/Doc/library/locale.rst +++ b/Doc/library/locale.rst @@ -508,7 +508,7 @@ Background, details, hints, tips and caveats -------------------------------------------- The C standard defines the locale as a program-wide property that may be -relatively expensive to change. On top of that, some implementation are broken +relatively expensive to change. On top of that, some implementations are broken in such a way that frequent locale changes may cause core dumps. This makes the locale somewhat painful to use correctly. From 0f55bc89884a71eea9c230fbe3031abb44d95652 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Mon, 14 Sep 2020 13:28:46 -0600 Subject: [PATCH 0092/1261] bpo-41646: Mention path-like objects support in the docs for shutil.copy() (GH-22208) --- Doc/library/shutil.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 1b094aeb9ca3d8..ecc3309ed5cc09 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -158,9 +158,9 @@ Directory and files operations .. function:: copy(src, dst, *, follow_symlinks=True) Copies the file *src* to the file or directory *dst*. *src* and *dst* - should be strings. If *dst* specifies a directory, the file will be - copied into *dst* using the base filename from *src*. Returns the - path to the newly created file. + should be :term:`path-like objects ` or strings. If + *dst* specifies a directory, the file will be copied into *dst* using the + base filename from *src*. Returns the path to the newly created file. If *follow_symlinks* is false, and *src* is a symbolic link, *dst* will be created as a symbolic link. If *follow_symlinks* From fd9abd67cdd1843a1db8ecc7e623a0b3c9d5b371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Mon, 14 Sep 2020 21:30:15 +0200 Subject: [PATCH 0093/1261] bpo-41744: Package python.props with correct name in NuGet package (GH-22154) NuGet automatically includes .props file from the build directory in the target using the package, but only if the .props file has the correct name: it must be $(id).props Rename python.props correspondingly in all the nuspec variants. Also keep python.props as it were for backward compatibility. --- .../next/Windows/2020-09-11-17-59-33.bpo-41744.e_ugDQ.rst | 1 + Tools/nuget/python.nuspec | 2 +- Tools/nuget/pythonarm32.nuspec | 3 ++- Tools/nuget/pythondaily.nuspec | 3 ++- Tools/nuget/pythonx86.nuspec | 3 ++- 5 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-09-11-17-59-33.bpo-41744.e_ugDQ.rst diff --git a/Misc/NEWS.d/next/Windows/2020-09-11-17-59-33.bpo-41744.e_ugDQ.rst b/Misc/NEWS.d/next/Windows/2020-09-11-17-59-33.bpo-41744.e_ugDQ.rst new file mode 100644 index 00000000000000..6106d6604c7dd5 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-09-11-17-59-33.bpo-41744.e_ugDQ.rst @@ -0,0 +1 @@ +Fixes automatic import of props file when using the Nuget package. \ No newline at end of file diff --git a/Tools/nuget/python.nuspec b/Tools/nuget/python.nuspec index 8f98e808916a32..2da5f2037eb234 100644 --- a/Tools/nuget/python.nuspec +++ b/Tools/nuget/python.nuspec @@ -13,6 +13,6 @@ - + diff --git a/Tools/nuget/pythonarm32.nuspec b/Tools/nuget/pythonarm32.nuspec index 273d79a0312bd9..2d197931edb32c 100644 --- a/Tools/nuget/pythonarm32.nuspec +++ b/Tools/nuget/pythonarm32.nuspec @@ -14,6 +14,7 @@ - + + diff --git a/Tools/nuget/pythondaily.nuspec b/Tools/nuget/pythondaily.nuspec index 5cf55806ddfb39..7df1983f42a6fe 100644 --- a/Tools/nuget/pythondaily.nuspec +++ b/Tools/nuget/pythondaily.nuspec @@ -13,6 +13,7 @@ - + + diff --git a/Tools/nuget/pythonx86.nuspec b/Tools/nuget/pythonx86.nuspec index 27ef67e7f5d363..ea878ba0bf390b 100644 --- a/Tools/nuget/pythonx86.nuspec +++ b/Tools/nuget/pythonx86.nuspec @@ -13,6 +13,7 @@ - + + From 3905243c52fe9e9ef10c152bea0c60238f619afb Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Mon, 14 Sep 2020 13:32:44 -0700 Subject: [PATCH 0094/1261] bpo-40721: add note about enum member name case (GH-22231) * UPPER_CASE preferred as enum members are constants --- Doc/library/enum.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 00bfb260c02047..32e8bbf9509273 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -19,6 +19,12 @@ An enumeration is a set of symbolic names (members) bound to unique, constant values. Within an enumeration, the members can be compared by identity, and the enumeration itself can be iterated over. +.. note:: Case of Enum Members + + Because Enums are used to represent constants we recommend using + UPPER_CASE names for enum members, and will be using that style + in our examples. + Module Contents --------------- From a8d007ac56602e85dcf3ff3a415b949fb260cbd1 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Mon, 14 Sep 2020 17:13:49 -0700 Subject: [PATCH 0095/1261] bpo-41513: Remove broken tests that fail on Gentoo (GH-22249) --- Lib/test/test_math.py | 51 ------------------------------------------- 1 file changed, 51 deletions(-) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index bbaa533c8489eb..4d62eb1b119930 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -803,57 +803,6 @@ def testHypot(self): scale = FLOAT_MIN / 2.0 ** exp self.assertEqual(math.hypot(4*scale, 3*scale), 5*scale) - def testHypotAccuracy(self): - # Verify improved accuracy in cases that were known to be inaccurate. - - hypot = math.hypot - Decimal = decimal.Decimal - high_precision = decimal.Context(prec=500) - - for hx, hy in [ - # Cases with a 1 ulp error in Python 3.7 compiled with Clang - ('0x1.10e89518dca48p+29', '0x1.1970f7565b7efp+30'), - ('0x1.10106eb4b44a2p+29', '0x1.ef0596cdc97f8p+29'), - ('0x1.459c058e20bb7p+30', '0x1.993ca009b9178p+29'), - ('0x1.378371ae67c0cp+30', '0x1.fbe6619854b4cp+29'), - ('0x1.f4cd0574fb97ap+29', '0x1.50fe31669340ep+30'), - ('0x1.494b2cdd3d446p+29', '0x1.212a5367b4c7cp+29'), - ('0x1.f84e649f1e46dp+29', '0x1.1fa56bef8eec4p+30'), - ('0x1.2e817edd3d6fap+30', '0x1.eb0814f1e9602p+29'), - ('0x1.0d3a6e3d04245p+29', '0x1.32a62fea52352p+30'), - ('0x1.888e19611bfc5p+29', '0x1.52b8e70b24353p+29'), - - # Cases with 2 ulp error in Python 3.8 - ('0x1.538816d48a13fp+29', '0x1.7967c5ca43e16p+29'), - ('0x1.57b47b7234530p+29', '0x1.74e2c7040e772p+29'), - ('0x1.821b685e9b168p+30', '0x1.677dc1c1e3dc6p+29'), - ('0x1.9e8247f67097bp+29', '0x1.24bd2dc4f4baep+29'), - ('0x1.b73b59e0cb5f9p+29', '0x1.da899ab784a97p+28'), - ('0x1.94a8d2842a7cfp+30', '0x1.326a51d4d8d8ap+30'), - ('0x1.e930b9cd99035p+29', '0x1.5a1030e18dff9p+30'), - ('0x1.1592bbb0e4690p+29', '0x1.a9c337b33fb9ap+29'), - ('0x1.1243a50751fd4p+29', '0x1.a5a10175622d9p+29'), - ('0x1.57a8596e74722p+30', '0x1.42d1af9d04da9p+30'), - - # Cases with 1 ulp error in version fff3c28052e6b0750d6218e00acacd2fded4991a - ('0x1.ee7dbd9565899p+29', '0x1.7ab4d6fc6e4b4p+29'), - ('0x1.5c6bfbec5c4dcp+30', '0x1.02511184b4970p+30'), - ('0x1.59dcebba995cap+30', '0x1.50ca7e7c38854p+29'), - ('0x1.768cdd94cf5aap+29', '0x1.9cfdc5571d38ep+29'), - ('0x1.dcf137d60262ep+29', '0x1.1101621990b3ep+30'), - ('0x1.3a2d006e288b0p+30', '0x1.e9a240914326cp+29'), - ('0x1.62a32f7f53c61p+29', '0x1.47eb6cd72684fp+29'), - ('0x1.d3bcb60748ef2p+29', '0x1.3f13c4056312cp+30'), - ('0x1.282bdb82f17f3p+30', '0x1.640ba4c4eed3ap+30'), - ('0x1.89d8c423ea0c6p+29', '0x1.d35dcfe902bc3p+29'), - ]: - with self.subTest(hx=hx, hy=hy): - x = float.fromhex(hx) - y = float.fromhex(hy) - with decimal.localcontext(high_precision): - z = float((Decimal(x)**2 + Decimal(y)**2).sqrt()) - self.assertEqual(hypot(x, y), z) - def testDist(self): from decimal import Decimal as D from fractions import Fraction as F From a8ae6fcf0a08ffca6b5a7fc79596521bcee5126b Mon Sep 17 00:00:00 2001 From: Neeraj Samtani Date: Tue, 15 Sep 2020 17:39:29 +0400 Subject: [PATCH 0096/1261] bpo-41776: Revise example of "continue" in the tutorial documentation (GH-22234) Revise example of "continue" in the tutorial documentation --- Doc/tutorial/controlflow.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 5d24a19cfc0796..b8aec2b04f13fb 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -210,15 +210,15 @@ iteration of the loop:: ... if num % 2 == 0: ... print("Found an even number", num) ... continue - ... print("Found a number", num) + ... print("Found an odd number", num) Found an even number 2 - Found a number 3 + Found an odd number 3 Found an even number 4 - Found a number 5 + Found an odd number 5 Found an even number 6 - Found a number 7 + Found an odd number 7 Found an even number 8 - Found a number 9 + Found an odd number 9 .. _tut-pass: From 9f3bd10b41e2b0ad25afd2dc6a3492ec0ac1274f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 15 Sep 2020 18:03:34 +0200 Subject: [PATCH 0097/1261] bpo-41631: _ast module uses again a global state (#21961) Partially revert commit ac46eb4ad6662cf6d771b20d8963658b2186c48c: "bpo-38113: Update the Python-ast.c generator to PEP384 (gh-15957)". Using a module state per module instance is causing subtle practical problems. For example, the Mercurial project replaces the __import__() function to implement lazy import, whereas Python expected that "import _ast" always return a fully initialized _ast module. Add _PyAST_Fini() to clear the state at exit. The _ast module has no state (set _astmodule.m_size to 0). Remove astmodule_traverse(), astmodule_clear() and astmodule_free() functions. --- Include/internal/pycore_pylifecycle.h | 1 + Lib/ast.py | 37 ++- Lib/test/test_ast.py | 84 ++++++ .../2020-08-26-11-23-31.bpo-41631.3jZcd9.rst | 5 + Parser/asdl_c.py | 61 ++-- Python/Python-ast.c | 275 ++---------------- Python/pylifecycle.c | 6 + 7 files changed, 160 insertions(+), 309 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-26-11-23-31.bpo-41631.3jZcd9.rst diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 22def3dbc8b661..6d84e37232b305 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -84,6 +84,7 @@ extern void _PyFaulthandler_Fini(void); extern void _PyHash_Fini(void); extern void _PyTraceMalloc_Fini(void); extern void _PyWarnings_Fini(PyInterpreterState *interp); +extern void _PyAST_Fini(PyThreadState *tstate); extern PyStatus _PyGILState_Init(PyThreadState *tstate); extern void _PyGILState_Fini(PyThreadState *tstate); diff --git a/Lib/ast.py b/Lib/ast.py index 65ebd0100de007..d860917f4d03ae 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -497,18 +497,20 @@ def generic_visit(self, node): return node -# The following code is for backward compatibility. -# It will be removed in future. +# If the ast module is loaded more than once, only add deprecated methods once +if not hasattr(Constant, 'n'): + # The following code is for backward compatibility. + # It will be removed in future. -def _getter(self): - """Deprecated. Use value instead.""" - return self.value + def _getter(self): + """Deprecated. Use value instead.""" + return self.value -def _setter(self, value): - self.value = value + def _setter(self, value): + self.value = value -Constant.n = property(_getter, _setter) -Constant.s = property(_getter, _setter) + Constant.n = property(_getter, _setter) + Constant.s = property(_getter, _setter) class _ABC(type): @@ -600,14 +602,19 @@ class ExtSlice(slice): def __new__(cls, dims=(), **kwargs): return Tuple(list(dims), Load(), **kwargs) -def _dims_getter(self): - """Deprecated. Use elts instead.""" - return self.elts +# If the ast module is loaded more than once, only add deprecated methods once +if not hasattr(Tuple, 'dims'): + # The following code is for backward compatibility. + # It will be removed in future. -def _dims_setter(self, value): - self.elts = value + def _dims_getter(self): + """Deprecated. Use elts instead.""" + return self.elts -Tuple.dims = property(_dims_getter, _dims_setter) + def _dims_setter(self, value): + self.elts = value + + Tuple.dims = property(_dims_getter, _dims_setter) class Suite(mod): """Deprecated AST node class. Unused in Python 3.""" diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index f5aef61ec6f7c0..5f57ce8724482a 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -1,7 +1,9 @@ import ast +import builtins import dis import os import sys +import types import unittest import warnings import weakref @@ -1945,6 +1947,88 @@ def visit_Ellipsis(self, node): ]) +@support.cpython_only +class ModuleStateTests(unittest.TestCase): + # bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. + + def check_ast_module(self): + # Check that the _ast module still works as expected + code = 'x + 1' + filename = '' + mode = 'eval' + + # Create _ast.AST subclasses instances + ast_tree = compile(code, filename, mode, flags=ast.PyCF_ONLY_AST) + + # Call PyAST_Check() + code = compile(ast_tree, filename, mode) + self.assertIsInstance(code, types.CodeType) + + def test_reload_module(self): + # bpo-41194: Importing the _ast module twice must not crash. + with support.swap_item(sys.modules, '_ast', None): + del sys.modules['_ast'] + import _ast as ast1 + + del sys.modules['_ast'] + import _ast as ast2 + + self.check_ast_module() + + # Unloading the two _ast module instances must not crash. + del ast1 + del ast2 + support.gc_collect() + + self.check_ast_module() + + def test_sys_modules(self): + # bpo-41631: Test reproducing a Mercurial crash when PyAST_Check() + # imported the _ast module internally. + lazy_mod = object() + + def my_import(name, *args, **kw): + sys.modules[name] = lazy_mod + return lazy_mod + + with support.swap_item(sys.modules, '_ast', None): + del sys.modules['_ast'] + + with support.swap_attr(builtins, '__import__', my_import): + # Test that compile() does not import the _ast module + self.check_ast_module() + self.assertNotIn('_ast', sys.modules) + + # Sanity check of the test itself + import _ast + self.assertIs(_ast, lazy_mod) + + def test_subinterpreter(self): + # bpo-41631: Importing and using the _ast module in a subinterpreter + # must not crash. + code = dedent(''' + import _ast + import ast + import gc + import sys + import types + + # Create _ast.AST subclasses instances and call PyAST_Check() + ast_tree = compile('x+1', '', 'eval', + flags=ast.PyCF_ONLY_AST) + code = compile(ast_tree, 'string', 'eval') + if not isinstance(code, types.CodeType): + raise AssertionError + + # Unloading the _ast module must not crash. + del ast, _ast + del sys.modules['ast'], sys.modules['_ast'] + gc.collect() + ''') + res = support.run_in_subinterp(code) + self.assertEqual(res, 0) + + def main(): if __name__ != '__main__': return diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-26-11-23-31.bpo-41631.3jZcd9.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-26-11-23-31.bpo-41631.3jZcd9.rst new file mode 100644 index 00000000000000..68bb51024d9e70 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-26-11-23-31.bpo-41631.3jZcd9.rst @@ -0,0 +1,5 @@ +The ``_ast`` module uses again a global state. Using a module state per module +instance is causing subtle practical problems. For example, the Mercurial +project replaces the ``__import__()`` function to implement lazy import, +whereas Python expected that ``import _ast`` always return a fully initialized +``_ast`` module. diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 6fe44b99f793bb..0c053393d688b8 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1089,11 +1089,9 @@ def visitModule(self, mod): static struct PyModuleDef _astmodule = { PyModuleDef_HEAD_INIT, .m_name = "_ast", - .m_size = sizeof(astmodulestate), + // The _ast module uses a global state (global_ast_state). + .m_size = 0, .m_slots = astmodule_slots, - .m_traverse = astmodule_traverse, - .m_clear = astmodule_clear, - .m_free = astmodule_free, }; PyMODINIT_FUNC @@ -1374,59 +1372,40 @@ def generate_module_def(f, mod): f.write(' PyObject *' + s + ';\n') f.write('} astmodulestate;\n\n') f.write(""" -static astmodulestate* -get_ast_state(PyObject *module) -{ - void *state = PyModule_GetState(module); - assert(state != NULL); - return (astmodulestate*)state; -} +// Forward declaration +static int init_types(astmodulestate *state); + +// bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. +static astmodulestate global_ast_state = {0}; static astmodulestate* get_global_ast_state(void) { - _Py_IDENTIFIER(_ast); - PyObject *name = _PyUnicode_FromId(&PyId__ast); // borrowed reference - if (name == NULL) { + astmodulestate* state = &global_ast_state; + if (!init_types(state)) { return NULL; } - PyObject *module = PyImport_GetModule(name); - if (module == NULL) { - if (PyErr_Occurred()) { - return NULL; - } - module = PyImport_Import(name); - if (module == NULL) { - return NULL; - } - } - astmodulestate *state = get_ast_state(module); - Py_DECREF(module); return state; } -static int astmodule_clear(PyObject *module) +static astmodulestate* +get_ast_state(PyObject* Py_UNUSED(module)) { - astmodulestate *state = get_ast_state(module); -""") - for s in module_state: - f.write(" Py_CLEAR(state->" + s + ');\n') - f.write(""" - return 0; + astmodulestate* state = get_global_ast_state(); + // get_ast_state() must only be called after _ast module is imported, + // and astmodule_exec() calls init_types() + assert(state != NULL); + return state; } -static int astmodule_traverse(PyObject *module, visitproc visit, void* arg) +void _PyAST_Fini(PyThreadState *tstate) { - astmodulestate *state = get_ast_state(module); + astmodulestate* state = &global_ast_state; """) for s in module_state: - f.write(" Py_VISIT(state->" + s + ');\n') + f.write(" Py_CLEAR(state->" + s + ');\n') f.write(""" - return 0; -} - -static void astmodule_free(void* module) { - astmodule_clear((PyObject*)module); + state->initialized = 0; } """) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 396a6832702b35..094010e6c9ddce 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -224,40 +224,35 @@ typedef struct { } astmodulestate; -static astmodulestate* -get_ast_state(PyObject *module) -{ - void *state = PyModule_GetState(module); - assert(state != NULL); - return (astmodulestate*)state; -} +// Forward declaration +static int init_types(astmodulestate *state); + +// bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. +static astmodulestate global_ast_state = {0}; static astmodulestate* get_global_ast_state(void) { - _Py_IDENTIFIER(_ast); - PyObject *name = _PyUnicode_FromId(&PyId__ast); // borrowed reference - if (name == NULL) { + astmodulestate* state = &global_ast_state; + if (!init_types(state)) { return NULL; } - PyObject *module = PyImport_GetModule(name); - if (module == NULL) { - if (PyErr_Occurred()) { - return NULL; - } - module = PyImport_Import(name); - if (module == NULL) { - return NULL; - } - } - astmodulestate *state = get_ast_state(module); - Py_DECREF(module); return state; } -static int astmodule_clear(PyObject *module) +static astmodulestate* +get_ast_state(PyObject* Py_UNUSED(module)) { - astmodulestate *state = get_ast_state(module); + astmodulestate* state = get_global_ast_state(); + // get_ast_state() must only be called after _ast module is imported, + // and astmodule_exec() calls init_types() + assert(state != NULL); + return state; +} + +void _PyAST_Fini(PyThreadState *tstate) +{ + astmodulestate* state = &global_ast_state; Py_CLEAR(state->AST_type); Py_CLEAR(state->Add_singleton); Py_CLEAR(state->Add_type); @@ -472,231 +467,7 @@ static int astmodule_clear(PyObject *module) Py_CLEAR(state->vararg); Py_CLEAR(state->withitem_type); - return 0; -} - -static int astmodule_traverse(PyObject *module, visitproc visit, void* arg) -{ - astmodulestate *state = get_ast_state(module); - Py_VISIT(state->AST_type); - Py_VISIT(state->Add_singleton); - Py_VISIT(state->Add_type); - Py_VISIT(state->And_singleton); - Py_VISIT(state->And_type); - Py_VISIT(state->AnnAssign_type); - Py_VISIT(state->Assert_type); - Py_VISIT(state->Assign_type); - Py_VISIT(state->AsyncFor_type); - Py_VISIT(state->AsyncFunctionDef_type); - Py_VISIT(state->AsyncWith_type); - Py_VISIT(state->Attribute_type); - Py_VISIT(state->AugAssign_type); - Py_VISIT(state->Await_type); - Py_VISIT(state->BinOp_type); - Py_VISIT(state->BitAnd_singleton); - Py_VISIT(state->BitAnd_type); - Py_VISIT(state->BitOr_singleton); - Py_VISIT(state->BitOr_type); - Py_VISIT(state->BitXor_singleton); - Py_VISIT(state->BitXor_type); - Py_VISIT(state->BoolOp_type); - Py_VISIT(state->Break_type); - Py_VISIT(state->Call_type); - Py_VISIT(state->ClassDef_type); - Py_VISIT(state->Compare_type); - Py_VISIT(state->Constant_type); - Py_VISIT(state->Continue_type); - Py_VISIT(state->Del_singleton); - Py_VISIT(state->Del_type); - Py_VISIT(state->Delete_type); - Py_VISIT(state->DictComp_type); - Py_VISIT(state->Dict_type); - Py_VISIT(state->Div_singleton); - Py_VISIT(state->Div_type); - Py_VISIT(state->Eq_singleton); - Py_VISIT(state->Eq_type); - Py_VISIT(state->ExceptHandler_type); - Py_VISIT(state->Expr_type); - Py_VISIT(state->Expression_type); - Py_VISIT(state->FloorDiv_singleton); - Py_VISIT(state->FloorDiv_type); - Py_VISIT(state->For_type); - Py_VISIT(state->FormattedValue_type); - Py_VISIT(state->FunctionDef_type); - Py_VISIT(state->FunctionType_type); - Py_VISIT(state->GeneratorExp_type); - Py_VISIT(state->Global_type); - Py_VISIT(state->GtE_singleton); - Py_VISIT(state->GtE_type); - Py_VISIT(state->Gt_singleton); - Py_VISIT(state->Gt_type); - Py_VISIT(state->IfExp_type); - Py_VISIT(state->If_type); - Py_VISIT(state->ImportFrom_type); - Py_VISIT(state->Import_type); - Py_VISIT(state->In_singleton); - Py_VISIT(state->In_type); - Py_VISIT(state->Interactive_type); - Py_VISIT(state->Invert_singleton); - Py_VISIT(state->Invert_type); - Py_VISIT(state->IsNot_singleton); - Py_VISIT(state->IsNot_type); - Py_VISIT(state->Is_singleton); - Py_VISIT(state->Is_type); - Py_VISIT(state->JoinedStr_type); - Py_VISIT(state->LShift_singleton); - Py_VISIT(state->LShift_type); - Py_VISIT(state->Lambda_type); - Py_VISIT(state->ListComp_type); - Py_VISIT(state->List_type); - Py_VISIT(state->Load_singleton); - Py_VISIT(state->Load_type); - Py_VISIT(state->LtE_singleton); - Py_VISIT(state->LtE_type); - Py_VISIT(state->Lt_singleton); - Py_VISIT(state->Lt_type); - Py_VISIT(state->MatMult_singleton); - Py_VISIT(state->MatMult_type); - Py_VISIT(state->Mod_singleton); - Py_VISIT(state->Mod_type); - Py_VISIT(state->Module_type); - Py_VISIT(state->Mult_singleton); - Py_VISIT(state->Mult_type); - Py_VISIT(state->Name_type); - Py_VISIT(state->NamedExpr_type); - Py_VISIT(state->Nonlocal_type); - Py_VISIT(state->NotEq_singleton); - Py_VISIT(state->NotEq_type); - Py_VISIT(state->NotIn_singleton); - Py_VISIT(state->NotIn_type); - Py_VISIT(state->Not_singleton); - Py_VISIT(state->Not_type); - Py_VISIT(state->Or_singleton); - Py_VISIT(state->Or_type); - Py_VISIT(state->Pass_type); - Py_VISIT(state->Pow_singleton); - Py_VISIT(state->Pow_type); - Py_VISIT(state->RShift_singleton); - Py_VISIT(state->RShift_type); - Py_VISIT(state->Raise_type); - Py_VISIT(state->Return_type); - Py_VISIT(state->SetComp_type); - Py_VISIT(state->Set_type); - Py_VISIT(state->Slice_type); - Py_VISIT(state->Starred_type); - Py_VISIT(state->Store_singleton); - Py_VISIT(state->Store_type); - Py_VISIT(state->Sub_singleton); - Py_VISIT(state->Sub_type); - Py_VISIT(state->Subscript_type); - Py_VISIT(state->Try_type); - Py_VISIT(state->Tuple_type); - Py_VISIT(state->TypeIgnore_type); - Py_VISIT(state->UAdd_singleton); - Py_VISIT(state->UAdd_type); - Py_VISIT(state->USub_singleton); - Py_VISIT(state->USub_type); - Py_VISIT(state->UnaryOp_type); - Py_VISIT(state->While_type); - Py_VISIT(state->With_type); - Py_VISIT(state->YieldFrom_type); - Py_VISIT(state->Yield_type); - Py_VISIT(state->__dict__); - Py_VISIT(state->__doc__); - Py_VISIT(state->__module__); - Py_VISIT(state->_attributes); - Py_VISIT(state->_fields); - Py_VISIT(state->alias_type); - Py_VISIT(state->annotation); - Py_VISIT(state->arg); - Py_VISIT(state->arg_type); - Py_VISIT(state->args); - Py_VISIT(state->argtypes); - Py_VISIT(state->arguments_type); - Py_VISIT(state->asname); - Py_VISIT(state->ast); - Py_VISIT(state->attr); - Py_VISIT(state->bases); - Py_VISIT(state->body); - Py_VISIT(state->boolop_type); - Py_VISIT(state->cause); - Py_VISIT(state->cmpop_type); - Py_VISIT(state->col_offset); - Py_VISIT(state->comparators); - Py_VISIT(state->comprehension_type); - Py_VISIT(state->context_expr); - Py_VISIT(state->conversion); - Py_VISIT(state->ctx); - Py_VISIT(state->decorator_list); - Py_VISIT(state->defaults); - Py_VISIT(state->elt); - Py_VISIT(state->elts); - Py_VISIT(state->end_col_offset); - Py_VISIT(state->end_lineno); - Py_VISIT(state->exc); - Py_VISIT(state->excepthandler_type); - Py_VISIT(state->expr_context_type); - Py_VISIT(state->expr_type); - Py_VISIT(state->finalbody); - Py_VISIT(state->format_spec); - Py_VISIT(state->func); - Py_VISIT(state->generators); - Py_VISIT(state->handlers); - Py_VISIT(state->id); - Py_VISIT(state->ifs); - Py_VISIT(state->is_async); - Py_VISIT(state->items); - Py_VISIT(state->iter); - Py_VISIT(state->key); - Py_VISIT(state->keys); - Py_VISIT(state->keyword_type); - Py_VISIT(state->keywords); - Py_VISIT(state->kind); - Py_VISIT(state->kw_defaults); - Py_VISIT(state->kwarg); - Py_VISIT(state->kwonlyargs); - Py_VISIT(state->left); - Py_VISIT(state->level); - Py_VISIT(state->lineno); - Py_VISIT(state->lower); - Py_VISIT(state->mod_type); - Py_VISIT(state->module); - Py_VISIT(state->msg); - Py_VISIT(state->name); - Py_VISIT(state->names); - Py_VISIT(state->op); - Py_VISIT(state->operand); - Py_VISIT(state->operator_type); - Py_VISIT(state->ops); - Py_VISIT(state->optional_vars); - Py_VISIT(state->orelse); - Py_VISIT(state->posonlyargs); - Py_VISIT(state->returns); - Py_VISIT(state->right); - Py_VISIT(state->simple); - Py_VISIT(state->slice); - Py_VISIT(state->step); - Py_VISIT(state->stmt_type); - Py_VISIT(state->tag); - Py_VISIT(state->target); - Py_VISIT(state->targets); - Py_VISIT(state->test); - Py_VISIT(state->type); - Py_VISIT(state->type_comment); - Py_VISIT(state->type_ignore_type); - Py_VISIT(state->type_ignores); - Py_VISIT(state->unaryop_type); - Py_VISIT(state->upper); - Py_VISIT(state->value); - Py_VISIT(state->values); - Py_VISIT(state->vararg); - Py_VISIT(state->withitem_type); - - return 0; -} - -static void astmodule_free(void* module) { - astmodule_clear((PyObject*)module); + state->initialized = 0; } static int init_identifiers(astmodulestate *state) @@ -10316,11 +10087,9 @@ static PyModuleDef_Slot astmodule_slots[] = { static struct PyModuleDef _astmodule = { PyModuleDef_HEAD_INIT, .m_name = "_ast", - .m_size = sizeof(astmodulestate), + // The _ast module uses a global state (global_ast_state). + .m_size = 0, .m_slots = astmodule_slots, - .m_traverse = astmodule_traverse, - .m_clear = astmodule_clear, - .m_free = astmodule_free, }; PyMODINIT_FUNC diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index ab5a6767864dc5..75d57805c07b6a 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1259,6 +1259,12 @@ flush_std_files(void) static void finalize_interp_types(PyThreadState *tstate) { + // The _ast module state is shared by all interpreters. + // The state must only be cleared by the main interpreter. + if (_Py_IsMainInterpreter(tstate)) { + _PyAST_Fini(tstate); + } + _PyExc_Fini(tstate); _PyFrame_Fini(tstate); _PyAsyncGen_Fini(tstate); From 96a80a8b1a59d902cb18130e490549731f33f9bd Mon Sep 17 00:00:00 2001 From: Mandeep Date: Tue, 15 Sep 2020 15:20:49 -0400 Subject: [PATCH 0098/1261] Improve the description of difflib in the documentation (GH-22253) From "can produce difference information in various formats ..." to " can produce information about file differences in various formats ..." Automerge-Triggered-By: @Mariatta --- Doc/library/difflib.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst index 25e3511d017858..aa08988c8b36f7 100644 --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -18,8 +18,8 @@ -------------- This module provides classes and functions for comparing sequences. It -can be used for example, for comparing files, and can produce difference -information in various formats, including HTML and context and unified +can be used for example, for comparing files, and can produce information +about file differences in various formats, including HTML and context and unified diffs. For comparing directories and files, see also, the :mod:`filecmp` module. From eae7f9fae4ab36c1d06d6c4274ac75d884434966 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Tue, 15 Sep 2020 12:27:06 -0700 Subject: [PATCH 0099/1261] minor reformat of enum tests (GH-22259) Automerge-Triggered-By: @ethanfurman --- Lib/test/test_enum.py | 70 +++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index b18f3b38a6619f..138f572906a478 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -420,8 +420,10 @@ def red(self): blue = 3 def test_reserved__sunder_(self): - with self.assertRaisesRegex(ValueError, '_sunder_ names, such as ' - '"_bad_", are reserved'): + with self.assertRaisesRegex( + ValueError, + '_sunder_ names, such as "_bad_", are reserved', + ): class Bad(Enum): _bad_ = 1 @@ -1136,9 +1138,11 @@ def __name__(self): return self._intname def __repr__(self): # repr() is updated to include the name and type info - return "{}({!r}, {})".format(type(self).__name__, - self.__name__, - int.__repr__(self)) + return "{}({!r}, {})".format( + type(self).__name__, + self.__name__, + int.__repr__(self), + ) def __str__(self): # str() is unchanged, even if it relies on the repr() fallback base = int @@ -1153,7 +1157,8 @@ def __add__(self, other): if isinstance(self, NamedInt) and isinstance(other, NamedInt): return NamedInt( '({0} + {1})'.format(self.__name__, other.__name__), - temp ) + temp, + ) else: return temp @@ -1193,9 +1198,11 @@ def __name__(self): return self._intname def __repr__(self): # repr() is updated to include the name and type info - return "{}({!r}, {})".format(type(self).__name__, - self.__name__, - int.__repr__(self)) + return "{}({!r}, {})".format( + type(self).__name__, + self.__name__, + int.__repr__(self), + ) def __str__(self): # str() is unchanged, even if it relies on the repr() fallback base = int @@ -1210,7 +1217,8 @@ def __add__(self, other): if isinstance(self, NamedInt) and isinstance(other, NamedInt): return NamedInt( '({0} + {1})'.format(self.__name__, other.__name__), - temp ) + temp, + ) else: return temp @@ -1250,9 +1258,11 @@ def __name__(self): return self._intname def __repr__(self): # repr() is updated to include the name and type info - return "{}({!r}, {})".format(type(self).__name__, - self.__name__, - int.__repr__(self)) + return "{}({!r}, {})".format( + type(self).__name__, + self.__name__, + int.__repr__(self), + ) def __str__(self): # str() is unchanged, even if it relies on the repr() fallback base = int @@ -1267,7 +1277,8 @@ def __add__(self, other): if isinstance(self, NamedInt) and isinstance(other, NamedInt): return NamedInt( '({0} + {1})'.format(self.__name__, other.__name__), - temp ) + temp, + ) else: return temp @@ -1307,9 +1318,11 @@ def __name__(self): return self._intname def __repr__(self): # repr() is updated to include the name and type info - return "{}({!r}, {})".format(type(self).__name__, - self.__name__, - int.__repr__(self)) + return "{}({!r}, {})".format( + type(self).__name__, + self.__name__, + int.__repr__(self), + ) def __str__(self): # str() is unchanged, even if it relies on the repr() fallback base = int @@ -1324,7 +1337,8 @@ def __add__(self, other): if isinstance(self, NamedInt) and isinstance(other, NamedInt): return NamedInt( '({0} + {1})'.format(self.__name__, other.__name__), - temp ) + temp, + ) else: return temp @@ -1333,7 +1347,6 @@ class NEI(NamedInt, Enum): x = ('the-x', 1) y = ('the-y', 2) - self.assertIs(NEI.__new__, Enum.__new__) self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)") globals()['NamedInt'] = NamedInt @@ -1362,9 +1375,11 @@ def __name__(self): return self._intname def __repr__(self): # repr() is updated to include the name and type info - return "{}({!r}, {})".format(type(self).__name__, - self.__name__, - int.__repr__(self)) + return "{}({!r}, {})".format( + type(self).__name__, + self.__name__, + int.__repr__(self), + ) def __str__(self): # str() is unchanged, even if it relies on the repr() fallback base = int @@ -1415,9 +1430,11 @@ def __name__(self): return self._intname def __repr__(self): # repr() is updated to include the name and type info - return "{}({!r}, {})".format(type(self).__name__, - self.__name__, - int.__repr__(self)) + return "{}({!r}, {})".format( + type(self).__name__, + self.__name__, + int.__repr__(self), + ) def __str__(self): # str() is unchanged, even if it relies on the repr() fallback base = int @@ -1432,7 +1449,8 @@ def __add__(self, other): if isinstance(self, NamedInt) and isinstance(other, NamedInt): return NamedInt( '({0} + {1})'.format(self.__name__, other.__name__), - temp ) + temp, + ) else: return temp From 822fa7ce96b1acb3cfc6f33ddd2f6c76d5f40593 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Tue, 15 Sep 2020 17:13:26 -0300 Subject: [PATCH 0100/1261] Fix all Python Cookbook links (#22205) --- Doc/faq/programming.rst | 2 +- Doc/howto/urllib2.rst | 2 +- Doc/library/bisect.rst | 2 +- Doc/library/collections.abc.rst | 2 +- Doc/library/collections.rst | 4 ++-- Doc/library/difflib.rst | 2 +- Doc/library/math.rst | 2 +- Doc/library/random.rst | 2 +- Doc/library/shelve.rst | 2 +- Doc/library/stdtypes.rst | 2 +- Doc/library/sys.rst | 2 +- Doc/tutorial/whatnow.rst | 2 +- Doc/whatsnew/3.2.rst | 4 ++-- Lib/collections/__init__.py | 2 +- Lib/heapq.py | 2 +- Lib/test/test_math.py | 2 +- Tools/peg_generator/pegen/sccutils.py | 4 ++-- 17 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 66d210a55fac7e..eecbbf4a5c4ff7 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1141,7 +1141,7 @@ How do you remove duplicates from a list? See the Python Cookbook for a long discussion of many ways to do this: - https://code.activestate.com/recipes/52560/ + https://github.com/ActiveState/code/tree/master/recipes/Python/52560_Remove_duplicates/recipe-52560.py If you don't mind reordering the list, sort it and then scan from the end of the list, deleting duplicates as you go:: diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 046a88af62f0b3..38623371fbabff 100644 --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -601,5 +601,5 @@ This document was reviewed and revised by John Lee. scripts with a localhost server, I have to prevent urllib from using the proxy. .. [#] urllib opener for SSL proxy (CONNECT method): `ASPN Cookbook Recipe - `_. + `_. diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index 6bf7814b257f4a..6666d55abe2e50 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -60,7 +60,7 @@ The following functions are provided: .. seealso:: `SortedCollection recipe - `_ that uses + `_ that uses bisect to build a full-featured collection class with straight-forward search methods and support for a key-function. The keys are precomputed to save unnecessary calls to the key function during searches. diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst index db0e25bb0772eb..a6038098675da2 100644 --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -308,7 +308,7 @@ Notes on using :class:`Set` and :class:`MutableSet` as a mixin: .. seealso:: - * `OrderedSet recipe `_ for an + * `OrderedSet recipe `_ for an example built on :class:`MutableSet`. * For more about ABCs, see the :mod:`abc` module and :pep:`3119`. diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index f538da5e1c9faa..a7d01b3f397a70 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -135,12 +135,12 @@ The class can be used to simulate nested scopes and is useful in templating. :attr:`~collections.ChainMap.parents` property. * The `Nested Contexts recipe - `_ has options to control + `_ has options to control whether writes and other mutations apply only to the first mapping or to any mapping in the chain. * A `greatly simplified read-only version of Chainmap - `_. + `_. :class:`ChainMap` Examples and Recipes diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst index aa08988c8b36f7..009b7976dff15f 100644 --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -633,7 +633,7 @@ If you want to know how to change the first sequence into the second, use work. * `Simple version control recipe - `_ for a small application + `_ for a small application built with :class:`SequenceMatcher`. diff --git a/Doc/library/math.rst b/Doc/library/math.rst index bbf64643ff59fc..f152c45a87aa37 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -123,7 +123,7 @@ Number-theoretic and representation functions For further discussion and two alternative approaches, see the `ASPN cookbook recipes for accurate floating point summation - `_\. + `_\. .. function:: gcd(*integers) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 0cdf0a6ac4a477..4e97b1dbad85c1 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -57,7 +57,7 @@ from sources provided by the operating system. `Complementary-Multiply-with-Carry recipe - `_ for a compatible alternative + `_ for a compatible alternative random number generator with a long period and comparatively simple update operations. diff --git a/Doc/library/shelve.rst b/Doc/library/shelve.rst index f08c58179a2f9f..a94255bbf698e9 100644 --- a/Doc/library/shelve.rst +++ b/Doc/library/shelve.rst @@ -75,7 +75,7 @@ Two additional methods are supported: .. seealso:: - `Persistent dictionary recipe `_ + `Persistent dictionary recipe `_ with widely supported storage formats and having the speed of native dictionaries. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 0ffe7b7526fa76..2eee22c79af769 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1404,7 +1404,7 @@ objects that compare equal might have different :attr:`~range.start`, .. seealso:: - * The `linspace recipe `_ + * The `linspace recipe `_ shows how to implement a lazy version of range suitable for floating point applications. diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index d201d7061f9801..aa417ede402286 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -679,7 +679,7 @@ always available. additional garbage collector overhead if the object is managed by the garbage collector. - See `recursive sizeof recipe `_ + See `recursive sizeof recipe `_ for an example of using :func:`getsizeof` recursively to find the size of containers and all their contents. diff --git a/Doc/tutorial/whatnow.rst b/Doc/tutorial/whatnow.rst index 3208201312b871..38ce9f0a900c28 100644 --- a/Doc/tutorial/whatnow.rst +++ b/Doc/tutorial/whatnow.rst @@ -43,7 +43,7 @@ More Python resources: for download. Once you begin releasing code, you can register it here so that others can find it. -* https://code.activestate.com/recipes/langs/python/: The Python Cookbook is a +* https://github.com/ActiveState/code/tree/master/recipes/Python: The Python Cookbook is a sizable collection of code examples, larger modules, and useful scripts. Particularly notable contributions are collected in a book also titled Python Cookbook (O'Reilly & Associates, ISBN 0-596-00797-3.) diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 06bee9966c0be2..37bae34ce74adc 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -781,8 +781,8 @@ functools (Contributed by Raymond Hettinger and incorporating design ideas from Jim Baker, Miki Tebeka, and Nick Coghlan; see `recipe 498245 - `_\, `recipe 577479 - `_\, :issue:`10586`, and + `_\, `recipe 577479 + `_\, :issue:`10586`, and :issue:`10593`.) * The :func:`functools.wraps` decorator now adds a :attr:`__wrapped__` attribute diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 5d75501645fc4a..f4da9d0cefd6bf 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -574,7 +574,7 @@ class Counter(dict): # http://en.wikipedia.org/wiki/Multiset # http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html # http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm - # http://code.activestate.com/recipes/259174/ + # https://github.com/ActiveState/code/tree/master/recipes/Python/259174_bag_collection_class/recipe-259174.py # Knuth, TAOCP Vol. II section 4.6.3 def __init__(self, iterable=None, /, **kwds): diff --git a/Lib/heapq.py b/Lib/heapq.py index fabefd87f8bf8c..5895562db4142b 100644 --- a/Lib/heapq.py +++ b/Lib/heapq.py @@ -456,7 +456,7 @@ def merge(*iterables, key=None, reverse=False): # 2) Made multiple passes over the data. # 3) Made more comparisons in common cases (small k, large n, semi-random input). # See the more detailed comparison of approach at: -# http://code.activestate.com/recipes/577573-compare-algorithms-for-heapqsmallest +# https://github.com/ActiveState/code/tree/master/recipes/Python/577573_Compare_algorithms/recipe-577573.py def nsmallest(n, iterable, key=None): """Find the n smallest elements in a dataset. diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 4d62eb1b119930..f5283c5e0dcb63 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -611,7 +611,7 @@ def testFsum(self): def msum(iterable): """Full precision summation. Compute sum(iterable) without any intermediate accumulation of error. Based on the 'lsum' function - at http://code.activestate.com/recipes/393090/ + at https://github.com/ActiveState/code/tree/master/recipes/Python/393090_Binary_floating_point_summatiaccurate_full/recipe-393090.py """ tmant, texp = 0, 0 diff --git a/Tools/peg_generator/pegen/sccutils.py b/Tools/peg_generator/pegen/sccutils.py index 1f0586bb2f7d6d..0c295196607ec8 100644 --- a/Tools/peg_generator/pegen/sccutils.py +++ b/Tools/peg_generator/pegen/sccutils.py @@ -18,7 +18,7 @@ def strongly_connected_components( exactly once; vertices not part of a SCC are returned as singleton sets. - From http://code.activestate.com/recipes/578507/. + From https://github.com/ActiveState/code/tree/master/recipes/Python/578507_Strongly_connected_components_directed/recipe-578507.py. """ identified: Set[str] = set() stack: List[str] = [] @@ -81,7 +81,7 @@ def topsort( {B, C} {A} - From http://code.activestate.com/recipes/577413/. + From https://github.com/ActiveState/code/tree/master/recipes/Python/577413_Topological_Sort/recipe-577413.py. """ # TODO: Use a faster algorithm? for k, v in data.items(): From ca39a5cedbb6f7f809c0d71be11c9696d7621095 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Wed, 16 Sep 2020 00:58:32 +0300 Subject: [PATCH 0101/1261] bpo-41780: Fix __dir__ of types.GenericAlias (GH-22262) Automerge-Triggered-By: @gvanrossum --- Lib/test/test_genericalias.py | 5 +++ .../2020-09-15-23-29-49.bpo-41780.bOBUIH.rst | 2 + Objects/genericaliasobject.c | 39 +++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-15-23-29-49.bpo-41780.bOBUIH.rst diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 1f24469471428a..643fffc073e82f 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -287,6 +287,11 @@ def test_union_generic(self): self.assertEqual(a.__args__, (list[T], tuple[T, ...])) self.assertEqual(a.__parameters__, (T,)) + def test_dir(self): + dir_of_gen_alias = set(dir(list[int])) + self.assertTrue(dir_of_gen_alias.issuperset(dir(list))) + for generic_alias_property in ("__origin__", "__args__", "__parameters__"): + self.assertIn(generic_alias_property, dir_of_gen_alias) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-15-23-29-49.bpo-41780.bOBUIH.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-15-23-29-49.bpo-41780.bOBUIH.rst new file mode 100644 index 00000000000000..9a7594fc453381 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-15-23-29-49.bpo-41780.bOBUIH.rst @@ -0,0 +1,2 @@ +Fix :meth:`__dir__` of :class:`types.GenericAlias`. Patch by Batuhan +Taskaya. diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 87bd1ae5c1430b..ab56e1c4bf1a86 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -487,11 +487,50 @@ ga_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) alias->origin, alias->args); } +static PyObject * +ga_dir(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + gaobject *alias = (gaobject *)self; + PyObject *dir = PyObject_Dir(alias->origin); + if (dir == NULL) { + return NULL; + } + + PyObject *dir_entry = NULL; + for (const char * const *p = attr_exceptions; ; p++) { + if (*p == NULL) { + break; + } + else { + dir_entry = PyUnicode_FromString(*p); + if (dir_entry == NULL) { + goto error; + } + int contains = PySequence_Contains(dir, dir_entry); + if (contains < 0) { + goto error; + } + if (contains == 0 && PyList_Append(dir, dir_entry) < 0) { + goto error; + } + + Py_CLEAR(dir_entry); + } + } + return dir; + +error: + Py_DECREF(dir); + Py_XDECREF(dir_entry); + return NULL; +} + static PyMethodDef ga_methods[] = { {"__mro_entries__", ga_mro_entries, METH_O}, {"__instancecheck__", ga_instancecheck, METH_O}, {"__subclasscheck__", ga_subclasscheck, METH_O}, {"__reduce__", ga_reduce, METH_NOARGS}, + {"__dir__", ga_dir, METH_NOARGS}, {0} }; From 6dfd7d74bc49aaea98f1c387c793b0079bcc258b Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Tue, 15 Sep 2020 15:56:26 -0700 Subject: [PATCH 0102/1261] bpo-39587: Enum - use correct mixed-in data type (GH-22263) --- Lib/enum.py | 13 +++++- Lib/test/test_enum.py | 43 +++++++++++++++++++ .../2020-09-15-14-56-13.bpo-39587.69xzuh.rst | 1 + 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-15-14-56-13.bpo-39587.69xzuh.rst diff --git a/Lib/enum.py b/Lib/enum.py index bc24f2ae2dfc01..5e0088ee89fee3 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -482,14 +482,25 @@ def _get_mixins_(bases): return object, Enum def _find_data_type(bases): + data_types = [] for chain in bases: + candidate = None for base in chain.__mro__: if base is object: continue elif '__new__' in base.__dict__: if issubclass(base, Enum): continue - return base + data_types.append(candidate or base) + break + elif not issubclass(base, Enum): + candidate = base + if len(data_types) > 1: + raise TypeError('too many data types: %r' % data_types) + elif data_types: + return data_types[0] + else: + return None # ensure final parent class is an Enum derivative, find any concrete # data type, and check that Enum has no members diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 138f572906a478..a909c108833fc0 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -560,6 +560,49 @@ def test_format_enum_str(self): self.assertFormatIsValue('{:>20}', Directional.WEST) self.assertFormatIsValue('{:<20}', Directional.WEST) + def test_enum_str_override(self): + class MyStrEnum(Enum): + def __str__(self): + return 'MyStr' + class MyMethodEnum(Enum): + def hello(self): + return 'Hello! My name is %s' % self.name + class Test1Enum(MyMethodEnum, int, MyStrEnum): + One = 1 + Two = 2 + self.assertEqual(str(Test1Enum.One), 'MyStr') + # + class Test2Enum(MyStrEnum, MyMethodEnum): + One = 1 + Two = 2 + self.assertEqual(str(Test2Enum.One), 'MyStr') + + def test_inherited_data_type(self): + class HexInt(int): + def __repr__(self): + return hex(self) + class MyEnum(HexInt, enum.Enum): + A = 1 + B = 2 + C = 3 + self.assertEqual(repr(MyEnum.A), '') + + def test_too_many_data_types(self): + with self.assertRaisesRegex(TypeError, 'too many data types'): + class Huh(str, int, Enum): + One = 1 + + class MyStr(str): + def hello(self): + return 'hello, %s' % self + class MyInt(int): + def repr(self): + return hex(self) + with self.assertRaisesRegex(TypeError, 'too many data types'): + class Huh(MyStr, MyInt, Enum): + One = 1 + + def test_hash(self): Season = self.Season dates = {} diff --git a/Misc/NEWS.d/next/Library/2020-09-15-14-56-13.bpo-39587.69xzuh.rst b/Misc/NEWS.d/next/Library/2020-09-15-14-56-13.bpo-39587.69xzuh.rst new file mode 100644 index 00000000000000..e2f2b64867bedb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-15-14-56-13.bpo-39587.69xzuh.rst @@ -0,0 +1 @@ +use the correct mix-in data type when constructing Enums From 6575a5669bbe43e2f9c8776b0b7f25d33a3d503d Mon Sep 17 00:00:00 2001 From: Tim Burke Date: Tue, 15 Sep 2020 16:26:06 -0700 Subject: [PATCH 0103/1261] Doc: Fix broken manpage link (GH-21937) sigprocmask is in section 2, not 3. --- Doc/library/signal.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 05b285ed110ec4..00a730b6b9ca6a 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -416,7 +416,7 @@ The :mod:`signal` module defines the following functions: :data:`SIGKILL` and :data:`SIGSTOP` cannot be blocked. - .. availability:: Unix. See the man page :manpage:`sigprocmask(3)` and + .. availability:: Unix. See the man page :manpage:`sigprocmask(2)` and :manpage:`pthread_sigmask(3)` for further information. See also :func:`pause`, :func:`sigpending` and :func:`sigwait`. From f5e6853164adcea7be5e2123408fc3fd017de90d Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Tue, 15 Sep 2020 16:28:25 -0700 Subject: [PATCH 0104/1261] bpo-41789: honor object overrides in Enum classes (GH-22250) EnumMeta double-checks that `__repr__`, `__str__`, `__format__`, and `__reduce_ex__` are not the same as `object`'s, and replaces them if they are -- even if that replacement was intentionally done in the Enum being constructed. This patch fixes that. Automerge-Triggered-By: @ethanfurman --- Lib/enum.py | 4 ++++ Lib/test/test_enum.py | 9 ++++++++- .../Library/2020-09-14-19-27-46.bpo-41789.pI_uZQ.rst | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-14-19-27-46.bpo-41789.pI_uZQ.rst diff --git a/Lib/enum.py b/Lib/enum.py index 5e0088ee89fee3..e72d3062674618 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -250,7 +250,11 @@ def __new__(metacls, cls, bases, classdict): # double check that repr and friends are not the mixin's or various # things break (such as pickle) + # however, if the method is defined in the Enum itself, don't replace + # it for name in ('__repr__', '__str__', '__format__', '__reduce_ex__'): + if name in classdict: + continue class_method = getattr(enum_class, name) obj_method = getattr(member_type, name, None) enum_method = getattr(first_enum, name, None) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index a909c108833fc0..865edf1d9cfc67 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -560,6 +560,14 @@ def test_format_enum_str(self): self.assertFormatIsValue('{:>20}', Directional.WEST) self.assertFormatIsValue('{:<20}', Directional.WEST) + def test_object_str_override(self): + class Colors(Enum): + RED, GREEN, BLUE = 1, 2, 3 + def __repr__(self): + return "test.%s" % (self._name_, ) + __str__ = object.__str__ + self.assertEqual(str(Colors.RED), 'test.RED') + def test_enum_str_override(self): class MyStrEnum(Enum): def __str__(self): @@ -602,7 +610,6 @@ def repr(self): class Huh(MyStr, MyInt, Enum): One = 1 - def test_hash(self): Season = self.Season dates = {} diff --git a/Misc/NEWS.d/next/Library/2020-09-14-19-27-46.bpo-41789.pI_uZQ.rst b/Misc/NEWS.d/next/Library/2020-09-14-19-27-46.bpo-41789.pI_uZQ.rst new file mode 100644 index 00000000000000..5ce7a3ca67b725 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-14-19-27-46.bpo-41789.pI_uZQ.rst @@ -0,0 +1,2 @@ +Honor `object` overrides in `Enum` class creation (specifically, `__str__`, +`__repr__`, `__format__`, and `__reduce_ex__`). From b73a6df5fea3f2496bdefed7aac37451da804a7e Mon Sep 17 00:00:00 2001 From: Patrick Reader Date: Wed, 16 Sep 2020 05:58:32 +0100 Subject: [PATCH 0105/1261] bpo-41792: Add is_typeddict function to typing.py (GH-22254) Closes issue41792. Also closes https://github.com/python/typing/issues/751. --- Doc/library/typing.rst | 14 ++++++++++++++ Lib/test/test_typing.py | 7 +++++++ Lib/typing.py | 15 +++++++++++++++ .../2020-09-15-07-55-35.bpo-41792.qMpSlU.rst | 6 ++++++ 4 files changed, 42 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-09-15-07-55-35.bpo-41792.qMpSlU.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 3125ae97808a9e..bfff81e26760f5 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1658,6 +1658,20 @@ Introspection helpers .. versionadded:: 3.8 +.. function:: is_typeddict(tp) + + Check if an annotation is a TypedDict class. + + For example:: + class Film(TypedDict): + title: str + year: int + + is_typeddict(Film) # => True + is_typeddict(Union[list, str]) # => False + + .. versionadded:: 3.10 + .. class:: ForwardRef A class used for internal typing representation of string forward references. diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 05140fc61b9bf5..42aa430c5e107e 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -16,6 +16,7 @@ from typing import cast, runtime_checkable from typing import get_type_hints from typing import get_origin, get_args +from typing import is_typeddict from typing import no_type_check, no_type_check_decorator from typing import Type from typing import NewType @@ -3900,6 +3901,12 @@ class Cat(Animal): 'voice': str, } + def test_is_typeddict(self): + assert is_typeddict(Point2D) is True + assert is_typeddict(Union[str, int]) is False + # classes, not instances + assert is_typeddict(Point2D()) is False + class IOTests(BaseTestCase): diff --git a/Lib/typing.py b/Lib/typing.py index 2aedbeb852a712..8c61bd8e084a85 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -103,6 +103,7 @@ 'get_args', 'get_origin', 'get_type_hints', + 'is_typeddict', 'NewType', 'no_type_check', 'no_type_check_decorator', @@ -1479,6 +1480,20 @@ def get_args(tp): return () +def is_typeddict(tp): + """Check if an annotation is a TypedDict class + + For example:: + class Film(TypedDict): + title: str + year: int + + is_typeddict(Film) # => True + is_typeddict(Union[list, str]) # => False + """ + return isinstance(tp, _TypedDictMeta) + + def no_type_check(arg): """Decorator to indicate that annotations are not type hints. diff --git a/Misc/NEWS.d/next/Library/2020-09-15-07-55-35.bpo-41792.qMpSlU.rst b/Misc/NEWS.d/next/Library/2020-09-15-07-55-35.bpo-41792.qMpSlU.rst new file mode 100644 index 00000000000000..fbbc6724ba51ec --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-15-07-55-35.bpo-41792.qMpSlU.rst @@ -0,0 +1,6 @@ +Add is_typeddict function to typing.py to check if a type is a TypedDict +class + +Previously there was no way to check that without using private API. See the +`relevant issue in python/typing +` From 3b036bfecf9cdaf0476b34b47bd0d478a4331437 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Wed, 16 Sep 2020 07:11:57 -0700 Subject: [PATCH 0106/1261] bpo-41517: do not allow Enums to be extended (#22271) fix bug that let Enums be extended via multiple inheritance --- Lib/enum.py | 19 ++++++++++++++----- Lib/test/test_enum.py | 3 +++ .../2020-09-15-22-43-30.bpo-41517.sLBH7g.rst | 1 + 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-15-22-43-30.bpo-41517.sLBH7g.rst diff --git a/Lib/enum.py b/Lib/enum.py index e72d3062674618..0c2cf569fac88d 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -124,10 +124,12 @@ class EnumMeta(type): """Metaclass for Enum""" @classmethod def __prepare__(metacls, cls, bases): + # check that previous enum members do not exist + metacls._check_for_existing_members(cls, bases) # create the namespace dict enum_dict = _EnumDict() # inherit previous flags and _generate_next_value_ function - member_type, first_enum = metacls._get_mixins_(bases) + member_type, first_enum = metacls._get_mixins_(cls, bases) if first_enum is not None: enum_dict['_generate_next_value_'] = getattr(first_enum, '_generate_next_value_', None) return enum_dict @@ -143,7 +145,7 @@ def __new__(metacls, cls, bases, classdict): ignore = classdict['_ignore_'] for key in ignore: classdict.pop(key, None) - member_type, first_enum = metacls._get_mixins_(bases) + member_type, first_enum = metacls._get_mixins_(cls, bases) __new__, save_new, use_args = metacls._find_new_(classdict, member_type, first_enum) @@ -402,7 +404,7 @@ def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, s """ metacls = cls.__class__ bases = (cls, ) if type is None else (type, cls) - _, first_enum = cls._get_mixins_(bases) + _, first_enum = cls._get_mixins_(cls, bases) classdict = metacls.__prepare__(class_name, bases) # special processing needed for names? @@ -475,7 +477,14 @@ def _convert_(cls, name, module, filter, source=None): return cls @staticmethod - def _get_mixins_(bases): + def _check_for_existing_members(class_name, bases): + for chain in bases: + for base in chain.__mro__: + if issubclass(base, Enum) and base._member_names_: + raise TypeError("%s: cannot extend enumeration %r" % (class_name, base.__name__)) + + @staticmethod + def _get_mixins_(class_name, bases): """Returns the type for creating enum members, and the first inherited enum class. @@ -500,7 +509,7 @@ def _find_data_type(bases): elif not issubclass(base, Enum): candidate = base if len(data_types) > 1: - raise TypeError('too many data types: %r' % data_types) + raise TypeError('%r: too many data types: %r' % (class_name, data_types)) elif data_types: return data_types[0] else: diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 865edf1d9cfc67..2fcd047989afb2 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1009,6 +1009,9 @@ class MoreColor(Color): cyan = 4 magenta = 5 yellow = 6 + with self.assertRaisesRegex(TypeError, "EvenMoreColor: cannot extend enumeration 'Color'"): + class EvenMoreColor(Color, IntEnum): + chartruese = 7 def test_exclude_methods(self): class whatever(Enum): diff --git a/Misc/NEWS.d/next/Library/2020-09-15-22-43-30.bpo-41517.sLBH7g.rst b/Misc/NEWS.d/next/Library/2020-09-15-22-43-30.bpo-41517.sLBH7g.rst new file mode 100644 index 00000000000000..e7654711062cef --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-15-22-43-30.bpo-41517.sLBH7g.rst @@ -0,0 +1 @@ +fix bug allowing Enums to be extended via multiple inheritance From 17c3fc80aa7b2b7303c5a8000f0beb1e0265927d Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 16 Sep 2020 12:06:23 -0300 Subject: [PATCH 0107/1261] [doc] Minor improvements to is_typeddict (GH-22280) 1. The check is on the type 2. Add link to TypeDict --- Doc/library/typing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index bfff81e26760f5..d31c65d38e1abb 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1660,7 +1660,7 @@ Introspection helpers .. function:: is_typeddict(tp) - Check if an annotation is a TypedDict class. + Check if a type is a :class:`TypedDict`. For example:: class Film(TypedDict): From f5150953d65d7a73e7d84c1afb50d24af8b90b44 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Wed, 16 Sep 2020 10:26:50 -0700 Subject: [PATCH 0108/1261] bpo-39728: Enum: fix duplicate `ValueError` (GH-22277) fix default `_missing_` to return `None` instead of raising a `ValueError` Co-authored-by: Andrey Darascheka --- Lib/enum.py | 2 +- Lib/test/test_enum.py | 19 ++++++++++++++++++- Misc/ACKS | 1 + .../2020-02-24-10-58-34.bpo-39728.kOOaHn.rst | 1 + 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-02-24-10-58-34.bpo-39728.kOOaHn.rst diff --git a/Lib/enum.py b/Lib/enum.py index 0c2cf569fac88d..060b2a0dadf457 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -629,7 +629,7 @@ def _generate_next_value_(name, start, count, last_values): @classmethod def _missing_(cls, value): - raise ValueError("%r is not a valid %s" % (value, cls.__qualname__)) + return None def __repr__(self): return "<%s.%s: %r>" % ( diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 2fcd047989afb2..5d72d82cec27ff 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1845,6 +1845,18 @@ class Dupes(Enum): third = auto() self.assertEqual([Dupes.first, Dupes.second, Dupes.third], list(Dupes)) + def test_default_missing(self): + class Color(Enum): + RED = 1 + GREEN = 2 + BLUE = 3 + try: + Color(7) + except ValueError as exc: + self.assertTrue(exc.__context__ is None) + else: + raise Exception('Exception not raised.') + def test_missing(self): class Color(Enum): red = 1 @@ -1863,7 +1875,12 @@ def _missing_(cls, item): # trigger not found return None self.assertIs(Color('three'), Color.blue) - self.assertRaises(ValueError, Color, 7) + try: + Color(7) + except ValueError as exc: + self.assertTrue(exc.__context__ is None) + else: + raise Exception('Exception not raised.') try: Color('bad return') except TypeError as exc: diff --git a/Misc/ACKS b/Misc/ACKS index 8b0d7a45da1695..2628d6b690d1cb 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -433,6 +433,7 @@ Marcos Donolo Dima Dorfman Yves Dorfsman Michael Dorman +Andrey Doroschenko Steve Dower Allen Downey Cesar Douady diff --git a/Misc/NEWS.d/next/Library/2020-02-24-10-58-34.bpo-39728.kOOaHn.rst b/Misc/NEWS.d/next/Library/2020-02-24-10-58-34.bpo-39728.kOOaHn.rst new file mode 100644 index 00000000000000..beb2016a85ba68 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-24-10-58-34.bpo-39728.kOOaHn.rst @@ -0,0 +1 @@ +fix default `_missing_` so a duplicate `ValueError` is not set as the `__context__` of the original `ValueError` From 31f66ac948f2e56f74274311f4c59ff8dc2bba45 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Wed, 16 Sep 2020 11:37:24 -0700 Subject: [PATCH 0109/1261] acknowledge Weipeng Hong's contributions (GH-22284) --- Misc/ACKS | 1 + 1 file changed, 1 insertion(+) diff --git a/Misc/ACKS b/Misc/ACKS index 2628d6b690d1cb..d5bdb084a1e1ed 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -736,6 +736,7 @@ Thomas Holmes Craig Holmquist Philip Homburg Naofumi Honda +Weipeng Hong Jeffrey Honig Rob Hooft Michiel de Hoon From 8c3b72225cb70581abdbcfa0fa25d0c1c37fb7f1 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 16 Sep 2020 19:42:00 +0100 Subject: [PATCH 0110/1261] bpo-41746: Add type information to asdl_seq objects (GH-22223) * Add new capability to the PEG parser to type variable assignments. For instance: ``` | a[asdl_stmt_seq*]=';'.small_stmt+ [';'] NEWLINE { a } ``` * Add new sequence types from the asdl definition (automatically generated) * Make `asdl_seq` type a generic aliasing pointer type. * Create a new `asdl_generic_seq` for the generic case using `void*`. * The old `asdl_seq_GET`/`ast_seq_SET` macros now are typed. * New `asdl_seq_GET_UNTYPED`/`ast_seq_SET_UNTYPED` macros for dealing with generic sequences. * Changes all possible `asdl_seq` types to use specific versions everywhere. --- Doc/tools/extensions/peg_highlight.py | 2 +- Grammar/python.gram | 122 ++-- Include/Python-ast.h | 356 ++++++---- Include/asdl.h | 71 +- Include/ast.h | 2 +- Parser/asdl_c.py | 61 +- Parser/parser.c | 713 ++++++++++---------- Parser/pegen.c | 187 ++--- Parser/pegen.h | 30 +- Parser/string_parser.c | 8 +- Python/Python-ast.c | 507 +++++++------- Python/asdl.c | 64 +- Python/ast.c | 25 +- Python/ast_opt.c | 106 +-- Python/ast_unparse.c | 8 +- Python/compile.c | 77 +-- Python/future.c | 3 +- Python/symtable.c | 22 +- Tools/peg_generator/pegen/c_generator.py | 15 +- Tools/peg_generator/pegen/grammar.py | 3 +- Tools/peg_generator/pegen/grammar_parser.py | 42 +- Tools/peg_generator/pegen/metagrammar.gram | 2 + 22 files changed, 1339 insertions(+), 1087 deletions(-) diff --git a/Doc/tools/extensions/peg_highlight.py b/Doc/tools/extensions/peg_highlight.py index 8bc24670fbe0ab..9a2acb7f320ba6 100644 --- a/Doc/tools/extensions/peg_highlight.py +++ b/Doc/tools/extensions/peg_highlight.py @@ -43,7 +43,7 @@ class PEGLexer(RegexLexer): (r"'\W+?'", Text), (r'"\W+?"', Text), ], - "variables": [(_name + _text_ws + "(=)", bygroups(None, None, None),),], + "variables": [(_name + _text_ws + r"(\[.*\])?" + _text_ws + "(=)", bygroups(None, None, None, None, None),),], "invalids": [ (r"^(\s+\|\s+invalid_\w+\s*\n)", bygroups(None)), (r"^(\s+\|\s+incorrect_\w+\s*\n)", bygroups(None)), diff --git a/Grammar/python.gram b/Grammar/python.gram index 524e88eb389968..e4533b1a1b8797 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -34,27 +34,27 @@ func_type[mod_ty]: '(' a=[type_expressions] ')' '->' b=expression NEWLINE* ENDMA fstring[expr_ty]: star_expressions # type_expressions allow */** but ignore them -type_expressions[asdl_seq*]: +type_expressions[asdl_expr_seq*]: | a=','.expression+ ',' '*' b=expression ',' '**' c=expression { - _PyPegen_seq_append_to_end(p, CHECK(_PyPegen_seq_append_to_end(p, a, b)), c) } - | a=','.expression+ ',' '*' b=expression { _PyPegen_seq_append_to_end(p, a, b) } - | a=','.expression+ ',' '**' b=expression { _PyPegen_seq_append_to_end(p, a, b) } + (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, CHECK(_PyPegen_seq_append_to_end(p, a, b)), c) } + | a=','.expression+ ',' '*' b=expression { (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) } + | a=','.expression+ ',' '**' b=expression { (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) } | '*' a=expression ',' '**' b=expression { - _PyPegen_seq_append_to_end(p, CHECK(_PyPegen_singleton_seq(p, a)), b) } - | '*' a=expression { _PyPegen_singleton_seq(p, a) } - | '**' a=expression { _PyPegen_singleton_seq(p, a) } - | ','.expression+ - -statements[asdl_seq*]: a=statement+ { _PyPegen_seq_flatten(p, a) } -statement[asdl_seq*]: a=compound_stmt { _PyPegen_singleton_seq(p, a) } | simple_stmt -statement_newline[asdl_seq*]: - | a=compound_stmt NEWLINE { _PyPegen_singleton_seq(p, a) } + (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, CHECK(_PyPegen_singleton_seq(p, a)), b) } + | '*' a=expression { (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) } + | '**' a=expression { (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) } + | a[asdl_expr_seq*]=','.expression+ {a} + +statements[asdl_stmt_seq*]: a=statement+ { (asdl_stmt_seq*)_PyPegen_seq_flatten(p, a) } +statement[asdl_stmt_seq*]: a=compound_stmt { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } | a[asdl_stmt_seq*]=simple_stmt { a } +statement_newline[asdl_stmt_seq*]: + | a=compound_stmt NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } | simple_stmt - | NEWLINE { _PyPegen_singleton_seq(p, CHECK(_Py_Pass(EXTRA))) } + | NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, CHECK(_Py_Pass(EXTRA))) } | ENDMARKER { _PyPegen_interactive_exit(p) } -simple_stmt[asdl_seq*]: - | a=small_stmt !';' NEWLINE { _PyPegen_singleton_seq(p, a) } # Not needed, there for speedup - | a=';'.small_stmt+ [';'] NEWLINE { a } +simple_stmt[asdl_stmt_seq*]: + | a=small_stmt !';' NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } # Not needed, there for speedup + | a[asdl_stmt_seq*]=';'.small_stmt+ [';'] NEWLINE { a } # NOTE: assignment MUST precede expression, else parsing a simple assignment # will throw a SyntaxError. small_stmt[stmt_ty] (memo): @@ -91,7 +91,7 @@ assignment[stmt_ty]: | a=('(' b=single_target ')' { b } | single_subscript_attribute_target) ':' b=expression c=['=' d=annotated_rhs { d }] { CHECK_VERSION(6, "Variable annotations syntax is", _Py_AnnAssign(a, b, c, 0, EXTRA)) } - | a=(z=star_targets '=' { z })+ b=(yield_expr | star_expressions) !'=' tc=[TYPE_COMMENT] { + | a[asdl_expr_seq*]=(z=star_targets '=' { z })+ b=(yield_expr | star_expressions) !'=' tc=[TYPE_COMMENT] { _Py_Assign(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } | a=single_target b=augassign ~ c=(yield_expr | star_expressions) { _Py_AugAssign(a, b->kind, c, EXTRA) } @@ -112,9 +112,9 @@ augassign[AugOperator*]: | '**=' { _PyPegen_augoperator(p, Pow) } | '//=' { _PyPegen_augoperator(p, FloorDiv) } -global_stmt[stmt_ty]: 'global' a=','.NAME+ { +global_stmt[stmt_ty]: 'global' a[asdl_expr_seq*]=','.NAME+ { _Py_Global(CHECK(_PyPegen_map_names_to_ids(p, a)), EXTRA) } -nonlocal_stmt[stmt_ty]: 'nonlocal' a=','.NAME+ { +nonlocal_stmt[stmt_ty]: 'nonlocal' a[asdl_expr_seq*]=','.NAME+ { _Py_Nonlocal(CHECK(_PyPegen_map_names_to_ids(p, a)), EXTRA) } yield_stmt[stmt_ty]: y=yield_expr { _Py_Expr(y, EXTRA) } @@ -133,19 +133,19 @@ import_from[stmt_ty]: _Py_ImportFrom(b->v.Name.id, c, _PyPegen_seq_count_dots(a), EXTRA) } | 'from' a=('.' | '...')+ 'import' b=import_from_targets { _Py_ImportFrom(NULL, b, _PyPegen_seq_count_dots(a), EXTRA) } -import_from_targets[asdl_seq*]: +import_from_targets[asdl_alias_seq*]: | '(' a=import_from_as_names [','] ')' { a } | import_from_as_names !',' - | '*' { _PyPegen_singleton_seq(p, CHECK(_PyPegen_alias_for_star(p))) } + | '*' { (asdl_alias_seq*)_PyPegen_singleton_seq(p, CHECK(_PyPegen_alias_for_star(p))) } | invalid_import_from_targets -import_from_as_names[asdl_seq*]: - | a=','.import_from_as_name+ { a } +import_from_as_names[asdl_alias_seq*]: + | a[asdl_alias_seq*]=','.import_from_as_name+ { a } import_from_as_name[alias_ty]: | a=NAME b=['as' z=NAME { z }] { _Py_alias(a->v.Name.id, (b) ? ((expr_ty) b)->v.Name.id : NULL, p->arena) } -dotted_as_names[asdl_seq*]: - | a=','.dotted_as_name+ { a } +dotted_as_names[asdl_alias_seq*]: + | a[asdl_alias_seq*]=','.dotted_as_name+ { a } dotted_as_name[alias_ty]: | a=dotted_name b=['as' z=NAME { z }] { _Py_alias(a->v.Name.id, (b) ? ((expr_ty) b)->v.Name.id : NULL, @@ -155,12 +155,12 @@ dotted_name[expr_ty]: | NAME if_stmt[stmt_ty]: - | 'if' a=named_expression ':' b=block c=elif_stmt { _Py_If(a, b, CHECK(_PyPegen_singleton_seq(p, c)), EXTRA) } + | 'if' a=named_expression ':' b=block c=elif_stmt { _Py_If(a, b, CHECK((asdl_stmt_seq*)_PyPegen_singleton_seq(p, c)), EXTRA) } | 'if' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } elif_stmt[stmt_ty]: | 'elif' a=named_expression ':' b=block c=elif_stmt { _Py_If(a, b, CHECK(_PyPegen_singleton_seq(p, c)), EXTRA) } | 'elif' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } -else_block[asdl_seq*]: 'else' ':' b=block { b } +else_block[asdl_stmt_seq*]: 'else' ':' b=block { b } while_stmt[stmt_ty]: | 'while' a=named_expression ':' b=block c=[else_block] { _Py_While(a, b, c, EXTRA) } @@ -173,13 +173,13 @@ for_stmt[stmt_ty]: | invalid_for_target with_stmt[stmt_ty]: - | 'with' '(' a=','.with_item+ ','? ')' ':' b=block { + | 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block { _Py_With(a, b, NULL, EXTRA) } - | 'with' a=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { + | 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { _Py_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } - | ASYNC 'with' '(' a=','.with_item+ ','? ')' ':' b=block { + | ASYNC 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block { CHECK_VERSION(5, "Async with statements are", _Py_AsyncWith(a, b, NULL, EXTRA)) } - | ASYNC 'with' a=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { + | ASYNC 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { CHECK_VERSION(5, "Async with statements are", _Py_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) } with_item[withitem_ty]: | e=expression 'as' t=target &(',' | ')' | ':') { _Py_withitem(e, t, p->arena) } @@ -188,12 +188,12 @@ with_item[withitem_ty]: try_stmt[stmt_ty]: | 'try' ':' b=block f=finally_block { _Py_Try(b, NULL, NULL, f, EXTRA) } - | 'try' ':' b=block ex=except_block+ el=[else_block] f=[finally_block] { _Py_Try(b, ex, el, f, EXTRA) } + | 'try' ':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] { _Py_Try(b, ex, el, f, EXTRA) } except_block[excepthandler_ty]: | 'except' e=expression t=['as' z=NAME { z }] ':' b=block { _Py_ExceptHandler(e, (t) ? ((expr_ty) t)->v.Name.id : NULL, b, EXTRA) } | 'except' ':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) } -finally_block[asdl_seq*]: 'finally' ':' a=block { a } +finally_block[asdl_stmt_seq*]: 'finally' ':' a=block { a } return_stmt[stmt_ty]: | 'return' a=[star_expressions] { _Py_Return(a, EXTRA) } @@ -229,11 +229,11 @@ params[arguments_ty]: | parameters parameters[arguments_ty]: - | a=slash_no_default b=param_no_default* c=param_with_default* d=[star_etc] { + | a=slash_no_default b[asdl_arg_seq*]=param_no_default* c=param_with_default* d=[star_etc] { _PyPegen_make_arguments(p, a, NULL, b, c, d) } | a=slash_with_default b=param_with_default* c=[star_etc] { _PyPegen_make_arguments(p, NULL, a, NULL, b, c) } - | a=param_no_default+ b=param_with_default* c=[star_etc] { + | a[asdl_arg_seq*]=param_no_default+ b=param_with_default* c=[star_etc] { _PyPegen_make_arguments(p, NULL, NULL, a, b, c) } | a=param_with_default+ b=[star_etc] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)} | a=star_etc { _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) } @@ -241,12 +241,12 @@ parameters[arguments_ty]: # Some duplication here because we can't write (',' | &')'), # which is because we don't support empty alternatives (yet). # -slash_no_default[asdl_seq*]: - | a=param_no_default+ '/' ',' { a } - | a=param_no_default+ '/' &')' { a } +slash_no_default[asdl_arg_seq*]: + | a[asdl_arg_seq*]=param_no_default+ '/' ',' { a } + | a[asdl_arg_seq*]=param_no_default+ '/' &')' { a } slash_with_default[SlashWithDefault*]: - | a=param_no_default* b=param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, a, b) } - | a=param_no_default* b=param_with_default+ '/' &')' { _PyPegen_slash_with_default(p, a, b) } + | a=param_no_default* b=param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) } + | a=param_no_default* b=param_with_default+ '/' &')' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) } star_etc[StarEtc*]: | '*' a=param_no_default b=param_maybe_default* c=[kwds] { @@ -284,7 +284,7 @@ param[arg_ty]: a=NAME b=annotation? { _Py_arg(a->v.Name.id, b, NULL, EXTRA) } annotation[expr_ty]: ':' a=expression { a } default[expr_ty]: '=' a=expression { a } -decorators[asdl_seq*]: a=('@' f=named_expression NEWLINE { f })+ { a } +decorators[asdl_expr_seq*]: a[asdl_expr_seq*]=('@' f=named_expression NEWLINE { f })+ { a } class_def[stmt_ty]: | a=decorators b=class_def_raw { _PyPegen_class_def_decorators(p, a, b) } @@ -296,12 +296,12 @@ class_def_raw[stmt_ty]: (b) ? ((expr_ty) b)->v.Call.keywords : NULL, c, NULL, EXTRA) } -block[asdl_seq*] (memo): +block[asdl_stmt_seq*] (memo): | NEWLINE INDENT a=statements DEDENT { a } | simple_stmt | invalid_block -expressions_list[asdl_seq*]: a=','.star_expression+ [','] { a } +expressions_list[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_expression+ [','] { a } star_expressions[expr_ty]: | a=star_expression b=(',' c=star_expression { c })+ [','] { _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } @@ -311,7 +311,7 @@ star_expression[expr_ty] (memo): | '*' a=bitwise_or { _Py_Starred(a, Load, EXTRA) } | expression -star_named_expressions[asdl_seq*]: a=','.star_named_expression+ [','] { a } +star_named_expressions[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_named_expression+ [','] { a } star_named_expression[expr_ty]: | '*' a=bitwise_or { _Py_Starred(a, Load, EXTRA) } | named_expression @@ -344,21 +344,21 @@ lambda_params[arguments_ty]: # a colon, not a close parenthesis. (For more, see parameters above.) # lambda_parameters[arguments_ty]: - | a=lambda_slash_no_default b=lambda_param_no_default* c=lambda_param_with_default* d=[lambda_star_etc] { + | a=lambda_slash_no_default b[asdl_arg_seq*]=lambda_param_no_default* c=lambda_param_with_default* d=[lambda_star_etc] { _PyPegen_make_arguments(p, a, NULL, b, c, d) } | a=lambda_slash_with_default b=lambda_param_with_default* c=[lambda_star_etc] { _PyPegen_make_arguments(p, NULL, a, NULL, b, c) } - | a=lambda_param_no_default+ b=lambda_param_with_default* c=[lambda_star_etc] { + | a[asdl_arg_seq*]=lambda_param_no_default+ b=lambda_param_with_default* c=[lambda_star_etc] { _PyPegen_make_arguments(p, NULL, NULL, a, b, c) } | a=lambda_param_with_default+ b=[lambda_star_etc] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)} | a=lambda_star_etc { _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) } -lambda_slash_no_default[asdl_seq*]: - | a=lambda_param_no_default+ '/' ',' { a } - | a=lambda_param_no_default+ '/' &':' { a } +lambda_slash_no_default[asdl_arg_seq*]: + | a[asdl_arg_seq*]=lambda_param_no_default+ '/' ',' { a } + | a[asdl_arg_seq*]=lambda_param_no_default+ '/' &':' { a } lambda_slash_with_default[SlashWithDefault*]: - | a=lambda_param_no_default* b=lambda_param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, a, b) } - | a=lambda_param_no_default* b=lambda_param_with_default+ '/' &':' { _PyPegen_slash_with_default(p, a, b) } + | a=lambda_param_no_default* b=lambda_param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) } + | a=lambda_param_no_default* b=lambda_param_with_default+ '/' &':' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) } lambda_star_etc[StarEtc*]: | '*' a=lambda_param_no_default b=lambda_param_maybe_default* c=[lambda_kwds] { @@ -472,7 +472,7 @@ primary[expr_ty]: slices[expr_ty]: | a=slice !',' { a } - | a=','.slice+ [','] { _Py_Tuple(a, Load, EXTRA) } + | a[asdl_expr_seq*]=','.slice+ [','] { _Py_Tuple(a, Load, EXTRA) } slice[expr_ty]: | a=[expression] ':' b=[expression] c=[':' d=[expression] { d }] { _Py_Slice(a, b, c, EXTRA) } | a=expression { a } @@ -518,12 +518,12 @@ double_starred_kvpair[KeyValuePair*]: | '**' a=bitwise_or { _PyPegen_key_value_pair(p, NULL, a) } | kvpair kvpair[KeyValuePair*]: a=expression ':' b=expression { _PyPegen_key_value_pair(p, a, b) } -for_if_clauses[asdl_seq*]: - | for_if_clause+ +for_if_clauses[asdl_comprehension_seq*]: + | a[asdl_comprehension_seq*]=for_if_clause+ { a } for_if_clause[comprehension_ty]: - | ASYNC 'for' a=star_targets 'in' ~ b=disjunction c=('if' z=disjunction { z })* { + | ASYNC 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction { z })* { CHECK_VERSION(6, "Async comprehensions are", _Py_comprehension(a, b, c, 1, p->arena)) } - | 'for' a=star_targets 'in' ~ b=disjunction c=('if' z=disjunction { z })* { + | 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction { z })* { _Py_comprehension(a, b, c, 0, p->arena) } | invalid_for_target @@ -535,7 +535,7 @@ arguments[expr_ty] (memo): | a=args [','] &')' { a } | incorrect_arguments args[expr_ty]: - | a=','.(starred_expression | named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b, EXTRA) } + | a[asdl_expr_seq*]=','.(starred_expression | named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b, EXTRA) } | a=kwargs { _Py_Call(_PyPegen_dummy_name(p), CHECK_NULL_ALLOWED(_PyPegen_seq_extract_starred_exprs(p, a)), CHECK_NULL_ALLOWED(_PyPegen_seq_delete_starred_exprs(p, a)), @@ -562,7 +562,7 @@ star_targets[expr_ty]: | a=star_target !',' { a } | a=star_target b=(',' c=star_target { c })* [','] { _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) } -star_targets_seq[asdl_seq*]: a=','.star_target+ [','] { a } +star_targets_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] { a } star_target[expr_ty] (memo): | '*' a=(!'*' star_target) { _Py_Starred(CHECK(_PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) } @@ -583,7 +583,7 @@ single_subscript_attribute_target[expr_ty]: | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) } | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) } -del_targets[asdl_seq*]: a=','.del_target+ [','] { a } +del_targets[asdl_expr_seq*]: a[asdl_expr_seq*]=','.del_target+ [','] { a } del_target[expr_ty] (memo): | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Del, EXTRA) } | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Del, EXTRA) } @@ -594,7 +594,7 @@ del_t_atom[expr_ty]: | '(' a=[del_targets] ')' { _Py_Tuple(a, Del, EXTRA) } | '[' a=[del_targets] ']' { _Py_List(a, Del, EXTRA) } -targets[asdl_seq*]: a=','.target+ [','] { a } +targets[asdl_expr_seq*]: a[asdl_expr_seq*]=','.target+ [','] { a } target[expr_ty] (memo): | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) } | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) } diff --git a/Include/Python-ast.h b/Include/Python-ast.h index e7afa1e6579e8d..e14bab566fb5a2 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -47,18 +47,99 @@ typedef struct _withitem *withitem_ty; typedef struct _type_ignore *type_ignore_ty; +typedef struct { + _ASDL_SEQ_HEAD + mod_ty typed_elements[1]; +} asdl_mod_seq; + +asdl_mod_seq *_Py_asdl_mod_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + stmt_ty typed_elements[1]; +} asdl_stmt_seq; + +asdl_stmt_seq *_Py_asdl_stmt_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + expr_ty typed_elements[1]; +} asdl_expr_seq; + +asdl_expr_seq *_Py_asdl_expr_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + comprehension_ty typed_elements[1]; +} asdl_comprehension_seq; + +asdl_comprehension_seq *_Py_asdl_comprehension_seq_new(Py_ssize_t size, PyArena + *arena); + +typedef struct { + _ASDL_SEQ_HEAD + excepthandler_ty typed_elements[1]; +} asdl_excepthandler_seq; + +asdl_excepthandler_seq *_Py_asdl_excepthandler_seq_new(Py_ssize_t size, PyArena + *arena); + +typedef struct { + _ASDL_SEQ_HEAD + arguments_ty typed_elements[1]; +} asdl_arguments_seq; + +asdl_arguments_seq *_Py_asdl_arguments_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + arg_ty typed_elements[1]; +} asdl_arg_seq; + +asdl_arg_seq *_Py_asdl_arg_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + keyword_ty typed_elements[1]; +} asdl_keyword_seq; + +asdl_keyword_seq *_Py_asdl_keyword_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + alias_ty typed_elements[1]; +} asdl_alias_seq; + +asdl_alias_seq *_Py_asdl_alias_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + withitem_ty typed_elements[1]; +} asdl_withitem_seq; + +asdl_withitem_seq *_Py_asdl_withitem_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + type_ignore_ty typed_elements[1]; +} asdl_type_ignore_seq; + +asdl_type_ignore_seq *_Py_asdl_type_ignore_seq_new(Py_ssize_t size, PyArena + *arena); + + enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, FunctionType_kind=4}; struct _mod { enum _mod_kind kind; union { struct { - asdl_seq *body; - asdl_seq *type_ignores; + asdl_stmt_seq *body; + asdl_type_ignore_seq *type_ignores; } Module; struct { - asdl_seq *body; + asdl_stmt_seq *body; } Interactive; struct { @@ -66,7 +147,7 @@ struct _mod { } Expression; struct { - asdl_seq *argtypes; + asdl_expr_seq *argtypes; expr_ty returns; } FunctionType; @@ -87,8 +168,8 @@ struct _stmt { struct { identifier name; arguments_ty args; - asdl_seq *body; - asdl_seq *decorator_list; + asdl_stmt_seq *body; + asdl_expr_seq *decorator_list; expr_ty returns; string type_comment; } FunctionDef; @@ -96,18 +177,18 @@ struct _stmt { struct { identifier name; arguments_ty args; - asdl_seq *body; - asdl_seq *decorator_list; + asdl_stmt_seq *body; + asdl_expr_seq *decorator_list; expr_ty returns; string type_comment; } AsyncFunctionDef; struct { identifier name; - asdl_seq *bases; - asdl_seq *keywords; - asdl_seq *body; - asdl_seq *decorator_list; + asdl_expr_seq *bases; + asdl_keyword_seq *keywords; + asdl_stmt_seq *body; + asdl_expr_seq *decorator_list; } ClassDef; struct { @@ -115,11 +196,11 @@ struct _stmt { } Return; struct { - asdl_seq *targets; + asdl_expr_seq *targets; } Delete; struct { - asdl_seq *targets; + asdl_expr_seq *targets; expr_ty value; string type_comment; } Assign; @@ -140,40 +221,40 @@ struct _stmt { struct { expr_ty target; expr_ty iter; - asdl_seq *body; - asdl_seq *orelse; + asdl_stmt_seq *body; + asdl_stmt_seq *orelse; string type_comment; } For; struct { expr_ty target; expr_ty iter; - asdl_seq *body; - asdl_seq *orelse; + asdl_stmt_seq *body; + asdl_stmt_seq *orelse; string type_comment; } AsyncFor; struct { expr_ty test; - asdl_seq *body; - asdl_seq *orelse; + asdl_stmt_seq *body; + asdl_stmt_seq *orelse; } While; struct { expr_ty test; - asdl_seq *body; - asdl_seq *orelse; + asdl_stmt_seq *body; + asdl_stmt_seq *orelse; } If; struct { - asdl_seq *items; - asdl_seq *body; + asdl_withitem_seq *items; + asdl_stmt_seq *body; string type_comment; } With; struct { - asdl_seq *items; - asdl_seq *body; + asdl_withitem_seq *items; + asdl_stmt_seq *body; string type_comment; } AsyncWith; @@ -183,10 +264,10 @@ struct _stmt { } Raise; struct { - asdl_seq *body; - asdl_seq *handlers; - asdl_seq *orelse; - asdl_seq *finalbody; + asdl_stmt_seq *body; + asdl_excepthandler_seq *handlers; + asdl_stmt_seq *orelse; + asdl_stmt_seq *finalbody; } Try; struct { @@ -195,21 +276,21 @@ struct _stmt { } Assert; struct { - asdl_seq *names; + asdl_alias_seq *names; } Import; struct { identifier module; - asdl_seq *names; + asdl_alias_seq *names; int level; } ImportFrom; struct { - asdl_seq *names; + asdl_identifier_seq *names; } Global; struct { - asdl_seq *names; + asdl_identifier_seq *names; } Nonlocal; struct { @@ -236,7 +317,7 @@ struct _expr { union { struct { boolop_ty op; - asdl_seq *values; + asdl_expr_seq *values; } BoolOp; struct { @@ -267,33 +348,33 @@ struct _expr { } IfExp; struct { - asdl_seq *keys; - asdl_seq *values; + asdl_expr_seq *keys; + asdl_expr_seq *values; } Dict; struct { - asdl_seq *elts; + asdl_expr_seq *elts; } Set; struct { expr_ty elt; - asdl_seq *generators; + asdl_comprehension_seq *generators; } ListComp; struct { expr_ty elt; - asdl_seq *generators; + asdl_comprehension_seq *generators; } SetComp; struct { expr_ty key; expr_ty value; - asdl_seq *generators; + asdl_comprehension_seq *generators; } DictComp; struct { expr_ty elt; - asdl_seq *generators; + asdl_comprehension_seq *generators; } GeneratorExp; struct { @@ -311,13 +392,13 @@ struct _expr { struct { expr_ty left; asdl_int_seq *ops; - asdl_seq *comparators; + asdl_expr_seq *comparators; } Compare; struct { expr_ty func; - asdl_seq *args; - asdl_seq *keywords; + asdl_expr_seq *args; + asdl_keyword_seq *keywords; } Call; struct { @@ -327,7 +408,7 @@ struct _expr { } FormattedValue; struct { - asdl_seq *values; + asdl_expr_seq *values; } JoinedStr; struct { @@ -358,12 +439,12 @@ struct _expr { } Name; struct { - asdl_seq *elts; + asdl_expr_seq *elts; expr_context_ty ctx; } List; struct { - asdl_seq *elts; + asdl_expr_seq *elts; expr_context_ty ctx; } Tuple; @@ -383,7 +464,7 @@ struct _expr { struct _comprehension { expr_ty target; expr_ty iter; - asdl_seq *ifs; + asdl_expr_seq *ifs; int is_async; }; @@ -394,7 +475,7 @@ struct _excepthandler { struct { expr_ty type; identifier name; - asdl_seq *body; + asdl_stmt_seq *body; } ExceptHandler; } v; @@ -405,13 +486,13 @@ struct _excepthandler { }; struct _arguments { - asdl_seq *posonlyargs; - asdl_seq *args; + asdl_arg_seq *posonlyargs; + asdl_arg_seq *args; arg_ty vararg; - asdl_seq *kwonlyargs; - asdl_seq *kw_defaults; + asdl_arg_seq *kwonlyargs; + asdl_expr_seq *kw_defaults; arg_ty kwarg; - asdl_seq *defaults; + asdl_expr_seq *defaults; }; struct _arg { @@ -458,39 +539,41 @@ struct _type_ignore { // Note: these macros affect function definitions, not only call sites. #define Module(a0, a1, a2) _Py_Module(a0, a1, a2) -mod_ty _Py_Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena); +mod_ty _Py_Module(asdl_stmt_seq * body, asdl_type_ignore_seq * type_ignores, + PyArena *arena); #define Interactive(a0, a1) _Py_Interactive(a0, a1) -mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena); +mod_ty _Py_Interactive(asdl_stmt_seq * body, PyArena *arena); #define Expression(a0, a1) _Py_Expression(a0, a1) mod_ty _Py_Expression(expr_ty body, PyArena *arena); #define FunctionType(a0, a1, a2) _Py_FunctionType(a0, a1, a2) -mod_ty _Py_FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena); +mod_ty _Py_FunctionType(asdl_expr_seq * argtypes, expr_ty returns, PyArena + *arena); #define FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body, - asdl_seq * decorator_list, expr_ty returns, string - type_comment, int lineno, int col_offset, int +stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * + body, asdl_expr_seq * decorator_list, expr_ty returns, + string type_comment, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) _Py_AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -stmt_ty _Py_AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * - body, asdl_seq * decorator_list, expr_ty returns, - string type_comment, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena - *arena); +stmt_ty _Py_AsyncFunctionDef(identifier name, arguments_ty args, asdl_stmt_seq + * body, asdl_expr_seq * decorator_list, expr_ty + returns, string type_comment, int lineno, int + col_offset, int end_lineno, int end_col_offset, + PyArena *arena); #define ClassDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) _Py_ClassDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) -stmt_ty _Py_ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, - asdl_seq * body, asdl_seq * decorator_list, int lineno, - int col_offset, int end_lineno, int end_col_offset, - PyArena *arena); +stmt_ty _Py_ClassDef(identifier name, asdl_expr_seq * bases, asdl_keyword_seq * + keywords, asdl_stmt_seq * body, asdl_expr_seq * + decorator_list, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); #define Return(a0, a1, a2, a3, a4, a5) _Py_Return(a0, a1, a2, a3, a4, a5) stmt_ty _Py_Return(expr_ty value, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Delete(a0, a1, a2, a3, a4, a5) _Py_Delete(a0, a1, a2, a3, a4, a5) -stmt_ty _Py_Delete(asdl_seq * targets, int lineno, int col_offset, int +stmt_ty _Py_Delete(asdl_expr_seq * targets, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Assign(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Assign(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_Assign(asdl_seq * targets, expr_ty value, string type_comment, int - lineno, int col_offset, int end_lineno, int end_col_offset, - PyArena *arena); +stmt_ty _Py_Assign(asdl_expr_seq * targets, expr_ty value, string type_comment, + int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); #define AugAssign(a0, a1, a2, a3, a4, a5, a6, a7) _Py_AugAssign(a0, a1, a2, a3, a4, a5, a6, a7) stmt_ty _Py_AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int col_offset, int end_lineno, int @@ -500,52 +583,54 @@ stmt_ty _Py_AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define For(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) _Py_For(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) -stmt_ty _Py_For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * - orelse, string type_comment, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _Py_For(expr_ty target, expr_ty iter, asdl_stmt_seq * body, + asdl_stmt_seq * orelse, string type_comment, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define AsyncFor(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) _Py_AsyncFor(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) -stmt_ty _Py_AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * - orelse, string type_comment, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _Py_AsyncFor(expr_ty target, expr_ty iter, asdl_stmt_seq * body, + asdl_stmt_seq * orelse, string type_comment, int lineno, + int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); #define While(a0, a1, a2, a3, a4, a5, a6, a7) _Py_While(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, - int col_offset, int end_lineno, int end_col_offset, PyArena - *arena); +stmt_ty _Py_While(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse, + int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); #define If(a0, a1, a2, a3, a4, a5, a6, a7) _Py_If(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, - int col_offset, int end_lineno, int end_col_offset, PyArena - *arena); +stmt_ty _Py_If(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse, int + lineno, int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); #define With(a0, a1, a2, a3, a4, a5, a6, a7) _Py_With(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_With(asdl_seq * items, asdl_seq * body, string type_comment, int - lineno, int col_offset, int end_lineno, int end_col_offset, - PyArena *arena); +stmt_ty _Py_With(asdl_withitem_seq * items, asdl_stmt_seq * body, string + type_comment, int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); #define AsyncWith(a0, a1, a2, a3, a4, a5, a6, a7) _Py_AsyncWith(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_AsyncWith(asdl_seq * items, asdl_seq * body, string type_comment, - int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); +stmt_ty _Py_AsyncWith(asdl_withitem_seq * items, asdl_stmt_seq * body, string + type_comment, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); #define Raise(a0, a1, a2, a3, a4, a5, a6) _Py_Raise(a0, a1, a2, a3, a4, a5, a6) stmt_ty _Py_Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Try(a0, a1, a2, a3, a4, a5, a6, a7, a8) _Py_Try(a0, a1, a2, a3, a4, a5, a6, a7, a8) -stmt_ty _Py_Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, - asdl_seq * finalbody, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _Py_Try(asdl_stmt_seq * body, asdl_excepthandler_seq * handlers, + asdl_stmt_seq * orelse, asdl_stmt_seq * finalbody, int lineno, + int col_offset, int end_lineno, int end_col_offset, PyArena + *arena); #define Assert(a0, a1, a2, a3, a4, a5, a6) _Py_Assert(a0, a1, a2, a3, a4, a5, a6) stmt_ty _Py_Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Import(a0, a1, a2, a3, a4, a5) _Py_Import(a0, a1, a2, a3, a4, a5) -stmt_ty _Py_Import(asdl_seq * names, int lineno, int col_offset, int +stmt_ty _Py_Import(asdl_alias_seq * names, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define ImportFrom(a0, a1, a2, a3, a4, a5, a6, a7) _Py_ImportFrom(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_ImportFrom(identifier module, asdl_seq * names, int level, int - lineno, int col_offset, int end_lineno, int +stmt_ty _Py_ImportFrom(identifier module, asdl_alias_seq * names, int level, + int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Global(a0, a1, a2, a3, a4, a5) _Py_Global(a0, a1, a2, a3, a4, a5) -stmt_ty _Py_Global(asdl_seq * names, int lineno, int col_offset, int +stmt_ty _Py_Global(asdl_identifier_seq * names, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Nonlocal(a0, a1, a2, a3, a4, a5) _Py_Nonlocal(a0, a1, a2, a3, a4, a5) -stmt_ty _Py_Nonlocal(asdl_seq * names, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _Py_Nonlocal(asdl_identifier_seq * names, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena *arena); #define Expr(a0, a1, a2, a3, a4, a5) _Py_Expr(a0, a1, a2, a3, a4, a5) stmt_ty _Py_Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); @@ -559,8 +644,9 @@ stmt_ty _Py_Break(int lineno, int col_offset, int end_lineno, int stmt_ty _Py_Continue(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define BoolOp(a0, a1, a2, a3, a4, a5, a6) _Py_BoolOp(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena); +expr_ty _Py_BoolOp(boolop_ty op, asdl_expr_seq * values, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); #define NamedExpr(a0, a1, a2, a3, a4, a5, a6) _Py_NamedExpr(a0, a1, a2, a3, a4, a5, a6) expr_ty _Py_NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena @@ -580,28 +666,28 @@ expr_ty _Py_IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Dict(a0, a1, a2, a3, a4, a5, a6) _Py_Dict(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_Dict(asdl_seq * keys, asdl_seq * values, int lineno, int +expr_ty _Py_Dict(asdl_expr_seq * keys, asdl_expr_seq * values, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Set(a0, a1, a2, a3, a4, a5) _Py_Set(a0, a1, a2, a3, a4, a5) -expr_ty _Py_Set(asdl_seq * elts, int lineno, int col_offset, int end_lineno, - int end_col_offset, PyArena *arena); +expr_ty _Py_Set(asdl_expr_seq * elts, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); #define ListComp(a0, a1, a2, a3, a4, a5, a6) _Py_ListComp(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_ListComp(expr_ty elt, asdl_seq * generators, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define SetComp(a0, a1, a2, a3, a4, a5, a6) _Py_SetComp(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_SetComp(expr_ty elt, asdl_seq * generators, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define DictComp(a0, a1, a2, a3, a4, a5, a6, a7) _Py_DictComp(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int +expr_ty _Py_ListComp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); +#define SetComp(a0, a1, a2, a3, a4, a5, a6) _Py_SetComp(a0, a1, a2, a3, a4, a5, a6) +expr_ty _Py_SetComp(expr_ty elt, asdl_comprehension_seq * generators, int + lineno, int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +#define DictComp(a0, a1, a2, a3, a4, a5, a6, a7) _Py_DictComp(a0, a1, a2, a3, a4, a5, a6, a7) +expr_ty _Py_DictComp(expr_ty key, expr_ty value, asdl_comprehension_seq * + generators, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); #define GeneratorExp(a0, a1, a2, a3, a4, a5, a6) _Py_GeneratorExp(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int - col_offset, int end_lineno, int end_col_offset, - PyArena *arena); +expr_ty _Py_GeneratorExp(expr_ty elt, asdl_comprehension_seq * generators, int + lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); #define Await(a0, a1, a2, a3, a4, a5) _Py_Await(a0, a1, a2, a3, a4, a5) expr_ty _Py_Await(expr_ty value, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); @@ -612,19 +698,19 @@ expr_ty _Py_Yield(expr_ty value, int lineno, int col_offset, int end_lineno, expr_ty _Py_YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Compare(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Compare(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, - int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); +expr_ty _Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_expr_seq * + comparators, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); #define Call(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Call(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int - lineno, int col_offset, int end_lineno, int end_col_offset, - PyArena *arena); +expr_ty _Py_Call(expr_ty func, asdl_expr_seq * args, asdl_keyword_seq * + keywords, int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); #define FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7) _Py_FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7) expr_ty _Py_FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define JoinedStr(a0, a1, a2, a3, a4, a5) _Py_JoinedStr(a0, a1, a2, a3, a4, a5) -expr_ty _Py_JoinedStr(asdl_seq * values, int lineno, int col_offset, int +expr_ty _Py_JoinedStr(asdl_expr_seq * values, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Constant(a0, a1, a2, a3, a4, a5, a6) _Py_Constant(a0, a1, a2, a3, a4, a5, a6) expr_ty _Py_Constant(constant value, string kind, int lineno, int col_offset, @@ -646,11 +732,11 @@ expr_ty _Py_Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define List(a0, a1, a2, a3, a4, a5, a6) _Py_List(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_List(asdl_seq * elts, expr_context_ty ctx, int lineno, int +expr_ty _Py_List(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Tuple(a0, a1, a2, a3, a4, a5, a6) _Py_Tuple(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int +expr_ty _Py_Tuple(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Slice(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Slice(a0, a1, a2, a3, a4, a5, a6, a7) @@ -658,18 +744,18 @@ expr_ty _Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define comprehension(a0, a1, a2, a3, a4) _Py_comprehension(a0, a1, a2, a3, a4) -comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq * - ifs, int is_async, PyArena *arena); +comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_expr_seq + * ifs, int is_async, PyArena *arena); #define ExceptHandler(a0, a1, a2, a3, a4, a5, a6, a7) _Py_ExceptHandler(a0, a1, a2, a3, a4, a5, a6, a7) -excepthandler_ty _Py_ExceptHandler(expr_ty type, identifier name, asdl_seq * - body, int lineno, int col_offset, int +excepthandler_ty _Py_ExceptHandler(expr_ty type, identifier name, asdl_stmt_seq + * body, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define arguments(a0, a1, a2, a3, a4, a5, a6, a7) _Py_arguments(a0, a1, a2, a3, a4, a5, a6, a7) -arguments_ty _Py_arguments(asdl_seq * posonlyargs, asdl_seq * args, arg_ty - vararg, asdl_seq * kwonlyargs, asdl_seq * - kw_defaults, arg_ty kwarg, asdl_seq * defaults, - PyArena *arena); +arguments_ty _Py_arguments(asdl_arg_seq * posonlyargs, asdl_arg_seq * args, + arg_ty vararg, asdl_arg_seq * kwonlyargs, + asdl_expr_seq * kw_defaults, arg_ty kwarg, + asdl_expr_seq * defaults, PyArena *arena); #define arg(a0, a1, a2, a3, a4, a5, a6, a7) _Py_arg(a0, a1, a2, a3, a4, a5, a6, a7) arg_ty _Py_arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int col_offset, int end_lineno, int end_col_offset, diff --git a/Include/asdl.h b/Include/asdl.h index e962560bcd4cbe..8b61e16c329ea9 100644 --- a/Include/asdl.h +++ b/Include/asdl.h @@ -13,25 +13,80 @@ typedef PyObject * constant; interned Python strings. */ -/* XXX A sequence should be typed so that its use can be typechecked. */ +#define _ASDL_SEQ_HEAD \ + Py_ssize_t size; \ + void **elements; typedef struct { - Py_ssize_t size; - void *elements[1]; + _ASDL_SEQ_HEAD } asdl_seq; typedef struct { - Py_ssize_t size; - int elements[1]; + _ASDL_SEQ_HEAD + void *typed_elements[1]; +} asdl_generic_seq; + +typedef struct { + _ASDL_SEQ_HEAD + PyObject *typed_elements[1]; +} asdl_identifier_seq; + +typedef struct { + _ASDL_SEQ_HEAD + int typed_elements[1]; } asdl_int_seq; -asdl_seq *_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena); +asdl_generic_seq *_Py_asdl_generic_seq_new(Py_ssize_t size, PyArena *arena); +asdl_identifier_seq *_Py_asdl_identifier_seq_new(Py_ssize_t size, PyArena *arena); asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena); -#define asdl_seq_GET(S, I) (S)->elements[(I)] + +#define GENERATE_ASDL_SEQ_CONSTRUCTOR(NAME, TYPE) \ +asdl_ ## NAME ## _seq *_Py_asdl_ ## NAME ## _seq_new(Py_ssize_t size, PyArena *arena) \ +{ \ + asdl_ ## NAME ## _seq *seq = NULL; \ + size_t n; \ + /* check size is sane */ \ + if (size < 0 || \ + (size && (((size_t)size - 1) > (SIZE_MAX / sizeof(void *))))) { \ + PyErr_NoMemory(); \ + return NULL; \ + } \ + n = (size ? (sizeof(TYPE *) * (size - 1)) : 0); \ + /* check if size can be added safely */ \ + if (n > SIZE_MAX - sizeof(asdl_ ## NAME ## _seq)) { \ + PyErr_NoMemory(); \ + return NULL; \ + } \ + n += sizeof(asdl_ ## NAME ## _seq); \ + seq = (asdl_ ## NAME ## _seq *)PyArena_Malloc(arena, n); \ + if (!seq) { \ + PyErr_NoMemory(); \ + return NULL; \ + } \ + memset(seq, 0, n); \ + seq->size = size; \ + seq->elements = (void**)seq->typed_elements; \ + return seq; \ +} + +#define asdl_seq_GET_UNTYPED(S, I) (S)->elements[(I)] +#define asdl_seq_GET(S, I) (S)->typed_elements[(I)] #define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) #ifdef Py_DEBUG #define asdl_seq_SET(S, I, V) \ + do { \ + Py_ssize_t _asdl_i = (I); \ + assert((S) != NULL); \ + assert(0 <= _asdl_i && _asdl_i < (S)->size); \ + (S)->typed_elements[_asdl_i] = (V); \ + } while (0) +#else +#define asdl_seq_SET(S, I, V) (S)->typed_elements[I] = (V) +#endif + +#ifdef Py_DEBUG +#define asdl_seq_SET_UNTYPED(S, I, V) \ do { \ Py_ssize_t _asdl_i = (I); \ assert((S) != NULL); \ @@ -39,7 +94,7 @@ asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena); (S)->elements[_asdl_i] = (V); \ } while (0) #else -#define asdl_seq_SET(S, I, V) (S)->elements[I] = (V) +#define asdl_seq_SET_UNTYPED(S, I, V) (S)->elements[I] = (V) #endif #endif /* !Py_ASDL_H */ diff --git a/Include/ast.h b/Include/ast.h index de42a3b5e6f91a..434ee18dd91b2a 100644 --- a/Include/ast.h +++ b/Include/ast.h @@ -15,7 +15,7 @@ PyAPI_FUNC(PyObject *) _PyAST_ExprAsUnicode(expr_ty); /* Return the borrowed reference to the first literal string in the sequence of statements or NULL if it doesn't start from a literal string. Doesn't set exception. */ -PyAPI_FUNC(PyObject *) _PyAST_GetDocString(asdl_seq *); +PyAPI_FUNC(PyObject *) _PyAST_GetDocString(asdl_stmt_seq *); #ifdef __cplusplus } diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 0c053393d688b8..242eccf3d37d78 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -163,6 +163,32 @@ def visitProduct(self, product, name, depth): self.emit(s, depth) self.emit("", depth) +class SequenceDefVisitor(EmitVisitor): + def visitModule(self, mod): + for dfn in mod.dfns: + self.visit(dfn) + + def visitType(self, type, depth=0): + self.visit(type.value, type.name, depth) + + def visitSum(self, sum, name, depth): + if is_simple(sum): + return + self.emit_sequence_constructor(name, depth) + + def emit_sequence_constructor(self, name,depth): + ctype = get_c_type(name) + self.emit("""\ +typedef struct { + _ASDL_SEQ_HEAD + %(ctype)s typed_elements[1]; +} asdl_%(name)s_seq;""" % locals(), reflow=False, depth=depth) + self.emit("", depth) + self.emit("asdl_%(name)s_seq *_Py_asdl_%(name)s_seq_new(Py_ssize_t size, PyArena *arena);" % locals(), depth) + self.emit("", depth) + + def visitProduct(self, product, name, depth): + self.emit_sequence_constructor(name, depth) class StructVisitor(EmitVisitor): """Visitor to generate typedefs for AST.""" @@ -219,7 +245,8 @@ def visitField(self, field, depth): if field.type == 'cmpop': self.emit("asdl_int_seq *%(name)s;" % locals(), depth) else: - self.emit("asdl_seq *%(name)s;" % locals(), depth) + _type = field.type + self.emit("asdl_%(_type)s_seq *%(name)s;" % locals(), depth) else: self.emit("%(ctype)s %(name)s;" % locals(), depth) @@ -274,7 +301,7 @@ def get_args(self, fields): if f.type == 'cmpop': ctype = "asdl_int_seq *" else: - ctype = "asdl_seq *" + ctype = f"asdl_{f.type}_seq *" else: ctype = get_c_type(f.type) args.append((ctype, name, f.opt or f.seq)) @@ -507,7 +534,8 @@ def visitFieldDeclaration(self, field, name, sum=None, prod=None, depth=0): if self.isSimpleType(field): self.emit("asdl_int_seq* %s;" % field.name, depth) else: - self.emit("asdl_seq* %s;" % field.name, depth) + _type = field.type + self.emit(f"asdl_{field.type}_seq* {field.name};", depth) else: ctype = get_c_type(field.type) self.emit("%s %s;" % (ctype, field.name), depth) @@ -562,7 +590,7 @@ def visitField(self, field, name, sum=None, prod=None, depth=0): if self.isSimpleType(field): self.emit("%s = _Py_asdl_int_seq_new(len, arena);" % field.name, depth+1) else: - self.emit("%s = _Py_asdl_seq_new(len, arena);" % field.name, depth+1) + self.emit("%s = _Py_asdl_%s_seq_new(len, arena);" % (field.name, field.type), depth+1) self.emit("if (%s == NULL) goto failed;" % field.name, depth+1) self.emit("for (i = 0; i < len; i++) {", depth+1) self.emit("%s val;" % ctype, depth+2) @@ -600,6 +628,24 @@ def prototype(self, sum, name): visitProduct = visitSum = prototype +class SequenceConstructorVisitor(EmitVisitor): + def visitModule(self, mod): + for dfn in mod.dfns: + self.visit(dfn) + + def visitType(self, type): + self.visit(type.value, type.name) + + def visitProduct(self, prod, name): + self.emit_sequence_constructor(name, get_c_type(name)) + + def visitSum(self, sum, name): + if not is_simple(sum): + self.emit_sequence_constructor(name, get_c_type(name)) + + def emit_sequence_constructor(self, name, type): + self.emit(f"GENERATE_ASDL_SEQ_CONSTRUCTOR({name}, {type})", depth=0) + class PyTypesDeclareVisitor(PickleVisitor): def visitProduct(self, prod, name): @@ -647,6 +693,7 @@ def visitConstructor(self, cons, name): self.emit('"%s",' % t.name, 1) self.emit("};",0) + class PyTypesVisitor(PickleVisitor): def visitModule(self, mod): @@ -874,7 +921,7 @@ def visitModule(self, mod): if (!result) return NULL; for (i = 0; i < n; i++) { - value = func(state, asdl_seq_GET(seq, i)); + value = func(state, asdl_seq_GET_UNTYPED(seq, i)); if (!value) { Py_DECREF(result); return NULL; @@ -1264,7 +1311,7 @@ def set(self, field, value, depth): depth+2, reflow=False) self.emit("}", depth) else: - self.emit("value = ast2obj_list(state, %s, ast2obj_%s);" % (value, field.type), depth) + self.emit("value = ast2obj_list(state, (asdl_seq*)%s, ast2obj_%s);" % (value, field.type), depth) else: ctype = get_c_type(field.type) self.emit("value = ast2obj_%s(state, %s);" % (field.type, value), depth, reflow=False) @@ -1431,6 +1478,7 @@ def write_header(f, mod): f.write('#undef Yield /* undefine macro conflicting with */\n') f.write('\n') c = ChainOfVisitors(TypeDefVisitor(f), + SequenceDefVisitor(f), StructVisitor(f)) c.visit(mod) f.write("// Note: these macros affect function definitions, not only call sites.\n") @@ -1457,6 +1505,7 @@ def write_source(f, mod): generate_module_def(f, mod) v = ChainOfVisitors( + SequenceConstructorVisitor(f), PyTypesDeclareVisitor(f), PyTypesVisitor(f), Obj2ModPrototypeVisitor(f), diff --git a/Parser/parser.c b/Parser/parser.c index 8a7cb62fd7cf8d..1bd74a38fbc2ba 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -389,11 +389,11 @@ static mod_ty interactive_rule(Parser *p); static mod_ty eval_rule(Parser *p); static mod_ty func_type_rule(Parser *p); static expr_ty fstring_rule(Parser *p); -static asdl_seq* type_expressions_rule(Parser *p); -static asdl_seq* statements_rule(Parser *p); -static asdl_seq* statement_rule(Parser *p); -static asdl_seq* statement_newline_rule(Parser *p); -static asdl_seq* simple_stmt_rule(Parser *p); +static asdl_expr_seq* type_expressions_rule(Parser *p); +static asdl_stmt_seq* statements_rule(Parser *p); +static asdl_stmt_seq* statement_rule(Parser *p); +static asdl_stmt_seq* statement_newline_rule(Parser *p); +static asdl_stmt_seq* simple_stmt_rule(Parser *p); static stmt_ty small_stmt_rule(Parser *p); static stmt_ty compound_stmt_rule(Parser *p); static stmt_ty assignment_rule(Parser *p); @@ -406,22 +406,22 @@ static stmt_ty del_stmt_rule(Parser *p); static stmt_ty import_stmt_rule(Parser *p); static stmt_ty import_name_rule(Parser *p); static stmt_ty import_from_rule(Parser *p); -static asdl_seq* import_from_targets_rule(Parser *p); -static asdl_seq* import_from_as_names_rule(Parser *p); +static asdl_alias_seq* import_from_targets_rule(Parser *p); +static asdl_alias_seq* import_from_as_names_rule(Parser *p); static alias_ty import_from_as_name_rule(Parser *p); -static asdl_seq* dotted_as_names_rule(Parser *p); +static asdl_alias_seq* dotted_as_names_rule(Parser *p); static alias_ty dotted_as_name_rule(Parser *p); static expr_ty dotted_name_rule(Parser *p); static stmt_ty if_stmt_rule(Parser *p); static stmt_ty elif_stmt_rule(Parser *p); -static asdl_seq* else_block_rule(Parser *p); +static asdl_stmt_seq* else_block_rule(Parser *p); static stmt_ty while_stmt_rule(Parser *p); static stmt_ty for_stmt_rule(Parser *p); static stmt_ty with_stmt_rule(Parser *p); static withitem_ty with_item_rule(Parser *p); static stmt_ty try_stmt_rule(Parser *p); static excepthandler_ty except_block_rule(Parser *p); -static asdl_seq* finally_block_rule(Parser *p); +static asdl_stmt_seq* finally_block_rule(Parser *p); static stmt_ty return_stmt_rule(Parser *p); static stmt_ty raise_stmt_rule(Parser *p); static stmt_ty function_def_rule(Parser *p); @@ -429,7 +429,7 @@ static stmt_ty function_def_raw_rule(Parser *p); static Token* func_type_comment_rule(Parser *p); static arguments_ty params_rule(Parser *p); static arguments_ty parameters_rule(Parser *p); -static asdl_seq* slash_no_default_rule(Parser *p); +static asdl_arg_seq* slash_no_default_rule(Parser *p); static SlashWithDefault* slash_with_default_rule(Parser *p); static StarEtc* star_etc_rule(Parser *p); static arg_ty kwds_rule(Parser *p); @@ -439,14 +439,14 @@ static NameDefaultPair* param_maybe_default_rule(Parser *p); static arg_ty param_rule(Parser *p); static expr_ty annotation_rule(Parser *p); static expr_ty default_rule(Parser *p); -static asdl_seq* decorators_rule(Parser *p); +static asdl_expr_seq* decorators_rule(Parser *p); static stmt_ty class_def_rule(Parser *p); static stmt_ty class_def_raw_rule(Parser *p); -static asdl_seq* block_rule(Parser *p); -static asdl_seq* expressions_list_rule(Parser *p); +static asdl_stmt_seq* block_rule(Parser *p); +static asdl_expr_seq* expressions_list_rule(Parser *p); static expr_ty star_expressions_rule(Parser *p); static expr_ty star_expression_rule(Parser *p); -static asdl_seq* star_named_expressions_rule(Parser *p); +static asdl_expr_seq* star_named_expressions_rule(Parser *p); static expr_ty star_named_expression_rule(Parser *p); static expr_ty named_expression_rule(Parser *p); static expr_ty annotated_rhs_rule(Parser *p); @@ -455,7 +455,7 @@ static expr_ty expression_rule(Parser *p); static expr_ty lambdef_rule(Parser *p); static arguments_ty lambda_params_rule(Parser *p); static arguments_ty lambda_parameters_rule(Parser *p); -static asdl_seq* lambda_slash_no_default_rule(Parser *p); +static asdl_arg_seq* lambda_slash_no_default_rule(Parser *p); static SlashWithDefault* lambda_slash_with_default_rule(Parser *p); static StarEtc* lambda_star_etc_rule(Parser *p); static arg_ty lambda_kwds_rule(Parser *p); @@ -504,7 +504,7 @@ static expr_ty dictcomp_rule(Parser *p); static asdl_seq* double_starred_kvpairs_rule(Parser *p); static KeyValuePair* double_starred_kvpair_rule(Parser *p); static KeyValuePair* kvpair_rule(Parser *p); -static asdl_seq* for_if_clauses_rule(Parser *p); +static asdl_comprehension_seq* for_if_clauses_rule(Parser *p); static comprehension_ty for_if_clause_rule(Parser *p); static expr_ty yield_expr_rule(Parser *p); static expr_ty arguments_rule(Parser *p); @@ -514,15 +514,15 @@ static expr_ty starred_expression_rule(Parser *p); static KeywordOrStarred* kwarg_or_starred_rule(Parser *p); static KeywordOrStarred* kwarg_or_double_starred_rule(Parser *p); static expr_ty star_targets_rule(Parser *p); -static asdl_seq* star_targets_seq_rule(Parser *p); +static asdl_expr_seq* star_targets_seq_rule(Parser *p); static expr_ty star_target_rule(Parser *p); static expr_ty star_atom_rule(Parser *p); static expr_ty single_target_rule(Parser *p); static expr_ty single_subscript_attribute_target_rule(Parser *p); -static asdl_seq* del_targets_rule(Parser *p); +static asdl_expr_seq* del_targets_rule(Parser *p); static expr_ty del_target_rule(Parser *p); static expr_ty del_t_atom_rule(Parser *p); -static asdl_seq* targets_rule(Parser *p); +static asdl_expr_seq* targets_rule(Parser *p); static expr_ty target_rule(Parser *p); static expr_ty t_primary_rule(Parser *p); static void *t_lookahead_rule(Parser *p); @@ -764,7 +764,7 @@ interactive_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> interactive[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement_newline")); - asdl_seq* a; + asdl_stmt_seq* a; if ( (a = statement_newline_rule(p)) // statement_newline ) @@ -938,7 +938,7 @@ fstring_rule(Parser *p) // | '*' expression // | '**' expression // | ','.expression+ -static asdl_seq* +static asdl_expr_seq* type_expressions_rule(Parser *p) { D(p->level++); @@ -946,7 +946,7 @@ type_expressions_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_expr_seq* _res = NULL; int _mark = p->mark; { // ','.expression+ ',' '*' expression ',' '**' expression if (p->error_indicator) { @@ -978,7 +978,7 @@ type_expressions_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '*' expression ',' '**' expression")); - _res = _PyPegen_seq_append_to_end ( p , CHECK ( _PyPegen_seq_append_to_end ( p , a , b ) ) , c ); + _res = ( asdl_expr_seq * ) _PyPegen_seq_append_to_end ( p , CHECK ( _PyPegen_seq_append_to_end ( p , a , b ) ) , c ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1011,7 +1011,7 @@ type_expressions_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '*' expression")); - _res = _PyPegen_seq_append_to_end ( p , a , b ); + _res = ( asdl_expr_seq * ) _PyPegen_seq_append_to_end ( p , a , b ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1044,7 +1044,7 @@ type_expressions_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '**' expression")); - _res = _PyPegen_seq_append_to_end ( p , a , b ); + _res = ( asdl_expr_seq * ) _PyPegen_seq_append_to_end ( p , a , b ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1080,7 +1080,7 @@ type_expressions_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' expression ',' '**' expression")); - _res = _PyPegen_seq_append_to_end ( p , CHECK ( _PyPegen_singleton_seq ( p , a ) ) , b ); + _res = ( asdl_expr_seq * ) _PyPegen_seq_append_to_end ( p , CHECK ( _PyPegen_singleton_seq ( p , a ) ) , b ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1107,7 +1107,7 @@ type_expressions_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' expression")); - _res = _PyPegen_singleton_seq ( p , a ); + _res = ( asdl_expr_seq * ) _PyPegen_singleton_seq ( p , a ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1134,7 +1134,7 @@ type_expressions_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' expression")); - _res = _PyPegen_singleton_seq ( p , a ); + _res = ( asdl_expr_seq * ) _PyPegen_singleton_seq ( p , a ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1152,13 +1152,18 @@ type_expressions_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+")); - asdl_seq * _gather_9_var; + asdl_expr_seq* a; if ( - (_gather_9_var = _gather_9_rule(p)) // ','.expression+ + (a = (asdl_expr_seq*)_gather_9_rule(p)) // ','.expression+ ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+")); - _res = _gather_9_var; + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } goto done; } p->mark = _mark; @@ -1172,7 +1177,7 @@ type_expressions_rule(Parser *p) } // statements: statement+ -static asdl_seq* +static asdl_stmt_seq* statements_rule(Parser *p) { D(p->level++); @@ -1180,7 +1185,7 @@ statements_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_stmt_seq* _res = NULL; int _mark = p->mark; { // statement+ if (p->error_indicator) { @@ -1194,7 +1199,7 @@ statements_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ statements[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "statement+")); - _res = _PyPegen_seq_flatten ( p , a ); + _res = ( asdl_stmt_seq * ) _PyPegen_seq_flatten ( p , a ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1213,7 +1218,7 @@ statements_rule(Parser *p) } // statement: compound_stmt | simple_stmt -static asdl_seq* +static asdl_stmt_seq* statement_rule(Parser *p) { D(p->level++); @@ -1221,7 +1226,7 @@ statement_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_stmt_seq* _res = NULL; int _mark = p->mark; { // compound_stmt if (p->error_indicator) { @@ -1235,7 +1240,7 @@ statement_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ statement[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "compound_stmt")); - _res = _PyPegen_singleton_seq ( p , a ); + _res = ( asdl_stmt_seq * ) _PyPegen_singleton_seq ( p , a ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1253,13 +1258,18 @@ statement_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> statement[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); - asdl_seq* simple_stmt_var; + asdl_stmt_seq* a; if ( - (simple_stmt_var = simple_stmt_rule(p)) // simple_stmt + (a = (asdl_stmt_seq*)simple_stmt_rule(p)) // simple_stmt ) { D(fprintf(stderr, "%*c+ statement[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt")); - _res = simple_stmt_var; + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } goto done; } p->mark = _mark; @@ -1273,7 +1283,7 @@ statement_rule(Parser *p) } // statement_newline: compound_stmt NEWLINE | simple_stmt | NEWLINE | $ -static asdl_seq* +static asdl_stmt_seq* statement_newline_rule(Parser *p) { D(p->level++); @@ -1281,7 +1291,7 @@ statement_newline_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_stmt_seq* _res = NULL; int _mark = p->mark; if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { p->error_indicator = 1; @@ -1307,7 +1317,7 @@ statement_newline_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ statement_newline[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "compound_stmt NEWLINE")); - _res = _PyPegen_singleton_seq ( p , a ); + _res = ( asdl_stmt_seq * ) _PyPegen_singleton_seq ( p , a ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1325,7 +1335,7 @@ statement_newline_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> statement_newline[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); - asdl_seq* simple_stmt_var; + asdl_stmt_seq* simple_stmt_var; if ( (simple_stmt_var = simple_stmt_rule(p)) // simple_stmt ) @@ -1359,7 +1369,7 @@ statement_newline_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _PyPegen_singleton_seq ( p , CHECK ( _Py_Pass ( EXTRA ) ) ); + _res = ( asdl_stmt_seq * ) _PyPegen_singleton_seq ( p , CHECK ( _Py_Pass ( EXTRA ) ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1402,7 +1412,7 @@ statement_newline_rule(Parser *p) } // simple_stmt: small_stmt !';' NEWLINE | ';'.small_stmt+ ';'? NEWLINE -static asdl_seq* +static asdl_stmt_seq* simple_stmt_rule(Parser *p) { D(p->level++); @@ -1410,7 +1420,7 @@ simple_stmt_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_stmt_seq* _res = NULL; int _mark = p->mark; { // small_stmt !';' NEWLINE if (p->error_indicator) { @@ -1429,7 +1439,7 @@ simple_stmt_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "small_stmt !';' NEWLINE")); - _res = _PyPegen_singleton_seq ( p , a ); + _res = ( asdl_stmt_seq * ) _PyPegen_singleton_seq ( p , a ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1449,10 +1459,10 @@ simple_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'.small_stmt+ ';'? NEWLINE")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - asdl_seq * a; + asdl_stmt_seq* a; Token * newline_var; if ( - (a = _gather_12_rule(p)) // ';'.small_stmt+ + (a = (asdl_stmt_seq*)_gather_12_rule(p)) // ';'.small_stmt+ && (_opt_var = _PyPegen_expect_token(p, 13), 1) // ';'? && @@ -2127,11 +2137,11 @@ assignment_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT?")); - asdl_seq * a; + asdl_expr_seq* a; void *b; void *tc; if ( - (a = _loop1_22_rule(p)) // ((star_targets '='))+ + (a = (asdl_expr_seq*)_loop1_22_rule(p)) // ((star_targets '='))+ && (b = _tmp_23_rule(p)) // yield_expr | star_expressions && @@ -2602,11 +2612,11 @@ global_stmt_rule(Parser *p) } D(fprintf(stderr, "%*c> global_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'global' ','.NAME+")); Token * _keyword; - asdl_seq * a; + asdl_expr_seq* a; if ( (_keyword = _PyPegen_expect_token(p, 508)) // token='global' && - (a = _gather_25_rule(p)) // ','.NAME+ + (a = (asdl_expr_seq*)_gather_25_rule(p)) // ','.NAME+ ) { D(fprintf(stderr, "%*c+ global_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'global' ','.NAME+")); @@ -2664,11 +2674,11 @@ nonlocal_stmt_rule(Parser *p) } D(fprintf(stderr, "%*c> nonlocal_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'nonlocal' ','.NAME+")); Token * _keyword; - asdl_seq * a; + asdl_expr_seq* a; if ( (_keyword = _PyPegen_expect_token(p, 509)) // token='nonlocal' && - (a = _gather_27_rule(p)) // ','.NAME+ + (a = (asdl_expr_seq*)_gather_27_rule(p)) // ','.NAME+ ) { D(fprintf(stderr, "%*c+ nonlocal_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'nonlocal' ','.NAME+")); @@ -2850,7 +2860,7 @@ del_stmt_rule(Parser *p) } D(fprintf(stderr, "%*c> del_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'del' del_targets &(';' | NEWLINE)")); Token * _keyword; - asdl_seq* a; + asdl_expr_seq* a; if ( (_keyword = _PyPegen_expect_token(p, 503)) // token='del' && @@ -2988,7 +2998,7 @@ import_name_rule(Parser *p) } D(fprintf(stderr, "%*c> import_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import' dotted_as_names")); Token * _keyword; - asdl_seq* a; + asdl_alias_seq* a; if ( (_keyword = _PyPegen_expect_token(p, 513)) // token='import' && @@ -3055,7 +3065,7 @@ import_from_rule(Parser *p) Token * _keyword_1; asdl_seq * a; expr_ty b; - asdl_seq* c; + asdl_alias_seq* c; if ( (_keyword = _PyPegen_expect_token(p, 514)) // token='from' && @@ -3099,7 +3109,7 @@ import_from_rule(Parser *p) Token * _keyword; Token * _keyword_1; asdl_seq * a; - asdl_seq* b; + asdl_alias_seq* b; if ( (_keyword = _PyPegen_expect_token(p, 514)) // token='from' && @@ -3143,7 +3153,7 @@ import_from_rule(Parser *p) // | import_from_as_names !',' // | '*' // | invalid_import_from_targets -static asdl_seq* +static asdl_alias_seq* import_from_targets_rule(Parser *p) { D(p->level++); @@ -3151,7 +3161,7 @@ import_from_targets_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_alias_seq* _res = NULL; int _mark = p->mark; { // '(' import_from_as_names ','? ')' if (p->error_indicator) { @@ -3163,7 +3173,7 @@ import_from_targets_rule(Parser *p) Token * _literal_1; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - asdl_seq* a; + asdl_alias_seq* a; if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && @@ -3193,7 +3203,7 @@ import_from_targets_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_names !','")); - asdl_seq* import_from_as_names_var; + asdl_alias_seq* import_from_as_names_var; if ( (import_from_as_names_var = import_from_as_names_rule(p)) // import_from_as_names && @@ -3220,7 +3230,7 @@ import_from_targets_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); - _res = _PyPegen_singleton_seq ( p , CHECK ( _PyPegen_alias_for_star ( p ) ) ); + _res = ( asdl_alias_seq * ) _PyPegen_singleton_seq ( p , CHECK ( _PyPegen_alias_for_star ( p ) ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -3258,7 +3268,7 @@ import_from_targets_rule(Parser *p) } // import_from_as_names: ','.import_from_as_name+ -static asdl_seq* +static asdl_alias_seq* import_from_as_names_rule(Parser *p) { D(p->level++); @@ -3266,7 +3276,7 @@ import_from_as_names_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_alias_seq* _res = NULL; int _mark = p->mark; { // ','.import_from_as_name+ if (p->error_indicator) { @@ -3274,9 +3284,9 @@ import_from_as_names_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> import_from_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); - asdl_seq * a; + asdl_alias_seq* a; if ( - (a = _gather_33_rule(p)) // ','.import_from_as_name+ + (a = (asdl_alias_seq*)_gather_33_rule(p)) // ','.import_from_as_name+ ) { D(fprintf(stderr, "%*c+ import_from_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); @@ -3343,7 +3353,7 @@ import_from_as_name_rule(Parser *p) } // dotted_as_names: ','.dotted_as_name+ -static asdl_seq* +static asdl_alias_seq* dotted_as_names_rule(Parser *p) { D(p->level++); @@ -3351,7 +3361,7 @@ dotted_as_names_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_alias_seq* _res = NULL; int _mark = p->mark; { // ','.dotted_as_name+ if (p->error_indicator) { @@ -3359,9 +3369,9 @@ dotted_as_names_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> dotted_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); - asdl_seq * a; + asdl_alias_seq* a; if ( - (a = _gather_36_rule(p)) // ','.dotted_as_name+ + (a = (asdl_alias_seq*)_gather_36_rule(p)) // ','.dotted_as_name+ ) { D(fprintf(stderr, "%*c+ dotted_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); @@ -3554,7 +3564,7 @@ if_stmt_rule(Parser *p) Token * _keyword; Token * _literal; expr_ty a; - asdl_seq* b; + asdl_stmt_seq* b; stmt_ty c; if ( (_keyword = _PyPegen_expect_token(p, 510)) // token='if' @@ -3578,7 +3588,7 @@ if_stmt_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_If ( a , b , CHECK ( _PyPegen_singleton_seq ( p , c ) ) , EXTRA ); + _res = _Py_If ( a , b , CHECK ( ( asdl_stmt_seq * ) _PyPegen_singleton_seq ( p , c ) ) , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -3599,7 +3609,7 @@ if_stmt_rule(Parser *p) Token * _keyword; Token * _literal; expr_ty a; - asdl_seq* b; + asdl_stmt_seq* b; void *c; if ( (_keyword = _PyPegen_expect_token(p, 510)) // token='if' @@ -3672,7 +3682,7 @@ elif_stmt_rule(Parser *p) Token * _keyword; Token * _literal; expr_ty a; - asdl_seq* b; + asdl_stmt_seq* b; stmt_ty c; if ( (_keyword = _PyPegen_expect_token(p, 515)) // token='elif' @@ -3717,7 +3727,7 @@ elif_stmt_rule(Parser *p) Token * _keyword; Token * _literal; expr_ty a; - asdl_seq* b; + asdl_stmt_seq* b; void *c; if ( (_keyword = _PyPegen_expect_token(p, 515)) // token='elif' @@ -3760,7 +3770,7 @@ elif_stmt_rule(Parser *p) } // else_block: 'else' ':' block -static asdl_seq* +static asdl_stmt_seq* else_block_rule(Parser *p) { D(p->level++); @@ -3768,7 +3778,7 @@ else_block_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_stmt_seq* _res = NULL; int _mark = p->mark; { // 'else' ':' block if (p->error_indicator) { @@ -3778,7 +3788,7 @@ else_block_rule(Parser *p) D(fprintf(stderr, "%*c> else_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else' ':' block")); Token * _keyword; Token * _literal; - asdl_seq* b; + asdl_stmt_seq* b; if ( (_keyword = _PyPegen_expect_token(p, 516)) // token='else' && @@ -3835,7 +3845,7 @@ while_stmt_rule(Parser *p) Token * _keyword; Token * _literal; expr_ty a; - asdl_seq* b; + asdl_stmt_seq* b; void *c; if ( (_keyword = _PyPegen_expect_token(p, 512)) // token='while' @@ -3910,7 +3920,7 @@ for_stmt_rule(Parser *p) Token * _keyword; Token * _keyword_1; Token * _literal; - asdl_seq* b; + asdl_stmt_seq* b; void *el; expr_ty ex; expr_ty t; @@ -3972,7 +3982,7 @@ for_stmt_rule(Parser *p) Token * _keyword_1; Token * _literal; Token * async_var; - asdl_seq* b; + asdl_stmt_seq* b; void *el; expr_ty ex; expr_ty t; @@ -4086,14 +4096,14 @@ with_stmt_rule(Parser *p) Token * _literal_2; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - asdl_seq * a; - asdl_seq* b; + asdl_withitem_seq* a; + asdl_stmt_seq* b; if ( (_keyword = _PyPegen_expect_token(p, 519)) // token='with' && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _gather_39_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_39_rule(p)) // ','.with_item+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? && @@ -4134,13 +4144,13 @@ with_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with' ','.with_item+ ':' TYPE_COMMENT? block")); Token * _keyword; Token * _literal; - asdl_seq * a; - asdl_seq* b; + asdl_withitem_seq* a; + asdl_stmt_seq* b; void *tc; if ( (_keyword = _PyPegen_expect_token(p, 519)) // token='with' && - (a = _gather_41_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_41_rule(p)) // ','.with_item+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -4183,9 +4193,9 @@ with_stmt_rule(Parser *p) Token * _literal_2; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - asdl_seq * a; + asdl_withitem_seq* a; Token * async_var; - asdl_seq* b; + asdl_stmt_seq* b; if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && @@ -4193,7 +4203,7 @@ with_stmt_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _gather_43_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_43_rule(p)) // ','.with_item+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? && @@ -4234,16 +4244,16 @@ with_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block")); Token * _keyword; Token * _literal; - asdl_seq * a; + asdl_withitem_seq* a; Token * async_var; - asdl_seq* b; + asdl_stmt_seq* b; void *tc; if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && (_keyword = _PyPegen_expect_token(p, 519)) // token='with' && - (a = _gather_45_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_45_rule(p)) // ','.with_item+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -4402,8 +4412,8 @@ try_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' ':' block finally_block")); Token * _keyword; Token * _literal; - asdl_seq* b; - asdl_seq* f; + asdl_stmt_seq* b; + asdl_stmt_seq* f; if ( (_keyword = _PyPegen_expect_token(p, 511)) // token='try' && @@ -4444,9 +4454,9 @@ try_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' ':' block except_block+ else_block? finally_block?")); Token * _keyword; Token * _literal; - asdl_seq* b; + asdl_stmt_seq* b; void *el; - asdl_seq * ex; + asdl_excepthandler_seq* ex; void *f; if ( (_keyword = _PyPegen_expect_token(p, 511)) // token='try' @@ -4455,7 +4465,7 @@ try_stmt_rule(Parser *p) && (b = block_rule(p)) // block && - (ex = _loop1_48_rule(p)) // except_block+ + (ex = (asdl_excepthandler_seq*)_loop1_48_rule(p)) // except_block+ && (el = else_block_rule(p), 1) // else_block? && @@ -4518,7 +4528,7 @@ except_block_rule(Parser *p) D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] ':' block")); Token * _keyword; Token * _literal; - asdl_seq* b; + asdl_stmt_seq* b; expr_ty e; void *t; if ( @@ -4563,7 +4573,7 @@ except_block_rule(Parser *p) D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' ':' block")); Token * _keyword; Token * _literal; - asdl_seq* b; + asdl_stmt_seq* b; if ( (_keyword = _PyPegen_expect_token(p, 521)) // token='except' && @@ -4601,7 +4611,7 @@ except_block_rule(Parser *p) } // finally_block: 'finally' ':' block -static asdl_seq* +static asdl_stmt_seq* finally_block_rule(Parser *p) { D(p->level++); @@ -4609,7 +4619,7 @@ finally_block_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_stmt_seq* _res = NULL; int _mark = p->mark; { // 'finally' ':' block if (p->error_indicator) { @@ -4619,7 +4629,7 @@ finally_block_rule(Parser *p) D(fprintf(stderr, "%*c> finally_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally' ':' block")); Token * _keyword; Token * _literal; - asdl_seq* a; + asdl_stmt_seq* a; if ( (_keyword = _PyPegen_expect_token(p, 522)) // token='finally' && @@ -4824,7 +4834,7 @@ function_def_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> function_def[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "decorators function_def_raw")); - asdl_seq* d; + asdl_expr_seq* d; stmt_ty f; if ( (d = decorators_rule(p)) // decorators @@ -4903,7 +4913,7 @@ function_def_raw_rule(Parser *p) Token * _literal_1; Token * _literal_2; void *a; - asdl_seq* b; + asdl_stmt_seq* b; expr_ty n; void *params; void *tc; @@ -4961,7 +4971,7 @@ function_def_raw_rule(Parser *p) Token * _literal_2; void *a; Token * async_var; - asdl_seq* b; + asdl_stmt_seq* b; expr_ty n; void *params; void *tc; @@ -5179,14 +5189,14 @@ parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default param_no_default* param_with_default* star_etc?")); - asdl_seq* a; - asdl_seq * b; + asdl_arg_seq* a; + asdl_arg_seq* b; asdl_seq * c; void *d; if ( (a = slash_no_default_rule(p)) // slash_no_default && - (b = _loop0_54_rule(p)) // param_no_default* + (b = (asdl_arg_seq*)_loop0_54_rule(p)) // param_no_default* && (c = _loop0_55_rule(p)) // param_with_default* && @@ -5242,11 +5252,11 @@ parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default+ param_with_default* star_etc?")); - asdl_seq * a; + asdl_arg_seq* a; asdl_seq * b; void *c; if ( - (a = _loop1_57_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_57_rule(p)) // param_no_default+ && (b = _loop0_58_rule(p)) // param_with_default* && @@ -5324,7 +5334,7 @@ parameters_rule(Parser *p) } // slash_no_default: param_no_default+ '/' ',' | param_no_default+ '/' &')' -static asdl_seq* +static asdl_arg_seq* slash_no_default_rule(Parser *p) { D(p->level++); @@ -5332,7 +5342,7 @@ slash_no_default_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_arg_seq* _res = NULL; int _mark = p->mark; { // param_no_default+ '/' ',' if (p->error_indicator) { @@ -5342,9 +5352,9 @@ slash_no_default_rule(Parser *p) D(fprintf(stderr, "%*c> slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default+ '/' ','")); Token * _literal; Token * _literal_1; - asdl_seq * a; + asdl_arg_seq* a; if ( - (a = _loop1_60_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_60_rule(p)) // param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -5371,9 +5381,9 @@ slash_no_default_rule(Parser *p) } D(fprintf(stderr, "%*c> slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default+ '/' &')'")); Token * _literal; - asdl_seq * a; + asdl_arg_seq* a; if ( - (a = _loop1_61_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_61_rule(p)) // param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -5433,7 +5443,7 @@ slash_with_default_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default* param_with_default+ '/' ','")); - _res = _PyPegen_slash_with_default ( p , a , b ); + _res = _PyPegen_slash_with_default ( p , ( asdl_arg_seq * ) a , b ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -5465,7 +5475,7 @@ slash_with_default_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default* param_with_default+ '/' &')'")); - _res = _PyPegen_slash_with_default ( p , a , b ); + _res = _PyPegen_slash_with_default ( p , ( asdl_arg_seq * ) a , b ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -6050,7 +6060,7 @@ default_rule(Parser *p) } // decorators: (('@' named_expression NEWLINE))+ -static asdl_seq* +static asdl_expr_seq* decorators_rule(Parser *p) { D(p->level++); @@ -6058,7 +6068,7 @@ decorators_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_expr_seq* _res = NULL; int _mark = p->mark; { // (('@' named_expression NEWLINE))+ if (p->error_indicator) { @@ -6066,9 +6076,9 @@ decorators_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> decorators[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); - asdl_seq * a; + asdl_expr_seq* a; if ( - (a = _loop1_68_rule(p)) // (('@' named_expression NEWLINE))+ + (a = (asdl_expr_seq*)_loop1_68_rule(p)) // (('@' named_expression NEWLINE))+ ) { D(fprintf(stderr, "%*c+ decorators[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); @@ -6107,7 +6117,7 @@ class_def_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> class_def[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "decorators class_def_raw")); - asdl_seq* a; + asdl_expr_seq* a; stmt_ty b; if ( (a = decorators_rule(p)) // decorators @@ -6183,7 +6193,7 @@ class_def_raw_rule(Parser *p) Token * _literal; expr_ty a; void *b; - asdl_seq* c; + asdl_stmt_seq* c; if ( (_keyword = _PyPegen_expect_token(p, 524)) // token='class' && @@ -6225,7 +6235,7 @@ class_def_raw_rule(Parser *p) } // block: NEWLINE INDENT statements DEDENT | simple_stmt | invalid_block -static asdl_seq* +static asdl_stmt_seq* block_rule(Parser *p) { D(p->level++); @@ -6233,7 +6243,7 @@ block_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_stmt_seq* _res = NULL; if (_PyPegen_is_memoized(p, block_type, &_res)) { D(p->level--); return _res; @@ -6245,7 +6255,7 @@ block_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT statements DEDENT")); - asdl_seq* a; + asdl_stmt_seq* a; Token * dedent_var; Token * indent_var; Token * newline_var; @@ -6278,7 +6288,7 @@ block_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); - asdl_seq* simple_stmt_var; + asdl_stmt_seq* simple_stmt_var; if ( (simple_stmt_var = simple_stmt_rule(p)) // simple_stmt ) @@ -6318,7 +6328,7 @@ block_rule(Parser *p) } // expressions_list: ','.star_expression+ ','? -static asdl_seq* +static asdl_expr_seq* expressions_list_rule(Parser *p) { D(p->level++); @@ -6326,7 +6336,7 @@ expressions_list_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_expr_seq* _res = NULL; int _mark = p->mark; { // ','.star_expression+ ','? if (p->error_indicator) { @@ -6336,9 +6346,9 @@ expressions_list_rule(Parser *p) D(fprintf(stderr, "%*c> expressions_list[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.star_expression+ ','?")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - asdl_seq * a; + asdl_expr_seq* a; if ( - (a = _gather_70_rule(p)) // ','.star_expression+ + (a = (asdl_expr_seq*)_gather_70_rule(p)) // ','.star_expression+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -6573,7 +6583,7 @@ star_expression_rule(Parser *p) } // star_named_expressions: ','.star_named_expression+ ','? -static asdl_seq* +static asdl_expr_seq* star_named_expressions_rule(Parser *p) { D(p->level++); @@ -6581,7 +6591,7 @@ star_named_expressions_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_expr_seq* _res = NULL; int _mark = p->mark; { // ','.star_named_expression+ ','? if (p->error_indicator) { @@ -6591,9 +6601,9 @@ star_named_expressions_rule(Parser *p) D(fprintf(stderr, "%*c> star_named_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.star_named_expression+ ','?")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - asdl_seq * a; + asdl_expr_seq* a; if ( - (a = _gather_73_rule(p)) // ','.star_named_expression+ + (a = (asdl_expr_seq*)_gather_73_rule(p)) // ','.star_named_expression+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -7245,14 +7255,14 @@ lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* lambda_star_etc?")); - asdl_seq* a; - asdl_seq * b; + asdl_arg_seq* a; + asdl_arg_seq* b; asdl_seq * c; void *d; if ( (a = lambda_slash_no_default_rule(p)) // lambda_slash_no_default && - (b = _loop0_76_rule(p)) // lambda_param_no_default* + (b = (asdl_arg_seq*)_loop0_76_rule(p)) // lambda_param_no_default* && (c = _loop0_77_rule(p)) // lambda_param_with_default* && @@ -7308,11 +7318,11 @@ lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ lambda_param_with_default* lambda_star_etc?")); - asdl_seq * a; + asdl_arg_seq* a; asdl_seq * b; void *c; if ( - (a = _loop1_79_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_79_rule(p)) // lambda_param_no_default+ && (b = _loop0_80_rule(p)) // lambda_param_with_default* && @@ -7392,7 +7402,7 @@ lambda_parameters_rule(Parser *p) // lambda_slash_no_default: // | lambda_param_no_default+ '/' ',' // | lambda_param_no_default+ '/' &':' -static asdl_seq* +static asdl_arg_seq* lambda_slash_no_default_rule(Parser *p) { D(p->level++); @@ -7400,7 +7410,7 @@ lambda_slash_no_default_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_arg_seq* _res = NULL; int _mark = p->mark; { // lambda_param_no_default+ '/' ',' if (p->error_indicator) { @@ -7410,9 +7420,9 @@ lambda_slash_no_default_rule(Parser *p) D(fprintf(stderr, "%*c> lambda_slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ '/' ','")); Token * _literal; Token * _literal_1; - asdl_seq * a; + asdl_arg_seq* a; if ( - (a = _loop1_82_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_82_rule(p)) // lambda_param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -7439,9 +7449,9 @@ lambda_slash_no_default_rule(Parser *p) } D(fprintf(stderr, "%*c> lambda_slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ '/' &':'")); Token * _literal; - asdl_seq * a; + asdl_arg_seq* a; if ( - (a = _loop1_83_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_83_rule(p)) // lambda_param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -7501,7 +7511,7 @@ lambda_slash_with_default_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ lambda_slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' ','")); - _res = _PyPegen_slash_with_default ( p , a , b ); + _res = _PyPegen_slash_with_default ( p , ( asdl_arg_seq * ) a , b ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -7533,7 +7543,7 @@ lambda_slash_with_default_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ lambda_slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' &':'")); - _res = _PyPegen_slash_with_default ( p , a , b ); + _res = _PyPegen_slash_with_default ( p , ( asdl_arg_seq * ) a , b ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -10553,9 +10563,9 @@ slices_rule(Parser *p) D(fprintf(stderr, "%*c> slices[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.slice+ ','?")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - asdl_seq * a; + asdl_expr_seq* a; if ( - (a = _gather_94_rule(p)) // ','.slice+ + (a = (asdl_expr_seq*)_gather_94_rule(p)) // ','.slice+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -11111,7 +11121,7 @@ listcomp_rule(Parser *p) Token * _literal; Token * _literal_1; expr_ty a; - asdl_seq* b; + asdl_comprehension_seq* b; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' && @@ -11336,7 +11346,7 @@ genexp_rule(Parser *p) Token * _literal; Token * _literal_1; expr_ty a; - asdl_seq* b; + asdl_comprehension_seq* b; if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && @@ -11428,7 +11438,7 @@ set_rule(Parser *p) D(fprintf(stderr, "%*c> set[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' expressions_list '}'")); Token * _literal; Token * _literal_1; - asdl_seq* a; + asdl_expr_seq* a; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && @@ -11495,7 +11505,7 @@ setcomp_rule(Parser *p) Token * _literal; Token * _literal_1; expr_ty a; - asdl_seq* b; + asdl_comprehension_seq* b; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && @@ -11653,7 +11663,7 @@ dictcomp_rule(Parser *p) Token * _literal; Token * _literal_1; KeyValuePair* a; - asdl_seq* b; + asdl_comprehension_seq* b; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && @@ -11867,7 +11877,7 @@ kvpair_rule(Parser *p) } // for_if_clauses: for_if_clause+ -static asdl_seq* +static asdl_comprehension_seq* for_if_clauses_rule(Parser *p) { D(p->level++); @@ -11875,7 +11885,7 @@ for_if_clauses_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_comprehension_seq* _res = NULL; int _mark = p->mark; { // for_if_clause+ if (p->error_indicator) { @@ -11883,13 +11893,18 @@ for_if_clauses_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> for_if_clauses[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); - asdl_seq * _loop1_105_var; + asdl_comprehension_seq* a; if ( - (_loop1_105_var = _loop1_105_rule(p)) // for_if_clause+ + (a = (asdl_comprehension_seq*)_loop1_105_rule(p)) // for_if_clause+ ) { D(fprintf(stderr, "%*c+ for_if_clauses[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); - _res = _loop1_105_var; + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } goto done; } p->mark = _mark; @@ -11928,7 +11943,7 @@ for_if_clause_rule(Parser *p) expr_ty a; Token * async_var; expr_ty b; - asdl_seq * c; + asdl_expr_seq* c; if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && @@ -11942,7 +11957,7 @@ for_if_clause_rule(Parser *p) && (b = disjunction_rule(p)) // disjunction && - (c = _loop0_106_rule(p)) // (('if' disjunction))* + (c = (asdl_expr_seq*)_loop0_106_rule(p)) // (('if' disjunction))* ) { D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); @@ -11973,7 +11988,7 @@ for_if_clause_rule(Parser *p) Token * _keyword_1; expr_ty a; expr_ty b; - asdl_seq * c; + asdl_expr_seq* c; if ( (_keyword = _PyPegen_expect_token(p, 517)) // token='for' && @@ -11985,7 +12000,7 @@ for_if_clause_rule(Parser *p) && (b = disjunction_rule(p)) // disjunction && - (c = _loop0_107_rule(p)) // (('if' disjunction))* + (c = (asdl_expr_seq*)_loop0_107_rule(p)) // (('if' disjunction))* ) { D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); @@ -12228,10 +12243,10 @@ args_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> args[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); - asdl_seq * a; + asdl_expr_seq* a; void *b; if ( - (a = _gather_108_rule(p)) // ','.(starred_expression | named_expression !'=')+ + (a = (asdl_expr_seq*)_gather_108_rule(p)) // ','.(starred_expression | named_expression !'=')+ && (b = _tmp_110_rule(p), 1) // [',' kwargs] ) @@ -12768,7 +12783,7 @@ star_targets_rule(Parser *p) } // star_targets_seq: ','.star_target+ ','? -static asdl_seq* +static asdl_expr_seq* star_targets_seq_rule(Parser *p) { D(p->level++); @@ -12776,7 +12791,7 @@ star_targets_seq_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_expr_seq* _res = NULL; int _mark = p->mark; { // ','.star_target+ ','? if (p->error_indicator) { @@ -12786,9 +12801,9 @@ star_targets_seq_rule(Parser *p) D(fprintf(stderr, "%*c> star_targets_seq[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.star_target+ ','?")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - asdl_seq * a; + asdl_expr_seq* a; if ( - (a = _gather_120_rule(p)) // ','.star_target+ + (a = (asdl_expr_seq*)_gather_120_rule(p)) // ','.star_target+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -13353,7 +13368,7 @@ single_subscript_attribute_target_rule(Parser *p) } // del_targets: ','.del_target+ ','? -static asdl_seq* +static asdl_expr_seq* del_targets_rule(Parser *p) { D(p->level++); @@ -13361,7 +13376,7 @@ del_targets_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_expr_seq* _res = NULL; int _mark = p->mark; { // ','.del_target+ ','? if (p->error_indicator) { @@ -13371,9 +13386,9 @@ del_targets_rule(Parser *p) D(fprintf(stderr, "%*c> del_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.del_target+ ','?")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - asdl_seq * a; + asdl_expr_seq* a; if ( - (a = _gather_123_rule(p)) // ','.del_target+ + (a = (asdl_expr_seq*)_gather_123_rule(p)) // ','.del_target+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -13694,7 +13709,7 @@ del_t_atom_rule(Parser *p) } // targets: ','.target+ ','? -static asdl_seq* +static asdl_expr_seq* targets_rule(Parser *p) { D(p->level++); @@ -13702,7 +13717,7 @@ targets_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq* _res = NULL; + asdl_expr_seq* _res = NULL; int _mark = p->mark; { // ','.target+ ','? if (p->error_indicator) { @@ -13712,9 +13727,9 @@ targets_rule(Parser *p) D(fprintf(stderr, "%*c> targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.target+ ','?")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - asdl_seq * a; + asdl_expr_seq* a; if ( - (a = _gather_125_rule(p)) // ','.target+ + (a = (asdl_expr_seq*)_gather_125_rule(p)) // ','.target+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -14418,7 +14433,7 @@ incorrect_arguments_rule(Parser *p) void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty a; - asdl_seq* for_if_clauses_var; + asdl_comprehension_seq* for_if_clauses_var; if ( (a = expression_rule(p)) // expression && @@ -14449,7 +14464,7 @@ incorrect_arguments_rule(Parser *p) } D(fprintf(stderr, "%*c> incorrect_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args for_if_clauses")); expr_ty a; - asdl_seq* for_if_clauses_var; + asdl_comprehension_seq* for_if_clauses_var; if ( (a = args_rule(p)) // args && @@ -14478,7 +14493,7 @@ incorrect_arguments_rule(Parser *p) Token * _literal; expr_ty a; expr_ty args_var; - asdl_seq* for_if_clauses_var; + asdl_comprehension_seq* for_if_clauses_var; if ( (args_var = args_rule(p)) // args && @@ -15029,7 +15044,7 @@ invalid_comprehension_rule(Parser *p) D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); void *_tmp_132_var; expr_ty a; - asdl_seq* for_if_clauses_var; + asdl_comprehension_seq* for_if_clauses_var; if ( (_tmp_132_var = _tmp_132_rule(p)) // '[' | '(' | '{' && @@ -15078,7 +15093,7 @@ invalid_dict_comprehension_rule(Parser *p) Token * _literal_1; Token * a; expr_ty bitwise_or_var; - asdl_seq* for_if_clauses_var; + asdl_comprehension_seq* for_if_clauses_var; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && @@ -15537,7 +15552,7 @@ invalid_import_from_targets_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_names ','")); Token * _literal; - asdl_seq* import_from_as_names_var; + asdl_alias_seq* import_from_as_names_var; if ( (import_from_as_names_var = import_from_as_names_rule(p)) // import_from_as_names && @@ -15614,7 +15629,7 @@ _loop0_1_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_1[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -15622,7 +15637,7 @@ _loop0_1_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_1_type, _seq); D(p->level--); @@ -15680,7 +15695,7 @@ _loop0_2_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_2[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -15688,7 +15703,7 @@ _loop0_2_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_2_type, _seq); D(p->level--); @@ -15755,7 +15770,7 @@ _loop0_4_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_4[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -15763,7 +15778,7 @@ _loop0_4_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_4_type, _seq); D(p->level--); @@ -15869,7 +15884,7 @@ _loop0_6_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_6[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -15877,7 +15892,7 @@ _loop0_6_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_6_type, _seq); D(p->level--); @@ -15983,7 +15998,7 @@ _loop0_8_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_8[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -15991,7 +16006,7 @@ _loop0_8_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_8_type, _seq); D(p->level--); @@ -16097,7 +16112,7 @@ _loop0_10_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_10[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -16105,7 +16120,7 @@ _loop0_10_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_10_type, _seq); D(p->level--); @@ -16178,7 +16193,7 @@ _loop1_11_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement")); - asdl_seq* statement_var; + asdl_stmt_seq* statement_var; while ( (statement_var = statement_rule(p)) // statement ) @@ -16207,7 +16222,7 @@ _loop1_11_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -16215,7 +16230,7 @@ _loop1_11_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_11_type, _seq); D(p->level--); @@ -16282,7 +16297,7 @@ _loop0_13_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_13[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';' small_stmt")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -16290,7 +16305,7 @@ _loop0_13_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_13_type, _seq); D(p->level--); @@ -16840,7 +16855,7 @@ _loop1_22_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -16848,7 +16863,7 @@ _loop1_22_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_22_type, _seq); D(p->level--); @@ -17025,7 +17040,7 @@ _loop0_26_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_26[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -17033,7 +17048,7 @@ _loop0_26_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_26_type, _seq); D(p->level--); @@ -17139,7 +17154,7 @@ _loop0_28_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_28[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -17147,7 +17162,7 @@ _loop0_28_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_28_type, _seq); D(p->level--); @@ -17343,7 +17358,7 @@ _loop0_31_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_31[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -17351,7 +17366,7 @@ _loop0_31_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_31_type, _seq); D(p->level--); @@ -17414,7 +17429,7 @@ _loop1_32_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -17422,7 +17437,7 @@ _loop1_32_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_32_type, _seq); D(p->level--); @@ -17489,7 +17504,7 @@ _loop0_34_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_34[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' import_from_as_name")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -17497,7 +17512,7 @@ _loop0_34_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_34_type, _seq); D(p->level--); @@ -17647,7 +17662,7 @@ _loop0_37_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_37[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_as_name")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -17655,7 +17670,7 @@ _loop0_37_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_37_type, _seq); D(p->level--); @@ -17805,7 +17820,7 @@ _loop0_40_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_40[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -17813,7 +17828,7 @@ _loop0_40_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_40_type, _seq); D(p->level--); @@ -17919,7 +17934,7 @@ _loop0_42_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_42[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -17927,7 +17942,7 @@ _loop0_42_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_42_type, _seq); D(p->level--); @@ -18033,7 +18048,7 @@ _loop0_44_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_44[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -18041,7 +18056,7 @@ _loop0_44_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_44_type, _seq); D(p->level--); @@ -18147,7 +18162,7 @@ _loop0_46_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_46[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -18155,7 +18170,7 @@ _loop0_46_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_46_type, _seq); D(p->level--); @@ -18331,7 +18346,7 @@ _loop1_48_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -18339,7 +18354,7 @@ _loop1_48_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_48_type, _seq); D(p->level--); @@ -18612,7 +18627,7 @@ _loop0_54_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_54[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -18620,7 +18635,7 @@ _loop0_54_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_54_type, _seq); D(p->level--); @@ -18678,7 +18693,7 @@ _loop0_55_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_55[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -18686,7 +18701,7 @@ _loop0_55_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_55_type, _seq); D(p->level--); @@ -18744,7 +18759,7 @@ _loop0_56_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_56[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -18752,7 +18767,7 @@ _loop0_56_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_56_type, _seq); D(p->level--); @@ -18815,7 +18830,7 @@ _loop1_57_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -18823,7 +18838,7 @@ _loop1_57_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_57_type, _seq); D(p->level--); @@ -18881,7 +18896,7 @@ _loop0_58_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_58[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -18889,7 +18904,7 @@ _loop0_58_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_58_type, _seq); D(p->level--); @@ -18952,7 +18967,7 @@ _loop1_59_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -18960,7 +18975,7 @@ _loop1_59_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_59_type, _seq); D(p->level--); @@ -19023,7 +19038,7 @@ _loop1_60_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19031,7 +19046,7 @@ _loop1_60_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_60_type, _seq); D(p->level--); @@ -19094,7 +19109,7 @@ _loop1_61_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19102,7 +19117,7 @@ _loop1_61_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_61_type, _seq); D(p->level--); @@ -19160,7 +19175,7 @@ _loop0_62_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_62[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19168,7 +19183,7 @@ _loop0_62_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_62_type, _seq); D(p->level--); @@ -19231,7 +19246,7 @@ _loop1_63_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19239,7 +19254,7 @@ _loop1_63_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_63_type, _seq); D(p->level--); @@ -19297,7 +19312,7 @@ _loop0_64_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_64[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19305,7 +19320,7 @@ _loop0_64_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_64_type, _seq); D(p->level--); @@ -19368,7 +19383,7 @@ _loop1_65_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19376,7 +19391,7 @@ _loop1_65_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_65_type, _seq); D(p->level--); @@ -19434,7 +19449,7 @@ _loop0_66_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_66[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19442,7 +19457,7 @@ _loop0_66_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_66_type, _seq); D(p->level--); @@ -19505,7 +19520,7 @@ _loop1_67_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19513,7 +19528,7 @@ _loop1_67_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_67_type, _seq); D(p->level--); @@ -19576,7 +19591,7 @@ _loop1_68_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19584,7 +19599,7 @@ _loop1_68_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_68_type, _seq); D(p->level--); @@ -19698,7 +19713,7 @@ _loop0_71_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_71[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19706,7 +19721,7 @@ _loop0_71_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_71_type, _seq); D(p->level--); @@ -19808,7 +19823,7 @@ _loop1_72_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19816,7 +19831,7 @@ _loop1_72_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_72_type, _seq); D(p->level--); @@ -19883,7 +19898,7 @@ _loop0_74_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_74[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -19891,7 +19906,7 @@ _loop0_74_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_74_type, _seq); D(p->level--); @@ -19993,7 +20008,7 @@ _loop1_75_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20001,7 +20016,7 @@ _loop1_75_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_75_type, _seq); D(p->level--); @@ -20059,7 +20074,7 @@ _loop0_76_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_76[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20067,7 +20082,7 @@ _loop0_76_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_76_type, _seq); D(p->level--); @@ -20125,7 +20140,7 @@ _loop0_77_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_77[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20133,7 +20148,7 @@ _loop0_77_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_77_type, _seq); D(p->level--); @@ -20191,7 +20206,7 @@ _loop0_78_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_78[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20199,7 +20214,7 @@ _loop0_78_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_78_type, _seq); D(p->level--); @@ -20262,7 +20277,7 @@ _loop1_79_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20270,7 +20285,7 @@ _loop1_79_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_79_type, _seq); D(p->level--); @@ -20328,7 +20343,7 @@ _loop0_80_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_80[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20336,7 +20351,7 @@ _loop0_80_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_80_type, _seq); D(p->level--); @@ -20399,7 +20414,7 @@ _loop1_81_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20407,7 +20422,7 @@ _loop1_81_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_81_type, _seq); D(p->level--); @@ -20470,7 +20485,7 @@ _loop1_82_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20478,7 +20493,7 @@ _loop1_82_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_82_type, _seq); D(p->level--); @@ -20541,7 +20556,7 @@ _loop1_83_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20549,7 +20564,7 @@ _loop1_83_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_83_type, _seq); D(p->level--); @@ -20607,7 +20622,7 @@ _loop0_84_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_84[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20615,7 +20630,7 @@ _loop0_84_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_84_type, _seq); D(p->level--); @@ -20678,7 +20693,7 @@ _loop1_85_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20686,7 +20701,7 @@ _loop1_85_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_85_type, _seq); D(p->level--); @@ -20744,7 +20759,7 @@ _loop0_86_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_86[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20752,7 +20767,7 @@ _loop0_86_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_86_type, _seq); D(p->level--); @@ -20815,7 +20830,7 @@ _loop1_87_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20823,7 +20838,7 @@ _loop1_87_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_87_type, _seq); D(p->level--); @@ -20881,7 +20896,7 @@ _loop0_88_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_88[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20889,7 +20904,7 @@ _loop0_88_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_88_type, _seq); D(p->level--); @@ -20952,7 +20967,7 @@ _loop1_89_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -20960,7 +20975,7 @@ _loop1_89_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_89_type, _seq); D(p->level--); @@ -21023,7 +21038,7 @@ _loop1_90_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -21031,7 +21046,7 @@ _loop1_90_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_90_type, _seq); D(p->level--); @@ -21094,7 +21109,7 @@ _loop1_91_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -21102,7 +21117,7 @@ _loop1_91_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_91_type, _seq); D(p->level--); @@ -21165,7 +21180,7 @@ _loop1_92_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -21173,7 +21188,7 @@ _loop1_92_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_92_type, _seq); D(p->level--); @@ -21281,7 +21296,7 @@ _loop0_95_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' slice")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -21289,7 +21304,7 @@ _loop0_95_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_95_type, _seq); D(p->level--); @@ -21657,7 +21672,7 @@ _loop1_100_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -21665,7 +21680,7 @@ _loop1_100_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_100_type, _seq); D(p->level--); @@ -21834,7 +21849,7 @@ _loop0_104_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_104[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -21842,7 +21857,7 @@ _loop0_104_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_104_type, _seq); D(p->level--); @@ -21944,7 +21959,7 @@ _loop1_105_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -21952,7 +21967,7 @@ _loop1_105_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_105_type, _seq); D(p->level--); @@ -22010,7 +22025,7 @@ _loop0_106_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_106[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -22018,7 +22033,7 @@ _loop0_106_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_106_type, _seq); D(p->level--); @@ -22076,7 +22091,7 @@ _loop0_107_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_107[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -22084,7 +22099,7 @@ _loop0_107_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_107_type, _seq); D(p->level--); @@ -22151,7 +22166,7 @@ _loop0_109_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_109[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | named_expression !'=')")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -22159,7 +22174,7 @@ _loop0_109_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_109_type, _seq); D(p->level--); @@ -22309,7 +22324,7 @@ _loop0_112_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_112[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -22317,7 +22332,7 @@ _loop0_112_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_112_type, _seq); D(p->level--); @@ -22423,7 +22438,7 @@ _loop0_114_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_114[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -22431,7 +22446,7 @@ _loop0_114_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_114_type, _seq); D(p->level--); @@ -22537,7 +22552,7 @@ _loop0_116_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_116[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -22545,7 +22560,7 @@ _loop0_116_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_116_type, _seq); D(p->level--); @@ -22651,7 +22666,7 @@ _loop0_118_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_118[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -22659,7 +22674,7 @@ _loop0_118_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_118_type, _seq); D(p->level--); @@ -22756,7 +22771,7 @@ _loop0_119_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_119[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -22764,7 +22779,7 @@ _loop0_119_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_119_type, _seq); D(p->level--); @@ -22831,7 +22846,7 @@ _loop0_121_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_121[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -22839,7 +22854,7 @@ _loop0_121_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_121_type, _seq); D(p->level--); @@ -22983,7 +22998,7 @@ _loop0_124_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_124[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' del_target")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -22991,7 +23006,7 @@ _loop0_124_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_124_type, _seq); D(p->level--); @@ -23097,7 +23112,7 @@ _loop0_126_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_126[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' target")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -23105,7 +23120,7 @@ _loop0_126_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_126_type, _seq); D(p->level--); @@ -23188,7 +23203,7 @@ _tmp_127_rule(Parser *p) } D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); expr_ty expression_var; - asdl_seq* for_if_clauses_var; + asdl_comprehension_seq* for_if_clauses_var; if ( (expression_var = expression_rule(p)) // expression && @@ -23236,7 +23251,7 @@ _loop0_128_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); - asdl_seq* star_named_expressions_var; + asdl_expr_seq* star_named_expressions_var; while ( (star_named_expressions_var = star_named_expressions_rule(p)) // star_named_expressions ) @@ -23260,7 +23275,7 @@ _loop0_128_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_128[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -23268,7 +23283,7 @@ _loop0_128_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_128_type, _seq); D(p->level--); @@ -23326,7 +23341,7 @@ _loop0_129_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_129[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -23334,7 +23349,7 @@ _loop0_129_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_129_type, _seq); D(p->level--); @@ -23392,7 +23407,7 @@ _loop0_130_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_130[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -23400,7 +23415,7 @@ _loop0_130_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_130_type, _seq); D(p->level--); @@ -23587,7 +23602,7 @@ _loop0_133_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_133[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -23595,7 +23610,7 @@ _loop0_133_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_133_type, _seq); D(p->level--); @@ -23708,7 +23723,7 @@ _loop0_135_rule(Parser *p) D(fprintf(stderr, "%*c%s _loop0_135[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -23716,7 +23731,7 @@ _loop0_135_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop0_135_type, _seq); D(p->level--); @@ -24594,7 +24609,7 @@ _loop1_153_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -24602,7 +24617,7 @@ _loop1_153_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_153_type, _seq); D(p->level--); @@ -24665,7 +24680,7 @@ _loop1_154_rule(Parser *p) D(p->level--); return NULL; } - asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); p->error_indicator = 1; @@ -24673,7 +24688,7 @@ _loop1_154_rule(Parser *p) D(p->level--); return NULL; } - for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); _PyPegen_insert_memo(p, _start_mark, _loop1_154_type, _seq); D(p->level--); diff --git a/Parser/pegen.c b/Parser/pegen.c index 4beb2abdd296aa..1de495eaf398e8 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -1243,7 +1243,7 @@ _PyPegen_run_parser_from_string(const char *str, int start_rule, PyObject *filen return result; } -void * +asdl_stmt_seq* _PyPegen_interactive_exit(Parser *p) { if (p->errcode) { @@ -1257,11 +1257,11 @@ asdl_seq * _PyPegen_singleton_seq(Parser *p, void *a) { assert(a != NULL); - asdl_seq *seq = _Py_asdl_seq_new(1, p->arena); + asdl_seq *seq = (asdl_seq*)_Py_asdl_generic_seq_new(1, p->arena); if (!seq) { return NULL; } - asdl_seq_SET(seq, 0, a); + asdl_seq_SET_UNTYPED(seq, 0, a); return seq; } @@ -1274,14 +1274,14 @@ _PyPegen_seq_insert_in_front(Parser *p, void *a, asdl_seq *seq) return _PyPegen_singleton_seq(p, a); } - asdl_seq *new_seq = _Py_asdl_seq_new(asdl_seq_LEN(seq) + 1, p->arena); + asdl_seq *new_seq = (asdl_seq*)_Py_asdl_generic_seq_new(asdl_seq_LEN(seq) + 1, p->arena); if (!new_seq) { return NULL; } - asdl_seq_SET(new_seq, 0, a); + asdl_seq_SET_UNTYPED(new_seq, 0, a); for (Py_ssize_t i = 1, l = asdl_seq_LEN(new_seq); i < l; i++) { - asdl_seq_SET(new_seq, i, asdl_seq_GET(seq, i - 1)); + asdl_seq_SET_UNTYPED(new_seq, i, asdl_seq_GET_UNTYPED(seq, i - 1)); } return new_seq; } @@ -1295,15 +1295,15 @@ _PyPegen_seq_append_to_end(Parser *p, asdl_seq *seq, void *a) return _PyPegen_singleton_seq(p, a); } - asdl_seq *new_seq = _Py_asdl_seq_new(asdl_seq_LEN(seq) + 1, p->arena); + asdl_seq *new_seq = (asdl_seq*)_Py_asdl_generic_seq_new(asdl_seq_LEN(seq) + 1, p->arena); if (!new_seq) { return NULL; } for (Py_ssize_t i = 0, l = asdl_seq_LEN(new_seq); i + 1 < l; i++) { - asdl_seq_SET(new_seq, i, asdl_seq_GET(seq, i)); + asdl_seq_SET_UNTYPED(new_seq, i, asdl_seq_GET_UNTYPED(seq, i)); } - asdl_seq_SET(new_seq, asdl_seq_LEN(new_seq) - 1, a); + asdl_seq_SET_UNTYPED(new_seq, asdl_seq_LEN(new_seq) - 1, a); return new_seq; } @@ -1312,7 +1312,7 @@ _get_flattened_seq_size(asdl_seq *seqs) { Py_ssize_t size = 0; for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) { - asdl_seq *inner_seq = asdl_seq_GET(seqs, i); + asdl_seq *inner_seq = asdl_seq_GET_UNTYPED(seqs, i); size += asdl_seq_LEN(inner_seq); } return size; @@ -1325,16 +1325,16 @@ _PyPegen_seq_flatten(Parser *p, asdl_seq *seqs) Py_ssize_t flattened_seq_size = _get_flattened_seq_size(seqs); assert(flattened_seq_size > 0); - asdl_seq *flattened_seq = _Py_asdl_seq_new(flattened_seq_size, p->arena); + asdl_seq *flattened_seq = (asdl_seq*)_Py_asdl_generic_seq_new(flattened_seq_size, p->arena); if (!flattened_seq) { return NULL; } int flattened_seq_idx = 0; for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) { - asdl_seq *inner_seq = asdl_seq_GET(seqs, i); + asdl_seq *inner_seq = asdl_seq_GET_UNTYPED(seqs, i); for (Py_ssize_t j = 0, li = asdl_seq_LEN(inner_seq); j < li; j++) { - asdl_seq_SET(flattened_seq, flattened_seq_idx++, asdl_seq_GET(inner_seq, j)); + asdl_seq_SET_UNTYPED(flattened_seq, flattened_seq_idx++, asdl_seq_GET_UNTYPED(inner_seq, j)); } } assert(flattened_seq_idx == flattened_seq_size); @@ -1403,7 +1403,7 @@ _PyPegen_seq_count_dots(asdl_seq *seq) { int number_of_dots = 0; for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) { - Token *current_expr = asdl_seq_GET(seq, i); + Token *current_expr = asdl_seq_GET_UNTYPED(seq, i); switch (current_expr->type) { case ELLIPSIS: number_of_dots += 3; @@ -1435,13 +1435,13 @@ _PyPegen_alias_for_star(Parser *p) } /* Creates a new asdl_seq* with the identifiers of all the names in seq */ -asdl_seq * -_PyPegen_map_names_to_ids(Parser *p, asdl_seq *seq) +asdl_identifier_seq * +_PyPegen_map_names_to_ids(Parser *p, asdl_expr_seq *seq) { Py_ssize_t len = asdl_seq_LEN(seq); assert(len > 0); - asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + asdl_identifier_seq *new_seq = _Py_asdl_identifier_seq_new(len, p->arena); if (!new_seq) { return NULL; } @@ -1477,39 +1477,39 @@ _PyPegen_get_cmpops(Parser *p, asdl_seq *seq) return NULL; } for (Py_ssize_t i = 0; i < len; i++) { - CmpopExprPair *pair = asdl_seq_GET(seq, i); + CmpopExprPair *pair = asdl_seq_GET_UNTYPED(seq, i); asdl_seq_SET(new_seq, i, pair->cmpop); } return new_seq; } -asdl_seq * +asdl_expr_seq * _PyPegen_get_exprs(Parser *p, asdl_seq *seq) { Py_ssize_t len = asdl_seq_LEN(seq); assert(len > 0); - asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); if (!new_seq) { return NULL; } for (Py_ssize_t i = 0; i < len; i++) { - CmpopExprPair *pair = asdl_seq_GET(seq, i); + CmpopExprPair *pair = asdl_seq_GET_UNTYPED(seq, i); asdl_seq_SET(new_seq, i, pair->expr); } return new_seq; } /* Creates an asdl_seq* where all the elements have been changed to have ctx as context */ -static asdl_seq * -_set_seq_context(Parser *p, asdl_seq *seq, expr_context_ty ctx) +static asdl_expr_seq * +_set_seq_context(Parser *p, asdl_expr_seq *seq, expr_context_ty ctx) { Py_ssize_t len = asdl_seq_LEN(seq); if (len == 0) { return NULL; } - asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); if (!new_seq) { return NULL; } @@ -1529,13 +1529,19 @@ _set_name_context(Parser *p, expr_ty e, expr_context_ty ctx) static expr_ty _set_tuple_context(Parser *p, expr_ty e, expr_context_ty ctx) { - return _Py_Tuple(_set_seq_context(p, e->v.Tuple.elts, ctx), ctx, EXTRA_EXPR(e, e)); + return _Py_Tuple( + _set_seq_context(p, e->v.Tuple.elts, ctx), + ctx, + EXTRA_EXPR(e, e)); } static expr_ty _set_list_context(Parser *p, expr_ty e, expr_context_ty ctx) { - return _Py_List(_set_seq_context(p, e->v.List.elts, ctx), ctx, EXTRA_EXPR(e, e)); + return _Py_List( + _set_seq_context(p, e->v.List.elts, ctx), + ctx, + EXTRA_EXPR(e, e)); } static expr_ty @@ -1602,32 +1608,32 @@ _PyPegen_key_value_pair(Parser *p, expr_ty key, expr_ty value) } /* Extracts all keys from an asdl_seq* of KeyValuePair*'s */ -asdl_seq * +asdl_expr_seq * _PyPegen_get_keys(Parser *p, asdl_seq *seq) { Py_ssize_t len = asdl_seq_LEN(seq); - asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); if (!new_seq) { return NULL; } for (Py_ssize_t i = 0; i < len; i++) { - KeyValuePair *pair = asdl_seq_GET(seq, i); + KeyValuePair *pair = asdl_seq_GET_UNTYPED(seq, i); asdl_seq_SET(new_seq, i, pair->key); } return new_seq; } /* Extracts all values from an asdl_seq* of KeyValuePair*'s */ -asdl_seq * +asdl_expr_seq * _PyPegen_get_values(Parser *p, asdl_seq *seq) { Py_ssize_t len = asdl_seq_LEN(seq); - asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); if (!new_seq) { return NULL; } for (Py_ssize_t i = 0; i < len; i++) { - KeyValuePair *pair = asdl_seq_GET(seq, i); + KeyValuePair *pair = asdl_seq_GET_UNTYPED(seq, i); asdl_seq_SET(new_seq, i, pair->value); } return new_seq; @@ -1648,7 +1654,7 @@ _PyPegen_name_default_pair(Parser *p, arg_ty arg, expr_ty value, Token *tc) /* Constructs a SlashWithDefault */ SlashWithDefault * -_PyPegen_slash_with_default(Parser *p, asdl_seq *plain_names, asdl_seq *names_with_defaults) +_PyPegen_slash_with_default(Parser *p, asdl_arg_seq *plain_names, asdl_seq *names_with_defaults) { SlashWithDefault *a = PyArena_Malloc(p->arena, sizeof(SlashWithDefault)); if (!a) { @@ -1678,47 +1684,47 @@ _PyPegen_join_sequences(Parser *p, asdl_seq *a, asdl_seq *b) { Py_ssize_t first_len = asdl_seq_LEN(a); Py_ssize_t second_len = asdl_seq_LEN(b); - asdl_seq *new_seq = _Py_asdl_seq_new(first_len + second_len, p->arena); + asdl_seq *new_seq = (asdl_seq*)_Py_asdl_generic_seq_new(first_len + second_len, p->arena); if (!new_seq) { return NULL; } int k = 0; for (Py_ssize_t i = 0; i < first_len; i++) { - asdl_seq_SET(new_seq, k++, asdl_seq_GET(a, i)); + asdl_seq_SET_UNTYPED(new_seq, k++, asdl_seq_GET_UNTYPED(a, i)); } for (Py_ssize_t i = 0; i < second_len; i++) { - asdl_seq_SET(new_seq, k++, asdl_seq_GET(b, i)); + asdl_seq_SET_UNTYPED(new_seq, k++, asdl_seq_GET_UNTYPED(b, i)); } return new_seq; } -static asdl_seq * +static asdl_arg_seq* _get_names(Parser *p, asdl_seq *names_with_defaults) { Py_ssize_t len = asdl_seq_LEN(names_with_defaults); - asdl_seq *seq = _Py_asdl_seq_new(len, p->arena); + asdl_arg_seq *seq = _Py_asdl_arg_seq_new(len, p->arena); if (!seq) { return NULL; } for (Py_ssize_t i = 0; i < len; i++) { - NameDefaultPair *pair = asdl_seq_GET(names_with_defaults, i); + NameDefaultPair *pair = asdl_seq_GET_UNTYPED(names_with_defaults, i); asdl_seq_SET(seq, i, pair->arg); } return seq; } -static asdl_seq * +static asdl_expr_seq * _get_defaults(Parser *p, asdl_seq *names_with_defaults) { Py_ssize_t len = asdl_seq_LEN(names_with_defaults); - asdl_seq *seq = _Py_asdl_seq_new(len, p->arena); + asdl_expr_seq *seq = _Py_asdl_expr_seq_new(len, p->arena); if (!seq) { return NULL; } for (Py_ssize_t i = 0; i < len; i++) { - NameDefaultPair *pair = asdl_seq_GET(names_with_defaults, i); + NameDefaultPair *pair = asdl_seq_GET_UNTYPED(names_with_defaults, i); asdl_seq_SET(seq, i, pair->value); } return seq; @@ -1726,39 +1732,45 @@ _get_defaults(Parser *p, asdl_seq *names_with_defaults) /* Constructs an arguments_ty object out of all the parsed constructs in the parameters rule */ arguments_ty -_PyPegen_make_arguments(Parser *p, asdl_seq *slash_without_default, - SlashWithDefault *slash_with_default, asdl_seq *plain_names, +_PyPegen_make_arguments(Parser *p, asdl_arg_seq *slash_without_default, + SlashWithDefault *slash_with_default, asdl_arg_seq *plain_names, asdl_seq *names_with_default, StarEtc *star_etc) { - asdl_seq *posonlyargs; + asdl_arg_seq *posonlyargs; if (slash_without_default != NULL) { posonlyargs = slash_without_default; } else if (slash_with_default != NULL) { - asdl_seq *slash_with_default_names = + asdl_arg_seq *slash_with_default_names = _get_names(p, slash_with_default->names_with_defaults); if (!slash_with_default_names) { return NULL; } - posonlyargs = _PyPegen_join_sequences(p, slash_with_default->plain_names, slash_with_default_names); + posonlyargs = (asdl_arg_seq*)_PyPegen_join_sequences( + p, + (asdl_seq*)slash_with_default->plain_names, + (asdl_seq*)slash_with_default_names); if (!posonlyargs) { return NULL; } } else { - posonlyargs = _Py_asdl_seq_new(0, p->arena); + posonlyargs = _Py_asdl_arg_seq_new(0, p->arena); if (!posonlyargs) { return NULL; } } - asdl_seq *posargs; + asdl_arg_seq *posargs; if (plain_names != NULL && names_with_default != NULL) { - asdl_seq *names_with_default_names = _get_names(p, names_with_default); + asdl_arg_seq *names_with_default_names = _get_names(p, names_with_default); if (!names_with_default_names) { return NULL; } - posargs = _PyPegen_join_sequences(p, plain_names, names_with_default_names); + posargs = (asdl_arg_seq*)_PyPegen_join_sequences( + p, + (asdl_seq*)plain_names, + (asdl_seq*)names_with_default_names); if (!posargs) { return NULL; } @@ -1773,24 +1785,27 @@ _PyPegen_make_arguments(Parser *p, asdl_seq *slash_without_default, posargs = plain_names; } else { - posargs = _Py_asdl_seq_new(0, p->arena); + posargs = _Py_asdl_arg_seq_new(0, p->arena); if (!posargs) { return NULL; } } - asdl_seq *posdefaults; + asdl_expr_seq *posdefaults; if (slash_with_default != NULL && names_with_default != NULL) { - asdl_seq *slash_with_default_values = + asdl_expr_seq *slash_with_default_values = _get_defaults(p, slash_with_default->names_with_defaults); if (!slash_with_default_values) { return NULL; } - asdl_seq *names_with_default_values = _get_defaults(p, names_with_default); + asdl_expr_seq *names_with_default_values = _get_defaults(p, names_with_default); if (!names_with_default_values) { return NULL; } - posdefaults = _PyPegen_join_sequences(p, slash_with_default_values, names_with_default_values); + posdefaults = (asdl_expr_seq*)_PyPegen_join_sequences( + p, + (asdl_seq*)slash_with_default_values, + (asdl_seq*)names_with_default_values); if (!posdefaults) { return NULL; } @@ -1808,7 +1823,7 @@ _PyPegen_make_arguments(Parser *p, asdl_seq *slash_without_default, } } else { - posdefaults = _Py_asdl_seq_new(0, p->arena); + posdefaults = _Py_asdl_expr_seq_new(0, p->arena); if (!posdefaults) { return NULL; } @@ -1819,7 +1834,7 @@ _PyPegen_make_arguments(Parser *p, asdl_seq *slash_without_default, vararg = star_etc->vararg; } - asdl_seq *kwonlyargs; + asdl_arg_seq *kwonlyargs; if (star_etc != NULL && star_etc->kwonlyargs != NULL) { kwonlyargs = _get_names(p, star_etc->kwonlyargs); if (!kwonlyargs) { @@ -1827,13 +1842,13 @@ _PyPegen_make_arguments(Parser *p, asdl_seq *slash_without_default, } } else { - kwonlyargs = _Py_asdl_seq_new(0, p->arena); + kwonlyargs = _Py_asdl_arg_seq_new(0, p->arena); if (!kwonlyargs) { return NULL; } } - asdl_seq *kwdefaults; + asdl_expr_seq *kwdefaults; if (star_etc != NULL && star_etc->kwonlyargs != NULL) { kwdefaults = _get_defaults(p, star_etc->kwonlyargs); if (!kwdefaults) { @@ -1841,7 +1856,7 @@ _PyPegen_make_arguments(Parser *p, asdl_seq *slash_without_default, } } else { - kwdefaults = _Py_asdl_seq_new(0, p->arena); + kwdefaults = _Py_asdl_expr_seq_new(0, p->arena); if (!kwdefaults) { return NULL; } @@ -1861,23 +1876,23 @@ _PyPegen_make_arguments(Parser *p, asdl_seq *slash_without_default, arguments_ty _PyPegen_empty_arguments(Parser *p) { - asdl_seq *posonlyargs = _Py_asdl_seq_new(0, p->arena); + asdl_arg_seq *posonlyargs = _Py_asdl_arg_seq_new(0, p->arena); if (!posonlyargs) { return NULL; } - asdl_seq *posargs = _Py_asdl_seq_new(0, p->arena); + asdl_arg_seq *posargs = _Py_asdl_arg_seq_new(0, p->arena); if (!posargs) { return NULL; } - asdl_seq *posdefaults = _Py_asdl_seq_new(0, p->arena); + asdl_expr_seq *posdefaults = _Py_asdl_expr_seq_new(0, p->arena); if (!posdefaults) { return NULL; } - asdl_seq *kwonlyargs = _Py_asdl_seq_new(0, p->arena); + asdl_arg_seq *kwonlyargs = _Py_asdl_arg_seq_new(0, p->arena); if (!kwonlyargs) { return NULL; } - asdl_seq *kwdefaults = _Py_asdl_seq_new(0, p->arena); + asdl_expr_seq *kwdefaults = _Py_asdl_expr_seq_new(0, p->arena); if (!kwdefaults) { return NULL; } @@ -1900,7 +1915,7 @@ _PyPegen_augoperator(Parser *p, operator_ty kind) /* Construct a FunctionDef equivalent to function_def, but with decorators */ stmt_ty -_PyPegen_function_def_decorators(Parser *p, asdl_seq *decorators, stmt_ty function_def) +_PyPegen_function_def_decorators(Parser *p, asdl_expr_seq *decorators, stmt_ty function_def) { assert(function_def != NULL); if (function_def->kind == AsyncFunctionDef_kind) { @@ -1922,7 +1937,7 @@ _PyPegen_function_def_decorators(Parser *p, asdl_seq *decorators, stmt_ty functi /* Construct a ClassDef equivalent to class_def, but with decorators */ stmt_ty -_PyPegen_class_def_decorators(Parser *p, asdl_seq *decorators, stmt_ty class_def) +_PyPegen_class_def_decorators(Parser *p, asdl_expr_seq *decorators, stmt_ty class_def) { assert(class_def != NULL); return _Py_ClassDef(class_def->v.ClassDef.name, class_def->v.ClassDef.bases, @@ -1950,7 +1965,7 @@ _seq_number_of_starred_exprs(asdl_seq *seq) { int n = 0; for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) { - KeywordOrStarred *k = asdl_seq_GET(seq, i); + KeywordOrStarred *k = asdl_seq_GET_UNTYPED(seq, i); if (!k->is_keyword) { n++; } @@ -1959,21 +1974,21 @@ _seq_number_of_starred_exprs(asdl_seq *seq) } /* Extract the starred expressions of an asdl_seq* of KeywordOrStarred*s */ -asdl_seq * +asdl_expr_seq * _PyPegen_seq_extract_starred_exprs(Parser *p, asdl_seq *kwargs) { int new_len = _seq_number_of_starred_exprs(kwargs); if (new_len == 0) { return NULL; } - asdl_seq *new_seq = _Py_asdl_seq_new(new_len, p->arena); + asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(new_len, p->arena); if (!new_seq) { return NULL; } int idx = 0; for (Py_ssize_t i = 0, len = asdl_seq_LEN(kwargs); i < len; i++) { - KeywordOrStarred *k = asdl_seq_GET(kwargs, i); + KeywordOrStarred *k = asdl_seq_GET_UNTYPED(kwargs, i); if (!k->is_keyword) { asdl_seq_SET(new_seq, idx++, k->element); } @@ -1982,7 +1997,7 @@ _PyPegen_seq_extract_starred_exprs(Parser *p, asdl_seq *kwargs) } /* Return a new asdl_seq* with only the keywords in kwargs */ -asdl_seq * +asdl_keyword_seq* _PyPegen_seq_delete_starred_exprs(Parser *p, asdl_seq *kwargs) { Py_ssize_t len = asdl_seq_LEN(kwargs); @@ -1990,14 +2005,14 @@ _PyPegen_seq_delete_starred_exprs(Parser *p, asdl_seq *kwargs) if (new_len == 0) { return NULL; } - asdl_seq *new_seq = _Py_asdl_seq_new(new_len, p->arena); + asdl_keyword_seq *new_seq = _Py_asdl_keyword_seq_new(new_len, p->arena); if (!new_seq) { return NULL; } int idx = 0; for (Py_ssize_t i = 0; i < len; i++) { - KeywordOrStarred *k = asdl_seq_GET(kwargs, i); + KeywordOrStarred *k = asdl_seq_GET_UNTYPED(kwargs, i); if (k->is_keyword) { asdl_seq_SET(new_seq, idx++, k->element); } @@ -2011,8 +2026,8 @@ _PyPegen_concatenate_strings(Parser *p, asdl_seq *strings) Py_ssize_t len = asdl_seq_LEN(strings); assert(len > 0); - Token *first = asdl_seq_GET(strings, 0); - Token *last = asdl_seq_GET(strings, len - 1); + Token *first = asdl_seq_GET_UNTYPED(strings, 0); + Token *last = asdl_seq_GET_UNTYPED(strings, len - 1); int bytesmode = 0; PyObject *bytes_str = NULL; @@ -2021,7 +2036,7 @@ _PyPegen_concatenate_strings(Parser *p, asdl_seq *strings) _PyPegen_FstringParser_Init(&state); for (Py_ssize_t i = 0; i < len; i++) { - Token *t = asdl_seq_GET(strings, i); + Token *t = asdl_seq_GET_UNTYPED(strings, i); int this_bytesmode; int this_rawmode; @@ -2095,12 +2110,12 @@ _PyPegen_concatenate_strings(Parser *p, asdl_seq *strings) } mod_ty -_PyPegen_make_module(Parser *p, asdl_seq *a) { - asdl_seq *type_ignores = NULL; +_PyPegen_make_module(Parser *p, asdl_stmt_seq *a) { + asdl_type_ignore_seq *type_ignores = NULL; Py_ssize_t num = p->type_ignore_comments.num_items; if (num > 0) { // Turn the raw (comment, lineno) pairs into TypeIgnore objects in the arena - type_ignores = _Py_asdl_seq_new(num, p->arena); + type_ignores = _Py_asdl_type_ignore_seq_new(num, p->arena); if (type_ignores == NULL) { return NULL; } @@ -2219,7 +2234,7 @@ _PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args) } -expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_seq *a, asdl_seq *b, +expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_expr_seq *a, asdl_seq *b, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { Py_ssize_t args_len = asdl_seq_LEN(a); @@ -2231,14 +2246,14 @@ expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_seq *a, asdl_seq *b, } - asdl_seq *starreds = _PyPegen_seq_extract_starred_exprs(p, b); - asdl_seq *keywords = _PyPegen_seq_delete_starred_exprs(p, b); + asdl_expr_seq *starreds = _PyPegen_seq_extract_starred_exprs(p, b); + asdl_keyword_seq *keywords = _PyPegen_seq_delete_starred_exprs(p, b); if (starreds) { total_len += asdl_seq_LEN(starreds); } - asdl_seq *args = _Py_asdl_seq_new(total_len, arena); + asdl_expr_seq *args = _Py_asdl_expr_seq_new(total_len, arena); Py_ssize_t i = 0; for (i = 0; i < args_len; i++) { @@ -2250,6 +2265,4 @@ expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_seq *a, asdl_seq *b, return _Py_Call(_PyPegen_dummy_name(p), args, keywords, lineno, col_offset, end_lineno, end_col_offset, arena); - - } diff --git a/Parser/pegen.h b/Parser/pegen.h index c81681efad2080..000dc8c462b85c 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -91,7 +91,7 @@ typedef struct { } NameDefaultPair; typedef struct { - asdl_seq *plain_names; + asdl_arg_seq *plain_names; asdl_seq *names_with_defaults; // asdl_seq* of NameDefaultsPair's } SlashWithDefault; @@ -229,7 +229,7 @@ mod_ty _PyPegen_run_parser_from_file_pointer(FILE *, int, PyObject *, const char void *_PyPegen_run_parser(Parser *); mod_ty _PyPegen_run_parser_from_file(const char *, int, PyObject *, PyCompilerFlags *, PyArena *); mod_ty _PyPegen_run_parser_from_string(const char *, int, PyObject *, PyCompilerFlags *, PyArena *); -void *_PyPegen_interactive_exit(Parser *); +asdl_stmt_seq *_PyPegen_interactive_exit(Parser *); asdl_seq *_PyPegen_singleton_seq(Parser *, void *); asdl_seq *_PyPegen_seq_insert_in_front(Parser *, void *, asdl_seq *); asdl_seq *_PyPegen_seq_append_to_end(Parser *, asdl_seq *, void *); @@ -237,33 +237,33 @@ asdl_seq *_PyPegen_seq_flatten(Parser *, asdl_seq *); expr_ty _PyPegen_join_names_with_dot(Parser *, expr_ty, expr_ty); int _PyPegen_seq_count_dots(asdl_seq *); alias_ty _PyPegen_alias_for_star(Parser *); -asdl_seq *_PyPegen_map_names_to_ids(Parser *, asdl_seq *); +asdl_identifier_seq *_PyPegen_map_names_to_ids(Parser *, asdl_expr_seq *); CmpopExprPair *_PyPegen_cmpop_expr_pair(Parser *, cmpop_ty, expr_ty); asdl_int_seq *_PyPegen_get_cmpops(Parser *p, asdl_seq *); -asdl_seq *_PyPegen_get_exprs(Parser *, asdl_seq *); +asdl_expr_seq *_PyPegen_get_exprs(Parser *, asdl_seq *); expr_ty _PyPegen_set_expr_context(Parser *, expr_ty, expr_context_ty); KeyValuePair *_PyPegen_key_value_pair(Parser *, expr_ty, expr_ty); -asdl_seq *_PyPegen_get_keys(Parser *, asdl_seq *); -asdl_seq *_PyPegen_get_values(Parser *, asdl_seq *); +asdl_expr_seq *_PyPegen_get_keys(Parser *, asdl_seq *); +asdl_expr_seq *_PyPegen_get_values(Parser *, asdl_seq *); NameDefaultPair *_PyPegen_name_default_pair(Parser *, arg_ty, expr_ty, Token *); -SlashWithDefault *_PyPegen_slash_with_default(Parser *, asdl_seq *, asdl_seq *); +SlashWithDefault *_PyPegen_slash_with_default(Parser *, asdl_arg_seq *, asdl_seq *); StarEtc *_PyPegen_star_etc(Parser *, arg_ty, asdl_seq *, arg_ty); -arguments_ty _PyPegen_make_arguments(Parser *, asdl_seq *, SlashWithDefault *, - asdl_seq *, asdl_seq *, StarEtc *); +arguments_ty _PyPegen_make_arguments(Parser *, asdl_arg_seq *, SlashWithDefault *, + asdl_arg_seq *, asdl_seq *, StarEtc *); arguments_ty _PyPegen_empty_arguments(Parser *); AugOperator *_PyPegen_augoperator(Parser*, operator_ty type); -stmt_ty _PyPegen_function_def_decorators(Parser *, asdl_seq *, stmt_ty); -stmt_ty _PyPegen_class_def_decorators(Parser *, asdl_seq *, stmt_ty); +stmt_ty _PyPegen_function_def_decorators(Parser *, asdl_expr_seq *, stmt_ty); +stmt_ty _PyPegen_class_def_decorators(Parser *, asdl_expr_seq *, stmt_ty); KeywordOrStarred *_PyPegen_keyword_or_starred(Parser *, void *, int); -asdl_seq *_PyPegen_seq_extract_starred_exprs(Parser *, asdl_seq *); -asdl_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *); -expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_seq *, asdl_seq *, +asdl_expr_seq *_PyPegen_seq_extract_starred_exprs(Parser *, asdl_seq *); +asdl_keyword_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *); +expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_expr_seq *, asdl_seq *, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_seq *); asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *); int _PyPegen_check_barry_as_flufl(Parser *); -mod_ty _PyPegen_make_module(Parser *, asdl_seq *); +mod_ty _PyPegen_make_module(Parser *, asdl_stmt_seq *); // Error reporting helpers typedef enum { diff --git a/Parser/string_parser.c b/Parser/string_parser.c index 2c35da590defbb..1285968b319177 100644 --- a/Parser/string_parser.c +++ b/Parser/string_parser.c @@ -970,15 +970,15 @@ ExprList_Dealloc(ExprList *l) l->size = -1; } -static asdl_seq * +static asdl_expr_seq * ExprList_Finish(ExprList *l, PyArena *arena) { - asdl_seq *seq; + asdl_expr_seq *seq; ExprList_check_invariants(l); /* Allocate the asdl_seq and copy the expressions in to it. */ - seq = _Py_asdl_seq_new(l->size, arena); + seq = _Py_asdl_expr_seq_new(l->size, arena); if (seq) { Py_ssize_t i; for (i = 0; i < l->size; i++) { @@ -1167,7 +1167,7 @@ expr_ty _PyPegen_FstringParser_Finish(Parser *p, FstringParser *state, Token* first_token, Token *last_token) { - asdl_seq *seq; + asdl_expr_seq *seq; FstringParser_check_invariants(state); diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 094010e6c9ddce..13657a67275667 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -549,6 +549,18 @@ static int init_identifiers(astmodulestate *state) return 1; }; +GENERATE_ASDL_SEQ_CONSTRUCTOR(mod, mod_ty) +GENERATE_ASDL_SEQ_CONSTRUCTOR(stmt, stmt_ty) +GENERATE_ASDL_SEQ_CONSTRUCTOR(expr, expr_ty) +GENERATE_ASDL_SEQ_CONSTRUCTOR(comprehension, comprehension_ty) +GENERATE_ASDL_SEQ_CONSTRUCTOR(excepthandler, excepthandler_ty) +GENERATE_ASDL_SEQ_CONSTRUCTOR(arguments, arguments_ty) +GENERATE_ASDL_SEQ_CONSTRUCTOR(arg, arg_ty) +GENERATE_ASDL_SEQ_CONSTRUCTOR(keyword, keyword_ty) +GENERATE_ASDL_SEQ_CONSTRUCTOR(alias, alias_ty) +GENERATE_ASDL_SEQ_CONSTRUCTOR(withitem, withitem_ty) +GENERATE_ASDL_SEQ_CONSTRUCTOR(type_ignore, type_ignore_ty) + static PyObject* ast2obj_mod(astmodulestate *state, void*); static const char * const Module_fields[]={ "body", @@ -1097,7 +1109,7 @@ static PyObject* ast2obj_list(astmodulestate *state, asdl_seq *seq, PyObject* (* if (!result) return NULL; for (i = 0; i < n; i++) { - value = func(state, asdl_seq_GET(seq, i)); + value = func(state, asdl_seq_GET_UNTYPED(seq, i)); if (!value) { Py_DECREF(result); return NULL; @@ -1912,7 +1924,8 @@ static int obj2ast_type_ignore(astmodulestate *state, PyObject* obj, type_ignore_ty* out, PyArena* arena); mod_ty -Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena) +Module(asdl_stmt_seq * body, asdl_type_ignore_seq * type_ignores, PyArena + *arena) { mod_ty p; p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1925,7 +1938,7 @@ Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena) } mod_ty -Interactive(asdl_seq * body, PyArena *arena) +Interactive(asdl_stmt_seq * body, PyArena *arena) { mod_ty p; p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1954,7 +1967,7 @@ Expression(expr_ty body, PyArena *arena) } mod_ty -FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena) +FunctionType(asdl_expr_seq * argtypes, expr_ty returns, PyArena *arena) { mod_ty p; if (!returns) { @@ -1972,9 +1985,10 @@ FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena) } stmt_ty -FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * - decorator_list, expr_ty returns, string type_comment, int lineno, - int col_offset, int end_lineno, int end_col_offset, PyArena *arena) +FunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * body, + asdl_expr_seq * decorator_list, expr_ty returns, string + type_comment, int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena) { stmt_ty p; if (!name) { @@ -2005,10 +2019,10 @@ FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * } stmt_ty -AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq - * decorator_list, expr_ty returns, string type_comment, int - lineno, int col_offset, int end_lineno, int end_col_offset, - PyArena *arena) +AsyncFunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * body, + asdl_expr_seq * decorator_list, expr_ty returns, string + type_comment, int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena) { stmt_ty p; if (!name) { @@ -2039,9 +2053,9 @@ AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq } stmt_ty -ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq * - body, asdl_seq * decorator_list, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena) +ClassDef(identifier name, asdl_expr_seq * bases, asdl_keyword_seq * keywords, + asdl_stmt_seq * body, asdl_expr_seq * decorator_list, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; if (!name) { @@ -2083,7 +2097,7 @@ Return(expr_ty value, int lineno, int col_offset, int end_lineno, int } stmt_ty -Delete(asdl_seq * targets, int lineno, int col_offset, int end_lineno, int +Delete(asdl_expr_seq * targets, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; @@ -2100,8 +2114,8 @@ Delete(asdl_seq * targets, int lineno, int col_offset, int end_lineno, int } stmt_ty -Assign(asdl_seq * targets, expr_ty value, string type_comment, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena *arena) +Assign(asdl_expr_seq * targets, expr_ty value, string type_comment, int lineno, + int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; if (!value) { @@ -2189,8 +2203,8 @@ AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int } stmt_ty -For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, string - type_comment, int lineno, int col_offset, int end_lineno, int +For(expr_ty target, expr_ty iter, asdl_stmt_seq * body, asdl_stmt_seq * orelse, + string type_comment, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; @@ -2221,9 +2235,9 @@ For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, string } stmt_ty -AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, - string type_comment, int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena) +AsyncFor(expr_ty target, expr_ty iter, asdl_stmt_seq * body, asdl_stmt_seq * + orelse, string type_comment, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; if (!target) { @@ -2253,8 +2267,8 @@ AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, } stmt_ty -While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena *arena) +While(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse, int lineno, + int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; if (!test) { @@ -2277,7 +2291,7 @@ While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int } stmt_ty -If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int +If(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; @@ -2301,8 +2315,8 @@ If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int } stmt_ty -With(asdl_seq * items, asdl_seq * body, string type_comment, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena *arena) +With(asdl_withitem_seq * items, asdl_stmt_seq * body, string type_comment, int + lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2320,8 +2334,9 @@ With(asdl_seq * items, asdl_seq * body, string type_comment, int lineno, int } stmt_ty -AsyncWith(asdl_seq * items, asdl_seq * body, string type_comment, int lineno, - int col_offset, int end_lineno, int end_col_offset, PyArena *arena) +AsyncWith(asdl_withitem_seq * items, asdl_stmt_seq * body, string type_comment, + int lineno, int col_offset, int end_lineno, int end_col_offset, + PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2357,9 +2372,9 @@ Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno, } stmt_ty -Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq * - finalbody, int lineno, int col_offset, int end_lineno, int end_col_offset, - PyArena *arena) +Try(asdl_stmt_seq * body, asdl_excepthandler_seq * handlers, asdl_stmt_seq * + orelse, asdl_stmt_seq * finalbody, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2401,7 +2416,7 @@ Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno, } stmt_ty -Import(asdl_seq * names, int lineno, int col_offset, int end_lineno, int +Import(asdl_alias_seq * names, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; @@ -2418,8 +2433,8 @@ Import(asdl_seq * names, int lineno, int col_offset, int end_lineno, int } stmt_ty -ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena *arena) +ImportFrom(identifier module, asdl_alias_seq * names, int level, int lineno, + int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2437,8 +2452,8 @@ ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int } stmt_ty -Global(asdl_seq * names, int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena) +Global(asdl_identifier_seq * names, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2454,8 +2469,8 @@ Global(asdl_seq * names, int lineno, int col_offset, int end_lineno, int } stmt_ty -Nonlocal(asdl_seq * names, int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena) +Nonlocal(asdl_identifier_seq * names, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2541,7 +2556,7 @@ Continue(int lineno, int col_offset, int end_lineno, int end_col_offset, } expr_ty -BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, int +BoolOp(boolop_ty op, asdl_expr_seq * values, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; @@ -2716,8 +2731,8 @@ IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset, } expr_ty -Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena) +Dict(asdl_expr_seq * keys, asdl_expr_seq * values, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2734,7 +2749,7 @@ Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, int } expr_ty -Set(asdl_seq * elts, int lineno, int col_offset, int end_lineno, int +Set(asdl_expr_seq * elts, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; @@ -2751,8 +2766,8 @@ Set(asdl_seq * elts, int lineno, int col_offset, int end_lineno, int } expr_ty -ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena) +ListComp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; if (!elt) { @@ -2774,8 +2789,8 @@ ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int } expr_ty -SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena) +SetComp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; if (!elt) { @@ -2797,8 +2812,9 @@ SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int } expr_ty -DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena *arena) +DictComp(expr_ty key, expr_ty value, asdl_comprehension_seq * generators, int + lineno, int col_offset, int end_lineno, int end_col_offset, PyArena + *arena) { expr_ty p; if (!key) { @@ -2826,8 +2842,8 @@ DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int } expr_ty -GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena) +GeneratorExp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; if (!elt) { @@ -2910,8 +2926,9 @@ YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int } expr_ty -Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno, - int col_offset, int end_lineno, int end_col_offset, PyArena *arena) +Compare(expr_ty left, asdl_int_seq * ops, asdl_expr_seq * comparators, int + lineno, int col_offset, int end_lineno, int end_col_offset, PyArena + *arena) { expr_ty p; if (!left) { @@ -2934,8 +2951,8 @@ Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno, } expr_ty -Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena *arena) +Call(expr_ty func, asdl_expr_seq * args, asdl_keyword_seq * keywords, int + lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; if (!func) { @@ -2983,8 +3000,8 @@ FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno, } expr_ty -JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena) +JoinedStr(asdl_expr_seq * values, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena) { expr_ty p; p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -3147,7 +3164,7 @@ Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int } expr_ty -List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int +List(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; @@ -3170,8 +3187,8 @@ List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int } expr_ty -Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena) +Tuple(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; if (!ctx) { @@ -3212,7 +3229,7 @@ Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int col_offset, } comprehension_ty -comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async, +comprehension(expr_ty target, expr_ty iter, asdl_expr_seq * ifs, int is_async, PyArena *arena) { comprehension_ty p; @@ -3237,8 +3254,9 @@ comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async, } excepthandler_ty -ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena *arena) +ExceptHandler(expr_ty type, identifier name, asdl_stmt_seq * body, int lineno, + int col_offset, int end_lineno, int end_col_offset, PyArena + *arena) { excepthandler_ty p; p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -3256,9 +3274,9 @@ ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int } arguments_ty -arguments(asdl_seq * posonlyargs, asdl_seq * args, arg_ty vararg, asdl_seq * - kwonlyargs, asdl_seq * kw_defaults, arg_ty kwarg, asdl_seq * - defaults, PyArena *arena) +arguments(asdl_arg_seq * posonlyargs, asdl_arg_seq * args, arg_ty vararg, + asdl_arg_seq * kwonlyargs, asdl_expr_seq * kw_defaults, arg_ty kwarg, + asdl_expr_seq * defaults, PyArena *arena) { arguments_ty p; p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -3386,12 +3404,12 @@ ast2obj_mod(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->Module_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.Module.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.Module.body, ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.Module.type_ignores, + value = ast2obj_list(state, (asdl_seq*)o->v.Module.type_ignores, ast2obj_type_ignore); if (!value) goto failed; if (PyObject_SetAttr(result, state->type_ignores, value) == -1) @@ -3402,7 +3420,8 @@ ast2obj_mod(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->Interactive_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.Interactive.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.Interactive.body, + ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; @@ -3422,7 +3441,8 @@ ast2obj_mod(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->FunctionType_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.FunctionType.argtypes, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.FunctionType.argtypes, + ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->argtypes, value) == -1) goto failed; @@ -3465,12 +3485,13 @@ ast2obj_stmt(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.FunctionDef.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.FunctionDef.body, + ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.FunctionDef.decorator_list, + value = ast2obj_list(state, (asdl_seq*)o->v.FunctionDef.decorator_list, ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->decorator_list, value) == -1) @@ -3501,12 +3522,14 @@ ast2obj_stmt(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.AsyncFunctionDef.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFunctionDef.body, + ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.AsyncFunctionDef.decorator_list, + value = ast2obj_list(state, + (asdl_seq*)o->v.AsyncFunctionDef.decorator_list, ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->decorator_list, value) == -1) @@ -3532,22 +3555,26 @@ ast2obj_stmt(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.ClassDef.bases, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.bases, + ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->bases, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.ClassDef.keywords, ast2obj_keyword); + value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.keywords, + ast2obj_keyword); if (!value) goto failed; if (PyObject_SetAttr(result, state->keywords, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.ClassDef.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.body, + ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.ClassDef.decorator_list, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.decorator_list, + ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->decorator_list, value) == -1) goto failed; @@ -3567,7 +3594,8 @@ ast2obj_stmt(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->Delete_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.Delete.targets, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.Delete.targets, + ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->targets, value) == -1) goto failed; @@ -3577,7 +3605,8 @@ ast2obj_stmt(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->Assign_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.Assign.targets, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.Assign.targets, + ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->targets, value) == -1) goto failed; @@ -3652,12 +3681,12 @@ ast2obj_stmt(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->iter, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.For.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.For.body, ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.For.orelse, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.For.orelse, ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; @@ -3682,12 +3711,14 @@ ast2obj_stmt(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->iter, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.AsyncFor.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFor.body, + ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.AsyncFor.orelse, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFor.orelse, + ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; @@ -3707,12 +3738,12 @@ ast2obj_stmt(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->test, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.While.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.While.body, ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.While.orelse, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.While.orelse, ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; @@ -3727,12 +3758,12 @@ ast2obj_stmt(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->test, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.If.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.If.body, ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.If.orelse, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.If.orelse, ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; @@ -3742,12 +3773,13 @@ ast2obj_stmt(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->With_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.With.items, ast2obj_withitem); + value = ast2obj_list(state, (asdl_seq*)o->v.With.items, + ast2obj_withitem); if (!value) goto failed; if (PyObject_SetAttr(result, state->items, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.With.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.With.body, ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; @@ -3762,12 +3794,14 @@ ast2obj_stmt(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->AsyncWith_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.AsyncWith.items, ast2obj_withitem); + value = ast2obj_list(state, (asdl_seq*)o->v.AsyncWith.items, + ast2obj_withitem); if (!value) goto failed; if (PyObject_SetAttr(result, state->items, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.AsyncWith.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.AsyncWith.body, + ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; @@ -3797,22 +3831,24 @@ ast2obj_stmt(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->Try_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.Try.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.Try.body, ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.Try.handlers, ast2obj_excepthandler); + value = ast2obj_list(state, (asdl_seq*)o->v.Try.handlers, + ast2obj_excepthandler); if (!value) goto failed; if (PyObject_SetAttr(result, state->handlers, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.Try.orelse, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.Try.orelse, ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.Try.finalbody, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.Try.finalbody, + ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->finalbody, value) == -1) goto failed; @@ -3837,7 +3873,8 @@ ast2obj_stmt(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->Import_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.Import.names, ast2obj_alias); + value = ast2obj_list(state, (asdl_seq*)o->v.Import.names, + ast2obj_alias); if (!value) goto failed; if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; @@ -3852,7 +3889,8 @@ ast2obj_stmt(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->module, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.ImportFrom.names, ast2obj_alias); + value = ast2obj_list(state, (asdl_seq*)o->v.ImportFrom.names, + ast2obj_alias); if (!value) goto failed; if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; @@ -3867,7 +3905,8 @@ ast2obj_stmt(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->Global_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.Global.names, ast2obj_identifier); + value = ast2obj_list(state, (asdl_seq*)o->v.Global.names, + ast2obj_identifier); if (!value) goto failed; if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; @@ -3877,7 +3916,8 @@ ast2obj_stmt(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->Nonlocal_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.Nonlocal.names, ast2obj_identifier); + value = ast2obj_list(state, (asdl_seq*)o->v.Nonlocal.names, + ast2obj_identifier); if (!value) goto failed; if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; @@ -3955,7 +3995,8 @@ ast2obj_expr(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->op, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.BoolOp.values, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.BoolOp.values, + ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->values, value) == -1) goto failed; @@ -4050,12 +4091,12 @@ ast2obj_expr(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->Dict_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.Dict.keys, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.Dict.keys, ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->keys, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.Dict.values, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.Dict.values, ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->values, value) == -1) goto failed; @@ -4065,7 +4106,7 @@ ast2obj_expr(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->Set_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.Set.elts, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.Set.elts, ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->elts, value) == -1) goto failed; @@ -4080,7 +4121,7 @@ ast2obj_expr(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->elt, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.ListComp.generators, + value = ast2obj_list(state, (asdl_seq*)o->v.ListComp.generators, ast2obj_comprehension); if (!value) goto failed; if (PyObject_SetAttr(result, state->generators, value) == -1) @@ -4096,7 +4137,7 @@ ast2obj_expr(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->elt, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.SetComp.generators, + value = ast2obj_list(state, (asdl_seq*)o->v.SetComp.generators, ast2obj_comprehension); if (!value) goto failed; if (PyObject_SetAttr(result, state->generators, value) == -1) @@ -4117,7 +4158,7 @@ ast2obj_expr(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.DictComp.generators, + value = ast2obj_list(state, (asdl_seq*)o->v.DictComp.generators, ast2obj_comprehension); if (!value) goto failed; if (PyObject_SetAttr(result, state->generators, value) == -1) @@ -4133,7 +4174,7 @@ ast2obj_expr(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->elt, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.GeneratorExp.generators, + value = ast2obj_list(state, (asdl_seq*)o->v.GeneratorExp.generators, ast2obj_comprehension); if (!value) goto failed; if (PyObject_SetAttr(result, state->generators, value) == -1) @@ -4190,7 +4231,8 @@ ast2obj_expr(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->ops, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.Compare.comparators, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.Compare.comparators, + ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->comparators, value) == -1) goto failed; @@ -4205,12 +4247,13 @@ ast2obj_expr(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->func, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.Call.args, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.Call.args, ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.Call.keywords, ast2obj_keyword); + value = ast2obj_list(state, (asdl_seq*)o->v.Call.keywords, + ast2obj_keyword); if (!value) goto failed; if (PyObject_SetAttr(result, state->keywords, value) == -1) goto failed; @@ -4240,7 +4283,8 @@ ast2obj_expr(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->JoinedStr_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.JoinedStr.values, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.JoinedStr.values, + ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->values, value) == -1) goto failed; @@ -4335,7 +4379,7 @@ ast2obj_expr(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->List_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.List.elts, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.List.elts, ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->elts, value) == -1) goto failed; @@ -4350,7 +4394,7 @@ ast2obj_expr(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->Tuple_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(state, o->v.Tuple.elts, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->v.Tuple.elts, ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->elts, value) == -1) goto failed; @@ -4557,7 +4601,7 @@ ast2obj_comprehension(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->iter, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->ifs, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->ifs, ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->ifs, value) == -1) goto failed; @@ -4598,7 +4642,8 @@ ast2obj_excepthandler(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->v.ExceptHandler.body, ast2obj_stmt); + value = ast2obj_list(state, (asdl_seq*)o->v.ExceptHandler.body, + ast2obj_stmt); if (!value) goto failed; if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; @@ -4644,12 +4689,12 @@ ast2obj_arguments(astmodulestate *state, void* _o) tp = (PyTypeObject *)state->arguments_type; result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_list(state, o->posonlyargs, ast2obj_arg); + value = ast2obj_list(state, (asdl_seq*)o->posonlyargs, ast2obj_arg); if (!value) goto failed; if (PyObject_SetAttr(result, state->posonlyargs, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->args, ast2obj_arg); + value = ast2obj_list(state, (asdl_seq*)o->args, ast2obj_arg); if (!value) goto failed; if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; @@ -4659,12 +4704,12 @@ ast2obj_arguments(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->vararg, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->kwonlyargs, ast2obj_arg); + value = ast2obj_list(state, (asdl_seq*)o->kwonlyargs, ast2obj_arg); if (!value) goto failed; if (PyObject_SetAttr(result, state->kwonlyargs, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->kw_defaults, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->kw_defaults, ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->kw_defaults, value) == -1) goto failed; @@ -4674,7 +4719,7 @@ ast2obj_arguments(astmodulestate *state, void* _o) if (PyObject_SetAttr(result, state->kwarg, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(state, o->defaults, ast2obj_expr); + value = ast2obj_list(state, (asdl_seq*)o->defaults, ast2obj_expr); if (!value) goto failed; if (PyObject_SetAttr(result, state->defaults, value) == -1) goto failed; @@ -4899,8 +4944,8 @@ obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* body; - asdl_seq* type_ignores; + asdl_stmt_seq* body; + asdl_type_ignore_seq* type_ignores; if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; @@ -4918,7 +4963,7 @@ obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -4951,7 +4996,7 @@ obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - type_ignores = _Py_asdl_seq_new(len, arena); + type_ignores = _Py_asdl_type_ignore_seq_new(len, arena); if (type_ignores == NULL) goto failed; for (i = 0; i < len; i++) { type_ignore_ty val; @@ -4978,7 +5023,7 @@ obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* body; + asdl_stmt_seq* body; if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; @@ -4996,7 +5041,7 @@ obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -5048,7 +5093,7 @@ obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* argtypes; + asdl_expr_seq* argtypes; expr_ty returns; if (_PyObject_LookupAttr(obj, state->argtypes, &tmp) < 0) { @@ -5067,7 +5112,7 @@ obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - argtypes = _Py_asdl_seq_new(len, arena); + argtypes = _Py_asdl_expr_seq_new(len, arena); if (argtypes == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -5184,8 +5229,8 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) if (isinstance) { identifier name; arguments_ty args; - asdl_seq* body; - asdl_seq* decorator_list; + asdl_stmt_seq* body; + asdl_expr_seq* decorator_list; expr_ty returns; string type_comment; @@ -5231,7 +5276,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -5264,7 +5309,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - decorator_list = _Py_asdl_seq_new(len, arena); + decorator_list = _Py_asdl_expr_seq_new(len, arena); if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -5321,8 +5366,8 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) if (isinstance) { identifier name; arguments_ty args; - asdl_seq* body; - asdl_seq* decorator_list; + asdl_stmt_seq* body; + asdl_expr_seq* decorator_list; expr_ty returns; string type_comment; @@ -5368,7 +5413,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -5401,7 +5446,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - decorator_list = _Py_asdl_seq_new(len, arena); + decorator_list = _Py_asdl_expr_seq_new(len, arena); if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -5457,10 +5502,10 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) } if (isinstance) { identifier name; - asdl_seq* bases; - asdl_seq* keywords; - asdl_seq* body; - asdl_seq* decorator_list; + asdl_expr_seq* bases; + asdl_keyword_seq* keywords; + asdl_stmt_seq* body; + asdl_expr_seq* decorator_list; if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) { return 1; @@ -5491,7 +5536,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - bases = _Py_asdl_seq_new(len, arena); + bases = _Py_asdl_expr_seq_new(len, arena); if (bases == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -5524,7 +5569,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - keywords = _Py_asdl_seq_new(len, arena); + keywords = _Py_asdl_keyword_seq_new(len, arena); if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty val; @@ -5557,7 +5602,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -5590,7 +5635,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - decorator_list = _Py_asdl_seq_new(len, arena); + decorator_list = _Py_asdl_expr_seq_new(len, arena); if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -5644,7 +5689,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* targets; + asdl_expr_seq* targets; if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) { return 1; @@ -5662,7 +5707,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - targets = _Py_asdl_seq_new(len, arena); + targets = _Py_asdl_expr_seq_new(len, arena); if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -5690,7 +5735,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* targets; + asdl_expr_seq* targets; expr_ty value; string type_comment; @@ -5710,7 +5755,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - targets = _Py_asdl_seq_new(len, arena); + targets = _Py_asdl_expr_seq_new(len, arena); if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -5888,8 +5933,8 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) if (isinstance) { expr_ty target; expr_ty iter; - asdl_seq* body; - asdl_seq* orelse; + asdl_stmt_seq* body; + asdl_stmt_seq* orelse; string type_comment; if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { @@ -5934,7 +5979,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -5967,7 +6012,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - orelse = _Py_asdl_seq_new(len, arena); + orelse = _Py_asdl_stmt_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6010,8 +6055,8 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) if (isinstance) { expr_ty target; expr_ty iter; - asdl_seq* body; - asdl_seq* orelse; + asdl_stmt_seq* body; + asdl_stmt_seq* orelse; string type_comment; if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { @@ -6056,7 +6101,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6089,7 +6134,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - orelse = _Py_asdl_seq_new(len, arena); + orelse = _Py_asdl_stmt_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6131,8 +6176,8 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) } if (isinstance) { expr_ty test; - asdl_seq* body; - asdl_seq* orelse; + asdl_stmt_seq* body; + asdl_stmt_seq* orelse; if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) { return 1; @@ -6163,7 +6208,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6196,7 +6241,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - orelse = _Py_asdl_seq_new(len, arena); + orelse = _Py_asdl_stmt_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6225,8 +6270,8 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) } if (isinstance) { expr_ty test; - asdl_seq* body; - asdl_seq* orelse; + asdl_stmt_seq* body; + asdl_stmt_seq* orelse; if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) { return 1; @@ -6257,7 +6302,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6290,7 +6335,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - orelse = _Py_asdl_seq_new(len, arena); + orelse = _Py_asdl_stmt_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6318,8 +6363,8 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* items; - asdl_seq* body; + asdl_withitem_seq* items; + asdl_stmt_seq* body; string type_comment; if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) { @@ -6338,7 +6383,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - items = _Py_asdl_seq_new(len, arena); + items = _Py_asdl_withitem_seq_new(len, arena); if (items == NULL) goto failed; for (i = 0; i < len; i++) { withitem_ty val; @@ -6371,7 +6416,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6412,8 +6457,8 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* items; - asdl_seq* body; + asdl_withitem_seq* items; + asdl_stmt_seq* body; string type_comment; if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) { @@ -6432,7 +6477,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - items = _Py_asdl_seq_new(len, arena); + items = _Py_asdl_withitem_seq_new(len, arena); if (items == NULL) goto failed; for (i = 0; i < len; i++) { withitem_ty val; @@ -6465,7 +6510,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6546,10 +6591,10 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* body; - asdl_seq* handlers; - asdl_seq* orelse; - asdl_seq* finalbody; + asdl_stmt_seq* body; + asdl_excepthandler_seq* handlers; + asdl_stmt_seq* orelse; + asdl_stmt_seq* finalbody; if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; @@ -6567,7 +6612,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6600,7 +6645,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - handlers = _Py_asdl_seq_new(len, arena); + handlers = _Py_asdl_excepthandler_seq_new(len, arena); if (handlers == NULL) goto failed; for (i = 0; i < len; i++) { excepthandler_ty val; @@ -6633,7 +6678,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - orelse = _Py_asdl_seq_new(len, arena); + orelse = _Py_asdl_stmt_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6666,7 +6711,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - finalbody = _Py_asdl_seq_new(len, arena); + finalbody = _Py_asdl_stmt_seq_new(len, arena); if (finalbody == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -6734,7 +6779,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* names; + asdl_alias_seq* names; if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) { return 1; @@ -6752,7 +6797,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - names = _Py_asdl_seq_new(len, arena); + names = _Py_asdl_alias_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty val; @@ -6781,7 +6826,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) } if (isinstance) { identifier module; - asdl_seq* names; + asdl_alias_seq* names; int level; if (_PyObject_LookupAttr(obj, state->module, &tmp) < 0) { @@ -6813,7 +6858,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - names = _Py_asdl_seq_new(len, arena); + names = _Py_asdl_alias_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty val; @@ -6854,7 +6899,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* names; + asdl_identifier_seq* names; if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) { return 1; @@ -6872,7 +6917,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - names = _Py_asdl_seq_new(len, arena); + names = _Py_asdl_identifier_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier val; @@ -6900,7 +6945,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* names; + asdl_identifier_seq* names; if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) { return 1; @@ -6918,7 +6963,7 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - names = _Py_asdl_seq_new(len, arena); + names = _Py_asdl_identifier_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier val; @@ -7081,7 +7126,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) } if (isinstance) { boolop_ty op; - asdl_seq* values; + asdl_expr_seq* values; if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) { return 1; @@ -7112,7 +7157,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - values = _Py_asdl_seq_new(len, arena); + values = _Py_asdl_expr_seq_new(len, arena); if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -7368,8 +7413,8 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* keys; - asdl_seq* values; + asdl_expr_seq* keys; + asdl_expr_seq* values; if (_PyObject_LookupAttr(obj, state->keys, &tmp) < 0) { return 1; @@ -7387,7 +7432,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - keys = _Py_asdl_seq_new(len, arena); + keys = _Py_asdl_expr_seq_new(len, arena); if (keys == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -7420,7 +7465,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - values = _Py_asdl_seq_new(len, arena); + values = _Py_asdl_expr_seq_new(len, arena); if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -7448,7 +7493,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* elts; + asdl_expr_seq* elts; if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) { return 1; @@ -7466,7 +7511,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - elts = _Py_asdl_seq_new(len, arena); + elts = _Py_asdl_expr_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -7494,7 +7539,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) } if (isinstance) { expr_ty elt; - asdl_seq* generators; + asdl_comprehension_seq* generators; if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) { return 1; @@ -7525,7 +7570,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - generators = _Py_asdl_seq_new(len, arena); + generators = _Py_asdl_comprehension_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; @@ -7554,7 +7599,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) } if (isinstance) { expr_ty elt; - asdl_seq* generators; + asdl_comprehension_seq* generators; if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) { return 1; @@ -7585,7 +7630,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - generators = _Py_asdl_seq_new(len, arena); + generators = _Py_asdl_comprehension_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; @@ -7615,7 +7660,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) if (isinstance) { expr_ty key; expr_ty value; - asdl_seq* generators; + asdl_comprehension_seq* generators; if (_PyObject_LookupAttr(obj, state->key, &tmp) < 0) { return 1; @@ -7659,7 +7704,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - generators = _Py_asdl_seq_new(len, arena); + generators = _Py_asdl_comprehension_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; @@ -7688,7 +7733,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) } if (isinstance) { expr_ty elt; - asdl_seq* generators; + asdl_comprehension_seq* generators; if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) { return 1; @@ -7719,7 +7764,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - generators = _Py_asdl_seq_new(len, arena); + generators = _Py_asdl_comprehension_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; @@ -7827,7 +7872,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) if (isinstance) { expr_ty left; asdl_int_seq* ops; - asdl_seq* comparators; + asdl_expr_seq* comparators; if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) { return 1; @@ -7891,7 +7936,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - comparators = _Py_asdl_seq_new(len, arena); + comparators = _Py_asdl_expr_seq_new(len, arena); if (comparators == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -7920,8 +7965,8 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) } if (isinstance) { expr_ty func; - asdl_seq* args; - asdl_seq* keywords; + asdl_expr_seq* args; + asdl_keyword_seq* keywords; if (_PyObject_LookupAttr(obj, state->func, &tmp) < 0) { return 1; @@ -7952,7 +7997,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - args = _Py_asdl_seq_new(len, arena); + args = _Py_asdl_expr_seq_new(len, arena); if (args == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -7985,7 +8030,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - keywords = _Py_asdl_seq_new(len, arena); + keywords = _Py_asdl_keyword_seq_new(len, arena); if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty val; @@ -8067,7 +8112,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* values; + asdl_expr_seq* values; if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) { return 1; @@ -8085,7 +8130,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - values = _Py_asdl_seq_new(len, arena); + values = _Py_asdl_expr_seq_new(len, arena); if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -8341,7 +8386,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* elts; + asdl_expr_seq* elts; expr_context_ty ctx; if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) { @@ -8360,7 +8405,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - elts = _Py_asdl_seq_new(len, arena); + elts = _Py_asdl_expr_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -8401,7 +8446,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) return 1; } if (isinstance) { - asdl_seq* elts; + asdl_expr_seq* elts; expr_context_ty ctx; if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) { @@ -8420,7 +8465,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - elts = _Py_asdl_seq_new(len, arena); + elts = _Py_asdl_expr_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -8834,7 +8879,7 @@ obj2ast_comprehension(astmodulestate *state, PyObject* obj, comprehension_ty* PyObject* tmp = NULL; expr_ty target; expr_ty iter; - asdl_seq* ifs; + asdl_expr_seq* ifs; int is_async; if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { @@ -8879,7 +8924,7 @@ obj2ast_comprehension(astmodulestate *state, PyObject* obj, comprehension_ty* goto failed; } len = PyList_GET_SIZE(tmp); - ifs = _Py_asdl_seq_new(len, arena); + ifs = _Py_asdl_expr_seq_new(len, arena); if (ifs == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -8993,7 +9038,7 @@ obj2ast_excepthandler(astmodulestate *state, PyObject* obj, excepthandler_ty* if (isinstance) { expr_ty type; identifier name; - asdl_seq* body; + asdl_stmt_seq* body; if (_PyObject_LookupAttr(obj, state->type, &tmp) < 0) { return 1; @@ -9037,7 +9082,7 @@ obj2ast_excepthandler(astmodulestate *state, PyObject* obj, excepthandler_ty* goto failed; } len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); + body = _Py_asdl_stmt_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; @@ -9071,13 +9116,13 @@ obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out, PyArena* arena) { PyObject* tmp = NULL; - asdl_seq* posonlyargs; - asdl_seq* args; + asdl_arg_seq* posonlyargs; + asdl_arg_seq* args; arg_ty vararg; - asdl_seq* kwonlyargs; - asdl_seq* kw_defaults; + asdl_arg_seq* kwonlyargs; + asdl_expr_seq* kw_defaults; arg_ty kwarg; - asdl_seq* defaults; + asdl_expr_seq* defaults; if (_PyObject_LookupAttr(obj, state->posonlyargs, &tmp) < 0) { return 1; @@ -9095,7 +9140,7 @@ obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out, goto failed; } len = PyList_GET_SIZE(tmp); - posonlyargs = _Py_asdl_seq_new(len, arena); + posonlyargs = _Py_asdl_arg_seq_new(len, arena); if (posonlyargs == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty val; @@ -9128,7 +9173,7 @@ obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out, goto failed; } len = PyList_GET_SIZE(tmp); - args = _Py_asdl_seq_new(len, arena); + args = _Py_asdl_arg_seq_new(len, arena); if (args == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty val; @@ -9174,7 +9219,7 @@ obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out, goto failed; } len = PyList_GET_SIZE(tmp); - kwonlyargs = _Py_asdl_seq_new(len, arena); + kwonlyargs = _Py_asdl_arg_seq_new(len, arena); if (kwonlyargs == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty val; @@ -9207,7 +9252,7 @@ obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out, goto failed; } len = PyList_GET_SIZE(tmp); - kw_defaults = _Py_asdl_seq_new(len, arena); + kw_defaults = _Py_asdl_expr_seq_new(len, arena); if (kw_defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; @@ -9253,7 +9298,7 @@ obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out, goto failed; } len = PyList_GET_SIZE(tmp); - defaults = _Py_asdl_seq_new(len, arena); + defaults = _Py_asdl_expr_seq_new(len, arena); if (defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; diff --git a/Python/asdl.c b/Python/asdl.c index c21107811813af..4ff07e4377b18e 100644 --- a/Python/asdl.c +++ b/Python/asdl.c @@ -1,64 +1,6 @@ #include "Python.h" #include "asdl.h" -asdl_seq * -_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena) -{ - asdl_seq *seq = NULL; - size_t n; - - /* check size is sane */ - if (size < 0 || - (size && (((size_t)size - 1) > (SIZE_MAX / sizeof(void *))))) { - PyErr_NoMemory(); - return NULL; - } - n = (size ? (sizeof(void *) * (size - 1)) : 0); - - /* check if size can be added safely */ - if (n > SIZE_MAX - sizeof(asdl_seq)) { - PyErr_NoMemory(); - return NULL; - } - n += sizeof(asdl_seq); - - seq = (asdl_seq *)PyArena_Malloc(arena, n); - if (!seq) { - PyErr_NoMemory(); - return NULL; - } - memset(seq, 0, n); - seq->size = size; - return seq; -} - -asdl_int_seq * -_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena) -{ - asdl_int_seq *seq = NULL; - size_t n; - - /* check size is sane */ - if (size < 0 || - (size && (((size_t)size - 1) > (SIZE_MAX / sizeof(void *))))) { - PyErr_NoMemory(); - return NULL; - } - n = (size ? (sizeof(void *) * (size - 1)) : 0); - - /* check if size can be added safely */ - if (n > SIZE_MAX - sizeof(asdl_seq)) { - PyErr_NoMemory(); - return NULL; - } - n += sizeof(asdl_seq); - - seq = (asdl_int_seq *)PyArena_Malloc(arena, n); - if (!seq) { - PyErr_NoMemory(); - return NULL; - } - memset(seq, 0, n); - seq->size = size; - return seq; -} +GENERATE_ASDL_SEQ_CONSTRUCTOR(generic, void*); +GENERATE_ASDL_SEQ_CONSTRUCTOR(identifier, PyObject*); +GENERATE_ASDL_SEQ_CONSTRUCTOR(int, int); diff --git a/Python/ast.c b/Python/ast.c index 7bf66e50aa14d9..4b7bbd229c99b2 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -14,9 +14,9 @@ #define MAXLEVEL 200 /* Max parentheses level */ -static int validate_stmts(asdl_seq *); -static int validate_exprs(asdl_seq *, expr_context_ty, int); -static int validate_nonempty_seq(asdl_seq *, const char *, const char *); +static int validate_stmts(asdl_stmt_seq *); +static int validate_exprs(asdl_expr_seq*, expr_context_ty, int); +static int _validate_nonempty_seq(asdl_seq *, const char *, const char *); static int validate_stmt(stmt_ty); static int validate_expr(expr_ty, expr_context_ty); @@ -40,7 +40,7 @@ validate_name(PyObject *name) } static int -validate_comprehension(asdl_seq *gens) +validate_comprehension(asdl_comprehension_seq *gens) { Py_ssize_t i; if (!asdl_seq_LEN(gens)) { @@ -58,7 +58,7 @@ validate_comprehension(asdl_seq *gens) } static int -validate_keywords(asdl_seq *keywords) +validate_keywords(asdl_keyword_seq *keywords) { Py_ssize_t i; for (i = 0; i < asdl_seq_LEN(keywords); i++) @@ -68,7 +68,7 @@ validate_keywords(asdl_seq *keywords) } static int -validate_args(asdl_seq *args) +validate_args(asdl_arg_seq *args) { Py_ssize_t i; for (i = 0; i < asdl_seq_LEN(args); i++) { @@ -324,23 +324,24 @@ validate_expr(expr_ty exp, expr_context_ty ctx) } static int -validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner) +_validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner) { if (asdl_seq_LEN(seq)) return 1; PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner); return 0; } +#define validate_nonempty_seq(seq, what, owner) _validate_nonempty_seq((asdl_seq*)seq, what, owner) static int -validate_assignlist(asdl_seq *targets, expr_context_ty ctx) +validate_assignlist(asdl_expr_seq *targets, expr_context_ty ctx) { return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") && validate_exprs(targets, ctx, 0); } static int -validate_body(asdl_seq *body, const char *owner) +validate_body(asdl_stmt_seq *body, const char *owner) { return validate_nonempty_seq(body, "body", owner) && validate_stmts(body); } @@ -488,7 +489,7 @@ validate_stmt(stmt_ty stmt) } static int -validate_stmts(asdl_seq *seq) +validate_stmts(asdl_stmt_seq *seq) { Py_ssize_t i; for (i = 0; i < asdl_seq_LEN(seq); i++) { @@ -507,7 +508,7 @@ validate_stmts(asdl_seq *seq) } static int -validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok) +validate_exprs(asdl_expr_seq *exprs, expr_context_ty ctx, int null_ok) { Py_ssize_t i; for (i = 0; i < asdl_seq_LEN(exprs); i++) { @@ -550,7 +551,7 @@ PyAST_Validate(mod_ty mod) } PyObject * -_PyAST_GetDocString(asdl_seq *body) +_PyAST_GetDocString(asdl_stmt_seq *body) { if (!asdl_seq_LEN(body)) { return NULL; diff --git a/Python/ast_opt.c b/Python/ast_opt.c index ff786d6f8d63ef..5efaac4c8925a9 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -271,7 +271,7 @@ fold_binop(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) } static PyObject* -make_const_tuple(asdl_seq *elts) +make_const_tuple(asdl_expr_seq *elts) { for (int i = 0; i < asdl_seq_LEN(elts); i++) { expr_ty e = (expr_ty)asdl_seq_GET(elts, i); @@ -337,7 +337,7 @@ fold_iter(expr_ty arg, PyArena *arena, _PyASTOptimizeState *state) PyObject *newval; if (arg->kind == List_kind) { /* First change a list into tuple. */ - asdl_seq *elts = arg->v.List.elts; + asdl_expr_seq *elts = arg->v.List.elts; Py_ssize_t n = asdl_seq_LEN(elts); for (Py_ssize_t i = 0; i < n; i++) { expr_ty e = (expr_ty)asdl_seq_GET(elts, i); @@ -368,7 +368,7 @@ static int fold_compare(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) { asdl_int_seq *ops; - asdl_seq *args; + asdl_expr_seq *args; Py_ssize_t i; ops = node->v.Compare.ops; @@ -405,9 +405,9 @@ static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, _PyASTOp #define CALL_SEQ(FUNC, TYPE, ARG) { \ int i; \ - asdl_seq *seq = (ARG); /* avoid variable capture */ \ + asdl_ ## TYPE ## _seq *seq = (ARG); /* avoid variable capture */ \ for (i = 0; i < asdl_seq_LEN(seq); i++) { \ - TYPE elt = (TYPE)asdl_seq_GET(seq, i); \ + TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ if (elt != NULL && !FUNC(elt, ctx_, state)) \ return 0; \ } \ @@ -424,13 +424,13 @@ static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, _PyASTOp } static int -astfold_body(asdl_seq *stmts, PyArena *ctx_, _PyASTOptimizeState *state) +astfold_body(asdl_stmt_seq *stmts, PyArena *ctx_, _PyASTOptimizeState *state) { int docstring = _PyAST_GetDocString(stmts) != NULL; - CALL_SEQ(astfold_stmt, stmt_ty, stmts); + CALL_SEQ(astfold_stmt, stmt, stmts); if (!docstring && _PyAST_GetDocString(stmts) != NULL) { stmt_ty st = (stmt_ty)asdl_seq_GET(stmts, 0); - asdl_seq *values = _Py_asdl_seq_new(1, ctx_); + asdl_expr_seq *values = _Py_asdl_expr_seq_new(1, ctx_); if (!values) { return 0; } @@ -453,7 +453,7 @@ astfold_mod(mod_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) CALL(astfold_body, asdl_seq, node_->v.Module.body); break; case Interactive_kind: - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.Interactive.body); + CALL_SEQ(astfold_stmt, stmt, node_->v.Interactive.body); break; case Expression_kind: CALL(astfold_expr, expr_ty, node_->v.Expression.body); @@ -469,7 +469,7 @@ astfold_expr(expr_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { switch (node_->kind) { case BoolOp_kind: - CALL_SEQ(astfold_expr, expr_ty, node_->v.BoolOp.values); + CALL_SEQ(astfold_expr, expr, node_->v.BoolOp.values); break; case BinOp_kind: CALL(astfold_expr, expr_ty, node_->v.BinOp.left); @@ -490,28 +490,28 @@ astfold_expr(expr_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) CALL(astfold_expr, expr_ty, node_->v.IfExp.orelse); break; case Dict_kind: - CALL_SEQ(astfold_expr, expr_ty, node_->v.Dict.keys); - CALL_SEQ(astfold_expr, expr_ty, node_->v.Dict.values); + CALL_SEQ(astfold_expr, expr, node_->v.Dict.keys); + CALL_SEQ(astfold_expr, expr, node_->v.Dict.values); break; case Set_kind: - CALL_SEQ(astfold_expr, expr_ty, node_->v.Set.elts); + CALL_SEQ(astfold_expr, expr, node_->v.Set.elts); break; case ListComp_kind: CALL(astfold_expr, expr_ty, node_->v.ListComp.elt); - CALL_SEQ(astfold_comprehension, comprehension_ty, node_->v.ListComp.generators); + CALL_SEQ(astfold_comprehension, comprehension, node_->v.ListComp.generators); break; case SetComp_kind: CALL(astfold_expr, expr_ty, node_->v.SetComp.elt); - CALL_SEQ(astfold_comprehension, comprehension_ty, node_->v.SetComp.generators); + CALL_SEQ(astfold_comprehension, comprehension, node_->v.SetComp.generators); break; case DictComp_kind: CALL(astfold_expr, expr_ty, node_->v.DictComp.key); CALL(astfold_expr, expr_ty, node_->v.DictComp.value); - CALL_SEQ(astfold_comprehension, comprehension_ty, node_->v.DictComp.generators); + CALL_SEQ(astfold_comprehension, comprehension, node_->v.DictComp.generators); break; case GeneratorExp_kind: CALL(astfold_expr, expr_ty, node_->v.GeneratorExp.elt); - CALL_SEQ(astfold_comprehension, comprehension_ty, node_->v.GeneratorExp.generators); + CALL_SEQ(astfold_comprehension, comprehension, node_->v.GeneratorExp.generators); break; case Await_kind: CALL(astfold_expr, expr_ty, node_->v.Await.value); @@ -524,20 +524,20 @@ astfold_expr(expr_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) break; case Compare_kind: CALL(astfold_expr, expr_ty, node_->v.Compare.left); - CALL_SEQ(astfold_expr, expr_ty, node_->v.Compare.comparators); + CALL_SEQ(astfold_expr, expr, node_->v.Compare.comparators); CALL(fold_compare, expr_ty, node_); break; case Call_kind: CALL(astfold_expr, expr_ty, node_->v.Call.func); - CALL_SEQ(astfold_expr, expr_ty, node_->v.Call.args); - CALL_SEQ(astfold_keyword, keyword_ty, node_->v.Call.keywords); + CALL_SEQ(astfold_expr, expr, node_->v.Call.args); + CALL_SEQ(astfold_keyword, keyword, node_->v.Call.keywords); break; case FormattedValue_kind: CALL(astfold_expr, expr_ty, node_->v.FormattedValue.value); CALL_OPT(astfold_expr, expr_ty, node_->v.FormattedValue.format_spec); break; case JoinedStr_kind: - CALL_SEQ(astfold_expr, expr_ty, node_->v.JoinedStr.values); + CALL_SEQ(astfold_expr, expr, node_->v.JoinedStr.values); break; case Attribute_kind: CALL(astfold_expr, expr_ty, node_->v.Attribute.value); @@ -556,10 +556,10 @@ astfold_expr(expr_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.step); break; case List_kind: - CALL_SEQ(astfold_expr, expr_ty, node_->v.List.elts); + CALL_SEQ(astfold_expr, expr, node_->v.List.elts); break; case Tuple_kind: - CALL_SEQ(astfold_expr, expr_ty, node_->v.Tuple.elts); + CALL_SEQ(astfold_expr, expr, node_->v.Tuple.elts); CALL(fold_tuple, expr_ty, node_); break; case Name_kind: @@ -586,7 +586,7 @@ astfold_comprehension(comprehension_ty node_, PyArena *ctx_, _PyASTOptimizeState { CALL(astfold_expr, expr_ty, node_->target); CALL(astfold_expr, expr_ty, node_->iter); - CALL_SEQ(astfold_expr, expr_ty, node_->ifs); + CALL_SEQ(astfold_expr, expr, node_->ifs); CALL(fold_iter, expr_ty, node_->iter); return 1; @@ -595,13 +595,13 @@ astfold_comprehension(comprehension_ty node_, PyArena *ctx_, _PyASTOptimizeState static int astfold_arguments(arguments_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { - CALL_SEQ(astfold_arg, arg_ty, node_->posonlyargs); - CALL_SEQ(astfold_arg, arg_ty, node_->args); + CALL_SEQ(astfold_arg, arg, node_->posonlyargs); + CALL_SEQ(astfold_arg, arg, node_->args); CALL_OPT(astfold_arg, arg_ty, node_->vararg); - CALL_SEQ(astfold_arg, arg_ty, node_->kwonlyargs); - CALL_SEQ(astfold_expr, expr_ty, node_->kw_defaults); + CALL_SEQ(astfold_arg, arg, node_->kwonlyargs); + CALL_SEQ(astfold_expr, expr, node_->kw_defaults); CALL_OPT(astfold_arg, arg_ty, node_->kwarg); - CALL_SEQ(astfold_expr, expr_ty, node_->defaults); + CALL_SEQ(astfold_expr, expr, node_->defaults); return 1; } @@ -621,7 +621,7 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) case FunctionDef_kind: CALL(astfold_arguments, arguments_ty, node_->v.FunctionDef.args); CALL(astfold_body, asdl_seq, node_->v.FunctionDef.body); - CALL_SEQ(astfold_expr, expr_ty, node_->v.FunctionDef.decorator_list); + CALL_SEQ(astfold_expr, expr, node_->v.FunctionDef.decorator_list); if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { CALL_OPT(astfold_expr, expr_ty, node_->v.FunctionDef.returns); } @@ -629,25 +629,25 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) case AsyncFunctionDef_kind: CALL(astfold_arguments, arguments_ty, node_->v.AsyncFunctionDef.args); CALL(astfold_body, asdl_seq, node_->v.AsyncFunctionDef.body); - CALL_SEQ(astfold_expr, expr_ty, node_->v.AsyncFunctionDef.decorator_list); + CALL_SEQ(astfold_expr, expr, node_->v.AsyncFunctionDef.decorator_list); if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { CALL_OPT(astfold_expr, expr_ty, node_->v.AsyncFunctionDef.returns); } break; case ClassDef_kind: - CALL_SEQ(astfold_expr, expr_ty, node_->v.ClassDef.bases); - CALL_SEQ(astfold_keyword, keyword_ty, node_->v.ClassDef.keywords); + CALL_SEQ(astfold_expr, expr, node_->v.ClassDef.bases); + CALL_SEQ(astfold_keyword, keyword, node_->v.ClassDef.keywords); CALL(astfold_body, asdl_seq, node_->v.ClassDef.body); - CALL_SEQ(astfold_expr, expr_ty, node_->v.ClassDef.decorator_list); + CALL_SEQ(astfold_expr, expr, node_->v.ClassDef.decorator_list); break; case Return_kind: CALL_OPT(astfold_expr, expr_ty, node_->v.Return.value); break; case Delete_kind: - CALL_SEQ(astfold_expr, expr_ty, node_->v.Delete.targets); + CALL_SEQ(astfold_expr, expr, node_->v.Delete.targets); break; case Assign_kind: - CALL_SEQ(astfold_expr, expr_ty, node_->v.Assign.targets); + CALL_SEQ(astfold_expr, expr, node_->v.Assign.targets); CALL(astfold_expr, expr_ty, node_->v.Assign.value); break; case AugAssign_kind: @@ -664,44 +664,44 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) case For_kind: CALL(astfold_expr, expr_ty, node_->v.For.target); CALL(astfold_expr, expr_ty, node_->v.For.iter); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.For.body); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.For.orelse); + CALL_SEQ(astfold_stmt, stmt, node_->v.For.body); + CALL_SEQ(astfold_stmt, stmt, node_->v.For.orelse); CALL(fold_iter, expr_ty, node_->v.For.iter); break; case AsyncFor_kind: CALL(astfold_expr, expr_ty, node_->v.AsyncFor.target); CALL(astfold_expr, expr_ty, node_->v.AsyncFor.iter); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.AsyncFor.body); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.AsyncFor.orelse); + CALL_SEQ(astfold_stmt, stmt, node_->v.AsyncFor.body); + CALL_SEQ(astfold_stmt, stmt, node_->v.AsyncFor.orelse); break; case While_kind: CALL(astfold_expr, expr_ty, node_->v.While.test); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.While.body); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.While.orelse); + CALL_SEQ(astfold_stmt, stmt, node_->v.While.body); + CALL_SEQ(astfold_stmt, stmt, node_->v.While.orelse); break; case If_kind: CALL(astfold_expr, expr_ty, node_->v.If.test); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.If.body); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.If.orelse); + CALL_SEQ(astfold_stmt, stmt, node_->v.If.body); + CALL_SEQ(astfold_stmt, stmt, node_->v.If.orelse); break; case With_kind: - CALL_SEQ(astfold_withitem, withitem_ty, node_->v.With.items); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.With.body); + CALL_SEQ(astfold_withitem, withitem, node_->v.With.items); + CALL_SEQ(astfold_stmt, stmt, node_->v.With.body); break; case AsyncWith_kind: - CALL_SEQ(astfold_withitem, withitem_ty, node_->v.AsyncWith.items); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.AsyncWith.body); + CALL_SEQ(astfold_withitem, withitem, node_->v.AsyncWith.items); + CALL_SEQ(astfold_stmt, stmt, node_->v.AsyncWith.body); break; case Raise_kind: CALL_OPT(astfold_expr, expr_ty, node_->v.Raise.exc); CALL_OPT(astfold_expr, expr_ty, node_->v.Raise.cause); break; case Try_kind: - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.Try.body); - CALL_SEQ(astfold_excepthandler, excepthandler_ty, node_->v.Try.handlers); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.Try.orelse); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.Try.finalbody); + CALL_SEQ(astfold_stmt, stmt, node_->v.Try.body); + CALL_SEQ(astfold_excepthandler, excepthandler, node_->v.Try.handlers); + CALL_SEQ(astfold_stmt, stmt, node_->v.Try.orelse); + CALL_SEQ(astfold_stmt, stmt, node_->v.Try.finalbody); break; case Assert_kind: CALL(astfold_expr, expr_ty, node_->v.Assert.test); @@ -722,7 +722,7 @@ astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, _PyASTOptimizeState switch (node_->kind) { case ExceptHandler_kind: CALL_OPT(astfold_expr, expr_ty, node_->v.ExceptHandler.type); - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.ExceptHandler.body); + CALL_SEQ(astfold_stmt, stmt, node_->v.ExceptHandler.body); break; default: break; diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index e699751a05a055..a04ff93e9d9d90 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -117,7 +117,7 @@ static int append_ast_boolop(_PyUnicodeWriter *writer, expr_ty e, int level) { Py_ssize_t i, value_count; - asdl_seq *values; + asdl_expr_seq *values; const char *op = (e->v.BoolOp.op == And) ? " and " : " or "; int pr = (e->v.BoolOp.op == And) ? PR_AND : PR_OR; @@ -398,7 +398,7 @@ append_ast_comprehension(_PyUnicodeWriter *writer, comprehension_ty gen) } static int -append_ast_comprehensions(_PyUnicodeWriter *writer, asdl_seq *comprehensions) +append_ast_comprehensions(_PyUnicodeWriter *writer, asdl_comprehension_seq *comprehensions) { Py_ssize_t i, gen_count; gen_count = asdl_seq_LEN(comprehensions); @@ -453,7 +453,7 @@ append_ast_compare(_PyUnicodeWriter *writer, expr_ty e, int level) { const char *op; Py_ssize_t i, comparator_count; - asdl_seq *comparators; + asdl_expr_seq *comparators; asdl_int_seq *ops; APPEND_STR_IF(level > PR_CMP, "("); @@ -612,7 +612,7 @@ append_fstring_element(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) /* Build body separately to enable wrapping the entire stream of Strs, Constants and FormattedValues in one opening and one closing quote. */ static PyObject * -build_fstring_body(asdl_seq *values, bool is_format_spec) +build_fstring_body(asdl_expr_seq *values, bool is_format_spec) { Py_ssize_t i, value_count; _PyUnicodeWriter body_writer; diff --git a/Python/compile.c b/Python/compile.c index 2c5326686f8663..3ebf221cf02b71 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -222,27 +222,27 @@ static int compiler_subscript(struct compiler *, expr_ty); static int compiler_slice(struct compiler *, expr_ty); static int inplace_binop(operator_ty); -static int are_all_items_const(asdl_seq *, Py_ssize_t, Py_ssize_t); +static int are_all_items_const(asdl_expr_seq *, Py_ssize_t, Py_ssize_t); static int expr_constant(expr_ty); static int compiler_with(struct compiler *, stmt_ty, int); static int compiler_async_with(struct compiler *, stmt_ty, int); static int compiler_async_for(struct compiler *, stmt_ty); static int compiler_call_helper(struct compiler *c, int n, - asdl_seq *args, - asdl_seq *keywords); + asdl_expr_seq *args, + asdl_keyword_seq *keywords); static int compiler_try_except(struct compiler *, stmt_ty); static int compiler_set_qualname(struct compiler *); static int compiler_sync_comprehension_generator( struct compiler *c, - asdl_seq *generators, int gen_index, + asdl_comprehension_seq *generators, int gen_index, int depth, expr_ty elt, expr_ty val, int type); static int compiler_async_comprehension_generator( struct compiler *c, - asdl_seq *generators, int gen_index, + asdl_comprehension_seq *generators, int gen_index, int depth, expr_ty elt, expr_ty val, int type); @@ -1525,7 +1525,7 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b) #define VISIT_SEQ(C, TYPE, SEQ) { \ int _i; \ - asdl_seq *seq = (SEQ); /* avoid variable capture */ \ + asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \ for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \ TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \ if (!compiler_visit_ ## TYPE((C), elt)) \ @@ -1535,7 +1535,7 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b) #define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \ int _i; \ - asdl_seq *seq = (SEQ); /* avoid variable capture */ \ + asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \ for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \ TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \ if (!compiler_visit_ ## TYPE((C), elt)) { \ @@ -1559,7 +1559,7 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b) /* Search if variable annotations are present statically in a block. */ static int -find_ann(asdl_seq *stmts) +find_ann(asdl_stmt_seq *stmts) { int i, j, res = 0; stmt_ty st; @@ -1778,7 +1778,7 @@ compiler_unwind_fblock_stack(struct compiler *c, int preserve_tos, struct fblock and for annotations. */ static int -compiler_body(struct compiler *c, asdl_seq *stmts) +compiler_body(struct compiler *c, asdl_stmt_seq *stmts) { int i = 0; stmt_ty st; @@ -1841,8 +1841,7 @@ compiler_mod(struct compiler *c, mod_ty mod) ADDOP(c, SETUP_ANNOTATIONS); } c->c_interactive = 1; - VISIT_SEQ_IN_SCOPE(c, stmt, - mod->v.Interactive.body); + VISIT_SEQ_IN_SCOPE(c, stmt, mod->v.Interactive.body); break; case Expression_kind: VISIT_IN_SCOPE(c, expr, mod->v.Expression.body); @@ -1945,7 +1944,7 @@ compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, Py } static int -compiler_decorators(struct compiler *c, asdl_seq* decos) +compiler_decorators(struct compiler *c, asdl_expr_seq* decos) { int i; @@ -1959,8 +1958,8 @@ compiler_decorators(struct compiler *c, asdl_seq* decos) } static int -compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs, - asdl_seq *kw_defaults) +compiler_visit_kwonlydefaults(struct compiler *c, asdl_arg_seq *kwonlyargs, + asdl_expr_seq *kw_defaults) { /* Push a dict of keyword-only default values. @@ -2047,7 +2046,7 @@ compiler_visit_argannotation(struct compiler *c, identifier id, } static int -compiler_visit_argannotations(struct compiler *c, asdl_seq* args, +compiler_visit_argannotations(struct compiler *c, asdl_arg_seq* args, PyObject *names) { int i; @@ -2173,7 +2172,7 @@ compiler_check_debug_one_arg(struct compiler *c, arg_ty arg) } static int -compiler_check_debug_args_seq(struct compiler *c, asdl_seq *args) +compiler_check_debug_args_seq(struct compiler *c, asdl_arg_seq *args) { if (args != NULL) { for (Py_ssize_t i = 0, n = asdl_seq_LEN(args); i < n; i++) { @@ -2208,8 +2207,8 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async) arguments_ty args; expr_ty returns; identifier name; - asdl_seq* decos; - asdl_seq *body; + asdl_expr_seq* decos; + asdl_stmt_seq *body; Py_ssize_t i, funcflags; int annotations; int scope_type; @@ -2306,7 +2305,7 @@ compiler_class(struct compiler *c, stmt_ty s) PyCodeObject *co; PyObject *str; int i, firstlineno; - asdl_seq* decos = s->v.ClassDef.decorator_list; + asdl_expr_seq *decos = s->v.ClassDef.decorator_list; if (!compiler_decorators(c, decos)) return 0; @@ -2418,9 +2417,7 @@ compiler_class(struct compiler *c, stmt_ty s) ADDOP_LOAD_CONST(c, s->v.ClassDef.name); /* 5. generate the rest of the code for the call */ - if (!compiler_call_helper(c, 2, - s->v.ClassDef.bases, - s->v.ClassDef.keywords)) + if (!compiler_call_helper(c, 2, s->v.ClassDef.bases, s->v.ClassDef.keywords)) return 0; /* 6. apply decorators */ @@ -2528,7 +2525,7 @@ compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond) /* fallback to general implementation */ break; case BoolOp_kind: { - asdl_seq *s = e->v.BoolOp.values; + asdl_expr_seq *s = e->v.BoolOp.values; Py_ssize_t i, n = asdl_seq_LEN(s) - 1; assert(n >= 0); int cond2 = e->v.BoolOp.op == Or; @@ -3645,7 +3642,7 @@ compiler_boolop(struct compiler *c, expr_ty e) basicblock *end; int jumpi; Py_ssize_t i, n; - asdl_seq *s; + asdl_expr_seq *s; assert(e->kind == BoolOp_kind); if (e->v.BoolOp.op == And) @@ -3673,7 +3670,7 @@ compiler_boolop(struct compiler *c, expr_ty e) } static int -starunpack_helper(struct compiler *c, asdl_seq *elts, int pushed, +starunpack_helper(struct compiler *c, asdl_expr_seq *elts, int pushed, int build, int add, int extend, int tuple) { Py_ssize_t n = asdl_seq_LEN(elts); @@ -3750,7 +3747,7 @@ starunpack_helper(struct compiler *c, asdl_seq *elts, int pushed, } static int -assignment_helper(struct compiler *c, asdl_seq *elts) +assignment_helper(struct compiler *c, asdl_expr_seq *elts) { Py_ssize_t n = asdl_seq_LEN(elts); Py_ssize_t i; @@ -3784,7 +3781,7 @@ assignment_helper(struct compiler *c, asdl_seq *elts) static int compiler_list(struct compiler *c, expr_ty e) { - asdl_seq *elts = e->v.List.elts; + asdl_expr_seq *elts = e->v.List.elts; if (e->v.List.ctx == Store) { return assignment_helper(c, elts); } @@ -3800,7 +3797,7 @@ compiler_list(struct compiler *c, expr_ty e) static int compiler_tuple(struct compiler *c, expr_ty e) { - asdl_seq *elts = e->v.Tuple.elts; + asdl_expr_seq *elts = e->v.Tuple.elts; if (e->v.Tuple.ctx == Store) { return assignment_helper(c, elts); } @@ -3821,7 +3818,7 @@ compiler_set(struct compiler *c, expr_ty e) } static int -are_all_items_const(asdl_seq *seq, Py_ssize_t begin, Py_ssize_t end) +are_all_items_const(asdl_expr_seq *seq, Py_ssize_t begin, Py_ssize_t end) { Py_ssize_t i; for (i = begin; i < end; i++) { @@ -4084,7 +4081,7 @@ maybe_optimize_method_call(struct compiler *c, expr_ty e) { Py_ssize_t argsl, i; expr_ty meth = e->v.Call.func; - asdl_seq *args = e->v.Call.args; + asdl_expr_seq *args = e->v.Call.args; /* Check that the call node is an attribute access, and that the call doesn't have keyword parameters. */ @@ -4110,7 +4107,7 @@ maybe_optimize_method_call(struct compiler *c, expr_ty e) } static int -validate_keywords(struct compiler *c, asdl_seq *keywords) +validate_keywords(struct compiler *c, asdl_keyword_seq *keywords) { Py_ssize_t nkeywords = asdl_seq_LEN(keywords); for (Py_ssize_t i = 0; i < nkeywords; i++) { @@ -4210,7 +4207,7 @@ compiler_formatted_value(struct compiler *c, expr_ty e) } static int -compiler_subkwargs(struct compiler *c, asdl_seq *keywords, Py_ssize_t begin, Py_ssize_t end) +compiler_subkwargs(struct compiler *c, asdl_keyword_seq *keywords, Py_ssize_t begin, Py_ssize_t end) { Py_ssize_t i, n = end - begin; keyword_ty kw; @@ -4249,8 +4246,8 @@ compiler_subkwargs(struct compiler *c, asdl_seq *keywords, Py_ssize_t begin, Py_ static int compiler_call_helper(struct compiler *c, int n, /* Args already pushed */ - asdl_seq *args, - asdl_seq *keywords) + asdl_expr_seq *args, + asdl_keyword_seq *keywords) { Py_ssize_t i, nseen, nelts, nkwelts; @@ -4375,7 +4372,7 @@ compiler_call_helper(struct compiler *c, static int compiler_comprehension_generator(struct compiler *c, - asdl_seq *generators, int gen_index, + asdl_comprehension_seq *generators, int gen_index, int depth, expr_ty elt, expr_ty val, int type) { @@ -4392,7 +4389,7 @@ compiler_comprehension_generator(struct compiler *c, static int compiler_sync_comprehension_generator(struct compiler *c, - asdl_seq *generators, int gen_index, + asdl_comprehension_seq *generators, int gen_index, int depth, expr_ty elt, expr_ty val, int type) { @@ -4424,7 +4421,7 @@ compiler_sync_comprehension_generator(struct compiler *c, /* Fast path for the temporary variable assignment idiom: for y in [f(x)] */ - asdl_seq *elts; + asdl_expr_seq *elts; switch (gen->iter->kind) { case List_kind: elts = gen->iter->v.List.elts; @@ -4511,7 +4508,7 @@ compiler_sync_comprehension_generator(struct compiler *c, static int compiler_async_comprehension_generator(struct compiler *c, - asdl_seq *generators, int gen_index, + asdl_comprehension_seq *generators, int gen_index, int depth, expr_ty elt, expr_ty val, int type) { @@ -4602,7 +4599,7 @@ compiler_async_comprehension_generator(struct compiler *c, static int compiler_comprehension(struct compiler *c, expr_ty e, int type, - identifier name, asdl_seq *generators, expr_ty elt, + identifier name, asdl_comprehension_seq *generators, expr_ty elt, expr_ty val) { PyCodeObject *co = NULL; @@ -5226,7 +5223,7 @@ check_ann_subscr(struct compiler *c, expr_ty e) return 1; case Tuple_kind: { /* extended slice */ - asdl_seq *elts = e->v.Tuple.elts; + asdl_expr_seq *elts = e->v.Tuple.elts; Py_ssize_t i, n = asdl_seq_LEN(elts); for (i = 0; i < n; i++) { if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) { diff --git a/Python/future.c b/Python/future.c index 56da4d8c798b86..3cea4fee78085c 100644 --- a/Python/future.c +++ b/Python/future.c @@ -13,11 +13,10 @@ static int future_check_features(PyFutureFeatures *ff, stmt_ty s, PyObject *filename) { int i; - asdl_seq *names; assert(s->kind == ImportFrom_kind); - names = s->v.ImportFrom.names; + asdl_alias_seq *names = s->v.ImportFrom.names; for (i = 0; i < asdl_seq_LEN(names); i++) { alias_ty name = (alias_ty)asdl_seq_GET(names, i); const char *feature = PyUnicode_AsUTF8(name->name); diff --git a/Python/symtable.c b/Python/symtable.c index d192f31deefb77..4a98e79e74a250 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -202,8 +202,8 @@ static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty); static int symtable_visit_alias(struct symtable *st, alias_ty); static int symtable_visit_comprehension(struct symtable *st, comprehension_ty); static int symtable_visit_keyword(struct symtable *st, keyword_ty); -static int symtable_visit_params(struct symtable *st, asdl_seq *args); -static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args); +static int symtable_visit_params(struct symtable *st, asdl_arg_seq *args); +static int symtable_visit_argannotations(struct symtable *st, asdl_arg_seq *args); static int symtable_implicit_arg(struct symtable *st, int pos); static int symtable_visit_annotations(struct symtable *st, arguments_ty, expr_ty); static int symtable_visit_withitem(struct symtable *st, withitem_ty item); @@ -261,7 +261,7 @@ struct symtable * PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future) { struct symtable *st = symtable_new(); - asdl_seq *seq; + asdl_stmt_seq *seq; int i; PyThreadState *tstate; int recursion_limit = Py_GetRecursionLimit(); @@ -1116,7 +1116,7 @@ symtable_add_def(struct symtable *st, PyObject *name, int flag) { #define VISIT_SEQ(ST, TYPE, SEQ) { \ int i; \ - asdl_seq *seq = (SEQ); /* avoid variable capture */ \ + asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \ for (i = 0; i < asdl_seq_LEN(seq); i++) { \ TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ if (!symtable_visit_ ## TYPE((ST), elt)) \ @@ -1126,7 +1126,7 @@ symtable_add_def(struct symtable *st, PyObject *name, int flag) { #define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \ int i; \ - asdl_seq *seq = (SEQ); /* avoid variable capture */ \ + asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \ for (i = (START); i < asdl_seq_LEN(seq); i++) { \ TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ if (!symtable_visit_ ## TYPE((ST), elt)) \ @@ -1136,7 +1136,7 @@ symtable_add_def(struct symtable *st, PyObject *name, int flag) { #define VISIT_SEQ_WITH_NULL(ST, TYPE, SEQ) { \ int i = 0; \ - asdl_seq *seq = (SEQ); /* avoid variable capture */ \ + asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \ for (i = 0; i < asdl_seq_LEN(seq); i++) { \ TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ if (!elt) continue; /* can be NULL */ \ @@ -1318,7 +1318,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) break; case Global_kind: { int i; - asdl_seq *seq = s->v.Global.names; + asdl_identifier_seq *seq = s->v.Global.names; for (i = 0; i < asdl_seq_LEN(seq); i++) { identifier name = (identifier)asdl_seq_GET(seq, i); long cur = symtable_lookup(st, name); @@ -1351,7 +1351,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) } case Nonlocal_kind: { int i; - asdl_seq *seq = s->v.Nonlocal.names; + asdl_identifier_seq *seq = s->v.Nonlocal.names; for (i = 0; i < asdl_seq_LEN(seq); i++) { identifier name = (identifier)asdl_seq_GET(seq, i); long cur = symtable_lookup(st, name); @@ -1683,7 +1683,7 @@ symtable_implicit_arg(struct symtable *st, int pos) } static int -symtable_visit_params(struct symtable *st, asdl_seq *args) +symtable_visit_params(struct symtable *st, asdl_arg_seq *args) { int i; @@ -1700,7 +1700,7 @@ symtable_visit_params(struct symtable *st, asdl_seq *args) } static int -symtable_visit_argannotations(struct symtable *st, asdl_seq *args) +symtable_visit_argannotations(struct symtable *st, asdl_arg_seq *args) { int i; @@ -1850,7 +1850,7 @@ symtable_visit_keyword(struct symtable *st, keyword_ty k) static int symtable_handle_comprehension(struct symtable *st, expr_ty e, - identifier scope_name, asdl_seq *generators, + identifier scope_name, asdl_comprehension_seq *generators, expr_ty elt, expr_ty value) { int is_generator = (e->kind == GeneratorExp_kind); diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index aee668c3f329ab..1a814aad11cccd 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -74,6 +74,7 @@ class FunctionCall: function: str arguments: List[Any] = field(default_factory=list) assigned_variable: Optional[str] = None + assigned_variable_type: Optional[str] = None return_type: Optional[str] = None nodetype: Optional[NodeTypes] = None force_true: bool = False @@ -87,7 +88,10 @@ def __str__(self) -> str: if self.force_true: parts.append(", 1") if self.assigned_variable: - parts = ["(", self.assigned_variable, " = ", *parts, ")"] + if self.assigned_variable_type: + parts = ["(", self.assigned_variable, " = ", '(', self.assigned_variable_type, ')', *parts, ")"] + else: + parts = ["(", self.assigned_variable, " = ", *parts, ")"] if self.comment: parts.append(f" // {self.comment}") return "".join(parts) @@ -210,6 +214,8 @@ def visit_NamedItem(self, node: NamedItem) -> FunctionCall: call = self.generate_call(node.item) if node.name: call.assigned_variable = node.name + if node.type: + call.assigned_variable_type = node.type return call def lookahead_call_helper(self, node: Lookahead, positive: int) -> FunctionCall: @@ -568,9 +574,9 @@ def _handle_loop_rule_body(self, node: Rule, rhs: Rhs) -> None: self.print("PyMem_Free(_children);") self.add_return("NULL") self.print("}") - self.print("asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena);") + self.print("asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena);") self.out_of_memory_return(f"!_seq", cleanup_code="PyMem_Free(_children);") - self.print("for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]);") + self.print("for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]);") self.print("PyMem_Free(_children);") if node.name: self.print(f"_PyPegen_insert_memo(p, _start_mark, {node.name}_type, _seq);") @@ -782,4 +788,5 @@ def add_var(self, node: NamedItem) -> Tuple[Optional[str], Optional[str]]: name = node.name if node.name else call.assigned_variable if name is not None: name = self.dedupe(name) - return name, call.return_type + return_type = call.return_type if node.type is None else node.type + return name, return_type diff --git a/Tools/peg_generator/pegen/grammar.py b/Tools/peg_generator/pegen/grammar.py index 78edf412ea6e47..332ee3c3eec5e2 100644 --- a/Tools/peg_generator/pegen/grammar.py +++ b/Tools/peg_generator/pegen/grammar.py @@ -259,9 +259,10 @@ def collect_todo(self, gen: ParserGenerator) -> None: class NamedItem: - def __init__(self, name: Optional[str], item: Item): + def __init__(self, name: Optional[str], item: Item, type: Optional[str] = None): self.name = name self.item = item + self.type = type self.nullable = False def __str__(self) -> str: diff --git a/Tools/peg_generator/pegen/grammar_parser.py b/Tools/peg_generator/pegen/grammar_parser.py index c784cfdf3b2667..6e3bc5068f5a76 100644 --- a/Tools/peg_generator/pegen/grammar_parser.py +++ b/Tools/peg_generator/pegen/grammar_parser.py @@ -402,9 +402,49 @@ def items(self) -> Optional[NamedItemList]: @memoize def named_item(self) -> Optional[NamedItem]: - # named_item: NAME '=' ~ item | item | lookahead + # named_item: NAME '[' NAME '*' ']' '=' ~ item | NAME '[' NAME ']' '=' ~ item | NAME '=' ~ item | item | lookahead mark = self.mark() cut = False + if ( + (name := self.name()) + and + (literal := self.expect('[')) + and + (type := self.name()) + and + (literal_1 := self.expect('*')) + and + (literal_2 := self.expect(']')) + and + (literal_3 := self.expect('=')) + and + (cut := True) + and + (item := self.item()) + ): + return NamedItem ( name . string , item , f"{type.string}*" ) + self.reset(mark) + if cut: return None + cut = False + if ( + (name := self.name()) + and + (literal := self.expect('[')) + and + (type := self.name()) + and + (literal_1 := self.expect(']')) + and + (literal_2 := self.expect('=')) + and + (cut := True) + and + (item := self.item()) + ): + return NamedItem ( name . string , item , type . string ) + self.reset(mark) + if cut: return None + cut = False if ( (name := self.name()) and diff --git a/Tools/peg_generator/pegen/metagrammar.gram b/Tools/peg_generator/pegen/metagrammar.gram index f0c5ac3ab390fb..4802f56b68f7b6 100644 --- a/Tools/peg_generator/pegen/metagrammar.gram +++ b/Tools/peg_generator/pegen/metagrammar.gram @@ -83,6 +83,8 @@ items[NamedItemList]: | named_item { [named_item] } named_item[NamedItem]: + | NAME '[' type=NAME '*' ']' '=' ~ item {NamedItem(name.string, item, f"{type.string}*")} + | NAME '[' type=NAME ']' '=' ~ item {NamedItem(name.string, item, type.string)} | NAME '=' ~ item {NamedItem(name.string, item)} | item {NamedItem(None, item)} | it=lookahead {NamedItem(None, it)} From 2f1927e123d293721fbd6e3303a413fbd8e0ec70 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Wed, 16 Sep 2020 12:37:54 -0700 Subject: [PATCH 0111/1261] _auto_called cleanup (GH-22285) --- Lib/enum.py | 2 +- Lib/test/test_enum.py | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Lib/enum.py b/Lib/enum.py index 060b2a0dadf457..21a94caaee33f3 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -105,9 +105,9 @@ def __setitem__(self, key, value): # enum overwriting a descriptor? raise TypeError('%r already defined as: %r' % (key, self[key])) if isinstance(value, auto): - self._auto_called = True if value.value == _auto_null: value.value = self._generate_next_value(key, 1, len(self._member_names), self._last_values[:]) + self._auto_called = True value = value.value self._member_names.append(key) self._last_values.append(value) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 5d72d82cec27ff..ebf76047972dc0 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1837,6 +1837,17 @@ class Color(Enum): def _generate_next_value_(name, start, count, last): return name + def test_auto_order_wierd(self): + weird_auto = auto() + weird_auto.value = 'pathological case' + class Color(Enum): + red = weird_auto + def _generate_next_value_(name, start, count, last): + return name + blue = auto() + self.assertEqual(list(Color), [Color.red, Color.blue]) + self.assertEqual(Color.red.value, 'pathological case') + self.assertEqual(Color.blue.value, 'blue') def test_duplicate_auto(self): class Dupes(Enum): From b41613bd559f088296f3f55c4292ae6fb99c950b Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Wed, 16 Sep 2020 13:01:00 -0700 Subject: [PATCH 0112/1261] Enum: make `Flag` and `IntFlag` members iterable (GH-22221) --- Doc/library/enum.rst | 15 +++++++++++++++ Lib/enum.py | 4 ++++ Lib/test/test_enum.py | 12 ++++++++++++ .../2020-09-12-16-18-42.bpo-32218.IpYkEe.rst | 1 + 4 files changed, 32 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-09-12-16-18-42.bpo-32218.IpYkEe.rst diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 32e8bbf9509273..2f84be229bc4da 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -656,6 +656,13 @@ be combined with them:: >>> Perm.X | 8 +:class:`IntFlag` members can also be iterated over:: + + >>> list(RW) + [, ] + +.. versionadded:: 3.10 + Flag ^^^^ @@ -709,6 +716,14 @@ value:: >>> bool(Color.BLACK) False +:class:`Flag` members can also be iterated over:: + + >>> purple = Color.RED | Color.BLUE + >>> list(purple) + [, ] + +.. versionadded:: 3.10 + .. note:: For the majority of new code, :class:`Enum` and :class:`Flag` are strongly diff --git a/Lib/enum.py b/Lib/enum.py index 21a94caaee33f3..3c459ea4113d0b 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -753,6 +753,10 @@ def __contains__(self, other): type(other).__qualname__, self.__class__.__qualname__)) return other._value_ & self._value_ == other._value_ + def __iter__(self): + members, extra_flags = _decompose(self.__class__, self.value) + return (m for m in members if m._value_ != 0) + def __repr__(self): cls = self.__class__ if self._name_ is not None: diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index ebf76047972dc0..59789fb7bcc5fd 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2350,6 +2350,12 @@ def test_member_contains(self): self.assertFalse(W in RX) self.assertFalse(X in RW) + def test_member_iter(self): + Color = self.Color + self.assertEqual(list(Color.PURPLE), [Color.BLUE, Color.RED]) + self.assertEqual(list(Color.BLUE), [Color.BLUE]) + self.assertEqual(list(Color.GREEN), [Color.GREEN]) + def test_auto_number(self): class Color(Flag): red = auto() @@ -2805,6 +2811,12 @@ def test_member_contains(self): with self.assertRaises(TypeError): self.assertFalse('test' in RW) + def test_member_iter(self): + Color = self.Color + self.assertEqual(list(Color.PURPLE), [Color.BLUE, Color.RED]) + self.assertEqual(list(Color.BLUE), [Color.BLUE]) + self.assertEqual(list(Color.GREEN), [Color.GREEN]) + def test_bool(self): Perm = self.Perm for f in Perm: diff --git a/Misc/NEWS.d/next/Library/2020-09-12-16-18-42.bpo-32218.IpYkEe.rst b/Misc/NEWS.d/next/Library/2020-09-12-16-18-42.bpo-32218.IpYkEe.rst new file mode 100644 index 00000000000000..d5832b9767b704 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-12-16-18-42.bpo-32218.IpYkEe.rst @@ -0,0 +1 @@ +`enum.Flag` and `enum.IntFlag` members are now iterable From bc5fd2885167b3e730fffb80f5a5d719abcafaeb Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 17 Sep 2020 10:34:20 +0300 Subject: [PATCH 0113/1261] bpo-41715: Fix potential catastrofic backtracking in c_analyzer. (GH-22091) --- Tools/c-analyzer/c_analyzer/common/info.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Tools/c-analyzer/c_analyzer/common/info.py b/Tools/c-analyzer/c_analyzer/common/info.py index 3f3f8c5b05de59..1a853a42ff2a2c 100644 --- a/Tools/c-analyzer/c_analyzer/common/info.py +++ b/Tools/c-analyzer/c_analyzer/common/info.py @@ -9,7 +9,8 @@ UNKNOWN = '???' -NAME_RE = re.compile(r'^([a-zA-Z]|_\w*[a-zA-Z]\w*|[a-zA-Z]\w*)$') +# Does not start with digit and contains at least one letter. +NAME_RE = re.compile(r'(?!\d)(?=.*?[A-Za-z])\w+', re.ASCII) class ID(_NTBase, namedtuple('ID', 'filename funcname name')): @@ -50,17 +51,16 @@ def validate(self): """Fail if the object is invalid (i.e. init with bad data).""" if not self.name: raise TypeError('missing name') - else: - if not NAME_RE.match(self.name): - raise ValueError( - f'name must be an identifier, got {self.name!r}') + if not NAME_RE.fullmatch(self.name): + raise ValueError( + f'name must be an identifier, got {self.name!r}') # Symbols from a binary might not have filename/funcname info. if self.funcname: if not self.filename: raise TypeError('missing filename') - if not NAME_RE.match(self.funcname) and self.funcname != UNKNOWN: + if not NAME_RE.fullmatch(self.funcname) and self.funcname != UNKNOWN: raise ValueError( f'name must be an identifier, got {self.funcname!r}') From b591a04c7080873e23c8d6fbbce428b4e41fa6a7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 17 Sep 2020 10:35:44 +0300 Subject: [PATCH 0114/1261] bpo-41662: Fix bugs in binding parameters in sqlite3 (GH-21998) * When the parameters argument is a list, correctly handle the case of changing it during iteration. * When the parameters argument is a custom sequence, no longer override an exception raised in ``__len__()``. --- Lib/sqlite3/test/dbapi.py | 14 +++++++++++++- Lib/sqlite3/test/regression.py | 13 +++++++++++++ .../2020-08-29-16-07-36.bpo-41662.Mn79zh.rst | 1 + .../2020-08-30-21-38-57.bpo-41662.6e9iZn.rst | 2 ++ Modules/_sqlite/statement.c | 7 +++++-- 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-08-29-16-07-36.bpo-41662.Mn79zh.rst create mode 100644 Misc/NEWS.d/next/Library/2020-08-30-21-38-57.bpo-41662.6e9iZn.rst diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py index a8dfeb9b2d6933..7867bf361e5ac6 100644 --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -270,7 +270,7 @@ def CheckExecuteParamList(self): self.assertEqual(row[0], "foo") def CheckExecuteParamSequence(self): - class L(object): + class L: def __len__(self): return 1 def __getitem__(self, x): @@ -282,6 +282,18 @@ def __getitem__(self, x): row = self.cu.fetchone() self.assertEqual(row[0], "foo") + def CheckExecuteParamSequenceBadLen(self): + # Issue41662: Error in __len__() was overridden with ProgrammingError. + class L: + def __len__(self): + 1/0 + def __getitem__(slf, x): + raise AssertionError + + self.cu.execute("insert into test(name) values ('foo')") + with self.assertRaises(ZeroDivisionError): + self.cu.execute("select name from test where name=?", L()) + def CheckExecuteDictMapping(self): self.cu.execute("insert into test(name) values ('foo')") self.cu.execute("select name from test where name=:name", {"name": "foo"}) diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index 0735a5c129226d..67557e19c796bb 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -132,6 +132,19 @@ def CheckTypeMapUsage(self): con.execute("insert into foo(bar) values (5)") con.execute(SELECT) + def CheckBindMutatingList(self): + # Issue41662: Crash when mutate a list of parameters during iteration. + class X: + def __conform__(self, protocol): + parameters.clear() + return "..." + parameters = [X(), 0] + con = sqlite.connect(":memory:",detect_types=sqlite.PARSE_DECLTYPES) + con.execute("create table foo(bar X, baz integer)") + # Should not crash + with self.assertRaises(IndexError): + con.execute("insert into foo(bar, baz) values (?, ?)", parameters) + def CheckErrorMsgDecodeError(self): # When porting the module to Python 3.0, the error message about # decoding errors disappeared. This verifies they're back again. diff --git a/Misc/NEWS.d/next/Library/2020-08-29-16-07-36.bpo-41662.Mn79zh.rst b/Misc/NEWS.d/next/Library/2020-08-29-16-07-36.bpo-41662.Mn79zh.rst new file mode 100644 index 00000000000000..0571c2d110beeb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-29-16-07-36.bpo-41662.Mn79zh.rst @@ -0,0 +1 @@ +Fixed crash when mutate list of parameters during iteration in :mod:`sqlite3`. diff --git a/Misc/NEWS.d/next/Library/2020-08-30-21-38-57.bpo-41662.6e9iZn.rst b/Misc/NEWS.d/next/Library/2020-08-30-21-38-57.bpo-41662.6e9iZn.rst new file mode 100644 index 00000000000000..aecb0a1ea4d08f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-30-21-38-57.bpo-41662.6e9iZn.rst @@ -0,0 +1,2 @@ +No longer override exceptions raised in ``__len__()`` of a sequence of +parameters in :mod:`sqlite3` with :exc:`~sqlite3.ProgrammingError`. diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 26599b423eb8b9..02e47a02b718cc 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -227,6 +227,9 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para num_params = PyList_GET_SIZE(parameters); } else { num_params = PySequence_Size(parameters); + if (num_params == -1) { + return; + } } if (num_params != num_params_needed) { PyErr_Format(pysqlite_ProgrammingError, @@ -238,9 +241,9 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para for (i = 0; i < num_params; i++) { if (PyTuple_CheckExact(parameters)) { current_param = PyTuple_GET_ITEM(parameters, i); - Py_XINCREF(current_param); + Py_INCREF(current_param); } else if (PyList_CheckExact(parameters)) { - current_param = PyList_GET_ITEM(parameters, i); + current_param = PyList_GetItem(parameters, i); Py_XINCREF(current_param); } else { current_param = PySequence_GetItem(parameters, i); From b58a8ea375a8e4182a681048a229a2b0493babb2 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 17 Sep 2020 11:49:01 +0300 Subject: [PATCH 0115/1261] bpo-27032, bpo-37328: Document removing HTMLParser.unescape(). (GH-22288) --- Doc/whatsnew/3.9.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index be7406e13c2cd4..e1ea799b76296d 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -887,6 +887,12 @@ Removed :func:`asyncio.current_task` and :func:`asyncio.all_tasks` instead. (Contributed by Rémi Lapeyre in :issue:`40967`) +* The ``unescape()`` method in the :class:`html.parser.HTMLParser` class + has been removed (it was deprecated since Python 3.4). :func:`html.unescape` + should be used for converting character references to the corresponding + unicode characters. + + Porting to Python 3.9 ===================== From a46762f16100b22efe3f119df463d354cb09eb28 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Thu, 17 Sep 2020 21:56:58 -0400 Subject: [PATCH 0116/1261] bpo-41808: Add What's New 3.9 entry missing from master (#22294) Entry was added by bpo-40939, #21012 and #21039. --- Doc/whatsnew/3.9.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index e1ea799b76296d..b3cc84d07f38d5 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -708,6 +708,11 @@ Deprecated users can leverage the Abstract Syntax Tree (AST) generation and compilation stage, using the :mod:`ast` module. +* The Public C API functions :c:func:`PyParser_SimpleParseStringFlags`, + :c:func:`PyParser_SimpleParseStringFlagsFilename`, + :c:func:`PyParser_SimpleParseFileFlags` and :c:func:`PyNode_Compile` + are deprecated and will be removed in Python 3.10 together with the old parser. + * Using :data:`NotImplemented` in a boolean context has been deprecated, as it is almost exclusively the result of incorrect rich comparator implementations. It will be made a :exc:`TypeError` in a future version From 46f54defdbd5c29d0dc238dea4d061b52c6c63fd Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 18 Sep 2020 09:54:42 +0300 Subject: [PATCH 0117/1261] Remove duplicated words words (GH-22298) --- Doc/library/tkinter.font.rst | 4 ++-- Doc/whatsnew/3.9.rst | 2 +- .../next/Library/2020-06-02-23-49-07.bpo-32604.ZN4V4l.rst | 2 +- .../next/Library/2020-06-04-16-25-15.bpo-40807.yYyLWx.rst | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/library/tkinter.font.rst b/Doc/library/tkinter.font.rst index 30c1e7b5f9eb43..b0f4505e9e3c69 100644 --- a/Doc/library/tkinter.font.rst +++ b/Doc/library/tkinter.font.rst @@ -38,8 +38,8 @@ The different font weights and slants are: | *family* - font family i.e. Courier, Times | *size* - font size | If *size* is positive it is interpreted as size in points. - | If *size* is a negative number its absolute value is treated as - as size in pixels. + | If *size* is a negative number its absolute value is treated + | as size in pixels. | *weight* - font emphasis (NORMAL, BOLD) | *slant* - ROMAN, ITALIC | *underline* - font underlining (0 - none, 1 - underline) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index b3cc84d07f38d5..e9fc496e47e24e 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -887,7 +887,7 @@ Removed deprecated since 2006, and only returning ``False`` when it's called. (Contributed by Batuhan Taskaya in :issue:`40208`) -* The :meth:`asyncio.Task.current_task` and :meth:`asyncio.Task.all_tasks` have +* The :meth:`asyncio.Task.current_task` and :meth:`asyncio.Task.all_tasks` have been removed. They were deprecated since Python 3.7 and you can use :func:`asyncio.current_task` and :func:`asyncio.all_tasks` instead. (Contributed by Rémi Lapeyre in :issue:`40967`) diff --git a/Misc/NEWS.d/next/Library/2020-06-02-23-49-07.bpo-32604.ZN4V4l.rst b/Misc/NEWS.d/next/Library/2020-06-02-23-49-07.bpo-32604.ZN4V4l.rst index 6375276602e4a3..af284b06eaed6e 100644 --- a/Misc/NEWS.d/next/Library/2020-06-02-23-49-07.bpo-32604.ZN4V4l.rst +++ b/Misc/NEWS.d/next/Library/2020-06-02-23-49-07.bpo-32604.ZN4V4l.rst @@ -1,2 +1,2 @@ -Fix reference leak in the :mod:`select` module when the the module is +Fix reference leak in the :mod:`select` module when the module is imported in a subinterpreter. diff --git a/Misc/NEWS.d/next/Library/2020-06-04-16-25-15.bpo-40807.yYyLWx.rst b/Misc/NEWS.d/next/Library/2020-06-04-16-25-15.bpo-40807.yYyLWx.rst index 532b809b77eed3..c64a86295d7700 100644 --- a/Misc/NEWS.d/next/Library/2020-06-04-16-25-15.bpo-40807.yYyLWx.rst +++ b/Misc/NEWS.d/next/Library/2020-06-04-16-25-15.bpo-40807.yYyLWx.rst @@ -1,2 +1,2 @@ Stop codeop._maybe_compile, used by code.InteractiveInterpreter (and IDLE). -from from emitting each warning three times. +from emitting each warning three times. From 80192cede3f6f57fb400347c97361143bdddeea4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 18 Sep 2020 09:10:15 +0200 Subject: [PATCH 0118/1261] bpo-41762: Fix usage of productionlist markup in the doc (GH-22281) Use an unique identifier for the different grammars documented using the Sphinx productionlist markup. productionlist markups of the same grammar, like "expressions" or "compound statements", use the same identifier "python-grammar". --- Doc/library/functions.rst | 2 +- Doc/library/string.rst | 4 +- Doc/reference/compound_stmts.rst | 23 ++++++------ Doc/reference/expressions.rst | 54 +++++++++++++-------------- Doc/reference/introduction.rst | 2 +- Doc/reference/lexical_analysis.rst | 14 +++---- Doc/reference/simple_stmts.rst | 34 ++++++++--------- Doc/reference/toplevel_components.rst | 6 +-- 8 files changed, 70 insertions(+), 69 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index d381d43d8e99c3..7543fc4b10d466 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -596,7 +596,7 @@ are always available. They are listed here in alphabetical order. input must conform to the following grammar after leading and trailing whitespace characters are removed: - .. productionlist:: + .. productionlist:: float sign: "+" | "-" infinity: "Infinity" | "inf" nan: "nan" diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 62e86d6dd97066..91f43e9353d915 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -205,7 +205,7 @@ literal text, it can be escaped by doubling: ``{{`` and ``}}``. The grammar for a replacement field is as follows: - .. productionlist:: sf + .. productionlist:: format-string replacement_field: "{" [`field_name`] ["!" `conversion`] [":" `format_spec`] "}" field_name: arg_name ("." `attribute_name` | "[" `element_index` "]")* arg_name: [`identifier` | `digit`+] @@ -308,7 +308,7 @@ non-empty format specification typically modifies the result. The general form of a *standard format specifier* is: -.. productionlist:: +.. productionlist:: format-spec format_spec: [[`fill`]`align`][`sign`][#][0][`width`][`grouping_option`][.`precision`][`type`] fill: align: "<" | ">" | "=" | "^" diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index df720f6cc32380..158d6a8f164e23 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -44,7 +44,8 @@ executed:: Summarizing: -.. productionlist:: + +.. productionlist:: python-grammar compound_stmt: `if_stmt` : | `while_stmt` : | `for_stmt` @@ -89,7 +90,7 @@ The :keyword:`!if` statement The :keyword:`if` statement is used for conditional execution: -.. productionlist:: +.. productionlist:: python-grammar if_stmt: "if" `assignment_expression` ":" `suite` : ("elif" `assignment_expression` ":" `suite`)* : ["else" ":" `suite`] @@ -115,7 +116,7 @@ The :keyword:`!while` statement The :keyword:`while` statement is used for repeated execution as long as an expression is true: -.. productionlist:: +.. productionlist:: python-grammar while_stmt: "while" `assignment_expression` ":" `suite` : ["else" ":" `suite`] @@ -151,7 +152,7 @@ The :keyword:`!for` statement The :keyword:`for` statement is used to iterate over the elements of a sequence (such as a string, tuple or list) or other iterable object: -.. productionlist:: +.. productionlist:: python-grammar for_stmt: "for" `target_list` "in" `expression_list` ":" `suite` : ["else" ":" `suite`] @@ -234,7 +235,7 @@ The :keyword:`!try` statement The :keyword:`try` statement specifies exception handlers and/or cleanup code for a group of statements: -.. productionlist:: +.. productionlist:: python-grammar try_stmt: `try1_stmt` | `try2_stmt` try1_stmt: "try" ":" `suite` : ("except" [`expression` ["as" `identifier`]] ":" `suite`)+ @@ -390,7 +391,7 @@ methods defined by a context manager (see section :ref:`context-managers`). This allows common :keyword:`try`...\ :keyword:`except`...\ :keyword:`finally` usage patterns to be encapsulated for convenient reuse. -.. productionlist:: +.. productionlist:: python-grammar with_stmt: "with" `with_item` ("," `with_item`)* ":" `suite` with_item: `expression` ["as" `target`] @@ -503,7 +504,7 @@ Function definitions A function definition defines a user-defined function object (see section :ref:`types`): -.. productionlist:: +.. productionlist:: python-grammar funcdef: [`decorators`] "def" `funcname` "(" [`parameter_list`] ")" : ["->" `expression`] ":" `suite` decorators: `decorator`+ @@ -670,7 +671,7 @@ Class definitions A class definition defines a class object (see section :ref:`types`): -.. productionlist:: +.. productionlist:: python-grammar classdef: [`decorators`] "class" `classname` [`inheritance`] ":" `suite` inheritance: "(" [`argument_list`] ")" classname: `identifier` @@ -762,7 +763,7 @@ Coroutines Coroutine function definition ----------------------------- -.. productionlist:: +.. productionlist:: python-grammar async_funcdef: [`decorators`] "async" "def" `funcname` "(" [`parameter_list`] ")" : ["->" `expression`] ":" `suite` @@ -795,7 +796,7 @@ An example of a coroutine function:: The :keyword:`!async for` statement ----------------------------------- -.. productionlist:: +.. productionlist:: python-grammar async_for_stmt: "async" `for_stmt` An :term:`asynchronous iterable` is able to call asynchronous code in its @@ -840,7 +841,7 @@ body of a coroutine function. The :keyword:`!async with` statement ------------------------------------ -.. productionlist:: +.. productionlist:: python-grammar async_with_stmt: "async" `with_stmt` An :term:`asynchronous context manager` is a :term:`context manager` that is diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 18abce3c510bdb..b68c29860cf332 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -13,7 +13,7 @@ This chapter explains the meaning of the elements of expressions in Python. be used to describe syntax, not lexical analysis. When (one alternative of) a syntax rule has the form -.. productionlist:: * +.. productionlist:: python-grammar name: `othername` and no semantics are given, the semantics of this form of ``name`` are the same @@ -54,7 +54,7 @@ Atoms are the most basic elements of expressions. The simplest atoms are identifiers or literals. Forms enclosed in parentheses, brackets or braces are also categorized syntactically as atoms. The syntax for atoms is: -.. productionlist:: +.. productionlist:: python-grammar atom: `identifier` | `literal` | `enclosure` enclosure: `parenth_form` | `list_display` | `dict_display` | `set_display` : | `generator_expression` | `yield_atom` @@ -103,7 +103,7 @@ Literals Python supports string and bytes literals and various numeric literals: -.. productionlist:: +.. productionlist:: python-grammar literal: `stringliteral` | `bytesliteral` : | `integer` | `floatnumber` | `imagnumber` @@ -134,7 +134,7 @@ Parenthesized forms A parenthesized form is an optional expression list enclosed in parentheses: -.. productionlist:: +.. productionlist:: python-grammar parenth_form: "(" [`starred_expression`] ")" A parenthesized expression list yields whatever that expression list yields: if @@ -177,7 +177,7 @@ called "displays", each of them in two flavors: Common syntax elements for comprehensions are: -.. productionlist:: +.. productionlist:: python-grammar comprehension: `assignment_expression` `comp_for` comp_for: ["async"] "for" `target_list` "in" `or_test` [`comp_iter`] comp_iter: `comp_for` | `comp_if` @@ -243,7 +243,7 @@ List displays A list display is a possibly empty series of expressions enclosed in square brackets: -.. productionlist:: +.. productionlist:: python-grammar list_display: "[" [`starred_list` | `comprehension`] "]" A list display yields a new list object, the contents being specified by either @@ -267,7 +267,7 @@ Set displays A set display is denoted by curly braces and distinguishable from dictionary displays by the lack of colons separating keys and values: -.. productionlist:: +.. productionlist:: python-grammar set_display: "{" (`starred_list` | `comprehension`) "}" A set display yields a new mutable set object, the contents being specified by @@ -296,7 +296,7 @@ Dictionary displays A dictionary display is a possibly empty series of key/datum pairs enclosed in curly braces: -.. productionlist:: +.. productionlist:: python-grammar dict_display: "{" [`key_datum_list` | `dict_comprehension`] "}" key_datum_list: `key_datum` ("," `key_datum`)* [","] key_datum: `expression` ":" `expression` | "**" `or_expr` @@ -355,7 +355,7 @@ Generator expressions A generator expression is a compact generator notation in parentheses: -.. productionlist:: +.. productionlist:: python-grammar generator_expression: "(" `expression` `comp_for` ")" A generator expression yields a new generator object. Its syntax is the same as @@ -409,7 +409,7 @@ Yield expressions pair: yield; expression pair: generator; function -.. productionlist:: +.. productionlist:: python-grammar yield_atom: "(" `yield_expression` ")" yield_expression: "yield" [`expression_list` | "from" `expression`] @@ -746,7 +746,7 @@ Primaries Primaries represent the most tightly bound operations of the language. Their syntax is: -.. productionlist:: +.. productionlist:: python-grammar primary: `atom` | `attributeref` | `subscription` | `slicing` | `call` @@ -761,7 +761,7 @@ Attribute references An attribute reference is a primary followed by a period and a name: -.. productionlist:: +.. productionlist:: python-grammar attributeref: `primary` "." `identifier` .. index:: @@ -799,7 +799,7 @@ Subscriptions A subscription selects an item of a sequence (string, tuple or list) or mapping (dictionary) object: -.. productionlist:: +.. productionlist:: python-grammar subscription: `primary` "[" `expression_list` "]" The primary must evaluate to an object that supports subscription (lists or @@ -855,7 +855,7 @@ A slicing selects a range of items in a sequence object (e.g., a string, tuple or list). Slicings may be used as expressions or as targets in assignment or :keyword:`del` statements. The syntax for a slicing: -.. productionlist:: +.. productionlist:: python-grammar slicing: `primary` "[" `slice_list` "]" slice_list: `slice_item` ("," `slice_item`)* [","] slice_item: `expression` | `proper_slice` @@ -905,7 +905,7 @@ Calls A call calls a callable object (e.g., a :term:`function`) with a possibly empty series of :term:`arguments `: -.. productionlist:: +.. productionlist:: python-grammar call: `primary` "(" [`argument_list` [","] | `comprehension`] ")" argument_list: `positional_arguments` ["," `starred_and_keywords`] : ["," `keywords_arguments`] @@ -1088,7 +1088,7 @@ Await expression Suspend the execution of :term:`coroutine` on an :term:`awaitable` object. Can only be used inside a :term:`coroutine function`. -.. productionlist:: +.. productionlist:: python-grammar await_expr: "await" `primary` .. versionadded:: 3.5 @@ -1106,7 +1106,7 @@ The power operator The power operator binds more tightly than unary operators on its left; it binds less tightly than unary operators on its right. The syntax is: -.. productionlist:: +.. productionlist:: python-grammar power: (`await_expr` | `primary`) ["**" `u_expr`] Thus, in an unparenthesized sequence of power and unary operators, the operators @@ -1139,7 +1139,7 @@ Unary arithmetic and bitwise operations All unary arithmetic and bitwise operations have the same priority: -.. productionlist:: +.. productionlist:: python-grammar u_expr: `power` | "-" `u_expr` | "+" `u_expr` | "~" `u_expr` .. index:: @@ -1183,7 +1183,7 @@ that some of these operations also apply to certain non-numeric types. Apart from the power operator, there are only two levels, one for multiplicative operators and one for additive operators: -.. productionlist:: +.. productionlist:: python-grammar m_expr: `u_expr` | `m_expr` "*" `u_expr` | `m_expr` "@" `m_expr` | : `m_expr` "//" `u_expr` | `m_expr` "/" `u_expr` | : `m_expr` "%" `u_expr` @@ -1279,7 +1279,7 @@ Shifting operations The shifting operations have lower priority than the arithmetic operations: -.. productionlist:: +.. productionlist:: python-grammar shift_expr: `a_expr` | `shift_expr` ("<<" | ">>") `a_expr` These operators accept integers as arguments. They shift the first argument to @@ -1300,7 +1300,7 @@ Binary bitwise operations Each of the three bitwise operations has a different priority level: -.. productionlist:: +.. productionlist:: python-grammar and_expr: `shift_expr` | `and_expr` "&" `shift_expr` xor_expr: `and_expr` | `xor_expr` "^" `and_expr` or_expr: `xor_expr` | `or_expr` "|" `xor_expr` @@ -1349,7 +1349,7 @@ lower than that of any arithmetic, shifting or bitwise operation. Also unlike C, expressions like ``a < b < c`` have the interpretation that is conventional in mathematics: -.. productionlist:: +.. productionlist:: python-grammar comparison: `or_expr` (`comp_operator` `or_expr`)* comp_operator: "<" | ">" | "==" | ">=" | "<=" | "!=" : | "is" ["not"] | ["not"] "in" @@ -1608,7 +1608,7 @@ Boolean operations pair: Conditional; expression pair: Boolean; operation -.. productionlist:: +.. productionlist:: python-grammar or_test: `and_test` | `or_test` "or" `and_test` and_test: `not_test` | `and_test` "and" `not_test` not_test: `comparison` | "not" `not_test` @@ -1647,7 +1647,7 @@ returns a boolean value regardless of the type of its argument Assignment expressions ====================== -.. productionlist:: +.. productionlist:: python-grammar assignment_expression: [`identifier` ":="] `expression` An assignment expression (sometimes also called a "named expression" or @@ -1683,7 +1683,7 @@ Conditional expressions single: if; conditional expression single: else; conditional expression -.. productionlist:: +.. productionlist:: python-grammar conditional_expression: `or_test` ["if" `or_test` "else" `expression`] expression: `conditional_expression` | `lambda_expr` expression_nocond: `or_test` | `lambda_expr_nocond` @@ -1710,7 +1710,7 @@ Lambdas pair: anonymous; function single: : (colon); lambda expression -.. productionlist:: +.. productionlist:: python-grammar lambda_expr: "lambda" [`parameter_list`] ":" `expression` lambda_expr_nocond: "lambda" [`parameter_list`] ":" `expression_nocond` @@ -1737,7 +1737,7 @@ Expression lists pair: expression; list single: , (comma); expression list -.. productionlist:: +.. productionlist:: python-grammar expression_list: `expression` ("," `expression`)* [","] starred_list: `starred_item` ("," `starred_item`)* [","] starred_expression: `expression` | (`starred_item` ",")* [`starred_item`] diff --git a/Doc/reference/introduction.rst b/Doc/reference/introduction.rst index 62480bd7dd9a61..72e874ee98e466 100644 --- a/Doc/reference/introduction.rst +++ b/Doc/reference/introduction.rst @@ -93,7 +93,7 @@ Notation The descriptions of lexical analysis and syntax use a modified BNF grammar notation. This uses the following style of definition: -.. productionlist:: +.. productionlist:: notation name: `lc_letter` (`lc_letter` | "_")* lc_letter: "a"..."z" diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 19ba83a5513d8a..77e0578f5d89b6 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -296,7 +296,7 @@ Unicode Character Database as included in the :mod:`unicodedata` module. Identifiers are unlimited in length. Case is significant. -.. productionlist:: +.. productionlist:: python-grammar identifier: `xid_start` `xid_continue`* id_start: id_continue: @@ -412,7 +412,7 @@ String and Bytes literals String literals are described by the following lexical definitions: -.. productionlist:: +.. productionlist:: python-grammar stringliteral: [`stringprefix`](`shortstring` | `longstring`) stringprefix: "r" | "u" | "R" | "U" | "f" | "F" : | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF" @@ -424,7 +424,7 @@ String literals are described by the following lexical definitions: longstringchar: stringescapeseq: "\" -.. productionlist:: +.. productionlist:: python-grammar bytesliteral: `bytesprefix`(`shortbytes` | `longbytes`) bytesprefix: "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB" shortbytes: "'" `shortbytesitem`* "'" | '"' `shortbytesitem`* '"' @@ -659,7 +659,7 @@ Escape sequences are decoded like in ordinary string literals (except when a literal is also marked as a raw string). After decoding, the grammar for the contents of the string is: -.. productionlist:: +.. productionlist:: python-grammar f_string: (`literal_char` | "{{" | "}}" | `replacement_field`)* replacement_field: "{" `f_expression` ["="] ["!" `conversion`] [":" `format_spec`] "}" f_expression: (`conditional_expression` | "*" `or_expr`) @@ -820,7 +820,7 @@ Integer literals Integer literals are described by the following lexical definitions: -.. productionlist:: +.. productionlist:: python-grammar integer: `decinteger` | `bininteger` | `octinteger` | `hexinteger` decinteger: `nonzerodigit` (["_"] `digit`)* | "0"+ (["_"] "0")* bininteger: "0" ("b" | "B") (["_"] `bindigit`)+ @@ -864,7 +864,7 @@ Floating point literals Floating point literals are described by the following lexical definitions: -.. productionlist:: +.. productionlist:: python-grammar floatnumber: `pointfloat` | `exponentfloat` pointfloat: [`digitpart`] `fraction` | `digitpart` "." exponentfloat: (`digitpart` | `pointfloat`) `exponent` @@ -894,7 +894,7 @@ Imaginary literals Imaginary literals are described by the following lexical definitions: -.. productionlist:: +.. productionlist:: python-grammar imagnumber: (`floatnumber` | `digitpart`) ("j" | "J") An imaginary literal yields a complex number with a real part of 0.0. Complex diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index a8ec0fbe8b732c..93be32713ff32a 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -11,7 +11,7 @@ A simple statement is comprised within a single logical line. Several simple statements may occur on a single line separated by semicolons. The syntax for simple statements is: -.. productionlist:: +.. productionlist:: python-grammar simple_stmt: `expression_stmt` : | `assert_stmt` : | `assignment_stmt` @@ -46,7 +46,7 @@ result; in Python, procedures return the value ``None``). Other uses of expression statements are allowed and occasionally useful. The syntax for an expression statement is: -.. productionlist:: +.. productionlist:: python-grammar expression_stmt: `starred_expression` An expression statement evaluates the expression list (which may be a single @@ -82,7 +82,7 @@ Assignment statements Assignment statements are used to (re)bind names to values and to modify attributes or items of mutable objects: -.. productionlist:: +.. productionlist:: python-grammar assignment_stmt: (`target_list` "=")+ (`starred_expression` | `yield_expression`) target_list: `target` ("," `target`)* [","] target: `identifier` @@ -280,7 +280,7 @@ Augmented assignment statements Augmented assignment is the combination, in a single statement, of a binary operation and an assignment statement: -.. productionlist:: +.. productionlist:: python-grammar augmented_assignment_stmt: `augtarget` `augop` (`expression_list` | `yield_expression`) augtarget: `identifier` | `attributeref` | `subscription` | `slicing` augop: "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**=" @@ -328,7 +328,7 @@ Annotated assignment statements :term:`Annotation ` assignment is the combination, in a single statement, of a variable or attribute annotation and an optional assignment statement: -.. productionlist:: +.. productionlist:: python-grammar annotated_assignment_stmt: `augtarget` ":" `expression` : ["=" (`starred_expression` | `yield_expression`)] @@ -385,7 +385,7 @@ The :keyword:`!assert` statement Assert statements are a convenient way to insert debugging assertions into a program: -.. productionlist:: +.. productionlist:: python-grammar assert_stmt: "assert" `expression` ["," `expression`] The simple form, ``assert expression``, is equivalent to :: @@ -425,7 +425,7 @@ The :keyword:`!pass` statement pair: null; operation pair: null; operation -.. productionlist:: +.. productionlist:: python-grammar pass_stmt: "pass" :keyword:`pass` is a null operation --- when it is executed, nothing happens. @@ -447,7 +447,7 @@ The :keyword:`!del` statement pair: deletion; target triple: deletion; target; list -.. productionlist:: +.. productionlist:: python-grammar del_stmt: "del" `target_list` Deletion is recursively defined very similar to the way assignment is defined. @@ -486,7 +486,7 @@ The :keyword:`!return` statement pair: function; definition pair: class; definition -.. productionlist:: +.. productionlist:: python-grammar return_stmt: "return" [`expression_list`] :keyword:`return` may only occur syntactically nested in a function definition, @@ -525,7 +525,7 @@ The :keyword:`!yield` statement single: function; generator exception: StopIteration -.. productionlist:: +.. productionlist:: python-grammar yield_stmt: `yield_expression` A :keyword:`yield` statement is semantically equivalent to a :ref:`yield @@ -560,7 +560,7 @@ The :keyword:`!raise` statement pair: raising; exception single: __traceback__ (exception attribute) -.. productionlist:: +.. productionlist:: python-grammar raise_stmt: "raise" [`expression` ["from" `expression`]] If no expressions are present, :keyword:`raise` re-raises the last exception @@ -663,7 +663,7 @@ The :keyword:`!break` statement statement: while pair: loop; statement -.. productionlist:: +.. productionlist:: python-grammar break_stmt: "break" :keyword:`break` may only occur syntactically nested in a :keyword:`for` or @@ -698,7 +698,7 @@ The :keyword:`!continue` statement pair: loop; statement keyword: finally -.. productionlist:: +.. productionlist:: python-grammar continue_stmt: "continue" :keyword:`continue` may only occur syntactically nested in a :keyword:`for` or @@ -725,7 +725,7 @@ The :keyword:`!import` statement exception: ImportError single: , (comma); import statement -.. productionlist:: +.. productionlist:: python-grammar import_stmt: "import" `module` ["as" `identifier`] ("," `module` ["as" `identifier`])* : | "from" `relative_module` "import" `identifier` ["as" `identifier`] : ("," `identifier` ["as" `identifier`])* @@ -859,7 +859,7 @@ that introduce incompatible changes to the language. It allows use of the new features on a per-module basis before the release in which the feature becomes standard. -.. productionlist:: * +.. productionlist:: python-grammar future_stmt: "from" "__future__" "import" `feature` ["as" `identifier`] : ("," `feature` ["as" `identifier`])* : | "from" "__future__" "import" "(" `feature` ["as" `identifier`] @@ -937,7 +937,7 @@ The :keyword:`!global` statement triple: global; name; binding single: , (comma); identifier list -.. productionlist:: +.. productionlist:: python-grammar global_stmt: "global" `identifier` ("," `identifier`)* The :keyword:`global` statement is a declaration which holds for the entire @@ -982,7 +982,7 @@ The :keyword:`!nonlocal` statement .. index:: statement: nonlocal single: , (comma); identifier list -.. productionlist:: +.. productionlist:: python-grammar nonlocal_stmt: "nonlocal" `identifier` ("," `identifier`)* .. XXX add when implemented diff --git a/Doc/reference/toplevel_components.rst b/Doc/reference/toplevel_components.rst index d5ffb37b2e58cd..319c9de484241e 100644 --- a/Doc/reference/toplevel_components.rst +++ b/Doc/reference/toplevel_components.rst @@ -66,7 +66,7 @@ File input All input read from non-interactive files has the same form: -.. productionlist:: +.. productionlist:: python-grammar file_input: (NEWLINE | `statement`)* This syntax is used in the following situations: @@ -85,7 +85,7 @@ Interactive input Input in interactive mode is parsed using the following grammar: -.. productionlist:: +.. productionlist:: python-grammar interactive_input: [`stmt_list`] NEWLINE | `compound_stmt` NEWLINE Note that a (top-level) compound statement must be followed by a blank line in @@ -103,5 +103,5 @@ Expression input :func:`eval` is used for expression input. It ignores leading whitespace. The string argument to :func:`eval` must have the following form: -.. productionlist:: +.. productionlist:: python-grammar eval_input: `expression_list` NEWLINE* From 013354edc9015c75a48ea41f2a03c554255913f8 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 18 Sep 2020 18:22:36 +0900 Subject: [PATCH 0119/1261] bpo-35293: Remove RemovedInSphinx40Warning (GH-22198) * bpo-35293: Remove RemovedInSphinx40Warning * Update Misc/NEWS.d/next/Documentation/2020-09-12-17-37-13.bpo-35293._cOwPD.rst Co-authored-by: Victor Stinner * bpo-35293: Apply Victor's review Co-authored-by: Victor Stinner --- Doc/tools/extensions/pyspecific.py | 36 +++++++++++-------- .../2020-09-12-17-37-13.bpo-35293._cOwPD.rst | 1 + 2 files changed, 22 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2020-09-12-17-37-13.bpo-35293._cOwPD.rst diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 008dd8a6f7c8cd..80fbd96d56fdc0 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -31,7 +31,12 @@ from sphinx.util.nodes import split_explicit_title from sphinx.writers.text import TextWriter, TextTranslator from sphinx.writers.latex import LaTeXTranslator -from sphinx.domains.python import PyModulelevel, PyClassmember + +try: + from sphinx.domains.python import PyFunction, PyMethod +except ImportError: + from sphinx.domains.python import PyClassmember as PyMethod + from sphinx.domains.python import PyModulelevel as PyFunction # Support for checking for suspicious markup @@ -271,17 +276,18 @@ def needs_arglist(self): return False -class PyDecoratorFunction(PyDecoratorMixin, PyModulelevel): +class PyDecoratorFunction(PyDecoratorMixin, PyFunction): def run(self): # a decorator function is a function after all self.name = 'py:function' - return PyModulelevel.run(self) + return PyFunction.run(self) -class PyDecoratorMethod(PyDecoratorMixin, PyClassmember): +# TODO: Use sphinx.domains.python.PyDecoratorMethod when possible +class PyDecoratorMethod(PyDecoratorMixin, PyMethod): def run(self): self.name = 'py:method' - return PyClassmember.run(self) + return PyMethod.run(self) class PyCoroutineMixin(object): @@ -298,31 +304,31 @@ def handle_signature(self, sig, signode): return ret -class PyCoroutineFunction(PyCoroutineMixin, PyModulelevel): +class PyCoroutineFunction(PyCoroutineMixin, PyFunction): def run(self): self.name = 'py:function' - return PyModulelevel.run(self) + return PyFunction.run(self) -class PyCoroutineMethod(PyCoroutineMixin, PyClassmember): +class PyCoroutineMethod(PyCoroutineMixin, PyMethod): def run(self): self.name = 'py:method' - return PyClassmember.run(self) + return PyMethod.run(self) -class PyAwaitableFunction(PyAwaitableMixin, PyClassmember): +class PyAwaitableFunction(PyAwaitableMixin, PyFunction): def run(self): self.name = 'py:function' - return PyClassmember.run(self) + return PyFunction.run(self) -class PyAwaitableMethod(PyAwaitableMixin, PyClassmember): +class PyAwaitableMethod(PyAwaitableMixin, PyMethod): def run(self): self.name = 'py:method' - return PyClassmember.run(self) + return PyMethod.run(self) -class PyAbstractMethod(PyClassmember): +class PyAbstractMethod(PyMethod): def handle_signature(self, sig, signode): ret = super(PyAbstractMethod, self).handle_signature(sig, signode) @@ -332,7 +338,7 @@ def handle_signature(self, sig, signode): def run(self): self.name = 'py:method' - return PyClassmember.run(self) + return PyMethod.run(self) # Support for documenting version of removal in deprecations diff --git a/Misc/NEWS.d/next/Documentation/2020-09-12-17-37-13.bpo-35293._cOwPD.rst b/Misc/NEWS.d/next/Documentation/2020-09-12-17-37-13.bpo-35293._cOwPD.rst new file mode 100644 index 00000000000000..089d44e35d2baa --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-09-12-17-37-13.bpo-35293._cOwPD.rst @@ -0,0 +1 @@ +Fix RemovedInSphinx40Warning when building the documentation. Patch by Dong-hee Na. From 77ec53f47329d280bfd2d8d6832eb7e751863a33 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 18 Sep 2020 16:23:18 +0200 Subject: [PATCH 0120/1261] bpo-35293: Travis CI uses "make venv" for the doc (GH-22307) Doc/requirements.txt becomes the reference for packages and package versions needed to build the Python documentation. * Doc/Makefile now uses Doc/requirements.txt * .travis.yml now uses "make env" of Doc/Makefile --- .travis.yml | 5 +---- Doc/Makefile | 2 +- Doc/requirements.txt | 13 ++++++++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index a915f7a46ec3d5..254a4ea35ab944 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,10 +51,7 @@ matrix: env: TESTING=docs before_script: - cd Doc - # Sphinx is pinned so that new versions that introduce new warnings won't suddenly cause build failures. - # (Updating the version is fine as long as no warnings are raised by doing so.) - # The theme used by the docs is stored separately, so we need to install that as well. - - python -m pip install sphinx==2.2.0 blurb python-docs-theme + - make venv PYTHON=python script: - make check suspicious html SPHINXOPTS="-q -W -j4" - name: "Documentation tests" diff --git a/Doc/Makefile b/Doc/Makefile index c11a7ca5c1bcb7..f653d70674eb1c 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -143,7 +143,7 @@ clean: venv: $(PYTHON) -m venv $(VENVDIR) $(VENVDIR)/bin/python3 -m pip install -U pip setuptools - $(VENVDIR)/bin/python3 -m pip install -U Sphinx==3.2.1 blurb python-docs-theme + $(VENVDIR)/bin/python3 -m pip install -r requirements.txt @echo "The venv has been created in the $(VENVDIR) directory" dist: diff --git a/Doc/requirements.txt b/Doc/requirements.txt index 198446b350ff2d..2b70af3a4fc6b9 100644 --- a/Doc/requirements.txt +++ b/Doc/requirements.txt @@ -1,5 +1,12 @@ -# Requirements for docs build on netlify -# Pin sphinx to version specified in .travis.yml -sphinx==2.2.0 +# Requirements to build the Python documentation + +# Sphinx version is pinned so that new versions that introduce new warnings +# won't suddenly cause build failures. Updating the version is fine as long +# as no warnings are raised by doing so. +sphinx==3.2.1 + blurb + +# The theme used by the documentation is stored separately, so we need +# to install that as well. python-docs-theme From b7c74b36213233c07895e6099124b10cb2b513a8 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 18 Sep 2020 17:57:28 -0700 Subject: [PATCH 0121/1261] Make fractional value accumulation consistent inside and outside the loop. (GH-22315) --- Modules/mathmodule.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index ecd291ecd1b4b0..935759ec671ca5 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2550,8 +2550,7 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan) assert(csum + lo * lo == csum); frac_lo += lo * lo; } - frac += frac_lo + frac_mid; - h = sqrt(csum - 1.0 + frac); + h = sqrt(csum - 1.0 + (frac_lo + frac_mid + frac)); x = h; t = x * T27; @@ -2569,15 +2568,15 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan) assert(fabs(csum) >= fabs(x)); oldcsum = csum; csum += x; - frac += (oldcsum - csum) + x; + frac_mid += (oldcsum - csum) + x; x = -lo * lo; assert(fabs(csum) >= fabs(x)); oldcsum = csum; csum += x; - frac += (oldcsum - csum) + x; + frac_lo += (oldcsum - csum) + x; - x = csum - 1.0 + frac; + x = csum - 1.0 + (frac_lo + frac_mid + frac); return (h + x / (2.0 * h)) / scale; } /* When max_e < -1023, ldexp(1.0, -max_e) overflows. From 32b61cced6d97673c15708c69ae9177427ffa253 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 18 Sep 2020 18:38:38 -0700 Subject: [PATCH 0122/1261] bpo-41756: Introduce PyGen_Send C API (GH-22196) The new API allows to efficiently send values into native generators and coroutines avoiding use of StopIteration exceptions to signal returns. ceval loop now uses this method instead of the old "private" _PyGen_Send C API. This translates to 1.6x increased performance of 'await' calls in micro-benchmarks. Aside from CPython core improvements, this new API will also allow Cython to generate more efficient code, benefiting high-performance IO libraries like uvloop. --- Doc/c-api/gen.rst | 15 +++++ Doc/data/refcounts.dat | 5 ++ Include/genobject.h | 15 +++++ .../2020-09-12-12-55-45.bpo-41756.1h0tbV.rst | 2 + Modules/_asynciomodule.c | 27 ++++++-- Objects/genobject.c | 65 ++++++++++++++----- Python/ceval.c | 58 ++++++++++++----- 7 files changed, 148 insertions(+), 39 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-12-12-55-45.bpo-41756.1h0tbV.rst diff --git a/Doc/c-api/gen.rst b/Doc/c-api/gen.rst index 74410927bfde10..e098425e6364d9 100644 --- a/Doc/c-api/gen.rst +++ b/Doc/c-api/gen.rst @@ -15,6 +15,11 @@ than explicitly calling :c:func:`PyGen_New` or :c:func:`PyGen_NewWithQualName`. The C structure used for generator objects. +.. c:type:: PySendResult + + The enum value used to represent different results of :c:func:`PyGen_Send`. + + .. c:var:: PyTypeObject PyGen_Type The type object corresponding to generator objects. @@ -42,3 +47,13 @@ than explicitly calling :c:func:`PyGen_New` or :c:func:`PyGen_NewWithQualName`. with ``__name__`` and ``__qualname__`` set to *name* and *qualname*. A reference to *frame* is stolen by this function. The *frame* argument must not be ``NULL``. + +.. c:function:: PySendResult PyGen_Send(PyGenObject *gen, PyObject *arg, PyObject **presult) + + Sends the *arg* value into the generator *gen*. Coroutine objects + are also allowed to be as the *gen* argument but they need to be + explicitly casted to PyGenObject*. Returns: + + - ``PYGEN_RETURN`` if generator returns. Return value is returned via *presult*. + - ``PYGEN_NEXT`` if generator yields. Yielded value is returned via *presult*. + - ``PYGEN_ERROR`` if generator has raised and exception. *presult* is set to ``NULL``. diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index 355a4d6d3fa7ba..6b1bde37967ae9 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -959,6 +959,11 @@ PyGen_NewWithQualName:PyFrameObject*:frame:0: PyGen_NewWithQualName:PyObject*:name:0: PyGen_NewWithQualName:PyObject*:qualname:0: +PyGen_Send:int::: +PyGen_Send:PyGenObject*:gen:0: +PyGen_Send:PyObject*:arg:0: +PyGen_Send:PyObject**:presult:+1: + PyCoro_CheckExact:int::: PyCoro_CheckExact:PyObject*:ob:0: diff --git a/Include/genobject.h b/Include/genobject.h index a76dc92e811c42..7488054c68fcd8 100644 --- a/Include/genobject.h +++ b/Include/genobject.h @@ -45,6 +45,21 @@ PyAPI_FUNC(PyObject *) _PyGen_Send(PyGenObject *, PyObject *); PyObject *_PyGen_yf(PyGenObject *); PyAPI_FUNC(void) _PyGen_Finalize(PyObject *self); +typedef enum { + PYGEN_RETURN = 0, + PYGEN_ERROR = -1, + PYGEN_NEXT = 1, +} PySendResult; + +/* Sends the value into the generator or the coroutine. Returns: + - PYGEN_RETURN (0) if generator has returned. + 'result' parameter is filled with return value + - PYGEN_ERROR (-1) if exception was raised. + 'result' parameter is NULL + - PYGEN_NEXT (1) if generator has yielded. + 'result' parameter is filled with yielded value. */ +PyAPI_FUNC(PySendResult) PyGen_Send(PyGenObject *, PyObject *, PyObject **); + #ifndef Py_LIMITED_API typedef struct { _PyGenObject_HEAD(cr) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-12-12-55-45.bpo-41756.1h0tbV.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-12-12-55-45.bpo-41756.1h0tbV.rst new file mode 100644 index 00000000000000..b387cfd94033c9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-12-12-55-45.bpo-41756.1h0tbV.rst @@ -0,0 +1,2 @@ +Add PyGen_Send function to allow sending value into generator/coroutine +without raising StopIteration exception to signal return diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 4a1c91e9eddd67..2151f20281a31b 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -2621,6 +2621,20 @@ task_set_error_soon(TaskObj *task, PyObject *et, const char *format, ...) Py_RETURN_NONE; } +static inline int +gen_status_from_result(PyObject **result) +{ + if (*result != NULL) { + return PYGEN_NEXT; + } + if (_PyGen_FetchStopIterationValue(result) == 0) { + return PYGEN_RETURN; + } + + assert(PyErr_Occurred()); + return PYGEN_ERROR; +} + static PyObject * task_step_impl(TaskObj *task, PyObject *exc) { @@ -2679,26 +2693,29 @@ task_step_impl(TaskObj *task, PyObject *exc) return NULL; } + int gen_status = PYGEN_ERROR; if (exc == NULL) { if (PyGen_CheckExact(coro) || PyCoro_CheckExact(coro)) { - result = _PyGen_Send((PyGenObject*)coro, Py_None); + gen_status = PyGen_Send((PyGenObject*)coro, Py_None, &result); } else { result = _PyObject_CallMethodIdOneArg(coro, &PyId_send, Py_None); + gen_status = gen_status_from_result(&result); } } else { result = _PyObject_CallMethodIdOneArg(coro, &PyId_throw, exc); + gen_status = gen_status_from_result(&result); if (clear_exc) { /* We created 'exc' during this call */ Py_DECREF(exc); } } - if (result == NULL) { + if (gen_status == PYGEN_RETURN || gen_status == PYGEN_ERROR) { PyObject *et, *ev, *tb; - if (_PyGen_FetchStopIterationValue(&o) == 0) { + if (result != NULL) { /* The error is StopIteration and that means that the underlying coroutine has resolved */ @@ -2709,10 +2726,10 @@ task_step_impl(TaskObj *task, PyObject *exc) res = future_cancel((FutureObj*)task, task->task_cancel_msg); } else { - res = future_set_result((FutureObj*)task, o); + res = future_set_result((FutureObj*)task, result); } - Py_DECREF(o); + Py_DECREF(result); if (res == NULL) { return NULL; diff --git a/Objects/genobject.c b/Objects/genobject.c index 809838a4cd2f3b..24aca988354c5a 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -137,7 +137,7 @@ gen_dealloc(PyGenObject *gen) } static PyObject * -gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) +gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing, int *is_return_value) { PyThreadState *tstate = _PyThreadState_GET(); PyFrameObject *f = gen->gi_frame; @@ -170,6 +170,10 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) PyErr_SetNone(PyExc_StopAsyncIteration); } else { + if (is_return_value != NULL) { + *is_return_value = 1; + Py_RETURN_NONE; + } PyErr_SetNone(PyExc_StopIteration); } } @@ -230,18 +234,33 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) /* Delay exception instantiation if we can */ if (PyAsyncGen_CheckExact(gen)) { PyErr_SetNone(PyExc_StopAsyncIteration); + Py_CLEAR(result); } else if (arg) { - /* Set exception if not called by gen_iternext() */ - PyErr_SetNone(PyExc_StopIteration); + if (is_return_value != NULL) { + *is_return_value = 1; + } + else { + /* Set exception if not called by gen_iternext() */ + PyErr_SetNone(PyExc_StopIteration); + Py_CLEAR(result); + } + } + else { + Py_CLEAR(result); } } else { /* Async generators cannot return anything but None */ assert(!PyAsyncGen_CheckExact(gen)); - _PyGen_SetStopIterationValue(result); + if (is_return_value != NULL) { + *is_return_value = 1; + } + else { + _PyGen_SetStopIterationValue(result); + Py_CLEAR(result); + } } - Py_CLEAR(result); } else if (!result && PyErr_ExceptionMatches(PyExc_StopIteration)) { const char *msg = "generator raised StopIteration"; @@ -264,7 +283,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) _PyErr_FormatFromCause(PyExc_RuntimeError, "%s", msg); } - if (!result || _PyFrameHasCompleted(f)) { + if ((is_return_value && *is_return_value) || !result || _PyFrameHasCompleted(f)) { /* generator can't be rerun, so release the frame */ /* first clean reference cycle through stored exception traceback */ _PyErr_ClearExcState(&gen->gi_exc_state); @@ -283,7 +302,19 @@ return next yielded value or raise StopIteration."); PyObject * _PyGen_Send(PyGenObject *gen, PyObject *arg) { - return gen_send_ex(gen, arg, 0, 0); + return gen_send_ex(gen, arg, 0, 0, NULL); +} + +PySendResult +PyGen_Send(PyGenObject *gen, PyObject *arg, PyObject **result) +{ + assert(result != NULL); + + int is_return_value = 0; + if ((*result = gen_send_ex(gen, arg, 0, 0, &is_return_value)) == NULL) { + return PYGEN_ERROR; + } + return is_return_value ? PYGEN_RETURN : PYGEN_NEXT; } PyDoc_STRVAR(close_doc, @@ -365,7 +396,7 @@ gen_close(PyGenObject *gen, PyObject *args) } if (err == 0) PyErr_SetNone(PyExc_GeneratorExit); - retval = gen_send_ex(gen, Py_None, 1, 1); + retval = gen_send_ex(gen, Py_None, 1, 1, NULL); if (retval) { const char *msg = "generator ignored GeneratorExit"; if (PyCoro_CheckExact(gen)) { @@ -413,7 +444,7 @@ _gen_throw(PyGenObject *gen, int close_on_genexit, gen->gi_frame->f_state = state; Py_DECREF(yf); if (err < 0) - return gen_send_ex(gen, Py_None, 1, 0); + return gen_send_ex(gen, Py_None, 1, 0, NULL); goto throw_here; } if (PyGen_CheckExact(yf) || PyCoro_CheckExact(yf)) { @@ -465,10 +496,10 @@ _gen_throw(PyGenObject *gen, int close_on_genexit, assert(gen->gi_frame->f_lasti >= 0); gen->gi_frame->f_lasti += sizeof(_Py_CODEUNIT); if (_PyGen_FetchStopIterationValue(&val) == 0) { - ret = gen_send_ex(gen, val, 0, 0); + ret = gen_send_ex(gen, val, 0, 0, NULL); Py_DECREF(val); } else { - ret = gen_send_ex(gen, Py_None, 1, 0); + ret = gen_send_ex(gen, Py_None, 1, 0, NULL); } } return ret; @@ -522,7 +553,7 @@ _gen_throw(PyGenObject *gen, int close_on_genexit, } PyErr_Restore(typ, val, tb); - return gen_send_ex(gen, Py_None, 1, 0); + return gen_send_ex(gen, Py_None, 1, 0, NULL); failed_throw: /* Didn't use our arguments, so restore their original refcounts */ @@ -551,7 +582,7 @@ gen_throw(PyGenObject *gen, PyObject *args) static PyObject * gen_iternext(PyGenObject *gen) { - return gen_send_ex(gen, NULL, 0, 0); + return gen_send_ex(gen, NULL, 0, 0, NULL); } /* @@ -1051,13 +1082,13 @@ coro_wrapper_dealloc(PyCoroWrapper *cw) static PyObject * coro_wrapper_iternext(PyCoroWrapper *cw) { - return gen_send_ex((PyGenObject *)cw->cw_coroutine, NULL, 0, 0); + return gen_send_ex((PyGenObject *)cw->cw_coroutine, NULL, 0, 0, NULL); } static PyObject * coro_wrapper_send(PyCoroWrapper *cw, PyObject *arg) { - return gen_send_ex((PyGenObject *)cw->cw_coroutine, arg, 0, 0); + return gen_send_ex((PyGenObject *)cw->cw_coroutine, arg, 0, 0, NULL); } static PyObject * @@ -1570,7 +1601,7 @@ async_gen_asend_send(PyAsyncGenASend *o, PyObject *arg) } o->ags_gen->ag_running_async = 1; - result = gen_send_ex((PyGenObject*)o->ags_gen, arg, 0, 0); + result = gen_send_ex((PyGenObject*)o->ags_gen, arg, 0, 0, NULL); result = async_gen_unwrap_value(o->ags_gen, result); if (result == NULL) { @@ -1926,7 +1957,7 @@ async_gen_athrow_send(PyAsyncGenAThrow *o, PyObject *arg) assert(o->agt_state == AWAITABLE_STATE_ITER); - retval = gen_send_ex((PyGenObject *)gen, arg, 0, 0); + retval = gen_send_ex((PyGenObject *)gen, arg, 0, 0, NULL); if (o->agt_args) { return async_gen_unwrap_value(o->agt_gen, retval); } else { diff --git a/Python/ceval.c b/Python/ceval.c index f747faaebf024a..3de372f45a2517 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2223,29 +2223,53 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) case TARGET(YIELD_FROM): { PyObject *v = POP(); PyObject *receiver = TOP(); - int err; - if (PyGen_CheckExact(receiver) || PyCoro_CheckExact(receiver)) { - retval = _PyGen_Send((PyGenObject *)receiver, v); + int is_gen_or_coro = PyGen_CheckExact(receiver) || PyCoro_CheckExact(receiver); + int gen_status; + if (tstate->c_tracefunc == NULL && is_gen_or_coro) { + gen_status = PyGen_Send((PyGenObject *)receiver, v, &retval); } else { - _Py_IDENTIFIER(send); - if (v == Py_None) - retval = Py_TYPE(receiver)->tp_iternext(receiver); - else - retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v); + if (is_gen_or_coro) { + retval = _PyGen_Send((PyGenObject *)receiver, v); + } + else { + _Py_IDENTIFIER(send); + if (v == Py_None) { + retval = Py_TYPE(receiver)->tp_iternext(receiver); + } + else { + retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v); + } + } + + if (retval == NULL) { + if (tstate->c_tracefunc != NULL + && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) + call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f); + if (_PyGen_FetchStopIterationValue(&retval) == 0) { + gen_status = PYGEN_RETURN; + } + else { + gen_status = PYGEN_ERROR; + } + } + else { + gen_status = PYGEN_NEXT; + } } Py_DECREF(v); - if (retval == NULL) { - PyObject *val; - if (tstate->c_tracefunc != NULL - && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) - call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f); - err = _PyGen_FetchStopIterationValue(&val); - if (err < 0) - goto error; + if (gen_status == PYGEN_ERROR) { + assert (retval == NULL); + goto error; + } + if (gen_status == PYGEN_RETURN) { + assert (retval != NULL); + Py_DECREF(receiver); - SET_TOP(val); + SET_TOP(retval); + retval = NULL; DISPATCH(); } + assert (gen_status == PYGEN_NEXT); /* receiver remains on stack, retval is value to be yielded */ /* and repeat... */ assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT)); From 3275a2f9dc5ed815a08cf833184a4c2f880bfc34 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Sat, 19 Sep 2020 11:12:57 -0700 Subject: [PATCH 0123/1261] bpo-41811: create SortKey members using first given value (GH-22316) --- Lib/pstats.py | 6 +++--- Lib/test/test_pstats.py | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Lib/pstats.py b/Lib/pstats.py index e781b91c6052cf..0f93ae02c95074 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -45,9 +45,9 @@ class SortKey(str, Enum): TIME = 'time', 'tottime' def __new__(cls, *values): - obj = str.__new__(cls) - - obj._value_ = values[0] + value = values[0] + obj = str.__new__(cls, value) + obj._value_ = value for other_value in values[1:]: cls._value2member_map_[other_value] = obj obj._all_values = values diff --git a/Lib/test/test_pstats.py b/Lib/test/test_pstats.py index 10559deb6bcb23..4f78b99fd1cae7 100644 --- a/Lib/test/test_pstats.py +++ b/Lib/test/test_pstats.py @@ -95,5 +95,9 @@ def pass3(): pass self.assertIn('pass2', funcs_called) self.assertIn('pass3', funcs_called) + def test_SortKey_enum(self): + self.assertEqual(SortKey.FILENAME, 'filename') + self.assertNotEqual(SortKey.FILENAME, SortKey.CALLS) + if __name__ == "__main__": unittest.main() From 73e5bd4450fd585dc89cbf7587827277b5281c64 Mon Sep 17 00:00:00 2001 From: idomic Date: Sat, 19 Sep 2020 15:13:29 -0400 Subject: [PATCH 0124/1261] bpo-33689: Blank lines in .pth file cause a duplicate sys.path entry (GH-20679) --- Lib/site.py | 2 ++ Lib/test/test_site.py | 7 ++++++- .../next/Library/2020-06-06-14-09-55.bpo-33689.EFUDH7.rst | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-06-06-14-09-55.bpo-33689.EFUDH7.rst diff --git a/Lib/site.py b/Lib/site.py index 4c095774729c5e..4d3b869fff77a0 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -170,6 +170,8 @@ def addpackage(sitedir, name, known_paths): for n, line in enumerate(f): if line.startswith("#"): continue + if line.strip() == "": + continue try: if line.startswith(("import ", "import\t")): exec(line) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 97b5c5de95bbc2..d3ee68facdbc3d 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -161,6 +161,12 @@ def test_addpackage_import_bad_exec(self): self.assertRegex(err_out.getvalue(), 'Traceback') self.assertRegex(err_out.getvalue(), 'ModuleNotFoundError') + def test_addpackage_empty_lines(self): + # Issue 33689 + pth_dir, pth_fn = self.make_pth("\n\n \n\n") + known_paths = site.addpackage(pth_dir, pth_fn, set()) + self.assertEqual(known_paths, set()) + def test_addpackage_import_bad_pth_file(self): # Issue 5258 pth_dir, pth_fn = self.make_pth("abc\x00def\n") @@ -595,7 +601,6 @@ def test_startup_interactivehook_isolated_explicit(self): 'import site, sys; site.enablerlcompleter(); sys.exit(hasattr(sys, "__interactivehook__"))']).wait() self.assertTrue(r, "'__interactivehook__' not added by enablerlcompleter()") - @unittest.skipUnless(sys.platform == 'win32', "only supported on Windows") class _pthFileTests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2020-06-06-14-09-55.bpo-33689.EFUDH7.rst b/Misc/NEWS.d/next/Library/2020-06-06-14-09-55.bpo-33689.EFUDH7.rst new file mode 100644 index 00000000000000..bc0756d02ddc9e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-06-06-14-09-55.bpo-33689.EFUDH7.rst @@ -0,0 +1,4 @@ +Ignore empty or whitespace-only lines in .pth files. This matches the +documentated behavior. Before, empty lines caused the site-packages +dir to appear multiple times in sys.path. +By Ido Michael, contributors Malcolm Smith and Tal Einat. From 1338e56e833a56c0e8259328f4d7d0ee1e8cd06a Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Sat, 19 Sep 2020 21:38:11 +0100 Subject: [PATCH 0125/1261] Add missing whatsnew entry for TestCase.assertNoLogs (GH-22317) --- Doc/whatsnew/3.10.rst | 7 +++++++ Misc/ACKS | 1 + 2 files changed, 8 insertions(+) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index f6f276a8bfa495..ce888fec1d8c97 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -145,6 +145,13 @@ Add :data:`sys.orig_argv` attribute: the list of the original command line arguments passed to the Python executable. (Contributed by Victor Stinner in :issue:`23427`.) +unittest +-------- + +Add new method :meth:`~unittest.TestCase.assertNoLogs` to complement the +existing :meth:`~unittest.TestCase.assertLogs`. (Contributed by Kit Yan Choi +in :issue:`39385`.) + xml --- diff --git a/Misc/ACKS b/Misc/ACKS index d5bdb084a1e1ed..d23797a2f55574 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -306,6 +306,7 @@ Albert Chin-A-Young Adal Chiriliuc Matt Chisholm Lita Cho +Kit Yan Choi Sayan Chowdhury Yuan-Chao Chou Anders Chrigström From 68529ec30b42c210d6328bbb463bbfcf3dc2f622 Mon Sep 17 00:00:00 2001 From: Peter McCormick Date: Sat, 19 Sep 2020 23:40:46 -0400 Subject: [PATCH 0126/1261] bpo-41815: SQLite: segfault if backup called on closed database (GH-22322) # [bpo-41815](): SQLite: fix segfault if backup called on closed database Attempting to backup a closed database will trigger segfault: ```python import sqlite3 target = sqlite3.connect(':memory:') source = sqlite3.connect(':memory:') source.close() source.backup(target) ``` --- Lib/sqlite3/test/backup.py | 7 +++++++ .../next/Library/2020-09-19-23-14-54.bpo-41815.RNpuX3.rst | 2 ++ Modules/_sqlite/connection.c | 4 ++++ 3 files changed, 13 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-09-19-23-14-54.bpo-41815.RNpuX3.rst diff --git a/Lib/sqlite3/test/backup.py b/Lib/sqlite3/test/backup.py index 2752a4db337ddd..3637c4bb21b6db 100644 --- a/Lib/sqlite3/test/backup.py +++ b/Lib/sqlite3/test/backup.py @@ -35,6 +35,13 @@ def test_bad_target_closed_connection(self): with self.assertRaises(sqlite.ProgrammingError): self.cx.backup(bck) + def test_bad_source_closed_connection(self): + bck = sqlite.connect(':memory:') + source = sqlite.connect(":memory:") + source.close() + with self.assertRaises(sqlite.ProgrammingError): + source.backup(bck) + def test_bad_target_in_transaction(self): bck = sqlite.connect(':memory:') bck.execute('CREATE TABLE bar (key INTEGER)') diff --git a/Misc/NEWS.d/next/Library/2020-09-19-23-14-54.bpo-41815.RNpuX3.rst b/Misc/NEWS.d/next/Library/2020-09-19-23-14-54.bpo-41815.RNpuX3.rst new file mode 100644 index 00000000000000..3560db9bc5d355 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-19-23-14-54.bpo-41815.RNpuX3.rst @@ -0,0 +1,2 @@ +Fix SQLite3 segfault when backing up closed database. Patch contributed by +Peter David McCormick. diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index f765ba1df24669..81fc1335371a6f 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -1514,6 +1514,10 @@ pysqlite_connection_backup(pysqlite_Connection *self, PyObject *args, PyObject * sleep_ms = (int)ms; } + if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { + return NULL; + } + if (!pysqlite_check_connection((pysqlite_Connection *)target)) { return NULL; } From 35608ec609a130785a8a03d5b0c228be3a1d98c8 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 20 Sep 2020 09:38:07 +0300 Subject: [PATCH 0127/1261] bpo-12178: Fix escaping of escapechar in csv.writer() (GH-13710) Co-authored-by: Itay Elbirt --- Lib/test/test_csv.py | 14 ++++++++++++++ .../2019-05-31-23-54-28.bpo-12178.N6FLCZ.rst | 3 +++ Modules/_csv.c | 3 +++ 3 files changed, 20 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-05-31-23-54-28.bpo-12178.N6FLCZ.rst diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index 38160220853ea8..a98707ce3caed7 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -202,6 +202,20 @@ def test_write_escape(self): escapechar='\\', quoting = csv.QUOTE_NONE) self._write_test(['a',1,'p,q'], 'a,1,p\\,q', escapechar='\\', quoting = csv.QUOTE_NONE) + self._write_test(['\\', 'a'], '\\\\,a', + escapechar='\\', quoting=csv.QUOTE_NONE) + self._write_test(['\\', 'a'], '\\\\,a', + escapechar='\\', quoting=csv.QUOTE_MINIMAL) + self._write_test(['\\', 'a'], '"\\\\","a"', + escapechar='\\', quoting=csv.QUOTE_ALL) + self._write_test(['\\ ', 'a'], '\\\\ ,a', + escapechar='\\', quoting=csv.QUOTE_MINIMAL) + self._write_test(['\\,', 'a'], '\\\\\\,,a', + escapechar='\\', quoting=csv.QUOTE_NONE) + self._write_test([',\\', 'a'], '",\\\\",a', + escapechar='\\', quoting=csv.QUOTE_MINIMAL) + self._write_test(['C\\', '6', '7', 'X"'], 'C\\\\,6,7,"X"""', + escapechar='\\', quoting=csv.QUOTE_MINIMAL) def test_write_iterable(self): self._write_test(iter(['a', 1, 'p,q']), 'a,1,"p,q"') diff --git a/Misc/NEWS.d/next/Library/2019-05-31-23-54-28.bpo-12178.N6FLCZ.rst b/Misc/NEWS.d/next/Library/2019-05-31-23-54-28.bpo-12178.N6FLCZ.rst new file mode 100644 index 00000000000000..80e2a7b5fbb2c0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-31-23-54-28.bpo-12178.N6FLCZ.rst @@ -0,0 +1,3 @@ +:func:`csv.writer` now correctly escapes *escapechar* when input +contains *escapechar*. Patch by Catalin Iacob, Berker Peksag, +and Itay Elbirt. diff --git a/Modules/_csv.c b/Modules/_csv.c index da61db9377f94d..594f6c14727262 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -1040,6 +1040,9 @@ join_append_data(WriterObj *self, unsigned int field_kind, const void *field_dat else want_escape = 1; } + else if (c == dialect->escapechar) { + want_escape = 1; + } if (!want_escape) *quoted = 1; } From 3d2fb4dfa3fb3409aa5a5f1d856c99d317d2d93b Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Sun, 20 Sep 2020 14:09:50 -0300 Subject: [PATCH 0128/1261] [doc] Teach 0-args form of super in Programming FAQ (GH-22176) --- Doc/faq/programming.rst | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index eecbbf4a5c4ff7..fd0adc378bfa6f 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1504,20 +1504,19 @@ Most :meth:`__setattr__` implementations must modify ``self.__dict__`` to store local state for self without causing an infinite recursion. -How do I call a method defined in a base class from a derived class that overrides it? --------------------------------------------------------------------------------------- +How do I call a method defined in a base class from a derived class that extends it? +------------------------------------------------------------------------------------ Use the built-in :func:`super` function:: class Derived(Base): def meth(self): - super(Derived, self).meth() + super().meth() # calls Base.meth -For version prior to 3.0, you may be using classic classes: For a class -definition such as ``class Derived(Base): ...`` you can call method ``meth()`` -defined in ``Base`` (or one of ``Base``'s base classes) as ``Base.meth(self, -arguments...)``. Here, ``Base.meth`` is an unbound method, so you need to -provide the ``self`` argument. +In the example, :func:`super` will automatically determine the instance from +which it was called (the ``self`` value), look up the :term:`method resolution +order` (MRO) with ``type(self).__mro__``, and return the next in line after +``Derived`` in the MRO: ``Base``. How can I organize my code to make it easier to change the base class? From 2693e303996c27033d5abf512fa3b8700aace55d Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 20 Sep 2020 21:47:56 -0700 Subject: [PATCH 0129/1261] bpo-41513: Add accuracy tests for math.hypot() (GH-22327) --- Lib/test/test_math.py | 63 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index f5283c5e0dcb63..2abe5b028b355d 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -803,6 +803,69 @@ def testHypot(self): scale = FLOAT_MIN / 2.0 ** exp self.assertEqual(math.hypot(4*scale, 3*scale), 5*scale) + @requires_IEEE_754 + @unittest.skipIf(HAVE_DOUBLE_ROUNDING, + "hypot() loses accuracy on machines with double rounding") + def testHypotAccuracy(self): + # Verify improved accuracy in cases that were known to be inaccurate. + # + # The new algorithm's accuracy depends on IEEE 754 arithmetic + # guarantees, on having the usual ROUND HALF EVEN rounding mode, on + # the system not having double rounding due to extended precision, + # and on the compiler maintaining the specified order of operations. + # + # This test is known to succeed on most of our builds. If it fails + # some build, we either need to add another skipIf if the cause is + # identifiable; otherwise, we can remove this test entirely. + + hypot = math.hypot + Decimal = decimal.Decimal + high_precision = decimal.Context(prec=500) + + for hx, hy in [ + # Cases with a 1 ulp error in Python 3.7 compiled with Clang + ('0x1.10e89518dca48p+29', '0x1.1970f7565b7efp+30'), + ('0x1.10106eb4b44a2p+29', '0x1.ef0596cdc97f8p+29'), + ('0x1.459c058e20bb7p+30', '0x1.993ca009b9178p+29'), + ('0x1.378371ae67c0cp+30', '0x1.fbe6619854b4cp+29'), + ('0x1.f4cd0574fb97ap+29', '0x1.50fe31669340ep+30'), + ('0x1.494b2cdd3d446p+29', '0x1.212a5367b4c7cp+29'), + ('0x1.f84e649f1e46dp+29', '0x1.1fa56bef8eec4p+30'), + ('0x1.2e817edd3d6fap+30', '0x1.eb0814f1e9602p+29'), + ('0x1.0d3a6e3d04245p+29', '0x1.32a62fea52352p+30'), + ('0x1.888e19611bfc5p+29', '0x1.52b8e70b24353p+29'), + + # Cases with 2 ulp error in Python 3.8 + ('0x1.538816d48a13fp+29', '0x1.7967c5ca43e16p+29'), + ('0x1.57b47b7234530p+29', '0x1.74e2c7040e772p+29'), + ('0x1.821b685e9b168p+30', '0x1.677dc1c1e3dc6p+29'), + ('0x1.9e8247f67097bp+29', '0x1.24bd2dc4f4baep+29'), + ('0x1.b73b59e0cb5f9p+29', '0x1.da899ab784a97p+28'), + ('0x1.94a8d2842a7cfp+30', '0x1.326a51d4d8d8ap+30'), + ('0x1.e930b9cd99035p+29', '0x1.5a1030e18dff9p+30'), + ('0x1.1592bbb0e4690p+29', '0x1.a9c337b33fb9ap+29'), + ('0x1.1243a50751fd4p+29', '0x1.a5a10175622d9p+29'), + ('0x1.57a8596e74722p+30', '0x1.42d1af9d04da9p+30'), + + # Cases with 1 ulp error in version fff3c28052e6b0 + ('0x1.ee7dbd9565899p+29', '0x1.7ab4d6fc6e4b4p+29'), + ('0x1.5c6bfbec5c4dcp+30', '0x1.02511184b4970p+30'), + ('0x1.59dcebba995cap+30', '0x1.50ca7e7c38854p+29'), + ('0x1.768cdd94cf5aap+29', '0x1.9cfdc5571d38ep+29'), + ('0x1.dcf137d60262ep+29', '0x1.1101621990b3ep+30'), + ('0x1.3a2d006e288b0p+30', '0x1.e9a240914326cp+29'), + ('0x1.62a32f7f53c61p+29', '0x1.47eb6cd72684fp+29'), + ('0x1.d3bcb60748ef2p+29', '0x1.3f13c4056312cp+30'), + ('0x1.282bdb82f17f3p+30', '0x1.640ba4c4eed3ap+30'), + ('0x1.89d8c423ea0c6p+29', '0x1.d35dcfe902bc3p+29'), + ]: + x = float.fromhex(hx) + y = float.fromhex(hy) + with self.subTest(hx=hx, hy=hy, x=x, y=y): + with decimal.localcontext(high_precision): + z = float((Decimal(x)**2 + Decimal(y)**2).sqrt()) + self.assertEqual(hypot(x, y), z) + def testDist(self): from decimal import Decimal as D from fractions import Fraction as F From 5d7ff77f945f327c9ea37a1abaa57b88e5004bec Mon Sep 17 00:00:00 2001 From: Samuel Marks <807580+SamuelMarks@users.noreply.github.com> Date: Mon, 21 Sep 2020 18:35:17 +1000 Subject: [PATCH 0130/1261] bpo-41819: Fix compiler warning in init_dump_ascii_wstr() (GH-22332) Fix the compiler warning: format specifies type `wint_t` (aka `int`) but the argument has type `unsigned int` --- Python/initconfig.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/initconfig.c b/Python/initconfig.c index 880e145ec031cd..6a13dc52ed776c 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -2674,7 +2674,7 @@ init_dump_ascii_wstr(const wchar_t *str) if (ch == L'\'') { PySys_WriteStderr("\\'"); } else if (0x20 <= ch && ch < 0x7f) { - PySys_WriteStderr("%lc", ch); + PySys_WriteStderr("%c", ch); } else if (ch <= 0xff) { PySys_WriteStderr("\\x%02x", ch); From 481841db10a61b6c92f759413b2630b8c54d2787 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Mon, 21 Sep 2020 07:40:42 -0500 Subject: [PATCH 0131/1261] bpo-1635741: Convert an _lsprof method to argument clinic (GH-22240) --- Modules/_lsprof.c | 73 ++++++++++++++++++++++---------------- Modules/clinic/_lsprof.c.h | 44 +++++++++++++++++++++++ 2 files changed, 86 insertions(+), 31 deletions(-) create mode 100644 Modules/clinic/_lsprof.c.h diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index 5e53d839640d99..a4ba7d52300338 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -50,8 +50,15 @@ typedef struct { #define POF_BUILTINS 0x004 #define POF_NOMEMORY 0x100 +/*[clinic input] +module _lsprof +class _lsprof.Profiler "ProfilerObject *" "&ProfilerType" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=e349ac952152f336]*/ static PyTypeObject PyProfiler_Type; +#include "clinic/_lsprof.c.h" + #define PyProfiler_Check(op) PyObject_TypeCheck(op, &PyProfiler_Type) #define PyProfiler_CheckExact(op) Py_IS_TYPE(op, &PyProfiler_Type) @@ -556,49 +563,54 @@ static int statsForEntry(rotating_node_t *node, void *arg) return err; } -PyDoc_STRVAR(getstats_doc, "\ -getstats() -> list of profiler_entry objects\n\ -\n\ -Return all information collected by the profiler.\n\ -Each profiler_entry is a tuple-like object with the\n\ -following attributes:\n\ -\n\ - code code object\n\ - callcount how many times this was called\n\ - reccallcount how many times called recursively\n\ - totaltime total time in this entry\n\ - inlinetime inline time in this entry (not in subcalls)\n\ - calls details of the calls\n\ -\n\ -The calls attribute is either None or a list of\n\ -profiler_subentry objects:\n\ -\n\ - code called code object\n\ - callcount how many times this is called\n\ - reccallcount how many times this is called recursively\n\ - totaltime total time spent in this call\n\ - inlinetime inline time (not in further subcalls)\n\ -"); +/*[clinic input] +_lsprof.Profiler.getstats -static PyObject* -profiler_getstats(ProfilerObject *pObj, PyObject* noarg) +list of profiler_entry objects. + +getstats() -> list of profiler_entry objects + +Return all information collected by the profiler. +Each profiler_entry is a tuple-like object with the +following attributes: + + code code object + callcount how many times this was called + reccallcount how many times called recursively + totaltime total time in this entry + inlinetime inline time in this entry (not in subcalls) + calls details of the calls + +The calls attribute is either None or a list of +profiler_subentry objects: + + code called code object + callcount how many times this is called + reccallcount how many times this is called recursively + totaltime total time spent in this call + inlinetime inline time (not in further subcalls) +[clinic start generated code]*/ + +static PyObject * +_lsprof_Profiler_getstats_impl(ProfilerObject *self) +/*[clinic end generated code: output=9461b451e9ef0f24 input=ade04fa384ce450a]*/ { statscollector_t collect; - if (pending_exception(pObj)) { + if (pending_exception(self)) { return NULL; } - if (!pObj->externalTimer || pObj->externalTimerUnit == 0.0) { + if (!self->externalTimer || self->externalTimerUnit == 0.0) { _PyTime_t onesec = _PyTime_FromSeconds(1); collect.factor = (double)1 / onesec; } else { - collect.factor = pObj->externalTimerUnit; + collect.factor = self->externalTimerUnit; } collect.list = PyList_New(0); if (collect.list == NULL) return NULL; - if (RotatingTree_Enum(pObj->profilerEntries, statsForEntry, &collect) + if (RotatingTree_Enum(self->profilerEntries, statsForEntry, &collect) != 0) { Py_DECREF(collect.list); return NULL; @@ -750,8 +762,7 @@ profiler_init(ProfilerObject *pObj, PyObject *args, PyObject *kw) } static PyMethodDef profiler_methods[] = { - {"getstats", (PyCFunction)profiler_getstats, - METH_NOARGS, getstats_doc}, + _LSPROF_PROFILER_GETSTATS_METHODDEF {"enable", (PyCFunction)(void(*)(void))profiler_enable, METH_VARARGS | METH_KEYWORDS, enable_doc}, {"disable", (PyCFunction)profiler_disable, diff --git a/Modules/clinic/_lsprof.c.h b/Modules/clinic/_lsprof.c.h new file mode 100644 index 00000000000000..50762e3ff35960 --- /dev/null +++ b/Modules/clinic/_lsprof.c.h @@ -0,0 +1,44 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(_lsprof_Profiler_getstats__doc__, +"getstats($self, /)\n" +"--\n" +"\n" +"list of profiler_entry objects.\n" +"\n" +"getstats() -> list of profiler_entry objects\n" +"\n" +"Return all information collected by the profiler.\n" +"Each profiler_entry is a tuple-like object with the\n" +"following attributes:\n" +"\n" +" code code object\n" +" callcount how many times this was called\n" +" reccallcount how many times called recursively\n" +" totaltime total time in this entry\n" +" inlinetime inline time in this entry (not in subcalls)\n" +" calls details of the calls\n" +"\n" +"The calls attribute is either None or a list of\n" +"profiler_subentry objects:\n" +"\n" +" code called code object\n" +" callcount how many times this is called\n" +" reccallcount how many times this is called recursively\n" +" totaltime total time spent in this call\n" +" inlinetime inline time (not in further subcalls)"); + +#define _LSPROF_PROFILER_GETSTATS_METHODDEF \ + {"getstats", (PyCFunction)_lsprof_Profiler_getstats, METH_NOARGS, _lsprof_Profiler_getstats__doc__}, + +static PyObject * +_lsprof_Profiler_getstats_impl(ProfilerObject *self); + +static PyObject * +_lsprof_Profiler_getstats(ProfilerObject *self, PyObject *Py_UNUSED(ignored)) +{ + return _lsprof_Profiler_getstats_impl(self); +} +/*[clinic end generated code: output=24c525812713e00f input=a9049054013a1b77]*/ From eac1b849e018a4cb7d5fdcaeaea451ebeb6b6dd8 Mon Sep 17 00:00:00 2001 From: Angelin BOOZ <9497359+lem2clide@users.noreply.github.com> Date: Mon, 21 Sep 2020 15:11:06 +0200 Subject: [PATCH 0132/1261] bpo-40084: Enum - dir() includes member attributes (GH-19219) --- Lib/enum.py | 2 +- Lib/test/test_enum.py | 12 ++++++++++++ Lib/test/test_httplib.py | 6 +++++- Misc/ACKS | 1 + .../Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst | 1 + 5 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst diff --git a/Lib/enum.py b/Lib/enum.py index 3c459ea4113d0b..e8603a43420b0e 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -644,7 +644,7 @@ def __dir__(self): for cls in self.__class__.mro() for m in cls.__dict__ if m[0] != '_' and m not in self._member_map_ - ] + ] + [m for m in self.__dict__ if m[0] != '_'] return (['__class__', '__doc__', '__module__'] + added_behavior) def __format__(self, format_spec): diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 59789fb7bcc5fd..3f39073f5d564e 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -216,6 +216,18 @@ class SubEnum(SuperEnum): set(['__class__', '__doc__', '__module__', 'name', 'value', 'invisible']), ) + def test_dir_on_sub_with_behavior_including_instance_dict_on_super(self): + # see issue40084 + class SuperEnum(IntEnum): + def __new__(cls, value, description=""): + obj = int.__new__(cls, value) + obj._value_ = value + obj.description = description + return obj + class SubEnum(SuperEnum): + sample = 5 + self.assertTrue({'description'} <= set(dir(SubEnum.sample))) + def test_enum_in_enum_out(self): Season = self.Season self.assertIs(Season(Season.WINTER), Season.WINTER) diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index a3f268be97921c..4abff60230b546 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -1,5 +1,5 @@ import errno -from http import client +from http import client, HTTPStatus import io import itertools import os @@ -519,6 +519,10 @@ def _parse_chunked(self, data): class BasicTest(TestCase): + def test_dir_with_added_behavior_on_status(self): + # see issue40084 + self.assertTrue({'description', 'name', 'phrase', 'value'} <= set(dir(HTTPStatus(404)))) + def test_status_lines(self): # Test HTTP status lines diff --git a/Misc/ACKS b/Misc/ACKS index d23797a2f55574..01ee1cb42d39d0 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -191,6 +191,7 @@ Gawain Bolton Carl Friedrich Bolz-Tereick Forest Bond Gregory Bond +Angelin Booz Médéric Boquien Matias Bordese Jonas Borgström diff --git a/Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst b/Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst new file mode 100644 index 00000000000000..65ff4ce36e82ea --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst @@ -0,0 +1 @@ +Fix ``Enum.__dir__``: dir(Enum.member) now includes attributes as well as methods. From 9c2233d9081d33f65e63f72a1be80d09673b1e42 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Mon, 21 Sep 2020 17:23:13 -0700 Subject: [PATCH 0133/1261] bpo-41816: add `StrEnum` (GH-22337) `StrEnum` ensures that its members were already strings, or intended to be strings. --- Doc/library/enum.rst | 38 +++++++++++++ Lib/enum.py | 32 ++++++++++- Lib/test/test_enum.py | 54 ++++++++++++------- .../2020-09-19-12-22-08.bpo-41816.ynynXJ.rst | 2 + 4 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-19-12-22-08.bpo-41816.ynynXJ.rst diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 2f84be229bc4da..843d961afc4f72 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -44,6 +44,11 @@ helper, :class:`auto`. Base class for creating enumerated constants that are also subclasses of :class:`int`. +.. class:: StrEnum + + Base class for creating enumerated constants that are also + subclasses of :class:`str`. + .. class:: IntFlag Base class for creating enumerated constants that can be combined using @@ -601,6 +606,25 @@ However, they still can't be compared to standard :class:`Enum` enumerations:: [0, 1] +StrEnum +^^^^^^^ + +The second variation of :class:`Enum` that is provided is also a subclass of +:class:`str`. Members of a :class:`StrEnum` can be compared to strings; +by extension, string enumerations of different types can also be compared +to each other. :class:`StrEnum` exists to help avoid the problem of getting +an incorrect member:: + + >>> class Directions(StrEnum): + ... NORTH = 'north', # notice the trailing comma + ... SOUTH = 'south' + +Before :class:`StrEnum`, ``Directions.NORTH`` would have been the :class:`tuple` +``('north',)``. + +.. versionadded:: 3.10 + + IntFlag ^^^^^^^ @@ -1132,6 +1156,20 @@ all-uppercase names for members):: .. versionchanged:: 3.5 +Creating members that are mixed with other data types +""""""""""""""""""""""""""""""""""""""""""""""""""""" + +When subclassing other data types, such as :class:`int` or :class:`str`, with +an :class:`Enum`, all values after the `=` are passed to that data type's +constructor. For example:: + + >>> class MyEnum(IntEnum): + ... example = '11', 16 # '11' will be interpreted as a hexadecimal + ... # number + >>> MyEnum.example + + + Boolean value of ``Enum`` classes and members """"""""""""""""""""""""""""""""""""""""""""" diff --git a/Lib/enum.py b/Lib/enum.py index e8603a43420b0e..589b17fd697775 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -4,7 +4,7 @@ __all__ = [ 'EnumMeta', - 'Enum', 'IntEnum', 'Flag', 'IntFlag', + 'Enum', 'IntEnum', 'StrEnum', 'Flag', 'IntFlag', 'auto', 'unique', ] @@ -688,7 +688,35 @@ def value(self): class IntEnum(int, Enum): - """Enum where members are also (and must be) ints""" + """ + Enum where members are also (and must be) ints + """ + + +class StrEnum(str, Enum): + """ + Enum where members are also (and must be) strings + """ + + def __new__(cls, *values): + if len(values) > 3: + raise TypeError('too many arguments for str(): %r' % (values, )) + if len(values) == 1: + # it must be a string + if not isinstance(values[0], str): + raise TypeError('%r is not a string' % (values[0], )) + if len(values) > 1: + # check that encoding argument is a string + if not isinstance(values[1], str): + raise TypeError('encoding must be a string, not %r' % (values[1], )) + if len(values) > 2: + # check that errors argument is a string + if not isinstance(values[2], str): + raise TypeError('errors must be a string, not %r' % (values[2], )) + value = str(*values) + member = str.__new__(cls, value) + member._value_ = value + return member def _reduce_ex_by_name(self, proto): diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 3f39073f5d564e..8e84d929429ebf 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -5,7 +5,7 @@ import unittest import threading from collections import OrderedDict -from enum import Enum, IntEnum, EnumMeta, Flag, IntFlag, unique, auto +from enum import Enum, IntEnum, StrEnum, EnumMeta, Flag, IntFlag, unique, auto from io import StringIO from pickle import dumps, loads, PicklingError, HIGHEST_PROTOCOL from test import support @@ -48,14 +48,9 @@ class FlagStooges(Flag): FlagStooges = exc # for pickle test and subclass tests -try: - class StrEnum(str, Enum): - 'accepts only string values' - class Name(StrEnum): - BDFL = 'Guido van Rossum' - FLUFL = 'Barry Warsaw' -except Exception as exc: - Name = exc +class Name(StrEnum): + BDFL = 'Guido van Rossum' + FLUFL = 'Barry Warsaw' try: Question = Enum('Question', 'who what when where why', module=__name__) @@ -665,14 +660,13 @@ class phy(str, Enum): tau = 'Tau' self.assertTrue(phy.pi < phy.tau) - def test_strenum_inherited(self): - class StrEnum(str, Enum): - pass + def test_strenum_inherited_methods(self): class phy(StrEnum): pi = 'Pi' tau = 'Tau' self.assertTrue(phy.pi < phy.tau) - + self.assertEqual(phy.pi.upper(), 'PI') + self.assertEqual(phy.tau.count('a'), 1) def test_intenum(self): class WeekDay(IntEnum): @@ -2014,13 +2008,6 @@ class ReformedColor(StrMixin, IntEnum, SomeEnum, AnotherEnum): self.assertTrue(issubclass(ReformedColor, int)) def test_multiple_inherited_mixin(self): - class StrEnum(str, Enum): - def __new__(cls, *args, **kwargs): - for a in args: - if not isinstance(a, str): - raise TypeError("Enumeration '%s' (%s) is not" - " a string" % (a, type(a).__name__)) - return str.__new__(cls, *args, **kwargs) @unique class Decision1(StrEnum): REVERT = "REVERT" @@ -2043,6 +2030,33 @@ def test_empty_globals(self): local_ls = {} exec(code, global_ns, local_ls) + def test_strenum(self): + class GoodStrEnum(StrEnum): + one = '1' + two = '2' + three = b'3', 'ascii' + four = b'4', 'latin1', 'strict' + with self.assertRaisesRegex(TypeError, '1 is not a string'): + class FirstFailedStrEnum(StrEnum): + one = 1 + two = '2' + with self.assertRaisesRegex(TypeError, "2 is not a string"): + class SecondFailedStrEnum(StrEnum): + one = '1' + two = 2, + three = '3' + with self.assertRaisesRegex(TypeError, '2 is not a string'): + class ThirdFailedStrEnum(StrEnum): + one = '1' + two = 2 + with self.assertRaisesRegex(TypeError, 'encoding must be a string, not %r' % (sys.getdefaultencoding, )): + class ThirdFailedStrEnum(StrEnum): + one = '1' + two = b'2', sys.getdefaultencoding + with self.assertRaisesRegex(TypeError, 'errors must be a string, not 9'): + class ThirdFailedStrEnum(StrEnum): + one = '1' + two = b'2', 'ascii', 9 class TestOrder(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2020-09-19-12-22-08.bpo-41816.ynynXJ.rst b/Misc/NEWS.d/next/Library/2020-09-19-12-22-08.bpo-41816.ynynXJ.rst new file mode 100644 index 00000000000000..605c346f37a81d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-19-12-22-08.bpo-41816.ynynXJ.rst @@ -0,0 +1,2 @@ +StrEnum added: it ensures that all members are already strings or string +candidates From 0125609f8a5d43d8ef2e4be906acebac4af6b55f Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 22 Sep 2020 08:08:54 +0300 Subject: [PATCH 0134/1261] bpo-41756: Refactor gen_send_ex(). (GH-22330) --- Objects/genobject.c | 193 +++++++++++++++++++++++--------------------- 1 file changed, 99 insertions(+), 94 deletions(-) diff --git a/Objects/genobject.c b/Objects/genobject.c index 24aca988354c5a..f0943ae847c543 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -136,13 +136,15 @@ gen_dealloc(PyGenObject *gen) PyObject_GC_Del(gen); } -static PyObject * -gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing, int *is_return_value) +static PySendResult +gen_send_ex2(PyGenObject *gen, PyObject *arg, PyObject **presult, + int exc, int closing) { PyThreadState *tstate = _PyThreadState_GET(); PyFrameObject *f = gen->gi_frame; PyObject *result; + *presult = NULL; if (f != NULL && _PyFrame_IsExecuting(f)) { const char *msg = "generator already executing"; if (PyCoro_CheckExact(gen)) { @@ -152,7 +154,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing, int *is_retur msg = "async generator already executing"; } PyErr_SetString(PyExc_ValueError, msg); - return NULL; + return PYGEN_ERROR; } if (f == NULL || _PyFrameHasCompleted(f)) { if (PyCoro_CheckExact(gen) && !closing) { @@ -165,19 +167,12 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing, int *is_retur } else if (arg && !exc) { /* `gen` is an exhausted generator: - only set exception if called from send(). */ - if (PyAsyncGen_CheckExact(gen)) { - PyErr_SetNone(PyExc_StopAsyncIteration); - } - else { - if (is_return_value != NULL) { - *is_return_value = 1; - Py_RETURN_NONE; - } - PyErr_SetNone(PyExc_StopIteration); - } + only return value if called from send(). */ + *presult = Py_None; + Py_INCREF(*presult); + return PYGEN_RETURN; } - return NULL; + return PYGEN_ERROR; } assert(_PyFrame_IsRunnable(f)); @@ -193,7 +188,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing, int *is_retur "just-started async generator"; } PyErr_SetString(PyExc_TypeError, msg); - return NULL; + return PYGEN_ERROR; } } else { /* Push arg onto the frame's value stack */ @@ -229,69 +224,77 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing, int *is_retur /* If the generator just returned (as opposed to yielding), signal * that the generator is exhausted. */ - if (result && _PyFrameHasCompleted(f)) { - if (result == Py_None) { - /* Delay exception instantiation if we can */ - if (PyAsyncGen_CheckExact(gen)) { - PyErr_SetNone(PyExc_StopAsyncIteration); - Py_CLEAR(result); - } - else if (arg) { - if (is_return_value != NULL) { - *is_return_value = 1; - } - else { - /* Set exception if not called by gen_iternext() */ - PyErr_SetNone(PyExc_StopIteration); - Py_CLEAR(result); - } - } - else { - Py_CLEAR(result); - } + if (result) { + if (!_PyFrameHasCompleted(f)) { + *presult = result; + return PYGEN_NEXT; } - else { - /* Async generators cannot return anything but None */ - assert(!PyAsyncGen_CheckExact(gen)); - if (is_return_value != NULL) { - *is_return_value = 1; - } - else { - _PyGen_SetStopIterationValue(result); - Py_CLEAR(result); - } + assert(result == Py_None || !PyAsyncGen_CheckExact(gen)); + if (result == Py_None && !PyAsyncGen_CheckExact(gen) && !arg) { + /* Return NULL if called by gen_iternext() */ + Py_CLEAR(result); } } - else if (!result && PyErr_ExceptionMatches(PyExc_StopIteration)) { - const char *msg = "generator raised StopIteration"; - if (PyCoro_CheckExact(gen)) { - msg = "coroutine raised StopIteration"; + else { + if (PyErr_ExceptionMatches(PyExc_StopIteration)) { + const char *msg = "generator raised StopIteration"; + if (PyCoro_CheckExact(gen)) { + msg = "coroutine raised StopIteration"; + } + else if (PyAsyncGen_CheckExact(gen)) { + msg = "async generator raised StopIteration"; + } + _PyErr_FormatFromCause(PyExc_RuntimeError, "%s", msg); } - else if (PyAsyncGen_CheckExact(gen)) { - msg = "async generator raised StopIteration"; + else if (PyAsyncGen_CheckExact(gen) && + PyErr_ExceptionMatches(PyExc_StopAsyncIteration)) + { + /* code in `gen` raised a StopAsyncIteration error: + raise a RuntimeError. + */ + const char *msg = "async generator raised StopAsyncIteration"; + _PyErr_FormatFromCause(PyExc_RuntimeError, "%s", msg); } - _PyErr_FormatFromCause(PyExc_RuntimeError, "%s", msg); - - } - else if (!result && PyAsyncGen_CheckExact(gen) && - PyErr_ExceptionMatches(PyExc_StopAsyncIteration)) - { - /* code in `gen` raised a StopAsyncIteration error: - raise a RuntimeError. - */ - const char *msg = "async generator raised StopAsyncIteration"; - _PyErr_FormatFromCause(PyExc_RuntimeError, "%s", msg); } - if ((is_return_value && *is_return_value) || !result || _PyFrameHasCompleted(f)) { - /* generator can't be rerun, so release the frame */ - /* first clean reference cycle through stored exception traceback */ - _PyErr_ClearExcState(&gen->gi_exc_state); - gen->gi_frame->f_gen = NULL; - gen->gi_frame = NULL; - Py_DECREF(f); - } + /* generator can't be rerun, so release the frame */ + /* first clean reference cycle through stored exception traceback */ + _PyErr_ClearExcState(&gen->gi_exc_state); + gen->gi_frame->f_gen = NULL; + gen->gi_frame = NULL; + Py_DECREF(f); + + *presult = result; + return result ? PYGEN_RETURN : PYGEN_ERROR; +} + +PySendResult +PyGen_Send(PyGenObject *gen, PyObject *arg, PyObject **result) +{ + assert(PyGen_CheckExact(gen) || PyCoro_CheckExact(gen)); + assert(result != NULL); + assert(arg != NULL); + + return gen_send_ex2(gen, arg, result, 0, 0); +} +static PyObject * +gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) +{ + PyObject *result; + if (gen_send_ex2(gen, arg, &result, exc, closing) == PYGEN_RETURN) { + if (PyAsyncGen_CheckExact(gen)) { + assert(result == Py_None); + PyErr_SetNone(PyExc_StopAsyncIteration); + } + else if (result == Py_None) { + PyErr_SetNone(PyExc_StopIteration); + } + else { + _PyGen_SetStopIterationValue(result); + } + Py_CLEAR(result); + } return result; } @@ -299,22 +302,16 @@ PyDoc_STRVAR(send_doc, "send(arg) -> send 'arg' into generator,\n\ return next yielded value or raise StopIteration."); -PyObject * -_PyGen_Send(PyGenObject *gen, PyObject *arg) +static PyObject * +gen_send(PyGenObject *gen, PyObject *arg) { - return gen_send_ex(gen, arg, 0, 0, NULL); + return gen_send_ex(gen, arg, 0, 0); } -PySendResult -PyGen_Send(PyGenObject *gen, PyObject *arg, PyObject **result) +PyObject * +_PyGen_Send(PyGenObject *gen, PyObject *arg) { - assert(result != NULL); - - int is_return_value = 0; - if ((*result = gen_send_ex(gen, arg, 0, 0, &is_return_value)) == NULL) { - return PYGEN_ERROR; - } - return is_return_value ? PYGEN_RETURN : PYGEN_NEXT; + return gen_send(gen, arg); } PyDoc_STRVAR(close_doc, @@ -396,7 +393,7 @@ gen_close(PyGenObject *gen, PyObject *args) } if (err == 0) PyErr_SetNone(PyExc_GeneratorExit); - retval = gen_send_ex(gen, Py_None, 1, 1, NULL); + retval = gen_send_ex(gen, Py_None, 1, 1); if (retval) { const char *msg = "generator ignored GeneratorExit"; if (PyCoro_CheckExact(gen)) { @@ -444,7 +441,7 @@ _gen_throw(PyGenObject *gen, int close_on_genexit, gen->gi_frame->f_state = state; Py_DECREF(yf); if (err < 0) - return gen_send_ex(gen, Py_None, 1, 0, NULL); + return gen_send_ex(gen, Py_None, 1, 0); goto throw_here; } if (PyGen_CheckExact(yf) || PyCoro_CheckExact(yf)) { @@ -496,10 +493,10 @@ _gen_throw(PyGenObject *gen, int close_on_genexit, assert(gen->gi_frame->f_lasti >= 0); gen->gi_frame->f_lasti += sizeof(_Py_CODEUNIT); if (_PyGen_FetchStopIterationValue(&val) == 0) { - ret = gen_send_ex(gen, val, 0, 0, NULL); + ret = gen_send(gen, val); Py_DECREF(val); } else { - ret = gen_send_ex(gen, Py_None, 1, 0, NULL); + ret = gen_send_ex(gen, Py_None, 1, 0); } } return ret; @@ -553,7 +550,7 @@ _gen_throw(PyGenObject *gen, int close_on_genexit, } PyErr_Restore(typ, val, tb); - return gen_send_ex(gen, Py_None, 1, 0, NULL); + return gen_send_ex(gen, Py_None, 1, 0); failed_throw: /* Didn't use our arguments, so restore their original refcounts */ @@ -582,7 +579,15 @@ gen_throw(PyGenObject *gen, PyObject *args) static PyObject * gen_iternext(PyGenObject *gen) { - return gen_send_ex(gen, NULL, 0, 0, NULL); + PyObject *result; + assert(PyGen_CheckExact(gen) || PyCoro_CheckExact(gen)); + if (gen_send_ex2(gen, NULL, &result, 0, 0) == PYGEN_RETURN) { + if (result != Py_None) { + _PyGen_SetStopIterationValue(result); + } + Py_CLEAR(result); + } + return result; } /* @@ -767,7 +772,7 @@ static PyMemberDef gen_memberlist[] = { }; static PyMethodDef gen_methods[] = { - {"send",(PyCFunction)_PyGen_Send, METH_O, send_doc}, + {"send",(PyCFunction)gen_send, METH_O, send_doc}, {"throw",(PyCFunction)gen_throw, METH_VARARGS, throw_doc}, {"close",(PyCFunction)gen_close, METH_NOARGS, close_doc}, {NULL, NULL} /* Sentinel */ @@ -1082,13 +1087,13 @@ coro_wrapper_dealloc(PyCoroWrapper *cw) static PyObject * coro_wrapper_iternext(PyCoroWrapper *cw) { - return gen_send_ex((PyGenObject *)cw->cw_coroutine, NULL, 0, 0, NULL); + return gen_iternext((PyGenObject *)cw->cw_coroutine); } static PyObject * coro_wrapper_send(PyCoroWrapper *cw, PyObject *arg) { - return gen_send_ex((PyGenObject *)cw->cw_coroutine, arg, 0, 0, NULL); + return gen_send((PyGenObject *)cw->cw_coroutine, arg); } static PyObject * @@ -1601,7 +1606,7 @@ async_gen_asend_send(PyAsyncGenASend *o, PyObject *arg) } o->ags_gen->ag_running_async = 1; - result = gen_send_ex((PyGenObject*)o->ags_gen, arg, 0, 0, NULL); + result = gen_send((PyGenObject*)o->ags_gen, arg); result = async_gen_unwrap_value(o->ags_gen, result); if (result == NULL) { @@ -1957,7 +1962,7 @@ async_gen_athrow_send(PyAsyncGenAThrow *o, PyObject *arg) assert(o->agt_state == AWAITABLE_STATE_ITER); - retval = gen_send_ex((PyGenObject *)gen, arg, 0, 0, NULL); + retval = gen_send((PyGenObject *)gen, arg); if (o->agt_args) { return async_gen_unwrap_value(o->agt_gen, retval); } else { From 95f4f1ab3e1d71f0ac782e5edbdf9c47f2953496 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 22 Sep 2020 01:43:55 -0400 Subject: [PATCH 0135/1261] bpo-40181: Remove '/' reminder in IDLE calltips. (GH-22350) The marker was added to the language in 3.8 and 3.7 only gets security patches. --- Lib/idlelib/NEWS.txt | 3 +++ Lib/idlelib/calltip.py | 4 ---- Lib/idlelib/idle_test/test_calltip.py | 8 +++----- .../next/IDLE/2020-09-22-00-45-40.bpo-40181.hhQi3z.rst | 2 ++ 4 files changed, 8 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-09-22-00-45-40.bpo-40181.hhQi3z.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index fd762077b1b3cf..f8ec6ab5052971 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2020-10-05? ====================================== +bpo-40181: In calltips, stop reminding that '/' marks the end of +positional-only arguments. + bpo-41468: Improve IDLE run crash error message (which users should never see). diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index d4092c7847186b..b02f87207d8db1 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -118,7 +118,6 @@ def get_entity(expression): _first_param = re.compile(r'(?<=\()\w*\,?\s*') _default_callable_argspec = "See source or doc" _invalid_method = "invalid method signature" -_argument_positional = " # '/' marks preceding args as positional-only." def get_argspec(ob): '''Return a string describing the signature of a callable object, or ''. @@ -146,9 +145,6 @@ def get_argspec(ob): else: argspec = '' - if '/' in argspec and len(argspec) < _MAX_COLS - len(_argument_positional): - # Add explanation TODO remove after 3.7, before 3.9. - argspec += _argument_positional if isinstance(fob, type) and argspec == '()': # If fob has no argument, use default callable argspec. argspec = _default_callable_argspec diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index d386b5cd813212..4d53df17d8cc7c 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -61,18 +61,16 @@ class SB: __call__ = None if List.__doc__ is not None: tiptest(List, - f'(iterable=(), /){calltip._argument_positional}' + f'(iterable=(), /)' f'\n{List.__doc__}') tiptest(list.__new__, '(*args, **kwargs)\n' 'Create and return a new object. ' 'See help(type) for accurate signature.') tiptest(list.__init__, - '(self, /, *args, **kwargs)' - + calltip._argument_positional + '\n' + + '(self, /, *args, **kwargs)\n' 'Initialize self. See help(type(self)) for accurate signature.') - append_doc = (calltip._argument_positional - + "\nAppend object to the end of the list.") + append_doc = "\nAppend object to the end of the list." tiptest(list.append, '(self, object, /)' + append_doc) tiptest(List.append, '(self, object, /)' + append_doc) tiptest([].append, '(object, /)' + append_doc) diff --git a/Misc/NEWS.d/next/IDLE/2020-09-22-00-45-40.bpo-40181.hhQi3z.rst b/Misc/NEWS.d/next/IDLE/2020-09-22-00-45-40.bpo-40181.hhQi3z.rst new file mode 100644 index 00000000000000..b6866e19c4d41a --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-09-22-00-45-40.bpo-40181.hhQi3z.rst @@ -0,0 +1,2 @@ +In calltips, stop reminding that '/' marks the end of positional-only +arguments. From 7e9be797742954ec55c15439648668cfb92047f6 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Tue, 22 Sep 2020 00:05:27 -0700 Subject: [PATCH 0136/1261] Enum: add extended AutoNumber example (GH-22349) --- Doc/library/enum.rst | 26 ++++++++++++++++++++++++++ Misc/ACKS | 1 + 2 files changed, 27 insertions(+) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 843d961afc4f72..3e9b1f9db3550f 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -925,6 +925,32 @@ Using an auto-numbering :meth:`__new__` would look like:: >>> Color.GREEN.value 2 +To make a more general purpose ``AutoNumber``, add ``*args`` to the signature:: + + >>> class AutoNumber(NoValue): + ... def __new__(cls, *args): # this is the only change from above + ... value = len(cls.__members__) + 1 + ... obj = object.__new__(cls) + ... obj._value_ = value + ... return obj + ... + +Then when you inherit from ``AutoNumber`` you can write your own ``__init__`` +to handle any extra arguments:: + + >>> class Swatch(AutoNumber): + ... def __init__(self, pantone='unknown'): + ... self.pantone = pantone + ... AUBURN = '3497' + ... SEA_GREEN = '1246' + ... BLEACHED_CORAL = () # New color, no Pantone code yet! + ... + >>> Swatch.SEA_GREEN + + >>> Swatch.SEA_GREEN.pantone + '1246' + >>> Swatch.BLEACHED_CORAL.pantone + 'unknown' .. note:: diff --git a/Misc/ACKS b/Misc/ACKS index 01ee1cb42d39d0..e4bd3da6b6c40a 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1723,6 +1723,7 @@ Févry Thibault Lowe Thiderman Nicolas M. Thiéry James Thomas +Reuben Thomas Robin Thomas Brian Thorne Christopher Thorne From d2eb42d0239e15543c0c3cb438035b6b54da3556 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 22 Sep 2020 12:42:28 +0200 Subject: [PATCH 0137/1261] Py_IS_TYPE() macro uses Py_TYPE() (GH-22341) --- Include/object.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/object.h b/Include/object.h index 10f1d6a3dff2dd..6ee4ee7848551e 100644 --- a/Include/object.h +++ b/Include/object.h @@ -141,7 +141,7 @@ static inline PyTypeObject* _Py_TYPE(const PyObject *ob) { static inline int _Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) { - return ob->ob_type == type; + return Py_TYPE(ob) == type; } #define Py_IS_TYPE(ob, type) _Py_IS_TYPE(_PyObject_CAST_CONST(ob), type) From 391b4095a69f0299e86c59d8d0e5bf819d74936a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 22 Sep 2020 16:16:46 +0300 Subject: [PATCH 0138/1261] bpo-40670: More reliable validation of statements in timeit.Timer. (GH-22358) It now accepts "empty" statements (only whitespaces and comments) and rejects misindentent statements. --- Lib/test/test_timeit.py | 9 +++++++++ Lib/timeit.py | 1 + .../Library/2020-09-22-14-55-34.bpo-40670.R5sm68.rst | 3 +++ 3 files changed, 13 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-09-22-14-55-34.bpo-40670.R5sm68.rst diff --git a/Lib/test/test_timeit.py b/Lib/test/test_timeit.py index e02d4a71a9ba7c..72a104fc1a6790 100644 --- a/Lib/test/test_timeit.py +++ b/Lib/test/test_timeit.py @@ -77,6 +77,9 @@ def test_timer_invalid_stmt(self): self.assertRaises(SyntaxError, timeit.Timer, stmt='break') self.assertRaises(SyntaxError, timeit.Timer, stmt='continue') self.assertRaises(SyntaxError, timeit.Timer, stmt='from timeit import *') + self.assertRaises(SyntaxError, timeit.Timer, stmt=' pass') + self.assertRaises(SyntaxError, timeit.Timer, + setup='while False:\n pass', stmt=' break') def test_timer_invalid_setup(self): self.assertRaises(ValueError, timeit.Timer, setup=None) @@ -86,6 +89,12 @@ def test_timer_invalid_setup(self): self.assertRaises(SyntaxError, timeit.Timer, setup='break') self.assertRaises(SyntaxError, timeit.Timer, setup='continue') self.assertRaises(SyntaxError, timeit.Timer, setup='from timeit import *') + self.assertRaises(SyntaxError, timeit.Timer, setup=' pass') + + def test_timer_empty_stmt(self): + timeit.Timer(stmt='') + timeit.Timer(stmt=' \n\t\f') + timeit.Timer(stmt='# comment') fake_setup = "import timeit\ntimeit._fake_timer.setup()" fake_stmt = "import timeit\ntimeit._fake_timer.inc()" diff --git a/Lib/timeit.py b/Lib/timeit.py index 6c3ec01067f2d4..9dfd454936e6b8 100755 --- a/Lib/timeit.py +++ b/Lib/timeit.py @@ -72,6 +72,7 @@ def inner(_it, _timer{init}): _t0 = _timer() for _i in _it: {stmt} + pass _t1 = _timer() return _t1 - _t0 """ diff --git a/Misc/NEWS.d/next/Library/2020-09-22-14-55-34.bpo-40670.R5sm68.rst b/Misc/NEWS.d/next/Library/2020-09-22-14-55-34.bpo-40670.R5sm68.rst new file mode 100644 index 00000000000000..0436194d736ab4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-22-14-55-34.bpo-40670.R5sm68.rst @@ -0,0 +1,3 @@ +More reliable validation of statements in :class:`timeit.Timer`. It now +accepts "empty" statements (only whitespaces and comments) and rejects +misindentent statements. From 4fa9362015daa9b56f834eb11e5e585922028f73 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Tue, 22 Sep 2020 08:01:17 -0700 Subject: [PATCH 0139/1261] bpo-41817: use new StrEnum to ensure all members are strings (GH-22348) * use new StrEnum to ensure all members are strings --- Lib/tkinter/__init__.py | 14 +++++++------- .../2020-09-22-00-23-30.bpo-41817.bnh-VG.rst | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-22-00-23-30.bpo-41817.bnh-VG.rst diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 1067ab6a8b8a1d..3919397d3cead2 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -144,12 +144,12 @@ def _splitdict(tk, v, cut_minus=True, conv=None): return dict -class EventType(str, enum.Enum): +class EventType(enum.StrEnum): KeyPress = '2' - Key = KeyPress, + Key = KeyPress KeyRelease = '3' ButtonPress = '4' - Button = ButtonPress, + Button = ButtonPress ButtonRelease = '5' Motion = '6' Enter = '7' @@ -180,10 +180,10 @@ class EventType(str, enum.Enum): Colormap = '32' ClientMessage = '33' # undocumented Mapping = '34' # undocumented - VirtualEvent = '35', # undocumented - Activate = '36', - Deactivate = '37', - MouseWheel = '38', + VirtualEvent = '35' # undocumented + Activate = '36' + Deactivate = '37' + MouseWheel = '38' def __str__(self): return self.name diff --git a/Misc/NEWS.d/next/Library/2020-09-22-00-23-30.bpo-41817.bnh-VG.rst b/Misc/NEWS.d/next/Library/2020-09-22-00-23-30.bpo-41817.bnh-VG.rst new file mode 100644 index 00000000000000..6a634bb613260b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-22-00-23-30.bpo-41817.bnh-VG.rst @@ -0,0 +1 @@ +fix `tkinter.EventType` Enum so all members are strings, and none are tuples From 62b5627675fd71640a2d427695e6be098c6622e6 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Tue, 22 Sep 2020 16:53:03 +0100 Subject: [PATCH 0140/1261] bpo-41602: raise SIGINT exit code on KeyboardInterrupt from pymain_run_module (#21956) Closes bpo issue 41602 --- Lib/test/test_runpy.py | 94 +++++++++++++++++-- .../2020-08-25-19-25-36.bpo-41602.Z64s0I.rst | 1 + Modules/main.c | 4 + 3 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-08-25-19-25-36.bpo-41602.Z64s0I.rst diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py index f8274a981cb1c0..2954dfedc7e428 100644 --- a/Lib/test/test_runpy.py +++ b/Lib/test/test_runpy.py @@ -1,15 +1,18 @@ # Test the runpy module -import unittest -import os +import contextlib +import importlib.machinery, importlib.util import os.path -import sys +import pathlib +import py_compile import re +import signal +import subprocess +import sys import tempfile -import importlib, importlib.machinery, importlib.util -import py_compile +import textwrap +import unittest import warnings -import pathlib -from test.support import verbose, no_tracing +from test.support import no_tracing, verbose from test.support.import_helper import forget, make_legacy_pyc, unload from test.support.os_helper import create_empty_file, temp_dir from test.support.script_helper import make_script, make_zip_script @@ -752,5 +755,82 @@ def test_encoding(self): self.assertEqual(result['s'], "non-ASCII: h\xe9") +class TestExit(unittest.TestCase): + STATUS_CONTROL_C_EXIT = 0xC000013A + EXPECTED_CODE = ( + STATUS_CONTROL_C_EXIT + if sys.platform == "win32" + else -signal.SIGINT + ) + @staticmethod + @contextlib.contextmanager + def tmp_path(*args, **kwargs): + with temp_dir() as tmp_fn: + yield pathlib.Path(tmp_fn) + + + def run(self, *args, **kwargs): + with self.tmp_path() as tmp: + self.ham = ham = tmp / "ham.py" + ham.write_text( + textwrap.dedent( + """\ + raise KeyboardInterrupt + """ + ) + ) + super().run(*args, **kwargs) + + def assertSigInt(self, *args, **kwargs): + proc = subprocess.run(*args, **kwargs, text=True, stderr=subprocess.PIPE) + self.assertTrue(proc.stderr.endswith("\nKeyboardInterrupt\n")) + self.assertEqual(proc.returncode, self.EXPECTED_CODE) + + def test_pymain_run_file(self): + self.assertSigInt([sys.executable, self.ham]) + + def test_pymain_run_file_runpy_run_module(self): + tmp = self.ham.parent + run_module = tmp / "run_module.py" + run_module.write_text( + textwrap.dedent( + """\ + import runpy + runpy.run_module("ham") + """ + ) + ) + self.assertSigInt([sys.executable, run_module], cwd=tmp) + + def test_pymain_run_file_runpy_run_module_as_main(self): + tmp = self.ham.parent + run_module_as_main = tmp / "run_module_as_main.py" + run_module_as_main.write_text( + textwrap.dedent( + """\ + import runpy + runpy._run_module_as_main("ham") + """ + ) + ) + self.assertSigInt([sys.executable, run_module_as_main], cwd=tmp) + + def test_pymain_run_command_run_module(self): + self.assertSigInt( + [sys.executable, "-c", "import runpy; runpy.run_module('ham')"], + cwd=self.ham.parent, + ) + + def test_pymain_run_command(self): + self.assertSigInt([sys.executable, "-c", "import ham"], cwd=self.ham.parent) + + def test_pymain_run_stdin(self): + self.assertSigInt([sys.executable], input="import ham", cwd=self.ham.parent) + + def test_pymain_run_module(self): + ham = self.ham + self.assertSigInt([sys.executable, "-m", ham.stem], cwd=ham.parent) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Tests/2020-08-25-19-25-36.bpo-41602.Z64s0I.rst b/Misc/NEWS.d/next/Tests/2020-08-25-19-25-36.bpo-41602.Z64s0I.rst new file mode 100644 index 00000000000000..fa3d2f1aa374ec --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-08-25-19-25-36.bpo-41602.Z64s0I.rst @@ -0,0 +1 @@ +Add tests for SIGINT handling in the runpy module. diff --git a/Modules/main.c b/Modules/main.c index 4a76f4461bf610..2cc891f61aadd1 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -287,7 +287,11 @@ pymain_run_module(const wchar_t *modname, int set_argv0) Py_DECREF(module); return pymain_exit_err_print(); } + _Py_UnhandledKeyboardInterrupt = 0; result = PyObject_Call(runmodule, runargs, NULL); + if (!result && PyErr_Occurred() == PyExc_KeyboardInterrupt) { + _Py_UnhandledKeyboardInterrupt = 1; + } Py_DECREF(runpy); Py_DECREF(runmodule); Py_DECREF(module); From add30f9efb74525e88271b79dc6fe695ac593d63 Mon Sep 17 00:00:00 2001 From: Bas van Beek <43369155+BvB93@users.noreply.github.com> Date: Tue, 22 Sep 2020 17:55:34 +0200 Subject: [PATCH 0141/1261] bpo-41810: Reintroduce `types.EllipsisType`, `.NoneType` & `.NotImplementedType` (GH-22336) closes issue 41810 --- Doc/library/constants.rst | 13 +++++++----- Doc/library/types.rst | 21 +++++++++++++++++++ Doc/whatsnew/3.10.rst | 8 +++++++ Lib/test/test_types.py | 10 +++++++++ Lib/types.py | 3 +++ Misc/ACKS | 1 + .../2020-09-20-15-14-05.bpo-41810.7l8lyV.rst | 3 +++ 7 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-20-15-14-05.bpo-41810.7l8lyV.rst diff --git a/Doc/library/constants.rst b/Doc/library/constants.rst index f17e1a37875168..38dd552a0363ac 100644 --- a/Doc/library/constants.rst +++ b/Doc/library/constants.rst @@ -19,19 +19,21 @@ A small number of constants live in the built-in namespace. They are: .. data:: None - The sole value of the type ``NoneType``. ``None`` is frequently used to - represent the absence of a value, as when default arguments are not passed to a - function. Assignments to ``None`` are illegal and raise a :exc:`SyntaxError`. + An object frequently used to represent the absence of a value, as when + default arguments are not passed to a function. Assignments to ``None`` + are illegal and raise a :exc:`SyntaxError`. + ``None`` is the sole instance of the :data:`NoneType` type. .. data:: NotImplemented - Special value which should be returned by the binary special methods + A special value which should be returned by the binary special methods (e.g. :meth:`__eq__`, :meth:`__lt__`, :meth:`__add__`, :meth:`__rsub__`, etc.) to indicate that the operation is not implemented with respect to the other type; may be returned by the in-place binary special methods (e.g. :meth:`__imul__`, :meth:`__iand__`, etc.) for the same purpose. It should not be evaluated in a boolean context. + ``NotImplemented`` is the sole instance of the :data:`types.NotImplementedType` type. .. note:: @@ -59,8 +61,9 @@ A small number of constants live in the built-in namespace. They are: .. index:: single: ...; ellipsis literal .. data:: Ellipsis - The same as the ellipsis literal "``...``". Special value used mostly in conjunction + The same as the ellipsis literal "``...``". Special value used mostly in conjunction with extended slicing syntax for user-defined container data types. + ``Ellipsis`` is the sole instance of the :data:`types.EllipsisType` type. .. data:: __debug__ diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 79acdf4499afd2..25fa750f2ccacf 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -103,6 +103,13 @@ If you instantiate any of these types, note that signatures may vary between Pyt Standard names are defined for the following types: +.. data:: NoneType + + The type of :data:`None`. + + .. versionadded:: 3.10 + + .. data:: FunctionType LambdaType @@ -186,6 +193,13 @@ Standard names are defined for the following types: .. versionadded:: 3.7 +.. data:: NotImplementedType + + The type of :data:`NotImplemented`. + + .. versionadded:: 3.10 + + .. data:: MethodDescriptorType The type of methods of some built-in data types such as :meth:`str.join`. @@ -236,6 +250,13 @@ Standard names are defined for the following types: Defaults to ``None``. Previously the attribute was optional. +.. data:: EllipsisType + + The type of :data:`Ellipsis`. + + .. versionadded:: 3.10 + + .. class:: TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno) The type of traceback objects such as found in ``sys.exc_info()[2]``. diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index ce888fec1d8c97..f88281a934ca19 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -145,6 +145,14 @@ Add :data:`sys.orig_argv` attribute: the list of the original command line arguments passed to the Python executable. (Contributed by Victor Stinner in :issue:`23427`.) +types +----- + +Reintroduced the :data:`types.EllipsisType`, :data:`types.NoneType` +and :data:`types.NotImplementedType` classes, providing a new set +of types readily interpretable by type checkers. +(Contributed by Bas van Beek in :issue:`41810`.) + unittest -------- diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index f499fb9c8c51a4..52a59d54f044d9 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -713,6 +713,16 @@ def test_or_type_repr(self): assert repr(int | None) == "int | None" assert repr(int | typing.GenericAlias(list, int)) == "int | list[int]" + def test_ellipsis_type(self): + self.assertIsInstance(Ellipsis, types.EllipsisType) + + def test_notimplemented_type(self): + self.assertIsInstance(NotImplemented, types.NotImplementedType) + + def test_none_type(self): + self.assertIsInstance(None, types.NoneType) + + class MappingProxyTests(unittest.TestCase): mappingproxy = types.MappingProxyType diff --git a/Lib/types.py b/Lib/types.py index 9642e7212caac6..532f4806fc0226 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -296,5 +296,8 @@ def wrapped(*args, **kwargs): GenericAlias = type(list[int]) Union = type(int | str) +EllipsisType = type(Ellipsis) +NoneType = type(None) +NotImplementedType = type(NotImplemented) __all__ = [n for n in globals() if n[:1] != '_'] diff --git a/Misc/ACKS b/Misc/ACKS index e4bd3da6b6c40a..7b743464c1c1c8 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -134,6 +134,7 @@ Robin Becker Torsten Becker Bill Bedford Michał Bednarski +Bas van Beek Ian Beer Stefan Behnel Reimer Behrends diff --git a/Misc/NEWS.d/next/Library/2020-09-20-15-14-05.bpo-41810.7l8lyV.rst b/Misc/NEWS.d/next/Library/2020-09-20-15-14-05.bpo-41810.7l8lyV.rst new file mode 100644 index 00000000000000..515aea9e36ce95 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-20-15-14-05.bpo-41810.7l8lyV.rst @@ -0,0 +1,3 @@ +:data:`types.EllipsisType`, :data:`types.NotImplementedType` and +:data:`types.NoneType` have been reintroduced, providing a new set +of types readily interpretable by static type checkers. From c67c13b15c921e4e372cc7ad69c559228e8ceeb2 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 22 Sep 2020 13:21:58 -0400 Subject: [PATCH 0142/1261] bpo-35764: Rewrite the IDLE Calltips doc section (GH-22363) --- Doc/library/idle.rst | 47 ++++++++++--------- Lib/idlelib/NEWS.txt | 2 + Lib/idlelib/help.html | 43 +++++++++-------- .../2020-09-22-11-13-45.bpo-35764.VoNa8y.rst | 1 + 4 files changed, 51 insertions(+), 42 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-09-22-11-13-45.bpo-35764.VoNa8y.rst diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 43096b014fed34..a59a5d3a465703 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -527,30 +527,33 @@ by typing '_' after '.', either before or after the box is opened. Calltips ^^^^^^^^ -A calltip is shown when one types :kbd:`(` after the name of an *accessible* -function. A name expression may include dots and subscripts. A calltip -remains until it is clicked, the cursor is moved out of the argument area, -or :kbd:`)` is typed. When the cursor is in the argument part of a definition, -the menu or shortcut display a calltip. - -A calltip consists of the function signature and the first line of the -docstring. For builtins without an accessible signature, the calltip -consists of all lines up the fifth line or the first blank line. These -details may change. - -The set of *accessible* functions depends on what modules have been imported -into the user process, including those imported by Idle itself, -and what definitions have been run, all since the last restart. +A calltip is shown automatically when one types :kbd:`(` after the name +of an *accessible* function. A function name expression may include +dots and subscripts. A calltip remains until it is clicked, the cursor +is moved out of the argument area, or :kbd:`)` is typed. Whenever the +cursor is in the argument part of a definition, select Edit and "Show +Call Tip" on the menu or enter its shortcut to display a calltip. + +The calltip consists of the function's signature and docstring up to +the latter's first blank line or the fifth non-blank line. (Some builtin +functions lack an accessible signature.) A '/' or '*' in the signature +indicates that the preceding or following arguments are passed by +position or name (keyword) only. Details are subject to change. + +In Shell, the accessible functions depends on what modules have been +imported into the user process, including those imported by Idle itself, +and which definitions have been run, all since the last restart. For example, restart the Shell and enter ``itertools.count(``. A calltip -appears because Idle imports itertools into the user process for its own use. -(This could change.) Enter ``turtle.write(`` and nothing appears. Idle does -not import turtle. The menu or shortcut do nothing either. Enter -``import turtle`` and then ``turtle.write(`` will work. - -In an editor, import statements have no effect until one runs the file. One -might want to run a file after writing the import statements at the top, -or immediately run an existing file before editing. +appears because Idle imports itertools into the user process for its own +use. (This could change.) Enter ``turtle.write(`` and nothing appears. +Idle does not itself import turtle. The menu entry and shortcut also do +nothing. Enter ``import turtle``. Thereafter, ``turtle.write(`` +will display a calltip. + +In an editor, import statements have no effect until one runs the file. +One might want to run a file after writing import statements, after +adding function definitions, or after opening an existing file. .. _code-context: diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index f8ec6ab5052971..7eea0a47aa6e8e 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2020-10-05? ====================================== +bpo-35764: Rewrite the Calltips doc section. + bpo-40181: In calltips, stop reminding that '/' marks the end of positional-only arguments. diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index b2853cffe0c26d..0edd3917e1ffa5 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -509,26 +509,29 @@

Automatic indentation

Calltips

-

A calltip is shown when one types ( after the name of an accessible -function. A name expression may include dots and subscripts. A calltip -remains until it is clicked, the cursor is moved out of the argument area, -or ) is typed. When the cursor is in the argument part of a definition, -the menu or shortcut display a calltip.

-

A calltip consists of the function signature and the first line of the -docstring. For builtins without an accessible signature, the calltip -consists of all lines up the fifth line or the first blank line. These -details may change.

-

The set of accessible functions depends on what modules have been imported -into the user process, including those imported by Idle itself, -and what definitions have been run, all since the last restart.

+

A calltip is shown automatically when one types ( after the name +of an accessible function. A function name expression may include +dots and subscripts. A calltip remains until it is clicked, the cursor +is moved out of the argument area, or ) is typed. Whenever the +cursor is in the argument part of a definition, select Edit and “Show +Call Tip” on the menu or enter its shortcut to display a calltip.

+

The calltip consists of the function’s signature and docstring up to +the latter’s first blank line or the fifth non-blank line. (Some builtin +functions lack an accessible signature.) A ‘/’ or ‘*’ in the signature +indicates that the preceding or following arguments are passed by +position or name (keyword) only. Details are subject to change.

+

In Shell, the accessible functions depends on what modules have been +imported into the user process, including those imported by Idle itself, +and which definitions have been run, all since the last restart.

For example, restart the Shell and enter itertools.count(. A calltip -appears because Idle imports itertools into the user process for its own use. -(This could change.) Enter turtle.write( and nothing appears. Idle does -not import turtle. The menu or shortcut do nothing either. Enter -import turtle and then turtle.write( will work.

-

In an editor, import statements have no effect until one runs the file. One -might want to run a file after writing the import statements at the top, -or immediately run an existing file before editing.

+appears because Idle imports itertools into the user process for its own +use. (This could change.) Enter turtle.write( and nothing appears. +Idle does not itself import turtle. The menu entry and shortcut also do +nothing. Enter import turtle. Thereafter, turtle.write( +will display a calltip.

+

In an editor, import statements have no effect until one runs the file. +One might want to run a file after writing import statements, after +adding function definitions, or after opening an existing file.

Code Context

@@ -975,7 +978,7 @@

Navigation



- Last updated on Sep 09, 2020. + Last updated on Sep 22, 2020. Found a bug?
diff --git a/Misc/NEWS.d/next/IDLE/2020-09-22-11-13-45.bpo-35764.VoNa8y.rst b/Misc/NEWS.d/next/IDLE/2020-09-22-11-13-45.bpo-35764.VoNa8y.rst new file mode 100644 index 00000000000000..eb62d3699d5feb --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-09-22-11-13-45.bpo-35764.VoNa8y.rst @@ -0,0 +1 @@ +Rewrite the Calltips doc section. From e560a17c04ef84bdda83dcb371e9f62d9bd25365 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Tue, 22 Sep 2020 13:00:07 -0700 Subject: [PATCH 0143/1261] bpo-41816: `StrEnum.__str__` is `str.__str__` (GH-22362) use `str.__str__` for `StrEnum` so that `str(StrEnum.member)` is the same as directly accessing the string value of the `StrEnum` member --- Doc/library/enum.rst | 15 +++++++++++++++ Lib/enum.py | 2 ++ Lib/test/test_enum.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 3e9b1f9db3550f..118002bef19f85 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -622,6 +622,11 @@ an incorrect member:: Before :class:`StrEnum`, ``Directions.NORTH`` would have been the :class:`tuple` ``('north',)``. +.. note:: + + Unlike other Enum's, ``str(StrEnum.member)`` will return the value of the + member instead of the usual ``"EnumClass.member"``. + .. versionadded:: 3.10 @@ -1243,3 +1248,13 @@ all named flags and all named combinations of flags that are in the value:: >>> Color(7) # not named combination +``StrEnum`` and :meth:`str.__str__` +""""""""""""""""""""""""""""""""""" + +An important difference between :class:`StrEnum` and other Enums is the +:meth:`__str__` method; because :class:`StrEnum` members are strings, some +parts of Python will read the string data directly, while others will call +:meth:`str()`. To make those two operations have the same result, +:meth:`StrEnum.__str__` will be the same as :meth:`str.__str__` so that +``str(StrEnum.member) == StrEnum.member`` is true. + diff --git a/Lib/enum.py b/Lib/enum.py index 589b17fd697775..40ff25b9cdad37 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -718,6 +718,8 @@ def __new__(cls, *values): member._value_ = value return member + __str__ = str.__str__ + def _reduce_ex_by_name(self, proto): return self.name diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 8e84d929429ebf..3431040f98a726 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2036,6 +2036,37 @@ class GoodStrEnum(StrEnum): two = '2' three = b'3', 'ascii' four = b'4', 'latin1', 'strict' + self.assertEqual(GoodStrEnum.one, '1') + self.assertEqual(str(GoodStrEnum.one), '1') + self.assertEqual(GoodStrEnum.one, str(GoodStrEnum.one)) + self.assertEqual(GoodStrEnum.one, '{}'.format(GoodStrEnum.one)) + # + class DumbMixin: + def __str__(self): + return "don't do this" + class DumbStrEnum(DumbMixin, StrEnum): + five = '5' + six = '6' + seven = '7' + self.assertEqual(DumbStrEnum.seven, '7') + self.assertEqual(str(DumbStrEnum.seven), "don't do this") + # + class EnumMixin(Enum): + def hello(self): + print('hello from %s' % (self, )) + class HelloEnum(EnumMixin, StrEnum): + eight = '8' + self.assertEqual(HelloEnum.eight, '8') + self.assertEqual(HelloEnum.eight, str(HelloEnum.eight)) + # + class GoodbyeMixin: + def goodbye(self): + print('%s wishes you a fond farewell') + class GoodbyeEnum(GoodbyeMixin, EnumMixin, StrEnum): + nine = '9' + self.assertEqual(GoodbyeEnum.nine, '9') + self.assertEqual(GoodbyeEnum.nine, str(GoodbyeEnum.nine)) + # with self.assertRaisesRegex(TypeError, '1 is not a string'): class FirstFailedStrEnum(StrEnum): one = 1 From 0122acb74771005aa1462023b2cc3a8700919100 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 22 Sep 2020 20:01:12 -0700 Subject: [PATCH 0144/1261] bpo-41513: Improve order of adding fractional values. Improve variable names. (GH-22368) --- Modules/mathmodule.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 935759ec671ca5..5cd31b7dd4acfb 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2502,8 +2502,8 @@ exactly equal) was verified for 1 billion random inputs with n=5. [7] static inline double vector_norm(Py_ssize_t n, double *vec, double max, int found_nan) { - const double T27 = 134217729.0; /* ldexp(1.0, 27)+1.0) */ - double x, csum = 1.0, oldcsum, scale, frac=0.0, frac_mid=0.0, frac_lo=0.0; + const double T27 = 134217729.0; /* ldexp(1.0, 27) + 1.0) */ + double x, scale, oldcsum, csum = 1.0, frac1 = 0.0, frac2 = 0.0, frac3 = 0.0; double t, hi, lo, h; int max_e; Py_ssize_t i; @@ -2539,18 +2539,18 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan) assert(fabs(csum) >= fabs(x)); oldcsum = csum; csum += x; - frac += (oldcsum - csum) + x; + frac1 += (oldcsum - csum) + x; x = 2.0 * hi * lo; assert(fabs(csum) >= fabs(x)); oldcsum = csum; csum += x; - frac_mid += (oldcsum - csum) + x; + frac2 += (oldcsum - csum) + x; assert(csum + lo * lo == csum); - frac_lo += lo * lo; + frac3 += lo * lo; } - h = sqrt(csum - 1.0 + (frac_lo + frac_mid + frac)); + h = sqrt(csum - 1.0 + (frac1 + frac2 + frac3)); x = h; t = x * T27; @@ -2562,21 +2562,21 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan) assert(fabs(csum) >= fabs(x)); oldcsum = csum; csum += x; - frac += (oldcsum - csum) + x; + frac1 += (oldcsum - csum) + x; x = -2.0 * hi * lo; assert(fabs(csum) >= fabs(x)); oldcsum = csum; csum += x; - frac_mid += (oldcsum - csum) + x; + frac2 += (oldcsum - csum) + x; x = -lo * lo; assert(fabs(csum) >= fabs(x)); oldcsum = csum; csum += x; - frac_lo += (oldcsum - csum) + x; + frac3 += (oldcsum - csum) + x; - x = csum - 1.0 + (frac_lo + frac_mid + frac); + x = csum - 1.0 + (frac1 + frac2 + frac3); return (h + x / (2.0 * h)) / scale; } /* When max_e < -1023, ldexp(1.0, -max_e) overflows. @@ -2591,9 +2591,9 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan) assert(fabs(csum) >= fabs(x)); oldcsum = csum; csum += x; - frac += (oldcsum - csum) + x; + frac1 += (oldcsum - csum) + x; } - return max * sqrt(csum - 1.0 + frac); + return max * sqrt(csum - 1.0 + frac1); } #define NUM_STACK_ELEMS 16 From 3c9f8e59f42cbad0ebc6a5a63a6c248728c2faa6 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Wed, 23 Sep 2020 05:33:21 -0500 Subject: [PATCH 0145/1261] bpo-1635741: Port _lsprof extension to multi-phase init (PEP 489) (GH-22220) --- ...2020-09-12-18-34-34.bpo-1635741.lh335O.rst | 2 + Modules/_lsprof.c | 215 ++++++++++-------- Modules/clinic/_lsprof.c.h | 21 +- 3 files changed, 139 insertions(+), 99 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-12-18-34-34.bpo-1635741.lh335O.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-12-18-34-34.bpo-1635741.lh335O.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-12-18-34-34.bpo-1635741.lh335O.rst new file mode 100644 index 00000000000000..ba61819df9e082 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-12-18-34-34.bpo-1635741.lh335O.rst @@ -0,0 +1,2 @@ +Port the :mod:`_lsprof` extension module to multi-phase initialization +(:pep:`489`). diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index a4ba7d52300338..78d464d1481d75 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -55,12 +55,22 @@ module _lsprof class _lsprof.Profiler "ProfilerObject *" "&ProfilerType" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=e349ac952152f336]*/ -static PyTypeObject PyProfiler_Type; #include "clinic/_lsprof.c.h" -#define PyProfiler_Check(op) PyObject_TypeCheck(op, &PyProfiler_Type) -#define PyProfiler_CheckExact(op) Py_IS_TYPE(op, &PyProfiler_Type) +typedef struct { + PyTypeObject *profiler_type; + PyTypeObject *stats_entry_type; + PyTypeObject *stats_subentry_type; +} _lsprof_state; + +static inline _lsprof_state* +_lsprof_get_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_lsprof_state *)state; +} /*** External Timers ***/ @@ -478,28 +488,24 @@ static PyStructSequence_Field profiler_subentry_fields[] = { }; static PyStructSequence_Desc profiler_entry_desc = { - "_lsprof.profiler_entry", /* name */ - NULL, /* doc */ - profiler_entry_fields, - 6 + .name = "_lsprof.profiler_entry", + .doc = "", + .fields = profiler_entry_fields, + .n_in_sequence = 6 }; static PyStructSequence_Desc profiler_subentry_desc = { - "_lsprof.profiler_subentry", /* name */ - NULL, /* doc */ - profiler_subentry_fields, - 5 + .name = "_lsprof.profiler_subentry", + .doc = "", + .fields = profiler_subentry_fields, + .n_in_sequence = 5 }; -static int initialized; -static PyTypeObject StatsEntryType; -static PyTypeObject StatsSubEntryType; - - typedef struct { PyObject *list; PyObject *sublist; double factor; + _lsprof_state *state; } statscollector_t; static int statsForSubEntry(rotating_node_t *node, void *arg) @@ -509,7 +515,7 @@ static int statsForSubEntry(rotating_node_t *node, void *arg) ProfilerEntry *entry = (ProfilerEntry*) sentry->header.key; int err; PyObject *sinfo; - sinfo = PyObject_CallFunction((PyObject*) &StatsSubEntryType, + sinfo = PyObject_CallFunction((PyObject*) collect->state->stats_subentry_type, "((Olldd))", entry->userObj, sentry->callcount, @@ -547,7 +553,7 @@ static int statsForEntry(rotating_node_t *node, void *arg) collect->sublist = Py_None; } - info = PyObject_CallFunction((PyObject*) &StatsEntryType, + info = PyObject_CallFunction((PyObject*) collect->state->stats_entry_type, "((OllddO))", entry->userObj, entry->callcount, @@ -566,6 +572,8 @@ static int statsForEntry(rotating_node_t *node, void *arg) /*[clinic input] _lsprof.Profiler.getstats + cls: defining_class + list of profiler_entry objects. getstats() -> list of profiler_entry objects @@ -592,10 +600,11 @@ profiler_subentry objects: [clinic start generated code]*/ static PyObject * -_lsprof_Profiler_getstats_impl(ProfilerObject *self) -/*[clinic end generated code: output=9461b451e9ef0f24 input=ade04fa384ce450a]*/ +_lsprof_Profiler_getstats_impl(ProfilerObject *self, PyTypeObject *cls) +/*[clinic end generated code: output=1806ef720019ee03 input=445e193ef4522902]*/ { statscollector_t collect; + collect.state = PyType_GetModuleState(cls); if (pending_exception(self)) { return NULL; } @@ -735,7 +744,9 @@ profiler_dealloc(ProfilerObject *op) flush_unmatched(op); clearEntries(op); Py_XDECREF(op->externalTimer); - Py_TYPE(op)->tp_free(op); + PyTypeObject *tp = Py_TYPE(op); + tp->tp_free(op); + Py_DECREF(tp); } static int @@ -782,91 +793,107 @@ Profiler(timer=None, timeunit=None, subcalls=True, builtins=True)\n\ is, in seconds).\n\ "); -static PyTypeObject PyProfiler_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_lsprof.Profiler", /* tp_name */ - sizeof(ProfilerObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)profiler_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - profiler_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - profiler_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)profiler_init, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ - PyObject_Del, /* tp_free */ +static PyType_Slot _lsprof_profiler_type_spec_slots[] = { + {Py_tp_doc, (void *)profiler_doc}, + {Py_tp_methods, profiler_methods}, + {Py_tp_dealloc, profiler_dealloc}, + {Py_tp_init, profiler_init}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_free, PyObject_Del}, + {0, 0} +}; + +static PyType_Spec _lsprof_profiler_type_spec = { + .name = "_lsprof.Profiler", + .basicsize = sizeof(ProfilerObject), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .slots = _lsprof_profiler_type_spec_slots, }; static PyMethodDef moduleMethods[] = { {NULL, NULL} }; +static int +_lsprof_traverse(PyObject *module, visitproc visit, void *arg) +{ + _lsprof_state *state = _lsprof_get_state(module); + Py_VISIT(state->profiler_type); + Py_VISIT(state->stats_entry_type); + Py_VISIT(state->stats_subentry_type); + return 0; +} + +static int +_lsprof_clear(PyObject *module) +{ + _lsprof_state *state = _lsprof_get_state(module); + Py_CLEAR(state->profiler_type); + Py_CLEAR(state->stats_entry_type); + Py_CLEAR(state->stats_subentry_type); + return 0; +} + +static void +_lsprof_free(void *module) +{ + _lsprof_clear((PyObject *)module); +} + +static int +_lsprof_exec(PyObject *module) +{ + _lsprof_state *state = PyModule_GetState(module); + + state->profiler_type = (PyTypeObject *)PyType_FromModuleAndSpec( + module, &_lsprof_profiler_type_spec, NULL); + if (state->profiler_type == NULL) { + return -1; + } + + if (PyModule_AddType(module, state->profiler_type) < 0) { + return -1; + } + + state->stats_entry_type = PyStructSequence_NewType(&profiler_entry_desc); + if (state->stats_entry_type == NULL) { + return -1; + } + if (PyModule_AddType(module, state->stats_entry_type) < 0) { + return -1; + } + + state->stats_subentry_type = PyStructSequence_NewType(&profiler_subentry_desc); + if (state->stats_subentry_type == NULL) { + return -1; + } + if (PyModule_AddType(module, state->stats_subentry_type) < 0) { + return -1; + } + + return 0; +} + +static PyModuleDef_Slot _lsprofslots[] = { + {Py_mod_exec, _lsprof_exec}, + {0, NULL} +}; static struct PyModuleDef _lsprofmodule = { PyModuleDef_HEAD_INIT, - "_lsprof", - "Fast profiler", - -1, - moduleMethods, - NULL, - NULL, - NULL, - NULL + .m_name = "_lsprof", + .m_doc = "Fast profiler", + .m_size = sizeof(_lsprof_state), + .m_methods = moduleMethods, + .m_slots = _lsprofslots, + .m_traverse = _lsprof_traverse, + .m_clear = _lsprof_clear, + .m_free = _lsprof_free }; PyMODINIT_FUNC PyInit__lsprof(void) { - PyObject *module, *d; - module = PyModule_Create(&_lsprofmodule); - if (module == NULL) - return NULL; - d = PyModule_GetDict(module); - if (PyType_Ready(&PyProfiler_Type) < 0) - return NULL; - PyDict_SetItemString(d, "Profiler", (PyObject *)&PyProfiler_Type); - - if (!initialized) { - if (PyStructSequence_InitType2(&StatsEntryType, - &profiler_entry_desc) < 0) - return NULL; - if (PyStructSequence_InitType2(&StatsSubEntryType, - &profiler_subentry_desc) < 0) - return NULL; - } - Py_INCREF((PyObject*) &StatsEntryType); - Py_INCREF((PyObject*) &StatsSubEntryType); - PyModule_AddObject(module, "profiler_entry", - (PyObject*) &StatsEntryType); - PyModule_AddObject(module, "profiler_subentry", - (PyObject*) &StatsSubEntryType); - initialized = 1; - return module; + return PyModuleDef_Init(&_lsprofmodule); } diff --git a/Modules/clinic/_lsprof.c.h b/Modules/clinic/_lsprof.c.h index 50762e3ff35960..5d9c209eab8563 100644 --- a/Modules/clinic/_lsprof.c.h +++ b/Modules/clinic/_lsprof.c.h @@ -31,14 +31,25 @@ PyDoc_STRVAR(_lsprof_Profiler_getstats__doc__, " inlinetime inline time (not in further subcalls)"); #define _LSPROF_PROFILER_GETSTATS_METHODDEF \ - {"getstats", (PyCFunction)_lsprof_Profiler_getstats, METH_NOARGS, _lsprof_Profiler_getstats__doc__}, + {"getstats", (PyCFunction)(void(*)(void))_lsprof_Profiler_getstats, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _lsprof_Profiler_getstats__doc__}, static PyObject * -_lsprof_Profiler_getstats_impl(ProfilerObject *self); +_lsprof_Profiler_getstats_impl(ProfilerObject *self, PyTypeObject *cls); static PyObject * -_lsprof_Profiler_getstats(ProfilerObject *self, PyObject *Py_UNUSED(ignored)) +_lsprof_Profiler_getstats(ProfilerObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _lsprof_Profiler_getstats_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":getstats", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _lsprof_Profiler_getstats_impl(self, cls); + +exit: + return return_value; } -/*[clinic end generated code: output=24c525812713e00f input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b4727cfebecdd22d input=a9049054013a1b77]*/ From 952ac1b8e4d074c314d8ba9257f5083a9c3c9c41 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Wed, 23 Sep 2020 05:38:16 -0500 Subject: [PATCH 0146/1261] bpo-1635741, unicodedata: add ucd_type parameter to UCD_Check() macro (GH-22328) Co-authored-by: Victor Stinner --- Modules/unicodedata.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index 8a1198a2b712d9..8e11cfc4dafa92 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -92,7 +92,10 @@ static PyMemberDef DB_members[] = { /* forward declaration */ static PyTypeObject UCD_Type; -#define UCD_Check(o) Py_IS_TYPE(o, &UCD_Type) + +// Check if self is an instance of UCD_Type. +// Return 0 if self is NULL (when the PyCapsule C API is used). +#define UCD_Check(self, ucd_type) (self != NULL && Py_IS_TYPE(self, ucd_type)) static PyObject* new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4), @@ -135,7 +138,7 @@ unicodedata_UCD_decimal_impl(PyObject *self, int chr, long rc; Py_UCS4 c = (Py_UCS4)chr; - if (self && UCD_Check(self)) { + if (UCD_Check(self, &UCD_Type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) { /* unassigned */ @@ -223,7 +226,7 @@ unicodedata_UCD_numeric_impl(PyObject *self, int chr, double rc; Py_UCS4 c = (Py_UCS4)chr; - if (self && UCD_Check(self)) { + if (UCD_Check(self, &UCD_Type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) { /* unassigned */ @@ -268,7 +271,7 @@ unicodedata_UCD_category_impl(PyObject *self, int chr) int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->category; - if (self && UCD_Check(self)) { + if (UCD_Check(self, &UCD_Type)) { const change_record *old = get_old_record(self, c); if (old->category_changed != 0xFF) index = old->category_changed; @@ -295,7 +298,7 @@ unicodedata_UCD_bidirectional_impl(PyObject *self, int chr) int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->bidirectional; - if (self && UCD_Check(self)) { + if (UCD_Check(self, &UCD_Type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -324,7 +327,7 @@ unicodedata_UCD_combining_impl(PyObject *self, int chr) int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->combining; - if (self && UCD_Check(self)) { + if (UCD_Check(self, &UCD_Type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -352,7 +355,7 @@ unicodedata_UCD_mirrored_impl(PyObject *self, int chr) int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->mirrored; - if (self && UCD_Check(self)) { + if (UCD_Check(self, &UCD_Type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -379,7 +382,7 @@ unicodedata_UCD_east_asian_width_impl(PyObject *self, int chr) int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->east_asian_width; - if (self && UCD_Check(self)) { + if (UCD_Check(self, &UCD_Type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -413,7 +416,7 @@ unicodedata_UCD_decomposition_impl(PyObject *self, int chr) code = (int)c; - if (self && UCD_Check(self)) { + if (UCD_Check(self, &UCD_Type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) return PyUnicode_FromString(""); /* unassigned */ @@ -460,7 +463,7 @@ get_decomp_record(PyObject *self, Py_UCS4 code, int *index, int *prefix, int *co { if (code >= 0x110000) { *index = 0; - } else if (self && UCD_Check(self) && + } else if (UCD_Check(self, &UCD_Type) && get_old_record(self, code)->category_changed==0) { /* unassigned in old version */ *index = 0; @@ -558,7 +561,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k) continue; } /* normalization changes */ - if (self && UCD_Check(self)) { + if (UCD_Check(self, &UCD_Type)) { Py_UCS4 value = ((PreviousDBVersion*)self)->normalization(code); if (value != 0) { stack[stackptr++] = value; @@ -799,7 +802,7 @@ is_normalized_quickcheck(PyObject *self, PyObject *input, { /* An older version of the database is requested, quickchecks must be disabled. */ - if (self && UCD_Check(self)) + if (UCD_Check(self, &UCD_Type)) return NO; Py_ssize_t i, len; @@ -1066,7 +1069,7 @@ _getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen, if (!with_alias_and_seq && (IS_ALIAS(code) || IS_NAMED_SEQ(code))) return 0; - if (self && UCD_Check(self)) { + if (UCD_Check(self, &UCD_Type)) { /* in 3.2.0 there are no aliases and named sequences */ const change_record *old; if (IS_ALIAS(code) || IS_NAMED_SEQ(code)) From 408ec3cc245f73f91b1e478be7d9e4d7b94d4032 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Sep 2020 14:04:57 +0200 Subject: [PATCH 0147/1261] bpo-41834: Remove _Py_CheckRecursionLimit variable (GH-22359) Remove the global _Py_CheckRecursionLimit variable: it has been replaced by ceval.recursion_limit of the PyInterpreterState structure. There is no need to keep the variable for the stable ABI, since Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() were not usable in Python 3.8 and older: these macros accessed PyThreadState members, whereas the PyThreadState structure is opaque in the limited C API. --- Doc/whatsnew/3.10.rst | 4 ++++ Include/internal/pycore_ceval.h | 2 -- .../2020-09-22-14-47-12.bpo-41834.nrOrDU.rst | 3 +++ PC/python3dll.c | 1 - Python/ceval.c | 16 +++------------- Tools/c-analyzer/TODO | 1 - Tools/c-analyzer/known.tsv | 1 - 7 files changed, 10 insertions(+), 18 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-09-22-14-47-12.bpo-41834.nrOrDU.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index f88281a934ca19..606fad2fdcf059 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -314,3 +314,7 @@ Removed * Removed ``PyUnicode_AsUnicodeCopy()``. Please use :c:func:`PyUnicode_AsUCS4Copy` or :c:func:`PyUnicode_AsWideCharString` (Contributed by Inada Naoki in :issue:`41103`.) + +* Removed ``_Py_CheckRecursionLimit`` variable: it has been replaced by + ``ceval.recursion_limit`` of the :c:type:`PyInterpreterState` structure. + (Contributed by Victor Stinner in :issue:`41834`.) diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index aafb533b57d5f0..bbb667ea32d27e 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -63,8 +63,6 @@ extern void _PyEval_ReleaseLock(PyThreadState *tstate); /* --- _Py_EnterRecursiveCall() ----------------------------------------- */ -PyAPI_DATA(int) _Py_CheckRecursionLimit; - #ifdef USE_STACKCHECK /* With USE_STACKCHECK macro defined, trigger stack checks in _Py_CheckRecursiveCall() on every 64th call to Py_EnterRecursiveCall. */ diff --git a/Misc/NEWS.d/next/C API/2020-09-22-14-47-12.bpo-41834.nrOrDU.rst b/Misc/NEWS.d/next/C API/2020-09-22-14-47-12.bpo-41834.nrOrDU.rst new file mode 100644 index 00000000000000..07043dce5a6274 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-09-22-14-47-12.bpo-41834.nrOrDU.rst @@ -0,0 +1,3 @@ +Remove the ``_Py_CheckRecursionLimit`` variable: it has been replaced by +``ceval.recursion_limit`` of the :c:type:`PyInterpreterState` +structure. Patch by Victor Stinner. diff --git a/PC/python3dll.c b/PC/python3dll.c index f72f2c8af19d2b..ff69ea7ca5efaa 100644 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -663,7 +663,6 @@ EXPORT_FUNC(PyWeakref_NewProxy) EXPORT_FUNC(PyWeakref_NewRef) EXPORT_FUNC(PyWrapper_New) -EXPORT_DATA(_Py_CheckRecursionLimit) EXPORT_DATA(_Py_EllipsisObject) EXPORT_DATA(_Py_FalseStruct) EXPORT_DATA(_Py_NoneStruct) diff --git a/Python/ceval.c b/Python/ceval.c index 3de372f45a2517..4bb4b820b8e17a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -741,15 +741,12 @@ Py_MakePendingCalls(void) /* The interpreter's recursion limit */ #ifndef Py_DEFAULT_RECURSION_LIMIT -#define Py_DEFAULT_RECURSION_LIMIT 1000 +# define Py_DEFAULT_RECURSION_LIMIT 1000 #endif -int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; - void _PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval) { - _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; #ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS _gil_initialize(&ceval->gil); #endif @@ -797,14 +794,11 @@ Py_SetRecursionLimit(int new_limit) { PyThreadState *tstate = _PyThreadState_GET(); tstate->interp->ceval.recursion_limit = new_limit; - if (_Py_IsMainInterpreter(tstate)) { - _Py_CheckRecursionLimit = new_limit; - } } /* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() - if the recursion_depth reaches _Py_CheckRecursionLimit. - If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit + if the recursion_depth reaches recursion_limit. + If USE_STACKCHECK, the macro decrements recursion_limit to guarantee that _Py_CheckRecursiveCall() is regularly called. Without USE_STACKCHECK, there is no need for this. */ int @@ -819,10 +813,6 @@ _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where) _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow"); return -1; } - if (_Py_IsMainInterpreter(tstate)) { - /* Needed for ABI backwards-compatibility (see bpo-31857) */ - _Py_CheckRecursionLimit = recursion_limit; - } #endif if (tstate->recursion_critical) /* Somebody asked that we don't check for recursion. */ diff --git a/Tools/c-analyzer/TODO b/Tools/c-analyzer/TODO index 1134055f9a8fd8..f5c1a92f856959 100644 --- a/Tools/c-analyzer/TODO +++ b/Tools/c-analyzer/TODO @@ -66,7 +66,6 @@ Objects/tupleobject.c:_Py_tuple_zero_allocs Py_ssize_t _Py_ Objects/typeobject.c:next_version_tag static unsigned int next_version_tag Python/Python-ast.c:init_types():initialized static int initialized Python/bootstrap_hash.c:urandom_cache static struct { int fd; dev_t st_dev; ino_t st_ino; } urandom_cache -Python/ceval.c:_Py_CheckRecursionLimit int _Py_CheckRecursionLimit Python/ceval.c:lltrace static int lltrace Python/ceval.c:make_pending_calls():busy static int busy Python/dynload_shlib.c:handles static struct { dev_t dev; ino_t ino; void *handle; } handles[128] diff --git a/Tools/c-analyzer/known.tsv b/Tools/c-analyzer/known.tsv index f92b45e5b4d859..f8c12a3944d9b7 100644 --- a/Tools/c-analyzer/known.tsv +++ b/Tools/c-analyzer/known.tsv @@ -805,7 +805,6 @@ Objects/iterobject.c - PyCallIter_Type variable PyTypeObject PyCallIter_Type Objects/capsule.c - PyCapsule_Type variable PyTypeObject PyCapsule_Type Objects/cellobject.c - PyCell_Type variable PyTypeObject PyCell_Type Objects/methodobject.c - PyCFunction_Type variable PyTypeObject PyCFunction_Type -Python/ceval.c - _Py_CheckRecursionLimit variable int _Py_CheckRecursionLimit Objects/descrobject.c - PyClassMethodDescr_Type variable PyTypeObject PyClassMethodDescr_Type Objects/funcobject.c - PyClassMethod_Type variable PyTypeObject PyClassMethod_Type Objects/codeobject.c - PyCode_Type variable PyTypeObject PyCode_Type From 0207c20ed3123298fa8a629b30b5062755ee11c0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Sep 2020 14:05:32 +0200 Subject: [PATCH 0148/1261] bpo-40521: Fix PyUnicode_InternInPlace() (GH-22376) Fix PyUnicode_InternInPlace() when the INTERNED_STRINGS macro is not defined (when the EXPERIMENTAL_ISOLATED_SUBINTERPRETERS macro is defined). --- Objects/unicodeobject.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index fd0e8e008adae4..f32ab417c364ca 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -15754,6 +15754,10 @@ PyUnicode_InternInPlace(PyObject **p) this. */ Py_SET_REFCNT(s, Py_REFCNT(s) - 2); _PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL; +#else + // PyDict expects that interned strings have their hash + // (PyASCIIObject.hash) already computed. + (void)unicode_hash(s); #endif } From f7c5d35598bb765c20783270bdc1716a44eac454 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Sep 2020 14:06:55 +0200 Subject: [PATCH 0149/1261] bpo-40941: Fix fold_tuple_on_constants() compiler warnings (GH-22378) Add explicit casts to fix compiler warnings in fold_tuple_on_constants(). The limit of constants per code is now INT_MAX, rather than UINT_MAX. --- Python/compile.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Python/compile.c b/Python/compile.c index 3ebf221cf02b71..0f9e5c276c7b7b 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -6100,13 +6100,11 @@ fold_tuple_on_constants(struct instr *inst, PyTuple_SET_ITEM(newconst, i, constant); } Py_ssize_t index = PyList_GET_SIZE(consts); -#if SIZEOF_SIZE_T > SIZEOF_INT - if ((size_t)index >= UINT_MAX - 1) { + if ((size_t)index >= (size_t)INT_MAX - 1) { Py_DECREF(newconst); PyErr_SetString(PyExc_OverflowError, "too many constants"); return -1; } -#endif if (PyList_Append(consts, newconst)) { Py_DECREF(newconst); return -1; @@ -6116,7 +6114,7 @@ fold_tuple_on_constants(struct instr *inst, inst[i].i_opcode = NOP; } inst[n].i_opcode = LOAD_CONST; - inst[n].i_oparg = index; + inst[n].i_oparg = (int)index; return 0; } From 0ace7fa60298af3901a2cd82535c1bb66b6a196e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Sep 2020 14:07:16 +0200 Subject: [PATCH 0150/1261] bpo-40941: Fix stackdepth compiler warnings (GH-22377) Explicitly cast a difference of two pointers to int: PyFrameObject.f_stackdepth is an int. --- Python/ceval.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index 4bb4b820b8e17a..6430e792b8c5d8 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1433,9 +1433,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) if (_Py_TracingPossible(ceval2) && tstate->c_tracefunc != NULL && !tstate->tracing) { int err; - /* see maybe_call_line_trace + /* see maybe_call_line_trace() for expository comments */ - f->f_stackdepth = stack_pointer-f->f_valuestack; + f->f_stackdepth = (int)(stack_pointer - f->f_valuestack); err = maybe_call_line_trace(tstate->c_tracefunc, tstate->c_traceobj, @@ -2265,7 +2265,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT)); f->f_lasti -= sizeof(_Py_CODEUNIT); f->f_state = FRAME_SUSPENDED; - f->f_stackdepth = stack_pointer-f->f_valuestack; + f->f_stackdepth = (int)(stack_pointer - f->f_valuestack); goto exiting; } @@ -2282,7 +2282,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) retval = w; } f->f_state = FRAME_SUSPENDED; - f->f_stackdepth = stack_pointer-f->f_valuestack; + f->f_stackdepth = (int)(stack_pointer - f->f_valuestack); goto exiting; } From 7ce8b7a1a7d30d3e29a429875e54499738afb1dd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Sep 2020 14:08:38 +0200 Subject: [PATCH 0151/1261] bpo-40170: Use inline _PyType_HasFeature() function (GH-22375) Use _PyType_HasFeature() in the _io module and in structseq implementation. Replace PyType_HasFeature() opaque function call with _PyType_HasFeature() inlined function. --- Modules/_io/iobase.c | 3 ++- Objects/structseq.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index a8e55c34799bd5..195862df5dc060 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -349,8 +349,9 @@ iobase_dealloc(iobase *self) if (_PyIOBase_finalize((PyObject *) self) < 0) { /* When called from a heap type's dealloc, the type will be decref'ed on return (see e.g. subtype_dealloc in typeobject.c). */ - if (PyType_HasFeature(Py_TYPE(self), Py_TPFLAGS_HEAPTYPE)) + if (_PyType_HasFeature(Py_TYPE(self), Py_TPFLAGS_HEAPTYPE)) { Py_INCREF(Py_TYPE(self)); + } return; } _PyObject_GC_UNTRACK(self); diff --git a/Objects/structseq.c b/Objects/structseq.c index bd20ce3fbdcb94..8ae8f28cbc580f 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -94,7 +94,7 @@ structseq_dealloc(PyStructSequence *obj) Py_XDECREF(obj->ob_item[i]); } PyObject_GC_Del(obj); - if (PyType_GetFlags(tp) & Py_TPFLAGS_HEAPTYPE) { + if (_PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) { Py_DECREF(tp); } } From 8a6f69b23f3434b5e832ea09d513bf7a970fb56c Mon Sep 17 00:00:00 2001 From: sblondon Date: Wed, 23 Sep 2020 14:28:58 +0200 Subject: [PATCH 0152/1261] bpo-37779 : Add information about the overriding behavior of ConfigParser.read (GH-15177) Co-Authored-By: Kyle Stanley Co-Authored-By: Paul Ganssle --- Doc/library/configparser.rst | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst index 2e22a549ee2813..646e8a317f52c3 100644 --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -135,6 +135,30 @@ involves the ``DEFAULT`` section which provides default values for all other sections [1]_. Note also that keys in sections are case-insensitive and stored in lowercase [1]_. +It is possible to read several configurations into a single +:class:`ConfigParser`, where the most recently added configuration has the +highest priority. Any conflicting keys are taken from the more recent +configuration while the previously existing keys are retained. + +.. doctest:: + + >>> another_config = configparser.ConfigParser() + >>> another_config.read('example.ini') + ['example.ini'] + >>> another_config['topsecret.server.com']['Port'] + '50022' + >>> another_config.read_string("[topsecret.server.com]\nPort=48484") + >>> another_config['topsecret.server.com']['Port'] + '48484' + >>> another_config.read_dict({"topsecret.server.com": {"Port": 21212}}) + >>> another_config['topsecret.server.com']['Port'] + '21212' + >>> another_config['topsecret.server.com']['ForwardX11'] + 'no' + +This behaviour is equivalent to a :meth:`ConfigParser.read` call with several +files passed to the *filenames* parameter. + Supported Datatypes ------------------- From 799c295083a81435a2f55c6bb1674ac8d60e35ad Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Wed, 23 Sep 2020 09:44:31 -0400 Subject: [PATCH 0153/1261] bpo-41841: Prepare IDLE News for 3.10 (GH-22379) --- Lib/idlelib/NEWS.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 7eea0a47aa6e8e..38b98644942f9e 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -1,5 +1,5 @@ -What's New in IDLE 3.9.0 (since 3.8.0) -Released on 2020-10-05? +What's New in IDLE 3.10.0 (since 3.9.0) +Released on 2021-10-04? ====================================== @@ -8,6 +8,11 @@ bpo-35764: Rewrite the Calltips doc section. bpo-40181: In calltips, stop reminding that '/' marks the end of positional-only arguments. + +What's New in IDLE 3.9.0 (since 3.8.0) +Released on 2020-10-05? +====================================== + bpo-41468: Improve IDLE run crash error message (which users should never see). From 49df54cf41674f4390bb833a7d342f4ebc849d26 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Wed, 23 Sep 2020 11:17:26 -0400 Subject: [PATCH 0154/1261] bpo-41844: Add IDLE section to What's New 3.9 (GN-22382) --- Doc/whatsnew/3.9.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index e9fc496e47e24e..95188b7493ad44 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -387,6 +387,20 @@ http HTTP status codes ``103 EARLY_HINTS``, ``418 IM_A_TEAPOT`` and ``425 TOO_EARLY`` are added to :class:`http.HTTPStatus`. (Contributed by Dong-hee Na in :issue:`39509` and Ross Rhodes in :issue:`39507`.) +IDLE and idlelib +---------------- + +Add option to toggle cursor blink off. (Contributed by Zackery Spytz +in :issue:`4603`.) + +Escape key now closes IDLE completion windows. (Contributed by Johnny +Najera in :issue:`38944`.) + +Add keywords to module name completion list. (Contributed by Terry J. +Reedy in :issue:`37765`.) + +The changes above have been backported to 3.8 maintenance releases. + imaplib ------- From f3ead01c822daefbfa9d4d7f8d0ad9795c354560 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Wed, 23 Sep 2020 11:19:05 -0400 Subject: [PATCH 0155/1261] bpo-33822: Update IDLE section of What's New 3.8 (GH-22383) --- Doc/whatsnew/3.8.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index a2fa17811b3fc8..6a9fa341569465 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -870,8 +870,18 @@ clipboard. Converting strings from Tcl to Python and back now never fails. (Many people worked on this for eight years but the problem was finally solved by Serhiy Storchaka in :issue:`13153`.) +New in 3.8.1: + +Add option to toggle cursor blink off. (Contributed by Zackery Spytz +in :issue:`4603`.) + +Escape key now closes IDLE completion windows. (Contributed by Johnny +Najera in :issue:`38944`.) + The changes above have been backported to 3.7 maintenance releases. +Add keywords to module name completion list. (Contributed by Terry J. +Reedy in :issue:`37765`.) inspect ------- From 6b5974c8969f95e9ae6a9791263fc948b173da35 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Wed, 23 Sep 2020 12:43:45 -0600 Subject: [PATCH 0156/1261] bpo-30155: Add macros to get tzinfo from datetime instances (GH-21633) Add PyDateTime_DATE_GET_TZINFO() and PyDateTime_TIME_GET_TZINFO() macros. --- Doc/c-api/datetime.rst | 11 +++++++++++ Doc/whatsnew/3.10.rst | 6 ++++++ Include/datetime.h | 8 ++++++++ Lib/test/datetimetester.py | 14 ++++++++++---- .../C API/2020-07-26-19-39-45.bpo-30155.rHZRJ_.rst | 3 +++ Modules/_datetimemodule.c | 11 +++-------- Modules/_testcapimodule.c | 6 ++++-- Modules/_zoneinfo.c | 4 +--- 8 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-07-26-19-39-45.bpo-30155.rHZRJ_.rst diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index bd4f1ff446bcf4..415ce4cac67f15 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -185,6 +185,11 @@ must not be ``NULL``, and the type is not checked: Return the microsecond, as an int from 0 through 999999. +.. c:function:: PyObject* PyDateTime_DATE_GET_TZINFO(PyDateTime_DateTime *o) + + Return the tzinfo (which may be ``None``). + + .. versionadded:: 3.10 Macros to extract fields from time objects. The argument must be an instance of :c:data:`PyDateTime_Time`, including subclasses. The argument must not be ``NULL``, @@ -209,6 +214,12 @@ and the type is not checked: Return the microsecond, as an int from 0 through 999999. +.. c:function:: PyObject* PyDateTime_TIME_GET_TZINFO(PyDateTime_Time *o) + + Return the tzinfo (which may be ``None``). + + .. versionadded:: 3.10 + Macros to extract fields from time delta objects. The argument must be an instance of :c:data:`PyDateTime_Delta`, including subclasses. The argument must diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 606fad2fdcf059..1228f2695496c5 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -231,6 +231,12 @@ New Features Python executable. (Contributed by Victor Stinner in :issue:`23427`.) +* The :c:func:`PyDateTime_DATE_GET_TZINFO` and + :c:func:`PyDateTime_TIME_GET_TZINFO` macros have been added for accessing + the ``tzinfo`` attributes of :class:`datetime.datetime` and + :class:`datetime.time` objects. + (Contributed by Zackery Spytz in :issue:`30155`.) + Porting to Python 3.10 ---------------------- diff --git a/Include/datetime.h b/Include/datetime.h index 5d9f2558f924d0..bb565201a164d7 100644 --- a/Include/datetime.h +++ b/Include/datetime.h @@ -115,6 +115,10 @@ typedef struct /* Apply for date and datetime instances. */ + +// o is a pointer to a time or a datetime object. +#define _PyDateTime_HAS_TZINFO(o) (((_PyDateTime_BaseTZInfo *)(o))->hastzinfo) + #define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \ ((PyDateTime_Date*)o)->data[1]) #define PyDateTime_GET_MONTH(o) (((PyDateTime_Date*)o)->data[2]) @@ -128,6 +132,8 @@ typedef struct (((PyDateTime_DateTime*)o)->data[8] << 8) | \ ((PyDateTime_DateTime*)o)->data[9]) #define PyDateTime_DATE_GET_FOLD(o) (((PyDateTime_DateTime*)o)->fold) +#define PyDateTime_DATE_GET_TZINFO(o) (_PyDateTime_HAS_TZINFO(o) ? \ + ((PyDateTime_DateTime *)(o))->tzinfo : Py_None) /* Apply for time instances. */ #define PyDateTime_TIME_GET_HOUR(o) (((PyDateTime_Time*)o)->data[0]) @@ -138,6 +144,8 @@ typedef struct (((PyDateTime_Time*)o)->data[4] << 8) | \ ((PyDateTime_Time*)o)->data[5]) #define PyDateTime_TIME_GET_FOLD(o) (((PyDateTime_Time*)o)->fold) +#define PyDateTime_TIME_GET_TZINFO(o) (_PyDateTime_HAS_TZINFO(o) ? \ + ((PyDateTime_Time *)(o))->tzinfo : Py_None) /* Apply for time delta instances */ #define PyDateTime_DELTA_GET_DAYS(o) (((PyDateTime_Delta*)o)->days) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 520a51df879997..8b61c26f9e5c24 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -5991,30 +5991,36 @@ class DateTimeSubclass(datetime): for klass in [datetime, DateTimeSubclass]: for args in [(1993, 8, 26, 22, 12, 55, 99999), - (1993, 8, 26, 22, 12, 55, 99999)]: + (1993, 8, 26, 22, 12, 55, 99999, + timezone.utc)]: d = klass(*args) with self.subTest(cls=klass, date=args): - hour, minute, second, microsecond = _testcapi.PyDateTime_DATE_GET(d) + hour, minute, second, microsecond, tzinfo = \ + _testcapi.PyDateTime_DATE_GET(d) self.assertEqual(hour, d.hour) self.assertEqual(minute, d.minute) self.assertEqual(second, d.second) self.assertEqual(microsecond, d.microsecond) + self.assertIs(tzinfo, d.tzinfo) def test_PyDateTime_TIME_GET(self): class TimeSubclass(time): pass for klass in [time, TimeSubclass]: - for args in [(12, 30, 20, 10), (12, 30, 20, 10)]: + for args in [(12, 30, 20, 10), + (12, 30, 20, 10, timezone.utc)]: d = klass(*args) with self.subTest(cls=klass, date=args): - hour, minute, second, microsecond = _testcapi.PyDateTime_TIME_GET(d) + hour, minute, second, microsecond, tzinfo = \ + _testcapi.PyDateTime_TIME_GET(d) self.assertEqual(hour, d.hour) self.assertEqual(minute, d.minute) self.assertEqual(second, d.second) self.assertEqual(microsecond, d.microsecond) + self.assertIs(tzinfo, d.tzinfo) def test_timezones_offset_zero(self): utc0, utc1, non_utc = _testcapi.get_timezones_offset_zero() diff --git a/Misc/NEWS.d/next/C API/2020-07-26-19-39-45.bpo-30155.rHZRJ_.rst b/Misc/NEWS.d/next/C API/2020-07-26-19-39-45.bpo-30155.rHZRJ_.rst new file mode 100644 index 00000000000000..a276759da79338 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-07-26-19-39-45.bpo-30155.rHZRJ_.rst @@ -0,0 +1,3 @@ +Add :c:func:`PyDateTime_DATE_GET_TZINFO` and +:c:func:`PyDateTime_TIME_GET_TZINFO` macros for accessing the ``tzinfo`` +attributes of :class:`datetime.datetime` and :class:`datetime.time` objects. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 74a54e74ae0fec..0631272429f4f1 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -115,14 +115,9 @@ class datetime.IsoCalendarDate "PyDateTime_IsoCalendarDate *" "&PyDateTime_IsoCa #define SET_TD_SECONDS(o, v) ((o)->seconds = (v)) #define SET_TD_MICROSECONDS(o, v) ((o)->microseconds = (v)) -/* p is a pointer to a time or a datetime object; HASTZINFO(p) returns - * p->hastzinfo. - */ -#define HASTZINFO(p) (((_PyDateTime_BaseTZInfo *)(p))->hastzinfo) -#define GET_TIME_TZINFO(p) (HASTZINFO(p) ? \ - ((PyDateTime_Time *)(p))->tzinfo : Py_None) -#define GET_DT_TZINFO(p) (HASTZINFO(p) ? \ - ((PyDateTime_DateTime *)(p))->tzinfo : Py_None) +#define HASTZINFO _PyDateTime_HAS_TZINFO +#define GET_TIME_TZINFO PyDateTime_TIME_GET_TZINFO +#define GET_DT_TZINFO PyDateTime_DATE_GET_TZINFO /* M is a char or int claiming to be a valid month. The macro is equivalent * to the two-sided Python test * 1 <= M <= 12 diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 7536d29535038c..0e098779696b73 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -2677,8 +2677,9 @@ test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj) minute = PyDateTime_DATE_GET_MINUTE(obj); second = PyDateTime_DATE_GET_SECOND(obj); microsecond = PyDateTime_DATE_GET_MICROSECOND(obj); + PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj); - return Py_BuildValue("(llll)", hour, minute, second, microsecond); + return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo); } static PyObject * @@ -2690,8 +2691,9 @@ test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj) minute = PyDateTime_TIME_GET_MINUTE(obj); second = PyDateTime_TIME_GET_SECOND(obj); microsecond = PyDateTime_TIME_GET_MICROSECOND(obj); + PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj); - return Py_BuildValue("(llll)", hour, minute, second, microsecond); + return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo); } static PyObject * diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c index 2cee65fac6dd04..bee59b8d2ae0cc 100644 --- a/Modules/_zoneinfo.c +++ b/Modules/_zoneinfo.c @@ -484,9 +484,7 @@ zoneinfo_tzname(PyObject *self, PyObject *dt) return tti->tzname; } -#define HASTZINFO(p) (((_PyDateTime_BaseTZInfo *)(p))->hastzinfo) -#define GET_DT_TZINFO(p) \ - (HASTZINFO(p) ? ((PyDateTime_DateTime *)(p))->tzinfo : Py_None) +#define GET_DT_TZINFO PyDateTime_DATE_GET_TZINFO static PyObject * zoneinfo_fromutc(PyObject *obj_self, PyObject *dt) From ca13d0fe2cc074a3dfe97e938156c9d20de103f5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Sep 2020 23:21:19 +0200 Subject: [PATCH 0157/1261] bpo-41833: threading.Thread now uses the target name (GH-22357) --- Doc/library/threading.rst | 9 +++-- Lib/test/test_threading.py | 34 +++++++++++++++++-- Lib/threading.py | 20 ++++++++--- .../2020-09-22-13-51-14.bpo-41833.6HVDjT.rst | 2 ++ 4 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-22-13-51-14.bpo-41833.6HVDjT.rst diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 7fcf93d74610eb..7eb12fe116bd2d 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -264,8 +264,10 @@ since it is impossible to detect the termination of alien threads. *target* is the callable object to be invoked by the :meth:`run` method. Defaults to ``None``, meaning nothing is called. - *name* is the thread name. By default, a unique name is constructed of the - form "Thread-*N*" where *N* is a small decimal number. + *name* is the thread name. By default, a unique name is constructed + of the form "Thread-*N*" where *N* is a small decimal number, + or "Thread-*N* (target)" where "target" is ``target.__name__`` if the + *target* argument is specified. *args* is the argument tuple for the target invocation. Defaults to ``()``. @@ -280,6 +282,9 @@ since it is impossible to detect the termination of alien threads. base class constructor (``Thread.__init__()``) before doing anything else to the thread. + .. versionchanged:: 3.10 + Use the *target* name if *name* argument is omitted. + .. versionchanged:: 3.3 Added the *daemon* argument. diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index d02d3b346f9cc8..2f0f3ae0946a57 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -20,6 +20,7 @@ import signal import textwrap +from unittest import mock from test import lock_tests from test import support @@ -86,6 +87,33 @@ def tearDown(self): class ThreadTests(BaseTestCase): + @cpython_only + def test_name(self): + def func(): pass + + thread = threading.Thread(name="myname1") + self.assertEqual(thread.name, "myname1") + + # Convert int name to str + thread = threading.Thread(name=123) + self.assertEqual(thread.name, "123") + + # target name is ignored if name is specified + thread = threading.Thread(target=func, name="myname2") + self.assertEqual(thread.name, "myname2") + + with mock.patch.object(threading, '_counter', return_value=2): + thread = threading.Thread(name="") + self.assertEqual(thread.name, "Thread-2") + + with mock.patch.object(threading, '_counter', return_value=3): + thread = threading.Thread() + self.assertEqual(thread.name, "Thread-3") + + with mock.patch.object(threading, '_counter', return_value=5): + thread = threading.Thread(target=func) + self.assertEqual(thread.name, "Thread-5 (func)") + # Create a bunch of threads, let each do some work, wait until all are # done. def test_various_ops(self): @@ -531,7 +559,7 @@ def test_main_thread_after_fork_from_nonmain_thread(self): import os, threading, sys from test import support - def f(): + def func(): pid = os.fork() if pid == 0: main = threading.main_thread() @@ -544,14 +572,14 @@ def f(): else: support.wait_process(pid, exitcode=0) - th = threading.Thread(target=f) + th = threading.Thread(target=func) th.start() th.join() """ _, out, err = assert_python_ok("-c", code) data = out.decode().replace('\r', '') self.assertEqual(err, b"") - self.assertEqual(data, "Thread-1\nTrue\nTrue\n") + self.assertEqual(data, "Thread-1 (func)\nTrue\nTrue\n") def test_main_thread_during_shutdown(self): # bpo-31516: current_thread() should still point to the main thread diff --git a/Lib/threading.py b/Lib/threading.py index ab29db77a747a2..06c77f70fe74f5 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -745,10 +745,9 @@ class BrokenBarrierError(RuntimeError): # Helper to generate new thread names -_counter = _count().__next__ -_counter() # Consume 0 so first non-main thread has id 1. -def _newname(template="Thread-%d"): - return template % _counter() +_counter = _count(1).__next__ +def _newname(name_template): + return name_template % _counter() # Active thread administration _active_limbo_lock = _allocate_lock() @@ -800,8 +799,19 @@ class is implemented. assert group is None, "group argument must be None for now" if kwargs is None: kwargs = {} + if name: + name = str(name) + else: + name = _newname("Thread-%d") + if target is not None: + try: + target_name = target.__name__ + name += f" ({target_name})" + except AttributeError: + pass + self._target = target - self._name = str(name or _newname()) + self._name = name self._args = args self._kwargs = kwargs if daemon is not None: diff --git a/Misc/NEWS.d/next/Library/2020-09-22-13-51-14.bpo-41833.6HVDjT.rst b/Misc/NEWS.d/next/Library/2020-09-22-13-51-14.bpo-41833.6HVDjT.rst new file mode 100644 index 00000000000000..abb3a077d91b81 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-22-13-51-14.bpo-41833.6HVDjT.rst @@ -0,0 +1,2 @@ +The :class:`threading.Thread` constructor now uses the target name if the +*target* argument is specified but the *name* argument is omitted. From 823449599f013a27a07e43ea9c437a5ca7a3d686 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Sep 2020 23:25:40 +0200 Subject: [PATCH 0158/1261] bpo-41654: Fix compiler warning in MemoryError_dealloc() (GH-22387) Fix warning: Objects\exceptions.c(2324,56): warning C4098: 'MemoryError_dealloc': 'void' function returning a value --- Objects/exceptions.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c index b08cbdd6aed357..b14da20db0c4e7 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2321,7 +2321,8 @@ MemoryError_dealloc(PyBaseExceptionObject *self) /* If this is a subclass of MemoryError, we don't need to * do anything in the free-list*/ if (!Py_IS_TYPE(self, (PyTypeObject *) PyExc_MemoryError)) { - return Py_TYPE(self)->tp_free((PyObject *)self); + Py_TYPE(self)->tp_free((PyObject *)self); + return; } _PyObject_GC_UNTRACK(self); From 1c00b8e6d780a5795ee2de83c0cc98952b98cf43 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Sep 2020 23:25:54 +0200 Subject: [PATCH 0159/1261] bpo-41428: Fix compiler warnings in unionobject.c (GH-22388) Use Py_ssize_t type rather than int, to store lengths in unionobject.c. Fix warnings: Objects\unionobject.c(189,71): warning C4244: '+=': conversion from 'Py_ssize_t' to 'int', possible loss of data Objects\unionobject.c(182,1): warning C4244: 'initializing': conversion from 'Py_ssize_t' to 'int', possible loss of data Objects\unionobject.c(205,1): warning C4244: 'initializing': conversion from 'Py_ssize_t' to 'int', possible loss of data Objects\unionobject.c(437,1): warning C4244: 'initializing': conversion from 'Py_ssize_t' to 'int', possible loss of data --- Objects/unionobject.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Objects/unionobject.c b/Objects/unionobject.c index 0ef7abb4c55c28..e055a55e91715c 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -179,8 +179,8 @@ union_richcompare(PyObject *a, PyObject *b, int op) static PyObject* flatten_args(PyObject* args) { - int arg_length = PyTuple_GET_SIZE(args); - int total_args = 0; + Py_ssize_t arg_length = PyTuple_GET_SIZE(args); + Py_ssize_t total_args = 0; // Get number of total args once it's flattened. for (Py_ssize_t i = 0; i < arg_length; i++) { PyObject *arg = PyTuple_GET_ITEM(args, i); @@ -434,7 +434,7 @@ _Py_Union(PyObject *args) unionobject* result = NULL; // Check arguments are unionable. - int nargs = PyTuple_GET_SIZE(args); + Py_ssize_t nargs = PyTuple_GET_SIZE(args); for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { PyObject *arg = PyTuple_GET_ITEM(args, iarg); if (arg == NULL) { From d2ae88325b1bc86e50eab8518a8ed35cf262e9cf Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Thu, 24 Sep 2020 15:30:09 -0400 Subject: [PATCH 0160/1261] bpo-41775: Make 'IDLE Shell' the shell title (#22399) 'Python Shell' may have contributed to some beginners confusing 'IDLE' with ' Python'. --- Lib/idlelib/NEWS.txt | 2 ++ Lib/idlelib/pyshell.py | 2 +- Misc/NEWS.d/next/IDLE/2020-09-24-14-31-16.bpo-41775.sB8Vre.rst | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-09-24-14-31-16.bpo-41775.sB8Vre.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 38b98644942f9e..754034200a1f62 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2021-10-04? ====================================== +bpo-41775: Make 'IDLE Shell' the shell title. + bpo-35764: Rewrite the Calltips doc section. bpo-40181: In calltips, stop reminding that '/' marks the end of diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 66ae0f7435daba..b69916dbe876ca 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -833,7 +833,7 @@ def display_executing_dialog(self): class PyShell(OutputWindow): - shell_title = "Python " + python_version() + " Shell" + shell_title = "IDLE Shell " + python_version() # Override classes ColorDelegator = ModifiedColorDelegator diff --git a/Misc/NEWS.d/next/IDLE/2020-09-24-14-31-16.bpo-41775.sB8Vre.rst b/Misc/NEWS.d/next/IDLE/2020-09-24-14-31-16.bpo-41775.sB8Vre.rst new file mode 100644 index 00000000000000..59605fa40235fb --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-09-24-14-31-16.bpo-41775.sB8Vre.rst @@ -0,0 +1 @@ +Use 'IDLE Shell' as shell title From 85682fe3f72dc5773009ea6382376158ce4771c7 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Fri, 25 Sep 2020 14:04:19 +0100 Subject: [PATCH 0161/1261] bpo-39934: Account for control blocks in 'except' in compiler. (GH-22395) * Account for control blocks in 'except' in compiler. Fixes #39934. --- Lib/test/test_syntax.py | 9 +++++++++ .../2020-09-24-12-15-45.bpo-39934.YVHTCF.rst | 3 +++ Python/compile.c | 19 +++++++++++-------- 3 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-24-12-15-45.bpo-39934.YVHTCF.rst diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 4657fd1c0d8a72..09c6eb3375409b 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -950,6 +950,15 @@ def test_empty_line_after_linecont(self): except SyntaxError: self.fail("Empty line after a line continuation character is valid.") + @support.cpython_only + def test_nested_named_except_blocks(self): + code = "" + for i in range(12): + code += f"{' '*i}try:\n" + code += f"{' '*(i+1)}raise Exception\n" + code += f"{' '*i}except Exception as e:\n" + code += f"{' '*4*12}pass" + self._check_error(code, "too many statically nested blocks") def test_main(): support.run_unittest(SyntaxTestCase) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-24-12-15-45.bpo-39934.YVHTCF.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-24-12-15-45.bpo-39934.YVHTCF.rst new file mode 100644 index 00000000000000..92cd1ba234d215 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-24-12-15-45.bpo-39934.YVHTCF.rst @@ -0,0 +1,3 @@ +Correctly count control blocks in 'except' in compiler. Ensures that a +syntax error, rather a fatal error, occurs for deeply nested, named +exception handlers. diff --git a/Python/compile.c b/Python/compile.c index 0f9e5c276c7b7b..f2563d7f7a411c 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -108,8 +108,8 @@ It's called a frame block to distinguish it from a basic block in the compiler IR. */ -enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_END, - WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE }; +enum fblocktype { WHILE_LOOP, FOR_LOOP, TRY_EXCEPT, FINALLY_TRY, FINALLY_END, + WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE, EXCEPTION_HANDLER }; struct fblockinfo { enum fblocktype fb_type; @@ -1623,9 +1623,7 @@ compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b, { struct fblockinfo *f; if (c->u->u_nfblocks >= CO_MAXBLOCKS) { - PyErr_SetString(PyExc_SyntaxError, - "too many statically nested blocks"); - return 0; + return compiler_error(c, "too many statically nested blocks"); } f = &c->u->u_fblock[c->u->u_nfblocks++]; f->fb_type = t; @@ -1665,6 +1663,7 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, { switch (info->fb_type) { case WHILE_LOOP: + case EXCEPTION_HANDLER: return 1; case FOR_LOOP: @@ -1675,7 +1674,7 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, ADDOP(c, POP_TOP); return 1; - case EXCEPT: + case TRY_EXCEPT: ADDOP(c, POP_BLOCK); return 1; @@ -3060,14 +3059,17 @@ compiler_try_except(struct compiler *c, stmt_ty s) return 0; ADDOP_JUMP(c, SETUP_FINALLY, except); compiler_use_next_block(c, body); - if (!compiler_push_fblock(c, EXCEPT, body, NULL, NULL)) + if (!compiler_push_fblock(c, TRY_EXCEPT, body, NULL, NULL)) return 0; VISIT_SEQ(c, stmt, s->v.Try.body); ADDOP(c, POP_BLOCK); - compiler_pop_fblock(c, EXCEPT, body); + compiler_pop_fblock(c, TRY_EXCEPT, body); ADDOP_JUMP(c, JUMP_FORWARD, orelse); n = asdl_seq_LEN(s->v.Try.handlers); compiler_use_next_block(c, except); + /* Runtime will push a block here, so we need to account for that */ + if (!compiler_push_fblock(c, EXCEPTION_HANDLER, NULL, NULL, NULL)) + return 0; for (i = 0; i < n; i++) { excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET( s->v.Try.handlers, i); @@ -3152,6 +3154,7 @@ compiler_try_except(struct compiler *c, stmt_ty s) } compiler_use_next_block(c, except); } + compiler_pop_fblock(c, EXCEPTION_HANDLER, NULL); ADDOP(c, RERAISE); compiler_use_next_block(c, orelse); VISIT_SEQ(c, stmt, s->v.Try.orelse); From 6779310471047c6c256e19678a89d548ed91ae6f Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Fri, 25 Sep 2020 14:08:50 -0400 Subject: [PATCH 0162/1261] Fix logging error message (GH-22410) Same changes as #22276 squashed to a single commit. Just hoping to get Travis to cooperate by opening a new PR... Automerge-Triggered-By: @vsajip --- Lib/logging/__init__.py | 3 ++- Lib/test/test_logging.py | 33 ++++++++++++++++++++------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 94361ca75f4f31..d8a88db378436b 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -194,7 +194,8 @@ def _checkLevel(level): raise ValueError("Unknown level: %r" % level) rv = _nameToLevel[level] else: - raise TypeError("Level not an integer or a valid string: %r" % level) + raise TypeError("Level not an integer or a valid string: %r" + % (level,)) return rv #--------------------------------------------------------------------------- diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index d23fbfb4fe281b..4cd8c7e25daa93 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3720,7 +3720,15 @@ def tzname(self, dt): utc = UTC() -class FormatterTest(unittest.TestCase): +class AssertErrorMessage: + + def assert_error_message(self, exception, message, *args, **kwargs): + try: + self.assertRaises((), *args, **kwargs) + except exception as e: + self.assertEqual(message, str(e)) + +class FormatterTest(unittest.TestCase, AssertErrorMessage): def setUp(self): self.common = { 'name': 'formatter.test', @@ -3744,12 +3752,6 @@ def get_record(self, name=None): result.update(self.variants[name]) return logging.makeLogRecord(result) - def assert_error_message(self, exception, message, *args, **kwargs): - try: - self.assertRaises(exception, *args, **kwargs) - except exception as e: - self.assertEqual(message, e.message) - def test_percent(self): # Test %-formatting r = self.get_record() @@ -3868,7 +3870,7 @@ def test_format_validate(self): # Testing failure for '-' in field name self.assert_error_message( ValueError, - "invalid field name/expression: 'name-thing'", + "invalid format: invalid field name/expression: 'name-thing'", logging.Formatter, "{name-thing}", style="{" ) # Testing failure for style mismatch @@ -3891,7 +3893,7 @@ def test_format_validate(self): # Testing failure for invalid spec self.assert_error_message( ValueError, - "bad specifier: '.2ff'", + "invalid format: bad specifier: '.2ff'", logging.Formatter, '{process:.2ff}', style='{' ) self.assertRaises(ValueError, logging.Formatter, '{process:.2Z}', style='{') @@ -3901,12 +3903,12 @@ def test_format_validate(self): # Testing failure for mismatch braces self.assert_error_message( ValueError, - "invalid format: unmatched '{' in format spec", + "invalid format: expected '}' before end of string", logging.Formatter, '{process', style='{' ) self.assert_error_message( ValueError, - "invalid format: unmatched '{' in format spec", + "invalid format: Single '}' encountered in format string", logging.Formatter, 'process}', style='{' ) self.assertRaises(ValueError, logging.Formatter, '{{foo!r:4.2}', style='{') @@ -4867,7 +4869,7 @@ def process(self, msg, kwargs): self.assertIs(self.logger.manager, orig_manager) -class LoggerTest(BaseTest): +class LoggerTest(BaseTest, AssertErrorMessage): def setUp(self): super(LoggerTest, self).setUp() @@ -4879,7 +4881,12 @@ def setUp(self): self.addCleanup(logging.shutdown) def test_set_invalid_level(self): - self.assertRaises(TypeError, self.logger.setLevel, object()) + self.assert_error_message( + TypeError, 'Level not an integer or a valid string: None', + self.logger.setLevel, None) + self.assert_error_message( + TypeError, 'Level not an integer or a valid string: (0, 0)', + self.logger.setLevel, (0, 0)) def test_exception(self): msg = 'testing exception: %r' From 0e0d195985bf58d5526dbd21ab71940d23701e95 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 26 Sep 2020 12:48:41 +0200 Subject: [PATCH 0163/1261] bpo-41428: Fix compiler warning in unionobject.c (GH-22416) Use Py_ssize_t type rather than int, to store lengths in unionobject.c. Fix the warning: Objects\unionobject.c(205,1): warning C4244: 'initializing': conversion from 'Py_ssize_t' to 'int', possible loss of data --- Objects/unionobject.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Objects/unionobject.c b/Objects/unionobject.c index e055a55e91715c..8cfb2a664753f8 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -202,8 +202,8 @@ flatten_args(PyObject* args) PyTypeObject* arg_type = Py_TYPE(arg); if (arg_type == &_Py_UnionType) { PyObject* nested_args = ((unionobject*)arg)->args; - int nested_arg_length = PyTuple_GET_SIZE(nested_args); - for (int j = 0; j < nested_arg_length; j++) { + Py_ssize_t nested_arg_length = PyTuple_GET_SIZE(nested_args); + for (Py_ssize_t j = 0; j < nested_arg_length; j++) { PyObject* nested_arg = PyTuple_GET_ITEM(nested_args, j); Py_INCREF(nested_arg); PyTuple_SET_ITEM(flattened_args, pos, nested_arg); @@ -231,7 +231,7 @@ dedup_and_flatten_args(PyObject* args) return NULL; } // Add unique elements to an array. - int added_items = 0; + Py_ssize_t added_items = 0; for (Py_ssize_t i = 0; i < arg_length; i++) { int is_duplicate = 0; PyObject* i_element = PyTuple_GET_ITEM(args, i); From 2602bc2d5c161124af76384e7088630f7f22b998 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sat, 26 Sep 2020 19:56:26 +0900 Subject: [PATCH 0164/1261] bpo-1635741: Port _bisect module to multi-phase init (GH-22415) --- .../2020-09-26-14-43-30.bpo-1635741.aJS9B3.rst | 1 + Modules/_bisectmodule.c | 14 +++++--------- 2 files changed, 6 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-26-14-43-30.bpo-1635741.aJS9B3.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-26-14-43-30.bpo-1635741.aJS9B3.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-26-14-43-30.bpo-1635741.aJS9B3.rst new file mode 100644 index 00000000000000..252dab35a1368a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-26-14-43-30.bpo-1635741.aJS9B3.rst @@ -0,0 +1 @@ +Port the :mod:`_bisect` module to the multi-phase initialization API (:pep:`489`). diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index 82d800d9a8790f..277e9755f27211 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -237,18 +237,14 @@ common approach.\n"); static struct PyModuleDef _bisectmodule = { PyModuleDef_HEAD_INIT, - "_bisect", - module_doc, - -1, - bisect_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "_bisect", + .m_doc = module_doc, + .m_methods = bisect_methods, + .m_size = 0 }; PyMODINIT_FUNC PyInit__bisect(void) { - return PyModule_Create(&_bisectmodule); + return PyModuleDef_Init(&_bisectmodule); } From acf468997abd9ae50645eded2d37170930226cae Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Sat, 26 Sep 2020 21:47:25 -0300 Subject: [PATCH 0165/1261] Revert "Fix all Python Cookbook links (#22205)" (GH-22424) This commit reverts commit ac0333e1e117b7f61ed7ef1dbcdb6e515ada603b as the original links are working again and they provide extended features such as comments and alternative versions. --- Doc/faq/programming.rst | 2 +- Doc/howto/urllib2.rst | 2 +- Doc/library/bisect.rst | 2 +- Doc/library/collections.abc.rst | 2 +- Doc/library/collections.rst | 4 ++-- Doc/library/difflib.rst | 2 +- Doc/library/math.rst | 2 +- Doc/library/random.rst | 2 +- Doc/library/shelve.rst | 2 +- Doc/library/stdtypes.rst | 2 +- Doc/library/sys.rst | 2 +- Doc/tutorial/whatnow.rst | 2 +- Doc/whatsnew/3.2.rst | 4 ++-- Lib/collections/__init__.py | 2 +- Lib/heapq.py | 2 +- Lib/test/test_math.py | 2 +- Tools/peg_generator/pegen/sccutils.py | 4 ++-- 17 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index fd0adc378bfa6f..4f4ea8b18176c2 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1141,7 +1141,7 @@ How do you remove duplicates from a list? See the Python Cookbook for a long discussion of many ways to do this: - https://github.com/ActiveState/code/tree/master/recipes/Python/52560_Remove_duplicates/recipe-52560.py + https://code.activestate.com/recipes/52560/ If you don't mind reordering the list, sort it and then scan from the end of the list, deleting duplicates as you go:: diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 38623371fbabff..046a88af62f0b3 100644 --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -601,5 +601,5 @@ This document was reviewed and revised by John Lee. scripts with a localhost server, I have to prevent urllib from using the proxy. .. [#] urllib opener for SSL proxy (CONNECT method): `ASPN Cookbook Recipe - `_. + `_. diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index 6666d55abe2e50..6bf7814b257f4a 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -60,7 +60,7 @@ The following functions are provided: .. seealso:: `SortedCollection recipe - `_ that uses + `_ that uses bisect to build a full-featured collection class with straight-forward search methods and support for a key-function. The keys are precomputed to save unnecessary calls to the key function during searches. diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst index a6038098675da2..db0e25bb0772eb 100644 --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -308,7 +308,7 @@ Notes on using :class:`Set` and :class:`MutableSet` as a mixin: .. seealso:: - * `OrderedSet recipe `_ for an + * `OrderedSet recipe `_ for an example built on :class:`MutableSet`. * For more about ABCs, see the :mod:`abc` module and :pep:`3119`. diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index a7d01b3f397a70..f538da5e1c9faa 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -135,12 +135,12 @@ The class can be used to simulate nested scopes and is useful in templating. :attr:`~collections.ChainMap.parents` property. * The `Nested Contexts recipe - `_ has options to control + `_ has options to control whether writes and other mutations apply only to the first mapping or to any mapping in the chain. * A `greatly simplified read-only version of Chainmap - `_. + `_. :class:`ChainMap` Examples and Recipes diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst index 009b7976dff15f..aa08988c8b36f7 100644 --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -633,7 +633,7 @@ If you want to know how to change the first sequence into the second, use work. * `Simple version control recipe - `_ for a small application + `_ for a small application built with :class:`SequenceMatcher`. diff --git a/Doc/library/math.rst b/Doc/library/math.rst index f152c45a87aa37..bbf64643ff59fc 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -123,7 +123,7 @@ Number-theoretic and representation functions For further discussion and two alternative approaches, see the `ASPN cookbook recipes for accurate floating point summation - `_\. + `_\. .. function:: gcd(*integers) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 4e97b1dbad85c1..0cdf0a6ac4a477 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -57,7 +57,7 @@ from sources provided by the operating system. `Complementary-Multiply-with-Carry recipe - `_ for a compatible alternative + `_ for a compatible alternative random number generator with a long period and comparatively simple update operations. diff --git a/Doc/library/shelve.rst b/Doc/library/shelve.rst index a94255bbf698e9..f08c58179a2f9f 100644 --- a/Doc/library/shelve.rst +++ b/Doc/library/shelve.rst @@ -75,7 +75,7 @@ Two additional methods are supported: .. seealso:: - `Persistent dictionary recipe `_ + `Persistent dictionary recipe `_ with widely supported storage formats and having the speed of native dictionaries. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 2eee22c79af769..0ffe7b7526fa76 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1404,7 +1404,7 @@ objects that compare equal might have different :attr:`~range.start`, .. seealso:: - * The `linspace recipe `_ + * The `linspace recipe `_ shows how to implement a lazy version of range suitable for floating point applications. diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index aa417ede402286..d201d7061f9801 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -679,7 +679,7 @@ always available. additional garbage collector overhead if the object is managed by the garbage collector. - See `recursive sizeof recipe `_ + See `recursive sizeof recipe `_ for an example of using :func:`getsizeof` recursively to find the size of containers and all their contents. diff --git a/Doc/tutorial/whatnow.rst b/Doc/tutorial/whatnow.rst index 38ce9f0a900c28..3208201312b871 100644 --- a/Doc/tutorial/whatnow.rst +++ b/Doc/tutorial/whatnow.rst @@ -43,7 +43,7 @@ More Python resources: for download. Once you begin releasing code, you can register it here so that others can find it. -* https://github.com/ActiveState/code/tree/master/recipes/Python: The Python Cookbook is a +* https://code.activestate.com/recipes/langs/python/: The Python Cookbook is a sizable collection of code examples, larger modules, and useful scripts. Particularly notable contributions are collected in a book also titled Python Cookbook (O'Reilly & Associates, ISBN 0-596-00797-3.) diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 37bae34ce74adc..06bee9966c0be2 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -781,8 +781,8 @@ functools (Contributed by Raymond Hettinger and incorporating design ideas from Jim Baker, Miki Tebeka, and Nick Coghlan; see `recipe 498245 - `_\, `recipe 577479 - `_\, :issue:`10586`, and + `_\, `recipe 577479 + `_\, :issue:`10586`, and :issue:`10593`.) * The :func:`functools.wraps` decorator now adds a :attr:`__wrapped__` attribute diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index f4da9d0cefd6bf..5d75501645fc4a 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -574,7 +574,7 @@ class Counter(dict): # http://en.wikipedia.org/wiki/Multiset # http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html # http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm - # https://github.com/ActiveState/code/tree/master/recipes/Python/259174_bag_collection_class/recipe-259174.py + # http://code.activestate.com/recipes/259174/ # Knuth, TAOCP Vol. II section 4.6.3 def __init__(self, iterable=None, /, **kwds): diff --git a/Lib/heapq.py b/Lib/heapq.py index 5895562db4142b..fabefd87f8bf8c 100644 --- a/Lib/heapq.py +++ b/Lib/heapq.py @@ -456,7 +456,7 @@ def merge(*iterables, key=None, reverse=False): # 2) Made multiple passes over the data. # 3) Made more comparisons in common cases (small k, large n, semi-random input). # See the more detailed comparison of approach at: -# https://github.com/ActiveState/code/tree/master/recipes/Python/577573_Compare_algorithms/recipe-577573.py +# http://code.activestate.com/recipes/577573-compare-algorithms-for-heapqsmallest def nsmallest(n, iterable, key=None): """Find the n smallest elements in a dataset. diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 2abe5b028b355d..a6f6483f55d897 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -611,7 +611,7 @@ def testFsum(self): def msum(iterable): """Full precision summation. Compute sum(iterable) without any intermediate accumulation of error. Based on the 'lsum' function - at https://github.com/ActiveState/code/tree/master/recipes/Python/393090_Binary_floating_point_summatiaccurate_full/recipe-393090.py + at http://code.activestate.com/recipes/393090/ """ tmant, texp = 0, 0 diff --git a/Tools/peg_generator/pegen/sccutils.py b/Tools/peg_generator/pegen/sccutils.py index 0c295196607ec8..1f0586bb2f7d6d 100644 --- a/Tools/peg_generator/pegen/sccutils.py +++ b/Tools/peg_generator/pegen/sccutils.py @@ -18,7 +18,7 @@ def strongly_connected_components( exactly once; vertices not part of a SCC are returned as singleton sets. - From https://github.com/ActiveState/code/tree/master/recipes/Python/578507_Strongly_connected_components_directed/recipe-578507.py. + From http://code.activestate.com/recipes/578507/. """ identified: Set[str] = set() stack: List[str] = [] @@ -81,7 +81,7 @@ def topsort( {B, C} {A} - From https://github.com/ActiveState/code/tree/master/recipes/Python/577413_Topological_Sort/recipe-577413.py. + From http://code.activestate.com/recipes/577413/. """ # TODO: Use a faster algorithm? for k, v in data.items(): From 99bdd80cdc118bd58d8608d5a02abeea4d7c5db1 Mon Sep 17 00:00:00 2001 From: Emmanuel Arias Date: Sun, 27 Sep 2020 00:43:18 -0300 Subject: [PATCH 0166/1261] bpo-41858: Clarify line in optparse doc (GH-22407) The existing line is easily read as being incomplete. --- Doc/library/optparse.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index c1a18e01474319..b1094198f4c844 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -55,7 +55,7 @@ equivalent to the above example:: -q -foutfile -qfoutfile -Additionally, users can run one of :: +Additionally, users can run one of the following :: -h --help From 932c1430187b141da33c793b9404c9b3b68c6096 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Sun, 27 Sep 2020 14:14:50 +0200 Subject: [PATCH 0167/1261] bpo-41861: Convert _sqlite3 cache and node static types to heap types (GH-22417) --- Modules/_sqlite/cache.c | 137 +++++++++++------------------------ Modules/_sqlite/cache.h | 6 +- Modules/_sqlite/connection.c | 2 +- Modules/_sqlite/module.c | 2 +- 4 files changed, 48 insertions(+), 99 deletions(-) diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c index 758fc022f78108..c417ce872d368d 100644 --- a/Modules/_sqlite/cache.c +++ b/Modules/_sqlite/cache.c @@ -29,7 +29,7 @@ pysqlite_Node* pysqlite_new_node(PyObject* key, PyObject* data) { pysqlite_Node* node; - node = (pysqlite_Node*) (pysqlite_NodeType.tp_alloc(&pysqlite_NodeType, 0)); + node = (pysqlite_Node*) (pysqlite_NodeType->tp_alloc(pysqlite_NodeType, 0)); if (!node) { return NULL; } @@ -48,10 +48,13 @@ pysqlite_Node* pysqlite_new_node(PyObject* key, PyObject* data) void pysqlite_node_dealloc(pysqlite_Node* self) { + PyTypeObject *tp = Py_TYPE(self); + Py_DECREF(self->key); Py_DECREF(self->data); - Py_TYPE(self)->tp_free((PyObject*)self); + tp->tp_free(self); + Py_DECREF(tp); } int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs) @@ -88,6 +91,7 @@ int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs) void pysqlite_cache_dealloc(pysqlite_Cache* self) { + PyTypeObject *tp = Py_TYPE(self); pysqlite_Node* node; pysqlite_Node* delete_node; @@ -109,7 +113,8 @@ void pysqlite_cache_dealloc(pysqlite_Cache* self) } Py_DECREF(self->mapping); - Py_TYPE(self)->tp_free((PyObject*)self); + tp->tp_free(self); + Py_DECREF(tp); } PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* key) @@ -253,6 +258,20 @@ PyObject* pysqlite_cache_display(pysqlite_Cache* self, PyObject* args) Py_RETURN_NONE; } +static PyType_Slot pysqlite_NodeType_slots[] = { + {Py_tp_dealloc, pysqlite_node_dealloc}, + {Py_tp_new, PyType_GenericNew}, + {0, NULL}, +}; + +static PyType_Spec pysqlite_NodeType_spec = { + .name = MODULE_NAME ".Node", + .basicsize = sizeof(pysqlite_Node), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE, + .slots = pysqlite_NodeType_slots, +}; +PyTypeObject *pysqlite_NodeType = NULL; + static PyMethodDef cache_methods[] = { {"get", (PyCFunction)pysqlite_cache_get, METH_O, PyDoc_STR("Gets an entry from the cache or calls the factory function to produce one.")}, @@ -261,102 +280,32 @@ static PyMethodDef cache_methods[] = { {NULL, NULL} }; -PyTypeObject pysqlite_NodeType = { - PyVarObject_HEAD_INIT(NULL, 0) - MODULE_NAME "Node", /* tp_name */ - sizeof(pysqlite_Node), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pysqlite_node_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0 /* tp_free */ +static PyType_Slot pysqlite_CacheType_slots[] = { + {Py_tp_dealloc, pysqlite_cache_dealloc}, + {Py_tp_methods, cache_methods}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_init, pysqlite_cache_init}, + {0, NULL}, }; -PyTypeObject pysqlite_CacheType = { - PyVarObject_HEAD_INIT(NULL, 0) - MODULE_NAME ".Cache", /* tp_name */ - sizeof(pysqlite_Cache), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pysqlite_cache_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - cache_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)pysqlite_cache_init, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0 /* tp_free */ +static PyType_Spec pysqlite_CacheType_spec = { + .name = MODULE_NAME ".Cache", + .basicsize = sizeof(pysqlite_Cache), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE, + .slots = pysqlite_CacheType_slots, }; +PyTypeObject *pysqlite_CacheType = NULL; -extern int pysqlite_cache_setup_types(void) +extern int pysqlite_cache_setup_types(PyObject *mod) { - int rc; - - pysqlite_NodeType.tp_new = PyType_GenericNew; - pysqlite_CacheType.tp_new = PyType_GenericNew; - - rc = PyType_Ready(&pysqlite_NodeType); - if (rc < 0) { - return rc; + pysqlite_NodeType = (PyTypeObject *)PyType_FromModuleAndSpec(mod, &pysqlite_NodeType_spec, NULL); + if (pysqlite_NodeType == NULL) { + return -1; } - rc = PyType_Ready(&pysqlite_CacheType); - return rc; + pysqlite_CacheType = (PyTypeObject *)PyType_FromModuleAndSpec(mod, &pysqlite_CacheType_spec, NULL); + if (pysqlite_CacheType == NULL) { + return -1; + } + return 0; } diff --git a/Modules/_sqlite/cache.h b/Modules/_sqlite/cache.h index 529010967c4f3a..0afdf7f09b65c7 100644 --- a/Modules/_sqlite/cache.h +++ b/Modules/_sqlite/cache.h @@ -59,8 +59,8 @@ typedef struct int decref_factory; } pysqlite_Cache; -extern PyTypeObject pysqlite_NodeType; -extern PyTypeObject pysqlite_CacheType; +extern PyTypeObject *pysqlite_NodeType; +extern PyTypeObject *pysqlite_CacheType; int pysqlite_node_init(pysqlite_Node* self, PyObject* args, PyObject* kwargs); void pysqlite_node_dealloc(pysqlite_Node* self); @@ -69,6 +69,6 @@ int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs); void pysqlite_cache_dealloc(pysqlite_Cache* self); PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* args); -int pysqlite_cache_setup_types(void); +int pysqlite_cache_setup_types(PyObject *module); #endif diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 81fc1335371a6f..121850ae7e1f32 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -133,7 +133,7 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject } Py_DECREF(isolation_level); - self->statement_cache = (pysqlite_Cache*)PyObject_CallFunction((PyObject*)&pysqlite_CacheType, "Oi", self, cached_statements); + self->statement_cache = (pysqlite_Cache*)PyObject_CallFunction((PyObject*)pysqlite_CacheType, "Oi", self, cached_statements); if (PyErr_Occurred()) { return -1; } diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 82f58eb2480261..625d065a317bab 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -355,7 +355,7 @@ PyMODINIT_FUNC PyInit__sqlite3(void) (pysqlite_row_setup_types() < 0) || (pysqlite_cursor_setup_types() < 0) || (pysqlite_connection_setup_types() < 0) || - (pysqlite_cache_setup_types() < 0) || + (pysqlite_cache_setup_types(module) < 0) || (pysqlite_statement_setup_types() < 0) || (pysqlite_prepare_protocol_setup_types() < 0) ) { From 044a6b41378eb34f51aec0e8811fff605cb95a36 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Sun, 27 Sep 2020 16:07:04 -0300 Subject: [PATCH 0168/1261] [doc] Leverage the fact that the actual types can now be indexed for typing (GH-22340) This shows users that they can use the actual types. Using deprecated types is confusing. This also prefers colections.abc.Sized instead of the alias typing.Sized. I guess the aliases were created to make it convenient to import all collections related types from the same place. This should be backported to 3.9. Automerge-Triggered-By: @gvanrossum --- Doc/glossary.rst | 10 +++------ Doc/library/typing.rst | 49 ++++++++++++++++++++++-------------------- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 7be755e4113108..9fdbdb1a83f280 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -1084,19 +1084,15 @@ Glossary Type aliases are useful for simplifying :term:`type hints `. For example:: - from typing import List, Tuple - def remove_gray_shades( - colors: List[Tuple[int, int, int]]) -> List[Tuple[int, int, int]]: + colors: list[tuple[int, int, int]]) -> list[tuple[int, int, int]]: pass could be made more readable like this:: - from typing import List, Tuple - - Color = Tuple[int, int, int] + Color = tuple[int, int, int] - def remove_gray_shades(colors: List[Color]) -> List[Color]: + def remove_gray_shades(colors: list[Color]) -> list[Color]: pass See :mod:`typing` and :pep:`484`, which describe this functionality. diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index d31c65d38e1abb..3b824d0a4a8da0 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -38,10 +38,9 @@ Type aliases ============ A type alias is defined by assigning the type to the alias. In this example, -``Vector`` and ``List[float]`` will be treated as interchangeable synonyms:: +``Vector`` and ``list[float]`` will be treated as interchangeable synonyms:: - from typing import List - Vector = List[float] + Vector = list[float] def scale(scalar: float, vector: Vector) -> Vector: return [scalar * num for num in vector] @@ -51,11 +50,11 @@ A type alias is defined by assigning the type to the alias. In this example, Type aliases are useful for simplifying complex type signatures. For example:: - from typing import Dict, Tuple, Sequence + from collections.abc import Sequence - ConnectionOptions = Dict[str, str] - Address = Tuple[str, int] - Server = Tuple[Address, ConnectionOptions] + ConnectionOptions = dict[str, str] + Address = tuple[str, int] + Server = tuple[Address, ConnectionOptions] def broadcast_message(message: str, servers: Sequence[Server]) -> None: ... @@ -64,7 +63,7 @@ Type aliases are useful for simplifying complex type signatures. For example:: # being exactly equivalent to this one. def broadcast_message( message: str, - servers: Sequence[Tuple[Tuple[str, int], Dict[str, str]]]) -> None: + servers: Sequence[tuple[tuple[str, int], dict[str, str]]]) -> None: ... Note that ``None`` as a type hint is a special case and is replaced by @@ -157,7 +156,7 @@ type hinted using ``Callable[[Arg1Type, Arg2Type], ReturnType]``. For example:: - from typing import Callable + from collections.abc import Callable def feeder(get_next_item: Callable[[], str]) -> None: # Body @@ -181,7 +180,7 @@ subscription to denote expected types for container elements. :: - from typing import Mapping, Sequence + from collections.abc import Mapping, Sequence def notify_by_email(employees: Sequence[Employee], overrides: Mapping[str, str]) -> None: ... @@ -191,7 +190,8 @@ called :class:`TypeVar`. :: - from typing import Sequence, TypeVar + from collections.abc import Sequence + from typing import TypeVar T = TypeVar('T') # Declare type variable @@ -235,7 +235,7 @@ class body. The :class:`Generic` base class defines :meth:`__class_getitem__` so that ``LoggedVar[t]`` is valid as a type:: - from typing import Iterable + from collections.abc import Iterable def zero_all_vars(vars: Iterable[LoggedVar[int]]) -> None: for var in vars: @@ -266,7 +266,8 @@ This is thus invalid:: You can use multiple inheritance with :class:`Generic`:: - from typing import TypeVar, Generic, Sized + from collections.abc import Sized + from typing import TypeVar, Generic T = TypeVar('T') @@ -275,7 +276,8 @@ You can use multiple inheritance with :class:`Generic`:: When inheriting from generic classes, some type variables could be fixed:: - from typing import TypeVar, Mapping + from collections.abc import Mapping + from typing import TypeVar T = TypeVar('T') @@ -288,13 +290,14 @@ Using a generic class without specifying type parameters assumes :data:`Any` for each position. In the following example, ``MyIterable`` is not generic but implicitly inherits from ``Iterable[Any]``:: - from typing import Iterable + from collections.abc import Iterable class MyIterable(Iterable): # Same as Iterable[Any] User defined generic type aliases are also supported. Examples:: - from typing import TypeVar, Iterable, Tuple, Union + from collections.abc import Iterable + from typing import TypeVar, Union S = TypeVar('S') Response = Union[Iterable[S], int] @@ -303,9 +306,9 @@ User defined generic type aliases are also supported. Examples:: ... T = TypeVar('T', int, float, complex) - Vec = Iterable[Tuple[T, T]] + Vec = Iterable[tuple[T, T]] - def inproduct(v: Vec[T]) -> T: # Same as Iterable[Tuple[T, T]] + def inproduct(v: Vec[T]) -> T: # Same as Iterable[tuple[T, T]] return sum(x*y for x, y in v) .. versionchanged:: 3.7 @@ -408,7 +411,7 @@ to be explicitly marked to support them, which is unpythonic and unlike what one would normally do in idiomatic dynamically typed Python code. For example, this conforms to the :pep:`484`:: - from typing import Sized, Iterable, Iterator + from collections.abc import Sized, Iterable, Iterator class Bucket(Sized, Iterable[int]): ... @@ -421,7 +424,7 @@ allowing ``Bucket`` to be implicitly considered a subtype of both ``Sized`` and ``Iterable[int]`` by static type checkers. This is known as *structural subtyping* (or static duck-typing):: - from typing import Iterator, Iterable + from collections.abc import Iterator, Iterable class Bucket: # Note: no base classes ... @@ -1371,10 +1374,10 @@ Asynchronous programming The variance and order of type variables correspond to those of :class:`Generator`, for example:: - from typing import List, Coroutine - c = None # type: Coroutine[List[str], str, int] + from collections.abc import Coroutine + c = None # type: Coroutine[list[str], str, int] ... - x = c.send('hi') # type: List[str] + x = c.send('hi') # type: list[str] async def bar() -> None: x = await c # type: int From 5a086c5033307206b0b0247c01d41c19ae923367 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 29 Sep 2020 01:16:21 +0900 Subject: [PATCH 0169/1261] bpo-41870: Use PEP 590 vectorcall to speed up bool() (GH-22427) * bpo-41870: Use PEP 590 vectorcall to speed up bool() * bpo-41870: Add NEWS.d --- .../2020-09-27-22-23-14.bpo-41870.2v6_v4.rst | 2 ++ Objects/boolobject.c | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-27-22-23-14.bpo-41870.2v6_v4.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-27-22-23-14.bpo-41870.2v6_v4.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-27-22-23-14.bpo-41870.2v6_v4.rst new file mode 100644 index 00000000000000..13a6bb04a28fd0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-27-22-23-14.bpo-41870.2v6_v4.rst @@ -0,0 +1,2 @@ +Speed up calls to ``bool()`` by using the :pep:`590` ``vectorcall`` calling +convention. Patch by Dong-hee Na. diff --git a/Objects/boolobject.c b/Objects/boolobject.c index 720835b98aa65e..ab7669cb240deb 100644 --- a/Objects/boolobject.c +++ b/Objects/boolobject.c @@ -55,6 +55,30 @@ bool_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return PyBool_FromLong(ok); } +static PyObject * +bool_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + long ok = 0; + if (!_PyArg_NoKwnames("bool", kwnames)) { + return NULL; + } + + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("bool", nargs, 0, 1)) { + return NULL; + } + + assert(PyType_Check(type)); + if (nargs) { + ok = PyObject_IsTrue(args[0]); + } + if (ok < 0) { + return NULL; + } + return PyBool_FromLong(ok); +} + /* Arithmetic operations redefined to return bool if both args are bool. */ static PyObject * @@ -170,6 +194,7 @@ PyTypeObject PyBool_Type = { 0, /* tp_init */ 0, /* tp_alloc */ bool_new, /* tp_new */ + .tp_vectorcall = bool_vectorcall, }; /* The objects representing bool values False and True */ From c0d655aac090f5432c2f5253453a88dd548318ff Mon Sep 17 00:00:00 2001 From: Jan Mazur <16736821+mzr@users.noreply.github.com> Date: Mon, 28 Sep 2020 20:53:33 +0200 Subject: [PATCH 0170/1261] bpo-40105: ZipFile truncate in append mode with shorter comment (GH-19337) --- Lib/test/test_zipfile.py | 3 +++ Lib/zipfile.py | 2 ++ .../next/Library/2020-04-03-16-13-59.bpo-40105.hfM2c0.rst | 2 ++ 3 files changed, 7 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-04-03-16-13-59.bpo-40105.hfM2c0.rst diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 2851051425bf12..687e43df780d65 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -1856,11 +1856,14 @@ def test_comments(self): self.assertEqual(zipf.comment, b"an updated comment") # check that comments are correctly shortened in append mode + # and the file is indeed truncated with zipfile.ZipFile(TESTFN,mode="w") as zipf: zipf.comment = b"original comment that's longer" zipf.writestr("foo.txt", "O, for a Muse of Fire!") + original_zip_size = os.path.getsize(TESTFN) with zipfile.ZipFile(TESTFN,mode="a") as zipf: zipf.comment = b"shorter comment" + self.assertTrue(original_zip_size > os.path.getsize(TESTFN)) with zipfile.ZipFile(TESTFN,mode="r") as zipf: self.assertEqual(zipf.comment, b"shorter comment") diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 915698f9e05889..816f8582bbf6d5 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1918,6 +1918,8 @@ def _write_end_record(self): centDirSize, centDirOffset, len(self._comment)) self.fp.write(endrec) self.fp.write(self._comment) + if self.mode == "a": + self.fp.truncate() self.fp.flush() def _fpclose(self, fp): diff --git a/Misc/NEWS.d/next/Library/2020-04-03-16-13-59.bpo-40105.hfM2c0.rst b/Misc/NEWS.d/next/Library/2020-04-03-16-13-59.bpo-40105.hfM2c0.rst new file mode 100644 index 00000000000000..f71a7a1e697a48 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-04-03-16-13-59.bpo-40105.hfM2c0.rst @@ -0,0 +1,2 @@ +ZipFile truncates files to avoid corruption when a shorter comment is provided +in append ("a") mode. Patch by Jan Mazur. From 7f39583015f5c64f4e3fe1e99be647000824cb94 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 29 Sep 2020 05:41:23 +0900 Subject: [PATCH 0171/1261] bpo-41875: Use __builtin_unreachable when possible (GH-22433) --- Include/pymacro.h | 4 +++- .../next/Build/2020-09-28-21-56-51.bpo-38249.uzMCaZ.rst | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Build/2020-09-28-21-56-51.bpo-38249.uzMCaZ.rst diff --git a/Include/pymacro.h b/Include/pymacro.h index 856cae774d61c7..202b936d964f00 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -118,7 +118,9 @@ "We've reached an unreachable state. Anything is possible.\n" \ "The limits were in our heads all along. Follow your dreams.\n" \ "https://xkcd.com/2200") -#elif defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER) +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +# define Py_UNREACHABLE() __builtin_unreachable() +#elif defined(__clang__) || defined(__INTEL_COMPILER) # define Py_UNREACHABLE() __builtin_unreachable() #elif defined(_MSC_VER) # define Py_UNREACHABLE() __assume(0) diff --git a/Misc/NEWS.d/next/Build/2020-09-28-21-56-51.bpo-38249.uzMCaZ.rst b/Misc/NEWS.d/next/Build/2020-09-28-21-56-51.bpo-38249.uzMCaZ.rst new file mode 100644 index 00000000000000..3e409ec2e7c202 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-09-28-21-56-51.bpo-38249.uzMCaZ.rst @@ -0,0 +1,2 @@ +Update :c:macro:`Py_UNREACHABLE` to use __builtin_unreachable() if only the +compiler is able to use it. Patch by Dong-hee Na. From d4bdd2715052551ff3184c09cdb20709ea7ced17 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Tue, 29 Sep 2020 05:41:11 +0800 Subject: [PATCH 0172/1261] bpo-41842: Add codecs.unregister() function (GH-22360) Add codecs.unregister() and PyCodec_Unregister() functions to unregister a codec search function. --- Doc/c-api/codec.rst | 8 ++++++ Doc/library/codecs.rst | 11 +++++--- Doc/whatsnew/3.10.rst | 10 ++++++++ Include/codecs.h | 8 ++++++ Lib/test/test_codecs.py | 12 +++++++++ Misc/ACKS | 1 + .../2020-09-27-20-43-16.bpo-41842.bCakAj.rst | 2 ++ .../2020-09-23-22-52-24.bpo-41842.lIuhC9.rst | 1 + Modules/_codecsmodule.c | 22 ++++++++++++++++ Modules/clinic/_codecsmodule.c.h | 13 +++++++++- Python/codecs.c | 25 +++++++++++++++++++ 11 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-09-27-20-43-16.bpo-41842.bCakAj.rst create mode 100644 Misc/NEWS.d/next/Library/2020-09-23-22-52-24.bpo-41842.lIuhC9.rst diff --git a/Doc/c-api/codec.rst b/Doc/c-api/codec.rst index 172dcb326a4bc4..235c77c945cc5b 100644 --- a/Doc/c-api/codec.rst +++ b/Doc/c-api/codec.rst @@ -10,6 +10,14 @@ Codec registry and support functions As side effect, this tries to load the :mod:`encodings` package, if not yet done, to make sure that it is always first in the list of search functions. +.. c:function:: int PyCodec_Unregister(PyObject *search_function) + + Unregister a codec search function and clear the registry's cache. + If the search function is not registered, do nothing. + Return 0 on success. Raise an exception and return -1 on error. + + .. versionadded:: 3.10 + .. c:function:: int PyCodec_KnownEncoding(const char *encoding) Return ``1`` or ``0`` depending on whether there is a registered codec for diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index f071057293eece..a0265135205901 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -163,11 +163,14 @@ function: :class:`CodecInfo` object. In case a search function cannot find a given encoding, it should return ``None``. - .. note:: - Search function registration is not currently reversible, - which may cause problems in some cases, such as unit testing or - module reloading. +.. function:: unregister(search_function) + + Unregister a codec search function and clear the registry's cache. + If the search function is not registered, do nothing. + + .. versionadded:: 3.10 + While the builtin :func:`open` and the associated :mod:`io` module are the recommended approach for working with encoded text files, this module diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 1228f2695496c5..f74dd1aa247a34 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -109,6 +109,12 @@ base64 Add :func:`base64.b32hexencode` and :func:`base64.b32hexdecode` to support the Base32 Encoding with Extended Hex Alphabet. +codecs +------ + +Add a :func:`codecs.unregister` function to unregister a codec search function. +(Contributed by Hai Shi in :issue:`41842`.) + curses ------ @@ -237,6 +243,10 @@ New Features :class:`datetime.time` objects. (Contributed by Zackery Spytz in :issue:`30155`.) +* Add a :c:func:`PyCodec_Unregister` function to unregister a codec + search function. + (Contributed by Hai Shi in :issue:`41842`.) + Porting to Python 3.10 ---------------------- diff --git a/Include/codecs.h b/Include/codecs.h index 3ad0f2b5aae79c..37ecfb4ab757b4 100644 --- a/Include/codecs.h +++ b/Include/codecs.h @@ -27,6 +27,14 @@ PyAPI_FUNC(int) PyCodec_Register( PyObject *search_function ); +/* Unregister a codec search function and clear the registry's cache. + If the search function is not registered, do nothing. + Return 0 on success. Raise an exception and return -1 on error. */ + +PyAPI_FUNC(int) PyCodec_Unregister( + PyObject *search_function + ); + /* Codec registry lookup API. Looks up the given encoding and returns a CodecInfo object with diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 3dd56820cd1078..ed508f36ad4234 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -1641,6 +1641,18 @@ def test_register(self): self.assertRaises(TypeError, codecs.register) self.assertRaises(TypeError, codecs.register, 42) + def test_unregister(self): + name = "nonexistent_codec_name" + search_function = mock.Mock() + codecs.register(search_function) + self.assertRaises(TypeError, codecs.lookup, name) + search_function.assert_called_with(name) + search_function.reset_mock() + + codecs.unregister(search_function) + self.assertRaises(LookupError, codecs.lookup, name) + search_function.assert_not_called() + def test_lookup(self): self.assertRaises(TypeError, codecs.lookup) self.assertRaises(LookupError, codecs.lookup, "__spam__") diff --git a/Misc/ACKS b/Misc/ACKS index 7b743464c1c1c8..85001daf67d234 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1575,6 +1575,7 @@ Akash Shende Charlie Shepherd Bruce Sherwood Gregory Shevchenko +Hai Shi Alexander Shigin Pete Shinners Michael Shiplett diff --git a/Misc/NEWS.d/next/C API/2020-09-27-20-43-16.bpo-41842.bCakAj.rst b/Misc/NEWS.d/next/C API/2020-09-27-20-43-16.bpo-41842.bCakAj.rst new file mode 100644 index 00000000000000..116d08f4908596 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-09-27-20-43-16.bpo-41842.bCakAj.rst @@ -0,0 +1,2 @@ +Add :c:func:`PyCodec_Unregister` function to unregister a codec search +function. diff --git a/Misc/NEWS.d/next/Library/2020-09-23-22-52-24.bpo-41842.lIuhC9.rst b/Misc/NEWS.d/next/Library/2020-09-23-22-52-24.bpo-41842.lIuhC9.rst new file mode 100644 index 00000000000000..306b02d76fffe2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-23-22-52-24.bpo-41842.lIuhC9.rst @@ -0,0 +1 @@ +Add :func:`codecs.unregister` function to unregister a codec search function. diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c index 952072102d5d8d..08a3d4ab024cc2 100644 --- a/Modules/_codecsmodule.c +++ b/Modules/_codecsmodule.c @@ -68,6 +68,27 @@ _codecs_register(PyObject *module, PyObject *search_function) Py_RETURN_NONE; } +/*[clinic input] +_codecs.unregister + search_function: object + / + +Unregister a codec search function and clear the registry's cache. + +If the search function is not registered, do nothing. +[clinic start generated code]*/ + +static PyObject * +_codecs_unregister(PyObject *module, PyObject *search_function) +/*[clinic end generated code: output=1f0edee9cf246399 input=dd7c004c652d345e]*/ +{ + if (PyCodec_Unregister(search_function) < 0) { + return NULL; + } + + Py_RETURN_NONE; +} + /*[clinic input] _codecs.lookup encoding: str @@ -992,6 +1013,7 @@ _codecs_lookup_error_impl(PyObject *module, const char *name) static PyMethodDef _codecs_functions[] = { _CODECS_REGISTER_METHODDEF + _CODECS_UNREGISTER_METHODDEF _CODECS_LOOKUP_METHODDEF _CODECS_ENCODE_METHODDEF _CODECS_DECODE_METHODDEF diff --git a/Modules/clinic/_codecsmodule.c.h b/Modules/clinic/_codecsmodule.c.h index 249065c9fd05a4..e2ebb6861299e4 100644 --- a/Modules/clinic/_codecsmodule.c.h +++ b/Modules/clinic/_codecsmodule.c.h @@ -15,6 +15,17 @@ PyDoc_STRVAR(_codecs_register__doc__, #define _CODECS_REGISTER_METHODDEF \ {"register", (PyCFunction)_codecs_register, METH_O, _codecs_register__doc__}, +PyDoc_STRVAR(_codecs_unregister__doc__, +"unregister($module, search_function, /)\n" +"--\n" +"\n" +"Unregister a codec search function and clear the registry\'s cache.\n" +"\n" +"If the search function is not registered, do nothing."); + +#define _CODECS_UNREGISTER_METHODDEF \ + {"unregister", (PyCFunction)_codecs_unregister, METH_O, _codecs_unregister__doc__}, + PyDoc_STRVAR(_codecs_lookup__doc__, "lookup($module, encoding, /)\n" "--\n" @@ -2827,4 +2838,4 @@ _codecs_lookup_error(PyObject *module, PyObject *arg) #ifndef _CODECS_CODE_PAGE_ENCODE_METHODDEF #define _CODECS_CODE_PAGE_ENCODE_METHODDEF #endif /* !defined(_CODECS_CODE_PAGE_ENCODE_METHODDEF) */ -/*[clinic end generated code: output=eeead01414be6e42 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9a97e2ddf3e69072 input=a9049054013a1b77]*/ diff --git a/Python/codecs.c b/Python/codecs.c index 0f18c27e5fe461..a8233a73c4ed3f 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -50,6 +50,31 @@ int PyCodec_Register(PyObject *search_function) return -1; } +int +PyCodec_Unregister(PyObject *search_function) +{ + PyInterpreterState *interp = PyInterpreterState_Get(); + PyObject *codec_search_path = interp->codec_search_path; + /* Do nothing if codec_search_path is not created yet or was cleared. */ + if (codec_search_path == NULL) { + return 0; + } + + assert(PyList_CheckExact(codec_search_path)); + Py_ssize_t n = PyList_GET_SIZE(codec_search_path); + for (Py_ssize_t i = 0; i < n; i++) { + PyObject *item = PyList_GET_ITEM(codec_search_path, i); + if (item == search_function) { + if (interp->codec_search_cache != NULL) { + assert(PyDict_CheckExact(interp->codec_search_cache)); + PyDict_Clear(interp->codec_search_cache); + } + return PyList_SetSlice(codec_search_path, i, i+1, NULL); + } + } + return 0; +} + extern int _Py_normalize_encoding(const char *, char *, size_t); /* Convert a string to a normalized Python string(decoded from UTF-8): all characters are From a3b4438ceb7325ddafa852d3b5a91120fc299182 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Tue, 29 Sep 2020 00:05:04 +0200 Subject: [PATCH 0173/1261] bpo-41861: Convert _sqlite3 PrepareProtocolType to heap type (GH-22428) --- Modules/_sqlite/microprotocols.c | 4 +- Modules/_sqlite/module.c | 6 +-- Modules/_sqlite/prepare_protocol.c | 69 +++++++++++------------------- Modules/_sqlite/prepare_protocol.h | 4 +- Modules/_sqlite/statement.c | 4 +- 5 files changed, 33 insertions(+), 54 deletions(-) diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index 3b2d7f42b87353..64095adb4db2b2 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -56,7 +56,7 @@ pysqlite_microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast) PyObject* key; int rc; - if (proto == NULL) proto = (PyObject*)&pysqlite_PrepareProtocolType; + if (proto == NULL) proto = (PyObject*)pysqlite_PrepareProtocolType; key = Py_BuildValue("(OO)", (PyObject*)type, proto); if (!key) { @@ -152,7 +152,7 @@ PyObject * pysqlite_adapt(pysqlite_Cursor *self, PyObject *args) { PyObject *obj, *alt = NULL; - PyObject *proto = (PyObject*)&pysqlite_PrepareProtocolType; + PyObject *proto = (PyObject*)pysqlite_PrepareProtocolType; if (!PyArg_ParseTuple(args, "O|OO", &obj, &proto, &alt)) return NULL; return pysqlite_microprotocols_adapt(obj, proto, alt); diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 625d065a317bab..d0a546c008de28 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -176,7 +176,7 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args) pysqlite_BaseTypeAdapted = 1; } - rc = pysqlite_microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster); + rc = pysqlite_microprotocols_add(type, (PyObject*)pysqlite_PrepareProtocolType, caster); if (rc == -1) return NULL; @@ -357,7 +357,7 @@ PyMODINIT_FUNC PyInit__sqlite3(void) (pysqlite_connection_setup_types() < 0) || (pysqlite_cache_setup_types(module) < 0) || (pysqlite_statement_setup_types() < 0) || - (pysqlite_prepare_protocol_setup_types() < 0) + (pysqlite_prepare_protocol_setup_types(module) < 0) ) { Py_XDECREF(module); return NULL; @@ -365,7 +365,7 @@ PyMODINIT_FUNC PyInit__sqlite3(void) ADD_TYPE(module, pysqlite_ConnectionType); ADD_TYPE(module, pysqlite_CursorType); - ADD_TYPE(module, pysqlite_PrepareProtocolType); + ADD_TYPE(module, *pysqlite_PrepareProtocolType); ADD_TYPE(module, pysqlite_RowType); if (!(dict = PyModule_GetDict(module))) { diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c index 05a2ca5a652f5e..7daf8a620096a9 100644 --- a/Modules/_sqlite/prepare_protocol.c +++ b/Modules/_sqlite/prepare_protocol.c @@ -30,54 +30,33 @@ int pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol* self, PyObject* arg void pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol* self) { - Py_TYPE(self)->tp_free((PyObject*)self); + PyTypeObject *tp = Py_TYPE(self); + + tp->tp_free(self); + Py_DECREF(tp); } -PyTypeObject pysqlite_PrepareProtocolType= { - PyVarObject_HEAD_INIT(NULL, 0) - MODULE_NAME ".PrepareProtocol", /* tp_name */ - sizeof(pysqlite_PrepareProtocol), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pysqlite_prepare_protocol_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)pysqlite_prepare_protocol_init, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0 /* tp_free */ +static PyType_Slot type_slots[] = { + {Py_tp_dealloc, pysqlite_prepare_protocol_dealloc}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_init, pysqlite_prepare_protocol_init}, + {0, NULL}, +}; + +static PyType_Spec type_spec = { + .name = MODULE_NAME ".PrepareProtocol", + .basicsize = sizeof(pysqlite_PrepareProtocol), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE, + .slots = type_slots, }; -extern int pysqlite_prepare_protocol_setup_types(void) +PyTypeObject *pysqlite_PrepareProtocolType = NULL; + +extern int pysqlite_prepare_protocol_setup_types(PyObject *module) { - pysqlite_PrepareProtocolType.tp_new = PyType_GenericNew; - Py_SET_TYPE(&pysqlite_PrepareProtocolType, &PyType_Type); - return PyType_Ready(&pysqlite_PrepareProtocolType); + pysqlite_PrepareProtocolType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &type_spec, NULL); + if (pysqlite_PrepareProtocolType == NULL) { + return -1; + } + return 0; } diff --git a/Modules/_sqlite/prepare_protocol.h b/Modules/_sqlite/prepare_protocol.h index 3998a55e51cafe..d0f717c754c1d5 100644 --- a/Modules/_sqlite/prepare_protocol.h +++ b/Modules/_sqlite/prepare_protocol.h @@ -31,12 +31,12 @@ typedef struct PyObject_HEAD } pysqlite_PrepareProtocol; -extern PyTypeObject pysqlite_PrepareProtocolType; +extern PyTypeObject *pysqlite_PrepareProtocolType; int pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol* self, PyObject* args, PyObject* kwargs); void pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol* self); -int pysqlite_prepare_protocol_setup_types(void); +int pysqlite_prepare_protocol_setup_types(PyObject *module); #define UNKNOWN (-1) #endif diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 02e47a02b718cc..0458e1171ebdda 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -255,7 +255,7 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para if (!_need_adapt(current_param)) { adapted = current_param; } else { - adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)&pysqlite_PrepareProtocolType, current_param); + adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)pysqlite_PrepareProtocolType, current_param); Py_DECREF(current_param); if (!adapted) { return; @@ -306,7 +306,7 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para if (!_need_adapt(current_param)) { adapted = current_param; } else { - adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)&pysqlite_PrepareProtocolType, current_param); + adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)pysqlite_PrepareProtocolType, current_param); Py_DECREF(current_param); if (!adapted) { return; From 96d65c7605bf5b22cb126e50e50455eb33940631 Mon Sep 17 00:00:00 2001 From: Dennis Sweeney <36520290+sweeneyde@users.noreply.github.com> Date: Mon, 28 Sep 2020 20:55:52 -0400 Subject: [PATCH 0174/1261] bpo-41873: Add vectorcall for float() (GH-22432) --- Lib/test/test_float.py | 3 +++ .../2020-09-28-08-58-28.bpo-41873.VzEDhA.rst | 1 + Objects/floatobject.c | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index 9651281e24edbe..99c81f0b72a5a3 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -64,6 +64,9 @@ def test_float(self): # See bpo-34087 self.assertRaises(ValueError, float, '\u3053\u3093\u306b\u3061\u306f') + def test_noargs(self): + self.assertEqual(float(), 0.0) + def test_underscores(self): for lit in VALID_UNDERSCORE_LITERALS: if not any(ch in lit for ch in 'jJxXoObB'): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst new file mode 100644 index 00000000000000..ee2636704c2992 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst @@ -0,0 +1 @@ +Calls to ``float()`` are now faster due to the ``vectorcall`` calling convention. Patch by Dennis Sweeney. \ No newline at end of file diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 0606f29ff5408d..d0af0ea1a98257 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -1649,6 +1649,24 @@ float_subtype_new(PyTypeObject *type, PyObject *x) return newobj; } +static PyObject * +float_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + if (!_PyArg_NoKwnames("float", kwnames)) { + return NULL; + } + + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("float", nargs, 0, 1)) { + return NULL; + } + + PyObject *x = nargs >= 1 ? args[0] : _PyLong_Zero; + return float_new_impl((PyTypeObject *)type, x); +} + + /*[clinic input] float.__getnewargs__ [clinic start generated code]*/ @@ -1937,6 +1955,7 @@ PyTypeObject PyFloat_Type = { 0, /* tp_init */ 0, /* tp_alloc */ float_new, /* tp_new */ + .tp_vectorcall = (vectorcallfunc)float_vectorcall, }; int From 95a0875f4ad2095b47dd4b09c34455521adb8c74 Mon Sep 17 00:00:00 2001 From: Ram Rachum Date: Tue, 29 Sep 2020 04:32:10 +0300 Subject: [PATCH 0175/1261] bpo-41773: Raise exception for non-finite weights in random.choices(). (GH-22441) --- Doc/library/random.rst | 4 ++-- Lib/random.py | 4 +++- Lib/test/test_random.py | 16 ++++++++++++++++ .../2020-09-28-23-22-25.bpo-41773.oKkus0.rst | 2 ++ 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-28-23-22-25.bpo-41773.oKkus0.rst diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 0cdf0a6ac4a477..af5131df280c24 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -180,8 +180,8 @@ Functions for sequences The *weights* or *cum_weights* can use any numeric type that interoperates with the :class:`float` values returned by :func:`random` (that includes - integers, floats, and fractions but excludes decimals). Behavior is - undefined if any weight is negative. A :exc:`ValueError` is raised if all + integers, floats, and fractions but excludes decimals). Weights are assumed + to be non-negative and finite. A :exc:`ValueError` is raised if all weights are zero. For a given seed, the :func:`choices` function with equal weighting diff --git a/Lib/random.py b/Lib/random.py index 3ea369b81b3e50..139e8a40bb2724 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -48,7 +48,7 @@ from warnings import warn as _warn from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin -from math import tau as TWOPI, floor as _floor +from math import tau as TWOPI, floor as _floor, isfinite as _isfinite from os import urandom as _urandom from _collections_abc import Set as _Set, Sequence as _Sequence from itertools import accumulate as _accumulate, repeat as _repeat @@ -492,6 +492,8 @@ def choices(self, population, weights=None, *, cum_weights=None, k=1): total = cum_weights[-1] + 0.0 # convert to float if total <= 0.0: raise ValueError('Total of weights must be greater than zero') + if not _isfinite(total): + raise ValueError('Total of weights must be finite') bisect = _bisect hi = n - 1 return [population[bisect(cum_weights, random() * total, 0, hi)] diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index a80e71e67e4c6c..0c1fdeec9915ee 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -324,6 +324,22 @@ def test_choices_with_all_zero_weights(self): with self.assertRaises(ValueError): self.gen.choices('AB', [0.0, 0.0]) + def test_choices_negative_total(self): + with self.assertRaises(ValueError): + self.gen.choices('ABC', [3, -5, 1]) + + def test_choices_infinite_total(self): + with self.assertRaises(ValueError): + self.gen.choices('A', [float('inf')]) + with self.assertRaises(ValueError): + self.gen.choices('AB', [0.0, float('inf')]) + with self.assertRaises(ValueError): + self.gen.choices('AB', [-float('inf'), 123]) + with self.assertRaises(ValueError): + self.gen.choices('AB', [0.0, float('nan')]) + with self.assertRaises(ValueError): + self.gen.choices('AB', [float('-inf'), float('inf')]) + def test_gauss(self): # Ensure that the seed() method initializes all the hidden state. In # particular, through 2.2.1 it failed to reset a piece of state used diff --git a/Misc/NEWS.d/next/Library/2020-09-28-23-22-25.bpo-41773.oKkus0.rst b/Misc/NEWS.d/next/Library/2020-09-28-23-22-25.bpo-41773.oKkus0.rst new file mode 100644 index 00000000000000..cef7ff0188354e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-28-23-22-25.bpo-41773.oKkus0.rst @@ -0,0 +1,2 @@ +Note in documentation that :func:`random.choices` doesn't support non-finite +weights, raise :exc:`ValueError` when given non-finite weights. From 0791d38ff1d224d0f9bd0faea74026d77c72cf4d Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 29 Sep 2020 01:02:44 -0400 Subject: [PATCH 0176/1261] bpo-41774: Add programming FAQ entry (GH-22402) In the "Sequences (Tuples/Lists)" section, add "How do you remove multiple items from a list". --- Doc/faq/programming.rst | 15 +++++++++++++++ .../2020-09-24-15-35-13.bpo-41774.5IqdGP.rst | 2 ++ 2 files changed, 17 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2020-09-24-15-35-13.bpo-41774.5IqdGP.rst diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 4f4ea8b18176c2..76ae4d260fad46 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1164,6 +1164,21 @@ This converts the list into a set, thereby removing duplicates, and then back into a list. +How do you remove multiple items from a list +-------------------------------------------- + +As with removing duplicates, explicitly iterating in reverse with a +delete condition is one possibility. However, it is easier and faster +to use slice replacement with an implicit or explicit forward iteration. +Here are three variations.:: + + mylist[:] = filter(keep_function, mylist) + mylist[:] = (x for x in mylist if keep_condition) + mylist[:] = [x for x in mylist if keep_condition] + +If space is not an issue, the list comprehension may be fastest. + + How do you make an array in Python? ----------------------------------- diff --git a/Misc/NEWS.d/next/Documentation/2020-09-24-15-35-13.bpo-41774.5IqdGP.rst b/Misc/NEWS.d/next/Documentation/2020-09-24-15-35-13.bpo-41774.5IqdGP.rst new file mode 100644 index 00000000000000..af8e02437cb2b5 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-09-24-15-35-13.bpo-41774.5IqdGP.rst @@ -0,0 +1,2 @@ +In Programming FAQ "Sequences (Tuples/Lists)" section, add "How do you +remove multiple items from a list". From f6119e9fdc60ac95cb7e4129562aa57ff1e381db Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Tue, 29 Sep 2020 10:09:13 +0100 Subject: [PATCH 0177/1261] bpo-41670: Remove outdated predict macro invocation. (GH-22026) Remove PREDICTion of POP_BLOCK from FOR_ITER. --- Lib/test/test_sys_settrace.py | 17 +++++++++++++++++ .../2020-08-31-11-37-59.bpo-41670.vmRJRx.rst | 4 ++++ Python/ceval.c | 2 -- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-31-11-37-59.bpo-41670.vmRJRx.rst diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 3f902b1fe74ce8..dd4418dd98b22a 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -602,6 +602,23 @@ def run(tracer): self.compare_events(doit_async.__code__.co_firstlineno, tracer.events, events) + def test_loop_in_try_except(self): + # https://bugs.python.org/issue41670 + + def func(): + try: + for i in []: pass + return 1 + except: + return 2 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'return')]) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-31-11-37-59.bpo-41670.vmRJRx.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-31-11-37-59.bpo-41670.vmRJRx.rst new file mode 100644 index 00000000000000..6ad5fb6dc9bb40 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-31-11-37-59.bpo-41670.vmRJRx.rst @@ -0,0 +1,4 @@ +Prevent line trace being skipped on platforms not compiled +with ``USE_COMPUTED_GOTOS``. +Fixes issue where some lines nested within a try-except block +were not being traced on Windows. diff --git a/Python/ceval.c b/Python/ceval.c index 6430e792b8c5d8..6bd2d6bc13d86f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2311,7 +2311,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) } case TARGET(POP_BLOCK): { - PREDICTED(POP_BLOCK); PyFrame_BlockPop(f); DISPATCH(); } @@ -3366,7 +3365,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) STACK_SHRINK(1); Py_DECREF(iter); JUMPBY(oparg); - PREDICT(POP_BLOCK); DISPATCH(); } From 9f88492a9ec5ba67a0e7804c4e6b16f44599f3f2 Mon Sep 17 00:00:00 2001 From: Max Smolens Date: Wed, 30 Sep 2020 18:05:51 -0400 Subject: [PATCH 0178/1261] Fix grammar in secrets module documentation (GH-22467) From `In particularly,` to `In particular,` --- Doc/library/secrets.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/secrets.rst b/Doc/library/secrets.rst index bc4766da2785b3..afa8e2d385fa46 100644 --- a/Doc/library/secrets.rst +++ b/Doc/library/secrets.rst @@ -21,7 +21,7 @@ The :mod:`secrets` module is used for generating cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets. -In particularly, :mod:`secrets` should be used in preference to the +In particular, :mod:`secrets` should be used in preference to the default pseudo-random number generator in the :mod:`random` module, which is designed for modelling and simulation, not security or cryptography. From 2b3c09d74764b2f3034382ef1fff48cc7f770f54 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 1 Oct 2020 13:50:40 +0900 Subject: [PATCH 0179/1261] bpo-41870: Avoid the test when nargs=0 (GH-22462) --- Objects/boolobject.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Objects/boolobject.c b/Objects/boolobject.c index ab7669cb240deb..b786966533e1d6 100644 --- a/Objects/boolobject.c +++ b/Objects/boolobject.c @@ -72,9 +72,9 @@ bool_vectorcall(PyObject *type, PyObject * const*args, assert(PyType_Check(type)); if (nargs) { ok = PyObject_IsTrue(args[0]); - } - if (ok < 0) { - return NULL; + if (ok < 0) { + return NULL; + } } return PyBool_FromLong(ok); } From 5750f649ce7fd1897734d6b402c11d77aa5935f9 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Thu, 1 Oct 2020 15:24:31 +0200 Subject: [PATCH 0180/1261] bpo-41861: Convert _sqlite3 RowType and StatementType to heap types (GH-22444) --- Modules/_sqlite/cache.c | 4 +- Modules/_sqlite/connection.c | 2 +- Modules/_sqlite/cursor.c | 2 +- Modules/_sqlite/module.c | 6 +- Modules/_sqlite/prepare_protocol.c | 2 +- Modules/_sqlite/row.c | 94 ++++++++++-------------------- Modules/_sqlite/row.h | 4 +- Modules/_sqlite/statement.c | 71 +++++++++------------- Modules/_sqlite/statement.h | 4 +- 9 files changed, 71 insertions(+), 118 deletions(-) diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c index c417ce872d368d..0b02be4f0bec98 100644 --- a/Modules/_sqlite/cache.c +++ b/Modules/_sqlite/cache.c @@ -267,7 +267,7 @@ static PyType_Slot pysqlite_NodeType_slots[] = { static PyType_Spec pysqlite_NodeType_spec = { .name = MODULE_NAME ".Node", .basicsize = sizeof(pysqlite_Node), - .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE, + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, .slots = pysqlite_NodeType_slots, }; PyTypeObject *pysqlite_NodeType = NULL; @@ -291,7 +291,7 @@ static PyType_Slot pysqlite_CacheType_slots[] = { static PyType_Spec pysqlite_CacheType_spec = { .name = MODULE_NAME ".Cache", .basicsize = sizeof(pysqlite_Cache), - .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE, + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, .slots = pysqlite_CacheType_slots, }; PyTypeObject *pysqlite_CacheType = NULL; diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 121850ae7e1f32..91e9046f50cb05 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -1234,7 +1234,7 @@ PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, Py _pysqlite_drop_unused_statement_references(self); - statement = PyObject_New(pysqlite_Statement, &pysqlite_StatementType); + statement = PyObject_New(pysqlite_Statement, pysqlite_StatementType); if (!statement) { return NULL; } diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 5cfb4b97d61dfe..dbbdb12caddd6d 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -472,7 +472,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args) if (self->statement->in_use) { Py_SETREF(self->statement, - PyObject_New(pysqlite_Statement, &pysqlite_StatementType)); + PyObject_New(pysqlite_Statement, pysqlite_StatementType)); if (!self->statement) { goto error; } diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index d0a546c008de28..8ac9ea8477363b 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -352,11 +352,11 @@ PyMODINIT_FUNC PyInit__sqlite3(void) module = PyModule_Create(&_sqlite3module); if (!module || - (pysqlite_row_setup_types() < 0) || + (pysqlite_row_setup_types(module) < 0) || (pysqlite_cursor_setup_types() < 0) || (pysqlite_connection_setup_types() < 0) || (pysqlite_cache_setup_types(module) < 0) || - (pysqlite_statement_setup_types() < 0) || + (pysqlite_statement_setup_types(module) < 0) || (pysqlite_prepare_protocol_setup_types(module) < 0) ) { Py_XDECREF(module); @@ -366,7 +366,7 @@ PyMODINIT_FUNC PyInit__sqlite3(void) ADD_TYPE(module, pysqlite_ConnectionType); ADD_TYPE(module, pysqlite_CursorType); ADD_TYPE(module, *pysqlite_PrepareProtocolType); - ADD_TYPE(module, pysqlite_RowType); + ADD_TYPE(module, *pysqlite_RowType); if (!(dict = PyModule_GetDict(module))) { goto error; diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c index 7daf8a620096a9..089d66b9810857 100644 --- a/Modules/_sqlite/prepare_protocol.c +++ b/Modules/_sqlite/prepare_protocol.c @@ -46,7 +46,7 @@ static PyType_Slot type_slots[] = { static PyType_Spec type_spec = { .name = MODULE_NAME ".PrepareProtocol", .basicsize = sizeof(pysqlite_PrepareProtocol), - .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE, + .flags = Py_TPFLAGS_DEFAULT, .slots = type_slots, }; diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c index 4b47108278a0ab..85179e7f4df056 100644 --- a/Modules/_sqlite/row.c +++ b/Modules/_sqlite/row.c @@ -26,10 +26,13 @@ void pysqlite_row_dealloc(pysqlite_Row* self) { + PyTypeObject *tp = Py_TYPE(self); + Py_XDECREF(self->data); Py_XDECREF(self->description); - Py_TYPE(self)->tp_free((PyObject*)self); + tp->tp_free(self); + Py_DECREF(tp); } static PyObject * @@ -192,7 +195,7 @@ static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other, if (opid != Py_EQ && opid != Py_NE) Py_RETURN_NOTIMPLEMENTED; - if (PyObject_TypeCheck(_other, &pysqlite_RowType)) { + if (PyObject_TypeCheck(_other, pysqlite_RowType)) { pysqlite_Row *other = (pysqlite_Row *)_other; int eq = PyObject_RichCompareBool(self->description, other->description, Py_EQ); if (eq < 0) { @@ -206,73 +209,40 @@ static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other, Py_RETURN_NOTIMPLEMENTED; } -PyMappingMethods pysqlite_row_as_mapping = { - /* mp_length */ (lenfunc)pysqlite_row_length, - /* mp_subscript */ (binaryfunc)pysqlite_row_subscript, - /* mp_ass_subscript */ (objobjargproc)0, -}; - -static PySequenceMethods pysqlite_row_as_sequence = { - /* sq_length */ (lenfunc)pysqlite_row_length, - /* sq_concat */ 0, - /* sq_repeat */ 0, - /* sq_item */ (ssizeargfunc)pysqlite_row_item, -}; - - -static PyMethodDef pysqlite_row_methods[] = { +static PyMethodDef row_methods[] = { {"keys", (PyCFunction)pysqlite_row_keys, METH_NOARGS, PyDoc_STR("Returns the keys of the row.")}, {NULL, NULL} }; +static PyType_Slot row_slots[] = { + {Py_tp_dealloc, pysqlite_row_dealloc}, + {Py_tp_hash, pysqlite_row_hash}, + {Py_tp_methods, row_methods}, + {Py_tp_richcompare, pysqlite_row_richcompare}, + {Py_tp_iter, pysqlite_iter}, + {Py_mp_length, pysqlite_row_length}, + {Py_mp_subscript, pysqlite_row_subscript}, + {Py_sq_length, pysqlite_row_length}, + {Py_sq_item, pysqlite_row_item}, + {Py_tp_new, pysqlite_row_new}, + {0, NULL}, +}; -PyTypeObject pysqlite_RowType = { - PyVarObject_HEAD_INIT(NULL, 0) - MODULE_NAME ".Row", /* tp_name */ - sizeof(pysqlite_Row), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pysqlite_row_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - (hashfunc)pysqlite_row_hash, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ - (traverseproc)0, /* tp_traverse */ - 0, /* tp_clear */ - (richcmpfunc)pysqlite_row_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)pysqlite_iter, /* tp_iter */ - 0, /* tp_iternext */ - pysqlite_row_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0 /* tp_free */ +static PyType_Spec row_spec = { + .name = MODULE_NAME ".Row", + .basicsize = sizeof(pysqlite_Row), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .slots = row_slots, }; -extern int pysqlite_row_setup_types(void) +PyTypeObject *pysqlite_RowType = NULL; + +extern int pysqlite_row_setup_types(PyObject *module) { - pysqlite_RowType.tp_new = pysqlite_row_new; - pysqlite_RowType.tp_as_mapping = &pysqlite_row_as_mapping; - pysqlite_RowType.tp_as_sequence = &pysqlite_row_as_sequence; - return PyType_Ready(&pysqlite_RowType); + pysqlite_RowType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &row_spec, NULL); + if (pysqlite_RowType == NULL) { + return -1; + } + return 0; } diff --git a/Modules/_sqlite/row.h b/Modules/_sqlite/row.h index 4ad506f8dd9687..2dac41e89e12d8 100644 --- a/Modules/_sqlite/row.h +++ b/Modules/_sqlite/row.h @@ -33,8 +33,8 @@ typedef struct _Row PyObject* description; } pysqlite_Row; -extern PyTypeObject pysqlite_RowType; +extern PyTypeObject *pysqlite_RowType; -int pysqlite_row_setup_types(void); +int pysqlite_row_setup_types(PyObject *module); #endif diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 0458e1171ebdda..4682d286c581c2 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -371,6 +371,8 @@ void pysqlite_statement_mark_dirty(pysqlite_Statement* self) void pysqlite_statement_dealloc(pysqlite_Statement* self) { + PyTypeObject *tp = Py_TYPE(self); + if (self->st) { Py_BEGIN_ALLOW_THREADS sqlite3_finalize(self->st); @@ -385,7 +387,8 @@ void pysqlite_statement_dealloc(pysqlite_Statement* self) PyObject_ClearWeakRefs((PyObject*)self); } - Py_TYPE(self)->tp_free((PyObject*)self); + tp->tp_free(self); + Py_DECREF(tp); } /* @@ -458,50 +461,30 @@ static int pysqlite_check_remaining_sql(const char* tail) return 0; } -PyTypeObject pysqlite_StatementType = { - PyVarObject_HEAD_INIT(NULL, 0) - MODULE_NAME ".Statement", /* tp_name */ - sizeof(pysqlite_Statement), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pysqlite_statement_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(pysqlite_Statement, in_weakreflist), /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0 /* tp_free */ +static PyMemberDef stmt_members[] = { + {"__weaklistoffset__", T_PYSSIZET, offsetof(pysqlite_Statement, in_weakreflist), READONLY}, + {NULL}, +}; +static PyType_Slot stmt_slots[] = { + {Py_tp_members, stmt_members}, + {Py_tp_dealloc, pysqlite_statement_dealloc}, + {Py_tp_new, PyType_GenericNew}, + {0, NULL}, +}; + +static PyType_Spec stmt_spec = { + .name = MODULE_NAME ".Statement", + .basicsize = sizeof(pysqlite_Statement), + .flags = Py_TPFLAGS_DEFAULT, + .slots = stmt_slots, }; +PyTypeObject *pysqlite_StatementType = NULL; -extern int pysqlite_statement_setup_types(void) +extern int pysqlite_statement_setup_types(PyObject *module) { - pysqlite_StatementType.tp_new = PyType_GenericNew; - return PyType_Ready(&pysqlite_StatementType); + pysqlite_StatementType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &stmt_spec, NULL); + if (pysqlite_StatementType == NULL) { + return -1; + } + return 0; } diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h index 5002f02dc5b392..b426036002815a 100644 --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -43,7 +43,7 @@ typedef struct PyObject* in_weakreflist; /* List of weak references */ } pysqlite_Statement; -extern PyTypeObject pysqlite_StatementType; +extern PyTypeObject *pysqlite_StatementType; int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* connection, PyObject* sql); void pysqlite_statement_dealloc(pysqlite_Statement* self); @@ -55,6 +55,6 @@ int pysqlite_statement_finalize(pysqlite_Statement* self); int pysqlite_statement_reset(pysqlite_Statement* self); void pysqlite_statement_mark_dirty(pysqlite_Statement* self); -int pysqlite_statement_setup_types(void); +int pysqlite_statement_setup_types(PyObject *module); #endif From c7bb3d6c00b51c0f1c66ed87d062de6088c5fc9b Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Thu, 1 Oct 2020 16:03:21 +0200 Subject: [PATCH 0181/1261] bpo-41861: Convert _sqlite3 CursorType and ConnectionType to heap types (GH-22478) --- Modules/_sqlite/connection.c | 80 +++++++++++++++--------------------- Modules/_sqlite/connection.h | 4 +- Modules/_sqlite/cursor.c | 76 ++++++++++++++-------------------- Modules/_sqlite/cursor.h | 4 +- Modules/_sqlite/module.c | 10 ++--- Modules/_sqlite/row.c | 2 +- 6 files changed, 74 insertions(+), 102 deletions(-) diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 91e9046f50cb05..69203f85e05553 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -220,6 +220,8 @@ void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset void pysqlite_connection_dealloc(pysqlite_Connection* self) { + PyTypeObject *tp = Py_TYPE(self); + Py_XDECREF(self->statement_cache); /* Clean up if user has not called .close() explicitly. */ @@ -236,7 +238,9 @@ void pysqlite_connection_dealloc(pysqlite_Connection* self) Py_XDECREF(self->collations); Py_XDECREF(self->statements); Py_XDECREF(self->cursors); - Py_TYPE(self)->tp_free((PyObject*)self); + + tp->tp_free(self); + Py_DECREF(tp); } /* @@ -281,13 +285,13 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, } if (factory == NULL) { - factory = (PyObject*)&pysqlite_CursorType; + factory = (PyObject*)pysqlite_CursorType; } cursor = PyObject_CallOneArg(factory, (PyObject *)self); if (cursor == NULL) return NULL; - if (!PyObject_TypeCheck(cursor, &pysqlite_CursorType)) { + if (!PyObject_TypeCheck(cursor, pysqlite_CursorType)) { PyErr_Format(PyExc_TypeError, "factory must return a cursor, not %.100s", Py_TYPE(cursor)->tp_name); @@ -1494,7 +1498,7 @@ pysqlite_connection_backup(pysqlite_Connection *self, PyObject *args, PyObject * static char *keywords[] = {"target", "pages", "progress", "name", "sleep", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!|$iOsO:backup", keywords, - &pysqlite_ConnectionType, &target, + pysqlite_ConnectionType, &target, &pages, &progress, &name, &sleep_obj)) { return NULL; } @@ -1831,50 +1835,32 @@ static struct PyMemberDef connection_members[] = {NULL} }; -PyTypeObject pysqlite_ConnectionType = { - PyVarObject_HEAD_INIT(NULL, 0) - MODULE_NAME ".Connection", /* tp_name */ - sizeof(pysqlite_Connection), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pysqlite_connection_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - (ternaryfunc)pysqlite_connection_call, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ - connection_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - connection_methods, /* tp_methods */ - connection_members, /* tp_members */ - connection_getset, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)pysqlite_connection_init, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0 /* tp_free */ +static PyType_Slot connection_slots[] = { + {Py_tp_dealloc, pysqlite_connection_dealloc}, + {Py_tp_doc, (void *)connection_doc}, + {Py_tp_methods, connection_methods}, + {Py_tp_members, connection_members}, + {Py_tp_getset, connection_getset}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_init, pysqlite_connection_init}, + {Py_tp_call, pysqlite_connection_call}, + {0, NULL}, +}; + +static PyType_Spec connection_spec = { + .name = MODULE_NAME ".Connection", + .basicsize = sizeof(pysqlite_Connection), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .slots = connection_slots, }; -extern int pysqlite_connection_setup_types(void) +PyTypeObject *pysqlite_ConnectionType = NULL; + +extern int pysqlite_connection_setup_types(PyObject *module) { - pysqlite_ConnectionType.tp_new = PyType_GenericNew; - return PyType_Ready(&pysqlite_ConnectionType); + pysqlite_ConnectionType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &connection_spec, NULL); + if (pysqlite_ConnectionType == NULL) { + return -1; + } + return 0; } diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h index 206085e00a00c7..aadf439034fe28 100644 --- a/Modules/_sqlite/connection.h +++ b/Modules/_sqlite/connection.h @@ -106,7 +106,7 @@ typedef struct PyObject* NotSupportedError; } pysqlite_Connection; -extern PyTypeObject pysqlite_ConnectionType; +extern PyTypeObject *pysqlite_ConnectionType; PyObject* pysqlite_connection_alloc(PyTypeObject* type, int aware); void pysqlite_connection_dealloc(pysqlite_Connection* self); @@ -122,6 +122,6 @@ int pysqlite_connection_register_cursor(pysqlite_Connection* connection, PyObjec int pysqlite_check_thread(pysqlite_Connection* self); int pysqlite_check_connection(pysqlite_Connection* con); -int pysqlite_connection_setup_types(void); +int pysqlite_connection_setup_types(PyObject *module); #endif diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index dbbdb12caddd6d..3c09c1c6b7e50c 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -33,7 +33,7 @@ static int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject* { pysqlite_Connection* connection; - if (!PyArg_ParseTuple(args, "O!", &pysqlite_ConnectionType, &connection)) + if (!PyArg_ParseTuple(args, "O!", pysqlite_ConnectionType, &connection)) { return -1; } @@ -74,6 +74,8 @@ static int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject* static void pysqlite_cursor_dealloc(pysqlite_Cursor* self) { + PyTypeObject *tp = Py_TYPE(self); + /* Reset the statement if the user has not closed the cursor */ if (self->statement) { pysqlite_statement_reset(self->statement); @@ -91,7 +93,8 @@ static void pysqlite_cursor_dealloc(pysqlite_Cursor* self) PyObject_ClearWeakRefs((PyObject*)self); } - Py_TYPE(self)->tp_free((PyObject*)self); + tp->tp_free(self); + Py_DECREF(tp); } static PyObject * @@ -898,56 +901,39 @@ static struct PyMemberDef cursor_members[] = {"lastrowid", T_OBJECT, offsetof(pysqlite_Cursor, lastrowid), READONLY}, {"rowcount", T_LONG, offsetof(pysqlite_Cursor, rowcount), READONLY}, {"row_factory", T_OBJECT, offsetof(pysqlite_Cursor, row_factory), 0}, + {"__weaklistoffset__", T_PYSSIZET, offsetof(pysqlite_Cursor, in_weakreflist), READONLY}, {NULL} }; static const char cursor_doc[] = PyDoc_STR("SQLite database cursor class."); -PyTypeObject pysqlite_CursorType = { - PyVarObject_HEAD_INIT(NULL, 0) - MODULE_NAME ".Cursor", /* tp_name */ - sizeof(pysqlite_Cursor), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pysqlite_cursor_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ - cursor_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(pysqlite_Cursor, in_weakreflist), /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)pysqlite_cursor_iternext, /* tp_iternext */ - cursor_methods, /* tp_methods */ - cursor_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)pysqlite_cursor_init, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0 /* tp_free */ +static PyType_Slot cursor_slots[] = { + {Py_tp_dealloc, pysqlite_cursor_dealloc}, + {Py_tp_doc, (void *)cursor_doc}, + {Py_tp_iter, PyObject_SelfIter}, + {Py_tp_iternext, pysqlite_cursor_iternext}, + {Py_tp_methods, cursor_methods}, + {Py_tp_members, cursor_members}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_init, pysqlite_cursor_init}, + {0, NULL}, +}; + +static PyType_Spec cursor_spec = { + .name = MODULE_NAME ".Cursor", + .basicsize = sizeof(pysqlite_Cursor), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .slots = cursor_slots, }; -extern int pysqlite_cursor_setup_types(void) +PyTypeObject *pysqlite_CursorType = NULL; + +extern int pysqlite_cursor_setup_types(PyObject *module) { - pysqlite_CursorType.tp_new = PyType_GenericNew; - return PyType_Ready(&pysqlite_CursorType); + pysqlite_CursorType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &cursor_spec, NULL); + if (pysqlite_CursorType == NULL) { + return -1; + } + return 0; } diff --git a/Modules/_sqlite/cursor.h b/Modules/_sqlite/cursor.h index 4a20e756f7829d..3e6cde167f94c8 100644 --- a/Modules/_sqlite/cursor.h +++ b/Modules/_sqlite/cursor.h @@ -52,7 +52,7 @@ typedef struct PyObject* in_weakreflist; /* List of weak references */ } pysqlite_Cursor; -extern PyTypeObject pysqlite_CursorType; +extern PyTypeObject *pysqlite_CursorType; PyObject* pysqlite_cursor_execute(pysqlite_Cursor* self, PyObject* args); PyObject* pysqlite_cursor_executemany(pysqlite_Cursor* self, PyObject* args); @@ -64,7 +64,7 @@ PyObject* pysqlite_cursor_fetchall(pysqlite_Cursor* self, PyObject* args); PyObject* pysqlite_noop(pysqlite_Connection* self, PyObject* args); PyObject* pysqlite_cursor_close(pysqlite_Cursor* self, PyObject* args); -int pysqlite_cursor_setup_types(void); +int pysqlite_cursor_setup_types(PyObject *module); #define UNKNOWN (-1) #endif diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 8ac9ea8477363b..102026663abd83 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -82,7 +82,7 @@ static PyObject* module_connect(PyObject* self, PyObject* args, PyObject* } if (factory == NULL) { - factory = (PyObject*)&pysqlite_ConnectionType; + factory = (PyObject*)pysqlite_ConnectionType; } if (PySys_Audit("sqlite3.connect", "O", database) < 0) { @@ -353,8 +353,8 @@ PyMODINIT_FUNC PyInit__sqlite3(void) if (!module || (pysqlite_row_setup_types(module) < 0) || - (pysqlite_cursor_setup_types() < 0) || - (pysqlite_connection_setup_types() < 0) || + (pysqlite_cursor_setup_types(module) < 0) || + (pysqlite_connection_setup_types(module) < 0) || (pysqlite_cache_setup_types(module) < 0) || (pysqlite_statement_setup_types(module) < 0) || (pysqlite_prepare_protocol_setup_types(module) < 0) @@ -363,8 +363,8 @@ PyMODINIT_FUNC PyInit__sqlite3(void) return NULL; } - ADD_TYPE(module, pysqlite_ConnectionType); - ADD_TYPE(module, pysqlite_CursorType); + ADD_TYPE(module, *pysqlite_ConnectionType); + ADD_TYPE(module, *pysqlite_CursorType); ADD_TYPE(module, *pysqlite_PrepareProtocolType); ADD_TYPE(module, *pysqlite_RowType); diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c index 85179e7f4df056..76b6f04f0ccbfd 100644 --- a/Modules/_sqlite/row.c +++ b/Modules/_sqlite/row.c @@ -49,7 +49,7 @@ pysqlite_row_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTuple(args, "OO", &cursor, &data)) return NULL; - if (!PyObject_TypeCheck((PyObject*)cursor, &pysqlite_CursorType)) { + if (!PyObject_TypeCheck((PyObject*)cursor, pysqlite_CursorType)) { PyErr_SetString(PyExc_TypeError, "instance of cursor required for first argument"); return NULL; } From 1055b0fae429118225c076082a32d1a3f2a79d3e Mon Sep 17 00:00:00 2001 From: Robert Smallshire Date: Thu, 1 Oct 2020 18:30:08 +0200 Subject: [PATCH 0182/1261] bpo-26680: Incorporate is_integer in all built-in and standard library numeric types (GH-6121) * bpo-26680: Adds support for int.is_integer() for compatibility with float.is_integer(). The int.is_integer() method always returns True. * bpo-26680: Adds a test to ensure that False.is_integer() and True.is_integer() are always True. * bpo-26680: Adds Real.is_integer() with a trivial implementation using conversion to int. This default implementation is intended to reduce the workload for subclass implementers. It is not robust in the presence of infinities or NaNs and may have suboptimal performance for other types. * bpo-26680: Adds Rational.is_integer which returns True if the denominator is one. This implementation assumes the Rational is represented in it's lowest form, as required by the class docstring. * bpo-26680: Adds Integral.is_integer which always returns True. * bpo-26680: Adds tests for Fraction.is_integer called as an instance method. The tests for the Rational abstract base class use an unbound method to sidestep the inability to directly instantiate Rational. These tests check that everything works correct as an instance method. * bpo-26680: Updates documentation for Real.is_integer and built-ins int and float. The call x.is_integer() is now listed in the table of operations which apply to all numeric types except complex, with a reference to the full documentation for Real.is_integer(). Mention of is_integer() has been removed from the section 'Additional Methods on Float'. The documentation for Real.is_integer() describes its purpose, and mentions that it should be overridden for performance reasons, or to handle special values like NaN. * bpo-26680: Adds Decimal.is_integer to the Python and C implementations. The C implementation of Decimal already implements and uses mpd_isinteger internally, we just expose the existing function to Python. The Python implementation uses internal conversion to integer using to_integral_value(). In both cases, the corresponding context methods are also implemented. Tests and documentation are included. * bpo-26680: Updates the ACKS file. * bpo-26680: NEWS entries for int, the numeric ABCs and Decimal. Co-authored-by: Robert Smallshire --- Doc/library/decimal.rst | 14 +++++++++ Doc/library/numbers.rst | 26 +++++++++++----- Doc/library/stdtypes.rst | 14 +++------ Lib/_pydecimal.py | 25 +++++++++++++++ Lib/numbers.py | 21 ++++++++++++- Lib/test/decimaltestdata/extra.decTest | 18 +++++++++++ Lib/test/test_bool.py | 5 +++ Lib/test/test_decimal.py | 24 ++++++++++++++ Lib/test/test_fractions.py | 11 +++++++ Lib/test/test_long.py | 4 +++ Lib/test/test_numeric_tower.py | 31 +++++++++++++++++++ Misc/ACKS | 1 + .../2018-03-15-11-51-36.bpo-26680.wOWYps.rst | 2 ++ .../2018-03-15-11-55-04.bpo-26680.eKAi85.rst | 3 ++ .../2018-03-15-11-56-48.bpo-26680.Udkhn4.rst | 2 ++ Modules/_decimal/_decimal.c | 6 ++-- Modules/_decimal/docstrings.h | 13 ++++++-- Objects/clinic/longobject.c.h | 20 +++++++++++- Objects/longobject.c | 14 +++++++++ 19 files changed, 230 insertions(+), 24 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-03-15-11-51-36.bpo-26680.wOWYps.rst create mode 100644 Misc/NEWS.d/next/Library/2018-03-15-11-55-04.bpo-26680.eKAi85.rst create mode 100644 Misc/NEWS.d/next/Library/2018-03-15-11-56-48.bpo-26680.Udkhn4.rst diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index e194649e30d85c..7a6497305952f1 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -621,6 +621,13 @@ Decimal objects Return :const:`True` if the argument is either positive or negative infinity and :const:`False` otherwise. + .. method:: is_integer() + + Return :const:`True` if the argument is a finite integral value and + :const:`False` otherwise. + + .. versionadded:: 3.10 + .. method:: is_nan() Return :const:`True` if the argument is a (quiet or signaling) NaN and @@ -1215,6 +1222,13 @@ In addition to the three supplied contexts, new contexts can be created with the Returns ``True`` if *x* is infinite; otherwise returns ``False``. + .. method:: is_integer(x) + + Returns ``True`` if *x* is finite and integral; otherwise + returns ``False``. + + .. versionadded:: 3.10 + .. method:: is_nan(x) Returns ``True`` if *x* is a qNaN or sNaN; otherwise returns ``False``. diff --git a/Doc/library/numbers.rst b/Doc/library/numbers.rst index 1b594952ead724..5d49f5eb96b7ad 100644 --- a/Doc/library/numbers.rst +++ b/Doc/library/numbers.rst @@ -49,19 +49,30 @@ The numeric tower numbers. In short, those are: a conversion to :class:`float`, :func:`math.trunc`, - :func:`round`, :func:`math.floor`, :func:`math.ceil`, :func:`divmod`, ``//``, - ``%``, ``<``, ``<=``, ``>``, and ``>=``. + :func:`round`, :func:`math.floor`, :func:`math.ceil`, :func:`divmod`, + :func:`~Real.is_integer`, ``//``, ``%``, ``<``, ``<=``, ``>``, and ``>=``. Real also provides defaults for :func:`complex`, :attr:`~Complex.real`, :attr:`~Complex.imag`, and :meth:`~Complex.conjugate`. + .. method:: is_integer() + + Returns :const:`True` if this number has a finite and integral value, + otherwise :const:`False`. This is a default implementation which + relies on successful conversion to :class:`int`. It may be overridden + in subclasses (such as it is in :class:`float`) for better performance, + or to handle special values such as NaN which are not + convertible to :class:`int`. + + .. versionadded:: 3.10 + .. class:: Rational Subtypes :class:`Real` and adds :attr:`~Rational.numerator` and :attr:`~Rational.denominator` properties, which - should be in lowest terms. With these, it provides a default for - :func:`float`. + should be in lowest terms. With these, it provides defaults for + :func:`float` and :func:`~Real.is_integer`. .. attribute:: numerator @@ -75,9 +86,10 @@ The numeric tower .. class:: Integral Subtypes :class:`Rational` and adds a conversion to :class:`int`. Provides - defaults for :func:`float`, :attr:`~Rational.numerator`, and - :attr:`~Rational.denominator`. Adds abstract methods for ``**`` and - bit-string operations: ``<<``, ``>>``, ``&``, ``^``, ``|``, ``~``. + defaults for :func:`float`, :attr:`~Rational.numerator`, + :attr:`~Rational.denominator`, and :func:`~Real.is_integer`. Adds abstract + methods for ``**`` and bit-string operations: ``<<``, ``>>``, ``&``, ``^``, + ``|``, ``~``. Notes for type implementors diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 0ffe7b7526fa76..62f39da2a72a2d 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -310,6 +310,10 @@ the operations, see :ref:`operator-summary`): +---------------------+---------------------------------+---------+--------------------+ | ``x ** y`` | *x* to the power *y* | \(5) | | +---------------------+---------------------------------+---------+--------------------+ +| ``x.is_integer()`` | ``True`` if *x* has a finite | | :func:`~numbers\ | +| | and integral value, otherwise | | .Real.is_integer` | +| | ``False``. | | | ++---------------------+---------------------------------+---------+--------------------+ .. index:: triple: operations on; numeric; types @@ -583,16 +587,6 @@ class`. float also has the following additional methods. :exc:`OverflowError` on infinities and a :exc:`ValueError` on NaNs. -.. method:: float.is_integer() - - Return ``True`` if the float instance is finite with integral - value, and ``False`` otherwise:: - - >>> (-2.0).is_integer() - True - >>> (3.2).is_integer() - False - Two methods support conversion to and from hexadecimal strings. Since Python's floats are stored internally as binary numbers, converting a float to or from a diff --git a/Lib/_pydecimal.py b/Lib/_pydecimal.py index ab989e5206a9e9..8c0ef570922197 100644 --- a/Lib/_pydecimal.py +++ b/Lib/_pydecimal.py @@ -3164,6 +3164,12 @@ def is_zero(self): """Return True if self is a zero; otherwise return False.""" return not self._is_special and self._int == '0' + def is_integer(self): + """Return True is self is finite and integral; otherwise False.""" + if self._is_special: + return False + return self.to_integral_value(rounding=ROUND_FLOOR) == self + def _ln_exp_bound(self): """Compute a lower bound for the adjusted exponent of self.ln(). In other words, compute r such that self.ln() >= 10**r. Assumes @@ -4659,6 +4665,25 @@ def is_zero(self, a): a = _convert_other(a, raiseit=True) return a.is_zero() + def is_integer(self, a): + """Return True if the operand is integral; otherwise return False. + + >>> ExtendedContext.is_integer(Decimal('0')) + True + >>> ExtendedContext.is_integer(Decimal('2.50')) + False + >>> ExtendedContext.is_integer(Decimal('-0E+2')) + True + >>> ExtendedContext.is_integer(Decimal('-0.5')) + False + >>> ExtendedContext.is_integer(Decimal('NaN')) + False + >>> ExtendedContext.is_integer(10) + True + """ + a = _convert_other(a, raiseit=True) + return a.is_integer() + def ln(self, a): """Returns the natural (base e) logarithm of the operand. diff --git a/Lib/numbers.py b/Lib/numbers.py index ed815ef41ebe12..0634f62ff123c4 100644 --- a/Lib/numbers.py +++ b/Lib/numbers.py @@ -148,7 +148,7 @@ class Real(Complex): """To Complex, Real adds the operations that work on real numbers. In short, those are: a conversion to float, trunc(), divmod, - %, <, <=, >, and >=. + is_integer, %, <, <=, >, and >=. Real also provides defaults for the derived operations. """ @@ -242,6 +242,17 @@ def __le__(self, other): """self <= other""" raise NotImplementedError + def is_integer(self): + """Return True if the Real is integral; otherwise return False. + + This default implementation can be overridden in subclasses + for performance reasons or to deal with values such as NaN, + which would otherwise cause an exception to be raised. + """ + # Although __int__ is not defined at this level, the int + # constructor falls back to __trunc__, which we do have. + return self == int(self) + # Concrete implementations of Complex abstract methods. def __complex__(self): """complex(self) == complex(float(self), 0)""" @@ -290,6 +301,10 @@ def __float__(self): """ return self.numerator / self.denominator + def is_integer(self): + """Return True if the Rational is integral; otherwise return False.""" + return self.denominator == 1 + class Integral(Rational): """Integral adds a conversion to int and the bit-string operations.""" @@ -386,4 +401,8 @@ def denominator(self): """Integers have a denominator of 1.""" return 1 + def is_integer(self): + """Return True; all Integrals represent an integral value.""" + return True + Integral.register(int) diff --git a/Lib/test/decimaltestdata/extra.decTest b/Lib/test/decimaltestdata/extra.decTest index b630d8e3f9d45e..2f0719ed22342a 100644 --- a/Lib/test/decimaltestdata/extra.decTest +++ b/Lib/test/decimaltestdata/extra.decTest @@ -2346,6 +2346,24 @@ bool2096 iszero sNaN -> 0 bool2097 iszero -sNaN -> 0 bool2098 iszero sNaN123 -> 0 bool2099 iszero -sNaN123 -> 0 +bool2100 is_integer -1.0 -> 1 +bool2101 is_integer 0.0 -> 1 +bool2102 is_integer 1.0 -> 1 +bool2103 is_integer 42 -> 1 +bool2104 is_integer 1e2 -> 1 +bool2105 is_integer 1.5 -> 0 +bool2106 is_integer 1e-2 -> 0 +bool2107 is_integer NaN -> 0 +bool2109 is_integer -NaN -> 0 +bool2110 is_integer NaN123 -> 0 +bool2111 is_integer -NaN123 -> 0 +bool2112 is_integer sNaN -> 0 +bool2113 is_integer -sNaN -> 0 +bool2114 is_integer sNaN123 -> 0 +bool2115 is_integer -sNaN123 -> 0 +bool2116 is_integer Infinity -> 0 +bool2117 is_integer -Infinity -> 0 + ------------------------------------------------------------------------ -- The following tests (pwmx0 through pwmx440) are for the -- diff --git a/Lib/test/test_bool.py b/Lib/test/test_bool.py index 7b3a3859e08932..bc201e10ff2671 100644 --- a/Lib/test/test_bool.py +++ b/Lib/test/test_bool.py @@ -354,6 +354,11 @@ def test_real_and_imag(self): self.assertIs(type(False.real), int) self.assertIs(type(False.imag), int) + def test_always_is_integer(self): + # Issue #26680: Incorporating number.is_integer into bool + self.assertTrue(all(b.is_integer() for b in (False, True))) + + def test_main(): support.run_unittest(BoolTest) diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index dbd58e8a6519b1..efb41fd4650566 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -276,6 +276,7 @@ def setUp(self): 'is_snan', 'is_subnormal', 'is_zero', + 'is_integer', 'same_quantum') def read_unlimited(self, v, context): @@ -2726,6 +2727,7 @@ def test_named_parameters(self): self.assertRaises(TypeError, D(1).is_snan, context=xc) self.assertRaises(TypeError, D(1).is_signed, context=xc) self.assertRaises(TypeError, D(1).is_zero, context=xc) + self.assertRaises(TypeError, D(1).is_integer, context=xc) self.assertFalse(D("0.01").is_normal(context=xc)) self.assertTrue(D("0.01").is_subnormal(context=xc)) @@ -3197,6 +3199,15 @@ def test_is_zero(self): self.assertEqual(c.is_zero(10), d) self.assertRaises(TypeError, c.is_zero, '10') + def test_is_integer(self): + Decimal = self.decimal.Decimal + Context = self.decimal.Context + + c = Context() + b = c.is_integer(Decimal(10)) + self.assertEqual(c.is_integer(10), b) + self.assertRaises(TypeError, c.is_integer, '10') + def test_ln(self): Decimal = self.decimal.Decimal Context = self.decimal.Context @@ -4360,6 +4371,19 @@ def test_implicit_context(self): self.assertTrue(Decimal("-1").is_signed()) self.assertTrue(Decimal("0").is_zero()) self.assertTrue(Decimal("0").is_zero()) + self.assertTrue(Decimal("-1").is_integer()) + self.assertTrue(Decimal("0").is_integer()) + self.assertTrue(Decimal("1").is_integer()) + self.assertTrue(Decimal("42").is_integer()) + self.assertTrue(Decimal("1e2").is_integer()) + self.assertFalse(Decimal("1.5").is_integer()) + self.assertFalse(Decimal("1e-2").is_integer()) + self.assertFalse(Decimal("NaN").is_integer()) + self.assertFalse(Decimal("-NaN").is_integer()) + self.assertFalse(Decimal("sNaN").is_integer()) + self.assertFalse(Decimal("-sNaN").is_integer()) + self.assertFalse(Decimal("Inf").is_integer()) + self.assertFalse(Decimal("-Inf").is_integer()) # Copy with localcontext() as c: diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 0845f7921c39ec..811b58fd8f56aa 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -724,6 +724,17 @@ def denominator(self): self.assertEqual(type(f.numerator), myint) self.assertEqual(type(f.denominator), myint) + def test_is_integer(self): + # Issue #26680: Incorporating number.is_integer into Fraction + self.assertTrue(F(-1, 1).is_integer()) + self.assertTrue(F(0, 1).is_integer()) + self.assertTrue(F(1, 1).is_integer()) + self.assertTrue(F(42, 1).is_integer()) + self.assertTrue(F(2, 2).is_integer()) + self.assertTrue(F(8, 4).is_integer()) + self.assertFalse(F(1, 2).is_integer()) + self.assertFalse(F(1, 3).is_integer()) + self.assertFalse(F(2, 3).is_integer()) if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index c97842b5bfd233..669826c0fa3c1b 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -1381,6 +1381,10 @@ class myint(int): self.assertEqual(type(numerator), int) self.assertEqual(type(denominator), int) + def test_int_always_is_integer(self): + # Issue #26680: Incorporating number.is_integer into int + self.assertTrue(all(x.is_integer() for x in (-1, 0, 1, 42))) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_numeric_tower.py b/Lib/test/test_numeric_tower.py index c54dedb8b793a0..4e46aacad82b6a 100644 --- a/Lib/test/test_numeric_tower.py +++ b/Lib/test/test_numeric_tower.py @@ -6,6 +6,7 @@ import sys import operator +from numbers import Real, Rational, Integral from decimal import Decimal as D from fractions import Fraction as F @@ -198,5 +199,35 @@ def test_complex(self): self.assertRaises(TypeError, op, v, z) +class IsIntegerTest(unittest.TestCase): + + def test_real_is_integer(self): + self.assertTrue(Real.is_integer(-1.0)) + self.assertTrue(Real.is_integer(0.0)) + self.assertTrue(Real.is_integer(1.0)) + self.assertTrue(Real.is_integer(42.0)) + + self.assertFalse(Real.is_integer(-0.5)) + self.assertFalse(Real.is_integer(4.2)) + + def test_rational_is_integer(self): + self.assertTrue(Rational.is_integer(F(-1, 1))) + self.assertTrue(Rational.is_integer(F(0, 1))) + self.assertTrue(Rational.is_integer(F(1, 1))) + self.assertTrue(Rational.is_integer(F(42, 1))) + self.assertTrue(Rational.is_integer(F(2, 2))) + self.assertTrue(Rational.is_integer(F(8, 4))) + + self.assertFalse(Rational.is_integer(F(1, 2))) + self.assertFalse(Rational.is_integer(F(1, 3))) + self.assertFalse(Rational.is_integer(F(2, 3))) + + def test_integral_is_integer(self): + self.assertTrue(Integral.is_integer(-1)) + self.assertTrue(Integral.is_integer(0)) + self.assertTrue(Integral.is_integer(1)) + self.assertTrue(Integral.is_integer(1729)) + + if __name__ == '__main__': unittest.main() diff --git a/Misc/ACKS b/Misc/ACKS index 85001daf67d234..9be0e777ca2942 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1611,6 +1611,7 @@ Roman Skurikhin Ville Skyttä Michael Sloan Nick Sloan +Robert Smallshire Václav Šmilauer Allen W. Smith Christopher Smith diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-03-15-11-51-36.bpo-26680.wOWYps.rst b/Misc/NEWS.d/next/Core and Builtins/2018-03-15-11-51-36.bpo-26680.wOWYps.rst new file mode 100644 index 00000000000000..93325ffffcbfc6 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-03-15-11-51-36.bpo-26680.wOWYps.rst @@ -0,0 +1,2 @@ +The int type now supports the x.is_integer() method for compatibility with +float. diff --git a/Misc/NEWS.d/next/Library/2018-03-15-11-55-04.bpo-26680.eKAi85.rst b/Misc/NEWS.d/next/Library/2018-03-15-11-55-04.bpo-26680.eKAi85.rst new file mode 100644 index 00000000000000..8b2e818383041a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-03-15-11-55-04.bpo-26680.eKAi85.rst @@ -0,0 +1,3 @@ +The x.is_integer() method is incorporated into the abstract types of the +numeric tower, Real, Rational and Integral, with appropriate default +implementations. diff --git a/Misc/NEWS.d/next/Library/2018-03-15-11-56-48.bpo-26680.Udkhn4.rst b/Misc/NEWS.d/next/Library/2018-03-15-11-56-48.bpo-26680.Udkhn4.rst new file mode 100644 index 00000000000000..df75e080fa6ee0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-03-15-11-56-48.bpo-26680.Udkhn4.rst @@ -0,0 +1,2 @@ +The d.is_integer() method is added to the Decimal type, for compatibility +with other number types. diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index e7c44acba02fc2..5200b1a48e4bfa 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -4138,6 +4138,7 @@ Dec_BoolFunc(mpd_isqnan) Dec_BoolFunc(mpd_issnan) Dec_BoolFunc(mpd_issigned) Dec_BoolFunc(mpd_iszero) +Dec_BoolFunc(mpd_isinteger) /* Boolean functions, optional context arg */ Dec_BoolFuncVA(mpd_isnormal) @@ -4772,6 +4773,7 @@ static PyMethodDef dec_methods [] = { "is_snan", dec_mpd_issnan, METH_NOARGS, doc_is_snan }, { "is_signed", dec_mpd_issigned, METH_NOARGS, doc_is_signed }, { "is_zero", dec_mpd_iszero, METH_NOARGS, doc_is_zero }, + { "is_integer", dec_mpd_isinteger, METH_NOARGS, doc_is_integer}, /* Boolean functions, optional context arg */ { "is_normal", (PyCFunction)(void(*)(void))dec_mpd_isnormal, METH_VARARGS|METH_KEYWORDS, doc_is_normal }, @@ -5183,6 +5185,7 @@ DecCtx_BoolFunc_NO_CTX(mpd_isqnan) DecCtx_BoolFunc_NO_CTX(mpd_issigned) DecCtx_BoolFunc_NO_CTX(mpd_issnan) DecCtx_BoolFunc_NO_CTX(mpd_iszero) +DecCtx_BoolFunc_NO_CTX(mpd_isinteger) static PyObject * ctx_iscanonical(PyObject *context UNUSED, PyObject *v) @@ -5464,6 +5467,7 @@ static PyMethodDef context_methods [] = { "is_snan", ctx_mpd_issnan, METH_O, doc_ctx_is_snan }, { "is_subnormal", ctx_mpd_issubnormal, METH_O, doc_ctx_is_subnormal }, { "is_zero", ctx_mpd_iszero, METH_O, doc_ctx_is_zero }, + { "is_integer", ctx_mpd_isinteger, METH_O, doc_ctx_is_integer }, /* Functions with a single decimal argument */ { "_apply", PyDecContext_Apply, METH_O, NULL }, /* alias for apply */ @@ -6097,5 +6101,3 @@ PyInit__decimal(void) return NULL; /* GCOV_NOT_REACHED */ } - - diff --git a/Modules/_decimal/docstrings.h b/Modules/_decimal/docstrings.h index f7fd6e79529984..bd602ab278e0ed 100644 --- a/Modules/_decimal/docstrings.h +++ b/Modules/_decimal/docstrings.h @@ -260,6 +260,11 @@ Return True if the argument is a (positive or negative) zero and False\n\ otherwise.\n\ \n"); +PyDoc_STRVAR(doc_is_integer, +"is_integer($self, /)\n--\n\n\ +Return True if the argument is finite and integral, otherwise False.\n\ +\n"); + PyDoc_STRVAR(doc_ln, "ln($self, /, context=None)\n--\n\n\ Return the natural (base e) logarithm of the operand. The function always\n\ @@ -685,6 +690,11 @@ PyDoc_STRVAR(doc_ctx_is_zero, Return True if x is a zero, False otherwise.\n\ \n"); +PyDoc_STRVAR(doc_ctx_is_integer, +"is_integer($self, x, /)\n--\n\n\ ++Return True if x is finite and integral, False otherwise.\n\ ++\n"); + PyDoc_STRVAR(doc_ctx_ln, "ln($self, x, /)\n--\n\n\ Return the natural (base e) logarithm of x.\n\ @@ -879,6 +889,3 @@ Convert a number to a string using scientific notation.\n\ #endif /* DOCSTRINGS_H */ - - - diff --git a/Objects/clinic/longobject.c.h b/Objects/clinic/longobject.c.h index 4bd47b116f883c..16e6f7e619e872 100644 --- a/Objects/clinic/longobject.c.h +++ b/Objects/clinic/longobject.c.h @@ -121,6 +121,24 @@ int___round__(PyObject *self, PyObject *const *args, Py_ssize_t nargs) return return_value; } +PyDoc_STRVAR(int_is_integer__doc__, +"is_integer($self, /)\n" +"--\n" +"\n" +"Returns True for all integers."); + +#define INT_IS_INTEGER_METHODDEF \ + {"is_integer", (PyCFunction)int_is_integer, METH_NOARGS, int_is_integer__doc__}, + +static PyObject * +int_is_integer_impl(PyObject *self); + +static PyObject * +int_is_integer(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + return int_is_integer_impl(self); +} + PyDoc_STRVAR(int___sizeof____doc__, "__sizeof__($self, /)\n" "--\n" @@ -367,4 +385,4 @@ int_from_bytes(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyOb exit: return return_value; } -/*[clinic end generated code: output=ea18e51af5b53591 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=022614978e2fcdf3 input=a9049054013a1b77]*/ diff --git a/Objects/longobject.c b/Objects/longobject.c index 92514d4154e2cb..bc5b49dcf8b56f 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5233,6 +5233,19 @@ int___round___impl(PyObject *self, PyObject *o_ndigits) return result; } +/*[clinic input] +int.is_integer + +Returns True for all integers. +[clinic start generated code]*/ + +static PyObject * +int_is_integer_impl(PyObject *self) +/*[clinic end generated code: output=90f8e794ce5430ef input=1c1a86957301d26d]*/ +{ + Py_RETURN_TRUE; +} + /*[clinic input] int.__sizeof__ -> Py_ssize_t @@ -5547,6 +5560,7 @@ static PyMethodDef long_methods[] = { {"__ceil__", long_long_meth, METH_NOARGS, "Ceiling of an Integral returns itself."}, INT___ROUND___METHODDEF + INT_IS_INTEGER_METHODDEF INT___GETNEWARGS___METHODDEF INT___FORMAT___METHODDEF INT___SIZEOF___METHODDEF From c16ff10a2de84bd7140506e3881f3a652b66d106 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 1 Oct 2020 18:57:37 +0200 Subject: [PATCH 0183/1261] bpo-21955: Change my nickname in BINARY_ADD comment (GH-22481) --- Python/ceval.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/ceval.c b/Python/ceval.c index 6bd2d6bc13d86f..7c6cf83bc9ac01 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1701,7 +1701,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) PyObject *right = POP(); PyObject *left = TOP(); PyObject *sum; - /* NOTE(haypo): Please don't try to micro-optimize int+int on + /* NOTE(vstinner): Please don't try to micro-optimize int+int on CPython using bytecode, it is simply worthless. See http://bugs.python.org/issue21955 and http://bugs.python.org/issue10044 for the discussion. In short, From f44bc372c0cdb3217eb024831cc4e3412919e7ae Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Thu, 1 Oct 2020 20:22:14 -0300 Subject: [PATCH 0184/1261] [doc] Update references to NumPy (GH-22458) Numeric(al) Python to NumPy. It seems the old name hasn't been used for some time. --- Doc/faq/programming.rst | 2 +- Doc/library/array.rst | 5 ++--- Doc/library/functions.rst | 4 +--- Doc/tutorial/floatingpoint.rst | 2 +- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 76ae4d260fad46..0b486d7e7e254a 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1191,7 +1191,7 @@ difference is that a Python list can contain objects of many different types. The ``array`` module also provides methods for creating arrays of fixed types with compact representations, but they are slower to index than lists. Also -note that the Numeric extensions and others define array-like structures with +note that NumPy and other third party packages define array-like structures with various characteristics as well. To get Lisp-style linked lists, you can emulate cons cells using tuples:: diff --git a/Doc/library/array.rst b/Doc/library/array.rst index f2f7894e1bf0f0..f892d0983b6b37 100644 --- a/Doc/library/array.rst +++ b/Doc/library/array.rst @@ -256,7 +256,6 @@ Examples:: Packing and unpacking of External Data Representation (XDR) data as used in some remote procedure call systems. - `The Numerical Python Documentation `_ - The Numeric Python extension (NumPy) defines another array type; see - http://www.numpy.org/ for further information about Numerical Python. + `NumPy `_ + The NumPy package defines another array type. diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 7543fc4b10d466..c49bb0c9de70ca 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1512,14 +1512,12 @@ are always available. They are listed here in alphabetical order. .. class:: slice(stop) slice(start, stop[, step]) - .. index:: single: Numerical Python - Return a :term:`slice` object representing the set of indices specified by ``range(start, stop, step)``. The *start* and *step* arguments default to ``None``. Slice objects have read-only data attributes :attr:`~slice.start`, :attr:`~slice.stop` and :attr:`~slice.step` which merely return the argument values (or their default). They have no other explicit functionality; - however they are used by Numerical Python and other third party extensions. + however they are used by NumPy and other third party packages. Slice objects are also generated when extended indexing syntax is used. For example: ``a[start:stop:step]`` or ``a[start:stop, i]``. See :func:`itertools.islice` for an alternate version that returns an iterator. diff --git a/Doc/tutorial/floatingpoint.rst b/Doc/tutorial/floatingpoint.rst index 0c0eb526fa9ed6..b98de6e56a0031 100644 --- a/Doc/tutorial/floatingpoint.rst +++ b/Doc/tutorial/floatingpoint.rst @@ -158,7 +158,7 @@ which implements arithmetic based on rational numbers (so the numbers like 1/3 can be represented exactly). If you are a heavy user of floating point operations you should take a look -at the Numerical Python package and many other packages for mathematical and +at the NumPy package and many other packages for mathematical and statistical operations supplied by the SciPy project. See . Python provides tools that may help on those rare occasions when you really From 09579d92e4c42fee18c0d841f7dd82940bab73fa Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 1 Oct 2020 19:30:54 -0700 Subject: [PATCH 0185/1261] Update link to supporting references (GH-22488) --- Modules/mathmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 5cd31b7dd4acfb..45b03028753a3f 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2494,7 +2494,7 @@ exactly equal) was verified for 1 billion random inputs with n=5. [7] 3. Square root differential correction: https://arxiv.org/pdf/1904.09481.pdf 4. Data dependency graph: https://bugs.python.org/file49439/hypot.png 5. https://www.wolframalpha.com/input/?i=Maclaurin+series+sqrt%28h**2+%2B+x%29+at+x%3D0 -6. Analysis of internal accuracy: https://bugs.python.org/file49435/best_frac.py +6. Analysis of internal accuracy: https://bugs.python.org/file49484/best_frac.py 7. Commutativity test: https://bugs.python.org/file49448/test_hypot_commutativity.py */ From 39f2d49a8a53abf2eadf17d831ccbd410a445023 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 2 Oct 2020 14:49:00 +0200 Subject: [PATCH 0186/1261] bpo-41692: Deprecate PyUnicode_InternImmortal() (GH-22486) The PyUnicode_InternImmortal() function is now deprecated and will be removed in Python 3.12: use PyUnicode_InternInPlace() instead. --- Doc/whatsnew/3.10.rst | 8 ++++++++ Include/unicodeobject.h | 5 ++++- .../next/C API/2020-10-02-00-57-34.bpo-41692.fDScsF.rst | 3 +++ Objects/unicodeobject.c | 9 +++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/C API/2020-10-02-00-57-34.bpo-41692.fDScsF.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index f74dd1aa247a34..957a3e791ecb69 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -299,6 +299,14 @@ Porting to Python 3.10 Unicode object without initial data. (Contributed by Inada Naoki in :issue:`36346`.) +Deprecated +---------- + +* The ``PyUnicode_InternImmortal()`` function is now deprecated + and will be removed in Python 3.12: use :c:func:`PyUnicode_InternInPlace` + instead. + (Contributed by Victor Stinner in :issue:`41692`.) + Removed ------- diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 500ce242e9f0e8..90b3299fd26ceb 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -261,11 +261,14 @@ PyAPI_FUNC(PyObject *) PyUnicode_FromFormat( ); PyAPI_FUNC(void) PyUnicode_InternInPlace(PyObject **); -PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **); PyAPI_FUNC(PyObject *) PyUnicode_InternFromString( const char *u /* UTF-8 encoded string */ ); +// PyUnicode_InternImmortal() is deprecated since Python 3.10 +// and will be removed in Python 3.12. Use PyUnicode_InternInPlace() instead. +Py_DEPRECATED(3.10) PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **); + /* Use only if you know it's a string */ #define PyUnicode_CHECK_INTERNED(op) \ (((PyASCIIObject *)(op))->state.interned) diff --git a/Misc/NEWS.d/next/C API/2020-10-02-00-57-34.bpo-41692.fDScsF.rst b/Misc/NEWS.d/next/C API/2020-10-02-00-57-34.bpo-41692.fDScsF.rst new file mode 100644 index 00000000000000..1be37c6572271b --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-02-00-57-34.bpo-41692.fDScsF.rst @@ -0,0 +1,3 @@ +The ``PyUnicode_InternImmortal()`` function is now deprecated and will be +removed in Python 3.12: use :c:func:`PyUnicode_InternInPlace` instead. +Patch by Victor Stinner. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index f32ab417c364ca..cf72238a8d0585 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -15764,6 +15764,15 @@ PyUnicode_InternInPlace(PyObject **p) void PyUnicode_InternImmortal(PyObject **p) { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "PyUnicode_InternImmortal() is deprecated; " + "use PyUnicode_InternInPlace() instead", 1) < 0) + { + // The function has no return value, the exception cannot + // be reported to the caller, so just log it. + PyErr_WriteUnraisable(NULL); + } + PyUnicode_InternInPlace(p); if (PyUnicode_CHECK_INTERNED(*p) != SSTATE_INTERNED_IMMORTAL) { _PyUnicode_STATE(*p).interned = SSTATE_INTERNED_IMMORTAL; From 7d43311c24835bf8e9e900b436729229e5a62566 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 3 Oct 2020 02:18:01 +1000 Subject: [PATCH 0187/1261] bpo-41802: Document 'PyDict_DelItem' can raise a 'KeyError' (GH-22291) --- Doc/c-api/dict.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index 769484134ed515..8e0d6845463490 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -81,14 +81,16 @@ Dictionary Objects .. c:function:: int PyDict_DelItem(PyObject *p, PyObject *key) Remove the entry in dictionary *p* with key *key*. *key* must be hashable; - if it isn't, :exc:`TypeError` is raised. Return ``0`` on success or ``-1`` - on failure. + if it isn't, :exc:`TypeError` is raised. + If *key* is not in the dictionary, :exc:`KeyError` is raised. + Return ``0`` on success or ``-1`` on failure. .. c:function:: int PyDict_DelItemString(PyObject *p, const char *key) - Remove the entry in dictionary *p* which has a key specified by the string - *key*. Return ``0`` on success or ``-1`` on failure. + Remove the entry in dictionary *p* which has a key specified by the string *key*. + If *key* is not in the dictionary, :exc:`KeyError` is raised. + Return ``0`` on success or ``-1`` on failure. .. c:function:: PyObject* PyDict_GetItem(PyObject *p, PyObject *key) From 5371f07c77f595ad5f49b38a9408cf576f2051ba Mon Sep 17 00:00:00 2001 From: Hansraj Das Date: Sat, 3 Oct 2020 01:51:45 +0530 Subject: [PATCH 0188/1261] Typo fix - "mesasge" should be "message" (GH-22498) * Correct at 2 places in email module --- Lib/email/message.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/email/message.py b/Lib/email/message.py index 12626026179608..3701b305532b4c 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -141,7 +141,7 @@ def as_string(self, unixfrom=False, maxheaderlen=0, policy=None): header. For backward compatibility reasons, if maxheaderlen is not specified it defaults to 0, so you must override it explicitly if you want a different maxheaderlen. 'policy' is passed to the - Generator instance used to serialize the mesasge; if it is not + Generator instance used to serialize the message; if it is not specified the policy associated with the message instance is used. If the message object contains binary data that is not encoded @@ -958,7 +958,7 @@ def as_string(self, unixfrom=False, maxheaderlen=None, policy=None): header. maxheaderlen is retained for backward compatibility with the base Message class, but defaults to None, meaning that the policy value for max_line_length controls the header maximum length. 'policy' is - passed to the Generator instance used to serialize the mesasge; if it + passed to the Generator instance used to serialize the message; if it is not specified the policy associated with the message instance is used. """ From 99029b0347f0e3a36d6fd5b6996779aeacc9a77a Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Fri, 2 Oct 2020 19:36:26 -0300 Subject: [PATCH 0189/1261] Fix is_typeddict markup (#22501) --- Doc/library/typing.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 3b824d0a4a8da0..cbb18954a6764a 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1666,12 +1666,13 @@ Introspection helpers Check if a type is a :class:`TypedDict`. For example:: - class Film(TypedDict): - title: str - year: int - is_typeddict(Film) # => True - is_typeddict(Union[list, str]) # => False + class Film(TypedDict): + title: str + year: int + + is_typeddict(Film) # => True + is_typeddict(Union[list, str]) # => False .. versionadded:: 3.10 From c2ffcb4759d1ae00c1841cee84784ab5011eb117 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Fri, 2 Oct 2020 20:15:28 -0300 Subject: [PATCH 0190/1261] [doc] Fix link to abc.collections.Iterable (GH-22502) Automerge-Triggered-By: @gvanrossum --- Doc/library/typing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index cbb18954a6764a..35e0445889b172 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -903,7 +903,7 @@ These are not used in annotations. They are building blocks for creating generic Such a protocol can be used with :func:`isinstance` and :func:`issubclass`. This raises :exc:`TypeError` when applied to a non-protocol class. This allows a simple-minded structural check, very similar to "one trick ponies" - in :mod:`collections.abc` such as :class:`Iterable`. For example:: + in :mod:`collections.abc` such as :class:`~collections.abc.Iterable`. For example:: @runtime_checkable class Closable(Protocol): From ecd440b726d425178e6c2655bba40273661ba8bd Mon Sep 17 00:00:00 2001 From: scoder Date: Sat, 3 Oct 2020 08:07:07 +0200 Subject: [PATCH 0191/1261] bpo-41900: C14N 2.0 serialisation failed for unprefixed attributes when a default namespace was defined. (GH-22474) --- Lib/test/test_xml_etree.py | 8 ++++++++ Lib/xml/etree/ElementTree.py | 5 +++++ .../next/Library/2020-10-01-10-50-12.bpo-41900.Cho7oh.rst | 2 ++ 3 files changed, 15 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-10-01-10-50-12.bpo-41900.Cho7oh.rst diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index d22c35d92c4e33..3f1f3781e488c1 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -3899,6 +3899,14 @@ def test_simple_roundtrip(self): #self.assertEqual(c14n_roundtrip(""), #'') + # Namespace issues + xml = '' + self.assertEqual(c14n_roundtrip(xml), xml) + xml = '' + self.assertEqual(c14n_roundtrip(xml), xml) + xml = '' + self.assertEqual(c14n_roundtrip(xml), xml) + def test_c14n_exclusion(self): xml = textwrap.dedent("""\ diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index da2bcad0b4d629..7a269001d6e18f 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -1876,6 +1876,11 @@ def _qname(self, qname, uri=None): self._declared_ns_stack[-1].append((uri, prefix)) return f'{prefix}:{tag}' if prefix else tag, tag, uri + if not uri: + # As soon as a default namespace is defined, + # anything that has no namespace (and thus, no prefix) goes there. + return tag, tag, uri + raise ValueError(f'Namespace "{uri}" is not declared in scope') def data(self, data): diff --git a/Misc/NEWS.d/next/Library/2020-10-01-10-50-12.bpo-41900.Cho7oh.rst b/Misc/NEWS.d/next/Library/2020-10-01-10-50-12.bpo-41900.Cho7oh.rst new file mode 100644 index 00000000000000..6586c09ec985d5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-01-10-50-12.bpo-41900.Cho7oh.rst @@ -0,0 +1,2 @@ +C14N 2.0 serialisation in xml.etree.ElementTree failed for unprefixed attributes +when a default namespace was defined. From 5ae76fe519775f7016320d992083279fecb12120 Mon Sep 17 00:00:00 2001 From: Ram Rachum Date: Sat, 3 Oct 2020 12:52:13 +0300 Subject: [PATCH 0192/1261] bpo-40833: Clarify Path.rename doc-string regarding relative paths (GH-20554) --- Doc/library/pathlib.rst | 8 ++++++++ Lib/pathlib.py | 19 ++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 23486b625072f3..9526a03b053986 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1008,6 +1008,10 @@ call fails (for example because the path doesn't exist). >>> target.open().read() 'some text' + The target path may be absolute or relative. Relative paths are interpreted + relative to the current working directory, *not* the directory of the Path + object. + .. versionchanged:: 3.8 Added return value, return the new Path instance. @@ -1018,6 +1022,10 @@ call fails (for example because the path doesn't exist). instance pointing to *target*. If *target* points to an existing file or directory, it will be unconditionally replaced. + The target path may be absolute or relative. Relative paths are interpreted + relative to the current working directory, *not* the directory of the Path + object. + .. versionchanged:: 3.8 Added return value, return the new Path instance. diff --git a/Lib/pathlib.py b/Lib/pathlib.py index babc443dd3b304..147be2ff0dddfc 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1366,17 +1366,26 @@ def link_to(self, target): def rename(self, target): """ - Rename this path to the given path, - and return a new Path instance pointing to the given path. + Rename this path to the target path. + + The target path may be absolute or relative. Relative paths are + interpreted relative to the current working directory, *not* the + directory of the Path object. + + Returns the new Path instance pointing to the target path. """ self._accessor.rename(self, target) return self.__class__(target) def replace(self, target): """ - Rename this path to the given path, clobbering the existing - destination if it exists, and return a new Path instance - pointing to the given path. + Rename this path to the target path, overwriting if that path exists. + + The target path may be absolute or relative. Relative paths are + interpreted relative to the current working directory, *not* the + directory of the Path object. + + Returns the new Path instance pointing to the target path. """ self._accessor.replace(self, target) return self.__class__(target) From 6d80e6eae4037793c967445161c58500698ceb0c Mon Sep 17 00:00:00 2001 From: Ram Rachum Date: Sat, 3 Oct 2020 13:43:47 +0300 Subject: [PATCH 0193/1261] bpo-41867: List options for timespec in docstrings of isoformat methods (GH-22418) --- Lib/datetime.py | 6 ++++-- Modules/_datetimemodule.c | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Lib/datetime.py b/Lib/datetime.py index 3090978508c921..ea86bcb8b2388a 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -1421,7 +1421,8 @@ def isoformat(self, timespec='auto'): part is omitted if self.microsecond == 0. The optional argument timespec specifies the number of additional - terms of the time to include. + terms of the time to include. Valid options are 'auto', 'hours', + 'minutes', 'seconds', 'milliseconds' and 'microseconds'. """ s = _format_time(self._hour, self._minute, self._second, self._microsecond, timespec) @@ -1906,7 +1907,8 @@ def isoformat(self, sep='T', timespec='auto'): time, default 'T'. The optional argument timespec specifies the number of additional - terms of the time to include. + terms of the time to include. Valid options are 'auto', 'hours', + 'minutes', 'seconds', 'milliseconds' and 'microseconds'. """ s = ("%04d-%02d-%02d%c" % (self._year, self._month, self._day, sep) + _format_time(self._hour, self._minute, self._second, diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 0631272429f4f1..94868717e6a04c 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -4663,7 +4663,10 @@ static PyMethodDef time_methods[] = { {"isoformat", (PyCFunction)(void(*)(void))time_isoformat, METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Return string in ISO 8601 format, [HH[:MM[:SS[.mmm[uuu]]]]]" "[+HH:MM].\n\n" - "timespec specifies what components of the time to include.\n")}, + "The optional argument timespec specifies the number " + "of additional terms\nof the time to include. Valid " + "options are 'auto', 'hours', 'minutes',\n'seconds', " + "'milliseconds' and 'microseconds'.\n")}, {"strftime", (PyCFunction)(void(*)(void))time_strftime, METH_VARARGS | METH_KEYWORDS, PyDoc_STR("format -> strftime() style string.")}, @@ -6370,9 +6373,10 @@ static PyMethodDef datetime_methods[] = { "YYYY-MM-DDT[HH[:MM[:SS[.mmm[uuu]]]]][+HH:MM].\n" "sep is used to separate the year from the time, and " "defaults to 'T'.\n" - "timespec specifies what components of the time to include" - " (allowed values are 'auto', 'hours', 'minutes', 'seconds'," - " 'milliseconds', and 'microseconds').\n")}, + "The optional argument timespec specifies the number " + "of additional terms\nof the time to include. Valid " + "options are 'auto', 'hours', 'minutes',\n'seconds', " + "'milliseconds' and 'microseconds'.\n")}, {"utcoffset", (PyCFunction)datetime_utcoffset, METH_NOARGS, PyDoc_STR("Return self.tzinfo.utcoffset(self).")}, From c40a100404f07522ab7b35ef673771ea73f4e5da Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sat, 3 Oct 2020 15:28:51 +0100 Subject: [PATCH 0194/1261] bpo-41826: Fix compiler warnings in test_peg_generator (GH-22455) Co-authored-by: Skip Montanaro --- Lib/test/test_peg_generator/test_c_parser.py | 33 ++++++++++---------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/Lib/test/test_peg_generator/test_c_parser.py b/Lib/test/test_peg_generator/test_c_parser.py index 2c13635d37dea3..0dffedca789c57 100644 --- a/Lib/test/test_peg_generator/test_c_parser.py +++ b/Lib/test/test_peg_generator/test_c_parser.py @@ -90,7 +90,7 @@ def run_test(self, grammar_source, test_source): def test_c_parser(self) -> None: grammar_source = """ - start[mod_ty]: a=stmt* $ { Module(a, NULL, p->arena) } + start[mod_ty]: a[asdl_stmt_seq*]=stmt* $ { Module(a, NULL, p->arena) } stmt[stmt_ty]: a=expr_stmt { a } expr_stmt[stmt_ty]: a=expression NEWLINE { _Py_Expr(a, EXTRA) } expression[expr_ty]: ( l=expression '+' r=term { _Py_BinOp(l, Add, r, EXTRA) } @@ -232,7 +232,7 @@ def test_nasty_mutually_left_recursive(self) -> None: def test_return_stmt_noexpr_action(self) -> None: grammar_source = """ start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } - statements[asdl_seq*]: a=statement+ { a } + statements[asdl_stmt_seq*]: a[asdl_stmt_seq*]=statement+ { a } statement[stmt_ty]: simple_stmt simple_stmt[stmt_ty]: small_stmt small_stmt[stmt_ty]: return_stmt @@ -246,7 +246,7 @@ def test_return_stmt_noexpr_action(self) -> None: def test_gather_action_ast(self) -> None: grammar_source = """ - start[mod_ty]: a=';'.pass_stmt+ NEWLINE ENDMARKER { Module(a, NULL, p->arena) } + start[mod_ty]: a[asdl_stmt_seq*]=';'.pass_stmt+ NEWLINE ENDMARKER { Module(a, NULL, p->arena) } pass_stmt[stmt_ty]: a='pass' { _Py_Pass(EXTRA)} """ test_source = """ @@ -258,7 +258,7 @@ def test_gather_action_ast(self) -> None: def test_pass_stmt_action(self) -> None: grammar_source = """ start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } - statements[asdl_seq*]: a=statement+ { a } + statements[asdl_stmt_seq*]: a[asdl_stmt_seq*]=statement+ { a } statement[stmt_ty]: simple_stmt simple_stmt[stmt_ty]: small_stmt small_stmt[stmt_ty]: pass_stmt @@ -273,10 +273,11 @@ def test_pass_stmt_action(self) -> None: def test_if_stmt_action(self) -> None: grammar_source = """ start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } - statements[asdl_seq*]: a=statement+ { _PyPegen_seq_flatten(p, a) } - statement[asdl_seq*]: a=compound_stmt { _PyPegen_singleton_seq(p, a) } | simple_stmt + statements[asdl_stmt_seq*]: a=statement+ { (asdl_stmt_seq*)_PyPegen_seq_flatten(p, a) } + statement[asdl_stmt_seq*]: a=compound_stmt { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } | simple_stmt - simple_stmt[asdl_seq*]: a=small_stmt b=further_small_stmt* [';'] NEWLINE { _PyPegen_seq_insert_in_front(p, a, b) } + simple_stmt[asdl_stmt_seq*]: a=small_stmt b=further_small_stmt* [';'] NEWLINE { + (asdl_stmt_seq*)_PyPegen_seq_insert_in_front(p, a, b) } further_small_stmt[stmt_ty]: ';' a=small_stmt { a } block: simple_stmt | NEWLINE INDENT a=statements DEDENT { a } @@ -299,14 +300,14 @@ def test_if_stmt_action(self) -> None: def test_same_name_different_types(self) -> None: grammar_source = """ - start[mod_ty]: a=import_from+ NEWLINE ENDMARKER { Module(a, NULL, p->arena)} + start[mod_ty]: a[asdl_stmt_seq*]=import_from+ NEWLINE ENDMARKER { Module(a, NULL, p->arena)} import_from[stmt_ty]: ( a='from' !'import' c=simple_name 'import' d=import_as_names_from { _Py_ImportFrom(c->v.Name.id, d, 0, EXTRA) } | a='from' '.' 'import' c=import_as_names_from { _Py_ImportFrom(NULL, c, 1, EXTRA) } ) simple_name[expr_ty]: NAME - import_as_names_from[asdl_seq*]: a=','.import_as_name_from+ { a } + import_as_names_from[asdl_alias_seq*]: a[asdl_alias_seq*]=','.import_as_name_from+ { a } import_as_name_from[alias_ty]: a=NAME 'as' b=NAME { _Py_alias(((expr_ty) a)->v.Name.id, ((expr_ty) b)->v.Name.id, p->arena) } """ test_source = """ @@ -320,12 +321,12 @@ def test_same_name_different_types(self) -> None: def test_with_stmt_with_paren(self) -> None: grammar_source = """ start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } - statements[asdl_seq*]: a=statement+ { _PyPegen_seq_flatten(p, a) } - statement[asdl_seq*]: a=compound_stmt { _PyPegen_singleton_seq(p, a) } + statements[asdl_stmt_seq*]: a=statement+ { (asdl_stmt_seq*)_PyPegen_seq_flatten(p, a) } + statement[asdl_stmt_seq*]: a=compound_stmt { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } compound_stmt[stmt_ty]: with_stmt with_stmt[stmt_ty]: ( - a='with' '(' b=','.with_item+ ')' ':' c=block { - _Py_With(b, _PyPegen_singleton_seq(p, c), NULL, EXTRA) } + a='with' '(' b[asdl_withitem_seq*]=','.with_item+ ')' ':' c=block { + _Py_With(b, (asdl_stmt_seq*) _PyPegen_singleton_seq(p, c), NULL, EXTRA) } ) with_item[withitem_ty]: ( e=NAME o=['as' t=NAME { t }] { _Py_withitem(e, _PyPegen_set_expr_context(p, o, Store), p->arena) } @@ -346,12 +347,12 @@ def test_with_stmt_with_paren(self) -> None: def test_ternary_operator(self) -> None: grammar_source = """ start[mod_ty]: a=expr ENDMARKER { Module(a, NULL, p->arena) } - expr[asdl_seq*]: a=listcomp NEWLINE { _PyPegen_singleton_seq(p, _Py_Expr(a, EXTRA)) } + expr[asdl_stmt_seq*]: a=listcomp NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, _Py_Expr(a, EXTRA)) } listcomp[expr_ty]: ( a='[' b=NAME c=for_if_clauses d=']' { _Py_ListComp(b, c, EXTRA) } ) - for_if_clauses[asdl_seq*]: ( - a=(y=[ASYNC] 'for' a=NAME 'in' b=NAME c=('if' z=NAME { z })* + for_if_clauses[asdl_comprehension_seq*]: ( + a[asdl_comprehension_seq*]=(y=[ASYNC] 'for' a=NAME 'in' b=NAME c[asdl_expr_seq*]=('if' z=NAME { z })* { _Py_comprehension(_Py_Name(((expr_ty) a)->v.Name.id, Store, EXTRA), b, c, (y == NULL) ? 0 : 1, p->arena) })+ { a } ) """ From 099b31e7e6e92970fb661544025a40ff2497b0f4 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 3 Oct 2020 10:58:39 -0400 Subject: [PATCH 0195/1261] bpo-40564: Avoid copying state from extant ZipFile. (GH-22371) bpo-40564: Avoid copying state from extant ZipFile. --- Lib/test/test_zipfile.py | 33 +++++++++++++++++++ Lib/zipfile.py | 23 +++++++++---- .../2020-09-23-03-33-37.bpo-40564.iXQqMq.rst | 1 + 3 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-23-03-33-37.bpo-40564.iXQqMq.rst diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 687e43df780d65..3bb9ce995c2a17 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -2889,6 +2889,33 @@ def test_open(self): data = strm.read() assert data == "content of a" + def test_open_write(self): + """ + If the zipfile is open for write, it should be possible to + write bytes or text to it. + """ + zf = zipfile.Path(zipfile.ZipFile(io.BytesIO(), mode='w')) + with zf.joinpath('file.bin').open('wb') as strm: + strm.write(b'binary contents') + with zf.joinpath('file.txt').open('w') as strm: + strm.write('text file') + + def test_open_extant_directory(self): + """ + Attempting to open a directory raises IsADirectoryError. + """ + zf = zipfile.Path(add_dirs(build_alpharep_fixture())) + with self.assertRaises(IsADirectoryError): + zf.joinpath('b').open() + + def test_open_missing_directory(self): + """ + Attempting to open a missing directory raises FileNotFoundError. + """ + zf = zipfile.Path(add_dirs(build_alpharep_fixture())) + with self.assertRaises(FileNotFoundError): + zf.joinpath('z').open() + def test_read(self): for alpharep in self.zipfile_alpharep(): root = zipfile.Path(alpharep) @@ -2986,6 +3013,12 @@ def test_implied_dirs_performance(self): data = ['/'.join(string.ascii_lowercase + str(n)) for n in range(10000)] zipfile.CompleteDirs._implied_dirs(data) + def test_read_does_not_close(self): + for alpharep in self.zipfile_ondisk(): + with zipfile.ZipFile(alpharep) as file: + for rep in range(2): + zipfile.Path(file, 'a.txt').read_text() + if __name__ == "__main__": unittest.main() diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 816f8582bbf6d5..da3e40e5dbd41b 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -2197,13 +2197,12 @@ def make(cls, source): if not isinstance(source, ZipFile): return cls(source) - # Only allow for FastPath when supplied zipfile is read-only + # Only allow for FastLookup when supplied zipfile is read-only if 'r' not in source.mode: cls = CompleteDirs - res = cls.__new__(cls) - vars(res).update(vars(source)) - return res + source.__class__ = cls + return source class FastLookup(CompleteDirs): @@ -2292,17 +2291,29 @@ class Path: __repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})" def __init__(self, root, at=""): + """ + Construct a Path from a ZipFile or filename. + + Note: When the source is an existing ZipFile object, + its type (__class__) will be mutated to a + specialized type. If the caller wishes to retain the + original type, the caller should either create a + separate ZipFile object or pass a filename. + """ self.root = FastLookup.make(root) self.at = at - def open(self, mode='r', *args, **kwargs): + def open(self, mode='r', *args, pwd=None, **kwargs): """ Open this entry as text or binary following the semantics of ``pathlib.Path.open()`` by passing arguments through to io.TextIOWrapper(). """ - pwd = kwargs.pop('pwd', None) + if self.is_dir(): + raise IsADirectoryError(self) zip_mode = mode[0] + if not self.exists() and zip_mode == 'r': + raise FileNotFoundError(self) stream = self.root.open(self.at, zip_mode, pwd=pwd) if 'b' in mode: if args or kwargs: diff --git a/Misc/NEWS.d/next/Library/2020-09-23-03-33-37.bpo-40564.iXQqMq.rst b/Misc/NEWS.d/next/Library/2020-09-23-03-33-37.bpo-40564.iXQqMq.rst new file mode 100644 index 00000000000000..085534734ec948 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-23-03-33-37.bpo-40564.iXQqMq.rst @@ -0,0 +1 @@ +In ``zipfile.Path``, mutate the passed ZipFile object type instead of making a copy. Prevents issues when both the local copy and the caller’s copy attempt to close the same file handle. \ No newline at end of file From a0f8e74cb7ca97b977c41981dbc02a79806ca906 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Sat, 3 Oct 2020 12:51:13 -0300 Subject: [PATCH 0196/1261] [doc] Fix link to abc.collections.Iterable (GH-22520) Missed this occurrence before, sorry. Also changed "the PEP" to "PEP". Automerge-Triggered-By: @gvanrossum --- Doc/library/typing.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 35e0445889b172..e2ae539d957e6d 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -406,10 +406,10 @@ Initially :pep:`484` defined Python static type system as using a class ``B`` is expected if and only if ``A`` is a subclass of ``B``. This requirement previously also applied to abstract base classes, such as -:class:`Iterable`. The problem with this approach is that a class had +:class:`~collections.abc.Iterable`. The problem with this approach is that a class had to be explicitly marked to support them, which is unpythonic and unlike what one would normally do in idiomatic dynamically typed Python code. -For example, this conforms to the :pep:`484`:: +For example, this conforms to :pep:`484`:: from collections.abc import Sized, Iterable, Iterator From 09b4c871349a37126485c4220a97d18411b811b5 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 4 Oct 2020 02:16:56 +0900 Subject: [PATCH 0197/1261] bpo-41922: Use PEP 590 vectorcall to speed up reversed() (GH-22523) --- .../2020-10-04-01-02-58.bpo-41922.kHGT8I.rst | 2 ++ Objects/enumobject.c | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-04-01-02-58.bpo-41922.kHGT8I.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-04-01-02-58.bpo-41922.kHGT8I.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-04-01-02-58.bpo-41922.kHGT8I.rst new file mode 100644 index 00000000000000..3c4de2c93555f2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-04-01-02-58.bpo-41922.kHGT8I.rst @@ -0,0 +1,2 @@ +Speed up calls to ``reversed()`` by using the :pep:`590` ``vectorcall`` +calling convention. Patch by Dong-hee Na. diff --git a/Objects/enumobject.c b/Objects/enumobject.c index 4a83bb45aa6678..9d8449bb30f2a3 100644 --- a/Objects/enumobject.c +++ b/Objects/enumobject.c @@ -314,6 +314,24 @@ reversed_new_impl(PyTypeObject *type, PyObject *seq) return (PyObject *)ro; } +static PyObject * +reversed_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + assert(PyType_Check(type)); + + if (!_PyArg_NoKwnames("reversed", kwnames)) { + return NULL; + } + + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("reversed", nargs, 1, 1)) { + return NULL; + } + + return reversed_new_impl((PyTypeObject *)type, args[0]); +} + static void reversed_dealloc(reversedobject *ro) { @@ -445,4 +463,5 @@ PyTypeObject PyReversed_Type = { PyType_GenericAlloc, /* tp_alloc */ reversed_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ + .tp_vectorcall = (vectorcallfunc)reversed_vectorcall, }; From 06eec3ab79c2d4d74e437189612158592ddb51cc Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sat, 3 Oct 2020 20:45:55 +0100 Subject: [PATCH 0198/1261] bpo-41840: Report module-level globals as both local and global in the symtable module (GH-22391) --- Lib/symtable.py | 19 ++++++++++++------- Lib/test/test_symtable.py | 18 ++++++++++++++++-- .../2020-09-23-23-17-59.bpo-41840.QRFr4L.rst | 3 +++ 3 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-23-23-17-59.bpo-41840.QRFr4L.rst diff --git a/Lib/symtable.py b/Lib/symtable.py index 9ff27ef74ffe83..98db1e2557d37f 100644 --- a/Lib/symtable.py +++ b/Lib/symtable.py @@ -39,7 +39,7 @@ def __call__(self, table, filename): _newSymbolTable = SymbolTableFactory() -class SymbolTable(object): +class SymbolTable: def __init__(self, raw_table, filename): self._table = raw_table @@ -52,7 +52,7 @@ def __repr__(self): else: kind = "%s " % self.__class__.__name__ - if self._table.name == "global": + if self._table.name == "top": return "<{0}SymbolTable for module {1}>".format(kind, self._filename) else: return "<{0}SymbolTable for {1} in {2}>".format(kind, @@ -124,7 +124,9 @@ def lookup(self, name): if sym is None: flags = self._table.symbols[name] namespaces = self.__check_children(name) - sym = self._symbols[name] = Symbol(name, flags, namespaces) + module_scope = (self._table.name == "top") + sym = self._symbols[name] = Symbol(name, flags, namespaces, + module_scope=module_scope) return sym def get_symbols(self): @@ -214,13 +216,14 @@ def get_methods(self): return self.__methods -class Symbol(object): +class Symbol: - def __init__(self, name, flags, namespaces=None): + def __init__(self, name, flags, namespaces=None, *, module_scope=False): self.__name = name self.__flags = flags self.__scope = (flags >> SCOPE_OFF) & SCOPE_MASK # like PyST_GetScope() self.__namespaces = namespaces or () + self.__module_scope = module_scope def __repr__(self): return "".format(self.__name) @@ -244,7 +247,8 @@ def is_parameter(self): def is_global(self): """Return *True* if the sysmbol is global. """ - return bool(self.__scope in (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT)) + return bool(self.__scope in (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT) + or (self.__module_scope and self.__flags & DEF_BOUND)) def is_nonlocal(self): """Return *True* if the symbol is nonlocal.""" @@ -258,7 +262,8 @@ def is_declared_global(self): def is_local(self): """Return *True* if the symbol is local. """ - return bool(self.__scope in (LOCAL, CELL)) + return bool(self.__scope in (LOCAL, CELL) + or (self.__module_scope and self.__flags & DEF_BOUND)) def is_annotated(self): """Return *True* if the symbol is annotated. diff --git a/Lib/test/test_symtable.py b/Lib/test/test_symtable.py index fa514917a1f021..a30e53496039be 100644 --- a/Lib/test/test_symtable.py +++ b/Lib/test/test_symtable.py @@ -11,6 +11,8 @@ glob = 42 some_var = 12 +some_non_assigned_global_var = 11 +some_assigned_global_var = 11 class Mine: instance_var = 24 @@ -19,6 +21,8 @@ def a_method(p1, p2): def spam(a, b, *var, **kw): global bar + global some_assigned_global_var + some_assigned_global_var = 12 bar = 47 some_var = 10 x = 23 @@ -88,14 +92,14 @@ def test_children(self): def test_lineno(self): self.assertEqual(self.top.get_lineno(), 0) - self.assertEqual(self.spam.get_lineno(), 12) + self.assertEqual(self.spam.get_lineno(), 14) def test_function_info(self): func = self.spam self.assertEqual(sorted(func.get_parameters()), ["a", "b", "kw", "var"]) expected = ['a', 'b', 'internal', 'kw', 'other_internal', 'some_var', 'var', 'x'] self.assertEqual(sorted(func.get_locals()), expected) - self.assertEqual(sorted(func.get_globals()), ["bar", "glob"]) + self.assertEqual(sorted(func.get_globals()), ["bar", "glob", "some_assigned_global_var"]) self.assertEqual(self.internal.get_frees(), ("x",)) def test_globals(self): @@ -106,6 +110,9 @@ def test_globals(self): self.assertFalse(self.internal.lookup("x").is_global()) self.assertFalse(self.Mine.lookup("instance_var").is_global()) self.assertTrue(self.spam.lookup("bar").is_global()) + # Module-scope globals are both global and local + self.assertTrue(self.top.lookup("some_non_assigned_global_var").is_global()) + self.assertTrue(self.top.lookup("some_assigned_global_var").is_global()) def test_nonlocal(self): self.assertFalse(self.spam.lookup("some_var").is_nonlocal()) @@ -116,6 +123,9 @@ def test_nonlocal(self): def test_local(self): self.assertTrue(self.spam.lookup("x").is_local()) self.assertFalse(self.spam.lookup("bar").is_local()) + # Module-scope globals are both global and local + self.assertTrue(self.top.lookup("some_non_assigned_global_var").is_local()) + self.assertTrue(self.top.lookup("some_assigned_global_var").is_local()) def test_free(self): self.assertTrue(self.internal.lookup("x").is_free()) @@ -234,6 +244,10 @@ def test_bytes(self): top = symtable.symtable(code, "?", "exec") self.assertIsNotNone(find_block(top, "\u017d")) + def test_symtable_repr(self): + self.assertEqual(str(self.top), "") + self.assertEqual(str(self.spam), "") + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-09-23-23-17-59.bpo-41840.QRFr4L.rst b/Misc/NEWS.d/next/Library/2020-09-23-23-17-59.bpo-41840.QRFr4L.rst new file mode 100644 index 00000000000000..e96942d8ebd07f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-23-23-17-59.bpo-41840.QRFr4L.rst @@ -0,0 +1,3 @@ +Fix a bug in the :mod:`symtable` module that was causing module-scope global +variables to not be reported as both local and global. Patch by Pablo +Galindo. From 07210f4b9dfa09fc0bd224fb74b61f9a8f5bc4fd Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Sat, 3 Oct 2020 19:10:59 -0300 Subject: [PATCH 0199/1261] [doc] Use list[int] instead of List[int] (etc.) in a few more places (GH-22524) This changes a few occurrences left behind by #22340. Automerge-Triggered-By: @gvanrossum --- Doc/library/dataclasses.rst | 4 ++-- Doc/library/typing.rst | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index 6e74af062d9e72..e706f7fcc566d8 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -188,7 +188,7 @@ Module-level decorators, classes, and functions @dataclass class C: - mylist: List[int] = field(default_factory=list) + mylist: list[int] = field(default_factory=list) c = C() c.mylist += [1, 2, 3] @@ -301,7 +301,7 @@ Module-level decorators, classes, and functions @dataclass class C: - mylist: List[Point] + mylist: list[Point] p = Point(10, 20) assert asdict(p) == {'x': 10, 'y': 20} diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index e2ae539d957e6d..f712dfea13f2c9 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -661,7 +661,7 @@ These can be used as types in annotations using ``[]``, each having a unique syn and should not be set on instances of that class. Usage:: class Starship: - stats: ClassVar[Dict[str, int]] = {} # class variable + stats: ClassVar[dict[str, int]] = {} # class variable damage: int = 10 # instance variable :data:`ClassVar` accepts only types and cannot be further subscribed. @@ -774,10 +774,10 @@ These can be used as types in annotations using ``[]``, each having a unique syn * ``Annotated`` can be used with nested and generic aliases:: T = TypeVar('T') - Vec = Annotated[List[Tuple[T, T]], MaxLen(10)] + Vec = Annotated[list[tuple[T, T]], MaxLen(10)] V = Vec[int] - V == Annotated[List[Tuple[int, int]], MaxLen(10)] + V == Annotated[list[tuple[int, int]], MaxLen(10)] .. versionadded:: 3.9 @@ -1540,7 +1540,7 @@ Functions and decorators def process(response: None) -> None: ... @overload - def process(response: int) -> Tuple[int, str]: + def process(response: int) -> tuple[int, str]: ... @overload def process(response: bytes) -> str: @@ -1679,8 +1679,8 @@ Introspection helpers .. class:: ForwardRef A class used for internal typing representation of string forward references. - For example, ``List["SomeClass"]`` is implicitly transformed into - ``List[ForwardRef("SomeClass")]``. This class should not be instantiated by + For example, ``list["SomeClass"]`` is implicitly transformed into + ``list[ForwardRef("SomeClass")]``. This class should not be instantiated by a user, but may be used by introspection tools. Constant From 41f72dc24a9a0f439be1e2fa8ab919235032a5a2 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Sun, 4 Oct 2020 03:46:44 +0300 Subject: [PATCH 0200/1261] bpo-41887: omit leading spaces/tabs on ast.literal_eval (#22469) Also document that eval() does this (the same way). --- Doc/library/ast.rst | 5 ++++- Doc/library/functions.rst | 3 +++ Lib/ast.py | 2 +- Lib/test/test_ast.py | 6 ++++++ .../next/Library/2020-09-30-23-49-42.bpo-41887.-ee2S-.rst | 2 ++ 5 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-30-23-49-42.bpo-41887.-ee2S-.rst diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 755c60fba64115..62138efcce9110 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -1586,6 +1586,9 @@ and classes for traversing abstract syntax trees: .. versionchanged:: 3.9 Now supports creating empty sets with ``'set()'``. + .. versionchanged:: 3.10 + For string inputs, leading spaces and tabs are now stripped. + .. function:: get_docstring(node, clean=True) @@ -1820,4 +1823,4 @@ to stdout. Otherwise, the content is read from stdin. `Parso `_ is a Python parser that supports error recovery and round-trip parsing for different Python versions (in multiple Python versions). Parso is also able to list multiple syntax errors - in your python file. \ No newline at end of file + in your python file. diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index c49bb0c9de70ca..263c52a63dea84 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -506,6 +506,9 @@ are always available. They are listed here in alphabetical order. returns the current global and local dictionary, respectively, which may be useful to pass around for use by :func:`eval` or :func:`exec`. + If the given source is a string, then leading and trailing spaces and tabs + are stripped. + See :func:`ast.literal_eval` for a function that can safely evaluate strings with expressions containing only literals. diff --git a/Lib/ast.py b/Lib/ast.py index d860917f4d03ae..d8bd3373701dec 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -59,7 +59,7 @@ def literal_eval(node_or_string): sets, booleans, and None. """ if isinstance(node_or_string, str): - node_or_string = parse(node_or_string, mode='eval') + node_or_string = parse(node_or_string.lstrip(" \t"), mode='eval') if isinstance(node_or_string, Expression): node_or_string = node_or_string.body def _raise_malformed_node(node): diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 5f57ce8724482a..be4b0f78ce9053 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -1005,6 +1005,12 @@ def test_literal_eval_malformed_dict_nodes(self): malformed = ast.Dict(keys=[ast.Constant(1)], values=[ast.Constant(2), ast.Constant(3)]) self.assertRaises(ValueError, ast.literal_eval, malformed) + def test_literal_eval_trailing_ws(self): + self.assertEqual(ast.literal_eval(" -1"), -1) + self.assertEqual(ast.literal_eval("\t\t-1"), -1) + self.assertEqual(ast.literal_eval(" \t -1"), -1) + self.assertRaises(IndentationError, ast.literal_eval, "\n -1") + def test_bad_integer(self): # issue13436: Bad error message with invalid numeric values body = [ast.ImportFrom(module='time', diff --git a/Misc/NEWS.d/next/Library/2020-09-30-23-49-42.bpo-41887.-ee2S-.rst b/Misc/NEWS.d/next/Library/2020-09-30-23-49-42.bpo-41887.-ee2S-.rst new file mode 100644 index 00000000000000..2a43ab3f2890c7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-30-23-49-42.bpo-41887.-ee2S-.rst @@ -0,0 +1,2 @@ +Strip leading spaces and tabs on :func:`ast.literal_eval`. Also document +stripping of spaces and tabs for :func:`eval`. From a4145e97f00b1c23bf20064fecc9aa1c326ee62f Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Sun, 4 Oct 2020 14:16:04 +0100 Subject: [PATCH 0201/1261] bpo-41898: add caveat on root logger seeing all messages in assertLogs doc (GH-22526) --- Doc/library/unittest.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index a52df9ee01578c..f04ec91270eebe 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -1091,7 +1091,8 @@ Test cases If given, *logger* should be a :class:`logging.Logger` object or a :class:`str` giving the name of a logger. The default is the root - logger, which will catch all messages. + logger, which will catch all messages that were not blocked by a + non-propagating descendent logger. If given, *level* should be either a numeric logging level or its string equivalent (for example either ``"ERROR"`` or From 8c3f2855bffdc95950fa5a131066b6e9392a2d8a Mon Sep 17 00:00:00 2001 From: Hansraj Das Date: Sun, 4 Oct 2020 21:39:26 +0530 Subject: [PATCH 0202/1261] Delete extra 'the' from `Formatter` class docstring (GH-22530) --- Lib/logging/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index d8a88db378436b..787cb4eefa1061 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -523,7 +523,7 @@ class Formatter(object): responsible for converting a LogRecord to (usually) a string which can be interpreted by either a human or an external system. The base Formatter allows a formatting string to be specified. If none is supplied, the - the style-dependent default value, "%(message)s", "{message}", or + style-dependent default value, "%(message)s", "{message}", or "${message}", is used. The Formatter can be initialized with a format string which makes use of From 175101d1e59417849b1bc7a735dbcd74047a6134 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 4 Oct 2020 17:45:31 +0100 Subject: [PATCH 0203/1261] bpo-41490: Bump vendored pip to version 20.2.3 (#22527) --- Lib/ensurepip/__init__.py | 31 ++++++++---------- ...ny.whl => pip-20.2.3-py2.py3-none-any.whl} | Bin 1490666 -> 1503696 bytes 2 files changed, 14 insertions(+), 17 deletions(-) rename Lib/ensurepip/_bundled/{pip-20.1.1-py2.py3-none-any.whl => pip-20.2.3-py2.py3-none-any.whl} (54%) diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 21320a83198cab..cb2882e3360fcf 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -3,6 +3,7 @@ import sys import runpy import tempfile +import subprocess from importlib import resources from . import _bundled @@ -14,7 +15,7 @@ _SETUPTOOLS_VERSION = "47.1.0" -_PIP_VERSION = "20.1.1" +_PIP_VERSION = "20.2.3" _PROJECTS = [ ("setuptools", _SETUPTOOLS_VERSION, "py3"), @@ -23,22 +24,18 @@ def _run_pip(args, additional_paths=None): - # Add our bundled software to the sys.path so we can import it - if additional_paths is not None: - sys.path = additional_paths + sys.path - - # Invoke pip as if it's the main module, and catch the exit. - backup_argv = sys.argv[:] - sys.argv[1:] = args - try: - # run_module() alters sys.modules and sys.argv, but restores them at exit - runpy.run_module("pip", run_name="__main__", alter_sys=True) - except SystemExit as exc: - return exc.code - finally: - sys.argv[:] = backup_argv - - raise SystemError("pip did not exit, this should never happen") + # Run the bootstraping in a subprocess to avoid leaking any state that happens + # after pip has executed. Particulary, this avoids the case when pip holds onto + # the files in *additional_paths*, preventing us to remove them at the end of the + # invocation. + code = f""" +import runpy +import sys +sys.path = {additional_paths or []} + sys.path +sys.argv[1:] = {args} +runpy.run_module("pip", run_name="__main__", alter_sys=True) +""" + return subprocess.run([sys.executable, "-c", code], check=True).returncode def version(): diff --git a/Lib/ensurepip/_bundled/pip-20.1.1-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/pip-20.2.3-py2.py3-none-any.whl similarity index 54% rename from Lib/ensurepip/_bundled/pip-20.1.1-py2.py3-none-any.whl rename to Lib/ensurepip/_bundled/pip-20.2.3-py2.py3-none-any.whl index ea1d0f7c8604a4cad61409c8ec927d5cac5e5c0e..7ebdc0f31d4e3ec28cab71df496213e7be7711bf 100644 GIT binary patch delta 715671 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

XMADPR^h_0VHu=>d2Ev<- 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

_=dlknIqQ3JrW3=C2bZBVm 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 z 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

1vwy=r?%T={uu=oImx7&T3`l%}He*n7 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൤ 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 z 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

k2$^d0J3 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

U&%D-pr-3_ zD0LFh$vEo(9v_Yb1)FBIryLk#xE;hA(!$G{E`B`i+&N2cGv>2qm#GYAJR1yN-Ix*Z zy$@mU)ec3#w%vbP=^j{dv{tm`HedZv>I|Db?_Xas{`yd>({!>S+5ng1=*uTAkvtOj z&7iJ*x2wz`*UoMCbG(kSme26G(o!lJI)D40Jo2uE#@yB~WjM?oMNTFA7#o=ht~5GX z$0CwSuFm_eDC4S1_hib(;oqy2&Yl)0&0<59W%Kz)Fh0#bN9d2Xv>j#JnJLS2U z&w}=u!p@Oq(;nikx&6%AN^eo9dhv2fr6DQxd}q>p<<&NgHBq{LuV}x3S6~^7_2)Xs z93!p&&^YWZq!Yc+SK(SX@&pjx>H-qW2NYy;2M()`_24Xb#L{EQg=tV1lD7539V6Y`|a1=+hO@1jxrZ;%}Z zS(bjzkSjlF`heE?;n+}LDfyRVeAf|_#)qAa_C|!5RqpU{VoNLy^Uhi~;1>|NHr8o8>{p;)7O|nH5Ot`#AgD z4yq&9-_pd~{U=Cg!_C!{a!^!`kDSs&dfgCNtJl%Czpyt~H{z5kn;=*h3%>c>IW z)`}C;Dq+ZSV#TVDo_^QE{_?{W_4^wZnOE%9G*T*Dq(Q+xF&>iQzwM%-pltTYpDL(% z0;CSX?mwo8Q3PI0epDwVoIV@6g)Ob>%xl@M^4bok;uZLr)G?PF5JkT-&IbR9o!KFI zO{qEGoSp;AZTDcCyw9uH(;Y8=v3D` zAJTVfhP%R$FQu8J`a5vNzpw+_s#*Sc)N z)xEr9-=VmEV2Rj511UId8ICZ>!;V@%vL8^C>gb zXhzcg_YxdpBU-3*F3W$ccga#mexoCYQAMR;DFlWYWG%jm2`e}ytoGmcXQB?RMPZsz z<#VicOZQ-Mlt!J#2`gE}tiANNaB`xBy;ZvpYCg`oAit~lUzS;w_UaNM&5PxP5`?A? z-d}QpsIte9UmVEt64??1>1ge0KHVP%hoN>UpA!&d25D8etiOIaX{?5WFtiZ!$p>IZ z{{GSh*kKP{7XUldEq@Sv7Rpy&JJx-er*IL;Hg_IUy3dL3(@ci%Rb~Q1ra952TUR?T zkD}gOv6o#g4S?Z?bQs1&Je#Rz4T|?F$9E~dg300iauT3D*6A)oPx5Vs{+TY?YBT(& z!B(Ywf7ZSpBGu?WJp69}&c9?Npn;}MgyOSi^nw2DN@$LywwS&!W)g>VvgqV}Mylk` zqt)Q3OvQ{;cEI)h|&7P_$rhI3s)Mhdnr#XUk!8;5-Ag!x)@QF{t@_%s=HX0UbpD zfy*KA=I@9sLEz&=V{=P&+|fIQmdhD<_5)XS%8i@~Txx*+M$94rmzQk+Oe=^N{G1T` zw@>KYnFS5{FTgCr$|bffTN}1=1e4xz(vNBKI!<>#4x6!s{C29o5DoO%H;@}MjAmEq zwNI6m=L=R*=~?1_uZrR|5-S~~^4BLa`+9~Vu&5f4XrS4ABj`BUzEZ3^O{oYc%1b`d zX4{9)F~aBk?d3WT77GsA)GJH8;2DG70qxFNv|OA8BGnEa&QD27lulf8$V5)yf_v~| zZJC|UVa8kNlfQjiNB4X|cZ<4e$|Xt08Odeo-mg3JM|bPZ*C1h=!@HbTrwk}9vrO3W z6(Y~Lw`%8>(<*DIraVJwV>K_-g0~?6kS6yJ0847=pQn?E`kP42Rf+Ym#oc$-(&?JlN2te|Ijd~c}?8q9V|Zz6zT zQ`j<15Nzp{EdB-mV(#Ro zQxAFUKREWEy4pW=9gJlT?>-ht?$x+Zrfx{3l~AT;NaY)$!5_36x*y5MSn|8%2{lbV zfWR1!-1M9eC@7%F$xWx|x;UY9e6OS3KZv5;cQC>~7s!jaN(Xu0s=%lUq>J}I9pny6 zU2T!ZKWlU;1i>+jY6QtakZwRW-XI8KHgp4ur`=VFm8`-8nvDnmF{v@o2!;(Y2Ow5P zJ_jPof=*!a!tuSgUb2=+253_T2-w+&Y41BkgWZ>dk^xFPDB++KgOUPDGbnMORD+@q zf_Lip=M2GP>>s)s{tlIJ9d+~Wt6W#Vy@Dq1*gkYoU7D=Vc!<%Lv}Lf)aB_Z7Zj2r- z(K=e^Ez@aldHer@ma!7}*)sXkTRB?GX?NawW?pAVM3LXTBec3>6*4W0su)feQh7GX zvNTU?7GRk~`!c#|r-PPal^G3J7eWsgicLdXe{KF0vqE~=+Cc|@>~C_EJ`IH~W3e3! z-Or9vusih8moThedx8auMrq;A>zY5DhcF>`O?;fjq`iAYy?IS~Xvk*8fq$}2Sb8yH zt_O&uSkSoGdLu16$pQP>m*{)^$*CXV_x{B$cvOvE*5d)p@3Nz++EK59piBxGZJOPK z-3Z#l6$vL}sw)Esgg8CQKnS#P=rym}^srJnn8_D7vg8+*@vxJvv7VS$4Z+%BX;?Lvo z*LwJZILjq4!t(DVv!z<`ymKGe*^vFbUE667QG7Jm1c|$#@#pDly%?)>SHJZ4#Jhi$ z(a!hHpb_>^QBBK-yuZ3hP3K~_G@1WEL|%HH7QC2T>*{aa-+`JeO*Iu2GqYcx;>p%a zJE(LdTqEj#d;{*@OWr--*BT4*x&g;^0Z()*xdscyF{KI})^w5IEjS$adRE9Rrq=NL zTPv~&*PXjTpGV*tdvcZNgNx(N(_@&?6C|E?aUqAdH)%vsLCQ9BWvKf)rMgdKced5j zg|Jv}w|^1Iai`hLyrn6ZXqRS)`?TXmK5ZxM2{|o2m9q^xXm}u%3>|+9q5U1HH$yAj@RVAkjk^H5 zNht-A<+z7b$d}Q`0d_#ntA~E^YW+Rv2f}f<@R+mw)nSp6d&@MHn&|I2U+VoO37ibw z*ye1Z-&h>MXNIS0#Nh@`rU~qa(P@aZD`YV`F$EZ06Cx|`6gTvMow~_|Bif2n_WAQs zzh3F5ZO?UQ2d|-{ekNSjpodR$8%YA8$<}7v|aex?0E?-LFOY0JZs%i3ON->8uP^1o~IguW2+yAdMvwq{7)K*JnR5 zl0?BVo!A)yH=dmrCZG-3nxvpXUTTI6NQG|J?9q~YLXSi!Ha($rzlIMx#@~w&grspp z5?F-#$^r|=i3BvDn=xZvj1_3BA_ZDhDCmZ)OrmRtXr5V|yg42-{BeMhP(S?0_qV!- z(3m5n=YRZ`Gg2fQ*i&jc(t)#VD~`nI)_g??kRkbcqF#*f4S7=yyBvJJ^lvXt!ywzB zo#`2Au-A5Z2#>i@oMkq39J{phGude?e4A6YvB`Gup2H}KF33TG!{TrsX<2)fCwzSS zJ~WFJ`z4!ry*$VL+01bq2e;4prwd*U2glsX`J5QZS>v$|&-&Uy@KnTiZ{!^A&v^JoQz2- zjN#!O+Vb!jk}C{x_eam>=!2JLeAMt8MGKpw|pHrKVz0o~Th4$)UCHBh_Qt%fh7 zdq6~E>0wz(+fa>h`sIhv=JXHDJpUu^!7)m9?Set;ixXW-n=u$9r_swv^xV>>URMqa zvn(X-(!fg^-=IHRAZmgZN0n7NTKML7b3ezC?>4x@$VR{SU77Ny(~%S9X_L+RhELBg z@51D`UG<6y7f5rh$oNA4G|^T+Dd^o+H`d)e4;G#4#dH%8Z4viZYDTYTm44##qkgW{gE|~%c7@VK_GVyLT9##9t-kX3FV)sG zh?f?(S{cPXK+4_ysV3fA8~CV~`4IIj*l`Lq^7%|f8}u9jwZnb^L#hdJq_nbyhXx(>~biT0^MsC2p}mi z4MmwzI8Qf+kOaYL_{V~3GmLi;Czz2a!SiL76}v79=z6ZoJgnC9*lW%&-ny$IN; zrOv(SVs!V0A}!x}Xve=yH_THLOjMl>290sb@tt%WL(_Tq*>Z}EQj~hZQXvwUI8tdM zSDTl&4I}s&@q1s2TC?m2fa%hoSj3KMhAgM3V3>)jZX$HTa=^{JD4y}B8UrW#jBOnI z-9WUdZ0?|-uD2@vmQxYW=khJ$SXEo=@H= z9U;Xl)v1w#Dw~Enns=62g4T(Q=k4_G3OuvZ3Z#w}@9 z=jh_8Y|V`@%Sj=&X&Fi0y$m7)xA^B*8{cO{xTOX6;=(_>F9*6$K8Z_DW&EY|P#a7M zG?wpsv@lFsh21-aK$bWLukW!OgOv1mXGK9+aaslewVNK^M20gL{CWH7kkRzhKC(Al@(@#C z5*GeA7Y>McU7Np4%;7R!Fgo|Le8l()pG-KtB8w&v=Snx9Wb(h7HpQ?r%E3e|9KTW9iuDpMJ)twT=d zvXhdAHF_}=@UyCw;^#Eig`qVrV@XtQM(~B}?smMD$6w}>&4^BlqrDQViBX>6MXfJM zQbJ7Z!}=ao%m+1O-No$1YS?VdIDPX4ZX0*rhL$y^zyqWaZxd+NYVco`+$ccI;Xj9(D>3%_* z-J-v?G_5FWs+(EZJ|6FrSh%WsxMZO}!p|w=KqFwFNep z+{b09e>y`(Zm7<@hF(7#fSY93b)(&8HJxApaw!Gb9Qw1Q`H+B*wEHuj30dc)y-Tx! zh%L(uu@1T@_`1W*R#Het_;_lre+6~oUbWkG+O0!|Kyvlz3&EMzi9dP_b{Lxjr zP*3 z21>I`ujaXqhXX!den%%WUq(&@puv$7l-re~DV)0C`zD`stRMe?{X2Ba(xhBpC zw;vx{hcbNgeLzyY@fuACnOWRr&ds9inr^xKtGFoYvZWdJtNK5=sFX8Y3h!sW$R~Y; ziIg6iUwv0Ve*AvapnkV~=_C5d~LVNKm>@~VX+U%qPpLcGn)su0M3lGPlNt)_0=I6x)Egbtt8H=8-3;e%l52yHYK=&c2Zbku#{2nm!5u9P2};I) zku>S1*?=V1?u>&GzZrxxtWDqydo$=BDcaSASe^tq!m1hEd4lLbe{GrRf&Xn74%(GG zCnf3b!HJncJo$(hLZkNY!xI)`m$?VQWlIMgD>pBLM_yxE+%IA~;U+dUA%PcAT3Dba zkXu+_A_z{x!8T81iMf3cHxxY>^MNPkzme8^sq&ixeTqFTKe-tRT7Pm|6Fj}V#}~<3 zv=-YROMYt3m_U9?d!)_df$JK}0N#bed+JXK3b^8w@w}i55Kq-#f|HC`rC!&_u6R@` z3bj@>#?yqgs<$b+J$YVng!*ugcGRD{wkbn0svI)k7Ehf&z36&BvV0k$Z}bxsnxpX= zrheC`I=>Y;t4f6I6kQE1E)AHyw-nYXl1DaNx$B8aFwXZw( zTSojjc-@{f2s@pqd>Qd4bqH&XBgOVJ8A~@i20vhb+tA|ku1wNTQ@$o+Z`WD;OrBdG zLo#fl7AGp8c47_1&m?$cnJG55wOY>l*n&+*C5`Wcw=stm(DrG3|CBGP$ZBVVIeRY9 zaFs5$%nVrcrD}HAzL;(l+Z+(o>?Xw?x-oB@1EhN`i> zDO^+;kW5m!C8|`-hND1I=zntm$w=`1-k=($q_FglVI0e$4qC^cWp0nYr=(y*5bxfgCLLSw!2{Wqp3;#(NMZ78Y`7ae z<&n4WKlaq1zTF72uRL}wZOoxgIm1A7rcGE^&wRZqd4*J;sUP}yS{bM8Hbt6jdPI(= zqRShnFpt>zab-OxFC9D}h$O91cVdPq(H=D@!je5=KF|9J?3<_ii)ojke&Ez*&*bO7 zFo*O+1RQt|M85VeFGalHKQVXOk+I(#c{vffpEdgKQxf#*Qdzb6%CThFlzt&z?el&~ zUR9t!ucgOV50#M_Blq(%7Rt^fOKr!{P9e=Qlm6vlqB*Tp|JL=KWvw!kX~La_l?+w^ z=Oh*Zb?d56!^*s@YPyNqwazn>duYk>%I8^WFZR5ytegtF?G+4`7=qWk6i?|dqUk|T z$8}2c;0}uBE!>V4DQG(4W8?j1uci_tZgXg;H2*okd5PS;NQ|m0O0c781h1y3fWr;B zVkqtAu{)CamBj=L5k`D?0;8X^VQFhhB8PHm28R z`osL|iUcd3WZG{Itd{R#`*GRuUim#u`MRf=NO1>!q459h6^7CNEnT6EPEp0Im(zDh zzici@-i_T#bWEa^{?ofpbSJ)q`e`;~7d&y}{6FkjJ{)A*|CrIrQnsm3Wh9;yoEkaP z-u^-$>(#(8I(=8AuV=VbuQOx2$~v_s&~V!CcgoZS%Y&_U5cNq_xq5(gIwjj`>{hn3 zw@$^-MZw7tcg?r1X1Y8Yuj*K%!xJ*TmnDX1>29qbL)&lLM(Au_*3W52e6yVqQEj4A zcwN8l?@6FBhQ4DSezWyri#8%4!*-Z-hoaPI14hO$CNR6;{GtBodX|?S?DBGHr+Mo# zM$YK1@2q5sKU0X++U;Up;ggI|a`lxXlZzjJA!26%=g)tfOsf67LtXuT`@l8@d02@p zvj0-cX{OFz%wYyKJ=u*^mD^1IL8zJf;o)HG+c`G9xh^Nyq$iC+sS!F2fAw zAkHSc=_PoXkJypc=)sE=`>w}tUX-QJokCSJ9mejJ+o>zpBuL!#ml7=K+Ma*wgSg?B z)r29emqM69x_9M4xk+GQsO?rbre*81&N<)9cLP!KC1rnqab0!f*8a_H0I1W4)lfqx%f6c5zq( z%RLn_GHd#jg)cQRXe$+xUQy-aA&Ym3R)r+kGGyLXgzRzAQ2fr(4O)Bp0lC{v7lTBU zxrh8Mb0C)GtV7R&uZ42zv6eKG9>yvp+4O-$P~h7PR9UR8s6z zZaGr{pNW>njNMG)rY{PaN__v#YkKWF;Uf<(OM*xO(jx~yc2aBsj=J}D&Wpd4(-w<3 zD%|~22&3ItEwMB&gm+pGG2lBnEa+jk<3z}x|8Nl^Z`?g045>N=rwjECoNNeZwELzo z(R4XS3(xoS2^+fStppo-=LQ%6G2T`ag^2tDS3u~r88e9M)C-B5Enh*ZL^~nqo8)KA zAnZyO^f9-5>glnzAZ|ftW^|9HQflv14wO8`W+L#;LP@ZQ5Yhw-2u+BPNp8b2rBANb z2$B6G9>NEDZvUKs<%P*?;Qi;nYr%@bVqhRzUtlo^PJsW7G+?+8jIxxi^xq0<%VnEAuxlXd=wg)QB+;`&J!g zWl>|Y5}N^R>SW1%k=q2~3k)A9{XaIo&8S)@vy%HOWZ?Jkpw!EO8vF(dRx1Oi+XdqP zTV?ZO`N+ouf6F22hPc0#2%-*}c1yROnk>xvt;;FE&|EOG4G$Z2Y?j6R+sjT`)G=LF z%ygd#p}dm&{AK7;E33Crc+*E>CFp@;V2&Mc_fV`1!Gc`M-9x_aP+RSsKOC|dS0m0e z6AMf-aRe%FpPYesUP<*On0+h11oLj?ml3oOps5Hp1VIXD_YWFCsQ{B^vS41XDB`Lu z7yW9#vj9Qz0hwWq+8qowe#%=a`)X6_#1E0*=ZKSf@hi6)ku+aCN;Dk#WOt#{D*DJF zhPJ61F_S0mxUH{zlY8RAM>1Y}od-hTg1A?LyTN&rT`^Ep?qpXpQ7wj(c0Xf_Hh#u8 zD!G?Ib=Uz5){kC;b&OY4v}HPuFfc6_wp66t_`RuA%dy3=Oo!YFyqk+}7C@@aAf0f^ zasS{wcnejAU&hts_G(dAgKF~vvKNc_qxTz9L(>Y6@q9CmP4bvgCv_ti1gC;osh>Bd zfdvFQ&}TT{>(Z!n?wf^;x_5itPc`OSsUEohy=O1rXq%_j+V@9hK9(Xjd(rfBT>G8q zn)S2XeT;W@Mdy~=1T>%bqy&aj>3{|6NC}sKFX_1eI8~GN&xhV#P0mK#+j0MEk62b< z@b&GL7F#-)x0K`CSIJ@+2}(QGdlbpS4NcwJ)AIbaYJ=W^3joyvVuJ0k?McYVV*=I% zScQK9>j&(=aBBl0i$27+7;SpcEOzMZ&6Rp;F0WYb#rU`yORczydPa42;ZoY3=3|;<|pi&WZ+o;Qj{0*vX#9}jrDigVC6egXgbIt!8R5!-bWdC)j zOx3^gU3*K2*}UW(iBf&pY(E~@|M6DJaYX;v7t$c-(`{dUGClD2Q`IF}Gc)GQpF7WU zqnhdSI~)PWP^b|{Q(ZkSi~6)?WZUye^1=%R*o$Q`v6b`Pity&fn-9c&YTHaCbZQqO z&!+aw7XGfyrMQ2NDVRIHW$Vy+;+Jrb7wO|VM?A(iioXw>msT8`k2o(6oBRr2OtVKN zD!Xas%SNR$*k{|H5<3?zmUZx_eVOKjf~0CWmRn4gz0{x?>6Qdj>aOcgubinrKCw8e z!lv6Y+SG&>7~!+bEnYDs6sdISlN-f$_btM&^D(tr*|n-_XjFy<*Ek#p6Ir#6hjpTc zW)fVj6<$n+jwY+9j9nZXY@QS~-nQF40v>h-X^%1sn{Ml-wfM;wTdeS@EPV=$Hht23wK!KofjF)(?rA(v04dXoz^6sMLj@WTP z3ij@z0gNGnp#zK`U;?NCbBSy&N&;OHMEo>bR-hhmbCC#qJpSnc0>wpuqOt(|$&CQ% zXi@=6g5K}VNyUJ-(dzwH^6k#L3ldLuG!p{MrbmEL2+$765fXTN2K6aI5*5EK)K?nu zo0cZ!kZMd@yk>ElrBp%#k zC%g!s8uxbyndqO4kB~DEG7KSiarOt5X5ZZDTwc52xsnYHNDbOClcUiT=e?u|$qcLe z{{^A{i>gQj6SkEHo;umkK6N(#`xz-wJLd8u9eaI+wxYr5uX07PoLh3Qyf~uYpI)4Z zI2ZeJ+AvU){vKQ#9c?aebLdliYEvB28V72hMuA%e^&;TY$0ie=Z_P}eRj?)_;#L#O zJuS8R`a z=W1o{W59UfGdzNmXH@`KcDs=A;;3_HQAp<68XWk*KLkA8wW#x!pbAQq-S5_{bsPQF zMK<4U$dGUi{?g*ej*ZwHThZ0aM}BohDdIw~f~@kqEjOYU%DS9doQd5@JR)rl8;Vaq zNFN#1ca#|zIuY*S$|ra(+-guIMQ<(*E?kgr2};O=oA?V?&7o2B%}PW8cNy&#?Vo2j zIYOyLgU*jVB%(uz)l;%_7Uor`aXiSc(fjk9EF=PjryVJ%@rpUg(J=Z;hX-hoT=qrl zTv8=7+g?)8An=FC>(f>n%z?rl3&Qf$YH-2WM-kd7F^~Si^#5Qv1l&7=l`Xgun4&O^ zPkmn{#daE>4pr}k_mw+ZO2RZgGgS5HasMf2pp@tdK48QF^8^ntG=S-2m=@MR6Qn|D zU;sIXz*eEy#qvF+g0)Zkj$zo={@{LIYz5W+;9+It2$HAC4CZiSf@XUR_@vV>FRx1u zt=7ScrpEeE`gIfrd^#%|46ESs4f;DK5O7onyup^?(V_|l^E;{!`N$8e7Fr7B;+=aARRbJtc5IsVCVREG8W*j+ zIJCy>QNe=c|>77Lt)=$)$7=|5FM%x^HkieTJR(lp?mH=cj$)Ic@z|uP-SX+ zaqd1x3ty~hI(JLBZcTU*?>YB!Zrz@IErL4bH+uE!5H#`0fK{BW6#;UgCq6h5b)x5< z%9HSVNGMKJA$vZ6S^eemujv7yX6*?2<{&KseByU-o;dIV!`CiWT!9!t*XYmjm(?ND zuy6N~!qKVdCuqDQB*DrvBsb(ZJbmgGNz=%0nn-NOarna0KZFAAVv^qV{Mb zH=$?a^l0LZ^C6@DG@=I`$$ZtxJGH{%s~3D#4(c^j*2YYUa%%bi+&d7 zrH`T0j;wv^0NxNys^tzQ)jHK;gt1{O4}>eO8qB5~Rjb9)rrdg`qk zjp3v@8>_ z^RM%(V^0A;bH(hrghCyQnTUeOO-=GI%}tHx4vrG`B-DB zEA}_oo_)H6{SV6C0w}IvTNlRNB@FKF!QI{6HMj@&39bQxySqyQ2|hq@32wm&ZVB%H z&N=7achCLrdsVk;s{32t`c_YOt*+fuy}PF0{TbHtuKH=h)p?7JIhN@3x-ZAO0bEcd zAnSd&Be#B0-C^T~$02cn5W*O027e4TFQ({WZ@PR$ z1NTVskyH7`iAQZZ!-#~|!0jQ`W9w7+M)l%AynuOdjswgCGGHE@77&;Ozj z0BuB>m)1Bba;05hLvOTs)3)s)Muv-rOy-PF5r=Coo(jg#XJVcGw@rYG&%~T->Qa$Eo?nLI%*rayiyzgX%nv5 zdqGJ2H}8Yhv)5Ja!tXEy&d~g=+hA1BSFut_h1ws~OsRt?BIS|>wLfr~xa0Bt6(i!^ zOz6Fblz=B4(-EBB>mo)^Yh5Tx@0Wg8DtHGE#8s!SbFX72R1qsn;Jixb_Z==^dN!+{ z<$_IY#-#6aj^-v;kA@w^y;cm1@K92`NQ( zf>q_!TFkI!5(i)9<;C#8BKi!OXCsLOCr@9=tHBCwr$dKex>EAe*NCLx@E1KvfB)Cm zr2NGVtQp*g4WvT@@ROsY|IrJb^yWnN2F^^>g-`eu<&y|y5Ynr-Jb9nkUupySQ0k6e z^5O0YkuoUoB_&Bz6lhbEJCeXQdhlWaZ5m{nMM>2E_*VLzuR)|8n(OEjE@jL%LnpNq zNd$pabjgJ`+Iu|HkCX|00h|LGzKoIlDEsT!a$B21+hB&=Ksl0#lJn>iw;R&;co;p@ z34Mn?0~-7<34m$?P(cZAGvs~%MAR362!RX`K>!h>FCaol1Vo#Fh~lp(91!*Yi79c@ z6@8DFFiM}$r*IF57z+4NlA+(@UBPTKM8gkgBtb`)6hdRkNkCB~fcuUBuM&8hq4qJR zr11cVi3NzUAb_|Ah#vsK^j8rG5a$5#6(C0Q0fj$69LAJPBBiYHG%O*<`C8J~ZpP#_ z2GV=?t>i5sqxt~E3P4x^#8KE1@)!m{@I~h}4pVsd0oM&7k0D#qgKH_H^W0>~ns5__ zslEG<{RUL|DH4~E_jj;`wtPDqP6iZ8Gd8f6?tjZ;gC?h_VfugjNt^SFBqE_j?Q77Z z+U{e2+&U00=FH8N00{mv6aaX|1{iVx>|0q<{2K0RFN*1Eq+TbQD`w{7FNm z+%MYvj#X|88TRYgR2lB;*ti+_>)7NOrR&&O+KOAAuw`!TA)5Sa;*7a2g?Orb>L?Y& z3=y--VFK-rimQOzxjkftcTL9tEArm^Yxmno&09%=%n_CHNnvAv9NhWVK?#V?*!nye<(+DaKr z|D%}&c*_AV^6aG?_n_`_>X{qPE8_GUxopV3-#!d zZ<(y6)$kszeAU&G)IrZ9rnbvyPD@B=*4kWcqli#EY zPgRd8Vm9r+n6h}2=FOEom_MHNV+!lFsVbS%kdByWL)#UdFEie6VH0PVZDA9^^JxNe zAme2H-yoPz7hstqWPTHs{rd1Qyxr}Z_QRQ=5wjJ~T%~8Xx zAr@^{4AIsEg9{&t+d3{o2$qfmgg|%Y}CZmv%!_*3@US&sdPt(pC|KWJCgis~@c{HF>2Z}z{N%7CfGR5O)2 zdc*|;|F6sKrW$glw0TUR6H$uR*HS=R|8nF1kN%9O9c+q>*BxvY zFm@VGrs9#Sw5OP^WbLhD^tCB+(>gQdLICZ6e?z$bc^cMn*NVeYm!?6N9#hRN(E2w` zgP?kC-2&#c`ThT`83Du=Y3rIXq|Flmu@Rc!|7QQc%rYRj3J3;9ngIm=ugo+cwhV}6 zOqx@_W@FBvDb?%0$Qzdgud1V4$ozc|_tA@=^cA zZ+M9y645`f*CBUzOyRxk4|myxqIl#RSaU<$J4T@o=7E87>f|32&ykNxe*cD*2iS52QU#-aob!=N@fnE9X*SA1gDAe>^`b~ zmZdi=!L6GXc~{a>Ic+d^z~bQfhDR`tC{LztvRHShX5Ij954R2Bt6Hvkoob^ly?zaD z?L6|r5uBq}=$B0Mz@es6_B(ZDGmc_lFw)pTV2{S)=xza!iu49aE?u#!XcF`o#F6S@ z&zu)K$ipoM@GbrIJpn$9NZe^Y#G#mjoUmWgR}&DAzcN8=Igg9<=n{cUrGaUZpS0U{ z7&kcYxe>uJ{Mlg;X_5(u#kK^6npImy*vJ4HR7Olc8gGhUqhhOTaY^zp3wRVaOU93? zg+a~pO_^YvW}ZydWU;obMs*9ryg}*_i=x+mp@*0OZq!}|V;z@XpGc|Ee6YGlT5~^Z z5~93sUhcs$E0B3eGR}c`pJ4iyB%aBJpI>L(t+6_DYf}fvM=g*Kqwi=_p30C009t%U zLmY}#Bg9C@=OPhiw&Bmz1(H_>B+m#Cw*iXx-?YQ?rV#|b3x$h+K zDX{`5Y-xn_xo3osN=t+fTHh@YYGTRJI+ArnVZsQF8&LW z;l`gKvEk1WI5Cy8-)RF`s0Om24NR$O%ZE_C?^hFEy}fk+H2Ho7-xGU?8VP7gn9JGq zb(PI7fWu4XhMYmDRd%~T7v&&%KyO5V-hhGLAmDr8kudEs=xdK_TvUR`Dbx>KFrAoe zpzgFu_9U6w1^9K!gS@mA^JK~=Y7GiXdq?x^n(*&m# z^X$r0KWow(R^iso0d$hC;53uSB~)0PN8^lu{vk=NCx)&dB6D6?+9U+UBk5dUA+iKj z7EO*I9+bca;v_NQ09*36n{%rcqRL*89)2hSDj9e#j!3{3{6KjCe9d~T1{F!usRc?gVh)_O3e>5Opthzg-_UdDn< zNrsPH$@MMyapi}^>wcclld5n5eGOR22Rb!LxcJIca8fsfOY-4{47i20jk?s;NlkuZ zL4Yzyiy-`p)dWYgk{8M`cC|3snFIKwJFAcJ+F22Qu14=oF6M=ji(P?2V|0MMD5*s6 zO#lc!fEZ^0h+=?<1qk~8F*X$NApVVIZ~((z6ad;_fVqtUg6V5pwN9Z~Uf|Jh zldh@2OCKJH~04?VCR>&fY>E=Wv~rS z%QN_SK?MdEP7m0t>XZSts+@tXs(PFQEMw{))WFUJ39vJP3hYeiQ~4(LqCg(u60icr zH$f0k6x;%mC{?4x1!o9rsG1}P^7efyu*X20A-Rmr3q~IBU0+wC7zEA|VJUOwx834K z|LzR>AbtsbS5A`ssf_VdPo%@KHHs&W+uYo_p6)_NtU|beoyxb8DrBDZ!9oXxgU;wEh z9d+cYnRPJb_WgP|=3i@gObTvS;)_gLr$&-|NTNVGd>8tV6zngdPCld7fOI7FaELB} zrCBdaKJ&V5c1`)*Knw?zpZ-vOxnC<4Jk$i|c~;${$@yZ+F}sLvhhqjLHBoO-dIprk?$ABXQ=enwNA4s7_GZ;D?JMu`46-)~PQY36 zs<M|!~tste@hkHhJA9=mX%}C+2FXYj&dQThLKaAZ(Vdg^+IFD9>R+xZDvU4_4Wz- z?JeV8wpqt4!_)>zKzS`pwFn+bI`)%xflsAd#Et$*QoY6iTQzNs2nqd}@{rP0!xh=hYKH%OnYpS5b9XVToGZ?D0GR5k{=Zn< zU2@s$)GFtn%5UXo14<7?X0FKW{S*IM;F;i+qaTZzV>#?bWW@iwP@@>VAr zYzt%3tbZ$|Ed(Njt|pD2AgS+o!>A|s_oZ8%-R|3>z@X6RX6b9)ktLBT5+> zdXFTb)EP6k)i5}MMCx8|m`gh_!aZ`dK^>xgjn72*c2EP@#}ZrFjcflL5GNw`jBF7U zcXp3B_&~RI$u;=EyLRa@_#nG>i8}b8yLOove?8H@UjRB@^_pTQJSO&@660EEJIM!I z)Vi*SypAqa4uONeFMS>Awx~U80>7(0Y%=3oxLI;VQlbp*u}0gz6&j=n?y&^`A^^Zo zvGBOE&m%c!`&irHeIu#p*8x!Yofs$#>y`c;);7?%&qz+d)N`=MxnJL7@V#yLRsX>` z(xKdR!E-JJf7rzo9AQSYig@({Bjxr%F&nRCG(2 zpmZ+j+<$2PP2zy-YjUs{4ro^3Oy4}P{*R*ne>=P(ZBfA^ItQ><=u&Qi=%29R+BZB< zuQ|aF6Rvj&L8&j&18uy^41u#+$e>RQ!9(uS0 zfa>3Sd%NooW1*%iT;~HREdcj}z(Yu3cU{J` zwUGg$6lmK%+3q+jwTH-~h?$`Ae64`KIdgx{7>?+TBhkKxJLiTTN1(kL1{%Qu(L zp^#}>b`x&jcg3{P0+p}P(W`CYe#HoMhmN4Qp?mk?QE+XFav+K!uNHHmoa4o(W$1AJ zQ5dXjLG~lv%-Kk~Tsy)G zZIucqu{io?LwssYyxdayr+o(MsiqG2q|smL?A9(f);P0vqiL zwK1-Sel2ahbxvg9vXV6^winS(n;Vjf5~?ll!}_xFpT3I>caIkNw4=wJt)XQl4v z^TOBsMz}`3@aq!D!f{YIM0WaD7$0&t;h#tAzK2Qhalcfbu(>O87~!Aw=kRNjXR8h3 zKJ)N(a0~~i2(uQO7v_Z9;u+2H^2Dpp9DMLcrXEeXDU=f&gy;w@L}1xCkVVoi1BzFS zGQ~j%2+EiO-f~C&X=y+X6Ih^hAT-_~DUa&?*gdwNh>Jui{KRU3)z|+N&Y=(-5XynH zwbg)O$T5;^mcM*2Abo$~(az%pYby4KG^7zruum+Uft`e+Hu29M&Kj3K685tNCAWZo zCWrnoLdp*?DGO};5;SVjgvUN|7zMeQWG3PXg9X;k4xXGol1hS>O|PV#`!*K9;69yT z_2LdN8YAWH`b$2kvf&{77V^vD7@kQXrbIw38c{g1{oC}th(%*V@cm>E%%ix|d4Mtq zZu^R}4|staW7k-m#V)2#iADAPfy@FcW>yUe944Pz#1MiYxP^hM{bPiXC`24FkA)2j z;gfzRu4Ut!?A$U4vaUo*89}%NU7nB>$ZF=Ewy&^5SnU+KCT}DnELq0A%x`Mn?EMMI;RBNe1&uLfwVx@;nQ_=$hnfk_ z!ClHDIa1j2z(<}J%J6;c36Oci?k=_%2*5l@C+WGu#iCS02R|!v`XWb0sEMjKY05_4 zZD$&^pBjf%3e&yx=8sGqfA0LCl9EFIIrPK3R5~>V%f zqWqGCfS>AgNPlWOIZm57`>$PrMLfyd+;*QOZ2`ZR1danDvvmqIs@p$~j)*B1_oume z1^uDs_tyPD=q<0GQXafhTkeLi1T5-F zbuO#=dT;CKh>!#ClJK{0lCW$i`MC`wB?h3Ag4_nOqG?!fb=CDtv+(!;HIgWi)Es7R z>rk#VI`X@736|~(mPoBMx{X zfi<-;KYkZ3&2sc!i*K`W1x2E;CL(=-=7sOZFnh&a_qwHBe#l5fzo}n7A;dk<_f2_L=7m(+ z?UTP5f2O^EdNC?JmkNPB42B$+bN%e+HaePGCWymC*O zD4rwkBC4%Y zpu(x#tgSfI$v%YGtIdwhvG@C_wLD`Y9m9V0%FZX949xz615ypjHZ7}%nfzPb6XiZ} zcgccHh;pBS+8s9ch1*O(2lq zn_+JK$&gqzEPK5a8g4Qyn=Qp3o?cSLRf8VIR?=CtbS^@xsQeij6>_2FYeIop5=;S0QOJRhp&)#7A?Of&ZXw*Qi~5uDcxh{v;U41 zrJzEt-rx6LGe?a<->q=&3i@NWTj|^tB|HvBTDB++Z(ozTQ!l>hHcer3%4e_)7g7_-#>B0gt(x%P$I@#&ZilS|XIKcU_yqa52&-!e`IKmbBSye!ukatF zt4g5ovn9Viif0#-Un}C|{*Lz~Ay}O$u1H~z<%mE#pK?Hesz5e=(Z;xST=PbM%q5Y z@xtGHozR=oz=J^Lo>I4myz-fK_13NQVcOrZxdpj_lLv9!pxRVtFT-H@SJg_$mI7MB z5Rt+d@{8UhoOCTq#KNxx_}Ir9m}50)`4b#4n(UixzkQy=38{?EFE$|O4?Ovpws|q} z#x58JW8(z&>pB*6#6pNmU$F$eY~hg$^8mv(G;Gz{)SAvMXccmX?8xe^d6^q7cr^ zt-DY7yKOfI1p_!y4i|C?VF!!rzfWk-o`e=fc)3k6Er7w$q!Nj?d_{*(m{B08`jFFp#uBs#<+2zHr$R;Ca@uV zxoc%~@EdO4iGqRP3v^q|Dr)Erx0`T(;S2PAN3|HRImu)`&TB7!t}~YH5B@;eZA?%U zm+l&bKewT)M23<->hhO$cIpQ&{s0ABq(%%|b~|H)W4D`Rn{+!;Hm=oP!Q3ud6|CC+ zWufF?z}UD?Z`ZiM5K5v#+uO2Tq16iYySs<-`ngFOEDDytWV^uF_o>I}fe1eZCKV&? zZSBJc4~WJVBx=EgaoyeD$@D#df<+bI!`NP2+8;&q5q^ZT6TX;tAqgZtLO&%^@SC5TQ)!JIXA^+tIu&iW~CqxP(d*IB{J_M(8m)DD>EQtKd_5y8%n5yL`|>-ML*4$2 z3^>V)=I=vrSKs*gs}kxw%2Usj>pBiXgOzBHI0)|dsbgPZ&xubP0pN za=gB$Gj0p4Js)Eeq)VY-<>A2&f*A5W(lwjLN0H(l)P^q*i;%UJm*1E@K-HL>P%q;?M_SK<+0=>vLIuvGO%(qAZ0T~P9`LKXf0 z;Oc^k2fzPQOq%>B{-xcMdz7K|>|SlAdOcPZEa1cTmuZ_Fd7W2#IRZneE5X9yK|w(w zL0xLMsDJ$Ogad+s`wKHbusACJKyCK0I0w-GggWpz42b`PA!s<{r09R8Y@*%UQP5CO z2N`vYIE-K~O-RBV2U^!Hb8Y>Nu3&#JJPnPx52ieGICnIvq(-?{#T$DP+DXOdfaK4x z-+o9@^*k(3v3G}^bHQg0QVxcsW)Cfk{k&MSkR&&spm4jpJfK zqK>7*eX#k{`9V`F^+1EM@Ou-%kBnYAlxo&9^HPG*K0&wqTAEN&8dT@hnL(O8#Jgqj z2g9=Pfl^CnA6QA_H>Zn4vH3?A);S%Ko~ca-+@KDN`FH`+0O# z$`Eq0CKa*yvUqq80jz$@;TjYuOQ04-qKgidOce zmD7zCRBZ=e9#xZ5c&KONN@v%6Hr9fO`gTkOD@!E{yPP6mXi?`dl-aL^(O6o{6 znM_@XG=6v&{CsY6^lAUm%|S{(3MbL|`Ci;FhiUq`X`7F~k#j)$ zPVwNB^`(RhrgudgUL`-MQx77v*=*Bzc-&0CbblEZ7;fiW2=jH9{X*u~ZmT{ThBoll zu68aT#&Zi+1Go}=vMD^>V}nQYJVD=V0n<_R^>Ze8&#Z?v!)GiJPuqk;4LTBz-TO;s zDDS|{hji$==zs+Ok`6Q%Yl)v^Moh7-^%8^NrG9^y7IAv9Qd9RT=9X_OeNG6t{@pLH zmprH+HMbGFQPJ{ctQ09{<@^1rg9t{Yhct{-i_%Ttq}&HIP-`L-D9Q@msG|9 zdnEr#Ng&)R|NowO$*D4wAaXM~4Zcfqc`mSc*LPp3&IZfsFr$1&C+uCIO0$l+`IQZwO1ZN@_AMN|OYxijXD6B=>rXG~ z3EFau$BdNk8b~BtpN4;H>m$G>O8n{b7B)m6j2|R?dH`;S|8I|#HW_xDpU@b8pA~JL z7)o2fJgb7wVCTf413PQ0I1+PWbsg)WO;WNhIcAGvqKc&cC@ta+Pa<<~9;#{5v(huX zvhaBgvMv3HTfsS~U$e~Tx*jm&#M|Lb#$s_I%klg}LyecHBMgf(8)2J&cvK(M=r>5p z&Q!MW%pdQlFYa`xLJMtpGH4DXy)Vd*RVr>g*h9HkkGf9e53bOX^WgtnZa=@dwr*E% zpG&_)w<^5@8XeHkC5piJjz^if7bbB;DIjj%Z8{#jcZ>>C%8NuF(Vvu?`G6g`edxbc z6_J__u^b~dLSyZRNM<1|4L}W>HM(p?-m*IkDc8mQ*f!0NZ|)dgby4f4-R&;f_8Xsk z+i?yJ;-+(j1%JicaN~xzRnrwp%u)TkJ;S0`2rVMJut>Xc5mtA36dcdm(y6ZsW@Gks z(#pKVlAW9VETP*ekrQ%wF0L}ZmM72Yi&ASfBPLjNsIRr^<7?FWg5(jl>{P}c1?2n(Y0{B>c@v?&)3iG5BEDqi$_~iYip-#DiR#4 zn5{>hUQTYY+B(8xu+ENl??@!OjL(#vX3H%v)1_25H6>fPDQQr~#^Tt`=AC%8j$UOi z>W~`dhJ>Lem*{?8>w9<#j0Ps7oH7Py8Dy10u)u^3!qrw~(M4k{wzHR)Nynl=lNIqL zp6;;Y7AeKX>MP40FJZj&Po)MtTWPqwCN{$g$B*yZ2{WxWYn5*^=cFy$E){UT=KVsg z+q7GGBbmHAPja(F`(UgVUX>r480?!&T#{M^{`Uv*NetdX7%CJLDJ@jS4;CEaj0^`wkqwHBAi~Yn%jT7*&>ykZ zecuG_uf#T-+c1`^6VIYA(_&25RkrDvTt3!b4X>n?T&KjwBR-_9Qsg z4Z6YUkNxDR;%}Yv4CMtsT107GiorD<84dpDw~TMhByP-pL@im(eU` zG_toFW+R+vtQ^D0*Cn)J>SyPe@G6Xff^!na)D&A+&~V%N1D!dx+2t4N-$3O_A2?Z;fAzEzl8kv2T#k z5NI-%LkZ0)Dt%WQS?37N8lyK}Cil`TFeF2LMq_IgXXTp%1%9CN%-$_aU0O@wgsctj z{xT}m}?(q{2j3qPc z!czOa8XUTwteY*D&9qj^D7=MGdf1DM70?NR<7!L>x4ec3Owho3=?sDJ-IRJs-1gTZ ze}3@VmPl~3?PR@wV^efynTW{nyWw5q2BOZ*Z4fChaHYWOl%mUE#?X!rJ#J%@JS0#0 zd7Mdy)BuT!sqyw5&nqD%*vVXZOyvtq5>|hd)3l@z5|aIsHG0CefN1Eic*O;QTatAm zcf1SyJP)i12%)F^tOS<1R@_0N$G0yuY`7xfLeTkFzcyZ8OvD-Nk-S2e4hKel3uhYb zT$&5DRukLvv4o?GHe7##C9XYc4!vMdm^?cOoJ}$>V3HvIgQe>K9_$+EF5I1M9MUA> zK;V$ZL!+8T_W&PDl9-(x_`9T1)EK?|lpzI*Dxb>?V93AsvVFti>5_ z8Z|7*t#>6z6{kY}rp)6+k~i(_K2%+qO(wY>y20tck~8va{`b9szo-9J!R53a9PyQb z*h)p)+2O|k|E>I&S#Yla2S@Pcd%^A}FZZl`YQ%zqP{`M8{5P-#M0f10Si%LS(L3+C zMEw#m#?<^vUb?Bs<4(yQ$^UFjm)mW7X^Cx_aHp6M}3tvDEa_8*M&9yHo2?pnyGtp+IYW(cDD&KY+ z{gd-_3A6a_D0X;+vs-is{%-8vDg7Nt@Hc)8Y;o3i=q*0iXtncRW_zlVlMnGJsQLlc zvu_&8V~?)2dAatL#|>h2FvFHY()3EfrO2sl^3{UoMCo?=Zx;hZAM>R#nb++ZeMlPLKn+maJzscNJW`sstMFY#}vpkNp*a-c$aB>f0#0V z78jCqH9YErwN`l{s$mip)5jdg;+>J&x_D?~yOk>AMC)pJEP6)QM0G1HrId|xAJ7%l z`a}=udoF9E@p2Fth0#SN=b~meB>O*obxqK?t^Qox%Ds!EvZ#<^;#z0(=3KOd2qpl& zwT33gioSozwbQ2?rhrn{JzDMPss9547sMU0GXJ_4ya82eoxYn!N($dUj+Pi|aT7%t zjEzR{=E0dGa6d9kWAkqAE8)qvgY}rx>haosOLfmsL#i)irqw)O@=_t%7}9=ZR}v_t zI61PbO9n7q?Ry$?Z9+pz;A6bRECC#4;KoHFHS~F$&egLznf#GlsRV?Z@Hh@cL>}m7 zZsPj4;70X?uLi}J^&f-BA?o38tJVFRIIQl9Y z`z4IF>CTgIwUD(Kr_womXl-Y=Xp^eKsO|RFj2Hf~lnrHvuxjvWQHii}Pk9xCh--#( zBs;9m#@TGZb+mBh)4~UCOW)YV-)hsI$rJ5?1>oXS=wNC4RXb+md`iqQT;k>*aBV2ayzKcVpV!cdDtjN>CY?@4Pr%0F zqSlOSBx&P&sFl@7Tk)za-5UxWs1UVT+(NL08|g^)%Ou2hM@#o>#kWnhNeu=Rl|L?h2QGDu;NSG`armyqd z0L`2bje^%KV?Ku2RG_3phPV6^U45j#dsgYUwx^j4X)zo|MR#)7A4brz$RTYWzPbrv z0gFYGg!gG)2&BCIJ-?fe zURyxa`{_U#^d#Lw3qN?!NVYB^R5b>F)?Ki0+luC0LxkkyP5MKI|LmFI-+wtvWvF}d zAwofMW+aN^$b-@8jTo{vr|A?IzBhfOIfq|)ounUmze^)NqU4n4(e2@RCQ9AXp`GNF z%^CWtBg2(krj(A_N~P0nnL8{bOS5An5&I<=S*d+sqqos(IABo5aCegMUhwMyR(1pT z>ha-q0zHM+;MG>)Mx5+yrEcaimnq(ic|XkLsAOsLrW&}{h#;3G&N+*7WH?qK+lI<* zp>rvj#z3!mn?*ssofVZ0xeH%LS0O#~7Q>+Iw(4!Ilw$rK4$QqKlT@CeqP?AzZOxx-8%gQo+L~pMPU-th? z>eo?U&OLB{Xn&a)0ZHaNR>c;KnB_Tqnm_~`%B+7K{Bxp)o8upjMAxo+t zwASw;xDwx6Si05}m^sR=-q#j5PQk?lGO@DuW2Rs#oDWsrvcXcQl73b5->v_+;mgi$JTs6d)621Kp4sGJKnmjv^?)~1e zbV?)@`{{FE>vNbk)R2LVHqy-0xqW)Q<&9jLd#m-gtM%DhOYD94+YX|BFOz5TJ$ciK zgwOVOBe2G;Y)omGY3e>WJ~C;H`CphyLo=Eraqz+Iw(d-YmRaSWv&F%ks+#lm zW90L?FGu|^(=SyP&I6dI?`++VVqR^Bf|Vbv=QI*L!$NnWnB2QKlTL}3ryz)ejYrbFrvG7Lys14wqT?myt!W@p|s$(4`^GESuPt};N zM`=+0Kv_y?DuC8F@+uc zSqq~2F-UXwhrg2E@~nqbq0s`-AEMg)!AH(|vdLkmK#{X#vWc{F8r&tMGmx$^hL6i{ zbE*${G($`|u(y;tQKzeB^X7YtX5bq2pZJ(eZ|JE0B#bh<*O_@B;Q2~0mk<}CRAn4V z3s6D~*Cb~^1{ z4+pnf`T;@rc=x5 z?t+ANWV4AzH9seTHL#`2e3mF*m*xbqP3rta3d;52?tKSI^*x?o7W)&JSAI5nzP7b{ zliOTM80+oFif)N#P3D@7&u^WZ=dINRy;20`fprO5NoqO_R&h_Ih~?(wDAvP`outEx zrH3T#W4P@oP7O-;Fjlz?F8xV%h@pr`$dqd99~P{Q+vj)iAB|pQ5S1@i#w(Ik)7q@} zG3x?X6z=5ao#B7+d#om@42W0^GETQH)x1-RPYPn5wEFHbZoH%VadQ>9*WkYAtvTXd zo{3w#H8peITciJ|*zxbeatGBl`}5|*R@>*x+xzz_*}e0BI*rm3i!XS-zHfOY20z{s zu&bH{)~%W_t7dy=H}xM7bE?dId2W|yLSC}UfR-Q9_>6f)H|yt4f=}Cs`Qc3FqKML1 z`r!&jYy)i7Ot#``X2bY+a|LL-)g`mrf+H;>#}V=^W6Ijk=gEPL`Fda-1M~#@aMK1ka6unh&EO~Qx)L3j zvBq#(zW8*U!I<4z<2~G@4khDo>#L*tnu95@Xe=uO*9Acg-b7_R)Q!a8PKBB9Be5_@ z_Sg4Bsyaki92~r*9fq7Yw9&kMPpGXCI@)>)hOprV0!90{?~%vQ$r6Wx82>1#pa-L+ zzEFS#g(d2j_#$Yb+gn^c?82)7T$ zs3kc>AcK!z2Qeg#k_41?Pk03-vYbk}Vz3lFKVGT{I>GvNY}3D#HH9t1h1Ost`)6b8 z;7uF3eW#;hB#JB!)t`WqOoY0J`OLNaLFaH9Y#vet4Xsa0^_#tsQYb|ydV}9!DUf;Q zjSezOsj1Pn`JEyZljiV*rFH6F)(msb@a4e=N{k7RM(A9FjkpLU22-tZ2xpIe3W%3^ z&QN0Z9MmLr4 zGI)=0=8~c-uP#j4H^q1>_sttx?bTsu1=Etg?2`fEWZEZq_8OKyUtC(Utq;dxr2M`{ zI3|o+@z)N?IZF&xzzfD5Jo84*an|%Qf{z5)zW7i;M0{V1wusx6ZE5g#)j8(V@eQ2Q zh>LlTuFvSKCf&2?y#!&chF3l^bK;+ykI?A|9`BgLu3`;fWDtCDMd(*cv(o(hoUvYY zUi$w5Za|U097p%xAAPvri@~S?95sOU)MyzJ4)_!h>N{i5u<^7imy3SSFtIm?(R*I> z2gB}v#@Zr>od&%r|y6WdDUT3rMPa1ilG2t)N5&h^AdQK-Ih&fmo){DbqibN*fz=cl5!X3k81 zz@o!G5$pY(bK^kk2jf(?0B!>Gqy`o`$g5F$DzZ|EF|2n_%~-p8RxZvP#xo1hiG?P; zg$yG(Ek%`zu{JfvuT|edlzZL|alr`@_*R!q=CuhT^u0)g0p?BYwGCv@n5O^0r%yk( z9=x{=ab|QE<=cqN+0l6ybk4bt1pcsp6Zl_V)*Lw9%6 zf^&2or_SzY2tqT)NAGhyLGRx4u&#EigTl{AM{m3?F?eHqa^;N0e6@H^3nJ#O2bYSYR@*|Is5R=hTV(VFQEf}~2y~L_cmo)`-{`t>;-lO=a zhx-cVGoOqe^_rzw7z`$3LctglPv5ZF3b1e`SlCN07Z|$5V1~mff9u15DJBm!s7Xl* zNyBk~z<#U1CMoxaG~pTRceTPDb&oaZ9lIjl(hX)q zqc$;bs-^hg2neY1Ie26s4aAdLM0gm2Yn%jz^sqFiP&Ooi0tsU!#X2f~FFC_7DnUEb zp(2u=#EihISr1K!!&6?wwQ*z9gZjXoVYZZ9CGP?oMh6F1t3lh}+>cJd{4cAn)vAu{ zVBN2T4s?PQByEYxFaVBC1FB7dO5;8-RnkT~Q|d7XepkSV6c;%Fh4nQJz@n)mu95-@ z$GjK^T$(#{Nx#*Tc+aGN2M}yo4!?bXm1>?nL5`EfLKKs>W7bglJfppY(nCsc-5CIU z8a0o02XwtC0+3XM!dL(5Y;T6Wrdd(I>o)U{(_xC5C5vmQyNT;!Dtum)D;1{$5x5p+ zp-t3E6Y#$^&HT_+$f~g(mz!8vbZS`+%{m0O5I=}#N>1rJHsvgTAmN)t%Z0mS$)K$= zkj^Ox^h_iZf?^l&2CG$D#!zt5pLUm*-s-=lb%3Qh6seq&#-Rv>CT%d1qJ0=sfvKx_ zptb+x)nj8$PWq$K&Arjh>tDbeJcm&2N+9(1ud)` zCs8jae0$BRZ4v-~uDz|0``Op~aq>36vH5W+@kG8{;xrqfS!vzCB&ide-hbmntY#pG za*?E{+hC#3v%|E^%Yt6clj;g1e#!wFcEU@dG%qEsG;mzOBO=l@QPQ9-3T#E;B)uiKuix^#ho(%kis`n3=$zJq;i^KyE z33&Ra-VmF9_x#&0UcP=F-QbtguV1|U_W84?ub&S>VeMwn(FlxikIub%4X1kd=rOF2 zaqHD%dX)<)$LLPB8=O#sX(iA;bhLTwz;Jr|o%PEPciPNjen8-apIjbim$1#Y-s#Y} zmv>rGOvzw>xOro*DO6z+Vw@%rcFnj3@i1H+GlWQO=RS1qCmB2p(gpn#KU!+=vXb!` zaJ#o7Zk}j<1`HqXh+%tedK9-H2gMlB+-|QMjqXN*1zzf2qA$Bm$o-#AFwaZX7unwfB^& zGfG&cI^hBD;br&yE4k6_G-=ie`?T)Y&!Zd91B34)rsq37ul|$JZte~4RwtOzQm>=N zaMNy$JRI;$giMnKddlcLDgPXN-~g~mNzLCSsmWy29+yt2G8SuHE&+s`(QX>2C(qkk zjD3}VO-k-I&LsFpYQKgF8#;f@IPu^=VH3M82<>&i#Rumt0ZP+oE)v|=sI5+>^TI6o zl)ReB6t=m^lx-;*U>D$6g4dNV(V<7?foHy^{1TU2ZL0cD9*=Os5Xwu;Mo+nl`ccM6VQwHiwFc~7$(}F?9%FP zTyM6N#C`!wlB`shID$A#V7e={kIKt52??TgtW|{A>?bCe2x9hp6xX}NJtQz*Qtnm& zQiFr`sBxm9t0*YGgR7xyl3|q&TwvaW6QR-u8r0Xlt!DiCNnp_9v!lcRIe&0(@PrS4 zDi$S6bTJ>*6#Bf4)jtOZ)LL&bL(u(4kq+N<_MveO$8Y2FHns#axw*JWZ>sbr$rm&D zBI@J@0OEhwnOL=hAGbjyQrg@a1i2Nar-1CfYq<2SspmlMg8wh)Gc~I<{#r|FhNNaSS|kihHp(RH{S^OlD%L_U|0Qp#<=NVo(U4Fx)jE(=D((xX2Uz=0Qt`iAI#kO6D z0#=whB{W#-$nRzLE&z>|C8djh8=WMB3;UjO>-q8~XO311jSfhqDnPH+c!yxLKaLke z4$unRU?hwzfm~K(4%S6FK>9jN}9qRNd0t~IxVo%`ou^euSvg;&&2X_cvnv1Nk z*StnqxcbiV?aRZo#5l)2>ySdH~u_Phr=F&>Te@0waCUrC`0$+RJjSM{lL>Pw z5E&))wMtGB1^LUEg`uKsKJy+R_YQg;3A;{y5o(`7zrC7?3!(NSZ0}IwboTt9!Oogy z=QD~emCW~gbs1Mm<(^SuUNOm+kXI5Ee?K}^3yShn%1a*@UnP1)DJL_y({m2XOrV-i zQM_1Q-+~msupydu9j&3f{izO2@WmdahZcpo$P-v9un-=dQ$X}vF)y#x-F`4vS&poOZF?u3f1Fb$ zw!8(|9z2%`A3?SUZvzwDsr7kLSA3QSgBIbKMk$I;($!9d1R$A%h>2o~Q6Fh#!bh|; z**27b;AJ@qcJ<99d7)4%>*s+A&V-loNNi9fh>6FF7JJT)5&wQ8JA-qd9k0;TF3F-& zctvItAyuU7CjpQweY91(0IR7&f2@{69z4Y_Z!IR12_TCI49ypB65**mr)%l_2LEB0 zcFzTNzMAvFz_25ZneEih%0lO=0PGZ(XbtLvnXKR`%$}@@lw}ou*FGX`z@Pe}GAV`1 zNz)-7N72~~zm}_^py9z$VlTCZgeu8p86IPsRj3aIIe{^CZpS9J*TTU$fAbO^*nm4* z#E(jV*ye~-V0@bV)9^11`ccT1S~NUTrpiuJ7-6u3FQ z(-zIsBF_B>bHqNhCx)28YdoG+SzVD@b~Xa)HojSe_LX)MI5!A&2bq~juMn~nVw0`_ ztA%_~R}oq^(4G>;sKjVze}XF^bY+1|KAo!a1OaHi;v_YZ>`93lR=fizCR!HgcH*US zU_&b@)XPkPe{OeQ;f+mh)=@zumRve*^oB67Cf+gRRLI1^nohB$HSyM$vztTXBbczM zz1H0Ff7rpRIfpQFK|A2GP*>+&ocbc3#?j;djvwlrWd_e)GLPVOe++xDBehx8$<5}~ z5xp9;*h`*!JFS~*ap&!^Z!JQ4{{kAC6*)ld&V|)|+j(EJHKC^_k9k_wW|ZrF7ghU*-f|{Xv*!1r zx=wxrs;iXsmb#0vsBv>< zp@RBu;Ac(wexzPy=GIzdCi7{#@&#k74NcF68EG#C0gf0{JSB09r( z^pMWbhIG_6f28BPp*s3H_k$sL;-a_X%BY~d)OG~c1q(XT4QGl5Vob>o6&V+yQUS{g zaY?5n;FGj&%W;HZXvCLzXDs-pxH5hkZs>nexU?M$tE6zxbo2yeb=$SqY9f;!l!h<* zM2weDYmwzvkl5r%Gf{1n27Abq#g-tRv-HVFU&{p?RYo0{(i zbX}v+D!hPYQqOF~&`QWcw1iOcgJOBvZ#rl?Pzc7^>k# zxWwQE;#E{uKuh*nrg=NssQc+Ftj$Pzn$>H=D;_t^#U;3XRW_Z~KDR6jh7C7}eX2-T z=(XY&f5KD~p&_d;#Nna6ExsRpE!1IxALcKed(P5>X^5or$k6d)bJF+@mIkH%^#?RpS&TvT?~!xZd}mLEM`*nhtxjqTap#ii za+8}(`31?fPDHmw9+)Ip=MRNI^+et&f8fr*swg9k%xt?VnXD2X(a%F?8)j40lJKg! zFkpDyrB%7Hb(r}dT*1*%V1&v0hfXQSPhPQcs55~i9-vOt09+X~k}`0H`!ppSr2`Y> z_V!YO>J~U>6uSh@A9F`+ry_%+i2Azh1n?2%_3Och>m|hzk7I~>Kg(G%fwpCCQeP!$Nlh;=5yT8Q| zyu7>3q70Sz{6$t~s|up@3Zgnzf9aD~ME!T**S&6j!B*iTObO*MbyyPIFx&>x{2I!c z{Y8_r5M$3<^(iw`!_6J})78WDL)lHCDP4>{93ze9c(6r{;nQ z6TMFyA3fET4Dm{fEe6%NuC|~VZ-Kr?3LY-Gm_yDmH{{!hASg(Cn_5A-e=5qAttZHe zb-8iU!%h#>oDns1+#&t$e(xp9_X?G}uCu1jB2|St_FDoxM%+3z<2Boy&T~BYQGi*% zPpcRjl}thFECC?&CHG;&-reu6$m-^DK%cYpY6l)$6=CIPd$`Lo)i1j%pxUGLmb@|z zuF&7Ia1H zx>!efSzf6IJo3}hB=nna`C8q4!5`hww5ea^pyY)DS>5Ok22NFee`B>){WA=eNa`Fk zXSS>#(8W=6QX)u>U9*C<2W$N02ON+czdlr{MGvEuJ<-45zZ8P{sl?w)apgyS=%<-Z zMjA$Pkw&v}MIr)7tV|JJ0Abo(K%3#okxpmwSB_Kt7!P+^^>4RJ!1x|b5jaF^EON3? zMO{jNzLY;i=bhd?e^Kue?!LAc>~OmELn`{{(JgW6uzaabqM;!;8#F4L1oR~4i+XJ? z0yn0q#d4|^ljN&pEnNd-s|+%)1oj%)6vaQy++-eOlmHv)>S9;h@|epegT>0~I(DY< z9GW`2R%f&FxE;E?ar%4{z`z8`n1>96sr0nXsDJ3)JL+BLe=z&brk5X2)ufEgRV9VJ z@)7%nIqFxNRACv6bCVd5|4<9n$^0l zsACp+)>f6u%@ha%zIo2E6{sUT$Ek&33G03unDmUg&Cb*J-%*7@-k`a{iPsHXPz zuv#Kvj;h1Os}(=ItTD8u5qK7qifA~Xj?JuEAhXvNt-E=b=F=*v&HYWkad#2q78nE& zD*N-5D^SETo9L#GQE1hMD~B@bd7(S6l=r40qUM8Ee=aL{ZbpNoI$mkx=Q?Cfoo>Al zD7`HJF3BsAOx8-^a4(H(gx?y|1;>KbsY9f1RmOW``D6`P;BZ@KIUm#sDzEH@iQ{Fow&K7`=y zDKqHa8vg@OO9KQH000080P|F{P}{T>`*|7w0GM2tVPg^{e`|BwIFjG}E3kCUhMJXW zJsdl6McH*6d*WKh&c@C>&gbG#Bqec7ksLl^Yg75}+uZ;NfTaA$%w5%0oysMPWTVk& z^b=@slU**Ng3Y2hWbi+zyqLw2A0|Z@uqp|{oRy1^m0`XtSURJNgUs{c-zf*{vme8} zh|*+ZlZ~7~f1i0tKwxh!-bxsUU4$XsJUux)I=eU$9VT=yPt%g)1`6^pON*#X^A+Hm zr8)D{Wfq5J$bzu+qPTE2HfDLcWUf1_$|?_Cmqp7g%}eG@i!`pv(B;<~8{&Qt6=hXo zQ~ci8DD&0+27?db;XrXTb(S!!C<*hGM0oV`B@laZe}3j(d^$cp`T6K#BfRs&tYjwy zaFpk1zR%bu%W`kN^!8bj0==KZoX`s_@Na{z+vwPYUEN&`u4$lm$PWN^=3(g;)od2s zg@xU_rnW&C6C!~#PUrI|naj(xkiW9nD*@S3Ugx3wRg`(t?|=F5i+lL)=*QSf4f5$t&5EMMfiIaCccK_vdVOn zpAu-nFME7KKdj0{nh5cSxs)ibqNL>0_TKZ=e`CUj&-$ze_yGj(9*~Uc7le5dCj~_lB!MA(y?)>AWdv@@iFZ+yiLU}nR8n#U`Uy*>&c4#*vk+&3qe zf38L{kO@Kv`gd1E{|?!!2^+ERzh~nSfcvpm6ztNQ+v)VT&@X%YocFF<#A#W8_Ja;t zE^sT%vmES14#TrtZyM2msSnomhR~xKG>wv|bX~g$;~6npHU;A~jrz3`_4ez@m&38; zQ0S}2wqCQdGzn`sMCs_%0D0P#6Q{Q@e{;PCJoE~1@V(}_BnW`y&l-|I|B>Zs7Ut!u z9;DVOjk9YkL_Q3oegfcCp0o$Ct`ng68<9iHbx7q1zY%k70k!!Kf3Igd1&@<=VHM(q zxTk3v*8pJD67Ww^5hX?Gfp*)3qK`7E;nCi*;~@C`x$krfS#IIkxbMh2YuRDF7_Zv0*dYZplwy&3eBvO+BMq znAL}R?U;D$%hxUXvm8X}l~1EUCji2aZ=&GU7i{vC{e#gDHwwPKHmI3!@e>axQNa6v z&NoQty}StB63kp#ioTe_ny?asL6(1)9&W6h=cEb3x{;Q1%QVp@CCmaa7vY zmc^T3@S%$dh9Mdj3GP@LN3acwAi!cDoiGwkcJCr|P0QLQa#)TR1U4G}^#^qz&1??XCy%D=0z3w} zNy59*j*xGn0niK4X-~oBe_m9C>=JlKaj|LUKt(}$=0Jj%Kwc5vWngR}#So*$PAasQ z?8{$rrN-J60f26*GzM^bt~l}6a?&w~=3%Y-*~@K?1VJXmu+F*0d8G-aP>+XU^Z*&c z_3g74S0RsAICiI_qn?~L4h>liA|RuT6e!;F;LZucX*F-~>yS_ae}+85$d*0(u6Tx+ zDwOZO6sm(aC#WlI>8;ol6DmK=bKopYA`;TgFrrHGDM3!h5O$&M1&OrzzjY=^+CJ%W z3D^Ov8GGOvL76e=vU=*ymbfGP1N|MlUIw}k$qf%B-OoJ!ZT4w|*WHTu7BzVZNgHw- zb4kG$fsqwehIvJSe`aIsh^YPO0~^2CfvLc}H!mndlinINMBo@ZBU2B>m{G$Tgp;OG z-iz^j`{{()<31bJOc2pFG6R_)A@37VgBhBrVp?-Wp*4alTxjYAF^UjCcPUK}T4o7L zRx6K+G~pvgx-hO5GGAkqm_TZRwA4^v?T@Z|!i|C~W1PBLe_}sA{H*+92mT2zqD^!q zR8vi@4=eZW(VI^{SezFeCqxzCm}h=kfq|IdrB{{^)~>*}S%9HTOD~oH!l`YtpQ0p4 zZwnTrVUav5(MK|g9`qVA(M9Orpb%B*=YII*{lV$!`JpkdI_)(Ef1t{|AqHRu30jBN($cZDh#fcL ziztxn{QremXljJb!!SUYz{bQHx^HkBMf&c8Kw;yGd%+zkiE z@G)?71V>VzDoeS2nl(LOeM{3gt)e(6m=8`Dj7ka)#|xOnZNAl(X-7lwQ>dCj3J%^G zS8qNYe_m|SNb3p6!{4hYC-bSAQ%nd}K1>4J^0O~uMwDk4Hzv|F^=i8V$w>kEpyK2} zEy3uhzR-}revyQH{epZ^Js50jbl2znn$UN@9?L}j=o618_@!K^T>8Op;R=vmVbi5a z$H>zbwpjN96P)dG+e*EJi~!ppTTe=_>Q>dTn=DUH7Wo(E0}n!Ib%?>LS_ zenu{+snkQd#b2TjWsH`IF&m-OfE@}isxN+U|9dF`LFtMJjpvN_xdlvoWpeHH)+=BJ ze9IxeUJr>b{!xGlFsTy|Gyul|QvU#MHVfTV_+nN$e;sTS)P850tiYV%q!4n@RSeu_YBAI4DVy~cN@hqhJVl~ zP`y4wqMxCz3TQ76>uxE~K?sN{sYCc$)reL&r2ylVvd1WA+-fjdo<};-h+$6QmBJ6s zqXgHD&7cWwCtBGxNtmVUja6r2dfsDle^1%C23PqSq6|=?WR_x3ve8V6(QtwlQFfvg z)96?!t`Q3a(TvAMEq^4ku8x?{wA~`AYDRy0tER6BArkCFa-}Qt>u zG}>VJ-pP-ce(D{OXL#OWld>kWK@U%GQ zl?L4r!qm;VYSJo>biH1Hju+-CDrtoRJ)mZ{Wk~QeC#%n6x0BTf)*Kt%f20LCa~q3p zX}eScP`P3qR@}8|ZKIL=nR;tEzok)PUupgJ8@R7^S?=(~(#IOQ^vzDC+r2{PV&cS- zs_Afy+=si(|5XnqtO?}7`YcHM`}oDSwzX+!N;CEa%7d`*VcfW=0wP$e%E7D@g(Mhn zfU4Bt4&I~im)5=O7`PFLf7V4M37-~t2*dgurB$K2rwS4XMvZ8?wUW*wwKY*1=dhKn z)+em@FM;uyR%nP8g@i6ATAP8A=X(jOU8?R%TW)l#%a1;NOtwLwaDBact4eNh#NnTk z>^{k(JlRA1AvaKndJYmTwDcrj7)dK0@I4++CRTne!qA3~_F;FCf33b>la!i{gkZd6 zh2w#Npw#@T0sM;Q&~y+QZfMukg+HEMeXC*B7oS0**BPsO0?elw%-Y_xgJH>xP7k;) zh7(vUV5;?JjOZRpMIXYdFFo*SxxcXS3!G!&jz`m|oOD#x+`q*oH*)Io29Bt;y@>s& z{1+~qqV)2zK(V*2e=PI$q)_gLwNxiD1 zQk6I6-iJVi$+1LoEeV%5aGBM*d$H^8?pQ_wuPqr52Yt5FUD+YBZml zalU3=3E26M@yNOs%LlYfYtTVF`5&YLI_E#`p#f&fV8tf8e>{JCzR%7=h(gPh`DpFD zXHI&zUD9?LLQ;;W*Pli*RxA%>vo1ub= z-KR6OlaEcZswBdmyx2195jdC-dzAXxP}!!Z#1YWXrr6hhP02raWWzB&E?7fi zQ*MjY_R>q;#B?B%;)Yu>@p3)u>B?@RL26A5ov}1@loofci0e;?3tq@R?KfFodO#zL++m zMf6t{Xut{7F$nIWffg9yr%f(>4G5A~*!PY_;d$Jcq$U24M@x?%(%@A)UMcdeu3p60 zf6~Gc-I->6Q+tB8@b?P54Y)asbY@_RY1zU{7$1=H_Vm;NU;C^O+v&Jr7)Li@yplsm zaoJ*;r#E53$QTybzr&B&KqugN<|``XD)=TGC7Pv|1YRBhu4xWq6Ub`+rt8O=@)Are zw#ClU_B2kX+cSSQ3OPwsm;n{&4omJw17I=>B;05erkSo{$}k6~qi6gP6qyapVm5 zETtlixti$cn@;o!ReKA>DN4fNTG)YocKl*AG)!D4Sv7=K*H~bkL6d}tFS!~;fBkO1 z?L-B<@W7hK=SMiyi3i=#98j0gy3^J`Tz4UUs6DdY8s?Mob&Qm6$$s{tn92ri3i762 zz{8!M<2X&rSr1i~2MR}fuj&f@ewyZ@{hWGWD4(RdLiG$xT~30->HOADX?2cTP%nBo z1nssd2{R zJcUVFgjh_FA}yF9l7{jmAVQ0n2xBFBp{4vH^L*S#Xmh(OS~g~Qo>Ww(r3(oL-c9UI z7oaW?ro!o}b+KAb)3`1c4DWD>4x|~+ON1~lSUt?giV8+N4`f2ZF=*~{jhr1~{Ln>W zU(C)L(>ZdUbFuGg>p)0_f80}?^<97AsP3iRwH2(k3dw!FfRBAL~jRtVuJWW5M6tHTOiT#KNigPqY7FJthE z2vh>na!?Uq4~aFeyv0Dxv}q>oqMR*oDM+W}BU)BVmoI{MMZWU1e_k`{{eVY0 zA0r95+`EbCR{-4ltx9gh21ztulsK(`zTTMOy9-jcwzjw?bI=8?a|m>3le`kf5^Mvj zZxsDSZO54nn&_}oe@sKtXNA5bPR|74{lsbmufrQloAS zGVR8ibf~ei;)*cdT+&#_tUqcE$S{drP;?x8Lxpd^sNfwpOE3{fQ336vlihxV>rCL- zlPdOdJSqgPe*|Dld>Lb~<(ZK(^{;V^g|V5q;1et*HNj3)FB-vAOdib;j05r^jOH z(-FsaUAT1&kYPp9vG^HoA$jFo--Sf6eFHc(r|057h+`b)m}}x;UmD zHW976AiRW5ba;|Lyc-2(znxLF3@Pz*fa_J%kPiZ1QowQZ(;{h=1dh>?E&$ejfAGV} zp?mh}{Tn*ZJhxPE@{@jYDc4CM9CwC4f0b_K{Wg1857PTn6}{F4YiJ|57g z@f;J2=L9f#-VJbkdVX-}zB~B%mV@DE2fzrfR1jPH zH}-50PzEza=IPV9b2>jh4QhkpJ?hR z32T}-6GVih0$12Bh$JfMP@SniPPcTM*oBGXqg1P9bo4cJ$Mq~Dz7M&3je2*s#2#eY7Nk|;I)Mh0s`0*&}I0bu(`= zVNJf#mISk2zq6XCB0_cYbW|rTRKF9de?1-5zgnm=WPl{FTb4C^(rpkrNlcTsBL9;X zQZTYL1>yxakAQ5=s3f=r2}I|s7F^bXf6Er>Z1xDa;*oH(n4f%qkiLaD=k?H#vjv9k zkA+RD9amS-hY&-YgeB%*E1D0l0Q-5@_jBZUoK|dfBexB z`32!AM$S8(whU;=kg~!s3sJFmHP~Qnszi@yaTF#Fa z5rj}X+w*PD1M&9s)Gux7se;N@Ng-A_bEGh4e@=C)7EkZl zQlqyt#p^)hAuAukBj$&%AJ$VX5B}F@>fF98YaswxW8+$VHdN=o9xXfiTw~ZT%Mbfv z+Ofh@P~Wd*s4pw?D&?OKT;QxDF^_acvba+K?X&_Zqn?<*kRH zkmna{kKJxFwROvEsv3Fuf3o+evHeMu4kV?cdnnyCC>;q(_lCVcPQp<1|NNfrpX=Q} z7rhV1y>4l9Bk^iDJf72fsw#>*s&A0d-S`Z7`-XxZ`QcSgT=?tvxX`6|t&GWqDI{_? z!m3;dW#YAkbhuOzOWVGxQB zm34q?(a@@JhdXQfsjh;;y6~tyD}r zwK<(jl(JW&qW7j1S(;#}d!wWt@k+e_{+q=J$dqNIFA)# z$s|p3weB7`M1xx&UlMS1241tk+WP^F_tYp!zwhk=rVMDfjN{>JQEW6RXq+GHeC5D@ z08mQ<1QY-O00;o{RI^Yo`z@f;0ssJ{2A83J5;1>j(?o=geF=21wqYyFLTJ}P>55V8 zbE3_bjHLY9*#EwhY$r{du!bbI&+qO%Jw3Yv-{!(VE(!!XW(!_GAySkEGg!zBHP|_V zMO_+Dxxe^W@stju8rFsHsEtrE=)han?*f;Zhh5xWwHOAsh`uOOD!rk3xzdoTvMSIbWN5i43=49tN=TA?VHX;c1VmXWZGlgXDi#)#`nn65 zSPCbs3zZhqQiDvb6B;xf8iRTmOYEi+a@LOedOx{OE)ykH3saQ2t@YOrx+DcEK~TLak6o2lX`mMeWHkS$_2oTVJXC=z(Dv`eT19 zmd0$rh*A`sf~wjLU`awPNz#Ss!or+WbR`1Gw3NC`Vdp-EE4~5Y&@wB~ z)XBsGxuH&+l_)LSYVapkZ)*AO(Um;z?Hw55jHjD+j&Z(8dM>6& zQPHKhFWbV~%~-a9bH$2lYe>MuW6*!NI;>PW_vaMI2FuVD;p80pJ9^*BcvYdyqVP}u z?@7pVM{A?Kwm5D_-|Sn{RL2*CdT+>nQIUz79$A;_Q`SEXYH6mam-_a|4`DD zCv3{tqjYrdHGCdOzQ3^D)pt}^xWqzL&T%-xnBnqOgoHc9N97&eNYQh%MP~gMUy<0|XQR000O8^Hj4?!d5Hg_74C6cs!TSED{`-4%8M3 zm;8Ye3xCiz6S0wbcG|mZJ#o@B@%21S9Z#I5(@}gZL_soYiev%Gwo>=M-|hk+36hfS zIO&JeWFiY(Jo^G*vAY1b*xNIy*-WN_!S{5@Q1M>`|Nvni2%ckX0X|O>8 zC5l|jGFL0Wo8^in`JzZgDcDq$T&6l2%v8Q$aXed=OC{o%$wiT?lJSYo(`6}Q^Lxam z@NrI+jo~KoV5(C39igl@$3G&pAM?fyDX6Ur;LnI zp>ERf?Wz!6EwR-A*cO2;n(Z6x@y)$Ysekve634kNUy2KCYj-!GR_rmzID(l|o|>*F z%gL)e;pwK15|xI2rbm~Yn(@;o;i!6Q_*Xyi)9UX&O`%4erv}HPA?emp_DbdPXmxG< zjH0M+u+NMsUMz|q#0u=tQcYH~WK4eo!s)0rN;m(m#A|ST1-c}w7T*Rt8eL>($bYSC zc>z9vE2;DBM^T>TQ|Rd?eJ%9Z42HoTd7Mt|Wbc0nPbaYCt(1c}254|A`)nKlS1p1O z3#=gcr|H{hILt11DyNN>cL#4y4qqR|$IsusJ$Q2z0O}yN&jGjLccP3h#I!`+ha^A{ z*Er(0>27Hzkk46miV2bv4K$ttfpedNb=!@!3y^XdkY%xyTBCRhRqosjKoA6Gg(4hz>p9HCj9Flux9Ew`=PLo8BV$4Wm13OjB`Mc>?^lcW zE6XRpfz||1{e%T%~tQ>JDx7Zfl|4$gX5%n4vHDlN|Q?t zJ9G}a@rW%ov@v~_FH^Mm4EN{Usa~t+n8x41q;V{bVJ*A(oEG3wo{4&5Y*-}5&Ew39 z<1?<$;&`Y zC%YtQ>i~0QB{&f9UP?sRA|Yu|!SMa`5xZt%zWw18|9Br=vw!Unasr@&MC7~ICkJ5{ z5qw6<6Y}iwf)@b#hlw6Buh?Tj5{#UF7!D`kwUyd8@{*a^!rlL7*&Ab$${Z8OQUQf5ox^+f9N-tH;N9qjBr{_?AT{PSO5f79x^1$0x=F?q%HY5 zWWiLjE6(RIi*>$KiO`X^z#81K{+VN=xY)`N+~#Wm})Z;iX;JIybJ8itK^X;()CwgkdUS)L7Hs)p^Ap~NDGm+FWTCnK=F zt=q3MNmS&;u;C&+NlV3Lil+P^RIbfX2@azQ*}D`}NS8E;5;Fk?muQI+A%9XCbykel zI*=&=3v1A-m*EcQ${`oe=xg|_)))RBK0AIwqCXw)Y=3k5D0~n;>l>(dD=yX^quY}YaNWxZ~9 z=}hiEZJM%zeemlVOmVHkyLZnXcTIwyaGil5!nxC!1AVW3)(sQTgHG`O?M4;J*NJAV4^jj`7QuWGshb#0BglY%e$35Mwrqj6!xe)JkLj!ChTj=C z$JT@ew`BaN!`MQN*2gGF~_~_o%;Mir=J)WlS*MCz#HXZL(LvCH9sAX~~MO!M@ zUg4}ma5B1yu|~=pi_-3%(75-C4ar)luAJCbA>EAOq%G7vs@=C{)AjdbtijEC9+;Tr zUN!TN6bo>BrNR|`qfob~yH{dW)f)VC*b!3i3E*b8>;r77L*C}3<0DU}+}7v<#z&As z?1tl=(|=EURP}$gdEUv@-t#b~Z;QgPxNo2STxT}D+w*5S!|Bs^9jgWZEmwCw(`=3^ z%yXP}sW4Ny8f?6Bv1^mDwcKTPU+%l>xj(*=HXLcZfDv?HE*}- zv*lvqJutT|$hS{cCEhG;T&q1Dw2wSstG;1xAb)z&07Yn8;b(z|Nm|+q*oum!6FMHj zLk5}1lI`FM=gnfGy(dR&ssTpzTT^j{fQ@UNCz9hC1yeRsNe z+SyUuV!|4anJuB4q0|%X*DOJ6TqoG&%)axhG;rkUblL9yumpZX_l9*O_srt{P&{} z@Ryb)Ph`JC^@?1h_Vg1q%{w}7ggHU|wz-)X`<2{0Hzkib5Bm;aFIC%+u8(m4zQuM` zeDt=^{gVYs%XgAyEzR6&8rbUC=3;YSDEA|@~TtguC$Qo?iKOjm^BVVu>QgHV1 zfL#=`@gQxtohI$rrVEJ(+OH)Yr(z(Aq_5adRwb1ur?4q*iS#i638t8dur%y|$kU$t z{K}V(6xFKShkcNDceGUlOCaOCf`rzEO4m#^o#hc!&$w7>SxU}v2dsjW(%w+C2t|mh zG$!B-`>k-*gUE!IJ=b{(QVBhuSGk+tX6s%H&LMt|&XnCK5C47XqqE*>9}D7~f$u~8 zb?U$VR;A68eF_s|dQug&pLhq*_rQ( z?hPT2#LDY82i-&i$ubN~Z|Sy~zze}51~p>JDCyP4j4exB141<2s47t8di$akAAU7D zmC93cKFVw!g-yHF8PzU9fcCPD@!BkDehyI#)+FxC1g6}rY2rS~{m!hp17wr8(XE&* zR7U1^|9dpjTXah7|Hka}uGboH{>3B*sgrM2f10ufQE{p4OSG!lUbjw2i1(+q6RW}I z1+Vb>LNgkC6_7J=9ol-68$pwP%pgC&GJ7&@ zmP#H)M!}W%r+}(~I}+m$9(Veh?CUoch%9$(_B5>sY+wR@9 z{#7v?90*7f69@=5wZ9YvGnH={1F{vr03{Lp{}{r<*Q?D%KmY-OApPIZTBxar1t^fM zYo#bT5dZDvS%YHqzwn9uS`^6t!YNv>>QN-1{+qzjfdUTpUn$swq5}6{nLdF6>il1s z$A=pAza1C_P)q)|?}ixa=Kq$pOQTYQ{x|nj4pkWR|D21TRh@_D-?{D(Q|)F^aRGXI z7Pc17dV2r-lB)mc*=@2R0ZvQX+7VMAgJZI7X`;9UR!gkvSm04=Jt$$4Q_M4?e^vZK z|3lL;+fyhp{*ViX&q!K5cDQ|iGunB04~_Tj4OTBB(vu}%fgwIi8yrUgge3aH98~}u zbIEW2BaQ@r4VfB>v`5Jips)Ue?+-X0SvFU=yz3<YP z2OxZpg=m=Tx1&mCOF&tXMeTEj;nh$#CU`)>mg}pUj&Yry#grVmm59OtvZnKvtj8&W z@~BEnONknUs6i)g=i<<1v~YABQJ?;dpn3krt684ZfPx%(45o|UnSppynjnO%H zdv8@uf6g>)_);cmQ>U1iV;9ltrI;)1X4IO~Iyn!kx2IEc5+^AMnAPlTPqDFKR!Nab z&kczTk+&T#n{V`*S&WN+BiVDkEIN#K)d&YK;m2ON(ObHOxPrUcLnf!S04sZ%DLs@_B%%# zNhFtf)iw+sW;!D*l-~(R#TamP^4ig|@7VtRqEUgwczg}{=Mb>Wr>~|(-&+UW<;#Y{ zOJcTIr;8nAYn}Stc7pA`iBl<8%2;rSj30d0MeuilH(oQ@#k)zgS*rTz4G6nAFNO}x zJL!uZ%vGoo^*13o1>p}O6i(w@JgTS6Xc!QJ*wY&k2nD3}cE~WczQH{e+B=?-s)4l* zgPQ7G_EizQ<`O`oY2zH)N0R|t)rRCY4(5p)eS=FE?9ALft~_wR&wpF<1O$ z)=POebsA^X(hdDTl-M)dA5^u`??lIpsR1$^m%t(Ke+K05St|mHFc!+{=^{2f*T@jU zAUWL?L!nWuiUtub_<&k`E?B8FNlmIB?=@#p$1g$BmIX(-+;nS)%^xp4oO~}>&;HiE z?*qHU7Jh+v)xhDip}5bSP}xPu>J3gGdl*@o55i=^(8U!yRU5oHCO0OfjO;`pJfEy| z@b-E?-vC}h^33Ts&yD#dU27#bIIKS@$xfmN3KGr&S1f4OmCDBWAJ^0ajgN*w^|o3k zwAib7?KfSm9p0k3u{JMH6`ES5eB0uj6F<6k%qS{ht5jd2*eDv@LU5j>QqtO;rlkDY z4W>{#R$ZIiZ`?3G@kMdha5R*9kf;b8<}jtJ3IKRs6T%KhA1U-wboOFtNt^D`1wohU z;hq3-fyS-8WG|V;E;NgSH;r)kq79r!xX<6>_uE^C8yhoo<3m?7Fz(?kv5kt|!h;C+ z2;AQxS^Lby+crzqHjCf`Q^IWn1Q58}Lku2F*0ydtw8VR#zk<-&>hon;5A7tsk~l_m z+5mzs3)#7U3fot<51$^9Y`5|ZHhC;GS3Do|N3rANt~snygwqTX$*Xw*I(loW{yFUx z%!v= z8Oi1TD)gx@7n=1vlJ_S5=uz9!{;bbREmlLpw2wutR4cNh*TLDJ(d50Z;S4eCaydx7 zrn@ni978f;1z9FoG@ug+LyzG2>G}$p9fw&V#Y0x;k!7qd!?^5c!tW=mO#3hTj@y?@ zJ+zQVdjDUg5T^|rpBdI_Q~NGpjupu#sM6FAdK=|TD-sD$o$Td# zrO1SAE7fM3IfK5IU`Qeaev*$p$p){dg>x!%s|iOJs0kePnpK)LO~^?Om_rNGLR^?a zp|r1WZ(jhX2z~?~C5m|d>^Ujl4ear6k?Kto`#F?oe!#s2iW2c%0`;}Cy=SSA2A`hTUKH~iCe?6H zR=6?hd%$l0Ni>sdrws;Ngm4An|MPMFL*`^nRMr21|BW{42-<(6Z4Ri#{{wUbchqv& z|3(plP)+`a_-?_dc>lxp)G*X{)c+H9)ZS+8zzqfjcZ?=Lq2V4_k@EGweF+T3sHT<`r5?R{L} z)8nP=Z1Y|&FL&L4Nz&8PqeT9!oOMaxvkp$s6zV)&zNP+p)aIm&u7dqVdmX%h;2pC! z7pO641nUg#Rm1{NsH&#QS5ob87o>}pwbDYfe6AOVuBeK7zO&)`aWJc{C&Kf_KajORVpi2=pChpHnEhh7vGGG?BcqRO0HTQKT7nL|a)c3cabVDAhjK zkOv-+U2Y>_`G-8ZPSQQDEo4~8;uteBe9(|Lkj8*L=5Gxkr}b+I#=>k{xdE)sNy^s=oeqk=zslE8EZE=z3afYE-%X)7xtu)J;mr{OfEB$+p95afEqQ;> zNJPm20$(VeW(l8&kl-nVOGpyn>x-?wpwG_y*Kt4SwM95xP@L_$dMB($kk7$8S4Jm4 z8;|~xb}9oQp<)G{$x$RoQ#JEapxOA;KH-hQ@uHDw;yHN@WAZBdV6S7 zXKbNP^)~|l2V*`<4)0=5o((1$m)W7Til~NJ(25p`pzp~L4)!pKKjGxkyrk@}>S|)_NZBU(c_Z0Cd)o@fly@#YDVm0)tKLECH&V z@bX5$s-P40qd*3Mq7tLWZaF=3l*oq-903t8z2GlIDh+-_OCn9dVj0*{RTIcpCfla2$IqIuRXY$t7l2)Uvk>%d0$(k#iX zqy0SVap!N2fY9E}6b@7$2B@0L8kKjH=nVPU+#N5tPrve1l)cOc}uCCgo15j1^1N^<&JyH@h-C zZIFyhj`}fM9Em_Vy@V=zl}88vT6Am%(Rp%5@8EhNJNvT3|6l*I6*eE$?|;7*vBju$ z{{>&|3d~;ek^=#q1gH83qvEETm!c8?Y?9fg#aFLw6T-7M(@%b*&V6;^FDKg}e?A{06PBYUtw0jj(Ctau1Prb#--fbF+M2 ztzL+hTU9NA>3-zj-~E^UELsEJwS@trpAn#^%zK@*G_@W%o2QlgE2xSABpJ)zFa_QHJ(VJx=#)5$&16HQ+)A zDw1p0x;x;qqklj#RisJpk2;Q4pQu(l_^jyIvejL6QH{KWRfX9e`<>`Q9`RK*g5C#` zUy26c^yLR0^X%+GO33Nf%`K+|D5tvv7PVDOsO6GSFl8I(7e`}f4Ti2YI;vJ;**%}v z3?Ce7SiRl7pPp-Ti(RW-UAU$jm2R%8E-dNT-pRA|%70g0IBQ`tW*0gqSAvw-bzqD1 z^oO=SQ!SM&AfU6PWz@EcCfXTqPyJEthPawEK-wf{uy#8uSjO9dWB;QENU>ZzQav}# zxPp4~Dz-Nscm^Y9XjERiwcJdjxV@|>Pf<1K@ztXv1M!FjU1+TDm(kT|Bb4sm-lItF z-Ym=5aLRlFVOxpLEl&=5o;lCA$jkKXv~Fp3tk#vPj*+gG%4UC0_Dp8LWj3U4oes8n z**-u29+ce_jwT`;0%4s zZBP6XJ>sqUc$Mi2@d=VsGk}llGTI^3@}GvLjwp1J>pGUfVm=_WDji9HrYEI0a}~1L z*^OG?FQcsoRJ)S^qQtW>X_JVKje<#YMmv@qWPbS_Ybh)YA65PatWV*HXJD9|$Y$)( z4Nl9C)6>dXuyqvRHnT09S^JJN@c!=D@8639Cd9h~rNJKodfS3=(`vI03bB6suy?!V z9N?xks-zX@@ws~|TYl}Hx*$HFhv+B}Yi!Fnlm^g~z5O?U%npz(OA&Buqm)$vi}RV# z)!G>TE?*BWeoh|;Pg+w53ota}>EsD=lCMov@lg3Lu}Vv=7dFoe)(QcXWuNGnF0tqV zGSJf8&3D`oIOz}MhC747Aj{poRMYiaFn z&WxV#>-{w#_mpB3-~m6Iix=VZw!2vC8Y8aK02S7nQ4gA)IzX}eL#Fq?UGS1 ziYaC3-USUXaGZws0p)`%LNJ3Iqnxi$Pgi?`9C$$#V8o6zGymnMl}8EAl$P+Tg)X0Y z>TvP&WgMbM3x}+2>~eI+3yd8#6OF&E^c`l%MVJAwY2iLC9xL9TN0o&Z_Y1n`#Saul z0FKo8<0!BclGqw?=FF||evbR%9A1eA3A`99dLfs(&!Mwxm$d(MvKa(9m-E+bG+OW@ z%_^7RJ$6Ax3*0^2EjlB1p@_9(vx<94o%jaAkC84~ndY8`hRyyJ7SlB-(X%nAF)$7! zo-x(Gn-A2SR*?WXqym0hDdaSUT)W&bw>~=S1!J9n!c3mkOyD8&>bwh3&H|K1?lF80 z6yfrYh;elsI|$Pov*h>j?VFBMoJyG*9XhckNkU3<^yvOex(|`h5Fe;-I|`=KWJx)E z5b}jX;g8Yod)C_Du1&qbgubF%en@ahZMh);`nAC?&4cP&y_aMJEEZdw95`+UZ(a_X zPsqW+shX$L8Lg~c^qFg^SGVAC?S0?FG`mWr=T=KaeZ+Bn<}Yb_<&t@05w$^cJi3nr zku|Iqpr@*;sD$w?}kJ}$4Cb}H({ku~8Lr+H_1DyX>t z`9Ja^uScyiFI5w^=1xWS8!tvnEr@48IEj0F+I|pTP@wL6_dk#XzDt;J98C=~DwA3X zYU6|QM58094lG};LgZvn+nLd=fV!R9n^j0YJJvH&F}uaXI8l#F={sYj1fvupr@Ypm zgy9s~IOA7%n_(QF!wrEC-D7=_lFmaw+_AHJj@#EQ&H?%jVzl34fMU^J4oAeLR>fs| zJtSz%an7>?_0Z02Z&de4TZXNcuPsh%^**paq$wrr5eJWYTi)5;#DVKh=&hZJF9(_< zpN8}L??zsYr{8;CcU`>q71ZK+w^BSFjQDAK;|bv*8pPGVdY#K|jweAI#n#yHOv;U+JanezU*>7z{Av7rxf85Im8PDZh=ZKsqu4%~yKm_G8{s4`(zGGUj)o}uSJ!UObS>oPpo zyEW)ofixU;xpgTp6<{PUJ$lkEUu zyq(4EH$siohZ4kW8bc0dKU~?R#W5tqT6#4OvgoB6P7AR*Hzov}|h z5FftL+?%ilHWF`FX4UOEuEr~x2-~0dwFA*0V;YpAd+AAAc_IChZder zELQ#Bz?$A;2;E9ME7q1S$$zx2ZLo+^*ruM}1w@L#FV;9nm%J=oFJN7Px_aX&QPk-X z*1}}1huj<#Xq;h1&7aG#M(yTh|0>6_cs~1NsLNbRhMvF&=npUe=2VpkY5lQ@gJsJP zoeez0b~FA75XdhKSUzLRYT3~XoB}r*oq2a36Q=~j2zc~>)^(32VT~Pes4)9jj^Zk7 z8RrD=N{g~#ThvOfiVqo9IuF@FNi8gS`GJ1J>f)TRl4bMNN=58dT^;Vw)6Nwl@N1=T zG<$O99by*RfS`>63cw_eq(YG5jbybzVFGz&Nr9nF?^kS5Mrn+E*8Htnr{fJ8)xD(z zddZs6t@~#q!3~$FZ&3xs(j%F40S+rf1QTUZ$uqdUd=zJET4!s?6$I_Nd?NLPD)KXh8=&?^Ft$MM};%6NN< zln1(dbei-5Xyza!6i#KnXQg}eZM<#GDi9Z_2fQ06qx=;!Hs?zu5GEu=q*KbZ2;{cr z%iyioN3J|!CIJ87$Z3hfpQ4HBf^ObnVQ=EjaP`;5d`b{%WF}d-3qB@fmTvwF9Z;y2iF%YjD+cU) z8M8+U_19wXKr_XO4vciK7x()N;pguDZBcKYp4d>_7 zgxb{zIaU^FqBbY!{FT^;Dy;YP&p`H89LHXxf! zbO>5RU-*5H_}3?R%*<<`?VkzbsSy5@Nlj$|;U^FDQ;+7Ai#G;d(7{|a)3#z=e4B+U zLd+o-KiweIU$8F!<&i_n?gUDaV@=u}vLV+PP7au&6tqafPPE0hwQLCkh}?euxemaxu$%K*|C-Nws|Ma$ zFj9_Zg=Q;;l&hJ0V%g+$(_qbD;Y61#@tE8{4A$UL&;F8QQ6B6>awc^7EwYK9;A1EC zJ!>$X4q^l(&$RZ)>a(Vj77B)vCv;5!;ME_Zh^r?+dnd!ioA-0_W^?164)7da?kzYl z&yTAOE16gi>g#;yD7JMx-g|ufiV!kf;eo-Iq-BJoy9Ys~>G#^yUjZY-yQhZG#LoJ~ zRp&#Uw;pm+CKTR@wtIwL20SY(jeqS3AR+XI zpf~~TDrAI`URvBN8FM>U6&SOs>JuK1Y!Q@#O?C-wNFwhC`Z+k7sO+FCN`WITH?Gcd z_=oib#U@f_jF$PP54dS@J^v?`FmK$Y?FSzR-}Gp>?`EM9FZM;ivo`%zlkKY8yuD)9 zSUCd(TpeWR61;IO1uAWM#4OYSplg6~Ck?m=x#c7{o1I~-O-XzY9F8gp{eCKw$C#Wi zH?A#Ok2GNG8{KxY2j94>E{PH?@!-e8g7Y8ph~}Fv+ME_!9)Ek`A)YcFD$-5li37$? zd@sSZ%XT2IR?XnRU2C~;mqdn4KvK*9QyD1W>MRJJmFd=(w( z|BOi{Kk@A-;?;DPv%N>HB^i~xZm2z(zI(xdJPaq02BXJOG*P6}nDIOD}B` z*d<(s8X8GyC#b7$Bw=Vg2pQ}q*Lq^=1Flg^$XoTbD_`Fhp_bOAkF*)Vk;Nr!8ILv3 z&y5!IHx4zb&mXdPNb-dSl(_tfd4q7jIxLls&3Qk%eE)#1_7OBOtNh#~xbmd#Lqc;!_PxIkhm8%davPl3!8Qo<@LOX`% z<_>33|6NU~k;k()rHr8*;G8?Gc_OMzM@~=%4zm!fFuf2?t6`J_D7!ZHpp|9ri;|3e=)6Z0!lyAt?Uw<`mn%CBdZZKtFF$_A zxgOHUJek$HJqv9Ih_SO1B1&heiCz^>%gDc|QeQgZi*1a7%Pqos(FAazj@S4L4BbEO z1D1Ma{Oz0w&z0hp?sbQ4A8^8I868n|2}kXJ22RPu#4ulS|=bhmKvGL zDI}%$TfrvWp_*8t6$}%%+zQCl4T-Z>$EJ1aY}237+#~Y<=!ZGeZy3j|$ZCq~Z~IjQ zeRoo(>?P#b(Vkg|xdywf$73KdVmBibQ%6UW%;-~#)EcEAWg0tH(7=ppyK=9hJwCxa zHI~x|WfSlAa;Wq-JesSO?;-5%7OcEq!3mg=5oN7t&~cL+=Fl}~-Y-T1vq(P`aMq!+ zdDswtHC$T*!jpN%|6;8b2iT}}K}06oSQIr3%H!PXYL6mC-s~KP0K_;NHJu|dkQT@Y z8T5`^iQUG`f{dN~+uh0P$V!TYa>_~Yhl$Ox=FQ|c=Y1)lUj*m6ZQP+BvZ6uPd@sL# zv7}ZIn`&d#>~rEWpT+V9>%gqNDx2sq>b$o5y!oH!(Z-@)TGns1hWmHEG{jd^T2f zS-+InRNa7l&U0`(N?!v-!HyEIeKT*bA7mczKR*<@XdWwB-57gVfktcKXU?cX@2(ZV zt7RCdD7YxUqFJf=X&#}We43>umjGvh$ZxxQ@7|I-bsl^RkW|ynXEAYm8Qai$6OY%3 zOlY#t%)jD6mU#W<1Z=xJK4^`gz#?X$`nPJ z3|n}6csB`rAoOwU(=6M;ar2MxZrNrGRGu=jVRTMRc_xoyh=ASx1lqU0Dnt>C*+edr=}BES9c4y+$GKv$-B+KjjIV{^WI zzl2;zHp+fepJt(&Wowjrla?AYD-V%=^TZT{j17f{J|91Beb?7=e8u0|LhivBL7nhkl%P|#-%Sm z^GA_rW`JB>U4=|SIk$vuRFv>hoQw5mqME-E8S0?WHBQHW@`DhaVmZ)EfE-NeRfw8i zN*NwPlEIFZ{`~+PGcfcX1A{l!<;0<|f&?6j4lGC^59G$$0|i<2iA?^%!i!8GRk=fA zVqE659#;!JzGsQ7rqU}8K*d4h=XFeRBOka#!X(a~2g+}9<&bbE6WS>{z&D-LK6MWt zYzC>Bga+Xy^4oUB8dkv~pHCJBV4jlb#S)JH2HSVE>hbzMST>hggCmJ0+D>$@a{vTS z=Wqa{iF86n^8B(29c7)*D5m8!B<(abjeVMn3IGb(GuTw6PT&a!{2UG$%#7jN&m7*& zcfyMo4l1VdQANzCoEx4u&Y$_ZLUC4nTp=}3bHL)vEjvZ@H~d}5Q$|JPmUKz%hVSZL zk=;{DfRMqw#A;=Pj?MN`>WakvqAzK`48NPq9P%afsy}i^Xniloaw~fKO}t-k==Z(s zcyAE3ENxGBwO^NOkOy_+D5BO+M&DB}L~ZB!6Hi+m-5M|a z#Z(lF+Z7T475QAKnjeLl*!LP>%qfxjHFbKPBJiu(YXKYVdG8rQ>_Owfo1s9VX+`7IF0Jo*o7B~pHjuu>fau?VR zPk~4xvM2*)ijwP zj0hCjIJI~APw;@SSL|#Q+M5P>YFTn1>H+$2Dsvc_02`wvjjz_DE}{k1R%C*53bq4M z1&YLgmImn#_?&713yyiUPmSM|61lV*kb>@z9ZgfiTF0yMf1PQWPJCt?D}H+({(ZWw zV)fZm>HYi)bu(d^Si-X!;pULC@7v$VIBY`l=IwO}OT3i>bO4QhW&A{33y3|8Ur3DF zj890q;d0IzBsAtuiva#5*`?j5^DMy0Pwq3H67PWnh%b-4-%CS7caSnMQ+XQeVT5VY z0R~wsS#l5Dfe(3N>>3osIa|0Bcz1zQ`Rz6*WuHkh^fTape@onFXiKnO_3Uc`1L0G0 zXLp5u<}hKS9%!jlzG-Zdn0oo!dDGcKS?aWg>gWP=1_FOykx7SX&RpG4!TjjgU+);x zh@9Daz}HZ`%ROP7l(NOqfL#^l~3f)!mu6awA7pt*Gy4&IR{&K6~jD0y&CRczeTEy zhd9a)BPpl!pmMM_PBVvqKgdi~eU0fqU=M>rLBjMd`; z1J-S*`uu3_XWdaZ@#u)z*KhE~(UFu6L+;YKh2PmVX~+n!MClb0HGs2ITQAX(kes{O zJft6`!-Bk12qDLT?SVt!pI&rPm)6olwvolxWMLi?_61C71*?mfxwR)*aJ(4tW=ZV; z0E`roWq_2EMx8O|eGmVDo=K#mK;r84ZZ-yaUIlWdI3{nF~eF}xjmzi}+6 z63|${A?W9AkZ`k+&(hEYJP;$$ffqs0#-MF+%$tVD{qS{Dw9JUgxDh-Ie+jc9dd{}S z!Ka%3uHS+yl`l_)oJ$^5JfID7TNPCS7;B^S>#1g91{OHXabZi5T$-Zk0z-JkQwWlR zYAo%Pd%w{l3Sm$4YmO}SdEL%+JG3$5=w5@j6x7?$R7mZe1*bE&7H70ur49JBo_Y>( zgm*e3S@(`^Zyqw;hhkZUu?qrE+KfUDWFQP+AyCm+<4E(A4yF+90} zl*1=a9K2EEQ)eob5nO;3g14LiU>YxfSB(^~)YPWU&NuRA#l*-5uIT+E_SDOdJH$`v zVkE0c#@!)QFhoc$D{KFnDy}YbUuJhdzJG5eh&_Cw-6636l{97y9sg;D$uNAF#ZJhQ zy^YtP04>oAKAV4&Nt|K*#eW!7Lf>PI#{yrXV(%P2gzN2=BU>8sePARG2wh8`3oiCe zN_Uj%?sL<1O#JKKg>Z8C47(7__WqCnCq8)9II-mbP7O2BlI?3>h%g|~3Tsyx$pu7< zYwM-JT3M|I8%fAxLj&ZdrYeewch-AvL#Vvb6bu z1*|Ap?62P!o{D(0%{_1)e;qz&2q0_$00=1r-=X`#d|cD#H!xuFj<$0#BYiKo4hbw= z&TmyTk^#yt&p(;Zw{;pGwdQ@1CLHw`%&G4q81fHLi5?cr8X+M7lD&}ZU-CJ8jV4st zpZ?Qi0s#K%p+BErn~F2NSo=@A0V45EUE@|W%<^34#5ZbhTDF`K1PeBjpil8uZlf-U z`Ax4p$JNpyF2z==XlS&}BYw;V955oPzLY5VJWA9u3+P-O0p1T_OH))I^(C;%3GkMw zH4!w&C#9I6e>^h)Cgh}6Y%vG!=D42^ItX)=T^ZhYXa*#9r*d~*hp^ioA#eC-GS;gq z1wy9Dk_zvT)ztSjYIYR53O52j-zSIt#f6|}7#JjnN|L9N6tnTF+2>r=;>44%;h5xY zh45nolzT{xq!deYUq=w)p~dQ#-F8}Y`pnnb#Y02jmvch^V)(S$jn-c91$M&4U%@}L z;Oh8pU**r|9()~s%9$MSA^xXaKbaZ4=~xWG->iYy*?aaMqtVdaaWw3EY-l~m2jYL} zP)`^3afhmeN43DNLkv8g3aK~9^+iuW#6=%agsm;3Z~T)1(`Z->*R*{}znr30$n14S z($J1weM-gvMW@`J3Cd(mMTjXsW7CePX1^sN-S`jk6=Fu7tlaQ&#?GovehXEd@mPX!CBe^F) z>cVS{4BfoUBv5z#8ihgh56qMukzY7(6(o94avQsVKbo*+3i+jwT*l7QY5sD*SRMY* zdbm3x2}BJ9!8V2xWW@YI_9p?$s+kmabmOt_oD%t@oSt&a8KX&G3=X!bPMG|>v+&$o z5#W(#d&11L@j3_!oDK+>K8j@Nl|yZMtTAcwm3Y`8P5E$)g;)f204s5wOaNAy@JmQ( z*xF|UlpT<4?_U++b~PmeyKP|I6Mk9C$z$hyAEI^j5Qa)F=|2>_Ci1!k-n_e{YYB|< z1344E{k>fp%KKdGdYK~|=Ra$T$U5IH%DjY~>K~*#&xN$RtJ>D;Lg0*h0 zBD8v$fv8*G0oM8J)UY{NR8C*rZw&ZbO}|Yvnsg8^S8t1g-PS9v8_gEN- zZkvmCC$P=M+$=?G*mUS{Uzm&1ttd^{C@Z6aK-CtP_0tbfj z51iWw$Er7QBl$kpI;{Ftp#OxG#Fd>B zj5RQjWfg<>z+v@ee-3}kG!idPv}$s#;yWHuIQtUGo5}V%jk={J=qE}WvLZACz;a>T zln-xFJ^J`D$Ov1=9zasayANEQFVcCfJ5F@}-G8%X0@5Eh+$_p7rx{U0&4t_SU-!D7 z9csiV>c3M8z-l+szv(LJ5zqdTucx8h^Oor}aSye3wutnq1q(%QTBj?n^^jrC zjRnQO1;GDqh*ly9Gd3<-RsVJe5VyJqbMzlniL|EnFc5`Nx>&TFyZzY`s|&df7K@$a zvLA_9@0YadQ6CKTb?C?8Ll`qO$O1nDe(EaD`9}2;=|1#F2=SEd-5*p-sDS|=F&S=` zLdfY(Lp5K;fZLZPm+$p>h@J+bR0-@&jHndKZEOsq@+yiyo%o?5cKewCm}uw>wq(osGaMU?kPk%0J9hGT7Deke#-sz_44cj+3K4vUV4Z><+K!gmydV4!n*5P~R|%82hU`S|!50 zFw_?E1a3I(kYv<9`*&lRtT#xWGfPsF+_j~(2Y>gz{%pcAqTiOe>R`~f4i;x9vNED~ z^xunrc`5lwl`a2`WhcsoX(Ra)xarKCIA?KlO0@Q^J-|O?yO}k*b^cJ2LVR}=ae9CI zu5aSr`QGQMbYGeXaI*_v^?jaR)Egvq1tW0q^dHGKGYvZ?zWWXGdjB-t-x$sT#0Kx| zYX8I%+!&cPfYc@l4B>RA6^V56D+&FN_*_;eDy*O)R-TU4`dq+DNPvSs=5ykoCHD?^ ztJpkA$1SEz!cyTW%CGM&B>#HfBf?ArP{Xv_WuRYhAv!yhF(w=D5>RA`+Ph66ju?xzrykq$Ovq z$Hu_MEI^andHbZlDlx0>v8v#H!Qb514JT}Ca@&k!Y)fY|I2=`o;MQXcNA}F~TTs{? zLZDED$iIZ*fWe>_`o@UXIposO>X0Pv52{nG0L3q@)@HSv1GtO%!e=I7*tcLBwzHKn z;v|JBqZ=yKM=`emv?nVdU{pg1#c0DBzO)-e)y_@s588fdBj}Ow=Qp=<+qJi@BhEle zJ`&bmpP=zGodbG4!PVIkJMj+p)EZ~QMPA(gt*xyWfc4^|_L!$&TB-e60zLRx0iAiq zbk?sO@9Ox`Aa;@A8R;2{>t0Tf86vL0yVD$82Fx`2m^zKb6R3spgGHp>lKQSP>Kf!e zB5Q*KdJh|A!|86*a+CQl-WBPxrBpFjlfoFz(+)28m#fQNJf8g|c6U(SkB}F(wK3Jdqe=_WEbukxU>CG)ySi?(c-xcAgfMCk$Ute#&P)gQv-RL| zaPTZf;x(2meZJuCy*4gF={t{wHm(-xDCsAvsXngcMm=BIeh1_aka22azG}~ zn@iol9nR0upTv;au)TXMlg<=yMDWZjO}aU3UQ>1$(8LstJue`PYgy5o$M|k$?L6=4 zZPIhV+n`xJX_9HxTt1O$U2X+Pu3)~&n~2PP zDo~UyU$KbSwM@p4Zk|`oUXHGCS?sHu^HofCu?bZk6xGl*>maCXvZ)z?dPDWbCu6C! z?xv~~OKyHwvAZ56*ShRhRjpb6ZNuWLypvfxlbNK)Fu@a=-j8Rscwp1Kl&sq`fiX?M zE@kij=;<22vThg>Yw7|}mW&i_-zkc=7<`;*jI5uySU3H2uG*mfDW8J*sFSSJj9rdB zHwC?HK{Bs~7_yh|C*=R4sy1CSZwcazPX4>3a$b-w8LOc@lQ*oM4YLz-_TIZ!*jz*3 zY{8Kb?R4gpEb)so!#y-bBYj5bv zkquIA$-d}jCqFw27WB7iF4M0rYT>cri;1qK)H7XGz~jtE3Fyq)qor-((zz<8X5&DU zAr^KAepFQzggh1?l?IsaTG&~P-$zXI>NMY&h`*(*ewI|cESRx(8Il>0o^%FHtD^&O z@B`e&W?w$kW*bL%71=yj)YjE?E=)@zGpnd0)32a?)z3-{SMVx7Dy$!muM9gSFE`jo z_1BW#Qqy3t9O3Tl8bLHuC$Do_tC}pV^mB`~uzc1xy@~*8Cg5AicJVkG`KcE$uJ9lW zxojqMyYy-~R3f{ywPS&CKp@i{ zy^`r__CT#|(0CcuJJg%duiU&dE2R6p{Dt!8FO3d?0lgO>-i*_>LTu>HZr;4WD>vjaVdSC{?mMtZqgNns7$8uDbWcOO zp+WyRpJD?WDQ1ov#UO(wS8icQ+tsDS7?n6$ER zwl;wLLhR4FCHL<^gUbA1Sww^AI+w^`0#_({vl*!Su1e)l8ySiVMo%mfta}V-<=Ewr zc!5|mPMl`}i4AyyZ@aYiANJZiWG4FWCn`eeJE&m zBaS0d!G2pHuupYAgkvIFQU$`i{?TsUSc3gef!}k$HV)*Y&4RtW-M1;ww*qi+dlYfa z9h8Ec4P3Z4dcb8+`U6g+;K+YzolNw`*()3wh}@VGp%{O9C;Wp~CZV-GUz9?i?t3m2+oW zZsCx--1m_Bn>vQBCEh+Mp*sy@`LKeppHD}xl-1xgcp*`4nPRIYM9Ye%t0ZZ%T&o|^ z3GSXp5`q1Wl!>VDfGI=eO$?yD2hITp%%Ec3{JetRQ>S6+?^|)9Zflilhc|=K5HQ4L zN)_6`s&@Eh{r7=YpodstZT0t8kn_6ql1E-Zf^Q5;3O5D}?9{7NS2rj{nU?Higj6QU zI;MGX)WYxwI-70n(-<3pkloHOFyh;~OB}@o4m6EOA$?GJ+A%1#q&e!A^D6-OGHxpo z_TS=Ki{(WEgz5p~B9~*6lh(i(!k}U(wus5}b_)f-PUY5Ch(yj>eKIW712e!ZAPJ(3 ziv5Mz$?AGkN}zIgxN(I9ZA)b|whKcu&*Z>|!+p76rNQ{t6Y!#_Ka7kF5QKp*u}g}u z5z_O1YklR-!ziLqF!Plq>sS<%$Up)0U~plYB`A5wM16#3_8RwKD*Y{rp55aWaFo?7 zIN1{W9o?zFS5T>;{&j_r;}SW`5h39$8DY4>uOgzm^UrzJ0$VhAUp*xelhEW+mse2f0a;R0UyOhB zH242`Su+5Gj^q$d&~D+_vu&H2#{4yP0_v}+$t2OSdhRTT?BmOM+JEk{{D${w@kbvF zQTHom0hT3)q>}2i{sI5K1f#4?a4}qH5Cql^C_VueZmg1i9!LQ_Vj%^|$0WY-)jw0dQ6!WTqzKd_*(ZdFN z)j!XGB44wTASq&mHRXq%;6(e#su2|!3pDI{$*)jeMeRS18XXKMnqlfA#tI=1c_Ojb z5#{oFQ8S8nAAQk-N7~J5-648Qglz^&fQSgQ<48g$JxG%fTYF>#1GLyA>OqnPFPN{Z z7>$2>FP&Sg6nCt_dOZruE1OV6NB!#%vJ^qM0Kupk29ci6O@x~^1seWsd!4VUodvaU zB-avk)lf~T+N;{n3w`X=&>n7}B?3Pa+;_}M0u3nGYN4>ZrqX@;$rYTn(r2$OWhrOk z{Ab~nPO>tRP1ecJ2EZ$&q#Lo!r#Uy+s(7%;v=FFRcQuWw?ZxO_hGV}q`4+|5E2f`Q z2w)uyVS~3E@^{c6UjZ8JrFnuW)Qt-3S@A5KQ|Kg*M$%2TkJ@Y@lFFwtqLkkoqq zre(*bRBlvF)~!(tegtEtu=k(ZB5(Lp0;h<#+iNYsk*f*PpQ1EJY=mT>-!uX z;V$MYD!=a6NUw>6UQ8yIRiV7uT4_E~sL`ATsf**G5UZ&<9fc@qx;Acy%lA*#-V_tg1?2Gd?ug7=L3Sj#%l9ojll-L1>>13V4;jSIXST& z6T--EYWDpu?D#WG3NSJS>^U>wP-61o1YA=j5sPw2Nu!#4FX^7)jrnK3rF}BN+A@6M zaooi@sc7+LyGF?HqVgU@zlgn(d{L*Hst?>SKoSneoRT0hhPj0$Xs!lv;D{9itT?e%3TM5Mi;stT1 zSR2~3P($zXzwh2|#vRu!Pk|VDFQ7B&%K%L0R6)_gzZwP^g6LOJ8F9-9KlbpA^D;bt zZ-dibcX*s2r#hBT6P!Pj-Km~MbAZ|f@X`Ij%Hj+*4oZH9UF`$oZN` zGj)R}M9Aay|E3csHX4HEL6%ptC~Huew}eA2U0Q~jVumbX!f2LJwnzGxZ7RaI#aZ1C*r@+^=i1V9pw2VXi5pRENuO zprv4!L@S#JtZp7R_V^}E7>XW`?XM!pWB3tIHbv%I4aEFWY#mAx4byY>Xu?k2Y$b=4CyB)_~>8T z%L&Kqm^wPXp=DGs4)CoOyKM9-1{GdNIuo^$bq^?NWqHV#JB)=lK^(J@C)MPKYn`Yv1?ENFUN+!4ROuC5N8OKOC@K*2q}2V7VxE zjIehpGvgHA+v|9(L;+UzP?kh9id?{)d+y8aXWhBX`R$i@G5Cp%QT3~LbSydXlJ499 zhM=nOqSl}SAf%#FFw-+`b z20yTf#GKqXoZ84MPY>X%8^L!Im*qJPbYm|_D>0+Y`A%NexPr9CFAB(W3}6j4To|O?E}nqZEr|7R*GNAk}fM$6F!nT*_T%(J5Ow00%Eje<6*1sTa=t-PM)28ToH)KS zJ+l-SvZrCu5yz}9k$#ZbM^IbkH#>P(Vv6d(n(T3h;GKMPSFWo%Y*C{uASQmaYuu8y ziz8)DE9mR6`PayXq6-jwi}?zim7L>zZPVX0R*Big;bO$NLTLnFSb62oF@!#;YPk4r zZe;y_+q4YK?R-ElgyFA@CSXVUoL>$WH}X5*qxqR)5x?9gDU=+T#oeo4XPC##TA5g>^{T$v;6N+o*eXRMx3bQOXl!w5PPJ$6V zEK|m5K#09NT@K^60+Zvp7mDN}DsQ%cTH*&PE>N#C?LvHJCvhSP){yrz_ugjzbbM1Y zuh9cOyuAsO+Ygc=ocA{8z!N1wG2+3a8NZssBZJ_`Hx?Zf^?_h|`F5IQOKD%kCt}0cO0ME}$SoH}n`fX`ukiZAO zU1^U795yyy%rY#54`p~goU=ms@AX4_f{R>gLgTK<6lf#sl~tFpOOt}=`DB2KJE5mF z9H@7svq;aVXk_H?dV_9HqbT^IMHF9^Xo+0od2@WyKHz*zbA`P=Of4Z?7=6u?>o$ss zT7KV$*Sk?n-uI0tms={7x5`BA3Yr`|W*HBJ)dd372E@}H10GyrU__p5BM3vjY@@L) zWgjAE?A%pjq63MP!Pj~yjZc8&c-bRe?L51mvBf}t<_&0y%c4P*!7XbS#ci@0<|l)Y zt*XAS>%1?=->90*Dap8a-k6Sh@{3GiEx}yzTICd6(<}kuNdF5*SmPQ<+lsv1`Wj8v_we6!m(q<_&6n z(u*6WkVOkXuVsWR5Q>9@s(S-iI!78jU|PRgpm2<-dkZnJ6h^SXcND9iWX91EjSX&$ zVsdWISDaHKw~<(N#f?GFS8z3(ch)+?_R(8(`I+mwr4dJ)7-Hnc5DbveM3Y7AcC#id zP?q21)}=1i)jO+}aAjh=&6ZS7lY~&0?k3TDxW@g5oBA)F)A6|O+PuWPC=JPo22_7~i&6um8q&l*QbY7$@}jEOu5n`A7lu4i){ zZ92x;Y=P&wvwB}`NBe$EQmT9^nu~n*{Z-H*S`Y&`OcGk=3^vm4jxZtK8$ zT_cwF^XP$U_Q)(y-#dxx{@`F_aX|hn%4WuEU^3(=SpHAo)(K$gFM>pu&I`wL3S_KW zw!9CMq3xGkFN`*zscJ;i51(9+CGGQ*=F;>tMwmByXuPqazjY{utBRy`dQiAN@d|54llK^UtYnu? zmGLjip-`%Q&LtEbtF(y|dK$<6Vlye}&d*j?J#GV_#J}X7b1;#5DA^p@%>uza!yYL! z_`5pp5Ie3253ISuQQ3k!;YN_`{(Oi;N6~B|L}(U-9v?sw_XGOX{@$| zH1$;oHN$sN3sKyJ{NrhCV?qMQj58;m7uM=BZ_h!MImk&F!|^1JU{K_&ys`2~ZyTUp z>KAV?xFWD*W@K=Xe)~IvXknY>&(QJt8-%PP^SaB8Pz(1mg$Gzlia=7_GZYSM0x-tYVE`}zHu&s~;UxtPuLZDM`pQ^Qv17KA zQtsIZ!NrYA8CubZU3;OVY)QN5cn?;c*_tCPX0dU!tVjDzSWwO?#6KW1a>|%Tpx5wn z3>{A_1wk^Ul)npB-(IF6xyUmR`P)H_nZA2w<(SMc%QSRH-hy4eXB&#-efJETsCj~k zzX3Vd1bde&@M1jQacWa1ptdA&C^FrC1l@Tve^9|FB$ow%(sRrwG&c^-Ixl17BuWL? zItz0ipk-=Q#`^=H`^ydKoCgTHCmIM|b|Y*GA|aqkS<@nF4ciGPbW+oGH{G*?0+_lD zF3urft+AVPNs*rCVUm#akzTCII}_zN zL-2e3I-u4W_Rwqy2qIJ5n($)I4g0LU#UQ0@5Ys%pNCXw2dqs2)afe3OebH{$E+=B; zL1<;yjyG-<;}Q}~t(61dNNe8kE(*AG>H2AH;4B6SpSbw@huYFHep1;U{FEB=-GDBm z*8-R@{%KBmG0%Ccz_YadnSz?o7~ADCnum4y2X)vILx#9F!Dv2!-*Hz?NTanAhg(>| zJ$=i>I3jw`u;c6;amJl5sbJ*yr02jG8sEh*HduAf!rs!8GdQYO#b~vOO72Jstb->f zh`S{xr#H@trn7&kQrQRE$p_kT9KhO4m8!V(*>bL{#UhE&^x)}qS}#{Ch0`hd`H^%g zre#ro>JcF|WohQ0;6jZenHS3kXV+jy`^@yW=yJ8&?@Z@k%E5dlQ&j7TMiGCUN3wc? zWs~I0RvO|?<@g&Qqf2kDA9F>9l~H)+j_}~PknUj0b?X}lM3tSGB9BUJegGW~qAq_E zv>NO8CDz*8eQTnhygeR}26^Q?B4G-zF6w!Hx1if*vd;Tcvt3T$xKsCc{od}AG5h+v z0!SQ}ThvLUf$41>Lv(H&@nvYvp1GT5^h@t5)nHp?4Dw-2EfX1I&JD+pmXQX_xS`g^ zKUg-(FE#lBNAvu+{yeUyae|y}B&sF3Vg@@yuo%%Xw5>wEoKjhq^V0LHWFwPQr5T^Zc?vTjZ zDci`h4&XJ^?U{I4?YJb7=LF7nT4QK=jXyk&jbmOdMqH~AVyw1w)qqTnIi*D2S`*44 z;3z(s9$`S9pP_)Y-2$M(d2}kXi(1QYP3v-|GTi!i76FSn{B0s-&r3j{6;R%3^E^}a z&NODq3>*)&g{|@yPbz4mh7#~#eEHorJi4N%G<=`W#2BOe6CNy(POsEUH~C0nU!5#O zxwv7kJDk)ZVkYKMDDI)7)IGY1$+&`dUs?`fSn?AD&!Acm4FR}rRby#}4MY zf{+gM+7^U(^VrP!2F7Qme>rnHflD~;wYH0%?bTTrE#s86*Rrp*(Oaf4Bf7-TI4DQs zRC|TU9>6;U_5tvwxe4-G6WrydZ<5QFk<;uKLf_)Q`XUST0KUy0YxCzKJtHUmI#ZC^NOECkIbf1Jsg?3;<|Kh7?&7{q| zsj%@ULIWi_k4RRJ&-ap+l{mjGkvNrIGaOg-Z? zBZlx1#xi|NY>X$YtW~ck-loUxP#z^W|A)T?v6IuC0g24fIt2aXJ zMUR9Z_XZ|z2|6!_@eJxHBq1m4ne;3BdL;RTQZ^H{*hcoMGz$V{ZLm z=r&96UIC=8qOOJayerhk(FA|$JJP4O_;gib4fhI zQMXmvZ(O^>-;2I{T}v@nK26~Cd+F1`jrKJuFad^3N9*4(B46ZYE&Z{+D|bOG^L8-A zmeDPt31;1ep!ea}x_1oc6p5KMlLdQUYV{r%&+gZNKw^NIQxzilCl?T6*&BU8@5L%N zdl?uJzrB92Ck8box*EULA8!{jHvL%pWPegk(GT!d&0HT1vM+*LvBI;a`#jf+>$@3> zOHjnW-08kosCa`(NN$-Dl=%;|=L+-aW?= z!-A`$whQ{vqES$T1g>3C4oO2z2bd-&vNcEzt>Z(`FvTD8i*?aPtDk$y5i@&;AXt3M z(gpY=BUsOkBb#zCZDG6{jYI#aNgCNw-zac+57|x@lH-#cJc(Xvso34@z`z%Z56HM6Qy1_)VfN2+xwUkW znHL(zDH?|R^c}VQK9*lm_rrl{#yN=uM{OqB1pMWlsE}!O12saTjCG&+8<9@l3&X@K z_`~xTW!V74nU1&CQ*I(T*UVe;G#_D%qdChK-Z_sWaVW76^= z5>VNSyA8Y)Dv4LMY_wf6$VND+yRCeJIy(=i^+#h_w7F;D0HRmvz@ox72JQ$!8_*jcoy9M zTDxmk&W67ElaI#1-lIN=?+|6zW<50s_MR=ZYaoZ{S12Nr(Refd$wlOu-B?A%)y{Ma?D)QwLcfe&csb z-BF;-yN3#9)pj+`IJEq(t?V!}cVBx;nO~+M|8-Ae>KUm_kA&+gO>RYL2m4$i1E8># z14p~yVp?}!^vEI(hZv7vA5T49ZGb#^SywBYC+IcrCJG;2Kw2dJ>*MNSBaOJE@P76u zQUX9y(&1Z$YswKC+TkI@3&b|i4$XXq14LGBn_G)QJe1pzrnRtQW_9j?jqM_7CR>nS z()-E8Mb2W{nMmCHn)9Bnva&CbTEAkK{V6Wo$ax=`nURK;7}90y7SM+MoM~G;2e}f*uciv}O3v>OKGqZ} zWp@H?QYN&hoQq6Wk@Q$s`Ay7e9j$kVn+uRG?R9yt%dUqnF)`5R&SDvf@d#Wmojf<5S zGDlXk+<31w2CB5C_x{k8y=|KRKCWtOsaJlz(-8Qt+fd%F@Td*2IVD_4xx!DHK#G6a zTF~g#de}H^($;KHO%lqTSE1TFyqBT){Bw>3wGO&f!Iinr8;=UDm z^Y_)ZG_0k5L;$Zd3}1Ok!X`F%zFEb8L2LM4nw>0iVJ&$|MropT9-V0~ErOv4U}$lF z39P7w$Sb)Q^R$nBtdi%Rvq%S3l#oKnE34gXT6G9siY|VRL0N(dSV4q}vd=%;FpI!z zQk6x3;UHIS=rz32#`-fr91XIuB0U&lUiovS!}S{opLq>vbdDT-+s-zR@bruMI8`lcbheDpkm+Ho~v(dH3(Brl~%)=IMsmH-=(LkFLY zythM}Y>35mJavBRxv*`vA z8M@C+-{?H7!7%b8lw<`Z=x`r0TeD(kGjWaC2QecM*pvyB?keBwxfip>&2i zi6b|bmo61%3{57d6+~iB1hNWXxpjrd*;5yEWaw2~>Z%rllFjBf=n=%m5 zC>xJg#OiVTKx8E$1M9ChlB{@K-tCRWuY7a)3L;4T#Y71g)7!m8zRAgVhE@^wc`tJ08HI@NS*6Y+TD&hbX* z)ew|!T6yCDq10Qej9GIcSAO6yOumK^mY@X37Ry_&H5a7!23S2eNt}H0j zpBTkgGa&0W=!&_jb+mF9IErFbgi%5xM^i+=pP`iBGOaqIYiRUbkrP-YOl3-|fI#l~ zG7i})W86~Pjs*!R#w;%?_ryXO3#;#8rnzqHaz}idr`TCvai!8OFQBedU+u($9^eA- z1*V@#h{D3jWFXn%XSP-#+3kOR^YyE0mM%{}!fPoDOvWnoEIW@suR$N^WsUt;g|TG- zy)5|{1y{hH&O65OUNWK*Uy>*{Y2abg-?icZ3vm%% zVe^CFzho{trod<)ySg_Wu|ZZM!X-!8sPvJ>P-D?Hf)CT0(dWanryZ&HHWt%wo$0@g z5#n?#87BU)#d)sPGX)B$ADljo#K!TbWXqKKzJ1(9nu11DGhMhT>u@l96o#^7K+AT` z|ATq7q3w;PCXz7i+m0IOwStI=wEtR)C6ZB1g^sZ^Yp+u9Xcv=eW-W8KK{$DNN+_3A zt>VE4FaFLqyZ!_2o+{B*7z3^+ipij4dpCZsKwC?yRs8ZICi zLwFP#8}7!@+JV)9{IuuCnA{dQOVA=EG_C3GneN8W0i<07P(GCdUoru=C)`L+KOgW< zS&C#xmX;w&B56CZXJeB2l{E3xeWq z+4G)}&tlWD+!5Dk#S)#?BRP z!4uo6*+7H_(i?kgd4;%kV%iz+OtXDSOfBQ-LSl}=n}Y>B(Z2;tGnXt7O!pib81pdt zAOl70?VJtFt`{h_vm?Cc?hOSkV#OXA9aYgJr&)lX<_niz5tJZ>OljUvWaJdP>Br2L za>S-a)XS@!)UBE^1O(f%{fhqiGQ{IBt~h;SsQR}~OFSplV$b+Ifze}dXEbNJ02Ru- zd$~z-1j&T)6PslV!hdaYHb13X=A4Qb+V;AKP;5A>h~^dl4CXSRU}*nR3Mioe zEm?G8O?b{`1FJvVF4LRih0EEkRD`y*oG#|mS3K$1<0c!fe6(3rC}ND++VmJ7bzDu| zS6LETQS!`{qupzjy$51HN)=_^Xt~&s1_)v|;yuauNGL};+}i{IjObyByL#YW?x@Zm z#hdKwF(>p^g!D-pe>5|Jmeer}xV-Aenrif}p7T%I*N>_reE&`zI-|y-eQD;dftP&P zx&7`*KkaSHcMT1P)i~OLM>x&EyDHZ z12#T4%djf4B%T2PLN@~~7U@Lx7+Jh*k z45xe@agf$r!^MrVZ4H#C1i2C;Q^hF04O>(Ck0}b3qV;;sxp9J5Cy`qv5!y~VIiF$2 zZ59txUSI)2@xyDM#jdYzs8(QcQ+H&#tw{gV^D!*Je)A^)?(@+Z%}QBf2Q?XLL)7Ps z__7w|I>SX;$u`0;p##O}&#yo}v%g0ZiTBTsg<)c;s(f%>u$?L7miuDPzmpjvIXfm) z2dR}wjW&p>Y(L)mD&q~+_HW;%^V0G5VrJt2iE67kIToK(|s+4}}KaQU&&j>!# zQ|QqI0flV^y0D^_0p?D&9}g2?i0<4GS<4UdVX}+coRWrNInb;dZ2k6H5bgkONk#v_ zJ?UrB8t%L1`3r_v`eUvr{Y_7gufqdm-vo9bSZ?}LpqEeVXZ2vH8Km}jkr@xH#Jc(& zcFE)StUV84+uQe;jWjB<(Qu`(26O4TQ!Y4F04+xQkTuO25;kdpB5^^bXF`l~^ltrK z!<;dj=cC>jXpkZdG-$CFWCpqjb|J|cp}(^xRI`Tc3H@J75aL|G85861v@^(GfV(7Q z|A$F?*2aZ$^D|~sRPiaI+?nUFpSYv8Y5`3)c%5+G)^(4l;FAD6iVMLb{?bDy6aREM zpuyN~*guZVR%7y|iQ!kjkP{Nk;h+maXruJ-{EO&H;FXvNNJpK+0#i=uYAGy7!ul~nNy^p!((2=PV!g=!eQp*AI_jFMGKQW`s;Ffmj?fnI3gi!F_6)oQ2?K%`n}&!h#& zc@lC6J3sm9O;_ESc{MX#C2BH1p51XqER|l>J_Nc2Wf@x@id>2v+lri@S;g5W26)ig zl5D-`3Vm_N=%fLzFf@Sx`xFl`V7=a=!3H9t9sF~{V0S(tw*hN9t_`O<@CyPkP-Xy* z3$ZiM2_~Czq4c)jw!PSRW!Sy|3YJSxi<`xL!01nF@4FisE@u1KJ(b~eF@W7gw@Og%)^ z!2obmIHIaRSRno;>z)-w;9z@JnEM@dstf)$REEE31p3-7bqyo>N(;wCJdlM;1+%#M zYm2MjXTF=zEvYm87nPncps>@t6O3Ef_nME4L!yf9w-lsLW;(_b#R@=Ed!ikF&BNT+ z1fP435kDi4YDegGDy=SkXvH9}`yom?QpUAd<8?LE@ulO9lrifWk6y^(%HY{e)FzWn z8293|UhyPF)LtQ7 zpWTY;!z3tK5L0%$A;_K=Cr9Df-|aZCh?GZqhXd;y>5898RUX+;J(ZYi_yY|xF#W*v z0G*XC1WRVC&7CO(;5UH7pYQ}_ld}gvxW{yhgLH!R0O$T_3W}ovjtu!t-fpX;AHC+3 zMt+aeY^oGN266S5iaRJ92d3V^8xG8-as0z^fbn33+#gvnuL)LMD-%5ibP~hQD7W0+ z(Krz$hLlZv&u}NUhT|?oG4pdJqdo|Nbl)^mMobn@#SAzCwoP?eynHan2YyA9hjEV8 zt7+DNxALJ34?#%WFVAPrt;VRv=#|k*%1(+JOBqj!BkU<4rY#i02YB&Ch&>*of1pQ+ zj)7J^{Cn}zr|K>@L@aShrxq3tR|+&~6|9aQyYjpX7_C6eKv9)@C}6|p#bo26E5Rhf zCV_{xjn7B|P<~eZbrOkyVg3o;f@+Ye()9Sh0#PS2ms}K zV$TAn2ZEqT(7nJ{!^P2$u~C-=!;@?;RiI<3|=yySP7*;i)%~Dj*7SkSGjBI&R7Ha!(nx6JW8E zQIBj6CaMDnIy8gJp#C6%^#=&f8lEiLRSA{yR#3`AY5^NYaKk1alYcl(`A5VSqb;>G zVQJk;2zl`FLU|#E=AI_~E}(@j%K)J;;o*P);NXc%jPsJru?&$<-ZX)c08fW5J0V|= z9PNPle-Cs)s+ghzm>(+&QsdM420M&sxU&aOjBK3Ei&yPo{Xhdf&%5j4ZWDV>^NM)% zC3wIYFW6wt(i7tOC(M~x@1glHwv?GBj2;WWs z@JoM;_JNY1<;d3f2?An^>3_VyF*Nh8q>t1JZm@kC>h;nvuPbyc{^8Q+%4vna3W^LP+a>!qdIKPjR6MDXuCqrn9$~BF7o`IDp{++iQr&McJueFe+ z-aC*PJG3b(vXLH=zpY9%-LztU%2)nHFlb>NHZ;d8xel5^#%Z;XE1Ybv0+u`iyGoh{ z^oepCTjcU!Gr5Z6_9rYF||5bn}8YBL2TY@l5X@FRW3y#%xR1Dh1;$I4}14ul6M z{`6V~ogec8kBjDt8`l&1=Hcbp1gOkh+_$!A`_R!czq+^aNk1S1v-8YTV-*9$%B{nV zjEr!lg%Nuzy<)AAAVc6E-@F5E$PBin4?prC1>zx#gwjpLRh&YcL>IOj1v_@ zMXvGxBQFUr1m=vR3Ie-fxswGpp3}i;br6;~nB1&BuaUr-9Xu$-6vrav8WDm$#G3Cm zER%-Yj(^EGe5dPpciE7M> zgiEu%#&h$I(rE8+*x=I10Pa0%R*1GqVt(Lvg{3?RwuQzDpvBoO{}NJP?ok)nQ1`r} zVSAD^Ty`NPZFer5Hy8k7eoD}sueS@rWpl#tvXmzSGy53iu2b480nE4zWR!g!oa(w7 zBjng^8P%@bj4eIyHcdgR;eUdijm>x-_3I+1uiNJ)2bvKp-Z--K3th5S;$@irQV2*$ z4*>>=I8tK+jN-qxi={})w0zad*SFo_d;AoGetAAd+w+mv%hoyKjy#@()V8d{`r#Th z?^kv4(jz1{2GjA&`9*cNS?$`)sUty#7KO>;=ktmR%yy1O`-@!603b@^86`bH-H_yB18beHQ6 z9C7K&zddkx%nkT_do#Q5z{!cS*m5nB1F11rCvPI4y5q^?rcNF8@b|z@TC|`D{|D@B=qqqXtQ!hE)@p}ucA7zSh!S&=9>kr*P zcGp(9>&5tDS^p|9iRirGVKj|%xSHUJdG2JP0`Y{YK0HzV@1moYPfYypcv}&R1HGZm zz6$?7YPyf_I@UHu;mkwv@>9K%;ETWCumJB{*#C}4QvMm~By3HO2 z3}A`R#$`i1Y3GU7@URYOgiIl+c`XFpj;5=zS~p!zInt$4M|u=QYBop?1P*9EN#*Tk zB|dY2S4i@C8&oX~+OVv=>)$9Zw@|!%R@)N4sF~U@PR~d8HBhz4?pzmBLye@|D4NXn zWrSUZm)n(z$8{EIjwre8Jco^a$|Ka%lQ{PhON&Oo%DjSDjW< z`Ed|TO_Q`^xT*I}7gwLg0Yvjf&7O2PqV;{9yqwY;vUC38PZ+D!HX1H0o6EiD6VNwP zgs+IbY14+YJJ@&v0cNJBm)|I~YaTcZen#V~98XA8 zW6scsI!CiBETfvNnw?Y2KN{(nzU~xH1O{)EAVKQ69T45Hd#Vs+gW3U!z(*(>MUBX8 z*{5U60gynDlIe0i(>jE#{DdPhRgKy8S!d$LjKI&%2Gy`+uA%NCr>$=kueTd`5roxS$jTjU{`; z{&~*ae1+cbx3By7xycXKp1i1Ri-VaTtk~YT#PDjnWj3;ponxxHMe%pSwdZ~T@I)uP zAM|%R;oQhP)T;i4(;X5Tw$K#|)woVDO}&kx;&KxR z$u7R46V(P=2Sc)x>oj?B`CKSXcU7w@hQ26jm6Ai0v)!^{sf#5l3}xRBa_Oopm;lhA zk;Z)eMorj{#JH=E?tQhCt&gPWo(^} z=oWmWp9&l94V*)7DxlWu{YsF;h(1IMca?9Tv;Fr}8RSg2OoXiQ3JC|KmHvMIQ8mev zeQ%=vM-VC1@NpS12Vn{)HT)x#g3G}X!TKw3KeoUB*7S*QBirG8MJ{~99Ahs49KHCN z!y@3eYyISibK;!4E50f=0C7eMG=TdRJb1x|Dtgu}4~PX@MC)VTg*zV zjAZpyNE(SShRH%NCJ(55i3ZS9*dgBc;S|8ucY|c5Nw(Vts6X^6T^}ah8eEt>P z5|~}__^op;Tj+}jMo@$0cK-oRIxsV05@L!rO<7b^{vdJ9t^$6-OB$VqG&j8HM6qm^ zCet^Gv7YU!VxjIE2hzo#8+<_fu*=V<&$5|3CRvaAGKc;t272qXtoFzd_4Ujs9yKq; z_G}rD$dSBhKVN7-#cBmtB3D7oL{KGxOnweGj}&}XQv$p^iV`s5P)KsYiivvkrfn9= z{Zxe_WRm}yjiDQURJeq10-ortt<}Z$J#&s!+y7WFrYuqiP3Yk($XFmT5nybJ>NOF) z;^ww$QY)659jBE0x$>DkF3>dY;~0&RoLvt1Df%R#`0dqiNL3bW{P_UyGDY{E2^)w( zujFNIg?#r8U}2gXq5^KM$$=`8dypR{Up`~ZB&sv z7vz(-{ytY+=})xtpKK$e(v*4e`HfrzEf;3j;V*BF6KPkax4pezZ+FK53E^ypHg5>P zCBZ8E_ZP~lOja_gco#DgNO5WSqKJ&!OMTwfie$c}G6Qwb6GnuGmrvt`CTh+rY@d0m z&9KEtYy-d5PUt{P2e))wqk>~-Y{av95|}V+RL>3JW#cpNeVMAGP8&(o(~LLNN7+4+ zLHo!U58bX;L?q*nE_wajDn}>vNFp9Urr^d`ulZrq_5^%dX014^queUy_6c5|w|K}i zj#N*Hz!|?)Z~_~%lf&*bOH*^<>2)X2n8YdA9!u-#e71;Q;BdhobVZN3!UtkO(h(X6 zVinT#jg5dd5GXCy*0rn7BXOx>PIQ1iTw_HdeftF%85WIIOujFtu0MK{BQy}eJkxBM zi2>i9S)h`~>;r|peT)uMb#v8`+3otKo^^Z65fEh?&H9Lp5Ky%wX1pm6BKi17fd?;j zM7Cr^Rw@?cKBFql1T>K|QUcf=R~gwff*K9Vol~#XQkP$w&G9g?<}SUzdh$k_qMMat zV2~w-e)z3bve0#J15-Fd!W0xvsH1d`J$z1oW=w&@Un5oQBc%R zyZD@DbJ|Bm zDYvM8^3JT?=3pxCcsfs2h>GHq_PnMSP#wW@y2ANH!d^&(&64icHCohZ?+0c(8i|O9 zu{U(RSMv1RGU2BmNd^O0#SfaVn9Y#>9Zz5 zE`R$$$}f;(hkc&ls(bH$WPg_t%}cguvT&3Pey{p1O5dEjN`F&>q*^Umzf_F z5d0?7G1-d6tDVf6@ypK$XwEPTM^@w);w>9CHsxh$xsV;w5o2X{6ky}@TCe-uvc${5G zsHYuT9&me}+oaf_I-OKDM_t);Vp(A##p0)eZhE!YY`%Wk22Po9tCHlKXJeGm=Ccg{ z>@7HdBjW5FhQX%0<5U!Z&e2j7cEQ8+=Y+xo35_A8Ff$Ke0-a<{Iyzk3EIr5bxeKjK zjS4%6!@!*%S<)mmcK&dw$#2uHZvM-xRg+#6C}M|vfVo}*BTrPn!Bt#yM+!k&Yq--rS{c?2US|2>7gbTRTXlf%_t@pF6GHf z;UESWysxcxOZraDm@}e@#L77Ilt*S(sA#rGO&HEEQztL|Y`CS(B&Y!6OR87jB=@?k zL%y~&6`$A0rXZE*oUGv5SOw7xxHRm~n~OJSSgG~r;g28IRYQXOb|H9OVznx#;`9k- zAxP-0YhtLMmBZWy)?|!hVJbdd{v;;--4HAOKJOY1eUOC^()F0Xo{LYpIZVma5j+J* z?3RDj-;?&?)R53;yZd7l(soml#S&txR4*?Ah!FNah}8%<1N@yRiM4MgHUFv@=Q+7e zHMZwlj2)mYQ|(O_Cd|>pLf|1rjp;*^th1M(;Qx`U?r#C!n3ApY-!MtbU4E;_c6MpDt{RcC#(oQaF9t>84w6% znETvzuAH5btwHMhX@=Vtbc5tRU)U}C#~y?ybV|gMDzy&#E`LNUc=!2lI))^hxf4=MavlR9?(X15 zCJk@fd|qW%`Mn~P*kZG1>j@5?nP1T~}FHwj48(1g(!6jN%YQxYB6=x32=q!^v zmV!v{Zqf{h3=}+X)IUdWrFJ~n{`|qV2gTc~1i6BmTw&{+CmGmXmH6!&oGte52f?Tj zJ4@QuX=usDj)(h+U%k5>JedzbZ{`Rl4kpcvk1fr@;SU{LCo{Aqz z_))Xp1^*O;i4F^y-ZCjp5N(Qy*k6TD04ZS|VBHiZ!Eo$wg0s>A8; z(5>zl{?JFn!1W^;1kogXk@r8NBI?dG@TGpx>|v&&3);&B%{b;RB{Bot$19c%8jX+L z#evj#dlBS-w%&ATej;k9{jrbVhQP8d(q}`%>vQU(mTXY@ZBdE#hs!4exR{COsSKP# zy#$DZ*HNe2(Qxt~?`h9gbDXrzTZ2dN*O@)b+leCoTc4a){tO+k&x%Ia{O$r8#HI~) zyI&*r$!LVc7A4{r%+8Bf6#I^j0az*6{8uq zk#UiuP0wtBY!8Vgvh+h%(EM8bZUF->U7`lva=npiS}`-J)|Cf>Gu&>PzYF*;!_7C_ z$3v_I4v7JPxr?(8`|O}#3b)+s^G-?UCdxo}k|FO&t^L*3{jLL`bTGrpba5+~T*B=7 zcRa6|N5n2<5t6*|&N}f|wQc^dGbg;QV~@Wd91ey;F*oP3>WJftImt+jbgTjn&wVZRZUd+qP{qPGj4)ZO?aRp1C-8`xmUe_hKMHnh`^) z>{e9CN#wGb6I3TU>cPRs-rcG>@b)on;FHd%L81}vOMv`pp6%n7uZ8uuY!u)-IHb!} z_6H|fXB?Fo=Ec%$%BrNKTKov*_NF61Q!FF~9HyDnw#}M(1;e43bK1i!BfD2Kz0#*; z$vTiPqY5LZrE<{Prcu+T3)%@}<{6rvq>sx!RNyX7aWLa;q*kFPF}4dqcAZ38`ZlrJ z1oqzKD!8UB6P;aqhoQcAb~$9C0qqZTYHkpSLV0CSG(R1}7Hfp_#aF*fqngb-{XiYS z#E+@JlPd2&_fbagTt0Ujt)pDJ!Aq*hcVMQoaVeRktz#J}%_jVTu=mcwC381!D0TW@ zbL{wy+6JiF>M ziyZA0i&DqdQ0n&Z5m&+WKnXcl@-WLr-JJ!t?6|DLF1EW{84r8t6mdrE+x-!^T)|9v zB!Dj=DIzz}Lq)s|G^FbuBKzu5f~cF)~=Ma?!F-^OJFYnJ^S! z|AU;S(($CcxD-XVa^}se36@2|juI&K^4e>kIcC*QHcE9eapdeTi#ILMM}76$9X5`c zp0d>ziCet`=SBUmO*?PDLunL1CHo9X;GrQTBeJ$K&(-!%b-1?Gyg08!(0}JdxN>4# z`?=c$r|_KItv`9RvYnT>VTIXeSdRSm>d&%kJh5L5FIEz*+vnl#NS47l0Pz!$!1m$A zJ^?ZDxzrR1$Gk3oX1rE~SJRuu%{4E{SZf2EVkXEOLqj>M z;7EXN2X0a_Lr}8f23z5r4BcyrsU7qTao^Uhjb4ZA@V%1bLTZdIqJ=EZKB@81yu=Xf z9V&yIaCUGV;YShIi5>^=QjoDIowe^=5KeBPZEQKtorMuqA)i(Ks1E z;8KTgIN4)_I-j?LE~f&xE9r*vYD-t=~Hm?h~(t1Ywr!Ife+#N@i8`VU>!rH_i^AQ z`=GDGc2}%zG^KMfn@J`>JF7q3ft=rMY4wlXTY~inL#3nWAIc|x zG~;E;&NMr622218nXjw}L#Ygg84(#DrqaM6%fEM6p-#5XnV&E1mwb9dLCIw_(}i`r zgR$V$&k*ae06_AiLfkJ4G=>Pi)vg!q9?GTq(WSgI&|Le0XTE#$Wev|}*%w?F96Snt zW@Y)+u@7Drt%}^}la2Z29KP+`$w4A&hgb?5TiJr|j(J>mAt8$$*n;ywHp03*!8jgel88=B>27eBQ z!4o4dTP+|E7wa$Wd`p#sd?Fcfek*^nn$gNjl2uD8t@fWXv+e%_pgu1wCH6{^jGE6X z=lkN$F##r)oQw|?B(xp{Wr-7c&ce(Glf@{O8oLCi-RR|QcRLi~-Xz1>@}z-6C%vCFl^=%zBBBpr6zpdUGGaL0nI3He1NdRTVrJ+H?lQYamk7`=7T%}xNPwHGoDLZs zCjN7L5=q@QRJ7D{!Z_$XJ%1*9x{@iab4(6T(PY+*n4?gO5?;g!JwCFaqs zkbW972SV#VD|jp3>zEIh;#ilBGT}+JCICs|-V_BBM5+|=M^4?@^HeocN9T(zR$g4x z;12xlMETyEsZTin%%5 z*(ov_EoUv^4Ss|MT@98O2z>wDwfLDYh??Mbxl`+@Tq|;kC#YtaY5w4u{OqZ>tC6SR z%Me5;GD^XJ`_>s=P`-eBn>4g5yxkY+0R`8bhq z<5aw}$QVY-NRZEe6#=EuTNB(ueinPIkH{aUD612`9_HzjSzwFcVuwgqC?4rVO zTmc`3a=}y(#S?LDKA`}H^lLHN)2q`R1~pocvO9)59VGZ$5e+v7`!Z3omSydQFAAAU z6+;(R#8IgHy3tU}Dj+7C;Ej}%QgXtdVaO1ScY{B1RUI+Ja7&}aV#vRZf{J^NB0pwJ zT9WMzEyZ5%fzIhm-PmsH z&?(pVdDqLqVlEj~o&RrpG*?)CA}Xchf&5gVYrJqXzi;~0hyp>5;jgI0RWIj=tj8RN zoy{)#hb}>`G(i5}zGnY%hs2SACnX!tyQ2uc4!J=Q1@rPR+-E*%iNAF{pT!1M4qPN# zSb;VOgujBR1t+SlytdyBpoB2VgxMOvkKH0H@V&P|3z#O$5v7^B5peq({;KO#&u66} zqUSfrYQ|&dD-u5_Z{qXduletJ%&yiFd%4u`euyge{Qeo?u8x?q?7gH)2Lm#X@OuZ=pS1AbC5Nd^`-JSW4vbPL!$Sd zmXy;&X$M$&iVbp*;$C$HA`V+{V>bAx=2cf!u`fBoBW}%3BhAN@CkIotnvw`kc>-v3 z=2%(~h^ton3i}6W{SE(mt+KVH3+rMu^%;|m=Pe_cI$c|}U?dW}IC^^Z5&YbxdrzbX zHIjZc*L$5AhAE?QkY<7NLWJ^qf#?3*cElgj=>%AI%G{U28-J`mra9ijp>JEIbt*v5 zBBpI6$f~aB#ihUHmEA>RqF|Hf(F%xp+1-7H_#eUu%Y zxI*t{&?d&iO9^)*qc>w~1$0t3u!bZ^EE*BJe>|GjCsxqUMdz|&*)v@ul&V3j<__*W zB1;_=t9z7vhRV|bZ#W}u82^*|e+#`>^YzaNupl74#Q#s{l{3PC1FCVYWA|HbI{?T^ zYZ6%N^9u|Z?Ls663FclUj(Rpz+WX&_^BsIKBv3O5OE-5_#8K&)C^LE1fMK9ZPJWKAfZ!G12s3X zFc>y)$6T3)4z^ZAfkci?CQj&s6qg5!GTU;5dru#az~?37!{M18(g8%QpvdqhB#d#w zQNA18B|+5_MWVQkWEmYZsSKTy;UIk3RN;z7dIWM3v6Q$RsDN}%`z#XgyBZB(PsT(r z(1C+yf=I?R|Eqtb4ap)!MZ{QN6}OP@`mQRKbo=Clz$wxYnyhR4{S%YlC1v$x@Tk4T0!* zSSI8+?bu`~Fylt{cV9cayI2l->L@pBc4~4cY_J~00K4kU^WE8Z15Dk}kB-Sj{%gon zMx>q&eKnnq4(;wrI;rfmGZ+jGXHeV-XZ*nZuJsy=Wt@_}&#lgI^EYE)jCi3-Rz@`9 zU&u52NsWQT&o8CG;b(7?Q-*0)!T75z=?ZeW{~9(GftergW`ueu5cTxqlS7pG?lsg8 zovscI>exEEm3>h$RVKb&STA!Z*Fca-BjKitQk?K`3>t@ z`(yomP>Imp8BKUBm+}7HdiA19^WYqD>iKkS#S8g+x7v&ck|x-@`@=zzOu6C3WiI)1 zQ>;Yy0q=AI!wuI~)9NP_ikGCE)DS9C4dSxx9i2Ji8D#1Gd36vhAO5P!j8x^yi=Y29N0RO1$DoM2Xn>Hd)m-_ zD8cS9|8iU~pQ5R4#ML2rQ_L-{S-^E($-Z?T0TEVny_z(hj0?1IqTV-3sL%)u*L}ev zE2$_W%)dHN54x!Wf0;r>K&{*2^eWqHB9Z#T<5+bd68MTlRWM)}19f3km`O^q z7g-rVjOxz><@-d?UzPXQrD`qM&w!d<5_o9@fG^%a;jAj|CxT6Er2cz*XrpfloV^x2(y7I|XrVUOs%+R@+{(HdJGJY1&(JAkba^CX~%7 zf3ne9*x7f=uIhfppol}B^6I%q>C!3yf==Xjn3yK^$ZkeWq*hgG7Xyf66X*y{E;SbZ zqm&JmAgh0;7R7DAna=3P>(F$z3VrN*J4F3J*P0DFCCO6+6QxTkI)Ik;rh#WzO3=+u zMD3iTTxZFWzm;B&w0Fx(sA=|tT=Io3Gs7cQ!%a}me|ndmyZZqRFTA zXw7zx&I=ELD7;u#$ltW;NRXH9hi1{QS_Nf4lVXk{8LsYt;C+6wagn=94OX)b1^0VL zai5W`mPyaPzKhabvh5V9O8S6(SE&^zxJOjXzE&6mZPRBheoO+&G|ix`}h2z%dU)U3|7oOki&=Yf7LYi33_ zVE+_7_o-=J-i-RQ4wTOY}cKVQfT;0l19KFIEqU?&FXA8W=OdO<$yv8h8pnNN~GI z6BYRTsxoxy7$(%fKthw{e#DS!$)GPZG{K3uci)x!Wr|V^#=p)@9+7aOcBc3nuX87{=a+r<8I|QW7LP%W*kO=_B(cD5+nsskkcu; znWcbQ3~jZpgoiikKYw806K9GoWph(uGcV=BE*yKCxE1b*usa$ZjVELLnO5GBrn(=Y z#hdc;V1K{#)1vJH^W2dJ4TIk)kv$jK9hpKQCa;qs!!4D3%lr3fX9=DHYQ##_IW>>-C@vBf(9AS z+=S0x3xx&V4n09t8AM8rw|rcU-gz*krM~P}`$nf95vt!OE8F}|HP?IXg6M_b>AnaYu<5uV zshVEeO2^s*TC_E-ZGPFa@?+m?u%mCX5ETJi2p<-NU(@&?x%v>|eHI=-{KQea4Bx<3 zgaGqvn6%R)LkbfQ{pAyOMRa~LS3$aUJ?56%L8V%an_|Mqm*#A+uZO6&v_G#VGGvYsiA5rfvKRcl{L}U?hwD<4tfXD1*u(yt~ zMoKTm>t8O_tfqsfBPfXR8s=U6g>&kNoZnbvcYZLCSm4cgPHU>`UKjXwrNGCUL z6F=IGu(CvbP1t8hE9k$OjLfg8njeXCFwJo`iz&8)okE&vxtCwj$3tIs&oOiJMuGxO=?!-N1(D4ZJSpTwWdUjJ0`?R^I zjZ+X{$bR`v-i`As^%UVhzCmS}7eUwlWr)m9<37PUZ5!l&KcG^fZ7{|l{%?1}q74QO zDANBNHKSU+*&skbyx~%JF8-@Xh~C43Pi3*gKm%9|VNeXU+-3Z!Sn#mDF)U6;jzr_> zm>m}ldc;(k4py}4`8jx6uQvn>Fy zR{e+Q&82A?vqW|N>jtP;(kiX5@OST;!&(`l*=6{pJSF*FPi)Ksss|;!E7tiWJXmN_=xQT;YdYt5XA^INEkhzvRtGWA6bbC9Jp5*8u&|hkC zUICEs#;ee`8jU8~3*AW;ky(2Xwecm`;KWzU`p=@ycWN;0#ACz&6EG@g!p4+?x9 zlwORbCLW%4TDIH;S+%_Ih_2bp1%px>ZAhYN&8rQ~1-c#{bAV)J6BwMGKs6 zQ#d(E|CYJSGLUhfFqp&A;+kx-Xen!Slkz{6?%n`Y~#tfVQa8<+@%4Q8OU zK{2uY{c?G4Fz70$a6ItcEjA17W(mCPd3-WJA)`+r^J}#$Zf*|z><|kZq4eQe;oSuX zR|vw#Zu~7$BJqP!9!3Vktord=(!*}NP;_gS=KzYAB8H0u6@OpV?nEr*k7!B7Uc!0> z-Fu&og(#@NWGGV7QqvG>G;eCJj`VQ~i1a*7G~xvh=uh6d2oR2kDnBaYK`+1<7})t< z5qFT&lh2X5*Cy~xhPuoZM>VT97{_6;yo-cnZ|+^GlqPhqlZdC#hpWI{l;qL8-8XAub?z68Vq0 z+gP}yzBXJ>NZphGcN>M5-dphe=_czYgdg92qq6D)w9A*eHljF}3=84X0yMW?9llrd z?`T0OjSw9@zRAlQcZMwg^p(cG-d_P$Ix7gLNvW&5g81!yU?#DV{7}FQLMe5F4`c_y zdXJWMXt3fr*MH6n`(WRq|26?lrfL7)CBG^D;Fq^AA|Cfn{wDa6!F+bnD_78kHT#Uu zJhMp3eTOf^wV%0)?{2+S=9FcDdxDt`6R6(n*yqvN#!pu~e(?D2js7;6J8|SCGmg!j z{~iYd-|3wB+iMNNBqq5S?2?J>%#^;$@kF`-fZX^;-$QfJJEy?M{SEiqu8vG-%$m#~ z#%j<12ANg|Ck!6M{|hbpngQlvs30I?T&aC+|3M4=J{BS{i2wgTZ0BMqe{X4@tuos< z*CuP2d44x~cRfBT>4H}?%(k>QoW#v}MU#DAX5$Kq|GYa=!6-xhO&O7eJLMhH*^I%L zLUCSVN1=%J>*7gti9wH6nTu2L;e7<**mCmRc=*zrmMgPhZAByhA`xwsuvW_YPfaf4 zZ>C}(jzRq*Bn10~*AzyL!e!H!Q(LO#qO_6AQbk8G+oA8XY!HQ;ujg|Sl+fM5t4ghyCsX{FO)8phlV+FG&|TE49JPsDFw zM1$6tbOr16WcAgE_}zS$8Vi|1fBijRm~@WAt85K6ZualVQa_EM-=T-@GL)EXXfmb; z>|T1E<&EfJ#>1w<4hJ!X3j>gNm^-6gQzT0@DPJ67ofm>!`Gk*0LP({-;*l^4DE6A4(Tq8Y}GAK6C5 z)$gJ25d#Q*w<|Wi?mzidFo6I()6JQ^XwRHW23)^TK|sgq-iZm(b!a?CBM*X_mY zvg#ATm)Mt8aF2yshe>65JP9KQuqH?pyG`#P=FfY~8P)F>$A)8-nw6UJ$U3pC|1T{} z64h(GY+s|VrVF9siqdFV-H1DhudWCQFZK~7mrjWM$ds#%hTo&^~O z`mYyU!&<3pJy^?<)UOgLrhxFrfFK$P*fB6+r(d_={FXg=#$BoGH?m=D0OKm55Ye9r z<&r#J&N2a65xD4GR6_&oOeo)U*Csd#MHQza>sr^8{Oujks)DgGs^i9ZM^44nOGX>$ zrk5wTA-lE|ccun2XfVZa9~tw5#TwH0Zp<^J2nNx+XnUfzCg2p(Ml!oc$ z!=go^NjQ3VQ-N!!DQ)7EX3_S%S(sA;dO>$|xbueZcHZ7c5TQ*B%1KZS& zA-;WrP?a~>xb+*l22|Y3$J@*)sz)IS*VvJ*=Bf5yEyA&Eh*;k%Dh`aCo~Nj6jS(Md zM?A<}{lBEhh>}4s0nb(`K1PfIQX>03TIrYl*w)s>mA~Qfr6{m}zj)vUUZpOF5Lp$? zF8+~RMdH-qE7fNsz+8T9cly3xd3k30+Yo^ByY_y9+k%P^UQMmmf*sL>XoBk|@K$;J zgkr_M6r(4Ga$k{Ol630|7o{}QM}p{7kR2pkCW&XRC{RFC0w+K6R zOIeO!XfM}$deR`-y7>mY>tl!3B%(``C>6B(!~!W_RfC_1f26NW3Qst`pq@aqp%jDK z-56bn<Cb$Xa;G`cQf=PMB9`~JT5OFRK5x}}#M(BwaoQAwZm2+W%*Eqo*CvPwDYMzQ zE5y#oj-sM zK$m0`5Si(ZaNdjzKrzpV{EB@v>6gc1Q-g~k(_0h&8&qzo2$@I#56 zu@86Y)AvWei|S~?24UUS$7*aFxDjhqr`zGMUDOBay71>>A?S(U4_-t87)v4-pfmVN zTi_{_!C!)iS`I&tFdQmjN;r=yuD~D-NHd=Y9jLPiN6hosU3~Bhlr)kiZ)3i}2KP-D zH2rPbHCwNd5;zN#=zuA8a_y{>HL9*RX8|Qt`~SrSCrY|LGhVYh-xj8@T2#kExt8rE zvsdu(dzKD;cOX=&A_YjN3}a35(sRis+t_t?(|7fqXxu!lBUCeXaf?)$3fc7my4Pxy zxQ52Y&m2ZN7^t)^9Uu|j0UakA6w${>W)q~G(lWO8HBP;tm91^~izBluWW)Pk$};vc z`%}Azp;v>YIGLoJpi{RLHZxtUi(%$uPmnLJ%WP55UZ~pE?T5;ZBXF9sTKq1{X6Pr2GsPLj*Uzd(D4vEQFm{h#(vj$LXa z`^n9DeY5cFXHNO25bmzW+wOc#?!v9kJ!lMcIUm!c9Bz+wZ{9P86prph?x5X&!Zi|C zfYZDZ4T4=dm=wbUy#?`5AfMxuFGJwK(pWkO0>2;Muu;J#M#$n+k7qdHyjUBgBUS`6R zqA5TNho$I~Nf7j2vydShD}kvFjn!A^KP=nfW0V?Xitmf#jzPdN(i=r3B26KGH?S@O z3yai7&@6wppHo<4$WsMKP0nC5XcOiirH2e5=D`P>Lc4jB53pT|p5IKKK4zW1k_ux$ z*do0KZNFE_4=Oai8Qg|eKNncNlou0?LO?R$KXVDwijX@Uz1ho&9?Z6tFB?QtcR^Ct zq8Wn7ZQq5$Y;lB)9_&Z1#s-nnN_NCf@DhKh`fp3kFlj}9lYRrrh%++^vu#3gkHI=J_^`aW*j;B()<_x3pl4(82i{!{Npt)T?zue@O5YGhynO!RCCnk=mY@P;l3? zm<^gz?aGKsbi7|Ojs9DAd@Z|3yRfJ)NkKDoD4{d%>&9Pe-{E_w+5ADN8*M;U@|)gv z&Gum4b`!8`WVf*pGAjJcMii5f^fXYQ$dQ$6mSU=zYX1YhhdndT~uPD>)f-c+^i5By6 zn^jHAvVzaF1XnYGkT08sR`Oe2(XUV=3G?@Swe3y5>OwX6 zU&Ah*M@b;|)jnE>cXyITnXxhyZ`wA5pje>Q*HHbO1n>q(=do|eXTFQ^9UA!ZEqS4j z^MQ$!nOQOtIW)2h?Ql0@L*?vbKX2jX0DAq1{_n!jnZQn{zELuJ#eg+(NCtn`(sgm$ zv#(OupHjD^|LI;(b3c*`jeKXCagQ^3RTWch!D;1zE)D1ki1`-rs^!g0c1Om$2ORm8 z+%)%|A?isT0u>`>@}U=&nR9}w@}ak(RG?cM0{_ogAgNY-xXicL(>=vfz(meTmGFSn z(lrBG8(M|FTonuZ?WM9oo!X~*B2FztiR*!_``on;lCB(l-V4<`=pAJy9jD6}vC>|W z?0@>fXg#JMcwGu2$vFB)4PoZ{$&_Z0t_HEYHya+Dt#30fR7=vNKWMOXhk7Wz|us;xu>B9_yzg-&{XIWU_=%%2`2q5eq{4|l$cS1dzDYc{^-T^ zX}0}mXLuoxrxdZ3Wm`d$vyvHY2)Naq4lq$(=<^xR@zIk0dR`Xa>>U1+H&s09u>FH; zSQ90JI01WXKj?!tEAYoU50mX#pC$W;e#!!F4?!oGO8y)IJ!s5 z?g_dwD1OTH3ntl=*9H)_9ENuzm-IlsN$nchxF>6oKxH6H>gTLVjeW0i6PG{kleZ*^ zTjRNFzJhLr6?CKoCb_BiH-VEG9wO#JDlRHaCkmG2&KbePo6K|lUWrJQ*ncL(=-JVV z&;=n(Wl!#~LhnIOIHR!?7I~W^t=QCf?6cE7rrY41trPdtr>>tP*E0 zY4ukQub1T-Jv#f2cBmJj=m@dmT$LS_mFJ7vkg%mEG0D zB8)H3;kv){mYd$BHto378)t>y#cF%D01Q2F_qW7E&cN&SMQYC9Sd#0e61iQaOVz-@VufF6|yNkg0Li-?Qufv~r7fz+;z-ERbaRf5MIPirj!_0d1It0&?vS# zR`wSd*e)vEBILw&Z1zowuzc_K1M3UT&%1-)N`z4c$)lMbx4|XY-4C@AwG7>yCA>pb zL{%hj&3G-gtC?J%L}gQXNC7>G))_yB^DEF3Yu|#q+Gsl5dNhjPrDuTJkiqtfMdR%! zOu_xu$6@6M0fs$eS&q&XcGP!d5aqSLc-JUOxB6vUjwLn=s@p-az&V?A^`YKu_njSfad6-q+QHT_ zfq;ADb9w-ghOUc^l?*Iq zLZ6Ee$$Jp_FeB{9jm>#|f8tV>Gl+K!U;j}Xa9e`-y#dB|XumAMm|8>dW8oAoIEVdN zbz>Xm>%Aa^5>NXCxB_L?m?bd$1s+vFcQ)~J*1_X~W%7@Q~0 z>Hcuc8LiFT^6`26Ffi!ye6k0EXK!+1xK9_pd5|F_dx->X_;x0d-;Aq8yM;f%+z3_K zOg_PItm@%g2(8FgVc?JiSV>|WG?Bc=O6ax^Rw1ag7hZ0Db5U3QV^?Qyf=W7K3|nk( zhx3@3BZgD~nh6JWHq;GpAlXoLg?gnSli(jhe!pCbvEz*!7^)d?f;K2VMC3#&|^a{ZzK()t*P z4`Vlmzp=9RsHfx0E8t@byDiVe+~(bK{qHg_7*XATrys{%!m1j*vM7~{P%l)EHJJjp z$`pGWf#%t37OR*IM0x)bOq1z^>D1-5^fV4N+ni**plxuK{2R%1mTg%{j6p!*4$k;H zR)2v&xTNGbRC^nvDa(-->`WjsBqin%bNa8D6*suqI>2N=XP$$v;>uU?4bapm4@pPO>e*_Ko(^ z*yH9sl5Lb`bVDEySXW~fOD4Mh4uGti0BXiGBo|-1~rX`2`^ht;nPnMZe+L5e`AH* zIk++FoN)T!gpok*;8M`)TzBxxP|vvYU(_RPz=4utLN|o)=UoqfC0R!F6d zA|fRHZoeR&F&HlSMS`FstY2z`V(h30XcOfNf`jX-i}~JoOOO|-DAfKA+rd~`G`oPo z^cvEDRuhmGDGfLgA?cd;`_1_ea@s4Oyxij5%!Tv)-`0D`d@P&x#j6w-=3xBBP?)B*h@ z-{(D7+rvwdiriB$;|T}~D3Fp@H*E8Uh5>2JJ4ENLtq(*Iy|08bc-nljqy($HBCLuo4=Xs6P!kUmh5z~FjC1_?v9ze zfw$Ym(818u|0dmDU;4O`CVgLl5q&ZwOfZZLSl(1yEL~GCIep!tU7Wc*`k1q8>+V-& z6Q?5^7Y**1oSiE%`uO;;CjsAj_d%L!FL^xGz6;$BCbRDPip6+YUm>YXV-c$;KewYk zYyvVsstBT`cBAt*RLL?cPWPo+_iHO7$}1MXLP;Mbusrmk21Cx`63zwWG0N71Ah4#& zYMl-UbiI^B{{^9&HTbgX%Qo9CEEDe=WlDFVpCt)LiUClbPqWD&9A?^^s zDf7Kj?7?-1*YMFdL*56VB(KEXO`UrYyX1Aj8epExT{F5YMlinWR~F6?lE>uN18`Pm zA#Pyvf_a=)_u3)(AhN6TD62b+8^HqYvGqp0tL_Ds^={NeqZreIL-CB{1ad(3LORb-(Rtp>F3Ju|GnE1 zK{^^?1Vn|~R4g=(4t@@gU&LD~w`OLIn4HO5fMNZXdH@&uojIrsTKYV;D&bb!(*~^? zfr{#qX0a=a=$yWxR`-x-Pt5B;s4Z2Nf$jk|MJ(`I9pfTSHui9|J+Crqs;y1J%wh5v zIypCKH23xS{;UVgIg}LjglEFy|8NOlG8MxtrSu(s)M@~-=f*T z+skBW@i$595$|)_urh3AXlRV2WY=S>NRdSwAE(s9oT)W+5%08n?n0PKlYHSZYuP{U z!a3_jwu^vM|K~am$2~{;-=-uwFYnCmwIEJ~=F)oV`>+8ZJIO4)m$wXMPp(U>Z@gvE z${2egnyR9wa8z2aSHMq<`><29&?<57AYOu2KMd& zGU60`@C}vyA?=;_+m-ccECk8^Y;N4qM?m?x`}sbA*ZeQG)}fu4NIz5`KhHKUd(m#g z^fv+-qXj*{Td;?heZZ25b2f2|d2$T_(Y+d|TXxR#0fdy|R^4L{;1ecDCb%EojW<80 z=1HstZ3v4k2(nEZ9^_$z)cEIdlemsmq^{Rk#|cnylppM_VlYGg3_83(S2|x5-q2m+ z6B8B`bo_X345RxmW{Lm{(*$B%*d3r2;b31pb2=1~q*`klSNY4)ZHLWu;i zA%$%IsGB~F^Dp#`j5PW)Y(3M0!bjE-Jx-Ge#tlLmV}-Mp04vM_y>WCvBQO(z4lV3! zipA;P>J$-L_^_9VOTMP(iF}qhz8s|P>^ZbPdwjgA9^euvXzcBT(jaehwZGvg(I`9h zLaG6nER(X{8BydZC@3OoAkF%LE?r}_<)p8oQCrto#Wz0$hmFfe;&ln+<;1k54jiA1 zfSa+sCH+=+DQ<+WS%BMIFUuo6R;Il6*tj^@fam@j;9mfprnb+6D9vj*9N&iPZ{h!o z_sNnl8v2I`#{JmqT#Ot7ih$ z%C>O(b)mG^y%^c%!MDrjh6VcXCH8zW9EEE^THxzJm+KE@3P!u>Ng(*9vIOLHAO!EM z{;@W~F6aiHkEPk4%8T9^Ff2Yia)wrtqYm$@p?rJ`%MZ#5xu?P*BU1UXY1JwQ;I@js zQp20sG+?X{W?WD<3l7Xa;_zxyV?#g=vUiBHQ-|g^k1-xBDh=_&hI+?(P_(!D;-W(u z^vy&cjHGvx79zw<@z9F|GjcT^tw~>dc}=D{&TzqTIEDb!)39tx3ffo;o@Cx$P?m5n zIe zryc0atb?91p}NK--pAIcgKE<~N$xdZ5fGGqMxts=ePTf$TxoHb3RgJYh};+d^=AN6 zvMhfu(D?U?+hw$Sjx>!sE3_4QxyhdvSi&7eP1?X~p3kA(Kjz;(j7frpGS}oX5LdeLsdyFA&`iLrgYBB++R_L6wJ|Y$m>wv~z^2*02WL6m7*W)RiF4ekC)~Sd; z^B~J+y6~-(A3w{81bjXwO|U=Fg92c)>F$3{jASeS@(ByzYyV})ixOd0k{^ofG4=*K z;)h=FntI{*CI8j2J>rGBy@HvW^aKw@4S{>k#CPZX9(AB{Z^;1+9VG&EgPFOTJj@0%{*v8<^-i$$Ij&g=~}?gAc6ou4>X1wwryTp`YathG+DJOaijcs`s|y z3020~XrieWkcRKJkFR&*!Z;Bwf;jcCK(ZjHPcD@q`aFlwqsK^F2P|j^+)oAs zO(k@Mgo7ZU_^wXkkj=ay*u2FYcu9Zk=B+`?)UU1PsxJe0Rw(Qk(m7QkQV7A_!nqU) zH9Z{_bT6+~u7iagDB1^qA0*-VFQqX=`JvaWrA>Kw)CP5pE7sFYgnUho+~ssqC#@H- zd1Go3nkoys+DwqRZhxvT|4fleAeCm!udZyj9%hT8ka7tK$jBSFKOzX?s9CNMqXT(M z`Y%pc5t{?F$Vox<5C01z@wK$t(JMHo?nRHRKo0dClRAvPmT{ry$?b@tdwL$zRNCsQ z(_uzSbThmjA)#K#gk4#zTX%1UWE{riKYcY-jS&%>Q1!3aTylMsF}+6a<#b~f)aYjr z0y{$tDce*#7#%xn`J{-&sw=~fAr;$iR%NCYBCDX`fkVc?l5rsUl7s9gkLPqshZL*z`=yW?rqEwM|i-3OfJXhkp8>ht) zYf7q<_>f?--y?!0Brs18O?o2c{d+ovRYVe)>XR5VId=#?25Zx-W{Fw8eb1D%)nj@g zA&C&(AOE5?6yMH67KLtevy=dvzbt}3t`l;cAXkkNKxN|ih5!>X;LTeuU7tQp8)nd6 zWS)`f^|X*g$8wo9eV_#iMb070K4{Th1BYb2h{c(5@awsmqz2jy7b78nBH z6{(LCo2+w?l62|cC-1qjai-||^d+(%_j6+Sm8-Ndk)+&R^Rf(8B5Cz?`yHRbufbAK zqUZ+_j^k`!cc7vt)5xxqUZ{D1ssF>(Ikjg3Y*{#F$F@7RZQHhO@MH0j zs&**RkUom@CS|M+f=9==K+|5}M#9jdvziq+#d+jC(>N^Z=KWU9_9jCISESeS;32Ht zD#Pm(RrfGU1bTB>>m5`6C*L2q*duR>&-v_@b?n!bo2~E!B4}voHREwr6~ndoUnYye`kMY%eJpw8 z=FVEF9dA$9dgv*?$Ctl{f)^Yx8CqPTGvJ*r>Yfwd@VNA=m(|54)O7A z1%1WJDy>La0A~;yrvM+EN7t<*#o_v6(M3QA-Fh#0Ru4zNK1_^1)<^3b8pU06p?EBh zu|5yUnmINd>zQi0RrUAn{t%D%$1(5s57M{t5LKS2LBgkR{%lkMp_7tqg)He7WGh5Z z97<03Ss_1#%ZfpnTqojj>2O3-f8INAOXE0X-N7=8@3fJL2;hu`#UV=}D7LtPKx;us zejFJOUy9$OQ}8AQ^62Ot*eMXQZXRhwW5}3oAHKU}E1FzxI_M+wH7H*zQf>v|l!PH) z15L znl0{csaNyqbztxK3LTvPbndz^Xi!aJF&c)y!C&yMcviko*-Bi&;SY$0bIVbV+)m-$ zQo_@%g49}ZTQQiBRp8(W`aU1-6>)yPtmd60g~{KZv%l`NHSu@{to=3HuR@2?oeA@} zG%_J#as?R0!NwvM!|}jDEby*-I2Gig$|{K)%wo|<(HS`B6eAtLBn)nG4fwFd{UyNo zEhJq`*J*=A=v_AiBavuA9TlX#DT_FUAf>WE(s89}pZnEASlWW*{yCygMVfQp?fqc?D4RM&|v{p7B07Yk#-qAvcZ7{3D@E)uBP`s3Kf4>m9qi_CaJdqg$}1Ko{J|7 zpWg301{<-gbciZq!q}t6KU-uOGyXK|qj`udOpVz_-@OobvCArstI+ncv0YGXh>s>U zv`mS!AlW(75oxoj5&vLjHf&S+Y$fpE34j{W%u9(uIsDnsT8npAL@5cfia8{sS>$UV zC72i%GK=Ruw!t+X1AWHp8N6_qW3`@&2}F4$1#22rK(2iW9j0~rIm*fPLd6v**G0bJ z1p1K?kU%?eX(QXOY!k`kB4N#8GRBN7bOZzzPQx`wR?Mmi(Xg8%h>j0~o$Iko8-RGz z`(<7M$FoOedi1qI5dX%3!c_!ig#R0#E?hrSfQrkt<|^XPTXsWBRlW`zND%!@@ojEc+4ZYBI`N zvK}glr>J6lmu?tWv}4b_1#er`4Zxv9k?bk1!dU@d9s|Y37w`0-OFez)@KD4tnH@bL ze$iz6%I|(2qo>wl(CLm-lz0DZb&=jw+_{rBmJE7GWua)y*{Q)x?qFO$97%ON+z^m3 z-(Ug>ech~wA)Gi!W`xKU$CLzFoE?Scux(f|k(<6V<~yN{S?{Xrf;Qn-46q6jhca-Q z?U5N+_~iv`On~&K2~kbPRIoNlm3hv*7?|SRu{mWOV}g*KjU}_@%;kz_q{V zn04D%nAgwu5xxuv|Am`d1$d;?t#5VQ(mbT?KA!-+bd7ICTo|#}R;XIqx@Hh%~s8dqcCqcb*C9AKfd4c*$VmuCO)k5e5OV(5>>8>?3d z{?%UDuN9`=^Uw9(BrV>#M9?$IICu~v;86eK7>#+tMUq0?%eRja0jw>wBL|Mj=*9In z@lm!Q2w~Os-;yL~^!F z6u~Y^`p|gt^^q=$vP0};bojC%AwDiI1i#R{HF8LR(7mCs`#q;Q{c zk~8g-7n^&)1B^K$rBIgoU15D{l(t<5hPi#NcN{3)ocBDO#Fj-t7WvqX&tj|@X7>z) z2{kbKIFgwMAPK);?Gj-{wSn|{4Qh!Dv=LCaj}oA0Z%RLhyt_umw9>}Jcu?tUQ@hF3TNg;n8V zOs>lSfc@m@05j>J^v}NqqLJlj52=~)U~>-X9_pMkZIlt(CCkqUci?-`4tbLT<*4|B zMb3s_MN{J4e1nrNm+NQ>l`}8mO0;JOuk>L(b}+x(u;w*jjotXqIDz0>3kp-#lt=L66!ota;>LQez6?qE z?#V9e$2v(|K~9pPMBb`;oSQ~WdLe$_qUM)wsZjqsM-@aQ(>Py2ZwzFV+1MXw^#}-w zD$%NmFByLl6bC<|Uqj4%AZIbq>3C6%ZU>1?Qw-^JEkIX z05AegQV#`Oaav^ETIZ{5LbFyNRV5MrzvXm=)?~vuoeWrm?o|||W@Wh{lL5byrw9Bx ziE$uQVIv{5K|Q?cSZI#2p*%EQPW4y}HjVNjRV}oGqAitSUa0kGIx3!SnltpGvuqy{ z-5jUuc%&>6*!K>;j|{v5?%X5(D4Q}k016{cH|njL(0}&Y)m-U&&_mJ{`{!z73soXq z=A477{yfyft%$pT`6)_FOiNR{cxq~qBRih!WlTL2ADbQ3rmXLi0FCFD z1r6h+F|fAh9-hfr+0c64nGQikp-=$|p*0Y3-fC3l6nv0NNfsE(g-*)VRh|$RAT0db z(FBRv)LALOy=;QCAYCr5D)_ZSly-PlaS4&Xtvu|Nvz8e7@GvL%+TfyM_k`u6h@j#Q za_nY89lfR7Gq@Q7dUUrRM3A7dq5NqvN;TF_9E5WmRIu;hpYqwiiz4&LkoEJpGjzH) z1?iSOxl_UA1u^FDn3PN8>ITXMw3};hsxf7+nnRN8VDKG30PHAzHH2a-GHlS&S zE(fE#>btrmo_5fck0L&EO1{-J&vh{=6EpU5`(!`%Zl>mqZdMFpk&d|Rfnc`>*<+G$ z0$2Qc#*(>YTsn?S0nU*C4DwrK6w$pFCpR6(XCSiuMB2EIeWR6Bj6c0~X;?luN4{(} zx>>cc-Du8~j$tLwSeyE2)4o%%W2l8GuGTOhIfQq{_M|NKr|(89kCk+kxGg#`4K;?! zRdze7)Ah;j!Rg-bx+T(n=a`sW3s@ z18$N#u5PxS{KYTyJ&L27lEo1thk`}1Ggu4u+)$OGq}xjI$x=cnf_w<71uxvPl1Ig) z$0PE(+N1%m9E0+&dbqNT^=*&peE|h{F5VY65x*tGI-&glab5GMWV&a0z%&K_AY=MT zaPfpTIG;!C&QQp46<73qngTgb%lkwGXjO{lRCq-cOqa?GUNX!DEVC;wFv;@{UhrkDs7=M!d@m zlyN}DaDNT}LP%(2&0IrAK7+h}6JK-X`yx^^w>*bEoADYd;$`BjCPT?fCGJj@>FRid zk`0?<*_E_#0q$Tpzg6^Yf1T>W8g#LI4gMuu$jbuKbV(<)iyX@ol18R5@}H}MyzSZI z8pTEcVNCrHYA@rA<-2G~v!{=@CIF;BA(eGM35-Po&e{aHT@j9F?%HEc9)W6P;H0DS z`u0*pt}pa_b2z{c)qU9KKYmuyP`<9+<^S4~J4G41R_6Ip2LsSJRv#SOxL2zx(g7%J zNVb&GmK+a4*qB(DM|Ba%oa9tBHn?Z2V&uce>33rz-A`2`a7Ke4N=-us|BqZ)NQx9xPF5&Xh?A9A za@b!Cixfn%X5ZQCCv#6W$)Ukw)+y#@xs>r0Ae{+rMI$0 zDU)&;R6MY&O(rM0`aGIZF%^`L_q0_jsDbNpq5sQw_fl=Fmrt3%^wN&BIXAu6*m;}zFJV__mF9AtK z!2|Jf9t;8cC-3f@!k5-)NZsyK_tRBk?hw4>(1)>S2%MRowzJoi5{Aw2)KKMTps4pH zR*(Ze?UI*>i$kmDk+cd>Fv;|YZQRK-`?g& zg2ZuitE{~Xq2BfX+c?Kx0|(;(1q3vU^}jJlN`S8YK_`;$Y#m`YlohC6+o^8{gB@M{ zO4b#`xECn5B>|dNp)nhBMPf2ukp;keHa?kV&52L1v;TL4pUKyC45q+GKNz&;Og<3xEA|>7A4hJJ5 z55Q=mQ}-k{i-s>QPN-BE;)BQzJNb2{PTpUx1qN72`f0vygi9bn&ytI5qO-@!HQ^vjRp_ zCsIoX%d*SA@T+7vZY8nn>oMb%D#OaOA$hCpI)%w+&T@z;DU>ZCH(79EgkCBPG?F|* zl1yep9co5Xrzhotc0}K*&=(*caM5-CE0+xpFzz-(Z6JcCu2dbM*$7eEAHO40H~|P` z%l@Q(Z2Ig}aRHZsFM$49wp+}Rqx)x>SK9VR!B(V5w+0nV@)agly?j2#ya%X7pxl~PWG`}lFn0=PR9_#B52VJ%0E(7X&a zoL*biU`fYofwEeCS1Dc&LJNp|Kae^@x-Cy<3Y&0fpsJQoX~+&-|7HFd z;kyxWMkKFAxu*AOci0gekRYncpo&Iqn69TRflY}>v0PR-F2V-gz(?D$2MCc5qU^fy z>M1C!AaM`oRkmMwyz2`$RPopU9R`~FHI5SotGvzIil&JvG{c~%8=Tk3S8Bbvst}sP zQg6WCrWKNuGWl?26Y8<@M27vC0ybOK;Z!)jdu66HR(&WUrD9H_`RO*7qQnAJpd4{;A z2+{}2`JM7G$p|MLKmaL@TkB^DycT$lAI0bCA}QvA>Ox2oy`KD~Xb_u?neD8awX*9* z4_iRp=8`|l{K<$}&*mTk4u%bsY!wwfi#Q_En~SC!?+(=suPkbN15h3wP&;dKh>;;! zktwq@wV7JMa<3?3-kAx8vXmAtu|i$W-zlCJ7^LKSUtEZc77FP_^G;Dq-RtpMDfC0q)Opz7R)!{ctn1m06P9L4xTJ>j!p*}-K%Oi z5o$siT3dta?k3a~ejI~1&B^Ndp9Vh`x2=ltY`(Z>tHyta@sC~Bpu@Tg`QvLP=gdDQ zNhCCpcZ|?Q%2!NI_LP3d;@~XhX)TuFEarKDh>2-vj%R1BN)f|IB_11EQ1h!p-roq9Arb>?hy#G0L2?7_f=ZB~1`yK=XDF1CK`sVGup z%m2Yh&d$ul5DlQ4lb=>MumdhO=Eq7Mpo5~&P&L_d0VaNxcS|&+n(`{NRZIK{f%;DD z;s@FnTz|L9ZqnP}$#UI8Q-wwYCsXy0eI0#^x_gMxBN5USZcj8SsljK0#j1k`D2{#d zdXMn&ECjRPfK`_X?tfi3wKqC;_HU^ZAKp{Dcm3%gx$yzhHwgED6V6w&epAVa2WMJj z=@sn^01SY~C=s@l7rsnBWDyL&-TW%WUZcz0?h)CFcURcq$1nW(6D*}4wJpf8x(usc z$Oo%})@eGxyyLzUr*$VtE~1I2zK#IP6PJwkH0dSAztR-!l4aezl;VZHR?l1#qlr*5 z${bb-94kL$SqNv#L`9KF0j|$ch}XBtz4Tqs1mJB3Ajn%caR?t5*4aPyodGrZ^Uq2+ z`XoJ|Xc%kK<$>dbnu#~KN*Z8C%&RIiCD?W6-x?Wa>~&e}j4KmoJZ``NLnnZ;OA`5%3L?ItJ8Hj7Sfxt$KQ4H3;pFscA{8op2DWpw z0Z8XQmYt=>QOL^Of6m*lTRpx|+Fg783PB2y@fK=MR!!Fj=YODe5*q1`313 zPvDZGd~N^3_4en`Mgr{Zi+ADE0F?&1&dv~UnL8L(gvcd&NE$7-gUIu`$h%Km2jDNQ zd43d%;{H8gEQuu-^ToV6gFs8s9;-2f@uR~pdrt1bPlu75a*_n5uNZ4ssotwPg^Ydk zj?`&m`=CttE_Fb{E>+O$hG>Y18^r^1jT+n*;H@BbSv*<3iUgZCK*yJ0I3?jKS`?bc zcu}#10BlCEQ9_8=Uqe`jcJ~9Sfc;&dX_{$KzRRg_2V9*L$}EfqC&&` zhZUnUh1v@Ge?W)dW}n&xC_q3tLTQ9^|CEf5r#+5%>Q7!?p#TZuS;=|>-joSAgTML# zuEZr+YEw|im<4*4XhWeHds&q>GIRP3-%WW_7v)-#CUC+8m!4|R!AmTa>BgdW!pTPM z6?V#r&<%p?0!#;+>skxd$qmYe&Z22Wq}ob~qwGd4)p{qLudt@R{>8Z$(;D#^O&s8u zR|&QkWnBrISA9*lbJvB%X`$|fmm8H0+^ZG+%=d2(Q4_x!yUO?4#zpwX z_Jozm1*Z4jl_Wvs);jw=<(1?TJz;>nadH-rZQs&*g7xAKx9NI6+xxp%OP81NWqR!r zS>k<}h!ZEv@E4pNUwi<4(gf+Osb=7K+Wrt~#*3I*{g7EFqB57kJf=p1f>y)!~QfVla**H!kPs=;%^;tKAH5LGBOM?oq^e0k&E-Loc+m5K*^P zQN|AtBrY$W82-qCKw~UqmI1(V$!@rSui`0()R-h?bCyiTNOp|D{BlB)2b+S$>soIn znWk{HTUN!%)b3Gt#qe@i*=S6C+~ai*oi7*C$}nNER$9e~rl9Fz)hfEtOmlT)UN$_h zrBtC~&l1C8ZhXn7Ez%Xt47!%68~xB23H8<6fY6QD&&eF;;^11TA^|+iH8)Zvm$!j% zG1sR`UyCm@adewJjC3dh2s_hW#C~eUg1eNFU1sr(K#ibvIW?JI5VdT;T6QzP6cOeb z36+d!r{oNvB-+H0#0eF2{FkT#u5i|?D5MCvj0OcJ z!fQnR4W3O_vHl7UQ*teUa1Ch;EZYRHAt}Va1g6{y)IW&tzuU<&qbosIg zu6`qFr8St(4E{D(<_4KT9)Qj^Z&cJy7@}WGp>Z;2R^C*B&kHv*d!b<{-$~+Azi&b zy`91!s)`Ya0HOiqE>S!&;HYHkTxz2tks?eN10Gund=nvpZrmi8U|3^~foUupp-n^~ z;{lG8Q^VD5R|c5uht+T_=d>@FiSKVq&XMZb)wtcOfyUEjM-gf@+NdfMdBfZ`Il-OB zFsoB13ZoGxEKNEcf>bLeDlxodtUL#+?f8R~XSZ)uSb4y^;9TldGu0@v3F7heaNA~d zYjyA<7O7L4u=)^@$+^b3t>Pm{iEv+{w27Zu{-X|5NdORLq}_OsbhA1 z%Z7Wc6(`%z9NNJ}AlM_v2?WYqj4?Ym8&bcn%sCv`;vjv~wd8*ies!;;raa-TTG>N{ z08Mz<-2sZOt_6z(V&+Q6nLbAcMv{L2GiAbQEU`5*5kl;eyr*jk;J$Ke;r5VosHOFO7$(RVc7{C_U>;tk#|LZ*@3B;pb4bq#t52j z`U`L!!jums^O8n}m2I`SM6eS8XJ~vBQSl*M z0Sk9gR`q>lZ&LHD}gN;h}`jch^Z3vryBJ-G;Q@^ln*@+;2u#;H#6Vq@dLCXnwQsL z%;xH@Jh8qu6>jr$e~=`-D5d4e?^3wC^0s_4s@r4O&hhm(dKTf06)Fv@DlNY$QXj44v6X$Kh*N(&dbjv|?9eg5ohO zOvBd8aqnz3C%?Qv_4b8u8w-QY2;O#QQK+1VfrQghtu)a$Db9)Xf#+r*P|wgfGsBhO zD4mNq4O=vY8ebI0ac?BZ;{fe}eo0XoByS*bgdygfBKwUqnA%D6F9~ytz6r*|vw3!= zmRZY4c&Q|W>9E}y&^PIyZH+94Z8)ym5;4GTA-!!Ox&cK<1*@AonA6d2Y8BjxRa@8u z?t&4wfiP=9Q`w7b>lF`}uLlb*gcpqE2yE67`uN zaTmsD#=fW+5?4lO8RgUgb;z+mDtIO#D$nQ$!w4>f<47tkcNxhoDR76^r)C{c#elMl zP#YDeWd%ea{Q7c)Pr&RLhuak+t~;|#&U;X5nLkwn%krB#8E#A0Hrd)cJZaf(vUoW1 zz*ZOsiH8Vzm#7Fe?FJ!|g~f#!2Ahn_ogl?8PGf=kLh4F^>0>tkP&skNpNV1p1`80y z^D2Em2XI^sHFS$)w$agIjuCc5?V{U3GZfNflkQ$@{+6Q`O2E>_34+u55i=~Z)Uf&# z1nnlR?pzjPVatuf*{c^Bp0m?H*MJu~AUk*3=m7BEtp5cIHG;V+yr$u-e}h1q3fh1k zB}fPsX=6lD4_Az%@~G$?xuL*4CoNhoxa?C_fbu}!v9%ATn`1BS+hcw3ksPAoPJ2S= z_o*dH&U0ck3qVI9W?53oVQb%Y=A8;-esKWuJi_fY&w?Y+2$xRX71Cf9;`M@pT4lCBZI9H4tfSvKmGE1)-|y@O`K2}HHn2o~Y2gmfEKox3x4r81MXS5>c? zqP;|rxquY8F#OhIU8x7vPjF$p$pEGjCe*6oDbZfD05ECu_|adMu0wEi;rA=I!d}L) z2S4Skw);X^P9rTrXKXc@JKYR*?XNxBPCr>WD}-!Y5%S7j+M+r-8wuk(+M@gB=4Ixp zK+)O(@zpOsAp|5!AqcJv{MjDiNU4;oJva}Cy?aVSu!$nPEh_Q#O0QGf4+Exn@RWsQ3t#HGh@f+zKV5RuP`Cbbvx47@Kb{ssCToc+BIsw%yHv_+ z{V==bAl9PiL}d4KVW{&{U9sR7B&JdmEyXPCeTzXTMr2(g`{U=J5c|py;Z|gPF#L+) z*H!0XR7+hT{b44&2HjSeiE19Jfk(#co82oU1c-{OCEXrDZ;MwK{lV`w40t_Jb;%1l zm7Ww4-BkHO|Hh|)`|RP~Q#xx`LW&pHL$&`_Ui1vaH^LkbAV$KswG!R7qTeurq(lJ= z#FSbNE4LXkNyG&DunkRW;M$HIi0~n^pEgfCRrG!GiTJ30$Pi=ifSTqj>k(Jl7 z(?A<@Gav#o>>Ec2l;z!)Gl)DbyG#e9aG0I&|WUk z@Fm*!OUjXvazmLhuL~(Na+QCDouJQR?lk_my)$9~Kr3hRWEVX&lM&*V7ctxT0C{v0 zMaK;DQ7Mcz#MSRgE+^eNF&aPVdASZ$`=S&t9J&*ui1lEuVmvnJ@SX5zM+jf@soAj$ zG`$v3Q1QQ(F1Ovr92qz#cF|$C2*a1B4VjT2mRScLkQd^d9B^C8aWlJ}1+R*Cpompe{I2cs?P(HbBM`{sD@8~WKVR9iqcyOF6ZCv zq=M9|h6gWm5-(segow1->MDTcJB`MmsED*Ufxhtwh3r9__#Z;Ybvp;40k(>YZFwm;glH5)SWK3=M zf0ywnN}H^vPp1zV%cmiW0LnbWLkOXd?$W6@<)ceGRo4Q7rbSW_^moH`H-1KChZg%y zw~+33JDs!0`M02nTFiV1pAS)Kvl#o6YR=!uzA3&b%UxIVL{GNdK}tSvM}Ho9o}GXW zKejGj7D%s)!{nvs$o(n~^tcf?N@JvJ&E2K~^8^vjdtynS%uHlD0aima2r<{fPW#lD zuD2K~-fNq;EfVTj9VOhqcUgDq0WsI*{S0G+G==UR$|EtZ-Pe+8@M70XkoHn`);$Gn zWY>e0N>{pDn{(8tgQ|FGqmn@_&|-X92Pj|y96q8Uv#4*X$c?C7E8;S`hVd~3uW@pX zDv`rEmjN+_!EvUF(uZ&}OZjA&~XAf4d>%7xCYqR+!ubZ0LpWQAa#5H?N(K&5R3|tXsHJ^_GL77i5 z2%74F3r^w@)3BP_P3<4>w3mv5`;#_%ef?hd({QipxICo43+9ZUg(&dZe6pbdbOJ^@ zlNAKywnJ~A0BuRV!8IxL>zRz-;4;@UAhGN3+y=#voVKF$L&780(&W3`L|zA#@wn5) zrwV%{?0FIQO_UI1@0V@%3A%KX=_7}!-buwMaZlCY{ivif26U;LtfHB{X>ul86@jkz`uBodt?=x4} z$@BIxkNk?q+b;I;o@izre$G~4IB>r_FCq5U{-5oKg2M&{ige>Z6eUpeUj>w&3WwTB zVWK@}2foH}aplf_3BgT@EXZ!m_wWrT_n#X78)?WLsH1;W@gY(o&-~@a8V@O^ka;V> zZwfC7_~AJcPb_}*45FBtxLu%c_6V)oA9h!tSZ9IRTr5Z)SDtdeRnHU|Zq_kka%S&& z9x&&}Exs7s+ll%85vdk&pKOXCBczTml=jFCG{^sq6%OZm7UY{v;8f}ov%q{W*qXv3 zPJRl1x<&k{HTUZ2L5;zy*R&wd)AjMw8%V$h=wt{wjQjeU5a!j>AI@tiQ;kzaU6X=H z7$aDfM9iALD1zu}o4dV1<%2WHi_jVd|G>PHTM9%SrkBfj^TW?GCX$4Dq}yEL;)UNA zx~KLU7Va2$aeeGuO#vC6)j5wi8)f}?O87BY@!!GRN`#$1>tU~B>p@&7o6VIYkq+_! zKxaSX|4nrC4m4V1%8WQ9DBbCbjL5;9#hqr^T&(7{F{v^Of-G0F-E996xtmeFoZFhJ zJw7n)2%(R9iZWaaYN>b~j#D+u4Y#))FA+?hAh;%K?gtAm(Rlr&8|IaA&QC#Za&Mx0 zlop=0w{`iYSi}|NpIm4)j`7DhF0u0uOf~$rOxaPF z+Eup*tsV(B+V;kI*Q9xhwOltC71EXJYX^Kv$Ta%MY(>UM`{p7|5%22%tt;D34pA>4 z|8L$W+jWOajt2zPVbk`H4XpzVI0#A*@ywdKG5q%+rTQp}t2%?9(icB!%H#8!ijhBU zaD87Nq6B6=lzE_d&se9NnP!y|7A9*v*Bfyh#AceCB|R%B*kknuEZW-aJ-^!JmCH1B zCMPQGELk=88AQPsM(ryHis^n^rymahJD}5)9M*Y|owwbVQG_K)=GyoJD#RfnAs=We zs0d$~q^$;A=)*=XG5Q^cc^VLBjH1_#~O6oLZ1$q#TNbYb-0g_ay)G(F{W6)Cuk)jdB*6-{^f?-rp@PZPiEz zpc8$u-g5+#pABl1dM26zbJ$jv_dJF5m1uV~*ae7(tm%RsPA^RZuC@-hj=I#-*yo2*~U7w|j!a$_j{j-EQ0x?+-stJr_mguC@1E^4s`_ zR&y7AM%5q$C>)+!Bqo{G5X7HbT^$ezZxpa%7xfDKja7tSjY3yz7G&aadAyN7_Cf*s z_5#%fWlC2OR4e3O{Mpn2}J?NYredWD@a zdZ0nW@8@4wcWIhxm;R-anFD+1HHl6TWsb>H2|~~m7>b$V;4-DrY77FyCyr>r%RQ-` zqKRIC64x$G4zk<+)ma>c+B2L}f^l)5P!)JwzA?$a?5=_Up#3W6083GhBFrSE$fGH0 zFT7-yZmPCv^c0l24FAV@qM(gygd$RXk+97#2BpfRr3R^o4uS0r@g*+cSea(OU~m4| zYk%4cBUsGeZ$4L#BgfLK<=YPaLU8Lz=l!yzFrDss{*ROsy9Xq)Vd7{c{p@ zh#=6^>-{#%o~iT_&txrU&8-2wA8*g_a-}-S?Knw*QxMwjZobZBT9$HFO-w=|(N+V0 zO|5}g0SD)6RLXq9!dpj0BZOBF@i8A;RQ^pk?trWS#Yk4w!LScZiUvg0i)eiYN9x@@ zc@Kyx$RXKiw`n&H?D^|eLU=IZT7!Ns4on2GylDeLHOExln8&l%CcSU+y!G%w5Ji6y z5QA{Q$Q=0jU3PMR)OF1+#Wkb|o%!>v@*tRASV!eq+wYTl3RiB0ty`R2BTybwh??A1 zGc&H15gJJvIBT_5qK-!O!NeP$hv`*U3vDWD&vf*=CDzQe?dL(U_0-?^vP!!T>0ut= zgI;OLQRf!5aPFH5f2(<2AS29VWqE3*m(E;3A&!62I`2_^KwMtiI37^xfPn|n%pXy| zfPvCXpHN4D5!qi|iP=MjrmIt~e#SJ6a% zi}rJKtqa~42yLz}w2U|Q()#cU<3tb3Z`+s&s3ZEgqy~x*t{UCJ*kC{y2z{@A*0c>e7Yel;|MagiO6Ni~Pa^7F9aocVq4PE&M9B+2|( z9qhQ&X{e1&!4JaTU<%@&@)ZaH$eW(KzqIaZ$xEo4$d~DjCEK0+pq=P(L1DtQdL#@0 zVSpXk6flW=48W6eT1|&Ej0Ab4sj>hhooKzQI_TPnHvyl%ZkQQGTsyF&OHPcFKcw~kL|MV*E%V2lA7*J% z;{jNssIR70w#P}1Q20Yu47OD!>bjx>!haHi5lq7&JmZ=ML2!f<5szefKf&7J3dpFp zZXuE5vQ`rkpS7BRu%#@DPTl7vy(1zh$NP>*D?->w{UElTDAT?GgY`n`@)gcWN#gKt zddSwVRaPwFerTR%tzVY%valwc9Uj^?VFNB9KmCeyLuWA9Qq&3MSEK`R38#HAu|vf! zf?84w;9M@!H8qLKZKY^r;FU7A@=zMY4ov7ctEv`aaVZBHcKW}-B{&@75q|Uc{k*)a z5bWSIwy`z2tq{@!G$-qc)<_Qj0>$P?7NDg5E+ADO!6_%c5Y{RnMcPV05yV-a!R_U+{v znej#YHT>~sLmwDBt%6PLfwseQC^%Ee9RqOzCE;sQnW~c$I?mb?BniN)Jz}zf1kLX> zcJ>waq^LFky*+0$LwDz~iaGUG6#1J3Cdsc`PJv`-8ZaxHlU1fjH5I?h4%ac<4|V6W z)si~d)wsZijbJ4e#d&{YUv0u-)PIu%Y<83I96Qj-obz!0ee(3|4dmW$J1hFUq}h`A z^C_D6!c48OGdQoPHuax`zX4`)R6!|JJ8GDn&F%m|a?`20!=T}5Zw>pex#c}vY^-J3 z3(OX90H1A)OnV&e-tnz6VS_NaC>LCqZCIS9r;%x!=WN0~1dbG(YE7Hd8XD&mYt7VEPOuA?mQ>$FTkI@NeG)!PUNv}ul;VPHyUF(7J3O7&fy_C= zJ3fK_E{Fx%qhQl*yrlshX1U3Da)R>X*WS*6r!x06^Z6yA`0>pM;VIn?3_muI(XisU zN&2J#TD)frAk~1FmqLjBdzK>IM)5hqP=OX942TjL1+Ng3jMj`{rf~u{3!Oq^uIy2Y zh`AVq7z1}!LIE+s!qpLaV5D>8(nJ*C9<{~vP8#$6SavRJtH-cK?kR8;gQ}f2fkG;P za0BO~bYqvUF&E*r^aLMiSW(IKfmU?3Vw#U!5GP!jk{ zR?AX;+GxoQlTqT5Ayn5tgK|O`_}QuDAJ!VXYjBf;z0it2L9aCE=WYqdt3*bPY`xr> zbq#X(Q^&KnnJ&~>YBbaW{=!!m{e>71_E0@c0;7O|Ux{i6lDk3-@gmqm7llXIy-*62 zl+FeLT~`BHJdrYzVCIb>D{jGYq%g3LBm@PaS3FFOYc4!W#<7-LKM9`KA8e6KScD;a zHo&+)Eh=H92vK*-q`@}~*FQ$*0hV}^?UA;ImRARJ#%f)UPfKc)=p(P$k)8w)XM9H` zn}+|Ww+Gr(vlt@}#;!jD~h`68- zMJ(B8wom)t8IU7VE;9lRFKc&z=Uj2<{UJ&xpk!kCR7(So4hGYK$;EU8R@@DjQB&fB zVr?;7_|RPHPMG~#R7yBanPjV2Q)!>nbdfwcdwhUkd4{vhRb6DlD1kTyIVsKXUTT)X zds)zyi>y+n4Bly>qJ&{WMIb#}IwQ|u!7lS{-Dp_ro`o2lgq}kEG0+?!F9*f(bFIwr zyg8B^;W@}eqJ>&06wn6T1CRF?jgl>xa3%yqoU3ux>b-G-2{K!6Wtrz)X0(sq7L7ly zq*g1O1NCO8Xi#=mNmLAU0=_c-Sxc>u8^?Uhq=lYFmYq;a3%12ThmW+6MdLXB$}uFh zLe3~wmaFBxIGGCuY%IsJl^%Pp=3dLpY|PJ!trkayVH#)7GV*>qPRY>_>zH$>eJ+n} z!GbHL#S9&P$T~iZ4AS3V_YC!QzBslDVKi23fY!7m6EjM2*7B@DbhT`G(gF6c2OMA~~a-Yb+Uw{>jL%@TVRhkNqdhv9= zr+`oDmuvB&RZe+IE_uzywZVboMqL@7-S3vKv)j0XF^4P`k2UmKTDz#|KaO&5tWmL= z%shO4$Au=>nG=Czy1$amEPLXL;w*X}{eg2}06n(ZepnNvycN0m1N&v3!J2`F2^p2J z^ilAo-8L-Se5*9&c+R5pnE1)y-Rul;q(^h!5R2h*%(_&?SFn6T%pN2|6?zj9H|qZSxOi3a|&Ws%8h1QiTF^3*`Jc=7RO!wBD~*RfLjs z#B-`953v($8SVRT8#iBG1z91#sy*_Z0LvY&(=hNTSqsrtK?7E+Royznivg*|!jGWk zpl?6%G06K2^awNAm?<=8dE@NOE7baRB4)+Id5e?4s=5k$R*qe1=39GQ!qzQMpYX7ck5TpHLDcg3l;4`eGvLG9WicpgJ1cl*XG9l>~>|B+GO z#mYW(!*pJS-~IoGt9J|zq>H+RW7`wkwmB2qwrxz%$;7rfv2B|Z+n(6=H}Cu0s$2K# zU%Pgn^Q&ujowL{4YnffPRU;yJp%llLBLqwu$d{Njv7p)TrSjuIQerZzS(HxNVwbb8 zAsE>=CN)Rs-qa=p7@kZzMR2$+(ulXC%f2|Sg|mP*^}!O1WBavxYokE@7t;We<7oqB>b<<`=LsS3LVP|e>quTJDu z{wNXYCu^Y|#l~#PPzJekS}q@cipRWmXj8%tYK&|?M?-dQ{%Det>C6BNqTCWCbs)ZZ z$Lg+iO;3#!Jr#|3UKMf{Zsft2`-XUxuA>tXTe}I<5D*(!$a`rtwOYakzQ=|T0tERV zi>K%jaLT@-r7~-@E1&2B`t*alUkEWZ(!AZ#?%%iz+z$509DVxU%$q~4R8=+eZSRZH zla^|!T~iX6^!48A2kH~cR~7wbDKb*WVkUyFS+xJoOm}Z}hl?0OUOYEO4%d+{y+=(nM(YCxvfc0N zAnDVhd{1mKV7Fe`JQB(7ml8WTV=VXp^!qUVIcCAnEurtz`o|pfa+KI>ttHy0>2Z~Z z*jD$!398U?A5zHx{m^%bS%$S>R=g^b6A#VM2E&{f$t_Gw=m;kJt?qEsQPl&=a4@4_ z>QygnknAb$iS1X0%@^lyBA(rn^Af}Nx%j(jAFjVq*FAGu{6D(FJ`<@w3Z?pQL~?$n z9bftQf5dfXpnj#hEOQn_H+m1-oO}l1CsCDT-WR8ndpV^16OtS|_?nmcq^VxpB8Sc< z^d@tsC=OUiL6b~HAPrDvmwZ0u*SAd;o#<|bY8tH6EOI%b<}7wA)zmgieD%16o^vbNVuz2~WXV8b3=-6R?t zhJW9O7>Ie)^YRjq%JB0R+6_7KXexx4LD(*1hny2SnUYxc?%g~#COni|wH*X=8UKhf zn9xA+XoGKOK5J*#_`_cq3r!cTQzAP-s*?Ln_O<%~7#5%-xTr0{-I37SJ{i&tBtuJ+ z5T(~QeB{rXMbB#gUc`klAg4XMB{&Q0ggjV zrm9Y!FOjjgtSBq#amJ>ot|F0D9aW1su#x>C*c>P=7)}f+}}^3DHSwhQkE=-&XjJdL^GZ0tg5$T`E9?N!o&pi0OmyA3rws8|EG) z;{SLlA}1-K!C-)ZaJTpoVXmS97Lo;-8b88~YJY&aaXuwnV_1K{qbcluYaEKH(bXeKlLU^6a-JMDq=b@Ln-GpENl>#GAZ=`x0|U)SO^+`!Y{`Otu_V zLJsCXLl!IZn;1qNx{L2QM}-33rNwXsH|7#|lk|-|-aS1Qr%jAKU&kvyyoD9QmR3S z6Zyu2M_Z5}+wT2Oz(8pBYn4|XTz)fDI!srSti2YfAoxZJTzR;&+O{=PBPB_RFA zu^PdD4dQ(d;b{g{q{w|^PM6AWmy;J#H;tz{<1tVt@Q*VRE%^FbPUwE*BvrwvkZs-< zTXH*P^kJRzs#cH1b-5@`02u)VvIDALduGwMnVt2r2 zl>aizgW34)`WS)IJ}>Nb4c|q`g*olJ3nKZ7jGGg=F$@Bcp=_Ld$E z%pjQm3Pr*YQ}w?h$Th@7NBJ*ocEqeh{_nkwKW4&zNzedHWupI*8hM!V|0T=vFq6Sh z|EF@irFL`$K|w%j!9YOx{-dGC`eVYjI22%-gZ{U8wGa~<_P_AH3iI;+WdGJ++WZGr z-P3zBzyJH}H=zHy4NgO2LALm{U?TmWm2s_@!I1y$|JIFZ2l2mUoy@OE!i)w2qRsz* zH>ILnV8H-QI=(LJ!?RxoxqBh@;{GyyNy)N!@-GMRX1q%a;R0xECv4U5gkuF^xDcA1 z#}tH54IUm>A0VT0l(EBPiM^X!-S74u4o{6$;{r1CcI%DFk}4?|$YzVo-Q^RVcHe1x zh{{Ifnz3J9^tU!lhbCvSXeuZ8vCk;!BDE8#pY;LTjK?^59&(%Si%DkoQ0(sot?OoO zzo{SjCmvFz@yEQRNH3T7c4lK@aNc#3et7~T`ZrW?uUBYqoZKrMTdh=3qKe?``Ystt7# z@0l7Xr;I7Cl*DKgtZLSpF6Qi(JVrP!!;Ol$L-^Ih%u-`rG(N^N( z=-esIYM;bQ!HgQPh-2qzPXO1qa8pr7?hRP%Sy&n+V!>^ABGWX|u;1A)t#W=>$Xj^+ zZSOh1^jwCPSqa8b;??%oGI%zWEXgSQuH76cJSx@wKo=iWX`8VmCjzI9uydbRXJ_Ea zZ*l3~lFIq!fLkZTe$F`I(p(MU05Pf(#>b(j9K1Xk(*!*ew8C5q0mEYMCbb|eSBt>3 zB3+x|@Z%Gtab4SX!CI0U9KMVMuWk}9uir)!rrU9W^faddT-b#-x#7A*nax6aun7WK zKhI?8+{;{bc{i{&f0VN=zR36s;<5$WMC92wdmS++`$5DfBU#$#nUz9~Co!@;jXh%G z9)yW3KV1}&AyB(j?S5G9){5s{5QJXF zbTrM92>|@hovqv7)}%ofESV*&w$d{)Y_QJyy{P!Cg~tr=`O*~*2PuBBg<8d%KgLc! zcQB!aH2u%$@NyKQ;jo^QF)#cmXxml~`{l+wb5cEEb^L28zdeUGt%Mmfj4l9`L5p-N zW_Gg+;fu#jy_mx5LMf2cctRS+$ZY=WmBV_lF`;Bcoh!8r68e3~EQVRsxS|oP9kww} z0~<*cmM&!6%9T#2>%*G(hBQAv{&x+%V>WNsVA$XiY}`_e+1dCxvM z8(!z<93g){Lz@MVbM(5+Ux$9+OWo96K`OCO_jGe$&#tvEf<_MYzUEIF78;{8A)2is zQEZg7~kJDr$JA}a{?E(%<%=2+tjECzO2yIwAW%`YmZqnat;XM-e=#-!iloBsL!>dXSTcy%4KfOw#knj|M9 z^#xkv&iGjFmH`cS)@9zkMIZ)rm{+9#KnK)WEBsM8?Z{pCZZSIZ`vSh!vADsXTl#Tjt8Pqz<`+AmeP6w{2)bd$vaSi+;lnH zftOe(F$-{#H_+Z9)*tEPi)|>-?8%v}d(%|8FVp8VkvR<|*Kdh(N7U={`iE?MMkTx! zl#=LNX=YOMuMwgY3JEF;+@;3tc99RR=_o=npx9*vt&B(=6(u^Rk>V5iT8f zLTyY*Zhfu?82W5oNJl2_nPa+EF5RU^+%K-Q?0rV@pN8f=aJ}S>!jH`fBj!x_?y+Rf zCX&-W?f|l>2v=-fO+QLU$V&Dd+#@B^F}1;CFu=wQ!2^pIe%5Y6BW5&>K`tEXop~Qn zybv=S>blE~Aelg8lFEe8!wSnnIn!;&8U+*GgCB%OeFCiO(j z0uU?5l!FB!Uftr%a-~E%G;fH%G85LNJXAmGI8{)R)AD!g6&;=B^`((UH1~J_9e?Ja z&JQ;Z1KkgUpP$w&J<>JUN0GVJ^N}q~N6Rvef(O^&pi+ca7_m()sad_y#`CjI6|EK7 zi6qI5o&2~T(U2KKT6JT!ND#e$^)qPd0IO++xXB%2SIC5Fd|FN;q@3gO_#`{(u!e7} zFYsBcKhVG7UP;s(9Wm9(KYaKEe09Bre|qx(YzBXB=GQ$UCt8H`_eX{nUxs|{11QhR zhy44y7PkOjIIWxI=^lax2TBVf;X9Yqf- zH7W9I_`^TDM*odL096}IeCE9%PVTPV#oBG9Ns~E>FVO%3$cKoojNzFg3`@yjsQT*XTvicTAOG=)|6V3I`Df zY$7Q3`EL4|F+uZK`Om+R#WCFR-%V1_A#v_vG%{aJ^)8X)uqx~MZ3tyYivQT9#JGuU zk*85wp`~A7_`iw2{(f3wpx=c1_3dv#CG0*uB{POUO1u9aWOU^e04EG;8WWEipRm~4 zfP1PK?exYsJZb1maB{^$AnNGLhLQEdIvpw`zgl_HwdB<+(RQ%BD_k7g43tW%GSQM% zbv?blhSvR7=-T^WWlXCo5aKBN!Hg?k>fv($Lr!#v>x7P3CDVnK1h(30-5N zW9Iy~$XP!_?5~i?^}5Hzao#)Cvq}52($rH0qQ#Sny90iO6|PNC{%7C!rj_s2Z($~} zjvEc$pb_AmpOCEk`t+#?EWXWc8oN|7D2RSVfQ2cSReKR*&`;N?nZS~I8V;tBau~0 zDE$z4xid_bBpAEEV`n+xCpPCd<(C8M!Hl0r-i3n9V{G0#8Qmo@Rf>m~&Sx}KbhadO z_(N5^rYCOZlKWjL*>g=|<`~dNh}h*(R8@!}e(4xQ4AfzL z14?b`g~HigfBtTKQ?orIoCRrmSvcN$UI{ARH5sQQbl8EYYBcUFZ>2F4Eo3Mno|E}5 z25e2#g)GG`14UZV^NiC2`|Q*z+FBg-pMa=>7p}PO~OK4KCac+c1I5Lbi~d<#fplWTFR}_y|yJ&w0n{7D?Pox z1e_05Y5C?7X0yA$?^&~4qsJ0~n2~6dQ#z8jakJx+?|vTl>(qoc{LHF^hy)4|3{Q6` zCQldi1LIg!`=AB?>A5Vs*Y0>y#nicuHo!S&0_{a-$em7Cbhf<}1t-_Evf>)rymG$Q zj~3C@MHLlB#eGL~>!~x7?g8^o+XMr`^86;B9%u>Fs^yn$E&i$OrO!we8VlnfB(h?? z{d)Q*FirJnTp${5@!)Jzl`m?>;@J~%pV4F7DB1+>Qn{J|>iH8R0r%K^b)TAKt=t`; zKq96-*BY+W-*vnt!rJvZRA?nz$)u`HlyailsddCCRbQ8`miw`Pg4A8-wbT2+qbq9-)WBz&uhb&g{AcnQWGe_+8#whY7dq zjv+ZdC;Cr+=-2)7T~#fr;@rBW9iVa42Q2H74WJ3QYP_wg3!~-c$J_RcHo4J`&Gn}+ zObvKyE1UIK9x~i3Ypa6uEUM0#B7@fRChb?@YKuz7%*@0fdR%OE4BudNu@I8qhr~2R z!z7tjS_pXYjBx01Q?u)-esIDgfsgL4LwC)%5Wbdh=@{M-&ez9EWKTVVG-p340lD~M zRoGA0NA`sC$>)3?xniZgGPHL4x_R%6uD-o_o%1kGEY5II`eVMfbmxByXyx0W!a`x@ zdAu?Y)5K57Y6wt9NFp{`divXT`sT@^EMO&!+S7R#h!Ri`+ez$_pYA1O+bxJxdf{`5 zJO{XapvJWUTUzcuUI(y!y_05l;A_)?EMn#`T79#PI2##X0YdSQX4DI3n$VGT0R3^Ujax3; zBsna5)P;{#?hei1{;SB zz9tAex+ypGDWu=(Sx&gV$qLiaD~M%Xr20`gZBs+llRE9VLe`P7KfE-eevMs^)BSdb zcWBu0MC6TQW{c_O(n&2x0;*WP8~cdV7zxU&Tq``jDgMdc9?VG%zY3;YEON!H!{qS!bh zTJLPjo`h9W`if3wm55-m-whIm6vAbX)TiM(jyIi;(A~@S(SM#M199gmIx3TjVG|9p zo(vb6V-UJV!ueb;`v(Mv@napw;jtZZ_8Mwi26YtM(?FJio_^t7MMaB--r2pDV5iE3 z>~-f-0c8`dS^-}%!9T^1&G)_AWOLs53ns4EEXdAbf_{VM;)_0Sh8H2I^m@RAevXPO z?8)4qT+j;pSKWFzz)s`_jL}E?-r5sq2+VyE+WQL4J^XW_yhtnW*bSv1~GJ;O~DsYmD`LXg0S(Jdk zj>%98+MJgi-A){>%tb!@1^sK@Jj8&^wjhxTB)r0@HqQ}Q{q-m$TLE2Vm|i4W>YaT# zcw~RU!r0sFYmU0C7Y)5E_BJ{9Rhv*+1ey%Zc_ z@;kMnvot6x#jCwq)wWvav6(i4-UAy?%aqrfcJslQ2K}jPBc*C7%TvLPa^kzqh}Um@ z6@l%?L0+K20C7_^B~n#^VAc82S0M@hCFV=u>od>{yDD;Fc4Omf{q5Ok0bNKCA*4W| z;D&p+3i)Q|^mI4Y^PeE~DTh*p^pVzyc+5zy_>XvO0jI=d+P=9f6|KoTGTm71pur6+okcU%9Rk+%<7VQ5`IEnOguX{N>nS>8yXQhj4e;DGpt>i88NO3%4tY>SJa}2 z%!yn5Q>uL6scq|8mLF0WOuI~TfnC`JJ_hjC)5%K>PBpHZ!D$9bdgl`deC2Bppb29I zZ~Vfbd(z0`l7?CNd{8dj6Z&CPLhAGpmAc1p@2%MKPf1g)zB~enM^&LQb9%kY;asX^ zu{^@gAPoIR^4${A)Y*k%?4QZY$f|vMhFgNwe*fk+hBIcW*KK8a4o(aq;jY}*>ml&h z$ki=wBb~RnGlimUs;4n(J{+&u(1HzDd#t{a!qwhGyIM8>i1#G&&92EG(cn7~(v;hm z=NpEQA1+?SjYsWx>K#0Ft%!>(3R>UQ>Z}&MLZvmZx6RBGkB`2yKH%iF#X8Pg z8rkvo{5XYh0f~)$Y3%v*@(F5m^B1^$EX9qv>D_QJ*zP)1KsK13TsD;L%??k`|KVgq zEUSnaMvMkUw7bP^fDM~ZnZD0D!j?TdEQ6%^TyRMF6HzQ>V(@-SsUR@52x`)YvIl71jO%~s;iYyZ9PbmsDFHRs>BdZ!N zToX26%9T^4W;S2DIC?kIt~jTlh&K`PSQ&-Ultm>8R=!1Z;zV3dK_;h%e~7bnoiD%4jbK z3BV^b5)bTENYfh@WN+o0`tzqDr~G@hjI`SRP?v&>`zILPI(u z1x52ZQ?4Lvn>fgHEut-hz|G64_l*}bz4x9qKW9LW7(aZGow&!+U?kv}Knga2Hp{jr zWq(B|;oIElF*`IBqX;)(9e-l6l1*wL#K8SBM|k6ItP$BJi=mKl2qIAIxDb5`#^s9@GeSzMcAq_X^om@|%Dra~H~tx*sg$dpUCzdQNya2&8F+_4?=nRHe; zfb@JN=-=q|))NTz`wnn-c>28l>ECnLvYR+?KT;Y#EpkidGI!zIe?2we>1bHlg}3#Z zUAXD6q2%ph2p?^u8PxR|tNuh+#|C0MDwcbfF6uWtIglQyMNZ?a!CafDK$Gv<6F)Z9 z<%&>hoP9zY!&fAIB=E~xE$6^W)(K*mUbZQJ`%Y!lJa zXfNfS3zdJRkU+0`i_dghKYpO>h0!h%8XmB^Pk{kNO3iNU#^X9&<`qa++NNtw56j#>9%Lz|Ux*oHLWvcoWifDUQEDG!#6g$M>ia6hUk zl?dPy&yk#|di_rRrdh3VfE=dZ+wTSEQTM3V+%Z{{49Cln;Q_x_kw$jb_v6_YjwVwV zT++IY*T*`cmP@aK%ew`Fz137@D}6<+2G#fE+^SFjL>SPmV3x&k@QA1^;7Aa-Bzfy1 zW=hKMnuh0~lU|44j|91L`3SNNx{Y#d)9owM2o|T5ZONidai)`P=I@Pk$9o(X>!Vc( zzad@-bdkge&%NUiw=nMdNlTuU1V1EeS8D{lvdS%LmV&5}CvowW-|8MUI0EkZj|rg2 z4V`oTiwyXl{cUcYUSVAF$byznED7SBH?aX*6s=+2EgWIu_za{2y{_Lq_`A}Ge?a; z+e`t%!+jk(DO4IxR{<9ZQ#qqwKRpFzs6dqrA60C;g_(X`{J4NVMaEC@?Y)+=z&b_; zcB!bqQI*+1;Ms&20xA{Lo5{!gx4x2}%{kTEhUzz67z9O4>aYvL&XXm}Udi4o*3Mre zmCAtsIMOwt^p`uAw2PeXx@2m%cR+1<~F7d027-@`&=IeD_eaxwBzT=VN8pf*oLJ;G=qrZmFnYSPT%$$qe zqT<43Jo9l@gChQs36Tdcv(YGpZ-Tqviy?LNeqYbBOu4_Tao>|DRd@C>dSd%@S?6t<8$y)t;P{u3ApmAA)~+aGcbz!qJVSM1|aYvTR0n?c0&D z&0Tfhmk!I#FC{5$67)IKL^9U1Q$)ZqcusXV0#+mq_Pn4}qfW^k)?R>yV!28yd=SH_<#B73C+nS&9lB%%b)oDWpr0?vMZ<;Zzh^hvLL2gDWcw zfA0iW^EQATo;l8mDL<5KB>r(k0I~E~hT0AGWE2!!3nHfYoYPPcg1D&3TB+byG~)E-?3YDvo*o=B+-4b|;$CQCo25(<)9CIbu?uK7s@3n%ED zMa!YX9=nPKoL4TKNQ(XMT&y77clHhPoWG0xcg9U=(Nr$KyVAWZ^inFK^{sU5 zHRTz4+G9Hr?g0Vrt~A-7d@9gT!J*Nah~QS`gV`braJ&3#w#(qJg~ES#p%gbO=i0NF zZdk<$o2vlOZWWcI485A)$U~61awWjD zbd^!%M5h1EBOPCOfab6>|F@C#!eFw5_3jT=DDU=UznKY-_bHv%tJ0|Gm;A{ z-$8^zHjFS9r{0I!INe?j482Ki7$D~nPSC5sE>TA^#P$LQY;ya*ry!bymSmvnCb9&^ zoMY+9;MRle?p^ivYeW1#Ptfia(N+a5Y+VWqCdRq=8JN!0%{JL0A=FyDpaSd1Xk?#+ zh<9C1n2`%CC;yBnH_Lc`{|=HZ91`T!Ye>)5VkOim^yPgO8-`GQ#i=KhJUc%69lA)? zKt=4A{LW7x)F*aoyxGij8AoMa;r*`Y*f7`cIQ&V^CG9Y7&t4hYwlF&OV|b*I>q37s z_lnT|J6{JcGcKVllNb9%jThW(&{m`L^oo=={0jeZZ9T^z>o32%kD!_Dx({KRB)>bk zrIiK3KU7l7Y!T^qwcx#>zpRQP5L}sP4gZ>ot>GO3pX92U+#MzLHTWCclJOy_k9_`mwvt#fWi6B5{FIh==+3RvF`KbsTlFc*`Te%!Gu)R=kBg{mZggVpj`EBz|Adi~gc!J2pZ?X{1#aU#?Lt)< zQw+A3QZhg!BM8McFs{OaQ>}R?lVjPhmG&9x78fE~Jye!+JcX@MIuRVklc2x(Atso9 zvu!D5Q`CB^WtUi0O9~Z$H7wAe>EqiAtrP(S7193OY@D*yoh(r#a20VAAU%)T<&0Co zmC{%61jA=oa2!9Z#USOvx#OL|O?K+9Y>rckKaF-_98Hn%w2%+ELpo)CT13!A~ zao!p<`YA&zt8OB+hzH_*A1%a4T5z-5p3p8^+hps+ea|KXk3-EfOICA`GI)0CyIPqc zik@Kt`!4;+kBunVe$bZN#-I?l;oSj&{sCn(e;(EE+e`f7Y0_VL2QC|qoXc6`BlXFv zQCBZ<8J@Q5ha-=FMH`kk`-es!8b_*{nu9IvGR+=8+Pl6zPog_6Zfaz$dL*BE9a9s^ zCZK@4^H~OZtUU!ilh@+$qRIw=;lvv)cIO*Qdr;OZT~p9MP-Rcv%F*yvGjjp7c_DLt z-e$mFOwBHoT2TsJOctBk&F{yoM`*)vk0YAtqXh=>{P`8gMAdUmY=z>8jpxKo4##YLDIp-n1+!{OfP*Z#9e7FJwv4=WFlb@1F zb=VaRU$`S%9Y~asAjw^dNh5&2c;$JxBX7lv7GD?`7U3crPW;p0yEHY-me?u)UgVCn z)BZ(~s4qt90K?UJu>|Fg0z<@Vy7yOqbTvv^ZjE)G3mmr&fw^tG6{blf!-t62zo1PP zO?G(lmoC2#zP``bC-^DmyjEA(mKLF4zlFn}SU684$DM>RVxpf1+pPc!%r^uG%eV@R z&CYji$l+1jj`(%uKT8|z2q{h=*Ip_W@S)&qjt`*gczV4D_v7^!=LpAZ&d`Y$JqO#h zm`{)FP9Niy9RzPEYZ4t2_iqkE=ix`IzK3#YkHqN9v9V7koIcj#$}%S9hR_f=-ks=6 zq~Aw6qv`CWuK)fMox}rFFDWP8z%%>06|=kF#1V&h<#*`t9t!l_5qM9RO*8bkPb1?b z20WF19zyO4xx%mG_9)-DhIO#(M(WtpR8jUaUHh|e?7n1=WUsg3 zf-O}-K&3`%X2%sOF{{C5L?6wDNYSGnrl@-0&Gp|9Z-6(@AFB-uK3w5jPvWW zd=t^bDdWg$>?INurdik-)Shjw@KgNYr?@;@Z;WzfZ%)N&5_v-J4(Xu!X zcIevc4gc~8_te^5{%26=59LsKXGOC=nZIwp`;6aN6t^+sm!u6~EnX|KFC}|1vm_=OB=R;6XrQQ%*1$0Q>dPhfM>P zS|d%c*2WI2_NsP9PPuw3|8q*=tcwD6Qi(ZsjL<`bs#4^)3-76PcnisKr#URk2b4S3 zBR`=(#cJNoy7s*DO~!4e&fBF+%-u`nr%{?~Zw(Fb?k(t*7gfdZDomv?Wm(&&Yk!Ghm~#q=0op{3#Hug)i{qu* zShDswJxBF>XVM22KbD(&C()2Wuhl^+inDj^hNr+6yv%2Jgu>cNTbJ}Z(N zetlejr!=YBIlS$ZzIA6Pt&s#u&Z$Er~KqgRzu z(iA(A{d#k|J!i$FtbitfG|LdCU^shijT*LbK@L;)XyZs$VKaig?S@0d^RVJMf@Buv0<4*5IJp7;Co8+aT6<_qb2gL zS~!9;9rAwFF+e6@f&ntRGx|mZB3gZq#EM+|jWsMWlq(MJNBR?|8&9BZjJrz>*54JF z5>wSQ|Jt#YV&x4K9Z&YU&_vqiFhlQ8sml(5eecBptc77~CrXF|NqEua+K` z#3~Tqv8W=(&Oc#D6Tm{fw** z=7CWnlL9=Kzj-m`7lJ625F0t`&~Z&I>XpOnnqBygk6Lw#56kDjDq$g&D$9I1XmQt( ze>*Z_`^$4+OSXrPL~%XJ*~whqq!!@7iGj$sJ1=Fe-57PotQcSA&&U8bmGNc zo22CjA)LCv_86n;T(laQyS;CuW`vUpm%!l&^8rL~htNl!BE8V(sWfrqs}Xs_bJ?K; z-P+J2O6}ROjFFt>pN?-$@wIK%9bE}B&)}KLwJ$<%tw6wa*A>AWpJqgmuYk)F?gXn= zu}e@xKIM=9eAF%uD{5M~@#ZcdQxlfkF{7DXY}gWD3Dpr7vr^`0-Pd=+2lZ#g{6*Q0QM@_@WX5#4a0ZK@G^!b0sltBPTuQ+%R6@3UpCY)D=)9K z`G}Uzv9IV@ENP9w$8mUpUK13J2=EtqLI4P)ulGLkN*u+HW@nkcFg2pEa-=L;b>eLH zcas{9Xm*i1Z>@n!F|!pLPWL=SzVd1_9Y~2HfyLk1!nk1;u{jR4w@#UYzi5zGb}=zM zC6rrOrT@%iHX{gNWpDiJbR%zI?EE?E?VKz`6(}Y_BCS9_*=YGlIg0$jzq>LE5(9AV zklj0GHV$mDSfY_W_Z31`?U#LviUB9ZA!boyOl4yzmoxuZ(Y&fg7b_|6v8=;Vo(pbt*{L7=o4(n4w6 zQv;zcwsS2n690!Wf11hd_>f7bgcRtk&FHi}Iyz671jA`VT_A~MG+?wT9h)#q!I!+} zd5B)@>^FCFUgZ$Jk-J%Ch(pCMqkM|y4SlLH6m^lt!d^b_`1IIPYK{p09Y!l zB12=yZ}lg;!G7(9ga=K#wgCLF)Hr8$_pq4kszKKu^@Ezs5;l+Ug2i1!VDoW>?~_`a z7eDCWO9J51gp-#vp-IRL@fu&Gl3z8iac%cweRoMnahl zkS^^ustUD*irpGeu%#=+xh+>WR6FmRqh)ujfGWB9pYSN|kcXflKS*6uyCWOt?$I54 z(Z_#l&=N##k^LUB;uu;Sd0Eg~7=2-I-nMwelesdP@m)4v@uUFk)uK`N5lI_fjb~Bvoga2J z_#QU^t4$JpCF%%pgn8Fe@Eo;2;rB;{?g?jRvoch>Rd z&h1=MIGyWU@#IO&0x}6)(rK+Wxo^O~3|_&Rc&|N9SNY{%X}=r?E`h;Q|0w~5kMz@o z564@#ZCO%2*0#Z|zaelh!IbvpU%it<rJ0`-L z*N{oW8)^Xu`L_{d#s;Fd{$2i|>E`(uQ6yAzCE3tW0*2ZR?C$3Z;dbd^q9*uVcvPFD zl-7!?^=ieR-mFr=*^7JKUn}g$Ci>5+4%k;F<9%GYCEKRMf~!vf-*k3X@U4d(m35+V z{b`o#Y*MUZ!vncl6!yHqYsAV6u2P)OMQV&nM}fbWtMVSlb*i9N6(Uzr_K+J z#NUC!*&*>nrpnbqMa-%k! zIS7KvC^fD!U^N>>VpJW^hD?S~0A|WW=uJ({L#8T}q>b;(ymq5pLqlV^pn^?qkH=-x zD(4W^Ll5f@wo?L&L)NfSj+4gw<>+pZM{yW)_&}UOJ#mb3Fshf!rNs;B0RgDV`nz90 zHfA2s;JLTktHUJqLM*lSy^pbTOyVj9JI=~+`^5E@+_j5dM%jI|I@*yKCcV5rsJ=9E{`w*q;K=#Rt(Zn)I*L~JwqNG%L17bXNj7pN%Z zN19RdKandH6B8|egNGo5@KAQ$aH2f4P~><37#9wH^cg3l@&v~}{IO*AB%3T24fHzy zc)nZ%%Oe&gS24NSh#QedHBdFs*vy#oz02&N&+@wgib{j~jz})X`Z)ETfD#u{r$L;03jE7ifMBfWKfzLjPX}oW_X?7g`IpXmw~O_C+lnd-DEAV=qJ_;^51yy zncP^e?dSt8Lp$3TKlkoOhTcxx9L^bD1VON6Tajkab>~Vlv3^j^9tVBkn5e1`-tPSs zJlfLnD%P+T%I%;soipZr=s29k-XI&u6$D&Z4GnHa#xf`N8yfVXv3Bn-uDmbT_hpi> zS!$#p*Sj_yuI$bxE?aI}X1zF`Qz1AUaqc0t2U5MSZ_kZAB)TAZ4b0y^GoRlcWNKU2 z-^{-~V#qPG8C@&RowE3Nlor?_U=Wmuy7Wlh zwTmN`ML|qka6=wF_DRr+7m3NLq?{dEdnFq zpP*rNuedY$$bN{QGzVBUTYr9pu{$|EoIju5E@tkY91T)b-x!=(z%(1% zw(V?e+s?+=*mj=S-fV2!wr$(CjhpxTZr!@?kExnEr+;^y(=*fU6C8Glwav}cuR*T& z52=rLP_zco@4E#D?wg88A1+qEYiL6j-rO1K5{ijCQ|hEJE{-DiH^oj7aJRpCJfC(F zDXS?IqT8McAg<9=iodraTSux76Z#-c2}87*26BjZ*;Ip?EL{)A!?q8Y*T_vT1r=r1 zvB-nf!4@NBw!PFJrk{?EeVXG3?7BD@j$ve^)?&{5;^=Y zN#|6K)Pe9=BOy~h@7oN+Jxk2{T*zg)eomQOUtrW`zyKB&P?W^S-*XtR-f1#fuR%oO zE#jlCL!u;%M&iUy_8@QxpAjn}Wo%_!74&d+It@sH-o%r*u{_RvLf148sU)LL!+=cl znF#u~7k*EWkKFkLSfm0`I4<@0!*>z2vmoX~tQ^5dy(;%Kkx7F9rAI~oq)o+g<;sG2 zQu-%JfCJy0TCC_fbo2uZIU3kO8lNs1bIn-NAPfm~gEhV;OT(;a;B{dMr2Tp!0fZW~+17@CoCIiU2zQSPjf@b6eJCV8b)$A zo_p8PozuKMtuxH%MiNsbAEtSMmf_kXqQNbklPH?)Y+%4Ggyb`vY8+0)2rV`Z$lz8d zK<&=`X6|2N-jj4KP3^BIG2JV6I5WqT0bft+b{8-e%}5g$d!wKPyaTs3lEmEt&jB^t zjcH-*W%`7=;Tr>L6>WS=lPXy`vGy29u)T^tc%m{wFgG86$~A}$*4fXW9O{XQY*4)w z$r%A5q7ro-t?FvIot4~gUHZn!gnIZt< z;|Jssq<`BHhD)sU4L+DWCKC51zyheX4mx+^*pNxVDwXsCkB~(y40OW{ugT{60@jt0 zSR*opaxz>Pq##~s2-ObHk#~YDfYZ+d>XEH=s8A<@f#J?0t zNn)Zk*?;pDCj{xpSz4MbfiGwQn;2S^CHf%Oxs`?$7G!MS;tOFjrYi3Wz#8*z%*ch~ zl|Ac&_lU?wDN*g9890-VKuK4dT3o;(}<$1>@PMcXY=Z$FY{+3A?Y4+~7u>7S3(rc0a>YtZ0 zjV3j=JEbp$OyI7#v&G>lSNV6W`|LQ)YZUZi;26>Leh`sx=pvg_UDwB zSIFIUQ>4eZU_#Ti(s>R)rQN8mBTl8YETV{=KrE#MgcCw_Q?5LdcX0%VLMpSFJz!*$ z!HP~6fR;sJ3g~kW0J}6_?iBj$Iv1>j5+=~-p7*ua(6L8hjPDpIQ^Bp^uOlF^Oy$KE z7!CzfM1^irf^g^P*$V35Xkwi)Q zLD*qL&XzYxX+NfepZ_i~f{=2&NW^6ID_$)^ znQPl}5FgW{1H9j(E!bV5shj;qmslpFr!1TpRA!J@MPZF&8>RjG=0YjhK3ss=hhb|HAYSLz_cws$E&^+0 zrIvS~2N=k^uN6-VN`f2&<6iAHCt4vhN~X-r*L|`fg=okpNOJaet5FacW7HlwYo!Ho znxM9#7FdeKP)`B}p+72Tn70<#izMI_Ud>YYml~|P`biYX$tsfD5K(7UHH)u(C8O*c znkVFrvqoLV;a$L-^m6cqNk&RPcxM~BiX3AX0)nh)^oK8jhzQ0}N?IHWXvb~Ypf#nK z!BYa|B$jF})Kzp^Pl7AXT8bIHG(jrtQ3gF~B26-=75q!m5*tjgHMz*(iKu!S@}V`b z;xwWHM`V(0n{;l{FbjXxC3qWbhUTk3=Ez~RBU`n%DiuQe6KihZ1FcG14HwPOTWIVQ z17HfJAq9d!6UX>tGlf5_3rQ`)MRRW<1pXkV{4!ESO%-jsA#rM#f)e;its~Mf$&2fv zu!fA2$W*uAp=YLX?d+;&q}QGmnfA-S6jtXNFFw~bTY#DDPyB|;yhL}FmPCeJpSOoz zv~u=XL#Lw8XgH3O7e6Dz*Q83q1pz`^2av3vy;=<54&Q^YAPrVsc%3~h7nDT&I}

  • Y&k&+ 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 Date: Mon, 5 Oct 2020 02:58:43 +0530 Subject: [PATCH 0204/1261] Typo fix (GH-22496) Multiple typo fixes in code comments Automerge-Triggered-By: @Mariatta --- setup.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/setup.py b/setup.py index 04b1358bc916e1..476f8c414978ea 100644 --- a/setup.py +++ b/setup.py @@ -1881,9 +1881,9 @@ def detect_tkinter_darwin(self): # you want to build and link with a framework build of Tcl and Tk # that is not in /Library/Frameworks, say, in your private # $HOME/Library/Frameworks directory or elsewhere. It turns - # out to be difficult to make that work automtically here + # out to be difficult to make that work automatically here # without bringing into play more tools and magic. That case - # can be hamdled using a recipe with the right arguments + # can be handled using a recipe with the right arguments # to detect_tkinter_explicitly(). # # Note also that the fallback case here is to try to use the @@ -1891,7 +1891,7 @@ def detect_tkinter_darwin(self): # be forewarned that they are deprecated by Apple and typically # out-of-date and buggy; their use should be avoided if at # all possible by installing a newer version of Tcl and Tk in - # /Library/Frameworks before bwfore building Python without + # /Library/Frameworks before building Python without # an explicit SDK or by configuring build arguments explicitly. from os.path import join, exists @@ -1908,7 +1908,7 @@ def detect_tkinter_darwin(self): else: # Use case #1: no explicit SDK selected. # Search the local system-wide /Library/Frameworks, - # not the one in the default SDK, othewise fall back to + # not the one in the default SDK, otherwise fall back to # /System/Library/Frameworks whose header files may be in # the default SDK or, on older systems, actually installed. framework_dirs = [ @@ -1924,7 +1924,7 @@ def detect_tkinter_darwin(self): if not exists(join(F, fw + '.framework')): break else: - # ok, F is now directory with both frameworks. Continure + # ok, F is now directory with both frameworks. Continue # building break else: From d6a9ddcbb40b452f4e4419b6b2c5217d31598b3e Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 5 Oct 2020 00:55:57 +0300 Subject: [PATCH 0205/1261] bpo-41909: Enable previously disabled recursion checks. (GH-22536) Enable recursion checks which were disabled when get __bases__ of non-type objects in issubclass() and isinstance() and when intern strings. It fixes a stack overflow when getting __bases__ leads to infinite recursion. Originally recursion checks was disabled for PyDict_GetItem() which silences all errors including the one raised in case of detected recursion and can return incorrect result. But now the code uses PyDict_GetItemWithError() and PyDict_SetDefault() instead. --- Lib/test/test_isinstance.py | 10 ++++++++++ .../2020-10-04-10-55-12.bpo-41909.BqHPcm.rst | 2 ++ Objects/abstract.c | 2 -- Objects/unicodeobject.c | 2 -- 4 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-04-10-55-12.bpo-41909.BqHPcm.rst diff --git a/Lib/test/test_isinstance.py b/Lib/test/test_isinstance.py index 91e79c295481db..109c3f84a5c426 100644 --- a/Lib/test/test_isinstance.py +++ b/Lib/test/test_isinstance.py @@ -303,6 +303,16 @@ def __bases__(self): self.assertEqual(True, issubclass(B(), int)) + def test_infinite_recursion_in_bases(self): + class X: + @property + def __bases__(self): + return self.__bases__ + + self.assertRaises(RecursionError, issubclass, X(), int) + self.assertRaises(RecursionError, issubclass, int, X()) + self.assertRaises(RecursionError, isinstance, 1, X()) + def blowstack(fxn, arg, compare_to): # Make sure that calling isinstance with a deeply nested tuple for its diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-04-10-55-12.bpo-41909.BqHPcm.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-04-10-55-12.bpo-41909.BqHPcm.rst new file mode 100644 index 00000000000000..388cfea065eedc --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-04-10-55-12.bpo-41909.BqHPcm.rst @@ -0,0 +1,2 @@ +Fixed stack overflow in :func:`issubclass` and :func:`isinstance` when +getting the ``__bases__`` attribute leads to infinite recursion. diff --git a/Objects/abstract.c b/Objects/abstract.c index c471f184f6c848..c30fb4eb6a604e 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2336,9 +2336,7 @@ abstract_get_bases(PyObject *cls) _Py_IDENTIFIER(__bases__); PyObject *bases; - Py_ALLOW_RECURSION (void)_PyObject_LookupAttrId(cls, &PyId___bases__, &bases); - Py_END_ALLOW_RECURSION if (bases != NULL && !PyTuple_Check(bases)) { Py_DECREF(bases); return NULL; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index cf72238a8d0585..6ae06a508c6140 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -15734,9 +15734,7 @@ PyUnicode_InternInPlace(PyObject **p) } PyObject *t; - Py_ALLOW_RECURSION t = PyDict_SetDefault(interned, s, s); - Py_END_ALLOW_RECURSION if (t == NULL) { PyErr_Clear(); From 688e3aa74057ac9b03c5eb0cd3aa0e4416526168 Mon Sep 17 00:00:00 2001 From: scoder Date: Mon, 5 Oct 2020 01:13:46 +0200 Subject: [PATCH 0206/1261] bpo-41892: Clarify that an example in the ElementTree docs explicitly avoids modifying an XML tree while iterating over it. (GH-22464) --- Doc/library/xml.etree.elementtree.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index 7725e4d158d429..f4bccf6609810e 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -251,12 +251,18 @@ We can remove elements using :meth:`Element.remove`. Let's say we want to remove all countries with a rank higher than 50:: >>> for country in root.findall('country'): + ... # using root.findall() to avoid removal during traversal ... rank = int(country.find('rank').text) ... if rank > 50: ... root.remove(country) ... >>> tree.write('output.xml') +Note that concurrent modification while iterating can lead to problems, +just like when iterating and modifying Python lists or dicts. +Therefore, the example first collects all matching elements with +``root.findall()``, and only then iterates over the list of matches. + Our XML now looks like this: .. code-block:: xml From d1c5dacaabdf0616cb7373367a49c133a2a5d667 Mon Sep 17 00:00:00 2001 From: Fidget-Spinner <28750310+Fidget-Spinner@users.noreply.github.com> Date: Mon, 5 Oct 2020 12:40:52 +0800 Subject: [PATCH 0207/1261] bpo-41428: Documentation for PEP 604 (gh-22517) --- Doc/library/stdtypes.rst | 122 ++++++++++++++++++ Doc/library/types.rst | 5 + Doc/library/typing.rst | 4 + Doc/whatsnew/3.10.rst | 23 ++++ Misc/ACKS | 1 + .../2020-10-03-18-20-46.bpo-41428._ju1NE.rst | 1 + 6 files changed, 156 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2020-10-03-18-20-46.bpo-41428._ju1NE.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 62f39da2a72a2d..04dfea276d2b1e 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4743,6 +4743,128 @@ define these methods must provide them as a normal Python accessible method. Compared to the overhead of setting up the runtime context, the overhead of a single class dictionary lookup is negligible. +.. _types-union: + +Union Type +========== + +.. index:: + object: Union + pair: union; type + +A union object holds the value of the ``|`` (bitwise or) operation on +multiple :ref:`type objects`. These types are intended +primarily for type annotations. The union type expression enables cleaner +type hinting syntax compared to :data:`typing.Union`. + +.. describe:: X | Y | ... + + Defines a union object which holds types *X*, *Y*, and so forth. ``X | Y`` + means either X or Y. It is equivalent to ``typing.Union[X, Y]``. + Example:: + + def square(number: int | float) -> int | float: + return number ** 2 + +.. describe:: union_object == other + + Union objects can be tested for equality with other union objects. Details: + + * Unions of unions are flattened, e.g.:: + + (int | str) | float == int | str | float + + * Redundant types are removed, e.g.:: + + int | str | int == int | str + + * When comparing unions, the order is ignored, e.g.:: + + int | str == str | int + + * It is compatible with :data:`typing.Union`:: + + int | str == typing.Union[int, str] + + * Optional types can be spelled as a union with ``None``:: + + str | None == typing.Optional[str] + +.. describe:: isinstance(obj, union_object) + + Calls to :func:`isinstance` are also supported with a Union object:: + + >>> isinstance("", int | str) + True + + .. + At the time of writing this, there is no documentation for parameterized + generics or PEP 585. Thus the link currently points to PEP 585 itself. + Please change the link for parameterized generics to reference the correct + documentation once documentation for PEP 585 becomes available. + + However, union objects containing `parameterized generics + `_ cannot be used:: + + >>> isinstance(1, int | list[int]) + Traceback (most recent call last): + File "", line 1, in + TypeError: isinstance() argument 2 cannot contain a parameterized generic + +.. describe:: issubclass(obj, union_object) + + Calls to :func:`issubclass` are also supported with a Union Object.:: + + >>> issubclass(bool, int | str) + True + + .. + Once again, please change the link below for parameterized generics to + reference the correct documentation once documentation for PEP 585 + becomes available. + + However, union objects containing `parameterized generics + `_ cannot be used:: + + >>> issubclass(bool, bool | list[str]) + Traceback (most recent call last): + File "", line 1, in + TypeError: issubclass() argument 2 cannot contain a parameterized generic + +The type for the Union object is :data:`types.Union`. An object cannot be +instantiated from the type:: + + >>> import types + >>> isinstance(int | str, types.Union) + True + >>> types.Union() + Traceback (most recent call last): + File "", line 1, in + TypeError: cannot create 'types.Union' instances + +.. note:: + The :meth:`__or__` method for type objects was added to support the syntax + ``X | Y``. If a metaclass implements :meth:`__or__`, the Union may + override it:: + + >>> class M(type): + ... def __or__(self, other): + ... return "Hello" + ... + >>> class C(metaclass=M): + ... pass + ... + >>> C | int + 'Hello' + >>> int | C + int | __main__.C + +.. seealso:: + + :pep:`604` -- PEP proposing the ``X | Y`` syntax and the Union type. + +.. versionadded:: 3.10 + .. _typesother: diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 25fa750f2ccacf..e4a8dec5cb95a1 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -256,6 +256,11 @@ Standard names are defined for the following types: .. versionadded:: 3.10 +.. data:: Union + + The type of :ref:`union type expressions`. + + .. versionadded:: 3.10 .. class:: TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index f712dfea13f2c9..a72632e61b0730 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -544,6 +544,10 @@ These can be used as types in annotations using ``[]``, each having a unique syn .. versionchanged:: 3.7 Don't remove explicit subclasses from unions at runtime. + .. versionchanged:: 3.10 + Unions can now be written as ``X | Y``. See + :ref:`union type expressions`. + .. data:: Optional Optional type. diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 957a3e791ecb69..9c3a0287d55095 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -82,6 +82,29 @@ New Features * :pep:`618`: The :func:`zip` function now has an optional ``strict`` flag, used to require that all the iterables have an equal length. +PEP604: New Type Operator +------------------------- + +A new type union operator was introduced which enables the syntax ``X | Y``. +This provides a cleaner way of expressing 'either type X or type Y' instead of +using :data:`typing.Union`, especially in type hints (annotations). + +In previous versions of Python, to apply a type hint for functions accepting +arguments of multiple types, :data:`typing.Union` was used:: + + def square(number: Union[int, float]) -> Union[int, float]: + return number ** 2 + + +Now, type hints can be written in a more succinct manner:: + + def square(number: int | float) -> int | float: + return number ** 2 + + +See :pep:`604` for more details. + +(Contributed by Maggie Moss and Philippe Prados in :issue:`41428`.) Other Language Changes ====================== diff --git a/Misc/ACKS b/Misc/ACKS index 9be0e777ca2942..08449fe08269bd 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1257,6 +1257,7 @@ Grant Olson Furkan Onder Koray Oner Ethan Onstott +Ken Jin Ooi Piet van Oostrum Tomas Oppelstrup Jason Orendorff diff --git a/Misc/NEWS.d/next/Documentation/2020-10-03-18-20-46.bpo-41428._ju1NE.rst b/Misc/NEWS.d/next/Documentation/2020-10-03-18-20-46.bpo-41428._ju1NE.rst new file mode 100644 index 00000000000000..2c333934560197 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-10-03-18-20-46.bpo-41428._ju1NE.rst @@ -0,0 +1 @@ +Add documentation for :pep:`604` (Allow writing union types as ``X | Y``). From bcbca14ea9eeca609150510249362b159b3500fb Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Mon, 5 Oct 2020 10:09:16 +0200 Subject: [PATCH 0208/1261] bpo-41557: Update macOS installer to use SQLite 3.33.0 (GH-21959) https://sqlite.org/releaselog/3_33_0.html --- Mac/BuildScript/build-installer.py | 6 +++--- .../next/macOS/2020-08-26-09-31-37.bpo-41557.mcQ75z.rst | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2020-08-26-09-31-37.bpo-41557.mcQ75z.rst diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index a58b922ce30b83..2548b212d9ea42 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -307,9 +307,9 @@ def library_recipes(): ), ), dict( - name="SQLite 3.32.3", - url="https://sqlite.org/2020/sqlite-autoconf-3320300.tar.gz", - checksum='2e3911a3c15e85c2f2d040154bbe5ce3', + name="SQLite 3.33.0", + url="https://sqlite.org/2020/sqlite-autoconf-3330000.tar.gz", + checksum='842a8a100d7b01b09e543deb2b7951dd', extra_cflags=('-Os ' '-DSQLITE_ENABLE_FTS5 ' '-DSQLITE_ENABLE_FTS4 ' diff --git a/Misc/NEWS.d/next/macOS/2020-08-26-09-31-37.bpo-41557.mcQ75z.rst b/Misc/NEWS.d/next/macOS/2020-08-26-09-31-37.bpo-41557.mcQ75z.rst new file mode 100644 index 00000000000000..5f2d9937c0606d --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2020-08-26-09-31-37.bpo-41557.mcQ75z.rst @@ -0,0 +1 @@ +Update macOS installer to use SQLite 3.33.0. From 73b63e4c853bde31ac4c6c6918321ab3fc7fcdb5 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 5 Oct 2020 12:32:00 +0300 Subject: [PATCH 0209/1261] bpo-41936. Remove macros Py_ALLOW_RECURSION/Py_END_ALLOW_RECURSION (GH-22552) --- Doc/whatsnew/3.10.rst | 5 +++++ Include/ceval.h | 8 -------- Include/cpython/pystate.h | 2 -- .../next/C API/2020-10-05-01-25-23.bpo-41936.1gb5ra.rst | 3 +++ Python/ceval.c | 3 --- Python/pystate.c | 1 - 6 files changed, 8 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-10-05-01-25-23.bpo-41936.1gb5ra.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 9c3a0287d55095..1ea5aeac8a3c62 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -365,3 +365,8 @@ Removed * Removed ``_Py_CheckRecursionLimit`` variable: it has been replaced by ``ceval.recursion_limit`` of the :c:type:`PyInterpreterState` structure. (Contributed by Victor Stinner in :issue:`41834`.) + +* Removed undocumented macros ``Py_ALLOW_RECURSION`` and + ``Py_END_ALLOW_RECURSION`` and the ``recursion_critical`` field of the + :c:type:`PyInterpreterState` structure. + (Contributed by Serhiy Storchaka in :issue:`41936`.) diff --git a/Include/ceval.h b/Include/ceval.h index 0f372e2044a1c8..0f687666e2bccf 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -67,14 +67,6 @@ PyAPI_FUNC(int) Py_GetRecursionLimit(void); PyAPI_FUNC(int) Py_EnterRecursiveCall(const char *where); PyAPI_FUNC(void) Py_LeaveRecursiveCall(void); -#define Py_ALLOW_RECURSION \ - do { unsigned char _old = PyThreadState_GET()->recursion_critical;\ - PyThreadState_GET()->recursion_critical = 1; - -#define Py_END_ALLOW_RECURSION \ - PyThreadState_GET()->recursion_critical = _old; \ - } while(0); - PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *); PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *); diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 42a7fc163064dc..5d5e4e331978ac 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -56,8 +56,6 @@ struct _ts { int recursion_depth; char overflowed; /* The stack has overflowed. Allow 50 more calls to handle the runtime error. */ - char recursion_critical; /* The current calls must not cause - a stack overflow. */ int stackcheck_counter; /* 'tracing' keeps track of the execution depth when tracing/profiling. diff --git a/Misc/NEWS.d/next/C API/2020-10-05-01-25-23.bpo-41936.1gb5ra.rst b/Misc/NEWS.d/next/C API/2020-10-05-01-25-23.bpo-41936.1gb5ra.rst new file mode 100644 index 00000000000000..64613533086167 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-05-01-25-23.bpo-41936.1gb5ra.rst @@ -0,0 +1,3 @@ +Removed undocumented macros ``Py_ALLOW_RECURSION`` and +``Py_END_ALLOW_RECURSION`` and the ``recursion_critical`` field of the +:c:type:`PyInterpreterState` structure. diff --git a/Python/ceval.c b/Python/ceval.c index 7c6cf83bc9ac01..500c588e3c2afb 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -814,9 +814,6 @@ _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where) return -1; } #endif - if (tstate->recursion_critical) - /* Somebody asked that we don't check for recursion. */ - return 0; if (tstate->overflowed) { if (tstate->recursion_depth > recursion_limit + 50) { /* Overflowing while handling an overflow. Give up. */ diff --git a/Python/pystate.c b/Python/pystate.c index f6d1956e9dce9a..eb24f2b800607f 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -581,7 +581,6 @@ new_threadstate(PyInterpreterState *interp, int init) tstate->frame = NULL; tstate->recursion_depth = 0; tstate->overflowed = 0; - tstate->recursion_critical = 0; tstate->stackcheck_counter = 0; tstate->tracing = 0; tstate->use_tracing = 0; From 9e12a9696e647f66343bc110b9749808a6e997b1 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Mon, 5 Oct 2020 10:31:44 -0400 Subject: [PATCH 0210/1261] bpo-41774: Tweak new programming FAQ entry (GH-22562) Remove mention of space in "remove multiple items from list". --- Doc/faq/programming.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 0b486d7e7e254a..7bcedb0b5d75b4 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1176,7 +1176,7 @@ Here are three variations.:: mylist[:] = (x for x in mylist if keep_condition) mylist[:] = [x for x in mylist if keep_condition] -If space is not an issue, the list comprehension may be fastest. +The list comprehension may be fastest. How do you make an array in Python? From 36018d25cadaa8b9c949c7abd5d67daa30548b5c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 5 Oct 2020 18:24:00 +0200 Subject: [PATCH 0211/1261] bpo-41939: Fix test_site.test_license_exists_at_url() (#22559) Call urllib.request.urlcleanup() to reset the global urllib.request._opener. --- Lib/test/test_site.py | 2 ++ .../NEWS.d/next/Tests/2020-10-05-09-37-43.bpo-41939.P4OlbA.rst | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2020-10-05-09-37-43.bpo-41939.P4OlbA.rst diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index d3ee68facdbc3d..a475ed1ab4c469 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -525,6 +525,8 @@ def test_license_exists_at_url(self): # string displayed by license in the absence of a LICENSE file. url = license._Printer__data.split()[1] req = urllib.request.Request(url, method='HEAD') + # Reset global urllib.request._opener + self.addCleanup(urllib.request.urlcleanup) try: with socket_helper.transient_internet(url): with urllib.request.urlopen(req) as data: diff --git a/Misc/NEWS.d/next/Tests/2020-10-05-09-37-43.bpo-41939.P4OlbA.rst b/Misc/NEWS.d/next/Tests/2020-10-05-09-37-43.bpo-41939.P4OlbA.rst new file mode 100644 index 00000000000000..e58ad2616da1ba --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-10-05-09-37-43.bpo-41939.P4OlbA.rst @@ -0,0 +1,3 @@ +Fix test_site.test_license_exists_at_url(): call +``urllib.request.urlcleanup()`` to reset the global +``urllib.request._opener``. Patch by Victor Stinner. From 67a55b0165aae1eed47c5cc2d3af0a85b5ac2a2c Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Mon, 5 Oct 2020 09:42:21 -0700 Subject: [PATCH 0212/1261] bpo-41584: clarify when the reflected method of a binary arithemtic operator is called (#22505) --- Doc/reference/datamodel.rst | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index a817408c3b1ef5..4396f1b9b72997 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2376,10 +2376,11 @@ left undefined. .. note:: - If the right operand's type is a subclass of the left operand's type and that - subclass provides the reflected method for the operation, this method will be - called before the left operand's non-reflected method. This behavior allows - subclasses to override their ancestors' operations. + If the right operand's type is a subclass of the left operand's type and + that subclass provides a different implementation of the reflected method + for the operation, this method will be called before the left operand's + non-reflected method. This behavior allows subclasses to override their + ancestors' operations. .. method:: object.__iadd__(self, other) @@ -2771,6 +2772,6 @@ An example of an asynchronous context manager class:: method—that will instead have the opposite effect of explicitly *blocking* such fallback. -.. [#] For operands of the same type, it is assumed that if the non-reflected method - (such as :meth:`__add__`) fails the operation is not supported, which is why the - reflected method is not called. +.. [#] For operands of the same type, it is assumed that if the non-reflected + method -- such as :meth:`__add__` -- fails then the overall operation is not + supported, which is why the reflected method is not called. From c5ca15f89164a2d15f93c941e5418ed4c01a6f9a Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 5 Oct 2020 18:24:54 +0100 Subject: [PATCH 0213/1261] Python 3.10.0a1 --- Include/patchlevel.h | 4 +- Lib/pydoc_data/topics.py | 1134 +++--- Misc/NEWS.d/3.10.0a1.rst | 3519 +++++++++++++++++ .../2020-05-19-10-54-08.bpo-40683.W8JHrr.rst | 2 - .../2020-06-08-19-57-05.bpo-40684.WIY2-i.rst | 2 - .../2020-06-15-22-14-25.bpo-36020.wbiv0P.rst | 2 - .../2020-06-25-06-59-13.bpo-40204.GpD04D.rst | 1 - .../2020-08-24-18-34-01.bpo-41617.sKKXz7.rst | 2 - .../2020-09-28-21-56-51.bpo-38249.uzMCaZ.rst | 2 - .../2020-02-08-08-01-35.bpo-39583.qURKSl.rst | 1 - .../2020-05-20-19-11-12.bpo-40703.qQXfW8.rst | 2 - .../2020-05-26-16-21-47.bpo-39573.depAgq.rst | 5 - .../2020-05-27-11-02-15.bpo-40792.pBw2Bb.rst | 2 - .../2020-06-01-16-12-37.bpo-40826.zQzFoK.rst | 2 - .../2020-06-01-20-47-49.bpo-40839.bAi52Z.rst | 2 - .../2020-06-03-17-48-13.bpo-40679.3sgWma.rst | 1 - .../2020-06-04-08-01-23.bpo-40724.qIIdSi.rst | 1 - .../2020-06-08-15-59-06.bpo-40910.L56oI0.rst | 3 - .../2020-06-10-18-37-26.bpo-40943.i4q7rK.rst | 5 - .../2020-06-15-16-46-01.bpo-36020.djI6jw.rst | 2 - .../2020-06-15-23-17-51.bpo-40989.tlzG3r.rst | 3 - .../2020-06-17-11-24-00.bpo-36346.fTMr3S.rst | 4 - .../2020-06-17-20-31-12.bpo-36346.mwIyxi.rst | 2 - .../2020-06-24-22-57-07.bpo-41103.doojgE.rst | 4 - .../2020-06-26-13-29-25.bpo-41123.bRa1oy.rst | 1 - .../2020-06-28-11-39-22.bpo-41123.sjJWjQ.rst | 1 - .../2020-06-29-11-33-49.bpo-41123.qFevek.rst | 1 - .../2020-06-29-15-49-36.bpo-41123.wYY4E1.rst | 1 - .../2020-07-08-10-14-52.bpo-40170.N6Qx1i.rst | 4 - .../2020-07-26-19-39-45.bpo-30155.rHZRJ_.rst | 3 - .../2020-08-10-16-05-08.bpo-41324.waZD35.rst | 3 - .../2020-08-12-17-09-06.bpo-41524.u6Xfr2.rst | 2 - .../2020-09-01-23-39-45.bpo-41689.zxHbLB.rst | 2 - .../2020-09-22-14-47-12.bpo-41834.nrOrDU.rst | 3 - .../2020-09-27-20-43-16.bpo-41842.bCakAj.rst | 2 - .../2020-10-02-00-57-34.bpo-41692.fDScsF.rst | 3 - .../2020-10-05-01-25-23.bpo-41936.1gb5ra.rst | 3 - .../2018-03-15-11-51-36.bpo-26680.wOWYps.rst | 2 - .../2018-08-29-15-57-07.bpo-19569.RGu2Kb.rst | 2 - .../2019-05-25-05-27-39.bpo-36982.0UHgfB.rst | 1 - .../2019-06-02-11-29-15.bpo-29882.AkRzjb.rst | 2 - .../2019-09-01-14-26-02.bpo-37999.XPl6dn.rst | 5 - ...2020-04-05-02-35-08.bpo-1635741.Kfe9fT.rst | 1 - ...2020-04-10-23-54-57.bpo-1635741.ZURqoN.rst | 1 - .../2020-04-11-13-07-49.bpo-4022.Ctpn_F.rst | 1 - .../2020-05-03-22-26-00.bpo-29590.aRz3l7.rst | 2 - .../2020-05-19-19-39-49.bpo-40679.SVzz9p.rst | 2 - .../2020-05-20-01-17-34.bpo-40521.wvAehI.rst | 9 - .../2020-05-21-01-54-00.bpo-40696.u3n8Wx.rst | 2 - .../2020-05-22-00-34-34.bpo-39573.QO2QHj.rst | 2 - .../2020-05-23-01-15-51.bpo-40217.jZsHTc.rst | 4 - .../2020-05-24-02-42-26.bpo-40750.ZmO9Ev.rst | 1 - .../2020-05-25-21-49-11.bpo-38964.lrml90.rst | 1 - .../2020-05-26-17-43-58.bpo-40780.3Ckdgm.rst | 2 - .../2020-05-27-22-37-58.bpo-40792.WEDqqU.rst | 3 - .../2020-05-30-14-37-18.bpo-40824.XR3V5s.rst | 4 - .../2020-05-30-23-18-35.bpo-19468.S-TA7p.rst | 2 - ...2020-05-30-23-23-35.bpo-1635741.0D-laM.rst | 1 - .../2020-06-01-20-31-07.bpo-40826.XCI4M2.rst | 2 - .../2020-06-03-13-53-24.bpo-40854.O6vfQU.rst | 1 - .../2020-06-05-12-48-28.bpo-40870.9cd2sk.rst | 2 - .../2020-06-05-23-25-00.bpo-40883.M6sQ-Q.rst | 1 - .../2020-06-06-00-23-19.bpo-40880.fjdzSh.rst | 2 - .../2020-06-07-22-50-10.bpo-40903.7dWejS.rst | 1 - .../2020-06-08-01-08-57.bpo-40904.76qQzo.rst | 2 - .../2020-06-08-22-46-33.bpo-40889.vIBl-W.rst | 1 - .../2020-06-09-00-20-13.bpo-40890.LoRV-g.rst | 1 - .../2020-06-09-23-52-32.bpo-40847.4XAACw.rst | 4 - .../2020-06-10-11-27-15.bpo-40939.DO-wAI.rst | 1 - .../2020-06-11-16-06-49.bpo-40947.72cZcR.rst | 2 - .../2020-06-12-00-12-28.bpo-40950.tzMy7m.rst | 2 - .../2020-06-12-12-21-54.bpo-40957.Z8n6I6.rst | 1 - ...2020-06-12-22-56-17.bpo-1635741.mmlp3Q.rst | 1 - .../2020-06-15-01-20-44.bpo-40958.7O2Wh1.rst | 2 - .../2020-06-15-16-29-55.bpo-40985.IIN_xX.rst | 1 - ...2020-06-17-00-52-21.bpo-1635741.61iyYh.rst | 1 - .../2020-06-17-10-27-17.bpo-40636.MYaCIe.rst | 3 - .../2020-06-18-00-07-09.bpo-41006.H-wN-d.rst | 2 - .../2020-06-18-19-04-30.bpo-40077._yI-ax.rst | 1 - .../2020-06-20-16-59-02.bpo-40939.6810Ak.rst | 1 - .../2020-06-20-17-00-44.bpo-35975.UDHCHp.rst | 3 - .../2020-06-20-19-27-47.bpo-40939.jxJ4yn.rst | 1 - .../2020-06-20-22-46-18.bpo-41052.46MPeF.rst | 1 - .../2020-06-21-10-54-02.bpo-41061.AHf9MU.rst | 1 - .../2020-06-21-19-53-33.bpo-41056.IDu_EK.rst | 1 - .../2020-06-22-13-22-30.bpo-41076.eWYw2N.rst | 1 - .../2020-06-23-07-35-11.bpo-40521.dMNA6k.rst | 1 - .../2020-06-23-15-10-19.bpo-41084.pt3y7F.rst | 1 - .../2020-06-23-18-32-41.bpo-39960.Kez3fP.rst | 2 - .../2020-06-23-23-26-42.bpo-41094.zEIJse.rst | 2 - .../2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 - .../2020-06-30-20-17-31.bpo-41175.acJoXB.rst | 2 - ...2020-07-01-20-17-38.bpo-1635741.-AtPYu.rst | 1 - ...2020-07-03-23-10-02.bpo-1635741.F5coWe.rst | 1 - .../2020-07-06-13-35-17.bpo-41218.oKnSr2.rst | 4 - .../2020-07-06-18-36-33.bpo-41215.vFGFIz.rst | 2 - ...2020-07-06-20-43-19.bpo-1635741.LYhsni.rst | 1 - ...2020-07-07-16-10-52.bpo-1635741.zU-H_n.rst | 1 - .../2020-07-08-21-55-23.bpo-41252.nBWL-Y.rst | 1 - .../2020-07-08-22-03-54.bpo-41247.PndYIk.rst | 2 - .../2020-07-17-11-31-54.bpo-41323.ChbZHh.rst | 3 - .../2020-07-18-08-15-32.bpo-41295.pu8Ezo.rst | 3 - .../2020-07-18-18-01-10.bpo-41334.t5xMGp.rst | 2 - .../2020-07-19-15-40-52.bpo-41342.RRk_m_.rst | 1 - .../2020-07-20-17-01-17.bpo-38156.ptcdRy.rst | 1 - .../2020-07-27-01-50-06.bpo-41340.pZXfcF.rst | 1 - .../2020-07-28-22-43-27.bpo-41428.FM6xsI.rst | 1 - .../2020-08-02-15-53-12.bpo-41431.TblUBT.rst | 2 - ...2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst | 2 - .../2020-08-12-07-35-07.bpo-41525.d9q3XL.rst | 1 - .../2020-08-12-19-32-15.bpo-41531.WgPzjT.rst | 2 - .../2020-08-12-20-29-57.bpo-41533.4pcVAc.rst | 2 - ...2020-08-13-07-18-05.bpo-1635741.FC13e7.rst | 1 - ...2020-08-13-07-19-21.bpo-1653741.fubBkb.rst | 1 - .../2020-08-25-22-43-33.bpo-40077.vcxSUa.rst | 1 - .../2020-08-26-11-23-31.bpo-41631.3jZcd9.rst | 5 - ...2020-08-28-20-54-04.bpo-1635741.7ijlcI.rst | 1 - .../2020-08-30-20-38-33.bpo-41654.HtnhAM.rst | 2 - .../2020-08-31-11-37-59.bpo-41670.vmRJRx.rst | 4 - .../2020-08-31-14-53-17.bpo-41675.VSoqWU.rst | 3 - .../2020-08-31-17-49-02.bpo-41681.3-VJiH.rst | 2 - ...2020-09-01-17-06-02.bpo-1635741.5jZymK.rst | 2 - ...2020-09-01-17-08-07.bpo-1635741.X9CZgo.rst | 2 - ...2020-09-01-17-22-35.bpo-1635741.CnRME3.rst | 2 - .../2020-09-02-12-00-57.bpo-41690.Ny-Sfy.rst | 2 - ...2020-09-07-09-45-47.bpo-1635741.QuDIut.rst | 1 - ...2020-09-07-11-35-02.bpo-1635741.rvIexb.rst | 2 - ...2020-09-08-20-39-43.bpo-1635741.jiXmyT.rst | 2 - ...2020-09-08-21-58-47.bpo-1635741.vdjSLH.rst | 2 - .../2020-09-12-12-55-45.bpo-41756.1h0tbV.rst | 2 - ...2020-09-12-18-34-34.bpo-1635741.lh335O.rst | 2 - .../2020-09-15-23-29-49.bpo-41780.bOBUIH.rst | 2 - .../2020-09-24-12-15-45.bpo-39934.YVHTCF.rst | 3 - ...2020-09-26-14-43-30.bpo-1635741.aJS9B3.rst | 1 - .../2020-09-27-22-23-14.bpo-41870.2v6_v4.rst | 2 - .../2020-09-28-08-58-28.bpo-41873.VzEDhA.rst | 1 - .../2020-10-04-01-02-58.bpo-41922.kHGT8I.rst | 2 - .../2020-10-04-10-55-12.bpo-41909.BqHPcm.rst | 2 - .../2019-08-16-20-25-42.bpo-37703.Qm_l_H.rst | 2 - .../2020-03-07-03-53-39.bpo-39883.1tnb4-.rst | 1 - .../2020-05-09-12-10-31.bpo-40552._0uB73.rst | 2 - .../2020-07-21-15-23-30.bpo-40979.pLA8rO.rst | 1 - .../2020-07-25-14-20-00.bpo-41314.yrjko0.rst | 1 - .../2020-07-27-20-46-17.bpo-41045.GFF6Ul.rst | 1 - .../2020-08-12-18-35-40.bpo-40204.C8A_pe.rst | 3 - .../2020-08-25-15-11-23.bpo-41624.ddjJlN.rst | 1 - .../2020-09-08-16-57-09.bpo-41726.g0UXrn.rst | 1 - .../2020-09-10-07-48-02.bpo-37149.VD0rCv.rst | 1 - .../2020-09-12-17-37-13.bpo-35293._cOwPD.rst | 1 - .../2020-09-24-15-35-13.bpo-41774.5IqdGP.rst | 2 - .../2020-10-03-18-20-46.bpo-41428._ju1NE.rst | 1 - .../2020-05-24-06-19-43.bpo-40723.AJLd4U.rst | 1 - .../2020-05-29-18-21-58.bpo-39885.zB_-bN.rst | 2 - .../2020-06-27-17-02-00.bpo-41144.JoFGIX.rst | 1 - .../2020-06-29-14-51-15.bpo-41152.d6mV0C.rst | 2 - .../2020-07-07-18-44-30.bpo-37765.umc1o8.rst | 2 - .../2020-07-16-17-39-06.bpo-41300.wRixNb.rst | 2 - .../2020-07-24-17-49-58.bpo-41373.YQIPu_.rst | 3 - .../2020-08-09-13-42-55.bpo-41468.zkP0_Y.rst | 1 - .../2020-09-22-00-45-40.bpo-40181.hhQi3z.rst | 2 - .../2020-09-22-11-13-45.bpo-35764.VoNa8y.rst | 1 - .../2020-09-24-14-31-16.bpo-41775.sB8Vre.rst | 1 - .../2018-03-15-11-55-04.bpo-26680.eKAi85.rst | 3 - .../2018-03-15-11-56-48.bpo-26680.Udkhn4.rst | 2 - .../2018-06-07-22-04-01.bpo-28557.ViNJnK.rst | 1 - .../2018-06-12-23-30-41.bpo-33660.AdDn5Z.rst | 2 - .../2018-07-29-12-14-54.bpo-34226.BE7zbu.rst | 1 - .../2018-07-30-12-48-17.bpo-31844.0_GKsD.rst | 4 - .../2018-08-21-16-20-33.bpo-29620.xxx666.rst | 3 - .../2018-10-27-09-37-03.bpo-35078.kweA3R.rst | 3 - .../2019-03-01-01-56-23.bpo-33944.-82Pkt.rst | 1 - .../2019-03-17-19-01-53.bpo-36290.7VXo_K.rst | 2 - .../2019-05-31-23-54-28.bpo-12178.N6FLCZ.rst | 3 - .../2019-08-11-16-28-03.bpo-26543.X-TJZO.rst | 1 - .../2019-09-12-21-34-03.bpo-38144.8uQCdd.rst | 1 - .../2019-10-25-23-45-49.bpo-35714.fw3xb7.rst | 2 - .../2019-11-13-07-37-11.bpo-38731.9qmcSx.rst | 2 - .../2019-12-15-18-47-20.bpo-39040.tKa0Qs.rst | 2 - .../2020-02-23-15-09-47.bpo-39244.aBK5IM.rst | 2 - .../2020-02-24-10-58-34.bpo-39728.kOOaHn.rst | 1 - .../2020-03-11-07-44-06.bpo-31122.zIQ80l.rst | 1 - .../2020-03-29-21-32-00.bpo-40084.MCYwcv.rst | 1 - .../2020-04-03-16-13-59.bpo-40105.hfM2c0.rst | 2 - .../2020-04-18-14-16-02.bpo-40318.K2UdRx.rst | 1 - .../2020-04-20-22-08-36.bpo-23082.iX90Id.rst | 1 - .../2020-04-23-18-21-19.bpo-39385.MIAyS7.rst | 3 - .../2020-05-06-02-01-25.bpo-13097.Wh5xSK.rst | 1 - .../2020-05-07-22-00-12.bpo-39881.E1xsNv.rst | 2 - .../2020-05-13-16-28-33.bpo-40611.ZCk0_c.rst | 1 - .../2020-05-15-21-14-45.bpo-36543.Jt-eSX.rst | 1 - .../2020-05-17-02-03-09.bpo-32309.KM9psl.rst | 4 - .../2020-05-18-15-26-31.bpo-40671.NeZ9Cy.rst | 1 - .../2020-05-18-15-38-25.bpo-25920.PxrLY8.rst | 7 - .../2020-05-18-17-29-30.bpo-40626.NeZufF.rst | 1 - .../2020-05-18-22-41-02.bpo-40614.8j3kmq.rst | 1 - .../2020-05-20-12-53-20.bpo-9216.ps7Yf1.rst | 3 - .../2020-05-20-13-03-28.bpo-40695.lr4aIS.rst | 3 - .../2020-05-20-14-38-04.bpo-40698.zwl5Hc.rst | 2 - .../2020-05-22-12-45-58.bpo-40726.7oBdMw.rst | 2 - .../2020-05-23-00-22-11.bpo-40737.iph-CM.rst | 1 - .../2020-05-23-04-18-00.bpo-37129.YoYoYo.rst | 1 - .../2020-05-24-11-06-37.bpo-40756.7ZH83z.rst | 2 - .../2020-05-24-23-52-35.bpo-40759.DdZdaw.rst | 1 - .../2020-05-25-11-52-23.bpo-30064.6CICsH.rst | 1 - .../2020-05-25-22-18-38.bpo-30008.CKC3td.rst | 2 - .../2020-05-27-00-09-52.bpo-16995.4niOT7.rst | 2 - .../2020-05-27-17-00-18.bpo-40795.eZSnHA.rst | 4 - .../2020-05-27-18-04-52.bpo-40791.IzpNor.rst | 2 - .../2020-05-27-21-27-01.bpo-40767.L5MnVV.rst | 3 - .../2020-05-27-22-19-42.bpo-40792.87Yx01.rst | 2 - .../2020-05-28-16-51-00.bpo-38488.hFQNgA.rst | 1 - .../2020-05-28-17-32-29.bpo-40777.1kJU6N.rst | 2 - .../2020-05-30-08-10-23.bpo-40744.jKURVV.rst | 4 - .../2020-05-30-12-44-29.bpo-39384.Iqxy3q.rst | 1 - .../2020-05-30-14-19-47.bpo-26407.MjWLO1.rst | 3 - .../2020-05-30-18-48-58.bpo-40755.IyOe2J.rst | 1 - .../2020-05-31-15-52-18.bpo-40834.MO9_hb.rst | 1 - .../2020-05-31-23-32-36.bpo-17005.JlRUGB.rst | 4 - .../2020-06-01-02-16-29.bpo-39314.0T9hlA.rst | 3 - .../2020-06-02-02-16-02.bpo-39791.StCJlA.rst | 1 - .../2020-06-02-23-49-07.bpo-32604.ZN4V4l.rst | 2 - .../2020-06-04-16-25-15.bpo-40807.yYyLWx.rst | 2 - .../2020-06-05-19-29-10.bpo-39791._CcO3d.rst | 1 - .../2020-06-05-20-00-18.bpo-40876.zDhiZj.rst | 1 - .../2020-06-06-02-42-26.bpo-40884.n7fOwS.rst | 3 - .../2020-06-06-14-09-55.bpo-33689.EFUDH7.rst | 4 - .../2020-06-08-18-59-16.bpo-23427.ilg1Cz.rst | 2 - .../2020-06-11-11-07-10.bpo-40939.-D5Asl.rst | 1 - .../2020-06-12-10-44-15.bpo-40855.jSot83.rst | 2 - .../2020-06-12-11-55-30.bpo-40955.huixCg.rst | 1 - .../2020-06-13-12-04-50.bpo-40924.SM_luS.rst | 3 - .../2020-06-15-00-13-57.bpo-40967._dx3OO.rst | 2 - .../2020-06-15-12-22-53.bpo-40448.1dk8Bu.rst | 2 - .../2020-06-17-17-26-24.bpo-41002.NPBItE.rst | 1 - .../2020-06-17-23-49-45.bpo-35018.NP5_Qk.rst | 2 - .../2020-06-18-10-34-59.bpo-41025.elf_nz.rst | 2 - .../2020-06-20-00-19-30.bpo-41043.p-Pk-H.rst | 2 - .../2020-06-20-10-16-57.bpo-41048.hEXB-B.rst | 2 - .../2020-06-20-18-33-03.bpo-41056.gTH4Bq.rst | 1 - .../2020-06-20-18-35-43.bpo-41056.Garcle.rst | 1 - .../2020-06-20-18-37-29.bpo-41056.d9v_uL.rst | 1 - .../2020-06-20-21-03-55.bpo-41058.gztdZy.rst | 1 - .../2020-06-22-10-25-39.bpo-41068._bX2BW.rst | 2 - .../2020-06-22-20-08-40.bpo-31938.EVuko9.rst | 1 - .../2020-06-23-06-09-59.bpo-40521.HUfxP7.rst | 1 - .../2020-06-25-10-11-47.bpo-31082.HsgDkx.rst | 1 - .../2020-06-27-13-51-36.bpo-41138.bIpf7g.rst | 2 - .../2020-06-28-21-16-51.bpo-40874.YImvzA.rst | 1 - .../2020-06-30-20-50-51.bpo-41161.QTdJjz.rst | 2 - .../2020-07-01-17-33-50.bpo-41182.FPFI0N.rst | 1 - .../2020-07-02-11-53-45.bpo-41193.8-Tnql.rst | 4 - .../2020-07-02-15-03-04.bpo-41195.cEnpO3.rst | 2 - .../2020-07-03-13-15-08.bpo-41194.djrKjs.rst | 2 - .../2020-07-04-21-56-46.bpo-39168.DQWsXj.rst | 1 - .../2020-07-05-19-16-02.bpo-29727.Q6Z2rg.rst | 2 - .../2020-07-06-16-58-53.bpo-41207.Emw7Nk.rst | 1 - .../2020-07-07-21-56-26.bpo-41235.H2csMU.rst | 1 - .../2020-07-11-00-15-01.bpo-41273.SVrsJh.rst | 3 - .../2020-07-12-22-16-58.bpo-39017.x3Cg-9.rst | 1 - .../2020-07-13-15-06-35.bpo-41288.8mn5P-.rst | 2 - .../2020-07-18-18-07-40.bpo-41333.upkHIm.rst | 1 - .../2020-07-20-13-27-48.bpo-41344.iKipNd.rst | 1 - .../2020-07-20-19-13-17.bpo-41341.wqrj8C.rst | 1 - .../2020-07-21-16-20-55.bpo-35328.jXovHb.rst | 2 - .../2020-07-21-21-45-55.bpo-41364.5O-k7A.rst | 1 - .../2020-07-23-01-18-34.bpo-41317.O17Z6x.rst | 2 - .../2020-07-26-21-18-43.bpo-41384.MlzIgV.rst | 2 - .../2020-07-28-12-08-58.bpo-41316.bSCbK4.rst | 1 - .../2020-07-30-14-56-58.bpo-41440.rju34k.rst | 1 - .../2020-08-01-00-51-15.bpo-41421.dHKRVB.rst | 3 - .../2020-08-03-01-59-48.bpo-41425.KJo6zF.rst | 1 - .../2020-08-04-00-20-30.bpo-41467.Z8DgTL.rst | 3 - .../2020-08-07-06-06-29.bpo-41497.aBtsWz.rst | 1 - .../2020-08-07-15-18-16.bpo-41503.IYftcu.rst | 1 - .../2020-08-09-18-16-05.bpo-41513.e6K6EK.rst | 2 - .../2020-08-12-07-43-31.bpo-41528.bu83oD.rst | 1 - .../2020-08-12-13-25-16.bpo-41520.BEUWa4.rst | 1 - .../2020-08-13-08-07-25.bpo-40782.aGZqmB.rst | 1 - .../2020-08-15-15-21-40.bpo-37658.f9nivB.rst | 2 - .../2020-08-15-15-50-12.bpo-32751.85je5X.rst | 3 - .../2020-08-15-18-17-21.bpo-39994.dOgPOh.rst | 1 - .../2020-08-21-15-51-15.bpo-41609.JmiUKG.rst | 1 - .../2020-08-23-14-23-18.bpo-41513.DGqc_I.rst | 3 - .../2020-08-29-16-07-36.bpo-41662.Mn79zh.rst | 1 - .../2020-08-29-16-45-12.bpo-41638.iZfW5N.rst | 3 - .../2020-08-30-10-24-26.bpo-39010._mzXJW.rst | 2 - .../2020-08-30-21-38-57.bpo-41662.6e9iZn.rst | 2 - .../2020-09-01-15-57-51.bpo-41687.m1b1KA.rst | 1 - .../2020-09-03-01-35-32.bpo-41696.zkYGre.rst | 1 - .../2020-09-04-20-45-38.bpo-41720.PW9MzZ.rst | 2 - .../2020-09-06-20-27-10.bpo-41732.1SKv26.rst | 1 - ...2020-09-08-13-51-16.bpo-1635741.wkPeoT.rst | 2 - ...2020-09-08-13-55-34.bpo-1635741.56MLP-.rst | 2 - .../2020-09-11-12-38-55.bpo-39651.JMp9l2.rst | 3 - .../2020-09-12-16-18-42.bpo-32218.IpYkEe.rst | 1 - .../2020-09-14-19-27-46.bpo-41789.pI_uZQ.rst | 2 - .../2020-09-15-07-55-35.bpo-41792.qMpSlU.rst | 6 - .../2020-09-15-14-56-13.bpo-39587.69xzuh.rst | 1 - .../2020-09-15-22-43-30.bpo-41517.sLBH7g.rst | 1 - .../2020-09-19-12-22-08.bpo-41816.ynynXJ.rst | 2 - .../2020-09-19-23-14-54.bpo-41815.RNpuX3.rst | 2 - .../2020-09-20-15-14-05.bpo-41810.7l8lyV.rst | 3 - .../2020-09-22-00-23-30.bpo-41817.bnh-VG.rst | 1 - .../2020-09-22-13-51-14.bpo-41833.6HVDjT.rst | 2 - .../2020-09-22-14-55-34.bpo-40670.R5sm68.rst | 3 - .../2020-09-23-03-33-37.bpo-40564.iXQqMq.rst | 1 - .../2020-09-23-22-52-24.bpo-41842.lIuhC9.rst | 1 - .../2020-09-23-23-17-59.bpo-41840.QRFr4L.rst | 3 - .../2020-09-28-23-22-25.bpo-41773.oKkus0.rst | 2 - .../2020-09-30-23-49-42.bpo-41887.-ee2S-.rst | 2 - .../2020-10-01-10-50-12.bpo-41900.Cho7oh.rst | 2 - .../2020-02-12-14-17-39.bpo-39603.Gt3RSg.rst | 2 - .../2020-06-29-16-02-29.bpo-41004.ovF0KZ.rst | 1 - .../2020-07-03-17-21-37.bpo-29778.cR_fGS.rst | 2 - .../2020-07-03-20-41-29.bpo-41162.tb8pVj.rst | 1 - .../2020-07-15-20-15-08.bpo-41304.vNEeYA.rst | 1 - .../2018-08-20-09-38-52.bpo-34401.eGxMPm.rst | 1 - .../2019-09-14-13-20-27.bpo-38169.hurq4B.rst | 1 - .../2020-04-09-15-40-03.bpo-31904.TJ4k3d.rst | 1 - .../2020-05-26-07-53-31.bpo-17258.X_IKTQ.rst | 1 - .../2020-06-09-18-48-18.bpo-40927.67ylLg.rst | 2 - .../2020-06-12-20-46-23.bpo-40964.OBzf2c.rst | 2 - .../2020-06-17-15-07-14.bpo-41003.tiH_Fy.rst | 3 - .../2020-06-17-17-27-07.bpo-41009.Rvn6OQ.rst | 2 - .../2020-06-17-18-00-21.bpo-38377.jfg4TH.rst | 4 - .../2020-06-22-00-21-12.bpo-41069.bLZkX-.rst | 2 - .../2020-06-23-12-02-45.bpo-41085.JZKsyz.rst | 2 - .../2020-08-07-17-28-49.bpo-41477.GrFexU.rst | 1 - .../2020-08-11-14-59-13.bpo-41521.w2UYK7.rst | 2 - .../2020-08-25-19-25-36.bpo-41602.Z64s0I.rst | 1 - .../2020-09-11-19-12-31.bpo-41731.Ivxh4U.rst | 1 - .../2020-10-05-09-37-43.bpo-41939.P4OlbA.rst | 3 - .../2019-07-11-06-11-09.bpo-37556.sygMUU.rst | 1 - .../2020-05-19-04-11-12.bpo-40677.qQbLW8.rst | 1 - .../2020-05-19-14-43-33.bpo-39631.Z5yXam.rst | 2 - .../2020-06-12-13-13-44.bpo-40164.SPrSn5.rst | 1 - .../2020-06-23-03-12-57.bpo-41039.0hgd0s.rst | 2 - .../2020-06-24-21-30-42.bpo-41074.gaQc3C.rst | 3 - .../2020-06-28-12-40-41.bpo-41142.jpZzzh.rst | 2 - .../2020-07-20-23-26-26.bpo-40741.C9sc_d.rst | 1 - .../2020-07-28-11-55-43.bpo-41412.ME20KB.rst | 2 - .../2020-07-28-12-39-32.bpo-40948.ISUFO6.rst | 1 - .../2020-08-06-16-59-10.bpo-41492.2FQ9cM.rst | 1 - .../2020-08-13-22-40-58.bpo-41526.-i2bwb.rst | 2 - .../2020-09-04-21-35-28.bpo-41627.sx2KN1.rst | 2 - .../2020-09-11-17-59-33.bpo-41744.e_ugDQ.rst | 1 - .../2020-06-07-20-10-56.bpo-40741.80A2BW.rst | 1 - .../2020-06-17-13-45-15.bpo-41005.zZegdV.rst | 1 - .../2020-06-19-14-19-08.bpo-40741.L7yTbm.rst | 1 - .../2020-06-24-13-51-57.bpo-41100.mcHdc5.rst | 7 - .../2020-06-25-06-09-00.bpo-39580.N_vJ9h.rst | 2 - .../2020-08-26-09-31-37.bpo-41557.mcQ75z.rst | 1 - README.rst | 2 +- 353 files changed, 4132 insertions(+), 1177 deletions(-) create mode 100644 Misc/NEWS.d/3.10.0a1.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-05-19-10-54-08.bpo-40683.W8JHrr.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-06-08-19-57-05.bpo-40684.WIY2-i.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-06-15-22-14-25.bpo-36020.wbiv0P.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-06-25-06-59-13.bpo-40204.GpD04D.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-08-24-18-34-01.bpo-41617.sKKXz7.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-09-28-21-56-51.bpo-38249.uzMCaZ.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-02-08-08-01-35.bpo-39583.qURKSl.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-05-20-19-11-12.bpo-40703.qQXfW8.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-05-26-16-21-47.bpo-39573.depAgq.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-05-27-11-02-15.bpo-40792.pBw2Bb.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-01-16-12-37.bpo-40826.zQzFoK.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-01-20-47-49.bpo-40839.bAi52Z.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-03-17-48-13.bpo-40679.3sgWma.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-04-08-01-23.bpo-40724.qIIdSi.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-08-15-59-06.bpo-40910.L56oI0.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-10-18-37-26.bpo-40943.i4q7rK.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-15-16-46-01.bpo-36020.djI6jw.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-15-23-17-51.bpo-40989.tlzG3r.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-17-11-24-00.bpo-36346.fTMr3S.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-17-20-31-12.bpo-36346.mwIyxi.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-24-22-57-07.bpo-41103.doojgE.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-26-13-29-25.bpo-41123.bRa1oy.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-28-11-39-22.bpo-41123.sjJWjQ.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-29-11-33-49.bpo-41123.qFevek.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-06-29-15-49-36.bpo-41123.wYY4E1.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-07-08-10-14-52.bpo-40170.N6Qx1i.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-07-26-19-39-45.bpo-30155.rHZRJ_.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-08-10-16-05-08.bpo-41324.waZD35.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-08-12-17-09-06.bpo-41524.u6Xfr2.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-09-01-23-39-45.bpo-41689.zxHbLB.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-09-22-14-47-12.bpo-41834.nrOrDU.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-09-27-20-43-16.bpo-41842.bCakAj.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-10-02-00-57-34.bpo-41692.fDScsF.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-10-05-01-25-23.bpo-41936.1gb5ra.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-03-15-11-51-36.bpo-26680.wOWYps.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-08-29-15-57-07.bpo-19569.RGu2Kb.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-05-25-05-27-39.bpo-36982.0UHgfB.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-06-02-11-29-15.bpo-29882.AkRzjb.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-09-01-14-26-02.bpo-37999.XPl6dn.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-04-05-02-35-08.bpo-1635741.Kfe9fT.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-04-10-23-54-57.bpo-1635741.ZURqoN.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-04-11-13-07-49.bpo-4022.Ctpn_F.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-03-22-26-00.bpo-29590.aRz3l7.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-19-19-39-49.bpo-40679.SVzz9p.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-20-01-17-34.bpo-40521.wvAehI.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-21-01-54-00.bpo-40696.u3n8Wx.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-22-00-34-34.bpo-39573.QO2QHj.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-23-01-15-51.bpo-40217.jZsHTc.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-24-02-42-26.bpo-40750.ZmO9Ev.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-26-17-43-58.bpo-40780.3Ckdgm.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-27-22-37-58.bpo-40792.WEDqqU.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-30-14-37-18.bpo-40824.XR3V5s.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-30-23-18-35.bpo-19468.S-TA7p.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-30-23-23-35.bpo-1635741.0D-laM.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-01-20-31-07.bpo-40826.XCI4M2.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-03-13-53-24.bpo-40854.O6vfQU.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-05-12-48-28.bpo-40870.9cd2sk.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-05-23-25-00.bpo-40883.M6sQ-Q.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-06-00-23-19.bpo-40880.fjdzSh.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-07-22-50-10.bpo-40903.7dWejS.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-08-01-08-57.bpo-40904.76qQzo.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-08-22-46-33.bpo-40889.vIBl-W.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-09-00-20-13.bpo-40890.LoRV-g.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-09-23-52-32.bpo-40847.4XAACw.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-10-11-27-15.bpo-40939.DO-wAI.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-11-16-06-49.bpo-40947.72cZcR.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-12-00-12-28.bpo-40950.tzMy7m.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-12-12-21-54.bpo-40957.Z8n6I6.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-12-22-56-17.bpo-1635741.mmlp3Q.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-15-01-20-44.bpo-40958.7O2Wh1.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-15-16-29-55.bpo-40985.IIN_xX.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-17-00-52-21.bpo-1635741.61iyYh.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-17-10-27-17.bpo-40636.MYaCIe.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-18-00-07-09.bpo-41006.H-wN-d.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-18-19-04-30.bpo-40077._yI-ax.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-20-16-59-02.bpo-40939.6810Ak.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-20-17-00-44.bpo-35975.UDHCHp.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-20-19-27-47.bpo-40939.jxJ4yn.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-20-22-46-18.bpo-41052.46MPeF.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-21-10-54-02.bpo-41061.AHf9MU.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-21-19-53-33.bpo-41056.IDu_EK.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-22-13-22-30.bpo-41076.eWYw2N.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-23-07-35-11.bpo-40521.dMNA6k.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-23-15-10-19.bpo-41084.pt3y7F.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-23-18-32-41.bpo-39960.Kez3fP.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-23-23-26-42.bpo-41094.zEIJse.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-20-17-31.bpo-41175.acJoXB.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-01-20-17-38.bpo-1635741.-AtPYu.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-03-23-10-02.bpo-1635741.F5coWe.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-06-13-35-17.bpo-41218.oKnSr2.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-06-18-36-33.bpo-41215.vFGFIz.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-06-20-43-19.bpo-1635741.LYhsni.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-07-16-10-52.bpo-1635741.zU-H_n.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-08-21-55-23.bpo-41252.nBWL-Y.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-08-22-03-54.bpo-41247.PndYIk.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-17-11-31-54.bpo-41323.ChbZHh.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-18-08-15-32.bpo-41295.pu8Ezo.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-18-18-01-10.bpo-41334.t5xMGp.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-19-15-40-52.bpo-41342.RRk_m_.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-20-17-01-17.bpo-38156.ptcdRy.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-27-01-50-06.bpo-41340.pZXfcF.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-07-28-22-43-27.bpo-41428.FM6xsI.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-02-15-53-12.bpo-41431.TblUBT.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-12-07-35-07.bpo-41525.d9q3XL.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-12-19-32-15.bpo-41531.WgPzjT.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-12-20-29-57.bpo-41533.4pcVAc.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-18-05.bpo-1635741.FC13e7.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-19-21.bpo-1653741.fubBkb.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-25-22-43-33.bpo-40077.vcxSUa.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-26-11-23-31.bpo-41631.3jZcd9.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-28-20-54-04.bpo-1635741.7ijlcI.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-30-20-38-33.bpo-41654.HtnhAM.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-31-11-37-59.bpo-41670.vmRJRx.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-31-14-53-17.bpo-41675.VSoqWU.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-06-02.bpo-1635741.5jZymK.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-08-07.bpo-1635741.X9CZgo.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-22-35.bpo-1635741.CnRME3.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-02-12-00-57.bpo-41690.Ny-Sfy.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-07-09-45-47.bpo-1635741.QuDIut.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-07-11-35-02.bpo-1635741.rvIexb.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-08-20-39-43.bpo-1635741.jiXmyT.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-08-21-58-47.bpo-1635741.vdjSLH.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-12-12-55-45.bpo-41756.1h0tbV.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-12-18-34-34.bpo-1635741.lh335O.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-15-23-29-49.bpo-41780.bOBUIH.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-24-12-15-45.bpo-39934.YVHTCF.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-26-14-43-30.bpo-1635741.aJS9B3.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-27-22-23-14.bpo-41870.2v6_v4.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-04-01-02-58.bpo-41922.kHGT8I.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-04-10-55-12.bpo-41909.BqHPcm.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2019-08-16-20-25-42.bpo-37703.Qm_l_H.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-03-07-03-53-39.bpo-39883.1tnb4-.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-05-09-12-10-31.bpo-40552._0uB73.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-07-21-15-23-30.bpo-40979.pLA8rO.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-07-25-14-20-00.bpo-41314.yrjko0.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-07-27-20-46-17.bpo-41045.GFF6Ul.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-08-12-18-35-40.bpo-40204.C8A_pe.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-08-25-15-11-23.bpo-41624.ddjJlN.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-09-08-16-57-09.bpo-41726.g0UXrn.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-09-10-07-48-02.bpo-37149.VD0rCv.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-09-12-17-37-13.bpo-35293._cOwPD.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-09-24-15-35-13.bpo-41774.5IqdGP.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-10-03-18-20-46.bpo-41428._ju1NE.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-05-24-06-19-43.bpo-40723.AJLd4U.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-05-29-18-21-58.bpo-39885.zB_-bN.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-06-27-17-02-00.bpo-41144.JoFGIX.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-06-29-14-51-15.bpo-41152.d6mV0C.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-07-07-18-44-30.bpo-37765.umc1o8.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-07-16-17-39-06.bpo-41300.wRixNb.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-07-24-17-49-58.bpo-41373.YQIPu_.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-08-09-13-42-55.bpo-41468.zkP0_Y.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-09-22-00-45-40.bpo-40181.hhQi3z.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-09-22-11-13-45.bpo-35764.VoNa8y.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-09-24-14-31-16.bpo-41775.sB8Vre.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-03-15-11-55-04.bpo-26680.eKAi85.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-03-15-11-56-48.bpo-26680.Udkhn4.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-06-07-22-04-01.bpo-28557.ViNJnK.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-06-12-23-30-41.bpo-33660.AdDn5Z.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-07-29-12-14-54.bpo-34226.BE7zbu.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-07-30-12-48-17.bpo-31844.0_GKsD.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-08-21-16-20-33.bpo-29620.xxx666.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-27-09-37-03.bpo-35078.kweA3R.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-03-01-01-56-23.bpo-33944.-82Pkt.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-03-17-19-01-53.bpo-36290.7VXo_K.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-05-31-23-54-28.bpo-12178.N6FLCZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-08-11-16-28-03.bpo-26543.X-TJZO.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-09-12-21-34-03.bpo-38144.8uQCdd.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-10-25-23-45-49.bpo-35714.fw3xb7.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-11-13-07-37-11.bpo-38731.9qmcSx.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-12-15-18-47-20.bpo-39040.tKa0Qs.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-02-23-15-09-47.bpo-39244.aBK5IM.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-02-24-10-58-34.bpo-39728.kOOaHn.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-03-11-07-44-06.bpo-31122.zIQ80l.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-04-03-16-13-59.bpo-40105.hfM2c0.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-04-18-14-16-02.bpo-40318.K2UdRx.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-04-20-22-08-36.bpo-23082.iX90Id.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-04-23-18-21-19.bpo-39385.MIAyS7.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-06-02-01-25.bpo-13097.Wh5xSK.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-07-22-00-12.bpo-39881.E1xsNv.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-13-16-28-33.bpo-40611.ZCk0_c.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-15-21-14-45.bpo-36543.Jt-eSX.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-17-02-03-09.bpo-32309.KM9psl.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-18-15-26-31.bpo-40671.NeZ9Cy.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-18-15-38-25.bpo-25920.PxrLY8.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-18-17-29-30.bpo-40626.NeZufF.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-18-22-41-02.bpo-40614.8j3kmq.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-20-12-53-20.bpo-9216.ps7Yf1.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-20-13-03-28.bpo-40695.lr4aIS.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-20-14-38-04.bpo-40698.zwl5Hc.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-22-12-45-58.bpo-40726.7oBdMw.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-23-00-22-11.bpo-40737.iph-CM.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-23-04-18-00.bpo-37129.YoYoYo.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-24-11-06-37.bpo-40756.7ZH83z.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-24-23-52-35.bpo-40759.DdZdaw.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-25-11-52-23.bpo-30064.6CICsH.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-25-22-18-38.bpo-30008.CKC3td.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-27-00-09-52.bpo-16995.4niOT7.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-27-17-00-18.bpo-40795.eZSnHA.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-27-18-04-52.bpo-40791.IzpNor.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-27-21-27-01.bpo-40767.L5MnVV.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-27-22-19-42.bpo-40792.87Yx01.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-28-16-51-00.bpo-38488.hFQNgA.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-28-17-32-29.bpo-40777.1kJU6N.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-30-08-10-23.bpo-40744.jKURVV.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-30-12-44-29.bpo-39384.Iqxy3q.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-30-14-19-47.bpo-26407.MjWLO1.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-30-18-48-58.bpo-40755.IyOe2J.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-31-15-52-18.bpo-40834.MO9_hb.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-31-23-32-36.bpo-17005.JlRUGB.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-01-02-16-29.bpo-39314.0T9hlA.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-02-02-16-02.bpo-39791.StCJlA.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-02-23-49-07.bpo-32604.ZN4V4l.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-04-16-25-15.bpo-40807.yYyLWx.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-05-19-29-10.bpo-39791._CcO3d.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-05-20-00-18.bpo-40876.zDhiZj.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-06-02-42-26.bpo-40884.n7fOwS.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-06-14-09-55.bpo-33689.EFUDH7.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-08-18-59-16.bpo-23427.ilg1Cz.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-11-11-07-10.bpo-40939.-D5Asl.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-12-10-44-15.bpo-40855.jSot83.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-12-11-55-30.bpo-40955.huixCg.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-13-12-04-50.bpo-40924.SM_luS.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-15-00-13-57.bpo-40967._dx3OO.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-15-12-22-53.bpo-40448.1dk8Bu.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-17-17-26-24.bpo-41002.NPBItE.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-17-23-49-45.bpo-35018.NP5_Qk.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-18-10-34-59.bpo-41025.elf_nz.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-20-00-19-30.bpo-41043.p-Pk-H.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-20-10-16-57.bpo-41048.hEXB-B.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-20-18-33-03.bpo-41056.gTH4Bq.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-20-18-35-43.bpo-41056.Garcle.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-20-18-37-29.bpo-41056.d9v_uL.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-20-21-03-55.bpo-41058.gztdZy.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-22-10-25-39.bpo-41068._bX2BW.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-22-20-08-40.bpo-31938.EVuko9.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-23-06-09-59.bpo-40521.HUfxP7.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-25-10-11-47.bpo-31082.HsgDkx.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-27-13-51-36.bpo-41138.bIpf7g.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-28-21-16-51.bpo-40874.YImvzA.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-30-20-50-51.bpo-41161.QTdJjz.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-01-17-33-50.bpo-41182.FPFI0N.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-02-11-53-45.bpo-41193.8-Tnql.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-02-15-03-04.bpo-41195.cEnpO3.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-03-13-15-08.bpo-41194.djrKjs.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-04-21-56-46.bpo-39168.DQWsXj.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-05-19-16-02.bpo-29727.Q6Z2rg.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-06-16-58-53.bpo-41207.Emw7Nk.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-07-21-56-26.bpo-41235.H2csMU.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-11-00-15-01.bpo-41273.SVrsJh.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-12-22-16-58.bpo-39017.x3Cg-9.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-13-15-06-35.bpo-41288.8mn5P-.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-18-18-07-40.bpo-41333.upkHIm.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-20-13-27-48.bpo-41344.iKipNd.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-20-19-13-17.bpo-41341.wqrj8C.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-21-16-20-55.bpo-35328.jXovHb.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-21-21-45-55.bpo-41364.5O-k7A.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-23-01-18-34.bpo-41317.O17Z6x.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-26-21-18-43.bpo-41384.MlzIgV.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-28-12-08-58.bpo-41316.bSCbK4.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-30-14-56-58.bpo-41440.rju34k.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-01-00-51-15.bpo-41421.dHKRVB.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-03-01-59-48.bpo-41425.KJo6zF.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-04-00-20-30.bpo-41467.Z8DgTL.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-07-06-06-29.bpo-41497.aBtsWz.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-07-15-18-16.bpo-41503.IYftcu.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-09-18-16-05.bpo-41513.e6K6EK.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-12-07-43-31.bpo-41528.bu83oD.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-12-13-25-16.bpo-41520.BEUWa4.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-13-08-07-25.bpo-40782.aGZqmB.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-15-15-21-40.bpo-37658.f9nivB.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-15-15-50-12.bpo-32751.85je5X.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-15-18-17-21.bpo-39994.dOgPOh.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-21-15-51-15.bpo-41609.JmiUKG.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-23-14-23-18.bpo-41513.DGqc_I.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-29-16-07-36.bpo-41662.Mn79zh.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-29-16-45-12.bpo-41638.iZfW5N.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-30-10-24-26.bpo-39010._mzXJW.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-30-21-38-57.bpo-41662.6e9iZn.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-03-01-35-32.bpo-41696.zkYGre.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-04-20-45-38.bpo-41720.PW9MzZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-06-20-27-10.bpo-41732.1SKv26.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-08-13-51-16.bpo-1635741.wkPeoT.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-08-13-55-34.bpo-1635741.56MLP-.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-11-12-38-55.bpo-39651.JMp9l2.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-12-16-18-42.bpo-32218.IpYkEe.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-14-19-27-46.bpo-41789.pI_uZQ.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-15-07-55-35.bpo-41792.qMpSlU.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-15-14-56-13.bpo-39587.69xzuh.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-15-22-43-30.bpo-41517.sLBH7g.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-19-12-22-08.bpo-41816.ynynXJ.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-19-23-14-54.bpo-41815.RNpuX3.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-20-15-14-05.bpo-41810.7l8lyV.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-22-00-23-30.bpo-41817.bnh-VG.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-22-13-51-14.bpo-41833.6HVDjT.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-22-14-55-34.bpo-40670.R5sm68.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-23-03-33-37.bpo-40564.iXQqMq.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-23-22-52-24.bpo-41842.lIuhC9.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-23-23-17-59.bpo-41840.QRFr4L.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-28-23-22-25.bpo-41773.oKkus0.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-30-23-49-42.bpo-41887.-ee2S-.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-01-10-50-12.bpo-41900.Cho7oh.rst delete mode 100644 Misc/NEWS.d/next/Security/2020-02-12-14-17-39.bpo-39603.Gt3RSg.rst delete mode 100644 Misc/NEWS.d/next/Security/2020-06-29-16-02-29.bpo-41004.ovF0KZ.rst delete mode 100644 Misc/NEWS.d/next/Security/2020-07-03-17-21-37.bpo-29778.cR_fGS.rst delete mode 100644 Misc/NEWS.d/next/Security/2020-07-03-20-41-29.bpo-41162.tb8pVj.rst delete mode 100644 Misc/NEWS.d/next/Security/2020-07-15-20-15-08.bpo-41304.vNEeYA.rst delete mode 100644 Misc/NEWS.d/next/Tests/2018-08-20-09-38-52.bpo-34401.eGxMPm.rst delete mode 100644 Misc/NEWS.d/next/Tests/2019-09-14-13-20-27.bpo-38169.hurq4B.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-04-09-15-40-03.bpo-31904.TJ4k3d.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-05-26-07-53-31.bpo-17258.X_IKTQ.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-06-09-18-48-18.bpo-40927.67ylLg.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-06-12-20-46-23.bpo-40964.OBzf2c.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-06-17-15-07-14.bpo-41003.tiH_Fy.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-06-17-17-27-07.bpo-41009.Rvn6OQ.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-06-17-18-00-21.bpo-38377.jfg4TH.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-06-22-00-21-12.bpo-41069.bLZkX-.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-06-23-12-02-45.bpo-41085.JZKsyz.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-08-07-17-28-49.bpo-41477.GrFexU.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-08-11-14-59-13.bpo-41521.w2UYK7.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-08-25-19-25-36.bpo-41602.Z64s0I.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-09-11-19-12-31.bpo-41731.Ivxh4U.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-10-05-09-37-43.bpo-41939.P4OlbA.rst delete mode 100644 Misc/NEWS.d/next/Windows/2019-07-11-06-11-09.bpo-37556.sygMUU.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-05-19-04-11-12.bpo-40677.qQbLW8.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-05-19-14-43-33.bpo-39631.Z5yXam.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-06-12-13-13-44.bpo-40164.SPrSn5.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-06-23-03-12-57.bpo-41039.0hgd0s.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-06-24-21-30-42.bpo-41074.gaQc3C.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-06-28-12-40-41.bpo-41142.jpZzzh.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-07-20-23-26-26.bpo-40741.C9sc_d.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-07-28-11-55-43.bpo-41412.ME20KB.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-07-28-12-39-32.bpo-40948.ISUFO6.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-08-06-16-59-10.bpo-41492.2FQ9cM.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-08-13-22-40-58.bpo-41526.-i2bwb.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-09-04-21-35-28.bpo-41627.sx2KN1.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-09-11-17-59-33.bpo-41744.e_ugDQ.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-06-07-20-10-56.bpo-40741.80A2BW.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-06-17-13-45-15.bpo-41005.zZegdV.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-06-19-14-19-08.bpo-40741.L7yTbm.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-06-25-06-09-00.bpo-39580.N_vJ9h.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-08-26-09-31-37.bpo-41557.mcQ75z.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 8578b6597f6023..c4468ad3f2223b 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 10 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 0 +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.10.0a0" +#define PY_VERSION "3.10.0a1" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 8aca5c0cb88e38..1fdb1ae859e3e0 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Mon Apr 27 22:35:16 2020 +# Autogenerated by Sphinx on Mon Oct 5 18:27:28 2020 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -99,27 +99,26 @@ 'assigned,\n' ' from left to right, to the corresponding targets.\n' '\n' - ' * If the target list contains one target prefixed with an\n' - ' asterisk, called a “starred” target: The object must be ' - 'an\n' - ' iterable with at least as many items as there are targets ' - 'in the\n' - ' target list, minus one. The first items of the iterable ' - 'are\n' - ' assigned, from left to right, to the targets before the ' + ' * If the target list contains one target prefixed with an ' + 'asterisk,\n' + ' called a “starred” target: The object must be an iterable ' + 'with at\n' + ' least as many items as there are targets in the target ' + 'list, minus\n' + ' one. The first items of the iterable are assigned, from ' + 'left to\n' + ' right, to the targets before the starred target. The ' + 'final items\n' + ' of the iterable are assigned to the targets after the ' 'starred\n' - ' target. The final items of the iterable are assigned to ' - 'the\n' - ' targets after the starred target. A list of the remaining ' - 'items\n' - ' in the iterable is then assigned to the starred target ' - '(the list\n' - ' can be empty).\n' + ' target. A list of the remaining items in the iterable is ' + 'then\n' + ' assigned to the starred target (the list can be empty).\n' '\n' ' * Else: The object must be an iterable with the same number ' - 'of\n' - ' items as there are targets in the target list, and the ' - 'items are\n' + 'of items\n' + ' as there are targets in the target list, and the items ' + 'are\n' ' assigned, from left to right, to the corresponding ' 'targets.\n' '\n' @@ -135,10 +134,10 @@ 'in the\n' ' current local namespace.\n' '\n' - ' * Otherwise: the name is bound to the object in the global\n' - ' namespace or the outer namespace determined by ' - '"nonlocal",\n' - ' respectively.\n' + ' * Otherwise: the name is bound to the object in the global ' + 'namespace\n' + ' or the outer namespace determined by "nonlocal", ' + 'respectively.\n' '\n' ' The name is rebound if it was already bound. This may cause ' 'the\n' @@ -225,26 +224,27 @@ 'called with\n' ' appropriate arguments.\n' '\n' - '* If the target is a slicing: The primary expression in the\n' - ' reference is evaluated. It should yield a mutable sequence ' - 'object\n' - ' (such as a list). The assigned object should be a sequence ' - 'object\n' - ' of the same type. Next, the lower and upper bound ' - 'expressions are\n' - ' evaluated, insofar they are present; defaults are zero and ' - 'the\n' - ' sequence’s length. The bounds should evaluate to integers. ' - 'If\n' - ' either bound is negative, the sequence’s length is added to ' - 'it. The\n' - ' resulting bounds are clipped to lie between zero and the ' + '* If the target is a slicing: The primary expression in the ' + 'reference\n' + ' is evaluated. It should yield a mutable sequence object ' + '(such as a\n' + ' list). The assigned object should be a sequence object of ' + 'the same\n' + ' type. Next, the lower and upper bound expressions are ' + 'evaluated,\n' + ' insofar they are present; defaults are zero and the ' 'sequence’s\n' - ' length, inclusive. Finally, the sequence object is asked to ' - 'replace\n' - ' the slice with the items of the assigned sequence. The ' - 'length of\n' - ' the slice may be different from the length of the assigned ' + ' length. The bounds should evaluate to integers. If either ' + 'bound is\n' + ' negative, the sequence’s length is added to it. The ' + 'resulting\n' + ' bounds are clipped to lie between zero and the sequence’s ' + 'length,\n' + ' inclusive. Finally, the sequence object is asked to replace ' + 'the\n' + ' slice with the items of the assigned sequence. The length ' + 'of the\n' + ' slice may be different from the length of the assigned ' 'sequence,\n' ' thus changing the length of the target sequence, if the ' 'target\n' @@ -544,13 +544,17 @@ '\n' '-[ Footnotes ]-\n' '\n' - '[1] The exception is propagated to the invocation stack unless\n' - ' there is a "finally" clause which happens to raise another\n' - ' exception. That new exception causes the old one to be lost.\n' + '[1] The exception is propagated to the invocation stack unless ' + 'there\n' + ' is a "finally" clause which happens to raise another ' + 'exception.\n' + ' That new exception causes the old one to be lost.\n' '\n' - '[2] A string literal appearing as the first statement in the\n' - ' function body is transformed into the function’s "__doc__"\n' - ' attribute and therefore the function’s *docstring*.\n' + '[2] A string literal appearing as the first statement in the ' + 'function\n' + ' body is transformed into the function’s "__doc__" attribute ' + 'and\n' + ' therefore the function’s *docstring*.\n' '\n' '[3] A string literal appearing as the first statement in the class\n' ' body is transformed into the namespace’s "__doc__" item and\n' @@ -688,11 +692,13 @@ 'needs, for\n' ' example, "object.__getattribute__(self, name)".\n' '\n' - ' Note: This method may still be bypassed when looking ' - 'up special\n' - ' methods as the result of implicit invocation via ' - 'language syntax\n' - ' or built-in functions. See Special method lookup.\n' + ' Note:\n' + '\n' + ' This method may still be bypassed when looking up ' + 'special methods\n' + ' as the result of implicit invocation via language ' + 'syntax or\n' + ' built-in functions. See Special method lookup.\n' '\n' 'object.__setattr__(self, name, value)\n' '\n' @@ -776,15 +782,16 @@ '\n' ' sys.modules[__name__].__class__ = VerboseModule\n' '\n' - 'Note: Defining module "__getattr__" and setting module ' - '"__class__"\n' - ' only affect lookups made using the attribute access ' - 'syntax –\n' - ' directly accessing the module globals (whether by code ' - 'within the\n' - ' module, or via a reference to the module’s globals ' - 'dictionary) is\n' - ' unaffected.\n' + 'Note:\n' + '\n' + ' Defining module "__getattr__" and setting module ' + '"__class__" only\n' + ' affect lookups made using the attribute access syntax ' + '– directly\n' + ' accessing the module globals (whether by code within ' + 'the module, or\n' + ' via a reference to the module’s globals dictionary) is ' + 'unaffected.\n' '\n' 'Changed in version 3.5: "__class__" module attribute is ' 'now writable.\n' @@ -867,12 +874,14 @@ 'created. The\n' ' descriptor has been assigned to *name*.\n' '\n' - ' Note: "__set_name__()" is only called implicitly as ' - 'part of the\n' - ' "type" constructor, so it will need to be called ' - 'explicitly with\n' - ' the appropriate parameters when a descriptor is ' - 'added to a class\n' + ' Note:\n' + '\n' + ' "__set_name__()" is only called implicitly as part ' + 'of the "type"\n' + ' constructor, so it will need to be called ' + 'explicitly with the\n' + ' appropriate parameters when a descriptor is added ' + 'to a class\n' ' after initial creation:\n' '\n' ' class A:\n' @@ -1033,10 +1042,9 @@ '--------------------------\n' '\n' '* When inheriting from a class without *__slots__*, the ' - '*__dict__*\n' - ' and *__weakref__* attribute of the instances will ' - 'always be\n' - ' accessible.\n' + '*__dict__* and\n' + ' *__weakref__* attribute of the instances will always ' + 'be accessible.\n' '\n' '* Without a *__dict__* variable, instances cannot be ' 'assigned new\n' @@ -1051,14 +1059,12 @@ ' declaration.\n' '\n' '* Without a *__weakref__* variable for each instance, ' - 'classes\n' - ' defining *__slots__* do not support weak references to ' - 'its\n' - ' instances. If weak reference support is needed, then ' - 'add\n' - ' "\'__weakref__\'" to the sequence of strings in the ' - '*__slots__*\n' - ' declaration.\n' + 'classes defining\n' + ' *__slots__* do not support weak references to its ' + 'instances. If weak\n' + ' reference support is needed, then add ' + '"\'__weakref__\'" to the\n' + ' sequence of strings in the *__slots__* declaration.\n' '\n' '* *__slots__* are implemented at the class level by ' 'creating\n' @@ -1071,24 +1077,23 @@ ' attribute would overwrite the descriptor assignment.\n' '\n' '* The action of a *__slots__* declaration is not limited ' - 'to the\n' - ' class where it is defined. *__slots__* declared in ' - 'parents are\n' - ' available in child classes. However, child subclasses ' - 'will get a\n' - ' *__dict__* and *__weakref__* unless they also define ' - '*__slots__*\n' - ' (which should only contain names of any *additional* ' - 'slots).\n' + 'to the class\n' + ' where it is defined. *__slots__* declared in parents ' + 'are available\n' + ' in child classes. However, child subclasses will get a ' + '*__dict__*\n' + ' and *__weakref__* unless they also define *__slots__* ' + '(which should\n' + ' only contain names of any *additional* slots).\n' '\n' '* If a class defines a slot also defined in a base ' - 'class, the\n' - ' instance variable defined by the base class slot is ' - 'inaccessible\n' - ' (except by retrieving its descriptor directly from the ' - 'base class).\n' - ' This renders the meaning of the program undefined. In ' - 'the future, a\n' + 'class, the instance\n' + ' variable defined by the base class slot is ' + 'inaccessible (except by\n' + ' retrieving its descriptor directly from the base ' + 'class). This\n' + ' renders the meaning of the program undefined. In the ' + 'future, a\n' ' check may be added to prevent this.\n' '\n' '* Nonempty *__slots__* does not work for classes derived ' @@ -1097,9 +1102,9 @@ '"bytes" and "tuple".\n' '\n' '* Any non-string iterable may be assigned to ' - '*__slots__*. Mappings\n' - ' may also be used; however, in the future, special ' - 'meaning may be\n' + '*__slots__*. Mappings may\n' + ' also be used; however, in the future, special meaning ' + 'may be\n' ' assigned to the values corresponding to each key.\n' '\n' '* *__class__* assignment works only if both classes have ' @@ -1115,9 +1120,9 @@ ' raise "TypeError".\n' '\n' '* If an iterator is used for *__slots__* then a ' - 'descriptor is\n' - ' created for each of the iterator’s values. However, ' - 'the *__slots__*\n' + 'descriptor is created\n' + ' for each of the iterator’s values. However, the ' + '*__slots__*\n' ' attribute will be an empty iterator.\n', 'attribute-references': 'Attribute references\n' '********************\n' @@ -1882,10 +1887,10 @@ ' != x" is true. This behavior is compliant with IEEE 754.\n' '\n' '* "None" and "NotImplemented" are singletons. **PEP 8** ' - 'advises\n' - ' that comparisons for singletons should always be done with ' - '"is" or\n' - ' "is not", never the equality operators.\n' + 'advises that\n' + ' comparisons for singletons should always be done with "is" ' + 'or "is\n' + ' not", never the equality operators.\n' '\n' '* Binary sequences (instances of "bytes" or "bytearray") can ' 'be\n' @@ -1901,15 +1906,15 @@ '\n' ' Strings and binary sequences cannot be directly compared.\n' '\n' - '* Sequences (instances of "tuple", "list", or "range") can ' - 'be\n' - ' compared only within each of their types, with the ' - 'restriction that\n' - ' ranges do not support order comparison. Equality ' - 'comparison across\n' - ' these types results in inequality, and ordering comparison ' - 'across\n' - ' these types raises "TypeError".\n' + '* Sequences (instances of "tuple", "list", or "range") can be ' + 'compared\n' + ' only within each of their types, with the restriction that ' + 'ranges do\n' + ' not support order comparison. Equality comparison across ' + 'these\n' + ' types results in inequality, and ordering comparison across ' + 'these\n' + ' types raises "TypeError".\n' '\n' ' Sequences compare lexicographically using comparison of\n' ' corresponding elements. The built-in containers typically ' @@ -1933,8 +1938,8 @@ ' false because the type is not the same).\n' '\n' ' * Collections that support order comparison are ordered the ' - 'same\n' - ' as their first unequal elements (for example, "[1,2,x] <= ' + 'same as\n' + ' their first unequal elements (for example, "[1,2,x] <= ' '[1,2,y]"\n' ' has the same value as "x <= y"). If a corresponding ' 'element does\n' @@ -1952,8 +1957,8 @@ '"TypeError".\n' '\n' '* Sets (instances of "set" or "frozenset") can be compared ' - 'within\n' - ' and across their types.\n' + 'within and\n' + ' across their types.\n' '\n' ' They define order comparison operators to mean subset and ' 'superset\n' @@ -1972,8 +1977,8 @@ ' Comparison of sets enforces reflexivity of its elements.\n' '\n' '* Most other built-in types have no comparison methods ' - 'implemented,\n' - ' so they inherit the default comparison behavior.\n' + 'implemented, so\n' + ' they inherit the default comparison behavior.\n' '\n' 'User-defined classes that customize their comparison behavior ' 'should\n' @@ -2022,10 +2027,10 @@ ' "total_ordering()" decorator.\n' '\n' '* The "hash()" result should be consistent with equality. ' - 'Objects\n' - ' that are equal should either have the same hash value, or ' - 'be marked\n' - ' as unhashable.\n' + 'Objects that\n' + ' are equal should either have the same hash value, or be ' + 'marked as\n' + ' unhashable.\n' '\n' 'Python does not enforce these consistency rules. In fact, ' 'the\n' @@ -2299,10 +2304,11 @@ ':= a to b do"; e.g., "list(range(3))" returns the list "[0, 1, ' '2]".\n' '\n' - 'Note: There is a subtlety when the sequence is being modified by ' - 'the\n' - ' loop (this can only occur for mutable sequences, e.g. lists). ' - 'An\n' + 'Note:\n' + '\n' + ' There is a subtlety when the sequence is being modified by the ' + 'loop\n' + ' (this can only occur for mutable sequences, e.g. lists). An\n' ' internal counter is used to keep track of which item is used ' 'next,\n' ' and this is incremented on each iteration. When this counter ' @@ -2525,8 +2531,8 @@ 'follows:\n' '\n' '1. The context expression (the expression given in the ' - '"with_item")\n' - ' is evaluated to obtain a context manager.\n' + '"with_item") is\n' + ' evaluated to obtain a context manager.\n' '\n' '2. The context manager’s "__enter__()" is loaded for later use.\n' '\n' @@ -2534,13 +2540,15 @@ '\n' '4. The context manager’s "__enter__()" method is invoked.\n' '\n' - '5. If a target was included in the "with" statement, the return\n' - ' value from "__enter__()" is assigned to it.\n' + '5. If a target was included in the "with" statement, the return ' + 'value\n' + ' from "__enter__()" is assigned to it.\n' + '\n' + ' Note:\n' '\n' - ' Note: The "with" statement guarantees that if the ' - '"__enter__()"\n' - ' method returns without an error, then "__exit__()" will ' - 'always be\n' + ' The "with" statement guarantees that if the "__enter__()" ' + 'method\n' + ' returns without an error, then "__exit__()" will always be\n' ' called. Thus, if an error occurs during the assignment to ' 'the\n' ' target list, it will be treated the same as an error ' @@ -2710,17 +2718,17 @@ '“pre-\n' 'computed” value is used for each call. This is especially ' 'important\n' - 'to understand when a default parameter is a mutable object, such ' - 'as a\n' - 'list or a dictionary: if the function modifies the object (e.g. ' - 'by\n' - 'appending an item to a list), the default value is in effect ' - 'modified.\n' - 'This is generally not what was intended. A way around this is ' - 'to use\n' - '"None" as the default, and explicitly test for it in the body of ' - 'the\n' - 'function, e.g.:\n' + 'to understand when a default parameter value is a mutable ' + 'object, such\n' + 'as a list or a dictionary: if the function modifies the object ' + '(e.g.\n' + 'by appending an item to a list), the default parameter value is ' + 'in\n' + 'effect modified. This is generally not what was intended. A ' + 'way\n' + 'around this is to use "None" as the default, and explicitly test ' + 'for\n' + 'it in the body of the function, e.g.:\n' '\n' ' def whats_on_the_telly(penguin=None):\n' ' if penguin is None:\n' @@ -3054,14 +3062,17 @@ '\n' '-[ Footnotes ]-\n' '\n' - '[1] The exception is propagated to the invocation stack unless\n' - ' there is a "finally" clause which happens to raise another\n' - ' exception. That new exception causes the old one to be ' - 'lost.\n' + '[1] The exception is propagated to the invocation stack unless ' + 'there\n' + ' is a "finally" clause which happens to raise another ' + 'exception.\n' + ' That new exception causes the old one to be lost.\n' '\n' - '[2] A string literal appearing as the first statement in the\n' - ' function body is transformed into the function’s "__doc__"\n' - ' attribute and therefore the function’s *docstring*.\n' + '[2] A string literal appearing as the first statement in the ' + 'function\n' + ' body is transformed into the function’s "__doc__" attribute ' + 'and\n' + ' therefore the function’s *docstring*.\n' '\n' '[3] A string literal appearing as the first statement in the ' 'class\n' @@ -3160,8 +3171,8 @@ ' complex;\n' '\n' '* otherwise, if either argument is a floating point number, ' - 'the\n' - ' other is converted to floating point;\n' + 'the other\n' + ' is converted to floating point;\n' '\n' '* otherwise, both must be integers and no conversion is ' 'necessary.\n' @@ -3271,7 +3282,9 @@ 'for\n' ' objects that still exist when the interpreter exits.\n' '\n' - ' Note: "del x" doesn’t directly call "x.__del__()" — the ' + ' Note:\n' + '\n' + ' "del x" doesn’t directly call "x.__del__()" — the ' 'former\n' ' decrements the reference count for "x" by one, and the ' 'latter is\n' @@ -3295,13 +3308,15 @@ '\n' ' See also: Documentation for the "gc" module.\n' '\n' - ' Warning: Due to the precarious circumstances under ' - 'which\n' - ' "__del__()" methods are invoked, exceptions that occur ' - 'during\n' - ' their execution are ignored, and a warning is printed ' - 'to\n' - ' "sys.stderr" instead. In particular:\n' + ' Warning:\n' + '\n' + ' Due to the precarious circumstances under which ' + '"__del__()"\n' + ' methods are invoked, exceptions that occur during ' + 'their execution\n' + ' are ignored, and a warning is printed to "sys.stderr" ' + 'instead.\n' + ' In particular:\n' '\n' ' * "__del__()" can be invoked when arbitrary code is ' 'being\n' @@ -3314,22 +3329,20 @@ ' that gets interrupted to execute "__del__()".\n' '\n' ' * "__del__()" can be executed during interpreter ' - 'shutdown. As\n' - ' a consequence, the global variables it needs to ' - 'access\n' - ' (including other modules) may already have been ' - 'deleted or set\n' - ' to "None". Python guarantees that globals whose name ' - 'begins\n' - ' with a single underscore are deleted from their ' - 'module before\n' - ' other globals are deleted; if no other references to ' - 'such\n' - ' globals exist, this may help in assuring that ' - 'imported modules\n' - ' are still available at the time when the "__del__()" ' - 'method is\n' - ' called.\n' + 'shutdown. As a\n' + ' consequence, the global variables it needs to access ' + '(including\n' + ' other modules) may already have been deleted or set ' + 'to "None".\n' + ' Python guarantees that globals whose name begins ' + 'with a single\n' + ' underscore are deleted from their module before ' + 'other globals\n' + ' are deleted; if no other references to such globals ' + 'exist, this\n' + ' may help in assuring that imported modules are still ' + 'available\n' + ' at the time when the "__del__()" method is called.\n' '\n' 'object.__repr__(self)\n' '\n' @@ -3505,19 +3518,21 @@ ' def __hash__(self):\n' ' return hash((self.name, self.nick, self.color))\n' '\n' - ' Note: "hash()" truncates the value returned from an ' - 'object’s\n' - ' custom "__hash__()" method to the size of a ' - '"Py_ssize_t". This\n' - ' is typically 8 bytes on 64-bit builds and 4 bytes on ' - '32-bit\n' - ' builds. If an object’s "__hash__()" must ' - 'interoperate on builds\n' - ' of different bit sizes, be sure to check the width on ' - 'all\n' - ' supported builds. An easy way to do this is with ' - '"python -c\n' - ' "import sys; print(sys.hash_info.width)"".\n' + ' Note:\n' + '\n' + ' "hash()" truncates the value returned from an object’s ' + 'custom\n' + ' "__hash__()" method to the size of a "Py_ssize_t". ' + 'This is\n' + ' typically 8 bytes on 64-bit builds and 4 bytes on ' + '32-bit builds.\n' + ' If an object’s "__hash__()" must interoperate on ' + 'builds of\n' + ' different bit sizes, be sure to check the width on all ' + 'supported\n' + ' builds. An easy way to do this is with "python -c ' + '"import sys;\n' + ' print(sys.hash_info.width)"".\n' '\n' ' If a class does not define an "__eq__()" method it ' 'should not\n' @@ -3575,22 +3590,24 @@ ' hashable by an "isinstance(obj, ' 'collections.abc.Hashable)" call.\n' '\n' - ' Note: By default, the "__hash__()" values of str and ' - 'bytes\n' - ' objects are “salted” with an unpredictable random ' - 'value.\n' - ' Although they remain constant within an individual ' - 'Python\n' - ' process, they are not predictable between repeated ' - 'invocations of\n' - ' Python.This is intended to provide protection against ' - 'a denial-\n' - ' of-service caused by carefully-chosen inputs that ' - 'exploit the\n' - ' worst case performance of a dict insertion, O(n^2) ' - 'complexity.\n' - ' See ' - 'http://www.ocert.org/advisories/ocert-2011-003.html for\n' + ' Note:\n' + '\n' + ' By default, the "__hash__()" values of str and bytes ' + 'objects are\n' + ' “salted” with an unpredictable random value. Although ' + 'they\n' + ' remain constant within an individual Python process, ' + 'they are not\n' + ' predictable between repeated invocations of ' + 'Python.This is\n' + ' intended to provide protection against a ' + 'denial-of-service caused\n' + ' by carefully-chosen inputs that exploit the worst ' + 'case\n' + ' performance of a dict insertion, O(n^2) complexity. ' + 'See\n' + ' http://www.ocert.org/advisories/ocert-2011-003.html ' + 'for\n' ' details.Changing hash values affects the iteration ' 'order of sets.\n' ' Python has never made guarantees about this ordering ' @@ -4170,9 +4187,11 @@ 'its\n' ' value.\n' '\n' - ' Note: "print()" can also be used, but is not a debugger ' - 'command —\n' - ' this executes the Python "print()" function.\n' + ' Note:\n' + '\n' + ' "print()" can also be used, but is not a debugger command — ' + 'this\n' + ' executes the Python "print()" function.\n' '\n' 'pp expression\n' '\n' @@ -4298,13 +4317,14 @@ ' the current environment).\n' '\n' 'retval\n' - 'Print the return value for the last return of a function.\n' + '\n' + ' Print the return value for the last return of a function.\n' '\n' '-[ Footnotes ]-\n' '\n' '[1] Whether a frame is considered to originate in a certain ' - 'module\n' - ' is determined by the "__name__" in the frame globals.\n', + 'module is\n' + ' determined by the "__name__" in the frame globals.\n', 'del': 'The "del" statement\n' '*******************\n' '\n' @@ -4484,13 +4504,15 @@ 'about the\n' 'exceptional condition.\n' '\n' - 'Note: Exception messages are not part of the Python API. ' - 'Their\n' - ' contents may change from one version of Python to the next ' - 'without\n' - ' warning and should not be relied on by code which will run ' - 'under\n' - ' multiple versions of the interpreter.\n' + 'Note:\n' + '\n' + ' Exception messages are not part of the Python API. Their ' + 'contents\n' + ' may change from one version of Python to the next without ' + 'warning\n' + ' and should not be relied on by code which will run under ' + 'multiple\n' + ' versions of the interpreter.\n' '\n' 'See also the description of the "try" statement in section The ' 'try\n' @@ -4500,10 +4522,9 @@ '-[ Footnotes ]-\n' '\n' '[1] This limitation occurs because the code that is executed ' - 'by\n' - ' these operations is not available at the time the module ' - 'is\n' - ' compiled.\n', + 'by these\n' + ' operations is not available at the time the module is ' + 'compiled.\n', 'execmodel': 'Execution model\n' '***************\n' '\n' @@ -4809,13 +4830,15 @@ 'about the\n' 'exceptional condition.\n' '\n' - 'Note: Exception messages are not part of the Python API. ' - 'Their\n' - ' contents may change from one version of Python to the next ' - 'without\n' - ' warning and should not be relied on by code which will run ' - 'under\n' - ' multiple versions of the interpreter.\n' + 'Note:\n' + '\n' + ' Exception messages are not part of the Python API. Their ' + 'contents\n' + ' may change from one version of Python to the next without ' + 'warning\n' + ' and should not be relied on by code which will run under ' + 'multiple\n' + ' versions of the interpreter.\n' '\n' 'See also the description of the "try" statement in section The ' 'try\n' @@ -4824,11 +4847,10 @@ '\n' '-[ Footnotes ]-\n' '\n' - '[1] This limitation occurs because the code that is executed ' - 'by\n' - ' these operations is not available at the time the module ' - 'is\n' - ' compiled.\n', + '[1] This limitation occurs because the code that is executed by ' + 'these\n' + ' operations is not available at the time the module is ' + 'compiled.\n', 'exprlists': 'Expression lists\n' '****************\n' '\n' @@ -4947,8 +4969,11 @@ 'i\n' ':= a to b do"; e.g., "list(range(3))" returns the list "[0, 1, 2]".\n' '\n' - 'Note: There is a subtlety when the sequence is being modified by the\n' - ' loop (this can only occur for mutable sequences, e.g. lists). An\n' + 'Note:\n' + '\n' + ' There is a subtlety when the sequence is being modified by the ' + 'loop\n' + ' (this can only occur for mutable sequences, e.g. lists). An\n' ' internal counter is used to keep track of which item is used next,\n' ' and this is incremented on each iteration. When this counter has\n' ' reached the length of the sequence the loop terminates. This ' @@ -5786,17 +5811,17 @@ '“pre-\n' 'computed” value is used for each call. This is especially ' 'important\n' - 'to understand when a default parameter is a mutable object, such ' - 'as a\n' - 'list or a dictionary: if the function modifies the object (e.g. ' - 'by\n' - 'appending an item to a list), the default value is in effect ' - 'modified.\n' - 'This is generally not what was intended. A way around this is ' - 'to use\n' - '"None" as the default, and explicitly test for it in the body of ' - 'the\n' - 'function, e.g.:\n' + 'to understand when a default parameter value is a mutable ' + 'object, such\n' + 'as a list or a dictionary: if the function modifies the object ' + '(e.g.\n' + 'by appending an item to a list), the default parameter value is ' + 'in\n' + 'effect modified. This is generally not what was intended. A ' + 'way\n' + 'around this is to use "None" as the default, and explicitly test ' + 'for\n' + 'it in the body of the function, e.g.:\n' '\n' ' def whats_on_the_telly(penguin=None):\n' ' if penguin is None:\n' @@ -5956,7 +5981,9 @@ 'defined.\n' ' See section The import statement.\n' '\n' - ' Note: The name "_" is often used in conjunction with\n' + ' Note:\n' + '\n' + ' The name "_" is often used in conjunction with\n' ' internationalization; refer to the documentation for the\n' ' "gettext" module for more information on this ' 'convention.\n' @@ -6060,8 +6087,8 @@ '\n' 'A non-normative HTML file listing all valid identifier ' 'characters for\n' - 'Unicode 4.1 can be found at https://www.dcl.hpi.uni-\n' - 'potsdam.de/home/loewis/table-3131.html.\n' + 'Unicode 4.1 can be found at\n' + 'https://www.unicode.org/Public/13.0.0/ucd/DerivedCoreProperties.txt\n' '\n' '\n' 'Keywords\n' @@ -6102,7 +6129,9 @@ 'defined.\n' ' See section The import statement.\n' '\n' - ' Note: The name "_" is often used in conjunction with\n' + ' Note:\n' + '\n' + ' The name "_" is often used in conjunction with\n' ' internationalization; refer to the documentation for ' 'the\n' ' "gettext" module for more information on this ' @@ -6187,8 +6216,9 @@ '\n' '1. find a module, loading and initializing it if necessary\n' '\n' - '2. define a name or names in the local namespace for the scope\n' - ' where the "import" statement occurs.\n' + '2. define a name or names in the local namespace for the scope ' + 'where\n' + ' the "import" statement occurs.\n' '\n' 'When the statement contains multiple clauses (separated by commas) ' 'the\n' @@ -6214,8 +6244,9 @@ 'made\n' 'available in the local namespace in one of three ways:\n' '\n' - '* If the module name is followed by "as", then the name following\n' - ' "as" is bound directly to the imported module.\n' + '* If the module name is followed by "as", then the name following ' + '"as"\n' + ' is bound directly to the imported module.\n' '\n' '* If no other name is specified, and the module being imported is ' 'a\n' @@ -6893,15 +6924,18 @@ '"__rpow__()" (the\n' ' coercion rules would become too complicated).\n' '\n' - ' Note: If the right operand’s type is a subclass of the ' - 'left\n' - ' operand’s type and that subclass provides the ' - 'reflected method\n' - ' for the operation, this method will be called before ' - 'the left\n' - ' operand’s non-reflected method. This behavior allows ' - 'subclasses\n' - ' to override their ancestors’ operations.\n' + ' Note:\n' + '\n' + ' If the right operand’s type is a subclass of the left ' + 'operand’s\n' + ' type and that subclass provides a different ' + 'implementation of the\n' + ' reflected method for the operation, this method will ' + 'be called\n' + ' before the left operand’s non-reflected method. This ' + 'behavior\n' + ' allows subclasses to override their ancestors’ ' + 'operations.\n' '\n' 'object.__iadd__(self, other)\n' 'object.__isub__(self, other)\n' @@ -7221,8 +7255,8 @@ '-[ Footnotes ]-\n' '\n' '[1] While "abs(x%y) < abs(y)" is true mathematically, ' - 'for floats\n' - ' it may not be true numerically due to roundoff. For ' + 'for floats it\n' + ' may not be true numerically due to roundoff. For ' 'example, and\n' ' assuming a platform on which a Python float is an ' 'IEEE 754 double-\n' @@ -7287,22 +7321,22 @@ '"unicodedata.normalize()".\n' '\n' '[4] Due to automatic garbage-collection, free lists, and ' - 'the\n' - ' dynamic nature of descriptors, you may notice ' - 'seemingly unusual\n' - ' behaviour in certain uses of the "is" operator, like ' - 'those\n' - ' involving comparisons between instance methods, or ' - 'constants.\n' - ' Check their documentation for more info.\n' + 'the dynamic\n' + ' nature of descriptors, you may notice seemingly ' + 'unusual behaviour\n' + ' in certain uses of the "is" operator, like those ' + 'involving\n' + ' comparisons between instance methods, or constants. ' + 'Check their\n' + ' documentation for more info.\n' '\n' '[5] The "%" operator is also used for string formatting; ' 'the same\n' ' precedence applies.\n' '\n' '[6] The power operator "**" binds less tightly than an ' - 'arithmetic\n' - ' or bitwise unary operator on its right, that is, ' + 'arithmetic or\n' + ' bitwise unary operator on its right, that is, ' '"2**-1" is "0.5".\n', 'pass': 'The "pass" statement\n' '********************\n' @@ -7592,9 +7626,11 @@ '\n' ' New in version 3.4.\n' '\n' - 'Note: Slicing is done exclusively with the following three ' - 'methods.\n' - ' A call like\n' + 'Note:\n' + '\n' + ' Slicing is done exclusively with the following three ' + 'methods. A\n' + ' call like\n' '\n' ' a[1:2] = b\n' '\n' @@ -7625,7 +7661,9 @@ 'the\n' ' container), "KeyError" should be raised.\n' '\n' - ' Note: "for" loops expect that an "IndexError" will be ' + ' Note:\n' + '\n' + ' "for" loops expect that an "IndexError" will be ' 'raised for\n' ' illegal indexes to allow proper detection of the end ' 'of the\n' @@ -7861,26 +7899,26 @@ '-[ Footnotes ]-\n' '\n' '[1] Additional information on these special methods may be ' - 'found\n' - ' in the Python Reference Manual (Basic customization).\n' + 'found in\n' + ' the Python Reference Manual (Basic customization).\n' '\n' '[2] As a consequence, the list "[1, 2]" is considered equal ' - 'to\n' - ' "[1.0, 2.0]", and similarly for tuples.\n' + 'to "[1.0,\n' + ' 2.0]", and similarly for tuples.\n' '\n' '[3] They must have since the parser can’t tell the type of ' 'the\n' ' operands.\n' '\n' '[4] Cased characters are those with general category ' - 'property\n' - ' being one of “Lu” (Letter, uppercase), “Ll” (Letter, ' - 'lowercase),\n' - ' or “Lt” (Letter, titlecase).\n' - '\n' - '[5] To format only a tuple you should therefore provide a\n' - ' singleton tuple whose only element is the tuple to be ' - 'formatted.\n', + 'property being\n' + ' one of “Lu” (Letter, uppercase), “Ll” (Letter, ' + 'lowercase), or “Lt”\n' + ' (Letter, titlecase).\n' + '\n' + '[5] To format only a tuple you should therefore provide a ' + 'singleton\n' + ' tuple whose only element is the tuple to be formatted.\n', 'specialnames': 'Special method names\n' '********************\n' '\n' @@ -8025,7 +8063,9 @@ 'for\n' ' objects that still exist when the interpreter exits.\n' '\n' - ' Note: "del x" doesn’t directly call "x.__del__()" — the ' + ' Note:\n' + '\n' + ' "del x" doesn’t directly call "x.__del__()" — the ' 'former\n' ' decrements the reference count for "x" by one, and the ' 'latter is\n' @@ -8049,12 +8089,15 @@ '\n' ' See also: Documentation for the "gc" module.\n' '\n' - ' Warning: Due to the precarious circumstances under which\n' - ' "__del__()" methods are invoked, exceptions that occur ' - 'during\n' - ' their execution are ignored, and a warning is printed ' - 'to\n' - ' "sys.stderr" instead. In particular:\n' + ' Warning:\n' + '\n' + ' Due to the precarious circumstances under which ' + '"__del__()"\n' + ' methods are invoked, exceptions that occur during their ' + 'execution\n' + ' are ignored, and a warning is printed to "sys.stderr" ' + 'instead.\n' + ' In particular:\n' '\n' ' * "__del__()" can be invoked when arbitrary code is ' 'being\n' @@ -8067,22 +8110,20 @@ ' that gets interrupted to execute "__del__()".\n' '\n' ' * "__del__()" can be executed during interpreter ' - 'shutdown. As\n' - ' a consequence, the global variables it needs to ' - 'access\n' - ' (including other modules) may already have been ' - 'deleted or set\n' - ' to "None". Python guarantees that globals whose name ' - 'begins\n' - ' with a single underscore are deleted from their ' - 'module before\n' - ' other globals are deleted; if no other references to ' - 'such\n' - ' globals exist, this may help in assuring that ' - 'imported modules\n' - ' are still available at the time when the "__del__()" ' - 'method is\n' - ' called.\n' + 'shutdown. As a\n' + ' consequence, the global variables it needs to access ' + '(including\n' + ' other modules) may already have been deleted or set ' + 'to "None".\n' + ' Python guarantees that globals whose name begins with ' + 'a single\n' + ' underscore are deleted from their module before other ' + 'globals\n' + ' are deleted; if no other references to such globals ' + 'exist, this\n' + ' may help in assuring that imported modules are still ' + 'available\n' + ' at the time when the "__del__()" method is called.\n' '\n' 'object.__repr__(self)\n' '\n' @@ -8258,19 +8299,21 @@ ' def __hash__(self):\n' ' return hash((self.name, self.nick, self.color))\n' '\n' - ' Note: "hash()" truncates the value returned from an ' - 'object’s\n' - ' custom "__hash__()" method to the size of a ' - '"Py_ssize_t". This\n' - ' is typically 8 bytes on 64-bit builds and 4 bytes on ' - '32-bit\n' - ' builds. If an object’s "__hash__()" must interoperate ' - 'on builds\n' - ' of different bit sizes, be sure to check the width on ' - 'all\n' - ' supported builds. An easy way to do this is with ' - '"python -c\n' - ' "import sys; print(sys.hash_info.width)"".\n' + ' Note:\n' + '\n' + ' "hash()" truncates the value returned from an object’s ' + 'custom\n' + ' "__hash__()" method to the size of a "Py_ssize_t". ' + 'This is\n' + ' typically 8 bytes on 64-bit builds and 4 bytes on ' + '32-bit builds.\n' + ' If an object’s "__hash__()" must interoperate on ' + 'builds of\n' + ' different bit sizes, be sure to check the width on all ' + 'supported\n' + ' builds. An easy way to do this is with "python -c ' + '"import sys;\n' + ' print(sys.hash_info.width)"".\n' '\n' ' If a class does not define an "__eq__()" method it should ' 'not\n' @@ -8326,21 +8369,22 @@ ' hashable by an "isinstance(obj, ' 'collections.abc.Hashable)" call.\n' '\n' - ' Note: By default, the "__hash__()" values of str and ' - 'bytes\n' - ' objects are “salted” with an unpredictable random ' - 'value.\n' - ' Although they remain constant within an individual ' - 'Python\n' - ' process, they are not predictable between repeated ' - 'invocations of\n' - ' Python.This is intended to provide protection against a ' - 'denial-\n' - ' of-service caused by carefully-chosen inputs that ' - 'exploit the\n' - ' worst case performance of a dict insertion, O(n^2) ' - 'complexity.\n' - ' See http://www.ocert.org/advisories/ocert-2011-003.html ' + ' Note:\n' + '\n' + ' By default, the "__hash__()" values of str and bytes ' + 'objects are\n' + ' “salted” with an unpredictable random value. Although ' + 'they\n' + ' remain constant within an individual Python process, ' + 'they are not\n' + ' predictable between repeated invocations of Python.This ' + 'is\n' + ' intended to provide protection against a ' + 'denial-of-service caused\n' + ' by carefully-chosen inputs that exploit the worst case\n' + ' performance of a dict insertion, O(n^2) complexity. ' + 'See\n' + ' http://www.ocert.org/advisories/ocert-2011-003.html ' 'for\n' ' details.Changing hash values affects the iteration ' 'order of sets.\n' @@ -8429,11 +8473,13 @@ 'needs, for\n' ' example, "object.__getattribute__(self, name)".\n' '\n' - ' Note: This method may still be bypassed when looking up ' - 'special\n' - ' methods as the result of implicit invocation via ' - 'language syntax\n' - ' or built-in functions. See Special method lookup.\n' + ' Note:\n' + '\n' + ' This method may still be bypassed when looking up ' + 'special methods\n' + ' as the result of implicit invocation via language ' + 'syntax or\n' + ' built-in functions. See Special method lookup.\n' '\n' 'object.__setattr__(self, name, value)\n' '\n' @@ -8517,15 +8563,16 @@ '\n' ' sys.modules[__name__].__class__ = VerboseModule\n' '\n' - 'Note: Defining module "__getattr__" and setting module ' - '"__class__"\n' - ' only affect lookups made using the attribute access syntax ' - '–\n' - ' directly accessing the module globals (whether by code ' - 'within the\n' - ' module, or via a reference to the module’s globals ' - 'dictionary) is\n' - ' unaffected.\n' + 'Note:\n' + '\n' + ' Defining module "__getattr__" and setting module ' + '"__class__" only\n' + ' affect lookups made using the attribute access syntax – ' + 'directly\n' + ' accessing the module globals (whether by code within the ' + 'module, or\n' + ' via a reference to the module’s globals dictionary) is ' + 'unaffected.\n' '\n' 'Changed in version 3.5: "__class__" module attribute is now ' 'writable.\n' @@ -8608,12 +8655,14 @@ 'The\n' ' descriptor has been assigned to *name*.\n' '\n' - ' Note: "__set_name__()" is only called implicitly as part ' - 'of the\n' - ' "type" constructor, so it will need to be called ' - 'explicitly with\n' - ' the appropriate parameters when a descriptor is added ' - 'to a class\n' + ' Note:\n' + '\n' + ' "__set_name__()" is only called implicitly as part of ' + 'the "type"\n' + ' constructor, so it will need to be called explicitly ' + 'with the\n' + ' appropriate parameters when a descriptor is added to a ' + 'class\n' ' after initial creation:\n' '\n' ' class A:\n' @@ -8772,10 +8821,9 @@ '~~~~~~~~~~~~~~~~~~~~~~~~~~\n' '\n' '* When inheriting from a class without *__slots__*, the ' - '*__dict__*\n' - ' and *__weakref__* attribute of the instances will always ' - 'be\n' - ' accessible.\n' + '*__dict__* and\n' + ' *__weakref__* attribute of the instances will always be ' + 'accessible.\n' '\n' '* Without a *__dict__* variable, instances cannot be ' 'assigned new\n' @@ -8789,13 +8837,12 @@ ' declaration.\n' '\n' '* Without a *__weakref__* variable for each instance, ' - 'classes\n' - ' defining *__slots__* do not support weak references to ' - 'its\n' - ' instances. If weak reference support is needed, then add\n' - ' "\'__weakref__\'" to the sequence of strings in the ' - '*__slots__*\n' - ' declaration.\n' + 'classes defining\n' + ' *__slots__* do not support weak references to its ' + 'instances. If weak\n' + ' reference support is needed, then add "\'__weakref__\'" to ' + 'the\n' + ' sequence of strings in the *__slots__* declaration.\n' '\n' '* *__slots__* are implemented at the class level by ' 'creating\n' @@ -8808,23 +8855,22 @@ ' attribute would overwrite the descriptor assignment.\n' '\n' '* The action of a *__slots__* declaration is not limited to ' - 'the\n' - ' class where it is defined. *__slots__* declared in ' - 'parents are\n' - ' available in child classes. However, child subclasses will ' - 'get a\n' - ' *__dict__* and *__weakref__* unless they also define ' - '*__slots__*\n' - ' (which should only contain names of any *additional* ' - 'slots).\n' + 'the class\n' + ' where it is defined. *__slots__* declared in parents are ' + 'available\n' + ' in child classes. However, child subclasses will get a ' + '*__dict__*\n' + ' and *__weakref__* unless they also define *__slots__* ' + '(which should\n' + ' only contain names of any *additional* slots).\n' '\n' '* If a class defines a slot also defined in a base class, ' - 'the\n' - ' instance variable defined by the base class slot is ' - 'inaccessible\n' - ' (except by retrieving its descriptor directly from the ' - 'base class).\n' - ' This renders the meaning of the program undefined. In the ' + 'the instance\n' + ' variable defined by the base class slot is inaccessible ' + '(except by\n' + ' retrieving its descriptor directly from the base class). ' + 'This\n' + ' renders the meaning of the program undefined. In the ' 'future, a\n' ' check may be added to prevent this.\n' '\n' @@ -8834,9 +8880,9 @@ 'and "tuple".\n' '\n' '* Any non-string iterable may be assigned to *__slots__*. ' - 'Mappings\n' - ' may also be used; however, in the future, special meaning ' - 'may be\n' + 'Mappings may\n' + ' also be used; however, in the future, special meaning may ' + 'be\n' ' assigned to the values corresponding to each key.\n' '\n' '* *__class__* assignment works only if both classes have the ' @@ -8852,8 +8898,8 @@ ' raise "TypeError".\n' '\n' '* If an iterator is used for *__slots__* then a descriptor ' - 'is\n' - ' created for each of the iterator’s values. However, the ' + 'is created\n' + ' for each of the iterator’s values. However, the ' '*__slots__*\n' ' attribute will be an empty iterator.\n' '\n' @@ -8906,9 +8952,11 @@ 'does nothing,\n' ' but raises an error if it is called with any arguments.\n' '\n' - ' Note: The metaclass hint "metaclass" is consumed by the ' - 'rest of\n' - ' the type machinery, and is never passed to ' + ' Note:\n' + '\n' + ' The metaclass hint "metaclass" is consumed by the rest ' + 'of the\n' + ' type machinery, and is never passed to ' '"__init_subclass__"\n' ' implementations. The actual metaclass (rather than the ' 'explicit\n' @@ -8976,9 +9024,10 @@ 'tuple may\n' 'be empty, in such case the original base is ignored.\n' '\n' - 'See also: **PEP 560** - Core support for typing module and ' - 'generic\n' - ' types\n' + 'See also:\n' + '\n' + ' **PEP 560** - Core support for typing module and generic ' + 'types\n' '\n' '\n' 'Determining the appropriate metaclass\n' @@ -9236,9 +9285,10 @@ 'type hints,\n' 'other usage is discouraged.\n' '\n' - 'See also: **PEP 560** - Core support for typing module and ' - 'generic\n' - ' types\n' + 'See also:\n' + '\n' + ' **PEP 560** - Core support for typing module and generic ' + 'types\n' '\n' '\n' 'Emulating callable objects\n' @@ -9350,9 +9400,11 @@ '\n' ' New in version 3.4.\n' '\n' - 'Note: Slicing is done exclusively with the following three ' - 'methods.\n' - ' A call like\n' + 'Note:\n' + '\n' + ' Slicing is done exclusively with the following three ' + 'methods. A\n' + ' call like\n' '\n' ' a[1:2] = b\n' '\n' @@ -9383,8 +9435,10 @@ 'the\n' ' container), "KeyError" should be raised.\n' '\n' - ' Note: "for" loops expect that an "IndexError" will be ' - 'raised for\n' + ' Note:\n' + '\n' + ' "for" loops expect that an "IndexError" will be raised ' + 'for\n' ' illegal indexes to allow proper detection of the end of ' 'the\n' ' sequence.\n' @@ -9574,15 +9628,18 @@ '"__rpow__()" (the\n' ' coercion rules would become too complicated).\n' '\n' - ' Note: If the right operand’s type is a subclass of the ' - 'left\n' - ' operand’s type and that subclass provides the reflected ' - 'method\n' - ' for the operation, this method will be called before ' - 'the left\n' - ' operand’s non-reflected method. This behavior allows ' - 'subclasses\n' - ' to override their ancestors’ operations.\n' + ' Note:\n' + '\n' + ' If the right operand’s type is a subclass of the left ' + 'operand’s\n' + ' type and that subclass provides a different ' + 'implementation of the\n' + ' reflected method for the operation, this method will be ' + 'called\n' + ' before the left operand’s non-reflected method. This ' + 'behavior\n' + ' allows subclasses to override their ancestors’ ' + 'operations.\n' '\n' 'object.__iadd__(self, other)\n' 'object.__isub__(self, other)\n' @@ -9914,36 +9971,7 @@ '*start* and\n' ' *end* are interpreted as in slice notation.\n' '\n' - 'str.removeprefix(prefix, /)\n' - '\n' - ' If the string starts with the *prefix* string, return\n' - ' "string[len(prefix):]". Otherwise, return a copy of the ' - 'original\n' - ' string:\n' - '\n' - " >>> 'TestHook'.removeprefix('Test')\n" - " 'Hook'\n" - " >>> 'BaseTestCase'.removeprefix('Test')\n" - " 'BaseTestCase'\n" - '\n' - ' New in version 3.9.\n' - '\n' - 'str.removesuffix(suffix, /)\n' - '\n' - ' If the string ends with the *suffix* string and that ' - '*suffix* is\n' - ' not empty, return "string[:-len(suffix)]". Otherwise, ' - 'return a copy\n' - ' of the original string:\n' - '\n' - " >>> 'MiscTests'.removesuffix('Tests')\n" - " 'Misc'\n" - " >>> 'TmpDirMixin'.removesuffix('Tests')\n" - " 'TmpDirMixin'\n" - '\n' - ' New in version 3.9.\n' - '\n' - 'str.encode(encoding="utf-8", errors="strict")\n' + "str.encode(encoding='utf-8', errors='strict')\n" '\n' ' Return an encoded version of the string as a bytes ' 'object. Default\n' @@ -10029,11 +10057,13 @@ '"-1" if\n' ' *sub* is not found.\n' '\n' - ' Note: The "find()" method should be used only if you ' - 'need to know\n' - ' the position of *sub*. To check if *sub* is a ' - 'substring or not,\n' - ' use the "in" operator:\n' + ' Note:\n' + '\n' + ' The "find()" method should be used only if you need ' + 'to know the\n' + ' position of *sub*. To check if *sub* is a substring ' + 'or not, use\n' + ' the "in" operator:\n' '\n' " >>> 'Py' in 'Python'\n" ' True\n' @@ -10062,8 +10092,9 @@ ' formatting options that can be specified in format ' 'strings.\n' '\n' - ' Note: When formatting a number ("int", "float", ' - '"complex",\n' + ' Note:\n' + '\n' + ' When formatting a number ("int", "float", "complex",\n' ' "decimal.Decimal" and subclasses) with the "n" type ' '(ex:\n' ' "\'{:n}\'.format(1234)"), the function temporarily ' @@ -10371,6 +10402,35 @@ 'followed by\n' ' two empty strings.\n' '\n' + 'str.removeprefix(prefix, /)\n' + '\n' + ' If the string starts with the *prefix* string, return\n' + ' "string[len(prefix):]". Otherwise, return a copy of the ' + 'original\n' + ' string:\n' + '\n' + " >>> 'TestHook'.removeprefix('Test')\n" + " 'Hook'\n" + " >>> 'BaseTestCase'.removeprefix('Test')\n" + " 'BaseTestCase'\n" + '\n' + ' New in version 3.9.\n' + '\n' + 'str.removesuffix(suffix, /)\n' + '\n' + ' If the string ends with the *suffix* string and that ' + '*suffix* is\n' + ' not empty, return "string[:-len(suffix)]". Otherwise, ' + 'return a copy\n' + ' of the original string:\n' + '\n' + " >>> 'MiscTests'.removesuffix('Tests')\n" + " 'Misc'\n" + " >>> 'TmpDirMixin'.removesuffix('Tests')\n" + " 'TmpDirMixin'\n" + '\n' + ' New in version 3.9.\n' + '\n' 'str.replace(old, new[, count])\n' '\n' ' Return a copy of the string with all occurrences of ' @@ -10417,7 +10477,7 @@ 'followed by\n' ' the string itself.\n' '\n' - 'str.rsplit(sep=None, maxsplit=-1)\n' + 'str.rsplit(sep=None, maxsplit=- 1)\n' '\n' ' Return a list of the words in the string, using *sep* ' 'as the\n' @@ -10458,7 +10518,7 @@ " >>> 'Monty Python'.removesuffix(' Python')\n" " 'Monty'\n" '\n' - 'str.split(sep=None, maxsplit=-1)\n' + 'str.split(sep=None, maxsplit=- 1)\n' '\n' ' Return a list of the words in the string, using *sep* ' 'as the\n' @@ -10939,17 +10999,20 @@ '\n' '2. Unlike in Standard C, exactly two hex digits are required.\n' '\n' - '3. In a bytes literal, hexadecimal and octal escapes denote the\n' - ' byte with the given value. In a string literal, these escapes\n' - ' denote a Unicode character with the given value.\n' + '3. In a bytes literal, hexadecimal and octal escapes denote the ' + 'byte\n' + ' with the given value. In a string literal, these escapes ' + 'denote a\n' + ' Unicode character with the given value.\n' '\n' '4. Changed in version 3.3: Support for name aliases [1] has been\n' ' added.\n' '\n' '5. Exactly four hex digits are required.\n' '\n' - '6. Any Unicode character can be encoded this way. Exactly eight\n' - ' hex digits are required.\n' + '6. Any Unicode character can be encoded this way. Exactly eight ' + 'hex\n' + ' digits are required.\n' '\n' 'Unlike Standard C, all unrecognized escape sequences are left in ' 'the\n' @@ -11399,7 +11462,7 @@ ' points. All the code points in the range "U+0000 - ' 'U+10FFFF"\n' ' can be represented in a string. Python doesn’t have a ' - '"char"\n' + '*char*\n' ' type; instead, every code point in the string is ' 'represented\n' ' as a string object with length "1". The built-in ' @@ -12647,9 +12710,11 @@ '\n' ' Changed in version 3.8: Dictionaries are now reversible.\n' '\n' - 'See also: "types.MappingProxyType" can be used to create a ' - 'read-only\n' - ' view of a "dict".\n' + 'See also:\n' + '\n' + ' "types.MappingProxyType" can be used to create a read-only ' + 'view of a\n' + ' "dict".\n' '\n' '\n' 'Dictionary view objects\n' @@ -12712,6 +12777,14 @@ ' Changed in version 3.8: Dictionary views are now ' 'reversible.\n' '\n' + 'dictview.mapping\n' + '\n' + ' Return a "types.MappingProxyType" that wraps the ' + 'original\n' + ' dictionary to which the view refers.\n' + '\n' + ' New in version 3.10.\n' + '\n' 'Keys views are set-like since their entries are unique and ' 'hashable.\n' 'If all values are hashable, so that "(key, value)" pairs are ' @@ -12757,7 +12830,15 @@ " >>> keys & {'eggs', 'bacon', 'salad'}\n" " {'bacon'}\n" " >>> keys ^ {'sausage', 'juice'}\n" - " {'juice', 'sausage', 'bacon', 'spam'}\n", + " {'juice', 'sausage', 'bacon', 'spam'}\n" + '\n' + ' >>> # get back a read-only proxy for the original ' + 'dictionary\n' + ' >>> values.mapping\n' + " mappingproxy({'eggs': 2, 'sausage': 1, 'bacon': 1, " + "'spam': 500})\n" + " >>> values.mapping['spam']\n" + ' 500\n', 'typesmethods': 'Methods\n' '*******\n' '\n' @@ -13033,13 +13114,14 @@ '"None", it\n' ' is treated like "1".\n' '\n' - '6. Concatenating immutable sequences always results in a new\n' - ' object. This means that building up a sequence by repeated\n' - ' concatenation will have a quadratic runtime cost in the ' - 'total\n' - ' sequence length. To get a linear runtime cost, you must ' - 'switch to\n' - ' one of the alternatives below:\n' + '6. Concatenating immutable sequences always results in a new ' + 'object.\n' + ' This means that building up a sequence by repeated ' + 'concatenation\n' + ' will have a quadratic runtime cost in the total sequence ' + 'length.\n' + ' To get a linear runtime cost, you must switch to one of the\n' + ' alternatives below:\n' '\n' ' * if concatenating "str" objects, you can build a list and ' 'use\n' @@ -13057,24 +13139,25 @@ ' * for other types, investigate the relevant class ' 'documentation\n' '\n' - '7. Some sequence types (such as "range") only support item\n' - ' sequences that follow specific patterns, and hence don’t ' - 'support\n' - ' sequence concatenation or repetition.\n' - '\n' - '8. "index" raises "ValueError" when *x* is not found in *s*. ' - 'Not\n' - ' all implementations support passing the additional arguments ' - '*i*\n' - ' and *j*. These arguments allow efficient searching of ' - 'subsections\n' - ' of the sequence. Passing the extra arguments is roughly ' - 'equivalent\n' - ' to using "s[i:j].index(x)", only without copying any data and ' - 'with\n' - ' the returned index being relative to the start of the ' + '7. Some sequence types (such as "range") only support item ' + 'sequences\n' + ' that follow specific patterns, and hence don’t support ' 'sequence\n' - ' rather than the start of the slice.\n' + ' concatenation or repetition.\n' + '\n' + '8. "index" raises "ValueError" when *x* is not found in *s*. Not ' + 'all\n' + ' implementations support passing the additional arguments *i* ' + 'and\n' + ' *j*. These arguments allow efficient searching of subsections ' + 'of\n' + ' the sequence. Passing the extra arguments is roughly ' + 'equivalent to\n' + ' using "s[i:j].index(x)", only without copying any data and ' + 'with the\n' + ' returned index being relative to the start of the sequence ' + 'rather\n' + ' than the start of the slice.\n' '\n' '\n' 'Immutable Sequence Types\n' @@ -13202,17 +13285,17 @@ '1. *t* must have the same length as the slice it is replacing.\n' '\n' '2. The optional argument *i* defaults to "-1", so that by ' - 'default\n' - ' the last item is removed and returned.\n' + 'default the\n' + ' last item is removed and returned.\n' '\n' '3. "remove()" raises "ValueError" when *x* is not found in *s*.\n' '\n' - '4. The "reverse()" method modifies the sequence in place for\n' - ' economy of space when reversing a large sequence. To remind ' - 'users\n' - ' that it operates by side effect, it does not return the ' - 'reversed\n' - ' sequence.\n' + '4. The "reverse()" method modifies the sequence in place for ' + 'economy\n' + ' of space when reversing a large sequence. To remind users ' + 'that it\n' + ' operates by side effect, it does not return the reversed ' + 'sequence.\n' '\n' '5. "clear()" and "copy()" are included for consistency with the\n' ' interfaces of mutable containers that don’t support slicing\n' @@ -13249,9 +13332,9 @@ ' * Using a pair of square brackets to denote the empty list: ' '"[]"\n' '\n' - ' * Using square brackets, separating items with commas: ' - '"[a]",\n' - ' "[a, b, c]"\n' + ' * Using square brackets, separating items with commas: "[a]", ' + '"[a,\n' + ' b, c]"\n' '\n' ' * Using a list comprehension: "[x for x in iterable]"\n' '\n' @@ -13554,9 +13637,9 @@ '\n' 'See also:\n' '\n' - ' * The linspace recipe shows how to implement a lazy version ' - 'of\n' - ' range suitable for floating point applications.\n', + ' * The linspace recipe shows how to implement a lazy version of ' + 'range\n' + ' suitable for floating point applications.\n', 'typesseq-mutable': 'Mutable Sequence Types\n' '**********************\n' '\n' @@ -13667,19 +13750,18 @@ 'replacing.\n' '\n' '2. The optional argument *i* defaults to "-1", so that ' - 'by default\n' - ' the last item is removed and returned.\n' + 'by default the\n' + ' last item is removed and returned.\n' '\n' '3. "remove()" raises "ValueError" when *x* is not found ' 'in *s*.\n' '\n' '4. The "reverse()" method modifies the sequence in place ' - 'for\n' - ' economy of space when reversing a large sequence. To ' - 'remind users\n' - ' that it operates by side effect, it does not return ' - 'the reversed\n' - ' sequence.\n' + 'for economy\n' + ' of space when reversing a large sequence. To remind ' + 'users that it\n' + ' operates by side effect, it does not return the ' + 'reversed sequence.\n' '\n' '5. "clear()" and "copy()" are included for consistency ' 'with the\n' @@ -13762,8 +13844,9 @@ 'The execution of the "with" statement with one “item” proceeds as\n' 'follows:\n' '\n' - '1. The context expression (the expression given in the "with_item")\n' - ' is evaluated to obtain a context manager.\n' + '1. The context expression (the expression given in the "with_item") ' + 'is\n' + ' evaluated to obtain a context manager.\n' '\n' '2. The context manager’s "__enter__()" is loaded for later use.\n' '\n' @@ -13771,12 +13854,15 @@ '\n' '4. The context manager’s "__enter__()" method is invoked.\n' '\n' - '5. If a target was included in the "with" statement, the return\n' - ' value from "__enter__()" is assigned to it.\n' + '5. If a target was included in the "with" statement, the return ' + 'value\n' + ' from "__enter__()" is assigned to it.\n' + '\n' + ' Note:\n' '\n' - ' Note: The "with" statement guarantees that if the "__enter__()"\n' - ' method returns without an error, then "__exit__()" will always ' - 'be\n' + ' The "with" statement guarantees that if the "__enter__()" ' + 'method\n' + ' returns without an error, then "__exit__()" will always be\n' ' called. Thus, if an error occurs during the assignment to the\n' ' target list, it will be treated the same as an error occurring\n' ' within the suite would be. See step 6 below.\n' diff --git a/Misc/NEWS.d/3.10.0a1.rst b/Misc/NEWS.d/3.10.0a1.rst new file mode 100644 index 00000000000000..725dfd16b180a7 --- /dev/null +++ b/Misc/NEWS.d/3.10.0a1.rst @@ -0,0 +1,3519 @@ +.. bpo: 41304 +.. date: 2020-07-15-20-15-08 +.. nonce: vNEeYA +.. release date: 2020-10-05 +.. section: Security + +Fixes `python3x._pth` being ignored on Windows, caused by the fix for +:issue:`29778` (CVE-2020-15801). + +.. + +.. bpo: 41162 +.. date: 2020-07-03-20-41-29 +.. nonce: tb8pVj +.. section: Security + +Audit hooks are now cleared later during finalization to avoid missing +events. + +.. + +.. bpo: 29778 +.. date: 2020-07-03-17-21-37 +.. nonce: cR_fGS +.. section: Security + +Ensure :file:`python3.dll` is loaded from correct locations when Python is +embedded (CVE-2020-15523). + +.. + +.. bpo: 41004 +.. date: 2020-06-29-16-02-29 +.. nonce: ovF0KZ +.. section: Security + +The __hash__() methods of ipaddress.IPv4Interface and +ipaddress.IPv6Interface incorrectly generated constant hash values of 32 and +128 respectively. This resulted in always causing hash collisions. The fix +uses hash() to generate hash values for the tuple of (address, mask length, +network address). + +.. + +.. bpo: 39603 +.. date: 2020-02-12-14-17-39 +.. nonce: Gt3RSg +.. section: Security + +Prevent http header injection by rejecting control characters in +http.client.putrequest(...). + +.. + +.. bpo: 41909 +.. date: 2020-10-04-10-55-12 +.. nonce: BqHPcm +.. section: Core and Builtins + +Fixed stack overflow in :func:`issubclass` and :func:`isinstance` when +getting the ``__bases__`` attribute leads to infinite recursion. + +.. + +.. bpo: 41922 +.. date: 2020-10-04-01-02-58 +.. nonce: kHGT8I +.. section: Core and Builtins + +Speed up calls to ``reversed()`` by using the :pep:`590` ``vectorcall`` +calling convention. Patch by Dong-hee Na. + +.. + +.. bpo: 41873 +.. date: 2020-09-28-08-58-28 +.. nonce: VzEDhA +.. section: Core and Builtins + +Calls to ``float()`` are now faster due to the ``vectorcall`` calling +convention. Patch by Dennis Sweeney. + +.. + +.. bpo: 41870 +.. date: 2020-09-27-22-23-14 +.. nonce: 2v6_v4 +.. section: Core and Builtins + +Speed up calls to ``bool()`` by using the :pep:`590` ``vectorcall`` calling +convention. Patch by Dong-hee Na. + +.. + +.. bpo: 1635741 +.. date: 2020-09-26-14-43-30 +.. nonce: aJS9B3 +.. section: Core and Builtins + +Port the :mod:`_bisect` module to the multi-phase initialization API +(:pep:`489`). + +.. + +.. bpo: 39934 +.. date: 2020-09-24-12-15-45 +.. nonce: YVHTCF +.. section: Core and Builtins + +Correctly count control blocks in 'except' in compiler. Ensures that a +syntax error, rather a fatal error, occurs for deeply nested, named +exception handlers. + +.. + +.. bpo: 41780 +.. date: 2020-09-15-23-29-49 +.. nonce: bOBUIH +.. section: Core and Builtins + +Fix :meth:`__dir__` of :class:`types.GenericAlias`. Patch by Batuhan +Taskaya. + +.. + +.. bpo: 1635741 +.. date: 2020-09-12-18-34-34 +.. nonce: lh335O +.. section: Core and Builtins + +Port the :mod:`_lsprof` extension module to multi-phase initialization +(:pep:`489`). + +.. + +.. bpo: 41756 +.. date: 2020-09-12-12-55-45 +.. nonce: 1h0tbV +.. section: Core and Builtins + +Add PyGen_Send function to allow sending value into generator/coroutine +without raising StopIteration exception to signal return + +.. + +.. bpo: 1635741 +.. date: 2020-09-08-21-58-47 +.. nonce: vdjSLH +.. section: Core and Builtins + +Port the :mod:`cmath` extension module to multi-phase initialization +(:pep:`489`). + +.. + +.. bpo: 1635741 +.. date: 2020-09-08-20-39-43 +.. nonce: jiXmyT +.. section: Core and Builtins + +Port the :mod:`_scproxy` extension module to multi-phase initialization +(:pep:`489`). + +.. + +.. bpo: 1635741 +.. date: 2020-09-07-11-35-02 +.. nonce: rvIexb +.. section: Core and Builtins + +Port the :mod:`termios` extension module to multi-phase initialization +(:pep:`489`). + +.. + +.. bpo: 1635741 +.. date: 2020-09-07-09-45-47 +.. nonce: QuDIut +.. section: Core and Builtins + +Convert the :mod:`_sha256` extension module types to heap types. + +.. + +.. bpo: 41690 +.. date: 2020-09-02-12-00-57 +.. nonce: Ny-Sfy +.. section: Core and Builtins + +Fix a possible stack overflow in the parser when parsing functions and +classes with a huge ammount of arguments. Patch by Pablo Galindo. + +.. + +.. bpo: 1635741 +.. date: 2020-09-01-17-22-35 +.. nonce: CnRME3 +.. section: Core and Builtins + +Port the :mod:`_overlapped` extension module to multi-phase initialization +(:pep:`489`). + +.. + +.. bpo: 1635741 +.. date: 2020-09-01-17-08-07 +.. nonce: X9CZgo +.. section: Core and Builtins + +Port the :mod:`_curses_panel` extension module to multi-phase initialization +(:pep:`489`). + +.. + +.. bpo: 1635741 +.. date: 2020-09-01-17-06-02 +.. nonce: 5jZymK +.. section: Core and Builtins + +Port the :mod:`_opcode` extension module to multi-phase initialization +(:pep:`489`). + +.. + +.. bpo: 41681 +.. date: 2020-08-31-17-49-02 +.. nonce: 3-VJiH +.. section: Core and Builtins + +Fixes the wrong error description in the error raised by using 2 `,` in +format string in f-string and :meth:`str.format`. + +.. + +.. bpo: 41675 +.. date: 2020-08-31-14-53-17 +.. nonce: VSoqWU +.. section: Core and Builtins + +The implementation of :func:`signal.siginterrupt` now uses +:c:func:`sigaction` (if it is available in the system) instead of the +deprecated :c:func:`siginterrupt`. Patch by Pablo Galindo. + +.. + +.. bpo: 41670 +.. date: 2020-08-31-11-37-59 +.. nonce: vmRJRx +.. section: Core and Builtins + +Prevent line trace being skipped on platforms not compiled with +``USE_COMPUTED_GOTOS``. Fixes issue where some lines nested within a +try-except block were not being traced on Windows. + +.. + +.. bpo: 41654 +.. date: 2020-08-30-20-38-33 +.. nonce: HtnhAM +.. section: Core and Builtins + +Fix a crash that occurred when destroying subclasses of +:class:`MemoryError`. Patch by Pablo Galindo. + +.. + +.. bpo: 1635741 +.. date: 2020-08-28-20-54-04 +.. nonce: 7ijlcI +.. section: Core and Builtins + +Port the :mod:`zlib` extension module to multi-phase initialization +(:pep:`489`). + +.. + +.. bpo: 41631 +.. date: 2020-08-26-11-23-31 +.. nonce: 3jZcd9 +.. section: Core and Builtins + +The ``_ast`` module uses again a global state. Using a module state per +module instance is causing subtle practical problems. For example, the +Mercurial project replaces the ``__import__()`` function to implement lazy +import, whereas Python expected that ``import _ast`` always return a fully +initialized ``_ast`` module. + +.. + +.. bpo: 40077 +.. date: 2020-08-25-22-43-33 +.. nonce: vcxSUa +.. section: Core and Builtins + +Convert :mod:`_operator` to use :c:func:`PyType_FromSpec`. + +.. + +.. bpo: 1653741 +.. date: 2020-08-13-07-19-21 +.. nonce: fubBkb +.. section: Core and Builtins + +Port :mod:`_sha3` to multi-phase init. Convert static types to heap types. + +.. + +.. bpo: 1635741 +.. date: 2020-08-13-07-18-05 +.. nonce: FC13e7 +.. section: Core and Builtins + +Port the :mod:`_blake2` extension module to the multi-phase initialization +API (:pep:`489`). + +.. + +.. bpo: 41533 +.. date: 2020-08-12-20-29-57 +.. nonce: 4pcVAc +.. section: Core and Builtins + +Free the stack allocated in ``va_build_stack`` if ``do_mkstack`` fails and +the stack is not a ``small_stack``. + +.. + +.. bpo: 41531 +.. date: 2020-08-12-19-32-15 +.. nonce: WgPzjT +.. section: Core and Builtins + +Fix a bug that was dropping keys when compiling dict literals with more than +0xFFFF elements. Patch by Pablo Galindo. + +.. + +.. bpo: 41525 +.. date: 2020-08-12-07-35-07 +.. nonce: d9q3XL +.. section: Core and Builtins + +The output of ``python --help`` contains now only ASCII characters. + +.. + +.. bpo: 1635741 +.. date: 2020-08-10-16-11-32 +.. nonce: O0d3ym +.. section: Core and Builtins + +Port the :mod:`_sha1`, :mod:`_sha512`, and :mod:`_md5` extension modules to +multi-phase initialization API (:pep:`489`). + +.. + +.. bpo: 41431 +.. date: 2020-08-02-15-53-12 +.. nonce: TblUBT +.. section: Core and Builtins + +Optimize ``dict_merge()`` for copying dict (e.g. ``dict(d)`` and +``{}.update(d)``). + +.. + +.. bpo: 41428 +.. date: 2020-07-28-22-43-27 +.. nonce: FM6xsI +.. section: Core and Builtins + +Implement PEP 604. This supports (int | str) etc. in place of Union[str, +int]. + +.. + +.. bpo: 41340 +.. date: 2020-07-27-01-50-06 +.. nonce: pZXfcF +.. section: Core and Builtins + +Removed fallback implementation for ``strdup``. + +.. + +.. bpo: 38156 +.. date: 2020-07-20-17-01-17 +.. nonce: ptcdRy +.. section: Core and Builtins + +Handle interrupts that come after EOF correctly in ``PyOS_StdioReadline``. + +.. + +.. bpo: 41342 +.. date: 2020-07-19-15-40-52 +.. nonce: RRk_m_ +.. section: Core and Builtins + +:func:`round` with integer argument is now faster (9--60%). + +.. + +.. bpo: 41334 +.. date: 2020-07-18-18-01-10 +.. nonce: t5xMGp +.. section: Core and Builtins + +Constructors :func:`str`, :func:`bytes` and :func:`bytearray` are now faster +(around 30--40% for small objects). + +.. + +.. bpo: 41295 +.. date: 2020-07-18-08-15-32 +.. nonce: pu8Ezo +.. section: Core and Builtins + +Resolve a regression in CPython 3.8.4 where defining "__setattr__" in a +multi-inheritance setup and calling up the hierarchy chain could fail if +builtins/extension types were involved in the base types. + +.. + +.. bpo: 41323 +.. date: 2020-07-17-11-31-54 +.. nonce: ChbZHh +.. section: Core and Builtins + +Bytecode optimizations are performed directly on the control flow graph. +This will result in slightly more compact code objects in some +circumstances. + +.. + +.. bpo: 41247 +.. date: 2020-07-08-22-03-54 +.. nonce: PndYIk +.. section: Core and Builtins + +Always cache the running loop holder when running +``asyncio.set_running_loop``. + +.. + +.. bpo: 41252 +.. date: 2020-07-08-21-55-23 +.. nonce: nBWL-Y +.. section: Core and Builtins + +Fix incorrect refcounting in _ssl.c's ``_servername_callback()``. + +.. + +.. bpo: 1635741 +.. date: 2020-07-07-16-10-52 +.. nonce: zU-H_n +.. section: Core and Builtins + +Port :mod:`multiprocessing` to multi-phase initialization + +.. + +.. bpo: 1635741 +.. date: 2020-07-06-20-43-19 +.. nonce: LYhsni +.. section: Core and Builtins + +Port :mod:`winapi` to multiphase initialization + +.. + +.. bpo: 41215 +.. date: 2020-07-06-18-36-33 +.. nonce: vFGFIz +.. section: Core and Builtins + +Use non-NULL default values in the PEG parser keyword list to overcome a bug +that was preventing Python from being properly compiled when using the XLC +compiler. Patch by Pablo Galindo. + +.. + +.. bpo: 41218 +.. date: 2020-07-06-13-35-17 +.. nonce: oKnSr2 +.. section: Core and Builtins + +Python 3.8.3 had a regression where compiling with +ast.PyCF_ALLOW_TOP_LEVEL_AWAIT would aggressively mark list comprehension +with CO_COROUTINE. Now only list comprehension making use of async/await +will tagged as so. + +.. + +.. bpo: 1635741 +.. date: 2020-07-03-23-10-02 +.. nonce: F5coWe +.. section: Core and Builtins + +Port :mod:`faulthandler` to multiphase initialization. + +.. + +.. bpo: 1635741 +.. date: 2020-07-01-20-17-38 +.. nonce: -AtPYu +.. section: Core and Builtins + +Port :mod:`sha256` to multiphase initialization + +.. + +.. bpo: 41175 +.. date: 2020-06-30-20-17-31 +.. nonce: acJoXB +.. section: Core and Builtins + +Guard against a NULL pointer dereference within bytearrayobject triggered by +the ``bytearray() + bytearray()`` operation. + +.. + +.. bpo: 41100 +.. date: 2020-06-30-04-44-29 +.. nonce: PJwA6F +.. section: Core and Builtins + +add arm64 to the allowable Mac OS arches in mpdecimal.h + +.. + +.. bpo: 41094 +.. date: 2020-06-23-23-26-42 +.. nonce: zEIJse +.. section: Core and Builtins + +Fix decoding errors with audit when open files with non-ASCII names on +non-UTF-8 locale. + +.. + +.. bpo: 39960 +.. date: 2020-06-23-18-32-41 +.. nonce: Kez3fP +.. section: Core and Builtins + +The "hackcheck" that prevents sneaking around a type's __setattr__() by +calling the superclass method was rewritten to allow C implemented heap +types. + +.. + +.. bpo: 41084 +.. date: 2020-06-23-15-10-19 +.. nonce: pt3y7F +.. section: Core and Builtins + +Prefix the error message with 'f-string: ', when parsing an f-string +expression which throws a :exc:`SyntaxError`. + +.. + +.. bpo: 40521 +.. date: 2020-06-23-07-35-11 +.. nonce: dMNA6k +.. section: Core and Builtins + +Empty frozensets are no longer singletons. + +.. + +.. bpo: 41076 +.. date: 2020-06-22-13-22-30 +.. nonce: eWYw2N +.. section: Core and Builtins + +Pre-feed the parser with the location of the f-string expression, not the +f-string itself, which allows us to skip the shifting of the AST node +locations after the parsing is completed. + +.. + +.. bpo: 41056 +.. date: 2020-06-21-19-53-33 +.. nonce: IDu_EK +.. section: Core and Builtins + +Fixes a reference to deallocated stack space during startup when +constructing sys.path involving a relative symlink when code was supplied +via -c. (discovered via Coverity) + +.. + +.. bpo: 41061 +.. date: 2020-06-21-10-54-02 +.. nonce: AHf9MU +.. section: Core and Builtins + +Fix incorrect expressions and asserts in hashtable code and tests. + +.. + +.. bpo: 41052 +.. date: 2020-06-20-22-46-18 +.. nonce: 46MPeF +.. section: Core and Builtins + +Opt out serialization/deserialization for _random.Random + +.. + +.. bpo: 40939 +.. date: 2020-06-20-19-27-47 +.. nonce: jxJ4yn +.. section: Core and Builtins + +Rename `PyPegen*` functions to `PyParser*`, so that we can remove the old +set of `PyParser*` functions that were using the old parser, but keep +everything backwards-compatible. + +.. + +.. bpo: 35975 +.. date: 2020-06-20-17-00-44 +.. nonce: UDHCHp +.. section: Core and Builtins + +Stefan Behnel reported that cf_feature_version is used even when +PyCF_ONLY_AST is not set. This is against the intention and against the +documented behavior, so it's been fixed. + +.. + +.. bpo: 40939 +.. date: 2020-06-20-16-59-02 +.. nonce: 6810Ak +.. section: Core and Builtins + +Remove the remaining files from the old parser and the :mod:`symbol` module. + +.. + +.. bpo: 40077 +.. date: 2020-06-18-19-04-30 +.. nonce: _yI-ax +.. section: Core and Builtins + +Convert :mod:`_bz2` to use :c:func:`PyType_FromSpec`. + +.. + +.. bpo: 41006 +.. date: 2020-06-18-00-07-09 +.. nonce: H-wN-d +.. section: Core and Builtins + +The ``encodings.latin_1`` module is no longer imported at startup. Now it is +only imported when it is the filesystem encoding or the stdio encoding. + +.. + +.. bpo: 40636 +.. date: 2020-06-17-10-27-17 +.. nonce: MYaCIe +.. section: Core and Builtins + +:func:`zip` now supports :pep:`618`'s ``strict`` parameter, which raises a +:exc:`ValueError` if the arguments are exhausted at different lengths. Patch +by Brandt Bucher. + +.. + +.. bpo: 1635741 +.. date: 2020-06-17-00-52-21 +.. nonce: 61iyYh +.. section: Core and Builtins + +Port :mod:`_gdbm` to multiphase initialization. + +.. + +.. bpo: 40985 +.. date: 2020-06-15-16-29-55 +.. nonce: IIN_xX +.. section: Core and Builtins + +Fix a bug that caused the :exc:`SyntaxError` text to be empty when a file +ends with a line ending in a line continuation character (i.e. backslash). +The error text should contain the text of the last line. + +.. + +.. bpo: 40958 +.. date: 2020-06-15-01-20-44 +.. nonce: 7O2Wh1 +.. section: Core and Builtins + +Fix a possible buffer overflow in the PEG parser when gathering information +for emitting syntax errors. Patch by Pablo Galindo. + +.. + +.. bpo: 1635741 +.. date: 2020-06-12-22-56-17 +.. nonce: mmlp3Q +.. section: Core and Builtins + +Port :mod:`_dbm` to multiphase initialization. + +.. + +.. bpo: 40957 +.. date: 2020-06-12-12-21-54 +.. nonce: Z8n6I6 +.. section: Core and Builtins + +Fix refleak in _Py_fopen_obj() when PySys_Audit() fails + +.. + +.. bpo: 40950 +.. date: 2020-06-12-00-12-28 +.. nonce: tzMy7m +.. section: Core and Builtins + +Add a state to the :mod:`nis` module (:pep:`3121`) and apply the multiphase +initialization. Patch by Dong-hee Na. + +.. + +.. bpo: 40947 +.. date: 2020-06-11-16-06-49 +.. nonce: 72cZcR +.. section: Core and Builtins + +The Python :ref:`Path Configuration ` now takes +:c:member:`PyConfig.platlibdir` in account. + +.. + +.. bpo: 40939 +.. date: 2020-06-10-11-27-15 +.. nonce: DO-wAI +.. section: Core and Builtins + +Remove the old parser, the :mod:`parser` module and all associated support +code, command-line options and environment variables. Patch by Pablo +Galindo. + +.. + +.. bpo: 40847 +.. date: 2020-06-09-23-52-32 +.. nonce: 4XAACw +.. section: Core and Builtins + +Fix a bug where a line with only a line continuation character is not +considered a blank line at tokenizer level. In such cases, more than a +single `NEWLINE` token was emitted. The old parser was working around the +issue, but the new parser threw a :exc:`SyntaxError` for valid input due to +this. For example, an empty line following a line continuation character was +interpreted as a :exc:`SyntaxError`. + +.. + +.. bpo: 40890 +.. date: 2020-06-09-00-20-13 +.. nonce: LoRV-g +.. section: Core and Builtins + +Each dictionary view now has a ``mapping`` attribute that provides a +:class:`types.MappingProxyType` wrapping the original dictionary. Patch +contributed by Dennis Sweeney. + +.. + +.. bpo: 40889 +.. date: 2020-06-08-22-46-33 +.. nonce: vIBl-W +.. section: Core and Builtins + +Improved the performance of symmetric difference operations on dictionary +item views. Patch by Dennis Sweeney. + +.. + +.. bpo: 40904 +.. date: 2020-06-08-01-08-57 +.. nonce: 76qQzo +.. section: Core and Builtins + +Fix possible segfault in the new PEG parser when parsing f-string containing +yield statements with no value (:code:`f"{yield}"`). Patch by Pablo Galindo + +.. + +.. bpo: 40903 +.. date: 2020-06-07-22-50-10 +.. nonce: 7dWejS +.. section: Core and Builtins + +Fixed a possible segfault in the new PEG parser when producing error +messages for invalid assignments of the form :code:`p=p=`. Patch by Pablo +Galindo + +.. + +.. bpo: 40880 +.. date: 2020-06-06-00-23-19 +.. nonce: fjdzSh +.. section: Core and Builtins + +Fix invalid memory read in the new parser when checking newlines in string +literals. Patch by Pablo Galindo. + +.. + +.. bpo: 40883 +.. date: 2020-06-05-23-25-00 +.. nonce: M6sQ-Q +.. section: Core and Builtins + +Fix memory leak in when parsing f-strings in the new parser. Patch by Pablo +Galindo + +.. + +.. bpo: 40870 +.. date: 2020-06-05-12-48-28 +.. nonce: 9cd2sk +.. section: Core and Builtins + +Raise :exc:`ValueError` when validating custom AST's where the constants +``True``, ``False`` and ``None`` are used within a :class:`ast.Name` node. + +.. + +.. bpo: 40854 +.. date: 2020-06-03-13-53-24 +.. nonce: O6vfQU +.. section: Core and Builtins + +Allow overriding :data:`sys.platlibdir` via a new :envvar:`PYTHONPLATLIBDIR` +environment variable. + +.. + +.. bpo: 40826 +.. date: 2020-06-01-20-31-07 +.. nonce: XCI4M2 +.. section: Core and Builtins + +Fix GIL usage in :c:func:`PyOS_Readline`: lock the GIL to set an exception +and pass the Python thread state when checking if there is a pending signal. + +.. + +.. bpo: 1635741 +.. date: 2020-05-30-23-23-35 +.. nonce: 0D-laM +.. section: Core and Builtins + +Port :mod:`fcntl` to multiphase initialization. + +.. + +.. bpo: 19468 +.. date: 2020-05-30-23-18-35 +.. nonce: S-TA7p +.. section: Core and Builtins + +Delete unnecessary instance check in importlib.reload(). Patch by Furkan +Önder. + +.. + +.. bpo: 40824 +.. date: 2020-05-30-14-37-18 +.. nonce: XR3V5s +.. section: Core and Builtins + +Unexpected errors in calling the ``__iter__`` method are no longer masked by +``TypeError`` in the :keyword:`in` operator and functions +:func:`~operator.contains`, :func:`~operator.indexOf` and +:func:`~operator.countOf` of the :mod:`operator` module. + +.. + +.. bpo: 40792 +.. date: 2020-05-27-22-37-58 +.. nonce: WEDqqU +.. section: Core and Builtins + +Attributes ``start``, ``stop`` and ``step`` of the :class:`range` object now +always has exact type :class:`int`. Previously, they could have been an +instance of a subclass of ``int``. + +.. + +.. bpo: 40780 +.. date: 2020-05-26-17-43-58 +.. nonce: 3Ckdgm +.. section: Core and Builtins + +Fix a corner case where g-style string formatting of a float failed to +remove trailing zeros. + +.. + +.. bpo: 38964 +.. date: 2020-05-25-21-49-11 +.. nonce: lrml90 +.. section: Core and Builtins + +When there's a :exc:`SyntaxError` in the expression part of an fstring, the +filename attribute of the :exc:`SyntaxError` gets correctly set to the name +of the file the fstring resides in. + +.. + +.. bpo: 40750 +.. date: 2020-05-24-02-42-26 +.. nonce: ZmO9Ev +.. section: Core and Builtins + +Support the "-d" debug flag in the new PEG parser. Patch by Pablo Galindo + +.. + +.. bpo: 40217 +.. date: 2020-05-23-01-15-51 +.. nonce: jZsHTc +.. section: Core and Builtins + +Instances of types created with :c:func:`PyType_FromSpecWithBases` will no +longer automatically visit their class object when traversing references in +the garbage collector. The user is expected to manually visit the object's +class. Patch by Pablo Galindo. + +.. + +.. bpo: 39573 +.. date: 2020-05-22-00-34-34 +.. nonce: QO2QHj +.. section: Core and Builtins + +:c:func:`Py_TYPE()` is changed to the inline static function. Patch by +Dong-hee Na. + +.. + +.. bpo: 40696 +.. date: 2020-05-21-01-54-00 +.. nonce: u3n8Wx +.. section: Core and Builtins + +Fix a hang that can arise after :meth:`generator.throw` due to a cycle in +the exception context chain. + +.. + +.. bpo: 40521 +.. date: 2020-05-20-01-17-34 +.. nonce: wvAehI +.. section: Core and Builtins + +Each interpreter now its has own free lists, singletons and caches: + +* Free lists: float, tuple, list, dict, frame, context, + asynchronous generator, MemoryError. +* Singletons: empty tuple, empty bytes string, empty Unicode string, + single byte character, single Unicode (latin1) character. +* Slice cache. + +They are no longer shared by all interpreters. + +.. + +.. bpo: 40679 +.. date: 2020-05-19-19-39-49 +.. nonce: SVzz9p +.. section: Core and Builtins + +Certain :exc:`TypeError` messages about missing or extra arguments now +include the function's :term:`qualified name`. Patch by Dennis Sweeney. + +.. + +.. bpo: 29590 +.. date: 2020-05-03-22-26-00 +.. nonce: aRz3l7 +.. section: Core and Builtins + +Make the stack trace correct after calling :meth:`generator.throw` on a +generator that has yielded from a ``yield from``. + +.. + +.. bpo: 4022 +.. date: 2020-04-11-13-07-49 +.. nonce: Ctpn_F +.. section: Core and Builtins + +Improve performance of generators by not raising internal StopIteration. + +.. + +.. bpo: 1635741 +.. date: 2020-04-10-23-54-57 +.. nonce: ZURqoN +.. section: Core and Builtins + +Port :mod:`mmap` to multiphase initialization. + +.. + +.. bpo: 1635741 +.. date: 2020-04-05-02-35-08 +.. nonce: Kfe9fT +.. section: Core and Builtins + +Port :mod:`_lzma` to multiphase initialization. + +.. + +.. bpo: 37999 +.. date: 2019-09-01-14-26-02 +.. nonce: XPl6dn +.. section: Core and Builtins + +Builtin and extension functions that take integer arguments no longer accept +:class:`~decimal.Decimal`\ s, :class:`~fractions.Fraction`\ s and other +objects that can be converted to integers only with a loss (e.g. that have +the :meth:`~object.__int__` method but do not have the +:meth:`~object.__index__` method). + +.. + +.. bpo: 29882 +.. date: 2019-06-02-11-29-15 +.. nonce: AkRzjb +.. section: Core and Builtins + +Add :meth:`int.bit_count()`, counting the number of ones in the binary +representation of an integer. Patch by Niklas Fiekas. + +.. + +.. bpo: 36982 +.. date: 2019-05-25-05-27-39 +.. nonce: 0UHgfB +.. section: Core and Builtins + +Use ncurses extended color functions when available to support terminals +with 256 colors, and add the new function +:func:`curses.has_extended_color_support` to indicate whether extended color +support is provided by the underlying ncurses library. + +.. + +.. bpo: 19569 +.. date: 2018-08-29-15-57-07 +.. nonce: RGu2Kb +.. section: Core and Builtins + +Add the private macros ``_Py_COMP_DIAG_PUSH``, +``_Py_COMP_DIAG_IGNORE_DEPR_DECLS``, and ``_Py_COMP_DIAG_POP``. + +.. + +.. bpo: 26680 +.. date: 2018-03-15-11-51-36 +.. nonce: wOWYps +.. section: Core and Builtins + +The int type now supports the x.is_integer() method for compatibility with +float. + +.. + +.. bpo: 41900 +.. date: 2020-10-01-10-50-12 +.. nonce: Cho7oh +.. section: Library + +C14N 2.0 serialisation in xml.etree.ElementTree failed for unprefixed +attributes when a default namespace was defined. + +.. + +.. bpo: 41887 +.. date: 2020-09-30-23-49-42 +.. nonce: -ee2S- +.. section: Library + +Strip leading spaces and tabs on :func:`ast.literal_eval`. Also document +stripping of spaces and tabs for :func:`eval`. + +.. + +.. bpo: 41773 +.. date: 2020-09-28-23-22-25 +.. nonce: oKkus0 +.. section: Library + +Note in documentation that :func:`random.choices` doesn't support non-finite +weights, raise :exc:`ValueError` when given non-finite weights. + +.. + +.. bpo: 41840 +.. date: 2020-09-23-23-17-59 +.. nonce: QRFr4L +.. section: Library + +Fix a bug in the :mod:`symtable` module that was causing module-scope global +variables to not be reported as both local and global. Patch by Pablo +Galindo. + +.. + +.. bpo: 41842 +.. date: 2020-09-23-22-52-24 +.. nonce: lIuhC9 +.. section: Library + +Add :func:`codecs.unregister` function to unregister a codec search +function. + +.. + +.. bpo: 40564 +.. date: 2020-09-23-03-33-37 +.. nonce: iXQqMq +.. section: Library + +In ``zipfile.Path``, mutate the passed ZipFile object type instead of making +a copy. Prevents issues when both the local copy and the caller’s copy +attempt to close the same file handle. + +.. + +.. bpo: 40670 +.. date: 2020-09-22-14-55-34 +.. nonce: R5sm68 +.. section: Library + +More reliable validation of statements in :class:`timeit.Timer`. It now +accepts "empty" statements (only whitespaces and comments) and rejects +misindentent statements. + +.. + +.. bpo: 41833 +.. date: 2020-09-22-13-51-14 +.. nonce: 6HVDjT +.. section: Library + +The :class:`threading.Thread` constructor now uses the target name if the +*target* argument is specified but the *name* argument is omitted. + +.. + +.. bpo: 41817 +.. date: 2020-09-22-00-23-30 +.. nonce: bnh-VG +.. section: Library + +fix `tkinter.EventType` Enum so all members are strings, and none are tuples + +.. + +.. bpo: 41810 +.. date: 2020-09-20-15-14-05 +.. nonce: 7l8lyV +.. section: Library + +:data:`types.EllipsisType`, :data:`types.NotImplementedType` and +:data:`types.NoneType` have been reintroduced, providing a new set of types +readily interpretable by static type checkers. + +.. + +.. bpo: 41815 +.. date: 2020-09-19-23-14-54 +.. nonce: RNpuX3 +.. section: Library + +Fix SQLite3 segfault when backing up closed database. Patch contributed by +Peter David McCormick. + +.. + +.. bpo: 41816 +.. date: 2020-09-19-12-22-08 +.. nonce: ynynXJ +.. section: Library + +StrEnum added: it ensures that all members are already strings or string +candidates + +.. + +.. bpo: 41517 +.. date: 2020-09-15-22-43-30 +.. nonce: sLBH7g +.. section: Library + +fix bug allowing Enums to be extended via multiple inheritance + +.. + +.. bpo: 39587 +.. date: 2020-09-15-14-56-13 +.. nonce: 69xzuh +.. section: Library + +use the correct mix-in data type when constructing Enums + +.. + +.. bpo: 41792 +.. date: 2020-09-15-07-55-35 +.. nonce: qMpSlU +.. section: Library + +Add is_typeddict function to typing.py to check if a type is a TypedDict +class + +Previously there was no way to check that without using private API. See the +`relevant issue in python/typing +` + +.. + +.. bpo: 41789 +.. date: 2020-09-14-19-27-46 +.. nonce: pI_uZQ +.. section: Library + +Honor `object` overrides in `Enum` class creation (specifically, `__str__`, +`__repr__`, `__format__`, and `__reduce_ex__`). + +.. + +.. bpo: 32218 +.. date: 2020-09-12-16-18-42 +.. nonce: IpYkEe +.. section: Library + +`enum.Flag` and `enum.IntFlag` members are now iterable + +.. + +.. bpo: 39651 +.. date: 2020-09-11-12-38-55 +.. nonce: JMp9l2 +.. section: Library + +Fix a race condition in the ``call_soon_threadsafe()`` method of +``asyncio.ProactorEventLoop``: do nothing if the self-pipe socket has been +closed. + +.. + +.. bpo: 1635741 +.. date: 2020-09-08-13-55-34 +.. nonce: 56MLP- +.. section: Library + +Port the ``mashal`` extension module to the multi-phase initialization API +(:pep:`489`). + +.. + +.. bpo: 1635741 +.. date: 2020-09-08-13-51-16 +.. nonce: wkPeoT +.. section: Library + +Port the ``_string`` extension module to the multi-phase initialization API +(:pep:`489`). + +.. + +.. bpo: 41732 +.. date: 2020-09-06-20-27-10 +.. nonce: 1SKv26 +.. section: Library + +Added an :term:`iterator` to :class:`memoryview`. + +.. + +.. bpo: 41720 +.. date: 2020-09-04-20-45-38 +.. nonce: PW9MzZ +.. section: Library + +Fixed :meth:`turtle.Vec2D.__rmul__` for arguments which are not int or +float. + +.. + +.. bpo: 41696 +.. date: 2020-09-03-01-35-32 +.. nonce: zkYGre +.. section: Library + +Fix handling of debug mode in :func:`asyncio.run`. This allows setting +``PYTHONASYNCIODEBUG`` or ``-X dev`` to enable asyncio debug mode when using +:func:`asyncio.run`. + +.. + +.. bpo: 41687 +.. date: 2020-09-01-15-57-51 +.. nonce: m1b1KA +.. section: Library + +Fix implementation of sendfile to be compatible with Solaris. + +.. + +.. bpo: 41662 +.. date: 2020-08-30-21-38-57 +.. nonce: 6e9iZn +.. section: Library + +No longer override exceptions raised in ``__len__()`` of a sequence of +parameters in :mod:`sqlite3` with :exc:`~sqlite3.ProgrammingError`. + +.. + +.. bpo: 39010 +.. date: 2020-08-30-10-24-26 +.. nonce: _mzXJW +.. section: Library + +Restarting a ``ProactorEventLoop`` on Windows no longer logs spurious +``ConnectionResetErrors``. + +.. + +.. bpo: 41638 +.. date: 2020-08-29-16-45-12 +.. nonce: iZfW5N +.. section: Library + +:exc:`~sqlite3.ProgrammingError` message for absent parameter in +:mod:`sqlite3` contains now the name of the parameter instead of its index +when parameters are supplied as a dict. + +.. + +.. bpo: 41662 +.. date: 2020-08-29-16-07-36 +.. nonce: Mn79zh +.. section: Library + +Fixed crash when mutate list of parameters during iteration in +:mod:`sqlite3`. + +.. + +.. bpo: 41513 +.. date: 2020-08-23-14-23-18 +.. nonce: DGqc_I +.. section: Library + +Improved the accuracy of math.hypot(). Internally, each step is computed +with extra precision so that the result is now almost always correctly +rounded. + +.. + +.. bpo: 41609 +.. date: 2020-08-21-15-51-15 +.. nonce: JmiUKG +.. section: Library + +The pdb whatis command correctly reports instance methods as 'Method' rather +than 'Function'. + +.. + +.. bpo: 39994 +.. date: 2020-08-15-18-17-21 +.. nonce: dOgPOh +.. section: Library + +Fixed pprint's handling of dict subclasses that override __repr__. + +.. + +.. bpo: 32751 +.. date: 2020-08-15-15-50-12 +.. nonce: 85je5X +.. section: Library + +When cancelling the task due to a timeout, :meth:`asyncio.wait_for` will now +wait until the cancellation is complete also in the case when *timeout* is +<= 0, like it does with positive timeouts. + +.. + +.. bpo: 37658 +.. date: 2020-08-15-15-21-40 +.. nonce: f9nivB +.. section: Library + +:meth:`asyncio.wait_for` now properly handles races between cancellation of +itself and the completion of the wrapped awaitable. + +.. + +.. bpo: 40782 +.. date: 2020-08-13-08-07-25 +.. nonce: aGZqmB +.. section: Library + +Change the method asyncio.AbstractEventLoop.run_in_executor to not be a +coroutine. + +.. + +.. bpo: 41520 +.. date: 2020-08-12-13-25-16 +.. nonce: BEUWa4 +.. section: Library + +Fix :mod:`codeop` regression that prevented turning compile warnings into +errors. + +.. + +.. bpo: 41528 +.. date: 2020-08-12-07-43-31 +.. nonce: bu83oD +.. section: Library + +turtle uses math module functions to convert degrees to radians and vice +versa and to calculate vector norm + +.. + +.. bpo: 41513 +.. date: 2020-08-09-18-16-05 +.. nonce: e6K6EK +.. section: Library + +Minor algorithmic improvement to math.hypot() and math.dist() giving small +gains in speed and accuracy. + +.. + +.. bpo: 41503 +.. date: 2020-08-07-15-18-16 +.. nonce: IYftcu +.. section: Library + +Fixed a race between setTarget and flush in logging.handlers.MemoryHandler. + +.. + +.. bpo: 41497 +.. date: 2020-08-07-06-06-29 +.. nonce: aBtsWz +.. section: Library + +Fix potential UnicodeDecodeError in dis module. + +.. + +.. bpo: 41467 +.. date: 2020-08-04-00-20-30 +.. nonce: Z8DgTL +.. section: Library + +On Windows, fix asyncio ``recv_into()`` return value when the socket/pipe is +closed (:exc:`BrokenPipeError`): return ``0`` rather than an empty byte +string (``b''``). + +.. + +.. bpo: 41425 +.. date: 2020-08-03-01-59-48 +.. nonce: KJo6zF +.. section: Library + +Make tkinter doc example runnable. + +.. + +.. bpo: 41421 +.. date: 2020-08-01-00-51-15 +.. nonce: dHKRVB +.. section: Library + +Make an algebraic simplification to random.paretovariate(). It now is +slightly less subject to round-off error and is slightly faster. Inputs that +used to cause ZeroDivisionError now cause an OverflowError instead. + +.. + +.. bpo: 41440 +.. date: 2020-07-30-14-56-58 +.. nonce: rju34k +.. section: Library + +Add :func:`os.cpu_count()` support for VxWorks RTOS. + +.. + +.. bpo: 41316 +.. date: 2020-07-28-12-08-58 +.. nonce: bSCbK4 +.. section: Library + +Fix the :mod:`tarfile` module to write only basename of TAR file to GZIP +compression header. + +.. + +.. bpo: 41384 +.. date: 2020-07-26-21-18-43 +.. nonce: MlzIgV +.. section: Library + +Raise TclError instead of TypeError when an unknown option is passed to +tkinter.OptionMenu. + +.. + +.. bpo: 41317 +.. date: 2020-07-23-01-18-34 +.. nonce: O17Z6x +.. section: Library + +Use add_done_callback() in asyncio.loop.sock_accept() to unsubscribe reader +early on cancellation. + +.. + +.. bpo: 41364 +.. date: 2020-07-21-21-45-55 +.. nonce: 5O-k7A +.. section: Library + +Reduce import overhead of :mod:`uuid`. + +.. + +.. bpo: 35328 +.. date: 2020-07-21-16-20-55 +.. nonce: jXovHb +.. section: Library + +Set the environment variable ``VIRTUAL_ENV_PROMPT`` at :mod:`venv` +activation. + +.. + +.. bpo: 41341 +.. date: 2020-07-20-19-13-17 +.. nonce: wqrj8C +.. section: Library + +Recursive evaluation of `typing.ForwardRef` in `get_type_hints`. + +.. + +.. bpo: 41344 +.. date: 2020-07-20-13-27-48 +.. nonce: iKipNd +.. section: Library + +Prevent creating :class:`shared_memory.SharedMemory` objects with +:code:`size=0`. + +.. + +.. bpo: 41333 +.. date: 2020-07-18-18-07-40 +.. nonce: upkHIm +.. section: Library + +:meth:`collections.OrderedDict.pop` is now 2 times faster. + +.. + +.. bpo: 41288 +.. date: 2020-07-13-15-06-35 +.. nonce: 8mn5P- +.. section: Library + +Unpickling invalid NEWOBJ_EX opcode with the C implementation raises now +UnpicklingError instead of crashing. + +.. + +.. bpo: 39017 +.. date: 2020-07-12-22-16-58 +.. nonce: x3Cg-9 +.. section: Library + +Avoid infinite loop when reading specially crafted TAR files using the +tarfile module (CVE-2019-20907). + +.. + +.. bpo: 41273 +.. date: 2020-07-11-00-15-01 +.. nonce: SVrsJh +.. section: Library + +Speed up any transport using ``_ProactorReadPipeTransport`` by calling +``recv_into`` instead of ``recv``, thus not creating a new buffer for each +``recv`` call in the transport's read loop. + +.. + +.. bpo: 41235 +.. date: 2020-07-07-21-56-26 +.. nonce: H2csMU +.. section: Library + +Fix the error handling in :meth:`ssl.SSLContext.load_dh_params`. + +.. + +.. bpo: 41207 +.. date: 2020-07-06-16-58-53 +.. nonce: Emw7Nk +.. section: Library + +In distutils.spawn, restore expectation that DistutilsExecError is raised +when the command is not found. + +.. + +.. bpo: 29727 +.. date: 2020-07-05-19-16-02 +.. nonce: Q6Z2rg +.. section: Library + +Register :class:`array.array` as a +:class:`~collections.abc.MutableSequence`. Patch by Pablo Galindo. + +.. + +.. bpo: 39168 +.. date: 2020-07-04-21-56-46 +.. nonce: DQWsXj +.. section: Library + +Remove the ``__new__`` method of :class:`typing.Generic`. + +.. + +.. bpo: 41194 +.. date: 2020-07-03-13-15-08 +.. nonce: djrKjs +.. section: Library + +Fix a crash in the ``_ast`` module: it can no longer be loaded more than +once. It now uses a global state rather than a module state. + +.. + +.. bpo: 41195 +.. date: 2020-07-02-15-03-04 +.. nonce: cEnpO3 +.. section: Library + +Add read-only ssl.SSLContext.security_level attribute to retrieve the +context's security level. + +.. + +.. bpo: 41193 +.. date: 2020-07-02-11-53-45 +.. nonce: 8-Tnql +.. section: Library + +The ``write_history()`` atexit function of the readline completer now +ignores any :exc:`OSError` to ignore error if the filesystem is read-only, +instead of only ignoring :exc:`FileNotFoundError` and +:exc:`PermissionError`. + +.. + +.. bpo: 41182 +.. date: 2020-07-01-17-33-50 +.. nonce: FPFI0N +.. section: Library + +selector: use DefaultSelector based upon implementation + +.. + +.. bpo: 41161 +.. date: 2020-06-30-20-50-51 +.. nonce: QTdJjz +.. section: Library + +The decimal module now requires libmpdec-2.5.0. Users of +--with-system-libmpdec should update their system library. + +.. + +.. bpo: 40874 +.. date: 2020-06-28-21-16-51 +.. nonce: YImvzA +.. section: Library + +The decimal module now requires libmpdec-2.5.0. + +.. + +.. bpo: 41138 +.. date: 2020-06-27-13-51-36 +.. nonce: bIpf7g +.. section: Library + +Fixed the :mod:`trace` module CLI for Python source files with non-UTF-8 +encoding. + +.. + +.. bpo: 31082 +.. date: 2020-06-25-10-11-47 +.. nonce: HsgDkx +.. section: Library + +Use the term "iterable" in the docstring for :func:`functools.reduce`. + +.. + +.. bpo: 40521 +.. date: 2020-06-23-06-09-59 +.. nonce: HUfxP7 +.. section: Library + +Remove freelist from collections.deque(). + +.. + +.. bpo: 31938 +.. date: 2020-06-22-20-08-40 +.. nonce: EVuko9 +.. section: Library + +Fix default-value signatures of several functions in the :mod:`select` +module - by Anthony Sottile. + +.. + +.. bpo: 41068 +.. date: 2020-06-22-10-25-39 +.. nonce: _bX2BW +.. section: Library + +Fixed reading files with non-ASCII names from ZIP archive directly after +writing them. + +.. + +.. bpo: 41058 +.. date: 2020-06-20-21-03-55 +.. nonce: gztdZy +.. section: Library + +:func:`pdb.find_function` now correctly determines the source file encoding. + +.. + +.. bpo: 41056 +.. date: 2020-06-20-18-37-29 +.. nonce: d9v_uL +.. section: Library + +Invalid file descriptor values are now prevented from being passed to +os.fpathconf. (discovered by Coverity) + +.. + +.. bpo: 41056 +.. date: 2020-06-20-18-35-43 +.. nonce: Garcle +.. section: Library + +Fix a NULL pointer dereference within the ssl module during a MemoryError in +the keylog callback. (discovered by Coverity) + +.. + +.. bpo: 41056 +.. date: 2020-06-20-18-33-03 +.. nonce: gTH4Bq +.. section: Library + +Fixed an instance where a MemoryError within the zoneinfo module might not +be reported or not reported at its source. (found by Coverity) + +.. + +.. bpo: 41048 +.. date: 2020-06-20-10-16-57 +.. nonce: hEXB-B +.. section: Library + +:func:`mimetypes.read_mime_types` function reads the rule file using UTF-8 +encoding, not the locale encoding. Patch by Srinivas Reddy Thatiparthy. + +.. + +.. bpo: 41043 +.. date: 2020-06-20-00-19-30 +.. nonce: p-Pk-H +.. section: Library + +Fixed the use of :func:`~glob.glob` in the stdlib: literal part of the path +is now always correctly escaped. + +.. + +.. bpo: 41025 +.. date: 2020-06-18-10-34-59 +.. nonce: elf_nz +.. section: Library + +Fixed an issue preventing the C implementation of :class:`zoneinfo.ZoneInfo` +from being subclassed. + +.. + +.. bpo: 35018 +.. date: 2020-06-17-23-49-45 +.. nonce: NP5_Qk +.. section: Library + +Add the :class:`xml.sax.handler.LexicalHandler` class that is present in +other SAX XML implementations. + +.. + +.. bpo: 41002 +.. date: 2020-06-17-17-26-24 +.. nonce: NPBItE +.. section: Library + +Improve performance of HTTPResponse.read with a given amount. Patch by Bruce +Merry. + +.. + +.. bpo: 40448 +.. date: 2020-06-15-12-22-53 +.. nonce: 1dk8Bu +.. section: Library + +:mod:`ensurepip` now disables the use of `pip` cache when installing the +bundled versions of `pip` and `setuptools`. Patch by Krzysztof Konopko. + +.. + +.. bpo: 40967 +.. date: 2020-06-15-00-13-57 +.. nonce: _dx3OO +.. section: Library + +Removed :meth:`asyncio.Task.current_task` and +:meth:`asyncio.Task.all_tasks`. Patch contributed by Rémi Lapeyre. + +.. + +.. bpo: 40924 +.. date: 2020-06-13-12-04-50 +.. nonce: SM_luS +.. section: Library + +Ensure ``importlib.resources.path`` returns an extant path for the +SourceFileLoader's resource reader. Avoids the regression identified in +master while a long-term solution is devised. + +.. + +.. bpo: 40955 +.. date: 2020-06-12-11-55-30 +.. nonce: huixCg +.. section: Library + +Fix a minor memory leak in :mod:`subprocess` module when extra_groups was +specified. + +.. + +.. bpo: 40855 +.. date: 2020-06-12-10-44-15 +.. nonce: jSot83 +.. section: Library + +The standard deviation and variance functions in the statistics module were +ignoring their mu and xbar arguments. + +.. + +.. bpo: 40939 +.. date: 2020-06-11-11-07-10 +.. nonce: -D5Asl +.. section: Library + +Use the new PEG parser when generating the stdlib :mod:`keyword` module. + +.. + +.. bpo: 23427 +.. date: 2020-06-08-18-59-16 +.. nonce: ilg1Cz +.. section: Library + +Add :data:`sys.orig_argv` attribute: the list of the original command line +arguments passed to the Python executable. + +.. + +.. bpo: 33689 +.. date: 2020-06-06-14-09-55 +.. nonce: EFUDH7 +.. section: Library + +Ignore empty or whitespace-only lines in .pth files. This matches the +documentated behavior. Before, empty lines caused the site-packages dir to +appear multiple times in sys.path. By Ido Michael, contributors Malcolm +Smith and Tal Einat. + +.. + +.. bpo: 40884 +.. date: 2020-06-06-02-42-26 +.. nonce: n7fOwS +.. section: Library + +Added a `defaults` parameter to :class:`logging.Formatter`, to allow +specifying default values for custom fields. Patch by Asaf Alon and Bar +Harel. + +.. + +.. bpo: 40876 +.. date: 2020-06-05-20-00-18 +.. nonce: zDhiZj +.. section: Library + +Clarify error message in the :mod:`csv` module. + +.. + +.. bpo: 39791 +.. date: 2020-06-05-19-29-10 +.. nonce: _CcO3d +.. section: Library + +Refresh importlib.metadata from importlib_metadata 1.6.1. + +.. + +.. bpo: 40807 +.. date: 2020-06-04-16-25-15 +.. nonce: yYyLWx +.. section: Library + +Stop codeop._maybe_compile, used by code.InteractiveInterpreter (and IDLE). +from emitting each warning three times. + +.. + +.. bpo: 32604 +.. date: 2020-06-02-23-49-07 +.. nonce: ZN4V4l +.. section: Library + +Fix reference leak in the :mod:`select` module when the module is imported +in a subinterpreter. + +.. + +.. bpo: 39791 +.. date: 2020-06-02-02-16-02 +.. nonce: StCJlA +.. section: Library + +Built-in loaders (SourceFileLoader and ZipImporter) now supply +``TraversableResources`` implementations for ``ResourceReader``, and the +fallback function has been removed. + +.. + +.. bpo: 39314 +.. date: 2020-06-01-02-16-29 +.. nonce: 0T9hlA +.. section: Library + +:class:`rlcompleter.Completer` and the standard Python shell now close the +parenthesis for functions that take no arguments. Patch contributed by Rémi +Lapeyre. + +.. + +.. bpo: 17005 +.. date: 2020-05-31-23-32-36 +.. nonce: JlRUGB +.. section: Library + +The topological sort functionality that was introduced initially in the +:mod:`functools` module has been moved to a new :mod:`graphlib` module to +better accommodate the new tools and keep the original scope of the +:mod:`functools` module. Patch by Pablo Galindo + +.. + +.. bpo: 40834 +.. date: 2020-05-31-15-52-18 +.. nonce: MO9_hb +.. section: Library + +Fix truncate when sending str object with_xxsubinterpreters.channel_send. + +.. + +.. bpo: 40755 +.. date: 2020-05-30-18-48-58 +.. nonce: IyOe2J +.. section: Library + +Add rich comparisons to collections.Counter(). + +.. + +.. bpo: 26407 +.. date: 2020-05-30-14-19-47 +.. nonce: MjWLO1 +.. section: Library + +Unexpected errors in calling the ``__iter__`` method are no longer masked by +``TypeError`` in :func:`csv.reader`, :func:`csv.writer.writerow` and +:meth:`csv.writer.writerows`. + +.. + +.. bpo: 39384 +.. date: 2020-05-30-12-44-29 +.. nonce: Iqxy3q +.. section: Library + +Fixed email.contentmanager to allow set_content() to set a null string. + +.. + +.. bpo: 40744 +.. date: 2020-05-30-08-10-23 +.. nonce: jKURVV +.. section: Library + +The :mod:`sqlite3` module uses SQLite API functions that require SQLite +v3.7.3 or higher. This patch removes support for older SQLite versions, and +explicitly requires SQLite 3.7.3 both at build, compile and runtime. Patch +by Sergey Fedoseev and Erlend E. Aasland. + +.. + +.. bpo: 40777 +.. date: 2020-05-28-17-32-29 +.. nonce: 1kJU6N +.. section: Library + +Initialize PyDateTime_IsoCalendarDateType.tp_base at run-time to avoid +errors on some compilers. + +.. + +.. bpo: 38488 +.. date: 2020-05-28-16-51-00 +.. nonce: hFQNgA +.. section: Library + +Update ensurepip to install pip 20.1.1 and setuptools 47.1.0. + +.. + +.. bpo: 40792 +.. date: 2020-05-27-22-19-42 +.. nonce: 87Yx01 +.. section: Library + +The result of :func:`operator.index` now always has exact type :class:`int`. +Previously, the result could have been an instance of a subclass of ``int``. + +.. + +.. bpo: 40767 +.. date: 2020-05-27-21-27-01 +.. nonce: L5MnVV +.. section: Library + +:mod:`webbrowser` now properly finds the default browser in pure Wayland +systems by checking the WAYLAND_DISPLAY environment variable. Patch +contributed by Jérémy Attali. + +.. + +.. bpo: 40791 +.. date: 2020-05-27-18-04-52 +.. nonce: IzpNor +.. section: Library + +:func:`hashlib.compare_digest` uses OpenSSL's ``CRYPTO_memcmp()`` function +when OpenSSL is available. + +.. + +.. bpo: 40795 +.. date: 2020-05-27-17-00-18 +.. nonce: eZSnHA +.. section: Library + +:mod:`ctypes` module: If ctypes fails to convert the result of a callback or +if a ctypes callback function raises an exception, sys.unraisablehook is now +called with an exception set. Previously, the error was logged into stderr +by :c:func:`PyErr_Print`. + +.. + +.. bpo: 16995 +.. date: 2020-05-27-00-09-52 +.. nonce: 4niOT7 +.. section: Library + +Add :func:`base64.b32hexencode` and :func:`base64.b32hexdecode` to support +the Base32 Encoding with Extended Hex Alphabet. + +.. + +.. bpo: 30008 +.. date: 2020-05-25-22-18-38 +.. nonce: CKC3td +.. section: Library + +Fix :mod:`ssl` code to be compatible with OpenSSL 1.1.x builds that use +``no-deprecated`` and ``--api=1.1.0``. + +.. + +.. bpo: 30064 +.. date: 2020-05-25-11-52-23 +.. nonce: 6CICsH +.. section: Library + +Fix asyncio ``loop.sock_*`` race condition issue + +.. + +.. bpo: 40759 +.. date: 2020-05-24-23-52-35 +.. nonce: DdZdaw +.. section: Library + +Deprecate the :mod:`symbol` module. + +.. + +.. bpo: 40756 +.. date: 2020-05-24-11-06-37 +.. nonce: 7ZH83z +.. section: Library + +The second argument (extra) of ``LoggerAdapter.__init__`` now defaults to +None. + +.. + +.. bpo: 37129 +.. date: 2020-05-23-04-18-00 +.. nonce: YoYoYo +.. section: Library + +Add a new :data:`os.RWF_APPEND` flag for :func:`os.pwritev`. + +.. + +.. bpo: 40737 +.. date: 2020-05-23-00-22-11 +.. nonce: iph-CM +.. section: Library + +Fix possible reference leak for :mod:`sqlite3` initialization. + +.. + +.. bpo: 40726 +.. date: 2020-05-22-12-45-58 +.. nonce: 7oBdMw +.. section: Library + +Handle cases where the ``end_lineno`` is ``None`` on +:func:`ast.increment_lineno`. + +.. + +.. bpo: 40698 +.. date: 2020-05-20-14-38-04 +.. nonce: zwl5Hc +.. section: Library + +:mod:`distutils` upload creates SHA2-256 and Blake2b-256 digests. MD5 +digests is skipped if platform blocks MD5. + +.. + +.. bpo: 40695 +.. date: 2020-05-20-13-03-28 +.. nonce: lr4aIS +.. section: Library + +:mod:`hashlib` no longer falls back to builtin hash implementations when +OpenSSL provides a hash digest and the algorithm is blocked by security +policy. + +.. + +.. bpo: 9216 +.. date: 2020-05-20-12-53-20 +.. nonce: ps7Yf1 +.. section: Library + +func:`hashlib.new` passed ``usedforsecurity`` to OpenSSL EVP constructor +``_hashlib.new()``. test_hashlib and test_smtplib handle strict security +policy better. + +.. + +.. bpo: 40614 +.. date: 2020-05-18-22-41-02 +.. nonce: 8j3kmq +.. section: Library + +:func:`ast.parse` will not parse self documenting expressions in f-strings +when passed ``feature_version`` is less than ``(3, 8)``. + +.. + +.. bpo: 40626 +.. date: 2020-05-18-17-29-30 +.. nonce: NeZufF +.. section: Library + +Add h5 file extension as MIME Type application/x-hdf5, as per HDF Group +recommendation for HDF5 formatted data files. Patch contributed by Mark +Schwab. + +.. + +.. bpo: 25920 +.. date: 2020-05-18-15-38-25 +.. nonce: PxrLY8 +.. section: Library + +On macOS, when building Python for macOS 10.4 and older, which wasn't the +case for python.org macOS installer, :func:`socket.getaddrinfo` no longer +uses an internal lock to prevent race conditions when calling +``getaddrinfo()`` which is thread-safe since macOS 10.5. Python 3.9 requires +macOS 10.6 or newer. The internal lock caused random hang on fork when +another thread was calling :func:`socket.getaddrinfo`. The lock was also +used on FreeBSD older than 5.3, OpenBSD older than 201311 and NetBSD older +than 4. + +.. + +.. bpo: 40671 +.. date: 2020-05-18-15-26-31 +.. nonce: NeZ9Cy +.. section: Library + +Prepare ``_hashlib`` for :pep:`489` and use :c:func:`PyModule_AddType`. + +.. + +.. bpo: 32309 +.. date: 2020-05-17-02-03-09 +.. nonce: KM9psl +.. section: Library + +Added a new :term:`coroutine` :func:`asyncio.to_thread`. It is mainly used +for running IO-bound functions in a separate thread to avoid blocking the +event loop, and essentially works as a high-level version of +:meth:`~asyncio.loop.run_in_executor` that can directly take keyword +arguments. + +.. + +.. bpo: 36543 +.. date: 2020-05-15-21-14-45 +.. nonce: Jt-eSX +.. section: Library + +Restored the deprecated :mod:`xml.etree.cElementTree` module. + +.. + +.. bpo: 40611 +.. date: 2020-05-13-16-28-33 +.. nonce: ZCk0_c +.. section: Library + +:data:`~mmap.MAP_POPULATE` constant has now been added to the list of +exported :mod:`mmap` module flags. + +.. + +.. bpo: 39881 +.. date: 2020-05-07-22-00-12 +.. nonce: E1xsNv +.. section: Library + +PEP 554 for use in the test suite. (Patch By Joannah Nanjekye) + +.. + +.. bpo: 13097 +.. date: 2020-05-06-02-01-25 +.. nonce: Wh5xSK +.. section: Library + +``ctypes`` now raises an ``ArgumentError`` when a callback is invoked with +more than 1024 arguments. + +.. + +.. bpo: 39385 +.. date: 2020-04-23-18-21-19 +.. nonce: MIAyS7 +.. section: Library + +A new test assertion context-manager, :func:`unittest.assertNoLogs` will +ensure a given block of code emits no log messages using the logging module. +Contributed by Kit Yan Choi. + +.. + +.. bpo: 23082 +.. date: 2020-04-20-22-08-36 +.. nonce: iX90Id +.. section: Library + +Updated the error message and docs of PurePath.relative_to() to better +reflect the function behaviour. + +.. + +.. bpo: 40318 +.. date: 2020-04-18-14-16-02 +.. nonce: K2UdRx +.. section: Library + +Use SQLite3 trace v2 API, if it is available. + +.. + +.. bpo: 40105 +.. date: 2020-04-03-16-13-59 +.. nonce: hfM2c0 +.. section: Library + +ZipFile truncates files to avoid corruption when a shorter comment is +provided in append ("a") mode. Patch by Jan Mazur. + +.. + +.. bpo: 40084 +.. date: 2020-03-29-21-32-00 +.. nonce: MCYwcv +.. section: Library + +Fix ``Enum.__dir__``: dir(Enum.member) now includes attributes as well as +methods. + +.. + +.. bpo: 31122 +.. date: 2020-03-11-07-44-06 +.. nonce: zIQ80l +.. section: Library + +ssl.wrap_socket() now raises ssl.SSLEOFError rather than OSError when peer +closes connection during TLS negotiation + +.. + +.. bpo: 39728 +.. date: 2020-02-24-10-58-34 +.. nonce: kOOaHn +.. section: Library + +fix default `_missing_` so a duplicate `ValueError` is not set as the +`__context__` of the original `ValueError` + +.. + +.. bpo: 39244 +.. date: 2020-02-23-15-09-47 +.. nonce: aBK5IM +.. section: Library + +Fixed :class:`multiprocessing.context.get_all_start_methods` to properly +return the default method first on macOS. + +.. + +.. bpo: 39040 +.. date: 2019-12-15-18-47-20 +.. nonce: tKa0Qs +.. section: Library + +Fix parsing of invalid mime headers parameters by collapsing whitespace +between encoded words in a bare-quote-string. + +.. + +.. bpo: 38731 +.. date: 2019-11-13-07-37-11 +.. nonce: 9qmcSx +.. section: Library + +Add ``--quiet`` option to command-line interface of :mod:`py_compile`. Patch +by Gregory Schevchenko. + +.. + +.. bpo: 35714 +.. date: 2019-10-25-23-45-49 +.. nonce: fw3xb7 +.. section: Library + +:exc:`struct.error` is now raised if there is a null character in a +:mod:`struct` format string. + +.. + +.. bpo: 38144 +.. date: 2019-09-12-21-34-03 +.. nonce: 8uQCdd +.. section: Library + +Added the *root_dir* and *dir_fd* parameters in :func:`glob.glob`. + +.. + +.. bpo: 26543 +.. date: 2019-08-11-16-28-03 +.. nonce: X-TJZO +.. section: Library + +Fix :meth:`IMAP4.noop()` when debug mode is enabled (ex: ``imaplib.Debug = +3``). + +.. + +.. bpo: 12178 +.. date: 2019-05-31-23-54-28 +.. nonce: N6FLCZ +.. section: Library + +:func:`csv.writer` now correctly escapes *escapechar* when input contains +*escapechar*. Patch by Catalin Iacob, Berker Peksag, and Itay Elbirt. + +.. + +.. bpo: 36290 +.. date: 2019-03-17-19-01-53 +.. nonce: 7VXo_K +.. section: Library + +AST nodes are now raising :exc:`TypeError` on conflicting keyword arguments. +Patch contributed by Rémi Lapeyre. + +.. + +.. bpo: 33944 +.. date: 2019-03-01-01-56-23 +.. nonce: -82Pkt +.. section: Library + +Added site.py site-packages tracing in verbose mode. + +.. + +.. bpo: 35078 +.. date: 2018-10-27-09-37-03 +.. nonce: kweA3R +.. section: Library + +Refactor formatweekday, formatmonthname methods in LocaleHTMLCalendar and +LocaleTextCalendar classes in calendar module to call the base class +methods.This enables customizable CSS classes for LocaleHTMLCalendar. Patch +by Srinivas Reddy Thatiparthy + +.. + +.. bpo: 29620 +.. date: 2018-08-21-16-20-33 +.. nonce: xxx666 +.. section: Library + +:func:`~unittest.TestCase.assertWarns` no longer raises a +``RuntimeException`` when accessing a module's ``__warningregistry__`` +causes importation of a new module, or when a new module is imported in +another thread. Patch by Kernc. + +.. + +.. bpo: 31844 +.. date: 2018-07-30-12-48-17 +.. nonce: 0_GKsD +.. section: Library + +Remove ``ParserBase.error()`` method from the private and undocumented +``_markupbase`` module. :class:`html.parser.HTMLParser` is the only +subclass of ``ParserBase`` and its ``error()`` implementation was deprecated +in Python 3.4 and removed in Python 3.5. + +.. + +.. bpo: 34226 +.. date: 2018-07-29-12-14-54 +.. nonce: BE7zbu +.. section: Library + +Fix `cgi.parse_multipart` without content_length. Patch by Roger Duran + +.. + +.. bpo: 33660 +.. date: 2018-06-12-23-30-41 +.. nonce: AdDn5Z +.. section: Library + +Fix pathlib.PosixPath to resolve a relative path located on the root +directory properly. + +.. + +.. bpo: 28557 +.. date: 2018-06-07-22-04-01 +.. nonce: ViNJnK +.. section: Library + +Improve the error message for a misbehaving ``rawio.readinto`` + +.. + +.. bpo: 26680 +.. date: 2018-03-15-11-56-48 +.. nonce: Udkhn4 +.. section: Library + +The d.is_integer() method is added to the Decimal type, for compatibility +with other number types. + +.. + +.. bpo: 26680 +.. date: 2018-03-15-11-55-04 +.. nonce: eKAi85 +.. section: Library + +The x.is_integer() method is incorporated into the abstract types of the +numeric tower, Real, Rational and Integral, with appropriate default +implementations. + +.. + +.. bpo: 41428 +.. date: 2020-10-03-18-20-46 +.. nonce: _ju1NE +.. section: Documentation + +Add documentation for :pep:`604` (Allow writing union types as ``X | Y``). + +.. + +.. bpo: 41774 +.. date: 2020-09-24-15-35-13 +.. nonce: 5IqdGP +.. section: Documentation + +In Programming FAQ "Sequences (Tuples/Lists)" section, add "How do you +remove multiple items from a list". + +.. + +.. bpo: 35293 +.. date: 2020-09-12-17-37-13 +.. nonce: _cOwPD +.. section: Documentation + +Fix RemovedInSphinx40Warning when building the documentation. Patch by +Dong-hee Na. + +.. + +.. bpo: 37149 +.. date: 2020-09-10-07-48-02 +.. nonce: VD0rCv +.. section: Documentation + +Change Shipman tkinter doc link from archive.org to TkDocs. (The doc has +been removed from the NMT server.) The new link responds much faster and +includes a short explanatory note. + +.. + +.. bpo: 41726 +.. date: 2020-09-08-16-57-09 +.. nonce: g0UXrn +.. section: Documentation + +Update the refcounts info of ``PyType_FromModuleAndSpec``. + +.. + +.. bpo: 41624 +.. date: 2020-08-25-15-11-23 +.. nonce: ddjJlN +.. section: Documentation + +Fix the signature of :class:`typing.Coroutine`. + +.. + +.. bpo: 40204 +.. date: 2020-08-12-18-35-40 +.. nonce: C8A_pe +.. section: Documentation + +Enable Sphinx 3.2 ``c_allow_pre_v3`` option and disable +``c_warn_on_allowed_pre_v3`` option to make the documentation compatible +with Sphinx 2 and Sphinx 3. + +.. + +.. bpo: 41045 +.. date: 2020-07-27-20-46-17 +.. nonce: GFF6Ul +.. section: Documentation + +Add documentation for debug feature of f-strings. + +.. + +.. bpo: 41314 +.. date: 2020-07-25-14-20-00 +.. nonce: yrjko0 +.. section: Documentation + +Changed the release when ``from __future__ import annotations`` becomes the +default from ``4.0`` to ``3.10`` (following a change in PEP 563). + +.. + +.. bpo: 40979 +.. date: 2020-07-21-15-23-30 +.. nonce: pLA8rO +.. section: Documentation + +Refactored typing.rst, arranging more than 70 classes, functions, and +decorators into new sub-sections. + +.. + +.. bpo: 40552 +.. date: 2020-05-09-12-10-31 +.. nonce: _0uB73 +.. section: Documentation + +Fix in tutorial section 4.2. Code snippet is now correct. + +.. + +.. bpo: 39883 +.. date: 2020-03-07-03-53-39 +.. nonce: 1tnb4- +.. section: Documentation + +Make code, examples, and recipes in the Python documentation be licensed +under the more permissive BSD0 license in addition to the existing Python +2.0 license. + +.. + +.. bpo: 37703 +.. date: 2019-08-16-20-25-42 +.. nonce: Qm_l_H +.. section: Documentation + +Updated Documentation to comprehensively elaborate on the behaviour of +gather.cancel() + +.. + +.. bpo: 41939 +.. date: 2020-10-05-09-37-43 +.. nonce: P4OlbA +.. section: Tests + +Fix test_site.test_license_exists_at_url(): call +``urllib.request.urlcleanup()`` to reset the global +``urllib.request._opener``. Patch by Victor Stinner. + +.. + +.. bpo: 41731 +.. date: 2020-09-11-19-12-31 +.. nonce: Ivxh4U +.. section: Tests + +Make test_cmd_line_script pass with option '-vv'. + +.. + +.. bpo: 41602 +.. date: 2020-08-25-19-25-36 +.. nonce: Z64s0I +.. section: Tests + +Add tests for SIGINT handling in the runpy module. + +.. + +.. bpo: 41521 +.. date: 2020-08-11-14-59-13 +.. nonce: w2UYK7 +.. section: Tests + +:mod:`test.support`: Rename ``blacklist`` parameter of +:func:`~test.support.check__all__` to ``not_exported``. + +.. + +.. bpo: 41477 +.. date: 2020-08-07-17-28-49 +.. nonce: GrFexU +.. section: Tests + +Make ctypes optional in test_genericalias. + +.. + +.. bpo: 41085 +.. date: 2020-06-23-12-02-45 +.. nonce: JZKsyz +.. section: Tests + +Fix integer overflow in the :meth:`array.array.index` method on 64-bit +Windows for index larger than ``2**31``. + +.. + +.. bpo: 41069 +.. date: 2020-06-22-00-21-12 +.. nonce: bLZkX- +.. section: Tests + +:data:`test.support.TESTFN` and the current directory for tests when run via +``test.regrtest`` contain now non-ascii characters if possible. + +.. + +.. bpo: 38377 +.. date: 2020-06-17-18-00-21 +.. nonce: jfg4TH +.. section: Tests + +On Linux, skip tests using multiprocessing if the current user cannot create +a file in ``/dev/shm/`` directory. Add the +:func:`~test.support.skip_if_broken_multiprocessing_synchronize` function to +the :mod:`test.support` module. + +.. + +.. bpo: 41009 +.. date: 2020-06-17-17-27-07 +.. nonce: Rvn6OQ +.. section: Tests + +Fix use of ``support.require_{linux|mac|freebsd}_version()`` decorators as +class decorator. + +.. + +.. bpo: 41003 +.. date: 2020-06-17-15-07-14 +.. nonce: tiH_Fy +.. section: Tests + +Fix ``test_copyreg`` when ``numpy`` is installed: ``test.pickletester`` now +saves/restores warnings filters when importing ``numpy``, to ignore filters +installed by ``numpy``. + +.. + +.. bpo: 40964 +.. date: 2020-06-12-20-46-23 +.. nonce: OBzf2c +.. section: Tests + +Disable remote :mod:`imaplib` tests, host cyrus.andrew.cmu.edu is blocking +incoming connections. + +.. + +.. bpo: 40927 +.. date: 2020-06-09-18-48-18 +.. nonce: 67ylLg +.. section: Tests + +Fix test_binhex when run twice: it now uses import_fresh_module() to ensure +that it raises DeprecationWarning each time. + +.. + +.. bpo: 17258 +.. date: 2020-05-26-07-53-31 +.. nonce: X_IKTQ +.. section: Tests + +Skip some :mod:`multiprocessing` tests when MD5 hash digest is blocked. + +.. + +.. bpo: 31904 +.. date: 2020-04-09-15-40-03 +.. nonce: TJ4k3d +.. section: Tests + +Increase LOOPBACK_TIMEOUT to 10 for VxWorks RTOS. + +.. + +.. bpo: 38169 +.. date: 2019-09-14-13-20-27 +.. nonce: hurq4B +.. section: Tests + +Increase code coverage for SharedMemory and ShareableList + +.. + +.. bpo: 34401 +.. date: 2018-08-20-09-38-52 +.. nonce: eGxMPm +.. section: Tests + +Make test_gdb properly run on HP-UX. Patch by Michael Osipov. + +.. + +.. bpo: 38249 +.. date: 2020-09-28-21-56-51 +.. nonce: uzMCaZ +.. section: Build + +Update :c:macro:`Py_UNREACHABLE` to use __builtin_unreachable() if only the +compiler is able to use it. Patch by Dong-hee Na. + +.. + +.. bpo: 41617 +.. date: 2020-08-24-18-34-01 +.. nonce: sKKXz7 +.. section: Build + +Fix ``pycore_bitutils.h`` header file to support old clang versions: +``__builtin_bswap16()`` is not available in LLVM clang 3.0. + +.. + +.. bpo: 40204 +.. date: 2020-06-25-06-59-13 +.. nonce: GpD04D +.. section: Build + +Pin Sphinx version to 2.3.1 in ``Doc/Makefile``. + +.. + +.. bpo: 36020 +.. date: 2020-06-15-22-14-25 +.. nonce: wbiv0P +.. section: Build + +The C99 functions :c:func:`snprintf` and :c:func:`vsnprintf` are now +required to build Python. + +.. + +.. bpo: 40684 +.. date: 2020-06-08-19-57-05 +.. nonce: WIY2-i +.. section: Build + +``make install`` now uses the ``PLATLIBDIR`` variable for the destination +``lib-dynload/`` directory when ``./configure --with-platlibdir`` is used. + +.. + +.. bpo: 40683 +.. date: 2020-05-19-10-54-08 +.. nonce: W8JHrr +.. section: Build + +Fixed an issue where the :mod:`zoneinfo` module and its tests were not +included when Python is installed with ``make``. + +.. + +.. bpo: 41744 +.. date: 2020-09-11-17-59-33 +.. nonce: e_ugDQ +.. section: Windows + +Fixes automatic import of props file when using the Nuget package. + +.. + +.. bpo: 41627 +.. date: 2020-09-04-21-35-28 +.. nonce: sx2KN1 +.. section: Windows + +The user site directory for 32-bit now includes a ``-32`` suffix to +distinguish it from the 64-bit interpreter's directory. + +.. + +.. bpo: 41526 +.. date: 2020-08-13-22-40-58 +.. nonce: -i2bwb +.. section: Windows + +Fixed layout of final page of the installer by removing the special thanks +to Mark Hammond (with his permission). + +.. + +.. bpo: 41492 +.. date: 2020-08-06-16-59-10 +.. nonce: 2FQ9cM +.. section: Windows + +Fixes the description that appears in UAC prompts. + +.. + +.. bpo: 40948 +.. date: 2020-07-28-12-39-32 +.. nonce: ISUFO6 +.. section: Windows + +Improve post-install message to direct people to the "py" command. + +.. + +.. bpo: 41412 +.. date: 2020-07-28-11-55-43 +.. nonce: ME20KB +.. section: Windows + +The installer will now fail to install on Windows 7 and Windows 8. Further, +the UCRT dependency is now always downloaded on demand. + +.. + +.. bpo: 40741 +.. date: 2020-07-20-23-26-26 +.. nonce: C9sc_d +.. section: Windows + +Update Windows release to include SQLite 3.32.3. + +.. + +.. bpo: 41142 +.. date: 2020-06-28-12-40-41 +.. nonce: jpZzzh +.. section: Windows + +:mod:`msilib` now supports creating CAB files with non-ASCII file path and +adding files with non-ASCII file path to them. + +.. + +.. bpo: 41074 +.. date: 2020-06-24-21-30-42 +.. nonce: gaQc3C +.. section: Windows + +Fixed support of non-ASCII names in functions :func:`msilib.OpenDatabase` +and :func:`msilib.init_database` and non-ASCII SQL in method +:meth:`msilib.Database.OpenView`. + +.. + +.. bpo: 41039 +.. date: 2020-06-23-03-12-57 +.. nonce: 0hgd0s +.. section: Windows + +Stable ABI redirection DLL (python3.dll) now uses ``#pragma +comment(linker)`` for re-exporting. + +.. + +.. bpo: 40164 +.. date: 2020-06-12-13-13-44 +.. nonce: SPrSn5 +.. section: Windows + +Updates Windows OpenSSL to 1.1.1g + +.. + +.. bpo: 39631 +.. date: 2020-05-19-14-43-33 +.. nonce: Z5yXam +.. section: Windows + +Changes the registered MIME type for ``.py`` files on Windows to +``text/x-python`` instead of ``text/plain``. + +.. + +.. bpo: 40677 +.. date: 2020-05-19-04-11-12 +.. nonce: qQbLW8 +.. section: Windows + +Manually define IO_REPARSE_TAG_APPEXECLINK in case some old Windows SDK +doesn't have it. + +.. + +.. bpo: 37556 +.. date: 2019-07-11-06-11-09 +.. nonce: sygMUU +.. section: Windows + +Extend py.exe help to mention overrides via venv, shebang, environmental +variables & ini files. + +.. + +.. bpo: 41557 +.. date: 2020-08-26-09-31-37 +.. nonce: mcQ75z +.. section: macOS + +Update macOS installer to use SQLite 3.33.0. + +.. + +.. bpo: 39580 +.. date: 2020-06-25-06-09-00 +.. nonce: N_vJ9h +.. section: macOS + +Avoid opening Finder window if running installer from the command line. +Patch contributed by Rick Heil. + +.. + +.. bpo: 41100 +.. date: 2020-06-24-13-51-57 +.. nonce: mcHdc5 +.. section: macOS + +Fix configure error when building on macOS 11. Note that the current Python +release was released shortly after the first developer preview of macOS 11 +(Big Sur); there are other known issues with building and running on the +developer preview. Big Sur is expected to be fully supported in a future +bugfix release of Python 3.8.x and with 3.9.0. + +.. + +.. bpo: 40741 +.. date: 2020-06-19-14-19-08 +.. nonce: L7yTbm +.. section: macOS + +Update macOS installer to use SQLite 3.32.3. + +.. + +.. bpo: 41005 +.. date: 2020-06-17-13-45-15 +.. nonce: zZegdV +.. section: macOS + +fixed an XDG settings issue not allowing macos to open browser in +webbrowser.py + +.. + +.. bpo: 40741 +.. date: 2020-06-07-20-10-56 +.. nonce: 80A2BW +.. section: macOS + +Update macOS installer to use SQLite 3.32.2. + +.. + +.. bpo: 41775 +.. date: 2020-09-24-14-31-16 +.. nonce: sB8Vre +.. section: IDLE + +Use 'IDLE Shell' as shell title + +.. + +.. bpo: 35764 +.. date: 2020-09-22-11-13-45 +.. nonce: VoNa8y +.. section: IDLE + +Rewrite the Calltips doc section. + +.. + +.. bpo: 40181 +.. date: 2020-09-22-00-45-40 +.. nonce: hhQi3z +.. section: IDLE + +In calltips, stop reminding that '/' marks the end of positional-only +arguments. + +.. + +.. bpo: 41468 +.. date: 2020-08-09-13-42-55 +.. nonce: zkP0_Y +.. section: IDLE + +Improve IDLE run crash error message (which users should never see). + +.. + +.. bpo: 41373 +.. date: 2020-07-24-17-49-58 +.. nonce: YQIPu_ +.. section: IDLE + +Save files loaded with no line ending, as when blank, or different line +endings, by setting its line ending to the system default. Fix regression in +3.8.4 and 3.9.0b4. + +.. + +.. bpo: 41300 +.. date: 2020-07-16-17-39-06 +.. nonce: wRixNb +.. section: IDLE + +Save files with non-ascii chars. Fix regression released in 3.9.0b4 and +3.8.4. + +.. + +.. bpo: 37765 +.. date: 2020-07-07-18-44-30 +.. nonce: umc1o8 +.. section: IDLE + +Add keywords to module name completion list. Rewrite Completions section of +IDLE doc. + +.. + +.. bpo: 41152 +.. date: 2020-06-29-14-51-15 +.. nonce: d6mV0C +.. section: IDLE + +The encoding of ``stdin``, ``stdout`` and ``stderr`` in IDLE is now always +UTF-8. + +.. + +.. bpo: 41144 +.. date: 2020-06-27-17-02-00 +.. nonce: JoFGIX +.. section: IDLE + +Make Open Module open a special module such as os.path. + +.. + +.. bpo: 39885 +.. date: 2020-05-29-18-21-58 +.. nonce: zB_-bN +.. section: IDLE + +Make context menu Cut and Copy work again when right-clicking within a +selection. + +.. + +.. bpo: 40723 +.. date: 2020-05-24-06-19-43 +.. nonce: AJLd4U +.. section: IDLE + +Make test_idle pass when run after import. + +.. + +.. bpo: 41936 +.. date: 2020-10-05-01-25-23 +.. nonce: 1gb5ra +.. section: C API + +Removed undocumented macros ``Py_ALLOW_RECURSION`` and +``Py_END_ALLOW_RECURSION`` and the ``recursion_critical`` field of the +:c:type:`PyInterpreterState` structure. + +.. + +.. bpo: 41692 +.. date: 2020-10-02-00-57-34 +.. nonce: fDScsF +.. section: C API + +The ``PyUnicode_InternImmortal()`` function is now deprecated and will be +removed in Python 3.12: use :c:func:`PyUnicode_InternInPlace` instead. Patch +by Victor Stinner. + +.. + +.. bpo: 41842 +.. date: 2020-09-27-20-43-16 +.. nonce: bCakAj +.. section: C API + +Add :c:func:`PyCodec_Unregister` function to unregister a codec search +function. + +.. + +.. bpo: 41834 +.. date: 2020-09-22-14-47-12 +.. nonce: nrOrDU +.. section: C API + +Remove the ``_Py_CheckRecursionLimit`` variable: it has been replaced by +``ceval.recursion_limit`` of the :c:type:`PyInterpreterState` structure. +Patch by Victor Stinner. + +.. + +.. bpo: 41689 +.. date: 2020-09-01-23-39-45 +.. nonce: zxHbLB +.. section: C API + +Types created with :c:func:`PyType_FromSpec` now make any signature in their +``tp_doc`` slot accessible from ``__text_signature__``. + +.. + +.. bpo: 41524 +.. date: 2020-08-12-17-09-06 +.. nonce: u6Xfr2 +.. section: C API + +Fix bug in PyOS_mystrnicmp and PyOS_mystricmp that incremented pointers +beyond the end of a string. + +.. + +.. bpo: 41324 +.. date: 2020-08-10-16-05-08 +.. nonce: waZD35 +.. section: C API + +Add a minimal decimal capsule API. The API supports fast conversions +between Decimals up to 38 digits and their triple representation as a C +struct. + +.. + +.. bpo: 30155 +.. date: 2020-07-26-19-39-45 +.. nonce: rHZRJ_ +.. section: C API + +Add :c:func:`PyDateTime_DATE_GET_TZINFO` and +:c:func:`PyDateTime_TIME_GET_TZINFO` macros for accessing the ``tzinfo`` +attributes of :class:`datetime.datetime` and :class:`datetime.time` objects. + +.. + +.. bpo: 40170 +.. date: 2020-07-08-10-14-52 +.. nonce: N6Qx1i +.. section: C API + +Revert :c:func:`PyType_HasFeature` change: it reads again directly the +:c:member:`PyTypeObject.tp_flags` member when the limited C API is not used, +rather than always calling :c:func:`PyType_GetFlags` which hides +implementation details. + +.. + +.. bpo: 41123 +.. date: 2020-06-29-15-49-36 +.. nonce: wYY4E1 +.. section: C API + +Remove ``PyUnicode_AsUnicodeCopy``. + +.. + +.. bpo: 41123 +.. date: 2020-06-29-11-33-49 +.. nonce: qFevek +.. section: C API + +Removed ``PyLong_FromUnicode()``. + +.. + +.. bpo: 41123 +.. date: 2020-06-28-11-39-22 +.. nonce: sjJWjQ +.. section: C API + +Removed ``PyUnicode_GetMax()``. + +.. + +.. bpo: 41123 +.. date: 2020-06-26-13-29-25 +.. nonce: bRa1oy +.. section: C API + +Removed ``Py_UNICODE_str*`` functions manipulating ``Py_UNICODE*`` strings. + +.. + +.. bpo: 41103 +.. date: 2020-06-24-22-57-07 +.. nonce: doojgE +.. section: C API + +``PyObject_AsCharBuffer()``, ``PyObject_AsReadBuffer()``, +``PyObject_CheckReadBuffer()``, and ``PyObject_AsWriteBuffer()`` are +removed. Please migrate to new buffer protocol; :c:func:`PyObject_GetBuffer` +and :c:func:`PyBuffer_Release`. + +.. + +.. bpo: 36346 +.. date: 2020-06-17-20-31-12 +.. nonce: mwIyxi +.. section: C API + +Raises DeprecationWarning for ``PyUnicode_FromUnicode(NULL, size)`` and +``PyUnicode_FromStringAndSize(NULL, size)`` with ``size > 0``. + +.. + +.. bpo: 36346 +.. date: 2020-06-17-11-24-00 +.. nonce: fTMr3S +.. section: C API + +Mark ``Py_UNICODE_COPY``, ``Py_UNICODE_FILL``, ``PyUnicode_WSTR_LENGTH``, +``PyUnicode_FromUnicode``, ``PyUnicode_AsUnicode``, and +``PyUnicode_AsUnicodeAndSize`` as deprecated in C. Remove +``Py_UNICODE_MATCH`` which was deprecated and broken since Python 3.3. + +.. + +.. bpo: 40989 +.. date: 2020-06-15-23-17-51 +.. nonce: tlzG3r +.. section: C API + +The :c:func:`PyObject_INIT` and :c:func:`PyObject_INIT_VAR` macros become +aliases to, respectively, :c:func:`PyObject_Init` and +:c:func:`PyObject_InitVar` functions. + +.. + +.. bpo: 36020 +.. date: 2020-06-15-16-46-01 +.. nonce: djI6jw +.. section: C API + +On Windows, ``#include "pyerrors.h"`` no longer defines ``snprintf`` and +``vsnprintf`` macros. + +.. + +.. bpo: 40943 +.. date: 2020-06-10-18-37-26 +.. nonce: i4q7rK +.. section: C API + +The ``PY_SSIZE_T_CLEAN`` macro must now be defined to use +:c:func:`PyArg_ParseTuple` and :c:func:`Py_BuildValue` formats which use +``#``: ``es#``, ``et#``, ``s#``, ``u#``, ``y#``, ``z#``, ``U#`` and ``Z#``. +See :ref:`Parsing arguments and building values ` and the +:pep:`353`. + +.. + +.. bpo: 40910 +.. date: 2020-06-08-15-59-06 +.. nonce: L56oI0 +.. section: C API + +Export explicitly the :c:func:`Py_GetArgcArgv` function to the C API and +document the function. Previously, it was exported implicitly which no +longer works since Python is built with ``-fvisibility=hidden``. + +.. + +.. bpo: 40724 +.. date: 2020-06-04-08-01-23 +.. nonce: qIIdSi +.. section: C API + +Allow defining buffer slots in type specs. + +.. + +.. bpo: 40679 +.. date: 2020-06-03-17-48-13 +.. nonce: 3sgWma +.. section: C API + +Fix a ``_PyEval_EvalCode()`` crash if *qualname* argument is NULL. + +.. + +.. bpo: 40839 +.. date: 2020-06-01-20-47-49 +.. nonce: bAi52Z +.. section: C API + +Calling :c:func:`PyDict_GetItem` without :term:`GIL` held had been allowed +for historical reason. It is no longer allowed. + +.. + +.. bpo: 40826 +.. date: 2020-06-01-16-12-37 +.. nonce: zQzFoK +.. section: C API + +:c:func:`PyOS_InterruptOccurred` now fails with a fatal error if it is +called with the GIL released. + +.. + +.. bpo: 40792 +.. date: 2020-05-27-11-02-15 +.. nonce: pBw2Bb +.. section: C API + +The result of :c:func:`PyNumber_Index` now always has exact type +:class:`int`. Previously, the result could have been an instance of a +subclass of ``int``. + +.. + +.. bpo: 39573 +.. date: 2020-05-26-16-21-47 +.. nonce: depAgq +.. section: C API + +Convert :c:func:`Py_REFCNT` and :c:func:`Py_SIZE` macros to static inline +functions. They cannot be used as l-value anymore: use +:c:func:`Py_SET_REFCNT` and :c:func:`Py_SET_SIZE` to set an object reference +count and size. This change is backward incompatible on purpose, to prepare +the C API for an opaque :c:type:`PyObject` structure. + +.. + +.. bpo: 40703 +.. date: 2020-05-20-19-11-12 +.. nonce: qQXfW8 +.. section: C API + +The PyType_FromSpec*() functions no longer overwrite the type's "__module__" +attribute if it is set via "Py_tp_members" or "Py_tp_getset". + +.. + +.. bpo: 39583 +.. date: 2020-02-08-08-01-35 +.. nonce: qURKSl +.. section: C API + +Remove superfluous "extern C" declarations from ``Include/cpython/*.h``. diff --git a/Misc/NEWS.d/next/Build/2020-05-19-10-54-08.bpo-40683.W8JHrr.rst b/Misc/NEWS.d/next/Build/2020-05-19-10-54-08.bpo-40683.W8JHrr.rst deleted file mode 100644 index d57e064c03d61e..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-05-19-10-54-08.bpo-40683.W8JHrr.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed an issue where the :mod:`zoneinfo` module and its tests were not -included when Python is installed with ``make``. diff --git a/Misc/NEWS.d/next/Build/2020-06-08-19-57-05.bpo-40684.WIY2-i.rst b/Misc/NEWS.d/next/Build/2020-06-08-19-57-05.bpo-40684.WIY2-i.rst deleted file mode 100644 index 0495e5e413622e..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-06-08-19-57-05.bpo-40684.WIY2-i.rst +++ /dev/null @@ -1,2 +0,0 @@ -``make install`` now uses the ``PLATLIBDIR`` variable for the destination -``lib-dynload/`` directory when ``./configure --with-platlibdir`` is used. diff --git a/Misc/NEWS.d/next/Build/2020-06-15-22-14-25.bpo-36020.wbiv0P.rst b/Misc/NEWS.d/next/Build/2020-06-15-22-14-25.bpo-36020.wbiv0P.rst deleted file mode 100644 index de50dff3b1d27f..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-06-15-22-14-25.bpo-36020.wbiv0P.rst +++ /dev/null @@ -1,2 +0,0 @@ -The C99 functions :c:func:`snprintf` and :c:func:`vsnprintf` are now required -to build Python. diff --git a/Misc/NEWS.d/next/Build/2020-06-25-06-59-13.bpo-40204.GpD04D.rst b/Misc/NEWS.d/next/Build/2020-06-25-06-59-13.bpo-40204.GpD04D.rst deleted file mode 100644 index 25a6d751e5f45c..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-06-25-06-59-13.bpo-40204.GpD04D.rst +++ /dev/null @@ -1 +0,0 @@ -Pin Sphinx version to 2.3.1 in ``Doc/Makefile``. diff --git a/Misc/NEWS.d/next/Build/2020-08-24-18-34-01.bpo-41617.sKKXz7.rst b/Misc/NEWS.d/next/Build/2020-08-24-18-34-01.bpo-41617.sKKXz7.rst deleted file mode 100644 index 715eadbee896f1..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-08-24-18-34-01.bpo-41617.sKKXz7.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``pycore_bitutils.h`` header file to support old clang versions: -``__builtin_bswap16()`` is not available in LLVM clang 3.0. diff --git a/Misc/NEWS.d/next/Build/2020-09-28-21-56-51.bpo-38249.uzMCaZ.rst b/Misc/NEWS.d/next/Build/2020-09-28-21-56-51.bpo-38249.uzMCaZ.rst deleted file mode 100644 index 3e409ec2e7c202..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-09-28-21-56-51.bpo-38249.uzMCaZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update :c:macro:`Py_UNREACHABLE` to use __builtin_unreachable() if only the -compiler is able to use it. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/C API/2020-02-08-08-01-35.bpo-39583.qURKSl.rst b/Misc/NEWS.d/next/C API/2020-02-08-08-01-35.bpo-39583.qURKSl.rst deleted file mode 100644 index 1c9f44f7443c14..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-02-08-08-01-35.bpo-39583.qURKSl.rst +++ /dev/null @@ -1 +0,0 @@ -Remove superfluous "extern C" declarations from ``Include/cpython/*.h``. diff --git a/Misc/NEWS.d/next/C API/2020-05-20-19-11-12.bpo-40703.qQXfW8.rst b/Misc/NEWS.d/next/C API/2020-05-20-19-11-12.bpo-40703.qQXfW8.rst deleted file mode 100644 index 5385a2d8dce454..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-05-20-19-11-12.bpo-40703.qQXfW8.rst +++ /dev/null @@ -1,2 +0,0 @@ -The PyType_FromSpec*() functions no longer overwrite the type's "__module__" attribute -if it is set via "Py_tp_members" or "Py_tp_getset". diff --git a/Misc/NEWS.d/next/C API/2020-05-26-16-21-47.bpo-39573.depAgq.rst b/Misc/NEWS.d/next/C API/2020-05-26-16-21-47.bpo-39573.depAgq.rst deleted file mode 100644 index f8f675cebcac7a..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-05-26-16-21-47.bpo-39573.depAgq.rst +++ /dev/null @@ -1,5 +0,0 @@ -Convert :c:func:`Py_REFCNT` and :c:func:`Py_SIZE` macros to static inline -functions. They cannot be used as l-value anymore: use -:c:func:`Py_SET_REFCNT` and :c:func:`Py_SET_SIZE` to set an object reference -count and size. This change is backward incompatible on purpose, to prepare -the C API for an opaque :c:type:`PyObject` structure. diff --git a/Misc/NEWS.d/next/C API/2020-05-27-11-02-15.bpo-40792.pBw2Bb.rst b/Misc/NEWS.d/next/C API/2020-05-27-11-02-15.bpo-40792.pBw2Bb.rst deleted file mode 100644 index 4cfe09bc774aff..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-05-27-11-02-15.bpo-40792.pBw2Bb.rst +++ /dev/null @@ -1,2 +0,0 @@ -The result of :c:func:`PyNumber_Index` now always has exact type :class:`int`. -Previously, the result could have been an instance of a subclass of ``int``. diff --git a/Misc/NEWS.d/next/C API/2020-06-01-16-12-37.bpo-40826.zQzFoK.rst b/Misc/NEWS.d/next/C API/2020-06-01-16-12-37.bpo-40826.zQzFoK.rst deleted file mode 100644 index 0d7a36c3eb401c..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-01-16-12-37.bpo-40826.zQzFoK.rst +++ /dev/null @@ -1,2 +0,0 @@ -:c:func:`PyOS_InterruptOccurred` now fails with a fatal error if it is -called with the GIL released. diff --git a/Misc/NEWS.d/next/C API/2020-06-01-20-47-49.bpo-40839.bAi52Z.rst b/Misc/NEWS.d/next/C API/2020-06-01-20-47-49.bpo-40839.bAi52Z.rst deleted file mode 100644 index 5de2f40c14eca0..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-01-20-47-49.bpo-40839.bAi52Z.rst +++ /dev/null @@ -1,2 +0,0 @@ -Calling :c:func:`PyDict_GetItem` without :term:`GIL` held had been allowed for -historical reason. It is no longer allowed. diff --git a/Misc/NEWS.d/next/C API/2020-06-03-17-48-13.bpo-40679.3sgWma.rst b/Misc/NEWS.d/next/C API/2020-06-03-17-48-13.bpo-40679.3sgWma.rst deleted file mode 100644 index ccf908cef19142..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-03-17-48-13.bpo-40679.3sgWma.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a ``_PyEval_EvalCode()`` crash if *qualname* argument is NULL. diff --git a/Misc/NEWS.d/next/C API/2020-06-04-08-01-23.bpo-40724.qIIdSi.rst b/Misc/NEWS.d/next/C API/2020-06-04-08-01-23.bpo-40724.qIIdSi.rst deleted file mode 100644 index 82793dbf7ad5f1..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-04-08-01-23.bpo-40724.qIIdSi.rst +++ /dev/null @@ -1 +0,0 @@ -Allow defining buffer slots in type specs. diff --git a/Misc/NEWS.d/next/C API/2020-06-08-15-59-06.bpo-40910.L56oI0.rst b/Misc/NEWS.d/next/C API/2020-06-08-15-59-06.bpo-40910.L56oI0.rst deleted file mode 100644 index 1d0cb0b0235bf5..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-08-15-59-06.bpo-40910.L56oI0.rst +++ /dev/null @@ -1,3 +0,0 @@ -Export explicitly the :c:func:`Py_GetArgcArgv` function to the C API and -document the function. Previously, it was exported implicitly which no -longer works since Python is built with ``-fvisibility=hidden``. diff --git a/Misc/NEWS.d/next/C API/2020-06-10-18-37-26.bpo-40943.i4q7rK.rst b/Misc/NEWS.d/next/C API/2020-06-10-18-37-26.bpo-40943.i4q7rK.rst deleted file mode 100644 index 360ddae34cb960..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-10-18-37-26.bpo-40943.i4q7rK.rst +++ /dev/null @@ -1,5 +0,0 @@ -The ``PY_SSIZE_T_CLEAN`` macro must now be defined to use -:c:func:`PyArg_ParseTuple` and :c:func:`Py_BuildValue` formats which use ``#``: -``es#``, ``et#``, ``s#``, ``u#``, ``y#``, ``z#``, ``U#`` and ``Z#``. -See :ref:`Parsing arguments and building values ` and the -:pep:`353`. diff --git a/Misc/NEWS.d/next/C API/2020-06-15-16-46-01.bpo-36020.djI6jw.rst b/Misc/NEWS.d/next/C API/2020-06-15-16-46-01.bpo-36020.djI6jw.rst deleted file mode 100644 index 1f91dce4608d34..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-15-16-46-01.bpo-36020.djI6jw.rst +++ /dev/null @@ -1,2 +0,0 @@ -On Windows, ``#include "pyerrors.h"`` no longer defines ``snprintf`` and -``vsnprintf`` macros. diff --git a/Misc/NEWS.d/next/C API/2020-06-15-23-17-51.bpo-40989.tlzG3r.rst b/Misc/NEWS.d/next/C API/2020-06-15-23-17-51.bpo-40989.tlzG3r.rst deleted file mode 100644 index 1be473d142760e..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-15-23-17-51.bpo-40989.tlzG3r.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :c:func:`PyObject_INIT` and :c:func:`PyObject_INIT_VAR` macros become -aliases to, respectively, :c:func:`PyObject_Init` and -:c:func:`PyObject_InitVar` functions. diff --git a/Misc/NEWS.d/next/C API/2020-06-17-11-24-00.bpo-36346.fTMr3S.rst b/Misc/NEWS.d/next/C API/2020-06-17-11-24-00.bpo-36346.fTMr3S.rst deleted file mode 100644 index 1e448303a853cf..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-17-11-24-00.bpo-36346.fTMr3S.rst +++ /dev/null @@ -1,4 +0,0 @@ -Mark ``Py_UNICODE_COPY``, ``Py_UNICODE_FILL``, ``PyUnicode_WSTR_LENGTH``, -``PyUnicode_FromUnicode``, ``PyUnicode_AsUnicode``, -and ``PyUnicode_AsUnicodeAndSize`` as deprecated in C. Remove ``Py_UNICODE_MATCH`` -which was deprecated and broken since Python 3.3. diff --git a/Misc/NEWS.d/next/C API/2020-06-17-20-31-12.bpo-36346.mwIyxi.rst b/Misc/NEWS.d/next/C API/2020-06-17-20-31-12.bpo-36346.mwIyxi.rst deleted file mode 100644 index 9b0400399beb99..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-17-20-31-12.bpo-36346.mwIyxi.rst +++ /dev/null @@ -1,2 +0,0 @@ -Raises DeprecationWarning for ``PyUnicode_FromUnicode(NULL, size)`` and -``PyUnicode_FromStringAndSize(NULL, size)`` with ``size > 0``. diff --git a/Misc/NEWS.d/next/C API/2020-06-24-22-57-07.bpo-41103.doojgE.rst b/Misc/NEWS.d/next/C API/2020-06-24-22-57-07.bpo-41103.doojgE.rst deleted file mode 100644 index 082b77b9035cbe..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-24-22-57-07.bpo-41103.doojgE.rst +++ /dev/null @@ -1,4 +0,0 @@ -``PyObject_AsCharBuffer()``, ``PyObject_AsReadBuffer()``, -``PyObject_CheckReadBuffer()``, and ``PyObject_AsWriteBuffer()`` are -removed. Please migrate to new buffer protocol; :c:func:`PyObject_GetBuffer` -and :c:func:`PyBuffer_Release`. diff --git a/Misc/NEWS.d/next/C API/2020-06-26-13-29-25.bpo-41123.bRa1oy.rst b/Misc/NEWS.d/next/C API/2020-06-26-13-29-25.bpo-41123.bRa1oy.rst deleted file mode 100644 index 1261a8708d6c9f..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-26-13-29-25.bpo-41123.bRa1oy.rst +++ /dev/null @@ -1 +0,0 @@ -Removed ``Py_UNICODE_str*`` functions manipulating ``Py_UNICODE*`` strings. diff --git a/Misc/NEWS.d/next/C API/2020-06-28-11-39-22.bpo-41123.sjJWjQ.rst b/Misc/NEWS.d/next/C API/2020-06-28-11-39-22.bpo-41123.sjJWjQ.rst deleted file mode 100644 index 97331458c6ab9a..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-28-11-39-22.bpo-41123.sjJWjQ.rst +++ /dev/null @@ -1 +0,0 @@ -Removed ``PyUnicode_GetMax()``. diff --git a/Misc/NEWS.d/next/C API/2020-06-29-11-33-49.bpo-41123.qFevek.rst b/Misc/NEWS.d/next/C API/2020-06-29-11-33-49.bpo-41123.qFevek.rst deleted file mode 100644 index 1f5813594b0ec5..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-29-11-33-49.bpo-41123.qFevek.rst +++ /dev/null @@ -1 +0,0 @@ -Removed ``PyLong_FromUnicode()``. diff --git a/Misc/NEWS.d/next/C API/2020-06-29-15-49-36.bpo-41123.wYY4E1.rst b/Misc/NEWS.d/next/C API/2020-06-29-15-49-36.bpo-41123.wYY4E1.rst deleted file mode 100644 index 74ac45462773ec..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-06-29-15-49-36.bpo-41123.wYY4E1.rst +++ /dev/null @@ -1 +0,0 @@ -Remove ``PyUnicode_AsUnicodeCopy``. diff --git a/Misc/NEWS.d/next/C API/2020-07-08-10-14-52.bpo-40170.N6Qx1i.rst b/Misc/NEWS.d/next/C API/2020-07-08-10-14-52.bpo-40170.N6Qx1i.rst deleted file mode 100644 index 760a3ff4d17b44..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-07-08-10-14-52.bpo-40170.N6Qx1i.rst +++ /dev/null @@ -1,4 +0,0 @@ -Revert :c:func:`PyType_HasFeature` change: it reads again directly the -:c:member:`PyTypeObject.tp_flags` member when the limited C API is not used, -rather than always calling :c:func:`PyType_GetFlags` which hides implementation -details. diff --git a/Misc/NEWS.d/next/C API/2020-07-26-19-39-45.bpo-30155.rHZRJ_.rst b/Misc/NEWS.d/next/C API/2020-07-26-19-39-45.bpo-30155.rHZRJ_.rst deleted file mode 100644 index a276759da79338..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-07-26-19-39-45.bpo-30155.rHZRJ_.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add :c:func:`PyDateTime_DATE_GET_TZINFO` and -:c:func:`PyDateTime_TIME_GET_TZINFO` macros for accessing the ``tzinfo`` -attributes of :class:`datetime.datetime` and :class:`datetime.time` objects. diff --git a/Misc/NEWS.d/next/C API/2020-08-10-16-05-08.bpo-41324.waZD35.rst b/Misc/NEWS.d/next/C API/2020-08-10-16-05-08.bpo-41324.waZD35.rst deleted file mode 100644 index e09332ab11e1d7..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-08-10-16-05-08.bpo-41324.waZD35.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add a minimal decimal capsule API. The API supports fast conversions -between Decimals up to 38 digits and their triple representation as a C -struct. diff --git a/Misc/NEWS.d/next/C API/2020-08-12-17-09-06.bpo-41524.u6Xfr2.rst b/Misc/NEWS.d/next/C API/2020-08-12-17-09-06.bpo-41524.u6Xfr2.rst deleted file mode 100644 index 4704e29be29bb0..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-08-12-17-09-06.bpo-41524.u6Xfr2.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix bug in PyOS_mystrnicmp and PyOS_mystricmp that incremented -pointers beyond the end of a string. \ No newline at end of file diff --git a/Misc/NEWS.d/next/C API/2020-09-01-23-39-45.bpo-41689.zxHbLB.rst b/Misc/NEWS.d/next/C API/2020-09-01-23-39-45.bpo-41689.zxHbLB.rst deleted file mode 100644 index 44cf58a4b06388..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-09-01-23-39-45.bpo-41689.zxHbLB.rst +++ /dev/null @@ -1,2 +0,0 @@ -Types created with :c:func:`PyType_FromSpec` now make any signature in their -``tp_doc`` slot accessible from ``__text_signature__``. diff --git a/Misc/NEWS.d/next/C API/2020-09-22-14-47-12.bpo-41834.nrOrDU.rst b/Misc/NEWS.d/next/C API/2020-09-22-14-47-12.bpo-41834.nrOrDU.rst deleted file mode 100644 index 07043dce5a6274..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-09-22-14-47-12.bpo-41834.nrOrDU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Remove the ``_Py_CheckRecursionLimit`` variable: it has been replaced by -``ceval.recursion_limit`` of the :c:type:`PyInterpreterState` -structure. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2020-09-27-20-43-16.bpo-41842.bCakAj.rst b/Misc/NEWS.d/next/C API/2020-09-27-20-43-16.bpo-41842.bCakAj.rst deleted file mode 100644 index 116d08f4908596..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-09-27-20-43-16.bpo-41842.bCakAj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :c:func:`PyCodec_Unregister` function to unregister a codec search -function. diff --git a/Misc/NEWS.d/next/C API/2020-10-02-00-57-34.bpo-41692.fDScsF.rst b/Misc/NEWS.d/next/C API/2020-10-02-00-57-34.bpo-41692.fDScsF.rst deleted file mode 100644 index 1be37c6572271b..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-10-02-00-57-34.bpo-41692.fDScsF.rst +++ /dev/null @@ -1,3 +0,0 @@ -The ``PyUnicode_InternImmortal()`` function is now deprecated and will be -removed in Python 3.12: use :c:func:`PyUnicode_InternInPlace` instead. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2020-10-05-01-25-23.bpo-41936.1gb5ra.rst b/Misc/NEWS.d/next/C API/2020-10-05-01-25-23.bpo-41936.1gb5ra.rst deleted file mode 100644 index 64613533086167..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-10-05-01-25-23.bpo-41936.1gb5ra.rst +++ /dev/null @@ -1,3 +0,0 @@ -Removed undocumented macros ``Py_ALLOW_RECURSION`` and -``Py_END_ALLOW_RECURSION`` and the ``recursion_critical`` field of the -:c:type:`PyInterpreterState` structure. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-03-15-11-51-36.bpo-26680.wOWYps.rst b/Misc/NEWS.d/next/Core and Builtins/2018-03-15-11-51-36.bpo-26680.wOWYps.rst deleted file mode 100644 index 93325ffffcbfc6..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-03-15-11-51-36.bpo-26680.wOWYps.rst +++ /dev/null @@ -1,2 +0,0 @@ -The int type now supports the x.is_integer() method for compatibility with -float. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-08-29-15-57-07.bpo-19569.RGu2Kb.rst b/Misc/NEWS.d/next/Core and Builtins/2018-08-29-15-57-07.bpo-19569.RGu2Kb.rst deleted file mode 100644 index 1b76bd8e247fc6..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-08-29-15-57-07.bpo-19569.RGu2Kb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add the private macros ``_Py_COMP_DIAG_PUSH``, -``_Py_COMP_DIAG_IGNORE_DEPR_DECLS``, and ``_Py_COMP_DIAG_POP``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-25-05-27-39.bpo-36982.0UHgfB.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-25-05-27-39.bpo-36982.0UHgfB.rst deleted file mode 100644 index f105f1857d487f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-25-05-27-39.bpo-36982.0UHgfB.rst +++ /dev/null @@ -1 +0,0 @@ -Use ncurses extended color functions when available to support terminals with 256 colors, and add the new function :func:`curses.has_extended_color_support` to indicate whether extended color support is provided by the underlying ncurses library. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-02-11-29-15.bpo-29882.AkRzjb.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-02-11-29-15.bpo-29882.AkRzjb.rst deleted file mode 100644 index 240b5680b36a2a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-06-02-11-29-15.bpo-29882.AkRzjb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :meth:`int.bit_count()`, counting the number of ones in the binary -representation of an integer. Patch by Niklas Fiekas. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-09-01-14-26-02.bpo-37999.XPl6dn.rst b/Misc/NEWS.d/next/Core and Builtins/2019-09-01-14-26-02.bpo-37999.XPl6dn.rst deleted file mode 100644 index 8d7e9369af4c6d..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-09-01-14-26-02.bpo-37999.XPl6dn.rst +++ /dev/null @@ -1,5 +0,0 @@ -Builtin and extension functions that take integer arguments no longer accept -:class:`~decimal.Decimal`\ s, :class:`~fractions.Fraction`\ s and other -objects that can be converted to integers only with a loss (e.g. that have -the :meth:`~object.__int__` method but do not have the -:meth:`~object.__index__` method). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-04-05-02-35-08.bpo-1635741.Kfe9fT.rst b/Misc/NEWS.d/next/Core and Builtins/2020-04-05-02-35-08.bpo-1635741.Kfe9fT.rst deleted file mode 100644 index 956d0b68a8dfb1..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-04-05-02-35-08.bpo-1635741.Kfe9fT.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`_lzma` to multiphase initialization. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-04-10-23-54-57.bpo-1635741.ZURqoN.rst b/Misc/NEWS.d/next/Core and Builtins/2020-04-10-23-54-57.bpo-1635741.ZURqoN.rst deleted file mode 100644 index cb849fb9b44308..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-04-10-23-54-57.bpo-1635741.ZURqoN.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`mmap` to multiphase initialization. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-04-11-13-07-49.bpo-4022.Ctpn_F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-04-11-13-07-49.bpo-4022.Ctpn_F.rst deleted file mode 100644 index a13a8e88226830..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-04-11-13-07-49.bpo-4022.Ctpn_F.rst +++ /dev/null @@ -1 +0,0 @@ -Improve performance of generators by not raising internal StopIteration. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-03-22-26-00.bpo-29590.aRz3l7.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-03-22-26-00.bpo-29590.aRz3l7.rst deleted file mode 100644 index 2570c4f2c7c0fd..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-03-22-26-00.bpo-29590.aRz3l7.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make the stack trace correct after calling :meth:`generator.throw` -on a generator that has yielded from a ``yield from``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-19-19-39-49.bpo-40679.SVzz9p.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-19-19-39-49.bpo-40679.SVzz9p.rst deleted file mode 100644 index 2d0a432b6fa69a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-19-19-39-49.bpo-40679.SVzz9p.rst +++ /dev/null @@ -1,2 +0,0 @@ -Certain :exc:`TypeError` messages about missing or extra arguments now include the function's -:term:`qualified name`. Patch by Dennis Sweeney. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-20-01-17-34.bpo-40521.wvAehI.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-20-01-17-34.bpo-40521.wvAehI.rst deleted file mode 100644 index 43226931ccc88d..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-20-01-17-34.bpo-40521.wvAehI.rst +++ /dev/null @@ -1,9 +0,0 @@ -Each interpreter now its has own free lists, singletons and caches: - -* Free lists: float, tuple, list, dict, frame, context, - asynchronous generator, MemoryError. -* Singletons: empty tuple, empty bytes string, empty Unicode string, - single byte character, single Unicode (latin1) character. -* Slice cache. - -They are no longer shared by all interpreters. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-21-01-54-00.bpo-40696.u3n8Wx.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-21-01-54-00.bpo-40696.u3n8Wx.rst deleted file mode 100644 index f99bdea2e3177b..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-21-01-54-00.bpo-40696.u3n8Wx.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a hang that can arise after :meth:`generator.throw` due to a cycle -in the exception context chain. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-22-00-34-34.bpo-39573.QO2QHj.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-22-00-34-34.bpo-39573.QO2QHj.rst deleted file mode 100644 index 24300303042679..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-22-00-34-34.bpo-39573.QO2QHj.rst +++ /dev/null @@ -1,2 +0,0 @@ -:c:func:`Py_TYPE()` is changed to the inline static function. Patch by -Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-23-01-15-51.bpo-40217.jZsHTc.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-23-01-15-51.bpo-40217.jZsHTc.rst deleted file mode 100644 index b13e8eeb0634fa..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-23-01-15-51.bpo-40217.jZsHTc.rst +++ /dev/null @@ -1,4 +0,0 @@ -Instances of types created with :c:func:`PyType_FromSpecWithBases` will no -longer automatically visit their class object when traversing references in -the garbage collector. The user is expected to manually visit the object's -class. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-24-02-42-26.bpo-40750.ZmO9Ev.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-24-02-42-26.bpo-40750.ZmO9Ev.rst deleted file mode 100644 index 4032b801690351..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-24-02-42-26.bpo-40750.ZmO9Ev.rst +++ /dev/null @@ -1 +0,0 @@ -Support the "-d" debug flag in the new PEG parser. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst deleted file mode 100644 index 12007643069466..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst +++ /dev/null @@ -1 +0,0 @@ -When there's a :exc:`SyntaxError` in the expression part of an fstring, the filename attribute of the :exc:`SyntaxError` gets correctly set to the name of the file the fstring resides in. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-26-17-43-58.bpo-40780.3Ckdgm.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-26-17-43-58.bpo-40780.3Ckdgm.rst deleted file mode 100644 index ed6020c2e23550..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-26-17-43-58.bpo-40780.3Ckdgm.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a corner case where g-style string formatting of a float failed to -remove trailing zeros. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-27-22-37-58.bpo-40792.WEDqqU.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-27-22-37-58.bpo-40792.WEDqqU.rst deleted file mode 100644 index 5986a221f5b37e..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-27-22-37-58.bpo-40792.WEDqqU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Attributes ``start``, ``stop`` and ``step`` of the :class:`range` object now -always has exact type :class:`int`. Previously, they could have been an -instance of a subclass of ``int``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-30-14-37-18.bpo-40824.XR3V5s.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-30-14-37-18.bpo-40824.XR3V5s.rst deleted file mode 100644 index 73c593c04a0dad..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-30-14-37-18.bpo-40824.XR3V5s.rst +++ /dev/null @@ -1,4 +0,0 @@ -Unexpected errors in calling the ``__iter__`` method are no longer masked by -``TypeError`` in the :keyword:`in` operator and functions -:func:`~operator.contains`, :func:`~operator.indexOf` and -:func:`~operator.countOf` of the :mod:`operator` module. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-30-23-18-35.bpo-19468.S-TA7p.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-30-23-18-35.bpo-19468.S-TA7p.rst deleted file mode 100644 index e35750e37f4da3..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-30-23-18-35.bpo-19468.S-TA7p.rst +++ /dev/null @@ -1,2 +0,0 @@ -Delete unnecessary instance check in importlib.reload(). -Patch by Furkan Önder. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-30-23-23-35.bpo-1635741.0D-laM.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-30-23-23-35.bpo-1635741.0D-laM.rst deleted file mode 100644 index cd2bcb6e60877a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-30-23-23-35.bpo-1635741.0D-laM.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`fcntl` to multiphase initialization. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-01-20-31-07.bpo-40826.XCI4M2.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-01-20-31-07.bpo-40826.XCI4M2.rst deleted file mode 100644 index a03ed180eb952b..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-01-20-31-07.bpo-40826.XCI4M2.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix GIL usage in :c:func:`PyOS_Readline`: lock the GIL to set an exception -and pass the Python thread state when checking if there is a pending signal. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-03-13-53-24.bpo-40854.O6vfQU.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-03-13-53-24.bpo-40854.O6vfQU.rst deleted file mode 100644 index 6ef4ed5af73186..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-03-13-53-24.bpo-40854.O6vfQU.rst +++ /dev/null @@ -1 +0,0 @@ -Allow overriding :data:`sys.platlibdir` via a new :envvar:`PYTHONPLATLIBDIR` environment variable. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-05-12-48-28.bpo-40870.9cd2sk.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-05-12-48-28.bpo-40870.9cd2sk.rst deleted file mode 100644 index 8e943a29f337fe..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-05-12-48-28.bpo-40870.9cd2sk.rst +++ /dev/null @@ -1,2 +0,0 @@ -Raise :exc:`ValueError` when validating custom AST's where the constants -``True``, ``False`` and ``None`` are used within a :class:`ast.Name` node. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-05-23-25-00.bpo-40883.M6sQ-Q.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-05-23-25-00.bpo-40883.M6sQ-Q.rst deleted file mode 100644 index ebeb0cc60d16bb..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-05-23-25-00.bpo-40883.M6sQ-Q.rst +++ /dev/null @@ -1 +0,0 @@ -Fix memory leak in when parsing f-strings in the new parser. Patch by Pablo Galindo \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-06-00-23-19.bpo-40880.fjdzSh.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-06-00-23-19.bpo-40880.fjdzSh.rst deleted file mode 100644 index ab42f5c205f81b..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-06-00-23-19.bpo-40880.fjdzSh.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix invalid memory read in the new parser when checking newlines in string -literals. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-07-22-50-10.bpo-40903.7dWejS.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-07-22-50-10.bpo-40903.7dWejS.rst deleted file mode 100644 index 5ee72c14ad352b..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-07-22-50-10.bpo-40903.7dWejS.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a possible segfault in the new PEG parser when producing error messages for invalid assignments of the form :code:`p=p=`. Patch by Pablo Galindo \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-08-01-08-57.bpo-40904.76qQzo.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-08-01-08-57.bpo-40904.76qQzo.rst deleted file mode 100644 index 09009b18c63a34..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-08-01-08-57.bpo-40904.76qQzo.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix possible segfault in the new PEG parser when parsing f-string containing -yield statements with no value (:code:`f"{yield}"`). Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-08-22-46-33.bpo-40889.vIBl-W.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-08-22-46-33.bpo-40889.vIBl-W.rst deleted file mode 100644 index 0ab1a261e3e6ee..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-08-22-46-33.bpo-40889.vIBl-W.rst +++ /dev/null @@ -1 +0,0 @@ -Improved the performance of symmetric difference operations on dictionary item views. Patch by Dennis Sweeney. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-09-00-20-13.bpo-40890.LoRV-g.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-09-00-20-13.bpo-40890.LoRV-g.rst deleted file mode 100644 index eaefc894a13a51..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-09-00-20-13.bpo-40890.LoRV-g.rst +++ /dev/null @@ -1 +0,0 @@ -Each dictionary view now has a ``mapping`` attribute that provides a :class:`types.MappingProxyType` wrapping the original dictionary. Patch contributed by Dennis Sweeney. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-09-23-52-32.bpo-40847.4XAACw.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-09-23-52-32.bpo-40847.4XAACw.rst deleted file mode 100644 index 0b489f24832159..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-09-23-52-32.bpo-40847.4XAACw.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix a bug where a line with only a line continuation character is not considered a blank line at tokenizer level. -In such cases, more than a single `NEWLINE` token was emitted. The old parser was working around the issue, -but the new parser threw a :exc:`SyntaxError` for valid input due to this. For example, an empty line following -a line continuation character was interpreted as a :exc:`SyntaxError`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-10-11-27-15.bpo-40939.DO-wAI.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-10-11-27-15.bpo-40939.DO-wAI.rst deleted file mode 100644 index b12985d0816040..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-10-11-27-15.bpo-40939.DO-wAI.rst +++ /dev/null @@ -1 +0,0 @@ -Remove the old parser, the :mod:`parser` module and all associated support code, command-line options and environment variables. Patch by Pablo Galindo. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-11-16-06-49.bpo-40947.72cZcR.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-11-16-06-49.bpo-40947.72cZcR.rst deleted file mode 100644 index e7dfe06531a4d9..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-11-16-06-49.bpo-40947.72cZcR.rst +++ /dev/null @@ -1,2 +0,0 @@ -The Python :ref:`Path Configuration ` now takes -:c:member:`PyConfig.platlibdir` in account. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-12-00-12-28.bpo-40950.tzMy7m.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-12-00-12-28.bpo-40950.tzMy7m.rst deleted file mode 100644 index 925b5790f73f3d..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-12-00-12-28.bpo-40950.tzMy7m.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a state to the :mod:`nis` module (:pep:`3121`) and apply -the multiphase initialization. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-12-12-21-54.bpo-40957.Z8n6I6.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-12-12-21-54.bpo-40957.Z8n6I6.rst deleted file mode 100644 index f99c374f94aac9..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-12-12-21-54.bpo-40957.Z8n6I6.rst +++ /dev/null @@ -1 +0,0 @@ -Fix refleak in _Py_fopen_obj() when PySys_Audit() fails diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-12-22-56-17.bpo-1635741.mmlp3Q.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-12-22-56-17.bpo-1635741.mmlp3Q.rst deleted file mode 100644 index ae12d25baa3ade..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-12-22-56-17.bpo-1635741.mmlp3Q.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`_dbm` to multiphase initialization. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-15-01-20-44.bpo-40958.7O2Wh1.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-15-01-20-44.bpo-40958.7O2Wh1.rst deleted file mode 100644 index 8e36897948f9b4..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-15-01-20-44.bpo-40958.7O2Wh1.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a possible buffer overflow in the PEG parser when gathering information -for emitting syntax errors. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-15-16-29-55.bpo-40985.IIN_xX.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-15-16-29-55.bpo-40985.IIN_xX.rst deleted file mode 100644 index e07134c7166adc..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-15-16-29-55.bpo-40985.IIN_xX.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a bug that caused the :exc:`SyntaxError` text to be empty when a file ends with a line ending in a line continuation character (i.e. backslash). The error text should contain the text of the last line. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-17-00-52-21.bpo-1635741.61iyYh.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-17-00-52-21.bpo-1635741.61iyYh.rst deleted file mode 100644 index cffe70dd71eaf2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-17-00-52-21.bpo-1635741.61iyYh.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`_gdbm` to multiphase initialization. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-17-10-27-17.bpo-40636.MYaCIe.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-17-10-27-17.bpo-40636.MYaCIe.rst deleted file mode 100644 index ba26ad9373ce38..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-17-10-27-17.bpo-40636.MYaCIe.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`zip` now supports :pep:`618`'s ``strict`` parameter, which raises a -:exc:`ValueError` if the arguments are exhausted at different lengths. -Patch by Brandt Bucher. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-18-00-07-09.bpo-41006.H-wN-d.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-18-00-07-09.bpo-41006.H-wN-d.rst deleted file mode 100644 index 4593e6bb89a9e9..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-18-00-07-09.bpo-41006.H-wN-d.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``encodings.latin_1`` module is no longer imported at startup. Now it is -only imported when it is the filesystem encoding or the stdio encoding. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-18-19-04-30.bpo-40077._yI-ax.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-18-19-04-30.bpo-40077._yI-ax.rst deleted file mode 100644 index 2e0258a7b369d2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-18-19-04-30.bpo-40077._yI-ax.rst +++ /dev/null @@ -1 +0,0 @@ -Convert :mod:`_bz2` to use :c:func:`PyType_FromSpec`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-20-16-59-02.bpo-40939.6810Ak.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-20-16-59-02.bpo-40939.6810Ak.rst deleted file mode 100644 index 8a626d479a91c5..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-20-16-59-02.bpo-40939.6810Ak.rst +++ /dev/null @@ -1 +0,0 @@ -Remove the remaining files from the old parser and the :mod:`symbol` module. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-20-17-00-44.bpo-35975.UDHCHp.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-20-17-00-44.bpo-35975.UDHCHp.rst deleted file mode 100644 index 73f4a6da2e5c0a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-20-17-00-44.bpo-35975.UDHCHp.rst +++ /dev/null @@ -1,3 +0,0 @@ -Stefan Behnel reported that cf_feature_version is used even when -PyCF_ONLY_AST is not set. This is against the intention and against the -documented behavior, so it's been fixed. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-20-19-27-47.bpo-40939.jxJ4yn.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-20-19-27-47.bpo-40939.jxJ4yn.rst deleted file mode 100644 index 7024dfe47ae1c7..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-20-19-27-47.bpo-40939.jxJ4yn.rst +++ /dev/null @@ -1 +0,0 @@ -Rename `PyPegen*` functions to `PyParser*`, so that we can remove the old set of `PyParser*` functions that were using the old parser, but keep everything backwards-compatible. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-20-22-46-18.bpo-41052.46MPeF.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-20-22-46-18.bpo-41052.46MPeF.rst deleted file mode 100644 index 82969bf4a78941..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-20-22-46-18.bpo-41052.46MPeF.rst +++ /dev/null @@ -1 +0,0 @@ -Opt out serialization/deserialization for _random.Random diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-21-10-54-02.bpo-41061.AHf9MU.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-21-10-54-02.bpo-41061.AHf9MU.rst deleted file mode 100644 index b5bb81621b7f29..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-21-10-54-02.bpo-41061.AHf9MU.rst +++ /dev/null @@ -1 +0,0 @@ -Fix incorrect expressions and asserts in hashtable code and tests. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-21-19-53-33.bpo-41056.IDu_EK.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-21-19-53-33.bpo-41056.IDu_EK.rst deleted file mode 100644 index 25f93c9da31051..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-21-19-53-33.bpo-41056.IDu_EK.rst +++ /dev/null @@ -1 +0,0 @@ -Fixes a reference to deallocated stack space during startup when constructing sys.path involving a relative symlink when code was supplied via -c. (discovered via Coverity) \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-22-13-22-30.bpo-41076.eWYw2N.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-22-13-22-30.bpo-41076.eWYw2N.rst deleted file mode 100644 index f13560ad9d2697..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-22-13-22-30.bpo-41076.eWYw2N.rst +++ /dev/null @@ -1 +0,0 @@ -Pre-feed the parser with the location of the f-string expression, not the f-string itself, which allows us to skip the shifting of the AST node locations after the parsing is completed. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-23-07-35-11.bpo-40521.dMNA6k.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-23-07-35-11.bpo-40521.dMNA6k.rst deleted file mode 100644 index 25f146e35ef439..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-23-07-35-11.bpo-40521.dMNA6k.rst +++ /dev/null @@ -1 +0,0 @@ -Empty frozensets are no longer singletons. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-23-15-10-19.bpo-41084.pt3y7F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-23-15-10-19.bpo-41084.pt3y7F.rst deleted file mode 100644 index cd349af770bd07..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-23-15-10-19.bpo-41084.pt3y7F.rst +++ /dev/null @@ -1 +0,0 @@ -Prefix the error message with 'f-string: ', when parsing an f-string expression which throws a :exc:`SyntaxError`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-23-18-32-41.bpo-39960.Kez3fP.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-23-18-32-41.bpo-39960.Kez3fP.rst deleted file mode 100644 index f69fccfa4db694..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-23-18-32-41.bpo-39960.Kez3fP.rst +++ /dev/null @@ -1,2 +0,0 @@ -The "hackcheck" that prevents sneaking around a type's __setattr__() by calling the -superclass method was rewritten to allow C implemented heap types. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-23-23-26-42.bpo-41094.zEIJse.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-23-23-26-42.bpo-41094.zEIJse.rst deleted file mode 100644 index 6dd45e21d17587..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-23-23-26-42.bpo-41094.zEIJse.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix decoding errors with audit when open files with non-ASCII names on non-UTF-8 -locale. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst deleted file mode 100644 index d6176d69f0eb0a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +++ /dev/null @@ -1 +0,0 @@ -add arm64 to the allowable Mac OS arches in mpdecimal.h \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-20-17-31.bpo-41175.acJoXB.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-20-17-31.bpo-41175.acJoXB.rst deleted file mode 100644 index 844fb804c0c8d4..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-20-17-31.bpo-41175.acJoXB.rst +++ /dev/null @@ -1,2 +0,0 @@ -Guard against a NULL pointer dereference within bytearrayobject triggered by -the ``bytearray() + bytearray()`` operation. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-01-20-17-38.bpo-1635741.-AtPYu.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-01-20-17-38.bpo-1635741.-AtPYu.rst deleted file mode 100644 index c529923779fa84..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-01-20-17-38.bpo-1635741.-AtPYu.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`sha256` to multiphase initialization diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-03-23-10-02.bpo-1635741.F5coWe.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-03-23-10-02.bpo-1635741.F5coWe.rst deleted file mode 100644 index 927c8e5b7083fa..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-03-23-10-02.bpo-1635741.F5coWe.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`faulthandler` to multiphase initialization. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-06-13-35-17.bpo-41218.oKnSr2.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-06-13-35-17.bpo-41218.oKnSr2.rst deleted file mode 100644 index d98b3433ef05f7..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-06-13-35-17.bpo-41218.oKnSr2.rst +++ /dev/null @@ -1,4 +0,0 @@ -Python 3.8.3 had a regression where compiling with -ast.PyCF_ALLOW_TOP_LEVEL_AWAIT would aggressively mark list comprehension -with CO_COROUTINE. Now only list comprehension making use of async/await -will tagged as so. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-06-18-36-33.bpo-41215.vFGFIz.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-06-18-36-33.bpo-41215.vFGFIz.rst deleted file mode 100644 index 7343da31e94f78..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-06-18-36-33.bpo-41215.vFGFIz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use non-NULL default values in the PEG parser keyword list to overcome a bug that was preventing -Python from being properly compiled when using the XLC compiler. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-06-20-43-19.bpo-1635741.LYhsni.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-06-20-43-19.bpo-1635741.LYhsni.rst deleted file mode 100644 index 956fcd5d1ee29e..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-06-20-43-19.bpo-1635741.LYhsni.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`winapi` to multiphase initialization diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-07-16-10-52.bpo-1635741.zU-H_n.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-07-16-10-52.bpo-1635741.zU-H_n.rst deleted file mode 100644 index 52e184dc317074..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-07-16-10-52.bpo-1635741.zU-H_n.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`multiprocessing` to multi-phase initialization diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-08-21-55-23.bpo-41252.nBWL-Y.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-08-21-55-23.bpo-41252.nBWL-Y.rst deleted file mode 100644 index 65f3189c83ec64..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-08-21-55-23.bpo-41252.nBWL-Y.rst +++ /dev/null @@ -1 +0,0 @@ -Fix incorrect refcounting in _ssl.c's ``_servername_callback()``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-08-22-03-54.bpo-41247.PndYIk.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-08-22-03-54.bpo-41247.PndYIk.rst deleted file mode 100644 index 08699b6e4a1f01..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-08-22-03-54.bpo-41247.PndYIk.rst +++ /dev/null @@ -1,2 +0,0 @@ -Always cache the running loop holder when running -``asyncio.set_running_loop``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-17-11-31-54.bpo-41323.ChbZHh.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-17-11-31-54.bpo-41323.ChbZHh.rst deleted file mode 100644 index 671d874b535afd..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-17-11-31-54.bpo-41323.ChbZHh.rst +++ /dev/null @@ -1,3 +0,0 @@ -Bytecode optimizations are performed directly on the control flow graph. -This will result in slightly more compact code objects in some -circumstances. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-18-08-15-32.bpo-41295.pu8Ezo.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-18-08-15-32.bpo-41295.pu8Ezo.rst deleted file mode 100644 index d61fd8f0a29683..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-18-08-15-32.bpo-41295.pu8Ezo.rst +++ /dev/null @@ -1,3 +0,0 @@ -Resolve a regression in CPython 3.8.4 where defining "__setattr__" in a -multi-inheritance setup and calling up the hierarchy chain could fail -if builtins/extension types were involved in the base types. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-18-18-01-10.bpo-41334.t5xMGp.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-18-18-01-10.bpo-41334.t5xMGp.rst deleted file mode 100644 index 5d44527a561a11..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-18-18-01-10.bpo-41334.t5xMGp.rst +++ /dev/null @@ -1,2 +0,0 @@ -Constructors :func:`str`, :func:`bytes` and :func:`bytearray` are now faster -(around 30--40% for small objects). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-19-15-40-52.bpo-41342.RRk_m_.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-19-15-40-52.bpo-41342.RRk_m_.rst deleted file mode 100644 index 38851a7f7fc0f4..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-19-15-40-52.bpo-41342.RRk_m_.rst +++ /dev/null @@ -1 +0,0 @@ -:func:`round` with integer argument is now faster (9--60%). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-20-17-01-17.bpo-38156.ptcdRy.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-20-17-01-17.bpo-38156.ptcdRy.rst deleted file mode 100644 index 254d13cf3ed3a7..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-20-17-01-17.bpo-38156.ptcdRy.rst +++ /dev/null @@ -1 +0,0 @@ -Handle interrupts that come after EOF correctly in ``PyOS_StdioReadline``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-27-01-50-06.bpo-41340.pZXfcF.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-27-01-50-06.bpo-41340.pZXfcF.rst deleted file mode 100644 index 3a93a576931070..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-27-01-50-06.bpo-41340.pZXfcF.rst +++ /dev/null @@ -1 +0,0 @@ -Removed fallback implementation for ``strdup``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-28-22-43-27.bpo-41428.FM6xsI.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-28-22-43-27.bpo-41428.FM6xsI.rst deleted file mode 100644 index a6652de9275117..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-07-28-22-43-27.bpo-41428.FM6xsI.rst +++ /dev/null @@ -1 +0,0 @@ -Implement PEP 604. This supports (int | str) etc. in place of Union[str, int]. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-02-15-53-12.bpo-41431.TblUBT.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-02-15-53-12.bpo-41431.TblUBT.rst deleted file mode 100644 index fa9d047edc3945..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-02-15-53-12.bpo-41431.TblUBT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Optimize ``dict_merge()`` for copying dict (e.g. ``dict(d)`` and -``{}.update(d)``). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst deleted file mode 100644 index 12af3d01ed8eff..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-10-16-11-32.bpo-1635741.O0d3ym.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the :mod:`_sha1`, :mod:`_sha512`, and :mod:`_md5` extension modules -to multi-phase initialization API (:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-12-07-35-07.bpo-41525.d9q3XL.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-12-07-35-07.bpo-41525.d9q3XL.rst deleted file mode 100644 index acc00f8b992c91..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-12-07-35-07.bpo-41525.d9q3XL.rst +++ /dev/null @@ -1 +0,0 @@ -The output of ``python --help`` contains now only ASCII characters. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-12-19-32-15.bpo-41531.WgPzjT.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-12-19-32-15.bpo-41531.WgPzjT.rst deleted file mode 100644 index 8544664f39335d..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-12-19-32-15.bpo-41531.WgPzjT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a bug that was dropping keys when compiling dict literals with more than -0xFFFF elements. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-12-20-29-57.bpo-41533.4pcVAc.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-12-20-29-57.bpo-41533.4pcVAc.rst deleted file mode 100644 index e166f0c0b621a4..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-12-20-29-57.bpo-41533.4pcVAc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Free the stack allocated in ``va_build_stack`` if ``do_mkstack`` fails and -the stack is not a ``small_stack``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-18-05.bpo-1635741.FC13e7.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-18-05.bpo-1635741.FC13e7.rst deleted file mode 100644 index cdfee874095fe5..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-18-05.bpo-1635741.FC13e7.rst +++ /dev/null @@ -1 +0,0 @@ -Port the :mod:`_blake2` extension module to the multi-phase initialization API (:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-19-21.bpo-1653741.fubBkb.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-19-21.bpo-1653741.fubBkb.rst deleted file mode 100644 index 73a4fdbac48a24..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-13-07-19-21.bpo-1653741.fubBkb.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`_sha3` to multi-phase init. Convert static types to heap types. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-25-22-43-33.bpo-40077.vcxSUa.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-25-22-43-33.bpo-40077.vcxSUa.rst deleted file mode 100644 index ee950010e6d13f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-25-22-43-33.bpo-40077.vcxSUa.rst +++ /dev/null @@ -1 +0,0 @@ -Convert :mod:`_operator` to use :c:func:`PyType_FromSpec`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-26-11-23-31.bpo-41631.3jZcd9.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-26-11-23-31.bpo-41631.3jZcd9.rst deleted file mode 100644 index 68bb51024d9e70..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-26-11-23-31.bpo-41631.3jZcd9.rst +++ /dev/null @@ -1,5 +0,0 @@ -The ``_ast`` module uses again a global state. Using a module state per module -instance is causing subtle practical problems. For example, the Mercurial -project replaces the ``__import__()`` function to implement lazy import, -whereas Python expected that ``import _ast`` always return a fully initialized -``_ast`` module. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-28-20-54-04.bpo-1635741.7ijlcI.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-28-20-54-04.bpo-1635741.7ijlcI.rst deleted file mode 100644 index 4d6ce1185ed936..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-28-20-54-04.bpo-1635741.7ijlcI.rst +++ /dev/null @@ -1 +0,0 @@ -Port the :mod:`zlib` extension module to multi-phase initialization (:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-30-20-38-33.bpo-41654.HtnhAM.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-30-20-38-33.bpo-41654.HtnhAM.rst deleted file mode 100644 index e05c3133e12625..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-30-20-38-33.bpo-41654.HtnhAM.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a crash that occurred when destroying subclasses of -:class:`MemoryError`. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-31-11-37-59.bpo-41670.vmRJRx.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-31-11-37-59.bpo-41670.vmRJRx.rst deleted file mode 100644 index 6ad5fb6dc9bb40..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-31-11-37-59.bpo-41670.vmRJRx.rst +++ /dev/null @@ -1,4 +0,0 @@ -Prevent line trace being skipped on platforms not compiled -with ``USE_COMPUTED_GOTOS``. -Fixes issue where some lines nested within a try-except block -were not being traced on Windows. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-31-14-53-17.bpo-41675.VSoqWU.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-31-14-53-17.bpo-41675.VSoqWU.rst deleted file mode 100644 index aa102f8fe43845..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-31-14-53-17.bpo-41675.VSoqWU.rst +++ /dev/null @@ -1,3 +0,0 @@ -The implementation of :func:`signal.siginterrupt` now uses :c:func:`sigaction` -(if it is available in the system) instead of the deprecated :c:func:`siginterrupt`. -Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst deleted file mode 100644 index ed557f92d85cac..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixes the wrong error description in the error raised by using 2 `,` in -format string in f-string and :meth:`str.format`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-06-02.bpo-1635741.5jZymK.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-06-02.bpo-1635741.5jZymK.rst deleted file mode 100644 index c3bc9a78a2e054..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-06-02.bpo-1635741.5jZymK.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the :mod:`_opcode` extension module to multi-phase initialization -(:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-08-07.bpo-1635741.X9CZgo.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-08-07.bpo-1635741.X9CZgo.rst deleted file mode 100644 index a39673a26307a9..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-08-07.bpo-1635741.X9CZgo.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the :mod:`_curses_panel` extension module to multi-phase initialization -(:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-22-35.bpo-1635741.CnRME3.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-22-35.bpo-1635741.CnRME3.rst deleted file mode 100644 index 76f985bb87b4e9..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-01-17-22-35.bpo-1635741.CnRME3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the :mod:`_overlapped` extension module to multi-phase initialization -(:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-02-12-00-57.bpo-41690.Ny-Sfy.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-02-12-00-57.bpo-41690.Ny-Sfy.rst deleted file mode 100644 index 5711aa5a55f070..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-02-12-00-57.bpo-41690.Ny-Sfy.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a possible stack overflow in the parser when parsing functions and -classes with a huge ammount of arguments. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-07-09-45-47.bpo-1635741.QuDIut.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-07-09-45-47.bpo-1635741.QuDIut.rst deleted file mode 100644 index 90e56542d1e97a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-07-09-45-47.bpo-1635741.QuDIut.rst +++ /dev/null @@ -1 +0,0 @@ -Convert the :mod:`_sha256` extension module types to heap types. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-07-11-35-02.bpo-1635741.rvIexb.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-07-11-35-02.bpo-1635741.rvIexb.rst deleted file mode 100644 index 1e19b34b372d89..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-07-11-35-02.bpo-1635741.rvIexb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the :mod:`termios` extension module to multi-phase initialization -(:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-08-20-39-43.bpo-1635741.jiXmyT.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-08-20-39-43.bpo-1635741.jiXmyT.rst deleted file mode 100644 index 17752b2ccd3fad..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-08-20-39-43.bpo-1635741.jiXmyT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the :mod:`_scproxy` extension module to multi-phase initialization -(:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-08-21-58-47.bpo-1635741.vdjSLH.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-08-21-58-47.bpo-1635741.vdjSLH.rst deleted file mode 100644 index bc1a6c888e33bd..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-08-21-58-47.bpo-1635741.vdjSLH.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the :mod:`cmath` extension module to multi-phase initialization -(:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-12-12-55-45.bpo-41756.1h0tbV.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-12-12-55-45.bpo-41756.1h0tbV.rst deleted file mode 100644 index b387cfd94033c9..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-12-12-55-45.bpo-41756.1h0tbV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add PyGen_Send function to allow sending value into generator/coroutine -without raising StopIteration exception to signal return diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-12-18-34-34.bpo-1635741.lh335O.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-12-18-34-34.bpo-1635741.lh335O.rst deleted file mode 100644 index ba61819df9e082..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-12-18-34-34.bpo-1635741.lh335O.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the :mod:`_lsprof` extension module to multi-phase initialization -(:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-15-23-29-49.bpo-41780.bOBUIH.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-15-23-29-49.bpo-41780.bOBUIH.rst deleted file mode 100644 index 9a7594fc453381..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-15-23-29-49.bpo-41780.bOBUIH.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :meth:`__dir__` of :class:`types.GenericAlias`. Patch by Batuhan -Taskaya. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-24-12-15-45.bpo-39934.YVHTCF.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-24-12-15-45.bpo-39934.YVHTCF.rst deleted file mode 100644 index 92cd1ba234d215..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-24-12-15-45.bpo-39934.YVHTCF.rst +++ /dev/null @@ -1,3 +0,0 @@ -Correctly count control blocks in 'except' in compiler. Ensures that a -syntax error, rather a fatal error, occurs for deeply nested, named -exception handlers. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-26-14-43-30.bpo-1635741.aJS9B3.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-26-14-43-30.bpo-1635741.aJS9B3.rst deleted file mode 100644 index 252dab35a1368a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-26-14-43-30.bpo-1635741.aJS9B3.rst +++ /dev/null @@ -1 +0,0 @@ -Port the :mod:`_bisect` module to the multi-phase initialization API (:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-27-22-23-14.bpo-41870.2v6_v4.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-27-22-23-14.bpo-41870.2v6_v4.rst deleted file mode 100644 index 13a6bb04a28fd0..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-27-22-23-14.bpo-41870.2v6_v4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Speed up calls to ``bool()`` by using the :pep:`590` ``vectorcall`` calling -convention. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst deleted file mode 100644 index ee2636704c2992..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst +++ /dev/null @@ -1 +0,0 @@ -Calls to ``float()`` are now faster due to the ``vectorcall`` calling convention. Patch by Dennis Sweeney. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-04-01-02-58.bpo-41922.kHGT8I.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-04-01-02-58.bpo-41922.kHGT8I.rst deleted file mode 100644 index 3c4de2c93555f2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-04-01-02-58.bpo-41922.kHGT8I.rst +++ /dev/null @@ -1,2 +0,0 @@ -Speed up calls to ``reversed()`` by using the :pep:`590` ``vectorcall`` -calling convention. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-04-10-55-12.bpo-41909.BqHPcm.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-04-10-55-12.bpo-41909.BqHPcm.rst deleted file mode 100644 index 388cfea065eedc..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-04-10-55-12.bpo-41909.BqHPcm.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed stack overflow in :func:`issubclass` and :func:`isinstance` when -getting the ``__bases__`` attribute leads to infinite recursion. diff --git a/Misc/NEWS.d/next/Documentation/2019-08-16-20-25-42.bpo-37703.Qm_l_H.rst b/Misc/NEWS.d/next/Documentation/2019-08-16-20-25-42.bpo-37703.Qm_l_H.rst deleted file mode 100644 index a1a1c354b1688b..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-08-16-20-25-42.bpo-37703.Qm_l_H.rst +++ /dev/null @@ -1,2 +0,0 @@ -Updated Documentation to comprehensively elaborate on the behaviour of -gather.cancel() diff --git a/Misc/NEWS.d/next/Documentation/2020-03-07-03-53-39.bpo-39883.1tnb4-.rst b/Misc/NEWS.d/next/Documentation/2020-03-07-03-53-39.bpo-39883.1tnb4-.rst deleted file mode 100644 index 4941d50a560e2e..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-03-07-03-53-39.bpo-39883.1tnb4-.rst +++ /dev/null @@ -1 +0,0 @@ -Make code, examples, and recipes in the Python documentation be licensed under the more permissive BSD0 license in addition to the existing Python 2.0 license. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2020-05-09-12-10-31.bpo-40552._0uB73.rst b/Misc/NEWS.d/next/Documentation/2020-05-09-12-10-31.bpo-40552._0uB73.rst deleted file mode 100644 index 5ed9c31834ac28..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-05-09-12-10-31.bpo-40552._0uB73.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix in tutorial section 4.2. -Code snippet is now correct. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2020-07-21-15-23-30.bpo-40979.pLA8rO.rst b/Misc/NEWS.d/next/Documentation/2020-07-21-15-23-30.bpo-40979.pLA8rO.rst deleted file mode 100644 index b0ca4327ad61a4..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-07-21-15-23-30.bpo-40979.pLA8rO.rst +++ /dev/null @@ -1 +0,0 @@ -Refactored typing.rst, arranging more than 70 classes, functions, and decorators into new sub-sections. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2020-07-25-14-20-00.bpo-41314.yrjko0.rst b/Misc/NEWS.d/next/Documentation/2020-07-25-14-20-00.bpo-41314.yrjko0.rst deleted file mode 100644 index 48f9c933828b0d..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-07-25-14-20-00.bpo-41314.yrjko0.rst +++ /dev/null @@ -1 +0,0 @@ -Changed the release when ``from __future__ import annotations`` becomes the default from ``4.0`` to ``3.10`` (following a change in PEP 563). diff --git a/Misc/NEWS.d/next/Documentation/2020-07-27-20-46-17.bpo-41045.GFF6Ul.rst b/Misc/NEWS.d/next/Documentation/2020-07-27-20-46-17.bpo-41045.GFF6Ul.rst deleted file mode 100644 index dfc9891bb89f27..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-07-27-20-46-17.bpo-41045.GFF6Ul.rst +++ /dev/null @@ -1 +0,0 @@ -Add documentation for debug feature of f-strings. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2020-08-12-18-35-40.bpo-40204.C8A_pe.rst b/Misc/NEWS.d/next/Documentation/2020-08-12-18-35-40.bpo-40204.C8A_pe.rst deleted file mode 100644 index 152f6c98b90048..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-08-12-18-35-40.bpo-40204.C8A_pe.rst +++ /dev/null @@ -1,3 +0,0 @@ -Enable Sphinx 3.2 ``c_allow_pre_v3`` option and disable -``c_warn_on_allowed_pre_v3`` option to make the documentation compatible -with Sphinx 2 and Sphinx 3. diff --git a/Misc/NEWS.d/next/Documentation/2020-08-25-15-11-23.bpo-41624.ddjJlN.rst b/Misc/NEWS.d/next/Documentation/2020-08-25-15-11-23.bpo-41624.ddjJlN.rst deleted file mode 100644 index bdbc5a445f3390..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-08-25-15-11-23.bpo-41624.ddjJlN.rst +++ /dev/null @@ -1 +0,0 @@ -Fix the signature of :class:`typing.Coroutine`. diff --git a/Misc/NEWS.d/next/Documentation/2020-09-08-16-57-09.bpo-41726.g0UXrn.rst b/Misc/NEWS.d/next/Documentation/2020-09-08-16-57-09.bpo-41726.g0UXrn.rst deleted file mode 100644 index 1079a757c054ac..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-09-08-16-57-09.bpo-41726.g0UXrn.rst +++ /dev/null @@ -1 +0,0 @@ -Update the refcounts info of ``PyType_FromModuleAndSpec``. diff --git a/Misc/NEWS.d/next/Documentation/2020-09-10-07-48-02.bpo-37149.VD0rCv.rst b/Misc/NEWS.d/next/Documentation/2020-09-10-07-48-02.bpo-37149.VD0rCv.rst deleted file mode 100644 index aeca652b4ed970..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-09-10-07-48-02.bpo-37149.VD0rCv.rst +++ /dev/null @@ -1 +0,0 @@ -Change Shipman tkinter doc link from archive.org to TkDocs. (The doc has been removed from the NMT server.) The new link responds much faster and includes a short explanatory note. diff --git a/Misc/NEWS.d/next/Documentation/2020-09-12-17-37-13.bpo-35293._cOwPD.rst b/Misc/NEWS.d/next/Documentation/2020-09-12-17-37-13.bpo-35293._cOwPD.rst deleted file mode 100644 index 089d44e35d2baa..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-09-12-17-37-13.bpo-35293._cOwPD.rst +++ /dev/null @@ -1 +0,0 @@ -Fix RemovedInSphinx40Warning when building the documentation. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Documentation/2020-09-24-15-35-13.bpo-41774.5IqdGP.rst b/Misc/NEWS.d/next/Documentation/2020-09-24-15-35-13.bpo-41774.5IqdGP.rst deleted file mode 100644 index af8e02437cb2b5..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-09-24-15-35-13.bpo-41774.5IqdGP.rst +++ /dev/null @@ -1,2 +0,0 @@ -In Programming FAQ "Sequences (Tuples/Lists)" section, add "How do you -remove multiple items from a list". diff --git a/Misc/NEWS.d/next/Documentation/2020-10-03-18-20-46.bpo-41428._ju1NE.rst b/Misc/NEWS.d/next/Documentation/2020-10-03-18-20-46.bpo-41428._ju1NE.rst deleted file mode 100644 index 2c333934560197..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-10-03-18-20-46.bpo-41428._ju1NE.rst +++ /dev/null @@ -1 +0,0 @@ -Add documentation for :pep:`604` (Allow writing union types as ``X | Y``). diff --git a/Misc/NEWS.d/next/IDLE/2020-05-24-06-19-43.bpo-40723.AJLd4U.rst b/Misc/NEWS.d/next/IDLE/2020-05-24-06-19-43.bpo-40723.AJLd4U.rst deleted file mode 100644 index e0de2f9d836688..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-05-24-06-19-43.bpo-40723.AJLd4U.rst +++ /dev/null @@ -1 +0,0 @@ -Make test_idle pass when run after import. diff --git a/Misc/NEWS.d/next/IDLE/2020-05-29-18-21-58.bpo-39885.zB_-bN.rst b/Misc/NEWS.d/next/IDLE/2020-05-29-18-21-58.bpo-39885.zB_-bN.rst deleted file mode 100644 index a847b75997117d..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-05-29-18-21-58.bpo-39885.zB_-bN.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make context menu Cut and Copy work again when right-clicking within a -selection. diff --git a/Misc/NEWS.d/next/IDLE/2020-06-27-17-02-00.bpo-41144.JoFGIX.rst b/Misc/NEWS.d/next/IDLE/2020-06-27-17-02-00.bpo-41144.JoFGIX.rst deleted file mode 100644 index ed558d3e7ded10..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-06-27-17-02-00.bpo-41144.JoFGIX.rst +++ /dev/null @@ -1 +0,0 @@ -Make Open Module open a special module such as os.path. diff --git a/Misc/NEWS.d/next/IDLE/2020-06-29-14-51-15.bpo-41152.d6mV0C.rst b/Misc/NEWS.d/next/IDLE/2020-06-29-14-51-15.bpo-41152.d6mV0C.rst deleted file mode 100644 index 434be10b5309cf..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-06-29-14-51-15.bpo-41152.d6mV0C.rst +++ /dev/null @@ -1,2 +0,0 @@ -The encoding of ``stdin``, ``stdout`` and ``stderr`` in IDLE is now always -UTF-8. diff --git a/Misc/NEWS.d/next/IDLE/2020-07-07-18-44-30.bpo-37765.umc1o8.rst b/Misc/NEWS.d/next/IDLE/2020-07-07-18-44-30.bpo-37765.umc1o8.rst deleted file mode 100644 index f8b53ca482a21e..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-07-07-18-44-30.bpo-37765.umc1o8.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add keywords to module name completion list. Rewrite Completions -section of IDLE doc. diff --git a/Misc/NEWS.d/next/IDLE/2020-07-16-17-39-06.bpo-41300.wRixNb.rst b/Misc/NEWS.d/next/IDLE/2020-07-16-17-39-06.bpo-41300.wRixNb.rst deleted file mode 100644 index 080775f7d7ab44..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-07-16-17-39-06.bpo-41300.wRixNb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Save files with non-ascii chars. Fix regression released in 3.9.0b4 and -3.8.4. diff --git a/Misc/NEWS.d/next/IDLE/2020-07-24-17-49-58.bpo-41373.YQIPu_.rst b/Misc/NEWS.d/next/IDLE/2020-07-24-17-49-58.bpo-41373.YQIPu_.rst deleted file mode 100644 index b50a72fe676a82..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-07-24-17-49-58.bpo-41373.YQIPu_.rst +++ /dev/null @@ -1,3 +0,0 @@ -Save files loaded with no line ending, as when blank, or different line -endings, by setting its line ending to the system default. Fix regression in -3.8.4 and 3.9.0b4. diff --git a/Misc/NEWS.d/next/IDLE/2020-08-09-13-42-55.bpo-41468.zkP0_Y.rst b/Misc/NEWS.d/next/IDLE/2020-08-09-13-42-55.bpo-41468.zkP0_Y.rst deleted file mode 100644 index e41c7d574905cd..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-08-09-13-42-55.bpo-41468.zkP0_Y.rst +++ /dev/null @@ -1 +0,0 @@ -Improve IDLE run crash error message (which users should never see). diff --git a/Misc/NEWS.d/next/IDLE/2020-09-22-00-45-40.bpo-40181.hhQi3z.rst b/Misc/NEWS.d/next/IDLE/2020-09-22-00-45-40.bpo-40181.hhQi3z.rst deleted file mode 100644 index b6866e19c4d41a..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-09-22-00-45-40.bpo-40181.hhQi3z.rst +++ /dev/null @@ -1,2 +0,0 @@ -In calltips, stop reminding that '/' marks the end of positional-only -arguments. diff --git a/Misc/NEWS.d/next/IDLE/2020-09-22-11-13-45.bpo-35764.VoNa8y.rst b/Misc/NEWS.d/next/IDLE/2020-09-22-11-13-45.bpo-35764.VoNa8y.rst deleted file mode 100644 index eb62d3699d5feb..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-09-22-11-13-45.bpo-35764.VoNa8y.rst +++ /dev/null @@ -1 +0,0 @@ -Rewrite the Calltips doc section. diff --git a/Misc/NEWS.d/next/IDLE/2020-09-24-14-31-16.bpo-41775.sB8Vre.rst b/Misc/NEWS.d/next/IDLE/2020-09-24-14-31-16.bpo-41775.sB8Vre.rst deleted file mode 100644 index 59605fa40235fb..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-09-24-14-31-16.bpo-41775.sB8Vre.rst +++ /dev/null @@ -1 +0,0 @@ -Use 'IDLE Shell' as shell title diff --git a/Misc/NEWS.d/next/Library/2018-03-15-11-55-04.bpo-26680.eKAi85.rst b/Misc/NEWS.d/next/Library/2018-03-15-11-55-04.bpo-26680.eKAi85.rst deleted file mode 100644 index 8b2e818383041a..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-03-15-11-55-04.bpo-26680.eKAi85.rst +++ /dev/null @@ -1,3 +0,0 @@ -The x.is_integer() method is incorporated into the abstract types of the -numeric tower, Real, Rational and Integral, with appropriate default -implementations. diff --git a/Misc/NEWS.d/next/Library/2018-03-15-11-56-48.bpo-26680.Udkhn4.rst b/Misc/NEWS.d/next/Library/2018-03-15-11-56-48.bpo-26680.Udkhn4.rst deleted file mode 100644 index df75e080fa6ee0..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-03-15-11-56-48.bpo-26680.Udkhn4.rst +++ /dev/null @@ -1,2 +0,0 @@ -The d.is_integer() method is added to the Decimal type, for compatibility -with other number types. diff --git a/Misc/NEWS.d/next/Library/2018-06-07-22-04-01.bpo-28557.ViNJnK.rst b/Misc/NEWS.d/next/Library/2018-06-07-22-04-01.bpo-28557.ViNJnK.rst deleted file mode 100644 index 4137e2ff89beb1..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-06-07-22-04-01.bpo-28557.ViNJnK.rst +++ /dev/null @@ -1 +0,0 @@ -Improve the error message for a misbehaving ``rawio.readinto`` diff --git a/Misc/NEWS.d/next/Library/2018-06-12-23-30-41.bpo-33660.AdDn5Z.rst b/Misc/NEWS.d/next/Library/2018-06-12-23-30-41.bpo-33660.AdDn5Z.rst deleted file mode 100644 index cce3dbb1c6ea5b..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-06-12-23-30-41.bpo-33660.AdDn5Z.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix pathlib.PosixPath to resolve a relative path located on the root -directory properly. diff --git a/Misc/NEWS.d/next/Library/2018-07-29-12-14-54.bpo-34226.BE7zbu.rst b/Misc/NEWS.d/next/Library/2018-07-29-12-14-54.bpo-34226.BE7zbu.rst deleted file mode 100644 index 2656b4bf22ae4a..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-07-29-12-14-54.bpo-34226.BE7zbu.rst +++ /dev/null @@ -1 +0,0 @@ -Fix `cgi.parse_multipart` without content_length. Patch by Roger Duran diff --git a/Misc/NEWS.d/next/Library/2018-07-30-12-48-17.bpo-31844.0_GKsD.rst b/Misc/NEWS.d/next/Library/2018-07-30-12-48-17.bpo-31844.0_GKsD.rst deleted file mode 100644 index 9034afd3284c4f..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-07-30-12-48-17.bpo-31844.0_GKsD.rst +++ /dev/null @@ -1,4 +0,0 @@ -Remove ``ParserBase.error()`` method from the private and undocumented -``_markupbase`` module. :class:`html.parser.HTMLParser` is the only -subclass of ``ParserBase`` and its ``error()`` implementation was deprecated -in Python 3.4 and removed in Python 3.5. diff --git a/Misc/NEWS.d/next/Library/2018-08-21-16-20-33.bpo-29620.xxx666.rst b/Misc/NEWS.d/next/Library/2018-08-21-16-20-33.bpo-29620.xxx666.rst deleted file mode 100644 index d781919504e68e..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-08-21-16-20-33.bpo-29620.xxx666.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`~unittest.TestCase.assertWarns` no longer raises a ``RuntimeException`` -when accessing a module's ``__warningregistry__`` causes importation of a new -module, or when a new module is imported in another thread. Patch by Kernc. diff --git a/Misc/NEWS.d/next/Library/2018-10-27-09-37-03.bpo-35078.kweA3R.rst b/Misc/NEWS.d/next/Library/2018-10-27-09-37-03.bpo-35078.kweA3R.rst deleted file mode 100644 index 123f9dabde9136..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-27-09-37-03.bpo-35078.kweA3R.rst +++ /dev/null @@ -1,3 +0,0 @@ -Refactor formatweekday, formatmonthname methods in LocaleHTMLCalendar and LocaleTextCalendar classes in calendar module to call the base class methods.This enables customizable CSS classes for LocaleHTMLCalendar. -Patch by Srinivas Reddy Thatiparthy - diff --git a/Misc/NEWS.d/next/Library/2019-03-01-01-56-23.bpo-33944.-82Pkt.rst b/Misc/NEWS.d/next/Library/2019-03-01-01-56-23.bpo-33944.-82Pkt.rst deleted file mode 100644 index b0c953dd6752e9..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-01-01-56-23.bpo-33944.-82Pkt.rst +++ /dev/null @@ -1 +0,0 @@ -Added site.py site-packages tracing in verbose mode. diff --git a/Misc/NEWS.d/next/Library/2019-03-17-19-01-53.bpo-36290.7VXo_K.rst b/Misc/NEWS.d/next/Library/2019-03-17-19-01-53.bpo-36290.7VXo_K.rst deleted file mode 100644 index a9afe62b0c46e0..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-17-19-01-53.bpo-36290.7VXo_K.rst +++ /dev/null @@ -1,2 +0,0 @@ -AST nodes are now raising :exc:`TypeError` on conflicting keyword arguments. -Patch contributed by Rémi Lapeyre. diff --git a/Misc/NEWS.d/next/Library/2019-05-31-23-54-28.bpo-12178.N6FLCZ.rst b/Misc/NEWS.d/next/Library/2019-05-31-23-54-28.bpo-12178.N6FLCZ.rst deleted file mode 100644 index 80e2a7b5fbb2c0..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-31-23-54-28.bpo-12178.N6FLCZ.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`csv.writer` now correctly escapes *escapechar* when input -contains *escapechar*. Patch by Catalin Iacob, Berker Peksag, -and Itay Elbirt. diff --git a/Misc/NEWS.d/next/Library/2019-08-11-16-28-03.bpo-26543.X-TJZO.rst b/Misc/NEWS.d/next/Library/2019-08-11-16-28-03.bpo-26543.X-TJZO.rst deleted file mode 100644 index 8715b8d79cace1..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-08-11-16-28-03.bpo-26543.X-TJZO.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :meth:`IMAP4.noop()` when debug mode is enabled (ex: ``imaplib.Debug = 3``). diff --git a/Misc/NEWS.d/next/Library/2019-09-12-21-34-03.bpo-38144.8uQCdd.rst b/Misc/NEWS.d/next/Library/2019-09-12-21-34-03.bpo-38144.8uQCdd.rst deleted file mode 100644 index 2c335bf29cfb39..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-09-12-21-34-03.bpo-38144.8uQCdd.rst +++ /dev/null @@ -1 +0,0 @@ -Added the *root_dir* and *dir_fd* parameters in :func:`glob.glob`. diff --git a/Misc/NEWS.d/next/Library/2019-10-25-23-45-49.bpo-35714.fw3xb7.rst b/Misc/NEWS.d/next/Library/2019-10-25-23-45-49.bpo-35714.fw3xb7.rst deleted file mode 100644 index 39102065ca7b51..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-10-25-23-45-49.bpo-35714.fw3xb7.rst +++ /dev/null @@ -1,2 +0,0 @@ -:exc:`struct.error` is now raised if there is a null character in a -:mod:`struct` format string. diff --git a/Misc/NEWS.d/next/Library/2019-11-13-07-37-11.bpo-38731.9qmcSx.rst b/Misc/NEWS.d/next/Library/2019-11-13-07-37-11.bpo-38731.9qmcSx.rst deleted file mode 100644 index ba9e522ecfcbf6..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-11-13-07-37-11.bpo-38731.9qmcSx.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add ``--quiet`` option to command-line interface of :mod:`py_compile`. -Patch by Gregory Schevchenko. diff --git a/Misc/NEWS.d/next/Library/2019-12-15-18-47-20.bpo-39040.tKa0Qs.rst b/Misc/NEWS.d/next/Library/2019-12-15-18-47-20.bpo-39040.tKa0Qs.rst deleted file mode 100644 index 078bce22be30f0..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-15-18-47-20.bpo-39040.tKa0Qs.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix parsing of invalid mime headers parameters by collapsing whitespace between -encoded words in a bare-quote-string. diff --git a/Misc/NEWS.d/next/Library/2020-02-23-15-09-47.bpo-39244.aBK5IM.rst b/Misc/NEWS.d/next/Library/2020-02-23-15-09-47.bpo-39244.aBK5IM.rst deleted file mode 100644 index c7d8e0de676b5c..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-02-23-15-09-47.bpo-39244.aBK5IM.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed :class:`multiprocessing.context.get_all_start_methods` -to properly return the default method first on macOS. diff --git a/Misc/NEWS.d/next/Library/2020-02-24-10-58-34.bpo-39728.kOOaHn.rst b/Misc/NEWS.d/next/Library/2020-02-24-10-58-34.bpo-39728.kOOaHn.rst deleted file mode 100644 index beb2016a85ba68..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-02-24-10-58-34.bpo-39728.kOOaHn.rst +++ /dev/null @@ -1 +0,0 @@ -fix default `_missing_` so a duplicate `ValueError` is not set as the `__context__` of the original `ValueError` diff --git a/Misc/NEWS.d/next/Library/2020-03-11-07-44-06.bpo-31122.zIQ80l.rst b/Misc/NEWS.d/next/Library/2020-03-11-07-44-06.bpo-31122.zIQ80l.rst deleted file mode 100644 index 2e70f7aee65c83..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-03-11-07-44-06.bpo-31122.zIQ80l.rst +++ /dev/null @@ -1 +0,0 @@ -ssl.wrap_socket() now raises ssl.SSLEOFError rather than OSError when peer closes connection during TLS negotiation \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst b/Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst deleted file mode 100644 index 65ff4ce36e82ea..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``Enum.__dir__``: dir(Enum.member) now includes attributes as well as methods. diff --git a/Misc/NEWS.d/next/Library/2020-04-03-16-13-59.bpo-40105.hfM2c0.rst b/Misc/NEWS.d/next/Library/2020-04-03-16-13-59.bpo-40105.hfM2c0.rst deleted file mode 100644 index f71a7a1e697a48..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-04-03-16-13-59.bpo-40105.hfM2c0.rst +++ /dev/null @@ -1,2 +0,0 @@ -ZipFile truncates files to avoid corruption when a shorter comment is provided -in append ("a") mode. Patch by Jan Mazur. diff --git a/Misc/NEWS.d/next/Library/2020-04-18-14-16-02.bpo-40318.K2UdRx.rst b/Misc/NEWS.d/next/Library/2020-04-18-14-16-02.bpo-40318.K2UdRx.rst deleted file mode 100644 index 3d5fcfb74a0fe5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-04-18-14-16-02.bpo-40318.K2UdRx.rst +++ /dev/null @@ -1 +0,0 @@ -Use SQLite3 trace v2 API, if it is available. diff --git a/Misc/NEWS.d/next/Library/2020-04-20-22-08-36.bpo-23082.iX90Id.rst b/Misc/NEWS.d/next/Library/2020-04-20-22-08-36.bpo-23082.iX90Id.rst deleted file mode 100644 index 13ed0defe529cf..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-04-20-22-08-36.bpo-23082.iX90Id.rst +++ /dev/null @@ -1 +0,0 @@ -Updated the error message and docs of PurePath.relative_to() to better reflect the function behaviour. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-04-23-18-21-19.bpo-39385.MIAyS7.rst b/Misc/NEWS.d/next/Library/2020-04-23-18-21-19.bpo-39385.MIAyS7.rst deleted file mode 100644 index e6c5c0dd4380b1..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-04-23-18-21-19.bpo-39385.MIAyS7.rst +++ /dev/null @@ -1,3 +0,0 @@ -A new test assertion context-manager, :func:`unittest.assertNoLogs` will -ensure a given block of code emits no log messages using the logging module. -Contributed by Kit Yan Choi. diff --git a/Misc/NEWS.d/next/Library/2020-05-06-02-01-25.bpo-13097.Wh5xSK.rst b/Misc/NEWS.d/next/Library/2020-05-06-02-01-25.bpo-13097.Wh5xSK.rst deleted file mode 100644 index a7f5f588289174..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-06-02-01-25.bpo-13097.Wh5xSK.rst +++ /dev/null @@ -1 +0,0 @@ -``ctypes`` now raises an ``ArgumentError`` when a callback is invoked with more than 1024 arguments. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-05-07-22-00-12.bpo-39881.E1xsNv.rst b/Misc/NEWS.d/next/Library/2020-05-07-22-00-12.bpo-39881.E1xsNv.rst deleted file mode 100644 index 1129cd7649b96a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-07-22-00-12.bpo-39881.E1xsNv.rst +++ /dev/null @@ -1,2 +0,0 @@ -PEP 554 for use in the test suite. -(Patch By Joannah Nanjekye) \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-05-13-16-28-33.bpo-40611.ZCk0_c.rst b/Misc/NEWS.d/next/Library/2020-05-13-16-28-33.bpo-40611.ZCk0_c.rst deleted file mode 100644 index 50ef3ad200a5e0..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-13-16-28-33.bpo-40611.ZCk0_c.rst +++ /dev/null @@ -1 +0,0 @@ -:data:`~mmap.MAP_POPULATE` constant has now been added to the list of exported :mod:`mmap` module flags. diff --git a/Misc/NEWS.d/next/Library/2020-05-15-21-14-45.bpo-36543.Jt-eSX.rst b/Misc/NEWS.d/next/Library/2020-05-15-21-14-45.bpo-36543.Jt-eSX.rst deleted file mode 100644 index 468c1ac9eee17c..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-15-21-14-45.bpo-36543.Jt-eSX.rst +++ /dev/null @@ -1 +0,0 @@ -Restored the deprecated :mod:`xml.etree.cElementTree` module. diff --git a/Misc/NEWS.d/next/Library/2020-05-17-02-03-09.bpo-32309.KM9psl.rst b/Misc/NEWS.d/next/Library/2020-05-17-02-03-09.bpo-32309.KM9psl.rst deleted file mode 100644 index 6272c35edf4d57..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-17-02-03-09.bpo-32309.KM9psl.rst +++ /dev/null @@ -1,4 +0,0 @@ -Added a new :term:`coroutine` :func:`asyncio.to_thread`. It is mainly used for -running IO-bound functions in a separate thread to avoid blocking the event -loop, and essentially works as a high-level version of -:meth:`~asyncio.loop.run_in_executor` that can directly take keyword arguments. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-05-18-15-26-31.bpo-40671.NeZ9Cy.rst b/Misc/NEWS.d/next/Library/2020-05-18-15-26-31.bpo-40671.NeZ9Cy.rst deleted file mode 100644 index d38b88dbf356d2..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-18-15-26-31.bpo-40671.NeZ9Cy.rst +++ /dev/null @@ -1 +0,0 @@ -Prepare ``_hashlib`` for :pep:`489` and use :c:func:`PyModule_AddType`. diff --git a/Misc/NEWS.d/next/Library/2020-05-18-15-38-25.bpo-25920.PxrLY8.rst b/Misc/NEWS.d/next/Library/2020-05-18-15-38-25.bpo-25920.PxrLY8.rst deleted file mode 100644 index cc60e976286c33..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-18-15-38-25.bpo-25920.PxrLY8.rst +++ /dev/null @@ -1,7 +0,0 @@ -On macOS, when building Python for macOS 10.4 and older, which wasn't the case -for python.org macOS installer, :func:`socket.getaddrinfo` no longer uses an -internal lock to prevent race conditions when calling ``getaddrinfo()`` which -is thread-safe since macOS 10.5. Python 3.9 requires macOS 10.6 or newer. The -internal lock caused random hang on fork when another thread was calling -:func:`socket.getaddrinfo`. The lock was also used on FreeBSD older than 5.3, -OpenBSD older than 201311 and NetBSD older than 4. diff --git a/Misc/NEWS.d/next/Library/2020-05-18-17-29-30.bpo-40626.NeZufF.rst b/Misc/NEWS.d/next/Library/2020-05-18-17-29-30.bpo-40626.NeZufF.rst deleted file mode 100644 index fe652cd7ee39d6..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-18-17-29-30.bpo-40626.NeZufF.rst +++ /dev/null @@ -1 +0,0 @@ -Add h5 file extension as MIME Type application/x-hdf5, as per HDF Group recommendation for HDF5 formatted data files. Patch contributed by Mark Schwab. diff --git a/Misc/NEWS.d/next/Library/2020-05-18-22-41-02.bpo-40614.8j3kmq.rst b/Misc/NEWS.d/next/Library/2020-05-18-22-41-02.bpo-40614.8j3kmq.rst deleted file mode 100644 index 238b98c14a3269..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-18-22-41-02.bpo-40614.8j3kmq.rst +++ /dev/null @@ -1 +0,0 @@ -:func:`ast.parse` will not parse self documenting expressions in f-strings when passed ``feature_version`` is less than ``(3, 8)``. diff --git a/Misc/NEWS.d/next/Library/2020-05-20-12-53-20.bpo-9216.ps7Yf1.rst b/Misc/NEWS.d/next/Library/2020-05-20-12-53-20.bpo-9216.ps7Yf1.rst deleted file mode 100644 index 37542e8caffd4d..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-20-12-53-20.bpo-9216.ps7Yf1.rst +++ /dev/null @@ -1,3 +0,0 @@ -func:`hashlib.new` passed ``usedforsecurity`` to OpenSSL EVP constructor -``_hashlib.new()``. test_hashlib and test_smtplib handle strict security -policy better. diff --git a/Misc/NEWS.d/next/Library/2020-05-20-13-03-28.bpo-40695.lr4aIS.rst b/Misc/NEWS.d/next/Library/2020-05-20-13-03-28.bpo-40695.lr4aIS.rst deleted file mode 100644 index 643779bab49483..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-20-13-03-28.bpo-40695.lr4aIS.rst +++ /dev/null @@ -1,3 +0,0 @@ -:mod:`hashlib` no longer falls back to builtin hash implementations when -OpenSSL provides a hash digest and the algorithm is blocked by security -policy. diff --git a/Misc/NEWS.d/next/Library/2020-05-20-14-38-04.bpo-40698.zwl5Hc.rst b/Misc/NEWS.d/next/Library/2020-05-20-14-38-04.bpo-40698.zwl5Hc.rst deleted file mode 100644 index e57624819d54a7..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-20-14-38-04.bpo-40698.zwl5Hc.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`distutils` upload creates SHA2-256 and Blake2b-256 digests. MD5 -digests is skipped if platform blocks MD5. diff --git a/Misc/NEWS.d/next/Library/2020-05-22-12-45-58.bpo-40726.7oBdMw.rst b/Misc/NEWS.d/next/Library/2020-05-22-12-45-58.bpo-40726.7oBdMw.rst deleted file mode 100644 index 7409eb3d80df64..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-22-12-45-58.bpo-40726.7oBdMw.rst +++ /dev/null @@ -1,2 +0,0 @@ -Handle cases where the ``end_lineno`` is ``None`` on -:func:`ast.increment_lineno`. diff --git a/Misc/NEWS.d/next/Library/2020-05-23-00-22-11.bpo-40737.iph-CM.rst b/Misc/NEWS.d/next/Library/2020-05-23-00-22-11.bpo-40737.iph-CM.rst deleted file mode 100644 index f068d3a091a03b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-23-00-22-11.bpo-40737.iph-CM.rst +++ /dev/null @@ -1 +0,0 @@ -Fix possible reference leak for :mod:`sqlite3` initialization. diff --git a/Misc/NEWS.d/next/Library/2020-05-23-04-18-00.bpo-37129.YoYoYo.rst b/Misc/NEWS.d/next/Library/2020-05-23-04-18-00.bpo-37129.YoYoYo.rst deleted file mode 100644 index e025e96f4f1c05..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-23-04-18-00.bpo-37129.YoYoYo.rst +++ /dev/null @@ -1 +0,0 @@ -Add a new :data:`os.RWF_APPEND` flag for :func:`os.pwritev`. diff --git a/Misc/NEWS.d/next/Library/2020-05-24-11-06-37.bpo-40756.7ZH83z.rst b/Misc/NEWS.d/next/Library/2020-05-24-11-06-37.bpo-40756.7ZH83z.rst deleted file mode 100644 index a970f5be156f53..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-24-11-06-37.bpo-40756.7ZH83z.rst +++ /dev/null @@ -1,2 +0,0 @@ -The second argument (extra) of ``LoggerAdapter.__init__`` now defaults to -None. diff --git a/Misc/NEWS.d/next/Library/2020-05-24-23-52-35.bpo-40759.DdZdaw.rst b/Misc/NEWS.d/next/Library/2020-05-24-23-52-35.bpo-40759.DdZdaw.rst deleted file mode 100644 index e77da3ac3dfa93..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-24-23-52-35.bpo-40759.DdZdaw.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the :mod:`symbol` module. diff --git a/Misc/NEWS.d/next/Library/2020-05-25-11-52-23.bpo-30064.6CICsH.rst b/Misc/NEWS.d/next/Library/2020-05-25-11-52-23.bpo-30064.6CICsH.rst deleted file mode 100644 index 904991dca16d88..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-25-11-52-23.bpo-30064.6CICsH.rst +++ /dev/null @@ -1 +0,0 @@ -Fix asyncio ``loop.sock_*`` race condition issue diff --git a/Misc/NEWS.d/next/Library/2020-05-25-22-18-38.bpo-30008.CKC3td.rst b/Misc/NEWS.d/next/Library/2020-05-25-22-18-38.bpo-30008.CKC3td.rst deleted file mode 100644 index c4cfa56ce02c58..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-25-22-18-38.bpo-30008.CKC3td.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :mod:`ssl` code to be compatible with OpenSSL 1.1.x builds that use -``no-deprecated`` and ``--api=1.1.0``. diff --git a/Misc/NEWS.d/next/Library/2020-05-27-00-09-52.bpo-16995.4niOT7.rst b/Misc/NEWS.d/next/Library/2020-05-27-00-09-52.bpo-16995.4niOT7.rst deleted file mode 100644 index 88b95998d085f6..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-27-00-09-52.bpo-16995.4niOT7.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :func:`base64.b32hexencode` and :func:`base64.b32hexdecode` to support the -Base32 Encoding with Extended Hex Alphabet. diff --git a/Misc/NEWS.d/next/Library/2020-05-27-17-00-18.bpo-40795.eZSnHA.rst b/Misc/NEWS.d/next/Library/2020-05-27-17-00-18.bpo-40795.eZSnHA.rst deleted file mode 100644 index dd02fb05cab5e7..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-27-17-00-18.bpo-40795.eZSnHA.rst +++ /dev/null @@ -1,4 +0,0 @@ -:mod:`ctypes` module: If ctypes fails to convert the result of a callback or -if a ctypes callback function raises an exception, sys.unraisablehook is now -called with an exception set. Previously, the error was logged into stderr -by :c:func:`PyErr_Print`. diff --git a/Misc/NEWS.d/next/Library/2020-05-27-18-04-52.bpo-40791.IzpNor.rst b/Misc/NEWS.d/next/Library/2020-05-27-18-04-52.bpo-40791.IzpNor.rst deleted file mode 100644 index b88f308ec3b522..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-27-18-04-52.bpo-40791.IzpNor.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`hashlib.compare_digest` uses OpenSSL's ``CRYPTO_memcmp()`` function -when OpenSSL is available. diff --git a/Misc/NEWS.d/next/Library/2020-05-27-21-27-01.bpo-40767.L5MnVV.rst b/Misc/NEWS.d/next/Library/2020-05-27-21-27-01.bpo-40767.L5MnVV.rst deleted file mode 100644 index 4bebb311b4d546..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-27-21-27-01.bpo-40767.L5MnVV.rst +++ /dev/null @@ -1,3 +0,0 @@ -:mod:`webbrowser` now properly finds the default browser in pure Wayland -systems by checking the WAYLAND_DISPLAY environment variable. Patch -contributed by Jérémy Attali. diff --git a/Misc/NEWS.d/next/Library/2020-05-27-22-19-42.bpo-40792.87Yx01.rst b/Misc/NEWS.d/next/Library/2020-05-27-22-19-42.bpo-40792.87Yx01.rst deleted file mode 100644 index 032a96c6a5cb6a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-27-22-19-42.bpo-40792.87Yx01.rst +++ /dev/null @@ -1,2 +0,0 @@ -The result of :func:`operator.index` now always has exact type :class:`int`. -Previously, the result could have been an instance of a subclass of ``int``. diff --git a/Misc/NEWS.d/next/Library/2020-05-28-16-51-00.bpo-38488.hFQNgA.rst b/Misc/NEWS.d/next/Library/2020-05-28-16-51-00.bpo-38488.hFQNgA.rst deleted file mode 100644 index c44da9fecb605b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-28-16-51-00.bpo-38488.hFQNgA.rst +++ /dev/null @@ -1 +0,0 @@ -Update ensurepip to install pip 20.1.1 and setuptools 47.1.0. diff --git a/Misc/NEWS.d/next/Library/2020-05-28-17-32-29.bpo-40777.1kJU6N.rst b/Misc/NEWS.d/next/Library/2020-05-28-17-32-29.bpo-40777.1kJU6N.rst deleted file mode 100644 index 761bc83562c34a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-28-17-32-29.bpo-40777.1kJU6N.rst +++ /dev/null @@ -1,2 +0,0 @@ -Initialize PyDateTime_IsoCalendarDateType.tp_base at run-time to avoid -errors on some compilers. diff --git a/Misc/NEWS.d/next/Library/2020-05-30-08-10-23.bpo-40744.jKURVV.rst b/Misc/NEWS.d/next/Library/2020-05-30-08-10-23.bpo-40744.jKURVV.rst deleted file mode 100644 index 2d1d1f9a20e32e..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-30-08-10-23.bpo-40744.jKURVV.rst +++ /dev/null @@ -1,4 +0,0 @@ -The :mod:`sqlite3` module uses SQLite API functions that require SQLite -v3.7.3 or higher. This patch removes support for older SQLite versions, and -explicitly requires SQLite 3.7.3 both at build, compile and runtime. Patch by -Sergey Fedoseev and Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2020-05-30-12-44-29.bpo-39384.Iqxy3q.rst b/Misc/NEWS.d/next/Library/2020-05-30-12-44-29.bpo-39384.Iqxy3q.rst deleted file mode 100644 index 482ae624da079d..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-30-12-44-29.bpo-39384.Iqxy3q.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed email.contentmanager to allow set_content() to set a null string. diff --git a/Misc/NEWS.d/next/Library/2020-05-30-14-19-47.bpo-26407.MjWLO1.rst b/Misc/NEWS.d/next/Library/2020-05-30-14-19-47.bpo-26407.MjWLO1.rst deleted file mode 100644 index d0e45cf1b1f2f4..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-30-14-19-47.bpo-26407.MjWLO1.rst +++ /dev/null @@ -1,3 +0,0 @@ -Unexpected errors in calling the ``__iter__`` method are no longer masked -by ``TypeError`` in :func:`csv.reader`, :func:`csv.writer.writerow` and -:meth:`csv.writer.writerows`. diff --git a/Misc/NEWS.d/next/Library/2020-05-30-18-48-58.bpo-40755.IyOe2J.rst b/Misc/NEWS.d/next/Library/2020-05-30-18-48-58.bpo-40755.IyOe2J.rst deleted file mode 100644 index be5653ea58f275..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-30-18-48-58.bpo-40755.IyOe2J.rst +++ /dev/null @@ -1 +0,0 @@ -Add rich comparisons to collections.Counter(). diff --git a/Misc/NEWS.d/next/Library/2020-05-31-15-52-18.bpo-40834.MO9_hb.rst b/Misc/NEWS.d/next/Library/2020-05-31-15-52-18.bpo-40834.MO9_hb.rst deleted file mode 100644 index 272783773ff940..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-31-15-52-18.bpo-40834.MO9_hb.rst +++ /dev/null @@ -1 +0,0 @@ -Fix truncate when sending str object with_xxsubinterpreters.channel_send. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-05-31-23-32-36.bpo-17005.JlRUGB.rst b/Misc/NEWS.d/next/Library/2020-05-31-23-32-36.bpo-17005.JlRUGB.rst deleted file mode 100644 index 0fd01fb6230931..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-31-23-32-36.bpo-17005.JlRUGB.rst +++ /dev/null @@ -1,4 +0,0 @@ -The topological sort functionality that was introduced initially in the -:mod:`functools` module has been moved to a new :mod:`graphlib` module to -better accommodate the new tools and keep the original scope of the -:mod:`functools` module. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Library/2020-06-01-02-16-29.bpo-39314.0T9hlA.rst b/Misc/NEWS.d/next/Library/2020-06-01-02-16-29.bpo-39314.0T9hlA.rst deleted file mode 100644 index e805332efb6268..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-01-02-16-29.bpo-39314.0T9hlA.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`rlcompleter.Completer` and the standard Python shell now close the -parenthesis for functions that take no arguments. Patch contributed by Rémi -Lapeyre. diff --git a/Misc/NEWS.d/next/Library/2020-06-02-02-16-02.bpo-39791.StCJlA.rst b/Misc/NEWS.d/next/Library/2020-06-02-02-16-02.bpo-39791.StCJlA.rst deleted file mode 100644 index 61753a57ca8b74..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-02-02-16-02.bpo-39791.StCJlA.rst +++ /dev/null @@ -1 +0,0 @@ -Built-in loaders (SourceFileLoader and ZipImporter) now supply ``TraversableResources`` implementations for ``ResourceReader``, and the fallback function has been removed. diff --git a/Misc/NEWS.d/next/Library/2020-06-02-23-49-07.bpo-32604.ZN4V4l.rst b/Misc/NEWS.d/next/Library/2020-06-02-23-49-07.bpo-32604.ZN4V4l.rst deleted file mode 100644 index af284b06eaed6e..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-02-23-49-07.bpo-32604.ZN4V4l.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix reference leak in the :mod:`select` module when the module is -imported in a subinterpreter. diff --git a/Misc/NEWS.d/next/Library/2020-06-04-16-25-15.bpo-40807.yYyLWx.rst b/Misc/NEWS.d/next/Library/2020-06-04-16-25-15.bpo-40807.yYyLWx.rst deleted file mode 100644 index c64a86295d7700..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-04-16-25-15.bpo-40807.yYyLWx.rst +++ /dev/null @@ -1,2 +0,0 @@ -Stop codeop._maybe_compile, used by code.InteractiveInterpreter (and IDLE). -from emitting each warning three times. diff --git a/Misc/NEWS.d/next/Library/2020-06-05-19-29-10.bpo-39791._CcO3d.rst b/Misc/NEWS.d/next/Library/2020-06-05-19-29-10.bpo-39791._CcO3d.rst deleted file mode 100644 index 73e0cbb013f840..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-05-19-29-10.bpo-39791._CcO3d.rst +++ /dev/null @@ -1 +0,0 @@ -Refresh importlib.metadata from importlib_metadata 1.6.1. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-06-05-20-00-18.bpo-40876.zDhiZj.rst b/Misc/NEWS.d/next/Library/2020-06-05-20-00-18.bpo-40876.zDhiZj.rst deleted file mode 100644 index 75f62addbabbc5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-05-20-00-18.bpo-40876.zDhiZj.rst +++ /dev/null @@ -1 +0,0 @@ -Clarify error message in the :mod:`csv` module. diff --git a/Misc/NEWS.d/next/Library/2020-06-06-02-42-26.bpo-40884.n7fOwS.rst b/Misc/NEWS.d/next/Library/2020-06-06-02-42-26.bpo-40884.n7fOwS.rst deleted file mode 100644 index 64990e8023fba7..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-06-02-42-26.bpo-40884.n7fOwS.rst +++ /dev/null @@ -1,3 +0,0 @@ -Added a `defaults` parameter to :class:`logging.Formatter`, to allow -specifying default values for custom fields. Patch by Asaf Alon and Bar -Harel. diff --git a/Misc/NEWS.d/next/Library/2020-06-06-14-09-55.bpo-33689.EFUDH7.rst b/Misc/NEWS.d/next/Library/2020-06-06-14-09-55.bpo-33689.EFUDH7.rst deleted file mode 100644 index bc0756d02ddc9e..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-06-14-09-55.bpo-33689.EFUDH7.rst +++ /dev/null @@ -1,4 +0,0 @@ -Ignore empty or whitespace-only lines in .pth files. This matches the -documentated behavior. Before, empty lines caused the site-packages -dir to appear multiple times in sys.path. -By Ido Michael, contributors Malcolm Smith and Tal Einat. diff --git a/Misc/NEWS.d/next/Library/2020-06-08-18-59-16.bpo-23427.ilg1Cz.rst b/Misc/NEWS.d/next/Library/2020-06-08-18-59-16.bpo-23427.ilg1Cz.rst deleted file mode 100644 index 37382975bb4fc2..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-08-18-59-16.bpo-23427.ilg1Cz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :data:`sys.orig_argv` attribute: the list of the original command line -arguments passed to the Python executable. diff --git a/Misc/NEWS.d/next/Library/2020-06-11-11-07-10.bpo-40939.-D5Asl.rst b/Misc/NEWS.d/next/Library/2020-06-11-11-07-10.bpo-40939.-D5Asl.rst deleted file mode 100644 index 0e831129dd87eb..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-11-11-07-10.bpo-40939.-D5Asl.rst +++ /dev/null @@ -1 +0,0 @@ -Use the new PEG parser when generating the stdlib :mod:`keyword` module. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-06-12-10-44-15.bpo-40855.jSot83.rst b/Misc/NEWS.d/next/Library/2020-06-12-10-44-15.bpo-40855.jSot83.rst deleted file mode 100644 index 201d510327a478..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-12-10-44-15.bpo-40855.jSot83.rst +++ /dev/null @@ -1,2 +0,0 @@ -The standard deviation and variance functions in the statistics module were -ignoring their mu and xbar arguments. diff --git a/Misc/NEWS.d/next/Library/2020-06-12-11-55-30.bpo-40955.huixCg.rst b/Misc/NEWS.d/next/Library/2020-06-12-11-55-30.bpo-40955.huixCg.rst deleted file mode 100644 index 9a9803044ec96f..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-12-11-55-30.bpo-40955.huixCg.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a minor memory leak in :mod:`subprocess` module when extra_groups was specified. diff --git a/Misc/NEWS.d/next/Library/2020-06-13-12-04-50.bpo-40924.SM_luS.rst b/Misc/NEWS.d/next/Library/2020-06-13-12-04-50.bpo-40924.SM_luS.rst deleted file mode 100644 index 4e4c6e88ac5729..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-13-12-04-50.bpo-40924.SM_luS.rst +++ /dev/null @@ -1,3 +0,0 @@ -Ensure ``importlib.resources.path`` returns an extant path for the -SourceFileLoader's resource reader. Avoids the regression identified in -master while a long-term solution is devised. diff --git a/Misc/NEWS.d/next/Library/2020-06-15-00-13-57.bpo-40967._dx3OO.rst b/Misc/NEWS.d/next/Library/2020-06-15-00-13-57.bpo-40967._dx3OO.rst deleted file mode 100644 index 4694d991babd77..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-15-00-13-57.bpo-40967._dx3OO.rst +++ /dev/null @@ -1,2 +0,0 @@ -Removed :meth:`asyncio.Task.current_task` and -:meth:`asyncio.Task.all_tasks`. Patch contributed by Rémi Lapeyre. diff --git a/Misc/NEWS.d/next/Library/2020-06-15-12-22-53.bpo-40448.1dk8Bu.rst b/Misc/NEWS.d/next/Library/2020-06-15-12-22-53.bpo-40448.1dk8Bu.rst deleted file mode 100644 index a755c5faa671c3..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-15-12-22-53.bpo-40448.1dk8Bu.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`ensurepip` now disables the use of `pip` cache when installing the -bundled versions of `pip` and `setuptools`. Patch by Krzysztof Konopko. diff --git a/Misc/NEWS.d/next/Library/2020-06-17-17-26-24.bpo-41002.NPBItE.rst b/Misc/NEWS.d/next/Library/2020-06-17-17-26-24.bpo-41002.NPBItE.rst deleted file mode 100644 index c3eebb7b9aed71..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-17-17-26-24.bpo-41002.NPBItE.rst +++ /dev/null @@ -1 +0,0 @@ -Improve performance of HTTPResponse.read with a given amount. Patch by Bruce Merry. diff --git a/Misc/NEWS.d/next/Library/2020-06-17-23-49-45.bpo-35018.NP5_Qk.rst b/Misc/NEWS.d/next/Library/2020-06-17-23-49-45.bpo-35018.NP5_Qk.rst deleted file mode 100644 index f764323ae631cf..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-17-23-49-45.bpo-35018.NP5_Qk.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add the :class:`xml.sax.handler.LexicalHandler` class that is present in -other SAX XML implementations. diff --git a/Misc/NEWS.d/next/Library/2020-06-18-10-34-59.bpo-41025.elf_nz.rst b/Misc/NEWS.d/next/Library/2020-06-18-10-34-59.bpo-41025.elf_nz.rst deleted file mode 100644 index 21e184d0a40631..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-18-10-34-59.bpo-41025.elf_nz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed an issue preventing the C implementation of :class:`zoneinfo.ZoneInfo` -from being subclassed. diff --git a/Misc/NEWS.d/next/Library/2020-06-20-00-19-30.bpo-41043.p-Pk-H.rst b/Misc/NEWS.d/next/Library/2020-06-20-00-19-30.bpo-41043.p-Pk-H.rst deleted file mode 100644 index 9c6020eb8d7383..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-20-00-19-30.bpo-41043.p-Pk-H.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed the use of :func:`~glob.glob` in the stdlib: literal part of the path -is now always correctly escaped. diff --git a/Misc/NEWS.d/next/Library/2020-06-20-10-16-57.bpo-41048.hEXB-B.rst b/Misc/NEWS.d/next/Library/2020-06-20-10-16-57.bpo-41048.hEXB-B.rst deleted file mode 100644 index 2595900137d696..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-20-10-16-57.bpo-41048.hEXB-B.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`mimetypes.read_mime_types` function reads the rule file using UTF-8 encoding, not the locale encoding. -Patch by Srinivas Reddy Thatiparthy. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-06-20-18-33-03.bpo-41056.gTH4Bq.rst b/Misc/NEWS.d/next/Library/2020-06-20-18-33-03.bpo-41056.gTH4Bq.rst deleted file mode 100644 index 0439d82a50ad12..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-20-18-33-03.bpo-41056.gTH4Bq.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed an instance where a MemoryError within the zoneinfo module might not be reported or not reported at its source. (found by Coverity) \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-06-20-18-35-43.bpo-41056.Garcle.rst b/Misc/NEWS.d/next/Library/2020-06-20-18-35-43.bpo-41056.Garcle.rst deleted file mode 100644 index 1776f0d1cf8a32..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-20-18-35-43.bpo-41056.Garcle.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a NULL pointer dereference within the ssl module during a MemoryError in the keylog callback. (discovered by Coverity) \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-06-20-18-37-29.bpo-41056.d9v_uL.rst b/Misc/NEWS.d/next/Library/2020-06-20-18-37-29.bpo-41056.d9v_uL.rst deleted file mode 100644 index ddcc1102d5ed72..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-20-18-37-29.bpo-41056.d9v_uL.rst +++ /dev/null @@ -1 +0,0 @@ -Invalid file descriptor values are now prevented from being passed to os.fpathconf. (discovered by Coverity) \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-06-20-21-03-55.bpo-41058.gztdZy.rst b/Misc/NEWS.d/next/Library/2020-06-20-21-03-55.bpo-41058.gztdZy.rst deleted file mode 100644 index 6ac90098aa52b0..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-20-21-03-55.bpo-41058.gztdZy.rst +++ /dev/null @@ -1 +0,0 @@ -:func:`pdb.find_function` now correctly determines the source file encoding. diff --git a/Misc/NEWS.d/next/Library/2020-06-22-10-25-39.bpo-41068._bX2BW.rst b/Misc/NEWS.d/next/Library/2020-06-22-10-25-39.bpo-41068._bX2BW.rst deleted file mode 100644 index 20580c7886fac5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-22-10-25-39.bpo-41068._bX2BW.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed reading files with non-ASCII names from ZIP archive directly after -writing them. diff --git a/Misc/NEWS.d/next/Library/2020-06-22-20-08-40.bpo-31938.EVuko9.rst b/Misc/NEWS.d/next/Library/2020-06-22-20-08-40.bpo-31938.EVuko9.rst deleted file mode 100644 index 0488e94d42e8c5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-22-20-08-40.bpo-31938.EVuko9.rst +++ /dev/null @@ -1 +0,0 @@ -Fix default-value signatures of several functions in the :mod:`select` module - by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Library/2020-06-23-06-09-59.bpo-40521.HUfxP7.rst b/Misc/NEWS.d/next/Library/2020-06-23-06-09-59.bpo-40521.HUfxP7.rst deleted file mode 100644 index 7689a1470b034d..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-23-06-09-59.bpo-40521.HUfxP7.rst +++ /dev/null @@ -1 +0,0 @@ -Remove freelist from collections.deque(). diff --git a/Misc/NEWS.d/next/Library/2020-06-25-10-11-47.bpo-31082.HsgDkx.rst b/Misc/NEWS.d/next/Library/2020-06-25-10-11-47.bpo-31082.HsgDkx.rst deleted file mode 100644 index 9746d33a496380..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-25-10-11-47.bpo-31082.HsgDkx.rst +++ /dev/null @@ -1 +0,0 @@ -Use the term "iterable" in the docstring for :func:`functools.reduce`. diff --git a/Misc/NEWS.d/next/Library/2020-06-27-13-51-36.bpo-41138.bIpf7g.rst b/Misc/NEWS.d/next/Library/2020-06-27-13-51-36.bpo-41138.bIpf7g.rst deleted file mode 100644 index 839d430e89b660..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-27-13-51-36.bpo-41138.bIpf7g.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed the :mod:`trace` module CLI for Python source files with non-UTF-8 -encoding. diff --git a/Misc/NEWS.d/next/Library/2020-06-28-21-16-51.bpo-40874.YImvzA.rst b/Misc/NEWS.d/next/Library/2020-06-28-21-16-51.bpo-40874.YImvzA.rst deleted file mode 100644 index a43eab8f4dcdd0..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-28-21-16-51.bpo-40874.YImvzA.rst +++ /dev/null @@ -1 +0,0 @@ -The decimal module now requires libmpdec-2.5.0. diff --git a/Misc/NEWS.d/next/Library/2020-06-30-20-50-51.bpo-41161.QTdJjz.rst b/Misc/NEWS.d/next/Library/2020-06-30-20-50-51.bpo-41161.QTdJjz.rst deleted file mode 100644 index 0d8fb521bad506..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-30-20-50-51.bpo-41161.QTdJjz.rst +++ /dev/null @@ -1,2 +0,0 @@ -The decimal module now requires libmpdec-2.5.0. Users of ---with-system-libmpdec should update their system library. diff --git a/Misc/NEWS.d/next/Library/2020-07-01-17-33-50.bpo-41182.FPFI0N.rst b/Misc/NEWS.d/next/Library/2020-07-01-17-33-50.bpo-41182.FPFI0N.rst deleted file mode 100644 index ae31db512abdc1..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-01-17-33-50.bpo-41182.FPFI0N.rst +++ /dev/null @@ -1 +0,0 @@ -selector: use DefaultSelector based upon implementation diff --git a/Misc/NEWS.d/next/Library/2020-07-02-11-53-45.bpo-41193.8-Tnql.rst b/Misc/NEWS.d/next/Library/2020-07-02-11-53-45.bpo-41193.8-Tnql.rst deleted file mode 100644 index 8807d9c21febd5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-02-11-53-45.bpo-41193.8-Tnql.rst +++ /dev/null @@ -1,4 +0,0 @@ -The ``write_history()`` atexit function of the readline completer now -ignores any :exc:`OSError` to ignore error if the filesystem is read-only, -instead of only ignoring :exc:`FileNotFoundError` and -:exc:`PermissionError`. diff --git a/Misc/NEWS.d/next/Library/2020-07-02-15-03-04.bpo-41195.cEnpO3.rst b/Misc/NEWS.d/next/Library/2020-07-02-15-03-04.bpo-41195.cEnpO3.rst deleted file mode 100644 index f96d5fadbdc7b8..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-02-15-03-04.bpo-41195.cEnpO3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add read-only ssl.SSLContext.security_level attribute to retrieve the -context's security level. diff --git a/Misc/NEWS.d/next/Library/2020-07-03-13-15-08.bpo-41194.djrKjs.rst b/Misc/NEWS.d/next/Library/2020-07-03-13-15-08.bpo-41194.djrKjs.rst deleted file mode 100644 index d63a0e5222ba9b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-03-13-15-08.bpo-41194.djrKjs.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a crash in the ``_ast`` module: it can no longer be loaded more than once. -It now uses a global state rather than a module state. diff --git a/Misc/NEWS.d/next/Library/2020-07-04-21-56-46.bpo-39168.DQWsXj.rst b/Misc/NEWS.d/next/Library/2020-07-04-21-56-46.bpo-39168.DQWsXj.rst deleted file mode 100644 index 667885eccd9c79..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-04-21-56-46.bpo-39168.DQWsXj.rst +++ /dev/null @@ -1 +0,0 @@ -Remove the ``__new__`` method of :class:`typing.Generic`. diff --git a/Misc/NEWS.d/next/Library/2020-07-05-19-16-02.bpo-29727.Q6Z2rg.rst b/Misc/NEWS.d/next/Library/2020-07-05-19-16-02.bpo-29727.Q6Z2rg.rst deleted file mode 100644 index 85cfa4f8938112..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-05-19-16-02.bpo-29727.Q6Z2rg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Register :class:`array.array` as a -:class:`~collections.abc.MutableSequence`. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Library/2020-07-06-16-58-53.bpo-41207.Emw7Nk.rst b/Misc/NEWS.d/next/Library/2020-07-06-16-58-53.bpo-41207.Emw7Nk.rst deleted file mode 100644 index db99c63f948837..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-06-16-58-53.bpo-41207.Emw7Nk.rst +++ /dev/null @@ -1 +0,0 @@ -In distutils.spawn, restore expectation that DistutilsExecError is raised when the command is not found. diff --git a/Misc/NEWS.d/next/Library/2020-07-07-21-56-26.bpo-41235.H2csMU.rst b/Misc/NEWS.d/next/Library/2020-07-07-21-56-26.bpo-41235.H2csMU.rst deleted file mode 100644 index c55275bb1c622b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-07-21-56-26.bpo-41235.H2csMU.rst +++ /dev/null @@ -1 +0,0 @@ -Fix the error handling in :meth:`ssl.SSLContext.load_dh_params`. diff --git a/Misc/NEWS.d/next/Library/2020-07-11-00-15-01.bpo-41273.SVrsJh.rst b/Misc/NEWS.d/next/Library/2020-07-11-00-15-01.bpo-41273.SVrsJh.rst deleted file mode 100644 index c08204b9908c63..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-11-00-15-01.bpo-41273.SVrsJh.rst +++ /dev/null @@ -1,3 +0,0 @@ -Speed up any transport using ``_ProactorReadPipeTransport`` by calling -``recv_into`` instead of ``recv``, thus not creating a new buffer for each -``recv`` call in the transport's read loop. diff --git a/Misc/NEWS.d/next/Library/2020-07-12-22-16-58.bpo-39017.x3Cg-9.rst b/Misc/NEWS.d/next/Library/2020-07-12-22-16-58.bpo-39017.x3Cg-9.rst deleted file mode 100644 index ad26676f8b8563..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-12-22-16-58.bpo-39017.x3Cg-9.rst +++ /dev/null @@ -1 +0,0 @@ -Avoid infinite loop when reading specially crafted TAR files using the tarfile module (CVE-2019-20907). diff --git a/Misc/NEWS.d/next/Library/2020-07-13-15-06-35.bpo-41288.8mn5P-.rst b/Misc/NEWS.d/next/Library/2020-07-13-15-06-35.bpo-41288.8mn5P-.rst deleted file mode 100644 index 3c3adbabf16ff1..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-13-15-06-35.bpo-41288.8mn5P-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Unpickling invalid NEWOBJ_EX opcode with the C implementation raises now -UnpicklingError instead of crashing. diff --git a/Misc/NEWS.d/next/Library/2020-07-18-18-07-40.bpo-41333.upkHIm.rst b/Misc/NEWS.d/next/Library/2020-07-18-18-07-40.bpo-41333.upkHIm.rst deleted file mode 100644 index 73e8b1199772de..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-18-18-07-40.bpo-41333.upkHIm.rst +++ /dev/null @@ -1 +0,0 @@ -:meth:`collections.OrderedDict.pop` is now 2 times faster. diff --git a/Misc/NEWS.d/next/Library/2020-07-20-13-27-48.bpo-41344.iKipNd.rst b/Misc/NEWS.d/next/Library/2020-07-20-13-27-48.bpo-41344.iKipNd.rst deleted file mode 100644 index 475bc9bddb0d54..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-20-13-27-48.bpo-41344.iKipNd.rst +++ /dev/null @@ -1 +0,0 @@ -Prevent creating :class:`shared_memory.SharedMemory` objects with :code:`size=0`. diff --git a/Misc/NEWS.d/next/Library/2020-07-20-19-13-17.bpo-41341.wqrj8C.rst b/Misc/NEWS.d/next/Library/2020-07-20-19-13-17.bpo-41341.wqrj8C.rst deleted file mode 100644 index c78b24d2faae72..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-20-19-13-17.bpo-41341.wqrj8C.rst +++ /dev/null @@ -1 +0,0 @@ -Recursive evaluation of `typing.ForwardRef` in `get_type_hints`. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-07-21-16-20-55.bpo-35328.jXovHb.rst b/Misc/NEWS.d/next/Library/2020-07-21-16-20-55.bpo-35328.jXovHb.rst deleted file mode 100644 index f4d1c6511d0d1c..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-21-16-20-55.bpo-35328.jXovHb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Set the environment variable ``VIRTUAL_ENV_PROMPT`` at :mod:`venv` -activation. diff --git a/Misc/NEWS.d/next/Library/2020-07-21-21-45-55.bpo-41364.5O-k7A.rst b/Misc/NEWS.d/next/Library/2020-07-21-21-45-55.bpo-41364.5O-k7A.rst deleted file mode 100644 index f136e892ae5fe0..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-21-21-45-55.bpo-41364.5O-k7A.rst +++ /dev/null @@ -1 +0,0 @@ -Reduce import overhead of :mod:`uuid`. diff --git a/Misc/NEWS.d/next/Library/2020-07-23-01-18-34.bpo-41317.O17Z6x.rst b/Misc/NEWS.d/next/Library/2020-07-23-01-18-34.bpo-41317.O17Z6x.rst deleted file mode 100644 index 1af985e90e3e98..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-23-01-18-34.bpo-41317.O17Z6x.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use add_done_callback() in asyncio.loop.sock_accept() to unsubscribe reader -early on cancellation. diff --git a/Misc/NEWS.d/next/Library/2020-07-26-21-18-43.bpo-41384.MlzIgV.rst b/Misc/NEWS.d/next/Library/2020-07-26-21-18-43.bpo-41384.MlzIgV.rst deleted file mode 100644 index d797374a09e6f6..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-26-21-18-43.bpo-41384.MlzIgV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Raise TclError instead of TypeError when an unknown option is passed to -tkinter.OptionMenu. diff --git a/Misc/NEWS.d/next/Library/2020-07-28-12-08-58.bpo-41316.bSCbK4.rst b/Misc/NEWS.d/next/Library/2020-07-28-12-08-58.bpo-41316.bSCbK4.rst deleted file mode 100644 index 139a170866ed49..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-28-12-08-58.bpo-41316.bSCbK4.rst +++ /dev/null @@ -1 +0,0 @@ -Fix the :mod:`tarfile` module to write only basename of TAR file to GZIP compression header. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-07-30-14-56-58.bpo-41440.rju34k.rst b/Misc/NEWS.d/next/Library/2020-07-30-14-56-58.bpo-41440.rju34k.rst deleted file mode 100644 index 3ee1f656d1870c..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-30-14-56-58.bpo-41440.rju34k.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`os.cpu_count()` support for VxWorks RTOS. diff --git a/Misc/NEWS.d/next/Library/2020-08-01-00-51-15.bpo-41421.dHKRVB.rst b/Misc/NEWS.d/next/Library/2020-08-01-00-51-15.bpo-41421.dHKRVB.rst deleted file mode 100644 index cf291c60d8ad57..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-01-00-51-15.bpo-41421.dHKRVB.rst +++ /dev/null @@ -1,3 +0,0 @@ -Make an algebraic simplification to random.paretovariate(). It now is -slightly less subject to round-off error and is slightly faster. Inputs that -used to cause ZeroDivisionError now cause an OverflowError instead. diff --git a/Misc/NEWS.d/next/Library/2020-08-03-01-59-48.bpo-41425.KJo6zF.rst b/Misc/NEWS.d/next/Library/2020-08-03-01-59-48.bpo-41425.KJo6zF.rst deleted file mode 100644 index 617df72faeb37f..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-03-01-59-48.bpo-41425.KJo6zF.rst +++ /dev/null @@ -1 +0,0 @@ -Make tkinter doc example runnable. diff --git a/Misc/NEWS.d/next/Library/2020-08-04-00-20-30.bpo-41467.Z8DgTL.rst b/Misc/NEWS.d/next/Library/2020-08-04-00-20-30.bpo-41467.Z8DgTL.rst deleted file mode 100644 index f12693e117631a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-04-00-20-30.bpo-41467.Z8DgTL.rst +++ /dev/null @@ -1,3 +0,0 @@ -On Windows, fix asyncio ``recv_into()`` return value when the socket/pipe is -closed (:exc:`BrokenPipeError`): return ``0`` rather than an empty byte -string (``b''``). diff --git a/Misc/NEWS.d/next/Library/2020-08-07-06-06-29.bpo-41497.aBtsWz.rst b/Misc/NEWS.d/next/Library/2020-08-07-06-06-29.bpo-41497.aBtsWz.rst deleted file mode 100644 index 2c863ed7ffa3fa..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-07-06-06-29.bpo-41497.aBtsWz.rst +++ /dev/null @@ -1 +0,0 @@ -Fix potential UnicodeDecodeError in dis module. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-08-07-15-18-16.bpo-41503.IYftcu.rst b/Misc/NEWS.d/next/Library/2020-08-07-15-18-16.bpo-41503.IYftcu.rst deleted file mode 100644 index c34996d881937b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-07-15-18-16.bpo-41503.IYftcu.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a race between setTarget and flush in logging.handlers.MemoryHandler. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-08-09-18-16-05.bpo-41513.e6K6EK.rst b/Misc/NEWS.d/next/Library/2020-08-09-18-16-05.bpo-41513.e6K6EK.rst deleted file mode 100644 index cfb9f98c376a02..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-09-18-16-05.bpo-41513.e6K6EK.rst +++ /dev/null @@ -1,2 +0,0 @@ -Minor algorithmic improvement to math.hypot() and math.dist() giving small -gains in speed and accuracy. diff --git a/Misc/NEWS.d/next/Library/2020-08-12-07-43-31.bpo-41528.bu83oD.rst b/Misc/NEWS.d/next/Library/2020-08-12-07-43-31.bpo-41528.bu83oD.rst deleted file mode 100644 index a4ba57c2438ed6..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-12-07-43-31.bpo-41528.bu83oD.rst +++ /dev/null @@ -1 +0,0 @@ -turtle uses math module functions to convert degrees to radians and vice versa and to calculate vector norm \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-08-12-13-25-16.bpo-41520.BEUWa4.rst b/Misc/NEWS.d/next/Library/2020-08-12-13-25-16.bpo-41520.BEUWa4.rst deleted file mode 100644 index 0e140d91bb4b61..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-12-13-25-16.bpo-41520.BEUWa4.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :mod:`codeop` regression that prevented turning compile warnings into errors. diff --git a/Misc/NEWS.d/next/Library/2020-08-13-08-07-25.bpo-40782.aGZqmB.rst b/Misc/NEWS.d/next/Library/2020-08-13-08-07-25.bpo-40782.aGZqmB.rst deleted file mode 100644 index d4c7e0e2419df4..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-13-08-07-25.bpo-40782.aGZqmB.rst +++ /dev/null @@ -1 +0,0 @@ -Change the method asyncio.AbstractEventLoop.run_in_executor to not be a coroutine. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-08-15-15-21-40.bpo-37658.f9nivB.rst b/Misc/NEWS.d/next/Library/2020-08-15-15-21-40.bpo-37658.f9nivB.rst deleted file mode 100644 index 694fbbbf346dc8..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-15-15-21-40.bpo-37658.f9nivB.rst +++ /dev/null @@ -1,2 +0,0 @@ -:meth:`asyncio.wait_for` now properly handles races between cancellation of -itself and the completion of the wrapped awaitable. diff --git a/Misc/NEWS.d/next/Library/2020-08-15-15-50-12.bpo-32751.85je5X.rst b/Misc/NEWS.d/next/Library/2020-08-15-15-50-12.bpo-32751.85je5X.rst deleted file mode 100644 index c172ce5d9e9487..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-15-15-50-12.bpo-32751.85je5X.rst +++ /dev/null @@ -1,3 +0,0 @@ -When cancelling the task due to a timeout, :meth:`asyncio.wait_for` will now -wait until the cancellation is complete also in the case when *timeout* is -<= 0, like it does with positive timeouts. diff --git a/Misc/NEWS.d/next/Library/2020-08-15-18-17-21.bpo-39994.dOgPOh.rst b/Misc/NEWS.d/next/Library/2020-08-15-18-17-21.bpo-39994.dOgPOh.rst deleted file mode 100644 index 46876c15ea199c..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-15-18-17-21.bpo-39994.dOgPOh.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed pprint's handling of dict subclasses that override __repr__. diff --git a/Misc/NEWS.d/next/Library/2020-08-21-15-51-15.bpo-41609.JmiUKG.rst b/Misc/NEWS.d/next/Library/2020-08-21-15-51-15.bpo-41609.JmiUKG.rst deleted file mode 100644 index ecaf40eee7babf..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-21-15-51-15.bpo-41609.JmiUKG.rst +++ /dev/null @@ -1 +0,0 @@ -The pdb whatis command correctly reports instance methods as 'Method' rather than 'Function'. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-08-23-14-23-18.bpo-41513.DGqc_I.rst b/Misc/NEWS.d/next/Library/2020-08-23-14-23-18.bpo-41513.DGqc_I.rst deleted file mode 100644 index b4d0d9b63cf87d..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-23-14-23-18.bpo-41513.DGqc_I.rst +++ /dev/null @@ -1,3 +0,0 @@ -Improved the accuracy of math.hypot(). Internally, each step is computed -with extra precision so that the result is now almost always correctly -rounded. diff --git a/Misc/NEWS.d/next/Library/2020-08-29-16-07-36.bpo-41662.Mn79zh.rst b/Misc/NEWS.d/next/Library/2020-08-29-16-07-36.bpo-41662.Mn79zh.rst deleted file mode 100644 index 0571c2d110beeb..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-29-16-07-36.bpo-41662.Mn79zh.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed crash when mutate list of parameters during iteration in :mod:`sqlite3`. diff --git a/Misc/NEWS.d/next/Library/2020-08-29-16-45-12.bpo-41638.iZfW5N.rst b/Misc/NEWS.d/next/Library/2020-08-29-16-45-12.bpo-41638.iZfW5N.rst deleted file mode 100644 index 8ab7b5e9903dcb..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-29-16-45-12.bpo-41638.iZfW5N.rst +++ /dev/null @@ -1,3 +0,0 @@ -:exc:`~sqlite3.ProgrammingError` message for absent parameter in :mod:`sqlite3` -contains now the name of the parameter instead of its index when parameters -are supplied as a dict. diff --git a/Misc/NEWS.d/next/Library/2020-08-30-10-24-26.bpo-39010._mzXJW.rst b/Misc/NEWS.d/next/Library/2020-08-30-10-24-26.bpo-39010._mzXJW.rst deleted file mode 100644 index 0d9015b490e4cb..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-30-10-24-26.bpo-39010._mzXJW.rst +++ /dev/null @@ -1,2 +0,0 @@ -Restarting a ``ProactorEventLoop`` on Windows no longer logs spurious -``ConnectionResetErrors``. diff --git a/Misc/NEWS.d/next/Library/2020-08-30-21-38-57.bpo-41662.6e9iZn.rst b/Misc/NEWS.d/next/Library/2020-08-30-21-38-57.bpo-41662.6e9iZn.rst deleted file mode 100644 index aecb0a1ea4d08f..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-30-21-38-57.bpo-41662.6e9iZn.rst +++ /dev/null @@ -1,2 +0,0 @@ -No longer override exceptions raised in ``__len__()`` of a sequence of -parameters in :mod:`sqlite3` with :exc:`~sqlite3.ProgrammingError`. diff --git a/Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst b/Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst deleted file mode 100644 index 284f500735701e..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst +++ /dev/null @@ -1 +0,0 @@ -Fix implementation of sendfile to be compatible with Solaris. diff --git a/Misc/NEWS.d/next/Library/2020-09-03-01-35-32.bpo-41696.zkYGre.rst b/Misc/NEWS.d/next/Library/2020-09-03-01-35-32.bpo-41696.zkYGre.rst deleted file mode 100644 index 67bbbb857f18cb..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-03-01-35-32.bpo-41696.zkYGre.rst +++ /dev/null @@ -1 +0,0 @@ -Fix handling of debug mode in :func:`asyncio.run`. This allows setting ``PYTHONASYNCIODEBUG`` or ``-X dev`` to enable asyncio debug mode when using :func:`asyncio.run`. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-09-04-20-45-38.bpo-41720.PW9MzZ.rst b/Misc/NEWS.d/next/Library/2020-09-04-20-45-38.bpo-41720.PW9MzZ.rst deleted file mode 100644 index 5d2a5094ddeaa6..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-04-20-45-38.bpo-41720.PW9MzZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed :meth:`turtle.Vec2D.__rmul__` for arguments which are not int or -float. diff --git a/Misc/NEWS.d/next/Library/2020-09-06-20-27-10.bpo-41732.1SKv26.rst b/Misc/NEWS.d/next/Library/2020-09-06-20-27-10.bpo-41732.1SKv26.rst deleted file mode 100644 index caf237f37f4dee..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-06-20-27-10.bpo-41732.1SKv26.rst +++ /dev/null @@ -1 +0,0 @@ -Added an :term:`iterator` to :class:`memoryview`. diff --git a/Misc/NEWS.d/next/Library/2020-09-08-13-51-16.bpo-1635741.wkPeoT.rst b/Misc/NEWS.d/next/Library/2020-09-08-13-51-16.bpo-1635741.wkPeoT.rst deleted file mode 100644 index 972d69b94b6ba6..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-08-13-51-16.bpo-1635741.wkPeoT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the ``_string`` extension module to the multi-phase initialization API -(:pep:`489`). diff --git a/Misc/NEWS.d/next/Library/2020-09-08-13-55-34.bpo-1635741.56MLP-.rst b/Misc/NEWS.d/next/Library/2020-09-08-13-55-34.bpo-1635741.56MLP-.rst deleted file mode 100644 index 8b5bd5efdc2c09..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-08-13-55-34.bpo-1635741.56MLP-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the ``mashal`` extension module to the multi-phase initialization API -(:pep:`489`). diff --git a/Misc/NEWS.d/next/Library/2020-09-11-12-38-55.bpo-39651.JMp9l2.rst b/Misc/NEWS.d/next/Library/2020-09-11-12-38-55.bpo-39651.JMp9l2.rst deleted file mode 100644 index 78dcff13700292..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-11-12-38-55.bpo-39651.JMp9l2.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a race condition in the ``call_soon_threadsafe()`` method of -``asyncio.ProactorEventLoop``: do nothing if the self-pipe socket has been -closed. diff --git a/Misc/NEWS.d/next/Library/2020-09-12-16-18-42.bpo-32218.IpYkEe.rst b/Misc/NEWS.d/next/Library/2020-09-12-16-18-42.bpo-32218.IpYkEe.rst deleted file mode 100644 index d5832b9767b704..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-12-16-18-42.bpo-32218.IpYkEe.rst +++ /dev/null @@ -1 +0,0 @@ -`enum.Flag` and `enum.IntFlag` members are now iterable diff --git a/Misc/NEWS.d/next/Library/2020-09-14-19-27-46.bpo-41789.pI_uZQ.rst b/Misc/NEWS.d/next/Library/2020-09-14-19-27-46.bpo-41789.pI_uZQ.rst deleted file mode 100644 index 5ce7a3ca67b725..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-14-19-27-46.bpo-41789.pI_uZQ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Honor `object` overrides in `Enum` class creation (specifically, `__str__`, -`__repr__`, `__format__`, and `__reduce_ex__`). diff --git a/Misc/NEWS.d/next/Library/2020-09-15-07-55-35.bpo-41792.qMpSlU.rst b/Misc/NEWS.d/next/Library/2020-09-15-07-55-35.bpo-41792.qMpSlU.rst deleted file mode 100644 index fbbc6724ba51ec..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-15-07-55-35.bpo-41792.qMpSlU.rst +++ /dev/null @@ -1,6 +0,0 @@ -Add is_typeddict function to typing.py to check if a type is a TypedDict -class - -Previously there was no way to check that without using private API. See the -`relevant issue in python/typing -` diff --git a/Misc/NEWS.d/next/Library/2020-09-15-14-56-13.bpo-39587.69xzuh.rst b/Misc/NEWS.d/next/Library/2020-09-15-14-56-13.bpo-39587.69xzuh.rst deleted file mode 100644 index e2f2b64867bedb..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-15-14-56-13.bpo-39587.69xzuh.rst +++ /dev/null @@ -1 +0,0 @@ -use the correct mix-in data type when constructing Enums diff --git a/Misc/NEWS.d/next/Library/2020-09-15-22-43-30.bpo-41517.sLBH7g.rst b/Misc/NEWS.d/next/Library/2020-09-15-22-43-30.bpo-41517.sLBH7g.rst deleted file mode 100644 index e7654711062cef..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-15-22-43-30.bpo-41517.sLBH7g.rst +++ /dev/null @@ -1 +0,0 @@ -fix bug allowing Enums to be extended via multiple inheritance diff --git a/Misc/NEWS.d/next/Library/2020-09-19-12-22-08.bpo-41816.ynynXJ.rst b/Misc/NEWS.d/next/Library/2020-09-19-12-22-08.bpo-41816.ynynXJ.rst deleted file mode 100644 index 605c346f37a81d..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-19-12-22-08.bpo-41816.ynynXJ.rst +++ /dev/null @@ -1,2 +0,0 @@ -StrEnum added: it ensures that all members are already strings or string -candidates diff --git a/Misc/NEWS.d/next/Library/2020-09-19-23-14-54.bpo-41815.RNpuX3.rst b/Misc/NEWS.d/next/Library/2020-09-19-23-14-54.bpo-41815.RNpuX3.rst deleted file mode 100644 index 3560db9bc5d355..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-19-23-14-54.bpo-41815.RNpuX3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix SQLite3 segfault when backing up closed database. Patch contributed by -Peter David McCormick. diff --git a/Misc/NEWS.d/next/Library/2020-09-20-15-14-05.bpo-41810.7l8lyV.rst b/Misc/NEWS.d/next/Library/2020-09-20-15-14-05.bpo-41810.7l8lyV.rst deleted file mode 100644 index 515aea9e36ce95..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-20-15-14-05.bpo-41810.7l8lyV.rst +++ /dev/null @@ -1,3 +0,0 @@ -:data:`types.EllipsisType`, :data:`types.NotImplementedType` and -:data:`types.NoneType` have been reintroduced, providing a new set -of types readily interpretable by static type checkers. diff --git a/Misc/NEWS.d/next/Library/2020-09-22-00-23-30.bpo-41817.bnh-VG.rst b/Misc/NEWS.d/next/Library/2020-09-22-00-23-30.bpo-41817.bnh-VG.rst deleted file mode 100644 index 6a634bb613260b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-22-00-23-30.bpo-41817.bnh-VG.rst +++ /dev/null @@ -1 +0,0 @@ -fix `tkinter.EventType` Enum so all members are strings, and none are tuples diff --git a/Misc/NEWS.d/next/Library/2020-09-22-13-51-14.bpo-41833.6HVDjT.rst b/Misc/NEWS.d/next/Library/2020-09-22-13-51-14.bpo-41833.6HVDjT.rst deleted file mode 100644 index abb3a077d91b81..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-22-13-51-14.bpo-41833.6HVDjT.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :class:`threading.Thread` constructor now uses the target name if the -*target* argument is specified but the *name* argument is omitted. diff --git a/Misc/NEWS.d/next/Library/2020-09-22-14-55-34.bpo-40670.R5sm68.rst b/Misc/NEWS.d/next/Library/2020-09-22-14-55-34.bpo-40670.R5sm68.rst deleted file mode 100644 index 0436194d736ab4..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-22-14-55-34.bpo-40670.R5sm68.rst +++ /dev/null @@ -1,3 +0,0 @@ -More reliable validation of statements in :class:`timeit.Timer`. It now -accepts "empty" statements (only whitespaces and comments) and rejects -misindentent statements. diff --git a/Misc/NEWS.d/next/Library/2020-09-23-03-33-37.bpo-40564.iXQqMq.rst b/Misc/NEWS.d/next/Library/2020-09-23-03-33-37.bpo-40564.iXQqMq.rst deleted file mode 100644 index 085534734ec948..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-23-03-33-37.bpo-40564.iXQqMq.rst +++ /dev/null @@ -1 +0,0 @@ -In ``zipfile.Path``, mutate the passed ZipFile object type instead of making a copy. Prevents issues when both the local copy and the caller’s copy attempt to close the same file handle. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-09-23-22-52-24.bpo-41842.lIuhC9.rst b/Misc/NEWS.d/next/Library/2020-09-23-22-52-24.bpo-41842.lIuhC9.rst deleted file mode 100644 index 306b02d76fffe2..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-23-22-52-24.bpo-41842.lIuhC9.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`codecs.unregister` function to unregister a codec search function. diff --git a/Misc/NEWS.d/next/Library/2020-09-23-23-17-59.bpo-41840.QRFr4L.rst b/Misc/NEWS.d/next/Library/2020-09-23-23-17-59.bpo-41840.QRFr4L.rst deleted file mode 100644 index e96942d8ebd07f..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-23-23-17-59.bpo-41840.QRFr4L.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a bug in the :mod:`symtable` module that was causing module-scope global -variables to not be reported as both local and global. Patch by Pablo -Galindo. diff --git a/Misc/NEWS.d/next/Library/2020-09-28-23-22-25.bpo-41773.oKkus0.rst b/Misc/NEWS.d/next/Library/2020-09-28-23-22-25.bpo-41773.oKkus0.rst deleted file mode 100644 index cef7ff0188354e..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-28-23-22-25.bpo-41773.oKkus0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Note in documentation that :func:`random.choices` doesn't support non-finite -weights, raise :exc:`ValueError` when given non-finite weights. diff --git a/Misc/NEWS.d/next/Library/2020-09-30-23-49-42.bpo-41887.-ee2S-.rst b/Misc/NEWS.d/next/Library/2020-09-30-23-49-42.bpo-41887.-ee2S-.rst deleted file mode 100644 index 2a43ab3f2890c7..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-30-23-49-42.bpo-41887.-ee2S-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Strip leading spaces and tabs on :func:`ast.literal_eval`. Also document -stripping of spaces and tabs for :func:`eval`. diff --git a/Misc/NEWS.d/next/Library/2020-10-01-10-50-12.bpo-41900.Cho7oh.rst b/Misc/NEWS.d/next/Library/2020-10-01-10-50-12.bpo-41900.Cho7oh.rst deleted file mode 100644 index 6586c09ec985d5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-01-10-50-12.bpo-41900.Cho7oh.rst +++ /dev/null @@ -1,2 +0,0 @@ -C14N 2.0 serialisation in xml.etree.ElementTree failed for unprefixed attributes -when a default namespace was defined. diff --git a/Misc/NEWS.d/next/Security/2020-02-12-14-17-39.bpo-39603.Gt3RSg.rst b/Misc/NEWS.d/next/Security/2020-02-12-14-17-39.bpo-39603.Gt3RSg.rst deleted file mode 100644 index 990affc3edd9d8..00000000000000 --- a/Misc/NEWS.d/next/Security/2020-02-12-14-17-39.bpo-39603.Gt3RSg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Prevent http header injection by rejecting control characters in -http.client.putrequest(...). diff --git a/Misc/NEWS.d/next/Security/2020-06-29-16-02-29.bpo-41004.ovF0KZ.rst b/Misc/NEWS.d/next/Security/2020-06-29-16-02-29.bpo-41004.ovF0KZ.rst deleted file mode 100644 index 1380b31fbe9f41..00000000000000 --- a/Misc/NEWS.d/next/Security/2020-06-29-16-02-29.bpo-41004.ovF0KZ.rst +++ /dev/null @@ -1 +0,0 @@ -The __hash__() methods of ipaddress.IPv4Interface and ipaddress.IPv6Interface incorrectly generated constant hash values of 32 and 128 respectively. This resulted in always causing hash collisions. The fix uses hash() to generate hash values for the tuple of (address, mask length, network address). diff --git a/Misc/NEWS.d/next/Security/2020-07-03-17-21-37.bpo-29778.cR_fGS.rst b/Misc/NEWS.d/next/Security/2020-07-03-17-21-37.bpo-29778.cR_fGS.rst deleted file mode 100644 index 998ffb1ee66677..00000000000000 --- a/Misc/NEWS.d/next/Security/2020-07-03-17-21-37.bpo-29778.cR_fGS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Ensure :file:`python3.dll` is loaded from correct locations when Python is -embedded (CVE-2020-15523). diff --git a/Misc/NEWS.d/next/Security/2020-07-03-20-41-29.bpo-41162.tb8pVj.rst b/Misc/NEWS.d/next/Security/2020-07-03-20-41-29.bpo-41162.tb8pVj.rst deleted file mode 100644 index f0333ac4a7bb32..00000000000000 --- a/Misc/NEWS.d/next/Security/2020-07-03-20-41-29.bpo-41162.tb8pVj.rst +++ /dev/null @@ -1 +0,0 @@ -Audit hooks are now cleared later during finalization to avoid missing events. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Security/2020-07-15-20-15-08.bpo-41304.vNEeYA.rst b/Misc/NEWS.d/next/Security/2020-07-15-20-15-08.bpo-41304.vNEeYA.rst deleted file mode 100644 index 8cc4bb8d280a72..00000000000000 --- a/Misc/NEWS.d/next/Security/2020-07-15-20-15-08.bpo-41304.vNEeYA.rst +++ /dev/null @@ -1 +0,0 @@ -Fixes `python3x._pth` being ignored on Windows, caused by the fix for :issue:`29778` (CVE-2020-15801). diff --git a/Misc/NEWS.d/next/Tests/2018-08-20-09-38-52.bpo-34401.eGxMPm.rst b/Misc/NEWS.d/next/Tests/2018-08-20-09-38-52.bpo-34401.eGxMPm.rst deleted file mode 100644 index 1b28d94c056d45..00000000000000 --- a/Misc/NEWS.d/next/Tests/2018-08-20-09-38-52.bpo-34401.eGxMPm.rst +++ /dev/null @@ -1 +0,0 @@ -Make test_gdb properly run on HP-UX. Patch by Michael Osipov. diff --git a/Misc/NEWS.d/next/Tests/2019-09-14-13-20-27.bpo-38169.hurq4B.rst b/Misc/NEWS.d/next/Tests/2019-09-14-13-20-27.bpo-38169.hurq4B.rst deleted file mode 100644 index 3972b9d440a871..00000000000000 --- a/Misc/NEWS.d/next/Tests/2019-09-14-13-20-27.bpo-38169.hurq4B.rst +++ /dev/null @@ -1 +0,0 @@ -Increase code coverage for SharedMemory and ShareableList diff --git a/Misc/NEWS.d/next/Tests/2020-04-09-15-40-03.bpo-31904.TJ4k3d.rst b/Misc/NEWS.d/next/Tests/2020-04-09-15-40-03.bpo-31904.TJ4k3d.rst deleted file mode 100644 index 40d232ec2f1e4f..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-04-09-15-40-03.bpo-31904.TJ4k3d.rst +++ /dev/null @@ -1 +0,0 @@ -Increase LOOPBACK_TIMEOUT to 10 for VxWorks RTOS. diff --git a/Misc/NEWS.d/next/Tests/2020-05-26-07-53-31.bpo-17258.X_IKTQ.rst b/Misc/NEWS.d/next/Tests/2020-05-26-07-53-31.bpo-17258.X_IKTQ.rst deleted file mode 100644 index 0a4b329b802e36..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-05-26-07-53-31.bpo-17258.X_IKTQ.rst +++ /dev/null @@ -1 +0,0 @@ -Skip some :mod:`multiprocessing` tests when MD5 hash digest is blocked. diff --git a/Misc/NEWS.d/next/Tests/2020-06-09-18-48-18.bpo-40927.67ylLg.rst b/Misc/NEWS.d/next/Tests/2020-06-09-18-48-18.bpo-40927.67ylLg.rst deleted file mode 100644 index 66209b84c94d69..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-06-09-18-48-18.bpo-40927.67ylLg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix test_binhex when run twice: it now uses import_fresh_module() to ensure -that it raises DeprecationWarning each time. diff --git a/Misc/NEWS.d/next/Tests/2020-06-12-20-46-23.bpo-40964.OBzf2c.rst b/Misc/NEWS.d/next/Tests/2020-06-12-20-46-23.bpo-40964.OBzf2c.rst deleted file mode 100644 index abfe4f0da4351c..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-06-12-20-46-23.bpo-40964.OBzf2c.rst +++ /dev/null @@ -1,2 +0,0 @@ -Disable remote :mod:`imaplib` tests, host cyrus.andrew.cmu.edu is blocking -incoming connections. diff --git a/Misc/NEWS.d/next/Tests/2020-06-17-15-07-14.bpo-41003.tiH_Fy.rst b/Misc/NEWS.d/next/Tests/2020-06-17-15-07-14.bpo-41003.tiH_Fy.rst deleted file mode 100644 index 6f908d99feaf75..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-06-17-15-07-14.bpo-41003.tiH_Fy.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix ``test_copyreg`` when ``numpy`` is installed: ``test.pickletester`` now -saves/restores warnings filters when importing ``numpy``, to ignore filters -installed by ``numpy``. diff --git a/Misc/NEWS.d/next/Tests/2020-06-17-17-27-07.bpo-41009.Rvn6OQ.rst b/Misc/NEWS.d/next/Tests/2020-06-17-17-27-07.bpo-41009.Rvn6OQ.rst deleted file mode 100644 index 1208c119a35562..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-06-17-17-27-07.bpo-41009.Rvn6OQ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix use of ``support.require_{linux|mac|freebsd}_version()`` decorators as -class decorator. diff --git a/Misc/NEWS.d/next/Tests/2020-06-17-18-00-21.bpo-38377.jfg4TH.rst b/Misc/NEWS.d/next/Tests/2020-06-17-18-00-21.bpo-38377.jfg4TH.rst deleted file mode 100644 index 11a30761d36c9e..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-06-17-18-00-21.bpo-38377.jfg4TH.rst +++ /dev/null @@ -1,4 +0,0 @@ -On Linux, skip tests using multiprocessing if the current user cannot create -a file in ``/dev/shm/`` directory. Add the -:func:`~test.support.skip_if_broken_multiprocessing_synchronize` function to -the :mod:`test.support` module. diff --git a/Misc/NEWS.d/next/Tests/2020-06-22-00-21-12.bpo-41069.bLZkX-.rst b/Misc/NEWS.d/next/Tests/2020-06-22-00-21-12.bpo-41069.bLZkX-.rst deleted file mode 100644 index 14bbd1a39a4cd0..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-06-22-00-21-12.bpo-41069.bLZkX-.rst +++ /dev/null @@ -1,2 +0,0 @@ -:data:`test.support.TESTFN` and the current directory for tests when run via -``test.regrtest`` contain now non-ascii characters if possible. diff --git a/Misc/NEWS.d/next/Tests/2020-06-23-12-02-45.bpo-41085.JZKsyz.rst b/Misc/NEWS.d/next/Tests/2020-06-23-12-02-45.bpo-41085.JZKsyz.rst deleted file mode 100644 index 463dffdd653eeb..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-06-23-12-02-45.bpo-41085.JZKsyz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix integer overflow in the :meth:`array.array.index` method on 64-bit Windows -for index larger than ``2**31``. diff --git a/Misc/NEWS.d/next/Tests/2020-08-07-17-28-49.bpo-41477.GrFexU.rst b/Misc/NEWS.d/next/Tests/2020-08-07-17-28-49.bpo-41477.GrFexU.rst deleted file mode 100644 index bf0f54abecd85d..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-08-07-17-28-49.bpo-41477.GrFexU.rst +++ /dev/null @@ -1 +0,0 @@ -Make ctypes optional in test_genericalias. diff --git a/Misc/NEWS.d/next/Tests/2020-08-11-14-59-13.bpo-41521.w2UYK7.rst b/Misc/NEWS.d/next/Tests/2020-08-11-14-59-13.bpo-41521.w2UYK7.rst deleted file mode 100644 index 658372b1a7f223..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-08-11-14-59-13.bpo-41521.w2UYK7.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`test.support`: Rename ``blacklist`` parameter of -:func:`~test.support.check__all__` to ``not_exported``. diff --git a/Misc/NEWS.d/next/Tests/2020-08-25-19-25-36.bpo-41602.Z64s0I.rst b/Misc/NEWS.d/next/Tests/2020-08-25-19-25-36.bpo-41602.Z64s0I.rst deleted file mode 100644 index fa3d2f1aa374ec..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-08-25-19-25-36.bpo-41602.Z64s0I.rst +++ /dev/null @@ -1 +0,0 @@ -Add tests for SIGINT handling in the runpy module. diff --git a/Misc/NEWS.d/next/Tests/2020-09-11-19-12-31.bpo-41731.Ivxh4U.rst b/Misc/NEWS.d/next/Tests/2020-09-11-19-12-31.bpo-41731.Ivxh4U.rst deleted file mode 100644 index e368a60f77b1ea..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-09-11-19-12-31.bpo-41731.Ivxh4U.rst +++ /dev/null @@ -1 +0,0 @@ -Make test_cmd_line_script pass with option '-vv'. diff --git a/Misc/NEWS.d/next/Tests/2020-10-05-09-37-43.bpo-41939.P4OlbA.rst b/Misc/NEWS.d/next/Tests/2020-10-05-09-37-43.bpo-41939.P4OlbA.rst deleted file mode 100644 index e58ad2616da1ba..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-10-05-09-37-43.bpo-41939.P4OlbA.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix test_site.test_license_exists_at_url(): call -``urllib.request.urlcleanup()`` to reset the global -``urllib.request._opener``. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Windows/2019-07-11-06-11-09.bpo-37556.sygMUU.rst b/Misc/NEWS.d/next/Windows/2019-07-11-06-11-09.bpo-37556.sygMUU.rst deleted file mode 100644 index e8af96421b8453..00000000000000 --- a/Misc/NEWS.d/next/Windows/2019-07-11-06-11-09.bpo-37556.sygMUU.rst +++ /dev/null @@ -1 +0,0 @@ -Extend py.exe help to mention overrides via venv, shebang, environmental variables & ini files. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Windows/2020-05-19-04-11-12.bpo-40677.qQbLW8.rst b/Misc/NEWS.d/next/Windows/2020-05-19-04-11-12.bpo-40677.qQbLW8.rst deleted file mode 100644 index a09cb243aba312..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-05-19-04-11-12.bpo-40677.qQbLW8.rst +++ /dev/null @@ -1 +0,0 @@ -Manually define IO_REPARSE_TAG_APPEXECLINK in case some old Windows SDK doesn't have it. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Windows/2020-05-19-14-43-33.bpo-39631.Z5yXam.rst b/Misc/NEWS.d/next/Windows/2020-05-19-14-43-33.bpo-39631.Z5yXam.rst deleted file mode 100644 index 38db4b431b6af6..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-05-19-14-43-33.bpo-39631.Z5yXam.rst +++ /dev/null @@ -1,2 +0,0 @@ -Changes the registered MIME type for ``.py`` files on Windows to -``text/x-python`` instead of ``text/plain``. diff --git a/Misc/NEWS.d/next/Windows/2020-06-12-13-13-44.bpo-40164.SPrSn5.rst b/Misc/NEWS.d/next/Windows/2020-06-12-13-13-44.bpo-40164.SPrSn5.rst deleted file mode 100644 index 6390de717d71fb..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-06-12-13-13-44.bpo-40164.SPrSn5.rst +++ /dev/null @@ -1 +0,0 @@ -Updates Windows OpenSSL to 1.1.1g \ No newline at end of file diff --git a/Misc/NEWS.d/next/Windows/2020-06-23-03-12-57.bpo-41039.0hgd0s.rst b/Misc/NEWS.d/next/Windows/2020-06-23-03-12-57.bpo-41039.0hgd0s.rst deleted file mode 100644 index acc3f7441f1b15..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-06-23-03-12-57.bpo-41039.0hgd0s.rst +++ /dev/null @@ -1,2 +0,0 @@ -Stable ABI redirection DLL (python3.dll) now uses ``#pragma -comment(linker)`` for re-exporting. diff --git a/Misc/NEWS.d/next/Windows/2020-06-24-21-30-42.bpo-41074.gaQc3C.rst b/Misc/NEWS.d/next/Windows/2020-06-24-21-30-42.bpo-41074.gaQc3C.rst deleted file mode 100644 index ec91fd361c3de1..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-06-24-21-30-42.bpo-41074.gaQc3C.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed support of non-ASCII names in functions :func:`msilib.OpenDatabase` -and :func:`msilib.init_database` and non-ASCII SQL in method -:meth:`msilib.Database.OpenView`. diff --git a/Misc/NEWS.d/next/Windows/2020-06-28-12-40-41.bpo-41142.jpZzzh.rst b/Misc/NEWS.d/next/Windows/2020-06-28-12-40-41.bpo-41142.jpZzzh.rst deleted file mode 100644 index 91406da7a2544e..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-06-28-12-40-41.bpo-41142.jpZzzh.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`msilib` now supports creating CAB files with non-ASCII file path and -adding files with non-ASCII file path to them. diff --git a/Misc/NEWS.d/next/Windows/2020-07-20-23-26-26.bpo-40741.C9sc_d.rst b/Misc/NEWS.d/next/Windows/2020-07-20-23-26-26.bpo-40741.C9sc_d.rst deleted file mode 100644 index 69b7cce43803c6..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-07-20-23-26-26.bpo-40741.C9sc_d.rst +++ /dev/null @@ -1 +0,0 @@ -Update Windows release to include SQLite 3.32.3. diff --git a/Misc/NEWS.d/next/Windows/2020-07-28-11-55-43.bpo-41412.ME20KB.rst b/Misc/NEWS.d/next/Windows/2020-07-28-11-55-43.bpo-41412.ME20KB.rst deleted file mode 100644 index 274264ad876d3c..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-07-28-11-55-43.bpo-41412.ME20KB.rst +++ /dev/null @@ -1,2 +0,0 @@ -The installer will now fail to install on Windows 7 and Windows 8. Further, -the UCRT dependency is now always downloaded on demand. diff --git a/Misc/NEWS.d/next/Windows/2020-07-28-12-39-32.bpo-40948.ISUFO6.rst b/Misc/NEWS.d/next/Windows/2020-07-28-12-39-32.bpo-40948.ISUFO6.rst deleted file mode 100644 index f8831d8c13701c..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-07-28-12-39-32.bpo-40948.ISUFO6.rst +++ /dev/null @@ -1 +0,0 @@ -Improve post-install message to direct people to the "py" command. diff --git a/Misc/NEWS.d/next/Windows/2020-08-06-16-59-10.bpo-41492.2FQ9cM.rst b/Misc/NEWS.d/next/Windows/2020-08-06-16-59-10.bpo-41492.2FQ9cM.rst deleted file mode 100644 index 065803e2c20759..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-08-06-16-59-10.bpo-41492.2FQ9cM.rst +++ /dev/null @@ -1 +0,0 @@ -Fixes the description that appears in UAC prompts. diff --git a/Misc/NEWS.d/next/Windows/2020-08-13-22-40-58.bpo-41526.-i2bwb.rst b/Misc/NEWS.d/next/Windows/2020-08-13-22-40-58.bpo-41526.-i2bwb.rst deleted file mode 100644 index 756c8270599f27..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-08-13-22-40-58.bpo-41526.-i2bwb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed layout of final page of the installer by removing the special thanks -to Mark Hammond (with his permission). diff --git a/Misc/NEWS.d/next/Windows/2020-09-04-21-35-28.bpo-41627.sx2KN1.rst b/Misc/NEWS.d/next/Windows/2020-09-04-21-35-28.bpo-41627.sx2KN1.rst deleted file mode 100644 index 043bd5e9341c3c..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-09-04-21-35-28.bpo-41627.sx2KN1.rst +++ /dev/null @@ -1,2 +0,0 @@ -The user site directory for 32-bit now includes a ``-32`` suffix to -distinguish it from the 64-bit interpreter's directory. diff --git a/Misc/NEWS.d/next/Windows/2020-09-11-17-59-33.bpo-41744.e_ugDQ.rst b/Misc/NEWS.d/next/Windows/2020-09-11-17-59-33.bpo-41744.e_ugDQ.rst deleted file mode 100644 index 6106d6604c7dd5..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-09-11-17-59-33.bpo-41744.e_ugDQ.rst +++ /dev/null @@ -1 +0,0 @@ -Fixes automatic import of props file when using the Nuget package. \ No newline at end of file diff --git a/Misc/NEWS.d/next/macOS/2020-06-07-20-10-56.bpo-40741.80A2BW.rst b/Misc/NEWS.d/next/macOS/2020-06-07-20-10-56.bpo-40741.80A2BW.rst deleted file mode 100644 index 6ff7b9a805b957..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-06-07-20-10-56.bpo-40741.80A2BW.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to use SQLite 3.32.2. diff --git a/Misc/NEWS.d/next/macOS/2020-06-17-13-45-15.bpo-41005.zZegdV.rst b/Misc/NEWS.d/next/macOS/2020-06-17-13-45-15.bpo-41005.zZegdV.rst deleted file mode 100644 index 3b5f3f23a12f54..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-06-17-13-45-15.bpo-41005.zZegdV.rst +++ /dev/null @@ -1 +0,0 @@ -fixed an XDG settings issue not allowing macos to open browser in webbrowser.py \ No newline at end of file diff --git a/Misc/NEWS.d/next/macOS/2020-06-19-14-19-08.bpo-40741.L7yTbm.rst b/Misc/NEWS.d/next/macOS/2020-06-19-14-19-08.bpo-40741.L7yTbm.rst deleted file mode 100644 index 78a21b76c2fe4e..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-06-19-14-19-08.bpo-40741.L7yTbm.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to use SQLite 3.32.3. diff --git a/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst b/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst deleted file mode 100644 index d6bb6161366907..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst +++ /dev/null @@ -1,7 +0,0 @@ -Fix configure error when building on macOS 11. -Note that the current Python release was released -shortly after the first developer preview of macOS -11 (Big Sur); there are other known issues with -building and running on the developer preview. -Big Sur is expected to be fully supported in a -future bugfix release of Python 3.8.x and with 3.9.0. \ No newline at end of file diff --git a/Misc/NEWS.d/next/macOS/2020-06-25-06-09-00.bpo-39580.N_vJ9h.rst b/Misc/NEWS.d/next/macOS/2020-06-25-06-09-00.bpo-39580.N_vJ9h.rst deleted file mode 100644 index 95d65359804d03..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-06-25-06-09-00.bpo-39580.N_vJ9h.rst +++ /dev/null @@ -1,2 +0,0 @@ -Avoid opening Finder window if running installer from the command line. -Patch contributed by Rick Heil. diff --git a/Misc/NEWS.d/next/macOS/2020-08-26-09-31-37.bpo-41557.mcQ75z.rst b/Misc/NEWS.d/next/macOS/2020-08-26-09-31-37.bpo-41557.mcQ75z.rst deleted file mode 100644 index 5f2d9937c0606d..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-08-26-09-31-37.bpo-41557.mcQ75z.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to use SQLite 3.33.0. diff --git a/README.rst b/README.rst index 14f4f32bca7965..176562cae308b7 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.10.0 alpha 0 +This is Python version 3.10.0 alpha 1 ===================================== .. image:: https://travis-ci.com/python/cpython.svg?branch=master From 61f75e7169c3c1da47f3f18381ac4b5105a4a883 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 5 Oct 2020 21:16:35 +0100 Subject: [PATCH 0214/1261] Post 3.10.0a1 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index c4468ad3f2223b..eeb23af9766700 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.10.0a1" +#define PY_VERSION "3.10.0a1+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. From 4dcd0a72e65e4033be4d07af0a97e62e3f19e5f6 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 6 Oct 2020 15:14:51 +0300 Subject: [PATCH 0215/1261] bpo-41944: No longer call eval() on content received via HTTP in the CJK codec tests (GH-22566) --- Lib/test/multibytecodec_support.py | 22 +++++++------------ .../2020-10-05-17-43-46.bpo-41944.rf1dYb.rst | 1 + 2 files changed, 9 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst diff --git a/Lib/test/multibytecodec_support.py b/Lib/test/multibytecodec_support.py index cca8af67d6d1d6..f76c0153f5ecf7 100644 --- a/Lib/test/multibytecodec_support.py +++ b/Lib/test/multibytecodec_support.py @@ -305,29 +305,23 @@ def test_mapping_file(self): self._test_mapping_file_plain() def _test_mapping_file_plain(self): - unichrs = lambda s: ''.join(map(chr, map(eval, s.split('+')))) + def unichrs(s): + return ''.join(chr(int(x, 16)) for x in s.split('+')) + urt_wa = {} with self.open_mapping_file() as f: for line in f: if not line: break - data = line.split('#')[0].strip().split() + data = line.split('#')[0].split() if len(data) != 2: continue - csetval = eval(data[0]) - if csetval <= 0x7F: - csetch = bytes([csetval & 0xff]) - elif csetval >= 0x1000000: - csetch = bytes([(csetval >> 24), ((csetval >> 16) & 0xff), - ((csetval >> 8) & 0xff), (csetval & 0xff)]) - elif csetval >= 0x10000: - csetch = bytes([(csetval >> 16), ((csetval >> 8) & 0xff), - (csetval & 0xff)]) - elif csetval >= 0x100: - csetch = bytes([(csetval >> 8), (csetval & 0xff)]) - else: + if data[0][:2] != '0x': + self.fail(f"Invalid line: {line!r}") + csetch = bytes.fromhex(data[0][2:]) + if len(csetch) == 1 and 0x80 <= csetch[0]: continue unich = unichrs(data[1]) diff --git a/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst b/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst new file mode 100644 index 00000000000000..4f9782f1c85af9 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst @@ -0,0 +1 @@ +Tests for CJK codecs no longer call ``eval()`` on content received via HTTP. From beb41c839af40238feee272a11ddfb5a9ce4c524 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 6 Oct 2020 16:21:56 +0200 Subject: [PATCH 0216/1261] bpo-41944: No longer call eval() on content received via HTTP in the UnicodeNames tests (GH-22575) Similarly to GH-22566, those tests called eval() on content received via HTTP in test_named_sequences_full. This likely isn't exploitable because unicodedata.lookup(seqname) is called before self.checkletter(seqname, None) - thus any string which isn't a valid unicode character name wouldn't ever reach the checkletter method. Still, it's probably better to be safe than sorry. --- Lib/test/test_ucn.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_ucn.py b/Lib/test/test_ucn.py index e95f911d8eeddd..cbfd5af2bb751c 100644 --- a/Lib/test/test_ucn.py +++ b/Lib/test/test_ucn.py @@ -7,6 +7,7 @@ """#" +import ast import unittest import unicodedata @@ -24,7 +25,7 @@ def checkletter(self, name, code): # Helper that put all \N escapes inside eval'd raw strings, # to make sure this script runs even if the compiler # chokes on \N escapes - res = eval(r'"\N{%s}"' % name) + res = ast.literal_eval(r'"\N{%s}"' % name) self.assertEqual(res, code) return res From 1980e7f359e865ba9df76c6389507dc390ec88c6 Mon Sep 17 00:00:00 2001 From: Ben Avrahami Date: Tue, 6 Oct 2020 20:40:50 +0300 Subject: [PATCH 0217/1261] bpo-41905: Add abc.update_abstractmethods() (GH-22485) This function recomputes `cls.__abstractmethods__`. Also update `@dataclass` to use it. --- Doc/library/abc.rst | 26 ++- Doc/library/functools.rst | 7 + Lib/abc.py | 38 +++++ Lib/dataclasses.py | 3 + Lib/test/test_abc.py | 149 ++++++++++++++++++ Lib/test/test_dataclasses.py | 37 +++++ .../2020-10-01-21-11-03.bpo-41905._JpjR4.rst | 1 + 7 files changed, 256 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-01-21-11-03.bpo-41905._JpjR4.rst diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst index 424ae547d829a4..3a7414d7358e7a 100644 --- a/Doc/library/abc.rst +++ b/Doc/library/abc.rst @@ -174,10 +174,11 @@ The :mod:`abc` module also provides the following decorator: to declare abstract methods for properties and descriptors. Dynamically adding abstract methods to a class, or attempting to modify the - abstraction status of a method or class once it is created, are not - supported. The :func:`abstractmethod` only affects subclasses derived using - regular inheritance; "virtual subclasses" registered with the ABC's - :meth:`register` method are not affected. + abstraction status of a method or class once it is created, are only + supported using the :func:`update_abstractmethods` function. The + :func:`abstractmethod` only affects subclasses derived using regular + inheritance; "virtual subclasses" registered with the ABC's :meth:`register` + method are not affected. When :func:`abstractmethod` is applied in combination with other method descriptors, it should be applied as the innermost decorator, as shown in @@ -235,7 +236,6 @@ The :mod:`abc` module also provides the following decorator: super-call in a framework that uses cooperative multiple-inheritance. - The :mod:`abc` module also supports the following legacy decorators: .. decorator:: abstractclassmethod @@ -335,6 +335,22 @@ The :mod:`abc` module also provides the following functions: .. versionadded:: 3.4 +.. function:: update_abstractmethods(cls) + A function to recalculate an abstract class's abstraction status. This + function should be called if a class's abstract methods have been + implemented or changed after it was created. Usually, this function should + be called from within a class decorator. + + Returns *cls*, to allow usage as a class decorator. + + If *cls* is not an instance of ABCMeta, does nothing. + + .. note:: + + This function assumes that *cls*'s superclasses are already updated. + It does not update any subclasses. + + .. versionadded:: 3.10 .. rubric:: Footnotes diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 14aa184e2cd14c..186cb4c381dee4 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -254,6 +254,13 @@ The :mod:`functools` module defines the following functions: application, implementing all six rich comparison methods instead is likely to provide an easy speed boost. + .. note:: + + This decorator makes no attempt to override methods that have been + declared in the class *or its superclasses*. Meaning that if a + superclass defines a comparison operator, *total_ordering* will not + implement it again, even if the original method is abstract. + .. versionadded:: 3.2 .. versionchanged:: 3.4 diff --git a/Lib/abc.py b/Lib/abc.py index 431b64040a66e8..276ef9a2cd4850 100644 --- a/Lib/abc.py +++ b/Lib/abc.py @@ -122,6 +122,44 @@ def _abc_caches_clear(cls): _reset_caches(cls) +def update_abstractmethods(cls): + """Recalculate the set of abstract methods of an abstract class. + + If a class has had one of its abstract methods implemented after the + class was created, the method will not be considered implemented until + this function is called. Alternatively, if a new abstract method has been + added to the class, it will only be considered an abstract method of the + class after this function is called. + + This function should be called before any use is made of the class, + usually in class decorators that add methods to the subject class. + + Returns cls, to allow usage as a class decorator. + + If cls is not an instance of ABCMeta, does nothing. + """ + if not hasattr(cls, '__abstractmethods__'): + # We check for __abstractmethods__ here because cls might by a C + # implementation or a python implementation (especially during + # testing), and we want to handle both cases. + return cls + + abstracts = set() + # Check the existing abstract methods of the parents, keep only the ones + # that are not implemented. + for scls in cls.__bases__: + for name in getattr(scls, '__abstractmethods__', ()): + value = getattr(cls, name, None) + if getattr(value, "__isabstractmethod__", False): + abstracts.add(name) + # Also add any other newly added abstract methods. + for name, value in cls.__dict__.items(): + if getattr(value, "__isabstractmethod__", False): + abstracts.add(name) + cls.__abstractmethods__ = frozenset(abstracts) + return cls + + class ABC(metaclass=ABCMeta): """Helper class that provides a standard way to create an ABC using inheritance. diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 530d3e99574e8e..65091021f37162 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -6,6 +6,7 @@ import keyword import builtins import functools +import abc import _thread from types import GenericAlias @@ -992,6 +993,8 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): cls.__doc__ = (cls.__name__ + str(inspect.signature(cls)).replace(' -> None', '')) + abc.update_abstractmethods(cls) + return cls diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py index 7e9c47b3cacb96..3d603e7734d870 100644 --- a/Lib/test/test_abc.py +++ b/Lib/test/test_abc.py @@ -488,6 +488,155 @@ class C(with_metaclass(abc_ABCMeta, A, B)): pass self.assertEqual(C.__class__, abc_ABCMeta) + def test_update_del(self): + class A(metaclass=abc_ABCMeta): + @abc.abstractmethod + def foo(self): + pass + + del A.foo + self.assertEqual(A.__abstractmethods__, {'foo'}) + self.assertFalse(hasattr(A, 'foo')) + + abc.update_abstractmethods(A) + + self.assertEqual(A.__abstractmethods__, set()) + A() + + + def test_update_new_abstractmethods(self): + class A(metaclass=abc_ABCMeta): + @abc.abstractmethod + def bar(self): + pass + + @abc.abstractmethod + def updated_foo(self): + pass + + A.foo = updated_foo + abc.update_abstractmethods(A) + self.assertEqual(A.__abstractmethods__, {'foo', 'bar'}) + msg = "class A with abstract methods bar, foo" + self.assertRaisesRegex(TypeError, msg, A) + + def test_update_implementation(self): + class A(metaclass=abc_ABCMeta): + @abc.abstractmethod + def foo(self): + pass + + class B(A): + pass + + msg = "class B with abstract method foo" + self.assertRaisesRegex(TypeError, msg, B) + self.assertEqual(B.__abstractmethods__, {'foo'}) + + B.foo = lambda self: None + + abc.update_abstractmethods(B) + + B() + self.assertEqual(B.__abstractmethods__, set()) + + def test_update_as_decorator(self): + class A(metaclass=abc_ABCMeta): + @abc.abstractmethod + def foo(self): + pass + + def class_decorator(cls): + cls.foo = lambda self: None + return cls + + @abc.update_abstractmethods + @class_decorator + class B(A): + pass + + B() + self.assertEqual(B.__abstractmethods__, set()) + + def test_update_non_abc(self): + class A: + pass + + @abc.abstractmethod + def updated_foo(self): + pass + + A.foo = updated_foo + abc.update_abstractmethods(A) + A() + self.assertFalse(hasattr(A, '__abstractmethods__')) + + def test_update_del_implementation(self): + class A(metaclass=abc_ABCMeta): + @abc.abstractmethod + def foo(self): + pass + + class B(A): + def foo(self): + pass + + B() + + del B.foo + + abc.update_abstractmethods(B) + + msg = "class B with abstract method foo" + self.assertRaisesRegex(TypeError, msg, B) + + def test_update_layered_implementation(self): + class A(metaclass=abc_ABCMeta): + @abc.abstractmethod + def foo(self): + pass + + class B(A): + pass + + class C(B): + def foo(self): + pass + + C() + + del C.foo + + abc.update_abstractmethods(C) + + msg = "class C with abstract method foo" + self.assertRaisesRegex(TypeError, msg, C) + + def test_update_multi_inheritance(self): + class A(metaclass=abc_ABCMeta): + @abc.abstractmethod + def foo(self): + pass + + class B(metaclass=abc_ABCMeta): + def foo(self): + pass + + class C(B, A): + @abc.abstractmethod + def foo(self): + pass + + self.assertEqual(C.__abstractmethods__, {'foo'}) + + del C.foo + + abc.update_abstractmethods(C) + + self.assertEqual(C.__abstractmethods__, set()) + + C() + class TestABCWithInitSubclass(unittest.TestCase): def test_works_with_init_subclass(self): diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index b20103bdce51cb..b31a469ec79227 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -4,6 +4,7 @@ from dataclasses import * +import abc import pickle import inspect import builtins @@ -3332,6 +3333,42 @@ class C: ## replace(c, x=5) +class TestAbstract(unittest.TestCase): + def test_abc_implementation(self): + class Ordered(abc.ABC): + @abc.abstractmethod + def __lt__(self, other): + pass + + @abc.abstractmethod + def __le__(self, other): + pass + + @dataclass(order=True) + class Date(Ordered): + year: int + month: 'Month' + day: 'int' + + self.assertFalse(inspect.isabstract(Date)) + self.assertGreater(Date(2020,12,25), Date(2020,8,31)) + + def test_maintain_abc(self): + class A(abc.ABC): + @abc.abstractmethod + def foo(self): + pass + + @dataclass + class Date(A): + year: int + month: 'Month' + day: 'int' + + self.assertTrue(inspect.isabstract(Date)) + msg = 'class Date with abstract method foo' + self.assertRaisesRegex(TypeError, msg, Date) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-10-01-21-11-03.bpo-41905._JpjR4.rst b/Misc/NEWS.d/next/Library/2020-10-01-21-11-03.bpo-41905._JpjR4.rst new file mode 100644 index 00000000000000..0d8c0ba6a66bd1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-01-21-11-03.bpo-41905._JpjR4.rst @@ -0,0 +1 @@ +A new function in abc: *update_abstractmethods* to re-calculate an abstract class's abstract status. In addition, *dataclass* has been changed to call this function. \ No newline at end of file From b70c604939b702f32a230dcc8716e67da9c0fb46 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Tue, 6 Oct 2020 23:03:02 +0300 Subject: [PATCH 0218/1261] bpo-38605: Make 'from __future__ import annotations' the default (GH-20434) The hard part was making all the tests pass; there are some subtle issues here, because apparently the future import wasn't tested very thoroughly in previous Python versions. For example, `inspect.signature()` returned type objects normally (except for forward references), but strings with the future import. We changed it to try and return type objects by calling `typing.get_type_hints()`, but fall back on returning strings if that function fails (which it may do if there are future references in the annotations that require passing in a specific namespace to resolve). --- Doc/reference/compound_stmts.rst | 10 +- Doc/whatsnew/3.10.rst | 17 ++ Lib/dataclasses.py | 13 +- Lib/inspect.py | 19 +- Lib/test/dataclass_module_1.py | 6 - Lib/test/dataclass_module_1_str.py | 32 --- Lib/test/dataclass_module_2.py | 6 - Lib/test/dataclass_module_2_str.py | 32 --- Lib/test/dataclass_textanno.py | 2 - Lib/test/test_annotations.py | 228 ++++++++++++++++++ Lib/test/test_coroutines.py | 8 - Lib/test/test_dataclasses.py | 79 +++--- Lib/test/test_dis.py | 38 ++- Lib/test/test_functools.py | 4 +- Lib/test/test_grammar.py | 56 ++--- Lib/test/test_inspect.py | 44 ++-- Lib/test/test_opcodes.py | 2 +- Lib/test/test_positional_only_arg.py | 17 +- Lib/test/test_pydoc.py | 4 +- Lib/test/test_syntax.py | 8 - Lib/test/test_types.py | 4 +- Lib/test/test_typing.py | 24 +- Lib/typing.py | 8 + .../2020-05-27-16-08-16.bpo-38605.rcs2uK.rst | 3 + Python/ast_opt.c | 24 -- Python/compile.c | 14 +- Python/future.c | 2 +- 27 files changed, 404 insertions(+), 300 deletions(-) delete mode 100644 Lib/test/dataclass_module_1_str.py delete mode 100644 Lib/test/dataclass_module_2_str.py create mode 100644 Lib/test/test_annotations.py create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-27-16-08-16.bpo-38605.rcs2uK.rst diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 158d6a8f164e23..04a3948d0c9dcf 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -610,13 +610,9 @@ following the parameter name. Any parameter may have an annotation, even those ``*identifier`` or ``**identifier``. Functions may have "return" annotation of the form "``-> expression``" after the parameter list. These annotations can be any valid Python expression. The presence of annotations does not change the -semantics of a function. The annotation values are available as values of -a dictionary keyed by the parameters' names in the :attr:`__annotations__` -attribute of the function object. If the ``annotations`` import from -:mod:`__future__` is used, annotations are preserved as strings at runtime which -enables postponed evaluation. Otherwise, they are evaluated when the function -definition is executed. In this case annotations may be evaluated in -a different order than they appear in the source code. +semantics of a function. The annotation values are available as string values +in a dictionary keyed by the parameters' names in the :attr:`__annotations__` +attribute of the function object. .. index:: pair: lambda; expression diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 1ea5aeac8a3c62..2bcdba69957b61 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -70,6 +70,23 @@ Summary -- Release highlights New Features ============ +.. _whatsnew310-pep563: + +PEP 563: Postponed Evaluation of Annotations Becomes Default +------------------------------------------------------------ + +In Python 3.7, postponed evaluation of annotations was added, +to be enabled with a ``from __future__ import annotations`` +directive. In 3.10 this became the default behavior, even +without that future directive. With this being default, all +annotations stored in :attr:`__annotations__` will be strings. +If needed, annotations can be resolved at runtime using +:func:`typing.get_type_hints`. See :pep:`563` for a full +description. Also, the :func:`inspect.signature` will try to +resolve types from now on, and when it fails it will fall back to +showing the string annotations. (Contributed by Batuhan Taskaya +in :issue:`38605`.) + * The :class:`int` type has a new method :meth:`int.bit_count`, returning the number of ones in the binary expansion of a given integer, also known as the population count. (Contributed by Niklas Fiekas in :issue:`29882`.) diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 65091021f37162..adfb9b7240b9f9 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -399,8 +399,10 @@ def _create_fn(name, args, body, *, globals=None, locals=None, ns = {} exec(txt, globals, ns) - return ns['__create_fn__'](**locals) - + func = ns['__create_fn__'](**locals) + for arg, annotation in func.__annotations__.copy().items(): + func.__annotations__[arg] = locals[annotation] + return func def _field_assign(frozen, name, value, self_name): # If we're a frozen class, then assign to our fields in __init__ @@ -651,6 +653,11 @@ def _is_type(annotation, cls, a_module, a_type, is_type_predicate): # a eval() penalty for every single field of every dataclass # that's defined. It was judged not worth it. + # Strip away the extra quotes as a result of double-stringifying when the + # 'annotations' feature became default. + if annotation.startswith(("'", '"')) and annotation.endswith(("'", '"')): + annotation = annotation[1:-1] + match = _MODULE_IDENTIFIER_RE.match(annotation) if match: ns = None @@ -991,7 +998,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): if not getattr(cls, '__doc__'): # Create a class doc-string. cls.__doc__ = (cls.__name__ + - str(inspect.signature(cls)).replace(' -> None', '')) + str(inspect.signature(cls)).replace(' -> NoneType', '')) abc.update_abstractmethods(cls) diff --git a/Lib/inspect.py b/Lib/inspect.py index 887a3424057b6e..ac127cbd725b9b 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -45,6 +45,7 @@ import tokenize import token import types +import typing import warnings import functools import builtins @@ -1877,7 +1878,10 @@ def _signature_is_functionlike(obj): code = getattr(obj, '__code__', None) defaults = getattr(obj, '__defaults__', _void) # Important to use _void ... kwdefaults = getattr(obj, '__kwdefaults__', _void) # ... and not None here - annotations = getattr(obj, '__annotations__', None) + try: + annotations = _get_type_hints(obj) + except AttributeError: + annotations = None return (isinstance(code, types.CodeType) and isinstance(name, str) and @@ -2118,6 +2122,16 @@ def p(name_node, default_node, default=empty): return cls(parameters, return_annotation=cls.empty) +def _get_type_hints(func): + try: + return typing.get_type_hints(func) + except Exception: + # First, try to use the get_type_hints to resolve + # annotations. But for keeping the behavior intact + # if there was a problem with that (like the namespace + # can't resolve some annotation) continue to use + # string annotations + return func.__annotations__ def _signature_from_builtin(cls, func, skip_bound_arg=True): """Private helper function to get signature for @@ -2161,7 +2175,8 @@ def _signature_from_function(cls, func, skip_bound_arg=True): positional = arg_names[:pos_count] keyword_only_count = func_code.co_kwonlyargcount keyword_only = arg_names[pos_count:pos_count + keyword_only_count] - annotations = func.__annotations__ + annotations = _get_type_hints(func) + defaults = func.__defaults__ kwdefaults = func.__kwdefaults__ diff --git a/Lib/test/dataclass_module_1.py b/Lib/test/dataclass_module_1.py index 87a33f8191d3da..9f0aeda67f9abb 100644 --- a/Lib/test/dataclass_module_1.py +++ b/Lib/test/dataclass_module_1.py @@ -1,9 +1,3 @@ -#from __future__ import annotations -USING_STRINGS = False - -# dataclass_module_1.py and dataclass_module_1_str.py are identical -# except only the latter uses string annotations. - import dataclasses import typing diff --git a/Lib/test/dataclass_module_1_str.py b/Lib/test/dataclass_module_1_str.py deleted file mode 100644 index 6de490b7ad7841..00000000000000 --- a/Lib/test/dataclass_module_1_str.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations -USING_STRINGS = True - -# dataclass_module_1.py and dataclass_module_1_str.py are identical -# except only the latter uses string annotations. - -import dataclasses -import typing - -T_CV2 = typing.ClassVar[int] -T_CV3 = typing.ClassVar - -T_IV2 = dataclasses.InitVar[int] -T_IV3 = dataclasses.InitVar - -@dataclasses.dataclass -class CV: - T_CV4 = typing.ClassVar - cv0: typing.ClassVar[int] = 20 - cv1: typing.ClassVar = 30 - cv2: T_CV2 - cv3: T_CV3 - not_cv4: T_CV4 # When using string annotations, this field is not recognized as a ClassVar. - -@dataclasses.dataclass -class IV: - T_IV4 = dataclasses.InitVar - iv0: dataclasses.InitVar[int] - iv1: dataclasses.InitVar - iv2: T_IV2 - iv3: T_IV3 - not_iv4: T_IV4 # When using string annotations, this field is not recognized as an InitVar. diff --git a/Lib/test/dataclass_module_2.py b/Lib/test/dataclass_module_2.py index 68fb733e29925d..8d120d181bd3d5 100644 --- a/Lib/test/dataclass_module_2.py +++ b/Lib/test/dataclass_module_2.py @@ -1,9 +1,3 @@ -#from __future__ import annotations -USING_STRINGS = False - -# dataclass_module_2.py and dataclass_module_2_str.py are identical -# except only the latter uses string annotations. - from dataclasses import dataclass, InitVar from typing import ClassVar diff --git a/Lib/test/dataclass_module_2_str.py b/Lib/test/dataclass_module_2_str.py deleted file mode 100644 index b363d17c176c22..00000000000000 --- a/Lib/test/dataclass_module_2_str.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations -USING_STRINGS = True - -# dataclass_module_2.py and dataclass_module_2_str.py are identical -# except only the latter uses string annotations. - -from dataclasses import dataclass, InitVar -from typing import ClassVar - -T_CV2 = ClassVar[int] -T_CV3 = ClassVar - -T_IV2 = InitVar[int] -T_IV3 = InitVar - -@dataclass -class CV: - T_CV4 = ClassVar - cv0: ClassVar[int] = 20 - cv1: ClassVar = 30 - cv2: T_CV2 - cv3: T_CV3 - not_cv4: T_CV4 # When using string annotations, this field is not recognized as a ClassVar. - -@dataclass -class IV: - T_IV4 = InitVar - iv0: InitVar[int] - iv1: InitVar - iv2: T_IV2 - iv3: T_IV3 - not_iv4: T_IV4 # When using string annotations, this field is not recognized as an InitVar. diff --git a/Lib/test/dataclass_textanno.py b/Lib/test/dataclass_textanno.py index 3eb6c943d4c434..589b60f0cd61d4 100644 --- a/Lib/test/dataclass_textanno.py +++ b/Lib/test/dataclass_textanno.py @@ -1,5 +1,3 @@ -from __future__ import annotations - import dataclasses diff --git a/Lib/test/test_annotations.py b/Lib/test/test_annotations.py new file mode 100644 index 00000000000000..3e6b709fb4f1e3 --- /dev/null +++ b/Lib/test/test_annotations.py @@ -0,0 +1,228 @@ +import unittest +import sys +from textwrap import dedent + +class PostponedAnnotationsTestCase(unittest.TestCase): + template = dedent( + """ + def f() -> {ann}: + ... + def g(arg: {ann}) -> None: + ... + async def f2() -> {ann}: + ... + async def g2(arg: {ann}) -> None: + ... + var: {ann} + var2: {ann} = None + """ + ) + + def getActual(self, annotation): + scope = {} + exec(self.template.format(ann=annotation), {}, scope) + func_ret_ann = scope['f'].__annotations__['return'] + func_arg_ann = scope['g'].__annotations__['arg'] + async_func_ret_ann = scope['f2'].__annotations__['return'] + async_func_arg_ann = scope['g2'].__annotations__['arg'] + var_ann1 = scope['__annotations__']['var'] + var_ann2 = scope['__annotations__']['var2'] + self.assertEqual(func_ret_ann, func_arg_ann) + self.assertEqual(func_ret_ann, async_func_ret_ann) + self.assertEqual(func_ret_ann, async_func_arg_ann) + self.assertEqual(func_ret_ann, var_ann1) + self.assertEqual(func_ret_ann, var_ann2) + return func_ret_ann + + def assertAnnotationEqual( + self, annotation, expected=None, drop_parens=False, is_tuple=False, + ): + actual = self.getActual(annotation) + if expected is None: + expected = annotation if not is_tuple else annotation[1:-1] + if drop_parens: + self.assertNotEqual(actual, expected) + actual = actual.replace("(", "").replace(")", "") + + self.assertEqual(actual, expected) + + def test_annotations(self): + eq = self.assertAnnotationEqual + eq('...') + eq("'some_string'") + eq("u'some_string'") + eq("b'\\xa3'") + eq('Name') + eq('None') + eq('True') + eq('False') + eq('1') + eq('1.0') + eq('1j') + eq('True or False') + eq('True or False or None') + eq('True and False') + eq('True and False and None') + eq('Name1 and Name2 or Name3') + eq('Name1 and (Name2 or Name3)') + eq('Name1 or Name2 and Name3') + eq('(Name1 or Name2) and Name3') + eq('Name1 and Name2 or Name3 and Name4') + eq('Name1 or Name2 and Name3 or Name4') + eq('a + b + (c + d)') + eq('a * b * (c * d)') + eq('(a ** b) ** c ** d') + eq('v1 << 2') + eq('1 >> v2') + eq('1 % finished') + eq('1 + v2 - v3 * 4 ^ 5 ** v6 / 7 // 8') + eq('not great') + eq('not not great') + eq('~great') + eq('+value') + eq('++value') + eq('-1') + eq('~int and not v1 ^ 123 + v2 | True') + eq('a + (not b)') + eq('lambda: None') + eq('lambda arg: None') + eq('lambda a=True: a') + eq('lambda a, b, c=True: a') + eq("lambda a, b, c=True, *, d=1 << v2, e='str': a") + eq("lambda a, b, c=True, *vararg, d, e='str', **kwargs: a + b") + eq("lambda a, /, b, c=True, *vararg, d, e='str', **kwargs: a + b") + eq('lambda x, /: x') + eq('lambda x=1, /: x') + eq('lambda x, /, y: x + y') + eq('lambda x=1, /, y=2: x + y') + eq('lambda x, /, y=1: x + y') + eq('lambda x, /, y=1, *, z=3: x + y + z') + eq('lambda x=1, /, y=2, *, z=3: x + y + z') + eq('lambda x=1, /, y=2, *, z: x + y + z') + eq('lambda x=1, y=2, z=3, /, w=4, *, l, l2: x + y + z + w + l + l2') + eq('lambda x=1, y=2, z=3, /, w=4, *, l, l2, **kwargs: x + y + z + w + l + l2') + eq('lambda x, /, y=1, *, z: x + y + z') + eq('lambda x: lambda y: x + y') + eq('1 if True else 2') + eq('str or None if int or True else str or bytes or None') + eq('str or None if (1 if True else 2) else str or bytes or None') + eq("0 if not x else 1 if x > 0 else -1") + eq("(1 if x > 0 else -1) if x else 0") + eq("{'2.7': dead, '3.7': long_live or die_hard}") + eq("{'2.7': dead, '3.7': long_live or die_hard, **{'3.6': verygood}}") + eq("{**a, **b, **c}") + eq("{'2.7', '3.6', '3.7', '3.8', '3.9', '4.0' if gilectomy else '3.10'}") + eq("{*a, *b, *c}") + eq("({'a': 'b'}, True or False, +value, 'string', b'bytes') or None") + eq("()") + eq("(a,)") + eq("(a, b)") + eq("(a, b, c)") + eq("(*a, *b, *c)") + eq("[]") + eq("[1, 2, 3, 4, 5, 6, 7, 8, 9, 10 or A, 11 or B, 12 or C]") + eq("[*a, *b, *c]") + eq("{i for i in (1, 2, 3)}") + eq("{i ** 2 for i in (1, 2, 3)}") + eq("{i ** 2 for i, _ in ((1, 'a'), (2, 'b'), (3, 'c'))}") + eq("{i ** 2 + j for i in (1, 2, 3) for j in (1, 2, 3)}") + eq("[i for i in (1, 2, 3)]") + eq("[i ** 2 for i in (1, 2, 3)]") + eq("[i ** 2 for i, _ in ((1, 'a'), (2, 'b'), (3, 'c'))]") + eq("[i ** 2 + j for i in (1, 2, 3) for j in (1, 2, 3)]") + eq("(i for i in (1, 2, 3))") + eq("(i ** 2 for i in (1, 2, 3))") + eq("(i ** 2 for i, _ in ((1, 'a'), (2, 'b'), (3, 'c')))") + eq("(i ** 2 + j for i in (1, 2, 3) for j in (1, 2, 3))") + eq("{i: 0 for i in (1, 2, 3)}") + eq("{i: j for i, j in ((1, 'a'), (2, 'b'), (3, 'c'))}") + eq("[(x, y) for x, y in (a, b)]") + eq("[(x,) for x, in (a,)]") + eq("Python3 > Python2 > COBOL") + eq("Life is Life") + eq("call()") + eq("call(arg)") + eq("call(kwarg='hey')") + eq("call(arg, kwarg='hey')") + eq("call(arg, *args, another, kwarg='hey')") + eq("call(arg, another, kwarg='hey', **kwargs, kwarg2='ho')") + eq("lukasz.langa.pl") + eq("call.me(maybe)") + eq("1 .real") + eq("1.0.real") + eq("....__class__") + eq("list[str]") + eq("dict[str, int]") + eq("set[str,]") + eq("tuple[str, ...]") + eq("tuple[(str, *types)]") + eq("tuple[str, int, (str, int)]") + eq("tuple[(*int, str, str, (str, int))]") + eq("tuple[str, int, float, dict[str, int]]") + eq("slice[0]") + eq("slice[0:1]") + eq("slice[0:1:2]") + eq("slice[:]") + eq("slice[:-1]") + eq("slice[1:]") + eq("slice[::-1]") + eq("slice[:,]") + eq("slice[1:2,]") + eq("slice[1:2:3,]") + eq("slice[1:2, 1]") + eq("slice[1:2, 2, 3]") + eq("slice[()]") + eq("slice[a, b:c, d:e:f]") + eq("slice[(x for x in a)]") + eq('str or None if sys.version_info[0] > (3,) else str or bytes or None') + eq("f'f-string without formatted values is just a string'") + eq("f'{{NOT a formatted value}}'") + eq("f'some f-string with {a} {few():.2f} {formatted.values!r}'") + eq('''f"{f'{nested} inner'} outer"''') + eq("f'space between opening braces: { {a for a in (1, 2, 3)}}'") + eq("f'{(lambda x: x)}'") + eq("f'{(None if a else lambda x: x)}'") + eq("f'{x}'") + eq("f'{x!r}'") + eq("f'{x!a}'") + eq('(yield from outside_of_generator)') + eq('(yield)') + eq('(yield a + b)') + eq('await some.complicated[0].call(with_args=True or 1 is not 1)') + eq('[x for x in (a if b else c)]') + eq('[x for x in a if (b if c else d)]') + eq('f(x for x in a)') + eq('f(1, (x for x in a))') + eq('f((x for x in a), 2)') + eq('(((a)))', 'a') + eq('(((a, b)))', '(a, b)') + eq("(x := 10)") + eq("f'{(x := 10):=10}'") + eq("1 + 2") + eq("1 + 2 + 3") + + def test_fstring_debug_annotations(self): + # f-strings with '=' don't round trip very well, so set the expected + # result explicitely. + self.assertAnnotationEqual("f'{x=!r}'", expected="f'x={x!r}'") + self.assertAnnotationEqual("f'{x=:}'", expected="f'x={x:}'") + self.assertAnnotationEqual("f'{x=:.2f}'", expected="f'x={x:.2f}'") + self.assertAnnotationEqual("f'{x=!r}'", expected="f'x={x!r}'") + self.assertAnnotationEqual("f'{x=!a}'", expected="f'x={x!a}'") + self.assertAnnotationEqual("f'{x=!s:*^20}'", expected="f'x={x!s:*^20}'") + + def test_infinity_numbers(self): + inf = "1e" + repr(sys.float_info.max_10_exp + 1) + infj = f"{inf}j" + self.assertAnnotationEqual("1e1000", expected=inf) + self.assertAnnotationEqual("1e1000j", expected=infj) + self.assertAnnotationEqual("-1e1000", expected=f"-{inf}") + self.assertAnnotationEqual("3+1e1000j", expected=f"3 + {infj}") + self.assertAnnotationEqual("(1e1000, 1e1000j)", expected=f"({inf}, {infj})") + self.assertAnnotationEqual("'inf'") + self.assertAnnotationEqual("('inf', 1e1000, 'infxxx', 1e1000j)", expected=f"('inf', {inf}, 'infxxx', {infj})") + self.assertAnnotationEqual("(1e1000, (1e1000j,))", expected=f"({inf}, ({infj},))") + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 145adb67781701..40c2eb8d232dd9 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -91,10 +91,6 @@ def test_badsyntax_1(self): pass """, - """async def foo(a:await something()): - pass - """, - """async def foo(): def bar(): [i async for i in els] @@ -299,10 +295,6 @@ def bar(): pass """, - """async def foo(a:await b): - pass - """, - """def baz(): async def foo(a=await b): pass diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index b31a469ec79227..7c1d9c568f4ef6 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -9,6 +9,7 @@ import inspect import builtins import unittest +from textwrap import dedent from unittest.mock import Mock from typing import ClassVar, Any, List, Union, Tuple, Dict, Generic, TypeVar, Optional from typing import get_type_hints @@ -562,17 +563,17 @@ class C: self.assertEqual(len(the_fields), 3) self.assertEqual(the_fields[0].name, 'x') - self.assertEqual(the_fields[0].type, int) + self.assertEqual(the_fields[0].type, 'int') self.assertFalse(hasattr(C, 'x')) self.assertTrue (the_fields[0].init) self.assertTrue (the_fields[0].repr) self.assertEqual(the_fields[1].name, 'y') - self.assertEqual(the_fields[1].type, str) + self.assertEqual(the_fields[1].type, 'str') self.assertIsNone(getattr(C, 'y')) self.assertFalse(the_fields[1].init) self.assertTrue (the_fields[1].repr) self.assertEqual(the_fields[2].name, 'z') - self.assertEqual(the_fields[2].type, str) + self.assertEqual(the_fields[2].type, 'str') self.assertFalse(hasattr(C, 'z')) self.assertTrue (the_fields[2].init) self.assertFalse(the_fields[2].repr) @@ -758,11 +759,11 @@ class F: def validate_class(cls): # First, check __annotations__, even though they're not # function annotations. - self.assertEqual(cls.__annotations__['i'], int) - self.assertEqual(cls.__annotations__['j'], str) - self.assertEqual(cls.__annotations__['k'], F) - self.assertEqual(cls.__annotations__['l'], float) - self.assertEqual(cls.__annotations__['z'], complex) + self.assertEqual(cls.__annotations__['i'], 'int') + self.assertEqual(cls.__annotations__['j'], 'str') + self.assertEqual(cls.__annotations__['k'], 'F') + self.assertEqual(cls.__annotations__['l'], 'float') + self.assertEqual(cls.__annotations__['z'], 'complex') # Verify __init__. @@ -777,22 +778,22 @@ def validate_class(cls): self.assertEqual(param.name, 'self') param = next(params) self.assertEqual(param.name, 'i') - self.assertIs (param.annotation, int) + self.assertIs (param.annotation, 'int') self.assertEqual(param.default, inspect.Parameter.empty) self.assertEqual(param.kind, inspect.Parameter.POSITIONAL_OR_KEYWORD) param = next(params) self.assertEqual(param.name, 'j') - self.assertIs (param.annotation, str) + self.assertIs (param.annotation, 'str') self.assertEqual(param.default, inspect.Parameter.empty) self.assertEqual(param.kind, inspect.Parameter.POSITIONAL_OR_KEYWORD) param = next(params) self.assertEqual(param.name, 'k') - self.assertIs (param.annotation, F) + self.assertIs (param.annotation, 'F') # Don't test for the default, since it's set to MISSING. self.assertEqual(param.kind, inspect.Parameter.POSITIONAL_OR_KEYWORD) param = next(params) self.assertEqual(param.name, 'l') - self.assertIs (param.annotation, float) + self.assertIs (param.annotation, 'float') # Don't test for the default, since it's set to MISSING. self.assertEqual(param.kind, inspect.Parameter.POSITIONAL_OR_KEYWORD) self.assertRaises(StopIteration, next, params) @@ -2806,13 +2807,10 @@ class C: class TestStringAnnotations(unittest.TestCase): def test_classvar(self): - # Some expressions recognized as ClassVar really aren't. But - # if you're using string annotations, it's not an exact - # science. # These tests assume that both "import typing" and "from # typing import *" have been run in this file. for typestr in ('ClassVar[int]', - 'ClassVar [int]' + 'ClassVar [int]', ' ClassVar [int]', 'ClassVar', ' ClassVar ', @@ -2823,17 +2821,15 @@ def test_classvar(self): 'typing. ClassVar[str]', 'typing.ClassVar [str]', 'typing.ClassVar [ str]', - + # Double stringified + '"typing.ClassVar[int]"', # Not syntactically valid, but these will - # be treated as ClassVars. + # be treated as ClassVars. 'typing.ClassVar.[int]', 'typing.ClassVar+', ): with self.subTest(typestr=typestr): - @dataclass - class C: - x: typestr - + C = dataclass(type("C", (), {"__annotations__": {"x": typestr}})) # x is a ClassVar, so C() takes no args. C() @@ -2854,9 +2850,7 @@ def test_isnt_classvar(self): 'typingxClassVar[str]', ): with self.subTest(typestr=typestr): - @dataclass - class C: - x: typestr + C = dataclass(type("C", (), {"__annotations__": {"x": typestr}})) # x is not a ClassVar, so C() takes one arg. self.assertEqual(C(10).x, 10) @@ -2876,16 +2870,16 @@ def test_initvar(self): 'dataclasses. InitVar[str]', 'dataclasses.InitVar [str]', 'dataclasses.InitVar [ str]', - + # Double stringified + '"dataclasses.InitVar[int]"', # Not syntactically valid, but these will # be treated as InitVars. 'dataclasses.InitVar.[int]', 'dataclasses.InitVar+', ): with self.subTest(typestr=typestr): - @dataclass - class C: - x: typestr + C = dataclass(type("C", (), {"__annotations__": {"x": typestr}})) + # x is an InitVar, so doesn't create a member. with self.assertRaisesRegex(AttributeError, @@ -2899,30 +2893,22 @@ def test_isnt_initvar(self): 'typing.xInitVar[int]', ): with self.subTest(typestr=typestr): - @dataclass - class C: - x: typestr + C = dataclass(type("C", (), {"__annotations__": {"x": typestr}})) # x is not an InitVar, so there will be a member x. self.assertEqual(C(10).x, 10) def test_classvar_module_level_import(self): from test import dataclass_module_1 - from test import dataclass_module_1_str from test import dataclass_module_2 - from test import dataclass_module_2_str - for m in (dataclass_module_1, dataclass_module_1_str, - dataclass_module_2, dataclass_module_2_str, - ): + for m in (dataclass_module_1, + dataclass_module_2): with self.subTest(m=m): # There's a difference in how the ClassVars are # interpreted when using string annotations or # not. See the imported modules for details. - if m.USING_STRINGS: - c = m.CV(10) - else: - c = m.CV() + c = m.CV(10) self.assertEqual(c.cv0, 20) @@ -2938,14 +2924,9 @@ def test_classvar_module_level_import(self): # not an instance field. getattr(c, field_name) - if m.USING_STRINGS: - # iv4 is interpreted as a normal field. - self.assertIn('not_iv4', c.__dict__) - self.assertEqual(c.not_iv4, 4) - else: - # iv4 is interpreted as an InitVar, so it - # won't exist on the instance. - self.assertNotIn('not_iv4', c.__dict__) + # iv4 is interpreted as a normal field. + self.assertIn('not_iv4', c.__dict__) + self.assertEqual(c.not_iv4, 4) def test_text_annotations(self): from test import dataclass_textanno diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 4533a016a2fab5..bbaddd57d29189 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -227,28 +227,26 @@ def bug1333982(x=[]): 2 0 SETUP_ANNOTATIONS 2 LOAD_CONST 0 (1) 4 STORE_NAME 0 (x) - 6 LOAD_NAME 1 (int) - 8 LOAD_NAME 2 (__annotations__) - 10 LOAD_CONST 1 ('x') + 6 LOAD_CONST 1 ('int') + 8 LOAD_NAME 1 (__annotations__) + 10 LOAD_CONST 2 ('x') 12 STORE_SUBSCR - 3 14 LOAD_NAME 3 (fun) - 16 LOAD_CONST 0 (1) - 18 CALL_FUNCTION 1 - 20 LOAD_NAME 2 (__annotations__) - 22 LOAD_CONST 2 ('y') - 24 STORE_SUBSCR - - 4 26 LOAD_CONST 0 (1) - 28 LOAD_NAME 4 (lst) - 30 LOAD_NAME 3 (fun) - 32 LOAD_CONST 3 (0) - 34 CALL_FUNCTION 1 - 36 STORE_SUBSCR - 38 LOAD_NAME 1 (int) - 40 POP_TOP - 42 LOAD_CONST 4 (None) - 44 RETURN_VALUE + 3 14 LOAD_CONST 3 ('fun(1)') + 16 LOAD_NAME 1 (__annotations__) + 18 LOAD_CONST 4 ('y') + 20 STORE_SUBSCR + + 4 22 LOAD_CONST 0 (1) + 24 LOAD_NAME 2 (lst) + 26 LOAD_NAME 3 (fun) + 28 LOAD_CONST 5 (0) + 30 CALL_FUNCTION 1 + 32 STORE_SUBSCR + 34 LOAD_NAME 4 (int) + 36 POP_TOP + 38 LOAD_CONST 6 (None) + 40 RETURN_VALUE """ compound_stmt_str = """\ diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index edd5773e13d549..bee9f9112bf183 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -618,7 +618,7 @@ def check_wrapper(self, wrapper, wrapped, def _default_update(self): - def f(a:'This is a new annotation'): + def f(a: int): """This is a test""" pass f.attr = 'This is also a test' @@ -635,7 +635,7 @@ def test_default_update(self): self.assertEqual(wrapper.__name__, 'f') self.assertEqual(wrapper.__qualname__, f.__qualname__) self.assertEqual(wrapper.attr, 'This is also a test') - self.assertEqual(wrapper.__annotations__['a'], 'This is a new annotation') + self.assertEqual(wrapper.__annotations__['a'], 'int') self.assertNotIn('b', wrapper.__annotations__) @unittest.skipIf(sys.flags.optimize >= 2, diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index 5235fa2c783f04..2f6716dfc9a130 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -362,7 +362,7 @@ class C: z = 2 def __init__(self, x): self.x: int = x - self.assertEqual(C.__annotations__, {'_C__foo': int, 's': str}) + self.assertEqual(C.__annotations__, {'_C__foo': 'int', 's': 'str'}) with self.assertRaises(NameError): class CBad: no_such_name_defined.attr: int = 0 @@ -378,15 +378,15 @@ def __prepare__(metacls, name, bases, **kwds): return {'__annotations__': CNS()} class CC(metaclass=CMeta): XX: 'ANNOT' - self.assertEqual(CC.__annotations__['xx'], 'ANNOT') + self.assertEqual(CC.__annotations__['xx'], repr('ANNOT')) def test_var_annot_module_semantics(self): with self.assertRaises(AttributeError): print(test.__annotations__) self.assertEqual(ann_module.__annotations__, - {1: 2, 'x': int, 'y': str, 'f': typing.Tuple[int, int]}) + {1: 2, 'x': 'int', 'y': 'str', 'f': 'Tuple[int, int]'}) self.assertEqual(ann_module.M.__annotations__, - {'123': 123, 'o': type}) + {'123': 123, 'o': 'type'}) self.assertEqual(ann_module2.__annotations__, {}) def test_var_annot_in_module(self): @@ -405,7 +405,7 @@ def test_var_annot_simple_exec(self): exec("'docstring'\n" "__annotations__[1] = 2\n" "x: int = 5\n", gns, lns) - self.assertEqual(lns["__annotations__"], {1: 2, 'x': int}) + self.assertEqual(lns["__annotations__"], {1: 2, 'x': 'int'}) with self.assertRaises(KeyError): gns['__annotations__'] @@ -413,8 +413,8 @@ def test_var_annot_custom_maps(self): # tests with custom locals() and __annotations__ ns = {'__annotations__': CNS()} exec('X: int; Z: str = "Z"; (w): complex = 1j', ns) - self.assertEqual(ns['__annotations__']['x'], int) - self.assertEqual(ns['__annotations__']['z'], str) + self.assertEqual(ns['__annotations__']['x'], 'int') + self.assertEqual(ns['__annotations__']['z'], 'str') with self.assertRaises(KeyError): ns['__annotations__']['w'] nonloc_ns = {} @@ -428,7 +428,7 @@ def __setitem__(self, item, value): def __getitem__(self, item): return self._dct[item] exec('x: int = 1', {}, CNS2()) - self.assertEqual(nonloc_ns['__annotations__']['x'], int) + self.assertEqual(nonloc_ns['__annotations__']['x'], 'int') def test_var_annot_refleak(self): # complex case: custom locals plus custom __annotations__ @@ -445,7 +445,7 @@ def __setitem__(self, item, value): def __getitem__(self, item): return self._dct[item] exec('X: str', {}, CNS2()) - self.assertEqual(nonloc_ns['__annotations__']['x'], str) + self.assertEqual(nonloc_ns['__annotations__']['x'], 'str') def test_var_annot_rhs(self): ns = {} @@ -625,50 +625,46 @@ def f(*args, **kwargs): # argument annotation tests def f(x) -> list: pass - self.assertEqual(f.__annotations__, {'return': list}) + self.assertEqual(f.__annotations__, {'return': 'list'}) def f(x: int): pass - self.assertEqual(f.__annotations__, {'x': int}) + self.assertEqual(f.__annotations__, {'x': 'int'}) def f(x: int, /): pass - self.assertEqual(f.__annotations__, {'x': int}) + self.assertEqual(f.__annotations__, {'x': 'int'}) def f(x: int = 34, /): pass - self.assertEqual(f.__annotations__, {'x': int}) + self.assertEqual(f.__annotations__, {'x': 'int'}) def f(*x: str): pass - self.assertEqual(f.__annotations__, {'x': str}) + self.assertEqual(f.__annotations__, {'x': 'str'}) def f(**x: float): pass - self.assertEqual(f.__annotations__, {'x': float}) - def f(x, y: 1+2): pass - self.assertEqual(f.__annotations__, {'y': 3}) - def f(x, y: 1+2, /): pass - self.assertEqual(f.__annotations__, {'y': 3}) + self.assertEqual(f.__annotations__, {'x': 'float'}) def f(a, b: 1, c: 2, d): pass - self.assertEqual(f.__annotations__, {'b': 1, 'c': 2}) + self.assertEqual(f.__annotations__, {'b': '1', 'c': '2'}) def f(a, b: 1, /, c: 2, d): pass - self.assertEqual(f.__annotations__, {'b': 1, 'c': 2}) + self.assertEqual(f.__annotations__, {'b': '1', 'c': '2'}) def f(a, b: 1, c: 2, d, e: 3 = 4, f=5, *g: 6): pass self.assertEqual(f.__annotations__, - {'b': 1, 'c': 2, 'e': 3, 'g': 6}) + {'b': '1', 'c': '2', 'e': '3', 'g': '6'}) def f(a, b: 1, c: 2, d, e: 3 = 4, f=5, *g: 6, h: 7, i=8, j: 9 = 10, **k: 11) -> 12: pass self.assertEqual(f.__annotations__, - {'b': 1, 'c': 2, 'e': 3, 'g': 6, 'h': 7, 'j': 9, - 'k': 11, 'return': 12}) + {'b': '1', 'c': '2', 'e': '3', 'g': '6', 'h': '7', 'j': '9', + 'k': '11', 'return': '12'}) def f(a, b: 1, c: 2, d, e: 3 = 4, f: int = 5, /, *g: 6, h: 7, i=8, j: 9 = 10, **k: 11) -> 12: pass self.assertEqual(f.__annotations__, - {'b': 1, 'c': 2, 'e': 3, 'f': int, 'g': 6, 'h': 7, 'j': 9, - 'k': 11, 'return': 12}) + {'b': '1', 'c': '2', 'e': '3', 'f': 'int', 'g': '6', 'h': '7', 'j': '9', + 'k': '11', 'return': '12'}) # Check for issue #20625 -- annotations mangling class Spam: def f(self, *, __kw: 1): pass class Ham(Spam): pass - self.assertEqual(Spam.f.__annotations__, {'_Spam__kw': 1}) - self.assertEqual(Ham.f.__annotations__, {'_Spam__kw': 1}) + self.assertEqual(Spam.f.__annotations__, {'_Spam__kw': '1'}) + self.assertEqual(Ham.f.__annotations__, {'_Spam__kw': '1'}) # Check for SF Bug #1697248 - mixing decorators and a return annotation def null(x): return x @null def f(x) -> list: pass - self.assertEqual(f.__annotations__, {'return': list}) + self.assertEqual(f.__annotations__, {'return': 'list'}) # Test expressions as decorators (PEP 614): @False or null @@ -1116,8 +1112,6 @@ def g(): rest = 4, 5, 6; yield 1, 2, 3, *rest # Not allowed at class scope check_syntax_error(self, "class foo:yield 1") check_syntax_error(self, "class foo:yield from ()") - # Check annotation refleak on SyntaxError - check_syntax_error(self, "def g(a:(yield)): pass") def test_yield_in_comprehensions(self): # Check yield in comprehensions diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 6667dc91edbcec..71c4f27d27b982 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -862,7 +862,7 @@ def test_getfullargspec(self): self.assertFullArgSpecEquals(mod2.annotated, ['arg1'], ann_e={'arg1' : list}, - formatted='(arg1: list)') + formatted="(arg1: list)") self.assertFullArgSpecEquals(mod2.keyword_only_arg, [], kwonlyargs_e=['arg'], formatted='(*, arg)') @@ -2211,8 +2211,8 @@ def test(a, b:'foo') -> 123: pass self.assertEqual(self.signature(test), ((('a', ..., ..., "positional_or_keyword"), - ('b', ..., 'foo', "positional_or_keyword")), - 123)) + ('b', ..., repr('foo'), "positional_or_keyword")), + '123')) def test_signature_on_wkwonly(self): def test(*, a:float, b:str) -> int: @@ -2227,11 +2227,11 @@ def test(a, b:'foo'=10, *args:'bar', spam:'baz', ham=123, **kwargs:int): pass self.assertEqual(self.signature(test), ((('a', ..., ..., "positional_or_keyword"), - ('b', 10, 'foo', "positional_or_keyword"), - ('args', ..., 'bar', "var_positional"), - ('spam', ..., 'baz', "keyword_only"), + ('b', 10, repr('foo'), "positional_or_keyword"), + ('args', ..., repr('bar'), "var_positional"), + ('spam', ..., repr('baz'), "keyword_only"), ('ham', 123, ..., "keyword_only"), - ('kwargs', ..., int, "var_keyword")), + ('kwargs', ..., 'int', "var_keyword")), ...)) def test_signature_without_self(self): @@ -2640,12 +2640,12 @@ def test(a, b, c:int) -> 42: self.assertEqual(self.signature(partial(partial(test, 1))), ((('b', ..., ..., "positional_or_keyword"), - ('c', ..., int, "positional_or_keyword")), - 42)) + ('c', ..., 'int', "positional_or_keyword")), + '42')) self.assertEqual(self.signature(partial(partial(test, 1), 2)), - ((('c', ..., int, "positional_or_keyword"),), - 42)) + ((('c', ..., 'int', "positional_or_keyword"),), + '42')) psig = inspect.signature(partial(partial(test, 1), 2)) @@ -2764,12 +2764,12 @@ def test(it, a, *, c) -> 'spam': ((('it', ..., ..., 'positional_or_keyword'), ('a', ..., ..., 'positional_or_keyword'), ('c', 1, ..., 'keyword_only')), - 'spam')) + repr('spam'))) self.assertEqual(self.signature(Spam().ham), ((('a', ..., ..., 'positional_or_keyword'), ('c', 1, ..., 'keyword_only')), - 'spam')) + repr('spam'))) class Spam: def test(self: 'anno', x): @@ -2778,7 +2778,7 @@ def test(self: 'anno', x): g = partialmethod(test, 1) self.assertEqual(self.signature(Spam.g), - ((('self', ..., 'anno', 'positional_or_keyword'),), + ((('self', ..., repr('anno'), 'positional_or_keyword'),), ...)) def test_signature_on_fake_partialmethod(self): @@ -3116,20 +3116,16 @@ def foo(a={}): pass with self.assertRaisesRegex(TypeError, 'unhashable type'): hash(inspect.signature(foo)) - def foo(a) -> {}: pass - with self.assertRaisesRegex(TypeError, 'unhashable type'): - hash(inspect.signature(foo)) - def test_signature_str(self): def foo(a:int=1, *, b, c=None, **kwargs) -> 42: pass self.assertEqual(str(inspect.signature(foo)), - '(a: int = 1, *, b, c=None, **kwargs) -> 42') + '(a: \'int\' = 1, *, b, c=None, **kwargs) -> \'42\'') def foo(a:int=1, *args, b, c=None, **kwargs) -> 42: pass self.assertEqual(str(inspect.signature(foo)), - '(a: int = 1, *args, b, c=None, **kwargs) -> 42') + '(a: \'int\' = 1, *args, b, c=None, **kwargs) -> \'42\'') def foo(): pass @@ -3172,8 +3168,8 @@ def test() -> 42: self.assertIs(sig.return_annotation, None) sig = sig.replace(return_annotation=sig.empty) self.assertIs(sig.return_annotation, sig.empty) - sig = sig.replace(return_annotation=42) - self.assertEqual(sig.return_annotation, 42) + sig = sig.replace(return_annotation='42') + self.assertEqual(sig.return_annotation, '42') self.assertEqual(sig, inspect.signature(test)) def test_signature_on_mangled_parameters(self): @@ -3185,8 +3181,8 @@ class Ham(Spam): self.assertEqual(self.signature(Spam.foo), ((('self', ..., ..., "positional_or_keyword"), - ('_Spam__p1', 2, 1, "positional_or_keyword"), - ('_Spam__p2', 3, 2, "keyword_only")), + ('_Spam__p1', 2, '1', "positional_or_keyword"), + ('_Spam__p2', 3, '2', "keyword_only")), ...)) self.assertEqual(self.signature(Spam.foo), diff --git a/Lib/test/test_opcodes.py b/Lib/test/test_opcodes.py index 527aca664d38e8..1152eb65bb2c3d 100644 --- a/Lib/test/test_opcodes.py +++ b/Lib/test/test_opcodes.py @@ -39,7 +39,7 @@ class C: pass def test_use_existing_annotations(self): ns = {'__annotations__': {1: 2}} exec('x: int', ns) - self.assertEqual(ns['__annotations__'], {'x': int, 1: 2}) + self.assertEqual(ns['__annotations__'], {'x': 'int', 1: 2}) def test_do_not_recreate_annotations(self): # Don't rely on the existence of the '__annotations__' global. diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 0a9503e2025d6b..1fe8256d46ea45 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -302,14 +302,14 @@ def inner_has_pos_only(): def f(x: int, /): ... return f - assert inner_has_pos_only().__annotations__ == {'x': int} + assert inner_has_pos_only().__annotations__ == {'x': 'int'} class Something: def method(self): def f(x: int, /): ... return f - assert Something().method().__annotations__ == {'x': int} + assert Something().method().__annotations__ == {'x': 'int'} def multiple_levels(): def inner_has_pos_only(): @@ -317,7 +317,7 @@ def f(x: int, /): ... return f return inner_has_pos_only() - assert multiple_levels().__annotations__ == {'x': int} + assert multiple_levels().__annotations__ == {'x': 'int'} def test_same_keyword_as_positional_with_kwargs(self): def f(something,/,**kwargs): @@ -429,17 +429,6 @@ def method(self, /): self.assertEqual(C().method(), sentinel) - def test_annotations_constant_fold(self): - def g(): - def f(x: not (int is int), /): ... - - # without constant folding we end up with - # COMPARE_OP(is), IS_OP (0) - # with constant folding we should expect a IS_OP (1) - codes = [(i.opname, i.argval) for i in dis.get_instructions(g)] - self.assertNotIn(('UNARY_NOT', None), codes) - self.assertIn(('IS_OP', 1), codes) - if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 76d2af8e461ed1..2f502627f4d0a2 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -81,7 +81,7 @@ class B(builtins.object) |\x20\x20 | NO_MEANING = 'eggs' |\x20\x20 - | __annotations__ = {'NO_MEANING': } + | __annotations__ = {'NO_MEANING': 'str'} \x20\x20\x20\x20 class C(builtins.object) | Methods defined here: @@ -194,7 +194,7 @@ class C(builtins.object) Data and other attributes defined here:
    NO_MEANING = 'eggs'
    -
    __annotations__ = {'NO_MEANING': <class 'str'>}
    +
    __annotations__ = {'NO_MEANING': 'str'}

    diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 09c6eb3375409b..7c3302c1d46aeb 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -752,14 +752,6 @@ Traceback (most recent call last): SyntaxError: cannot assign to __debug__ - >>> def f(*args:(lambda __debug__:0)): pass - Traceback (most recent call last): - SyntaxError: cannot assign to __debug__ - - >>> def f(**kwargs:(lambda __debug__:0)): pass - Traceback (most recent call last): - SyntaxError: cannot assign to __debug__ - >>> with (lambda *:0): pass Traceback (most recent call last): SyntaxError: named arguments must follow bare * diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 52a59d54f044d9..75c5eee42dc543 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -671,8 +671,8 @@ def test_or_type_operator_with_forward(self): ForwardBefore = 'Forward' | T def forward_after(x: ForwardAfter[int]) -> None: ... def forward_before(x: ForwardBefore[int]) -> None: ... - assert typing.get_args(typing.get_type_hints(forward_after)['x']) == (int, Forward) - assert typing.get_args(typing.get_type_hints(forward_before)['x']) == (int, Forward) + assert typing.get_args(typing.get_type_hints(forward_after, localns=locals())['x']) == (int, Forward) + assert typing.get_args(typing.get_type_hints(forward_before, localns=locals())['x']) == (int, Forward) def test_or_type_operator_with_Protocol(self): class Proto(typing.Protocol): diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 42aa430c5e107e..4bef42f4f32fc7 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -349,7 +349,7 @@ def test_empty(self): def test_no_eval_union(self): u = Union[int, str] def f(x: u): ... - self.assertIs(get_type_hints(f)['x'], u) + self.assertIs(get_type_hints(f, globals(), locals())['x'], u) def test_function_repr_union(self): def fun() -> int: ... @@ -2849,11 +2849,11 @@ def test_get_type_hints_classes(self): self.assertEqual(gth(HasForeignBaseClass), {'some_xrepr': XRepr, 'other_a': mod_generics_cache.A, 'some_b': mod_generics_cache.B}) - self.assertEqual(gth(XRepr.__new__), + self.assertEqual(gth(XRepr), {'x': int, 'y': int}) self.assertEqual(gth(mod_generics_cache.B), {'my_inner_a1': mod_generics_cache.B.A, - 'my_inner_a2': mod_generics_cache.B.A, + 'my_inner_a2': mod_generics_cache.A, 'my_outer_a': mod_generics_cache.A}) def test_respect_no_type_check(self): @@ -3641,7 +3641,7 @@ def test_annotation_usage(self): self.assertEqual(tim.cool, 9000) self.assertEqual(CoolEmployee.__name__, 'CoolEmployee') self.assertEqual(CoolEmployee._fields, ('name', 'cool')) - self.assertEqual(CoolEmployee.__annotations__, + self.assertEqual(gth(CoolEmployee), collections.OrderedDict(name=str, cool=int)) def test_annotation_usage_with_default(self): @@ -3655,7 +3655,7 @@ def test_annotation_usage_with_default(self): self.assertEqual(CoolEmployeeWithDefault.__name__, 'CoolEmployeeWithDefault') self.assertEqual(CoolEmployeeWithDefault._fields, ('name', 'cool')) - self.assertEqual(CoolEmployeeWithDefault.__annotations__, + self.assertEqual(gth(CoolEmployeeWithDefault), dict(name=str, cool=int)) self.assertEqual(CoolEmployeeWithDefault._field_defaults, dict(cool=0)) @@ -3823,7 +3823,7 @@ def test_typeddict_errors(self): def test_py36_class_syntax_usage(self): self.assertEqual(LabelPoint2D.__name__, 'LabelPoint2D') self.assertEqual(LabelPoint2D.__module__, __name__) - self.assertEqual(LabelPoint2D.__annotations__, {'x': int, 'y': int, 'label': str}) + self.assertEqual(gth(LabelPoint2D), {'x': int, 'y': int, 'label': str}) self.assertEqual(LabelPoint2D.__bases__, (dict,)) self.assertEqual(LabelPoint2D.__total__, True) self.assertNotIsSubclass(LabelPoint2D, typing.Sequence) @@ -3882,11 +3882,11 @@ class Cat(Animal): assert BaseAnimal.__required_keys__ == frozenset(['name']) assert BaseAnimal.__optional_keys__ == frozenset([]) - assert BaseAnimal.__annotations__ == {'name': str} + assert gth(BaseAnimal) == {'name': str} assert Animal.__required_keys__ == frozenset(['name']) assert Animal.__optional_keys__ == frozenset(['tail', 'voice']) - assert Animal.__annotations__ == { + assert gth(Animal) == { 'name': str, 'tail': bool, 'voice': str, @@ -3894,7 +3894,7 @@ class Cat(Animal): assert Cat.__required_keys__ == frozenset(['name', 'fur_color']) assert Cat.__optional_keys__ == frozenset(['tail', 'voice']) - assert Cat.__annotations__ == { + assert gth(Cat) == { 'fur_color': str, 'name': str, 'tail': bool, @@ -3915,7 +3915,7 @@ def test_io(self): def stuff(a: IO) -> AnyStr: return a.readline() - a = stuff.__annotations__['a'] + a = gth(stuff)['a'] self.assertEqual(a.__parameters__, (AnyStr,)) def test_textio(self): @@ -3923,7 +3923,7 @@ def test_textio(self): def stuff(a: TextIO) -> str: return a.readline() - a = stuff.__annotations__['a'] + a = gth(stuff)['a'] self.assertEqual(a.__parameters__, ()) def test_binaryio(self): @@ -3931,7 +3931,7 @@ def test_binaryio(self): def stuff(a: BinaryIO) -> bytes: return a.readline() - a = stuff.__annotations__['a'] + a = gth(stuff)['a'] self.assertEqual(a.__parameters__, ()) def test_io_submodule(self): diff --git a/Lib/typing.py b/Lib/typing.py index 8c61bd8e084a85..4cf33c1ae92659 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -18,6 +18,7 @@ """ from abc import abstractmethod, ABCMeta +import ast import collections import collections.abc import contextlib @@ -469,6 +470,13 @@ class ForwardRef(_Final, _root=True): def __init__(self, arg, is_argument=True): if not isinstance(arg, str): raise TypeError(f"Forward reference must be a string -- got {arg!r}") + + # Double-stringified forward references is a result of activating + # the 'annotations' future by default. This way, we eliminate them in + # the runtime. + if arg.startswith(("'", '\"')) and arg.endswith(("'", '"')): + arg = arg[1:-1] + try: code = compile(arg, '', 'eval') except SyntaxError: diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-27-16-08-16.bpo-38605.rcs2uK.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-27-16-08-16.bpo-38605.rcs2uK.rst new file mode 100644 index 00000000000000..cbfe6e23523bbe --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-05-27-16-08-16.bpo-38605.rcs2uK.rst @@ -0,0 +1,3 @@ +Enable ``from __future__ import annotations`` (:pep:`563`) by default. +The values found in :attr:`__annotations__` dicts are now strings, e.g. +``{"x": "int"}`` instead of ``{"x": int}``. diff --git a/Python/ast_opt.c b/Python/ast_opt.c index 5efaac4c8925a9..22ca6f23aefa30 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -392,7 +392,6 @@ static int astfold_expr(expr_ty node_, PyArena *ctx_, _PyASTOptimizeState *state static int astfold_arguments(arguments_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); static int astfold_comprehension(comprehension_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); static int astfold_keyword(keyword_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); -static int astfold_arg(arg_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); static int astfold_withitem(withitem_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); #define CALL(FUNC, TYPE, ARG) \ @@ -595,25 +594,11 @@ astfold_comprehension(comprehension_ty node_, PyArena *ctx_, _PyASTOptimizeState static int astfold_arguments(arguments_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { - CALL_SEQ(astfold_arg, arg, node_->posonlyargs); - CALL_SEQ(astfold_arg, arg, node_->args); - CALL_OPT(astfold_arg, arg_ty, node_->vararg); - CALL_SEQ(astfold_arg, arg, node_->kwonlyargs); CALL_SEQ(astfold_expr, expr, node_->kw_defaults); - CALL_OPT(astfold_arg, arg_ty, node_->kwarg); CALL_SEQ(astfold_expr, expr, node_->defaults); return 1; } -static int -astfold_arg(arg_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) -{ - if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { - CALL_OPT(astfold_expr, expr_ty, node_->annotation); - } - return 1; -} - static int astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { @@ -622,17 +607,11 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) CALL(astfold_arguments, arguments_ty, node_->v.FunctionDef.args); CALL(astfold_body, asdl_seq, node_->v.FunctionDef.body); CALL_SEQ(astfold_expr, expr, node_->v.FunctionDef.decorator_list); - if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { - CALL_OPT(astfold_expr, expr_ty, node_->v.FunctionDef.returns); - } break; case AsyncFunctionDef_kind: CALL(astfold_arguments, arguments_ty, node_->v.AsyncFunctionDef.args); CALL(astfold_body, asdl_seq, node_->v.AsyncFunctionDef.body); CALL_SEQ(astfold_expr, expr, node_->v.AsyncFunctionDef.decorator_list); - if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { - CALL_OPT(astfold_expr, expr_ty, node_->v.AsyncFunctionDef.returns); - } break; case ClassDef_kind: CALL_SEQ(astfold_expr, expr, node_->v.ClassDef.bases); @@ -656,9 +635,6 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) break; case AnnAssign_kind: CALL(astfold_expr, expr_ty, node_->v.AnnAssign.target); - if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { - CALL(astfold_expr, expr_ty, node_->v.AnnAssign.annotation); - } CALL_OPT(astfold_expr, expr_ty, node_->v.AnnAssign.value); break; case For_kind: diff --git a/Python/compile.c b/Python/compile.c index f2563d7f7a411c..ddd2a049629c1f 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2026,12 +2026,7 @@ compiler_visit_argannotation(struct compiler *c, identifier id, { if (annotation) { PyObject *mangled; - if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) { - VISIT(c, annexpr, annotation) - } - else { - VISIT(c, expr, annotation); - } + VISIT(c, annexpr, annotation); mangled = _Py_Mangle(c->u->u_private, id); if (!mangled) return 0; @@ -5261,12 +5256,7 @@ compiler_annassign(struct compiler *c, stmt_ty s) if (s->v.AnnAssign.simple && (c->u->u_scope_type == COMPILER_SCOPE_MODULE || c->u->u_scope_type == COMPILER_SCOPE_CLASS)) { - if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) { - VISIT(c, annexpr, s->v.AnnAssign.annotation) - } - else { - VISIT(c, expr, s->v.AnnAssign.annotation); - } + VISIT(c, annexpr, s->v.AnnAssign.annotation); ADDOP_NAME(c, LOAD_NAME, __annotations__, names); mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id); ADDOP_LOAD_CONST_NEW(c, mangled); diff --git a/Python/future.c b/Python/future.c index 3cea4fee78085c..4b73eb64129052 100644 --- a/Python/future.c +++ b/Python/future.c @@ -41,7 +41,7 @@ future_check_features(PyFutureFeatures *ff, stmt_ty s, PyObject *filename) } else if (strcmp(feature, FUTURE_GENERATOR_STOP) == 0) { continue; } else if (strcmp(feature, FUTURE_ANNOTATIONS) == 0) { - ff->ff_features |= CO_FUTURE_ANNOTATIONS; + continue; } else if (strcmp(feature, "braces") == 0) { PyErr_SetString(PyExc_SyntaxError, "not a chance"); From 4714f2b7dddd5495b1228c61bfb70cbc9dc44383 Mon Sep 17 00:00:00 2001 From: Stefan Pochmann <609905+pochmann@users.noreply.github.com> Date: Wed, 7 Oct 2020 16:12:52 +0200 Subject: [PATCH 0219/1261] Fix comment about PyObject_IsTrue. (GH-22343) The `for` statement doesn't use a condition and this function, the `while` statement does. --- Objects/object.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/object.c b/Objects/object.c index fe3734404f5cf9..9889503cfd8938 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1387,7 +1387,7 @@ PyObject_GenericSetDict(PyObject *obj, PyObject *value, void *context) } -/* Test a value used as condition, e.g., in a for or if statement. +/* Test a value used as condition, e.g., in a while or if statement. Return -1 if an error occurred */ int From f80ff0e119106508c2c21aee472dd1c9b3e2c2b0 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 8 Oct 2020 00:44:31 +0300 Subject: [PATCH 0220/1261] bpo-41923: PEP 613: Add TypeAlias to typing module (#22532) This special marker annotation is intended to help in distinguishing proper PEP 484-compliant type aliases from regular top-level variable assignments. --- Doc/library/typing.rst | 13 ++++++ Doc/whatsnew/3.10.rst | 25 +++++++++++- Lib/test/test_typing.py | 40 +++++++++++++++++++ Lib/typing.py | 16 ++++++++ Misc/ACKS | 1 + .../2020-10-03-23-14-50.bpo-41923.Buonw9.rst | 1 + 6 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-03-23-14-50.bpo-41923.Buonw9.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index a72632e61b0730..f4b2718cdc2f8c 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -34,6 +34,8 @@ In the function ``greeting``, the argument ``name`` is expected to be of type :class:`str` and the return type :class:`str`. Subtypes are accepted as arguments. +.. _type-aliases: + Type aliases ============ @@ -489,6 +491,17 @@ These can be used as types in annotations and do not support ``[]``. .. versionadded:: 3.5.4 .. versionadded:: 3.6.2 +.. data:: TypeAlias + + Special annotation for explicitly declaring a :ref:`type alias `. + For example:: + + from typing import TypeAlias + + Factors: TypeAlias = list[int] + + .. versionadded:: 3.10 + Special forms """"""""""""" diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 2bcdba69957b61..4ada4be3b66715 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -99,8 +99,29 @@ in :issue:`38605`.) * :pep:`618`: The :func:`zip` function now has an optional ``strict`` flag, used to require that all the iterables have an equal length. -PEP604: New Type Operator -------------------------- +PEP 613: TypeAlias Annotation +----------------------------- + +:pep:`484` introduced the concept of type aliases, only requiring them to be +top-level unannotated assignments. This simplicity sometimes made it difficult +for type checkers to distinguish between type aliases and ordinary assignments, +especially when forward references or invalid types were involved. Compare:: + + StrCache = 'Cache[str]' # a type alias + LOG_PREFIX = 'LOG[DEBUG]' # a module constant + +Now the :mod:`typing` module has a special annotation :data:`TypeAlias` to +declare type aliases more explicitly:: + + StrCache: TypeAlias = 'Cache[str]' # a type alias + LOG_PREFIX = 'LOG[DEBUG]' # a module constant + +See :pep:`613` for more details. + +(Contributed by Mikhail Golubev in :issue:`41923`.) + +PEP604: New Type Union Operator +------------------------------- A new type union operator was introduced which enables the syntax ``X | Y``. This provides a cleaner way of expressing 'either type X or type Y' instead of diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 4bef42f4f32fc7..57dd73c529da56 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -24,6 +24,7 @@ from typing import IO, TextIO, BinaryIO from typing import Pattern, Match from typing import Annotated, ForwardRef +from typing import TypeAlias import abc import typing import weakref @@ -4176,6 +4177,45 @@ def test_annotated_in_other_types(self): self.assertEqual(X[int], List[Annotated[int, 5]]) +class TypeAliasTests(BaseTestCase): + def test_canonical_usage_with_variable_annotation(self): + Alias: TypeAlias = Employee + + def test_canonical_usage_with_type_comment(self): + Alias = Employee # type: TypeAlias + + def test_cannot_instantiate(self): + with self.assertRaises(TypeError): + TypeAlias() + + def test_no_isinstance(self): + with self.assertRaises(TypeError): + isinstance(42, TypeAlias) + + def test_no_issubclass(self): + with self.assertRaises(TypeError): + issubclass(Employee, TypeAlias) + + with self.assertRaises(TypeError): + issubclass(TypeAlias, Employee) + + def test_cannot_subclass(self): + with self.assertRaises(TypeError): + class C(TypeAlias): + pass + + with self.assertRaises(TypeError): + class C(type(TypeAlias)): + pass + + def test_repr(self): + self.assertEqual(repr(TypeAlias), 'typing.TypeAlias') + + def test_cannot_subscript(self): + with self.assertRaises(TypeError): + TypeAlias[int] + + class AllTests(BaseTestCase): """Tests for __all__.""" diff --git a/Lib/typing.py b/Lib/typing.py index 4cf33c1ae92659..0f457ab1f56dfc 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -113,6 +113,7 @@ 'runtime_checkable', 'Text', 'TYPE_CHECKING', + 'TypeAlias', ] # The pseudo-submodules 're' and 'io' are part of the public @@ -460,6 +461,21 @@ def open_helper(file: str, mode: MODE) -> str: return _GenericAlias(self, parameters) +@_SpecialForm +def TypeAlias(self, parameters): + """Special marker indicating that an assignment should + be recognized as a proper type alias definition by type + checkers. + + For example:: + + Predicate: TypeAlias = Callable[..., bool] + + It's invalid when used anywhere except as in the example above. + """ + raise TypeError(f"{self} is not subscriptable") + + class ForwardRef(_Final, _root=True): """Internal wrapper to hold a forward reference.""" diff --git a/Misc/ACKS b/Misc/ACKS index 08449fe08269bd..7d445c57214558 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -611,6 +611,7 @@ Christoph Gohlke Tim Golden Yonatan Goldschmidt Mark Gollahon +Mikhail Golubev Guilherme Gonçalves Tiago Gonçalves Chris Gonnerman diff --git a/Misc/NEWS.d/next/Library/2020-10-03-23-14-50.bpo-41923.Buonw9.rst b/Misc/NEWS.d/next/Library/2020-10-03-23-14-50.bpo-41923.Buonw9.rst new file mode 100644 index 00000000000000..dd9a1f709f33ff --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-03-23-14-50.bpo-41923.Buonw9.rst @@ -0,0 +1 @@ +Implement :pep:`613`, introducing :data:`typing.TypeAlias` annotation. From e049185b49c416ab65ee4b9447ff5bc0d027f732 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 7 Oct 2020 16:43:44 -0700 Subject: [PATCH 0221/1261] Revert "bpo-26680: Incorporate is_integer in all built-in and standard library numeric types (GH-6121)" (GH-22584) This reverts commit 58a7da9e125422323f79c4ee95ac5549989d8162. --- Doc/library/decimal.rst | 14 ------------ Doc/library/numbers.rst | 26 ++++++--------------- Doc/library/stdtypes.rst | 14 ++++++++---- Lib/_pydecimal.py | 25 --------------------- Lib/numbers.py | 21 +---------------- Lib/test/decimaltestdata/extra.decTest | 18 --------------- Lib/test/test_bool.py | 5 ----- Lib/test/test_decimal.py | 24 -------------------- Lib/test/test_fractions.py | 11 --------- Lib/test/test_long.py | 4 ---- Lib/test/test_numeric_tower.py | 31 -------------------------- Misc/ACKS | 1 - Modules/_decimal/_decimal.c | 6 ++--- Modules/_decimal/docstrings.h | 13 +++-------- Objects/clinic/longobject.c.h | 20 +---------------- Objects/longobject.c | 14 ------------ 16 files changed, 24 insertions(+), 223 deletions(-) diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index 7a6497305952f1..e194649e30d85c 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -621,13 +621,6 @@ Decimal objects Return :const:`True` if the argument is either positive or negative infinity and :const:`False` otherwise. - .. method:: is_integer() - - Return :const:`True` if the argument is a finite integral value and - :const:`False` otherwise. - - .. versionadded:: 3.10 - .. method:: is_nan() Return :const:`True` if the argument is a (quiet or signaling) NaN and @@ -1222,13 +1215,6 @@ In addition to the three supplied contexts, new contexts can be created with the Returns ``True`` if *x* is infinite; otherwise returns ``False``. - .. method:: is_integer(x) - - Returns ``True`` if *x* is finite and integral; otherwise - returns ``False``. - - .. versionadded:: 3.10 - .. method:: is_nan(x) Returns ``True`` if *x* is a qNaN or sNaN; otherwise returns ``False``. diff --git a/Doc/library/numbers.rst b/Doc/library/numbers.rst index 5d49f5eb96b7ad..1b594952ead724 100644 --- a/Doc/library/numbers.rst +++ b/Doc/library/numbers.rst @@ -49,30 +49,19 @@ The numeric tower numbers. In short, those are: a conversion to :class:`float`, :func:`math.trunc`, - :func:`round`, :func:`math.floor`, :func:`math.ceil`, :func:`divmod`, - :func:`~Real.is_integer`, ``//``, ``%``, ``<``, ``<=``, ``>``, and ``>=``. + :func:`round`, :func:`math.floor`, :func:`math.ceil`, :func:`divmod`, ``//``, + ``%``, ``<``, ``<=``, ``>``, and ``>=``. Real also provides defaults for :func:`complex`, :attr:`~Complex.real`, :attr:`~Complex.imag`, and :meth:`~Complex.conjugate`. - .. method:: is_integer() - - Returns :const:`True` if this number has a finite and integral value, - otherwise :const:`False`. This is a default implementation which - relies on successful conversion to :class:`int`. It may be overridden - in subclasses (such as it is in :class:`float`) for better performance, - or to handle special values such as NaN which are not - convertible to :class:`int`. - - .. versionadded:: 3.10 - .. class:: Rational Subtypes :class:`Real` and adds :attr:`~Rational.numerator` and :attr:`~Rational.denominator` properties, which - should be in lowest terms. With these, it provides defaults for - :func:`float` and :func:`~Real.is_integer`. + should be in lowest terms. With these, it provides a default for + :func:`float`. .. attribute:: numerator @@ -86,10 +75,9 @@ The numeric tower .. class:: Integral Subtypes :class:`Rational` and adds a conversion to :class:`int`. Provides - defaults for :func:`float`, :attr:`~Rational.numerator`, - :attr:`~Rational.denominator`, and :func:`~Real.is_integer`. Adds abstract - methods for ``**`` and bit-string operations: ``<<``, ``>>``, ``&``, ``^``, - ``|``, ``~``. + defaults for :func:`float`, :attr:`~Rational.numerator`, and + :attr:`~Rational.denominator`. Adds abstract methods for ``**`` and + bit-string operations: ``<<``, ``>>``, ``&``, ``^``, ``|``, ``~``. Notes for type implementors diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 04dfea276d2b1e..5c6acc66bb4cc3 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -310,10 +310,6 @@ the operations, see :ref:`operator-summary`): +---------------------+---------------------------------+---------+--------------------+ | ``x ** y`` | *x* to the power *y* | \(5) | | +---------------------+---------------------------------+---------+--------------------+ -| ``x.is_integer()`` | ``True`` if *x* has a finite | | :func:`~numbers\ | -| | and integral value, otherwise | | .Real.is_integer` | -| | ``False``. | | | -+---------------------+---------------------------------+---------+--------------------+ .. index:: triple: operations on; numeric; types @@ -587,6 +583,16 @@ class`. float also has the following additional methods. :exc:`OverflowError` on infinities and a :exc:`ValueError` on NaNs. +.. method:: float.is_integer() + + Return ``True`` if the float instance is finite with integral + value, and ``False`` otherwise:: + + >>> (-2.0).is_integer() + True + >>> (3.2).is_integer() + False + Two methods support conversion to and from hexadecimal strings. Since Python's floats are stored internally as binary numbers, converting a float to or from a diff --git a/Lib/_pydecimal.py b/Lib/_pydecimal.py index 8c0ef570922197..ab989e5206a9e9 100644 --- a/Lib/_pydecimal.py +++ b/Lib/_pydecimal.py @@ -3164,12 +3164,6 @@ def is_zero(self): """Return True if self is a zero; otherwise return False.""" return not self._is_special and self._int == '0' - def is_integer(self): - """Return True is self is finite and integral; otherwise False.""" - if self._is_special: - return False - return self.to_integral_value(rounding=ROUND_FLOOR) == self - def _ln_exp_bound(self): """Compute a lower bound for the adjusted exponent of self.ln(). In other words, compute r such that self.ln() >= 10**r. Assumes @@ -4665,25 +4659,6 @@ def is_zero(self, a): a = _convert_other(a, raiseit=True) return a.is_zero() - def is_integer(self, a): - """Return True if the operand is integral; otherwise return False. - - >>> ExtendedContext.is_integer(Decimal('0')) - True - >>> ExtendedContext.is_integer(Decimal('2.50')) - False - >>> ExtendedContext.is_integer(Decimal('-0E+2')) - True - >>> ExtendedContext.is_integer(Decimal('-0.5')) - False - >>> ExtendedContext.is_integer(Decimal('NaN')) - False - >>> ExtendedContext.is_integer(10) - True - """ - a = _convert_other(a, raiseit=True) - return a.is_integer() - def ln(self, a): """Returns the natural (base e) logarithm of the operand. diff --git a/Lib/numbers.py b/Lib/numbers.py index 0634f62ff123c4..ed815ef41ebe12 100644 --- a/Lib/numbers.py +++ b/Lib/numbers.py @@ -148,7 +148,7 @@ class Real(Complex): """To Complex, Real adds the operations that work on real numbers. In short, those are: a conversion to float, trunc(), divmod, - is_integer, %, <, <=, >, and >=. + %, <, <=, >, and >=. Real also provides defaults for the derived operations. """ @@ -242,17 +242,6 @@ def __le__(self, other): """self <= other""" raise NotImplementedError - def is_integer(self): - """Return True if the Real is integral; otherwise return False. - - This default implementation can be overridden in subclasses - for performance reasons or to deal with values such as NaN, - which would otherwise cause an exception to be raised. - """ - # Although __int__ is not defined at this level, the int - # constructor falls back to __trunc__, which we do have. - return self == int(self) - # Concrete implementations of Complex abstract methods. def __complex__(self): """complex(self) == complex(float(self), 0)""" @@ -301,10 +290,6 @@ def __float__(self): """ return self.numerator / self.denominator - def is_integer(self): - """Return True if the Rational is integral; otherwise return False.""" - return self.denominator == 1 - class Integral(Rational): """Integral adds a conversion to int and the bit-string operations.""" @@ -401,8 +386,4 @@ def denominator(self): """Integers have a denominator of 1.""" return 1 - def is_integer(self): - """Return True; all Integrals represent an integral value.""" - return True - Integral.register(int) diff --git a/Lib/test/decimaltestdata/extra.decTest b/Lib/test/decimaltestdata/extra.decTest index 2f0719ed22342a..b630d8e3f9d45e 100644 --- a/Lib/test/decimaltestdata/extra.decTest +++ b/Lib/test/decimaltestdata/extra.decTest @@ -2346,24 +2346,6 @@ bool2096 iszero sNaN -> 0 bool2097 iszero -sNaN -> 0 bool2098 iszero sNaN123 -> 0 bool2099 iszero -sNaN123 -> 0 -bool2100 is_integer -1.0 -> 1 -bool2101 is_integer 0.0 -> 1 -bool2102 is_integer 1.0 -> 1 -bool2103 is_integer 42 -> 1 -bool2104 is_integer 1e2 -> 1 -bool2105 is_integer 1.5 -> 0 -bool2106 is_integer 1e-2 -> 0 -bool2107 is_integer NaN -> 0 -bool2109 is_integer -NaN -> 0 -bool2110 is_integer NaN123 -> 0 -bool2111 is_integer -NaN123 -> 0 -bool2112 is_integer sNaN -> 0 -bool2113 is_integer -sNaN -> 0 -bool2114 is_integer sNaN123 -> 0 -bool2115 is_integer -sNaN123 -> 0 -bool2116 is_integer Infinity -> 0 -bool2117 is_integer -Infinity -> 0 - ------------------------------------------------------------------------ -- The following tests (pwmx0 through pwmx440) are for the -- diff --git a/Lib/test/test_bool.py b/Lib/test/test_bool.py index bc201e10ff2671..7b3a3859e08932 100644 --- a/Lib/test/test_bool.py +++ b/Lib/test/test_bool.py @@ -354,11 +354,6 @@ def test_real_and_imag(self): self.assertIs(type(False.real), int) self.assertIs(type(False.imag), int) - def test_always_is_integer(self): - # Issue #26680: Incorporating number.is_integer into bool - self.assertTrue(all(b.is_integer() for b in (False, True))) - - def test_main(): support.run_unittest(BoolTest) diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index efb41fd4650566..dbd58e8a6519b1 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -276,7 +276,6 @@ def setUp(self): 'is_snan', 'is_subnormal', 'is_zero', - 'is_integer', 'same_quantum') def read_unlimited(self, v, context): @@ -2727,7 +2726,6 @@ def test_named_parameters(self): self.assertRaises(TypeError, D(1).is_snan, context=xc) self.assertRaises(TypeError, D(1).is_signed, context=xc) self.assertRaises(TypeError, D(1).is_zero, context=xc) - self.assertRaises(TypeError, D(1).is_integer, context=xc) self.assertFalse(D("0.01").is_normal(context=xc)) self.assertTrue(D("0.01").is_subnormal(context=xc)) @@ -3199,15 +3197,6 @@ def test_is_zero(self): self.assertEqual(c.is_zero(10), d) self.assertRaises(TypeError, c.is_zero, '10') - def test_is_integer(self): - Decimal = self.decimal.Decimal - Context = self.decimal.Context - - c = Context() - b = c.is_integer(Decimal(10)) - self.assertEqual(c.is_integer(10), b) - self.assertRaises(TypeError, c.is_integer, '10') - def test_ln(self): Decimal = self.decimal.Decimal Context = self.decimal.Context @@ -4371,19 +4360,6 @@ def test_implicit_context(self): self.assertTrue(Decimal("-1").is_signed()) self.assertTrue(Decimal("0").is_zero()) self.assertTrue(Decimal("0").is_zero()) - self.assertTrue(Decimal("-1").is_integer()) - self.assertTrue(Decimal("0").is_integer()) - self.assertTrue(Decimal("1").is_integer()) - self.assertTrue(Decimal("42").is_integer()) - self.assertTrue(Decimal("1e2").is_integer()) - self.assertFalse(Decimal("1.5").is_integer()) - self.assertFalse(Decimal("1e-2").is_integer()) - self.assertFalse(Decimal("NaN").is_integer()) - self.assertFalse(Decimal("-NaN").is_integer()) - self.assertFalse(Decimal("sNaN").is_integer()) - self.assertFalse(Decimal("-sNaN").is_integer()) - self.assertFalse(Decimal("Inf").is_integer()) - self.assertFalse(Decimal("-Inf").is_integer()) # Copy with localcontext() as c: diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 811b58fd8f56aa..0845f7921c39ec 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -724,17 +724,6 @@ def denominator(self): self.assertEqual(type(f.numerator), myint) self.assertEqual(type(f.denominator), myint) - def test_is_integer(self): - # Issue #26680: Incorporating number.is_integer into Fraction - self.assertTrue(F(-1, 1).is_integer()) - self.assertTrue(F(0, 1).is_integer()) - self.assertTrue(F(1, 1).is_integer()) - self.assertTrue(F(42, 1).is_integer()) - self.assertTrue(F(2, 2).is_integer()) - self.assertTrue(F(8, 4).is_integer()) - self.assertFalse(F(1, 2).is_integer()) - self.assertFalse(F(1, 3).is_integer()) - self.assertFalse(F(2, 3).is_integer()) if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index 669826c0fa3c1b..c97842b5bfd233 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -1381,10 +1381,6 @@ class myint(int): self.assertEqual(type(numerator), int) self.assertEqual(type(denominator), int) - def test_int_always_is_integer(self): - # Issue #26680: Incorporating number.is_integer into int - self.assertTrue(all(x.is_integer() for x in (-1, 0, 1, 42))) - if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_numeric_tower.py b/Lib/test/test_numeric_tower.py index 4e46aacad82b6a..c54dedb8b793a0 100644 --- a/Lib/test/test_numeric_tower.py +++ b/Lib/test/test_numeric_tower.py @@ -6,7 +6,6 @@ import sys import operator -from numbers import Real, Rational, Integral from decimal import Decimal as D from fractions import Fraction as F @@ -199,35 +198,5 @@ def test_complex(self): self.assertRaises(TypeError, op, v, z) -class IsIntegerTest(unittest.TestCase): - - def test_real_is_integer(self): - self.assertTrue(Real.is_integer(-1.0)) - self.assertTrue(Real.is_integer(0.0)) - self.assertTrue(Real.is_integer(1.0)) - self.assertTrue(Real.is_integer(42.0)) - - self.assertFalse(Real.is_integer(-0.5)) - self.assertFalse(Real.is_integer(4.2)) - - def test_rational_is_integer(self): - self.assertTrue(Rational.is_integer(F(-1, 1))) - self.assertTrue(Rational.is_integer(F(0, 1))) - self.assertTrue(Rational.is_integer(F(1, 1))) - self.assertTrue(Rational.is_integer(F(42, 1))) - self.assertTrue(Rational.is_integer(F(2, 2))) - self.assertTrue(Rational.is_integer(F(8, 4))) - - self.assertFalse(Rational.is_integer(F(1, 2))) - self.assertFalse(Rational.is_integer(F(1, 3))) - self.assertFalse(Rational.is_integer(F(2, 3))) - - def test_integral_is_integer(self): - self.assertTrue(Integral.is_integer(-1)) - self.assertTrue(Integral.is_integer(0)) - self.assertTrue(Integral.is_integer(1)) - self.assertTrue(Integral.is_integer(1729)) - - if __name__ == '__main__': unittest.main() diff --git a/Misc/ACKS b/Misc/ACKS index 7d445c57214558..660b8ef7504eeb 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1613,7 +1613,6 @@ Roman Skurikhin Ville Skyttä Michael Sloan Nick Sloan -Robert Smallshire Václav Šmilauer Allen W. Smith Christopher Smith diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 5200b1a48e4bfa..e7c44acba02fc2 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -4138,7 +4138,6 @@ Dec_BoolFunc(mpd_isqnan) Dec_BoolFunc(mpd_issnan) Dec_BoolFunc(mpd_issigned) Dec_BoolFunc(mpd_iszero) -Dec_BoolFunc(mpd_isinteger) /* Boolean functions, optional context arg */ Dec_BoolFuncVA(mpd_isnormal) @@ -4773,7 +4772,6 @@ static PyMethodDef dec_methods [] = { "is_snan", dec_mpd_issnan, METH_NOARGS, doc_is_snan }, { "is_signed", dec_mpd_issigned, METH_NOARGS, doc_is_signed }, { "is_zero", dec_mpd_iszero, METH_NOARGS, doc_is_zero }, - { "is_integer", dec_mpd_isinteger, METH_NOARGS, doc_is_integer}, /* Boolean functions, optional context arg */ { "is_normal", (PyCFunction)(void(*)(void))dec_mpd_isnormal, METH_VARARGS|METH_KEYWORDS, doc_is_normal }, @@ -5185,7 +5183,6 @@ DecCtx_BoolFunc_NO_CTX(mpd_isqnan) DecCtx_BoolFunc_NO_CTX(mpd_issigned) DecCtx_BoolFunc_NO_CTX(mpd_issnan) DecCtx_BoolFunc_NO_CTX(mpd_iszero) -DecCtx_BoolFunc_NO_CTX(mpd_isinteger) static PyObject * ctx_iscanonical(PyObject *context UNUSED, PyObject *v) @@ -5467,7 +5464,6 @@ static PyMethodDef context_methods [] = { "is_snan", ctx_mpd_issnan, METH_O, doc_ctx_is_snan }, { "is_subnormal", ctx_mpd_issubnormal, METH_O, doc_ctx_is_subnormal }, { "is_zero", ctx_mpd_iszero, METH_O, doc_ctx_is_zero }, - { "is_integer", ctx_mpd_isinteger, METH_O, doc_ctx_is_integer }, /* Functions with a single decimal argument */ { "_apply", PyDecContext_Apply, METH_O, NULL }, /* alias for apply */ @@ -6101,3 +6097,5 @@ PyInit__decimal(void) return NULL; /* GCOV_NOT_REACHED */ } + + diff --git a/Modules/_decimal/docstrings.h b/Modules/_decimal/docstrings.h index bd602ab278e0ed..f7fd6e79529984 100644 --- a/Modules/_decimal/docstrings.h +++ b/Modules/_decimal/docstrings.h @@ -260,11 +260,6 @@ Return True if the argument is a (positive or negative) zero and False\n\ otherwise.\n\ \n"); -PyDoc_STRVAR(doc_is_integer, -"is_integer($self, /)\n--\n\n\ -Return True if the argument is finite and integral, otherwise False.\n\ -\n"); - PyDoc_STRVAR(doc_ln, "ln($self, /, context=None)\n--\n\n\ Return the natural (base e) logarithm of the operand. The function always\n\ @@ -690,11 +685,6 @@ PyDoc_STRVAR(doc_ctx_is_zero, Return True if x is a zero, False otherwise.\n\ \n"); -PyDoc_STRVAR(doc_ctx_is_integer, -"is_integer($self, x, /)\n--\n\n\ -+Return True if x is finite and integral, False otherwise.\n\ -+\n"); - PyDoc_STRVAR(doc_ctx_ln, "ln($self, x, /)\n--\n\n\ Return the natural (base e) logarithm of x.\n\ @@ -889,3 +879,6 @@ Convert a number to a string using scientific notation.\n\ #endif /* DOCSTRINGS_H */ + + + diff --git a/Objects/clinic/longobject.c.h b/Objects/clinic/longobject.c.h index 16e6f7e619e872..4bd47b116f883c 100644 --- a/Objects/clinic/longobject.c.h +++ b/Objects/clinic/longobject.c.h @@ -121,24 +121,6 @@ int___round__(PyObject *self, PyObject *const *args, Py_ssize_t nargs) return return_value; } -PyDoc_STRVAR(int_is_integer__doc__, -"is_integer($self, /)\n" -"--\n" -"\n" -"Returns True for all integers."); - -#define INT_IS_INTEGER_METHODDEF \ - {"is_integer", (PyCFunction)int_is_integer, METH_NOARGS, int_is_integer__doc__}, - -static PyObject * -int_is_integer_impl(PyObject *self); - -static PyObject * -int_is_integer(PyObject *self, PyObject *Py_UNUSED(ignored)) -{ - return int_is_integer_impl(self); -} - PyDoc_STRVAR(int___sizeof____doc__, "__sizeof__($self, /)\n" "--\n" @@ -385,4 +367,4 @@ int_from_bytes(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyOb exit: return return_value; } -/*[clinic end generated code: output=022614978e2fcdf3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ea18e51af5b53591 input=a9049054013a1b77]*/ diff --git a/Objects/longobject.c b/Objects/longobject.c index bc5b49dcf8b56f..92514d4154e2cb 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5233,19 +5233,6 @@ int___round___impl(PyObject *self, PyObject *o_ndigits) return result; } -/*[clinic input] -int.is_integer - -Returns True for all integers. -[clinic start generated code]*/ - -static PyObject * -int_is_integer_impl(PyObject *self) -/*[clinic end generated code: output=90f8e794ce5430ef input=1c1a86957301d26d]*/ -{ - Py_RETURN_TRUE; -} - /*[clinic input] int.__sizeof__ -> Py_ssize_t @@ -5560,7 +5547,6 @@ static PyMethodDef long_methods[] = { {"__ceil__", long_long_meth, METH_NOARGS, "Ceiling of an Integral returns itself."}, INT___ROUND___METHODDEF - INT_IS_INTEGER_METHODDEF INT___GETNEWARGS___METHODDEF INT___FORMAT___METHODDEF INT___SIZEOF___METHODDEF From 153eea9abf8acfa51890156f4d43450b80dd9f98 Mon Sep 17 00:00:00 2001 From: Phil Elson Date: Thu, 8 Oct 2020 08:37:46 +0200 Subject: [PATCH 0222/1261] bpo-41376: Fix the documentation of `site.getusersitepackages()` (GH-21602) `site.getusersitepackages()` returns the location of the user-specific site-packages directory even when the user-specific site-packages is disabled. ``` $ python -s -m site sys.path = [ '/home/user/conda/lib/python37.zip', '/home/user/conda/lib/python3.7', '/home/user/conda/lib/python3.7/lib-dynload', '/home/user/conda/lib/python3.7/site-packages', ] USER_BASE: '/home/user/.local' (exists) USER_SITE: '/home/user/.local/lib/python3.7/site-packages' (doesn't exist) ENABLE_USER_SITE: False ``` It was not practical to prevent the function from returning None if user-specific site-packages are disabled, since there are other uses of the function which are relying on this behaviour (e.g. `python -m site`). --- Doc/library/site.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/library/site.rst b/Doc/library/site.rst index b424e1ba348d87..2e3646f6a74f80 100644 --- a/Doc/library/site.rst +++ b/Doc/library/site.rst @@ -231,7 +231,9 @@ Module contents Return the path of the user-specific site-packages directory, :data:`USER_SITE`. If it is not initialized yet, this function will also set - it, respecting :envvar:`PYTHONNOUSERSITE` and :data:`USER_BASE`. + it, respecting :data:`USER_BASE`. To determine if the user-specific + site-packages was added to ``sys.path`` :data:`ENABLE_USER_SITE` should be + used. .. versionadded:: 3.2 From 805c9eb4ae425f640ed5385533faaecd832aa92c Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 8 Oct 2020 14:24:28 +0100 Subject: [PATCH 0223/1261] bpo-41970: Avoid test failure in test_lib2to3 if the module is already imported (GH-22595) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … Automerge-Triggered-By: @pablogsal --- Lib/test/test_lib2to3.py | 3 ++- .../NEWS.d/next/Tests/2020-10-08-14-00-17.bpo-41970.aZ8QFf.rst | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-10-08-14-00-17.bpo-41970.aZ8QFf.rst diff --git a/Lib/test/test_lib2to3.py b/Lib/test/test_lib2to3.py index 159a8387e4e97d..fd12a7e7acbb46 100644 --- a/Lib/test/test_lib2to3.py +++ b/Lib/test/test_lib2to3.py @@ -1,8 +1,9 @@ import unittest +from test.support.import_helper import import_fresh_module from test.support.warnings_helper import check_warnings with check_warnings(("", PendingDeprecationWarning)): - from lib2to3.tests import load_tests + load_tests = import_fresh_module('lib2to3.tests', fresh=['lib2to3']).load_tests if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Tests/2020-10-08-14-00-17.bpo-41970.aZ8QFf.rst b/Misc/NEWS.d/next/Tests/2020-10-08-14-00-17.bpo-41970.aZ8QFf.rst new file mode 100644 index 00000000000000..4cdca197fbfc64 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-10-08-14-00-17.bpo-41970.aZ8QFf.rst @@ -0,0 +1,2 @@ +Avoid a test failure in ``test_lib2to3`` if the module has already imported +at the time the test executes. Patch by Pablo Galindo. From a6c55a078fb3cb07f721242cfbc1a0962f9fe4bf Mon Sep 17 00:00:00 2001 From: E-Paine <63801254+E-Paine@users.noreply.github.com> Date: Thu, 8 Oct 2020 14:30:13 +0100 Subject: [PATCH 0224/1261] bpo-41306: Allow scale value to not be rounded (GH-21715) This fixes the test failure with Tk 6.8.10 which is caused by changes to how Tk rounds the `from`, `to` and `tickinterval` arguments. This PR uses `noconv` if the patchlevel is greater than or equal to 8.6.10 (credit to Serhiy for this idea as it is much simpler than what I previously proposed). Going into more detail for those who want it, the Tk change was made in [commit 591f68c](https://github.com/tcltk/tk/commit/591f68cb382525b72664c6fecaab87742b6cc87a) and means that the arguments listed above are rounded relative to the value of `from`. However, when rounding the `from` argument ([line 623](https://github.com/tcltk/tk/blob/591f68cb382525b72664c6fecaab87742b6cc87a/generic/tkScale.c#L623)), it is rounded relative to itself (i.e. rounding `0`) and therefore the assigned value for `from` is always what is given (no matter what values of `from` and `resolution`). Automerge-Triggered-By: @pablogsal --- Lib/tkinter/test/test_tkinter/test_widgets.py | 3 ++- .../NEWS.d/next/Tests/2020-08-03-13-44-37.bpo-41306.VDoWXI.rst | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-08-03-13-44-37.bpo-41306.VDoWXI.rst diff --git a/Lib/tkinter/test/test_tkinter/test_widgets.py b/Lib/tkinter/test/test_tkinter/test_widgets.py index 721e81369a8d5b..b6f792d6c2cf85 100644 --- a/Lib/tkinter/test/test_tkinter/test_widgets.py +++ b/Lib/tkinter/test/test_tkinter/test_widgets.py @@ -940,7 +940,8 @@ def test_digits(self): def test_from(self): widget = self.create() - self.checkFloatParam(widget, 'from', 100, 14.9, 15.1, conv=float_round) + conv = False if get_tk_patchlevel() >= (8, 6, 10) else float_round + self.checkFloatParam(widget, 'from', 100, 14.9, 15.1, conv=conv) def test_label(self): widget = self.create() diff --git a/Misc/NEWS.d/next/Tests/2020-08-03-13-44-37.bpo-41306.VDoWXI.rst b/Misc/NEWS.d/next/Tests/2020-08-03-13-44-37.bpo-41306.VDoWXI.rst new file mode 100644 index 00000000000000..5e9ba2d8a27417 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-08-03-13-44-37.bpo-41306.VDoWXI.rst @@ -0,0 +1 @@ +Fixed a failure in ``test_tk.test_widgets.ScaleTest`` happening when executing the test with Tk 8.6.10. From a08d2fb37a273b34cbd4266346ddfa27ad2b427c Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 8 Oct 2020 19:31:19 +0100 Subject: [PATCH 0225/1261] bpo-41976: Fix the fallback to gcc of ctypes.util.find_library when using gcc>9 (GH-22598) --- Lib/ctypes/test/test_find.py | 12 +++++++- Lib/ctypes/util.py | 30 +++++++++++++++---- .../2020-10-08-18-22-28.bpo-41976.Svm0wb.rst | 3 ++ 3 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst diff --git a/Lib/ctypes/test/test_find.py b/Lib/ctypes/test/test_find.py index bfb6b42cbb2277..4a8a3820f3fe1c 100644 --- a/Lib/ctypes/test/test_find.py +++ b/Lib/ctypes/test/test_find.py @@ -1,4 +1,5 @@ import unittest +import unittest.mock import os.path import sys import test.support @@ -73,7 +74,7 @@ def test_shell_injection(self): @unittest.skipUnless(sys.platform.startswith('linux'), 'Test only valid for Linux') -class LibPathFindTest(unittest.TestCase): +class FindLibraryLinux(unittest.TestCase): def test_find_on_libpath(self): import subprocess import tempfile @@ -112,6 +113,15 @@ def test_find_on_libpath(self): # LD_LIBRARY_PATH) self.assertEqual(find_library(libname), 'lib%s.so' % libname) + def test_find_library_with_gcc(self): + with unittest.mock.patch("ctypes.util._findSoname_ldconfig", lambda *args: None): + self.assertNotEqual(find_library('c'), None) + + def test_find_library_with_ld(self): + with unittest.mock.patch("ctypes.util._findSoname_ldconfig", lambda *args: None), \ + unittest.mock.patch("ctypes.util._findLib_gcc", lambda *args: None): + self.assertNotEqual(find_library('c'), None) + if __name__ == "__main__": unittest.main() diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 01176bf9696577..0c2510e1619c8e 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -93,6 +93,12 @@ def find_library(name): # Andreas Degert's find functions, using gcc, /sbin/ldconfig, objdump import re, tempfile + def _is_elf(filename): + "Return True if the given file is an ELF file" + elf_header = b'\x7fELF' + with open(filename, 'br') as thefile: + return thefile.read(4) == elf_header + def _findLib_gcc(name): # Run GCC's linker with the -t (aka --trace) option and examine the # library name it prints out. The GCC command will fail because we @@ -130,10 +136,17 @@ def _findLib_gcc(name): # Raised if the file was already removed, which is the normal # behaviour of GCC if linking fails pass - res = re.search(expr, trace) + res = re.findall(expr, trace) if not res: return None - return os.fsdecode(res.group(0)) + + for file in res: + # Check if the given file is an elf file: gcc can report + # some files that are linker scripts and not actual + # shared objects. See bpo-41976 for more details + if not _is_elf(file): + continue + return os.fsdecode(file) if sys.platform == "sunos5": @@ -299,9 +312,14 @@ def _findLib_ld(name): stderr=subprocess.PIPE, universal_newlines=True) out, _ = p.communicate() - res = re.search(expr, os.fsdecode(out)) - if res: - result = res.group(0) + res = re.findall(expr, os.fsdecode(out)) + for file in res: + # Check if the given file is an elf file: gcc can report + # some files that are linker scripts and not actual + # shared objects. See bpo-41976 for more details + if not _is_elf(file): + continue + return os.fsdecode(file) except Exception: pass # result will be None return result @@ -309,7 +327,7 @@ def _findLib_ld(name): def find_library(name): # See issue #9998 return _findSoname_ldconfig(name) or \ - _get_soname(_findLib_gcc(name) or _findLib_ld(name)) + _get_soname(_findLib_gcc(name)) or _get_soname(_findLib_ld(name)) ################################################################ # test code diff --git a/Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst b/Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst new file mode 100644 index 00000000000000..c8b3fc771845e3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst @@ -0,0 +1,3 @@ +Fixed a bug that was causing :func:`ctypes.util.find_library` to return +``None`` when triying to locate a library in an environment when gcc>=9 is +available and ``ldconfig`` is not. Patch by Pablo Galindo From c47877326fd2c5baecf26a31be1b3c17fb558a6e Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Thu, 8 Oct 2020 20:40:27 +0200 Subject: [PATCH 0226/1261] bpo-41557: Update Windows installer to use SQLite 3.33.0 (GH-21960) --- .../next/Windows/2020-08-26-09-35-06.bpo-41557.vt00cQ.rst | 1 + PCbuild/get_externals.bat | 2 +- PCbuild/python.props | 2 +- PCbuild/readme.txt | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-08-26-09-35-06.bpo-41557.vt00cQ.rst diff --git a/Misc/NEWS.d/next/Windows/2020-08-26-09-35-06.bpo-41557.vt00cQ.rst b/Misc/NEWS.d/next/Windows/2020-08-26-09-35-06.bpo-41557.vt00cQ.rst new file mode 100644 index 00000000000000..9d85461f00923f --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-08-26-09-35-06.bpo-41557.vt00cQ.rst @@ -0,0 +1 @@ +Update Windows installer to use SQLite 3.33.0. diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index a48b59cad2ed1c..3bb281904f6a61 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -54,7 +54,7 @@ set libraries= set libraries=%libraries% bzip2-1.0.6 if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1g -set libraries=%libraries% sqlite-3.32.3.0 +set libraries=%libraries% sqlite-3.33.0.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.9.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.9.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tix-8.4.3.6 diff --git a/PCbuild/python.props b/PCbuild/python.props index 5f4926efa25172..acc41a2c017684 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -56,7 +56,7 @@ $(EXTERNALS_DIR) $([System.IO.Path]::GetFullPath(`$(PySourcePath)externals`)) $(ExternalsDir)\ - $(ExternalsDir)sqlite-3.32.3.0\ + $(ExternalsDir)sqlite-3.33.0.0\ $(ExternalsDir)bzip2-1.0.6\ $(ExternalsDir)xz-5.2.2\ $(ExternalsDir)libffi\ diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index b8849757e893a7..73833d54637d5f 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -185,7 +185,7 @@ _ssl again when building. _sqlite3 - Wraps SQLite 3.32.3.0, which is itself built by sqlite3.vcxproj + Wraps SQLite 3.33.0, which is itself built by sqlite3.vcxproj Homepage: http://www.sqlite.org/ _tkinter From 7e20fa09078807efa78ae0ad1ff0ec37aa8f1fe9 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Fri, 9 Oct 2020 03:20:57 +0800 Subject: [PATCH 0227/1261] bpo-39337: Add a test case for normalizing of codec names (GH-19069) --- Lib/test/test_codecs.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index ed508f36ad4234..ddf4e08af6247a 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3415,5 +3415,30 @@ def test_rot13_func(self): 'To be, or not to be, that is the question') +class CodecNameNormalizationTest(unittest.TestCase): + """Test codec name normalization""" + def test_normalized_encoding(self): + FOUND = (1, 2, 3, 4) + NOT_FOUND = (None, None, None, None) + def search_function(encoding): + if encoding == "aaa_8": + return FOUND + else: + return NOT_FOUND + + codecs.register(search_function) + self.addCleanup(codecs.unregister, search_function) + self.assertEqual(FOUND, codecs.lookup('aaa_8')) + self.assertEqual(FOUND, codecs.lookup('AAA-8')) + self.assertEqual(FOUND, codecs.lookup('AAA---8')) + self.assertEqual(FOUND, codecs.lookup('AAA 8')) + self.assertEqual(FOUND, codecs.lookup('aaa\xe9\u20ac-8')) + self.assertEqual(NOT_FOUND, codecs.lookup('AAA.8')) + self.assertEqual(NOT_FOUND, codecs.lookup('AAA...8')) + self.assertEqual(NOT_FOUND, codecs.lookup('BBB-8')) + self.assertEqual(NOT_FOUND, codecs.lookup('BBB.8')) + self.assertEqual(NOT_FOUND, codecs.lookup('a\xe9\u20ac-8')) + + if __name__ == "__main__": unittest.main() From e549fa7343675fda05057ae3e1cfa8042560c66e Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Fri, 9 Oct 2020 00:38:36 +0300 Subject: [PATCH 0228/1261] Fix the attribute names in the docstring of GenericAlias (GH-22594) --- Objects/genericaliasobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index ab56e1c4bf1a86..6508c69cbf7e36 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -582,7 +582,7 @@ PyTypeObject Py_GenericAliasType = { .tp_name = "types.GenericAlias", .tp_doc = "Represent a PEP 585 generic type\n" "\n" - "E.g. for t = list[int], t.origin is list and t.args is (int,).", + "E.g. for t = list[int], t.__origin__ is list and t.__args__ is (int,).", .tp_basicsize = sizeof(gaobject), .tp_dealloc = ga_dealloc, .tp_repr = ga_repr, From 58c47b01f918662c67c7ee9c4b1bf4c780e6874b Mon Sep 17 00:00:00 2001 From: Nishit Date: Fri, 9 Oct 2020 15:02:15 +0530 Subject: [PATCH 0229/1261] Updated README for python 3.10 (GH-22605) Updated python version and link to the release schedule --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 176562cae308b7..33ccfc01d9c291 100644 --- a/README.rst +++ b/README.rst @@ -244,7 +244,7 @@ All current PEPs, as well as guidelines for submitting a new PEP, are listed at Release Schedule ---------------- -See :pep:`596` for Python 3.9 release details. +See :pep:`619` for Python 3.10 release details. Copyright and License Information From c69afca96de8c1f99b38fc52e3651de26d25c8d6 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Fri, 9 Oct 2020 12:56:48 +0300 Subject: [PATCH 0230/1261] bpo-41979: Accept star-unpacking on with-item targets (GH-22611) Co-authored-by: Pablo Galindo --- Grammar/python.gram | 2 +- Lib/test/test_with.py | 8 +++++++- .../2020-10-09-10-55-50.bpo-41979.ImXIk2.rst | 1 + Parser/parser.c | 15 +++++++++------ 4 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-09-10-55-50.bpo-41979.ImXIk2.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index e4533b1a1b8797..2f52bd7f2f6a41 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -182,7 +182,7 @@ with_stmt[stmt_ty]: | ASYNC 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { CHECK_VERSION(5, "Async with statements are", _Py_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) } with_item[withitem_ty]: - | e=expression 'as' t=target &(',' | ')' | ':') { _Py_withitem(e, t, p->arena) } + | e=expression 'as' t=star_target &(',' | ')' | ':') { _Py_withitem(e, t, p->arena) } | invalid_with_item | e=expression { _Py_withitem(e, NULL, p->arena) } diff --git a/Lib/test/test_with.py b/Lib/test/test_with.py index b1d7a15b5e4ee3..f21bf65fed8499 100644 --- a/Lib/test/test_with.py +++ b/Lib/test/test_with.py @@ -7,7 +7,7 @@ import sys import unittest from collections import deque -from contextlib import _GeneratorContextManager, contextmanager +from contextlib import _GeneratorContextManager, contextmanager, nullcontext class MockContextManager(_GeneratorContextManager): @@ -641,6 +641,12 @@ class B: pass self.assertEqual(blah.two, 2) self.assertEqual(blah.three, 3) + def testWithExtendedTargets(self): + with nullcontext(range(1, 5)) as (a, *b, c): + self.assertEqual(a, 1) + self.assertEqual(b, [2, 3]) + self.assertEqual(c, 4) + class ExitSwallowsExceptionTestCase(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-09-10-55-50.bpo-41979.ImXIk2.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-09-10-55-50.bpo-41979.ImXIk2.rst new file mode 100644 index 00000000000000..3250309ca22cd3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-09-10-55-50.bpo-41979.ImXIk2.rst @@ -0,0 +1 @@ +Star-unpacking is now allowed for with item's targets in the PEG parser. diff --git a/Parser/parser.c b/Parser/parser.c index 1bd74a38fbc2ba..0d92256a3ebe2d 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -4290,7 +4290,10 @@ with_stmt_rule(Parser *p) return _res; } -// with_item: expression 'as' target &(',' | ')' | ':') | invalid_with_item | expression +// with_item: +// | expression 'as' star_target &(',' | ')' | ':') +// | invalid_with_item +// | expression static withitem_ty with_item_rule(Parser *p) { @@ -4301,12 +4304,12 @@ with_item_rule(Parser *p) } withitem_ty _res = NULL; int _mark = p->mark; - { // expression 'as' target &(',' | ')' | ':') + { // expression 'as' star_target &(',' | ')' | ':') if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression 'as' target &(',' | ')' | ':')")); + D(fprintf(stderr, "%*c> with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression 'as' star_target &(',' | ')' | ':')")); Token * _keyword; expr_ty e; expr_ty t; @@ -4315,12 +4318,12 @@ with_item_rule(Parser *p) && (_keyword = _PyPegen_expect_token(p, 520)) // token='as' && - (t = target_rule(p)) // target + (t = star_target_rule(p)) // star_target && _PyPegen_lookahead(1, _tmp_47_rule, p) ) { - D(fprintf(stderr, "%*c+ with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' target &(',' | ')' | ':')")); + D(fprintf(stderr, "%*c+ with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' star_target &(',' | ')' | ':')")); _res = _Py_withitem ( e , t , p -> arena ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -4331,7 +4334,7 @@ with_item_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s with_item[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression 'as' target &(',' | ')' | ':')")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression 'as' star_target &(',' | ')' | ':')")); } { // invalid_with_item if (p->error_indicator) { From 8b62886c45ad9c895555daed7be50d847c418cbd Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 9 Oct 2020 14:14:37 +0300 Subject: [PATCH 0231/1261] bpo-41974: Remove complex.__float__, complex.__floordiv__, etc (GH-22593) Remove complex special methods __int__, __float__, __floordiv__, __mod__, __divmod__, __rfloordiv__, __rmod__ and __rdivmod__ which always raised a TypeError. --- Doc/whatsnew/3.10.rst | 6 ++ Lib/test/test_complex.py | 62 ++++++++++++++++--- .../2020-10-08-09-58-19.bpo-41974.8B-q8O.rst | 4 ++ Objects/abstract.c | 10 +-- Objects/bytesobject.c | 2 +- Objects/complexobject.c | 59 ++++-------------- Objects/floatobject.c | 2 +- Objects/unicodeobject.c | 2 +- 8 files changed, 81 insertions(+), 66 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-08-09-58-19.bpo-41974.8B-q8O.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 4ada4be3b66715..7401ba722fb4f9 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -255,6 +255,12 @@ Deprecated Removed ======= +* Removed special methods ``__int__``, ``__float__``, ``__floordiv__``, + ``__mod__``, ``__divmod__``, ``__rfloordiv__``, ``__rmod__`` and + ``__rdivmod__`` of the :class:`complex` class. They always raised + a :exc:`TypeError`. + (Contributed by Serhiy Storchaka in :issue:`41974`.) + * The ``ParserBase.error()`` method from the private and undocumented ``_markupbase`` module has been removed. :class:`html.parser.HTMLParser` is the only subclass of ``ParserBase`` and its ``error()`` implementation has already been removed in diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py index d1f241f7a60c9f..af39ee878dc913 100644 --- a/Lib/test/test_complex.py +++ b/Lib/test/test_complex.py @@ -11,6 +11,14 @@ NAN = float("nan") # These tests ensure that complex math does the right thing +ZERO_DIVISION = ( + (1+1j, 0+0j), + (1+1j, 0.0), + (1+1j, 0), + (1.0, 0+0j), + (1, 0+0j), +) + class ComplexTest(unittest.TestCase): def assertAlmostEqual(self, a, b): @@ -99,20 +107,34 @@ def test_truediv(self): self.check_div(complex(random(), random()), complex(random(), random())) - self.assertRaises(ZeroDivisionError, complex.__truediv__, 1+1j, 0+0j) - self.assertRaises(OverflowError, pow, 1e200+1j, 1e200+1j) - self.assertAlmostEqual(complex.__truediv__(2+0j, 1+1j), 1-1j) - self.assertRaises(ZeroDivisionError, complex.__truediv__, 1+1j, 0+0j) for denom_real, denom_imag in [(0, NAN), (NAN, 0), (NAN, NAN)]: z = complex(0, 0) / complex(denom_real, denom_imag) self.assertTrue(isnan(z.real)) self.assertTrue(isnan(z.imag)) + def test_truediv_zero_division(self): + for a, b in ZERO_DIVISION: + with self.assertRaises(ZeroDivisionError): + a / b + def test_floordiv(self): - self.assertRaises(TypeError, complex.__floordiv__, 3+0j, 1.5+0j) - self.assertRaises(TypeError, complex.__floordiv__, 3+0j, 0+0j) + with self.assertRaises(TypeError): + (1+1j) // (1+0j) + with self.assertRaises(TypeError): + (1+1j) // 1.0 + with self.assertRaises(TypeError): + (1+1j) // 1 + with self.assertRaises(TypeError): + 1.0 // (1+0j) + with self.assertRaises(TypeError): + 1 // (1+0j) + + def test_floordiv_zero_division(self): + for a, b in ZERO_DIVISION: + with self.assertRaises(TypeError): + a // b def test_richcompare(self): self.assertIs(complex.__eq__(1+1j, 1<<10000), False) @@ -159,13 +181,32 @@ def check(n, deltas, is_equal, imag = 0.0): def test_mod(self): # % is no longer supported on complex numbers - self.assertRaises(TypeError, (1+1j).__mod__, 0+0j) - self.assertRaises(TypeError, lambda: (3.33+4.43j) % 0) - self.assertRaises(TypeError, (1+1j).__mod__, 4.3j) + with self.assertRaises(TypeError): + (1+1j) % (1+0j) + with self.assertRaises(TypeError): + (1+1j) % 1.0 + with self.assertRaises(TypeError): + (1+1j) % 1 + with self.assertRaises(TypeError): + 1.0 % (1+0j) + with self.assertRaises(TypeError): + 1 % (1+0j) + + def test_mod_zero_division(self): + for a, b in ZERO_DIVISION: + with self.assertRaises(TypeError): + a % b def test_divmod(self): self.assertRaises(TypeError, divmod, 1+1j, 1+0j) - self.assertRaises(TypeError, divmod, 1+1j, 0+0j) + self.assertRaises(TypeError, divmod, 1+1j, 1.0) + self.assertRaises(TypeError, divmod, 1+1j, 1) + self.assertRaises(TypeError, divmod, 1.0, 1+0j) + self.assertRaises(TypeError, divmod, 1, 1+0j) + + def test_divmod_zero_division(self): + for a, b in ZERO_DIVISION: + self.assertRaises(TypeError, divmod, a, b) def test_pow(self): self.assertAlmostEqual(pow(1+1j, 0+0j), 1.0) @@ -174,6 +215,7 @@ def test_pow(self): self.assertAlmostEqual(pow(1j, -1), 1/1j) self.assertAlmostEqual(pow(1j, 200), 1) self.assertRaises(ValueError, pow, 1+1j, 1+1j, 1+1j) + self.assertRaises(OverflowError, pow, 1e200+1j, 1e200+1j) a = 3.33+4.43j self.assertEqual(a ** 0j, 1) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-08-09-58-19.bpo-41974.8B-q8O.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-08-09-58-19.bpo-41974.8B-q8O.rst new file mode 100644 index 00000000000000..034cfede84b8ad --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-08-09-58-19.bpo-41974.8B-q8O.rst @@ -0,0 +1,4 @@ +Removed special methods ``__int__``, ``__float__``, ``__floordiv__``, +``__mod__``, ``__divmod__``, ``__rfloordiv__``, ``__rmod__`` and +``__rdivmod__`` of the :class:`complex` class. They always raised +a :exc:`TypeError`. diff --git a/Objects/abstract.c b/Objects/abstract.c index c30fb4eb6a604e..2ab3371a3f3cb9 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -747,10 +747,10 @@ PyObject_Format(PyObject *obj, PyObject *format_spec) int PyNumber_Check(PyObject *o) { - return o && Py_TYPE(o)->tp_as_number && - (Py_TYPE(o)->tp_as_number->nb_index || - Py_TYPE(o)->tp_as_number->nb_int || - Py_TYPE(o)->tp_as_number->nb_float); + if (o == NULL) + return 0; + PyNumberMethods *nb = Py_TYPE(o)->tp_as_number; + return nb && (nb->nb_index || nb->nb_int || nb->nb_float || PyComplex_Check(o)); } /* Binary operators */ @@ -1461,7 +1461,7 @@ PyNumber_Long(PyObject *o) } return type_error("int() argument must be a string, a bytes-like object " - "or a number, not '%.200s'", o); + "or a real number, not '%.200s'", o); } PyObject * diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 836a736037ba43..990730cd8cdc10 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -522,7 +522,7 @@ formatlong(PyObject *v, int flags, int prec, int type) PyErr_Format(PyExc_TypeError, "%%%c format: %s is required, not %.200s", type, (type == 'o' || type == 'x' || type == 'X') ? "an integer" - : "a number", + : "a real number", Py_TYPE(v)->tp_name); return NULL; } diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 69f6c17b4a49cd..5ab839a9e9423a 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -509,23 +509,6 @@ complex_div(PyObject *v, PyObject *w) return PyComplex_FromCComplex(quot); } -static PyObject * -complex_remainder(PyObject *v, PyObject *w) -{ - PyErr_SetString(PyExc_TypeError, - "can't mod complex numbers."); - return NULL; -} - - -static PyObject * -complex_divmod(PyObject *v, PyObject *w) -{ - PyErr_SetString(PyExc_TypeError, - "can't take floor or mod of complex number."); - return NULL; -} - static PyObject * complex_pow(PyObject *v, PyObject *w, PyObject *z) { @@ -562,14 +545,6 @@ complex_pow(PyObject *v, PyObject *w, PyObject *z) return PyComplex_FromCComplex(p); } -static PyObject * -complex_int_div(PyObject *v, PyObject *w) -{ - PyErr_SetString(PyExc_TypeError, - "can't take floor of complex number."); - return NULL; -} - static PyObject * complex_neg(PyComplexObject *v) { @@ -668,22 +643,6 @@ complex_richcompare(PyObject *v, PyObject *w, int op) Py_RETURN_NOTIMPLEMENTED; } -static PyObject * -complex_int(PyObject *v) -{ - PyErr_SetString(PyExc_TypeError, - "can't convert complex to int"); - return NULL; -} - -static PyObject * -complex_float(PyObject *v) -{ - PyErr_SetString(PyExc_TypeError, - "can't convert complex to float"); - return NULL; -} - /*[clinic input] complex.conjugate @@ -966,7 +925,9 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) } nbr = Py_TYPE(r)->tp_as_number; - if (nbr == NULL || (nbr->nb_float == NULL && nbr->nb_index == NULL)) { + if (nbr == NULL || + (nbr->nb_float == NULL && nbr->nb_index == NULL && !PyComplex_Check(r))) + { PyErr_Format(PyExc_TypeError, "complex() first argument must be a string or a number, " "not '%.200s'", @@ -978,7 +939,9 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) } if (i != NULL) { nbi = Py_TYPE(i)->tp_as_number; - if (nbi == NULL || (nbi->nb_float == NULL && nbi->nb_index == NULL)) { + if (nbi == NULL || + (nbi->nb_float == NULL && nbi->nb_index == NULL && !PyComplex_Check(i))) + { PyErr_Format(PyExc_TypeError, "complex() second argument must be a number, " "not '%.200s'", @@ -1057,8 +1020,8 @@ static PyNumberMethods complex_as_number = { (binaryfunc)complex_add, /* nb_add */ (binaryfunc)complex_sub, /* nb_subtract */ (binaryfunc)complex_mul, /* nb_multiply */ - (binaryfunc)complex_remainder, /* nb_remainder */ - (binaryfunc)complex_divmod, /* nb_divmod */ + 0, /* nb_remainder */ + 0, /* nb_divmod */ (ternaryfunc)complex_pow, /* nb_power */ (unaryfunc)complex_neg, /* nb_negative */ (unaryfunc)complex_pos, /* nb_positive */ @@ -1070,9 +1033,9 @@ static PyNumberMethods complex_as_number = { 0, /* nb_and */ 0, /* nb_xor */ 0, /* nb_or */ - complex_int, /* nb_int */ + 0, /* nb_int */ 0, /* nb_reserved */ - complex_float, /* nb_float */ + 0, /* nb_float */ 0, /* nb_inplace_add */ 0, /* nb_inplace_subtract */ 0, /* nb_inplace_multiply*/ @@ -1083,7 +1046,7 @@ static PyNumberMethods complex_as_number = { 0, /* nb_inplace_and */ 0, /* nb_inplace_xor */ 0, /* nb_inplace_or */ - (binaryfunc)complex_int_div, /* nb_floor_divide */ + 0, /* nb_floor_divide */ (binaryfunc)complex_div, /* nb_true_divide */ 0, /* nb_inplace_floor_divide */ 0, /* nb_inplace_true_divide */ diff --git a/Objects/floatobject.c b/Objects/floatobject.c index d0af0ea1a98257..828bde18df70ca 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -215,7 +215,7 @@ PyFloat_FromString(PyObject *v) } else { PyErr_Format(PyExc_TypeError, - "float() argument must be a string or a number, not '%.200s'", + "float() argument must be a string or a real number, not '%.200s'", Py_TYPE(v)->tp_name); return NULL; } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 6ae06a508c6140..01e5c728b383fb 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -14839,7 +14839,7 @@ mainformatlong(PyObject *v, break; default: PyErr_Format(PyExc_TypeError, - "%%%c format: a number is required, " + "%%%c format: a real number is required, " "not %.200s", type, Py_TYPE(v)->tp_name); break; From 95291b1915c1f5fee47d298b9afbdd86642ed65f Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 9 Oct 2020 21:45:46 +0300 Subject: [PATCH 0232/1261] bpo-41831: Add tests for tkinter.Event.__repr__ (GH-22354) --- Lib/tkinter/test/test_tkinter/test_misc.py | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Lib/tkinter/test/test_tkinter/test_misc.py b/Lib/tkinter/test/test_tkinter/test_misc.py index 1e089747a91ee5..b8eea2544f5228 100644 --- a/Lib/tkinter/test/test_tkinter/test_misc.py +++ b/Lib/tkinter/test/test_tkinter/test_misc.py @@ -192,6 +192,54 @@ def test_clipboard_astral(self): with self.assertRaises(tkinter.TclError): root.clipboard_get() + def test_event_repr_defaults(self): + e = tkinter.Event() + e.serial = 12345 + e.num = '??' + e.height = '??' + e.keycode = '??' + e.state = 0 + e.time = 123456789 + e.width = '??' + e.x = '??' + e.y = '??' + e.char = '' + e.keysym = '??' + e.keysym_num = '??' + e.type = '100' + e.widget = '??' + e.x_root = '??' + e.y_root = '??' + e.delta = 0 + self.assertEqual(repr(e), '<100 event>') + + def test_event_repr(self): + e = tkinter.Event() + e.serial = 12345 + e.num = 3 + e.focus = True + e.height = 200 + e.keycode = 65 + e.state = 0x30405 + e.time = 123456789 + e.width = 300 + e.x = 10 + e.y = 20 + e.char = 'A' + e.send_event = True + e.keysym = 'Key-A' + e.keysym_num = ord('A') + e.type = tkinter.EventType.Configure + e.widget = '.text' + e.x_root = 1010 + e.y_root = 1020 + e.delta = -1 + self.assertEqual(repr(e), + "") tests_gui = (MiscTest, ) From 792b9ff02fac8f181854bd78b66cb39abd14aa93 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 9 Oct 2020 22:57:34 +0300 Subject: [PATCH 0233/1261] bpo-41831: Restore str implementation of __str__ in tkinter.EventType (GH-22355) --- Lib/tkinter/__init__.py | 5 ++--- .../next/Library/2020-09-22-11-07-50.bpo-41831.k-Eop_.rst | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-22-11-07-50.bpo-41831.k-Eop_.rst diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 3919397d3cead2..3bfeb7a0179036 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -185,8 +185,7 @@ class EventType(enum.StrEnum): Deactivate = '37' MouseWheel = '38' - def __str__(self): - return self.name + __str__ = str.__str__ class Event: @@ -266,7 +265,7 @@ def __repr__(self): 'num', 'delta', 'focus', 'x', 'y', 'width', 'height') return '<%s event%s>' % ( - self.type, + getattr(self.type, 'name', self.type), ''.join(' %s=%s' % (k, attrs[k]) for k in keys if k in attrs) ) diff --git a/Misc/NEWS.d/next/Library/2020-09-22-11-07-50.bpo-41831.k-Eop_.rst b/Misc/NEWS.d/next/Library/2020-09-22-11-07-50.bpo-41831.k-Eop_.rst new file mode 100644 index 00000000000000..84a3f5253a0604 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-22-11-07-50.bpo-41831.k-Eop_.rst @@ -0,0 +1,3 @@ +``str()`` for the ``type`` attribute of the ``tkinter.Event`` object always +returns now the numeric code returned by Tk instead of the name of the event +type. From 17fb1864fa58df4d6494b6487a7e3a5983ba41e1 Mon Sep 17 00:00:00 2001 From: Saiyang Gou Date: Fri, 9 Oct 2020 13:00:15 -0700 Subject: [PATCH 0234/1261] bpo-39481: Fix duplicate SimpleQueue type in test_genericalias.py (GH-22619) There are two different `SimpleQueue` types imported (from `multiprocessing.queues` and `queue`) in `Lib/test/test_genericalias.py`, the second one shadowing the first one, making the first one not actually tested. Fix by using different names. Automerge-Triggered-By: @gvanrossum --- Lib/test/test_genericalias.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 643fffc073e82f..2979cfb55083cb 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -29,7 +29,7 @@ except ImportError: # multiprocessing.shared_memory is not available on e.g. Android ShareableList = None -from multiprocessing.queues import SimpleQueue +from multiprocessing.queues import SimpleQueue as MPSimpleQueue from os import DirEntry from re import Pattern, Match from types import GenericAlias, MappingProxyType, AsyncGeneratorType @@ -81,7 +81,7 @@ def test_subscriptable(self): SplitResult, ParseResult, ValueProxy, ApplyResult, WeakSet, ReferenceType, ref, - ShareableList, SimpleQueue, + ShareableList, MPSimpleQueue, Future, _WorkItem, Morsel] if ctypes is not None: From 60ccb7523bb28664e3285423bcbe0d697f67e0d1 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 9 Oct 2020 23:00:45 +0300 Subject: [PATCH 0235/1261] bpo-41985: Add _PyLong_FileDescriptor_Converter and AC converter for "fildes". (GH-22620) --- Include/cpython/fileobject.h | 2 ++ Modules/clinic/fcntlmodule.c.h | 10 +++++----- Modules/clinic/posixmodule.c.h | 10 +++++----- Modules/clinic/selectmodule.c.h | 20 ++++++++++---------- Modules/fcntlmodule.c | 28 ++++++++-------------------- Modules/posixmodule.c | 18 +----------------- Modules/selectmodule.c | 19 ------------------- Modules/termios.c | 24 ++++++------------------ Objects/fileobject.c | 11 +++++++++++ Tools/clinic/clinic.py | 13 +++++++++++++ 10 files changed, 61 insertions(+), 94 deletions(-) diff --git a/Include/cpython/fileobject.h b/Include/cpython/fileobject.h index 4f2408c7e87608..fb54cabac75f8c 100644 --- a/Include/cpython/fileobject.h +++ b/Include/cpython/fileobject.h @@ -22,3 +22,5 @@ typedef PyObject * (*Py_OpenCodeHookFunction)(PyObject *, void *); PyAPI_FUNC(PyObject *) PyFile_OpenCode(const char *utf8path); PyAPI_FUNC(PyObject *) PyFile_OpenCodeObject(PyObject *path); PyAPI_FUNC(int) PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction hook, void *userData); + +PyAPI_FUNC(int) _PyLong_FileDescriptor_Converter(PyObject *, void *); diff --git a/Modules/clinic/fcntlmodule.c.h b/Modules/clinic/fcntlmodule.c.h index c6bf45fa494f06..adf527fd443113 100644 --- a/Modules/clinic/fcntlmodule.c.h +++ b/Modules/clinic/fcntlmodule.c.h @@ -35,7 +35,7 @@ fcntl_fcntl(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("fcntl", nargs, 2, 3)) { goto exit; } - if (!conv_descriptor(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } code = _PyLong_AsInt(args[1]); @@ -105,7 +105,7 @@ fcntl_ioctl(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("ioctl", nargs, 2, 4)) { goto exit; } - if (!conv_descriptor(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } code = (unsigned int)PyLong_AsUnsignedLongMask(args[1]); @@ -155,7 +155,7 @@ fcntl_flock(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("flock", nargs, 2, 2)) { goto exit; } - if (!conv_descriptor(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } code = _PyLong_AsInt(args[1]); @@ -215,7 +215,7 @@ fcntl_lockf(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("lockf", nargs, 2, 5)) { goto exit; } - if (!conv_descriptor(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } code = _PyLong_AsInt(args[1]); @@ -243,4 +243,4 @@ fcntl_lockf(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=91c2295402509595 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8ea34bd0f7cf25ec input=a9049054013a1b77]*/ diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index c15def0a0f2b8d..df680d5738c8e8 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -357,7 +357,7 @@ os_fchdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k if (!args) { goto exit; } - if (!fildes_converter(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } return_value = os_fchdir_impl(module, fd); @@ -727,7 +727,7 @@ os_fsync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw if (!args) { goto exit; } - if (!fildes_converter(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } return_value = os_fsync_impl(module, fd); @@ -787,7 +787,7 @@ os_fdatasync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject if (!args) { goto exit; } - if (!fildes_converter(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } return_value = os_fdatasync_impl(module, fd); @@ -6821,7 +6821,7 @@ os_fpathconf(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("fpathconf", nargs, 2, 2)) { goto exit; } - if (!fildes_converter(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } if (!conv_path_confname(args[1], &name)) { @@ -8919,4 +8919,4 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=a0fbdea47249ee0c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=936f33448cd66ccb input=a9049054013a1b77]*/ diff --git a/Modules/clinic/selectmodule.c.h b/Modules/clinic/selectmodule.c.h index 3a06d6d0ec9005..00a78c48477b41 100644 --- a/Modules/clinic/selectmodule.c.h +++ b/Modules/clinic/selectmodule.c.h @@ -92,7 +92,7 @@ select_poll_register(pollObject *self, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("register", nargs, 1, 2)) { goto exit; } - if (!fildes_converter(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } if (nargs < 2) { @@ -140,7 +140,7 @@ select_poll_modify(pollObject *self, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("modify", nargs, 2, 2)) { goto exit; } - if (!fildes_converter(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } if (!_PyLong_UnsignedShort_Converter(args[1], &eventmask)) { @@ -174,7 +174,7 @@ select_poll_unregister(pollObject *self, PyObject *arg) PyObject *return_value = NULL; int fd; - if (!fildes_converter(arg, &fd)) { + if (!_PyLong_FileDescriptor_Converter(arg, &fd)) { goto exit; } return_value = select_poll_unregister_impl(self, fd); @@ -256,7 +256,7 @@ select_devpoll_register(devpollObject *self, PyObject *const *args, Py_ssize_t n if (!_PyArg_CheckPositional("register", nargs, 1, 2)) { goto exit; } - if (!fildes_converter(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } if (nargs < 2) { @@ -306,7 +306,7 @@ select_devpoll_modify(devpollObject *self, PyObject *const *args, Py_ssize_t nar if (!_PyArg_CheckPositional("modify", nargs, 1, 2)) { goto exit; } - if (!fildes_converter(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } if (nargs < 2) { @@ -344,7 +344,7 @@ select_devpoll_unregister(devpollObject *self, PyObject *arg) PyObject *return_value = NULL; int fd; - if (!fildes_converter(arg, &fd)) { + if (!_PyLong_FileDescriptor_Converter(arg, &fd)) { goto exit; } return_value = select_devpoll_unregister_impl(self, fd); @@ -668,7 +668,7 @@ select_epoll_register(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t na if (!args) { goto exit; } - if (!fildes_converter(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } if (!noptargs) { @@ -721,7 +721,7 @@ select_epoll_modify(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t narg if (!args) { goto exit; } - if (!fildes_converter(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } eventmask = (unsigned int)PyLong_AsUnsignedLongMask(args[1]); @@ -766,7 +766,7 @@ select_epoll_unregister(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t if (!args) { goto exit; } - if (!fildes_converter(args[0], &fd)) { + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { goto exit; } return_value = select_epoll_unregister_impl(self, fd); @@ -1179,4 +1179,4 @@ select_kqueue_control(kqueue_queue_Object *self, PyObject *const *args, Py_ssize #ifndef SELECT_KQUEUE_CONTROL_METHODDEF #define SELECT_KQUEUE_CONTROL_METHODDEF #endif /* !defined(SELECT_KQUEUE_CONTROL_METHODDEF) */ -/*[clinic end generated code: output=7144233c42e18279 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=162f4f4efa850416 input=a9049054013a1b77]*/ diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index 39baea01ec84ea..afd28106faf4b7 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -20,24 +20,12 @@ module fcntl [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=124b58387c158179]*/ -static int -conv_descriptor(PyObject *object, int *target) -{ - int fd = PyObject_AsFileDescriptor(object); - - if (fd < 0) - return 0; - *target = fd; - return 1; -} - -/* Must come after conv_descriptor definition. */ #include "clinic/fcntlmodule.c.h" /*[clinic input] fcntl.fcntl - fd: object(type='int', converter='conv_descriptor') + fd: fildes cmd as code: int arg: object(c_default='NULL') = 0 / @@ -57,7 +45,7 @@ corresponding to the return value of the fcntl call in the C code. static PyObject * fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg) -/*[clinic end generated code: output=888fc93b51c295bd input=8cefbe59b29efbe2]*/ +/*[clinic end generated code: output=888fc93b51c295bd input=7955340198e5f334]*/ { unsigned int int_arg = 0; int ret; @@ -116,7 +104,7 @@ fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg) /*[clinic input] fcntl.ioctl - fd: object(type='int', converter='conv_descriptor') + fd: fildes request as code: unsigned_int(bitwise=True) arg as ob_arg: object(c_default='NULL') = 0 mutate_flag as mutate_arg: bool = True @@ -155,7 +143,7 @@ code. static PyObject * fcntl_ioctl_impl(PyObject *module, int fd, unsigned int code, PyObject *ob_arg, int mutate_arg) -/*[clinic end generated code: output=7f7f5840c65991be input=ede70c433cccbbb2]*/ +/*[clinic end generated code: output=7f7f5840c65991be input=967b4a4cbeceb0a8]*/ { #define IOCTL_BUFSZ 1024 /* We use the unsigned non-checked 'I' format for the 'code' parameter @@ -280,7 +268,7 @@ fcntl_ioctl_impl(PyObject *module, int fd, unsigned int code, /*[clinic input] fcntl.flock - fd: object(type='int', converter='conv_descriptor') + fd: fildes operation as code: int / @@ -292,7 +280,7 @@ function is emulated using fcntl()). static PyObject * fcntl_flock_impl(PyObject *module, int fd, int code) -/*[clinic end generated code: output=84059e2b37d2fc64 input=b70a0a41ca22a8a0]*/ +/*[clinic end generated code: output=84059e2b37d2fc64 input=0bfc00f795953452]*/ { int ret; int async_err = 0; @@ -346,7 +334,7 @@ fcntl_flock_impl(PyObject *module, int fd, int code) /*[clinic input] fcntl.lockf - fd: object(type='int', converter='conv_descriptor') + fd: fildes cmd as code: int len as lenobj: object(c_default='NULL') = 0 start as startobj: object(c_default='NULL') = 0 @@ -380,7 +368,7 @@ starts. `whence` is as with fileobj.seek(), specifically: static PyObject * fcntl_lockf_impl(PyObject *module, int fd, int code, PyObject *lenobj, PyObject *startobj, int whence) -/*[clinic end generated code: output=4985e7a172e7461a input=3a5dc01b04371f1a]*/ +/*[clinic end generated code: output=4985e7a172e7461a input=5480479fc63a04b8]*/ { int ret; int async_err = 0; diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 7c496938ed4c5e..165625c9a670a5 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1634,18 +1634,6 @@ path_error2(path_t *path, path_t *path2) /* POSIX generic methods */ -static int -fildes_converter(PyObject *o, void *p) -{ - int fd; - int *pointer = (int *)p; - fd = PyObject_AsFileDescriptor(o); - if (fd < 0) - return 0; - *pointer = fd; - return 1; -} - static PyObject * posix_fildes_fd(int fd, int (*func)(int)) { @@ -2642,10 +2630,6 @@ class dir_fd_converter(CConverter): else: self.converter = 'dir_fd_converter' -class fildes_converter(CConverter): - type = 'int' - converter = 'fildes_converter' - class uid_t_converter(CConverter): type = "uid_t" converter = '_Py_Uid_Converter' @@ -2708,7 +2692,7 @@ class sysconf_confname_converter(path_confname_converter): converter="conv_sysconf_confname" [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=f1c8ae8d744f6c8b]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=3338733161aa7879]*/ /*[clinic input] diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 13ffe09c6d4f8d..fe852f93c37d1d 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -88,25 +88,6 @@ class select.kqueue "kqueue_queue_Object *" "_selectstate_global->kqueue_queue_T [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=41071028e0ede093]*/ -static int -fildes_converter(PyObject *o, void *p) -{ - int fd; - int *pointer = (int *)p; - fd = PyObject_AsFileDescriptor(o); - if (fd == -1) - return 0; - *pointer = fd; - return 1; -} - -/*[python input] -class fildes_converter(CConverter): - type = 'int' - converter = 'fildes_converter' -[python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=ca54eb5aa476e20a]*/ - /* list of Python objects and their file descriptor */ typedef struct { PyObject *obj; /* owned reference */ diff --git a/Modules/termios.c b/Modules/termios.c index cc0d5853f85e35..79b60ffaaba4a3 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -51,18 +51,6 @@ get_termios_state(PyObject *module) return (termiosmodulestate *)state; } -static int fdconv(PyObject* obj, void* p) -{ - int fd; - - fd = PyObject_AsFileDescriptor(obj); - if (fd >= 0) { - *(int*)p = fd; - return 1; - } - return 0; -} - static struct PyModuleDef termiosmodule; PyDoc_STRVAR(termios_tcgetattr__doc__, @@ -81,7 +69,7 @@ termios_tcgetattr(PyObject *module, PyObject *args) { int fd; if (!PyArg_ParseTuple(args, "O&:tcgetattr", - fdconv, (void*)&fd)) { + _PyLong_FileDescriptor_Converter, (void*)&fd)) { return NULL; } @@ -160,7 +148,7 @@ termios_tcsetattr(PyObject *module, PyObject *args) int fd, when; PyObject *term; if (!PyArg_ParseTuple(args, "O&iO:tcsetattr", - fdconv, &fd, &when, &term)) { + _PyLong_FileDescriptor_Converter, &fd, &when, &term)) { return NULL; } @@ -233,7 +221,7 @@ termios_tcsendbreak(PyObject *module, PyObject *args) { int fd, duration; if (!PyArg_ParseTuple(args, "O&i:tcsendbreak", - fdconv, &fd, &duration)) { + _PyLong_FileDescriptor_Converter, &fd, &duration)) { return NULL; } @@ -255,7 +243,7 @@ termios_tcdrain(PyObject *module, PyObject *args) { int fd; if (!PyArg_ParseTuple(args, "O&:tcdrain", - fdconv, &fd)) { + _PyLong_FileDescriptor_Converter, &fd)) { return NULL; } @@ -280,7 +268,7 @@ termios_tcflush(PyObject *module, PyObject *args) { int fd, queue; if (!PyArg_ParseTuple(args, "O&i:tcflush", - fdconv, &fd, &queue)) { + _PyLong_FileDescriptor_Converter, &fd, &queue)) { return NULL; } @@ -305,7 +293,7 @@ termios_tcflow(PyObject *module, PyObject *args) { int fd, action; if (!PyArg_ParseTuple(args, "O&i:tcflow", - fdconv, &fd, &action)) { + _PyLong_FileDescriptor_Converter, &fd, &action)) { return NULL; } diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 1c6ecaf82c24ef..9b89448006e844 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -223,6 +223,17 @@ PyObject_AsFileDescriptor(PyObject *o) return fd; } +int +_PyLong_FileDescriptor_Converter(PyObject *o, void *ptr) +{ + int fd = PyObject_AsFileDescriptor(o); + if (fd == -1) { + return 0; + } + *(int *)ptr = fd; + return 1; +} + /* ** Py_UniversalNewlineFgets is an fgets variation that understands ** all of \r, \n and \r\n conventions. diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 1bbbd4f9fb1933..5f2eb53e6a092a 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -3103,6 +3103,19 @@ def parse_arg(self, argname, displayname): return super().parse_arg(argname, displayname) +class fildes_converter(CConverter): + type = 'int' + converter = '_PyLong_FileDescriptor_Converter' + + def _parse_arg(self, argname, displayname): + return """ + {paramname} = PyObject_AsFileDescriptor({argname}); + if ({paramname} == -1) {{{{ + goto exit; + }}}} + """.format(argname=argname, paramname=self.name) + + class float_converter(CConverter): type = 'float' default_type = float From 922e4a04554f0f7b258898f9612c213383dce092 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 9 Oct 2020 17:15:15 -0700 Subject: [PATCH 0236/1261] bpo-41756: Add PyIter_Send function (#22443) --- Doc/c-api/gen.rst | 5 ---- Doc/c-api/iter.rst | 14 +++++++++++ Doc/data/refcounts.dat | 5 ++++ Doc/whatsnew/3.10.rst | 4 ++++ Include/abstract.h | 16 +++++++++++++ Include/genobject.h | 8 +------ .../2020-09-28-14-31-07.bpo-41756.ZZ5wJG.rst | 3 +++ Modules/_asynciomodule.c | 9 +------ Modules/_testcapimodule.c | 3 ++- Objects/abstract.c | 24 +++++++++++++++++++ Objects/genobject.c | 8 +------ Python/ceval.c | 21 ++++++---------- 12 files changed, 78 insertions(+), 42 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-09-28-14-31-07.bpo-41756.ZZ5wJG.rst diff --git a/Doc/c-api/gen.rst b/Doc/c-api/gen.rst index e098425e6364d9..600f53486f79d5 100644 --- a/Doc/c-api/gen.rst +++ b/Doc/c-api/gen.rst @@ -15,11 +15,6 @@ than explicitly calling :c:func:`PyGen_New` or :c:func:`PyGen_NewWithQualName`. The C structure used for generator objects. -.. c:type:: PySendResult - - The enum value used to represent different results of :c:func:`PyGen_Send`. - - .. c:var:: PyTypeObject PyGen_Type The type object corresponding to generator objects. diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst index a2992b3452f91c..a068a43c86b6c3 100644 --- a/Doc/c-api/iter.rst +++ b/Doc/c-api/iter.rst @@ -44,3 +44,17 @@ something like this:: else { /* continue doing useful work */ } + + +.. c:type:: PySendResult + + The enum value used to represent different results of :c:func:`PyIter_Send`. + + +.. c:function:: PySendResult PyIter_Send(PyObject *iter, PyObject *arg, PyObject **presult) + + Sends the *arg* value into the iterator *iter*. Returns: + + - ``PYGEN_RETURN`` if iterator returns. Return value is returned via *presult*. + - ``PYGEN_NEXT`` if iterator yields. Yielded value is returned via *presult*. + - ``PYGEN_ERROR`` if iterator has raised and exception. *presult* is set to ``NULL``. diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index 6b1bde37967ae9..87ce5d03d00644 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -1081,6 +1081,11 @@ PyIter_Check:PyObject*:o:0: PyIter_Next:PyObject*::+1: PyIter_Next:PyObject*:o:0: +PyIter_Send:int::: +PyIter_Send:PyObject*:iter:0: +PyIter_Send:PyObject*:arg:0: +PyIter_Send:PyObject**:presult:+1: + PyList_Append:int::: PyList_Append:PyObject*:list:0: PyList_Append:PyObject*:item:+1: diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 7401ba722fb4f9..1c50978a8b7501 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -314,6 +314,10 @@ New Features search function. (Contributed by Hai Shi in :issue:`41842`.) +* The :c:func:`PyIter_Send` and :c:func:`PyGen_Send` functions were added to allow + sending value into iterator without raising ``StopIteration`` exception. + (Contributed by Vladimir Matveev in :issue:`41756`.) + Porting to Python 3.10 ---------------------- diff --git a/Include/abstract.h b/Include/abstract.h index a23b7dc78f480d..716cd4b5ebbba3 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -338,6 +338,22 @@ PyAPI_FUNC(int) PyIter_Check(PyObject *); NULL with an exception means an error occurred. */ PyAPI_FUNC(PyObject *) PyIter_Next(PyObject *); +typedef enum { + PYGEN_RETURN = 0, + PYGEN_ERROR = -1, + PYGEN_NEXT = 1, +} PySendResult; + +/* Takes generator, coroutine or iterator object and sends the value into it. + Returns: + - PYGEN_RETURN (0) if generator has returned. + 'result' parameter is filled with return value + - PYGEN_ERROR (-1) if exception was raised. + 'result' parameter is NULL + - PYGEN_NEXT (1) if generator has yielded. + 'result' parameter is filled with yielded value. */ +PyAPI_FUNC(PySendResult) PyIter_Send(PyObject *, PyObject *, PyObject **); + /* === Number Protocol ================================================== */ diff --git a/Include/genobject.h b/Include/genobject.h index 7488054c68fcd8..e719b25a800729 100644 --- a/Include/genobject.h +++ b/Include/genobject.h @@ -9,6 +9,7 @@ extern "C" { #endif #include "pystate.h" /* _PyErr_StackItem */ +#include "abstract.h" /* PySendResult */ /* _PyGenObject_HEAD defines the initial segment of generator and coroutine objects. */ @@ -41,16 +42,9 @@ PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(PyFrameObject *, PyObject *name, PyObject *qualname); PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *); PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **); -PyAPI_FUNC(PyObject *) _PyGen_Send(PyGenObject *, PyObject *); PyObject *_PyGen_yf(PyGenObject *); PyAPI_FUNC(void) _PyGen_Finalize(PyObject *self); -typedef enum { - PYGEN_RETURN = 0, - PYGEN_ERROR = -1, - PYGEN_NEXT = 1, -} PySendResult; - /* Sends the value into the generator or the coroutine. Returns: - PYGEN_RETURN (0) if generator has returned. 'result' parameter is filled with return value diff --git a/Misc/NEWS.d/next/C API/2020-09-28-14-31-07.bpo-41756.ZZ5wJG.rst b/Misc/NEWS.d/next/C API/2020-09-28-14-31-07.bpo-41756.ZZ5wJG.rst new file mode 100644 index 00000000000000..f7e27b44015296 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-09-28-14-31-07.bpo-41756.ZZ5wJG.rst @@ -0,0 +1,3 @@ +Add `PyIter_Send` function to allow sending value into +generator/coroutine/iterator without raising StopIteration exception to +signal return. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 2151f20281a31b..f01e5884c6fe20 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -16,7 +16,6 @@ _Py_IDENTIFIER(add_done_callback); _Py_IDENTIFIER(call_soon); _Py_IDENTIFIER(cancel); _Py_IDENTIFIER(get_event_loop); -_Py_IDENTIFIER(send); _Py_IDENTIFIER(throw); @@ -2695,13 +2694,7 @@ task_step_impl(TaskObj *task, PyObject *exc) int gen_status = PYGEN_ERROR; if (exc == NULL) { - if (PyGen_CheckExact(coro) || PyCoro_CheckExact(coro)) { - gen_status = PyGen_Send((PyGenObject*)coro, Py_None, &result); - } - else { - result = _PyObject_CallMethodIdOneArg(coro, &PyId_send, Py_None); - gen_status = gen_status_from_result(&result); - } + gen_status = PyIter_Send(coro, Py_None, &result); } else { result = _PyObject_CallMethodIdOneArg(coro, &PyId_throw, exc); diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 0e098779696b73..8c7544fa90e280 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5028,6 +5028,7 @@ dict_get_version(PyObject *self, PyObject *args) static PyObject * raise_SIGINT_then_send_None(PyObject *self, PyObject *args) { + _Py_IDENTIFIER(send); PyGenObject *gen; if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen)) @@ -5044,7 +5045,7 @@ raise_SIGINT_then_send_None(PyObject *self, PyObject *args) because we check for signals before every bytecode operation. */ raise(SIGINT); - return _PyGen_Send(gen, Py_None); + return _PyObject_CallMethodIdOneArg((PyObject *)gen, &PyId_send, Py_None); } diff --git a/Objects/abstract.c b/Objects/abstract.c index 2ab3371a3f3cb9..502a2d64e25e11 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2669,6 +2669,30 @@ PyIter_Next(PyObject *iter) return result; } +PySendResult +PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result) +{ + _Py_IDENTIFIER(send); + assert(result != NULL); + + if (PyGen_CheckExact(iter) || PyCoro_CheckExact(iter)) { + return PyGen_Send((PyGenObject *)iter, arg, result); + } + + if (arg == Py_None && PyIter_Check(iter)) { + *result = Py_TYPE(iter)->tp_iternext(iter); + } + else { + *result = _PyObject_CallMethodIdOneArg(iter, &PyId_send, arg); + } + if (*result != NULL) { + return PYGEN_NEXT; + } + if (_PyGen_FetchStopIterationValue(result) == 0) { + return PYGEN_RETURN; + } + return PYGEN_ERROR; +} /* * Flatten a sequence of bytes() objects into a C array of diff --git a/Objects/genobject.c b/Objects/genobject.c index f0943ae847c543..eb134ebf4bc878 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -308,12 +308,6 @@ gen_send(PyGenObject *gen, PyObject *arg) return gen_send_ex(gen, arg, 0, 0); } -PyObject * -_PyGen_Send(PyGenObject *gen, PyObject *arg) -{ - return gen_send(gen, arg); -} - PyDoc_STRVAR(close_doc, "close() -> raise GeneratorExit inside generator."); @@ -1012,7 +1006,7 @@ PyDoc_STRVAR(coro_close_doc, "close() -> raise GeneratorExit inside coroutine."); static PyMethodDef coro_methods[] = { - {"send",(PyCFunction)_PyGen_Send, METH_O, coro_send_doc}, + {"send",(PyCFunction)gen_send, METH_O, coro_send_doc}, {"throw",(PyCFunction)gen_throw, METH_VARARGS, coro_throw_doc}, {"close",(PyCFunction)gen_close, METH_NOARGS, coro_close_doc}, {NULL, NULL} /* Sentinel */ diff --git a/Python/ceval.c b/Python/ceval.c index 500c588e3c2afb..762de577e6b550 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2210,24 +2210,17 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) case TARGET(YIELD_FROM): { PyObject *v = POP(); PyObject *receiver = TOP(); - int is_gen_or_coro = PyGen_CheckExact(receiver) || PyCoro_CheckExact(receiver); - int gen_status; - if (tstate->c_tracefunc == NULL && is_gen_or_coro) { - gen_status = PyGen_Send((PyGenObject *)receiver, v, &retval); + PySendResult gen_status; + if (tstate->c_tracefunc == NULL) { + gen_status = PyIter_Send(receiver, v, &retval); } else { - if (is_gen_or_coro) { - retval = _PyGen_Send((PyGenObject *)receiver, v); + _Py_IDENTIFIER(send); + if (v == Py_None && PyIter_Check(receiver)) { + retval = Py_TYPE(receiver)->tp_iternext(receiver); } else { - _Py_IDENTIFIER(send); - if (v == Py_None) { - retval = Py_TYPE(receiver)->tp_iternext(receiver); - } - else { - retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v); - } + retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v); } - if (retval == NULL) { if (tstate->c_tracefunc != NULL && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) From 810b1cf0e6e1d0209b933203d4239755a5e4a003 Mon Sep 17 00:00:00 2001 From: Xie Yanbo Date: Sat, 10 Oct 2020 10:38:43 +0800 Subject: [PATCH 0237/1261] Fix incorrect parameter name (GH-22613) Automerge-Triggered-By: @Mariatta --- Doc/library/shutil.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index ecc3309ed5cc09..3f5122760ee16f 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -349,7 +349,7 @@ Directory and files operations will be created in or as *dst* and *src* will be removed. If *copy_function* is given, it must be a callable that takes two arguments - *src* and *dst*, and will be used to copy *src* to *dest* if + *src* and *dst*, and will be used to copy *src* to *dst* if :func:`os.rename` cannot be used. If the source is a directory, :func:`copytree` is called, passing it the :func:`copy_function`. The default *copy_function* is :func:`copy2`. Using :func:`~shutil.copy` as the From e960115a1e1762067dc8ba3cc81a6b30235bd673 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 10 Oct 2020 17:09:45 +0300 Subject: [PATCH 0238/1261] bpo-41986: Add Py_FileSystemDefaultEncodeErrors and Py_UTF8Mode back to limited API (GH-22621) --- Include/cpython/fileobject.h | 8 -------- Include/fileobject.h | 7 +++++++ .../next/C API/2020-10-09-22-50-46.bpo-41986.JUPE59.rst | 2 ++ 3 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-10-09-22-50-46.bpo-41986.JUPE59.rst diff --git a/Include/cpython/fileobject.h b/Include/cpython/fileobject.h index fb54cabac75f8c..cff2243d625e76 100644 --- a/Include/cpython/fileobject.h +++ b/Include/cpython/fileobject.h @@ -4,14 +4,6 @@ PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 -PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors; -#endif - -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 -PyAPI_DATA(int) Py_UTF8Mode; -#endif - /* The std printer acts as a preliminary sys.stderr until the new io infrastructure is in place. */ PyAPI_FUNC(PyObject *) PyFile_NewStdPrinter(int); diff --git a/Include/fileobject.h b/Include/fileobject.h index 456887ef9d045d..6ec2994aa859b6 100644 --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -20,8 +20,15 @@ PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *); If non-NULL, this is different than the default encoding for strings */ PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors; +#endif PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +PyAPI_DATA(int) Py_UTF8Mode; +#endif + /* A routine to check if a file descriptor can be select()-ed. */ #ifdef _MSC_VER /* On Windows, any socket fd can be select()-ed, no matter how high */ diff --git a/Misc/NEWS.d/next/C API/2020-10-09-22-50-46.bpo-41986.JUPE59.rst b/Misc/NEWS.d/next/C API/2020-10-09-22-50-46.bpo-41986.JUPE59.rst new file mode 100644 index 00000000000000..d456ba66bafd61 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-09-22-50-46.bpo-41986.JUPE59.rst @@ -0,0 +1,2 @@ +:c:data:`Py_FileSystemDefaultEncodeErrors` and :c:data:`Py_UTF8Mode` are +available again in limited API. From 9a22ff5781e421abd00dcbf49782c40dc36496fe Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Sat, 10 Oct 2020 20:14:59 +0300 Subject: [PATCH 0239/1261] bpo-42000: Cleanup the AST related C-code (GH-22641) - Use the proper asdl sequence when creating empty arguments - Remove reduntant casts (thanks to new typed asdl_sequences) - Remove MarshalPrototypeVisitor and some utilities from asdl generator - Fix the header of `Python/ast.c` (kept from pgen times) Automerge-Triggered-By: @pablogsal --- Parser/asdl_c.py | 42 ------------------------------------------ Parser/pegen.c | 2 +- Python/ast.c | 14 ++++---------- 3 files changed, 5 insertions(+), 53 deletions(-) diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 242eccf3d37d78..481261cd85359a 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -618,16 +618,6 @@ def visitField(self, field, name, sum=None, prod=None, depth=0): self.emit("}", depth) -class MarshalPrototypeVisitor(PickleVisitor): - - def prototype(self, sum, name): - ctype = get_c_type(name) - self.emit("static int marshal_write_%s(PyObject **, int *, %s);" - % (name, ctype), 0) - - visitProduct = visitSum = prototype - - class SequenceConstructorVisitor(EmitVisitor): def visitModule(self, mod): for dfn in mod.dfns: @@ -1167,25 +1157,6 @@ def addObj(self, name): self.emit("Py_INCREF(state->%s_type);" % name, 1) -_SPECIALIZED_SEQUENCES = ('stmt', 'expr') - -def find_sequence(fields, doing_specialization): - """Return True if any field uses a sequence.""" - for f in fields: - if f.seq: - if not doing_specialization: - return True - if str(f.type) not in _SPECIALIZED_SEQUENCES: - return True - return False - -def has_sequence(types, doing_specialization): - for t in types: - if find_sequence(t.fields, doing_specialization): - return True - return False - - class StaticVisitor(PickleVisitor): CODE = '''Very simple, always emit this static code. Override CODE''' @@ -1283,18 +1254,6 @@ def emit(s, d): emit("goto failed;", 1) emit("Py_DECREF(value);", 0) - def emitSeq(self, field, value, depth, emit): - emit("seq = %s;" % value, 0) - emit("n = asdl_seq_LEN(seq);", 0) - emit("value = PyList_New(n);", 0) - emit("if (!value) goto failed;", 0) - emit("for (i = 0; i < n; i++) {", 0) - self.set("value", field, "asdl_seq_GET(seq, i)", depth + 1) - emit("if (!value1) goto failed;", 1) - emit("PyList_SET_ITEM(value, i, value1);", 1) - emit("value1 = NULL;", 1) - emit("}", 0) - def set(self, field, value, depth): if field.seq: # XXX should really check for is_simple, but that requires a symbol table @@ -1313,7 +1272,6 @@ def set(self, field, value, depth): else: self.emit("value = ast2obj_list(state, (asdl_seq*)%s, ast2obj_%s);" % (value, field.type), depth) else: - ctype = get_c_type(field.type) self.emit("value = ast2obj_%s(state, %s);" % (field.type, value), depth, reflow=False) diff --git a/Parser/pegen.c b/Parser/pegen.c index 1de495eaf398e8..efa5ed9f288ee0 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -1897,7 +1897,7 @@ _PyPegen_empty_arguments(Parser *p) return NULL; } - return _Py_arguments(posonlyargs, posargs, NULL, kwonlyargs, kwdefaults, NULL, kwdefaults, + return _Py_arguments(posonlyargs, posargs, NULL, kwonlyargs, kwdefaults, NULL, posdefaults, p->arena); } diff --git a/Python/ast.c b/Python/ast.c index 4b7bbd229c99b2..5e74f65a2c013b 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1,18 +1,12 @@ /* - * This file includes functions to transform a concrete syntax tree (CST) to - * an abstract syntax tree (AST). The main function is PyAST_FromNode(). - * + * This file exposes PyAST_Validate interface to check the integrity + * of the given abstract syntax tree (potentially constructed manually). */ #include "Python.h" #include "Python-ast.h" #include "ast.h" -#include "token.h" -#include "pythonrun.h" #include -#include - -#define MAXLEVEL 200 /* Max parentheses level */ static int validate_stmts(asdl_stmt_seq *); static int validate_exprs(asdl_expr_seq*, expr_context_ty, int); @@ -62,7 +56,7 @@ validate_keywords(asdl_keyword_seq *keywords) { Py_ssize_t i; for (i = 0; i < asdl_seq_LEN(keywords); i++) - if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load)) + if (!validate_expr((asdl_seq_GET(keywords, i))->value, Load)) return 0; return 1; } @@ -556,7 +550,7 @@ _PyAST_GetDocString(asdl_stmt_seq *body) if (!asdl_seq_LEN(body)) { return NULL; } - stmt_ty st = (stmt_ty)asdl_seq_GET(body, 0); + stmt_ty st = asdl_seq_GET(body, 0); if (st->kind != Expr_kind) { return NULL; } From 774f35cd63d09e3d96f078b0c864e97a40e67254 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 10 Oct 2020 22:23:42 +0300 Subject: [PATCH 0240/1261] bpo-41991: Remove _PyObject_HasAttrId (GH-22629) It can silence arbitrary exceptions. --- Include/cpython/object.h | 1 - Objects/object.c | 11 ----------- Objects/unionobject.c | 13 +++++++------ Python/errors.c | 19 +++++++++++++++++-- Python/pythonrun.c | 6 ++++-- 5 files changed, 28 insertions(+), 22 deletions(-) diff --git a/Include/cpython/object.h b/Include/cpython/object.h index ae3920d4508e14..875a600f79565a 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -306,7 +306,6 @@ PyAPI_FUNC(int) _PyObject_IsFreed(PyObject *); PyAPI_FUNC(int) _PyObject_IsAbstract(PyObject *); PyAPI_FUNC(PyObject *) _PyObject_GetAttrId(PyObject *, struct _Py_Identifier *); PyAPI_FUNC(int) _PyObject_SetAttrId(PyObject *, struct _Py_Identifier *, PyObject *); -PyAPI_FUNC(int) _PyObject_HasAttrId(PyObject *, struct _Py_Identifier *); /* Replacements of PyObject_GetAttr() and _PyObject_GetAttrId() which don't raise AttributeError. diff --git a/Objects/object.c b/Objects/object.c index 9889503cfd8938..7bc3e48d40a6fd 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -854,17 +854,6 @@ _PyObject_GetAttrId(PyObject *v, _Py_Identifier *name) return result; } -int -_PyObject_HasAttrId(PyObject *v, _Py_Identifier *name) -{ - int result; - PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ - if (!oname) - return -1; - result = PyObject_HasAttr(v, oname); - return result; -} - int _PyObject_SetAttrId(PyObject *v, _Py_Identifier *name, PyObject *w) { diff --git a/Objects/unionobject.c b/Objects/unionobject.c index 8cfb2a664753f8..89fdaf42560c1b 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -311,21 +311,22 @@ union_repr_item(_PyUnicodeWriter *writer, PyObject *p) _Py_IDENTIFIER(__args__); PyObject *qualname = NULL; PyObject *module = NULL; + PyObject *tmp; PyObject *r = NULL; int err; - int has_origin = _PyObject_HasAttrId(p, &PyId___origin__); - if (has_origin < 0) { + if (_PyObject_LookupAttrId(p, &PyId___origin__, &tmp) < 0) { goto exit; } - if (has_origin) { - int has_args = _PyObject_HasAttrId(p, &PyId___args__); - if (has_args < 0) { + if (tmp) { + Py_DECREF(tmp); + if (_PyObject_LookupAttrId(p, &PyId___args__, &tmp) < 0) { goto exit; } - if (has_args) { + if (tmp) { // It looks like a GenericAlias + Py_DECREF(tmp); goto use_repr; } } diff --git a/Python/errors.c b/Python/errors.c index 720f18bc224d4d..02cf47992b695f 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1593,9 +1593,18 @@ PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset) } Py_DECREF(tmp); } + else { + _PyErr_Clear(tstate); + } } if (exc != PyExc_SyntaxError) { - if (!_PyObject_HasAttrId(v, &PyId_msg)) { + if (_PyObject_LookupAttrId(v, &PyId_msg, &tmp) < 0) { + _PyErr_Clear(tstate); + } + else if (tmp) { + Py_DECREF(tmp); + } + else { tmp = PyObject_Str(v); if (tmp) { if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) { @@ -1607,7 +1616,13 @@ PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset) _PyErr_Clear(tstate); } } - if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) { + if (_PyObject_LookupAttrId(v, &PyId_print_file_and_line, &tmp) < 0) { + _PyErr_Clear(tstate); + } + else if (tmp) { + Py_DECREF(tmp); + } + else { if (_PyObject_SetAttrId(v, &PyId_print_file_and_line, Py_None)) { _PyErr_Clear(tstate); diff --git a/Python/pythonrun.c b/Python/pythonrun.c index ff80103050e4e2..a45ca3b18311dd 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -770,7 +770,7 @@ static void print_exception(PyObject *f, PyObject *value) { int err = 0; - PyObject *type, *tb; + PyObject *type, *tb, *tmp; _Py_IDENTIFIER(print_file_and_line); if (!PyExceptionInstance_Check(value)) { @@ -789,10 +789,12 @@ print_exception(PyObject *f, PyObject *value) if (tb && tb != Py_None) err = PyTraceBack_Print(tb, f); if (err == 0 && - _PyObject_HasAttrId(value, &PyId_print_file_and_line)) + (err = _PyObject_LookupAttrId(value, &PyId_print_file_and_line, &tmp)) > 0) { PyObject *message, *filename, *text; Py_ssize_t lineno, offset; + err = 0; + Py_DECREF(tmp); if (!parse_syntax_error(value, &message, &filename, &lineno, &offset, &text)) PyErr_Clear(); From 05f95c4fd7e6920314bcb2cc1f36bbaae0004fac Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Sun, 11 Oct 2020 01:19:46 +0300 Subject: [PATCH 0241/1261] bpo-38605: bump the magic number for 'annotations' future (#22630) --- Lib/importlib/_bootstrap_external.py | 3 +- Python/importlib_external.h | 222 +++++++++++++-------------- 2 files changed, 113 insertions(+), 112 deletions(-) diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 4f06039f3d23c5..b08ad032ab309d 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -277,6 +277,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.9a2 3423 (add IS_OP, CONTAINS_OP and JUMP_IF_NOT_EXC_MATCH bytecodes #39156) # Python 3.9a2 3424 (simplify bytecodes for *value unpacking) # Python 3.9a2 3425 (simplify bytecodes for **value unpacking) +# Python 3.10a1 3430 (Make 'annotations' future by default) # # MAGIC must change whenever the bytecode emitted by the compiler may no @@ -286,7 +287,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3425).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3430).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 0ef1b45594fbf7..6daddb1fb8dfb7 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -285,7 +285,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,218,13,95,119,114,105,116,101,95,97,116,111,109,105,99, 120,0,0,0,115,28,0,0,0,0,5,16,1,6,1,22, 255,4,2,2,3,14,1,40,1,16,1,12,1,2,1,14, - 1,12,1,6,1,114,69,0,0,0,105,97,13,0,0,114, + 1,12,1,6,1,114,69,0,0,0,105,102,13,0,0,114, 28,0,0,0,114,17,0,0,0,115,2,0,0,0,13,10, 90,11,95,95,112,121,99,97,99,104,101,95,95,122,4,111, 112,116,45,122,3,46,112,121,122,4,46,112,121,99,78,41, @@ -399,7 +399,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 90,15,97,108,109,111,115,116,95,102,105,108,101,110,97,109, 101,218,8,102,105,108,101,110,97,109,101,114,5,0,0,0, 114,5,0,0,0,114,8,0,0,0,218,17,99,97,99,104, - 101,95,102,114,111,109,95,115,111,117,114,99,101,45,1,0, + 101,95,102,114,111,109,95,115,111,117,114,99,101,46,1,0, 0,115,72,0,0,0,0,18,8,1,6,1,2,255,4,2, 8,1,4,1,8,1,12,1,10,1,12,1,16,1,8,1, 8,1,8,1,24,1,8,1,12,1,6,2,8,1,8,1, @@ -480,7 +480,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,90,9,111,112,116,95,108,101,118,101,108,90,13,98, 97,115,101,95,102,105,108,101,110,97,109,101,114,5,0,0, 0,114,5,0,0,0,114,8,0,0,0,218,17,115,111,117, - 114,99,101,95,102,114,111,109,95,99,97,99,104,101,116,1, + 114,99,101,95,102,114,111,109,95,99,97,99,104,101,117,1, 0,0,115,60,0,0,0,0,9,12,1,8,1,10,1,12, 1,4,1,10,1,12,1,14,1,16,1,4,1,4,1,12, 1,8,1,8,1,2,255,8,2,10,1,8,1,16,1,10, @@ -516,7 +516,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 120,116,101,110,115,105,111,110,218,11,115,111,117,114,99,101, 95,112,97,116,104,114,5,0,0,0,114,5,0,0,0,114, 8,0,0,0,218,15,95,103,101,116,95,115,111,117,114,99, - 101,102,105,108,101,156,1,0,0,115,20,0,0,0,0,7, + 101,102,105,108,101,157,1,0,0,115,20,0,0,0,0,7, 12,1,4,1,16,1,24,1,4,1,2,1,12,1,16,1, 18,1,114,108,0,0,0,99,1,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,8,0,0,0,67,0,0,0, @@ -529,7 +529,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,114,101,0,0,0,114,97,0,0,0,114,82,0,0,0, 114,88,0,0,0,41,1,114,96,0,0,0,114,5,0,0, 0,114,5,0,0,0,114,8,0,0,0,218,11,95,103,101, - 116,95,99,97,99,104,101,100,175,1,0,0,115,16,0,0, + 116,95,99,97,99,104,101,100,176,1,0,0,115,16,0,0, 0,0,1,14,1,2,1,10,1,12,1,6,1,14,1,4, 2,114,112,0,0,0,99,1,0,0,0,0,0,0,0,0, 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, @@ -543,7 +543,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,233,128,0,0,0,41,3,114,49,0,0,0,114,51, 0,0,0,114,50,0,0,0,41,2,114,44,0,0,0,114, 52,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,10,95,99,97,108,99,95,109,111,100,101,187, + 0,0,0,218,10,95,99,97,108,99,95,109,111,100,101,188, 1,0,0,115,12,0,0,0,0,2,2,1,14,1,12,1, 10,3,8,1,114,114,0,0,0,99,1,0,0,0,0,0, 0,0,0,0,0,0,3,0,0,0,8,0,0,0,3,0, @@ -582,7 +582,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 103,115,218,6,107,119,97,114,103,115,169,1,218,6,109,101, 116,104,111,100,114,5,0,0,0,114,8,0,0,0,218,19, 95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112, - 112,101,114,207,1,0,0,115,18,0,0,0,0,1,8,1, + 112,101,114,208,1,0,0,115,18,0,0,0,0,1,8,1, 8,1,10,1,4,1,8,255,2,1,2,255,6,2,122,40, 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, @@ -600,7 +600,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,100,105,99,116,95,95,218,6,117,112,100,97,116,101,41, 3,90,3,110,101,119,90,3,111,108,100,114,67,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 5,95,119,114,97,112,218,1,0,0,115,8,0,0,0,0, + 5,95,119,114,97,112,219,1,0,0,115,8,0,0,0,0, 1,8,1,10,1,20,1,122,26,95,99,104,101,99,107,95, 110,97,109,101,46,60,108,111,99,97,108,115,62,46,95,119, 114,97,112,41,1,78,41,3,218,10,95,98,111,111,116,115, @@ -608,7 +608,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,114,111,114,41,3,114,122,0,0,0,114,123,0,0,0, 114,133,0,0,0,114,5,0,0,0,114,121,0,0,0,114, 8,0,0,0,218,11,95,99,104,101,99,107,95,110,97,109, - 101,199,1,0,0,115,14,0,0,0,0,8,14,7,2,1, + 101,200,1,0,0,115,14,0,0,0,0,8,14,7,2,1, 10,1,12,2,14,5,10,1,114,136,0,0,0,99,2,0, 0,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0, 0,0,67,0,0,0,115,60,0,0,0,124,0,160,0,124, @@ -636,7 +636,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,97,100,101,114,218,8,112,111,114,116,105,111,110,115,218, 3,109,115,103,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,17,95,102,105,110,100,95,109,111,100,117,108, - 101,95,115,104,105,109,227,1,0,0,115,10,0,0,0,0, + 101,95,115,104,105,109,228,1,0,0,115,10,0,0,0,0, 10,14,1,16,1,4,1,22,1,114,143,0,0,0,99,3, 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,4, 0,0,0,67,0,0,0,115,166,0,0,0,124,0,100,1, @@ -703,7 +703,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,95,100,101,116,97,105,108,115,90,5,109,97,103,105,99, 114,92,0,0,0,114,2,0,0,0,114,5,0,0,0,114, 5,0,0,0,114,8,0,0,0,218,13,95,99,108,97,115, - 115,105,102,121,95,112,121,99,244,1,0,0,115,28,0,0, + 115,105,102,121,95,112,121,99,245,1,0,0,115,28,0,0, 0,0,16,12,1,8,1,16,1,12,1,16,1,12,1,10, 1,12,1,8,1,16,2,8,1,16,1,16,1,114,152,0, 0,0,99,5,0,0,0,0,0,0,0,0,0,0,0,6, @@ -758,7 +758,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,116,0,0,0,114,151,0,0,0,114,92,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,23, 95,118,97,108,105,100,97,116,101,95,116,105,109,101,115,116, - 97,109,112,95,112,121,99,21,2,0,0,115,16,0,0,0, + 97,109,112,95,112,121,99,22,2,0,0,115,16,0,0,0, 0,19,24,1,10,1,12,1,16,1,8,1,22,255,2,2, 114,156,0,0,0,99,4,0,0,0,0,0,0,0,0,0, 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,42, @@ -804,7 +804,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 218,11,115,111,117,114,99,101,95,104,97,115,104,114,116,0, 0,0,114,151,0,0,0,114,5,0,0,0,114,5,0,0, 0,114,8,0,0,0,218,18,95,118,97,108,105,100,97,116, - 101,95,104,97,115,104,95,112,121,99,49,2,0,0,115,12, + 101,95,104,97,115,104,95,112,121,99,50,2,0,0,115,12, 0,0,0,0,17,16,1,2,1,8,255,4,2,2,254,114, 158,0,0,0,99,4,0,0,0,0,0,0,0,0,0,0, 0,5,0,0,0,5,0,0,0,67,0,0,0,115,80,0, @@ -828,7 +828,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,116,0,0,0,114,106,0,0,0,114,107,0, 0,0,218,4,99,111,100,101,114,5,0,0,0,114,5,0, 0,0,114,8,0,0,0,218,17,95,99,111,109,112,105,108, - 101,95,98,121,116,101,99,111,100,101,73,2,0,0,115,18, + 101,95,98,121,116,101,99,111,100,101,74,2,0,0,115,18, 0,0,0,0,2,10,1,10,1,12,1,8,1,12,1,4, 2,10,1,4,255,114,165,0,0,0,114,73,0,0,0,99, 3,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, @@ -847,7 +847,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,155,0,0,0,114,26,0,0,0,114,5,0,0,0,114, 5,0,0,0,114,8,0,0,0,218,22,95,99,111,100,101, 95,116,111,95,116,105,109,101,115,116,97,109,112,95,112,121, - 99,86,2,0,0,115,12,0,0,0,0,2,8,1,14,1, + 99,87,2,0,0,115,12,0,0,0,0,2,8,1,14,1, 14,1,14,1,16,1,114,170,0,0,0,84,99,3,0,0, 0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0, 0,67,0,0,0,115,80,0,0,0,116,0,116,1,131,1, @@ -865,7 +865,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 7,99,104,101,99,107,101,100,114,26,0,0,0,114,2,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, 0,218,17,95,99,111,100,101,95,116,111,95,104,97,115,104, - 95,112,121,99,96,2,0,0,115,14,0,0,0,0,2,8, + 95,112,121,99,97,2,0,0,115,14,0,0,0,0,2,8, 1,12,1,14,1,16,1,10,1,16,1,114,171,0,0,0, 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, 0,6,0,0,0,67,0,0,0,115,62,0,0,0,100,1, @@ -892,7 +892,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,105,110,101,218,8,101,110,99,111,100,105,110,103,90,15, 110,101,119,108,105,110,101,95,100,101,99,111,100,101,114,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,13, - 100,101,99,111,100,101,95,115,111,117,114,99,101,107,2,0, + 100,101,99,111,100,101,95,115,111,117,114,99,101,108,2,0, 0,115,10,0,0,0,0,5,8,1,12,1,10,1,12,1, 114,176,0,0,0,169,2,114,140,0,0,0,218,26,115,117, 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, @@ -954,7 +954,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,90,7,100,105,114,110,97,109,101,114,5,0,0,0,114, 5,0,0,0,114,8,0,0,0,218,23,115,112,101,99,95, 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, - 111,110,124,2,0,0,115,62,0,0,0,0,12,8,4,4, + 111,110,125,2,0,0,115,62,0,0,0,0,12,8,4,4, 1,10,2,2,1,14,1,12,1,6,2,10,8,16,1,6, 3,8,1,14,1,14,1,10,1,6,1,6,2,4,3,8, 2,10,1,2,1,14,1,12,1,6,2,4,1,8,2,6, @@ -991,7 +991,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 65,76,95,77,65,67,72,73,78,69,41,2,218,3,99,108, 115,114,7,0,0,0,114,5,0,0,0,114,5,0,0,0, 114,8,0,0,0,218,14,95,111,112,101,110,95,114,101,103, - 105,115,116,114,121,204,2,0,0,115,8,0,0,0,0,2, + 105,115,116,114,121,205,2,0,0,115,8,0,0,0,0,2, 2,1,16,1,12,1,122,36,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,2,0,0, @@ -1018,7 +1018,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,107,101,121,114,7,0,0,0,90,4,104,107,101,121,218, 8,102,105,108,101,112,97,116,104,114,5,0,0,0,114,5, 0,0,0,114,8,0,0,0,218,16,95,115,101,97,114,99, - 104,95,114,101,103,105,115,116,114,121,211,2,0,0,115,24, + 104,95,114,101,103,105,115,116,114,121,212,2,0,0,115,24, 0,0,0,0,2,6,1,8,2,6,1,6,1,16,255,6, 2,2,1,12,1,46,1,12,1,8,1,122,38,87,105,110, 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, @@ -1040,7 +1040,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,44,0,0,0,218,6,116,97,114,103,101,116, 114,199,0,0,0,114,140,0,0,0,114,189,0,0,0,114, 187,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,9,102,105,110,100,95,115,112,101,99,226,2, + 0,0,0,218,9,102,105,110,100,95,115,112,101,99,227,2, 0,0,115,28,0,0,0,0,2,10,1,8,1,4,1,2, 1,12,1,12,1,8,1,14,1,14,1,6,1,8,1,2, 254,6,3,122,31,87,105,110,100,111,119,115,82,101,103,105, @@ -1059,7 +1059,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,169,2,114,203,0,0,0,114,140,0,0,0,169,4,114, 193,0,0,0,114,139,0,0,0,114,44,0,0,0,114,187, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,11,102,105,110,100,95,109,111,100,117,108,101,242, + 0,0,218,11,102,105,110,100,95,109,111,100,117,108,101,243, 2,0,0,115,8,0,0,0,0,7,12,1,8,1,6,2, 122,33,87,105,110,100,111,119,115,82,101,103,105,115,116,114, 121,70,105,110,100,101,114,46,102,105,110,100,95,109,111,100, @@ -1069,7 +1069,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 11,99,108,97,115,115,109,101,116,104,111,100,114,194,0,0, 0,114,200,0,0,0,114,203,0,0,0,114,206,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,191,0,0,0,192,2,0,0,115,28,0, + 8,0,0,0,114,191,0,0,0,193,2,0,0,115,28,0, 0,0,8,2,4,3,2,255,2,4,2,255,2,3,4,2, 2,1,10,6,2,1,10,14,2,1,12,15,2,1,114,191, 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1105,7 +1105,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,139,0,0,0,114,96,0,0,0,90,13,102,105,108, 101,110,97,109,101,95,98,97,115,101,90,9,116,97,105,108, 95,110,97,109,101,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,182,0,0,0,5,3,0,0,115,8,0, + 8,0,0,0,114,182,0,0,0,6,3,0,0,115,8,0, 0,0,0,3,18,1,16,1,14,1,122,24,95,76,111,97, 100,101,114,66,97,115,105,99,115,46,105,115,95,112,97,99, 107,97,103,101,99,2,0,0,0,0,0,0,0,0,0,0, @@ -1116,7 +1116,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 105,111,110,46,78,114,5,0,0,0,169,2,114,118,0,0, 0,114,187,0,0,0,114,5,0,0,0,114,5,0,0,0, 114,8,0,0,0,218,13,99,114,101,97,116,101,95,109,111, - 100,117,108,101,13,3,0,0,115,2,0,0,0,0,1,122, + 100,117,108,101,14,3,0,0,115,2,0,0,0,0,1,122, 27,95,76,111,97,100,101,114,66,97,115,105,99,115,46,99, 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, @@ -1136,7 +1136,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,114,131,0,0,0,41,3,114,118,0,0,0,218,6,109, 111,100,117,108,101,114,164,0,0,0,114,5,0,0,0,114, 5,0,0,0,114,8,0,0,0,218,11,101,120,101,99,95, - 109,111,100,117,108,101,16,3,0,0,115,12,0,0,0,0, + 109,111,100,117,108,101,17,3,0,0,115,12,0,0,0,0, 2,12,1,8,1,6,1,4,255,6,2,122,25,95,76,111, 97,100,101,114,66,97,115,105,99,115,46,101,120,101,99,95, 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, @@ -1148,13 +1148,13 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 117,108,101,95,115,104,105,109,169,2,114,118,0,0,0,114, 139,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, - 24,3,0,0,115,2,0,0,0,0,2,122,25,95,76,111, + 25,3,0,0,115,2,0,0,0,0,2,122,25,95,76,111, 97,100,101,114,66,97,115,105,99,115,46,108,111,97,100,95, 109,111,100,117,108,101,78,41,8,114,125,0,0,0,114,124, 0,0,0,114,126,0,0,0,114,127,0,0,0,114,182,0, 0,0,114,212,0,0,0,114,217,0,0,0,114,220,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,208,0,0,0,0,3,0,0,115,10, + 114,8,0,0,0,114,208,0,0,0,1,3,0,0,115,10, 0,0,0,8,2,4,3,8,8,8,3,8,8,114,208,0, 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,3,0,0,0,64,0,0,0,115,74,0,0,0, @@ -1179,7 +1179,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 10,32,32,32,32,32,32,32,32,78,41,1,114,50,0,0, 0,169,2,114,118,0,0,0,114,44,0,0,0,114,5,0, 0,0,114,5,0,0,0,114,8,0,0,0,218,10,112,97, - 116,104,95,109,116,105,109,101,31,3,0,0,115,2,0,0, + 116,104,95,109,116,105,109,101,32,3,0,0,115,2,0,0, 0,0,6,122,23,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,0,0,0,0,2,0,0,0,4,0,0, @@ -1213,7 +1213,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,101,100,46,10,32,32,32,32,32,32,32,32,114,169,0, 0,0,41,1,114,223,0,0,0,114,222,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,218,10,112, - 97,116,104,95,115,116,97,116,115,39,3,0,0,115,2,0, + 97,116,104,95,115,116,97,116,115,40,3,0,0,115,2,0, 0,0,0,12,122,23,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,0,0,0,0,4,0,0,0,4,0, @@ -1237,7 +1237,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,107,0,0,0,90,10,99,97,99,104,101,95,112, 97,116,104,114,26,0,0,0,114,5,0,0,0,114,5,0, 0,0,114,8,0,0,0,218,15,95,99,97,99,104,101,95, - 98,121,116,101,99,111,100,101,53,3,0,0,115,2,0,0, + 98,121,116,101,99,111,100,101,54,3,0,0,115,2,0,0, 0,0,8,122,28,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,0,0,0,0,3,0, @@ -1254,7 +1254,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,101,115,46,10,32,32,32,32,32,32,32,32,78,114,5, 0,0,0,41,3,114,118,0,0,0,114,44,0,0,0,114, 26,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,225,0,0,0,63,3,0,0,115,2,0,0, + 0,0,0,114,225,0,0,0,64,3,0,0,115,2,0,0, 0,0,1,122,21,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,0,0,0,0,5,0,0,0,10,0,0,0,67, @@ -1275,7 +1275,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,41,5,114,118,0,0,0,114,139,0,0,0,114, 44,0,0,0,114,174,0,0,0,218,3,101,120,99,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,218,10,103, - 101,116,95,115,111,117,114,99,101,70,3,0,0,115,20,0, + 101,116,95,115,111,117,114,99,101,71,3,0,0,115,20,0, 0,0,0,2,10,1,2,1,14,1,14,1,4,1,2,255, 4,1,2,255,24,2,122,23,83,111,117,114,99,101,76,111, 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,114, @@ -1298,7 +1298,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,26,0,0,0,114,44,0,0,0,114,230,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, 218,14,115,111,117,114,99,101,95,116,111,95,99,111,100,101, - 80,3,0,0,115,6,0,0,0,0,5,12,1,4,255,122, + 81,3,0,0,115,6,0,0,0,0,5,12,1,4,255,122, 27,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,0,0,0,0,15,0,0,0,9,0,0, @@ -1374,7 +1374,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,116,114,26,0,0,0,114,151,0,0,0,114,2,0,0, 0,90,10,98,121,116,101,115,95,100,97,116,97,90,11,99, 111,100,101,95,111,98,106,101,99,116,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,213,0,0,0,88,3, + 5,0,0,0,114,8,0,0,0,114,213,0,0,0,89,3, 0,0,115,152,0,0,0,0,7,10,1,4,1,4,1,4, 1,4,1,4,1,2,1,12,1,12,1,12,2,2,1,14, 1,12,1,8,2,12,1,2,1,14,1,12,1,6,3,2, @@ -1391,7 +1391,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,226,0,0,0,114,225,0,0,0,114,229,0,0, 0,114,233,0,0,0,114,213,0,0,0,114,5,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 221,0,0,0,29,3,0,0,115,14,0,0,0,8,2,8, + 221,0,0,0,30,3,0,0,115,14,0,0,0,8,2,8, 8,8,14,8,10,8,7,8,10,14,8,114,221,0,0,0, 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,4,0,0,0,0,0,0,0,115,92,0,0,0,101,0, @@ -1418,7 +1418,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,32,32,102,105,110,100,101,114,46,78,114, 159,0,0,0,41,3,114,118,0,0,0,114,139,0,0,0, 114,44,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,209,0,0,0,178,3,0,0,115,4,0, + 8,0,0,0,114,209,0,0,0,179,3,0,0,115,4,0, 0,0,0,3,6,1,122,19,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,0,0,0,0,2,0,0,0,2,0,0,0, @@ -1427,7 +1427,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,109,0,0,0,169,2,218,9,95,95,99,108,97,115, 115,95,95,114,131,0,0,0,169,2,114,118,0,0,0,90, 5,111,116,104,101,114,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,6,95,95,101,113,95,95,184,3,0, + 114,8,0,0,0,218,6,95,95,101,113,95,95,185,3,0, 0,115,6,0,0,0,0,1,12,1,10,255,122,17,70,105, 108,101,76,111,97,100,101,114,46,95,95,101,113,95,95,99, 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, @@ -1436,7 +1436,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,109,0,0,0,169,3,218,4,104,97,115,104,114,116, 0,0,0,114,44,0,0,0,169,1,114,118,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,8, - 95,95,104,97,115,104,95,95,188,3,0,0,115,2,0,0, + 95,95,104,97,115,104,95,95,189,3,0,0,115,2,0,0, 0,0,1,122,19,70,105,108,101,76,111,97,100,101,114,46, 95,95,104,97,115,104,95,95,99,2,0,0,0,0,0,0, 0,0,0,0,0,2,0,0,0,3,0,0,0,3,0,0, @@ -1450,7 +1450,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,97,100,46,10,10,32,32,32,32,32,32,32,32,41,3, 218,5,115,117,112,101,114,114,239,0,0,0,114,220,0,0, 0,114,219,0,0,0,169,1,114,241,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,220,0,0,0,191,3,0,0, + 0,0,114,8,0,0,0,114,220,0,0,0,192,3,0,0, 115,2,0,0,0,0,10,122,22,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,0,0,0,0,2,0,0,0, @@ -1460,7 +1460,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 117,114,99,101,32,102,105,108,101,32,97,115,32,102,111,117, 110,100,32,98,121,32,116,104,101,32,102,105,110,100,101,114, 46,114,48,0,0,0,114,219,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,179,0,0,0,203, + 114,5,0,0,0,114,8,0,0,0,114,179,0,0,0,204, 3,0,0,115,2,0,0,0,0,3,122,23,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,0,0,0,0, @@ -1482,7 +1482,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 84,0,0,0,90,4,114,101,97,100,114,65,0,0,0,41, 3,114,118,0,0,0,114,44,0,0,0,114,68,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 227,0,0,0,208,3,0,0,115,10,0,0,0,0,2,14, + 227,0,0,0,209,3,0,0,115,10,0,0,0,0,2,14, 1,16,1,40,2,14,1,122,19,70,105,108,101,76,111,97, 100,101,114,46,103,101,116,95,100,97,116,97,99,2,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0, @@ -1494,7 +1494,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,118,0,0,0,114,216,0,0,0,114,253,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,19, 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, - 100,101,114,217,3,0,0,115,4,0,0,0,0,2,12,1, + 100,101,114,218,3,0,0,115,4,0,0,0,0,2,12,1, 122,30,70,105,108,101,76,111,97,100,101,114,46,103,101,116, 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, 41,13,114,125,0,0,0,114,124,0,0,0,114,126,0,0, @@ -1503,7 +1503,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 179,0,0,0,114,227,0,0,0,114,254,0,0,0,90,13, 95,95,99,108,97,115,115,99,101,108,108,95,95,114,5,0, 0,0,114,5,0,0,0,114,249,0,0,0,114,8,0,0, - 0,114,239,0,0,0,173,3,0,0,115,22,0,0,0,8, + 0,114,239,0,0,0,174,3,0,0,115,22,0,0,0,8, 2,4,3,8,6,8,4,8,3,2,1,14,11,2,1,10, 4,8,9,2,1,114,239,0,0,0,99,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, @@ -1525,7 +1525,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 3,114,49,0,0,0,218,8,115,116,95,109,116,105,109,101, 90,7,115,116,95,115,105,122,101,41,3,114,118,0,0,0, 114,44,0,0,0,114,238,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,224,0,0,0,227,3, + 5,0,0,0,114,8,0,0,0,114,224,0,0,0,228,3, 0,0,115,4,0,0,0,0,2,8,1,122,27,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, @@ -1536,7 +1536,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,225,0,0,0,41,5,114,118,0,0,0,114,107,0, 0,0,114,106,0,0,0,114,26,0,0,0,114,52,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,226,0,0,0,232,3,0,0,115,4,0,0,0,0,2, + 114,226,0,0,0,233,3,0,0,115,4,0,0,0,0,2, 8,1,122,32,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, 99,111,100,101,114,60,0,0,0,114,1,1,0,0,99,3, @@ -1571,7 +1571,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,218,6,112,97,114,101,110,116,114,96,0,0,0,114,37, 0,0,0,114,33,0,0,0,114,228,0,0,0,114,5,0, 0,0,114,5,0,0,0,114,8,0,0,0,114,225,0,0, - 0,237,3,0,0,115,46,0,0,0,0,2,12,1,4,2, + 0,238,3,0,0,115,46,0,0,0,0,2,12,1,4,2, 12,1,12,1,12,2,12,1,10,1,2,1,14,1,12,2, 8,1,14,3,6,1,4,255,4,2,26,1,2,1,12,1, 16,1,14,2,8,1,2,255,122,25,83,111,117,114,99,101, @@ -1580,7 +1580,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,126,0,0,0,114,127,0,0,0,114,224,0,0,0,114, 226,0,0,0,114,225,0,0,0,114,5,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,255,0, - 0,0,223,3,0,0,115,8,0,0,0,8,2,4,2,8, + 0,0,224,3,0,0,115,8,0,0,0,8,2,4,2,8, 5,8,5,114,255,0,0,0,99,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, @@ -1602,7 +1602,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,41,5,114,118,0,0,0,114,139,0,0,0,114, 44,0,0,0,114,26,0,0,0,114,151,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,213,0, - 0,0,16,4,0,0,115,22,0,0,0,0,1,10,1,10, + 0,0,17,4,0,0,115,22,0,0,0,0,1,10,1,10, 4,2,1,2,254,6,4,12,1,2,1,14,1,2,1,2, 253,122,29,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, @@ -1612,14 +1612,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,32,97,115,32,116,104,101,114,101,32,105,115,32,110,111, 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,5, 0,0,0,114,219,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,229,0,0,0,32,4,0,0, + 0,0,114,8,0,0,0,114,229,0,0,0,33,4,0,0, 115,2,0,0,0,0,2,122,31,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,41,6,114,125,0,0,0, 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, 213,0,0,0,114,229,0,0,0,114,5,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,5,1, - 0,0,12,4,0,0,115,6,0,0,0,8,2,4,2,8, + 0,0,13,4,0,0,115,6,0,0,0,8,2,4,2,8, 16,114,5,1,0,0,99,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, 92,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, @@ -1640,7 +1640,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,0,83,0,114,109,0,0,0,114,159,0,0,0,41,3, 114,118,0,0,0,114,116,0,0,0,114,44,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,209, - 0,0,0,49,4,0,0,115,4,0,0,0,0,1,6,1, + 0,0,0,50,4,0,0,115,4,0,0,0,0,1,6,1, 122,28,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,0,0,0,0,2,0,0,0,2, @@ -1648,7 +1648,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,1,106,0,107,2,111,22,124,0,106,1,124,1,106,1, 107,2,83,0,114,109,0,0,0,114,240,0,0,0,114,242, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,243,0,0,0,53,4,0,0,115,6,0,0,0, + 0,0,114,243,0,0,0,54,4,0,0,115,6,0,0,0, 0,1,12,1,10,255,122,26,69,120,116,101,110,115,105,111, 110,70,105,108,101,76,111,97,100,101,114,46,95,95,101,113, 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, @@ -1656,7 +1656,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,0,124,0,106,1,131,1,116,0,124,0,106,2,131,1, 65,0,83,0,114,109,0,0,0,114,244,0,0,0,114,246, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,247,0,0,0,57,4,0,0,115,2,0,0,0, + 0,0,114,247,0,0,0,58,4,0,0,115,2,0,0,0, 0,1,122,28,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,95,95,104,97,115,104,95,95, 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, @@ -1673,7 +1673,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,97,109,105,99,114,149,0,0,0,114,116,0,0,0,114, 44,0,0,0,41,3,114,118,0,0,0,114,187,0,0,0, 114,216,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,212,0,0,0,60,4,0,0,115,14,0, + 8,0,0,0,114,212,0,0,0,61,4,0,0,115,14,0, 0,0,0,2,4,1,6,255,4,2,6,1,8,255,4,2, 122,33,69,120,116,101,110,115,105,111,110,70,105,108,101,76, 111,97,100,101,114,46,99,114,101,97,116,101,95,109,111,100, @@ -1691,7 +1691,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,114,149,0,0,0,114,116,0,0,0,114,44,0,0,0, 169,2,114,118,0,0,0,114,216,0,0,0,114,5,0,0, 0,114,5,0,0,0,114,8,0,0,0,114,217,0,0,0, - 68,4,0,0,115,8,0,0,0,0,2,14,1,6,1,8, + 69,4,0,0,115,8,0,0,0,0,2,14,1,6,1,8, 255,122,31,69,120,116,101,110,115,105,111,110,70,105,108,101, 76,111,97,100,101,114,46,101,120,101,99,95,109,111,100,117, 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, @@ -1709,7 +1709,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,169,2,114,32,0,0,0,218,6,115,117,102,102, 105,120,169,1,90,9,102,105,108,101,95,110,97,109,101,114, 5,0,0,0,114,8,0,0,0,218,9,60,103,101,110,101, - 120,112,114,62,77,4,0,0,115,4,0,0,0,4,1,2, + 120,112,114,62,78,4,0,0,115,4,0,0,0,4,1,2, 255,122,49,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,111,99,97,108,115,62,46,60,103,101,110,101, @@ -1717,7 +1717,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 218,3,97,110,121,218,18,69,88,84,69,78,83,73,79,78, 95,83,85,70,70,73,88,69,83,114,219,0,0,0,114,5, 0,0,0,114,9,1,0,0,114,8,0,0,0,114,182,0, - 0,0,74,4,0,0,115,8,0,0,0,0,2,14,1,12, + 0,0,75,4,0,0,115,8,0,0,0,0,2,14,1,12, 1,2,255,122,30,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,0,0,0,0, @@ -1728,7 +1728,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,116,32,99,114,101,97,116,101,32,97,32,99,111,100,101, 32,111,98,106,101,99,116,46,78,114,5,0,0,0,114,219, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,213,0,0,0,80,4,0,0,115,2,0,0,0, + 0,0,114,213,0,0,0,81,4,0,0,115,2,0,0,0, 0,2,122,28,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,0,0,0,0,2,0,0, @@ -1738,14 +1738,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,100,117,108,101,115,32,104,97,118,101,32,110,111,32,115, 111,117,114,99,101,32,99,111,100,101,46,78,114,5,0,0, 0,114,219,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,229,0,0,0,84,4,0,0,115,2, + 114,8,0,0,0,114,229,0,0,0,85,4,0,0,115,2, 0,0,0,0,2,122,30,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,99,2,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,6, 0,0,0,124,0,106,0,83,0,114,250,0,0,0,114,48, 0,0,0,114,219,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,179,0,0,0,88,4,0,0, + 0,0,114,8,0,0,0,114,179,0,0,0,89,4,0,0, 115,2,0,0,0,0,3,122,32,69,120,116,101,110,115,105, 111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,116, 95,102,105,108,101,110,97,109,101,78,41,14,114,125,0,0, @@ -1754,7 +1754,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 212,0,0,0,114,217,0,0,0,114,182,0,0,0,114,213, 0,0,0,114,229,0,0,0,114,136,0,0,0,114,179,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,252,0,0,0,41,4,0,0,115, + 0,114,8,0,0,0,114,252,0,0,0,42,4,0,0,115, 22,0,0,0,8,2,4,6,8,4,8,4,8,3,8,8, 8,6,8,6,8,4,8,4,2,1,114,252,0,0,0,99, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1797,7 +1797,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,169,4,114,118,0,0,0,114,116,0,0,0,114,44,0, 0,0,90,11,112,97,116,104,95,102,105,110,100,101,114,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,209, - 0,0,0,101,4,0,0,115,8,0,0,0,0,1,6,1, + 0,0,0,102,4,0,0,115,8,0,0,0,0,1,6,1, 6,1,14,1,122,23,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,0,0,0,0,4,0,0,0,3,0, @@ -1814,7 +1814,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 4,114,118,0,0,0,114,4,1,0,0,218,3,100,111,116, 90,2,109,101,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,23,95,102,105,110,100,95,112,97,114,101,110, - 116,95,112,97,116,104,95,110,97,109,101,115,107,4,0,0, + 116,95,112,97,116,104,95,110,97,109,101,115,108,4,0,0, 115,8,0,0,0,0,2,18,1,8,2,4,3,122,38,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, @@ -1827,7 +1827,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,118,0,0,0,90,18,112,97,114,101,110,116,95,109,111, 100,117,108,101,95,110,97,109,101,90,14,112,97,116,104,95, 97,116,116,114,95,110,97,109,101,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,16,1,0,0,117,4,0, + 0,0,0,114,8,0,0,0,114,16,1,0,0,118,4,0, 0,115,4,0,0,0,0,1,12,1,122,31,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, @@ -1843,7 +1843,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,15,1,0,0,41,3,114,118,0,0,0,90, 11,112,97,114,101,110,116,95,112,97,116,104,114,187,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,12,95,114,101,99,97,108,99,117,108,97,116,101,121,4, + 218,12,95,114,101,99,97,108,99,117,108,97,116,101,122,4, 0,0,115,16,0,0,0,0,2,12,1,10,1,14,3,18, 1,6,1,8,1,6,1,122,27,95,78,97,109,101,115,112, 97,99,101,80,97,116,104,46,95,114,101,99,97,108,99,117, @@ -1852,7 +1852,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,116,0,124,0,160,1,161,0,131,1,83,0,114,109, 0,0,0,41,2,218,4,105,116,101,114,114,23,1,0,0, 114,246,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,8,95,95,105,116,101,114,95,95,134,4, + 8,0,0,0,218,8,95,95,105,116,101,114,95,95,135,4, 0,0,115,2,0,0,0,0,1,122,23,95,78,97,109,101, 115,112,97,99,101,80,97,116,104,46,95,95,105,116,101,114, 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, @@ -1861,7 +1861,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,169,1,114,23,1,0,0,41,2,114,118,0,0,0,218, 5,105,110,100,101,120,114,5,0,0,0,114,5,0,0,0, 114,8,0,0,0,218,11,95,95,103,101,116,105,116,101,109, - 95,95,137,4,0,0,115,2,0,0,0,0,1,122,26,95, + 95,95,138,4,0,0,115,2,0,0,0,0,1,122,26,95, 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, 103,101,116,105,116,101,109,95,95,99,3,0,0,0,0,0, 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, @@ -1869,7 +1869,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,100,0,83,0,114,109,0,0,0,41,1,114,15,1,0, 0,41,3,114,118,0,0,0,114,27,1,0,0,114,44,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,11,95,95,115,101,116,105,116,101,109,95,95,140,4, + 0,218,11,95,95,115,101,116,105,116,101,109,95,95,141,4, 0,0,115,2,0,0,0,0,1,122,26,95,78,97,109,101, 115,112,97,99,101,80,97,116,104,46,95,95,115,101,116,105, 116,101,109,95,95,99,1,0,0,0,0,0,0,0,0,0, @@ -1877,7 +1877,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,116,0,124,0,160,1,161,0,131,1,83,0,114, 109,0,0,0,41,2,114,23,0,0,0,114,23,1,0,0, 114,246,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,7,95,95,108,101,110,95,95,143,4,0, + 8,0,0,0,218,7,95,95,108,101,110,95,95,144,4,0, 0,115,2,0,0,0,0,1,122,22,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,0,0,0,0,1,0,0, @@ -1886,7 +1886,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, 114,125,41,41,2,114,62,0,0,0,114,15,1,0,0,114, 246,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,8,95,95,114,101,112,114,95,95,146,4,0, + 0,0,0,218,8,95,95,114,101,112,114,95,95,147,4,0, 0,115,2,0,0,0,0,1,122,23,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,0,0,0,0,2,0, @@ -1894,7 +1894,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,124,0,160,0,161,0,118,0,83,0,114,109,0,0,0, 114,26,1,0,0,169,2,114,118,0,0,0,218,4,105,116, 101,109,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,12,95,95,99,111,110,116,97,105,110,115,95,95,149, + 0,218,12,95,95,99,111,110,116,97,105,110,115,95,95,150, 4,0,0,115,2,0,0,0,0,1,122,27,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, @@ -1902,7 +1902,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,16,0,0,0,124,0,106,0,160,1,124,1,161,1,1, 0,100,0,83,0,114,109,0,0,0,41,2,114,15,1,0, 0,114,186,0,0,0,114,32,1,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,186,0,0,0,152, + 114,5,0,0,0,114,8,0,0,0,114,186,0,0,0,153, 4,0,0,115,2,0,0,0,0,1,122,21,95,78,97,109, 101,115,112,97,99,101,80,97,116,104,46,97,112,112,101,110, 100,78,41,15,114,125,0,0,0,114,124,0,0,0,114,126, @@ -1911,7 +1911,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,28,1,0,0,114,29,1,0,0,114,30,1,0,0, 114,31,1,0,0,114,34,1,0,0,114,186,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,13,1,0,0,94,4,0,0,115,24,0,0, + 0,0,0,114,13,1,0,0,95,4,0,0,115,24,0,0, 0,8,1,4,6,8,6,8,10,8,4,8,13,8,3,8, 3,8,3,8,3,8,3,8,3,114,13,1,0,0,99,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, @@ -1927,7 +1927,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,1,124,2,124,3,131,3,124,0,95,1,100,0,83,0, 114,109,0,0,0,41,2,114,13,1,0,0,114,15,1,0, 0,114,19,1,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,209,0,0,0,158,4,0,0,115,2, + 114,8,0,0,0,114,209,0,0,0,159,4,0,0,115,2, 0,0,0,0,1,122,25,95,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,0,0,0,0,2,0,0, @@ -1945,20 +1945,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,125,0,0,0,41,2,114,193,0,0,0,114, 216,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,11,109,111,100,117,108,101,95,114,101,112,114, - 161,4,0,0,115,2,0,0,0,0,7,122,28,95,78,97, + 162,4,0,0,115,2,0,0,0,0,7,122,28,95,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, 0,0,115,4,0,0,0,100,1,83,0,41,2,78,84,114, 5,0,0,0,114,219,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,182,0,0,0,170,4,0, + 0,0,0,114,8,0,0,0,114,182,0,0,0,171,4,0, 0,115,2,0,0,0,0,1,122,27,95,78,97,109,101,115, 112,97,99,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,0,0, 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, 0,0,0,100,1,83,0,41,2,78,114,40,0,0,0,114, 5,0,0,0,114,219,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,229,0,0,0,173,4,0, + 0,0,0,114,8,0,0,0,114,229,0,0,0,174,4,0, 0,115,2,0,0,0,0,1,122,27,95,78,97,109,101,115, 112,97,99,101,76,111,97,100,101,114,46,103,101,116,95,115, 111,117,114,99,101,99,2,0,0,0,0,0,0,0,0,0, @@ -1968,20 +1968,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,105,110,103,62,114,215,0,0,0,84,41,1,114,231,0, 0,0,41,1,114,232,0,0,0,114,219,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,213,0, - 0,0,176,4,0,0,115,2,0,0,0,0,1,122,25,95, + 0,0,177,4,0,0,115,2,0,0,0,0,1,122,25,95, 78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, 0,115,4,0,0,0,100,1,83,0,114,210,0,0,0,114, 5,0,0,0,114,211,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,212,0,0,0,179,4,0, + 0,0,0,114,8,0,0,0,114,212,0,0,0,180,4,0, 0,115,2,0,0,0,0,1,122,30,95,78,97,109,101,115, 112,97,99,101,76,111,97,100,101,114,46,99,114,101,97,116, 101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, 0,115,4,0,0,0,100,0,83,0,114,109,0,0,0,114, 5,0,0,0,114,6,1,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,217,0,0,0,182,4,0, + 0,0,0,114,8,0,0,0,114,217,0,0,0,183,4,0, 0,115,2,0,0,0,0,1,122,28,95,78,97,109,101,115, 112,97,99,101,76,111,97,100,101,114,46,101,120,101,99,95, 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, @@ -1999,7 +1999,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,104,32,112,97,116,104,32,123,33,114,125,41,4,114,134, 0,0,0,114,149,0,0,0,114,15,1,0,0,114,218,0, 0,0,114,219,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,220,0,0,0,185,4,0,0,115, + 0,114,8,0,0,0,114,220,0,0,0,186,4,0,0,115, 8,0,0,0,0,7,6,1,4,255,4,2,122,28,95,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,41,12,114,125,0, @@ -2008,7 +2008,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,229,0,0,0,114,213,0,0,0,114,212,0,0,0,114, 217,0,0,0,114,220,0,0,0,114,5,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,35,1, - 0,0,157,4,0,0,115,18,0,0,0,8,1,8,3,2, + 0,0,158,4,0,0,115,18,0,0,0,8,1,8,3,2, 1,10,8,8,3,8,3,8,3,8,3,8,3,114,35,1, 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,4,0,0,0,64,0,0,0,115,118,0,0,0, @@ -2045,7 +2045,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,128,0,0,0,114,38,1,0,0,41,3,114,193,0,0, 0,114,116,0,0,0,218,6,102,105,110,100,101,114,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,38,1, - 0,0,203,4,0,0,115,10,0,0,0,0,4,22,1,8, + 0,0,204,4,0,0,115,10,0,0,0,0,4,22,1,8, 1,10,1,10,1,122,28,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,0,0,0,0, @@ -2065,7 +2065,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 117,0,0,0,41,3,114,193,0,0,0,114,44,0,0,0, 90,4,104,111,111,107,114,5,0,0,0,114,5,0,0,0, 114,8,0,0,0,218,11,95,112,97,116,104,95,104,111,111, - 107,115,213,4,0,0,115,16,0,0,0,0,3,16,1,12, + 107,115,214,4,0,0,115,16,0,0,0,0,3,16,1,12, 1,10,1,2,1,14,1,12,1,10,2,122,22,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,0,0,0,0, @@ -2096,7 +2096,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,114,111,114,114,44,1,0,0,41,3,114,193,0,0,0, 114,44,0,0,0,114,42,1,0,0,114,5,0,0,0,114, 5,0,0,0,114,8,0,0,0,218,20,95,112,97,116,104, - 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,226, + 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,227, 4,0,0,115,22,0,0,0,0,8,8,1,2,1,12,1, 12,3,8,1,2,1,14,1,12,1,10,1,16,1,122,31, 80,97,116,104,70,105,110,100,101,114,46,95,112,97,116,104, @@ -2114,7 +2114,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,139,0,0,0,114,42,1,0,0,114,140,0, 0,0,114,141,0,0,0,114,187,0,0,0,114,5,0,0, 0,114,5,0,0,0,114,8,0,0,0,218,16,95,108,101, - 103,97,99,121,95,103,101,116,95,115,112,101,99,248,4,0, + 103,97,99,121,95,103,101,116,95,115,112,101,99,249,4,0, 0,115,18,0,0,0,0,4,10,1,16,2,10,1,4,1, 8,1,12,1,12,1,6,1,122,27,80,97,116,104,70,105, 110,100,101,114,46,95,108,101,103,97,99,121,95,103,101,116, @@ -2146,7 +2146,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,116,104,90,5,101,110,116,114,121,114,42,1,0,0,114, 187,0,0,0,114,141,0,0,0,114,5,0,0,0,114,5, 0,0,0,114,8,0,0,0,218,9,95,103,101,116,95,115, - 112,101,99,7,5,0,0,115,40,0,0,0,0,5,4,1, + 112,101,99,8,5,0,0,115,40,0,0,0,0,5,4,1, 8,1,14,1,2,1,10,1,8,1,10,1,14,2,12,1, 8,1,2,1,10,1,8,1,6,1,8,1,8,5,12,2, 12,1,6,1,122,20,80,97,116,104,70,105,110,100,101,114, @@ -2173,7 +2173,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 193,0,0,0,114,139,0,0,0,114,44,0,0,0,114,202, 0,0,0,114,187,0,0,0,114,50,1,0,0,114,5,0, 0,0,114,5,0,0,0,114,8,0,0,0,114,203,0,0, - 0,39,5,0,0,115,26,0,0,0,0,6,8,1,6,1, + 0,40,5,0,0,115,26,0,0,0,0,6,8,1,6,1, 14,1,8,1,4,1,10,1,6,1,4,3,6,1,16,1, 4,2,4,2,122,20,80,97,116,104,70,105,110,100,101,114, 46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,0, @@ -2193,7 +2193,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, 32,32,32,32,78,114,204,0,0,0,114,205,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,206, - 0,0,0,63,5,0,0,115,8,0,0,0,0,8,12,1, + 0,0,0,64,5,0,0,115,8,0,0,0,0,8,12,1, 8,1,4,1,122,22,80,97,116,104,70,105,110,100,101,114, 46,102,105,110,100,95,109,111,100,117,108,101,99,1,0,0, 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, @@ -2225,7 +2225,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 98,117,116,105,111,110,115,41,4,114,193,0,0,0,114,119, 0,0,0,114,120,0,0,0,114,52,1,0,0,114,5,0, 0,0,114,5,0,0,0,114,8,0,0,0,114,53,1,0, - 0,76,5,0,0,115,4,0,0,0,0,10,12,1,122,29, + 0,77,5,0,0,115,4,0,0,0,0,10,12,1,122,29, 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, 100,105,115,116,114,105,98,117,116,105,111,110,115,41,1,78, 41,2,78,78,41,1,78,41,13,114,125,0,0,0,114,124, @@ -2234,7 +2234,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,48,1,0,0,114,51,1,0,0,114,203,0,0,0, 114,206,0,0,0,114,53,1,0,0,114,5,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,37, - 1,0,0,199,4,0,0,115,34,0,0,0,8,2,4,2, + 1,0,0,200,4,0,0,115,34,0,0,0,8,2,4,2, 2,1,10,9,2,1,10,12,2,1,10,21,2,1,10,14, 2,1,12,31,2,1,12,23,2,1,12,12,2,1,114,37, 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2279,7 +2279,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 2,86,0,1,0,113,2,100,0,83,0,114,109,0,0,0, 114,5,0,0,0,114,7,1,0,0,169,1,114,140,0,0, 0,114,5,0,0,0,114,8,0,0,0,114,10,1,0,0, - 105,5,0,0,243,0,0,0,0,122,38,70,105,108,101,70, + 106,5,0,0,243,0,0,0,0,122,38,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,114,71,0,0,0,114,104,0,0,0,78,41,7,114,167, @@ -2291,7 +2291,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,218,14,108,111,97,100,101,114,95,100,101,116,97,105, 108,115,90,7,108,111,97,100,101,114,115,114,189,0,0,0, 114,5,0,0,0,114,55,1,0,0,114,8,0,0,0,114, - 209,0,0,0,99,5,0,0,115,16,0,0,0,0,4,4, + 209,0,0,0,100,5,0,0,115,16,0,0,0,0,4,4, 1,12,1,26,1,6,2,10,1,6,1,8,1,122,19,70, 105,108,101,70,105,110,100,101,114,46,95,95,105,110,105,116, 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, @@ -2301,7 +2301,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,99,116,111,114,121,32,109,116,105,109,101,46,114,104,0, 0,0,78,41,1,114,58,1,0,0,114,246,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,38, - 1,0,0,113,5,0,0,115,2,0,0,0,0,2,122,28, + 1,0,0,114,5,0,0,115,2,0,0,0,0,2,122,28, 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,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, @@ -2324,7 +2324,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,203,0,0,0,114,140,0,0,0,114,178,0,0,0,41, 3,114,118,0,0,0,114,139,0,0,0,114,187,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 137,0,0,0,119,5,0,0,115,8,0,0,0,0,7,10, + 137,0,0,0,120,5,0,0,115,8,0,0,0,0,7,10, 1,8,1,8,1,122,22,70,105,108,101,70,105,110,100,101, 114,46,102,105,110,100,95,108,111,97,100,101,114,99,6,0, 0,0,0,0,0,0,0,0,0,0,7,0,0,0,6,0, @@ -2334,7 +2334,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 190,0,0,0,41,7,114,118,0,0,0,114,188,0,0,0, 114,139,0,0,0,114,44,0,0,0,90,4,115,109,115,108, 114,202,0,0,0,114,140,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,51,1,0,0,131,5, + 5,0,0,0,114,8,0,0,0,114,51,1,0,0,132,5, 0,0,115,8,0,0,0,0,1,10,1,8,1,2,255,122, 20,70,105,108,101,70,105,110,100,101,114,46,95,103,101,116, 95,115,112,101,99,78,99,3,0,0,0,0,0,0,0,0, @@ -2389,7 +2389,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 13,105,110,105,116,95,102,105,108,101,110,97,109,101,90,9, 102,117,108,108,95,112,97,116,104,114,187,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,203,0, - 0,0,136,5,0,0,115,72,0,0,0,0,5,4,1,14, + 0,0,137,5,0,0,115,72,0,0,0,0,5,4,1,14, 1,2,1,24,1,12,1,10,1,10,1,8,1,6,2,6, 1,6,1,10,2,6,1,4,2,8,1,12,1,14,1,8, 1,10,1,8,1,24,4,8,2,14,1,16,1,16,1,12, @@ -2420,7 +2420,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,1,160,0,161,0,146,2,113,4,83,0,114,5,0,0, 0,41,1,114,105,0,0,0,41,2,114,32,0,0,0,90, 2,102,110,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,9,60,115,101,116,99,111,109,112,62,213,5,0, + 0,0,218,9,60,115,101,116,99,111,109,112,62,214,5,0, 0,114,56,1,0,0,122,41,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,115,101,116,99,111,109,112, @@ -2437,7 +2437,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 120,95,99,111,110,116,101,110,116,115,114,33,1,0,0,114, 116,0,0,0,114,20,1,0,0,114,8,1,0,0,90,8, 110,101,119,95,110,97,109,101,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,63,1,0,0,184,5,0,0, + 0,0,114,8,0,0,0,114,63,1,0,0,185,5,0,0, 115,34,0,0,0,0,2,6,1,2,1,22,1,18,3,10, 3,12,1,12,7,6,1,8,1,16,1,4,1,18,2,4, 1,12,1,6,1,12,1,122,22,70,105,108,101,70,105,110, @@ -2476,14 +2476,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,169,2,114,193,0,0,0,114,62,1,0,0,114, 5,0,0,0,114,8,0,0,0,218,24,112,97,116,104,95, 104,111,111,107,95,102,111,114,95,70,105,108,101,70,105,110, - 100,101,114,225,5,0,0,115,6,0,0,0,0,2,8,1, + 100,101,114,226,5,0,0,115,6,0,0,0,0,2,8,1, 12,1,122,54,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,107,95,102,111,114,95, 70,105,108,101,70,105,110,100,101,114,114,5,0,0,0,41, 3,114,193,0,0,0,114,62,1,0,0,114,69,1,0,0, 114,5,0,0,0,114,68,1,0,0,114,8,0,0,0,218, - 9,112,97,116,104,95,104,111,111,107,215,5,0,0,115,4, + 9,112,97,116,104,95,104,111,111,107,216,5,0,0,115,4, 0,0,0,0,10,14,6,122,20,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,0,0,0,0,1,0,0,0,3,0, @@ -2492,7 +2492,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 70,105,110,100,101,114,40,123,33,114,125,41,41,2,114,62, 0,0,0,114,44,0,0,0,114,246,0,0,0,114,5,0, 0,0,114,5,0,0,0,114,8,0,0,0,114,31,1,0, - 0,233,5,0,0,115,2,0,0,0,0,1,122,19,70,105, + 0,234,5,0,0,115,2,0,0,0,0,1,122,19,70,105, 108,101,70,105,110,100,101,114,46,95,95,114,101,112,114,95, 95,41,1,78,41,15,114,125,0,0,0,114,124,0,0,0, 114,126,0,0,0,114,127,0,0,0,114,209,0,0,0,114, @@ -2500,7 +2500,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,51,1,0,0,114,203,0,0,0,114,63,1, 0,0,114,207,0,0,0,114,70,1,0,0,114,31,1,0, 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,54,1,0,0,90,5,0,0,115,22, + 114,8,0,0,0,114,54,1,0,0,91,5,0,0,115,22, 0,0,0,8,2,4,7,8,14,8,4,4,2,8,12,8, 5,10,48,8,31,2,1,10,17,114,54,1,0,0,99,4, 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,8, @@ -2523,7 +2523,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,90,8,112,97,116,104,110,97,109,101,90,9,99,112,97, 116,104,110,97,109,101,114,140,0,0,0,114,187,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 14,95,102,105,120,95,117,112,95,109,111,100,117,108,101,239, + 14,95,102,105,120,95,117,112,95,109,111,100,117,108,101,240, 5,0,0,115,34,0,0,0,0,2,10,1,10,1,4,1, 4,1,8,1,8,1,12,2,10,1,4,1,14,1,2,1, 8,1,8,1,8,1,12,1,12,2,114,75,1,0,0,99, @@ -2543,7 +2543,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,5,1,0,0,114,88,0,0,0,41,3,90,10,101,120, 116,101,110,115,105,111,110,115,90,6,115,111,117,114,99,101, 90,8,98,121,116,101,99,111,100,101,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,184,0,0,0,6,6, + 5,0,0,0,114,8,0,0,0,114,184,0,0,0,7,6, 0,0,115,8,0,0,0,0,5,12,1,8,1,8,1,114, 184,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, 0,10,0,0,0,9,0,0,0,67,0,0,0,115,130,1, @@ -2591,7 +2591,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,0,107,2,86,0,1,0,113,2,100,1,83,0,41,2, 114,39,0,0,0,78,41,1,114,23,0,0,0,41,2,114, 32,0,0,0,114,94,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,10,1,0,0,35,6,0, + 0,0,0,114,8,0,0,0,114,10,1,0,0,36,6,0, 0,114,56,1,0,0,122,25,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,114,73,0,0,0,122,30,105,109,112,111,114,116,108,105, @@ -2603,7 +2603,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,93,14,125,1,100,0,124,1,155,0,157,2,146,2,113, 4,83,0,41,1,114,74,0,0,0,114,5,0,0,0,41, 2,114,32,0,0,0,218,1,115,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,64,1,0,0,52,6,0, + 0,0,0,114,8,0,0,0,114,64,1,0,0,53,6,0, 0,114,56,1,0,0,122,25,95,115,101,116,117,112,46,60, 108,111,99,97,108,115,62,46,60,115,101,116,99,111,109,112, 62,41,3,114,64,0,0,0,114,75,0,0,0,114,160,0, @@ -2624,7 +2624,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,97,109,101,115,90,12,98,117,105,108,116,105,110,95,110, 97,109,101,90,14,98,117,105,108,116,105,110,95,109,111,100, 117,108,101,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,6,95,115,101,116,117,112,17,6,0,0,115,70, + 0,0,218,6,95,115,101,116,117,112,18,6,0,0,115,70, 0,0,0,0,8,4,1,6,1,6,2,10,3,22,1,12, 2,22,1,8,1,10,1,10,1,6,2,2,1,10,1,10, 1,12,1,10,2,8,2,12,1,12,1,18,1,22,3,8, @@ -2644,7 +2644,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,37,1,0,0,41,2,114,81,1,0,0,90,17,115, 117,112,112,111,114,116,101,100,95,108,111,97,100,101,114,115, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 8,95,105,110,115,116,97,108,108,74,6,0,0,115,8,0, + 8,95,105,110,115,116,97,108,108,75,6,0,0,115,8,0, 0,0,0,2,8,1,6,1,20,1,114,84,1,0,0,41, 1,114,60,0,0,0,41,1,78,41,3,78,78,78,41,2, 114,73,0,0,0,114,73,0,0,0,41,1,84,41,1,78, @@ -2678,7 +2678,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,117,108,101,62,1,0,0,0,115,126,0,0,0,4,22, 4,1,4,1,2,1,2,255,4,4,8,17,8,5,8,5, 8,6,8,6,8,12,8,10,8,9,8,5,8,7,8,9, - 10,22,10,127,0,20,16,1,12,2,4,1,4,2,6,2, + 10,22,10,127,0,21,16,1,12,2,4,1,4,2,6,2, 6,2,8,2,16,71,8,40,8,19,8,12,8,12,8,28, 8,17,8,33,8,28,8,24,10,13,10,10,10,11,8,14, 6,3,4,1,2,255,12,68,14,64,14,29,16,127,0,17, From ff246f9470d5c84652e0625e951bcedb90fc3f48 Mon Sep 17 00:00:00 2001 From: abdo Date: Sun, 11 Oct 2020 09:10:21 +0300 Subject: [PATCH 0242/1261] Fix typo in typing.rst (GH-22625) --- Doc/library/typing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index f4b2718cdc2f8c..6111603a995c58 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1723,7 +1723,7 @@ Constant If ``from __future__ import annotations`` is used in Python 3.7 or later, annotations are not evaluated at function definition time. - Instead, the are stored as strings in ``__annotations__``, + Instead, they are stored as strings in ``__annotations__``, This makes it unnecessary to use quotes around the annotation. (see :pep:`563`). From 6a855400e0366236f6ee8fe8cd8f9405a78fee3d Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 11 Oct 2020 15:30:43 +0300 Subject: [PATCH 0243/1261] bpo-42002: Clean up initialization of the sys module. (GH-22642) Makes the code clearer and make errors handling more correct. --- Python/sysmodule.c | 152 ++++++++++++++------------------------------- 1 file changed, 45 insertions(+), 107 deletions(-) diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 9fcdb5dbc49b14..bfcf4e85140a84 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2649,18 +2649,7 @@ static struct PyModuleDef sysmodule = { }; /* Updating the sys namespace, returning NULL pointer on error */ -#define SET_SYS_FROM_STRING_BORROW(key, value) \ - do { \ - PyObject *v = (value); \ - if (v == NULL) { \ - goto err_occurred; \ - } \ - res = PyDict_SetItemString(sysdict, key, v); \ - if (res < 0) { \ - goto err_occurred; \ - } \ - } while (0) -#define SET_SYS_FROM_STRING(key, value) \ +#define SET_SYS(key, value) \ do { \ PyObject *v = (value); \ if (v == NULL) { \ @@ -2673,6 +2662,9 @@ static struct PyModuleDef sysmodule = { } \ } while (0) +#define SET_SYS_FROM_STRING(key, value) \ + SET_SYS(key, PyUnicode_FromString(value)) + static PyStatus _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) { @@ -2681,65 +2673,48 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) /* stdin/stdout/stderr are set in pylifecycle.c */ - SET_SYS_FROM_STRING_BORROW("__displayhook__", - PyDict_GetItemString(sysdict, "displayhook")); - SET_SYS_FROM_STRING_BORROW("__excepthook__", - PyDict_GetItemString(sysdict, "excepthook")); - SET_SYS_FROM_STRING_BORROW( - "__breakpointhook__", - PyDict_GetItemString(sysdict, "breakpointhook")); - SET_SYS_FROM_STRING_BORROW("__unraisablehook__", - PyDict_GetItemString(sysdict, "unraisablehook")); - - SET_SYS_FROM_STRING("version", - PyUnicode_FromString(Py_GetVersion())); - SET_SYS_FROM_STRING("hexversion", - PyLong_FromLong(PY_VERSION_HEX)); - SET_SYS_FROM_STRING("_git", - Py_BuildValue("(szz)", "CPython", _Py_gitidentifier(), - _Py_gitversion())); - SET_SYS_FROM_STRING("_framework", PyUnicode_FromString(_PYTHONFRAMEWORK)); - SET_SYS_FROM_STRING("api_version", - PyLong_FromLong(PYTHON_API_VERSION)); - SET_SYS_FROM_STRING("copyright", - PyUnicode_FromString(Py_GetCopyright())); - SET_SYS_FROM_STRING("platform", - PyUnicode_FromString(Py_GetPlatform())); - SET_SYS_FROM_STRING("maxsize", - PyLong_FromSsize_t(PY_SSIZE_T_MAX)); - SET_SYS_FROM_STRING("float_info", - PyFloat_GetInfo()); - SET_SYS_FROM_STRING("int_info", - PyLong_GetInfo()); +#define COPY_SYS_ATTR(tokey, fromkey) \ + SET_SYS(tokey, PyMapping_GetItemString(sysdict, fromkey)) + + COPY_SYS_ATTR("__displayhook__", "displayhook"); + COPY_SYS_ATTR("__excepthook__", "excepthook"); + COPY_SYS_ATTR("__breakpointhook__", "breakpointhook"); + COPY_SYS_ATTR("__unraisablehook__", "unraisablehook"); + +#undef COPY_SYS_ATTR + + SET_SYS_FROM_STRING("version", Py_GetVersion()); + SET_SYS("hexversion", PyLong_FromLong(PY_VERSION_HEX)); + SET_SYS("_git", Py_BuildValue("(szz)", "CPython", _Py_gitidentifier(), + _Py_gitversion())); + SET_SYS_FROM_STRING("_framework", _PYTHONFRAMEWORK); + SET_SYS("api_version", PyLong_FromLong(PYTHON_API_VERSION)); + SET_SYS_FROM_STRING("copyright", Py_GetCopyright()); + SET_SYS_FROM_STRING("platform", Py_GetPlatform()); + SET_SYS("maxsize", PyLong_FromSsize_t(PY_SSIZE_T_MAX)); + SET_SYS("float_info", PyFloat_GetInfo()); + SET_SYS("int_info", PyLong_GetInfo()); /* initialize hash_info */ if (Hash_InfoType.tp_name == NULL) { if (PyStructSequence_InitType2(&Hash_InfoType, &hash_info_desc) < 0) { goto type_init_failed; } } - SET_SYS_FROM_STRING("hash_info", - get_hash_info(tstate)); - SET_SYS_FROM_STRING("maxunicode", - PyLong_FromLong(0x10FFFF)); - SET_SYS_FROM_STRING("builtin_module_names", - list_builtin_module_names()); + SET_SYS("hash_info", get_hash_info(tstate)); + SET_SYS("maxunicode", PyLong_FromLong(0x10FFFF)); + SET_SYS("builtin_module_names", list_builtin_module_names()); #if PY_BIG_ENDIAN - SET_SYS_FROM_STRING("byteorder", - PyUnicode_FromString("big")); + SET_SYS_FROM_STRING("byteorder", "big"); #else - SET_SYS_FROM_STRING("byteorder", - PyUnicode_FromString("little")); + SET_SYS_FROM_STRING("byteorder", "little"); #endif #ifdef MS_COREDLL - SET_SYS_FROM_STRING("dllhandle", - PyLong_FromVoidPtr(PyWin_DLLhModule)); - SET_SYS_FROM_STRING("winver", - PyUnicode_FromString(PyWin_DLLVersionString)); + SET_SYS("dllhandle", PyLong_FromVoidPtr(PyWin_DLLhModule)); + SET_SYS_FROM_STRING("winver", PyWin_DLLVersionString); #endif #ifdef ABIFLAGS - SET_SYS_FROM_STRING("abiflags", - PyUnicode_FromString(ABIFLAGS)); + SET_SYS_FROM_STRING("abiflags", ABIFLAGS); #endif /* version_info */ @@ -2750,7 +2725,7 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) } } version_info = make_version_info(tstate); - SET_SYS_FROM_STRING("version_info", version_info); + SET_SYS("version_info", version_info); /* prevent user from creating new instances */ VersionInfoType.tp_init = NULL; VersionInfoType.tp_new = NULL; @@ -2760,7 +2735,7 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) } /* implementation */ - SET_SYS_FROM_STRING("implementation", make_impl_info(version_info)); + SET_SYS("implementation", make_impl_info(version_info)); /* flags */ if (FlagsType.tp_name == 0) { @@ -2769,7 +2744,7 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) } } /* Set flags to their default values (updated by _PySys_InitMain()) */ - SET_SYS_FROM_STRING("flags", make_flags(tstate)); + SET_SYS("flags", make_flags(tstate)); #if defined(MS_WINDOWS) /* getwindowsversion */ @@ -2790,14 +2765,12 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */ #ifndef PY_NO_SHORT_FLOAT_REPR - SET_SYS_FROM_STRING("float_repr_style", - PyUnicode_FromString("short")); + SET_SYS_FROM_STRING("float_repr_style", "short"); #else - SET_SYS_FROM_STRING("float_repr_style", - PyUnicode_FromString("legacy")); + SET_SYS_FROM_STRING("float_repr_style", "legacy"); #endif - SET_SYS_FROM_STRING("thread_info", PyThread_GetInfo()); + SET_SYS("thread_info", PyThread_GetInfo()); /* initialize asyncgen_hooks */ if (AsyncGenHooksType.tp_name == NULL) { @@ -2819,20 +2792,6 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) return _PyStatus_ERR("can't initialize sys module"); } -/* Updating the sys namespace, returning integer error codes */ -#define SET_SYS_FROM_STRING_INT_RESULT(key, value) \ - do { \ - PyObject *v = (value); \ - if (v == NULL) \ - return -1; \ - res = PyDict_SetItemString(sysdict, key, v); \ - Py_DECREF(v); \ - if (res < 0) { \ - return res; \ - } \ - } while (0) - - static int sys_add_xoption(PyObject *opts, const wchar_t *s) { @@ -2895,24 +2854,10 @@ _PySys_InitMain(PyThreadState *tstate) int res; #define COPY_LIST(KEY, VALUE) \ - do { \ - PyObject *list = _PyWideStringList_AsList(&(VALUE)); \ - if (list == NULL) { \ - return -1; \ - } \ - SET_SYS_FROM_STRING_BORROW(KEY, list); \ - Py_DECREF(list); \ - } while (0) + SET_SYS(KEY, _PyWideStringList_AsList(&(VALUE))); #define SET_SYS_FROM_WSTR(KEY, VALUE) \ - do { \ - PyObject *str = PyUnicode_FromWideChar(VALUE, -1); \ - if (str == NULL) { \ - return -1; \ - } \ - SET_SYS_FROM_STRING_BORROW(KEY, str); \ - Py_DECREF(str); \ - } while (0) + SET_SYS(KEY, PyUnicode_FromWideChar(VALUE, -1)); COPY_LIST("path", config->module_search_paths); @@ -2934,19 +2879,14 @@ _PySys_InitMain(PyThreadState *tstate) COPY_LIST("orig_argv", config->orig_argv); COPY_LIST("warnoptions", config->warnoptions); - PyObject *xoptions = sys_create_xoptions_dict(config); - if (xoptions == NULL) { - return -1; - } - SET_SYS_FROM_STRING_BORROW("_xoptions", xoptions); - Py_DECREF(xoptions); + SET_SYS("_xoptions", sys_create_xoptions_dict(config)); #undef COPY_LIST #undef SET_SYS_FROM_WSTR /* Set flags to their final values */ - SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(tstate)); + SET_SYS("flags", make_flags(tstate)); /* prevent user from creating new instances */ FlagsType.tp_init = NULL; FlagsType.tp_new = NULL; @@ -2958,8 +2898,7 @@ _PySys_InitMain(PyThreadState *tstate) _PyErr_Clear(tstate); } - SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode", - PyBool_FromLong(!config->write_bytecode)); + SET_SYS("dont_write_bytecode", PyBool_FromLong(!config->write_bytecode)); if (get_warnoptions(tstate) == NULL) { return -1; @@ -2978,9 +2917,8 @@ _PySys_InitMain(PyThreadState *tstate) return -1; } +#undef SET_SYS #undef SET_SYS_FROM_STRING -#undef SET_SYS_FROM_STRING_BORROW -#undef SET_SYS_FROM_STRING_INT_RESULT /* Set up a preliminary stderr printer until we have enough From f969a1a296565a0c0a81ea373d75a453e17a75ad Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 11 Oct 2020 16:51:07 +0300 Subject: [PATCH 0244/1261] bpo-41993: Fix possible issues in remove_module() (GH-22631) * PyMapping_HasKey() is not safe because it silences all exceptions and can return incorrect result. * Informative exceptions from PyMapping_DelItem() are overridden with RuntimeError and the original exception raised before calling remove_module() is lost. * There is a race condition between PyMapping_HasKey() and PyMapping_DelItem(). --- .../2020-10-10-13-53-52.bpo-41993.YMzixQ.rst | 2 ++ Python/import.c | 23 +++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-10-13-53-52.bpo-41993.YMzixQ.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-10-13-53-52.bpo-41993.YMzixQ.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-10-13-53-52.bpo-41993.YMzixQ.rst new file mode 100644 index 00000000000000..3669cf11ea4cd3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-10-13-53-52.bpo-41993.YMzixQ.rst @@ -0,0 +1,2 @@ +Fixed potential issues with removing not completely initialized module from +``sys.modules`` when import fails. diff --git a/Python/import.c b/Python/import.c index 505688400ef3e3..26b80f320c3437 100644 --- a/Python/import.c +++ b/Python/import.c @@ -902,7 +902,11 @@ PyImport_AddModule(const char *name) } -/* Remove name from sys.modules, if it's there. */ +/* Remove name from sys.modules, if it's there. + * Can be called with an exception raised. + * If fail to remove name a new exception will be chained with the old + * exception, otherwise the old exception is preserved. + */ static void remove_module(PyThreadState *tstate, PyObject *name) { @@ -910,18 +914,17 @@ remove_module(PyThreadState *tstate, PyObject *name) _PyErr_Fetch(tstate, &type, &value, &traceback); PyObject *modules = tstate->interp->modules; - if (!PyMapping_HasKey(modules, name)) { - goto out; + if (PyDict_CheckExact(modules)) { + PyObject *mod = _PyDict_Pop(modules, name, Py_None); + Py_XDECREF(mod); } - if (PyMapping_DelItem(modules, name) < 0) { - _PyErr_SetString(tstate, PyExc_RuntimeError, - "deleting key in sys.modules failed"); - _PyErr_ChainExceptions(type, value, traceback); - return; + else if (PyMapping_DelItem(modules, name) < 0) { + if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); + } } -out: - _PyErr_Restore(tstate, type, value, traceback); + _PyErr_ChainExceptions(type, value, traceback); } From e64cfb2c96f504515d929ea662c4ecf52943e25b Mon Sep 17 00:00:00 2001 From: Gaurav Kamath Date: Sun, 11 Oct 2020 11:13:43 -0700 Subject: [PATCH 0245/1261] Fix typo (GH-22582) /af/of/s Automerge-Triggered-By: @Mariatta --- Doc/library/math.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/math.rst b/Doc/library/math.rst index bbf64643ff59fc..145bac4966e18c 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -130,7 +130,7 @@ Number-theoretic and representation functions Return the greatest common divisor of the specified integer arguments. If any of the arguments is nonzero, then the returned value is the largest - positive integer that is a divisor af all arguments. If all arguments + positive integer that is a divisor of all arguments. If all arguments are zero, then the returned value is ``0``. ``gcd()`` without arguments returns ``0``. From db6c08471fda67b462bb5890919f3bed1913cb8b Mon Sep 17 00:00:00 2001 From: chilaxan Date: Sun, 11 Oct 2020 14:21:51 -0400 Subject: [PATCH 0246/1261] Fix typo in listobject.h (GH-22588) --- Include/cpython/listobject.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h index 70b9d83d8a232c..e1b9462d5b3612 100644 --- a/Include/cpython/listobject.h +++ b/Include/cpython/listobject.h @@ -26,7 +26,7 @@ PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); /* Macro, trading safety for speed */ -/* Cast argument to PyTupleObject* type. */ +/* Cast argument to PyListObject* type. */ #define _PyList_CAST(op) (assert(PyList_Check(op)), (PyListObject *)(op)) #define PyList_GET_ITEM(op, i) (_PyList_CAST(op)->ob_item[i]) From 52d5e1d5595221e9d18970d2d63a6b52801b6f81 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 11 Oct 2020 11:26:50 -0700 Subject: [PATCH 0247/1261] Fix .. code-block :: directives in decimal.rst (GH-22571) --- Doc/c-api/decimal.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/c-api/decimal.rst b/Doc/c-api/decimal.rst index f530571ebae577..94cc4a7b845791 100644 --- a/Doc/c-api/decimal.rst +++ b/Doc/c-api/decimal.rst @@ -16,7 +16,7 @@ Initialize Typically, a C extension module that uses the decimal API will do these steps in its init function: -.. code-block:: +.. code-block:: c #include "pydecimal.h" @@ -88,7 +88,7 @@ Data structures The conversion functions use the following status codes and data structures: -.. code-block:: +.. code-block:: c /* status cases for getting a triple */ enum mpd_triple_class { @@ -126,7 +126,7 @@ Functions For simplicity, the usage of the function and all special cases are explained in code form and comments: -.. code-block:: +.. code-block:: c triple = PyDec_AsUint128Triple(dec); switch (triple.tag) { From f7768e0d087a2171af2e95e0c1ff424be859bb17 Mon Sep 17 00:00:00 2001 From: Kyle Evans Date: Sun, 11 Oct 2020 13:54:11 -0500 Subject: [PATCH 0248/1261] bpo-40422: create a common _Py_closerange API (GH-19754) Such an API can be used both for os.closerange and subprocess. For the latter, this yields potential improvement for platforms that have fdwalk but wouldn't have used it there. This will prove even more beneficial later for platforms that have close_range(2), as the new API will prefer that over all else if it's available. The new API is structured to look more like close_range(2), closing from [start, end] rather than the [low, high) of os.closerange(). Automerge-Triggered-By: @gpshead --- .../2020-10-10-14-05-24.bpo-40422.sh8IDY.rst | 1 + Modules/_posixsubprocess.c | 15 +--- Modules/posixmodule.c | 70 ++++++++++++------- Modules/posixmodule.h | 2 + 4 files changed, 51 insertions(+), 37 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-10-10-14-05-24.bpo-40422.sh8IDY.rst diff --git a/Misc/NEWS.d/next/C API/2020-10-10-14-05-24.bpo-40422.sh8IDY.rst b/Misc/NEWS.d/next/C API/2020-10-10-14-05-24.bpo-40422.sh8IDY.rst new file mode 100644 index 00000000000000..1b6d9e034b5296 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-10-14-05-24.bpo-40422.sh8IDY.rst @@ -0,0 +1 @@ +Add `_Py_closerange` function to provide performant closing of a range of file descriptors. \ No newline at end of file diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 5d1691ace41920..ed046fc5c1ba9f 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -250,7 +250,6 @@ _close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep) long end_fd = safe_get_max_fd(); Py_ssize_t num_fds_to_keep = PyTuple_GET_SIZE(py_fds_to_keep); Py_ssize_t keep_seq_idx; - int fd_num; /* As py_fds_to_keep is sorted we can loop through the list closing * fds in between any in the keep list falling within our range. */ for (keep_seq_idx = 0; keep_seq_idx < num_fds_to_keep; ++keep_seq_idx) { @@ -258,21 +257,11 @@ _close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep) int keep_fd = PyLong_AsLong(py_keep_fd); if (keep_fd < start_fd) continue; - for (fd_num = start_fd; fd_num < keep_fd; ++fd_num) { - close(fd_num); - } + _Py_closerange(start_fd, keep_fd - 1); start_fd = keep_fd + 1; } if (start_fd <= end_fd) { -#if defined(__FreeBSD__) - /* Any errors encountered while closing file descriptors are ignored */ - closefrom(start_fd); -#else - for (fd_num = start_fd; fd_num < end_fd; ++fd_num) { - /* Ignore errors */ - (void)close(fd_num); - } -#endif + _Py_closerange(start_fd, end_fd); } } diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 165625c9a670a5..321eaec63c4a48 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8740,8 +8740,23 @@ os_close_impl(PyObject *module, int fd) Py_RETURN_NONE; } +/* Our selection logic for which function to use is as follows: + * 1. If closefrom(2) is available, we'll attempt to use that next if we're + * closing up to sysconf(_SC_OPEN_MAX). + * 1a. Fallback to fdwalk(3) if we're not closing up to sysconf(_SC_OPEN_MAX), + * as that will be more performant if the range happens to have any chunk of + * non-opened fd in the middle. + * 1b. If fdwalk(3) isn't available, just do a plain close(2) loop. + */ +#ifdef __FreeBSD__ +#define USE_CLOSEFROM +#endif /* __FreeBSD__ */ #ifdef HAVE_FDWALK +#define USE_FDWALK +#endif /* HAVE_FDWALK */ + +#ifdef USE_FDWALK static int _fdwalk_close_func(void *lohi, int fd) { @@ -8757,7 +8772,36 @@ _fdwalk_close_func(void *lohi, int fd) } return 0; } -#endif /* HAVE_FDWALK */ +#endif /* USE_FDWALK */ + +/* Closes all file descriptors in [first, last], ignoring errors. */ +void +_Py_closerange(int first, int last) +{ + first = Py_MAX(first, 0); +#ifdef USE_CLOSEFROM + if (last >= sysconf(_SC_OPEN_MAX)) { + /* Any errors encountered while closing file descriptors are ignored */ + closefrom(first); + } + else +#endif /* USE_CLOSEFROM */ +#ifdef USE_FDWALK + { + int lohi[2]; + lohi[0] = first; + lohi[1] = last + 1; + fdwalk(_fdwalk_close_func, lohi); + } +#else + { + for (int i = first; i <= last; i++) { + /* Ignore errors */ + (void)close(i); + } + } +#endif /* USE_FDWALK */ +} /*[clinic input] os.closerange @@ -8773,31 +8817,9 @@ static PyObject * os_closerange_impl(PyObject *module, int fd_low, int fd_high) /*[clinic end generated code: output=0ce5c20fcda681c2 input=5855a3d053ebd4ec]*/ { -#ifdef HAVE_FDWALK - int lohi[2]; -#endif Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH -#ifdef HAVE_FDWALK - lohi[0] = Py_MAX(fd_low, 0); - lohi[1] = fd_high; - fdwalk(_fdwalk_close_func, lohi); -#else - fd_low = Py_MAX(fd_low, 0); -#ifdef __FreeBSD__ - if (fd_high >= sysconf(_SC_OPEN_MAX)) { - /* Any errors encountered while closing file descriptors are ignored */ - closefrom(fd_low); - } - else -#endif - { - for (int i = fd_low; i < fd_high; i++) { - /* Ignore errors */ - (void)close(i); - } - } -#endif + _Py_closerange(fd_low, fd_high - 1); _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS Py_RETURN_NONE; diff --git a/Modules/posixmodule.h b/Modules/posixmodule.h index 1e00562abc3370..749833f71cd4de 100644 --- a/Modules/posixmodule.h +++ b/Modules/posixmodule.h @@ -28,6 +28,8 @@ PyAPI_FUNC(int) _Py_Sigset_Converter(PyObject *, void *); #endif /* HAVE_SIGSET_T */ #endif /* Py_LIMITED_API */ +PyAPI_FUNC(void) _Py_closerange(int first, int last); + #ifdef __cplusplus } #endif From da9cff160c43add2a27c1d3092645f445aa0f0db Mon Sep 17 00:00:00 2001 From: Kyle Evans Date: Sun, 11 Oct 2020 15:18:53 -0500 Subject: [PATCH 0249/1261] bpo-40423: Optimization: use close_range(2) if available (GH-22651) close_range(2) should be preferred at all times if it's available, otherwise we'll use closefrom(2) if available with a fallback to fdwalk(3) or plain old loop over fd range in order of most efficient to least. [note that this version does check for ENOSYS, but currently ignores all other errors] Automerge-Triggered-By: @pablogsal --- .../2020-10-11-19-17-44.bpo-40423.GsmgEj.rst | 3 +++ Modules/posixmodule.c | 17 ++++++++++++++--- configure | 4 ++-- configure.ac | 4 ++-- pyconfig.h.in | 3 +++ 5 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-10-11-19-17-44.bpo-40423.GsmgEj.rst diff --git a/Misc/NEWS.d/next/C API/2020-10-11-19-17-44.bpo-40423.GsmgEj.rst b/Misc/NEWS.d/next/C API/2020-10-11-19-17-44.bpo-40423.GsmgEj.rst new file mode 100644 index 00000000000000..44e571ebf86daf --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-11-19-17-44.bpo-40423.GsmgEj.rst @@ -0,0 +1,3 @@ +The :mod:`subprocess` module and ``os.closerange`` will now use the +``close_range(low, high, flags)`` syscall when it is available for more +efficient closing of ranges of descriptors. \ No newline at end of file diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 321eaec63c4a48..2e0caaa3e561ba 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8741,12 +8741,15 @@ os_close_impl(PyObject *module, int fd) } /* Our selection logic for which function to use is as follows: - * 1. If closefrom(2) is available, we'll attempt to use that next if we're + * 1. If close_range(2) is available, always prefer that; it's better for + * contiguous ranges like this than fdwalk(3) which entails iterating over + * the entire fd space and simply doing nothing for those outside the range. + * 2. If closefrom(2) is available, we'll attempt to use that next if we're * closing up to sysconf(_SC_OPEN_MAX). - * 1a. Fallback to fdwalk(3) if we're not closing up to sysconf(_SC_OPEN_MAX), + * 2a. Fallback to fdwalk(3) if we're not closing up to sysconf(_SC_OPEN_MAX), * as that will be more performant if the range happens to have any chunk of * non-opened fd in the middle. - * 1b. If fdwalk(3) isn't available, just do a plain close(2) loop. + * 2b. If fdwalk(3) isn't available, just do a plain close(2) loop. */ #ifdef __FreeBSD__ #define USE_CLOSEFROM @@ -8779,6 +8782,14 @@ void _Py_closerange(int first, int last) { first = Py_MAX(first, 0); +#ifdef HAVE_CLOSE_RANGE + if (close_range(first, last, 0) == 0 || errno != ENOSYS) { + /* Any errors encountered while closing file descriptors are ignored; + * ENOSYS means no kernel support, though, + * so we'll fallback to the other methods. */ + } + else +#endif /* HAVE_CLOSE_RANGE */ #ifdef USE_CLOSEFROM if (last >= sysconf(_SC_OPEN_MAX)) { /* Any errors encountered while closing file descriptors are ignored */ diff --git a/configure b/configure index ad74754e9a7215..89577d85a41482 100755 --- a/configure +++ b/configure @@ -11672,8 +11672,8 @@ fi # checks for library functions for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ - clock confstr copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \ - faccessat fchmod fchmodat fchown fchownat \ + clock confstr close_range copy_file_range ctermid dup3 execv explicit_bzero \ + explicit_memset faccessat fchmod fchmodat fchown fchownat \ fdwalk fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \ futimens futimes gai_strerror getentropy \ getgrgid_r getgrnam_r \ diff --git a/configure.ac b/configure.ac index f0bc8c625844b6..3ec274c576edfd 100644 --- a/configure.ac +++ b/configure.ac @@ -3664,8 +3664,8 @@ fi # checks for library functions AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ - clock confstr copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \ - faccessat fchmod fchmodat fchown fchownat \ + clock confstr close_range copy_file_range ctermid dup3 execv explicit_bzero \ + explicit_memset faccessat fchmod fchmodat fchown fchownat \ fdwalk fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \ futimens futimes gai_strerror getentropy \ getgrgid_r getgrnam_r \ diff --git a/pyconfig.h.in b/pyconfig.h.in index c162a3c33e57b6..298cb4fa12f80c 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -139,6 +139,9 @@ /* Define to 1 if you have the `clock_settime' function. */ #undef HAVE_CLOCK_SETTIME +/* Define to 1 if you have the `close_range' function. */ +#undef HAVE_CLOSE_RANGE + /* Define if the C compiler supports computed gotos. */ #undef HAVE_COMPUTED_GOTOS From 45a495af25b6977a2fe680d8762c0b9bca89d61a Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 11 Oct 2020 21:34:51 +0100 Subject: [PATCH 0250/1261] bpo-41971: Fix test failure in test.test_tools.test_c_analyzer when mutating global state (GH-22652) --- Tools/c-analyzer/c_analyzer/common/files.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tools/c-analyzer/c_analyzer/common/files.py b/Tools/c-analyzer/c_analyzer/common/files.py index f630afe6259242..a8a044757d00b2 100644 --- a/Tools/c-analyzer/c_analyzer/common/files.py +++ b/Tools/c-analyzer/c_analyzer/common/files.py @@ -60,7 +60,7 @@ def glob_tree(root, *, def iter_files(root, suffix=None, relparent=None, *, - get_files=os.walk, + get_files=None, _glob=glob_tree, _walk=walk_tree, ): @@ -75,6 +75,8 @@ def iter_files(root, suffix=None, relparent=None, *, if "relparent" is provided then it is used to resolve each filename as a relative path. """ + if get_files is None: + get_files = os.walk if not isinstance(root, str): roots = root for root in roots: From 9fc72caffa9603d285c833fdca39bb98b7b61d7a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 12 Oct 2020 00:37:20 +0200 Subject: [PATCH 0251/1261] bpo-41739: Fix test_logging.test_race_between_set_target_and_flush() (GH-22655) The test now waits until all threads complete to avoid leaking running threads. Also, use regular threads rather than daemon threads. --- Lib/test/test_logging.py | 21 ++++++++++++------- .../2020-10-12-00-11-47.bpo-41739.wSCc4K.rst | 2 ++ 2 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-10-12-00-11-47.bpo-41739.wSCc4K.rst diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 4cd8c7e25daa93..7c98e19b7408fc 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -1164,22 +1164,27 @@ def test_race_between_set_target_and_flush(self): class MockRaceConditionHandler: def __init__(self, mem_hdlr): self.mem_hdlr = mem_hdlr + self.threads = [] def removeTarget(self): self.mem_hdlr.setTarget(None) def handle(self, msg): - t = threading.Thread(target=self.removeTarget) - t.daemon = True - t.start() + thread = threading.Thread(target=self.removeTarget) + self.threads.append(thread) + thread.start() target = MockRaceConditionHandler(self.mem_hdlr) - self.mem_hdlr.setTarget(target) + try: + self.mem_hdlr.setTarget(target) - for _ in range(10): - time.sleep(0.005) - self.mem_logger.info("not flushed") - self.mem_logger.warning("flushed") + for _ in range(10): + time.sleep(0.005) + self.mem_logger.info("not flushed") + self.mem_logger.warning("flushed") + finally: + for thread in target.threads: + threading_helper.join_thread(thread) class ExceptionFormatter(logging.Formatter): diff --git a/Misc/NEWS.d/next/Tests/2020-10-12-00-11-47.bpo-41739.wSCc4K.rst b/Misc/NEWS.d/next/Tests/2020-10-12-00-11-47.bpo-41739.wSCc4K.rst new file mode 100644 index 00000000000000..7aee2b94444727 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-10-12-00-11-47.bpo-41739.wSCc4K.rst @@ -0,0 +1,2 @@ +Fix test_logging.test_race_between_set_target_and_flush(): the test now +waits until all threads complete to avoid leaking running threads. From 81719419e2a72235ad49ad8044201a21cb09e273 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Mon, 12 Oct 2020 10:52:30 -0300 Subject: [PATCH 0252/1261] [doc] Remove mention of async and await as soft keywords (GH-22144) --- Doc/reference/compound_stmts.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 04a3948d0c9dcf..62986cb151964a 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -768,10 +768,8 @@ Coroutine function definition keyword: await Execution of Python coroutines can be suspended and resumed at many points -(see :term:`coroutine`). Inside the body of a coroutine function, ``await`` and -``async`` identifiers become reserved keywords; :keyword:`await` expressions, -:keyword:`async for` and :keyword:`async with` can only be used in -coroutine function bodies. +(see :term:`coroutine`). :keyword:`await` expressions, :keyword:`async for` and +:keyword:`async with` can only be used in the body of a coroutine function. Functions defined with ``async def`` syntax are always coroutine functions, even if they do not contain ``await`` or ``async`` keywords. @@ -785,6 +783,9 @@ An example of a coroutine function:: do_stuff() await some_coroutine() +.. versionchanged:: 3.7 + ``await`` and ``async`` are now keywords; previously they were only + treated as such inside the body of a coroutine function. .. index:: statement: async for .. _`async for`: From 0ab1b031e256225f9a11336a995c79b939a85797 Mon Sep 17 00:00:00 2001 From: linchiwei123 <40888469+linchiwei123@users.noreply.github.com> Date: Mon, 12 Oct 2020 22:33:34 +0800 Subject: [PATCH 0253/1261] [doc] Fix typo in the graphlib docs (GH-22661) Automerge-Triggered-By: @pablogsal --- Lib/graphlib.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/graphlib.py b/Lib/graphlib.py index 948f62f1dc3034..d0e7a4814c565d 100644 --- a/Lib/graphlib.py +++ b/Lib/graphlib.py @@ -22,7 +22,8 @@ def __init__(self, node): class CycleError(ValueError): - """Subclass of ValueError raised by TopologicalSorterif cycles exist in the graph + """Subclass of ValueError raised by TopologicalSorter.prepare if cycles + exist in the working graph. If multiple cycles exist, only one undefined choice among them will be reported and included in the exception. The detected cycle can be accessed via the second @@ -129,7 +130,7 @@ def get_ready(self): return result def is_active(self): - """Return True if more progress can be made and ``False`` otherwise. + """Return ``True`` if more progress can be made and ``False`` otherwise. Progress can be made if cycles do not block the resolution and either there are still nodes ready that haven't yet been returned by "get_ready" or the @@ -149,7 +150,7 @@ def done(self, *nodes): """Marks a set of nodes returned by "get_ready" as processed. This method unblocks any successor of each node in *nodes* for being returned - in the future by a a call to "get_ready" + in the future by a call to "get_ready". Raises :exec:`ValueError` if any node in *nodes* has already been marked as processed by a previous call to this method, if a node was not added to the From 78a42b8c7e7326a889534f05d8333cc4ee6fcfdd Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Mon, 12 Oct 2020 12:10:42 -0700 Subject: [PATCH 0254/1261] Delete PyGen_Send (#22663) --- Doc/c-api/gen.rst | 10 ---------- Doc/data/refcounts.dat | 5 ----- Doc/whatsnew/3.10.rst | 2 +- Include/genobject.h | 9 --------- Misc/NEWS.d/3.10.0a1.rst | 10 ---------- Objects/abstract.c | 25 ------------------------- Objects/genobject.c | 24 ++++++++++++++++++++---- 7 files changed, 21 insertions(+), 64 deletions(-) diff --git a/Doc/c-api/gen.rst b/Doc/c-api/gen.rst index 600f53486f79d5..74410927bfde10 100644 --- a/Doc/c-api/gen.rst +++ b/Doc/c-api/gen.rst @@ -42,13 +42,3 @@ than explicitly calling :c:func:`PyGen_New` or :c:func:`PyGen_NewWithQualName`. with ``__name__`` and ``__qualname__`` set to *name* and *qualname*. A reference to *frame* is stolen by this function. The *frame* argument must not be ``NULL``. - -.. c:function:: PySendResult PyGen_Send(PyGenObject *gen, PyObject *arg, PyObject **presult) - - Sends the *arg* value into the generator *gen*. Coroutine objects - are also allowed to be as the *gen* argument but they need to be - explicitly casted to PyGenObject*. Returns: - - - ``PYGEN_RETURN`` if generator returns. Return value is returned via *presult*. - - ``PYGEN_NEXT`` if generator yields. Yielded value is returned via *presult*. - - ``PYGEN_ERROR`` if generator has raised and exception. *presult* is set to ``NULL``. diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index 87ce5d03d00644..d01e99ca5e3191 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -959,11 +959,6 @@ PyGen_NewWithQualName:PyFrameObject*:frame:0: PyGen_NewWithQualName:PyObject*:name:0: PyGen_NewWithQualName:PyObject*:qualname:0: -PyGen_Send:int::: -PyGen_Send:PyGenObject*:gen:0: -PyGen_Send:PyObject*:arg:0: -PyGen_Send:PyObject**:presult:+1: - PyCoro_CheckExact:int::: PyCoro_CheckExact:PyObject*:ob:0: diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 1c50978a8b7501..c8ddcd2d24296e 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -314,7 +314,7 @@ New Features search function. (Contributed by Hai Shi in :issue:`41842`.) -* The :c:func:`PyIter_Send` and :c:func:`PyGen_Send` functions were added to allow +* The :c:func:`PyIter_Send` function was added to allow sending value into iterator without raising ``StopIteration`` exception. (Contributed by Vladimir Matveev in :issue:`41756`.) diff --git a/Include/genobject.h b/Include/genobject.h index e719b25a800729..e965334a0140c8 100644 --- a/Include/genobject.h +++ b/Include/genobject.h @@ -45,15 +45,6 @@ PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **); PyObject *_PyGen_yf(PyGenObject *); PyAPI_FUNC(void) _PyGen_Finalize(PyObject *self); -/* Sends the value into the generator or the coroutine. Returns: - - PYGEN_RETURN (0) if generator has returned. - 'result' parameter is filled with return value - - PYGEN_ERROR (-1) if exception was raised. - 'result' parameter is NULL - - PYGEN_NEXT (1) if generator has yielded. - 'result' parameter is filled with yielded value. */ -PyAPI_FUNC(PySendResult) PyGen_Send(PyGenObject *, PyObject *, PyObject **); - #ifndef Py_LIMITED_API typedef struct { _PyGenObject_HEAD(cr) diff --git a/Misc/NEWS.d/3.10.0a1.rst b/Misc/NEWS.d/3.10.0a1.rst index 725dfd16b180a7..044bd20594cc37 100644 --- a/Misc/NEWS.d/3.10.0a1.rst +++ b/Misc/NEWS.d/3.10.0a1.rst @@ -133,16 +133,6 @@ Port the :mod:`_lsprof` extension module to multi-phase initialization .. -.. bpo: 41756 -.. date: 2020-09-12-12-55-45 -.. nonce: 1h0tbV -.. section: Core and Builtins - -Add PyGen_Send function to allow sending value into generator/coroutine -without raising StopIteration exception to signal return - -.. - .. bpo: 1635741 .. date: 2020-09-08-21-58-47 .. nonce: vdjSLH diff --git a/Objects/abstract.c b/Objects/abstract.c index 502a2d64e25e11..562549876beed8 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2669,31 +2669,6 @@ PyIter_Next(PyObject *iter) return result; } -PySendResult -PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result) -{ - _Py_IDENTIFIER(send); - assert(result != NULL); - - if (PyGen_CheckExact(iter) || PyCoro_CheckExact(iter)) { - return PyGen_Send((PyGenObject *)iter, arg, result); - } - - if (arg == Py_None && PyIter_Check(iter)) { - *result = Py_TYPE(iter)->tp_iternext(iter); - } - else { - *result = _PyObject_CallMethodIdOneArg(iter, &PyId_send, arg); - } - if (*result != NULL) { - return PYGEN_NEXT; - } - if (_PyGen_FetchStopIterationValue(result) == 0) { - return PYGEN_RETURN; - } - return PYGEN_ERROR; -} - /* * Flatten a sequence of bytes() objects into a C array of * NULL terminated string pointers with a NULL char* terminating the array. diff --git a/Objects/genobject.c b/Objects/genobject.c index eb134ebf4bc878..c1b26e9da33bea 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -269,13 +269,29 @@ gen_send_ex2(PyGenObject *gen, PyObject *arg, PyObject **presult, } PySendResult -PyGen_Send(PyGenObject *gen, PyObject *arg, PyObject **result) +PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result) { - assert(PyGen_CheckExact(gen) || PyCoro_CheckExact(gen)); - assert(result != NULL); + _Py_IDENTIFIER(send); assert(arg != NULL); + assert(result != NULL); + + if (PyGen_CheckExact(iter) || PyCoro_CheckExact(iter)) { + return gen_send_ex2((PyGenObject *)iter, arg, result, 0, 0); + } - return gen_send_ex2(gen, arg, result, 0, 0); + if (arg == Py_None && PyIter_Check(iter)) { + *result = Py_TYPE(iter)->tp_iternext(iter); + } + else { + *result = _PyObject_CallMethodIdOneArg(iter, &PyId_send, arg); + } + if (*result != NULL) { + return PYGEN_NEXT; + } + if (_PyGen_FetchStopIterationValue(result) == 0) { + return PYGEN_RETURN; + } + return PYGEN_ERROR; } static PyObject * From 21448b3ec2beba3f12eea0209f68beb1780181b3 Mon Sep 17 00:00:00 2001 From: Yannick Jadoul Date: Mon, 12 Oct 2020 23:06:19 +0200 Subject: [PATCH 0255/1261] bpo-42015: Reorder dereferencing calls in meth_dealloc, to make sure m_self is kept alive long enough (GH-22670) --- .../next/C API/2020-10-12-20-13-58.bpo-42015.X4H2_V.rst | 3 +++ Objects/methodobject.c | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-10-12-20-13-58.bpo-42015.X4H2_V.rst diff --git a/Misc/NEWS.d/next/C API/2020-10-12-20-13-58.bpo-42015.X4H2_V.rst b/Misc/NEWS.d/next/C API/2020-10-12-20-13-58.bpo-42015.X4H2_V.rst new file mode 100644 index 00000000000000..d77619f64bb178 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-12-20-13-58.bpo-42015.X4H2_V.rst @@ -0,0 +1,3 @@ +Fix potential crash in deallocating method objects when dynamically +allocated `PyMethodDef`'s lifetime is managed through the ``self`` +argument of a `PyCFunction`. diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 5659f2143d1823..7b430416c5a048 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -164,9 +164,11 @@ meth_dealloc(PyCFunctionObject *m) if (m->m_weakreflist != NULL) { PyObject_ClearWeakRefs((PyObject*) m); } + // Dereference class before m_self: PyCFunction_GET_CLASS accesses + // PyMethodDef m_ml, which could be kept alive by m_self + Py_XDECREF(PyCFunction_GET_CLASS(m)); Py_XDECREF(m->m_self); Py_XDECREF(m->m_module); - Py_XDECREF(PyCFunction_GET_CLASS(m)); PyObject_GC_Del(m); } @@ -243,9 +245,9 @@ meth_get__qualname__(PyCFunctionObject *m, void *closure) static int meth_traverse(PyCFunctionObject *m, visitproc visit, void *arg) { + Py_VISIT(PyCFunction_GET_CLASS(m)); Py_VISIT(m->m_self); Py_VISIT(m->m_module); - Py_VISIT(PyCFunction_GET_CLASS(m)); return 0; } From 8f927c0f41f5bd5d4be59fa5ce775bc06cb535d0 Mon Sep 17 00:00:00 2001 From: Saiyang Gou Date: Mon, 12 Oct 2020 16:34:33 -0700 Subject: [PATCH 0256/1261] Fix typo in "Context manager types" section in typing.rst (GH-22676) Fix typo in the "Context manager types" section in `typing.rst`. Automerge-Triggered-By: @gvanrossum --- Doc/library/typing.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 6111603a995c58..5fb78bbde69b1c 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1478,7 +1478,7 @@ Context manager types .. versionadded:: 3.6.0 .. deprecated:: 3.9 - :class:`collections.contextlib.AbstractContextManager` now supports ``[]``. See :pep:`585`. + :class:`contextlib.AbstractContextManager` now supports ``[]``. See :pep:`585`. .. class:: AsyncContextManager(Generic[T_co]) @@ -1488,7 +1488,7 @@ Context manager types .. versionadded:: 3.6.2 .. deprecated:: 3.9 - :class:`collections.contextlib.AbstractAsyncContextManager` now supports ``[]``. See :pep:`585`. + :class:`contextlib.AbstractAsyncContextManager` now supports ``[]``. See :pep:`585`. Protocols --------- From 1db31e78f659b78c46d748c3e55b4aedc0e7e784 Mon Sep 17 00:00:00 2001 From: Kyle Evans Date: Mon, 12 Oct 2020 18:53:16 -0500 Subject: [PATCH 0257/1261] bpo-40422: Move _Py_*_SUPPRESS_IPH bits into _Py_closerange (GH-22672) This suppression is no longer needed in os_closerange_impl, as it just invokes the internal _Py_closerange implementation. On the other hand, consumers of _Py_closerange may not have any other reason to suppress invalid parameter issues, so narrow the scope to here. --- Modules/posixmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 2e0caaa3e561ba..de81db8b84fe12 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8782,6 +8782,7 @@ void _Py_closerange(int first, int last) { first = Py_MAX(first, 0); + _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_CLOSE_RANGE if (close_range(first, last, 0) == 0 || errno != ENOSYS) { /* Any errors encountered while closing file descriptors are ignored; @@ -8812,6 +8813,7 @@ _Py_closerange(int first, int last) } } #endif /* USE_FDWALK */ + _Py_END_SUPPRESS_IPH } /*[clinic input] @@ -8829,9 +8831,7 @@ os_closerange_impl(PyObject *module, int fd_low, int fd_high) /*[clinic end generated code: output=0ce5c20fcda681c2 input=5855a3d053ebd4ec]*/ { Py_BEGIN_ALLOW_THREADS - _Py_BEGIN_SUPPRESS_IPH _Py_closerange(fd_low, fd_high - 1); - _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS Py_RETURN_NONE; } From 721762117bac5e8621c74f659d46e0f75e60fe1c Mon Sep 17 00:00:00 2001 From: Yunlongs Date: Tue, 13 Oct 2020 14:46:31 +0800 Subject: [PATCH 0258/1261] bpo-41995: Fix null ptr deref in tracemalloc_copy_trace() (GH-22660) Fix a null pointer dereference in tracemalloc_copy_trace() of _tracemalloc. --- Modules/_tracemalloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c index fc91622d3925b8..04f6c243b5ca4d 100644 --- a/Modules/_tracemalloc.c +++ b/Modules/_tracemalloc.c @@ -1199,7 +1199,7 @@ tracemalloc_copy_trace(_Py_hashtable_t *traces, trace_t *trace = (trace_t *)value; trace_t *trace2 = raw_malloc(sizeof(trace_t)); - if (traces2 == NULL) { + if (trace2 == NULL) { return -1; } *trace2 = *trace; From 2397f856f2b3f20748bd915dc3a4fcb5afb4e328 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Tue, 13 Oct 2020 10:26:51 -0700 Subject: [PATCH 0259/1261] bpo-41756: Export PyGen_Send and wrap it in if-defs (#22677) --- Doc/c-api/iter.rst | 4 ++++ Include/abstract.h | 2 ++ PC/python3dll.c | 1 + 3 files changed, 7 insertions(+) diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst index a068a43c86b6c3..68df6f6e89f513 100644 --- a/Doc/c-api/iter.rst +++ b/Doc/c-api/iter.rst @@ -50,6 +50,8 @@ something like this:: The enum value used to represent different results of :c:func:`PyIter_Send`. + .. versionadded:: 3.10 + .. c:function:: PySendResult PyIter_Send(PyObject *iter, PyObject *arg, PyObject **presult) @@ -58,3 +60,5 @@ something like this:: - ``PYGEN_RETURN`` if iterator returns. Return value is returned via *presult*. - ``PYGEN_NEXT`` if iterator yields. Yielded value is returned via *presult*. - ``PYGEN_ERROR`` if iterator has raised and exception. *presult* is set to ``NULL``. + + .. versionadded:: 3.10 diff --git a/Include/abstract.h b/Include/abstract.h index 716cd4b5ebbba3..28e576b92935f9 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -338,6 +338,7 @@ PyAPI_FUNC(int) PyIter_Check(PyObject *); NULL with an exception means an error occurred. */ PyAPI_FUNC(PyObject *) PyIter_Next(PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 typedef enum { PYGEN_RETURN = 0, PYGEN_ERROR = -1, @@ -353,6 +354,7 @@ typedef enum { - PYGEN_NEXT (1) if generator has yielded. 'result' parameter is filled with yielded value. */ PyAPI_FUNC(PySendResult) PyIter_Send(PyObject *, PyObject *, PyObject **); +#endif /* === Number Protocol ================================================== */ diff --git a/PC/python3dll.c b/PC/python3dll.c index ff69ea7ca5efaa..153ba612b7804f 100644 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -287,6 +287,7 @@ EXPORT_FUNC(PyInterpreterState_GetID) EXPORT_FUNC(PyInterpreterState_New) EXPORT_FUNC(PyIter_Check) EXPORT_FUNC(PyIter_Next) +EXPORT_FUNC(PyIter_Send) EXPORT_FUNC(PyList_Append) EXPORT_FUNC(PyList_AsTuple) EXPORT_FUNC(PyList_GetItem) From 0b6ad007df3c048e82bb0d55014179c6c44658c1 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 13 Oct 2020 11:54:21 -0700 Subject: [PATCH 0260/1261] Add recipe for a version of random() with a larger population (GH-22664) --- Doc/library/random.rst | 55 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index af5131df280c24..c19a8e0a7cb5ba 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -391,8 +391,8 @@ change across Python versions, but two aspects are guaranteed not to change: .. _random-examples: -Examples and Recipes --------------------- +Examples +-------- Basic examples:: @@ -516,6 +516,52 @@ Simulation of arrival times and service deliveries for a multiserver queue:: print(f'Mean wait: {mean(waits):.1f} Max wait: {max(waits):.1f}') print('Quartiles:', [round(q, 1) for q in quantiles(waits)]) +Recipes +------- + +The default :func:`.random` returns multiples of 2⁻⁵³ in the range +*0.0 ≤ x < 1.0*. All such numbers are evenly spaced and exactly +representable as Python floats. However, many floats in that interval +are not possible selections. For example, ``0.05954861408025609`` +isn't an integer multiple of 2⁻⁵³. + +The following recipe takes a different approach. All floats in the +interval are possible selections. Conceptually it works by choosing +from evenly spaced multiples of 2⁻¹⁰⁷⁴ and then rounding down to the +nearest representable float. + +For efficiency, the actual mechanics involve calling +:func:`~math.ldexp` to construct a representable float. The mantissa +comes from a uniform distribution of integers in the range *2⁵² ≤ +mantissa < 2⁵³*. The exponent comes from a geometric distribution +where exponents smaller than *-53* occur half as often as the next +larger exponent. + +:: + + from random import Random + from math import ldexp + + class FullRandom(Random): + + def random(self): + mantissa = 0x10_0000_0000_0000 | self.getrandbits(52) + exponent = -53 + x = 0 + while not x: + x = self.getrandbits(32) + exponent += x.bit_length() - 32 + return ldexp(mantissa, exponent) + +All of the real valued distributions will use the new method:: + + >>> fr = FullRandom() + >>> fr.random() + 0.05954861408025609 + >>> fr.expovariate(0.25) + 8.87925541791544 + + .. seealso:: `Statistics for Hackers `_ @@ -536,3 +582,8 @@ Simulation of arrival times and service deliveries for a multiserver queue:: a tutorial by `Peter Norvig `_ covering the basics of probability theory, how to write simulations, and how to perform data analysis using Python. + + `Generating Pseudo-random Floating-Point Values + `_ a + paper by Allen B. Downey describing ways to generate more + fine-grained floats than normally generated by :func:`.random`. From 68f67f5540b3318eeedb6dbae916bbc4aece2eba Mon Sep 17 00:00:00 2001 From: Kyle Evans Date: Tue, 13 Oct 2020 15:04:44 -0500 Subject: [PATCH 0261/1261] bpo-40422: Move _Py_closerange to fileutils.c (GH-22680) This API is relatively lightweight and organizationally, given that it's used by multiple modules, it makes sense to move it to fileutils. Requires making sure that _posixsubprocess is compiled with the appropriate Py_BUIILD_CORE_BUILTIN macro. --- Include/internal/pycore_fileutils.h | 2 + Modules/Setup | 2 +- Modules/_posixsubprocess.c | 1 + Modules/posixmodule.c | 77 +---------------------------- Modules/posixmodule.h | 2 - Python/fileutils.c | 76 ++++++++++++++++++++++++++++ setup.py | 3 +- 7 files changed, 83 insertions(+), 80 deletions(-) diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index bbee58617fd05e..9cb5fc66ee2e03 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -48,6 +48,8 @@ PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( PyObject **decimal_point, PyObject **thousands_sep); +PyAPI_FUNC(void) _Py_closerange(int first, int last); + #ifdef __cplusplus } #endif diff --git a/Modules/Setup b/Modules/Setup index 470bf6bc2efbf5..87f3a7cb43a025 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -226,7 +226,7 @@ _symtable symtablemodule.c #termios termios.c # Steen Lumholt's termios module #resource resource.c # Jeremy Hylton's rlimit interface -#_posixsubprocess _posixsubprocess.c # POSIX subprocess module helper +#_posixsubprocess -DPy_BUILD_CORE_BUILTIN _posixsubprocess.c # POSIX subprocess module helper # Multimedia modules -- off by default. # These don't work for 64-bit platforms!!! diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index ed046fc5c1ba9f..d08c47980e9c6a 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -1,5 +1,6 @@ /* Authors: Gregory P. Smith & Jeffrey Yasskin */ #include "Python.h" +#include "pycore_fileutils.h" #if defined(HAVE_PIPE2) && !defined(_GNU_SOURCE) # define _GNU_SOURCE #endif diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index de81db8b84fe12..6ce0bcb9fe8ca4 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -22,6 +22,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_fileutils.h" #ifdef MS_WINDOWS /* include early to avoid conflict with pycore_condvar.h: @@ -8740,82 +8741,6 @@ os_close_impl(PyObject *module, int fd) Py_RETURN_NONE; } -/* Our selection logic for which function to use is as follows: - * 1. If close_range(2) is available, always prefer that; it's better for - * contiguous ranges like this than fdwalk(3) which entails iterating over - * the entire fd space and simply doing nothing for those outside the range. - * 2. If closefrom(2) is available, we'll attempt to use that next if we're - * closing up to sysconf(_SC_OPEN_MAX). - * 2a. Fallback to fdwalk(3) if we're not closing up to sysconf(_SC_OPEN_MAX), - * as that will be more performant if the range happens to have any chunk of - * non-opened fd in the middle. - * 2b. If fdwalk(3) isn't available, just do a plain close(2) loop. - */ -#ifdef __FreeBSD__ -#define USE_CLOSEFROM -#endif /* __FreeBSD__ */ - -#ifdef HAVE_FDWALK -#define USE_FDWALK -#endif /* HAVE_FDWALK */ - -#ifdef USE_FDWALK -static int -_fdwalk_close_func(void *lohi, int fd) -{ - int lo = ((int *)lohi)[0]; - int hi = ((int *)lohi)[1]; - - if (fd >= hi) { - return 1; - } - else if (fd >= lo) { - /* Ignore errors */ - (void)close(fd); - } - return 0; -} -#endif /* USE_FDWALK */ - -/* Closes all file descriptors in [first, last], ignoring errors. */ -void -_Py_closerange(int first, int last) -{ - first = Py_MAX(first, 0); - _Py_BEGIN_SUPPRESS_IPH -#ifdef HAVE_CLOSE_RANGE - if (close_range(first, last, 0) == 0 || errno != ENOSYS) { - /* Any errors encountered while closing file descriptors are ignored; - * ENOSYS means no kernel support, though, - * so we'll fallback to the other methods. */ - } - else -#endif /* HAVE_CLOSE_RANGE */ -#ifdef USE_CLOSEFROM - if (last >= sysconf(_SC_OPEN_MAX)) { - /* Any errors encountered while closing file descriptors are ignored */ - closefrom(first); - } - else -#endif /* USE_CLOSEFROM */ -#ifdef USE_FDWALK - { - int lohi[2]; - lohi[0] = first; - lohi[1] = last + 1; - fdwalk(_fdwalk_close_func, lohi); - } -#else - { - for (int i = first; i <= last; i++) { - /* Ignore errors */ - (void)close(i); - } - } -#endif /* USE_FDWALK */ - _Py_END_SUPPRESS_IPH -} - /*[clinic input] os.closerange diff --git a/Modules/posixmodule.h b/Modules/posixmodule.h index 749833f71cd4de..1e00562abc3370 100644 --- a/Modules/posixmodule.h +++ b/Modules/posixmodule.h @@ -28,8 +28,6 @@ PyAPI_FUNC(int) _Py_Sigset_Converter(PyObject *, void *); #endif /* HAVE_SIGSET_T */ #endif /* Py_LIMITED_API */ -PyAPI_FUNC(void) _Py_closerange(int first, int last); - #ifdef __cplusplus } #endif diff --git a/Python/fileutils.c b/Python/fileutils.c index 50ef3c174acc84..b79067f2b5d38b 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -2106,3 +2106,79 @@ _Py_GetLocaleconvNumeric(struct lconv *lc, PyMem_Free(oldloc); return res; } + +/* Our selection logic for which function to use is as follows: + * 1. If close_range(2) is available, always prefer that; it's better for + * contiguous ranges like this than fdwalk(3) which entails iterating over + * the entire fd space and simply doing nothing for those outside the range. + * 2. If closefrom(2) is available, we'll attempt to use that next if we're + * closing up to sysconf(_SC_OPEN_MAX). + * 2a. Fallback to fdwalk(3) if we're not closing up to sysconf(_SC_OPEN_MAX), + * as that will be more performant if the range happens to have any chunk of + * non-opened fd in the middle. + * 2b. If fdwalk(3) isn't available, just do a plain close(2) loop. + */ +#ifdef __FreeBSD__ +# define USE_CLOSEFROM +#endif /* __FreeBSD__ */ + +#ifdef HAVE_FDWALK +# define USE_FDWALK +#endif /* HAVE_FDWALK */ + +#ifdef USE_FDWALK +static int +_fdwalk_close_func(void *lohi, int fd) +{ + int lo = ((int *)lohi)[0]; + int hi = ((int *)lohi)[1]; + + if (fd >= hi) { + return 1; + } + else if (fd >= lo) { + /* Ignore errors */ + (void)close(fd); + } + return 0; +} +#endif /* USE_FDWALK */ + +/* Closes all file descriptors in [first, last], ignoring errors. */ +void +_Py_closerange(int first, int last) +{ + first = Py_MAX(first, 0); + _Py_BEGIN_SUPPRESS_IPH +#ifdef HAVE_CLOSE_RANGE + if (close_range(first, last, 0) == 0 || errno != ENOSYS) { + /* Any errors encountered while closing file descriptors are ignored; + * ENOSYS means no kernel support, though, + * so we'll fallback to the other methods. */ + } + else +#endif /* HAVE_CLOSE_RANGE */ +#ifdef USE_CLOSEFROM + if (last >= sysconf(_SC_OPEN_MAX)) { + /* Any errors encountered while closing file descriptors are ignored */ + closefrom(first); + } + else +#endif /* USE_CLOSEFROM */ +#ifdef USE_FDWALK + { + int lohi[2]; + lohi[0] = first; + lohi[1] = last + 1; + fdwalk(_fdwalk_close_func, lohi); + } +#else + { + for (int i = first; i <= last; i++) { + /* Ignore errors */ + (void)close(i); + } + } +#endif /* USE_FDWALK */ + _Py_END_SUPPRESS_IPH +} diff --git a/setup.py b/setup.py index 476f8c414978ea..d3fd7bca6438af 100644 --- a/setup.py +++ b/setup.py @@ -950,7 +950,8 @@ def detect_simple_extensions(self): self.add(Extension('_csv', ['_csv.c'])) # POSIX subprocess module helper. - self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'])) + self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) def detect_test_extensions(self): # Python C API test module From f03261676726a9753a407e1ae4a11b71d3cbcf71 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 13 Oct 2020 16:41:26 -0700 Subject: [PATCH 0262/1261] Improve recipe readability (GH-22685) --- Doc/library/random.rst | 68 +++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index c19a8e0a7cb5ba..635f9e1c032da3 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -253,6 +253,8 @@ Functions for sequences order so that the sample is reproducible. +.. _real-valued-distributions: + Real-valued distributions ------------------------- @@ -516,26 +518,42 @@ Simulation of arrival times and service deliveries for a multiserver queue:: print(f'Mean wait: {mean(waits):.1f} Max wait: {max(waits):.1f}') print('Quartiles:', [round(q, 1) for q in quantiles(waits)]) +.. seealso:: + + `Statistics for Hackers `_ + a video tutorial by + `Jake Vanderplas `_ + on statistical analysis using just a few fundamental concepts + including simulation, sampling, shuffling, and cross-validation. + + `Economics Simulation + `_ + a simulation of a marketplace by + `Peter Norvig `_ that shows effective + use of many of the tools and distributions provided by this module + (gauss, uniform, sample, betavariate, choice, triangular, and randrange). + + `A Concrete Introduction to Probability (using Python) + `_ + a tutorial by `Peter Norvig `_ covering + the basics of probability theory, how to write simulations, and + how to perform data analysis using Python. + + Recipes ------- The default :func:`.random` returns multiples of 2⁻⁵³ in the range -*0.0 ≤ x < 1.0*. All such numbers are evenly spaced and exactly +*0.0 ≤ x < 1.0*. All such numbers are evenly spaced and are exactly representable as Python floats. However, many floats in that interval are not possible selections. For example, ``0.05954861408025609`` isn't an integer multiple of 2⁻⁵³. The following recipe takes a different approach. All floats in the -interval are possible selections. Conceptually it works by choosing -from evenly spaced multiples of 2⁻¹⁰⁷⁴ and then rounding down to the -nearest representable float. - -For efficiency, the actual mechanics involve calling -:func:`~math.ldexp` to construct a representable float. The mantissa -comes from a uniform distribution of integers in the range *2⁵² ≤ -mantissa < 2⁵³*. The exponent comes from a geometric distribution -where exponents smaller than *-53* occur half as often as the next -larger exponent. +interval are possible selections. The mantissa comes from a uniform +distribution of integers in the range *2⁵² ≤ mantissa < 2⁵³*. The +exponent comes from a geometric distribution where exponents smaller +than *-53* occur half as often as the next larger exponent. :: @@ -553,7 +571,8 @@ larger exponent. exponent += x.bit_length() - 32 return ldexp(mantissa, exponent) -All of the real valued distributions will use the new method:: +All :ref:`real valued distributions ` +in the class will use the new method:: >>> fr = FullRandom() >>> fr.random() @@ -561,27 +580,14 @@ All of the real valued distributions will use the new method:: >>> fr.expovariate(0.25) 8.87925541791544 +The recipe is conceptually equivalent to an algorithm that chooses from +all the multiples of 2⁻¹⁰⁷⁴ in the range *0.0 ≤ x < 1.0*. All such +numbers are evenly spaced, but most have to be rounded down to the +nearest representable Python float. (The value 2⁻¹⁰⁷⁴ is the smallest +positive unnormalized float and is equal to ``math.ulp(0.0)``.) -.. seealso:: - - `Statistics for Hackers `_ - a video tutorial by - `Jake Vanderplas `_ - on statistical analysis using just a few fundamental concepts - including simulation, sampling, shuffling, and cross-validation. - - `Economics Simulation - `_ - a simulation of a marketplace by - `Peter Norvig `_ that shows effective - use of many of the tools and distributions provided by this module - (gauss, uniform, sample, betavariate, choice, triangular, and randrange). - `A Concrete Introduction to Probability (using Python) - `_ - a tutorial by `Peter Norvig `_ covering - the basics of probability theory, how to write simulations, and - how to perform data analysis using Python. +.. seealso:: `Generating Pseudo-random Floating-Point Values `_ a From 4b34ffc4ab0b072c9a6c57f35c70d83dbf0cb9f8 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 13 Oct 2020 21:38:56 -0400 Subject: [PATCH 0263/1261] bpo-41939: always enable test_site.test_license_exists_at_url (GH-22688) --- Lib/test/test_site.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index a475ed1ab4c469..2e70880f56d141 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -516,8 +516,6 @@ def test_sitecustomize_executed(self): @test.support.requires_resource('network') @test.support.system_must_validate_cert - @unittest.skipUnless(sys.version_info[3] == 'final', - 'only for released versions') @unittest.skipUnless(hasattr(urllib.request, "HTTPSHandler"), 'need SSL support to download license') def test_license_exists_at_url(self): From b20a7c1d38d417979a6642555fc5278b8b94cbd4 Mon Sep 17 00:00:00 2001 From: Kevin Adler Date: Tue, 13 Oct 2020 20:49:24 -0500 Subject: [PATCH 0264/1261] closes bpo-42029: Remove dynload_dl (GH-22687) All references to this dynamic loading method were removed in b9949db, when support for this method was dropped, but the implementation code was not dropped (seemingly in oversight). --- Python/dynload_dl.c | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 Python/dynload_dl.c diff --git a/Python/dynload_dl.c b/Python/dynload_dl.c deleted file mode 100644 index 2bec645fbd7aff..00000000000000 --- a/Python/dynload_dl.c +++ /dev/null @@ -1,23 +0,0 @@ - -/* Support for dynamic loading of extension modules */ - -#include "dl.h" - -#include "Python.h" -#include "importdl.h" - - -extern char *Py_GetProgramName(void); - -const char *_PyImport_DynLoadFiletab[] = {".o", NULL}; - - -dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix, - const char *shortname, - const char *pathname, FILE *fp) -{ - char funcname[258]; - - PyOS_snprintf(funcname, sizeof(funcname), "%.20s_%.200s", prefix, shortname); - return dl_loadmod(Py_GetProgramName(), pathname, funcname); -} From 138b451f04c6c7c9283b955ffaa495a5d0fef375 Mon Sep 17 00:00:00 2001 From: Anatoliy Platonov <31926941+p4m-dev@users.noreply.github.com> Date: Wed, 14 Oct 2020 13:02:51 +0300 Subject: [PATCH 0265/1261] bpo-41876: Overload __repr__ for tkinter Font objects (GH-22450) --- Lib/tkinter/font.py | 4 ++++ Lib/tkinter/test/test_tkinter/test_font.py | 6 ++++++ Misc/ACKS | 1 + .../next/Library/2020-09-29-16-23-54.bpo-41876.QicdDU.rst | 1 + 4 files changed, 12 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-09-29-16-23-54.bpo-41876.QicdDU.rst diff --git a/Lib/tkinter/font.py b/Lib/tkinter/font.py index 15ad7ab4b63a81..a9f79d8e456bb7 100644 --- a/Lib/tkinter/font.py +++ b/Lib/tkinter/font.py @@ -100,6 +100,10 @@ def __init__(self, root=None, font=None, name=None, exists=False, def __str__(self): return self.name + def __repr__(self): + return f"<{self.__class__.__module__}.{self.__class__.__qualname__}" \ + f" object {self.name!r}>" + def __eq__(self, other): if not isinstance(other, Font): return NotImplemented diff --git a/Lib/tkinter/test/test_tkinter/test_font.py b/Lib/tkinter/test/test_tkinter/test_font.py index a021ea336807bb..6d1eea44b4d2f3 100644 --- a/Lib/tkinter/test/test_tkinter/test_font.py +++ b/Lib/tkinter/test/test_tkinter/test_font.py @@ -101,6 +101,12 @@ def test_names(self): self.assertTrue(name) self.assertIn(fontname, names) + def test_repr(self): + self.assertEqual( + repr(self.font), f'' + ) + + tests_gui = (FontTest, ) if __name__ == "__main__": diff --git a/Misc/ACKS b/Misc/ACKS index 660b8ef7504eeb..7f4a9bcbc0f8cd 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1353,6 +1353,7 @@ Zero Piraeus Antoine Pitrou Jean-François Piéronne Oleg Plakhotnyuk +Anatoliy Platonov Marcel Plch Remi Pointel Jon Poler diff --git a/Misc/NEWS.d/next/Library/2020-09-29-16-23-54.bpo-41876.QicdDU.rst b/Misc/NEWS.d/next/Library/2020-09-29-16-23-54.bpo-41876.QicdDU.rst new file mode 100644 index 00000000000000..d4f5f0a37bf484 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-29-16-23-54.bpo-41876.QicdDU.rst @@ -0,0 +1 @@ +Tkinter font class repr uses font name \ No newline at end of file From 5959a198f2d47417dd45928546c9db28048ddf6b Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Wed, 14 Oct 2020 23:43:31 +0800 Subject: [PATCH 0266/1261] bpo-39337: encodings.normalize_encoding() now ignores non-ASCII characters (GH-22219) --- Doc/whatsnew/3.10.rst | 5 +++++ Lib/encodings/__init__.py | 3 ++- Lib/test/test_codecs.py | 14 +++++++++++++- .../2020-09-13-02-02-18.bpo-39337.L3NXTt.rst | 1 + 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-13-02-02-18.bpo-39337.L3NXTt.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index c8ddcd2d24296e..738ef974e7867b 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -186,6 +186,11 @@ by :func:`curses.color_content`, :func:`curses.init_color`, support is provided by the underlying ncurses library. (Contributed by Jeffrey Kintscher and Hans Petter Jansson in :issue:`36982`.) +encodings +--------- +:func:`encodings.normalize_encoding` now ignores non-ASCII characters. +(Contributed by Hai Shi in :issue:`39337`.) + glob ---- diff --git a/Lib/encodings/__init__.py b/Lib/encodings/__init__.py index ddd5afdcf2dab0..4b37d3321c9033 100644 --- a/Lib/encodings/__init__.py +++ b/Lib/encodings/__init__.py @@ -61,7 +61,8 @@ def normalize_encoding(encoding): if c.isalnum() or c == '.': if punct and chars: chars.append('_') - chars.append(c) + if c.isascii(): + chars.append(c) punct = False else: punct = True diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index ddf4e08af6247a..09ceef76eb098d 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3417,7 +3417,7 @@ def test_rot13_func(self): class CodecNameNormalizationTest(unittest.TestCase): """Test codec name normalization""" - def test_normalized_encoding(self): + def test_codecs_lookup(self): FOUND = (1, 2, 3, 4) NOT_FOUND = (None, None, None, None) def search_function(encoding): @@ -3439,6 +3439,18 @@ def search_function(encoding): self.assertEqual(NOT_FOUND, codecs.lookup('BBB.8')) self.assertEqual(NOT_FOUND, codecs.lookup('a\xe9\u20ac-8')) + def test_encodings_normalize_encoding(self): + # encodings.normalize_encoding() ignores non-ASCII characters. + normalize = encodings.normalize_encoding + self.assertEqual(normalize('utf_8'), 'utf_8') + self.assertEqual(normalize('utf\xE9\u20AC\U0010ffff-8'), 'utf_8') + self.assertEqual(normalize('utf 8'), 'utf_8') + # encodings.normalize_encoding() doesn't convert + # characters to lower case. + self.assertEqual(normalize('UTF 8'), 'UTF_8') + self.assertEqual(normalize('utf.8'), 'utf.8') + self.assertEqual(normalize('utf...8'), 'utf...8') + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-09-13-02-02-18.bpo-39337.L3NXTt.rst b/Misc/NEWS.d/next/Library/2020-09-13-02-02-18.bpo-39337.L3NXTt.rst new file mode 100644 index 00000000000000..c2b4dbe4d12e8e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-13-02-02-18.bpo-39337.L3NXTt.rst @@ -0,0 +1 @@ +:func:`encodings.normalize_encoding` now ignores non-ASCII characters. From 14e018f26b30a8929c7fdd7efd4c9a80704ad9cb Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 14 Oct 2020 10:04:04 -0700 Subject: [PATCH 0267/1261] Update timings for the final release (GH-22697) --- Doc/whatsnew/3.9.rst | 54 ++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 95188b7493ad44..22fdbd565a1667 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -652,41 +652,41 @@ Here's a summary of performance improvements from Python 3.4 through Python 3.9: -------------- --- --- --- --- --- --- Variable and attribute read access: - read_local 7.1 7.1 5.4 5.1 3.9 4.0 - read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8 - read_global 15.5 19.0 14.3 13.6 7.6 7.7 - read_builtin 21.1 21.6 18.5 19.0 7.5 7.7 - read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6 - read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1 - read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7 - read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5 - read_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2 - read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9 + read_local 7.1 7.1 5.4 5.1 3.9 3.9 + read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.5 + read_global 15.5 19.0 14.3 13.6 7.6 7.8 + read_builtin 21.1 21.6 18.5 19.0 7.5 7.8 + read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 17.9 + read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 16.9 + read_instancevar 32.4 33.1 28.0 26.3 25.4 25.3 + read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 20.5 + read_namedtuple 73.8 57.5 45.0 46.8 18.4 18.7 + read_boundmethod 37.6 37.9 29.6 26.9 27.7 41.1 Variable and attribute write access: - write_local 8.7 9.3 5.5 5.3 4.3 4.2 - write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9 - write_global 19.7 21.2 18.0 18.0 15.8 17.2 - write_classvar 92.9 96.0 104.6 102.1 39.2 43.2 - write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7 - write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7 + write_local 8.7 9.3 5.5 5.3 4.3 4.3 + write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.8 + write_global 19.7 21.2 18.0 18.0 15.8 16.7 + write_classvar 92.9 96.0 104.6 102.1 39.2 39.8 + write_instancevar 44.6 45.8 40.0 38.9 35.5 37.4 + write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 25.8 Data structure read access: - read_list 24.2 24.5 20.8 20.8 19.0 21.1 - read_deque 24.7 25.5 20.2 20.6 19.8 21.6 - read_dict 24.3 25.7 22.3 23.0 21.0 22.5 - read_strdict 22.6 24.3 19.5 21.2 18.9 21.6 + read_list 24.2 24.5 20.8 20.8 19.0 19.5 + read_deque 24.7 25.5 20.2 20.6 19.8 20.2 + read_dict 24.3 25.7 22.3 23.0 21.0 22.4 + read_strdict 22.6 24.3 19.5 21.2 18.9 21.5 Data structure write access: - write_list 27.1 28.5 22.5 21.6 20.0 21.6 - write_deque 28.7 30.1 22.7 21.8 23.5 23.2 - write_dict 31.4 33.3 29.3 29.2 24.7 27.8 - write_strdict 28.4 29.9 27.5 25.2 23.1 29.8 + write_list 27.1 28.5 22.5 21.6 20.0 20.0 + write_deque 28.7 30.1 22.7 21.8 23.5 21.7 + write_dict 31.4 33.3 29.3 29.2 24.7 25.4 + write_strdict 28.4 29.9 27.5 25.2 23.1 24.5 Stack (or queue) operations: - list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9 - deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5 - deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5 + list_append_pop 93.4 112.7 75.4 74.2 50.8 50.6 + deque_append_pop 43.5 57.0 49.4 49.2 42.5 44.2 + deque_append_popleft 43.7 57.3 49.7 49.7 42.8 46.4 Timing loop: loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3 From 9005b261bdd2769d5faf6a8558c80e0c698482a2 Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Wed, 14 Oct 2020 18:44:07 -0700 Subject: [PATCH 0268/1261] bpo-41984: GC track all user classes (GH-22701) --- Lib/test/test_finalization.py | 23 +++++++++++++++++-- Lib/test/test_gc.py | 6 ++--- .../2020-10-14-16-19-43.bpo-41984.SEtKMr.rst | 2 ++ Modules/_testcapimodule.c | 20 ++++++++++++++++ Objects/typeobject.c | 22 +++++------------- 5 files changed, 52 insertions(+), 21 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-14-16-19-43.bpo-41984.SEtKMr.rst diff --git a/Lib/test/test_finalization.py b/Lib/test/test_finalization.py index 35d7913e5b89b5..1d134430909d84 100644 --- a/Lib/test/test_finalization.py +++ b/Lib/test/test_finalization.py @@ -16,6 +16,15 @@ def __new__(cls, *args, **kwargs): raise TypeError('requires _testcapi.with_tp_del') return C +try: + from _testcapi import without_gc +except ImportError: + def without_gc(cls): + class C: + def __new__(cls, *args, **kwargs): + raise TypeError('requires _testcapi.without_gc') + return C + from test import support @@ -94,9 +103,11 @@ def check_sanity(self): assert self.id_ == id(self) +@without_gc class NonGC(NonGCSimpleBase): __slots__ = () +@without_gc class NonGCResurrector(NonGCSimpleBase): __slots__ = () @@ -109,8 +120,14 @@ def side_effect(self): class Simple(SimpleBase): pass -class SimpleResurrector(NonGCResurrector, SimpleBase): - pass +# Can't inherit from NonGCResurrector, in case importing without_gc fails. +class SimpleResurrector(SimpleBase): + + def side_effect(self): + """ + Resurrect self by storing self in a class-wide list. + """ + self.survivors.append(self) class TestBase: @@ -178,6 +195,7 @@ def test_simple_resurrect(self): self.assert_survivors([]) self.assertIs(wr(), None) + @support.cpython_only def test_non_gc(self): with SimpleBase.test(): s = NonGC() @@ -191,6 +209,7 @@ def test_non_gc(self): self.assert_del_calls(ids) self.assert_survivors([]) + @support.cpython_only def test_non_gc_resurrect(self): with SimpleBase.test(): s = NonGCResurrector() diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index 1b096efdbcf5fb..ba667370159063 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -582,9 +582,9 @@ class UserIntSlots(int): self.assertTrue(gc.is_tracked(UserInt())) self.assertTrue(gc.is_tracked([])) self.assertTrue(gc.is_tracked(set())) - self.assertFalse(gc.is_tracked(UserClassSlots())) - self.assertFalse(gc.is_tracked(UserFloatSlots())) - self.assertFalse(gc.is_tracked(UserIntSlots())) + self.assertTrue(gc.is_tracked(UserClassSlots())) + self.assertTrue(gc.is_tracked(UserFloatSlots())) + self.assertTrue(gc.is_tracked(UserIntSlots())) def test_is_finalized(self): # Objects not tracked by the always gc return false diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-14-16-19-43.bpo-41984.SEtKMr.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-14-16-19-43.bpo-41984.SEtKMr.rst new file mode 100644 index 00000000000000..e70d5dc2b8ddec --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-14-16-19-43.bpo-41984.SEtKMr.rst @@ -0,0 +1,2 @@ +The garbage collector now tracks all user-defined classes. Patch by Brandt +Bucher. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 8c7544fa90e280..28d2c124d51775 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3888,6 +3888,25 @@ with_tp_del(PyObject *self, PyObject *args) return obj; } +static PyObject * +without_gc(PyObject *Py_UNUSED(self), PyObject *obj) +{ + PyTypeObject *tp = (PyTypeObject*)obj; + if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) { + return PyErr_Format(PyExc_TypeError, "heap type expected, got %R", obj); + } + if (PyType_IS_GC(tp)) { + // Don't try this at home, kids: + tp->tp_flags -= Py_TPFLAGS_HAVE_GC; + tp->tp_free = PyObject_Del; + tp->tp_traverse = NULL; + tp->tp_clear = NULL; + } + assert(!PyType_IS_GC(tp)); + Py_INCREF(obj); + return obj; +} + static PyMethodDef ml; static PyObject * @@ -5805,6 +5824,7 @@ static PyMethodDef TestMethods[] = { {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL}, {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS}, {"pynumber_tobase", pynumber_tobase, METH_VARARGS}, + {"without_gc", without_gc, METH_O}, {NULL, NULL} /* sentinel */ }; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 3bb2c338fe0b53..36c7662e081a40 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2612,10 +2612,10 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) slots = NULL; /* Initialize tp_flags */ + // All heap types need GC, since we can create a reference cycle by storing + // an instance on one of its parents: type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE | - Py_TPFLAGS_BASETYPE; - if (base->tp_flags & Py_TPFLAGS_HAVE_GC) - type->tp_flags |= Py_TPFLAGS_HAVE_GC; + Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC; /* Initialize essential fields */ type->tp_as_async = &et->as_async; @@ -2815,21 +2815,11 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) } type->tp_dealloc = subtype_dealloc; - /* Enable GC unless this class is not adding new instance variables and - the base class did not use GC. */ - if ((base->tp_flags & Py_TPFLAGS_HAVE_GC) || - type->tp_basicsize > base->tp_basicsize) - type->tp_flags |= Py_TPFLAGS_HAVE_GC; - /* Always override allocation strategy to use regular heap */ type->tp_alloc = PyType_GenericAlloc; - if (type->tp_flags & Py_TPFLAGS_HAVE_GC) { - type->tp_free = PyObject_GC_Del; - type->tp_traverse = subtype_traverse; - type->tp_clear = subtype_clear; - } - else - type->tp_free = PyObject_Del; + type->tp_free = PyObject_GC_Del; + type->tp_traverse = subtype_traverse; + type->tp_clear = subtype_clear; /* store type in class' cell if one is supplied */ cell = _PyDict_GetItemIdWithError(dict, &PyId___classcell__); From 640bdaaaa493f665649b79f82e10a18d625eb5d2 Mon Sep 17 00:00:00 2001 From: Kevin Adler Date: Wed, 14 Oct 2020 20:53:27 -0500 Subject: [PATCH 0269/1261] bpo-41894: Fix UnicodeDecodeError while loading native module (GH-22466) When running in a non-UTF-8 locale, if an error occurs while importing a native Python module (say because a dependent share library is missing), the error message string returned may contain non-ASCII code points causing a UnicodeDecodeError. PyUnicode_DecodeFSDefault is used for buffers which may contain filesystem paths. For consistency with os.strerror(), PyUnicode_DecodeLocale is used for buffers which contain system error messages. While the shortname parameter is always encoded in ASCII according to PEP 489, it is left decoded using PyUnicode_FromString to minimize the changes and since it should not affect the decoding (albeit _potentially_ slower). In dynload_hpux, since the error buffer contains a message generated from a static ASCII string and the module filesystem path, PyUnicode_DecodeFSDefault is used instead of PyUnicode_DecodeLocale as is used elsewhere. * bpo-41894: Fix bugs in dynload error msg handling For both dynload_aix and dynload_hpux, properly handle the possibility that decoding strings may return NULL and when such an error happens, properly decrement any previously decoded strings and return early. In addition, in dynload_aix, ensure that we pass the decoded string *object* pathname_ob to PyErr_SetImportError instead of the original pathname buffer. Co-authored-by: Serhiy Storchaka --- .../2020-10-02-11-35-33.bpo-41894.ffmtOt.rst | 3 +++ Python/dynload_aix.c | 14 ++++++++++---- Python/dynload_hpux.c | 15 +++++++++++++-- Python/dynload_shlib.c | 4 ++-- 4 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-02-11-35-33.bpo-41894.ffmtOt.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-02-11-35-33.bpo-41894.ffmtOt.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-02-11-35-33.bpo-41894.ffmtOt.rst new file mode 100644 index 00000000000000..571f5dae1a4a1a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-02-11-35-33.bpo-41894.ffmtOt.rst @@ -0,0 +1,3 @@ +When loading a native module and a load failure occurs, prevent a possible +UnicodeDecodeError when not running in a UTF-8 locale by decoding the load +error message using the current locale's encoding. diff --git a/Python/dynload_aix.c b/Python/dynload_aix.c index 684f10a8b91936..97f7698ef4b2d9 100644 --- a/Python/dynload_aix.c +++ b/Python/dynload_aix.c @@ -144,10 +144,16 @@ aix_loaderror(const char *pathname) ERRBUF_APPEND(message[i]); ERRBUF_APPEND("\n"); } - errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */ - pathname_ob = PyUnicode_FromString(pathname); - errbuf_ob = PyUnicode_FromString(errbuf); - PyErr_SetImportError(errbuf_ob, NULL, pathname); + /* Subtract 1 from the length to trim off trailing newline */ + errbuf_ob = PyUnicode_DecodeLocaleAndSize(errbuf, strlen(errbuf)-1, "surrogateescape"); + if (errbuf_ob == NULL) + return; + pathname_ob = PyUnicode_DecodeFSDefault(pathname); + if (pathname_ob == NULL) { + Py_DECREF(errbuf_ob); + return; + } + PyErr_SetImportError(errbuf_ob, NULL, pathname_ob); Py_DECREF(pathname_ob); Py_DECREF(errbuf_ob); return; diff --git a/Python/dynload_hpux.c b/Python/dynload_hpux.c index 4b964a69d3bde6..e36d608c6dca44 100644 --- a/Python/dynload_hpux.c +++ b/Python/dynload_hpux.c @@ -36,9 +36,20 @@ dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix, char buf[256]; PyOS_snprintf(buf, sizeof(buf), "Failed to load %.200s", pathname); - PyObject *buf_ob = PyUnicode_FromString(buf); + PyObject *buf_ob = PyUnicode_DecodeFSDefault(buf); + if (buf_ob == NULL) + return NULL; PyObject *shortname_ob = PyUnicode_FromString(shortname); - PyObject *pathname_ob = PyUnicode_FromString(pathname); + if (shortname_ob == NULL) { + Py_DECREF(buf_ob); + return NULL; + } + PyObject *pathname_ob = PyUnicode_DecodeFSDefault(pathname); + if (pathname_ob == NULL) { + Py_DECREF(buf_ob); + Py_DECREF(shortname_ob); + return NULL; + } PyErr_SetImportError(buf_ob, shortname_ob, pathname_ob); Py_DECREF(buf_ob); Py_DECREF(shortname_ob); diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c index 082154dd91b1fc..23828898d35a5d 100644 --- a/Python/dynload_shlib.c +++ b/Python/dynload_shlib.c @@ -106,7 +106,7 @@ _PyImport_FindSharedFuncptr(const char *prefix, const char *error = dlerror(); if (error == NULL) error = "unknown dlopen() error"; - error_ob = PyUnicode_FromString(error); + error_ob = PyUnicode_DecodeLocale(error, "surrogateescape"); if (error_ob == NULL) return NULL; mod_name = PyUnicode_FromString(shortname); @@ -114,7 +114,7 @@ _PyImport_FindSharedFuncptr(const char *prefix, Py_DECREF(error_ob); return NULL; } - path = PyUnicode_FromString(pathname); + path = PyUnicode_DecodeFSDefault(pathname); if (path == NULL) { Py_DECREF(error_ob); Py_DECREF(mod_name); From 1929aa00aaf86dce5ec93a072d86ccfc2ef7db05 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 14 Oct 2020 23:41:55 -0700 Subject: [PATCH 0270/1261] Minor clarification (GH-22708) --- Doc/library/random.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 635f9e1c032da3..5a9359484d11a8 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -545,9 +545,9 @@ Recipes The default :func:`.random` returns multiples of 2⁻⁵³ in the range *0.0 ≤ x < 1.0*. All such numbers are evenly spaced and are exactly -representable as Python floats. However, many floats in that interval -are not possible selections. For example, ``0.05954861408025609`` -isn't an integer multiple of 2⁻⁵³. +representable as Python floats. However, many other representable +floats in that interval are not possible selections. For example, +``0.05954861408025609`` isn't an integer multiple of 2⁻⁵³. The following recipe takes a different approach. All floats in the interval are possible selections. The mantissa comes from a uniform From c50bc96331423dc4abf55811495e784da458be4a Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Thu, 15 Oct 2020 14:20:15 +0200 Subject: [PATCH 0271/1261] bpo-42021: Fix possible ref leaks during _sqlite3 module init (GH-22673) --- .../2020-10-12-21-21-24.bpo-42021.8yv_8-.rst | 1 + Modules/_sqlite/microprotocols.c | 9 +- Modules/_sqlite/microprotocols.h | 2 +- Modules/_sqlite/module.c | 210 +++++++----------- 4 files changed, 93 insertions(+), 129 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-12-21-21-24.bpo-42021.8yv_8-.rst diff --git a/Misc/NEWS.d/next/Library/2020-10-12-21-21-24.bpo-42021.8yv_8-.rst b/Misc/NEWS.d/next/Library/2020-10-12-21-21-24.bpo-42021.8yv_8-.rst new file mode 100644 index 00000000000000..7d71e9a70079b9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-12-21-21-24.bpo-42021.8yv_8-.rst @@ -0,0 +1 @@ +Fix possible ref leaks in :mod:`sqlite3` module init. diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index 64095adb4db2b2..ddc30e8a89b460 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -37,14 +37,19 @@ static PyObject *psyco_adapters = NULL; /* pysqlite_microprotocols_init - initialize the adapters dictionary */ int -pysqlite_microprotocols_init(PyObject *dict) +pysqlite_microprotocols_init(PyObject *module) { /* create adapters dictionary and put it in module namespace */ if ((psyco_adapters = PyDict_New()) == NULL) { return -1; } - return PyDict_SetItemString(dict, "adapters", psyco_adapters); + if (PyModule_AddObject(module, "adapters", psyco_adapters) < 0) { + Py_DECREF(psyco_adapters); + return -1; + } + + return 0; } diff --git a/Modules/_sqlite/microprotocols.h b/Modules/_sqlite/microprotocols.h index 5418c2b98fd751..87df6bac55797a 100644 --- a/Modules/_sqlite/microprotocols.h +++ b/Modules/_sqlite/microprotocols.h @@ -38,7 +38,7 @@ /** exported functions **/ /* used by module.c to init the microprotocols system */ -extern int pysqlite_microprotocols_init(PyObject *dict); +extern int pysqlite_microprotocols_init(PyObject *module); extern int pysqlite_microprotocols_add( PyTypeObject *type, PyObject *proto, PyObject *cast); extern PyObject *pysqlite_microprotocols_adapt( diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 102026663abd83..0297e2fab292e5 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -236,14 +236,17 @@ PyDoc_STRVAR(enable_callback_tracebacks_doc, \n\ Enable or disable callback functions throwing errors to stderr."); -static void converters_init(PyObject* dict) +static void converters_init(PyObject* module) { _pysqlite_converters = PyDict_New(); if (!_pysqlite_converters) { return; } - PyDict_SetItemString(dict, "converters", _pysqlite_converters); + if (PyModule_AddObject(module, "converters", _pysqlite_converters) < 0) { + Py_DECREF(_pysqlite_converters); + } + return; } static PyMethodDef module_methods[] = { @@ -264,59 +267,52 @@ static PyMethodDef module_methods[] = { {NULL, NULL} }; -struct _IntConstantPair { - const char *constant_name; - int constant_value; -}; - -typedef struct _IntConstantPair IntConstantPair; - -static const IntConstantPair _int_constants[] = { - {"PARSE_DECLTYPES", PARSE_DECLTYPES}, - {"PARSE_COLNAMES", PARSE_COLNAMES}, - - {"SQLITE_OK", SQLITE_OK}, - {"SQLITE_DENY", SQLITE_DENY}, - {"SQLITE_IGNORE", SQLITE_IGNORE}, - {"SQLITE_CREATE_INDEX", SQLITE_CREATE_INDEX}, - {"SQLITE_CREATE_TABLE", SQLITE_CREATE_TABLE}, - {"SQLITE_CREATE_TEMP_INDEX", SQLITE_CREATE_TEMP_INDEX}, - {"SQLITE_CREATE_TEMP_TABLE", SQLITE_CREATE_TEMP_TABLE}, - {"SQLITE_CREATE_TEMP_TRIGGER", SQLITE_CREATE_TEMP_TRIGGER}, - {"SQLITE_CREATE_TEMP_VIEW", SQLITE_CREATE_TEMP_VIEW}, - {"SQLITE_CREATE_TRIGGER", SQLITE_CREATE_TRIGGER}, - {"SQLITE_CREATE_VIEW", SQLITE_CREATE_VIEW}, - {"SQLITE_DELETE", SQLITE_DELETE}, - {"SQLITE_DROP_INDEX", SQLITE_DROP_INDEX}, - {"SQLITE_DROP_TABLE", SQLITE_DROP_TABLE}, - {"SQLITE_DROP_TEMP_INDEX", SQLITE_DROP_TEMP_INDEX}, - {"SQLITE_DROP_TEMP_TABLE", SQLITE_DROP_TEMP_TABLE}, - {"SQLITE_DROP_TEMP_TRIGGER", SQLITE_DROP_TEMP_TRIGGER}, - {"SQLITE_DROP_TEMP_VIEW", SQLITE_DROP_TEMP_VIEW}, - {"SQLITE_DROP_TRIGGER", SQLITE_DROP_TRIGGER}, - {"SQLITE_DROP_VIEW", SQLITE_DROP_VIEW}, - {"SQLITE_INSERT", SQLITE_INSERT}, - {"SQLITE_PRAGMA", SQLITE_PRAGMA}, - {"SQLITE_READ", SQLITE_READ}, - {"SQLITE_SELECT", SQLITE_SELECT}, - {"SQLITE_TRANSACTION", SQLITE_TRANSACTION}, - {"SQLITE_UPDATE", SQLITE_UPDATE}, - {"SQLITE_ATTACH", SQLITE_ATTACH}, - {"SQLITE_DETACH", SQLITE_DETACH}, - {"SQLITE_ALTER_TABLE", SQLITE_ALTER_TABLE}, - {"SQLITE_REINDEX", SQLITE_REINDEX}, - {"SQLITE_ANALYZE", SQLITE_ANALYZE}, - {"SQLITE_CREATE_VTABLE", SQLITE_CREATE_VTABLE}, - {"SQLITE_DROP_VTABLE", SQLITE_DROP_VTABLE}, - {"SQLITE_FUNCTION", SQLITE_FUNCTION}, - {"SQLITE_SAVEPOINT", SQLITE_SAVEPOINT}, +static int add_integer_constants(PyObject *module) { + int ret = 0; + + ret += PyModule_AddIntMacro(module, PARSE_DECLTYPES); + ret += PyModule_AddIntMacro(module, PARSE_COLNAMES); + ret += PyModule_AddIntMacro(module, SQLITE_OK); + ret += PyModule_AddIntMacro(module, SQLITE_DENY); + ret += PyModule_AddIntMacro(module, SQLITE_IGNORE); + ret += PyModule_AddIntMacro(module, SQLITE_CREATE_INDEX); + ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TABLE); + ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_INDEX); + ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_TABLE); + ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_TRIGGER); + ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_VIEW); + ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TRIGGER); + ret += PyModule_AddIntMacro(module, SQLITE_CREATE_VIEW); + ret += PyModule_AddIntMacro(module, SQLITE_DELETE); + ret += PyModule_AddIntMacro(module, SQLITE_DROP_INDEX); + ret += PyModule_AddIntMacro(module, SQLITE_DROP_TABLE); + ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_INDEX); + ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_TABLE); + ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_TRIGGER); + ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_VIEW); + ret += PyModule_AddIntMacro(module, SQLITE_DROP_TRIGGER); + ret += PyModule_AddIntMacro(module, SQLITE_DROP_VIEW); + ret += PyModule_AddIntMacro(module, SQLITE_INSERT); + ret += PyModule_AddIntMacro(module, SQLITE_PRAGMA); + ret += PyModule_AddIntMacro(module, SQLITE_READ); + ret += PyModule_AddIntMacro(module, SQLITE_SELECT); + ret += PyModule_AddIntMacro(module, SQLITE_TRANSACTION); + ret += PyModule_AddIntMacro(module, SQLITE_UPDATE); + ret += PyModule_AddIntMacro(module, SQLITE_ATTACH); + ret += PyModule_AddIntMacro(module, SQLITE_DETACH); + ret += PyModule_AddIntMacro(module, SQLITE_ALTER_TABLE); + ret += PyModule_AddIntMacro(module, SQLITE_REINDEX); + ret += PyModule_AddIntMacro(module, SQLITE_ANALYZE); + ret += PyModule_AddIntMacro(module, SQLITE_CREATE_VTABLE); + ret += PyModule_AddIntMacro(module, SQLITE_DROP_VTABLE); + ret += PyModule_AddIntMacro(module, SQLITE_FUNCTION); + ret += PyModule_AddIntMacro(module, SQLITE_SAVEPOINT); #if SQLITE_VERSION_NUMBER >= 3008003 - {"SQLITE_RECURSIVE", SQLITE_RECURSIVE}, + ret += PyModule_AddIntMacro(module, SQLITE_RECURSIVE); #endif - {"SQLITE_DONE", SQLITE_DONE}, - {(char*)NULL, 0} -}; - + ret += PyModule_AddIntMacro(module, SQLITE_DONE); + return ret; +} static struct PyModuleDef _sqlite3module = { PyModuleDef_HEAD_INIT, @@ -338,11 +334,21 @@ do { \ } \ } while (0) +#define ADD_EXCEPTION(module, name, exc, base) \ +do { \ + exc = PyErr_NewException(MODULE_NAME "." name, base, NULL); \ + if (!exc) { \ + goto error; \ + } \ + if (PyModule_AddObject(module, name, exc) < 0) { \ + Py_DECREF(exc); \ + goto error; \ + } \ +} while (0) + PyMODINIT_FUNC PyInit__sqlite3(void) { - PyObject *module, *dict; - PyObject *tmp_obj; - int i; + PyObject *module; if (sqlite3_libversion_number() < 3007003) { PyErr_SetString(PyExc_ImportError, MODULE_NAME ": SQLite 3.7.3 or higher required"); @@ -368,65 +374,21 @@ PyMODINIT_FUNC PyInit__sqlite3(void) ADD_TYPE(module, *pysqlite_PrepareProtocolType); ADD_TYPE(module, *pysqlite_RowType); - if (!(dict = PyModule_GetDict(module))) { - goto error; - } - /*** Create DB-API Exception hierarchy */ - - if (!(pysqlite_Error = PyErr_NewException(MODULE_NAME ".Error", PyExc_Exception, NULL))) { - goto error; - } - PyDict_SetItemString(dict, "Error", pysqlite_Error); - - if (!(pysqlite_Warning = PyErr_NewException(MODULE_NAME ".Warning", PyExc_Exception, NULL))) { - goto error; - } - PyDict_SetItemString(dict, "Warning", pysqlite_Warning); + ADD_EXCEPTION(module, "Error", pysqlite_Error, PyExc_Exception); + ADD_EXCEPTION(module, "Warning", pysqlite_Warning, PyExc_Exception); /* Error subclasses */ - - if (!(pysqlite_InterfaceError = PyErr_NewException(MODULE_NAME ".InterfaceError", pysqlite_Error, NULL))) { - goto error; - } - PyDict_SetItemString(dict, "InterfaceError", pysqlite_InterfaceError); - - if (!(pysqlite_DatabaseError = PyErr_NewException(MODULE_NAME ".DatabaseError", pysqlite_Error, NULL))) { - goto error; - } - PyDict_SetItemString(dict, "DatabaseError", pysqlite_DatabaseError); + ADD_EXCEPTION(module, "InterfaceError", pysqlite_InterfaceError, pysqlite_Error); + ADD_EXCEPTION(module, "DatabaseError", pysqlite_DatabaseError, pysqlite_Error); /* pysqlite_DatabaseError subclasses */ - - if (!(pysqlite_InternalError = PyErr_NewException(MODULE_NAME ".InternalError", pysqlite_DatabaseError, NULL))) { - goto error; - } - PyDict_SetItemString(dict, "InternalError", pysqlite_InternalError); - - if (!(pysqlite_OperationalError = PyErr_NewException(MODULE_NAME ".OperationalError", pysqlite_DatabaseError, NULL))) { - goto error; - } - PyDict_SetItemString(dict, "OperationalError", pysqlite_OperationalError); - - if (!(pysqlite_ProgrammingError = PyErr_NewException(MODULE_NAME ".ProgrammingError", pysqlite_DatabaseError, NULL))) { - goto error; - } - PyDict_SetItemString(dict, "ProgrammingError", pysqlite_ProgrammingError); - - if (!(pysqlite_IntegrityError = PyErr_NewException(MODULE_NAME ".IntegrityError", pysqlite_DatabaseError,NULL))) { - goto error; - } - PyDict_SetItemString(dict, "IntegrityError", pysqlite_IntegrityError); - - if (!(pysqlite_DataError = PyErr_NewException(MODULE_NAME ".DataError", pysqlite_DatabaseError, NULL))) { - goto error; - } - PyDict_SetItemString(dict, "DataError", pysqlite_DataError); - - if (!(pysqlite_NotSupportedError = PyErr_NewException(MODULE_NAME ".NotSupportedError", pysqlite_DatabaseError, NULL))) { - goto error; - } - PyDict_SetItemString(dict, "NotSupportedError", pysqlite_NotSupportedError); + ADD_EXCEPTION(module, "InternalError", pysqlite_InternalError, pysqlite_DatabaseError); + ADD_EXCEPTION(module, "OperationalError", pysqlite_OperationalError, pysqlite_DatabaseError); + ADD_EXCEPTION(module, "ProgrammingError", pysqlite_ProgrammingError, pysqlite_DatabaseError); + ADD_EXCEPTION(module, "IntegrityError", pysqlite_IntegrityError, pysqlite_DatabaseError); + ADD_EXCEPTION(module, "DataError", pysqlite_DataError, pysqlite_DatabaseError); + ADD_EXCEPTION(module, "NotSupportedError", pysqlite_NotSupportedError, pysqlite_DatabaseError); /* In Python 2.x, setting Connection.text_factory to OptimizedUnicode caused Unicode objects to be returned for @@ -434,35 +396,31 @@ PyMODINIT_FUNC PyInit__sqlite3(void) Now OptimizedUnicode is an alias for str, so it has no effect. */ Py_INCREF((PyObject*)&PyUnicode_Type); - PyDict_SetItemString(dict, "OptimizedUnicode", (PyObject*)&PyUnicode_Type); + if (PyModule_AddObject(module, "OptimizedUnicode", (PyObject*)&PyUnicode_Type) < 0) { + Py_DECREF((PyObject*)&PyUnicode_Type); + goto error; + } /* Set integer constants */ - for (i = 0; _int_constants[i].constant_name != NULL; i++) { - tmp_obj = PyLong_FromLong(_int_constants[i].constant_value); - if (!tmp_obj) { - goto error; - } - PyDict_SetItemString(dict, _int_constants[i].constant_name, tmp_obj); - Py_DECREF(tmp_obj); + if (add_integer_constants(module) < 0) { + goto error; } - if (!(tmp_obj = PyUnicode_FromString(PYSQLITE_VERSION))) { + if (PyModule_AddStringConstant(module, "version", PYSQLITE_VERSION) < 0) { goto error; } - PyDict_SetItemString(dict, "version", tmp_obj); - Py_DECREF(tmp_obj); - if (!(tmp_obj = PyUnicode_FromString(sqlite3_libversion()))) { + if (PyModule_AddStringConstant(module, "sqlite_version", sqlite3_libversion())) { goto error; } - PyDict_SetItemString(dict, "sqlite_version", tmp_obj); - Py_DECREF(tmp_obj); /* initialize microprotocols layer */ - pysqlite_microprotocols_init(dict); + if (pysqlite_microprotocols_init(module) < 0) { + goto error; + } /* initialize the default converters */ - converters_init(dict); + converters_init(module); error: if (PyErr_Occurred()) From f667e764df9ee91921fafa5c861a7295057416ef Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 15 Oct 2020 16:22:19 +0200 Subject: [PATCH 0272/1261] bpo-1635741: Add a global module state to unicodedata (GH-22712) Prepare unicodedata to add a state per module: start with a global "module" state, pass it to subfunctions which access &UCD_Type. This change also prepares the conversion of the UCD_Type static type to a heap type. --- Modules/unicodedata.c | 161 ++++++++++++++++++++++++++++-------------- 1 file changed, 107 insertions(+), 54 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index 8e11cfc4dafa92..941fd2faa742a6 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -93,22 +93,33 @@ static PyMemberDef DB_members[] = { /* forward declaration */ static PyTypeObject UCD_Type; -// Check if self is an instance of UCD_Type. +typedef struct { + // Borrowed reference to &UCD_Type. It is used to prepare the code + // to convert the UCD_Type static type to a heap type. + PyTypeObject *ucd_type; +} unicodedata_module_state; + +// bpo-1635741: Temporary global state until the unicodedata module +// gets a real module state. +static unicodedata_module_state global_module_state; + +// Check if self is an instance of ucd_type. // Return 0 if self is NULL (when the PyCapsule C API is used). #define UCD_Check(self, ucd_type) (self != NULL && Py_IS_TYPE(self, ucd_type)) static PyObject* -new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4), +new_previous_version(unicodedata_module_state *state, + const char*name, const change_record* (*getrecord)(Py_UCS4), Py_UCS4 (*normalization)(Py_UCS4)) { - PreviousDBVersion *self; - self = PyObject_New(PreviousDBVersion, &UCD_Type); - if (self == NULL) - return NULL; - self->name = name; - self->getrecord = getrecord; - self->normalization = normalization; - return (PyObject*)self; + PreviousDBVersion *self; + self = PyObject_New(PreviousDBVersion, state->ucd_type); + if (self == NULL) + return NULL; + self->name = name; + self->getrecord = getrecord; + self->normalization = normalization; + return (PyObject*)self; } @@ -134,11 +145,12 @@ unicodedata_UCD_decimal_impl(PyObject *self, int chr, PyObject *default_value) /*[clinic end generated code: output=be23376e1a185231 input=933f8107993f23d0]*/ { + unicodedata_module_state *state = &global_module_state; int have_old = 0; long rc; Py_UCS4 c = (Py_UCS4)chr; - if (UCD_Check(self, &UCD_Type)) { + if (UCD_Check(self, state->ucd_type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) { /* unassigned */ @@ -222,11 +234,12 @@ unicodedata_UCD_numeric_impl(PyObject *self, int chr, PyObject *default_value) /*[clinic end generated code: output=53ce281fe85b10c4 input=fdf5871a5542893c]*/ { + unicodedata_module_state *state = &global_module_state; int have_old = 0; double rc; Py_UCS4 c = (Py_UCS4)chr; - if (UCD_Check(self, &UCD_Type)) { + if (UCD_Check(self, state->ucd_type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) { /* unassigned */ @@ -268,10 +281,11 @@ static PyObject * unicodedata_UCD_category_impl(PyObject *self, int chr) /*[clinic end generated code: output=8571539ee2e6783a input=27d6f3d85050bc06]*/ { + unicodedata_module_state *state = &global_module_state; int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->category; - if (UCD_Check(self, &UCD_Type)) { + if (UCD_Check(self, state->ucd_type)) { const change_record *old = get_old_record(self, c); if (old->category_changed != 0xFF) index = old->category_changed; @@ -295,10 +309,11 @@ static PyObject * unicodedata_UCD_bidirectional_impl(PyObject *self, int chr) /*[clinic end generated code: output=d36310ce2039bb92 input=b3d8f42cebfcf475]*/ { + unicodedata_module_state *state = &global_module_state; int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->bidirectional; - if (UCD_Check(self, &UCD_Type)) { + if (UCD_Check(self, state->ucd_type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -324,10 +339,11 @@ static int unicodedata_UCD_combining_impl(PyObject *self, int chr) /*[clinic end generated code: output=cad056d0cb6a5920 input=9f2d6b2a95d0a22a]*/ { + unicodedata_module_state *state = &global_module_state; int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->combining; - if (UCD_Check(self, &UCD_Type)) { + if (UCD_Check(self, state->ucd_type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -352,10 +368,11 @@ static int unicodedata_UCD_mirrored_impl(PyObject *self, int chr) /*[clinic end generated code: output=2532dbf8121b50e6 input=5dd400d351ae6f3b]*/ { + unicodedata_module_state *state = &global_module_state; int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->mirrored; - if (UCD_Check(self, &UCD_Type)) { + if (UCD_Check(self, state->ucd_type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -379,10 +396,11 @@ static PyObject * unicodedata_UCD_east_asian_width_impl(PyObject *self, int chr) /*[clinic end generated code: output=484e8537d9ee8197 input=c4854798aab026e0]*/ { + unicodedata_module_state *state = &global_module_state; int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->east_asian_width; - if (UCD_Check(self, &UCD_Type)) { + if (UCD_Check(self, state->ucd_type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -408,6 +426,7 @@ static PyObject * unicodedata_UCD_decomposition_impl(PyObject *self, int chr) /*[clinic end generated code: output=7d699f3ec7565d27 input=e4c12459ad68507b]*/ { + unicodedata_module_state *state = &global_module_state; char decomp[256]; int code, index, count; size_t i; @@ -416,7 +435,7 @@ unicodedata_UCD_decomposition_impl(PyObject *self, int chr) code = (int)c; - if (UCD_Check(self, &UCD_Type)) { + if (UCD_Check(self, state->ucd_type)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) return PyUnicode_FromString(""); /* unassigned */ @@ -459,11 +478,12 @@ unicodedata_UCD_decomposition_impl(PyObject *self, int chr) } static void -get_decomp_record(PyObject *self, Py_UCS4 code, int *index, int *prefix, int *count) +get_decomp_record(unicodedata_module_state *state, PyObject *self, + Py_UCS4 code, int *index, int *prefix, int *count) { if (code >= 0x110000) { *index = 0; - } else if (UCD_Check(self, &UCD_Type) && + } else if (UCD_Check(self, state->ucd_type) && get_old_record(self, code)->category_changed==0) { /* unassigned in old version */ *index = 0; @@ -493,7 +513,8 @@ get_decomp_record(PyObject *self, Py_UCS4 code, int *index, int *prefix, int *co #define SCount (LCount*NCount) static PyObject* -nfd_nfkd(PyObject *self, PyObject *input, int k) +nfd_nfkd(unicodedata_module_state *state, PyObject *self, + PyObject *input, int k) { PyObject *result; Py_UCS4 *output; @@ -561,7 +582,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k) continue; } /* normalization changes */ - if (UCD_Check(self, &UCD_Type)) { + if (UCD_Check(self, state->ucd_type)) { Py_UCS4 value = ((PreviousDBVersion*)self)->normalization(code); if (value != 0) { stack[stackptr++] = value; @@ -570,7 +591,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k) } /* Other decompositions. */ - get_decomp_record(self, code, &index, &prefix, &count); + get_decomp_record(state, self, code, &index, &prefix, &count); /* Copy character if it is not decomposable, or has a compatibility decomposition, but we do NFD. */ @@ -642,7 +663,7 @@ find_nfc_index(const struct reindex* nfc, Py_UCS4 code) } static PyObject* -nfc_nfkc(PyObject *self, PyObject *input, int k) +nfc_nfkc(unicodedata_module_state *state, PyObject *self, PyObject *input, int k) { PyObject *result; int kind; @@ -654,7 +675,7 @@ nfc_nfkc(PyObject *self, PyObject *input, int k) Py_ssize_t skipped[20]; int cskipped = 0; - result = nfd_nfkd(self, input, k); + result = nfd_nfkd(state, self, input, k); if (!result) return NULL; /* result will be "ready". */ @@ -797,12 +818,12 @@ typedef enum {YES = 0, MAYBE = 1, NO = 2} QuickcheckResult; * https://www.unicode.org/reports/tr15/#Detecting_Normalization_Forms */ static QuickcheckResult -is_normalized_quickcheck(PyObject *self, PyObject *input, - bool nfc, bool k, bool yes_only) +is_normalized_quickcheck(unicodedata_module_state *state, PyObject *self, + PyObject *input, bool nfc, bool k, bool yes_only) { /* An older version of the database is requested, quickchecks must be disabled. */ - if (UCD_Check(self, &UCD_Type)) + if (UCD_Check(self, state->ucd_type)) return NO; Py_ssize_t i, len; @@ -862,6 +883,7 @@ unicodedata_UCD_is_normalized_impl(PyObject *self, PyObject *form, PyObject *input) /*[clinic end generated code: output=11e5a3694e723ca5 input=a544f14cea79e508]*/ { + unicodedata_module_state *state = &global_module_state; if (PyUnicode_READY(input) == -1) { return NULL; } @@ -897,10 +919,10 @@ unicodedata_UCD_is_normalized_impl(PyObject *self, PyObject *form, return NULL; } - m = is_normalized_quickcheck(self, input, nfc, k, false); + m = is_normalized_quickcheck(state, self, input, nfc, k, false); if (m == MAYBE) { - cmp = (nfc ? nfc_nfkc : nfd_nfkd)(self, input, k); + cmp = (nfc ? nfc_nfkc : nfd_nfkd)(state, self, input, k); if (cmp == NULL) { return NULL; } @@ -935,6 +957,7 @@ unicodedata_UCD_normalize_impl(PyObject *self, PyObject *form, PyObject *input) /*[clinic end generated code: output=05ca4385a2ad6983 input=3a5206c0ad2833fb]*/ { + unicodedata_module_state *state = &global_module_state; if (PyUnicode_GET_LENGTH(input) == 0) { /* Special case empty input strings, since resizing them later would cause internal errors. */ @@ -943,32 +966,36 @@ unicodedata_UCD_normalize_impl(PyObject *self, PyObject *form, } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFC)) { - if (is_normalized_quickcheck(self, input, true, false, true) == YES) { + if (is_normalized_quickcheck(state, self, input, + true, false, true) == YES) { Py_INCREF(input); return input; } - return nfc_nfkc(self, input, 0); + return nfc_nfkc(state, self, input, 0); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKC)) { - if (is_normalized_quickcheck(self, input, true, true, true) == YES) { + if (is_normalized_quickcheck(state, self, input, + true, true, true) == YES) { Py_INCREF(input); return input; } - return nfc_nfkc(self, input, 1); + return nfc_nfkc(state, self, input, 1); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFD)) { - if (is_normalized_quickcheck(self, input, false, false, true) == YES) { + if (is_normalized_quickcheck(state, self, input, + false, false, true) == YES) { Py_INCREF(input); return input; } - return nfd_nfkd(self, input, 0); + return nfd_nfkd(state, self, input, 0); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKD)) { - if (is_normalized_quickcheck(self, input, false, true, true) == YES) { + if (is_normalized_quickcheck(state, self, input, + false, true, true) == YES) { Py_INCREF(input); return input; } - return nfd_nfkd(self, input, 1); + return nfd_nfkd(state, self, input, 1); } PyErr_SetString(PyExc_ValueError, "invalid normalization form"); return NULL; @@ -1051,8 +1078,8 @@ is_unified_ideograph(Py_UCS4 code) (cp < named_sequences_end)) static int -_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen, - int with_alias_and_seq) +_getucname(unicodedata_module_state *state, PyObject *self, + Py_UCS4 code, char* buffer, int buflen, int with_alias_and_seq) { /* Find the name associated with the given code point. * If with_alias_and_seq is 1, check for names in the Private Use Area 15 @@ -1069,7 +1096,7 @@ _getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen, if (!with_alias_and_seq && (IS_ALIAS(code) || IS_NAMED_SEQ(code))) return 0; - if (UCD_Check(self, &UCD_Type)) { + if (UCD_Check(self, state->ucd_type)) { /* in 3.2.0 there are no aliases and named sequences */ const change_record *old; if (IS_ALIAS(code) || IS_NAMED_SEQ(code)) @@ -1153,12 +1180,22 @@ _getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen, } static int -_cmpname(PyObject *self, int code, const char* name, int namelen) +capi_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen, + int with_alias_and_seq) +{ + unicodedata_module_state *state = &global_module_state; + return _getucname(state, self, code, buffer, buflen, with_alias_and_seq); + +} + +static int +_cmpname(unicodedata_module_state *state, PyObject *self, + int code, const char* name, int namelen) { /* check if code corresponds to the given name */ int i; char buffer[NAME_MAXLEN+1]; - if (!_getucname(self, code, buffer, NAME_MAXLEN, 1)) + if (!_getucname(state, self, code, buffer, NAME_MAXLEN, 1)) return 0; for (i = 0; i < namelen; i++) { if (Py_TOUPPER(name[i]) != buffer[i]) @@ -1203,8 +1240,8 @@ _check_alias_and_seq(unsigned int cp, Py_UCS4* code, int with_named_seq) } static int -_getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code, - int with_named_seq) +_getcode(unicodedata_module_state *state, PyObject* self, + const char* name, int namelen, Py_UCS4* code, int with_named_seq) { /* Return the code point associated with the given name. * Named aliases are resolved too (unless self != NULL (i.e. we are using @@ -1265,8 +1302,9 @@ _getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code, v = code_hash[i]; if (!v) return 0; - if (_cmpname(self, v, name, namelen)) + if (_cmpname(state, self, v, name, namelen)) { return _check_alias_and_seq(v, code, with_named_seq); + } incr = (h ^ (h >> 3)) & mask; if (!incr) incr = mask; @@ -1275,19 +1313,29 @@ _getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code, v = code_hash[i]; if (!v) return 0; - if (_cmpname(self, v, name, namelen)) + if (_cmpname(state, self, v, name, namelen)) { return _check_alias_and_seq(v, code, with_named_seq); + } incr = incr << 1; if (incr > mask) incr = incr ^ code_poly; } } +static int +capi_getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code, + int with_named_seq) +{ + unicodedata_module_state *state = &global_module_state; + return _getcode(state, self, name, namelen, code, with_named_seq); + +} + static const _PyUnicode_Name_CAPI hashAPI = { sizeof(_PyUnicode_Name_CAPI), - _getucname, - _getcode + capi_getucname, + capi_getcode }; /* -------------------------------------------------------------------- */ @@ -1311,10 +1359,11 @@ static PyObject * unicodedata_UCD_name_impl(PyObject *self, int chr, PyObject *default_value) /*[clinic end generated code: output=6bbb37a326407707 input=3e0367f534de56d9]*/ { + unicodedata_module_state *state = &global_module_state; char name[NAME_MAXLEN+1]; Py_UCS4 c = (Py_UCS4)chr; - if (!_getucname(self, c, name, NAME_MAXLEN, 0)) { + if (!_getucname(state, self, c, name, NAME_MAXLEN, 0)) { if (default_value == NULL) { PyErr_SetString(PyExc_ValueError, "no such name"); return NULL; @@ -1346,6 +1395,7 @@ unicodedata_UCD_lookup_impl(PyObject *self, const char *name, Py_ssize_clean_t name_length) /*[clinic end generated code: output=765cb8186788e6be input=a557be0f8607a0d6]*/ { + unicodedata_module_state *state = &global_module_state; Py_UCS4 code; unsigned int index; if (name_length > NAME_MAXLEN) { @@ -1353,7 +1403,7 @@ unicodedata_UCD_lookup_impl(PyObject *self, const char *name, return NULL; } - if (!_getcode(self, name, (int)name_length, &code, 1)) { + if (!_getcode(state, self, name, (int)name_length, &code, 1)) { PyErr_Format(PyExc_KeyError, "undefined character name '%s'", name); return NULL; } @@ -1458,19 +1508,22 @@ PyMODINIT_FUNC PyInit_unicodedata(void) { PyObject *m, *v; + unicodedata_module_state *state = &global_module_state; Py_SET_TYPE(&UCD_Type, &PyType_Type); + state->ucd_type = &UCD_Type; m = PyModule_Create(&unicodedatamodule); if (!m) return NULL; PyModule_AddStringConstant(m, "unidata_version", UNIDATA_VERSION); - Py_INCREF(&UCD_Type); - PyModule_AddObject(m, "UCD", (PyObject*)&UCD_Type); + Py_INCREF(state->ucd_type); + PyModule_AddObject(m, "UCD", (PyObject*)state->ucd_type); /* Previous versions */ - v = new_previous_version("3.2.0", get_change_3_2_0, normalization_3_2_0); + v = new_previous_version(state, "3.2.0", + get_change_3_2_0, normalization_3_2_0); if (v != NULL) PyModule_AddObject(m, "ucd_3_2_0", v); From 57172831547eae77807e0e291d2a52c45de81e4e Mon Sep 17 00:00:00 2001 From: Saiyang Gou Date: Thu, 15 Oct 2020 12:06:23 -0700 Subject: [PATCH 0273/1261] Document that `test.support.bytecode_helper` is new in 3.9 (GH-22618) --- Doc/library/test.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 6495b4844449e5..ce6b868458ea4f 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -1168,6 +1168,8 @@ script execution tests. The :mod:`test.support.bytecode_helper` module provides support for testing and inspecting bytecode generation. +.. versionadded:: 3.9 + The module defines the following class: .. class:: BytecodeTestCase(unittest.TestCase) From e00b59811310e2b2c08df38d1439431b57327550 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Fri, 16 Oct 2020 16:34:15 +0800 Subject: [PATCH 0274/1261] bpo-41919, test_codecs: Move codecs.register calls to setUp() (GH-22513) * Move the codecs' (un)register operation to testcases. * Remove _codecs._forget_codec() and _PyCodec_Forget() --- Lib/test/test_charmapcodec.py | 7 ++++-- Lib/test/test_codecs.py | 25 +++----------------- Lib/test/test_io.py | 7 +++--- Lib/test/test_unicode.py | 5 +++- Modules/_codecsmodule.c | 20 ---------------- Modules/clinic/_codecsmodule.c.h | 39 +------------------------------- Python/codecs.c | 25 -------------------- 7 files changed, 16 insertions(+), 112 deletions(-) diff --git a/Lib/test/test_charmapcodec.py b/Lib/test/test_charmapcodec.py index 0d4594d8c05f2c..3f628902a1fd31 100644 --- a/Lib/test/test_charmapcodec.py +++ b/Lib/test/test_charmapcodec.py @@ -20,12 +20,15 @@ def codec_search_function(encoding): return tuple(testcodec.getregentry()) return None -codecs.register(codec_search_function) - # test codec's name (see test/testcodec.py) codecname = 'testcodec' class CharmapCodecTest(unittest.TestCase): + + def setUp(self): + codecs.register(codec_search_function) + self.addCleanup(codecs.unregister, codec_search_function) + def test_constructorx(self): self.assertEqual(str(b'abc', codecname), 'abc') self.assertEqual(str(b'xdef', codecname), 'abcdef') diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 09ceef76eb098d..9be8281ce5af5c 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -2754,29 +2754,14 @@ def test_uu_invalid(self): def _get_test_codec(codec_name): return _TEST_CODECS.get(codec_name) -codecs.register(_get_test_codec) # Returns None, not usable as a decorator - -try: - # Issue #22166: Also need to clear the internal cache in CPython - from _codecs import _forget_codec -except ImportError: - def _forget_codec(codec_name): - pass class ExceptionChainingTest(unittest.TestCase): def setUp(self): - # There's no way to unregister a codec search function, so we just - # ensure we render this one fairly harmless after the test - # case finishes by using the test case repr as the codec name - # The codecs module normalizes codec names, although this doesn't - # appear to be formally documented... - # We also make sure we use a truly unique id for the custom codec - # to avoid issues with the codec cache when running these tests - # multiple times (e.g. when hunting for refleaks) - unique_id = repr(self) + str(id(self)) - self.codec_name = encodings.normalize_encoding(unique_id).lower() + self.codec_name = 'exception_chaining_test' + codecs.register(_get_test_codec) + self.addCleanup(codecs.unregister, _get_test_codec) # We store the object to raise on the instance because of a bad # interaction between the codec caching (which means we can't @@ -2791,10 +2776,6 @@ def tearDown(self): _TEST_CODECS.pop(self.codec_name, None) # Issue #22166: Also pop from caches to avoid appearance of ref leaks encodings._cache.pop(self.codec_name, None) - try: - _forget_codec(self.codec_name) - except KeyError: - pass def set_codec(self, encode, decode): codec_info = codecs.CodecInfo(encode, decode, diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 85fac30e300a65..fbaea3aaec3cbe 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -2529,10 +2529,6 @@ def lookupTestDecoder(cls, name): streamreader=None, streamwriter=None, incrementaldecoder=cls) -# Register the previous decoder for testing. -# Disabled by default, tests will enable it. -codecs.register(StatefulIncrementalDecoder.lookupTestDecoder) - class StatefulIncrementalDecoderTest(unittest.TestCase): """ @@ -2583,6 +2579,9 @@ def setUp(self): self.testdata = b"AAA\r\nBBB\rCCC\r\nDDD\nEEE\r\n" self.normalized = b"AAA\nBBB\nCCC\nDDD\nEEE\n".decode("ascii") os_helper.unlink(os_helper.TESTFN) + codecs.register(StatefulIncrementalDecoder.lookupTestDecoder) + self.addCleanup(codecs.unregister, + StatefulIncrementalDecoder.lookupTestDecoder) def tearDown(self): os_helper.unlink(os_helper.TESTFN) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index d485bc7ede2b92..90b0965582272c 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -36,7 +36,6 @@ def decode2(input, errors="strict"): return (encode2, decode2, None, None) else: return None -codecs.register(search_function) def duplicate_string(text): """ @@ -58,6 +57,10 @@ class UnicodeTest(string_tests.CommonTest, type2test = str + def setUp(self): + codecs.register(search_function) + self.addCleanup(codecs.unregister, search_function) + def checkequalnofix(self, result, object, methodname, *args): method = getattr(object, methodname) realresult = method(*args) diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c index 08a3d4ab024cc2..2e8cb97fe77c92 100644 --- a/Modules/_codecsmodule.c +++ b/Modules/_codecsmodule.c @@ -160,25 +160,6 @@ _codecs_decode_impl(PyObject *module, PyObject *obj, const char *encoding, /* --- Helpers ------------------------------------------------------------ */ -/*[clinic input] -_codecs._forget_codec - - encoding: str - / - -Purge the named codec from the internal codec lookup cache -[clinic start generated code]*/ - -static PyObject * -_codecs__forget_codec_impl(PyObject *module, const char *encoding) -/*[clinic end generated code: output=0bde9f0a5b084aa2 input=18d5d92d0e386c38]*/ -{ - if (_PyCodec_Forget(encoding) < 0) { - return NULL; - }; - Py_RETURN_NONE; -} - static PyObject *codec_tuple(PyObject *decoded, Py_ssize_t len) @@ -1057,7 +1038,6 @@ static PyMethodDef _codecs_functions[] = { _CODECS_CODE_PAGE_DECODE_METHODDEF _CODECS_REGISTER_ERROR_METHODDEF _CODECS_LOOKUP_ERROR_METHODDEF - _CODECS__FORGET_CODEC_METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/clinic/_codecsmodule.c.h b/Modules/clinic/_codecsmodule.c.h index e2ebb6861299e4..43378f94f98450 100644 --- a/Modules/clinic/_codecsmodule.c.h +++ b/Modules/clinic/_codecsmodule.c.h @@ -217,43 +217,6 @@ _codecs_decode(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje return return_value; } -PyDoc_STRVAR(_codecs__forget_codec__doc__, -"_forget_codec($module, encoding, /)\n" -"--\n" -"\n" -"Purge the named codec from the internal codec lookup cache"); - -#define _CODECS__FORGET_CODEC_METHODDEF \ - {"_forget_codec", (PyCFunction)_codecs__forget_codec, METH_O, _codecs__forget_codec__doc__}, - -static PyObject * -_codecs__forget_codec_impl(PyObject *module, const char *encoding); - -static PyObject * -_codecs__forget_codec(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - const char *encoding; - - if (!PyUnicode_Check(arg)) { - _PyArg_BadArgument("_forget_codec", "argument", "str", arg); - goto exit; - } - Py_ssize_t encoding_length; - encoding = PyUnicode_AsUTF8AndSize(arg, &encoding_length); - if (encoding == NULL) { - goto exit; - } - if (strlen(encoding) != (size_t)encoding_length) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - goto exit; - } - return_value = _codecs__forget_codec_impl(module, encoding); - -exit: - return return_value; -} - PyDoc_STRVAR(_codecs_escape_decode__doc__, "escape_decode($module, data, errors=None, /)\n" "--\n" @@ -2838,4 +2801,4 @@ _codecs_lookup_error(PyObject *module, PyObject *arg) #ifndef _CODECS_CODE_PAGE_ENCODE_METHODDEF #define _CODECS_CODE_PAGE_ENCODE_METHODDEF #endif /* !defined(_CODECS_CODE_PAGE_ENCODE_METHODDEF) */ -/*[clinic end generated code: output=9a97e2ddf3e69072 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=557c3b37e4c492ac input=a9049054013a1b77]*/ diff --git a/Python/codecs.c b/Python/codecs.c index a8233a73c4ed3f..ade14187204f09 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -208,31 +208,6 @@ PyObject *_PyCodec_Lookup(const char *encoding) return NULL; } -int _PyCodec_Forget(const char *encoding) -{ - PyObject *v; - int result; - - PyInterpreterState *interp = _PyInterpreterState_GET(); - if (interp->codec_search_path == NULL) { - return -1; - } - - /* Convert the encoding to a normalized Python string: all - characters are converted to lower case, spaces and hyphens are - replaced with underscores. */ - v = normalizestring(encoding); - if (v == NULL) { - return -1; - } - - /* Drop the named codec from the internal cache */ - result = PyDict_DelItem(interp->codec_search_cache, v); - Py_DECREF(v); - - return result; -} - /* Codec registry encoding check API. */ int PyCodec_KnownEncoding(const char *encoding) From 7cf963d61090e15745bdc087dfa56f5b0fa08a09 Mon Sep 17 00:00:00 2001 From: Necdet Can Atesman Date: Fri, 16 Oct 2020 16:14:07 +0200 Subject: [PATCH 0275/1261] bpo-42011: Update documentation of logging.Filter.filter() (GH-22692) --- Lib/logging/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 787cb4eefa1061..265e286101e913 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -763,8 +763,8 @@ def filter(self, record): """ Determine if the specified record is to be logged. - Is the specified record to be logged? Returns 0 for no, nonzero for - yes. If deemed appropriate, the record may be modified in-place. + Returns True if the record should be logged, or False otherwise. + If deemed appropriate, the record may be modified in-place. """ if self.nlen == 0: return True From 711a3ac6ae961aba8b55a0062a4f5145eaec5fd4 Mon Sep 17 00:00:00 2001 From: Kevin Adler Date: Fri, 16 Oct 2020 13:03:28 -0500 Subject: [PATCH 0276/1261] closes bpo-42030: Remove legacy AIX dynload support (GH-22717) Since c19c5a6, AIX builds have defaulted to using dynload_shlib over dynload_aix when dlopen is available. This function has been available since AIX 4.3, which went out of support in 2003, the same year the previously referenced commit was made. It has been nearly 20 years since a version of AIX has been supported which has not used dynload_shlib so there's no reason to keep this legacy code around. --- .../2020-10-15-21-55-32.bpo-42030.PmU2CA.rst | 3 + Python/dynload_aix.c | 190 ------------------ configure | 6 - configure.ac | 6 - 4 files changed, 3 insertions(+), 202 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-15-21-55-32.bpo-42030.PmU2CA.rst delete mode 100644 Python/dynload_aix.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-15-21-55-32.bpo-42030.PmU2CA.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-15-21-55-32.bpo-42030.PmU2CA.rst new file mode 100644 index 00000000000000..e8c691d809614f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-15-21-55-32.bpo-42030.PmU2CA.rst @@ -0,0 +1,3 @@ +Support for the legacy AIX-specific shared library loading support has been +removed. All versions of AIX since 4.3 have supported and defaulted to using +the common Unix mechanism instead. diff --git a/Python/dynload_aix.c b/Python/dynload_aix.c deleted file mode 100644 index 97f7698ef4b2d9..00000000000000 --- a/Python/dynload_aix.c +++ /dev/null @@ -1,190 +0,0 @@ - -/* Support for dynamic loading of extension modules */ - -#include "Python.h" -#include "importdl.h" - -#include /* for global errno */ -#include /* for strerror() */ -#include /* for malloc(), free() */ -#include - - -#ifdef AIX_GENUINE_CPLUSPLUS -#include -#define aix_load loadAndInit -#else -#define aix_load load -#endif - - -extern char *Py_GetProgramName(void); - -typedef struct Module { - struct Module *next; - void *entry; -} Module, *ModulePtr; - -const char *_PyImport_DynLoadFiletab[] = {".so", NULL}; - -static int -aix_getoldmodules(void **modlistptr) -{ - ModulePtr modptr, prevmodptr; - struct ld_info *ldiptr; - char *ldibuf; - int errflag, bufsize = 1024; - unsigned int offset; - char *progname = Py_GetProgramName(); - - /* - -- Get the list of loaded modules into ld_info structures. - */ - if ((ldibuf = malloc(bufsize)) == NULL) { - PyErr_SetString(PyExc_ImportError, strerror(errno)); - return -1; - } - while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1 - && errno == ENOMEM) { - free(ldibuf); - bufsize += 1024; - if ((ldibuf = malloc(bufsize)) == NULL) { - PyErr_SetString(PyExc_ImportError, strerror(errno)); - return -1; - } - } - if (errflag == -1) { - PyErr_SetString(PyExc_ImportError, strerror(errno)); - return -1; - } - /* - -- Make the modules list from the ld_info structures. - */ - ldiptr = (struct ld_info *)ldibuf; - prevmodptr = NULL; - do { - if (strstr(progname, ldiptr->ldinfo_filename) == NULL && - strstr(ldiptr->ldinfo_filename, "python") == NULL) { - /* - -- Extract only the modules belonging to the main - -- executable + those containing "python" as a - -- substring (like the "python[version]" binary or - -- "libpython[version].a" in case it's a shared lib). - */ - offset = (unsigned int)ldiptr->ldinfo_next; - ldiptr = (struct ld_info *)((char*)ldiptr + offset); - continue; - } - if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) { - PyErr_SetString(PyExc_ImportError, strerror(errno)); - while (*modlistptr) { - modptr = (ModulePtr)*modlistptr; - *modlistptr = (void *)modptr->next; - free(modptr); - } - return -1; - } - modptr->entry = ldiptr->ldinfo_dataorg; - modptr->next = NULL; - if (prevmodptr == NULL) - *modlistptr = (void *)modptr; - else - prevmodptr->next = modptr; - prevmodptr = modptr; - offset = (unsigned int)ldiptr->ldinfo_next; - ldiptr = (struct ld_info *)((char*)ldiptr + offset); - } while (offset); - free(ldibuf); - return 0; -} - - -static void -aix_loaderror(const char *pathname) -{ - - char *message[1024], errbuf[1024]; - PyObject *pathname_ob = NULL; - PyObject *errbuf_ob = NULL; - int i,j; - - struct errtab { - int errNo; - char *errstr; - } load_errtab[] = { - {L_ERROR_TOOMANY, "too many errors, rest skipped."}, - {L_ERROR_NOLIB, "can't load library:"}, - {L_ERROR_UNDEF, "can't find symbol in library:"}, - {L_ERROR_RLDBAD, - "RLD index out of range or bad relocation type:"}, - {L_ERROR_FORMAT, "not a valid, executable xcoff file:"}, - {L_ERROR_MEMBER, - "file not an archive or does not contain requested member:"}, - {L_ERROR_TYPE, "symbol table mismatch:"}, - {L_ERROR_ALIGN, "text alignment in file is wrong."}, - {L_ERROR_SYSTEM, "System error:"}, - {L_ERROR_ERRNO, NULL} - }; - -#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1) - - PyOS_snprintf(errbuf, sizeof(errbuf), "from module %.200s ", pathname); - - if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) { - ERRBUF_APPEND(strerror(errno)); - ERRBUF_APPEND("\n"); - } - for(i = 0; message[i] && *message[i]; i++) { - int nerr = atoi(message[i]); - for (j=0; j < Py_ARRAY_LENGTH(load_errtab); j++) { - if (nerr == load_errtab[j].errNo && load_errtab[j].errstr) - ERRBUF_APPEND(load_errtab[j].errstr); - } - while (Py_ISDIGIT(*message[i])) message[i]++ ; - ERRBUF_APPEND(message[i]); - ERRBUF_APPEND("\n"); - } - /* Subtract 1 from the length to trim off trailing newline */ - errbuf_ob = PyUnicode_DecodeLocaleAndSize(errbuf, strlen(errbuf)-1, "surrogateescape"); - if (errbuf_ob == NULL) - return; - pathname_ob = PyUnicode_DecodeFSDefault(pathname); - if (pathname_ob == NULL) { - Py_DECREF(errbuf_ob); - return; - } - PyErr_SetImportError(errbuf_ob, NULL, pathname_ob); - Py_DECREF(pathname_ob); - Py_DECREF(errbuf_ob); - return; -} - - -dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix, - const char *shortname, - const char *pathname, FILE *fp) -{ - dl_funcptr p; - - /* - -- Invoke load() with L_NOAUTODEFER leaving the imported symbols - -- of the shared module unresolved. Thus we have to resolve them - -- explicitly with loadbind. The new module is loaded, then we - -- resolve its symbols using the list of already loaded modules - -- (only those that belong to the python executable). Get these - -- with loadquery(L_GETINFO). - */ - - static void *staticmodlistptr = NULL; - - if (!staticmodlistptr) - if (aix_getoldmodules(&staticmodlistptr) == -1) - return NULL; - p = (dl_funcptr) aix_load((char *)pathname, L_NOAUTODEFER, 0); - if (p == NULL) { - aix_loaderror(pathname); - return NULL; - } - - return p; -} diff --git a/configure b/configure index 89577d85a41482..88b78947767fa9 100755 --- a/configure +++ b/configure @@ -11625,12 +11625,6 @@ $as_echo_n "checking DYNLOADFILE... " >&6; } if test -z "$DYNLOADFILE" then case $ac_sys_system/$ac_sys_release in - AIX*) # Use dynload_shlib.c and dlopen() if we have it; otherwise dynload_aix.c - if test "$ac_cv_func_dlopen" = yes - then DYNLOADFILE="dynload_shlib.o" - else DYNLOADFILE="dynload_aix.o" - fi - ;; hp*|HP*) DYNLOADFILE="dynload_hpux.o";; *) # use dynload_shlib.c and dlopen() if we have it; otherwise stub diff --git a/configure.ac b/configure.ac index 3ec274c576edfd..6ffe90a4c426cc 100644 --- a/configure.ac +++ b/configure.ac @@ -3622,12 +3622,6 @@ AC_MSG_CHECKING(DYNLOADFILE) if test -z "$DYNLOADFILE" then case $ac_sys_system/$ac_sys_release in - AIX*) # Use dynload_shlib.c and dlopen() if we have it; otherwise dynload_aix.c - if test "$ac_cv_func_dlopen" = yes - then DYNLOADFILE="dynload_shlib.o" - else DYNLOADFILE="dynload_aix.o" - fi - ;; hp*|HP*) DYNLOADFILE="dynload_hpux.o";; *) # use dynload_shlib.c and dlopen() if we have it; otherwise stub From 58e0568248d5a831a13a69bda8a733dc2ecfcdd8 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Fri, 16 Oct 2020 12:44:17 -0600 Subject: [PATCH 0277/1261] bpo-40341: Remove some "discouraged solutions" in Doc/faq/programming.rst (GH-22726) --- Doc/faq/programming.rst | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 7bcedb0b5d75b4..2d542cfb1dbb4b 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -942,7 +942,7 @@ There are various techniques. f() -* Use :func:`locals` or :func:`eval` to resolve the function name:: +* Use :func:`locals` to resolve the function name:: def myFunc(): print("hello") @@ -952,12 +952,6 @@ There are various techniques. f = locals()[fname] f() - f = eval(fname) - f() - - Note: Using :func:`eval` is slow and dangerous. If you don't have absolute - control over the contents of the string, someone could pass a string that - resulted in an arbitrary function being executed. Is there an equivalent to Perl's chomp() for removing trailing newlines from strings? ------------------------------------------------------------------------------------- @@ -1381,20 +1375,6 @@ out the element you want. :: ['else', 'sort', 'to', 'something'] -An alternative for the last step is:: - - >>> result = [] - >>> for p in pairs: result.append(p[1]) - -If you find this more legible, you might prefer to use this instead of the final -list comprehension. However, it is almost twice as slow for long lists. Why? -First, the ``append()`` operation has to reallocate memory, and while it uses -some tricks to avoid doing that each time, it still has to do it occasionally, -and that costs quite a bit. Second, the expression "result.append" requires an -extra attribute lookup, and third, there's a speed reduction from having to make -all those function calls. - - Objects ======= From 4d9421528c7cacd9d71ea0d906ec842912ff6b13 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Fri, 16 Oct 2020 23:34:01 -0300 Subject: [PATCH 0278/1261] [doc] Add mentions of PEP 613 (TypeAlias) to docs (GH-22733) --- Doc/library/typing.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 5fb78bbde69b1c..402dd24fde6e08 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -18,7 +18,7 @@ -------------- This module provides runtime support for type hints as specified by -:pep:`484`, :pep:`526`, :pep:`544`, :pep:`586`, :pep:`589`, and :pep:`591`. +:pep:`484`, :pep:`526`, :pep:`544`, :pep:`586`, :pep:`589`, :pep:`591`, and :pep:`613`. The most fundamental support consists of the types :data:`Any`, :data:`Union`, :data:`Tuple`, :data:`Callable`, :class:`TypeVar`, and :class:`Generic`. For full specification please see :pep:`484`. For @@ -500,6 +500,8 @@ These can be used as types in annotations and do not support ``[]``. Factors: TypeAlias = list[int] + See :pep:`613` for more details about explicit type aliases. + .. versionadded:: 3.10 Special forms From 2400d03585e301f54b1b16901c0ef1d3e3e20360 Mon Sep 17 00:00:00 2001 From: Max Bernstein Date: Sat, 17 Oct 2020 13:38:21 -0700 Subject: [PATCH 0279/1261] bpo-42065: Fix incorrectly formatted _codecs.charmap_decode error message (GH-19940) --- Lib/test/test_codecs.py | 12 ++++++++++++ .../Library/2020-10-17-23-17-18.bpo-42065.85BsRA.rst | 3 +++ Objects/unicodeobject.c | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-17-23-17-18.bpo-42065.85BsRA.rst diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 9be8281ce5af5c..328a47b2e37669 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -2197,6 +2197,18 @@ def test_decode_with_int2str_map(self): ("", len(allbytes)) ) + self.assertRaisesRegex(TypeError, + "character mapping must be in range\\(0x110000\\)", + codecs.charmap_decode, + b"\x00\x01\x02", "strict", {0: "A", 1: 'Bb', 2: -2} + ) + + self.assertRaisesRegex(TypeError, + "character mapping must be in range\\(0x110000\\)", + codecs.charmap_decode, + b"\x00\x01\x02", "strict", {0: "A", 1: 'Bb', 2: 999999999} + ) + def test_decode_with_int2int_map(self): a = ord('a') b = ord('b') diff --git a/Misc/NEWS.d/next/Library/2020-10-17-23-17-18.bpo-42065.85BsRA.rst b/Misc/NEWS.d/next/Library/2020-10-17-23-17-18.bpo-42065.85BsRA.rst new file mode 100644 index 00000000000000..83c86c0799ebfa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-17-23-17-18.bpo-42065.85BsRA.rst @@ -0,0 +1,3 @@ +Fix an incorrectly formatted error from :meth:`_codecs.charmap_decode` when +called with a mapped value outside the range of valid Unicode code points. +PR by Max Bernstein. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 01e5c728b383fb..c4e73ebd45d206 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8304,7 +8304,7 @@ charmap_decode_mapping(const char *s, goto Undefined; if (value < 0 || value > MAX_UNICODE) { PyErr_Format(PyExc_TypeError, - "character mapping must be in range(0x%lx)", + "character mapping must be in range(0x%x)", (unsigned long)MAX_UNICODE + 1); goto onError; } From 236db3f254bba2c50c2af1890f065a87495894eb Mon Sep 17 00:00:00 2001 From: Ma Lin Date: Sun, 18 Oct 2020 22:48:38 +0800 Subject: [PATCH 0280/1261] bpo-38252: Use 8-byte step to detect ASCII sequence in 64bit Windows build (GH-16334) --- .../2020-10-18-18-43-45.bpo-38252.7Nlepg.rst | 1 + Objects/bytes_methods.c | 20 +++++------ Objects/stringlib/codecs.h | 30 ++++++++-------- Objects/stringlib/find_max_char.h | 20 +++++------ Objects/unicodeobject.c | 34 +++++++++---------- 5 files changed, 53 insertions(+), 52 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-10-18-18-43-45.bpo-38252.7Nlepg.rst diff --git a/Misc/NEWS.d/next/Windows/2020-10-18-18-43-45.bpo-38252.7Nlepg.rst b/Misc/NEWS.d/next/Windows/2020-10-18-18-43-45.bpo-38252.7Nlepg.rst new file mode 100644 index 00000000000000..c103e6cfcc75a6 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-10-18-18-43-45.bpo-38252.7Nlepg.rst @@ -0,0 +1 @@ +Use 8-byte step to detect ASCII sequence in 64-bit Windows build. diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c index 72daa1fdd554e0..1512086e6131fc 100644 --- a/Objects/bytes_methods.c +++ b/Objects/bytes_methods.c @@ -100,14 +100,14 @@ Return True if B is empty or all characters in B are ASCII,\n\ False otherwise."); // Optimization is copied from ascii_decode in unicodeobject.c -/* Mask to quickly check whether a C 'long' contains a +/* Mask to quickly check whether a C 'size_t' contains a non-ASCII, UTF8-encoded char. */ -#if (SIZEOF_LONG == 8) -# define ASCII_CHAR_MASK 0x8080808080808080UL -#elif (SIZEOF_LONG == 4) -# define ASCII_CHAR_MASK 0x80808080UL +#if (SIZEOF_SIZE_T == 8) +# define ASCII_CHAR_MASK 0x8080808080808080ULL +#elif (SIZEOF_SIZE_T == 4) +# define ASCII_CHAR_MASK 0x80808080U #else -# error C 'long' size should be either 4 or 8! +# error C 'size_t' size should be either 4 or 8! #endif PyObject* @@ -115,20 +115,20 @@ _Py_bytes_isascii(const char *cptr, Py_ssize_t len) { const char *p = cptr; const char *end = p + len; - const char *aligned_end = (const char *) _Py_ALIGN_DOWN(end, SIZEOF_LONG); + const char *aligned_end = (const char *) _Py_ALIGN_DOWN(end, SIZEOF_SIZE_T); while (p < end) { /* Fast path, see in STRINGLIB(utf8_decode) in stringlib/codecs.h for an explanation. */ - if (_Py_IS_ALIGNED(p, SIZEOF_LONG)) { + if (_Py_IS_ALIGNED(p, SIZEOF_SIZE_T)) { /* Help allocation */ const char *_p = p; while (_p < aligned_end) { - unsigned long value = *(const unsigned long *) _p; + size_t value = *(const size_t *) _p; if (value & ASCII_CHAR_MASK) { Py_RETURN_FALSE; } - _p += SIZEOF_LONG; + _p += SIZEOF_SIZE_T; } p = _p; if (_p == end) diff --git a/Objects/stringlib/codecs.h b/Objects/stringlib/codecs.h index 197605b012e5c6..b6ca404b1a2d7a 100644 --- a/Objects/stringlib/codecs.h +++ b/Objects/stringlib/codecs.h @@ -6,14 +6,14 @@ #include "pycore_bitutils.h" // _Py_bswap32() -/* Mask to quickly check whether a C 'long' contains a +/* Mask to quickly check whether a C 'size_t' contains a non-ASCII, UTF8-encoded char. */ -#if (SIZEOF_LONG == 8) -# define ASCII_CHAR_MASK 0x8080808080808080UL -#elif (SIZEOF_LONG == 4) -# define ASCII_CHAR_MASK 0x80808080UL +#if (SIZEOF_SIZE_T == 8) +# define ASCII_CHAR_MASK 0x8080808080808080ULL +#elif (SIZEOF_SIZE_T == 4) +# define ASCII_CHAR_MASK 0x80808080U #else -# error C 'long' size should be either 4 or 8! +# error C 'size_t' size should be either 4 or 8! #endif /* 10xxxxxx */ @@ -26,7 +26,7 @@ STRINGLIB(utf8_decode)(const char **inptr, const char *end, { Py_UCS4 ch; const char *s = *inptr; - const char *aligned_end = (const char *) _Py_ALIGN_DOWN(end, SIZEOF_LONG); + const char *aligned_end = (const char *) _Py_ALIGN_DOWN(end, SIZEOF_SIZE_T); STRINGLIB_CHAR *p = dest + *outpos; while (s < end) { @@ -36,19 +36,19 @@ STRINGLIB(utf8_decode)(const char **inptr, const char *end, /* Fast path for runs of ASCII characters. Given that common UTF-8 input will consist of an overwhelming majority of ASCII characters, we try to optimize for this case by checking - as many characters as a C 'long' can contain. + as many characters as a C 'size_t' can contain. First, check if we can do an aligned read, as most CPUs have a penalty for unaligned reads. */ - if (_Py_IS_ALIGNED(s, SIZEOF_LONG)) { + if (_Py_IS_ALIGNED(s, SIZEOF_SIZE_T)) { /* Help register allocation */ const char *_s = s; STRINGLIB_CHAR *_p = p; while (_s < aligned_end) { - /* Read a whole long at a time (either 4 or 8 bytes), + /* Read a whole size_t at a time (either 4 or 8 bytes), and do a fast unrolled copy if it only contains ASCII characters. */ - unsigned long value = *(const unsigned long *) _s; + size_t value = *(const size_t *) _s; if (value & ASCII_CHAR_MASK) break; #if PY_LITTLE_ENDIAN @@ -56,14 +56,14 @@ STRINGLIB(utf8_decode)(const char **inptr, const char *end, _p[1] = (STRINGLIB_CHAR)((value >> 8) & 0xFFu); _p[2] = (STRINGLIB_CHAR)((value >> 16) & 0xFFu); _p[3] = (STRINGLIB_CHAR)((value >> 24) & 0xFFu); -# if SIZEOF_LONG == 8 +# if SIZEOF_SIZE_T == 8 _p[4] = (STRINGLIB_CHAR)((value >> 32) & 0xFFu); _p[5] = (STRINGLIB_CHAR)((value >> 40) & 0xFFu); _p[6] = (STRINGLIB_CHAR)((value >> 48) & 0xFFu); _p[7] = (STRINGLIB_CHAR)((value >> 56) & 0xFFu); # endif #else -# if SIZEOF_LONG == 8 +# if SIZEOF_SIZE_T == 8 _p[0] = (STRINGLIB_CHAR)((value >> 56) & 0xFFu); _p[1] = (STRINGLIB_CHAR)((value >> 48) & 0xFFu); _p[2] = (STRINGLIB_CHAR)((value >> 40) & 0xFFu); @@ -79,8 +79,8 @@ STRINGLIB(utf8_decode)(const char **inptr, const char *end, _p[3] = (STRINGLIB_CHAR)(value & 0xFFu); # endif #endif - _s += SIZEOF_LONG; - _p += SIZEOF_LONG; + _s += SIZEOF_SIZE_T; + _p += SIZEOF_SIZE_T; } s = _s; p = _p; diff --git a/Objects/stringlib/find_max_char.h b/Objects/stringlib/find_max_char.h index f4e0a7761d3119..3319a46461451b 100644 --- a/Objects/stringlib/find_max_char.h +++ b/Objects/stringlib/find_max_char.h @@ -4,14 +4,14 @@ # error "find_max_char.h is specific to Unicode" #endif -/* Mask to quickly check whether a C 'long' contains a +/* Mask to quickly check whether a C 'size_t' contains a non-ASCII, UTF8-encoded char. */ -#if (SIZEOF_LONG == 8) -# define UCS1_ASCII_CHAR_MASK 0x8080808080808080UL -#elif (SIZEOF_LONG == 4) -# define UCS1_ASCII_CHAR_MASK 0x80808080UL +#if (SIZEOF_SIZE_T == 8) +# define UCS1_ASCII_CHAR_MASK 0x8080808080808080ULL +#elif (SIZEOF_SIZE_T == 4) +# define UCS1_ASCII_CHAR_MASK 0x80808080U #else -# error C 'long' size should be either 4 or 8! +# error C 'size_t' size should be either 4 or 8! #endif #if STRINGLIB_SIZEOF_CHAR == 1 @@ -21,17 +21,17 @@ STRINGLIB(find_max_char)(const STRINGLIB_CHAR *begin, const STRINGLIB_CHAR *end) { const unsigned char *p = (const unsigned char *) begin; const unsigned char *aligned_end = - (const unsigned char *) _Py_ALIGN_DOWN(end, SIZEOF_LONG); + (const unsigned char *) _Py_ALIGN_DOWN(end, SIZEOF_SIZE_T); while (p < end) { - if (_Py_IS_ALIGNED(p, SIZEOF_LONG)) { + if (_Py_IS_ALIGNED(p, SIZEOF_SIZE_T)) { /* Help register allocation */ const unsigned char *_p = p; while (_p < aligned_end) { - unsigned long value = *(const unsigned long *) _p; + size_t value = *(const size_t *) _p; if (value & UCS1_ASCII_CHAR_MASK) return 255; - _p += SIZEOF_LONG; + _p += SIZEOF_SIZE_T; } p = _p; if (p == end) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index c4e73ebd45d206..f963deb0201a48 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -5025,21 +5025,21 @@ PyUnicode_DecodeUTF8(const char *s, #include "stringlib/codecs.h" #include "stringlib/undef.h" -/* Mask to quickly check whether a C 'long' contains a +/* Mask to quickly check whether a C 'size_t' contains a non-ASCII, UTF8-encoded char. */ -#if (SIZEOF_LONG == 8) -# define ASCII_CHAR_MASK 0x8080808080808080UL -#elif (SIZEOF_LONG == 4) -# define ASCII_CHAR_MASK 0x80808080UL +#if (SIZEOF_SIZE_T == 8) +# define ASCII_CHAR_MASK 0x8080808080808080ULL +#elif (SIZEOF_SIZE_T == 4) +# define ASCII_CHAR_MASK 0x80808080U #else -# error C 'long' size should be either 4 or 8! +# error C 'size_t' size should be either 4 or 8! #endif static Py_ssize_t ascii_decode(const char *start, const char *end, Py_UCS1 *dest) { const char *p = start; - const char *aligned_end = (const char *) _Py_ALIGN_DOWN(end, SIZEOF_LONG); + const char *aligned_end = (const char *) _Py_ALIGN_DOWN(end, SIZEOF_SIZE_T); /* * Issue #17237: m68k is a bit different from most architectures in @@ -5049,21 +5049,21 @@ ascii_decode(const char *start, const char *end, Py_UCS1 *dest) * version" will even speed up m68k. */ #if !defined(__m68k__) -#if SIZEOF_LONG <= SIZEOF_VOID_P - assert(_Py_IS_ALIGNED(dest, SIZEOF_LONG)); - if (_Py_IS_ALIGNED(p, SIZEOF_LONG)) { +#if SIZEOF_SIZE_T <= SIZEOF_VOID_P + assert(_Py_IS_ALIGNED(dest, SIZEOF_SIZE_T)); + if (_Py_IS_ALIGNED(p, SIZEOF_SIZE_T)) { /* Fast path, see in STRINGLIB(utf8_decode) for an explanation. */ /* Help allocation */ const char *_p = p; Py_UCS1 * q = dest; while (_p < aligned_end) { - unsigned long value = *(const unsigned long *) _p; + size_t value = *(const size_t *) _p; if (value & ASCII_CHAR_MASK) break; - *((unsigned long *)q) = value; - _p += SIZEOF_LONG; - q += SIZEOF_LONG; + *((size_t *)q) = value; + _p += SIZEOF_SIZE_T; + q += SIZEOF_SIZE_T; } p = _p; while (p < end) { @@ -5078,14 +5078,14 @@ ascii_decode(const char *start, const char *end, Py_UCS1 *dest) while (p < end) { /* Fast path, see in STRINGLIB(utf8_decode) in stringlib/codecs.h for an explanation. */ - if (_Py_IS_ALIGNED(p, SIZEOF_LONG)) { + if (_Py_IS_ALIGNED(p, SIZEOF_SIZE_T)) { /* Help allocation */ const char *_p = p; while (_p < aligned_end) { - unsigned long value = *(const unsigned long *) _p; + size_t value = *(const size_t *) _p; if (value & ASCII_CHAR_MASK) break; - _p += SIZEOF_LONG; + _p += SIZEOF_SIZE_T; } p = _p; if (_p == end) From b6d3e59bcedf768d74739ed3a18cfc46164a0b94 Mon Sep 17 00:00:00 2001 From: scaramallion Date: Mon, 19 Oct 2020 01:49:48 +1100 Subject: [PATCH 0281/1261] bpo-41966: Fix pickling pure datetime.time subclasses (GH-22731) --- Lib/datetime.py | 2 +- Lib/test/datetimetester.py | 3 +++ Misc/ACKS | 1 + .../next/Library/2020-10-17-07-52-53.bpo-41966.gwEQRZ.rst | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-17-07-52-53.bpo-41966.gwEQRZ.rst diff --git a/Lib/datetime.py b/Lib/datetime.py index ea86bcb8b2388a..b896b94b0fe0e4 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -1548,7 +1548,7 @@ def __setstate(self, string, tzinfo): self._tzinfo = tzinfo def __reduce_ex__(self, protocol): - return (time, self._getstate(protocol)) + return (self.__class__, self._getstate(protocol)) def __reduce__(self): return self.__reduce_ex__(2) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 8b61c26f9e5c24..775d3151ae2902 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -1781,6 +1781,7 @@ def test_pickling_subclass_date(self): green = pickler.dumps(orig, proto) derived = unpickler.loads(green) self.assertEqual(orig, derived) + self.assertTrue(isinstance(derived, SubclassDate)) def test_backdoor_resistance(self): # For fast unpickling, the constructor accepts a pickle byte string. @@ -2308,6 +2309,7 @@ def test_pickling_subclass_datetime(self): green = pickler.dumps(orig, proto) derived = unpickler.loads(green) self.assertEqual(orig, derived) + self.assertTrue(isinstance(derived, SubclassDatetime)) def test_compat_unpickle(self): tests = [ @@ -3357,6 +3359,7 @@ def test_pickling_subclass_time(self): green = pickler.dumps(orig, proto) derived = unpickler.loads(green) self.assertEqual(orig, derived) + self.assertTrue(isinstance(derived, SubclassTime)) def test_compat_unpickle(self): tests = [ diff --git a/Misc/ACKS b/Misc/ACKS index 7f4a9bcbc0f8cd..d81d0a255145cb 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -787,6 +787,7 @@ Meador Inge Peter Ingebretson Tony Ingraldi John Interrante +Dean Inwood Bob Ippolito Roger Irwin Atsuo Ishimoto diff --git a/Misc/NEWS.d/next/Library/2020-10-17-07-52-53.bpo-41966.gwEQRZ.rst b/Misc/NEWS.d/next/Library/2020-10-17-07-52-53.bpo-41966.gwEQRZ.rst new file mode 100644 index 00000000000000..0e7fad40077be0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-17-07-52-53.bpo-41966.gwEQRZ.rst @@ -0,0 +1,2 @@ +Fix pickling pure Python :class:`datetime.time` subclasses. Patch by Dean +Inwood. From 71acb735b0fba974e3ca8f7f2bbf7cba35a7af85 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 18 Oct 2020 17:54:06 +0300 Subject: [PATCH 0282/1261] bpo-20184: Convert termios to Argument Clinic. (GH-22693) --- Modules/clinic/termios.c.h | 225 +++++++++++++++++++++++++++++++++++++ Modules/termios.c | 202 +++++++++++++++++---------------- 2 files changed, 328 insertions(+), 99 deletions(-) create mode 100644 Modules/clinic/termios.c.h diff --git a/Modules/clinic/termios.c.h b/Modules/clinic/termios.c.h new file mode 100644 index 00000000000000..a45c1f64262f8c --- /dev/null +++ b/Modules/clinic/termios.c.h @@ -0,0 +1,225 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(termios_tcgetattr__doc__, +"tcgetattr($module, fd, /)\n" +"--\n" +"\n" +"Get the tty attributes for file descriptor fd.\n" +"\n" +"Returns a list [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]\n" +"where cc is a list of the tty special characters (each a string of\n" +"length 1, except the items with indices VMIN and VTIME, which are\n" +"integers when these fields are defined). The interpretation of the\n" +"flags and the speeds as well as the indexing in the cc array must be\n" +"done using the symbolic constants defined in this module."); + +#define TERMIOS_TCGETATTR_METHODDEF \ + {"tcgetattr", (PyCFunction)termios_tcgetattr, METH_O, termios_tcgetattr__doc__}, + +static PyObject * +termios_tcgetattr_impl(PyObject *module, int fd); + +static PyObject * +termios_tcgetattr(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int fd; + + if (!_PyLong_FileDescriptor_Converter(arg, &fd)) { + goto exit; + } + return_value = termios_tcgetattr_impl(module, fd); + +exit: + return return_value; +} + +PyDoc_STRVAR(termios_tcsetattr__doc__, +"tcsetattr($module, fd, when, attributes, /)\n" +"--\n" +"\n" +"Set the tty attributes for file descriptor fd.\n" +"\n" +"The attributes to be set are taken from the attributes argument, which\n" +"is a list like the one returned by tcgetattr(). The when argument\n" +"determines when the attributes are changed: termios.TCSANOW to\n" +"change immediately, termios.TCSADRAIN to change after transmitting all\n" +"queued output, or termios.TCSAFLUSH to change after transmitting all\n" +"queued output and discarding all queued input."); + +#define TERMIOS_TCSETATTR_METHODDEF \ + {"tcsetattr", (PyCFunction)(void(*)(void))termios_tcsetattr, METH_FASTCALL, termios_tcsetattr__doc__}, + +static PyObject * +termios_tcsetattr_impl(PyObject *module, int fd, int when, PyObject *term); + +static PyObject * +termios_tcsetattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int fd; + int when; + PyObject *term; + + if (!_PyArg_CheckPositional("tcsetattr", nargs, 3, 3)) { + goto exit; + } + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { + goto exit; + } + when = _PyLong_AsInt(args[1]); + if (when == -1 && PyErr_Occurred()) { + goto exit; + } + term = args[2]; + return_value = termios_tcsetattr_impl(module, fd, when, term); + +exit: + return return_value; +} + +PyDoc_STRVAR(termios_tcsendbreak__doc__, +"tcsendbreak($module, fd, duration, /)\n" +"--\n" +"\n" +"Send a break on file descriptor fd.\n" +"\n" +"A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n" +"has a system dependent meaning."); + +#define TERMIOS_TCSENDBREAK_METHODDEF \ + {"tcsendbreak", (PyCFunction)(void(*)(void))termios_tcsendbreak, METH_FASTCALL, termios_tcsendbreak__doc__}, + +static PyObject * +termios_tcsendbreak_impl(PyObject *module, int fd, int duration); + +static PyObject * +termios_tcsendbreak(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int fd; + int duration; + + if (!_PyArg_CheckPositional("tcsendbreak", nargs, 2, 2)) { + goto exit; + } + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { + goto exit; + } + duration = _PyLong_AsInt(args[1]); + if (duration == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = termios_tcsendbreak_impl(module, fd, duration); + +exit: + return return_value; +} + +PyDoc_STRVAR(termios_tcdrain__doc__, +"tcdrain($module, fd, /)\n" +"--\n" +"\n" +"Wait until all output written to file descriptor fd has been transmitted."); + +#define TERMIOS_TCDRAIN_METHODDEF \ + {"tcdrain", (PyCFunction)termios_tcdrain, METH_O, termios_tcdrain__doc__}, + +static PyObject * +termios_tcdrain_impl(PyObject *module, int fd); + +static PyObject * +termios_tcdrain(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int fd; + + if (!_PyLong_FileDescriptor_Converter(arg, &fd)) { + goto exit; + } + return_value = termios_tcdrain_impl(module, fd); + +exit: + return return_value; +} + +PyDoc_STRVAR(termios_tcflush__doc__, +"tcflush($module, fd, queue, /)\n" +"--\n" +"\n" +"Discard queued data on file descriptor fd.\n" +"\n" +"The queue selector specifies which queue: termios.TCIFLUSH for the input\n" +"queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n" +"both queues."); + +#define TERMIOS_TCFLUSH_METHODDEF \ + {"tcflush", (PyCFunction)(void(*)(void))termios_tcflush, METH_FASTCALL, termios_tcflush__doc__}, + +static PyObject * +termios_tcflush_impl(PyObject *module, int fd, int queue); + +static PyObject * +termios_tcflush(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int fd; + int queue; + + if (!_PyArg_CheckPositional("tcflush", nargs, 2, 2)) { + goto exit; + } + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { + goto exit; + } + queue = _PyLong_AsInt(args[1]); + if (queue == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = termios_tcflush_impl(module, fd, queue); + +exit: + return return_value; +} + +PyDoc_STRVAR(termios_tcflow__doc__, +"tcflow($module, fd, action, /)\n" +"--\n" +"\n" +"Suspend or resume input or output on file descriptor fd.\n" +"\n" +"The action argument can be termios.TCOOFF to suspend output,\n" +"termios.TCOON to restart output, termios.TCIOFF to suspend input,\n" +"or termios.TCION to restart input."); + +#define TERMIOS_TCFLOW_METHODDEF \ + {"tcflow", (PyCFunction)(void(*)(void))termios_tcflow, METH_FASTCALL, termios_tcflow__doc__}, + +static PyObject * +termios_tcflow_impl(PyObject *module, int fd, int action); + +static PyObject * +termios_tcflow(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int fd; + int action; + + if (!_PyArg_CheckPositional("tcflow", nargs, 2, 2)) { + goto exit; + } + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { + goto exit; + } + action = _PyLong_AsInt(args[1]); + if (action == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = termios_tcflow_impl(module, fd, action); + +exit: + return return_value; +} +/*[clinic end generated code: output=a129179f1e2545cc input=a9049054013a1b77]*/ diff --git a/Modules/termios.c b/Modules/termios.c index 79b60ffaaba4a3..a6649598ec1710 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -29,6 +29,13 @@ #include #endif +/*[clinic input] +module termios +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=01105c85d0ca7252]*/ + +#include "clinic/termios.c.h" + PyDoc_STRVAR(termios__doc__, "This module provides an interface to the Posix calls for tty I/O control.\n\ For a complete description of these calls, see the Posix or Unix manual\n\ @@ -53,26 +60,26 @@ get_termios_state(PyObject *module) static struct PyModuleDef termiosmodule; -PyDoc_STRVAR(termios_tcgetattr__doc__, -"tcgetattr(fd) -> list_of_attrs\n\ -\n\ -Get the tty attributes for file descriptor fd, as follows:\n\ -[iflag, oflag, cflag, lflag, ispeed, ospeed, cc] where cc is a list\n\ -of the tty special characters (each a string of length 1, except the items\n\ -with indices VMIN and VTIME, which are integers when these fields are\n\ -defined). The interpretation of the flags and the speeds as well as the\n\ -indexing in the cc array must be done using the symbolic constants defined\n\ -in this module."); +/*[clinic input] +termios.tcgetattr + + fd: fildes + / + +Get the tty attributes for file descriptor fd. + +Returns a list [iflag, oflag, cflag, lflag, ispeed, ospeed, cc] +where cc is a list of the tty special characters (each a string of +length 1, except the items with indices VMIN and VTIME, which are +integers when these fields are defined). The interpretation of the +flags and the speeds as well as the indexing in the cc array must be +done using the symbolic constants defined in this module. +[clinic start generated code]*/ static PyObject * -termios_tcgetattr(PyObject *module, PyObject *args) +termios_tcgetattr_impl(PyObject *module, int fd) +/*[clinic end generated code: output=2b3da39db870e629 input=54dad9779ebe74b1]*/ { - int fd; - if (!PyArg_ParseTuple(args, "O&:tcgetattr", - _PyLong_FileDescriptor_Converter, (void*)&fd)) { - return NULL; - } - termiosmodulestate *state = PyModule_GetState(module); struct termios mode; if (tcgetattr(fd, &mode) == -1) { @@ -131,27 +138,28 @@ termios_tcgetattr(PyObject *module, PyObject *args) return NULL; } -PyDoc_STRVAR(termios_tcsetattr__doc__, -"tcsetattr(fd, when, attributes) -> None\n\ -\n\ -Set the tty attributes for file descriptor fd.\n\ -The attributes to be set are taken from the attributes argument, which\n\ -is a list like the one returned by tcgetattr(). The when argument\n\ -determines when the attributes are changed: termios.TCSANOW to\n\ -change immediately, termios.TCSADRAIN to change after transmitting all\n\ -queued output, or termios.TCSAFLUSH to change after transmitting all\n\ -queued output and discarding all queued input. "); +/*[clinic input] +termios.tcsetattr + + fd: fildes + when: int + attributes as term: object + / + +Set the tty attributes for file descriptor fd. + +The attributes to be set are taken from the attributes argument, which +is a list like the one returned by tcgetattr(). The when argument +determines when the attributes are changed: termios.TCSANOW to +change immediately, termios.TCSADRAIN to change after transmitting all +queued output, or termios.TCSAFLUSH to change after transmitting all +queued output and discarding all queued input. +[clinic start generated code]*/ static PyObject * -termios_tcsetattr(PyObject *module, PyObject *args) +termios_tcsetattr_impl(PyObject *module, int fd, int when, PyObject *term) +/*[clinic end generated code: output=bcd2b0a7b98a4bf5 input=5dafabdd5a08f018]*/ { - int fd, when; - PyObject *term; - if (!PyArg_ParseTuple(args, "O&iO:tcsetattr", - _PyLong_FileDescriptor_Converter, &fd, &when, &term)) { - return NULL; - } - if (!PyList_Check(term) || PyList_Size(term) != 7) { PyErr_SetString(PyExc_TypeError, "tcsetattr, arg 3: must be 7 element list"); @@ -209,22 +217,23 @@ termios_tcsetattr(PyObject *module, PyObject *args) Py_RETURN_NONE; } -PyDoc_STRVAR(termios_tcsendbreak__doc__, -"tcsendbreak(fd, duration) -> None\n\ -\n\ -Send a break on file descriptor fd.\n\ -A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n\ -has a system dependent meaning."); +/*[clinic input] +termios.tcsendbreak + + fd: fildes + duration: int + / + +Send a break on file descriptor fd. + +A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration +has a system dependent meaning. +[clinic start generated code]*/ static PyObject * -termios_tcsendbreak(PyObject *module, PyObject *args) +termios_tcsendbreak_impl(PyObject *module, int fd, int duration) +/*[clinic end generated code: output=5945f589b5d3ac66 input=dc2f32417691f8ed]*/ { - int fd, duration; - if (!PyArg_ParseTuple(args, "O&i:tcsendbreak", - _PyLong_FileDescriptor_Converter, &fd, &duration)) { - return NULL; - } - termiosmodulestate *state = PyModule_GetState(module); if (tcsendbreak(fd, duration) == -1) { return PyErr_SetFromErrno(state->TermiosError); @@ -233,20 +242,19 @@ termios_tcsendbreak(PyObject *module, PyObject *args) Py_RETURN_NONE; } -PyDoc_STRVAR(termios_tcdrain__doc__, -"tcdrain(fd) -> None\n\ -\n\ -Wait until all output written to file descriptor fd has been transmitted."); +/*[clinic input] +termios.tcdrain + + fd: fildes + / + +Wait until all output written to file descriptor fd has been transmitted. +[clinic start generated code]*/ static PyObject * -termios_tcdrain(PyObject *module, PyObject *args) +termios_tcdrain_impl(PyObject *module, int fd) +/*[clinic end generated code: output=5fd86944c6255955 input=c99241b140b32447]*/ { - int fd; - if (!PyArg_ParseTuple(args, "O&:tcdrain", - _PyLong_FileDescriptor_Converter, &fd)) { - return NULL; - } - termiosmodulestate *state = PyModule_GetState(module); if (tcdrain(fd) == -1) { return PyErr_SetFromErrno(state->TermiosError); @@ -255,23 +263,24 @@ termios_tcdrain(PyObject *module, PyObject *args) Py_RETURN_NONE; } -PyDoc_STRVAR(termios_tcflush__doc__, -"tcflush(fd, queue) -> None\n\ -\n\ -Discard queued data on file descriptor fd.\n\ -The queue selector specifies which queue: termios.TCIFLUSH for the input\n\ -queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n\ -both queues. "); +/*[clinic input] +termios.tcflush + + fd: fildes + queue: int + / + +Discard queued data on file descriptor fd. + +The queue selector specifies which queue: termios.TCIFLUSH for the input +queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for +both queues. +[clinic start generated code]*/ static PyObject * -termios_tcflush(PyObject *module, PyObject *args) +termios_tcflush_impl(PyObject *module, int fd, int queue) +/*[clinic end generated code: output=2424f80312ec2f21 input=0f7d08122ddc07b5]*/ { - int fd, queue; - if (!PyArg_ParseTuple(args, "O&i:tcflush", - _PyLong_FileDescriptor_Converter, &fd, &queue)) { - return NULL; - } - termiosmodulestate *state = PyModule_GetState(module); if (tcflush(fd, queue) == -1) { return PyErr_SetFromErrno(state->TermiosError); @@ -280,23 +289,24 @@ termios_tcflush(PyObject *module, PyObject *args) Py_RETURN_NONE; } -PyDoc_STRVAR(termios_tcflow__doc__, -"tcflow(fd, action) -> None\n\ -\n\ -Suspend or resume input or output on file descriptor fd.\n\ -The action argument can be termios.TCOOFF to suspend output,\n\ -termios.TCOON to restart output, termios.TCIOFF to suspend input,\n\ -or termios.TCION to restart input."); +/*[clinic input] +termios.tcflow + + fd: fildes + action: int + / + +Suspend or resume input or output on file descriptor fd. + +The action argument can be termios.TCOOFF to suspend output, +termios.TCOON to restart output, termios.TCIOFF to suspend input, +or termios.TCION to restart input. +[clinic start generated code]*/ static PyObject * -termios_tcflow(PyObject *module, PyObject *args) +termios_tcflow_impl(PyObject *module, int fd, int action) +/*[clinic end generated code: output=afd10928e6ea66eb input=c6aff0640b6efd9c]*/ { - int fd, action; - if (!PyArg_ParseTuple(args, "O&i:tcflow", - _PyLong_FileDescriptor_Converter, &fd, &action)) { - return NULL; - } - termiosmodulestate *state = PyModule_GetState(module); if (tcflow(fd, action) == -1) { return PyErr_SetFromErrno(state->TermiosError); @@ -307,18 +317,12 @@ termios_tcflow(PyObject *module, PyObject *args) static PyMethodDef termios_methods[] = { - {"tcgetattr", termios_tcgetattr, - METH_VARARGS, termios_tcgetattr__doc__}, - {"tcsetattr", termios_tcsetattr, - METH_VARARGS, termios_tcsetattr__doc__}, - {"tcsendbreak", termios_tcsendbreak, - METH_VARARGS, termios_tcsendbreak__doc__}, - {"tcdrain", termios_tcdrain, - METH_VARARGS, termios_tcdrain__doc__}, - {"tcflush", termios_tcflush, - METH_VARARGS, termios_tcflush__doc__}, - {"tcflow", termios_tcflow, - METH_VARARGS, termios_tcflow__doc__}, + TERMIOS_TCGETATTR_METHODDEF + TERMIOS_TCSETATTR_METHODDEF + TERMIOS_TCSENDBREAK_METHODDEF + TERMIOS_TCDRAIN_METHODDEF + TERMIOS_TCFLUSH_METHODDEF + TERMIOS_TCFLOW_METHODDEF {NULL, NULL} }; From 709baad9838095aa5dafee6f06076d44b69e49df Mon Sep 17 00:00:00 2001 From: Shantanu <12621235+hauntsaninja@users.noreply.github.com> Date: Sun, 18 Oct 2020 08:39:26 -0700 Subject: [PATCH 0283/1261] 3.9 whatsnew: fix bpo issue for AST change (GH-22742) --- Doc/whatsnew/3.9.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 22fdbd565a1667..89017981f6d498 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -766,7 +766,7 @@ Deprecated and will be removed in future Python versions. ``value`` itself should be used instead of ``Index(value)``. ``Tuple(slices, Load())`` should be used instead of ``ExtSlice(slices)``. - (Contributed by Serhiy Storchaka in :issue:`32892`.) + (Contributed by Serhiy Storchaka in :issue:`34822`.) * :mod:`ast` classes ``Suite``, ``Param``, ``AugLoad`` and ``AugStore`` are considered deprecated and will be removed in future Python versions. From 26030be11ef11771059e547e472d14807924e883 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Sun, 18 Oct 2020 18:01:15 +0100 Subject: [PATCH 0284/1261] bpo-28660: Make TextWrapper break long words on hyphens (GH-22721) --- Lib/test/test_textwrap.py | 72 +++++++++++++++++++ Lib/textwrap.py | 12 +++- .../2020-10-16-16-08-04.bpo-28660.eX9pvD.rst | 1 + 3 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-16-16-08-04.bpo-28660.eX9pvD.rst diff --git a/Lib/test/test_textwrap.py b/Lib/test/test_textwrap.py index ed97f70ba1fa40..dfbc2b93dfc0d6 100644 --- a/Lib/test/test_textwrap.py +++ b/Lib/test/test_textwrap.py @@ -640,6 +640,78 @@ def test_max_lines_long(self): max_lines=4) +class LongWordWithHyphensTestCase(BaseTestCase): + def setUp(self): + self.wrapper = TextWrapper() + self.text1 = '''\ +We used enyzme 2-succinyl-6-hydroxy-2,4-cyclohexadiene-1-carboxylate synthase. +''' + self.text2 = '''\ +1234567890-1234567890--this_is_a_very_long_option_indeed-good-bye" +''' + + def test_break_long_words_on_hyphen(self): + expected = ['We used enyzme 2-succinyl-6-hydroxy-2,4-', + 'cyclohexadiene-1-carboxylate synthase.'] + self.check_wrap(self.text1, 50, expected) + + expected = ['We used', 'enyzme 2-', 'succinyl-', '6-hydroxy-', '2,4-', + 'cyclohexad', 'iene-1-', 'carboxylat', 'e', 'synthase.'] + self.check_wrap(self.text1, 10, expected) + + expected = ['1234567890', '-123456789', '0--this_is', '_a_very_lo', + 'ng_option_', 'indeed-', 'good-bye"'] + self.check_wrap(self.text2, 10, expected) + + def test_break_long_words_not_on_hyphen(self): + expected = ['We used enyzme 2-succinyl-6-hydroxy-2,4-cyclohexad', + 'iene-1-carboxylate synthase.'] + self.check_wrap(self.text1, 50, expected, break_on_hyphens=False) + + expected = ['We used', 'enyzme 2-s', 'uccinyl-6-', 'hydroxy-2,', + '4-cyclohex', 'adiene-1-c', 'arboxylate', 'synthase.'] + self.check_wrap(self.text1, 10, expected, break_on_hyphens=False) + + expected = ['1234567890', '-123456789', '0--this_is', '_a_very_lo', + 'ng_option_', 'indeed-', 'good-bye"'] + self.check_wrap(self.text2, 10, expected) + + def test_break_on_hyphen_but_not_long_words(self): + expected = ['We used enyzme', + '2-succinyl-6-hydroxy-2,4-cyclohexadiene-1-carboxylate', + 'synthase.'] + + self.check_wrap(self.text1, 50, expected, break_long_words=False) + + expected = ['We used', 'enyzme', + '2-succinyl-6-hydroxy-2,4-cyclohexadiene-1-carboxylate', + 'synthase.'] + self.check_wrap(self.text1, 10, expected, break_long_words=False) + + expected = ['1234567890', '-123456789', '0--this_is', '_a_very_lo', + 'ng_option_', 'indeed-', 'good-bye"'] + self.check_wrap(self.text2, 10, expected) + + + def test_do_not_break_long_words_or_on_hyphens(self): + expected = ['We used enyzme', + '2-succinyl-6-hydroxy-2,4-cyclohexadiene-1-carboxylate', + 'synthase.'] + self.check_wrap(self.text1, 50, expected, + break_long_words=False, + break_on_hyphens=False) + + expected = ['We used', 'enyzme', + '2-succinyl-6-hydroxy-2,4-cyclohexadiene-1-carboxylate', + 'synthase.'] + self.check_wrap(self.text1, 10, expected, + break_long_words=False, + break_on_hyphens=False) + + expected = ['1234567890', '-123456789', '0--this_is', '_a_very_lo', + 'ng_option_', 'indeed-', 'good-bye"'] + self.check_wrap(self.text2, 10, expected) + class IndentTestCases(BaseTestCase): # called before each test method diff --git a/Lib/textwrap.py b/Lib/textwrap.py index 30e693c8de0354..841de9baecf5d8 100644 --- a/Lib/textwrap.py +++ b/Lib/textwrap.py @@ -215,8 +215,16 @@ def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width): # If we're allowed to break long words, then do so: put as much # of the next chunk onto the current line as will fit. if self.break_long_words: - cur_line.append(reversed_chunks[-1][:space_left]) - reversed_chunks[-1] = reversed_chunks[-1][space_left:] + end = space_left + chunk = reversed_chunks[-1] + if self.break_on_hyphens and len(chunk) > space_left: + # break after last hyphen, but only if there are + # non-hyphens before it + hyphen = chunk.rfind('-', 0, space_left) + if hyphen > 0 and any(c != '-' for c in chunk[:hyphen]): + end = hyphen + 1 + cur_line.append(chunk[:end]) + reversed_chunks[-1] = chunk[end:] # Otherwise, we have to preserve the long word intact. Only add # it to the current line if there's nothing already there -- diff --git a/Misc/NEWS.d/next/Library/2020-10-16-16-08-04.bpo-28660.eX9pvD.rst b/Misc/NEWS.d/next/Library/2020-10-16-16-08-04.bpo-28660.eX9pvD.rst new file mode 100644 index 00000000000000..d67993492f9ffe --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-16-16-08-04.bpo-28660.eX9pvD.rst @@ -0,0 +1 @@ +:func:`textwrap.wrap` now attempts to break long words after hyphens when ``break_long_words=True`` and ``break_on_hyphens=True``. From a9d177d31c86acf18a9e1071b0f6239a776f220c Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 18 Oct 2020 13:48:31 -0700 Subject: [PATCH 0285/1261] bpo-40492: Fix --outfile with relative path when the program changes it working dir (GH-19910) --- Lib/cProfile.py | 5 +++++ Lib/profile.py | 5 +++++ Lib/test/test_profile.py | 16 +++++++++++++++- .../2020-05-04-12-16-00.bpo-40492.ONk9Na.rst | 3 +++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst diff --git a/Lib/cProfile.py b/Lib/cProfile.py index 4f202038d61260..59b4699feb5062 100755 --- a/Lib/cProfile.py +++ b/Lib/cProfile.py @@ -152,6 +152,11 @@ def main(): (options, args) = parser.parse_args() sys.argv[:] = args + # The script that we're profiling may chdir, so capture the absolute path + # to the output file at startup. + if options.outfile is not None: + options.outfile = os.path.abspath(options.outfile) + if len(args) > 0: if options.module: code = "run_module(modname, run_name='__main__')" diff --git a/Lib/profile.py b/Lib/profile.py index aad458dc951f41..5cb017ed830099 100755 --- a/Lib/profile.py +++ b/Lib/profile.py @@ -571,6 +571,11 @@ def main(): (options, args) = parser.parse_args() sys.argv[:] = args + # The script that we're profiling may chdir, so capture the absolute path + # to the output file at startup. + if options.outfile is not None: + options.outfile = os.path.abspath(options.outfile) + if len(args) > 0: if options.module: import runpy diff --git a/Lib/test/test_profile.py b/Lib/test/test_profile.py index 738be85bedf3c9..1bdf30acbb54b2 100644 --- a/Lib/test/test_profile.py +++ b/Lib/test/test_profile.py @@ -7,7 +7,7 @@ from difflib import unified_diff from io import StringIO from test.support import run_unittest -from test.support.os_helper import TESTFN, unlink +from test.support.os_helper import TESTFN, unlink, temp_dir, change_cwd from contextlib import contextmanager import profile @@ -112,6 +112,20 @@ def test_run_profile_as_module(self): assert_python_ok('-m', self.profilermodule.__name__, '-m', 'timeit', '-n', '1') + def test_output_file_when_changing_directory(self): + with temp_dir() as tmpdir, change_cwd(tmpdir): + os.mkdir('dest') + with open('demo.py', 'w') as f: + f.write('import os; os.chdir("dest")') + + assert_python_ok( + '-m', self.profilermodule.__name__, + '-o', 'out.pstats', + 'demo.py', + ) + + self.assertTrue(os.path.exists('out.pstats')) + def regenerate_expected_output(filename, cls): filename = filename.rstrip('co') diff --git a/Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst b/Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst new file mode 100644 index 00000000000000..86bc08c79e21e2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst @@ -0,0 +1,3 @@ +Fix ``--outfile`` for :mod:`cProfile` / :mod:`profile` not writing the output +file in the original directory when the program being profiled changes the +working directory. PR by Anthony Sottile. From 29804aae3df0a1cd24beb01632a89c9dae06d9ae Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Mon, 19 Oct 2020 04:14:11 +0300 Subject: [PATCH 0286/1261] bpo-40484: Document compiler flags under AST module (GH-19885) Co-authored-by: Pablo Galindo Co-authored-by: Shantanu --- Doc/library/ast.rst | 28 ++++++++++++++++++++++++++++ Doc/library/functions.rst | 38 ++++++++++++++++++-------------------- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 62138efcce9110..f95ee1d5c69c21 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -1756,6 +1756,34 @@ and classes for traversing abstract syntax trees: Added the *indent* option. +.. _ast-compiler-flags: + +Compiler Flags +-------------- + +The following flags may be passed to :func:`compile` in order to change +effects on the compilation of a program: + +.. data:: PyCF_ALLOW_TOP_LEVEL_AWAIT + + Enables support for top-level ``await``, ``async for``, ``async with`` + and async comprehensions. + + .. versionadded:: 3.8 + +.. data:: PyCF_ONLY_AST + + Generates and returns an abstract syntax tree instead of returning a + compiled code object. + +.. data:: PyCF_TYPE_COMMENTS + + Enables support for :pep:`484` and :pep:`526` style type comments + (``# type: ``, ``# type: ignore ``). + + .. versionadded:: 3.8 + + .. _ast-cli: Command-Line Usage diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 263c52a63dea84..a052e724c5ebef 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -259,26 +259,24 @@ are always available. They are listed here in alphabetical order. interactive statement (in the latter case, expression statements that evaluate to something other than ``None`` will be printed). - The optional arguments *flags* and *dont_inherit* control which :ref:`future - statements ` affect the compilation of *source*. If neither - is present (or both are zero) the code is compiled with those future - statements that are in effect in the code that is calling :func:`compile`. If the - *flags* argument is given and *dont_inherit* is not (or is zero) then the - future statements specified by the *flags* argument are used in addition to - those that would be used anyway. If *dont_inherit* is a non-zero integer then - the *flags* argument is it -- the future statements in effect around the call - to compile are ignored. - - Future statements are specified by bits which can be bitwise ORed together to - specify multiple statements. The bitfield required to specify a given feature - can be found as the :attr:`~__future__._Feature.compiler_flag` attribute on - the :class:`~__future__._Feature` instance in the :mod:`__future__` module. - - The optional argument *flags* also controls whether the compiled source is - allowed to contain top-level ``await``, ``async for`` and ``async with``. - When the bit ``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` is set, the return code - object has ``CO_COROUTINE`` set in ``co_code``, and can be interactively - executed via ``await eval(code_object)``. + The optional argument *flags* and *dont_inherit* controls which + :ref:`compiler options ` should be activated + and which :ref:`future features ` should be allowed. If neither + is present (or both are zero) the code is compiled with the same flags that + affect the code that is calling :func:`compile`. If the *flags* + argument is given and *dont_inherit* is not (or is zero) then the compiler + options and the future statements specified by the *flags* argument are used + in addition to those that would be used anyway. If *dont_inherit* is a + non-zero integer then the *flags* argument is it -- the flags (future + features and compiler options) in the surrounding code are ignored. + + Compiler options and future statements are specified by bits which can be + bitwise ORed together to specify multiple options. The bitfield required to + specify a given future feature can be found as the + :attr:`~__future__._Feature.compiler_flag` attribute on the + :class:`~__future__._Feature` instance in the :mod:`__future__` module. + :ref:`Compiler flags ` can be found in :mod:`ast` + module, with ``PyCF_`` prefix. The argument *optimize* specifies the optimization level of the compiler; the default value of ``-1`` selects the optimization level of the interpreter as From e1a0fce81d043ace7bdd743569e4f04116222798 Mon Sep 17 00:00:00 2001 From: Bar Harel Date: Mon, 19 Oct 2020 10:33:43 +0300 Subject: [PATCH 0287/1261] bpo-19270: Fixed sched.scheduler.cancel to cancel correct event (GH-22729) --- Lib/sched.py | 20 +++++++++---------- Lib/test/test_sched.py | 11 ++++++++++ .../2020-10-16-22-48-01.bpo-19270.jd_gkA.rst | 2 ++ 3 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-16-22-48-01.bpo-19270.jd_gkA.rst diff --git a/Lib/sched.py b/Lib/sched.py index ff87874a3a4b70..14613cf29874da 100644 --- a/Lib/sched.py +++ b/Lib/sched.py @@ -26,23 +26,19 @@ import time import heapq from collections import namedtuple +from itertools import count import threading from time import monotonic as _time __all__ = ["scheduler"] -class Event(namedtuple('Event', 'time, priority, action, argument, kwargs')): - __slots__ = [] - def __eq__(s, o): return (s.time, s.priority) == (o.time, o.priority) - def __lt__(s, o): return (s.time, s.priority) < (o.time, o.priority) - def __le__(s, o): return (s.time, s.priority) <= (o.time, o.priority) - def __gt__(s, o): return (s.time, s.priority) > (o.time, o.priority) - def __ge__(s, o): return (s.time, s.priority) >= (o.time, o.priority) - +Event = namedtuple('Event', 'time, priority, sequence, action, argument, kwargs') Event.time.__doc__ = ('''Numeric type compatible with the return value of the timefunc function passed to the constructor.''') Event.priority.__doc__ = ('''Events scheduled for the same time will be executed in the order of their priority.''') +Event.sequence.__doc__ = ('''A continually increasing sequence number that + separates events if time and priority are equal.''') Event.action.__doc__ = ('''Executing the event means executing action(*argument, **kwargs)''') Event.argument.__doc__ = ('''argument is a sequence holding the positional @@ -61,6 +57,7 @@ def __init__(self, timefunc=_time, delayfunc=time.sleep): self._lock = threading.RLock() self.timefunc = timefunc self.delayfunc = delayfunc + self._sequence_generator = count() def enterabs(self, time, priority, action, argument=(), kwargs=_sentinel): """Enter a new event in the queue at an absolute time. @@ -71,8 +68,10 @@ def enterabs(self, time, priority, action, argument=(), kwargs=_sentinel): """ if kwargs is _sentinel: kwargs = {} - event = Event(time, priority, action, argument, kwargs) + with self._lock: + event = Event(time, priority, next(self._sequence_generator), + action, argument, kwargs) heapq.heappush(self._queue, event) return event # The ID @@ -136,7 +135,8 @@ def run(self, blocking=True): with lock: if not q: break - time, priority, action, argument, kwargs = q[0] + (time, priority, sequence, action, + argument, kwargs) = q[0] now = timefunc() if time > now: delay = True diff --git a/Lib/test/test_sched.py b/Lib/test/test_sched.py index 491d7b3a745b4d..7ae7baae85e2c9 100644 --- a/Lib/test/test_sched.py +++ b/Lib/test/test_sched.py @@ -142,6 +142,17 @@ def test_cancel_concurrent(self): self.assertTrue(q.empty()) self.assertEqual(timer.time(), 4) + def test_cancel_correct_event(self): + # bpo-19270 + events = [] + scheduler = sched.scheduler() + scheduler.enterabs(1, 1, events.append, ("a",)) + b = scheduler.enterabs(1, 1, events.append, ("b",)) + scheduler.enterabs(1, 1, events.append, ("c",)) + scheduler.cancel(b) + scheduler.run() + self.assertEqual(events, ["a", "c"]) + def test_empty(self): l = [] fun = lambda x: l.append(x) diff --git a/Misc/NEWS.d/next/Library/2020-10-16-22-48-01.bpo-19270.jd_gkA.rst b/Misc/NEWS.d/next/Library/2020-10-16-22-48-01.bpo-19270.jd_gkA.rst new file mode 100644 index 00000000000000..6330a91a44c544 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-16-22-48-01.bpo-19270.jd_gkA.rst @@ -0,0 +1,2 @@ +:meth:`sched.scheduler.cancel()` will now cancel the correct event, if two +events with same priority are scheduled for the same time. Patch by Bar Harel. From c76fabc4dad8ec915766a45598c13bd902e4b18e Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Mon, 19 Oct 2020 13:20:33 +0100 Subject: [PATCH 0288/1261] Correct name of bytecode in change note. (GH-22723) --- Misc/NEWS.d/3.9.0a2.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/3.9.0a2.rst b/Misc/NEWS.d/3.9.0a2.rst index 1fd23b763e2a1e..226ea0d3df2243 100644 --- a/Misc/NEWS.d/3.9.0a2.rst +++ b/Misc/NEWS.d/3.9.0a2.rst @@ -236,7 +236,7 @@ coroutine of an asynchronous generator. Removed WITH_CLEANUP_START, WITH_CLEANUP_FINISH, BEGIN_FINALLY, END_FINALLY, CALL_FINALLY and POP_FINALLY bytecodes. Replaced with RERAISE and -WITH_EXCEPT_FINISH bytecodes. The compiler now generates different code for +WITH_EXCEPT_START bytecodes. The compiler now generates different code for exceptional and non-exceptional branches for 'with' and 'try-except' statements. For 'try-finally' statements the 'finally' block is replicated for each exit from the 'try' body. From 1c0fc508b8714185f28564e591feb6911981ef11 Mon Sep 17 00:00:00 2001 From: Saiyang Gou Date: Mon, 19 Oct 2020 07:52:42 -0700 Subject: [PATCH 0289/1261] bpo-41192: Fix some broken anchors for audit event entries (#21310) --- Doc/library/ctypes.rst | 3 +-- Doc/library/poplib.rst | 2 +- Doc/using/cmdline.rst | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 2d6c6d0a1c3c57..c172d5377636a7 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1618,7 +1618,7 @@ They are instances of a private class: ``ctypes.seh_exception`` with argument ``code`` will be raised, allowing an audit hook to replace the exception with its own. -.. audit-event:: ctypes.call_function func_pointer,arguments ctype-foreign-functions +.. audit-event:: ctypes.call_function func_pointer,arguments foreign-functions Some ways to invoke foreign function calls may raise an auditing event ``ctypes.call_function`` with arguments ``function pointer`` and ``arguments``. @@ -2545,4 +2545,3 @@ Arrays and pointers Returns the object to which to pointer points. Assigning to this attribute changes the pointer to point to the assigned object. - diff --git a/Doc/library/poplib.rst b/Doc/library/poplib.rst index 2f349b35b7e0ff..9bf9212d917a55 100644 --- a/Doc/library/poplib.rst +++ b/Doc/library/poplib.rst @@ -67,7 +67,7 @@ The :mod:`poplib` module provides two classes: .. audit-event:: poplib.connect self,host,port poplib.POP3_SSL - .. audit-event:: poplib.putline self,line popplib.POP3_SSL + .. audit-event:: poplib.putline self,line poplib.POP3_SSL All commands will raise an :ref:`auditing event ` ``poplib.putline`` with arguments ``self`` and ``line``, diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 8c65d99ef31f9f..603b0e105fb43e 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -558,7 +558,7 @@ conflict. the interactive session. You can also change the prompts :data:`sys.ps1` and :data:`sys.ps2` and the hook :data:`sys.__interactivehook__` in this file. - .. audit-event:: cpython.run_startup filename PYTHONSTARTUP + .. audit-event:: cpython.run_startup filename envvar-PYTHONSTARTUP Raises an :ref:`auditing event ` ``cpython.run_startup`` with the filename as the argument when called on startup. From bf6f7e0c59e0d6186c670e818ef5d8dbdc39596b Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 19 Oct 2020 16:55:10 +0100 Subject: [PATCH 0290/1261] bpo-39107: Updated Tcl and Tk to 8.6.10 in Windows installer (GH-22405) --- .../next/Windows/2020-09-24-23-09-40.bpo-39107.GbUZvD.rst | 1 + PCbuild/get_externals.bat | 6 +++--- PCbuild/tcltk.props | 5 ++--- 3 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-09-24-23-09-40.bpo-39107.GbUZvD.rst diff --git a/Misc/NEWS.d/next/Windows/2020-09-24-23-09-40.bpo-39107.GbUZvD.rst b/Misc/NEWS.d/next/Windows/2020-09-24-23-09-40.bpo-39107.GbUZvD.rst new file mode 100644 index 00000000000000..889ad481404e49 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-09-24-23-09-40.bpo-39107.GbUZvD.rst @@ -0,0 +1 @@ +Update Tcl and Tk to 8.6.10 in Windows installer. diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 3bb281904f6a61..799c46641f5acf 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -55,8 +55,8 @@ set libraries=%libraries% bzip2-1.0.6 if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1g set libraries=%libraries% sqlite-3.33.0.0 -if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.9.0 -if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.9.0 +if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.10.0 +if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.10.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tix-8.4.3.6 set libraries=%libraries% xz-5.2.2 set libraries=%libraries% zlib-1.2.11 @@ -78,7 +78,7 @@ echo.Fetching external binaries... set binaries= if NOT "%IncludeLibffi%"=="false" set binaries=%binaries% libffi if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-1.1.1g -if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.9.0 +if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.10.0 if NOT "%IncludeSSLSrc%"=="false" set binaries=%binaries% nasm-2.11.06 for %%b in (%binaries%) do ( diff --git a/PCbuild/tcltk.props b/PCbuild/tcltk.props index 7fcd3e1c618c46..fb61bee5147211 100644 --- a/PCbuild/tcltk.props +++ b/PCbuild/tcltk.props @@ -4,7 +4,7 @@ 8 6 - 9 + 10 0 $(TclMajorVersion) $(TclMinorVersion) @@ -36,8 +36,7 @@ Release Debug $(BuildDirTop)_$(TclMachine) - $(BuildDirTop)_VC13 - $(BuildDirTop)_VC13 + $(BuildDirTop)_VC13 $(BuildDirTop)_VC12 $(BuildDirTop)_VC11 $(BuildDirTop)_VC10 From 41d42d0002d0d59d3f2061ccb9dcae895b1ea208 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Mon, 19 Oct 2020 20:13:49 +0200 Subject: [PATCH 0291/1261] bpo-42051: Reject XML entity declarations in plist files (#22760) --- Lib/plistlib.py | 7 +++++++ Lib/test/test_plistlib.py | 18 ++++++++++++++++++ .../2020-10-19-10-56-27.bpo-42051.EU_B7u.rst | 3 +++ 3 files changed, 28 insertions(+) create mode 100644 Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst diff --git a/Lib/plistlib.py b/Lib/plistlib.py index aff5fe36ca38b4..ba7ac1936479f7 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -173,9 +173,16 @@ def parse(self, fileobj): self.parser.StartElementHandler = self.handle_begin_element self.parser.EndElementHandler = self.handle_end_element self.parser.CharacterDataHandler = self.handle_data + self.parser.EntityDeclHandler = self.handle_entity_decl self.parser.ParseFile(fileobj) return self.root + def handle_entity_decl(self, entity_name, is_parameter_entity, value, base, system_id, public_id, notation_name): + # Reject plist files with entity declarations to avoid XML vulnerabilies in expat. + # Regular plist files don't contain those declerations, and Apple's plutil tool does not + # accept them either. + raise InvalidFileException("XML entity declarations are not supported in plist files") + def handle_begin_element(self, element, attrs): self.data = [] handler = getattr(self, "begin_" + element, None) diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py index e5c9b5b6b2cfea..cb071da1f33a1b 100644 --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -106,6 +106,19 @@ AAABOQ=='''), } +XML_PLIST_WITH_ENTITY=b'''\ + + + ]> + + + A + &entity; + + +''' + class TestPlistlib(unittest.TestCase): @@ -524,6 +537,11 @@ def test_modified_uid_huge(self): with self.assertRaises(OverflowError): plistlib.dumps(huge_uid, fmt=plistlib.FMT_BINARY) + def test_xml_plist_with_entity_decl(self): + with self.assertRaisesRegex(plistlib.InvalidFileException, + "XML entity declarations are not supported"): + plistlib.loads(XML_PLIST_WITH_ENTITY, fmt=plistlib.FMT_XML) + class TestBinaryPlistlib(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst b/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst new file mode 100644 index 00000000000000..e865ed12a03878 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst @@ -0,0 +1,3 @@ +The :mod:`plistlib` module no longer accepts entity declarations in XML +plist files to avoid XML vulnerabilities. This should not affect users as +entity declarations are not used in regular plist files. From 392d48386157c61aec0e99a8119bfeefc00c34d1 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Mon, 19 Oct 2020 20:16:21 +0200 Subject: [PATCH 0292/1261] bpo-41471: Ignore invalid prefix lengths in system proxy settings on macOS (GH-22762) --- Lib/test/test_urllib2.py | 12 ++++++++++++ Lib/urllib/request.py | 5 +++++ .../macOS/2020-10-19-12-25-19.bpo-41471.gwA7un.rst | 1 + 3 files changed, 18 insertions(+) create mode 100644 Misc/NEWS.d/next/macOS/2020-10-19-12-25-19.bpo-41471.gwA7un.rst diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index f202f970ccb38f..12ad6ae79d5baf 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -1449,6 +1449,18 @@ def test_osx_proxy_bypass(self): bypass = {'exclude_simple': True, 'exceptions': []} self.assertTrue(_proxy_bypass_macosx_sysconf('test', bypass)) + # Check that invalid prefix lengths are ignored + bypass = { + 'exclude_simple': False, + 'exceptions': [ '10.0.0.0/40', '172.19.10.0/24' ] + } + host = '172.19.10.5' + self.assertTrue(_proxy_bypass_macosx_sysconf(host, bypass), + 'expected bypass of %s to be True' % host) + host = '10.0.1.5' + self.assertFalse(_proxy_bypass_macosx_sysconf(host, bypass), + 'expected bypass of %s to be False' % host) + def check_basic_auth(self, headers, realm): with self.subTest(realm=realm, headers=headers): opener = OpenerDirector() diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 2a3d71554f4bfe..a8c870b9778eba 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2596,6 +2596,11 @@ def ip2num(ipAddr): mask = 8 * (m.group(1).count('.') + 1) else: mask = int(mask[1:]) + + if mask < 0 or mask > 32: + # System libraries ignore invalid prefix lengths + continue + mask = 32 - mask if (hostIP >> mask) == (base >> mask): diff --git a/Misc/NEWS.d/next/macOS/2020-10-19-12-25-19.bpo-41471.gwA7un.rst b/Misc/NEWS.d/next/macOS/2020-10-19-12-25-19.bpo-41471.gwA7un.rst new file mode 100644 index 00000000000000..db5dd00b19b0d4 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2020-10-19-12-25-19.bpo-41471.gwA7un.rst @@ -0,0 +1 @@ +Ignore invalid prefix lengths in system proxy excludes. From 9653134155d5785b90f49eabc9e9d3777631a0d5 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Mon, 19 Oct 2020 12:13:01 -0700 Subject: [PATCH 0293/1261] bpo-42084: Language aware diff headers (GH-22776) --- .gitattributes | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.gitattributes b/.gitattributes index 598d8f0f159aee..3827d09709d4a7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -57,3 +57,13 @@ Doc/library/token-list.inc linguist-generated=true Include/token.h linguist-generated=true Lib/token.py linguist-generated=true Parser/token.c linguist-generated=true + +# Language aware diff headers +# https://tekin.co.uk/2020/10/better-git-diff-output-for-ruby-python-elixir-and-more +# https://gist.github.com/tekin/12500956bd56784728e490d8cef9cb81 +*.c diff=cpp +*.h diff=cpp +*.css diff=css +*.html diff=html +*.py diff=python +*.md diff=markdown From 285ee1b86eab2fc6eb46c8d1200f21efdb837a70 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Mon, 19 Oct 2020 14:14:21 -0700 Subject: [PATCH 0294/1261] bpo-42089: Sync with current cpython branch of importlib_metadata (GH-22775) ~~The only differences are in the test files.~~ Automerge-Triggered-By: @jaraco --- Lib/importlib/metadata.py | 9 +++++++++ Lib/test/test_importlib/fixtures.py | 9 +++------ Lib/test/test_importlib/test_main.py | 12 ++++++++++++ .../Library/2020-10-19-16-53-19.bpo-42089.R1dthW.rst | 2 ++ 4 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-19-16-53-19.bpo-42089.R1dthW.rst diff --git a/Lib/importlib/metadata.py b/Lib/importlib/metadata.py index ffa0cba45706d6..302d61d505cb3a 100644 --- a/Lib/importlib/metadata.py +++ b/Lib/importlib/metadata.py @@ -37,6 +37,15 @@ class PackageNotFoundError(ModuleNotFoundError): """The package was not found.""" + def __str__(self): + tmpl = "No package metadata was found for {self.name}" + return tmpl.format(**locals()) + + @property + def name(self): + name, = self.args + return name + class EntryPoint( collections.namedtuple('EntryPointBase', 'name value group')): diff --git a/Lib/test/test_importlib/fixtures.py b/Lib/test/test_importlib/fixtures.py index 985277f64615fe..8fa92909d583ed 100644 --- a/Lib/test/test_importlib/fixtures.py +++ b/Lib/test/test_importlib/fixtures.py @@ -6,6 +6,8 @@ import textwrap import contextlib +from test.support.os_helper import FS_NONASCII + @contextlib.contextmanager def tempdir(): @@ -212,12 +214,7 @@ def build_files(file_defs, prefix=pathlib.Path()): class FileBuilder: def unicode_filename(self): - try: - from test.support import os_helper - except ImportError: - # outside CPython, hard-code a unicode snowman - return '☃' - return os_helper.FS_NONASCII or \ + return FS_NONASCII or \ self.skip("File system does not support non-ascii.") diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py index 91e501a2eb7cdc..a26bab63615484 100644 --- a/Lib/test/test_importlib/test_main.py +++ b/Lib/test/test_importlib/test_main.py @@ -32,6 +32,18 @@ def test_for_name_does_not_exist(self): with self.assertRaises(PackageNotFoundError): Distribution.from_name('does-not-exist') + def test_package_not_found_mentions_metadata(self): + """ + When a package is not found, that could indicate that the + packgae is not installed or that it is installed without + metadata. Ensure the exception mentions metadata to help + guide users toward the cause. See #124. + """ + with self.assertRaises(PackageNotFoundError) as ctx: + Distribution.from_name('does-not-exist') + + assert "metadata" in str(ctx.exception) + def test_new_style_classes(self): self.assertIsInstance(Distribution, type) diff --git a/Misc/NEWS.d/next/Library/2020-10-19-16-53-19.bpo-42089.R1dthW.rst b/Misc/NEWS.d/next/Library/2020-10-19-16-53-19.bpo-42089.R1dthW.rst new file mode 100644 index 00000000000000..3f3affd1a7df73 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-19-16-53-19.bpo-42089.R1dthW.rst @@ -0,0 +1,2 @@ +In ``importlib.metadata.PackageNotFoundError``, make reference to the +package metadata being missing to improve the user experience. From b9f230b8405188dd51e8160f370b0015f34e9b0e Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Mon, 19 Oct 2020 22:27:16 +0100 Subject: [PATCH 0295/1261] bpo-38320: Clarify that expectedFailure is satisfied by either failure or error of the test. (GH-22740) --- Doc/library/unittest.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index f04ec91270eebe..51e10119d3e8d0 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -593,8 +593,9 @@ The following decorators and exception implement test skipping and expected fail .. decorator:: expectedFailure - Mark the test as an expected failure. If the test fails it will be - considered a success. If the test passes, it will be considered a failure. + Mark the test as an expected failure or error. If the test fails or errors + it will be considered a success. If the test passes, it will be considered + a failure. .. exception:: SkipTest(reason) @@ -1967,7 +1968,7 @@ Loading and running tests A list containing 2-tuples of :class:`TestCase` instances and strings holding formatted tracebacks. Each tuple represents an expected failure - of the test case. + or error of the test case. .. attribute:: unexpectedSuccesses @@ -2093,8 +2094,8 @@ Loading and running tests .. method:: addExpectedFailure(test, err) - Called when the test case *test* fails, but was marked with the - :func:`expectedFailure` decorator. + Called when the test case *test* fails or errors, but was marked with + the :func:`expectedFailure` decorator. The default implementation appends a tuple ``(test, formatted_err)`` to the instance's :attr:`expectedFailures` attribute, where *formatted_err* From 1c83ae12ead2e123cdb1b69740cf299adb62a3db Mon Sep 17 00:00:00 2001 From: abdo Date: Tue, 20 Oct 2020 00:46:21 +0300 Subject: [PATCH 0296/1261] Link to the msvcrt module from the Windows FAQ (#22268) --- Doc/faq/windows.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index a181086e9ce627..c550a055529a7b 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -279,7 +279,7 @@ in batch mode. How do I check for a keypress without blocking? ----------------------------------------------- -Use the msvcrt module. This is a standard Windows-specific extension module. +Use the :mod:`msvcrt` module. This is a standard Windows-specific extension module. It defines a function ``kbhit()`` which checks whether a keyboard hit is present, and ``getch()`` which gets one character without echoing it. From fdf98b208ad3942cbf804a2651847c70436dac24 Mon Sep 17 00:00:00 2001 From: Michel Samia Date: Tue, 20 Oct 2020 00:02:43 +0200 Subject: [PATCH 0297/1261] bpo-41292: Fixes dead link to cx_freeze from Windows FAQ (GH-21463) --- Doc/faq/windows.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index c550a055529a7b..c8e9c5fb670301 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -140,7 +140,7 @@ offender. How do I make an executable from a Python script? ------------------------------------------------- -See `cx_Freeze `_ for a distutils extension +See `cx_Freeze `_ for a distutils extension that allows you to create console and GUI executables from Python code. `py2exe `_, the most popular extension for building Python 2.x-based executables, does not yet support Python 3 but a version that From 709a99d45ff106f4614d375626280c37dca67e57 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Mon, 19 Oct 2020 18:06:05 -0400 Subject: [PATCH 0298/1261] bpo-16396: Allow wintypes to be imported on non-Windows systems. (GH-21394) Co-authored-by: Christian Heimes --- Lib/ctypes/test/test_wintypes.py | 8 +++++--- .../Library/2020-07-08-09-45-00.bpo-16936.z8o8Pn.rst | 1 + Modules/_ctypes/cfield.c | 9 ++++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-07-08-09-45-00.bpo-16936.z8o8Pn.rst diff --git a/Lib/ctypes/test/test_wintypes.py b/Lib/ctypes/test/test_wintypes.py index 71442df8301aff..243d5962ffa7f1 100644 --- a/Lib/ctypes/test/test_wintypes.py +++ b/Lib/ctypes/test/test_wintypes.py @@ -1,12 +1,13 @@ -import sys import unittest +# also work on POSIX + from ctypes import * +from ctypes import wintypes + -@unittest.skipUnless(sys.platform.startswith('win'), 'Windows-only test') class WinTypesTest(unittest.TestCase): def test_variant_bool(self): - from ctypes import wintypes # reads 16-bits from memory, anything non-zero is True for true_value in (1, 32767, 32768, 65535, 65537): true = POINTER(c_int16)(c_int16(true_value)) @@ -37,5 +38,6 @@ def test_variant_bool(self): vb.value = [] self.assertIs(vb.value, False) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-07-08-09-45-00.bpo-16936.z8o8Pn.rst b/Misc/NEWS.d/next/Library/2020-07-08-09-45-00.bpo-16936.z8o8Pn.rst new file mode 100644 index 00000000000000..c76db4eedecff1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-07-08-09-45-00.bpo-16936.z8o8Pn.rst @@ -0,0 +1 @@ +Allow ``ctypes.wintypes`` to be imported on non-Windows systems. diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 3bd9ae438db440..98939290fb97f9 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -658,7 +658,11 @@ i_get_sw(void *ptr, Py_ssize_t size) return PyLong_FromLong(val); } -#ifdef MS_WIN32 +#ifndef MS_WIN32 +/* http://msdn.microsoft.com/en-us/library/cc237864.aspx */ +#define VARIANT_FALSE 0x0000 +#define VARIANT_TRUE 0xFFFF +#endif /* short BOOL - VARIANT_BOOL */ static PyObject * vBOOL_set(void *ptr, PyObject *value, Py_ssize_t size) @@ -680,7 +684,6 @@ vBOOL_get(void *ptr, Py_ssize_t size) { return PyBool_FromLong((long)*(short int *)ptr); } -#endif static PyObject * bool_set(void *ptr, PyObject *value, Py_ssize_t size) @@ -1511,8 +1514,8 @@ static struct fielddesc formattable[] = { #endif #ifdef MS_WIN32 { 'X', BSTR_set, BSTR_get, &ffi_type_pointer}, - { 'v', vBOOL_set, vBOOL_get, &ffi_type_sshort}, #endif + { 'v', vBOOL_set, vBOOL_get, &ffi_type_sshort}, #if SIZEOF__BOOL == 1 { '?', bool_set, bool_get, &ffi_type_uchar}, /* Also fallback for no native _Bool support */ #elif SIZEOF__BOOL == SIZEOF_SHORT From a75764a363dc3c2ad95e403aaa33e9667ecfcba6 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Mon, 19 Oct 2020 16:08:34 -0600 Subject: [PATCH 0299/1261] bpo-41217: Fix incorrect note in the asyncio.create_subprocess_shell() docs (GH-21360) On Windows, the default asyncio event loop is ProactorEventLoop (as of 3.8). --- Doc/library/asyncio-subprocess.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index eb1312a949a10a..b0330349dfb651 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -110,10 +110,8 @@ Creating Subprocesses .. note:: - The default asyncio event loop implementation on **Windows** does not - support subprocesses. Subprocesses are available for Windows if a - :class:`ProactorEventLoop` is used. - See :ref:`Subprocess Support on Windows ` + Subprocesses are available for Windows if a :class:`ProactorEventLoop` is + used. See :ref:`Subprocess Support on Windows ` for details. .. seealso:: From 8536b57ddb7c848491962e56c762673e64e3f2d0 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Mon, 19 Oct 2020 18:17:50 -0400 Subject: [PATCH 0300/1261] bpo-41784: make PyUnicode_AsUTF8AndSize part of the limited API (GH-22252) --- Doc/c-api/unicode.rst | 3 +++ Doc/whatsnew/3.10.rst | 4 ++++ Include/cpython/unicodeobject.h | 20 ------------------- Include/unicodeobject.h | 17 ++++++++++++++++ .../2020-09-14-10-17-00.bpo-41784.Yl4gI2.rst | 1 + PC/python3dll.c | 1 + 6 files changed, 26 insertions(+), 20 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-09-14-10-17-00.bpo-41784.Yl4gI2.rst diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 5518214a793e0c..54bd0a3cbb6556 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -1098,6 +1098,9 @@ These are the UTF-8 codec APIs: .. versionchanged:: 3.7 The return type is now ``const char *`` rather of ``char *``. + .. versionchanged:: 3.10 + This function is a part of the :ref:`limited API `. + .. c:function:: const char* PyUnicode_AsUTF8(PyObject *unicode) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 738ef974e7867b..f57e1b412378e6 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -323,6 +323,10 @@ New Features sending value into iterator without raising ``StopIteration`` exception. (Contributed by Vladimir Matveev in :issue:`41756`.) +* Added :c:func:`PyUnicode_AsUTF8AndSize` to the limited C API. + (Contributed by Alex Gaynor in :issue:`41784`.) + + Porting to Python 3.10 ---------------------- diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 300408cb262991..f1b44554e3078d 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -726,26 +726,6 @@ PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( /* --- Manage the default encoding ---------------------------------------- */ -/* Returns a pointer to the default encoding (UTF-8) of the - Unicode object unicode and the size of the encoded representation - in bytes stored in *size. - - In case of an error, no *size is set. - - This function caches the UTF-8 encoded string in the unicodeobject - and subsequent calls will return the same string. The memory is released - when the unicodeobject is deallocated. - - _PyUnicode_AsStringAndSize is a #define for PyUnicode_AsUTF8AndSize to - support the previous internal function with the same behaviour. -*/ - -PyAPI_FUNC(const char *) PyUnicode_AsUTF8AndSize( - PyObject *unicode, - Py_ssize_t *size); - -#define _PyUnicode_AsStringAndSize PyUnicode_AsUTF8AndSize - /* Returns a pointer to the default encoding (UTF-8) of the Unicode object unicode. diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 90b3299fd26ceb..b0ac086a6be23d 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -468,6 +468,23 @@ PyAPI_FUNC(PyObject*) PyUnicode_AsUTF8String( PyObject *unicode /* Unicode object */ ); +/* Returns a pointer to the default encoding (UTF-8) of the + Unicode object unicode and the size of the encoded representation + in bytes stored in *size. + + In case of an error, no *size is set. + + This function caches the UTF-8 encoded string in the unicodeobject + and subsequent calls will return the same string. The memory is released + when the unicodeobject is deallocated. +*/ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 +PyAPI_FUNC(const char *) PyUnicode_AsUTF8AndSize( + PyObject *unicode, + Py_ssize_t *size); +#endif + /* --- UTF-32 Codecs ------------------------------------------------------ */ /* Decodes length bytes from a UTF-32 encoded buffer string and returns diff --git a/Misc/NEWS.d/next/C API/2020-09-14-10-17-00.bpo-41784.Yl4gI2.rst b/Misc/NEWS.d/next/C API/2020-09-14-10-17-00.bpo-41784.Yl4gI2.rst new file mode 100644 index 00000000000000..f09e0879ad1945 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-09-14-10-17-00.bpo-41784.Yl4gI2.rst @@ -0,0 +1 @@ +Added ``PyUnicode_AsUTF8AndSize`` to the limited C API. diff --git a/PC/python3dll.c b/PC/python3dll.c index 153ba612b7804f..b9b229ea67d7b3 100644 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -568,6 +568,7 @@ EXPORT_FUNC(PyUnicode_AsUCS4Copy) EXPORT_FUNC(PyUnicode_AsUnicodeEscapeString) EXPORT_FUNC(PyUnicode_AsUTF16String) EXPORT_FUNC(PyUnicode_AsUTF32String) +EXPORT_FUNC(PyUnicode_AsUTF8AndSize) EXPORT_FUNC(PyUnicode_AsUTF8String) EXPORT_FUNC(PyUnicode_AsWideChar) EXPORT_FUNC(PyUnicode_AsWideCharString) From 79c19dd2574cef96617c5db65e3164a525c7f2ab Mon Sep 17 00:00:00 2001 From: Jakub Stasiak Date: Tue, 20 Oct 2020 00:30:58 +0200 Subject: [PATCH 0301/1261] bpo-40901: Describe what "interface name" means on Windows (GH-20694) --- Doc/library/socket.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 5bcac20a4c6048..faf8a76251420e 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -1091,6 +1091,19 @@ The :mod:`socket` module also offers various network-related services: .. versionchanged:: 3.8 Windows support was added. + .. note:: + + On Windows network interfaces have different names in different contexts + (all names are examples): + + * UUID: ``{FB605B73-AAC2-49A6-9A2F-25416AEA0573}`` + * name: ``ethernet_32770`` + * friendly name: ``vEthernet (nat)`` + * description: ``Hyper-V Virtual Ethernet Adapter`` + + This function returns names of the second form from the list, ``ethernet_32770`` + in this example case. + .. function:: if_nametoindex(if_name) @@ -1105,6 +1118,9 @@ The :mod:`socket` module also offers various network-related services: .. versionchanged:: 3.8 Windows support was added. + .. seealso:: + "Interface name" is a name as documented in :func:`if_nameindex`. + .. function:: if_indextoname(if_index) @@ -1119,6 +1135,9 @@ The :mod:`socket` module also offers various network-related services: .. versionchanged:: 3.8 Windows support was added. + .. seealso:: + "Interface name" is a name as documented in :func:`if_nameindex`. + .. _socket-objects: From 45c898e036bff690c7abb951fd07c4e6b0850f4f Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Mon, 19 Oct 2020 16:47:37 -0600 Subject: [PATCH 0302/1261] bpo-41845: Move PyObject_GenericGetDict() back into the limited API (GH22646) It was moved out of the limited API in 7d95e4072169911b228c9e42367afb5f17fd3db0. This change re-enables it from 3.10, to avoid generating invalid extension modules for earlier versions. --- Include/cpython/dictobject.h | 1 - Include/dictobject.h | 3 +++ .../NEWS.d/next/C API/2020-10-11-05-05-53.bpo-41845.ZFvuQM.rst | 2 ++ PC/python3dll.c | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/C API/2020-10-11-05-05-53.bpo-41845.ZFvuQM.rst diff --git a/Include/cpython/dictobject.h b/Include/cpython/dictobject.h index ffe0e97fb35f35..5a15630cfbac70 100644 --- a/Include/cpython/dictobject.h +++ b/Include/cpython/dictobject.h @@ -41,7 +41,6 @@ PyAPI_FUNC(int) _PyDict_DelItem_KnownHash(PyObject *mp, PyObject *key, PyAPI_FUNC(int) _PyDict_DelItemIf(PyObject *mp, PyObject *key, int (*predicate)(PyObject *value)); PyDictKeysObject *_PyDict_NewKeysForClass(void); -PyAPI_FUNC(PyObject *) PyObject_GenericGetDict(PyObject *, void *); PyAPI_FUNC(int) _PyDict_Next( PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, Py_hash_t *hash); diff --git a/Include/dictobject.h b/Include/dictobject.h index c88b0aa0a5d0f9..da5a36ba07f32e 100644 --- a/Include/dictobject.h +++ b/Include/dictobject.h @@ -57,6 +57,9 @@ PyAPI_FUNC(int) PyDict_MergeFromSeq2(PyObject *d, PyAPI_FUNC(PyObject *) PyDict_GetItemString(PyObject *dp, const char *key); PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item); PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 +PyAPI_FUNC(PyObject *) PyObject_GenericGetDict(PyObject *, void *); +#endif /* Dictionary (keys, values, items) views */ diff --git a/Misc/NEWS.d/next/C API/2020-10-11-05-05-53.bpo-41845.ZFvuQM.rst b/Misc/NEWS.d/next/C API/2020-10-11-05-05-53.bpo-41845.ZFvuQM.rst new file mode 100644 index 00000000000000..31d3154c3c60e9 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-11-05-05-53.bpo-41845.ZFvuQM.rst @@ -0,0 +1,2 @@ +:c:func:`PyObject_GenericGetDict` is available again in the limited API +when targeting 3.10 or later. diff --git a/PC/python3dll.c b/PC/python3dll.c index b9b229ea67d7b3..7e4a510177304d 100644 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -414,6 +414,7 @@ EXPORT_FUNC(PyObject_GC_Track) EXPORT_FUNC(PyObject_GC_UnTrack) EXPORT_FUNC(PyObject_GenericGetAttr) EXPORT_FUNC(PyObject_GenericSetAttr) +EXPORT_FUNC(PyObject_GenericGetDict) EXPORT_FUNC(PyObject_GenericSetDict) EXPORT_FUNC(PyObject_GetAttr) EXPORT_FUNC(PyObject_GetAttrString) From 42e935d5ca3d15684d05827d8afb6756e1d7f6e9 Mon Sep 17 00:00:00 2001 From: Mark Sapiro Date: Mon, 19 Oct 2020 15:49:19 -0700 Subject: [PATCH 0303/1261] bpo-27321 Fix email.generator.py to not replace a non-existent header. (GH-18074) This PR replaces #1977. The reason for the replacement is two-fold. The fix itself is different is that if the CTE header doesn't exist in the original message, it is inserted. This is important because the new CTE could be quoted-printable whereas the original is implicit 8bit. Also the tests are different. The test_nonascii_as_string_without_cte test in #1977 doesn't actually test the issue in that it passes without the fix. The test_nonascii_as_string_without_content_type_and_cte test is improved here, and even though it doesn't fail without the fix, it is included for completeness. Automerge-Triggered-By: @warsaw --- Lib/email/generator.py | 6 +++- Lib/test/test_email/test_email.py | 35 +++++++++++++++++++ .../2020-01-19-18-40-26.bpo-27321.8e6SpM.rst | 2 ++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-19-18-40-26.bpo-27321.8e6SpM.rst diff --git a/Lib/email/generator.py b/Lib/email/generator.py index ae670c2353c858..c9b121624e08d5 100644 --- a/Lib/email/generator.py +++ b/Lib/email/generator.py @@ -186,7 +186,11 @@ def _write(self, msg): # If we munged the cte, copy the message again and re-fix the CTE. if munge_cte: msg = deepcopy(msg) - msg.replace_header('content-transfer-encoding', munge_cte[0]) + # Preserve the header order if the CTE header already exists. + if msg.get('content-transfer-encoding') is None: + msg['Content-Transfer-Encoding'] = munge_cte[0] + else: + msg.replace_header('content-transfer-encoding', munge_cte[0]) msg.replace_header('content-type', munge_cte[1]) # Write the headers. First we see if the message object wants to # handle that itself. If not, we'll do it generically. diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index ba4ed69cc9b34b..044b93862a14eb 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -312,6 +312,41 @@ def test_as_string_policy(self): g.flatten(msg) self.assertEqual(fullrepr, s.getvalue()) + def test_nonascii_as_string_without_cte(self): + m = textwrap.dedent("""\ + MIME-Version: 1.0 + Content-type: text/plain; charset="iso-8859-1" + + Test if non-ascii messages with no Content-Transfer-Encoding set + can be as_string'd: + Föö bär + """) + source = m.encode('iso-8859-1') + expected = textwrap.dedent("""\ + MIME-Version: 1.0 + Content-type: text/plain; charset="iso-8859-1" + Content-Transfer-Encoding: quoted-printable + + Test if non-ascii messages with no Content-Transfer-Encoding set + can be as_string'd: + F=F6=F6 b=E4r + """) + msg = email.message_from_bytes(source) + self.assertEqual(msg.as_string(), expected) + + def test_nonascii_as_string_without_content_type_and_cte(self): + m = textwrap.dedent("""\ + MIME-Version: 1.0 + + Test if non-ascii messages with no Content-Type nor + Content-Transfer-Encoding set can be as_string'd: + Föö bär + """) + source = m.encode('iso-8859-1') + expected = source.decode('ascii', 'replace') + msg = email.message_from_bytes(source) + self.assertEqual(msg.as_string(), expected) + def test_as_bytes(self): msg = self._msgobj('msg_01.txt') with openfile('msg_01.txt') as fp: diff --git a/Misc/NEWS.d/next/Library/2020-01-19-18-40-26.bpo-27321.8e6SpM.rst b/Misc/NEWS.d/next/Library/2020-01-19-18-40-26.bpo-27321.8e6SpM.rst new file mode 100644 index 00000000000000..28acf7f6ef919c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-19-18-40-26.bpo-27321.8e6SpM.rst @@ -0,0 +1,2 @@ +Fixed KeyError exception when flattening an email to a string attempts to +replace a non-existent Content-Transfer-Encoding header. From 443f3195cc17329b2cb886489b972683c5aace37 Mon Sep 17 00:00:00 2001 From: Ruben Vorderman Date: Tue, 20 Oct 2020 01:30:02 +0200 Subject: [PATCH 0304/1261] bpo-41586: Add pipesize parameter to subprocess & F_GETPIPE_SZ and F_SETPIPE_SZ to fcntl. (GH-21921) * Add F_SETPIPE_SZ and F_GETPIPE_SZ to fcntl module * Add pipesize parameter for subprocess.Popen class This will allow the user to control the size of the pipes. On linux the default is 64K. When a pipe is full it blocks for writing. When a pipe is empty it blocks for reading. On processes that are very fast this can lead to a lot of wasted CPU cycles. On a typical Linux system the max pipe size is 1024K which is much better. For high performance-oriented libraries such as xopen it is nice to be able to set the pipe size. The workaround without this feature is to use my_popen_process.stdout.fileno() in conjuction with fcntl and 1031 (value of F_SETPIPE_SZ) to acquire this behavior. --- Doc/library/fcntl.rst | 5 ++ Doc/library/subprocess.rst | 10 +++- Lib/subprocess.py | 19 +++++++- Lib/test/test_fcntl.py | 13 +++++ Lib/test/test_subprocess.py | 47 ++++++++++++++++++- Misc/ACKS | 1 + .../2020-08-19-08-32-13.bpo-41586.IYjmjK.rst | 2 + Modules/fcntlmodule.c | 8 ++++ 8 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-08-19-08-32-13.bpo-41586.IYjmjK.rst diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst index 07a15d27216e92..9d8021150c42f5 100644 --- a/Doc/library/fcntl.rst +++ b/Doc/library/fcntl.rst @@ -39,6 +39,11 @@ descriptor. On Linux(>=3.15), the fcntl module exposes the ``F_OFD_GETLK``, ``F_OFD_SETLK`` and ``F_OFD_SETLKW`` constants, which working with open file description locks. +.. versionchanged:: 3.10 + On Linux >= 2.6.11, the fcntl module exposes the ``F_GETPIPE_SZ`` and + ``F_SETPIPE_SZ`` constants, which allow to check and modify a pipe's size + respectively. + The module defines the following functions: diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index e37cc980e97575..7993b103f473e2 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -341,7 +341,7 @@ functions. startupinfo=None, creationflags=0, restore_signals=True, \ start_new_session=False, pass_fds=(), \*, group=None, \ extra_groups=None, user=None, umask=-1, \ - encoding=None, errors=None, text=None) + encoding=None, errors=None, text=None, pipesize=-1) Execute a child program in a new process. On POSIX, the class uses :meth:`os.execvp`-like behavior to execute the child program. On Windows, @@ -625,6 +625,14 @@ functions. * :data:`CREATE_DEFAULT_ERROR_MODE` * :data:`CREATE_BREAKAWAY_FROM_JOB` + *pipesize* can be used to change the size of the pipe when + :data:`PIPE` is used for *stdin*, *stdout* or *stderr*. The size of the pipe + is only changed on platforms that support this (only Linux at this time of + writing). Other platforms will ignore this parameter. + + .. versionadded:: 3.10 + The ``pipesize`` parameter was added. + Popen objects are supported as context managers via the :keyword:`with` statement: on exit, standard file descriptors are closed, and the process is waited for. :: diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 86fdf27f9b03bd..6a6c2fc98e83f3 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -62,6 +62,11 @@ import grp except ImportError: grp = None +try: + import fcntl +except ImportError: + fcntl = None + __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput", "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL", @@ -756,7 +761,7 @@ def __init__(self, args, bufsize=-1, executable=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, user=None, group=None, extra_groups=None, - encoding=None, errors=None, text=None, umask=-1): + encoding=None, errors=None, text=None, umask=-1, pipesize=-1): """Create new Popen instance.""" _cleanup() # Held while anything is calling waitpid before returncode has been @@ -773,6 +778,11 @@ def __init__(self, args, bufsize=-1, executable=None, if not isinstance(bufsize, int): raise TypeError("bufsize must be an integer") + if pipesize is None: + pipesize = -1 # Restore default + if not isinstance(pipesize, int): + raise TypeError("pipesize must be an integer") + if _mswindows: if preexec_fn is not None: raise ValueError("preexec_fn is not supported on Windows " @@ -797,6 +807,7 @@ def __init__(self, args, bufsize=-1, executable=None, self.returncode = None self.encoding = encoding self.errors = errors + self.pipesize = pipesize # Validate the combinations of text and universal_newlines if (text is not None and universal_newlines is not None @@ -1575,6 +1586,8 @@ def _get_handles(self, stdin, stdout, stderr): pass elif stdin == PIPE: p2cread, p2cwrite = os.pipe() + if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"): + fcntl.fcntl(p2cwrite, fcntl.F_SETPIPE_SZ, self.pipesize) elif stdin == DEVNULL: p2cread = self._get_devnull() elif isinstance(stdin, int): @@ -1587,6 +1600,8 @@ def _get_handles(self, stdin, stdout, stderr): pass elif stdout == PIPE: c2pread, c2pwrite = os.pipe() + if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"): + fcntl.fcntl(c2pwrite, fcntl.F_SETPIPE_SZ, self.pipesize) elif stdout == DEVNULL: c2pwrite = self._get_devnull() elif isinstance(stdout, int): @@ -1599,6 +1614,8 @@ def _get_handles(self, stdin, stdout, stderr): pass elif stderr == PIPE: errread, errwrite = os.pipe() + if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"): + fcntl.fcntl(errwrite, fcntl.F_SETPIPE_SZ, self.pipesize) elif stderr == STDOUT: if c2pwrite != -1: errwrite = c2pwrite diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py index 7e1092083269e4..8d6e9ff788454f 100644 --- a/Lib/test/test_fcntl.py +++ b/Lib/test/test_fcntl.py @@ -190,6 +190,19 @@ def test_fcntl_f_getpath(self): res = fcntl.fcntl(self.f.fileno(), fcntl.F_GETPATH, bytes(len(expected))) self.assertEqual(expected, res) + @unittest.skipIf(not (hasattr(fcntl, "F_SETPIPE_SZ") and hasattr(fcntl, "F_GETPIPE_SZ")), + "F_SETPIPE_SZ and F_GETPIPE_SZ are not available on all unix platforms.") + def test_fcntl_f_pipesize(self): + test_pipe_r, test_pipe_w = os.pipe() + # Get the default pipesize with F_GETPIPE_SZ + pipesize_default = fcntl.fcntl(test_pipe_w, fcntl.F_GETPIPE_SZ) + # Multiply the default with 2 to get a new value. + fcntl.fcntl(test_pipe_w, fcntl.F_SETPIPE_SZ, pipesize_default * 2) + self.assertEqual(fcntl.fcntl(test_pipe_w, fcntl.F_GETPIPE_SZ), pipesize_default * 2) + os.close(test_pipe_r) + os.close(test_pipe_w) + + def test_main(): run_unittest(TestFcntl) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 434ba567db0a56..8b576c036ef0d2 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -39,6 +39,11 @@ except ImportError: grp = None +try: + import fcntl +except: + fcntl = None + if support.PGO: raise unittest.SkipTest("test is not helpful for PGO") @@ -661,6 +666,46 @@ def test_stdin_devnull(self): p.wait() self.assertEqual(p.stdin, None) + def test_pipesizes(self): + # stdin redirection + pipesize = 16 * 1024 + p = subprocess.Popen([sys.executable, "-c", + 'import sys; sys.stdin.read(); sys.stdout.write("out"); sys.stderr.write("error!")'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + pipesize=pipesize) + # We only assert pipe size has changed on platforms that support it. + if sys.platform != "win32" and hasattr(fcntl, "F_GETPIPE_SZ"): + for fifo in [p.stdin, p.stdout, p.stderr]: + self.assertEqual(fcntl.fcntl(fifo.fileno(), fcntl.F_GETPIPE_SZ), pipesize) + # Windows pipe size can be acquired with the GetNamedPipeInfoFunction + # https://docs.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-getnamedpipeinfo + # However, this function is not yet in _winapi. + p.stdin.write(b"pear") + p.stdin.close() + p.wait() + + def test_pipesize_default(self): + p = subprocess.Popen([sys.executable, "-c", + 'import sys; sys.stdin.read(); sys.stdout.write("out");' + ' sys.stderr.write("error!")'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + pipesize=-1) + # UNIX tests using fcntl + if sys.platform != "win32" and hasattr(fcntl, "F_GETPIPE_SZ"): + fp_r, fp_w = os.pipe() + default_pipesize = fcntl.fcntl(fp_w, fcntl.F_GETPIPE_SZ) + for fifo in [p.stdin, p.stdout, p.stderr]: + self.assertEqual( + fcntl.fcntl(fifo.fileno(), fcntl.F_GETPIPE_SZ), default_pipesize) + # On other platforms we cannot test the pipe size (yet). But above code + # using pipesize=-1 should not crash. + p.stdin.close() + p.wait() + def test_env(self): newenv = os.environ.copy() newenv["FRUIT"] = "orange" @@ -3503,7 +3548,7 @@ def test_getoutput(self): def test__all__(self): """Ensure that __all__ is populated properly.""" - intentionally_excluded = {"list2cmdline", "Handle", "pwd", "grp"} + intentionally_excluded = {"list2cmdline", "Handle", "pwd", "grp", "fcntl"} exported = set(subprocess.__all__) possible_exports = set() import types diff --git a/Misc/ACKS b/Misc/ACKS index d81d0a255145cb..687bcb2c6ababc 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1818,6 +1818,7 @@ Johannes Vogel Michael Vogt Radu Voicilas Alex Volkov +Ruben Vorderman Guido Vranken Martijn Vries Sjoerd de Vries diff --git a/Misc/NEWS.d/next/Library/2020-08-19-08-32-13.bpo-41586.IYjmjK.rst b/Misc/NEWS.d/next/Library/2020-08-19-08-32-13.bpo-41586.IYjmjK.rst new file mode 100644 index 00000000000000..40461679ebdfeb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-19-08-32-13.bpo-41586.IYjmjK.rst @@ -0,0 +1,2 @@ +Add F_SETPIPE_SZ and F_GETPIPE_SZ to fcntl module. Allow setting pipesize on +subprocess.Popen. diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index afd28106faf4b7..cdf0f9bf3790e2 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -565,6 +565,14 @@ all_ins(PyObject* m) if (PyModule_AddIntMacro(m, F_SHLCK)) return -1; #endif +/* Linux specifics */ +#ifdef F_SETPIPE_SZ + if (PyModule_AddIntMacro(m, F_SETPIPE_SZ)) return -1; +#endif +#ifdef F_GETPIPE_SZ + if (PyModule_AddIntMacro(m, F_GETPIPE_SZ)) return -1; +#endif + /* OS X specifics */ #ifdef F_FULLFSYNC if (PyModule_AddIntMacro(m, F_FULLFSYNC)) return -1; From 845d7654e23620c100b3474032f4726917909673 Mon Sep 17 00:00:00 2001 From: Justin Turner Arthur Date: Mon, 19 Oct 2020 20:18:57 -0500 Subject: [PATCH 0305/1261] bpo-38912: fix close before connect callback in test_asyncio SSL tests (GH-22691) Reduces the rate at which the ENV CHANGED failure occurs in test_asyncio SSL tests (due to unclosed transport), but does not 100% resolve it. --- Lib/test/test_asyncio/test_events.py | 2 ++ Misc/ACKS | 1 + 2 files changed, 3 insertions(+) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index ef9d6fc48e9f88..b8fe466cd53dfc 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1076,6 +1076,7 @@ def test_create_unix_server_ssl_verified(self): ssl=sslcontext_client, server_hostname='localhost') client, pr = self.loop.run_until_complete(f_c) + self.loop.run_until_complete(proto.connected) # close connection proto.transport.close() @@ -1101,6 +1102,7 @@ def test_create_server_ssl_verified(self): ssl=sslcontext_client, server_hostname='localhost') client, pr = self.loop.run_until_complete(f_c) + self.loop.run_until_complete(proto.connected) # extra info is available self.check_ssl_extra_info(client, peername=(host, port), diff --git a/Misc/ACKS b/Misc/ACKS index 687bcb2c6ababc..0aab4567d6ee98 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -70,6 +70,7 @@ Alexandru Ardelean Emmanuel Arias Alicia Arlen Jeffrey Armstrong +Justin Turner Arthur Jason Asbahr David Ascher Ammar Askar From ac8ef7fca2365d776ebb2c1974a43942c8cbd9c3 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Mon, 19 Oct 2020 22:04:01 -0700 Subject: [PATCH 0306/1261] bpo-4356: Add key function support to the bisect module (GH-20556) --- Doc/library/bisect.rst | 118 +++++++++++++----- Doc/tools/susp-ignored.csv | 2 - Lib/bisect.py | 66 +++++++--- Lib/test/test_bisect.py | 57 +++++++++ .../2020-05-31-10-48-47.bpo-4356.P8kXqp.rst | 1 + Modules/_bisectmodule.c | 80 +++++++++--- Modules/clinic/_bisectmodule.c.h | 102 ++++++++++----- 7 files changed, 333 insertions(+), 93 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-05-31-10-48-47.bpo-4356.P8kXqp.rst diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index 6bf7814b257f4a..f34ee175ba6574 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -21,7 +21,7 @@ example of the algorithm (the boundary conditions are already right!). The following functions are provided: -.. function:: bisect_left(a, x, lo=0, hi=len(a)) +.. function:: bisect_left(a, x, lo=0, hi=len(a), *, key=None) Locate the insertion point for *x* in *a* to maintain sorted order. The parameters *lo* and *hi* may be used to specify a subset of the list @@ -31,39 +31,106 @@ The following functions are provided: parameter to ``list.insert()`` assuming that *a* is already sorted. The returned insertion point *i* partitions the array *a* into two halves so - that ``all(val < x for val in a[lo:i])`` for the left side and - ``all(val >= x for val in a[i:hi])`` for the right side. + that ``all(val < x for val in a[lo : i])`` for the left side and + ``all(val >= x for val in a[i : hi])`` for the right side. -.. function:: bisect_right(a, x, lo=0, hi=len(a)) + *key* specifies a :term:`key function` of one argument that is used to + extract a comparison key from each input element. The default value is + ``None`` (compare the elements directly). + + .. versionchanged:: 3.10 + Added the *key* parameter. + + +.. function:: bisect_right(a, x, lo=0, hi=len(a), *, key=None) bisect(a, x, lo=0, hi=len(a)) Similar to :func:`bisect_left`, but returns an insertion point which comes after (to the right of) any existing entries of *x* in *a*. The returned insertion point *i* partitions the array *a* into two halves so - that ``all(val <= x for val in a[lo:i])`` for the left side and - ``all(val > x for val in a[i:hi])`` for the right side. + that ``all(val <= x for val in a[lo : i])`` for the left side and + ``all(val > x for val in a[i : hi])`` for the right side. + + *key* specifies a :term:`key function` of one argument that is used to + extract a comparison key from each input element. The default value is + ``None`` (compare the elements directly). + + .. versionchanged:: 3.10 + Added the *key* parameter. + -.. function:: insort_left(a, x, lo=0, hi=len(a)) +.. function:: insort_left(a, x, lo=0, hi=len(a), *, key=None) - Insert *x* in *a* in sorted order. This is equivalent to - ``a.insert(bisect.bisect_left(a, x, lo, hi), x)`` assuming that *a* is - already sorted. Keep in mind that the O(log n) search is dominated by - the slow O(n) insertion step. + Insert *x* in *a* in sorted order. -.. function:: insort_right(a, x, lo=0, hi=len(a)) + *key* specifies a :term:`key function` of one argument that is used to + extract a comparison key from each input element. The default value is + ``None`` (compare the elements directly). + + This function first runs :func:`bisect_left` to locate an insertion point. + Next, it runs the :meth:`insert` method on *a* to insert *x* at the + appropriate position to maintain sort order. + + Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) + insertion step. + + .. versionchanged:: 3.10 + Added the *key* parameter. + + +.. function:: insort_right(a, x, lo=0, hi=len(a), *, key=None) insort(a, x, lo=0, hi=len(a)) Similar to :func:`insort_left`, but inserting *x* in *a* after any existing entries of *x*. + *key* specifies a :term:`key function` of one argument that is used to + extract a comparison key from each input element. The default value is + ``None`` (compare the elements directly). + + This function first runs :func:`bisect_right` to locate an insertion point. + Next, it runs the :meth:`insert` method on *a* to insert *x* at the + appropriate position to maintain sort order. + + Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) + insertion step. + + .. versionchanged:: 3.10 + Added the *key* parameter. + + +Performance Notes +----------------- + +When writing time sensitive code using *bisect()* and *insort()*, keep these +thoughts in mind: + +* Bisection is effective for searching ranges of values. + For locating specific values, dictionaries are more performant. + +* The *insort()* functions are ``O(n)`` because the logarithmic search step + is dominated by the linear time insertion step. + +* The search functions are stateless and discard key function results after + they are used. Consequently, if the search functions are used in a loop, + the key function may be called again and again on the same array elements. + If the key function isn't fast, consider wrapping it with + :func:`functools.cache` to avoid duplicate computations. Alternatively, + consider searching an array of precomputed keys to locate the insertion + point (as shown in the examples section below). + .. seealso:: - `SortedCollection recipe - `_ that uses - bisect to build a full-featured collection class with straight-forward search - methods and support for a key-function. The keys are precomputed to save - unnecessary calls to the key function during searches. + * `Sorted Collections + `_ is a high performance + module that uses *bisect* to managed sorted collections of data. + + * The `SortedCollection recipe + `_ uses + bisect to build a full-featured collection class with straight-forward search + methods and support for a key-function. The keys are precomputed to save + unnecessary calls to the key function during searches. Searching Sorted Lists @@ -110,8 +177,8 @@ lists:: raise ValueError -Other Examples --------------- +Examples +-------- .. _bisect-example: @@ -127,17 +194,12 @@ a 'B', and so on:: >>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]] ['F', 'A', 'C', 'C', 'B', 'A', 'A'] -Unlike the :func:`sorted` function, it does not make sense for the :func:`bisect` -functions to have *key* or *reversed* arguments because that would lead to an -inefficient design (successive calls to bisect functions would not "remember" -all of the previous key lookups). - -Instead, it is better to search a list of precomputed keys to find the index -of the record in question:: +One technique to avoid repeated calls to a key function is to search a list of +precomputed keys to find the index of a record:: >>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)] - >>> data.sort(key=lambda r: r[1]) - >>> keys = [r[1] for r in data] # precomputed list of keys + >>> data.sort(key=lambda r: r[1]) # Or use operator.itemgetter(1). + >>> keys = [r[1] for r in data] # Precompute a list of keys. >>> data[bisect_left(keys, 0)] ('black', 0) >>> data[bisect_left(keys, 1)] diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 7be8d0abd69a57..f85d6946954d6f 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -111,8 +111,6 @@ howto/urllib2,,:password,"""joe:password@example.com""" library/ast,,:upper,lower:upper library/ast,,:step,lower:upper:step library/audioop,,:ipos,"# factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)]," -library/bisect,32,:hi,all(val >= x for val in a[i:hi]) -library/bisect,42,:hi,all(val > x for val in a[i:hi]) library/configparser,,:home,my_dir: ${Common:home_dir}/twosheds library/configparser,,:option,${section:option} library/configparser,,:path,python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python} diff --git a/Lib/bisect.py b/Lib/bisect.py index 8336a4ed9ca0f8..d37da74f7b4055 100644 --- a/Lib/bisect.py +++ b/Lib/bisect.py @@ -1,6 +1,7 @@ """Bisection algorithms.""" -def insort_right(a, x, lo=0, hi=None): + +def insort_right(a, x, lo=0, hi=None, *, key=None): """Insert item x in list a, and keep it sorted assuming a is sorted. If x is already in a, insert it to the right of the rightmost x. @@ -8,11 +9,14 @@ def insort_right(a, x, lo=0, hi=None): Optional args lo (default 0) and hi (default len(a)) bound the slice of a to be searched. """ - - lo = bisect_right(a, x, lo, hi) + if key is None: + lo = bisect_right(a, x, lo, hi) + else: + lo = bisect_right(a, key(x), lo, hi, key=key) a.insert(lo, x) -def bisect_right(a, x, lo=0, hi=None): + +def bisect_right(a, x, lo=0, hi=None, *, key=None): """Return the index where to insert item x in list a, assuming a is sorted. The return value i is such that all e in a[:i] have e <= x, and all e in @@ -27,14 +31,26 @@ def bisect_right(a, x, lo=0, hi=None): raise ValueError('lo must be non-negative') if hi is None: hi = len(a) - while lo < hi: - mid = (lo+hi)//2 - # Use __lt__ to match the logic in list.sort() and in heapq - if x < a[mid]: hi = mid - else: lo = mid+1 + # Note, the comparison uses "<" to match the + # __lt__() logic in list.sort() and in heapq. + if key is None: + while lo < hi: + mid = (lo + hi) // 2 + if x < a[mid]: + hi = mid + else: + lo = mid + 1 + else: + while lo < hi: + mid = (lo + hi) // 2 + if x < key(a[mid]): + hi = mid + else: + lo = mid + 1 return lo -def insort_left(a, x, lo=0, hi=None): + +def insort_left(a, x, lo=0, hi=None, *, key=None): """Insert item x in list a, and keep it sorted assuming a is sorted. If x is already in a, insert it to the left of the leftmost x. @@ -43,11 +59,13 @@ def insort_left(a, x, lo=0, hi=None): slice of a to be searched. """ - lo = bisect_left(a, x, lo, hi) + if key is None: + lo = bisect_left(a, x, lo, hi) + else: + lo = bisect_left(a, key(x), lo, hi, key=key) a.insert(lo, x) - -def bisect_left(a, x, lo=0, hi=None): +def bisect_left(a, x, lo=0, hi=None, *, key=None): """Return the index where to insert item x in list a, assuming a is sorted. The return value i is such that all e in a[:i] have e < x, and all e in @@ -62,13 +80,25 @@ def bisect_left(a, x, lo=0, hi=None): raise ValueError('lo must be non-negative') if hi is None: hi = len(a) - while lo < hi: - mid = (lo+hi)//2 - # Use __lt__ to match the logic in list.sort() and in heapq - if a[mid] < x: lo = mid+1 - else: hi = mid + # Note, the comparison uses "<" to match the + # __lt__() logic in list.sort() and in heapq. + if key is None: + while lo < hi: + mid = (lo + hi) // 2 + if a[mid] < x: + lo = mid + 1 + else: + hi = mid + else: + while lo < hi: + mid = (lo + hi) // 2 + if key(a[mid]) < x: + lo = mid + 1 + else: + hi = mid return lo + # Overwrite above definitions with a fast C implementation try: from _bisect import * diff --git a/Lib/test/test_bisect.py b/Lib/test/test_bisect.py index fc7990d765e53b..20f8b9d7c0aa87 100644 --- a/Lib/test/test_bisect.py +++ b/Lib/test/test_bisect.py @@ -200,6 +200,63 @@ def test_keyword_args(self): self.module.insort(a=data, x=25, lo=1, hi=3) self.assertEqual(data, [10, 20, 25, 25, 25, 30, 40, 50]) + def test_lookups_with_key_function(self): + mod = self.module + + # Invariant: Index with a keyfunc on an array + # should match the index on an array where + # key function has already been applied. + + keyfunc = abs + arr = sorted([2, -4, 6, 8, -10], key=keyfunc) + precomputed_arr = list(map(keyfunc, arr)) + for x in precomputed_arr: + self.assertEqual( + mod.bisect_left(arr, x, key=keyfunc), + mod.bisect_left(precomputed_arr, x) + ) + self.assertEqual( + mod.bisect_right(arr, x, key=keyfunc), + mod.bisect_right(precomputed_arr, x) + ) + + keyfunc = str.casefold + arr = sorted('aBcDeEfgHhiIiij', key=keyfunc) + precomputed_arr = list(map(keyfunc, arr)) + for x in precomputed_arr: + self.assertEqual( + mod.bisect_left(arr, x, key=keyfunc), + mod.bisect_left(precomputed_arr, x) + ) + self.assertEqual( + mod.bisect_right(arr, x, key=keyfunc), + mod.bisect_right(precomputed_arr, x) + ) + + def test_insort(self): + from random import shuffle + mod = self.module + + # Invariant: As random elements are inserted in + # a target list, the targetlist remains sorted. + keyfunc = abs + data = list(range(-10, 11)) + list(range(-20, 20, 2)) + shuffle(data) + target = [] + for x in data: + mod.insort_left(target, x, key=keyfunc) + self.assertEqual( + sorted(target, key=keyfunc), + target + ) + target = [] + for x in data: + mod.insort_right(target, x, key=keyfunc) + self.assertEqual( + sorted(target, key=keyfunc), + target + ) + class TestBisectPython(TestBisect, unittest.TestCase): module = py_bisect diff --git a/Misc/NEWS.d/next/Library/2020-05-31-10-48-47.bpo-4356.P8kXqp.rst b/Misc/NEWS.d/next/Library/2020-05-31-10-48-47.bpo-4356.P8kXqp.rst new file mode 100644 index 00000000000000..f5211d8a76f74d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-05-31-10-48-47.bpo-4356.P8kXqp.rst @@ -0,0 +1 @@ +Add a key function to the bisect module. diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index 277e9755f27211..2d7c15bc1744b6 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -16,7 +16,8 @@ module _bisect _Py_IDENTIFIER(insert); static inline Py_ssize_t -internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi) +internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi, + PyObject* key) { PyObject *litem; Py_ssize_t mid; @@ -39,6 +40,14 @@ internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t litem = PySequence_GetItem(list, mid); if (litem == NULL) return -1; + if (key != Py_None) { + PyObject *newitem = PyObject_CallOneArg(key, litem); + if (newitem == NULL) { + Py_DECREF(litem); + return -1; + } + Py_SETREF(litem, newitem); + } res = PyObject_RichCompareBool(item, litem, Py_LT); Py_DECREF(litem); if (res < 0) @@ -58,6 +67,8 @@ _bisect.bisect_right -> Py_ssize_t x: object lo: Py_ssize_t = 0 hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + * + key: object = None Return the index where to insert item x in list a, assuming a is sorted. @@ -71,10 +82,10 @@ slice of a to be searched. static Py_ssize_t _bisect_bisect_right_impl(PyObject *module, PyObject *a, PyObject *x, - Py_ssize_t lo, Py_ssize_t hi) -/*[clinic end generated code: output=419e150cf1d2a235 input=e72212b282c83375]*/ + Py_ssize_t lo, Py_ssize_t hi, PyObject *key) +/*[clinic end generated code: output=3a4bc09cc7c8a73d input=1313e9ca20c8bc3c]*/ { - return internal_bisect_right(a, x, lo, hi); + return internal_bisect_right(a, x, lo, hi, key); } /*[clinic input] @@ -84,6 +95,8 @@ _bisect.insort_right x: object lo: Py_ssize_t = 0 hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + * + key: object = None Insert item x in list a, and keep it sorted assuming a is sorted. @@ -95,11 +108,22 @@ slice of a to be searched. static PyObject * _bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, - Py_ssize_t lo, Py_ssize_t hi) -/*[clinic end generated code: output=c2caa3d4cd02035a input=d1c45bfa68182669]*/ + Py_ssize_t lo, Py_ssize_t hi, PyObject *key) +/*[clinic end generated code: output=ac3bf26d07aedda2 input=44e1708e26b7b802]*/ { - PyObject *result; - Py_ssize_t index = internal_bisect_right(a, x, lo, hi); + PyObject *result, *key_x; + Py_ssize_t index; + + if (key == Py_None) { + index = internal_bisect_right(a, x, lo, hi, key); + } else { + key_x = PyObject_CallOneArg(key, x); + if (x == NULL) { + return NULL; + } + index = internal_bisect_right(a, key_x, lo, hi, key); + Py_DECREF(key_x); + } if (index < 0) return NULL; if (PyList_CheckExact(a)) { @@ -117,7 +141,8 @@ _bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, } static inline Py_ssize_t -internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi) +internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi, + PyObject *key) { PyObject *litem; Py_ssize_t mid; @@ -140,6 +165,14 @@ internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t h litem = PySequence_GetItem(list, mid); if (litem == NULL) return -1; + if (key != Py_None) { + PyObject *newitem = PyObject_CallOneArg(key, litem); + if (newitem == NULL) { + Py_DECREF(litem); + return -1; + } + Py_SETREF(litem, newitem); + } res = PyObject_RichCompareBool(litem, item, Py_LT); Py_DECREF(litem); if (res < 0) @@ -160,6 +193,8 @@ _bisect.bisect_left -> Py_ssize_t x: object lo: Py_ssize_t = 0 hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + * + key: object = None Return the index where to insert item x in list a, assuming a is sorted. @@ -173,10 +208,10 @@ slice of a to be searched. static Py_ssize_t _bisect_bisect_left_impl(PyObject *module, PyObject *a, PyObject *x, - Py_ssize_t lo, Py_ssize_t hi) -/*[clinic end generated code: output=af82168bc2856f24 input=2bd90f34afe5609f]*/ + Py_ssize_t lo, Py_ssize_t hi, PyObject *key) +/*[clinic end generated code: output=70749d6e5cae9284 input=3cbeec690f2f6c6e]*/ { - return internal_bisect_left(a, x, lo, hi); + return internal_bisect_left(a, x, lo, hi, key); } @@ -187,6 +222,8 @@ _bisect.insort_left x: object lo: Py_ssize_t = 0 hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + * + key: object = None Insert item x in list a, and keep it sorted assuming a is sorted. @@ -198,11 +235,22 @@ slice of a to be searched. static PyObject * _bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x, - Py_ssize_t lo, Py_ssize_t hi) -/*[clinic end generated code: output=9e8356c0844a182b input=bc4583308bce00cc]*/ + Py_ssize_t lo, Py_ssize_t hi, PyObject *key) +/*[clinic end generated code: output=b1d33e5e7ffff11e input=3ab65d8784f585b1]*/ { - PyObject *result; - Py_ssize_t index = internal_bisect_left(a, x, lo, hi); + PyObject *result, *key_x; + Py_ssize_t index; + + if (key == Py_None) { + index = internal_bisect_left(a, x, lo, hi, key); + } else { + key_x = PyObject_CallOneArg(key, x); + if (x == NULL) { + return NULL; + } + index = internal_bisect_left(a, key_x, lo, hi, key); + Py_DECREF(key_x); + } if (index < 0) return NULL; if (PyList_CheckExact(a)) { diff --git a/Modules/clinic/_bisectmodule.c.h b/Modules/clinic/_bisectmodule.c.h index 07fc9060d1d8fd..304e46cf158a74 100644 --- a/Modules/clinic/_bisectmodule.c.h +++ b/Modules/clinic/_bisectmodule.c.h @@ -3,7 +3,7 @@ preserve [clinic start generated code]*/ PyDoc_STRVAR(_bisect_bisect_right__doc__, -"bisect_right($module, /, a, x, lo=0, hi=None)\n" +"bisect_right($module, /, a, x, lo=0, hi=None, *, key=None)\n" "--\n" "\n" "Return the index where to insert item x in list a, assuming a is sorted.\n" @@ -20,20 +20,21 @@ PyDoc_STRVAR(_bisect_bisect_right__doc__, static Py_ssize_t _bisect_bisect_right_impl(PyObject *module, PyObject *a, PyObject *x, - Py_ssize_t lo, Py_ssize_t hi); + Py_ssize_t lo, Py_ssize_t hi, PyObject *key); static PyObject * _bisect_bisect_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static const char * const _keywords[] = {"a", "x", "lo", "hi", "key", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "bisect_right", 0}; - PyObject *argsbuf[4]; + PyObject *argsbuf[5]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *a; PyObject *x; Py_ssize_t lo = 0; Py_ssize_t hi = -1; + PyObject *key = Py_None; Py_ssize_t _return_value; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); @@ -62,11 +63,21 @@ _bisect_bisect_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, goto skip_optional_pos; } } - if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { - goto exit; + if (args[3]) { + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } } skip_optional_pos: - _return_value = _bisect_bisect_right_impl(module, a, x, lo, hi); + if (!noptargs) { + goto skip_optional_kwonly; + } + key = args[4]; +skip_optional_kwonly: + _return_value = _bisect_bisect_right_impl(module, a, x, lo, hi, key); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; } @@ -77,7 +88,7 @@ _bisect_bisect_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, } PyDoc_STRVAR(_bisect_insort_right__doc__, -"insort_right($module, /, a, x, lo=0, hi=None)\n" +"insort_right($module, /, a, x, lo=0, hi=None, *, key=None)\n" "--\n" "\n" "Insert item x in list a, and keep it sorted assuming a is sorted.\n" @@ -92,20 +103,21 @@ PyDoc_STRVAR(_bisect_insort_right__doc__, static PyObject * _bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, - Py_ssize_t lo, Py_ssize_t hi); + Py_ssize_t lo, Py_ssize_t hi, PyObject *key); static PyObject * _bisect_insort_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static const char * const _keywords[] = {"a", "x", "lo", "hi", "key", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "insort_right", 0}; - PyObject *argsbuf[4]; + PyObject *argsbuf[5]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *a; PyObject *x; Py_ssize_t lo = 0; Py_ssize_t hi = -1; + PyObject *key = Py_None; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); if (!args) { @@ -133,18 +145,28 @@ _bisect_insort_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, goto skip_optional_pos; } } - if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { - goto exit; + if (args[3]) { + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } } skip_optional_pos: - return_value = _bisect_insort_right_impl(module, a, x, lo, hi); + if (!noptargs) { + goto skip_optional_kwonly; + } + key = args[4]; +skip_optional_kwonly: + return_value = _bisect_insort_right_impl(module, a, x, lo, hi, key); exit: return return_value; } PyDoc_STRVAR(_bisect_bisect_left__doc__, -"bisect_left($module, /, a, x, lo=0, hi=None)\n" +"bisect_left($module, /, a, x, lo=0, hi=None, *, key=None)\n" "--\n" "\n" "Return the index where to insert item x in list a, assuming a is sorted.\n" @@ -161,20 +183,21 @@ PyDoc_STRVAR(_bisect_bisect_left__doc__, static Py_ssize_t _bisect_bisect_left_impl(PyObject *module, PyObject *a, PyObject *x, - Py_ssize_t lo, Py_ssize_t hi); + Py_ssize_t lo, Py_ssize_t hi, PyObject *key); static PyObject * _bisect_bisect_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static const char * const _keywords[] = {"a", "x", "lo", "hi", "key", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "bisect_left", 0}; - PyObject *argsbuf[4]; + PyObject *argsbuf[5]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *a; PyObject *x; Py_ssize_t lo = 0; Py_ssize_t hi = -1; + PyObject *key = Py_None; Py_ssize_t _return_value; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); @@ -203,11 +226,21 @@ _bisect_bisect_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P goto skip_optional_pos; } } - if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { - goto exit; + if (args[3]) { + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } } skip_optional_pos: - _return_value = _bisect_bisect_left_impl(module, a, x, lo, hi); + if (!noptargs) { + goto skip_optional_kwonly; + } + key = args[4]; +skip_optional_kwonly: + _return_value = _bisect_bisect_left_impl(module, a, x, lo, hi, key); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; } @@ -218,7 +251,7 @@ _bisect_bisect_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P } PyDoc_STRVAR(_bisect_insort_left__doc__, -"insort_left($module, /, a, x, lo=0, hi=None)\n" +"insort_left($module, /, a, x, lo=0, hi=None, *, key=None)\n" "--\n" "\n" "Insert item x in list a, and keep it sorted assuming a is sorted.\n" @@ -233,20 +266,21 @@ PyDoc_STRVAR(_bisect_insort_left__doc__, static PyObject * _bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x, - Py_ssize_t lo, Py_ssize_t hi); + Py_ssize_t lo, Py_ssize_t hi, PyObject *key); static PyObject * _bisect_insort_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static const char * const _keywords[] = {"a", "x", "lo", "hi", "key", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "insort_left", 0}; - PyObject *argsbuf[4]; + PyObject *argsbuf[5]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *a; PyObject *x; Py_ssize_t lo = 0; Py_ssize_t hi = -1; + PyObject *key = Py_None; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); if (!args) { @@ -274,13 +308,23 @@ _bisect_insort_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P goto skip_optional_pos; } } - if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { - goto exit; + if (args[3]) { + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } } skip_optional_pos: - return_value = _bisect_insort_left_impl(module, a, x, lo, hi); + if (!noptargs) { + goto skip_optional_kwonly; + } + key = args[4]; +skip_optional_kwonly: + return_value = _bisect_insort_left_impl(module, a, x, lo, hi, key); exit: return return_value; } -/*[clinic end generated code: output=6cf46f205659f01a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b3a5be025aa4ed7e input=a9049054013a1b77]*/ From c620b7846c7deb8222b68657e845643f758190c9 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 20 Oct 2020 06:22:44 +0100 Subject: [PATCH 0307/1261] bpo-42093: Add opcode cache for LOAD_ATTR (GH-22803) --- Doc/whatsnew/3.10.rst | 3 + Include/cpython/dictobject.h | 1 + Include/internal/pycore_code.h | 7 + .../2020-10-20-04-24-07.bpo-42093.ooZZNh.rst | 2 + Objects/codeobject.c | 4 +- Objects/dictobject.c | 65 ++++++ Python/ceval.c | 221 +++++++++++++++++- 7 files changed, 296 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-20-04-24-07.bpo-42093.ooZZNh.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index f57e1b412378e6..e275a7cb4573f0 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -252,6 +252,9 @@ Optimizations average. (Contributed by Victor Stinner in :issue:`41006`.) +* The ``LOAD_ATTR`` instruction now uses new "per opcode cache" mechanism. + It is about 36% faster now. (Contributed by Pablo Galindo and Yury Selivanov + in :issue:`42093`.) Deprecated ========== diff --git a/Include/cpython/dictobject.h b/Include/cpython/dictobject.h index 5a15630cfbac70..f67c3214ddd9ab 100644 --- a/Include/cpython/dictobject.h +++ b/Include/cpython/dictobject.h @@ -71,6 +71,7 @@ PyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out); int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, PyObject *name, PyObject *value); PyObject *_PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObject *); +Py_ssize_t _PyDict_GetItemHint(PyDictObject *, PyObject *, Py_ssize_t, PyObject **); /* _PyDictView */ diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 88956f109b4f79..f1e89d96b9ebb0 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -10,9 +10,16 @@ typedef struct { uint64_t builtins_ver; /* ma_version of builtin dict */ } _PyOpcache_LoadGlobal; +typedef struct { + PyTypeObject *type; + Py_ssize_t hint; + unsigned int tp_version_tag; +} _PyOpCodeOpt_LoadAttr; + struct _PyOpcache { union { _PyOpcache_LoadGlobal lg; + _PyOpCodeOpt_LoadAttr la; } u; char optimized; }; diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-20-04-24-07.bpo-42093.ooZZNh.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-20-04-24-07.bpo-42093.ooZZNh.rst new file mode 100644 index 00000000000000..36a12c1c1cb58a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-20-04-24-07.bpo-42093.ooZZNh.rst @@ -0,0 +1,2 @@ +The ``LOAD_ATTR`` instruction now uses new "per opcode cache" mechanism and +it is about 36% faster now. Patch by Pablo Galindo and Yury Selivanov. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 4ca22fc5029b82..c86d0e1f4ab714 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -301,8 +301,8 @@ _PyCode_InitOpcache(PyCodeObject *co) unsigned char opcode = _Py_OPCODE(opcodes[i]); i++; // 'i' is now aligned to (next_instr - first_instr) - // TODO: LOAD_METHOD, LOAD_ATTR - if (opcode == LOAD_GLOBAL) { + // TODO: LOAD_METHOD + if (opcode == LOAD_GLOBAL || opcode == LOAD_ATTR) { opts++; co->co_opcache_map[i] = (unsigned char)opts; if (opts > 254) { diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 6c3fc62d2ecc7e..8e749623452868 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1437,6 +1437,71 @@ PyDict_GetItem(PyObject *op, PyObject *key) return value; } +Py_ssize_t +_PyDict_GetItemHint(PyDictObject *mp, PyObject *key, + Py_ssize_t hint, PyObject **value) +{ + Py_hash_t hash; + PyThreadState *tstate; + + assert(*value == NULL); + assert(PyDict_CheckExact((PyObject*)mp)); + assert(PyUnicode_CheckExact(key)); + + if (hint >= 0 && hint < _PyDict_KeysSize(mp->ma_keys)) { + PyObject *res = NULL; + + PyDictKeyEntry *ep = DK_ENTRIES(mp->ma_keys) + (size_t)hint; + if (ep->me_key == key) { + if (mp->ma_keys->dk_lookup == lookdict_split) { + assert(mp->ma_values != NULL); + res = mp->ma_values[(size_t)hint]; + } + else { + res = ep->me_value; + } + if (res != NULL) { + *value = res; + return hint; + } + } + } + + if ((hash = ((PyASCIIObject *) key)->hash) == -1) + { + hash = PyObject_Hash(key); + if (hash == -1) { + PyErr_Clear(); + return -1; + } + } + + // We can arrive here with a NULL tstate during initialization: try + // running "python -Wi" for an example related to string interning + tstate = _PyThreadState_UncheckedGet(); + Py_ssize_t ix = 0; + if (tstate != NULL && tstate->curexc_type != NULL) { + /* preserve the existing exception */ + PyObject *err_type, *err_value, *err_tb; + PyErr_Fetch(&err_type, &err_value, &err_tb); + ix = (mp->ma_keys->dk_lookup)(mp, key, hash, value); + /* ignore errors */ + PyErr_Restore(err_type, err_value, err_tb); + if (ix < 0) { + return -1; + } + } + else { + ix = (mp->ma_keys->dk_lookup)(mp, key, hash, value); + if (ix < 0) { + PyErr_Clear(); + return -1; + } + } + + return ix; +} + /* Same as PyDict_GetItemWithError() but with hash supplied by caller. This returns NULL *with* an exception set if an exception occurred. It returns NULL *without* an exception set if the key wasn't present. diff --git a/Python/ceval.c b/Python/ceval.c index 762de577e6b550..fafbf7524bb843 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -111,6 +111,7 @@ static long dxp[256]; #else #define OPCACHE_MIN_RUNS 1024 /* create opcache when code executed this time */ #endif +#define OPCODE_CACHE_MAX_TRIES 20 #define OPCACHE_STATS 0 /* Enable stats */ #if OPCACHE_STATS @@ -120,6 +121,12 @@ static size_t opcache_code_objects_extra_mem = 0; static size_t opcache_global_opts = 0; static size_t opcache_global_hits = 0; static size_t opcache_global_misses = 0; + +static size_t opcache_attr_opts = 0; +static size_t opcache_attr_hits = 0; +static size_t opcache_attr_misses = 0; +static size_t opcache_attr_deopts = 0; +static size_t opcache_attr_total = 0; #endif @@ -365,6 +372,25 @@ _PyEval_Fini(void) opcache_global_opts); fprintf(stderr, "\n"); + + fprintf(stderr, "-- Opcode cache LOAD_ATTR hits = %zd (%d%%)\n", + opcache_attr_hits, + (int) (100.0 * opcache_attr_hits / + opcache_attr_total)); + + fprintf(stderr, "-- Opcode cache LOAD_ATTR misses = %zd (%d%%)\n", + opcache_attr_misses, + (int) (100.0 * opcache_attr_misses / + opcache_attr_total)); + + fprintf(stderr, "-- Opcode cache LOAD_ATTR opts = %zd\n", + opcache_attr_opts); + + fprintf(stderr, "-- Opcode cache LOAD_ATTR deopts = %zd\n", + opcache_attr_deopts); + + fprintf(stderr, "-- Opcode cache LOAD_ATTR total = %zd\n", + opcache_attr_total); #endif } @@ -1224,16 +1250,43 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) do { \ co_opcache = NULL; \ if (co->co_opcache != NULL) { \ - unsigned char co_opt_offset = \ + unsigned char co_opcache_offset = \ co->co_opcache_map[next_instr - first_instr]; \ - if (co_opt_offset > 0) { \ - assert(co_opt_offset <= co->co_opcache_size); \ - co_opcache = &co->co_opcache[co_opt_offset - 1]; \ + if (co_opcache_offset > 0) { \ + assert(co_opcache_offset <= co->co_opcache_size); \ + co_opcache = &co->co_opcache[co_opcache_offset - 1]; \ assert(co_opcache != NULL); \ } \ } \ } while (0) +#define OPCACHE_DEOPT() \ + do { \ + if (co_opcache != NULL) { \ + co_opcache->optimized = -1; \ + unsigned char co_opcache_offset = \ + co->co_opcache_map[next_instr - first_instr]; \ + assert(co_opcache_offset <= co->co_opcache_size); \ + co->co_opcache_map[co_opcache_offset] = 0; \ + co_opcache = NULL; \ + } \ + } while (0) + +#define OPCACHE_DEOPT_LOAD_ATTR() \ + do { \ + if (co_opcache != NULL) { \ + OPCACHE_STAT_ATTR_DEOPT(); \ + OPCACHE_DEOPT(); \ + } \ + } while (0) + +#define OPCACHE_MAYBE_DEOPT_LOAD_ATTR() \ + do { \ + if (co_opcache != NULL && --co_opcache->optimized <= 0) { \ + OPCACHE_DEOPT_LOAD_ATTR(); \ + } \ + } while (0) + #if OPCACHE_STATS #define OPCACHE_STAT_GLOBAL_HIT() \ @@ -1251,12 +1304,43 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) if (co->co_opcache != NULL) opcache_global_opts++; \ } while (0) +#define OPCACHE_STAT_ATTR_HIT() \ + do { \ + if (co->co_opcache != NULL) opcache_attr_hits++; \ + } while (0) + +#define OPCACHE_STAT_ATTR_MISS() \ + do { \ + if (co->co_opcache != NULL) opcache_attr_misses++; \ + } while (0) + +#define OPCACHE_STAT_ATTR_OPT() \ + do { \ + if (co->co_opcache!= NULL) opcache_attr_opts++; \ + } while (0) + +#define OPCACHE_STAT_ATTR_DEOPT() \ + do { \ + if (co->co_opcache != NULL) opcache_attr_deopts++; \ + } while (0) + +#define OPCACHE_STAT_ATTR_TOTAL() \ + do { \ + if (co->co_opcache != NULL) opcache_attr_total++; \ + } while (0) + #else /* OPCACHE_STATS */ #define OPCACHE_STAT_GLOBAL_HIT() #define OPCACHE_STAT_GLOBAL_MISS() #define OPCACHE_STAT_GLOBAL_OPT() +#define OPCACHE_STAT_ATTR_HIT() +#define OPCACHE_STAT_ATTR_MISS() +#define OPCACHE_STAT_ATTR_OPT() +#define OPCACHE_STAT_ATTR_DEOPT() +#define OPCACHE_STAT_ATTR_TOTAL() + #endif /* Start of code */ @@ -3023,7 +3107,134 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) case TARGET(LOAD_ATTR): { PyObject *name = GETITEM(names, oparg); PyObject *owner = TOP(); - PyObject *res = PyObject_GetAttr(owner, name); + + PyTypeObject *type = Py_TYPE(owner); + PyObject *res; + PyObject **dictptr; + PyObject *dict; + _PyOpCodeOpt_LoadAttr *la; + + OPCACHE_STAT_ATTR_TOTAL(); + + OPCACHE_CHECK(); + if (co_opcache != NULL && PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) + { + if (co_opcache->optimized > 0) { + /* Fast path -- cache hit makes LOAD_ATTR ~30% faster */ + la = &co_opcache->u.la; + if (la->type == type && la->tp_version_tag == type->tp_version_tag) + { + assert(type->tp_dict != NULL); + assert(type->tp_dictoffset > 0); + + dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset); + dict = *dictptr; + if (dict != NULL && PyDict_CheckExact(dict)) { + Py_ssize_t hint = la->hint; + Py_INCREF(dict); + res = NULL; + la->hint = _PyDict_GetItemHint((PyDictObject*)dict, name, hint, &res); + + if (res != NULL) { + if (la->hint == hint && hint >= 0) { + /* Our hint has helped -- cache hit. */ + OPCACHE_STAT_ATTR_HIT(); + } else { + /* The hint we provided didn't work. + Maybe next time? */ + OPCACHE_MAYBE_DEOPT_LOAD_ATTR(); + } + + Py_INCREF(res); + SET_TOP(res); + Py_DECREF(owner); + Py_DECREF(dict); + DISPATCH(); + } else { + // This attribute can be missing sometimes -- we + // don't want to optimize this lookup. + OPCACHE_DEOPT_LOAD_ATTR(); + Py_DECREF(dict); + } + } else { + // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact + OPCACHE_DEOPT_LOAD_ATTR(); + } + } else { + // The type of the object has either been updated, + // or is different. Maybe it will stabilize? + OPCACHE_MAYBE_DEOPT_LOAD_ATTR(); + } + + OPCACHE_STAT_ATTR_MISS(); + } + + if (co_opcache != NULL && /* co_opcache can be NULL after a DEOPT() call. */ + type->tp_getattro == PyObject_GenericGetAttr) + { + PyObject *descr; + Py_ssize_t ret; + + if (type->tp_dictoffset > 0) { + if (type->tp_dict == NULL) { + if (PyType_Ready(type) < 0) { + Py_DECREF(owner); + SET_TOP(NULL); + goto error; + } + } + + descr = _PyType_Lookup(type, name); + if (descr == NULL || + descr->ob_type->tp_descr_get == NULL || + !PyDescr_IsData(descr)) + { + dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset); + dict = *dictptr; + + if (dict != NULL && PyDict_CheckExact(dict)) { + Py_INCREF(dict); + res = NULL; + ret = _PyDict_GetItemHint((PyDictObject*)dict, name, -1, &res); + if (res != NULL) { + Py_INCREF(res); + Py_DECREF(dict); + Py_DECREF(owner); + SET_TOP(res); + + if (co_opcache->optimized == 0) { + // First time we optimize this opcode. */ + OPCACHE_STAT_ATTR_OPT(); + co_opcache->optimized = OPCODE_CACHE_MAX_TRIES; + } + + la = &co_opcache->u.la; + la->type = type; + la->tp_version_tag = type->tp_version_tag; + la->hint = ret; + + DISPATCH(); + } + Py_DECREF(dict); + } else { + // There is no dict, or __dict__ doesn't satisfy PyDict_CheckExact + OPCACHE_DEOPT_LOAD_ATTR(); + } + } else { + // We failed to find an attribute without a data-like descriptor + OPCACHE_DEOPT_LOAD_ATTR(); + } + } else { + // The object's class does not have a tp_dictoffset we can use + OPCACHE_DEOPT_LOAD_ATTR(); + } + } else if (type->tp_getattro != PyObject_GenericGetAttr) { + OPCACHE_DEOPT_LOAD_ATTR(); + } + } + + /* slow path */ + res = PyObject_GetAttr(owner, name); Py_DECREF(owner); SET_TOP(res); if (res == NULL) From 5c46911e03d2b309ad0cdb7db1d2d93261a0bc75 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Tue, 20 Oct 2020 09:26:33 +0200 Subject: [PATCH 0308/1261] bpo-41491: plistlib: accept hexadecimal integer values in xml plist files (GH-22764) --- Lib/plistlib.py | 6 +++++- Lib/test/test_plistlib.py | 13 +++++++++++++ .../2020-10-19-14-02-09.bpo-41491.d1BUWH.rst | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-19-14-02-09.bpo-41491.d1BUWH.rst diff --git a/Lib/plistlib.py b/Lib/plistlib.py index ba7ac1936479f7..a7403510a32168 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -252,7 +252,11 @@ def end_false(self): self.add_object(False) def end_integer(self): - self.add_object(int(self.get_data())) + raw = self.get_data() + if raw.startswith('0x') or raw.startswith('0X'): + self.add_object(int(raw, 16)) + else: + self.add_object(int(raw)) def end_real(self): self.add_object(float(self.get_data())) diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py index cb071da1f33a1b..c9dce0047b79c4 100644 --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -498,6 +498,19 @@ def test_invalidreal(self): self.assertRaises(ValueError, plistlib.loads, b"not real") + def test_integer_notations(self): + pl = b"456" + value = plistlib.loads(pl) + self.assertEqual(value, 456) + + pl = b"0xa" + value = plistlib.loads(pl) + self.assertEqual(value, 10) + + pl = b"0123" + value = plistlib.loads(pl) + self.assertEqual(value, 123) + def test_xml_encodings(self): base = TESTDATA[plistlib.FMT_XML] diff --git a/Misc/NEWS.d/next/Library/2020-10-19-14-02-09.bpo-41491.d1BUWH.rst b/Misc/NEWS.d/next/Library/2020-10-19-14-02-09.bpo-41491.d1BUWH.rst new file mode 100644 index 00000000000000..4f39c91b284fac --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-19-14-02-09.bpo-41491.d1BUWH.rst @@ -0,0 +1 @@ +plistlib: fix parsing XML plists with hexadecimal integer values From d5f98848bd836c06c665c4488496314b5734e29f Mon Sep 17 00:00:00 2001 From: Tomer Cohen Date: Tue, 20 Oct 2020 12:08:58 +0300 Subject: [PATCH 0309/1261] Doc: Add missing spaces after period for `posix_spawn` (GH-22730) --- Doc/library/os.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 8c3bc5fb87d61b..718d98138d2679 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3710,8 +3710,8 @@ written in Python, such as a mail server's external command delivery program. The positional-only arguments *path*, *args*, and *env* are similar to :func:`execve`. - The *path* parameter is the path to the executable file.The *path* should - contain a directory.Use :func:`posix_spawnp` to pass an executable file + The *path* parameter is the path to the executable file. The *path* should + contain a directory. Use :func:`posix_spawnp` to pass an executable file without directory. The *file_actions* argument may be a sequence of tuples describing actions From 622b95675b9f5a2ce47d3e7e5fffc963e32b20d5 Mon Sep 17 00:00:00 2001 From: Jakub Jelen Date: Tue, 20 Oct 2020 11:10:43 +0200 Subject: [PATCH 0310/1261] md5module: Fix doc strings variable names (GH-22722) --- Modules/md5module.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index 5cd4e945101321..9bd2bd17e4fbf1 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -211,7 +211,7 @@ static void md5_compress(struct md5_state *md5, const unsigned char *buf) /** Initialize the hash state - @param sha1 The hash state you wish to initialize + @param md5 The hash state you wish to initialize */ static void md5_init(struct md5_state *md5) @@ -227,7 +227,7 @@ md5_init(struct md5_state *md5) /** Process a block of memory though the hash - @param sha1 The hash state + @param md5 The hash state @param in The data to hash @param inlen The length of the data (octets) */ @@ -263,7 +263,7 @@ md5_process(struct md5_state *md5, const unsigned char *in, Py_ssize_t inlen) /** Terminate the hash to get the digest - @param sha1 The hash state + @param md5 The hash state @param out [out] The destination of the hash (16 bytes) */ static void From 49fd50cce17b46f7f202820a0a298474cfbf445d Mon Sep 17 00:00:00 2001 From: TIGirardi Date: Tue, 20 Oct 2020 08:39:52 -0300 Subject: [PATCH 0311/1261] bpo-38324: Fix test__locale.py Windows failures (GH-20529) Use wide-char _W_* fields of lconv structure on Windows Remove "ps_AF" from test__locale.known_numerics on Windows --- Lib/test/test__locale.py | 4 +++ .../2020-05-30-02-46-43.bpo-38324.476M-5.rst | 1 + Modules/_localemodule.c | 25 ++++++++++++++++--- Python/fileutils.c | 15 +++++++++-- 4 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-05-30-02-46-43.bpo-38324.476M-5.rst diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py index cda0ee91b700f7..59a00bad7d98a3 100644 --- a/Lib/test/test__locale.py +++ b/Lib/test/test__locale.py @@ -72,6 +72,10 @@ def accept(loc): 'ps_AF': ('\u066b', '\u066c'), } +if sys.platform == 'win32': + # ps_AF doesn't work on Windows: see bpo-38324 (msg361830) + del known_numerics['ps_AF'] + class _LocaleTests(unittest.TestCase): def setUp(self): diff --git a/Misc/NEWS.d/next/Windows/2020-05-30-02-46-43.bpo-38324.476M-5.rst b/Misc/NEWS.d/next/Windows/2020-05-30-02-46-43.bpo-38324.476M-5.rst new file mode 100644 index 00000000000000..c45aa13091429e --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-05-30-02-46-43.bpo-38324.476M-5.rst @@ -0,0 +1 @@ +Avoid Unicode errors when accessing certain locale data on Windows. diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 0fe2e08b41f9f6..9c7ce876e4059f 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -155,6 +155,7 @@ locale_is_ascii(const char *str) static int locale_decode_monetary(PyObject *dict, struct lconv *lc) { +#ifndef MS_WINDOWS int change_locale; change_locale = (!locale_is_ascii(lc->int_curr_symbol) || !locale_is_ascii(lc->currency_symbol) @@ -190,12 +191,18 @@ locale_decode_monetary(PyObject *dict, struct lconv *lc) } } +#define GET_LOCALE_STRING(ATTR) PyUnicode_DecodeLocale(lc->ATTR, NULL) +#else /* MS_WINDOWS */ +/* Use _W_* fields of Windows struct lconv */ +#define GET_LOCALE_STRING(ATTR) PyUnicode_FromWideChar(lc->_W_ ## ATTR, -1) +#endif /* MS_WINDOWS */ + int res = -1; #define RESULT_STRING(ATTR) \ do { \ PyObject *obj; \ - obj = PyUnicode_DecodeLocale(lc->ATTR, NULL); \ + obj = GET_LOCALE_STRING(ATTR); \ if (obj == NULL) { \ goto done; \ } \ @@ -211,14 +218,17 @@ locale_decode_monetary(PyObject *dict, struct lconv *lc) RESULT_STRING(mon_decimal_point); RESULT_STRING(mon_thousands_sep); #undef RESULT_STRING +#undef GET_LOCALE_STRING res = 0; done: +#ifndef MS_WINDOWS if (loc != NULL) { setlocale(LC_CTYPE, oldloc); } PyMem_Free(oldloc); +#endif return res; } @@ -258,9 +268,15 @@ _locale_localeconv_impl(PyObject *module) Py_DECREF(obj); \ } while (0) +#ifdef MS_WINDOWS +/* Use _W_* fields of Windows struct lconv */ +#define GET_LOCALE_STRING(ATTR) PyUnicode_FromWideChar(lc->_W_ ## ATTR, -1) +#else +#define GET_LOCALE_STRING(ATTR) PyUnicode_DecodeLocale(lc->ATTR, NULL) +#endif #define RESULT_STRING(s)\ do { \ - x = PyUnicode_DecodeLocale(lc->s, NULL); \ + x = GET_LOCALE_STRING(s); \ RESULT(#s, x); \ } while (0) @@ -289,8 +305,10 @@ _locale_localeconv_impl(PyObject *module) RESULT_INT(n_sign_posn); /* Numeric information: LC_NUMERIC encoding */ - PyObject *decimal_point, *thousands_sep; + PyObject *decimal_point = NULL, *thousands_sep = NULL; if (_Py_GetLocaleconvNumeric(lc, &decimal_point, &thousands_sep) < 0) { + Py_XDECREF(decimal_point); + Py_XDECREF(thousands_sep); goto failed; } @@ -319,6 +337,7 @@ _locale_localeconv_impl(PyObject *module) #undef RESULT #undef RESULT_STRING #undef RESULT_INT +#undef GET_LOCALE_STRING } #if defined(HAVE_WCSCOLL) diff --git a/Python/fileutils.c b/Python/fileutils.c index b79067f2b5d38b..e125ba46c21bae 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -2047,6 +2047,7 @@ _Py_GetLocaleconvNumeric(struct lconv *lc, assert(decimal_point != NULL); assert(thousands_sep != NULL); +#ifndef MS_WINDOWS int change_locale = 0; if ((strlen(lc->decimal_point) > 1 || ((unsigned char)lc->decimal_point[0]) > 127)) { change_locale = 1; @@ -2085,14 +2086,20 @@ _Py_GetLocaleconvNumeric(struct lconv *lc, } } +#define GET_LOCALE_STRING(ATTR) PyUnicode_DecodeLocale(lc->ATTR, NULL) +#else /* MS_WINDOWS */ +/* Use _W_* fields of Windows strcut lconv */ +#define GET_LOCALE_STRING(ATTR) PyUnicode_FromWideChar(lc->_W_ ## ATTR, -1) +#endif /* MS_WINDOWS */ + int res = -1; - *decimal_point = PyUnicode_DecodeLocale(lc->decimal_point, NULL); + *decimal_point = GET_LOCALE_STRING(decimal_point); if (*decimal_point == NULL) { goto done; } - *thousands_sep = PyUnicode_DecodeLocale(lc->thousands_sep, NULL); + *thousands_sep = GET_LOCALE_STRING(thousands_sep); if (*thousands_sep == NULL) { goto done; } @@ -2100,11 +2107,15 @@ _Py_GetLocaleconvNumeric(struct lconv *lc, res = 0; done: +#ifndef MS_WINDOWS if (loc != NULL) { setlocale(LC_CTYPE, oldloc); } PyMem_Free(oldloc); +#endif return res; + +#undef GET_LOCALE_STRING } /* Our selection logic for which function to use is as follows: From 9bad00ba185606f8bfd6163a3c1c2425a22cceef Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Tue, 20 Oct 2020 06:01:12 -0600 Subject: [PATCH 0312/1261] bpo-30612: Tweak Windows registry path syntax in the docs (GH-20281) --- Doc/using/windows.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index b95a43c853c288..275495bc6d1292 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -103,9 +103,9 @@ paths longer than this would not resolve and errors would result. In the latest versions of Windows, this limitation can be expanded to approximately 32,000 characters. Your administrator will need to activate the -"Enable Win32 long paths" group policy, or set the registry value -``HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled`` -to ``1``. +"Enable Win32 long paths" group policy, or set ``LongPathsEnabled`` to ``1`` +in the registry key +``HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem``. This allows the :func:`open` function, the :mod:`os` module and most other path functionality to accept and return paths longer than 260 characters. From 6b4980f7f37ffaf23fb48ab446a35f37dc5025e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Tue, 20 Oct 2020 14:21:08 +0200 Subject: [PATCH 0313/1261] bpo-38439: Add 256px IDLE icon to the .ico, drop gifs from it (GH-19648) --- Lib/idlelib/Icons/README.txt | 4 ++++ Lib/idlelib/Icons/idle.ico | Bin 19790 -> 57746 bytes .../2020-04-22-09-37-40.bpo-38439.ieXL-c.rst | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/IDLE/2020-04-22-09-37-40.bpo-38439.ieXL-c.rst diff --git a/Lib/idlelib/Icons/README.txt b/Lib/idlelib/Icons/README.txt index 8b471629ecb3ea..d91c4d5d8d8cfa 100644 --- a/Lib/idlelib/Icons/README.txt +++ b/Lib/idlelib/Icons/README.txt @@ -7,3 +7,7 @@ https://www.doxdesk.com/software/py/pyicons.html Various different formats and sizes are available at this GitHub Pull Request: https://github.com/python/cpython/pull/17473 + +The idle.ico file was created with ImageMagick: + + $ convert idle_16.png idle_32.png idle_48.png idle_256.png idle.ico diff --git a/Lib/idlelib/Icons/idle.ico b/Lib/idlelib/Icons/idle.ico index 3357aef14888c501bcd7bfe02393760306a18d06..2aa9a8300d9e29670ecbe585f5ab21579dece9c2 100644 GIT binary patch delta 43185 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 T_IDB!1U{}mQ%M4sGnxMf3dYqw delta 3007 zcma)8ZD?Cn7=H7$r0JTZX>XdQ^(MM5+|Zi4^&-~k*2yxhPN@D+5JhB8boj%dsKp<< z*$0{*!UZED+y02?21BS+5$4e9K5zxg#vICEvrIRgjBRz@nt|-~c~5RW*pK0xoO926 zp69$D=e#*L?;rHd?)2D19tu(>6T{O_e|d@CB%)ZXrW+oj=X?ZQcp=&wB6`O!cujvf zK$PzwTCqa(4DDS`^kKZthYsGFkvcy^FJtZbF(Ly#V3O8iEf!){#9P_wPue9Se5q8b zJ~b+g(e0MyDAi%E7DH9b8W|A+bGhnp z`6}S;(1TFeh9yi`mP{-<<#Ji+m}Lq|&((s$t&uCTpv*g5-EzPOUMRqU$f)qkPNCo+ z0Huoq;A3J%aM-T`7Xe4{Z6Sz^UByHd0XRF94lk~Qs;eUav5x>HsDcEj9562kqm}@d z%hmFN*brT)km?xh*E5C(`8Pdn&-qHD zC8Bgo^Hu)tUKa3R##c#ceX9hoHydLvkq6C(7DS7prCF*phL%CA7ikGK+H03kkeEbG zst0-u|5uF`r7FQKmfl6~S7@R*!P`-tw!@A!GDNrYf#O8%@sUF)|K-E+& z=!L@Sf`bVugK-cbJH};!GgcT^26o^uZ8A91g@^d#K)n zUK(V}ribX`H%95Rx7N_Uw^!5DmiuY@OY7;qSJu%7uRch-URz7wY+Xg4mmZ;=TQ}0z z9~J3{vw@C%@(LN>G7bH}wDJhk=pm+iW|$tBWqS4}rgc9vZ8*jBg#8=S>u67&WqRgM zrWfXzHeO`fy?Zz9-@l(u9Gs+W^Gsh|VLE*HFwM-&(Cq9i9Y21YPM$nTr%s)s)2C0< z<#WH%iGP^p=H}@9`SWz)!Uei?=@Knm{+oWk!8AWVPuH$pqZ>DF(9N4SYuTZ%%xKS4 zj%iQcwmlxuD&H+h$PS7$7Gq!-Sx8Pz4X2V?cRZdLY7nwnGoR1p^2WeGHph1)dwR6) zp`ot2g z5JcWG>oV9L3bHN)Sm=&-#<~!ta$uVI0h2qtZ6V+wBwa#+fx|w;FuC39ZL@0x6=iok zhA^8BINLx)cV7!vVX6!LkuTFmhHtZ(2Dk3PzIvyeH*4$mMgu2P5HtOMnaRP2Mq#9dI4M zhZ`F6ogu_f-$AjTHSmQA+q6^~D$4p1AOlwCXj&$Wga-#}X*6)xuFAvW$l#y~a%lrM zBnOnmwytW9r~BSC3z9S3Z|*;&5Q*Q6n&d zos``~HMZd507YP8A1%wsqM*}hL#{j}b^CB(i)(`|SVJ650vt5OU}FG9Yt~_P#*8X( zNrp9$LBTa(;H_e1RV+(;$qNu>3< zeeq%1GqHxso7dAvudSmmx2>niom=SMA8~~qXBzv3=_%Zlazjqwxo_V-nwpxT0|yS! z$>}|`3peN_ZpuT44$;x0N7YSv=FFK4{c-j;I(P0IUA%aa{+Yk5uEgutuh*}`%Jnap-`s|J&{T#dy{&5xUDZJ zy4KU%3vPQjj$Wr|qCcg_{CYbGxC1()S~8^v{HacNqAStguY0{qQo3&IeM>{ZE)A{% zUa#Nh@hs_UYts__dVeh7^~;1Fj%&aZVp@;+JaEtjr5{?L$M5qY09l_z1hOOs9RcWx zWN(kG=tTkuKGvU{JdDA9n?Y z&!fqIW0BHwZ25gtpK4DpPsmR#gSHl}fyXKzci%lV@829tHH$}B;5FXWUu=5R{~yyq By*vN_ diff --git a/Misc/NEWS.d/next/IDLE/2020-04-22-09-37-40.bpo-38439.ieXL-c.rst b/Misc/NEWS.d/next/IDLE/2020-04-22-09-37-40.bpo-38439.ieXL-c.rst new file mode 100644 index 00000000000000..d8d59015f20e3d --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-04-22-09-37-40.bpo-38439.ieXL-c.rst @@ -0,0 +1,2 @@ +Add a 256×256 pixel IDLE icon to the Windows .ico file. Created by Andrew +Clover. Remove the low-color gif variations from the .ico file. From fa20b3e91c8c2e162593b8760823779d8432da4d Mon Sep 17 00:00:00 2001 From: Andrey Doroschenko Date: Tue, 20 Oct 2020 17:05:01 +0300 Subject: [PATCH 0314/1261] bpo-39693: mention KeyError in tarfile extractfile documentation (GH-18639) Co-authored-by: Andrey Darascheka --- Doc/library/tarfile.rst | 9 +++++---- Lib/tarfile.py | 7 ++++--- Misc/ACKS | 1 + .../2020-02-24-09-02-05.bpo-39693.QXw0Fm.rst | 1 + 4 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2020-02-24-09-02-05.bpo-39693.QXw0Fm.rst diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index cca466b5697948..7a114fdf5d54b1 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -445,10 +445,11 @@ be finalized; only the internally used file object will be closed. See the .. method:: TarFile.extractfile(member) - Extract a member from the archive as a file object. *member* may be a filename - or a :class:`TarInfo` object. If *member* is a regular file or a link, an - :class:`io.BufferedReader` object is returned. Otherwise, :const:`None` is - returned. + Extract a member from the archive as a file object. *member* may be + a filename or a :class:`TarInfo` object. If *member* is a regular file or + a link, an :class:`io.BufferedReader` object is returned. For all other + existing members, :const:`None` is returned. If *member* does not appear + in the archive, :exc:`KeyError` is raised. .. versionchanged:: 3.3 Return an :class:`io.BufferedReader` object. diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 1fae29430fefff..e42279470dac65 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -2093,9 +2093,10 @@ def extract(self, member, path="", set_attrs=True, *, numeric_owner=False): def extractfile(self, member): """Extract a member from the archive as a file object. `member' may be - a filename or a TarInfo object. If `member' is a regular file or a - link, an io.BufferedReader object is returned. Otherwise, None is - returned. + a filename or a TarInfo object. If `member' is a regular file or + a link, an io.BufferedReader object is returned. For all other + existing members, None is returned. If `member' does not appear + in the archive, KeyError is raised. """ self._check("r") diff --git a/Misc/ACKS b/Misc/ACKS index 0aab4567d6ee98..404f70ec87fe23 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1957,5 +1957,6 @@ Gennadiy Zlobin Doug Zongker Peter Åstrand Vlad Emelianov +Andrey Doroschenko (Entries should be added in rough alphabetical order by last names) diff --git a/Misc/NEWS.d/next/Documentation/2020-02-24-09-02-05.bpo-39693.QXw0Fm.rst b/Misc/NEWS.d/next/Documentation/2020-02-24-09-02-05.bpo-39693.QXw0Fm.rst new file mode 100644 index 00000000000000..86049c536815b9 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-02-24-09-02-05.bpo-39693.QXw0Fm.rst @@ -0,0 +1 @@ +Fix tarfile's extractfile documentation From 29839a48411219b4e8948ebf2b4110ecd011818e Mon Sep 17 00:00:00 2001 From: Andrew Kuchling Date: Tue, 20 Oct 2020 10:41:02 -0400 Subject: [PATCH 0315/1261] bpo-41192: Clarify the sys module's description of the auditing feature (GH-22768) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Éric Araujo --- Doc/library/sys.rst | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index d201d7061f9801..468a30d326891b 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -31,16 +31,22 @@ always available. When an auditing event is raised through the :func:`sys.audit` function, each hook will be called in the order it was added with the event name and the tuple of arguments. Native hooks added by :c:func:`PySys_AddAuditHook` are - called first, followed by hooks added in the current interpreter. + called first, followed by hooks added in the current interpreter. Hooks + can then log the event, raise an exception to abort the operation, + or terminate the process entirely. .. audit-event:: sys.addaudithook "" sys.addaudithook - Raise an auditing event ``sys.addaudithook`` with no arguments. If any + Calling :func:`sys.addaudithook` will itself raise an auditing event + named ``sys.addaudithook`` with no arguments. If any existing hooks raise an exception derived from :class:`RuntimeError`, the new hook will not be added and the exception suppressed. As a result, callers cannot assume that their hook has been added unless they control all existing hooks. + See the :ref:`audit events table ` for all events raised by + CPython, and :pep:`578` for the original design discussion. + .. versionadded:: 3.8 .. versionchanged:: 3.8.1 @@ -81,14 +87,23 @@ always available. .. index:: single: auditing - Raise an auditing event with any active hooks. The event name is a string - identifying the event and its associated schema, which is the number and - types of arguments. The schema for a given event is considered public and - stable API and should not be modified between releases. - - This function will raise the first exception raised by any hook. In general, - these errors should not be handled and should terminate the process as - quickly as possible. + Raise an auditing event and trigger any active auditing hooks. + *event* is a string identifying the event, and *args* may contain + optional arguments with more information about the event. The + number and types of arguments for a given event are considered a + public and stable API and should not be modified between releases. + + For example, one auditing event is named ``os.chdir``. This event has + one argument called *path* that will contain the requested new + working directory. + + :func:`sys.audit` will call the existing auditing hooks, passing + the event name and arguments, and will re-raise the first exception + from any hook. In general, if an exception is raised, it should not + be handled and the process should be terminated as quickly as + possible. This allows hook implementations to decide how to respond + to particular events: they can merely log the event or abort the + operation by raising an exception. Hooks are added using the :func:`sys.addaudithook` or :c:func:`PySys_AddAuditHook` functions. From 09a61ed94f9f6976029f83a3dae93b832ef4c258 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 20 Oct 2020 15:54:13 +0100 Subject: [PATCH 0316/1261] bpo-38439: Update the Windows Store package's icons for IDLE. Artwork by Andrew Clover (GH-22817) --- .../2020-10-20-13-19-42.bpo-38439.eMLi-t.rst | 1 + PC/icons/idlex150.png | Bin 0 -> 20537 bytes PC/icons/idlex44.png | Bin 0 -> 3473 bytes PC/layout/support/appxmanifest.py | 9 +++++++-- 4 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-10-20-13-19-42.bpo-38439.eMLi-t.rst create mode 100644 PC/icons/idlex150.png create mode 100644 PC/icons/idlex44.png diff --git a/Misc/NEWS.d/next/Windows/2020-10-20-13-19-42.bpo-38439.eMLi-t.rst b/Misc/NEWS.d/next/Windows/2020-10-20-13-19-42.bpo-38439.eMLi-t.rst new file mode 100644 index 00000000000000..acbc80c10f5e23 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-10-20-13-19-42.bpo-38439.eMLi-t.rst @@ -0,0 +1 @@ +Updates the icons for IDLE in the Windows Store package. diff --git a/PC/icons/idlex150.png b/PC/icons/idlex150.png new file mode 100644 index 0000000000000000000000000000000000000000..806cb0c8aa219be92c78937b5d291ba905cf9978 GIT binary patch literal 20537 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 ah2+BoRbd=;N(XBG5KcHZhdR3pY5xcQN_)fr literal 0 HcmV?d00001 diff --git a/PC/icons/idlex44.png b/PC/icons/idlex44.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef66e6c68e6bb77bf84fe310112a96908c23d73 GIT binary patch literal 3473 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 Date: Tue, 20 Oct 2020 19:45:38 +0300 Subject: [PATCH 0317/1261] bpo-38144: Re-add accidentally removed audition for glob. (GH-22805) --- Lib/glob.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/glob.py b/Lib/glob.py index 3c449a90dffef7..a491363f3f9395 100644 --- a/Lib/glob.py +++ b/Lib/glob.py @@ -33,6 +33,7 @@ def iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False): If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. """ + sys.audit("glob.glob", pathname, recursive) if root_dir is not None: root_dir = os.fspath(root_dir) else: From a0bdc58b4b75377a02717276062c6a7ec29f316a Mon Sep 17 00:00:00 2001 From: Saiyang Gou Date: Tue, 20 Oct 2020 12:23:15 -0700 Subject: [PATCH 0318/1261] bpo-41192: Add documentation of undocumented audit events (GH-21308) --- Doc/c-api/file.rst | 2 ++ Doc/library/audit_events.rst | 26 ++++++++++++++++++++++++++ Doc/library/functions.rst | 2 ++ Doc/library/types.rst | 10 ++++++++-- Doc/reference/datamodel.rst | 18 ++++++++++++++++++ 5 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst index ea027ee975c651..ed3735aa83608a 100644 --- a/Doc/c-api/file.rst +++ b/Doc/c-api/file.rst @@ -82,6 +82,8 @@ the :mod:`io` APIs instead. This function is safe to call before :c:func:`Py_Initialize`. + .. audit-event:: setopencodehook "" c.PyFile_SetOpenCodeHook + .. versionadded:: 3.8 diff --git a/Doc/library/audit_events.rst b/Doc/library/audit_events.rst index 3c68a1515b3eff..367d56e4e37359 100644 --- a/Doc/library/audit_events.rst +++ b/Doc/library/audit_events.rst @@ -19,3 +19,29 @@ information on handling these events. specific documentation for actual events raised. .. audit-event-table:: + +The following events are raised internally and do not correspond to any +public API of CPython: + ++--------------------------+-------------------------------------------+ +| Audit event | Arguments | ++==========================+===========================================+ +| _winapi.CreateFile | ``file_name``, ``desired_access``, | +| | ``share_mode``, ``creation_disposition``, | +| | ``flags_and_attributes`` | ++--------------------------+-------------------------------------------+ +| _winapi.CreateJunction | ``src_path``, ``dst_path`` | ++--------------------------+-------------------------------------------+ +| _winapi.CreateNamedPipe | ``name``, ``open_mode``, ``pipe_mode`` | ++--------------------------+-------------------------------------------+ +| _winapi.CreatePipe | | ++--------------------------+-------------------------------------------+ +| _winapi.CreateProcess | ``application_name``, ``command_line``, | +| | ``current_directory`` | ++--------------------------+-------------------------------------------+ +| _winapi.OpenProcess | ``process_id``, ``desired_access`` | ++--------------------------+-------------------------------------------+ +| _winapi.TerminateProcess | ``handle``, ``exit_code`` | ++--------------------------+-------------------------------------------+ +| ctypes.PyObj_FromPtr | ``obj`` | ++--------------------------+-------------------------------------------+ diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index a052e724c5ebef..b33aa81c643dc3 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -783,6 +783,8 @@ are always available. They are listed here in alphabetical order. .. impl-detail:: This is the address of the object in memory. + .. audit-event:: builtins.id id id + .. function:: input([prompt]) diff --git a/Doc/library/types.rst b/Doc/library/types.rst index e4a8dec5cb95a1..a5cf9ab1344a36 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -116,6 +116,11 @@ Standard names are defined for the following types: The type of user-defined functions and functions created by :keyword:`lambda` expressions. + .. audit-event:: function.__new__ code types.FunctionType + + The audit event only occurs for direct instantiation of function objects, + and is not raised for normal compilation. + .. data:: GeneratorType @@ -145,10 +150,11 @@ Standard names are defined for the following types: The type for code objects such as returned by :func:`compile`. - .. audit-event:: code.__new__ code,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags CodeType + .. audit-event:: code.__new__ code,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags types.CodeType Note that the audited arguments may not match the names or positions - required by the initializer. + required by the initializer. The audit event only occurs for direct + instantiation of code objects, and is not raised for normal compilation. .. method:: CodeType.replace(**kwargs) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 4396f1b9b72997..29e64cba2ca3ae 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1540,6 +1540,12 @@ access (use of, assignment to, or deletion of ``x.name``) for class instances. result of implicit invocation via language syntax or built-in functions. See :ref:`special-lookup`. + .. audit-event:: object.__getattr__ obj,name object.__getattribute__ + + For certain sensitive attribute accesses, raises an + :ref:`auditing event ` ``object.__getattr__`` with arguments + ``obj`` and ``name``. + .. method:: object.__setattr__(self, name, value) @@ -1551,12 +1557,24 @@ access (use of, assignment to, or deletion of ``x.name``) for class instances. call the base class method with the same name, for example, ``object.__setattr__(self, name, value)``. + .. audit-event:: object.__setattr__ obj,name,value object.__setattr__ + + For certain sensitive attribute assignments, raises an + :ref:`auditing event ` ``object.__setattr__`` with arguments + ``obj``, ``name``, ``value``. + .. method:: object.__delattr__(self, name) Like :meth:`__setattr__` but for attribute deletion instead of assignment. This should only be implemented if ``del obj.name`` is meaningful for the object. + .. audit-event:: object.__delattr__ obj,name object.__delattr__ + + For certain sensitive attribute deletions, raises an + :ref:`auditing event ` ``object.__delattr__`` with arguments + ``obj`` and ``name``. + .. method:: object.__dir__(self) From 981f7adf933ff7048bd9630bcf4a4b7d8b644a5b Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Tue, 20 Oct 2020 17:00:56 -0300 Subject: [PATCH 0319/1261] Minor tweaks to typing union objects doc (GH-22741) Automerge-Triggered-By: @merwok --- Doc/library/stdtypes.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 5c6acc66bb4cc3..2fc7a6118a322d 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4798,7 +4798,7 @@ type hinting syntax compared to :data:`typing.Union`. .. describe:: isinstance(obj, union_object) - Calls to :func:`isinstance` are also supported with a Union object:: + Calls to :func:`isinstance` are also supported with a union object:: >>> isinstance("", int | str) True @@ -4819,7 +4819,7 @@ type hinting syntax compared to :data:`typing.Union`. .. describe:: issubclass(obj, union_object) - Calls to :func:`issubclass` are also supported with a Union Object.:: + Calls to :func:`issubclass` are also supported with a union object:: >>> issubclass(bool, int | str) True @@ -4837,7 +4837,7 @@ type hinting syntax compared to :data:`typing.Union`. File "", line 1, in TypeError: issubclass() argument 2 cannot contain a parameterized generic -The type for the Union object is :data:`types.Union`. An object cannot be +The type of a union object is :data:`types.Union`. An object cannot be instantiated from the type:: >>> import types From 3954bb30fd96d3eb9083ee6a3c1886fc5d453da8 Mon Sep 17 00:00:00 2001 From: Paul Moore Date: Tue, 20 Oct 2020 21:02:24 +0100 Subject: [PATCH 0320/1261] bpo-42041: Clarify how subprocess searches for the executable (GH-22715) Clarify in the subprocess documentation how searching for the executable to run works, noting that ``sys.executable`` is the recommended way to find the current interpreter. --- Doc/library/subprocess.rst | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 7993b103f473e2..85d0f46624cead 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -344,7 +344,7 @@ functions. encoding=None, errors=None, text=None, pipesize=-1) Execute a child program in a new process. On POSIX, the class uses - :meth:`os.execvp`-like behavior to execute the child program. On Windows, + :meth:`os.execvpe`-like behavior to execute the child program. On Windows, the class uses the Windows ``CreateProcess()`` function. The arguments to :class:`Popen` are as follows. @@ -356,6 +356,25 @@ functions. arguments for additional differences from the default behavior. Unless otherwise stated, it is recommended to pass *args* as a sequence. + .. warning:: + + For maximum reliability, use a fully-qualified path for the executable. + To search for an unqualified name on :envvar:`PATH`, use + :meth:`shutil.which`. On all platforms, passing :data:`sys.executable` + is the recommended way to launch the current Python interpreter again, + and use the ``-m`` command-line format to launch an installed module. + + Resolving the path of *executable* (or the first item of *args*) is + platform dependent. For POSIX, see :meth:`os.execvpe`, and note that + when resolving or searching for the executable path, *cwd* overrides the + current working directory and *env* can override the ``PATH`` + environment variable. For Windows, see the documentation of the + ``lpApplicationName`` and ``lpCommandLine`` parameters of WinAPI + ``CreateProcess``, and note that when resolving or searching for the + executable path with ``shell=False``, *cwd* does not override the + current working directory and *env* cannot override the ``PATH`` + environment variable. Using a full path avoids all of these variations. + An example of passing some arguments to an external program as a sequence is:: @@ -524,7 +543,7 @@ functions. If *cwd* is not ``None``, the function changes the working directory to *cwd* before executing the child. *cwd* can be a string, bytes or - :term:`path-like ` object. In particular, the function + :term:`path-like ` object. In POSIX, the function looks for *executable* (or for the first item in *args*) relative to *cwd* if the executable path is a relative path. From ef6ecbd5dd062e36c16085dc34e69863a2b83f4a Mon Sep 17 00:00:00 2001 From: Florian Dahlitz Date: Tue, 20 Oct 2020 23:27:07 +0200 Subject: [PATCH 0321/1261] bpo-29981: Add examples and update index for set, dict, and generator comprehensions'(GH-20272) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémi Lapeyre --- Doc/glossary.rst | 12 ++++++++++++ Doc/library/stdtypes.rst | 14 ++++++++++++++ Doc/reference/expressions.rst | 4 ++++ Misc/ACKS | 1 + 4 files changed, 31 insertions(+) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 9fdbdb1a83f280..4f0654b3254e4b 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -308,6 +308,12 @@ Glossary keys can be any object with :meth:`__hash__` and :meth:`__eq__` methods. Called a hash in Perl. + dictionary comprehension + A compact way to process all or part of the elements in an iterable and + return a dictionary with the results. ``results = {n: n ** 2 for n in + range(10)}`` generates a dictionary containing key ``n`` mapped to + value ``n ** 2``. See :ref:`comprehensions`. + dictionary view The objects returned from :meth:`dict.keys`, :meth:`dict.values`, and :meth:`dict.items` are called dictionary views. They provide a dynamic @@ -1026,6 +1032,12 @@ Glossary interface can be registered explicitly using :func:`~abc.register`. + set comprehension + A compact way to process all or part of the elements in an iterable and + return a set with the results. ``results = {c for c in 'abracadabra' if + c not in 'abc'}`` generates the set of strings ``{'r', 'd'}``. See + :ref:`comprehensions`. + single dispatch A form of :term:`generic function` dispatch where the implementation is chosen based on the type of a single argument. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 2fc7a6118a322d..c74d1644636013 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4140,6 +4140,12 @@ The constructors for both classes work the same: objects. If *iterable* is not specified, a new empty set is returned. + Sets can be created by several means: + + * Use a comma-separated list of elements within braces: ``{'jack', 'sjoerd'}`` + * Use a set comprehension: ``{c for c in 'abracadabra' if c not in 'abc'}`` + * Use the type constructor: ``set()``, ``set('foobar')``, ``set(['a', 'b', 'foo'])`` + Instances of :class:`set` and :class:`frozenset` provide the following operations: @@ -4332,6 +4338,14 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: Return a new dictionary initialized from an optional positional argument and a possibly empty set of keyword arguments. + Dictionaries can be created by several means: + + * Use a comma-separated list of ``key: value`` pairs within braces: + ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: 'jack', 4127: 'sjoerd'}`` + * Use a dict comprehension: ``{}``, ``{x: x ** 2 for x in range(10)}`` + * Use the type constructor: ``dict()``, + ``dict([('foo', 100), ('bar', 200)])``, ``dict(foo=100, bar=200)`` + If no positional argument is given, an empty dictionary is created. If a positional argument is given and it is a mapping object, a dictionary is created with the same key-value pairs as the mapping object. Otherwise, diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index b68c29860cf332..81dd6fc860355f 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -162,6 +162,8 @@ ambiguities and allow common typos to pass uncaught. Displays for lists, sets and dictionaries ----------------------------------------- +.. index:: single: comprehensions + For constructing a list, a set or a dictionary Python provides special syntax called "displays", each of them in two flavors: @@ -260,6 +262,7 @@ Set displays .. index:: pair: set; display + pair: set; comprehensions object: set single: {} (curly brackets); set expression single: , (comma); expression list @@ -287,6 +290,7 @@ Dictionary displays .. index:: pair: dictionary; display + pair: dictionary; comprehensions key, datum, key/datum pair object: dictionary single: {} (curly brackets); dictionary expression diff --git a/Misc/ACKS b/Misc/ACKS index 404f70ec87fe23..5285693a6e6d40 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -382,6 +382,7 @@ Brian Curtin Jason Curtis Hakan Celik Paul Dagnelie +Florian Dahlitz Lisandro Dalcin Darren Dale Andrew Dalke From 690630a259b821ebd94314626e2a30ebed9ad31d Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Wed, 21 Oct 2020 07:38:08 +0800 Subject: [PATCH 0322/1261] bpo-42010: [docs] Clarify subscription of types (GH-22822) --- Doc/reference/expressions.rst | 15 +++++++++++++-- .../2020-10-21-02-21-14.bpo-42010.76vJ0u.rst | 4 ++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2020-10-21-02-21-14.bpo-42010.76vJ0u.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 81dd6fc860355f..938a9732f5a250 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -800,8 +800,8 @@ Subscriptions object: dictionary pair: sequence; item -A subscription selects an item of a sequence (string, tuple or list) or mapping -(dictionary) object: +Subscription of a sequence (string, tuple or list) or mapping (dictionary) +object usually selects an item from the collection: .. productionlist:: python-grammar subscription: `primary` "[" `expression_list` "]" @@ -837,6 +837,17 @@ this method will need to explicitly add that support. A string's items are characters. A character is not a separate data type but a string of exactly one character. +.. + At the time of writing this, there is no documentation for generic alias + or PEP 585. Thus the link currently points to PEP 585 itself. + Please change the link for generic alias to reference the correct + documentation once documentation for PEP 585 becomes available. + +Subscription of certain :term:`classes ` or :term:`types ` +creates a `generic alias `_. +In this case, user-defined classes can support subscription by providing a +:meth:`__class_getitem__` classmethod. + .. _slicings: diff --git a/Misc/NEWS.d/next/Documentation/2020-10-21-02-21-14.bpo-42010.76vJ0u.rst b/Misc/NEWS.d/next/Documentation/2020-10-21-02-21-14.bpo-42010.76vJ0u.rst new file mode 100644 index 00000000000000..2a0cbf10757837 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-10-21-02-21-14.bpo-42010.76vJ0u.rst @@ -0,0 +1,4 @@ +Clarify that subscription expressions are also valid for certain +:term:`classes ` and :term:`types ` in the standard library, and +for user-defined classes and types if the classmethod +:meth:`__class_getitem__` is provided. From 7f02445dfadfdbba5c5727ad9b9ccb1579b5dda2 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Tue, 20 Oct 2020 17:37:20 -0700 Subject: [PATCH 0323/1261] bpo-41586: Attempt to make the pipesize tests more robust. (GH-22839) Several buildbots are failing on these, likely due to an inability to set the pipe size to the desired test value. --- Lib/test/test_fcntl.py | 25 +++++++---- Lib/test/test_subprocess.py | 89 +++++++++++++++++++++++-------------- 2 files changed, 71 insertions(+), 43 deletions(-) diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py index 8d6e9ff788454f..83ee7a5b0d0120 100644 --- a/Lib/test/test_fcntl.py +++ b/Lib/test/test_fcntl.py @@ -190,17 +190,24 @@ def test_fcntl_f_getpath(self): res = fcntl.fcntl(self.f.fileno(), fcntl.F_GETPATH, bytes(len(expected))) self.assertEqual(expected, res) - @unittest.skipIf(not (hasattr(fcntl, "F_SETPIPE_SZ") and hasattr(fcntl, "F_GETPIPE_SZ")), - "F_SETPIPE_SZ and F_GETPIPE_SZ are not available on all unix platforms.") + @unittest.skipUnless( + hasattr(fcntl, "F_SETPIPE_SZ") and hasattr(fcntl, "F_GETPIPE_SZ"), + "F_SETPIPE_SZ and F_GETPIPE_SZ are not available on all platforms.") def test_fcntl_f_pipesize(self): test_pipe_r, test_pipe_w = os.pipe() - # Get the default pipesize with F_GETPIPE_SZ - pipesize_default = fcntl.fcntl(test_pipe_w, fcntl.F_GETPIPE_SZ) - # Multiply the default with 2 to get a new value. - fcntl.fcntl(test_pipe_w, fcntl.F_SETPIPE_SZ, pipesize_default * 2) - self.assertEqual(fcntl.fcntl(test_pipe_w, fcntl.F_GETPIPE_SZ), pipesize_default * 2) - os.close(test_pipe_r) - os.close(test_pipe_w) + try: + # Get the default pipesize with F_GETPIPE_SZ + pipesize_default = fcntl.fcntl(test_pipe_w, fcntl.F_GETPIPE_SZ) + pipesize = pipesize_default // 2 # A new value to detect change. + if pipesize < 512: # the POSIX minimum + raise unittest.SkitTest( + 'default pipesize too small to perform test.') + fcntl.fcntl(test_pipe_w, fcntl.F_SETPIPE_SZ, pipesize) + self.assertEqual(fcntl.fcntl(test_pipe_w, fcntl.F_GETPIPE_SZ), + pipesize) + finally: + os.close(test_pipe_r) + os.close(test_pipe_w) def test_main(): diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 8b576c036ef0d2..9fc4434649dbce 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -666,45 +666,66 @@ def test_stdin_devnull(self): p.wait() self.assertEqual(p.stdin, None) + @unittest.skipUnless(fcntl and hasattr(fcntl, 'F_GETPIPE_SZ'), + 'fcntl.F_GETPIPE_SZ required for test.') def test_pipesizes(self): - # stdin redirection - pipesize = 16 * 1024 - p = subprocess.Popen([sys.executable, "-c", - 'import sys; sys.stdin.read(); sys.stdout.write("out"); sys.stderr.write("error!")'], - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - pipesize=pipesize) - # We only assert pipe size has changed on platforms that support it. - if sys.platform != "win32" and hasattr(fcntl, "F_GETPIPE_SZ"): + test_pipe_r, test_pipe_w = os.pipe() + try: + # Get the default pipesize with F_GETPIPE_SZ + pipesize_default = fcntl.fcntl(test_pipe_w, fcntl.F_GETPIPE_SZ) + finally: + os.close(test_pipe_r) + os.close(test_pipe_w) + pipesize = pipesize_default // 2 + if pipesize < 512: # the POSIX minimum + raise unittest.SkitTest( + 'default pipesize too small to perform test.') + p = subprocess.Popen( + [sys.executable, "-c", + 'import sys; sys.stdin.read(); sys.stdout.write("out"); ' + 'sys.stderr.write("error!")'], + stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, pipesize=pipesize) + try: for fifo in [p.stdin, p.stdout, p.stderr]: - self.assertEqual(fcntl.fcntl(fifo.fileno(), fcntl.F_GETPIPE_SZ), pipesize) - # Windows pipe size can be acquired with the GetNamedPipeInfoFunction - # https://docs.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-getnamedpipeinfo - # However, this function is not yet in _winapi. - p.stdin.write(b"pear") - p.stdin.close() - p.wait() + self.assertEqual( + fcntl.fcntl(fifo.fileno(), fcntl.F_GETPIPE_SZ), + pipesize) + # Windows pipe size can be acquired via GetNamedPipeInfoFunction + # https://docs.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-getnamedpipeinfo + # However, this function is not yet in _winapi. + p.stdin.write(b"pear") + p.stdin.close() + finally: + p.kill() + p.wait() + @unittest.skipUnless(fcntl and hasattr(fcntl, 'F_GETPIPE_SZ'), + 'fcntl.F_GETPIPE_SZ required for test.') def test_pipesize_default(self): - p = subprocess.Popen([sys.executable, "-c", - 'import sys; sys.stdin.read(); sys.stdout.write("out");' - ' sys.stderr.write("error!")'], - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - pipesize=-1) - # UNIX tests using fcntl - if sys.platform != "win32" and hasattr(fcntl, "F_GETPIPE_SZ"): + p = subprocess.Popen( + [sys.executable, "-c", + 'import sys; sys.stdin.read(); sys.stdout.write("out"); ' + 'sys.stderr.write("error!")'], + stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, pipesize=-1) + try: fp_r, fp_w = os.pipe() - default_pipesize = fcntl.fcntl(fp_w, fcntl.F_GETPIPE_SZ) - for fifo in [p.stdin, p.stdout, p.stderr]: - self.assertEqual( - fcntl.fcntl(fifo.fileno(), fcntl.F_GETPIPE_SZ), default_pipesize) - # On other platforms we cannot test the pipe size (yet). But above code - # using pipesize=-1 should not crash. - p.stdin.close() - p.wait() + try: + default_pipesize = fcntl.fcntl(fp_w, fcntl.F_GETPIPE_SZ) + for fifo in [p.stdin, p.stdout, p.stderr]: + self.assertEqual( + fcntl.fcntl(fifo.fileno(), fcntl.F_GETPIPE_SZ), + default_pipesize) + finally: + os.close(fp_r) + os.close(fp_w) + # On other platforms we cannot test the pipe size (yet). But above + # code using pipesize=-1 should not crash. + p.stdin.close() + finally: + p.kill() + p.wait() def test_env(self): newenv = os.environ.copy() From 639d3e4dde398a2ab7339c082a1cb0526e4e7e4f Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 20 Oct 2020 20:56:01 -0400 Subject: [PATCH 0324/1261] Update idlelib/help.html to current Sphinx output (GH-22833) idle.rst is unchanged --- Lib/idlelib/help.html | 70 +++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 0edd3917e1ffa5..170999e1280173 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -1,23 +1,24 @@ - + - IDLE — Python 3.10.0a0 documentation + + IDLE — Python 3.10.0a1 documentation - - - - - + + + + + - + @@ -71,11 +72,12 @@

    Navigation

  • - 3.10.0a0 Documentation » + 3.10.0a1 Documentation »
  • +
  • @@ -426,30 +428,30 @@

    Key bindingsCommand key on macOS.

    • Backspace deletes to the left; Del deletes to the right

    • -
    • C-Backspace delete word left; C-Del delete word to the right

    • -
    • Arrow keys and Page Up/Page Down to move around

    • -
    • C-LeftArrow and C-RightArrow moves by words

    • +
    • C-Backspace delete word left; C-Del delete word to the right

    • +
    • Arrow keys and Page Up/Page Down to move around

    • +
    • C-LeftArrow and C-RightArrow moves by words

    • Home/End go to begin/end of line

    • -
    • C-Home/C-End go to begin/end of file

    • +
    • C-Home/C-End go to begin/end of file

    • Some useful Emacs bindings are inherited from Tcl/Tk:

        -
      • C-a beginning of line

      • -
      • C-e end of line

      • -
      • C-k kill line (but doesn’t put it in clipboard)

      • -
      • C-l center window around the insertion point

      • -
      • C-b go backward one character without deleting (usually you can +

      • C-a beginning of line

      • +
      • C-e end of line

      • +
      • C-k kill line (but doesn’t put it in clipboard)

      • +
      • C-l center window around the insertion point

      • +
      • C-b go backward one character without deleting (usually you can also use the cursor key for this)

      • -
      • C-f go forward one character without deleting (usually you can +

      • C-f go forward one character without deleting (usually you can also use the cursor key for this)

      • -
      • C-p go up one line (usually you can also use the cursor key for +

      • C-p go up one line (usually you can also use the cursor key for this)

      • -
      • C-d delete next character

      • +
      • C-d delete next character

    -

    Standard keybindings (like C-c to copy and C-v to paste) +

    Standard keybindings (like C-c to copy and C-v to paste) may work. Keybindings are selected in the Configure IDLE dialog.

  • -
  • C-d sends end-of-file; closes window if typed at a >>> prompt

  • -
  • Alt-/ (Expand word) is also useful to reduce typing

    +
  • C-c interrupts executing command

  • +
  • C-d sends end-of-file; closes window if typed at a >>> prompt

  • +
  • Alt-/ (Expand word) is also useful to reduce typing

    Command history

      -
    • Alt-p retrieves previous command matching what you have typed. On -macOS use C-p.

    • -
    • Alt-n retrieves next. On macOS use C-n.

    • +
    • Alt-p retrieves previous command matching what you have typed. On +macOS use C-p.

    • +
    • Alt-n retrieves next. On macOS use C-n.

    • Return while on any previous command retrieves that command

  • @@ -852,6 +854,7 @@

    Extensions @@ -947,11 +950,12 @@

    Navigation

  • - 3.10.0a0 Documentation » + 3.10.0a1 Documentation »
  • +
  • @@ -978,11 +982,11 @@

    Navigation



    - Last updated on Sep 22, 2020. + Last updated on Oct 20, 2020. Found a bug?
    - Created using Sphinx 2.1.1. + Created using Sphinx 3.2.1. From b58752d06a7073ad8b9b0a4c10c7ab35b22ac06b Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 21 Oct 2020 10:29:14 +0900 Subject: [PATCH 0325/1261] bpo-41902: Micro optimization for compute_item of range (GH-22492) --- .../2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst | 3 +++ Objects/rangeobject.c | 16 +++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst new file mode 100644 index 00000000000000..b118a6a36fae3f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst @@ -0,0 +1,3 @@ +Micro optimization when compute :c:member:`~PySequenceMethods.sq_item` and +:c:member:`~PyMappingMethods.mp_subscript` of :class:`range`. Patch by +Dong-hee Na. diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index ba6d4257174950..eaa48d5f44fcc7 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -254,11 +254,17 @@ compute_item(rangeobject *r, PyObject *i) /* PyLong equivalent to: * return r->start + (i * r->step) */ - incr = PyNumber_Multiply(i, r->step); - if (!incr) - return NULL; - result = PyNumber_Add(r->start, incr); - Py_DECREF(incr); + if (r->step == _PyLong_One) { + result = PyNumber_Add(r->start, i); + } + else { + incr = PyNumber_Multiply(i, r->step); + if (!incr) { + return NULL; + } + result = PyNumber_Add(r->start, incr); + Py_DECREF(incr); + } return result; } From 80c87ccc85f9698cd848dbbb731939176c6d8f90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC?= Date: Wed, 21 Oct 2020 05:08:19 +0300 Subject: [PATCH 0326/1261] bpo-23706: Add newline parameter to pathlib.Path.write_text (GH-22420) (GH-22420) * Add _newline_ parameter to `pathlib.Path.write_text()` * Update documentation of `pathlib.Path.write_text()` * Add test case for `pathlib.Path.write_text()` calls with _newline_ parameter passed Automerge-Triggered-By: GH:methane --- Doc/library/pathlib.rst | 5 ++++- Lib/pathlib.py | 4 ++-- Lib/test/test_pathlib.py | 20 +++++++++++++++++++ .../2020-09-30-11-05-11.bpo-23706.dHTGjF.rst | 1 + 4 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-30-11-05-11.bpo-23706.dHTGjF.rst diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 9526a03b053986..9de72bb725c758 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1166,7 +1166,7 @@ call fails (for example because the path doesn't exist). .. versionadded:: 3.5 -.. method:: Path.write_text(data, encoding=None, errors=None) +.. method:: Path.write_text(data, encoding=None, errors=None, newline=None) Open the file pointed to in text mode, write *data* to it, and close the file:: @@ -1182,6 +1182,9 @@ call fails (for example because the path doesn't exist). .. versionadded:: 3.5 + .. versionchanged:: 3.10 + The *newline* parameter was added. + Correspondence to tools in the :mod:`os` module ----------------------------------------------- diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 147be2ff0dddfc..178c5b981d8e50 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1264,14 +1264,14 @@ def write_bytes(self, data): with self.open(mode='wb') as f: return f.write(view) - def write_text(self, data, encoding=None, errors=None): + def write_text(self, data, encoding=None, errors=None, newline=None): """ Open the file in text mode, write to it, and close the file. """ if not isinstance(data, str): raise TypeError('data must be str, not %s' % data.__class__.__name__) - with self.open(mode='w', encoding=encoding, errors=errors) as f: + with self.open(mode='w', encoding=encoding, errors=errors, newline=newline) as f: return f.write(data) def readlink(self): diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 2cb6738a295b64..17292dc1abf73f 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1510,6 +1510,26 @@ def test_read_write_text(self): self.assertRaises(TypeError, (p / 'fileA').write_text, b'somebytes') self.assertEqual((p / 'fileA').read_text(encoding='latin-1'), 'äbcdefg') + def test_write_text_with_newlines(self): + p = self.cls(BASE) + # Check that `\n` character change nothing + (p / 'fileA').write_text('abcde\r\nfghlk\n\rmnopq', newline='\n') + self.assertEqual((p / 'fileA').read_bytes(), + b'abcde\r\nfghlk\n\rmnopq') + # Check that `\r` character replaces `\n` + (p / 'fileA').write_text('abcde\r\nfghlk\n\rmnopq', newline='\r') + self.assertEqual((p / 'fileA').read_bytes(), + b'abcde\r\rfghlk\r\rmnopq') + # Check that `\r\n` character replaces `\n` + (p / 'fileA').write_text('abcde\r\nfghlk\n\rmnopq', newline='\r\n') + self.assertEqual((p / 'fileA').read_bytes(), + b'abcde\r\r\nfghlk\r\n\rmnopq') + # Check that no argument passed will change `\n` to `os.linesep` + os_linesep_byte = bytes(os.linesep, encoding='ascii') + (p / 'fileA').write_text('abcde\nfghlk\n\rmnopq') + self.assertEqual((p / 'fileA').read_bytes(), + b'abcde' + os_linesep_byte + b'fghlk' + os_linesep_byte + b'\rmnopq') + def test_iterdir(self): P = self.cls p = P(BASE) diff --git a/Misc/NEWS.d/next/Library/2020-09-30-11-05-11.bpo-23706.dHTGjF.rst b/Misc/NEWS.d/next/Library/2020-09-30-11-05-11.bpo-23706.dHTGjF.rst new file mode 100644 index 00000000000000..b9a69a55e6a8de --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-30-11-05-11.bpo-23706.dHTGjF.rst @@ -0,0 +1 @@ +Added *newline* parameter to ``pathlib.Path.write_text()``. From 44c9939bc2833915648c73e472802e0a8951dcf5 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 21 Oct 2020 11:29:56 +0900 Subject: [PATCH 0327/1261] bpo-41902: Micro optimization for range.index if step is 1 (GH-22479) --- .../2020-10-01-22-44-23.bpo-41902.iLoMVF.rst | 1 + Objects/rangeobject.c | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-01-22-44-23.bpo-41902.iLoMVF.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-01-22-44-23.bpo-41902.iLoMVF.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-01-22-44-23.bpo-41902.iLoMVF.rst new file mode 100644 index 00000000000000..738ef5aec95039 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-01-22-44-23.bpo-41902.iLoMVF.rst @@ -0,0 +1 @@ +Micro optimization for range.index if step is 1. Patch by Dong-hee Na. diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index eaa48d5f44fcc7..babf55b108b9ab 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -582,13 +582,19 @@ range_index(rangeobject *r, PyObject *ob) return NULL; if (contains) { - PyObject *idx, *tmp = PyNumber_Subtract(ob, r->start); - if (tmp == NULL) + PyObject *idx = PyNumber_Subtract(ob, r->start); + if (idx == NULL) { return NULL; + } + + if (r->step == _PyLong_One) { + return idx; + } + /* idx = (ob - r.start) // r.step */ - idx = PyNumber_FloorDivide(tmp, r->step); - Py_DECREF(tmp); - return idx; + PyObject *sidx = PyNumber_FloorDivide(idx, r->step); + Py_DECREF(idx); + return sidx; } /* object is not in the range */ From c8d38fff1158a2e04377f1f27f9f9ed0ef0d1eb5 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 21 Oct 2020 02:25:05 -0300 Subject: [PATCH 0328/1261] Doc: Do not encourage using a base class name in a derived class (GH-22177) --- Doc/faq/programming.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 2d542cfb1dbb4b..57ab3e265f7915 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1517,18 +1517,18 @@ order` (MRO) with ``type(self).__mro__``, and return the next in line after How can I organize my code to make it easier to change the base class? ---------------------------------------------------------------------- -You could define an alias for the base class, assign the real base class to it -before your class definition, and use the alias throughout your class. Then all +You could assign the base class to an alias and derive from the alias. Then all you have to change is the value assigned to the alias. Incidentally, this trick is also handy if you want to decide dynamically (e.g. depending on availability of resources) which base class to use. Example:: - BaseAlias = + class Base: + ... + + BaseAlias = Base class Derived(BaseAlias): - def meth(self): - BaseAlias.meth(self) - ... + ... How do I create static class data and static class methods? From db295b61aa8b0776a7faaacfc9d24c36ad8c42c8 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 21 Oct 2020 02:45:13 -0300 Subject: [PATCH 0329/1261] Doc: Remove old Python version from future stmt (GH-21802) --- Doc/reference/simple_stmts.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 93be32713ff32a..f8ab2e918c6a10 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -874,8 +874,8 @@ can appear before a future statement are: * blank lines, and * other future statements. -The only feature in Python 3.7 that requires using the future statement is -``annotations``. +The only feature that requires using the future statement is +``annotations`` (see :pep:`563`). All historical features enabled by the future statement are still recognized by Python 3. The list includes ``absolute_import``, ``division``, From 5d2fc6e439e608bdd7c5712dd2539f1e85a0a613 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 21 Oct 2020 05:25:07 -0300 Subject: [PATCH 0330/1261] Doc: Do not suggest `s[::-1]` for reversed order (GH-22457) --- Doc/faq/programming.rst | 7 +------ Doc/tools/susp-ignored.csv | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 57ab3e265f7915..b75c60a17a2698 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1116,7 +1116,7 @@ trailing newline from a string. How do I iterate over a sequence in reverse order? -------------------------------------------------- -Use the :func:`reversed` built-in function, which is new in Python 2.4:: +Use the :func:`reversed` built-in function:: for x in reversed(sequence): ... # do something with x ... @@ -1124,11 +1124,6 @@ Use the :func:`reversed` built-in function, which is new in Python 2.4:: This won't touch your original sequence, but build a new copy with reversed order to iterate over. -With Python 2.3, you can use an extended slice syntax:: - - for x in sequence[::-1]: - ... # do something with x ... - How do you remove duplicates from a list? ----------------------------------------- diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index f85d6946954d6f..99d6decc4ece17 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -12,7 +12,6 @@ extending/extending,,:myfunction,"PyArg_ParseTuple(args, ""D:myfunction"", &c);" extending/extending,,:set,"if (PyArg_ParseTuple(args, ""O:set_callback"", &temp)) {" extending/newtypes,,:call,"if (!PyArg_ParseTuple(args, ""sss:call"", &arg1, &arg2, &arg3)) {" faq/programming,,:chr,">=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr(" -faq/programming,,::,for x in sequence[::-1]: faq/programming,,:reduce,"print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y," faq/programming,,:reduce,"Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro," faq/windows,,:d48eceb,"Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32" From 982cf4a4eb37a3305f3f0a1f3f8aca843b0a33f7 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Wed, 21 Oct 2020 02:36:03 -0600 Subject: [PATCH 0331/1261] Doc: Fix a typo/error in the docs for cached bytecode (GH-22445) --- Doc/reference/import.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 4c36e15dc06063..213b31487ac618 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -680,7 +680,7 @@ Here are the exact rules used: Cached bytecode invalidation ---------------------------- -Before Python loads cached bytecode from ``.pyc`` file, it checks whether the +Before Python loads cached bytecode from a ``.pyc`` file, it checks whether the cache is up-to-date with the source ``.py`` file. By default, Python does this by storing the source's last-modified timestamp and size in the cache file when writing it. At runtime, the import system then validates the cache file by From e96a994732ddda672264312e819140c3b06c36e4 Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Wed, 21 Oct 2020 09:40:43 -0400 Subject: [PATCH 0332/1261] Update tzdata to 2020.3 (GH-22856) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TBH I had forgotten that we pin this 😅, and it's been updated quite a few times since we added this. --- Misc/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/requirements-test.txt b/Misc/requirements-test.txt index 6e46c12e4f9d13..60e7ed20a3d510 100644 --- a/Misc/requirements-test.txt +++ b/Misc/requirements-test.txt @@ -1 +1 @@ -tzdata==2020.1rc0 +tzdata==2020.3 From 6b5944e208c00b7c7b8fa6ce630d3a59d9c3224d Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Wed, 21 Oct 2020 16:49:22 +0300 Subject: [PATCH 0333/1261] bpo-41747: Ensure all dataclass methods uses their parents' qualname (GH-22155) * bpo-41747: Ensure all dataclass methods uses their parents' qualname Co-authored-by: Serhiy Storchaka --- Lib/dataclasses.py | 11 +++++++-- Lib/test/test_dataclasses.py | 24 +++++++++++++++++++ .../2020-09-08-23-41-29.bpo-41747.M6wLKv.rst | 3 +++ 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-08-23-41-29.bpo-41747.M6wLKv.rst diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index adfb9b7240b9f9..0c4b47564b0605 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -8,7 +8,7 @@ import functools import abc import _thread -from types import GenericAlias +from types import FunctionType, GenericAlias __all__ = ['dataclass', @@ -757,12 +757,19 @@ def _get_field(cls, a_name, a_type): return f +def _set_qualname(cls, value): + # Ensure that the functions returned from _create_fn uses the proper + # __qualname__ (the class they belong to). + if isinstance(value, FunctionType): + value.__qualname__ = f"{cls.__qualname__}.{value.__name__}" + return value def _set_new_attribute(cls, name, value): # Never overwrites an existing attribute. Returns True if the # attribute already exists. if name in cls.__dict__: return True + _set_qualname(cls, value) setattr(cls, name, value) return False @@ -777,7 +784,7 @@ def _hash_set_none(cls, fields, globals): def _hash_add(cls, fields, globals): flds = [f for f in fields if (f.compare if f.hash is None else f.hash)] - return _hash_fn(flds, globals) + return _set_qualname(cls, _hash_fn(flds, globals)) def _hash_exception(cls, fields, globals): # Raise an exception. diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 7c1d9c568f4ef6..8887eb6461bc34 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -1936,6 +1936,30 @@ class R: self.assertEqual(new_sample.x, another_new_sample.x) self.assertEqual(sample.y, another_new_sample.y) + def test_dataclasses_qualnames(self): + @dataclass(order=True, unsafe_hash=True, frozen=True) + class A: + x: int + y: int + + self.assertEqual(A.__init__.__name__, "__init__") + for function in ( + '__eq__', + '__lt__', + '__le__', + '__gt__', + '__ge__', + '__hash__', + '__init__', + '__repr__', + '__setattr__', + '__delattr__', + ): + self.assertEqual(getattr(A, function).__qualname__, f"TestCase.test_dataclasses_qualnames..A.{function}") + + with self.assertRaisesRegex(TypeError, r"A\.__init__\(\) missing"): + A() + class TestFieldNoAnnotation(unittest.TestCase): def test_field_without_annotation(self): diff --git a/Misc/NEWS.d/next/Library/2020-09-08-23-41-29.bpo-41747.M6wLKv.rst b/Misc/NEWS.d/next/Library/2020-09-08-23-41-29.bpo-41747.M6wLKv.rst new file mode 100644 index 00000000000000..0869462f5bf9d5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-08-23-41-29.bpo-41747.M6wLKv.rst @@ -0,0 +1,3 @@ +Ensure all methods that generated from :func:`dataclasses.dataclass` +objects now have the proper ``__qualname__`` attribute referring to +the class they belong to. Patch by Batuhan Taskaya. From d2ecc3bae2499933f785eb5cab9c135eafc58a65 Mon Sep 17 00:00:00 2001 From: kpinc Date: Wed, 21 Oct 2020 12:13:50 -0500 Subject: [PATCH 0334/1261] bpo-39416: Document some restrictions on the default string representations of numeric classes (GH-18111) [bpo-39416](): Document string representations of the Numeric classes This is a change to the specification of the Python language. The idea here is to put sane minimal limits on the Python language's default representations of its Numeric classes. That way "Marty's Robotic Massage Parlor and Python Interpreter" implementation of Python won't do anything too crazy. Some discussion in the email thread: Subject: Documenting Python's float.__str__() https://mail.python.org/archives/list/python-dev@python.org/thread/FV22TKT3S2Q3P7PNN6MCXI6IX3HRRNAL/ --- Doc/reference/datamodel.rst | 18 ++++++++++++++++++ .../2020-01-22-05-14-53.bpo-39416.uYjhEm.rst | 1 + 2 files changed, 19 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2020-01-22-05-14-53.bpo-39416.uYjhEm.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 29e64cba2ca3ae..d9b72a9a942ed8 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -187,6 +187,24 @@ Ellipsis related to mathematical numbers, but subject to the limitations of numerical representation in computers. + The string representations of the Numeric classes, computed by + :meth:`__repr__` and :meth:`__str__`, have the following + properties: + + * They are valid numeric literals which, when passed to their + class constructor, produce an object having the value of the + original numeric. + + * The representation is in base 10, when possible. + + * Leading zeros, possibly excepting a single zero before a + decimal point, are not shown. + + * Trailing zeros, possibly excepting a single zero after a + decimal point, are not shown. + + * A sign is shown only when the number is negative. + Python distinguishes between integers, floating point numbers, and complex numbers: diff --git a/Misc/NEWS.d/next/Documentation/2020-01-22-05-14-53.bpo-39416.uYjhEm.rst b/Misc/NEWS.d/next/Documentation/2020-01-22-05-14-53.bpo-39416.uYjhEm.rst new file mode 100644 index 00000000000000..279a5f18ff855e --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-22-05-14-53.bpo-39416.uYjhEm.rst @@ -0,0 +1 @@ +Document some restrictions on the default string representations of numeric classes. From 2c870f5392a35e4a2d6b4d5d1e8dd49f0e368adb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Cumplido?= Date: Wed, 21 Oct 2020 21:05:48 +0200 Subject: [PATCH 0335/1261] bpo-41959: Fix grammar around class asyncio.MultiLoopChildWatcher text (GH-22580) While translating the following document to Spanish we found there is a grammar issue on the original documentation. --- Doc/library/asyncio-policy.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/asyncio-policy.rst b/Doc/library/asyncio-policy.rst index d9d3232d2408b3..88e69ceff9adc1 100644 --- a/Doc/library/asyncio-policy.rst +++ b/Doc/library/asyncio-policy.rst @@ -219,7 +219,7 @@ implementation used by the asyncio event loop: This implementation registers a :py:data:`SIGCHLD` signal handler on instantiation. That can break third-party code that installs a custom handler for - `SIGCHLD`. signal). + :py:data:`SIGCHLD` signal. The watcher avoids disrupting other code spawning processes by polling every process explicitly on a :py:data:`SIGCHLD` signal. From 9dc034ecea8636d83cc8737596eed48b8d05ce8d Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Wed, 21 Oct 2020 22:53:14 +0300 Subject: [PATCH 0336/1261] bpo-41746: Cast to typed seqs in CHECK macros to avoid type erasure (GH-22864) --- Grammar/python.gram | 95 +++++++++++++++++++++++++++------------------ Parser/parser.c | 74 +++++++++++++++++------------------ Parser/pegen.h | 8 ++-- 3 files changed, 98 insertions(+), 79 deletions(-) diff --git a/Grammar/python.gram b/Grammar/python.gram index 2f52bd7f2f6a41..d2d6fc0d3398bc 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -36,11 +36,17 @@ fstring[expr_ty]: star_expressions # type_expressions allow */** but ignore them type_expressions[asdl_expr_seq*]: | a=','.expression+ ',' '*' b=expression ',' '**' c=expression { - (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, CHECK(_PyPegen_seq_append_to_end(p, a, b)), c) } + (asdl_expr_seq*)_PyPegen_seq_append_to_end( + p, + CHECK(asdl_seq*, _PyPegen_seq_append_to_end(p, a, b)), + c) } | a=','.expression+ ',' '*' b=expression { (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) } | a=','.expression+ ',' '**' b=expression { (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) } | '*' a=expression ',' '**' b=expression { - (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, CHECK(_PyPegen_singleton_seq(p, a)), b) } + (asdl_expr_seq*)_PyPegen_seq_append_to_end( + p, + CHECK(asdl_seq*, _PyPegen_singleton_seq(p, a)), + b) } | '*' a=expression { (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) } | '**' a=expression { (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) } | a[asdl_expr_seq*]=','.expression+ {a} @@ -50,7 +56,7 @@ statement[asdl_stmt_seq*]: a=compound_stmt { (asdl_stmt_seq*)_PyPegen_singleton_ statement_newline[asdl_stmt_seq*]: | a=compound_stmt NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } | simple_stmt - | NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, CHECK(_Py_Pass(EXTRA))) } + | NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, CHECK(stmt_ty, _Py_Pass(EXTRA))) } | ENDMARKER { _PyPegen_interactive_exit(p) } simple_stmt[asdl_stmt_seq*]: | a=small_stmt !';' NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } # Not needed, there for speedup @@ -84,13 +90,14 @@ compound_stmt[stmt_ty]: assignment[stmt_ty]: | a=NAME ':' b=expression c=['=' d=annotated_rhs { d }] { CHECK_VERSION( + stmt_ty, 6, "Variable annotation syntax is", - _Py_AnnAssign(CHECK(_PyPegen_set_expr_context(p, a, Store)), b, c, 1, EXTRA) + _Py_AnnAssign(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, c, 1, EXTRA) ) } | a=('(' b=single_target ')' { b } | single_subscript_attribute_target) ':' b=expression c=['=' d=annotated_rhs { d }] { - CHECK_VERSION(6, "Variable annotations syntax is", _Py_AnnAssign(a, b, c, 0, EXTRA)) } + CHECK_VERSION(stmt_ty, 6, "Variable annotations syntax is", _Py_AnnAssign(a, b, c, 0, EXTRA)) } | a[asdl_expr_seq*]=(z=star_targets '=' { z })+ b=(yield_expr | star_expressions) !'=' tc=[TYPE_COMMENT] { _Py_Assign(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } | a=single_target b=augassign ~ c=(yield_expr | star_expressions) { @@ -101,7 +108,7 @@ augassign[AugOperator*]: | '+=' { _PyPegen_augoperator(p, Add) } | '-=' { _PyPegen_augoperator(p, Sub) } | '*=' { _PyPegen_augoperator(p, Mult) } - | '@=' { CHECK_VERSION(5, "The '@' operator is", _PyPegen_augoperator(p, MatMult)) } + | '@=' { CHECK_VERSION(AugOperator*, 5, "The '@' operator is", _PyPegen_augoperator(p, MatMult)) } | '/=' { _PyPegen_augoperator(p, Div) } | '%=' { _PyPegen_augoperator(p, Mod) } | '&=' { _PyPegen_augoperator(p, BitAnd) } @@ -113,9 +120,9 @@ augassign[AugOperator*]: | '//=' { _PyPegen_augoperator(p, FloorDiv) } global_stmt[stmt_ty]: 'global' a[asdl_expr_seq*]=','.NAME+ { - _Py_Global(CHECK(_PyPegen_map_names_to_ids(p, a)), EXTRA) } + _Py_Global(CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, a)), EXTRA) } nonlocal_stmt[stmt_ty]: 'nonlocal' a[asdl_expr_seq*]=','.NAME+ { - _Py_Nonlocal(CHECK(_PyPegen_map_names_to_ids(p, a)), EXTRA) } + _Py_Nonlocal(CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, a)), EXTRA) } yield_stmt[stmt_ty]: y=yield_expr { _Py_Expr(y, EXTRA) } @@ -136,7 +143,7 @@ import_from[stmt_ty]: import_from_targets[asdl_alias_seq*]: | '(' a=import_from_as_names [','] ')' { a } | import_from_as_names !',' - | '*' { (asdl_alias_seq*)_PyPegen_singleton_seq(p, CHECK(_PyPegen_alias_for_star(p))) } + | '*' { (asdl_alias_seq*)_PyPegen_singleton_seq(p, CHECK(alias_ty, _PyPegen_alias_for_star(p))) } | invalid_import_from_targets import_from_as_names[asdl_alias_seq*]: | a[asdl_alias_seq*]=','.import_from_as_name+ { a } @@ -155,10 +162,12 @@ dotted_name[expr_ty]: | NAME if_stmt[stmt_ty]: - | 'if' a=named_expression ':' b=block c=elif_stmt { _Py_If(a, b, CHECK((asdl_stmt_seq*)_PyPegen_singleton_seq(p, c)), EXTRA) } + | 'if' a=named_expression ':' b=block c=elif_stmt { + _Py_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) } | 'if' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } elif_stmt[stmt_ty]: - | 'elif' a=named_expression ':' b=block c=elif_stmt { _Py_If(a, b, CHECK(_PyPegen_singleton_seq(p, c)), EXTRA) } + | 'elif' a=named_expression ':' b=block c=elif_stmt { + _Py_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) } | 'elif' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } else_block[asdl_stmt_seq*]: 'else' ':' b=block { b } @@ -169,7 +178,7 @@ for_stmt[stmt_ty]: | 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { _Py_For(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA) } | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { - CHECK_VERSION(5, "Async for loops are", _Py_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) } + CHECK_VERSION(stmt_ty, 5, "Async for loops are", _Py_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) } | invalid_for_target with_stmt[stmt_ty]: @@ -178,9 +187,9 @@ with_stmt[stmt_ty]: | 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { _Py_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } | ASYNC 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block { - CHECK_VERSION(5, "Async with statements are", _Py_AsyncWith(a, b, NULL, EXTRA)) } + CHECK_VERSION(stmt_ty, 5, "Async with statements are", _Py_AsyncWith(a, b, NULL, EXTRA)) } | ASYNC 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { - CHECK_VERSION(5, "Async with statements are", _Py_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) } + CHECK_VERSION(stmt_ty, 5, "Async with statements are", _Py_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) } with_item[withitem_ty]: | e=expression 'as' t=star_target &(',' | ')' | ':') { _Py_withitem(e, t, p->arena) } | invalid_with_item @@ -209,14 +218,15 @@ function_def[stmt_ty]: function_def_raw[stmt_ty]: | 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { _Py_FunctionDef(n->v.Name.id, - (params) ? params : CHECK(_PyPegen_empty_arguments(p)), + (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)), b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA) } | ASYNC 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { CHECK_VERSION( + stmt_ty, 5, "Async functions are", _Py_AsyncFunctionDef(n->v.Name.id, - (params) ? params : CHECK(_PyPegen_empty_arguments(p)), + (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)), b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA) ) } func_type_comment[Token*]: @@ -304,8 +314,8 @@ block[asdl_stmt_seq*] (memo): expressions_list[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_expression+ [','] { a } star_expressions[expr_ty]: | a=star_expression b=(',' c=star_expression { c })+ [','] { - _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } - | a=star_expression ',' { _Py_Tuple(CHECK(_PyPegen_singleton_seq(p, a)), Load, EXTRA) } + _Py_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } + | a=star_expression ',' { _Py_Tuple(CHECK(asdl_expr_seq*, _PyPegen_singleton_seq(p, a)), Load, EXTRA) } | star_expression star_expression[expr_ty] (memo): | '*' a=bitwise_or { _Py_Starred(a, Load, EXTRA) } @@ -316,7 +326,7 @@ star_named_expression[expr_ty]: | '*' a=bitwise_or { _Py_Starred(a, Load, EXTRA) } | named_expression named_expression[expr_ty]: - | a=NAME ':=' ~ b=expression { _Py_NamedExpr(CHECK(_PyPegen_set_expr_context(p, a, Store)), b, EXTRA) } + | a=NAME ':=' ~ b=expression { _Py_NamedExpr(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, EXTRA) } | expression !':=' | invalid_named_expression @@ -324,8 +334,8 @@ annotated_rhs[expr_ty]: yield_expr | star_expressions expressions[expr_ty]: | a=expression b=(',' c=expression { c })+ [','] { - _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } - | a=expression ',' { _Py_Tuple(CHECK(_PyPegen_singleton_seq(p, a)), Load, EXTRA) } + _Py_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } + | a=expression ',' { _Py_Tuple(CHECK(asdl_expr_seq*, _PyPegen_singleton_seq(p, a)), Load, EXTRA) } | expression expression[expr_ty] (memo): | a=disjunction 'if' b=disjunction 'else' c=expression { _Py_IfExp(b, a, c, EXTRA) } @@ -333,7 +343,8 @@ expression[expr_ty] (memo): | lambdef lambdef[expr_ty]: - | 'lambda' a=[lambda_params] ':' b=expression { _Py_Lambda((a) ? a : CHECK(_PyPegen_empty_arguments(p)), b, EXTRA) } + | 'lambda' a=[lambda_params] ':' b=expression { + _Py_Lambda((a) ? a : CHECK(arguments_ty, _PyPegen_empty_arguments(p)), b, EXTRA) } lambda_params[arguments_ty]: | invalid_lambda_parameters @@ -384,13 +395,13 @@ lambda_param[arg_ty]: a=NAME { _Py_arg(a->v.Name.id, NULL, NULL, EXTRA) } disjunction[expr_ty] (memo): | a=conjunction b=('or' c=conjunction { c })+ { _Py_BoolOp( Or, - CHECK(_PyPegen_seq_insert_in_front(p, a, b)), + CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), EXTRA) } | conjunction conjunction[expr_ty] (memo): | a=inversion b=('and' c=inversion { c })+ { _Py_BoolOp( And, - CHECK(_PyPegen_seq_insert_in_front(p, a, b)), + CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), EXTRA) } | inversion inversion[expr_ty] (memo): @@ -398,7 +409,11 @@ inversion[expr_ty] (memo): | comparison comparison[expr_ty]: | a=bitwise_or b=compare_op_bitwise_or_pair+ { - _Py_Compare(a, CHECK(_PyPegen_get_cmpops(p, b)), CHECK(_PyPegen_get_exprs(p, b)), EXTRA) } + _Py_Compare( + a, + CHECK(asdl_int_seq*, _PyPegen_get_cmpops(p, b)), + CHECK(asdl_expr_seq*, _PyPegen_get_exprs(p, b)), + EXTRA) } | bitwise_or compare_op_bitwise_or_pair[CmpopExprPair*]: | eq_bitwise_or @@ -446,7 +461,7 @@ term[expr_ty]: | a=term '/' b=factor { _Py_BinOp(a, Div, b, EXTRA) } | a=term '//' b=factor { _Py_BinOp(a, FloorDiv, b, EXTRA) } | a=term '%' b=factor { _Py_BinOp(a, Mod, b, EXTRA) } - | a=term '@' b=factor { CHECK_VERSION(5, "The '@' operator is", _Py_BinOp(a, MatMult, b, EXTRA)) } + | a=term '@' b=factor { CHECK_VERSION(expr_ty, 5, "The '@' operator is", _Py_BinOp(a, MatMult, b, EXTRA)) } | factor factor[expr_ty] (memo): | '+' a=factor { _Py_UnaryOp(UAdd, a, EXTRA) } @@ -457,11 +472,11 @@ power[expr_ty]: | a=await_primary '**' b=factor { _Py_BinOp(a, Pow, b, EXTRA) } | await_primary await_primary[expr_ty] (memo): - | AWAIT a=primary { CHECK_VERSION(5, "Await expressions are", _Py_Await(a, EXTRA)) } + | AWAIT a=primary { CHECK_VERSION(expr_ty, 5, "Await expressions are", _Py_Await(a, EXTRA)) } | primary primary[expr_ty]: | a=primary '.' b=NAME { _Py_Attribute(a, b->v.Name.id, Load, EXTRA) } - | a=primary b=genexp { _Py_Call(a, CHECK(_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } + | a=primary b=genexp { _Py_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } | a=primary '(' b=[arguments] ')' { _Py_Call(a, (b) ? ((expr_ty) b)->v.Call.args : NULL, @@ -509,7 +524,10 @@ setcomp[expr_ty]: | invalid_comprehension dict[expr_ty]: | '{' a=[double_starred_kvpairs] '}' { - _Py_Dict(CHECK(_PyPegen_get_keys(p, a)), CHECK(_PyPegen_get_values(p, a)), EXTRA) } + _Py_Dict( + CHECK(asdl_expr_seq*, _PyPegen_get_keys(p, a)), + CHECK(asdl_expr_seq*, _PyPegen_get_values(p, a)), + EXTRA) } dictcomp[expr_ty]: | '{' a=kvpair b=for_if_clauses '}' { _Py_DictComp(a->key, a->value, b, EXTRA) } | invalid_dict_comprehension @@ -522,7 +540,7 @@ for_if_clauses[asdl_comprehension_seq*]: | a[asdl_comprehension_seq*]=for_if_clause+ { a } for_if_clause[comprehension_ty]: | ASYNC 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction { z })* { - CHECK_VERSION(6, "Async comprehensions are", _Py_comprehension(a, b, c, 1, p->arena)) } + CHECK_VERSION(comprehension_ty, 6, "Async comprehensions are", _Py_comprehension(a, b, c, 1, p->arena)) } | 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction { z })* { _Py_comprehension(a, b, c, 0, p->arena) } | invalid_for_target @@ -537,8 +555,8 @@ arguments[expr_ty] (memo): args[expr_ty]: | a[asdl_expr_seq*]=','.(starred_expression | named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b, EXTRA) } | a=kwargs { _Py_Call(_PyPegen_dummy_name(p), - CHECK_NULL_ALLOWED(_PyPegen_seq_extract_starred_exprs(p, a)), - CHECK_NULL_ALLOWED(_PyPegen_seq_delete_starred_exprs(p, a)), + CHECK_NULL_ALLOWED(asdl_expr_seq*, _PyPegen_seq_extract_starred_exprs(p, a)), + CHECK_NULL_ALLOWED(asdl_keyword_seq*, _PyPegen_seq_delete_starred_exprs(p, a)), EXTRA) } kwargs[asdl_seq*]: | a=','.kwarg_or_starred+ ',' b=','.kwarg_or_double_starred+ { _PyPegen_join_sequences(p, a, b) } @@ -548,24 +566,24 @@ starred_expression[expr_ty]: | '*' a=expression { _Py_Starred(a, Load, EXTRA) } kwarg_or_starred[KeywordOrStarred*]: | a=NAME '=' b=expression { - _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(a->v.Name.id, b, EXTRA)), 1) } + _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _Py_keyword(a->v.Name.id, b, EXTRA)), 1) } | a=starred_expression { _PyPegen_keyword_or_starred(p, a, 0) } | invalid_kwarg kwarg_or_double_starred[KeywordOrStarred*]: | a=NAME '=' b=expression { - _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(a->v.Name.id, b, EXTRA)), 1) } - | '**' a=expression { _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(NULL, a, EXTRA)), 1) } + _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _Py_keyword(a->v.Name.id, b, EXTRA)), 1) } + | '**' a=expression { _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _Py_keyword(NULL, a, EXTRA)), 1) } | invalid_kwarg # NOTE: star_targets may contain *bitwise_or, targets may not. star_targets[expr_ty]: | a=star_target !',' { a } | a=star_target b=(',' c=star_target { c })* [','] { - _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) } + _Py_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) } star_targets_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] { a } star_target[expr_ty] (memo): | '*' a=(!'*' star_target) { - _Py_Starred(CHECK(_PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) } + _Py_Starred(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) } | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) } | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) } | star_atom @@ -602,7 +620,8 @@ target[expr_ty] (memo): t_primary[expr_ty]: | a=t_primary '.' b=NAME &t_lookahead { _Py_Attribute(a, b->v.Name.id, Load, EXTRA) } | a=t_primary '[' b=slices ']' &t_lookahead { _Py_Subscript(a, b, Load, EXTRA) } - | a=t_primary b=genexp &t_lookahead { _Py_Call(a, CHECK(_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } + | a=t_primary b=genexp &t_lookahead { + _Py_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } | a=t_primary '(' b=[arguments] ')' &t_lookahead { _Py_Call(a, (b) ? ((expr_ty) b)->v.Call.args : NULL, diff --git a/Parser/parser.c b/Parser/parser.c index 0d92256a3ebe2d..09be03c633a264 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -978,7 +978,7 @@ type_expressions_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '*' expression ',' '**' expression")); - _res = ( asdl_expr_seq * ) _PyPegen_seq_append_to_end ( p , CHECK ( _PyPegen_seq_append_to_end ( p , a , b ) ) , c ); + _res = ( asdl_expr_seq * ) _PyPegen_seq_append_to_end ( p , CHECK ( asdl_seq * , _PyPegen_seq_append_to_end ( p , a , b ) ) , c ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1080,7 +1080,7 @@ type_expressions_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' expression ',' '**' expression")); - _res = ( asdl_expr_seq * ) _PyPegen_seq_append_to_end ( p , CHECK ( _PyPegen_singleton_seq ( p , a ) ) , b ); + _res = ( asdl_expr_seq * ) _PyPegen_seq_append_to_end ( p , CHECK ( asdl_seq * , _PyPegen_singleton_seq ( p , a ) ) , b ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -1369,7 +1369,7 @@ statement_newline_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = ( asdl_stmt_seq * ) _PyPegen_singleton_seq ( p , CHECK ( _Py_Pass ( EXTRA ) ) ); + _res = ( asdl_stmt_seq * ) _PyPegen_singleton_seq ( p , CHECK ( stmt_ty , _Py_Pass ( EXTRA ) ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -2077,7 +2077,7 @@ assignment_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = CHECK_VERSION ( 6 , "Variable annotation syntax is" , _Py_AnnAssign ( CHECK ( _PyPegen_set_expr_context ( p , a , Store ) ) , b , c , 1 , EXTRA ) ); + _res = CHECK_VERSION ( stmt_ty , 6 , "Variable annotation syntax is" , _Py_AnnAssign ( CHECK ( expr_ty , _PyPegen_set_expr_context ( p , a , Store ) ) , b , c , 1 , EXTRA ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -2119,7 +2119,7 @@ assignment_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = CHECK_VERSION ( 6 , "Variable annotations syntax is" , _Py_AnnAssign ( a , b , c , 0 , EXTRA ) ); + _res = CHECK_VERSION ( stmt_ty , 6 , "Variable annotations syntax is" , _Py_AnnAssign ( a , b , c , 0 , EXTRA ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -2351,7 +2351,7 @@ augassign_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@='")); - _res = CHECK_VERSION ( 5 , "The '@' operator is" , _PyPegen_augoperator ( p , MatMult ) ); + _res = CHECK_VERSION ( AugOperator * , 5 , "The '@' operator is" , _PyPegen_augoperator ( p , MatMult ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -2629,7 +2629,7 @@ global_stmt_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Global ( CHECK ( _PyPegen_map_names_to_ids ( p , a ) ) , EXTRA ); + _res = _Py_Global ( CHECK ( asdl_identifier_seq * , _PyPegen_map_names_to_ids ( p , a ) ) , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -2691,7 +2691,7 @@ nonlocal_stmt_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Nonlocal ( CHECK ( _PyPegen_map_names_to_ids ( p , a ) ) , EXTRA ); + _res = _Py_Nonlocal ( CHECK ( asdl_identifier_seq * , _PyPegen_map_names_to_ids ( p , a ) ) , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -3230,7 +3230,7 @@ import_from_targets_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); - _res = ( asdl_alias_seq * ) _PyPegen_singleton_seq ( p , CHECK ( _PyPegen_alias_for_star ( p ) ) ); + _res = ( asdl_alias_seq * ) _PyPegen_singleton_seq ( p , CHECK ( alias_ty , _PyPegen_alias_for_star ( p ) ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -3588,7 +3588,7 @@ if_stmt_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_If ( a , b , CHECK ( ( asdl_stmt_seq * ) _PyPegen_singleton_seq ( p , c ) ) , EXTRA ); + _res = _Py_If ( a , b , CHECK ( asdl_stmt_seq * , _PyPegen_singleton_seq ( p , c ) ) , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -3706,7 +3706,7 @@ elif_stmt_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_If ( a , b , CHECK ( _PyPegen_singleton_seq ( p , c ) ) , EXTRA ); + _res = _Py_If ( a , b , CHECK ( asdl_stmt_seq * , _PyPegen_singleton_seq ( p , c ) ) , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -4019,7 +4019,7 @@ for_stmt_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = CHECK_VERSION ( 5 , "Async for loops are" , _Py_AsyncFor ( t , ex , b , el , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); + _res = CHECK_VERSION ( stmt_ty , 5 , "Async for loops are" , _Py_AsyncFor ( t , ex , b , el , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -4224,7 +4224,7 @@ with_stmt_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = CHECK_VERSION ( 5 , "Async with statements are" , _Py_AsyncWith ( a , b , NULL , EXTRA ) ); + _res = CHECK_VERSION ( stmt_ty , 5 , "Async with statements are" , _Py_AsyncWith ( a , b , NULL , EXTRA ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -4272,7 +4272,7 @@ with_stmt_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = CHECK_VERSION ( 5 , "Async with statements are" , _Py_AsyncWith ( a , b , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); + _res = CHECK_VERSION ( stmt_ty , 5 , "Async with statements are" , _Py_AsyncWith ( a , b , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -4950,7 +4950,7 @@ function_def_raw_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_FunctionDef ( n -> v . Name . id , ( params ) ? params : CHECK ( _PyPegen_empty_arguments ( p ) ) , b , NULL , a , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ); + _res = _Py_FunctionDef ( n -> v . Name . id , ( params ) ? params : CHECK ( arguments_ty , _PyPegen_empty_arguments ( p ) ) , b , NULL , a , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -5010,7 +5010,7 @@ function_def_raw_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = CHECK_VERSION ( 5 , "Async functions are" , _Py_AsyncFunctionDef ( n -> v . Name . id , ( params ) ? params : CHECK ( _PyPegen_empty_arguments ( p ) ) , b , NULL , a , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); + _res = CHECK_VERSION ( stmt_ty , 5 , "Async functions are" , _Py_AsyncFunctionDef ( n -> v . Name . id , ( params ) ? params : CHECK ( arguments_ty , _PyPegen_empty_arguments ( p ) ) , b , NULL , a , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -6426,7 +6426,7 @@ star_expressions_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Tuple ( CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , Load , EXTRA ); + _res = _Py_Tuple ( CHECK ( asdl_expr_seq * , _PyPegen_seq_insert_in_front ( p , a , b ) ) , Load , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -6462,7 +6462,7 @@ star_expressions_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Tuple ( CHECK ( _PyPegen_singleton_seq ( p , a ) ) , Load , EXTRA ); + _res = _Py_Tuple ( CHECK ( asdl_expr_seq * , _PyPegen_singleton_seq ( p , a ) ) , Load , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -6761,7 +6761,7 @@ named_expression_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_NamedExpr ( CHECK ( _PyPegen_set_expr_context ( p , a , Store ) ) , b , EXTRA ); + _res = _Py_NamedExpr ( CHECK ( expr_ty , _PyPegen_set_expr_context ( p , a , Store ) ) , b , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -6926,7 +6926,7 @@ expressions_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Tuple ( CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , Load , EXTRA ); + _res = _Py_Tuple ( CHECK ( asdl_expr_seq * , _PyPegen_seq_insert_in_front ( p , a , b ) ) , Load , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -6962,7 +6962,7 @@ expressions_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Tuple ( CHECK ( _PyPegen_singleton_seq ( p , a ) ) , Load , EXTRA ); + _res = _Py_Tuple ( CHECK ( asdl_expr_seq * , _PyPegen_singleton_seq ( p , a ) ) , Load , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -7163,7 +7163,7 @@ lambdef_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Lambda ( ( a ) ? a : CHECK ( _PyPegen_empty_arguments ( p ) ) , b , EXTRA ); + _res = _Py_Lambda ( ( a ) ? a : CHECK ( arguments_ty , _PyPegen_empty_arguments ( p ) ) , b , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -8067,7 +8067,7 @@ disjunction_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_BoolOp ( Or , CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , EXTRA ); + _res = _Py_BoolOp ( Or , CHECK ( asdl_expr_seq * , _PyPegen_seq_insert_in_front ( p , a , b ) ) , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -8153,7 +8153,7 @@ conjunction_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_BoolOp ( And , CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , EXTRA ); + _res = _Py_BoolOp ( And , CHECK ( asdl_expr_seq * , _PyPegen_seq_insert_in_front ( p , a , b ) ) , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -8321,7 +8321,7 @@ comparison_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Compare ( a , CHECK ( _PyPegen_get_cmpops ( p , b ) ) , CHECK ( _PyPegen_get_exprs ( p , b ) ) , EXTRA ); + _res = _Py_Compare ( a , CHECK ( asdl_int_seq * , _PyPegen_get_cmpops ( p , b ) ) , CHECK ( asdl_expr_seq * , _PyPegen_get_exprs ( p , b ) ) , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -9908,7 +9908,7 @@ term_raw(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = CHECK_VERSION ( 5 , "The '@' operator is" , _Py_BinOp ( a , MatMult , b , EXTRA ) ); + _res = CHECK_VERSION ( expr_ty , 5 , "The '@' operator is" , _Py_BinOp ( a , MatMult , b , EXTRA ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -10235,7 +10235,7 @@ await_primary_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = CHECK_VERSION ( 5 , "Await expressions are" , _Py_Await ( a , EXTRA ) ); + _res = CHECK_VERSION ( expr_ty , 5 , "Await expressions are" , _Py_Await ( a , EXTRA ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -10391,7 +10391,7 @@ primary_raw(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Call ( a , CHECK ( _PyPegen_singleton_seq ( p , b ) ) , NULL , EXTRA ); + _res = _Py_Call ( a , CHECK ( asdl_expr_seq * , ( asdl_expr_seq * ) _PyPegen_singleton_seq ( p , b ) ) , NULL , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -11619,7 +11619,7 @@ dict_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Dict ( CHECK ( _PyPegen_get_keys ( p , a ) ) , CHECK ( _PyPegen_get_values ( p , a ) ) , EXTRA ); + _res = _Py_Dict ( CHECK ( asdl_expr_seq * , _PyPegen_get_keys ( p , a ) ) , CHECK ( asdl_expr_seq * , _PyPegen_get_values ( p , a ) ) , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -11964,7 +11964,7 @@ for_if_clause_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); - _res = CHECK_VERSION ( 6 , "Async comprehensions are" , _Py_comprehension ( a , b , c , 1 , p -> arena ) ); + _res = CHECK_VERSION ( comprehension_ty , 6 , "Async comprehensions are" , _Py_comprehension ( a , b , c , 1 , p -> arena ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -12297,7 +12297,7 @@ args_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Call ( _PyPegen_dummy_name ( p ) , CHECK_NULL_ALLOWED ( _PyPegen_seq_extract_starred_exprs ( p , a ) ) , CHECK_NULL_ALLOWED ( _PyPegen_seq_delete_starred_exprs ( p , a ) ) , EXTRA ); + _res = _Py_Call ( _PyPegen_dummy_name ( p ) , CHECK_NULL_ALLOWED ( asdl_expr_seq * , _PyPegen_seq_extract_starred_exprs ( p , a ) ) , CHECK_NULL_ALLOWED ( asdl_keyword_seq * , _PyPegen_seq_delete_starred_exprs ( p , a ) ) , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -12512,7 +12512,7 @@ kwarg_or_starred_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _PyPegen_keyword_or_starred ( p , CHECK ( _Py_keyword ( a -> v . Name . id , b , EXTRA ) ) , 1 ); + _res = _PyPegen_keyword_or_starred ( p , CHECK ( keyword_ty , _Py_keyword ( a -> v . Name . id , b , EXTRA ) ) , 1 ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -12620,7 +12620,7 @@ kwarg_or_double_starred_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _PyPegen_keyword_or_starred ( p , CHECK ( _Py_keyword ( a -> v . Name . id , b , EXTRA ) ) , 1 ); + _res = _PyPegen_keyword_or_starred ( p , CHECK ( keyword_ty , _Py_keyword ( a -> v . Name . id , b , EXTRA ) ) , 1 ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -12656,7 +12656,7 @@ kwarg_or_double_starred_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _PyPegen_keyword_or_starred ( p , CHECK ( _Py_keyword ( NULL , a , EXTRA ) ) , 1 ); + _res = _PyPegen_keyword_or_starred ( p , CHECK ( keyword_ty , _Py_keyword ( NULL , a , EXTRA ) ) , 1 ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -12767,7 +12767,7 @@ star_targets_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Tuple ( CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , Store , EXTRA ); + _res = _Py_Tuple ( CHECK ( asdl_expr_seq * , _PyPegen_seq_insert_in_front ( p , a , b ) ) , Store , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -12882,7 +12882,7 @@ star_target_rule(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Starred ( CHECK ( _PyPegen_set_expr_context ( p , a , Store ) ) , Store , EXTRA ); + _res = _Py_Starred ( CHECK ( expr_ty , _PyPegen_set_expr_context ( p , a , Store ) ) , Store , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); @@ -14060,7 +14060,7 @@ t_primary_raw(Parser *p) UNUSED(_end_lineno); // Only used by EXTRA macro int _end_col_offset = _token->end_col_offset; UNUSED(_end_col_offset); // Only used by EXTRA macro - _res = _Py_Call ( a , CHECK ( _PyPegen_singleton_seq ( p , b ) ) , NULL , EXTRA ); + _res = _Py_Call ( a , CHECK ( asdl_expr_seq * , ( asdl_expr_seq * ) _PyPegen_singleton_seq ( p , b ) ) , NULL , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); diff --git a/Parser/pegen.h b/Parser/pegen.h index 000dc8c462b85c..9a280ae240a24a 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -178,8 +178,8 @@ CHECK_CALL_NULL_ALLOWED(Parser *p, void *result) return result; } -#define CHECK(result) CHECK_CALL(p, result) -#define CHECK_NULL_ALLOWED(result) CHECK_CALL_NULL_ALLOWED(p, result) +#define CHECK(type, result) ((type) CHECK_CALL(p, result)) +#define CHECK_NULL_ALLOWED(type, result) ((type) CHECK_CALL_NULL_ALLOWED(p, result)) PyObject *_PyPegen_new_type_comment(Parser *, char *); @@ -218,7 +218,7 @@ INVALID_VERSION_CHECK(Parser *p, int version, char *msg, void *node) return node; } -#define CHECK_VERSION(version, msg, node) INVALID_VERSION_CHECK(p, version, msg, node) +#define CHECK_VERSION(type, version, msg, node) ((type) INVALID_VERSION_CHECK(p, version, msg, node)) arg_ty _PyPegen_add_type_comment_to_arg(Parser *, arg_ty, Token *); PyObject *_PyPegen_new_identifier(Parser *, char *); @@ -277,7 +277,7 @@ expr_ty _PyPegen_get_invalid_target(expr_ty e, TARGETS_TYPE targets_type); Py_LOCAL_INLINE(void *) _RAISE_SYNTAX_ERROR_INVALID_TARGET(Parser *p, TARGETS_TYPE type, void *e) { - expr_ty invalid_target = CHECK_NULL_ALLOWED(_PyPegen_get_invalid_target(e, type)); + expr_ty invalid_target = CHECK_NULL_ALLOWED(expr_ty, _PyPegen_get_invalid_target(e, type)); if (invalid_target != NULL) { const char *msg; if (type == STAR_TARGETS || type == FOR_TARGETS) { From 2247ab528ca45da91d00cbc0df45ee575ebfdd12 Mon Sep 17 00:00:00 2001 From: kpinc Date: Wed, 21 Oct 2020 15:34:15 -0500 Subject: [PATCH 0337/1261] Fix bpo-39416: Change "Numeric" to lower case; an english word, not a class name (GH-22867) This is a trivial fix to [bpo-39416](), which didn't come up until it was already committed ``` Change "Numeric" to "numeric". I believe this is trivial enough to not need an issue or a NEWS entry, although I'm unclear on what branches the original pull request received backports. ``` Automerge-Triggered-By: GH:merwok --- Doc/reference/datamodel.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index d9b72a9a942ed8..ab4eb478efb8b2 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -187,7 +187,7 @@ Ellipsis related to mathematical numbers, but subject to the limitations of numerical representation in computers. - The string representations of the Numeric classes, computed by + The string representations of the numeric classes, computed by :meth:`__repr__` and :meth:`__str__`, have the following properties: From fd5d2b1ddf721db5f33951b3be9284a26e34b992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Ogam?= Date: Wed, 21 Oct 2020 23:17:35 +0200 Subject: [PATCH 0338/1261] bpo-35181: Correct importlib documentation for some module attributes (GH-15190) @ericsnowcurrently This PR will change the following: In the library documentation importlib.rst: - `module.__package__` can be `module.__name__` for packages; - `spec.parent` can be `spec.__name__` for packages; - `spec.loader` is not `None` for namespaces packages. In the language documentation import.rst: - `spec.loader` is not `None` for namespace packages. Automerge-Triggered-By: GH:warsaw --- Doc/library/importlib.rst | 14 ++++++++------ Doc/reference/import.rst | 18 +++--------------- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index 5fb0a4a120b98d..45b62aec9ef537 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -438,8 +438,9 @@ ABC hierarchy:: package. This attribute is not set on modules. - :attr:`__package__` - The parent package for the module/package. If the module is - top-level then it has a value of the empty string. The + The fully-qualified name of the package under which the module was + loaded as a submodule (or the empty string for top-level modules). + For packages, it is the same as :attr:`__name__`. The :func:`importlib.util.module_for_loader` decorator can handle the details for :attr:`__package__`. @@ -1347,8 +1348,8 @@ find and load modules. (``__loader__``) - The loader to use for loading. For namespace packages this should be - set to ``None``. + The :term:`Loader ` that should be used when loading + the module. :term:`Finders ` should always set this. .. attribute:: origin @@ -1381,8 +1382,9 @@ find and load modules. (``__package__``) - (Read-only) Fully-qualified name of the package to which the module - belongs as a submodule (or ``None``). + (Read-only) The fully-qualified name of the package under which the module + should be loaded as a submodule (or the empty string for top-level modules). + For packages, it is the same as :attr:`__name__`. .. attribute:: has_location diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 213b31487ac618..c5952426fdcf8d 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -857,9 +857,8 @@ module. ``find_spec()`` returns a fully populated spec for the module. This spec will always have "loader" set (with one exception). To indicate to the import machinery that the spec represents a namespace -:term:`portion`, the path entry finder sets "loader" on the spec to -``None`` and "submodule_search_locations" to a list containing the -portion. +:term:`portion`, the path entry finder sets "submodule_search_locations" to +a list containing the portion. .. versionchanged:: 3.4 :meth:`~importlib.abc.PathEntryFinder.find_spec` replaced @@ -875,18 +874,7 @@ portion. :meth:`~importlib.abc.PathEntryFinder.find_loader` takes one argument, the fully qualified name of the module being imported. ``find_loader()`` returns a 2-tuple where the first item is the loader and the second item - is a namespace :term:`portion`. When the first item (i.e. the loader) is - ``None``, this means that while the path entry finder does not have a - loader for the named module, it knows that the path entry contributes to - a namespace portion for the named module. This will almost always be the - case where Python is asked to import a namespace package that has no - physical presence on the file system. When a path entry finder returns - ``None`` for the loader, the second item of the 2-tuple return value must - be a sequence, although it can be empty. - - If ``find_loader()`` returns a non-``None`` loader value, the portion is - ignored and the loader is returned from the path based finder, terminating - the search through the path entries. + is a namespace :term:`portion`. For backwards compatibility with other implementations of the import protocol, many path entry finders also support the same, From 3a90f5f1dfcd7e6a7d540532c25b24552d5a7476 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 21 Oct 2020 22:46:52 +0100 Subject: [PATCH 0339/1261] bpo-38980: Add -fno-semantic-interposition when building with optimizations (GH-22862) --- Doc/whatsnew/3.10.rst | 8 ++++++++ .../next/Build/2020-10-21-18-31-54.bpo-38980.xz7BNd.rst | 3 +++ configure | 8 ++++++++ configure.ac | 8 ++++++++ 4 files changed, 27 insertions(+) create mode 100644 Misc/NEWS.d/next/Build/2020-10-21-18-31-54.bpo-38980.xz7BNd.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index e275a7cb4573f0..e464be6eb7e951 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -256,6 +256,14 @@ Optimizations It is about 36% faster now. (Contributed by Pablo Galindo and Yury Selivanov in :issue:`42093`.) +* When building Python with ``--enable-optimizations`` now + ``-fno-semantic-interposition`` is added to both the compile and link line. + This speeds builds of the Python interpreter created with ``--enable-shared`` + with ``gcc`` by up to 30%. See `this article + `_ + for more details. (Contributed by Victor Stinner and Pablo Galindo in + :issue:`38980`) + Deprecated ========== diff --git a/Misc/NEWS.d/next/Build/2020-10-21-18-31-54.bpo-38980.xz7BNd.rst b/Misc/NEWS.d/next/Build/2020-10-21-18-31-54.bpo-38980.xz7BNd.rst new file mode 100644 index 00000000000000..c9d34cf12c292c --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-10-21-18-31-54.bpo-38980.xz7BNd.rst @@ -0,0 +1,3 @@ +Add ``-fno-semantic-interposition`` to both the compile and link line when +building with ``--enable-optimizations``. Patch by Victor Stinner and Pablo +Galindo. diff --git a/configure b/configure index 88b78947767fa9..df7118f68d3bb4 100755 --- a/configure +++ b/configure @@ -6482,6 +6482,14 @@ if test "$Py_OPT" = 'true' ; then DEF_MAKE_ALL_RULE="profile-opt" REQUIRE_PGO="yes" DEF_MAKE_RULE="build_all" + case $CC in + *gcc*) + CFLAGS_NODIST="$CFLAGS_NODIST -fno-semantic-interposition" + LDFLAGS_NODIST="$LDFLAGS_NODIST -fno-semantic-interposition" + ;; + esac + + else DEF_MAKE_ALL_RULE="build_all" REQUIRE_PGO="no" diff --git a/configure.ac b/configure.ac index 6ffe90a4c426cc..c63c1e88a2302f 100644 --- a/configure.ac +++ b/configure.ac @@ -1318,6 +1318,14 @@ if test "$Py_OPT" = 'true' ; then DEF_MAKE_ALL_RULE="profile-opt" REQUIRE_PGO="yes" DEF_MAKE_RULE="build_all" + case $CC in + *gcc*) + CFLAGS_NODIST="$CFLAGS_NODIST -fno-semantic-interposition" + LDFLAGS_NODIST="$LDFLAGS_NODIST -fno-semantic-interposition" + ;; + esac + + else DEF_MAKE_ALL_RULE="build_all" REQUIRE_PGO="no" From 8f36a02351c5ec4b37905436f02cefc1f6cf6a24 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Wed, 21 Oct 2020 16:24:38 -0700 Subject: [PATCH 0340/1261] bpo-41910: specify the default implementations of object.__eq__ and object.__ne__ (GH-22874) See Objects/typeobject.c:object_richcompare() for the implementation of this in CPython. Automerge-Triggered-By: GH:brettcannon --- Doc/reference/datamodel.rst | 14 ++++++++------ .../2020-10-21-14-40-54.bpo-41910.CzBMit.rst | 1 + 2 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-21-14-40-54.bpo-41910.CzBMit.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index ab4eb478efb8b2..d92e19761a9654 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1395,12 +1395,14 @@ Basic customization context (e.g., in the condition of an ``if`` statement), Python will call :func:`bool` on the value to determine if the result is true or false. - By default, :meth:`__ne__` delegates to :meth:`__eq__` and - inverts the result unless it is ``NotImplemented``. There are no other - implied relationships among the comparison operators, for example, - the truth of ``(x Date: Wed, 21 Oct 2020 17:49:10 -0700 Subject: [PATCH 0341/1261] Delete TaskWakeupMethWrapper_Type and use PyCFunction instead (#22875) --- Modules/_asynciomodule.c | 102 +++------------------------------------ 1 file changed, 8 insertions(+), 94 deletions(-) diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index f01e5884c6fe20..90d288f7393934 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -93,11 +93,6 @@ typedef struct { PyObject *sw_arg; } TaskStepMethWrapper; -typedef struct { - PyObject_HEAD - TaskObj *ww_task; -} TaskWakeupMethWrapper; - typedef struct { PyObject_HEAD PyObject *rl_loop; @@ -1870,93 +1865,15 @@ TaskStepMethWrapper_new(TaskObj *task, PyObject *arg) return (PyObject*) o; } -/* ----- Task._wakeup wrapper */ - -static PyObject * -TaskWakeupMethWrapper_call(TaskWakeupMethWrapper *o, - PyObject *args, PyObject *kwds) -{ - PyObject *fut; - - if (kwds != NULL && PyDict_GET_SIZE(kwds) != 0) { - PyErr_SetString(PyExc_TypeError, "function takes no keyword arguments"); - return NULL; - } - if (!PyArg_ParseTuple(args, "O", &fut)) { - return NULL; - } - - return task_wakeup(o->ww_task, fut); -} - -static int -TaskWakeupMethWrapper_clear(TaskWakeupMethWrapper *o) -{ - Py_CLEAR(o->ww_task); - return 0; -} - -static int -TaskWakeupMethWrapper_traverse(TaskWakeupMethWrapper *o, - visitproc visit, void *arg) -{ - Py_VISIT(o->ww_task); - return 0; -} - -static void -TaskWakeupMethWrapper_dealloc(TaskWakeupMethWrapper *o) -{ - PyObject_GC_UnTrack(o); - (void)TaskWakeupMethWrapper_clear(o); - Py_TYPE(o)->tp_free(o); -} - -static PyObject * -TaskWakeupMethWrapper_get___self__(TaskWakeupMethWrapper *o, void *Py_UNUSED(ignored)) -{ - if (o->ww_task) { - Py_INCREF(o->ww_task); - return (PyObject*)o->ww_task; - } - Py_RETURN_NONE; -} +/* ----- Task._wakeup implementation */ -static PyGetSetDef TaskWakeupMethWrapper_getsetlist[] = { - {"__self__", (getter)TaskWakeupMethWrapper_get___self__, NULL, NULL}, - {NULL} /* Sentinel */ -}; - -static PyTypeObject TaskWakeupMethWrapper_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "TaskWakeupMethWrapper", - .tp_basicsize = sizeof(TaskWakeupMethWrapper), - .tp_itemsize = 0, - .tp_dealloc = (destructor)TaskWakeupMethWrapper_dealloc, - .tp_call = (ternaryfunc)TaskWakeupMethWrapper_call, - .tp_getattro = PyObject_GenericGetAttr, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, - .tp_traverse = (traverseproc)TaskWakeupMethWrapper_traverse, - .tp_clear = (inquiry)TaskWakeupMethWrapper_clear, - .tp_getset = TaskWakeupMethWrapper_getsetlist, +static PyMethodDef TaskWakeupDef = { + "task_wakeup", + (PyCFunction)task_wakeup, + METH_O, + NULL }; -static PyObject * -TaskWakeupMethWrapper_new(TaskObj *task) -{ - TaskWakeupMethWrapper *o; - o = PyObject_GC_New(TaskWakeupMethWrapper, &TaskWakeupMethWrapper_Type); - if (o == NULL) { - return NULL; - } - - Py_INCREF(task); - o->ww_task = task; - - PyObject_GC_Track(o); - return (PyObject*) o; -} - /* ----- Task introspection helpers */ static int @@ -2803,7 +2720,7 @@ task_step_impl(TaskObj *task, PyObject *exc) fut->fut_blocking = 0; /* result.add_done_callback(task._wakeup) */ - wrapper = TaskWakeupMethWrapper_new(task); + wrapper = PyCFunction_New(&TaskWakeupDef, (PyObject *)task); if (wrapper == NULL) { goto fail; } @@ -2884,7 +2801,7 @@ task_step_impl(TaskObj *task, PyObject *exc) goto fail; } - wrapper = TaskWakeupMethWrapper_new(task); + wrapper = PyCFunction_New(&TaskWakeupDef, (PyObject *)task); if (wrapper == NULL) { goto fail; } @@ -3458,9 +3375,6 @@ PyInit__asyncio(void) if (PyType_Ready(&TaskStepMethWrapper_Type) < 0) { return NULL; } - if (PyType_Ready(&TaskWakeupMethWrapper_Type) < 0) { - return NULL; - } if (PyType_Ready(&PyRunningLoopHolder_Type) < 0) { return NULL; } From 8fc4e0f18d517c67152f6de12fed8efdf63603a5 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 22 Oct 2020 18:44:18 +0900 Subject: [PATCH 0342/1261] _testmultiphase: Fix possible ref leak (GH-22881) This is just test code, but sometimes external contributors reference the code snippets from test code. `PyModule_AddObject` should be handled in the proper way. https://docs.python.org/3/c-api/module.html#c.PyModule_AddObject --- Modules/_testmultiphase.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c index d69ae628fa7a40..8bba077be9bb68 100644 --- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -359,6 +359,7 @@ static int execfunc(PyObject *m) goto fail; } if (PyModule_AddObject(m, "Example", temp) != 0) { + Py_DECREF(temp); goto fail; } @@ -369,6 +370,7 @@ static int execfunc(PyObject *m) goto fail; } if (PyModule_AddObject(m, "error", temp) != 0) { + Py_DECREF(temp); goto fail; } @@ -378,6 +380,7 @@ static int execfunc(PyObject *m) goto fail; } if (PyModule_AddObject(m, "Str", temp) != 0) { + Py_DECREF(temp); goto fail; } @@ -807,6 +810,7 @@ meth_state_access_exec(PyObject *m) return -1; } if (PyModule_AddObject(m, "StateAccessType", temp) != 0) { + Py_DECREF(temp); return -1; } From 66c2c6bdd13a2bee5e8f759a8e7ef7d83397e9c9 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 22 Oct 2020 12:20:36 +0200 Subject: [PATCH 0343/1261] bpo-1635741: Fix NULL ptr deref in multiprocessing (GH-22880) Commit 1d541c25c8019f7a0b80b3e1b437abe171e40b65 introduced a NULL pointer dereference in error path. Signed-off-by: Christian Heimes --- Modules/_multiprocessing/multiprocessing.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c index 25b8dc3967a4fb..bec23517fca517 100644 --- a/Modules/_multiprocessing/multiprocessing.c +++ b/Modules/_multiprocessing/multiprocessing.c @@ -207,7 +207,6 @@ multiprocessing_exec(PyObject *module) py_sem_value_max = PyLong_FromLong(SEM_VALUE_MAX); if (py_sem_value_max == NULL) { - Py_DECREF(py_sem_value_max); return -1; } if (PyDict_SetItemString(_PyMp_SemLockType.tp_dict, "SEM_VALUE_MAX", From 5a1597b1244084b462de4484e8283e45aab556f0 Mon Sep 17 00:00:00 2001 From: larryhastings Date: Thu, 22 Oct 2020 06:16:21 -0700 Subject: [PATCH 0344/1261] Remove 3.5 from Doc version switcher in master. (#22886) --- Doc/tools/static/switchers.js | 1 - Doc/tools/templates/indexsidebar.html | 1 - 2 files changed, 2 deletions(-) diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js index c51f178ce645c0..1a1c7d0fa57e23 100644 --- a/Doc/tools/static/switchers.js +++ b/Doc/tools/static/switchers.js @@ -15,7 +15,6 @@ '3.8': '3.8', '3.7': '3.7', '3.6': '3.6', - '3.5': '3.5', '2.7': '2.7', }; diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index 7a40be77aa1295..1c1cb5484a4f67 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -7,7 +7,6 @@

    {% trans %}Docs by version{% endtrans %}

  • {% trans %}Python 3.8 (stable){% endtrans %}
  • {% trans %}Python 3.7 (stable){% endtrans %}
  • {% trans %}Python 3.6 (security-fixes){% endtrans %}
  • -
  • {% trans %}Python 3.5 (security-fixes){% endtrans %}
  • {% trans %}Python 2.7 (EOL){% endtrans %}
  • {% trans %}All versions{% endtrans %}
  • From 05dbe34f6679287e80473f5558a950a4fa12809d Mon Sep 17 00:00:00 2001 From: Philippe Ombredanne Date: Thu, 22 Oct 2020 17:39:18 +0200 Subject: [PATCH 0345/1261] bpo-25655: Improve Win DLL loading failures doc (GH-22372) Add documentation to help diagnose CDLL dependent DLL loading errors on windows for OSError with message: "[WinError 126] The specified module could not be found" This error is otherwise difficult to diagnose. --- Doc/library/ctypes.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index c172d5377636a7..bf32d3e549b480 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1326,6 +1326,21 @@ way is to instantiate one of the following classes: libraries use the standard C calling convention, and are assumed to return :c:type:`int`. + On Windows creating a :class:`CDLL` instance may fail even if the DLL name + exists. When a dependent DLL of the loaded DLL is not found, a + :exc:`OSError` error is raised with the message *"[WinError 126] The + specified module could not be found".* This error message does not contain + the name of the missing DLL because the Windows API does not return this + information making this error hard to diagnose. To resolve this error and + determine which DLL is not found, you need to find the list of dependent + DLLs and determine which one is not found using Windows debugging and + tracing tools. + +.. seealso:: + + `Microsoft DUMPBIN tool `_ + -- A tool to find DLL dependents. + .. class:: OleDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=0) From 60127c07776a76188f2b27ad262e26c72753f837 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 22 Oct 2020 16:42:26 +0100 Subject: [PATCH 0346/1261] bpo-42057: Add regression test to master. (GH-22893) --- Lib/test/test_peepholer.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 65047cace56c12..92a82cc54f2686 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -522,6 +522,12 @@ def f(): with self.assertRaises(ValueError): f() + def test_bpo_42057(self): + for i in range(10): + try: + raise Exception + except Exception or Exception: + pass if __name__ == "__main__": unittest.main() From eb17ec296f1b1293f6f12d2672930fbbf290fc63 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Thu, 22 Oct 2020 19:02:43 +0300 Subject: [PATCH 0347/1261] bpo-42086: Document AST operator nodes acts as a singleton (GH-22896) Automerge-Triggered-By: GH:gvanrossum --- Doc/library/ast.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index f95ee1d5c69c21..b8688ae61a4876 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -1503,6 +1503,13 @@ Async and await fields as :class:`For` and :class:`With`, respectively. Only valid in the body of an :class:`AsyncFunctionDef`. +.. note:: + When a string is parsed by :func:`ast.parse`, operator nodes (subclasses + of :class:`ast.operator`, :class:`ast.unaryop`, :class:`ast.cmpop`, + :class:`ast.boolop` and :class:`ast.expr_context`) on the returned tree + will be singletons. Changes to one will be reflected in all other + occurrences of the same value (e.g. :class:`ast.Add`). + :mod:`ast` Helpers ------------------ From 3a736111e01b5a9f46b10802cece335c57cbafca Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 22 Oct 2020 18:11:53 +0200 Subject: [PATCH 0348/1261] bpo-38980: Only apply -fno-semantic-interposition if available (GH-22892) --- aclocal.m4 | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ configure | 36 +++++++++++++++++++++++++++++++++++ configure.ac | 2 ++ 3 files changed, 92 insertions(+) diff --git a/aclocal.m4 b/aclocal.m4 index b5f9cb0e8da44f..99913e7f3b85cf 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -12,6 +12,60 @@ # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 6 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS + # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 11 (pkg-config-0.29.1) diff --git a/configure b/configure index df7118f68d3bb4..29f33b543ecc02 100755 --- a/configure +++ b/configure @@ -6484,8 +6484,44 @@ if test "$Py_OPT" = 'true' ; then DEF_MAKE_RULE="build_all" case $CC in *gcc*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fno-semantic-interposition" >&5 +$as_echo_n "checking whether C compiler accepts -fno-semantic-interposition... " >&6; } +if ${ax_cv_check_cflags___fno_semantic_interposition+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -fno-semantic-interposition" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___fno_semantic_interposition=yes +else + ax_cv_check_cflags___fno_semantic_interposition=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fno_semantic_interposition" >&5 +$as_echo "$ax_cv_check_cflags___fno_semantic_interposition" >&6; } +if test "x$ax_cv_check_cflags___fno_semantic_interposition" = xyes; then : + CFLAGS_NODIST="$CFLAGS_NODIST -fno-semantic-interposition" LDFLAGS_NODIST="$LDFLAGS_NODIST -fno-semantic-interposition" + +else + : +fi + ;; esac diff --git a/configure.ac b/configure.ac index c63c1e88a2302f..9698c3c888a6b7 100644 --- a/configure.ac +++ b/configure.ac @@ -1320,8 +1320,10 @@ if test "$Py_OPT" = 'true' ; then DEF_MAKE_RULE="build_all" case $CC in *gcc*) + AX_CHECK_COMPILE_FLAG([-fno-semantic-interposition],[ CFLAGS_NODIST="$CFLAGS_NODIST -fno-semantic-interposition" LDFLAGS_NODIST="$LDFLAGS_NODIST -fno-semantic-interposition" + ]) ;; esac From 5ed3b0667fbd9037a0cc0d7c3c5d1e2360e47b11 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Thu, 22 Oct 2020 21:26:14 +0300 Subject: [PATCH 0349/1261] Add CODEOWNERS for the Grammar file (GH-22898) --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 31003a8ac247e8..5b8662cfe09218 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -76,6 +76,7 @@ Include/pytime.h @pganssle @abalkin /Parser/ @pablogsal @lysnikolaou /Tools/peg_generator/ @pablogsal @lysnikolaou /Lib/test/test_peg_generator/ @pablogsal @lysnikolaou +/Grammar/python.gram @pablogsal @lysnikolaou # SQLite 3 **/*sqlite* @berkerpeksag From a45225c3eab725311cf086bc7194b71391a7ace0 Mon Sep 17 00:00:00 2001 From: Cheryl Sabella Date: Thu, 22 Oct 2020 15:14:35 -0400 Subject: [PATCH 0350/1261] bpo-33987: IDLE: Use ttk Frame on doc window and statusbar (GH-11433) --- Lib/idlelib/help.py | 8 +++++--- Lib/idlelib/statusbar.py | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Lib/idlelib/help.py b/Lib/idlelib/help.py index 9f63ea0d3990e6..f420d40fb9ea40 100644 --- a/Lib/idlelib/help.py +++ b/Lib/idlelib/help.py @@ -28,8 +28,8 @@ from os.path import abspath, dirname, isfile, join from platform import python_version -from tkinter import Toplevel, Frame, Text, Menu -from tkinter.ttk import Menubutton, Scrollbar +from tkinter import Toplevel, Text, Menu +from tkinter.ttk import Frame, Menubutton, Scrollbar, Style from tkinter import font as tkfont from idlelib.config import idleConf @@ -212,7 +212,9 @@ class HelpFrame(Frame): def __init__(self, parent, filename): Frame.__init__(self, parent) self.text = text = HelpText(self, filename) - self['background'] = text['background'] + self.style = Style(parent) + self['style'] = 'helpframe.TFrame' + self.style.configure('helpframe.TFrame', background=text['background']) self.toc = toc = self.toc_menu(text) self.scroll = scroll = Scrollbar(self, command=text.yview) text['yscrollcommand'] = scroll.set diff --git a/Lib/idlelib/statusbar.py b/Lib/idlelib/statusbar.py index c071f898b0f744..ae52a56368c82a 100644 --- a/Lib/idlelib/statusbar.py +++ b/Lib/idlelib/statusbar.py @@ -1,4 +1,5 @@ -from tkinter import Frame, Label +from tkinter import Label +from tkinter.ttk import Frame class MultiStatusBar(Frame): @@ -20,7 +21,8 @@ def set_label(self, name, text='', side='left', width=0): def _multistatus_bar(parent): # htest # - from tkinter import Toplevel, Frame, Text, Button + from tkinter import Toplevel, Text + from tkinter.ttk import Frame, Button top = Toplevel(parent) x, y = map(int, parent.geometry().split('+')[1:]) top.geometry("+%d+%d" %(x, y + 175)) From ff0bedf2062ae9a1451fb3c561d3b450da1c8bdd Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Thu, 22 Oct 2020 17:33:28 -0600 Subject: [PATCH 0351/1261] bpo-38486: Fix dead qmail links in the mailbox docs (GH-22239) --- Doc/library/mailbox.rst | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst index f82a3b200deb7c..94d95d10290b00 100644 --- a/Doc/library/mailbox.rst +++ b/Doc/library/mailbox.rst @@ -426,17 +426,14 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. seealso:: - `maildir man page from qmail `_ - The original specification of the format. + `maildir man page from Courier `_ + A specification of the format. Describes a common extension for + supporting folders. `Using maildir format `_ Notes on Maildir by its inventor. Includes an updated name-creation scheme and details on "info" semantics. - `maildir man page from Courier `_ - Another specification of the format. Describes a common extension for supporting - folders. - .. _mailbox-mbox: @@ -485,11 +482,8 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. seealso:: - `mbox man page from qmail `_ - A specification of the format and its variations. - `mbox man page from tin `_ - Another specification of the format, with details on locking. + A specification of the format, with details on locking. `Configuring Netscape Mail on Unix: Why The Content-Length Format is Bad `_ An argument for using the original mbox format rather than a variation. From 45b783755bef7f9a9b1ce81d4da00ae6d72cfcd3 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Thu, 22 Oct 2020 18:42:51 -0600 Subject: [PATCH 0352/1261] bpo-36876: Fix the C analyzer tool. (GH-22841) The original tool wasn't working right and it was simpler to create a new one, partially re-using some of the old code. At this point the tool runs properly on the master. (Try: ./python Tools/c-analyzer/c-analyzer.py analyze.) It take ~40 seconds on my machine to analyze the full CPython code base. Note that we'll need to iron out some OS-specific stuff (e.g. preprocessor). We're okay though since this tool isn't used yet in our workflow. We will also need to verify the analysis results in detail before activating the check in CI, though I'm pretty sure it's close. https://bugs.python.org/issue36876 --- .../test_tools/test_c_analyzer/__init__.py | 15 - .../test_tools/test_c_analyzer/__main__.py | 5 - .../test_c_analyzer/test_common/__init__.py | 6 - .../test_c_analyzer/test_common/test_files.py | 470 ---- .../test_c_analyzer/test_common/test_info.py | 197 -- .../test_c_analyzer/test_common/test_show.py | 54 - .../test_c_analyzer/test_cpython/__init__.py | 6 - .../test_cpython/test___main__.py | 296 --- .../test_cpython/test_functional.py | 34 - .../test_cpython/test_supported.py | 98 - .../test_c_analyzer/test_parser/__init__.py | 6 - .../test_parser/test_declarations.py | 795 ------- .../test_parser/test_preprocessor.py | 1561 ------------- .../test_c_analyzer/test_symbols/__init__.py | 6 - .../test_c_analyzer/test_symbols/test_info.py | 192 -- .../test_variables/__init__.py | 6 - .../test_variables/test_find.py | 124 -- .../test_variables/test_info.py | 244 --- .../test_variables/test_known.py | 139 -- Lib/test/test_tools/test_c_analyzer/util.py | 60 - Tools/c-analyzer/README | 4 + Tools/c-analyzer/c-analyzer.py | 7 + Tools/c-analyzer/c-globals.py | 9 - Tools/c-analyzer/c_analyzer/__init__.py | 103 + Tools/c-analyzer/c_analyzer/__main__.py | 501 +++++ Tools/c-analyzer/c_analyzer/analyze.py | 307 +++ Tools/c-analyzer/c_analyzer/common/files.py | 124 -- Tools/c-analyzer/c_analyzer/common/info.py | 138 -- Tools/c-analyzer/c_analyzer/common/show.py | 11 - Tools/c-analyzer/c_analyzer/datafiles.py | 109 + Tools/c-analyzer/c_analyzer/info.py | 353 +++ .../c_analyzer/parser/declarations.py | 339 --- Tools/c-analyzer/c_analyzer/parser/find.py | 107 - Tools/c-analyzer/c_analyzer/parser/naive.py | 179 -- .../c_analyzer/parser/preprocessor.py | 511 ----- Tools/c-analyzer/c_analyzer/parser/source.py | 34 - .../c-analyzer/c_analyzer/symbols/__init__.py | 0 Tools/c-analyzer/c_analyzer/symbols/_nm.py | 117 - Tools/c-analyzer/c_analyzer/symbols/find.py | 175 -- Tools/c-analyzer/c_analyzer/symbols/info.py | 51 - .../c_analyzer/variables/__init__.py | 0 Tools/c-analyzer/c_analyzer/variables/find.py | 75 - Tools/c-analyzer/c_analyzer/variables/info.py | 93 - .../c-analyzer/c_analyzer/variables/known.py | 91 - Tools/c-analyzer/c_common/__init__.py | 2 + .../common/util.py => c_common/clsutil.py} | 126 -- Tools/c-analyzer/c_common/fsutil.py | 388 ++++ .../common/__init__.py => c_common/info.py} | 0 Tools/c-analyzer/c_common/iterutil.py | 48 + Tools/c-analyzer/c_common/logging.py | 63 + Tools/c-analyzer/c_common/misc.py | 7 + Tools/c-analyzer/c_common/scriptutil.py | 577 +++++ .../parser/__init__.py => c_common/show.py} | 0 Tools/c-analyzer/c_common/strutil.py | 42 + Tools/c-analyzer/c_common/tables.py | 213 ++ Tools/c-analyzer/c_parser/__init__.py | 46 + Tools/c-analyzer/c_parser/__main__.py | 261 +++ Tools/c-analyzer/c_parser/_state_machine.py | 244 +++ Tools/c-analyzer/c_parser/datafiles.py | 150 ++ Tools/c-analyzer/c_parser/info.py | 1658 ++++++++++++++ Tools/c-analyzer/c_parser/parser/__init__.py | 212 ++ Tools/c-analyzer/c_parser/parser/_alt.py | 6 + Tools/c-analyzer/c_parser/parser/_common.py | 115 + .../c_parser/parser/_compound_decl_body.py | 158 ++ Tools/c-analyzer/c_parser/parser/_delim.py | 54 + .../c-analyzer/c_parser/parser/_func_body.py | 278 +++ Tools/c-analyzer/c_parser/parser/_global.py | 179 ++ Tools/c-analyzer/c_parser/parser/_info.py | 168 ++ Tools/c-analyzer/c_parser/parser/_regexes.py | 796 +++++++ .../c_parser/preprocessor/__init__.py | 190 ++ .../c_parser/preprocessor/__main__.py | 196 ++ .../c_parser/preprocessor/common.py | 173 ++ .../c_parser/preprocessor/errors.py | 110 + Tools/c-analyzer/c_parser/preprocessor/gcc.py | 123 ++ .../c-analyzer/c_parser/preprocessor/pure.py | 23 + Tools/c-analyzer/c_parser/source.py | 64 + Tools/c-analyzer/check-c-globals.py | 465 +--- Tools/c-analyzer/cpython/README | 72 - Tools/c-analyzer/cpython/__init__.py | 29 +- Tools/c-analyzer/cpython/__main__.py | 446 ++-- Tools/c-analyzer/cpython/_analyzer.py | 348 +++ Tools/c-analyzer/cpython/_generate.py | 326 --- Tools/c-analyzer/cpython/_parser.py | 308 +++ Tools/c-analyzer/cpython/files.py | 29 - Tools/c-analyzer/cpython/find.py | 101 - Tools/c-analyzer/cpython/ignored.tsv | 2 + Tools/c-analyzer/cpython/known.py | 66 - Tools/c-analyzer/cpython/known.tsv | 3 + Tools/c-analyzer/cpython/supported.py | 398 ---- Tools/c-analyzer/ignored-globals.txt | 492 ----- Tools/c-analyzer/ignored.tsv | 1 - Tools/c-analyzer/known.tsv | 1927 ----------------- 92 files changed, 8882 insertions(+), 10553 deletions(-) delete mode 100644 Lib/test/test_tools/test_c_analyzer/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/__main__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_common/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_common/test_files.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_common/test_info.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_common/test_show.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_cpython/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_cpython/test___main__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_cpython/test_functional.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_cpython/test_supported.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_parser/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_parser/test_declarations.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_parser/test_preprocessor.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_symbols/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_symbols/test_info.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_variables/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_variables/test_find.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_variables/test_info.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_variables/test_known.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/util.py create mode 100644 Tools/c-analyzer/c-analyzer.py delete mode 100644 Tools/c-analyzer/c-globals.py create mode 100644 Tools/c-analyzer/c_analyzer/__main__.py create mode 100644 Tools/c-analyzer/c_analyzer/analyze.py delete mode 100644 Tools/c-analyzer/c_analyzer/common/files.py delete mode 100644 Tools/c-analyzer/c_analyzer/common/info.py delete mode 100644 Tools/c-analyzer/c_analyzer/common/show.py create mode 100644 Tools/c-analyzer/c_analyzer/datafiles.py create mode 100644 Tools/c-analyzer/c_analyzer/info.py delete mode 100644 Tools/c-analyzer/c_analyzer/parser/declarations.py delete mode 100644 Tools/c-analyzer/c_analyzer/parser/find.py delete mode 100644 Tools/c-analyzer/c_analyzer/parser/naive.py delete mode 100644 Tools/c-analyzer/c_analyzer/parser/preprocessor.py delete mode 100644 Tools/c-analyzer/c_analyzer/parser/source.py delete mode 100644 Tools/c-analyzer/c_analyzer/symbols/__init__.py delete mode 100644 Tools/c-analyzer/c_analyzer/symbols/_nm.py delete mode 100644 Tools/c-analyzer/c_analyzer/symbols/find.py delete mode 100644 Tools/c-analyzer/c_analyzer/symbols/info.py delete mode 100644 Tools/c-analyzer/c_analyzer/variables/__init__.py delete mode 100644 Tools/c-analyzer/c_analyzer/variables/find.py delete mode 100644 Tools/c-analyzer/c_analyzer/variables/info.py delete mode 100644 Tools/c-analyzer/c_analyzer/variables/known.py create mode 100644 Tools/c-analyzer/c_common/__init__.py rename Tools/c-analyzer/{c_analyzer/common/util.py => c_common/clsutil.py} (51%) create mode 100644 Tools/c-analyzer/c_common/fsutil.py rename Tools/c-analyzer/{c_analyzer/common/__init__.py => c_common/info.py} (100%) create mode 100644 Tools/c-analyzer/c_common/iterutil.py create mode 100644 Tools/c-analyzer/c_common/logging.py create mode 100644 Tools/c-analyzer/c_common/misc.py create mode 100644 Tools/c-analyzer/c_common/scriptutil.py rename Tools/c-analyzer/{c_analyzer/parser/__init__.py => c_common/show.py} (100%) create mode 100644 Tools/c-analyzer/c_common/strutil.py create mode 100644 Tools/c-analyzer/c_common/tables.py create mode 100644 Tools/c-analyzer/c_parser/__init__.py create mode 100644 Tools/c-analyzer/c_parser/__main__.py create mode 100644 Tools/c-analyzer/c_parser/_state_machine.py create mode 100644 Tools/c-analyzer/c_parser/datafiles.py create mode 100644 Tools/c-analyzer/c_parser/info.py create mode 100644 Tools/c-analyzer/c_parser/parser/__init__.py create mode 100644 Tools/c-analyzer/c_parser/parser/_alt.py create mode 100644 Tools/c-analyzer/c_parser/parser/_common.py create mode 100644 Tools/c-analyzer/c_parser/parser/_compound_decl_body.py create mode 100644 Tools/c-analyzer/c_parser/parser/_delim.py create mode 100644 Tools/c-analyzer/c_parser/parser/_func_body.py create mode 100644 Tools/c-analyzer/c_parser/parser/_global.py create mode 100644 Tools/c-analyzer/c_parser/parser/_info.py create mode 100644 Tools/c-analyzer/c_parser/parser/_regexes.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/__init__.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/__main__.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/common.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/errors.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/gcc.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/pure.py create mode 100644 Tools/c-analyzer/c_parser/source.py delete mode 100644 Tools/c-analyzer/cpython/README create mode 100644 Tools/c-analyzer/cpython/_analyzer.py delete mode 100644 Tools/c-analyzer/cpython/_generate.py create mode 100644 Tools/c-analyzer/cpython/_parser.py delete mode 100644 Tools/c-analyzer/cpython/files.py delete mode 100644 Tools/c-analyzer/cpython/find.py create mode 100644 Tools/c-analyzer/cpython/ignored.tsv delete mode 100644 Tools/c-analyzer/cpython/known.py create mode 100644 Tools/c-analyzer/cpython/known.tsv delete mode 100644 Tools/c-analyzer/cpython/supported.py delete mode 100644 Tools/c-analyzer/ignored-globals.txt delete mode 100644 Tools/c-analyzer/ignored.tsv delete mode 100644 Tools/c-analyzer/known.tsv diff --git a/Lib/test/test_tools/test_c_analyzer/__init__.py b/Lib/test/test_tools/test_c_analyzer/__init__.py deleted file mode 100644 index d0b4c045104d76..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -import contextlib -import os.path -import test.test_tools -from test.support import load_package_tests - - -@contextlib.contextmanager -def tool_imports_for_tests(): - test.test_tools.skip_if_missing('c-analyzer') - with test.test_tools.imports_under_tool('c-analyzer'): - yield - - -def load_tests(*args): - return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/__main__.py b/Lib/test/test_tools/test_c_analyzer/__main__.py deleted file mode 100644 index b5b017de8a8a41..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/__main__.py +++ /dev/null @@ -1,5 +0,0 @@ -from . import load_tests -import unittest - - -unittest.main() diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_common/__init__.py deleted file mode 100644 index bc502ef32d2916..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_common/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -import os.path -from test.support import load_package_tests - - -def load_tests(*args): - return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/test_files.py b/Lib/test/test_tools/test_c_analyzer/test_common/test_files.py deleted file mode 100644 index 0c97d2a0bbf9ad..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_common/test_files.py +++ /dev/null @@ -1,470 +0,0 @@ -import os.path -import unittest - -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - from c_analyzer.common.files import ( - iter_files, _walk_tree, glob_tree, - ) - - -def fixpath(filename): - return filename.replace('/', os.path.sep) - - -class IterFilesTests(unittest.TestCase): - - maxDiff = None - - _return_walk = None - - @property - def calls(self): - try: - return self._calls - except AttributeError: - self._calls = [] - return self._calls - - def set_files(self, *filesperroot): - roots = [] - result = [] - for root, files in filesperroot: - root = fixpath(root) - roots.append(root) - result.append([os.path.join(root, fixpath(f)) - for f in files]) - self._return_walk = result - return roots - - def _walk(self, root, *, suffix=None, walk=None): - self.calls.append(('_walk', (root, suffix, walk))) - return iter(self._return_walk.pop(0)) - - def _glob(self, root, *, suffix=None): - self.calls.append(('_glob', (root, suffix))) - return iter(self._return_walk.pop(0)) - - def test_typical(self): - dirnames = self.set_files( - ('spam', ['file1.c', 'file2.c']), - ('eggs', ['ham/file3.h']), - ) - suffixes = ('.c', '.h') - - files = list(iter_files(dirnames, suffixes, - _glob=self._glob, - _walk=self._walk)) - - self.assertEqual(files, [ - fixpath('spam/file1.c'), - fixpath('spam/file2.c'), - fixpath('eggs/ham/file3.h'), - ]) - self.assertEqual(self.calls, [ - ('_walk', ('spam', None, _walk_tree)), - ('_walk', ('eggs', None, _walk_tree)), - ]) - - def test_single_root(self): - self._return_walk = [ - [fixpath('spam/file1.c'), fixpath('spam/file2.c')], - ] - - files = list(iter_files('spam', '.c', - _glob=self._glob, - _walk=self._walk)) - - self.assertEqual(files, [ - fixpath('spam/file1.c'), - fixpath('spam/file2.c'), - ]) - self.assertEqual(self.calls, [ - ('_walk', ('spam', '.c', _walk_tree)), - ]) - - def test_one_root(self): - self._return_walk = [ - [fixpath('spam/file1.c'), fixpath('spam/file2.c')], - ] - - files = list(iter_files(['spam'], '.c', - _glob=self._glob, - _walk=self._walk)) - - self.assertEqual(files, [ - fixpath('spam/file1.c'), - fixpath('spam/file2.c'), - ]) - self.assertEqual(self.calls, [ - ('_walk', ('spam', '.c', _walk_tree)), - ]) - - def test_multiple_roots(self): - dirnames = self.set_files( - ('spam', ['file1.c', 'file2.c']), - ('eggs', ['ham/file3.c']), - ) - - files = list(iter_files(dirnames, '.c', - _glob=self._glob, - _walk=self._walk)) - - self.assertEqual(files, [ - fixpath('spam/file1.c'), - fixpath('spam/file2.c'), - fixpath('eggs/ham/file3.c'), - ]) - self.assertEqual(self.calls, [ - ('_walk', ('spam', '.c', _walk_tree)), - ('_walk', ('eggs', '.c', _walk_tree)), - ]) - - def test_no_roots(self): - files = list(iter_files([], '.c', - _glob=self._glob, - _walk=self._walk)) - - self.assertEqual(files, []) - self.assertEqual(self.calls, []) - - def test_single_suffix(self): - self._return_walk = [ - [fixpath('spam/file1.c'), - fixpath('spam/eggs/file3.c'), - ], - ] - - files = list(iter_files('spam', '.c', - _glob=self._glob, - _walk=self._walk)) - - self.assertEqual(files, [ - fixpath('spam/file1.c'), - fixpath('spam/eggs/file3.c'), - ]) - self.assertEqual(self.calls, [ - ('_walk', ('spam', '.c', _walk_tree)), - ]) - - def test_one_suffix(self): - self._return_walk = [ - [fixpath('spam/file1.c'), - fixpath('spam/file1.h'), - fixpath('spam/file1.o'), - fixpath('spam/eggs/file3.c'), - ], - ] - - files = list(iter_files('spam', ['.c'], - _glob=self._glob, - _walk=self._walk)) - - self.assertEqual(files, [ - fixpath('spam/file1.c'), - fixpath('spam/eggs/file3.c'), - ]) - self.assertEqual(self.calls, [ - ('_walk', ('spam', None, _walk_tree)), - ]) - - def test_multiple_suffixes(self): - self._return_walk = [ - [fixpath('spam/file1.c'), - fixpath('spam/file1.h'), - fixpath('spam/file1.o'), - fixpath('spam/eggs/file3.c'), - ], - ] - - files = list(iter_files('spam', ('.c', '.h'), - _glob=self._glob, - _walk=self._walk)) - - self.assertEqual(files, [ - fixpath('spam/file1.c'), - fixpath('spam/file1.h'), - fixpath('spam/eggs/file3.c'), - ]) - self.assertEqual(self.calls, [ - ('_walk', ('spam', None, _walk_tree)), - ]) - - def test_no_suffix(self): - expected = [fixpath('spam/file1.c'), - fixpath('spam/file1.h'), - fixpath('spam/file1.o'), - fixpath('spam/eggs/file3.c'), - ] - for suffix in (None, '', ()): - with self.subTest(suffix): - self.calls.clear() - self._return_walk = [list(expected)] - - files = list(iter_files('spam', suffix, - _glob=self._glob, - _walk=self._walk)) - - self.assertEqual(files, expected) - self.assertEqual(self.calls, [ - ('_walk', ('spam', suffix, _walk_tree)), - ]) - - def test_relparent(self): - dirnames = self.set_files( - ('/x/y/z/spam', ['file1.c', 'file2.c']), - ('/x/y/z/eggs', ['ham/file3.c']), - ) - - files = list(iter_files(dirnames, '.c', fixpath('/x/y'), - _glob=self._glob, - _walk=self._walk)) - - self.assertEqual(files, [ - fixpath('z/spam/file1.c'), - fixpath('z/spam/file2.c'), - fixpath('z/eggs/ham/file3.c'), - ]) - self.assertEqual(self.calls, [ - ('_walk', (fixpath('/x/y/z/spam'), '.c', _walk_tree)), - ('_walk', (fixpath('/x/y/z/eggs'), '.c', _walk_tree)), - ]) - - def test_glob(self): - dirnames = self.set_files( - ('spam', ['file1.c', 'file2.c']), - ('eggs', ['ham/file3.c']), - ) - - files = list(iter_files(dirnames, '.c', - get_files=glob_tree, - _walk=self._walk, - _glob=self._glob)) - - self.assertEqual(files, [ - fixpath('spam/file1.c'), - fixpath('spam/file2.c'), - fixpath('eggs/ham/file3.c'), - ]) - self.assertEqual(self.calls, [ - ('_glob', ('spam', '.c')), - ('_glob', ('eggs', '.c')), - ]) - - - def test_alt_walk_func(self): - dirnames = self.set_files( - ('spam', ['file1.c', 'file2.c']), - ('eggs', ['ham/file3.c']), - ) - def get_files(root): - return None - - files = list(iter_files(dirnames, '.c', - get_files=get_files, - _walk=self._walk, - _glob=self._glob)) - - self.assertEqual(files, [ - fixpath('spam/file1.c'), - fixpath('spam/file2.c'), - fixpath('eggs/ham/file3.c'), - ]) - self.assertEqual(self.calls, [ - ('_walk', ('spam', '.c', get_files)), - ('_walk', ('eggs', '.c', get_files)), - ]) - - - - - - -# def test_no_dirnames(self): -# dirnames = [] -# filter_by_name = None -# -# files = list(iter_files(dirnames, filter_by_name, -# _walk=self._walk)) -# -# self.assertEqual(files, []) -# self.assertEqual(self.calls, []) -# -# def test_no_filter(self): -# self._return_walk = [ -# [('spam', (), ('file1', 'file2.c', 'file3.h', 'file4.o')), -# ], -# ] -# dirnames = [ -# 'spam', -# ] -# filter_by_name = None -# -# files = list(iter_files(dirnames, filter_by_name, -# _walk=self._walk)) -# -# self.assertEqual(files, [ -# fixpath('spam/file1'), -# fixpath('spam/file2.c'), -# fixpath('spam/file3.h'), -# fixpath('spam/file4.o'), -# ]) -# self.assertEqual(self.calls, [ -# ('_walk', ('spam',)), -# ]) -# -# def test_no_files(self): -# self._return_walk = [ -# [('spam', (), ()), -# ], -# [(fixpath('eggs/ham'), (), ()), -# ], -# ] -# dirnames = [ -# 'spam', -# fixpath('eggs/ham'), -# ] -# filter_by_name = None -# -# files = list(iter_files(dirnames, filter_by_name, -# _walk=self._walk)) -# -# self.assertEqual(files, []) -# self.assertEqual(self.calls, [ -# ('_walk', ('spam',)), -# ('_walk', (fixpath('eggs/ham'),)), -# ]) -# -# def test_tree(self): -# self._return_walk = [ -# [('spam', ('sub1', 'sub2', 'sub3'), ('file1',)), -# (fixpath('spam/sub1'), ('sub1sub1',), ('file2', 'file3')), -# (fixpath('spam/sub1/sub1sub1'), (), ('file4',)), -# (fixpath('spam/sub2'), (), ()), -# (fixpath('spam/sub3'), (), ('file5',)), -# ], -# [(fixpath('eggs/ham'), (), ('file6',)), -# ], -# ] -# dirnames = [ -# 'spam', -# fixpath('eggs/ham'), -# ] -# filter_by_name = None -# -# files = list(iter_files(dirnames, filter_by_name, -# _walk=self._walk)) -# -# self.assertEqual(files, [ -# fixpath('spam/file1'), -# fixpath('spam/sub1/file2'), -# fixpath('spam/sub1/file3'), -# fixpath('spam/sub1/sub1sub1/file4'), -# fixpath('spam/sub3/file5'), -# fixpath('eggs/ham/file6'), -# ]) -# self.assertEqual(self.calls, [ -# ('_walk', ('spam',)), -# ('_walk', (fixpath('eggs/ham'),)), -# ]) -# -# def test_filter_suffixes(self): -# self._return_walk = [ -# [('spam', (), ('file1', 'file2.c', 'file3.h', 'file4.o')), -# ], -# ] -# dirnames = [ -# 'spam', -# ] -# filter_by_name = ('.c', '.h') -# -# files = list(iter_files(dirnames, filter_by_name, -# _walk=self._walk)) -# -# self.assertEqual(files, [ -# fixpath('spam/file2.c'), -# fixpath('spam/file3.h'), -# ]) -# self.assertEqual(self.calls, [ -# ('_walk', ('spam',)), -# ]) -# -# def test_some_filtered(self): -# self._return_walk = [ -# [('spam', (), ('file1', 'file2', 'file3', 'file4')), -# ], -# ] -# dirnames = [ -# 'spam', -# ] -# def filter_by_name(filename, results=[False, True, False, True]): -# self.calls.append(('filter_by_name', (filename,))) -# return results.pop(0) -# -# files = list(iter_files(dirnames, filter_by_name, -# _walk=self._walk)) -# -# self.assertEqual(files, [ -# fixpath('spam/file2'), -# fixpath('spam/file4'), -# ]) -# self.assertEqual(self.calls, [ -# ('_walk', ('spam',)), -# ('filter_by_name', ('file1',)), -# ('filter_by_name', ('file2',)), -# ('filter_by_name', ('file3',)), -# ('filter_by_name', ('file4',)), -# ]) -# -# def test_none_filtered(self): -# self._return_walk = [ -# [('spam', (), ('file1', 'file2', 'file3', 'file4')), -# ], -# ] -# dirnames = [ -# 'spam', -# ] -# def filter_by_name(filename, results=[True, True, True, True]): -# self.calls.append(('filter_by_name', (filename,))) -# return results.pop(0) -# -# files = list(iter_files(dirnames, filter_by_name, -# _walk=self._walk)) -# -# self.assertEqual(files, [ -# fixpath('spam/file1'), -# fixpath('spam/file2'), -# fixpath('spam/file3'), -# fixpath('spam/file4'), -# ]) -# self.assertEqual(self.calls, [ -# ('_walk', ('spam',)), -# ('filter_by_name', ('file1',)), -# ('filter_by_name', ('file2',)), -# ('filter_by_name', ('file3',)), -# ('filter_by_name', ('file4',)), -# ]) -# -# def test_all_filtered(self): -# self._return_walk = [ -# [('spam', (), ('file1', 'file2', 'file3', 'file4')), -# ], -# ] -# dirnames = [ -# 'spam', -# ] -# def filter_by_name(filename, results=[False, False, False, False]): -# self.calls.append(('filter_by_name', (filename,))) -# return results.pop(0) -# -# files = list(iter_files(dirnames, filter_by_name, -# _walk=self._walk)) -# -# self.assertEqual(files, []) -# self.assertEqual(self.calls, [ -# ('_walk', ('spam',)), -# ('filter_by_name', ('file1',)), -# ('filter_by_name', ('file2',)), -# ('filter_by_name', ('file3',)), -# ('filter_by_name', ('file4',)), -# ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/test_info.py b/Lib/test/test_tools/test_c_analyzer/test_common/test_info.py deleted file mode 100644 index 69dbb582c6b684..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_common/test_info.py +++ /dev/null @@ -1,197 +0,0 @@ -import string -import unittest - -from ..util import PseudoStr, StrProxy, Object -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - from c_analyzer.common.info import ( - UNKNOWN, - ID, - ) - - -class IDTests(unittest.TestCase): - - VALID_ARGS = ( - 'x/y/z/spam.c', - 'func', - 'eggs', - ) - VALID_KWARGS = dict(zip(ID._fields, VALID_ARGS)) - VALID_EXPECTED = VALID_ARGS - - def test_from_raw(self): - tests = [ - ('', None), - (None, None), - ('spam', (None, None, 'spam')), - (('spam',), (None, None, 'spam')), - (('x/y/z/spam.c', 'spam'), ('x/y/z/spam.c', None, 'spam')), - (self.VALID_ARGS, self.VALID_EXPECTED), - (self.VALID_KWARGS, self.VALID_EXPECTED), - ] - for raw, expected in tests: - with self.subTest(raw): - id = ID.from_raw(raw) - - self.assertEqual(id, expected) - - def test_minimal(self): - id = ID( - filename=None, - funcname=None, - name='eggs', - ) - - self.assertEqual(id, ( - None, - None, - 'eggs', - )) - - def test_init_typical_global(self): - id = ID( - filename='x/y/z/spam.c', - funcname=None, - name='eggs', - ) - - self.assertEqual(id, ( - 'x/y/z/spam.c', - None, - 'eggs', - )) - - def test_init_typical_local(self): - id = ID( - filename='x/y/z/spam.c', - funcname='func', - name='eggs', - ) - - self.assertEqual(id, ( - 'x/y/z/spam.c', - 'func', - 'eggs', - )) - - def test_init_all_missing(self): - for value in ('', None): - with self.subTest(repr(value)): - id = ID( - filename=value, - funcname=value, - name=value, - ) - - self.assertEqual(id, ( - None, - None, - None, - )) - - def test_init_all_coerced(self): - tests = [ - ('str subclass', - dict( - filename=PseudoStr('x/y/z/spam.c'), - funcname=PseudoStr('func'), - name=PseudoStr('eggs'), - ), - ('x/y/z/spam.c', - 'func', - 'eggs', - )), - ('non-str', - dict( - filename=StrProxy('x/y/z/spam.c'), - funcname=Object(), - name=('a', 'b', 'c'), - ), - ('x/y/z/spam.c', - '', - "('a', 'b', 'c')", - )), - ] - for summary, kwargs, expected in tests: - with self.subTest(summary): - id = ID(**kwargs) - - for field in ID._fields: - value = getattr(id, field) - self.assertIs(type(value), str) - self.assertEqual(tuple(id), expected) - - def test_iterable(self): - id = ID(**self.VALID_KWARGS) - - filename, funcname, name = id - - values = (filename, funcname, name) - for value, expected in zip(values, self.VALID_EXPECTED): - self.assertEqual(value, expected) - - def test_fields(self): - id = ID('a', 'b', 'z') - - self.assertEqual(id.filename, 'a') - self.assertEqual(id.funcname, 'b') - self.assertEqual(id.name, 'z') - - def test_validate_typical(self): - id = ID( - filename='x/y/z/spam.c', - funcname='func', - name='eggs', - ) - - id.validate() # This does not fail. - - def test_validate_missing_field(self): - for field in ID._fields: - with self.subTest(field): - id = ID(**self.VALID_KWARGS) - id = id._replace(**{field: None}) - - if field == 'funcname': - id.validate() # The field can be missing (not set). - id = id._replace(filename=None) - id.validate() # Both fields can be missing (not set). - continue - - with self.assertRaises(TypeError): - id.validate() - - def test_validate_bad_field(self): - badch = tuple(c for c in string.punctuation + string.digits) - notnames = ( - '1a', - 'a.b', - 'a-b', - '&a', - 'a++', - ) + badch - tests = [ - ('filename', ()), # Any non-empty str is okay. - ('funcname', notnames), - ('name', notnames), - ] - seen = set() - for field, invalid in tests: - for value in invalid: - seen.add(value) - with self.subTest(f'{field}={value!r}'): - id = ID(**self.VALID_KWARGS) - id = id._replace(**{field: value}) - - with self.assertRaises(ValueError): - id.validate() - - for field, invalid in tests: - valid = seen - set(invalid) - for value in valid: - with self.subTest(f'{field}={value!r}'): - id = ID(**self.VALID_KWARGS) - id = id._replace(**{field: value}) - - id.validate() # This does not fail. diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/test_show.py b/Lib/test/test_tools/test_c_analyzer/test_common/test_show.py deleted file mode 100644 index 91ca2f3b344dd3..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_common/test_show.py +++ /dev/null @@ -1,54 +0,0 @@ -import unittest - -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - from c_analyzer.variables import info - from c_analyzer.common.show import ( - basic, - ) - - -TYPICAL = [ - info.Variable.from_parts('src1/spam.c', None, 'var1', 'static const char *'), - info.Variable.from_parts('src1/spam.c', 'ham', 'initialized', 'static int'), - info.Variable.from_parts('src1/spam.c', None, 'var2', 'static PyObject *'), - info.Variable.from_parts('src1/eggs.c', 'tofu', 'ready', 'static int'), - info.Variable.from_parts('src1/spam.c', None, 'freelist', 'static (PyTupleObject *)[10]'), - info.Variable.from_parts('src1/sub/ham.c', None, 'var1', 'static const char const *'), - info.Variable.from_parts('src2/jam.c', None, 'var1', 'static int'), - info.Variable.from_parts('src2/jam.c', None, 'var2', 'static MyObject *'), - info.Variable.from_parts('Include/spam.h', None, 'data', 'static const int'), - ] - - -class BasicTests(unittest.TestCase): - - maxDiff = None - - def setUp(self): - self.lines = [] - - def print(self, line): - self.lines.append(line) - - def test_typical(self): - basic(TYPICAL, - _print=self.print) - - self.assertEqual(self.lines, [ - 'src1/spam.c:var1 static const char *', - 'src1/spam.c:ham():initialized static int', - 'src1/spam.c:var2 static PyObject *', - 'src1/eggs.c:tofu():ready static int', - 'src1/spam.c:freelist static (PyTupleObject *)[10]', - 'src1/sub/ham.c:var1 static const char const *', - 'src2/jam.c:var1 static int', - 'src2/jam.c:var2 static MyObject *', - 'Include/spam.h:data static const int', - ]) - - def test_no_rows(self): - basic([], - _print=self.print) - - self.assertEqual(self.lines, []) diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/__init__.py deleted file mode 100644 index bc502ef32d2916..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_cpython/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -import os.path -from test.support import load_package_tests - - -def load_tests(*args): - return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/test___main__.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/test___main__.py deleted file mode 100644 index 6d69ed7525b595..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_cpython/test___main__.py +++ /dev/null @@ -1,296 +0,0 @@ -import sys -import unittest - -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - from c_analyzer.variables import info - from cpython import SOURCE_DIRS - from cpython.supported import IGNORED_FILE - from cpython.known import DATA_FILE as KNOWN_FILE - from cpython.__main__ import ( - cmd_check, cmd_show, parse_args, main, - ) - - -TYPICAL = [ - (info.Variable.from_parts('src1/spam.c', None, 'var1', 'const char *'), - True, - ), - (info.Variable.from_parts('src1/spam.c', 'ham', 'initialized', 'int'), - True, - ), - (info.Variable.from_parts('src1/spam.c', None, 'var2', 'PyObject *'), - False, - ), - (info.Variable.from_parts('src1/eggs.c', 'tofu', 'ready', 'int'), - True, - ), - (info.Variable.from_parts('src1/spam.c', None, 'freelist', '(PyTupleObject *)[10]'), - False, - ), - (info.Variable.from_parts('src1/sub/ham.c', None, 'var1', 'const char const *'), - True, - ), - (info.Variable.from_parts('src2/jam.c', None, 'var1', 'int'), - True, - ), - (info.Variable.from_parts('src2/jam.c', None, 'var2', 'MyObject *'), - False, - ), - (info.Variable.from_parts('Include/spam.h', None, 'data', 'const int'), - True, - ), - ] - - -class CMDBase(unittest.TestCase): - - maxDiff = None - -# _return_known_from_file = None -# _return_ignored_from_file = None - _return_find = () - - @property - def calls(self): - try: - return self._calls - except AttributeError: - self._calls = [] - return self._calls - -# def _known_from_file(self, *args): -# self.calls.append(('_known_from_file', args)) -# return self._return_known_from_file or {} -# -# def _ignored_from_file(self, *args): -# self.calls.append(('_ignored_from_file', args)) -# return self._return_ignored_from_file or {} - - def _find(self, known, ignored, skip_objects=False): - self.calls.append(('_find', (known, ignored, skip_objects))) - return self._return_find - - def _show(self, *args): - self.calls.append(('_show', args)) - - def _print(self, *args): - self.calls.append(('_print', args)) - - -class CheckTests(CMDBase): - - def test_defaults(self): - self._return_find = [] - - cmd_check('check', - _find=self._find, - _show=self._show, - _print=self._print, - ) - - self.assertEqual( - self.calls[0], - ('_find', (KNOWN_FILE, IGNORED_FILE, False)), - ) - - def test_all_supported(self): - self._return_find = [(v, s) for v, s in TYPICAL if s] - dirs = ['src1', 'src2', 'Include'] - - cmd_check('check', - known='known.tsv', - ignored='ignored.tsv', - _find=self._find, - _show=self._show, - _print=self._print, - ) - - self.assertEqual(self.calls, [ - ('_find', ('known.tsv', 'ignored.tsv', False)), - #('_print', ('okay',)), - ]) - - def test_some_unsupported(self): - self._return_find = TYPICAL - - with self.assertRaises(SystemExit) as cm: - cmd_check('check', - known='known.tsv', - ignored='ignored.tsv', - _find=self._find, - _show=self._show, - _print=self._print, - ) - - unsupported = [v for v, s in TYPICAL if not s] - self.assertEqual(self.calls, [ - ('_find', ('known.tsv', 'ignored.tsv', False)), - ('_print', ('ERROR: found unsupported global variables',)), - ('_print', ()), - ('_show', (sorted(unsupported),)), - ('_print', (' (3 total)',)), - ]) - self.assertEqual(cm.exception.code, 1) - - -class ShowTests(CMDBase): - - def test_defaults(self): - self._return_find = [] - - cmd_show('show', - _find=self._find, - _show=self._show, - _print=self._print, - ) - - self.assertEqual( - self.calls[0], - ('_find', (KNOWN_FILE, IGNORED_FILE, False)), - ) - - def test_typical(self): - self._return_find = TYPICAL - - cmd_show('show', - known='known.tsv', - ignored='ignored.tsv', - _find=self._find, - _show=self._show, - _print=self._print, - ) - - supported = [v for v, s in TYPICAL if s] - unsupported = [v for v, s in TYPICAL if not s] - self.assertEqual(self.calls, [ - ('_find', ('known.tsv', 'ignored.tsv', False)), - ('_print', ('supported:',)), - ('_print', ('----------',)), - ('_show', (sorted(supported),)), - ('_print', (' (6 total)',)), - ('_print', ()), - ('_print', ('unsupported:',)), - ('_print', ('------------',)), - ('_show', (sorted(unsupported),)), - ('_print', (' (3 total)',)), - ]) - - -class ParseArgsTests(unittest.TestCase): - - maxDiff = None - - def test_no_args(self): - self.errmsg = None - def fail(msg): - self.errmsg = msg - sys.exit(msg) - - with self.assertRaises(SystemExit): - parse_args('cg', [], _fail=fail) - - self.assertEqual(self.errmsg, 'missing command') - - def test_check_no_args(self): - cmd, cmdkwargs = parse_args('cg', [ - 'check', - ]) - - self.assertEqual(cmd, 'check') - self.assertEqual(cmdkwargs, { - 'ignored': IGNORED_FILE, - 'known': KNOWN_FILE, - #'dirs': SOURCE_DIRS, - }) - - def test_check_full_args(self): - cmd, cmdkwargs = parse_args('cg', [ - 'check', - '--ignored', 'spam.tsv', - '--known', 'eggs.tsv', - #'dir1', - #'dir2', - #'dir3', - ]) - - self.assertEqual(cmd, 'check') - self.assertEqual(cmdkwargs, { - 'ignored': 'spam.tsv', - 'known': 'eggs.tsv', - #'dirs': ['dir1', 'dir2', 'dir3'] - }) - - def test_show_no_args(self): - cmd, cmdkwargs = parse_args('cg', [ - 'show', - ]) - - self.assertEqual(cmd, 'show') - self.assertEqual(cmdkwargs, { - 'ignored': IGNORED_FILE, - 'known': KNOWN_FILE, - #'dirs': SOURCE_DIRS, - 'skip_objects': False, - }) - - def test_show_full_args(self): - cmd, cmdkwargs = parse_args('cg', [ - 'show', - '--ignored', 'spam.tsv', - '--known', 'eggs.tsv', - #'dir1', - #'dir2', - #'dir3', - ]) - - self.assertEqual(cmd, 'show') - self.assertEqual(cmdkwargs, { - 'ignored': 'spam.tsv', - 'known': 'eggs.tsv', - #'dirs': ['dir1', 'dir2', 'dir3'], - 'skip_objects': False, - }) - - -def new_stub_commands(*names): - calls = [] - def cmdfunc(cmd, **kwargs): - calls.append((cmd, kwargs)) - commands = {name: cmdfunc for name in names} - return commands, calls - - -class MainTests(unittest.TestCase): - - def test_no_command(self): - with self.assertRaises(ValueError): - main(None, {}) - - def test_check(self): - commands, calls = new_stub_commands('check', 'show') - - cmdkwargs = { - 'ignored': 'spam.tsv', - 'known': 'eggs.tsv', - 'dirs': ['dir1', 'dir2', 'dir3'], - } - main('check', cmdkwargs, _COMMANDS=commands) - - self.assertEqual(calls, [ - ('check', cmdkwargs), - ]) - - def test_show(self): - commands, calls = new_stub_commands('check', 'show') - - cmdkwargs = { - 'ignored': 'spam.tsv', - 'known': 'eggs.tsv', - 'dirs': ['dir1', 'dir2', 'dir3'], - } - main('show', cmdkwargs, _COMMANDS=commands) - - self.assertEqual(calls, [ - ('show', cmdkwargs), - ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/test_functional.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/test_functional.py deleted file mode 100644 index 927979048448fa..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_cpython/test_functional.py +++ /dev/null @@ -1,34 +0,0 @@ -import unittest - -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - pass - - -class SelfCheckTests(unittest.TestCase): - - @unittest.expectedFailure - def test_known(self): - # Make sure known macros & vartypes aren't hiding unknown local types. - # XXX finish! - raise NotImplementedError - - @unittest.expectedFailure - def test_compare_nm_results(self): - # Make sure the "show" results match the statics found by "nm" command. - # XXX Skip if "nm" is not available. - # XXX finish! - raise NotImplementedError - - -class DummySourceTests(unittest.TestCase): - - @unittest.expectedFailure - def test_check(self): - # XXX finish! - raise NotImplementedError - - @unittest.expectedFailure - def test_show(self): - # XXX finish! - raise NotImplementedError diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/test_supported.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/test_supported.py deleted file mode 100644 index a244b97e1fc7c7..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_cpython/test_supported.py +++ /dev/null @@ -1,98 +0,0 @@ -import re -import textwrap -import unittest - -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - from c_analyzer.common.info import ID - from c_analyzer.variables.info import Variable - from cpython.supported import ( - is_supported, ignored_from_file, - ) - - -class IsSupportedTests(unittest.TestCase): - - @unittest.expectedFailure - def test_supported(self): - statics = [ - Variable('src1/spam.c', None, 'var1', 'const char *'), - Variable('src1/spam.c', None, 'var1', 'int'), - ] - for static in statics: - with self.subTest(static): - result = is_supported(static) - - self.assertTrue(result) - - @unittest.expectedFailure - def test_not_supported(self): - statics = [ - Variable('src1/spam.c', None, 'var1', 'PyObject *'), - Variable('src1/spam.c', None, 'var1', 'PyObject[10]'), - ] - for static in statics: - with self.subTest(static): - result = is_supported(static) - - self.assertFalse(result) - - -class IgnoredFromFileTests(unittest.TestCase): - - maxDiff = None - - _return_read_tsv = () - - @property - def calls(self): - try: - return self._calls - except AttributeError: - self._calls = [] - return self._calls - - def _read_tsv(self, *args): - self.calls.append(('_read_tsv', args)) - return self._return_read_tsv - - def test_typical(self): - lines = textwrap.dedent(''' - filename funcname name kind reason - file1.c - var1 variable ... - file1.c func1 local1 variable | - file1.c - var2 variable ??? - file1.c func2 local2 variable | - file2.c - var1 variable reasons - ''').strip().splitlines() - lines = [re.sub(r'\s{1,8}', '\t', line, 4).replace('|', '') - for line in lines] - self._return_read_tsv = [tuple(v.strip() for v in line.split('\t')) - for line in lines[1:]] - - ignored = ignored_from_file('spam.c', _read_tsv=self._read_tsv) - - self.assertEqual(ignored, { - 'variables': { - ID('file1.c', '', 'var1'): '...', - ID('file1.c', 'func1', 'local1'): '', - ID('file1.c', '', 'var2'): '???', - ID('file1.c', 'func2', 'local2'): '', - ID('file2.c', '', 'var1'): 'reasons', - }, - }) - self.assertEqual(self.calls, [ - ('_read_tsv', ('spam.c', 'filename\tfuncname\tname\tkind\treason')), - ]) - - def test_empty(self): - self._return_read_tsv = [] - - ignored = ignored_from_file('spam.c', _read_tsv=self._read_tsv) - - self.assertEqual(ignored, { - 'variables': {}, - }) - self.assertEqual(self.calls, [ - ('_read_tsv', ('spam.c', 'filename\tfuncname\tname\tkind\treason')), - ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_parser/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_parser/__init__.py deleted file mode 100644 index bc502ef32d2916..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_parser/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -import os.path -from test.support import load_package_tests - - -def load_tests(*args): - return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_parser/test_declarations.py b/Lib/test/test_tools/test_c_analyzer/test_parser/test_declarations.py deleted file mode 100644 index 674fcb1af1c7ad..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_parser/test_declarations.py +++ /dev/null @@ -1,795 +0,0 @@ -import textwrap -import unittest - -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - from c_analyzer.parser.declarations import ( - iter_global_declarations, iter_local_statements, - parse_func, _parse_var, parse_compound, - iter_variables, - ) - - -class TestCaseBase(unittest.TestCase): - - maxDiff = None - - @property - def calls(self): - try: - return self._calls - except AttributeError: - self._calls = [] - return self._calls - - -class IterGlobalDeclarationsTests(TestCaseBase): - - def test_functions(self): - tests = [ - (textwrap.dedent(''' - void func1() { - return; - } - '''), - textwrap.dedent(''' - void func1() { - return; - } - ''').strip(), - ), - (textwrap.dedent(''' - static unsigned int * _func1( - const char *arg1, - int *arg2 - long long arg3 - ) - { - return _do_something(arg1, arg2, arg3); - } - '''), - textwrap.dedent(''' - static unsigned int * _func1( const char *arg1, int *arg2 long long arg3 ) { - return _do_something(arg1, arg2, arg3); - } - ''').strip(), - ), - (textwrap.dedent(''' - static PyObject * - _func1(const char *arg1, PyObject *arg2) - { - static int initialized = 0; - if (!initialized) { - initialized = 1; - _init(arg1); - } - - PyObject *result = _do_something(arg1, arg2); - Py_INCREF(result); - return result; - } - '''), - textwrap.dedent(''' - static PyObject * _func1(const char *arg1, PyObject *arg2) { - static int initialized = 0; - if (!initialized) { - initialized = 1; - _init(arg1); - } - PyObject *result = _do_something(arg1, arg2); - Py_INCREF(result); - return result; - } - ''').strip(), - ), - ] - for lines, expected in tests: - body = textwrap.dedent( - expected.partition('{')[2].rpartition('}')[0] - ).strip() - expected = (expected, body) - with self.subTest(lines): - lines = lines.splitlines() - - stmts = list(iter_global_declarations(lines)) - - self.assertEqual(stmts, [expected]) - - @unittest.expectedFailure - def test_declarations(self): - tests = [ - 'int spam;', - 'long long spam;', - 'static const int const *spam;', - 'int spam;', - 'typedef int myint;', - 'typedef PyObject * (*unaryfunc)(PyObject *);', - # typedef struct - # inline struct - # enum - # inline enum - ] - for text in tests: - expected = (text, - ' '.join(l.strip() for l in text.splitlines())) - with self.subTest(lines): - lines = lines.splitlines() - - stmts = list(iter_global_declarations(lines)) - - self.assertEqual(stmts, [expected]) - - @unittest.expectedFailure - def test_declaration_multiple_vars(self): - lines = ['static const int const *spam, *ham=NULL, eggs = 3;'] - - stmts = list(iter_global_declarations(lines)) - - self.assertEqual(stmts, [ - ('static const int const *spam;', None), - ('static const int *ham=NULL;', None), - ('static const int eggs = 3;', None), - ]) - - def test_mixed(self): - lines = textwrap.dedent(''' - int spam; - static const char const *eggs; - - PyObject * start(void) { - static int initialized = 0; - if (initialized) { - initialized = 1; - init(); - } - return _start(); - } - - char* ham; - - static int stop(char *reason) { - ham = reason; - return _stop(); - } - ''').splitlines() - expected = [ - (textwrap.dedent(''' - PyObject * start(void) { - static int initialized = 0; - if (initialized) { - initialized = 1; - init(); - } - return _start(); - } - ''').strip(), - textwrap.dedent(''' - static int initialized = 0; - if (initialized) { - initialized = 1; - init(); - } - return _start(); - ''').strip(), - ), - (textwrap.dedent(''' - static int stop(char *reason) { - ham = reason; - return _stop(); - } - ''').strip(), - textwrap.dedent(''' - ham = reason; - return _stop(); - ''').strip(), - ), - ] - - stmts = list(iter_global_declarations(lines)) - - self.assertEqual(stmts, expected) - #self.assertEqual([stmt for stmt, _ in stmts], - # [stmt for stmt, _ in expected]) - #self.assertEqual([body for _, body in stmts], - # [body for _, body in expected]) - - def test_no_statements(self): - lines = [] - - stmts = list(iter_global_declarations(lines)) - - self.assertEqual(stmts, []) - - def test_bogus(self): - tests = [ - (textwrap.dedent(''' - int spam; - static const char const *eggs; - - PyObject * start(void) { - static int initialized = 0; - if (initialized) { - initialized = 1; - init(); - } - return _start(); - } - - char* ham; - - static int _stop(void) { - // missing closing bracket - - static int stop(char *reason) { - ham = reason; - return _stop(); - } - '''), - [(textwrap.dedent(''' - PyObject * start(void) { - static int initialized = 0; - if (initialized) { - initialized = 1; - init(); - } - return _start(); - } - ''').strip(), - textwrap.dedent(''' - static int initialized = 0; - if (initialized) { - initialized = 1; - init(); - } - return _start(); - ''').strip(), - ), - # Neither "stop()" nor "_stop()" are here. - ], - ), - ] - for lines, expected in tests: - with self.subTest(lines): - lines = lines.splitlines() - - stmts = list(iter_global_declarations(lines)) - - self.assertEqual(stmts, expected) - #self.assertEqual([stmt for stmt, _ in stmts], - # [stmt for stmt, _ in expected]) - #self.assertEqual([body for _, body in stmts], - # [body for _, body in expected]) - - def test_ignore_comments(self): - tests = [ - ('// msg', None), - ('// int stmt;', None), - (' // ... ', None), - ('// /*', None), - ('/* int stmt; */', None), - (""" - /** - * ... - * int stmt; - */ - """, None), - ] - for lines, expected in tests: - with self.subTest(lines): - lines = lines.splitlines() - - stmts = list(iter_global_declarations(lines)) - - self.assertEqual(stmts, [expected] if expected else []) - - -class IterLocalStatementsTests(TestCaseBase): - - def test_vars(self): - tests = [ - # POTS - 'int spam;', - 'unsigned int spam;', - 'char spam;', - 'float spam;', - - # typedefs - 'uint spam;', - 'MyType spam;', - - # complex - 'struct myspam spam;', - 'union choice spam;', - # inline struct - # inline union - # enum? - ] - # pointers - tests.extend([ - # POTS - 'int * spam;', - 'unsigned int * spam;', - 'char *spam;', - 'char const *spam = "spamspamspam...";', - # typedefs - 'MyType *spam;', - # complex - 'struct myspam *spam;', - 'union choice *spam;', - # packed with details - 'const char const *spam;', - # void pointer - 'void *data = NULL;', - # function pointers - 'int (* func)(char *arg1);', - 'char * (* func)(void);', - ]) - # storage class - tests.extend([ - 'static int spam;', - 'extern int spam;', - 'static unsigned int spam;', - 'static struct myspam spam;', - ]) - # type qualifier - tests.extend([ - 'const int spam;', - 'const unsigned int spam;', - 'const struct myspam spam;', - ]) - # combined - tests.extend([ - 'const char *spam = eggs;', - 'static const char const *spam = "spamspamspam...";', - 'extern const char const *spam;', - 'static void *data = NULL;', - 'static int (const * func)(char *arg1) = func1;', - 'static char * (* func)(void);', - ]) - for line in tests: - expected = line - with self.subTest(line): - stmts = list(iter_local_statements([line])) - - self.assertEqual(stmts, [(expected, None)]) - - @unittest.expectedFailure - def test_vars_multiline_var(self): - lines = textwrap.dedent(''' - PyObject * - spam - = NULL; - ''').splitlines() - expected = 'PyObject * spam = NULL;' - - stmts = list(iter_local_statements(lines)) - - self.assertEqual(stmts, [(expected, None)]) - - @unittest.expectedFailure - def test_declaration_multiple_vars(self): - lines = ['static const int const *spam, *ham=NULL, ham2[]={1, 2, 3}, ham3[2]={1, 2}, eggs = 3;'] - - stmts = list(iter_global_declarations(lines)) - - self.assertEqual(stmts, [ - ('static const int const *spam;', None), - ('static const int *ham=NULL;', None), - ('static const int ham[]={1, 2, 3};', None), - ('static const int ham[2]={1, 2};', None), - ('static const int eggs = 3;', None), - ]) - - @unittest.expectedFailure - def test_other_simple(self): - raise NotImplementedError - - @unittest.expectedFailure - def test_compound(self): - raise NotImplementedError - - @unittest.expectedFailure - def test_mixed(self): - raise NotImplementedError - - def test_no_statements(self): - lines = [] - - stmts = list(iter_local_statements(lines)) - - self.assertEqual(stmts, []) - - @unittest.expectedFailure - def test_bogus(self): - raise NotImplementedError - - def test_ignore_comments(self): - tests = [ - ('// msg', None), - ('// int stmt;', None), - (' // ... ', None), - ('// /*', None), - ('/* int stmt; */', None), - (""" - /** - * ... - * int stmt; - */ - """, None), - # mixed with statements - ('int stmt; // ...', ('int stmt;', None)), - ( 'int stmt; /* ... */', ('int stmt;', None)), - ( '/* ... */ int stmt;', ('int stmt;', None)), - ] - for lines, expected in tests: - with self.subTest(lines): - lines = lines.splitlines() - - stmts = list(iter_local_statements(lines)) - - self.assertEqual(stmts, [expected] if expected else []) - - -class ParseFuncTests(TestCaseBase): - - def test_typical(self): - tests = [ - ('PyObject *\nspam(char *a)\n{\nreturn _spam(a);\n}', - 'return _spam(a);', - ('spam', 'PyObject * spam(char *a)'), - ), - ] - for stmt, body, expected in tests: - with self.subTest(stmt): - name, signature = parse_func(stmt, body) - - self.assertEqual((name, signature), expected) - - -class ParseVarTests(TestCaseBase): - - def test_typical(self): - tests = [ - # POTS - ('int spam;', ('spam', 'int')), - ('unsigned int spam;', ('spam', 'unsigned int')), - ('char spam;', ('spam', 'char')), - ('float spam;', ('spam', 'float')), - - # typedefs - ('uint spam;', ('spam', 'uint')), - ('MyType spam;', ('spam', 'MyType')), - - # complex - ('struct myspam spam;', ('spam', 'struct myspam')), - ('union choice spam;', ('spam', 'union choice')), - # inline struct - # inline union - # enum? - ] - # pointers - tests.extend([ - # POTS - ('int * spam;', ('spam', 'int *')), - ('unsigned int * spam;', ('spam', 'unsigned int *')), - ('char *spam;', ('spam', 'char *')), - ('char const *spam = "spamspamspam...";', ('spam', 'char const *')), - # typedefs - ('MyType *spam;', ('spam', 'MyType *')), - # complex - ('struct myspam *spam;', ('spam', 'struct myspam *')), - ('union choice *spam;', ('spam', 'union choice *')), - # packed with details - ('const char const *spam;', ('spam', 'const char const *')), - # void pointer - ('void *data = NULL;', ('data', 'void *')), - # function pointers - ('int (* func)(char *);', ('func', 'int (*)(char *)')), - ('char * (* func)(void);', ('func', 'char * (*)(void)')), - ]) - # storage class - tests.extend([ - ('static int spam;', ('spam', 'static int')), - ('extern int spam;', ('spam', 'extern int')), - ('static unsigned int spam;', ('spam', 'static unsigned int')), - ('static struct myspam spam;', ('spam', 'static struct myspam')), - ]) - # type qualifier - tests.extend([ - ('const int spam;', ('spam', 'const int')), - ('const unsigned int spam;', ('spam', 'const unsigned int')), - ('const struct myspam spam;', ('spam', 'const struct myspam')), - ]) - # combined - tests.extend([ - ('const char *spam = eggs;', ('spam', 'const char *')), - ('static const char const *spam = "spamspamspam...";', - ('spam', 'static const char const *')), - ('extern const char const *spam;', - ('spam', 'extern const char const *')), - ('static void *data = NULL;', ('data', 'static void *')), - ('static int (const * func)(char *) = func1;', - ('func', 'static int (const *)(char *)')), - ('static char * (* func)(void);', - ('func', 'static char * (*)(void)')), - ]) - for stmt, expected in tests: - with self.subTest(stmt): - name, vartype = _parse_var(stmt) - - self.assertEqual((name, vartype), expected) - - -@unittest.skip('not finished') -class ParseCompoundTests(TestCaseBase): - - def test_typical(self): - headers, bodies = parse_compound(stmt, blocks) - ... - - -class IterVariablesTests(TestCaseBase): - - _return_iter_source_lines = None - _return_iter_global = None - _return_iter_local = None - _return_parse_func = None - _return_parse_var = None - _return_parse_compound = None - - def _iter_source_lines(self, filename): - self.calls.append( - ('_iter_source_lines', (filename,))) - return self._return_iter_source_lines.splitlines() - - def _iter_global(self, lines): - self.calls.append( - ('_iter_global', (lines,))) - try: - return self._return_iter_global.pop(0) - except IndexError: - return ('???', None) - - def _iter_local(self, lines): - self.calls.append( - ('_iter_local', (lines,))) - try: - return self._return_iter_local.pop(0) - except IndexError: - return ('???', None) - - def _parse_func(self, stmt, body): - self.calls.append( - ('_parse_func', (stmt, body))) - try: - return self._return_parse_func.pop(0) - except IndexError: - return ('???', '???') - - def _parse_var(self, lines): - self.calls.append( - ('_parse_var', (lines,))) - try: - return self._return_parse_var.pop(0) - except IndexError: - return ('???', '???') - - def _parse_compound(self, stmt, blocks): - self.calls.append( - ('_parse_compound', (stmt, blocks))) - try: - return self._return_parse_compound.pop(0) - except IndexError: - return (['???'], ['???']) - - def test_empty_file(self): - self._return_iter_source_lines = '' - self._return_iter_global = [ - [], - ] - self._return_parse_func = None - self._return_parse_var = None - self._return_parse_compound = None - - srcvars = list(iter_variables('spam.c', - _iter_source_lines=self._iter_source_lines, - _iter_global=self._iter_global, - _iter_local=self._iter_local, - _parse_func=self._parse_func, - _parse_var=self._parse_var, - _parse_compound=self._parse_compound, - )) - - self.assertEqual(srcvars, []) - self.assertEqual(self.calls, [ - ('_iter_source_lines', ('spam.c',)), - ('_iter_global', ([],)), - ]) - - def test_no_statements(self): - content = textwrap.dedent(''' - ... - ''') - self._return_iter_source_lines = content - self._return_iter_global = [ - [], - ] - self._return_parse_func = None - self._return_parse_var = None - self._return_parse_compound = None - - srcvars = list(iter_variables('spam.c', - _iter_source_lines=self._iter_source_lines, - _iter_global=self._iter_global, - _iter_local=self._iter_local, - _parse_func=self._parse_func, - _parse_var=self._parse_var, - _parse_compound=self._parse_compound, - )) - - self.assertEqual(srcvars, []) - self.assertEqual(self.calls, [ - ('_iter_source_lines', ('spam.c',)), - ('_iter_global', (content.splitlines(),)), - ]) - - def test_typical(self): - content = textwrap.dedent(''' - ... - ''') - self._return_iter_source_lines = content - self._return_iter_global = [ - [('', None), # var1 - ('', None), # non-var - ('', None), # var2 - ('', ''), # func1 - ('', None), # var4 - ], - ] - self._return_iter_local = [ - # func1 - [('', None), # var3 - ('', [('
    ', '')]), # if - ('', None), # non-var - ], - # if - [('', None), # var2 ("collision" with global var) - ], - ] - self._return_parse_func = [ - ('func1', ''), - ] - self._return_parse_var = [ - ('var1', ''), - (None, None), - ('var2', ''), - ('var3', ''), - ('var2', ''), - ('var4', ''), - (None, None), - (None, None), - (None, None), - ('var5', ''), - ] - self._return_parse_compound = [ - ([[ - 'if (', - '', - ')', - ], - ], - ['']), - ] - - srcvars = list(iter_variables('spam.c', - _iter_source_lines=self._iter_source_lines, - _iter_global=self._iter_global, - _iter_local=self._iter_local, - _parse_func=self._parse_func, - _parse_var=self._parse_var, - _parse_compound=self._parse_compound, - )) - - self.assertEqual(srcvars, [ - (None, 'var1', ''), - (None, 'var2', ''), - ('func1', 'var3', ''), - ('func1', 'var2', ''), - ('func1', 'var4', ''), - (None, 'var5', ''), - ]) - self.assertEqual(self.calls, [ - ('_iter_source_lines', ('spam.c',)), - ('_iter_global', (content.splitlines(),)), - ('_parse_var', ('',)), - ('_parse_var', ('',)), - ('_parse_var', ('',)), - ('_parse_func', ('', '')), - ('_iter_local', ([''],)), - ('_parse_var', ('',)), - ('_parse_compound', ('', [('
    ', '')])), - ('_parse_var', ('if (',)), - ('_parse_var', ('',)), - ('_parse_var', (')',)), - ('_parse_var', ('',)), - ('_iter_local', ([''],)), - ('_parse_var', ('',)), - ('_parse_var', ('',)), - ]) - - def test_no_locals(self): - content = textwrap.dedent(''' - ... - ''') - self._return_iter_source_lines = content - self._return_iter_global = [ - [('', None), # var1 - ('', None), # non-var - ('', None), # var2 - ('', ''), # func1 - ], - ] - self._return_iter_local = [ - # func1 - [('', None), # non-var - ('', [('
    ', '')]), # if - ('', None), # non-var - ], - # if - [('', None), # non-var - ], - ] - self._return_parse_func = [ - ('func1', ''), - ] - self._return_parse_var = [ - ('var1', ''), - (None, None), - ('var2', ''), - (None, None), - (None, None), - (None, None), - (None, None), - (None, None), - (None, None), - ] - self._return_parse_compound = [ - ([[ - 'if (', - '', - ')', - ], - ], - ['']), - ] - - srcvars = list(iter_variables('spam.c', - _iter_source_lines=self._iter_source_lines, - _iter_global=self._iter_global, - _iter_local=self._iter_local, - _parse_func=self._parse_func, - _parse_var=self._parse_var, - _parse_compound=self._parse_compound, - )) - - self.assertEqual(srcvars, [ - (None, 'var1', ''), - (None, 'var2', ''), - ]) - self.assertEqual(self.calls, [ - ('_iter_source_lines', ('spam.c',)), - ('_iter_global', (content.splitlines(),)), - ('_parse_var', ('',)), - ('_parse_var', ('',)), - ('_parse_var', ('',)), - ('_parse_func', ('', '')), - ('_iter_local', ([''],)), - ('_parse_var', ('',)), - ('_parse_compound', ('', [('
    ', '')])), - ('_parse_var', ('if (',)), - ('_parse_var', ('',)), - ('_parse_var', (')',)), - ('_parse_var', ('',)), - ('_iter_local', ([''],)), - ('_parse_var', ('',)), - ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_parser/test_preprocessor.py b/Lib/test/test_tools/test_c_analyzer/test_parser/test_preprocessor.py deleted file mode 100644 index b7f950f8139763..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_parser/test_preprocessor.py +++ /dev/null @@ -1,1561 +0,0 @@ -import textwrap -import unittest -import sys - -from ..util import wrapped_arg_combos, StrProxy -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - from c_analyzer.parser.preprocessor import ( - iter_lines, - # directives - parse_directive, PreprocessorDirective, - Constant, Macro, IfDirective, Include, OtherDirective, - ) - - -class TestCaseBase(unittest.TestCase): - - maxDiff = None - - def reset(self): - self._calls = [] - self.errors = None - - @property - def calls(self): - try: - return self._calls - except AttributeError: - self._calls = [] - return self._calls - - errors = None - - def try_next_exc(self): - if not self.errors: - return - if exc := self.errors.pop(0): - raise exc - - def check_calls(self, *expected): - self.assertEqual(self.calls, list(expected)) - self.assertEqual(self.errors or [], []) - - -class IterLinesTests(TestCaseBase): - - parsed = None - - def check_calls(self, *expected): - super().check_calls(*expected) - self.assertEqual(self.parsed or [], []) - - def _parse_directive(self, line): - self.calls.append( - ('_parse_directive', line)) - self.try_next_exc() - return self.parsed.pop(0) - - def test_no_lines(self): - lines = [] - - results = list( - iter_lines(lines, _parse_directive=self._parse_directive)) - - self.assertEqual(results, []) - self.check_calls() - - def test_no_directives(self): - lines = textwrap.dedent(''' - - // xyz - typedef enum { - SPAM - EGGS - } kind; - - struct info { - kind kind; - int status; - }; - - typedef struct spam { - struct info info; - } myspam; - - static int spam = 0; - - /** - * ... - */ - static char * - get_name(int arg, - char *default, - ) - { - return default - } - - int check(void) { - return 0; - } - - ''')[1:-1].splitlines() - expected = [(lno, line, None, ()) - for lno, line in enumerate(lines, 1)] - expected[1] = (2, ' ', None, ()) - expected[20] = (21, ' ', None, ()) - del expected[19] - del expected[18] - - results = list( - iter_lines(lines, _parse_directive=self._parse_directive)) - - self.assertEqual(results, expected) - self.check_calls() - - def test_single_directives(self): - tests = [ - ('#include ', Include('')), - ('#define SPAM 1', Constant('SPAM', '1')), - ('#define SPAM() 1', Macro('SPAM', (), '1')), - ('#define SPAM(a, b) a = b;', Macro('SPAM', ('a', 'b'), 'a = b;')), - ('#if defined(SPAM)', IfDirective('if', 'defined(SPAM)')), - ('#ifdef SPAM', IfDirective('ifdef', 'SPAM')), - ('#ifndef SPAM', IfDirective('ifndef', 'SPAM')), - ('#elseif defined(SPAM)', IfDirective('elseif', 'defined(SPAM)')), - ('#else', OtherDirective('else', None)), - ('#endif', OtherDirective('endif', None)), - ('#error ...', OtherDirective('error', '...')), - ('#warning ...', OtherDirective('warning', '...')), - ('#__FILE__ ...', OtherDirective('__FILE__', '...')), - ('#__LINE__ ...', OtherDirective('__LINE__', '...')), - ('#__DATE__ ...', OtherDirective('__DATE__', '...')), - ('#__TIME__ ...', OtherDirective('__TIME__', '...')), - ('#__TIMESTAMP__ ...', OtherDirective('__TIMESTAMP__', '...')), - ] - for line, directive in tests: - with self.subTest(line): - self.reset() - self.parsed = [ - directive, - ] - text = textwrap.dedent(''' - static int spam = 0; - {} - static char buffer[256]; - ''').strip().format(line) - lines = text.strip().splitlines() - - results = list( - iter_lines(lines, _parse_directive=self._parse_directive)) - - self.assertEqual(results, [ - (1, 'static int spam = 0;', None, ()), - (2, line, directive, ()), - ((3, 'static char buffer[256];', None, ('defined(SPAM)',)) - if directive.kind in ('if', 'ifdef', 'elseif') - else (3, 'static char buffer[256];', None, ('! defined(SPAM)',)) - if directive.kind == 'ifndef' - else (3, 'static char buffer[256];', None, ())), - ]) - self.check_calls( - ('_parse_directive', line), - ) - - def test_directive_whitespace(self): - line = ' # define eggs ( a , b ) { a = b ; } ' - directive = Macro('eggs', ('a', 'b'), '{ a = b; }') - self.parsed = [ - directive, - ] - lines = [line] - - results = list( - iter_lines(lines, _parse_directive=self._parse_directive)) - - self.assertEqual(results, [ - (1, line, directive, ()), - ]) - self.check_calls( - ('_parse_directive', '#define eggs ( a , b ) { a = b ; }'), - ) - - @unittest.skipIf(sys.platform == 'win32', 'needs fix under Windows') - def test_split_lines(self): - directive = Macro('eggs', ('a', 'b'), '{ a = b; }') - self.parsed = [ - directive, - ] - text = textwrap.dedent(r''' - static int spam = 0; - #define eggs(a, b) \ - { \ - a = b; \ - } - static char buffer[256]; - ''').strip() - lines = [line + '\n' for line in text.splitlines()] - lines[-1] = lines[-1][:-1] - - results = list( - iter_lines(lines, _parse_directive=self._parse_directive)) - - self.assertEqual(results, [ - (1, 'static int spam = 0;\n', None, ()), - (5, '#define eggs(a, b) { a = b; }\n', directive, ()), - (6, 'static char buffer[256];', None, ()), - ]) - self.check_calls( - ('_parse_directive', '#define eggs(a, b) { a = b; }'), - ) - - def test_nested_conditions(self): - directives = [ - IfDirective('ifdef', 'SPAM'), - IfDirective('if', 'SPAM == 1'), - IfDirective('elseif', 'SPAM == 2'), - OtherDirective('else', None), - OtherDirective('endif', None), - OtherDirective('endif', None), - ] - self.parsed = list(directives) - text = textwrap.dedent(r''' - static int spam = 0; - - #ifdef SPAM - static int start = 0; - # if SPAM == 1 - static char buffer[10]; - # elif SPAM == 2 - static char buffer[100]; - # else - static char buffer[256]; - # endif - static int end = 0; - #endif - - static int eggs = 0; - ''').strip() - lines = [line for line in text.splitlines() if line.strip()] - - results = list( - iter_lines(lines, _parse_directive=self._parse_directive)) - - self.assertEqual(results, [ - (1, 'static int spam = 0;', None, ()), - (2, '#ifdef SPAM', directives[0], ()), - (3, 'static int start = 0;', None, ('defined(SPAM)',)), - (4, '# if SPAM == 1', directives[1], ('defined(SPAM)',)), - (5, 'static char buffer[10];', None, ('defined(SPAM)', 'SPAM == 1')), - (6, '# elif SPAM == 2', directives[2], ('defined(SPAM)', 'SPAM == 1')), - (7, 'static char buffer[100];', None, ('defined(SPAM)', '! (SPAM == 1)', 'SPAM == 2')), - (8, '# else', directives[3], ('defined(SPAM)', '! (SPAM == 1)', 'SPAM == 2')), - (9, 'static char buffer[256];', None, ('defined(SPAM)', '! (SPAM == 1)', '! (SPAM == 2)')), - (10, '# endif', directives[4], ('defined(SPAM)', '! (SPAM == 1)', '! (SPAM == 2)')), - (11, 'static int end = 0;', None, ('defined(SPAM)',)), - (12, '#endif', directives[5], ('defined(SPAM)',)), - (13, 'static int eggs = 0;', None, ()), - ]) - self.check_calls( - ('_parse_directive', '#ifdef SPAM'), - ('_parse_directive', '#if SPAM == 1'), - ('_parse_directive', '#elif SPAM == 2'), - ('_parse_directive', '#else'), - ('_parse_directive', '#endif'), - ('_parse_directive', '#endif'), - ) - - def test_split_blocks(self): - directives = [ - IfDirective('ifdef', 'SPAM'), - OtherDirective('else', None), - OtherDirective('endif', None), - ] - self.parsed = list(directives) - text = textwrap.dedent(r''' - void str_copy(char *buffer, *orig); - - int init(char *name) { - static int initialized = 0; - if (initialized) { - return 0; - } - #ifdef SPAM - static char buffer[10]; - str_copy(buffer, char); - } - - void copy(char *buffer, *orig) { - strncpy(buffer, orig, 9); - buffer[9] = 0; - } - - #else - static char buffer[256]; - str_copy(buffer, char); - } - - void copy(char *buffer, *orig) { - strcpy(buffer, orig); - } - - #endif - ''').strip() - lines = [line for line in text.splitlines() if line.strip()] - - results = list( - iter_lines(lines, _parse_directive=self._parse_directive)) - - self.assertEqual(results, [ - (1, 'void str_copy(char *buffer, *orig);', None, ()), - (2, 'int init(char *name) {', None, ()), - (3, ' static int initialized = 0;', None, ()), - (4, ' if (initialized) {', None, ()), - (5, ' return 0;', None, ()), - (6, ' }', None, ()), - - (7, '#ifdef SPAM', directives[0], ()), - - (8, ' static char buffer[10];', None, ('defined(SPAM)',)), - (9, ' str_copy(buffer, char);', None, ('defined(SPAM)',)), - (10, '}', None, ('defined(SPAM)',)), - (11, 'void copy(char *buffer, *orig) {', None, ('defined(SPAM)',)), - (12, ' strncpy(buffer, orig, 9);', None, ('defined(SPAM)',)), - (13, ' buffer[9] = 0;', None, ('defined(SPAM)',)), - (14, '}', None, ('defined(SPAM)',)), - - (15, '#else', directives[1], ('defined(SPAM)',)), - - (16, ' static char buffer[256];', None, ('! (defined(SPAM))',)), - (17, ' str_copy(buffer, char);', None, ('! (defined(SPAM))',)), - (18, '}', None, ('! (defined(SPAM))',)), - (19, 'void copy(char *buffer, *orig) {', None, ('! (defined(SPAM))',)), - (20, ' strcpy(buffer, orig);', None, ('! (defined(SPAM))',)), - (21, '}', None, ('! (defined(SPAM))',)), - - (22, '#endif', directives[2], ('! (defined(SPAM))',)), - ]) - self.check_calls( - ('_parse_directive', '#ifdef SPAM'), - ('_parse_directive', '#else'), - ('_parse_directive', '#endif'), - ) - - @unittest.skipIf(sys.platform == 'win32', 'needs fix under Windows') - def test_basic(self): - directives = [ - Include(''), - IfDirective('ifdef', 'SPAM'), - IfDirective('if', '! defined(HAM) || !HAM'), - Constant('HAM', '0'), - IfDirective('elseif', 'HAM < 0'), - Constant('HAM', '-1'), - OtherDirective('else', None), - OtherDirective('endif', None), - OtherDirective('endif', None), - IfDirective('if', 'defined(HAM) && (HAM < 0 || ! HAM)'), - OtherDirective('undef', 'HAM'), - OtherDirective('endif', None), - IfDirective('ifndef', 'HAM'), - OtherDirective('endif', None), - ] - self.parsed = list(directives) - text = textwrap.dedent(r''' - #include - print("begin"); - #ifdef SPAM - print("spam"); - #if ! defined(HAM) || !HAM - # DEFINE HAM 0 - #elseif HAM < 0 - # DEFINE HAM -1 - #else - print("ham HAM"); - #endif - #endif - - #if defined(HAM) && \ - (HAM < 0 || ! HAM) - print("ham?"); - #undef HAM - # endif - - #ifndef HAM - print("no ham"); - #endif - print("end"); - ''')[1:-1] - lines = [line + '\n' for line in text.splitlines()] - lines[-1] = lines[-1][:-1] - - results = list( - iter_lines(lines, _parse_directive=self._parse_directive)) - - self.assertEqual(results, [ - (1, '#include \n', Include(''), ()), - (2, 'print("begin");\n', None, ()), - # - (3, '#ifdef SPAM\n', - IfDirective('ifdef', 'SPAM'), - ()), - (4, ' print("spam");\n', - None, - ('defined(SPAM)',)), - (5, ' #if ! defined(HAM) || !HAM\n', - IfDirective('if', '! defined(HAM) || !HAM'), - ('defined(SPAM)',)), - (6, '# DEFINE HAM 0\n', - Constant('HAM', '0'), - ('defined(SPAM)', '! defined(HAM) || !HAM')), - (7, ' #elseif HAM < 0\n', - IfDirective('elseif', 'HAM < 0'), - ('defined(SPAM)', '! defined(HAM) || !HAM')), - (8, '# DEFINE HAM -1\n', - Constant('HAM', '-1'), - ('defined(SPAM)', '! (! defined(HAM) || !HAM)', 'HAM < 0')), - (9, ' #else\n', - OtherDirective('else', None), - ('defined(SPAM)', '! (! defined(HAM) || !HAM)', 'HAM < 0')), - (10, ' print("ham HAM");\n', - None, - ('defined(SPAM)', '! (! defined(HAM) || !HAM)', '! (HAM < 0)')), - (11, ' #endif\n', - OtherDirective('endif', None), - ('defined(SPAM)', '! (! defined(HAM) || !HAM)', '! (HAM < 0)')), - (12, '#endif\n', - OtherDirective('endif', None), - ('defined(SPAM)',)), - # - (13, '\n', None, ()), - # - (15, '#if defined(HAM) && (HAM < 0 || ! HAM)\n', - IfDirective('if', 'defined(HAM) && (HAM < 0 || ! HAM)'), - ()), - (16, ' print("ham?");\n', - None, - ('defined(HAM) && (HAM < 0 || ! HAM)',)), - (17, ' #undef HAM\n', - OtherDirective('undef', 'HAM'), - ('defined(HAM) && (HAM < 0 || ! HAM)',)), - (18, '# endif\n', - OtherDirective('endif', None), - ('defined(HAM) && (HAM < 0 || ! HAM)',)), - # - (19, '\n', None, ()), - # - (20, '#ifndef HAM\n', - IfDirective('ifndef', 'HAM'), - ()), - (21, ' print("no ham");\n', - None, - ('! defined(HAM)',)), - (22, '#endif\n', - OtherDirective('endif', None), - ('! defined(HAM)',)), - # - (23, 'print("end");', None, ()), - ]) - - @unittest.skipIf(sys.platform == 'win32', 'needs fix under Windows') - def test_typical(self): - # We use Include/compile.h from commit 66c4f3f38b86. It has - # a good enough mix of code without being too large. - directives = [ - IfDirective('ifndef', 'Py_COMPILE_H'), - Constant('Py_COMPILE_H', None), - - IfDirective('ifndef', 'Py_LIMITED_API'), - - Include('"code.h"'), - - IfDirective('ifdef', '__cplusplus'), - OtherDirective('endif', None), - - Constant('PyCF_MASK', '(CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)'), - Constant('PyCF_MASK_OBSOLETE', '(CO_NESTED)'), - Constant('PyCF_SOURCE_IS_UTF8', ' 0x0100'), - Constant('PyCF_DONT_IMPLY_DEDENT', '0x0200'), - Constant('PyCF_ONLY_AST', '0x0400'), - Constant('PyCF_IGNORE_COOKIE', '0x0800'), - Constant('PyCF_TYPE_COMMENTS', '0x1000'), - Constant('PyCF_ALLOW_TOP_LEVEL_AWAIT', '0x2000'), - - IfDirective('ifndef', 'Py_LIMITED_API'), - OtherDirective('endif', None), - - Constant('FUTURE_NESTED_SCOPES', '"nested_scopes"'), - Constant('FUTURE_GENERATORS', '"generators"'), - Constant('FUTURE_DIVISION', '"division"'), - Constant('FUTURE_ABSOLUTE_IMPORT', '"absolute_import"'), - Constant('FUTURE_WITH_STATEMENT', '"with_statement"'), - Constant('FUTURE_PRINT_FUNCTION', '"print_function"'), - Constant('FUTURE_UNICODE_LITERALS', '"unicode_literals"'), - Constant('FUTURE_BARRY_AS_BDFL', '"barry_as_FLUFL"'), - Constant('FUTURE_GENERATOR_STOP', '"generator_stop"'), - Constant('FUTURE_ANNOTATIONS', '"annotations"'), - - Macro('PyAST_Compile', ('mod', 's', 'f', 'ar'), 'PyAST_CompileEx(mod, s, f, -1, ar)'), - - Constant('PY_INVALID_STACK_EFFECT', 'INT_MAX'), - - IfDirective('ifdef', '__cplusplus'), - OtherDirective('endif', None), - - OtherDirective('endif', None), # ifndef Py_LIMITED_API - - Constant('Py_single_input', '256'), - Constant('Py_file_input', '257'), - Constant('Py_eval_input', '258'), - Constant('Py_func_type_input', '345'), - - OtherDirective('endif', None), # ifndef Py_COMPILE_H - ] - self.parsed = list(directives) - text = textwrap.dedent(r''' - #ifndef Py_COMPILE_H - #define Py_COMPILE_H - - #ifndef Py_LIMITED_API - #include "code.h" - - #ifdef __cplusplus - extern "C" { - #endif - - /* Public interface */ - struct _node; /* Declare the existence of this type */ - PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); - /* XXX (ncoghlan): Unprefixed type name in a public API! */ - - #define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ - CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ - CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | \ - CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS) - #define PyCF_MASK_OBSOLETE (CO_NESTED) - #define PyCF_SOURCE_IS_UTF8 0x0100 - #define PyCF_DONT_IMPLY_DEDENT 0x0200 - #define PyCF_ONLY_AST 0x0400 - #define PyCF_IGNORE_COOKIE 0x0800 - #define PyCF_TYPE_COMMENTS 0x1000 - #define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000 - - #ifndef Py_LIMITED_API - typedef struct { - int cf_flags; /* bitmask of CO_xxx flags relevant to future */ - int cf_feature_version; /* minor Python version (PyCF_ONLY_AST) */ - } PyCompilerFlags; - #endif - - /* Future feature support */ - - typedef struct { - int ff_features; /* flags set by future statements */ - int ff_lineno; /* line number of last future statement */ - } PyFutureFeatures; - - #define FUTURE_NESTED_SCOPES "nested_scopes" - #define FUTURE_GENERATORS "generators" - #define FUTURE_DIVISION "division" - #define FUTURE_ABSOLUTE_IMPORT "absolute_import" - #define FUTURE_WITH_STATEMENT "with_statement" - #define FUTURE_PRINT_FUNCTION "print_function" - #define FUTURE_UNICODE_LITERALS "unicode_literals" - #define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL" - #define FUTURE_GENERATOR_STOP "generator_stop" - #define FUTURE_ANNOTATIONS "annotations" - - struct _mod; /* Declare the existence of this type */ - #define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar) - PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx( - struct _mod *mod, - const char *filename, /* decoded from the filesystem encoding */ - PyCompilerFlags *flags, - int optimize, - PyArena *arena); - PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject( - struct _mod *mod, - PyObject *filename, - PyCompilerFlags *flags, - int optimize, - PyArena *arena); - PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST( - struct _mod * mod, - const char *filename /* decoded from the filesystem encoding */ - ); - PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject( - struct _mod * mod, - PyObject *filename - ); - - /* _Py_Mangle is defined in compile.c */ - PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); - - #define PY_INVALID_STACK_EFFECT INT_MAX - PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); - PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump); - - PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize); - - #ifdef __cplusplus - } - #endif - - #endif /* !Py_LIMITED_API */ - - /* These definitions must match corresponding definitions in graminit.h. */ - #define Py_single_input 256 - #define Py_file_input 257 - #define Py_eval_input 258 - #define Py_func_type_input 345 - - #endif /* !Py_COMPILE_H */ - ''').strip() - lines = [line + '\n' for line in text.splitlines()] - lines[-1] = lines[-1][:-1] - - results = list( - iter_lines(lines, _parse_directive=self._parse_directive)) - - self.assertEqual(results, [ - (1, '#ifndef Py_COMPILE_H\n', - IfDirective('ifndef', 'Py_COMPILE_H'), - ()), - (2, '#define Py_COMPILE_H\n', - Constant('Py_COMPILE_H', None), - ('! defined(Py_COMPILE_H)',)), - (3, '\n', - None, - ('! defined(Py_COMPILE_H)',)), - (4, '#ifndef Py_LIMITED_API\n', - IfDirective('ifndef', 'Py_LIMITED_API'), - ('! defined(Py_COMPILE_H)',)), - (5, '#include "code.h"\n', - Include('"code.h"'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (6, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (7, '#ifdef __cplusplus\n', - IfDirective('ifdef', '__cplusplus'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (8, 'extern "C" {\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), - (9, '#endif\n', - OtherDirective('endif', None), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), - (10, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (11, ' \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (12, 'struct _node; \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (13, 'PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *);\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (14, ' \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (15, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (19, '#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)\n', - Constant('PyCF_MASK', '(CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (20, '#define PyCF_MASK_OBSOLETE (CO_NESTED)\n', - Constant('PyCF_MASK_OBSOLETE', '(CO_NESTED)'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (21, '#define PyCF_SOURCE_IS_UTF8 0x0100\n', - Constant('PyCF_SOURCE_IS_UTF8', ' 0x0100'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (22, '#define PyCF_DONT_IMPLY_DEDENT 0x0200\n', - Constant('PyCF_DONT_IMPLY_DEDENT', '0x0200'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (23, '#define PyCF_ONLY_AST 0x0400\n', - Constant('PyCF_ONLY_AST', '0x0400'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (24, '#define PyCF_IGNORE_COOKIE 0x0800\n', - Constant('PyCF_IGNORE_COOKIE', '0x0800'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (25, '#define PyCF_TYPE_COMMENTS 0x1000\n', - Constant('PyCF_TYPE_COMMENTS', '0x1000'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (26, '#define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000\n', - Constant('PyCF_ALLOW_TOP_LEVEL_AWAIT', '0x2000'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (27, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (28, '#ifndef Py_LIMITED_API\n', - IfDirective('ifndef', 'Py_LIMITED_API'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (29, 'typedef struct {\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), - (30, ' int cf_flags; \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), - (31, ' int cf_feature_version; \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), - (32, '} PyCompilerFlags;\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), - (33, '#endif\n', - OtherDirective('endif', None), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), - (34, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (35, ' \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (36, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (37, 'typedef struct {\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (38, ' int ff_features; \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (39, ' int ff_lineno; \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (40, '} PyFutureFeatures;\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (41, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (42, '#define FUTURE_NESTED_SCOPES "nested_scopes"\n', - Constant('FUTURE_NESTED_SCOPES', '"nested_scopes"'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (43, '#define FUTURE_GENERATORS "generators"\n', - Constant('FUTURE_GENERATORS', '"generators"'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (44, '#define FUTURE_DIVISION "division"\n', - Constant('FUTURE_DIVISION', '"division"'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (45, '#define FUTURE_ABSOLUTE_IMPORT "absolute_import"\n', - Constant('FUTURE_ABSOLUTE_IMPORT', '"absolute_import"'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (46, '#define FUTURE_WITH_STATEMENT "with_statement"\n', - Constant('FUTURE_WITH_STATEMENT', '"with_statement"'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (47, '#define FUTURE_PRINT_FUNCTION "print_function"\n', - Constant('FUTURE_PRINT_FUNCTION', '"print_function"'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (48, '#define FUTURE_UNICODE_LITERALS "unicode_literals"\n', - Constant('FUTURE_UNICODE_LITERALS', '"unicode_literals"'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (49, '#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL"\n', - Constant('FUTURE_BARRY_AS_BDFL', '"barry_as_FLUFL"'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (50, '#define FUTURE_GENERATOR_STOP "generator_stop"\n', - Constant('FUTURE_GENERATOR_STOP', '"generator_stop"'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (51, '#define FUTURE_ANNOTATIONS "annotations"\n', - Constant('FUTURE_ANNOTATIONS', '"annotations"'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (52, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (53, 'struct _mod; \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (54, '#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar)\n', - Macro('PyAST_Compile', ('mod', 's', 'f', 'ar'), 'PyAST_CompileEx(mod, s, f, -1, ar)'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (55, 'PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx(\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (56, ' struct _mod *mod,\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (57, ' const char *filename, \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (58, ' PyCompilerFlags *flags,\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (59, ' int optimize,\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (60, ' PyArena *arena);\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (61, 'PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject(\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (62, ' struct _mod *mod,\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (63, ' PyObject *filename,\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (64, ' PyCompilerFlags *flags,\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (65, ' int optimize,\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (66, ' PyArena *arena);\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (67, 'PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (68, ' struct _mod * mod,\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (69, ' const char *filename \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (70, ' );\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (71, 'PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject(\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (72, ' struct _mod * mod,\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (73, ' PyObject *filename\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (74, ' );\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (75, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (76, ' \n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (77, 'PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (78, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (79, '#define PY_INVALID_STACK_EFFECT INT_MAX\n', - Constant('PY_INVALID_STACK_EFFECT', 'INT_MAX'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (80, 'PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg);\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (81, 'PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump);\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (82, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (83, 'PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize);\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (84, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (85, '#ifdef __cplusplus\n', - IfDirective('ifdef', '__cplusplus'), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (86, '}\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), - (87, '#endif\n', - OtherDirective('endif', None), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), - (88, '\n', - None, - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (89, '#endif \n', - OtherDirective('endif', None), - ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), - (90, '\n', - None, - ('! defined(Py_COMPILE_H)',)), - (91, ' \n', - None, - ('! defined(Py_COMPILE_H)',)), - (92, '#define Py_single_input 256\n', - Constant('Py_single_input', '256'), - ('! defined(Py_COMPILE_H)',)), - (93, '#define Py_file_input 257\n', - Constant('Py_file_input', '257'), - ('! defined(Py_COMPILE_H)',)), - (94, '#define Py_eval_input 258\n', - Constant('Py_eval_input', '258'), - ('! defined(Py_COMPILE_H)',)), - (95, '#define Py_func_type_input 345\n', - Constant('Py_func_type_input', '345'), - ('! defined(Py_COMPILE_H)',)), - (96, '\n', - None, - ('! defined(Py_COMPILE_H)',)), - (97, '#endif ', - OtherDirective('endif', None), - ('! defined(Py_COMPILE_H)',)), - ]) - self.check_calls( - ('_parse_directive', '#ifndef Py_COMPILE_H'), - ('_parse_directive', '#define Py_COMPILE_H'), - ('_parse_directive', '#ifndef Py_LIMITED_API'), - ('_parse_directive', '#include "code.h"'), - ('_parse_directive', '#ifdef __cplusplus'), - ('_parse_directive', '#endif'), - ('_parse_directive', '#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)'), - ('_parse_directive', '#define PyCF_MASK_OBSOLETE (CO_NESTED)'), - ('_parse_directive', '#define PyCF_SOURCE_IS_UTF8 0x0100'), - ('_parse_directive', '#define PyCF_DONT_IMPLY_DEDENT 0x0200'), - ('_parse_directive', '#define PyCF_ONLY_AST 0x0400'), - ('_parse_directive', '#define PyCF_IGNORE_COOKIE 0x0800'), - ('_parse_directive', '#define PyCF_TYPE_COMMENTS 0x1000'), - ('_parse_directive', '#define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000'), - ('_parse_directive', '#ifndef Py_LIMITED_API'), - ('_parse_directive', '#endif'), - ('_parse_directive', '#define FUTURE_NESTED_SCOPES "nested_scopes"'), - ('_parse_directive', '#define FUTURE_GENERATORS "generators"'), - ('_parse_directive', '#define FUTURE_DIVISION "division"'), - ('_parse_directive', '#define FUTURE_ABSOLUTE_IMPORT "absolute_import"'), - ('_parse_directive', '#define FUTURE_WITH_STATEMENT "with_statement"'), - ('_parse_directive', '#define FUTURE_PRINT_FUNCTION "print_function"'), - ('_parse_directive', '#define FUTURE_UNICODE_LITERALS "unicode_literals"'), - ('_parse_directive', '#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL"'), - ('_parse_directive', '#define FUTURE_GENERATOR_STOP "generator_stop"'), - ('_parse_directive', '#define FUTURE_ANNOTATIONS "annotations"'), - ('_parse_directive', '#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar)'), - ('_parse_directive', '#define PY_INVALID_STACK_EFFECT INT_MAX'), - ('_parse_directive', '#ifdef __cplusplus'), - ('_parse_directive', '#endif'), - ('_parse_directive', '#endif'), - ('_parse_directive', '#define Py_single_input 256'), - ('_parse_directive', '#define Py_file_input 257'), - ('_parse_directive', '#define Py_eval_input 258'), - ('_parse_directive', '#define Py_func_type_input 345'), - ('_parse_directive', '#endif'), - ) - - -class ParseDirectiveTests(unittest.TestCase): - - def test_directives(self): - tests = [ - # includes - ('#include "internal/pycore_pystate.h"', Include('"internal/pycore_pystate.h"')), - ('#include ', Include('')), - - # defines - ('#define SPAM int', Constant('SPAM', 'int')), - ('#define SPAM', Constant('SPAM', '')), - ('#define SPAM(x, y) run(x, y)', Macro('SPAM', ('x', 'y'), 'run(x, y)')), - ('#undef SPAM', None), - - # conditionals - ('#if SPAM', IfDirective('if', 'SPAM')), - # XXX complex conditionls - ('#ifdef SPAM', IfDirective('ifdef', 'SPAM')), - ('#ifndef SPAM', IfDirective('ifndef', 'SPAM')), - ('#elseif SPAM', IfDirective('elseif', 'SPAM')), - # XXX complex conditionls - ('#else', OtherDirective('else', '')), - ('#endif', OtherDirective('endif', '')), - - # other - ('#error oops!', None), - ('#warning oops!', None), - ('#pragma ...', None), - ('#__FILE__ ...', None), - ('#__LINE__ ...', None), - ('#__DATE__ ...', None), - ('#__TIME__ ...', None), - ('#__TIMESTAMP__ ...', None), - - # extra whitespace - (' # include ', Include('')), - ('#else ', OtherDirective('else', '')), - ('#endif ', OtherDirective('endif', '')), - ('#define SPAM int ', Constant('SPAM', 'int')), - ('#define SPAM ', Constant('SPAM', '')), - ] - for line, expected in tests: - if expected is None: - kind, _, text = line[1:].partition(' ') - expected = OtherDirective(kind, text) - with self.subTest(line): - directive = parse_directive(line) - - self.assertEqual(directive, expected) - - def test_bad_directives(self): - tests = [ - # valid directives with bad text - '#define 123', - '#else spam', - '#endif spam', - ] - for kind in PreprocessorDirective.KINDS: - # missing leading "#" - tests.append(kind) - if kind in ('else', 'endif'): - continue - # valid directives with missing text - tests.append('#' + kind) - tests.append('#' + kind + ' ') - for line in tests: - with self.subTest(line): - with self.assertRaises(ValueError): - parse_directive(line) - - def test_not_directives(self): - tests = [ - '', - ' ', - 'directive', - 'directive?', - '???', - ] - for line in tests: - with self.subTest(line): - with self.assertRaises(ValueError): - parse_directive(line) - - -class ConstantTests(unittest.TestCase): - - def test_type(self): - directive = Constant('SPAM', '123') - - self.assertIs(type(directive), Constant) - self.assertIsInstance(directive, PreprocessorDirective) - - def test_attrs(self): - d = Constant('SPAM', '123') - kind, name, value = d.kind, d.name, d.value - - self.assertEqual(kind, 'define') - self.assertEqual(name, 'SPAM') - self.assertEqual(value, '123') - - def test_text(self): - tests = [ - (('SPAM', '123'), 'SPAM 123'), - (('SPAM',), 'SPAM'), - ] - for args, expected in tests: - with self.subTest(args): - d = Constant(*args) - text = d.text - - self.assertEqual(text, expected) - - def test_iter(self): - kind, name, value = Constant('SPAM', '123') - - self.assertEqual(kind, 'define') - self.assertEqual(name, 'SPAM') - self.assertEqual(value, '123') - - def test_defaults(self): - kind, name, value = Constant('SPAM') - - self.assertEqual(kind, 'define') - self.assertEqual(name, 'SPAM') - self.assertIs(value, None) - - def test_coerce(self): - tests = [] - # coerced name, value - for args in wrapped_arg_combos('SPAM', '123'): - tests.append((args, ('SPAM', '123'))) - # missing name, value - for name in ('', ' ', None, StrProxy(' '), ()): - for value in ('', ' ', None, StrProxy(' '), ()): - tests.append( - ((name, value), (None, None))) - # whitespace - tests.extend([ - ((' SPAM ', ' 123 '), ('SPAM', '123')), - ]) - - for args, expected in tests: - with self.subTest(args): - d = Constant(*args) - - self.assertEqual(d[1:], expected) - for i, exp in enumerate(expected, start=1): - if exp is not None: - self.assertIs(type(d[i]), str) - - def test_valid(self): - tests = [ - ('SPAM', '123'), - # unusual name - ('_SPAM_', '123'), - ('X_1', '123'), - # unusual value - ('SPAM', None), - ] - for args in tests: - with self.subTest(args): - directive = Constant(*args) - - directive.validate() - - def test_invalid(self): - tests = [ - # invalid name - ((None, '123'), TypeError), - (('_', '123'), ValueError), - (('1', '123'), ValueError), - (('_1_', '123'), ValueError), - # There is no invalid value (including None). - ] - for args, exctype in tests: - with self.subTest(args): - directive = Constant(*args) - - with self.assertRaises(exctype): - directive.validate() - - -class MacroTests(unittest.TestCase): - - def test_type(self): - directive = Macro('SPAM', ('x', 'y'), '123') - - self.assertIs(type(directive), Macro) - self.assertIsInstance(directive, PreprocessorDirective) - - def test_attrs(self): - d = Macro('SPAM', ('x', 'y'), '123') - kind, name, args, body = d.kind, d.name, d.args, d.body - - self.assertEqual(kind, 'define') - self.assertEqual(name, 'SPAM') - self.assertEqual(args, ('x', 'y')) - self.assertEqual(body, '123') - - def test_text(self): - tests = [ - (('SPAM', ('x', 'y'), '123'), 'SPAM(x, y) 123'), - (('SPAM', ('x', 'y'),), 'SPAM(x, y)'), - ] - for args, expected in tests: - with self.subTest(args): - d = Macro(*args) - text = d.text - - self.assertEqual(text, expected) - - def test_iter(self): - kind, name, args, body = Macro('SPAM', ('x', 'y'), '123') - - self.assertEqual(kind, 'define') - self.assertEqual(name, 'SPAM') - self.assertEqual(args, ('x', 'y')) - self.assertEqual(body, '123') - - def test_defaults(self): - kind, name, args, body = Macro('SPAM', ('x', 'y')) - - self.assertEqual(kind, 'define') - self.assertEqual(name, 'SPAM') - self.assertEqual(args, ('x', 'y')) - self.assertIs(body, None) - - def test_coerce(self): - tests = [] - # coerce name and body - for args in wrapped_arg_combos('SPAM', ('x', 'y'), '123'): - tests.append( - (args, ('SPAM', ('x', 'y'), '123'))) - # coerce args - tests.extend([ - (('SPAM', 'x', '123'), - ('SPAM', ('x',), '123')), - (('SPAM', 'x,y', '123'), - ('SPAM', ('x', 'y'), '123')), - ]) - # coerce arg names - for argnames in wrapped_arg_combos('x', 'y'): - tests.append( - (('SPAM', argnames, '123'), - ('SPAM', ('x', 'y'), '123'))) - # missing name, body - for name in ('', ' ', None, StrProxy(' '), ()): - for argnames in (None, ()): - for body in ('', ' ', None, StrProxy(' '), ()): - tests.append( - ((name, argnames, body), - (None, (), None))) - # missing args - tests.extend([ - (('SPAM', None, '123'), - ('SPAM', (), '123')), - (('SPAM', (), '123'), - ('SPAM', (), '123')), - ]) - # missing arg names - for arg in ('', ' ', None, StrProxy(' '), ()): - tests.append( - (('SPAM', (arg,), '123'), - ('SPAM', (None,), '123'))) - tests.extend([ - (('SPAM', ('x', '', 'z'), '123'), - ('SPAM', ('x', None, 'z'), '123')), - ]) - # whitespace - tests.extend([ - ((' SPAM ', (' x ', ' y '), ' 123 '), - ('SPAM', ('x', 'y'), '123')), - (('SPAM', 'x, y', '123'), - ('SPAM', ('x', 'y'), '123')), - ]) - - for args, expected in tests: - with self.subTest(args): - d = Macro(*args) - - self.assertEqual(d[1:], expected) - for i, exp in enumerate(expected, start=1): - if i == 2: - self.assertIs(type(d[i]), tuple) - elif exp is not None: - self.assertIs(type(d[i]), str) - - def test_init_bad_args(self): - tests = [ - ('SPAM', StrProxy('x'), '123'), - ('SPAM', object(), '123'), - ] - for args in tests: - with self.subTest(args): - with self.assertRaises(TypeError): - Macro(*args) - - def test_valid(self): - tests = [ - # unusual name - ('SPAM', ('x', 'y'), 'run(x, y)'), - ('_SPAM_', ('x', 'y'), 'run(x, y)'), - ('X_1', ('x', 'y'), 'run(x, y)'), - # unusual args - ('SPAM', (), 'run(x, y)'), - ('SPAM', ('_x_', 'y_1'), 'run(x, y)'), - ('SPAM', 'x', 'run(x, y)'), - ('SPAM', 'x, y', 'run(x, y)'), - # unusual body - ('SPAM', ('x', 'y'), None), - ] - for args in tests: - with self.subTest(args): - directive = Macro(*args) - - directive.validate() - - def test_invalid(self): - tests = [ - # invalid name - ((None, ('x', 'y'), '123'), TypeError), - (('_', ('x', 'y'), '123'), ValueError), - (('1', ('x', 'y'), '123'), ValueError), - (('_1', ('x', 'y'), '123'), ValueError), - # invalid args - (('SPAM', (None, 'y'), '123'), ValueError), - (('SPAM', ('x', '_'), '123'), ValueError), - (('SPAM', ('x', '1'), '123'), ValueError), - (('SPAM', ('x', '_1_'), '123'), ValueError), - # There is no invalid body (including None). - ] - for args, exctype in tests: - with self.subTest(args): - directive = Macro(*args) - - with self.assertRaises(exctype): - directive.validate() - - -class IfDirectiveTests(unittest.TestCase): - - def test_type(self): - directive = IfDirective('if', '1') - - self.assertIs(type(directive), IfDirective) - self.assertIsInstance(directive, PreprocessorDirective) - - def test_attrs(self): - d = IfDirective('if', '1') - kind, condition = d.kind, d.condition - - self.assertEqual(kind, 'if') - self.assertEqual(condition, '1') - #self.assertEqual(condition, (ArithmeticCondition('1'),)) - - def test_text(self): - tests = [ - (('if', 'defined(SPAM) && 1 || (EGGS > 3 && defined(HAM))'), - 'defined(SPAM) && 1 || (EGGS > 3 && defined(HAM))'), - ] - for kind in IfDirective.KINDS: - tests.append( - ((kind, 'SPAM'), 'SPAM')) - for args, expected in tests: - with self.subTest(args): - d = IfDirective(*args) - text = d.text - - self.assertEqual(text, expected) - - def test_iter(self): - kind, condition = IfDirective('if', '1') - - self.assertEqual(kind, 'if') - self.assertEqual(condition, '1') - #self.assertEqual(condition, (ArithmeticCondition('1'),)) - - #def test_complex_conditions(self): - # ... - - def test_coerce(self): - tests = [] - for kind in IfDirective.KINDS: - if kind == 'ifdef': - cond = 'defined(SPAM)' - elif kind == 'ifndef': - cond = '! defined(SPAM)' - else: - cond = 'SPAM' - for args in wrapped_arg_combos(kind, 'SPAM'): - tests.append((args, (kind, cond))) - tests.extend([ - ((' ' + kind + ' ', ' SPAM '), (kind, cond)), - ]) - for raw in ('', ' ', None, StrProxy(' '), ()): - tests.append(((kind, raw), (kind, None))) - for kind in ('', ' ', None, StrProxy(' '), ()): - tests.append(((kind, 'SPAM'), (None, 'SPAM'))) - for args, expected in tests: - with self.subTest(args): - d = IfDirective(*args) - - self.assertEqual(tuple(d), expected) - for i, exp in enumerate(expected): - if exp is not None: - self.assertIs(type(d[i]), str) - - def test_valid(self): - tests = [] - for kind in IfDirective.KINDS: - tests.extend([ - (kind, 'SPAM'), - (kind, '_SPAM_'), - (kind, 'X_1'), - (kind, '()'), - (kind, '--'), - (kind, '???'), - ]) - for args in tests: - with self.subTest(args): - directive = IfDirective(*args) - - directive.validate() - - def test_invalid(self): - tests = [] - # kind - tests.extend([ - ((None, 'SPAM'), TypeError), - (('_', 'SPAM'), ValueError), - (('-', 'SPAM'), ValueError), - (('spam', 'SPAM'), ValueError), - ]) - for kind in PreprocessorDirective.KINDS: - if kind in IfDirective.KINDS: - continue - tests.append( - ((kind, 'SPAM'), ValueError)) - # condition - for kind in IfDirective.KINDS: - tests.extend([ - ((kind, None), TypeError), - # Any other condition is valid. - ]) - for args, exctype in tests: - with self.subTest(args): - directive = IfDirective(*args) - - with self.assertRaises(exctype): - directive.validate() - - -class IncludeTests(unittest.TestCase): - - def test_type(self): - directive = Include('') - - self.assertIs(type(directive), Include) - self.assertIsInstance(directive, PreprocessorDirective) - - def test_attrs(self): - d = Include('') - kind, file, text = d.kind, d.file, d.text - - self.assertEqual(kind, 'include') - self.assertEqual(file, '') - self.assertEqual(text, '') - - def test_iter(self): - kind, file = Include('') - - self.assertEqual(kind, 'include') - self.assertEqual(file, '') - - def test_coerce(self): - tests = [] - for arg, in wrapped_arg_combos(''): - tests.append((arg, '')) - tests.extend([ - (' ', ''), - ]) - for arg in ('', ' ', None, StrProxy(' '), ()): - tests.append((arg, None )) - for arg, expected in tests: - with self.subTest(arg): - _, file = Include(arg) - - self.assertEqual(file, expected) - if expected is not None: - self.assertIs(type(file), str) - - def test_valid(self): - tests = [ - '', - '"spam.h"', - '"internal/pycore_pystate.h"', - ] - for arg in tests: - with self.subTest(arg): - directive = Include(arg) - - directive.validate() - - def test_invalid(self): - tests = [ - (None, TypeError), - # We currently don't check the file. - ] - for arg, exctype in tests: - with self.subTest(arg): - directive = Include(arg) - - with self.assertRaises(exctype): - directive.validate() - - -class OtherDirectiveTests(unittest.TestCase): - - def test_type(self): - directive = OtherDirective('undef', 'SPAM') - - self.assertIs(type(directive), OtherDirective) - self.assertIsInstance(directive, PreprocessorDirective) - - def test_attrs(self): - d = OtherDirective('undef', 'SPAM') - kind, text = d.kind, d.text - - self.assertEqual(kind, 'undef') - self.assertEqual(text, 'SPAM') - - def test_iter(self): - kind, text = OtherDirective('undef', 'SPAM') - - self.assertEqual(kind, 'undef') - self.assertEqual(text, 'SPAM') - - def test_coerce(self): - tests = [] - for kind in OtherDirective.KINDS: - if kind in ('else', 'endif'): - continue - for args in wrapped_arg_combos(kind, '...'): - tests.append((args, (kind, '...'))) - tests.extend([ - ((' ' + kind + ' ', ' ... '), (kind, '...')), - ]) - for raw in ('', ' ', None, StrProxy(' '), ()): - tests.append(((kind, raw), (kind, None))) - for kind in ('else', 'endif'): - for args in wrapped_arg_combos(kind, None): - tests.append((args, (kind, None))) - tests.extend([ - ((' ' + kind + ' ', None), (kind, None)), - ]) - for kind in ('', ' ', None, StrProxy(' '), ()): - tests.append(((kind, '...'), (None, '...'))) - for args, expected in tests: - with self.subTest(args): - d = OtherDirective(*args) - - self.assertEqual(tuple(d), expected) - for i, exp in enumerate(expected): - if exp is not None: - self.assertIs(type(d[i]), str) - - def test_valid(self): - tests = [] - for kind in OtherDirective.KINDS: - if kind in ('else', 'endif'): - continue - tests.extend([ - (kind, '...'), - (kind, '???'), - (kind, 'SPAM'), - (kind, '1 + 1'), - ]) - for kind in ('else', 'endif'): - tests.append((kind, None)) - for args in tests: - with self.subTest(args): - directive = OtherDirective(*args) - - directive.validate() - - def test_invalid(self): - tests = [] - # kind - tests.extend([ - ((None, '...'), TypeError), - (('_', '...'), ValueError), - (('-', '...'), ValueError), - (('spam', '...'), ValueError), - ]) - for kind in PreprocessorDirective.KINDS: - if kind in OtherDirective.KINDS: - continue - tests.append( - ((kind, None), ValueError)) - # text - for kind in OtherDirective.KINDS: - if kind in ('else', 'endif'): - tests.extend([ - # Any text is invalid. - ((kind, 'SPAM'), ValueError), - ((kind, '...'), ValueError), - ]) - else: - tests.extend([ - ((kind, None), TypeError), - # Any other text is valid. - ]) - for args, exctype in tests: - with self.subTest(args): - directive = OtherDirective(*args) - - with self.assertRaises(exctype): - directive.validate() diff --git a/Lib/test/test_tools/test_c_analyzer/test_symbols/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_symbols/__init__.py deleted file mode 100644 index bc502ef32d2916..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_symbols/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -import os.path -from test.support import load_package_tests - - -def load_tests(*args): - return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_symbols/test_info.py b/Lib/test/test_tools/test_c_analyzer/test_symbols/test_info.py deleted file mode 100644 index 1282a89718c820..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_symbols/test_info.py +++ /dev/null @@ -1,192 +0,0 @@ -import string -import unittest - -from ..util import PseudoStr, StrProxy, Object -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - from c_analyzer.common.info import ID - from c_analyzer.symbols.info import Symbol - - -class SymbolTests(unittest.TestCase): - - VALID_ARGS = ( - ID('x/y/z/spam.c', 'func', 'eggs'), - Symbol.KIND.VARIABLE, - False, - ) - VALID_KWARGS = dict(zip(Symbol._fields, VALID_ARGS)) - VALID_EXPECTED = VALID_ARGS - - def test_init_typical_binary_local(self): - id = ID(None, None, 'spam') - symbol = Symbol( - id=id, - kind=Symbol.KIND.VARIABLE, - external=False, - ) - - self.assertEqual(symbol, ( - id, - Symbol.KIND.VARIABLE, - False, - )) - - def test_init_typical_binary_global(self): - id = ID('Python/ceval.c', None, 'spam') - symbol = Symbol( - id=id, - kind=Symbol.KIND.VARIABLE, - external=False, - ) - - self.assertEqual(symbol, ( - id, - Symbol.KIND.VARIABLE, - False, - )) - - def test_init_coercion(self): - tests = [ - ('str subclass', - dict( - id=PseudoStr('eggs'), - kind=PseudoStr('variable'), - external=0, - ), - (ID(None, None, 'eggs'), - Symbol.KIND.VARIABLE, - False, - )), - ('with filename', - dict( - id=('x/y/z/spam.c', 'eggs'), - kind=PseudoStr('variable'), - external=0, - ), - (ID('x/y/z/spam.c', None, 'eggs'), - Symbol.KIND.VARIABLE, - False, - )), - ('non-str 1', - dict( - id=('a', 'b', 'c'), - kind=StrProxy('variable'), - external=0, - ), - (ID('a', 'b', 'c'), - Symbol.KIND.VARIABLE, - False, - )), - ('non-str 2', - dict( - id=('a', 'b', 'c'), - kind=Object(), - external=0, - ), - (ID('a', 'b', 'c'), - '', - False, - )), - ] - for summary, kwargs, expected in tests: - with self.subTest(summary): - symbol = Symbol(**kwargs) - - for field in Symbol._fields: - value = getattr(symbol, field) - if field == 'external': - self.assertIs(type(value), bool) - elif field == 'id': - self.assertIs(type(value), ID) - else: - self.assertIs(type(value), str) - self.assertEqual(tuple(symbol), expected) - - def test_init_all_missing(self): - id = ID(None, None, 'spam') - - symbol = Symbol(id) - - self.assertEqual(symbol, ( - id, - Symbol.KIND.VARIABLE, - None, - )) - - def test_fields(self): - id = ID('z', 'x', 'a') - - symbol = Symbol(id, 'b', False) - - self.assertEqual(symbol.id, id) - self.assertEqual(symbol.kind, 'b') - self.assertIs(symbol.external, False) - - def test___getattr__(self): - id = ID('z', 'x', 'a') - symbol = Symbol(id, 'b', False) - - filename = symbol.filename - funcname = symbol.funcname - name = symbol.name - - self.assertEqual(filename, 'z') - self.assertEqual(funcname, 'x') - self.assertEqual(name, 'a') - - def test_validate_typical(self): - id = ID('z', 'x', 'a') - - symbol = Symbol( - id=id, - kind=Symbol.KIND.VARIABLE, - external=False, - ) - - symbol.validate() # This does not fail. - - def test_validate_missing_field(self): - for field in Symbol._fields: - with self.subTest(field): - symbol = Symbol(**self.VALID_KWARGS) - symbol = symbol._replace(**{field: None}) - - with self.assertRaises(TypeError): - symbol.validate() - - def test_validate_bad_field(self): - badch = tuple(c for c in string.punctuation + string.digits) - notnames = ( - '1a', - 'a.b', - 'a-b', - '&a', - 'a++', - ) + badch - tests = [ - ('id', notnames), - ('kind', ('bogus',)), - ] - seen = set() - for field, invalid in tests: - for value in invalid: - if field != 'kind': - seen.add(value) - with self.subTest(f'{field}={value!r}'): - symbol = Symbol(**self.VALID_KWARGS) - symbol = symbol._replace(**{field: value}) - - with self.assertRaises(ValueError): - symbol.validate() - - for field, invalid in tests: - if field == 'kind': - continue - valid = seen - set(invalid) - for value in valid: - with self.subTest(f'{field}={value!r}'): - symbol = Symbol(**self.VALID_KWARGS) - symbol = symbol._replace(**{field: value}) - - symbol.validate() # This does not fail. diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_variables/__init__.py deleted file mode 100644 index bc502ef32d2916..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_variables/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -import os.path -from test.support import load_package_tests - - -def load_tests(*args): - return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/test_find.py b/Lib/test/test_tools/test_c_analyzer/test_variables/test_find.py deleted file mode 100644 index 7a13cf3f5bf56c..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_variables/test_find.py +++ /dev/null @@ -1,124 +0,0 @@ -import unittest - -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - from c_analyzer.variables import info - from c_analyzer.variables.find import ( - vars_from_binary, - ) - - -class _Base(unittest.TestCase): - - maxDiff = None - - @property - def calls(self): - try: - return self._calls - except AttributeError: - self._calls = [] - return self._calls - - -class VarsFromBinaryTests(_Base): - - _return_iter_vars = () - _return_get_symbol_resolver = None - - def setUp(self): - super().setUp() - - self.kwargs = dict( - _iter_vars=self._iter_vars, - _get_symbol_resolver=self._get_symbol_resolver, - ) - - def _iter_vars(self, binfile, resolve, handle_id): - self.calls.append(('_iter_vars', (binfile, resolve, handle_id))) - return [(v, v.id) for v in self._return_iter_vars] - - def _get_symbol_resolver(self, known=None, dirnames=(), *, - handle_var, - filenames=None, - check_filename=None, - perfilecache=None, - ): - self.calls.append(('_get_symbol_resolver', - (known, dirnames, handle_var, filenames, - check_filename, perfilecache))) - return self._return_get_symbol_resolver - - def test_typical(self): - resolver = self._return_get_symbol_resolver = object() - variables = self._return_iter_vars = [ - info.Variable.from_parts('dir1/spam.c', None, 'var1', 'int'), - info.Variable.from_parts('dir1/spam.c', None, 'var2', 'static int'), - info.Variable.from_parts('dir1/spam.c', None, 'var3', 'char *'), - info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', 'const char *'), - info.Variable.from_parts('dir1/eggs.c', None, 'var1', 'static int'), - info.Variable.from_parts('dir1/eggs.c', 'func1', 'var2', 'static char *'), - ] - known = object() - filenames = object() - - found = list(vars_from_binary('python', - known=known, - filenames=filenames, - **self.kwargs)) - - self.assertEqual(found, [ - info.Variable.from_parts('dir1/spam.c', None, 'var1', 'int'), - info.Variable.from_parts('dir1/spam.c', None, 'var2', 'static int'), - info.Variable.from_parts('dir1/spam.c', None, 'var3', 'char *'), - info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', 'const char *'), - info.Variable.from_parts('dir1/eggs.c', None, 'var1', 'static int'), - info.Variable.from_parts('dir1/eggs.c', 'func1', 'var2', 'static char *'), - ]) - self.assertEqual(self.calls, [ - ('_get_symbol_resolver', (filenames, known, info.Variable.from_id, None, None, {})), - ('_iter_vars', ('python', resolver, None)), - ]) - -# self._return_iter_symbols = [ -# s_info.Symbol(('dir1/spam.c', None, 'var1'), 'variable', False), -# s_info.Symbol(('dir1/spam.c', None, 'var2'), 'variable', False), -# s_info.Symbol(('dir1/spam.c', None, 'func1'), 'function', False), -# s_info.Symbol(('dir1/spam.c', None, 'func2'), 'function', True), -# s_info.Symbol(('dir1/spam.c', None, 'var3'), 'variable', False), -# s_info.Symbol(('dir1/spam.c', 'func2', 'var4'), 'variable', False), -# s_info.Symbol(('dir1/ham.c', None, 'var1'), 'variable', True), -# s_info.Symbol(('dir1/eggs.c', None, 'var1'), 'variable', False), -# s_info.Symbol(('dir1/eggs.c', None, 'xyz'), 'other', False), -# s_info.Symbol(('dir1/eggs.c', '???', 'var2'), 'variable', False), -# s_info.Symbol(('???', None, 'var_x'), 'variable', False), -# s_info.Symbol(('???', '???', 'var_y'), 'variable', False), -# s_info.Symbol((None, None, '???'), 'other', False), -# ] -# known = object() -# -# vars_from_binary('python', knownvars=known, **this.kwargs) -# found = list(globals_from_symbols(['dir1'], self.iter_symbols)) -# -# self.assertEqual(found, [ -# info.Variable.from_parts('dir1/spam.c', None, 'var1', '???'), -# info.Variable.from_parts('dir1/spam.c', None, 'var2', '???'), -# info.Variable.from_parts('dir1/spam.c', None, 'var3', '???'), -# info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', '???'), -# info.Variable.from_parts('dir1/eggs.c', None, 'var1', '???'), -# ]) -# self.assertEqual(self.calls, [ -# ('iter_symbols', (['dir1'],)), -# ]) -# -# def test_no_symbols(self): -# self._return_iter_symbols = [] -# -# found = list(globals_from_symbols(['dir1'], self.iter_symbols)) -# -# self.assertEqual(found, []) -# self.assertEqual(self.calls, [ -# ('iter_symbols', (['dir1'],)), -# ]) - - # XXX need functional test diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/test_info.py b/Lib/test/test_tools/test_c_analyzer/test_variables/test_info.py deleted file mode 100644 index d424d8eebb8111..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_variables/test_info.py +++ /dev/null @@ -1,244 +0,0 @@ -import string -import unittest - -from ..util import PseudoStr, StrProxy, Object -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - from c_analyzer.common.info import UNKNOWN, ID - from c_analyzer.variables.info import ( - normalize_vartype, Variable - ) - - -class NormalizeVartypeTests(unittest.TestCase): - - def test_basic(self): - tests = [ - (None, None), - ('', ''), - ('int', 'int'), - (PseudoStr('int'), 'int'), - (StrProxy('int'), 'int'), - ] - for vartype, expected in tests: - with self.subTest(vartype): - normalized = normalize_vartype(vartype) - - self.assertEqual(normalized, expected) - - -class VariableTests(unittest.TestCase): - - VALID_ARGS = ( - ('x/y/z/spam.c', 'func', 'eggs'), - 'static', - 'int', - ) - VALID_KWARGS = dict(zip(Variable._fields, VALID_ARGS)) - VALID_EXPECTED = VALID_ARGS - - def test_init_typical_global(self): - for storage in ('static', 'extern', 'implicit'): - with self.subTest(storage): - static = Variable( - id=ID( - filename='x/y/z/spam.c', - funcname=None, - name='eggs', - ), - storage=storage, - vartype='int', - ) - - self.assertEqual(static, ( - ('x/y/z/spam.c', None, 'eggs'), - storage, - 'int', - )) - - def test_init_typical_local(self): - for storage in ('static', 'local'): - with self.subTest(storage): - static = Variable( - id=ID( - filename='x/y/z/spam.c', - funcname='func', - name='eggs', - ), - storage=storage, - vartype='int', - ) - - self.assertEqual(static, ( - ('x/y/z/spam.c', 'func', 'eggs'), - storage, - 'int', - )) - - def test_init_all_missing(self): - for value in ('', None): - with self.subTest(repr(value)): - static = Variable( - id=value, - storage=value, - vartype=value, - ) - - self.assertEqual(static, ( - None, - None, - None, - )) - - def test_init_all_coerced(self): - id = ID('x/y/z/spam.c', 'func', 'spam') - tests = [ - ('str subclass', - dict( - id=( - PseudoStr('x/y/z/spam.c'), - PseudoStr('func'), - PseudoStr('spam'), - ), - storage=PseudoStr('static'), - vartype=PseudoStr('int'), - ), - (id, - 'static', - 'int', - )), - ('non-str 1', - dict( - id=id, - storage=Object(), - vartype=Object(), - ), - (id, - '', - '', - )), - ('non-str 2', - dict( - id=id, - storage=StrProxy('static'), - vartype=StrProxy('variable'), - ), - (id, - 'static', - 'variable', - )), - ('non-str', - dict( - id=id, - storage=('a', 'b', 'c'), - vartype=('x', 'y', 'z'), - ), - (id, - "('a', 'b', 'c')", - "('x', 'y', 'z')", - )), - ] - for summary, kwargs, expected in tests: - with self.subTest(summary): - static = Variable(**kwargs) - - for field in Variable._fields: - value = getattr(static, field) - if field == 'id': - self.assertIs(type(value), ID) - else: - self.assertIs(type(value), str) - self.assertEqual(tuple(static), expected) - - def test_iterable(self): - static = Variable(**self.VALID_KWARGS) - - id, storage, vartype = static - - values = (id, storage, vartype) - for value, expected in zip(values, self.VALID_EXPECTED): - self.assertEqual(value, expected) - - def test_fields(self): - static = Variable(('a', 'b', 'z'), 'x', 'y') - - self.assertEqual(static.id, ('a', 'b', 'z')) - self.assertEqual(static.storage, 'x') - self.assertEqual(static.vartype, 'y') - - def test___getattr__(self): - static = Variable(('a', 'b', 'z'), 'x', 'y') - - self.assertEqual(static.filename, 'a') - self.assertEqual(static.funcname, 'b') - self.assertEqual(static.name, 'z') - - def test_validate_typical(self): - validstorage = ('static', 'extern', 'implicit', 'local') - self.assertEqual(set(validstorage), set(Variable.STORAGE)) - - for storage in validstorage: - with self.subTest(storage): - static = Variable( - id=ID( - filename='x/y/z/spam.c', - funcname='func', - name='eggs', - ), - storage=storage, - vartype='int', - ) - - static.validate() # This does not fail. - - def test_validate_missing_field(self): - for field in Variable._fields: - with self.subTest(field): - static = Variable(**self.VALID_KWARGS) - static = static._replace(**{field: None}) - - with self.assertRaises(TypeError): - static.validate() - for field in ('storage', 'vartype'): - with self.subTest(field): - static = Variable(**self.VALID_KWARGS) - static = static._replace(**{field: UNKNOWN}) - - with self.assertRaises(TypeError): - static.validate() - - def test_validate_bad_field(self): - badch = tuple(c for c in string.punctuation + string.digits) - notnames = ( - '1a', - 'a.b', - 'a-b', - '&a', - 'a++', - ) + badch - tests = [ - ('id', ()), # Any non-empty str is okay. - ('storage', ('external', 'global') + notnames), - ('vartype', ()), # Any non-empty str is okay. - ] - seen = set() - for field, invalid in tests: - for value in invalid: - seen.add(value) - with self.subTest(f'{field}={value!r}'): - static = Variable(**self.VALID_KWARGS) - static = static._replace(**{field: value}) - - with self.assertRaises(ValueError): - static.validate() - - for field, invalid in tests: - if field == 'id': - continue - valid = seen - set(invalid) - for value in valid: - with self.subTest(f'{field}={value!r}'): - static = Variable(**self.VALID_KWARGS) - static = static._replace(**{field: value}) - - static.validate() # This does not fail. diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/test_known.py b/Lib/test/test_tools/test_c_analyzer/test_variables/test_known.py deleted file mode 100644 index 49ff45c6d1b2cf..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/test_variables/test_known.py +++ /dev/null @@ -1,139 +0,0 @@ -import re -import textwrap -import unittest - -from .. import tool_imports_for_tests -with tool_imports_for_tests(): - from c_analyzer.common.info import ID - from c_analyzer.variables.info import Variable - from c_analyzer.variables.known import ( - read_file, - from_file, - ) - -class _BaseTests(unittest.TestCase): - - maxDiff = None - - @property - def calls(self): - try: - return self._calls - except AttributeError: - self._calls = [] - return self._calls - - -class ReadFileTests(_BaseTests): - - _return_read_tsv = () - - def _read_tsv(self, *args): - self.calls.append(('_read_tsv', args)) - return self._return_read_tsv - - def test_typical(self): - lines = textwrap.dedent(''' - filename funcname name kind declaration - file1.c - var1 variable static int - file1.c func1 local1 variable static int - file1.c - var2 variable int - file1.c func2 local2 variable char * - file2.c - var1 variable char * - ''').strip().splitlines() - lines = [re.sub(r'\s+', '\t', line, 4) for line in lines] - self._return_read_tsv = [tuple(v.strip() for v in line.split('\t')) - for line in lines[1:]] - - known = list(read_file('known.tsv', _read_tsv=self._read_tsv)) - - self.assertEqual(known, [ - ('variable', ID('file1.c', '', 'var1'), 'static int'), - ('variable', ID('file1.c', 'func1', 'local1'), 'static int'), - ('variable', ID('file1.c', '', 'var2'), 'int'), - ('variable', ID('file1.c', 'func2', 'local2'), 'char *'), - ('variable', ID('file2.c', '', 'var1'), 'char *'), - ]) - self.assertEqual(self.calls, [ - ('_read_tsv', - ('known.tsv', 'filename\tfuncname\tname\tkind\tdeclaration')), - ]) - - def test_empty(self): - self._return_read_tsv = [] - - known = list(read_file('known.tsv', _read_tsv=self._read_tsv)) - - self.assertEqual(known, []) - self.assertEqual(self.calls, [ - ('_read_tsv', ('known.tsv', 'filename\tfuncname\tname\tkind\tdeclaration')), - ]) - - -class FromFileTests(_BaseTests): - - _return_read_file = () - _return_handle_var = () - - def _read_file(self, infile): - self.calls.append(('_read_file', (infile,))) - return iter(self._return_read_file) - - def _handle_var(self, varid, decl): - self.calls.append(('_handle_var', (varid, decl))) - var = self._return_handle_var.pop(0) - return var - - def test_typical(self): - expected = [ - Variable.from_parts('file1.c', '', 'var1', 'static int'), - Variable.from_parts('file1.c', 'func1', 'local1', 'static int'), - Variable.from_parts('file1.c', '', 'var2', 'int'), - Variable.from_parts('file1.c', 'func2', 'local2', 'char *'), - Variable.from_parts('file2.c', '', 'var1', 'char *'), - ] - self._return_read_file = [('variable', v.id, v.vartype) - for v in expected] -# ('variable', ID('file1.c', '', 'var1'), 'static int'), -# ('variable', ID('file1.c', 'func1', 'local1'), 'static int'), -# ('variable', ID('file1.c', '', 'var2'), 'int'), -# ('variable', ID('file1.c', 'func2', 'local2'), 'char *'), -# ('variable', ID('file2.c', '', 'var1'), 'char *'), -# ] - self._return_handle_var = list(expected) # a copy - - known = from_file('known.tsv', - handle_var=self._handle_var, - _read_file=self._read_file, - ) - - self.assertEqual(known, { - 'variables': {v.id: v for v in expected}, - }) -# Variable.from_parts('file1.c', '', 'var1', 'static int'), -# Variable.from_parts('file1.c', 'func1', 'local1', 'static int'), -# Variable.from_parts('file1.c', '', 'var2', 'int'), -# Variable.from_parts('file1.c', 'func2', 'local2', 'char *'), -# Variable.from_parts('file2.c', '', 'var1', 'char *'), -# ]}, -# }) - self.assertEqual(self.calls, [ - ('_read_file', ('known.tsv',)), - *[('_handle_var', (v.id, v.vartype)) - for v in expected], - ]) - - def test_empty(self): - self._return_read_file = [] - - known = from_file('known.tsv', - handle_var=self._handle_var, - _read_file=self._read_file, - ) - - self.assertEqual(known, { - 'variables': {}, - }) - self.assertEqual(self.calls, [ - ('_read_file', ('known.tsv',)), - ]) diff --git a/Lib/test/test_tools/test_c_analyzer/util.py b/Lib/test/test_tools/test_c_analyzer/util.py deleted file mode 100644 index ba73b0a4b5fc6b..00000000000000 --- a/Lib/test/test_tools/test_c_analyzer/util.py +++ /dev/null @@ -1,60 +0,0 @@ -import itertools - - -class PseudoStr(str): - pass - - -class StrProxy: - def __init__(self, value): - self.value = value - def __str__(self): - return self.value - def __bool__(self): - return bool(self.value) - - -class Object: - def __repr__(self): - return '' - - -def wrapped_arg_combos(*args, - wrappers=(PseudoStr, StrProxy), - skip=(lambda w, i, v: not isinstance(v, str)), - ): - """Yield every possible combination of wrapped items for the given args. - - Effectively, the wrappers are applied to the args according to the - powerset of the args indicies. So the result includes the args - completely unwrapped. - - If "skip" is supplied (default is to skip all non-str values) and - it returns True for a given arg index/value then that arg will - remain unwrapped, - - Only unique results are returned. If an arg was skipped for one - of the combinations then it could end up matching one of the other - combinations. In that case only one of them will be yielded. - """ - if not args: - return - indices = list(range(len(args))) - # The powerset (from recipe in the itertools docs). - combos = itertools.chain.from_iterable(itertools.combinations(indices, r) - for r in range(len(indices)+1)) - seen = set() - for combo in combos: - for wrap in wrappers: - indexes = [] - applied = list(args) - for i in combo: - arg = args[i] - if skip and skip(wrap, i, arg): - continue - indexes.append(i) - applied[i] = wrap(arg) - key = (wrap, tuple(indexes)) - if key not in seen: - yield tuple(applied) - seen.add(key) diff --git a/Tools/c-analyzer/README b/Tools/c-analyzer/README index 8cf20e276d927b..86bf1e77e0bfea 100644 --- a/Tools/c-analyzer/README +++ b/Tools/c-analyzer/README @@ -36,6 +36,10 @@ should be run to ensure that no new globals have been added: python3 Tools/c-analyzer/check-c-globals.py +You can also use the more generic tool: + + python3 Tools/c-analyzer/c-analyzer.py + If it reports any globals then they should be resolved. If the globals are runtime state then they should be folded into _PyRuntimeState. Otherwise they should be added to ignored-globals.txt. diff --git a/Tools/c-analyzer/c-analyzer.py b/Tools/c-analyzer/c-analyzer.py new file mode 100644 index 00000000000000..4a5e88cdaf1b0d --- /dev/null +++ b/Tools/c-analyzer/c-analyzer.py @@ -0,0 +1,7 @@ +from cpython.__main__ import parse_args, main, configure_logger + + +cmd, cmd_kwargs, verbosity, traceback_cm = parse_args() +configure_logger(verbosity) +with traceback_cm: + main(cmd, cmd_kwargs) diff --git a/Tools/c-analyzer/c-globals.py b/Tools/c-analyzer/c-globals.py deleted file mode 100644 index b36b791241d539..00000000000000 --- a/Tools/c-analyzer/c-globals.py +++ /dev/null @@ -1,9 +0,0 @@ -# This is a script equivalent of running "python -m test.test_c_globals.cg". - -from cpython.__main__ import parse_args, main - - -# This is effectively copied from cg/__main__.py: -if __name__ == '__main__': - cmd, cmdkwargs = parse_args() - main(cmd, cmdkwargs) diff --git a/Tools/c-analyzer/c_analyzer/__init__.py b/Tools/c-analyzer/c_analyzer/__init__.py index e69de29bb2d1d6..4a01cd396f5f5f 100644 --- a/Tools/c-analyzer/c_analyzer/__init__.py +++ b/Tools/c-analyzer/c_analyzer/__init__.py @@ -0,0 +1,103 @@ +from c_parser import ( + parse_files as _parse_files, +) +from c_parser.info import ( + KIND, + TypeDeclaration, + filter_by_kind, + collate_by_kind_group, + resolve_parsed, +) +from . import ( + analyze as _analyze, + datafiles as _datafiles, +) +from .info import Analysis + + +def analyze(filenmes, **kwargs): + results = iter_analyis_results(filenames, **kwargs) + return Analysis.from_results(results) + + +def iter_analysis_results(filenmes, *, + known=None, + **kwargs + ): + decls = iter_decls(filenames, **kwargs) + yield from analyze_decls(decls, known) + + +def iter_decls(filenames, *, + kinds=None, + parse_files=_parse_files, + **kwargs + ): + kinds = KIND.DECLS if kinds is None else (KIND.DECLS & set(kinds)) + parse_files = parse_files or _parse_files + + parsed = parse_files(filenames, **kwargs) + parsed = filter_by_kind(parsed, kinds) + for item in parsed: + yield resolve_parsed(item) + + +def analyze_decls(decls, known, *, + analyze_resolved=None, + handle_unresolved=True, + relroot=None, + ): + knowntypes, knowntypespecs = _datafiles.get_known( + known, + handle_unresolved=handle_unresolved, + analyze_resolved=analyze_resolved, + relroot=relroot, + ) + + decls = list(decls) + collated = collate_by_kind_group(decls) + + types = {decl: None for decl in collated['type']} + typespecs = _analyze.get_typespecs(types) + + def analyze_decl(decl): + return _analyze.analyze_decl( + decl, + typespecs, + knowntypespecs, + types, + knowntypes, + analyze_resolved=analyze_resolved, + ) + _analyze.analyze_type_decls(types, analyze_decl, handle_unresolved) + for decl in decls: + if decl in types: + resolved = types[decl] + else: + resolved = analyze_decl(decl) + if resolved and handle_unresolved: + typedeps, _ = resolved + if not isinstance(typedeps, TypeDeclaration): + if not typedeps or None in typedeps: + raise NotImplementedError((decl, resolved)) + + yield decl, resolved + + +####################################### +# checks + +def check_all(analysis, checks, *, failfast=False): + for check in checks or (): + for data, failure in check(analysis): + if failure is None: + continue + + yield data, failure + if failfast: + yield None, None + break + else: + continue + # We failed fast. + break diff --git a/Tools/c-analyzer/c_analyzer/__main__.py b/Tools/c-analyzer/c_analyzer/__main__.py new file mode 100644 index 00000000000000..1fd45b985d9bcf --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/__main__.py @@ -0,0 +1,501 @@ +import io +import logging +import os.path +import re +import sys + +from c_common.logging import VERBOSITY, Printer +from c_common.scriptutil import ( + add_verbosity_cli, + add_traceback_cli, + add_sepval_cli, + add_files_cli, + add_commands_cli, + process_args_by_key, + configure_logger, + get_prog, + filter_filenames, + iter_marks, +) +from c_parser.info import KIND, is_type_decl +from . import ( + analyze as _analyze, + check_all as _check_all, + datafiles as _datafiles, +) + + +KINDS = [ + KIND.TYPEDEF, + KIND.STRUCT, + KIND.UNION, + KIND.ENUM, + KIND.FUNCTION, + KIND.VARIABLE, + KIND.STATEMENT, +] + +logger = logging.getLogger(__name__) + + +####################################### +# table helpers + +TABLE_SECTIONS = { + 'types': ( + ['kind', 'name', 'data', 'file'], + is_type_decl, + (lambda v: (v.kind.value, v.filename or '', v.name)), + ), + 'typedefs': 'types', + 'structs': 'types', + 'unions': 'types', + 'enums': 'types', + 'functions': ( + ['name', 'data', 'file'], + (lambda kind: kind is KIND.FUNCTION), + (lambda v: (v.filename or '', v.name)), + ), + 'variables': ( + ['name', 'parent', 'data', 'file'], + (lambda kind: kind is KIND.VARIABLE), + (lambda v: (v.filename or '', str(v.parent) if v.parent else '', v.name)), + ), + 'statements': ( + ['file', 'parent', 'data'], + (lambda kind: kind is KIND.STATEMENT), + (lambda v: (v.filename or '', str(v.parent) if v.parent else '', v.name)), + ), + KIND.TYPEDEF: 'typedefs', + KIND.STRUCT: 'structs', + KIND.UNION: 'unions', + KIND.ENUM: 'enums', + KIND.FUNCTION: 'functions', + KIND.VARIABLE: 'variables', + KIND.STATEMENT: 'statements', +} + + +def _render_table(items, columns, relroot=None): + # XXX improve this + header = '\t'.join(columns) + div = '--------------------' + yield header + yield div + total = 0 + for item in items: + rowdata = item.render_rowdata(columns) + row = [rowdata[c] for c in columns] + if relroot and 'file' in columns: + index = columns.index('file') + row[index] = os.path.relpath(row[index], relroot) + yield '\t'.join(row) + total += 1 + yield div + yield f'total: {total}' + + +def build_section(name, groupitems, *, relroot=None): + info = TABLE_SECTIONS[name] + while type(info) is not tuple: + if name in KINDS: + name = info + info = TABLE_SECTIONS[info] + + columns, match_kind, sortkey = info + items = (v for v in groupitems if match_kind(v.kind)) + items = sorted(items, key=sortkey) + def render(): + yield '' + yield f'{name}:' + yield '' + for line in _render_table(items, columns, relroot): + yield line + return items, render + + +####################################### +# the checks + +CHECKS = { + #'globals': _check_globals, +} + + +def add_checks_cli(parser, checks=None, *, add_flags=None): + default = False + if not checks: + checks = list(CHECKS) + default = True + elif isinstance(checks, str): + checks = [checks] + if (add_flags is None and len(checks) > 1) or default: + add_flags = True + + process_checks = add_sepval_cli(parser, '--check', 'checks', checks) + if add_flags: + for check in checks: + parser.add_argument(f'--{check}', dest='checks', + action='append_const', const=check) + return [ + process_checks, + ] + + +def _get_check_handlers(fmt, printer, verbosity=VERBOSITY): + div = None + def handle_after(): + pass + if not fmt: + div = '' + def handle_failure(failure, data): + data = repr(data) + if verbosity >= 3: + logger.info(f'failure: {failure}') + logger.info(f'data: {data}') + else: + logger.warn(f'failure: {failure} (data: {data})') + elif fmt == 'raw': + def handle_failure(failure, data): + print(f'{failure!r} {data!r}') + elif fmt == 'brief': + def handle_failure(failure, data): + parent = data.parent or '' + funcname = parent if isinstance(parent, str) else parent.name + name = f'({funcname}).{data.name}' if funcname else data.name + failure = failure.split('\t')[0] + print(f'{data.filename}:{name} - {failure}') + elif fmt == 'summary': + def handle_failure(failure, data): + parent = data.parent or '' + funcname = parent if isinstance(parent, str) else parent.name + print(f'{data.filename:35}\t{funcname or "-":35}\t{data.name:40}\t{failure}') + elif fmt == 'full': + div = '' + def handle_failure(failure, data): + name = data.shortkey if data.kind is KIND.VARIABLE else data.name + parent = data.parent or '' + funcname = parent if isinstance(parent, str) else parent.name + known = 'yes' if data.is_known else '*** NO ***' + print(f'{data.kind.value} {name!r} failed ({failure})') + print(f' file: {data.filename}') + print(f' func: {funcname or "-"}') + print(f' name: {data.name}') + print(f' data: ...') + print(f' type unknown: {known}') + else: + if fmt in FORMATS: + raise NotImplementedError(fmt) + raise ValueError(f'unsupported fmt {fmt!r}') + return handle_failure, handle_after, div + + +####################################### +# the formats + +def fmt_raw(analysis): + for item in analysis: + yield from item.render('raw') + + +def fmt_brief(analysis): + # XXX Support sorting. + items = sorted(analysis) + for kind in KINDS: + if kind is KIND.STATEMENT: + continue + for item in items: + if item.kind is not kind: + continue + yield from item.render('brief') + yield f' total: {len(items)}' + + +def fmt_summary(analysis): + # XXX Support sorting and grouping. + items = list(analysis) + total = len(items) + + def section(name): + _, render = build_section(name, items) + yield from render() + + yield from section('types') + yield from section('functions') + yield from section('variables') + yield from section('statements') + + yield '' +# yield f'grand total: {len(supported) + len(unsupported)}' + yield f'grand total: {total}' + + +def fmt_full(analysis): + # XXX Support sorting. + items = sorted(analysis, key=lambda v: v.key) + yield '' + for item in items: + yield from item.render('full') + yield '' + yield f'total: {len(items)}' + + +FORMATS = { + 'raw': fmt_raw, + 'brief': fmt_brief, + 'summary': fmt_summary, + 'full': fmt_full, +} + + +def add_output_cli(parser, *, default='summary'): + parser.add_argument('--format', dest='fmt', default=default, choices=tuple(FORMATS)) + + def process_args(args): + pass + return process_args + + +####################################### +# the commands + +def _cli_check(parser, checks=None, **kwargs): + if isinstance(checks, str): + checks = [checks] + if checks is False: + process_checks = None + elif checks is None: + process_checks = add_checks_cli(parser) + elif len(checks) == 1 and type(checks) is not dict and re.match(r'^<.*>$', checks[0]): + check = checks[0][1:-1] + def process_checks(args): + args.checks = [check] + else: + process_checks = add_checks_cli(parser, checks=checks) + process_output = add_output_cli(parser, default=None) + process_files = add_files_cli(parser, **kwargs) + return [ + process_checks, + process_output, + process_files, + ] + + +def cmd_check(filenames, *, + checks=None, + ignored=None, + fmt=None, + relroot=None, + failfast=False, + iter_filenames=None, + verbosity=VERBOSITY, + _analyze=_analyze, + _CHECKS=CHECKS, + **kwargs + ): + if not checks: + checks = _CHECKS + elif isinstance(checks, str): + checks = [checks] + checks = [_CHECKS[c] if isinstance(c, str) else c + for c in checks] + printer = Printer(verbosity) + (handle_failure, handle_after, div + ) = _get_check_handlers(fmt, printer, verbosity) + + filenames = filter_filenames(filenames, iter_filenames) + + logger.info('analyzing...') + analyzed = _analyze(filenames, **kwargs) + if relroot: + analyzed.fix_filenames(relroot) + + logger.info('checking...') + numfailed = 0 + for data, failure in _check_all(analyzed, checks, failfast=failfast): + if data is None: + printer.info('stopping after one failure') + break + if div is not None and numfailed > 0: + printer.info(div) + numfailed += 1 + handle_failure(failure, data) + handle_after() + + printer.info('-------------------------') + logger.info(f'total failures: {numfailed}') + logger.info('done checking') + + if numfailed > 0: + sys.exit(numfailed) + + +def _cli_analyze(parser, **kwargs): + process_output = add_output_cli(parser) + process_files = add_files_cli(parser, **kwargs) + return [ + process_output, + process_files, + ] + + +# XXX Support filtering by kind. +def cmd_analyze(filenames, *, + fmt=None, + iter_filenames=None, + verbosity=None, + _analyze=_analyze, + formats=FORMATS, + **kwargs + ): + verbosity = verbosity if verbosity is not None else 3 + + try: + do_fmt = formats[fmt] + except KeyError: + raise ValueError(f'unsupported fmt {fmt!r}') + + filenames = filter_filenames(filenames, iter_filenames) + if verbosity == 2: + def iter_filenames(filenames=filenames): + marks = iter_marks() + for filename in filenames: + print(next(marks), end='') + yield filename + filenames = iter_filenames() + elif verbosity > 2: + def iter_filenames(filenames=filenames): + for filename in filenames: + print(f'<{filename}>') + yield filename + filenames = iter_filenames() + + logger.info('analyzing...') + analyzed = _analyze(filenames, **kwargs) + + for line in do_fmt(analyzed): + print(line) + + +def _cli_data(parser, filenames=None, known=None): + ArgumentParser = type(parser) + common = ArgumentParser(add_help=False) + if filenames is None: + common.add_argument('filenames', metavar='FILE', nargs='+') + + subs = parser.add_subparsers(dest='datacmd') + + sub = subs.add_parser('show', parents=[common]) + if known is None: + sub.add_argument('--known', required=True) + + sub = subs.add_parser('dump') + if known is None: + sub.add_argument('--known') + sub.add_argument('--show', action='store_true') + + sub = subs.add_parser('check') + if known is None: + sub.add_argument('--known', required=True) + + return None + + +def cmd_data(datacmd, filenames, known=None, *, + _analyze=_analyze, + formats=FORMATS, + extracolumns=None, + relroot=None, + **kwargs + ): + kwargs.pop('verbosity', None) + usestdout = kwargs.pop('show', None) + if datacmd == 'show': + do_fmt = formats['summary'] + if isinstance(known, str): + known, _ = _datafiles.get_known(known, extracolumns, relroot) + for line in do_fmt(known): + print(line) + elif datacmd == 'dump': + analyzed = _analyze(filenames, **kwargs) + if known is None or usestdout: + outfile = io.StringIO() + _datafiles.write_known(analyzed, outfile, extracolumns, + relroot=relroot) + print(outfile.getvalue()) + else: + _datafiles.write_known(analyzed, known, extracolumns, + relroot=relroot) + elif datacmd == 'check': + raise NotImplementedError(datacmd) + else: + raise ValueError(f'unsupported data command {datacmd!r}') + + +COMMANDS = { + 'check': ( + 'analyze and fail if the given C source/header files have any problems', + [_cli_check], + cmd_check, + ), + 'analyze': ( + 'report on the state of the given C source/header files', + [_cli_analyze], + cmd_analyze, + ), + 'data': ( + 'check/manage local data (e.g. knwon types, ignored vars, caches)', + [_cli_data], + cmd_data, + ), +} + + +####################################### +# the script + +def parse_args(argv=sys.argv[1:], prog=sys.argv[0], *, subset=None): + import argparse + parser = argparse.ArgumentParser( + prog=prog or get_prog(), + ) + + processors = add_commands_cli( + parser, + commands={k: v[1] for k, v in COMMANDS.items()}, + commonspecs=[ + add_verbosity_cli, + add_traceback_cli, + ], + subset=subset, + ) + + args = parser.parse_args(argv) + ns = vars(args) + + cmd = ns.pop('cmd') + + verbosity, traceback_cm = process_args_by_key( + args, + processors[cmd], + ['verbosity', 'traceback_cm'], + ) + # "verbosity" is sent to the commands, so we put it back. + args.verbosity = verbosity + + return cmd, ns, verbosity, traceback_cm + + +def main(cmd, cmd_kwargs): + try: + run_cmd = COMMANDS[cmd][0] + except KeyError: + raise ValueError(f'unsupported cmd {cmd!r}') + run_cmd(**cmd_kwargs) + + +if __name__ == '__main__': + cmd, cmd_kwargs, verbosity, traceback_cm = parse_args() + configure_logger(verbosity) + with traceback_cm: + main(cmd, cmd_kwargs) diff --git a/Tools/c-analyzer/c_analyzer/analyze.py b/Tools/c-analyzer/c_analyzer/analyze.py new file mode 100644 index 00000000000000..d8ae915e420029 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/analyze.py @@ -0,0 +1,307 @@ +from c_parser.info import ( + KIND, + TypeDeclaration, + POTSType, + FuncPtr, + is_pots, + is_funcptr, +) +from .info import ( + IGNORED, + UNKNOWN, + is_system_type, + SystemType, +) + + +def get_typespecs(typedecls): + typespecs = {} + for decl in typedecls: + if decl.shortkey not in typespecs: + typespecs[decl.shortkey] = [decl] + else: + typespecs[decl.shortkey].append(decl) + return typespecs + + +def analyze_decl(decl, typespecs, knowntypespecs, types, knowntypes, *, + analyze_resolved=None): + resolved = resolve_decl(decl, typespecs, knowntypespecs, types) + if resolved is None: + # The decl is supposed to be skipped or ignored. + return None + if analyze_resolved is None: + return resolved, None + return analyze_resolved(resolved, decl, types, knowntypes) + +# This alias helps us avoid name collisions. +_analyze_decl = analyze_decl + + +def analyze_type_decls(types, analyze_decl, handle_unresolved=True): + unresolved = set(types) + while unresolved: + updated = [] + for decl in unresolved: + resolved = analyze_decl(decl) + if resolved is None: + # The decl should be skipped or ignored. + types[decl] = IGNORED + updated.append(decl) + continue + typedeps, _ = resolved + if typedeps is None: + raise NotImplementedError(decl) + if UNKNOWN in typedeps: + # At least one dependency is unknown, so this decl + # is not resolvable. + types[decl] = UNKNOWN + updated.append(decl) + continue + if None in typedeps: + # XXX + # Handle direct recursive types first. + nonrecursive = 1 + if decl.kind is KIND.STRUCT or decl.kind is KIND.UNION: + nonrecursive = 0 + i = 0 + for member, dep in zip(decl.members, typedeps): + if dep is None: + if member.vartype.typespec != decl.shortkey: + nonrecursive += 1 + else: + typedeps[i] = decl + i += 1 + if nonrecursive: + # We don't have all dependencies resolved yet. + continue + types[decl] = resolved + updated.append(decl) + if updated: + for decl in updated: + unresolved.remove(decl) + else: + # XXX + # Handle indirect recursive types. + ... + # We couldn't resolve the rest. + # Let the caller deal with it! + break + if unresolved and handle_unresolved: + if handle_unresolved is True: + handle_unresolved = _handle_unresolved + handle_unresolved(unresolved, types, analyze_decl) + + +def resolve_decl(decl, typespecs, knowntypespecs, types): + if decl.kind is KIND.ENUM: + typedeps = [] + else: + if decl.kind is KIND.VARIABLE: + vartypes = [decl.vartype] + elif decl.kind is KIND.FUNCTION: + vartypes = [decl.signature.returntype] + elif decl.kind is KIND.TYPEDEF: + vartypes = [decl.vartype] + elif decl.kind is KIND.STRUCT or decl.kind is KIND.UNION: + vartypes = [m.vartype for m in decl.members] + else: + # Skip this one! + return None + + typedeps = [] + for vartype in vartypes: + typespec = vartype.typespec + if is_pots(typespec): + typedecl = POTSType(typespec) + elif is_system_type(typespec): + typedecl = SystemType(typespec) + elif is_funcptr(vartype): + typedecl = FuncPtr(vartype) + else: + typedecl = find_typedecl(decl, typespec, typespecs) + if typedecl is None: + typedecl = find_typedecl(decl, typespec, knowntypespecs) + elif not isinstance(typedecl, TypeDeclaration): + raise NotImplementedError(repr(typedecl)) + if typedecl is None: + # We couldn't find it! + typedecl = UNKNOWN + elif typedecl not in types: + # XXX How can this happen? + typedecl = UNKNOWN + elif types[typedecl] is UNKNOWN: + typedecl = UNKNOWN + elif types[typedecl] is IGNORED: + # We don't care if it didn't resolve. + pass + elif types[typedecl] is None: + # The typedecl for the typespec hasn't been resolved yet. + typedecl = None + typedeps.append(typedecl) + return typedeps + + +def find_typedecl(decl, typespec, typespecs): + specdecls = typespecs.get(typespec) + if not specdecls: + return None + + filename = decl.filename + + if len(specdecls) == 1: + typedecl, = specdecls + if '-' in typespec and typedecl.filename != filename: + # Inlined types are always in the same file. + return None + return typedecl + + # Decide which one to return. + candidates = [] + samefile = None + for typedecl in specdecls: + type_filename = typedecl.filename + if type_filename == filename: + if samefile is not None: + # We expect type names to be unique in a file. + raise NotImplementedError((decl, samefile, typedecl)) + samefile = typedecl + elif filename.endswith('.c') and not type_filename.endswith('.h'): + # If the decl is in a source file then we expect the + # type to be in the same file or in a header file. + continue + candidates.append(typedecl) + if not candidates: + return None + elif len(candidates) == 1: + winner, = candidates + # XXX Check for inline? + elif '-' in typespec: + # Inlined types are always in the same file. + winner = samefile + elif samefile is not None: + # Favor types in the same file. + winner = samefile + else: + # We don't know which to return. + raise NotImplementedError((decl, candidates)) + + return winner + + +############################# +# handling unresolved decls + +class Skipped(TypeDeclaration): + def __init__(self): + _file = _name = _data = _parent = None + super().__init__(_file, _name, _data, _parent, _shortkey='') +_SKIPPED = Skipped() +del Skipped + + +def _handle_unresolved(unresolved, types, analyze_decl): + #raise NotImplementedError(unresolved) + + dump = True + dump = False + if dump: + print() + for decl in types: # Preserve the original order. + if decl not in unresolved: + assert types[decl] is not None, decl + if types[decl] in (UNKNOWN, IGNORED): + unresolved.add(decl) + if dump: + _dump_unresolved(decl, types, analyze_decl) + print() + else: + assert types[decl][0] is not None, (decl, types[decl]) + assert None not in types[decl][0], (decl, types[decl]) + else: + assert types[decl] is None + if dump: + _dump_unresolved(decl, types, analyze_decl) + print() + #raise NotImplementedError + + for decl in unresolved: + types[decl] = ([_SKIPPED], None) + + for decl in types: + assert types[decl] + + +def _dump_unresolved(decl, types, analyze_decl): + if isinstance(decl, str): + typespec = decl + decl, = (d for d in types if d.shortkey == typespec) + elif type(decl) is tuple: + filename, typespec = decl + if '-' in typespec: + found = [d for d in types + if d.shortkey == typespec and d.filename == filename] + #if not found: + # raise NotImplementedError(decl) + decl, = found + else: + found = [d for d in types if d.shortkey == typespec] + if not found: + print(f'*** {typespec} ???') + return + #raise NotImplementedError(decl) + else: + decl, = found + resolved = analyze_decl(decl) + if resolved: + typedeps, _ = resolved or (None, None) + + if decl.kind is KIND.STRUCT or decl.kind is KIND.UNION: + print(f'*** {decl.shortkey} {decl.filename}') + for member, mtype in zip(decl.members, typedeps): + typespec = member.vartype.typespec + if typespec == decl.shortkey: + print(f' ~~~~: {typespec:20} - {member!r}') + continue + status = None + if is_pots(typespec): + mtype = typespec + status = 'okay' + elif is_system_type(typespec): + mtype = typespec + status = 'okay' + elif mtype is None: + if '-' in member.vartype.typespec: + mtype, = [d for d in types + if d.shortkey == member.vartype.typespec + and d.filename == decl.filename] + else: + found = [d for d in types + if d.shortkey == typespec] + if not found: + print(f' ???: {typespec:20}') + continue + mtype, = found + if status is None: + status = 'okay' if types.get(mtype) else 'oops' + if mtype is _SKIPPED: + status = 'okay' + mtype = '' + elif isinstance(mtype, FuncPtr): + status = 'okay' + mtype = str(mtype.vartype) + elif not isinstance(mtype, str): + if hasattr(mtype, 'vartype'): + if is_funcptr(mtype.vartype): + status = 'okay' + mtype = str(mtype).rpartition('(')[0].rstrip() + status = ' okay' if status == 'okay' else f'--> {status}' + print(f' {status}: {typespec:20} - {member!r} ({mtype})') + else: + print(f'*** {decl} ({decl.vartype!r})') + if decl.vartype.typespec.startswith('struct ') or is_funcptr(decl): + _dump_unresolved( + (decl.filename, decl.vartype.typespec), + types, + analyze_decl, + ) diff --git a/Tools/c-analyzer/c_analyzer/common/files.py b/Tools/c-analyzer/c_analyzer/common/files.py deleted file mode 100644 index a8a044757d00b2..00000000000000 --- a/Tools/c-analyzer/c_analyzer/common/files.py +++ /dev/null @@ -1,124 +0,0 @@ -import glob -import os -import os.path - -# XXX need tests: -# * walk_tree() -# * glob_tree() -# * iter_files_by_suffix() - - -C_SOURCE_SUFFIXES = ('.c', '.h') - - -def _walk_tree(root, *, - _walk=os.walk, - ): - # A wrapper around os.walk that resolves the filenames. - for parent, _, names in _walk(root): - for name in names: - yield os.path.join(parent, name) - - -def walk_tree(root, *, - suffix=None, - walk=_walk_tree, - ): - """Yield each file in the tree under the given directory name. - - If "suffix" is provided then only files with that suffix will - be included. - """ - if suffix and not isinstance(suffix, str): - raise ValueError('suffix must be a string') - - for filename in walk(root): - if suffix and not filename.endswith(suffix): - continue - yield filename - - -def glob_tree(root, *, - suffix=None, - _glob=glob.iglob, - _escape=glob.escape, - _join=os.path.join, - ): - """Yield each file in the tree under the given directory name. - - If "suffix" is provided then only files with that suffix will - be included. - """ - suffix = suffix or '' - if not isinstance(suffix, str): - raise ValueError('suffix must be a string') - - for filename in _glob(_join(_escape(root), f'*{suffix}')): - yield filename - for filename in _glob(_join(_escape(root), f'**/*{suffix}')): - yield filename - - -def iter_files(root, suffix=None, relparent=None, *, - get_files=None, - _glob=glob_tree, - _walk=walk_tree, - ): - """Yield each file in the tree under the given directory name. - - If "root" is a non-string iterable then do the same for each of - those trees. - - If "suffix" is provided then only files with that suffix will - be included. - - if "relparent" is provided then it is used to resolve each - filename as a relative path. - """ - if get_files is None: - get_files = os.walk - if not isinstance(root, str): - roots = root - for root in roots: - yield from iter_files(root, suffix, relparent, - get_files=get_files, - _glob=_glob, _walk=_walk) - return - - # Use the right "walk" function. - if get_files in (glob.glob, glob.iglob, glob_tree): - get_files = _glob - else: - _files = _walk_tree if get_files in (os.walk, walk_tree) else get_files - get_files = (lambda *a, **k: _walk(*a, walk=_files, **k)) - - # Handle a single suffix. - if suffix and not isinstance(suffix, str): - filenames = get_files(root) - suffix = tuple(suffix) - else: - filenames = get_files(root, suffix=suffix) - suffix = None - - for filename in filenames: - if suffix and not isinstance(suffix, str): # multiple suffixes - if not filename.endswith(suffix): - continue - if relparent: - filename = os.path.relpath(filename, relparent) - yield filename - - -def iter_files_by_suffix(root, suffixes, relparent=None, *, - walk=walk_tree, - _iter_files=iter_files, - ): - """Yield each file in the tree that has the given suffixes. - - Unlike iter_files(), the results are in the original suffix order. - """ - if isinstance(suffixes, str): - suffixes = [suffixes] - # XXX Ignore repeated suffixes? - for suffix in suffixes: - yield from _iter_files(root, suffix, relparent) diff --git a/Tools/c-analyzer/c_analyzer/common/info.py b/Tools/c-analyzer/c_analyzer/common/info.py deleted file mode 100644 index 1a853a42ff2a2c..00000000000000 --- a/Tools/c-analyzer/c_analyzer/common/info.py +++ /dev/null @@ -1,138 +0,0 @@ -from collections import namedtuple -import re - -from .util import classonly, _NTBase - -# XXX need tests: -# * ID.match() - - -UNKNOWN = '???' - -# Does not start with digit and contains at least one letter. -NAME_RE = re.compile(r'(?!\d)(?=.*?[A-Za-z])\w+', re.ASCII) - - -class ID(_NTBase, namedtuple('ID', 'filename funcname name')): - """A unique ID for a single symbol or declaration.""" - - __slots__ = () - # XXX Add optional conditions (tuple of strings) field. - #conditions = Slot() - - @classonly - def from_raw(cls, raw): - if not raw: - return None - if isinstance(raw, str): - return cls(None, None, raw) - try: - name, = raw - filename = None - except ValueError: - try: - filename, name = raw - except ValueError: - return super().from_raw(raw) - return cls(filename, None, name) - - def __new__(cls, filename, funcname, name): - self = super().__new__( - cls, - filename=str(filename) if filename else None, - funcname=str(funcname) if funcname else None, - name=str(name) if name else None, - ) - #cls.conditions.set(self, tuple(str(s) if s else None - # for s in conditions or ())) - return self - - def validate(self): - """Fail if the object is invalid (i.e. init with bad data).""" - if not self.name: - raise TypeError('missing name') - if not NAME_RE.fullmatch(self.name): - raise ValueError( - f'name must be an identifier, got {self.name!r}') - - # Symbols from a binary might not have filename/funcname info. - - if self.funcname: - if not self.filename: - raise TypeError('missing filename') - if not NAME_RE.fullmatch(self.funcname) and self.funcname != UNKNOWN: - raise ValueError( - f'name must be an identifier, got {self.funcname!r}') - - # XXX Require the filename (at least UNKONWN)? - # XXX Check the filename? - - @property - def islocal(self): - return self.funcname is not None - - def match(self, other, *, - match_files=(lambda f1, f2: f1 == f2), - ): - """Return True if the two match. - - At least one of the two must be completely valid (no UNKNOWN - anywhere). Otherwise False is returned. The remaining one - *may* have UNKNOWN for both funcname and filename. It must - have a valid name though. - - The caller is responsible for knowing which of the two is valid - (and which to use if both are valid). - """ - # First check the name. - if self.name is None: - return False - if other.name != self.name: - return False - - # Then check the filename. - if self.filename is None: - return False - if other.filename is None: - return False - if self.filename == UNKNOWN: - # "other" must be the valid one. - if other.funcname == UNKNOWN: - return False - elif self.funcname != UNKNOWN: - # XXX Try matching funcname even though we don't - # know the filename? - raise NotImplementedError - else: - return True - elif other.filename == UNKNOWN: - # "self" must be the valid one. - if self.funcname == UNKNOWN: - return False - elif other.funcname != UNKNOWN: - # XXX Try matching funcname even though we don't - # know the filename? - raise NotImplementedError - else: - return True - elif not match_files(self.filename, other.filename): - return False - - # Finally, check the funcname. - if self.funcname == UNKNOWN: - # "other" must be the valid one. - if other.funcname == UNKNOWN: - return False - else: - return other.funcname is not None - elif other.funcname == UNKNOWN: - # "self" must be the valid one. - if self.funcname == UNKNOWN: - return False - else: - return self.funcname is not None - elif self.funcname == other.funcname: - # Both are valid. - return True - - return False diff --git a/Tools/c-analyzer/c_analyzer/common/show.py b/Tools/c-analyzer/c_analyzer/common/show.py deleted file mode 100644 index 5f3cb1c2fb0b59..00000000000000 --- a/Tools/c-analyzer/c_analyzer/common/show.py +++ /dev/null @@ -1,11 +0,0 @@ - -def basic(variables, *, - _print=print): - """Print each row simply.""" - for var in variables: - if var.funcname: - line = f'{var.filename}:{var.funcname}():{var.name}' - else: - line = f'{var.filename}:{var.name}' - line = f'{line:<64} {var.vartype}' - _print(line) diff --git a/Tools/c-analyzer/c_analyzer/datafiles.py b/Tools/c-analyzer/c_analyzer/datafiles.py new file mode 100644 index 00000000000000..0de438cce470fd --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/datafiles.py @@ -0,0 +1,109 @@ +import c_common.tables as _tables +import c_parser.info as _info +import c_parser.datafiles as _parser +from . import analyze as _analyze + + +############################# +# "known" decls + +EXTRA_COLUMNS = [ + #'typedecl', +] + + +def analyze_known(known, *, + analyze_resolved=None, + handle_unresolved=True, + ): + knowntypes = knowntypespecs = {} + collated = _info.collate_by_kind_group(known) + types = {decl: None for decl in collated['type']} + typespecs = _analyze.get_typespecs(types) + def analyze_decl(decl): + return _analyze.analyze_decl( + decl, + typespecs, + knowntypespecs, + types, + knowntypes, + analyze_resolved=analyze_resolved, + ) + _analyze.analyze_type_decls(types, analyze_decl, handle_unresolved) + return types, typespecs + + +def get_known(known, extracolumns=None, *, + analyze_resolved=None, + handle_unresolved=True, + relroot=None, + ): + if isinstance(known, str): + known = read_known(known, extracolumns, relroot) + return analyze_known( + known, + handle_unresolved=handle_unresolved, + analyze_resolved=analyze_resolved, + ) + + +def read_known(infile, extracolumns=None, relroot=None): + extracolumns = EXTRA_COLUMNS + ( + list(extracolumns) if extracolumns else [] + ) + known = {} + for decl, extra in _parser.iter_decls_tsv(infile, extracolumns, relroot): + known[decl] = extra + return known + + +def write_known(rows, outfile, extracolumns=None, *, + relroot=None, + backup=True, + ): + extracolumns = EXTRA_COLUMNS + ( + list(extracolumns) if extracolumns else [] + ) + _parser.write_decls_tsv( + rows, + outfile, + extracolumns, + relroot=relroot, + backup=backup, + ) + + +############################# +# ignored vars + +IGNORED_COLUMNS = [ + 'filename', + 'funcname', + 'name', + 'reason', +] +IGNORED_HEADER = '\t'.join(IGNORED_COLUMNS) + + +def read_ignored(infile): + return dict(_iter_ignored(infile)) + + +def _iter_ignored(infile): + for row in _tables.read_table(infile, IGNORED_HEADER, sep='\t'): + *varidinfo, reason = row + varid = _info.DeclID.from_row(varidinfo) + yield varid, reason + + +def write_ignored(variables, outfile): + raise NotImplementedError + reason = '???' + #if not isinstance(varid, DeclID): + # varid = getattr(varid, 'parsed', varid).id + _tables.write_table( + outfile, + IGNORED_HEADER, + sep='\t', + rows=(r.render_rowdata() + (reason,) for r in decls), + ) diff --git a/Tools/c-analyzer/c_analyzer/info.py b/Tools/c-analyzer/c_analyzer/info.py new file mode 100644 index 00000000000000..23d77611a4c3ca --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/info.py @@ -0,0 +1,353 @@ +from collections import namedtuple + +from c_common.clsutil import classonly +import c_common.misc as _misc +from c_parser.info import ( + KIND, + HighlevelParsedItem, + Declaration, + TypeDeclaration, + is_type_decl, + is_process_global, +) + + +IGNORED = _misc.Labeled('IGNORED') +UNKNOWN = _misc.Labeled('UNKNOWN') + + +# XXX Use known.tsv for these? +SYSTEM_TYPES = { + 'int8_t', + 'uint8_t', + 'int16_t', + 'uint16_t', + 'int32_t', + 'uint32_t', + 'int64_t', + 'uint64_t', + 'size_t', + 'ssize_t', + 'intptr_t', + 'uintptr_t', + 'wchar_t', + '', + # OS-specific + 'pthread_cond_t', + 'pthread_mutex_t', + 'pthread_key_t', + 'atomic_int', + 'atomic_uintptr_t', + '', + # lib-specific + 'WINDOW', # curses + 'XML_LChar', + 'XML_Size', + 'XML_Parser', + 'enum XML_Error', + 'enum XML_Status', + '', +} + + +def is_system_type(typespec): + return typespec in SYSTEM_TYPES + + +class SystemType(TypeDeclaration): + + def __init__(self, name): + super().__init__(None, name, None, None, _shortkey=name) + + +class Analyzed: + _locked = False + + @classonly + def is_target(cls, raw): + if isinstance(raw, HighlevelParsedItem): + return True + else: + return False + + @classonly + def from_raw(cls, raw, **extra): + if isinstance(raw, cls): + if extra: + # XXX ? + raise NotImplementedError((raw, extra)) + #return cls(raw.item, raw.typedecl, **raw._extra, **extra) + else: + return info + elif cls.is_target(raw): + return cls(raw, **extra) + else: + raise NotImplementedError((raw, extra)) + + @classonly + def from_resolved(cls, item, resolved, **extra): + if isinstance(resolved, TypeDeclaration): + return cls(item, typedecl=resolved, **extra) + else: + typedeps, extra = cls._parse_raw_resolved(item, resolved, extra) + if item.kind is KIND.ENUM: + if typedeps: + raise NotImplementedError((item, resolved, extra)) + elif not typedeps: + raise NotImplementedError((item, resolved, extra)) + return cls(item, typedeps, **extra or {}) + + @classonly + def _parse_raw_resolved(cls, item, resolved, extra_extra): + if resolved in (UNKNOWN, IGNORED): + return resolved, None + try: + typedeps, extra = resolved + except (TypeError, ValueError): + typedeps = extra = None + if extra: + # The resolved data takes precedence. + extra = dict(extra_extra, **extra) + if isinstance(typedeps, TypeDeclaration): + return typedeps, extra + elif typedeps in (None, UNKNOWN): + # It is still effectively unresolved. + return UNKNOWN, extra + elif None in typedeps or UNKNOWN in typedeps: + # It is still effectively unresolved. + return typedeps, extra + elif any(not isinstance(td, TypeDeclaration) for td in typedeps): + raise NotImplementedError((item, typedeps, extra)) + return typedeps, extra + + def __init__(self, item, typedecl=None, **extra): + assert item is not None + self.item = item + if typedecl in (UNKNOWN, IGNORED): + pass + elif item.kind is KIND.STRUCT or item.kind is KIND.UNION: + if isinstance(typedecl, TypeDeclaration): + raise NotImplementedError(item, typedecl) + elif typedecl is None: + typedecl = UNKNOWN + else: + typedecl = [UNKNOWN if d is None else d for d in typedecl] + elif typedecl is None: + typedecl = UNKNOWN + elif typedecl and not isinstance(typedecl, TypeDeclaration): + # All the other decls have a single type decl. + typedecl, = typedecl + if typedecl is None: + typedecl = UNKNOWN + self.typedecl = typedecl + self._extra = extra + self._locked = True + + self._validate() + + def _validate(self): + item = self.item + extra = self._extra + # Check item. + if not isinstance(item, HighlevelParsedItem): + raise ValueError(f'"item" must be a high-level parsed item, got {item!r}') + # Check extra. + for key, value in extra.items(): + if key.startswith('_'): + raise ValueError(f'extra items starting with {"_"!r} not allowed, got {extra!r}') + if hasattr(item, key) and not callable(getattr(item, key)): + raise ValueError(f'extra cannot override item, got {value!r} for key {key!r}') + + def __repr__(self): + kwargs = [ + f'item={self.item!r}', + f'typedecl={self.typedecl!r}', + *(f'{k}={v!r}' for k, v in self._extra.items()) + ] + return f'{type(self).__name__}({", ".join(kwargs)})' + + def __str__(self): + try: + return self._str + except AttributeError: + self._str, = self.render('line') + return self._str + + def __hash__(self): + return hash(self.item) + + def __eq__(self, other): + if isinstance(other, Analyzed): + return self.item == other.item + elif isinstance(other, HighlevelParsedItem): + return self.item == other + elif type(other) is tuple: + return self.item == other + else: + return NotImplemented + + def __gt__(self, other): + if isinstance(other, Analyzed): + return self.item > other.item + elif isinstance(other, HighlevelParsedItem): + return self.item > other + elif type(other) is tuple: + return self.item > other + else: + return NotImplemented + + def __dir__(self): + names = set(super().__dir__()) + names.update(self._extra) + names.remove('_locked') + return sorted(names) + + def __getattr__(self, name): + if name.startswith('_'): + raise AttributeError(name) + # The item takes precedence over the extra data (except if callable). + try: + value = getattr(self.item, name) + if callable(value): + raise AttributeError(name) + except AttributeError: + try: + value = self._extra[name] + except KeyError: + pass + else: + # Speed things up the next time. + self.__dict__[name] = value + return value + raise # re-raise + else: + return value + + def __setattr__(self, name, value): + if self._locked and name != '_str': + raise AttributeError(f'readonly ({name})') + super().__setattr__(name, value) + + def __delattr__(self, name): + if self._locked: + raise AttributeError(f'readonly ({name})') + super().__delattr__(name) + + @property + def decl(self): + if not isinstance(self.item, Declaration): + raise AttributeError('decl') + return self.item + + @property + def signature(self): + # XXX vartype... + ... + + @property + def istype(self): + return is_type_decl(self.item.kind) + + @property + def is_known(self): + if self.typedecl in (UNKNOWN, IGNORED): + return False + elif isinstance(self.typedecl, TypeDeclaration): + return True + else: + return UNKNOWN not in self.typedecl + + def fix_filename(self, relroot): + self.item.fix_filename(relroot) + + def as_rowdata(self, columns=None): + # XXX finsih! + return self.item.as_rowdata(columns) + + def render_rowdata(self, columns=None): + # XXX finsih! + return self.item.render_rowdata(columns) + + def render(self, fmt='line', *, itemonly=False): + if fmt == 'raw': + yield repr(self) + return + rendered = self.item.render(fmt) + if itemonly or not self._extra: + yield from rendered + return + extra = self._render_extra(fmt) + if not extra: + yield from rendered + elif fmt in ('brief', 'line'): + rendered, = rendered + extra, = extra + yield f'{rendered}\t{extra}' + elif fmt == 'summary': + raise NotImplementedError(fmt) + elif fmt == 'full': + yield from rendered + for line in extra: + yield f'\t{line}' + else: + raise NotImplementedError(fmt) + + def _render_extra(self, fmt): + if fmt in ('brief', 'line'): + yield str(self._extra) + else: + raise NotImplementedError(fmt) + + +class Analysis: + + _item_class = Analyzed + + @classonly + def build_item(cls, info, resolved=None, **extra): + if resolved is None: + return cls._item_class.from_raw(info, **extra) + else: + return cls._item_class.from_resolved(info, resolved, **extra) + + @classmethod + def from_results(cls, results): + self = cls() + for info, resolved in results: + self._add_result(info, resolved) + return self + + def __init__(self, items=None): + self._analyzed = {type(self).build_item(item): None + for item in items or ()} + + def __repr__(self): + return f'{type(self).__name__}({list(self._analyzed.keys())})' + + def __iter__(self): + #yield from self.types + #yield from self.functions + #yield from self.variables + yield from self._analyzed + + def __len__(self): + return len(self._analyzed) + + def __getitem__(self, key): + if type(key) is int: + for i, val in enumerate(self._analyzed): + if i == key: + return val + else: + raise IndexError(key) + else: + return self._analyzed[key] + + def fix_filenames(self, relroot): + for item in self._analyzed: + item.fix_filename(relroot) + + def _add_result(self, info, resolved): + analyzed = type(self).build_item(info, resolved) + self._analyzed[analyzed] = None + return analyzed diff --git a/Tools/c-analyzer/c_analyzer/parser/declarations.py b/Tools/c-analyzer/c_analyzer/parser/declarations.py deleted file mode 100644 index f37072cccad864..00000000000000 --- a/Tools/c-analyzer/c_analyzer/parser/declarations.py +++ /dev/null @@ -1,339 +0,0 @@ -import re -import shlex -import subprocess - -from ..common.info import UNKNOWN - -from . import source - - -IDENTIFIER = r'(?:[a-zA-z]|_+[a-zA-Z0-9]\w*)' - -TYPE_QUAL = r'(?:const|volatile)' - -VAR_TYPE_SPEC = r'''(?: - void | - (?: - (?:(?:un)?signed\s+)? - (?: - char | - short | - int | - long | - long\s+int | - long\s+long - ) | - ) | - float | - double | - {IDENTIFIER} | - (?:struct|union)\s+{IDENTIFIER} - )''' - -POINTER = rf'''(?: - (?:\s+const)?\s*[*] - )''' - -#STRUCT = r'''(?: -# (?:struct|(struct\s+%s))\s*[{] -# [^}]* -# [}] -# )''' % (IDENTIFIER) -#UNION = r'''(?: -# (?:union|(union\s+%s))\s*[{] -# [^}]* -# [}] -# )''' % (IDENTIFIER) -#DECL_SPEC = rf'''(?: -# ({VAR_TYPE_SPEC}) | -# ({STRUCT}) | -# ({UNION}) -# )''' - -FUNC_START = rf'''(?: - (?: - (?: - extern | - static | - static\s+inline - )\s+ - )? - #(?:const\s+)? - {VAR_TYPE_SPEC} - )''' -#GLOBAL_VAR_START = rf'''(?: -# (?: -# (?: -# extern | -# static -# )\s+ -# )? -# (?: -# {TYPE_QUAL} -# (?:\s+{TYPE_QUAL})? -# )?\s+ -# {VAR_TYPE_SPEC} -# )''' -GLOBAL_DECL_START_RE = re.compile(rf''' - ^ - (?: - ({FUNC_START}) - ) - ''', re.VERBOSE) - -LOCAL_VAR_START = rf'''(?: - (?: - (?: - register | - static - )\s+ - )? - (?: - (?: - {TYPE_QUAL} - (?:\s+{TYPE_QUAL})? - )\s+ - )? - {VAR_TYPE_SPEC} - {POINTER}? - )''' -LOCAL_STMT_START_RE = re.compile(rf''' - ^ - (?: - ({LOCAL_VAR_START}) - ) - ''', re.VERBOSE) - - -def iter_global_declarations(lines): - """Yield (decl, body) for each global declaration in the given lines. - - For function definitions the header is reduced to one line and - the body is provided as-is. For other compound declarations (e.g. - struct) the entire declaration is reduced to one line and "body" - is None. Likewise for simple declarations (e.g. variables). - - Declarations inside function bodies are ignored, though their text - is provided in the function body. - """ - # XXX Bail out upon bogus syntax. - lines = source.iter_clean_lines(lines) - for line in lines: - if not GLOBAL_DECL_START_RE.match(line): - continue - # We only need functions here, since we only need locals for now. - if line.endswith(';'): - continue - if line.endswith('{') and '(' not in line: - continue - - # Capture the function. - # (assume no func is a one-liner) - decl = line - while '{' not in line: # assume no inline structs, etc. - try: - line = next(lines) - except StopIteration: - return - decl += ' ' + line - - body, end = _extract_block(lines) - if end is None: - return - assert end == '}' - yield (f'{decl}\n{body}\n{end}', body) - - -def iter_local_statements(lines): - """Yield (lines, blocks) for each statement in the given lines. - - For simple statements, "blocks" is None and the statement is reduced - to a single line. For compound statements, "blocks" is a pair of - (header, body) for each block in the statement. The headers are - reduced to a single line each, but the bpdies are provided as-is. - """ - # XXX Bail out upon bogus syntax. - lines = source.iter_clean_lines(lines) - for line in lines: - if not LOCAL_STMT_START_RE.match(line): - continue - - stmt = line - blocks = None - if not line.endswith(';'): - # XXX Support compound & multiline simple statements. - #blocks = [] - continue - - yield (stmt, blocks) - - -def _extract_block(lines): - end = None - depth = 1 - body = [] - for line in lines: - depth += line.count('{') - line.count('}') - if depth == 0: - end = line - break - body.append(line) - return '\n'.join(body), end - - -def parse_func(stmt, body): - """Return (name, signature) for the given function definition.""" - header, _, end = stmt.partition(body) - assert end.strip() == '}' - assert header.strip().endswith('{') - header, _, _= header.rpartition('{') - - signature = ' '.join(header.strip().splitlines()) - - _, _, name = signature.split('(')[0].strip().rpartition(' ') - assert name - - return name, signature - - -#TYPE_SPEC = rf'''(?: -# )''' -#VAR_DECLARATOR = rf'''(?: -# )''' -#VAR_DECL = rf'''(?: -# {TYPE_SPEC}+ -# {VAR_DECLARATOR} -# \s* -# )''' -#VAR_DECLARATION = rf'''(?: -# {VAR_DECL} -# (?: = [^=] [^;]* )? -# ; -# )''' -# -# -#def parse_variable(decl, *, inFunc=False): -# """Return [(name, storage, vartype)] for the given variable declaration.""" -# ... - - -def _parse_var(stmt): - """Return (name, vartype) for the given variable declaration.""" - stmt = stmt.rstrip(';') - m = LOCAL_STMT_START_RE.match(stmt) - assert m - vartype = m.group(0) - name = stmt[len(vartype):].partition('=')[0].strip() - - if name.startswith('('): - name, _, after = name[1:].partition(')') - assert after - name = name.replace('*', '* ') - inside, _, name = name.strip().rpartition(' ') - vartype = f'{vartype} ({inside.strip()}){after}' - else: - name = name.replace('*', '* ') - before, _, name = name.rpartition(' ') - vartype = f'{vartype} {before}' - - vartype = vartype.strip() - while ' ' in vartype: - vartype = vartype.replace(' ', ' ') - - return name, vartype - - -def extract_storage(decl, *, infunc=None): - """Return (storage, vartype) based on the given declaration. - - The default storage is "implicit" (or "local" if infunc is True). - """ - if decl == UNKNOWN: - return decl - if decl.startswith('static '): - return 'static' - #return 'static', decl.partition(' ')[2].strip() - elif decl.startswith('extern '): - return 'extern' - #return 'extern', decl.partition(' ')[2].strip() - elif re.match('.*\b(static|extern)\b', decl): - raise NotImplementedError - elif infunc: - return 'local' - else: - return 'implicit' - - -def parse_compound(stmt, blocks): - """Return (headers, bodies) for the given compound statement.""" - # XXX Identify declarations inside compound statements - # (if/switch/for/while). - raise NotImplementedError - - -def iter_variables(filename, *, - preprocessed=False, - _iter_source_lines=source.iter_lines, - _iter_global=iter_global_declarations, - _iter_local=iter_local_statements, - _parse_func=parse_func, - _parse_var=_parse_var, - _parse_compound=parse_compound, - ): - """Yield (funcname, name, vartype) for every variable in the given file.""" - if preprocessed: - raise NotImplementedError - lines = _iter_source_lines(filename) - for stmt, body in _iter_global(lines): - # At the file top-level we only have to worry about vars & funcs. - if not body: - name, vartype = _parse_var(stmt) - if name: - yield (None, name, vartype) - else: - funcname, _ = _parse_func(stmt, body) - localvars = _iter_locals(body, - _iter_statements=_iter_local, - _parse_var=_parse_var, - _parse_compound=_parse_compound, - ) - for name, vartype in localvars: - yield (funcname, name, vartype) - - -def _iter_locals(lines, *, - _iter_statements=iter_local_statements, - _parse_var=_parse_var, - _parse_compound=parse_compound, - ): - compound = [lines] - while compound: - body = compound.pop(0) - bodylines = body.splitlines() - for stmt, blocks in _iter_statements(bodylines): - if not blocks: - name, vartype = _parse_var(stmt) - if name: - yield (name, vartype) - else: - headers, bodies = _parse_compound(stmt, blocks) - for header in headers: - for line in header: - name, vartype = _parse_var(line) - if name: - yield (name, vartype) - compound.extend(bodies) - - -def iter_all(filename, *, - preprocessed=False, - ): - """Yield a Declaration for each one found. - - If there are duplicates, due to preprocessor conditionals, then - they are checked to make sure they are the same. - """ - # XXX For the moment we cheat. - for funcname, name, decl in iter_variables(filename, - preprocessed=preprocessed): - yield 'variable', funcname, name, decl diff --git a/Tools/c-analyzer/c_analyzer/parser/find.py b/Tools/c-analyzer/c_analyzer/parser/find.py deleted file mode 100644 index 3860d3d459b18d..00000000000000 --- a/Tools/c-analyzer/c_analyzer/parser/find.py +++ /dev/null @@ -1,107 +0,0 @@ -from ..common.info import UNKNOWN, ID - -from . import declarations - -# XXX need tests: -# * variables -# * variable -# * variable_from_id - - -def _iter_vars(filenames, preprocessed, *, - handle_id=None, - _iter_decls=declarations.iter_all, - ): - if handle_id is None: - handle_id = ID - - for filename in filenames or (): - for kind, funcname, name, decl in _iter_decls(filename, - preprocessed=preprocessed, - ): - if kind != 'variable': - continue - varid = handle_id(filename, funcname, name) - yield varid, decl - - -# XXX Add a "handle_var" arg like we did for get_resolver()? - -def variables(*filenames, - perfilecache=None, - preprocessed=False, - known=None, # for types - handle_id=None, - _iter_vars=_iter_vars, - ): - """Yield (varid, decl) for each variable found in the given files. - - If "preprocessed" is provided (and not False/None) then it is used - to decide which tool to use to parse the source code after it runs - through the C preprocessor. Otherwise the raw - """ - if len(filenames) == 1 and not (filenames[0], str): - filenames, = filenames - - if perfilecache is None: - yield from _iter_vars(filenames, preprocessed) - else: - # XXX Cache per-file variables (e.g. `{filename: [(varid, decl)]}`). - raise NotImplementedError - - -def variable(name, filenames, *, - local=False, - perfilecache=None, - preprocessed=False, - handle_id=None, - _iter_vars=variables, - ): - """Return (varid, decl) for the first found variable that matches. - - If "local" is True then the first matching local variable in the - file will always be returned. To avoid that, pass perfilecache and - pop each variable from the cache after using it. - """ - for varid, decl in _iter_vars(filenames, - perfilecache=perfilecache, - preprocessed=preprocessed, - ): - if varid.name != name: - continue - if local: - if varid.funcname: - if varid.funcname == UNKNOWN: - raise NotImplementedError - return varid, decl - elif not varid.funcname: - return varid, decl - else: - return None, None # No matching variable was found. - - -def variable_from_id(id, filenames, *, - perfilecache=None, - preprocessed=False, - handle_id=None, - _get_var=variable, - ): - """Return (varid, decl) for the first found variable that matches.""" - local = False - if isinstance(id, str): - name = id - else: - if id.funcname == UNKNOWN: - local = True - elif id.funcname: - raise NotImplementedError - - name = id.name - if id.filename and id.filename != UNKNOWN: - filenames = [id.filename] - return _get_var(name, filenames, - local=local, - perfilecache=perfilecache, - preprocessed=preprocessed, - handle_id=handle_id, - ) diff --git a/Tools/c-analyzer/c_analyzer/parser/naive.py b/Tools/c-analyzer/c_analyzer/parser/naive.py deleted file mode 100644 index 4a4822d84ff54d..00000000000000 --- a/Tools/c-analyzer/c_analyzer/parser/naive.py +++ /dev/null @@ -1,179 +0,0 @@ -import re - -from ..common.info import UNKNOWN, ID - -from .preprocessor import _iter_clean_lines - - -_NOT_SET = object() - - -def get_srclines(filename, *, - cache=None, - _open=open, - _iter_lines=_iter_clean_lines, - ): - """Return the file's lines as a list. - - Each line will have trailing whitespace removed (including newline). - - If a cache is given the it is used. - """ - if cache is not None: - try: - return cache[filename] - except KeyError: - pass - - with _open(filename) as srcfile: - srclines = [line - for _, line in _iter_lines(srcfile) - if not line.startswith('#')] - for i, line in enumerate(srclines): - srclines[i] = line.rstrip() - - if cache is not None: - cache[filename] = srclines - return srclines - - -def parse_variable_declaration(srcline): - """Return (name, decl) for the given declaration line.""" - # XXX possible false negatives... - decl, sep, _ = srcline.partition('=') - if not sep: - if not srcline.endswith(';'): - return None, None - decl = decl.strip(';') - decl = decl.strip() - m = re.match(r'.*\b(\w+)\s*(?:\[[^\]]*\])?$', decl) - if not m: - return None, None - name = m.group(1) - return name, decl - - -def parse_variable(srcline, funcname=None): - """Return (varid, decl) for the variable declared on the line (or None).""" - line = srcline.strip() - - # XXX Handle more than just static variables. - if line.startswith('static '): - if '(' in line and '[' not in line: - # a function - return None, None - return parse_variable_declaration(line) - else: - return None, None - - -def iter_variables(filename, *, - srccache=None, - parse_variable=None, - _get_srclines=get_srclines, - _default_parse_variable=parse_variable, - ): - """Yield (varid, decl) for each variable in the given source file.""" - if parse_variable is None: - parse_variable = _default_parse_variable - - indent = '' - prev = '' - funcname = None - for line in _get_srclines(filename, cache=srccache): - # remember current funcname - if funcname: - if line == indent + '}': - funcname = None - continue - else: - if '(' in prev and line == indent + '{': - if not prev.startswith('__attribute__'): - funcname = prev.split('(')[0].split()[-1] - prev = '' - continue - indent = line[:-len(line.lstrip())] - prev = line - - info = parse_variable(line, funcname) - if isinstance(info, list): - for name, _funcname, decl in info: - yield ID(filename, _funcname, name), decl - continue - name, decl = info - - if name is None: - continue - yield ID(filename, funcname, name), decl - - -def _match_varid(variable, name, funcname, ignored=None): - if ignored and variable in ignored: - return False - - if variable.name != name: - return False - - if funcname == UNKNOWN: - if not variable.funcname: - return False - elif variable.funcname != funcname: - return False - - return True - - -def find_variable(filename, funcname, name, *, - ignored=None, - srccache=None, # {filename: lines} - parse_variable=None, - _iter_variables=iter_variables, - ): - """Return the matching variable. - - Return None if the variable is not found. - """ - for varid, decl in _iter_variables(filename, - srccache=srccache, - parse_variable=parse_variable, - ): - if _match_varid(varid, name, funcname, ignored): - return varid, decl - else: - return None - - -def find_variables(varids, filenames=None, *, - srccache=_NOT_SET, - parse_variable=None, - _find_symbol=find_variable, - ): - """Yield (varid, decl) for each ID. - - If the variable is not found then its decl will be UNKNOWN. That - way there will be one resulting variable per given ID. - """ - if srccache is _NOT_SET: - srccache = {} - - used = set() - for varid in varids: - if varid.filename and varid.filename != UNKNOWN: - srcfiles = [varid.filename] - else: - if not filenames: - yield varid, UNKNOWN - continue - srcfiles = filenames - for filename in srcfiles: - varid, decl = _find_varid(filename, varid.funcname, varid.name, - ignored=used, - srccache=srccache, - parse_variable=parse_variable, - ) - if varid: - yield varid, decl - used.add(varid) - break - else: - yield varid, UNKNOWN diff --git a/Tools/c-analyzer/c_analyzer/parser/preprocessor.py b/Tools/c-analyzer/c_analyzer/parser/preprocessor.py deleted file mode 100644 index 41f306e5f8022b..00000000000000 --- a/Tools/c-analyzer/c_analyzer/parser/preprocessor.py +++ /dev/null @@ -1,511 +0,0 @@ -from collections import namedtuple -import shlex -import os -import re - -from ..common import util, info - - -CONTINUATION = '\\' + os.linesep - -IDENTIFIER = r'(?:\w*[a-zA-Z]\w*)' -IDENTIFIER_RE = re.compile('^' + IDENTIFIER + '$') - - -def _coerce_str(value): - if not value: - return '' - return str(value).strip() - - -############################# -# directives - -DIRECTIVE_START = r''' - (?: - ^ \s* - [#] \s* - )''' -DIRECTIVE_TEXT = r''' - (?: - (?: \s+ ( .*\S ) )? - \s* $ - )''' -DIRECTIVE = rf''' - (?: - {DIRECTIVE_START} - ( - include | - error | warning | - pragma | - define | undef | - if | ifdef | ifndef | elseif | else | endif | - __FILE__ | __LINE__ | __DATE __ | __TIME__ | __TIMESTAMP__ - ) - {DIRECTIVE_TEXT} - )''' -# (?: -# [^\\\n] | -# \\ [^\n] | -# \\ \n -# )+ -# ) \n -# )''' -DIRECTIVE_RE = re.compile(DIRECTIVE, re.VERBOSE) - -DEFINE = rf''' - (?: - {DIRECTIVE_START} define \s+ - (?: - ( \w*[a-zA-Z]\w* ) - (?: \s* [(] ([^)]*) [)] )? - ) - {DIRECTIVE_TEXT} - )''' -DEFINE_RE = re.compile(DEFINE, re.VERBOSE) - - -def parse_directive(line): - """Return the appropriate directive for the given line.""" - line = line.strip() - if line.startswith('#'): - line = line[1:].lstrip() - line = '#' + line - directive = line - #directive = '#' + line - while ' ' in directive: - directive = directive.replace(' ', ' ') - return _parse_directive(directive) - - -def _parse_directive(line): - m = DEFINE_RE.match(line) - if m: - name, args, text = m.groups() - if args: - args = [a.strip() for a in args.split(',')] - return Macro(name, args, text) - else: - return Constant(name, text) - - m = DIRECTIVE_RE.match(line) - if not m: - raise ValueError(f'unsupported directive {line!r}') - kind, text = m.groups() - if not text: - if kind not in ('else', 'endif'): - raise ValueError(f'missing text in directive {line!r}') - elif kind in ('else', 'endif', 'define'): - raise ValueError(f'unexpected text in directive {line!r}') - if kind == 'include': - directive = Include(text) - elif kind in IfDirective.KINDS: - directive = IfDirective(kind, text) - else: - directive = OtherDirective(kind, text) - directive.validate() - return directive - - -class PreprocessorDirective(util._NTBase): - """The base class for directives.""" - - __slots__ = () - - KINDS = frozenset([ - 'include', - 'pragma', - 'error', 'warning', - 'define', 'undef', - 'if', 'ifdef', 'ifndef', 'elseif', 'else', 'endif', - '__FILE__', '__DATE__', '__LINE__', '__TIME__', '__TIMESTAMP__', - ]) - - @property - def text(self): - return ' '.join(v for v in self[1:] if v and v.strip()) or None - - def validate(self): - """Fail if the object is invalid (i.e. init with bad data).""" - super().validate() - - if not self.kind: - raise TypeError('missing kind') - elif self.kind not in self.KINDS: - raise ValueError - - # text can be anything, including None. - - -class Constant(PreprocessorDirective, - namedtuple('Constant', 'kind name value')): - """A single "constant" directive ("define").""" - - __slots__ = () - - def __new__(cls, name, value=None): - self = super().__new__( - cls, - 'define', - name=_coerce_str(name) or None, - value=_coerce_str(value) or None, - ) - return self - - def validate(self): - """Fail if the object is invalid (i.e. init with bad data).""" - super().validate() - - if not self.name: - raise TypeError('missing name') - elif not IDENTIFIER_RE.match(self.name): - raise ValueError(f'name must be identifier, got {self.name!r}') - - # value can be anything, including None - - -class Macro(PreprocessorDirective, - namedtuple('Macro', 'kind name args body')): - """A single "macro" directive ("define").""" - - __slots__ = () - - def __new__(cls, name, args, body=None): - # "args" must be a string or an iterable of strings (or "empty"). - if isinstance(args, str): - args = [v.strip() for v in args.split(',')] - if args: - args = tuple(_coerce_str(a) or None for a in args) - self = super().__new__( - cls, - kind='define', - name=_coerce_str(name) or None, - args=args if args else (), - body=_coerce_str(body) or None, - ) - return self - - @property - def text(self): - if self.body: - return f'{self.name}({", ".join(self.args)}) {self.body}' - else: - return f'{self.name}({", ".join(self.args)})' - - def validate(self): - """Fail if the object is invalid (i.e. init with bad data).""" - super().validate() - - if not self.name: - raise TypeError('missing name') - elif not IDENTIFIER_RE.match(self.name): - raise ValueError(f'name must be identifier, got {self.name!r}') - - for arg in self.args: - if not arg: - raise ValueError(f'missing arg in {self.args}') - elif not IDENTIFIER_RE.match(arg): - raise ValueError(f'arg must be identifier, got {arg!r}') - - # body can be anything, including None - - -class IfDirective(PreprocessorDirective, - namedtuple('IfDirective', 'kind condition')): - """A single conditional directive (e.g. "if", "ifdef"). - - This only includes directives that actually provide conditions. The - related directives "else" and "endif" are covered by OtherDirective - instead. - """ - - __slots__ = () - - KINDS = frozenset([ - 'if', - 'ifdef', - 'ifndef', - 'elseif', - ]) - - @classmethod - def _condition_from_raw(cls, raw, kind): - #return Condition.from_raw(raw, _kind=kind) - condition = _coerce_str(raw) - if not condition: - return None - - if kind == 'ifdef': - condition = f'defined({condition})' - elif kind == 'ifndef': - condition = f'! defined({condition})' - - return condition - - def __new__(cls, kind, condition): - kind = _coerce_str(kind) - self = super().__new__( - cls, - kind=kind or None, - condition=cls._condition_from_raw(condition, kind), - ) - return self - - @property - def text(self): - if self.kind == 'ifdef': - return self.condition[8:-1] # strip "defined(" - elif self.kind == 'ifndef': - return self.condition[10:-1] # strip "! defined(" - else: - return self.condition - #return str(self.condition) - - def validate(self): - """Fail if the object is invalid (i.e. init with bad data).""" - super().validate() - - if not self.condition: - raise TypeError('missing condition') - #else: - # for cond in self.condition: - # if not cond: - # raise ValueError(f'missing condition in {self.condition}') - # cond.validate() - # if self.kind in ('ifdef', 'ifndef'): - # if len(self.condition) != 1: - # raise ValueError('too many condition') - # if self.kind == 'ifdef': - # if not self.condition[0].startswith('defined '): - # raise ValueError('bad condition') - # else: - # if not self.condition[0].startswith('! defined '): - # raise ValueError('bad condition') - - -class Include(PreprocessorDirective, - namedtuple('Include', 'kind file')): - """A single "include" directive. - - Supported "file" values are either follow the bracket style - () or double quotes ("spam.h"). - """ - - __slots__ = () - - def __new__(cls, file): - self = super().__new__( - cls, - kind='include', - file=_coerce_str(file) or None, - ) - return self - - def validate(self): - """Fail if the object is invalid (i.e. init with bad data).""" - super().validate() - - if not self.file: - raise TypeError('missing file') - - -class OtherDirective(PreprocessorDirective, - namedtuple('OtherDirective', 'kind text')): - """A single directive not covered by another class. - - This includes the "else", "endif", and "undef" directives, which are - otherwise inherently related to the directives covered by the - Constant, Macro, and IfCondition classes. - - Note that all directives must have a text value, except for "else" - and "endif" (which must have no text). - """ - - __slots__ = () - - KINDS = PreprocessorDirective.KINDS - {'include', 'define'} - IfDirective.KINDS - - def __new__(cls, kind, text): - self = super().__new__( - cls, - kind=_coerce_str(kind) or None, - text=_coerce_str(text) or None, - ) - return self - - def validate(self): - """Fail if the object is invalid (i.e. init with bad data).""" - super().validate() - - if self.text: - if self.kind in ('else', 'endif'): - raise ValueError('unexpected text in directive') - elif self.kind not in ('else', 'endif'): - raise TypeError('missing text') - - -############################# -# iterating lines - -def _recompute_conditions(directive, ifstack): - if directive.kind in ('if', 'ifdef', 'ifndef'): - ifstack.append( - ([], directive.condition)) - elif directive.kind == 'elseif': - if ifstack: - negated, active = ifstack.pop() - if active: - negated.append(active) - else: - negated = [] - ifstack.append( - (negated, directive.condition)) - elif directive.kind == 'else': - if ifstack: - negated, active = ifstack.pop() - if active: - negated.append(active) - ifstack.append( - (negated, None)) - elif directive.kind == 'endif': - if ifstack: - ifstack.pop() - - conditions = [] - for negated, active in ifstack: - for condition in negated: - conditions.append(f'! ({condition})') - if active: - conditions.append(active) - return tuple(conditions) - - -def _iter_clean_lines(lines): - lines = iter(enumerate(lines, 1)) - for lno, line in lines: - # Handle line continuations. - while line.endswith(CONTINUATION): - try: - lno, _line = next(lines) - except StopIteration: - break - line = line[:-len(CONTINUATION)] + ' ' + _line - - # Deal with comments. - after = line - line = '' - while True: - # Look for a comment. - before, begin, remainder = after.partition('/*') - if '//' in before: - before, _, _ = before.partition('//') - line += before + ' ' # per the C99 spec - break - line += before - if not begin: - break - line += ' ' # per the C99 spec - - # Go until we find the end of the comment. - _, end, after = remainder.partition('*/') - while not end: - try: - lno, remainder = next(lines) - except StopIteration: - raise Exception('unterminated comment') - _, end, after = remainder.partition('*/') - - yield lno, line - - -def iter_lines(lines, *, - _iter_clean_lines=_iter_clean_lines, - _parse_directive=_parse_directive, - _recompute_conditions=_recompute_conditions, - ): - """Yield (lno, line, directive, active conditions) for each given line. - - This is effectively a subset of the operations taking place in - translation phases 2-4 from the C99 spec (ISO/IEC 9899:TC2); see - section 5.1.1.2. Line continuations are removed and comments - replaced with a single space. (In both cases "lno" will be the last - line involved.) Otherwise each line is returned as-is. - - "lno" is the (1-indexed) line number for the line. - - "directive" will be a PreprocessorDirective or None, depending on - whether or not there is a directive on the line. - - "active conditions" is the set of preprocessor conditions (e.g. - "defined()") under which the current line of code will be included - in compilation. That set is derived from every conditional - directive block (e.g. "if defined()", "ifdef", "else") containing - that line. That includes nested directives. Note that the - current line does not affect the active conditions for iteself. - It only impacts subsequent lines. That applies to directives - that close blocks (e.g. "endif") just as much as conditional - directvies. Also note that "else" and "elseif" directives - update the active conditions (for later lines), rather than - adding to them. - """ - ifstack = [] - conditions = () - for lno, line in _iter_clean_lines(lines): - stripped = line.strip() - if not stripped.startswith('#'): - yield lno, line, None, conditions - continue - - directive = '#' + stripped[1:].lstrip() - while ' ' in directive: - directive = directive.replace(' ', ' ') - directive = _parse_directive(directive) - yield lno, line, directive, conditions - - if directive.kind in ('else', 'endif'): - conditions = _recompute_conditions(directive, ifstack) - elif isinstance(directive, IfDirective): - conditions = _recompute_conditions(directive, ifstack) - - -############################# -# running (platform-specific?) - -def _gcc(filename, *, - _get_argv=(lambda: _get_gcc_argv()), - _run=util.run_cmd, - ): - argv = _get_argv() - argv.extend([ - '-E', filename, - ]) - output = _run(argv) - return output - - -def _get_gcc_argv(*, - _open=open, - _run=util.run_cmd, - ): - with _open('/tmp/print.mk', 'w') as tmpfile: - tmpfile.write('print-%:\n') - #tmpfile.write('\t@echo $* = $($*)\n') - tmpfile.write('\t@echo $($*)\n') - argv = ['/usr/bin/make', - '-f', 'Makefile', - '-f', '/tmp/print.mk', - 'print-CC', - 'print-PY_CORE_CFLAGS', - ] - output = _run(argv) - gcc, cflags = output.strip().splitlines() - argv = shlex.split(gcc.strip()) - cflags = shlex.split(cflags.strip()) - return argv + cflags - - -def run(filename, *, - _gcc=_gcc, - ): - """Return the text of the given file after running the preprocessor.""" - return _gcc(filename) diff --git a/Tools/c-analyzer/c_analyzer/parser/source.py b/Tools/c-analyzer/c_analyzer/parser/source.py deleted file mode 100644 index f8998c8a338b20..00000000000000 --- a/Tools/c-analyzer/c_analyzer/parser/source.py +++ /dev/null @@ -1,34 +0,0 @@ -from . import preprocessor - - -def iter_clean_lines(lines): - incomment = False - for line in lines: - # Deal with comments. - if incomment: - _, sep, line = line.partition('*/') - if sep: - incomment = False - continue - line, _, _ = line.partition('//') - line, sep, remainder = line.partition('/*') - if sep: - _, sep, after = remainder.partition('*/') - if not sep: - incomment = True - continue - line += ' ' + after - - # Ignore blank lines and leading/trailing whitespace. - line = line.strip() - if not line: - continue - - yield line - - -def iter_lines(filename, *, - preprocess=preprocessor.run, - ): - content = preprocess(filename) - return iter(content.splitlines()) diff --git a/Tools/c-analyzer/c_analyzer/symbols/__init__.py b/Tools/c-analyzer/c_analyzer/symbols/__init__.py deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/Tools/c-analyzer/c_analyzer/symbols/_nm.py b/Tools/c-analyzer/c_analyzer/symbols/_nm.py deleted file mode 100644 index f3a75a6d4ba824..00000000000000 --- a/Tools/c-analyzer/c_analyzer/symbols/_nm.py +++ /dev/null @@ -1,117 +0,0 @@ -import os.path -import shutil - -from c_analyzer.common import util, info - -from .info import Symbol - - -# XXX need tests: -# * iter_symbols - -NM_KINDS = { - 'b': Symbol.KIND.VARIABLE, # uninitialized - 'd': Symbol.KIND.VARIABLE, # initialized - #'g': Symbol.KIND.VARIABLE, # uninitialized - #'s': Symbol.KIND.VARIABLE, # initialized - 't': Symbol.KIND.FUNCTION, - } - -SPECIAL_SYMBOLS = { - # binary format (e.g. ELF) - '__bss_start', - '__data_start', - '__dso_handle', - '_DYNAMIC', - '_edata', - '_end', - '__environ@@GLIBC_2.2.5', - '_GLOBAL_OFFSET_TABLE_', - '__JCR_END__', - '__JCR_LIST__', - '__TMC_END__', - } - - -def _is_special_symbol(name): - if name in SPECIAL_SYMBOLS: - return True - if '@@GLIBC' in name: - return True - return False - - -def iter_symbols(binfile, *, - nm=None, - handle_id=None, - _which=shutil.which, - _run=util.run_cmd, - ): - """Yield a Symbol for each relevant entry reported by the "nm" command.""" - if nm is None: - nm = _which('nm') - if not nm: - raise NotImplementedError - if handle_id is None: - handle_id = info.ID - - argv = [nm, - '--line-numbers', - binfile, - ] - try: - output = _run(argv) - except Exception: - if nm is None: - # XXX Use dumpbin.exe /SYMBOLS on Windows. - raise NotImplementedError - raise - for line in output.splitlines(): - (name, kind, external, filename, funcname, - ) = _parse_nm_line(line) - if kind != Symbol.KIND.VARIABLE: - continue - elif _is_special_symbol(name): - continue - yield Symbol( - id=handle_id(filename, funcname, name), - kind=kind, - external=external, - ) - - -def _parse_nm_line(line): - _origline = line - _, _, line = line.partition(' ') # strip off the address - line = line.strip() - - kind, _, line = line.partition(' ') - line = line.strip() - external = kind.isupper() - kind = NM_KINDS.get(kind.lower(), Symbol.KIND.OTHER) - - name, _, filename = line.partition('\t') - name = name.strip() - if filename: - filename = os.path.relpath(filename.partition(':')[0]) - else: - filename = info.UNKNOWN - - name, islocal = _parse_nm_name(name, kind) - funcname = info.UNKNOWN if islocal else None - return name, kind, external, filename, funcname - - -def _parse_nm_name(name, kind): - if kind != Symbol.KIND.VARIABLE: - return name, None - if _is_special_symbol(name): - return name, None - - actual, sep, digits = name.partition('.') - if not sep: - return name, False - - if not digits.isdigit(): - raise Exception(f'got bogus name {name}') - return actual, True diff --git a/Tools/c-analyzer/c_analyzer/symbols/find.py b/Tools/c-analyzer/c_analyzer/symbols/find.py deleted file mode 100644 index 85646523f7a60b..00000000000000 --- a/Tools/c-analyzer/c_analyzer/symbols/find.py +++ /dev/null @@ -1,175 +0,0 @@ -import os -import os.path -import shutil - -from ..common import files -from ..common.info import UNKNOWN, ID -from ..parser import find as p_find - -from . import _nm -from .info import Symbol - -# XXX need tests: -# * get_resolver() -# * get_resolver_from_dirs() -# * symbol() -# * symbols() -# * variables() - - -def _resolve_known(symbol, knownvars): - for varid in knownvars: - if symbol.match(varid): - break - else: - return None - return knownvars.pop(varid) - - -def get_resolver(filenames=None, known=None, *, - handle_var, - check_filename=None, - perfilecache=None, - preprocessed=False, - _from_source=p_find.variable_from_id, - ): - """Return a "resolver" func for the given known vars/types and filenames. - - "handle_var" is a callable that takes (ID, decl) and returns a - Variable. Variable.from_id is a suitable callable. - - The returned func takes a single Symbol and returns a corresponding - Variable. If the symbol was located then the variable will be - valid, populated with the corresponding information. Otherwise None - is returned. - """ - knownvars = (known or {}).get('variables') - if knownvars: - knownvars = dict(knownvars) # a copy - if filenames: - if check_filename is None: - filenames = list(filenames) - def check_filename(filename): - return filename in filenames - def resolve(symbol): - # XXX Check "found" instead? - if not check_filename(symbol.filename): - return None - found = _resolve_known(symbol, knownvars) - if found is None: - #return None - varid, decl = _from_source(symbol, filenames, - perfilecache=perfilecache, - preprocessed=preprocessed, - ) - found = handle_var(varid, decl) - return found - else: - def resolve(symbol): - return _resolve_known(symbol, knownvars) - elif filenames: - def resolve(symbol): - varid, decl = _from_source(symbol, filenames, - perfilecache=perfilecache, - preprocessed=preprocessed, - ) - return handle_var(varid, decl) - else: - def resolve(symbol): - return None - return resolve - - -def get_resolver_from_dirs(dirnames, known=None, *, - handle_var, - suffixes=('.c',), - perfilecache=None, - preprocessed=False, - _iter_files=files.iter_files_by_suffix, - _get_resolver=get_resolver, - ): - """Return a "resolver" func for the given known vars/types and filenames. - - "dirnames" should be absolute paths. If not then they will be - resolved relative to CWD. - - See get_resolver(). - """ - dirnames = [d if d.endswith(os.path.sep) else d + os.path.sep - for d in dirnames] - filenames = _iter_files(dirnames, suffixes) - def check_filename(filename): - for dirname in dirnames: - if filename.startswith(dirname): - return True - else: - return False - return _get_resolver(filenames, known, - handle_var=handle_var, - check_filename=check_filename, - perfilecache=perfilecache, - preprocessed=preprocessed, - ) - - -def symbol(symbol, filenames, known=None, *, - perfilecache=None, - preprocessed=False, - handle_id=None, - _get_resolver=get_resolver, - ): - """Return a Variable for the one matching the given symbol. - - "symbol" can be one of several objects: - - * Symbol - use the contained info - * name (str) - look for a global variable with that name - * (filename, name) - look for named global in file - * (filename, funcname, name) - look for named local in file - - A name is always required. If the filename is None, "", or - "UNKNOWN" then all files will be searched. If the funcname is - "" or "UNKNOWN" then only local variables will be searched for. - """ - resolve = _get_resolver(known, filenames, - handle_id=handle_id, - perfilecache=perfilecache, - preprocessed=preprocessed, - ) - return resolve(symbol) - - -def _get_platform_tool(): - if os.name == 'nt': - # XXX Support this. - raise NotImplementedError - elif nm := shutil.which('nm'): - return lambda b, hi: _nm.iter_symbols(b, nm=nm, handle_id=hi) - else: - raise NotImplementedError - - -def symbols(binfile, *, - handle_id=None, - _file_exists=os.path.exists, - _get_platform_tool=_get_platform_tool, - ): - """Yield a Symbol for each one found in the binary.""" - if not _file_exists(binfile): - raise Exception('executable missing (need to build it first?)') - - _iter_symbols = _get_platform_tool() - yield from _iter_symbols(binfile, handle_id) - - -def variables(binfile, *, - resolve, - handle_id=None, - _iter_symbols=symbols, - ): - """Yield (Variable, Symbol) for each found symbol.""" - for symbol in _iter_symbols(binfile, handle_id=handle_id): - if symbol.kind != Symbol.KIND.VARIABLE: - continue - var = resolve(symbol) or None - yield var, symbol diff --git a/Tools/c-analyzer/c_analyzer/symbols/info.py b/Tools/c-analyzer/c_analyzer/symbols/info.py deleted file mode 100644 index 96a251abb7c7fd..00000000000000 --- a/Tools/c-analyzer/c_analyzer/symbols/info.py +++ /dev/null @@ -1,51 +0,0 @@ -from collections import namedtuple - -from c_analyzer.common.info import ID -from c_analyzer.common.util import classonly, _NTBase - - -class Symbol(_NTBase, namedtuple('Symbol', 'id kind external')): - """Info for a single compilation symbol.""" - - __slots__ = () - - class KIND: - VARIABLE = 'variable' - FUNCTION = 'function' - OTHER = 'other' - - @classonly - def from_name(cls, name, filename=None, kind=KIND.VARIABLE, external=None): - """Return a new symbol based on the given name.""" - id = ID(filename, None, name) - return cls(id, kind, external) - - def __new__(cls, id, kind=KIND.VARIABLE, external=None): - self = super().__new__( - cls, - id=ID.from_raw(id), - kind=str(kind) if kind else None, - external=bool(external) if external is not None else None, - ) - return self - - def __hash__(self): - return hash(self.id) - - def __getattr__(self, name): - return getattr(self.id, name) - - def validate(self): - """Fail if the object is invalid (i.e. init with bad data).""" - if not self.id: - raise TypeError('missing id') - else: - self.id.validate() - - if not self.kind: - raise TypeError('missing kind') - elif self.kind not in vars(self.KIND).values(): - raise ValueError(f'unsupported kind {self.kind}') - - if self.external is None: - raise TypeError('missing external') diff --git a/Tools/c-analyzer/c_analyzer/variables/__init__.py b/Tools/c-analyzer/c_analyzer/variables/__init__.py deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/Tools/c-analyzer/c_analyzer/variables/find.py b/Tools/c-analyzer/c_analyzer/variables/find.py deleted file mode 100644 index 3fe7284fc00a79..00000000000000 --- a/Tools/c-analyzer/c_analyzer/variables/find.py +++ /dev/null @@ -1,75 +0,0 @@ -from ..common import files -from ..common.info import UNKNOWN -from ..parser import ( - find as p_find, - ) -from ..symbols import ( - info as s_info, - find as s_find, - ) -from .info import Variable - -# XXX need tests: -# * vars_from_source - - -def _remove_cached(cache, var): - if not cache: - return - try: - cached = cache[var.filename] - cached.remove(var) - except (KeyError, IndexError): - pass - - -def vars_from_binary(binfile, *, - known=None, - filenames=None, - handle_id=None, - check_filename=None, - handle_var=Variable.from_id, - _iter_vars=s_find.variables, - _get_symbol_resolver=s_find.get_resolver, - ): - """Yield a Variable for each found Symbol. - - Details are filled in from the given "known" variables and types. - """ - cache = {} - resolve = _get_symbol_resolver(filenames, known, - handle_var=handle_var, - check_filename=check_filename, - perfilecache=cache, - ) - for var, symbol in _iter_vars(binfile, - resolve=resolve, - handle_id=handle_id, - ): - if var is None: - var = Variable(symbol.id, UNKNOWN, UNKNOWN) - yield var - _remove_cached(cache, var) - - -def vars_from_source(filenames, *, - preprocessed=None, - known=None, - handle_id=None, - handle_var=Variable.from_id, - iter_vars=p_find.variables, - ): - """Yield a Variable for each declaration in the raw source code. - - Details are filled in from the given "known" variables and types. - """ - cache = {} - for varid, decl in iter_vars(filenames or (), - perfilecache=cache, - preprocessed=preprocessed, - known=known, - handle_id=handle_id, - ): - var = handle_var(varid, decl) - yield var - _remove_cached(cache, var) diff --git a/Tools/c-analyzer/c_analyzer/variables/info.py b/Tools/c-analyzer/c_analyzer/variables/info.py deleted file mode 100644 index 336a523c7a2dba..00000000000000 --- a/Tools/c-analyzer/c_analyzer/variables/info.py +++ /dev/null @@ -1,93 +0,0 @@ -from collections import namedtuple - -from ..common.info import ID, UNKNOWN -from ..common.util import classonly, _NTBase - - -def normalize_vartype(vartype): - """Return the canonical form for a variable type (or func signature).""" - # We allow empty strring through for semantic reasons. - if vartype is None: - return None - - # XXX finish! - # XXX Return (modifiers, type, pointer)? - return str(vartype) - - -# XXX Variable.vartype -> decl (Declaration). - -class Variable(_NTBase, - namedtuple('Variable', 'id storage vartype')): - """Information about a single variable declaration.""" - - __slots__ = () - - STORAGE = ( - 'static', - 'extern', - 'implicit', - 'local', - ) - - @classonly - def from_parts(cls, filename, funcname, name, decl, storage=None): - varid = ID(filename, funcname, name) - if storage is None: - self = cls.from_id(varid, decl) - else: - self = cls(varid, storage, decl) - return self - - @classonly - def from_id(cls, varid, decl): - from ..parser.declarations import extract_storage - storage = extract_storage(decl, infunc=varid.funcname) - return cls(varid, storage, decl) - - def __new__(cls, id, storage, vartype): - self = super().__new__( - cls, - id=ID.from_raw(id), - storage=str(storage) if storage else None, - vartype=normalize_vartype(vartype) if vartype else None, - ) - return self - - def __hash__(self): - return hash(self.id) - - def __getattr__(self, name): - return getattr(self.id, name) - - def _validate_id(self): - if not self.id: - raise TypeError('missing id') - - if not self.filename or self.filename == UNKNOWN: - raise TypeError(f'id missing filename ({self.id})') - - if self.funcname and self.funcname == UNKNOWN: - raise TypeError(f'id missing funcname ({self.id})') - - self.id.validate() - - def validate(self): - """Fail if the object is invalid (i.e. init with bad data).""" - self._validate_id() - - if self.storage is None or self.storage == UNKNOWN: - raise TypeError('missing storage') - elif self.storage not in self.STORAGE: - raise ValueError(f'unsupported storage {self.storage:r}') - - if self.vartype is None or self.vartype == UNKNOWN: - raise TypeError('missing vartype') - - @property - def isglobal(self): - return self.storage != 'local' - - @property - def isconst(self): - return 'const' in self.vartype.split() diff --git a/Tools/c-analyzer/c_analyzer/variables/known.py b/Tools/c-analyzer/c_analyzer/variables/known.py deleted file mode 100644 index aa2934a069e16b..00000000000000 --- a/Tools/c-analyzer/c_analyzer/variables/known.py +++ /dev/null @@ -1,91 +0,0 @@ -import csv - -from ..common.info import ID, UNKNOWN -from ..common.util import read_tsv -from .info import Variable - - -# XXX need tests: -# * read_file() -# * look_up_variable() - - -COLUMNS = ('filename', 'funcname', 'name', 'kind', 'declaration') -HEADER = '\t'.join(COLUMNS) - - -def read_file(infile, *, - _read_tsv=read_tsv, - ): - """Yield (kind, id, decl) for each row in the data file. - - The caller is responsible for validating each row. - """ - for row in _read_tsv(infile, HEADER): - filename, funcname, name, kind, declaration = row - if not funcname or funcname == '-': - funcname = None - id = ID(filename, funcname, name) - yield kind, id, declaration - - -def from_file(infile, *, - handle_var=Variable.from_id, - _read_file=read_file, - ): - """Return the info for known declarations in the given file.""" - known = { - 'variables': {}, - #'types': {}, - #'constants': {}, - #'macros': {}, - } - for kind, id, decl in _read_file(infile): - if kind == 'variable': - values = known['variables'] - value = handle_var(id, decl) - else: - raise ValueError(f'unsupported kind in row {row}') - value.validate() - values[id] = value - return known - - -def look_up_variable(varid, knownvars, *, - match_files=(lambda f1, f2: f1 == f2), - ): - """Return the known Variable matching the given ID. - - "knownvars" is a mapping of ID to Variable. - - "match_files" is used to verify if two filenames point to - the same file. - - If no match is found then None is returned. - """ - if not knownvars: - return None - - if varid.funcname == UNKNOWN: - if not varid.filename or varid.filename == UNKNOWN: - for varid in knownvars: - if not varid.funcname: - continue - if varid.name == varid.name: - return knownvars[varid] - else: - return None - else: - for varid in knownvars: - if not varid.funcname: - continue - if not match_files(varid.filename, varid.filename): - continue - if varid.name == varid.name: - return knownvars[varid] - else: - return None - elif not varid.filename or varid.filename == UNKNOWN: - raise NotImplementedError - else: - return knownvars.get(varid.id) diff --git a/Tools/c-analyzer/c_common/__init__.py b/Tools/c-analyzer/c_common/__init__.py new file mode 100644 index 00000000000000..a4c3bb24230f25 --- /dev/null +++ b/Tools/c-analyzer/c_common/__init__.py @@ -0,0 +1,2 @@ + +NOT_SET = object() diff --git a/Tools/c-analyzer/c_analyzer/common/util.py b/Tools/c-analyzer/c_common/clsutil.py similarity index 51% rename from Tools/c-analyzer/c_analyzer/common/util.py rename to Tools/c-analyzer/c_common/clsutil.py index 43d0bb6e66565a..aa5f6b9831d4a6 100644 --- a/Tools/c-analyzer/c_analyzer/common/util.py +++ b/Tools/c-analyzer/c_common/clsutil.py @@ -1,70 +1,7 @@ -import csv -import subprocess - _NOT_SET = object() -def run_cmd(argv, **kwargs): - proc = subprocess.run( - argv, - #capture_output=True, - #stderr=subprocess.STDOUT, - stdout=subprocess.PIPE, - text=True, - check=True, - **kwargs - ) - return proc.stdout - - -def read_tsv(infile, header, *, - _open=open, - _get_reader=csv.reader, - ): - """Yield each row of the given TSV (tab-separated) file.""" - if isinstance(infile, str): - with _open(infile, newline='') as infile: - yield from read_tsv(infile, header, - _open=_open, - _get_reader=_get_reader, - ) - return - lines = iter(infile) - - # Validate the header. - try: - actualheader = next(lines).strip() - except StopIteration: - actualheader = '' - if actualheader != header: - raise ValueError(f'bad header {actualheader!r}') - - for row in _get_reader(lines, delimiter='\t'): - yield tuple(v.strip() for v in row) - - -def write_tsv(outfile, header, rows, *, - _open=open, - _get_writer=csv.writer, - ): - """Write each of the rows to the given TSV (tab-separated) file.""" - if isinstance(outfile, str): - with _open(outfile, 'w', newline='') as outfile: - return write_tsv(outfile, header, rows, - _open=_open, - _get_writer=_get_writer, - ) - - if isinstance(header, str): - header = header.split('\t') - writer = _get_writer(outfile, delimiter='\t') - writer.writerow(header) - for row in rows: - writer.writerow('' if v is None else str(v) - for v in row) - - class Slot: """A descriptor that provides a slot. @@ -178,66 +115,3 @@ def __get__(self, obj, cls): raise AttributeError(self.name) # called on the class return self.getter(None, cls) - - -class _NTBase: - - __slots__ = () - - @classonly - def from_raw(cls, raw): - if not raw: - return None - elif isinstance(raw, cls): - return raw - elif isinstance(raw, str): - return cls.from_string(raw) - else: - if hasattr(raw, 'items'): - return cls(**raw) - try: - args = tuple(raw) - except TypeError: - pass - else: - return cls(*args) - raise NotImplementedError - - @classonly - def from_string(cls, value): - """Return a new instance based on the given string.""" - raise NotImplementedError - - @classmethod - def _make(cls, iterable): # The default _make() is not subclass-friendly. - return cls.__new__(cls, *iterable) - - # XXX Always validate? - #def __init__(self, *args, **kwargs): - # self.validate() - - # XXX The default __repr__() is not subclass-friendly (where the name changes). - #def __repr__(self): - # _, _, sig = super().__repr__().partition('(') - # return f'{self.__class__.__name__}({sig}' - - # To make sorting work with None: - def __lt__(self, other): - try: - return super().__lt__(other) - except TypeError: - if None in self: - return True - elif None in other: - return False - else: - raise - - def validate(self): - return - - # XXX Always validate? - #def _replace(self, **kwargs): - # obj = super()._replace(**kwargs) - # obj.validate() - # return obj diff --git a/Tools/c-analyzer/c_common/fsutil.py b/Tools/c-analyzer/c_common/fsutil.py new file mode 100644 index 00000000000000..56023f33523b0d --- /dev/null +++ b/Tools/c-analyzer/c_common/fsutil.py @@ -0,0 +1,388 @@ +import fnmatch +import glob +import os +import os.path +import shutil +import stat + +from .iterutil import iter_many + + +C_SOURCE_SUFFIXES = ('.c', '.h') + + +def create_backup(old, backup=None): + if isinstance(old, str): + filename = old + else: + filename = getattr(old, 'name', None) + if not filename: + return None + if not backup or backup is True: + backup = f'{filename}.bak' + try: + shutil.copyfile(filename, backup) + except FileNotFoundError as exc: + if exc.filename != filename: + raise # re-raise + backup = None + return backup + + +################################## +# find files + +def match_glob(filename, pattern): + if fnmatch.fnmatch(filename, pattern): + return True + + # fnmatch doesn't handle ** quite right. It will not match the + # following: + # + # ('x/spam.py', 'x/**/*.py') + # ('spam.py', '**/*.py') + # + # though it *will* match the following: + # + # ('x/y/spam.py', 'x/**/*.py') + # ('x/spam.py', '**/*.py') + + if '**/' not in pattern: + return False + + # We only accommodate the single-"**" case. + return fnmatch.fnmatch(filename, pattern.replace('**/', '', 1)) + + +def iter_filenames(filenames, *, + start=None, + include=None, + exclude=None, + ): + onempty = Exception('no filenames provided') + for filename, solo in iter_many(filenames, onempty): + check, start = _get_check(filename, start, include, exclude) + yield filename, check, solo +# filenames = iter(filenames or ()) +# try: +# first = next(filenames) +# except StopIteration: +# raise Exception('no filenames provided') +# try: +# second = next(filenames) +# except StopIteration: +# check, _ = _get_check(first, start, include, exclude) +# yield first, check, False +# return +# +# check, start = _get_check(first, start, include, exclude) +# yield first, check, True +# check, start = _get_check(second, start, include, exclude) +# yield second, check, True +# for filename in filenames: +# check, start = _get_check(filename, start, include, exclude) +# yield filename, check, True + + +def expand_filenames(filenames): + for filename in filenames: + # XXX Do we need to use glob.escape (a la commit 9355868458, GH-20994)? + if '**/' in filename: + yield from glob.glob(filename.replace('**/', '')) + yield from glob.glob(filename) + + +def _get_check(filename, start, include, exclude): + if start and filename != start: + return (lambda: ''), start + else: + def check(): + if _is_excluded(filename, exclude, include): + return '' + return None + return check, None + + +def _is_excluded(filename, exclude, include): + if include: + for included in include: + if match_glob(filename, included): + return False + return True + elif exclude: + for excluded in exclude: + if match_glob(filename, excluded): + return True + return False + else: + return False + + +def _walk_tree(root, *, + _walk=os.walk, + ): + # A wrapper around os.walk that resolves the filenames. + for parent, _, names in _walk(root): + for name in names: + yield os.path.join(parent, name) + + +def walk_tree(root, *, + suffix=None, + walk=_walk_tree, + ): + """Yield each file in the tree under the given directory name. + + If "suffix" is provided then only files with that suffix will + be included. + """ + if suffix and not isinstance(suffix, str): + raise ValueError('suffix must be a string') + + for filename in walk(root): + if suffix and not filename.endswith(suffix): + continue + yield filename + + +def glob_tree(root, *, + suffix=None, + _glob=glob.iglob, + ): + """Yield each file in the tree under the given directory name. + + If "suffix" is provided then only files with that suffix will + be included. + """ + suffix = suffix or '' + if not isinstance(suffix, str): + raise ValueError('suffix must be a string') + + for filename in _glob(f'{root}/*{suffix}'): + yield filename + for filename in _glob(f'{root}/**/*{suffix}'): + yield filename + + +def iter_files(root, suffix=None, relparent=None, *, + get_files=os.walk, + _glob=glob_tree, + _walk=walk_tree, + ): + """Yield each file in the tree under the given directory name. + + If "root" is a non-string iterable then do the same for each of + those trees. + + If "suffix" is provided then only files with that suffix will + be included. + + if "relparent" is provided then it is used to resolve each + filename as a relative path. + """ + if not isinstance(root, str): + roots = root + for root in roots: + yield from iter_files(root, suffix, relparent, + get_files=get_files, + _glob=_glob, _walk=_walk) + return + + # Use the right "walk" function. + if get_files in (glob.glob, glob.iglob, glob_tree): + get_files = _glob + else: + _files = _walk_tree if get_files in (os.walk, walk_tree) else get_files + get_files = (lambda *a, **k: _walk(*a, walk=_files, **k)) + + # Handle a single suffix. + if suffix and not isinstance(suffix, str): + filenames = get_files(root) + suffix = tuple(suffix) + else: + filenames = get_files(root, suffix=suffix) + suffix = None + + for filename in filenames: + if suffix and not isinstance(suffix, str): # multiple suffixes + if not filename.endswith(suffix): + continue + if relparent: + filename = os.path.relpath(filename, relparent) + yield filename + + +def iter_files_by_suffix(root, suffixes, relparent=None, *, + walk=walk_tree, + _iter_files=iter_files, + ): + """Yield each file in the tree that has the given suffixes. + + Unlike iter_files(), the results are in the original suffix order. + """ + if isinstance(suffixes, str): + suffixes = [suffixes] + # XXX Ignore repeated suffixes? + for suffix in suffixes: + yield from _iter_files(root, suffix, relparent) + + +################################## +# file info + +# XXX posix-only? + +S_IRANY = stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH +S_IWANY = stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH +S_IXANY = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH + + +def is_readable(file, *, user=None, check=False): + filename, st, mode = _get_file_info(file) + if check: + try: + okay = _check_file(filename, S_IRANY) + except NotImplementedError: + okay = NotImplemented + if okay is not NotImplemented: + return okay + # Fall back to checking the mode. + return _check_mode(st, mode, S_IRANY, user) + + +def is_writable(file, *, user=None, check=False): + filename, st, mode = _get_file_info(file) + if check: + try: + okay = _check_file(filename, S_IWANY) + except NotImplementedError: + okay = NotImplemented + if okay is not NotImplemented: + return okay + # Fall back to checking the mode. + return _check_mode(st, mode, S_IWANY, user) + + +def is_executable(file, *, user=None, check=False): + filename, st, mode = _get_file_info(file) + if check: + try: + okay = _check_file(filename, S_IXANY) + except NotImplementedError: + okay = NotImplemented + if okay is not NotImplemented: + return okay + # Fall back to checking the mode. + return _check_mode(st, mode, S_IXANY, user) + + +def _get_file_info(file): + filename = st = mode = None + if isinstance(file, int): + mode = file + elif isinstance(file, os.stat_result): + st = file + else: + if isinstance(file, str): + filename = file + elif hasattr(file, 'name') and os.path.exists(file.name): + filename = file.name + else: + raise NotImplementedError(file) + st = os.stat(filename) + return filename, st, mode or st.st_mode + + +def _check_file(filename, check): + if not isinstance(filename, str): + raise Exception(f'filename required to check file, got {filename}') + if check & S_IRANY: + flags = os.O_RDONLY + elif check & S_IWANY: + flags = os.O_WRONLY + elif check & S_IXANY: + # We can worry about S_IXANY later + return NotImplemented + else: + raise NotImplementedError(check) + + try: + fd = os.open(filename, flags) + except PermissionError: + return False + # We do not ignore other exceptions. + else: + os.close(fd) + return True + + +def _get_user_info(user): + import pwd + username = uid = gid = groups = None + if user is None: + uid = os.geteuid() + #username = os.getlogin() + username = pwd.getpwuid(uid)[0] + gid = os.getgid() + groups = os.getgroups() + else: + if isinstance(user, int): + uid = user + entry = pwd.getpwuid(uid) + username = entry.pw_name + elif isinstance(user, str): + username = user + entry = pwd.getpwnam(username) + uid = entry.pw_uid + else: + raise NotImplementedError(user) + gid = entry.pw_gid + os.getgrouplist(username, gid) + return username, uid, gid, groups + + +def _check_mode(st, mode, check, user): + orig = check + _, uid, gid, groups = _get_user_info(user) + if check & S_IRANY: + check -= S_IRANY + matched = False + if mode & stat.S_IRUSR: + if st.st_uid == uid: + matched = True + if mode & stat.S_IRGRP: + if st.st_uid == gid or st.st_uid in groups: + matched = True + if mode & stat.S_IROTH: + matched = True + if not matched: + return False + if check & S_IWANY: + check -= S_IWANY + matched = False + if mode & stat.S_IWUSR: + if st.st_uid == uid: + matched = True + if mode & stat.S_IWGRP: + if st.st_uid == gid or st.st_uid in groups: + matched = True + if mode & stat.S_IWOTH: + matched = True + if not matched: + return False + if check & S_IXANY: + check -= S_IXANY + matched = False + if mode & stat.S_IXUSR: + if st.st_uid == uid: + matched = True + if mode & stat.S_IXGRP: + if st.st_uid == gid or st.st_uid in groups: + matched = True + if mode & stat.S_IXOTH: + matched = True + if not matched: + return False + if check: + raise NotImplementedError((orig, check)) + return True diff --git a/Tools/c-analyzer/c_analyzer/common/__init__.py b/Tools/c-analyzer/c_common/info.py similarity index 100% rename from Tools/c-analyzer/c_analyzer/common/__init__.py rename to Tools/c-analyzer/c_common/info.py diff --git a/Tools/c-analyzer/c_common/iterutil.py b/Tools/c-analyzer/c_common/iterutil.py new file mode 100644 index 00000000000000..6ded105304e454 --- /dev/null +++ b/Tools/c-analyzer/c_common/iterutil.py @@ -0,0 +1,48 @@ + +_NOT_SET = object() + + +def peek_and_iter(items): + if not items: + return None, None + items = iter(items) + try: + peeked = next(items) + except StopIteration: + return None, None + def chain(): + yield peeked + yield from items + return chain(), peeked + + +def iter_many(items, onempty=None): + if not items: + if onempty is None: + return + if not callable(onempty): + raise onEmpty + items = onempty(items) + yield from iter_many(items, onempty=None) + return + items = iter(items) + try: + first = next(items) + except StopIteration: + if onempty is None: + return + if not callable(onempty): + raise onEmpty + items = onempty(items) + yield from iter_many(items, onempty=None) + else: + try: + second = next(items) + except StopIteration: + yield first, False + return + else: + yield first, True + yield second, True + for item in items: + yield item, True diff --git a/Tools/c-analyzer/c_common/logging.py b/Tools/c-analyzer/c_common/logging.py new file mode 100644 index 00000000000000..12398f7e385fdb --- /dev/null +++ b/Tools/c-analyzer/c_common/logging.py @@ -0,0 +1,63 @@ +import logging +import sys + + +VERBOSITY = 3 + + +# The root logger for the whole top-level package: +_logger = logging.getLogger(__name__.rpartition('.')[0]) + + +def configure_logger(logger, verbosity=VERBOSITY, *, + logfile=None, + maxlevel=logging.CRITICAL, + ): + level = max(1, # 0 disables it, so we use the next lowest. + min(maxlevel, + maxlevel - verbosity * 10)) + logger.setLevel(level) + #logger.propagate = False + + if not logger.handlers: + if logfile: + handler = logging.FileHandler(logfile) + else: + handler = logging.StreamHandler(sys.stdout) + handler.setLevel(level) + #handler.setFormatter(logging.Formatter()) + logger.addHandler(handler) + + # In case the provided logger is in a sub-package... + if logger is not _logger: + configure_logger( + _logger, + verbosity, + logfile=logfile, + maxlevel=maxlevel, + ) + + +def hide_emit_errors(): + """Ignore errors while emitting log entries. + + Rather than printing a message desribing the error, we show nothing. + """ + # For now we simply ignore all exceptions. If we wanted to ignore + # specific ones (e.g. BrokenPipeError) then we would need to use + # a Handler subclass with a custom handleError() method. + orig = logging.raiseExceptions + logging.raiseExceptions = False + def restore(): + logging.raiseExceptions = orig + return restore + + +class Printer: + def __init__(self, verbosity=VERBOSITY): + self.verbosity = verbosity + + def info(self, *args, **kwargs): + if self.verbosity < 3: + return + print(*args, **kwargs) diff --git a/Tools/c-analyzer/c_common/misc.py b/Tools/c-analyzer/c_common/misc.py new file mode 100644 index 00000000000000..bfd503ab24adc1 --- /dev/null +++ b/Tools/c-analyzer/c_common/misc.py @@ -0,0 +1,7 @@ + +class Labeled: + __slots__ = ('_label',) + def __init__(self, label): + self._label = label + def __repr__(self): + return f'<{self._label}>' diff --git a/Tools/c-analyzer/c_common/scriptutil.py b/Tools/c-analyzer/c_common/scriptutil.py new file mode 100644 index 00000000000000..939a85003b2964 --- /dev/null +++ b/Tools/c-analyzer/c_common/scriptutil.py @@ -0,0 +1,577 @@ +import argparse +import contextlib +import fnmatch +import logging +import os +import os.path +import shutil +import sys + +from . import fsutil, strutil, iterutil, logging as loggingutil + + +def get_prog(spec=None, *, absolute=False, allowsuffix=True): + if spec is None: + _, spec = _find_script() + # This is more natural for prog than __file__ would be. + filename = sys.argv[0] + elif isinstance(spec, str): + filename = os.path.normpath(spec) + spec = None + else: + filename = spec.origin + if _is_standalone(filename): + # Check if "installed". + if allowsuffix or not filename.endswith('.py'): + basename = os.path.basename(filename) + found = shutil.which(basename) + if found: + script = os.path.abspath(filename) + found = os.path.abspath(found) + if os.path.normcase(script) == os.path.normcase(found): + return basename + # It is only "standalone". + if absolute: + filename = os.path.abspath(filename) + return filename + elif spec is not None: + module = spec.name + if module.endswith('.__main__'): + module = module[:-9] + return f'{sys.executable} -m {module}' + else: + if absolute: + filename = os.path.abspath(filename) + return f'{sys.executable} {filename}' + + +def _find_script(): + frame = sys._getframe(2) + while frame.f_globals['__name__'] != '__main__': + frame = frame.f_back + + # This should match sys.argv[0]. + filename = frame.f_globals['__file__'] + # This will be None if -m wasn't used.. + spec = frame.f_globals['__spec__'] + return filename, spec + + +def is_installed(filename, *, allowsuffix=True): + if not allowsuffix and filename.endswith('.py'): + return False + filename = os.path.abspath(os.path.normalize(filename)) + found = shutil.which(os.path.basename(filename)) + if not found: + return False + if found != filename: + return False + return _is_standalone(filename) + + +def is_standalone(filename): + filename = os.path.abspath(os.path.normalize(filename)) + return _is_standalone(filename) + + +def _is_standalone(filename): + return fsutil.is_executable(filename) + + +################################## +# logging + +VERBOSITY = 3 + +TRACEBACK = os.environ.get('SHOW_TRACEBACK', '').strip() +TRACEBACK = bool(TRACEBACK and TRACEBACK.upper() not in ('0', 'FALSE', 'NO')) + + +logger = logging.getLogger(__name__) + + +def configure_logger(verbosity, logger=None, **kwargs): + if logger is None: + # Configure the root logger. + logger = logging.getLogger() + loggingutil.configure_logger(logger, verbosity, **kwargs) + + +################################## +# selections + +class UnsupportedSelectionError(Exception): + def __init__(self, values, possible): + self.values = tuple(values) + self.possible = tuple(possible) + super().__init__(f'unsupported selections {self.unique}') + + @property + def unique(self): + return tuple(sorted(set(self.values))) + + +def normalize_selection(selected: str, *, possible=None): + if selected in (None, True, False): + return selected + elif isinstance(selected, str): + selected = [selected] + elif not selected: + return () + + unsupported = [] + _selected = set() + for item in selected: + if not item: + continue + for value in item.strip().replace(',', ' ').split(): + if not value: + continue + # XXX Handle subtraction (leading "-"). + if possible and value not in possible and value != 'all': + unsupported.append(value) + _selected.add(value) + if unsupported: + raise UnsupportedSelectionError(unsupported, tuple(possible)) + if 'all' in _selected: + return True + return frozenset(selected) + + +################################## +# CLI parsing helpers + +class CLIArgSpec(tuple): + def __new__(cls, *args, **kwargs): + return super().__new__(cls, (args, kwargs)) + + def __repr__(self): + args, kwargs = self + args = [repr(arg) for arg in args] + for name, value in kwargs.items(): + args.append(f'{name}={value!r}') + return f'{type(self).__name__}({", ".join(args)})' + + def __call__(self, parser, *, _noop=(lambda a: None)): + self.apply(parser) + return _noop + + def apply(self, parser): + args, kwargs = self + parser.add_argument(*args, **kwargs) + + +def apply_cli_argspecs(parser, specs): + processors = [] + for spec in specs: + if callable(spec): + procs = spec(parser) + _add_procs(processors, procs) + else: + args, kwargs = spec + parser.add_argument(args, kwargs) + return processors + + +def _add_procs(flattened, procs): + # XXX Fail on non-empty, non-callable procs? + if not procs: + return + if callable(procs): + flattened.append(procs) + else: + #processors.extend(p for p in procs if callable(p)) + for proc in procs: + _add_procs(flattened, proc) + + +def add_verbosity_cli(parser): + parser.add_argument('-q', '--quiet', action='count', default=0) + parser.add_argument('-v', '--verbose', action='count', default=0) + + def process_args(args): + ns = vars(args) + key = 'verbosity' + if key in ns: + parser.error(f'duplicate arg {key!r}') + ns[key] = max(0, VERBOSITY + ns.pop('verbose') - ns.pop('quiet')) + return key + return process_args + + +def add_traceback_cli(parser): + parser.add_argument('--traceback', '--tb', action='store_true', + default=TRACEBACK) + parser.add_argument('--no-traceback', '--no-tb', dest='traceback', + action='store_const', const=False) + + def process_args(args): + ns = vars(args) + key = 'traceback_cm' + if key in ns: + parser.error(f'duplicate arg {key!r}') + showtb = ns.pop('traceback') + + @contextlib.contextmanager + def traceback_cm(): + restore = loggingutil.hide_emit_errors() + try: + yield + except BrokenPipeError: + # It was piped to "head" or something similar. + pass + except NotImplementedError: + raise # re-raise + except Exception as exc: + if not showtb: + sys.exit(f'ERROR: {exc}') + raise # re-raise + except KeyboardInterrupt: + if not showtb: + sys.exit('\nINTERRUPTED') + raise # re-raise + except BaseException as exc: + if not showtb: + sys.exit(f'{type(exc).__name__}: {exc}') + raise # re-raise + finally: + restore() + ns[key] = traceback_cm() + return key + return process_args + + +def add_sepval_cli(parser, opt, dest, choices, *, sep=',', **kwargs): +# if opt is True: +# parser.add_argument(f'--{dest}', action='append', **kwargs) +# elif isinstance(opt, str) and opt.startswith('-'): +# parser.add_argument(opt, dest=dest, action='append', **kwargs) +# else: +# arg = dest if not opt else opt +# kwargs.setdefault('nargs', '+') +# parser.add_argument(arg, dest=dest, action='append', **kwargs) + if not isinstance(opt, str): + parser.error(f'opt must be a string, got {opt!r}') + elif opt.startswith('-'): + parser.add_argument(opt, dest=dest, action='append', **kwargs) + else: + kwargs.setdefault('nargs', '+') + #kwargs.setdefault('metavar', opt.upper()) + parser.add_argument(opt, dest=dest, action='append', **kwargs) + + def process_args(args): + ns = vars(args) + + # XXX Use normalize_selection()? + if isinstance(ns[dest], str): + ns[dest] = [ns[dest]] + selections = [] + for many in ns[dest] or (): + for value in many.split(sep): + if value not in choices: + parser.error(f'unknown {dest} {value!r}') + selections.append(value) + ns[dest] = selections + return process_args + + +def add_files_cli(parser, *, excluded=None, nargs=None): + process_files = add_file_filtering_cli(parser, excluded=excluded) + parser.add_argument('filenames', nargs=nargs or '+', metavar='FILENAME') + return [ + process_files, + ] + + +def add_file_filtering_cli(parser, *, excluded=None): + parser.add_argument('--start') + parser.add_argument('--include', action='append') + parser.add_argument('--exclude', action='append') + + excluded = tuple(excluded or ()) + + def process_args(args): + ns = vars(args) + key = 'iter_filenames' + if key in ns: + parser.error(f'duplicate arg {key!r}') + + _include = tuple(ns.pop('include') or ()) + _exclude = excluded + tuple(ns.pop('exclude') or ()) + kwargs = dict( + start=ns.pop('start'), + include=tuple(_parse_files(_include)), + exclude=tuple(_parse_files(_exclude)), + # We use the default for "show_header" + ) + ns[key] = (lambda files: fsutil.iter_filenames(files, **kwargs)) + return process_args + + +def _parse_files(filenames): + for filename, _ in strutil.parse_entries(filenames): + yield filename.strip() + + +def add_failure_filtering_cli(parser, pool, *, default=False): + parser.add_argument('--fail', action='append', + metavar=f'"{{all|{"|".join(sorted(pool))}}},..."') + parser.add_argument('--no-fail', dest='fail', action='store_const', const=()) + + def process_args(args): + ns = vars(args) + + fail = ns.pop('fail') + try: + fail = normalize_selection(fail, possible=pool) + except UnsupportedSelectionError as exc: + parser.error(f'invalid --fail values: {", ".join(exc.unique)}') + else: + if fail is None: + fail = default + + if fail is True: + def ignore_exc(_exc): + return False + elif fail is False: + def ignore_exc(_exc): + return True + else: + def ignore_exc(exc): + for err in fail: + if type(exc) == pool[err]: + return False + else: + return True + args.ignore_exc = ignore_exc + return process_args + + +def add_kind_filtering_cli(parser, *, default=None): + parser.add_argument('--kinds', action='append') + + def process_args(args): + ns = vars(args) + + kinds = [] + for kind in ns.pop('kinds') or default or (): + kinds.extend(kind.strip().replace(',', ' ').split()) + + if not kinds: + match_kind = (lambda k: True) + else: + included = set() + excluded = set() + for kind in kinds: + if kind.startswith('-'): + kind = kind[1:] + excluded.add(kind) + if kind in included: + included.remove(kind) + else: + included.add(kind) + if kind in excluded: + excluded.remove(kind) + if excluded: + if included: + ... # XXX fail? + def match_kind(kind, *, _excluded=excluded): + return kind not in _excluded + else: + def match_kind(kind, *, _included=included): + return kind in _included + args.match_kind = match_kind + return process_args + + +COMMON_CLI = [ + add_verbosity_cli, + add_traceback_cli, + #add_dryrun_cli, +] + + +def add_commands_cli(parser, commands, *, commonspecs=COMMON_CLI, subset=None): + arg_processors = {} + if isinstance(subset, str): + cmdname = subset + try: + _, argspecs, _ = commands[cmdname] + except KeyError: + raise ValueError(f'unsupported subset {subset!r}') + parser.set_defaults(cmd=cmdname) + arg_processors[cmdname] = _add_cmd_cli(parser, commonspecs, argspecs) + else: + if subset is None: + cmdnames = subset = list(commands) + elif not subset: + raise NotImplementedError + elif isinstance(subset, set): + cmdnames = [k for k in commands if k in subset] + subset = sorted(subset) + else: + cmdnames = [n for n in subset if n in commands] + if len(cmdnames) < len(subset): + bad = tuple(n for n in subset if n not in commands) + raise ValueError(f'unsupported subset {bad}') + + common = argparse.ArgumentParser(add_help=False) + common_processors = apply_cli_argspecs(common, commonspecs) + subs = parser.add_subparsers(dest='cmd') + for cmdname in cmdnames: + description, argspecs, _ = commands[cmdname] + sub = subs.add_parser( + cmdname, + description=description, + parents=[common], + ) + cmd_processors = _add_cmd_cli(sub, (), argspecs) + arg_processors[cmdname] = common_processors + cmd_processors + return arg_processors + + +def _add_cmd_cli(parser, commonspecs, argspecs): + processors = [] + argspecs = list(commonspecs or ()) + list(argspecs or ()) + for argspec in argspecs: + if callable(argspec): + procs = argspec(parser) + _add_procs(processors, procs) + else: + if not argspec: + raise NotImplementedError + args = list(argspec) + if not isinstance(args[-1], str): + kwargs = args.pop() + if not isinstance(args[0], str): + try: + args, = args + except (TypeError, ValueError): + parser.error(f'invalid cmd args {argspec!r}') + else: + kwargs = {} + parser.add_argument(*args, **kwargs) + # There will be nothing to process. + return processors + + +def _flatten_processors(processors): + for proc in processors: + if proc is None: + continue + if callable(proc): + yield proc + else: + yield from _flatten_processors(proc) + + +def process_args(args, processors, *, keys=None): + processors = _flatten_processors(processors) + ns = vars(args) + extracted = {} + if keys is None: + for process_args in processors: + for key in process_args(args): + extracted[key] = ns.pop(key) + else: + remainder = set(keys) + for process_args in processors: + hanging = process_args(args) + if isinstance(hanging, str): + hanging = [hanging] + for key in hanging or (): + if key not in remainder: + raise NotImplementedError(key) + extracted[key] = ns.pop(key) + remainder.remove(key) + if remainder: + raise NotImplementedError(sorted(remainder)) + return extracted + + +def process_args_by_key(args, processors, keys): + extracted = process_args(args, processors, keys=keys) + return [extracted[key] for key in keys] + + +################################## +# commands + +def set_command(name, add_cli): + """A decorator factory to set CLI info.""" + def decorator(func): + if hasattr(func, '__cli__'): + raise Exception(f'already set') + func.__cli__ = (name, add_cli) + return func + return decorator + + +################################## +# main() helpers + +def filter_filenames(filenames, iter_filenames=None): + for filename, check, _ in _iter_filenames(filenames, iter_filenames): + if (reason := check()): + logger.debug(f'{filename}: {reason}') + continue + yield filename + + +def main_for_filenames(filenames, iter_filenames=None): + for filename, check, show in _iter_filenames(filenames, iter_filenames): + if show: + print() + print('-------------------------------------------') + print(filename) + if (reason := check()): + print(reason) + continue + yield filename + + +def _iter_filenames(filenames, iter_files): + if iter_files is None: + iter_files = fsutil.iter_filenames + yield from iter_files(filenames) + return + + onempty = Exception('no filenames provided') + items = iter_files(filenames) + items, peeked = iterutil.peek_and_iter(items) + if not items: + raise onempty + if isinstance(peeked, str): + check = (lambda: True) + for filename, ismany in iterutil.iter_many(items, onempty): + yield filename, check, ismany + elif len(peeked) == 3: + yield from items + else: + raise NotImplementedError + + +def iter_marks(mark='.', *, group=5, groups=2, lines=10, sep=' '): + mark = mark or '' + sep = f'{mark}{sep}' if sep else mark + end = f'{mark}{os.linesep}' + div = os.linesep + perline = group * groups + perlines = perline * lines + + if perline == 1: + yield end + elif group == 1: + yield sep + + count = 1 + while True: + if count % perline == 0: + yield end + if count % perlines == 0: + yield div + elif count % group == 0: + yield sep + else: + yield mark + count += 1 diff --git a/Tools/c-analyzer/c_analyzer/parser/__init__.py b/Tools/c-analyzer/c_common/show.py similarity index 100% rename from Tools/c-analyzer/c_analyzer/parser/__init__.py rename to Tools/c-analyzer/c_common/show.py diff --git a/Tools/c-analyzer/c_common/strutil.py b/Tools/c-analyzer/c_common/strutil.py new file mode 100644 index 00000000000000..e7535d45bbba23 --- /dev/null +++ b/Tools/c-analyzer/c_common/strutil.py @@ -0,0 +1,42 @@ +import logging + + +logger = logging.getLogger(__name__) + + +def unrepr(value): + raise NotImplementedError + + +def parse_entries(entries, *, ignoresep=None): + for entry in entries: + if ignoresep and ignoresep in entry: + subentries = [entry] + else: + subentries = entry.strip().replace(',', ' ').split() + for item in subentries: + if item.startswith('+'): + filename = item[1:] + try: + infile = open(filename) + except FileNotFoundError: + logger.debug(f'ignored in parse_entries(): +{filename}') + return + with infile: + # We read the entire file here to ensure the file + # gets closed sooner rather than later. Note that + # the file would stay open if this iterator is never + # exchausted. + lines = infile.read().splitlines() + for line in _iter_significant_lines(lines): + yield line, filename + else: + yield item, None + + +def _iter_significant_lines(lines): + for line in lines: + line = line.partition('#')[0] + if not line.strip(): + continue + yield line diff --git a/Tools/c-analyzer/c_common/tables.py b/Tools/c-analyzer/c_common/tables.py new file mode 100644 index 00000000000000..70a230a90b6e85 --- /dev/null +++ b/Tools/c-analyzer/c_common/tables.py @@ -0,0 +1,213 @@ +import csv + +from . import NOT_SET, strutil, fsutil + + +EMPTY = '-' +UNKNOWN = '???' + + +def parse_markers(markers, default=None): + if markers is NOT_SET: + return default + if not markers: + return None + if type(markers) is not str: + return markers + if markers == markers[0] * len(markers): + return [markers] + return list(markers) + + +def fix_row(row, **markers): + if isinstance(row, str): + raise NotImplementedError(row) + empty = parse_markers(markers.pop('empty', ('-',))) + unknown = parse_markers(markers.pop('unknown', ('???',))) + row = (val if val else None for val in row) + if not empty: + if not unknown: + return row + return (UNKNOWN if val in unknown else val for val in row) + elif not unknown: + return (EMPTY if val in empty else val for val in row) + return (EMPTY if val in empty else (UNKNOWN if val in unknown else val) + for val in row) + + +def _fix_read_default(row): + for value in row: + yield value.strip() + + +def _fix_write_default(row, empty=''): + for value in row: + yield empty if value is None else str(value) + + +def _normalize_fix_read(fix): + if fix is None: + fix = '' + if callable(fix): + def fix_row(row): + values = fix(row) + return _fix_read_default(values) + elif isinstance(fix, str): + def fix_row(row): + values = _fix_read_default(row) + return (None if v == fix else v + for v in values) + else: + raise NotImplementedError(fix) + return fix_row + + +def _normalize_fix_write(fix, empty=''): + if fix is None: + fix = empty + if callable(fix): + def fix_row(row): + values = fix(row) + return _fix_write_default(values, empty) + elif isinstance(fix, str): + def fix_row(row): + return _fix_write_default(row, fix) + else: + raise NotImplementedError(fix) + return fix_row + + +def read_table(infile, header, *, + sep='\t', + fix=None, + _open=open, + _get_reader=csv.reader, + ): + """Yield each row of the given ???-separated (e.g. tab) file.""" + if isinstance(infile, str): + with _open(infile, newline='') as infile: + yield from read_table( + infile, + header, + sep=sep, + fix=fix, + _open=_open, + _get_reader=_get_reader, + ) + return + lines = strutil._iter_significant_lines(infile) + + # Validate the header. + if not isinstance(header, str): + header = sep.join(header) + try: + actualheader = next(lines).strip() + except StopIteration: + actualheader = '' + if actualheader != header: + raise ValueError(f'bad header {actualheader!r}') + + fix_row = _normalize_fix_read(fix) + for row in _get_reader(lines, delimiter=sep or '\t'): + yield tuple(fix_row(row)) + + +def write_table(outfile, header, rows, *, + sep='\t', + fix=None, + backup=True, + _open=open, + _get_writer=csv.writer, + ): + """Write each of the rows to the given ???-separated (e.g. tab) file.""" + if backup: + fsutil.create_backup(outfile, backup) + if isinstance(outfile, str): + with _open(outfile, 'w', newline='') as outfile: + return write_table( + outfile, + header, + rows, + sep=sep, + fix=fix, + backup=backup, + _open=_open, + _get_writer=_get_writer, + ) + + if isinstance(header, str): + header = header.split(sep or '\t') + fix_row = _normalize_fix_write(fix) + writer = _get_writer(outfile, delimiter=sep or '\t') + writer.writerow(header) + for row in rows: + writer.writerow( + tuple(fix_row(row)) + ) + + +def parse_table(entries, sep, header=None, rawsep=None, *, + default=NOT_SET, + strict=True, + ): + header, sep = _normalize_table_file_props(header, sep) + if not sep: + raise ValueError('missing "sep"') + + ncols = None + if header: + if strict: + ncols = len(header.split(sep)) + cur_file = None + for line, filename in strutil.parse_entries(entries, ignoresep=sep): + _sep = sep + if filename: + if header and cur_file != filename: + cur_file = filename + # Skip the first line if it's the header. + if line.strip() == header: + continue + else: + # We expected the header. + raise NotImplementedError((header, line)) + elif rawsep and sep not in line: + _sep = rawsep + + row = _parse_row(line, _sep, ncols, default) + if strict and not ncols: + ncols = len(row) + yield row, filename + + +def parse_row(line, sep, *, ncols=None, default=NOT_SET): + if not sep: + raise ValueError('missing "sep"') + return _parse_row(line, sep, ncols, default) + + +def _parse_row(line, sep, ncols, default): + row = tuple(v.strip() for v in line.split(sep)) + if (ncols or 0) > 0: + diff = ncols - len(row) + if diff: + if default is NOT_SET or diff < 0: + raise Exception(f'bad row (expected {ncols} columns, got {row!r})') + row += (default,) * diff + return row + + +def _normalize_table_file_props(header, sep): + if not header: + return None, sep + + if not isinstance(header, str): + if not sep: + raise NotImplementedError(header) + header = sep.join(header) + elif not sep: + for sep in ('\t', ',', ' '): + if sep in header: + break + else: + sep = None + return header, sep diff --git a/Tools/c-analyzer/c_parser/__init__.py b/Tools/c-analyzer/c_parser/__init__.py new file mode 100644 index 00000000000000..39455ddbf1a0c3 --- /dev/null +++ b/Tools/c-analyzer/c_parser/__init__.py @@ -0,0 +1,46 @@ +from .parser import parse as _parse +from .preprocessor import get_preprocessor as _get_preprocessor + + +def parse_file(filename, *, + match_kind=None, + get_file_preprocessor=None, + ): + if get_file_preprocessor is None: + get_file_preprocessor = _get_preprocessor() + yield from _parse_file(filename, match_kind, get_file_preprocessor) + + +def parse_files(filenames, *, + match_kind=None, + get_file_preprocessor=None, + ): + if get_file_preprocessor is None: + get_file_preprocessor = _get_preprocessor() + for filename in filenames: + yield from _parse_file(filename, match_kind, get_file_preprocessor) + + +def _parse_file(filename, match_kind, get_file_preprocessor): + # Preprocess the file. + preprocess = get_file_preprocessor(filename) + preprocessed = preprocess() + if preprocessed is None: + return + + # Parse the lines. + srclines = ((l.file, l.data) for l in preprocessed if l.kind == 'source') + for item in _parse(srclines): + if match_kind is not None and not match_kind(item.kind): + continue + if not item.filename: + raise NotImplementedError(repr(item)) + yield item + + +def parse_signature(text): + raise NotImplementedError + + +# aliases +from .info import resolve_parsed diff --git a/Tools/c-analyzer/c_parser/__main__.py b/Tools/c-analyzer/c_parser/__main__.py new file mode 100644 index 00000000000000..1752a703f606ad --- /dev/null +++ b/Tools/c-analyzer/c_parser/__main__.py @@ -0,0 +1,261 @@ +import logging +import os.path +import sys + +from c_common.scriptutil import ( + CLIArgSpec as Arg, + add_verbosity_cli, + add_traceback_cli, + add_kind_filtering_cli, + add_files_cli, + add_commands_cli, + process_args_by_key, + configure_logger, + get_prog, + main_for_filenames, +) +from .preprocessor import get_preprocessor +from .preprocessor.__main__ import ( + add_common_cli as add_preprocessor_cli, +) +from .info import KIND +from . import parse_file as _iter_parsed + + +logger = logging.getLogger(__name__) + + +def _format_vartype(vartype): + if isinstance(vartype, str): + return vartype + + data = vartype + try: + vartype = data['vartype'] + except KeyError: + storage, typequal, typespec, abstract = vartype.values() + else: + storage = data.get('storage') + if storage: + _, typequal, typespec, abstract = vartype.values() + else: + storage, typequal, typespec, abstract = vartype.values() + + vartype = f'{typespec} {abstract}' + if typequal: + vartype = f'{typequal} {vartype}' + if storage: + vartype = f'{storage} {vartype}' + return vartype + + +def _get_preprocessor(filename, **kwargs): + return get_processor(filename, + log_err=print, + **kwargs + ) + + +####################################### +# the formats + +def fmt_raw(filename, item, *, showfwd=None): + yield str(tuple(item)) + + +def fmt_summary(filename, item, *, showfwd=None): + if item.filename and item.filename != os.path.join('.', filename): + yield f'> {item.filename}' + if showfwd is None: + LINE = ' {lno:>5} {kind:10} {funcname:40} {fwd:1} {name:40} {data}' + else: + LINE = ' {lno:>5} {kind:10} {funcname:40} {name:40} {data}' + lno = kind = funcname = fwd = name = data = '' + MIN_LINE = len(LINE.format(**locals())) + + fileinfo, kind, funcname, name, data = item + lno = fileinfo.lno if fileinfo and fileinfo.lno >= 0 else '' + funcname = funcname or ' --' + name = name or ' --' + isforward = False + if kind is KIND.FUNCTION: + storage, inline, params, returntype, isforward = data.values() + returntype = _format_vartype(returntype) + data = returntype + params + if inline: + data = f'inline {data}' + if storage: + data = f'{storage} {data}' + elif kind is KIND.VARIABLE: + data = _format_vartype(data) + elif kind is KIND.STRUCT or kind is KIND.UNION: + if data is None: + isforward = True + else: + fields = data + data = f'({len(data)}) {{ ' + indent = ',\n' + ' ' * (MIN_LINE + len(data)) + data += ', '.join(f.name for f in fields[:5]) + fields = fields[5:] + while fields: + data = f'{data}{indent}{", ".join(f.name for f in fields[:5])}' + fields = fields[5:] + data += ' }' + elif kind is KIND.ENUM: + if data is None: + isforward = True + else: + names = [d if isinstance(d, str) else d.name + for d in data] + data = f'({len(data)}) {{ ' + indent = ',\n' + ' ' * (MIN_LINE + len(data)) + data += ', '.join(names[:5]) + names = names[5:] + while names: + data = f'{data}{indent}{", ".join(names[:5])}' + names = names[5:] + data += ' }' + elif kind is KIND.TYPEDEF: + data = f'typedef {data}' + elif kind == KIND.STATEMENT: + pass + else: + raise NotImplementedError(item) + if isforward: + fwd = '*' + if not showfwd and showfwd is not None: + return + elif showfwd: + return + kind = kind.value + yield LINE.format(**locals()) + + +def fmt_full(filename, item, *, showfwd=None): + raise NotImplementedError + + +FORMATS = { + 'raw': fmt_raw, + 'summary': fmt_summary, + 'full': fmt_full, +} + + +def add_output_cli(parser): + parser.add_argument('--format', dest='fmt', default='summary', choices=tuple(FORMATS)) + parser.add_argument('--showfwd', action='store_true', default=None) + parser.add_argument('--no-showfwd', dest='showfwd', action='store_false', default=None) + + def process_args(args): + pass + return process_args + + +####################################### +# the commands + +def _cli_parse(parser, excluded=None, **prepr_kwargs): + process_output = add_output_cli(parser) + process_kinds = add_kind_filtering_cli(parser) + process_preprocessor = add_preprocessor_cli(parser, **prepr_kwargs) + process_files = add_files_cli(parser, excluded=excluded) + return [ + process_output, + process_kinds, + process_preprocessor, + process_files, + ] + + +def cmd_parse(filenames, *, + fmt='summary', + showfwd=None, + iter_filenames=None, + **kwargs + ): + if 'get_file_preprocessor' not in kwargs: + kwargs['get_file_preprocessor'] = _get_preprocessor() + try: + do_fmt = FORMATS[fmt] + except KeyError: + raise ValueError(f'unsupported fmt {fmt!r}') + for filename in main_for_filenames(filenames, iter_filenames): + for item in _iter_parsed(filename, **kwargs): + for line in do_fmt(filename, item, showfwd=showfwd): + print(line) + + +def _cli_data(parser): + ... + + return [] + + +def cmd_data(filenames, + **kwargs + ): + # XXX + raise NotImplementedError + + +COMMANDS = { + 'parse': ( + 'parse the given C source & header files', + [_cli_parse], + cmd_parse, + ), + 'data': ( + 'check/manage local data (e.g. excludes, macros)', + [_cli_data], + cmd_data, + ), +} + + +####################################### +# the script + +def parse_args(argv=sys.argv[1:], prog=sys.argv[0], *, subset='parse'): + import argparse + parser = argparse.ArgumentParser( + prog=prog or get_prog, + ) + + processors = add_commands_cli( + parser, + commands={k: v[1] for k, v in COMMANDS.items()}, + commonspecs=[ + add_verbosity_cli, + add_traceback_cli, + ], + subset=subset, + ) + + args = parser.parse_args(argv) + ns = vars(args) + + cmd = ns.pop('cmd') + + verbosity, traceback_cm = process_args_by_key( + args, + processors[cmd], + ['verbosity', 'traceback_cm'], + ) + + return cmd, ns, verbosity, traceback_cm + + +def main(cmd, cmd_kwargs): + try: + run_cmd = COMMANDS[cmd][0] + except KeyError: + raise ValueError(f'unsupported cmd {cmd!r}') + run_cmd(**cmd_kwargs) + + +if __name__ == '__main__': + cmd, cmd_kwargs, verbosity, traceback_cm = parse_args() + configure_logger(verbosity) + with traceback_cm: + main(cmd, cmd_kwargs) diff --git a/Tools/c-analyzer/c_parser/_state_machine.py b/Tools/c-analyzer/c_parser/_state_machine.py new file mode 100644 index 00000000000000..b505b4e3e47240 --- /dev/null +++ b/Tools/c-analyzer/c_parser/_state_machine.py @@ -0,0 +1,244 @@ + +f''' + struct {ANON_IDENTIFIER}; + struct {{ ... }} + struct {IDENTIFIER} {{ ... }} + + union {ANON_IDENTIFIER}; + union {{ ... }} + union {IDENTIFIER} {{ ... }} + + enum {ANON_IDENTIFIER}; + enum {{ ... }} + enum {IDENTIFIER} {{ ... }} + + typedef {VARTYPE} {IDENTIFIER}; + typedef {IDENTIFIER}; + typedef {IDENTIFIER}; + typedef {IDENTIFIER}; +''' + + +def parse(srclines): + if isinstance(srclines, str): # a filename + raise NotImplementedError + + + +# This only handles at most 10 nested levels. +#MATCHED_PARENS = textwrap.dedent(rf''' +# # matched parens +# (?: +# [(] # level 0 +# (?: +# [^()]* +# [(] # level 1 +# (?: +# [^()]* +# [(] # level 2 +# (?: +# [^()]* +# [(] # level 3 +# (?: +# [^()]* +# [(] # level 4 +# (?: +# [^()]* +# [(] # level 5 +# (?: +# [^()]* +# [(] # level 6 +# (?: +# [^()]* +# [(] # level 7 +# (?: +# [^()]* +# [(] # level 8 +# (?: +# [^()]* +# [(] # level 9 +# (?: +# [^()]* +# [(] # level 10 +# [^()]* +# [)] +# )* +# [^()]* +# [)] +# )* +# [^()]* +# [)] +# )* +# [^()]* +# [)] +# )* +# [^()]* +# [)] +# )* +# [^()]* +# [)] +# )* +# [^()]* +# [)] +# )* +# [^()]* +# [)] +# )* +# [^()]* +# [)] +# )* +# [^()]* +# [)] +# )* +# [^()]* +# [)] +# ) +# # end matched parens +# ''') + +''' + # for loop + (?: + \s* \b for + \s* [(] + ( + [^;]* ; + [^;]* ; + .*? + ) #
    + [)] + \s* + (?: + (?: + ( + {_ind(SIMPLE_STMT, 6)} + ) # + ; + ) + | + ( {{ ) # + ) + ) + | + + + + ( + (?: + (?: + (?: + {_ind(SIMPLE_STMT, 6)} + )? + return \b \s* + {_ind(INITIALIZER, 5)} + ) + | + (?: + (?: + {IDENTIFIER} \s* + (?: . | -> ) \s* + )* + {IDENTIFIER} + \s* = \s* + {_ind(INITIALIZER, 5)} + ) + | + (?: + {_ind(SIMPLE_STMT, 5)} + ) + ) + | + # cast compound literal + (?: + (?: + [^'"{{}};]* + {_ind(STRING_LITERAL, 5)} + )* + [^'"{{}};]*? + [^'"{{}};=] + = + \s* [(] [^)]* [)] + \s* {{ [^;]* }} + ) + ) # + + + + # compound statement + (?: + ( + (?: + + # "for" statements are handled separately above. + (?: (?: else \s+ )? if | switch | while ) \s* + {_ind(COMPOUND_HEAD, 5)} + ) + | + (?: else | do ) + # We do not worry about compound statements for labels, + # "case", or "default". + )? #
    + \s* + ( {{ ) # + ) + + + + ( + (?: + [^'"{{}};]* + {_ind(STRING_LITERAL, 5)} + )* + [^'"{{}};]* + # Presumably we will not see "== {{". + [^\s='"{{}};] + )? #
    + + + + ( + \b + (?: + # We don't worry about labels with a compound statement. + (?: + switch \s* [(] [^{{]* [)] + ) + | + (?: + case \b \s* [^:]+ [:] + ) + | + (?: + default \s* [:] + ) + | + (?: + do + ) + | + (?: + while \s* [(] [^{{]* [)] + ) + | + #(?: + # for \s* [(] [^{{]* [)] + # ) + #| + (?: + if \s* [(] + (?: [^{{]* [^)] \s* {{ )* [^{{]* + [)] + ) + | + (?: + else + (?: + \s* + if \s* [(] + (?: [^{{]* [^)] \s* {{ )* [^{{]* + [)] + )? + ) + ) + )? #
    +''' diff --git a/Tools/c-analyzer/c_parser/datafiles.py b/Tools/c-analyzer/c_parser/datafiles.py new file mode 100644 index 00000000000000..5bdb946b1772ab --- /dev/null +++ b/Tools/c-analyzer/c_parser/datafiles.py @@ -0,0 +1,150 @@ +import os.path + +import c_common.tables as _tables +import c_parser.info as _info + + +BASE_COLUMNS = [ + 'filename', + 'funcname', + 'name', + 'kind', +] +END_COLUMNS = { + 'parsed': 'data', + 'decls': 'declaration', +} + + +def _get_columns(group, extra=None): + return BASE_COLUMNS + list(extra or ()) + [END_COLUMNS[group]] + #return [ + # *BASE_COLUMNS, + # *extra or (), + # END_COLUMNS[group], + #] + + +############################# +# high-level + +def read_parsed(infile): + # XXX Support other formats than TSV? + columns = _get_columns('parsed') + for row in _tables.read_table(infile, columns, sep='\t', fix='-'): + yield _info.ParsedItem.from_row(row, columns) + + +def write_parsed(items, outfile): + # XXX Support other formats than TSV? + columns = _get_columns('parsed') + rows = (item.as_row(columns) for item in items) + _tables.write_table(outfile, columns, rows, sep='\t', fix='-') + + +def read_decls(infile, fmt=None): + if fmt is None: + fmt = _get_format(infile) + read_all, _ = _get_format_handlers('decls', fmt) + for decl, _ in read_all(infile): + yield decl + + +def write_decls(decls, outfile, fmt=None, *, backup=False): + if fmt is None: + fmt = _get_format(infile) + _, write_all = _get_format_handlers('decls', fmt) + write_all(decls, outfile, backup=backup) + + +############################# +# formats + +def _get_format(file, default='tsv'): + if isinstance(file, str): + filename = file + else: + filename = getattr(file, 'name', '') + _, ext = os.path.splitext(filename) + return ext[1:] if ext else default + + +def _get_format_handlers(group, fmt): + # XXX Use a registry. + if group != 'decls': + raise NotImplementedError(group) + if fmt == 'tsv': + return (_iter_decls_tsv, _write_decls_tsv) + else: + raise NotImplementedError(fmt) + + +# tsv + +def iter_decls_tsv(infile, extracolumns=None, relroot=None): + for info, extra in _iter_decls_tsv(infile, extracolumns, relroot): + decl = _info.Declaration.from_row(info) + yield decl, extra + + +def write_decls_tsv(decls, outfile, extracolumns=None, *, + relroot=None, + **kwargs + ): + # XXX Move the row rendering here. + _write_decls_tsv(rows, outfile, extracolumns, relroot, kwargs) + + +def _iter_decls_tsv(infile, extracolumns=None, relroot=None): + columns = _get_columns('decls', extracolumns) + for row in _tables.read_table(infile, columns, sep='\t'): + if extracolumns: + declinfo = row[:4] + row[-1:] + extra = row[4:-1] + else: + declinfo = row + extra = None + if relroot: + # XXX Use something like tables.fix_row() here. + declinfo = [None if v == '-' else v + for v in declinfo] + declinfo[0] = os.path.join(relroot, declinfo[0]) + yield declinfo, extra + + +def _write_decls_tsv(decls, outfile, extracolumns, relroot,kwargs): + columns = _get_columns('decls', extracolumns) + if extracolumns: + def render_decl(decl): + if type(row) is tuple: + decl, *extra = decl + else: + extra = () + extra += ('???',) * (len(extraColumns) - len(extra)) + *row, declaration = _render_known_row(decl, relroot) + row += extra + (declaration,) + return row + else: + render_decl = _render_known_decl + _tables.write_table( + outfile, + header='\t'.join(columns), + rows=(render_decl(d, relroot) for d in decls), + sep='\t', + **kwargs + ) + + +def _render_known_decl(decl, relroot, *, + # These match BASE_COLUMNS + END_COLUMNS[group]. + _columns = 'filename parent name kind data'.split(), + ): + if not isinstance(decl, _info.Declaration): + # e.g. Analyzed + decl = decl.decl + rowdata = decl.render_rowdata(_columns) + if relroot: + rowdata['filename'] = os.path.relpath(rowdata['filename'], relroot) + return [rowdata[c] or '-' for c in _columns] + # XXX + #return _tables.fix_row(rowdata[c] for c in columns) diff --git a/Tools/c-analyzer/c_parser/info.py b/Tools/c-analyzer/c_parser/info.py new file mode 100644 index 00000000000000..a07ce2e0ccb8d3 --- /dev/null +++ b/Tools/c-analyzer/c_parser/info.py @@ -0,0 +1,1658 @@ +from collections import namedtuple +import enum +import os.path +import re + +from c_common.clsutil import classonly +import c_common.misc as _misc +import c_common.strutil as _strutil +import c_common.tables as _tables +from .parser._regexes import SIMPLE_TYPE + + +FIXED_TYPE = _misc.Labeled('FIXED_TYPE') + +POTS_REGEX = re.compile(rf'^{SIMPLE_TYPE}$', re.VERBOSE) + + +def is_pots(typespec): + if not typespec: + return None + if type(typespec) is not str: + _, _, _, typespec, _ = get_parsed_vartype(typespec) + return POTS_REGEX.match(typespec) is not None + + +def is_funcptr(vartype): + if not vartype: + return None + _, _, _, _, abstract = get_parsed_vartype(vartype) + return _is_funcptr(abstract) + + +def _is_funcptr(declstr): + if not declstr: + return None + # XXX Support "(*)(". + return '(*)(' in declstr.replace(' ', '') + + +def is_exported_symbol(decl): + _, storage, _, _, _ = get_parsed_vartype(decl) + raise NotImplementedError + + +def is_process_global(vardecl): + kind, storage, _, _, _ = get_parsed_vartype(vardecl) + if kind is not KIND.VARIABLE: + raise NotImplementedError(vardecl) + if 'static' in (storage or ''): + return True + + if hasattr(vardecl, 'parent'): + parent = vardecl.parent + else: + parent = vardecl.get('parent') + return not parent + + +def is_fixed_type(vardecl): + if not vardecl: + return None + _, _, _, typespec, abstract = get_parsed_vartype(vardecl) + if 'typeof' in typespec: + raise NotImplementedError(vardecl) + elif not abstract: + return True + + if '*' not in abstract: + # XXX What about []? + return True + elif _is_funcptr(abstract): + return True + else: + for after in abstract.split('*')[1:]: + if not after.lstrip().startswith('const'): + return False + else: + return True + + +def is_immutable(vardecl): + if not vardecl: + return None + if not is_fixed_type(vardecl): + return False + _, _, typequal, _, _ = get_parsed_vartype(vardecl) + # If there, it can only be "const" or "volatile". + return typequal == 'const' + + +############################# +# kinds + +@enum.unique +class KIND(enum.Enum): + + # XXX Use these in the raw parser code. + TYPEDEF = 'typedef' + STRUCT = 'struct' + UNION = 'union' + ENUM = 'enum' + FUNCTION = 'function' + VARIABLE = 'variable' + STATEMENT = 'statement' + + @classonly + def _from_raw(cls, raw): + if raw is None: + return None + elif isinstance(raw, cls): + return raw + elif type(raw) is str: + # We could use cls[raw] for the upper-case form, + # but there's no need to go to the trouble. + return cls(raw.lower()) + else: + raise NotImplementedError(raw) + + @classonly + def by_priority(cls, group=None): + if group is None: + return cls._ALL_BY_PRIORITY.copy() + elif group == 'type': + return cls._TYPE_DECLS_BY_PRIORITY.copy() + elif group == 'decl': + return cls._ALL_DECLS_BY_PRIORITY.copy() + elif isinstance(group, str): + raise NotImplementedError(group) + else: + # XXX Treat group as a set of kinds & return in priority order? + raise NotImplementedError(group) + + @classonly + def is_type_decl(cls, kind): + if kind in cls.TYPES: + return True + if not isinstance(kind, cls): + raise TypeError(f'expected KIND, got {kind!r}') + return False + + @classonly + def is_decl(cls, kind): + if kind in cls.DECLS: + return True + if not isinstance(kind, cls): + raise TypeError(f'expected KIND, got {kind!r}') + return False + + @classonly + def get_group(cls, kind, *, groups=None): + if not isinstance(kind, cls): + raise TypeError(f'expected KIND, got {kind!r}') + if groups is None: + groups = ['type'] + elif not groups: + groups = () + elif isinstance(groups, str): + group = groups + if group not in cls._GROUPS: + raise ValueError(f'unsupported group {group!r}') + groups = [group] + else: + unsupported = [g for g in groups if g not in cls._GROUPS] + if unsupported: + raise ValueError(f'unsupported groups {", ".join(repr(unsupported))}') + for group in groups: + if kind in cls._GROUPS[group]: + return group + else: + return kind.value + + @classonly + def resolve_group(cls, group): + if isinstance(group, cls): + return {group} + elif isinstance(group, str): + try: + return cls._GROUPS[group].copy() + except KeyError: + raise ValueError(f'unsupported group {group!r}') + else: + resolved = set() + for gr in group: + resolve.update(cls.resolve_group(gr)) + return resolved + #return {*cls.resolve_group(g) for g in group} + + +KIND._TYPE_DECLS_BY_PRIORITY = [ + # These are in preferred order. + KIND.TYPEDEF, + KIND.STRUCT, + KIND.UNION, + KIND.ENUM, +] +KIND._ALL_DECLS_BY_PRIORITY = [ + # These are in preferred order. + *KIND._TYPE_DECLS_BY_PRIORITY, + KIND.FUNCTION, + KIND.VARIABLE, +] +KIND._ALL_BY_PRIORITY = [ + # These are in preferred order. + *KIND._ALL_DECLS_BY_PRIORITY, + KIND.STATEMENT, +] + +KIND.TYPES = frozenset(KIND._TYPE_DECLS_BY_PRIORITY) +KIND.DECLS = frozenset(KIND._ALL_DECLS_BY_PRIORITY) +KIND._GROUPS = { + 'type': KIND.TYPES, + 'decl': KIND.DECLS, +} +KIND._GROUPS.update((k.value, {k}) for k in KIND) + + +# The module-level kind-related helpers (below) deal with .kind: + +def is_type_decl(kind): + # Handle ParsedItem, Declaration, etc.. + kind = getattr(kind, 'kind', kind) + return KIND.is_type_decl(kind) + + +def is_decl(kind): + # Handle ParsedItem, Declaration, etc.. + kind = getattr(kind, 'kind', kind) + return KIND.is_decl(kind) + + +def filter_by_kind(items, kind): + if kind == 'type': + kinds = KIND._TYPE_DECLS + elif kind == 'decl': + kinds = KIND._TYPE_DECLS + try: + okay = kind in KIND + except TypeError: + kinds = set(kind) + else: + kinds = {kind} if okay else set(kind) + for item in items: + if item.kind in kinds: + yield item + + +def collate_by_kind(items): + collated = {kind: [] for kind in KIND} + for item in items: + try: + collated[item.kind].append(item) + except KeyError: + raise ValueError(f'unsupported kind in {item!r}') + return collated + + +def get_kind_group(kind): + # Handle ParsedItem, Declaration, etc.. + kind = getattr(kind, 'kind', kind) + return KIND.get_group(kind) + + +def collate_by_kind_group(items): + collated = {KIND.get_group(k): [] for k in KIND} + for item in items: + group = KIND.get_group(item.kind) + collated[group].append(item) + return collated + + +############################# +# low-level + +class FileInfo(namedtuple('FileInfo', 'filename lno')): + @classmethod + def from_raw(cls, raw): + if isinstance(raw, cls): + return raw + elif isinstance(raw, tuple): + return cls(*raw) + elif not raw: + return None + elif isinstance(raw, str): + return cls(raw, -1) + else: + raise TypeError(f'unsupported "raw": {raw:!r}') + + def __str__(self): + return self.filename + + def fix_filename(self, relroot): + filename = os.path.relpath(self.filename, relroot) + return self._replace(filename=filename) + + +class SourceLine(namedtuple('Line', 'file kind data conditions')): + KINDS = ( + #'directive', # data is ... + 'source', # "data" is the line + #'comment', # "data" is the text, including comment markers + ) + + @property + def filename(self): + return self.file.filename + + @property + def lno(self): + return self.file.lno + + +class DeclID(namedtuple('DeclID', 'filename funcname name')): + """The globally-unique identifier for a declaration.""" + + @classmethod + def from_row(cls, row, **markers): + row = _tables.fix_row(row, **markers) + return cls(*row) + + def __new__(cls, filename, funcname, name): + self = super().__new__( + cls, + filename=str(filename) if filename else None, + funcname=str(funcname) if funcname else None, + name=str(name) if name else None, + ) + self._compare = tuple(v or '' for v in self) + return self + + def __hash__(self): + return super().__hash__() + + def __eq__(self, other): + try: + other = tuple(v or '' for v in other) + except TypeError: + return NotImplemented + return self._compare == other + + def __gt__(self, other): + try: + other = tuple(v or '' for v in other) + except TypeError: + return NotImplemented + return self._compare > other + + +class ParsedItem(namedtuple('ParsedItem', 'file kind parent name data')): + + @classmethod + def from_raw(cls, raw): + if isinstance(raw, cls): + return raw + elif isinstance(raw, tuple): + return cls(*raw) + else: + raise TypeError(f'unsupported "raw": {raw:!r}') + + @classmethod + def from_row(cls, row, columns=None): + if not columns: + colnames = 'filename funcname name kind data'.split() + else: + colnames = list(columns) + for i, column in enumerate(colnames): + if column == 'file': + colnames[i] = 'filename' + elif column == 'funcname': + colnames[i] = 'parent' + if len(row) != len(set(colnames)): + raise NotImplementedError(columns, row) + kwargs = {} + for column, value in zip(colnames, row): + if column == 'filename': + kwargs['file'] = FileInfo.from_raw(value) + elif column == 'kind': + kwargs['kind'] = KIND(value) + elif column in cls._fields: + kwargs[column] = value + else: + raise NotImplementedError(column) + return cls(**kwargs) + + @property + def id(self): + try: + return self._id + except AttributeError: + if self.kind is KIND.STATEMENT: + self._id = None + else: + self._id = DeclID(str(self.file), self.funcname, self.name) + return self._id + + @property + def filename(self): + if not self.file: + return None + return self.file.filename + + @property + def lno(self): + if not self.file: + return -1 + return self.file.lno + + @property + def funcname(self): + if not self.parent: + return None + if type(self.parent) is str: + return self.parent + else: + return self.parent.name + + def as_row(self, columns=None): + if not columns: + columns = self._fields + row = [] + for column in columns: + if column == 'file': + value = self.filename + elif column == 'kind': + value = self.kind.value + elif column == 'data': + value = self._render_data() + else: + value = getattr(self, column) + row.append(value) + return row + + def _render_data(self): + if not self.data: + return None + elif isinstance(self.data, str): + return self.data + else: + # XXX + raise NotImplementedError + + +def _get_vartype(data): + try: + vartype = dict(data['vartype']) + except KeyError: + vartype = dict(data) + storage = data.get('storage') + else: + storage = data.get('storage') or vartype.get('storage') + del vartype['storage'] + return storage, vartype + + +def get_parsed_vartype(decl): + kind = getattr(decl, 'kind', None) + if isinstance(decl, ParsedItem): + storage, vartype = _get_vartype(decl.data) + typequal = vartype['typequal'] + typespec = vartype['typespec'] + abstract = vartype['abstract'] + elif isinstance(decl, dict): + kind = decl.get('kind') + storage, vartype = _get_vartype(decl) + typequal = vartype['typequal'] + typespec = vartype['typespec'] + abstract = vartype['abstract'] + elif isinstance(decl, VarType): + storage = None + typequal, typespec, abstract = decl + elif isinstance(decl, TypeDef): + storage = None + typequal, typespec, abstract = decl.vartype + elif isinstance(decl, Variable): + storage = decl.storage + typequal, typespec, abstract = decl.vartype + elif isinstance(decl, Function): + storage = decl.storage + typequal, typespec, abstract = decl.signature.returntype + elif isinstance(decl, str): + vartype, storage = VarType.from_str(decl) + typequal, typespec, abstract = vartype + else: + raise NotImplementedError(decl) + return kind, storage, typequal, typespec, abstract + + +############################# +# high-level + +class HighlevelParsedItem: + + kind = None + + FIELDS = ('file', 'parent', 'name', 'data') + + @classmethod + def from_parsed(cls, parsed): + if parsed.kind is not cls.kind: + raise TypeError(f'kind mismatch ({parsed.kind.value} != {cls.kind.value})') + data, extra = cls._resolve_data(parsed.data) + self = cls( + cls._resolve_file(parsed), + parsed.name, + data, + cls._resolve_parent(parsed) if parsed.parent else None, + **extra or {} + ) + self._parsed = parsed + return self + + @classmethod + def _resolve_file(cls, parsed): + fileinfo = FileInfo.from_raw(parsed.file) + if not fileinfo: + raise NotImplementedError(parsed) + return fileinfo + + @classmethod + def _resolve_data(cls, data): + return data, None + + @classmethod + def _raw_data(cls, data, extra): + if isinstance(data, str): + return data + else: + raise NotImplementedError(data) + + @classmethod + def _data_as_row(cls, data, extra, colnames): + row = {} + for colname in colnames: + if colname in row: + continue + rendered = cls._render_data_row_item(colname, data, extra) + if rendered is iter(rendered): + rendered, = rendered + row[colname] = rendered + return row + + @classmethod + def _render_data_row_item(cls, colname, data, extra): + if colname == 'data': + return str(data) + else: + return None + + @classmethod + def _render_data_row(cls, fmt, data, extra, colnames): + if fmt != 'row': + raise NotImplementedError + datarow = cls._data_as_row(data, extra, colnames) + unresolved = [c for c, v in datarow.items() if v is None] + if unresolved: + raise NotImplementedError(unresolved) + for colname, value in datarow.items(): + if type(value) != str: + if colname == 'kind': + datarow[colname] = value.value + else: + datarow[colname] = str(value) + return datarow + + @classmethod + def _render_data(cls, fmt, data, extra): + row = cls._render_data_row(fmt, data, extra, ['data']) + yield ' '.join(row.values()) + + @classmethod + def _resolve_parent(cls, parsed, *, _kind=None): + fileinfo = FileInfo(parsed.file.filename, -1) + if isinstance(parsed.parent, str): + if parsed.parent.isidentifier(): + name = parsed.parent + else: + # XXX It could be something like " ". + raise NotImplementedError(repr(parsed.parent)) + parent = ParsedItem(fileinfo, _kind, None, name, None) + elif type(parsed.parent) is tuple: + # XXX It could be something like (kind, name). + raise NotImplementedError(repr(parsed.parent)) + else: + return parsed.parent + Parent = KIND_CLASSES.get(_kind, Declaration) + return Parent.from_parsed(parent) + + @classmethod + def _parse_columns(cls, columns): + colnames = {} # {requested -> actual} + columns = list(columns or cls.FIELDS) + datacolumns = [] + for i, colname in enumerate(columns): + if colname == 'file': + columns[i] = 'filename' + colnames['file'] = 'filename' + elif colname == 'lno': + columns[i] = 'line' + colnames['lno'] = 'line' + elif colname in ('filename', 'line'): + colnames[colname] = colname + elif colname == 'data': + datacolumns.append(colname) + colnames[colname] = None + elif colname in cls.FIELDS or colname == 'kind': + colnames[colname] = colname + else: + datacolumns.append(colname) + colnames[colname] = None + return columns, datacolumns, colnames + + def __init__(self, file, name, data, parent=None, *, + _extra=None, + _shortkey=None, + _key=None, + ): + self.file = file + self.parent = parent or None + self.name = name + self.data = data + self._extra = _extra or {} + self._shortkey = _shortkey + self._key = _key + + def __repr__(self): + args = [f'{n}={getattr(self, n)!r}' + for n in ['file', 'name', 'data', 'parent', *(self._extra or ())]] + return f'{type(self).__name__}({", ".join(args)})' + + def __str__(self): + try: + return self._str + except AttributeError: + self._str = next(self.render()) + return self._str + + def __getattr__(self, name): + try: + return self._extra[name] + except KeyError: + raise AttributeError(name) + + def __hash__(self): + return hash(self._key) + + def __eq__(self, other): + if isinstance(other, HighlevelParsedItem): + return self._key == other._key + elif type(other) is tuple: + return self._key == other + else: + return NotImplemented + + def __gt__(self, other): + if isinstance(other, HighlevelParsedItem): + return self._key > other._key + elif type(other) is tuple: + return self._key > other + else: + return NotImplemented + + @property + def id(self): + return self.parsed.id + + @property + def shortkey(self): + return self._shortkey + + @property + def key(self): + return self._key + + @property + def filename(self): + if not self.file: + return None + return self.file.filename + + @property + def parsed(self): + try: + return self._parsed + except AttributeError: + parent = self.parent + if parent is not None and not isinstance(parent, str): + parent = parent.name + self._parsed = ParsedItem( + self.file, + self.kind, + parent, + self.name, + self._raw_data(), + ) + return self._parsed + + def fix_filename(self, relroot): + if self.file: + self.file = self.file.fix_filename(relroot) + + def as_rowdata(self, columns=None): + columns, datacolumns, colnames = self._parse_columns(columns) + return self._as_row(colnames, datacolumns, self._data_as_row) + + def render_rowdata(self, columns=None): + columns, datacolumns, colnames = self._parse_columns(columns) + def data_as_row(data, ext, cols): + return self._render_data_row('row', data, ext, cols) + rowdata = self._as_row(colnames, datacolumns, data_as_row) + for column, value in rowdata.items(): + colname = colnames.get(column) + if not colname: + continue + if column == 'kind': + value = value.value + else: + if column == 'parent': + if self.parent: + value = f'({self.parent.kind.value} {self.parent.name})' + if not value: + value = '-' + elif type(value) is VarType: + value = repr(str(value)) + else: + value = str(value) + rowdata[column] = value + return rowdata + + def _as_row(self, colnames, datacolumns, data_as_row): + try: + data = data_as_row(self.data, self._extra, datacolumns) + except NotImplementedError: + data = None + row = data or {} + for column, colname in colnames.items(): + if colname == 'filename': + value = self.file.filename if self.file else None + elif colname == 'line': + value = self.file.lno if self.file else None + elif colname is None: + value = getattr(self, column, None) + else: + value = getattr(self, colname, None) + row.setdefault(column, value) + return row + + def render(self, fmt='line'): + fmt = fmt or 'line' + try: + render = _FORMATS[fmt] + except KeyError: + raise TypeError(f'unsupported fmt {fmt!r}') + try: + data = self._render_data(fmt, self.data, self._extra) + except NotImplementedError: + data = '-' + yield from render(self, data) + + +### formats ### + +def _fmt_line(parsed, data=None): + parts = [ + f'<{parsed.kind.value}>', + ] + parent = '' + if parsed.parent: + parent = parsed.parent + if not isinstance(parent, str): + if parent.kind is KIND.FUNCTION: + parent = f'{parent.name}()' + else: + parent = parent.name + name = f'<{parent}>.{parsed.name}' + else: + name = parsed.name + if data is None: + data = parsed.data + elif data is iter(data): + data, = data + parts.extend([ + name, + f'<{data}>' if data else '-', + f'({str(parsed.file or "")})', + ]) + yield '\t'.join(parts) + + +def _fmt_full(parsed, data=None): + if parsed.kind is KIND.VARIABLE and parsed.parent: + prefix = 'local ' + suffix = f' ({parsed.parent.name})' + else: + # XXX Show other prefixes (e.g. global, public) + prefix = suffix = '' + yield f'{prefix}{parsed.kind.value} {parsed.name!r}{suffix}' + for column, info in parsed.render_rowdata().items(): + if column == 'kind': + continue + if column == 'name': + continue + if column == 'parent' and parsed.kind is not KIND.VARIABLE: + continue + if column == 'data': + if parsed.kind in (KIND.STRUCT, KIND.UNION): + column = 'members' + elif parsed.kind is KIND.ENUM: + column = 'enumerators' + elif parsed.kind is KIND.STATEMENT: + column = 'text' + data, = data + else: + column = 'signature' + data, = data + if not data: +# yield f'\t{column}:\t-' + continue + elif isinstance(data, str): + yield f'\t{column}:\t{data!r}' + else: + yield f'\t{column}:' + for line in data: + yield f'\t\t- {line}' + else: + yield f'\t{column}:\t{info}' + + +_FORMATS = { + 'raw': (lambda v, _d: [repr(v)]), + 'brief': _fmt_line, + 'line': _fmt_line, + 'full': _fmt_full, +} + + +### declarations ## + +class Declaration(HighlevelParsedItem): + + @classmethod + def from_row(cls, row, **markers): + fixed = tuple(_tables.fix_row(row, **markers)) + if cls is Declaration: + _, _, _, kind, _ = fixed + sub = KIND_CLASSES.get(KIND(kind)) + if not sub or not issubclass(sub, Declaration): + raise TypeError(f'unsupported kind, got {row!r}') + else: + sub = cls + return sub._from_row(fixed) + + @classmethod + def _from_row(cls, row): + filename, funcname, name, kind, data = row + kind = KIND._from_raw(kind) + if kind is not cls.kind: + raise TypeError(f'expected kind {cls.kind.value!r}, got {row!r}') + fileinfo = FileInfo.from_raw(filename) + if isinstance(data, str): + data, extra = cls._parse_data(data, fmt='row') + if extra: + return cls(fileinfo, name, data, funcname, _extra=extra) + else: + return cls(fileinfo, name, data, funcname) + + @classmethod + def _resolve_parent(cls, parsed, *, _kind=None): + if _kind is None: + raise TypeError(f'{cls.kind.value} declarations do not have parents ({parsed})') + return super()._resolve_parent(parsed, _kind=_kind) + + @classmethod + def _render_data(cls, fmt, data, extra): + if not data: + # XXX There should be some! Forward? + yield '???' + else: + yield from cls._format_data(fmt, data, extra) + + @classmethod + def _render_data_row_item(cls, colname, data, extra): + if colname == 'data': + return cls._format_data('row', data, extra) + else: + return None + + @classmethod + def _format_data(cls, fmt, data, extra): + raise NotImplementedError(fmt) + + @classmethod + def _parse_data(cls, datastr, fmt=None): + """This is the reverse of _render_data.""" + if not datastr or datastr is _tables.UNKNOWN or datastr == '???': + return None, None + elif datastr is _tables.EMPTY or datastr == '-': + # All the kinds have *something* even it is unknown. + raise TypeError('all declarations have data of some sort, got none') + else: + return cls._unformat_data(datastr, fmt) + + @classmethod + def _unformat_data(cls, datastr, fmt=None): + raise NotImplementedError(fmt) + + +class VarType(namedtuple('VarType', 'typequal typespec abstract')): + + @classmethod + def from_str(cls, text): + orig = text + storage, sep, text = text.strip().partition(' ') + if not sep: + text = storage + storage = None + elif storage not in ('auto', 'register', 'static', 'extern'): + text = orig + storage = None + return cls._from_str(text), storage + + @classmethod + def _from_str(cls, text): + orig = text + if text.startswith(('const ', 'volatile ')): + typequal, _, text = text.partition(' ') + else: + typequal = None + + # Extract a series of identifiers/keywords. + m = re.match(r"^ *'?([a-zA-Z_]\w*(?:\s+[a-zA-Z_]\w*)*)\s*(.*?)'?\s*$", text) + if not m: + raise ValueError(f'invalid vartype text {orig!r}') + typespec, abstract = m.groups() + + return cls(typequal, typespec, abstract or None) + + def __str__(self): + parts = [] + if self.qualifier: + parts.append(self.qualifier) + parts.append(self.spec + (self.abstract or '')) + return ' '.join(parts) + + @property + def qualifier(self): + return self.typequal + + @property + def spec(self): + return self.typespec + + +class Variable(Declaration): + kind = KIND.VARIABLE + + @classmethod + def _resolve_parent(cls, parsed): + return super()._resolve_parent(parsed, _kind=KIND.FUNCTION) + + @classmethod + def _resolve_data(cls, data): + if not data: + return None, None + storage, vartype = _get_vartype(data) + return VarType(**vartype), {'storage': storage} + + @classmethod + def _raw_data(self, data, extra): + vartype = data._asdict() + return { + 'storage': extra['storage'], + 'vartype': vartype, + } + + @classmethod + def _format_data(cls, fmt, data, extra): + storage = extra.get('storage') + text = f'{storage} {data}' if storage else str(data) + if fmt in ('line', 'brief'): + yield text + #elif fmt == 'full': + elif fmt == 'row': + yield text + else: + raise NotImplementedError(fmt) + + @classmethod + def _unformat_data(cls, datastr, fmt=None): + if fmt in ('line', 'brief'): + vartype, storage = VarType.from_str(datastr) + return vartype, {'storage': storage} + #elif fmt == 'full': + elif fmt == 'row': + vartype, storage = VarType.from_str(datastr) + return vartype, {'storage': storage} + else: + raise NotImplementedError(fmt) + + def __init__(self, file, name, data, parent=None, storage=None): + super().__init__(file, name, data, parent, + _extra={'storage': storage}, + _shortkey=f'({parent.name}).{name}' if parent else name, + _key=(str(file), + # Tilde comes after all other ascii characters. + f'~{parent or ""}~', + name, + ), + ) + + @property + def vartype(self): + return self.data + + +class Signature(namedtuple('Signature', 'params returntype inline isforward')): + + @classmethod + def from_str(cls, text): + orig = text + storage, sep, text = text.strip().partition(' ') + if not sep: + text = storage + storage = None + elif storage not in ('auto', 'register', 'static', 'extern'): + text = orig + storage = None + return cls._from_str(text), storage + + @classmethod + def _from_str(cls, text): + orig = text + inline, sep, text = text.partition('|') + if not sep: + text = inline + inline = None + + isforward = False + if text.endswith(';'): + text = text[:-1] + isforward = True + elif text.endswith('{}'): + text = text[:-2] + + index = text.rindex('(') + if index < 0: + raise ValueError(f'bad signature text {orig!r}') + params = text[index:] + while params.count('(') <= params.count(')'): + index = text.rindex('(', 0, index) + if index < 0: + raise ValueError(f'bad signature text {orig!r}') + params = text[index:] + text = text[:index] + + returntype = VarType._from_str(text.rstrip()) + + return cls(params, returntype, inline, isforward) + + def __str__(self): + parts = [] + if self.inline: + parts.extend([ + self.inline, + '|', + ]) + parts.extend([ + str(self.returntype), + self.params, + ';' if self.isforward else '{}', + ]) + return ' '.join(parts) + + @property + def returns(self): + return self.returntype + + +class Function(Declaration): + kind = KIND.FUNCTION + + @classmethod + def _resolve_data(cls, data): + if not data: + return None, None + kwargs = dict(data) + returntype = dict(data['returntype']) + del returntype['storage'] + kwargs['returntype'] = VarType(**returntype) + storage = kwargs.pop('storage') + return Signature(**kwargs), {'storage': storage} + + @classmethod + def _raw_data(self, data): + # XXX finsh! + return data + + @classmethod + def _format_data(cls, fmt, data, extra): + storage = extra.get('storage') + text = f'{storage} {data}' if storage else str(data) + if fmt in ('line', 'brief'): + yield text + #elif fmt == 'full': + elif fmt == 'row': + yield text + else: + raise NotImplementedError(fmt) + + @classmethod + def _unformat_data(cls, datastr, fmt=None): + if fmt in ('line', 'brief'): + sig, storage = Signature.from_str(sig) + return sig, {'storage': storage} + #elif fmt == 'full': + elif fmt == 'row': + sig, storage = Signature.from_str(sig) + return sig, {'storage': storage} + else: + raise NotImplementedError(fmt) + + def __init__(self, file, name, data, parent=None, storage=None): + super().__init__(file, name, data, parent, _extra={'storage': storage}) + self._shortkey = f'~{name}~ {self.data}' + self._key = ( + str(file), + self._shortkey, + ) + + @property + def signature(self): + return self.data + + +class TypeDeclaration(Declaration): + + def __init__(self, file, name, data, parent=None, *, _shortkey=None): + if not _shortkey: + _shortkey = f'{self.kind.value} {name}' + super().__init__(file, name, data, parent, + _shortkey=_shortkey, + _key=( + str(file), + _shortkey, + ), + ) + + +class POTSType(TypeDeclaration): + + def __init__(self, name): + _file = _data = _parent = None + super().__init__(_file, name, _data, _parent, _shortkey=name) + + +class FuncPtr(TypeDeclaration): + + def __init__(self, vartype): + _file = _name = _parent = None + data = vartype + self.vartype = vartype + super().__init__(_file, _name, data, _parent, _shortkey=f'<{vartype}>') + + +class TypeDef(TypeDeclaration): + kind = KIND.TYPEDEF + + @classmethod + def _resolve_data(cls, data): + if not data: + raise NotImplementedError(data) + vartype = dict(data) + del vartype['storage'] + return VarType(**vartype), None + + @classmethod + def _raw_data(self, data): + # XXX finish! + return data + + @classmethod + def _format_data(cls, fmt, data, extra): + text = str(data) + if fmt in ('line', 'brief'): + yield text + elif fmt == 'full': + yield text + elif fmt == 'row': + yield text + else: + raise NotImplementedError(fmt) + + @classmethod + def _unformat_data(cls, datastr, fmt=None): + if fmt in ('line', 'brief'): + vartype, _ = VarType.from_str(datastr) + return vartype, None + #elif fmt == 'full': + elif fmt == 'row': + vartype, _ = VarType.from_str(datastr) + return vartype, None + else: + raise NotImplementedError(fmt) + + def __init__(self, file, name, data, parent=None): + super().__init__(file, name, data, parent, _shortkey=name) + + @property + def vartype(self): + return self.data + + +class Member(namedtuple('Member', 'name vartype size')): + + @classmethod + def from_data(cls, raw, index): + name = raw.name if raw.name else index + vartype = size = None + if type(raw.data) is int: + size = raw.data + elif isinstance(raw.data, str): + size = int(raw.data) + elif raw.data: + vartype = dict(raw.data) + del vartype['storage'] + if 'size' in vartype: + size = int(vartype.pop('size')) + vartype = VarType(**vartype) + return cls(name, vartype, size) + + @classmethod + def from_str(cls, text): + name, _, vartype = text.partition(': ') + if name.startswith('#'): + name = int(name[1:]) + if vartype.isdigit(): + size = int(vartype) + vartype = None + else: + vartype, _ = VarType.from_str(vartype) + size = None + return cls(name, vartype, size) + + def __str__(self): + name = self.name if isinstance(self.name, str) else f'#{self.name}' + return f'{name}: {self.vartype or self.size}' + + +class _StructUnion(TypeDeclaration): + + @classmethod + def _resolve_data(cls, data): + if not data: + # XXX There should be some! Forward? + return None, None + return [Member.from_data(v, i) for i, v in enumerate(data)], None + + @classmethod + def _raw_data(self, data): + # XXX finish! + return data + + @classmethod + def _format_data(cls, fmt, data, extra): + if fmt in ('line', 'brief'): + members = ', '.join(f'<{m}>' for m in data) + yield f'[{members}]' + elif fmt == 'full': + for member in data: + yield f'{member}' + elif fmt == 'row': + members = ', '.join(f'<{m}>' for m in data) + yield f'[{members}]' + else: + raise NotImplementedError(fmt) + + @classmethod + def _unformat_data(cls, datastr, fmt=None): + if fmt in ('line', 'brief'): + members = [Member.from_str(m[1:-1]) + for m in datastr[1:-1].split(', ')] + return members, None + #elif fmt == 'full': + elif fmt == 'row': + members = [Member.from_str(m.rstrip('>').lstrip('<')) + for m in datastr[1:-1].split('>, <')] + return members, None + else: + raise NotImplementedError(fmt) + + def __init__(self, file, name, data, parent=None): + super().__init__(file, name, data, parent) + + @property + def members(self): + return self.data + + +class Struct(_StructUnion): + kind = KIND.STRUCT + + +class Union(_StructUnion): + kind = KIND.UNION + + +class Enum(TypeDeclaration): + kind = KIND.ENUM + + @classmethod + def _resolve_data(cls, data): + if not data: + # XXX There should be some! Forward? + return None, None + enumerators = [e if isinstance(e, str) else e.name + for e in data] + return enumerators, None + + @classmethod + def _raw_data(self, data): + # XXX finsih! + return data + + @classmethod + def _format_data(cls, fmt, data, extra): + if fmt in ('line', 'brief'): + yield repr(data) + elif fmt == 'full': + for enumerator in data: + yield f'{enumerator}' + elif fmt == 'row': + # XXX This won't work with CSV... + yield ','.join(data) + else: + raise NotImplementedError(fmt) + + @classmethod + def _unformat_data(cls, datastr, fmt=None): + if fmt in ('line', 'brief'): + return _strutil.unrepr(datastr), None + #elif fmt == 'full': + elif fmt == 'row': + return datastr.split(','), None + else: + raise NotImplementedError(fmt) + + def __init__(self, file, name, data, parent=None): + super().__init__(file, name, data, parent) + + @property + def enumerators(self): + return self.data + + +### statements ### + +class Statement(HighlevelParsedItem): + kind = KIND.STATEMENT + + @classmethod + def _resolve_data(cls, data): + # XXX finsih! + return data, None + + @classmethod + def _raw_data(self, data): + # XXX finsih! + return data + + @classmethod + def _render_data(cls, fmt, data, extra): + # XXX Handle other formats? + return repr(data) + + @classmethod + def _parse_data(self, datastr, fmt=None): + # XXX Handle other formats? + return _strutil.unrepr(datastr), None + + def __init__(self, file, name, data, parent=None): + super().__init__(file, name, data, parent, + _shortkey=data or '', + _key=( + str(file), + file.lno, + # XXX Only one stmt per line? + ), + ) + + @property + def text(self): + return self.data + + +### + +KIND_CLASSES = {cls.kind: cls for cls in [ + Variable, + Function, + TypeDef, + Struct, + Union, + Enum, + Statement, +]} + + +def resolve_parsed(parsed): + if isinstance(parsed, HighlevelParsedItem): + return parsed + try: + cls = KIND_CLASSES[parsed.kind] + except KeyError: + raise ValueError(f'unsupported kind in {parsed!r}') + return cls.from_parsed(parsed) + + +############################# +# composite + +class Declarations: + + @classmethod + def from_decls(cls, decls): + return cls(decls) + + @classmethod + def from_parsed(cls, items): + decls = (resolve_parsed(item) + for item in items + if item.kind is not KIND.STATEMENT) + return cls.from_decls(decls) + + @classmethod + def _resolve_key(cls, raw): + if isinstance(raw, str): + raw = [raw] + elif isinstance(raw, Declaration): + raw = ( + raw.filename if cls._is_public(raw) else None, + # `raw.parent` is always None for types and functions. + raw.parent if raw.kind is KIND.VARIABLE else None, + raw.name, + ) + + extra = None + if len(raw) == 1: + name, = raw + if name: + name = str(name) + if name.endswith(('.c', '.h')): + # This is only legit as a query. + key = (name, None, None) + else: + key = (None, None, name) + else: + key = (None, None, None) + elif len(raw) == 2: + parent, name = raw + name = str(name) + if isinstance(parent, Declaration): + key = (None, parent.name, name) + elif not parent: + key = (None, None, name) + else: + parent = str(parent) + if parent.endswith(('.c', '.h')): + key = (parent, None, name) + else: + key = (None, parent, name) + else: + key, extra = raw[:3], raw[3:] + filename, funcname, name = key + filename = str(filename) if filename else None + if isinstance(funcname, Declaration): + funcname = funcname.name + else: + funcname = str(funcname) if funcname else None + name = str(name) if name else None + key = (filename, funcname, name) + return key, extra + + @classmethod + def _is_public(cls, decl): + # For .c files don't we need info from .h files to make this decision? + # XXX Check for "extern". + # For now we treat all decls a "private" (have filename set). + return False + + def __init__(self, decls): + # (file, func, name) -> decl + # "public": + # * (None, None, name) + # "private", "global": + # * (file, None, name) + # "private", "local": + # * (file, func, name) + if hasattr(decls, 'items'): + self._decls = decls + else: + self._decls = {} + self._extend(decls) + + # XXX always validate? + + def validate(self): + for key, decl in self._decls.items(): + if type(key) is not tuple or len(key) != 3: + raise ValueError(f'expected 3-tuple key, got {key!r} (for decl {decl!r})') + filename, funcname, name = key + if not name: + raise ValueError(f'expected name in key, got {key!r} (for decl {decl!r})') + elif type(name) is not str: + raise ValueError(f'expected name in key to be str, got {key!r} (for decl {decl!r})') + # XXX Check filename type? + # XXX Check funcname type? + + if decl.kind is KIND.STATEMENT: + raise ValueError(f'expected a declaration, got {decl!r}') + + def __repr__(self): + return f'{type(self).__name__}({list(self)})' + + def __len__(self): + return len(self._decls) + + def __iter__(self): + yield from self._decls + + def __getitem__(self, key): + # XXX Be more exact for the 3-tuple case? + if type(key) not in (str, tuple): + raise KeyError(f'unsupported key {key!r}') + resolved, extra = self._resolve_key(key) + if extra: + raise KeyError(f'key must have at most 3 parts, got {key!r}') + if not resolved[2]: + raise ValueError(f'expected name in key, got {key!r}') + try: + return self._decls[resolved] + except KeyError: + if type(key) is tuple and len(key) == 3: + filename, funcname, name = key + else: + filename, funcname, name = resolved + if filename and not filename.endswith(('.c', '.h')): + raise KeyError(f'invalid filename in key {key!r}') + elif funcname and funcname.endswith(('.c', '.h')): + raise KeyError(f'invalid funcname in key {key!r}') + elif name and name.endswith(('.c', '.h')): + raise KeyError(f'invalid name in key {key!r}') + else: + raise # re-raise + + @property + def types(self): + return self._find(kind=KIND.TYPES) + + @property + def functions(self): + return self._find(None, None, None, KIND.FUNCTION) + + @property + def variables(self): + return self._find(None, None, None, KIND.VARIABLE) + + def iter_all(self): + yield from self._decls.values() + + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + + #def add_decl(self, decl, key=None): + # decl = _resolve_parsed(decl) + # self._add_decl(decl, key) + + def find(self, *key, **explicit): + if not key: + if not explicit: + return iter(self) + return self._find(**explicit) + + resolved, extra = self._resolve_key(key) + filename, funcname, name = resolved + if not extra: + kind = None + elif len(extra) == 1: + kind, = extra + else: + raise KeyError(f'key must have at most 4 parts, got {key!r}') + + implicit= {} + if filename: + implicit['filename'] = filename + if funcname: + implicit['funcname'] = funcname + if name: + implicit['name'] = name + if kind: + implicit['kind'] = kind + return self._find(**implicit, **explicit) + + def _find(self, filename=None, funcname=None, name=None, kind=None): + for decl in self._decls.values(): + if filename and decl.filename != filename: + continue + if funcname: + if decl.kind is not KIND.VARIABLE: + continue + if decl.parent.name != funcname: + continue + if name and decl.name != name: + continue + if kind: + kinds = KIND.resolve_group(kind) + if decl.kind not in kinds: + continue + yield decl + + def _add_decl(self, decl, key=None): + if key: + if type(key) not in (str, tuple): + raise NotImplementedError((key, decl)) + # Any partial key will be turned into a full key, but that + # same partial key will still match a key lookup. + resolved, _ = self._resolve_key(key) + if not resolved[2]: + raise ValueError(f'expected name in key, got {key!r}') + key = resolved + # XXX Also add with the decl-derived key if not the same? + else: + key, _ = self._resolve_key(decl) + self._decls[key] = decl + + def _extend(self, decls): + decls = iter(decls) + # Check only the first item. + for decl in decls: + if isinstance(decl, Declaration): + self._add_decl(decl) + # Add the rest without checking. + for decl in decls: + self._add_decl(decl) + elif isinstance(decl, HighlevelParsedItem): + raise NotImplementedError(decl) + else: + try: + key, decl = decl + except ValueError: + raise NotImplementedError(decl) + if not isinstance(decl, Declaration): + raise NotImplementedError(decl) + self._add_decl(decl, key) + # Add the rest without checking. + for key, decl in decls: + self._add_decl(decl, key) + # The iterator will be exhausted at this point. diff --git a/Tools/c-analyzer/c_parser/parser/__init__.py b/Tools/c-analyzer/c_parser/parser/__init__.py new file mode 100644 index 00000000000000..7cb34caf09eba8 --- /dev/null +++ b/Tools/c-analyzer/c_parser/parser/__init__.py @@ -0,0 +1,212 @@ +"""A simple non-validating parser for C99. + +The functions and regex patterns here are not entirely suitable for +validating C syntax. Please rely on a proper compiler for that. +Instead our goal here is merely matching and extracting information from +valid C code. + +Furthermore, the grammar rules for the C syntax (particularly as +described in the K&R book) actually describe a superset, of which the +full C langage is a proper subset. Here are some of the extra +conditions that must be applied when parsing C code: + +* ... + +(see: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf) + +We have taken advantage of the elements of the C grammar that are used +only in a few limited contexts, mostly as delimiters. They allow us to +focus the regex patterns confidently. Here are the relevant tokens and +in which grammar rules they are used: + +separators: +* ";" + + (decl) struct/union: at end of each member decl + + (decl) declaration: at end of each (non-compound) decl + + (stmt) expr stmt: at end of each stmt + + (stmt) for: between exprs in "header" + + (stmt) goto: at end + + (stmt) continue: at end + + (stmt) break: at end + + (stmt) return: at end +* "," + + (decl) struct/union: between member declators + + (decl) param-list: between params + + (decl) enum: between enumerators + + (decl) initializer (compound): between initializers + + (expr) postfix: between func call args + + (expr) expression: between "assignment" exprs +* ":" + + (decl) struct/union: in member declators + + (stmt) label: between label and stmt + + (stmt) case: between expression and stmt + + (stmt) default: between "default" and stmt +* "=" + + (decl) delaration: between decl and initializer + + (decl) enumerator: between identifier and "initializer" + + (expr) assignment: between "var" and expr + +wrappers: +* "(...)" + + (decl) declarator (func ptr): to wrap ptr/name + + (decl) declarator (func ptr): around params + + (decl) declarator: around sub-declarator (for readability) + + (expr) postfix (func call): around args + + (expr) primary: around sub-expr + + (stmt) if: around condition + + (stmt) switch: around source expr + + (stmt) while: around condition + + (stmt) do-while: around condition + + (stmt) for: around "header" +* "{...}" + + (decl) enum: around enumerators + + (decl) func: around body + + (stmt) compound: around stmts +* "[...]" + * (decl) declarator: for arrays + * (expr) postfix: array access + +other: +* "*" + + (decl) declarator: for pointer types + + (expr) unary: for pointer deref + + +To simplify the regular expressions used here, we've takens some +shortcuts and made certain assumptions about the code we are parsing. +Some of these allow us to skip context-sensitive matching (e.g. braces) +or otherwise still match arbitrary C code unambiguously. However, in +some cases there are certain corner cases where the patterns are +ambiguous relative to arbitrary C code. However, they are still +unambiguous in the specific code we are parsing. + +Here are the cases where we've taken shortcuts or made assumptions: + +* there is no overlap syntactically between the local context (func + bodies) and the global context (other than variable decls), so we + do not need to worry about ambiguity due to the overlap: + + the global context has no expressions or statements + + the local context has no function definitions or type decls +* no "inline" type declarations (struct, union, enum) in function + parameters ~(including function pointers)~ +* no "inline" type decls in function return types +* no superflous parentheses in declarators +* var decls in for loops are always "simple" (e.g. no inline types) +* only inline struct/union/enum decls may be anonymouns (without a name) +* no function pointers in function pointer parameters +* for loop "headers" do not have curly braces (e.g. compound init) +* syntactically, variable decls do not overlap with stmts/exprs, except + in the following case: + spam (*eggs) (...) + This could be either a function pointer variable named "eggs" + or a call to a function named "spam", which returns a function + pointer that gets called. The only differentiator is the + syntax used in the "..." part. It will be comma-separated + parameters for the former and comma-separated expressions for + the latter. Thus, if we expect such decls or calls then we must + parse the decl params. +""" + +""" +TODO: +* extract CPython-specific code +* drop include injection (or only add when needed) +* track position instead of slicing "text" +* Parser class instead of the _iter_source() mess +* alt impl using a state machine (& tokenizer or split on delimiters) +""" + +from ..info import ParsedItem +from ._info import SourceInfo + + +def parse(srclines): + if isinstance(srclines, str): # a filename + raise NotImplementedError + + anon_name = anonymous_names() + for result in _parse(srclines, anon_name): + yield ParsedItem.from_raw(result) + + +# XXX Later: Add a separate function to deal with preprocessor directives +# parsed out of raw source. + + +def anonymous_names(): + counter = 1 + def anon_name(prefix='anon-'): + nonlocal counter + name = f'{prefix}{counter}' + counter += 1 + return name + return anon_name + + +############################# +# internal impl + +import logging + + +_logger = logging.getLogger(__name__) + + +def _parse(srclines, anon_name): + from ._global import parse_globals + + source = _iter_source(srclines) + #source = _iter_source(srclines, showtext=True) + for result in parse_globals(source, anon_name): + # XXX Handle blocks here insted of in parse_globals(). + yield result + + +def _iter_source(lines, *, maxtext=20_000, maxlines=700, showtext=False): + filestack = [] + allinfo = {} + # "lines" should be (fileinfo, data), as produced by the preprocessor code. + for fileinfo, line in lines: + if fileinfo.filename in filestack: + while fileinfo.filename != filestack[-1]: + filename = filestack.pop() + del allinfo[filename] + filename = fileinfo.filename + srcinfo = allinfo[filename] + else: + filename = fileinfo.filename + srcinfo = SourceInfo(filename) + filestack.append(filename) + allinfo[filename] = srcinfo + + _logger.debug(f'-> {line}') + srcinfo._add_line(line, fileinfo.lno) + if len(srcinfo.text) > maxtext: + break + if srcinfo.end - srcinfo.start > maxlines: + break + while srcinfo._used(): + yield srcinfo + if showtext: + _logger.debug(f'=> {srcinfo.text}') + else: + if not filestack: + srcinfo = SourceInfo('???') + else: + filename = filestack[-1] + srcinfo = allinfo[filename] + while srcinfo._used(): + yield srcinfo + if showtext: + _logger.debug(f'=> {srcinfo.text}') + yield srcinfo + if showtext: + _logger.debug(f'=> {srcinfo.text}') + if not srcinfo._ready: + return + # At this point either the file ended prematurely + # or there's "too much" text. + filename, lno, text = srcinfo.filename, srcinfo._start, srcinfo.text + if len(text) > 500: + text = text[:500] + '...' + raise Exception(f'unmatched text ({filename} starting at line {lno}):\n{text}') diff --git a/Tools/c-analyzer/c_parser/parser/_alt.py b/Tools/c-analyzer/c_parser/parser/_alt.py new file mode 100644 index 00000000000000..05a9101b4f529a --- /dev/null +++ b/Tools/c-analyzer/c_parser/parser/_alt.py @@ -0,0 +1,6 @@ + +def _parse(srclines, anon_name): + text = ' '.join(l for _, l in srclines) + + from ._delim import parse + yield from parse(text, anon_name) diff --git a/Tools/c-analyzer/c_parser/parser/_common.py b/Tools/c-analyzer/c_parser/parser/_common.py new file mode 100644 index 00000000000000..40c36039f3f47d --- /dev/null +++ b/Tools/c-analyzer/c_parser/parser/_common.py @@ -0,0 +1,115 @@ +import re + +from ._regexes import ( + _ind, + STRING_LITERAL, + VAR_DECL as _VAR_DECL, +) + + +def log_match(group, m): + from . import _logger + _logger.debug(f'matched <{group}> ({m.group(0)})') + + +############################# +# regex utils + +def set_capture_group(pattern, group, *, strict=True): + old = f'(?: # <{group}>' + if strict and f'(?: # <{group}>' not in pattern: + raise ValueError(f'{old!r} not found in pattern') + return pattern.replace(old, f'( # <{group}>', 1) + + +def set_capture_groups(pattern, groups, *, strict=True): + for group in groups: + pattern = set_capture_group(pattern, group, strict=strict) + return pattern + + +############################# +# syntax-related utils + +_PAREN_RE = re.compile(rf''' + (?: + (?: + [^'"()]* + {_ind(STRING_LITERAL, 3)} + )* + [^'"()]* + (?: + ( [(] ) + | + ( [)] ) + ) + ) + ''', re.VERBOSE) + + +def match_paren(text, depth=0): + pos = 0 + while (m := _PAREN_RE.match(text, pos)): + pos = m.end() + _open, _close = m.groups() + if _open: + depth += 1 + else: # _close + depth -= 1 + if depth == 0: + return pos + else: + raise ValueError(f'could not find matching parens for {text!r}') + + +VAR_DECL = set_capture_groups(_VAR_DECL, ( + 'STORAGE', + 'TYPE_QUAL', + 'TYPE_SPEC', + 'DECLARATOR', + 'IDENTIFIER', + 'WRAPPED_IDENTIFIER', + 'FUNC_IDENTIFIER', +)) + + +def parse_var_decl(decl): + m = re.match(VAR_DECL, decl, re.VERBOSE) + (storage, typequal, typespec, declarator, + name, + wrappedname, + funcptrname, + ) = m.groups() + if name: + kind = 'simple' + elif wrappedname: + kind = 'wrapped' + name = wrappedname + elif funcptrname: + kind = 'funcptr' + name = funcptrname + else: + raise NotImplementedError + abstract = declarator.replace(name, '') + vartype = { + 'storage': storage, + 'typequal': typequal, + 'typespec': typespec, + 'abstract': abstract, + } + return (kind, name, vartype) + + +############################# +# parser state utils + +# XXX Drop this or use it! +def iter_results(results): + if not results: + return + if callable(results): + results = results() + + for result, text in results(): + if result: + yield result, text diff --git a/Tools/c-analyzer/c_parser/parser/_compound_decl_body.py b/Tools/c-analyzer/c_parser/parser/_compound_decl_body.py new file mode 100644 index 00000000000000..eb5bc67607bb19 --- /dev/null +++ b/Tools/c-analyzer/c_parser/parser/_compound_decl_body.py @@ -0,0 +1,158 @@ +import re + +from ._regexes import ( + STRUCT_MEMBER_DECL as _STRUCT_MEMBER_DECL, + ENUM_MEMBER_DECL as _ENUM_MEMBER_DECL, +) +from ._common import ( + log_match, + parse_var_decl, + set_capture_groups, +) + + +############################# +# struct / union + +STRUCT_MEMBER_DECL = set_capture_groups(_STRUCT_MEMBER_DECL, ( + 'COMPOUND_TYPE_KIND', + 'COMPOUND_TYPE_NAME', + 'SPECIFIER_QUALIFIER', + 'DECLARATOR', + 'SIZE', + 'ENDING', + 'CLOSE', +)) +STRUCT_MEMBER_RE = re.compile(rf'^ \s* {STRUCT_MEMBER_DECL}', re.VERBOSE) + + +def parse_struct_body(source, anon_name, parent): + done = False + while not done: + done = True + for srcinfo in source: + m = STRUCT_MEMBER_RE.match(srcinfo.text) + if m: + break + else: + # We ran out of lines. + if srcinfo is not None: + srcinfo.done() + return + for item in _parse_struct_next(m, srcinfo, anon_name, parent): + if callable(item): + parse_body = item + yield from parse_body(source) + else: + yield item + done = False + + +def _parse_struct_next(m, srcinfo, anon_name, parent): + (inline_kind, inline_name, + qualspec, declarator, + size, + ending, + close, + ) = m.groups() + remainder = srcinfo.text[m.end():] + + if close: + log_match('compound close', m) + srcinfo.advance(remainder) + + elif inline_kind: + log_match('compound inline', m) + kind = inline_kind + name = inline_name or anon_name('inline-') + # Immediately emit a forward declaration. + yield srcinfo.resolve(kind, name=name, data=None) + + # un-inline the decl. Note that it might not actually be inline. + # We handle the case in the "maybe_inline_actual" branch. + srcinfo.nest( + remainder, + f'{kind} {name}', + ) + def parse_body(source): + _parse_body = DECL_BODY_PARSERS[kind] + + data = [] # members + ident = f'{kind} {name}' + for item in _parse_body(source, anon_name, ident): + if item.kind == 'field': + data.append(item) + else: + yield item + # XXX Should "parent" really be None for inline type decls? + yield srcinfo.resolve(kind, data, name, parent=None) + + srcinfo.resume() + yield parse_body + + else: + # not inline (member) + log_match('compound member', m) + if qualspec: + _, name, data = parse_var_decl(f'{qualspec} {declarator}') + if not name: + name = anon_name('struct-field-') + if size: +# data = (data, size) + data['size'] = int(size) + else: + # This shouldn't happen (we expect each field to have a name). + raise NotImplementedError + name = sized_name or anon_name('struct-field-') + data = int(size) + + yield srcinfo.resolve('field', data, name, parent) # XXX Restart? + if ending == ',': + remainder = rf'{qualspec} {remainder}' + srcinfo.advance(remainder) + + +############################# +# enum + +ENUM_MEMBER_DECL = set_capture_groups(_ENUM_MEMBER_DECL, ( + 'CLOSE', + 'NAME', + 'INIT', + 'ENDING', +)) +ENUM_MEMBER_RE = re.compile(rf'{ENUM_MEMBER_DECL}', re.VERBOSE) + + +def parse_enum_body(source, _anon_name, _parent): + ending = None + while ending != '}': + for srcinfo in source: + m = ENUM_MEMBER_RE.match(srcinfo.text) + if m: + break + else: + # We ran out of lines. + if srcinfo is not None: + srcinfo.done() + return + remainder = srcinfo.text[m.end():] + + (close, + name, init, ending, + ) = m.groups() + if close: + ending = '}' + else: + data = init + yield srcinfo.resolve('field', data, name, _parent) + srcinfo.advance(remainder) + + +############################# + +DECL_BODY_PARSERS = { + 'struct': parse_struct_body, + 'union': parse_struct_body, + 'enum': parse_enum_body, +} diff --git a/Tools/c-analyzer/c_parser/parser/_delim.py b/Tools/c-analyzer/c_parser/parser/_delim.py new file mode 100644 index 00000000000000..51433a629d3a35 --- /dev/null +++ b/Tools/c-analyzer/c_parser/parser/_delim.py @@ -0,0 +1,54 @@ +import re +import textwrap + +from ._regexes import _ind, STRING_LITERAL + + +def parse(text, anon_name): + context = None + data = None + for m in DELIMITER_RE.find_iter(text): + before, opened, closed = m.groups() + delim = opened or closed + + handle_segment = HANDLERS[context][delim] + result, context, data = handle_segment(before, delim, data) + if result: + yield result + + +DELIMITER = textwrap.dedent(rf''' + ( + (?: + [^'"()\[\]{};]* + {_ind(STRING_LITERAL, 3)} + }* + [^'"()\[\]{};]+ + )? # + (?: + ( + [(\[{] + ) # + | + ( + [)\]};] + ) # + )? + ''') +DELIMITER_RE = re.compile(DELIMITER, re.VERBOSE) + +_HANDLERS = { + None: { # global + # opened + '{': ..., + '[': None, + '(': None, + # closed + '}': None, + ']': None, + ')': None, + ';': ..., + }, + '': { + }, +} diff --git a/Tools/c-analyzer/c_parser/parser/_func_body.py b/Tools/c-analyzer/c_parser/parser/_func_body.py new file mode 100644 index 00000000000000..42fd459e111d2c --- /dev/null +++ b/Tools/c-analyzer/c_parser/parser/_func_body.py @@ -0,0 +1,278 @@ +import re + +from ._regexes import ( + LOCAL as _LOCAL, + LOCAL_STATICS as _LOCAL_STATICS, +) +from ._common import ( + log_match, + parse_var_decl, + set_capture_groups, + match_paren, +) +from ._compound_decl_body import DECL_BODY_PARSERS + + +LOCAL = set_capture_groups(_LOCAL, ( + 'EMPTY', + 'INLINE_LEADING', + 'INLINE_PRE', + 'INLINE_KIND', + 'INLINE_NAME', + 'STORAGE', + 'VAR_DECL', + 'VAR_INIT', + 'VAR_ENDING', + 'COMPOUND_BARE', + 'COMPOUND_LABELED', + 'COMPOUND_PAREN', + 'BLOCK_LEADING', + 'BLOCK_OPEN', + 'SIMPLE_STMT', + 'SIMPLE_ENDING', + 'BLOCK_CLOSE', +)) +LOCAL_RE = re.compile(rf'^ \s* {LOCAL}', re.VERBOSE) + + +# Note that parse_function_body() still has trouble with a few files +# in the CPython codebase. + +def parse_function_body(source, name, anon_name): + # XXX + raise NotImplementedError + + +def parse_function_body(name, text, resolve, source, anon_name, parent): + raise NotImplementedError + # For now we do not worry about locals declared in for loop "headers". + depth = 1; + while depth > 0: + m = LOCAL_RE.match(text) + while not m: + text, resolve = continue_text(source, text or '{', resolve) + m = LOCAL_RE.match(text) + text = text[m.end():] + ( + empty, + inline_leading, inline_pre, inline_kind, inline_name, + storage, decl, + var_init, var_ending, + compound_bare, compound_labeled, compound_paren, + block_leading, block_open, + simple_stmt, simple_ending, + block_close, + ) = m.groups() + + if empty: + log_match('', m) + resolve(None, None, None, text) + yield None, text + elif inline_kind: + log_match('', m) + kind = inline_kind + name = inline_name or anon_name('inline-') + data = [] # members + # We must set the internal "text" from _iter_source() to the + # start of the inline compound body, + # Note that this is effectively like a forward reference that + # we do not emit. + resolve(kind, None, name, text, None) + _parse_body = DECL_BODY_PARSERS[kind] + before = [] + ident = f'{kind} {name}' + for member, inline, text in _parse_body(text, resolve, source, anon_name, ident): + if member: + data.append(member) + if inline: + yield from inline + # un-inline the decl. Note that it might not actually be inline. + # We handle the case in the "maybe_inline_actual" branch. + text = f'{inline_leading or ""} {inline_pre or ""} {kind} {name} {text}' + # XXX Should "parent" really be None for inline type decls? + yield resolve(kind, data, name, text, None), text + elif block_close: + log_match('', m) + depth -= 1 + resolve(None, None, None, text) + # XXX This isn't great. Calling resolve() should have + # cleared the closing bracket. However, some code relies + # on the yielded value instead of the resolved one. That + # needs to be fixed. + yield None, text + elif compound_bare: + log_match('', m) + yield resolve('statement', compound_bare, None, text, parent), text + elif compound_labeled: + log_match('', m) + yield resolve('statement', compound_labeled, None, text, parent), text + elif compound_paren: + log_match('', m) + try: + pos = match_paren(text) + except ValueError: + text = f'{compound_paren} {text}' + #resolve(None, None, None, text) + text, resolve = continue_text(source, text, resolve) + yield None, text + else: + head = text[:pos] + text = text[pos:] + if compound_paren == 'for': + # XXX Parse "head" as a compound statement. + stmt1, stmt2, stmt3 = head.split(';', 2) + data = { + 'compound': compound_paren, + 'statements': (stmt1, stmt2, stmt3), + } + else: + data = { + 'compound': compound_paren, + 'statement': head, + } + yield resolve('statement', data, None, text, parent), text + elif block_open: + log_match('', m) + depth += 1 + if block_leading: + # An inline block: the last evaluated expression is used + # in place of the block. + # XXX Combine it with the remainder after the block close. + stmt = f'{block_open}{{}}...;' + yield resolve('statement', stmt, None, text, parent), text + else: + resolve(None, None, None, text) + yield None, text + elif simple_ending: + log_match('', m) + yield resolve('statement', simple_stmt, None, text, parent), text + elif var_ending: + log_match('', m) + kind = 'variable' + _, name, vartype = parse_var_decl(decl) + data = { + 'storage': storage, + 'vartype': vartype, + } + after = () + if var_ending == ',': + # It was a multi-declaration, so queue up the next one. + _, qual, typespec, _ = vartype.values() + text = f'{storage or ""} {qual or ""} {typespec} {text}' + yield resolve(kind, data, name, text, parent), text + if var_init: + _data = f'{name} = {var_init.strip()}' + yield resolve('statement', _data, None, text, parent), text + else: + # This should be unreachable. + raise NotImplementedError + + +############################# +# static local variables + +LOCAL_STATICS = set_capture_groups(_LOCAL_STATICS, ( + 'INLINE_LEADING', + 'INLINE_PRE', + 'INLINE_KIND', + 'INLINE_NAME', + 'STATIC_DECL', + 'STATIC_INIT', + 'STATIC_ENDING', + 'DELIM_LEADING', + 'BLOCK_OPEN', + 'BLOCK_CLOSE', + 'STMT_END', +)) +LOCAL_STATICS_RE = re.compile(rf'^ \s* {LOCAL_STATICS}', re.VERBOSE) + + +def parse_function_statics(source, func, anon_name): + # For now we do not worry about locals declared in for loop "headers". + depth = 1; + while depth > 0: + for srcinfo in source: + m = LOCAL_STATICS_RE.match(srcinfo.text) + if m: + break + else: + # We ran out of lines. + if srcinfo is not None: + srcinfo.done() + return + for item, depth in _parse_next_local_static(m, srcinfo, + anon_name, func, depth): + if callable(item): + parse_body = item + yield from parse_body(source) + elif item is not None: + yield item + + +def _parse_next_local_static(m, srcinfo, anon_name, func, depth): + (inline_leading, inline_pre, inline_kind, inline_name, + static_decl, static_init, static_ending, + _delim_leading, + block_open, + block_close, + stmt_end, + ) = m.groups() + remainder = srcinfo.text[m.end():] + + if inline_kind: + log_match('func inline', m) + kind = inline_kind + name = inline_name or anon_name('inline-') + # Immediately emit a forward declaration. + yield srcinfo.resolve(kind, name=name, data=None), depth + + # un-inline the decl. Note that it might not actually be inline. + # We handle the case in the "maybe_inline_actual" branch. + srcinfo.nest( + remainder, + f'{inline_leading or ""} {inline_pre or ""} {kind} {name}' + ) + def parse_body(source): + _parse_body = DECL_BODY_PARSERS[kind] + + data = [] # members + ident = f'{kind} {name}' + for item in _parse_body(source, anon_name, ident): + if item.kind == 'field': + data.append(item) + else: + yield item + # XXX Should "parent" really be None for inline type decls? + yield srcinfo.resolve(kind, data, name, parent=None) + + srcinfo.resume() + yield parse_body, depth + + elif static_decl: + log_match('local variable', m) + _, name, data = parse_var_decl(static_decl) + + yield srcinfo.resolve('variable', data, name, parent=func), depth + + if static_init: + srcinfo.advance(f'{name} {static_init} {remainder}') + elif static_ending == ',': + # It was a multi-declaration, so queue up the next one. + _, qual, typespec, _ = data.values() + srcinfo.advance(f'static {qual or ""} {typespec} {remainder}') + else: + srcinfo.advance('') + + else: + log_match('func other', m) + if block_open: + depth += 1 + elif block_close: + depth -= 1 + elif stmt_end: + pass + else: + # This should be unreachable. + raise NotImplementedError + srcinfo.advance(remainder) + yield None, depth diff --git a/Tools/c-analyzer/c_parser/parser/_global.py b/Tools/c-analyzer/c_parser/parser/_global.py new file mode 100644 index 00000000000000..35947c12998135 --- /dev/null +++ b/Tools/c-analyzer/c_parser/parser/_global.py @@ -0,0 +1,179 @@ +import re + +from ._regexes import ( + GLOBAL as _GLOBAL, +) +from ._common import ( + log_match, + parse_var_decl, + set_capture_groups, +) +from ._compound_decl_body import DECL_BODY_PARSERS +#from ._func_body import parse_function_body +from ._func_body import parse_function_statics as parse_function_body + + +GLOBAL = set_capture_groups(_GLOBAL, ( + 'EMPTY', + 'COMPOUND_LEADING', + 'COMPOUND_KIND', + 'COMPOUND_NAME', + 'FORWARD_KIND', + 'FORWARD_NAME', + 'MAYBE_INLINE_ACTUAL', + 'TYPEDEF_DECL', + 'TYPEDEF_FUNC_PARAMS', + 'VAR_STORAGE', + 'FUNC_INLINE', + 'VAR_DECL', + 'FUNC_PARAMS', + 'FUNC_DELIM', + 'FUNC_LEGACY_PARAMS', + 'VAR_INIT', + 'VAR_ENDING', +)) +GLOBAL_RE = re.compile(rf'^ \s* {GLOBAL}', re.VERBOSE) + + +def parse_globals(source, anon_name): + for srcinfo in source: + m = GLOBAL_RE.match(srcinfo.text) + if not m: + # We need more text. + continue + for item in _parse_next(m, srcinfo, anon_name): + if callable(item): + parse_body = item + yield from parse_body(source) + else: + yield item + else: + # We ran out of lines. + if srcinfo is not None: + srcinfo.done() + return + + +def _parse_next(m, srcinfo, anon_name): + ( + empty, + # compound type decl (maybe inline) + compound_leading, compound_kind, compound_name, + forward_kind, forward_name, maybe_inline_actual, + # typedef + typedef_decl, typedef_func_params, + # vars and funcs + storage, func_inline, decl, + func_params, func_delim, func_legacy_params, + var_init, var_ending, + ) = m.groups() + remainder = srcinfo.text[m.end():] + + if empty: + log_match('global empty', m) + srcinfo.advance(remainder) + + elif maybe_inline_actual: + log_match('maybe_inline_actual', m) + # Ignore forward declarations. + # XXX Maybe return them too (with an "isforward" flag)? + if not maybe_inline_actual.strip().endswith(';'): + remainder = maybe_inline_actual + remainder + yield srcinfo.resolve(forward_kind, None, forward_name) + if maybe_inline_actual.strip().endswith('='): + # We use a dummy prefix for a fake typedef. + # XXX Ideally this case would not be caught by MAYBE_INLINE_ACTUAL. + _, name, data = parse_var_decl(f'{forward_kind} {forward_name} fake_typedef_{forward_name}') + yield srcinfo.resolve('typedef', data, name, parent=None) + remainder = f'{name} {remainder}' + srcinfo.advance(remainder) + + elif compound_kind: + kind = compound_kind + name = compound_name or anon_name('inline-') + # Immediately emit a forward declaration. + yield srcinfo.resolve(kind, name=name, data=None) + + # un-inline the decl. Note that it might not actually be inline. + # We handle the case in the "maybe_inline_actual" branch. + srcinfo.nest( + remainder, + f'{compound_leading or ""} {compound_kind} {name}', + ) + def parse_body(source): + _parse_body = DECL_BODY_PARSERS[compound_kind] + + data = [] # members + ident = f'{kind} {name}' + for item in _parse_body(source, anon_name, ident): + if item.kind == 'field': + data.append(item) + else: + yield item + # XXX Should "parent" really be None for inline type decls? + yield srcinfo.resolve(kind, data, name, parent=None) + + srcinfo.resume() + yield parse_body + + elif typedef_decl: + log_match('typedef', m) + kind = 'typedef' + _, name, data = parse_var_decl(typedef_decl) + if typedef_func_params: + return_type = data + # This matches the data for func declarations. + data = { + 'storage': None, + 'inline': None, + 'params': f'({typedef_func_params})', + 'returntype': return_type, + 'isforward': True, + } + yield srcinfo.resolve(kind, data, name, parent=None) + srcinfo.advance(remainder) + + elif func_delim or func_legacy_params: + log_match('function', m) + kind = 'function' + _, name, return_type = parse_var_decl(decl) + func_params = func_params or func_legacy_params + data = { + 'storage': storage, + 'inline': func_inline, + 'params': f'({func_params})', + 'returntype': return_type, + 'isforward': func_delim == ';', + } + + yield srcinfo.resolve(kind, data, name, parent=None) + srcinfo.advance(remainder) + + if func_delim == '{' or func_legacy_params: + def parse_body(source): + yield from parse_function_body(source, name, anon_name) + yield parse_body + + elif var_ending: + log_match('global variable', m) + kind = 'variable' + _, name, vartype = parse_var_decl(decl) + data = { + 'storage': storage, + 'vartype': vartype, + } + yield srcinfo.resolve(kind, data, name, parent=None) + + if var_ending == ',': + # It was a multi-declaration, so queue up the next one. + _, qual, typespec, _ = vartype.values() + remainder = f'{storage or ""} {qual or ""} {typespec} {remainder}' + srcinfo.advance(remainder) + + if var_init: + _data = f'{name} = {var_init.strip()}' + yield srcinfo.resolve('statement', _data, name=None) + + else: + # This should be unreachable. + raise NotImplementedError diff --git a/Tools/c-analyzer/c_parser/parser/_info.py b/Tools/c-analyzer/c_parser/parser/_info.py new file mode 100644 index 00000000000000..2dcd5e5e760b7c --- /dev/null +++ b/Tools/c-analyzer/c_parser/parser/_info.py @@ -0,0 +1,168 @@ +from ..info import KIND, ParsedItem, FileInfo + + +class TextInfo: + + def __init__(self, text, start=None, end=None): + # immutable: + if not start: + start = 1 + self.start = start + + # mutable: + lines = text.splitlines() or [''] + self.text = text.strip() + if not end: + end = start + len(lines) - 1 + self.end = end + self.line = lines[-1] + + def __repr__(self): + args = (f'{a}={getattr(self, a)!r}' + for a in ['text', 'start', 'end']) + return f'{type(self).__name__}({", ".join(args)})' + + def add_line(self, line, lno=None): + if lno is None: + lno = self.end + 1 + else: + if isinstance(lno, FileInfo): + fileinfo = lno + if fileinfo.filename != self.filename: + raise NotImplementedError((fileinfo, self.filename)) + lno = fileinfo.lno + # XXX + #if lno < self.end: + # raise NotImplementedError((lno, self.end)) + line = line.lstrip() + self.text += ' ' + line + self.line = line + self.end = lno + + +class SourceInfo: + + _ready = False + + def __init__(self, filename, _current=None): + # immutable: + self.filename = filename + # mutable: + if isinstance(_current, str): + _current = TextInfo(_current) + self._current = _current + start = -1 + self._start = _current.start if _current else -1 + self._nested = [] + self._set_ready() + + def __repr__(self): + args = (f'{a}={getattr(self, a)!r}' + for a in ['filename', '_current']) + return f'{type(self).__name__}({", ".join(args)})' + + @property + def start(self): + if self._current is None: + return self._start + return self._current.start + + @property + def end(self): + if self._current is None: + return self._start + return self._current.end + + @property + def text(self): + if self._current is None: + return '' + return self._current.text + + def nest(self, text, before, start=None): + if self._current is None: + raise Exception('nesting requires active source text') + current = self._current + current.text = before + self._nested.append(current) + self._replace(text, start) + + def resume(self, remainder=None): + if not self._nested: + raise Exception('no nested text to resume') + if self._current is None: + raise Exception('un-nesting requires active source text') + if remainder is None: + remainder = self._current.text + self._clear() + self._current = self._nested.pop() + self._current.text += ' ' + remainder + self._set_ready() + + def advance(self, remainder, start=None): + if self._current is None: + raise Exception('advancing requires active source text') + if remainder.strip(): + self._replace(remainder, start, fixnested=True) + else: + if self._nested: + self._replace('', start, fixnested=True) + #raise Exception('cannot advance while nesting') + else: + self._clear(start) + + def resolve(self, kind, data, name, parent=None): + # "field" isn't a top-level kind, so we leave it as-is. + if kind and kind != 'field': + kind = KIND._from_raw(kind) + fileinfo = FileInfo(self.filename, self._start) + return ParsedItem(fileinfo, kind, parent, name, data) + + def done(self): + self._set_ready() + + def _set_ready(self): + if self._current is None: + self._ready = False + else: + self._ready = self._current.text.strip() != '' + + def _used(self): + ready = self._ready + self._ready = False + return ready + + def _clear(self, start=None): + old = self._current + if self._current is not None: + # XXX Fail if self._current wasn't used up? + if start is None: + start = self._current.end + self._current = None + if start is not None: + self._start = start + self._set_ready() + return old + + def _replace(self, text, start=None, *, fixnested=False): + end = self._current.end + old = self._clear(start) + self._current = TextInfo(text, self._start, end) + if fixnested and self._nested and self._nested[-1] is old: + self._nested[-1] = self._current + self._set_ready() + + def _add_line(self, line, lno=None): + if not line.strip(): + # We don't worry about multi-line string literals. + return + if self._current is None: + self._start = lno + self._current = TextInfo(line, lno) + else: + # XXX + #if lno < self._current.end: + # # A circular include? + # raise NotImplementedError((lno, self)) + self._current.add_line(line, lno) + self._ready = True diff --git a/Tools/c-analyzer/c_parser/parser/_regexes.py b/Tools/c-analyzer/c_parser/parser/_regexes.py new file mode 100644 index 00000000000000..e9bc31d335a7d5 --- /dev/null +++ b/Tools/c-analyzer/c_parser/parser/_regexes.py @@ -0,0 +1,796 @@ +# Regular expression patterns for C syntax. +# +# None of these patterns has any capturing. However, a number of them +# have capturing markers compatible with utils.set_capture_groups(). + +import textwrap + + +def _ind(text, level=1, edges='both'): + indent = ' ' * level + text = textwrap.indent(text, indent) + if edges == 'pre' or edges == 'both': + text = '\n' + indent + text.lstrip() + if edges == 'post' or edges == 'both': + text = text.rstrip() + '\n' + ' ' * (level - 1) + return text + + +####################################### +# general + +HEX = r'(?: [0-9a-zA-Z] )' + +STRING_LITERAL = textwrap.dedent(rf''' + (?: + # character literal + (?: + ['] [^'] ['] + | + ['] \\ . ['] + | + ['] \\x{HEX}{HEX} ['] + | + ['] \\0\d\d ['] + | + (?: + ['] \\o[01]\d\d ['] + | + ['] \\o2[0-4]\d ['] + | + ['] \\o25[0-5] ['] + ) + ) + | + # string literal + (?: + ["] (?: [^"\\]* \\ . )* [^"\\]* ["] + ) + # end string literal + ) + ''') + +_KEYWORD = textwrap.dedent(r''' + (?: + \b + (?: + auto | + extern | + register | + static | + typedef | + + const | + volatile | + + signed | + unsigned | + char | + short | + int | + long | + float | + double | + void | + + struct | + union | + enum | + + goto | + return | + sizeof | + break | + continue | + if | + else | + for | + do | + while | + switch | + case | + default | + entry + ) + \b + ) + ''') +KEYWORD = rf''' + # keyword + {_KEYWORD} + # end keyword + ''' +_KEYWORD = ''.join(_KEYWORD.split()) + +IDENTIFIER = r'(?: [a-zA-Z_][a-zA-Z0-9_]* )' +# We use a negative lookahead to filter out keywords. +STRICT_IDENTIFIER = rf'(?: (?! {_KEYWORD} ) \b {IDENTIFIER} \b )' +ANON_IDENTIFIER = rf'(?: (?! {_KEYWORD} ) \b {IDENTIFIER} (?: - \d+ )? \b )' + + +####################################### +# types + +SIMPLE_TYPE = textwrap.dedent(rf''' + # simple type + (?: + \b + (?: + void + | + (?: signed | unsigned ) # implies int + | + (?: + (?: (?: signed | unsigned ) \s+ )? + (?: (?: long | short ) \s+ )? + (?: char | short | int | long | float | double ) + ) + ) + \b + ) + # end simple type + ''') + +COMPOUND_TYPE_KIND = r'(?: \b (?: struct | union | enum ) \b )' + + +####################################### +# variable declarations + +STORAGE_CLASS = r'(?: \b (?: auto | register | static | extern ) \b )' +TYPE_QUALIFIER = r'(?: \b (?: const | volatile ) \b )' +PTR_QUALIFIER = rf'(?: [*] (?: \s* {TYPE_QUALIFIER} )? )' + +TYPE_SPEC = textwrap.dedent(rf''' + # type spec + (?: + {_ind(SIMPLE_TYPE, 2)} + | + (?: + [_]*typeof[_]* + \s* [(] + (?: \s* [*&] )* + \s* {STRICT_IDENTIFIER} + \s* [)] + ) + | + # reference to a compound type + (?: + {COMPOUND_TYPE_KIND} + (?: \s* {ANON_IDENTIFIER} )? + ) + | + # reference to a typedef + {STRICT_IDENTIFIER} + ) + # end type spec + ''') + +DECLARATOR = textwrap.dedent(rf''' + # declarator (possibly abstract) + (?: + (?: {PTR_QUALIFIER} \s* )* + (?: + (?: + (?: # + {STRICT_IDENTIFIER} + ) + (?: \s* \[ (?: \s* [^\]]+ \s* )? [\]] )* # arrays + ) + | + (?: + [(] \s* + (?: # + {STRICT_IDENTIFIER} + ) + (?: \s* \[ (?: \s* [^\]]+ \s* )? [\]] )* # arrays + \s* [)] + ) + | + # func ptr + (?: + [(] (?: \s* {PTR_QUALIFIER} )? \s* + (?: # + {STRICT_IDENTIFIER} + ) + (?: \s* \[ (?: \s* [^\]]+ \s* )? [\]] )* # arrays + \s* [)] + # We allow for a single level of paren nesting in parameters. + \s* [(] (?: [^()]* [(] [^)]* [)] )* [^)]* [)] + ) + ) + ) + # end declarator + ''') + +VAR_DECL = textwrap.dedent(rf''' + # var decl (and typedef and func return type) + (?: + (?: + (?: # + {STORAGE_CLASS} + ) + \s* + )? + (?: + (?: # + {TYPE_QUALIFIER} + ) + \s* + )? + (?: + (?: # + {_ind(TYPE_SPEC, 4)} + ) + ) + \s* + (?: + (?: # + {_ind(DECLARATOR, 4)} + ) + ) + ) + # end var decl + ''') + +INITIALIZER = textwrap.dedent(rf''' + # initializer + (?: + (?: + [(] + # no nested parens (e.g. func ptr) + [^)]* + [)] + \s* + )? + (?: + # a string literal + (?: + (?: {_ind(STRING_LITERAL, 4)} \s* )* + {_ind(STRING_LITERAL, 4)} + ) + | + + # a simple initializer + (?: + (?: + [^'",;{{]* + {_ind(STRING_LITERAL, 4)} + )* + [^'",;{{]* + ) + | + + # a struct/array literal + (?: + # We only expect compound initializers with + # single-variable declarations. + {{ + (?: + [^'";]*? + {_ind(STRING_LITERAL, 5)} + )* + [^'";]*? + }} + (?= \s* ; ) # Note this lookahead. + ) + ) + ) + # end initializer + ''') + + +####################################### +# compound type declarations + +STRUCT_MEMBER_DECL = textwrap.dedent(rf''' + (?: + # inline compound type decl + (?: + (?: # + {COMPOUND_TYPE_KIND} + ) + (?: + \s+ + (?: # + {STRICT_IDENTIFIER} + ) + )? + \s* {{ + ) + | + (?: + # typed member + (?: + # Technically it doesn't have to have a type... + (?: # + (?: {TYPE_QUALIFIER} \s* )? + {_ind(TYPE_SPEC, 5)} + ) + (?: + # If it doesn't have a declarator then it will have + # a size and vice versa. + \s* + (?: # + {_ind(DECLARATOR, 6)} + ) + )? + ) + + # sized member + (?: + \s* [:] \s* + (?: # + \d+ + ) + )? + \s* + (?: # + [,;] + ) + ) + | + (?: + \s* + (?: # + }} + ) + ) + ) + ''') + +ENUM_MEMBER_DECL = textwrap.dedent(rf''' + (?: + (?: + \s* + (?: # + }} + ) + ) + | + (?: + \s* + (?: # + {IDENTIFIER} + ) + (?: + \s* = \s* + (?: # + {_ind(STRING_LITERAL, 4)} + | + [^'",}}]+ + ) + )? + \s* + (?: # + , | }} + ) + ) + ) + ''') + + +####################################### +# statements + +SIMPLE_STMT_BODY = textwrap.dedent(rf''' + # simple statement body + (?: + (?: + [^'"{{}};]* + {_ind(STRING_LITERAL, 3)} + )* + [^'"{{}};]* + #(?= [;{{] ) # Note this lookahead. + ) + # end simple statement body + ''') +SIMPLE_STMT = textwrap.dedent(rf''' + # simple statement + (?: + (?: # + # stmt-inline "initializer" + (?: + return \b + (?: + \s* + {_ind(INITIALIZER, 5)} + )? + ) + | + # variable assignment + (?: + (?: [*] \s* )? + (?: + {STRICT_IDENTIFIER} \s* + (?: . | -> ) \s* + )* + {STRICT_IDENTIFIER} + (?: \s* \[ \s* \d+ \s* \] )? + \s* = \s* + {_ind(INITIALIZER, 4)} + ) + | + # catchall return statement + (?: + return \b + (?: + (?: + [^'";]* + {_ind(STRING_LITERAL, 6)} + )* + \s* [^'";]* + )? + ) + | + # simple statement + (?: + {_ind(SIMPLE_STMT_BODY, 4)} + ) + ) + \s* + (?: # + ; + ) + ) + # end simple statement + ''') +COMPOUND_STMT = textwrap.dedent(rf''' + # compound statement + (?: + \b + (?: + (?: + (?: # + else | do + ) + \b + ) + | + (?: + (?: # + (?: + case \b + (?: + [^'":]* + {_ind(STRING_LITERAL, 7)} + )* + \s* [^'":]* + ) + | + default + | + {STRICT_IDENTIFIER} + ) + \s* [:] + ) + | + (?: + (?: # + for | while | if | switch + ) + \s* (?= [(] ) # Note this lookahead. + ) + ) + \s* + ) + # end compound statement + ''') + + +####################################### +# function bodies + +LOCAL = textwrap.dedent(rf''' + (?: + # an empty statement + (?: # + ; + ) + | + # inline type decl + (?: + (?: + (?: # + [^;{{}}]+? + ) + \s* + )? + (?: # + (?: {STORAGE_CLASS} \s* )? + (?: {TYPE_QUALIFIER} \s* )? + )? # + (?: # + {COMPOUND_TYPE_KIND} + ) + (?: + \s+ + (?: # + {STRICT_IDENTIFIER} + ) + )? + \s* {{ + ) + | + # var decl + (?: + (?: # + {STORAGE_CLASS} + )? # + (?: + \s* + (?: # + {_ind(VAR_DECL, 5)} + ) + ) + (?: + (?: + # initializer + # We expect only basic initializers. + \s* = \s* + (?: # + {_ind(INITIALIZER, 6)} + ) + )? + (?: + \s* + (?: # + [,;] + ) + ) + ) + ) + | + {_ind(COMPOUND_STMT, 2)} + | + # start-of-block + (?: + (?: # + (?: + [^'"{{}};]* + {_ind(STRING_LITERAL, 5)} + )* + [^'"{{}};]* + # Presumably we will not see "== {{". + [^\s='"{{}});] + \s* + )? # + (?: # + {{ + ) + ) + | + {_ind(SIMPLE_STMT, 2)} + | + # end-of-block + (?: # + }} + ) + ) + ''') + +LOCAL_STATICS = textwrap.dedent(rf''' + (?: + # inline type decl + (?: + (?: + (?: # + [^;{{}}]+? + ) + \s* + )? + (?: # + (?: {STORAGE_CLASS} \s* )? + (?: {TYPE_QUALIFIER} \s* )? + )? + (?: # + {COMPOUND_TYPE_KIND} + ) + (?: + \s+ + (?: # + {STRICT_IDENTIFIER} + ) + )? + \s* {{ + ) + | + # var decl + (?: + # We only look for static variables. + (?: # + static \b + (?: \s* {TYPE_QUALIFIER} )? + \s* {_ind(TYPE_SPEC, 4)} + \s* {_ind(DECLARATOR, 4)} + ) + \s* + (?: + (?: # + = \s* + {_ind(INITIALIZER, 4)} + \s* + [,;{{] + ) + | + (?: # + [,;] + ) + ) + ) + | + # everything else + (?: + (?: # + (?: + [^'"{{}};]* + {_ind(STRING_LITERAL, 4)} + )* + \s* [^'"{{}};]* + ) + (?: + (?: # + {{ + ) + | + (?: # + }} + ) + | + (?: # + ; + ) + ) + ) + ) + ''') + + +####################################### +# global declarations + +GLOBAL = textwrap.dedent(rf''' + (?: + # an empty statement + (?: # + ; + ) + | + + # compound type decl (maybe inline) + (?: + (?: + (?: # + [^;{{}}]+? + ) + \s* + )? + (?: # + {COMPOUND_TYPE_KIND} + ) + (?: + \s+ + (?: # + {STRICT_IDENTIFIER} + ) + )? + \s* {{ + ) + | + # bogus inline decl artifact + # This simplifies resolving the relative syntactic ambiguity of + # inline structs. + (?: + (?: # + {COMPOUND_TYPE_KIND} + ) + \s* + (?: # + {ANON_IDENTIFIER} + ) + (?: # + [^=,;({{[*\]]* + [=,;({{] + ) + ) + | + + # typedef + (?: + \b typedef \b \s* + (?: # + {_ind(VAR_DECL, 4)} + ) + (?: + # We expect no inline type definitions in the parameters. + \s* [(] \s* + (?: # + [^{{;]* + ) + \s* [)] + )? + \s* ; + ) + | + + # func decl/definition & var decls + # XXX dedicated pattern for funcs (more restricted)? + (?: + (?: + (?: # + {STORAGE_CLASS} + ) + \s* + )? + (?: + (?: # + \b inline \b + ) + \s* + )? + (?: # + {_ind(VAR_DECL, 4)} + ) + (?: + # func decl / definition + (?: + (?: + # We expect no inline type definitions in the parameters. + \s* [(] \s* + (?: # + [^{{;]* + ) + \s* [)] \s* + (?: # + [{{;] + ) + ) + | + (?: + # This is some old-school syntax! + \s* [(] \s* + # We throw away the bare names: + {STRICT_IDENTIFIER} + (?: \s* , \s* {STRICT_IDENTIFIER} )* + \s* [)] \s* + + # We keep the trailing param declarations: + (?: # + # There's at least one! + (?: {TYPE_QUALIFIER} \s* )? + {_ind(TYPE_SPEC, 7)} + \s* + {_ind(DECLARATOR, 7)} + \s* ; + (?: + \s* + (?: {TYPE_QUALIFIER} \s* )? + {_ind(TYPE_SPEC, 8)} + \s* + {_ind(DECLARATOR, 8)} + \s* ; + )* + ) + \s* {{ + ) + ) + | + # var / typedef + (?: + (?: + # initializer + # We expect only basic initializers. + \s* = \s* + (?: # + {_ind(INITIALIZER, 6)} + ) + )? + \s* + (?: # + [,;] + ) + ) + ) + ) + ) + ''') diff --git a/Tools/c-analyzer/c_parser/preprocessor/__init__.py b/Tools/c-analyzer/c_parser/preprocessor/__init__.py new file mode 100644 index 00000000000000..f206f694db5a88 --- /dev/null +++ b/Tools/c-analyzer/c_parser/preprocessor/__init__.py @@ -0,0 +1,190 @@ +import contextlib +import distutils.ccompiler +import logging +import os.path + +from c_common.fsutil import match_glob as _match_glob +from c_common.tables import parse_table as _parse_table +from ..source import ( + resolve as _resolve_source, + good_file as _good_file, +) +from . import errors as _errors +from . import ( + pure as _pure, + gcc as _gcc, +) + + +logger = logging.getLogger(__name__) + + +# Supprted "source": +# * filename (string) +# * lines (iterable) +# * text (string) +# Supported return values: +# * iterator of SourceLine +# * sequence of SourceLine +# * text (string) +# * something that combines all those +# XXX Add the missing support from above. +# XXX Add more low-level functions to handle permutations? + +def preprocess(source, *, + incldirs=None, + macros=None, + samefiles=None, + filename=None, + tool=True, + ): + """... + + CWD should be the project root and "source" should be relative. + """ + if tool: + logger.debug(f'CWD: {os.getcwd()!r}') + logger.debug(f'incldirs: {incldirs!r}') + logger.debug(f'macros: {macros!r}') + logger.debug(f'samefiles: {samefiles!r}') + _preprocess = _get_preprocessor(tool) + with _good_file(source, filename) as source: + return _preprocess(source, incldirs, macros, samefiles) or () + else: + source, filename = _resolve_source(source, filename) + # We ignore "includes", "macros", etc. + return _pure.preprocess(source, filename) + + # if _run() returns just the lines: +# text = _run(source) +# lines = [line + os.linesep for line in text.splitlines()] +# lines[-1] = lines[-1].splitlines()[0] +# +# conditions = None +# for lno, line in enumerate(lines, 1): +# kind = 'source' +# directive = None +# data = line +# yield lno, kind, data, conditions + + +def get_preprocessor(*, + file_macros=None, + file_incldirs=None, + file_same=None, + ignore_exc=False, + log_err=None, + ): + _preprocess = preprocess + if file_macros: + file_macros = tuple(_parse_macros(file_macros)) + if file_incldirs: + file_incldirs = tuple(_parse_incldirs(file_incldirs)) + if file_same: + file_same = tuple(file_same) + if not callable(ignore_exc): + ignore_exc = (lambda exc, _ig=ignore_exc: _ig) + + def get_file_preprocessor(filename): + filename = filename.strip() + if file_macros: + macros = list(_resolve_file_values(filename, file_macros)) + if file_incldirs: + incldirs = [v for v, in _resolve_file_values(filename, file_incldirs)] + + def preprocess(**kwargs): + if file_macros and 'macros' not in kwargs: + kwargs['macros'] = macros + if file_incldirs and 'incldirs' not in kwargs: + kwargs['incldirs'] = [v for v, in _resolve_file_values(filename, file_incldirs)] + if file_same and 'file_same' not in kwargs: + kwargs['samefiles'] = file_same + kwargs.setdefault('filename', filename) + with handling_errors(ignore_exc, log_err=log_err): + return _preprocess(filename, **kwargs) + return preprocess + return get_file_preprocessor + + +def _resolve_file_values(filename, file_values): + # We expect the filename and all patterns to be absolute paths. + for pattern, *value in file_values or (): + if _match_glob(filename, pattern): + yield value + + +def _parse_macros(macros): + for row, srcfile in _parse_table(macros, '\t', 'glob\tname\tvalue', rawsep='=', default=None): + yield row + + +def _parse_incldirs(incldirs): + for row, srcfile in _parse_table(incldirs, '\t', 'glob\tdirname', default=None): + glob, dirname = row + if dirname is None: + # Match all files. + dirname = glob + row = ('*', dirname.strip()) + yield row + + +@contextlib.contextmanager +def handling_errors(ignore_exc=None, *, log_err=None): + try: + yield + except _errors.OSMismatchError as exc: + if not ignore_exc(exc): + raise # re-raise + if log_err is not None: + log_err(f'') + return None + except _errors.MissingDependenciesError as exc: + if not ignore_exc(exc): + raise # re-raise + if log_err is not None: + log_err(f'4} {line.kind:10} | {text}') + + filenames = main_for_filenames(filenames, iter_filenames) + for filename in filenames: + lines = _iter_preprocessed(filename, **kwargs) + show_file(filename, lines) + + +def _cli_data(parser): + ... + + return None + + +def cmd_data(filenames, + **kwargs + ): + # XXX + raise NotImplementedError + + +COMMANDS = { + 'preprocess': ( + 'preprocess the given C source & header files', + [_cli_preprocess], + cmd_preprocess, + ), + 'data': ( + 'check/manage local data (e.g. excludes, macros)', + [_cli_data], + cmd_data, + ), +} + + +####################################### +# the script + +def parse_args(argv=sys.argv[1:], prog=sys.argv[0], *, + subset='preprocess', + excluded=None, + **prepr_kwargs + ): + import argparse + parser = argparse.ArgumentParser( + prog=prog or get_prog(), + ) + + processors = add_commands_cli( + parser, + commands={k: v[1] for k, v in COMMANDS.items()}, + commonspecs=[ + add_verbosity_cli, + add_traceback_cli, + ], + subset=subset, + ) + + args = parser.parse_args(argv) + ns = vars(args) + + cmd = ns.pop('cmd') + + verbosity, traceback_cm = process_args_by_key( + args, + processors[cmd], + ['verbosity', 'traceback_cm'], + ) + + return cmd, ns, verbosity, traceback_cm + + +def main(cmd, cmd_kwargs): + try: + run_cmd = COMMANDS[cmd][0] + except KeyError: + raise ValueError(f'unsupported cmd {cmd!r}') + run_cmd(**cmd_kwargs) + + +if __name__ == '__main__': + cmd, cmd_kwargs, verbosity, traceback_cm = parse_args() + configure_logger(verbosity) + with traceback_cm: + main(cmd, cmd_kwargs) diff --git a/Tools/c-analyzer/c_parser/preprocessor/common.py b/Tools/c-analyzer/c_parser/preprocessor/common.py new file mode 100644 index 00000000000000..63681025c63d47 --- /dev/null +++ b/Tools/c-analyzer/c_parser/preprocessor/common.py @@ -0,0 +1,173 @@ +import contextlib +import distutils.ccompiler +import logging +import shlex +import subprocess +import sys + +from ..info import FileInfo, SourceLine +from .errors import ( + PreprocessorFailure, + ErrorDirectiveError, + MissingDependenciesError, + OSMismatchError, +) + + +logger = logging.getLogger(__name__) + + +# XXX Add aggregate "source" class(es)? +# * expose all lines as single text string +# * expose all lines as sequence +# * iterate all lines + + +def run_cmd(argv, *, + #capture_output=True, + stdout=subprocess.PIPE, + #stderr=subprocess.STDOUT, + stderr=subprocess.PIPE, + text=True, + check=True, + **kwargs + ): + if isinstance(stderr, str) and stderr.lower() == 'stdout': + stderr = subprocess.STDOUT + + kw = dict(locals()) + kw.pop('argv') + kw.pop('kwargs') + kwargs.update(kw) + + proc = subprocess.run(argv, **kwargs) + return proc.stdout + + +def preprocess(tool, filename, **kwargs): + argv = _build_argv(tool, filename, **kwargs) + logger.debug(' '.join(shlex.quote(v) for v in argv)) + + # Make sure the OS is supported for this file. + if (_expected := is_os_mismatch(filename)): + error = None + raise OSMismatchError(filename, _expected, argv, error, TOOL) + + # Run the command. + with converted_error(tool, argv, filename): + # We use subprocess directly here, instead of calling the + # distutil compiler object's preprocess() method, since that + # one writes to stdout/stderr and it's simpler to do it directly + # through subprocess. + return run_cmd(argv) + + +def _build_argv( + tool, + filename, + incldirs=None, + macros=None, + preargs=None, + postargs=None, + executable=None, + compiler=None, +): + compiler = distutils.ccompiler.new_compiler( + compiler=compiler or tool, + ) + if executable: + compiler.set_executable('preprocessor', executable) + + argv = None + def _spawn(_argv): + nonlocal argv + argv = _argv + compiler.spawn = _spawn + compiler.preprocess( + filename, + macros=[tuple(v) for v in macros or ()], + include_dirs=incldirs or (), + extra_preargs=preargs or (), + extra_postargs=postargs or (), + ) + return argv + + +@contextlib.contextmanager +def converted_error(tool, argv, filename): + try: + yield + except subprocess.CalledProcessError as exc: + convert_error( + tool, + argv, + filename, + exc.stderr, + exc.returncode, + ) + + +def convert_error(tool, argv, filename, stderr, rc): + error = (stderr.splitlines()[0], rc) + if (_expected := is_os_mismatch(filename, stderr)): + logger.debug(stderr.strip()) + raise OSMismatchError(filename, _expected, argv, error, tool) + elif (_missing := is_missing_dep(stderr)): + logger.debug(stderr.strip()) + raise MissingDependenciesError(filename, (_missing,), argv, error, tool) + elif '#error' in stderr: + # XXX Ignore incompatible files. + error = (stderr.splitlines()[1], rc) + logger.debug(stderr.strip()) + raise ErrorDirectiveError(filename, argv, error, tool) + else: + # Try one more time, with stderr written to the terminal. + try: + output = run_cmd(argv, stderr=None) + except subprocess.CalledProcessError: + raise PreprocessorFailure(filename, argv, error, tool) + + +def is_os_mismatch(filename, errtext=None): + # See: https://docs.python.org/3/library/sys.html#sys.platform + actual = sys.platform + if actual == 'unknown': + raise NotImplementedError + + if errtext is not None: + if (missing := is_missing_dep(errtext)): + matching = get_matching_oses(missing, filename) + if actual not in matching: + return matching + return False + + +def get_matching_oses(missing, filename): + # OSX + if 'darwin' in filename or 'osx' in filename: + return ('darwin',) + elif missing == 'SystemConfiguration/SystemConfiguration.h': + return ('darwin',) + + # Windows + elif missing in ('windows.h', 'winsock2.h'): + return ('win32',) + + # other + elif missing == 'sys/ldr.h': + return ('aix',) + elif missing == 'dl.h': + # XXX The existence of Python/dynload_dl.c implies others... + # Note that hpux isn't actual supported any more. + return ('hpux', '???') + + # unrecognized + else: + return () + + +def is_missing_dep(errtext): + if 'No such file or directory' in errtext: + missing = errtext.split(': No such file or directory')[0].split()[-1] + return missing + return False diff --git a/Tools/c-analyzer/c_parser/preprocessor/errors.py b/Tools/c-analyzer/c_parser/preprocessor/errors.py new file mode 100644 index 00000000000000..9b66801d630a62 --- /dev/null +++ b/Tools/c-analyzer/c_parser/preprocessor/errors.py @@ -0,0 +1,110 @@ +import sys + + +OS = sys.platform + + +def _as_tuple(items): + if isinstance(items, str): + return tuple(items.strip().replace(',', ' ').split()) + elif items: + return tuple(items) + else: + return () + + +class PreprocessorError(Exception): + """Something preprocessor-related went wrong.""" + + @classmethod + def _msg(cls, filename, reason, **ignored): + msg = 'failure while preprocessing' + if reason: + msg = f'{msg} ({reason})' + return msg + + def __init__(self, filename, preprocessor=None, reason=None): + if isinstance(reason, str): + reason = reason.strip() + + self.filename = filename + self.preprocessor = preprocessor or None + self.reason = str(reason) if reason else None + + msg = self._msg(**vars(self)) + msg = f'({filename}) {msg}' + if preprocessor: + msg = f'[{preprocessor}] {msg}' + super().__init__(msg) + + +class PreprocessorFailure(PreprocessorError): + """The preprocessor command failed.""" + + @classmethod + def _msg(cls, error, **ignored): + msg = 'preprocessor command failed' + if error: + msg = f'{msg} {error}' + return msg + + def __init__(self, filename, argv, error=None, preprocessor=None): + exitcode = -1 + if isinstance(error, tuple): + if len(error) == 2: + error, exitcode = error + else: + error = str(error) + if isinstance(error, str): + error = error.strip() + + self.argv = _as_tuple(argv) or None + self.error = error if error else None + self.exitcode = exitcode + + reason = str(self.error) + super().__init__(filename, preprocessor, reason) + + +class ErrorDirectiveError(PreprocessorFailure): + """The file hit a #error directive.""" + + @classmethod + def _msg(cls, error, **ignored): + return f'#error directive hit ({error})' + + def __init__(self, filename, argv, error, *args, **kwargs): + super().__init__(filename, argv, error, *args, **kwargs) + + +class MissingDependenciesError(PreprocessorFailure): + """The preprocessor did not have access to all the target's dependencies.""" + + @classmethod + def _msg(cls, missing, **ignored): + msg = 'preprocessing failed due to missing dependencies' + if missing: + msg = f'{msg} ({", ".join(missing)})' + return msg + + def __init__(self, filename, missing=None, *args, **kwargs): + self.missing = _as_tuple(missing) or None + + super().__init__(filename, *args, **kwargs) + + +class OSMismatchError(MissingDependenciesError): + """The target is not compatible with the host OS.""" + + @classmethod + def _msg(cls, expected, **ignored): + return f'OS is {OS} but expected {expected or "???"}' + + def __init__(self, filename, expected=None, *args, **kwargs): + if isinstance(expected, str): + expected = expected.strip() + + self.actual = OS + self.expected = expected if expected else None + + super().__init__(filename, None, *args, **kwargs) diff --git a/Tools/c-analyzer/c_parser/preprocessor/gcc.py b/Tools/c-analyzer/c_parser/preprocessor/gcc.py new file mode 100644 index 00000000000000..bb404a487b735d --- /dev/null +++ b/Tools/c-analyzer/c_parser/preprocessor/gcc.py @@ -0,0 +1,123 @@ +import os.path +import re + +from . import common as _common + + +TOOL = 'gcc' + +# https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html +LINE_MARKER_RE = re.compile(r'^# (\d+) "([^"]+)"(?: [1234])*$') +PREPROC_DIRECTIVE_RE = re.compile(r'^\s*#\s*(\w+)\b.*') +COMPILER_DIRECTIVE_RE = re.compile(r''' + ^ + (.*?) # + (__\w+__) # + \s* + [(] [(] + ( + [^()]* + (?: + [(] + [^()]* + [)] + [^()]* + )* + ) # + ( [)] [)] )? # +''', re.VERBOSE) + +POST_ARGS = ( + '-pthread', + '-std=c99', + #'-g', + #'-Og', + #'-Wno-unused-result', + #'-Wsign-compare', + #'-Wall', + #'-Wextra', + '-E', +) + + +def preprocess(filename, incldirs=None, macros=None, samefiles=None): + text = _common.preprocess( + TOOL, + filename, + incldirs=incldirs, + macros=macros, + #preargs=PRE_ARGS, + postargs=POST_ARGS, + executable=['gcc'], + compiler='unix', + ) + return _iter_lines(text, filename, samefiles) + + +def _iter_lines(text, filename, samefiles, *, raw=False): + lines = iter(text.splitlines()) + + # Build the lines and filter out directives. + partial = 0 # depth + origfile = None + for line in lines: + m = LINE_MARKER_RE.match(line) + if m: + lno, origfile = m.groups() + lno = int(lno) + elif _filter_orig_file(origfile, filename, samefiles): + if (m := PREPROC_DIRECTIVE_RE.match(line)): + name, = m.groups() + if name != 'pragma': + raise Exception(line) + else: + if not raw: + line, partial = _strip_directives(line, partial=partial) + yield _common.SourceLine( + _common.FileInfo(filename, lno), + 'source', + line or '', + None, + ) + lno += 1 + + +def _strip_directives(line, partial=0): + # We assume there are no string literals with parens in directive bodies. + while partial > 0: + if not (m := re.match(r'[^{}]*([()])', line)): + return None, partial + delim, = m.groups() + partial += 1 if delim == '(' else -1 # opened/closed + line = line[m.end():] + + line = re.sub(r'__extension__', '', line) + + while (m := COMPILER_DIRECTIVE_RE.match(line)): + before, _, _, closed = m.groups() + if closed: + line = f'{before} {line[m.end():]}' + else: + after, partial = _strip_directives(line[m.end():], 2) + line = f'{before} {after or ""}' + if partial: + break + + return line, partial + + +def _filter_orig_file(origfile, current, samefiles): + if origfile == current: + return True + if origfile == '': + return True + if os.path.isabs(origfile): + return False + + for filename in samefiles or (): + if filename.endswith(os.path.sep): + filename += os.path.basename(current) + if origfile == filename: + return True + + return False diff --git a/Tools/c-analyzer/c_parser/preprocessor/pure.py b/Tools/c-analyzer/c_parser/preprocessor/pure.py new file mode 100644 index 00000000000000..e971389b1888dd --- /dev/null +++ b/Tools/c-analyzer/c_parser/preprocessor/pure.py @@ -0,0 +1,23 @@ +from ..source import ( + opened as _open_source, +) +from . import common as _common + + +def preprocess(lines, filename=None): + if isinstance(lines, str): + with _open_source(lines, filename) as (lines, filename): + yield from preprocess(lines, filename) + return + + # XXX actually preprocess... + for lno, line in enumerate(lines, 1): + kind = 'source' + data = line + conditions = None + yield _common.SourceLine( + _common.FileInfo(filename, lno), + kind, + data, + conditions, + ) diff --git a/Tools/c-analyzer/c_parser/source.py b/Tools/c-analyzer/c_parser/source.py new file mode 100644 index 00000000000000..30a09eeb56a1f7 --- /dev/null +++ b/Tools/c-analyzer/c_parser/source.py @@ -0,0 +1,64 @@ +import contextlib +import os.path + + +def resolve(source, filename): + if _looks_like_filename(source): + return _resolve_filename(source, filename) + + if isinstance(source, str): + source = source.splitlines() + + # At this point "source" is not a str. + if not filename: + filename = None + elif not isinstance(filename, str): + raise TypeError(f'filename should be str (or None), got {filename!r}') + else: + filename, _ = _resolve_filename(filename) + return source, filename + + +@contextlib.contextmanager +def good_file(filename, alt=None): + if not _looks_like_filename(filename): + raise ValueError(f'expected a filename, got {filename}') + filename, _ = _resolve_filename(filename, alt) + try: + yield filename + except Exception: + if not os.path.exists(filename): + raise FileNotFoundError(f'file not found: {filename}') + raise # re-raise + + +def _looks_like_filename(value): + if not isinstance(value, str): + return False + return value.endswith(('.c', '.h')) + + +def _resolve_filename(filename, alt=None): + if os.path.isabs(filename): + ... +# raise NotImplementedError + else: + filename = os.path.join('.', filename) + + if not alt: + alt = filename + elif os.path.abspath(filename) == os.path.abspath(alt): + alt = filename + else: + raise ValueError(f'mismatch: {filename} != {alt}') + return filename, alt + + +@contextlib.contextmanager +def opened(source, filename=None): + source, filename = resolve(source, filename) + if isinstance(source, str): + with open(source) as srcfile: + yield srcfile, filename + else: + yield source, filename diff --git a/Tools/c-analyzer/check-c-globals.py b/Tools/c-analyzer/check-c-globals.py index 1371f927423279..3fe2bdcae14603 100644 --- a/Tools/c-analyzer/check-c-globals.py +++ b/Tools/c-analyzer/check-c-globals.py @@ -1,448 +1,35 @@ +from cpython.__main__ import main, configure_logger -from collections import namedtuple -import glob -import os.path -import re -import shutil -import sys -import subprocess - - -VERBOSITY = 2 - -C_GLOBALS_DIR = os.path.abspath(os.path.dirname(__file__)) -TOOLS_DIR = os.path.dirname(C_GLOBALS_DIR) -ROOT_DIR = os.path.dirname(TOOLS_DIR) -GLOBALS_FILE = os.path.join(C_GLOBALS_DIR, 'ignored-globals.txt') - -SOURCE_DIRS = ['Include', 'Objects', 'Modules', 'Parser', 'Python'] - -CAPI_REGEX = re.compile(r'^ *PyAPI_DATA\([^)]*\) \W*(_?Py\w+(?:, \w+)*\w).*;.*$') - - -IGNORED_VARS = { - '_DYNAMIC', - '_GLOBAL_OFFSET_TABLE_', - '__JCR_LIST__', - '__JCR_END__', - '__TMC_END__', - '__bss_start', - '__data_start', - '__dso_handle', - '_edata', - '_end', - } - - -def find_capi_vars(root): - capi_vars = {} - for dirname in SOURCE_DIRS: - for filename in glob.glob(os.path.join( - glob.escape(os.path.join(ROOT_DIR, dirname)), - '**/*.[hc]'), - recursive=True): - with open(filename) as file: - for name in _find_capi_vars(file): - if name in capi_vars: - assert not filename.endswith('.c') - assert capi_vars[name].endswith('.c') - capi_vars[name] = filename - return capi_vars - - -def _find_capi_vars(lines): - for line in lines: - if not line.startswith('PyAPI_DATA'): - continue - assert '{' not in line - match = CAPI_REGEX.match(line) - assert match - names, = match.groups() - for name in names.split(', '): - yield name - - -def _read_global_names(filename): - # These variables are shared between all interpreters in the process. - with open(filename) as file: - return {line.partition('#')[0].strip() - for line in file - if line.strip() and not line.startswith('#')} - - -def _is_global_var(name, globalnames): - if _is_autogen_var(name): - return True - if _is_type_var(name): - return True - if _is_module(name): - return True - if _is_exception(name): - return True - if _is_compiler(name): - return True - return name in globalnames - - -def _is_autogen_var(name): - return ( - name.startswith('PyId_') or - '.' in name or - # Objects/typeobject.c - name.startswith('op_id.') or - name.startswith('rop_id.') or - # Python/graminit.c - name.startswith('arcs_') or - name.startswith('states_') - ) - - -def _is_type_var(name): - if name.endswith(('Type', '_Type', '_type')): # XXX Always a static type? - return True - if name.endswith('_desc'): # for structseq types - return True - return ( - name.startswith('doc_') or - name.endswith(('_doc', '__doc__', '_docstring')) or - name.endswith('_methods') or - name.endswith('_fields') or - name.endswith(('_memberlist', '_members')) or - name.endswith('_slots') or - name.endswith(('_getset', '_getsets', '_getsetlist')) or - name.endswith('_as_mapping') or - name.endswith('_as_number') or - name.endswith('_as_sequence') or - name.endswith('_as_buffer') or - name.endswith('_as_async') - ) - - -def _is_module(name): - if name.endswith(('_functions', 'Methods', '_Methods')): - return True - if name == 'module_def': - return True - if name == 'initialized': - return True - return name.endswith(('module', '_Module')) - - -def _is_exception(name): - # Other vars are enumerated in globals-core.txt. - if not name.startswith(('PyExc_', '_PyExc_')): - return False - return name.endswith(('Error', 'Warning')) - - -def _is_compiler(name): - return ( - # Python/Python-ast.c - name.endswith('_type') or - name.endswith('_singleton') or - name.endswith('_attributes') - ) - - -class Var(namedtuple('Var', 'name kind scope capi filename')): - - @classmethod - def parse_nm(cls, line, expected, ignored, capi_vars, globalnames): - _, _, line = line.partition(' ') # strip off the address - line = line.strip() - kind, _, line = line.partition(' ') - if kind in ignored or (): - return None - elif kind not in expected or (): - raise RuntimeError('unsupported NM type {!r}'.format(kind)) - - name, _, filename = line.partition('\t') - name = name.strip() - if _is_autogen_var(name): - return None - if _is_global_var(name, globalnames): - scope = 'global' - else: - scope = None - capi = (name in capi_vars or ()) - if filename: - filename = os.path.relpath(filename.partition(':')[0]) - return cls(name, kind, scope, capi, filename or '~???~') - - @property - def external(self): - return self.kind.isupper() - - -def find_vars(root, globals_filename=GLOBALS_FILE): - python = os.path.join(root, 'python') - if not os.path.exists(python): - raise RuntimeError('python binary missing (need to build it first?)') - capi_vars = find_capi_vars(root) - globalnames = _read_global_names(globals_filename) - - nm = shutil.which('nm') - if nm is None: - # XXX Use dumpbin.exe /SYMBOLS on Windows. - raise NotImplementedError - else: - yield from (var - for var in _find_var_symbols(python, nm, capi_vars, - globalnames) - if var.name not in IGNORED_VARS) - - -NM_FUNCS = set('Tt') -NM_PUBLIC_VARS = set('BD') -NM_PRIVATE_VARS = set('bd') -NM_VARS = NM_PUBLIC_VARS | NM_PRIVATE_VARS -NM_DATA = set('Rr') -NM_OTHER = set('ACGgiINpSsuUVvWw-?') -NM_IGNORED = NM_FUNCS | NM_DATA | NM_OTHER - - -def _find_var_symbols(python, nm, capi_vars, globalnames): - args = [nm, - '--line-numbers', - python] - out = subprocess.check_output(args) - for line in out.decode('utf-8').splitlines(): - var = Var.parse_nm(line, NM_VARS, NM_IGNORED, capi_vars, globalnames) - if var is None: - continue - yield var - - -####################################### - -class Filter(namedtuple('Filter', 'name op value action')): - - @classmethod - def parse(cls, raw): - action = '+' - if raw.startswith(('+', '-')): - action = raw[0] - raw = raw[1:] - # XXX Support < and >? - name, op, value = raw.partition('=') - return cls(name, op, value, action) - - def check(self, var): - value = getattr(var, self.name, None) - if not self.op: - matched = bool(value) - elif self.op == '=': - matched = (value == self.value) - else: - raise NotImplementedError - - if self.action == '+': - return matched - elif self.action == '-': - return not matched - else: - raise NotImplementedError - - -def filter_var(var, filters): - for filter in filters: - if not filter.check(var): - return False - return True - - -def make_sort_key(spec): - columns = [(col.strip('_'), '_' if col.startswith('_') else '') - for col in spec] - def sort_key(var): - return tuple(getattr(var, col).lstrip(prefix) - for col, prefix in columns) - return sort_key - - -def make_groups(allvars, spec): - group = spec - groups = {} - for var in allvars: - value = getattr(var, group) - key = '{}: {}'.format(group, value) - try: - groupvars = groups[key] - except KeyError: - groupvars = groups[key] = [] - groupvars.append(var) - return groups - - -def format_groups(groups, columns, fmts, widths): - for group in sorted(groups): - groupvars = groups[group] - yield '', 0 - yield ' # {}'.format(group), 0 - yield from format_vars(groupvars, columns, fmts, widths) - - -def format_vars(allvars, columns, fmts, widths): - fmt = ' '.join(fmts[col] for col in columns) - fmt = ' ' + fmt.replace(' ', ' ') + ' ' # for div margin - header = fmt.replace(':', ':^').format(*(col.upper() for col in columns)) - yield header, 0 - div = ' '.join('-'*(widths[col]+2) for col in columns) - yield div, 0 - for var in allvars: - values = (getattr(var, col) for col in columns) - row = fmt.format(*('X' if val is True else val or '' - for val in values)) - yield row, 1 - yield div, 0 - - -####################################### - -COLUMNS = 'name,external,capi,scope,filename' -COLUMN_NAMES = COLUMNS.split(',') - -COLUMN_WIDTHS = {col: len(col) - for col in COLUMN_NAMES} -COLUMN_WIDTHS.update({ - 'name': 50, - 'scope': 7, - 'filename': 40, - }) -COLUMN_FORMATS = {col: '{:%s}' % width - for col, width in COLUMN_WIDTHS.items()} -for col in COLUMN_FORMATS: - if COLUMN_WIDTHS[col] == len(col): - COLUMN_FORMATS[col] = COLUMN_FORMATS[col].replace(':', ':^') - - -def _parse_filters_arg(raw, error): - filters = [] - for value in raw.split(','): - value=value.strip() - if not value: - continue - try: - filter = Filter.parse(value) - if filter.name not in COLUMN_NAMES: - raise Exception('unsupported column {!r}'.format(filter.name)) - except Exception as e: - error('bad filter {!r}: {}'.format(raw, e)) - filters.append(filter) - return filters - - -def _parse_columns_arg(raw, error): - columns = raw.split(',') - for column in columns: - if column not in COLUMN_NAMES: - error('unsupported column {!r}'.format(column)) - return columns - - -def _parse_sort_arg(raw, error): - sort = raw.split(',') - for column in sort: - if column.lstrip('_') not in COLUMN_NAMES: - error('unsupported column {!r}'.format(column)) - return sort - - -def _parse_group_arg(raw, error): - if not raw: - return raw - group = raw - if group not in COLUMN_NAMES: - error('unsupported column {!r}'.format(group)) - if group != 'filename': - error('unsupported group {!r}'.format(group)) - return group - - -def parse_args(argv=None): - if argv is None: - argv = sys.argv[1:] +def parse_args(): import argparse + from c_common.scriptutil import ( + add_verbosity_cli, + add_traceback_cli, + process_args_by_key, + ) + from cpython.__main__ import _cli_check parser = argparse.ArgumentParser() + processors = [ + add_verbosity_cli(parser), + add_traceback_cli(parser), + _cli_check(parser, checks=''), + ] - parser.add_argument('-v', '--verbose', action='count', default=0) - parser.add_argument('-q', '--quiet', action='count', default=0) - - parser.add_argument('--filters', default='-scope', - help='[[-][=]] ...') - - parser.add_argument('--columns', default=COLUMNS, - help='a comma-separated list of columns to show') - parser.add_argument('--sort', default='filename,_name', - help='a comma-separated list of columns to sort') - parser.add_argument('--group', - help='group by the given column name (- to not group)') - - parser.add_argument('--rc-on-match', dest='rc', type=int) - - parser.add_argument('filename', nargs='?', default=GLOBALS_FILE) - - args = parser.parse_args(argv) - - verbose = vars(args).pop('verbose', 0) - quiet = vars(args).pop('quiet', 0) - args.verbosity = max(0, VERBOSITY + verbose - quiet) - - if args.sort.startswith('filename') and not args.group: - args.group = 'filename' - - if args.rc is None: - if '-scope=core' in args.filters or 'core' not in args.filters: - args.rc = 0 - else: - args.rc = 1 - - args.filters = _parse_filters_arg(args.filters, parser.error) - args.columns = _parse_columns_arg(args.columns, parser.error) - args.sort = _parse_sort_arg(args.sort, parser.error) - args.group = _parse_group_arg(args.group, parser.error) - - return args - - -def main(root=ROOT_DIR, filename=GLOBALS_FILE, - filters=None, columns=COLUMN_NAMES, sort=None, group=None, - verbosity=VERBOSITY, rc=1): - - log = lambda msg: ... - if verbosity >= 2: - log = lambda msg: print(msg) - - allvars = (var - for var in find_vars(root, filename) - if filter_var(var, filters)) - if sort: - allvars = sorted(allvars, key=make_sort_key(sort)) - - if group: - try: - columns.remove(group) - except ValueError: - pass - grouped = make_groups(allvars, group) - lines = format_groups(grouped, columns, COLUMN_FORMATS, COLUMN_WIDTHS) - else: - lines = format_vars(allvars, columns, COLUMN_FORMATS, COLUMN_WIDTHS) + args = parser.parse_args() + ns = vars(args) - total = 0 - for line, count in lines: - total += count - log(line) - log('\ntotal: {}'.format(total)) + cmd = 'check' + verbosity, traceback_cm = process_args_by_key( + args, + processors, + ['verbosity', 'traceback_cm'], + ) - if total and rc: - print('ERROR: found unsafe globals', file=sys.stderr) - return rc - return 0 + return cmd, ns, verbosity, traceback_cm -if __name__ == '__main__': - args = parse_args() - sys.exit( - main(**vars(args))) +(cmd, cmd_kwargs, verbosity, traceback_cm) = parse_args() +configure_logger(verbosity) +with traceback_cm: + main(cmd, cmd_kwargs) diff --git a/Tools/c-analyzer/cpython/README b/Tools/c-analyzer/cpython/README deleted file mode 100644 index 772b8be27008bd..00000000000000 --- a/Tools/c-analyzer/cpython/README +++ /dev/null @@ -1,72 +0,0 @@ -####################################### -# C Globals and CPython Runtime State. - -CPython's C code makes extensive use of global variables (whether static -globals or static locals). Each such variable falls into one of several -categories: - -* strictly const data -* used exclusively in main or in the REPL -* process-global state (e.g. managing process-level resources - like signals and file descriptors) -* Python "global" runtime state -* per-interpreter runtime state - -The last one can be a problem as soon as anyone creates a second -interpreter (AKA "subinterpreter") in a process. It is definitely a -problem under subinterpreters if they are no longer sharing the GIL, -since the GIL protects us from a lot of race conditions. Keep in mind -that ultimately *all* objects (PyObject) should be treated as -per-interpreter state. This includes "static types", freelists, -_PyIdentifier, and singletons. Take that in for a second. It has -significant implications on where we use static variables! - -Be aware that module-global state (stored in C statics) is a kind of -per-interpreter state. There have been efforts across many years, and -still going, to provide extension module authors mechanisms to store -that state safely (see PEPs 3121, 489, etc.). - -(Note that there has been discussion around support for running multiple -Python runtimes in the same process. That would ends up with the same -problems, relative to static variables, that subinterpreters have.) - -Historically we have been bad at keeping per-interpreter state out of -static variables, mostly because until recently subinterpreters were -not widely used nor even factored in to solutions. However, the -feature is growing in popularity and use in the community. - -Mandate: "Eliminate use of static variables for per-interpreter state." - -The "c-statics.py" script in this directory, along with its accompanying -data files, are part of the effort to resolve existing problems with -our use of static variables and to prevent future problems. - -#------------------------- -## statics for actually-global state (and runtime state consolidation) - -In general, holding any kind of state in static variables -increases maintenance burden and increases the complexity of code (e.g. -we use TSS to identify the active thread state). So it is a good idea -to avoid using statics for state even if for the "global" runtime or -for process-global state. - -Relative to maintenance burden, one problem is where the runtime -state is spread throughout the codebase in dozens of individual -globals. Unlike the other globals, the runtime state represents a set -of values that are constantly shifting in a complex way. When they are -spread out it's harder to get a clear picture of what the runtime -involves. Furthermore, when they are spread out it complicates efforts -that change the runtime. - -Consequently, the globals for Python's runtime state have been -consolidated under a single top-level _PyRuntime global. No new globals -should be added for runtime state. Instead, they should be added to -_PyRuntimeState or one of its sub-structs. The tools in this directory -are run as part of the test suite to ensure that no new globals have -been added. The script can be run manually as well: - - ./python Lib/test/test_c_statics/c-statics.py check - -If it reports any globals then they should be resolved. If the globals -are runtime state then they should be folded into _PyRuntimeState. -Otherwise they should be marked as ignored. diff --git a/Tools/c-analyzer/cpython/__init__.py b/Tools/c-analyzer/cpython/__init__.py index ae45b424e3cc8e..d0b3eff3c4b86d 100644 --- a/Tools/c-analyzer/cpython/__init__.py +++ b/Tools/c-analyzer/cpython/__init__.py @@ -1,29 +1,20 @@ import os.path -import sys -TOOL_ROOT = os.path.abspath( +TOOL_ROOT = os.path.normcase( + os.path.abspath( os.path.dirname( # c-analyzer/ - os.path.dirname(__file__))) # cpython/ -DATA_DIR = TOOL_ROOT + os.path.dirname(__file__)))) # cpython/ REPO_ROOT = ( os.path.dirname( # .. os.path.dirname(TOOL_ROOT))) # Tools/ INCLUDE_DIRS = [os.path.join(REPO_ROOT, name) for name in [ - 'Include', - ]] + 'Include', +]] SOURCE_DIRS = [os.path.join(REPO_ROOT, name) for name in [ - 'Python', - 'Parser', - 'Objects', - 'Modules', - ]] - -#PYTHON = os.path.join(REPO_ROOT, 'python') -PYTHON = sys.executable - - -# Clean up the namespace. -del sys -del os + 'Python', + 'Parser', + 'Objects', + 'Modules', +]] diff --git a/Tools/c-analyzer/cpython/__main__.py b/Tools/c-analyzer/cpython/__main__.py index 6b0f9bcb9687fb..23a3de06f639c1 100644 --- a/Tools/c-analyzer/cpython/__main__.py +++ b/Tools/c-analyzer/cpython/__main__.py @@ -1,212 +1,280 @@ -import argparse -import re +import logging import sys -from c_analyzer.common import show -from c_analyzer.common.info import UNKNOWN +from c_common.fsutil import expand_filenames, iter_files_by_suffix +from c_common.scriptutil import ( + add_verbosity_cli, + add_traceback_cli, + add_commands_cli, + add_kind_filtering_cli, + add_files_cli, + process_args_by_key, + configure_logger, + get_prog, +) +from c_parser.info import KIND +import c_parser.__main__ as c_parser +import c_analyzer.__main__ as c_analyzer +import c_analyzer as _c_analyzer +from c_analyzer.info import UNKNOWN +from . import _analyzer, _parser, REPO_ROOT + + +logger = logging.getLogger(__name__) + + +def _resolve_filenames(filenames): + if filenames: + resolved = (_parser.resolve_filename(f) for f in filenames) + else: + resolved = _parser.iter_filenames() + return resolved + + +def fmt_summary(analysis): + # XXX Support sorting and grouping. + supported = [] + unsupported = [] + for item in analysis: + if item.supported: + supported.append(item) + else: + unsupported.append(item) + total = 0 + + def section(name, groupitems): + nonlocal total + items, render = c_analyzer.build_section(name, groupitems, + relroot=REPO_ROOT) + yield from render() + total += len(items) + + yield '' + yield '====================' + yield 'supported' + yield '====================' + + yield from section('types', supported) + yield from section('variables', supported) + + yield '' + yield '====================' + yield 'unsupported' + yield '====================' + + yield from section('types', unsupported) + yield from section('variables', unsupported) + + yield '' + yield f'grand total: {total}' + -from . import SOURCE_DIRS -from .find import supported_vars -from .known import ( - from_file as known_from_file, - DATA_FILE as KNOWN_FILE, +####################################### +# the checks + +CHECKS = dict(c_analyzer.CHECKS, **{ + 'globals': _analyzer.check_globals, +}) + +####################################### +# the commands + +FILES_KWARGS = dict(excluded=_parser.EXCLUDED, nargs='*') + + +def _cli_parse(parser): + process_output = c_parser.add_output_cli(parser) + process_kind = add_kind_filtering_cli(parser) + process_preprocessor = c_parser.add_preprocessor_cli( + parser, + get_preprocessor=_parser.get_preprocessor, + ) + process_files = add_files_cli(parser, **FILES_KWARGS) + return [ + process_output, + process_kind, + process_preprocessor, + process_files, + ] + + +def cmd_parse(filenames=None, **kwargs): + filenames = _resolve_filenames(filenames) + if 'get_file_preprocessor' not in kwargs: + kwargs['get_file_preprocessor'] = _parser.get_preprocessor() + c_parser.cmd_parse(filenames, **kwargs) + + +def _cli_check(parser, **kwargs): + return c_analyzer._cli_check(parser, CHECKS, **kwargs, **FILES_KWARGS) + + +def cmd_check(filenames=None, **kwargs): + filenames = _resolve_filenames(filenames) + kwargs['get_file_preprocessor'] = _parser.get_preprocessor(log_err=print) + c_analyzer.cmd_check( + filenames, + relroot=REPO_ROOT, + _analyze=_analyzer.analyze, + _CHECKS=CHECKS, + **kwargs ) -from .supported import IGNORED_FILE - - -def _check_results(unknown, knownvars, used): - def _match_unused_global(variable): - found = [] - for varid in knownvars: - if varid in used: - continue - if varid.funcname is not None: - continue - if varid.name != variable.name: - continue - if variable.filename and variable.filename != UNKNOWN: - if variable.filename == varid.filename: - found.append(varid) - else: - found.append(varid) - return found - - badknown = set() - for variable in sorted(unknown): - msg = None - if variable.funcname != UNKNOWN: - msg = f'could not find global symbol {variable.id}' - elif m := _match_unused_global(variable): - assert isinstance(m, list) - badknown.update(m) - elif variable.name in ('completed', 'id'): # XXX Figure out where these variables are. - unknown.remove(variable) - else: - msg = f'could not find local symbol {variable.id}' - if msg: - #raise Exception(msg) - print(msg) - if badknown: - print('---') - print(f'{len(badknown)} globals in known.tsv, but may actually be local:') - for varid in sorted(badknown): - print(f'{varid.filename:30} {varid.name}') - unused = sorted(varid - for varid in set(knownvars) - used - if varid.name != 'id') # XXX Figure out where these variables are. - if unused: - print('---') - print(f'did not use {len(unused)} known vars:') - for varid in unused: - print(f'{varid.filename:30} {varid.funcname or "-":20} {varid.name}') - raise Exception('not all known symbols used') - if unknown: - print('---') - raise Exception('could not find all symbols') - - -# XXX Move this check to its own command. -def cmd_check_cache(cmd, *, - known=KNOWN_FILE, - ignored=IGNORED_FILE, - _known_from_file=known_from_file, - _find=supported_vars, - ): - known = _known_from_file(known) - - used = set() - unknown = set() - for var, supported in _find(known=known, ignored=ignored): - if supported is None: - unknown.add(var) - continue - used.add(var.id) - _check_results(unknown, known['variables'], used) - - -def cmd_check(cmd, *, - known=KNOWN_FILE, - ignored=IGNORED_FILE, - _find=supported_vars, - _show=show.basic, - _print=print, - ): - """ - Fail if there are unsupported globals variables. - - In the failure case, the list of unsupported variables - will be printed out. - """ - unsupported = [] - for var, supported in _find(known=known, ignored=ignored): - if not supported: - unsupported.append(var) - - if not unsupported: - #_print('okay') - return - - _print('ERROR: found unsupported global variables') - _print() - _show(sorted(unsupported)) - _print(f' ({len(unsupported)} total)') - sys.exit(1) - - -def cmd_show(cmd, *, - known=KNOWN_FILE, - ignored=IGNORED_FILE, - skip_objects=False, - _find=supported_vars, - _show=show.basic, - _print=print, - ): - """ - Print out the list of found global variables. - - The variables will be distinguished as "supported" or "unsupported". - """ - allsupported = [] - allunsupported = [] - for found, supported in _find(known=known, - ignored=ignored, - skip_objects=skip_objects, - ): - if supported is None: - continue - (allsupported if supported else allunsupported - ).append(found) - - _print('supported:') - _print('----------') - _show(sorted(allsupported)) - _print(f' ({len(allsupported)} total)') - _print() - _print('unsupported:') - _print('------------') - _show(sorted(allunsupported)) - _print(f' ({len(allunsupported)} total)') - - -############################# -# the script -COMMANDS = { - 'check': cmd_check, - 'show': cmd_show, - } - -PROG = sys.argv[0] -PROG = 'c-globals.py' - - -def parse_args(prog=PROG, argv=sys.argv[1:], *, _fail=None): - common = argparse.ArgumentParser(add_help=False) - common.add_argument('--ignored', metavar='FILE', - default=IGNORED_FILE, - help='path to file that lists ignored vars') - common.add_argument('--known', metavar='FILE', - default=KNOWN_FILE, - help='path to file that lists known types') - #common.add_argument('dirs', metavar='DIR', nargs='*', - # default=SOURCE_DIRS, - # help='a directory to check') - parser = argparse.ArgumentParser( - prog=prog, +def cmd_analyze(filenames=None, **kwargs): + formats = dict(c_analyzer.FORMATS) + formats['summary'] = fmt_summary + filenames = _resolve_filenames(filenames) + kwargs['get_file_preprocessor'] = _parser.get_preprocessor(log_err=print) + c_analyzer.cmd_analyze( + filenames, + _analyze=_analyzer.analyze, + formats=formats, + **kwargs + ) + + +def _cli_data(parser): + filenames = False + known = True + return c_analyzer._cli_data(parser, filenames, known) + + +def cmd_data(datacmd, **kwargs): + formats = dict(c_analyzer.FORMATS) + formats['summary'] = fmt_summary + filenames = (file + for file in _resolve_filenames(None) + if file not in _parser.EXCLUDED) + kwargs['get_file_preprocessor'] = _parser.get_preprocessor(log_err=print) + if datacmd == 'show': + types = _analyzer.read_known() + results = [] + for decl, info in types.items(): + if info is UNKNOWN: + if decl.kind in (KIND.STRUCT, KIND.UNION): + extra = {'unsupported': ['type unknown'] * len(decl.members)} + else: + extra = {'unsupported': ['type unknown']} + info = (info, extra) + results.append((decl, info)) + if decl.shortkey == 'struct _object': + tempinfo = info + known = _analyzer.Analysis.from_results(results) + analyze = None + elif datacmd == 'dump': + known = _analyzer.KNOWN_FILE + def analyze(files, **kwargs): + decls = [] + for decl in _analyzer.iter_decls(files, **kwargs): + if not KIND.is_type_decl(decl.kind): + continue + if not decl.filename.endswith('.h'): + if decl.shortkey not in _analyzer.KNOWN_IN_DOT_C: + continue + decls.append(decl) + results = _c_analyzer.analyze_decls( + decls, + known={}, + analyze_resolved=_analyzer.analyze_resolved, ) - subs = parser.add_subparsers(dest='cmd') + return _analyzer.Analysis.from_results(results) + else: + known = _analyzer.read_known() + def analyze(files, **kwargs): + return _analyzer.iter_decls(files, **kwargs) + extracolumns = None + c_analyzer.cmd_data( + datacmd, + filenames, + known, + _analyze=analyze, + formats=formats, + extracolumns=extracolumns, + relroot=REPO_ROOT, + **kwargs + ) - check = subs.add_parser('check', parents=[common]) - show = subs.add_parser('show', parents=[common]) - show.add_argument('--skip-objects', action='store_true') +# We do not define any other cmd_*() handlers here, +# favoring those defined elsewhere. - if _fail is None: - def _fail(msg): - parser.error(msg) +COMMANDS = { + 'check': ( + 'analyze and fail if the CPython source code has any problems', + [_cli_check], + cmd_check, + ), + 'analyze': ( + 'report on the state of the CPython source code', + [(lambda p: c_analyzer._cli_analyze(p, **FILES_KWARGS))], + cmd_analyze, + ), + 'parse': ( + 'parse the CPython source files', + [_cli_parse], + cmd_parse, + ), + 'data': ( + 'check/manage local data (e.g. knwon types, ignored vars, caches)', + [_cli_data], + cmd_data, + ), +} + + +####################################### +# the script + +def parse_args(argv=sys.argv[1:], prog=None, *, subset=None): + import argparse + parser = argparse.ArgumentParser( + prog=prog or get_prog(), + ) + +# if subset == 'check' or subset == ['check']: +# if checks is not None: +# commands = dict(COMMANDS) +# commands['check'] = list(commands['check']) +# cli = commands['check'][1][0] +# commands['check'][1][0] = (lambda p: cli(p, checks=checks)) + processors = add_commands_cli( + parser, + commands=COMMANDS, + commonspecs=[ + add_verbosity_cli, + add_traceback_cli, + ], + subset=subset, + ) - # Now parse the args. args = parser.parse_args(argv) ns = vars(args) cmd = ns.pop('cmd') - if not cmd: - _fail('missing command') - return cmd, ns + verbosity, traceback_cm = process_args_by_key( + args, + processors[cmd], + ['verbosity', 'traceback_cm'], + ) + if cmd != 'parse': + # "verbosity" is sent to the commands, so we put it back. + args.verbosity = verbosity + + return cmd, ns, verbosity, traceback_cm -def main(cmd, cmdkwargs=None, *, _COMMANDS=COMMANDS): +def main(cmd, cmd_kwargs): try: - cmdfunc = _COMMANDS[cmd] + run_cmd = COMMANDS[cmd][-1] except KeyError: - raise ValueError( - f'unsupported cmd {cmd!r}' if cmd else 'missing cmd') - - cmdfunc(cmd, **cmdkwargs or {}) + raise ValueError(f'unsupported cmd {cmd!r}') + run_cmd(**cmd_kwargs) if __name__ == '__main__': - cmd, cmdkwargs = parse_args() - main(cmd, cmdkwargs) + cmd, cmd_kwargs, verbosity, traceback_cm = parse_args() + configure_logger(verbosity) + with traceback_cm: + main(cmd, cmd_kwargs) diff --git a/Tools/c-analyzer/cpython/_analyzer.py b/Tools/c-analyzer/cpython/_analyzer.py new file mode 100644 index 00000000000000..98f8888651e579 --- /dev/null +++ b/Tools/c-analyzer/cpython/_analyzer.py @@ -0,0 +1,348 @@ +import os.path +import re + +from c_common.clsutil import classonly +from c_parser.info import ( + KIND, + DeclID, + Declaration, + TypeDeclaration, + TypeDef, + Struct, + Member, + FIXED_TYPE, + is_type_decl, + is_pots, + is_funcptr, + is_process_global, + is_fixed_type, + is_immutable, +) +import c_analyzer as _c_analyzer +import c_analyzer.info as _info +import c_analyzer.datafiles as _datafiles +from . import _parser, REPO_ROOT + + +_DATA_DIR = os.path.dirname(__file__) +KNOWN_FILE = os.path.join(_DATA_DIR, 'known.tsv') +IGNORED_FILE = os.path.join(_DATA_DIR, 'ignored.tsv') +KNOWN_IN_DOT_C = { + 'struct _odictobject': False, + 'PyTupleObject': False, + 'struct _typeobject': False, + 'struct _arena': True, # ??? + 'struct _frame': False, + 'struct _ts': True, # ??? + 'struct PyCodeObject': False, + 'struct _is': True, # ??? + 'PyWideStringList': True, # ??? + # recursive + 'struct _dictkeysobject': False, +} +# These are loaded from the respective .tsv files upon first use. +_KNOWN = { + # {(file, ID) | ID => info | bool} + #'PyWideStringList': True, +} +#_KNOWN = {(Struct(None, typeid.partition(' ')[-1], None) +# if typeid.startswith('struct ') +# else TypeDef(None, typeid, None) +# ): ([], {'unsupported': None if supported else True}) +# for typeid, supported in _KNOWN_IN_DOT_C.items()} +_IGNORED = { + # {ID => reason} +} + +KINDS = frozenset((*KIND.TYPES, KIND.VARIABLE)) + + +def read_known(): + if not _KNOWN: + # Cache a copy the first time. + extracols = None # XXX + #extracols = ['unsupported'] + known = _datafiles.read_known(KNOWN_FILE, extracols, REPO_ROOT) + # For now we ignore known.values() (i.e. "extra"). + types, _ = _datafiles.analyze_known( + known, + analyze_resolved=analyze_resolved, + ) + _KNOWN.update(types) + return _KNOWN.copy() + + +def write_known(): + raise NotImplementedError + datafiles.write_known(decls, IGNORED_FILE, ['unsupported'], relroot=REPO_ROOT) + + +def read_ignored(): + if not _IGNORED: + _IGNORED.update(_datafiles.read_ignored(IGNORED_FILE)) + return dict(_IGNORED) + + +def write_ignored(): + raise NotImplementedError + datafiles.write_ignored(variables, IGNORED_FILE) + + +def analyze(filenames, *, + skip_objects=False, + **kwargs + ): + if skip_objects: + # XXX Set up a filter. + raise NotImplementedError + + known = read_known() + + decls = iter_decls(filenames) + results = _c_analyzer.analyze_decls( + decls, + known, + analyze_resolved=analyze_resolved, + ) + analysis = Analysis.from_results(results) + + return analysis + + +def iter_decls(filenames, **kwargs): + decls = _c_analyzer.iter_decls( + filenames, + # We ignore functions (and statements). + kinds=KINDS, + parse_files=_parser.parse_files, + **kwargs + ) + for decl in decls: + if not decl.data: + # Ignore forward declarations. + continue + yield decl + + +def analyze_resolved(resolved, decl, types, knowntypes, extra=None): + if decl.kind not in KINDS: + # Skip it! + return None + + typedeps = resolved + if typedeps is _info.UNKNOWN: + if decl.kind in (KIND.STRUCT, KIND.UNION): + typedeps = [typedeps] * len(decl.members) + else: + typedeps = [typedeps] + #assert isinstance(typedeps, (list, TypeDeclaration)), typedeps + + if extra is None: + extra = {} + elif 'unsupported' in extra: + raise NotImplementedError((decl, extra)) + + unsupported = _check_unsupported(decl, typedeps, types, knowntypes) + extra['unsupported'] = unsupported + + return typedeps, extra + + +def _check_unsupported(decl, typedeps, types, knowntypes): + if typedeps is None: + raise NotImplementedError(decl) + + if decl.kind in (KIND.STRUCT, KIND.UNION): + return _check_members(decl, typedeps, types, knowntypes) + elif decl.kind is KIND.ENUM: + if typedeps: + raise NotImplementedError((decl, typedeps)) + return None + else: + return _check_typedep(decl, typedeps, types, knowntypes) + + +def _check_members(decl, typedeps, types, knowntypes): + if isinstance(typedeps, TypeDeclaration): + raise NotImplementedError((decl, typedeps)) + + #members = decl.members or () # A forward decl has no members. + members = decl.members + if not members: + # A forward decl has no members, but that shouldn't surface here.. + raise NotImplementedError(decl) + if len(members) != len(typedeps): + raise NotImplementedError((decl, typedeps)) + + unsupported = [] + for member, typedecl in zip(members, typedeps): + checked = _check_typedep(member, typedecl, types, knowntypes) + unsupported.append(checked) + if any(None if v is FIXED_TYPE else v for v in unsupported): + return unsupported + elif FIXED_TYPE in unsupported: + return FIXED_TYPE + else: + return None + + +def _check_typedep(decl, typedecl, types, knowntypes): + if not isinstance(typedecl, TypeDeclaration): + if hasattr(type(typedecl), '__len__'): + if len(typedecl) == 1: + typedecl, = typedecl + if typedecl is None: + # XXX Fail? + return 'typespec (missing)' + elif typedecl is _info.UNKNOWN: + # XXX Is this right? + return 'typespec (unknown)' + elif not isinstance(typedecl, TypeDeclaration): + raise NotImplementedError((decl, typedecl)) + + if isinstance(decl, Member): + return _check_vartype(decl, typedecl, types, knowntypes) + elif not isinstance(decl, Declaration): + raise NotImplementedError(decl) + elif decl.kind is KIND.TYPEDEF: + return _check_vartype(decl, typedecl, types, knowntypes) + elif decl.kind is KIND.VARIABLE: + if not is_process_global(decl): + return None + checked = _check_vartype(decl, typedecl, types, knowntypes) + return 'mutable' if checked is FIXED_TYPE else checked + else: + raise NotImplementedError(decl) + + +def _check_vartype(decl, typedecl, types, knowntypes): + """Return failure reason.""" + checked = _check_typespec(decl, typedecl, types, knowntypes) + if checked: + return checked + if is_immutable(decl.vartype): + return None + if is_fixed_type(decl.vartype): + return FIXED_TYPE + return 'mutable' + + +def _check_typespec(decl, typedecl, types, knowntypes): + typespec = decl.vartype.typespec + if typedecl is not None: + found = types.get(typedecl) + if found is None: + found = knowntypes.get(typedecl) + + if found is not None: + _, extra = found + if extra is None: + # XXX Under what circumstances does this happen? + extra = {} + unsupported = extra.get('unsupported') + if unsupported is FIXED_TYPE: + unsupported = None + return 'typespec' if unsupported else None + # Fall back to default known types. + if is_pots(typespec): + return None + elif _info.is_system_type(typespec): + return None + elif is_funcptr(decl.vartype): + return None + return 'typespec' + + +class Analyzed(_info.Analyzed): + + @classonly + def is_target(cls, raw): + if not super().is_target(raw): + return False + if raw.kind not in KINDS: + return False + return True + + #@classonly + #def _parse_raw_result(cls, result, extra): + # typedecl, extra = super()._parse_raw_result(result, extra) + # if typedecl is None: + # return None, extra + # raise NotImplementedError + + def __init__(self, item, typedecl=None, *, unsupported=None, **extra): + if 'unsupported' in extra: + raise NotImplementedError((item, typedecl, unsupported, extra)) + if not unsupported: + unsupported = None + elif isinstance(unsupported, (str, TypeDeclaration)): + unsupported = (unsupported,) + elif unsupported is not FIXED_TYPE: + unsupported = tuple(unsupported) + self.unsupported = unsupported + extra['unsupported'] = self.unsupported # ...for __repr__(), etc. + if self.unsupported is None: + #self.supported = None + self.supported = True + elif self.unsupported is FIXED_TYPE: + if item.kind is KIND.VARIABLE: + raise NotImplementedError(item, typedecl, unsupported) + self.supported = True + else: + self.supported = not self.unsupported + super().__init__(item, typedecl, **extra) + + def render(self, fmt='line', *, itemonly=False): + if fmt == 'raw': + yield repr(self) + return + rendered = super().render(fmt, itemonly=itemonly) + # XXX ??? + #if itemonly: + # yield from rendered + supported = self._supported + if fmt in ('line', 'brief'): + rendered, = rendered + parts = [ + '+' if supported else '-' if supported is False else '', + rendered, + ] + yield '\t'.join(parts) + elif fmt == 'summary': + raise NotImplementedError(fmt) + elif fmt == 'full': + yield from rendered + if supported: + yield f'\tsupported:\t{supported}' + else: + raise NotImplementedError(fmt) + + +class Analysis(_info.Analysis): + _item_class = Analyzed + + @classonly + def build_item(cls, info, result=None): + if not isinstance(info, Declaration) or info.kind not in KINDS: + raise NotImplementedError((info, result)) + return super().build_item(info, result) + + +def check_globals(analysis): + # yield (data, failure) + ignored = read_ignored() + for item in analysis: + if item.kind != KIND.VARIABLE: + continue + if item.supported: + continue + if item.id in ignored: + continue + reason = item.unsupported + if not reason: + reason = '???' + elif not isinstance(reason, str): + if len(reason) == 1: + reason, = reason + reason = f'({reason})' + yield item, f'not supported {reason:20}\t{item.storage or ""} {item.vartype}' diff --git a/Tools/c-analyzer/cpython/_generate.py b/Tools/c-analyzer/cpython/_generate.py deleted file mode 100644 index 3456604b81470e..00000000000000 --- a/Tools/c-analyzer/cpython/_generate.py +++ /dev/null @@ -1,326 +0,0 @@ -# The code here consists of hacks for pre-populating the known.tsv file. - -from c_analyzer.parser.preprocessor import _iter_clean_lines -from c_analyzer.parser.naive import ( - iter_variables, parse_variable_declaration, find_variables, - ) -from c_analyzer.common.known import HEADER as KNOWN_HEADER -from c_analyzer.common.info import UNKNOWN, ID -from c_analyzer.variables import Variable -from c_analyzer.util import write_tsv - -from . import SOURCE_DIRS, REPO_ROOT -from .known import DATA_FILE as KNOWN_FILE -from .files import iter_cpython_files - - -POTS = ('char ', 'wchar_t ', 'int ', 'Py_ssize_t ') -POTS += tuple('const ' + v for v in POTS) -STRUCTS = ('PyTypeObject', 'PyObject', 'PyMethodDef', 'PyModuleDef', 'grammar') - - -def _parse_global(line, funcname=None): - line = line.strip() - if line.startswith('static '): - if '(' in line and '[' not in line and ' = ' not in line: - return None, None - name, decl = parse_variable_declaration(line) - elif line.startswith(('Py_LOCAL(', 'Py_LOCAL_INLINE(')): - name, decl = parse_variable_declaration(line) - elif line.startswith('_Py_static_string('): - decl = line.strip(';').strip() - name = line.split('(')[1].split(',')[0].strip() - elif line.startswith('_Py_IDENTIFIER('): - decl = line.strip(';').strip() - name = 'PyId_' + line.split('(')[1].split(')')[0].strip() - elif funcname: - return None, None - - # global-only - elif line.startswith('PyAPI_DATA('): # only in .h files - name, decl = parse_variable_declaration(line) - elif line.startswith('extern '): # only in .h files - name, decl = parse_variable_declaration(line) - elif line.startswith('PyDoc_VAR('): - decl = line.strip(';').strip() - name = line.split('(')[1].split(')')[0].strip() - elif line.startswith(POTS): # implied static - if '(' in line and '[' not in line and ' = ' not in line: - return None, None - name, decl = parse_variable_declaration(line) - elif line.startswith(STRUCTS) and line.endswith(' = {'): # implied static - name, decl = parse_variable_declaration(line) - elif line.startswith(STRUCTS) and line.endswith(' = NULL;'): # implied static - name, decl = parse_variable_declaration(line) - elif line.startswith('struct '): - if not line.endswith(' = {'): - return None, None - if not line.partition(' ')[2].startswith(STRUCTS): - return None, None - # implied static - name, decl = parse_variable_declaration(line) - - # file-specific - elif line.startswith(('SLOT1BINFULL(', 'SLOT1BIN(')): - # Objects/typeobject.c - funcname = line.split('(')[1].split(',')[0] - return [ - ('op_id', funcname, '_Py_static_string(op_id, OPSTR)'), - ('rop_id', funcname, '_Py_static_string(op_id, OPSTR)'), - ] - elif line.startswith('WRAP_METHOD('): - # Objects/weakrefobject.c - funcname, name = (v.strip() for v in line.split('(')[1].split(')')[0].split(',')) - return [ - ('PyId_' + name, funcname, f'_Py_IDENTIFIER({name})'), - ] - - else: - return None, None - return name, decl - - -def _pop_cached(varcache, filename, funcname, name, *, - _iter_variables=iter_variables, - ): - # Look for the file. - try: - cached = varcache[filename] - except KeyError: - cached = varcache[filename] = {} - for variable in _iter_variables(filename, - parse_variable=_parse_global, - ): - variable._isglobal = True - cached[variable.id] = variable - for var in cached: - print(' ', var) - - # Look for the variable. - if funcname == UNKNOWN: - for varid in cached: - if varid.name == name: - break - else: - return None - return cached.pop(varid) - else: - return cached.pop((filename, funcname, name), None) - - -def find_matching_variable(varid, varcache, allfilenames, *, - _pop_cached=_pop_cached, - ): - if varid.filename and varid.filename != UNKNOWN: - filenames = [varid.filename] - else: - filenames = allfilenames - for filename in filenames: - variable = _pop_cached(varcache, filename, varid.funcname, varid.name) - if variable is not None: - return variable - else: - if varid.filename and varid.filename != UNKNOWN and varid.funcname is None: - for filename in allfilenames: - if not filename.endswith('.h'): - continue - variable = _pop_cached(varcache, filename, None, varid.name) - if variable is not None: - return variable - return None - - -MULTILINE = { - # Python/Python-ast.c - 'Load_singleton': 'PyObject *', - 'Store_singleton': 'PyObject *', - 'Del_singleton': 'PyObject *', - 'AugLoad_singleton': 'PyObject *', - 'AugStore_singleton': 'PyObject *', - 'Param_singleton': 'PyObject *', - 'And_singleton': 'PyObject *', - 'Or_singleton': 'PyObject *', - 'Add_singleton': 'static PyObject *', - 'Sub_singleton': 'static PyObject *', - 'Mult_singleton': 'static PyObject *', - 'MatMult_singleton': 'static PyObject *', - 'Div_singleton': 'static PyObject *', - 'Mod_singleton': 'static PyObject *', - 'Pow_singleton': 'static PyObject *', - 'LShift_singleton': 'static PyObject *', - 'RShift_singleton': 'static PyObject *', - 'BitOr_singleton': 'static PyObject *', - 'BitXor_singleton': 'static PyObject *', - 'BitAnd_singleton': 'static PyObject *', - 'FloorDiv_singleton': 'static PyObject *', - 'Invert_singleton': 'static PyObject *', - 'Not_singleton': 'static PyObject *', - 'UAdd_singleton': 'static PyObject *', - 'USub_singleton': 'static PyObject *', - 'Eq_singleton': 'static PyObject *', - 'NotEq_singleton': 'static PyObject *', - 'Lt_singleton': 'static PyObject *', - 'LtE_singleton': 'static PyObject *', - 'Gt_singleton': 'static PyObject *', - 'GtE_singleton': 'static PyObject *', - 'Is_singleton': 'static PyObject *', - 'IsNot_singleton': 'static PyObject *', - 'In_singleton': 'static PyObject *', - 'NotIn_singleton': 'static PyObject *', - # Python/symtable.c - 'top': 'static identifier ', - 'lambda': 'static identifier ', - 'genexpr': 'static identifier ', - 'listcomp': 'static identifier ', - 'setcomp': 'static identifier ', - 'dictcomp': 'static identifier ', - '__class__': 'static identifier ', - # Python/compile.c - '__doc__': 'static PyObject *', - '__annotations__': 'static PyObject *', - # Objects/floatobject.c - 'double_format': 'static float_format_type ', - 'float_format': 'static float_format_type ', - 'detected_double_format': 'static float_format_type ', - 'detected_float_format': 'static float_format_type ', - # Python/dtoa.c - 'private_mem': 'static double private_mem[PRIVATE_mem]', - 'pmem_next': 'static double *', - # Modules/_weakref.c - 'weakref_functions': 'static PyMethodDef ', -} -INLINE = { - # Modules/_tracemalloc.c - 'allocators': 'static struct { PyMemAllocatorEx mem; PyMemAllocatorEx raw; PyMemAllocatorEx obj; } ', - # Modules/faulthandler.c - 'fatal_error': 'static struct { int enabled; PyObject *file; int fd; int all_threads; PyInterpreterState *interp; void *exc_handler; } ', - 'thread': 'static struct { PyObject *file; int fd; PY_TIMEOUT_T timeout_us; int repeat; PyInterpreterState *interp; int exit; char *header; size_t header_len; PyThread_type_lock cancel_event; PyThread_type_lock running; } ', - # Modules/signalmodule.c - 'Handlers': 'static volatile struct { _Py_atomic_int tripped; PyObject *func; } Handlers[NSIG]', - 'wakeup': 'static volatile struct { SOCKET_T fd; int warn_on_full_buffer; int use_send; } ', - # Python/dynload_shlib.c - 'handles': 'static struct { dev_t dev; ino_t ino; void *handle; } handles[128]', - # Objects/obmalloc.c - '_PyMem_Debug': 'static struct { debug_alloc_api_t raw; debug_alloc_api_t mem; debug_alloc_api_t obj; } ', - # Python/bootstrap_hash.c - 'urandom_cache': 'static struct { int fd; dev_t st_dev; ino_t st_ino; } ', - } -FUNC = { - # Objects/object.c - '_Py_abstract_hack': 'Py_ssize_t (*_Py_abstract_hack)(PyObject *)', - # Parser/myreadline.c - 'PyOS_InputHook': 'int (*PyOS_InputHook)(void)', - # Python/pylifecycle.c - '_PyOS_mystrnicmp_hack': 'int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t)', - # Parser/myreadline.c - 'PyOS_ReadlineFunctionPointer': 'char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *)', - } -IMPLIED = { - # Objects/boolobject.c - '_Py_FalseStruct': 'static struct _longobject ', - '_Py_TrueStruct': 'static struct _longobject ', - # Modules/config.c - '_PyImport_Inittab': 'struct _inittab _PyImport_Inittab[]', - } -GLOBALS = {} -GLOBALS.update(MULTILINE) -GLOBALS.update(INLINE) -GLOBALS.update(FUNC) -GLOBALS.update(IMPLIED) - -LOCALS = { - 'buildinfo': ('Modules/getbuildinfo.c', - 'Py_GetBuildInfo', - 'static char buildinfo[50 + sizeof(GITVERSION) + ((sizeof(GITTAG) > sizeof(GITBRANCH)) ? sizeof(GITTAG) : sizeof(GITBRANCH))]'), - 'methods': ('Python/codecs.c', - '_PyCodecRegistry_Init', - 'static struct { char *name; PyMethodDef def; } methods[]'), - } - - -def _known(symbol): - if symbol.funcname: - if symbol.funcname != UNKNOWN or symbol.filename != UNKNOWN: - raise KeyError(symbol.name) - filename, funcname, decl = LOCALS[symbol.name] - varid = ID(filename, funcname, symbol.name) - elif not symbol.filename or symbol.filename == UNKNOWN: - raise KeyError(symbol.name) - else: - varid = symbol.id - try: - decl = GLOBALS[symbol.name] - except KeyError: - - if symbol.name.endswith('_methods'): - decl = 'static PyMethodDef ' - elif symbol.filename == 'Objects/exceptions.c' and symbol.name.startswith(('PyExc_', '_PyExc_')): - decl = 'static PyTypeObject ' - else: - raise - if symbol.name not in decl: - decl = decl + symbol.name - return Variable(varid, 'static', decl) - - -def known_row(varid, decl): - return ( - varid.filename, - varid.funcname or '-', - varid.name, - 'variable', - decl, - ) - - -def known_rows(symbols, *, - cached=True, - _get_filenames=iter_cpython_files, - _find_match=find_matching_variable, - _find_symbols=find_variables, - _as_known=known_row, - ): - filenames = list(_get_filenames()) - cache = {} - if cached: - for symbol in symbols: - try: - found = _known(symbol) - except KeyError: - found = _find_match(symbol, cache, filenames) - if found is None: - found = Variable(symbol.id, UNKNOWN, UNKNOWN) - yield _as_known(found.id, found.vartype) - else: - raise NotImplementedError # XXX incorporate KNOWN - for variable in _find_symbols(symbols, filenames, - srccache=cache, - parse_variable=_parse_global, - ): - #variable = variable._replace( - # filename=os.path.relpath(variable.filename, REPO_ROOT)) - if variable.funcname == UNKNOWN: - print(variable) - if variable.vartype== UNKNOWN: - print(variable) - yield _as_known(variable.id, variable.vartype) - - -def generate(symbols, filename=None, *, - _generate_rows=known_rows, - _write_tsv=write_tsv, - ): - if not filename: - filename = KNOWN_FILE + '.new' - - rows = _generate_rows(symbols) - _write_tsv(filename, KNOWN_HEADER, rows) - - -if __name__ == '__main__': - from c_symbols import binary - symbols = binary.iter_symbols( - binary.PYTHON, - find_local_symbol=None, - ) - generate(symbols) diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py new file mode 100644 index 00000000000000..35fa296251e2ee --- /dev/null +++ b/Tools/c-analyzer/cpython/_parser.py @@ -0,0 +1,308 @@ +import os.path +import re + +from c_common.fsutil import expand_filenames, iter_files_by_suffix +from c_parser.preprocessor import ( + get_preprocessor as _get_preprocessor, +) +from c_parser import ( + parse_file as _parse_file, + parse_files as _parse_files, +) +from . import REPO_ROOT, INCLUDE_DIRS, SOURCE_DIRS + + +GLOB_ALL = '**/*' + + +def clean_lines(text): + """Clear out comments, blank lines, and leading/trailing whitespace.""" + lines = (line.strip() for line in text.splitlines()) + lines = (line.partition('#')[0].rstrip() + for line in lines + if line and not line.startswith('#')) + glob_all = f'{GLOB_ALL} ' + lines = (re.sub(r'^[*] ', glob_all, line) for line in lines) + lines = (os.path.join(REPO_ROOT, line) for line in lines) + return list(lines) + + +''' +@begin=sh@ +./python ../c-parser/cpython.py + --exclude '+../c-parser/EXCLUDED' + --macros '+../c-parser/MACROS' + --incldirs '+../c-parser/INCL_DIRS' + --same './Include/cpython/' + Include/*.h + Include/internal/*.h + Modules/**/*.c + Objects/**/*.c + Parser/**/*.c + Python/**/*.c +@end=sh@ +''' + +GLOBS = [ + 'Include/*.h', + 'Include/internal/*.h', + 'Modules/**/*.c', + 'Objects/**/*.c', + 'Parser/**/*.c', + 'Python/**/*.c', +] + +EXCLUDED = clean_lines(''' +# @begin=conf@ + +# Rather than fixing for this one, we manually make sure it's okay. +Modules/_sha3/kcp/KeccakP-1600-opt64.c + +# OSX +#Modules/_ctypes/darwin/*.c +#Modules/_ctypes/libffi_osx/*.c +Modules/_scproxy.c # SystemConfiguration/SystemConfiguration.h + +# Windows +Modules/_winapi.c # windows.h +Modules/overlapped.c # winsock.h +Python/dynload_win.c # windows.h + +# other OS-dependent +Python/dynload_dl.c # dl.h +Python/dynload_hpux.c # dl.h +Python/dynload_aix.c # sys/ldr.h + +# @end=conf@ +''') + +# XXX Fix the parser. +EXCLUDED += clean_lines(''' +# The tool should be able to parse these... + +Modules/_dbmmodule.c +Modules/cjkcodecs/_codecs_*.c +Modules/expat/xmlrole.c +Modules/expat/xmlparse.c +Python/initconfig.c +''') + +INCL_DIRS = clean_lines(''' +# @begin=tsv@ + +glob dirname +* . +* ./Include +* ./Include/internal + +Modules/_tkinter.c /usr/include/tcl8.6 +Modules/tkappinit.c /usr/include/tcl +Modules/_decimal/**/*.c Modules/_decimal/libmpdec + +# @end=tsv@ +''')[1:] + +MACROS = clean_lines(''' +# @begin=tsv@ + +glob name value + +Include/internal/*.h Py_BUILD_CORE 1 +Python/**/*.c Py_BUILD_CORE 1 +Parser/**/*.c Py_BUILD_CORE 1 +Objects/**/*.c Py_BUILD_CORE 1 + +Modules/faulthandler.c Py_BUILD_CORE 1 +Modules/_functoolsmodule.c Py_BUILD_CORE 1 +Modules/gcmodule.c Py_BUILD_CORE 1 +Modules/getpath.c Py_BUILD_CORE 1 +Modules/_io/*.c Py_BUILD_CORE 1 +Modules/itertoolsmodule.c Py_BUILD_CORE 1 +Modules/_localemodule.c Py_BUILD_CORE 1 +Modules/main.c Py_BUILD_CORE 1 +Modules/posixmodule.c Py_BUILD_CORE 1 +Modules/signalmodule.c Py_BUILD_CORE 1 +Modules/_threadmodule.c Py_BUILD_CORE 1 +Modules/_tracemalloc.c Py_BUILD_CORE 1 +Modules/_asynciomodule.c Py_BUILD_CORE 1 +Modules/mathmodule.c Py_BUILD_CORE 1 +Modules/cmathmodule.c Py_BUILD_CORE 1 +Modules/_weakref.c Py_BUILD_CORE 1 +Modules/sha256module.c Py_BUILD_CORE 1 +Modules/sha512module.c Py_BUILD_CORE 1 +Modules/_datetimemodule.c Py_BUILD_CORE 1 +Modules/_ctypes/cfield.c Py_BUILD_CORE 1 +Modules/_heapqmodule.c Py_BUILD_CORE 1 +Modules/_posixsubprocess.c Py_BUILD_CORE 1 + +Modules/_json.c Py_BUILD_CORE_BUILTIN 1 +Modules/_pickle.c Py_BUILD_CORE_BUILTIN 1 +Modules/_testinternalcapi.c Py_BUILD_CORE_BUILTIN 1 + +Include/cpython/abstract.h Py_CPYTHON_ABSTRACTOBJECT_H 1 +Include/cpython/bytearrayobject.h Py_CPYTHON_BYTEARRAYOBJECT_H 1 +Include/cpython/bytesobject.h Py_CPYTHON_BYTESOBJECT_H 1 +Include/cpython/ceval.h Py_CPYTHON_CEVAL_H 1 +Include/cpython/code.h Py_CPYTHON_CODE_H 1 +Include/cpython/dictobject.h Py_CPYTHON_DICTOBJECT_H 1 +Include/cpython/fileobject.h Py_CPYTHON_FILEOBJECT_H 1 +Include/cpython/fileutils.h Py_CPYTHON_FILEUTILS_H 1 +Include/cpython/frameobject.h Py_CPYTHON_FRAMEOBJECT_H 1 +Include/cpython/import.h Py_CPYTHON_IMPORT_H 1 +Include/cpython/interpreteridobject.h Py_CPYTHON_INTERPRETERIDOBJECT_H 1 +Include/cpython/listobject.h Py_CPYTHON_LISTOBJECT_H 1 +Include/cpython/methodobject.h Py_CPYTHON_METHODOBJECT_H 1 +Include/cpython/object.h Py_CPYTHON_OBJECT_H 1 +Include/cpython/objimpl.h Py_CPYTHON_OBJIMPL_H 1 +Include/cpython/pyerrors.h Py_CPYTHON_ERRORS_H 1 +Include/cpython/pylifecycle.h Py_CPYTHON_PYLIFECYCLE_H 1 +Include/cpython/pymem.h Py_CPYTHON_PYMEM_H 1 +Include/cpython/pystate.h Py_CPYTHON_PYSTATE_H 1 +Include/cpython/sysmodule.h Py_CPYTHON_SYSMODULE_H 1 +Include/cpython/traceback.h Py_CPYTHON_TRACEBACK_H 1 +Include/cpython/tupleobject.h Py_CPYTHON_TUPLEOBJECT_H 1 +Include/cpython/unicodeobject.h Py_CPYTHON_UNICODEOBJECT_H 1 + +# implied include of pyport.h +Include/**/*.h PyAPI_DATA(RTYPE) extern RTYPE +Include/**/*.h PyAPI_FUNC(RTYPE) RTYPE +Include/**/*.h Py_DEPRECATED(VER) /* */ +Include/**/*.h _Py_NO_RETURN /* */ +Include/**/*.h PYLONG_BITS_IN_DIGIT 30 +Modules/**/*.c PyMODINIT_FUNC PyObject* +Objects/unicodeobject.c PyMODINIT_FUNC PyObject* +Python/marshal.c PyMODINIT_FUNC PyObject* +Python/_warnings.c PyMODINIT_FUNC PyObject* +Python/Python-ast.c PyMODINIT_FUNC PyObject* +Python/import.c PyMODINIT_FUNC PyObject* +Modules/_testcapimodule.c PyAPI_FUNC(RTYPE) RTYPE +Python/getargs.c PyAPI_FUNC(RTYPE) RTYPE + +# implied include of exports.h +#Modules/_io/bytesio.c Py_EXPORTED_SYMBOL /* */ + +# implied include of object.h +Include/**/*.h PyObject_HEAD PyObject ob_base; +Include/**/*.h PyObject_VAR_HEAD PyVarObject ob_base; + +# implied include of pyconfig.h +Include/**/*.h SIZEOF_WCHAR_T 4 + +# implied include of +Include/**/*.h _POSIX_THREADS 1 + +# from Makefile +Modules/getpath.c PYTHONPATH 1 +Modules/getpath.c PREFIX ... +Modules/getpath.c EXEC_PREFIX ... +Modules/getpath.c VERSION ... +Modules/getpath.c VPATH ... + +# from Modules/_sha3/sha3module.c +Modules/_sha3/kcp/KeccakP-1600-inplace32BI.c PLATFORM_BYTE_ORDER 4321 # force big-endian +Modules/_sha3/kcp/*.c KeccakOpt 64 +Modules/_sha3/kcp/*.c KeccakP200_excluded 1 +Modules/_sha3/kcp/*.c KeccakP400_excluded 1 +Modules/_sha3/kcp/*.c KeccakP800_excluded 1 + +# See: setup.py +Modules/_decimal/**/*.c CONFIG_64 1 +Modules/_decimal/**/*.c ASM 1 +Modules/expat/xmlparse.c HAVE_EXPAT_CONFIG_H 1 +Modules/expat/xmlparse.c XML_POOR_ENTROPY 1 +Modules/_dbmmodule.c HAVE_GDBM_DASH_NDBM_H 1 + +# @end=tsv@ +''')[1:] + +# -pthread +# -Wno-unused-result +# -Wsign-compare +# -g +# -Og +# -Wall +# -std=c99 +# -Wextra +# -Wno-unused-result -Wno-unused-parameter +# -Wno-missing-field-initializers +# -Werror=implicit-function-declaration + +SAME = [ + './Include/cpython/', +] + + +def resolve_filename(filename): + orig = filename + filename = os.path.normcase(os.path.normpath(filename)) + if os.path.isabs(filename): + if os.path.relpath(filename, REPO_ROOT).startswith('.'): + raise Exception(f'{orig!r} is outside the repo ({REPO_ROOT})') + return filename + else: + return os.path.join(REPO_ROOT, filename) + + +def iter_filenames(*, search=False): + if search: + yield from iter_files_by_suffix(INCLUDE_DIRS, ('.h',)) + yield from iter_files_by_suffix(SOURCE_DIRS, ('.c',)) + else: + globs = (os.path.join(REPO_ROOT, file) for file in GLOBS) + yield from expand_filenames(globs) + + +def get_preprocessor(*, + file_macros=None, + file_incldirs=None, + file_same=None, + **kwargs + ): + macros = tuple(MACROS) + if file_macros: + macros += tuple(file_macros) + incldirs = tuple(INCL_DIRS) + if file_incldirs: + incldirs += tuple(file_incldirs) + return _get_preprocessor( + file_macros=macros, + file_incldirs=incldirs, + file_same=file_same, + **kwargs + ) + + +def parse_file(filename, *, + match_kind=None, + ignore_exc=None, + log_err=None, + ): + get_file_preprocessor = get_preprocessor( + ignore_exc=ignore_exc, + log_err=log_err, + ) + yield from _parse_file( + filename, + match_kind=match_kind, + get_file_preprocessor=get_file_preprocessor, + ) + + +def parse_files(filenames=None, *, + match_kind=None, + ignore_exc=None, + log_err=None, + get_file_preprocessor=None, + **file_kwargs + ): + if get_file_preprocessor is None: + get_file_preprocessor = get_preprocessor( + ignore_exc=ignore_exc, + log_err=log_err, + ) + yield from _parse_files( + filenames, + match_kind=match_kind, + get_file_preprocessor=get_file_preprocessor, + **file_kwargs + ) diff --git a/Tools/c-analyzer/cpython/files.py b/Tools/c-analyzer/cpython/files.py deleted file mode 100644 index 543097af7bcd50..00000000000000 --- a/Tools/c-analyzer/cpython/files.py +++ /dev/null @@ -1,29 +0,0 @@ -from c_analyzer.common.files import ( - C_SOURCE_SUFFIXES, walk_tree, iter_files_by_suffix, - ) - -from . import SOURCE_DIRS, REPO_ROOT - -# XXX need tests: -# * iter_files() - - -def iter_files(*, - walk=walk_tree, - _files=iter_files_by_suffix, - ): - """Yield each file in the tree for each of the given directory names.""" - excludedtrees = [ - os.path.join('Include', 'cpython', ''), - ] - def is_excluded(filename): - for root in excludedtrees: - if filename.startswith(root): - return True - return False - for filename in _files(SOURCE_DIRS, C_SOURCE_SUFFIXES, REPO_ROOT, - walk=walk, - ): - if is_excluded(filename): - continue - yield filename diff --git a/Tools/c-analyzer/cpython/find.py b/Tools/c-analyzer/cpython/find.py deleted file mode 100644 index a7bc0b477b839c..00000000000000 --- a/Tools/c-analyzer/cpython/find.py +++ /dev/null @@ -1,101 +0,0 @@ -import os.path - -from c_analyzer.common import files -from c_analyzer.common.info import UNKNOWN, ID -from c_analyzer.variables import find as _common - -from . import SOURCE_DIRS, PYTHON, REPO_ROOT -from .known import ( - from_file as known_from_file, - DATA_FILE as KNOWN_FILE, - ) -from .supported import ( - ignored_from_file, IGNORED_FILE, is_supported, _is_object, - ) - -# XXX need tests: -# * vars_from_binary() -# * vars_from_source() -# * supported_vars() - - -def _handle_id(filename, funcname, name, *, - _relpath=os.path.relpath, - ): - filename = _relpath(filename, REPO_ROOT) - return ID(filename, funcname, name) - - -def vars_from_binary(*, - known=KNOWN_FILE, - _known_from_file=known_from_file, - _iter_files=files.iter_files_by_suffix, - _iter_vars=_common.vars_from_binary, - ): - """Yield a Variable for each found Symbol. - - Details are filled in from the given "known" variables and types. - """ - if isinstance(known, str): - known = _known_from_file(known) - dirnames = SOURCE_DIRS - suffixes = ('.c',) - filenames = _iter_files(dirnames, suffixes) - # XXX For now we only use known variables (no source lookup). - filenames = None - yield from _iter_vars(PYTHON, - known=known, - filenames=filenames, - handle_id=_handle_id, - check_filename=(lambda n: True), - ) - - -def vars_from_source(*, - preprocessed=None, - known=KNOWN_FILE, - _known_from_file=known_from_file, - _iter_files=files.iter_files_by_suffix, - _iter_vars=_common.vars_from_source, - ): - """Yield a Variable for each declaration in the raw source code. - - Details are filled in from the given "known" variables and types. - """ - if isinstance(known, str): - known = _known_from_file(known) - dirnames = SOURCE_DIRS - suffixes = ('.c',) - filenames = _iter_files(dirnames, suffixes) - yield from _iter_vars(filenames, - preprocessed=preprocessed, - known=known, - handle_id=_handle_id, - ) - - -def supported_vars(*, - known=KNOWN_FILE, - ignored=IGNORED_FILE, - skip_objects=False, - _known_from_file=known_from_file, - _ignored_from_file=ignored_from_file, - _iter_vars=vars_from_binary, - _is_supported=is_supported, - ): - """Yield (var, is supported) for each found variable.""" - if isinstance(known, str): - known = _known_from_file(known) - if isinstance(ignored, str): - ignored = _ignored_from_file(ignored) - - for var in _iter_vars(known=known): - if not var.isglobal: - continue - elif var.vartype == UNKNOWN: - yield var, None - # XXX Support proper filters instead. - elif skip_objects and _is_object(found.vartype): - continue - else: - yield var, _is_supported(var, ignored, known) diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv new file mode 100644 index 00000000000000..2c456db063e429 --- /dev/null +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -0,0 +1,2 @@ +filename funcname name reason +#??? - somevar ??? diff --git a/Tools/c-analyzer/cpython/known.py b/Tools/c-analyzer/cpython/known.py deleted file mode 100644 index c3cc2c06026ce1..00000000000000 --- a/Tools/c-analyzer/cpython/known.py +++ /dev/null @@ -1,66 +0,0 @@ -import csv -import os.path - -from c_analyzer.parser.declarations import extract_storage -from c_analyzer.variables import known as _common -from c_analyzer.variables.info import Variable - -from . import DATA_DIR - - -# XXX need tests: -# * from_file() -# * look_up_variable() - - -DATA_FILE = os.path.join(DATA_DIR, 'known.tsv') - - -def _get_storage(decl, infunc): - # statics - if decl.startswith(('Py_LOCAL(', 'Py_LOCAL_INLINE(')): - return 'static' - if decl.startswith(('_Py_IDENTIFIER(', '_Py_static_string(')): - return 'static' - if decl.startswith('PyDoc_VAR('): - return 'static' - if decl.startswith(('SLOT1BINFULL(', 'SLOT1BIN(')): - return 'static' - if decl.startswith('WRAP_METHOD('): - return 'static' - # public extern - if decl.startswith('PyAPI_DATA('): - return 'extern' - # Fall back to the normal handler. - return extract_storage(decl, infunc=infunc) - - -def _handle_var(varid, decl): -# if varid.name == 'id' and decl == UNKNOWN: -# # None of these are variables. -# decl = 'int id'; - storage = _get_storage(decl, varid.funcname) - return Variable(varid, storage, decl) - - -def from_file(infile=DATA_FILE, *, - _from_file=_common.from_file, - _handle_var=_handle_var, - ): - """Return the info for known declarations in the given file.""" - return _from_file(infile, handle_var=_handle_var) - - -def look_up_variable(varid, knownvars, *, - _lookup=_common.look_up_variable, - ): - """Return the known variable matching the given ID. - - "knownvars" is a mapping of ID to Variable. - - "match_files" is used to verify if two filenames point to - the same file. - - If no match is found then None is returned. - """ - return _lookup(varid, knownvars) diff --git a/Tools/c-analyzer/cpython/known.tsv b/Tools/c-analyzer/cpython/known.tsv new file mode 100644 index 00000000000000..a48ef02dc6f6f2 --- /dev/null +++ b/Tools/c-analyzer/cpython/known.tsv @@ -0,0 +1,3 @@ +filename funcname name kind declaration +#filename funcname name kind is_supported declaration +#??? - PyWideStringList typedef ??? diff --git a/Tools/c-analyzer/cpython/supported.py b/Tools/c-analyzer/cpython/supported.py deleted file mode 100644 index 18786eefd8dedc..00000000000000 --- a/Tools/c-analyzer/cpython/supported.py +++ /dev/null @@ -1,398 +0,0 @@ -import os.path -import re - -from c_analyzer.common.info import ID -from c_analyzer.common.util import read_tsv, write_tsv - -from . import DATA_DIR - -# XXX need tests: -# * generate / script - - -IGNORED_FILE = os.path.join(DATA_DIR, 'ignored.tsv') - -IGNORED_COLUMNS = ('filename', 'funcname', 'name', 'kind', 'reason') -IGNORED_HEADER = '\t'.join(IGNORED_COLUMNS) - -# XXX Move these to ignored.tsv. -IGNORED = { - # global - 'PyImport_FrozenModules': 'process-global', - 'M___hello__': 'process-global', - 'inittab_copy': 'process-global', - 'PyHash_Func': 'process-global', - '_Py_HashSecret_Initialized': 'process-global', - '_TARGET_LOCALES': 'process-global', - - # startup (only changed before/during) - '_PyRuntime': 'runtime startup', - 'runtime_initialized': 'runtime startup', - 'static_arg_parsers': 'runtime startup', - 'orig_argv': 'runtime startup', - 'opt_ptr': 'runtime startup', - '_preinit_warnoptions': 'runtime startup', - '_Py_StandardStreamEncoding': 'runtime startup', - 'Py_FileSystemDefaultEncoding': 'runtime startup', - '_Py_StandardStreamErrors': 'runtime startup', - 'Py_FileSystemDefaultEncodeErrors': 'runtime startup', - 'Py_BytesWarningFlag': 'runtime startup', - 'Py_DebugFlag': 'runtime startup', - 'Py_DontWriteBytecodeFlag': 'runtime startup', - 'Py_FrozenFlag': 'runtime startup', - 'Py_HashRandomizationFlag': 'runtime startup', - 'Py_IgnoreEnvironmentFlag': 'runtime startup', - 'Py_InspectFlag': 'runtime startup', - 'Py_InteractiveFlag': 'runtime startup', - 'Py_IsolatedFlag': 'runtime startup', - 'Py_NoSiteFlag': 'runtime startup', - 'Py_NoUserSiteDirectory': 'runtime startup', - 'Py_OptimizeFlag': 'runtime startup', - 'Py_QuietFlag': 'runtime startup', - 'Py_UTF8Mode': 'runtime startup', - 'Py_UnbufferedStdioFlag': 'runtime startup', - 'Py_VerboseFlag': 'runtime startup', - '_Py_path_config': 'runtime startup', - '_PyOS_optarg': 'runtime startup', - '_PyOS_opterr': 'runtime startup', - '_PyOS_optind': 'runtime startup', - '_Py_HashSecret': 'runtime startup', - - # REPL - '_PyOS_ReadlineLock': 'repl', - '_PyOS_ReadlineTState': 'repl', - - # effectively const - 'tracemalloc_empty_traceback': 'const', - '_empty_bitmap_node': 'const', - 'posix_constants_pathconf': 'const', - 'posix_constants_confstr': 'const', - 'posix_constants_sysconf': 'const', - '_PySys_ImplCacheTag': 'const', - '_PySys_ImplName': 'const', - 'PyImport_Inittab': 'const', - '_PyImport_DynLoadFiletab': 'const', - '_PyParser_Grammar': 'const', - 'Py_hexdigits': 'const', - '_PyImport_Inittab': 'const', - '_PyByteArray_empty_string': 'const', - '_PyLong_DigitValue': 'const', - '_Py_SwappedOp': 'const', - 'PyStructSequence_UnnamedField': 'const', - - # signals are main-thread only - 'faulthandler_handlers': 'signals are main-thread only', - 'user_signals': 'signals are main-thread only', - 'wakeup': 'signals are main-thread only', - - # hacks - '_PySet_Dummy': 'only used as a placeholder', - } - -BENIGN = 'races here are benign and unlikely' - - -def is_supported(variable, ignored=None, known=None, *, - _ignored=(lambda *a, **k: _is_ignored(*a, **k)), - _vartype_okay=(lambda *a, **k: _is_vartype_okay(*a, **k)), - ): - """Return True if the given global variable is okay in CPython.""" - if _ignored(variable, - ignored and ignored.get('variables')): - return True - elif _vartype_okay(variable.vartype, - ignored.get('types')): - return True - else: - return False - - -def _is_ignored(variable, ignoredvars=None, *, - _IGNORED=IGNORED, - ): - """Return the reason if the variable is a supported global. - - Return None if the variable is not a supported global. - """ - if ignoredvars and (reason := ignoredvars.get(variable.id)): - return reason - - if variable.funcname is None: - if reason := _IGNORED.get(variable.name): - return reason - - # compiler - if variable.filename == 'Python/graminit.c': - if variable.vartype.startswith('static state '): - return 'compiler' - if variable.filename == 'Python/symtable.c': - if variable.vartype.startswith('static identifier '): - return 'compiler' - if variable.filename == 'Python/Python-ast.c': - # These should be const. - if variable.name.endswith('_field'): - return 'compiler' - if variable.name.endswith('_attribute'): - return 'compiler' - - # other - if variable.filename == 'Python/dtoa.c': - # guarded by lock? - if variable.name in ('p5s', 'freelist'): - return 'dtoa is thread-safe?' - if variable.name in ('private_mem', 'pmem_next'): - return 'dtoa is thread-safe?' - if variable.filename == 'Python/thread.c': - # Threads do not become an issue until after these have been set - # and these never get changed after that. - if variable.name in ('initialized', 'thread_debug'): - return 'thread-safe' - if variable.filename == 'Python/getversion.c': - if variable.name == 'version': - # Races are benign here, as well as unlikely. - return BENIGN - if variable.filename == 'Python/fileutils.c': - if variable.name == 'force_ascii': - return BENIGN - if variable.name == 'ioctl_works': - return BENIGN - if variable.name == '_Py_open_cloexec_works': - return BENIGN - if variable.filename == 'Python/codecs.c': - if variable.name == 'ucnhash_CAPI': - return BENIGN - if variable.filename == 'Python/bootstrap_hash.c': - if variable.name == 'getrandom_works': - return BENIGN - if variable.filename == 'Objects/unicodeobject.c': - if variable.name == 'ucnhash_CAPI': - return BENIGN - if variable.name == 'bloom_linebreak': - # *mostly* benign - return BENIGN - if variable.filename == 'Modules/getbuildinfo.c': - if variable.name == 'buildinfo': - # The static is used for pre-allocation. - return BENIGN - if variable.filename == 'Modules/posixmodule.c': - if variable.name == 'ticks_per_second': - return BENIGN - if variable.name == 'dup3_works': - return BENIGN - if variable.filename == 'Modules/timemodule.c': - if variable.name == 'ticks_per_second': - return BENIGN - if variable.filename == 'Objects/longobject.c': - if variable.name == 'log_base_BASE': - return BENIGN - if variable.name == 'convwidth_base': - return BENIGN - if variable.name == 'convmultmax_base': - return BENIGN - - return None - - -def _is_vartype_okay(vartype, ignoredtypes=None): - if _is_object(vartype): - return None - - if vartype.startswith('static const '): - return 'const' - if vartype.startswith('const '): - return 'const' - - # components for TypeObject definitions - for name in ('PyMethodDef', 'PyGetSetDef', 'PyMemberDef'): - if name in vartype: - return 'const' - for name in ('PyNumberMethods', 'PySequenceMethods', 'PyMappingMethods', - 'PyBufferProcs', 'PyAsyncMethods'): - if name in vartype: - return 'const' - for name in ('slotdef', 'newfunc'): - if name in vartype: - return 'const' - - # structseq - for name in ('PyStructSequence_Desc', 'PyStructSequence_Field'): - if name in vartype: - return 'const' - - # other definiitions - if 'PyModuleDef' in vartype: - return 'const' - - # thread-safe - if '_Py_atomic_int' in vartype: - return 'thread-safe' - if 'pthread_condattr_t' in vartype: - return 'thread-safe' - - # startup - if '_Py_PreInitEntry' in vartype: - return 'startup' - - # global -# if 'PyMemAllocatorEx' in vartype: -# return True - - # others -# if 'PyThread_type_lock' in vartype: -# return True - - # XXX ??? - # _Py_tss_t - # _Py_hashtable_t - # stack_t - # _PyUnicode_Name_CAPI - - # functions - if '(' in vartype and '[' not in vartype: - return 'function pointer' - - # XXX finish! - # * allow const values? - #raise NotImplementedError - return None - - -PYOBJECT_RE = re.compile(r''' - ^ - ( - # must start with "static " - static \s+ - ( - identifier - ) - \b - ) | - ( - # may start with "static " - ( static \s+ )? - ( - .* - ( - PyObject | - PyTypeObject | - _? Py \w+ Object | - _PyArg_Parser | - _Py_Identifier | - traceback_t | - PyAsyncGenASend | - _PyAsyncGenWrappedValue | - PyContext | - method_cache_entry - ) - \b - ) | - ( - ( - _Py_IDENTIFIER | - _Py_static_string - ) - [(] - ) - ) - ''', re.VERBOSE) - - -def _is_object(vartype): - if 'PyDictKeysObject' in vartype: - return False - if PYOBJECT_RE.match(vartype): - return True - if vartype.endswith((' _Py_FalseStruct', ' _Py_TrueStruct')): - return True - - # XXX Add more? - - #for part in vartype.split(): - # # XXX const is automatic True? - # if part == 'PyObject' or part.startswith('PyObject['): - # return True - return False - - -def ignored_from_file(infile, *, - _read_tsv=read_tsv, - ): - """Yield a Variable for each ignored var in the file.""" - ignored = { - 'variables': {}, - #'types': {}, - #'constants': {}, - #'macros': {}, - } - for row in _read_tsv(infile, IGNORED_HEADER): - filename, funcname, name, kind, reason = row - if not funcname or funcname == '-': - funcname = None - id = ID(filename, funcname, name) - if kind == 'variable': - values = ignored['variables'] - else: - raise ValueError(f'unsupported kind in row {row}') - values[id] = reason - return ignored - - -################################## -# generate - -def _get_row(varid, reason): - return ( - varid.filename, - varid.funcname or '-', - varid.name, - 'variable', - str(reason), - ) - - -def _get_rows(variables, ignored=None, *, - _as_row=_get_row, - _is_ignored=_is_ignored, - _vartype_okay=_is_vartype_okay, - ): - count = 0 - for variable in variables: - reason = _is_ignored(variable, - ignored and ignored.get('variables'), - ) - if not reason: - reason = _vartype_okay(variable.vartype, - ignored and ignored.get('types')) - if not reason: - continue - - print(' ', variable, repr(reason)) - yield _as_row(variable.id, reason) - count += 1 - print(f'total: {count}') - - -def _generate_ignored_file(variables, filename=None, *, - _generate_rows=_get_rows, - _write_tsv=write_tsv, - ): - if not filename: - filename = IGNORED_FILE + '.new' - rows = _generate_rows(variables) - _write_tsv(filename, IGNORED_HEADER, rows) - - -if __name__ == '__main__': - from cpython import SOURCE_DIRS - from cpython.known import ( - from_file as known_from_file, - DATA_FILE as KNOWN_FILE, - ) - # XXX This is wrong! - from . import find - known = known_from_file(KNOWN_FILE) - knownvars = (known or {}).get('variables') - variables = find.globals_from_binary(knownvars=knownvars, - dirnames=SOURCE_DIRS) - - _generate_ignored_file(variables) diff --git a/Tools/c-analyzer/ignored-globals.txt b/Tools/c-analyzer/ignored-globals.txt deleted file mode 100644 index ce6d1d805147b6..00000000000000 --- a/Tools/c-analyzer/ignored-globals.txt +++ /dev/null @@ -1,492 +0,0 @@ -# All variables declared here are shared between all interpreters -# in a single process. That means that they must not be changed -# unless that change should apply to all interpreters. -# -# See check-c-globals.py. -# -# Many generic names are handled via the script: -# -# * most exceptions and all warnings handled via _is_exception() -# * for builtin modules, generic names are handled via _is_module() -# * generic names for static types handled via _is_type_var() -# * AST vars handled via _is_compiler() - - -####################################### -# main - -# Modules/getpath.c -exec_prefix -module_search_path -prefix -progpath - -# Modules/main.c -orig_argc -orig_argv - -# Python/getopt.c -opt_ptr -_PyOS_optarg -_PyOS_opterr -_PyOS_optind - - -####################################### -# REPL - -# Parser/myreadline.c -PyOS_InputHook -PyOS_ReadlineFunctionPointer -_PyOS_ReadlineLock -_PyOS_ReadlineTState - - -####################################### -# state - -# Python/dtoa.c -p5s -pmem_next # very slight race -private_mem # very slight race - -# Python/import.c -# For the moment the import lock stays global. Ultimately there should -# be a global lock for extension modules and a per-interpreter lock. -import_lock -import_lock_level -import_lock_thread - -# Python/pylifecycle.c -_PyRuntime - - -#--------------------------------- -# module globals (PyObject) - -# Modules/_functoolsmodule.c -kwd_mark - -# Modules/_localemodule.c -Error - -# Modules/_threadmodule.c -ThreadError - -# Modules/_tracemalloc.c -unknown_filename - -# Modules/gcmodule.c -gc_str - -# Modules/posixmodule.c -billion -posix_putenv_garbage - -# Modules/signalmodule.c -DefaultHandler -IgnoreHandler -IntHandler -ItimerError - -# Modules/zipimport.c -ZipImportError -zip_directory_cache - - -#--------------------------------- -# module globals (other) - -# Modules/_tracemalloc.c -allocators -tables_lock -tracemalloc_config -tracemalloc_empty_traceback -tracemalloc_filenames -tracemalloc_peak_traced_memory -tracemalloc_reentrant_key -tracemalloc_traceback -tracemalloc_tracebacks -tracemalloc_traced_memory -tracemalloc_traces - -# Modules/faulthandler.c -fatal_error -faulthandler_handlers -old_stack -stack -thread -user_signals - -# Modules/posixmodule.c -posix_constants_confstr -posix_constants_pathconf -posix_constants_sysconf -structseq_new -ticks_per_second - -# Modules/signalmodule.c -Handlers # main thread only -is_tripped # main thread only -main_pid -main_thread -old_siginthandler -wakeup_fd # main thread only - -# Modules/zipimport.c -zip_searchorder - -# Python/bltinmodule.c -Py_FileSystemDefaultEncodeErrors -Py_FileSystemDefaultEncoding -Py_HasFileSystemDefaultEncoding - -# Python/sysmodule.c -_PySys_ImplCacheTag -_PySys_ImplName - - -#--------------------------------- -# freelists - -# Modules/_collectionsmodule.c -freeblocks -numfreeblocks - -# Objects/classobject.c -free_list -numfree - -# Objects/dictobject.c -free_list -keys_free_list -numfree -numfreekeys - -# Objects/exceptions.c -memerrors_freelist -memerrors_numfree - -# Objects/floatobject.c -free_list -numfree - -# Objects/frameobject.c -free_list -numfree - -# Objects/genobject.c -ag_asend_freelist -ag_asend_freelist_free -ag_value_freelist -ag_value_freelist_free - -# Objects/listobject.c -free_list -numfree - -# Objects/methodobject.c -free_list -numfree - -# Objects/sliceobject.c -slice_cache # slight race - -# Objects/tupleobject.c -free_list -numfree - -# Python/dtoa.c -freelist # very slight race - - -#--------------------------------- -# caches (PyObject) - -# Objects/typeobject.c -method_cache # only for static types -next_version_tag # only for static types - -# Python/dynload_shlib.c -handles # slight race during import -nhandles # slight race during import - -# Python/import.c -extensions # slight race on init during import - - -#--------------------------------- -# caches (other) - -# Python/bootstrap_hash.c -urandom_cache - -# Python/modsupport.c -_Py_PackageContext # Slight race during import! Move to PyThreadState? - - -#--------------------------------- -# counters - -# Objects/bytesobject.c -null_strings -one_strings - -# Objects/dictobject.c -pydict_global_version - -# Objects/moduleobject.c -max_module_number # slight race during import - - -####################################### -# constants - -#--------------------------------- -# singletons - -# Objects/boolobject.c -_Py_FalseStruct -_Py_TrueStruct - -# Objects/object.c -_Py_NoneStruct -_Py_NotImplementedStruct - -# Objects/sliceobject.c -_Py_EllipsisObject - - -#--------------------------------- -# constants (other) - -# Modules/config.c -_PyImport_Inittab - -# Objects/bytearrayobject.c -_PyByteArray_empty_string - -# Objects/dictobject.c -empty_keys_struct -empty_values - -# Objects/floatobject.c -detected_double_format -detected_float_format -double_format -float_format - -# Objects/longobject.c -_PyLong_DigitValue - -# Objects/object.c -_Py_SwappedOp - -# Objects/obmalloc.c -_PyMem_Debug - -# Objects/setobject.c -_dummy_struct - -# Objects/structseq.c -PyStructSequence_UnnamedField - -# Objects/typeobject.c -name_op -slotdefs # almost -slotdefs_initialized # almost -subtype_getsets_dict_only -subtype_getsets_full -subtype_getsets_weakref_only -tp_new_methoddef - -# Objects/unicodeobject.c -bloom_linebreak -static_strings # slight race - -# Parser/tokenizer.c -_PyParser_TokenNames - -# Python/Python-ast.c -alias_fields - -# Python/codecs.c -Py_hexdigits -ucnhash_CAPI # slight performance-only race - -# Python/dynload_shlib.c -_PyImport_DynLoadFiletab - -# Python/fileutils.c -_Py_open_cloexec_works -force_ascii - -# Python/frozen.c -M___hello__ -PyImport_FrozenModules - -# Python/graminit.c -_PyParser_Grammar -dfas -labels - -# Python/import.c -PyImport_Inittab - -# Python/pylifecycle.c -_TARGET_LOCALES - - -#--------------------------------- -# initialized (PyObject) - -# Objects/bytesobject.c -characters -nullstring - -# Objects/exceptions.c -PyExc_RecursionErrorInst -errnomap - -# Objects/longobject.c -_PyLong_One -_PyLong_Zero -small_ints - -# Objects/setobject.c -emptyfrozenset - -# Objects/unicodeobject.c -interned # slight race on init in PyUnicode_InternInPlace() -unicode_empty -unicode_latin1 - - -#--------------------------------- -# initialized (other) - -# Python/getargs.c -static_arg_parsers - -# Python/pyhash.c -PyHash_Func -_Py_HashSecret -_Py_HashSecret_Initialized - -# Python/pylifecycle.c -_Py_StandardStreamEncoding -_Py_StandardStreamErrors -default_home -env_home -progname -Py_BytesWarningFlag -Py_DebugFlag -Py_DontWriteBytecodeFlag -Py_FrozenFlag -Py_HashRandomizationFlag -Py_IgnoreEnvironmentFlag -Py_InspectFlag -Py_InteractiveFlag -Py_IsolatedFlag -Py_NoSiteFlag -Py_NoUserSiteDirectory -Py_OptimizeFlag -Py_QuietFlag -Py_UnbufferedStdioFlag -Py_VerboseFlag - - -#--------------------------------- -# types - -# Modules/_threadmodule.c -Locktype -RLocktype -localdummytype -localtype - -# Objects/exceptions.c -PyExc_BaseException -PyExc_Exception -PyExc_GeneratorExit -PyExc_KeyboardInterrupt -PyExc_StopAsyncIteration -PyExc_StopIteration -PyExc_SystemExit -_PyExc_BaseException -_PyExc_Exception -_PyExc_GeneratorExit -_PyExc_KeyboardInterrupt -_PyExc_StopAsyncIteration -_PyExc_StopIteration -_PyExc_SystemExit - -# Objects/structseq.c -_struct_sequence_template - - -#--------------------------------- -# interned strings/bytes - -# Modules/_io/_iomodule.c -_PyIO_empty_bytes -_PyIO_empty_str -_PyIO_str_close -_PyIO_str_closed -_PyIO_str_decode -_PyIO_str_encode -_PyIO_str_fileno -_PyIO_str_flush -_PyIO_str_getstate -_PyIO_str_isatty -_PyIO_str_newlines -_PyIO_str_nl -_PyIO_str_read -_PyIO_str_read1 -_PyIO_str_readable -_PyIO_str_readall -_PyIO_str_readinto -_PyIO_str_readline -_PyIO_str_reset -_PyIO_str_seek -_PyIO_str_seekable -_PyIO_str_setstate -_PyIO_str_tell -_PyIO_str_truncate -_PyIO_str_writable -_PyIO_str_write - -# Modules/_threadmodule.c -str_dict - -# Objects/boolobject.c -false_str -true_str - -# Objects/listobject.c -indexerr - -# Python/symtable.c -__class__ -dictcomp -genexpr -lambda -listcomp -setcomp -top - -# Python/sysmodule.c -whatstrings - - -####################################### -# hacks - -# Objects/object.c -_Py_abstract_hack - -# Objects/setobject.c -_PySet_Dummy - -# Python/pylifecycle.c -_PyOS_mystrnicmp_hack diff --git a/Tools/c-analyzer/ignored.tsv b/Tools/c-analyzer/ignored.tsv deleted file mode 100644 index a0e0e503da6ab0..00000000000000 --- a/Tools/c-analyzer/ignored.tsv +++ /dev/null @@ -1 +0,0 @@ -filename funcname name kind reason diff --git a/Tools/c-analyzer/known.tsv b/Tools/c-analyzer/known.tsv deleted file mode 100644 index f8c12a3944d9b7..00000000000000 --- a/Tools/c-analyzer/known.tsv +++ /dev/null @@ -1,1927 +0,0 @@ -filename funcname name kind declaration -Modules/_abc.c - _abc_data_type variable static PyTypeObject _abc_data_type -Modules/_abc.c - abc_invalidation_counter variable static unsigned long long abc_invalidation_counter -Modules/_abc.c - _abcmodule variable static struct PyModuleDef _abcmodule -Python/import.c import_find_and_load accumulated variable static _PyTime_t accumulated -Modules/itertoolsmodule.c - accumulate_methods variable static PyMethodDef accumulate_methods -Modules/itertoolsmodule.c - accumulate_type variable static PyTypeObject accumulate_type -Python/Python-ast.c - Add_singleton variable static PyObject *Add_singleton -Python/Python-ast.c - Add_type variable static PyTypeObject *Add_type -Objects/genobject.c - ag_asend_freelist variable static PyAsyncGenASend *ag_asend_freelist[_PyAsyncGen_MAXFREELIST] -Objects/genobject.c - ag_asend_freelist_free variable static int ag_asend_freelist_free -Objects/genobject.c - ag_value_freelist variable static _PyAsyncGenWrappedValue *ag_value_freelist[_PyAsyncGen_MAXFREELIST] -Objects/genobject.c - ag_value_freelist_free variable static int ag_value_freelist_free -Python/Python-ast.c - alias_fields variable static const char *alias_fields[] -Python/Python-ast.c - alias_type variable static PyTypeObject *alias_type -Modules/_tracemalloc.c - allocators variable static struct { PyMemAllocatorEx mem; PyMemAllocatorEx raw; PyMemAllocatorEx obj; } allocators -Python/Python-ast.c - And_singleton variable static PyObject *And_singleton -Python/Python-ast.c - And_type variable static PyTypeObject *And_type -Python/Python-ast.c - AnnAssign_fields variable static const char *AnnAssign_fields[] -Python/Python-ast.c - AnnAssign_type variable static PyTypeObject *AnnAssign_type -Python/compile.c - __annotations__ variable static PyObject *__annotations__ -Objects/obmalloc.c - arenas variable static struct arena_object* arenas -Python/Python-ast.c - arg_attributes variable static const char *arg_attributes[] -Python/Python-ast.c - arg_fields variable static const char *arg_fields[] -Python/Python-ast.c - arg_type variable static PyTypeObject *arg_type -Python/Python-ast.c - arguments_fields variable static const char *arguments_fields[] -Python/Python-ast.c - arguments_type variable static PyTypeObject *arguments_type -Python/Python-ast.c - Assert_fields variable static const char *Assert_fields[] -Python/compile.c compiler_assert assertion_error variable static PyObject *assertion_error -Python/Python-ast.c - Assert_type variable static PyTypeObject *Assert_type -Python/Python-ast.c - Assign_fields variable static const char *Assign_fields[] -Python/Python-ast.c - Assign_type variable static PyTypeObject *Assign_type -Python/Python-ast.c - _astmodule variable static struct PyModuleDef _astmodule -Python/Python-ast.c - AST_type variable static PyTypeObject AST_type -Python/Python-ast.c - ast_type_getsets variable static PyGetSetDef ast_type_getsets[] -Python/Python-ast.c - ast_type_methods variable static PyMethodDef ast_type_methods -Python/Python-ast.c - AsyncFor_fields variable static const char *AsyncFor_fields[] -Python/Python-ast.c - AsyncFor_type variable static PyTypeObject *AsyncFor_type -Python/Python-ast.c - AsyncFunctionDef_fields variable static const char *AsyncFunctionDef_fields[] -Python/Python-ast.c - AsyncFunctionDef_type variable static PyTypeObject *AsyncFunctionDef_type -Objects/genobject.c - async_gen_as_async variable static PyAsyncMethods async_gen_as_async -Objects/genobject.c - async_gen_asend_as_async variable static PyAsyncMethods async_gen_asend_as_async -Objects/genobject.c - async_gen_asend_methods variable static PyMethodDef async_gen_asend_methods -Objects/genobject.c - async_gen_athrow_as_async variable static PyAsyncMethods async_gen_athrow_as_async -Objects/genobject.c - async_gen_athrow_methods variable static PyMethodDef async_gen_athrow_methods -Objects/genobject.c - async_gen_getsetlist variable static PyGetSetDef async_gen_getsetlist[] -Python/sysmodule.c - asyncgen_hooks_desc variable static PyStructSequence_Desc asyncgen_hooks_desc -Python/sysmodule.c - asyncgen_hooks_fields variable static PyStructSequence_Field asyncgen_hooks_fields[] -Python/sysmodule.c - AsyncGenHooksType variable static PyTypeObject AsyncGenHooksType -Objects/genobject.c - async_gen_memberlist variable static PyMemberDef async_gen_memberlist[] -Objects/genobject.c - async_gen_methods variable static PyMethodDef async_gen_methods -Python/Python-ast.c - AsyncWith_fields variable static const char *AsyncWith_fields[] -Python/Python-ast.c - AsyncWith_type variable static PyTypeObject *AsyncWith_type -Modules/atexitmodule.c - atexit_methods variable static PyMethodDef atexit_methods -Modules/atexitmodule.c - atexitmodule variable static struct PyModuleDef atexitmodule -Modules/atexitmodule.c - atexit_slots variable static PyModuleDef_Slot atexit_slots[] -Modules/_operator.c - attrgetter_methods variable static PyMethodDef attrgetter_methods -Modules/_operator.c - attrgetter_type variable static PyTypeObject attrgetter_type -Python/Python-ast.c - Attribute_fields variable static const char *Attribute_fields[] -Python/Python-ast.c - Attribute_type variable static PyTypeObject *Attribute_type -Python/Python-ast.c - AugAssign_fields variable static const char *AugAssign_fields[] -Python/Python-ast.c - AugAssign_type variable static PyTypeObject *AugAssign_type -Python/Python-ast.c - AugLoad_singleton variable static PyObject *AugLoad_singleton -Python/Python-ast.c - AugLoad_type variable static PyTypeObject *AugLoad_type -Python/Python-ast.c - AugStore_singleton variable static PyObject *AugStore_singleton -Python/Python-ast.c - AugStore_type variable static PyTypeObject *AugStore_type -Python/Python-ast.c - Await_fields variable static const char *Await_fields[] -Python/Python-ast.c - Await_type variable static PyTypeObject *Await_type -Objects/exceptions.c - BaseException_getset variable static PyGetSetDef BaseException_getset[] -Objects/exceptions.c - BaseException_members variable static struct PyMemberDef BaseException_members[] -Objects/exceptions.c - BaseException_methods variable static PyMethodDef BaseException_methods -Modules/posixmodule.c - billion variable static PyObject *billion -Python/Python-ast.c - BinOp_fields variable static const char *BinOp_fields[] -Python/Python-ast.c - BinOp_type variable static PyTypeObject *BinOp_type -Python/Python-ast.c - BitAnd_singleton variable static PyObject *BitAnd_singleton -Python/Python-ast.c - BitAnd_type variable static PyTypeObject *BitAnd_type -Python/Python-ast.c - BitOr_singleton variable static PyObject *BitOr_singleton -Python/Python-ast.c - BitOr_type variable static PyTypeObject *BitOr_type -Python/Python-ast.c - BitXor_singleton variable static PyObject *BitXor_singleton -Python/Python-ast.c - BitXor_type variable static PyTypeObject *BitXor_type -Objects/unicodeobject.c - bloom_linebreak variable static BLOOM_MASK bloom_linebreak -Objects/boolobject.c - bool_as_number variable static PyNumberMethods bool_as_number -Python/Python-ast.c - BoolOp_fields variable static const char *BoolOp_fields[] -Python/Python-ast.c - boolop_type variable static PyTypeObject *boolop_type -Python/Python-ast.c - BoolOp_type variable static PyTypeObject *BoolOp_type -Python/_warnings.c is_internal_frame bootstrap_string variable static PyObject *bootstrap_string -Python/Python-ast.c - Break_type variable static PyTypeObject *Break_type -Modules/_io/bufferedio.c - bufferediobase_methods variable static PyMethodDef bufferediobase_methods -Modules/_io/bufferedio.c - bufferedrandom_getset variable static PyGetSetDef bufferedrandom_getset[] -Modules/_io/bufferedio.c - bufferedrandom_members variable static PyMemberDef bufferedrandom_members[] -Modules/_io/bufferedio.c - bufferedrandom_methods variable static PyMethodDef bufferedrandom_methods -Modules/_io/bufferedio.c - bufferedreader_getset variable static PyGetSetDef bufferedreader_getset[] -Modules/_io/bufferedio.c - bufferedreader_members variable static PyMemberDef bufferedreader_members[] -Modules/_io/bufferedio.c - bufferedreader_methods variable static PyMethodDef bufferedreader_methods -Modules/_io/bufferedio.c - bufferedrwpair_getset variable static PyGetSetDef bufferedrwpair_getset[] -Modules/_io/bufferedio.c - bufferedrwpair_methods variable static PyMethodDef bufferedrwpair_methods -Modules/_io/bufferedio.c - bufferedwriter_getset variable static PyGetSetDef bufferedwriter_getset[] -Modules/_io/bufferedio.c - bufferedwriter_members variable static PyMemberDef bufferedwriter_members[] -Modules/_io/bufferedio.c - bufferedwriter_methods variable static PyMethodDef bufferedwriter_methods -Modules/getbuildinfo.c Py_GetBuildInfo buildinfo variable static char buildinfo[50 + sizeof(GITVERSION) + ((sizeof(GITTAG) > sizeof(GITBRANCH)) ? sizeof(GITTAG) : sizeof(GITBRANCH))] -Python/bltinmodule.c - builtin_methods variable static PyMethodDef builtin_methods -Python/bltinmodule.c - builtinsmodule variable static struct PyModuleDef builtinsmodule -Python/import.c PyImport_Import builtins_str variable static PyObject *builtins_str -Python/ceval.c make_pending_calls busy variable static int busy -Objects/bytearrayobject.c - bytearray_as_buffer variable static PyBufferProcs bytearray_as_buffer -Objects/bytearrayobject.c - bytearray_as_mapping variable static PyMappingMethods bytearray_as_mapping -Objects/bytearrayobject.c - bytearray_as_number variable static PyNumberMethods bytearray_as_number -Objects/bytearrayobject.c - bytearray_as_sequence variable static PySequenceMethods bytearray_as_sequence -Objects/bytearrayobject.c - bytearrayiter_methods variable static PyMethodDef bytearrayiter_methods -Objects/bytearrayobject.c - bytearray_methods variable static PyMethodDef bytearray_methods -Objects/bytesobject.c - bytes_as_buffer variable static PyBufferProcs bytes_as_buffer -Objects/bytesobject.c - bytes_as_mapping variable static PyMappingMethods bytes_as_mapping -Objects/bytesobject.c - bytes_as_number variable static PyNumberMethods bytes_as_number -Objects/bytesobject.c - bytes_as_sequence variable static PySequenceMethods bytes_as_sequence -Modules/_io/bytesio.c - bytesiobuf_as_buffer variable static PyBufferProcs bytesiobuf_as_buffer -Modules/_io/bytesio.c - bytesio_getsetlist variable static PyGetSetDef bytesio_getsetlist[] -Modules/_io/bytesio.c - bytesio_methods variable static PyMethodDef bytesio_methods -Objects/bytesobject.c - bytes_methods variable static PyMethodDef bytes_methods -Python/thread_pthread.h init_condattr ca variable static pthread_condattr_t ca -Python/Python-ast.c - Call_fields variable static const char *Call_fields[] -Objects/iterobject.c - calliter_methods variable static PyMethodDef calliter_methods -Python/Python-ast.c - Call_type variable static PyTypeObject *Call_type -Objects/cellobject.c - cell_getsetlist variable static PyGetSetDef cell_getsetlist[] -Modules/itertoolsmodule.c - chain_methods variable static PyMethodDef chain_methods -Modules/itertoolsmodule.c - chain_type variable static PyTypeObject chain_type -Objects/bytesobject.c - characters variable static PyBytesObject *characters[UCHAR_MAX + 1] -Python/symtable.c - __class__ variable static identifier __class__ -Python/Python-ast.c - ClassDef_fields variable static const char *ClassDef_fields[] -Python/Python-ast.c - ClassDef_type variable static PyTypeObject *ClassDef_type -Objects/funcobject.c - cm_getsetlist variable static PyGetSetDef cm_getsetlist[] -Objects/funcobject.c - cm_memberlist variable static PyMemberDef cm_memberlist[] -Python/Python-ast.c - cmpop_type variable static PyTypeObject *cmpop_type -Modules/_codecsmodule.c - _codecs_functions variable static PyMethodDef _codecs_functions[] -Modules/_codecsmodule.c - codecsmodule variable static struct PyModuleDef codecsmodule -Objects/codeobject.c - code_memberlist variable static PyMemberDef code_memberlist[] -Objects/codeobject.c - code_methods variable static PyMethodDef code_methods -Modules/_collectionsmodule.c - _collectionsmodule variable static struct PyModuleDef _collectionsmodule -Modules/itertoolsmodule.c - combinations_methods variable static PyMethodDef combinations_methods -Modules/itertoolsmodule.c - combinations_type variable static PyTypeObject combinations_type -Objects/typeobject.c object_new comma_id variable _Py_static_string(comma_id, "", "") -Python/Python-ast.c - Compare_fields variable static const char *Compare_fields[] -Python/Python-ast.c - Compare_type variable static PyTypeObject *Compare_type -Objects/complexobject.c - complex_as_number variable static PyNumberMethods complex_as_number -Objects/complexobject.c - complex_members variable static PyMemberDef complex_members[] -Objects/complexobject.c - complex_methods variable static PyMethodDef complex_methods -Python/Python-ast.c - comprehension_fields variable static const char *comprehension_fields[] -Python/Python-ast.c - comprehension_type variable static PyTypeObject *comprehension_type -Modules/itertoolsmodule.c - compress_methods variable static PyMethodDef compress_methods -Modules/itertoolsmodule.c - compress_type variable static PyTypeObject compress_type -Python/thread_pthread.h - condattr_monotonic variable static pthread_condattr_t *condattr_monotonic -Python/Python-ast.c - Constant_fields variable static const char *Constant_fields[] -Python/Python-ast.c - Constant_type variable static PyTypeObject *Constant_type -Python/Python-ast.c - Continue_type variable static PyTypeObject *Continue_type -Objects/longobject.c PyLong_FromString convmultmax_base variable static twodigits convmultmax_base[37] -Objects/longobject.c PyLong_FromString convwidth_base variable static int convwidth_base[37] -Objects/genobject.c - coro_as_async variable static PyAsyncMethods coro_as_async -Objects/genobject.c - coro_getsetlist variable static PyGetSetDef coro_getsetlist[] -Objects/genobject.c - coro_memberlist variable static PyMemberDef coro_memberlist[] -Objects/genobject.c - coro_methods variable static PyMethodDef coro_methods -Objects/genobject.c - coro_wrapper_methods variable static PyMethodDef coro_wrapper_methods -Modules/itertoolsmodule.c - count_methods variable static PyMethodDef count_methods -Modules/itertoolsmodule.c - count_type variable static PyTypeObject count_type -Python/context.c - ctx_freelist variable static PyContext *ctx_freelist -Python/context.c - ctx_freelist_len variable static int ctx_freelist_len -Modules/itertoolsmodule.c - cwr_methods variable static PyMethodDef cwr_methods -Modules/itertoolsmodule.c - cwr_type variable static PyTypeObject cwr_type -Modules/itertoolsmodule.c - cycle_methods variable static PyMethodDef cycle_methods -Modules/itertoolsmodule.c - cycle_type variable static PyTypeObject cycle_type -Objects/obmalloc.c new_arena debug_stats variable static int debug_stats -Modules/signalmodule.c - DefaultHandler variable static PyObject *DefaultHandler -Modules/_collectionsmodule.c - defdict_members variable static PyMemberDef defdict_members[] -Modules/_collectionsmodule.c - defdict_methods variable static PyMethodDef defdict_methods -Modules/_collectionsmodule.c - defdict_type variable static PyTypeObject defdict_type -Python/Python-ast.c - Delete_fields variable static const char *Delete_fields[] -Python/Python-ast.c - Delete_type variable static PyTypeObject *Delete_type -Python/Python-ast.c - Del_singleton variable static PyObject *Del_singleton -Python/Python-ast.c - Del_type variable static PyTypeObject *Del_type -Modules/_collectionsmodule.c - deque_as_number variable static PyNumberMethods deque_as_number -Modules/_collectionsmodule.c - deque_as_sequence variable static PySequenceMethods deque_as_sequence -Modules/_collectionsmodule.c - deque_getset variable static PyGetSetDef deque_getset[] -Modules/_collectionsmodule.c - dequeiter_methods variable static PyMethodDef dequeiter_methods -Modules/_collectionsmodule.c - dequeiter_type variable static PyTypeObject dequeiter_type -Modules/_collectionsmodule.c - deque_methods variable static PyMethodDef deque_methods -Modules/_collectionsmodule.c - dequereviter_type variable static PyTypeObject dequereviter_type -Modules/_collectionsmodule.c - deque_type variable static PyTypeObject deque_type -Objects/descrobject.c - descr_members variable static PyMemberDef descr_members[] -Objects/descrobject.c - descr_methods variable static PyMethodDef descr_methods -Modules/_abc.c - _destroy_def variable static PyMethodDef _destroy_def -Objects/floatobject.c - detected_double_format variable static float_format_type detected_double_format -Objects/floatobject.c - detected_float_format variable static float_format_type detected_float_format -Objects/dictobject.c - dict_as_mapping variable static PyMappingMethods dict_as_mapping -Objects/dictobject.c - dict_as_sequence variable static PySequenceMethods dict_as_sequence -Python/symtable.c - dictcomp variable static identifier dictcomp -Python/Python-ast.c - DictComp_fields variable static const char *DictComp_fields[] -Python/Python-ast.c - DictComp_type variable static PyTypeObject *DictComp_type -Python/Python-ast.c - Dict_fields variable static const char *Dict_fields[] -Objects/dictobject.c - dictitems_as_sequence variable static PySequenceMethods dictitems_as_sequence -Objects/dictobject.c - dictitems_methods variable static PyMethodDef dictitems_methods -Objects/dictobject.c - dictiter_methods variable static PyMethodDef dictiter_methods -Objects/dictobject.c - dictkeys_as_sequence variable static PySequenceMethods dictkeys_as_sequence -Objects/dictobject.c - dictkeys_methods variable static PyMethodDef dictkeys_methods -Python/Python-ast.c - Dict_type variable static PyTypeObject *Dict_type -Objects/dictobject.c - dictvalues_as_sequence variable static PySequenceMethods dictvalues_as_sequence -Objects/dictobject.c - dictvalues_methods variable static PyMethodDef dictvalues_methods -Objects/dictobject.c - dictviews_as_number variable static PyNumberMethods dictviews_as_number -Modules/posixmodule.c - DirEntry_members variable static PyMemberDef DirEntry_members[] -Modules/posixmodule.c - DirEntry_methods variable static PyMethodDef DirEntry_methods -Modules/posixmodule.c - DirEntryType variable static PyTypeObject DirEntryType -Python/Python-ast.c - Div_singleton variable static PyObject *Div_singleton -Python/Python-ast.c - Div_type variable static PyTypeObject *Div_type -Python/compile.c - __doc__ variable static PyObject *__doc__ -Objects/classobject.c method_get_doc docstr variable static PyObject *docstr -Objects/classobject.c instancemethod_get_doc docstr variable static PyObject *docstr -Python/compile.c compiler_set_qualname dot variable _Py_static_string(dot, ""."") -Python/compile.c compiler_set_qualname dot_locals variable _Py_static_string(dot_locals, ""."") -Objects/floatobject.c - double_format variable static float_format_type double_format -Modules/itertoolsmodule.c - dropwhile_methods variable static PyMethodDef dropwhile_methods -Modules/itertoolsmodule.c - dropwhile_type variable static PyTypeObject dropwhile_type -Objects/setobject.c - _dummy_struct variable static PyObject _dummy_struct -Modules/posixmodule.c os_dup2_impl dup3_works variable static int dup3_works -Modules/_io/bufferedio.c _PyIO_trap_eintr eintr_int variable static PyObject *eintr_int -Objects/sliceobject.c - ellipsis_methods variable static PyMethodDef ellipsis_methods -Python/hamt.c - _empty_bitmap_node variable static PyHamtNode_Bitmap *_empty_bitmap_node -Objects/setobject.c - emptyfrozenset variable static PyObject *emptyfrozenset -Python/hamt.c - _empty_hamt variable static PyHamtObject *_empty_hamt -Objects/dictobject.c - empty_keys_struct variable static PyDictKeysObject empty_keys_struct -Objects/codeobject.c PyCode_NewEmpty emptystring variable static PyObject *emptystring -Python/compile.c compiler_from_import empty_string variable static PyObject *empty_string -Objects/dictobject.c - empty_values variable static PyObject *empty_values[1] -Objects/unicodeobject.c - encoding_map_methods variable static PyMethodDef encoding_map_methods -Objects/unicodeobject.c - EncodingMapType variable static PyTypeObject EncodingMapType -Objects/enumobject.c - enum_methods variable static PyMethodDef enum_methods -Python/Python-ast.c - Eq_singleton variable static PyObject *Eq_singleton -Python/Python-ast.c - Eq_type variable static PyTypeObject *Eq_type -Objects/exceptions.c - errnomap variable static PyObject *errnomap -Modules/errnomodule.c - errno_methods variable static PyMethodDef errno_methods -Modules/errnomodule.c - errnomodule variable static struct PyModuleDef errnomodule -Modules/_localemodule.c - Error variable static PyObject *Error -Python/Python-ast.c - excepthandler_attributes variable static const char *excepthandler_attributes[] -Python/Python-ast.c - ExceptHandler_fields variable static const char *ExceptHandler_fields[] -Python/Python-ast.c - excepthandler_type variable static PyTypeObject *excepthandler_type -Python/Python-ast.c - ExceptHandler_type variable static PyTypeObject *ExceptHandler_type -Modules/_threadmodule.c - ExceptHookArgs_desc variable static PyStructSequence_Desc ExceptHookArgs_desc -Modules/_threadmodule.c - ExceptHookArgs_fields variable static PyStructSequence_Field ExceptHookArgs_fields[] -Modules/_threadmodule.c - ExceptHookArgsType variable static PyTypeObject ExceptHookArgsType -Objects/exceptions.c _check_for_legacy_statements exec_prefix variable static PyObject *exec_prefix -Python/Python-ast.c - expr_attributes variable static const char *expr_attributes[] -Python/Python-ast.c - expr_context_type variable static PyTypeObject *expr_context_type -Python/Python-ast.c - Expression_fields variable static const char *Expression_fields[] -Python/Python-ast.c - Expression_type variable static PyTypeObject *Expression_type -Python/Python-ast.c - Expr_fields variable static const char *Expr_fields[] -Python/Python-ast.c - expr_type variable static PyTypeObject *expr_type -Python/Python-ast.c - Expr_type variable static PyTypeObject *Expr_type -Python/import.c - extensions variable static PyObject *extensions -Python/Python-ast.c - ExtSlice_fields variable static const char *ExtSlice_fields[] -Python/Python-ast.c - ExtSlice_type variable static PyTypeObject *ExtSlice_type -Objects/boolobject.c - false_str variable static PyObject *false_str -Modules/faulthandler.c - fatal_error variable static struct { int enabled; PyObject *file; int fd; int all_threads; PyInterpreterState *interp; void *exc_handler; } fatal_error -Modules/faulthandler.c - faulthandler_handlers variable static fault_handler_t faulthandler_handlers[] -Objects/stringlib/unicode_format.h - fieldnameiter_methods variable static PyMethodDef fieldnameiter_methods -Modules/_io/fileio.c - fileio_getsetlist variable static PyGetSetDef fileio_getsetlist[] -Modules/_io/fileio.c - fileio_members variable static PyMemberDef fileio_members[] -Modules/_io/fileio.c - fileio_methods variable static PyMethodDef fileio_methods -Modules/itertoolsmodule.c - filterfalse_methods variable static PyMethodDef filterfalse_methods -Modules/itertoolsmodule.c - filterfalse_type variable static PyTypeObject filterfalse_type -Python/bltinmodule.c - filter_methods variable static PyMethodDef filter_methods -Python/sysmodule.c - flags_desc variable static PyStructSequence_Desc flags_desc -Python/sysmodule.c - flags_fields variable static PyStructSequence_Field flags_fields[] -Python/sysmodule.c - FlagsType variable static PyTypeObject FlagsType -Objects/floatobject.c - float_as_number variable static PyNumberMethods float_as_number -Objects/floatobject.c - float_format variable static float_format_type -Objects/floatobject.c - float_getset variable static PyGetSetDef float_getset[] -Objects/floatobject.c - floatinfo_desc variable static PyStructSequence_Desc floatinfo_desc -Objects/floatobject.c - floatinfo_fields variable static PyStructSequence_Field floatinfo_fields[] -Objects/floatobject.c - FloatInfoType variable static PyTypeObject FloatInfoType -Objects/floatobject.c - float_methods variable static PyMethodDef float_methods -Python/Python-ast.c - FloorDiv_singleton variable static PyObject *FloorDiv_singleton -Python/Python-ast.c - FloorDiv_type variable static PyTypeObject *FloorDiv_type -Python/fileutils.c - force_ascii variable static int force_ascii -Python/Python-ast.c - For_fields variable static const char *For_fields[] -Python/Python-ast.c - FormattedValue_fields variable static const char *FormattedValue_fields[] -Python/Python-ast.c - FormattedValue_type variable static PyTypeObject *FormattedValue_type -Objects/stringlib/unicode_format.h - formatteriter_methods variable static PyMethodDef formatteriter_methods -Python/Python-ast.c - For_type variable static PyTypeObject *For_type -Objects/frameobject.c - frame_getsetlist variable static PyGetSetDef frame_getsetlist[] -Objects/frameobject.c - frame_memberlist variable static PyMemberDef frame_memberlist[] -Objects/frameobject.c - frame_methods variable static PyMethodDef frame_methods -Modules/_collectionsmodule.c - freeblocks variable static block *freeblocks[MAXFREEBLOCKS] -Python/dtoa.c - freelist variable static Bigint *freelist[Kmax+1] -Objects/floatobject.c - free_list variable static PyFloatObject *free_list -Objects/frameobject.c - free_list variable static PyFrameObject *free_list -Objects/listobject.c - free_list variable static PyListObject *free_list[PyList_MAXFREELIST] -Objects/dictobject.c - free_list variable static PyDictObject *free_list[PyDict_MAXFREELIST] -Objects/methodobject.c - free_list variable static PyCFunctionObject *free_list -Objects/tupleobject.c - free_list variable static PyTupleObject *free_list[PyTuple_MAXSAVESIZE] -Objects/classobject.c - free_list variable static PyMethodObject *free_list -Objects/setobject.c - frozenset_as_number variable static PyNumberMethods frozenset_as_number -Objects/setobject.c - frozenset_methods variable static PyMethodDef frozenset_methods -Objects/funcobject.c - func_getsetlist variable static PyGetSetDef func_getsetlist[] -Objects/funcobject.c - func_memberlist variable static PyMemberDef func_memberlist[] -Python/Python-ast.c - FunctionDef_fields variable static const char *FunctionDef_fields[] -Python/Python-ast.c - FunctionDef_type variable static PyTypeObject *FunctionDef_type -Modules/_sre.c - _functions variable static PyMethodDef _functions[] -Python/Python-ast.c - FunctionType_fields variable static const char *FunctionType_fields[] -Python/Python-ast.c - FunctionType_type variable static PyTypeObject *FunctionType_type -Modules/_functoolsmodule.c - _functoolsmodule variable static struct PyModuleDef _functoolsmodule -Modules/gcmodule.c - GcMethods variable static PyMethodDef GcMethods[] -Modules/gcmodule.c - gcmodule variable static struct PyModuleDef gcmodule -Modules/gcmodule.c - gc_str variable static PyObject *gc_str -Python/Python-ast.c - GeneratorExp_fields variable static const char *GeneratorExp_fields[] -Python/Python-ast.c - GeneratorExp_type variable static PyTypeObject *GeneratorExp_type -Python/symtable.c - genexpr variable static identifier genexpr -Objects/genobject.c - gen_getsetlist variable static PyGetSetDef gen_getsetlist[] -Objects/genobject.c - gen_memberlist variable static PyMemberDef gen_memberlist[] -Objects/genobject.c - gen_methods variable static PyMethodDef gen_methods -Python/bootstrap_hash.c py_getrandom getrandom_works variable static int getrandom_works -Objects/descrobject.c - getset_getset variable static PyGetSetDef getset_getset[] -Python/Python-ast.c - Global_fields variable static const char *Global_fields[] -Python/Python-ast.c - Global_type variable static PyTypeObject *Global_type -Modules/itertoolsmodule.c - groupby_methods variable static PyMethodDef groupby_methods -Modules/itertoolsmodule.c - groupby_type variable static PyTypeObject groupby_type -Modules/itertoolsmodule.c - _grouper_methods variable static PyMethodDef _grouper_methods -Modules/itertoolsmodule.c - _grouper_type variable static PyTypeObject _grouper_type -Python/Python-ast.c - GtE_singleton variable static PyObject *GtE_singleton -Python/Python-ast.c - GtE_type variable static PyTypeObject *GtE_type -Python/Python-ast.c - Gt_singleton variable static PyObject *Gt_singleton -Python/Python-ast.c - Gt_type variable static PyTypeObject *Gt_type -Modules/signalmodule.c - Handlers variable static volatile struct { _Py_atomic_int tripped; PyObject *func; } Handlers[NSIG] -Python/dynload_shlib.c - handles variable static struct { dev_t dev; ino_t ino; void *handle; } handles[128] -Python/sysmodule.c - hash_info_desc variable static PyStructSequence_Desc hash_info_desc -Python/sysmodule.c - hash_info_fields variable static PyStructSequence_Field hash_info_fields[] -Python/sysmodule.c - Hash_InfoType variable static PyTypeObject Hash_InfoType -Python/import.c import_find_and_load header variable static int header -Python/Python-ast.c - IfExp_fields variable static const char *IfExp_fields[] -Python/Python-ast.c - IfExp_type variable static PyTypeObject *IfExp_type -Python/Python-ast.c - If_fields variable static const char *If_fields[] -Python/Python-ast.c - If_type variable static PyTypeObject *If_type -Modules/signalmodule.c - IgnoreHandler variable static PyObject *IgnoreHandler -Python/import.c - imp_methods variable static PyMethodDef imp_methods -Python/import.c - impmodule variable static struct PyModuleDef impmodule -Objects/exceptions.c - ImportError_members variable static PyMemberDef ImportError_members[] -Objects/exceptions.c - ImportError_methods variable static PyMethodDef ImportError_methods -Python/Python-ast.c - Import_fields variable static const char *Import_fields[] -Python/Python-ast.c - ImportFrom_fields variable static const char *ImportFrom_fields[] -Python/Python-ast.c - ImportFrom_type variable static PyTypeObject *ImportFrom_type -Python/import.c import_find_and_load import_level variable static int import_level -Python/_warnings.c is_internal_frame importlib_string variable static PyObject *importlib_string -Python/import.c - import_lock variable static PyThread_type_lock import_lock -Python/import.c - import_lock_level variable static int import_lock_level -Python/import.c - import_lock_thread variable static unsigned long import_lock_thread -Python/import.c PyImport_Import import_str variable static PyObject *import_str -Python/Python-ast.c - Import_type variable static PyTypeObject *Import_type -Modules/_io/textio.c - incrementalnewlinedecoder_getset variable static PyGetSetDef incrementalnewlinedecoder_getset[] -Modules/_io/textio.c - incrementalnewlinedecoder_methods variable static PyMethodDef incrementalnewlinedecoder_methods -Objects/listobject.c - indexerr variable static PyObject *indexerr -Python/Python-ast.c - Index_fields variable static const char *Index_fields[] -Python/Python-ast.c - Index_type variable static PyTypeObject *Index_type -Python/thread.c - initialized variable static int initialized -Modules/posixmodule.c - initialized variable static int initialized -Modules/pwdmodule.c - initialized variable static int initialized -Modules/signalmodule.c - initialized variable static int initialized -Modules/timemodule.c - initialized variable static int initialized -Python/Python-ast.c init_types initialized variable static int initialized -Objects/listobject.c PyList_New initialized variable static int initialized -Python/import.c - inittab_copy variable static struct _inittab *inittab_copy -Python/Python-ast.c - In_singleton variable static PyObject *In_singleton -Objects/classobject.c - instancemethod_getset variable static PyGetSetDef instancemethod_getset[] -Objects/classobject.c - instancemethod_memberlist variable static PyMemberDef instancemethod_memberlist[] -Python/Python-ast.c - Interactive_fields variable static const char *Interactive_fields[] -Python/Python-ast.c - Interactive_type variable static PyTypeObject *Interactive_type -Objects/unicodeobject.c - interned variable static PyObject *interned -Objects/interpreteridobject.c - interpid_as_number variable static PyNumberMethods interpid_as_number -Modules/signalmodule.c - IntHandler variable static PyObject *IntHandler -Objects/longobject.c - int_info_desc variable static PyStructSequence_Desc int_info_desc -Objects/longobject.c - int_info_fields variable static PyStructSequence_Field int_info_fields[] -Objects/longobject.c - Int_InfoType variable static PyTypeObject Int_InfoType -Python/Python-ast.c - In_type variable static PyTypeObject *In_type -Python/Python-ast.c - Invert_singleton variable static PyObject *Invert_singleton -Python/Python-ast.c - Invert_type variable static PyTypeObject *Invert_type -Modules/_io/iobase.c - iobase_getset variable static PyGetSetDef iobase_getset[] -Modules/_io/iobase.c - iobase_methods variable static PyMethodDef iobase_methods -Python/fileutils.c set_inheritable ioctl_works variable static int ioctl_works -Modules/itertoolsmodule.c - islice_methods variable static PyMethodDef islice_methods -Modules/itertoolsmodule.c - islice_type variable static PyTypeObject islice_type -Python/Python-ast.c - IsNot_singleton variable static PyObject *IsNot_singleton -Python/Python-ast.c - IsNot_type variable static PyTypeObject *IsNot_type -Python/Python-ast.c - Is_singleton variable static PyObject *Is_singleton -Modules/signalmodule.c - is_tripped variable static _Py_atomic_int is_tripped -Python/Python-ast.c - Is_type variable static PyTypeObject *Is_type -Modules/_operator.c - itemgetter_methods variable static PyMethodDef itemgetter_methods -Modules/_operator.c - itemgetter_type variable static PyTypeObject itemgetter_type -Modules/itertoolsmodule.c - itertoolsmodule variable static struct PyModuleDef itertoolsmodule -Modules/signalmodule.c - ItimerError variable static PyObject *ItimerError -Python/Python-ast.c - JoinedStr_fields variable static const char *JoinedStr_fields[] -Python/Python-ast.c - JoinedStr_type variable static PyTypeObject *JoinedStr_type -Modules/_functoolsmodule.c - keyobject_members variable static PyMemberDef keyobject_members[] -Modules/_functoolsmodule.c - keyobject_type variable static PyTypeObject keyobject_type -Objects/dictobject.c - keys_free_list variable static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST] -Python/Python-ast.c - keyword_fields variable static const char *keyword_fields[] -Python/sysmodule.c sys_set_asyncgen_hooks keywords variable static const char *keywords[] -Modules/_bisectmodule.c bisect_right keywords variable static const char *keywords[] -Modules/_bisectmodule.c insort_right keywords variable static const char *keywords[] -Python/Python-ast.c - keyword_type variable static PyTypeObject *keyword_type -Modules/_functoolsmodule.c keyobject_call kwargs variable static const char *kwargs[] -Modules/_functoolsmodule.c functools_cmp_to_key kwargs variable static const char *kwargs[] -Modules/itertoolsmodule.c repeat_new kwargs variable static const char *kwargs[] -Python/_warnings.c warnings_warn_explicit kwd_list variable static const char *kwd_list[] -Modules/_functoolsmodule.c - kwd_mark variable static PyObject *kwd_mark -Python/bltinmodule.c builtin___import__ kwlist variable static const char *kwlist[] -Python/bltinmodule.c min_max kwlist variable static const char *kwlist[] -Python/context.c contextvar_tp_new kwlist variable static const char *kwlist[] -Python/sysmodule.c sys_getsizeof kwlist variable static const char *kwlist[] -Objects/bytearrayobject.c bytearray_init kwlist variable static const char *kwlist[] -Objects/bytesobject.c bytes_new kwlist variable static const char *kwlist[] -Objects/exceptions.c ImportError_init kwlist variable static const char *kwlist[] -Objects/interpreteridobject.c interpid_new kwlist variable static const char *kwlist[] -Objects/memoryobject.c memory_new kwlist variable static const char *kwlist[] -Objects/memoryobject.c memory_cast kwlist variable static const char *kwlist[] -Objects/memoryobject.c memory_tobytes kwlist variable static const char *kwlist[] -Objects/odictobject.c odict_pop kwlist variable static const char *kwlist[] -Objects/unicodeobject.c unicode_new kwlist variable static const char *kwlist[] -Objects/weakrefobject.c weakref_call kwlist variable static const char *kwlist[] -Modules/_elementtree.c element_setstate_from_Python kwlist variable static const char *kwlist[] -Modules/_json.c scanner_call kwlist variable static const char *kwlist[] -Modules/_json.c scanner_new kwlist variable static const char *kwlist[] -Modules/_json.c encoder_new kwlist variable static const char *kwlist[] -Modules/_json.c encoder_call kwlist variable static const char *kwlist[] -Python/symtable.c - lambda variable static identifier lambda -Python/Python-ast.c - Lambda_fields variable static const char *Lambda_fields[] -Python/Python-ast.c - Lambda_type variable static PyTypeObject *Lambda_type -Objects/listobject.c - list_as_mapping variable static PyMappingMethods list_as_mapping -Objects/listobject.c - list_as_sequence variable static PySequenceMethods list_as_sequence -Python/symtable.c - listcomp variable static identifier listcomp -Python/Python-ast.c - ListComp_fields variable static const char *ListComp_fields[] -Python/Python-ast.c - ListComp_type variable static PyTypeObject *ListComp_type -Python/Python-ast.c - List_fields variable static const char *List_fields[] -Objects/listobject.c - listiter_methods variable static PyMethodDef listiter_methods -Objects/listobject.c - list_methods variable static PyMethodDef list_methods -Objects/listobject.c - listreviter_methods variable static PyMethodDef listreviter_methods -Python/Python-ast.c - List_type variable static PyTypeObject *List_type -Python/ceval.c - lltrace variable static int lltrace -Python/Python-ast.c - Load_singleton variable static PyObject *Load_singleton -Python/Python-ast.c - Load_type variable static PyTypeObject *Load_type -Modules/_threadmodule.c - localdummytype variable static PyTypeObject localdummytype -Modules/_localemodule.c - _localemodule variable static struct PyModuleDef _localemodule -Modules/_threadmodule.c - localtype variable static PyTypeObject localtype -Modules/_threadmodule.c - lock_methods variable static PyMethodDef lock_methods -Modules/_threadmodule.c - Locktype variable static PyTypeObject Locktype -Objects/longobject.c PyLong_FromString log_base_BASE variable static double log_base_BASE[37] -Objects/longobject.c - long_as_number variable static PyNumberMethods long_as_number -Objects/longobject.c - long_getset variable static PyGetSetDef long_getset[] -Objects/longobject.c - long_methods variable static PyMethodDef long_methods -Objects/rangeobject.c - longrangeiter_methods variable static PyMethodDef longrangeiter_methods -Modules/_functoolsmodule.c - lru_cache_getsetlist variable static PyGetSetDef lru_cache_getsetlist[] -Modules/_functoolsmodule.c - lru_cache_methods variable static PyMethodDef lru_cache_methods -Modules/_functoolsmodule.c - lru_cache_type variable static PyTypeObject lru_cache_type -Modules/_functoolsmodule.c - lru_list_elem_type variable static PyTypeObject lru_list_elem_type -Python/Python-ast.c - LShift_singleton variable static PyObject *LShift_singleton -Python/Python-ast.c - LShift_type variable static PyTypeObject *LShift_type -Python/Python-ast.c - LtE_singleton variable static PyObject *LtE_singleton -Python/Python-ast.c - LtE_type variable static PyTypeObject *LtE_type -Python/Python-ast.c - Lt_singleton variable static PyObject *Lt_singleton -Python/Python-ast.c - Lt_type variable static PyTypeObject *Lt_type -Python/bltinmodule.c - map_methods variable static PyMethodDef map_methods -Objects/descrobject.c - mappingproxy_as_mapping variable static PyMappingMethods mappingproxy_as_mapping -Objects/descrobject.c - mappingproxy_as_sequence variable static PySequenceMethods mappingproxy_as_sequence -Objects/descrobject.c - mappingproxy_methods variable static PyMethodDef mappingproxy_methods -Objects/dictobject.c - mapp_methods variable static PyMethodDef mapp_methods -Python/marshal.c - marshal_methods variable static PyMethodDef marshal_methods -Python/marshal.c - marshalmodule variable static struct PyModuleDef marshalmodule -Modules/_sre.c - match_as_mapping variable static PyMappingMethods match_as_mapping -Modules/_sre.c - match_getset variable static PyGetSetDef match_getset[] -Modules/_sre.c - match_members variable static PyMemberDef match_members[] -Modules/_sre.c - match_methods variable static PyMethodDef match_methods -Modules/_sre.c - Match_Type variable static PyTypeObject Match_Type -Python/Python-ast.c - MatMult_singleton variable static PyObject *MatMult_singleton -Python/Python-ast.c - MatMult_type variable static PyTypeObject *MatMult_type -Objects/obmalloc.c - maxarenas variable static uint maxarenas -Objects/moduleobject.c - max_module_number variable static Py_ssize_t max_module_number -Objects/descrobject.c - member_getset variable static PyGetSetDef member_getset[] -Objects/exceptions.c - memerrors_freelist variable static PyBaseExceptionObject *memerrors_freelist -Objects/exceptions.c - memerrors_numfree variable static int memerrors_numfree -Objects/memoryobject.c - memory_as_buffer variable static PyBufferProcs memory_as_buffer -Objects/memoryobject.c - memory_as_mapping variable static PyMappingMethods memory_as_mapping -Objects/memoryobject.c - memory_as_sequence variable static PySequenceMethods memory_as_sequence -Objects/memoryobject.c - memory_getsetlist variable static PyGetSetDef memory_getsetlist[] -Objects/memoryobject.c - memory_methods variable static PyMethodDef memory_methods -Objects/methodobject.c - meth_getsets variable static PyGetSetDef meth_getsets [] -Objects/methodobject.c - meth_members variable static PyMemberDef meth_members[] -Objects/methodobject.c - meth_methods variable static PyMethodDef meth_methods -Objects/typeobject.c - method_cache variable static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP] -Modules/_operator.c - methodcaller_methods variable static PyMethodDef methodcaller_methods -Modules/_operator.c - methodcaller_type variable static PyTypeObject methodcaller_type -Objects/classobject.c - method_getset variable static PyGetSetDef method_getset[] -Objects/descrobject.c - method_getset variable static PyGetSetDef method_getset[] -Objects/classobject.c - method_memberlist variable static PyMemberDef method_memberlist[] -Objects/classobject.c - method_methods variable static PyMethodDef method_methods -Python/codecs.c _PyCodecRegistry_Init methods variable static struct { char *name; PyMethodDef def; } methods[] -Python/frozen.c - M___hello__ variable static unsigned char M___hello__[] -Python/Python-ast.c - Mod_singleton variable static PyObject *Mod_singleton -Python/Python-ast.c - mod_type variable static PyTypeObject *mod_type -Python/Python-ast.c - Mod_type variable static PyTypeObject *Mod_type -Modules/faulthandler.c - module_def variable static struct PyModuleDef module_def -Modules/_tracemalloc.c - module_def variable static struct PyModuleDef module_def -Python/Python-ast.c - Module_fields variable static const char *Module_fields[] -Modules/_collectionsmodule.c - module_functions variable static struct PyMethodDef module_functions[] -Modules/_abc.c - module_functions variable static struct PyMethodDef module_functions[] -Objects/moduleobject.c - module_members variable static PyMemberDef module_members[] -Objects/moduleobject.c - module_methods variable static PyMethodDef module_methods -Modules/_functoolsmodule.c - module_methods variable static PyMethodDef module_methods -Modules/itertoolsmodule.c - module_methods variable static PyMethodDef module_methods -Modules/_io/_iomodule.c - module_methods variable static PyMethodDef module_methods -Modules/faulthandler.c - module_methods variable static PyMethodDef module_methods -Modules/_tracemalloc.c - module_methods variable static PyMethodDef module_methods -Python/Python-ast.c - Module_type variable static PyTypeObject *Module_type -Python/Python-ast.c - Mult_singleton variable static PyObject *Mult_singleton -Python/Python-ast.c - Mult_type variable static PyTypeObject *Mult_type -Objects/funcobject.c PyFunction_NewWithQualName __name__ variable static PyObject *__name__ -Python/compile.c compiler_lambda name variable static identifier name -Python/compile.c compiler_genexp name variable static identifier name -Python/compile.c compiler_listcomp name variable static identifier name -Python/compile.c compiler_setcomp name variable static identifier name -Python/compile.c compiler_dictcomp name variable static identifier name -Python/Python-ast.c - NamedExpr_fields variable static const char *NamedExpr_fields[] -Python/Python-ast.c - NamedExpr_type variable static PyTypeObject *NamedExpr_type -Python/Python-ast.c - Name_fields variable static const char *Name_fields[] -Objects/typeobject.c - name_op variable static _Py_Identifier name_op[] -Objects/namespaceobject.c - namespace_members variable static PyMemberDef namespace_members[] -Objects/namespaceobject.c - namespace_methods variable static PyMethodDef namespace_methods -Python/Python-ast.c - Name_type variable static PyTypeObject *Name_type -Objects/obmalloc.c - narenas_currently_allocated variable static size_t narenas_currently_allocated -Objects/obmalloc.c - narenas_highwater variable static size_t narenas_highwater -Python/sysmodule.c sys_displayhook newline variable static PyObject *newline -Objects/typeobject.c - next_version_tag variable static unsigned int next_version_tag -Objects/obmalloc.c - nfp2lasta variable static struct arena_object* nfp2lasta[MAX_POOLS_IN_ARENA + 1] -Python/dynload_shlib.c - nhandles variable static int nhandles -Objects/object.c - none_as_number variable static PyNumberMethods none_as_number -Python/Python-ast.c - Nonlocal_fields variable static const char *Nonlocal_fields[] -Python/Python-ast.c - Nonlocal_type variable static PyTypeObject *Nonlocal_type -Python/Python-ast.c - NotEq_singleton variable static PyObject *NotEq_singleton -Python/Python-ast.c - NotEq_type variable static PyTypeObject *NotEq_type -Objects/object.c - notimplemented_methods variable static PyMethodDef notimplemented_methods -Python/Python-ast.c - NotIn_singleton variable static PyObject *NotIn_singleton -Python/Python-ast.c - NotIn_type variable static PyTypeObject *NotIn_type -Python/Python-ast.c - Not_singleton variable static PyObject *Not_singleton -Python/Python-ast.c - Not_type variable static PyTypeObject *Not_type -Objects/obmalloc.c - ntimes_arena_allocated variable static size_t ntimes_arena_allocated -Objects/bytesobject.c - nullstring variable static PyBytesObject *nullstring -Objects/codeobject.c PyCode_NewEmpty nulltuple variable static PyObject *nulltuple -Objects/floatobject.c - numfree variable static int numfree -Objects/frameobject.c - numfree variable static int numfree -Objects/listobject.c - numfree variable static int numfree -Objects/dictobject.c - numfree variable static int numfree -Objects/methodobject.c - numfree variable static int numfree -Objects/tupleobject.c - numfree variable static int numfree[PyTuple_MAXSAVESIZE] -Objects/classobject.c - numfree variable static int numfree -Modules/_collectionsmodule.c - numfreeblocks variable static Py_ssize_t numfreeblocks -Objects/dictobject.c - numfreekeys variable static int numfreekeys -Objects/typeobject.c - object_getsets variable static PyGetSetDef object_getsets[] -Objects/typeobject.c - object_methods variable static PyMethodDef object_methods -Objects/typeobject.c object___reduce_ex___impl objreduce variable static PyObject *objreduce -Objects/odictobject.c - odict_as_mapping variable static PyMappingMethods odict_as_mapping -Objects/odictobject.c - odict_getset variable static PyGetSetDef odict_getset[] -Objects/odictobject.c - odictitems_methods variable static PyMethodDef odictitems_methods -Objects/odictobject.c - odictiter_methods variable static PyMethodDef odictiter_methods -Objects/odictobject.c - odictkeys_methods variable static PyMethodDef odictkeys_methods -Objects/odictobject.c - odict_methods variable static PyMethodDef odict_methods -Objects/odictobject.c - odictvalues_methods variable static PyMethodDef odictvalues_methods -Modules/faulthandler.c - old_stack variable static stack_t old_stack -Modules/_operator.c - operator_methods variable static PyMethodDef operator_methods -Modules/_operator.c - operatormodule variable static struct PyModuleDef operatormodule -Python/Python-ast.c - operator_type variable static PyTypeObject *operator_type -Objects/typeobject.c slot_nb_add op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_subtract op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_multiply op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_matrix_multiply op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_remainder op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_divmod op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_power_binary op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_lshift op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_rshift op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_and op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_xor op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_or op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_floor_divide op_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_true_divide op_id variable _Py_static_string(op_id, OPSTR) -Python/getopt.c - opt_ptr variable static const wchar_t *opt_ptr -Python/initconfig.c - orig_argv variable static PyWideStringList orig_argv -Python/Python-ast.c - Or_singleton variable static PyObject *Or_singleton -Python/Python-ast.c - Or_type variable static PyTypeObject *Or_type -Objects/exceptions.c - OSError_getset variable static PyGetSetDef OSError_getset[] -Objects/exceptions.c - OSError_members variable static PyMemberDef OSError_members[] -Objects/exceptions.c - OSError_methods variable static PyMethodDef OSError_methods -Python/dtoa.c - p5s variable static Bigint *p5s -Python/Python-ast.c - Param_singleton variable static PyObject *Param_singleton -Python/Python-ast.c - Param_type variable static PyTypeObject *Param_type -Python/bltinmodule.c builtin_print _parser variable static struct _PyArg_Parser _parser -Python/clinic/_warnings.c.h warnings_warn _parser variable static _PyArg_Parser _parser -Python/clinic/bltinmodule.c.h builtin_compile _parser variable static _PyArg_Parser _parser -Python/clinic/bltinmodule.c.h builtin_round _parser variable static _PyArg_Parser _parser -Python/clinic/bltinmodule.c.h builtin_sum _parser variable static _PyArg_Parser _parser -Python/clinic/import.c.h _imp_source_hash _parser variable static _PyArg_Parser _parser -Python/clinic/sysmodule.c.h sys_addaudithook _parser variable static _PyArg_Parser _parser -Python/clinic/sysmodule.c.h sys_set_coroutine_origin_tracking_depth _parser variable static _PyArg_Parser _parser -Python/clinic/traceback.c.h tb_new _parser variable static _PyArg_Parser _parser -Objects/clinic/bytearrayobject.c.h bytearray_translate _parser variable static _PyArg_Parser _parser -Objects/clinic/bytearrayobject.c.h bytearray_split _parser variable static _PyArg_Parser _parser -Objects/clinic/bytearrayobject.c.h bytearray_rsplit _parser variable static _PyArg_Parser _parser -Objects/clinic/bytearrayobject.c.h bytearray_decode _parser variable static _PyArg_Parser _parser -Objects/clinic/bytearrayobject.c.h bytearray_splitlines _parser variable static _PyArg_Parser _parser -Objects/clinic/bytearrayobject.c.h bytearray_hex _parser variable static _PyArg_Parser _parser -Objects/clinic/bytesobject.c.h bytes_split _parser variable static _PyArg_Parser _parser -Objects/clinic/bytesobject.c.h bytes_rsplit _parser variable static _PyArg_Parser _parser -Objects/clinic/bytesobject.c.h bytes_translate _parser variable static _PyArg_Parser _parser -Objects/clinic/bytesobject.c.h bytes_decode _parser variable static _PyArg_Parser _parser -Objects/clinic/bytesobject.c.h bytes_splitlines _parser variable static _PyArg_Parser _parser -Objects/clinic/bytesobject.c.h bytes_hex _parser variable static _PyArg_Parser _parser -Objects/clinic/codeobject.c.h code_replace _parser variable static _PyArg_Parser _parser -Objects/clinic/complexobject.c.h complex_new _parser variable static _PyArg_Parser _parser -Objects/clinic/descrobject.c.h mappingproxy_new _parser variable static _PyArg_Parser _parser -Objects/clinic/descrobject.c.h property_init _parser variable static _PyArg_Parser _parser -Objects/clinic/enumobject.c.h enum_new _parser variable static _PyArg_Parser _parser -Objects/clinic/funcobject.c.h func_new _parser variable static _PyArg_Parser _parser -Objects/clinic/listobject.c.h list_sort _parser variable static _PyArg_Parser _parser -Objects/clinic/longobject.c.h long_new _parser variable static _PyArg_Parser _parser -Objects/clinic/longobject.c.h int_to_bytes _parser variable static _PyArg_Parser _parser -Objects/clinic/longobject.c.h int_from_bytes _parser variable static _PyArg_Parser _parser -Objects/clinic/memoryobject.c.h memoryview_hex _parser variable static _PyArg_Parser _parser -Objects/clinic/moduleobject.c.h module___init__ _parser variable static _PyArg_Parser _parser -Objects/clinic/odictobject.c.h OrderedDict_fromkeys _parser variable static _PyArg_Parser _parser -Objects/clinic/odictobject.c.h OrderedDict_setdefault _parser variable static _PyArg_Parser _parser -Objects/clinic/odictobject.c.h OrderedDict_popitem _parser variable static _PyArg_Parser _parser -Objects/clinic/odictobject.c.h OrderedDict_move_to_end _parser variable static _PyArg_Parser _parser -Objects/clinic/structseq.c.h structseq_new _parser variable static _PyArg_Parser _parser -Objects/clinic/unicodeobject.c.h unicode_encode _parser variable static _PyArg_Parser _parser -Objects/clinic/unicodeobject.c.h unicode_expandtabs _parser variable static _PyArg_Parser _parser -Objects/clinic/unicodeobject.c.h unicode_split _parser variable static _PyArg_Parser _parser -Objects/clinic/unicodeobject.c.h unicode_rsplit _parser variable static _PyArg_Parser _parser -Objects/clinic/unicodeobject.c.h unicode_splitlines _parser variable static _PyArg_Parser _parser -Objects/stringlib/clinic/transmogrify.h.h stringlib_expandtabs _parser variable static _PyArg_Parser _parser -Modules/_blake2/clinic/blake2b_impl.c.h py_blake2b_new _parser variable static _PyArg_Parser _parser -Modules/_blake2/clinic/blake2s_impl.c.h py_blake2s_new _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/_iomodule.c.h _io_open _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/_iomodule.c.h _io_open_code _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/bufferedio.c.h _io_BufferedReader___init__ _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/bufferedio.c.h _io_BufferedWriter___init__ _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/bufferedio.c.h _io_BufferedRandom___init__ _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/bytesio.c.h _io_BytesIO___init__ _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/fileio.c.h _io_FileIO___init__ _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/stringio.c.h _io_StringIO___init__ _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/textio.c.h _io_IncrementalNewlineDecoder___init__ _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/textio.c.h _io_IncrementalNewlineDecoder_decode _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/textio.c.h _io_TextIOWrapper___init__ _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/textio.c.h _io_TextIOWrapper_reconfigure _parser variable static _PyArg_Parser _parser -Modules/_io/clinic/winconsoleio.c.h _io__WindowsConsoleIO___init__ _parser variable static _PyArg_Parser _parser -Modules/_multiprocessing/clinic/posixshmem.c.h _posixshmem_shm_open _parser variable static _PyArg_Parser _parser -Modules/_multiprocessing/clinic/posixshmem.c.h _posixshmem_shm_unlink _parser variable static _PyArg_Parser _parser -Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteCodec_encode _parser variable static _PyArg_Parser _parser -Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteCodec_decode _parser variable static _PyArg_Parser _parser -Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteIncrementalEncoder_encode _parser variable static _PyArg_Parser _parser -Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteIncrementalDecoder_decode _parser variable static _PyArg_Parser _parser -Modules/clinic/_asynciomodule.c.h _asyncio_Future___init__ _parser variable static _PyArg_Parser _parser -Modules/clinic/_asynciomodule.c.h _asyncio_Future_add_done_callback _parser variable static _PyArg_Parser _parser -Modules/clinic/_asynciomodule.c.h _asyncio_Task___init__ _parser variable static _PyArg_Parser _parser -Modules/clinic/_asynciomodule.c.h _asyncio_Task_current_task _parser variable static _PyArg_Parser _parser -Modules/clinic/_asynciomodule.c.h _asyncio_Task_all_tasks _parser variable static _PyArg_Parser _parser -Modules/clinic/_asynciomodule.c.h _asyncio_Task_get_stack _parser variable static _PyArg_Parser _parser -Modules/clinic/_asynciomodule.c.h _asyncio_Task_print_stack _parser variable static _PyArg_Parser _parser -Modules/clinic/_asynciomodule.c.h _asyncio__register_task _parser variable static _PyArg_Parser _parser -Modules/clinic/_asynciomodule.c.h _asyncio__unregister_task _parser variable static _PyArg_Parser _parser -Modules/clinic/_asynciomodule.c.h _asyncio__enter_task _parser variable static _PyArg_Parser _parser -Modules/clinic/_asynciomodule.c.h _asyncio__leave_task _parser variable static _PyArg_Parser _parser -Modules/clinic/_bz2module.c.h _bz2_BZ2Decompressor_decompress _parser variable static _PyArg_Parser _parser -Modules/clinic/_codecsmodule.c.h _codecs_encode _parser variable static _PyArg_Parser _parser -Modules/clinic/_codecsmodule.c.h _codecs_decode _parser variable static _PyArg_Parser _parser -Modules/clinic/_cursesmodule.c.h _curses_setupterm _parser variable static _PyArg_Parser _parser -Modules/clinic/_datetimemodule.c.h datetime_datetime_now _parser variable static _PyArg_Parser _parser -Modules/clinic/_elementtree.c.h _elementtree_Element_find _parser variable static _PyArg_Parser _parser -Modules/clinic/_elementtree.c.h _elementtree_Element_findtext _parser variable static _PyArg_Parser _parser -Modules/clinic/_elementtree.c.h _elementtree_Element_findall _parser variable static _PyArg_Parser _parser -Modules/clinic/_elementtree.c.h _elementtree_Element_iterfind _parser variable static _PyArg_Parser _parser -Modules/clinic/_elementtree.c.h _elementtree_Element_get _parser variable static _PyArg_Parser _parser -Modules/clinic/_elementtree.c.h _elementtree_Element_iter _parser variable static _PyArg_Parser _parser -Modules/clinic/_elementtree.c.h _elementtree_Element_getiterator _parser variable static _PyArg_Parser _parser -Modules/clinic/_elementtree.c.h _elementtree_TreeBuilder___init__ _parser variable static _PyArg_Parser _parser -Modules/clinic/_elementtree.c.h _elementtree_XMLParser___init__ _parser variable static _PyArg_Parser _parser -Modules/clinic/_hashopenssl.c.h EVP_new _parser variable static _PyArg_Parser _parser -Modules/clinic/_hashopenssl.c.h pbkdf2_hmac _parser variable static _PyArg_Parser _parser -Modules/clinic/_hashopenssl.c.h _hashlib_scrypt _parser variable static _PyArg_Parser _parser -Modules/clinic/_hashopenssl.c.h _hashlib_hmac_digest _parser variable static _PyArg_Parser _parser -Modules/clinic/_lzmamodule.c.h _lzma_LZMADecompressor_decompress _parser variable static _PyArg_Parser _parser -Modules/clinic/_lzmamodule.c.h _lzma_LZMADecompressor___init__ _parser variable static _PyArg_Parser _parser -Modules/clinic/_opcode.c.h _opcode_stack_effect _parser variable static _PyArg_Parser _parser -Modules/clinic/_pickle.c.h _pickle_Pickler___init__ _parser variable static _PyArg_Parser _parser -Modules/clinic/_pickle.c.h _pickle_Unpickler___init__ _parser variable static _PyArg_Parser _parser -Modules/clinic/_pickle.c.h _pickle_dump _parser variable static _PyArg_Parser _parser -Modules/clinic/_pickle.c.h _pickle_dumps _parser variable static _PyArg_Parser _parser -Modules/clinic/_pickle.c.h _pickle_load _parser variable static _PyArg_Parser _parser -Modules/clinic/_pickle.c.h _pickle_loads _parser variable static _PyArg_Parser _parser -Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_put _parser variable static _PyArg_Parser _parser -Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_put_nowait _parser variable static _PyArg_Parser _parser -Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_get _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Pattern_match _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Pattern_fullmatch _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Pattern_search _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Pattern_findall _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Pattern_finditer _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Pattern_scanner _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Pattern_split _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Pattern_sub _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Pattern_subn _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_compile _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Match_expand _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Match_groups _parser variable static _PyArg_Parser _parser -Modules/clinic/_sre.c.h _sre_SRE_Match_groupdict _parser variable static _PyArg_Parser _parser -Modules/clinic/_ssl.c.h _ssl__SSLSocket_get_channel_binding _parser variable static _PyArg_Parser _parser -Modules/clinic/_ssl.c.h _ssl__SSLContext_load_cert_chain _parser variable static _PyArg_Parser _parser -Modules/clinic/_ssl.c.h _ssl__SSLContext_load_verify_locations _parser variable static _PyArg_Parser _parser -Modules/clinic/_ssl.c.h _ssl__SSLContext__wrap_socket _parser variable static _PyArg_Parser _parser -Modules/clinic/_ssl.c.h _ssl__SSLContext__wrap_bio _parser variable static _PyArg_Parser _parser -Modules/clinic/_ssl.c.h _ssl__SSLContext_get_ca_certs _parser variable static _PyArg_Parser _parser -Modules/clinic/_ssl.c.h _ssl_txt2obj _parser variable static _PyArg_Parser _parser -Modules/clinic/_ssl.c.h _ssl_enum_certificates _parser variable static _PyArg_Parser _parser -Modules/clinic/_ssl.c.h _ssl_enum_crls _parser variable static _PyArg_Parser _parser -Modules/clinic/_struct.c.h Struct___init__ _parser variable static _PyArg_Parser _parser -Modules/clinic/_struct.c.h Struct_unpack_from _parser variable static _PyArg_Parser _parser -Modules/clinic/_struct.c.h unpack_from _parser variable static _PyArg_Parser _parser -Modules/clinic/_winapi.c.h _winapi_ConnectNamedPipe _parser variable static _PyArg_Parser _parser -Modules/clinic/_winapi.c.h _winapi_ReadFile _parser variable static _PyArg_Parser _parser -Modules/clinic/_winapi.c.h _winapi_WriteFile _parser variable static _PyArg_Parser _parser -Modules/clinic/_winapi.c.h _winapi_GetFileType _parser variable static _PyArg_Parser _parser -Modules/clinic/binascii.c.h binascii_b2a_uu _parser variable static _PyArg_Parser _parser -Modules/clinic/binascii.c.h binascii_b2a_base64 _parser variable static _PyArg_Parser _parser -Modules/clinic/binascii.c.h binascii_b2a_hex _parser variable static _PyArg_Parser _parser -Modules/clinic/binascii.c.h binascii_hexlify _parser variable static _PyArg_Parser _parser -Modules/clinic/binascii.c.h binascii_a2b_qp _parser variable static _PyArg_Parser _parser -Modules/clinic/binascii.c.h binascii_b2a_qp _parser variable static _PyArg_Parser _parser -Modules/clinic/cmathmodule.c.h cmath_isclose _parser variable static _PyArg_Parser _parser -Modules/clinic/gcmodule.c.h gc_collect _parser variable static _PyArg_Parser _parser -Modules/clinic/gcmodule.c.h gc_get_objects _parser variable static _PyArg_Parser _parser -Modules/clinic/grpmodule.c.h grp_getgrgid _parser variable static _PyArg_Parser _parser -Modules/clinic/grpmodule.c.h grp_getgrnam _parser variable static _PyArg_Parser _parser -Modules/_functoolsmodule.c - partial_getsetlist variable static PyGetSetDef partial_getsetlist[] -Modules/_functoolsmodule.c - partial_memberlist variable static PyMemberDef partial_memberlist[] -Modules/_functoolsmodule.c - partial_methods variable static PyMethodDef partial_methods -Modules/_functoolsmodule.c - partial_type variable static PyTypeObject partial_type -Python/Python-ast.c - Pass_type variable static PyTypeObject *Pass_type -Modules/_sre.c - pattern_getset variable static PyGetSetDef pattern_getset[] -Modules/_sre.c - pattern_members variable static PyMemberDef pattern_members[] -Modules/_sre.c - pattern_methods variable static PyMethodDef pattern_methods -Modules/_sre.c - Pattern_Type variable static PyTypeObject Pattern_Type -Modules/itertoolsmodule.c - permuations_methods variable static PyMethodDef permuations_methods -Modules/itertoolsmodule.c - permutations_type variable static PyTypeObject permutations_type -Objects/picklebufobject.c - picklebuf_as_buffer variable static PyBufferProcs picklebuf_as_buffer -Objects/picklebufobject.c - picklebuf_methods variable static PyMethodDef picklebuf_methods -Python/dtoa.c - pmem_next variable static double *pmem_next -Objects/typeobject.c resolve_slotdups pname variable static PyObject *pname -Modules/posixmodule.c - posix_constants_confstr variable static struct constdef posix_constants_confstr[] -Modules/posixmodule.c - posix_constants_pathconf variable static struct constdef posix_constants_pathconf[] -Modules/posixmodule.c - posix_constants_sysconf variable static struct constdef posix_constants_sysconf[] -Modules/posixmodule.c - posix_methods variable static PyMethodDef posix_methods -Modules/posixmodule.c - posixmodule variable static struct PyModuleDef posixmodule -Modules/posixmodule.c - posix_putenv_garbage variable static PyObject *posix_putenv_garbage -Python/Python-ast.c - Pow_singleton variable static PyObject *Pow_singleton -Python/Python-ast.c - Pow_type variable static PyTypeObject *Pow_type -Python/sysmodule.c - _preinit_warnoptions variable static _Py_PreInitEntry _preinit_warnoptions -Python/sysmodule.c - _preinit_xoptions variable static _Py_PreInitEntry _preinit_xoptions -Objects/exceptions.c _check_for_legacy_statements print_prefix variable static PyObject *print_prefix -Python/dtoa.c - private_mem variable static double private_mem[PRIVATE_mem] -Modules/itertoolsmodule.c - product_methods variable static PyMethodDef product_methods -Modules/itertoolsmodule.c - product_type variable static PyTypeObject product_type -Objects/descrobject.c - property_getsetlist variable static PyGetSetDef property_getsetlist[] -Objects/descrobject.c - property_members variable static PyMemberDef property_members[] -Objects/descrobject.c - property_methods variable static PyMethodDef property_methods -Objects/weakrefobject.c - proxy_as_mapping variable static PyMappingMethods proxy_as_mapping -Objects/weakrefobject.c - proxy_as_number variable static PyNumberMethods proxy_as_number -Objects/weakrefobject.c - proxy_as_sequence variable static PySequenceMethods proxy_as_sequence -Objects/weakrefobject.c - proxy_methods variable static PyMethodDef proxy_methods -Objects/typeobject.c resolve_slotdups ptrs variable static slotdef *ptrs[MAX_EQUIV] -Modules/pwdmodule.c - pwd_methods variable static PyMethodDef pwd_methods -Modules/pwdmodule.c - pwdmodule variable static struct PyModuleDef pwdmodule -Objects/obmalloc.c - _Py_AllocatedBlocks variable static Py_ssize_t _Py_AllocatedBlocks -Objects/genobject.c - _PyAsyncGenASend_Type variable PyTypeObject _PyAsyncGenASend_Type -Objects/genobject.c - _PyAsyncGenAThrow_Type variable PyTypeObject _PyAsyncGenAThrow_Type -Objects/genobject.c - PyAsyncGen_Type variable PyTypeObject PyAsyncGen_Type -Objects/genobject.c - _PyAsyncGenWrappedValue_Type variable PyTypeObject _PyAsyncGenWrappedValue_Type -Objects/typeobject.c - PyBaseObject_Type variable PyTypeObject PyBaseObject_Type -Modules/_blake2/blake2b_impl.c - PyBlake2_BLAKE2bType variable PyTypeObject PyBlake2_BLAKE2bType -Modules/_blake2/blake2s_impl.c - PyBlake2_BLAKE2sType variable PyTypeObject PyBlake2_BLAKE2sType -Objects/boolobject.c - PyBool_Type variable PyTypeObject PyBool_Type -Modules/_io/bufferedio.c - PyBufferedIOBase_Type variable PyTypeObject PyBufferedIOBase_Type -Modules/_io/bufferedio.c - PyBufferedRandom_Type variable PyTypeObject PyBufferedRandom_Type -Modules/_io/bufferedio.c - PyBufferedReader_Type variable PyTypeObject PyBufferedReader_Type -Modules/_io/bufferedio.c - PyBufferedRWPair_Type variable PyTypeObject PyBufferedRWPair_Type -Modules/_io/bufferedio.c - PyBufferedWriter_Type variable PyTypeObject PyBufferedWriter_Type -Objects/bytearrayobject.c - _PyByteArray_empty_string variable char _PyByteArray_empty_string[] -Objects/bytearrayobject.c - PyByteArrayIter_Type variable PyTypeObject PyByteArrayIter_Type -Objects/bytearrayobject.c - PyByteArray_Type variable PyTypeObject PyByteArray_Type -Modules/_io/bytesio.c - _PyBytesIOBuffer_Type variable PyTypeObject _PyBytesIOBuffer_Type -Modules/_io/bytesio.c - PyBytesIO_Type variable PyTypeObject PyBytesIO_Type -Objects/bytesobject.c - PyBytesIter_Type variable PyTypeObject PyBytesIter_Type -Objects/bytesobject.c - PyBytes_Type variable PyTypeObject PyBytes_Type -Python/initconfig.c - Py_BytesWarningFlag variable int Py_BytesWarningFlag -Objects/iterobject.c - PyCallIter_Type variable PyTypeObject PyCallIter_Type -Objects/capsule.c - PyCapsule_Type variable PyTypeObject PyCapsule_Type -Objects/cellobject.c - PyCell_Type variable PyTypeObject PyCell_Type -Objects/methodobject.c - PyCFunction_Type variable PyTypeObject PyCFunction_Type -Objects/descrobject.c - PyClassMethodDescr_Type variable PyTypeObject PyClassMethodDescr_Type -Objects/funcobject.c - PyClassMethod_Type variable PyTypeObject PyClassMethod_Type -Objects/codeobject.c - PyCode_Type variable PyTypeObject PyCode_Type -Objects/complexobject.c - PyComplex_Type variable PyTypeObject PyComplex_Type -Python/context.c - PyContext_as_mapping variable static PyMappingMethods PyContext_as_mapping -Python/context.c - PyContext_as_sequence variable static PySequenceMethods PyContext_as_sequence -Python/context.c - PyContext_methods variable static PyMethodDef PyContext_methods -Python/context.c - PyContextTokenMissing_Type variable PyTypeObject PyContextTokenMissing_Type -Python/context.c - PyContextToken_Type variable PyTypeObject PyContextToken_Type -Python/context.c - PyContextTokenType_getsetlist variable static PyGetSetDef PyContextTokenType_getsetlist[] -Python/context.c - PyContext_Type variable PyTypeObject PyContext_Type -Python/context.c - PyContextVar_members variable static PyMemberDef PyContextVar_members[] -Python/context.c - PyContextVar_methods variable static PyMethodDef PyContextVar_methods -Python/context.c - PyContextVar_Type variable PyTypeObject PyContextVar_Type -Objects/genobject.c - PyCoro_Type variable PyTypeObject PyCoro_Type -Objects/genobject.c - _PyCoroWrapper_Type variable PyTypeObject _PyCoroWrapper_Type -Python/initconfig.c - Py_DebugFlag variable int Py_DebugFlag -Objects/dictobject.c - pydict_global_version variable static uint64_t pydict_global_version -Objects/dictobject.c - PyDictItems_Type variable PyTypeObject PyDictItems_Type -Objects/dictobject.c - PyDictIterItem_Type variable PyTypeObject PyDictIterItem_Type -Objects/dictobject.c - PyDictIterKey_Type variable PyTypeObject PyDictIterKey_Type -Objects/dictobject.c - PyDictIterValue_Type variable PyTypeObject PyDictIterValue_Type -Objects/dictobject.c - PyDictKeys_Type variable PyTypeObject PyDictKeys_Type -Objects/descrobject.c - PyDictProxy_Type variable PyTypeObject PyDictProxy_Type -Objects/dictobject.c - PyDictRevIterItem_Type variable PyTypeObject PyDictRevIterItem_Type -Objects/dictobject.c - PyDictRevIterKey_Type variable PyTypeObject PyDictRevIterKey_Type -Objects/dictobject.c - PyDictRevIterValue_Type variable PyTypeObject PyDictRevIterValue_Type -Objects/dictobject.c - PyDict_Type variable PyTypeObject PyDict_Type -Objects/dictobject.c - PyDictValues_Type variable PyTypeObject PyDictValues_Type -Python/initconfig.c - Py_DontWriteBytecodeFlag variable int Py_DontWriteBytecodeFlag -Objects/sliceobject.c - _Py_EllipsisObject variable PyObject _Py_EllipsisObject -Objects/sliceobject.c - PyEllipsis_Type variable PyTypeObject PyEllipsis_Type -Objects/enumobject.c - PyEnum_Type variable PyTypeObject PyEnum_Type -Objects/exceptions.c - _PyExc_ArithmeticError variable static PyTypeObject _PyExc_ArithmeticError -Objects/exceptions.c - PyExc_ArithmeticError variable static PyTypeObject PyExc_ArithmeticError -Objects/exceptions.c - _PyExc_AssertionError variable static PyTypeObject _PyExc_AssertionError -Objects/exceptions.c - PyExc_AssertionError variable static PyTypeObject PyExc_AssertionError -Objects/exceptions.c - _PyExc_AttributeError variable static PyTypeObject _PyExc_AttributeError -Objects/exceptions.c - PyExc_AttributeError variable static PyTypeObject PyExc_AttributeError -Objects/exceptions.c - _PyExc_BaseException variable static PyTypeObject _PyExc_BaseException -Objects/exceptions.c - PyExc_BaseException variable static PyTypeObject PyExc_BaseException -Objects/exceptions.c - _PyExc_BlockingIOError variable static PyTypeObject _PyExc_BlockingIOError -Objects/exceptions.c - PyExc_BlockingIOError variable static PyTypeObject PyExc_BlockingIOError -Objects/exceptions.c - _PyExc_BrokenPipeError variable static PyTypeObject _PyExc_BrokenPipeError -Objects/exceptions.c - PyExc_BrokenPipeError variable static PyTypeObject PyExc_BrokenPipeError -Objects/exceptions.c - _PyExc_BufferError variable static PyTypeObject _PyExc_BufferError -Objects/exceptions.c - PyExc_BufferError variable static PyTypeObject PyExc_BufferError -Objects/exceptions.c - _PyExc_BytesWarning variable static PyTypeObject _PyExc_BytesWarning -Objects/exceptions.c - PyExc_BytesWarning variable static PyTypeObject PyExc_BytesWarning -Objects/exceptions.c - _PyExc_ChildProcessError variable static PyTypeObject _PyExc_ChildProcessError -Objects/exceptions.c - PyExc_ChildProcessError variable static PyTypeObject PyExc_ChildProcessError -Objects/exceptions.c - _PyExc_ConnectionAbortedError variable static PyTypeObject _PyExc_ConnectionAbortedError -Objects/exceptions.c - PyExc_ConnectionAbortedError variable static PyTypeObject PyExc_ConnectionAbortedError -Objects/exceptions.c - _PyExc_ConnectionError variable static PyTypeObject _PyExc_ConnectionError -Objects/exceptions.c - PyExc_ConnectionError variable static PyTypeObject PyExc_ConnectionError -Objects/exceptions.c - _PyExc_ConnectionRefusedError variable static PyTypeObject _PyExc_ConnectionRefusedError -Objects/exceptions.c - PyExc_ConnectionRefusedError variable static PyTypeObject PyExc_ConnectionRefusedError -Objects/exceptions.c - _PyExc_ConnectionResetError variable static PyTypeObject _PyExc_ConnectionResetError -Objects/exceptions.c - PyExc_ConnectionResetError variable static PyTypeObject PyExc_ConnectionResetError -Objects/exceptions.c - _PyExc_DeprecationWarning variable static PyTypeObject _PyExc_DeprecationWarning -Objects/exceptions.c - PyExc_DeprecationWarning variable static PyTypeObject PyExc_DeprecationWarning -Objects/exceptions.c - PyExc_EnvironmentError variable static PyTypeObject PyExc_EnvironmentError -Objects/exceptions.c - _PyExc_EOFError variable static PyTypeObject _PyExc_EOFError -Objects/exceptions.c - PyExc_EOFError variable static PyTypeObject PyExc_EOFError -Objects/exceptions.c - _PyExc_Exception variable static PyTypeObject _PyExc_Exception -Objects/exceptions.c - PyExc_Exception variable static PyTypeObject PyExc_Exception -Objects/exceptions.c - _PyExc_FileExistsError variable static PyTypeObject _PyExc_FileExistsError -Objects/exceptions.c - PyExc_FileExistsError variable static PyTypeObject PyExc_FileExistsError -Objects/exceptions.c - _PyExc_FileNotFoundError variable static PyTypeObject _PyExc_FileNotFoundError -Objects/exceptions.c - PyExc_FileNotFoundError variable static PyTypeObject PyExc_FileNotFoundError -Objects/exceptions.c - _PyExc_FloatingPointError variable static PyTypeObject _PyExc_FloatingPointError -Objects/exceptions.c - PyExc_FloatingPointError variable static PyTypeObject PyExc_FloatingPointError -Objects/exceptions.c - _PyExc_FutureWarning variable static PyTypeObject _PyExc_FutureWarning -Objects/exceptions.c - PyExc_FutureWarning variable static PyTypeObject PyExc_FutureWarning -Objects/exceptions.c - _PyExc_GeneratorExit variable static PyTypeObject _PyExc_GeneratorExit -Objects/exceptions.c - PyExc_GeneratorExit variable static PyTypeObject PyExc_GeneratorExit -Objects/exceptions.c - _PyExc_ImportError variable static PyTypeObject _PyExc_ImportError -Objects/exceptions.c - PyExc_ImportError variable static PyTypeObject PyExc_ImportError -Objects/exceptions.c - _PyExc_ImportWarning variable static PyTypeObject _PyExc_ImportWarning -Objects/exceptions.c - PyExc_ImportWarning variable static PyTypeObject PyExc_ImportWarning -Objects/exceptions.c - _PyExc_IndentationError variable static PyTypeObject _PyExc_IndentationError -Objects/exceptions.c - PyExc_IndentationError variable static PyTypeObject PyExc_IndentationError -Objects/exceptions.c - _PyExc_IndexError variable static PyTypeObject _PyExc_IndexError -Objects/exceptions.c - PyExc_IndexError variable static PyTypeObject PyExc_IndexError -Objects/exceptions.c - _PyExc_InterruptedError variable static PyTypeObject _PyExc_InterruptedError -Objects/exceptions.c - PyExc_InterruptedError variable static PyTypeObject PyExc_InterruptedError -Objects/exceptions.c - PyExc_IOError variable static PyTypeObject PyExc_IOError -Objects/exceptions.c - _PyExc_IsADirectoryError variable static PyTypeObject _PyExc_IsADirectoryError -Objects/exceptions.c - PyExc_IsADirectoryError variable static PyTypeObject PyExc_IsADirectoryError -Objects/exceptions.c - _PyExc_KeyboardInterrupt variable static PyTypeObject _PyExc_KeyboardInterrupt -Objects/exceptions.c - PyExc_KeyboardInterrupt variable static PyTypeObject PyExc_KeyboardInterrupt -Objects/exceptions.c - _PyExc_KeyError variable static PyTypeObject _PyExc_KeyError -Objects/exceptions.c - PyExc_KeyError variable static PyTypeObject PyExc_KeyError -Objects/exceptions.c - _PyExc_LookupError variable static PyTypeObject _PyExc_LookupError -Objects/exceptions.c - PyExc_LookupError variable static PyTypeObject PyExc_LookupError -Objects/exceptions.c - _PyExc_MemoryError variable static PyTypeObject _PyExc_MemoryError -Objects/exceptions.c - PyExc_MemoryError variable static PyTypeObject PyExc_MemoryError -Objects/exceptions.c - _PyExc_ModuleNotFoundError variable static PyTypeObject _PyExc_ModuleNotFoundError -Objects/exceptions.c - PyExc_ModuleNotFoundError variable static PyTypeObject PyExc_ModuleNotFoundError -Objects/exceptions.c - _PyExc_NameError variable static PyTypeObject _PyExc_NameError -Objects/exceptions.c - PyExc_NameError variable static PyTypeObject PyExc_NameError -Objects/exceptions.c - _PyExc_NotADirectoryError variable static PyTypeObject _PyExc_NotADirectoryError -Objects/exceptions.c - PyExc_NotADirectoryError variable static PyTypeObject PyExc_NotADirectoryError -Objects/exceptions.c - _PyExc_NotImplementedError variable static PyTypeObject _PyExc_NotImplementedError -Objects/exceptions.c - PyExc_NotImplementedError variable static PyTypeObject PyExc_NotImplementedError -Objects/exceptions.c - _PyExc_OSError variable static PyTypeObject _PyExc_OSError -Objects/exceptions.c - PyExc_OSError variable static PyTypeObject PyExc_OSError -Objects/exceptions.c - _PyExc_OverflowError variable static PyTypeObject _PyExc_OverflowError -Objects/exceptions.c - PyExc_OverflowError variable static PyTypeObject PyExc_OverflowError -Objects/exceptions.c - _PyExc_PendingDeprecationWarning variable static PyTypeObject _PyExc_PendingDeprecationWarning -Objects/exceptions.c - PyExc_PendingDeprecationWarning variable static PyTypeObject PyExc_PendingDeprecationWarning -Objects/exceptions.c - _PyExc_PermissionError variable static PyTypeObject _PyExc_PermissionError -Objects/exceptions.c - PyExc_PermissionError variable static PyTypeObject PyExc_PermissionError -Objects/exceptions.c - _PyExc_ProcessLookupError variable static PyTypeObject _PyExc_ProcessLookupError -Objects/exceptions.c - PyExc_ProcessLookupError variable static PyTypeObject PyExc_ProcessLookupError -Objects/exceptions.c - _PyExc_RecursionError variable static PyTypeObject _PyExc_RecursionError -Objects/exceptions.c - PyExc_RecursionError variable static PyTypeObject PyExc_RecursionError -Objects/exceptions.c - _PyExc_ReferenceError variable static PyTypeObject _PyExc_ReferenceError -Objects/exceptions.c - PyExc_ReferenceError variable static PyTypeObject PyExc_ReferenceError -Objects/exceptions.c - _PyExc_ResourceWarning variable static PyTypeObject _PyExc_ResourceWarning -Objects/exceptions.c - PyExc_ResourceWarning variable static PyTypeObject PyExc_ResourceWarning -Objects/exceptions.c - _PyExc_RuntimeError variable static PyTypeObject _PyExc_RuntimeError -Objects/exceptions.c - PyExc_RuntimeError variable static PyTypeObject PyExc_RuntimeError -Objects/exceptions.c - _PyExc_RuntimeWarning variable static PyTypeObject _PyExc_RuntimeWarning -Objects/exceptions.c - PyExc_RuntimeWarning variable static PyTypeObject PyExc_RuntimeWarning -Objects/exceptions.c - _PyExc_StopAsyncIteration variable static PyTypeObject _PyExc_StopAsyncIteration -Objects/exceptions.c - PyExc_StopAsyncIteration variable static PyTypeObject PyExc_StopAsyncIteration -Objects/exceptions.c - _PyExc_StopIteration variable static PyTypeObject _PyExc_StopIteration -Objects/exceptions.c - PyExc_StopIteration variable static PyTypeObject PyExc_StopIteration -Objects/exceptions.c - _PyExc_SyntaxError variable static PyTypeObject _PyExc_SyntaxError -Objects/exceptions.c - PyExc_SyntaxError variable static PyTypeObject PyExc_SyntaxError -Objects/exceptions.c - _PyExc_SyntaxWarning variable static PyTypeObject _PyExc_SyntaxWarning -Objects/exceptions.c - PyExc_SyntaxWarning variable static PyTypeObject PyExc_SyntaxWarning -Objects/exceptions.c - _PyExc_SystemError variable static PyTypeObject _PyExc_SystemError -Objects/exceptions.c - PyExc_SystemError variable static PyTypeObject PyExc_SystemError -Objects/exceptions.c - _PyExc_SystemExit variable static PyTypeObject _PyExc_SystemExit -Objects/exceptions.c - PyExc_SystemExit variable static PyTypeObject PyExc_SystemExit -Objects/exceptions.c - _PyExc_TabError variable static PyTypeObject _PyExc_TabError -Objects/exceptions.c - PyExc_TabError variable static PyTypeObject PyExc_TabError -Objects/exceptions.c - _PyExc_TargetScopeError variable static PyTypeObject _PyExc_TargetScopeError -Objects/exceptions.c - PyExc_TargetScopeError variable static PyTypeObject PyExc_TargetScopeError -Objects/exceptions.c - _PyExc_TimeoutError variable static PyTypeObject _PyExc_TimeoutError -Objects/exceptions.c - PyExc_TimeoutError variable static PyTypeObject PyExc_TimeoutError -Objects/exceptions.c - _PyExc_TypeError variable static PyTypeObject _PyExc_TypeError -Objects/exceptions.c - PyExc_TypeError variable static PyTypeObject PyExc_TypeError -Objects/exceptions.c - _PyExc_UnboundLocalError variable static PyTypeObject _PyExc_UnboundLocalError -Objects/exceptions.c - PyExc_UnboundLocalError variable static PyTypeObject PyExc_UnboundLocalError -Objects/exceptions.c - _PyExc_UnicodeDecodeError variable static PyTypeObject _PyExc_UnicodeDecodeError -Objects/exceptions.c - PyExc_UnicodeDecodeError variable static PyTypeObject PyExc_UnicodeDecodeError -Objects/exceptions.c - _PyExc_UnicodeEncodeError variable static PyTypeObject _PyExc_UnicodeEncodeError -Objects/exceptions.c - PyExc_UnicodeEncodeError variable static PyTypeObject PyExc_UnicodeEncodeError -Objects/exceptions.c - _PyExc_UnicodeError variable static PyTypeObject _PyExc_UnicodeError -Objects/exceptions.c - PyExc_UnicodeError variable static PyTypeObject PyExc_UnicodeError -Objects/exceptions.c - _PyExc_UnicodeTranslateError variable static PyTypeObject _PyExc_UnicodeTranslateError -Objects/exceptions.c - PyExc_UnicodeTranslateError variable static PyTypeObject PyExc_UnicodeTranslateError -Objects/exceptions.c - _PyExc_UnicodeWarning variable static PyTypeObject _PyExc_UnicodeWarning -Objects/exceptions.c - PyExc_UnicodeWarning variable static PyTypeObject PyExc_UnicodeWarning -Objects/exceptions.c - _PyExc_UserWarning variable static PyTypeObject _PyExc_UserWarning -Objects/exceptions.c - PyExc_UserWarning variable static PyTypeObject PyExc_UserWarning -Objects/exceptions.c - _PyExc_ValueError variable static PyTypeObject _PyExc_ValueError -Objects/exceptions.c - PyExc_ValueError variable static PyTypeObject PyExc_ValueError -Objects/exceptions.c - _PyExc_Warning variable static PyTypeObject _PyExc_Warning -Objects/exceptions.c - PyExc_Warning variable static PyTypeObject PyExc_Warning -Objects/exceptions.c - _PyExc_ZeroDivisionError variable static PyTypeObject _PyExc_ZeroDivisionError -Objects/exceptions.c - PyExc_ZeroDivisionError variable static PyTypeObject PyExc_ZeroDivisionError -Objects/boolobject.c - _Py_FalseStruct variable static struct _longobject _Py_FalseStruct -Objects/tupleobject.c - _Py_fast_tuple_allocs variable Py_ssize_t _Py_fast_tuple_allocs -Objects/stringlib/unicode_format.h - PyFieldNameIter_Type variable static PyTypeObject PyFieldNameIter_Type -Modules/_io/fileio.c - PyFileIO_Type variable PyTypeObject PyFileIO_Type -Python/preconfig.c - Py_FileSystemDefaultEncodeErrors variable const char *Py_FileSystemDefaultEncodeErrors -Python/preconfig.c - Py_FileSystemDefaultEncoding variable const char * Py_FileSystemDefaultEncoding -Python/bltinmodule.c - PyFilter_Type variable PyTypeObject PyFilter_Type -Objects/floatobject.c - PyFloat_Type variable PyTypeObject PyFloat_Type -Objects/stringlib/unicode_format.h - PyFormatterIter_Type variable static PyTypeObject PyFormatterIter_Type -Objects/frameobject.c - PyFrame_Type variable PyTypeObject PyFrame_Type -Python/initconfig.c - Py_FrozenFlag variable int Py_FrozenFlag -Objects/setobject.c - PyFrozenSet_Type variable PyTypeObject PyFrozenSet_Type -Objects/funcobject.c - PyFunction_Type variable PyTypeObject PyFunction_Type -Objects/genobject.c - PyGen_Type variable PyTypeObject PyGen_Type -Objects/descrobject.c - PyGetSetDescr_Type variable PyTypeObject PyGetSetDescr_Type -Python/hamt.c - _PyHamt_ArrayNode_Type variable PyTypeObject _PyHamt_ArrayNode_Type -Python/hamt.c - PyHamt_as_mapping variable static PyMappingMethods PyHamt_as_mapping -Python/hamt.c - PyHamt_as_sequence variable static PySequenceMethods PyHamt_as_sequence -Python/hamt.c - _PyHamt_BitmapNode_Type variable PyTypeObject _PyHamt_BitmapNode_Type -Python/hamt.c - _PyHamt_CollisionNode_Type variable PyTypeObject _PyHamt_CollisionNode_Type -Python/hamt.c - _PyHamtItems_Type variable PyTypeObject _PyHamtItems_Type -Python/hamt.c - PyHamtIterator_as_mapping variable static PyMappingMethods PyHamtIterator_as_mapping -Python/hamt.c - _PyHamtKeys_Type variable PyTypeObject _PyHamtKeys_Type -Python/hamt.c - PyHamt_methods variable static PyMethodDef PyHamt_methods -Python/hamt.c - _PyHamt_Type variable PyTypeObject _PyHamt_Type -Python/hamt.c - _PyHamtValues_Type variable PyTypeObject _PyHamtValues_Type -Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors variable const(int) _Py_HasFileSystemDefaultEncodeErrors -Python/preconfig.c - Py_HasFileSystemDefaultEncoding variable const(int) Py_HasFileSystemDefaultEncoding -Python/pyhash.c - PyHash_Func variable static PyHash_FuncDef PyHash_Func -Python/initconfig.c - Py_HashRandomizationFlag variable int Py_HashRandomizationFlag -Python/pyhash.c - _Py_HashSecret variable _Py_HashSecret_t _Py_HashSecret -Python/bootstrap_hash.c - _Py_HashSecret_Initialized variable static int _Py_HashSecret_Initialized -Python/codecs.c - Py_hexdigits variable const char * Py_hexdigits -Python/sysmodule.c - PyId__ variable _Py_IDENTIFIER(_) -Modules/_abc.c - PyId__abc_impl variable _Py_IDENTIFIER(_abc_impl) -Objects/typeobject.c - PyId___abstractmethods__ variable _Py_IDENTIFIER(__abstractmethods__) -Modules/_abc.c - PyId___abstractmethods__ variable _Py_IDENTIFIER(__abstractmethods__) -Python/ceval.c _PyEval_EvalFrameDefault PyId___aenter__ variable _Py_IDENTIFIER(__aenter__) -Python/ceval.c _PyEval_EvalFrameDefault PyId___aexit__ variable _Py_IDENTIFIER(__aexit__) -Objects/typeobject.c slot_am_aiter PyId___aiter__ variable _Py_IDENTIFIER(__aiter__) -Python/ceval.c import_all_from PyId___all__ variable _Py_IDENTIFIER(__all__) -Objects/typeobject.c slot_am_anext PyId___anext__ variable _Py_IDENTIFIER(__anext__) -Python/Python-ast.c - PyId_annotation variable _Py_IDENTIFIER(annotation) -Python/ceval.c _PyEval_EvalFrameDefault PyId___annotations__ variable _Py_IDENTIFIER(__annotations__) -Python/Python-ast.c - PyId_arg variable _Py_IDENTIFIER(arg) -Python/Python-ast.c - PyId_args variable _Py_IDENTIFIER(args) -Python/Python-ast.c - PyId_argtypes variable _Py_IDENTIFIER(argtypes) -Python/Python-ast.c - PyId_asname variable _Py_IDENTIFIER(asname) -Python/Python-ast.c make_type PyId__ast variable _Py_IDENTIFIER(_ast) -Python/Python-ast.c - PyId_attr variable _Py_IDENTIFIER(attr) -Python/Python-ast.c - PyId__attributes variable _Py_IDENTIFIER(_attributes) -Objects/typeobject.c slot_am_await PyId___await__ variable _Py_IDENTIFIER(__await__) -Python/Python-ast.c - PyId_bases variable _Py_IDENTIFIER(bases) -Modules/_abc.c - PyId___bases__ variable _Py_IDENTIFIER(__bases__) -Objects/abstract.c abstract_get_bases PyId___bases__ variable _Py_IDENTIFIER(__bases__) -Objects/typeobject.c merge_class_dict PyId___bases__ variable _Py_IDENTIFIER(__bases__) -Objects/longobject.c - PyId_big variable _Py_IDENTIFIER(big) -Modules/_io/_iomodule.c _io_open_impl PyId__blksize variable _Py_IDENTIFIER(_blksize) -Python/Python-ast.c - PyId_body variable _Py_IDENTIFIER(body) -Objects/typeobject.c slot_nb_bool PyId___bool__ variable _Py_IDENTIFIER(__bool__) -Python/sysmodule.c - PyId_buffer variable _Py_IDENTIFIER(buffer) -Python/ceval.c _PyEval_EvalFrameDefault PyId___build_class__ variable _Py_IDENTIFIER(__build_class__) -Objects/typeobject.c - PyId_builtins variable _Py_IDENTIFIER(builtins) -Python/errors.c - PyId_builtins variable _Py_IDENTIFIER(builtins) -Python/pythonrun.c - PyId_builtins variable _Py_IDENTIFIER(builtins) -Python/sysmodule.c - PyId_builtins variable _Py_IDENTIFIER(builtins) -Objects/frameobject.c - PyId___builtins__ variable _Py_IDENTIFIER(__builtins__) -Python/bltinmodule.c - PyId___builtins__ variable _Py_IDENTIFIER(__builtins__) -Python/import.c module_dict_for_exec PyId___builtins__ variable _Py_IDENTIFIER(__builtins__) -Objects/object.c - PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) -Objects/bytesobject.c format_obj PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) -Objects/bytesobject.c bytes_new PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) -Objects/weakrefobject.c proxy_bytes PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) -Objects/typeobject.c slot_tp_call PyId___call__ variable _Py_IDENTIFIER(__call__) -Python/Python-ast.c - PyId_cause variable _Py_IDENTIFIER(cause) -Objects/typeobject.c - PyId___class__ variable _Py_IDENTIFIER(__class__) -Modules/_abc.c - PyId___class__ variable _Py_IDENTIFIER(__class__) -Python/compile.c compiler_enter_scope PyId___class__ variable _Py_IDENTIFIER(__class__) -Objects/abstract.c recursive_isinstance PyId___class__ variable _Py_IDENTIFIER(__class__) -Objects/typeobject.c type_new PyId___classcell__ variable _Py_IDENTIFIER(__classcell__) -Objects/typeobject.c - PyId___class_getitem__ variable _Py_IDENTIFIER(__class_getitem__) -Objects/abstract.c PyObject_GetItem PyId___class_getitem__ variable _Py_IDENTIFIER(__class_getitem__) -Python/import.c PyImport_Cleanup PyId_clear variable _Py_IDENTIFIER(clear) -Python/traceback.c - PyId_close variable _Py_IDENTIFIER(close) -Modules/_io/bufferedio.c - PyId_close variable _Py_IDENTIFIER(close) -Modules/_io/textio.c - PyId_close variable _Py_IDENTIFIER(close) -Objects/genobject.c gen_close_iter PyId_close variable _Py_IDENTIFIER(close) -Modules/_dbmmodule.c dbm__exit__ PyId_close variable _Py_IDENTIFIER(close) -Modules/_gdbmmodule.c dbm__exit__ PyId_close variable _Py_IDENTIFIER(close) -Python/pythonrun.c _Py_HandleSystemExit PyId_code variable _Py_IDENTIFIER(code) -Python/Python-ast.c - PyId_col_offset variable _Py_IDENTIFIER(col_offset) -Python/Python-ast.c - PyId_comparators variable _Py_IDENTIFIER(comparators) -Objects/complexobject.c try_complex_special_method PyId___complex__ variable _Py_IDENTIFIER(__complex__) -Objects/typeobject.c slot_sq_contains PyId___contains__ variable _Py_IDENTIFIER(__contains__) -Python/Python-ast.c - PyId_context_expr variable _Py_IDENTIFIER(context_expr) -Python/Python-ast.c - PyId_conversion variable _Py_IDENTIFIER(conversion) -Modules/itertoolsmodule.c itertools_tee_impl PyId___copy__ variable _Py_IDENTIFIER(__copy__) -Objects/descrobject.c mappingproxy_copy PyId_copy variable _Py_IDENTIFIER(copy) -Objects/typeobject.c import_copyreg PyId_copyreg variable _Py_IDENTIFIER(copyreg) -Python/Python-ast.c - PyId_ctx variable _Py_IDENTIFIER(ctx) -Modules/_io/bufferedio.c - PyId__dealloc_warn variable _Py_IDENTIFIER(_dealloc_warn) -Modules/_io/textio.c - PyId__dealloc_warn variable _Py_IDENTIFIER(_dealloc_warn) -Modules/_io/textio.c - PyId_decode variable _Py_IDENTIFIER(decode) -Python/Python-ast.c - PyId_decorator_list variable _Py_IDENTIFIER(decorator_list) -Python/_warnings.c get_default_action PyId_defaultaction variable _Py_IDENTIFIER(defaultaction) -Python/Python-ast.c - PyId_defaults variable _Py_IDENTIFIER(defaults) -Objects/typeobject.c slot_tp_finalize PyId___del__ variable _Py_IDENTIFIER(__del__) -Objects/typeobject.c slot_tp_setattro PyId___delattr__ variable _Py_IDENTIFIER(__delattr__) -Objects/typeobject.c slot_tp_descr_set PyId___delete__ variable _Py_IDENTIFIER(__delete__) -Objects/typeobject.c - PyId___delitem__ variable _Py_IDENTIFIER(__delitem__) -Objects/typeobject.c - PyId___dict__ variable _Py_IDENTIFIER(__dict__) -Modules/_abc.c - PyId___dict__ variable _Py_IDENTIFIER(__dict__) -Python/bltinmodule.c - PyId___dict__ variable _Py_IDENTIFIER(__dict__) -Python/Python-ast.c ast_type_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) -Python/ceval.c import_all_from PyId___dict__ variable _Py_IDENTIFIER(__dict__) -Objects/bytearrayobject.c _common_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) -Objects/moduleobject.c module_dir PyId___dict__ variable _Py_IDENTIFIER(__dict__) -Objects/odictobject.c odict_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) -Objects/setobject.c set_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) -Modules/_collectionsmodule.c deque_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) -Objects/dictobject.c dictviews_sub PyId_difference_update variable _Py_IDENTIFIER(difference_update) -Python/Python-ast.c - PyId_dims variable _Py_IDENTIFIER(dims) -Objects/object.c - PyId___dir__ variable _Py_IDENTIFIER(__dir__) -Objects/moduleobject.c module_dir PyId___dir__ variable _Py_IDENTIFIER(__dir__) -Python/ceval.c _PyEval_EvalFrameDefault PyId_displayhook variable _Py_IDENTIFIER(displayhook) -Objects/typeobject.c - PyId___doc__ variable _Py_IDENTIFIER(__doc__) -Objects/descrobject.c property_init_impl PyId___doc__ variable _Py_IDENTIFIER(__doc__) -Objects/moduleobject.c module_init_dict PyId___doc__ variable _Py_IDENTIFIER(__doc__) -Objects/moduleobject.c PyModule_SetDocString PyId___doc__ variable _Py_IDENTIFIER(__doc__) -Python/Python-ast.c - PyId_elt variable _Py_IDENTIFIER(elt) -Python/Python-ast.c - PyId_elts variable _Py_IDENTIFIER(elts) -Modules/faulthandler.c - PyId_enable variable _Py_IDENTIFIER(enable) -Python/sysmodule.c - PyId_encoding variable _Py_IDENTIFIER(encoding) -Python/bltinmodule.c - PyId_encoding variable _Py_IDENTIFIER(encoding) -Python/pythonrun.c PyRun_InteractiveOneObjectEx PyId_encoding variable _Py_IDENTIFIER(encoding) -Python/Python-ast.c - PyId_end_col_offset variable _Py_IDENTIFIER(end_col_offset) -Python/Python-ast.c - PyId_end_lineno variable _Py_IDENTIFIER(end_lineno) -Python/ceval.c _PyEval_EvalFrameDefault PyId___enter__ variable _Py_IDENTIFIER(__enter__) -Objects/typeobject.c overrides_hash PyId___eq__ variable _Py_IDENTIFIER(__eq__) -Python/bltinmodule.c - PyId_errors variable _Py_IDENTIFIER(errors) -Python/Python-ast.c - PyId_exc variable _Py_IDENTIFIER(exc) -Python/pythonrun.c - PyId_excepthook variable _Py_IDENTIFIER(excepthook) -Python/ceval.c _PyEval_EvalFrameDefault PyId___exit__ variable _Py_IDENTIFIER(__exit__) -Modules/_pickle.c do_append PyId_extend variable _Py_IDENTIFIER(extend) -Python/Python-ast.c - PyId__fields variable _Py_IDENTIFIER(_fields) -Objects/moduleobject.c PyModule_GetFilenameObject PyId___file__ variable _Py_IDENTIFIER(__file__) -Python/errors.c PyErr_SyntaxLocationObject PyId_filename variable _Py_IDENTIFIER(filename) -Python/pythonrun.c parse_syntax_error PyId_filename variable _Py_IDENTIFIER(filename) -Modules/_io/textio.c - PyId_fileno variable _Py_IDENTIFIER(fileno) -Modules/faulthandler.c - PyId_fileno variable _Py_IDENTIFIER(fileno) -Python/bltinmodule.c - PyId_fileno variable _Py_IDENTIFIER(fileno) -Objects/fileobject.c PyObject_AsFileDescriptor PyId_fileno variable _Py_IDENTIFIER(fileno) -Modules/itertoolsmodule.c zip_longest_new PyId_fillvalue variable _Py_IDENTIFIER(fillvalue) -Python/_warnings.c get_filter PyId_filters variable _Py_IDENTIFIER(filters) -Python/Python-ast.c - PyId_finalbody variable _Py_IDENTIFIER(finalbody) -Modules/_io/iobase.c iobase_finalize PyId__finalizing variable _Py_IDENTIFIER(_finalizing) -Python/import.c import_find_and_load PyId__find_and_load variable _Py_IDENTIFIER(_find_and_load) -Python/import.c PyImport_ExecCodeModuleObject PyId__fix_up_module variable _Py_IDENTIFIER(_fix_up_module) -Python/errors.c - PyId_flush variable _Py_IDENTIFIER(flush) -Python/pylifecycle.c - PyId_flush variable _Py_IDENTIFIER(flush) -Python/pythonrun.c - PyId_flush variable _Py_IDENTIFIER(flush) -Modules/_threadmodule.c - PyId_flush variable _Py_IDENTIFIER(flush) -Modules/_io/bufferedio.c - PyId_flush variable _Py_IDENTIFIER(flush) -Modules/_io/textio.c - PyId_flush variable _Py_IDENTIFIER(flush) -Modules/faulthandler.c - PyId_flush variable _Py_IDENTIFIER(flush) -Python/bltinmodule.c - PyId_flush variable _Py_IDENTIFIER(flush) -Objects/abstract.c PyObject_Format PyId___format__ variable _Py_IDENTIFIER(__format__) -Python/Python-ast.c - PyId_format_spec variable _Py_IDENTIFIER(format_spec) -Modules/posixmodule.c path_converter PyId___fspath__ variable _Py_IDENTIFIER(__fspath__) -Modules/posixmodule.c PyOS_FSPath PyId___fspath__ variable _Py_IDENTIFIER(__fspath__) -Python/Python-ast.c - PyId_func variable _Py_IDENTIFIER(func) -Python/Python-ast.c - PyId_generators variable _Py_IDENTIFIER(generators) -Objects/descrobject.c mappingproxy_get PyId_get variable _Py_IDENTIFIER(get) -Modules/_collectionsmodule.c _count_elements PyId_get variable _Py_IDENTIFIER(get) -Objects/typeobject.c slot_tp_descr_get PyId___get__ variable _Py_IDENTIFIER(__get__) -Objects/classobject.c method_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) -Objects/descrobject.c descr_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) -Objects/descrobject.c wrapper_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) -Objects/moduleobject.c module_getattro PyId___getattr__ variable _Py_IDENTIFIER(__getattr__) -Objects/methodobject.c meth_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) -Objects/typeobject.c slot_tp_getattr_hook PyId___getattr__ variable _Py_IDENTIFIER(__getattr__) -Objects/typeobject.c - PyId___getattribute__ variable _Py_IDENTIFIER(__getattribute__) -Objects/typeobject.c - PyId___getitem__ variable _Py_IDENTIFIER(__getitem__) -Objects/typeobject.c _PyObject_GetNewArguments PyId___getnewargs__ variable _Py_IDENTIFIER(__getnewargs__) -Objects/typeobject.c _PyObject_GetNewArguments PyId___getnewargs_ex__ variable _Py_IDENTIFIER(__getnewargs_ex__) -Modules/_io/textio.c - PyId_getpreferredencoding variable _Py_IDENTIFIER(getpreferredencoding) -Python/_warnings.c get_source_line PyId_get_source variable _Py_IDENTIFIER(get_source) -Python/import.c PyImport_ExecCodeModuleWithPathnames PyId__get_sourcefile variable _Py_IDENTIFIER(_get_sourcefile) -Objects/typeobject.c _PyObject_GetState PyId___getstate__ variable _Py_IDENTIFIER(__getstate__) -Python/import.c PyImport_ImportModuleLevelObject PyId__handle_fromlist variable _Py_IDENTIFIER(_handle_fromlist) -Python/Python-ast.c - PyId_handlers variable _Py_IDENTIFIER(handlers) -Objects/typeobject.c - PyId___hash__ variable _Py_IDENTIFIER(__hash__) -Python/Python-ast.c - PyId_id variable _Py_IDENTIFIER(id) -Python/Python-ast.c - PyId_ifs variable _Py_IDENTIFIER(ifs) -Python/import.c PyImport_ReloadModule PyId_imp variable _Py_IDENTIFIER(imp) -Python/ceval.c import_name PyId___import__ variable _Py_IDENTIFIER(__import__) -Objects/typeobject.c slot_nb_index PyId___index__ variable _Py_IDENTIFIER(__index__) -Objects/typeobject.c slot_tp_init PyId___init__ variable _Py_IDENTIFIER(__init__) -Objects/moduleobject.c _PyModuleSpec_IsInitializing PyId__initializing variable _Py_IDENTIFIER(_initializing) -Objects/typeobject.c - PyId___init_subclass__ variable _Py_IDENTIFIER(__init_subclass__) -Objects/abstract.c PyObject_IsInstance PyId___instancecheck__ variable _Py_IDENTIFIER(__instancecheck__) -Objects/dictobject.c _PyDictView_Intersect PyId_intersection_update variable _Py_IDENTIFIER(intersection_update) -Modules/_io/iobase.c - PyId___IOBase_closed variable _Py_IDENTIFIER(__IOBase_closed) -Objects/typeobject.c slot_nb_inplace_power PyId___ipow__ variable _Py_IDENTIFIER(__ipow__) -Objects/object.c - PyId___isabstractmethod__ variable _Py_IDENTIFIER(__isabstractmethod__) -Python/Python-ast.c - PyId_is_async variable _Py_IDENTIFIER(is_async) -Modules/_io/bufferedio.c - PyId_isatty variable _Py_IDENTIFIER(isatty) -Modules/_io/textio.c - PyId_isatty variable _Py_IDENTIFIER(isatty) -Python/pylifecycle.c create_stdio PyId_isatty variable _Py_IDENTIFIER(isatty) -Modules/_io/_iomodule.c _io_open_impl PyId_isatty variable _Py_IDENTIFIER(isatty) -Python/codecs.c _PyCodec_LookupTextEncoding PyId__is_text_encoding variable _Py_IDENTIFIER(_is_text_encoding) -Python/Python-ast.c - PyId_items variable _Py_IDENTIFIER(items) -Objects/abstract.c PyMapping_Items PyId_items variable _Py_IDENTIFIER(items) -Objects/descrobject.c mappingproxy_items PyId_items variable _Py_IDENTIFIER(items) -Objects/odictobject.c odict_reduce PyId_items variable _Py_IDENTIFIER(items) -Objects/odictobject.c odict_repr PyId_items variable _Py_IDENTIFIER(items) -Objects/odictobject.c mutablemapping_update PyId_items variable _Py_IDENTIFIER(items) -Objects/typeobject.c _PyObject_GetItemsIter PyId_items variable _Py_IDENTIFIER(items) -Modules/_collectionsmodule.c defdict_reduce PyId_items variable _Py_IDENTIFIER(items) -Python/Python-ast.c - PyId_iter variable _Py_IDENTIFIER(iter) -Objects/bytearrayobject.c bytearrayiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) -Objects/bytesobject.c striter_reduce PyId_iter variable _Py_IDENTIFIER(iter) -Objects/dictobject.c dictiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) -Objects/iterobject.c iter_reduce PyId_iter variable _Py_IDENTIFIER(iter) -Objects/iterobject.c calliter_reduce PyId_iter variable _Py_IDENTIFIER(iter) -Objects/listobject.c listiter_reduce_general PyId_iter variable _Py_IDENTIFIER(iter) -Objects/odictobject.c odictiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) -Objects/rangeobject.c rangeiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) -Objects/rangeobject.c longrangeiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) -Objects/setobject.c setiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) -Objects/tupleobject.c tupleiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) -Objects/unicodeobject.c unicodeiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) -Objects/typeobject.c slot_tp_iter PyId___iter__ variable _Py_IDENTIFIER(__iter__) -Modules/arraymodule.c array_arrayiterator___reduce___impl PyId_iter variable _Py_IDENTIFIER(iter) -Python/Python-ast.c - PyId_key variable _Py_IDENTIFIER(key) -Python/Python-ast.c - PyId_keys variable _Py_IDENTIFIER(keys) -Objects/abstract.c PyMapping_Keys PyId_keys variable _Py_IDENTIFIER(keys) -Objects/descrobject.c mappingproxy_keys PyId_keys variable _Py_IDENTIFIER(keys) -Objects/dictobject.c dict_update_common PyId_keys variable _Py_IDENTIFIER(keys) -Objects/odictobject.c mutablemapping_update PyId_keys variable _Py_IDENTIFIER(keys) -Python/Python-ast.c - PyId_keywords variable _Py_IDENTIFIER(keywords) -Python/Python-ast.c - PyId_kind variable _Py_IDENTIFIER(kind) -Python/Python-ast.c - PyId_kwarg variable _Py_IDENTIFIER(kwarg) -Python/Python-ast.c - PyId_kw_defaults variable _Py_IDENTIFIER(kw_defaults) -Python/Python-ast.c - PyId_kwonlyargs variable _Py_IDENTIFIER(kwonlyargs) -Python/pythonrun.c - PyId_last_traceback variable _Py_IDENTIFIER(last_traceback) -Python/pythonrun.c - PyId_last_type variable _Py_IDENTIFIER(last_type) -Python/pythonrun.c - PyId_last_value variable _Py_IDENTIFIER(last_value) -Python/Python-ast.c - PyId_left variable _Py_IDENTIFIER(left) -Objects/typeobject.c - PyId___len__ variable _Py_IDENTIFIER(__len__) -Objects/abstract.c PyObject_LengthHint PyId___length_hint__ variable _Py_IDENTIFIER(__length_hint__) -Python/Python-ast.c - PyId_level variable _Py_IDENTIFIER(level) -Python/Python-ast.c - PyId_lineno variable _Py_IDENTIFIER(lineno) -Python/errors.c PyErr_SyntaxLocationObject PyId_lineno variable _Py_IDENTIFIER(lineno) -Python/pythonrun.c parse_syntax_error PyId_lineno variable _Py_IDENTIFIER(lineno) -Objects/longobject.c - PyId_little variable _Py_IDENTIFIER(little) -Python/_warnings.c get_source_line PyId___loader__ variable _Py_IDENTIFIER(__loader__) -Objects/moduleobject.c module_init_dict PyId___loader__ variable _Py_IDENTIFIER(__loader__) -Python/import.c PyImport_ImportModuleLevelObject PyId__lock_unlock_module variable _Py_IDENTIFIER(_lock_unlock_module) -Python/Python-ast.c - PyId_lower variable _Py_IDENTIFIER(lower) -Python/ceval.c _PyEval_EvalFrameDefault PyId___ltrace__ variable _Py_IDENTIFIER(__ltrace__) -Python/pythonrun.c PyRun_InteractiveOneObjectEx PyId___main__ variable _Py_IDENTIFIER(__main__) -Python/_warnings.c check_matched PyId_match variable _Py_IDENTIFIER(match) -Python/bltinmodule.c - PyId_metaclass variable _Py_IDENTIFIER(metaclass) -Objects/dictobject.c dict_subscript PyId___missing__ variable _Py_IDENTIFIER(__missing__) -Modules/_io/bufferedio.c - PyId_mode variable _Py_IDENTIFIER(mode) -Modules/_io/textio.c - PyId_mode variable _Py_IDENTIFIER(mode) -Python/pylifecycle.c create_stdio PyId_mode variable _Py_IDENTIFIER(mode) -Modules/_io/_iomodule.c _io_open_impl PyId_mode variable _Py_IDENTIFIER(mode) -Python/Python-ast.c - PyId_module variable _Py_IDENTIFIER(module) -Objects/typeobject.c - PyId___module__ variable _Py_IDENTIFIER(__module__) -Python/Python-ast.c make_type PyId___module__ variable _Py_IDENTIFIER(__module__) -Python/errors.c PyErr_NewException PyId___module__ variable _Py_IDENTIFIER(__module__) -Python/errors.c PyErr_NewException PyId___module__ variable _Py_IDENTIFIER(__module__) -Python/pythonrun.c print_exception PyId___module__ variable _Py_IDENTIFIER(__module__) -Modules/_pickle.c whichmodule PyId___module__ variable _Py_IDENTIFIER(__module__) -Objects/typeobject.c type_mro_modified PyId_mro variable _Py_IDENTIFIER(mro) -Objects/typeobject.c mro_invoke PyId_mro variable _Py_IDENTIFIER(mro) -Python/bltinmodule.c - PyId___mro_entries__ variable _Py_IDENTIFIER(__mro_entries__) -Objects/typeobject.c type_new PyId___mro_entries__ variable _Py_IDENTIFIER(__mro_entries__) -Python/Python-ast.c - PyId_msg variable _Py_IDENTIFIER(msg) -Python/errors.c PyErr_SyntaxLocationObject PyId_msg variable _Py_IDENTIFIER(msg) -Python/pythonrun.c parse_syntax_error PyId_msg variable _Py_IDENTIFIER(msg) -Python/pylifecycle.c - PyId_name variable _Py_IDENTIFIER(name) -Modules/_io/fileio.c - PyId_name variable _Py_IDENTIFIER(name) -Modules/_io/bufferedio.c - PyId_name variable _Py_IDENTIFIER(name) -Modules/_io/textio.c - PyId_name variable _Py_IDENTIFIER(name) -Python/Python-ast.c - PyId_name variable _Py_IDENTIFIER(name) -Objects/exceptions.c ImportError_getstate PyId_name variable _Py_IDENTIFIER(name) -Objects/typeobject.c - PyId___name__ variable _Py_IDENTIFIER(__name__) -Objects/classobject.c - PyId___name__ variable _Py_IDENTIFIER(__name__) -Python/_warnings.c setup_context PyId___name__ variable _Py_IDENTIFIER(__name__) -Python/_warnings.c get_source_line PyId___name__ variable _Py_IDENTIFIER(__name__) -Python/_warnings.c show_warning PyId___name__ variable _Py_IDENTIFIER(__name__) -Python/ceval.c import_from PyId___name__ variable _Py_IDENTIFIER(__name__) -Python/ceval.c import_all_from PyId___name__ variable _Py_IDENTIFIER(__name__) -Python/import.c resolve_name PyId___name__ variable _Py_IDENTIFIER(__name__) -Objects/moduleobject.c module_init_dict PyId___name__ variable _Py_IDENTIFIER(__name__) -Objects/moduleobject.c PyModule_GetNameObject PyId___name__ variable _Py_IDENTIFIER(__name__) -Objects/moduleobject.c module_getattro PyId___name__ variable _Py_IDENTIFIER(__name__) -Objects/weakrefobject.c weakref_repr PyId___name__ variable _Py_IDENTIFIER(__name__) -Modules/_pickle.c save_global PyId___name__ variable _Py_IDENTIFIER(__name__) -Modules/_pickle.c save_reduce PyId___name__ variable _Py_IDENTIFIER(__name__) -Python/Python-ast.c - PyId_names variable _Py_IDENTIFIER(names) -Objects/typeobject.c - PyId___new__ variable _Py_IDENTIFIER(__new__) -Objects/typeobject.c reduce_newobj PyId___newobj__ variable _Py_IDENTIFIER(__newobj__) -Objects/typeobject.c reduce_newobj PyId___newobj_ex__ variable _Py_IDENTIFIER(__newobj_ex__) -Objects/typeobject.c slot_tp_iternext PyId___next__ variable _Py_IDENTIFIER(__next__) -Objects/structseq.c - PyId_n_fields variable _Py_IDENTIFIER(n_fields) -Python/ast.c new_identifier PyId_NFKC variable _Py_IDENTIFIER(NFKC) -Objects/structseq.c - PyId_n_sequence_fields variable _Py_IDENTIFIER(n_sequence_fields) -Objects/structseq.c - PyId_n_unnamed_fields variable _Py_IDENTIFIER(n_unnamed_fields) -Python/errors.c PyErr_SyntaxLocationObject PyId_offset variable _Py_IDENTIFIER(offset) -Python/pythonrun.c parse_syntax_error PyId_offset variable _Py_IDENTIFIER(offset) -Python/_warnings.c get_once_registry PyId_onceregistry variable _Py_IDENTIFIER(onceregistry) -Python/Python-ast.c - PyId_op variable _Py_IDENTIFIER(op) -Python/traceback.c - PyId_open variable _Py_IDENTIFIER(open) -Python/pylifecycle.c create_stdio PyId_open variable _Py_IDENTIFIER(open) -Parser/tokenizer.c fp_setreadl PyId_open variable _Py_IDENTIFIER(open) -Objects/fileobject.c PyFile_FromFd PyId_open variable _Py_IDENTIFIER(open) -Objects/fileobject.c PyFile_OpenCodeObject PyId_open variable _Py_IDENTIFIER(open) -Python/Python-ast.c - PyId_operand variable _Py_IDENTIFIER(operand) -Python/Python-ast.c - PyId_ops variable _Py_IDENTIFIER(ops) -Python/Python-ast.c - PyId_optional_vars variable _Py_IDENTIFIER(optional_vars) -Python/Python-ast.c - PyId_orelse variable _Py_IDENTIFIER(orelse) -Python/import.c resolve_name PyId___package__ variable _Py_IDENTIFIER(__package__) -Objects/moduleobject.c module_init_dict PyId___package__ variable _Py_IDENTIFIER(__package__) -Python/import.c resolve_name PyId_parent variable _Py_IDENTIFIER(parent) -Modules/_operator.c methodcaller_reduce PyId_partial variable _Py_IDENTIFIER(partial) -Python/sysmodule.c - PyId_path variable _Py_IDENTIFIER(path) -Python/traceback.c - PyId_path variable _Py_IDENTIFIER(path) -Objects/exceptions.c ImportError_getstate PyId_path variable _Py_IDENTIFIER(path) -Modules/main.c pymain_sys_path_add_path0 PyId_path variable _Py_IDENTIFIER(path) -Python/import.c resolve_name PyId___path__ variable _Py_IDENTIFIER(__path__) -Python/import.c PyImport_ImportModuleLevelObject PyId___path__ variable _Py_IDENTIFIER(__path__) -Modules/_io/bufferedio.c - PyId_peek variable _Py_IDENTIFIER(peek) -Python/Python-ast.c - PyId_posonlyargs variable _Py_IDENTIFIER(posonlyargs) -Objects/typeobject.c slot_nb_power PyId___pow__ variable _Py_IDENTIFIER(__pow__) -Python/bltinmodule.c - PyId___prepare__ variable _Py_IDENTIFIER(__prepare__) -Python/errors.c PyErr_SyntaxLocationObject PyId_print_file_and_line variable _Py_IDENTIFIER(print_file_and_line) -Python/pythonrun.c print_exception PyId_print_file_and_line variable _Py_IDENTIFIER(print_file_and_line) -Python/pythonrun.c - PyId_ps1 variable _Py_IDENTIFIER(ps1) -Python/pythonrun.c - PyId_ps2 variable _Py_IDENTIFIER(ps2) -Objects/object.c - PyId_Py_Repr variable _Py_IDENTIFIER(Py_Repr) -Objects/classobject.c - PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) -Objects/descrobject.c calculate_qualname PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) -Objects/methodobject.c meth_get__qualname__ PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) -Objects/typeobject.c type_new PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) -Modules/_io/textio.c - PyId_raw variable _Py_IDENTIFIER(raw) -Python/pylifecycle.c create_stdio PyId_raw variable _Py_IDENTIFIER(raw) -Modules/_io/iobase.c - PyId_read variable _Py_IDENTIFIER(read) -Modules/_io/bufferedio.c - PyId_read variable _Py_IDENTIFIER(read) -Modules/_io/textio.c - PyId_read variable _Py_IDENTIFIER(read) -Modules/_io/bufferedio.c - PyId_read1 variable _Py_IDENTIFIER(read1) -Python/marshal.c marshal_load PyId_read variable _Py_IDENTIFIER(read) -Modules/_io/bufferedio.c - PyId_readable variable _Py_IDENTIFIER(readable) -Modules/_io/textio.c - PyId_readable variable _Py_IDENTIFIER(readable) -Modules/_io/iobase.c _io__RawIOBase_read_impl PyId_readall variable _Py_IDENTIFIER(readall) -Modules/_io/bufferedio.c - PyId_readinto variable _Py_IDENTIFIER(readinto) -Modules/_io/bufferedio.c - PyId_readinto1 variable _Py_IDENTIFIER(readinto1) -Python/marshal.c r_string PyId_readinto variable _Py_IDENTIFIER(readinto) -Parser/tokenizer.c fp_setreadl PyId_readline variable _Py_IDENTIFIER(readline) -Objects/fileobject.c PyFile_GetLine PyId_readline variable _Py_IDENTIFIER(readline) -Objects/typeobject.c object___reduce_ex___impl PyId___reduce__ variable _Py_IDENTIFIER(__reduce__) -Python/import.c PyImport_ReloadModule PyId_reload variable _Py_IDENTIFIER(reload) -Modules/_io/textio.c - PyId_replace variable _Py_IDENTIFIER(replace) -Python/importdl.c get_encoded_name PyId_replace variable _Py_IDENTIFIER(replace) -Objects/typeobject.c slot_tp_repr PyId___repr__ variable _Py_IDENTIFIER(__repr__) -Modules/_io/textio.c - PyId_reset variable _Py_IDENTIFIER(reset) -Python/Python-ast.c - PyId_returns variable _Py_IDENTIFIER(returns) -Objects/enumobject.c reversed_new_impl PyId___reversed__ variable _Py_IDENTIFIER(__reversed__) -Objects/listobject.c listiter_reduce_general PyId_reversed variable _Py_IDENTIFIER(reversed) -Python/Python-ast.c - PyId_right variable _Py_IDENTIFIER(right) -Python/bltinmodule.c - PyId___round__ variable _Py_IDENTIFIER(__round__) -Modules/_io/textio.c - PyId_seek variable _Py_IDENTIFIER(seek) -Modules/_io/iobase.c _io__IOBase_tell_impl PyId_seek variable _Py_IDENTIFIER(seek) -Modules/_io/textio.c - PyId_seekable variable _Py_IDENTIFIER(seekable) -Python/ceval.c _PyEval_EvalFrameDefault PyId_send variable _Py_IDENTIFIER(send) -Objects/typeobject.c slot_tp_descr_set PyId___set__ variable _Py_IDENTIFIER(__set__) -Objects/typeobject.c slot_tp_setattro PyId___setattr__ variable _Py_IDENTIFIER(__setattr__) -Objects/typeobject.c - PyId___setitem__ variable _Py_IDENTIFIER(__setitem__) -Modules/_collectionsmodule.c _count_elements PyId___setitem__ variable _Py_IDENTIFIER(__setitem__) -Objects/typeobject.c - PyId___set_name__ variable _Py_IDENTIFIER(__set_name__) -Modules/_io/textio.c - PyId_setstate variable _Py_IDENTIFIER(setstate) -Modules/_pickle.c load_build PyId___setstate__ variable _Py_IDENTIFIER(__setstate__) -Python/_warnings.c call_show_warning PyId__showwarnmsg variable _Py_IDENTIFIER(_showwarnmsg) -Python/pylifecycle.c wait_for_thread_shutdown PyId__shutdown variable _Py_IDENTIFIER(_shutdown) -Python/Python-ast.c - PyId_simple variable _Py_IDENTIFIER(simple) -Python/sysmodule.c - PyId___sizeof__ variable _Py_IDENTIFIER(__sizeof__) -Python/Python-ast.c - PyId_slice variable _Py_IDENTIFIER(slice) -Objects/typeobject.c _PyType_GetSlotNames PyId___slotnames__ variable _Py_IDENTIFIER(__slotnames__) -Objects/typeobject.c _PyType_GetSlotNames PyId__slotnames variable _Py_IDENTIFIER(_slotnames) -Objects/typeobject.c type_new PyId___slots__ variable _Py_IDENTIFIER(__slots__) -Python/bltinmodule.c - PyId_sort variable _Py_IDENTIFIER(sort) -Python/import.c resolve_name PyId___spec__ variable _Py_IDENTIFIER(__spec__) -Python/import.c PyImport_ImportModuleLevelObject PyId___spec__ variable _Py_IDENTIFIER(__spec__) -Objects/moduleobject.c module_init_dict PyId___spec__ variable _Py_IDENTIFIER(__spec__) -Objects/moduleobject.c module_getattro PyId___spec__ variable _Py_IDENTIFIER(__spec__) -Python/_warnings.c - PyId_stderr variable _Py_IDENTIFIER(stderr) -Python/errors.c - PyId_stderr variable _Py_IDENTIFIER(stderr) -Python/pylifecycle.c - PyId_stderr variable _Py_IDENTIFIER(stderr) -Python/pythonrun.c - PyId_stderr variable _Py_IDENTIFIER(stderr) -Python/sysmodule.c - PyId_stderr variable _Py_IDENTIFIER(stderr) -Modules/_threadmodule.c - PyId_stderr variable _Py_IDENTIFIER(stderr) -Modules/faulthandler.c - PyId_stderr variable _Py_IDENTIFIER(stderr) -Python/bltinmodule.c - PyId_stderr variable _Py_IDENTIFIER(stderr) -Python/pylifecycle.c - PyId_stdin variable _Py_IDENTIFIER(stdin) -Python/pythonrun.c - PyId_stdin variable _Py_IDENTIFIER(stdin) -Python/bltinmodule.c - PyId_stdin variable _Py_IDENTIFIER(stdin) -Python/pylifecycle.c - PyId_stdout variable _Py_IDENTIFIER(stdout) -Python/pythonrun.c - PyId_stdout variable _Py_IDENTIFIER(stdout) -Python/sysmodule.c - PyId_stdout variable _Py_IDENTIFIER(stdout) -Python/bltinmodule.c - PyId_stdout variable _Py_IDENTIFIER(stdout) -Python/Python-ast.c - PyId_step variable _Py_IDENTIFIER(step) -Modules/posixmodule.c DirEntry_test_mode PyId_st_mode variable _Py_IDENTIFIER(st_mode) -Modules/_io/textio.c - PyId_strict variable _Py_IDENTIFIER(strict) -Python/pythonrun.c - PyId_string variable _Py_static_string(PyId_string, """") -Modules/timemodule.c time_strptime PyId__strptime_time variable _Py_IDENTIFIER(_strptime_time) -Modules/posixmodule.c wait_helper PyId_struct_rusage variable _Py_IDENTIFIER(struct_rusage) -Modules/_abc.c - PyId___subclasscheck__ variable _Py_IDENTIFIER(__subclasscheck__) -Objects/abstract.c PyObject_IsSubclass PyId___subclasscheck__ variable _Py_IDENTIFIER(__subclasscheck__) -Modules/_abc.c - PyId___subclasshook__ variable _Py_IDENTIFIER(__subclasshook__) -Objects/dictobject.c dictviews_xor PyId_symmetric_difference_update variable _Py_IDENTIFIER(symmetric_difference_update) -Python/Python-ast.c - PyId_tag variable _Py_IDENTIFIER(tag) -Python/Python-ast.c - PyId_target variable _Py_IDENTIFIER(target) -Python/Python-ast.c - PyId_targets variable _Py_IDENTIFIER(targets) -Modules/_io/textio.c - PyId_tell variable _Py_IDENTIFIER(tell) -Python/Python-ast.c - PyId_test variable _Py_IDENTIFIER(test) -Python/errors.c PyErr_SyntaxLocationObject PyId_text variable _Py_IDENTIFIER(text) -Python/pythonrun.c parse_syntax_error PyId_text variable _Py_IDENTIFIER(text) -Python/traceback.c - PyId_TextIOWrapper variable _Py_IDENTIFIER(TextIOWrapper) -Python/pylifecycle.c create_stdio PyId_TextIOWrapper variable _Py_IDENTIFIER(TextIOWrapper) -Python/pylifecycle.c - PyId_threading variable _Py_IDENTIFIER(threading) -Objects/genobject.c _gen_throw PyId_throw variable _Py_IDENTIFIER(throw) -Objects/abstract.c PyNumber_Long PyId___trunc__ variable _Py_IDENTIFIER(__trunc__) -Python/Python-ast.c - PyId_type variable _Py_IDENTIFIER(type) -Python/Python-ast.c - PyId_type_comment variable _Py_IDENTIFIER(type_comment) -Python/Python-ast.c - PyId_type_ignores variable _Py_IDENTIFIER(type_ignores) -Python/errors.c _PyErr_WriteUnraisableMsg PyId_unraisablehook variable _Py_IDENTIFIER(unraisablehook) -Objects/dictobject.c dictviews_or PyId_update variable _Py_IDENTIFIER(update) -Python/Python-ast.c - PyId_upper variable _Py_IDENTIFIER(upper) -Python/Python-ast.c - PyId_value variable _Py_IDENTIFIER(value) -Python/Python-ast.c - PyId_values variable _Py_IDENTIFIER(values) -Objects/abstract.c PyMapping_Values PyId_values variable _Py_IDENTIFIER(values) -Objects/descrobject.c mappingproxy_values PyId_values variable _Py_IDENTIFIER(values) -Python/Python-ast.c - PyId_vararg variable _Py_IDENTIFIER(vararg) -Python/_warnings.c already_warned PyId_version variable _Py_IDENTIFIER(version) -Python/_warnings.c call_show_warning PyId_WarningMessage variable _Py_IDENTIFIER(WarningMessage) -Python/_warnings.c setup_context PyId___warningregistry__ variable _Py_IDENTIFIER(__warningregistry__) -Python/_warnings.c get_warnings_attr PyId_warnings variable _Py_IDENTIFIER(warnings) -Python/sysmodule.c - PyId_warnoptions variable _Py_IDENTIFIER(warnoptions) -Python/_warnings.c _PyErr_WarnUnawaitedCoroutine PyId__warn_unawaited_coroutine variable _Py_IDENTIFIER(_warn_unawaited_coroutine) -Modules/_io/bufferedio.c - PyId_writable variable _Py_IDENTIFIER(writable) -Modules/_io/textio.c - PyId_writable variable _Py_IDENTIFIER(writable) -Python/sysmodule.c - PyId_write variable _Py_IDENTIFIER(write) -Modules/_io/bufferedio.c - PyId_write variable _Py_IDENTIFIER(write) -Python/marshal.c marshal_dump_impl PyId_write variable _Py_IDENTIFIER(write) -Objects/fileobject.c PyFile_WriteObject PyId_write variable _Py_IDENTIFIER(write) -Python/sysmodule.c - PyId__xoptions variable _Py_IDENTIFIER(_xoptions) -Python/import.c _PyImportZip_Init PyId_zipimporter variable _Py_IDENTIFIER(zipimporter) -Python/initconfig.c - Py_IgnoreEnvironmentFlag variable int Py_IgnoreEnvironmentFlag -Python/dynload_shlib.c - _PyImport_DynLoadFiletab variable const char *_PyImport_DynLoadFiletab[] -Python/frozen.c - PyImport_FrozenModules variable const struct _frozen * PyImport_FrozenModules -Modules/config.c - _PyImport_Inittab variable struct _inittab _PyImport_Inittab[] -Python/import.c - PyImport_Inittab variable struct _inittab * PyImport_Inittab -Modules/_io/textio.c - PyIncrementalNewlineDecoder_Type variable PyTypeObject PyIncrementalNewlineDecoder_Type -Python/initconfig.c - Py_InspectFlag variable int Py_InspectFlag -Objects/classobject.c - PyInstanceMethod_Type variable PyTypeObject PyInstanceMethod_Type -Python/initconfig.c - Py_InteractiveFlag variable int Py_InteractiveFlag -Objects/interpreteridobject.c - _PyInterpreterID_Type variable PyTypeObject _PyInterpreterID_Type -Modules/_io/iobase.c - PyIOBase_Type variable PyTypeObject PyIOBase_Type -Modules/_io/_iomodule.c - _PyIO_empty_bytes variable PyObject *_PyIO_empty_bytes -Modules/_io/_iomodule.c - _PyIO_empty_str variable PyObject *_PyIO_empty_str -Modules/_io/_iomodule.c - _PyIO_Module variable struct PyModuleDef _PyIO_Module -Modules/_io/_iomodule.c - _PyIO_str_close variable PyObject *_PyIO_str_close -Modules/_io/_iomodule.c - _PyIO_str_closed variable PyObject *_PyIO_str_closed -Modules/_io/_iomodule.c - _PyIO_str_decode variable PyObject *_PyIO_str_decode -Modules/_io/_iomodule.c - _PyIO_str_encode variable PyObject *_PyIO_str_encode -Modules/_io/_iomodule.c - _PyIO_str_fileno variable PyObject *_PyIO_str_fileno -Modules/_io/_iomodule.c - _PyIO_str_flush variable PyObject *_PyIO_str_flush -Modules/_io/_iomodule.c - _PyIO_str_getstate variable PyObject *_PyIO_str_getstate -Modules/_io/_iomodule.c - _PyIO_str_isatty variable PyObject *_PyIO_str_isatty -Modules/_io/_iomodule.c - _PyIO_str_newlines variable PyObject *_PyIO_str_newlines -Modules/_io/_iomodule.c - _PyIO_str_nl variable PyObject *_PyIO_str_nl -Modules/_io/_iomodule.c - _PyIO_str_peek variable PyObject *_PyIO_str_peek -Modules/_io/_iomodule.c - _PyIO_str_read variable PyObject *_PyIO_str_read -Modules/_io/_iomodule.c - _PyIO_str_read1 variable PyObject *_PyIO_str_read1 -Modules/_io/_iomodule.c - _PyIO_str_readable variable PyObject *_PyIO_str_readable -Modules/_io/_iomodule.c - _PyIO_str_readall variable PyObject *_PyIO_str_readall -Modules/_io/_iomodule.c - _PyIO_str_readinto variable PyObject *_PyIO_str_readinto -Modules/_io/_iomodule.c - _PyIO_str_readline variable PyObject *_PyIO_str_readline -Modules/_io/_iomodule.c - _PyIO_str_reset variable PyObject *_PyIO_str_reset -Modules/_io/_iomodule.c - _PyIO_str_seek variable PyObject *_PyIO_str_seek -Modules/_io/_iomodule.c - _PyIO_str_seekable variable PyObject *_PyIO_str_seekable -Modules/_io/_iomodule.c - _PyIO_str_setstate variable PyObject *_PyIO_str_setstate -Modules/_io/_iomodule.c - _PyIO_str_tell variable PyObject *_PyIO_str_tell -Modules/_io/_iomodule.c - _PyIO_str_truncate variable PyObject *_PyIO_str_truncate -Modules/_io/_iomodule.c - _PyIO_str_writable variable PyObject *_PyIO_str_writable -Modules/_io/_iomodule.c - _PyIO_str_write variable PyObject *_PyIO_str_write -Python/initconfig.c - Py_IsolatedFlag variable int Py_IsolatedFlag -Objects/listobject.c - PyListIter_Type variable PyTypeObject PyListIter_Type -Objects/listobject.c - PyListRevIter_Type variable PyTypeObject PyListRevIter_Type -Objects/listobject.c - PyList_Type variable PyTypeObject PyList_Type -Modules/_localemodule.c - PyLocale_Methods variable static struct PyMethodDef PyLocale_Methods[] -Objects/longobject.c - _PyLong_DigitValue variable unsigned char _PyLong_DigitValue[256] -Objects/longobject.c - _PyLong_One variable PyObject *_PyLong_One -Objects/rangeobject.c - PyLongRangeIter_Type variable PyTypeObject PyLongRangeIter_Type -Objects/longobject.c - PyLong_Type variable PyTypeObject PyLong_Type -Objects/longobject.c - _PyLong_Zero variable PyObject *_PyLong_Zero -Objects/memoryobject.c - _PyManagedBuffer_Type variable PyTypeObject _PyManagedBuffer_Type -Python/bltinmodule.c - PyMap_Type variable PyTypeObject PyMap_Type -Objects/obmalloc.c - _PyMem variable static PyMemAllocatorEx _PyMem -Objects/descrobject.c - PyMemberDescr_Type variable PyTypeObject PyMemberDescr_Type -Objects/obmalloc.c - _PyMem_Debug variable static struct { debug_alloc_api_t raw; debug_alloc_api_t mem; debug_alloc_api_t obj; } _PyMem_Debug -Objects/memoryobject.c - PyMemoryView_Type variable PyTypeObject PyMemoryView_Type -Objects/obmalloc.c - _PyMem_Raw variable static PyMemAllocatorEx _PyMem_Raw -Objects/descrobject.c - PyMethodDescr_Type variable PyTypeObject PyMethodDescr_Type -Objects/classobject.c - PyMethod_Type variable PyTypeObject PyMethod_Type -Objects/descrobject.c - _PyMethodWrapper_Type variable PyTypeObject _PyMethodWrapper_Type -Objects/moduleobject.c - PyModuleDef_Type variable PyTypeObject PyModuleDef_Type -Objects/moduleobject.c - PyModule_Type variable PyTypeObject PyModule_Type -Objects/namespaceobject.c - _PyNamespace_Type variable PyTypeObject _PyNamespace_Type -Objects/object.c - _Py_NoneStruct variable PyObject _Py_NoneStruct -Objects/object.c - _PyNone_Type variable PyTypeObject _PyNone_Type -Python/initconfig.c - Py_NoSiteFlag variable int Py_NoSiteFlag -Objects/object.c - _Py_NotImplementedStruct variable PyObject _Py_NotImplementedStruct -Objects/object.c - _PyNotImplemented_Type variable PyTypeObject _PyNotImplemented_Type -Python/initconfig.c - Py_NoUserSiteDirectory variable int Py_NoUserSiteDirectory -Objects/bytesobject.c - _Py_null_strings variable Py_ssize_t _Py_null_strings -Objects/obmalloc.c - _PyObject variable static PyMemAllocatorEx _PyObject -Objects/obmalloc.c - _PyObject_Arena variable static PyObjectArenaAllocator _PyObject_Arena -Objects/odictobject.c - PyODictItems_Type variable PyTypeObject PyODictItems_Type -Objects/odictobject.c - PyODictIter_Type variable PyTypeObject PyODictIter_Type -Objects/odictobject.c - PyODictKeys_Type variable PyTypeObject PyODictKeys_Type -Objects/odictobject.c - PyODict_Type variable PyTypeObject PyODict_Type -Objects/odictobject.c - PyODictValues_Type variable PyTypeObject PyODictValues_Type -Python/fileutils.c - _Py_open_cloexec_works variable int _Py_open_cloexec_works -Objects/bytesobject.c - _Py_one_strings variable Py_ssize_t _Py_one_strings -Python/initconfig.c - Py_OptimizeFlag variable int Py_OptimizeFlag -Parser/myreadline.c - PyOS_InputHook variable int (*PyOS_InputHook)(void) -Python/pylifecycle.c - _PyOS_mystrnicmp_hack variable int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) -Python/getopt.c - _PyOS_optarg variable const wchar_t *_PyOS_optarg -Python/getopt.c - _PyOS_opterr variable int _PyOS_opterr -Python/getopt.c - _PyOS_optind variable Py_ssize_t _PyOS_optind -Parser/myreadline.c - PyOS_ReadlineFunctionPointer variable char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *) -Parser/myreadline.c - _PyOS_ReadlineLock variable static PyThread_type_lock _PyOS_ReadlineLock -Parser/myreadline.c - _PyOS_ReadlineTState variable PyThreadState* _PyOS_ReadlineTState -Python/modsupport.c - _Py_PackageContext variable const char *_Py_PackageContext -Python/graminit.c - _PyParser_Grammar variable grammar _PyParser_Grammar -Python/pathconfig.c - _Py_path_config variable _PyPathConfig _Py_path_config -Objects/picklebufobject.c - PyPickleBuffer_Type variable PyTypeObject PyPickleBuffer_Type -Objects/descrobject.c - PyProperty_Type variable PyTypeObject PyProperty_Type -Python/initconfig.c - Py_QuietFlag variable int Py_QuietFlag -Objects.longobject.c - _Py_quick_int_allocs variable Py_ssize_t _Py_quick_int_allocs -Objects.longobject.c - _Py_quick_new_int_allocs variable Py_ssize_t _Py_quick_new_int_allocs -Objects/rangeobject.c - PyRangeIter_Type variable PyTypeObject PyRangeIter_Type -Objects/rangeobject.c - PyRange_Type variable PyTypeObject PyRange_Type -Modules/_io/iobase.c - PyRawIOBase_Type variable PyTypeObject PyRawIOBase_Type -Objects/object.c - _Py_RefTotal variable Py_ssize_t _Py_RefTotal -Objects/enumobject.c - PyReversed_Type variable PyTypeObject PyReversed_Type -Python/pylifecycle.c - _PyRuntime variable _PyRuntimeState _PyRuntime -Objects/iterobject.c - PySeqIter_Type variable PyTypeObject PySeqIter_Type -Objects/setobject.c - _PySet_Dummy variable PyObject * _PySet_Dummy -Objects/setobject.c - _PySetDummy_Type variable static PyTypeObject _PySetDummy_Type -Objects/setobject.c - PySetIter_Type variable PyTypeObject PySetIter_Type -Objects/setobject.c - PySet_Type variable PyTypeObject PySet_Type -Objects/sliceobject.c - PySlice_Type variable PyTypeObject PySlice_Type -Python/initconfig.c - _Py_StandardStreamEncoding variable static char *_Py_StandardStreamEncoding -Python/initconfig.c - _Py_StandardStreamErrors variable static char *_Py_StandardStreamErrors -Objects/funcobject.c - PyStaticMethod_Type variable PyTypeObject PyStaticMethod_Type -Objects/fileobject.c - PyStdPrinter_Type variable PyTypeObject PyStdPrinter_Type -Python/symtable.c - PySTEntry_Type variable PyTypeObject PySTEntry_Type -Modules/_io/stringio.c - PyStringIO_Type variable PyTypeObject PyStringIO_Type -Objects/structseq.c - PyStructSequence_UnnamedField variable char *PyStructSequence_UnnamedField -Objects/typeobject.c - PySuper_Type variable PyTypeObject PySuper_Type -Objects/object.c - _Py_SwappedOp variable int _Py_SwappedOp[] -Python/sysmodule.c - _PySys_ImplCacheTag variable const char *_PySys_ImplCacheTag -Python/sysmodule.c - _PySys_ImplName variable const char *_PySys_ImplName -Modules/_io/textio.c - PyTextIOBase_Type variable PyTypeObject PyTextIOBase_Type -Modules/_io/textio.c - PyTextIOWrapper_Type variable PyTypeObject PyTextIOWrapper_Type -Python/traceback.c - PyTraceBack_Type variable PyTypeObject PyTraceBack_Type -Objects/obmalloc.c - _Py_tracemalloc_config variable struct _PyTraceMalloc_Config _Py_tracemalloc_config -Objects/boolobject.c - _Py_TrueStruct variable static struct _longobject _Py_TrueStruct -Objects/tupleobject.c - PyTupleIter_Type variable PyTypeObject PyTupleIter_Type -Objects/tupleobject.c - PyTuple_Type variable PyTypeObject PyTuple_Type -Objects/tupleobject.c - _Py_tuple_zero_allocs variable Py_ssize_t _Py_tuple_zero_allocs -Objects/typeobject.c - PyType_Type variable PyTypeObject PyType_Type -Python/initconfig.c - Py_UnbufferedStdioFlag variable int Py_UnbufferedStdioFlag -Python/pylifecycle.c - _Py_UnhandledKeyboardInterrupt variable int _Py_UnhandledKeyboardInterrupt -Objects/unicodeobject.c - PyUnicodeIter_Type variable PyTypeObject PyUnicodeIter_Type -Objects/unicodeobject.c - PyUnicode_Type variable PyTypeObject PyUnicode_Type -Python/initconfig.c - Py_UTF8Mode variable int Py_UTF8Mode -Python/initconfig.c - Py_VerboseFlag variable int Py_VerboseFlag -Objects/weakrefobject.c - _PyWeakref_CallableProxyType variable PyTypeObject _PyWeakref_CallableProxyType -Objects/weakrefobject.c - _PyWeakref_ProxyType variable PyTypeObject _PyWeakref_ProxyType -Objects/weakrefobject.c - _PyWeakref_RefType variable PyTypeObject _PyWeakref_RefType -Objects/weakrefobject.c - _PyWeakref_RefType variable PyTypeObject _PyWeakref_RefType -Objects/descrobject.c - PyWrapperDescr_Type variable PyTypeObject PyWrapperDescr_Type -Python/bltinmodule.c - PyZip_Type variable PyTypeObject PyZip_Type -Python/Python-ast.c - Raise_fields variable static const char *Raise_fields[] -Python/Python-ast.c - Raise_type variable static PyTypeObject *Raise_type -Objects/rangeobject.c - range_as_mapping variable static PyMappingMethods range_as_mapping -Objects/rangeobject.c - range_as_number variable static PyNumberMethods range_as_number -Objects/rangeobject.c - range_as_sequence variable static PySequenceMethods range_as_sequence -Objects/rangeobject.c - rangeiter_methods variable static PyMethodDef rangeiter_methods -Objects/rangeobject.c - range_members variable static PyMemberDef range_members[] -Objects/rangeobject.c - range_methods variable static PyMethodDef range_methods -Modules/_io/iobase.c - rawiobase_methods variable static PyMethodDef rawiobase_methods -Python/pylifecycle.c fatal_error reentrant variable static int reentrant -Modules/faulthandler.c faulthandler_dump_traceback reentrant variable static volatile int reentrant -Modules/itertoolsmodule.c - repeat_methods variable static PyMethodDef repeat_methods -Modules/itertoolsmodule.c - repeat_type variable static PyTypeObject repeat_type -Python/Python-ast.c - Return_fields variable static const char *Return_fields[] -Python/compile.c compiler_visit_annotations return_str variable static identifier return_str -Python/Python-ast.c - Return_type variable static PyTypeObject *Return_type -Objects/enumobject.c - reversediter_methods variable static PyMethodDef reversediter_methods -Modules/_threadmodule.c - rlock_methods variable static PyMethodDef rlock_methods -Modules/_threadmodule.c - RLocktype variable static PyTypeObject RLocktype -Objects/typeobject.c slot_nb_add rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_subtract rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_multiply rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_matrix_multiply rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_remainder rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_divmod rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_power_binary rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_lshift rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_rshift rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_and rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_xor rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_or rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_floor_divide rop_id variable _Py_static_string(op_id, OPSTR) -Objects/typeobject.c slot_nb_true_divide rop_id variable _Py_static_string(op_id, OPSTR) -Python/Python-ast.c - RShift_singleton variable static PyObject *RShift_singleton -Python/Python-ast.c - RShift_type variable static PyTypeObject *RShift_type -Python/pylifecycle.c - runtime_initialized variable static int runtime_initialized -Modules/posixmodule.c - ScandirIterator_methods variable static PyMethodDef ScandirIterator_methods -Modules/posixmodule.c - ScandirIteratorType variable static PyTypeObject ScandirIteratorType -Modules/_sre.c - scanner_members variable static PyMemberDef scanner_members[] -Modules/_sre.c - scanner_methods variable static PyMethodDef scanner_methods -Modules/_sre.c - Scanner_Type variable static PyTypeObject Scanner_Type -Modules/posixmodule.c - sched_param_desc variable static PyStructSequence_Desc sched_param_desc -Modules/posixmodule.c - sched_param_fields variable static PyStructSequence_Field sched_param_fields[] -Modules/posixmodule.c - SchedParamType variable static PyTypeObject* SchedParamType -Objects/iterobject.c - seqiter_methods variable static PyMethodDef seqiter_methods -Objects/setobject.c - set_as_number variable static PyNumberMethods set_as_number -Objects/setobject.c - set_as_sequence variable static PySequenceMethods set_as_sequence -Python/symtable.c - setcomp variable static identifier setcomp -Python/Python-ast.c - SetComp_fields variable static const char *SetComp_fields[] -Python/Python-ast.c - SetComp_type variable static PyTypeObject *SetComp_type -Python/Python-ast.c - Set_fields variable static const char *Set_fields[] -Objects/setobject.c - setiter_methods variable static PyMethodDef setiter_methods -Objects/setobject.c - set_methods variable static PyMethodDef set_methods -Python/Python-ast.c - Set_type variable static PyTypeObject *Set_type -Modules/signalmodule.c - SiginfoType variable static PyTypeObject SiginfoType -Modules/signalmodule.c - signal_methods variable static PyMethodDef signal_methods -Modules/signalmodule.c - signalmodule variable static struct PyModuleDef signalmodule -Python/import.c PyImport_Import silly_list variable static PyObject *silly_list -Objects/sliceobject.c - slice_cache variable static PySliceObject *slice_cache -Python/Python-ast.c - Slice_fields variable static const char *Slice_fields[] -Objects/sliceobject.c - slice_members variable static PyMemberDef slice_members[] -Objects/sliceobject.c - slice_methods variable static PyMethodDef slice_methods -Python/Python-ast.c - slice_type variable static PyTypeObject *slice_type -Python/Python-ast.c - Slice_type variable static PyTypeObject *Slice_type -Objects/typeobject.c - slotdefs variable static slotdef slotdefs[] -Objects/typeobject.c - slotdefs_initialized variable static int slotdefs_initialized -Objects/longobject.c - small_ints variable static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS] -Objects/funcobject.c - sm_getsetlist variable static PyGetSetDef sm_getsetlist[] -Objects/funcobject.c - sm_memberlist variable static PyMemberDef sm_memberlist[] -Modules/xxsubtype.c - spamdict_members variable static PyMemberDef spamdict_members[] -Modules/xxsubtype.c - spamdict_methods variable static PyMethodDef spamdict_methods -Modules/xxsubtype.c - spamdict_type variable static PyTypeObject spamdict_type -Modules/xxsubtype.c - spamlist_getsets variable static PyGetSetDef spamlist_getsets[] -Modules/xxsubtype.c - spamlist_methods variable static PyMethodDef spamlist_methods -Modules/xxsubtype.c - spamlist_type variable static PyTypeObject spamlist_type -Modules/_sre.c - sremodule variable static struct PyModuleDef sremodule -Modules/faulthandler.c - stack variable static stack_t stack -Modules/itertoolsmodule.c - starmap_methods variable static PyMethodDef starmap_methods -Modules/itertoolsmodule.c - starmap_type variable static PyTypeObject starmap_type -Python/Python-ast.c - Starred_fields variable static const char *Starred_fields[] -Python/Python-ast.c - Starred_type variable static PyTypeObject *Starred_type -Python/graminit.c - states_0 variable static state states_0[3] -Python/graminit.c - states_1 variable static state states_1[2] -Python/graminit.c - states_10 variable static state states_10[4] -Python/graminit.c - states_11 variable static state states_11[34] -Python/graminit.c - states_12 variable static state states_12[2] -Python/graminit.c - states_13 variable static state states_13[2] -Python/graminit.c - states_14 variable static state states_14[4] -Python/graminit.c - states_15 variable static state states_15[2] -Python/graminit.c - states_16 variable static state states_16[6] -Python/graminit.c - states_17 variable static state states_17[5] -Python/graminit.c - states_18 variable static state states_18[3] -Python/graminit.c - states_19 variable static state states_19[2] -Python/graminit.c - states_2 variable static state states_2[3] -Python/graminit.c - states_20 variable static state states_20[3] -Python/graminit.c - states_21 variable static state states_21[2] -Python/graminit.c - states_22 variable static state states_22[2] -Python/graminit.c - states_23 variable static state states_23[2] -Python/graminit.c - states_24 variable static state states_24[2] -Python/graminit.c - states_25 variable static state states_25[3] -Python/graminit.c - states_26 variable static state states_26[2] -Python/graminit.c - states_27 variable static state states_27[5] -Python/graminit.c - states_28 variable static state states_28[2] -Python/graminit.c - states_29 variable static state states_29[3] -Python/graminit.c - states_3 variable static state states_3[7] -Python/graminit.c - states_30 variable static state states_30[8] -Python/graminit.c - states_31 variable static state states_31[4] -Python/graminit.c - states_32 variable static state states_32[4] -Python/graminit.c - states_33 variable static state states_33[3] -Python/graminit.c - states_34 variable static state states_34[2] -Python/graminit.c - states_35 variable static state states_35[2] -Python/graminit.c - states_36 variable static state states_36[3] -Python/graminit.c - states_37 variable static state states_37[3] -Python/graminit.c - states_38 variable static state states_38[5] -Python/graminit.c - states_39 variable static state states_39[2] -Python/graminit.c - states_4 variable static state states_4[2] -Python/graminit.c - states_40 variable static state states_40[3] -Python/graminit.c - states_41 variable static state states_41[8] -Python/graminit.c - states_42 variable static state states_42[8] -Python/graminit.c - states_43 variable static state states_43[11] -Python/graminit.c - states_44 variable static state states_44[13] -Python/graminit.c - states_45 variable static state states_45[6] -Python/graminit.c - states_46 variable static state states_46[4] -Python/graminit.c - states_47 variable static state states_47[5] -Python/graminit.c - states_48 variable static state states_48[5] -Python/graminit.c - states_49 variable static state states_49[4] -Python/graminit.c - states_5 variable static state states_5[3] -Python/graminit.c - states_50 variable static state states_50[6] -Python/graminit.c - states_51 variable static state states_51[2] -Python/graminit.c - states_52 variable static state states_52[5] -Python/graminit.c - states_53 variable static state states_53[5] -Python/graminit.c - states_54 variable static state states_54[2] -Python/graminit.c - states_55 variable static state states_55[2] -Python/graminit.c - states_56 variable static state states_56[3] -Python/graminit.c - states_57 variable static state states_57[2] -Python/graminit.c - states_58 variable static state states_58[4] -Python/graminit.c - states_59 variable static state states_59[3] -Python/graminit.c - states_6 variable static state states_6[3] -Python/graminit.c - states_60 variable static state states_60[2] -Python/graminit.c - states_61 variable static state states_61[2] -Python/graminit.c - states_62 variable static state states_62[2] -Python/graminit.c - states_63 variable static state states_63[2] -Python/graminit.c - states_64 variable static state states_64[2] -Python/graminit.c - states_65 variable static state states_65[2] -Python/graminit.c - states_66 variable static state states_66[3] -Python/graminit.c - states_67 variable static state states_67[4] -Python/graminit.c - states_68 variable static state states_68[3] -Python/graminit.c - states_69 variable static state states_69[9] -Python/graminit.c - states_7 variable static state states_7[9] -Python/graminit.c - states_70 variable static state states_70[5] -Python/graminit.c - states_71 variable static state states_71[7] -Python/graminit.c - states_72 variable static state states_72[3] -Python/graminit.c - states_73 variable static state states_73[5] -Python/graminit.c - states_74 variable static state states_74[3] -Python/graminit.c - states_75 variable static state states_75[3] -Python/graminit.c - states_76 variable static state states_76[3] -Python/graminit.c - states_77 variable static state states_77[14] -Python/graminit.c - states_78 variable static state states_78[8] -Python/graminit.c - states_79 variable static state states_79[3] -Python/graminit.c - states_8 variable static state states_8[4] -Python/graminit.c - states_80 variable static state states_80[4] -Python/graminit.c - states_81 variable static state states_81[2] -Python/graminit.c - states_82 variable static state states_82[6] -Python/graminit.c - states_83 variable static state states_83[3] -Python/graminit.c - states_84 variable static state states_84[4] -Python/graminit.c - states_85 variable static state states_85[2] -Python/graminit.c - states_86 variable static state states_86[3] -Python/graminit.c - states_87 variable static state states_87[3] -Python/graminit.c - states_88 variable static state states_88[7] -Python/graminit.c - states_89 variable static state states_89[3] -Python/graminit.c - states_9 variable static state states_9[42] -Python/graminit.c - states_90 variable static state states_90[6] -Python/graminit.c - states_91 variable static state states_91[11] -Python/getargs.c - static_arg_parsers variable static struct _PyArg_Parser *static_arg_parsers -Objects/unicodeobject.c - static_strings variable static _Py_Identifier *static_strings -Modules/_stat.c - stat_methods variable static PyMethodDef stat_methods -Modules/_stat.c - statmodule variable static struct PyModuleDef statmodule -Modules/posixmodule.c - stat_result_desc variable static PyStructSequence_Desc stat_result_desc -Modules/posixmodule.c - stat_result_fields variable static PyStructSequence_Field stat_result_fields[] -Modules/posixmodule.c - StatResultType variable static PyTypeObject* StatResultType -Modules/posixmodule.c - statvfs_result_desc variable static PyStructSequence_Desc statvfs_result_desc -Modules/posixmodule.c - statvfs_result_fields variable static PyStructSequence_Field statvfs_result_fields[] -Modules/posixmodule.c - StatVFSResultType variable static PyTypeObject* StatVFSResultType -Objects/fileobject.c - stdprinter_getsetlist variable static PyGetSetDef stdprinter_getsetlist[] -Objects/fileobject.c - stdprinter_methods variable static PyMethodDef stdprinter_methods -Python/symtable.c - ste_memberlist variable static PyMemberDef ste_memberlist[] -Python/Python-ast.c - stmt_attributes variable static const char *stmt_attributes[] -Python/Python-ast.c - stmt_type variable static PyTypeObject *stmt_type -Objects/exceptions.c - StopIteration_members variable static PyMemberDef StopIteration_members[] -Python/Python-ast.c - Store_singleton variable static PyObject *Store_singleton -Python/Python-ast.c - Store_type variable static PyTypeObject *Store_type -Python/ast_unparse.c - _str_close_br variable static PyObject *_str_close_br -Python/ast_unparse.c - _str_dbl_close_br variable static PyObject *_str_dbl_close_br -Python/ast_unparse.c - _str_dbl_open_br variable static PyObject *_str_dbl_open_br -Modules/_threadmodule.c - str_dict variable static PyObject *str_dict -Modules/_io/stringio.c - stringio_getset variable static PyGetSetDef stringio_getset[] -Modules/_io/stringio.c - stringio_methods variable static PyMethodDef stringio_methods -Objects/unicodeobject.c - _string_methods variable static PyMethodDef _string_methods -Objects/unicodeobject.c - _string_module variable static struct PyModuleDef _string_module -Objects/bytesobject.c - striter_methods variable static PyMethodDef striter_methods -Python/ast_unparse.c - _str_open_br variable static PyObject *_str_open_br -Modules/pwdmodule.c - StructPwdType variable static PyTypeObject StructPwdType -Modules/pwdmodule.c - struct_pwd_type_desc variable static PyStructSequence_Desc struct_pwd_type_desc -Modules/pwdmodule.c - struct_pwd_type_fields variable static PyStructSequence_Field struct_pwd_type_fields[] -Modules/posixmodule.c wait_helper struct_rusage variable static PyObject *struct_rusage -Objects/structseq.c - structseq_methods variable static PyMethodDef structseq_methods -Modules/posixmodule.c - structseq_new variable static newfunc structseq_new -Modules/signalmodule.c - struct_siginfo_desc variable static PyStructSequence_Desc struct_siginfo_desc -Modules/signalmodule.c - struct_siginfo_fields variable static PyStructSequence_Field struct_siginfo_fields[] -Modules/timemodule.c - StructTimeType variable static PyTypeObject StructTimeType -Modules/timemodule.c - struct_time_type_desc variable static PyStructSequence_Desc struct_time_type_desc -Modules/timemodule.c - struct_time_type_fields variable static PyStructSequence_Field struct_time_type_fields[] -Python/Python-ast.c - Subscript_fields variable static const char *Subscript_fields[] -Python/Python-ast.c - Subscript_type variable static PyTypeObject *Subscript_type -Python/Python-ast.c - Sub_singleton variable static PyObject *Sub_singleton -Python/Python-ast.c - Sub_type variable static PyTypeObject *Sub_type -Objects/typeobject.c - subtype_getsets_dict_only variable static PyGetSetDef subtype_getsets_dict_only[] -Objects/typeobject.c - subtype_getsets_full variable static PyGetSetDef subtype_getsets_full[] -Objects/typeobject.c - subtype_getsets_weakref_only variable static PyGetSetDef subtype_getsets_weakref_only[] -Python/Python-ast.c - Suite_fields variable static const char *Suite_fields[] -Python/Python-ast.c - Suite_type variable static PyTypeObject *Suite_type -Objects/typeobject.c - super_members variable static PyMemberDef super_members[] -Modules/symtablemodule.c - symtable_methods variable static PyMethodDef symtable_methods -Modules/symtablemodule.c - symtablemodule variable static struct PyModuleDef symtablemodule -Objects/exceptions.c - SyntaxError_members variable static PyMemberDef SyntaxError_members[] -Python/sysmodule.c - sys_methods variable static PyMethodDef sys_methods -Python/sysmodule.c - sysmodule variable static struct PyModuleDef sysmodule -Objects/exceptions.c - SystemExit_members variable static PyMemberDef SystemExit_members[] -Modules/_tracemalloc.c - tables_lock variable static PyThread_type_lock tables_lock -Modules/itertoolsmodule.c - takewhile_reduce_methods variable static PyMethodDef takewhile_reduce_methods -Modules/itertoolsmodule.c - takewhile_type variable static PyTypeObject takewhile_type -Python/pylifecycle.c - _TARGET_LOCALES variable static _LocaleCoercionTarget _TARGET_LOCALES[] -Python/traceback.c - tb_getsetters variable static PyGetSetDef tb_getsetters[] -Python/traceback.c - tb_memberlist variable static PyMemberDef tb_memberlist[] -Python/traceback.c - tb_methods variable static PyMethodDef tb_methods -Modules/itertoolsmodule.c - teedataobject_methods variable static PyMethodDef teedataobject_methods -Modules/itertoolsmodule.c - teedataobject_type variable static PyTypeObject teedataobject_type -Modules/itertoolsmodule.c - tee_methods variable static PyMethodDef tee_methods -Modules/itertoolsmodule.c - tee_type variable static PyTypeObject tee_type -Modules/posixmodule.c - TerminalSize_desc variable static PyStructSequence_Desc TerminalSize_desc -Modules/posixmodule.c - TerminalSize_fields variable static PyStructSequence_Field TerminalSize_fields[] -Modules/posixmodule.c - TerminalSizeType variable static PyTypeObject* TerminalSizeType -Modules/_io/textio.c - textiobase_getset variable static PyGetSetDef textiobase_getset[] -Modules/_io/textio.c - textiobase_methods variable static PyMethodDef textiobase_methods -Modules/_io/textio.c - textiowrapper_getset variable static PyGetSetDef textiowrapper_getset[] -Modules/_io/textio.c - textiowrapper_members variable static PyMemberDef textiowrapper_members[] -Modules/_io/textio.c - textiowrapper_methods variable static PyMethodDef textiowrapper_methods -Modules/faulthandler.c - thread variable static struct { PyObject *file; int fd; PY_TIMEOUT_T timeout_us; int repeat; PyInterpreterState *interp; int exit; char *header; size_t header_len; PyThread_type_lock cancel_event; PyThread_type_lock running; } thread -Python/thread.c - thread_debug variable static int thread_debug -Modules/_threadmodule.c - ThreadError variable static PyObject *ThreadError -Python/thread.c - threadinfo_desc variable static PyStructSequence_Desc threadinfo_desc -Python/thread.c - threadinfo_fields variable static PyStructSequence_Field threadinfo_fields[] -Python/thread.c - ThreadInfoType variable static PyTypeObject ThreadInfoType -Modules/_threadmodule.c - thread_methods variable static PyMethodDef thread_methods -Modules/_threadmodule.c - threadmodule variable static struct PyModuleDef threadmodule -Modules/posixmodule.c - ticks_per_second variable static long ticks_per_second -Modules/timemodule.c _PyTime_GetProcessTimeWithInfo ticks_per_second variable static long ticks_per_second -Modules/timemodule.c - time_methods variable static PyMethodDef time_methods -Modules/timemodule.c - timemodule variable static struct PyModuleDef timemodule -Modules/posixmodule.c - times_result_desc variable static PyStructSequence_Desc times_result_desc -Modules/posixmodule.c - times_result_fields variable static PyStructSequence_Field times_result_fields[] -Modules/posixmodule.c - TimesResultType variable static PyTypeObject* TimesResultType -Python/context.c - _token_missing variable static PyObject *_token_missing -Python/symtable.c - top variable static identifier top -Objects/typeobject.c - tp_new_methoddef variable static struct PyMethodDef tp_new_methoddef[] -Modules/_tracemalloc.c - tracemalloc_empty_traceback variable static traceback_t tracemalloc_empty_traceback -Modules/_tracemalloc.c - tracemalloc_filenames variable static _Py_hashtable_t *tracemalloc_filenames -Modules/_tracemalloc.c - tracemalloc_peak_traced_memory variable static size_t tracemalloc_peak_traced_memory -Modules/_tracemalloc.c - tracemalloc_reentrant_key variable static Py_tss_t tracemalloc_reentrant_key -Modules/_tracemalloc.c - tracemalloc_traceback variable static traceback_t *tracemalloc_traceback -Modules/_tracemalloc.c - tracemalloc_tracebacks variable static _Py_hashtable_t *tracemalloc_tracebacks -Modules/_tracemalloc.c - tracemalloc_traced_memory variable static size_t tracemalloc_traced_memory -Modules/_tracemalloc.c - tracemalloc_traces variable static _Py_hashtable_t *tracemalloc_traces -Objects/boolobject.c - true_str variable static PyObject *true_str -Python/Python-ast.c - Try_fields variable static const char *Try_fields[] -Python/Python-ast.c - Try_type variable static PyTypeObject *Try_type -Objects/tupleobject.c - tuple_as_mapping variable static PyMappingMethods tuple_as_mapping -Objects/tupleobject.c - tuple_as_sequence variable static PySequenceMethods tuple_as_sequence -Python/Python-ast.c - Tuple_fields variable static const char *Tuple_fields[] -Modules/_collectionsmodule.c - tuplegetter_members variable static PyMemberDef tuplegetter_members[] -Modules/_collectionsmodule.c - tuplegetter_methods variable static PyMethodDef tuplegetter_methods -Modules/_collectionsmodule.c - tuplegetter_type variable static PyTypeObject tuplegetter_type -Objects/tupleobject.c - tupleiter_methods variable static PyMethodDef tupleiter_methods -Objects/tupleobject.c - tuple_methods variable static PyMethodDef tuple_methods -Python/Python-ast.c - Tuple_type variable static PyTypeObject *Tuple_type -Objects/typeobject.c - type_getsets variable static PyGetSetDef type_getsets[] -Python/Python-ast.c - TypeIgnore_fields variable static const char *TypeIgnore_fields[] -Python/Python-ast.c - type_ignore_type variable static PyTypeObject *type_ignore_type -Python/Python-ast.c - TypeIgnore_type variable static PyTypeObject *TypeIgnore_type -Objects/typeobject.c - type_members variable static PyMemberDef type_members[] -Objects/typeobject.c - type_methods variable static PyMethodDef type_methods -Python/Python-ast.c - UAdd_singleton variable static PyObject *UAdd_singleton -Python/Python-ast.c - UAdd_type variable static PyTypeObject *UAdd_type -Objects/unicodeobject.c - ucnhash_CAPI variable static _PyUnicode_Name_CAPI *ucnhash_CAPI -Python/codecs.c - ucnhash_CAPI variable static _PyUnicode_Name_CAPI *ucnhash_CAPI -Python/ast.c - u_kind variable static PyObject *u_kind -Modules/posixmodule.c - uname_result_desc variable static PyStructSequence_Desc uname_result_desc -Modules/posixmodule.c - uname_result_fields variable static PyStructSequence_Field uname_result_fields[] -Modules/posixmodule.c - UnameResultType variable static PyTypeObject* UnameResultType -Python/Python-ast.c - UnaryOp_fields variable static const char *UnaryOp_fields[] -Python/Python-ast.c - unaryop_type variable static PyTypeObject *unaryop_type -Python/Python-ast.c - UnaryOp_type variable static PyTypeObject *UnaryOp_type -Objects/unicodeobject.c - unicode_as_mapping variable static PyMappingMethods unicode_as_mapping -Objects/unicodeobject.c - unicode_as_number variable static PyNumberMethods unicode_as_number -Objects/unicodeobject.c - unicode_as_sequence variable static PySequenceMethods unicode_as_sequence -Objects/unicodeobject.c - unicode_empty variable static PyObject *unicode_empty -Objects/exceptions.c - UnicodeError_members variable static PyMemberDef UnicodeError_members[] -Objects/unicodeobject.c - unicodeiter_methods variable static PyMethodDef unicodeiter_methods -Objects/unicodeobject.c - unicode_latin1 variable static PyObject *unicode_latin1[256] -Objects/unicodeobject.c - unicode_methods variable static PyMethodDef unicode_methods -Modules/_tracemalloc.c - unknown_filename variable static PyObject *unknown_filename -Python/errors.c - UnraisableHookArgs_desc variable static PyStructSequence_Desc UnraisableHookArgs_desc -Python/errors.c - UnraisableHookArgs_fields variable static PyStructSequence_Field UnraisableHookArgs_fields[] -Python/errors.c - UnraisableHookArgsType variable static PyTypeObject UnraisableHookArgsType -Objects/obmalloc.c - unused_arena_objects variable static struct arena_object* unused_arena_objects -Python/bootstrap_hash.c - urandom_cache variable static struct { int fd; dev_t st_dev; ino_t st_ino; } urandom_cache -Objects/obmalloc.c - usable_arenas variable static struct arena_object* usable_arenas -Objects/obmalloc.c - usedpools variable static poolp usedpools[2 * ((NB_SMALL_SIZE_CLASSES + 7) / 8) * 8] -Modules/faulthandler.c - user_signals variable static user_signal_t *user_signals -Python/Python-ast.c - USub_singleton variable static PyObject *USub_singleton -Python/Python-ast.c - USub_type variable static PyTypeObject *USub_type -Python/getversion.c Py_GetVersion version variable static char version[250] -Python/sysmodule.c - version_info_desc variable static PyStructSequence_Desc version_info_desc -Python/sysmodule.c - version_info_fields variable static PyStructSequence_Field version_info_fields[] -Python/sysmodule.c - VersionInfoType variable static PyTypeObject VersionInfoType -Modules/posixmodule.c - waitid_result_desc variable static PyStructSequence_Desc waitid_result_desc -Modules/posixmodule.c - waitid_result_fields variable static PyStructSequence_Field waitid_result_fields[] -Modules/posixmodule.c - WaitidResultType variable static PyTypeObject* WaitidResultType -Modules/signalmodule.c - wakeup variable static volatile struct { SOCKET_T fd; int warn_on_full_buffer; int use_send; } wakeup -Python/_warnings.c - warnings_functions variable static PyMethodDef warnings_functions[] -Python/_warnings.c - warningsmodule variable static struct PyModuleDef warningsmodule -Modules/_weakref.c - weakref_functions variable static PyMethodDef weakref_functions -Objects/weakrefobject.c - weakref_members variable static PyMemberDef weakref_members[] -Modules/_weakref.c - weakrefmodule variable static struct PyModuleDef weakrefmodule -Python/sysmodule.c - whatstrings variable static PyObject *whatstrings[8] -Python/Python-ast.c - While_fields variable static const char *While_fields[] -Python/Python-ast.c - While_type variable static PyTypeObject *While_type -Python/Python-ast.c - With_fields variable static const char *With_fields[] -Python/Python-ast.c - withitem_fields variable static const char *withitem_fields[] -Python/Python-ast.c - withitem_type variable static PyTypeObject *withitem_type -Python/Python-ast.c - With_type variable static PyTypeObject *With_type -Objects/descrobject.c - wrapperdescr_getset variable static PyGetSetDef wrapperdescr_getset[] -Objects/descrobject.c - wrapper_getsets variable static PyGetSetDef wrapper_getsets[] -Objects/descrobject.c - wrapper_members variable static PyMemberDef wrapper_members[] -Objects/descrobject.c - wrapper_methods variable static PyMethodDef wrapper_methods -Modules/_threadmodule.c local_new wr_callback_def variable static PyMethodDef wr_callback_def -Modules/xxsubtype.c - xxsubtype_functions variable static PyMethodDef xxsubtype_functions[] -Modules/xxsubtype.c - xxsubtypemodule variable static struct PyModuleDef xxsubtypemodule -Modules/xxsubtype.c - xxsubtype_slots variable static struct PyModuleDef_Slot xxsubtype_slots[] -Python/Python-ast.c - Yield_fields variable static const char *Yield_fields[] -Python/Python-ast.c - YieldFrom_fields variable static const char *YieldFrom_fields[] -Python/Python-ast.c - YieldFrom_type variable static PyTypeObject *YieldFrom_type -Python/Python-ast.c - Yield_type variable static PyTypeObject *Yield_type -Modules/itertoolsmodule.c - zip_longest_methods variable static PyMethodDef zip_longest_methods -Modules/itertoolsmodule.c - ziplongest_type variable static PyTypeObject ziplongest_type -Python/bltinmodule.c - zip_methods variable static PyMethodDef zip_methods From ab98bd54ab49c255e56ea3d3f6f572f1128b7960 Mon Sep 17 00:00:00 2001 From: Christopher Marchfelder Date: Fri, 23 Oct 2020 12:08:24 +0200 Subject: [PATCH 0353/1261] bpo-40592: shutil.which will not return None anymore if ; is the last char in PATHEXT (GH-20088) shutil.which will not return None anymore for empty str in PATHEXT Empty PATHEXT will now be defaulted to _WIN_DEFAULT_PATHEXT --- Lib/shutil.py | 7 ++++++- Lib/test/test_shutil.py | 17 +++++++++++++++++ .../2020-05-14-16-01-34.bpo-40592.Cmk855.rst | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-05-14-16-01-34.bpo-40592.Cmk855.rst diff --git a/Lib/shutil.py b/Lib/shutil.py index a4ce2c0290bc93..223e9a8a705064 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -53,6 +53,9 @@ _USE_CP_SENDFILE = hasattr(os, "sendfile") and sys.platform.startswith("linux") _HAS_FCOPYFILE = posix and hasattr(posix, "_fcopyfile") # macOS +# CMD defaults in Windows 10 +_WIN_DEFAULT_PATHEXT = ".COM;.EXE;.BAT;.CMD;.VBS;.JS;.WS;.MSC" + __all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", "copytree", "move", "rmtree", "Error", "SpecialFileError", "ExecError", "make_archive", "get_archive_formats", @@ -1415,7 +1418,9 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None): path.insert(0, curdir) # PATHEXT is necessary to check on Windows. - pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + pathext_source = os.getenv("PATHEXT") or _WIN_DEFAULT_PATHEXT + pathext = [ext for ext in pathext_source.split(os.pathsep) if ext] + if use_bytes: pathext = [os.fsencode(ext) for ext in pathext] # See if the given file matches any of the expected path extensions. diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 06ca50af143379..890f2c7d406c24 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -1849,6 +1849,23 @@ def test_pathext(self): rv = shutil.which(program, path=self.temp_dir) self.assertEqual(rv, temp_filexyz.name) + # Issue 40592: See https://bugs.python.org/issue40592 + @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') + def test_pathext_with_empty_str(self): + ext = ".xyz" + temp_filexyz = tempfile.NamedTemporaryFile(dir=self.temp_dir, + prefix="Tmp2", suffix=ext) + self.addCleanup(temp_filexyz.close) + + # strip path and extension + program = os.path.basename(temp_filexyz.name) + program = os.path.splitext(program)[0] + + with os_helper.EnvironmentVarGuard() as env: + env['PATHEXT'] = f"{ext};" # note the ; + rv = shutil.which(program, path=self.temp_dir) + self.assertEqual(rv, temp_filexyz.name) + class TestWhichBytes(TestWhich): def setUp(self): diff --git a/Misc/NEWS.d/next/Library/2020-05-14-16-01-34.bpo-40592.Cmk855.rst b/Misc/NEWS.d/next/Library/2020-05-14-16-01-34.bpo-40592.Cmk855.rst new file mode 100644 index 00000000000000..3211a1bc345fa5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-05-14-16-01-34.bpo-40592.Cmk855.rst @@ -0,0 +1 @@ +:func:`shutil.which` now ignores empty entries in :envvar:`PATHEXT` instead of treating them as a match. From e2d6cdb1d841182a9bc9ed5c73273723c9c4ed68 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Fri, 23 Oct 2020 13:05:48 +0100 Subject: [PATCH 0354/1261] Add Mark Shannon to CODEOWNERS. (#22914) --- .github/CODEOWNERS | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5b8662cfe09218..8c76f54af5504a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -9,10 +9,16 @@ # Core **/*context* @1st1 -**/*genobject* @1st1 +**/*genobject* @1st1 @markshannon **/*hamt* @1st1 Objects/set* @rhettinger -Objects/dict* @methane +Objects/dict* @methane @markshannon +Objects/type* @markshannon +Objects/codeobject.c @markshannon +Objects/frameobject.c @markshannon +Objects/call.c @markshannon +Python/ceval.c @markshannon +Python/compile.c @markshannon # Hashing **/*hashlib* @python/crypto-team @tiran From 64e2aa0072537195bfb3f7f9ae0089a68f9218f1 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 23 Oct 2020 08:23:58 -0700 Subject: [PATCH 0355/1261] Add GitHub sponsor info for Python (GH-22887) Sponsor Python on GitHub --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 36c4e2771843e4..b08459313accf6 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1,2 @@ custom: https://www.python.org/psf/donations/python-dev/ +github: [python] From 3a0ce2f98e7b4354bcbcca20e4ffb11dba6e6967 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 23 Oct 2020 12:55:39 -0700 Subject: [PATCH 0356/1261] Create a primer section for the descriptor howto guide (GH-22906) --- Doc/glossary.rst | 3 +- Doc/howto/descriptor.rst | 552 +++++++++++++++++++++++++++++++++---- Doc/tools/susp-ignored.csv | 3 + 3 files changed, 499 insertions(+), 59 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 4f0654b3254e4b..32aa12a200f636 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -301,7 +301,8 @@ Glossary including functions, methods, properties, class methods, static methods, and reference to super classes. - For more information about descriptors' methods, see :ref:`descriptors`. + For more information about descriptors' methods, see :ref:`descriptors` + or the :ref:`Descriptor How To Guide `. dictionary An associative array, where arbitrary keys are mapped to values. The diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index b792b6c6ab77f2..4a53b9e6156922 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -1,3 +1,5 @@ +.. _descriptorhowto: + ====================== Descriptor HowTo Guide ====================== @@ -7,6 +9,415 @@ Descriptor HowTo Guide .. Contents:: + +:term:`Descriptors ` let objects customize attribute lookup, +storage, and deletion. + +This HowTo guide has three major sections: + +1) The "primer" gives a basic overview, moving gently from simple examples, + adding one feature at a time. It is a great place to start. + +2) The second section shows a complete, practical descriptor example. If you + already know the basics, start there. + +3) The third section provides a more technical tutorial that goes into the + detailed mechanics of how descriptors work. Most people don't need this + level of detail. + + +Primer +^^^^^^ + +In this primer, we start with most basic possible example and then we'll add +new capabilities one by one. + + +Simple example: A descriptor that returns a constant +---------------------------------------------------- + +The :class:`Ten` class is a descriptor that always returns the constant ``10``:: + + + class Ten: + def __get__(self, obj, objtype=None): + return 10 + +To use the descriptor, it must be stored as a class variable in another class:: + + class A: + x = 5 # Regular class attribute + y = Ten() # Descriptor + +An interactive session shows the difference between normal attribute lookup +and descriptor lookup:: + + >>> a = A() # Make an instance of class A + >>> a.x # Normal attribute lookup + 5 + >>> a.y # Descriptor lookup + 10 + +In the ``a.x`` attribute lookup, the dot operator finds the value ``5`` stored +in the class dictionary. In the ``a.y`` descriptor lookup, the dot operator +calls the descriptor's :meth:`__get__()` method. That method returns ``10``. +Note that the value ``10`` is not stored in either the class dictionary or the +instance dictionary. Instead, the value ``10`` is computed on demand. + +This example shows how a simple descriptor works, but it isn't very useful. +For retrieving constants, normal attribute lookup would be better. + +In the next section, we'll create something more useful, a dynamic lookup. + + +Dynamic lookups +--------------- + +Interesting descriptors typically run computations instead of doing lookups:: + + + import os + + class DirectorySize: + + def __get__(self, obj, objtype=None): + return len(os.listdir(obj.dirname)) + + class Directory: + + size = DirectorySize() # Descriptor + + def __init__(self, dirname): + self.dirname = dirname # Regular instance attribute + +An interactive session shows that the lookup is dynamic — it computes +different, updated answers each time:: + + >>> g = Directory('games') + >>> s = Directory('songs') + >>> g.size # The games directory has three files + 3 + >>> os.system('touch games/newfile') # Add a fourth file to the directory + 0 + >>> g.size + 4 + >>> s.size # The songs directory has twenty files + 20 + +Besides showing how descriptors can run computations, this example also +reveals the purpose of the parameters to :meth:`__get__`. The *self* +parameter is *size*, an instance of *DirectorySize*. The *obj* parameter is +either *g* or *s*, an instance of *Directory*. It is *obj* parameter that +lets the :meth:`__get__` method learn the target directory. The *objtype* +parameter is the class *Directory*. + + +Managed attributes +------------------ + +A popular use for descriptors is managing access to instance data. The +descriptor is assigned to a public attribute in the class dictionary while the +actual data is stored as a private attribute in the instance dictionary. The +descriptor's :meth:`__get__` and :meth:`__set__` methods are triggered when +the public attribute is accessed. + +In the following example, *age* is the public attribute and *_age* is the +private attribute. When the public attribute is accessed, the descriptor logs +the lookup or update:: + + import logging + + logging.basicConfig(level=logging.INFO) + + class LoggedAgeAccess: + + def __get__(self, obj, objtype=None): + value = obj._age + logging.info('Accessing %r giving %r', 'age', value) + return value + + def __set__(self, obj, value): + logging.info('Updating %r to %r', 'age', value) + obj._age = value + + class Person: + + age = LoggedAgeAccess() # Descriptor + + def __init__(self, name, age): + self.name = name # Regular instance attribute + self.age = age # Calls the descriptor + + def birthday(self): + self.age += 1 # Calls both __get__() and __set__() + + +An interactive session shows that all access to the managed attribute *age* is +logged, but that the regular attribute *name* is not logged:: + + >>> mary = Person('Mary M', 30) # The initial age update is logged + INFO:root:Updating 'age' to 30 + >>> dave = Person('David D', 40) + INFO:root:Updating 'age' to 40 + + >>> vars(mary) # The actual data is in a private attribute + {'name': 'Mary M', '_age': 30} + >>> vars(dave) + {'name': 'David D', '_age': 40} + + >>> mary.age # Access the data and log the lookup + INFO:root:Accessing 'age' giving 30 + 30 + >>> mary.birthday() # Updates are logged as well + INFO:root:Accessing 'age' giving 30 + INFO:root:Updating 'age' to 31 + + >>> dave.name # Regular attribute lookup isn't logged + 'David D' + >>> dave.age # Only the managed attribute is logged + INFO:root:Accessing 'age' giving 40 + 40 + +One major issue with this example is the private name *_age* is hardwired in +the *LoggedAgeAccess* class. That means that each instance can only have one +logged attribute and that its name is unchangeable. In the next example, +we'll fix that problem. + + +Customized Names +---------------- + +When a class uses descriptors, it can inform each descriptor about what +variable name was used. + +In this example, the :class:`Person` class has two descriptor instances, +*name* and *age*. When the :class:`Person` class is defined, it makes a +callback to :meth:`__set_name__` in *LoggedAccess* so that the field names can +be recorded, giving each descriptor its own *public_name* and *private_name*:: + + import logging + + logging.basicConfig(level=logging.INFO) + + class LoggedAccess: + + def __set_name__(self, owner, name): + self.public_name = name + self.private_name = f'_{name}' + + def __get__(self, obj, objtype=None): + value = getattr(obj, self.private_name) + logging.info('Accessing %r giving %r', self.public_name, value) + return value + + def __set__(self, obj, value): + logging.info('Updating %r to %r', self.public_name, value) + setattr(obj, self.private_name, value) + + class Person: + + name = LoggedAccess() # First descriptor + age = LoggedAccess() # Second descriptor + + def __init__(self, name, age): + self.name = name # Calls the first descriptor + self.age = age # Calls the second descriptor + + def birthday(self): + self.age += 1 + +An interactive session shows that the :class:`Person` class has called +:meth:`__set_name__` so that the field names would be recorded. Here +we call :func:`vars` to lookup the descriptor without triggering it:: + + >>> vars(vars(Person)['name']) + {'public_name': 'name', 'private_name': '_name'} + >>> vars(vars(Person)['age']) + {'public_name': 'age', 'private_name': '_age'} + +The new class now logs access to both *name* and *age*:: + + >>> pete = Person('Peter P', 10) + INFO:root:Updating 'name' to 'Peter P' + INFO:root:Updating 'age' to 10 + >>> kate = Person('Catherine C', 20) + INFO:root:Updating 'name' to 'Catherine C' + INFO:root:Updating 'age' to 20 + +The two *Person* instances contain only the private names:: + + >>> vars(pete) + {'_name': 'Peter P', '_age': 10} + >>> vars(kate) + {'_name': 'Catherine C', '_age': 20} + + +Closing thoughts +---------------- + +A :term:`descriptor` is what we call any object that defines :meth:`__get__`, +:meth:`__set__`, or :meth:`__delete__`. + +Descriptors get invoked by the dot operator during attribute lookup. If a +descriptor is accessed indirectly with ``vars(some_class)[descriptor_name]``, +the descriptor instance is returned without invoking it. + +Descriptors only work when used as class variables. When put in instances, +they have no effect. + +The main motivation for descriptors is to provide a hook allowing objects +stored in class variables to control what happens during dotted lookup. + +Traditionally, the calling class controls what happens during lookup. +Descriptors invert that relationship and allow the data being looked-up to +have a say in the matter. + +Descriptors are used throughout the language. It is how functions turn into +bound methods. Common tools like :func:`classmethod`, :func:`staticmethod`, +:func:`property`, and :func:`functools.cached_property` are all implemented as +descriptors. + + +Complete Practical Example +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, we create a practical and powerful tool for locating +notoriously hard to find data corruption bugs. + + +Validator class +--------------- + +A validator is a descriptor for managed attribute access. Prior to storing +any data, it verifies that the new value meets various type and range +restrictions. If those restrictions aren't met, it raises an exception to +prevents data corruption at its source. + +This :class:`Validator` class is both an :term:`abstract base class` and a +managed attribute descriptor:: + + from abc import ABC, abstractmethod + + class Validator(ABC): + + def __set_name__(self, owner, name): + self.private_name = f'_{name}' + + def __get__(self, obj, objtype=None): + return getattr(obj, self.private_name) + + def __set__(self, obj, value): + self.validate(value) + setattr(obj, self.private_name, value) + + @abstractmethod + def validate(self, value): + pass + +Custom validators need to subclass from :class:`Validator` and supply a +:meth:`validate` method to test various restrictions as needed. + + +Custom validators +----------------- + +Here are three practical data validation utilities: + +1) :class:`OneOf` verifies that a value is one of a restricted set of options. + +2) :class:`Number` verifies that a value is either an :class:`int` or + :class:`float`. Optionally, it verifies that a value is between a given + minimum or maximum. + +3) :class:`String` verifies that a value is a :class:`str`. Optionally, it + validates a given minimum or maximum length. Optionally, it can test for + another predicate as well. + +:: + + class OneOf(Validator): + + def __init__(self, *options): + self.options = set(options) + + def validate(self, value): + if value not in self.options: + raise ValueError(f'Expected {value!r} to be one of {self.options!r}') + + class Number(Validator): + + def __init__(self, minvalue=None, maxvalue=None): + self.minvalue = minvalue + self.maxvalue = maxvalue + + def validate(self, value): + if not isinstance(value, (int, float)): + raise TypeError(f'Expected {value!r} to be an int or float') + if self.minvalue is not None and value < self.minvalue: + raise ValueError( + f'Expected {value!r} to be at least {self.minvalue!r}' + ) + if self.maxvalue is not None and value > self.maxvalue: + raise ValueError( + f'Expected {value!r} to be no more than {self.maxvalue!r}' + ) + + class String(Validator): + + def __init__(self, minsize=None, maxsize=None, predicate=None): + self.minsize = minsize + self.maxsize = maxsize + self.predicate = predicate + + def validate(self, value): + if not isinstance(value, str): + raise TypeError(f'Expected {value!r} to be an str') + if self.minsize is not None and len(value) < self.minsize: + raise ValueError( + f'Expected {value!r} to be no smaller than {self.minsize!r}' + ) + if self.maxsize is not None and len(value) > self.maxsize: + raise ValueError( + f'Expected {value!r} to be no bigger than {self.maxsize!r}' + ) + if self.predicate is not None and not self.predicate(value): + raise ValueError( + f'Expected {self.predicate} to be true for {value!r}' + ) + + +Practical use +------------- + +Here's how the data validators can be used in a real class:: + + class Component: + + name = String(minsize=3, maxsize=10, predicate=str.isupper) + kind = OneOf('plastic', 'metal') + quantity = Number(minvalue=0) + + def __init__(self, name, kind, quantity): + self.name = name + self.kind = kind + self.quantity = quantity + +The descriptors prevent invalid instances from being created:: + + Component('WIDGET', 'metal', 5) # Allowed. + Component('Widget', 'metal', 5) # Blocked: 'Widget' is not all uppercase + Component('WIDGET', 'metle', 5) # Blocked: 'metle' is misspelled + Component('WIDGET', 'metal', -5) # Blocked: -5 is negative + Component('WIDGET', 'metal', 'V') # Blocked: 'V' isn't a number + + +Technical Tutorial +^^^^^^^^^^^^^^^^^^ + +What follows is a more technical tutorial for the mechanics and details of how +descriptors work. + + Abstract -------- @@ -39,10 +450,10 @@ Where this occurs in the precedence chain depends on which descriptor methods were defined. Descriptors are a powerful, general purpose protocol. They are the mechanism -behind properties, methods, static methods, class methods, and :func:`super()`. -They are used throughout Python itself to implement the new style classes -introduced in version 2.2. Descriptors simplify the underlying C-code and offer -a flexible set of new tools for everyday Python programs. +behind properties, methods, static methods, class methods, and +:func:`super()`. They are used throughout Python itself. Descriptors +simplify the underlying C code and offer a flexible set of new tools for +everyday Python programs. Descriptor Protocol @@ -132,11 +543,29 @@ The implementation details are in :c:func:`super_getattro()` in The details above show that the mechanism for descriptors is embedded in the :meth:`__getattribute__()` methods for :class:`object`, :class:`type`, and :func:`super`. Classes inherit this machinery when they derive from -:class:`object` or if they have a meta-class providing similar functionality. +:class:`object` or if they have a metaclass providing similar functionality. Likewise, classes can turn-off descriptor invocation by overriding :meth:`__getattribute__()`. +Automatic Name Notification +--------------------------- + +Sometimes it is desirable for a descriptor to know what class variable name it +was assigned to. When a new class is created, the :class:`type` metaclass +scans the dictionary of the new class. If any of the entries are descriptors +and if they define :meth:`__set_name__`, that method is called with two +arguments. The *owner* is the class where the descriptor is used, the *name* +is class variable the descriptor was assigned to. + +The implementation details are in :c:func:`type_new()` and +:c:func:`set_names()` in :source:`Objects/typeobject.c`. + +Since the update logic is in :meth:`type.__new__`, notifications only take +place at the time of class creation. If descriptors are added to the class +afterwards, :meth:`__set_name__` will need to be called manually. + + Descriptor Example ------------------ @@ -154,7 +583,7 @@ descriptor is useful for monitoring just a few chosen attributes:: self.val = initval self.name = name - def __get__(self, obj, objtype): + def __get__(self, obj, objtype=None): print('Retrieving', self.name) return self.val @@ -162,11 +591,11 @@ descriptor is useful for monitoring just a few chosen attributes:: print('Updating', self.name) self.val = val - >>> class MyClass: - ... x = RevealAccess(10, 'var "x"') - ... y = 5 - ... - >>> m = MyClass() + class B: + x = RevealAccess(10, 'var "x"') + y = 5 + + >>> m = B() >>> m.x Retrieving var "x" 10 @@ -251,12 +680,13 @@ affect existing client code accessing the attribute directly. The solution is to wrap access to the value attribute in a property data descriptor:: class Cell: - . . . - def getvalue(self): + ... + + @property + def value(self): "Recalculate the cell before returning value" self.recalc() return self._value - value = property(getvalue) Functions and Methods @@ -278,42 +708,48 @@ non-data descriptors which return bound methods when they are invoked from an object. In pure Python, it works like this:: class Function: - . . . + ... + def __get__(self, obj, objtype=None): "Simulate func_descr_get() in Objects/funcobject.c" if obj is None: return self return types.MethodType(self, obj) -Running the interpreter shows how the function descriptor works in practice:: +Running the following in class in the interpreter shows how the function +descriptor works in practice:: - >>> class D: - ... def f(self, x): - ... return x - ... - >>> d = D() + class D: + def f(self, x): + return x + +Access through the class dictionary does not invoke :meth:`__get__`. Instead, +it just returns the underlying function object:: - # Access through the class dictionary does not invoke __get__. - # It just returns the underlying function object. >>> D.__dict__['f'] - # Dotted access from a class calls __get__() which just returns - # the underlying function unchanged. +Dotted access from a class calls :meth:`__get__` which just returns the +underlying function unchanged:: + >>> D.f - # The function has a __qualname__ attribute to support introspection +The function has a :term:`qualified name` attribute to support introspection:: + >>> D.f.__qualname__ 'D.f' - # Dotted access from an instance calls __get__() which returns the - # function wrapped in a bound method object +Dotted access from an instance calls :meth:`__get__` which returns a bound +method object:: + + >>> d = D() >>> d.f > - # Internally, the bound method stores the underlying function and - # the bound instance. +Internally, the bound method stores the underlying function and the bound +instance:: + >>> d.f.__func__ >>> d.f.__self__ @@ -328,20 +764,20 @@ patterns of binding functions into methods. To recap, functions have a :meth:`__get__` method so that they can be converted to a method when accessed as attributes. The non-data descriptor transforms an -``obj.f(*args)`` call into ``f(obj, *args)``. Calling ``klass.f(*args)`` +``obj.f(*args)`` call into ``f(obj, *args)``. Calling ``cls.f(*args)`` becomes ``f(*args)``. This chart summarizes the binding and its two most useful variants: +-----------------+----------------------+------------------+ | Transformation | Called from an | Called from a | - | | Object | Class | + | | object | class | +=================+======================+==================+ | function | f(obj, \*args) | f(\*args) | +-----------------+----------------------+------------------+ | staticmethod | f(\*args) | f(\*args) | +-----------------+----------------------+------------------+ - | classmethod | f(type(obj), \*args) | f(klass, \*args) | + | classmethod | f(type(obj), \*args) | f(cls, \*args) | +-----------------+----------------------+------------------+ Static methods return the underlying function without changes. Calling either @@ -365,11 +801,11 @@ It can be called either from an object or the class: ``s.erf(1.5) --> .9332`` o Since staticmethods return the underlying function with no changes, the example calls are unexciting:: - >>> class E: - ... def f(x): - ... print(x) - ... f = staticmethod(f) - ... + class E: + @staticmethod + def f(x): + print(x) + >>> E.f(3) 3 >>> E().f(3) @@ -391,32 +827,33 @@ Unlike static methods, class methods prepend the class reference to the argument list before calling the function. This format is the same for whether the caller is an object or a class:: - >>> class E: - ... def f(klass, x): - ... return klass.__name__, x - ... f = classmethod(f) - ... - >>> print(E.f(3)) - ('E', 3) - >>> print(E().f(3)) - ('E', 3) + class F: + @classmethod + def f(cls, x): + return cls.__name__, x + + >>> print(F.f(3)) + ('F', 3) + >>> print(F().f(3)) + ('F', 3) This behavior is useful whenever the function only needs to have a class -reference and does not care about any underlying data. One use for classmethods -is to create alternate class constructors. In Python 2.3, the classmethod +reference and does not care about any underlying data. One use for +classmethods is to create alternate class constructors. The classmethod :func:`dict.fromkeys` creates a new dictionary from a list of keys. The pure Python equivalent is:: class Dict: - . . . - def fromkeys(klass, iterable, value=None): + ... + + @classmethod + def fromkeys(cls, iterable, value=None): "Emulate dict_fromkeys() in Objects/dictobject.c" - d = klass() + d = cls() for key in iterable: d[key] = value return d - fromkeys = classmethod(fromkeys) Now a new dictionary of unique keys can be constructed like this:: @@ -432,10 +869,9 @@ Using the non-data descriptor protocol, a pure Python version of def __init__(self, f): self.f = f - def __get__(self, obj, klass=None): - if klass is None: - klass = type(obj) + def __get__(self, obj, cls=None): + if cls is None: + cls = type(obj) def newfunc(*args): - return self.f(klass, *args) + return self.f(cls, *args) return newfunc - diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 99d6decc4ece17..b15fd32b357f03 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -23,6 +23,9 @@ howto/curses,,:blue,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white. howto/curses,,:magenta,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white. The" howto/curses,,:cyan,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white. The" howto/curses,,:white,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white. The" +howto/descriptor,,:root,"INFO:root" +howto/descriptor,,:Updating,"root:Updating" +howto/descriptor,,:Accessing,"root:Accessing" howto/instrumentation,,::,python$target:::function-entry howto/instrumentation,,:function,python$target:::function-entry howto/instrumentation,,::,python$target:::function-return From 8ce19249b17b7786e4542e03955fbafa30583480 Mon Sep 17 00:00:00 2001 From: John Losito Date: Fri, 23 Oct 2020 17:06:13 -0400 Subject: [PATCH 0357/1261] Allow dependabot to check GitHub actions monthly (GH-22787) Let Dependabot update GitHub Actions dependency once a month. Here's reference to the dependabot configs. https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/keeping-your-actions-up-to-date-with-github-dependabot --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000000..8ac6b8c4984dcd --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" From 2348349992bc49bee9e808b67fbe082afe1f0e60 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2020 14:29:41 -0700 Subject: [PATCH 0358/1261] build(deps): bump actions/cache from v1 to v2.1.2 (GH-22919) Bumps [actions/cache](https://github.com/actions/cache) from v1 to v2.1.2.
    Release notes

    Sourced from actions/cache's releases.

    v2.1.2

    • Adds input to limit the chunk upload size, useful for self-hosted runners with slower upload speeds
    • No-op when executing on GHES
    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Automerge-Triggered-By: GH:Mariatta --- .github/workflows/build.yml | 2 +- .github/workflows/coverage.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index df68fe271de7a8..d00c227182f61a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -106,7 +106,7 @@ jobs: run: sudo ./.github/workflows/posix-deps-apt.sh - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache@v1 + uses: actions/cache@v2.1.2 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 035348e8a69325..ed71a012395d4f 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -32,7 +32,7 @@ jobs: run: sudo ./.github/workflows/posix-deps-apt.sh - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache@v1 + uses: actions/cache@v2.1.2 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} From d2d4857c5b71e4eb67445d8a6b54491192c58f16 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2020 14:32:12 -0700 Subject: [PATCH 0359/1261] build(deps): bump actions/upload-artifact from v1 to v2.2.0 (GH-22920) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from v1 to v2.2.0.
    Release notes

    Sourced from actions/upload-artifact's releases.

    v2.2.0

    • Support for artifact retention
    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Automerge-Triggered-By: GH:Mariatta --- .github/workflows/doc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 88c9cbd797ab2d..7c6012eed4f2d2 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -38,7 +38,7 @@ jobs: - name: 'Build documentation' run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" doctest suspicious html - name: 'Upload' - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v2.2.0 with: name: doc-html path: Doc/build/html From 3f1f4c7f992bcabb19a25de1573af110c6bc31ca Mon Sep 17 00:00:00 2001 From: Jacob Neil Taylor Date: Sat, 24 Oct 2020 09:48:55 +1100 Subject: [PATCH 0360/1261] bpo-38976: Add support for HTTP Only flag in MozillaCookieJar (#17471) Add support for HTTP Only flag in MozillaCookieJar Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- Lib/http/cookiejar.py | 40 ++++++++++++------- Lib/test/test_http_cookiejar.py | 5 +++ .../2019-12-05-05-22-49.bpo-38976.5MG7Uu.rst | 4 ++ 3 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-05-05-22-49.bpo-38976.5MG7Uu.rst diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index 47ed5c3d64ab7d..eaa76c26b9c591 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -50,10 +50,18 @@ def _debug(*args): logger = logging.getLogger("http.cookiejar") return logger.debug(*args) - +HTTPONLY_ATTR = "HTTPOnly" +HTTPONLY_PREFIX = "#HttpOnly_" DEFAULT_HTTP_PORT = str(http.client.HTTP_PORT) +NETSCAPE_MAGIC_RGX = re.compile("#( Netscape)? HTTP Cookie File") MISSING_FILENAME_TEXT = ("a filename was not supplied (nor was the CookieJar " "instance initialised with one)") +NETSCAPE_HEADER_TEXT = """\ +# Netscape HTTP Cookie File +# http://curl.haxx.se/rfc/cookie_spec.html +# This is a generated file! Do not edit. + +""" def _warn_unhandled_exception(): # There are a few catch-all except: statements in this module, for @@ -2004,19 +2012,11 @@ class MozillaCookieJar(FileCookieJar): header by default (Mozilla can cope with that). """ - magic_re = re.compile("#( Netscape)? HTTP Cookie File") - header = """\ -# Netscape HTTP Cookie File -# http://curl.haxx.se/rfc/cookie_spec.html -# This is a generated file! Do not edit. - -""" def _really_load(self, f, filename, ignore_discard, ignore_expires): now = time.time() - magic = f.readline() - if not self.magic_re.search(magic): + if not NETSCAPE_MAGIC_RGX.match(f.readline()): raise LoadError( "%r does not look like a Netscape format cookies file" % filename) @@ -2024,8 +2024,17 @@ def _really_load(self, f, filename, ignore_discard, ignore_expires): try: while 1: line = f.readline() + rest = {} + if line == "": break + # httponly is a cookie flag as defined in rfc6265 + # when encoded in a netscape cookie file, + # the line is prepended with "#HttpOnly_" + if line.startswith(HTTPONLY_PREFIX): + rest[HTTPONLY_ATTR] = "" + line = line[len(HTTPONLY_PREFIX):] + # last field may be absent, so keep any trailing tab if line.endswith("\n"): line = line[:-1] @@ -2063,7 +2072,7 @@ def _really_load(self, f, filename, ignore_discard, ignore_expires): discard, None, None, - {}) + rest) if not ignore_discard and c.discard: continue if not ignore_expires and c.is_expired(now): @@ -2083,16 +2092,17 @@ def save(self, filename=None, ignore_discard=False, ignore_expires=False): else: raise ValueError(MISSING_FILENAME_TEXT) with open(filename, "w") as f: - f.write(self.header) + f.write(NETSCAPE_HEADER_TEXT) now = time.time() for cookie in self: + domain = cookie.domain if not ignore_discard and cookie.discard: continue if not ignore_expires and cookie.is_expired(now): continue if cookie.secure: secure = "TRUE" else: secure = "FALSE" - if cookie.domain.startswith("."): initial_dot = "TRUE" + if domain.startswith("."): initial_dot = "TRUE" else: initial_dot = "FALSE" if cookie.expires is not None: expires = str(cookie.expires) @@ -2107,7 +2117,9 @@ def save(self, filename=None, ignore_discard=False, ignore_expires=False): else: name = cookie.name value = cookie.value + if cookie.has_nonstandard_attr(HTTPONLY_ATTR): + domain = HTTPONLY_PREFIX + domain f.write( - "\t".join([cookie.domain, initial_dot, cookie.path, + "\t".join([domain, initial_dot, cookie.path, secure, expires, name, value])+ "\n") diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index 99d038fa15c1e3..fdf15efde12ef2 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -1773,6 +1773,10 @@ def test_mozilla(self): interact_netscape(c, "http://www.foo.com/", "fooc=bar; Domain=www.foo.com; %s" % expires) + for cookie in c: + if cookie.name == "foo1": + cookie.set_nonstandard_attr("HTTPOnly", "") + def save_and_restore(cj, ignore_discard): try: cj.save(ignore_discard=ignore_discard) @@ -1787,6 +1791,7 @@ def save_and_restore(cj, ignore_discard): new_c = save_and_restore(c, True) self.assertEqual(len(new_c), 6) # none discarded self.assertIn("name='foo1', value='bar'", repr(new_c)) + self.assertIn("rest={'HTTPOnly': ''}", repr(new_c)) new_c = save_and_restore(c, False) self.assertEqual(len(new_c), 4) # 2 of them discarded on save diff --git a/Misc/NEWS.d/next/Library/2019-12-05-05-22-49.bpo-38976.5MG7Uu.rst b/Misc/NEWS.d/next/Library/2019-12-05-05-22-49.bpo-38976.5MG7Uu.rst new file mode 100644 index 00000000000000..7a48943a6c6cc7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-05-05-22-49.bpo-38976.5MG7Uu.rst @@ -0,0 +1,4 @@ +The :mod:`http.cookiejar` module now supports the parsing of cookies in CURL-style cookiejar files through MozillaCookieJar +on all platforms. Previously, such cookie entries would be silently ignored when loading a cookiejar with such entries. + +Additionally, the HTTP Only attribute is persisted in the object, and will be correctly written to file if the MozillaCookieJar object is subsequently dumped. \ No newline at end of file From 2cfd267513ee93a6c3aca280ab402214376b7ef5 Mon Sep 17 00:00:00 2001 From: Alexey Izbyshev Date: Sat, 24 Oct 2020 03:47:01 +0300 Subject: [PATCH 0361/1261] bpo-35823: subprocess: Use vfork() instead of fork() on Linux when safe (GH-11671) * bpo-35823: subprocess: Use vfork() instead of fork() on Linux when safe When used to run a new executable image, fork() is not a good choice for process creation, especially if the parent has a large working set: fork() needs to copy page tables, which is slow, and may fail on systems where overcommit is disabled, despite that the child is not going to touch most of its address space. Currently, subprocess is capable of using posix_spawn() instead, which normally provides much better performance. However, posix_spawn() does not support many of child setup operations exposed by subprocess.Popen(). Most notably, it's not possible to express `close_fds=True`, which happens to be the default, via posix_spawn(). As a result, most users can't benefit from faster process creation, at least not without changing their code. However, Linux provides vfork() system call, which creates a new process without copying the address space of the parent, and which is actually used by C libraries to efficiently implement posix_spawn(). Due to sharing of the address space and even the stack with the parent, extreme care is required to use vfork(). At least the following restrictions must hold: * No signal handlers must execute in the child process. Otherwise, they might clobber memory shared with the parent, potentially confusing it. * Any library function called after vfork() in the child must be async-signal-safe (as for fork()), but it must also not interact with any library state in a way that might break due to address space sharing and/or lack of any preparations performed by libraries on normal fork(). POSIX.1 permits to call only execve() and _exit(), and later revisions remove vfork() specification entirely. In practice, however, almost all operations needed by subprocess.Popen() can be safely implemented on Linux. * Due to sharing of the stack with the parent, the child must be careful not to clobber local variables that are alive across vfork() call. Compilers are normally aware of this and take extra care with vfork() (and setjmp(), which has a similar problem). * In case the parent is privileged, special attention must be paid to vfork() use, because sharing an address space across different privilege domains is insecure[1]. This patch adds support for using vfork() instead of fork() on Linux when it's possible to do safely given the above. In particular: * vfork() is not used if credential switch is requested. The reverse case (simple subprocess.Popen() but another application thread switches credentials concurrently) is not possible for pure-Python apps because subprocess.Popen() and functions like os.setuid() are mutually excluded via GIL. We might also consider to add a way to opt-out of vfork() (and posix_spawn() on platforms where it might be implemented via vfork()) in a future PR. * vfork() is not used if `preexec_fn != None`. With this change, subprocess will still use posix_spawn() if possible, but will fallback to vfork() on Linux in most cases, and, failing that, to fork(). [1] https://ewontfix.com/7 Co-authored-by: Gregory P. Smith [Google LLC] --- .../2020-10-16-07-45-35.bpo-35823.SNQo56.rst | 2 + Modules/_posixsubprocess.c | 224 +++++++++++++++--- configure | 2 +- configure.ac | 2 +- pyconfig.h.in | 3 + 5 files changed, 204 insertions(+), 29 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-16-07-45-35.bpo-35823.SNQo56.rst diff --git a/Misc/NEWS.d/next/Library/2020-10-16-07-45-35.bpo-35823.SNQo56.rst b/Misc/NEWS.d/next/Library/2020-10-16-07-45-35.bpo-35823.SNQo56.rst new file mode 100644 index 00000000000000..cd428d36960c93 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-16-07-45-35.bpo-35823.SNQo56.rst @@ -0,0 +1,2 @@ +Use ``vfork()`` instead of ``fork()`` for :func:`subprocess.Popen` on Linux +to improve performance in cases where it is deemed safe. diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index d08c47980e9c6a..ed498572a828b7 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -36,6 +36,12 @@ # define SYS_getdents64 __NR_getdents64 #endif +#if defined(__linux__) && defined(HAVE_VFORK) && defined(HAVE_SIGNAL_H) && \ + defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK) +# include +# define VFORK_USABLE 1 +#endif + #if defined(__sun) && defined(__SVR4) /* readdir64 is used to work around Solaris 9 bug 6395699. */ # define readdir readdir64 @@ -407,9 +413,53 @@ _close_open_fds_maybe_unsafe(long start_fd, PyObject* py_fds_to_keep) #endif /* else NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */ +#ifdef VFORK_USABLE +/* Reset dispositions for all signals to SIG_DFL except for ignored + * signals. This way we ensure that no signal handlers can run + * after we unblock signals in a child created by vfork(). + */ +static void +reset_signal_handlers(const sigset_t *child_sigmask) +{ + struct sigaction sa_dfl = {.sa_handler = SIG_DFL}; + for (int sig = 1; sig < _NSIG; sig++) { + /* Dispositions for SIGKILL and SIGSTOP can't be changed. */ + if (sig == SIGKILL || sig == SIGSTOP) { + continue; + } + + /* There is no need to reset the disposition of signals that will + * remain blocked across execve() since the kernel will do it. */ + if (sigismember(child_sigmask, sig) == 1) { + continue; + } + + struct sigaction sa; + /* C libraries usually return EINVAL for signals used + * internally (e.g. for thread cancellation), so simply + * skip errors here. */ + if (sigaction(sig, NULL, &sa) == -1) { + continue; + } + + /* void *h works as these fields are both pointer types already. */ + void *h = (sa.sa_flags & SA_SIGINFO ? (void *)sa.sa_sigaction : + (void *)sa.sa_handler); + if (h == SIG_IGN || h == SIG_DFL) { + continue; + } + + /* This call can't reasonably fail, but if it does, terminating + * the child seems to be too harsh, so ignore errors. */ + (void) sigaction(sig, &sa_dfl, NULL); + } +} +#endif /* VFORK_USABLE */ + + /* - * This function is code executed in the child process immediately after fork - * to set things up and call exec(). + * This function is code executed in the child process immediately after + * (v)fork to set things up and call exec(). * * All of the code in this function must only use async-signal-safe functions, * listed at `man 7 signal` or @@ -417,8 +467,28 @@ _close_open_fds_maybe_unsafe(long start_fd, PyObject* py_fds_to_keep) * * This restriction is documented at * http://www.opengroup.org/onlinepubs/009695399/functions/fork.html. + * + * If this function is called after vfork(), even more care must be taken. + * The lack of preparations that C libraries normally take on fork(), + * as well as sharing the address space with the parent, might make even + * async-signal-safe functions vfork-unsafe. In particular, on Linux, + * set*id() and setgroups() library functions must not be called, since + * they have to interact with the library-level thread list and send + * library-internal signals to implement per-process credentials semantics + * required by POSIX but not supported natively on Linux. Another reason to + * avoid this family of functions is that sharing an address space between + * processes running with different privileges is inherently insecure. + * See bpo-35823 for further discussion and references. + * + * In some C libraries, setrlimit() has the same thread list/signalling + * behavior since resource limits were per-thread attributes before + * Linux 2.6.10. Musl, as of 1.2.1, is known to have this issue + * (https://www.openwall.com/lists/musl/2020/10/15/6). + * + * If vfork-unsafe functionality is desired after vfork(), consider using + * syscall() to obtain it. */ -static void +_Py_NO_INLINE static void child_exec(char *const exec_array[], char *const argv[], char *const envp[], @@ -432,6 +502,7 @@ child_exec(char *const exec_array[], int call_setgid, gid_t gid, int call_setgroups, size_t groups_size, const gid_t *groups, int call_setuid, uid_t uid, int child_umask, + const void *child_sigmask, PyObject *py_fds_to_keep, PyObject *preexec_fn, PyObject *preexec_fn_args_tuple) @@ -507,6 +578,13 @@ child_exec(char *const exec_array[], if (restore_signals) _Py_RestoreSignals(); +#ifdef VFORK_USABLE + if (child_sigmask) { + reset_signal_handlers(child_sigmask); + POSIX_CALL(pthread_sigmask(SIG_SETMASK, child_sigmask, NULL)); + } +#endif + #ifdef HAVE_SETSID if (call_setsid) POSIX_CALL(setsid()); @@ -599,6 +677,81 @@ child_exec(char *const exec_array[], } +/* The main purpose of this wrapper function is to isolate vfork() from both + * subprocess_fork_exec() and child_exec(). A child process created via + * vfork() executes on the same stack as the parent process while the latter is + * suspended, so this function should not be inlined to avoid compiler bugs + * that might clobber data needed by the parent later. Additionally, + * child_exec() should not be inlined to avoid spurious -Wclobber warnings from + * GCC (see bpo-35823). + */ +_Py_NO_INLINE static pid_t +do_fork_exec(char *const exec_array[], + char *const argv[], + char *const envp[], + const char *cwd, + int p2cread, int p2cwrite, + int c2pread, int c2pwrite, + int errread, int errwrite, + int errpipe_read, int errpipe_write, + int close_fds, int restore_signals, + int call_setsid, + int call_setgid, gid_t gid, + int call_setgroups, size_t groups_size, const gid_t *groups, + int call_setuid, uid_t uid, int child_umask, + const void *child_sigmask, + PyObject *py_fds_to_keep, + PyObject *preexec_fn, + PyObject *preexec_fn_args_tuple) +{ + + pid_t pid; + +#ifdef VFORK_USABLE + if (child_sigmask) { + /* These are checked by our caller; verify them in debug builds. */ + assert(!call_setsid); + assert(!call_setuid); + assert(!call_setgid); + assert(!call_setgroups); + assert(preexec_fn == Py_None); + + pid = vfork(); + } else +#endif + { + pid = fork(); + } + + if (pid != 0) { + return pid; + } + + /* Child process. + * See the comment above child_exec() for restrictions imposed on + * the code below. + */ + + if (preexec_fn != Py_None) { + /* We'll be calling back into Python later so we need to do this. + * This call may not be async-signal-safe but neither is calling + * back into Python. The user asked us to use hope as a strategy + * to avoid deadlock... */ + PyOS_AfterFork_Child(); + } + + child_exec(exec_array, argv, envp, cwd, + p2cread, p2cwrite, c2pread, c2pwrite, + errread, errwrite, errpipe_read, errpipe_write, + close_fds, restore_signals, call_setsid, + call_setgid, gid, call_setgroups, groups_size, groups, + call_setuid, uid, child_umask, child_sigmask, + py_fds_to_keep, preexec_fn, preexec_fn_args_tuple); + _exit(255); + return 0; /* Dead code to avoid a potential compiler warning. */ +} + + static PyObject * subprocess_fork_exec(PyObject* self, PyObject *args) { @@ -836,39 +989,56 @@ subprocess_fork_exec(PyObject* self, PyObject *args) need_after_fork = 1; } - pid = fork(); - if (pid == 0) { - /* Child process */ - /* - * Code from here to _exit() must only use async-signal-safe functions, - * listed at `man 7 signal` or - * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html. + /* NOTE: When old_sigmask is non-NULL, do_fork_exec() may use vfork(). */ + const void *old_sigmask = NULL; +#ifdef VFORK_USABLE + /* Use vfork() only if it's safe. See the comment above child_exec(). */ + sigset_t old_sigs; + if (preexec_fn == Py_None && + !call_setuid && !call_setgid && !call_setgroups && !call_setsid) { + /* Block all signals to ensure that no signal handlers are run in the + * child process while it shares memory with us. Note that signals + * used internally by C libraries won't be blocked by + * pthread_sigmask(), but signal handlers installed by C libraries + * normally service only signals originating from *within the process*, + * so it should be sufficient to consider any library function that + * might send such a signal to be vfork-unsafe and do not call it in + * the child. */ + sigset_t all_sigs; + sigfillset(&all_sigs); + pthread_sigmask(SIG_BLOCK, &all_sigs, &old_sigs); + old_sigmask = &old_sigs; + } +#endif - if (preexec_fn != Py_None) { - /* We'll be calling back into Python later so we need to do this. - * This call may not be async-signal-safe but neither is calling - * back into Python. The user asked us to use hope as a strategy - * to avoid deadlock... */ - PyOS_AfterFork_Child(); - } + pid = do_fork_exec(exec_array, argv, envp, cwd, + p2cread, p2cwrite, c2pread, c2pwrite, + errread, errwrite, errpipe_read, errpipe_write, + close_fds, restore_signals, call_setsid, + call_setgid, gid, call_setgroups, num_groups, groups, + call_setuid, uid, child_umask, old_sigmask, + py_fds_to_keep, preexec_fn, preexec_fn_args_tuple); - child_exec(exec_array, argv, envp, cwd, - p2cread, p2cwrite, c2pread, c2pwrite, - errread, errwrite, errpipe_read, errpipe_write, - close_fds, restore_signals, call_setsid, - call_setgid, gid, call_setgroups, num_groups, groups, - call_setuid, uid, child_umask, - py_fds_to_keep, preexec_fn, preexec_fn_args_tuple); - _exit(255); - return NULL; /* Dead code to avoid a potential compiler warning. */ - } /* Parent (original) process */ if (pid == -1) { /* Capture errno for the exception. */ saved_errno = errno; } +#ifdef VFORK_USABLE + if (old_sigmask) { + /* vfork() semantics guarantees that the parent is blocked + * until the child performs _exit() or execve(), so it is safe + * to unblock signals once we're here. + * Note that in environments where vfork() is implemented as fork(), + * such as QEMU user-mode emulation, the parent won't be blocked, + * but it won't share the address space with the child, + * so it's still safe to unblock the signals. */ + pthread_sigmask(SIG_SETMASK, old_sigmask, NULL); + } +#endif + Py_XDECREF(cwd_obj2); if (need_after_fork) diff --git a/configure b/configure index 29f33b543ecc02..bc87485bf516d1 100755 --- a/configure +++ b/configure @@ -11732,7 +11732,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ - truncate uname unlinkat utimensat utimes waitid waitpid wait3 wait4 \ + truncate uname unlinkat utimensat utimes vfork waitid waitpid wait3 wait4 \ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` diff --git a/configure.ac b/configure.ac index 9698c3c888a6b7..49ed09a3a009bf 100644 --- a/configure.ac +++ b/configure.ac @@ -3690,7 +3690,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ - truncate uname unlinkat utimensat utimes waitid waitpid wait3 wait4 \ + truncate uname unlinkat utimensat utimes vfork waitid waitpid wait3 wait4 \ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn) # Force lchmod off for Linux. Linux disallows changing the mode of symbolic diff --git a/pyconfig.h.in b/pyconfig.h.in index 298cb4fa12f80c..af8a3d6d9c370d 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -1301,6 +1301,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UUID_UUID_H +/* Define to 1 if you have the `vfork' function. */ +#undef HAVE_VFORK + /* Define to 1 if you have the `wait3' function. */ #undef HAVE_WAIT3 From 1ccdbb5f8224a0efb69b7f5a9d94a8b8e1b15f19 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 23 Oct 2020 18:10:54 -0700 Subject: [PATCH 0362/1261] Mention in "What's New" that the import system is starting to be cleaned up (GH-22931) Automerge-Triggered-By: GH:brettcannon --- Doc/whatsnew/3.10.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index e464be6eb7e951..6206c949cc59bb 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -267,6 +267,23 @@ Optimizations Deprecated ========== +* Starting in this release, there will be a concerted effort to begin + cleaning up old import semantics that were kept for Python 2.7 + compatibility. Specifically, + :meth:`~importlib.abc.PathEntryFinder.find_loader`/:meth:`~importlib.abc.Finder.find_module` + (superseded by :meth:`~importlib.abc.Finder.find_spec`), + :meth:`~importlib.abc.Loader.load_module` + (superseded by :meth:`~importlib.abc.Loader.exec_module`), + :meth:`~importlib.abc.Loader.module_repr` (which the import system + takes care of for you), the ``__package__`` attribute + (superseded by ``__spec__.parent``), the ``__loader__`` attribute + (superseded by ``__spec__.loader``), and the ``__cached__`` attribute + (superseded by ``__spec__.cached``) will slowly be removed (as well + as other classes and methods in :mod:`importlib`). + :exc:`ImportWarning` and/or :exc:`DeprecationWarning` will be raised + as appropriate to help identify code which needs updating during + this transition. + Removed ======= From 00a9541b612411c254368c1f7ea78c7839609f44 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 23 Oct 2020 18:37:27 -0700 Subject: [PATCH 0363/1261] bpo-19072: Update descriptor howto for decorator chaining (GH-22934) --- Doc/howto/descriptor.rst | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 4a53b9e6156922..4e9fad30d31c4f 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -872,6 +872,16 @@ Using the non-data descriptor protocol, a pure Python version of def __get__(self, obj, cls=None): if cls is None: cls = type(obj) - def newfunc(*args): - return self.f(cls, *args) - return newfunc + if hasattr(obj, '__get__'): + return self.f.__get__(cls) + return types.MethodType(self.f, cls) + +The code path for ``hasattr(obj, '__get__')`` was added in Python 3.9 and +makes it possible for :func:`classmethod` to support chained decorators. +For example, a classmethod and property could be chained together:: + + class G: + @classmethod + @property + def __doc__(cls): + return f'A doc for {cls.__name__!r}' From 90b1532190c3995044bd910085a45beee7ed38e1 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Fri, 23 Oct 2020 23:59:33 -0400 Subject: [PATCH 0364/1261] bpo-42139: Update What's New 3.9 for master (#22936) --- Doc/whatsnew/3.9.rst | 364 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 299 insertions(+), 65 deletions(-) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 89017981f6d498..1a37f16ea2b09a 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -4,22 +4,21 @@ :Release: |release| :Date: |today| +:Editor: Łukasz Langa .. Rules for maintenance: - * Anyone can add text to this document. Do not spend very much time - on the wording of your changes, because your text will probably - get rewritten to some degree. + * Anyone can add text to this document. Your text might get + rewritten to some degree. * The maintainer will go through Misc/NEWS periodically and add changes; it's therefore more important to add your changes to Misc/NEWS than to this file. * This is not a complete list of every single change; completeness - is the purpose of Misc/NEWS. Some changes I consider too small + is the purpose of Misc/NEWS. Some changes will be too small or esoteric to include. If such a change is added to the text, - I'll just remove it. (This is another reason you shouldn't spend - too much time on writing your addition.) + it might get removed during final editing. * If you want to draw your new text to the attention of the maintainer, add 'XXX' to the beginning of the paragraph or @@ -46,14 +45,13 @@ when researching a change. This article explains the new features in Python 3.9, compared to 3.8. +Python 3.9 was released on October 5th, 2020. For full details, see the :ref:`changelog `. -.. note:: +.. seealso:: - Prerelease users should be aware that this document is currently in draft - form. It will be updated substantially as Python 3.9 moves towards release, - so it's worth checking back even after reading earlier versions. + :pep:`596` - Python 3.9 Release Schedule Summary -- Release highlights @@ -62,27 +60,70 @@ Summary -- Release highlights .. This section singles out the most important changes in Python 3.9. Brevity is key. +New syntax features: + +* :pep:`584`, union operators added to ``dict``; +* :pep:`585`, type hinting generics in standard collections; +* :pep:`614`, relaxed grammar restrictions on decorators. + +New built-in features: + +* :pep:`616`, string methods to remove prefixes and suffixes. + +New features in the standard library: + +* :pep:`593`, flexible function and variable annotations; +* :func:`os.pidfd_open` added that allows process management without races + and signals. + +Interpreter improvements: + +* :pep:`573`, fast access to module state from methods of C extension + types; +* :pep:`617`, CPython now uses a new parser based on PEG; +* a number of Python builtins (range, tuple, set, frozenset, list, dict) are + now sped up using :pep:`590` vectorcall; +* garbage collection does not block on resurrected objects; +* a number of Python modules (:mod:`_abc`, :mod:`audioop`, :mod:`_bz2`, + :mod:`_codecs`, :mod:`_contextvars`, :mod:`_crypt`, :mod:`_functools`, + :mod:`_json`, :mod:`_locale`, :mod:`math`, :mod:`operator`, :mod:`resource`, + :mod:`time`, :mod:`_weakref`) now use multiphase initialization as defined + by PEP 489; +* a number of standard library modules (:mod:`audioop`, :mod:`ast`, :mod:`grp`, + :mod:`_hashlib`, :mod:`pwd`, :mod:`_posixsubprocess`, :mod:`random`, + :mod:`select`, :mod:`struct`, :mod:`termios`, :mod:`zlib`) are now using + the stable ABI defined by PEP 384. -.. PEP-sized items next. +New library modules: + +* :pep:`615`, the IANA Time Zone Database is now present in the standard + library in the :mod:`zoneinfo` module; +* an implementation of a topological sort of a graph is now provided in + the new :mod:`graphlib` module. + +Release process changes: + +* :pep:`602`, CPython adopts an annual release cycle. You should check for DeprecationWarning in your code ==================================================== -When Python 2.7 was still supported, many functions were kept for backward -compatibility with Python 2.7. With the end of Python 2.7 support, these -backward compatibility layers have been removed, or will be removed soon. -Most of them emitted a :exc:`DeprecationWarning` warning for several years. For -example, using ``collections.Mapping`` instead of ``collections.abc.Mapping`` -emits a :exc:`DeprecationWarning` since Python 3.3, released in 2012. +When Python 2.7 was still supported, a lot of functionality in Python 3 +was kept for backward compatibility with Python 2.7. With the end of Python +2 support, these backward compatibility layers have been removed, or will +be removed soon. Most of them emitted a :exc:`DeprecationWarning` warning for +several years. For example, using ``collections.Mapping`` instead of +``collections.abc.Mapping`` emits a :exc:`DeprecationWarning` since Python +3.3, released in 2012. Test your application with the :option:`-W` ``default`` command-line option to see :exc:`DeprecationWarning` and :exc:`PendingDeprecationWarning`, or even with :option:`-W` ``error`` to treat them as errors. :ref:`Warnings Filter ` can be used to ignore warnings from third-party code. -It has been decided to keep a few backward compatibility layers for one last -release, to give more time to Python projects maintainers to organize the +Python 3.9 is the last version providing those Python 2 backward compatibility +layers, to give more time to Python projects maintainers to organize the removal of the Python 2 support and add support for Python 3.9. Aliases to :ref:`Abstract Base Classes ` in @@ -94,6 +135,9 @@ More generally, try to run your tests in the :ref:`Python Development Mode ` which helps to prepare your code to make it compatible with the next Python version. +Note: a number of pre-existing deprecatations were removed in this version +of Python as well. Consult the :ref:`removed-in-python-39` section. + New Features ============ @@ -102,11 +146,23 @@ Dictionary Merge & Update Operators ----------------------------------- Merge (``|``) and update (``|=``) operators have been added to the built-in -:class:`dict` class. See :pep:`584` for a full description. +:class:`dict` class. Those complement the existing ``dict.update`` and +``{**d1, **d2}`` methods of merging dictionaries. + +Example:: + + >>> x = {"key1": "value1 from x", "key2": "value2 from x"} + >>> y = {"key2": "value2 from y", "key3": "value3 from y"} + >>> x | y + {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'} + >>> y | x + {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'} + +See :pep:`584` for a full description. (Contributed by Brandt Bucher in :issue:`36144`.) -PEP 616: New removeprefix() and removesuffix() string methods -------------------------------------------------------------- +New String Methods to Remove Prefixes and Suffixes +-------------------------------------------------- :meth:`str.removeprefix(prefix)` and :meth:`str.removesuffix(suffix)` have been added @@ -115,8 +171,8 @@ to easily remove an unneeded prefix or a suffix from a string. Corresponding added. See :pep:`616` for a full description. (Contributed by Dennis Sweeney in :issue:`39939`.) -PEP 585: Builtin Generic Types ------------------------------- +Type Hinting Generics in Standard Collections +--------------------------------------------- In type annotations you can now use built-in collection types such as ``list`` and ``dict`` as generic types instead of importing the @@ -135,8 +191,8 @@ Example: See :pep:`585` for more details. (Contributed by Guido van Rossum, Ethan Smith, and Batuhan Taşkaya in :issue:`39481`.) -PEP 617: New Parser -------------------- +New Parser +---------- Python 3.9 uses a new parser, based on `PEG `_ instead @@ -167,7 +223,6 @@ Other Language Changes its top-level package. (Contributed by Ngalim Siregar in :issue:`37444`.) - * Python now gets the absolute path of the script filename specified on the command line (ex: ``python3 script.py``): the ``__file__`` attribute of the :mod:`__main__` module became an absolute path, rather than a relative @@ -201,6 +256,17 @@ Other Language Changes for the correspondent concrete type (``list`` in this case). (Contributed by Serhiy Storchaka in :issue:`40257`.) +* Parallel running of :meth:`~agen.aclose` / :meth:`~agen.asend` / + :meth:`~agen.athrow` is now prohibited, and ``ag_running`` now reflects + the actual running status of the async generator. + (Contributed by Yury Selivanov in :issue:`30773`.) + +* Unexpected errors in calling the ``__iter__`` method are no longer masked by + ``TypeError`` in the :keyword:`in` operator and functions + :func:`~operator.contains`, :func:`~operator.indexOf` and + :func:`~operator.countOf` of the :mod:`operator` module. + (Contributed by Serhiy Storchaka in :issue:`40824`.) + New Modules =========== @@ -248,9 +314,10 @@ PyPI and maintained by the CPython core team. graphlib --------- -Add the :mod:`graphlib` that contains the :class:`graphlib.TopologicalSorter` class -to offer functionality to perform topological sorting of graphs. (Contributed by Pablo -Galindo, Tim Peters and Larry Hastings in :issue:`17005`.) +A new module, :mod:`graphlib`, was added that contains the +:class:`graphlib.TopologicalSorter` class to offer functionality to perform +topological sorting of graphs. (Contributed by Pablo Galindo, Tim Peters and +Larry Hastings in :issue:`17005`.) Improved Modules @@ -296,6 +363,15 @@ loop, and essentially works as a high-level version of :meth:`~asyncio.loop.run_in_executor` that can directly take keyword arguments. (Contributed by Kyle Stanley and Yury Selivanov in :issue:`32309`.) +When cancelling the task due to a timeout, :meth:`asyncio.wait_for` will now +wait until the cancellation is complete also in the case when *timeout* is +<= 0, like it does with positive timeouts. +(Contributed by Elvis Pranskevichus in :issue:`32751`.) + +:mod:`asyncio` now raises :exc:`TyperError` when calling incompatible +methods with an :class:`ssl.SSLSocket` socket. +(Contributed by Ido Michael in :issue:`37404`.) + compileall ---------- @@ -328,7 +404,7 @@ startup overhead and reduces the amount of lost CPU time to idle workers. curses ------ -Add :func:`curses.get_escdelay`, :func:`curses.set_escdelay`, +Added :func:`curses.get_escdelay`, :func:`curses.set_escdelay`, :func:`curses.get_tabsize`, and :func:`curses.set_tabsize` functions. (Contributed by Anthony Sottile in :issue:`38312`.) @@ -375,12 +451,17 @@ finalized by the garbage collector. (Contributed by Pablo Galindo in hashlib ------- +The :mod:`hashlib` module can now use SHA3 hashes and SHAKE XOF from OpenSSL +when available. +(Contributed by Christian Heimes in :issue:`37630`.) + Builtin hash modules can now be disabled with ``./configure --without-builtin-hashlib-hashes`` or selectively enabled with e.g. ``./configure --with-builtin-hashlib-hashes=sha3,blake2`` to force use of OpenSSL based implementation. (Contributed by Christian Heimes in :issue:`40479`) + http ---- @@ -390,13 +471,13 @@ HTTP status codes ``103 EARLY_HINTS``, ``418 IM_A_TEAPOT`` and ``425 TOO_EARLY`` IDLE and idlelib ---------------- -Add option to toggle cursor blink off. (Contributed by Zackery Spytz +Added option to toggle cursor blink off. (Contributed by Zackery Spytz in :issue:`4603`.) Escape key now closes IDLE completion windows. (Contributed by Johnny Najera in :issue:`38944`.) -Add keywords to module name completion list. (Contributed by Terry J. +Added keywords to module name completion list. (Contributed by Terry J. Reedy in :issue:`37765`.) The changes above have been backported to 3.8 maintenance releases. @@ -426,6 +507,17 @@ now raises :exc:`ImportError` instead of :exc:`ValueError` for invalid relative import attempts. (Contributed by Ngalim Siregar in :issue:`37444`.) +Import loaders which publish immutable module objects can now publish +immutable packages in addition to individual modules. +(Contributed by Dino Viehland in :issue:`39336`.) + +Added :func:`importlib.resources.files` function with support for +subdirectories in package data, matching backport in ``importlib_resources`` +version 1.5. +(Contributed by Jason R. Coombs in :issue:`39791`.) + +Refreshed ``importlib.metadata`` from ``importlib_metadata`` version 1.6.1. + inspect ------- @@ -448,15 +540,15 @@ Expanded the :func:`math.gcd` function to handle multiple arguments. Formerly, it only supported two arguments. (Contributed by Serhiy Storchaka in :issue:`39648`.) -Add :func:`math.lcm`: return the least common multiple of specified arguments. +Added :func:`math.lcm`: return the least common multiple of specified arguments. (Contributed by Mark Dickinson, Ananthakrishnan and Serhiy Storchaka in :issue:`39479` and :issue:`39648`.) -Add :func:`math.nextafter`: return the next floating-point value after *x* +Added :func:`math.nextafter`: return the next floating-point value after *x* towards *y*. (Contributed by Victor Stinner in :issue:`39288`.) -Add :func:`math.ulp`: return the value of the least significant bit +Added :func:`math.ulp`: return the value of the least significant bit of a float. (Contributed by Victor Stinner in :issue:`39310`.) @@ -492,7 +584,7 @@ The :func:`os.putenv` and :func:`os.unsetenv` functions are now always available. (Contributed by Victor Stinner in :issue:`39395`.) -Add :func:`os.waitstatus_to_exitcode` function: +Added :func:`os.waitstatus_to_exitcode` function: convert a wait status to an exit code. (Contributed by Victor Stinner in :issue:`40094`.) @@ -503,6 +595,12 @@ Added :meth:`pathlib.Path.readlink()` which acts similarly to :func:`os.readlink`. (Contributed by Girts Folkmanis in :issue:`30618`) +pdb +--- + +On Windows now :class:`~pdb.Pdb` supports ``~/.pdbrc``. +(Contributed by Tim Hopper and Dan Lidral-Porter in :issue:`20523`.) + poplib ------ @@ -526,7 +624,7 @@ method etc, but for any object that has its own ``__doc__`` attribute. random ------ -Add a new :attr:`random.Random.randbytes` method: generate random bytes. +Added a new :attr:`random.Random.randbytes` method: generate random bytes. (Contributed by Victor Stinner in :issue:`40286`.) signal @@ -555,6 +653,11 @@ constant on Linux 4.1 and greater. The socket module now supports the :data:`~socket.CAN_J1939` protocol on platforms that support it. (Contributed by Karl Ding in :issue:`40291`.) +The socket module now has the :func:`socket.send_fds` and +:func:`socket.recv.fds` methods. (Contributed by Joannah Nanjekye, Shinya +Okano and Victor Stinner in :issue:`28724`.) + + time ---- @@ -566,7 +669,7 @@ which has nanosecond resolution, rather than sys --- -Add a new :attr:`sys.platlibdir` attribute: name of the platform-specific +Added a new :attr:`sys.platlibdir` attribute: name of the platform-specific library directory. It is used to build the path of standard library and the paths of installed extension modules. It is equal to ``"lib"`` on most platforms. On Fedora and SuSE, it is equal to ``"lib64"`` on 64-bit platforms. @@ -630,7 +733,7 @@ Optimizations (Contributed by Serhiy Storchaka in :issue:`32856`.) -* Optimize signal handling in multithreaded applications. If a thread different +* Optimized signal handling in multithreaded applications. If a thread different than the main thread gets a signal, the bytecode evaluation loop is no longer interrupted at each bytecode instruction to check for pending signals which cannot be handled. Only the main thread of the main interpreter can handle @@ -640,10 +743,36 @@ Optimizations until the main thread handles signals. (Contributed by Victor Stinner in :issue:`40010`.) -* Optimize the :mod:`subprocess` module on FreeBSD using ``closefrom()``. +* Optimized the :mod:`subprocess` module on FreeBSD using ``closefrom()``. (Contributed by Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak and Victor Stinner in :issue:`38061`.) +* :c:func:`PyLong_FromDouble` is now up to 1.87x faster for values that + fit into :c:type:`long`. + (Contributed by Sergey Fedoseev in :issue:`37986`.) + +* A number of Python builtins (:class:`range`, :class:`tuple`, :class:`set`, + :class:`frozenset`, :class:`list`, :class:`dict`) are now sped up by using + :pep:`590` vectorcall protocol. + (Contributed by Dong-hee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in :issue:`37207`.) + +* Optimized :func:`~set.difference_update` for the case when the other set + is much larger than the base set. + (Suggested by Evgeny Kapun with code contributed by Michele Orrù in :issue:`8425`.) + +* Python's small object allocator (``obmalloc.c``) now allows (no more than) + one empty arena to remain available for immediate reuse, without returning + it to the OS. This prevents thrashing in simple loops where an arena could + be created and destroyed anew on each iteration. + (Contributed by Tim Peters in :issue:`37257`.) + +* :term:`floor division` of float operation now has a better performance. Also + the message of :exc:`ZeroDivisionError` for this operation is updated. + (Contributed by Dong-hee Na in :issue:`39434`.) + +* Decoding short ASCII strings with UTF-8 and ascii codecs is now about + 15% faster. (Contributed by Inada Naoki in :issue:`37348`.) + Here's a summary of performance improvements from Python 3.4 through Python 3.9: .. code-block:: none @@ -699,10 +828,6 @@ in nanoseconds. The benchmarks were measured on an running the macOS 64-bit builds found at `python.org `_. -* A number of Python builtins (:class:`range`, :class:`tuple`, :class:`set`, :class:`frozenset`, :class:`list`, :class:`dict`) - are now sped up by using :pep:`590` vectorcall protocol. - (Contributed by Dong-hee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in :issue:`37207`.) - Deprecated ========== @@ -784,6 +909,9 @@ Deprecated * Passing ``None`` as the first argument to the :func:`shlex.split` function has been deprecated. (Contributed by Zackery Spytz in :issue:`33262`.) +* :func:`smtpd.MailmanProxy` is now deprecated as it is unusable without + an external module, ``mailman``. (Contributed by Samuel Colvin in :issue:`35800`.) + * The :mod:`lib2to3` module now emits a :exc:`PendingDeprecationWarning`. Python 3.9 switched to a PEG parser (see :pep:`617`), and Python 3.10 may include new language syntax that is not parsable by lib2to3's LL(1) parser. @@ -798,6 +926,8 @@ Deprecated .. _LibCST: https://libcst.readthedocs.io/ .. _parso: https://parso.readthedocs.io/ +.. _removed-in-python-39: + Removed ======= @@ -967,6 +1097,19 @@ Changes in the Python API of ``wchar_t`` since Python 3.3. (Contributed by Inada Naoki in :issue:`34538`.) +* The :func:`logging.getLogger` API now returns the root logger when passed + the name ``'root'``, whereas previously it returned a non-root logger named + ``'root'``. This could affect cases where user code explicitly wants a + non-root logger named ``'root'``, or instantiates a logger using + ``logging.getLogger(__name__)`` in some top-level module called ``'root.py'``. + (Contributed by Vinay Sajip in :issue:`37742`.) + +* Division handling of :class:`~pathlib.PurePath` now returns ``NotImplemented`` + instead of raising a :exc:`TypeError` when passed something other than an + instance of ``str`` or :class:`~pathlib.PurePath`. This allows creating + compatible classes that don't inherit from those mentioned types. + (Contributed by Roger Aiudi in :issue:`34775`). + Changes in the C API -------------------- @@ -1017,6 +1160,11 @@ Changes in the C API (See :issue:`35810` and :issue:`40217` for more information.) +* The functions ``PyEval_CallObject``, ``PyEval_CallFunction``, + ``PyEval_CallMethod`` and ``PyEval_CallObjectWithKeywords`` are deprecated. + Use :c:func:`PyObject_Call` and its variants instead. + (See more details in :issue:`29548`.) + CPython bytecode changes ------------------------ @@ -1025,11 +1173,21 @@ CPython bytecode changes correctly if the :exc:`AssertionError` exception was being shadowed. (Contributed by Zackery Spytz in :issue:`34880`.) +* The :opcode:`COMPARE_OP` opcode was split into four distinct instructions: + + * ``COMPARE_OP`` for rich comparisons + * ``IS_OP`` for 'is' and 'is not' tests + * ``CONTAINS_OP`` for 'in' and 'not in' tests + * ``JUMP_IF_NOT_EXC_MATCH`` for checking exceptions in 'try-except' + statements. + + (Contributed by Mark Shannon in :issue:`39156`.) + Build Changes ============= -* Add ``--with-platlibdir`` option to the ``configure`` script: name of the +* Added ``--with-platlibdir`` option to the ``configure`` script: name of the platform-specific library directory, stored in the new :attr:`sys.platlibdir` attribute. See :attr:`sys.platlibdir` attribute for more information. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis @@ -1042,6 +1200,34 @@ Build Changes functions are now required to build Python. (Contributed by Victor Stinner in :issue:`39395`.) +* On non-Windows platforms, creating ``bdist_wininst`` installers is now + officially unsupported. (See :issue:`10945` for more details.) + +* When building Python on macOS from source, ``_tkinter`` now links with + non-system Tcl and Tk frameworks if they are installed in + ``/Library/Frameworks``, as had been the case on older releases + of macOS. If a macOS SDK is explicitly configured, by using + ``--enable-universalsdk=`` or ``-isysroot``, only the SDK itself is + searched. The default behavior can still be overridden with + ``--with-tcltk-includes`` and ``--with-tcltk-libs``. + (Contributed by Ned Deily in :issue:`34956`.) + +* Python can now be built for Windows 10 ARM64. + (Contributed by Steve Dower in :issue:`33125`.) + +* Some individual tests are now skipped when ``--pgo`` is used. The tests + in question increased the PGO task time significantly and likely + didn't help improve optimization of the final executable. This + speeds up the task by a factor of about 15x. Running the full unit test + suite is slow. This change may result in a slightly less optimized build + since not as many code branches will be executed. If you are willing to + wait for the much slower build, the old behavior can be restored using + ``./configure [..] PROFILE_TASK="-m test --pgo-extended"``. We make no + guarantees as to which PGO task set produces a faster build. Users who care + should run their own relevant benchmarks as results can depend on the + environment, workload, and compiler tool chain. + (See :issue:`36044` and :issue:`37707` for more details.) + C API Changes ============= @@ -1049,29 +1235,29 @@ C API Changes New Features ------------ -* :pep:`573`: Add :c:func:`PyType_FromModuleAndSpec` to associate +* :pep:`573`: Added :c:func:`PyType_FromModuleAndSpec` to associate a module with a class; :c:func:`PyType_GetModule` and :c:func:`PyType_GetModuleState` to retrieve the module and its state; and :c:data:`PyCMethod` and :c:data:`METH_METHOD` to allow a method to access the class it was defined in. (Contributed by Marcel Plch and Petr Viktorin in :issue:`38787`.) -* Add :c:func:`PyFrame_GetCode` function: get a frame code. - Add :c:func:`PyFrame_GetBack` function: get the frame next outer frame. +* Added :c:func:`PyFrame_GetCode` function: get a frame code. + Added :c:func:`PyFrame_GetBack` function: get the frame next outer frame. (Contributed by Victor Stinner in :issue:`40421`.) -* Add :c:func:`PyFrame_GetLineNumber` to the limited C API. +* Added :c:func:`PyFrame_GetLineNumber` to the limited C API. (Contributed by Victor Stinner in :issue:`40421`.) -* Add :c:func:`PyThreadState_GetInterpreter` and +* Added :c:func:`PyThreadState_GetInterpreter` and :c:func:`PyInterpreterState_Get` functions to get the interpreter. - Add :c:func:`PyThreadState_GetFrame` function to get the current frame of a + Added :c:func:`PyThreadState_GetFrame` function to get the current frame of a Python thread state. - Add :c:func:`PyThreadState_GetID` function: get the unique identifier of a + Added :c:func:`PyThreadState_GetID` function: get the unique identifier of a Python thread state. (Contributed by Victor Stinner in :issue:`39947`.) -* Add a new public :c:func:`PyObject_CallNoArgs` function to the C API, which +* Added a new public :c:func:`PyObject_CallNoArgs` function to the C API, which calls a callable Python object without any arguments. It is the most efficient way to call a callable Python object without any argument. (Contributed by Victor Stinner in :issue:`37194`.) @@ -1093,11 +1279,15 @@ New Features to a module. (Contributed by Dong-hee Na in :issue:`40024`.) -* Add the functions :c:func:`PyObject_GC_IsTracked` and +* Added the functions :c:func:`PyObject_GC_IsTracked` and :c:func:`PyObject_GC_IsFinalized` to the public API to allow to query if Python objects are being currently tracked or have been already finalized by - the garbage collector respectively. (Contributed by Pablo Galindo in - :issue:`40241`.) + the garbage collector respectively. + (Contributed by Pablo Galindo Salgado in :issue:`40241`.) + +* Added :c:func:`_PyObject_FunctionStr` to get a user-friendly string + representation of a function-like object. + (Patch by Jeroen Demeyer in :issue:`37645`.) Porting to Python 3.9 @@ -1144,10 +1334,44 @@ Porting to Python 3.9 Python 3.3. (Contributed by Inada Naoki in :issue:`36346`.) +* The :c:func:`Py_FatalError` function is replaced with a macro which logs + automatically the name of the current function, unless the + ``Py_LIMITED_API`` macro is defined. + (Contributed by Victor Stinner in :issue:`39882`.) + +* The vectorcall protocol now requires that the caller passes only strings as + keyword names. (See :issue:`37540` for more information.) + +* Implementation details of a number of macros and functions are now hidden: + + * :c:func:`PyObject_IS_GC` macro was converted to a function. + + * The :c:func:`PyObject_NEW` macro becomes an alias to the + :c:func:`PyObject_New` macro, and the :c:func:`PyObject_NEW_VAR` macro + becomes an alias to the :c:func:`PyObject_NewVar` macro. They no longer + access directly the :c:member:`PyTypeObject.tp_basicsize` member. + + * :c:func:`PyType_HasFeature` now always calls :c:func:`PyType_GetFlags`. + Previously, it accessed directly the :c:member:`PyTypeObject.tp_flags` + member when the limited C API was not used. + + * :c:func:`PyObject_GET_WEAKREFS_LISTPTR` macro was converted to a function: + the macro accessed directly the :c:member:`PyTypeObject.tp_weaklistoffset` + member. + + * :c:func:`PyObject_CheckBuffer` macro was converted to a function: the macro + accessed directly the :c:member:`PyTypeObject.tp_as_buffer` member. + + * :c:func:`PyIndex_Check` is now always declared as an opaque function to hide + implementation details: removed the ``PyIndex_Check()`` macro. The macro accessed + directly the :c:member:`PyTypeObject.tp_as_number` member. + + (See :issue:`40170` for more details.) + Removed ------- -* Exclude ``PyFPE_START_PROTECT()`` and ``PyFPE_END_PROTECT()`` macros of +* Excluded ``PyFPE_START_PROTECT()`` and ``PyFPE_END_PROTECT()`` macros of ``pyfpe.h`` from the limited C API. (Contributed by Victor Stinner in :issue:`38835`.) @@ -1158,7 +1382,7 @@ Removed * Changes in the limited C API (if ``Py_LIMITED_API`` macro is defined): - * Exclude the following functions from the limited C API: + * Excluded the following functions from the limited C API: * ``PyThreadState_DeleteCurrent()`` (Contributed by Joannah Nanjekye in :issue:`37878`.) @@ -1175,7 +1399,7 @@ Removed * ``Py_TRASHCAN_SAFE_BEGIN`` * ``Py_TRASHCAN_SAFE_END`` - * Move following functions and definitions to the internal C API: + * Moved following functions and definitions to the internal C API: * ``_PyDebug_PrintTotalRefs()`` * ``_Py_PrintReferences()`` @@ -1185,12 +1409,12 @@ Removed (Contributed by Victor Stinner in :issue:`38644` and :issue:`39542`.) -* Remove ``_PyRuntime.getframe`` hook and remove ``_PyThreadState_GetFrame`` +* Removed ``_PyRuntime.getframe`` hook and removed ``_PyThreadState_GetFrame`` macro which was an alias to ``_PyRuntime.getframe``. They were only exposed - by the internal C API. Remove also ``PyThreadFrameGetter`` type. + by the internal C API. Removed also ``PyThreadFrameGetter`` type. (Contributed by Victor Stinner in :issue:`39946`.) -* Remove the following functions from the C API. Call :c:func:`PyGC_Collect` +* Removed the following functions from the C API. Call :c:func:`PyGC_Collect` explicitly to clear all free lists. (Contributed by Inada Naoki and Victor Stinner in :issue:`37340`, :issue:`38896` and :issue:`40428`.) @@ -1209,10 +1433,20 @@ Removed * ``PyUnicode_ClearFreeList()``: the Unicode free list has been removed in Python 3.3. -* Remove ``_PyUnicode_ClearStaticStrings()`` function. +* Removed ``_PyUnicode_ClearStaticStrings()`` function. (Contributed by Victor Stinner in :issue:`39465`.) -* Remove ``Py_UNICODE_MATCH``. It has been deprecated by :pep:`393`, and +* Removed ``Py_UNICODE_MATCH``. It has been deprecated by :pep:`393`, and broken since Python 3.3. The :c:func:`PyUnicode_Tailmatch` function can be used instead. (Contributed by Inada Naoki in :issue:`36346`.) + +* Cleaned header files of interfaces defined but with no implementation. + The public API symbols being removed are: + ``_PyBytes_InsertThousandsGroupingLocale``, + ``_PyBytes_InsertThousandsGrouping``, ``_Py_InitializeFromArgs``, + ``_Py_InitializeFromWideArgs``, ``_PyFloat_Repr``, ``_PyFloat_Digits``, + ``_PyFloat_DigitsInit``, ``PyFrame_ExtendStack``, ``_PyAIterWrapper_Type``, + ``PyNullImporter_Type``, ``PyCmpWrapper_Type``, ``PySortWrapper_Type``, + ``PyNoArgsFunction``. + (Contributed by Pablo Galindo Salgado in :issue:`39372`.) From 5966da0e507eb500447a3962580b9f590aa284fb Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 24 Oct 2020 07:12:55 -0700 Subject: [PATCH 0365/1261] Automatically add skip news and skip issue label to dependabot PRs (GH-22927) Closes https://github.com/python/bedevere/issues/287 --- .github/dependabot.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8ac6b8c4984dcd..e90677b9f775a7 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,3 +4,6 @@ updates: directory: "/" schedule: interval: "monthly" + labels: + - "skip issue" + - "skip news" From b3171c9c8235ba9a51b93519e02380ad09d30f87 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Sat, 24 Oct 2020 11:29:17 -0300 Subject: [PATCH 0366/1261] [doc] Fix link to abc.ABCMeta.register in Glossary (GH-22932) --- Doc/glossary.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 32aa12a200f636..847500e556056e 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -1031,7 +1031,7 @@ Glossary :meth:`index`, :meth:`__contains__`, and :meth:`__reversed__`. Types that implement this expanded interface can be registered explicitly using - :func:`~abc.register`. + :func:`~abc.ABCMeta.register`. set comprehension A compact way to process all or part of the elements in an iterable and From f6a9afe0e97ce4292904d31f349ee0e4bce2e001 Mon Sep 17 00:00:00 2001 From: Alexey Izbyshev Date: Sat, 24 Oct 2020 20:47:38 +0300 Subject: [PATCH 0367/1261] bpo-35823: subprocess: Fix handling of pthread_sigmask() errors (GH-22944) Using POSIX_CALL() is incorrect since pthread_sigmask() returns the error number instead of setting errno. Also handle failure of the first call to pthread_sigmask() in the parent process, and explain why we don't handle failure of the second call in a comment. --- Modules/_posixsubprocess.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index ed498572a828b7..b7cba30ee7618a 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -581,7 +581,9 @@ child_exec(char *const exec_array[], #ifdef VFORK_USABLE if (child_sigmask) { reset_signal_handlers(child_sigmask); - POSIX_CALL(pthread_sigmask(SIG_SETMASK, child_sigmask, NULL)); + if ((errno = pthread_sigmask(SIG_SETMASK, child_sigmask, NULL))) { + goto error; + } } #endif @@ -1007,7 +1009,11 @@ subprocess_fork_exec(PyObject* self, PyObject *args) */ sigset_t all_sigs; sigfillset(&all_sigs); - pthread_sigmask(SIG_BLOCK, &all_sigs, &old_sigs); + if ((saved_errno = pthread_sigmask(SIG_BLOCK, &all_sigs, &old_sigs))) { + errno = saved_errno; + PyErr_SetFromErrno(PyExc_OSError); + goto cleanup; + } old_sigmask = &old_sigs; } #endif @@ -1034,8 +1040,13 @@ subprocess_fork_exec(PyObject* self, PyObject *args) * Note that in environments where vfork() is implemented as fork(), * such as QEMU user-mode emulation, the parent won't be blocked, * but it won't share the address space with the child, - * so it's still safe to unblock the signals. */ - pthread_sigmask(SIG_SETMASK, old_sigmask, NULL); + * so it's still safe to unblock the signals. + * + * We don't handle errors here because this call can't fail + * if valid arguments are given, and because there is no good + * way for the caller to deal with a failure to restore + * the thread signal mask. */ + (void) pthread_sigmask(SIG_SETMASK, old_sigmask, NULL); } #endif From df9730e2823a2f861f6fc63075d5e6148e54e940 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 24 Oct 2020 21:14:23 +0300 Subject: [PATCH 0368/1261] bpo-41052: Fix pickling heap types implemented in C with protocols 0 and 1 (GH-22870) --- Lib/copyreg.py | 4 +++ Lib/test/pickletester.py | 18 ++++++++++ .../2020-10-21-23-45-02.bpo-41052.3N7J2J.rst | 2 ++ Modules/_bz2module.c | 32 ----------------- Modules/_lzmamodule.c | 30 ---------------- Modules/_randommodule.c | 17 --------- Modules/clinic/_bz2module.c.h | 36 +------------------ Modules/clinic/_lzmamodule.c.h | 36 +------------------ Modules/clinic/_randommodule.c.h | 19 +--------- 9 files changed, 27 insertions(+), 167 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-21-23-45-02.bpo-41052.3N7J2J.rst diff --git a/Lib/copyreg.py b/Lib/copyreg.py index dfc463c49a389d..7ab8c128eb0445 100644 --- a/Lib/copyreg.py +++ b/Lib/copyreg.py @@ -48,6 +48,7 @@ def _reconstructor(cls, base, state): return obj _HEAPTYPE = 1<<9 +_new_type = type(int.__new__) # Python code for object.__reduce_ex__ for protocols 0 and 1 @@ -57,6 +58,9 @@ def _reduce_ex(self, proto): for base in cls.__mro__: if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE: break + new = base.__new__ + if isinstance(new, _new_type) and new.__self__ is base: + break else: base = object # not really reachable if base is object: diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index fb972a3ba5e9b0..ae288f5d01250a 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -1969,6 +1969,17 @@ def test_newobj_proxies(self): self.assertEqual(B(x), B(y), detail) self.assertEqual(x.__dict__, y.__dict__, detail) + def test_newobj_overridden_new(self): + # Test that Python class with C implemented __new__ is pickleable + for proto in protocols: + x = MyIntWithNew2(1) + x.foo = 42 + s = self.dumps(x, proto) + y = self.loads(s) + self.assertIs(type(y), MyIntWithNew2) + self.assertEqual(int(y), 1) + self.assertEqual(y.foo, 42) + def test_newobj_not_class(self): # Issue 24552 global SimpleNewObj @@ -3089,6 +3100,13 @@ class MyFrozenSet(frozenset): MyStr, MyUnicode, MyTuple, MyList, MyDict, MySet, MyFrozenSet] +class MyIntWithNew(int): + def __new__(cls, value): + raise AssertionError + +class MyIntWithNew2(MyIntWithNew): + __new__ = int.__new__ + class SlotList(MyList): __slots__ = ["foo"] diff --git a/Misc/NEWS.d/next/Library/2020-10-21-23-45-02.bpo-41052.3N7J2J.rst b/Misc/NEWS.d/next/Library/2020-10-21-23-45-02.bpo-41052.3N7J2J.rst new file mode 100644 index 00000000000000..528e90ed13493c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-21-23-45-02.bpo-41052.3N7J2J.rst @@ -0,0 +1,2 @@ +Pickling heap types implemented in C with protocols 0 and 1 raises now an +error instead of producing incorrect data. diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c index effb0de2e65369..bfcdac692461f1 100644 --- a/Modules/_bz2module.c +++ b/Modules/_bz2module.c @@ -272,21 +272,6 @@ _bz2_BZ2Compressor_flush_impl(BZ2Compressor *self) return result; } -/*[clinic input] -_bz2.BZ2Compressor.__reduce__ - -[clinic start generated code]*/ - -static PyObject * -_bz2_BZ2Compressor___reduce___impl(BZ2Compressor *self) -/*[clinic end generated code: output=d13db66ae043e141 input=e09bccef0e6731b2]*/ -{ - PyErr_Format(PyExc_TypeError, - "cannot pickle %s object", - Py_TYPE(self)->tp_name); - return NULL; -} - static void* BZ2_Malloc(void* ctx, int items, int size) { @@ -399,7 +384,6 @@ BZ2Compressor_traverse(BZ2Compressor *self, visitproc visit, void *arg) static PyMethodDef BZ2Compressor_methods[] = { _BZ2_BZ2COMPRESSOR_COMPRESS_METHODDEF _BZ2_BZ2COMPRESSOR_FLUSH_METHODDEF - _BZ2_BZ2COMPRESSOR___REDUCE___METHODDEF {NULL} }; @@ -642,21 +626,6 @@ _bz2_BZ2Decompressor_decompress_impl(BZ2Decompressor *self, Py_buffer *data, return result; } -/*[clinic input] -_bz2.BZ2Decompressor.__reduce__ - -[clinic start generated code]*/ - -static PyObject * -_bz2_BZ2Decompressor___reduce___impl(BZ2Decompressor *self) -/*[clinic end generated code: output=f6a40650813f482e input=8db9175a609fdd43]*/ -{ - PyErr_Format(PyExc_TypeError, - "cannot pickle %s object", - Py_TYPE(self)->tp_name); - return NULL; -} - /* Argument Clinic is not used since the Argument Clinic always want to check the type which would be wrong here */ static int @@ -746,7 +715,6 @@ BZ2Decompressor_traverse(BZ2Decompressor *self, visitproc visit, void *arg) static PyMethodDef BZ2Decompressor_methods[] = { _BZ2_BZ2DECOMPRESSOR_DECOMPRESS_METHODDEF - _BZ2_BZ2DECOMPRESSOR___REDUCE___METHODDEF {NULL} }; diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c index 24e1d6c2884ce5..b01f6300098136 100644 --- a/Modules/_lzmamodule.c +++ b/Modules/_lzmamodule.c @@ -825,24 +825,9 @@ Compressor_dealloc(Compressor *self) Py_DECREF(tp); } -/*[clinic input] -_lzma.LZMACompressor.__reduce__ -[clinic start generated code]*/ - -static PyObject * -_lzma_LZMACompressor___reduce___impl(Compressor *self) -/*[clinic end generated code: output=b49a0538d1cad752 input=6be52aba16b513c1]*/ -{ - PyErr_Format(PyExc_TypeError, - "cannot pickle %s object", - Py_TYPE(self)->tp_name); - return NULL; -} - static PyMethodDef Compressor_methods[] = { _LZMA_LZMACOMPRESSOR_COMPRESS_METHODDEF _LZMA_LZMACOMPRESSOR_FLUSH_METHODDEF - _LZMA_LZMACOMPRESSOR___REDUCE___METHODDEF {NULL} }; @@ -1309,23 +1294,8 @@ Decompressor_traverse(Decompressor *self, visitproc visit, void *arg) return 0; } -/*[clinic input] -_lzma.LZMADecompressor.__reduce__ -[clinic start generated code]*/ - -static PyObject * -_lzma_LZMADecompressor___reduce___impl(Decompressor *self) -/*[clinic end generated code: output=2611fff0104a9c30 input=b9882e030aecd9a5]*/ -{ - PyErr_Format(PyExc_TypeError, - "cannot pickle %s object", - Py_TYPE(self)->tp_name); - return NULL; -} - static PyMethodDef Decompressor_methods[] = { _LZMA_LZMADECOMPRESSOR_DECOMPRESS_METHODDEF - _LZMA_LZMADECOMPRESSOR___REDUCE___METHODDEF {NULL} }; diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index b8bc0449c1b1b2..d33870808622fa 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -536,29 +536,12 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } -/*[clinic input] - -_random.Random.__reduce__ - -[clinic start generated code]*/ - -static PyObject * -_random_Random___reduce___impl(RandomObject *self) -/*[clinic end generated code: output=ddea0dcdb60ffd6d input=bd38ec35fd157e0f]*/ -{ - PyErr_Format(PyExc_TypeError, - "cannot pickle %s object", - Py_TYPE(self)->tp_name); - return NULL; -} - static PyMethodDef random_methods[] = { _RANDOM_RANDOM_RANDOM_METHODDEF _RANDOM_RANDOM_SEED_METHODDEF _RANDOM_RANDOM_GETSTATE_METHODDEF _RANDOM_RANDOM_SETSTATE_METHODDEF _RANDOM_RANDOM_GETRANDBITS_METHODDEF - _RANDOM_RANDOM___REDUCE___METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/clinic/_bz2module.c.h b/Modules/clinic/_bz2module.c.h index ff67d34155dfdf..71ad0b135718a9 100644 --- a/Modules/clinic/_bz2module.c.h +++ b/Modules/clinic/_bz2module.c.h @@ -65,23 +65,6 @@ _bz2_BZ2Compressor_flush(BZ2Compressor *self, PyObject *Py_UNUSED(ignored)) return _bz2_BZ2Compressor_flush_impl(self); } -PyDoc_STRVAR(_bz2_BZ2Compressor___reduce____doc__, -"__reduce__($self, /)\n" -"--\n" -"\n"); - -#define _BZ2_BZ2COMPRESSOR___REDUCE___METHODDEF \ - {"__reduce__", (PyCFunction)_bz2_BZ2Compressor___reduce__, METH_NOARGS, _bz2_BZ2Compressor___reduce____doc__}, - -static PyObject * -_bz2_BZ2Compressor___reduce___impl(BZ2Compressor *self); - -static PyObject * -_bz2_BZ2Compressor___reduce__(BZ2Compressor *self, PyObject *Py_UNUSED(ignored)) -{ - return _bz2_BZ2Compressor___reduce___impl(self); -} - PyDoc_STRVAR(_bz2_BZ2Decompressor_decompress__doc__, "decompress($self, /, data, max_length=-1)\n" "--\n" @@ -156,21 +139,4 @@ _bz2_BZ2Decompressor_decompress(BZ2Decompressor *self, PyObject *const *args, Py return return_value; } - -PyDoc_STRVAR(_bz2_BZ2Decompressor___reduce____doc__, -"__reduce__($self, /)\n" -"--\n" -"\n"); - -#define _BZ2_BZ2DECOMPRESSOR___REDUCE___METHODDEF \ - {"__reduce__", (PyCFunction)_bz2_BZ2Decompressor___reduce__, METH_NOARGS, _bz2_BZ2Decompressor___reduce____doc__}, - -static PyObject * -_bz2_BZ2Decompressor___reduce___impl(BZ2Decompressor *self); - -static PyObject * -_bz2_BZ2Decompressor___reduce__(BZ2Decompressor *self, PyObject *Py_UNUSED(ignored)) -{ - return _bz2_BZ2Decompressor___reduce___impl(self); -} -/*[clinic end generated code: output=001f31fdacb4cb01 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ed10705d7a9fd598 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_lzmamodule.c.h b/Modules/clinic/_lzmamodule.c.h index e15cc0c7e743b6..526031ade3b96b 100644 --- a/Modules/clinic/_lzmamodule.c.h +++ b/Modules/clinic/_lzmamodule.c.h @@ -65,23 +65,6 @@ _lzma_LZMACompressor_flush(Compressor *self, PyObject *Py_UNUSED(ignored)) return _lzma_LZMACompressor_flush_impl(self); } -PyDoc_STRVAR(_lzma_LZMACompressor___reduce____doc__, -"__reduce__($self, /)\n" -"--\n" -"\n"); - -#define _LZMA_LZMACOMPRESSOR___REDUCE___METHODDEF \ - {"__reduce__", (PyCFunction)_lzma_LZMACompressor___reduce__, METH_NOARGS, _lzma_LZMACompressor___reduce____doc__}, - -static PyObject * -_lzma_LZMACompressor___reduce___impl(Compressor *self); - -static PyObject * -_lzma_LZMACompressor___reduce__(Compressor *self, PyObject *Py_UNUSED(ignored)) -{ - return _lzma_LZMACompressor___reduce___impl(self); -} - PyDoc_STRVAR(_lzma_LZMADecompressor_decompress__doc__, "decompress($self, /, data, max_length=-1)\n" "--\n" @@ -228,23 +211,6 @@ _lzma_LZMADecompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs return return_value; } -PyDoc_STRVAR(_lzma_LZMADecompressor___reduce____doc__, -"__reduce__($self, /)\n" -"--\n" -"\n"); - -#define _LZMA_LZMADECOMPRESSOR___REDUCE___METHODDEF \ - {"__reduce__", (PyCFunction)_lzma_LZMADecompressor___reduce__, METH_NOARGS, _lzma_LZMADecompressor___reduce____doc__}, - -static PyObject * -_lzma_LZMADecompressor___reduce___impl(Decompressor *self); - -static PyObject * -_lzma_LZMADecompressor___reduce__(Decompressor *self, PyObject *Py_UNUSED(ignored)) -{ - return _lzma_LZMADecompressor___reduce___impl(self); -} - PyDoc_STRVAR(_lzma_is_check_supported__doc__, "is_check_supported($module, check_id, /)\n" "--\n" @@ -320,4 +286,4 @@ _lzma__decode_filter_properties(PyObject *module, PyObject *const *args, Py_ssiz return return_value; } -/*[clinic end generated code: output=d89b6159e98544be input=a9049054013a1b77]*/ +/*[clinic end generated code: output=867b9e334053b679 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_randommodule.c.h b/Modules/clinic/_randommodule.c.h index 3322a370288c3f..b3cd435b6f2047 100644 --- a/Modules/clinic/_randommodule.c.h +++ b/Modules/clinic/_randommodule.c.h @@ -109,21 +109,4 @@ _random_Random_getrandbits(RandomObject *self, PyObject *arg) exit: return return_value; } - -PyDoc_STRVAR(_random_Random___reduce____doc__, -"__reduce__($self, /)\n" -"--\n" -"\n"); - -#define _RANDOM_RANDOM___REDUCE___METHODDEF \ - {"__reduce__", (PyCFunction)_random_Random___reduce__, METH_NOARGS, _random_Random___reduce____doc__}, - -static PyObject * -_random_Random___reduce___impl(RandomObject *self); - -static PyObject * -_random_Random___reduce__(RandomObject *self, PyObject *Py_UNUSED(ignored)) -{ - return _random_Random___reduce___impl(self); -} -/*[clinic end generated code: output=450f0961c2c92389 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=cc8a23b2757dc6ba input=a9049054013a1b77]*/ From 05fbeab8fe0e23a0c85fc5194faa7ca0e05c65b2 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Sat, 24 Oct 2020 12:07:35 -0700 Subject: [PATCH 0369/1261] bpo-35823: Allow setsid() after vfork() on Linux. (GH-22945) It should just be a syscall updating a couple of fields in the kernel side process info. Confirming, in glibc is appears to be a shim for the setsid syscall (based on not finding any code implementing anything special for it) and in uclibc (*much* easier to read) it is clearly just a setsid syscall shim. A breadcrumb _suggesting_ that it is not allowed on Darwin/macOS comes from a commit in emacs: https://lists.gnu.org/archive/html/bug-gnu-emacs/2017-04/msg00297.html but I don't have a way to verify if that is true or not. As we are not supporting vfork on macOS today I just left a note in a comment. --- Modules/_posixsubprocess.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index b7cba30ee7618a..8baea314f4e409 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -38,6 +38,8 @@ #if defined(__linux__) && defined(HAVE_VFORK) && defined(HAVE_SIGNAL_H) && \ defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK) +/* If this is ever expanded to non-Linux platforms, verify what calls are + * allowed after vfork(). Ex: setsid() may be disallowed on macOS? */ # include # define VFORK_USABLE 1 #endif @@ -712,7 +714,6 @@ do_fork_exec(char *const exec_array[], #ifdef VFORK_USABLE if (child_sigmask) { /* These are checked by our caller; verify them in debug builds. */ - assert(!call_setsid); assert(!call_setuid); assert(!call_setgid); assert(!call_setgroups); @@ -997,7 +998,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) /* Use vfork() only if it's safe. See the comment above child_exec(). */ sigset_t old_sigs; if (preexec_fn == Py_None && - !call_setuid && !call_setgid && !call_setgroups && !call_setsid) { + !call_setuid && !call_setgid && !call_setgroups) { /* Block all signals to ensure that no signal handlers are run in the * child process while it shares memory with us. Note that signals * used internally by C libraries won't be blocked by From a9f3050584e8f7cc655576b8406eb46e02f8765d Mon Sep 17 00:00:00 2001 From: Mark Roseman Date: Sat, 24 Oct 2020 16:32:34 -0700 Subject: [PATCH 0370/1261] bpo-33987: Use ttk Label on IDLE statusbar (GH-22941) --- Lib/idlelib/statusbar.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Lib/idlelib/statusbar.py b/Lib/idlelib/statusbar.py index ae52a56368c82a..755fafb0ac6438 100644 --- a/Lib/idlelib/statusbar.py +++ b/Lib/idlelib/statusbar.py @@ -1,5 +1,4 @@ -from tkinter import Label -from tkinter.ttk import Frame +from tkinter.ttk import Label, Frame class MultiStatusBar(Frame): From 1cc8ec1c2fb91479b59cbd286b17314787c44f4b Mon Sep 17 00:00:00 2001 From: Mark Roseman Date: Sat, 24 Oct 2020 16:45:00 -0700 Subject: [PATCH 0371/1261] bpo-33987: Use master ttk Frame for IDLE config dialog (GH-22943) --- Lib/idlelib/configdialog.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 82596498d34611..a84e1c5668f99f 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -67,7 +67,6 @@ def __init__(self, parent, title='', *, _htest=False, _utest=False): if not _utest: self.withdraw() - self.configure(borderwidth=5) self.title(title or 'IDLE Preferences') x = parent.winfo_rootx() + 20 y = parent.winfo_rooty() + (30 if not _htest else 150) @@ -97,6 +96,7 @@ def create_widgets(self): """Create and place widgets for tabbed dialog. Widgets Bound to self: + frame: encloses all other widgets note: Notebook highpage: HighPage fontpage: FontPage @@ -109,7 +109,9 @@ def create_widgets(self): load_configs: Load pages except for extensions. activate_config_changes: Tell editors to reload. """ - self.note = note = Notebook(self) + self.frame = frame = Frame(self, padding="5px") + self.frame.grid(sticky="nwes") + self.note = note = Notebook(frame) self.highpage = HighPage(note) self.fontpage = FontPage(note, self.highpage) self.keyspage = KeysPage(note) @@ -148,7 +150,7 @@ def create_action_buttons(self): padding_args = {} else: padding_args = {'padding': (6, 3)} - outer = Frame(self, padding=2) + outer = Frame(self.frame, padding=2) buttons_frame = Frame(outer, padding=2) self.buttons = {} for txt, cmd in ( @@ -687,7 +689,7 @@ class HighPage(Frame): def __init__(self, master): super().__init__(master) - self.cd = master.master + self.cd = master.winfo_toplevel() self.style = Style(master) self.create_page_highlight() self.load_theme_cfg() @@ -1346,7 +1348,7 @@ class KeysPage(Frame): def __init__(self, master): super().__init__(master) - self.cd = master.master + self.cd = master.winfo_toplevel() self.create_page_keys() self.load_key_cfg() From 660ede74782b809c301c0a4e73f7398f00546a76 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 24 Oct 2020 18:17:17 -0700 Subject: [PATCH 0372/1261] bpo-42127: Document effect of cached_property on key-sharing dictionaries (GH-22930) --- Doc/library/functools.rst | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 186cb4c381dee4..75c9d41b43acd0 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -73,16 +73,31 @@ The :mod:`functools` module defines the following functions: def variance(self): return statistics.variance(self._data) - .. versionadded:: 3.8 + Note, this decorator interferes with the operation of :pep:`412` + key-sharing dictionaries. This means that instance dictionaries + can take more space than usual. - .. note:: + Also, this decorator requires that the ``__dict__`` attribute on each instance + be a mutable mapping. This means it will not work with some types, such as + metaclasses (since the ``__dict__`` attributes on type instances are + read-only proxies for the class namespace), and those that specify + ``__slots__`` without including ``__dict__`` as one of the defined slots + (as such classes don't provide a ``__dict__`` attribute at all). + + If a mutable mapping is not available or if space-efficient key sharing + is desired, an effect similar to :func:`cached_property` can be achieved + by a stacking :func:`property` on top of :func:`cache`:: - This decorator requires that the ``__dict__`` attribute on each instance - be a mutable mapping. This means it will not work with some types, such as - metaclasses (since the ``__dict__`` attributes on type instances are - read-only proxies for the class namespace), and those that specify - ``__slots__`` without including ``__dict__`` as one of the defined slots - (as such classes don't provide a ``__dict__`` attribute at all). + class DataSet: + def __init__(self, sequence_of_numbers): + self._data = sequence_of_numbers + + @property + @cache + def stdev(self): + return statistics.stdev(self._data) + + .. versionadded:: 3.8 .. function:: cmp_to_key(func) @@ -658,4 +673,4 @@ callable, weak referencable, and can have attributes. There are some important differences. For instance, the :attr:`~definition.__name__` and :attr:`__doc__` attributes are not created automatically. Also, :class:`partial` objects defined in classes behave like static methods and do not transform into bound methods -during instance attribute look-up. \ No newline at end of file +during instance attribute look-up. From 440e337a663ba4a50119510e57dd3588b4a0b155 Mon Sep 17 00:00:00 2001 From: Mark Roseman Date: Sat, 24 Oct 2020 20:14:02 -0700 Subject: [PATCH 0373/1261] bpo-33987: Add master ttk Frame to IDLE search dialogs (GH-22942) --- Lib/idlelib/NEWS.txt | 3 +++ Lib/idlelib/idle_test/test_searchbase.py | 14 +++++++------- Lib/idlelib/searchbase.py | 19 ++++++++++++------- .../2020-10-24-21-27-37.bpo-33987.fIh9JL.rst | 3 +++ 4 files changed, 25 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-10-24-21-27-37.bpo-33987.fIh9JL.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 754034200a1f62..3ece623b3aa187 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2021-10-04? ====================================== +bpo-33987: Mostly finish using ttk widgets, mainly for editor, +settings, and searches. Some patches by Mark Roseman. + bpo-41775: Make 'IDLE Shell' the shell title. bpo-35764: Rewrite the Calltips doc section. diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index aee0c4c69929a6..8c9c410ebaf47c 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -76,7 +76,7 @@ def test_create_widgets(self): def test_make_entry(self): equal = self.assertEqual self.dialog.row = 0 - self.dialog.top = self.root + self.dialog.frame = Frame(self.root) entry, label = self.dialog.make_entry("Test:", 'hello') equal(label['text'], 'Test:') @@ -89,7 +89,7 @@ def test_make_entry(self): equal(self.dialog.row, 1) def test_create_entries(self): - self.dialog.top = self.root + self.dialog.frame = Frame(self.root) self.dialog.row = 0 self.engine.setpat('hello') self.dialog.create_entries() @@ -97,7 +97,7 @@ def test_create_entries(self): def test_make_frame(self): self.dialog.row = 0 - self.dialog.top = self.root + self.dialog.frame = Frame(self.root) frame, label = self.dialog.make_frame() self.assertEqual(label, '') self.assertEqual(str(type(frame)), "") @@ -108,7 +108,7 @@ def test_make_frame(self): self.assertEqual(label['text'], 'testlabel') def btn_test_setup(self, meth): - self.dialog.top = self.root + self.dialog.frame = Frame(self.root) self.dialog.row = 0 return meth() @@ -140,13 +140,13 @@ def test_create_other_buttons(self): self.assertEqual(var.get(), state) def test_make_button(self): - self.dialog.top = self.root - self.dialog.buttonframe = Frame(self.dialog.top) + self.dialog.frame = Frame(self.root) + self.dialog.buttonframe = Frame(self.dialog.frame) btn = self.dialog.make_button('Test', self.dialog.close) self.assertEqual(btn['text'], 'Test') def test_create_command_buttons(self): - self.dialog.top = self.root + self.dialog.frame = Frame(self.root) self.dialog.create_command_buttons() # Look for close button command in buttonframe closebuttoncommand = '' diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index 6fba0b8e583f2b..fbef87aa2d3d04 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -33,6 +33,7 @@ def __init__(self, root, engine): '''Initialize root, engine, and top attributes. top (level widget): set in create_widgets() called from open(). + frame: container for all widgets in dialog. text (Text searched): set in open(), only used in subclasses(). ent (ry): created in make_entry() called from create_entry(). row (of grid): 0 in create_widgets(), +1 in make_entry/frame(). @@ -83,10 +84,14 @@ def create_widgets(self): top.wm_title(self.title) top.wm_iconname(self.icon) self.top = top + self.frame = Frame(top, padding="5px") + self.frame.grid(sticky="nwes") + top.grid_columnconfigure(0, weight=100) + top.grid_rowconfigure(0, weight=100) self.row = 0 - self.top.grid_columnconfigure(0, pad=2, weight=0) - self.top.grid_columnconfigure(1, pad=2, minsize=100, weight=100) + self.frame.grid_columnconfigure(0, pad=2, weight=0) + self.frame.grid_columnconfigure(1, pad=2, minsize=100, weight=100) self.create_entries() # row 0 (and maybe 1), cols 0, 1 self.create_option_buttons() # next row, cols 0, 1 @@ -99,9 +104,9 @@ def make_entry(self, label_text, var): entry - gridded labeled Entry for text entry. label - Label widget, returned for testing. ''' - label = Label(self.top, text=label_text) + label = Label(self.frame, text=label_text) label.grid(row=self.row, column=0, sticky="nw") - entry = Entry(self.top, textvariable=var, exportselection=0) + entry = Entry(self.frame, textvariable=var, exportselection=0) entry.grid(row=self.row, column=1, sticky="nwe") self.row = self.row + 1 return entry, label @@ -117,11 +122,11 @@ def make_frame(self,labeltext=None): label - Label widget, returned for testing. ''' if labeltext: - label = Label(self.top, text=labeltext) + label = Label(self.frame, text=labeltext) label.grid(row=self.row, column=0, sticky="nw") else: label = '' - frame = Frame(self.top) + frame = Frame(self.frame) frame.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 return frame, label @@ -171,7 +176,7 @@ def make_button(self, label, command, isdef=0): def create_command_buttons(self): "Place buttons in vertical command frame gridded on right." - f = self.buttonframe = Frame(self.top) + f = self.buttonframe = Frame(self.frame) f.grid(row=0,column=2,padx=2,pady=2,ipadx=2,ipady=2) b = self.make_button("Close", self.close) diff --git a/Misc/NEWS.d/next/IDLE/2020-10-24-21-27-37.bpo-33987.fIh9JL.rst b/Misc/NEWS.d/next/IDLE/2020-10-24-21-27-37.bpo-33987.fIh9JL.rst new file mode 100644 index 00000000000000..1e67edc03c658d --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-10-24-21-27-37.bpo-33987.fIh9JL.rst @@ -0,0 +1,3 @@ +Mostly finish using ttk widgets, mainly for editor, settings, +and searches. Some patches by Mark Roseman. + From 1dc0632a5d55d135ef296501e0ec561f95215c3a Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 24 Oct 2020 20:34:39 -0700 Subject: [PATCH 0374/1261] Second round of updates to the descriptor howto guide (GH-22946) --- Doc/howto/descriptor.rst | 252 ++++++++++++++++++++++++--------------- 1 file changed, 156 insertions(+), 96 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 4e9fad30d31c4f..bed4078e3a3a9d 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -29,8 +29,8 @@ This HowTo guide has three major sections: Primer ^^^^^^ -In this primer, we start with most basic possible example and then we'll add -new capabilities one by one. +In this primer, we start with the most basic possible example and then we'll +add new capabilities one by one. Simple example: A descriptor that returns a constant @@ -197,7 +197,7 @@ be recorded, giving each descriptor its own *public_name* and *private_name*:: import logging - logging.basicConfig(level=logging.INFO) + logging.basicConfig(level=logging.INFO, force=True) class LoggedAccess: @@ -258,6 +258,10 @@ Closing thoughts A :term:`descriptor` is what we call any object that defines :meth:`__get__`, :meth:`__set__`, or :meth:`__delete__`. +Optionally, descriptors can have a :meth:`__set_name__` method. This is only +used in cases where a descriptor needs to know either the class where it is +created or the name of class variable it was assigned to. + Descriptors get invoked by the dot operator during attribute lookup. If a descriptor is accessed indirectly with ``vars(some_class)[descriptor_name]``, the descriptor instance is returned without invoking it. @@ -291,7 +295,7 @@ Validator class A validator is a descriptor for managed attribute access. Prior to storing any data, it verifies that the new value meets various type and range restrictions. If those restrictions aren't met, it raises an exception to -prevents data corruption at its source. +prevent data corruption at its source. This :class:`Validator` class is both an :term:`abstract base class` and a managed attribute descriptor:: @@ -438,12 +442,12 @@ In general, a descriptor is an object attribute with "binding behavior", one whose attribute access has been overridden by methods in the descriptor protocol. Those methods are :meth:`__get__`, :meth:`__set__`, and :meth:`__delete__`. If any of those methods are defined for an object, it is -said to be a descriptor. +said to be a :term:`descriptor`. The default behavior for attribute access is to get, set, or delete the attribute from an object's dictionary. For instance, ``a.x`` has a lookup chain starting with ``a.__dict__['x']``, then ``type(a).__dict__['x']``, and -continuing through the base classes of ``type(a)`` excluding metaclasses. If the +continuing through the base classes of ``type(a)``. If the looked-up value is an object defining one of the descriptor methods, then Python may override the default behavior and invoke the descriptor method instead. Where this occurs in the precedence chain depends on which descriptor methods @@ -492,60 +496,76 @@ Invoking Descriptors A descriptor can be called directly by its method name. For example, ``d.__get__(obj)``. -Alternatively, it is more common for a descriptor to be invoked automatically -upon attribute access. For example, ``obj.d`` looks up ``d`` in the dictionary -of ``obj``. If ``d`` defines the method :meth:`__get__`, then ``d.__get__(obj)`` +But it is more common for a descriptor to be invoked automatically from +attribute access. The expression ``obj.d`` looks up ``d`` in the dictionary of +``obj``. If ``d`` defines the method :meth:`__get__`, then ``d.__get__(obj)`` is invoked according to the precedence rules listed below. -The details of invocation depend on whether ``obj`` is an object or a class. +The details of invocation depend on whether ``obj`` is an object, class, or +instance of super. + +**Objects**: The machinery is in :meth:`object.__getattribute__`. + +It transforms ``b.x`` into ``type(b).__dict__['x'].__get__(b, type(b))``. -For objects, the machinery is in :meth:`object.__getattribute__` which -transforms ``b.x`` into ``type(b).__dict__['x'].__get__(b, type(b))``. The -implementation works through a precedence chain that gives data descriptors +The implementation works through a precedence chain that gives data descriptors priority over instance variables, instance variables priority over non-data descriptors, and assigns lowest priority to :meth:`__getattr__` if provided. + The full C implementation can be found in :c:func:`PyObject_GenericGetAttr()` in :source:`Objects/object.c`. -For classes, the machinery is in :meth:`type.__getattribute__` which transforms -``B.x`` into ``B.__dict__['x'].__get__(None, B)``. In pure Python, it looks -like:: +**Classes**: The machinery is in :meth:`type.__getattribute__`. + +It transforms ``A.x`` into ``A.__dict__['x'].__get__(None, A)``. + +In pure Python, it looks like this:: - def __getattribute__(self, key): + def __getattribute__(cls, key): "Emulate type_getattro() in Objects/typeobject.c" - v = object.__getattribute__(self, key) + v = object.__getattribute__(cls, key) if hasattr(v, '__get__'): - return v.__get__(None, self) + return v.__get__(None, cls) return v -The important points to remember are: +**Super**: The machinery is in the custom :meth:`__getattribute__` method for +object returned by :class:`super()`. -* descriptors are invoked by the :meth:`__getattribute__` method -* overriding :meth:`__getattribute__` prevents automatic descriptor calls -* :meth:`object.__getattribute__` and :meth:`type.__getattribute__` make - different calls to :meth:`__get__`. -* data descriptors always override instance dictionaries. -* non-data descriptors may be overridden by instance dictionaries. +The attribute lookup ``super(A, obj).m`` searches ``obj.__class__.__mro__`` for +the base class ``B`` immediately following ``A`` and then returns +``B.__dict__['m'].__get__(obj, A)``. -The object returned by ``super()`` also has a custom :meth:`__getattribute__` -method for invoking descriptors. The attribute lookup ``super(B, obj).m`` searches -``obj.__class__.__mro__`` for the base class ``A`` immediately following ``B`` -and then returns ``A.__dict__['m'].__get__(obj, B)``. If not a descriptor, -``m`` is returned unchanged. If not in the dictionary, ``m`` reverts to a -search using :meth:`object.__getattribute__`. +If not a descriptor, ``m`` is returned unchanged. If not in the dictionary, +``m`` reverts to a search using :meth:`object.__getattribute__`. The implementation details are in :c:func:`super_getattro()` in -:source:`Objects/typeobject.c`. and a pure Python equivalent can be found in +:source:`Objects/typeobject.c`. A pure Python equivalent can be found in `Guido's Tutorial`_. .. _`Guido's Tutorial`: https://www.python.org/download/releases/2.2.3/descrintro/#cooperation -The details above show that the mechanism for descriptors is embedded in the -:meth:`__getattribute__()` methods for :class:`object`, :class:`type`, and -:func:`super`. Classes inherit this machinery when they derive from -:class:`object` or if they have a metaclass providing similar functionality. -Likewise, classes can turn-off descriptor invocation by overriding -:meth:`__getattribute__()`. +**Summary**: The details listed above show that the mechanism for descriptors is +embedded in the :meth:`__getattribute__()` methods for :class:`object`, +:class:`type`, and :func:`super`. + +The important points to remember are: + +* Descriptors are invoked by the :meth:`__getattribute__` method. + +* Classes inherit this machinery from :class:`object`, :class:`type`, or + :func:`super`. + +* Overriding :meth:`__getattribute__` prevents automatic descriptor calls + because all the descriptor logic is in that method. + +* :meth:`object.__getattribute__` and :meth:`type.__getattribute__` make + different calls to :meth:`__get__`. The first includes the instance and may + include the class. The second puts in ``None`` for the instance and always + includes the class. + +* Data descriptors always override instance dictionaries. + +* Non-data descriptors may be overridden by instance dictionaries. Automatic Name Notification @@ -569,47 +589,70 @@ afterwards, :meth:`__set_name__` will need to be called manually. Descriptor Example ------------------ -The following code creates a class whose objects are data descriptors which -print a message for each get or set. Overriding :meth:`__getattribute__` is -alternate approach that could do this for every attribute. However, this -descriptor is useful for monitoring just a few chosen attributes:: +The following code is simplified skeleton showing how data descriptors could +be used to implement an `object relational mapping +`_. - class RevealAccess: - """A data descriptor that sets and returns values - normally and prints a message logging their access. - """ +The essential idea is that instances only hold keys to a database table. The +actual data is stored in an external table that is being dynamically updated:: - def __init__(self, initval=None, name='var'): - self.val = initval - self.name = name + class Field: + + def __set_name__(self, owner, name): + self.fetch = f'SELECT {name} FROM {owner.table} WHERE {owner.key}=?;' + self.store = f'UPDATE {owner.table} SET {name}=? WHERE {owner.key}=?;' def __get__(self, obj, objtype=None): - print('Retrieving', self.name) - return self.val + return conn.execute(self.fetch, [obj.key]).fetchone()[0] - def __set__(self, obj, val): - print('Updating', self.name) - self.val = val + def __set__(self, obj, value): + conn.execute(self.store, [value, obj.key]) + conn.commit() - class B: - x = RevealAccess(10, 'var "x"') - y = 5 +We can use the :class:`Field` to define "models" that describe the schema for +each table in a database:: - >>> m = B() - >>> m.x - Retrieving var "x" - 10 - >>> m.x = 20 - Updating var "x" - >>> m.x - Retrieving var "x" - 20 - >>> m.y - 5 + class Movie: + table = 'Movies' # Table name + key = 'title' # Primary key + director = Field() + year = Field() -The protocol is simple and offers exciting possibilities. Several use cases are -so common that they have been packaged into individual function calls. -Properties, bound methods, static methods, and class methods are all + def __init__(self, key): + self.key = key + + class Song: + table = 'Music' + key = 'title' + artist = Field() + year = Field() + genre = Field() + + def __init__(self, key): + self.key = key + +An interactive session shows how data is retrieved from the database and how +it can be updated:: + + >>> import sqlite3 + >>> conn = sqlite3.connect('entertainment.db') + + >>> Movie('Star Wars').director + 'George Lucas' + >>> jaws = Movie('Jaws') + >>> f'Released in {jaws.year} by {jaws.director}' + 'Released in 1975 by Steven Spielberg' + + >>> Song('Country Roads').artist + 'John Denver' + + >>> Movie('Star Wars').director = 'J.J. Abrams' + >>> Movie('Star Wars').director + 'J.J. Abrams' + +The descriptor protocol is simple and offers exciting possibilities. Several +use cases are so common that they have been packaged into individual function +calls. Properties, bound methods, static methods, and class methods are all based on the descriptor protocol. @@ -619,7 +662,7 @@ Properties Calling :func:`property` is a succinct way of building a data descriptor that triggers function calls upon access to an attribute. Its signature is:: - property(fget=None, fset=None, fdel=None, doc=None) -> property attribute + property(fget=None, fset=None, fdel=None, doc=None) -> property The documentation shows a typical use to define a managed attribute ``x``:: @@ -695,17 +738,30 @@ Functions and Methods Python's object oriented features are built upon a function based environment. Using non-data descriptors, the two are merged seamlessly. -Class dictionaries store methods as functions. In a class definition, methods -are written using :keyword:`def` or :keyword:`lambda`, the usual tools for -creating functions. Methods only differ from regular functions in that the -first argument is reserved for the object instance. By Python convention, the -instance reference is called *self* but may be called *this* or any other -variable name. +Functions stored in class dictionaries get turned into methods when invoked. +Methods only differ from regular functions in that the object instance is +prepended to the other arguments. By convention, the instance is called +*self* but could be called *this* or any other variable name. + +Methods can be created manually with :class:`types.MethodType` which is +roughly equivalent to:: + + class Method: + "Emulate Py_MethodType in Objects/classobject.c" + + def __init__(self, func, obj): + self.__func__ = func + self.__self__ = obj + + def __call__(self, *args, **kwargs): + func = self.__func__ + obj = self.__self__ + return func(obj, *args, **kwargs) -To support method calls, functions include the :meth:`__get__` method for -binding methods during attribute access. This means that all functions are -non-data descriptors which return bound methods when they are invoked from an -object. In pure Python, it works like this:: +To support automatic creation of methods, functions include the +:meth:`__get__` method for binding methods during attribute access. This +means that functions are non-data descriptors which return bound methods +during dotted lookup from an instance. Here's how it works:: class Function: ... @@ -716,15 +772,20 @@ object. In pure Python, it works like this:: return self return types.MethodType(self, obj) -Running the following in class in the interpreter shows how the function +Running the following class in the interpreter shows how the function descriptor works in practice:: class D: def f(self, x): return x -Access through the class dictionary does not invoke :meth:`__get__`. Instead, -it just returns the underlying function object:: +The function has a :term:`qualified name` attribute to support introspection:: + + >>> D.f.__qualname__ + 'D.f' + +Accessing the function through the class dictionary does not invoke +:meth:`__get__`. Instead, it just returns the underlying function object:: >>> D.__dict__['f'] @@ -735,13 +796,8 @@ underlying function unchanged:: >>> D.f -The function has a :term:`qualified name` attribute to support introspection:: - - >>> D.f.__qualname__ - 'D.f' - -Dotted access from an instance calls :meth:`__get__` which returns a bound -method object:: +The interesting behavior occurs during dotted access from an instance. The +dotted lookup calls :meth:`__get__` which returns a bound method object:: >>> d = D() >>> d.f @@ -752,9 +808,13 @@ instance:: >>> d.f.__func__ + >>> d.f.__self__ <__main__.D object at 0x1012e1f98> +If you have ever wondered where *self* comes from in regular methods or where +*cls* comes from in class methods, this is it! + Static Methods and Class Methods -------------------------------- @@ -798,8 +858,8 @@ in statistical work but does not directly depend on a particular dataset. It can be called either from an object or the class: ``s.erf(1.5) --> .9332`` or ``Sample.erf(1.5) --> .9332``. -Since staticmethods return the underlying function with no changes, the example -calls are unexciting:: +Since static methods return the underlying function with no changes, the +example calls are unexciting:: class E: @staticmethod @@ -840,7 +900,7 @@ for whether the caller is an object or a class:: This behavior is useful whenever the function only needs to have a class reference and does not care about any underlying data. One use for -classmethods is to create alternate class constructors. The classmethod +class methods is to create alternate class constructors. The classmethod :func:`dict.fromkeys` creates a new dictionary from a list of keys. The pure Python equivalent is:: From 502dceb5a3edae7a9ebf0f3a648e5f56274b7cf3 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 25 Oct 2020 06:08:17 +0000 Subject: [PATCH 0375/1261] Correctly compare the hint against the keys in _PyDict_GetItemHint (GH-22960) --- Objects/dictobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 8e749623452868..42d71e56d4547c 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1448,7 +1448,7 @@ _PyDict_GetItemHint(PyDictObject *mp, PyObject *key, assert(PyDict_CheckExact((PyObject*)mp)); assert(PyUnicode_CheckExact(key)); - if (hint >= 0 && hint < _PyDict_KeysSize(mp->ma_keys)) { + if (hint >= 0 && hint < mp->ma_keys->dk_nentries) { PyObject *res = NULL; PyDictKeyEntry *ep = DK_ENTRIES(mp->ma_keys) + (size_t)hint; From 12dec2ffb2ed42220d1b3d69036b064880e98ef7 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 25 Oct 2020 07:12:50 -0700 Subject: [PATCH 0376/1261] Split-out a fourth section in the descriptor HowTo guide (GH-22965) --- Doc/howto/descriptor.rst | 96 +++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index bed4078e3a3a9d..f1d1ab1d1d6101 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -13,7 +13,7 @@ Descriptor HowTo Guide :term:`Descriptors ` let objects customize attribute lookup, storage, and deletion. -This HowTo guide has three major sections: +This guide has four major sections: 1) The "primer" gives a basic overview, moving gently from simple examples, adding one feature at a time. It is a great place to start. @@ -25,6 +25,11 @@ This HowTo guide has three major sections: detailed mechanics of how descriptors work. Most people don't need this level of detail. +4) The last section has pure Python equivalents for built-in descriptors that + are written in C. Read this if you're curious about how functions turn + into bound methods or about how to implement common tools like + :func:`classmethod`, :func:`staticmethod`, and :func:`property`. + Primer ^^^^^^ @@ -99,7 +104,7 @@ different, updated answers each time:: 3 >>> os.system('touch games/newfile') # Add a fourth file to the directory 0 - >>> g.size + >>> g.size # Automatically updated 4 >>> s.size # The songs directory has twenty files 20 @@ -197,7 +202,7 @@ be recorded, giving each descriptor its own *public_name* and *private_name*:: import logging - logging.basicConfig(level=logging.INFO, force=True) + logging.basicConfig(level=logging.INFO) class LoggedAccess: @@ -259,7 +264,7 @@ A :term:`descriptor` is what we call any object that defines :meth:`__get__`, :meth:`__set__`, or :meth:`__delete__`. Optionally, descriptors can have a :meth:`__set_name__` method. This is only -used in cases where a descriptor needs to know either the class where it is +used in cases where a descriptor needs to know either the class where it was created or the name of class variable it was assigned to. Descriptors get invoked by the dot operator during attribute lookup. If a @@ -318,7 +323,7 @@ managed attribute descriptor:: def validate(self, value): pass -Custom validators need to subclass from :class:`Validator` and supply a +Custom validators need to inherit from :class:`Validator` and must supply a :meth:`validate` method to test various restrictions as needed. @@ -334,8 +339,9 @@ Here are three practical data validation utilities: minimum or maximum. 3) :class:`String` verifies that a value is a :class:`str`. Optionally, it - validates a given minimum or maximum length. Optionally, it can test for - another predicate as well. + validates a given minimum or maximum length. It can validate a + user-defined `predicate + `_ as well. :: @@ -398,7 +404,7 @@ Here's how the data validators can be used in a real class:: class Component: name = String(minsize=3, maxsize=10, predicate=str.isupper) - kind = OneOf('plastic', 'metal') + kind = OneOf('wood', 'metal', 'plastic') quantity = Number(minvalue=0) def __init__(self, name, kind, quantity): @@ -426,9 +432,7 @@ Abstract -------- Defines descriptors, summarizes the protocol, and shows how descriptors are -called. Examines a custom descriptor and several built-in Python descriptors -including functions, properties, static methods, and class methods. Shows how -each works by giving a pure Python equivalent and a sample application. +called. Provides an example showing how object relational mappings work. Learning about descriptors not only provides access to a larger toolset, it creates a deeper understanding of how Python works and an appreciation for the @@ -519,24 +523,17 @@ The full C implementation can be found in :c:func:`PyObject_GenericGetAttr()` in It transforms ``A.x`` into ``A.__dict__['x'].__get__(None, A)``. -In pure Python, it looks like this:: - - def __getattribute__(cls, key): - "Emulate type_getattro() in Objects/typeobject.c" - v = object.__getattribute__(cls, key) - if hasattr(v, '__get__'): - return v.__get__(None, cls) - return v +The full C implementation can be found in :c:func:`type_getattro()` in +:source:`Objects/typeobject.c`. **Super**: The machinery is in the custom :meth:`__getattribute__` method for object returned by :class:`super()`. The attribute lookup ``super(A, obj).m`` searches ``obj.__class__.__mro__`` for the base class ``B`` immediately following ``A`` and then returns -``B.__dict__['m'].__get__(obj, A)``. - -If not a descriptor, ``m`` is returned unchanged. If not in the dictionary, -``m`` reverts to a search using :meth:`object.__getattribute__`. +``B.__dict__['m'].__get__(obj, A)``. If not a descriptor, ``m`` is returned +unchanged. If not in the dictionary, ``m`` reverts to a search using +:meth:`object.__getattribute__`. The implementation details are in :c:func:`super_getattro()` in :source:`Objects/typeobject.c`. A pure Python equivalent can be found in @@ -544,9 +541,9 @@ The implementation details are in :c:func:`super_getattro()` in .. _`Guido's Tutorial`: https://www.python.org/download/releases/2.2.3/descrintro/#cooperation -**Summary**: The details listed above show that the mechanism for descriptors is -embedded in the :meth:`__getattribute__()` methods for :class:`object`, -:class:`type`, and :func:`super`. +**Summary**: The mechanism for descriptors is embedded in the +:meth:`__getattribute__()` methods for :class:`object`, :class:`type`, and +:func:`super`. The important points to remember are: @@ -586,15 +583,16 @@ place at the time of class creation. If descriptors are added to the class afterwards, :meth:`__set_name__` will need to be called manually. -Descriptor Example ------------------- +ORM Example +----------- The following code is simplified skeleton showing how data descriptors could be used to implement an `object relational mapping `_. -The essential idea is that instances only hold keys to a database table. The -actual data is stored in an external table that is being dynamically updated:: +The essential idea is that the data is stored in an external database. The +Python instances only hold keys to the database's tables. Descriptors take +care of lookups or updates:: class Field: @@ -609,8 +607,8 @@ actual data is stored in an external table that is being dynamically updated:: conn.execute(self.store, [value, obj.key]) conn.commit() -We can use the :class:`Field` to define "models" that describe the schema for -each table in a database:: +We can use the :class:`Field` class to define "models" that describe the schema +for each table in a database:: class Movie: table = 'Movies' # Table name @@ -650,10 +648,13 @@ it can be updated:: >>> Movie('Star Wars').director 'J.J. Abrams' +Pure Python Equivalents +^^^^^^^^^^^^^^^^^^^^^^^ + The descriptor protocol is simple and offers exciting possibilities. Several -use cases are so common that they have been packaged into individual function -calls. Properties, bound methods, static methods, and class methods are all -based on the descriptor protocol. +use cases are so common that they have been prepackaged into builtin tools. +Properties, bound methods, static methods, and class methods are all based on +the descriptor protocol. Properties @@ -746,7 +747,7 @@ prepended to the other arguments. By convention, the instance is called Methods can be created manually with :class:`types.MethodType` which is roughly equivalent to:: - class Method: + class MethodType: "Emulate Py_MethodType in Objects/classobject.c" def __init__(self, func, obj): @@ -770,7 +771,7 @@ during dotted lookup from an instance. Here's how it works:: "Simulate func_descr_get() in Objects/funcobject.c" if obj is None: return self - return types.MethodType(self, obj) + return MethodType(self, obj) Running the following class in the interpreter shows how the function descriptor works in practice:: @@ -816,8 +817,8 @@ If you have ever wondered where *self* comes from in regular methods or where *cls* comes from in class methods, this is it! -Static Methods and Class Methods --------------------------------- +Static Methods +-------------- Non-data descriptors provide a simple mechanism for variations on the usual patterns of binding functions into methods. @@ -883,6 +884,10 @@ Using the non-data descriptor protocol, a pure Python version of def __get__(self, obj, objtype=None): return self.f + +Class Methods +------------- + Unlike static methods, class methods prepend the class reference to the argument list before calling the function. This format is the same for whether the caller is an object or a class:: @@ -897,12 +902,11 @@ for whether the caller is an object or a class:: >>> print(F().f(3)) ('F', 3) - -This behavior is useful whenever the function only needs to have a class -reference and does not care about any underlying data. One use for -class methods is to create alternate class constructors. The classmethod -:func:`dict.fromkeys` creates a new dictionary from a list of keys. The pure -Python equivalent is:: +This behavior is useful whenever the method only needs to have a class +reference and does rely on data stored in a specific instance. One use for +class methods is to create alternate class constructors. For example, the +classmethod :func:`dict.fromkeys` creates a new dictionary from a list of +keys. The pure Python equivalent is:: class Dict: ... @@ -934,7 +938,7 @@ Using the non-data descriptor protocol, a pure Python version of cls = type(obj) if hasattr(obj, '__get__'): return self.f.__get__(cls) - return types.MethodType(self.f, cls) + return MethodType(self.f, cls) The code path for ``hasattr(obj, '__get__')`` was added in Python 3.9 and makes it possible for :func:`classmethod` to support chained decorators. From 9c5513f8af615d7325e57281c872e3d41b8b4ccf Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 25 Oct 2020 07:59:01 -0700 Subject: [PATCH 0377/1261] bpo-39108: Document threading issues for random.gauss() (GH-22928) --- Doc/library/random.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 5a9359484d11a8..c243aced986e56 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -319,6 +319,13 @@ be found in any statistics text. deviation. This is slightly faster than the :func:`normalvariate` function defined below. + Multithreading note: When two threads call this function + simultaneously, it is possible that they will receive the + same return value. This can be avoided in three ways. + 1) Have each thread use a different instance of the random + number generator. 2) Put locks around all calls. 3) Use the + slower, but thread-safe :func:`normalvariate` function instead. + .. function:: lognormvariate(mu, sigma) From 8fab78f0f1c1470d5cffd0d25a869ac168eb05f6 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sun, 25 Oct 2020 12:02:30 -0600 Subject: [PATCH 0378/1261] bpo-42144: Add a missing "goto error;" in the _ssl module (GH-22959) --- Modules/_ssl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index cb8f04a900a06e..54c365b88e6951 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -899,6 +899,7 @@ _ssl_configure_hostname(PySSLSocket *self, const char* server_hostname) if (ip == NULL) { if (!SSL_set_tlsext_host_name(self->ssl, server_hostname)) { _setSSLError(NULL, 0, __FILE__, __LINE__); + goto error; } } if (self->ctx->check_hostname) { From 71ab2735c4d3b75a43b71fce9239199924eef78f Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 25 Oct 2020 14:21:46 -0400 Subject: [PATCH 0379/1261] bpo-41490: ``path`` and ``contents`` to aggressively close handles (#22915) * bpo-41490: ``path`` method to aggressively close handles * Add blurb * In ZipReader.contents, eagerly evaluate the contents to release references to the zipfile. * Instead use _ensure_sequence to ensure any iterable from a reader is eagerly converted to a list if it's not already a sequence. --- Lib/importlib/_common.py | 5 +- Lib/importlib/readers.py | 6 +- Lib/importlib/resources.py | 37 +++++--- Lib/test/test_importlib/test_resource.py | 79 ++++++++++++++++++ .../test_importlib/zipdata01/ziptestdata.zip | Bin 876 -> 1131 bytes .../test_importlib/zipdata02/ziptestdata.zip | Bin 698 -> 698 bytes .../2020-10-23-08-54-47.bpo-41490.-Yk6OD.rst | 3 + 7 files changed, 114 insertions(+), 16 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-23-08-54-47.bpo-41490.-Yk6OD.rst diff --git a/Lib/importlib/_common.py b/Lib/importlib/_common.py index b15c59eb9c98af..71ce6af8cc9851 100644 --- a/Lib/importlib/_common.py +++ b/Lib/importlib/_common.py @@ -88,6 +88,7 @@ def _tempfile(reader, suffix=''): try: os.write(fd, reader()) os.close(fd) + del reader yield pathlib.Path(raw_path) finally: try: @@ -97,14 +98,12 @@ def _tempfile(reader, suffix=''): @functools.singledispatch -@contextlib.contextmanager def as_file(path): """ Given a Traversable object, return that object as a path on the local file system in a context manager. """ - with _tempfile(path.read_bytes, suffix=path.name) as local: - yield local + return _tempfile(path.read_bytes, suffix=path.name) @as_file.register(pathlib.Path) diff --git a/Lib/importlib/readers.py b/Lib/importlib/readers.py index 6331e4daf4313c..74a63e4a7535bd 100644 --- a/Lib/importlib/readers.py +++ b/Lib/importlib/readers.py @@ -22,8 +22,8 @@ def files(self): class ZipReader(abc.TraversableResources): def __init__(self, loader, module): _, _, name = module.rpartition('.') - prefix = loader.prefix.replace('\\', '/') + name + '/' - self.path = zipfile.Path(loader.archive, prefix) + self.prefix = loader.prefix.replace('\\', '/') + name + '/' + self.archive = loader.archive def open_resource(self, resource): try: @@ -38,4 +38,4 @@ def is_resource(self, path): return target.is_file() and target.exists() def files(self): - return self.path + return zipfile.Path(self.archive, self.prefix) diff --git a/Lib/importlib/resources.py b/Lib/importlib/resources.py index 4535619f4f0143..4169171b189cca 100644 --- a/Lib/importlib/resources.py +++ b/Lib/importlib/resources.py @@ -1,8 +1,9 @@ import os +import io from . import _common from ._common import as_file, files -from contextlib import contextmanager, suppress +from contextlib import suppress from importlib.abc import ResourceLoader from io import BytesIO, TextIOWrapper from pathlib import Path @@ -10,6 +11,8 @@ from typing import ContextManager, Iterable, Union from typing import cast from typing.io import BinaryIO, TextIO +from collections.abc import Sequence +from functools import singledispatch __all__ = [ @@ -102,22 +105,26 @@ def path( """ reader = _common.get_resource_reader(_common.get_package(package)) return ( - _path_from_reader(reader, resource) + _path_from_reader(reader, _common.normalize_path(resource)) if reader else _common.as_file( _common.files(package).joinpath(_common.normalize_path(resource))) ) -@contextmanager def _path_from_reader(reader, resource): - norm_resource = _common.normalize_path(resource) + return _path_from_resource_path(reader, resource) or \ + _path_from_open_resource(reader, resource) + + +def _path_from_resource_path(reader, resource): with suppress(FileNotFoundError): - yield Path(reader.resource_path(norm_resource)) - return - opener_reader = reader.open_resource(norm_resource) - with _common._tempfile(opener_reader.read, suffix=norm_resource) as res: - yield res + return Path(reader.resource_path(resource)) + + +def _path_from_open_resource(reader, resource): + saved = io.BytesIO(reader.open_resource(resource).read()) + return _common._tempfile(saved.read, suffix=resource) def is_resource(package: Package, name: str) -> bool: @@ -146,7 +153,7 @@ def contents(package: Package) -> Iterable[str]: package = _common.get_package(package) reader = _common.get_resource_reader(package) if reader is not None: - return reader.contents() + return _ensure_sequence(reader.contents()) # Is the package a namespace package? By definition, namespace packages # cannot have resources. namespace = ( @@ -156,3 +163,13 @@ def contents(package: Package) -> Iterable[str]: if namespace or not package.__spec__.has_location: return () return list(item.name for item in _common.from_package(package).iterdir()) + + +@singledispatch +def _ensure_sequence(iterable): + return list(iterable) + + +@_ensure_sequence.register(Sequence) +def _(iterable): + return iterable diff --git a/Lib/test/test_importlib/test_resource.py b/Lib/test/test_importlib/test_resource.py index f88d92d1546729..1d1bdad1b218df 100644 --- a/Lib/test/test_importlib/test_resource.py +++ b/Lib/test/test_importlib/test_resource.py @@ -1,10 +1,14 @@ import sys import unittest +import uuid +import pathlib from . import data01 from . import zipdata01, zipdata02 from . import util from importlib import resources, import_module +from test.support import import_helper +from test.support.os_helper import unlink class ResourceTests: @@ -162,5 +166,80 @@ def test_namespaces_cannot_have_resources(self): 'test.test_importlib.data03.namespace', 'resource1.txt') +class DeletingZipsTest(unittest.TestCase): + """Having accessed resources in a zip file should not keep an open + reference to the zip. + """ + ZIP_MODULE = zipdata01 + + def setUp(self): + modules = import_helper.modules_setup() + self.addCleanup(import_helper.modules_cleanup, *modules) + + data_path = pathlib.Path(self.ZIP_MODULE.__file__) + data_dir = data_path.parent + self.source_zip_path = data_dir / 'ziptestdata.zip' + self.zip_path = pathlib.Path('{}.zip'.format(uuid.uuid4())).absolute() + self.zip_path.write_bytes(self.source_zip_path.read_bytes()) + sys.path.append(str(self.zip_path)) + self.data = import_module('ziptestdata') + + def tearDown(self): + try: + sys.path.remove(str(self.zip_path)) + except ValueError: + pass + + try: + del sys.path_importer_cache[str(self.zip_path)] + del sys.modules[self.data.__name__] + except KeyError: + pass + + try: + unlink(self.zip_path) + except OSError: + # If the test fails, this will probably fail too + pass + + def test_contents_does_not_keep_open(self): + c = resources.contents('ziptestdata') + self.zip_path.unlink() + del c + + def test_is_resource_does_not_keep_open(self): + c = resources.is_resource('ziptestdata', 'binary.file') + self.zip_path.unlink() + del c + + def test_is_resource_failure_does_not_keep_open(self): + c = resources.is_resource('ziptestdata', 'not-present') + self.zip_path.unlink() + del c + + @unittest.skip("Desired but not supported.") + def test_path_does_not_keep_open(self): + c = resources.path('ziptestdata', 'binary.file') + self.zip_path.unlink() + del c + + def test_entered_path_does_not_keep_open(self): + # This is what certifi does on import to make its bundle + # available for the process duration. + c = resources.path('ziptestdata', 'binary.file').__enter__() + self.zip_path.unlink() + del c + + def test_read_binary_does_not_keep_open(self): + c = resources.read_binary('ziptestdata', 'binary.file') + self.zip_path.unlink() + del c + + def test_read_text_does_not_keep_open(self): + c = resources.read_text('ziptestdata', 'utf-8.file', encoding='utf-8') + self.zip_path.unlink() + del c + + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_importlib/zipdata01/ziptestdata.zip b/Lib/test/test_importlib/zipdata01/ziptestdata.zip index 8d8fa97f199cc29f6905404ea05f88926658ee2b..12f7872cd596ace39602223cc127ad6c13bbca89 100644 GIT binary patch literal 1131 zcmaJf(O}q#y>WP~hS1_KM0; zZZ9ZMoby*q+jcU^M!lRZCWnq|8>yJcgV5iQg=(7BvzVsk`Xdpvb$K(1B8*Z7wXI&u z9nGslC>#lZwb`ATC>_0DAc%4YledMdrbk{kVrS>iO&!0PM+nyvrbi_Wfa5fs)Y7dbLRJa2Gynh4&re;NK57z)QD%O}fMH67EA*Tv15S`|s;=?O?$3rK!uN#^h| z^rj*3V>+JUmKVZ#EtBxBh$Jr(31EuADn$6uxHab9Y5Jpv#H&I$@@?0h!h$U;m zW}lx}BPkHz&B!FejBx4XgUk{vTN=d~C+o9FPyWFyu7Ga23e098y`?b{q)?BKje(6} NJ0kGw*zAHbvki50HhIS zpApCbKmlY2FfxfS;|@5WZ@^$lBZ$HojJOQ}1tbhCX*2~gkqyBJR#bz~0~TRW9u|XO zz61wzfH$g9Fs&dO)lJ*bjKT&?E(z02lENC@Ig!?SR;Polaa10BMBT zX9RKpPypEhj7%cTxC0L88!*_?2%>NXBW^=L0SN Date: Mon, 26 Oct 2020 02:38:33 +0800 Subject: [PATCH 0380/1261] bpo-41919: Avoid resource leak in test_io (GH-22973) Co-authored-by: Pablo Galindo --- Lib/test/test_io.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index fbaea3aaec3cbe..cc54d0ea0062f2 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -2519,15 +2519,17 @@ def process_word(self): codecEnabled = False - @classmethod - def lookupTestDecoder(cls, name): - if cls.codecEnabled and name == 'test_decoder': - latin1 = codecs.lookup('latin-1') - return codecs.CodecInfo( - name='test_decoder', encode=latin1.encode, decode=None, - incrementalencoder=None, - streamreader=None, streamwriter=None, - incrementaldecoder=cls) + +# bpo-41919: This method is separated from StatefulIncrementalDecoder to avoid a resource leak +# when registering codecs and cleanup functions. +def lookupTestDecoder(name): + if StatefulIncrementalDecoder.codecEnabled and name == 'test_decoder': + latin1 = codecs.lookup('latin-1') + return codecs.CodecInfo( + name='test_decoder', encode=latin1.encode, decode=None, + incrementalencoder=None, + streamreader=None, streamwriter=None, + incrementaldecoder=StatefulIncrementalDecoder) class StatefulIncrementalDecoderTest(unittest.TestCase): @@ -2579,9 +2581,8 @@ def setUp(self): self.testdata = b"AAA\r\nBBB\rCCC\r\nDDD\nEEE\r\n" self.normalized = b"AAA\nBBB\nCCC\nDDD\nEEE\n".decode("ascii") os_helper.unlink(os_helper.TESTFN) - codecs.register(StatefulIncrementalDecoder.lookupTestDecoder) - self.addCleanup(codecs.unregister, - StatefulIncrementalDecoder.lookupTestDecoder) + codecs.register(lookupTestDecoder) + self.addCleanup(codecs.unregister, lookupTestDecoder) def tearDown(self): os_helper.unlink(os_helper.TESTFN) From 3b99d54db3cffff4ec4b07d57d281a4833e27aef Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 25 Oct 2020 14:45:05 -0400 Subject: [PATCH 0381/1261] bpo-42043: Add support for zipfile.Path subclasses (#22716) * bpo-42043: Add support for zipfile.Path inheritance as introduced in zipp 3.2.0. * Add blurb. --- Lib/test/test_zipfile.py | 312 ++++++++++++------ Lib/zipfile.py | 39 ++- .../2020-10-15-17-20-37.bpo-42043.OS0p_v.rst | 4 + 3 files changed, 240 insertions(+), 115 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-15-17-20-37.bpo-42043.OS0p_v.rst diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 3bb9ce995c2a17..b3c24213f3474d 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -13,6 +13,7 @@ import unittest import unittest.mock as mock import zipfile +import functools from tempfile import TemporaryFile @@ -2836,6 +2837,20 @@ def build_alpharep_fixture(): return zf +def pass_alpharep(meth): + """ + Given a method, wrap it in a for loop that invokes method + with each subtest. + """ + + @functools.wraps(meth) + def wrapper(self): + for alpharep in self.zipfile_alpharep(): + meth(self, alpharep=alpharep) + + return wrapper + + class TestPath(unittest.TestCase): def setUp(self): self.fixtures = contextlib.ExitStack() @@ -2847,47 +2862,58 @@ def zipfile_alpharep(self): with self.subTest(): yield add_dirs(build_alpharep_fixture()) - def zipfile_ondisk(self): + def zipfile_ondisk(self, alpharep): tmpdir = pathlib.Path(self.fixtures.enter_context(temp_dir())) - for alpharep in self.zipfile_alpharep(): - buffer = alpharep.fp - alpharep.close() - path = tmpdir / alpharep.filename - with path.open("wb") as strm: - strm.write(buffer.getvalue()) - yield path - - def test_iterdir_and_types(self): - for alpharep in self.zipfile_alpharep(): - root = zipfile.Path(alpharep) - assert root.is_dir() - a, b, g = root.iterdir() - assert a.is_file() - assert b.is_dir() - assert g.is_dir() - c, f, d = b.iterdir() - assert c.is_file() and f.is_file() - e, = d.iterdir() - assert e.is_file() - h, = g.iterdir() - i, = h.iterdir() - assert i.is_file() - - def test_subdir_is_dir(self): - for alpharep in self.zipfile_alpharep(): - root = zipfile.Path(alpharep) - assert (root / 'b').is_dir() - assert (root / 'b/').is_dir() - assert (root / 'g').is_dir() - assert (root / 'g/').is_dir() - - def test_open(self): - for alpharep in self.zipfile_alpharep(): - root = zipfile.Path(alpharep) - a, b, g = root.iterdir() - with a.open() as strm: - data = strm.read() - assert data == "content of a" + buffer = alpharep.fp + alpharep.close() + path = tmpdir / alpharep.filename + with path.open("wb") as strm: + strm.write(buffer.getvalue()) + return path + + @pass_alpharep + def test_iterdir_and_types(self, alpharep): + root = zipfile.Path(alpharep) + assert root.is_dir() + a, b, g = root.iterdir() + assert a.is_file() + assert b.is_dir() + assert g.is_dir() + c, f, d = b.iterdir() + assert c.is_file() and f.is_file() + (e,) = d.iterdir() + assert e.is_file() + (h,) = g.iterdir() + (i,) = h.iterdir() + assert i.is_file() + + @pass_alpharep + def test_is_file_missing(self, alpharep): + root = zipfile.Path(alpharep) + assert not root.joinpath('missing.txt').is_file() + + @pass_alpharep + def test_iterdir_on_file(self, alpharep): + root = zipfile.Path(alpharep) + a, b, g = root.iterdir() + with self.assertRaises(ValueError): + a.iterdir() + + @pass_alpharep + def test_subdir_is_dir(self, alpharep): + root = zipfile.Path(alpharep) + assert (root / 'b').is_dir() + assert (root / 'b/').is_dir() + assert (root / 'g').is_dir() + assert (root / 'g/').is_dir() + + @pass_alpharep + def test_open(self, alpharep): + root = zipfile.Path(alpharep) + a, b, g = root.iterdir() + with a.open() as strm: + data = strm.read() + assert data == "content of a" def test_open_write(self): """ @@ -2908,6 +2934,14 @@ def test_open_extant_directory(self): with self.assertRaises(IsADirectoryError): zf.joinpath('b').open() + @pass_alpharep + def test_open_binary_invalid_args(self, alpharep): + root = zipfile.Path(alpharep) + with self.assertRaises(ValueError): + root.joinpath('a.txt').open('rb', encoding='utf-8') + with self.assertRaises(ValueError): + root.joinpath('a.txt').open('rb', 'utf-8') + def test_open_missing_directory(self): """ Attempting to open a missing directory raises FileNotFoundError. @@ -2916,75 +2950,87 @@ def test_open_missing_directory(self): with self.assertRaises(FileNotFoundError): zf.joinpath('z').open() - def test_read(self): - for alpharep in self.zipfile_alpharep(): - root = zipfile.Path(alpharep) - a, b, g = root.iterdir() - assert a.read_text() == "content of a" - assert a.read_bytes() == b"content of a" - - def test_joinpath(self): - for alpharep in self.zipfile_alpharep(): - root = zipfile.Path(alpharep) - a = root.joinpath("a") - assert a.is_file() - e = root.joinpath("b").joinpath("d").joinpath("e.txt") - assert e.read_text() == "content of e" - - def test_traverse_truediv(self): - for alpharep in self.zipfile_alpharep(): - root = zipfile.Path(alpharep) - a = root / "a" - assert a.is_file() - e = root / "b" / "d" / "e.txt" - assert e.read_text() == "content of e" + @pass_alpharep + def test_read(self, alpharep): + root = zipfile.Path(alpharep) + a, b, g = root.iterdir() + assert a.read_text() == "content of a" + assert a.read_bytes() == b"content of a" + + @pass_alpharep + def test_joinpath(self, alpharep): + root = zipfile.Path(alpharep) + a = root.joinpath("a.txt") + assert a.is_file() + e = root.joinpath("b").joinpath("d").joinpath("e.txt") + assert e.read_text() == "content of e" + + @pass_alpharep + def test_traverse_truediv(self, alpharep): + root = zipfile.Path(alpharep) + a = root / "a.txt" + assert a.is_file() + e = root / "b" / "d" / "e.txt" + assert e.read_text() == "content of e" + + @pass_alpharep + def test_traverse_simplediv(self, alpharep): + """ + Disable the __future__.division when testing traversal. + """ + code = compile( + source="zipfile.Path(alpharep) / 'a'", + filename="(test)", + mode="eval", + dont_inherit=True, + ) + eval(code) - def test_pathlike_construction(self): + @pass_alpharep + def test_pathlike_construction(self, alpharep): """ zipfile.Path should be constructable from a path-like object """ - for zipfile_ondisk in self.zipfile_ondisk(): - pathlike = pathlib.Path(str(zipfile_ondisk)) - zipfile.Path(pathlike) - - def test_traverse_pathlike(self): - for alpharep in self.zipfile_alpharep(): - root = zipfile.Path(alpharep) - root / pathlib.Path("a") - - def test_parent(self): - for alpharep in self.zipfile_alpharep(): - root = zipfile.Path(alpharep) - assert (root / 'a').parent.at == '' - assert (root / 'a' / 'b').parent.at == 'a/' - - def test_dir_parent(self): - for alpharep in self.zipfile_alpharep(): - root = zipfile.Path(alpharep) - assert (root / 'b').parent.at == '' - assert (root / 'b/').parent.at == '' - - def test_missing_dir_parent(self): - for alpharep in self.zipfile_alpharep(): - root = zipfile.Path(alpharep) - assert (root / 'missing dir/').parent.at == '' - - def test_mutability(self): + zipfile_ondisk = self.zipfile_ondisk(alpharep) + pathlike = pathlib.Path(str(zipfile_ondisk)) + zipfile.Path(pathlike) + + @pass_alpharep + def test_traverse_pathlike(self, alpharep): + root = zipfile.Path(alpharep) + root / pathlib.Path("a") + + @pass_alpharep + def test_parent(self, alpharep): + root = zipfile.Path(alpharep) + assert (root / 'a').parent.at == '' + assert (root / 'a' / 'b').parent.at == 'a/' + + @pass_alpharep + def test_dir_parent(self, alpharep): + root = zipfile.Path(alpharep) + assert (root / 'b').parent.at == '' + assert (root / 'b/').parent.at == '' + + @pass_alpharep + def test_missing_dir_parent(self, alpharep): + root = zipfile.Path(alpharep) + assert (root / 'missing dir/').parent.at == '' + + @pass_alpharep + def test_mutability(self, alpharep): """ If the underlying zipfile is changed, the Path object should reflect that change. """ - for alpharep in self.zipfile_alpharep(): - root = zipfile.Path(alpharep) - a, b, g = root.iterdir() - alpharep.writestr('foo.txt', 'foo') - alpharep.writestr('bar/baz.txt', 'baz') - assert any( - child.name == 'foo.txt' - for child in root.iterdir()) - assert (root / 'foo.txt').read_text() == 'foo' - baz, = (root / 'bar').iterdir() - assert baz.read_text() == 'baz' + root = zipfile.Path(alpharep) + a, b, g = root.iterdir() + alpharep.writestr('foo.txt', 'foo') + alpharep.writestr('bar/baz.txt', 'baz') + assert any(child.name == 'foo.txt' for child in root.iterdir()) + assert (root / 'foo.txt').read_text() == 'foo' + (baz,) = (root / 'bar').iterdir() + assert baz.read_text() == 'baz' HUGE_ZIPFILE_NUM_ENTRIES = 2 ** 13 @@ -3013,11 +3059,65 @@ def test_implied_dirs_performance(self): data = ['/'.join(string.ascii_lowercase + str(n)) for n in range(10000)] zipfile.CompleteDirs._implied_dirs(data) - def test_read_does_not_close(self): - for alpharep in self.zipfile_ondisk(): - with zipfile.ZipFile(alpharep) as file: - for rep in range(2): - zipfile.Path(file, 'a.txt').read_text() + @pass_alpharep + def test_read_does_not_close(self, alpharep): + alpharep = self.zipfile_ondisk(alpharep) + with zipfile.ZipFile(alpharep) as file: + for rep in range(2): + zipfile.Path(file, 'a.txt').read_text() + + @pass_alpharep + def test_subclass(self, alpharep): + class Subclass(zipfile.Path): + pass + + root = Subclass(alpharep) + assert isinstance(root / 'b', Subclass) + + @pass_alpharep + def test_filename(self, alpharep): + root = zipfile.Path(alpharep) + assert root.filename == pathlib.Path('alpharep.zip') + + @pass_alpharep + def test_root_name(self, alpharep): + """ + The name of the root should be the name of the zipfile + """ + root = zipfile.Path(alpharep) + assert root.name == 'alpharep.zip' == root.filename.name + + @pass_alpharep + def test_root_parent(self, alpharep): + root = zipfile.Path(alpharep) + assert root.parent == pathlib.Path('.') + root.root.filename = 'foo/bar.zip' + assert root.parent == pathlib.Path('foo') + + @pass_alpharep + def test_root_unnamed(self, alpharep): + """ + It is an error to attempt to get the name + or parent of an unnamed zipfile. + """ + alpharep.filename = None + root = zipfile.Path(alpharep) + with self.assertRaises(TypeError): + root.name + with self.assertRaises(TypeError): + root.parent + + # .name and .parent should still work on subs + sub = root / "b" + assert sub.name == "b" + assert sub.parent + + @pass_alpharep + def test_inheritance(self, alpharep): + cls = type('PathChild', (zipfile.Path,), {}) + for alpharep in self.zipfile_alpharep(): + file = cls(alpharep).joinpath('some dir').parent + assert isinstance(file, cls) if __name__ == "__main__": diff --git a/Lib/zipfile.py b/Lib/zipfile.py index da3e40e5dbd41b..e1a50a3eb51d95 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -16,6 +16,7 @@ import threading import time import contextlib +import pathlib try: import zlib # We may need its compression method @@ -2210,6 +2211,7 @@ class FastLookup(CompleteDirs): ZipFile subclass to ensure implicit dirs exist and are resolved rapidly. """ + def namelist(self): with contextlib.suppress(AttributeError): return self.__names @@ -2241,7 +2243,7 @@ class Path: >>> zf.writestr('a.txt', 'content of a') >>> zf.writestr('b/c.txt', 'content of c') >>> zf.writestr('b/d/e.txt', 'content of e') - >>> zf.filename = 'abcde.zip' + >>> zf.filename = 'mem/abcde.zip' Path accepts the zipfile object itself or a filename @@ -2253,9 +2255,9 @@ class Path: >>> a, b = root.iterdir() >>> a - Path('abcde.zip', 'a.txt') + Path('mem/abcde.zip', 'a.txt') >>> b - Path('abcde.zip', 'b/') + Path('mem/abcde.zip', 'b/') name property: @@ -2266,7 +2268,7 @@ class Path: >>> c = b / 'c.txt' >>> c - Path('abcde.zip', 'b/c.txt') + Path('mem/abcde.zip', 'b/c.txt') >>> c.name 'c.txt' @@ -2284,8 +2286,21 @@ class Path: Coercion to string: - >>> str(c) - 'abcde.zip/b/c.txt' + >>> import os + >>> str(c).replace(os.sep, posixpath.sep) + 'mem/abcde.zip/b/c.txt' + + At the root, ``name``, ``filename``, and ``parent`` + resolve to the zipfile. Note these attributes are not + valid and will raise a ``ValueError`` if the zipfile + has no filename. + + >>> root.name + 'abcde.zip' + >>> str(root.filename).replace(os.sep, posixpath.sep) + 'mem/abcde.zip' + >>> str(root.parent) + 'mem' """ __repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})" @@ -2323,7 +2338,11 @@ def open(self, mode='r', *args, pwd=None, **kwargs): @property def name(self): - return posixpath.basename(self.at.rstrip("/")) + return pathlib.Path(self.at).name or self.filename.name + + @property + def filename(self): + return pathlib.Path(self.root.filename).joinpath(self.at) def read_text(self, *args, **kwargs): with self.open('r', *args, **kwargs) as strm: @@ -2337,13 +2356,13 @@ def _is_child(self, path): return posixpath.dirname(path.at.rstrip("/")) == self.at.rstrip("/") def _next(self, at): - return Path(self.root, at) + return self.__class__(self.root, at) def is_dir(self): return not self.at or self.at.endswith("/") def is_file(self): - return not self.is_dir() + return self.exists() and not self.is_dir() def exists(self): return self.at in self.root._name_set() @@ -2368,6 +2387,8 @@ def joinpath(self, add): @property def parent(self): + if not self.at: + return self.filename.parent parent_at = posixpath.dirname(self.at.rstrip('/')) if parent_at: parent_at += '/' diff --git a/Misc/NEWS.d/next/Library/2020-10-15-17-20-37.bpo-42043.OS0p_v.rst b/Misc/NEWS.d/next/Library/2020-10-15-17-20-37.bpo-42043.OS0p_v.rst new file mode 100644 index 00000000000000..b6b296956c35d3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-15-17-20-37.bpo-42043.OS0p_v.rst @@ -0,0 +1,4 @@ +Add support for ``zipfile.Path`` inheritance. ``zipfile.Path.is_file()`` now +returns False for non-existent names. ``zipfile.Path`` objects now expose a +``.filename`` attribute and rely on that to resolve ``.name`` and +``.parent`` when the ``Path`` object is at the root of the zipfile. From d580aaa58eae29208d211383a7bfcf0dc1a6eda4 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 25 Oct 2020 23:03:41 +0000 Subject: [PATCH 0382/1261] bpo-42150: Avoid buffer overflow in the new parser (GH-22978) --- .../Core and Builtins/2020-10-25-21-14-18.bpo-42150.b70u_T.rst | 2 ++ Parser/pegen.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-25-21-14-18.bpo-42150.b70u_T.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-25-21-14-18.bpo-42150.b70u_T.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-25-21-14-18.bpo-42150.b70u_T.rst new file mode 100644 index 00000000000000..62fabb857aa380 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-25-21-14-18.bpo-42150.b70u_T.rst @@ -0,0 +1,2 @@ +Fix possible buffer overflow in the new parser when checking for +continuation lines. Patch by Pablo Galindo. diff --git a/Parser/pegen.c b/Parser/pegen.c index efa5ed9f288ee0..c7343f7f047c39 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -990,7 +990,8 @@ bad_single_statement(Parser *p) /* Newlines are allowed if preceded by a line continuation character or if they appear inside a string. */ - if (!cur || *(cur - 1) == '\\' || newline_in_string(p, cur)) { + if (!cur || (cur != p->tok->buf && *(cur - 1) == '\\') + || newline_in_string(p, cur)) { return 0; } char c = *cur; From 38971c75c96e6120f06969dd256e2fa8a3a5c787 Mon Sep 17 00:00:00 2001 From: Alexey Izbyshev Date: Mon, 26 Oct 2020 03:09:32 +0300 Subject: [PATCH 0383/1261] bpo-42146: Fix memory leak in subprocess.Popen() in case of uid/gid overflow (GH-22966) Fix memory leak in subprocess.Popen() in case of uid/gid overflow Also add a test that would catch this leak with `--huntrleaks`. Alas, the test for `extra_groups` also exposes an inconsistency in our error reporting: we use a custom ValueError for `extra_groups`, but propagate OverflowError for `user` and `group`. --- Lib/test/test_subprocess.py | 13 +++++++++++++ .../2020-10-25-19-25-02.bpo-42146.6A8uvS.rst | 2 ++ Modules/_posixsubprocess.c | 4 ++-- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-25-19-25-02.bpo-42146.6A8uvS.rst diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 9fc4434649dbce..e25474abed4b78 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1895,6 +1895,10 @@ def test_user(self): with self.assertRaises(ValueError): subprocess.check_call(ZERO_RETURN_CMD, user=-1) + with self.assertRaises(OverflowError): + subprocess.check_call(ZERO_RETURN_CMD, + cwd=os.curdir, env=os.environ, user=2**64) + if pwd is None and name_uid is not None: with self.assertRaises(ValueError): subprocess.check_call(ZERO_RETURN_CMD, user=name_uid) @@ -1938,6 +1942,10 @@ def test_group(self): with self.assertRaises(ValueError): subprocess.check_call(ZERO_RETURN_CMD, group=-1) + with self.assertRaises(OverflowError): + subprocess.check_call(ZERO_RETURN_CMD, + cwd=os.curdir, env=os.environ, group=2**64) + if grp is None: with self.assertRaises(ValueError): subprocess.check_call(ZERO_RETURN_CMD, group=name_group) @@ -1986,6 +1994,11 @@ def test_extra_groups(self): with self.assertRaises(ValueError): subprocess.check_call(ZERO_RETURN_CMD, extra_groups=[-1]) + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, + cwd=os.curdir, env=os.environ, + extra_groups=[2**64]) + if grp is None: with self.assertRaises(ValueError): subprocess.check_call(ZERO_RETURN_CMD, diff --git a/Misc/NEWS.d/next/Library/2020-10-25-19-25-02.bpo-42146.6A8uvS.rst b/Misc/NEWS.d/next/Library/2020-10-25-19-25-02.bpo-42146.6A8uvS.rst new file mode 100644 index 00000000000000..041809803db6a2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-25-19-25-02.bpo-42146.6A8uvS.rst @@ -0,0 +1,2 @@ +Fix memory leak in :func:`subprocess.Popen` in case an uid (gid) specified in +`user` (`group`, `extra_groups`) overflows `uid_t` (`gid_t`). diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 8baea314f4e409..5e5fbb2e79a7f8 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -772,7 +772,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) uid_t uid; gid_t gid, *groups = NULL; int child_umask; - PyObject *cwd_obj, *cwd_obj2; + PyObject *cwd_obj, *cwd_obj2 = NULL; const char *cwd; pid_t pid; int need_to_reenable_gc = 0; @@ -894,7 +894,6 @@ subprocess_fork_exec(PyObject* self, PyObject *args) cwd = PyBytes_AsString(cwd_obj2); } else { cwd = NULL; - cwd_obj2 = NULL; } if (groups_list != Py_None) { @@ -1080,6 +1079,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) return PyLong_FromPid(pid); cleanup: + Py_XDECREF(cwd_obj2); if (envp) _Py_FreeCharPArray(envp); if (argv) From d7947a5ca5a041f9281f05000192d0112b40dc99 Mon Sep 17 00:00:00 2001 From: Antoine <43954001+awecx@users.noreply.github.com> Date: Mon, 26 Oct 2020 06:26:34 +0100 Subject: [PATCH 0384/1261] Add a link to buffer protocol in bytearray() doc (GH-22675) --- Doc/library/functions.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index b33aa81c643dc3..52a1512b5884fe 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -164,8 +164,8 @@ are always available. They are listed here in alphabetical order. * If it is an *integer*, the array will have that size and will be initialized with null bytes. - * If it is an object conforming to the *buffer* interface, a read-only buffer - of the object will be used to initialize the bytes array. + * If it is an object conforming to the :ref:`buffer interface `, + a read-only buffer of the object will be used to initialize the bytes array. * If it is an *iterable*, it must be an iterable of integers in the range ``0 <= x < 256``, which are used as the initial contents of the array. From f3e64341dc6349acf4bb304e67c0029bacb27cf1 Mon Sep 17 00:00:00 2001 From: Marco Sulla Date: Mon, 26 Oct 2020 06:30:51 +0100 Subject: [PATCH 0385/1261] Added some makefile generated files to .gitignore (GH-22435) --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 0962d3a1841fc4..80dcf34bf47a6f 100644 --- a/.gitignore +++ b/.gitignore @@ -103,6 +103,8 @@ Tools/unicode/data/ /config.status /config.status.lineno /platform +/profile-clean-stamp +/profile-run-stamp /pybuilddir.txt /pyconfig.h /python-config From ea0c92b2994b18acda5c2454696526e5454a07cc Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 26 Oct 2020 08:43:39 +0200 Subject: [PATCH 0386/1261] bpo-42006: Stop using PyDict_GetItem, PyDict_GetItemString and _PyDict_GetItemId. (GH-22648) These functions are considered not safe because they suppress all internal errors and can return wrong result. PyDict_GetItemString and _PyDict_GetItemId can also silence current exception in rare cases. Remove no longer used _PyDict_GetItemId. Add _PyDict_ContainsId and rename _PyDict_Contains into _PyDict_Contains_KnownHash. --- Include/cpython/dictobject.h | 4 +- Modules/_decimal/_decimal.c | 47 ++++++++++++++-------- Modules/_threadmodule.c | 8 +++- Modules/_zoneinfo.c | 18 ++++----- Modules/signalmodule.c | 3 +- Modules/socketmodule.c | 29 +++++++------- Objects/dictobject.c | 24 ++++++------ Objects/moduleobject.c | 28 ++++++++++---- Objects/setobject.c | 2 +- Objects/structseq.c | 75 ++++++++++++++++++++++++++++-------- Objects/typeobject.c | 40 ++++++++++++------- Python/ceval.c | 11 +++++- Python/compile.c | 6 +-- Python/pylifecycle.c | 12 ++++-- Python/pythonrun.c | 13 +++++-- Python/symtable.c | 9 +++-- Python/sysmodule.c | 62 +++++++++++++++++------------ 17 files changed, 254 insertions(+), 137 deletions(-) diff --git a/Include/cpython/dictobject.h b/Include/cpython/dictobject.h index f67c3214ddd9ab..6822a65cad95e8 100644 --- a/Include/cpython/dictobject.h +++ b/Include/cpython/dictobject.h @@ -46,7 +46,8 @@ PyAPI_FUNC(int) _PyDict_Next( /* Get the number of items of a dictionary. */ #define PyDict_GET_SIZE(mp) (assert(PyDict_Check(mp)),((PyDictObject *)mp)->ma_used) -PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, Py_hash_t hash); +PyAPI_FUNC(int) _PyDict_Contains_KnownHash(PyObject *, PyObject *, Py_hash_t); +PyAPI_FUNC(int) _PyDict_ContainsId(PyObject *, struct _Py_Identifier *); PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp); PyAPI_FUNC(int) _PyDict_HasOnlyStringKeys(PyObject *mp); @@ -63,7 +64,6 @@ PyObject *_PyDict_FromKeys(PyObject *, PyObject *, PyObject *); argument is raised. */ PyAPI_FUNC(int) _PyDict_MergeEx(PyObject *mp, PyObject *other, int override); -PyAPI_FUNC(PyObject *) _PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key); PyAPI_FUNC(int) _PyDict_SetItemId(PyObject *dp, struct _Py_Identifier *key, PyObject *item); PyAPI_FUNC(int) _PyDict_DelItemId(PyObject *mp, struct _Py_Identifier *key); diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index e7c44acba02fc2..ea16c5a6cd9cdc 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -3186,6 +3186,31 @@ dotsep_as_utf8(const char *s) return utf8; } +static int +dict_get_item_string(PyObject *dict, const char *key, PyObject **valueobj, const char **valuestr) +{ + *valueobj = NULL; + PyObject *keyobj = PyUnicode_FromString(key); + if (keyobj == NULL) { + return -1; + } + PyObject *value = PyDict_GetItemWithError(dict, keyobj); + Py_DECREF(keyobj); + if (value == NULL) { + if (PyErr_Occurred()) { + return -1; + } + return 0; + } + value = PyUnicode_AsUTF8String(value); + if (value == NULL) { + return -1; + } + *valueobj = value; + *valuestr = PyBytes_AS_STRING(value); + return 0; +} + /* Formatted representation of a PyDecObject. */ static PyObject * dec_format(PyObject *dec, PyObject *args) @@ -3256,23 +3281,11 @@ dec_format(PyObject *dec, PyObject *args) "optional argument must be a dict"); goto finish; } - if ((dot = PyDict_GetItemString(override, "decimal_point"))) { - if ((dot = PyUnicode_AsUTF8String(dot)) == NULL) { - goto finish; - } - spec.dot = PyBytes_AS_STRING(dot); - } - if ((sep = PyDict_GetItemString(override, "thousands_sep"))) { - if ((sep = PyUnicode_AsUTF8String(sep)) == NULL) { - goto finish; - } - spec.sep = PyBytes_AS_STRING(sep); - } - if ((grouping = PyDict_GetItemString(override, "grouping"))) { - if ((grouping = PyUnicode_AsUTF8String(grouping)) == NULL) { - goto finish; - } - spec.grouping = PyBytes_AS_STRING(grouping); + if (dict_get_item_string(override, "decimal_point", &dot, &spec.dot) || + dict_get_item_string(override, "thousands_sep", &sep, &spec.sep) || + dict_get_item_string(override, "grouping", &grouping, &spec.grouping)) + { + goto finish; } if (mpd_validate_lconv(&spec) < 0) { PyErr_SetString(PyExc_ValueError, diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 77baba4847897b..56ed8a2e2d3f14 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -816,10 +816,14 @@ local_clear(localobject *self) for(tstate = PyInterpreterState_ThreadHead(tstate->interp); tstate; tstate = PyThreadState_Next(tstate)) - if (tstate->dict && PyDict_GetItem(tstate->dict, self->key)) { - if (PyDict_DelItem(tstate->dict, self->key)) { + if (tstate->dict) { + PyObject *v = _PyDict_Pop(tstate->dict, self->key, Py_None); + if (v == NULL) { PyErr_Clear(); } + else { + Py_DECREF(v); + } } } return 0; diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c index bee59b8d2ae0cc..76b667d1543e99 100644 --- a/Modules/_zoneinfo.c +++ b/Modules/_zoneinfo.c @@ -722,17 +722,16 @@ zoneinfo__unpickle(PyTypeObject *cls, PyObject *args) static PyObject * load_timedelta(long seconds) { - PyObject *rv = NULL; + PyObject *rv; PyObject *pyoffset = PyLong_FromLong(seconds); if (pyoffset == NULL) { return NULL; } - int contains = PyDict_Contains(TIMEDELTA_CACHE, pyoffset); - if (contains == -1) { - goto error; - } - - if (!contains) { + rv = PyDict_GetItemWithError(TIMEDELTA_CACHE, pyoffset); + if (rv == NULL) { + if (PyErr_Occurred()) { + goto error; + } PyObject *tmp = PyDateTimeAPI->Delta_FromDelta( 0, seconds, 0, 1, PyDateTimeAPI->DeltaType); @@ -743,12 +742,9 @@ load_timedelta(long seconds) rv = PyDict_SetDefault(TIMEDELTA_CACHE, pyoffset, tmp); Py_DECREF(tmp); } - else { - rv = PyDict_GetItem(TIMEDELTA_CACHE, pyoffset); - } + Py_XINCREF(rv); Py_DECREF(pyoffset); - Py_INCREF(rv); return rv; error: Py_DECREF(pyoffset); diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 3440894b2159d5..0ab3a71b180994 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1427,10 +1427,9 @@ signal_exec(PyObject *m) return -1; #endif - IntHandler = PyDict_GetItemString(d, "default_int_handler"); + IntHandler = PyMapping_GetItemString(d, "default_int_handler"); if (!IntHandler) return -1; - Py_INCREF(IntHandler); _Py_atomic_store_relaxed(&Handlers[0].tripped, 0); for (int i = 1; i < NSIG; i++) { diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index db0eeaafeec27c..d7738367029e85 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -324,7 +324,7 @@ static FlagRuntimeInfo win_runtime_flags[] = { {14393, "TCP_FASTOPEN"} }; -static void +static int remove_unusable_flags(PyObject *m) { PyObject *dict; @@ -333,7 +333,7 @@ remove_unusable_flags(PyObject *m) dict = PyModule_GetDict(m); if (dict == NULL) { - return; + return -1; } /* set to Windows 10, except BuildNumber. */ @@ -359,19 +359,19 @@ remove_unusable_flags(PyObject *m) break; } else { - if (PyDict_GetItemString( - dict, - win_runtime_flags[i].flag_name) != NULL) - { - if (PyDict_DelItemString( - dict, - win_runtime_flags[i].flag_name)) - { - PyErr_Clear(); - } + PyObject *flag_name = PyUnicode_FromString(win_runtime_flags[i].flag_name); + if (flag_name == NULL) { + return -1; + } + PyObject *v = _PyDict_Pop(dict, flag_name, Py_None); + Py_DECREF(flag_name); + if (v == NULL) { + return -1; } + Py_DECREF(v); } } + return 0; } #endif @@ -8382,7 +8382,10 @@ PyInit__socket(void) #ifdef MS_WINDOWS /* remove some flags on older version Windows during run-time */ - remove_unusable_flags(m); + if (remove_unusable_flags(m) < 0) { + Py_DECREF(m); + return NULL; + } #endif return m; diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 42d71e56d4547c..00d6ab3be2ffa1 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -3434,7 +3434,7 @@ PyDict_Contains(PyObject *op, PyObject *key) /* Internal version of PyDict_Contains used when the hash value is already known */ int -_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash) +_PyDict_Contains_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash) { PyDictObject *mp = (PyDictObject *)op; PyObject *value; @@ -3446,6 +3446,16 @@ _PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash) return (ix != DKIX_EMPTY && value != NULL); } +int +_PyDict_ContainsId(PyObject *op, struct _Py_Identifier *key) +{ + PyObject *kv = _PyUnicode_FromId(key); /* borrowed */ + if (kv == NULL) { + return -1; + } + return PyDict_Contains(op, kv); +} + /* Hack to implement "key in dict" */ static PySequenceMethods dict_as_sequence = { 0, /* sq_length */ @@ -3590,18 +3600,6 @@ PyTypeObject PyDict_Type = { .tp_vectorcall = dict_vectorcall, }; -PyObject * -_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key) -{ - PyObject *kv; - kv = _PyUnicode_FromId(key); /* borrowed */ - if (kv == NULL) { - PyErr_Clear(); - return NULL; - } - return PyDict_GetItem(dp, kv); -} - /* For backward compatibility with old dictionary interface */ PyObject * diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index ee4ed97588e29e..c3ceb788e8e690 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -477,10 +477,12 @@ PyModule_GetNameObject(PyObject *m) } d = ((PyModuleObject *)m)->md_dict; if (d == NULL || - (name = _PyDict_GetItemId(d, &PyId___name__)) == NULL || + (name = _PyDict_GetItemIdWithError(d, &PyId___name__)) == NULL || !PyUnicode_Check(name)) { - PyErr_SetString(PyExc_SystemError, "nameless module"); + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_SystemError, "nameless module"); + } return NULL; } Py_INCREF(name); @@ -509,10 +511,12 @@ PyModule_GetFilenameObject(PyObject *m) } d = ((PyModuleObject *)m)->md_dict; if (d == NULL || - (fileobj = _PyDict_GetItemId(d, &PyId___file__)) == NULL || + (fileobj = _PyDict_GetItemIdWithError(d, &PyId___file__)) == NULL || !PyUnicode_Check(fileobj)) { - PyErr_SetString(PyExc_SystemError, "module filename missing"); + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_SystemError, "module filename missing"); + } return NULL; } Py_INCREF(fileobj); @@ -721,14 +725,21 @@ module_getattro(PyModuleObject *m, PyObject *name) PyErr_Clear(); if (m->md_dict) { _Py_IDENTIFIER(__getattr__); - getattr = _PyDict_GetItemId(m->md_dict, &PyId___getattr__); + getattr = _PyDict_GetItemIdWithError(m->md_dict, &PyId___getattr__); if (getattr) { return PyObject_CallOneArg(getattr, name); } - mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__); + if (PyErr_Occurred()) { + return NULL; + } + mod_name = _PyDict_GetItemIdWithError(m->md_dict, &PyId___name__); if (mod_name && PyUnicode_Check(mod_name)) { Py_INCREF(mod_name); - PyObject *spec = _PyDict_GetItemId(m->md_dict, &PyId___spec__); + PyObject *spec = _PyDict_GetItemIdWithError(m->md_dict, &PyId___spec__); + if (spec == NULL && PyErr_Occurred()) { + Py_DECREF(mod_name); + return NULL; + } Py_XINCREF(spec); if (_PyModuleSpec_IsInitializing(spec)) { PyErr_Format(PyExc_AttributeError, @@ -746,6 +757,9 @@ module_getattro(PyModuleObject *m, PyObject *name) Py_DECREF(mod_name); return NULL; } + else if (PyErr_Occurred()) { + return NULL; + } } PyErr_Format(PyExc_AttributeError, "module has no attribute '%U'", name); diff --git a/Objects/setobject.c b/Objects/setobject.c index b2711495b657bd..af8ee03d831d61 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1498,7 +1498,7 @@ set_difference(PySetObject *so, PyObject *other) while (set_next(so, &pos, &entry)) { key = entry->key; hash = entry->hash; - rv = _PyDict_Contains(other, key, hash); + rv = _PyDict_Contains_KnownHash(other, key, hash); if (rv < 0) { Py_DECREF(result); return NULL; diff --git a/Objects/structseq.c b/Objects/structseq.c index 8ae8f28cbc580f..5caa3bd52e4d4f 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -19,20 +19,33 @@ static const char unnamed_fields_key[] = "n_unnamed_fields"; /* Fields with this name have only a field index, not a field name. They are only allowed for indices < n_visible_fields. */ const char * const PyStructSequence_UnnamedField = "unnamed field"; + _Py_IDENTIFIER(n_sequence_fields); _Py_IDENTIFIER(n_fields); _Py_IDENTIFIER(n_unnamed_fields); -#define VISIBLE_SIZE(op) Py_SIZE(op) -#define VISIBLE_SIZE_TP(tp) PyLong_AsSsize_t( \ - _PyDict_GetItemId((tp)->tp_dict, &PyId_n_sequence_fields)) +static ssize_t +get_type_attr_as_size(PyTypeObject *tp, _Py_Identifier *id) +{ + PyObject *name = _PyUnicode_FromId(id); + if (name == NULL) { + return -1; + } + PyObject *v = PyDict_GetItemWithError(tp->tp_dict, name); + if (v == NULL && !PyErr_Occurred()) { + PyErr_Format(PyExc_TypeError, + "Missed attribute '%U' of type %s", + name, tp->tp_name); + } + return PyLong_AsSsize_t(v); +} -#define REAL_SIZE_TP(tp) PyLong_AsSsize_t( \ - _PyDict_GetItemId((tp)->tp_dict, &PyId_n_fields)) +#define VISIBLE_SIZE(op) Py_SIZE(op) +#define VISIBLE_SIZE_TP(tp) get_type_attr_as_size(tp, &PyId_n_sequence_fields) +#define REAL_SIZE_TP(tp) get_type_attr_as_size(tp, &PyId_n_fields) #define REAL_SIZE(op) REAL_SIZE_TP(Py_TYPE(op)) -#define UNNAMED_FIELDS_TP(tp) PyLong_AsSsize_t( \ - _PyDict_GetItemId((tp)->tp_dict, &PyId_n_unnamed_fields)) +#define UNNAMED_FIELDS_TP(tp) get_type_attr_as_size(tp, &PyId_n_unnamed_fields) #define UNNAMED_FIELDS(op) UNNAMED_FIELDS_TP(Py_TYPE(op)) @@ -41,13 +54,20 @@ PyStructSequence_New(PyTypeObject *type) { PyStructSequence *obj; Py_ssize_t size = REAL_SIZE_TP(type), i; + if (size < 0) { + return NULL; + } + Py_ssize_t vsize = VISIBLE_SIZE_TP(type); + if (vsize < 0) { + return NULL; + } obj = PyObject_GC_NewVar(PyStructSequence, type, size); if (obj == NULL) return NULL; /* Hack the size of the variable object, so invisible fields don't appear to Python code. */ - Py_SET_SIZE(obj, VISIBLE_SIZE_TP(type)); + Py_SET_SIZE(obj, vsize); for (i = 0; i < size; i++) obj->ob_item[i] = NULL; @@ -121,6 +141,19 @@ structseq_new_impl(PyTypeObject *type, PyObject *arg, PyObject *dict) PyStructSequence *res = NULL; Py_ssize_t len, min_len, max_len, i, n_unnamed_fields; + min_len = VISIBLE_SIZE_TP(type); + if (min_len < 0) { + return NULL; + } + max_len = REAL_SIZE_TP(type); + if (max_len < 0) { + return NULL; + } + n_unnamed_fields = UNNAMED_FIELDS_TP(type); + if (n_unnamed_fields < 0) { + return NULL; + } + arg = PySequence_Fast(arg, "constructor requires a sequence"); if (!arg) { @@ -136,10 +169,6 @@ structseq_new_impl(PyTypeObject *type, PyObject *arg, PyObject *dict) } len = PySequence_Fast_GET_SIZE(arg); - min_len = VISIBLE_SIZE_TP(type); - max_len = REAL_SIZE_TP(type); - n_unnamed_fields = UNNAMED_FIELDS_TP(type); - if (min_len != max_len) { if (len < min_len) { PyErr_Format(PyExc_TypeError, @@ -177,18 +206,26 @@ structseq_new_impl(PyTypeObject *type, PyObject *arg, PyObject *dict) Py_INCREF(v); res->ob_item[i] = v; } + Py_DECREF(arg); for (; i < max_len; ++i) { - if (dict && (ob = PyDict_GetItemString( - dict, type->tp_members[i-n_unnamed_fields].name))) { + if (dict == NULL) { + ob = Py_None; } else { - ob = Py_None; + ob = _PyDict_GetItemStringWithError(dict, + type->tp_members[i-n_unnamed_fields].name); + if (ob == NULL) { + if (PyErr_Occurred()) { + Py_DECREF(res); + return NULL; + } + ob = Py_None; + } } Py_INCREF(ob); res->ob_item[i] = ob; } - Py_DECREF(arg); _PyObject_GC_TRACK(res); return (PyObject*) res; } @@ -288,8 +325,14 @@ structseq_reduce(PyStructSequence* self, PyObject *Py_UNUSED(ignored)) Py_ssize_t n_fields, n_visible_fields, n_unnamed_fields, i; n_fields = REAL_SIZE(self); + if (n_fields < 0) { + return NULL; + } n_visible_fields = VISIBLE_SIZE(self); n_unnamed_fields = UNNAMED_FIELDS(self); + if (n_unnamed_fields < 0) { + return NULL; + } tup = _PyTuple_FromArray(self->ob_item, n_visible_fields); if (!tup) goto error; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 36c7662e081a40..6626169ae37f63 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4767,8 +4767,11 @@ object___reduce_ex___impl(PyObject *self, int protocol) _Py_IDENTIFIER(__reduce__); if (objreduce == NULL) { - objreduce = _PyDict_GetItemId(PyBaseObject_Type.tp_dict, - &PyId___reduce__); + objreduce = _PyDict_GetItemIdWithError(PyBaseObject_Type.tp_dict, + &PyId___reduce__); + if (objreduce == NULL && PyErr_Occurred()) { + return NULL; + } } if (_PyObject_LookupAttrId(self, &PyId___reduce__, &reduce) < 0) { @@ -5181,14 +5184,14 @@ overrides_hash(PyTypeObject *type) _Py_IDENTIFIER(__eq__); assert(dict != NULL); - if (_PyDict_GetItemId(dict, &PyId___eq__) != NULL) - return 1; - if (_PyDict_GetItemId(dict, &PyId___hash__) != NULL) - return 1; - return 0; + int r = _PyDict_ContainsId(dict, &PyId___eq__); + if (r == 0) { + r = _PyDict_ContainsId(dict, &PyId___hash__); + } + return r; } -static void +static int inherit_slots(PyTypeObject *type, PyTypeObject *base) { PyTypeObject *basebase; @@ -5331,11 +5334,16 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base) /* Copy comparison-related slots only when not overriding them anywhere */ if (type->tp_richcompare == NULL && - type->tp_hash == NULL && - !overrides_hash(type)) + type->tp_hash == NULL) { - type->tp_richcompare = base->tp_richcompare; - type->tp_hash = base->tp_hash; + int r = overrides_hash(type); + if (r < 0) { + return -1; + } + if (!r) { + type->tp_richcompare = base->tp_richcompare; + type->tp_hash = base->tp_hash; + } } } { @@ -5378,6 +5386,7 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base) * obvious to be done -- the type is on its own. */ } + return 0; } static int add_operators(PyTypeObject *); @@ -5507,8 +5516,11 @@ PyType_Ready(PyTypeObject *type) n = PyTuple_GET_SIZE(bases); for (i = 1; i < n; i++) { PyObject *b = PyTuple_GET_ITEM(bases, i); - if (PyType_Check(b)) - inherit_slots(type, (PyTypeObject *)b); + if (PyType_Check(b)) { + if (inherit_slots(type, (PyTypeObject *)b) < 0) { + goto error; + } + } } /* All bases of statically allocated type should be statically allocated */ diff --git a/Python/ceval.c b/Python/ceval.c index fafbf7524bb843..7338be57798fd9 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1446,11 +1446,18 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) } #ifdef LLTRACE - lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL; + { + int r = _PyDict_ContainsId(f->f_globals, &PyId___ltrace__); + if (r < 0) { + goto exit_eval_frame; + } + lltrace = r; + } #endif - if (throwflag) /* support for generator.throw() */ + if (throwflag) { /* support for generator.throw() */ goto error; + } #ifdef Py_DEBUG /* _PyEval_EvalFrameDefault() must not be called with an exception set, diff --git a/Python/compile.c b/Python/compile.c index ddd2a049629c1f..a0089b2d6dc186 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -489,8 +489,8 @@ dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset) /* XXX this should probably be a macro in symtable.h */ long vi; k = PyList_GET_ITEM(sorted_keys, key_i); - v = PyDict_GetItem(src, k); - assert(PyLong_Check(v)); + v = PyDict_GetItemWithError(src, k); + assert(v && PyLong_Check(v)); vi = PyLong_AS_LONG(v); scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK; @@ -1889,7 +1889,7 @@ static int compiler_lookup_arg(PyObject *dict, PyObject *name) { PyObject *v; - v = PyDict_GetItem(dict, name); + v = PyDict_GetItemWithError(dict, name); if (v == NULL) return -1; return PyLong_AS_LONG(v); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 75d57805c07b6a..774a4f9de08e0e 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -160,7 +160,7 @@ init_importlib(PyThreadState *tstate, PyObject *sysmod) interp->importlib = importlib; Py_INCREF(interp->importlib); - interp->import_func = PyDict_GetItemString(interp->builtins, "__import__"); + interp->import_func = _PyDict_GetItemStringWithError(interp->builtins, "__import__"); if (interp->import_func == NULL) return _PyStatus_ERR("__import__ not found"); Py_INCREF(interp->import_func); @@ -1683,7 +1683,10 @@ add_main_module(PyInterpreterState *interp) } Py_DECREF(ann_dict); - if (PyDict_GetItemString(d, "__builtins__") == NULL) { + if (_PyDict_GetItemStringWithError(d, "__builtins__") == NULL) { + if (PyErr_Occurred()) { + return _PyStatus_ERR("Failed to test __main__.__builtins__"); + } PyObject *bimod = PyImport_ImportModule("builtins"); if (bimod == NULL) { return _PyStatus_ERR("Failed to retrieve builtins module"); @@ -1700,8 +1703,11 @@ add_main_module(PyInterpreterState *interp) * be set if __main__ gets further initialized later in the startup * process. */ - loader = PyDict_GetItemString(d, "__loader__"); + loader = _PyDict_GetItemStringWithError(d, "__loader__"); if (loader == NULL || loader == Py_None) { + if (PyErr_Occurred()) { + return _PyStatus_ERR("Failed to test __main__.__loader__"); + } PyObject *loader = PyObject_GetAttrString(interp->importlib, "BuiltinImporter"); if (loader == NULL) { diff --git a/Python/pythonrun.c b/Python/pythonrun.c index a45ca3b18311dd..bd49c40e9786c3 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -351,7 +351,10 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, return -1; Py_INCREF(m); d = PyModule_GetDict(m); - if (PyDict_GetItemString(d, "__file__") == NULL) { + if (_PyDict_GetItemStringWithError(d, "__file__") == NULL) { + if (PyErr_Occurred()) { + goto done; + } PyObject *f; f = PyUnicode_DecodeFSDefault(filename); if (f == NULL) @@ -1116,9 +1119,11 @@ run_eval_code_obj(PyThreadState *tstate, PyCodeObject *co, PyObject *globals, Py _Py_UnhandledKeyboardInterrupt = 0; /* Set globals['__builtins__'] if it doesn't exist */ - if (globals != NULL && PyDict_GetItemString(globals, "__builtins__") == NULL) { - if (PyDict_SetItemString(globals, "__builtins__", - tstate->interp->builtins) < 0) { + if (globals != NULL && _PyDict_GetItemStringWithError(globals, "__builtins__") == NULL) { + if (PyErr_Occurred() || + PyDict_SetItemString(globals, "__builtins__", + tstate->interp->builtins) < 0) + { return NULL; } } diff --git a/Python/symtable.c b/Python/symtable.c index 4a98e79e74a250..0464cd898b27fb 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -392,7 +392,7 @@ PySymtable_Lookup(struct symtable *st, void *key) static long _PyST_GetSymbol(PySTEntryObject *ste, PyObject *name) { - PyObject *v = PyDict_GetItem(ste->ste_symbols, name); + PyObject *v = PyDict_GetItemWithError(ste->ste_symbols, name); if (!v) return 0; assert(PyLong_Check(v)); @@ -634,7 +634,7 @@ update_symbols(PyObject *symbols, PyObject *scopes, long scope, flags; assert(PyLong_Check(v)); flags = PyLong_AS_LONG(v); - v_scope = PyDict_GetItem(scopes, name); + v_scope = PyDict_GetItemWithError(scopes, name); assert(v_scope && PyLong_Check(v_scope)); scope = PyLong_AS_LONG(v_scope); flags |= (scope << SCOPE_OFFSET); @@ -1071,9 +1071,12 @@ symtable_add_def_helper(struct symtable *st, PyObject *name, int flag, struct _s /* XXX need to update DEF_GLOBAL for other flags too; perhaps only DEF_FREE_GLOBAL */ val = flag; - if ((o = PyDict_GetItem(st->st_global, mangled))) { + if ((o = PyDict_GetItemWithError(st->st_global, mangled))) { val |= PyLong_AS_LONG(o); } + else if (PyErr_Occurred()) { + goto error; + } o = PyLong_FromLong(val); if (o == NULL) goto error; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index bfcf4e85140a84..749b96455d6796 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -68,7 +68,13 @@ sys_get_object_id(PyThreadState *tstate, _Py_Identifier *key) if (sd == NULL) { return NULL; } - return _PyDict_GetItemId(sd, key); + PyObject *exc_type, *exc_value, *exc_tb; + _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); + PyObject *value = _PyDict_GetItemIdWithError(sd, key); + /* XXX Suppress a new exception if it was raised and restore + * the old one. */ + _PyErr_Restore(tstate, exc_type, exc_value, exc_tb); + return value; } PyObject * @@ -86,26 +92,41 @@ PySys_GetObject(const char *name) if (sd == NULL) { return NULL; } - return PyDict_GetItemString(sd, name); + PyObject *exc_type, *exc_value, *exc_tb; + _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); + PyObject *value = _PyDict_GetItemStringWithError(sd, name); + /* XXX Suppress a new exception if it was raised and restore + * the old one. */ + _PyErr_Restore(tstate, exc_type, exc_value, exc_tb); + return value; } static int -sys_set_object_id(PyThreadState *tstate, _Py_Identifier *key, PyObject *v) +sys_set_object(PyThreadState *tstate, PyObject *key, PyObject *v) { + if (key == NULL) { + return -1; + } PyObject *sd = tstate->interp->sysdict; if (v == NULL) { - if (_PyDict_GetItemId(sd, key) == NULL) { - return 0; - } - else { - return _PyDict_DelItemId(sd, key); + v = _PyDict_Pop(sd, key, Py_None); + if (v == NULL) { + return -1; } + Py_DECREF(v); + return 0; } else { - return _PyDict_SetItemId(sd, key, v); + return PyDict_SetItem(sd, key, v); } } +static int +sys_set_object_id(PyThreadState *tstate, _Py_Identifier *key, PyObject *v) +{ + return sys_set_object(tstate, _PyUnicode_FromId(key), v); +} + int _PySys_SetObjectId(_Py_Identifier *key, PyObject *v) { @@ -114,27 +135,20 @@ _PySys_SetObjectId(_Py_Identifier *key, PyObject *v) } static int -sys_set_object(PyThreadState *tstate, const char *name, PyObject *v) +sys_set_object_str(PyThreadState *tstate, const char *name, PyObject *v) { - PyObject *sd = tstate->interp->sysdict; - if (v == NULL) { - if (PyDict_GetItemString(sd, name) == NULL) { - return 0; - } - else { - return PyDict_DelItemString(sd, name); - } - } - else { - return PyDict_SetItemString(sd, name, v); - } + PyObject *key = v ? PyUnicode_InternFromString(name) + : PyUnicode_FromString(name); + int r = sys_set_object(tstate, key, v); + Py_XDECREF(key); + return r; } int PySys_SetObject(const char *name, PyObject *v) { PyThreadState *tstate = _PyThreadState_GET(); - return sys_set_object(tstate, name, v); + return sys_set_object_str(tstate, name, v); } @@ -3083,7 +3097,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) if (av == NULL) { Py_FatalError("no mem for sys.argv"); } - if (sys_set_object(tstate, "argv", av) != 0) { + if (sys_set_object_str(tstate, "argv", av) != 0) { Py_DECREF(av); Py_FatalError("can't assign sys.argv"); } From 777ff55710a4f72108b1c7098c8e568e15582dc5 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 26 Oct 2020 12:47:57 +0200 Subject: [PATCH 0387/1261] bpo-42152: Use PyDict_Contains and PyDict_SetDefault if appropriate. (GH-22986) If PyDict_GetItemWithError is only used to check whether the key is in dict, it is better to use PyDict_Contains instead. And if it is used in combination with PyDict_SetItem, PyDict_SetDefault can replace the combination. --- Modules/_ctypes/_ctypes.c | 21 +++---- Modules/_ctypes/callbacks.c | 5 +- Modules/_pickle.c | 17 ++--- Modules/posixmodule.c | 12 ++-- Modules/pyexpat.c | 10 +-- Modules/selectmodule.c | 13 ++-- Objects/dictobject.c | 45 +++++++------ Objects/typeobject.c | 122 +++++++++++++++--------------------- Python/bltinmodule.c | 20 +++--- Python/errors.c | 9 +-- Python/import.c | 24 ++++--- 11 files changed, 135 insertions(+), 163 deletions(-) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 0ac48b92bff8ba..9be90eb27bdf22 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -492,9 +492,10 @@ StructUnionType_new(PyTypeObject *type, PyObject *args, PyObject *kwds, int isSt return NULL; /* keep this for bw compatibility */ - if (_PyDict_GetItemIdWithError(result->tp_dict, &PyId__abstract_)) + int r = _PyDict_ContainsId(result->tp_dict, &PyId__abstract_); + if (r > 0) return (PyObject *)result; - if (PyErr_Occurred()) { + if (r < 0) { Py_DECREF(result); return NULL; } @@ -4397,15 +4398,13 @@ _init_pos_args(PyObject *self, PyTypeObject *type, } val = PyTuple_GET_ITEM(args, i + index); if (kwds) { - if (PyDict_GetItemWithError(kwds, name)) { - PyErr_Format(PyExc_TypeError, - "duplicate values for field %R", - name); - Py_DECREF(pair); - Py_DECREF(name); - return -1; - } - else if (PyErr_Occurred()) { + res = PyDict_Contains(kwds, name); + if (res != 0) { + if (res > 0) { + PyErr_Format(PyExc_TypeError, + "duplicate values for field %R", + name); + } Py_DECREF(pair); Py_DECREF(name); return -1; diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index 2abfa67cdc06bf..5cd8577248514a 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -109,8 +109,9 @@ TryAddRef(StgDictObject *dict, CDataObject *obj) IUnknown *punk; _Py_IDENTIFIER(_needs_com_addref_); - if (!_PyDict_GetItemIdWithError((PyObject *)dict, &PyId__needs_com_addref_)) { - if (PyErr_Occurred()) { + int r = _PyDict_ContainsId((PyObject *)dict, &PyId__needs_com_addref_); + if (r <= 0) { + if (r < 0) { PrintError("getting _needs_com_addref_"); } return; diff --git a/Modules/_pickle.c b/Modules/_pickle.c index bddd8f46f0e40f..ed8afefe4c74c8 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -2004,26 +2004,21 @@ fast_save_enter(PicklerObject *self, PyObject *obj) self->fast_nesting = -1; return 0; } - if (PyDict_GetItemWithError(self->fast_memo, key)) { - Py_DECREF(key); + int r = PyDict_Contains(self->fast_memo, key); + if (r > 0) { PyErr_Format(PyExc_ValueError, "fast mode: can't pickle cyclic objects " "including object type %.200s at %p", Py_TYPE(obj)->tp_name, obj); - self->fast_nesting = -1; - return 0; } - if (PyErr_Occurred()) { - Py_DECREF(key); - self->fast_nesting = -1; - return 0; + else if (r == 0) { + r = PyDict_SetItem(self->fast_memo, key, Py_None); } - if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) { - Py_DECREF(key); + Py_DECREF(key); + if (r != 0) { self->fast_nesting = -1; return 0; } - Py_DECREF(key); } return 1; } diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 6ce0bcb9fe8ca4..ccd64d63dd0b32 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1526,13 +1526,11 @@ convertenviron(void) Py_DECREF(d); return NULL; } - if (PyDict_GetItemWithError(d, k) == NULL) { - if (PyErr_Occurred() || PyDict_SetItem(d, k, v) != 0) { - Py_DECREF(v); - Py_DECREF(k); - Py_DECREF(d); - return NULL; - } + if (PyDict_SetDefault(d, k, v) == NULL) { + Py_DECREF(v); + Py_DECREF(k); + Py_DECREF(d); + return NULL; } Py_DECREF(k); Py_DECREF(v); diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 12ae66d945bda8..73ea51385ee80a 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1614,15 +1614,7 @@ static int init_handler_descrs(void) if (descr == NULL) return -1; - if (PyDict_GetItemWithError(Xmlparsetype.tp_dict, PyDescr_NAME(descr))) { - Py_DECREF(descr); - continue; - } - else if (PyErr_Occurred()) { - Py_DECREF(descr); - return -1; - } - if (PyDict_SetItem(Xmlparsetype.tp_dict, PyDescr_NAME(descr), descr) < 0) { + if (PyDict_SetDefault(Xmlparsetype.tp_dict, PyDescr_NAME(descr), descr) == NULL) { Py_DECREF(descr); return -1; } diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index fe852f93c37d1d..d02e3905f57e5f 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -499,11 +499,14 @@ select_poll_modify_impl(pollObject *self, int fd, unsigned short eventmask) key = PyLong_FromLong(fd); if (key == NULL) return NULL; - if (PyDict_GetItemWithError(self->dict, key) == NULL) { - if (!PyErr_Occurred()) { - errno = ENOENT; - PyErr_SetFromErrno(PyExc_OSError); - } + err = PyDict_Contains(self->dict, key); + if (err < 0) { + Py_DECREF(key); + return NULL; + } + if (err == 0) { + errno = ENOENT; + PyErr_SetFromErrno(PyExc_OSError); Py_DECREF(key); return NULL; } diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 00d6ab3be2ffa1..faa8696153cb8d 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2544,8 +2544,8 @@ PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override) goto Fail; } } - else if (PyDict_GetItemWithError(d, key) == NULL) { - if (PyErr_Occurred() || PyDict_SetItem(d, key, value) < 0) { + else { + if (PyDict_SetDefault(d, key, value) == NULL) { Py_DECREF(key); Py_DECREF(value); goto Fail; @@ -2660,19 +2660,20 @@ dict_merge(PyObject *a, PyObject *b, int override) Py_INCREF(value); if (override == 1) err = insertdict(mp, key, hash, value); - else if (_PyDict_GetItem_KnownHash(a, key, hash) == NULL) { - if (PyErr_Occurred()) { - Py_DECREF(value); - Py_DECREF(key); - return -1; + else { + err = _PyDict_Contains_KnownHash(a, key, hash); + if (err == 0) { + err = insertdict(mp, key, hash, value); + } + else if (err > 0) { + if (override != 0) { + _PyErr_SetKeyError(key); + Py_DECREF(value); + Py_DECREF(key); + return -1; + } + err = 0; } - err = insertdict(mp, key, hash, value); - } - else if (override != 0) { - _PyErr_SetKeyError(key); - Py_DECREF(value); - Py_DECREF(key); - return -1; } Py_DECREF(value); Py_DECREF(key); @@ -2709,17 +2710,15 @@ dict_merge(PyObject *a, PyObject *b, int override) for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) { if (override != 1) { - if (PyDict_GetItemWithError(a, key) != NULL) { - if (override != 0) { + status = PyDict_Contains(a, key); + if (status != 0) { + if (status > 0) { + if (override == 0) { + Py_DECREF(key); + continue; + } _PyErr_SetKeyError(key); - Py_DECREF(key); - Py_DECREF(iter); - return -1; } - Py_DECREF(key); - continue; - } - else if (PyErr_Occurred()) { Py_DECREF(key); Py_DECREF(iter); return -1; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 6626169ae37f63..bd1587ace876f5 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2388,7 +2388,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) PyHeapTypeObject *et; PyMemberDef *mp; Py_ssize_t i, nbases, nslots, slotoffset, name_size; - int j, may_add_dict, may_add_weak, add_dict, add_weak; + int j, r, may_add_dict, may_add_weak, add_dict, add_weak; _Py_IDENTIFIER(__qualname__); _Py_IDENTIFIER(__slots__); _Py_IDENTIFIER(__classcell__); @@ -2542,7 +2542,12 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) goto error; } PyList_SET_ITEM(newslots, j, tmp); - if (PyDict_GetItemWithError(dict, tmp)) { + r = PyDict_Contains(dict, tmp); + if (r < 0) { + Py_DECREF(newslots); + goto error; + } + if (r > 0) { /* CPython inserts __qualname__ and __classcell__ (when needed) into the namespace when creating a class. They will be deleted below so won't act as class variables. */ @@ -2555,10 +2560,6 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) goto error; } } - else if (PyErr_Occurred()) { - Py_DECREF(newslots); - goto error; - } j++; } assert(j == nslots - add_dict - add_weak); @@ -2643,10 +2644,11 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) type->tp_dict = dict; /* Set __module__ in the dict */ - if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) { - if (PyErr_Occurred()) { - goto error; - } + r = _PyDict_ContainsId(dict, &PyId___module__); + if (r < 0) { + goto error; + } + if (r == 0) { tmp = PyEval_GetGlobals(); if (tmp != NULL) { tmp = _PyDict_GetItemIdWithError(tmp, &PyId___name__); @@ -2885,6 +2887,7 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) PyHeapTypeObject *res; PyObject *modname; PyTypeObject *type, *base; + int r; const PyType_Slot *slot; Py_ssize_t nmembers, weaklistoffset, dictoffset, vectorcalloffset; @@ -3052,9 +3055,9 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) PyObject *__doc__ = PyUnicode_FromString(_PyType_DocWithoutSignature(type->tp_name, type->tp_doc)); if (!__doc__) goto fail; - int ret = _PyDict_SetItemId(type->tp_dict, &PyId___doc__, __doc__); + r = _PyDict_SetItemId(type->tp_dict, &PyId___doc__, __doc__); Py_DECREF(__doc__); - if (ret < 0) + if (r < 0) goto fail; } @@ -3070,21 +3073,21 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) } /* Set type.__module__ */ - if (_PyDict_GetItemIdWithError(type->tp_dict, &PyId___module__) == NULL) { - if (PyErr_Occurred()) { - goto fail; - } + r = _PyDict_ContainsId(type->tp_dict, &PyId___module__); + if (r < 0) { + goto fail; + } + if (r == 0) { s = strrchr(spec->name, '.'); if (s != NULL) { - int err; modname = PyUnicode_FromStringAndSize( spec->name, (Py_ssize_t)(s - spec->name)); if (modname == NULL) { goto fail; } - err = _PyDict_SetItemId(type->tp_dict, &PyId___module__, modname); + r = _PyDict_SetItemId(type->tp_dict, &PyId___module__, modname); Py_DECREF(modname); - if (err != 0) + if (r != 0) goto fail; } else { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, @@ -5035,26 +5038,16 @@ add_methods(PyTypeObject *type, PyMethodDef *meth) } if (!(meth->ml_flags & METH_COEXIST)) { - if (PyDict_GetItemWithError(dict, name)) { - if (!isdescr) { - Py_DECREF(name); - } - Py_DECREF(descr); - continue; - } - else if (PyErr_Occurred()) { - if (!isdescr) { - Py_DECREF(name); - } - return -1; - } + err = PyDict_SetDefault(dict, name, descr) == NULL; + } + else { + err = PyDict_SetItem(dict, name, descr) < 0; } - err = PyDict_SetItem(dict, name, descr); if (!isdescr) { Py_DECREF(name); } Py_DECREF(descr); - if (err < 0) + if (err) return -1; } return 0; @@ -5070,15 +5063,7 @@ add_members(PyTypeObject *type, PyMemberDef *memb) if (descr == NULL) return -1; - if (PyDict_GetItemWithError(dict, PyDescr_NAME(descr))) { - Py_DECREF(descr); - continue; - } - else if (PyErr_Occurred()) { - Py_DECREF(descr); - return -1; - } - if (PyDict_SetItem(dict, PyDescr_NAME(descr), descr) < 0) { + if (PyDict_SetDefault(dict, PyDescr_NAME(descr), descr) == NULL) { Py_DECREF(descr); return -1; } @@ -5097,15 +5082,7 @@ add_getset(PyTypeObject *type, PyGetSetDef *gsp) if (descr == NULL) return -1; - if (PyDict_GetItemWithError(dict, PyDescr_NAME(descr))) { - Py_DECREF(descr); - continue; - } - else if (PyErr_Occurred()) { - Py_DECREF(descr); - return -1; - } - if (PyDict_SetItem(dict, PyDescr_NAME(descr), descr) < 0) { + if (PyDict_SetDefault(dict, PyDescr_NAME(descr), descr) == NULL) { Py_DECREF(descr); return -1; } @@ -5553,10 +5530,11 @@ PyType_Ready(PyTypeObject *type) /* if the type dictionary doesn't contain a __doc__, set it from the tp_doc slot. */ - if (_PyDict_GetItemIdWithError(type->tp_dict, &PyId___doc__) == NULL) { - if (PyErr_Occurred()) { - goto error; - } + int r = _PyDict_ContainsId(type->tp_dict, &PyId___doc__); + if (r < 0) { + goto error; + } + if (r == 0) { if (type->tp_doc != NULL) { const char *old_doc = _PyType_DocWithoutSignature(type->tp_name, type->tp_doc); @@ -5582,10 +5560,12 @@ PyType_Ready(PyTypeObject *type) This signals that __hash__ is not inherited. */ if (type->tp_hash == NULL) { - if (_PyDict_GetItemIdWithError(type->tp_dict, &PyId___hash__) == NULL) { - if (PyErr_Occurred() || - _PyDict_SetItemId(type->tp_dict, &PyId___hash__, Py_None) < 0) - { + r = _PyDict_ContainsId(type->tp_dict, &PyId___hash__); + if (r < 0) { + goto error; + } + if (r == 0) { + if (_PyDict_SetItemId(type->tp_dict, &PyId___hash__, Py_None) < 0) { goto error; } type->tp_hash = PyObject_HashNotImplemented; @@ -6270,19 +6250,17 @@ add_tp_new_wrapper(PyTypeObject *type) { PyObject *func; - if (_PyDict_GetItemIdWithError(type->tp_dict, &PyId___new__) != NULL) + int r = _PyDict_ContainsId(type->tp_dict, &PyId___new__); + if (r > 0) return 0; - if (PyErr_Occurred()) + if (r < 0) return -1; func = PyCFunction_NewEx(tp_new_methoddef, (PyObject *)type, NULL); if (func == NULL) return -1; - if (_PyDict_SetItemId(type->tp_dict, &PyId___new__, func)) { - Py_DECREF(func); - return -1; - } + r = _PyDict_SetItemId(type->tp_dict, &PyId___new__, func); Py_DECREF(func); - return 0; + return r; } /* Slot wrappers that call the corresponding __foo__ slot. See comments @@ -7795,10 +7773,11 @@ recurse_down_subclasses(PyTypeObject *type, PyObject *name, /* Avoid recursing down into unaffected classes */ dict = subclass->tp_dict; if (dict != NULL && PyDict_Check(dict)) { - if (PyDict_GetItemWithError(dict, name) != NULL) { + int r = PyDict_Contains(dict, name); + if (r > 0) { continue; } - if (PyErr_Occurred()) { + if (r < 0) { return -1; } } @@ -7853,9 +7832,10 @@ add_operators(PyTypeObject *type) ptr = slotptr(type, p->offset); if (!ptr || !*ptr) continue; - if (PyDict_GetItemWithError(dict, p->name_strobj)) + int r = PyDict_Contains(dict, p->name_strobj); + if (r > 0) continue; - if (PyErr_Occurred()) { + if (r < 0) { return -1; } if (*ptr == (void *)PyObject_HashNotImplemented) { diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 89b7fce8f4a9cc..1ce55b6ec5a1ce 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -924,12 +924,12 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals, return NULL; } - if (_PyDict_GetItemIdWithError(globals, &PyId___builtins__) == NULL) { - if (_PyDict_SetItemId(globals, &PyId___builtins__, - PyEval_GetBuiltins()) != 0) - return NULL; + int r = _PyDict_ContainsId(globals, &PyId___builtins__); + if (r == 0) { + r = _PyDict_SetItemId(globals, &PyId___builtins__, + PyEval_GetBuiltins()); } - else if (PyErr_Occurred()) { + if (r < 0) { return NULL; } @@ -1012,12 +1012,12 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, Py_TYPE(locals)->tp_name); return NULL; } - if (_PyDict_GetItemIdWithError(globals, &PyId___builtins__) == NULL) { - if (_PyDict_SetItemId(globals, &PyId___builtins__, - PyEval_GetBuiltins()) != 0) - return NULL; + int r = _PyDict_ContainsId(globals, &PyId___builtins__); + if (r == 0) { + r = _PyDict_SetItemId(globals, &PyId___builtins__, + PyEval_GetBuiltins()); } - else if (PyErr_Occurred()) { + if (r < 0) { return NULL; } diff --git a/Python/errors.c b/Python/errors.c index 02cf47992b695f..f80ae21fdde7ce 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1098,10 +1098,11 @@ PyErr_NewException(const char *name, PyObject *base, PyObject *dict) goto failure; } - if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) { - if (_PyErr_Occurred(tstate)) { - goto failure; - } + int r = _PyDict_ContainsId(dict, &PyId___module__); + if (r < 0) { + goto failure; + } + if (r == 0) { modulename = PyUnicode_FromStringAndSize(name, (Py_ssize_t)(dot-name)); if (modulename == NULL) diff --git a/Python/import.c b/Python/import.c index 26b80f320c3437..b79bda058db822 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1018,14 +1018,14 @@ module_dict_for_exec(PyThreadState *tstate, PyObject *name) /* If the module is being reloaded, we get the old module back and re-use its dict to exec the new code. */ d = PyModule_GetDict(m); - if (_PyDict_GetItemIdWithError(d, &PyId___builtins__) == NULL) { - if (_PyErr_Occurred(tstate) || - _PyDict_SetItemId(d, &PyId___builtins__, - PyEval_GetBuiltins()) != 0) - { - remove_module(tstate, name); - return NULL; - } + int r = _PyDict_ContainsId(d, &PyId___builtins__); + if (r == 0) { + r = _PyDict_SetItemId(d, &PyId___builtins__, + PyEval_GetBuiltins()); + } + if (r < 0) { + remove_module(tstate, name); + return NULL; } return d; /* Return a borrowed reference. */ @@ -1660,10 +1660,14 @@ resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level goto error; } - if (_PyDict_GetItemIdWithError(globals, &PyId___path__) == NULL) { + int haspath = _PyDict_ContainsId(globals, &PyId___path__); + if (haspath < 0) { + goto error; + } + if (!haspath) { Py_ssize_t dot; - if (_PyErr_Occurred(tstate) || PyUnicode_READY(package) < 0) { + if (PyUnicode_READY(package) < 0) { goto error; } From 5ad787aa6736f61a33c649de8a66935799a383f6 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 26 Oct 2020 16:43:47 +0100 Subject: [PATCH 0388/1261] bpo-1635741: _PyUnicode_Name_CAPI moves to internal C API (GH-22713) The private _PyUnicode_Name_CAPI structure of the PyCapsule API unicodedata.ucnhash_CAPI moves to the internal C API. Moreover, the structure gets a new state member which must be passed to the getcode() and getname() functions. * Move Include/ucnhash.h to Include/internal/pycore_ucnhash.h * unicodedata module is now built with Py_BUILD_CORE_MODULE. * unicodedata: move hashAPI variable into unicodedata_module_state. --- Doc/whatsnew/3.10.rst | 6 ++++ .../{ucnhash.h => internal/pycore_ucnhash.h} | 22 ++++++++----- Makefile.pre.in | 2 +- ...2020-10-16-10-47-17.bpo-1635741.e3BcPM.rst | 4 +++ Modules/Setup | 2 +- Modules/unicodedata.c | 28 +++++++++-------- Objects/unicodeobject.c | 31 ++++++++++--------- PCbuild/pythoncore.vcxproj | 2 +- PCbuild/pythoncore.vcxproj.filters | 6 ++-- Python/codecs.c | 17 +++++----- setup.py | 3 +- 11 files changed, 74 insertions(+), 49 deletions(-) rename Include/{ucnhash.h => internal/pycore_ucnhash.h} (60%) create mode 100644 Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-1635741.e3BcPM.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 6206c949cc59bb..581d3a57e84573 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -407,6 +407,12 @@ Porting to Python 3.10 Unicode object without initial data. (Contributed by Inada Naoki in :issue:`36346`.) +* The private ``_PyUnicode_Name_CAPI`` structure of the PyCapsule API + ``unicodedata.ucnhash_CAPI`` moves to the internal C API. Moreover, + the structure gets a new ``state`` member which must be passed to the + ``getcode()`` and ``getname()`` functions. + (Contributed by Victor Stinner in :issue:`1635741`.) + Deprecated ---------- diff --git a/Include/ucnhash.h b/Include/internal/pycore_ucnhash.h similarity index 60% rename from Include/ucnhash.h rename to Include/internal/pycore_ucnhash.h index 45362e997dfa11..380b9415d42800 100644 --- a/Include/ucnhash.h +++ b/Include/internal/pycore_ucnhash.h @@ -1,11 +1,14 @@ /* Unicode name database interface */ -#ifndef Py_LIMITED_API -#ifndef Py_UCNHASH_H -#define Py_UCNHASH_H +#ifndef Py_INTERNAL_UCNHASH_H +#define Py_INTERNAL_UCNHASH_H #ifdef __cplusplus extern "C" { #endif +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + /* revised ucnhash CAPI interface (exported through a "wrapper") */ #define PyUnicodeData_CAPSULE_NAME "unicodedata.ucnhash_CAPI" @@ -15,16 +18,22 @@ typedef struct { /* Size of this struct */ int size; + // state which must be passed as the first parameter to getname() + // and getcode() + void *state; + /* Get name for a given character code. Returns non-zero if success, zero if not. Does not set Python exceptions. If self is NULL, data come from the default version of the database. If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */ - int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen, + int (*getname)(void *state, PyObject *self, Py_UCS4 code, + char* buffer, int buflen, int with_alias_and_seq); /* Get character code for a given name. Same error handling as for getname. */ - int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code, + int (*getcode)(void *state, PyObject *self, + const char* name, int namelen, Py_UCS4* code, int with_named_seq); } _PyUnicode_Name_CAPI; @@ -32,5 +41,4 @@ typedef struct { #ifdef __cplusplus } #endif -#endif /* !Py_UCNHASH_H */ -#endif /* !Py_LIMITED_API */ +#endif /* !Py_INTERNAL_UCNHASH_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 921bd08ea505d6..fe226ce45d8e9c 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1065,7 +1065,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/traceback.h \ $(srcdir)/Include/tracemalloc.h \ $(srcdir)/Include/tupleobject.h \ - $(srcdir)/Include/ucnhash.h \ $(srcdir)/Include/unicodeobject.h \ $(srcdir)/Include/warnings.h \ $(srcdir)/Include/weakrefobject.h \ @@ -1129,6 +1128,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_sysmodule.h \ $(srcdir)/Include/internal/pycore_traceback.h \ $(srcdir)/Include/internal/pycore_tuple.h \ + $(srcdir)/Include/internal/pycore_ucnhash.h \ $(srcdir)/Include/internal/pycore_unionobject.h \ $(srcdir)/Include/internal/pycore_warnings.h \ $(DTRACE_HEADERS) diff --git a/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-1635741.e3BcPM.rst b/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-1635741.e3BcPM.rst new file mode 100644 index 00000000000000..5272ad577265af --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-1635741.e3BcPM.rst @@ -0,0 +1,4 @@ +The private ``_PyUnicode_Name_CAPI`` structure of the PyCapsule API +``unicodedata.ucnhash_CAPI`` moves to the internal C API. Moreover, the +structure gets a new ``state`` member which must be passed to the +``getcode()`` and ``getname()`` functions. Patch by Victor Stinner. diff --git a/Modules/Setup b/Modules/Setup index 87f3a7cb43a025..6f9bb813cef273 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -185,7 +185,7 @@ _symtable symtablemodule.c #_json -I$(srcdir)/Include/internal -DPy_BUILD_CORE_BUILTIN _json.c # _json speedups #_statistics _statisticsmodule.c # statistics accelerator -#unicodedata unicodedata.c # static Unicode character database +#unicodedata unicodedata.c -DPy_BUILD_CORE_BUILTIN # static Unicode character database # Modules with some UNIX dependencies -- on by default: diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index 941fd2faa742a6..bfd8ab503c8ccd 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -16,7 +16,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "ucnhash.h" +#include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI #include "structmember.h" // PyMemberDef #include @@ -97,6 +97,8 @@ typedef struct { // Borrowed reference to &UCD_Type. It is used to prepare the code // to convert the UCD_Type static type to a heap type. PyTypeObject *ucd_type; + + _PyUnicode_Name_CAPI capi; } unicodedata_module_state; // bpo-1635741: Temporary global state until the unicodedata module @@ -1180,10 +1182,11 @@ _getucname(unicodedata_module_state *state, PyObject *self, } static int -capi_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen, +capi_getucname(void *state_raw, PyObject *self, Py_UCS4 code, + char* buffer, int buflen, int with_alias_and_seq) { - unicodedata_module_state *state = &global_module_state; + unicodedata_module_state *state = (unicodedata_module_state *)state_raw; return _getucname(state, self, code, buffer, buflen, with_alias_and_seq); } @@ -1323,21 +1326,15 @@ _getcode(unicodedata_module_state *state, PyObject* self, } static int -capi_getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code, +capi_getcode(void *state_raw, PyObject* self, + const char* name, int namelen, Py_UCS4* code, int with_named_seq) { - unicodedata_module_state *state = &global_module_state; + unicodedata_module_state *state = (unicodedata_module_state *)state_raw; return _getcode(state, self, name, namelen, code, with_named_seq); } -static const _PyUnicode_Name_CAPI hashAPI = -{ - sizeof(_PyUnicode_Name_CAPI), - capi_getucname, - capi_getcode -}; - /* -------------------------------------------------------------------- */ /* Python bindings */ @@ -1510,6 +1507,11 @@ PyInit_unicodedata(void) PyObject *m, *v; unicodedata_module_state *state = &global_module_state; + state->capi.size = sizeof(_PyUnicode_Name_CAPI); + state->capi.state = state; + state->capi.getname = capi_getucname; + state->capi.getcode = capi_getcode; + Py_SET_TYPE(&UCD_Type, &PyType_Type); state->ucd_type = &UCD_Type; @@ -1528,7 +1530,7 @@ PyInit_unicodedata(void) PyModule_AddObject(m, "ucd_3_2_0", v); /* Export C API */ - v = PyCapsule_New((void *)&hashAPI, PyUnicodeData_CAPSULE_NAME, NULL); + v = PyCapsule_New((void *)&state->capi, PyUnicodeData_CAPSULE_NAME, NULL); if (v != NULL) PyModule_AddObject(m, "ucnhash_CAPI", v); return m; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index f963deb0201a48..ba48d35aa40b19 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -40,16 +40,16 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_abstract.h" // _PyIndex_Check() -#include "pycore_bytes_methods.h" // _Py_bytes_lower() -#include "pycore_initconfig.h" // _PyStatus_OK() -#include "pycore_interp.h" // PyInterpreterState.fs_codec -#include "pycore_object.h" // _PyObject_GC_TRACK() -#include "pycore_pathconfig.h" // _Py_DumpPathConfig() -#include "pycore_pylifecycle.h" // _Py_SetFileSystemEncoding() -#include "pycore_pystate.h" // _PyInterpreterState_GET() -#include "ucnhash.h" // _PyUnicode_Name_CAPI -#include "stringlib/eq.h" // unicode_eq() +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_bytes_methods.h" // _Py_bytes_lower() +#include "pycore_initconfig.h" // _PyStatus_OK() +#include "pycore_interp.h" // PyInterpreterState.fs_codec +#include "pycore_object.h" // _PyObject_GC_TRACK() +#include "pycore_pathconfig.h" // _Py_DumpPathConfig() +#include "pycore_pylifecycle.h" // _Py_SetFileSystemEncoding() +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI +#include "stringlib/eq.h" // unicode_eq() #ifdef MS_WINDOWS #include @@ -6344,7 +6344,7 @@ PyUnicode_AsUTF16String(PyObject *unicode) /* --- Unicode Escape Codec ----------------------------------------------- */ -static _PyUnicode_Name_CAPI *ucnhash_CAPI = NULL; +static _PyUnicode_Name_CAPI *ucnhash_capi = NULL; PyObject * _PyUnicode_DecodeUnicodeEscape(const char *s, @@ -6497,11 +6497,11 @@ _PyUnicode_DecodeUnicodeEscape(const char *s, /* \N{name} */ case 'N': - if (ucnhash_CAPI == NULL) { + if (ucnhash_capi == NULL) { /* load the unicode data module */ - ucnhash_CAPI = (_PyUnicode_Name_CAPI *)PyCapsule_Import( + ucnhash_capi = (_PyUnicode_Name_CAPI *)PyCapsule_Import( PyUnicodeData_CAPSULE_NAME, 1); - if (ucnhash_CAPI == NULL) { + if (ucnhash_capi == NULL) { PyErr_SetString( PyExc_UnicodeError, "\\N escapes not supported (can't load unicodedata module)" @@ -6523,7 +6523,8 @@ _PyUnicode_DecodeUnicodeEscape(const char *s, s++; ch = 0xffffffff; /* in case 'getcode' messes up */ if (namelen <= INT_MAX && - ucnhash_CAPI->getcode(NULL, start, (int)namelen, + ucnhash_capi->getcode(ucnhash_capi->state, NULL, + start, (int)namelen, &ch, 0)) { assert(ch <= MAX_UNICODE); WRITE_CHAR(ch); diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 266a193c1e86a3..600f33b2c6e3b5 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -196,6 +196,7 @@ + @@ -252,7 +253,6 @@ - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 22d9b791576987..75b91d8ed87f94 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -273,9 +273,6 @@ Include - - Include - Include @@ -573,6 +570,9 @@ Include\internal + + Include\internal + Include\internal diff --git a/Python/codecs.c b/Python/codecs.c index ade14187204f09..62d1f3f3ac0d3c 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -11,7 +11,7 @@ Copyright (c) Corporation for National Research Initiatives. #include "Python.h" #include "pycore_interp.h" // PyInterpreterState.codec_search_path #include "pycore_pystate.h" // _PyInterpreterState_GET() -#include "ucnhash.h" +#include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI #include const char *Py_hexdigits = "0123456789abcdef"; @@ -954,7 +954,7 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc) return Py_BuildValue("(Nn)", res, end); } -static _PyUnicode_Name_CAPI *ucnhash_CAPI = NULL; +static _PyUnicode_Name_CAPI *ucnhash_capi = NULL; PyObject *PyCodec_NameReplaceErrors(PyObject *exc) { @@ -976,17 +976,19 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc) return NULL; if (!(object = PyUnicodeEncodeError_GetObject(exc))) return NULL; - if (!ucnhash_CAPI) { + if (!ucnhash_capi) { /* load the unicode data module */ - ucnhash_CAPI = (_PyUnicode_Name_CAPI *)PyCapsule_Import( + ucnhash_capi = (_PyUnicode_Name_CAPI *)PyCapsule_Import( PyUnicodeData_CAPSULE_NAME, 1); - if (!ucnhash_CAPI) + if (!ucnhash_capi) { return NULL; + } } for (i = start, ressize = 0; i < end; ++i) { /* object is guaranteed to be "ready" */ c = PyUnicode_READ_CHAR(object, i); - if (ucnhash_CAPI->getname(NULL, c, buffer, sizeof(buffer), 1)) { + if (ucnhash_capi->getname(ucnhash_capi->state, NULL, + c, buffer, sizeof(buffer), 1)) { replsize = 1+1+1+(int)strlen(buffer)+1; } else if (c >= 0x10000) { @@ -1009,7 +1011,8 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc) i < end; ++i) { c = PyUnicode_READ_CHAR(object, i); *outp++ = '\\'; - if (ucnhash_CAPI->getname(NULL, c, buffer, sizeof(buffer), 1)) { + if (ucnhash_capi->getname(ucnhash_capi->state, NULL, + c, buffer, sizeof(buffer), 1)) { *outp++ = 'N'; *outp++ = '{'; strcpy((char *)outp, buffer); diff --git a/setup.py b/setup.py index d3fd7bca6438af..8a4abe5a648fd9 100644 --- a/setup.py +++ b/setup.py @@ -878,7 +878,8 @@ def detect_simple_extensions(self): self.add(Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c'])) # static Unicode character database self.add(Extension('unicodedata', ['unicodedata.c'], - depends=['unicodedata_db.h', 'unicodename_db.h'])) + depends=['unicodedata_db.h', 'unicodename_db.h'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) # _opcode module self.add(Extension('_opcode', ['_opcode.c'])) # asyncio speedups From 1c24c2061ddd0b5a37e67d98d64d36d1585c6c0a Mon Sep 17 00:00:00 2001 From: Lisa Roach Date: Mon, 26 Oct 2020 09:28:17 -0700 Subject: [PATCH 0389/1261] bpo-39101: Fixes BaseException hang in IsolatedAsyncioTestCase. (GH-22654) --- Lib/unittest/async_case.py | 4 +-- Lib/unittest/test/test_async_case.py | 27 +++++++++++++++++++ .../2020-10-11-21-43-03.bpo-39101.-I49Pm.rst | 1 + 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst diff --git a/Lib/unittest/async_case.py b/Lib/unittest/async_case.py index 1bc1312c8c2ee9..520213c3727555 100644 --- a/Lib/unittest/async_case.py +++ b/Lib/unittest/async_case.py @@ -102,9 +102,9 @@ async def _asyncioLoopRunner(self, fut): ret = await awaitable if not fut.cancelled(): fut.set_result(ret) - except asyncio.CancelledError: + except (SystemExit, KeyboardInterrupt): raise - except Exception as ex: + except (BaseException, asyncio.CancelledError) as ex: if not fut.cancelled(): fut.set_exception(ex) diff --git a/Lib/unittest/test/test_async_case.py b/Lib/unittest/test/test_async_case.py index 2db441da202a01..d01864b6936ca8 100644 --- a/Lib/unittest/test/test_async_case.py +++ b/Lib/unittest/test/test_async_case.py @@ -190,6 +190,33 @@ async def on_async_cleanup(self, val): 'async_cleanup 2', 'sync_cleanup 1']) + def test_base_exception_from_async_method(self): + events = [] + class Test(unittest.IsolatedAsyncioTestCase): + async def test_base(self): + events.append("test_base") + raise BaseException() + events.append("not it") + + async def test_no_err(self): + events.append("test_no_err") + + async def test_cancel(self): + raise asyncio.CancelledError() + + test = Test("test_base") + output = test.run() + self.assertFalse(output.wasSuccessful()) + + test = Test("test_no_err") + test.run() + self.assertEqual(events, ['test_base', 'test_no_err']) + + test = Test("test_cancel") + output = test.run() + self.assertFalse(output.wasSuccessful()) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst b/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst new file mode 100644 index 00000000000000..a571e8343cde12 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst @@ -0,0 +1 @@ +Fixed tests using IsolatedAsyncioTestCase from hanging on BaseExceptions. \ No newline at end of file From 1aa11df5470e4ffc90701c756e07237dae2209fd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 26 Oct 2020 19:19:36 +0100 Subject: [PATCH 0390/1261] bpo-42157: unicodedata avoids references to UCD_Type (GH-22990) * UCD_Check() uses PyModule_Check() * Simplify the internal _PyUnicode_Name_CAPI structure: * Remove size and state members * Remove state and self parameters of getcode() and getname() functions * Remove global_module_state --- Doc/whatsnew/3.10.rst | 6 +- Include/internal/pycore_ucnhash.h | 24 +- ...2020-10-16-10-47-17.bpo-1635741.e3BcPM.rst | 4 - .../2020-10-16-10-47-17.bpo-42157.e3BcPM.rst | 3 + Modules/unicodedata.c | 216 +++++++++--------- Objects/unicodeobject.c | 3 +- Python/codecs.c | 6 +- 7 files changed, 126 insertions(+), 136 deletions(-) delete mode 100644 Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-1635741.e3BcPM.rst create mode 100644 Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 581d3a57e84573..2ef2b5d19e5859 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -408,10 +408,8 @@ Porting to Python 3.10 (Contributed by Inada Naoki in :issue:`36346`.) * The private ``_PyUnicode_Name_CAPI`` structure of the PyCapsule API - ``unicodedata.ucnhash_CAPI`` moves to the internal C API. Moreover, - the structure gets a new ``state`` member which must be passed to the - ``getcode()`` and ``getname()`` functions. - (Contributed by Victor Stinner in :issue:`1635741`.) + ``unicodedata.ucnhash_CAPI`` moves to the internal C API. + (Contributed by Victor Stinner in :issue:`42157`.) Deprecated ---------- diff --git a/Include/internal/pycore_ucnhash.h b/Include/internal/pycore_ucnhash.h index 380b9415d42800..5e7c035f81d2ac 100644 --- a/Include/internal/pycore_ucnhash.h +++ b/Include/internal/pycore_ucnhash.h @@ -15,25 +15,15 @@ extern "C" { typedef struct { - /* Size of this struct */ - int size; - - // state which must be passed as the first parameter to getname() - // and getcode() - void *state; - - /* Get name for a given character code. Returns non-zero if - success, zero if not. Does not set Python exceptions. - If self is NULL, data come from the default version of the database. - If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */ - int (*getname)(void *state, PyObject *self, Py_UCS4 code, - char* buffer, int buflen, + /* Get name for a given character code. + Returns non-zero if success, zero if not. + Does not set Python exceptions. */ + int (*getname)(Py_UCS4 code, char* buffer, int buflen, int with_alias_and_seq); - /* Get character code for a given name. Same error handling - as for getname. */ - int (*getcode)(void *state, PyObject *self, - const char* name, int namelen, Py_UCS4* code, + /* Get character code for a given name. + Same error handling as for getname(). */ + int (*getcode)(const char* name, int namelen, Py_UCS4* code, int with_named_seq); } _PyUnicode_Name_CAPI; diff --git a/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-1635741.e3BcPM.rst b/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-1635741.e3BcPM.rst deleted file mode 100644 index 5272ad577265af..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-1635741.e3BcPM.rst +++ /dev/null @@ -1,4 +0,0 @@ -The private ``_PyUnicode_Name_CAPI`` structure of the PyCapsule API -``unicodedata.ucnhash_CAPI`` moves to the internal C API. Moreover, the -structure gets a new ``state`` member which must be passed to the -``getcode()`` and ``getname()`` functions. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst b/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst new file mode 100644 index 00000000000000..1f05186d9e0ef5 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst @@ -0,0 +1,3 @@ +The private ``_PyUnicode_Name_CAPI`` structure of the PyCapsule API +``unicodedata.ucnhash_CAPI`` moves to the internal C API. +Patch by Victor Stinner. diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index bfd8ab503c8ccd..6c802ba116ffe6 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -93,29 +93,19 @@ static PyMemberDef DB_members[] = { /* forward declaration */ static PyTypeObject UCD_Type; -typedef struct { - // Borrowed reference to &UCD_Type. It is used to prepare the code - // to convert the UCD_Type static type to a heap type. - PyTypeObject *ucd_type; - - _PyUnicode_Name_CAPI capi; -} unicodedata_module_state; - -// bpo-1635741: Temporary global state until the unicodedata module -// gets a real module state. -static unicodedata_module_state global_module_state; - -// Check if self is an instance of ucd_type. -// Return 0 if self is NULL (when the PyCapsule C API is used). -#define UCD_Check(self, ucd_type) (self != NULL && Py_IS_TYPE(self, ucd_type)) +// Check if self is an unicodedata.UCD instance. +// If self is NULL (when the PyCapsule C API is used), return 0. +// PyModule_Check() is used to avoid having to retrieve the ucd_type. +// See unicodedata_functions comment to the rationale of this macro. +#define UCD_Check(self) (self != NULL && !PyModule_Check(self)) static PyObject* -new_previous_version(unicodedata_module_state *state, +new_previous_version(PyTypeObject *ucd_type, const char*name, const change_record* (*getrecord)(Py_UCS4), Py_UCS4 (*normalization)(Py_UCS4)) { PreviousDBVersion *self; - self = PyObject_New(PreviousDBVersion, state->ucd_type); + self = PyObject_New(PreviousDBVersion, ucd_type); if (self == NULL) return NULL; self->name = name; @@ -147,12 +137,11 @@ unicodedata_UCD_decimal_impl(PyObject *self, int chr, PyObject *default_value) /*[clinic end generated code: output=be23376e1a185231 input=933f8107993f23d0]*/ { - unicodedata_module_state *state = &global_module_state; int have_old = 0; long rc; Py_UCS4 c = (Py_UCS4)chr; - if (UCD_Check(self, state->ucd_type)) { + if (UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) { /* unassigned */ @@ -236,12 +225,11 @@ unicodedata_UCD_numeric_impl(PyObject *self, int chr, PyObject *default_value) /*[clinic end generated code: output=53ce281fe85b10c4 input=fdf5871a5542893c]*/ { - unicodedata_module_state *state = &global_module_state; int have_old = 0; double rc; Py_UCS4 c = (Py_UCS4)chr; - if (UCD_Check(self, state->ucd_type)) { + if (UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) { /* unassigned */ @@ -283,11 +271,10 @@ static PyObject * unicodedata_UCD_category_impl(PyObject *self, int chr) /*[clinic end generated code: output=8571539ee2e6783a input=27d6f3d85050bc06]*/ { - unicodedata_module_state *state = &global_module_state; int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->category; - if (UCD_Check(self, state->ucd_type)) { + if (UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed != 0xFF) index = old->category_changed; @@ -311,11 +298,10 @@ static PyObject * unicodedata_UCD_bidirectional_impl(PyObject *self, int chr) /*[clinic end generated code: output=d36310ce2039bb92 input=b3d8f42cebfcf475]*/ { - unicodedata_module_state *state = &global_module_state; int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->bidirectional; - if (UCD_Check(self, state->ucd_type)) { + if (UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -341,11 +327,10 @@ static int unicodedata_UCD_combining_impl(PyObject *self, int chr) /*[clinic end generated code: output=cad056d0cb6a5920 input=9f2d6b2a95d0a22a]*/ { - unicodedata_module_state *state = &global_module_state; int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->combining; - if (UCD_Check(self, state->ucd_type)) { + if (UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -370,11 +355,10 @@ static int unicodedata_UCD_mirrored_impl(PyObject *self, int chr) /*[clinic end generated code: output=2532dbf8121b50e6 input=5dd400d351ae6f3b]*/ { - unicodedata_module_state *state = &global_module_state; int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->mirrored; - if (UCD_Check(self, state->ucd_type)) { + if (UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -398,11 +382,10 @@ static PyObject * unicodedata_UCD_east_asian_width_impl(PyObject *self, int chr) /*[clinic end generated code: output=484e8537d9ee8197 input=c4854798aab026e0]*/ { - unicodedata_module_state *state = &global_module_state; int index; Py_UCS4 c = (Py_UCS4)chr; index = (int) _getrecord_ex(c)->east_asian_width; - if (UCD_Check(self, state->ucd_type)) { + if (UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ @@ -428,7 +411,6 @@ static PyObject * unicodedata_UCD_decomposition_impl(PyObject *self, int chr) /*[clinic end generated code: output=7d699f3ec7565d27 input=e4c12459ad68507b]*/ { - unicodedata_module_state *state = &global_module_state; char decomp[256]; int code, index, count; size_t i; @@ -437,7 +419,7 @@ unicodedata_UCD_decomposition_impl(PyObject *self, int chr) code = (int)c; - if (UCD_Check(self, state->ucd_type)) { + if (UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) return PyUnicode_FromString(""); /* unassigned */ @@ -480,13 +462,14 @@ unicodedata_UCD_decomposition_impl(PyObject *self, int chr) } static void -get_decomp_record(unicodedata_module_state *state, PyObject *self, - Py_UCS4 code, int *index, int *prefix, int *count) +get_decomp_record(PyObject *self, Py_UCS4 code, + int *index, int *prefix, int *count) { if (code >= 0x110000) { *index = 0; - } else if (UCD_Check(self, state->ucd_type) && - get_old_record(self, code)->category_changed==0) { + } + else if (UCD_Check(self) + && get_old_record(self, code)->category_changed==0) { /* unassigned in old version */ *index = 0; } @@ -515,8 +498,7 @@ get_decomp_record(unicodedata_module_state *state, PyObject *self, #define SCount (LCount*NCount) static PyObject* -nfd_nfkd(unicodedata_module_state *state, PyObject *self, - PyObject *input, int k) +nfd_nfkd(PyObject *self, PyObject *input, int k) { PyObject *result; Py_UCS4 *output; @@ -584,7 +566,7 @@ nfd_nfkd(unicodedata_module_state *state, PyObject *self, continue; } /* normalization changes */ - if (UCD_Check(self, state->ucd_type)) { + if (UCD_Check(self)) { Py_UCS4 value = ((PreviousDBVersion*)self)->normalization(code); if (value != 0) { stack[stackptr++] = value; @@ -593,7 +575,7 @@ nfd_nfkd(unicodedata_module_state *state, PyObject *self, } /* Other decompositions. */ - get_decomp_record(state, self, code, &index, &prefix, &count); + get_decomp_record(self, code, &index, &prefix, &count); /* Copy character if it is not decomposable, or has a compatibility decomposition, but we do NFD. */ @@ -665,7 +647,7 @@ find_nfc_index(const struct reindex* nfc, Py_UCS4 code) } static PyObject* -nfc_nfkc(unicodedata_module_state *state, PyObject *self, PyObject *input, int k) +nfc_nfkc(PyObject *self, PyObject *input, int k) { PyObject *result; int kind; @@ -677,7 +659,7 @@ nfc_nfkc(unicodedata_module_state *state, PyObject *self, PyObject *input, int k Py_ssize_t skipped[20]; int cskipped = 0; - result = nfd_nfkd(state, self, input, k); + result = nfd_nfkd(self, input, k); if (!result) return NULL; /* result will be "ready". */ @@ -820,13 +802,13 @@ typedef enum {YES = 0, MAYBE = 1, NO = 2} QuickcheckResult; * https://www.unicode.org/reports/tr15/#Detecting_Normalization_Forms */ static QuickcheckResult -is_normalized_quickcheck(unicodedata_module_state *state, PyObject *self, - PyObject *input, bool nfc, bool k, bool yes_only) +is_normalized_quickcheck(PyObject *self, PyObject *input, bool nfc, bool k, + bool yes_only) { - /* An older version of the database is requested, quickchecks must be - disabled. */ - if (UCD_Check(self, state->ucd_type)) + /* UCD 3.2.0 is requested, quickchecks must be disabled. */ + if (UCD_Check(self)) { return NO; + } Py_ssize_t i, len; int kind; @@ -885,7 +867,6 @@ unicodedata_UCD_is_normalized_impl(PyObject *self, PyObject *form, PyObject *input) /*[clinic end generated code: output=11e5a3694e723ca5 input=a544f14cea79e508]*/ { - unicodedata_module_state *state = &global_module_state; if (PyUnicode_READY(input) == -1) { return NULL; } @@ -921,10 +902,10 @@ unicodedata_UCD_is_normalized_impl(PyObject *self, PyObject *form, return NULL; } - m = is_normalized_quickcheck(state, self, input, nfc, k, false); + m = is_normalized_quickcheck(self, input, nfc, k, false); if (m == MAYBE) { - cmp = (nfc ? nfc_nfkc : nfd_nfkd)(state, self, input, k); + cmp = (nfc ? nfc_nfkc : nfd_nfkd)(self, input, k); if (cmp == NULL) { return NULL; } @@ -959,7 +940,6 @@ unicodedata_UCD_normalize_impl(PyObject *self, PyObject *form, PyObject *input) /*[clinic end generated code: output=05ca4385a2ad6983 input=3a5206c0ad2833fb]*/ { - unicodedata_module_state *state = &global_module_state; if (PyUnicode_GET_LENGTH(input) == 0) { /* Special case empty input strings, since resizing them later would cause internal errors. */ @@ -968,36 +948,36 @@ unicodedata_UCD_normalize_impl(PyObject *self, PyObject *form, } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFC)) { - if (is_normalized_quickcheck(state, self, input, + if (is_normalized_quickcheck(self, input, true, false, true) == YES) { Py_INCREF(input); return input; } - return nfc_nfkc(state, self, input, 0); + return nfc_nfkc(self, input, 0); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKC)) { - if (is_normalized_quickcheck(state, self, input, + if (is_normalized_quickcheck(self, input, true, true, true) == YES) { Py_INCREF(input); return input; } - return nfc_nfkc(state, self, input, 1); + return nfc_nfkc(self, input, 1); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFD)) { - if (is_normalized_quickcheck(state, self, input, + if (is_normalized_quickcheck(self, input, false, false, true) == YES) { Py_INCREF(input); return input; } - return nfd_nfkd(state, self, input, 0); + return nfd_nfkd(self, input, 0); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKD)) { - if (is_normalized_quickcheck(state, self, input, + if (is_normalized_quickcheck(self, input, false, true, true) == YES) { Py_INCREF(input); return input; } - return nfd_nfkd(state, self, input, 1); + return nfd_nfkd(self, input, 1); } PyErr_SetString(PyExc_ValueError, "invalid normalization form"); return NULL; @@ -1080,7 +1060,7 @@ is_unified_ideograph(Py_UCS4 code) (cp < named_sequences_end)) static int -_getucname(unicodedata_module_state *state, PyObject *self, +_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen, int with_alias_and_seq) { /* Find the name associated with the given code point. @@ -1098,7 +1078,7 @@ _getucname(unicodedata_module_state *state, PyObject *self, if (!with_alias_and_seq && (IS_ALIAS(code) || IS_NAMED_SEQ(code))) return 0; - if (UCD_Check(self, state->ucd_type)) { + if (UCD_Check(self)) { /* in 3.2.0 there are no aliases and named sequences */ const change_record *old; if (IS_ALIAS(code) || IS_NAMED_SEQ(code)) @@ -1182,23 +1162,21 @@ _getucname(unicodedata_module_state *state, PyObject *self, } static int -capi_getucname(void *state_raw, PyObject *self, Py_UCS4 code, +capi_getucname(Py_UCS4 code, char* buffer, int buflen, int with_alias_and_seq) { - unicodedata_module_state *state = (unicodedata_module_state *)state_raw; - return _getucname(state, self, code, buffer, buflen, with_alias_and_seq); + return _getucname(NULL, code, buffer, buflen, with_alias_and_seq); } static int -_cmpname(unicodedata_module_state *state, PyObject *self, - int code, const char* name, int namelen) +_cmpname(PyObject *self, int code, const char* name, int namelen) { /* check if code corresponds to the given name */ int i; char buffer[NAME_MAXLEN+1]; - if (!_getucname(state, self, code, buffer, NAME_MAXLEN, 1)) + if (!_getucname(self, code, buffer, NAME_MAXLEN, 1)) return 0; for (i = 0; i < namelen; i++) { if (Py_TOUPPER(name[i]) != buffer[i]) @@ -1243,7 +1221,7 @@ _check_alias_and_seq(unsigned int cp, Py_UCS4* code, int with_named_seq) } static int -_getcode(unicodedata_module_state *state, PyObject* self, +_getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code, int with_named_seq) { /* Return the code point associated with the given name. @@ -1305,7 +1283,7 @@ _getcode(unicodedata_module_state *state, PyObject* self, v = code_hash[i]; if (!v) return 0; - if (_cmpname(state, self, v, name, namelen)) { + if (_cmpname(self, v, name, namelen)) { return _check_alias_and_seq(v, code, with_named_seq); } incr = (h ^ (h >> 3)) & mask; @@ -1316,7 +1294,7 @@ _getcode(unicodedata_module_state *state, PyObject* self, v = code_hash[i]; if (!v) return 0; - if (_cmpname(state, self, v, name, namelen)) { + if (_cmpname(self, v, name, namelen)) { return _check_alias_and_seq(v, code, with_named_seq); } incr = incr << 1; @@ -1326,15 +1304,20 @@ _getcode(unicodedata_module_state *state, PyObject* self, } static int -capi_getcode(void *state_raw, PyObject* self, - const char* name, int namelen, Py_UCS4* code, +capi_getcode(const char* name, int namelen, Py_UCS4* code, int with_named_seq) { - unicodedata_module_state *state = (unicodedata_module_state *)state_raw; - return _getcode(state, self, name, namelen, code, with_named_seq); + return _getcode(NULL, name, namelen, code, with_named_seq); } +static const _PyUnicode_Name_CAPI unicodedata_capi = +{ + .getname = capi_getucname, + .getcode = capi_getcode, +}; + + /* -------------------------------------------------------------------- */ /* Python bindings */ @@ -1356,11 +1339,10 @@ static PyObject * unicodedata_UCD_name_impl(PyObject *self, int chr, PyObject *default_value) /*[clinic end generated code: output=6bbb37a326407707 input=3e0367f534de56d9]*/ { - unicodedata_module_state *state = &global_module_state; char name[NAME_MAXLEN+1]; Py_UCS4 c = (Py_UCS4)chr; - if (!_getucname(state, self, c, name, NAME_MAXLEN, 0)) { + if (!_getucname(self, c, name, NAME_MAXLEN, 0)) { if (default_value == NULL) { PyErr_SetString(PyExc_ValueError, "no such name"); return NULL; @@ -1392,7 +1374,6 @@ unicodedata_UCD_lookup_impl(PyObject *self, const char *name, Py_ssize_clean_t name_length) /*[clinic end generated code: output=765cb8186788e6be input=a557be0f8607a0d6]*/ { - unicodedata_module_state *state = &global_module_state; Py_UCS4 code; unsigned int index; if (name_length > NAME_MAXLEN) { @@ -1400,7 +1381,7 @@ unicodedata_UCD_lookup_impl(PyObject *self, const char *name, return NULL; } - if (!_getcode(state, self, name, (int)name_length, &code, 1)) { + if (!_getcode(self, name, (int)name_length, &code, 1)) { PyErr_Format(PyExc_KeyError, "undefined character name '%s'", name); return NULL; } @@ -1415,8 +1396,10 @@ unicodedata_UCD_lookup_impl(PyObject *self, const char *name, return PyUnicode_FromOrdinal(code); } -/* XXX Add doc strings. */ - +// List of functions used to define module functions *AND* unicodedata.UCD +// methods. For module functions, self is the module. For UCD methods, self +// is an UCD instance. The UCD_Check() macro is used to check if self is +// an UCD instance. static PyMethodDef unicodedata_functions[] = { UNICODEDATA_UCD_DECIMAL_METHODDEF UNICODEDATA_UCD_DIGIT_METHODDEF @@ -1501,41 +1484,64 @@ static struct PyModuleDef unicodedatamodule = { NULL }; -PyMODINIT_FUNC -PyInit_unicodedata(void) -{ - PyObject *m, *v; - unicodedata_module_state *state = &global_module_state; - - state->capi.size = sizeof(_PyUnicode_Name_CAPI); - state->capi.state = state; - state->capi.getname = capi_getucname; - state->capi.getcode = capi_getcode; +static int +unicodedata_exec(PyObject *module) +{ Py_SET_TYPE(&UCD_Type, &PyType_Type); - state->ucd_type = &UCD_Type; + PyTypeObject *ucd_type = &UCD_Type; - m = PyModule_Create(&unicodedatamodule); - if (!m) - return NULL; + if (PyModule_AddStringConstant(module, "unidata_version", UNIDATA_VERSION) < 0) { + return -1; + } - PyModule_AddStringConstant(m, "unidata_version", UNIDATA_VERSION); - Py_INCREF(state->ucd_type); - PyModule_AddObject(m, "UCD", (PyObject*)state->ucd_type); + if (PyModule_AddType(module, ucd_type) < 0) { + return -1; + } /* Previous versions */ - v = new_previous_version(state, "3.2.0", + PyObject *v; + v = new_previous_version(ucd_type, "3.2.0", get_change_3_2_0, normalization_3_2_0); - if (v != NULL) - PyModule_AddObject(m, "ucd_3_2_0", v); + if (v == NULL) { + return -1; + } + if (PyModule_AddObject(module, "ucd_3_2_0", v) < 0) { + Py_DECREF(v); + return -1; + } /* Export C API */ - v = PyCapsule_New((void *)&state->capi, PyUnicodeData_CAPSULE_NAME, NULL); - if (v != NULL) - PyModule_AddObject(m, "ucnhash_CAPI", v); - return m; + v = PyCapsule_New((void *)&unicodedata_capi, PyUnicodeData_CAPSULE_NAME, + NULL); + if (v == NULL) { + return -1; + } + if (PyModule_AddObject(module, "ucnhash_CAPI", v) < 0) { + Py_DECREF(v); + return -1; + } + return 0; +} + + +PyMODINIT_FUNC +PyInit_unicodedata(void) +{ + PyObject *module = PyModule_Create(&unicodedatamodule); + if (!module) { + return NULL; + } + + if (unicodedata_exec(module) < 0) { + Py_DECREF(module); + return NULL; + } + + return module; } + /* Local variables: c-basic-offset: 4 diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index ba48d35aa40b19..9058018201039c 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6523,8 +6523,7 @@ _PyUnicode_DecodeUnicodeEscape(const char *s, s++; ch = 0xffffffff; /* in case 'getcode' messes up */ if (namelen <= INT_MAX && - ucnhash_capi->getcode(ucnhash_capi->state, NULL, - start, (int)namelen, + ucnhash_capi->getcode(start, (int)namelen, &ch, 0)) { assert(ch <= MAX_UNICODE); WRITE_CHAR(ch); diff --git a/Python/codecs.c b/Python/codecs.c index 62d1f3f3ac0d3c..fa329ce2436427 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -987,8 +987,7 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc) for (i = start, ressize = 0; i < end; ++i) { /* object is guaranteed to be "ready" */ c = PyUnicode_READ_CHAR(object, i); - if (ucnhash_capi->getname(ucnhash_capi->state, NULL, - c, buffer, sizeof(buffer), 1)) { + if (ucnhash_capi->getname(c, buffer, sizeof(buffer), 1)) { replsize = 1+1+1+(int)strlen(buffer)+1; } else if (c >= 0x10000) { @@ -1011,8 +1010,7 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc) i < end; ++i) { c = PyUnicode_READ_CHAR(object, i); *outp++ = '\\'; - if (ucnhash_capi->getname(ucnhash_capi->state, NULL, - c, buffer, sizeof(buffer), 1)) { + if (ucnhash_capi->getname(c, buffer, sizeof(buffer), 1)) { *outp++ = 'N'; *outp++ = '{'; strcpy((char *)outp, buffer); From 7997bc70afa2b045b0404b8fb6896270ec60550a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 26 Oct 2020 23:19:22 +0100 Subject: [PATCH 0391/1261] bpo-42157: Convert unicodedata.UCD to heap type (GH-22991) Convert the unicodedata extension module to the multiphase initialization API (PEP 489) and convert the unicodedata.UCD static type to a heap type. Co-Authored-By: Mohamed Koubaa --- .../2020-10-26-19-08-07.bpo-42157.Bdpa04.rst | 4 + Modules/_abc.c | 16 +-- Modules/unicodedata.c | 120 +++++++----------- 3 files changed, 56 insertions(+), 84 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-26-19-08-07.bpo-42157.Bdpa04.rst diff --git a/Misc/NEWS.d/next/Library/2020-10-26-19-08-07.bpo-42157.Bdpa04.rst b/Misc/NEWS.d/next/Library/2020-10-26-19-08-07.bpo-42157.Bdpa04.rst new file mode 100644 index 00000000000000..68778906bbbf36 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-26-19-08-07.bpo-42157.Bdpa04.rst @@ -0,0 +1,4 @@ +Convert the :mod:`unicodedata` extension module to the multiphase +initialization API (:pep:`489`) and convert the ``unicodedata.UCD`` +static type to a heap type. +Patch by Mohamed Koubaa and Victor Stinner. diff --git a/Modules/_abc.c b/Modules/_abc.c index 709b52ff96b296..7afaa759b2bfec 100644 --- a/Modules/_abc.c +++ b/Modules/_abc.c @@ -891,14 +891,14 @@ static PyModuleDef_Slot _abcmodule_slots[] = { static struct PyModuleDef _abcmodule = { PyModuleDef_HEAD_INIT, - "_abc", - _abc__doc__, - sizeof(_abcmodule_state), - _abcmodule_methods, - _abcmodule_slots, - _abcmodule_traverse, - _abcmodule_clear, - _abcmodule_free, + .m_name = "_abc", + .m_doc = _abc__doc__, + .m_size = sizeof(_abcmodule_state), + .m_methods = _abcmodule_methods, + .m_slots = _abcmodule_slots, + .m_traverse = _abcmodule_traverse, + .m_clear = _abcmodule_clear, + .m_free = _abcmodule_free, }; PyMODINIT_FUNC diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index 6c802ba116ffe6..18b0a9af9d21c4 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -28,9 +28,9 @@ _Py_IDENTIFIER(NFKD); /*[clinic input] module unicodedata -class unicodedata.UCD 'PreviousDBVersion *' '&UCD_Type' +class unicodedata.UCD 'PreviousDBVersion *' '' [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=6dac153082d150bc]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=e47113e05924be43]*/ /* character properties */ @@ -90,9 +90,6 @@ static PyMemberDef DB_members[] = { {NULL} }; -/* forward declaration */ -static PyTypeObject UCD_Type; - // Check if self is an unicodedata.UCD instance. // If self is NULL (when the PyCapsule C API is used), return 0. // PyModule_Check() is used to avoid having to retrieve the ucd_type. @@ -1417,50 +1414,27 @@ static PyMethodDef unicodedata_functions[] = { {NULL, NULL} /* sentinel */ }; -static PyTypeObject UCD_Type = { - /* The ob_type field must be initialized in the module init function - * to be portable to Windows without using C++. */ - PyVarObject_HEAD_INIT(NULL, 0) - "unicodedata.UCD", /*tp_name*/ - sizeof(PreviousDBVersion), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)PyObject_Del, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - PyObject_GenericGetAttr,/*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - unicodedata_functions, /*tp_methods*/ - DB_members, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - 0, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ +static void +ucd_dealloc(PreviousDBVersion *self) +{ + PyTypeObject *tp = Py_TYPE(self); + PyObject_Del(self); + Py_DECREF(tp); +} + +static PyType_Slot ucd_type_slots[] = { + {Py_tp_dealloc, ucd_dealloc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_methods, unicodedata_functions}, + {Py_tp_members, DB_members}, + {0, 0} +}; + +static PyType_Spec ucd_type_spec = { + .name = "unicodedata.UCD", + .basicsize = sizeof(PreviousDBVersion), + .flags = Py_TPFLAGS_DEFAULT, + .slots = ucd_type_slots }; PyDoc_STRVAR(unicodedata_docstring, @@ -1472,30 +1446,20 @@ this database is based on the UnicodeData.txt file version\n\ The module uses the same names and symbols as defined by the\n\ UnicodeData File Format " UNIDATA_VERSION "."); -static struct PyModuleDef unicodedatamodule = { - PyModuleDef_HEAD_INIT, - "unicodedata", - unicodedata_docstring, - -1, - unicodedata_functions, - NULL, - NULL, - NULL, - NULL -}; - - static int unicodedata_exec(PyObject *module) { - Py_SET_TYPE(&UCD_Type, &PyType_Type); - PyTypeObject *ucd_type = &UCD_Type; - if (PyModule_AddStringConstant(module, "unidata_version", UNIDATA_VERSION) < 0) { return -1; } + PyTypeObject *ucd_type = (PyTypeObject *)PyType_FromSpec(&ucd_type_spec); + if (ucd_type == NULL) { + return -1; + } + if (PyModule_AddType(module, ucd_type) < 0) { + Py_DECREF(ucd_type); return -1; } @@ -1503,6 +1467,7 @@ unicodedata_exec(PyObject *module) PyObject *v; v = new_previous_version(ucd_type, "3.2.0", get_change_3_2_0, normalization_3_2_0); + Py_DECREF(ucd_type); if (v == NULL) { return -1; } @@ -1524,21 +1489,24 @@ unicodedata_exec(PyObject *module) return 0; } +static PyModuleDef_Slot unicodedata_slots[] = { + {Py_mod_exec, unicodedata_exec}, + {0, NULL} +}; + +static struct PyModuleDef unicodedata_module = { + PyModuleDef_HEAD_INIT, + .m_name = "unicodedata", + .m_doc = unicodedata_docstring, + .m_size = 0, + .m_methods = unicodedata_functions, + .m_slots = unicodedata_slots, +}; PyMODINIT_FUNC PyInit_unicodedata(void) { - PyObject *module = PyModule_Create(&unicodedatamodule); - if (!module) { - return NULL; - } - - if (unicodedata_exec(module) < 0) { - Py_DECREF(module); - return NULL; - } - - return module; + return PyModuleDef_Init(&unicodedata_module); } From a96f06a83d6b823c2e301eefb90546590dfbcb80 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Tue, 27 Oct 2020 00:42:04 +0200 Subject: [PATCH 0392/1261] bpo-42123: Run the parser two times and only enable invalid rules on the second run (GH-22111) * Implement running the parser a second time for the errors messages The first parser run is only responsible for detecting whether there is a `SyntaxError` or not. If there isn't the AST gets returned. Otherwise, the parser is run a second time with all the `invalid_*` rules enabled so that all the customized error messages get produced. --- Grammar/python.gram | 4 +- .../2020-10-23-02-43-24.bpo-42123.64gJWC.rst | 3 + Parser/parser.c | 94 +++++++++---------- Parser/pegen.c | 13 +++ Parser/pegen.h | 1 + Tools/peg_generator/pegen/c_generator.py | 5 +- 6 files changed, 70 insertions(+), 50 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-23-02-43-24.bpo-42123.64gJWC.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index d2d6fc0d3398bc..19c85accf8d9a1 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -551,7 +551,7 @@ yield_expr[expr_ty]: arguments[expr_ty] (memo): | a=args [','] &')' { a } - | incorrect_arguments + | invalid_arguments args[expr_ty]: | a[asdl_expr_seq*]=','.(starred_expression | named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b, EXTRA) } | a=kwargs { _Py_Call(_PyPegen_dummy_name(p), @@ -637,7 +637,7 @@ t_atom[expr_ty]: # From here on, there are rules for invalid syntax with specialised error messages -incorrect_arguments: +invalid_arguments: | args ',' '*' { RAISE_SYNTAX_ERROR("iterable argument unpacking follows keyword argument unpacking") } | a=expression for_if_clauses ',' [args | expression for_if_clauses] { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "Generator expression must be parenthesized") } diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-23-02-43-24.bpo-42123.64gJWC.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-23-02-43-24.bpo-42123.64gJWC.rst new file mode 100644 index 00000000000000..6461efd76f0f97 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-23-02-43-24.bpo-42123.64gJWC.rst @@ -0,0 +1,3 @@ +Run the parser two times. On the first run, disable all the rules that only +generate better error messages to gain performance. If there's a parse +failure, run the parser a second time with those enabled. diff --git a/Parser/parser.c b/Parser/parser.c index 09be03c633a264..e438f06c9be9a0 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -209,7 +209,7 @@ static KeywordToken *reserved_keywords[] = { #define t_primary_type 1140 // Left-recursive #define t_lookahead_type 1141 #define t_atom_type 1142 -#define incorrect_arguments_type 1143 +#define invalid_arguments_type 1143 #define invalid_kwarg_type 1144 #define invalid_named_expression_type 1145 #define invalid_assignment_type 1146 @@ -527,7 +527,7 @@ static expr_ty target_rule(Parser *p); static expr_ty t_primary_rule(Parser *p); static void *t_lookahead_rule(Parser *p); static expr_ty t_atom_rule(Parser *p); -static void *incorrect_arguments_rule(Parser *p); +static void *invalid_arguments_rule(Parser *p); static void *invalid_kwarg_rule(Parser *p); static void *invalid_named_expression_rule(Parser *p); static void *invalid_assignment_rule(Parser *p); @@ -2218,7 +2218,7 @@ assignment_rule(Parser *p) return NULL; } } - { // invalid_assignment + if (p->call_invalid_rules) { // invalid_assignment if (p->error_indicator) { D(p->level--); return NULL; @@ -2891,7 +2891,7 @@ del_stmt_rule(Parser *p) D(fprintf(stderr, "%*c%s del_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'del' del_targets &(';' | NEWLINE)")); } - { // invalid_del_stmt + if (p->call_invalid_rules) { // invalid_del_stmt if (p->error_indicator) { D(p->level--); return NULL; @@ -3242,7 +3242,7 @@ import_from_targets_rule(Parser *p) D(fprintf(stderr, "%*c%s import_from_targets[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'")); } - { // invalid_import_from_targets + if (p->call_invalid_rules) { // invalid_import_from_targets if (p->error_indicator) { D(p->level--); return NULL; @@ -4035,7 +4035,7 @@ for_stmt_rule(Parser *p) return NULL; } } - { // invalid_for_target + if (p->call_invalid_rules) { // invalid_for_target if (p->error_indicator) { D(p->level--); return NULL; @@ -4336,7 +4336,7 @@ with_item_rule(Parser *p) D(fprintf(stderr, "%*c%s with_item[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression 'as' star_target &(',' | ')' | ':')")); } - { // invalid_with_item + if (p->call_invalid_rules) { // invalid_with_item if (p->error_indicator) { D(p->level--); return NULL; @@ -5071,7 +5071,7 @@ func_type_comment_rule(Parser *p) D(fprintf(stderr, "%*c%s func_type_comment[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE TYPE_COMMENT &(NEWLINE INDENT)")); } - { // invalid_double_type_comments + if (p->call_invalid_rules) { // invalid_double_type_comments if (p->error_indicator) { D(p->level--); return NULL; @@ -5126,7 +5126,7 @@ params_rule(Parser *p) } arguments_ty _res = NULL; int _mark = p->mark; - { // invalid_parameters + if (p->call_invalid_rules) { // invalid_parameters if (p->error_indicator) { D(p->level--); return NULL; @@ -5601,7 +5601,7 @@ star_etc_rule(Parser *p) D(fprintf(stderr, "%*c%s star_etc[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwds")); } - { // invalid_star_etc + if (p->call_invalid_rules) { // invalid_star_etc if (p->error_indicator) { D(p->level--); return NULL; @@ -6304,7 +6304,7 @@ block_rule(Parser *p) D(fprintf(stderr, "%*c%s block[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt")); } - { // invalid_block + if (p->call_invalid_rules) { // invalid_block if (p->error_indicator) { D(p->level--); return NULL; @@ -6798,7 +6798,7 @@ named_expression_rule(Parser *p) D(fprintf(stderr, "%*c%s named_expression[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); } - { // invalid_named_expression + if (p->call_invalid_rules) { // invalid_named_expression if (p->error_indicator) { D(p->level--); return NULL; @@ -7192,7 +7192,7 @@ lambda_params_rule(Parser *p) } arguments_ty _res = NULL; int _mark = p->mark; - { // invalid_lambda_parameters + if (p->call_invalid_rules) { // invalid_lambda_parameters if (p->error_indicator) { D(p->level--); return NULL; @@ -7669,7 +7669,7 @@ lambda_star_etc_rule(Parser *p) D(fprintf(stderr, "%*c%s lambda_star_etc[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_kwds")); } - { // invalid_lambda_star_etc + if (p->call_invalid_rules) { // invalid_lambda_star_etc if (p->error_indicator) { D(p->level--); return NULL; @@ -11163,7 +11163,7 @@ listcomp_rule(Parser *p) return NULL; } } - { // invalid_comprehension + if (p->call_invalid_rules) { // invalid_comprehension if (p->error_indicator) { D(p->level--); return NULL; @@ -11294,7 +11294,7 @@ group_rule(Parser *p) D(fprintf(stderr, "%*c%s group[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' (yield_expr | named_expression) ')'")); } - { // invalid_group + if (p->call_invalid_rules) { // invalid_group if (p->error_indicator) { D(p->level--); return NULL; @@ -11388,7 +11388,7 @@ genexp_rule(Parser *p) return NULL; } } - { // invalid_comprehension + if (p->call_invalid_rules) { // invalid_comprehension if (p->error_indicator) { D(p->level--); return NULL; @@ -11547,7 +11547,7 @@ setcomp_rule(Parser *p) return NULL; } } - { // invalid_comprehension + if (p->call_invalid_rules) { // invalid_comprehension if (p->error_indicator) { D(p->level--); return NULL; @@ -11699,7 +11699,7 @@ dictcomp_rule(Parser *p) D(fprintf(stderr, "%*c%s dictcomp[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' kvpair for_if_clauses '}'")); } - { // invalid_dict_comprehension + if (p->call_invalid_rules) { // invalid_dict_comprehension if (p->error_indicator) { D(p->level--); return NULL; @@ -12023,7 +12023,7 @@ for_if_clause_rule(Parser *p) return NULL; } } - { // invalid_for_target + if (p->call_invalid_rules) { // invalid_for_target if (p->error_indicator) { D(p->level--); return NULL; @@ -12149,7 +12149,7 @@ yield_expr_rule(Parser *p) return _res; } -// arguments: args ','? &')' | incorrect_arguments +// arguments: args ','? &')' | invalid_arguments static expr_ty arguments_rule(Parser *p) { @@ -12194,24 +12194,24 @@ arguments_rule(Parser *p) D(fprintf(stderr, "%*c%s arguments[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ','? &')'")); } - { // incorrect_arguments + if (p->call_invalid_rules) { // invalid_arguments if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "incorrect_arguments")); - void *incorrect_arguments_var; + D(fprintf(stderr, "%*c> arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_arguments")); + void *invalid_arguments_var; if ( - (incorrect_arguments_var = incorrect_arguments_rule(p)) // incorrect_arguments + (invalid_arguments_var = invalid_arguments_rule(p)) // invalid_arguments ) { - D(fprintf(stderr, "%*c+ arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "incorrect_arguments")); - _res = incorrect_arguments_var; + D(fprintf(stderr, "%*c+ arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_arguments")); + _res = invalid_arguments_var; goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s arguments[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "incorrect_arguments")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_arguments")); } _res = NULL; done: @@ -12548,7 +12548,7 @@ kwarg_or_starred_rule(Parser *p) D(fprintf(stderr, "%*c%s kwarg_or_starred[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } - { // invalid_kwarg + if (p->call_invalid_rules) { // invalid_kwarg if (p->error_indicator) { D(p->level--); return NULL; @@ -12668,7 +12668,7 @@ kwarg_or_double_starred_rule(Parser *p) D(fprintf(stderr, "%*c%s kwarg_or_double_starred[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' expression")); } - { // invalid_kwarg + if (p->call_invalid_rules) { // invalid_kwarg if (p->error_indicator) { D(p->level--); return NULL; @@ -14380,14 +14380,14 @@ t_atom_rule(Parser *p) return _res; } -// incorrect_arguments: +// invalid_arguments: // | args ',' '*' // | expression for_if_clauses ',' [args | expression for_if_clauses] // | args for_if_clauses // | args ',' expression for_if_clauses // | args ',' args static void * -incorrect_arguments_rule(Parser *p) +invalid_arguments_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -14401,7 +14401,7 @@ incorrect_arguments_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> incorrect_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' '*'")); + D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' '*'")); Token * _literal; Token * _literal_1; expr_ty args_var; @@ -14413,7 +14413,7 @@ incorrect_arguments_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 16)) // token='*' ) { - D(fprintf(stderr, "%*c+ incorrect_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' '*'")); + D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' '*'")); _res = RAISE_SYNTAX_ERROR ( "iterable argument unpacking follows keyword argument unpacking" ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -14423,7 +14423,7 @@ incorrect_arguments_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s incorrect_arguments[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s invalid_arguments[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ',' '*'")); } { // expression for_if_clauses ',' [args | expression for_if_clauses] @@ -14431,7 +14431,7 @@ incorrect_arguments_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> incorrect_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); + D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); Token * _literal; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -14447,7 +14447,7 @@ incorrect_arguments_rule(Parser *p) (_opt_var = _tmp_127_rule(p), 1) // [args | expression for_if_clauses] ) { - D(fprintf(stderr, "%*c+ incorrect_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); + D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "Generator expression must be parenthesized" ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -14457,7 +14457,7 @@ incorrect_arguments_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s incorrect_arguments[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s invalid_arguments[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); } { // args for_if_clauses @@ -14465,7 +14465,7 @@ incorrect_arguments_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> incorrect_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args for_if_clauses")); + D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args for_if_clauses")); expr_ty a; asdl_comprehension_seq* for_if_clauses_var; if ( @@ -14474,7 +14474,7 @@ incorrect_arguments_rule(Parser *p) (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses ) { - D(fprintf(stderr, "%*c+ incorrect_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args for_if_clauses")); + D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args for_if_clauses")); _res = _PyPegen_nonparen_genexp_in_call ( p , a ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -14484,7 +14484,7 @@ incorrect_arguments_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s incorrect_arguments[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s invalid_arguments[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args for_if_clauses")); } { // args ',' expression for_if_clauses @@ -14492,7 +14492,7 @@ incorrect_arguments_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> incorrect_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' expression for_if_clauses")); + D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' expression for_if_clauses")); Token * _literal; expr_ty a; expr_ty args_var; @@ -14507,7 +14507,7 @@ incorrect_arguments_rule(Parser *p) (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses ) { - D(fprintf(stderr, "%*c+ incorrect_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' expression for_if_clauses")); + D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' expression for_if_clauses")); _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "Generator expression must be parenthesized" ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -14517,7 +14517,7 @@ incorrect_arguments_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s incorrect_arguments[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s invalid_arguments[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ',' expression for_if_clauses")); } { // args ',' args @@ -14525,7 +14525,7 @@ incorrect_arguments_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> incorrect_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' args")); + D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' args")); Token * _literal; expr_ty a; expr_ty args_var; @@ -14537,7 +14537,7 @@ incorrect_arguments_rule(Parser *p) (args_var = args_rule(p)) // args ) { - D(fprintf(stderr, "%*c+ incorrect_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' args")); + D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' args")); _res = _PyPegen_arguments_parsing_error ( p , a ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -14547,7 +14547,7 @@ incorrect_arguments_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s incorrect_arguments[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s invalid_arguments[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ',' args")); } _res = NULL; diff --git a/Parser/pegen.c b/Parser/pegen.c index c7343f7f047c39..827d4dace1fc33 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -1102,15 +1102,28 @@ _PyPegen_Parser_New(struct tok_state *tok, int start_rule, int flags, p->feature_version = feature_version; p->known_err_token = NULL; p->level = 0; + p->call_invalid_rules = 0; return p; } +static void +reset_parser_state(Parser *p) +{ + for (int i = 0; i < p->fill; i++) { + p->tokens[i]->memo = NULL; + } + p->mark = 0; + p->call_invalid_rules = 1; +} + void * _PyPegen_run_parser(Parser *p) { void *res = _PyPegen_parse(p); if (res == NULL) { + reset_parser_state(p); + _PyPegen_parse(p); if (PyErr_Occurred()) { return NULL; } diff --git a/Parser/pegen.h b/Parser/pegen.h index 9a280ae240a24a..841f1e5eb43962 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -73,6 +73,7 @@ typedef struct { growable_comment_array type_ignore_comments; Token *known_err_token; int level; + int call_invalid_rules; } Parser; typedef struct { diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index 1a814aad11cccd..52bdb844e6bdd6 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -736,7 +736,10 @@ def handle_alt_loop(self, node: Alt, is_gather: bool, rulename: Optional[str]) - def visit_Alt( self, node: Alt, is_loop: bool, is_gather: bool, rulename: Optional[str] ) -> None: - self.print(f"{{ // {node}") + if len(node.items) == 1 and str(node.items[0]).startswith('invalid_'): + self.print(f"if (p->call_invalid_rules) {{ // {node}") + else: + self.print(f"{{ // {node}") with self.indent(): self._check_for_errors() node_str = str(node).replace('"', '\\"') From 41ebafbd4bed5f5f261e834e11e51e1a13b30766 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 27 Oct 2020 00:00:03 +0100 Subject: [PATCH 0393/1261] bpo-42161: Add _PyLong_GetZero() and _PyLong_GetOne() (GH-22993) Add _PyLong_GetZero() and _PyLong_GetOne() functions and a new internal pycore_long.h header file. Python cannot be built without small integer singletons anymore. --- Include/internal/pycore_interp.h | 7 +++-- Include/internal/pycore_long.h | 43 ++++++++++++++++++++++++++++++ Makefile.pre.in | 1 + Objects/longobject.c | 37 ++++++++++--------------- PCbuild/pythoncore.vcxproj | 1 + PCbuild/pythoncore.vcxproj.filters | 3 +++ 6 files changed, 67 insertions(+), 25 deletions(-) create mode 100644 Include/internal/pycore_long.h diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 538aa5a653fbfc..eee369a44bfc72 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -163,6 +163,11 @@ struct _Py_exc_state { #define _PY_NSMALLPOSINTS 257 #define _PY_NSMALLNEGINTS 5 +// _PyLong_GetZero() and _PyLong_GetOne() must always be available +#if _PY_NSMALLPOSINTS < 2 +# error "_PY_NSMALLPOSINTS must be greater than 1" +#endif + // The PyInterpreterState typedef is in Include/pystate.h. struct _is { @@ -233,14 +238,12 @@ struct _is { PyObject *audit_hooks; -#if _PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS > 0 /* Small integers are preallocated in this array so that they can be shared. The integers that are preallocated are those in the range -_PY_NSMALLNEGINTS (inclusive) to _PY_NSMALLPOSINTS (not inclusive). */ PyLongObject* small_ints[_PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS]; -#endif struct _Py_bytes_state bytes; struct _Py_unicode_state unicode; struct _Py_float_state float_state; diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h new file mode 100644 index 00000000000000..ec95786531c850 --- /dev/null +++ b/Include/internal/pycore_long.h @@ -0,0 +1,43 @@ +#ifndef Py_INTERNAL_LONG_H +#define Py_INTERNAL_LONG_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_interp.h" // PyInterpreterState.small_ints +#include "pycore_pystate.h" // _PyThreadState_GET() + +// Don't call this function but _PyLong_GetZero() and _PyLong_GetOne() +static inline PyObject* __PyLong_GetSmallInt_internal(int value) +{ + PyThreadState *tstate = _PyThreadState_GET(); +#ifdef Py_DEBUG + _Py_EnsureTstateNotNULL(tstate); +#endif + assert(-_PY_NSMALLNEGINTS <= value && value < _PY_NSMALLPOSINTS); + size_t index = _PY_NSMALLNEGINTS + value; + PyObject *obj = (PyObject*)tstate->interp->small_ints[index]; + // _PyLong_GetZero() and _PyLong_GetOne() must not be called + // before _PyLong_Init() nor after _PyLong_Fini() + assert(obj != NULL); + return obj; +} + +// Return a borrowed reference to the zero singleton. +// The function cannot return NULL. +static inline PyObject* _PyLong_GetZero(void) +{ return __PyLong_GetSmallInt_internal(0); } + +// Return a borrowed reference to the one singleton. +// The function cannot return NULL. +static inline PyObject* _PyLong_GetOne(void) +{ return __PyLong_GetSmallInt_internal(1); } + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_LONG_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index fe226ce45d8e9c..31f61f3d5b836c 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1117,6 +1117,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_initconfig.h \ $(srcdir)/Include/internal/pycore_interp.h \ $(srcdir)/Include/internal/pycore_list.h \ + $(srcdir)/Include/internal/pycore_long.h \ $(srcdir)/Include/internal/pycore_object.h \ $(srcdir)/Include/internal/pycore_pathconfig.h \ $(srcdir)/Include/internal/pycore_pyerrors.h \ diff --git a/Objects/longobject.c b/Objects/longobject.c index 92514d4154e2cb..ae63eba1345040 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5,6 +5,7 @@ #include "Python.h" #include "pycore_bitutils.h" // _Py_popcount32() #include "pycore_interp.h" // _PY_NSMALLPOSINTS +#include "pycore_long.h" // __PyLong_GetSmallInt_internal() #include "pycore_object.h" // _PyObject_InitVar() #include "pycore_pystate.h" // _Py_IsMainInterpreter() #include "longintrepr.h" @@ -19,8 +20,8 @@ class int "PyObject *" "&PyLong_Type" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=ec0275e3422a36e3]*/ -#define NSMALLPOSINTS _PY_NSMALLPOSINTS #define NSMALLNEGINTS _PY_NSMALLNEGINTS +#define NSMALLPOSINTS _PY_NSMALLPOSINTS _Py_IDENTIFIER(little); _Py_IDENTIFIER(big); @@ -34,7 +35,6 @@ _Py_IDENTIFIER(big); PyObject *_PyLong_Zero = NULL; PyObject *_PyLong_One = NULL; -#if NSMALLNEGINTS + NSMALLPOSINTS > 0 #define IS_SMALL_INT(ival) (-NSMALLNEGINTS <= (ival) && (ival) < NSMALLPOSINTS) #define IS_SMALL_UINT(ival) ((ival) < NSMALLPOSINTS) @@ -42,8 +42,7 @@ static PyObject * get_small_int(sdigit ival) { assert(IS_SMALL_INT(ival)); - PyInterpreterState *interp = _PyInterpreterState_GET(); - PyObject *v = (PyObject*)interp->small_ints[ival + NSMALLNEGINTS]; + PyObject *v = __PyLong_GetSmallInt_internal(ival); Py_INCREF(v); return v; } @@ -60,12 +59,6 @@ maybe_small_long(PyLongObject *v) } return v; } -#else -#define IS_SMALL_INT(ival) 0 -#define IS_SMALL_UINT(ival) 0 -#define get_small_int(ival) (Py_UNREACHABLE(), NULL) -#define maybe_small_long(val) (val) -#endif /* If a freshly-allocated int is already shared, it must be a small integer, so negating it must go to PyLong_FromLong */ @@ -2559,8 +2552,9 @@ long_divrem(PyLongObject *a, PyLongObject *b, if (*prem == NULL) { return -1; } - Py_INCREF(_PyLong_Zero); - *pdiv = (PyLongObject*)_PyLong_Zero; + PyObject *zero = _PyLong_GetZero(); + Py_INCREF(zero); + *pdiv = (PyLongObject*)zero; return 0; } if (size_b == 1) { @@ -3669,7 +3663,7 @@ l_divmod(PyLongObject *v, PyLongObject *w, Py_DECREF(div); return -1; } - temp = (PyLongObject *) long_sub(div, (PyLongObject *)_PyLong_One); + temp = (PyLongObject *) long_sub(div, (PyLongObject *)_PyLong_GetOne()); if (temp == NULL) { Py_DECREF(mod); Py_DECREF(div); @@ -4078,7 +4072,7 @@ long_invmod(PyLongObject *a, PyLongObject *n) Py_DECREF(c); Py_DECREF(n); - if (long_compare(a, (PyLongObject *)_PyLong_One)) { + if (long_compare(a, (PyLongObject *)_PyLong_GetOne())) { /* a != 1; we don't have an inverse. */ Py_DECREF(a); Py_DECREF(b); @@ -4313,7 +4307,7 @@ long_invert(PyLongObject *v) PyLongObject *x; if (Py_ABS(Py_SIZE(v)) <=1) return PyLong_FromLong(-(MEDIUM_VALUE(v)+1)); - x = (PyLongObject *) long_add(v, (PyLongObject *)_PyLong_One); + x = (PyLongObject *) long_add(v, (PyLongObject *)_PyLong_GetOne()); if (x == NULL) return NULL; _PyLong_Negate(&x); @@ -5105,7 +5099,8 @@ _PyLong_DivmodNear(PyObject *a, PyObject *b) /* compare twice the remainder with the divisor, to see if we need to adjust the quotient and remainder */ - twice_rem = long_lshift((PyObject *)rem, _PyLong_One); + PyObject *one = _PyLong_GetOne(); // borrowed reference + twice_rem = long_lshift((PyObject *)rem, one); if (twice_rem == NULL) goto error; if (quo_is_neg) { @@ -5122,9 +5117,9 @@ _PyLong_DivmodNear(PyObject *a, PyObject *b) if ((Py_SIZE(b) < 0 ? cmp < 0 : cmp > 0) || (cmp == 0 && quo_is_odd)) { /* fix up quotient */ if (quo_is_neg) - temp = long_sub(quo, (PyLongObject *)_PyLong_One); + temp = long_sub(quo, (PyLongObject *)one); else - temp = long_add(quo, (PyLongObject *)_PyLong_One); + temp = long_add(quo, (PyLongObject *)one); Py_DECREF(quo); quo = (PyLongObject *)temp; if (quo == NULL) @@ -5406,7 +5401,7 @@ int_as_integer_ratio_impl(PyObject *self) if (numerator == NULL) { return NULL; } - ratio_tuple = PyTuple_Pack(2, numerator, _PyLong_One); + ratio_tuple = PyTuple_Pack(2, numerator, _PyLong_GetOne()); Py_DECREF(numerator); return ratio_tuple; } @@ -5712,7 +5707,6 @@ PyLong_GetInfo(void) int _PyLong_Init(PyThreadState *tstate) { -#if NSMALLNEGINTS + NSMALLPOSINTS > 0 for (Py_ssize_t i=0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { sdigit ival = (sdigit)i - NSMALLNEGINTS; int size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1); @@ -5727,7 +5721,6 @@ _PyLong_Init(PyThreadState *tstate) tstate->interp->small_ints[i] = v; } -#endif if (_Py_IsMainInterpreter(tstate)) { _PyLong_Zero = PyLong_FromLong(0); @@ -5759,9 +5752,7 @@ _PyLong_Fini(PyThreadState *tstate) Py_CLEAR(_PyLong_Zero); } -#if NSMALLNEGINTS + NSMALLPOSINTS > 0 for (Py_ssize_t i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { Py_CLEAR(tstate->interp->small_ints[i]); } -#endif } diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 600f33b2c6e3b5..18edba855d6161 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -185,6 +185,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 75b91d8ed87f94..281bce1c5f4986 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -537,6 +537,9 @@ Include\internal + + Include\internal + Include\internal From c135e20eca4a3ef87aebb21953d1fe71cc0033b1 Mon Sep 17 00:00:00 2001 From: Georges Toth Date: Tue, 27 Oct 2020 01:31:06 +0100 Subject: [PATCH 0394/1261] bpo-30681: Support invalid date format or value in email Date header (GH-22090) I am re-submitting an older PR which was abandoned but is still relevant, #10783 by @timb07. The issue being solved () is still relevant. The original PR #10783 was closed as the final request changes were not applied and since abandoned. In this new PR I have re-used the original patch plus applied both comments from the review, by @maxking and @pganssle. For reference, here is the original PR description: In email.utils.parsedate_to_datetime(), a failure to parse the date, or invalid date components (such as hour outside 0..23) raises an exception. Document this behaviour, and add tests to test_email/test_utils.py to confirm this behaviour. In email.headerregistry.DateHeader.parse(), check when parsedate_to_datetime() raises an exception and add a new defect InvalidDateDefect; preserve the invalid value as the string value of the header, but set the datetime attribute to None. Add tests to test_email/test_headerregistry.py to confirm this behaviour; also added test to test_email/test_inversion.py to confirm emails with such defective date headers round trip successfully. This pull request incorporates feedback gratefully received from @bitdancer, @brettcannon, @Mariatta and @warsaw, and replaces the earlier PR #2254. Automerge-Triggered-By: GH:warsaw --- Doc/library/email.errors.rst | 3 +++ Doc/library/email.utils.rst | 6 ++++-- Lib/email/_parseaddr.py | 2 +- Lib/email/errors.py | 3 +++ Lib/email/headerregistry.py | 9 ++++++++- Lib/email/utils.py | 5 ++++- Lib/test/test_email/test_headerregistry.py | 16 ++++++++++++++++ Lib/test/test_email/test_inversion.py | 8 ++++++++ Lib/test/test_email/test_utils.py | 10 ++++++++++ .../2020-09-04-17-33-04.bpo-30681.LR4fnY.rst | 2 ++ 10 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-04-17-33-04.bpo-30681.LR4fnY.rst diff --git a/Doc/library/email.errors.rst b/Doc/library/email.errors.rst index f4b9f52509689e..7a77640571cb1e 100644 --- a/Doc/library/email.errors.rst +++ b/Doc/library/email.errors.rst @@ -112,3 +112,6 @@ All defect classes are subclassed from :class:`email.errors.MessageDefect`. * :class:`InvalidBase64LengthDefect` -- When decoding a block of base64 encoded bytes, the number of non-padding base64 characters was invalid (1 more than a multiple of 4). The encoded block was kept as-is. + +* :class:`InvalidDateDefect` -- When decoding an invalid or unparsable date field. + The original value is kept as-is. \ No newline at end of file diff --git a/Doc/library/email.utils.rst b/Doc/library/email.utils.rst index 4d0e920eb0ad29..0e266b6a45782a 100644 --- a/Doc/library/email.utils.rst +++ b/Doc/library/email.utils.rst @@ -124,8 +124,10 @@ of the new API. .. function:: parsedate_to_datetime(date) The inverse of :func:`format_datetime`. Performs the same function as - :func:`parsedate`, but on success returns a :mod:`~datetime.datetime`. If - the input date has a timezone of ``-0000``, the ``datetime`` will be a naive + :func:`parsedate`, but on success returns a :mod:`~datetime.datetime`; + otherwise ``ValueError`` is raised if *date* contains an invalid value such + as an hour greater than 23 or a timezone offset not between -24 and 24 hours. + If the input date has a timezone of ``-0000``, the ``datetime`` will be a naive ``datetime``, and if the date is conforming to the RFCs it will represent a time in UTC but with no indication of the actual source timezone of the message the date comes from. If the input date has any other valid timezone diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py index 41ff6f8c000d57..4d27f87974b20d 100644 --- a/Lib/email/_parseaddr.py +++ b/Lib/email/_parseaddr.py @@ -65,7 +65,7 @@ def _parsedate_tz(data): """ if not data: - return + return None data = data.split() # The FWS after the comma after the day-of-week is optional, so search and # adjust for this. diff --git a/Lib/email/errors.py b/Lib/email/errors.py index d28a6800104bab..1d258c34fc9d4a 100644 --- a/Lib/email/errors.py +++ b/Lib/email/errors.py @@ -108,3 +108,6 @@ class NonASCIILocalPartDefect(HeaderDefect): """local_part contains non-ASCII characters""" # This defect only occurs during unicode parsing, not when # parsing messages decoded from binary. + +class InvalidDateDefect(HeaderDefect): + """Header has unparseable or invalid date""" diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py index 5d84fc0d82d0b0..d8613ebf24e613 100644 --- a/Lib/email/headerregistry.py +++ b/Lib/email/headerregistry.py @@ -302,7 +302,14 @@ def parse(cls, value, kwds): kwds['parse_tree'] = parser.TokenList() return if isinstance(value, str): - value = utils.parsedate_to_datetime(value) + kwds['decoded'] = value + try: + value = utils.parsedate_to_datetime(value) + except ValueError: + kwds['defects'].append(errors.InvalidDateDefect('Invalid date value or format')) + kwds['datetime'] = None + kwds['parse_tree'] = parser.TokenList() + return kwds['datetime'] = value kwds['decoded'] = utils.format_datetime(kwds['datetime']) kwds['parse_tree'] = cls.value_parser(kwds['decoded']) diff --git a/Lib/email/utils.py b/Lib/email/utils.py index 1a7719dbc4898f..a8e46a761bf922 100644 --- a/Lib/email/utils.py +++ b/Lib/email/utils.py @@ -195,7 +195,10 @@ def make_msgid(idstring=None, domain=None): def parsedate_to_datetime(data): - *dtuple, tz = _parsedate_tz(data) + parsed_date_tz = _parsedate_tz(data) + if parsed_date_tz is None: + raise ValueError('Invalid date value or format "%s"' % str(data)) + *dtuple, tz = parsed_date_tz if tz is None: return datetime.datetime(*dtuple[:6]) return datetime.datetime(*dtuple[:6], diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index 68bbc9561c4aff..59fcd932e0ec4a 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -204,6 +204,22 @@ def test_no_value_is_defect(self): self.assertEqual(len(h.defects), 1) self.assertIsInstance(h.defects[0], errors.HeaderMissingRequiredValue) + def test_invalid_date_format(self): + s = 'Not a date header' + h = self.make_header('date', s) + self.assertEqual(h, s) + self.assertIsNone(h.datetime) + self.assertEqual(len(h.defects), 1) + self.assertIsInstance(h.defects[0], errors.InvalidDateDefect) + + def test_invalid_date_value(self): + s = 'Tue, 06 Jun 2017 27:39:33 +0600' + h = self.make_header('date', s) + self.assertEqual(h, s) + self.assertIsNone(h.datetime) + self.assertEqual(len(h.defects), 1) + self.assertIsInstance(h.defects[0], errors.InvalidDateDefect) + def test_datetime_read_only(self): h = self.make_header('date', self.datestring) with self.assertRaises(AttributeError): diff --git a/Lib/test/test_email/test_inversion.py b/Lib/test/test_email/test_inversion.py index 8e8d67641b8943..7bd7f2a72067ad 100644 --- a/Lib/test/test_email/test_inversion.py +++ b/Lib/test/test_email/test_inversion.py @@ -46,6 +46,14 @@ def msg_as_input(self, msg): foo """),), + 'header_with_invalid_date': (dedent(b"""\ + Date: Tue, 06 Jun 2017 27:39:33 +0600 + From: abc@xyz.com + Subject: timezones + + How do they work even? + """),), + } payload_params = { diff --git a/Lib/test/test_email/test_utils.py b/Lib/test/test_email/test_utils.py index 4e3c3f3a195fc4..e3d3eaebc93693 100644 --- a/Lib/test/test_email/test_utils.py +++ b/Lib/test/test_email/test_utils.py @@ -48,6 +48,16 @@ def test_parsedate_to_datetime_naive(self): utils.parsedate_to_datetime(self.datestring + ' -0000'), self.naive_dt) + def test_parsedate_to_datetime_with_invalid_raises_valueerror(self): + invalid_dates = ['', + '0', + 'A Complete Waste of Time' + 'Tue, 06 Jun 2017 27:39:33 +0600', + 'Tue, 06 Jun 2017 07:39:33 +2600', + 'Tue, 06 Jun 2017 27:39:33'] + for dtstr in invalid_dates: + with self.subTest(dtstr=dtstr): + self.assertRaises(ValueError, utils.parsedate_to_datetime, dtstr) class LocaltimeTests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2020-09-04-17-33-04.bpo-30681.LR4fnY.rst b/Misc/NEWS.d/next/Library/2020-09-04-17-33-04.bpo-30681.LR4fnY.rst new file mode 100644 index 00000000000000..83830e343da66f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-04-17-33-04.bpo-30681.LR4fnY.rst @@ -0,0 +1,2 @@ +Handle exceptions caused by unparseable date headers when using email +"default" policy. Patch by Tim Bell, Georges Toth From 2f036dcab5cd4d54753187675e9bf97543bb9289 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 27 Oct 2020 02:24:34 +0100 Subject: [PATCH 0395/1261] bpo-42161: Use _PyLong_GetZero() and _PyLong_GetOne() (GH-22995) Use _PyLong_GetZero() and _PyLong_GetOne() in Objects/ and Python/ directories. --- Objects/clinic/complexobject.c.h | 4 +-- Objects/clinic/floatobject.c.h | 4 +-- Objects/complexobject.c | 9 ++++-- Objects/enumobject.c | 3 +- Objects/floatobject.c | 19 +++++++++--- Objects/rangeobject.c | 53 +++++++++++++++++++------------- Objects/sliceobject.c | 5 +-- Python/_warnings.c | 5 +-- Python/compile.c | 6 ++-- 9 files changed, 68 insertions(+), 40 deletions(-) diff --git a/Objects/clinic/complexobject.c.h b/Objects/clinic/complexobject.c.h index 4c8191fa831230..557fbf9752faf7 100644 --- a/Objects/clinic/complexobject.c.h +++ b/Objects/clinic/complexobject.c.h @@ -90,7 +90,7 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) PyObject * const *fastargs; Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; - PyObject *r = _PyLong_Zero; + PyObject *r = NULL; PyObject *i = NULL; fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 2, 0, argsbuf); @@ -113,4 +113,4 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=193a37aebaaa5f89 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=056cac3226d94967 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/floatobject.c.h b/Objects/clinic/floatobject.c.h index b7554832b5a8a2..5643f0e3ac6501 100644 --- a/Objects/clinic/floatobject.c.h +++ b/Objects/clinic/floatobject.c.h @@ -206,7 +206,7 @@ static PyObject * float_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; - PyObject *x = _PyLong_Zero; + PyObject *x = NULL; if ((type == &PyFloat_Type) && !_PyArg_NoKeywords("float", kwargs)) { @@ -387,4 +387,4 @@ float___format__(PyObject *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=25fbbe253f44e2df input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bb079c3e130e4ce6 input=a9049054013a1b77]*/ diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 5ab839a9e9423a..a481d9ad8bbaaf 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -6,6 +6,7 @@ /* Submitted by Jim Hugunin */ #include "Python.h" +#include "pycore_long.h" // _PyLong_GetZero() #include "pycore_object.h" // _PyObject_Init() #include "structmember.h" // PyMemberDef @@ -870,7 +871,7 @@ complex_subtype_from_string(PyTypeObject *type, PyObject *v) /*[clinic input] @classmethod complex.__new__ as complex_new - real as r: object(c_default="_PyLong_Zero") = 0 + real as r: object(c_default="NULL") = 0 imag as i: object(c_default="NULL") = 0 Create a complex number from a real part and an optional imaginary part. @@ -880,7 +881,7 @@ This is equivalent to (real + imag*1j) where imag defaults to 0. static PyObject * complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) -/*[clinic end generated code: output=b6c7dd577b537dc1 input=6f6b0bedba29bcb5]*/ +/*[clinic end generated code: output=b6c7dd577b537dc1 input=f4c667f2596d4fd1]*/ { PyObject *tmp; PyNumberMethods *nbr, *nbi = NULL; @@ -889,6 +890,10 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) int cr_is_complex = 0; int ci_is_complex = 0; + if (r == NULL) { + r = _PyLong_GetZero(); + } + /* Special-case for a single argument when type(arg) is complex. */ if (PyComplex_CheckExact(r) && i == NULL && type == &PyComplex_Type) { diff --git a/Objects/enumobject.c b/Objects/enumobject.c index 9d8449bb30f2a3..8b5e7d3a3c6dd5 100644 --- a/Objects/enumobject.c +++ b/Objects/enumobject.c @@ -1,6 +1,7 @@ /* enumerate object */ #include "Python.h" +#include "pycore_long.h" // _PyLong_GetOne() #include "clinic/enumobject.c.h" @@ -115,7 +116,7 @@ enum_next_long(enumobject *en, PyObject* next_item) } next_index = en->en_longindex; assert(next_index != NULL); - stepped_up = PyNumber_Add(next_index, _PyLong_One); + stepped_up = PyNumber_Add(next_index, _PyLong_GetOne()); if (stepped_up == NULL) { Py_DECREF(next_item); return NULL; diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 828bde18df70ca..1550b2eedc862c 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -6,6 +6,7 @@ #include "Python.h" #include "pycore_dtoa.h" // _Py_dg_dtoa() #include "pycore_interp.h" // _PyInterpreterState.float_state +#include "pycore_long.h" // _PyLong_GetOne() #include "pycore_object.h" // _PyObject_Init() #include "pycore_pystate.h" // _PyInterpreterState_GET() @@ -504,7 +505,7 @@ float_richcompare(PyObject *v, PyObject *w, int op) Py_DECREF(vv); vv = temp; - temp = PyNumber_Or(vv, _PyLong_One); + temp = PyNumber_Or(vv, _PyLong_GetOne()); if (temp == NULL) goto Error; Py_DECREF(vv); @@ -1605,7 +1606,7 @@ float_subtype_new(PyTypeObject *type, PyObject *x); /*[clinic input] @classmethod float.__new__ as float_new - x: object(c_default="_PyLong_Zero") = 0 + x: object(c_default="NULL") = 0 / Convert a string or number to a floating point number, if possible. @@ -1613,10 +1614,18 @@ Convert a string or number to a floating point number, if possible. static PyObject * float_new_impl(PyTypeObject *type, PyObject *x) -/*[clinic end generated code: output=ccf1e8dc460ba6ba input=540ee77c204ff87a]*/ +/*[clinic end generated code: output=ccf1e8dc460ba6ba input=f43661b7de03e9d8]*/ { - if (type != &PyFloat_Type) + if (type != &PyFloat_Type) { + if (x == NULL) { + x = _PyLong_GetZero(); + } return float_subtype_new(type, x); /* Wimp out */ + } + + if (x == NULL) { + return PyFloat_FromDouble(0.0); + } /* If it's a string, but not a string subclass, use PyFloat_FromString. */ if (PyUnicode_CheckExact(x)) @@ -1662,7 +1671,7 @@ float_vectorcall(PyObject *type, PyObject * const*args, return NULL; } - PyObject *x = nargs >= 1 ? args[0] : _PyLong_Zero; + PyObject *x = nargs >= 1 ? args[0] : NULL; return float_new_impl((PyTypeObject *)type, x); } diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index babf55b108b9ab..787d1138009a0c 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -2,6 +2,7 @@ #include "Python.h" #include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_long.h" // _PyLong_GetZero() #include "pycore_tuple.h" // _PyTuple_ITEMS() #include "structmember.h" // PyMemberDef @@ -105,10 +106,10 @@ range_from_array(PyTypeObject *type, PyObject *const *args, Py_ssize_t num_args) if (!stop) { return NULL; } - Py_INCREF(_PyLong_Zero); - start = _PyLong_Zero; - Py_INCREF(_PyLong_One); - step = _PyLong_One; + start = _PyLong_GetZero(); + Py_INCREF(start); + step = _PyLong_GetOne(); + Py_INCREF(step); break; case 0: PyErr_SetString(PyExc_TypeError, @@ -190,7 +191,10 @@ compute_range_length(PyObject *start, PyObject *stop, PyObject *step) PyObject *tmp1 = NULL, *tmp2 = NULL, *result; /* holds sub-expression evaluations */ - cmp_result = PyObject_RichCompareBool(step, _PyLong_Zero, Py_GT); + PyObject *zero = _PyLong_GetZero(); // borrowed reference + PyObject *one = _PyLong_GetOne(); // borrowed reference + + cmp_result = PyObject_RichCompareBool(step, zero, Py_GT); if (cmp_result == -1) return NULL; @@ -212,19 +216,21 @@ compute_range_length(PyObject *start, PyObject *stop, PyObject *step) Py_DECREF(step); if (cmp_result < 0) return NULL; - return PyLong_FromLong(0); + result = zero; + Py_INCREF(result); + return result; } if ((tmp1 = PyNumber_Subtract(hi, lo)) == NULL) goto Fail; - if ((diff = PyNumber_Subtract(tmp1, _PyLong_One)) == NULL) + if ((diff = PyNumber_Subtract(tmp1, one)) == NULL) goto Fail; if ((tmp2 = PyNumber_FloorDivide(diff, step)) == NULL) goto Fail; - if ((result = PyNumber_Add(tmp2, _PyLong_One)) == NULL) + if ((result = PyNumber_Add(tmp2, one)) == NULL) goto Fail; Py_DECREF(tmp2); @@ -254,7 +260,7 @@ compute_item(rangeobject *r, PyObject *i) /* PyLong equivalent to: * return r->start + (i * r->step) */ - if (r->step == _PyLong_One) { + if (r->step == _PyLong_GetOne()) { result = PyNumber_Add(r->start, i); } else { @@ -271,6 +277,7 @@ compute_item(rangeobject *r, PyObject *i) static PyObject * compute_range_item(rangeobject *r, PyObject *arg) { + PyObject *zero = _PyLong_GetZero(); // borrowed reference int cmp_result; PyObject *i, *result; @@ -281,7 +288,7 @@ compute_range_item(rangeobject *r, PyObject *arg) * i = arg * } */ - cmp_result = PyObject_RichCompareBool(arg, _PyLong_Zero, Py_LT); + cmp_result = PyObject_RichCompareBool(arg, zero, Py_LT); if (cmp_result == -1) { return NULL; } @@ -300,7 +307,7 @@ compute_range_item(rangeobject *r, PyObject *arg) * * } */ - cmp_result = PyObject_RichCompareBool(i, _PyLong_Zero, Py_LT); + cmp_result = PyObject_RichCompareBool(i, zero, Py_LT); if (cmp_result == 0) { cmp_result = PyObject_RichCompareBool(i, r->length, Py_GE); } @@ -375,6 +382,7 @@ compute_slice(rangeobject *r, PyObject *_slice) static int range_contains_long(rangeobject *r, PyObject *ob) { + PyObject *zero = _PyLong_GetZero(); // borrowed reference int cmp1, cmp2, cmp3; PyObject *tmp1 = NULL; PyObject *tmp2 = NULL; @@ -382,7 +390,7 @@ range_contains_long(rangeobject *r, PyObject *ob) /* Check if the value can possibly be in the range. */ - cmp1 = PyObject_RichCompareBool(r->step, _PyLong_Zero, Py_GT); + cmp1 = PyObject_RichCompareBool(r->step, zero, Py_GT); if (cmp1 == -1) goto end; if (cmp1 == 1) { /* positive steps: start <= ob < stop */ @@ -409,7 +417,7 @@ range_contains_long(rangeobject *r, PyObject *ob) if (tmp2 == NULL) goto end; /* result = ((int(ob) - start) % step) == 0 */ - result = PyObject_RichCompareBool(tmp2, _PyLong_Zero, Py_EQ); + result = PyObject_RichCompareBool(tmp2, zero, Py_EQ); end: Py_XDECREF(tmp1); Py_XDECREF(tmp2); @@ -460,7 +468,7 @@ range_equals(rangeobject *r0, rangeobject *r1) /* Return False or error to the caller. */ if (cmp_result != 1) return cmp_result; - cmp_result = PyObject_RichCompareBool(r0->length, _PyLong_One, Py_EQ); + cmp_result = PyObject_RichCompareBool(r0->length, _PyLong_GetOne(), Py_EQ); /* Return True or error to the caller. */ if (cmp_result != 0) return cmp_result; @@ -529,7 +537,7 @@ range_hash(rangeobject *r) else { Py_INCREF(r->start); PyTuple_SET_ITEM(t, 1, r->start); - cmp_result = PyObject_RichCompareBool(r->length, _PyLong_One, Py_EQ); + cmp_result = PyObject_RichCompareBool(r->length, _PyLong_GetOne(), Py_EQ); if (cmp_result == -1) goto end; if (cmp_result == 1) { @@ -587,7 +595,7 @@ range_index(rangeobject *r, PyObject *ob) return NULL; } - if (r->step == _PyLong_One) { + if (r->step == _PyLong_GetOne()) { return idx; } @@ -974,14 +982,15 @@ longrangeiter_reduce(longrangeiterobject *r, PyObject *Py_UNUSED(ignored)) static PyObject * longrangeiter_setstate(longrangeiterobject *r, PyObject *state) { + PyObject *zero = _PyLong_GetZero(); // borrowed reference int cmp; /* clip the value */ - cmp = PyObject_RichCompareBool(state, _PyLong_Zero, Py_LT); + cmp = PyObject_RichCompareBool(state, zero, Py_LT); if (cmp < 0) return NULL; if (cmp > 0) { - state = _PyLong_Zero; + state = zero; } else { cmp = PyObject_RichCompareBool(r->len, state, Py_LT); @@ -1022,7 +1031,7 @@ longrangeiter_next(longrangeiterobject *r) if (PyObject_RichCompareBool(r->index, r->len, Py_LT) != 1) return NULL; - new_index = PyNumber_Add(r->index, _PyLong_One); + new_index = PyNumber_Add(r->index, _PyLong_GetOne()); if (!new_index) return NULL; @@ -1119,7 +1128,7 @@ range_iter(PyObject *seq) it->start = r->start; it->step = r->step; it->len = r->length; - it->index = _PyLong_Zero; + it->index = _PyLong_GetZero(); Py_INCREF(it->start); Py_INCREF(it->step); Py_INCREF(it->len); @@ -1207,7 +1216,7 @@ range_reverse(PyObject *seq, PyObject *Py_UNUSED(ignored)) it->len = range->length; Py_INCREF(it->len); - diff = PyNumber_Subtract(it->len, _PyLong_One); + diff = PyNumber_Subtract(it->len, _PyLong_GetOne()); if (!diff) goto create_failure; @@ -1226,7 +1235,7 @@ range_reverse(PyObject *seq, PyObject *Py_UNUSED(ignored)) if (!it->step) goto create_failure; - it->index = _PyLong_Zero; + it->index = _PyLong_GetZero(); Py_INCREF(it->index); return (PyObject *)it; diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index e8af623142b848..02ba033a62a494 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -15,6 +15,7 @@ this type and there is exactly one in existence. #include "Python.h" #include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_long.h" // _PyLong_GetZero() #include "pycore_object.h" // _PyObject_GC_TRACK() #include "structmember.h" // PyMemberDef @@ -388,7 +389,7 @@ _PySlice_GetLongIndices(PySliceObject *self, PyObject *length, /* Convert step to an integer; raise for zero step. */ if (self->step == Py_None) { - step = _PyLong_One; + step = _PyLong_GetOne(); Py_INCREF(step); step_is_negative = 0; } @@ -417,7 +418,7 @@ _PySlice_GetLongIndices(PySliceObject *self, PyObject *length, goto error; } else { - lower = _PyLong_Zero; + lower = _PyLong_GetZero(); Py_INCREF(lower); upper = length; Py_INCREF(upper); diff --git a/Python/_warnings.c b/Python/_warnings.c index 86bbfa1c8db86c..271cd47f4eee62 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -1,6 +1,7 @@ #include "Python.h" #include "pycore_initconfig.h" #include "pycore_interp.h" // PyInterpreterState.warnings +#include "pycore_long.h" // _PyLong_GetZero() #include "pycore_pyerrors.h" #include "pycore_pystate.h" // _PyThreadState_GET() #include "frameobject.h" // PyFrame_GetBack() @@ -73,7 +74,7 @@ create_filter(PyObject *category, _Py_Identifier *id, const char *modname) /* This assumes the line number is zero for now. */ return PyTuple_Pack(5, action_str, Py_None, - category, modname_obj, _PyLong_Zero); + category, modname_obj, _PyLong_GetZero()); } #endif @@ -472,7 +473,7 @@ update_registry(PyObject *registry, PyObject *text, PyObject *category, int rc; if (add_zero) - altkey = PyTuple_Pack(3, text, category, _PyLong_Zero); + altkey = PyTuple_Pack(3, text, category, _PyLong_GetZero()); else altkey = PyTuple_Pack(2, text, category); diff --git a/Python/compile.c b/Python/compile.c index a0089b2d6dc186..15a9046065b5df 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -22,6 +22,7 @@ */ #include "Python.h" +#include "pycore_long.h" // _PyLong_GetZero() #include "Python-ast.h" #include "ast.h" @@ -603,7 +604,7 @@ compiler_enter_scope(struct compiler *c, identifier name, compiler_unit_free(u); return 0; } - res = PyDict_SetItem(u->u_cellvars, name, _PyLong_Zero); + res = PyDict_SetItem(u->u_cellvars, name, _PyLong_GetZero()); if (res < 0) { compiler_unit_free(u); return 0; @@ -3218,11 +3219,12 @@ compiler_import(struct compiler *c, stmt_ty s) */ Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names); + PyObject *zero = _PyLong_GetZero(); // borrowed reference for (i = 0; i < n; i++) { alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i); int r; - ADDOP_LOAD_CONST(c, _PyLong_Zero); + ADDOP_LOAD_CONST(c, zero); ADDOP_LOAD_CONST(c, Py_None); ADDOP_NAME(c, IMPORT_NAME, alias->name, names); From a57ec14c8afa33183def0c59482dc658c38c6dce Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 27 Oct 2020 04:36:22 +0100 Subject: [PATCH 0396/1261] bpo-42157: Rename unicodedata.ucnhash_CAPI (GH-22994) Removed the unicodedata.ucnhash_CAPI attribute which was an internal PyCapsule object. The related private _PyUnicode_Name_CAPI structure was moved to the internal C API. Rename unicodedata.ucnhash_CAPI as unicodedata._ucnhash_CAPI. --- Doc/whatsnew/3.10.rst | 7 ++++++- Include/internal/pycore_ucnhash.h | 2 +- .../next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst | 2 +- .../next/Library/2020-10-26-23-29-16.bpo-42157.4wuwTe.rst | 3 +++ Modules/unicodedata.c | 4 ++-- 5 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-26-23-29-16.bpo-42157.4wuwTe.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 2ef2b5d19e5859..b2c6d10ba8deb7 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -300,6 +300,11 @@ Removed Python 3.5. (Contributed by Berker Peksag in :issue:`31844`.) +* Removed the ``unicodedata.ucnhash_CAPI`` attribute which was an internal + PyCapsule object. The related private ``_PyUnicode_Name_CAPI`` structure was + moved to the internal C API. + (Contributed by Victor Stinner in :issue:`42157`.) + Porting to Python 3.10 ====================== @@ -408,7 +413,7 @@ Porting to Python 3.10 (Contributed by Inada Naoki in :issue:`36346`.) * The private ``_PyUnicode_Name_CAPI`` structure of the PyCapsule API - ``unicodedata.ucnhash_CAPI`` moves to the internal C API. + ``unicodedata.ucnhash_CAPI`` has been moved to the internal C API. (Contributed by Victor Stinner in :issue:`42157`.) Deprecated diff --git a/Include/internal/pycore_ucnhash.h b/Include/internal/pycore_ucnhash.h index 5e7c035f81d2ac..187dd68e7347ff 100644 --- a/Include/internal/pycore_ucnhash.h +++ b/Include/internal/pycore_ucnhash.h @@ -11,7 +11,7 @@ extern "C" { /* revised ucnhash CAPI interface (exported through a "wrapper") */ -#define PyUnicodeData_CAPSULE_NAME "unicodedata.ucnhash_CAPI" +#define PyUnicodeData_CAPSULE_NAME "unicodedata._ucnhash_CAPI" typedef struct { diff --git a/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst b/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst index 1f05186d9e0ef5..65a56188fa0ad0 100644 --- a/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst +++ b/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst @@ -1,3 +1,3 @@ The private ``_PyUnicode_Name_CAPI`` structure of the PyCapsule API -``unicodedata.ucnhash_CAPI`` moves to the internal C API. +``unicodedata.ucnhash_CAPI`` has been moved to the internal C API. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2020-10-26-23-29-16.bpo-42157.4wuwTe.rst b/Misc/NEWS.d/next/Library/2020-10-26-23-29-16.bpo-42157.4wuwTe.rst new file mode 100644 index 00000000000000..39365677ecd19a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-26-23-29-16.bpo-42157.4wuwTe.rst @@ -0,0 +1,3 @@ +Removed the ``unicodedata.ucnhash_CAPI`` attribute which was an internal +PyCapsule object. The related private ``_PyUnicode_Name_CAPI`` structure was +moved to the internal C API. Patch by Victor Stinner. diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index 18b0a9af9d21c4..fcf801dc9e4adc 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1463,7 +1463,7 @@ unicodedata_exec(PyObject *module) return -1; } - /* Previous versions */ + // Unicode database version 3.2.0 used by the IDNA encoding PyObject *v; v = new_previous_version(ucd_type, "3.2.0", get_change_3_2_0, normalization_3_2_0); @@ -1482,7 +1482,7 @@ unicodedata_exec(PyObject *module) if (v == NULL) { return -1; } - if (PyModule_AddObject(module, "ucnhash_CAPI", v) < 0) { + if (PyModule_AddObject(module, "_ucnhash_CAPI", v) < 0) { Py_DECREF(v); return -1; } From afabbca12cfeff597af4eceef38a682017aaae58 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 27 Oct 2020 04:41:30 +0100 Subject: [PATCH 0397/1261] bpo-41474, Makefile: Add dependency on cpython/frameobject.h (GH-22999) Co-Authored-By: Skip Montanaro --- Makefile.pre.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.pre.in b/Makefile.pre.in index 31f61f3d5b836c..5b6c0b9b62d334 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1081,6 +1081,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/dictobject.h \ $(srcdir)/Include/cpython/fileobject.h \ $(srcdir)/Include/cpython/fileutils.h \ + $(srcdir)/Include/cpython/frameobject.h \ $(srcdir)/Include/cpython/import.h \ $(srcdir)/Include/cpython/initconfig.h \ $(srcdir)/Include/cpython/interpreteridobject.h \ From bc0e032646fc4877bd6e80faf8ee5d761a792354 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 27 Oct 2020 17:12:53 +0100 Subject: [PATCH 0398/1261] bpo-42161: Modules/ uses _PyLong_GetZero() and _PyLong_GetOne() (GH-22998) Use _PyLong_GetZero() and _PyLong_GetOne() in Modules/ directory. _cursesmodule.c and zoneinfo.c are now built with Py_BUILD_CORE_MODULE macro defined. --- Modules/Setup | 4 ++-- Modules/_collectionsmodule.c | 11 +++++++---- Modules/_ctypes/_ctypes.c | 7 +++++-- Modules/_cursesmodule.c | 7 ++++--- Modules/_datetimemodule.c | 5 +++-- Modules/_functoolsmodule.c | 3 ++- Modules/_io/iobase.c | 3 ++- Modules/_io/textio.c | 17 ++++++++++------- Modules/_sre.c | 3 ++- Modules/_zoneinfo.c | 3 ++- Modules/clinic/_cursesmodule.c.h | 6 +++--- Modules/itertoolsmodule.c | 8 +++++--- Modules/mathmodule.c | 11 ++++++----- setup.py | 5 ++++- 14 files changed, 57 insertions(+), 36 deletions(-) diff --git a/Modules/Setup b/Modules/Setup index 6f9bb813cef273..a5fbaf6381be5d 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -178,7 +178,7 @@ _symtable symtablemodule.c #_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator #_pickle _pickle.c # pickle accelerator #_datetime _datetimemodule.c # datetime accelerator -#_zoneinfo _zoneinfo.c # zoneinfo accelerator +#_zoneinfo _zoneinfo.c -DPy_BUILD_CORE_MODULE # zoneinfo accelerator #_bisect _bisectmodule.c # Bisection algorithms #_heapq _heapqmodule.c -DPy_BUILD_CORE_MODULE # Heap queue algorithm #_asyncio _asynciomodule.c # Fast asyncio Future @@ -306,7 +306,7 @@ _symtable symtablemodule.c # provided by the ncurses library. e.g. on Linux, link with -lncurses # instead of -lcurses). -#_curses _cursesmodule.c -lcurses -ltermcap +#_curses _cursesmodule.c -lcurses -ltermcap -DPy_BUILD_CORE_MODULE # Wrapper for the panel library that's part of ncurses and SYSV curses. #_curses_panel _curses_panel.c -lpanel -lncurses diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 00198ff3eb7ddb..8990071f519ea2 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "pycore_long.h" // _PyLong_GetZero() #include "structmember.h" // PyMemberDef #ifdef STDC_HEADERS @@ -2323,10 +2324,10 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping, if (oldval == NULL) { if (PyErr_Occurred()) goto done; - if (_PyDict_SetItem_KnownHash(mapping, key, _PyLong_One, hash) < 0) + if (_PyDict_SetItem_KnownHash(mapping, key, _PyLong_GetOne(), hash) < 0) goto done; } else { - newval = PyNumber_Add(oldval, _PyLong_One); + newval = PyNumber_Add(oldval, _PyLong_GetOne()); if (newval == NULL) goto done; if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0) @@ -2340,14 +2341,16 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping, if (bound_get == NULL) goto done; + PyObject *zero = _PyLong_GetZero(); // borrowed reference + PyObject *one = _PyLong_GetOne(); // borrowed reference while (1) { key = PyIter_Next(it); if (key == NULL) break; - oldval = PyObject_CallFunctionObjArgs(bound_get, key, _PyLong_Zero, NULL); + oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL); if (oldval == NULL) break; - newval = PyNumber_Add(oldval, _PyLong_One); + newval = PyNumber_Add(oldval, one); Py_DECREF(oldval); if (newval == NULL) break; diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 9be90eb27bdf22..8d5594c62c4170 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -116,6 +116,8 @@ bytes(cdata) #endif #include "ctypes.h" +#include "pycore_long.h" // _PyLong_GetZero() + PyObject *PyExc_ArgError = NULL; /* This dict maps ctypes types to POINTER types */ @@ -3929,8 +3931,9 @@ _build_callargs(PyCFuncPtrObject *self, PyObject *argtypes, case PARAMFLAG_FIN | PARAMFLAG_FLCID: /* ['in', 'lcid'] parameter. Always taken from defval, if given, else the integer 0. */ - if (defval == NULL) - defval = _PyLong_Zero; + if (defval == NULL) { + defval = _PyLong_GetZero(); + } Py_INCREF(defval); PyTuple_SET_ITEM(callargs, i, defval); break; diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 34331017f85c7b..a59858632e76f2 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -103,6 +103,7 @@ static const char PyCursesVersion[] = "2.2"; #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_long.h" // _PyLong_GetZero() #ifdef __hpux @@ -1094,9 +1095,9 @@ _curses_window_border_impl(PyCursesWindowObject *self, PyObject *ls, _curses.window.box [ - verch: object(c_default="_PyLong_Zero") = 0 + verch: object(c_default="_PyLong_GetZero()") = 0 Left and right side. - horch: object(c_default="_PyLong_Zero") = 0 + horch: object(c_default="_PyLong_GetZero()") = 0 Top and bottom side. ] / @@ -1110,7 +1111,7 @@ horch. The default corner characters are always used by this function. static PyObject * _curses_window_box_impl(PyCursesWindowObject *self, int group_right_1, PyObject *verch, PyObject *horch) -/*[clinic end generated code: output=f3fcb038bb287192 input=465a121741c1efdf]*/ +/*[clinic end generated code: output=f3fcb038bb287192 input=f00435f9c8c98f60]*/ { chtype ch1 = 0, ch2 = 0; if (group_right_1) { diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 94868717e6a04c..e59f89b3d10fb0 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -8,6 +8,7 @@ #define _PY_DATETIME_IMPL #include "Python.h" +#include "pycore_long.h" // _PyLong_GetOne() #include "pycore_object.h" // _PyObject_Init() #include "datetime.h" #include "structmember.h" // PyMemberDef @@ -2448,7 +2449,7 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw) goto Done if (us) { - y = accum("microseconds", x, us, _PyLong_One, &leftover_us); + y = accum("microseconds", x, us, _PyLong_GetOne(), &leftover_us); CLEANUP; } if (ms) { @@ -2487,7 +2488,7 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw) * is odd. Note that x is odd when it's last bit is 1. The * code below uses bitwise and operation to check the last * bit. */ - temp = PyNumber_And(x, _PyLong_One); /* temp <- x & 1 */ + temp = PyNumber_And(x, _PyLong_GetOne()); /* temp <- x & 1 */ if (temp == NULL) { Py_DECREF(x); goto Done; diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index bb86fe862da6d8..9fad21fc33213c 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "pycore_long.h" // _PyLong_GetZero() #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tuple.h" // _PyTuple_ITEMS() #include "structmember.h" // PyMemberDef @@ -596,7 +597,7 @@ keyobject_richcompare(PyObject *ko, PyObject *other, int op) return NULL; } - answer = PyObject_RichCompare(res, _PyLong_Zero, op); + answer = PyObject_RichCompare(res, _PyLong_GetZero(), op); Py_DECREF(res); return answer; } diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 195862df5dc060..5b687b78176e8c 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -10,6 +10,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_long.h" // _PyLong_GetOne() #include "pycore_object.h" #include // offsetof() #include "_iomodule.h" @@ -556,7 +557,7 @@ _io__IOBase_readline_impl(PyObject *self, Py_ssize_t limit) PyObject *b; if (peek != NULL) { - PyObject *readahead = PyObject_CallOneArg(peek, _PyLong_One); + PyObject *readahead = PyObject_CallOneArg(peek, _PyLong_GetOne()); if (readahead == NULL) { /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals() when EINTR occurs so we needn't do it ourselves. */ diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index f2c72ebd516589..699b7e94c93bbf 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -9,6 +9,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_interp.h" // PyInterpreterState.fs_codec +#include "pycore_long.h" // _PyLong_GetZero() #include "pycore_object.h" #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "structmember.h" // PyMemberDef @@ -971,7 +972,7 @@ _textiowrapper_fix_encoder_state(textio *self) return -1; } - int cmp = PyObject_RichCompareBool(cookieObj, _PyLong_Zero, Py_EQ); + int cmp = PyObject_RichCompareBool(cookieObj, _PyLong_GetZero(), Py_EQ); Py_DECREF(cookieObj); if (cmp < 0) { return -1; @@ -980,7 +981,7 @@ _textiowrapper_fix_encoder_state(textio *self) if (cmp == 0) { self->encoding_start_of_stream = 0; PyObject *res = PyObject_CallMethodOneArg( - self->encoder, _PyIO_str_setstate, _PyLong_Zero); + self->encoder, _PyIO_str_setstate, _PyLong_GetZero()); if (res == NULL) { return -1; } @@ -2415,7 +2416,7 @@ _textiowrapper_encoder_reset(textio *self, int start_of_stream) } else { res = PyObject_CallMethodOneArg(self->encoder, _PyIO_str_setstate, - _PyLong_Zero); + _PyLong_GetZero()); self->encoding_start_of_stream = 0; } if (res == NULL) @@ -2459,10 +2460,12 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } + PyObject *zero = _PyLong_GetZero(); // borrowed reference + switch (whence) { case SEEK_CUR: /* seek relative to current position */ - cmp = PyObject_RichCompareBool(cookieObj, _PyLong_Zero, Py_EQ); + cmp = PyObject_RichCompareBool(cookieObj, zero, Py_EQ); if (cmp < 0) goto fail; @@ -2482,7 +2485,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) case SEEK_END: /* seek relative to end of file */ - cmp = PyObject_RichCompareBool(cookieObj, _PyLong_Zero, Py_EQ); + cmp = PyObject_RichCompareBool(cookieObj, zero, Py_EQ); if (cmp < 0) goto fail; @@ -2511,7 +2514,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; if (self->encoder) { /* If seek() == 0, we are at the start of stream, otherwise not */ - cmp = PyObject_RichCompareBool(res, _PyLong_Zero, Py_EQ); + cmp = PyObject_RichCompareBool(res, zero, Py_EQ); if (cmp < 0 || _textiowrapper_encoder_reset(self, cmp)) { Py_DECREF(res); goto fail; @@ -2529,7 +2532,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } - cmp = PyObject_RichCompareBool(cookieObj, _PyLong_Zero, Py_LT); + cmp = PyObject_RichCompareBool(cookieObj, zero, Py_LT); if (cmp < 0) goto fail; diff --git a/Modules/_sre.c b/Modules/_sre.c index 70bd8baa01e204..fbabeb7c9f3054 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -41,6 +41,7 @@ static const char copyright[] = #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_long.h" // _PyLong_GetZero() #include "structmember.h" // PyMemberDef #include "sre.h" @@ -1999,7 +2000,7 @@ match_group(MatchObject* self, PyObject* args) switch (size) { case 0: - result = match_getslice(self, _PyLong_Zero, Py_None); + result = match_getslice(self, _PyLong_GetZero(), Py_None); break; case 1: result = match_getslice(self, PyTuple_GET_ITEM(args, 0), Py_None); diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c index 76b667d1543e99..7888cf86de0a5c 100644 --- a/Modules/_zoneinfo.c +++ b/Modules/_zoneinfo.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "pycore_long.h" // _PyLong_GetOne() #include "structmember.h" #include @@ -585,7 +586,7 @@ zoneinfo_fromutc(PyObject *obj_self, PyObject *dt) } dt = NULL; - if (!PyDict_SetItemString(kwargs, "fold", _PyLong_One)) { + if (!PyDict_SetItemString(kwargs, "fold", _PyLong_GetOne())) { dt = PyObject_Call(replace, args, kwargs); } diff --git a/Modules/clinic/_cursesmodule.c.h b/Modules/clinic/_cursesmodule.c.h index c4c2b71e4cc223..34e09e443afffe 100644 --- a/Modules/clinic/_cursesmodule.c.h +++ b/Modules/clinic/_cursesmodule.c.h @@ -509,8 +509,8 @@ _curses_window_box(PyCursesWindowObject *self, PyObject *args) { PyObject *return_value = NULL; int group_right_1 = 0; - PyObject *verch = _PyLong_Zero; - PyObject *horch = _PyLong_Zero; + PyObject *verch = _PyLong_GetZero(); + PyObject *horch = _PyLong_GetZero(); switch (PyTuple_GET_SIZE(args)) { case 0: @@ -4288,4 +4288,4 @@ _curses_has_extended_color_support(PyObject *module, PyObject *Py_UNUSED(ignored #ifndef _CURSES_USE_DEFAULT_COLORS_METHODDEF #define _CURSES_USE_DEFAULT_COLORS_METHODDEF #endif /* !defined(_CURSES_USE_DEFAULT_COLORS_METHODDEF) */ -/*[clinic end generated code: output=38b2531d17f119e1 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=92bad2172fef9747 input=a9049054013a1b77]*/ diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 3809dc3843c142..ce8b4347ef220b 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -1,6 +1,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_long.h" // _PyLong_GetZero() #include "pycore_tuple.h" // _PyTuple_ITEMS() #include // offsetof() @@ -4040,13 +4041,14 @@ itertools_count_impl(PyTypeObject *type, PyObject *long_cnt, } } else { cnt = 0; - long_cnt = _PyLong_Zero; + long_cnt = _PyLong_GetZero(); } Py_INCREF(long_cnt); /* If not specified, step defaults to 1 */ - if (long_step == NULL) - long_step = _PyLong_One; + if (long_step == NULL) { + long_step = _PyLong_GetOne(); + } Py_INCREF(long_step); assert(long_cnt != NULL && long_step != NULL); diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 45b03028753a3f..86b64fb4226907 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -55,6 +55,7 @@ raised for division by zero and mod by zero. #include "Python.h" #include "pycore_bitutils.h" // _Py_bit_length() #include "pycore_dtoa.h" +#include "pycore_long.h" // _PyLong_GetZero() #include "_math.h" #include "clinic/mathmodule.c.h" @@ -850,7 +851,7 @@ math_gcd(PyObject *module, PyObject * const *args, Py_ssize_t nargs) Py_DECREF(res); return NULL; } - if (res == _PyLong_One) { + if (res == _PyLong_GetOne()) { /* Fast path: just check arguments. It is okay to use identity comparison here. */ Py_DECREF(x); @@ -923,7 +924,7 @@ math_lcm(PyObject *module, PyObject * const *args, Py_ssize_t nargs) Py_DECREF(res); return NULL; } - if (res == _PyLong_Zero) { + if (res == _PyLong_GetZero()) { /* Fast path: just check arguments. It is okay to use identity comparison here. */ Py_DECREF(x); @@ -1837,7 +1838,7 @@ math_isqrt(PyObject *module, PyObject *n) } if (a_too_large) { - Py_SETREF(a, PyNumber_Subtract(a, _PyLong_One)); + Py_SETREF(a, PyNumber_Subtract(a, _PyLong_GetOne())); } Py_DECREF(n); return a; @@ -3295,7 +3296,7 @@ math_perm_impl(PyObject *module, PyObject *n, PyObject *k) factor = n; Py_INCREF(factor); for (i = 1; i < factors; ++i) { - Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_One)); + Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_GetOne())); if (factor == NULL) { goto error; } @@ -3417,7 +3418,7 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k) factor = n; Py_INCREF(factor); for (i = 1; i < factors; ++i) { - Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_One)); + Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_GetOne())); if (factor == NULL) { goto error; } diff --git a/setup.py b/setup.py index 8a4abe5a648fd9..b3f47603f7ad69 100644 --- a/setup.py +++ b/setup.py @@ -856,7 +856,8 @@ def detect_simple_extensions(self): libraries=['m'], extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) # zoneinfo module - self.add(Extension('_zoneinfo', ['_zoneinfo.c'])), + self.add(Extension('_zoneinfo', ['_zoneinfo.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) # random number generator implemented in C self.add(Extension("_random", ["_randommodule.c"], extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) @@ -1094,6 +1095,7 @@ def detect_readline_curses(self): if curses_library.startswith('ncurses'): curses_libs = [curses_library] self.add(Extension('_curses', ['_cursesmodule.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], include_dirs=curses_includes, define_macros=curses_defines, libraries=curses_libs)) @@ -1108,6 +1110,7 @@ def detect_readline_curses(self): curses_libs = ['curses'] self.add(Extension('_curses', ['_cursesmodule.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], define_macros=curses_defines, libraries=curses_libs)) else: From fbbf2f63881390be84a0460008cf602a8973fc73 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Tue, 27 Oct 2020 13:18:57 -0300 Subject: [PATCH 0399/1261] bpo-6761: Enhance __call__ documentation (GH-7987) --- Doc/reference/datamodel.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index d92e19761a9654..c882301ad3a4af 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2168,7 +2168,7 @@ Emulating callable objects .. index:: pair: call; instance Called when the instance is "called" as a function; if this method is defined, - ``x(arg1, arg2, ...)`` is a shorthand for ``x.__call__(arg1, arg2, ...)``. + ``x(arg1, arg2, ...)`` roughly translates to ``type(x).__call__(x, arg1, ...)``. .. _sequence-types: From 43fb8d7b689f2eae16b51f371cd7b43bd864f97f Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Tue, 27 Oct 2020 20:54:20 +0200 Subject: [PATCH 0400/1261] bpo-41659: Disallow curly brace directly after primary (GH-22996) --- Grammar/python.gram | 3 + Lib/test/test_exceptions.py | 1 + Lib/test/test_syntax.py | 3 + .../2020-10-27-18-32-49.bpo-41659.d4a-8o.rst | 3 + Parser/parser.c | 401 ++++++++++-------- 5 files changed, 244 insertions(+), 167 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-27-18-32-49.bpo-41659.d4a-8o.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index 19c85accf8d9a1..b8da554b8ec998 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -475,6 +475,7 @@ await_primary[expr_ty] (memo): | AWAIT a=primary { CHECK_VERSION(expr_ty, 5, "Await expressions are", _Py_Await(a, EXTRA)) } | primary primary[expr_ty]: + | invalid_primary # must be before 'primay genexp' because of invalid_genexp | a=primary '.' b=NAME { _Py_Attribute(a, b->v.Name.id, Load, EXTRA) } | a=primary b=genexp { _Py_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } | a=primary '(' b=[arguments] ')' { @@ -682,6 +683,8 @@ invalid_del_stmt: RAISE_SYNTAX_ERROR_INVALID_TARGET(DEL_TARGETS, a) } invalid_block: | NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block") } +invalid_primary: + | primary a='{' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "invalid syntax") } invalid_comprehension: | ('[' | '(' | '{') a=starred_expression for_if_clauses { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable unpacking cannot be used in comprehension") } diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 1ec446887770ea..4dbf5fe5d5bc3a 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -208,6 +208,7 @@ def testSyntaxErrorOffset(self): check(b'Python = "\xcf\xb3\xf2\xee\xed" +', 1, 18) check('x = "a', 1, 7) check('lambda x: x = 2', 1, 1) + check('f{a + b + c}', 1, 2) # Errors thrown by compile.c check('class foo:return 1', 1, 11) diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 7c3302c1d46aeb..c25b85246b919d 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -802,6 +802,9 @@ def _check_error(self, code, errtext, else: self.fail("compile() did not raise SyntaxError") + def test_curly_brace_after_primary_raises_immediately(self): + self._check_error("f{", "invalid syntax", mode="single") + def test_assign_call(self): self._check_error("f() = 1", "assign") diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-27-18-32-49.bpo-41659.d4a-8o.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-27-18-32-49.bpo-41659.d4a-8o.rst new file mode 100644 index 00000000000000..038749a7b16c9d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-27-18-32-49.bpo-41659.d4a-8o.rst @@ -0,0 +1,3 @@ +Fix a bug in the parser, where a curly brace following a `primary` didn't fail immediately. +This led to invalid expressions like `a {b}` to throw a :exc:`SyntaxError` with a wrong offset, +or invalid expressions ending with a curly brace like `a {` to not fail immediately in the REPL. \ No newline at end of file diff --git a/Parser/parser.c b/Parser/parser.c index e438f06c9be9a0..a22cf2752d18de 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -216,173 +216,174 @@ static KeywordToken *reserved_keywords[] = { #define invalid_ann_assign_target_type 1147 #define invalid_del_stmt_type 1148 #define invalid_block_type 1149 -#define invalid_comprehension_type 1150 -#define invalid_dict_comprehension_type 1151 -#define invalid_parameters_type 1152 -#define invalid_lambda_parameters_type 1153 -#define invalid_star_etc_type 1154 -#define invalid_lambda_star_etc_type 1155 -#define invalid_double_type_comments_type 1156 -#define invalid_with_item_type 1157 -#define invalid_for_target_type 1158 -#define invalid_group_type 1159 -#define invalid_import_from_targets_type 1160 -#define _loop0_1_type 1161 -#define _loop0_2_type 1162 -#define _loop0_4_type 1163 -#define _gather_3_type 1164 -#define _loop0_6_type 1165 -#define _gather_5_type 1166 -#define _loop0_8_type 1167 -#define _gather_7_type 1168 -#define _loop0_10_type 1169 -#define _gather_9_type 1170 -#define _loop1_11_type 1171 -#define _loop0_13_type 1172 -#define _gather_12_type 1173 -#define _tmp_14_type 1174 -#define _tmp_15_type 1175 -#define _tmp_16_type 1176 -#define _tmp_17_type 1177 -#define _tmp_18_type 1178 -#define _tmp_19_type 1179 -#define _tmp_20_type 1180 -#define _tmp_21_type 1181 -#define _loop1_22_type 1182 -#define _tmp_23_type 1183 -#define _tmp_24_type 1184 -#define _loop0_26_type 1185 -#define _gather_25_type 1186 -#define _loop0_28_type 1187 -#define _gather_27_type 1188 -#define _tmp_29_type 1189 -#define _tmp_30_type 1190 -#define _loop0_31_type 1191 -#define _loop1_32_type 1192 -#define _loop0_34_type 1193 -#define _gather_33_type 1194 -#define _tmp_35_type 1195 -#define _loop0_37_type 1196 -#define _gather_36_type 1197 -#define _tmp_38_type 1198 -#define _loop0_40_type 1199 -#define _gather_39_type 1200 -#define _loop0_42_type 1201 -#define _gather_41_type 1202 -#define _loop0_44_type 1203 -#define _gather_43_type 1204 -#define _loop0_46_type 1205 -#define _gather_45_type 1206 -#define _tmp_47_type 1207 -#define _loop1_48_type 1208 -#define _tmp_49_type 1209 -#define _tmp_50_type 1210 -#define _tmp_51_type 1211 -#define _tmp_52_type 1212 -#define _tmp_53_type 1213 -#define _loop0_54_type 1214 -#define _loop0_55_type 1215 -#define _loop0_56_type 1216 -#define _loop1_57_type 1217 -#define _loop0_58_type 1218 -#define _loop1_59_type 1219 -#define _loop1_60_type 1220 -#define _loop1_61_type 1221 -#define _loop0_62_type 1222 -#define _loop1_63_type 1223 -#define _loop0_64_type 1224 -#define _loop1_65_type 1225 -#define _loop0_66_type 1226 -#define _loop1_67_type 1227 -#define _loop1_68_type 1228 -#define _tmp_69_type 1229 -#define _loop0_71_type 1230 -#define _gather_70_type 1231 -#define _loop1_72_type 1232 -#define _loop0_74_type 1233 -#define _gather_73_type 1234 -#define _loop1_75_type 1235 -#define _loop0_76_type 1236 -#define _loop0_77_type 1237 -#define _loop0_78_type 1238 -#define _loop1_79_type 1239 -#define _loop0_80_type 1240 -#define _loop1_81_type 1241 -#define _loop1_82_type 1242 -#define _loop1_83_type 1243 -#define _loop0_84_type 1244 -#define _loop1_85_type 1245 -#define _loop0_86_type 1246 -#define _loop1_87_type 1247 -#define _loop0_88_type 1248 -#define _loop1_89_type 1249 -#define _loop1_90_type 1250 -#define _loop1_91_type 1251 -#define _loop1_92_type 1252 -#define _tmp_93_type 1253 -#define _loop0_95_type 1254 -#define _gather_94_type 1255 -#define _tmp_96_type 1256 -#define _tmp_97_type 1257 -#define _tmp_98_type 1258 -#define _tmp_99_type 1259 -#define _loop1_100_type 1260 -#define _tmp_101_type 1261 -#define _tmp_102_type 1262 -#define _loop0_104_type 1263 -#define _gather_103_type 1264 -#define _loop1_105_type 1265 -#define _loop0_106_type 1266 -#define _loop0_107_type 1267 -#define _loop0_109_type 1268 -#define _gather_108_type 1269 -#define _tmp_110_type 1270 -#define _loop0_112_type 1271 -#define _gather_111_type 1272 -#define _loop0_114_type 1273 -#define _gather_113_type 1274 -#define _loop0_116_type 1275 -#define _gather_115_type 1276 -#define _loop0_118_type 1277 -#define _gather_117_type 1278 -#define _loop0_119_type 1279 -#define _loop0_121_type 1280 -#define _gather_120_type 1281 -#define _tmp_122_type 1282 -#define _loop0_124_type 1283 -#define _gather_123_type 1284 -#define _loop0_126_type 1285 -#define _gather_125_type 1286 -#define _tmp_127_type 1287 -#define _loop0_128_type 1288 -#define _loop0_129_type 1289 -#define _loop0_130_type 1290 -#define _tmp_131_type 1291 -#define _tmp_132_type 1292 -#define _loop0_133_type 1293 -#define _tmp_134_type 1294 -#define _loop0_135_type 1295 -#define _tmp_136_type 1296 -#define _tmp_137_type 1297 -#define _tmp_138_type 1298 -#define _tmp_139_type 1299 -#define _tmp_140_type 1300 -#define _tmp_141_type 1301 -#define _tmp_142_type 1302 -#define _tmp_143_type 1303 -#define _tmp_144_type 1304 -#define _tmp_145_type 1305 -#define _tmp_146_type 1306 -#define _tmp_147_type 1307 -#define _tmp_148_type 1308 -#define _tmp_149_type 1309 -#define _tmp_150_type 1310 -#define _tmp_151_type 1311 -#define _tmp_152_type 1312 -#define _loop1_153_type 1313 -#define _loop1_154_type 1314 -#define _tmp_155_type 1315 -#define _tmp_156_type 1316 +#define invalid_primary_type 1150 // Left-recursive +#define invalid_comprehension_type 1151 +#define invalid_dict_comprehension_type 1152 +#define invalid_parameters_type 1153 +#define invalid_lambda_parameters_type 1154 +#define invalid_star_etc_type 1155 +#define invalid_lambda_star_etc_type 1156 +#define invalid_double_type_comments_type 1157 +#define invalid_with_item_type 1158 +#define invalid_for_target_type 1159 +#define invalid_group_type 1160 +#define invalid_import_from_targets_type 1161 +#define _loop0_1_type 1162 +#define _loop0_2_type 1163 +#define _loop0_4_type 1164 +#define _gather_3_type 1165 +#define _loop0_6_type 1166 +#define _gather_5_type 1167 +#define _loop0_8_type 1168 +#define _gather_7_type 1169 +#define _loop0_10_type 1170 +#define _gather_9_type 1171 +#define _loop1_11_type 1172 +#define _loop0_13_type 1173 +#define _gather_12_type 1174 +#define _tmp_14_type 1175 +#define _tmp_15_type 1176 +#define _tmp_16_type 1177 +#define _tmp_17_type 1178 +#define _tmp_18_type 1179 +#define _tmp_19_type 1180 +#define _tmp_20_type 1181 +#define _tmp_21_type 1182 +#define _loop1_22_type 1183 +#define _tmp_23_type 1184 +#define _tmp_24_type 1185 +#define _loop0_26_type 1186 +#define _gather_25_type 1187 +#define _loop0_28_type 1188 +#define _gather_27_type 1189 +#define _tmp_29_type 1190 +#define _tmp_30_type 1191 +#define _loop0_31_type 1192 +#define _loop1_32_type 1193 +#define _loop0_34_type 1194 +#define _gather_33_type 1195 +#define _tmp_35_type 1196 +#define _loop0_37_type 1197 +#define _gather_36_type 1198 +#define _tmp_38_type 1199 +#define _loop0_40_type 1200 +#define _gather_39_type 1201 +#define _loop0_42_type 1202 +#define _gather_41_type 1203 +#define _loop0_44_type 1204 +#define _gather_43_type 1205 +#define _loop0_46_type 1206 +#define _gather_45_type 1207 +#define _tmp_47_type 1208 +#define _loop1_48_type 1209 +#define _tmp_49_type 1210 +#define _tmp_50_type 1211 +#define _tmp_51_type 1212 +#define _tmp_52_type 1213 +#define _tmp_53_type 1214 +#define _loop0_54_type 1215 +#define _loop0_55_type 1216 +#define _loop0_56_type 1217 +#define _loop1_57_type 1218 +#define _loop0_58_type 1219 +#define _loop1_59_type 1220 +#define _loop1_60_type 1221 +#define _loop1_61_type 1222 +#define _loop0_62_type 1223 +#define _loop1_63_type 1224 +#define _loop0_64_type 1225 +#define _loop1_65_type 1226 +#define _loop0_66_type 1227 +#define _loop1_67_type 1228 +#define _loop1_68_type 1229 +#define _tmp_69_type 1230 +#define _loop0_71_type 1231 +#define _gather_70_type 1232 +#define _loop1_72_type 1233 +#define _loop0_74_type 1234 +#define _gather_73_type 1235 +#define _loop1_75_type 1236 +#define _loop0_76_type 1237 +#define _loop0_77_type 1238 +#define _loop0_78_type 1239 +#define _loop1_79_type 1240 +#define _loop0_80_type 1241 +#define _loop1_81_type 1242 +#define _loop1_82_type 1243 +#define _loop1_83_type 1244 +#define _loop0_84_type 1245 +#define _loop1_85_type 1246 +#define _loop0_86_type 1247 +#define _loop1_87_type 1248 +#define _loop0_88_type 1249 +#define _loop1_89_type 1250 +#define _loop1_90_type 1251 +#define _loop1_91_type 1252 +#define _loop1_92_type 1253 +#define _tmp_93_type 1254 +#define _loop0_95_type 1255 +#define _gather_94_type 1256 +#define _tmp_96_type 1257 +#define _tmp_97_type 1258 +#define _tmp_98_type 1259 +#define _tmp_99_type 1260 +#define _loop1_100_type 1261 +#define _tmp_101_type 1262 +#define _tmp_102_type 1263 +#define _loop0_104_type 1264 +#define _gather_103_type 1265 +#define _loop1_105_type 1266 +#define _loop0_106_type 1267 +#define _loop0_107_type 1268 +#define _loop0_109_type 1269 +#define _gather_108_type 1270 +#define _tmp_110_type 1271 +#define _loop0_112_type 1272 +#define _gather_111_type 1273 +#define _loop0_114_type 1274 +#define _gather_113_type 1275 +#define _loop0_116_type 1276 +#define _gather_115_type 1277 +#define _loop0_118_type 1278 +#define _gather_117_type 1279 +#define _loop0_119_type 1280 +#define _loop0_121_type 1281 +#define _gather_120_type 1282 +#define _tmp_122_type 1283 +#define _loop0_124_type 1284 +#define _gather_123_type 1285 +#define _loop0_126_type 1286 +#define _gather_125_type 1287 +#define _tmp_127_type 1288 +#define _loop0_128_type 1289 +#define _loop0_129_type 1290 +#define _loop0_130_type 1291 +#define _tmp_131_type 1292 +#define _tmp_132_type 1293 +#define _loop0_133_type 1294 +#define _tmp_134_type 1295 +#define _loop0_135_type 1296 +#define _tmp_136_type 1297 +#define _tmp_137_type 1298 +#define _tmp_138_type 1299 +#define _tmp_139_type 1300 +#define _tmp_140_type 1301 +#define _tmp_141_type 1302 +#define _tmp_142_type 1303 +#define _tmp_143_type 1304 +#define _tmp_144_type 1305 +#define _tmp_145_type 1306 +#define _tmp_146_type 1307 +#define _tmp_147_type 1308 +#define _tmp_148_type 1309 +#define _tmp_149_type 1310 +#define _tmp_150_type 1311 +#define _tmp_151_type 1312 +#define _tmp_152_type 1313 +#define _loop1_153_type 1314 +#define _loop1_154_type 1315 +#define _tmp_155_type 1316 +#define _tmp_156_type 1317 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -534,6 +535,7 @@ static void *invalid_assignment_rule(Parser *p); static expr_ty invalid_ann_assign_target_rule(Parser *p); static void *invalid_del_stmt_rule(Parser *p); static void *invalid_block_rule(Parser *p); +static void *invalid_primary_rule(Parser *p); static void *invalid_comprehension_rule(Parser *p); static void *invalid_dict_comprehension_rule(Parser *p); static void *invalid_parameters_rule(Parser *p); @@ -10275,6 +10277,7 @@ await_primary_rule(Parser *p) // Left-recursive // primary: +// | invalid_primary // | primary '.' NAME // | primary genexp // | primary '(' arguments? ')' @@ -10328,6 +10331,25 @@ primary_raw(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro + if (p->call_invalid_rules) { // invalid_primary + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_primary")); + void *invalid_primary_var; + if ( + (invalid_primary_var = invalid_primary_rule(p)) // invalid_primary + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_primary")); + _res = invalid_primary_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_primary")); + } { // primary '.' NAME if (p->error_indicator) { D(p->level--); @@ -15028,6 +15050,51 @@ invalid_block_rule(Parser *p) return _res; } +// Left-recursive +// invalid_primary: primary '{' +static void * +invalid_primary_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // primary '{' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary '{'")); + Token * a; + expr_ty primary_var; + if ( + (primary_var = primary_rule(p)) // primary + && + (a = _PyPegen_expect_token(p, 25)) // token='{' + ) + { + D(fprintf(stderr, "%*c+ invalid_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary '{'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "invalid syntax" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary '{'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + // invalid_comprehension: ('[' | '(' | '{') starred_expression for_if_clauses static void * invalid_comprehension_rule(Parser *p) From 6678329ba7c6eeff261a900f1063ee2b99388062 Mon Sep 17 00:00:00 2001 From: Neil Schemenauer Date: Tue, 27 Oct 2020 11:55:52 -0700 Subject: [PATCH 0401/1261] bpo-42099: Fix reference to ob_type in unionobject.c and ceval (GH-22829) * Use Py_TYPE() rather than o->ob_type. --- Objects/unionobject.c | 2 +- Python/ceval.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/unionobject.c b/Objects/unionobject.c index 89fdaf42560c1b..1b7f8ab51a4ce2 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -15,7 +15,7 @@ unionobject_dealloc(PyObject *self) unionobject *alias = (unionobject *)self; Py_XDECREF(alias->args); - self->ob_type->tp_free(self); + Py_TYPE(self)->tp_free(self); } static Py_hash_t diff --git a/Python/ceval.c b/Python/ceval.c index 7338be57798fd9..13b209fc706b6c 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3193,7 +3193,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) descr = _PyType_Lookup(type, name); if (descr == NULL || - descr->ob_type->tp_descr_get == NULL || + Py_TYPE(descr)->tp_descr_get == NULL || !PyDescr_IsData(descr)) { dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset); From 84716694094a774d6e73ad2825a4419dbc22fdf2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 27 Oct 2020 21:34:33 +0100 Subject: [PATCH 0402/1261] bpo-42161: Remove private _PyLong_Zero and _PyLong_One (GH-23003) Use PyLong_FromLong(0) and PyLong_FromLong(1) of the public C API instead. For Python internals, _PyLong_GetZero() and _PyLong_GetOne() of pycore_long.h can be used. --- Include/longobject.h | 3 --- Objects/longobject.c | 18 ------------------ Tools/c-analyzer/TODO | 2 -- 3 files changed, 23 deletions(-) diff --git a/Include/longobject.h b/Include/longobject.h index 06e3e2490401e4..e2301d7abfcccf 100644 --- a/Include/longobject.h +++ b/Include/longobject.h @@ -210,9 +210,6 @@ PyAPI_FUNC(PyObject *) _PyLong_GCD(PyObject *, PyObject *); #endif /* !Py_LIMITED_API */ #ifndef Py_LIMITED_API -PyAPI_DATA(PyObject *) _PyLong_Zero; -PyAPI_DATA(PyObject *) _PyLong_One; - PyAPI_FUNC(PyObject *) _PyLong_Rshift(PyObject *, size_t); PyAPI_FUNC(PyObject *) _PyLong_Lshift(PyObject *, size_t); #endif diff --git a/Objects/longobject.c b/Objects/longobject.c index ae63eba1345040..e0d6410fe6818a 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -32,9 +32,6 @@ _Py_IDENTIFIER(big); (Py_SIZE(x) == 0 ? (sdigit)0 : \ (sdigit)(x)->ob_digit[0])) -PyObject *_PyLong_Zero = NULL; -PyObject *_PyLong_One = NULL; - #define IS_SMALL_INT(ival) (-NSMALLNEGINTS <= (ival) && (ival) < NSMALLPOSINTS) #define IS_SMALL_UINT(ival) ((ival) < NSMALLPOSINTS) @@ -5723,16 +5720,6 @@ _PyLong_Init(PyThreadState *tstate) } if (_Py_IsMainInterpreter(tstate)) { - _PyLong_Zero = PyLong_FromLong(0); - if (_PyLong_Zero == NULL) { - return 0; - } - - _PyLong_One = PyLong_FromLong(1); - if (_PyLong_One == NULL) { - return 0; - } - /* initialize int_info */ if (Int_InfoType.tp_name == NULL) { if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) { @@ -5747,11 +5734,6 @@ _PyLong_Init(PyThreadState *tstate) void _PyLong_Fini(PyThreadState *tstate) { - if (_Py_IsMainInterpreter(tstate)) { - Py_CLEAR(_PyLong_One); - Py_CLEAR(_PyLong_Zero); - } - for (Py_ssize_t i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { Py_CLEAR(tstate->interp->small_ints[i]); } diff --git a/Tools/c-analyzer/TODO b/Tools/c-analyzer/TODO index f5c1a92f856959..1fd8052268be07 100644 --- a/Tools/c-analyzer/TODO +++ b/Tools/c-analyzer/TODO @@ -154,8 +154,6 @@ Objects/bytesobject.c:nullstring static PyBytesO Objects/codeobject.c:PyCode_NewEmpty():nulltuple static PyObject *nulltuple Objects/dictobject.c:empty_values static PyObject *empty_values[1] Objects/listobject.c:indexerr static PyObject *indexerr -Objects/longobject.c:_PyLong_One PyObject *_PyLong_One -Objects/longobject.c:_PyLong_Zero PyObject *_PyLong_Zero Objects/longobject.c:small_ints static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS] Objects/setobject.c:emptyfrozenset static PyObject *emptyfrozenset Python/context.c:_token_missing static PyObject *_token_missing From 0a8df09e13ffab7209ef990fe7d75f13b9064f9a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 27 Oct 2020 22:24:33 +0100 Subject: [PATCH 0403/1261] bpo-42161: Micro-optimize _collections._count_elements() (GH-23008) Move the _PyLong_GetOne() call outside the fast-path loop. --- Modules/_collectionsmodule.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 8990071f519ea2..157875067635ac 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -2278,6 +2278,7 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping, PyObject *dict_get; PyObject *mapping_setitem; PyObject *dict_setitem; + PyObject *one = _PyLong_GetOne(); // borrowed reference it = PyObject_GetIter(iterable); if (it == NULL) @@ -2324,10 +2325,10 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping, if (oldval == NULL) { if (PyErr_Occurred()) goto done; - if (_PyDict_SetItem_KnownHash(mapping, key, _PyLong_GetOne(), hash) < 0) + if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0) goto done; } else { - newval = PyNumber_Add(oldval, _PyLong_GetOne()); + newval = PyNumber_Add(oldval, one); if (newval == NULL) goto done; if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0) @@ -2336,13 +2337,13 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping, } Py_DECREF(key); } - } else { + } + else { bound_get = _PyObject_GetAttrId(mapping, &PyId_get); if (bound_get == NULL) goto done; PyObject *zero = _PyLong_GetZero(); // borrowed reference - PyObject *one = _PyLong_GetOne(); // borrowed reference while (1) { key = PyIter_Next(it); if (key == NULL) From 4071ef7fd5de9d355569eb310d8bf34767afd187 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Wed, 28 Oct 2020 05:37:18 +0800 Subject: [PATCH 0404/1261] bpo-41805: Documentation for PEP 585 (GH-22615) --- Doc/glossary.rst | 7 + Doc/library/stdtypes.rst | 194 ++++++++++++++++++ Doc/library/types.rst | 7 + .../2020-10-10-01-36-37.bpo-41805.l-CGv5.rst | 3 + 4 files changed, 211 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2020-10-10-01-36-37.bpo-41805.l-CGv5.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 847500e556056e..4fd01e0160c26c 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -483,6 +483,13 @@ Glossary See also the :term:`single dispatch` glossary entry, the :func:`functools.singledispatch` decorator, and :pep:`443`. + generic type + A :term:`type` that can be parameterized; typically a container like + :class:`list`. Used for :term:`type hints ` and + :term:`annotations `. + + See :pep:`483` for more details, and :mod:`typing` or + :ref:`generic alias type ` for its uses. GIL See :term:`global interpreter lock`. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index c74d1644636013..3fd94ea1bd310b 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4763,6 +4763,200 @@ define these methods must provide them as a normal Python accessible method. Compared to the overhead of setting up the runtime context, the overhead of a single class dictionary lookup is negligible. + +.. _types-genericalias: + +Generic Alias Type +================== + +.. index:: + object: GenericAlias + pair: Generic; Alias + +``GenericAlias`` objects are created by subscripting a class (usually a +container), such as ``list[int]``. They are intended primarily for +:term:`type annotations `. + +Usually, the :ref:`subscription ` of container objects calls the +method :meth:`__getitem__` of the object. However, the subscription of some +containers' classes may call the classmethod :meth:`__class_getitem__` of the +class instead. The classmethod :meth:`__class_getitem__` should return a +``GenericAlias`` object. + +.. note:: + If the :meth:`__getitem__` of the class' metaclass is present, it will take + precedence over the :meth:`__class_getitem__` defined in the class (see + :pep:`560` for more details). + +The ``GenericAlias`` object acts as a proxy for :term:`generic types +`, implementing *parameterized generics* - a specific instance +of a generic which provides the types for container elements. + +The user-exposed type for the ``GenericAlias`` object can be accessed from +:data:`types.GenericAlias` and used for :func:`isinstance` checks. + +.. describe:: T[X, Y, ...] + + Creates a ``GenericAlias`` representing a type ``T`` containing elements + of types *X*, *Y*, and more depending on the ``T`` used. + For example, a function expecting a :class:`list` containing + :class:`float` elements:: + + def average(values: list[float]) -> float: + return sum(values) / len(values) + + Another example for :term:`mapping` objects, using a :class:`dict`, which + is a generic type expecting two type parameters representing the key type + and the value type. In this example, the function expects a ``dict`` with + keys of type :class:`str` and values of type :class:`int`:: + + def send_post_request(url: str, body: dict[str, int]) -> None: + ... + +The builtin functions :func:`isinstance` and :func:`issubclass` do not accept +``GenericAlias`` types for their second argument:: + + >>> isinstance([1, 2], list[str]) + Traceback (most recent call last): + File "", line 1, in + TypeError: isinstance() argument 2 cannot be a parameterized generic + +The Python runtime does not enforce :term:`type annotations `. +This extends to generic types and their type parameters. When creating +an object from a ``GenericAlias``, container elements are not checked +against their type. For example, the following code is discouraged, but will +run without errors:: + + >>> t = list[str] + >>> t([1, 2, 3]) + [1, 2, 3] + +Furthermore, parameterized generics erase type parameters during object +creation:: + + >>> t = list[str] + >>> type(t) + + + >>> l = t() + >>> type(l) + + +Calling :func:`repr` or :func:`str` on a generic shows the parameterized type:: + + >>> repr(list[int]) + 'list[int]' + + >>> str(list[int]) + 'list[int]' + +The :meth:`__getitem__` method of generics will raise an exception to disallow +mistakes like ``dict[str][str]``:: + + >>> dict[str][str] + Traceback (most recent call last): + File "", line 1, in + TypeError: There are no type variables left in dict[str] + +However, such expressions are valid when :ref:`type variables ` are +used. The index must have as many elements as there are type variable items +in the ``GenericAlias`` object's :attr:`__args__ `. :: + + >>> from typing import TypeVar + >>> Y = TypeVar('Y') + >>> dict[str, Y][int] + dict[str, int] + + +Standard Generic Collections +---------------------------- + +These standard library collections support parameterized generics. + +* :class:`tuple` +* :class:`list` +* :class:`dict` +* :class:`set` +* :class:`frozenset` +* :class:`type` +* :class:`collections.deque` +* :class:`collections.defaultdict` +* :class:`collections.OrderedDict` +* :class:`collections.Counter` +* :class:`collections.ChainMap` +* :class:`collections.abc.Awaitable` +* :class:`collections.abc.Coroutine` +* :class:`collections.abc.AsyncIterable` +* :class:`collections.abc.AsyncIterator` +* :class:`collections.abc.AsyncGenerator` +* :class:`collections.abc.Iterable` +* :class:`collections.abc.Iterator` +* :class:`collections.abc.Generator` +* :class:`collections.abc.Reversible` +* :class:`collections.abc.Container` +* :class:`collections.abc.Collection` +* :class:`collections.abc.Callable` +* :class:`collections.abc.Set` +* :class:`collections.abc.MutableSet` +* :class:`collections.abc.Mapping` +* :class:`collections.abc.MutableMapping` +* :class:`collections.abc.Sequence` +* :class:`collections.abc.MutableSequence` +* :class:`collections.abc.ByteString` +* :class:`collections.abc.MappingView` +* :class:`collections.abc.KeysView` +* :class:`collections.abc.ItemsView` +* :class:`collections.abc.ValuesView` +* :class:`contextlib.AbstractContextManager` +* :class:`contextlib.AbstractAsyncContextManager` +* :ref:`re.Pattern ` +* :ref:`re.Match ` + + +Special Attributes of Generic Alias +----------------------------------- + +All parameterized generics implement special read-only attributes. + +.. attribute:: genericalias.__origin__ + + This attribute points at the non-parameterized generic class:: + + >>> list[int].__origin__ + + + +.. attribute:: genericalias.__args__ + + This attribute is a :class:`tuple` (possibly of length 1) of generic + types passed to the original :meth:`__class_getitem__` + of the generic container:: + + >>> dict[str, list[int]].__args__ + (, list[int]) + + +.. attribute:: genericalias.__parameters__ + + This attribute is a lazily computed tuple (possibly empty) of unique type + variables found in ``__args__``:: + + >>> from typing import TypeVar + + >>> T = TypeVar('T') + >>> list[T].__parameters__ + (~T,) + + +.. seealso:: + + * :pep:`585` -- "Type Hinting Generics In Standard Collections" + * :meth:`__class_getitem__` -- Used to implement parameterized generics. + * :ref:`generics` -- Generics in the :mod:`typing` module. + +.. versionadded:: 3.9 + + .. _types-union: Union Type diff --git a/Doc/library/types.rst b/Doc/library/types.rst index a5cf9ab1344a36..00720559d0a4a8 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -262,6 +262,13 @@ Standard names are defined for the following types: .. versionadded:: 3.10 +.. data:: GenericAlias + + The type of :ref:`parameterized generics ` such as + ``list[int]``. + + .. versionadded:: 3.9 + .. data:: Union The type of :ref:`union type expressions`. diff --git a/Misc/NEWS.d/next/Documentation/2020-10-10-01-36-37.bpo-41805.l-CGv5.rst b/Misc/NEWS.d/next/Documentation/2020-10-10-01-36-37.bpo-41805.l-CGv5.rst new file mode 100644 index 00000000000000..9c9134350a3176 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-10-10-01-36-37.bpo-41805.l-CGv5.rst @@ -0,0 +1,3 @@ +Documented :ref:`generic alias type ` and +:data:`types.GenericAlias`. Also added an entry in glossary for +:term:`generic types `. From e3cfa33b5003cc7685d02385820df545e514796b Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Thu, 29 Oct 2020 03:44:35 -0600 Subject: [PATCH 0405/1261] bpo-34204: Use pickle.DEFAULT_PROTOCOL in shelve (GH-19639) Use pickle.DEFAULT_PROTOCOL (currently 5) in shelve instead of a hardcoded 3. --- Doc/library/shelve.rst | 20 ++++++++++++++----- Doc/whatsnew/3.10.rst | 7 +++++++ Lib/shelve.py | 4 ++-- Lib/test/test_shelve.py | 4 +++- .../2020-04-21-17-18-33.bpo-34204.9wXTtY.rst | 2 ++ 5 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-04-21-17-18-33.bpo-34204.9wXTtY.rst diff --git a/Doc/library/shelve.rst b/Doc/library/shelve.rst index f08c58179a2f9f..07caf91d5b7d99 100644 --- a/Doc/library/shelve.rst +++ b/Doc/library/shelve.rst @@ -25,8 +25,9 @@ lots of shared sub-objects. The keys are ordinary strings. database file is opened for reading and writing. The optional *flag* parameter has the same interpretation as the *flag* parameter of :func:`dbm.open`. - By default, version 3 pickles are used to serialize values. The version of the - pickle protocol can be specified with the *protocol* parameter. + By default, pickles created with :data:`pickle.DEFAULT_PROTOCOL` are used + to serialize values. The version of the pickle protocol can be specified + with the *protocol* parameter. Because of Python semantics, a shelf cannot know when a mutable persistent-dictionary entry is modified. By default modified objects are @@ -40,6 +41,10 @@ lots of shared sub-objects. The keys are ordinary strings. determine which accessed entries are mutable, nor which ones were actually mutated). + .. versionchanged:: 3.10 + :data:`pickle.DEFAULT_PROTOCOL` is now used as the default pickle + protocol. + .. note:: Do not rely on the shelf being closed automatically; always call @@ -108,9 +113,10 @@ Restrictions A subclass of :class:`collections.abc.MutableMapping` which stores pickled values in the *dict* object. - By default, version 3 pickles are used to serialize values. The version of the - pickle protocol can be specified with the *protocol* parameter. See the - :mod:`pickle` documentation for a discussion of the pickle protocols. + By default, pickles created with :data:`pickle.DEFAULT_PROTOCOL` are used + to serialize values. The version of the pickle protocol can be specified + with the *protocol* parameter. See the :mod:`pickle` documentation for a + discussion of the pickle protocols. If the *writeback* parameter is ``True``, the object will hold a cache of all entries accessed and write them back to the *dict* at sync and close times. @@ -130,6 +136,10 @@ Restrictions .. versionchanged:: 3.4 Added context manager support. + .. versionchanged:: 3.10 + :data:`pickle.DEFAULT_PROTOCOL` is now used as the default pickle + protocol. + .. class:: BsdDbShelf(dict, protocol=None, writeback=False, keyencoding='utf-8') diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index b2c6d10ba8deb7..45258db4925718 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -210,6 +210,13 @@ py_compile Added ``--quiet`` option to command-line interface of :mod:`py_compile`. (Contributed by Gregory Schevchenko in :issue:`38731`.) +shelve +------ + +The :mod:`shelve` module now uses :data:`pickle.DEFAULT_PROTOCOL` by default +instead of :mod:`pickle` protocol ``3`` when creating shelves. +(Contributed by Zackery Spytz in :issue:`34204`.) + sys --- diff --git a/Lib/shelve.py b/Lib/shelve.py index 5d443a0fa8d4f1..e053c397345a07 100644 --- a/Lib/shelve.py +++ b/Lib/shelve.py @@ -56,7 +56,7 @@ the persistent dictionary on disk, if feasible). """ -from pickle import Pickler, Unpickler +from pickle import DEFAULT_PROTOCOL, Pickler, Unpickler from io import BytesIO import collections.abc @@ -85,7 +85,7 @@ def __init__(self, dict, protocol=None, writeback=False, keyencoding="utf-8"): self.dict = dict if protocol is None: - protocol = 3 + protocol = DEFAULT_PROTOCOL self._protocol = protocol self.writeback = writeback self.cache = {} diff --git a/Lib/test/test_shelve.py b/Lib/test/test_shelve.py index ac25eee2e52fd9..cfdd67c26c5f51 100644 --- a/Lib/test/test_shelve.py +++ b/Lib/test/test_shelve.py @@ -1,6 +1,8 @@ import unittest import shelve import glob +import pickle + from test import support from test.support import os_helper from collections.abc import MutableMapping @@ -160,7 +162,7 @@ def test_with(self): def test_default_protocol(self): with shelve.Shelf({}) as s: - self.assertEqual(s._protocol, 3) + self.assertEqual(s._protocol, pickle.DEFAULT_PROTOCOL) from test import mapping_tests diff --git a/Misc/NEWS.d/next/Library/2020-04-21-17-18-33.bpo-34204.9wXTtY.rst b/Misc/NEWS.d/next/Library/2020-04-21-17-18-33.bpo-34204.9wXTtY.rst new file mode 100644 index 00000000000000..bce6d39148a376 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-04-21-17-18-33.bpo-34204.9wXTtY.rst @@ -0,0 +1,2 @@ +The :mod:`shelve` module now uses :data:`pickle.DEFAULT_PROTOCOL` by default +instead of :mod:`pickle` protocol ``3``. From 29812cf9501b46d69f2f76c1e3f499452ea05a47 Mon Sep 17 00:00:00 2001 From: Yonatan Goldschmidt Date: Thu, 29 Oct 2020 11:58:52 +0200 Subject: [PATCH 0406/1261] bpo-42143: Ensure PyFunction_NewWithQualName() can't fail after creating the func object (GH-22953) func_dealloc() does not handle partially-created objects. Best not to give it any. --- .../2020-10-27-21-34-05.bpo-42143.N6KXUO.rst | 2 ++ Objects/funcobject.c | 29 ++++++++++--------- 2 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-27-21-34-05.bpo-42143.N6KXUO.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-27-21-34-05.bpo-42143.N6KXUO.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-27-21-34-05.bpo-42143.N6KXUO.rst new file mode 100644 index 00000000000000..2b16e69da73b5f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-27-21-34-05.bpo-42143.N6KXUO.rst @@ -0,0 +1,2 @@ +Fix handling of errors during creation of ``PyFunctionObject``, which resulted +in operations on uninitialized memory. Patch by Yonatan Goldschmidt. diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 09a188664e8611..9b4302a13c10f8 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -19,9 +19,23 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname return NULL; } + /* __module__: If module name is in globals, use it. + Otherwise, use None. */ + module = PyDict_GetItemWithError(globals, __name__); + if (module) { + Py_INCREF(module); + } + else if (PyErr_Occurred()) { + return NULL; + } + op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type); - if (op == NULL) + if (op == NULL) { + Py_XDECREF(module); return NULL; + } + /* Note: No failures from this point on, since func_dealloc() does not + expect a partially-created object. */ op->func_weakreflist = NULL; Py_INCREF(code); @@ -34,6 +48,7 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname op->func_kwdefaults = NULL; /* No keyword only defaults */ op->func_closure = NULL; op->vectorcall = _PyFunction_Vectorcall; + op->func_module = module; consts = ((PyCodeObject *)code)->co_consts; if (PyTuple_Size(consts) >= 1) { @@ -47,20 +62,8 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname op->func_doc = doc; op->func_dict = NULL; - op->func_module = NULL; op->func_annotations = NULL; - /* __module__: If module name is in globals, use it. - Otherwise, use None. */ - module = PyDict_GetItemWithError(globals, __name__); - if (module) { - Py_INCREF(module); - op->func_module = module; - } - else if (PyErr_Occurred()) { - Py_DECREF(op); - return NULL; - } if (qualname) op->func_qualname = qualname; else From 7a681877dc891db2be371357a86771b9a8df41e4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 29 Oct 2020 15:16:23 +0100 Subject: [PATCH 0407/1261] bpo-42029: Remove IRIX code (GH-23023) IRIX code was slowy removed in Python 2.4 (--with-sgi-dl), Python 3.3 (Irix threads), and Python 3.7. --- Doc/library/posix.rst | 6 +++--- Lib/platform.py | 13 ------------- Modules/posixmodule.c | 7 +++---- Modules/resource.c | 7 ++----- 4 files changed, 8 insertions(+), 25 deletions(-) diff --git a/Doc/library/posix.rst b/Doc/library/posix.rst index 2105af9215f769..ad417a17879c1f 100644 --- a/Doc/library/posix.rst +++ b/Doc/library/posix.rst @@ -37,7 +37,7 @@ Large File Support .. sectionauthor:: Steve Clift -Several operating systems (including AIX, HP-UX, Irix and Solaris) provide +Several operating systems (including AIX, HP-UX and Solaris) provide support for files that are larger than 2 GiB from a C programming model where :c:type:`int` and :c:type:`long` are 32-bit values. This is typically accomplished by defining the relevant size and offset types as 64-bit values. Such files are @@ -47,8 +47,8 @@ Large file support is enabled in Python when the size of an :c:type:`off_t` is larger than a :c:type:`long` and the :c:type:`long long` is at least as large as an :c:type:`off_t`. It may be necessary to configure and compile Python with certain compiler flags -to enable this mode. For example, it is enabled by default with recent versions -of Irix, but with Solaris 2.6 and 2.7 you need to do something like:: +to enable this mode. For example, with Solaris 2.6 and 2.7 you need to do +something like:: CFLAGS="`getconf LFS_CFLAGS`" OPT="-g -O2 $CFLAGS" \ ./configure diff --git a/Lib/platform.py b/Lib/platform.py index e9f50ab622d316..0eb5167d584f79 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -524,16 +524,6 @@ def system_alias(system, release, version): # XXX Whatever the new SunOS marketing name is... system = 'Solaris' - elif system == 'IRIX64': - # IRIX reports IRIX64 on platforms with 64-bit support; yet it - # is really a version and not a different platform, since 32-bit - # apps are also supported.. - system = 'IRIX' - if version: - version = version + ' (64bit)' - else: - version = '64bit' - elif system in ('win32', 'win16'): # In case one of the other tricks system = 'Windows' @@ -698,9 +688,6 @@ def architecture(executable=sys.executable, bits='', linkage=''): # Bits if '32-bit' in fileout: bits = '32bit' - elif 'N32' in fileout: - # On Irix only - bits = 'n32bit' elif '64-bit' in fileout: bits = '64bit' diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index ccd64d63dd0b32..203f98515dfdad 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6763,12 +6763,11 @@ os_sched_getaffinity_impl(PyObject *module, pid_t pid) /* AIX uses /dev/ptc but is otherwise the same as /dev/ptmx */ -/* IRIX has both /dev/ptc and /dev/ptmx, use ptmx */ #if defined(HAVE_DEV_PTC) && !defined(HAVE_DEV_PTMX) -#define DEV_PTY_FILE "/dev/ptc" -#define HAVE_DEV_PTMX +# define DEV_PTY_FILE "/dev/ptc" +# define HAVE_DEV_PTMX #else -#define DEV_PTY_FILE "/dev/ptmx" +# define DEV_PTY_FILE "/dev/ptmx" #endif #if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX) diff --git a/Modules/resource.c b/Modules/resource.c index ddbf80be9c69eb..4f5dcf84387888 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -313,13 +313,10 @@ resource_getpagesize_impl(PyObject *module) long pagesize = 0; #if defined(HAVE_GETPAGESIZE) pagesize = getpagesize(); -#elif defined(HAVE_SYSCONF) -#if defined(_SC_PAGE_SIZE) +#elif defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE) pagesize = sysconf(_SC_PAGE_SIZE); #else - /* Irix 5.3 has _SC_PAGESIZE, but not _SC_PAGE_SIZE */ - pagesize = sysconf(_SC_PAGESIZE); -#endif +# error "unsupported platform: resource.getpagesize()" #endif return pagesize; } From dbddcc78a65f623b2b8be817e0a57ecac697349c Mon Sep 17 00:00:00 2001 From: Rafael Fontenelle Date: Thu, 29 Oct 2020 17:48:21 -0300 Subject: [PATCH 0408/1261] bpo-42180: fix plural in arguments and control (GH-23015) https://bugs.python.org/issue42180 --- Doc/library/functions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 52a1512b5884fe..a8a4ca42007c63 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -259,7 +259,7 @@ are always available. They are listed here in alphabetical order. interactive statement (in the latter case, expression statements that evaluate to something other than ``None`` will be printed). - The optional argument *flags* and *dont_inherit* controls which + The optional arguments *flags* and *dont_inherit* control which :ref:`compiler options ` should be activated and which :ref:`future features ` should be allowed. If neither is present (or both are zero) the code is compiled with the same flags that From 94d1e995e9d4c250648ef678f3e3c88a157154d7 Mon Sep 17 00:00:00 2001 From: Teugea Ioan-Teodor Date: Fri, 30 Oct 2020 00:17:59 +0200 Subject: [PATCH 0409/1261] bpo-42061: Document __format__ for IP addresses (GH-23018) Automerge-Triggered-By: GH:ericvsmith --- Doc/library/ipaddress.rst | 36 +++++++++++++++++-- Doc/tools/susp-ignored.csv | 6 ++-- .../2020-10-28-21-39-45.bpo-42061._x-0sg.rst | 1 + 3 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2020-10-28-21-39-45.bpo-42061._x-0sg.rst diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst index 5f5e66412da477..d6d1f1e362137b 100644 --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -202,6 +202,32 @@ write code that handles both IP versions correctly. Address objects are .. _iana-ipv4-special-registry: https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml .. _iana-ipv6-special-registry: https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml +.. method:: IPv4Address.__format__(fmt) + + Returns a string representation of the IP address, controlled by + an explicit format string. + *fmt* can be one of the following: ``'s'``, the default option, + equivalent to :func:`str`, ``'b'`` for a zero-padded binary string, + ``'X'`` or ``'x'`` for an uppercase or lowercase hexadecimal + representation, or ``'n'``, which is equivalent to ``'b'`` for IPv4 + addresses and ``'x'`` for IPv6. For binary and hexadecimal + representations, the form specifier ``'#'`` and the grouping option + ``'_'`` are available. ``__format__`` is used by ``format``, ``str.format`` + and f-strings. + + >>> format(ipaddress.IPv4Address('192.168.0.1')) + '192.168.0.1' + >>> '{:#b}'.format(ipaddress.IPv4Address('192.168.0.1')) + '0b11000000101010000000000000000001' + >>> f'{ipaddress.IPv6Address("2001:db8::1000"):s}' + '2001:db8::1000' + >>> format(ipaddress.IPv6Address('2001:db8::1000'), '_X') + '2001_0DB8_0000_0000_0000_0000_0000_1000' + >>> '{:#_n}'.format(ipaddress.IPv6Address('2001:db8::1000')) + '0x2001_0db8_0000_0000_0000_0000_0000_1000' + + .. versionadded:: 3.9 + .. class:: IPv6Address(address) @@ -246,8 +272,8 @@ write code that handles both IP versions correctly. Address objects are groups consisting entirely of zeroes included. - For the following attributes, see the corresponding documentation of the - :class:`IPv4Address` class: + For the following attributes and methods, see the corresponding + documentation of the :class:`IPv4Address` class: .. attribute:: packed .. attribute:: reverse_pointer @@ -297,6 +323,12 @@ write code that handles both IP versions correctly. Address objects are the embedded ``(server, client)`` IP address pair. For any other address, this property will be ``None``. +.. method:: IPv6Address.__format__(fmt) + + Refer to the corresponding method documentation in + :class:`IPv4Address`. + + .. versionadded:: 3.9 Conversion to Strings and Integers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index b15fd32b357f03..0c1dec700121b6 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -147,8 +147,10 @@ library/ipaddress,,:db8,IPv6Address('2001:db8::') library/ipaddress,,::,IPv6Address('2001:db8::') library/ipaddress,,:db8,>>> ipaddress.IPv6Address('2001:db8::1000') library/ipaddress,,::,>>> ipaddress.IPv6Address('2001:db8::1000') -library/ipaddress,,:db8,IPv6Address('2001:db8::1000') -library/ipaddress,,::,IPv6Address('2001:db8::1000') +library/ipaddress,,:db8,'2001:db8::1000' +library/ipaddress,,::,'2001:db8::1000' +library/ipaddress,231,:db8,">>> f'{ipaddress.IPv6Address(""2001:db8::1000""):s}'" +library/ipaddress,231,::,">>> f'{ipaddress.IPv6Address(""2001:db8::1000""):s}'" library/ipaddress,,::,IPv6Address('ff02::5678%1') library/ipaddress,,::,fe80::1234 library/ipaddress,,:db8,">>> ipaddress.ip_address(""2001:db8::1"").reverse_pointer" diff --git a/Misc/NEWS.d/next/Documentation/2020-10-28-21-39-45.bpo-42061._x-0sg.rst b/Misc/NEWS.d/next/Documentation/2020-10-28-21-39-45.bpo-42061._x-0sg.rst new file mode 100644 index 00000000000000..b38bb84350171e --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-10-28-21-39-45.bpo-42061._x-0sg.rst @@ -0,0 +1 @@ +Document __format__ functionality for IP addresses. \ No newline at end of file From 4342119aeb88204b198ca5cc69186fc5c56ac17d Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 30 Oct 2020 12:01:17 +0800 Subject: [PATCH 0410/1261] bpo-42198: Link to GenericAlias in typing and expressions (GH-23030) Follow up to 7cdf30fff39ea97f403b5472096349998d190e30 and 4173320920706b49a004bdddd8d7108e8984e3fc. This addresses the point "1. Update links in typing, subscription and union to point to GenericAlias." in the bpo for this PR. --- Doc/library/typing.rst | 111 ++++++++++++++++++++++------------ Doc/reference/expressions.rst | 8 +-- 2 files changed, 75 insertions(+), 44 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 402dd24fde6e08..9a993c073277f9 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -524,7 +524,8 @@ These can be used as types in annotations using ``[]``, each having a unique syn is equivalent to ``Tuple[Any, ...]``, and in turn to :class:`tuple`. .. deprecated:: 3.9 - :class:`builtins.tuple ` now supports ``[]``. See :pep:`585`. + :class:`builtins.tuple ` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. data:: Union @@ -602,7 +603,8 @@ These can be used as types in annotations using ``[]``, each having a unique syn :class:`collections.abc.Callable`. .. deprecated:: 3.9 - :class:`collections.abc.Callable` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Callable` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. class:: Type(Generic[CT_co]) @@ -647,7 +649,8 @@ These can be used as types in annotations using ``[]``, each having a unique syn .. versionadded:: 3.5.2 .. deprecated:: 3.9 - :class:`builtins.type ` now supports ``[]``. See :pep:`585`. + :class:`builtins.type ` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. data:: Literal @@ -1079,7 +1082,8 @@ Corresponding to built-in types ... .. deprecated:: 3.9 - :class:`builtins.dict ` now supports ``[]``. See :pep:`585`. + :class:`builtins.dict ` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. class:: List(list, MutableSequence[T]) @@ -1099,7 +1103,8 @@ Corresponding to built-in types return [item for item in vector if item > 0] .. deprecated:: 3.9 - :class:`builtins.list ` now supports ``[]``. See :pep:`585`. + :class:`builtins.list ` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. class:: Set(set, MutableSet[T]) @@ -1108,14 +1113,16 @@ Corresponding to built-in types to use an abstract collection type such as :class:`AbstractSet`. .. deprecated:: 3.9 - :class:`builtins.set ` now supports ``[]``. See :pep:`585`. + :class:`builtins.set ` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. class:: FrozenSet(frozenset, AbstractSet[T_co]) A generic version of :class:`builtins.frozenset `. .. deprecated:: 3.9 - :class:`builtins.frozenset ` now supports ``[]``. See :pep:`585`. + :class:`builtins.frozenset ` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. .. note:: :data:`Tuple` is a special form. @@ -1129,7 +1136,8 @@ Corresponding to types in :mod:`collections` .. versionadded:: 3.5.2 .. deprecated:: 3.9 - :class:`collections.defaultdict` now supports ``[]``. See :pep:`585`. + :class:`collections.defaultdict` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. class:: OrderedDict(collections.OrderedDict, MutableMapping[KT, VT]) @@ -1138,7 +1146,8 @@ Corresponding to types in :mod:`collections` .. versionadded:: 3.7.2 .. deprecated:: 3.9 - :class:`collections.OrderedDict` now supports ``[]``. See :pep:`585`. + :class:`collections.OrderedDict` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. class:: ChainMap(collections.ChainMap, MutableMapping[KT, VT]) @@ -1148,7 +1157,8 @@ Corresponding to types in :mod:`collections` .. versionadded:: 3.6.1 .. deprecated:: 3.9 - :class:`collections.ChainMap` now supports ``[]``. See :pep:`585`. + :class:`collections.ChainMap` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. class:: Counter(collections.Counter, Dict[T, int]) @@ -1158,7 +1168,8 @@ Corresponding to types in :mod:`collections` .. versionadded:: 3.6.1 .. deprecated:: 3.9 - :class:`collections.Counter` now supports ``[]``. See :pep:`585`. + :class:`collections.Counter` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. class:: Deque(deque, MutableSequence[T]) @@ -1168,7 +1179,8 @@ Corresponding to types in :mod:`collections` .. versionadded:: 3.6.1 .. deprecated:: 3.9 - :class:`collections.deque` now supports ``[]``. See :pep:`585`. + :class:`collections.deque` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. Other concrete types """""""""""""""""""" @@ -1193,7 +1205,8 @@ Other concrete types ``Match[bytes]``. These types are also in the ``typing.re`` namespace. .. deprecated:: 3.9 - Classes ``Pattern`` and ``Match`` from :mod:`re` now support ``[]``. See :pep:`585`. + Classes ``Pattern`` and ``Match`` from :mod:`re` now support ``[]``. + See :pep:`585` and :ref:`types-genericalias`. .. class:: Text @@ -1220,7 +1233,8 @@ Corresponding to collections in :mod:`collections.abc` A generic version of :class:`collections.abc.Set`. .. deprecated:: 3.9 - :class:`collections.abc.Set` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Set` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. class:: ByteString(Sequence[int]) @@ -1233,7 +1247,8 @@ Corresponding to collections in :mod:`collections.abc` annotate arguments of any of the types mentioned above. .. deprecated:: 3.9 - :class:`collections.abc.ByteString` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.ByteString` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: Collection(Sized, Iterable[T_co], Container[T_co]) @@ -1242,28 +1257,32 @@ Corresponding to collections in :mod:`collections.abc` .. versionadded:: 3.6.0 .. deprecated:: 3.9 - :class:`collections.abc.Collection` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Collection` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: Container(Generic[T_co]) A generic version of :class:`collections.abc.Container`. .. deprecated:: 3.9 - :class:`collections.abc.Container` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Container` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: ItemsView(MappingView, Generic[KT_co, VT_co]) A generic version of :class:`collections.abc.ItemsView`. .. deprecated:: 3.9 - :class:`collections.abc.ItemsView` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.ItemsView` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: KeysView(MappingView[KT_co], AbstractSet[KT_co]) A generic version of :class:`collections.abc.KeysView`. .. deprecated:: 3.9 - :class:`collections.abc.KeysView` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.KeysView` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: Mapping(Sized, Collection[KT], Generic[VT_co]) @@ -1274,49 +1293,56 @@ Corresponding to collections in :mod:`collections.abc` return word_list[word] .. deprecated:: 3.9 - :class:`collections.abc.Mapping` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Mapping` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: MappingView(Sized, Iterable[T_co]) A generic version of :class:`collections.abc.MappingView`. .. deprecated:: 3.9 - :class:`collections.abc.MappingView` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.MappingView` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: MutableMapping(Mapping[KT, VT]) A generic version of :class:`collections.abc.MutableMapping`. .. deprecated:: 3.9 - :class:`collections.abc.MutableMapping` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.MutableMapping` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. .. class:: MutableSequence(Sequence[T]) A generic version of :class:`collections.abc.MutableSequence`. .. deprecated:: 3.9 - :class:`collections.abc.MutableSequence` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.MutableSequence` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. .. class:: MutableSet(AbstractSet[T]) A generic version of :class:`collections.abc.MutableSet`. .. deprecated:: 3.9 - :class:`collections.abc.MutableSet` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.MutableSet` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: Sequence(Reversible[T_co], Collection[T_co]) A generic version of :class:`collections.abc.Sequence`. .. deprecated:: 3.9 - :class:`collections.abc.Sequence` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Sequence` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: ValuesView(MappingView[VT_co]) A generic version of :class:`collections.abc.ValuesView`. .. deprecated:: 3.9 - :class:`collections.abc.ValuesView` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.ValuesView` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. Corresponding to other types in :mod:`collections.abc` """""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -1326,14 +1352,16 @@ Corresponding to other types in :mod:`collections.abc` A generic version of :class:`collections.abc.Iterable`. .. deprecated:: 3.9 - :class:`collections.abc.Iterable` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Iterable` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: Iterator(Iterable[T_co]) A generic version of :class:`collections.abc.Iterator`. .. deprecated:: 3.9 - :class:`collections.abc.Iterator` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Iterator` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]) @@ -1367,7 +1395,8 @@ Corresponding to other types in :mod:`collections.abc` start += 1 .. deprecated:: 3.9 - :class:`collections.abc.Generator` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Generator` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: Hashable @@ -1378,7 +1407,8 @@ Corresponding to other types in :mod:`collections.abc` A generic version of :class:`collections.abc.Reversible`. .. deprecated:: 3.9 - :class:`collections.abc.Reversible` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Reversible` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: Sized @@ -1403,7 +1433,8 @@ Asynchronous programming .. versionadded:: 3.5.3 .. deprecated:: 3.9 - :class:`collections.abc.Coroutine` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Coroutine` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: AsyncGenerator(AsyncIterator[T_co], Generic[T_co, T_contra]) @@ -1439,7 +1470,8 @@ Asynchronous programming .. versionadded:: 3.6.1 .. deprecated:: 3.9 - :class:`collections.abc.AsyncGenerator` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.AsyncGenerator` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. .. class:: AsyncIterable(Generic[T_co]) @@ -1448,7 +1480,8 @@ Asynchronous programming .. versionadded:: 3.5.2 .. deprecated:: 3.9 - :class:`collections.abc.AsyncIterable` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.AsyncIterable` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: AsyncIterator(AsyncIterable[T_co]) @@ -1457,7 +1490,8 @@ Asynchronous programming .. versionadded:: 3.5.2 .. deprecated:: 3.9 - :class:`collections.abc.AsyncIterator` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.AsyncIterator` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: Awaitable(Generic[T_co]) @@ -1466,7 +1500,8 @@ Asynchronous programming .. versionadded:: 3.5.2 .. deprecated:: 3.9 - :class:`collections.abc.Awaitable` now supports ``[]``. See :pep:`585`. + :class:`collections.abc.Awaitable` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. Context manager types @@ -1480,7 +1515,8 @@ Context manager types .. versionadded:: 3.6.0 .. deprecated:: 3.9 - :class:`contextlib.AbstractContextManager` now supports ``[]``. See :pep:`585`. + :class:`contextlib.AbstractContextManager` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. .. class:: AsyncContextManager(Generic[T_co]) @@ -1490,7 +1526,8 @@ Context manager types .. versionadded:: 3.6.2 .. deprecated:: 3.9 - :class:`contextlib.AbstractAsyncContextManager` now supports ``[]``. See :pep:`585`. + :class:`contextlib.AbstractAsyncContextManager` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. Protocols --------- diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 938a9732f5a250..512aa5af956198 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -837,14 +837,8 @@ this method will need to explicitly add that support. A string's items are characters. A character is not a separate data type but a string of exactly one character. -.. - At the time of writing this, there is no documentation for generic alias - or PEP 585. Thus the link currently points to PEP 585 itself. - Please change the link for generic alias to reference the correct - documentation once documentation for PEP 585 becomes available. - Subscription of certain :term:`classes ` or :term:`types ` -creates a `generic alias `_. +creates a :ref:`generic alias `. In this case, user-defined classes can support subscription by providing a :meth:`__class_getitem__` classmethod. From 07b5ace0f6e6fff686b3f7e1d7ae7ad558f7be9d Mon Sep 17 00:00:00 2001 From: Eric W Date: Fri, 30 Oct 2020 05:56:28 +0100 Subject: [PATCH 0411/1261] bpo-42160: tempfile: Reduce overhead of pid check. (GH-22997) The _RandomSequence class in tempfile used to check the current pid every time its rng property was used. This commit replaces this code with `os.register_at_fork` to reduce the overhead. --- Lib/tempfile.py | 22 +++++++++---------- Lib/test/test_tempfile.py | 4 ++-- .../2020-10-27-00-42-09.bpo-42160.eiLOCi.rst | 1 + 3 files changed, 13 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 770f72c25295cb..1bc5c71fd03494 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -129,24 +129,22 @@ class _RandomNameSequence: _RandomNameSequence is an iterator.""" - characters = "abcdefghijklmnopqrstuvwxyz0123456789_" - - @property - def rng(self): - cur_pid = _os.getpid() - if cur_pid != getattr(self, '_rng_pid', None): - self._rng = _Random() - self._rng_pid = cur_pid - return self._rng + def __init__(self, characters="abcdefghijklmnopqrstuvwxyz0123456789_", length=8, rng=None): + if rng is None: + rng = _Random() + if hasattr(_os, "fork"): + # prevent same state after fork + _os.register_at_fork(after_in_child=rng.seed) + self.rng = rng + self.characters = characters + self.length = length def __iter__(self): return self def __next__(self): c = self.characters - choose = self.rng.choice - letters = [choose(c) for dummy in range(8)] - return ''.join(letters) + return ''.join(self.rng.choices(c, k=self.length)) def _candidate_tempdir_list(): """Generate a list of candidate temporary directories which diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 8ace883d74bb24..77d710efaf107b 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -153,8 +153,8 @@ def setUp(self): self.r = tempfile._RandomNameSequence() super().setUp() - def test_get_six_char_str(self): - # _RandomNameSequence returns a six-character string + def test_get_eight_char_str(self): + # _RandomNameSequence returns a eight-character string s = next(self.r) self.nameCheck(s, '', '', '') diff --git a/Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst b/Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst new file mode 100644 index 00000000000000..c5f3091283a87b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst @@ -0,0 +1 @@ +Replaced pid check in ``tempfile._RandomNameSequence`` with ``os.register_at_fork`` to reduce overhead. From 7129002d16dcc6257b77c821027463d39c5a9b6a Mon Sep 17 00:00:00 2001 From: Akashkumar D Khunt Date: Fri, 30 Oct 2020 11:33:51 +0530 Subject: [PATCH 0412/1261] bpo-42172: Correct typo for test_socket.py (GH-23013) --- Lib/test/test_socket.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 67ac045330f3eb..80638325ba3a05 100755 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -4129,7 +4129,7 @@ def _testSecondCmsgTruncLen0Minus1(self): @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT", "IPV6_RECVTCLASS", "IPV6_TCLASS") - def testSecomdCmsgTruncInData(self): + def testSecondCmsgTruncInData(self): # Test truncation of the second of two control messages inside # its associated data. self.serv_sock.setsockopt(socket.IPPROTO_IPV6, @@ -4164,8 +4164,8 @@ def testSecomdCmsgTruncInData(self): self.assertEqual(ancdata, []) - @testSecomdCmsgTruncInData.client_skip - def _testSecomdCmsgTruncInData(self): + @testSecondCmsgTruncInData.client_skip + def _testSecondCmsgTruncInData(self): self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout)) self.sendToServer(MSG) From 8777592f870f45e8bf11cf8b9a3e8b95f8cd4d6f Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Fri, 30 Oct 2020 14:48:41 +0300 Subject: [PATCH 0413/1261] bpo-42206: Propagate and raise errors from PyAST_Validate in the parser (GH-23035) --- .../2020-10-30-13-11-01.bpo-42206.xxssR8.rst | 2 ++ Parser/pegen.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-30-13-11-01.bpo-42206.xxssR8.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-30-13-11-01.bpo-42206.xxssR8.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-30-13-11-01.bpo-42206.xxssR8.rst new file mode 100644 index 00000000000000..b9eb135fec5e9c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-30-13-11-01.bpo-42206.xxssR8.rst @@ -0,0 +1,2 @@ +Propagate and raise the errors caused by :c:func:`PyAST_Validate` in the +parser. diff --git a/Parser/pegen.c b/Parser/pegen.c index 827d4dace1fc33..216edd810e246f 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -1157,7 +1157,9 @@ _PyPegen_run_parser(Parser *p) p->start_rule == Py_file_input || p->start_rule == Py_eval_input) { - assert(PyAST_Validate(res)); + if (!PyAST_Validate(res)) { + return NULL; + } } #endif return res; From 10fd51428f49ee625ec8ae97c20dd5e7078695c5 Mon Sep 17 00:00:00 2001 From: Matti Picus Date: Fri, 30 Oct 2020 16:52:39 +0200 Subject: [PATCH 0414/1261] DOC: attribute PyPy for the idea behind LOAD_ATTR cache (GH-23036) Co-authored-by: Pablo Galindo --- Doc/whatsnew/3.10.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 45258db4925718..f4d72908486ddd 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -261,7 +261,7 @@ Optimizations * The ``LOAD_ATTR`` instruction now uses new "per opcode cache" mechanism. It is about 36% faster now. (Contributed by Pablo Galindo and Yury Selivanov - in :issue:`42093`.) + in :issue:`42093`, based on ideas implemented originally in PyPy and MicroPython.) * When building Python with ``--enable-optimizations`` now ``-fno-semantic-interposition`` is added to both the compile and link line. From 995ba14358c5839c14acb20102ba247e2d1a6e94 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 30 Oct 2020 17:00:00 +0100 Subject: [PATCH 0415/1261] bpo-42208: Pass tstate to _PyGC_CollectNoFail() (GH-23038) Move private _PyGC_CollectNoFail() to the internal C API. Remove the private _PyGC_CollectIfEnabled() which was just an alias to the public PyGC_Collect() function since Python 3.8. Rename functions: * collect() => gc_collect_main() * collect_with_callback() => gc_collect_with_callback() * collect_generations() => gc_collect_generations() --- Include/cpython/objimpl.h | 4 ---- Include/internal/pycore_gc.h | 4 +++- Modules/gcmodule.c | 43 +++++++++++++++--------------------- Python/import.c | 4 ++-- Python/pylifecycle.c | 4 ++-- 5 files changed, 25 insertions(+), 34 deletions(-) diff --git a/Include/cpython/objimpl.h b/Include/cpython/objimpl.h index 15999a239f7a9a..d83700e2a4647f 100644 --- a/Include/cpython/objimpl.h +++ b/Include/cpython/objimpl.h @@ -79,10 +79,6 @@ PyAPI_FUNC(void) PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator); PyAPI_FUNC(void) PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator); -PyAPI_FUNC(Py_ssize_t) _PyGC_CollectNoFail(void); -PyAPI_FUNC(Py_ssize_t) _PyGC_CollectIfEnabled(void); - - /* Test if an object implements the garbage collector protocol */ PyAPI_FUNC(int) PyObject_IS_GC(PyObject *obj); diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h index da202a1df532e4..e2d47c90c10d80 100644 --- a/Include/internal/pycore_gc.h +++ b/Include/internal/pycore_gc.h @@ -161,7 +161,9 @@ struct _gc_runtime_state { Py_ssize_t long_lived_pending; }; -PyAPI_FUNC(void) _PyGC_InitState(struct _gc_runtime_state *); +extern void _PyGC_InitState(struct _gc_runtime_state *); + +extern Py_ssize_t _PyGC_CollectNoFail(PyThreadState *tstate); // Functions to clear types free lists diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 8833400caba75e..d90ff33684fe8c 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1176,8 +1176,9 @@ handle_resurrected_objects(PyGC_Head *unreachable, PyGC_Head* still_unreachable, /* This is the main function. Read this to understand how the * collection process works. */ static Py_ssize_t -collect(PyThreadState *tstate, int generation, - Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable, int nofail) +gc_collect_main(PyThreadState *tstate, int generation, + Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable, + int nofail) { int i; Py_ssize_t m = 0; /* # objects collected */ @@ -1395,19 +1396,19 @@ invoke_gc_callback(PyThreadState *tstate, const char *phase, * progress callbacks. */ static Py_ssize_t -collect_with_callback(PyThreadState *tstate, int generation) +gc_collect_with_callback(PyThreadState *tstate, int generation) { assert(!_PyErr_Occurred(tstate)); Py_ssize_t result, collected, uncollectable; invoke_gc_callback(tstate, "start", generation, 0, 0); - result = collect(tstate, generation, &collected, &uncollectable, 0); + result = gc_collect_main(tstate, generation, &collected, &uncollectable, 0); invoke_gc_callback(tstate, "stop", generation, collected, uncollectable); assert(!_PyErr_Occurred(tstate)); return result; } static Py_ssize_t -collect_generations(PyThreadState *tstate) +gc_collect_generations(PyThreadState *tstate) { GCState *gcstate = &tstate->interp->gc; /* Find the oldest generation (highest numbered) where the count @@ -1455,7 +1456,7 @@ collect_generations(PyThreadState *tstate) if (i == NUM_GENERATIONS - 1 && gcstate->long_lived_pending < gcstate->long_lived_total / 4) continue; - n = collect_with_callback(tstate, i); + n = gc_collect_with_callback(tstate, i); break; } } @@ -1541,7 +1542,7 @@ gc_collect_impl(PyObject *module, int generation) } else { gcstate->collecting = 1; - n = collect_with_callback(tstate, generation); + n = gc_collect_with_callback(tstate, generation); gcstate->collecting = 0; } return n; @@ -2041,7 +2042,7 @@ PyInit_gc(void) return m; } -/* API to invoke gc.collect() from C */ +/* Public API to invoke gc.collect() from C */ Py_ssize_t PyGC_Collect(void) { @@ -2061,7 +2062,7 @@ PyGC_Collect(void) PyObject *exc, *value, *tb; gcstate->collecting = 1; _PyErr_Fetch(tstate, &exc, &value, &tb); - n = collect_with_callback(tstate, NUM_GENERATIONS - 1); + n = gc_collect_with_callback(tstate, NUM_GENERATIONS - 1); _PyErr_Restore(tstate, exc, value, tb); gcstate->collecting = 0; } @@ -2070,19 +2071,11 @@ PyGC_Collect(void) } Py_ssize_t -_PyGC_CollectIfEnabled(void) +_PyGC_CollectNoFail(PyThreadState *tstate) { - return PyGC_Collect(); -} - -Py_ssize_t -_PyGC_CollectNoFail(void) -{ - PyThreadState *tstate = _PyThreadState_GET(); assert(!_PyErr_Occurred(tstate)); GCState *gcstate = &tstate->interp->gc; - Py_ssize_t n; /* Ideally, this function is only called on interpreter shutdown, and therefore not recursively. Unfortunately, when there are daemon @@ -2091,13 +2084,13 @@ _PyGC_CollectNoFail(void) See http://bugs.python.org/issue8713#msg195178 for an example. */ if (gcstate->collecting) { - n = 0; - } - else { - gcstate->collecting = 1; - n = collect(tstate, NUM_GENERATIONS - 1, NULL, NULL, 1); - gcstate->collecting = 0; + return 0; } + + Py_ssize_t n; + gcstate->collecting = 1; + n = gc_collect_main(tstate, NUM_GENERATIONS - 1, NULL, NULL, 1); + gcstate->collecting = 0; return n; } @@ -2240,7 +2233,7 @@ _PyObject_GC_Alloc(int use_calloc, size_t basicsize) !_PyErr_Occurred(tstate)) { gcstate->collecting = 1; - collect_generations(tstate); + gc_collect_generations(tstate); gcstate->collecting = 0; } PyObject *op = FROM_GC(g); diff --git a/Python/import.c b/Python/import.c index b79bda058db822..8b9cc3066fc4ad 100644 --- a/Python/import.c +++ b/Python/import.c @@ -566,7 +566,7 @@ _PyImport_Cleanup(PyThreadState *tstate) } Py_XDECREF(dict); /* Collect references */ - _PyGC_CollectNoFail(); + _PyGC_CollectNoFail(tstate); /* Dump GC stats before it's too late, since it uses the warnings machinery. */ _PyGC_DumpShutdownStats(tstate); @@ -626,7 +626,7 @@ _PyImport_Cleanup(PyThreadState *tstate) Py_DECREF(modules); /* Once more */ - _PyGC_CollectNoFail(); + _PyGC_CollectNoFail(tstate); #undef CLEAR_MODULE #undef STORE_MODULE_WEAKREF diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 774a4f9de08e0e..71834f63f2a78d 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1293,7 +1293,7 @@ finalize_interp_clear(PyThreadState *tstate) PyInterpreterState_Clear(tstate->interp); /* Last explicit GC collection */ - _PyGC_CollectNoFail(); + _PyGC_CollectNoFail(tstate); /* Clear all loghooks */ /* Both _PySys_Audit function and users still need PyObject, such as tuple. @@ -1414,7 +1414,7 @@ Py_FinalizeEx(void) * XXX but I'm unclear on exactly how that one happens. In any case, * XXX I haven't seen a real-life report of either of these. */ - _PyGC_CollectIfEnabled(); + PyGC_Collect(); /* Destroy all modules */ _PyImport_Cleanup(tstate); From 1be053b099944e3504df7b5f334d2b84d2448c88 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 30 Oct 2020 18:03:28 +0100 Subject: [PATCH 0416/1261] bpo-42208: Move _PyImport_Cleanup() to pylifecycle.c (GH-23040) Move _PyImport_Cleanup() to pylifecycle.c, rename it to finalize_modules(), split it (200 lines) into many smaller sub-functions and cleanup the code. --- Python/import.c | 227 --------------------------------- Python/pylifecycle.c | 293 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 290 insertions(+), 230 deletions(-) diff --git a/Python/import.c b/Python/import.c index 8b9cc3066fc4ad..77e6baef011e39 100644 --- a/Python/import.c +++ b/Python/import.c @@ -406,233 +406,6 @@ import_ensure_initialized(PyThreadState *tstate, PyObject *mod, PyObject *name) } -/* List of names to clear in sys */ -static const char * const sys_deletes[] = { - "path", "argv", "ps1", "ps2", - "last_type", "last_value", "last_traceback", - "path_hooks", "path_importer_cache", "meta_path", - "__interactivehook__", - NULL -}; - -static const char * const sys_files[] = { - "stdin", "__stdin__", - "stdout", "__stdout__", - "stderr", "__stderr__", - NULL -}; - -/* Un-initialize things, as good as we can */ - -void -_PyImport_Cleanup(PyThreadState *tstate) -{ - PyInterpreterState *interp = tstate->interp; - PyObject *modules = interp->modules; - if (modules == NULL) { - /* Already done */ - return; - } - - /* Delete some special variables first. These are common - places where user values hide and people complain when their - destructors fail. Since the modules containing them are - deleted *last* of all, they would come too late in the normal - destruction order. Sigh. */ - - /* XXX Perhaps these precautions are obsolete. Who knows? */ - - int verbose = _PyInterpreterState_GetConfig(interp)->verbose; - if (verbose) { - PySys_WriteStderr("# clear builtins._\n"); - } - if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) { - PyErr_WriteUnraisable(NULL); - } - - const char * const *p; - for (p = sys_deletes; *p != NULL; p++) { - if (verbose) { - PySys_WriteStderr("# clear sys.%s\n", *p); - } - if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) { - PyErr_WriteUnraisable(NULL); - } - } - for (p = sys_files; *p != NULL; p+=2) { - if (verbose) { - PySys_WriteStderr("# restore sys.%s\n", *p); - } - PyObject *value = _PyDict_GetItemStringWithError(interp->sysdict, - *(p+1)); - if (value == NULL) { - if (_PyErr_Occurred(tstate)) { - PyErr_WriteUnraisable(NULL); - } - value = Py_None; - } - if (PyDict_SetItemString(interp->sysdict, *p, value) < 0) { - PyErr_WriteUnraisable(NULL); - } - } - - /* We prepare a list which will receive (name, weakref) tuples of - modules when they are removed from sys.modules. The name is used - for diagnosis messages (in verbose mode), while the weakref helps - detect those modules which have been held alive. */ - PyObject *weaklist = PyList_New(0); - if (weaklist == NULL) { - PyErr_WriteUnraisable(NULL); - } - -#define STORE_MODULE_WEAKREF(name, mod) \ - if (weaklist != NULL) { \ - PyObject *wr = PyWeakref_NewRef(mod, NULL); \ - if (wr) { \ - PyObject *tup = PyTuple_Pack(2, name, wr); \ - if (!tup || PyList_Append(weaklist, tup) < 0) { \ - PyErr_WriteUnraisable(NULL); \ - } \ - Py_XDECREF(tup); \ - Py_DECREF(wr); \ - } \ - else { \ - PyErr_WriteUnraisable(NULL); \ - } \ - } -#define CLEAR_MODULE(name, mod) \ - if (PyModule_Check(mod)) { \ - if (verbose && PyUnicode_Check(name)) { \ - PySys_FormatStderr("# cleanup[2] removing %U\n", name); \ - } \ - STORE_MODULE_WEAKREF(name, mod); \ - if (PyObject_SetItem(modules, name, Py_None) < 0) { \ - PyErr_WriteUnraisable(NULL); \ - } \ - } - - /* Remove all modules from sys.modules, hoping that garbage collection - can reclaim most of them. */ - if (PyDict_CheckExact(modules)) { - Py_ssize_t pos = 0; - PyObject *key, *value; - while (PyDict_Next(modules, &pos, &key, &value)) { - CLEAR_MODULE(key, value); - } - } - else { - PyObject *iterator = PyObject_GetIter(modules); - if (iterator == NULL) { - PyErr_WriteUnraisable(NULL); - } - else { - PyObject *key; - while ((key = PyIter_Next(iterator))) { - PyObject *value = PyObject_GetItem(modules, key); - if (value == NULL) { - PyErr_WriteUnraisable(NULL); - continue; - } - CLEAR_MODULE(key, value); - Py_DECREF(value); - Py_DECREF(key); - } - if (PyErr_Occurred()) { - PyErr_WriteUnraisable(NULL); - } - Py_DECREF(iterator); - } - } - - /* Clear the modules dict. */ - if (PyDict_CheckExact(modules)) { - PyDict_Clear(modules); - } - else { - _Py_IDENTIFIER(clear); - if (_PyObject_CallMethodIdNoArgs(modules, &PyId_clear) == NULL) { - PyErr_WriteUnraisable(NULL); - } - } - /* Restore the original builtins dict, to ensure that any - user data gets cleared. */ - PyObject *dict = PyDict_Copy(interp->builtins); - if (dict == NULL) { - PyErr_WriteUnraisable(NULL); - } - PyDict_Clear(interp->builtins); - if (PyDict_Update(interp->builtins, interp->builtins_copy)) { - _PyErr_Clear(tstate); - } - Py_XDECREF(dict); - /* Collect references */ - _PyGC_CollectNoFail(tstate); - /* Dump GC stats before it's too late, since it uses the warnings - machinery. */ - _PyGC_DumpShutdownStats(tstate); - - /* Now, if there are any modules left alive, clear their globals to - minimize potential leaks. All C extension modules actually end - up here, since they are kept alive in the interpreter state. - - The special treatment of "builtins" here is because even - when it's not referenced as a module, its dictionary is - referenced by almost every module's __builtins__. Since - deleting a module clears its dictionary (even if there are - references left to it), we need to delete the "builtins" - module last. Likewise, we don't delete sys until the very - end because it is implicitly referenced (e.g. by print). */ - if (weaklist != NULL) { - Py_ssize_t i; - /* Since dict is ordered in CPython 3.6+, modules are saved in - importing order. First clear modules imported later. */ - for (i = PyList_GET_SIZE(weaklist) - 1; i >= 0; i--) { - PyObject *tup = PyList_GET_ITEM(weaklist, i); - PyObject *name = PyTuple_GET_ITEM(tup, 0); - PyObject *mod = PyWeakref_GET_OBJECT(PyTuple_GET_ITEM(tup, 1)); - if (mod == Py_None) - continue; - assert(PyModule_Check(mod)); - dict = PyModule_GetDict(mod); - if (dict == interp->builtins || dict == interp->sysdict) - continue; - Py_INCREF(mod); - if (verbose && PyUnicode_Check(name)) { - PySys_FormatStderr("# cleanup[3] wiping %U\n", name); - } - _PyModule_Clear(mod); - Py_DECREF(mod); - } - Py_DECREF(weaklist); - } - - /* Next, delete sys and builtins (in that order) */ - if (verbose) { - PySys_FormatStderr("# cleanup[3] wiping sys\n"); - } - _PyModule_ClearDict(interp->sysdict); - if (verbose) { - PySys_FormatStderr("# cleanup[3] wiping builtins\n"); - } - _PyModule_ClearDict(interp->builtins); - - /* Clear module dict copies stored in the interpreter state */ - _PyInterpreterState_ClearModules(interp); - - /* Clear and delete the modules directory. Actual modules will - still be there only if imported during the execution of some - destructor. */ - interp->modules = NULL; - Py_DECREF(modules); - - /* Once more */ - _PyGC_CollectNoFail(tstate); - -#undef CLEAR_MODULE -#undef STORE_MODULE_WEAKREF -} - - /* Helper for pythonrun.c -- return magic number and tag. */ long diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 71834f63f2a78d..adef1617f61325 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -8,7 +8,6 @@ #include "pycore_ceval.h" // _PyEval_FiniGIL() #include "pycore_context.h" // _PyContext_Init() #include "pycore_fileutils.h" // _Py_ResetForceASCII() -#include "pycore_import.h" // _PyImport_Cleanup() #include "pycore_initconfig.h" // _PyStatus_OK() #include "pycore_object.h" // _PyDebug_PrintTotalRefs() #include "pycore_pathconfig.h" // _PyConfig_WritePathConfig() @@ -1192,6 +1191,292 @@ Py_Initialize(void) } +static void +finalize_modules_delete_special(PyThreadState *tstate, int verbose) +{ + // List of names to clear in sys + static const char * const sys_deletes[] = { + "path", "argv", "ps1", "ps2", + "last_type", "last_value", "last_traceback", + "path_hooks", "path_importer_cache", "meta_path", + "__interactivehook__", + NULL + }; + + static const char * const sys_files[] = { + "stdin", "__stdin__", + "stdout", "__stdout__", + "stderr", "__stderr__", + NULL + }; + + PyInterpreterState *interp = tstate->interp; + if (verbose) { + PySys_WriteStderr("# clear builtins._\n"); + } + if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) { + PyErr_WriteUnraisable(NULL); + } + + const char * const *p; + for (p = sys_deletes; *p != NULL; p++) { + if (verbose) { + PySys_WriteStderr("# clear sys.%s\n", *p); + } + if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) { + PyErr_WriteUnraisable(NULL); + } + } + for (p = sys_files; *p != NULL; p+=2) { + const char *name = p[0]; + const char *orig_name = p[1]; + if (verbose) { + PySys_WriteStderr("# restore sys.%s\n", name); + } + PyObject *value = _PyDict_GetItemStringWithError(interp->sysdict, + orig_name); + if (value == NULL) { + if (_PyErr_Occurred(tstate)) { + PyErr_WriteUnraisable(NULL); + } + value = Py_None; + } + if (PyDict_SetItemString(interp->sysdict, name, value) < 0) { + PyErr_WriteUnraisable(NULL); + } + } +} + + +static PyObject* +finalize_remove_modules(PyObject *modules, int verbose) +{ + PyObject *weaklist = PyList_New(0); + if (weaklist == NULL) { + PyErr_WriteUnraisable(NULL); + } + +#define STORE_MODULE_WEAKREF(name, mod) \ + if (weaklist != NULL) { \ + PyObject *wr = PyWeakref_NewRef(mod, NULL); \ + if (wr) { \ + PyObject *tup = PyTuple_Pack(2, name, wr); \ + if (!tup || PyList_Append(weaklist, tup) < 0) { \ + PyErr_WriteUnraisable(NULL); \ + } \ + Py_XDECREF(tup); \ + Py_DECREF(wr); \ + } \ + else { \ + PyErr_WriteUnraisable(NULL); \ + } \ + } + +#define CLEAR_MODULE(name, mod) \ + if (PyModule_Check(mod)) { \ + if (verbose && PyUnicode_Check(name)) { \ + PySys_FormatStderr("# cleanup[2] removing %U\n", name); \ + } \ + STORE_MODULE_WEAKREF(name, mod); \ + if (PyObject_SetItem(modules, name, Py_None) < 0) { \ + PyErr_WriteUnraisable(NULL); \ + } \ + } + + if (PyDict_CheckExact(modules)) { + Py_ssize_t pos = 0; + PyObject *key, *value; + while (PyDict_Next(modules, &pos, &key, &value)) { + CLEAR_MODULE(key, value); + } + } + else { + PyObject *iterator = PyObject_GetIter(modules); + if (iterator == NULL) { + PyErr_WriteUnraisable(NULL); + } + else { + PyObject *key; + while ((key = PyIter_Next(iterator))) { + PyObject *value = PyObject_GetItem(modules, key); + if (value == NULL) { + PyErr_WriteUnraisable(NULL); + continue; + } + CLEAR_MODULE(key, value); + Py_DECREF(value); + Py_DECREF(key); + } + if (PyErr_Occurred()) { + PyErr_WriteUnraisable(NULL); + } + Py_DECREF(iterator); + } + } +#undef CLEAR_MODULE +#undef STORE_MODULE_WEAKREF + + return weaklist; +} + + +static void +finalize_clear_modules_dict(PyObject *modules) +{ + if (PyDict_CheckExact(modules)) { + PyDict_Clear(modules); + } + else { + _Py_IDENTIFIER(clear); + if (_PyObject_CallMethodIdNoArgs(modules, &PyId_clear) == NULL) { + PyErr_WriteUnraisable(NULL); + } + } +} + + +static void +finalize_restore_builtins(PyThreadState *tstate) +{ + PyInterpreterState *interp = tstate->interp; + PyObject *dict = PyDict_Copy(interp->builtins); + if (dict == NULL) { + PyErr_WriteUnraisable(NULL); + } + PyDict_Clear(interp->builtins); + if (PyDict_Update(interp->builtins, interp->builtins_copy)) { + _PyErr_Clear(tstate); + } + Py_XDECREF(dict); +} + + +static void +finalize_modules_clear_weaklist(PyInterpreterState *interp, + PyObject *weaklist, int verbose) +{ + // First clear modules imported later + for (Py_ssize_t i = PyList_GET_SIZE(weaklist) - 1; i >= 0; i--) { + PyObject *tup = PyList_GET_ITEM(weaklist, i); + PyObject *name = PyTuple_GET_ITEM(tup, 0); + PyObject *mod = PyWeakref_GET_OBJECT(PyTuple_GET_ITEM(tup, 1)); + if (mod == Py_None) { + continue; + } + assert(PyModule_Check(mod)); + PyObject *dict = PyModule_GetDict(mod); + if (dict == interp->builtins || dict == interp->sysdict) { + continue; + } + Py_INCREF(mod); + if (verbose && PyUnicode_Check(name)) { + PySys_FormatStderr("# cleanup[3] wiping %U\n", name); + } + _PyModule_Clear(mod); + Py_DECREF(mod); + } +} + + +static void +finalize_clear_sys_builtins_dict(PyInterpreterState *interp, int verbose) +{ + // Clear sys dict + if (verbose) { + PySys_FormatStderr("# cleanup[3] wiping sys\n"); + } + _PyModule_ClearDict(interp->sysdict); + + // Clear builtins dict + if (verbose) { + PySys_FormatStderr("# cleanup[3] wiping builtins\n"); + } + _PyModule_ClearDict(interp->builtins); +} + + +/* Clear modules, as good as we can */ +static void +finalize_modules(PyThreadState *tstate) +{ + PyInterpreterState *interp = tstate->interp; + PyObject *modules = interp->modules; + if (modules == NULL) { + // Already done + return; + } + int verbose = _PyInterpreterState_GetConfig(interp)->verbose; + + // Delete some special builtins._ and sys attributes first. These are + // common places where user values hide and people complain when their + // destructors fail. Since the modules containing them are + // deleted *last* of all, they would come too late in the normal + // destruction order. Sigh. + // + // XXX Perhaps these precautions are obsolete. Who knows? + finalize_modules_delete_special(tstate, verbose); + + // Remove all modules from sys.modules, hoping that garbage collection + // can reclaim most of them: set all sys.modules values to None. + // + // We prepare a list which will receive (name, weakref) tuples of + // modules when they are removed from sys.modules. The name is used + // for diagnosis messages (in verbose mode), while the weakref helps + // detect those modules which have been held alive. + PyObject *weaklist = finalize_remove_modules(modules, verbose); + + // Clear the modules dict + finalize_clear_modules_dict(modules); + + // Restore the original builtins dict, to ensure that any + // user data gets cleared. + finalize_restore_builtins(tstate); + + // Collect garbage + _PyGC_CollectNoFail(tstate); + + // Dump GC stats before it's too late, since it uses the warnings + // machinery. + _PyGC_DumpShutdownStats(tstate); + + if (weaklist != NULL) { + // Now, if there are any modules left alive, clear their globals to + // minimize potential leaks. All C extension modules actually end + // up here, since they are kept alive in the interpreter state. + // + // The special treatment of "builtins" here is because even + // when it's not referenced as a module, its dictionary is + // referenced by almost every module's __builtins__. Since + // deleting a module clears its dictionary (even if there are + // references left to it), we need to delete the "builtins" + // module last. Likewise, we don't delete sys until the very + // end because it is implicitly referenced (e.g. by print). + // + // Since dict is ordered in CPython 3.6+, modules are saved in + // importing order. First clear modules imported later. + finalize_modules_clear_weaklist(interp, weaklist, verbose); + Py_DECREF(weaklist); + } + + // Clear sys and builtins modules dict + finalize_clear_sys_builtins_dict(interp, verbose); + + // Clear module dict copies stored in the interpreter state: + // clear PyInterpreterState.modules_by_index and + // clear PyModuleDef.m_base.m_copy (of extensions not using the multi-phase + // initialization API) + _PyInterpreterState_ClearModules(interp); + + // Clear and delete the modules directory. Actual modules will + // still be there only if imported during the execution of some + // destructor. + Py_SETREF(interp->modules, NULL); + + // Collect garbage once more + _PyGC_CollectNoFail(tstate); +} + + /* Flush stdout and stderr */ static int @@ -1210,6 +1495,7 @@ file_is_closed(PyObject *fobj) return r > 0; } + static int flush_std_files(void) { @@ -1417,7 +1703,7 @@ Py_FinalizeEx(void) PyGC_Collect(); /* Destroy all modules */ - _PyImport_Cleanup(tstate); + finalize_modules(tstate); /* Print debug stats if any */ _PyEval_Fini(); @@ -1660,7 +1946,8 @@ Py_EndInterpreter(PyThreadState *tstate) Py_FatalError("not the last thread"); } - _PyImport_Cleanup(tstate); + finalize_modules(tstate); + finalize_interp_clear(tstate); finalize_interp_delete(tstate); } From e5ea5ad3f8c1464119e384768ddef5a9f72d8854 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 30 Oct 2020 21:09:48 +0100 Subject: [PATCH 0417/1261] bpo-42208: Fix test_gdb for gc_collect_main() name (GH-23041) The gcmodule.c collect() function was renamed to gc_collect_main(): update gdb/libpython.py (python-gdb.py). --- Tools/gdb/libpython.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index 33bf5ac821fffc..83a5fa93cf447e 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -1605,8 +1605,8 @@ def is_waiting_for_gil(self): return (name == 'take_gil') def is_gc_collect(self): - '''Is this frame "collect" within the garbage-collector?''' - return self._gdbframe.name() == 'collect' + '''Is this frame gc_collect_main() within the garbage-collector?''' + return self._gdbframe.name() in ('collect', 'gc_collect_main') def get_pyop(self): try: From 39e0572d753de9e26faf5e38fb356b36f60b3825 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Fri, 30 Oct 2020 15:46:52 -0600 Subject: [PATCH 0418/1261] bpo-36876: Small adjustments to the C-analyzer tool. (GH-23045) This is a little bit of clean-up, small fixes, and additional helpers prior to building an updated & accurate list of globals to eliminate. --- Tools/c-analyzer/c_analyzer/__init__.py | 8 +- Tools/c-analyzer/c_analyzer/__main__.py | 104 +++++---- Tools/c-analyzer/c_analyzer/analyze.py | 6 +- Tools/c-analyzer/c_analyzer/datafiles.py | 3 +- Tools/c-analyzer/c_analyzer/info.py | 42 +--- Tools/c-analyzer/c_analyzer/match.py | 212 +++++++++++++++++++ Tools/c-analyzer/c_common/scriptutil.py | 51 ++++- Tools/c-analyzer/c_parser/datafiles.py | 2 +- Tools/c-analyzer/c_parser/info.py | 166 ++++----------- Tools/c-analyzer/c_parser/match.py | 177 ++++++++++++++++ Tools/c-analyzer/c_parser/parser/__init__.py | 6 +- Tools/c-analyzer/c_parser/parser/_info.py | 15 ++ Tools/c-analyzer/c_parser/parser/_regexes.py | 3 +- Tools/c-analyzer/cpython/__main__.py | 5 +- Tools/c-analyzer/cpython/_analyzer.py | 7 +- Tools/c-analyzer/cpython/_parser.py | 44 +++- 16 files changed, 633 insertions(+), 218 deletions(-) create mode 100644 Tools/c-analyzer/c_analyzer/match.py create mode 100644 Tools/c-analyzer/c_parser/match.py diff --git a/Tools/c-analyzer/c_analyzer/__init__.py b/Tools/c-analyzer/c_analyzer/__init__.py index 4a01cd396f5f5f..171fa25102bffc 100644 --- a/Tools/c-analyzer/c_analyzer/__init__.py +++ b/Tools/c-analyzer/c_analyzer/__init__.py @@ -4,10 +4,12 @@ from c_parser.info import ( KIND, TypeDeclaration, - filter_by_kind, - collate_by_kind_group, resolve_parsed, ) +from c_parser.match import ( + filter_by_kind, + group_by_kinds, +) from . import ( analyze as _analyze, datafiles as _datafiles, @@ -55,7 +57,7 @@ def analyze_decls(decls, known, *, ) decls = list(decls) - collated = collate_by_kind_group(decls) + collated = group_by_kinds(decls) types = {decl: None for decl in collated['type']} typespecs = _analyze.get_typespecs(types) diff --git a/Tools/c-analyzer/c_analyzer/__main__.py b/Tools/c-analyzer/c_analyzer/__main__.py index 1fd45b985d9bcf..4cff1d4efb5fe9 100644 --- a/Tools/c-analyzer/c_analyzer/__main__.py +++ b/Tools/c-analyzer/c_analyzer/__main__.py @@ -1,5 +1,6 @@ import io import logging +import os import os.path import re import sys @@ -9,6 +10,7 @@ add_verbosity_cli, add_traceback_cli, add_sepval_cli, + add_progress_cli, add_files_cli, add_commands_cli, process_args_by_key, @@ -17,11 +19,13 @@ filter_filenames, iter_marks, ) -from c_parser.info import KIND, is_type_decl +from c_parser.info import KIND +from c_parser.match import is_type_decl +from .match import filter_forward from . import ( analyze as _analyze, - check_all as _check_all, datafiles as _datafiles, + check_all as _check_all, ) @@ -44,7 +48,7 @@ TABLE_SECTIONS = { 'types': ( ['kind', 'name', 'data', 'file'], - is_type_decl, + KIND.is_type_decl, (lambda v: (v.kind.value, v.filename or '', v.name)), ), 'typedefs': 'types', @@ -167,9 +171,7 @@ def handle_failure(failure, data): print(f'{data.filename}:{name} - {failure}') elif fmt == 'summary': def handle_failure(failure, data): - parent = data.parent or '' - funcname = parent if isinstance(parent, str) else parent.name - print(f'{data.filename:35}\t{funcname or "-":35}\t{data.name:40}\t{failure}') + print(_fmt_one_summary(data, failure)) elif fmt == 'full': div = '' def handle_failure(failure, data): @@ -230,6 +232,15 @@ def section(name): yield f'grand total: {total}' +def _fmt_one_summary(item, extra=None): + parent = item.parent or '' + funcname = parent if isinstance(parent, str) else parent.name + if extra: + return f'{item.filename:35}\t{funcname or "-":35}\t{item.name:40}\t{extra}' + else: + return f'{item.filename:35}\t{funcname or "-":35}\t{item.name}' + + def fmt_full(analysis): # XXX Support sorting. items = sorted(analysis, key=lambda v: v.key) @@ -272,10 +283,12 @@ def process_checks(args): args.checks = [check] else: process_checks = add_checks_cli(parser, checks=checks) + process_progress = add_progress_cli(parser) process_output = add_output_cli(parser, default=None) process_files = add_files_cli(parser, **kwargs) return [ process_checks, + process_progress, process_output, process_files, ] @@ -288,6 +301,7 @@ def cmd_check(filenames, *, relroot=None, failfast=False, iter_filenames=None, + track_progress=None, verbosity=VERBOSITY, _analyze=_analyze, _CHECKS=CHECKS, @@ -304,36 +318,53 @@ def cmd_check(filenames, *, ) = _get_check_handlers(fmt, printer, verbosity) filenames = filter_filenames(filenames, iter_filenames) + if track_progress: + filenames = track_progress(filenames) - logger.info('analyzing...') + logger.info('analyzing files...') analyzed = _analyze(filenames, **kwargs) if relroot: analyzed.fix_filenames(relroot) + decls = filter_forward(analyzed, markpublic=True) - logger.info('checking...') - numfailed = 0 - for data, failure in _check_all(analyzed, checks, failfast=failfast): + logger.info('checking analysis results...') + failed = [] + for data, failure in _check_all(decls, checks, failfast=failfast): if data is None: printer.info('stopping after one failure') break - if div is not None and numfailed > 0: + if div is not None and len(failed) > 0: printer.info(div) - numfailed += 1 + failed.append(data) handle_failure(failure, data) handle_after() printer.info('-------------------------') - logger.info(f'total failures: {numfailed}') + logger.info(f'total failures: {len(failed)}') logger.info('done checking') - if numfailed > 0: - sys.exit(numfailed) + if fmt == 'summary': + print('Categorized by storage:') + print() + from .match import group_by_storage + grouped = group_by_storage(failed, ignore_non_match=False) + for group, decls in grouped.items(): + print() + print(group) + for decl in decls: + print(' ', _fmt_one_summary(decl)) + print(f'subtotal: {len(decls)}') + + if len(failed) > 0: + sys.exit(len(failed)) def _cli_analyze(parser, **kwargs): + process_progress = add_progress_cli(parser) process_output = add_output_cli(parser) process_files = add_files_cli(parser, **kwargs) return [ + process_progress, process_output, process_files, ] @@ -343,6 +374,7 @@ def _cli_analyze(parser, **kwargs): def cmd_analyze(filenames, *, fmt=None, iter_filenames=None, + track_progress=None, verbosity=None, _analyze=_analyze, formats=FORMATS, @@ -356,49 +388,46 @@ def cmd_analyze(filenames, *, raise ValueError(f'unsupported fmt {fmt!r}') filenames = filter_filenames(filenames, iter_filenames) - if verbosity == 2: - def iter_filenames(filenames=filenames): - marks = iter_marks() - for filename in filenames: - print(next(marks), end='') - yield filename - filenames = iter_filenames() - elif verbosity > 2: - def iter_filenames(filenames=filenames): - for filename in filenames: - print(f'<{filename}>') - yield filename - filenames = iter_filenames() - - logger.info('analyzing...') + if track_progress: + filenames = track_progress(filenames) + + logger.info('analyzing files...') analyzed = _analyze(filenames, **kwargs) + decls = filter_forward(analyzed, markpublic=True) - for line in do_fmt(analyzed): + for line in do_fmt(decls): print(line) def _cli_data(parser, filenames=None, known=None): ArgumentParser = type(parser) common = ArgumentParser(add_help=False) - if filenames is None: - common.add_argument('filenames', metavar='FILE', nargs='+') + # These flags will get processed by the top-level parse_args(). + add_verbosity_cli(common) + add_traceback_cli(common) subs = parser.add_subparsers(dest='datacmd') sub = subs.add_parser('show', parents=[common]) if known is None: sub.add_argument('--known', required=True) + if filenames is None: + sub.add_argument('filenames', metavar='FILE', nargs='+') - sub = subs.add_parser('dump') + sub = subs.add_parser('dump', parents=[common]) if known is None: sub.add_argument('--known') sub.add_argument('--show', action='store_true') + process_progress = add_progress_cli(sub) - sub = subs.add_parser('check') + sub = subs.add_parser('check', parents=[common]) if known is None: sub.add_argument('--known', required=True) - return None + def process_args(args): + if args.datacmd == 'dump': + process_progress(args) + return process_args def cmd_data(datacmd, filenames, known=None, *, @@ -406,6 +435,7 @@ def cmd_data(datacmd, filenames, known=None, *, formats=FORMATS, extracolumns=None, relroot=None, + track_progress=None, **kwargs ): kwargs.pop('verbosity', None) @@ -417,6 +447,8 @@ def cmd_data(datacmd, filenames, known=None, *, for line in do_fmt(known): print(line) elif datacmd == 'dump': + if track_progress: + filenames = track_progress(filenames) analyzed = _analyze(filenames, **kwargs) if known is None or usestdout: outfile = io.StringIO() diff --git a/Tools/c-analyzer/c_analyzer/analyze.py b/Tools/c-analyzer/c_analyzer/analyze.py index d8ae915e420029..267d058e07abdb 100644 --- a/Tools/c-analyzer/c_analyzer/analyze.py +++ b/Tools/c-analyzer/c_analyzer/analyze.py @@ -3,15 +3,19 @@ TypeDeclaration, POTSType, FuncPtr, +) +from c_parser.match import ( is_pots, is_funcptr, ) from .info import ( IGNORED, UNKNOWN, - is_system_type, SystemType, ) +from .match import ( + is_system_type, +) def get_typespecs(typedecls): diff --git a/Tools/c-analyzer/c_analyzer/datafiles.py b/Tools/c-analyzer/c_analyzer/datafiles.py index 0de438cce470fd..d37a4eefe351ad 100644 --- a/Tools/c-analyzer/c_analyzer/datafiles.py +++ b/Tools/c-analyzer/c_analyzer/datafiles.py @@ -1,5 +1,6 @@ import c_common.tables as _tables import c_parser.info as _info +import c_parser.match as _match import c_parser.datafiles as _parser from . import analyze as _analyze @@ -17,7 +18,7 @@ def analyze_known(known, *, handle_unresolved=True, ): knowntypes = knowntypespecs = {} - collated = _info.collate_by_kind_group(known) + collated = _match.group_by_kinds(known) types = {decl: None for decl in collated['type']} typespecs = _analyze.get_typespecs(types) def analyze_decl(decl): diff --git a/Tools/c-analyzer/c_analyzer/info.py b/Tools/c-analyzer/c_analyzer/info.py index 23d77611a4c3ca..be9281502d250d 100644 --- a/Tools/c-analyzer/c_analyzer/info.py +++ b/Tools/c-analyzer/c_analyzer/info.py @@ -7,7 +7,11 @@ HighlevelParsedItem, Declaration, TypeDeclaration, +) +from c_parser.match import ( is_type_decl, +) +from .match import ( is_process_global, ) @@ -16,44 +20,6 @@ UNKNOWN = _misc.Labeled('UNKNOWN') -# XXX Use known.tsv for these? -SYSTEM_TYPES = { - 'int8_t', - 'uint8_t', - 'int16_t', - 'uint16_t', - 'int32_t', - 'uint32_t', - 'int64_t', - 'uint64_t', - 'size_t', - 'ssize_t', - 'intptr_t', - 'uintptr_t', - 'wchar_t', - '', - # OS-specific - 'pthread_cond_t', - 'pthread_mutex_t', - 'pthread_key_t', - 'atomic_int', - 'atomic_uintptr_t', - '', - # lib-specific - 'WINDOW', # curses - 'XML_LChar', - 'XML_Size', - 'XML_Parser', - 'enum XML_Error', - 'enum XML_Status', - '', -} - - -def is_system_type(typespec): - return typespec in SYSTEM_TYPES - - class SystemType(TypeDeclaration): def __init__(self, name): diff --git a/Tools/c-analyzer/c_analyzer/match.py b/Tools/c-analyzer/c_analyzer/match.py new file mode 100644 index 00000000000000..5c27e4a224afc8 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/match.py @@ -0,0 +1,212 @@ +import os.path + +from c_parser import ( + info as _info, + match as _match, +) + + +_KIND = _info.KIND + + +# XXX Use known.tsv for these? +SYSTEM_TYPES = { + 'int8_t', + 'uint8_t', + 'int16_t', + 'uint16_t', + 'int32_t', + 'uint32_t', + 'int64_t', + 'uint64_t', + 'size_t', + 'ssize_t', + 'intptr_t', + 'uintptr_t', + 'wchar_t', + '', + # OS-specific + 'pthread_cond_t', + 'pthread_mutex_t', + 'pthread_key_t', + 'atomic_int', + 'atomic_uintptr_t', + '', + # lib-specific + 'WINDOW', # curses + 'XML_LChar', + 'XML_Size', + 'XML_Parser', + 'enum XML_Error', + 'enum XML_Status', + '', +} + + +def is_system_type(typespec): + return typespec in SYSTEM_TYPES + + +################################## +# decl matchers + +def is_public(decl): + if not decl.filename.endswith('.h'): + return False + if 'Include' not in decl.filename.split(os.path.sep): + return False + return True + + +def is_process_global(vardecl): + kind, storage, _, _, _ = _info.get_parsed_vartype(vardecl) + if kind is not _KIND.VARIABLE: + raise NotImplementedError(vardecl) + if 'static' in (storage or ''): + return True + + if hasattr(vardecl, 'parent'): + parent = vardecl.parent + else: + parent = vardecl.get('parent') + return not parent + + +def is_fixed_type(vardecl): + if not vardecl: + return None + _, _, _, typespec, abstract = _info.get_parsed_vartype(vardecl) + if 'typeof' in typespec: + raise NotImplementedError(vardecl) + elif not abstract: + return True + + if '*' not in abstract: + # XXX What about []? + return True + elif _match._is_funcptr(abstract): + return True + else: + for after in abstract.split('*')[1:]: + if not after.lstrip().startswith('const'): + return False + else: + return True + + +def is_immutable(vardecl): + if not vardecl: + return None + if not is_fixed_type(vardecl): + return False + _, _, typequal, _, _ = _info.get_parsed_vartype(vardecl) + # If there, it can only be "const" or "volatile". + return typequal == 'const' + + +def is_public_api(decl): + if not is_public(decl): + return False + if decl.kind is _KIND.TYPEDEF: + return True + elif _match.is_type_decl(decl): + return not _match.is_forward_decl(decl) + else: + return _match.is_external_reference(decl) + + +def is_public_declaration(decl): + if not is_public(decl): + return False + if decl.kind is _KIND.TYPEDEF: + return True + elif _match.is_type_decl(decl): + return _match.is_forward_decl(decl) + else: + return _match.is_external_reference(decl) + + +def is_public_definition(decl): + if not is_public(decl): + return False + if decl.kind is _KIND.TYPEDEF: + return True + elif _match.is_type_decl(decl): + return not _match.is_forward_decl(decl) + else: + return not _match.is_external_reference(decl) + + +def is_public_impl(decl): + if not _KIND.is_decl(decl.kind): + return False + # See filter_forward() about "is_public". + return getattr(decl, 'is_public', False) + + +def is_module_global_decl(decl): + if is_public_impl(decl): + return False + if _match.is_forward_decl(decl): + return False + return not _match.is_local_var(decl) + + +################################## +# filtering with matchers + +def filter_forward(items, *, markpublic=False): + if markpublic: + public = set() + actual = [] + for item in items: + if is_public_api(item): + public.add(item.id) + elif not _match.is_forward_decl(item): + actual.append(item) + else: + # non-public duplicate! + # XXX + raise Exception(item) + for item in actual: + _info.set_flag(item, 'is_public', item.id in public) + yield item + else: + for item in items: + if _match.is_forward_decl(item): + continue + yield item + + +################################## +# grouping with matchers + +def group_by_storage(decls, **kwargs): + def is_module_global(decl): + if not is_module_global_decl(decl): + return False + if decl.kind == _KIND.VARIABLE: + if _info.get_effective_storage(decl) == 'static': + # This is covered by is_static_module_global(). + return False + return True + def is_static_module_global(decl): + if not _match.is_global_var(decl): + return False + return _info.get_effective_storage(decl) == 'static' + def is_static_local(decl): + if not _match.is_local_var(decl): + return False + return _info.get_effective_storage(decl) == 'static' + #def is_local(decl): + # if not _match.is_local_var(decl): + # return False + # return _info.get_effective_storage(decl) != 'static' + categories = { + #'extern': is_extern, + 'published': is_public_impl, + 'module-global': is_module_global, + 'static-module-global': is_static_module_global, + 'static-local': is_static_local, + } + return _match.group_by_category(decls, categories, **kwargs) diff --git a/Tools/c-analyzer/c_common/scriptutil.py b/Tools/c-analyzer/c_common/scriptutil.py index 939a85003b2964..222059015d76ec 100644 --- a/Tools/c-analyzer/c_common/scriptutil.py +++ b/Tools/c-analyzer/c_common/scriptutil.py @@ -10,6 +10,9 @@ from . import fsutil, strutil, iterutil, logging as loggingutil +_NOT_SET = object() + + def get_prog(spec=None, *, absolute=False, allowsuffix=True): if spec is None: _, spec = _find_script() @@ -313,6 +316,22 @@ def _parse_files(filenames): yield filename.strip() +def add_progress_cli(parser, *, threshold=VERBOSITY, **kwargs): + parser.add_argument('--progress', dest='track_progress', action='store_const', const=True) + parser.add_argument('--no-progress', dest='track_progress', action='store_false') + parser.set_defaults(track_progress=True) + + def process_args(args): + if args.track_progress: + ns = vars(args) + verbosity = ns.get('verbosity', VERBOSITY) + if verbosity <= threshold: + args.track_progress = track_progress_compact + else: + args.track_progress = track_progress_flat + return process_args + + def add_failure_filtering_cli(parser, pool, *, default=False): parser.add_argument('--fail', action='append', metavar=f'"{{all|{"|".join(sorted(pool))}}},..."') @@ -551,13 +570,39 @@ def _iter_filenames(filenames, iter_files): raise NotImplementedError -def iter_marks(mark='.', *, group=5, groups=2, lines=10, sep=' '): +def track_progress_compact(items, *, groups=5, **mark_kwargs): + last = os.linesep + marks = iter_marks(groups=groups, **mark_kwargs) + for item in items: + last = next(marks) + print(last, end='', flush=True) + yield item + if not last.endswith(os.linesep): + print() + + +def track_progress_flat(items, fmt='<{}>'): + for item in items: + print(fmt.format(item), flush=True) + yield item + + +def iter_marks(mark='.', *, group=5, groups=2, lines=_NOT_SET, sep=' '): mark = mark or '' + group = group if group and group > 1 else 1 + groups = groups if groups and groups > 1 else 1 + sep = f'{mark}{sep}' if sep else mark end = f'{mark}{os.linesep}' div = os.linesep perline = group * groups - perlines = perline * lines + if lines is _NOT_SET: + # By default we try to put about 100 in each line group. + perlines = 100 // perline * perline + elif not lines or lines < 0: + perlines = None + else: + perlines = perline * lines if perline == 1: yield end @@ -568,7 +613,7 @@ def iter_marks(mark='.', *, group=5, groups=2, lines=10, sep=' '): while True: if count % perline == 0: yield end - if count % perlines == 0: + if perlines and count % perlines == 0: yield div elif count % group == 0: yield sep diff --git a/Tools/c-analyzer/c_parser/datafiles.py b/Tools/c-analyzer/c_parser/datafiles.py index 5bdb946b1772ab..cdd69b1f9b2d8a 100644 --- a/Tools/c-analyzer/c_parser/datafiles.py +++ b/Tools/c-analyzer/c_parser/datafiles.py @@ -92,7 +92,7 @@ def write_decls_tsv(decls, outfile, extracolumns=None, *, **kwargs ): # XXX Move the row rendering here. - _write_decls_tsv(rows, outfile, extracolumns, relroot, kwargs) + _write_decls_tsv(decls, outfile, extracolumns, relroot, kwargs) def _iter_decls_tsv(infile, extracolumns=None, relroot=None): diff --git a/Tools/c-analyzer/c_parser/info.py b/Tools/c-analyzer/c_parser/info.py index a07ce2e0ccb8d3..798a45d2e08e71 100644 --- a/Tools/c-analyzer/c_parser/info.py +++ b/Tools/c-analyzer/c_parser/info.py @@ -7,85 +7,12 @@ import c_common.misc as _misc import c_common.strutil as _strutil import c_common.tables as _tables -from .parser._regexes import SIMPLE_TYPE +from .parser._regexes import SIMPLE_TYPE, _STORAGE FIXED_TYPE = _misc.Labeled('FIXED_TYPE') -POTS_REGEX = re.compile(rf'^{SIMPLE_TYPE}$', re.VERBOSE) - - -def is_pots(typespec): - if not typespec: - return None - if type(typespec) is not str: - _, _, _, typespec, _ = get_parsed_vartype(typespec) - return POTS_REGEX.match(typespec) is not None - - -def is_funcptr(vartype): - if not vartype: - return None - _, _, _, _, abstract = get_parsed_vartype(vartype) - return _is_funcptr(abstract) - - -def _is_funcptr(declstr): - if not declstr: - return None - # XXX Support "(*)(". - return '(*)(' in declstr.replace(' ', '') - - -def is_exported_symbol(decl): - _, storage, _, _, _ = get_parsed_vartype(decl) - raise NotImplementedError - - -def is_process_global(vardecl): - kind, storage, _, _, _ = get_parsed_vartype(vardecl) - if kind is not KIND.VARIABLE: - raise NotImplementedError(vardecl) - if 'static' in (storage or ''): - return True - - if hasattr(vardecl, 'parent'): - parent = vardecl.parent - else: - parent = vardecl.get('parent') - return not parent - - -def is_fixed_type(vardecl): - if not vardecl: - return None - _, _, _, typespec, abstract = get_parsed_vartype(vardecl) - if 'typeof' in typespec: - raise NotImplementedError(vardecl) - elif not abstract: - return True - - if '*' not in abstract: - # XXX What about []? - return True - elif _is_funcptr(abstract): - return True - else: - for after in abstract.split('*')[1:]: - if not after.lstrip().startswith('const'): - return False - else: - return True - - -def is_immutable(vardecl): - if not vardecl: - return None - if not is_fixed_type(vardecl): - return False - _, _, typequal, _, _ = get_parsed_vartype(vardecl) - # If there, it can only be "const" or "volatile". - return typequal == 'const' +STORAGE = frozenset(_STORAGE) ############################# @@ -214,58 +141,8 @@ def resolve_group(cls, group): KIND._GROUPS.update((k.value, {k}) for k in KIND) -# The module-level kind-related helpers (below) deal with .kind: - -def is_type_decl(kind): - # Handle ParsedItem, Declaration, etc.. - kind = getattr(kind, 'kind', kind) - return KIND.is_type_decl(kind) - - -def is_decl(kind): - # Handle ParsedItem, Declaration, etc.. - kind = getattr(kind, 'kind', kind) - return KIND.is_decl(kind) - - -def filter_by_kind(items, kind): - if kind == 'type': - kinds = KIND._TYPE_DECLS - elif kind == 'decl': - kinds = KIND._TYPE_DECLS - try: - okay = kind in KIND - except TypeError: - kinds = set(kind) - else: - kinds = {kind} if okay else set(kind) - for item in items: - if item.kind in kinds: - yield item - - -def collate_by_kind(items): - collated = {kind: [] for kind in KIND} - for item in items: - try: - collated[item.kind].append(item) - except KeyError: - raise ValueError(f'unsupported kind in {item!r}') - return collated - - -def get_kind_group(kind): - # Handle ParsedItem, Declaration, etc.. - kind = getattr(kind, 'kind', kind) - return KIND.get_group(kind) - - -def collate_by_kind_group(items): - collated = {KIND.get_group(k): [] for k in KIND} - for item in items: - group = KIND.get_group(item.kind) - collated[group].append(item) - return collated +def get_kind_group(item): + return KIND.get_group(item.kind) ############################# @@ -484,6 +361,27 @@ def get_parsed_vartype(decl): return kind, storage, typequal, typespec, abstract +def get_default_storage(decl): + if decl.kind not in (KIND.VARIABLE, KIND.FUNCTION): + return None + return 'extern' if decl.parent is None else 'auto' + + +def get_effective_storage(decl, *, default=None): + # Note that "static" limits access to just that C module + # and "extern" (the default for module-level) allows access + # outside the C module. + if default is None: + default = get_default_storage(decl) + if default is None: + return None + try: + storage = decl.storage + except AttributeError: + storage, _ = _get_vartype(decl.data) + return storage or default + + ############################# # high-level @@ -997,7 +895,7 @@ def _unformat_data(cls, datastr, fmt=None): def __init__(self, file, name, data, parent=None, storage=None): super().__init__(file, name, data, parent, - _extra={'storage': storage}, + _extra={'storage': storage or None}, _shortkey=f'({parent.name}).{name}' if parent else name, _key=(str(file), # Tilde comes after all other ascii characters. @@ -1005,6 +903,11 @@ def __init__(self, file, name, data, parent=None, storage=None): name, ), ) + if storage: + if storage not in STORAGE: + # The parser must need an update. + raise NotImplementedError(storage) + # Otherwise we trust the compiler to have validated it. @property def vartype(self): @@ -1413,6 +1316,13 @@ def resolve_parsed(parsed): return cls.from_parsed(parsed) +def set_flag(item, name, value): + try: + setattr(item, name, value) + except AttributeError: + object.__setattr__(item, name, value) + + ############################# # composite diff --git a/Tools/c-analyzer/c_parser/match.py b/Tools/c-analyzer/c_parser/match.py new file mode 100644 index 00000000000000..3b5068fd11b685 --- /dev/null +++ b/Tools/c-analyzer/c_parser/match.py @@ -0,0 +1,177 @@ +import re + +from . import info as _info +from .parser._regexes import SIMPLE_TYPE + + +_KIND = _info.KIND + + +def match_storage(decl, expected): + default = _info.get_default_storage(decl) + #assert default + if expected is None: + expected = {default} + elif isinstance(expected, str): + expected = {expected or default} + elif not expected: + expected = _info.STORAGE + else: + expected = {v or default for v in expected} + storage = _info.get_effective_storage(decl, default=default) + return storage in expected + + +################################## +# decl matchers + +def is_type_decl(item): + return _KIND.is_type_decl(item.kind) + + +def is_decl(item): + return _KIND.is_decl(item.kind) + + +def is_pots(typespec, *, + _regex=re.compile(rf'^{SIMPLE_TYPE}$', re.VERBOSE), + ): + + if not typespec: + return None + if type(typespec) is not str: + _, _, _, typespec, _ = _info.get_parsed_vartype(typespec) + return _regex.match(typespec) is not None + + +def is_funcptr(vartype): + if not vartype: + return None + _, _, _, _, abstract = _info.get_parsed_vartype(vartype) + return _is_funcptr(abstract) + + +def _is_funcptr(declstr): + if not declstr: + return None + # XXX Support "(*)(". + return '(*)(' in declstr.replace(' ', '') + + +def is_forward_decl(decl): + if decl.kind is _KIND.TYPEDEF: + return False + elif is_type_decl(decl): + return not decl.data + elif decl.kind is _KIND.FUNCTION: + # XXX This doesn't work with ParsedItem. + return decl.signature.isforward + elif decl.kind is _KIND.VARIABLE: + # No var decls are considered forward (or all are...). + return False + else: + raise NotImplementedError(decl) + + +def can_have_symbol(decl): + return decl.kind in (_KIND.VARIABLE, _KIND.FUNCTION) + + +def has_external_symbol(decl): + if not can_have_symbol(decl): + return False + if _info.get_effective_storage(decl) != 'extern': + return False + if decl.kind is _KIND.FUNCTION: + return not decl.signature.isforward + else: + # It must be a variable, which can only be implicitly extern here. + return decl.storage != 'extern' + + +def has_internal_symbol(decl): + if not can_have_symbol(decl): + return False + return _info.get_actual_storage(decl) == 'static' + + +def is_external_reference(decl): + if not can_have_symbol(decl): + return False + # We have to check the declared storage rather tnan the effective. + if decl.storage != 'extern': + return False + if decl.kind is _KIND.FUNCTION: + return decl.signature.isforward + # Otherwise it's a variable. + return True + + +def is_local_var(decl): + if not decl.kind is _KIND.VARIABLE: + return False + return True if decl.parent else False + + +def is_global_var(decl): + if not decl.kind is _KIND.VARIABLE: + return False + return False if decl.parent else True + + +################################## +# filtering with matchers + +def filter_by_kind(items, kind): + if kind == 'type': + kinds = _KIND._TYPE_DECLS + elif kind == 'decl': + kinds = _KIND._TYPE_DECLS + try: + okay = kind in _KIND + except TypeError: + kinds = set(kind) + else: + kinds = {kind} if okay else set(kind) + for item in items: + if item.kind in kinds: + yield item + + +################################## +# grouping with matchers + +def group_by_category(decls, categories, *, ignore_non_match=True): + collated = {} + for decl in decls: + # Matchers should be mutually exclusive. (First match wins.) + for category, match in categories.items(): + if match(decl): + if category not in collated: + collated[category] = [decl] + else: + collated[category].append(decl) + break + else: + if not ignore_non_match: + raise Exception(f'no match for {decl!r}') + return collated + + +def group_by_kind(items): + collated = {kind: [] for kind in _KIND} + for item in items: + try: + collated[item.kind].append(item) + except KeyError: + raise ValueError(f'unsupported kind in {item!r}') + return collated + + +def group_by_kinds(items): + # Collate into kind groups (decl, type, etc.). + collated = {_KIND.get_group(k): [] for k in _KIND} + for item in items: + group = _KIND.get_group(item.kind) + collated[group].append(item) + return collated diff --git a/Tools/c-analyzer/c_parser/parser/__init__.py b/Tools/c-analyzer/c_parser/parser/__init__.py index 7cb34caf09eba8..4b201c6354023c 100644 --- a/Tools/c-analyzer/c_parser/parser/__init__.py +++ b/Tools/c-analyzer/c_parser/parser/__init__.py @@ -163,6 +163,8 @@ def _parse(srclines, anon_name): def _iter_source(lines, *, maxtext=20_000, maxlines=700, showtext=False): + maxtext = maxtext if maxtext and maxtext > 0 else None + maxlines = maxlines if maxlines and maxlines > 0 else None filestack = [] allinfo = {} # "lines" should be (fileinfo, data), as produced by the preprocessor code. @@ -181,9 +183,7 @@ def _iter_source(lines, *, maxtext=20_000, maxlines=700, showtext=False): _logger.debug(f'-> {line}') srcinfo._add_line(line, fileinfo.lno) - if len(srcinfo.text) > maxtext: - break - if srcinfo.end - srcinfo.start > maxlines: + if srcinfo.too_much(maxtext, maxlines): break while srcinfo._used(): yield srcinfo diff --git a/Tools/c-analyzer/c_parser/parser/_info.py b/Tools/c-analyzer/c_parser/parser/_info.py index 2dcd5e5e760b7c..cc21931b66cc57 100644 --- a/Tools/c-analyzer/c_parser/parser/_info.py +++ b/Tools/c-analyzer/c_parser/parser/_info.py @@ -1,3 +1,5 @@ +import re + from ..info import KIND, ParsedItem, FileInfo @@ -121,6 +123,19 @@ def resolve(self, kind, data, name, parent=None): def done(self): self._set_ready() + def too_much(self, maxtext, maxlines): + if maxtext and len(self.text) > maxtext: + pass + elif maxlines and self.end - self.start > maxlines: + pass + else: + return False + + #if re.fullmatch(r'[^;]+\[\][ ]*=[ ]*[{]([ ]*\d+,)*([ ]*\d+,?)\s*', + # self._current.text): + # return False + return True + def _set_ready(self): if self._current is None: self._ready = False diff --git a/Tools/c-analyzer/c_parser/parser/_regexes.py b/Tools/c-analyzer/c_parser/parser/_regexes.py index e9bc31d335a7d5..cb85a59aaa16c2 100644 --- a/Tools/c-analyzer/c_parser/parser/_regexes.py +++ b/Tools/c-analyzer/c_parser/parser/_regexes.py @@ -137,7 +137,8 @@ def _ind(text, level=1, edges='both'): ####################################### # variable declarations -STORAGE_CLASS = r'(?: \b (?: auto | register | static | extern ) \b )' +_STORAGE = 'auto register static extern'.split() +STORAGE_CLASS = rf'(?: \b (?: {" | ".join(_STORAGE)} ) \b )' TYPE_QUALIFIER = r'(?: \b (?: const | volatile ) \b )' PTR_QUALIFIER = rf'(?: [*] (?: \s* {TYPE_QUALIFIER} )? )' diff --git a/Tools/c-analyzer/cpython/__main__.py b/Tools/c-analyzer/cpython/__main__.py index 23a3de06f639c1..23ce29776ca68e 100644 --- a/Tools/c-analyzer/cpython/__main__.py +++ b/Tools/c-analyzer/cpython/__main__.py @@ -31,6 +31,9 @@ def _resolve_filenames(filenames): return resolved +####################################### +# the formats + def fmt_summary(analysis): # XXX Support sorting and grouping. supported = [] @@ -179,7 +182,7 @@ def analyze(files, **kwargs): analyze_resolved=_analyzer.analyze_resolved, ) return _analyzer.Analysis.from_results(results) - else: + else: # check known = _analyzer.read_known() def analyze(files, **kwargs): return _analyzer.iter_decls(files, **kwargs) diff --git a/Tools/c-analyzer/cpython/_analyzer.py b/Tools/c-analyzer/cpython/_analyzer.py index 98f8888651e579..978831d1fd9496 100644 --- a/Tools/c-analyzer/cpython/_analyzer.py +++ b/Tools/c-analyzer/cpython/_analyzer.py @@ -11,9 +11,14 @@ Struct, Member, FIXED_TYPE, +) +from c_parser.match import ( is_type_decl, is_pots, is_funcptr, +) +from c_analyzer.match import ( + is_system_type, is_process_global, is_fixed_type, is_immutable, @@ -246,7 +251,7 @@ def _check_typespec(decl, typedecl, types, knowntypes): # Fall back to default known types. if is_pots(typespec): return None - elif _info.is_system_type(typespec): + elif is_system_type(typespec): return None elif is_funcptr(decl.vartype): return None diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index 35fa296251e2ee..7c8c2966653989 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -46,10 +46,14 @@ def clean_lines(text): GLOBS = [ 'Include/*.h', 'Include/internal/*.h', + 'Modules/**/*.h', 'Modules/**/*.c', + 'Objects/**/*.h', 'Objects/**/*.c', + 'Python/**/*.h', + 'Parser/**/*.c', + 'Python/**/*.h', 'Parser/**/*.c', - 'Python/**/*.c', ] EXCLUDED = clean_lines(''' @@ -67,11 +71,24 @@ def clean_lines(text): Modules/_winapi.c # windows.h Modules/overlapped.c # winsock.h Python/dynload_win.c # windows.h +Modules/expat/winconfig.h +Python/thread_nt.h # other OS-dependent Python/dynload_dl.c # dl.h Python/dynload_hpux.c # dl.h Python/dynload_aix.c # sys/ldr.h +Python/thread_pthread.h + +# only huge constants (safe but parsing is slow) +Modules/_ssl_data.h +Modules/unicodedata_db.h +Modules/unicodename_db.h +Modules/cjkcodecs/mappings_*.h +Objects/unicodetype_db.h +Python/importlib.h +Python/importlib_external.h +Python/importlib_zipimport.h # @end=conf@ ''') @@ -80,6 +97,17 @@ def clean_lines(text): EXCLUDED += clean_lines(''' # The tool should be able to parse these... +Modules/hashlib.h +Objects/stringlib/codecs.h +Objects/stringlib/count.h +Objects/stringlib/ctype.h +Objects/stringlib/fastsearch.h +Objects/stringlib/find.h +Objects/stringlib/find_max_char.h +Objects/stringlib/partition.h +Objects/stringlib/replace.h +Objects/stringlib/split.h + Modules/_dbmmodule.c Modules/cjkcodecs/_codecs_*.c Modules/expat/xmlrole.c @@ -134,6 +162,9 @@ def clean_lines(text): Modules/_ctypes/cfield.c Py_BUILD_CORE 1 Modules/_heapqmodule.c Py_BUILD_CORE 1 Modules/_posixsubprocess.c Py_BUILD_CORE 1 +Objects/stringlib/codecs.h Py_BUILD_CORE 1 +Python/ceval_gil.h Py_BUILD_CORE 1 +Python/condvar.h Py_BUILD_CORE 1 Modules/_json.c Py_BUILD_CORE_BUILTIN 1 Modules/_pickle.c Py_BUILD_CORE_BUILTIN 1 @@ -177,6 +208,12 @@ def clean_lines(text): Python/import.c PyMODINIT_FUNC PyObject* Modules/_testcapimodule.c PyAPI_FUNC(RTYPE) RTYPE Python/getargs.c PyAPI_FUNC(RTYPE) RTYPE +Objects/stringlib/unicode_format.h Py_LOCAL_INLINE(type) static inline type + +# implied include of pymacro.h +*/clinic/*.c.h PyDoc_VAR(name) static const char name[] +*/clinic/*.c.h PyDoc_STR(str) str +*/clinic/*.c.h PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str) # implied include of exports.h #Modules/_io/bytesio.c Py_EXPORTED_SYMBOL /* */ @@ -212,6 +249,11 @@ def clean_lines(text): Modules/expat/xmlparse.c XML_POOR_ENTROPY 1 Modules/_dbmmodule.c HAVE_GDBM_DASH_NDBM_H 1 +# others +Modules/sre_lib.h LOCAL(type) static inline type +Modules/sre_lib.h SRE(F) sre_ucs2_##F +Objects/stringlib/codecs.h STRINGLIB_IS_UNICODE 1 + # @end=tsv@ ''')[1:] From 9394b5d89ffb010183307520cabc8ace87d2998b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 30 Oct 2020 22:51:02 +0100 Subject: [PATCH 0419/1261] bpo-42208: Call GC collect earlier in PyInterpreterState_Clear() (GH-23044) The last GC collection is now done before clearing builtins and sys dictionaries. Add also assertions to ensure that gc.collect() is no longer called after _PyGC_Fini(). Pass also the tstate to PyInterpreterState_Clear() to pass the correct tstate to _PyGC_CollectNoFail() and _PyGC_Fini(). --- Include/internal/pycore_interp.h | 1 + Modules/gcmodule.c | 10 ++++++---- Python/pylifecycle.c | 7 +------ Python/pystate.c | 32 +++++++++++++++++++++++++++----- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index eee369a44bfc72..69d2108da43226 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -267,6 +267,7 @@ extern PyStatus _PyInterpreterState_SetConfig( PyInterpreterState *interp, const PyConfig *config); +extern void _PyInterpreterState_Clear(PyThreadState *tstate); /* cross-interpreter data registry */ diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index d90ff33684fe8c..e6ad0f2dd42227 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1191,6 +1191,11 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyTime_t t1 = 0; /* initialize to prevent a compiler warning */ GCState *gcstate = &tstate->interp->gc; + // gc_collect_main() must not be called before _PyGC_Init + // or after _PyGC_Fini() + assert(gcstate->garbage != NULL); + assert(!_PyErr_Occurred(tstate)); + #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS if (tstate->interp->config._isolated_interpreter) { // bpo-40533: The garbage collector must not be run on parallel on @@ -2073,16 +2078,13 @@ PyGC_Collect(void) Py_ssize_t _PyGC_CollectNoFail(PyThreadState *tstate) { - assert(!_PyErr_Occurred(tstate)); - - GCState *gcstate = &tstate->interp->gc; - /* Ideally, this function is only called on interpreter shutdown, and therefore not recursively. Unfortunately, when there are daemon threads, a daemon thread can start a cyclic garbage collection during interpreter shutdown (and then never finish it). See http://bugs.python.org/issue8713#msg195178 for an example. */ + GCState *gcstate = &tstate->interp->gc; if (gcstate->collecting) { return 0; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index adef1617f61325..ff58c1b9153bd0 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1576,10 +1576,7 @@ finalize_interp_clear(PyThreadState *tstate) int is_main_interp = _Py_IsMainInterpreter(tstate); /* Clear interpreter state and all thread states */ - PyInterpreterState_Clear(tstate->interp); - - /* Last explicit GC collection */ - _PyGC_CollectNoFail(tstate); + _PyInterpreterState_Clear(tstate); /* Clear all loghooks */ /* Both _PySys_Audit function and users still need PyObject, such as tuple. @@ -1588,8 +1585,6 @@ finalize_interp_clear(PyThreadState *tstate) _PySys_ClearAuditHooks(tstate); } - _PyGC_Fini(tstate); - if (is_main_interp) { _Py_HashRandomization_Fini(); _PyArg_Fini(); diff --git a/Python/pystate.c b/Python/pystate.c index eb24f2b800607f..e88898670cdff6 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -268,14 +268,11 @@ PyInterpreterState_New(void) } -void -PyInterpreterState_Clear(PyInterpreterState *interp) +static void +interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate) { _PyRuntimeState *runtime = interp->runtime; - /* Use the current Python thread state to call audit hooks, - not the current Python thread state of 'interp'. */ - PyThreadState *tstate = _PyThreadState_GET(); if (_PySys_Audit(tstate, "cpython.PyInterpreterState_Clear", NULL) < 0) { _PyErr_Clear(tstate); } @@ -306,6 +303,12 @@ PyInterpreterState_Clear(PyInterpreterState *interp) if (_PyRuntimeState_GetFinalizing(runtime) == NULL) { _PyWarnings_Fini(interp); } + + /* Last garbage collection on this interpreter */ + _PyGC_CollectNoFail(tstate); + + _PyGC_Fini(tstate); + /* We don't clear sysdict and builtins until the end of this function. Because clearing other attributes can execute arbitrary Python code which requires sysdict and builtins. */ @@ -320,6 +323,25 @@ PyInterpreterState_Clear(PyInterpreterState *interp) } +void +PyInterpreterState_Clear(PyInterpreterState *interp) +{ + // Use the current Python thread state to call audit hooks and to collect + // garbage. It can be different than the current Python thread state + // of 'interp'. + PyThreadState *current_tstate = _PyThreadState_GET(); + + interpreter_clear(interp, current_tstate); +} + + +void +_PyInterpreterState_Clear(PyThreadState *tstate) +{ + interpreter_clear(tstate->interp, tstate); +} + + static void zapthreads(PyInterpreterState *interp, int check_current) { From b24f44837d1c965e3c21b4828d21d3ef390b3a0b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 30 Oct 2020 22:52:30 +0100 Subject: [PATCH 0420/1261] GitHub Action: Add gdb to posix dependencies (GH-23043) Sort also dependencies and remove duplicates (liblzma-dev). --- .github/workflows/posix-deps-apt.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/posix-deps-apt.sh b/.github/workflows/posix-deps-apt.sh index 2b879d32f8150d..5c7b9988be4511 100755 --- a/.github/workflows/posix-deps-apt.sh +++ b/.github/workflows/posix-deps-apt.sh @@ -3,19 +3,19 @@ apt-get update apt-get -yq install \ build-essential \ - zlib1g-dev \ + gdb \ + lcov \ libbz2-dev \ + libffi-dev \ + libgdbm-dev \ liblzma-dev \ libncurses5-dev \ libreadline6-dev \ libsqlite3-dev \ libssl-dev \ - libgdbm-dev \ - tk-dev \ lzma \ lzma-dev \ - liblzma-dev \ - libffi-dev \ + tk-dev \ uuid-dev \ xvfb \ - lcov + zlib1g-dev From 9b671619a45ea02edcd3caeac6975444c9356908 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Fri, 30 Oct 2020 23:48:42 +0000 Subject: [PATCH 0421/1261] bpo-42214: Fix check for NOTEQUAL token in the PEG parser for the barry_as_flufl rule (GH-23048) --- Grammar/python.gram | 2 +- Lib/test/test_syntax.py | 17 +++++++++++++++++ .../2020-10-30-22-16-30.bpo-42214.lXskM_.rst | 2 ++ Parser/parser.c | 2 +- Parser/pegen.c | 3 +-- Parser/pegen.h | 2 +- 6 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-30-22-16-30.bpo-42214.lXskM_.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index b8da554b8ec998..ae5e4b5d4ca64d 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -428,7 +428,7 @@ compare_op_bitwise_or_pair[CmpopExprPair*]: | is_bitwise_or eq_bitwise_or[CmpopExprPair*]: '==' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Eq, a) } noteq_bitwise_or[CmpopExprPair*]: - | (tok='!=' {_PyPegen_check_barry_as_flufl(p) ? NULL : tok}) a=bitwise_or {_PyPegen_cmpop_expr_pair(p, NotEq, a) } + | (tok='!=' { _PyPegen_check_barry_as_flufl(p, tok) ? NULL : tok}) a=bitwise_or {_PyPegen_cmpop_expr_pair(p, NotEq, a) } lte_bitwise_or[CmpopExprPair*]: '<=' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, LtE, a) } lt_bitwise_or[CmpopExprPair*]: '<' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Lt, a) } gte_bitwise_or[CmpopExprPair*]: '>=' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, GtE, a) } diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index c25b85246b919d..e89d9401f2c397 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -955,6 +955,23 @@ def test_nested_named_except_blocks(self): code += f"{' '*4*12}pass" self._check_error(code, "too many statically nested blocks") + def test_barry_as_flufl_with_syntax_errors(self): + # The "barry_as_flufl" rule can produce some "bugs-at-a-distance" if + # is reading the wrong token in the presence of syntax errors later + # in the file. See bpo-42214 for more information. + code = """ +def func1(): + if a != b: + raise ValueError + +def func2(): + try + return 1 + finally: + pass +""" + self._check_error(code, "invalid syntax") + def test_main(): support.run_unittest(SyntaxTestCase) from test import test_syntax diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-30-22-16-30.bpo-42214.lXskM_.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-30-22-16-30.bpo-42214.lXskM_.rst new file mode 100644 index 00000000000000..3f85bbe83901a0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-30-22-16-30.bpo-42214.lXskM_.rst @@ -0,0 +1,2 @@ +Fixed a possible crash in the PEG parser when checking for the '!=' token in +the ``barry_as_flufl`` rule. Patch by Pablo Galindo. diff --git a/Parser/parser.c b/Parser/parser.c index a22cf2752d18de..a882a81344cc61 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -21288,7 +21288,7 @@ _tmp_93_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='")); - _res = _PyPegen_check_barry_as_flufl ( p ) ? NULL : tok; + _res = _PyPegen_check_barry_as_flufl ( p , tok ) ? NULL : tok; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); diff --git a/Parser/pegen.c b/Parser/pegen.c index 216edd810e246f..188fd282b76043 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -62,8 +62,7 @@ init_normalization(Parser *p) /* Checks if the NOTEQUAL token is valid given the current parser flags 0 indicates success and nonzero indicates failure (an exception may be set) */ int -_PyPegen_check_barry_as_flufl(Parser *p) { - Token *t = p->tokens[p->fill - 1]; +_PyPegen_check_barry_as_flufl(Parser *p, Token* t) { assert(t->bytes != NULL); assert(t->type == NOTEQUAL); diff --git a/Parser/pegen.h b/Parser/pegen.h index 841f1e5eb43962..f82a3a00b2ba01 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -263,7 +263,7 @@ expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_expr_seq *, asdl_seq *, int end_col_offset, PyArena *arena); expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_seq *); asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *); -int _PyPegen_check_barry_as_flufl(Parser *); +int _PyPegen_check_barry_as_flufl(Parser *, Token *); mod_ty _PyPegen_make_module(Parser *, asdl_stmt_seq *); // Error reporting helpers From 59d4856d75d258c56bd3a79da3f69357c6a05e9c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 31 Oct 2020 01:02:09 +0100 Subject: [PATCH 0422/1261] bpo-42208: Add _Py_GetLocaleEncoding() (GH-23050) _io.TextIOWrapper no longer calls getpreferredencoding(False) of _bootlocale to get the locale encoding, but calls _Py_GetLocaleEncoding() instead. Add config_get_fs_encoding() sub-function. Reorganize also config_get_locale_encoding() code. --- Include/internal/pycore_fileutils.h | 2 + Modules/_io/_iomodule.c | 25 ------ Modules/_io/_iomodule.h | 1 - Modules/_io/textio.c | 26 +----- Python/fileutils.c | 43 +++++++++- Python/initconfig.c | 125 ++++++++++++++-------------- 6 files changed, 112 insertions(+), 110 deletions(-) diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index 9cb5fc66ee2e03..ff7bc4874c7971 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -50,6 +50,8 @@ PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( PyAPI_FUNC(void) _Py_closerange(int first, int last); +PyAPI_FUNC(PyObject*) _Py_GetLocaleEncoding(void); + #ifdef __cplusplus } #endif diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index e430352a48e211..9147648b243bed 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -593,31 +593,6 @@ _PyIO_get_module_state(void) return state; } -PyObject * -_PyIO_get_locale_module(_PyIO_State *state) -{ - PyObject *mod; - if (state->locale_module != NULL) { - assert(PyWeakref_CheckRef(state->locale_module)); - mod = PyWeakref_GET_OBJECT(state->locale_module); - if (mod != Py_None) { - Py_INCREF(mod); - return mod; - } - Py_CLEAR(state->locale_module); - } - mod = PyImport_ImportModule("_bootlocale"); - if (mod == NULL) - return NULL; - state->locale_module = PyWeakref_NewRef(mod, NULL); - if (state->locale_module == NULL) { - Py_DECREF(mod); - return NULL; - } - return mod; -} - - static int iomodule_traverse(PyObject *mod, visitproc visit, void *arg) { _PyIO_State *state = get_io_state(mod); diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h index a8f3951e57febd..638797fd35736e 100644 --- a/Modules/_io/_iomodule.h +++ b/Modules/_io/_iomodule.h @@ -150,7 +150,6 @@ typedef struct { #define IO_STATE() _PyIO_get_module_state() extern _PyIO_State *_PyIO_get_module_state(void); -extern PyObject *_PyIO_get_locale_module(_PyIO_State *); #ifdef MS_WINDOWS extern char _PyIO_get_console_type(PyObject *); diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 699b7e94c93bbf..2078bb316b2821 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -10,6 +10,7 @@ #include "Python.h" #include "pycore_interp.h" // PyInterpreterState.fs_codec #include "pycore_long.h" // _PyLong_GetZero() +#include "pycore_fileutils.h" // _Py_GetLocaleEncoding() #include "pycore_object.h" #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "structmember.h" // PyMemberDef @@ -27,7 +28,6 @@ _Py_IDENTIFIER(_dealloc_warn); _Py_IDENTIFIER(decode); _Py_IDENTIFIER(fileno); _Py_IDENTIFIER(flush); -_Py_IDENTIFIER(getpreferredencoding); _Py_IDENTIFIER(isatty); _Py_IDENTIFIER(mode); _Py_IDENTIFIER(name); @@ -1155,29 +1155,11 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, } } if (encoding == NULL && self->encoding == NULL) { - PyObject *locale_module = _PyIO_get_locale_module(state); - if (locale_module == NULL) - goto catch_ImportError; - self->encoding = _PyObject_CallMethodIdOneArg( - locale_module, &PyId_getpreferredencoding, Py_False); - Py_DECREF(locale_module); + self->encoding = _Py_GetLocaleEncoding(); if (self->encoding == NULL) { - catch_ImportError: - /* - Importing locale can raise an ImportError because of - _functools, and locale.getpreferredencoding can raise an - ImportError if _locale is not available. These will happen - during module building. - */ - if (PyErr_ExceptionMatches(PyExc_ImportError)) { - PyErr_Clear(); - self->encoding = PyUnicode_FromString("ascii"); - } - else - goto error; + goto error; } - else if (!PyUnicode_Check(self->encoding)) - Py_CLEAR(self->encoding); + assert(PyUnicode_Check(self->encoding)); } if (self->encoding != NULL) { encoding = PyUnicode_AsUTF8(self->encoding); diff --git a/Python/fileutils.c b/Python/fileutils.c index e125ba46c21bae..ba2690429f366c 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1,5 +1,6 @@ #include "Python.h" -#include "pycore_fileutils.h" +#include "pycore_fileutils.h" // fileutils definitions +#include "pycore_runtime.h" // _PyRuntime #include "osdefs.h" // SEP #include @@ -820,6 +821,46 @@ _Py_EncodeLocaleEx(const wchar_t *text, char **str, } +// Get the current locale encoding: locale.getpreferredencoding(False). +// See also config_get_locale_encoding() +PyObject * +_Py_GetLocaleEncoding(void) +{ +#ifdef _Py_FORCE_UTF8_LOCALE + // On Android langinfo.h and CODESET are missing, + // and UTF-8 is always used in mbstowcs() and wcstombs(). + return PyUnicode_FromString("UTF-8"); +#else + const PyPreConfig *preconfig = &_PyRuntime.preconfig; + if (preconfig->utf8_mode) { + return PyUnicode_FromString("UTF-8"); + } + +#if defined(MS_WINDOWS) + return PyUnicode_FromFormat("cp%u", GetACP()); +#else + const char *encoding = nl_langinfo(CODESET); + if (!encoding || encoding[0] == '\0') { +#ifdef _Py_FORCE_UTF8_FS_ENCODING + // nl_langinfo() can return an empty string when the LC_CTYPE locale is + // not supported. Default to UTF-8 in that case, because UTF-8 is the + // default charset on macOS. + encoding = "UTF-8"; +#else + PyErr_SetString(PyExc_ValueError, + "failed to get the locale encoding: " + "nl_langinfo(CODESET) returns an empty string"); + return NULL; +#endif + } + // Decode from UTF-8 + return PyUnicode_FromString(encoding); +#endif // !CODESET + +#endif +} + + #ifdef MS_WINDOWS static __int64 secs_between_epochs = 11644473600; /* Seconds between 1.1.1601 and 1.1.1970 */ diff --git a/Python/initconfig.c b/Python/initconfig.c index 6a13dc52ed776c..e129278d8f8ad8 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -766,7 +766,7 @@ config_set_bytes_string(PyConfig *config, wchar_t **config_str, configured. */ PyStatus PyConfig_SetBytesString(PyConfig *config, wchar_t **config_str, - const char *str) + const char *str) { return CONFIG_SET_BYTES_STR(config, config_str, str, "string"); } @@ -1466,8 +1466,13 @@ config_read_complex_options(PyConfig *config) static const wchar_t * -config_get_stdio_errors(void) +config_get_stdio_errors(const PyPreConfig *preconfig) { + if (preconfig->utf8_mode) { + /* UTF-8 Mode uses UTF-8/surrogateescape */ + return L"surrogateescape"; + } + #ifndef MS_WINDOWS const char *loc = setlocale(LC_CTYPE, NULL); if (loc != NULL) { @@ -1492,26 +1497,41 @@ config_get_stdio_errors(void) } +// See also _Py_GetLocaleEncoding() and config_get_fs_encoding() static PyStatus -config_get_locale_encoding(PyConfig *config, wchar_t **locale_encoding) +config_get_locale_encoding(PyConfig *config, const PyPreConfig *preconfig, + wchar_t **locale_encoding) { +#ifdef _Py_FORCE_UTF8_LOCALE + return PyConfig_SetString(config, locale_encoding, L"utf-8"); +#else + if (preconfig->utf8_mode) { + return PyConfig_SetString(config, locale_encoding, L"utf-8"); + } + #ifdef MS_WINDOWS char encoding[20]; PyOS_snprintf(encoding, sizeof(encoding), "cp%u", GetACP()); return PyConfig_SetBytesString(config, locale_encoding, encoding); -#elif defined(_Py_FORCE_UTF8_LOCALE) - return PyConfig_SetString(config, locale_encoding, L"utf-8"); #else const char *encoding = nl_langinfo(CODESET); if (!encoding || encoding[0] == '\0') { +#ifdef _Py_FORCE_UTF8_FS_ENCODING + // nl_langinfo() can return an empty string when the LC_CTYPE locale is + // not supported. Default to UTF-8 in that case, because UTF-8 is the + // default charset on macOS. + encoding = "UTF-8"; +#else return _PyStatus_ERR("failed to get the locale encoding: " - "nl_langinfo(CODESET) failed"); + "nl_langinfo(CODESET) returns an empty string"); +#endif } /* nl_langinfo(CODESET) is decoded by Py_DecodeLocale() */ return CONFIG_SET_BYTES_STR(config, locale_encoding, encoding, "nl_langinfo(CODESET)"); -#endif +#endif // !MS_WINDOWS +#endif // !_Py_FORCE_UTF8_LOCALE } @@ -1596,33 +1616,16 @@ config_init_stdio_encoding(PyConfig *config, PyMem_RawFree(pythonioencoding); } - /* UTF-8 Mode uses UTF-8/surrogateescape */ - if (preconfig->utf8_mode) { - if (config->stdio_encoding == NULL) { - status = PyConfig_SetString(config, &config->stdio_encoding, - L"utf-8"); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - if (config->stdio_errors == NULL) { - status = PyConfig_SetString(config, &config->stdio_errors, - L"surrogateescape"); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - } - /* Choose the default error handler based on the current locale. */ if (config->stdio_encoding == NULL) { - status = config_get_locale_encoding(config, &config->stdio_encoding); + status = config_get_locale_encoding(config, preconfig, + &config->stdio_encoding); if (_PyStatus_EXCEPTION(status)) { return status; } } if (config->stdio_errors == NULL) { - const wchar_t *errors = config_get_stdio_errors(); + const wchar_t *errors = config_get_stdio_errors(preconfig); assert(errors != NULL); status = PyConfig_SetString(config, &config->stdio_errors, errors); @@ -1635,46 +1638,46 @@ config_init_stdio_encoding(PyConfig *config, } +// See also config_get_locale_encoding() +static PyStatus +config_get_fs_encoding(PyConfig *config, const PyPreConfig *preconfig, + wchar_t **fs_encoding) +{ +#ifdef _Py_FORCE_UTF8_FS_ENCODING + return PyConfig_SetString(config, fs_encoding, L"utf-8"); +#elif defined(MS_WINDOWS) + const wchar_t *encoding; + if (preconfig->legacy_windows_fs_encoding) { + // Legacy Windows filesystem encoding: mbcs/replace + encoding = L"mbcs"; + } + else { + // Windows defaults to utf-8/surrogatepass (PEP 529) + encoding = L"utf-8"; + } + return PyConfig_SetString(config, fs_encoding, encoding); +#else // !MS_WINDOWS + if (preconfig->utf8_mode) { + return PyConfig_SetString(config, fs_encoding, L"utf-8"); + } + else if (_Py_GetForceASCII()) { + return PyConfig_SetString(config, fs_encoding, L"ascii"); + } + else { + return config_get_locale_encoding(config, preconfig, fs_encoding); + } +#endif // !MS_WINDOWS +} + + static PyStatus config_init_fs_encoding(PyConfig *config, const PyPreConfig *preconfig) { PyStatus status; if (config->filesystem_encoding == NULL) { -#ifdef _Py_FORCE_UTF8_FS_ENCODING - status = PyConfig_SetString(config, &config->filesystem_encoding, L"utf-8"); -#else - -#ifdef MS_WINDOWS - if (preconfig->legacy_windows_fs_encoding) { - /* Legacy Windows filesystem encoding: mbcs/replace */ - status = PyConfig_SetString(config, &config->filesystem_encoding, - L"mbcs"); - } - else -#endif - if (preconfig->utf8_mode) { - status = PyConfig_SetString(config, &config->filesystem_encoding, - L"utf-8"); - } -#ifndef MS_WINDOWS - else if (_Py_GetForceASCII()) { - status = PyConfig_SetString(config, &config->filesystem_encoding, - L"ascii"); - } -#endif - else { -#ifdef MS_WINDOWS - /* Windows defaults to utf-8/surrogatepass (PEP 529). */ - status = PyConfig_SetString(config, &config->filesystem_encoding, - L"utf-8"); -#else - status = config_get_locale_encoding(config, - &config->filesystem_encoding); -#endif - } -#endif /* !_Py_FORCE_UTF8_FS_ENCODING */ - + status = config_get_fs_encoding(config, preconfig, + &config->filesystem_encoding); if (_PyStatus_EXCEPTION(status)) { return status; } From 73913aa9f54845e06b0499b4a97c0f7d46008fd5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 31 Oct 2020 01:32:11 +0100 Subject: [PATCH 0423/1261] bpo-42208: Add _locale._get_locale_encoding() (GH-23052) * Add a new _locale._get_locale_encoding() function to get the current locale encoding. * Modify locale.getpreferredencoding() to use it. * Remove the _bootlocale module. --- Lib/_bootlocale.py | 46 ------------------ Lib/locale.py | 82 +++++++++++++++----------------- Lib/test/test_mimetypes.py | 18 +++---- Modules/_localemodule.c | 20 +++++++- Modules/clinic/_localemodule.c.h | 20 +++++++- PCbuild/lib.pyproj | 1 - 6 files changed, 85 insertions(+), 102 deletions(-) delete mode 100644 Lib/_bootlocale.py diff --git a/Lib/_bootlocale.py b/Lib/_bootlocale.py deleted file mode 100644 index 3273a3b42252ba..00000000000000 --- a/Lib/_bootlocale.py +++ /dev/null @@ -1,46 +0,0 @@ -"""A minimal subset of the locale module used at interpreter startup -(imported by the _io module), in order to reduce startup time. - -Don't import directly from third-party code; use the `locale` module instead! -""" - -import sys -import _locale - -if sys.platform.startswith("win"): - def getpreferredencoding(do_setlocale=True): - if sys.flags.utf8_mode: - return 'UTF-8' - return _locale._getdefaultlocale()[1] -else: - try: - _locale.CODESET - except AttributeError: - if hasattr(sys, 'getandroidapilevel'): - # On Android langinfo.h and CODESET are missing, and UTF-8 is - # always used in mbstowcs() and wcstombs(). - def getpreferredencoding(do_setlocale=True): - return 'UTF-8' - else: - def getpreferredencoding(do_setlocale=True): - if sys.flags.utf8_mode: - return 'UTF-8' - # This path for legacy systems needs the more complex - # getdefaultlocale() function, import the full locale module. - import locale - return locale.getpreferredencoding(do_setlocale) - else: - def getpreferredencoding(do_setlocale=True): - assert not do_setlocale - if sys.flags.utf8_mode: - return 'UTF-8' - result = _locale.nl_langinfo(_locale.CODESET) - if not result and sys.platform == 'darwin': - # nl_langinfo can return an empty string - # when the setting has an invalid value. - # Default to UTF-8 in that case because - # UTF-8 is the default charset on OSX and - # returning nothing will crash the - # interpreter. - result = 'UTF-8' - return result diff --git a/Lib/locale.py b/Lib/locale.py index 1a4e9f694f3096..ee841e8b8655ea 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -619,53 +619,49 @@ def resetlocale(category=LC_ALL): """ _setlocale(category, _build_localename(getdefaultlocale())) -if sys.platform.startswith("win"): - # On Win32, this will return the ANSI code page - def getpreferredencoding(do_setlocale = True): - """Return the charset that the user is likely using.""" + +try: + from _locale import _get_locale_encoding +except ImportError: + def _get_locale_encoding(): + if hasattr(sys, 'getandroidapilevel'): + # On Android langinfo.h and CODESET are missing, and UTF-8 is + # always used in mbstowcs() and wcstombs(). + return 'UTF-8' if sys.flags.utf8_mode: return 'UTF-8' - import _bootlocale - return _bootlocale.getpreferredencoding(False) + encoding = getdefaultlocale()[1] + if encoding is None: + # LANG not set, default conservatively to ASCII + encoding = 'ascii' + return encoding + +try: + CODESET +except NameError: + def getpreferredencoding(do_setlocale=True): + """Return the charset that the user is likely using.""" + return _get_locale_encoding() else: # On Unix, if CODESET is available, use that. - try: - CODESET - except NameError: - if hasattr(sys, 'getandroidapilevel'): - # On Android langinfo.h and CODESET are missing, and UTF-8 is - # always used in mbstowcs() and wcstombs(). - def getpreferredencoding(do_setlocale = True): - return 'UTF-8' - else: - # Fall back to parsing environment variables :-( - def getpreferredencoding(do_setlocale = True): - """Return the charset that the user is likely using, - by looking at environment variables.""" - if sys.flags.utf8_mode: - return 'UTF-8' - res = getdefaultlocale()[1] - if res is None: - # LANG not set, default conservatively to ASCII - res = 'ascii' - return res - else: - def getpreferredencoding(do_setlocale = True): - """Return the charset that the user is likely using, - according to the system configuration.""" - if sys.flags.utf8_mode: - return 'UTF-8' - import _bootlocale - if do_setlocale: - oldloc = setlocale(LC_CTYPE) - try: - setlocale(LC_CTYPE, "") - except Error: - pass - result = _bootlocale.getpreferredencoding(False) - if do_setlocale: - setlocale(LC_CTYPE, oldloc) - return result + def getpreferredencoding(do_setlocale=True): + """Return the charset that the user is likely using, + according to the system configuration.""" + if sys.flags.utf8_mode: + return 'UTF-8' + + if not do_setlocale: + return _get_locale_encoding() + + old_loc = setlocale(LC_CTYPE) + try: + try: + setlocale(LC_CTYPE, "") + except Error: + pass + return _get_locale_encoding() + finally: + setlocale(LC_CTYPE, old_loc) ### Database diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py index ddeae38e1372f5..d63f6b66e10c9c 100644 --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -3,7 +3,7 @@ import mimetypes import pathlib import sys -import unittest +import unittest.mock from test import support from test.support import os_helper @@ -71,14 +71,14 @@ def test_read_mime_types(self): # bpo-41048: read_mime_types should read the rule file with 'utf-8' encoding. # Not with locale encoding. _bootlocale has been imported because io.open(...) # uses it. - with os_helper.temp_dir() as directory: - data = "application/no-mans-land Fran\u00E7ais" - file = pathlib.Path(directory, "sample.mimetype") - file.write_text(data, encoding='utf-8') - import _bootlocale - with support.swap_attr(_bootlocale, 'getpreferredencoding', lambda do_setlocale=True: 'ASCII'): - mime_dict = mimetypes.read_mime_types(file) - eq(mime_dict[".Français"], "application/no-mans-land") + data = "application/no-mans-land Fran\u00E7ais" + filename = "filename" + fp = io.StringIO(data) + with unittest.mock.patch.object(mimetypes, 'open', + return_value=fp) as mock_open: + mime_dict = mimetypes.read_mime_types(filename) + mock_open.assert_called_with(filename, encoding='utf-8') + eq(mime_dict[".Français"], "application/no-mans-land") def test_non_standard_types(self): eq = self.assertEqual diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 9c7ce876e4059f..359deb7544043b 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -768,9 +768,24 @@ _locale_bind_textdomain_codeset_impl(PyObject *module, const char *domain, } Py_RETURN_NONE; } -#endif +#endif // HAVE_BIND_TEXTDOMAIN_CODESET + +#endif // HAVE_LIBINTL_H + + +/*[clinic input] +_locale._get_locale_encoding + +Get the current locale encoding. +[clinic start generated code]*/ + +static PyObject * +_locale__get_locale_encoding_impl(PyObject *module) +/*[clinic end generated code: output=e8e2f6f6f184591a input=513d9961d2f45c76]*/ +{ + return _Py_GetLocaleEncoding(); +} -#endif static struct PyMethodDef PyLocale_Methods[] = { _LOCALE_SETLOCALE_METHODDEF @@ -797,6 +812,7 @@ static struct PyMethodDef PyLocale_Methods[] = { _LOCALE_BIND_TEXTDOMAIN_CODESET_METHODDEF #endif #endif + _LOCALE__GET_LOCALE_ENCODING_METHODDEF {NULL, NULL} }; diff --git a/Modules/clinic/_localemodule.c.h b/Modules/clinic/_localemodule.c.h index 5d1db3ece796d8..703d034c32e801 100644 --- a/Modules/clinic/_localemodule.c.h +++ b/Modules/clinic/_localemodule.c.h @@ -545,6 +545,24 @@ _locale_bind_textdomain_codeset(PyObject *module, PyObject *const *args, Py_ssiz #endif /* defined(HAVE_LIBINTL_H) && defined(HAVE_BIND_TEXTDOMAIN_CODESET) */ +PyDoc_STRVAR(_locale__get_locale_encoding__doc__, +"_get_locale_encoding($module, /)\n" +"--\n" +"\n" +"Get the current locale encoding."); + +#define _LOCALE__GET_LOCALE_ENCODING_METHODDEF \ + {"_get_locale_encoding", (PyCFunction)_locale__get_locale_encoding, METH_NOARGS, _locale__get_locale_encoding__doc__}, + +static PyObject * +_locale__get_locale_encoding_impl(PyObject *module); + +static PyObject * +_locale__get_locale_encoding(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _locale__get_locale_encoding_impl(module); +} + #ifndef _LOCALE_STRCOLL_METHODDEF #define _LOCALE_STRCOLL_METHODDEF #endif /* !defined(_LOCALE_STRCOLL_METHODDEF) */ @@ -584,4 +602,4 @@ _locale_bind_textdomain_codeset(PyObject *module, PyObject *const *args, Py_ssiz #ifndef _LOCALE_BIND_TEXTDOMAIN_CODESET_METHODDEF #define _LOCALE_BIND_TEXTDOMAIN_CODESET_METHODDEF #endif /* !defined(_LOCALE_BIND_TEXTDOMAIN_CODESET_METHODDEF) */ -/*[clinic end generated code: output=fe944779cd572d8e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=cd703c8a3a75fcf4 input=a9049054013a1b77]*/ diff --git a/PCbuild/lib.pyproj b/PCbuild/lib.pyproj index f0c51edb9d1ca1..a15165d92ef125 100644 --- a/PCbuild/lib.pyproj +++ b/PCbuild/lib.pyproj @@ -1572,7 +1572,6 @@ - From efe9810c6544591a19cf89a9192775b4746d5514 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Sat, 31 Oct 2020 11:15:38 +0900 Subject: [PATCH 0424/1261] Revert "bpo-42160: tempfile: Reduce overhead of pid check. (GH-22997)" `_RandomNameSequence` is not true singleton so using `os.register_at_fork` doesn't make sense unlike `random._inst`. This reverts commit 8e409cebad42032bb7d0f2cadd8b1e36081d98af. --- Lib/tempfile.py | 22 ++++++++++--------- Lib/test/test_tempfile.py | 4 ++-- .../2020-10-27-00-42-09.bpo-42160.eiLOCi.rst | 1 - 3 files changed, 14 insertions(+), 13 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 1bc5c71fd03494..770f72c25295cb 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -129,22 +129,24 @@ class _RandomNameSequence: _RandomNameSequence is an iterator.""" - def __init__(self, characters="abcdefghijklmnopqrstuvwxyz0123456789_", length=8, rng=None): - if rng is None: - rng = _Random() - if hasattr(_os, "fork"): - # prevent same state after fork - _os.register_at_fork(after_in_child=rng.seed) - self.rng = rng - self.characters = characters - self.length = length + characters = "abcdefghijklmnopqrstuvwxyz0123456789_" + + @property + def rng(self): + cur_pid = _os.getpid() + if cur_pid != getattr(self, '_rng_pid', None): + self._rng = _Random() + self._rng_pid = cur_pid + return self._rng def __iter__(self): return self def __next__(self): c = self.characters - return ''.join(self.rng.choices(c, k=self.length)) + choose = self.rng.choice + letters = [choose(c) for dummy in range(8)] + return ''.join(letters) def _candidate_tempdir_list(): """Generate a list of candidate temporary directories which diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 77d710efaf107b..8ace883d74bb24 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -153,8 +153,8 @@ def setUp(self): self.r = tempfile._RandomNameSequence() super().setUp() - def test_get_eight_char_str(self): - # _RandomNameSequence returns a eight-character string + def test_get_six_char_str(self): + # _RandomNameSequence returns a six-character string s = next(self.r) self.nameCheck(s, '', '', '') diff --git a/Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst b/Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst deleted file mode 100644 index c5f3091283a87b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst +++ /dev/null @@ -1 +0,0 @@ -Replaced pid check in ``tempfile._RandomNameSequence`` with ``os.register_at_fork`` to reduce overhead. From 28bf72c4122154e5b291eae340bbc12fd4def640 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Sat, 31 Oct 2020 14:02:38 +0800 Subject: [PATCH 0425/1261] bpo-42198: Document __new__ for types.GenericAlias (GH-23039) --- Doc/library/stdtypes.rst | 3 ++- Doc/library/types.rst | 13 ++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 3fd94ea1bd310b..09477e63786c59 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4793,7 +4793,8 @@ The ``GenericAlias`` object acts as a proxy for :term:`generic types of a generic which provides the types for container elements. The user-exposed type for the ``GenericAlias`` object can be accessed from -:data:`types.GenericAlias` and used for :func:`isinstance` checks. +:class:`types.GenericAlias` and used for :func:`isinstance` checks. It can +also be used to create ``GenericAlias`` objects directly. .. describe:: T[X, Y, ...] diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 00720559d0a4a8..ad40a9fbf32739 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -262,11 +262,22 @@ Standard names are defined for the following types: .. versionadded:: 3.10 -.. data:: GenericAlias +.. class:: GenericAlias(t_origin, t_args) The type of :ref:`parameterized generics ` such as ``list[int]``. + ``t_origin`` should be a non-parameterized generic class, such as ``list``, + ``tuple`` or ``dict``. ``t_args`` should be a :class:`tuple` (possibly of + length 1) of types which parameterize ``t_origin``:: + + >>> from types import GenericAlias + + >>> list[int] == GenericAlias(list, (int,)) + True + >>> dict[str, int] == GenericAlias(dict, (str, int)) + True + .. versionadded:: 3.9 .. data:: Union From f8524014d6591ce3b1403dab3551b5a9144122ce Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Sat, 31 Oct 2020 07:07:44 +0100 Subject: [PATCH 0426/1261] bpo-40956: Convert _sqlite3 module level functions to Argument Clinic (GH-22484) --- Modules/_sqlite/clinic/module.c.h | 222 ++++++++++++++++++++++++++++++ Modules/_sqlite/microprotocols.c | 13 -- Modules/_sqlite/microprotocols.h | 5 - Modules/_sqlite/module.c | 161 ++++++++++++---------- 4 files changed, 313 insertions(+), 88 deletions(-) create mode 100644 Modules/_sqlite/clinic/module.c.h diff --git a/Modules/_sqlite/clinic/module.c.h b/Modules/_sqlite/clinic/module.c.h new file mode 100644 index 00000000000000..fb1e1187b209f8 --- /dev/null +++ b/Modules/_sqlite/clinic/module.c.h @@ -0,0 +1,222 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(pysqlite_complete_statement__doc__, +"complete_statement($module, /, statement)\n" +"--\n" +"\n" +"Checks if a string contains a complete SQL statement. Non-standard."); + +#define PYSQLITE_COMPLETE_STATEMENT_METHODDEF \ + {"complete_statement", (PyCFunction)(void(*)(void))pysqlite_complete_statement, METH_FASTCALL|METH_KEYWORDS, pysqlite_complete_statement__doc__}, + +static PyObject * +pysqlite_complete_statement_impl(PyObject *module, const char *statement); + +static PyObject * +pysqlite_complete_statement(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"statement", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "complete_statement", 0}; + PyObject *argsbuf[1]; + const char *statement; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("complete_statement", "argument 'statement'", "str", args[0]); + goto exit; + } + Py_ssize_t statement_length; + statement = PyUnicode_AsUTF8AndSize(args[0], &statement_length); + if (statement == NULL) { + goto exit; + } + if (strlen(statement) != (size_t)statement_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + return_value = pysqlite_complete_statement_impl(module, statement); + +exit: + return return_value; +} + +PyDoc_STRVAR(pysqlite_enable_shared_cache__doc__, +"enable_shared_cache($module, /, do_enable)\n" +"--\n" +"\n" +"Enable or disable shared cache mode for the calling thread.\n" +"\n" +"Experimental/Non-standard."); + +#define PYSQLITE_ENABLE_SHARED_CACHE_METHODDEF \ + {"enable_shared_cache", (PyCFunction)(void(*)(void))pysqlite_enable_shared_cache, METH_FASTCALL|METH_KEYWORDS, pysqlite_enable_shared_cache__doc__}, + +static PyObject * +pysqlite_enable_shared_cache_impl(PyObject *module, int do_enable); + +static PyObject * +pysqlite_enable_shared_cache(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"do_enable", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "enable_shared_cache", 0}; + PyObject *argsbuf[1]; + int do_enable; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + do_enable = _PyLong_AsInt(args[0]); + if (do_enable == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = pysqlite_enable_shared_cache_impl(module, do_enable); + +exit: + return return_value; +} + +PyDoc_STRVAR(pysqlite_register_adapter__doc__, +"register_adapter($module, type, caster, /)\n" +"--\n" +"\n" +"Registers an adapter with pysqlite\'s adapter registry. Non-standard."); + +#define PYSQLITE_REGISTER_ADAPTER_METHODDEF \ + {"register_adapter", (PyCFunction)(void(*)(void))pysqlite_register_adapter, METH_FASTCALL, pysqlite_register_adapter__doc__}, + +static PyObject * +pysqlite_register_adapter_impl(PyObject *module, PyTypeObject *type, + PyObject *caster); + +static PyObject * +pysqlite_register_adapter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyTypeObject *type; + PyObject *caster; + + if (!_PyArg_CheckPositional("register_adapter", nargs, 2, 2)) { + goto exit; + } + type = (PyTypeObject *)args[0]; + caster = args[1]; + return_value = pysqlite_register_adapter_impl(module, type, caster); + +exit: + return return_value; +} + +PyDoc_STRVAR(pysqlite_register_converter__doc__, +"register_converter($module, name, converter, /)\n" +"--\n" +"\n" +"Registers a converter with pysqlite. Non-standard."); + +#define PYSQLITE_REGISTER_CONVERTER_METHODDEF \ + {"register_converter", (PyCFunction)(void(*)(void))pysqlite_register_converter, METH_FASTCALL, pysqlite_register_converter__doc__}, + +static PyObject * +pysqlite_register_converter_impl(PyObject *module, PyObject *orig_name, + PyObject *callable); + +static PyObject * +pysqlite_register_converter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *orig_name; + PyObject *callable; + + if (!_PyArg_CheckPositional("register_converter", nargs, 2, 2)) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("register_converter", "argument 1", "str", args[0]); + goto exit; + } + if (PyUnicode_READY(args[0]) == -1) { + goto exit; + } + orig_name = args[0]; + callable = args[1]; + return_value = pysqlite_register_converter_impl(module, orig_name, callable); + +exit: + return return_value; +} + +PyDoc_STRVAR(pysqlite_enable_callback_trace__doc__, +"enable_callback_tracebacks($module, enable, /)\n" +"--\n" +"\n" +"Enable or disable callback functions throwing errors to stderr."); + +#define PYSQLITE_ENABLE_CALLBACK_TRACE_METHODDEF \ + {"enable_callback_tracebacks", (PyCFunction)pysqlite_enable_callback_trace, METH_O, pysqlite_enable_callback_trace__doc__}, + +static PyObject * +pysqlite_enable_callback_trace_impl(PyObject *module, int enable); + +static PyObject * +pysqlite_enable_callback_trace(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int enable; + + enable = _PyLong_AsInt(arg); + if (enable == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = pysqlite_enable_callback_trace_impl(module, enable); + +exit: + return return_value; +} + +PyDoc_STRVAR(pysqlite_adapt__doc__, +"adapt($module, obj, proto=PrepareProtocolType, alt=, /)\n" +"--\n" +"\n" +"Adapt given object to given protocol. Non-standard."); + +#define PYSQLITE_ADAPT_METHODDEF \ + {"adapt", (PyCFunction)(void(*)(void))pysqlite_adapt, METH_FASTCALL, pysqlite_adapt__doc__}, + +static PyObject * +pysqlite_adapt_impl(PyObject *module, PyObject *obj, PyObject *proto, + PyObject *alt); + +static PyObject * +pysqlite_adapt(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *obj; + PyObject *proto = (PyObject*)pysqlite_PrepareProtocolType; + PyObject *alt = NULL; + + if (!_PyArg_CheckPositional("adapt", nargs, 1, 3)) { + goto exit; + } + obj = args[0]; + if (nargs < 2) { + goto skip_optional; + } + proto = args[1]; + if (nargs < 3) { + goto skip_optional; + } + alt = args[2]; +skip_optional: + return_value = pysqlite_adapt_impl(module, obj, proto, alt); + +exit: + return return_value; +} +/*[clinic end generated code: output=d87990f941c209fa input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index ddc30e8a89b460..cf1fefd671851d 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -29,7 +29,6 @@ #include "microprotocols.h" #include "prepare_protocol.h" - /** the adapters registry **/ static PyObject *psyco_adapters = NULL; @@ -150,15 +149,3 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) PyErr_SetString(pysqlite_ProgrammingError, "can't adapt"); return NULL; } - -/** module-level functions **/ - -PyObject * -pysqlite_adapt(pysqlite_Cursor *self, PyObject *args) -{ - PyObject *obj, *alt = NULL; - PyObject *proto = (PyObject*)pysqlite_PrepareProtocolType; - - if (!PyArg_ParseTuple(args, "O|OO", &obj, &proto, &alt)) return NULL; - return pysqlite_microprotocols_adapt(obj, proto, alt); -} diff --git a/Modules/_sqlite/microprotocols.h b/Modules/_sqlite/microprotocols.h index 87df6bac55797a..e9adef916e724b 100644 --- a/Modules/_sqlite/microprotocols.h +++ b/Modules/_sqlite/microprotocols.h @@ -44,9 +44,4 @@ extern int pysqlite_microprotocols_add( extern PyObject *pysqlite_microprotocols_adapt( PyObject *obj, PyObject *proto, PyObject *alt); -extern PyObject * - pysqlite_adapt(pysqlite_Cursor* self, PyObject *args); -#define pysqlite_adapt_doc \ - "adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard." - #endif /* !defined(PSYCOPG_MICROPROTOCOLS_H) */ diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 0297e2fab292e5..33324402385f44 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -33,6 +33,12 @@ #error "SQLite 3.7.3 or higher required" #endif +#include "clinic/module.c.h" +/*[clinic input] +module _sqlite3 +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=81e330492d57488e]*/ + /* static objects at module-level */ PyObject *pysqlite_Error = NULL; @@ -102,18 +108,19 @@ Opens a connection to the SQLite database file *database*. You can use\n\ \":memory:\" to open a database connection to a database that resides in\n\ RAM instead of on disk."); -static PyObject* module_complete(PyObject* self, PyObject* args, PyObject* - kwargs) -{ - static char *kwlist[] = {"statement", NULL}; - char* statement; +/*[clinic input] +_sqlite3.complete_statement as pysqlite_complete_statement - PyObject* result; + statement: str - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &statement)) - { - return NULL; - } +Checks if a string contains a complete SQL statement. Non-standard. +[clinic start generated code]*/ + +static PyObject * +pysqlite_complete_statement_impl(PyObject *module, const char *statement) +/*[clinic end generated code: output=e55f1ff1952df558 input=f6b24996b31c5c33]*/ +{ + PyObject* result; if (sqlite3_complete(statement)) { result = Py_True; @@ -126,23 +133,22 @@ static PyObject* module_complete(PyObject* self, PyObject* args, PyObject* return result; } -PyDoc_STRVAR(module_complete_doc, -"complete_statement(sql)\n\ -\n\ -Checks if a string contains a complete SQL statement. Non-standard."); +/*[clinic input] +_sqlite3.enable_shared_cache as pysqlite_enable_shared_cache -static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyObject* - kwargs) + do_enable: int + +Enable or disable shared cache mode for the calling thread. + +Experimental/Non-standard. +[clinic start generated code]*/ + +static PyObject * +pysqlite_enable_shared_cache_impl(PyObject *module, int do_enable) +/*[clinic end generated code: output=259c74eedee1516b input=8400e41bc58b6b24]*/ { - static char *kwlist[] = {"do_enable", NULL}; - int do_enable; int rc; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &do_enable)) - { - return NULL; - } - rc = sqlite3_enable_shared_cache(do_enable); if (rc != SQLITE_OK) { @@ -153,22 +159,23 @@ static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyOb } } -PyDoc_STRVAR(module_enable_shared_cache_doc, -"enable_shared_cache(do_enable)\n\ -\n\ -Enable or disable shared cache mode for the calling thread.\n\ -Experimental/Non-standard."); +/*[clinic input] +_sqlite3.register_adapter as pysqlite_register_adapter + + type: object(type='PyTypeObject *') + caster: object + / -static PyObject* module_register_adapter(PyObject* self, PyObject* args) +Registers an adapter with pysqlite's adapter registry. Non-standard. +[clinic start generated code]*/ + +static PyObject * +pysqlite_register_adapter_impl(PyObject *module, PyTypeObject *type, + PyObject *caster) +/*[clinic end generated code: output=a287e8db18e8af23 input=839dad90e2492725]*/ { - PyTypeObject* type; - PyObject* caster; int rc; - if (!PyArg_ParseTuple(args, "OO", &type, &caster)) { - return NULL; - } - /* a basic type is adapted; there's a performance optimization if that's not the case * (99 % of all usages) */ if (type == &PyLong_Type || type == &PyFloat_Type @@ -183,23 +190,25 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args) Py_RETURN_NONE; } -PyDoc_STRVAR(module_register_adapter_doc, -"register_adapter(type, callable)\n\ -\n\ -Registers an adapter with pysqlite's adapter registry. Non-standard."); +/*[clinic input] +_sqlite3.register_converter as pysqlite_register_converter + + name as orig_name: unicode + converter as callable: object + / -static PyObject* module_register_converter(PyObject* self, PyObject* args) +Registers a converter with pysqlite. Non-standard. +[clinic start generated code]*/ + +static PyObject * +pysqlite_register_converter_impl(PyObject *module, PyObject *orig_name, + PyObject *callable) +/*[clinic end generated code: output=a2f2bfeed7230062 input=e074cf7f4890544f]*/ { - PyObject* orig_name; PyObject* name = NULL; - PyObject* callable; PyObject* retval = NULL; _Py_IDENTIFIER(upper); - if (!PyArg_ParseTuple(args, "UO", &orig_name, &callable)) { - return NULL; - } - /* convert the name to upper case */ name = _PyObject_CallMethodIdNoArgs(orig_name, &PyId_upper); if (!name) { @@ -217,24 +226,42 @@ static PyObject* module_register_converter(PyObject* self, PyObject* args) return retval; } -PyDoc_STRVAR(module_register_converter_doc, -"register_converter(typename, callable)\n\ -\n\ -Registers a converter with pysqlite. Non-standard."); +/*[clinic input] +_sqlite3.enable_callback_tracebacks as pysqlite_enable_callback_trace -static PyObject* enable_callback_tracebacks(PyObject* self, PyObject* args) + enable: int + / + +Enable or disable callback functions throwing errors to stderr. +[clinic start generated code]*/ + +static PyObject * +pysqlite_enable_callback_trace_impl(PyObject *module, int enable) +/*[clinic end generated code: output=4ff1d051c698f194 input=cb79d3581eb77c40]*/ { - if (!PyArg_ParseTuple(args, "i", &_pysqlite_enable_callback_tracebacks)) { - return NULL; - } + _pysqlite_enable_callback_tracebacks = enable; Py_RETURN_NONE; } -PyDoc_STRVAR(enable_callback_tracebacks_doc, -"enable_callback_tracebacks(flag)\n\ -\n\ -Enable or disable callback functions throwing errors to stderr."); +/*[clinic input] +_sqlite3.adapt as pysqlite_adapt + + obj: object + proto: object(c_default='(PyObject*)pysqlite_PrepareProtocolType') = PrepareProtocolType + alt: object = NULL + / + +Adapt given object to given protocol. Non-standard. +[clinic start generated code]*/ + +static PyObject * +pysqlite_adapt_impl(PyObject *module, PyObject *obj, PyObject *proto, + PyObject *alt) +/*[clinic end generated code: output=0c3927c5fcd23dd9 input=a58ab77fb5ae22dd]*/ +{ + return pysqlite_microprotocols_adapt(obj, proto, alt); +} static void converters_init(PyObject* module) { @@ -252,18 +279,12 @@ static void converters_init(PyObject* module) static PyMethodDef module_methods[] = { {"connect", (PyCFunction)(void(*)(void))module_connect, METH_VARARGS | METH_KEYWORDS, module_connect_doc}, - {"complete_statement", (PyCFunction)(void(*)(void))module_complete, - METH_VARARGS | METH_KEYWORDS, module_complete_doc}, - {"enable_shared_cache", (PyCFunction)(void(*)(void))module_enable_shared_cache, - METH_VARARGS | METH_KEYWORDS, module_enable_shared_cache_doc}, - {"register_adapter", (PyCFunction)module_register_adapter, - METH_VARARGS, module_register_adapter_doc}, - {"register_converter", (PyCFunction)module_register_converter, - METH_VARARGS, module_register_converter_doc}, - {"adapt", (PyCFunction)pysqlite_adapt, METH_VARARGS, - pysqlite_adapt_doc}, - {"enable_callback_tracebacks", (PyCFunction)enable_callback_tracebacks, - METH_VARARGS, enable_callback_tracebacks_doc}, + PYSQLITE_ADAPT_METHODDEF + PYSQLITE_COMPLETE_STATEMENT_METHODDEF + PYSQLITE_ENABLE_CALLBACK_TRACE_METHODDEF + PYSQLITE_ENABLE_SHARED_CACHE_METHODDEF + PYSQLITE_REGISTER_ADAPTER_METHODDEF + PYSQLITE_REGISTER_CONVERTER_METHODDEF {NULL, NULL} }; From 29d2104a88656f4dec2dc4f1c865bd59baf6d4a2 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Sat, 31 Oct 2020 23:08:17 +0800 Subject: [PATCH 0427/1261] bpo-42198: Improve consistency of Union docs (GH-23029) No backport is required since union is only in 3.10. This addresses "3. Consistency nitpicks for Union's docs" in the bpo. Please skip news. Thank you. --- Doc/library/stdtypes.rst | 37 ++++++++++++++----------------------- Doc/whatsnew/3.10.rst | 2 +- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 09477e63786c59..8a9cadde7d5dc4 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4968,15 +4968,16 @@ Union Type pair: union; type A union object holds the value of the ``|`` (bitwise or) operation on -multiple :ref:`type objects`. These types are intended -primarily for type annotations. The union type expression enables cleaner -type hinting syntax compared to :data:`typing.Union`. +multiple :ref:`type objects `. These types are intended +primarily for :term:`type annotations `. The union type expression +enables cleaner type hinting syntax compared to :data:`typing.Union`. .. describe:: X | Y | ... Defines a union object which holds types *X*, *Y*, and so forth. ``X | Y`` means either X or Y. It is equivalent to ``typing.Union[X, Y]``. - Example:: + For example, the following function expects an argument of type + :class:`int` or :class:`float`:: def square(number: int | float) -> int | float: return number ** 2 @@ -4985,15 +4986,15 @@ type hinting syntax compared to :data:`typing.Union`. Union objects can be tested for equality with other union objects. Details: - * Unions of unions are flattened, e.g.:: + * Unions of unions are flattened:: (int | str) | float == int | str | float - * Redundant types are removed, e.g.:: + * Redundant types are removed:: int | str | int == int | str - * When comparing unions, the order is ignored, e.g.:: + * When comparing unions, the order is ignored:: int | str == str | int @@ -5012,14 +5013,8 @@ type hinting syntax compared to :data:`typing.Union`. >>> isinstance("", int | str) True - .. - At the time of writing this, there is no documentation for parameterized - generics or PEP 585. Thus the link currently points to PEP 585 itself. - Please change the link for parameterized generics to reference the correct - documentation once documentation for PEP 585 becomes available. - - However, union objects containing `parameterized generics - `_ cannot be used:: + However, union objects containing :ref:`parameterized generics + ` cannot be used:: >>> isinstance(1, int | list[int]) Traceback (most recent call last): @@ -5033,20 +5028,16 @@ type hinting syntax compared to :data:`typing.Union`. >>> issubclass(bool, int | str) True - .. - Once again, please change the link below for parameterized generics to - reference the correct documentation once documentation for PEP 585 - becomes available. - - However, union objects containing `parameterized generics - `_ cannot be used:: + However, union objects containing :ref:`parameterized generics + ` cannot be used:: >>> issubclass(bool, bool | list[str]) Traceback (most recent call last): File "", line 1, in TypeError: issubclass() argument 2 cannot contain a parameterized generic -The type of a union object is :data:`types.Union`. An object cannot be +The user-exposed type for the union object can be accessed from +:data:`types.Union` and used for :func:`isinstance` checks. An object cannot be instantiated from the type:: >>> import types diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index f4d72908486ddd..60dee0c6bd1651 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -134,7 +134,7 @@ arguments of multiple types, :data:`typing.Union` was used:: return number ** 2 -Now, type hints can be written in a more succinct manner:: +Type hints can now be written in a more succinct manner:: def square(number: int | float) -> int | float: return number ** 2 From b8bb7bdc1fe8a5b9e81828444bb8c06fc7eb21c8 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Sat, 31 Oct 2020 20:31:41 +0200 Subject: [PATCH 0428/1261] bpo-42218: Correctly handle errors in left-recursive rules (GH-23065) Left-recursive rules need to check for errors explicitly, since even if the rule returns NULL, the parsing might continue and lead to long-distance failures. Co-authored-by: Pablo Galindo --- Lib/test/test_syntax.py | 8 ++++++++ .../2020-10-31-17-50-23.bpo-42218.Dp_Z3v.rst | 3 +++ Parser/parser.c | 18 ++++++++++++++++++ Tools/peg_generator/pegen/c_generator.py | 3 +++ 4 files changed, 32 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-31-17-50-23.bpo-42218.Dp_Z3v.rst diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index e89d9401f2c397..91ca1db43a74f2 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -972,6 +972,14 @@ def func2(): """ self._check_error(code, "invalid syntax") + def test_invalid_line_continuation_left_recursive(self): + # Check bpo-42218: SyntaxErrors following left-recursive rules + # (t_primary_raw in this case) need to be tested explicitly + self._check_error("A.\u018a\\ ", + "unexpected character after line continuation character") + self._check_error("A.\u03bc\\\n", + "unexpected EOF while parsing") + def test_main(): support.run_unittest(SyntaxTestCase) from test import test_syntax diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-31-17-50-23.bpo-42218.Dp_Z3v.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-31-17-50-23.bpo-42218.Dp_Z3v.rst new file mode 100644 index 00000000000000..a38a310e4b45b8 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-31-17-50-23.bpo-42218.Dp_Z3v.rst @@ -0,0 +1,3 @@ +Fixed a bug in the PEG parser that was causing crashes in debug mode. Now errors are checked +in left-recursive rules to avoid cases where such errors do not get handled in time and appear +as long-distance crashes in other places. diff --git a/Parser/parser.c b/Parser/parser.c index a882a81344cc61..48ebfe65aedafa 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -3461,6 +3461,8 @@ dotted_name_rule(Parser *p) } p->mark = _mark; void *_raw = dotted_name_raw(p); + if (p->error_indicator) + return NULL; if (_raw == NULL || p->mark <= _resmark) break; _resmark = p->mark; @@ -9045,6 +9047,8 @@ bitwise_or_rule(Parser *p) } p->mark = _mark; void *_raw = bitwise_or_raw(p); + if (p->error_indicator) + return NULL; if (_raw == NULL || p->mark <= _resmark) break; _resmark = p->mark; @@ -9159,6 +9163,8 @@ bitwise_xor_rule(Parser *p) } p->mark = _mark; void *_raw = bitwise_xor_raw(p); + if (p->error_indicator) + return NULL; if (_raw == NULL || p->mark <= _resmark) break; _resmark = p->mark; @@ -9273,6 +9279,8 @@ bitwise_and_rule(Parser *p) } p->mark = _mark; void *_raw = bitwise_and_raw(p); + if (p->error_indicator) + return NULL; if (_raw == NULL || p->mark <= _resmark) break; _resmark = p->mark; @@ -9387,6 +9395,8 @@ shift_expr_rule(Parser *p) } p->mark = _mark; void *_raw = shift_expr_raw(p); + if (p->error_indicator) + return NULL; if (_raw == NULL || p->mark <= _resmark) break; _resmark = p->mark; @@ -9540,6 +9550,8 @@ sum_rule(Parser *p) } p->mark = _mark; void *_raw = sum_raw(p); + if (p->error_indicator) + return NULL; if (_raw == NULL || p->mark <= _resmark) break; _resmark = p->mark; @@ -9699,6 +9711,8 @@ term_rule(Parser *p) } p->mark = _mark; void *_raw = term_raw(p); + if (p->error_indicator) + return NULL; if (_raw == NULL || p->mark <= _resmark) break; _resmark = p->mark; @@ -10303,6 +10317,8 @@ primary_rule(Parser *p) } p->mark = _mark; void *_raw = primary_raw(p); + if (p->error_indicator) + return NULL; if (_raw == NULL || p->mark <= _resmark) break; _resmark = p->mark; @@ -13943,6 +13959,8 @@ t_primary_rule(Parser *p) } p->mark = _mark; void *_raw = t_primary_raw(p); + if (p->error_indicator) + return NULL; if (_raw == NULL || p->mark <= _resmark) break; _resmark = p->mark; diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index 52bdb844e6bdd6..6af0d3f7a2a14d 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -502,6 +502,9 @@ def _set_up_rule_memoization(self, node: Rule, result_type: str) -> None: ) self.print("p->mark = _mark;") self.print(f"void *_raw = {node.name}_raw(p);") + self.print("if (p->error_indicator)") + with self.indent(): + self.print("return NULL;") self.print("if (_raw == NULL || p->mark <= _resmark)") with self.indent(): self.print("break;") From 14c8e7103d8f7ba2ae81997461da6ec81d22835b Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Sun, 1 Nov 2020 04:25:44 +0800 Subject: [PATCH 0429/1261] bpo-42198: New section in stdtypes for type annotation types (GH-23063) --- Doc/library/stdtypes.rst | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 8a9cadde7d5dc4..84d5a3a59f0b40 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4764,10 +4764,20 @@ Compared to the overhead of setting up the runtime context, the overhead of a single class dictionary lookup is negligible. +Type Annotation Types --- :ref:`Generic Alias `, :ref:`Union ` +=============================================================================================== + +.. index:: + single: annotation; type annotation; type hint + +The core built-in types for :term:`type annotations ` are +:ref:`Generic Alias ` and :ref:`Union `. + + .. _types-genericalias: Generic Alias Type -================== +------------------ .. index:: object: GenericAlias @@ -4870,7 +4880,7 @@ in the ``GenericAlias`` object's :attr:`__args__ `. :: Standard Generic Collections ----------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ These standard library collections support parameterized generics. @@ -4915,7 +4925,7 @@ These standard library collections support parameterized generics. Special Attributes of Generic Alias ------------------------------------ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ All parameterized generics implement special read-only attributes. @@ -4961,7 +4971,7 @@ All parameterized generics implement special read-only attributes. .. _types-union: Union Type -========== +---------- .. index:: object: Union From 76c71ae6ad4a48c8e98de415735e9825342cd5cc Mon Sep 17 00:00:00 2001 From: Alexey Izbyshev Date: Sun, 1 Nov 2020 08:33:08 +0300 Subject: [PATCH 0430/1261] bpo-42146: Unify cleanup in subprocess_fork_exec() (GH-22970) * bpo-42146: Unify cleanup in subprocess_fork_exec() Also ignore errors from _enable_gc(): * They are always suppressed by the current code due to a bug. * _enable_gc() is only used if `preexec_fn != None`, which is unsafe. * We don't have a good way to handle errors in case we successfully created a child process. Co-authored-by: Gregory P. Smith --- Modules/_posixsubprocess.c | 53 +++++++++++++------------------------- 1 file changed, 18 insertions(+), 35 deletions(-) diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 5e5fbb2e79a7f8..a00e13739aca4f 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -87,8 +87,8 @@ get_posixsubprocess_state(PyObject *module) #define _posixsubprocessstate_global get_posixsubprocess_state(PyState_FindModule(&_posixsubprocessmodule)) -/* If gc was disabled, call gc.enable(). Return 0 on success. */ -static int +/* If gc was disabled, call gc.enable(). Ignore errors. */ +static void _enable_gc(int need_to_reenable_gc, PyObject *gc_module) { PyObject *result; @@ -98,15 +98,17 @@ _enable_gc(int need_to_reenable_gc, PyObject *gc_module) PyErr_Fetch(&exctype, &val, &tb); result = PyObject_CallMethodNoArgs( gc_module, _posixsubprocessstate_global->enable); + if (result == NULL) { + /* We might have created a child process at this point, we + * we have no good way to handle a failure to reenable GC + * and return information about the child process. */ + PyErr_Print(); + } + Py_XDECREF(result); if (exctype != NULL) { PyErr_Restore(exctype, val, tb); } - if (result == NULL) { - return 1; - } - Py_DECREF(result); } - return 0; } @@ -774,7 +776,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) int child_umask; PyObject *cwd_obj, *cwd_obj2 = NULL; const char *cwd; - pid_t pid; + pid_t pid = -1; int need_to_reenable_gc = 0; char *const *exec_array, *const *argv = NULL, *const *envp = NULL; Py_ssize_t arg_num, num_groups = 0; @@ -1010,8 +1012,6 @@ subprocess_fork_exec(PyObject* self, PyObject *args) sigset_t all_sigs; sigfillset(&all_sigs); if ((saved_errno = pthread_sigmask(SIG_BLOCK, &all_sigs, &old_sigs))) { - errno = saved_errno; - PyErr_SetFromErrno(PyExc_OSError); goto cleanup; } old_sigmask = &old_sigs; @@ -1050,50 +1050,33 @@ subprocess_fork_exec(PyObject* self, PyObject *args) } #endif - Py_XDECREF(cwd_obj2); - if (need_after_fork) PyOS_AfterFork_Parent(); - if (envp) - _Py_FreeCharPArray(envp); - if (argv) - _Py_FreeCharPArray(argv); - _Py_FreeCharPArray(exec_array); - - /* Reenable gc in the parent process (or if fork failed). */ - if (_enable_gc(need_to_reenable_gc, gc_module)) { - pid = -1; - } - PyMem_RawFree(groups); - Py_XDECREF(preexec_fn_args_tuple); - Py_XDECREF(gc_module); - if (pid == -1) { +cleanup: + if (saved_errno != 0) { errno = saved_errno; /* We can't call this above as PyOS_AfterFork_Parent() calls back * into Python code which would see the unreturned error. */ PyErr_SetFromErrno(PyExc_OSError); - return NULL; /* fork() failed. */ } - return PyLong_FromPid(pid); - -cleanup: + Py_XDECREF(preexec_fn_args_tuple); + PyMem_RawFree(groups); Py_XDECREF(cwd_obj2); if (envp) _Py_FreeCharPArray(envp); + Py_XDECREF(converted_args); + Py_XDECREF(fast_args); if (argv) _Py_FreeCharPArray(argv); if (exec_array) _Py_FreeCharPArray(exec_array); - PyMem_RawFree(groups); - Py_XDECREF(converted_args); - Py_XDECREF(fast_args); - Py_XDECREF(preexec_fn_args_tuple); _enable_gc(need_to_reenable_gc, gc_module); Py_XDECREF(gc_module); - return NULL; + + return pid == -1 ? NULL : PyLong_FromPid(pid); } From 69dccec6f7c1a8620d321ec88d9224eac63297d1 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sun, 1 Nov 2020 10:08:48 +0100 Subject: [PATCH 0431/1261] bpo-29566: binhex.binhex now consitently writes MacOS 9 line endings. (GH-23059) [bpo-29566]() notes that binhex.binhex uses inconsistent line endings (both Unix and MacOS9 line endings are used). This PR changes this to use the MacOS9 line endings everywhere. --- Lib/binhex.py | 4 ++-- Lib/test/test_binhex.py | 12 ++++++++++++ .../Library/2020-10-31-13-28-36.bpo-29566.6aDbty.rst | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-31-13-28-36.bpo-29566.6aDbty.rst diff --git a/Lib/binhex.py b/Lib/binhex.py index 9559f46d5a2882..ace5217d271392 100644 --- a/Lib/binhex.py +++ b/Lib/binhex.py @@ -117,12 +117,12 @@ def _flush(self, force): first = 0 while first <= len(self.hqxdata) - self.linelen: last = first + self.linelen - self.ofp.write(self.hqxdata[first:last] + b'\n') + self.ofp.write(self.hqxdata[first:last] + b'\r') self.linelen = LINELEN first = last self.hqxdata = self.hqxdata[first:] if force: - self.ofp.write(self.hqxdata + b':\n') + self.ofp.write(self.hqxdata + b':\r') def close(self): if self.data: diff --git a/Lib/test/test_binhex.py b/Lib/test/test_binhex.py index 5e59f5761514c6..efc1654a6b7107 100644 --- a/Lib/test/test_binhex.py +++ b/Lib/test/test_binhex.py @@ -52,6 +52,18 @@ def test_binhex_error_on_long_filename(self): self.assertRaises(binhex.Error, binhex.binhex, self.fname3, self.fname2) + def test_binhex_line_endings(self): + # bpo-29566: Ensure the line endings are those for macOS 9 + with open(self.fname1, 'wb') as f: + f.write(self.DATA) + + binhex.binhex(self.fname1, self.fname2) + + with open(self.fname2, 'rb') as fp: + contents = fp.read() + + self.assertNotIn(b'\n', contents) + def test_main(): support.run_unittest(BinHexTestCase) diff --git a/Misc/NEWS.d/next/Library/2020-10-31-13-28-36.bpo-29566.6aDbty.rst b/Misc/NEWS.d/next/Library/2020-10-31-13-28-36.bpo-29566.6aDbty.rst new file mode 100644 index 00000000000000..d54c714688531a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-31-13-28-36.bpo-29566.6aDbty.rst @@ -0,0 +1 @@ +``binhex.binhex()`` consisently writes macOS 9 line endings. From 45acc85336320cd023053e90f2993a07df6ff78e Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Sun, 1 Nov 2020 20:02:03 +0900 Subject: [PATCH 0432/1261] tempfile: Use random.choises() instead of choise() (GH-23068) --- Lib/tempfile.py | 5 +---- Lib/test/test_tempfile.py | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 770f72c25295cb..c3fe61aa0af4f7 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -143,10 +143,7 @@ def __iter__(self): return self def __next__(self): - c = self.characters - choose = self.rng.choice - letters = [choose(c) for dummy in range(8)] - return ''.join(letters) + return ''.join(self.rng.choices(self.characters, k=8)) def _candidate_tempdir_list(): """Generate a list of candidate temporary directories which diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 8ace883d74bb24..77d710efaf107b 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -153,8 +153,8 @@ def setUp(self): self.r = tempfile._RandomNameSequence() super().setUp() - def test_get_six_char_str(self): - # _RandomNameSequence returns a six-character string + def test_get_eight_char_str(self): + # _RandomNameSequence returns a eight-character string s = next(self.r) self.nameCheck(s, '', '', '') From 918485fa2b503e7714d7f2dd4596c1762d25478e Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 1 Nov 2020 22:04:35 +0900 Subject: [PATCH 0433/1261] bpo-37483: Add PyObject_CallOneArg() in the What's New in Python 3.9 (GH-23062) --- Doc/whatsnew/3.9.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 1a37f16ea2b09a..a601b16f1c6059 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -1289,6 +1289,10 @@ New Features representation of a function-like object. (Patch by Jeroen Demeyer in :issue:`37645`.) +* Added :c:func:`PyObject_CallOneArg` for calling an object with one + positional argument + (Patch by Jeroen Demeyer in :issue:`37483`.) + Porting to Python 3.9 --------------------- From d3ac4c6af23e4d5523daae94c5c33335350eb076 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 1 Nov 2020 09:10:06 -0800 Subject: [PATCH 0434/1261] Expand and clarify the "Invoking Descriptors" section of the Descriptor HowTo (GH-23078) --- Doc/howto/descriptor.rst | 115 +++++++++++++++++++++++++------------ Doc/tools/susp-ignored.csv | 2 +- 2 files changed, 79 insertions(+), 38 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index f1d1ab1d1d6101..5de6d32f22f906 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -52,7 +52,7 @@ To use the descriptor, it must be stored as a class variable in another class:: class A: x = 5 # Regular class attribute - y = Ten() # Descriptor + y = Ten() # Descriptor instance An interactive session shows the difference between normal attribute lookup and descriptor lookup:: @@ -80,7 +80,6 @@ Dynamic lookups Interesting descriptors typically run computations instead of doing lookups:: - import os class DirectorySize: @@ -90,7 +89,7 @@ Interesting descriptors typically run computations instead of doing lookups:: class Directory: - size = DirectorySize() # Descriptor + size = DirectorySize() # Descriptor instance def __init__(self, dirname): self.dirname = dirname # Regular instance attribute @@ -147,11 +146,11 @@ the lookup or update:: class Person: - age = LoggedAgeAccess() # Descriptor + age = LoggedAgeAccess() # Descriptor instance def __init__(self, name, age): self.name = name # Regular instance attribute - self.age = age # Calls the descriptor + self.age = age # Calls __set__() def birthday(self): self.age += 1 # Calls both __get__() and __set__() @@ -221,8 +220,8 @@ be recorded, giving each descriptor its own *public_name* and *private_name*:: class Person: - name = LoggedAccess() # First descriptor - age = LoggedAccess() # Second descriptor + name = LoggedAccess() # First descriptor instance + age = LoggedAccess() # Second descriptor instance def __init__(self, name, age): self.name = name # Calls the first descriptor @@ -494,56 +493,98 @@ called. Defining the :meth:`__set__` method with an exception raising placeholder is enough to make it a data descriptor. -Invoking Descriptors --------------------- +Overview of Descriptor Invocation +--------------------------------- -A descriptor can be called directly by its method name. For example, -``d.__get__(obj)``. +A descriptor can be called directly with ``desc.__get__(obj)`` or +``desc.__get__(None, cls)``. But it is more common for a descriptor to be invoked automatically from -attribute access. The expression ``obj.d`` looks up ``d`` in the dictionary of -``obj``. If ``d`` defines the method :meth:`__get__`, then ``d.__get__(obj)`` -is invoked according to the precedence rules listed below. +attribute access. + +The expression ``obj.x`` looks up the attribute ``x`` in the chain of +namespaces for ``obj``. If the search finds a descriptor, its :meth:`__get__` +method is invoked according to the precedence rules listed below. The details of invocation depend on whether ``obj`` is an object, class, or instance of super. -**Objects**: The machinery is in :meth:`object.__getattribute__`. -It transforms ``b.x`` into ``type(b).__dict__['x'].__get__(b, type(b))``. +Invocation from an Instance +--------------------------- + +Instance lookup scans through a chain of namespaces giving data descriptors +the highest priority, followed by instance variables, then non-data +descriptors, then class variables, and lastly :meth:`__getattr__` if it is +provided. + +If a descriptor is found for ``a.x``, then it is invoked with: +``desc.__get__(a, type(a))``. + +The logic for a dotted lookup is in :meth:`object.__getattribute__`. Here is +a pure Python equivalent:: + + def object_getattribute(obj, name): + "Emulate PyObject_GenericGetAttr() in Objects/object.c" + null = object() + objtype = type(obj) + value = getattr(objtype, name, null) + if value is not null and hasattr(value, '__get__'): + if hasattr(value, '__set__') or hasattr(value, '__delete__'): + return value.__get__(obj, objtype) # data descriptor + try: + return vars(obj)[name] # instance variable + except (KeyError, TypeError): + pass + if hasattr(value, '__get__'): + return value.__get__(obj, objtype) # non-data descriptor + if value is not null: + return value # class variable + # Emulate slot_tp_getattr_hook() in Objects/typeobject.c + if hasattr(objtype, '__getattr__'): + return objtype.__getattr__(obj, name) # __getattr__ hook + raise AttributeError(name) + +The :exc:`TypeError` exception handler is needed because the instance dictionary +doesn't exist when its class defines :term:`__slots__`. -The implementation works through a precedence chain that gives data descriptors -priority over instance variables, instance variables priority over non-data -descriptors, and assigns lowest priority to :meth:`__getattr__` if provided. -The full C implementation can be found in :c:func:`PyObject_GenericGetAttr()` in -:source:`Objects/object.c`. +Invocation from a Class +----------------------- -**Classes**: The machinery is in :meth:`type.__getattribute__`. +The logic for a dotted lookup such as ``A.x`` is in +:meth:`type.__getattribute__`. The steps are similar to those for +:meth:`object.__getattribute__` but the instance dictionary lookup is replaced +by a search through the class's :term:`method resolution order`. -It transforms ``A.x`` into ``A.__dict__['x'].__get__(None, A)``. +If a descriptor is found, it is invoked with ``desc.__get__(None, A)``. -The full C implementation can be found in :c:func:`type_getattro()` in -:source:`Objects/typeobject.c`. +The full C implementation can be found in :c:func:`type_getattro()` and +:c:func:`_PyType_Lookup()` in :source:`Objects/typeobject.c`. -**Super**: The machinery is in the custom :meth:`__getattribute__` method for + +Invocation from Super +--------------------- + +The logic for super's dotted lookup is in the :meth:`__getattribute__` method for object returned by :class:`super()`. -The attribute lookup ``super(A, obj).m`` searches ``obj.__class__.__mro__`` for -the base class ``B`` immediately following ``A`` and then returns +A dotted lookup such as ``super(A, obj).m`` searches ``obj.__class__.__mro__`` +for the base class ``B`` immediately following ``A`` and then returns ``B.__dict__['m'].__get__(obj, A)``. If not a descriptor, ``m`` is returned -unchanged. If not in the dictionary, ``m`` reverts to a search using -:meth:`object.__getattribute__`. +unchanged. -The implementation details are in :c:func:`super_getattro()` in +The full C implementation can be found in :c:func:`super_getattro()` in :source:`Objects/typeobject.c`. A pure Python equivalent can be found in -`Guido's Tutorial`_. +`Guido's Tutorial +`_. -.. _`Guido's Tutorial`: https://www.python.org/download/releases/2.2.3/descrintro/#cooperation -**Summary**: The mechanism for descriptors is embedded in the -:meth:`__getattribute__()` methods for :class:`object`, :class:`type`, and -:func:`super`. +Summary of Invocation Logic +--------------------------- + +The mechanism for descriptors is embedded in the :meth:`__getattribute__()` +methods for :class:`object`, :class:`type`, and :func:`super`. The important points to remember are: @@ -652,7 +693,7 @@ Pure Python Equivalents ^^^^^^^^^^^^^^^^^^^^^^^ The descriptor protocol is simple and offers exciting possibilities. Several -use cases are so common that they have been prepackaged into builtin tools. +use cases are so common that they have been prepackaged into built-in tools. Properties, bound methods, static methods, and class methods are all based on the descriptor protocol. diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 0c1dec700121b6..0885c344ac74c1 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -5,7 +5,7 @@ c-api/sequence,,:i2,o[i1:i2] c-api/tuple,,:high,p[low:high] c-api/unicode,,:end,str[start:end] c-api/unicode,,:start,unicode[start:start+length] -distutils/examples,267,`,This is the description of the ``foobar`` package. +distutils/examples,,`,This is the description of the ``foobar`` package. distutils/setupscript,,::, extending/embedding,,:numargs,"if(!PyArg_ParseTuple(args, "":numargs""))" extending/extending,,:myfunction,"PyArg_ParseTuple(args, ""D:myfunction"", &c);" From 5f8aa04650d281d34a5092689ba7fb09e108d248 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Mon, 2 Nov 2020 02:13:38 +0800 Subject: [PATCH 0435/1261] bpo-42233: Correctly repr GenericAlias when used with typing module (GH-23081) Noticed by @serhiy-storchaka in the bpo. `typing`'s types were not showing the parameterized generic. Eg. previously: ```python >>> typing.Union[dict[str, float], list[int]] 'typing.Union[dict, list]' ``` Now: ```python >>> typing.Union[dict[str, float], list[int]] 'typing.Union[dict[str, float], list[int]]' ``` Automerge-Triggered-By: GH:gvanrossum --- Lib/test/test_typing.py | 7 +++++++ Lib/typing.py | 2 ++ .../next/Library/2020-11-02-01-31-15.bpo-42233.YxRj-h.rst | 3 +++ 3 files changed, 12 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-11-02-01-31-15.bpo-42233.YxRj-h.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 57dd73c529da56..2ab8be49b2875a 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -300,6 +300,8 @@ def test_repr(self): self.assertEqual(repr(u), repr(int)) u = Union[List[int], int] self.assertEqual(repr(u), 'typing.Union[typing.List[int], int]') + u = Union[list[int], dict[str, float]] + self.assertEqual(repr(u), 'typing.Union[list[int], dict[str, float]]') def test_cannot_subclass(self): with self.assertRaises(TypeError): @@ -407,6 +409,7 @@ def test_repr(self): self.assertEqual(repr(Tuple[()]), 'typing.Tuple[()]') self.assertEqual(repr(Tuple[int, float]), 'typing.Tuple[int, float]') self.assertEqual(repr(Tuple[int, ...]), 'typing.Tuple[int, ...]') + self.assertEqual(repr(Tuple[list[int]]), 'typing.Tuple[list[int]]') def test_errors(self): with self.assertRaises(TypeError): @@ -479,6 +482,8 @@ def test_repr(self): self.assertEqual(repr(ct2), 'typing.Callable[[str, float], int]') ctv = Callable[..., str] self.assertEqual(repr(ctv), 'typing.Callable[..., str]') + ct3 = Callable[[str, float], list[int]] + self.assertEqual(repr(ct3), 'typing.Callable[[str, float], list[int]]') def test_callable_with_ellipsis(self): @@ -2269,6 +2274,8 @@ def test_repr(self): self.assertEqual(repr(cv), 'typing.Final[int]') cv = Final[Employee] self.assertEqual(repr(cv), 'typing.Final[%s.Employee]' % __name__) + cv = Final[tuple[int]] + self.assertEqual(repr(cv), 'typing.Final[tuple[int]]') def test_cannot_subclass(self): with self.assertRaises(TypeError): diff --git a/Lib/typing.py b/Lib/typing.py index 0f457ab1f56dfc..3fa97a4a15f954 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -162,6 +162,8 @@ def _type_repr(obj): typically enough to uniquely identify a type. For everything else, we fall back on repr(obj). """ + if isinstance(obj, types.GenericAlias): + return repr(obj) if isinstance(obj, type): if obj.__module__ == 'builtins': return obj.__qualname__ diff --git a/Misc/NEWS.d/next/Library/2020-11-02-01-31-15.bpo-42233.YxRj-h.rst b/Misc/NEWS.d/next/Library/2020-11-02-01-31-15.bpo-42233.YxRj-h.rst new file mode 100644 index 00000000000000..aad4249fa165bf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-02-01-31-15.bpo-42233.YxRj-h.rst @@ -0,0 +1,3 @@ +The :func:`repr` of :mod:`typing` types containing +:ref:`Generic Alias Types ` previously did not show the +parameterized types in the ``GenericAlias``. They have now been changed to do so. From 9fba6cc94d4204d40be54ea11668f89842f1f726 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 1 Nov 2020 20:59:35 +0100 Subject: [PATCH 0436/1261] bpo-42236: Enhance _locale._get_locale_encoding() (GH-23083) * Rename _Py_GetLocaleEncoding() to _Py_GetLocaleEncodingObject() * Add _Py_GetLocaleEncoding() which returns a wchar_t* string to share code between _Py_GetLocaleEncodingObject() and config_get_locale_encoding(). * _Py_GetLocaleEncodingObject() now decodes nl_langinfo(CODESET) from the current locale encoding with surrogateescape, rather than using UTF-8. --- Include/internal/pycore_fileutils.h | 3 +- Modules/_io/textio.c | 2 +- Modules/_localemodule.c | 2 +- Python/fileutils.c | 74 +++++++++++++++++++++++------ Python/initconfig.c | 47 +++++------------- 5 files changed, 76 insertions(+), 52 deletions(-) diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index ff7bc4874c7971..1ab554f9451cbd 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -50,7 +50,8 @@ PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( PyAPI_FUNC(void) _Py_closerange(int first, int last); -PyAPI_FUNC(PyObject*) _Py_GetLocaleEncoding(void); +PyAPI_FUNC(wchar_t*) _Py_GetLocaleEncoding(const char **errmsg); +PyAPI_FUNC(PyObject*) _Py_GetLocaleEncodingObject(void); #ifdef __cplusplus } diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 2078bb316b2821..f08d14e18b4021 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -1155,7 +1155,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, } } if (encoding == NULL && self->encoding == NULL) { - self->encoding = _Py_GetLocaleEncoding(); + self->encoding = _Py_GetLocaleEncodingObject(); if (self->encoding == NULL) { goto error; } diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 359deb7544043b..7b3597e06064b9 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -783,7 +783,7 @@ static PyObject * _locale__get_locale_encoding_impl(PyObject *module) /*[clinic end generated code: output=e8e2f6f6f184591a input=513d9961d2f45c76]*/ { - return _Py_GetLocaleEncoding(); + return _Py_GetLocaleEncodingObject(); } diff --git a/Python/fileutils.c b/Python/fileutils.c index ba2690429f366c..72cdee2a511f93 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -821,23 +821,41 @@ _Py_EncodeLocaleEx(const wchar_t *text, char **str, } -// Get the current locale encoding: locale.getpreferredencoding(False). +// Get the current locale encoding name: +// +// - Return "UTF-8" if _Py_FORCE_UTF8_LOCALE macro is defined (ex: on Android) +// - Return "UTF-8" if the UTF-8 Mode is enabled +// - On Windows, return the ANSI code page (ex: "cp1250") +// - Return "UTF-8" if nl_langinfo(CODESET) returns an empty string +// and if the _Py_FORCE_UTF8_FS_ENCODING macro is defined (ex: on macOS). +// - Otherwise, return nl_langinfo(CODESET). +// +// Return NULL and set errmsg to an error message +// if nl_langinfo(CODESET) fails. +// +// Return NULL and set errmsg to NULL on memory allocation failure. +// // See also config_get_locale_encoding() -PyObject * -_Py_GetLocaleEncoding(void) +wchar_t* +_Py_GetLocaleEncoding(const char **errmsg) { + *errmsg = NULL; #ifdef _Py_FORCE_UTF8_LOCALE // On Android langinfo.h and CODESET are missing, // and UTF-8 is always used in mbstowcs() and wcstombs(). - return PyUnicode_FromString("UTF-8"); + return _PyMem_RawWcsdup(L"UTF-8"); #else const PyPreConfig *preconfig = &_PyRuntime.preconfig; if (preconfig->utf8_mode) { - return PyUnicode_FromString("UTF-8"); + return _PyMem_RawWcsdup(L"UTF-8"); } -#if defined(MS_WINDOWS) - return PyUnicode_FromFormat("cp%u", GetACP()); +#ifdef MS_WINDOWS + wchar_t encoding[23]; + unsigned int ansi_codepage = GetACP(); + swprintf(encoding, Py_ARRAY_LENGTH(encoding), L"cp%u", ansi_codepage); + encoding[Py_ARRAY_LENGTH(encoding) - 1] = 0; + return _PyMem_RawWcsdup(encoding); #else const char *encoding = nl_langinfo(CODESET); if (!encoding || encoding[0] == '\0') { @@ -845,19 +863,45 @@ _Py_GetLocaleEncoding(void) // nl_langinfo() can return an empty string when the LC_CTYPE locale is // not supported. Default to UTF-8 in that case, because UTF-8 is the // default charset on macOS. - encoding = "UTF-8"; + return _PyMem_RawWcsdup(L"UTF-8"); #else - PyErr_SetString(PyExc_ValueError, - "failed to get the locale encoding: " - "nl_langinfo(CODESET) returns an empty string"); + *errmsg = "failed to get the locale encoding: " + "nl_langinfo(CODESET) returns an empty string"; return NULL; #endif } - // Decode from UTF-8 - return PyUnicode_FromString(encoding); -#endif // !CODESET -#endif + wchar_t *wstr; + int res = decode_current_locale(encoding, &wstr, NULL, + errmsg, _Py_ERROR_SURROGATEESCAPE); + if (res < 0) { + return NULL; + } + return wstr; +#endif // !MS_WINDOWS + +#endif // !_Py_FORCE_UTF8_LOCALE +} + + +PyObject * +_Py_GetLocaleEncodingObject(void) +{ + const char *errmsg; + wchar_t *encoding = _Py_GetLocaleEncoding(&errmsg); + if (encoding == NULL) { + if (errmsg != NULL) { + PyErr_SetString(PyExc_ValueError, errmsg); + } + else { + PyErr_NoMemory(); + } + return NULL; + } + + PyObject *str = PyUnicode_FromWideChar(encoding, -1); + PyMem_RawFree(encoding); + return str; } diff --git a/Python/initconfig.c b/Python/initconfig.c index e129278d8f8ad8..56f4297ba93bc3 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -11,11 +11,7 @@ #include "osdefs.h" // DELIM #include // setlocale() -#ifdef HAVE_LANGINFO_H -# include // nl_langinfo(CODESET) -#endif #if defined(MS_WINDOWS) || defined(__CYGWIN__) -# include // GetACP() # ifdef HAVE_IO_H # include # endif @@ -1497,41 +1493,24 @@ config_get_stdio_errors(const PyPreConfig *preconfig) } -// See also _Py_GetLocaleEncoding() and config_get_fs_encoding() +// See also config_get_fs_encoding() static PyStatus config_get_locale_encoding(PyConfig *config, const PyPreConfig *preconfig, wchar_t **locale_encoding) { -#ifdef _Py_FORCE_UTF8_LOCALE - return PyConfig_SetString(config, locale_encoding, L"utf-8"); -#else - if (preconfig->utf8_mode) { - return PyConfig_SetString(config, locale_encoding, L"utf-8"); - } - -#ifdef MS_WINDOWS - char encoding[20]; - PyOS_snprintf(encoding, sizeof(encoding), "cp%u", GetACP()); - return PyConfig_SetBytesString(config, locale_encoding, encoding); -#else - const char *encoding = nl_langinfo(CODESET); - if (!encoding || encoding[0] == '\0') { -#ifdef _Py_FORCE_UTF8_FS_ENCODING - // nl_langinfo() can return an empty string when the LC_CTYPE locale is - // not supported. Default to UTF-8 in that case, because UTF-8 is the - // default charset on macOS. - encoding = "UTF-8"; -#else - return _PyStatus_ERR("failed to get the locale encoding: " - "nl_langinfo(CODESET) returns an empty string"); -#endif + const char *errmsg; + wchar_t *encoding = _Py_GetLocaleEncoding(&errmsg); + if (encoding == NULL) { + if (errmsg != NULL) { + return _PyStatus_ERR(errmsg); + } + else { + return _PyStatus_NO_MEMORY(); + } } - /* nl_langinfo(CODESET) is decoded by Py_DecodeLocale() */ - return CONFIG_SET_BYTES_STR(config, - locale_encoding, encoding, - "nl_langinfo(CODESET)"); -#endif // !MS_WINDOWS -#endif // !_Py_FORCE_UTF8_LOCALE + PyStatus status = PyConfig_SetString(config, locale_encoding, encoding); + PyMem_RawFree(encoding); + return status; } From 03c9e0dd193b6ec7a882314f15c30faefa0fa80d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 1 Nov 2020 23:07:23 +0100 Subject: [PATCH 0437/1261] bpo-42236: Use UTF-8 encoding if nl_langinfo(CODESET) fails (GH-23086) If the nl_langinfo(CODESET) function returns an empty string, Python now uses UTF-8 as the filesystem encoding. In May 2010 (commit b744ba1d14c5487576c95d0311e357b707600b47), I modified Python to log a warning and use UTF-8 as the filesystem encoding (instead of None) if nl_langinfo(CODESET) returns an empty string. In August 2020 (commit 94908bbc1503df830d1d615e7b57744ae1b41079), I modified Python startup to fail with a fatal error and a specific error message if nl_langinfo(CODESET) returns an empty string. The intent was to prevent guessing the encoding and also investigate user configuration where this case happens. In 10 years (2010 to 2020), I saw zero user report about the error message related to nl_langinfo(CODESET) returning an empty string. Today, UTF-8 became the defacto standard and it's safe to make the assumption that the user expects UTF-8. For example, nl_langinfo(CODESET) can return an empty string on macOS if the LC_CTYPE locale is not supported, and UTF-8 is the default encoding on macOS. While this change is likely to not affect anyone in practice, it should make UTF-8 lover happy ;-) Rewrite also the documentation explaining how Python selects the filesystem encoding and error handler. --- Doc/c-api/init_config.rst | 52 +++++++++++++++++-- Doc/library/sys.rst | 31 +++++------ Include/cpython/initconfig.h | 37 +++---------- Include/internal/pycore_fileutils.h | 2 +- Include/pyport.h | 8 ++- .../2020-11-01-21-21-38.bpo-42236.MPx-NK.rst | 2 + Python/fileutils.c | 34 +++--------- Python/initconfig.c | 12 ++--- 8 files changed, 88 insertions(+), 90 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-01-21-21-38.bpo-42236.MPx-NK.rst diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 37f5b9f880bf14..92a6c3a56d67fb 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -253,10 +253,16 @@ PyPreConfig See :c:member:`PyConfig.isolated`. - .. c:member:: int legacy_windows_fs_encoding (Windows only) + .. c:member:: int legacy_windows_fs_encoding - If non-zero, disable UTF-8 Mode, set the Python filesystem encoding to - ``mbcs``, set the filesystem error handler to ``replace``. + If non-zero: + + * Set :c:member:`PyPreConfig.utf8_mode` to ``0``, + * Set :c:member:`PyConfig.filesystem_encoding` to ``"mbcs"``, + * Set :c:member:`PyConfig.filesystem_errors` to ``"replace"``. + + Initialized the from :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment + variable value. Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for Windows specific code. @@ -499,11 +505,47 @@ PyConfig .. c:member:: wchar_t* filesystem_encoding - Filesystem encoding, :func:`sys.getfilesystemencoding`. + Filesystem encoding: :func:`sys.getfilesystemencoding`. + + On macOS, Android and VxWorks: use ``"utf-8"`` by default. + + On Windows: use ``"utf-8"`` by default, or ``"mbcs"`` if + :c:member:`~PyPreConfig.legacy_windows_fs_encoding` of + :c:type:`PyPreConfig` is non-zero. + + Default encoding on other platforms: + + * ``"utf-8"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero. + * ``"ascii"`` if Python detects that ``nl_langinfo(CODESET)`` announces + the ASCII encoding (or Roman8 encoding on HP-UX), whereas the + ``mbstowcs()`` function decodes from a different encoding (usually + Latin1). + * ``"utf-8"`` if ``nl_langinfo(CODESET)`` returns an empty string. + * Otherwise, use the LC_CTYPE locale encoding: + ``nl_langinfo(CODESET)`` result. + + At Python statup, the encoding name is normalized to the Python codec + name. For example, ``"ANSI_X3.4-1968"`` is replaced with ``"ascii"``. + + See also the :c:member:`~PyConfig.filesystem_errors` member. .. c:member:: wchar_t* filesystem_errors - Filesystem encoding errors, :func:`sys.getfilesystemencodeerrors`. + Filesystem error handler: :func:`sys.getfilesystemencodeerrors`. + + On Windows: use ``"surrogatepass"`` by default, or ``"replace"`` if + :c:member:`~PyPreConfig.legacy_windows_fs_encoding` of + :c:type:`PyPreConfig` is non-zero. + + On other platforms: use ``"surrogateescape"`` by default. + + Supported error handlers: + + * ``"strict"`` + * ``"surrogateescape"`` + * ``"surrogatepass"`` (only supported with the UTF-8 encoding) + + See also the :c:member:`~PyConfig.filesystem_encoding` member. .. c:member:: unsigned long hash_seed .. c:member:: int use_hash_seed diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 468a30d326891b..2f0840e2a74e2f 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -616,29 +616,20 @@ always available. .. function:: getfilesystemencoding() Return the name of the encoding used to convert between Unicode - filenames and bytes filenames. For best compatibility, str should be - used for filenames in all cases, although representing filenames as bytes - is also supported. Functions accepting or returning filenames should support - either str or bytes and internally convert to the system's preferred - representation. + filenames and bytes filenames. + + For best compatibility, str should be used for filenames in all cases, + although representing filenames as bytes is also supported. Functions + accepting or returning filenames should support either str or bytes and + internally convert to the system's preferred representation. This encoding is always ASCII-compatible. :func:`os.fsencode` and :func:`os.fsdecode` should be used to ensure that the correct encoding and errors mode are used. - * In the UTF-8 mode, the encoding is ``utf-8`` on any platform. - - * On macOS, the encoding is ``'utf-8'``. - - * On Unix, the encoding is the locale encoding. - - * On Windows, the encoding may be ``'utf-8'`` or ``'mbcs'``, depending - on user configuration. - - * On Android, the encoding is ``'utf-8'``. - - * On VxWorks, the encoding is ``'utf-8'``. + The filesystem encoding is initialized from + :c:member:`PyConfig.filesystem_encoding`. .. versionchanged:: 3.2 :func:`getfilesystemencoding` result cannot be ``None`` anymore. @@ -660,6 +651,9 @@ always available. :func:`os.fsencode` and :func:`os.fsdecode` should be used to ensure that the correct encoding and errors mode are used. + The filesystem error handler is initialized from + :c:member:`PyConfig.filesystem_errors`. + .. versionadded:: 3.6 .. function:: getrefcount(object) @@ -1457,6 +1451,9 @@ always available. This is equivalent to defining the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable before launching Python. + See also :func:`sys.getfilesystemencoding` and + :func:`sys.getfilesystemencodeerrors`. + .. availability:: Windows. .. versionadded:: 3.6 diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index bbe83876777157..dd5ca6121cac2c 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -156,36 +156,13 @@ typedef struct { /* Python filesystem encoding and error handler: sys.getfilesystemencoding() and sys.getfilesystemencodeerrors(). - Default encoding and error handler: - - * if Py_SetStandardStreamEncoding() has been called: they have the - highest priority; - * PYTHONIOENCODING environment variable; - * The UTF-8 Mode uses UTF-8/surrogateescape; - * If Python forces the usage of the ASCII encoding (ex: C locale - or POSIX locale on FreeBSD or HP-UX), use ASCII/surrogateescape; - * locale encoding: ANSI code page on Windows, UTF-8 on Android and - VxWorks, LC_CTYPE locale encoding on other platforms; - * On Windows, "surrogateescape" error handler; - * "surrogateescape" error handler if the LC_CTYPE locale is "C" or "POSIX"; - * "surrogateescape" error handler if the LC_CTYPE locale has been coerced - (PEP 538); - * "strict" error handler. - - Supported error handlers: "strict", "surrogateescape" and - "surrogatepass". The surrogatepass error handler is only supported - if Py_DecodeLocale() and Py_EncodeLocale() use directly the UTF-8 codec; - it's only used on Windows. - - initfsencoding() updates the encoding to the Python codec name. - For example, "ANSI_X3.4-1968" is replaced with "ascii". - - On Windows, sys._enablelegacywindowsfsencoding() sets the - encoding/errors to mbcs/replace at runtime. - - - See Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors. - */ + The Doc/c-api/init_config.rst documentation explains how Python selects + the filesystem encoding and error handler. + + _PyUnicode_InitEncodings() updates the encoding name to the Python codec + name. For example, "ANSI_X3.4-1968" is replaced with "ascii". It also + sets Py_FileSystemDefaultEncoding to filesystem_encoding and + sets Py_FileSystemDefaultEncodeErrors to filesystem_errors. */ wchar_t *filesystem_encoding; wchar_t *filesystem_errors; diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index 1ab554f9451cbd..9281f4eeb8b634 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -50,7 +50,7 @@ PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( PyAPI_FUNC(void) _Py_closerange(int first, int last); -PyAPI_FUNC(wchar_t*) _Py_GetLocaleEncoding(const char **errmsg); +PyAPI_FUNC(wchar_t*) _Py_GetLocaleEncoding(void); PyAPI_FUNC(PyObject*) _Py_GetLocaleEncodingObject(void); #ifdef __cplusplus diff --git a/Include/pyport.h b/Include/pyport.h index 7137006870bf01..79fc7c4a5286f4 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -841,12 +841,16 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; #endif #if defined(__ANDROID__) || defined(__VXWORKS__) - /* Ignore the locale encoding: force UTF-8 */ + // Use UTF-8 as the locale encoding, ignore the LC_CTYPE locale. + // See _Py_GetLocaleEncoding(), PyUnicode_DecodeLocale() + // and PyUnicode_EncodeLocale(). # define _Py_FORCE_UTF8_LOCALE #endif #if defined(_Py_FORCE_UTF8_LOCALE) || defined(__APPLE__) - /* Use UTF-8 as filesystem encoding */ + // Use UTF-8 as the filesystem encoding. + // See PyUnicode_DecodeFSDefaultAndSize(), PyUnicode_EncodeFSDefault(), + // Py_DecodeLocale() and Py_EncodeLocale(). # define _Py_FORCE_UTF8_FS_ENCODING #endif diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-01-21-21-38.bpo-42236.MPx-NK.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-01-21-21-38.bpo-42236.MPx-NK.rst new file mode 100644 index 00000000000000..22e8c534ff89d7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-01-21-21-38.bpo-42236.MPx-NK.rst @@ -0,0 +1,2 @@ +If the ``nl_langinfo(CODESET)`` function returns an empty string, Python now +uses UTF-8 as the filesystem encoding. Patch by Victor Stinner. diff --git a/Python/fileutils.c b/Python/fileutils.c index 72cdee2a511f93..5177b3728824cd 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -826,20 +826,15 @@ _Py_EncodeLocaleEx(const wchar_t *text, char **str, // - Return "UTF-8" if _Py_FORCE_UTF8_LOCALE macro is defined (ex: on Android) // - Return "UTF-8" if the UTF-8 Mode is enabled // - On Windows, return the ANSI code page (ex: "cp1250") -// - Return "UTF-8" if nl_langinfo(CODESET) returns an empty string -// and if the _Py_FORCE_UTF8_FS_ENCODING macro is defined (ex: on macOS). +// - Return "UTF-8" if nl_langinfo(CODESET) returns an empty string. // - Otherwise, return nl_langinfo(CODESET). // -// Return NULL and set errmsg to an error message -// if nl_langinfo(CODESET) fails. -// -// Return NULL and set errmsg to NULL on memory allocation failure. +// Return NULL on memory allocation failure. // // See also config_get_locale_encoding() wchar_t* -_Py_GetLocaleEncoding(const char **errmsg) +_Py_GetLocaleEncoding(void) { - *errmsg = NULL; #ifdef _Py_FORCE_UTF8_LOCALE // On Android langinfo.h and CODESET are missing, // and UTF-8 is always used in mbstowcs() and wcstombs(). @@ -859,21 +854,14 @@ _Py_GetLocaleEncoding(const char **errmsg) #else const char *encoding = nl_langinfo(CODESET); if (!encoding || encoding[0] == '\0') { -#ifdef _Py_FORCE_UTF8_FS_ENCODING - // nl_langinfo() can return an empty string when the LC_CTYPE locale is - // not supported. Default to UTF-8 in that case, because UTF-8 is the - // default charset on macOS. + // Use UTF-8 if nl_langinfo() returns an empty string. It can happen on + // macOS if the LC_CTYPE locale is not supported. return _PyMem_RawWcsdup(L"UTF-8"); -#else - *errmsg = "failed to get the locale encoding: " - "nl_langinfo(CODESET) returns an empty string"; - return NULL; -#endif } wchar_t *wstr; int res = decode_current_locale(encoding, &wstr, NULL, - errmsg, _Py_ERROR_SURROGATEESCAPE); + NULL, _Py_ERROR_SURROGATEESCAPE); if (res < 0) { return NULL; } @@ -887,15 +875,9 @@ _Py_GetLocaleEncoding(const char **errmsg) PyObject * _Py_GetLocaleEncodingObject(void) { - const char *errmsg; - wchar_t *encoding = _Py_GetLocaleEncoding(&errmsg); + wchar_t *encoding = _Py_GetLocaleEncoding(); if (encoding == NULL) { - if (errmsg != NULL) { - PyErr_SetString(PyExc_ValueError, errmsg); - } - else { - PyErr_NoMemory(); - } + PyErr_NoMemory(); return NULL; } diff --git a/Python/initconfig.c b/Python/initconfig.c index 56f4297ba93bc3..d0ff888c7f778e 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1318,7 +1318,7 @@ config_read_env_vars(PyConfig *config) #ifdef MS_WINDOWS _Py_get_env_flag(use_env, &config->legacy_windows_stdio, - "PYTHONLEGACYWINDOWSSTDIO"); + "PYTHONLEGACYWINDOWSSTDIO"); #endif if (config_get_env(config, "PYTHONDUMPREFS")) { @@ -1498,15 +1498,9 @@ static PyStatus config_get_locale_encoding(PyConfig *config, const PyPreConfig *preconfig, wchar_t **locale_encoding) { - const char *errmsg; - wchar_t *encoding = _Py_GetLocaleEncoding(&errmsg); + wchar_t *encoding = _Py_GetLocaleEncoding(); if (encoding == NULL) { - if (errmsg != NULL) { - return _PyStatus_ERR(errmsg); - } - else { - return _PyStatus_NO_MEMORY(); - } + return _PyStatus_NO_MEMORY(); } PyStatus status = PyConfig_SetString(config, locale_encoding, encoding); PyMem_RawFree(encoding); From 177b585e6e82a8f347d2e2b62b93ab57bf155f6f Mon Sep 17 00:00:00 2001 From: MARUYAMA Norihiro Date: Mon, 2 Nov 2020 08:51:04 +0900 Subject: [PATCH 0438/1261] bpo-37193: remove thread objects which finished process its request (GH-13893) * bpo-37193: remove the thread which finished process request from threads list * rename variable t to thread. * don't remove thread from list if it is daemon. * use lock to protect self._threads. * use finally block in case of exception from shutdown_request(). * check "not thread.daemon" before lock to avoid holding the lock if it's unnecessary. * fix the place of _threads_lock. * separate code to remove a current thread into a function. * check ValueError when removing thread. * fix wrong code which all instance shared same lock. * Extract thread management into a _Threads class to encapsulate atomic operations and separate concerns. * Replace multiple references of 'block_on_close' with one, avoiding the possibility that 'block_on_close' could change during the course of processing requests. Now, there's exactly one _threads object with behavior fixed for the duration. * Add docstrings to private classes. * Add test to ensure that a ThreadingTCPServer can be closed without serving any requests. * Use _NoThreads as the default value. Fixes AttributeError when server is closed without serving any requests. * Add blurb * Add test capturing failure. Co-authored-by: Jason R. Coombs --- Lib/socketserver.py | 73 +++++++++++++++---- Lib/test/test_socketserver.py | 24 ++++++ .../2020-06-12-21-23-20.bpo-37193.wJximU.rst | 2 + 3 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-06-12-21-23-20.bpo-37193.wJximU.rst diff --git a/Lib/socketserver.py b/Lib/socketserver.py index 57c1ae6e9e8be1..6859b69682e972 100644 --- a/Lib/socketserver.py +++ b/Lib/socketserver.py @@ -128,6 +128,7 @@ class will essentially render the service "deaf" while one request is import os import sys import threading +import contextlib from io import BufferedIOBase from time import monotonic as time @@ -628,6 +629,55 @@ def server_close(self): self.collect_children(blocking=self.block_on_close) +class _Threads(list): + """ + Joinable list of all non-daemon threads. + """ + def __init__(self): + self._lock = threading.Lock() + + def append(self, thread): + if thread.daemon: + return + with self._lock: + super().append(thread) + + def remove(self, thread): + with self._lock: + # should not happen, but safe to ignore + with contextlib.suppress(ValueError): + super().remove(thread) + + def remove_current(self): + """Remove a current non-daemon thread.""" + thread = threading.current_thread() + if not thread.daemon: + self.remove(thread) + + def pop_all(self): + with self._lock: + self[:], result = [], self[:] + return result + + def join(self): + for thread in self.pop_all(): + thread.join() + + +class _NoThreads: + """ + Degenerate version of _Threads. + """ + def append(self, thread): + pass + + def join(self): + pass + + def remove_current(self): + pass + + class ThreadingMixIn: """Mix-in class to handle each request in a new thread.""" @@ -636,9 +686,9 @@ class ThreadingMixIn: daemon_threads = False # If true, server_close() waits until all non-daemonic threads terminate. block_on_close = True - # For non-daemonic threads, list of threading.Threading objects + # Threads object # used by server_close() to wait for all threads completion. - _threads = None + _threads = _NoThreads() def process_request_thread(self, request, client_address): """Same as in BaseServer but as a thread. @@ -651,27 +701,24 @@ def process_request_thread(self, request, client_address): except Exception: self.handle_error(request, client_address) finally: - self.shutdown_request(request) + try: + self.shutdown_request(request) + finally: + self._threads.remove_current() def process_request(self, request, client_address): """Start a new thread to process the request.""" + if self.block_on_close: + vars(self).setdefault('_threads', _Threads()) t = threading.Thread(target = self.process_request_thread, args = (request, client_address)) t.daemon = self.daemon_threads - if not t.daemon and self.block_on_close: - if self._threads is None: - self._threads = [] - self._threads.append(t) + self._threads.append(t) t.start() def server_close(self): super().server_close() - if self.block_on_close: - threads = self._threads - self._threads = None - if threads: - for thread in threads: - thread.join() + self._threads.join() if hasattr(os, "fork"): diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py index 7cdd115a951539..1944795f058946 100644 --- a/Lib/test/test_socketserver.py +++ b/Lib/test/test_socketserver.py @@ -277,6 +277,13 @@ class MyHandler(socketserver.StreamRequestHandler): t.join() s.server_close() + def test_close_immediately(self): + class MyServer(socketserver.ThreadingMixIn, socketserver.TCPServer): + pass + + server = MyServer((HOST, 0), lambda: None) + server.server_close() + def test_tcpserver_bind_leak(self): # Issue #22435: the server socket wouldn't be closed if bind()/listen() # failed. @@ -491,6 +498,23 @@ def shutdown_request(self, request): self.assertEqual(server.shutdown_called, 1) server.server_close() + def test_threads_reaped(self): + """ + In #37193, users reported a memory leak + due to the saving of every request thread. Ensure that the + threads are cleaned up after the requests complete. + """ + class MyServer(socketserver.ThreadingMixIn, socketserver.TCPServer): + pass + + server = MyServer((HOST, 0), socketserver.StreamRequestHandler) + for n in range(10): + with socket.create_connection(server.server_address): + server.handle_request() + [thread.join() for thread in server._threads] + self.assertEqual(len(server._threads), 0) + server.server_close() + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-06-12-21-23-20.bpo-37193.wJximU.rst b/Misc/NEWS.d/next/Library/2020-06-12-21-23-20.bpo-37193.wJximU.rst new file mode 100644 index 00000000000000..fbf56d3194cd22 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-06-12-21-23-20.bpo-37193.wJximU.rst @@ -0,0 +1,2 @@ +Fixed memory leak in ``socketserver.ThreadingMixIn`` introduced in Python +3.7. From 1831dbdbe2d41432cecf993c89168af061beaa69 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 1 Nov 2020 18:02:37 -0800 Subject: [PATCH 0439/1261] Add member objects to the descriptor howto guide (GH-23084) --- Doc/howto/descriptor.rst | 156 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 5de6d32f22f906..5373025e5407de 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -990,3 +990,159 @@ For example, a classmethod and property could be chained together:: @property def __doc__(cls): return f'A doc for {cls.__name__!r}' + +Member Objects +-------------- + +When a class defines ``__slots__``, it replaces instance dictionaries with a +fixed-length array of slot values. From a user point of view that has +several effects: + +1. Provides immediate detection of bugs due to misspelled attribute +assignments. Only attribute names specified in ``__slots__`` are allowed:: + + class Vehicle: + __slots__ = ('id_number', 'make', 'model') + + >>> auto = Vehicle() + >>> auto.id_nubmer = 'VYE483814LQEX' + Traceback (most recent call last): + ... + AttributeError: 'Vehicle' object has no attribute 'id_nubmer' + +2. Helps create immutable objects where descriptors manage access to private +attributes stored in ``__slots__``:: + + class Immutable: + + __slots__ = ('_dept', '_name') # Replace instance dictionary + + def __init__(self, dept, name): + self._dept = dept # Store to private attribute + self._name = name # Store to private attribute + + @property # Read-only descriptor + def dept(self): + return self._dept + + @property + def name(self): # Read-only descriptor + return self._name + + mark = Immutable('Botany', 'Mark Watney') # Create an immutable instance + +3. Saves memory. On a 64-bit Linux build, an instance with two attributes +takes 48 bytes with ``__slots__`` and 152 bytes without. This `flyweight +design pattern `_ likely only +matters when a large number of instances are going to be created. + +4. Blocks tools like :func:`functools.cached_property` which require an +instance dictionary to function correctly:: + + from functools import cached_property + + class CP: + __slots__ = () # Eliminates the instance dict + + @cached_property # Requires an instance dict + def pi(self): + return 4 * sum((-1.0)**n / (2.0*n + 1.0) + for n in reversed(range(100_000))) + + >>> CP().pi + Traceback (most recent call last): + ... + TypeError: No '__dict__' attribute on 'CP' instance to cache 'pi' property. + +It's not possible to create an exact drop-in pure Python version of +``__slots__`` because it requires direct access to C structures and control +over object memory allocation. However, we can build a mostly faithful +simulation where the actual C structure for slots is emulated by a private +``_slotvalues`` list. Reads and writes to that private structure are managed +by member descriptors:: + + class Member: + + def __init__(self, name, clsname, offset): + 'Emulate PyMemberDef in Include/structmember.h' + # Also see descr_new() in Objects/descrobject.c + self.name = name + self.clsname = clsname + self.offset = offset + + def __get__(self, obj, objtype=None): + 'Emulate member_get() in Objects/descrobject.c' + # Also see PyMember_GetOne() in Python/structmember.c + return obj._slotvalues[self.offset] + + def __set__(self, obj, value): + 'Emulate member_set() in Objects/descrobject.c' + obj._slotvalues[self.offset] = value + + def __repr__(self): + 'Emulate member_repr() in Objects/descrobject.c' + return f'' + +The :meth:`type.__new__` method takes care of adding member objects to class +variables. The :meth:`object.__new__` method takes care of creating instances +that have slots instead of a instance dictionary. Here is a rough equivalent +in pure Python:: + + class Type(type): + 'Simulate how the type metaclass adds member objects for slots' + + def __new__(mcls, clsname, bases, mapping): + 'Emuluate type_new() in Objects/typeobject.c' + # type_new() calls PyTypeReady() which calls add_methods() + slot_names = mapping.get('slot_names', []) + for offset, name in enumerate(slot_names): + mapping[name] = Member(name, clsname, offset) + return type.__new__(mcls, clsname, bases, mapping) + + class Object: + 'Simulate how object.__new__() allocates memory for __slots__' + + def __new__(cls, *args): + 'Emulate object_new() in Objects/typeobject.c' + inst = super().__new__(cls) + if hasattr(cls, 'slot_names'): + inst._slotvalues = [None] * len(cls.slot_names) + return inst + +To use the simulation in a real class, just inherit from :class:`Object` and +set the :term:`metaclass` to :class:`Type`:: + + class H(Object, metaclass=Type): + + slot_names = ['x', 'y'] + + def __init__(self, x, y): + self.x = x + self.y = y + +At this point, the metaclass has loaded member objects for *x* and *y*:: + + >>> import pprint + >>> pprint.pp(dict(vars(H))) + {'__module__': '__main__', + 'slot_names': ['x', 'y'], + '__init__': , + 'x': , + 'y': , + '__doc__': None} + +When instances are created, they have a ``slot_values`` list where the +attributes are stored:: + + >>> h = H(10, 20) + >>> vars(h) + {'_slotvalues': [10, 20]} + >>> h.x = 55 + >>> vars(h) + {'_slotvalues': [55, 20]} + +Unlike the real ``__slots__``, this simulation does have an instance +dictionary just to hold the ``_slotvalues`` array. So, unlike the real code, +this simulation doesn't block assignments to misspelled attributes:: + + >>> h.xz = 30 # For actual __slots__ this would raise an AttributeError From 00f6abea39a85ec8b46b25087f71d2b895089d9c Mon Sep 17 00:00:00 2001 From: Tal Einat Date: Mon, 2 Nov 2020 05:59:52 +0200 Subject: [PATCH 0440/1261] bpo-40511: Stop unwanted flashing of IDLE calltips (GH-20910) They were occurring with both repeated 'force-calltip' invocations and by typing parentheses in expressions, strings, and comments in the argument code. Co-authored-by: Terry Jan Reedy --- Lib/idlelib/calltip.py | 36 ++++++- Lib/idlelib/idle_test/mock_tk.py | 13 ++- Lib/idlelib/idle_test/test_calltip.py | 99 ++++++++++++++++++- .../2020-06-16-12-16-13.bpo-40511.XkihpM.rst | 3 + 4 files changed, 144 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-06-16-12-16-13.bpo-40511.XkihpM.rst diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index b02f87207d8db1..549e224015cccb 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -55,18 +55,50 @@ def refresh_calltip_event(self, event): self.open_calltip(False) def open_calltip(self, evalfuncs): - self.remove_calltip_window() + """Maybe close an existing calltip and maybe open a new calltip. + Called from (force_open|try_open|refresh)_calltip_event functions. + """ hp = HyperParser(self.editwin, "insert") sur_paren = hp.get_surrounding_brackets('(') + + # If not inside parentheses, no calltip. if not sur_paren: + self.remove_calltip_window() return + + # If a calltip is shown for the current parentheses, do + # nothing. + if self.active_calltip: + opener_line, opener_col = map(int, sur_paren[0].split('.')) + if ( + (opener_line, opener_col) == + (self.active_calltip.parenline, self.active_calltip.parencol) + ): + return + hp.set_index(sur_paren[0]) - expression = hp.get_expression() + try: + expression = hp.get_expression() + except ValueError: + expression = None if not expression: + # No expression before the opening parenthesis, e.g. + # because it's in a string or the opener for a tuple: + # Do nothing. return + + # At this point, the current index is after an opening + # parenthesis, in a section of code, preceded by a valid + # expression. If there is a calltip shown, it's not for the + # same index and should be closed. + self.remove_calltip_window() + + # Simple, fast heuristic: If the preceding expression includes + # an opening parenthesis, it likely includes a function call. if not evalfuncs and (expression.find('(') != -1): return + argspec = self.fetch_tip(expression) if not argspec: return diff --git a/Lib/idlelib/idle_test/mock_tk.py b/Lib/idlelib/idle_test/mock_tk.py index 576f7d5d609e4d..b736bd001da87f 100644 --- a/Lib/idlelib/idle_test/mock_tk.py +++ b/Lib/idlelib/idle_test/mock_tk.py @@ -3,6 +3,9 @@ A gui object is anything with a master or parent parameter, which is typically required in spite of what the doc strings say. """ +import re +from _tkinter import TclError + class Event: '''Minimal mock with attributes for testing event handlers. @@ -22,6 +25,7 @@ def __init__(self, **kwds): "Create event with attributes needed for test" self.__dict__.update(kwds) + class Var: "Use for String/Int/BooleanVar: incomplete" def __init__(self, master=None, value=None, name=None): @@ -33,6 +37,7 @@ def set(self, value): def get(self): return self.value + class Mbox_func: """Generic mock for messagebox functions, which all have the same signature. @@ -50,6 +55,7 @@ def __call__(self, title, message, *args, **kwds): self.kwds = kwds return self.result # Set by tester for ask functions + class Mbox: """Mock for tkinter.messagebox with an Mbox_func for each function. @@ -85,7 +91,6 @@ def tearDownClass(cls): showinfo = Mbox_func() # None showwarning = Mbox_func() # None -from _tkinter import TclError class Text: """A semi-functional non-gui replacement for tkinter.Text text editors. @@ -154,6 +159,8 @@ def _decode(self, index, endflag=0): if char.endswith(' lineend') or char == 'end': return line, linelength # Tk requires that ignored chars before ' lineend' be valid int + if m := re.fullmatch(r'end-(\d*)c', char, re.A): # Used by hyperparser. + return line, linelength - int(m.group(1)) # Out of bounds char becomes first or last index of line char = int(char) @@ -177,7 +184,6 @@ def _endex(self, endflag): n -= 1 return n, len(self.data[n]) + endflag - def insert(self, index, chars): "Insert chars before the character at index." @@ -193,7 +199,6 @@ def insert(self, index, chars): self.data[line+1:line+1] = chars[1:] self.data[line+len(chars)-1] += after - def get(self, index1, index2=None): "Return slice from index1 to index2 (default is 'index1+1')." @@ -212,7 +217,6 @@ def get(self, index1, index2=None): lines.append(self.data[endline][:endchar]) return ''.join(lines) - def delete(self, index1, index2=None): '''Delete slice from index1 to index2 (default is 'index1+1'). @@ -297,6 +301,7 @@ def bind(sequence=None, func=None, add=None): "Bind to this widget at event sequence a call to function func." pass + class Entry: "Mock for tkinter.Entry." def focus_set(self): diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index 4d53df17d8cc7c..489b6899baf424 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -1,10 +1,12 @@ -"Test calltip, coverage 60%" +"Test calltip, coverage 76%" from idlelib import calltip import unittest +from unittest.mock import Mock import textwrap import types import re +from idlelib.idle_test.mock_tk import Text # Test Class TC is used in multiple get_argspec test methods @@ -257,5 +259,100 @@ def test_good_entity(self): self.assertIs(calltip.get_entity('int'), int) +# Test the 9 Calltip methods. +# open_calltip is about half the code; the others are fairly trivial. +# The default mocks are what are needed for open_calltip. + +class mock_Shell(): + "Return mock sufficient to pass to hyperparser." + def __init__(self, text): + text.tag_prevrange = Mock(return_value=None) + self.text = text + self.prompt_last_line = ">>> " + self.indentwidth = 4 + self.tabwidth = 8 + + +class mock_TipWindow: + def __init__(self): + pass + + def showtip(self, text, parenleft, parenright): + self.args = parenleft, parenright + self.parenline, self.parencol = map(int, parenleft.split('.')) + + +class WrappedCalltip(calltip.Calltip): + def _make_tk_calltip_window(self): + return mock_TipWindow() + + def remove_calltip_window(self, event=None): + if self.active_calltip: # Setup to None. + self.active_calltip = None + self.tips_removed += 1 # Setup to 0. + + def fetch_tip(self, expression): + return 'tip' + + +class CalltipTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.text = Text() + cls.ct = WrappedCalltip(mock_Shell(cls.text)) + + def setUp(self): + self.text.delete('1.0', 'end') # Insert and call + self.ct.active_calltip = None + # Test .active_calltip, +args + self.ct.tips_removed = 0 + + def open_close(self, testfunc): + # Open-close template with testfunc called in between. + opentip = self.ct.open_calltip + self.text.insert(1.0, 'f(') + opentip(False) + self.tip = self.ct.active_calltip + testfunc(self) ### + self.text.insert('insert', ')') + opentip(False) + self.assertIsNone(self.ct.active_calltip, None) + + def test_open_close(self): + def args(self): + self.assertEqual(self.tip.args, ('1.1', '1.end')) + self.open_close(args) + + def test_repeated_force(self): + def force(self): + for char in 'abc': + self.text.insert('insert', 'a') + self.ct.open_calltip(True) + self.ct.open_calltip(True) + self.assertIs(self.ct.active_calltip, self.tip) + self.open_close(force) + + def test_repeated_parens(self): + def parens(self): + for context in "a", "'": + with self.subTest(context=context): + self.text.insert('insert', context) + for char in '(()())': + self.text.insert('insert', char) + self.assertIs(self.ct.active_calltip, self.tip) + self.text.insert('insert', "'") + self.open_close(parens) + + def test_comment_parens(self): + def comment(self): + self.text.insert('insert', "# ") + for char in '(()())': + self.text.insert('insert', char) + self.assertIs(self.ct.active_calltip, self.tip) + self.text.insert('insert', "\n") + self.open_close(comment) + + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Misc/NEWS.d/next/IDLE/2020-06-16-12-16-13.bpo-40511.XkihpM.rst b/Misc/NEWS.d/next/IDLE/2020-06-16-12-16-13.bpo-40511.XkihpM.rst new file mode 100644 index 00000000000000..cc967981381769 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-06-16-12-16-13.bpo-40511.XkihpM.rst @@ -0,0 +1,3 @@ +Typing opening and closing parentheses inside the parentheses of a function +call will no longer cause unnecessary "flashing" off and on of an existing +open call-tip, e.g. when typed in a string literal. From 0f20fe151962edbbebbdb1192fd0b8567cd38eea Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 1 Nov 2020 20:15:50 -0800 Subject: [PATCH 0441/1261] Minor formatting edits to the descriptor howto guide (GH-23092) --- Doc/howto/descriptor.rst | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 5373025e5407de..fedf8a8c09eac4 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -27,8 +27,9 @@ This guide has four major sections: 4) The last section has pure Python equivalents for built-in descriptors that are written in C. Read this if you're curious about how functions turn - into bound methods or about how to implement common tools like - :func:`classmethod`, :func:`staticmethod`, and :func:`property`. + into bound methods or about the implementation of common tools like + :func:`classmethod`, :func:`staticmethod`, :func:`property`, and + :term:`__slots__`. Primer @@ -188,7 +189,7 @@ logged attribute and that its name is unchangeable. In the next example, we'll fix that problem. -Customized Names +Customized names ---------------- When a class uses descriptors, it can inform each descriptor about what @@ -438,7 +439,7 @@ creates a deeper understanding of how Python works and an appreciation for the elegance of its design. -Definition and Introduction +Definition and introduction --------------------------- In general, a descriptor is an object attribute with "binding behavior", one @@ -463,7 +464,7 @@ simplify the underlying C code and offer a flexible set of new tools for everyday Python programs. -Descriptor Protocol +Descriptor protocol ------------------- ``descr.__get__(self, obj, type=None) -> value`` @@ -493,7 +494,7 @@ called. Defining the :meth:`__set__` method with an exception raising placeholder is enough to make it a data descriptor. -Overview of Descriptor Invocation +Overview of descriptor invocation --------------------------------- A descriptor can be called directly with ``desc.__get__(obj)`` or @@ -510,7 +511,7 @@ The details of invocation depend on whether ``obj`` is an object, class, or instance of super. -Invocation from an Instance +Invocation from an instance --------------------------- Instance lookup scans through a chain of namespaces giving data descriptors @@ -549,7 +550,7 @@ The :exc:`TypeError` exception handler is needed because the instance dictionary doesn't exist when its class defines :term:`__slots__`. -Invocation from a Class +Invocation from a class ----------------------- The logic for a dotted lookup such as ``A.x`` is in @@ -563,7 +564,7 @@ The full C implementation can be found in :c:func:`type_getattro()` and :c:func:`_PyType_Lookup()` in :source:`Objects/typeobject.c`. -Invocation from Super +Invocation from super --------------------- The logic for super's dotted lookup is in the :meth:`__getattribute__` method for @@ -580,7 +581,7 @@ The full C implementation can be found in :c:func:`super_getattro()` in `_. -Summary of Invocation Logic +Summary of invocation logic --------------------------- The mechanism for descriptors is embedded in the :meth:`__getattribute__()` @@ -606,7 +607,7 @@ The important points to remember are: * Non-data descriptors may be overridden by instance dictionaries. -Automatic Name Notification +Automatic name notification --------------------------- Sometimes it is desirable for a descriptor to know what class variable name it @@ -624,7 +625,7 @@ place at the time of class creation. If descriptors are added to the class afterwards, :meth:`__set_name__` will need to be called manually. -ORM Example +ORM example ----------- The following code is simplified skeleton showing how data descriptors could @@ -694,8 +695,8 @@ Pure Python Equivalents The descriptor protocol is simple and offers exciting possibilities. Several use cases are so common that they have been prepackaged into built-in tools. -Properties, bound methods, static methods, and class methods are all based on -the descriptor protocol. +Properties, bound methods, static methods, class methods, and \_\_slots\_\_ are +all based on the descriptor protocol. Properties @@ -774,7 +775,7 @@ to wrap access to the value attribute in a property data descriptor:: return self._value -Functions and Methods +Functions and methods --------------------- Python's object oriented features are built upon a function based environment. @@ -858,7 +859,7 @@ If you have ever wondered where *self* comes from in regular methods or where *cls* comes from in class methods, this is it! -Static Methods +Static methods -------------- Non-data descriptors provide a simple mechanism for variations on the usual @@ -926,7 +927,7 @@ Using the non-data descriptor protocol, a pure Python version of return self.f -Class Methods +Class methods ------------- Unlike static methods, class methods prepend the class reference to the @@ -991,8 +992,8 @@ For example, a classmethod and property could be chained together:: def __doc__(cls): return f'A doc for {cls.__name__!r}' -Member Objects --------------- +Member objects and __slots__ +---------------------------- When a class defines ``__slots__``, it replaces instance dictionaries with a fixed-length array of slot values. From a user point of view that has From e4d077ced242ef040fd22c160c1e6105a4c7ef38 Mon Sep 17 00:00:00 2001 From: Joongi Kim Date: Mon, 2 Nov 2020 17:02:48 +0900 Subject: [PATCH 0442/1261] bpo-41229: Update docs for explicit aclose()-required cases and add contextlib.aclosing() method (GH-21545) This is a PR to: * Add `contextlib.aclosing` which ia analogous to `contextlib.closing` but for async-generators with an explicit test case for [bpo-41229]() * Update the docs to describe when we need explicit `aclose()` invocation. which are motivated by the following issues, articles, and examples: * [bpo-41229]() * https://github.com/njsmith/async_generator * https://vorpus.org/blog/some-thoughts-on-asynchronous-api-design-in-a-post-asyncawait-world/#cleanup-in-generators-and-async-generators * https://www.python.org/dev/peps/pep-0533/ * https://github.com/achimnol/aiotools/blob/ef7bf0cea7af/src/aiotools/context.py#L152 Particuarly regarding [PEP-533](https://www.python.org/dev/peps/pep-0533/), its acceptance (`__aiterclose__()`) would make this little addition of `contextlib.aclosing()` unnecessary for most use cases, but until then this could serve as a good counterpart and analogy to `contextlib.closing()`. The same applies for `contextlib.closing` with `__iterclose__()`. Also, still there are other use cases, e.g., when working with non-generator objects with `aclose()` methods. --- Doc/library/contextlib.rst | 33 +++++++++++ Doc/reference/expressions.rst | 16 ++++- Lib/contextlib.py | 26 ++++++++ Lib/test/test_contextlib_async.py | 59 ++++++++++++++++++- .../2020-07-19-20-10-41.bpo-41229.p8rJa2.rst | 3 + 5 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-07-19-20-10-41.bpo-41229.p8rJa2.rst diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index 0aa4ad76523480..e42f5a93281663 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -154,6 +154,39 @@ Functions and classes provided: ``page.close()`` will be called when the :keyword:`with` block is exited. +.. class:: aclosing(thing) + + Return an async context manager that calls the ``aclose()`` method of *thing* + upon completion of the block. This is basically equivalent to:: + + from contextlib import asynccontextmanager + + @asynccontextmanager + async def aclosing(thing): + try: + yield thing + finally: + await thing.aclose() + + Significantly, ``aclosing()`` supports deterministic cleanup of async + generators when they happen to exit early by :keyword:`break` or an + exception. For example:: + + from contextlib import aclosing + + async with aclosing(my_generator()) as values: + async for value in values: + if value == 42: + break + + This pattern ensures that the generator's async exit code is executed in + the same context as its iterations (so that exceptions and context + variables work as expected, and the exit code isn't run after the + lifetime of some task it depends on). + + .. versionadded:: 3.10 + + .. _simplifying-support-for-single-optional-context-managers: .. function:: nullcontext(enter_result=None) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 512aa5af956198..8ac626444843d2 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -643,6 +643,16 @@ after resuming depends on the method which resumed the execution. If :meth:`~agen.asend` is used, then the result will be the value passed in to that method. +If an asynchronous generator happens to exit early by :keyword:`break`, the caller +task being cancelled, or other exceptions, the generator's async cleanup code +will run and possibly raise exceptions or access context variables in an +unexpected context--perhaps after the lifetime of tasks it depends, or +during the event loop shutdown when the async-generator garbage collection hook +is called. +To prevent this, the caller must explicitly close the async generator by calling +:meth:`~agen.aclose` method to finalize the generator and ultimately detach it +from the event loop. + In an asynchronous generator function, yield expressions are allowed anywhere in a :keyword:`try` construct. However, if an asynchronous generator is not resumed before it is finalized (by reaching a zero reference count or by @@ -654,9 +664,9 @@ generator-iterator's :meth:`~agen.aclose` method and run the resulting coroutine object, thus allowing any pending :keyword:`!finally` clauses to execute. -To take care of finalization, an event loop should define -a *finalizer* function which takes an asynchronous generator-iterator -and presumably calls :meth:`~agen.aclose` and executes the coroutine. +To take care of finalization upon event loop termination, an event loop should +define a *finalizer* function which takes an asynchronous generator-iterator and +presumably calls :meth:`~agen.aclose` and executes the coroutine. This *finalizer* may be registered by calling :func:`sys.set_asyncgen_hooks`. When first iterated over, an asynchronous generator-iterator will store the registered *finalizer* to be called upon finalization. For a reference example diff --git a/Lib/contextlib.py b/Lib/contextlib.py index ff92d9f913f4c2..82ddc1497d8632 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -303,6 +303,32 @@ def __exit__(self, *exc_info): self.thing.close() +class aclosing(AbstractAsyncContextManager): + """Async context manager for safely finalizing an asynchronously cleaned-up + resource such as an async generator, calling its ``aclose()`` method. + + Code like this: + + async with aclosing(.fetch()) as agen: + + + is equivalent to this: + + agen = .fetch() + try: + + finally: + await agen.aclose() + + """ + def __init__(self, thing): + self.thing = thing + async def __aenter__(self): + return self.thing + async def __aexit__(self, *exc_info): + await self.thing.aclose() + + class _RedirectStream(AbstractContextManager): _stream = None diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index 43fb7fced1bfdb..3765f6cbf28c51 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -1,5 +1,5 @@ import asyncio -from contextlib import asynccontextmanager, AbstractAsyncContextManager, AsyncExitStack +from contextlib import aclosing, asynccontextmanager, AbstractAsyncContextManager, AsyncExitStack import functools from test import support import unittest @@ -279,6 +279,63 @@ async def woohoo(self, func, args, kwds): self.assertEqual(target, (11, 22, 33, 44)) +class AclosingTestCase(unittest.TestCase): + + @support.requires_docstrings + def test_instance_docs(self): + cm_docstring = aclosing.__doc__ + obj = aclosing(None) + self.assertEqual(obj.__doc__, cm_docstring) + + @_async_test + async def test_aclosing(self): + state = [] + class C: + async def aclose(self): + state.append(1) + x = C() + self.assertEqual(state, []) + async with aclosing(x) as y: + self.assertEqual(x, y) + self.assertEqual(state, [1]) + + @_async_test + async def test_aclosing_error(self): + state = [] + class C: + async def aclose(self): + state.append(1) + x = C() + self.assertEqual(state, []) + with self.assertRaises(ZeroDivisionError): + async with aclosing(x) as y: + self.assertEqual(x, y) + 1 / 0 + self.assertEqual(state, [1]) + + @_async_test + async def test_aclosing_bpo41229(self): + state = [] + + class Resource: + def __del__(self): + state.append(1) + + async def agenfunc(): + r = Resource() + yield -1 + yield -2 + + x = agenfunc() + self.assertEqual(state, []) + with self.assertRaises(ZeroDivisionError): + async with aclosing(x) as y: + self.assertEqual(x, y) + self.assertEqual(-1, await x.__anext__()) + 1 / 0 + self.assertEqual(state, [1]) + + class TestAsyncExitStack(TestBaseExitStack, unittest.TestCase): class SyncAsyncExitStack(AsyncExitStack): @staticmethod diff --git a/Misc/NEWS.d/next/Library/2020-07-19-20-10-41.bpo-41229.p8rJa2.rst b/Misc/NEWS.d/next/Library/2020-07-19-20-10-41.bpo-41229.p8rJa2.rst new file mode 100644 index 00000000000000..926133221d4179 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-07-19-20-10-41.bpo-41229.p8rJa2.rst @@ -0,0 +1,3 @@ +Add ``contextlib.aclosing`` for deterministic cleanup of async generators +which is analogous to ``contextlib.closing`` for non-async generators. +Patch by Joongi Kim and John Belmonte. From 5e651d7dbac0dc5ea6e007bb37fb0e754eea5de5 Mon Sep 17 00:00:00 2001 From: Jakub Stasiak Date: Mon, 2 Nov 2020 11:56:35 +0100 Subject: [PATCH 0443/1261] bpo-42230: Improve asyncio documentation regarding accepting sets vs iterables (GH-23073) People call wait() and as_completed() with various non-set iterables, a list should be the most common but there are others as well[1]. Considering typeshed also documents wait()[2] and as_completed()[3] as accepting arbitrary iterables I think it's a good idea to document the status quo better. [1] https://github.com/aio-libs/aiokafka/pull/672 [2] https://github.com/python/typeshed/blob/620989bac572f30349b95590ebe81a73ce0fe862/stdlib/3/asyncio/tasks.pyi#L161 [3] https://github.com/python/typeshed/blob/620989bac572f30349b95590ebe81a73ce0fe862/stdlib/3/asyncio/tasks.pyi#L40 --- Doc/library/asyncio-task.rst | 8 ++++---- Lib/asyncio/tasks.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index 99f012540d989b..eb51c704cea394 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -504,10 +504,10 @@ Waiting Primitives return_when=ALL_COMPLETED) Run :ref:`awaitable objects ` in the *aws* - set concurrently and block until the condition specified + iterable concurrently and block until the condition specified by *return_when*. - The *aws* set must not be empty. + The *aws* iterable must not be empty. Returns two sets of Tasks/Futures: ``(done, pending)``. @@ -593,9 +593,9 @@ Waiting Primitives .. function:: as_completed(aws, \*, loop=None, timeout=None) Run :ref:`awaitable objects ` in the *aws* - set concurrently. Return an iterator of coroutines. + iterable concurrently. Return an iterator of coroutines. Each coroutine returned can be awaited to get the earliest next - result from the set of the remaining awaitables. + result from the iterable of the remaining awaitables. Raises :exc:`asyncio.TimeoutError` if the timeout occurs before all Futures are done. diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 8b05434f273b52..ad31f5d59796b1 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -373,7 +373,7 @@ def create_task(coro, *, name=None): async def wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED): """Wait for the Futures and coroutines given by fs to complete. - The sequence futures must not be empty. + The fs iterable must not be empty. Coroutines will be wrapped in Tasks. @@ -573,7 +573,7 @@ def as_completed(fs, *, loop=None, timeout=None): Note: The futures 'f' are not necessarily members of fs. """ if futures.isfuture(fs) or coroutines.iscoroutine(fs): - raise TypeError(f"expect a list of futures, not {type(fs).__name__}") + raise TypeError(f"expect an iterable of futures, not {type(fs).__name__}") from .queues import Queue # Import here to avoid circular import problem. done = Queue(loop=loop) From defbc3b94e0ad568bf4c23e6ec99fb326e6d1f34 Mon Sep 17 00:00:00 2001 From: Julien Danjou Date: Mon, 2 Nov 2020 15:16:25 +0100 Subject: [PATCH 0444/1261] bpo-41435: Add sys._current_exceptions() function (GH-21689) This adds a new function named sys._current_exceptions() which is equivalent ot sys._current_frames() except that it returns the exceptions currently handled by other threads. It is equivalent to calling sys.exc_info() for each running thread. --- Doc/library/sys.rst | 12 ++++ Include/cpython/pystate.h | 5 ++ Lib/test/test_sys.py | 67 +++++++++++++++++++ .../2020-08-07-13-42-48.bpo-41435.qPWjJA.rst | 1 + Python/clinic/sysmodule.c.h | 22 +++++- Python/pystate.c | 63 +++++++++++++++++ Python/sysmodule.c | 16 +++++ 7 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-07-13-42-48.bpo-41435.qPWjJA.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 2f0840e2a74e2f..f0acfcfe63988a 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -196,6 +196,18 @@ always available. .. audit-event:: sys._current_frames "" sys._current_frames +.. function:: _current_exceptions() + + Return a dictionary mapping each thread's identifier to the topmost exception + currently active in that thread at the time the function is called. + If a thread is not currently handling an exception, it is not included in + the result dictionary. + + This is most useful for statistical profiling. + + This function should be used for internal and specialized purposes only. + + .. audit-event:: sys._current_exceptions "" sys._current_exceptions .. function:: breakpointhook() diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 5d5e4e331978ac..25522b4dbeccd8 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -167,6 +167,11 @@ PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void); */ PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void); +/* The implementation of sys._current_exceptions() Returns a dict mapping + thread id to that thread's current exception. +*/ +PyAPI_FUNC(PyObject *) _PyThread_CurrentExceptions(void); + /* Routines for advanced debuggers, requested by David Beazley. Don't use unless you know what you are doing! */ PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Main(void); diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 30c29a26a99270..332ed8f550c984 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -432,6 +432,73 @@ def g456(): leave_g.set() t.join() + @threading_helper.reap_threads + def test_current_exceptions(self): + import threading + import traceback + + # Spawn a thread that blocks at a known place. Then the main + # thread does sys._current_frames(), and verifies that the frames + # returned make sense. + entered_g = threading.Event() + leave_g = threading.Event() + thread_info = [] # the thread's id + + def f123(): + g456() + + def g456(): + thread_info.append(threading.get_ident()) + entered_g.set() + while True: + try: + raise ValueError("oops") + except ValueError: + if leave_g.wait(timeout=support.LONG_TIMEOUT): + break + + t = threading.Thread(target=f123) + t.start() + entered_g.wait() + + # At this point, t has finished its entered_g.set(), although it's + # impossible to guess whether it's still on that line or has moved on + # to its leave_g.wait(). + self.assertEqual(len(thread_info), 1) + thread_id = thread_info[0] + + d = sys._current_exceptions() + for tid in d: + self.assertIsInstance(tid, int) + self.assertGreater(tid, 0) + + main_id = threading.get_ident() + self.assertIn(main_id, d) + self.assertIn(thread_id, d) + self.assertEqual((None, None, None), d.pop(main_id)) + + # Verify that the captured thread frame is blocked in g456, called + # from f123. This is a litte tricky, since various bits of + # threading.py are also in the thread's call stack. + exc_type, exc_value, exc_tb = d.pop(thread_id) + stack = traceback.extract_stack(exc_tb.tb_frame) + for i, (filename, lineno, funcname, sourceline) in enumerate(stack): + if funcname == "f123": + break + else: + self.fail("didn't find f123() on thread's call stack") + + self.assertEqual(sourceline, "g456()") + + # And the next record must be for g456(). + filename, lineno, funcname, sourceline = stack[i+1] + self.assertEqual(funcname, "g456") + self.assertTrue(sourceline.startswith("if leave_g.wait(")) + + # Reap the spawned thread. + leave_g.set() + t.join() + def test_attributes(self): self.assertIsInstance(sys.api_version, int) self.assertIsInstance(sys.argv, list) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-07-13-42-48.bpo-41435.qPWjJA.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-07-13-42-48.bpo-41435.qPWjJA.rst new file mode 100644 index 00000000000000..d2978f9b4ec028 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-07-13-42-48.bpo-41435.qPWjJA.rst @@ -0,0 +1 @@ +Add `sys._current_exceptions()` function to retrieve a dictionary mapping each thread's identifier to the topmost exception currently active in that thread at the time the function is called. \ No newline at end of file diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index c1a9a2d69f09fc..addd58922e7f58 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -801,6 +801,26 @@ sys__current_frames(PyObject *module, PyObject *Py_UNUSED(ignored)) return sys__current_frames_impl(module); } +PyDoc_STRVAR(sys__current_exceptions__doc__, +"_current_exceptions($module, /)\n" +"--\n" +"\n" +"Return a dict mapping each thread\'s identifier to its current raised exception.\n" +"\n" +"This function should be used for specialized purposes only."); + +#define SYS__CURRENT_EXCEPTIONS_METHODDEF \ + {"_current_exceptions", (PyCFunction)sys__current_exceptions, METH_NOARGS, sys__current_exceptions__doc__}, + +static PyObject * +sys__current_exceptions_impl(PyObject *module); + +static PyObject * +sys__current_exceptions(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return sys__current_exceptions_impl(module); +} + PyDoc_STRVAR(sys_call_tracing__doc__, "call_tracing($module, func, args, /)\n" "--\n" @@ -945,4 +965,4 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=87baa3357293ea65 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bbc4963fe86a29d9 input=a9049054013a1b77]*/ diff --git a/Python/pystate.c b/Python/pystate.c index e88898670cdff6..e37cbd5a657873 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1222,6 +1222,69 @@ _PyThread_CurrentFrames(void) return result; } +PyObject * +_PyThread_CurrentExceptions(void) +{ + PyThreadState *tstate = _PyThreadState_GET(); + + _Py_EnsureTstateNotNULL(tstate); + + if (_PySys_Audit(tstate, "sys._current_exceptions", NULL) < 0) { + return NULL; + } + + PyObject *result = PyDict_New(); + if (result == NULL) { + return NULL; + } + + /* for i in all interpreters: + * for t in all of i's thread states: + * if t's frame isn't NULL, map t's id to its frame + * Because these lists can mutate even when the GIL is held, we + * need to grab head_mutex for the duration. + */ + _PyRuntimeState *runtime = tstate->interp->runtime; + HEAD_LOCK(runtime); + PyInterpreterState *i; + for (i = runtime->interpreters.head; i != NULL; i = i->next) { + PyThreadState *t; + for (t = i->tstate_head; t != NULL; t = t->next) { + _PyErr_StackItem *err_info = _PyErr_GetTopmostException(t); + if (err_info == NULL) { + continue; + } + PyObject *id = PyLong_FromUnsignedLong(t->thread_id); + if (id == NULL) { + goto fail; + } + PyObject *exc_info = PyTuple_Pack( + 3, + err_info->exc_type != NULL ? err_info->exc_type : Py_None, + err_info->exc_value != NULL ? err_info->exc_value : Py_None, + err_info->exc_traceback != NULL ? err_info->exc_traceback : Py_None); + if (exc_info == NULL) { + Py_DECREF(id); + goto fail; + } + int stat = PyDict_SetItem(result, id, exc_info); + Py_DECREF(id); + Py_DECREF(exc_info); + if (stat < 0) { + goto fail; + } + } + } + goto done; + +fail: + Py_CLEAR(result); + +done: + HEAD_UNLOCK(runtime); + return result; +} + /* Python "auto thread state" API. */ /* Keep this as a static, as it is not reliable! It can only diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 749b96455d6796..945e639ca57560 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1837,6 +1837,21 @@ sys__current_frames_impl(PyObject *module) return _PyThread_CurrentFrames(); } +/*[clinic input] +sys._current_exceptions + +Return a dict mapping each thread's identifier to its current raised exception. + +This function should be used for specialized purposes only. +[clinic start generated code]*/ + +static PyObject * +sys__current_exceptions_impl(PyObject *module) +/*[clinic end generated code: output=2ccfd838c746f0ba input=0e91818fbf2edc1f]*/ +{ + return _PyThread_CurrentExceptions(); +} + /*[clinic input] sys.call_tracing @@ -1953,6 +1968,7 @@ static PyMethodDef sys_methods[] = { METH_FASTCALL | METH_KEYWORDS, breakpointhook_doc}, SYS__CLEAR_TYPE_CACHE_METHODDEF SYS__CURRENT_FRAMES_METHODDEF + SYS__CURRENT_EXCEPTIONS_METHODDEF SYS_DISPLAYHOOK_METHODDEF SYS_EXC_INFO_METHODDEF SYS_EXCEPTHOOK_METHODDEF From c12b7ef725815fa94a594d7b1d8bd51cd9b0f284 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Mon, 2 Nov 2020 17:27:30 +0200 Subject: [PATCH 0445/1261] bpo-42224: Fix test_format when locale does not expect number grouping (GH-23067) --- Lib/test/test_format.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py index d2744cdfdca60e..9653e46ecc52d8 100644 --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -428,13 +428,16 @@ def test_locale(self): localeconv = locale.localeconv() sep = localeconv['thousands_sep'] point = localeconv['decimal_point'] + grouping = localeconv['grouping'] text = format(123456789, "n") - self.assertIn(sep, text) + if grouping: + self.assertIn(sep, text) self.assertEqual(text.replace(sep, ''), '123456789') text = format(1234.5, "n") - self.assertIn(sep, text) + if grouping: + self.assertIn(sep, text) self.assertIn(point, text) self.assertEqual(text.replace(sep, ''), '1234' + point + '5') finally: From 184f14933410cd1f91bdf048cb9cdc8fc21640aa Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 2 Nov 2020 16:49:54 +0100 Subject: [PATCH 0446/1261] bpo-42236: Enhance init and encoding documentation (GH-23109) Enhance the documentation of the Python startup, filesystem encoding and error handling, locale encoding. Add a new "Python UTF-8 Mode" section. * Add "locale encoding" and "filesystem encoding and error handler" to the glossary * Remove documentation from Include/cpython/initconfig.h: move it to Doc/c-api/init_config.rst. * Doc/c-api/init_config.rst: * Document command line options and environment variables * Document default values. * Add a new "Python UTF-8 Mode" section in Doc/library/os.rst. * Add warnings to Py_DecodeLocale() and Py_EncodeLocale() docs. * Document how Python selects the filesystem encoding and error handler at a single place: PyConfig.filesystem_encoding and PyConfig.filesystem_errors. * PyConfig: move orig_argv member at the right place. --- Doc/c-api/exceptions.rst | 8 +- Doc/c-api/init.rst | 5 +- Doc/c-api/init_config.rst | 589 +++++++++++++++++++++++++++-------- Doc/c-api/sys.rst | 70 +++-- Doc/c-api/unicode.rst | 11 +- Doc/c-api/veryhigh.rst | 21 +- Doc/glossary.rst | 31 ++ Doc/howto/unicode.rst | 10 +- Doc/library/devmode.rst | 3 + Doc/library/exceptions.rst | 4 +- Doc/library/locale.rst | 26 +- Doc/library/os.rst | 90 +++++- Doc/library/sys.rst | 42 ++- Doc/using/cmdline.rst | 58 +--- Doc/using/windows.rst | 26 +- Doc/whatsnew/3.7.rst | 3 +- Include/cpython/initconfig.h | 253 ++------------- Python/initconfig.c | 1 + Python/preconfig.c | 10 +- 19 files changed, 738 insertions(+), 523 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 247b6d68eceae9..4e99a0167a632d 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -182,8 +182,8 @@ For convenience, some of these functions will always return a .. c:function:: PyObject* PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename) Similar to :c:func:`PyErr_SetFromErrnoWithFilenameObject`, but the filename - is given as a C string. *filename* is decoded from the filesystem encoding - (:func:`os.fsdecode`). + is given as a C string. *filename* is decoded from the :term:`filesystem + encoding and error handler`. .. c:function:: PyObject* PyErr_SetFromWindowsErr(int ierr) @@ -266,7 +266,7 @@ For convenience, some of these functions will always return a .. c:function:: void PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) Like :c:func:`PyErr_SyntaxLocationObject`, but *filename* is a byte string - decoded from the filesystem encoding (:func:`os.fsdecode`). + decoded from the :term:`filesystem encoding and error handler`. .. versionadded:: 3.2 @@ -343,7 +343,7 @@ an error value). Similar to :c:func:`PyErr_WarnExplicitObject` except that *message* and *module* are UTF-8 encoded strings, and *filename* is decoded from the - filesystem encoding (:func:`os.fsdecode`). + :term:`filesystem encoding and error handler`. .. c:function:: int PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, const char *format, ...) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 7f06648bcb4572..3ce689203a8170 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -151,8 +151,9 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. c:var:: int Py_LegacyWindowsFSEncodingFlag - If the flag is non-zero, use the ``mbcs`` encoding instead of the UTF-8 - encoding for the filesystem encoding. + If the flag is non-zero, use the ``mbcs`` encoding with ``replace`` error + handler, instead of the UTF-8 encoding with ``surrogatepass`` error handler, + for the :term:`filesystem encoding and error handler`. Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable is set to a non-empty string. diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 92a6c3a56d67fb..dad1f90bea548b 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -189,11 +189,7 @@ PyPreConfig .. c:type:: PyPreConfig - Structure used to preinitialize Python: - - * Set the Python memory allocator - * Configure the LC_CTYPE locale - * Set the UTF-8 mode + Structure used to preinitialize Python. Function to initialize a preconfiguration: @@ -211,7 +207,7 @@ PyPreConfig .. c:member:: int allocator - Name of the memory allocator: + Name of the Python memory allocators: * ``PYMEM_ALLOCATOR_NOT_SET`` (``0``): don't change memory allocators (use defaults) @@ -231,27 +227,48 @@ PyPreConfig See :ref:`Memory Management `. + Default: ``PYMEM_ALLOCATOR_NOT_SET``. + .. c:member:: int configure_locale - Set the LC_CTYPE locale to the user preferred locale? If equals to 0, set - :c:member:`coerce_c_locale` and :c:member:`coerce_c_locale_warn` to 0. + Set the LC_CTYPE locale to the user preferred locale? + + If equals to 0, set :c:member:`~PyPreConfig.coerce_c_locale` and + :c:member:`~PyPreConfig.coerce_c_locale_warn` members to 0. + + See the :term:`locale encoding`. + + Default: ``1`` in Python config, ``0`` in isolated config. .. c:member:: int coerce_c_locale - If equals to 2, coerce the C locale; if equals to 1, read the LC_CTYPE - locale to decide if it should be coerced. + If equals to 2, coerce the C locale. + + If equals to 1, read the LC_CTYPE locale to decide if it should be + coerced. + + See the :term:`locale encoding`. + + Default: ``-1`` in Python config, ``0`` in isolated config. .. c:member:: int coerce_c_locale_warn If non-zero, emit a warning if the C locale is coerced. + Default: ``-1`` in Python config, ``0`` in isolated config. + .. c:member:: int dev_mode - See :c:member:`PyConfig.dev_mode`. + If non-zero, enables the :ref:`Python Development Mode `: + see :c:member:`PyConfig.dev_mode`. + + Default: ``-1`` in Python mode, ``0`` in isolated mode. .. c:member:: int isolated - See :c:member:`PyConfig.isolated`. + Isolated mode: see :c:member:`PyConfig.isolated`. + + Default: ``0`` in Python mode, ``1`` in isolated mode. .. c:member:: int legacy_windows_fs_encoding @@ -267,6 +284,8 @@ PyPreConfig Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for Windows specific code. + Default: ``0``. + .. c:member:: int parse_argv If non-zero, :c:func:`Py_PreInitializeFromArgs` and @@ -274,16 +293,36 @@ PyPreConfig same way the regular Python parses command line arguments: see :ref:`Command Line Arguments `. + Default: ``1`` in Python config, ``0`` in isolated config. + .. c:member:: int use_environment - See :c:member:`PyConfig.use_environment`. + Use :ref:`environment variables `? See + :c:member:`PyConfig.use_environment`. + + Default: ``1`` in Python config and ``0`` in isolated config. .. c:member:: int utf8_mode - If non-zero, enable the UTF-8 mode. + If non-zero, enable the :ref:`Python UTF-8 Mode `. + + Set by the :option:`-X utf8 <-X>` command line option and the + :envvar:`PYTHONUTF8` environment variable. + + Default: ``-1`` in Python config and ``0`` in isolated config. + + +.. _c-preinit: + +Preinitialize Python with PyPreConfig +------------------------------------- -Preinitialization with PyPreConfig ----------------------------------- +The preinitialization of Python: + +* Set the Python memory allocators (:c:member:`PyPreConfig.allocator`) +* Configure the LC_CTYPE locale (:term:`locale encoding`) +* Set the :ref:`Python UTF-8 Mode ` + (:c:member:`PyPreConfig.utf8_mode`) Functions to preinitialize Python: @@ -293,13 +332,17 @@ Functions to preinitialize Python: .. c:function:: PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char * const *argv) - Preinitialize Python from *preconfig* preconfiguration and command line - arguments (bytes strings). + Preinitialize Python from *preconfig* preconfiguration. + + Parse *argv* command line arguments (bytes strings) if + :c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero. .. c:function:: PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t * const * argv) - Preinitialize Python from *preconfig* preconfiguration and command line - arguments (wide strings). + Preinitialize Python from *preconfig* preconfiguration. + + Parse *argv* command line arguments (wide strings) if + :c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero. The caller is responsible to handle exceptions (error or exit) using :c:func:`PyStatus_Exception` and :c:func:`Py_ExitStatusException`. @@ -309,7 +352,7 @@ For :ref:`Python Configuration ` command line arguments, the command line arguments must also be passed to preinitialize Python, since they have an effect on the pre-configuration like encodings. For example, the :option:`-X utf8 <-X>` command line option -enables the UTF-8 Mode. +enables the :ref:`Python UTF-8 Mode `. ``PyMem_SetAllocator()`` can be called after :c:func:`Py_PreInitialize` and before :c:func:`Py_InitializeFromConfig` to install a custom memory allocator. @@ -317,11 +360,12 @@ It can be called before :c:func:`Py_PreInitialize` if :c:member:`PyPreConfig.allocator` is set to ``PYMEM_ALLOCATOR_NOT_SET``. Python memory allocation functions like :c:func:`PyMem_RawMalloc` must not be -used before Python preinitialization, whereas calling directly ``malloc()`` and -``free()`` is always safe. :c:func:`Py_DecodeLocale` must not be called before -the preinitialization. +used before the Python preinitialization, whereas calling directly ``malloc()`` +and ``free()`` is always safe. :c:func:`Py_DecodeLocale` must not be called +before the Python preinitialization. -Example using the preinitialization to enable the UTF-8 Mode:: +Example using the preinitialization to enable +the :ref:`Python UTF-8 Mode `:: PyStatus status; PyPreConfig preconfig; @@ -334,7 +378,7 @@ Example using the preinitialization to enable the UTF-8 Mode:: Py_ExitStatusException(status); } - /* at this point, Python will speak UTF-8 */ + /* at this point, Python speaks UTF-8 */ Py_Initialize(); /* ... use Python API here ... */ @@ -348,47 +392,54 @@ PyConfig Structure containing most parameters to configure Python. + When done, the :c:func:`PyConfig_Clear` function must be used to release the + configuration memory. + Structure methods: .. c:function:: void PyConfig_InitPythonConfig(PyConfig *config) - Initialize configuration with :ref:`Python Configuration + Initialize configuration with the :ref:`Python Configuration `. .. c:function:: void PyConfig_InitIsolatedConfig(PyConfig *config) - Initialize configuration with :ref:`Isolated Configuration + Initialize configuration with the :ref:`Isolated Configuration `. .. c:function:: PyStatus PyConfig_SetString(PyConfig *config, wchar_t * const *config_str, const wchar_t *str) Copy the wide character string *str* into ``*config_str``. - Preinitialize Python if needed. + :ref:`Preinitialize Python ` if needed. .. c:function:: PyStatus PyConfig_SetBytesString(PyConfig *config, wchar_t * const *config_str, const char *str) - Decode *str* using ``Py_DecodeLocale()`` and set the result into ``*config_str``. + Decode *str* using :c:func:`Py_DecodeLocale` and set the result into + ``*config_str``. - Preinitialize Python if needed. + :ref:`Preinitialize Python ` if needed. .. c:function:: PyStatus PyConfig_SetArgv(PyConfig *config, int argc, wchar_t * const *argv) - Set command line arguments from wide character strings. + Set command line arguments (:c:member:`~PyConfig.argv` member of + *config*) from the *argv* list of wide character strings. - Preinitialize Python if needed. + :ref:`Preinitialize Python ` if needed. .. c:function:: PyStatus PyConfig_SetBytesArgv(PyConfig *config, int argc, char * const *argv) - Set command line arguments: decode bytes using :c:func:`Py_DecodeLocale`. + Set command line arguments (:c:member:`~PyConfig.argv` member of + *config*) from the *argv* list of bytes strings. Decode bytes using + :c:func:`Py_DecodeLocale`. - Preinitialize Python if needed. + :ref:`Preinitialize Python ` if needed. .. c:function:: PyStatus PyConfig_SetWideStringList(PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items) Set the list of wide strings *list* to *length* and *items*. - Preinitialize Python if needed. + :ref:`Preinitialize Python ` if needed. .. c:function:: PyStatus PyConfig_Read(PyConfig *config) @@ -396,24 +447,25 @@ PyConfig Fields which are already initialized are left unchanged. - Preinitialize Python if needed. + :ref:`Preinitialize Python ` if needed. .. c:function:: void PyConfig_Clear(PyConfig *config) Release configuration memory. - Most ``PyConfig`` methods preinitialize Python if needed. In that case, the - Python preinitialization configuration in based on the :c:type:`PyConfig`. - If configuration fields which are in common with :c:type:`PyPreConfig` are - tuned, they must be set before calling a :c:type:`PyConfig` method: + Most ``PyConfig`` methods :ref:`preinitialize Python ` if needed. + In that case, the Python preinitialization configuration + (:c:type:`PyPreConfig`) in based on the :c:type:`PyConfig`. If configuration + fields which are in common with :c:type:`PyPreConfig` are tuned, they must + be set before calling a :c:type:`PyConfig` method: - * :c:member:`~PyConfig.dev_mode` - * :c:member:`~PyConfig.isolated` - * :c:member:`~PyConfig.parse_argv` - * :c:member:`~PyConfig.use_environment` + * :c:member:`PyConfig.dev_mode` + * :c:member:`PyConfig.isolated` + * :c:member:`PyConfig.parse_argv` + * :c:member:`PyConfig.use_environment` Moreover, if :c:func:`PyConfig_SetArgv` or :c:func:`PyConfig_SetBytesArgv` - is used, this method must be called first, before other methods, since the + is used, this method must be called before other methods, since the preinitialization configuration depends on command line arguments (if :c:member:`parse_argv` is non-zero). @@ -424,11 +476,17 @@ PyConfig .. c:member:: PyWideStringList argv - Command line arguments, :data:`sys.argv`. See - :c:member:`~PyConfig.parse_argv` to parse :c:member:`~PyConfig.argv` the - same way the regular Python parses Python command line arguments. If - :c:member:`~PyConfig.argv` is empty, an empty string is added to ensure - that :data:`sys.argv` always exists and is never empty. + Command line arguments: :data:`sys.argv`. + + Set :c:member:`~PyConfig.parse_argv` to ``1`` to parse + :c:member:`~PyConfig.argv` the same way the regular Python parses Python + command line arguments and then to strip Python arguments from + :c:member:`~PyConfig.argv`. + + If :c:member:`~PyConfig.argv` is empty, an empty string is added to + ensure that :data:`sys.argv` always exists and is never empty. + + Default: ``NULL``. See also the :c:member:`~PyConfig.orig_argv` member. @@ -436,76 +494,136 @@ PyConfig :data:`sys.base_exec_prefix`. + Default: ``NULL``. + + Part of the :ref:`Path Configuration ` output. + .. c:member:: wchar_t* base_executable - :data:`sys._base_executable`: ``__PYVENV_LAUNCHER__`` environment - variable value, or copy of :c:member:`PyConfig.executable`. + Python base executable: :data:`sys._base_executable`. + + Set by the :envvar:`__PYVENV_LAUNCHER__` environment variable. + + Set from :c:member:`PyConfig.executable` if ``NULL``. + + Default: ``NULL``. + + Part of the :ref:`Path Configuration ` output. .. c:member:: wchar_t* base_prefix :data:`sys.base_prefix`. - .. c:member:: wchar_t* platlibdir - - :data:`sys.platlibdir`: platform library directory name, set at configure time - by ``--with-platlibdir``, overrideable by the ``PYTHONPLATLIBDIR`` - environment variable. + Default: ``NULL``. - .. versionadded:: 3.9 + Part of the :ref:`Path Configuration ` output. .. c:member:: int buffered_stdio - If equals to 0, enable unbuffered mode, making the stdout and stderr - streams unbuffered. + If equals to 0 and :c:member:`~PyConfig.configure_c_stdio` is non-zero, + disable buffering on the C streams stdout and stderr. + + Set to 0 by the :option:`-u` command line option and the + :envvar:`PYTHONUNBUFFERED` environment variable. stdin is always opened in buffered mode. + Default: ``1``. + .. c:member:: int bytes_warning If equals to 1, issue a warning when comparing :class:`bytes` or :class:`bytearray` with :class:`str`, or comparing :class:`bytes` with - :class:`int`. If equal or greater to 2, raise a :exc:`BytesWarning` - exception. + :class:`int`. + + If equal or greater to 2, raise a :exc:`BytesWarning` exception in these + cases. + + Incremented by the :option:`-b` command line option. + + Default: ``0``. .. c:member:: wchar_t* check_hash_pycs_mode - Control the validation behavior of hash-based ``.pyc`` files (see - :pep:`552`): :option:`--check-hash-based-pycs` command line option value. + Control the validation behavior of hash-based ``.pyc`` files: + value of the :option:`--check-hash-based-pycs` command line option. - Valid values: ``always``, ``never`` and ``default``. + Valid values: - The default value is: ``default``. + - ``L"always"``: Hash the source file for invalidation regardless of + value of the 'check_source' flag. + - ``L"never"``: Assume that hash-based pycs always are valid. + - ``L"default"``: The 'check_source' flag in hash-based pycs + determines invalidation. + + Default: ``L"default"``. + + See also :pep:`552` "Deterministic pycs". .. c:member:: int configure_c_stdio - If non-zero, configure C standard streams (``stdio``, ``stdout``, - ``stdout``). For example, set their mode to ``O_BINARY`` on Windows. + If non-zero, configure C standard streams: + + * On Windows, set the binary mode (``O_BINARY``) on stdin, stdout and + stderr. + * If :c:member:`~PyConfig.buffered_stdio` equals zero, disable buffering + of stdin, stdout and stderr streams. + * If :c:member:`~PyConfig.interactive` is non-zero, enable stream + buffering on stdin and stdout (only stdout on Windows). + + Default: ``1`` in Python config, ``0`` in isolated config. .. c:member:: int dev_mode If non-zero, enable the :ref:`Python Development Mode `. + Default: ``-1`` in Python mode, ``0`` in isolated mode. + .. c:member:: int dump_refs + Dump Python refererences? + If non-zero, dump all objects which are still alive at exit. - ``Py_TRACE_REFS`` macro must be defined in build. + Set to ``1`` by the :envvar:`PYTHONDUMPREFS` environment variable. + + Need a special build of Python with the ``Py_TRACE_REFS`` macro defined. + + Default: ``0``. .. c:member:: wchar_t* exec_prefix - :data:`sys.exec_prefix`. + The site-specific directory prefix where the platform-dependent Python + files are installed: :data:`sys.exec_prefix`. + + Default: ``NULL``. + + Part of the :ref:`Path Configuration ` output. .. c:member:: wchar_t* executable + The absolute path of the executable binary for the Python interpreter: :data:`sys.executable`. + Default: ``NULL``. + + Part of the :ref:`Path Configuration ` output. + .. c:member:: int faulthandler + Enable faulthandler? + If non-zero, call :func:`faulthandler.enable` at startup. + Set to ``1`` by :option:`-X faulthandler <-X>` and the + :envvar:`PYTHONFAULTHANDLER` environment variable. + + Default: ``-1`` in Python mode, ``0`` in isolated mode. + .. c:member:: wchar_t* filesystem_encoding - Filesystem encoding: :func:`sys.getfilesystemencoding`. + :term:`Filesystem encoding `: + :func:`sys.getfilesystemencoding`. On macOS, Android and VxWorks: use ``"utf-8"`` by default. @@ -521,7 +639,7 @@ PyConfig ``mbstowcs()`` function decodes from a different encoding (usually Latin1). * ``"utf-8"`` if ``nl_langinfo(CODESET)`` returns an empty string. - * Otherwise, use the LC_CTYPE locale encoding: + * Otherwise, use the :term:`locale encoding`: ``nl_langinfo(CODESET)`` result. At Python statup, the encoding name is normalized to the Python codec @@ -531,7 +649,8 @@ PyConfig .. c:member:: wchar_t* filesystem_errors - Filesystem error handler: :func:`sys.getfilesystemencodeerrors`. + :term:`Filesystem error handler `: + :func:`sys.getfilesystemencodeerrors`. On Windows: use ``"surrogatepass"`` by default, or ``"replace"`` if :c:member:`~PyPreConfig.legacy_windows_fs_encoding` of @@ -553,30 +672,62 @@ PyConfig Randomized hash function seed. If :c:member:`~PyConfig.use_hash_seed` is zero, a seed is chosen randomly - at Pythonstartup, and :c:member:`~PyConfig.hash_seed` is ignored. + at Python startup, and :c:member:`~PyConfig.hash_seed` is ignored. + + Set by the :envvar:`PYTHONHASHSEED` environment variable. + + Default *use_hash_seed* value: ``-1`` in Python mode, ``0`` in isolated + mode. .. c:member:: wchar_t* home Python home directory. - Initialized from :envvar:`PYTHONHOME` environment variable value by - default. + If :c:func:`Py_SetPythonHome` has been called, use its argument if it is + not ``NULL``. + + Set by the :envvar:`PYTHONHOME` environment variable. + + Default: ``NULL``. + + Part of the :ref:`Path Configuration ` input. .. c:member:: int import_time If non-zero, profile import time. + Set the ``1`` by the :option:`-X importtime <-X>` option and the + :envvar:`PYTHONPROFILEIMPORTTIME` environment variable. + + Default: ``0``. + .. c:member:: int inspect Enter interactive mode after executing a script or a command. + If greater than 0, enable inspect: when a script is passed as first + argument or the -c option is used, enter interactive mode after executing + the script or the command, even when :data:`sys.stdin` does not appear to + be a terminal. + + Incremented by the :option:`-i` command line option. Set to ``1`` if the + :envvar:`PYTHONINSPECT` environment variable is non-empty. + + Default: ``0``. + .. c:member:: int install_signal_handlers - Install signal handlers? + Install Python signal handlers? + + Default: ``1`` in Python mode, ``0`` in isolated mode. .. c:member:: int interactive - Interactive mode. + If greater than 0, enable the interactive mode (REPL). + + Incremented by the :option:`-i` command line option. + + Default: ``0``. .. c:member:: int isolated @@ -590,50 +741,93 @@ PyConfig * Set :c:member:`~PyConfig.use_environment` and :c:member:`~PyConfig.user_site_directory` to 0. + Default: ``0`` in Python mode, ``1`` in isolated mode. + + See also :c:member:`PyPreConfig.isolated`. + .. c:member:: int legacy_windows_stdio If non-zero, use :class:`io.FileIO` instead of :class:`io.WindowsConsoleIO` for :data:`sys.stdin`, :data:`sys.stdout` and :data:`sys.stderr`. + Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSSTDIO` environment + variable is set to a non-empty string. + Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for Windows specific code. + Default: ``0``. + + See also the :pep:`528` (Change Windows console encoding to UTF-8). + .. c:member:: int malloc_stats If non-zero, dump statistics on :ref:`Python pymalloc memory allocator ` at exit. + Set to ``1`` by the :envvar:`PYTHONMALLOCSTATS` environment variable. + The option is ignored if Python is built using ``--without-pymalloc``. + Default: ``0``. + + .. c:member:: wchar_t* platlibdir + + Platform library directory name: :data:`sys.platlibdir`. + + Set by the :envvar:`PYTHONPLATLIBDIR` environment variable. + + Default: value of the ``PLATLIBDIR`` macro which is set at configure time + by ``--with-platlibdir`` (default: ``"lib"``). + + Part of the :ref:`Path Configuration ` input. + + .. versionadded:: 3.9 + .. c:member:: wchar_t* pythonpath_env - Module search paths as a string separated by ``DELIM`` + Module search paths (:data:`sys.path`) as a string separated by ``DELIM`` (:data:`os.path.pathsep`). - Initialized from :envvar:`PYTHONPATH` environment variable value by - default. + Set by the :envvar:`PYTHONPATH` environment variable. + + Default: ``NULL``. + + Part of the :ref:`Path Configuration ` input. .. c:member:: PyWideStringList module_search_paths .. c:member:: int module_search_paths_set - :data:`sys.path`. If :c:member:`~PyConfig.module_search_paths_set` is - equal to 0, the :c:member:`~PyConfig.module_search_paths` is overridden - by the function calculating the :ref:`Path Configuration - `. + Module search paths: :data:`sys.path`. + + If :c:member:`~PyConfig.module_search_paths_set` is equal to 0, the + function calculating the :ref:`Path Configuration ` + overrides the :c:member:`~PyConfig.module_search_paths` and sets + :c:member:`~PyConfig.module_search_paths_set` to ``1``. + + Default: empty list (``module_search_paths``) and ``0`` + (``module_search_paths_set``). + + Part of the :ref:`Path Configuration ` output. .. c:member:: int optimization_level Compilation optimization level: - * 0: Peephole optimizer (and ``__debug__`` is set to ``True``) - * 1: Remove assertions, set ``__debug__`` to ``False`` - * 2: Strip docstrings + * ``0``: Peephole optimizer, set ``__debug__`` to ``True``. + * ``1``: Level 0, remove assertions, set ``__debug__`` to ``False``. + * ``2``: Level 1, strip docstrings. + + Incremented by the :option:`-O` command line option. Set to the + :envvar:`PYTHONOPTIMIZE` environment variable value. + + Default: ``0``. .. c:member:: PyWideStringList orig_argv The list of the original command line arguments passed to the Python - executable. + executable: :data:`sys.orig_argv`. If :c:member:`~PyConfig.orig_argv` list is empty and :c:member:`~PyConfig.argv` is not a list only containing an empty @@ -645,57 +839,117 @@ PyConfig See also the :c:member:`~PyConfig.argv` member and the :c:func:`Py_GetArgcArgv` function. + Default: empty list. + .. versionadded:: 3.10 .. c:member:: int parse_argv + Parse command line arguments? + If non-zero, parse :c:member:`~PyConfig.argv` the same way the regular - Python command line arguments, and strip Python arguments from - :c:member:`~PyConfig.argv`: see :ref:`Command Line Arguments - `. + Python parses :ref:`command line arguments `, and strip + Python arguments from :c:member:`~PyConfig.argv`. + + Default: ``1`` in Python mode, ``0`` in isolated mode. .. c:member:: int parser_debug - If non-zero, turn on parser debugging output (for expert only, depending + Parser debug mode. If greater than 0, turn on parser debugging output (for expert only, depending on compilation options). + Incremented by the :option:`-d` command line option. Set to the + :envvar:`PYTHONDEBUG` environment variable value. + + Default: ``0``. + .. c:member:: int pathconfig_warnings - If equal to 0, suppress warnings when calculating the :ref:`Path - Configuration ` (Unix only, Windows does not log any - warning). Otherwise, warnings are written into ``stderr``. + On Unix, if non-zero, calculating the :ref:`Path Configuration + ` can log warnings into ``stderr``. If equals to 0, + suppress these warnings. + + It has no effect on Windows. + + Default: ``1`` in Python mode, ``0`` in isolated mode. + + Part of the :ref:`Path Configuration ` input. .. c:member:: wchar_t* prefix - :data:`sys.prefix`. + The site-specific directory prefix where the platform independent Python + files are installed: :data:`sys.prefix`. + + Default: ``NULL``. + + Part of the :ref:`Path Configuration ` output. .. c:member:: wchar_t* program_name - Program name. Used to initialize :c:member:`~PyConfig.executable`, and in - early error messages. + Program name used to initialize :c:member:`~PyConfig.executable` and in + early error messages during Python initialization. + + * If :func:`Py_SetProgramName` has been called, use its argument. + * On macOS, use :envvar:`PYTHONEXECUTABLE` environment variable if set. + * If the ``WITH_NEXT_FRAMEWORK`` macro is defined, use + :envvar:`__PYVENV_LAUNCHER__` environment variable if set. + * Use ``argv[0]`` of :c:member:`~PyConfig.argv` if available and + non-empty. + * Otherwise, use ``L"python"`` on Windows, or ``L"python3"`` on other + platforms. + + Default: ``NULL``. + + Part of the :ref:`Path Configuration ` input. .. c:member:: wchar_t* pycache_prefix - :data:`sys.pycache_prefix`: ``.pyc`` cache prefix. + Directory where cached ``.pyc`` files are written: + :data:`sys.pycache_prefix`. + + Set by the :option:`-X pycache_prefix=PATH <-X>` command line option and + the :envvar:`PYTHONPYCACHEPREFIX` environment variable. If ``NULL``, :data:`sys.pycache_prefix` is set to ``None``. + Default: ``NULL``. + .. c:member:: int quiet - Quiet mode. For example, don't display the copyright and version messages - in interactive mode. + Quiet mode. If greater than 0, don't display the copyright and version at + Python startup in interactive mode. + + Incremented by the :option:`-q` command line option. + + Default: ``0``. .. c:member:: wchar_t* run_command - ``python3 -c COMMAND`` argument. Used by :c:func:`Py_RunMain`. + Value of the :option:`-c` command line option. + + Used by :c:func:`Py_RunMain`. + + Default: ``NULL``. .. c:member:: wchar_t* run_filename - ``python3 FILENAME`` argument. Used by :c:func:`Py_RunMain`. + Filename passed on the command line: trailing command line argument + without :option:`-c` or :option:`-m`. + + For example, it is set to ``script.py`` by the ``python3 script.py arg`` + command. + + Used by :c:func:`Py_RunMain`. + + Default: ``NULL``. .. c:member:: wchar_t* run_module - ``python3 -m MODULE`` argument. Used by :c:func:`Py_RunMain`. + Value of the :option:`-m` command line option. + + Used by :c:func:`Py_RunMain`. + + Default: ``NULL``. .. c:member:: int show_ref_count @@ -705,64 +959,146 @@ PyConfig Need a debug build of Python (``Py_REF_DEBUG`` macro must be defined). + Default: ``0``. + .. c:member:: int site_import Import the :mod:`site` module at startup? + If equal to zero, disable the import of the module site and the + site-dependent manipulations of :data:`sys.path` that it entails. + + Also disable these manipulations if the :mod:`site` module is explicitly + imported later (call :func:`site.main` if you want them to be triggered). + + Set to ``0`` by the :option:`-S` command line option. + + :data:`sys.flags.no_site` is set to the inverted value of + :c:member:`~PyConfig.site_import`. + + Default: ``1``. + .. c:member:: int skip_source_first_line - Skip the first line of the source? + If non-zero, skip the first line of the :c:member:`PyConfig.run_filename` + source. + + It allows the usage of non-Unix forms of ``#!cmd``. This is intended for + a DOS specific hack only. + + Set to ``1`` by the :option:`-x` command line option. + + Default: ``0``. .. c:member:: wchar_t* stdio_encoding .. c:member:: wchar_t* stdio_errors Encoding and encoding errors of :data:`sys.stdin`, :data:`sys.stdout` and - :data:`sys.stderr`. + :data:`sys.stderr` (but :data:`sys.stderr` always uses + ``"backslashreplace"`` error handler). + + If :c:func:`Py_SetStandardStreamEncoding` has been called, use its + *error* and *errors* arguments if they are not ``NULL``. + + Use the :envvar:`PYTHONIOENCODING` environment variable if it is + non-empty. + + Default encoding: + + * ``"UTF-8"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero. + * Otherwise, use the :term:`locale encoding`. + + Default error handler: + + * On Windows: use ``"surrogateescape"``. + * ``"surrogateescape"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero, + or if the LC_CTYPE locale is "C" or "POSIX". + * ``"strict"`` otherwise. .. c:member:: int tracemalloc + Enable tracemalloc? + If non-zero, call :func:`tracemalloc.start` at startup. + Set by :option:`-X tracemalloc=N <-X>` command line option and by the + :envvar:`PYTHONTRACEMALLOC` environment variable. + + Default: ``-1`` in Python mode, ``0`` in isolated mode. + .. c:member:: int use_environment - If greater than 0, use :ref:`environment variables `. + Use :ref:`environment variables `? + + If equals to zero, ignore the :ref:`environment variables + `. + + Default: ``1`` in Python config and ``0`` in isolated config. .. c:member:: int user_site_directory - If non-zero, add user site directory to :data:`sys.path`. + If non-zero, add the user site directory to :data:`sys.path`. + + Set to ``0`` by the :option:`-s` and :option:`-I` command line options. + + Set to ``0`` by the :envvar:`PYTHONNOUSERSITE` environment variable. + + Default: ``1`` in Python mode, ``0`` in isolated mode. .. c:member:: int verbose - If non-zero, enable verbose mode. + Verbose mode. If greater than 0, print a message each time a module is + imported, showing the place (filename or built-in module) from which + it is loaded. + + If greater or equal to 2, print a message for each file that is checked + for when searching for a module. Also provides information on module + cleanup at exit. + + Incremented by the :option:`-v` command line option. + + Set to the :envvar:`PYTHONVERBOSE` environment variable value. + + Default: ``0``. .. c:member:: PyWideStringList warnoptions - :data:`sys.warnoptions`: options of the :mod:`warnings` module to build - warnings filters: lowest to highest priority. + Options of the :mod:`warnings` module to build warnings filters, lowest + to highest priority: :data:`sys.warnoptions`. The :mod:`warnings` module adds :data:`sys.warnoptions` in the reverse order: the last :c:member:`PyConfig.warnoptions` item becomes the first item of :data:`warnings.filters` which is checked first (highest priority). + Default: empty list. + .. c:member:: int write_bytecode - If non-zero, write ``.pyc`` files. + If equal to 0, Python won't try to write ``.pyc`` files on the import of + source modules. + + Set to ``0`` by the :option:`-B` command line option and the + :envvar:`PYTHONDONTWRITEBYTECODE` environment variable. :data:`sys.dont_write_bytecode` is initialized to the inverted value of :c:member:`~PyConfig.write_bytecode`. + Default: ``1``. + .. c:member:: PyWideStringList xoptions - :data:`sys._xoptions`. + Values of the :option:`-X` command line options: :data:`sys._xoptions`. + + Default: empty list. -If ``parse_argv`` is non-zero, ``argv`` arguments are parsed the same -way the regular Python parses command line arguments, and Python -arguments are stripped from ``argv``: see :ref:`Command Line Arguments -`. +If :c:member:`~PyConfig.parse_argv` is non-zero, :c:member:`~PyConfig.argv` +arguments are parsed the same way the regular Python parses :ref:`command line +arguments `, and Python arguments are stripped from +:c:member:`~PyConfig.argv`. -The ``xoptions`` options are parsed to set other options: see :option:`-X` -option. +The :c:member:`~PyConfig.xoptions` options are parsed to set other options: see +the :option:`-X` command line option. .. versionchanged:: 3.9 @@ -781,9 +1117,9 @@ Function to initialize Python: The caller is responsible to handle exceptions (error or exit) using :c:func:`PyStatus_Exception` and :c:func:`Py_ExitStatusException`. -If ``PyImport_FrozenModules``, ``PyImport_AppendInittab()`` or -``PyImport_ExtendInittab()`` are used, they must be set or called after Python -preinitialization and before the Python initialization. +If :c:func:`PyImport_FrozenModules`, :c:func:`PyImport_AppendInittab` or +:c:func:`PyImport_ExtendInittab` are used, they must be set or called after +Python preinitialization and before the Python initialization. Example setting the program name:: @@ -828,7 +1164,7 @@ configuration, and then override some parameters:: Implicitly preinitialize Python. */ status = PyConfig_SetBytesString(&config, &config.program_name, - program_name); + program_name); if (PyStatus_Exception(status)) { goto done; } @@ -894,7 +1230,8 @@ the regular Python. Environments variables and command line arguments are used to configure Python, whereas global configuration variables are ignored. -This function enables C locale coercion (:pep:`538`) and UTF-8 Mode +This function enables C locale coercion (:pep:`538`) +and :ref:`Python UTF-8 Mode ` (:pep:`540`) depending on the LC_CTYPE locale, :envvar:`PYTHONUTF8` and :envvar:`PYTHONCOERCECLOCALE` environment variables. diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index 9ac91790978926..97717f5fc19230 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -118,22 +118,21 @@ Operating System Utilities .. c:function:: wchar_t* Py_DecodeLocale(const char* arg, size_t *size) - Decode a byte string from the locale encoding with the :ref:`surrogateescape - error handler `: undecodable bytes are decoded as - characters in range U+DC80..U+DCFF. If a byte sequence can be decoded as a - surrogate character, escape the bytes using the surrogateescape error - handler instead of decoding them. - - Encoding, highest priority to lowest priority: - - * ``UTF-8`` on macOS, Android, and VxWorks; - * ``UTF-8`` on Windows if :c:data:`Py_LegacyWindowsFSEncodingFlag` is zero; - * ``UTF-8`` if the Python UTF-8 mode is enabled; - * ``ASCII`` if the ``LC_CTYPE`` locale is ``"C"``, - ``nl_langinfo(CODESET)`` returns the ``ASCII`` encoding (or an alias), - and :c:func:`mbstowcs` and :c:func:`wcstombs` functions uses the - ``ISO-8859-1`` encoding. - * the current locale encoding. + .. warning:: + This function should not be called directly: use the :c:type:`PyConfig` + API with the :c:func:`PyConfig_SetBytesString` function which ensures + that :ref:`Python is preinitialized `. + + This function must not be called before :ref:`Python is preinitialized + ` and so that the LC_CTYPE locale is properly configured: see + the :c:func:`Py_PreInitialize` function. + + Decode a byte string from the :term:`filesystem encoding and error handler`. + If the error handler is :ref:`surrogateescape error handler + `, undecodable bytes are decoded as characters in range + U+DC80..U+DCFF; and if a byte sequence can be decoded as a surrogate + character, the bytes are escaped using the surrogateescape error handler + instead of decoding them. Return a pointer to a newly allocated wide character string, use :c:func:`PyMem_RawFree` to free the memory. If size is not ``NULL``, write @@ -143,6 +142,10 @@ Operating System Utilities not ``NULL``, ``*size`` is set to ``(size_t)-1`` on memory error or set to ``(size_t)-2`` on decoding error. + The :term:`filesystem encoding and error handler` are selected by + :c:func:`PyConfig_Read`: see :c:member:`~PyConfig.filesystem_encoding` and + :c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. + Decoding errors should never happen, unless there is a bug in the C library. @@ -157,7 +160,8 @@ Operating System Utilities .. versionadded:: 3.5 .. versionchanged:: 3.7 - The function now uses the UTF-8 encoding in the UTF-8 mode. + The function now uses the UTF-8 encoding in the :ref:`Python UTF-8 Mode + `. .. versionchanged:: 3.8 The function now uses the UTF-8 encoding on Windows if @@ -166,22 +170,10 @@ Operating System Utilities .. c:function:: char* Py_EncodeLocale(const wchar_t *text, size_t *error_pos) - Encode a wide character string to the locale encoding with the - :ref:`surrogateescape error handler `: surrogate characters - in the range U+DC80..U+DCFF are converted to bytes 0x80..0xFF. - - Encoding, highest priority to lowest priority: - - * ``UTF-8`` on macOS, Android, and VxWorks; - * ``UTF-8`` on Windows if :c:data:`Py_LegacyWindowsFSEncodingFlag` is zero; - * ``UTF-8`` if the Python UTF-8 mode is enabled; - * ``ASCII`` if the ``LC_CTYPE`` locale is ``"C"``, - ``nl_langinfo(CODESET)`` returns the ``ASCII`` encoding (or an alias), - and :c:func:`mbstowcs` and :c:func:`wcstombs` functions uses the - ``ISO-8859-1`` encoding. - * the current locale encoding. - - The function uses the UTF-8 encoding in the Python UTF-8 mode. + Encode a wide character string to the :term:`filesystem encoding and error + handler`. If the error handler is :ref:`surrogateescape error handler + `, surrogate characters in the range U+DC80..U+DCFF are + converted to bytes 0x80..0xFF. Return a pointer to a newly allocated byte string, use :c:func:`PyMem_Free` to free the memory. Return ``NULL`` on encoding error or memory allocation @@ -190,9 +182,18 @@ Operating System Utilities If error_pos is not ``NULL``, ``*error_pos`` is set to ``(size_t)-1`` on success, or set to the index of the invalid character on encoding error. + The :term:`filesystem encoding and error handler` are selected by + :c:func:`PyConfig_Read`: see :c:member:`~PyConfig.filesystem_encoding` and + :c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. + Use the :c:func:`Py_DecodeLocale` function to decode the bytes string back to a wide character string. + .. warning:: + This function must not be called before :ref:`Python is preinitialized + ` and so that the LC_CTYPE locale is properly configured: see + the :c:func:`Py_PreInitialize` function. + .. seealso:: The :c:func:`PyUnicode_EncodeFSDefault` and @@ -201,7 +202,8 @@ Operating System Utilities .. versionadded:: 3.5 .. versionchanged:: 3.7 - The function now uses the UTF-8 encoding in the UTF-8 mode. + The function now uses the UTF-8 encoding in the :ref:`Python UTF-8 Mode + `. .. versionchanged:: 3.8 The function now uses the UTF-8 encoding on Windows if diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 54bd0a3cbb6556..b7f99d32558b89 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -783,7 +783,7 @@ system. :c:data:`Py_FileSystemDefaultEncoding` (the locale encoding read at Python startup). - This function ignores the Python UTF-8 mode. + This function ignores the :ref:`Python UTF-8 Mode `. .. seealso:: @@ -819,7 +819,7 @@ system. :c:data:`Py_FileSystemDefaultEncoding` (the locale encoding read at Python startup). - This function ignores the Python UTF-8 mode. + This function ignores the :ref:`Python UTF-8 Mode `. .. seealso:: @@ -878,8 +878,7 @@ conversion function: .. c:function:: PyObject* PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) - Decode a string using :c:data:`Py_FileSystemDefaultEncoding` and the - :c:data:`Py_FileSystemDefaultEncodeErrors` error handler. + Decode a string from the :term:`filesystem encoding and error handler`. If :c:data:`Py_FileSystemDefaultEncoding` is not set, fall back to the locale encoding. @@ -899,8 +898,8 @@ conversion function: .. c:function:: PyObject* PyUnicode_DecodeFSDefault(const char *s) - Decode a null-terminated string using :c:data:`Py_FileSystemDefaultEncoding` - and the :c:data:`Py_FileSystemDefaultEncodeErrors` error handler. + Decode a null-terminated string from the :term:`filesystem encoding and + error handler`. If :c:data:`Py_FileSystemDefaultEncoding` is not set, fall back to the locale encoding. diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index b908cb8354f73f..0f760eaa7ad578 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -112,9 +112,9 @@ the same library that the Python runtime is using. Similar to :c:func:`PyRun_SimpleStringFlags`, but the Python source code is read from *fp* instead of an in-memory string. *filename* should be the name of - the file, it is decoded from the filesystem encoding - (:func:`sys.getfilesystemencoding`). If *closeit* is true, the file is - closed before PyRun_SimpleFileExFlags returns. + the file, it is decoded from :term:`filesystem encoding and error handler`. + If *closeit* is true, the file is closed before + ``PyRun_SimpleFileExFlags()`` returns. .. note:: On Windows, *fp* should be opened as binary mode (e.g. ``fopen(filename, "rb")``). @@ -132,7 +132,7 @@ the same library that the Python runtime is using. Read and execute a single statement from a file associated with an interactive device according to the *flags* argument. The user will be prompted using ``sys.ps1`` and ``sys.ps2``. *filename* is decoded from the - filesystem encoding (:func:`sys.getfilesystemencoding`). + :term:`filesystem encoding and error handler`. Returns ``0`` when the input was executed successfully, ``-1`` if there was an exception, or an error code @@ -151,9 +151,8 @@ the same library that the Python runtime is using. Read and execute statements from a file associated with an interactive device until EOF is reached. The user will be prompted using ``sys.ps1`` and - ``sys.ps2``. *filename* is decoded from the filesystem encoding - (:func:`sys.getfilesystemencoding`). Returns ``0`` at EOF or a negative - number upon failure. + ``sys.ps2``. *filename* is decoded from the :term:`filesystem encoding and + error handler`. Returns ``0`` at EOF or a negative number upon failure. .. c:var:: int (*PyOS_InputHook)(void) @@ -206,8 +205,8 @@ the same library that the Python runtime is using. Parse Python source code from *str* using the start token *start* according to the *flags* argument. The result can be used to create a code object which can be evaluated efficiently. This is useful if a code fragment must be evaluated - many times. *filename* is decoded from the filesystem encoding - (:func:`sys.getfilesystemencoding`). + many times. *filename* is decoded from the :term:`filesystem encoding and + error handler`. .. c:function:: struct _node* PyParser_SimpleParseFile(FILE *fp, const char *filename, int start) @@ -262,7 +261,7 @@ the same library that the Python runtime is using. Similar to :c:func:`PyRun_StringFlags`, but the Python source code is read from *fp* instead of an in-memory string. *filename* should be the name of the file, - it is decoded from the filesystem encoding (:func:`sys.getfilesystemencoding`). + it is decoded from the :term:`filesystem encoding and error handler`. If *closeit* is true, the file is closed before :c:func:`PyRun_FileExFlags` returns. @@ -301,7 +300,7 @@ the same library that the Python runtime is using. .. c:function:: PyObject* Py_CompileStringExFlags(const char *str, const char *filename, int start, PyCompilerFlags *flags, int optimize) Like :c:func:`Py_CompileStringObject`, but *filename* is a byte string - decoded from the filesystem encoding (:func:`os.fsdecode`). + decoded from the :term:`filesystem encoding and error handler`. .. versionadded:: 3.2 diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 4fd01e0160c26c..506973e964b33e 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -386,6 +386,25 @@ Glossary file-like object A synonym for :term:`file object`. + filesystem encoding and error handler + Encoding and error handler used by Python to decode bytes from the + operating system and encode Unicode to the operating system. + + The filesystem encoding must guarantee to successfully decode all bytes + below 128. If the file system encoding fails to provide this guarantee, + API functions can raise :exc:`UnicodeError`. + + The :func:`sys.getfilesystemencoding` and + :func:`sys.getfilesystemencodeerrors` functions can be used to get the + filesystem encoding and error handler. + + The :term:`filesystem encoding and error handler` are configured at + Python startup by the :c:func:`PyConfig_Read` function: see + :c:member:`~PyConfig.filesystem_encoding` and + :c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. + + See also the :term:`locale encoding`. + finder An object that tries to find the :term:`loader` for a module that is being imported. @@ -673,6 +692,18 @@ Glossary thread removes *key* from *mapping* after the test, but before the lookup. This issue can be solved with locks or by using the EAFP approach. + locale encoding + On Unix, it is the encoding of the LC_CTYPE locale. It can be set with + ``locale.setlocale(locale.LC_CTYPE, new_locale)``. + + On Windows, it is is the ANSI code page (ex: ``cp1252``). + + ``locale.getpreferredencoding(False)`` can be used to get the locale + encoding. + + Python uses the :term:`filesystem encoding and error handler` to convert + between Unicode filenames and bytes filenames. + list A built-in Python :term:`sequence`. Despite its name it is more akin to an array in other languages than to a linked list since access to diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index e948c1e3c662d6..535b21bd4a54f5 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -609,9 +609,9 @@ implemented by converting the Unicode string into some encoding that varies depending on the system. Today Python is converging on using UTF-8: Python on MacOS has used UTF-8 for several versions, and Python 3.6 switched to using UTF-8 on Windows as well. On Unix systems, -there will only be a filesystem encoding if you've set the ``LANG`` or -``LC_CTYPE`` environment variables; if you haven't, the default -encoding is again UTF-8. +there will only be a :term:`filesystem encoding `. if you've set the ``LANG`` or ``LC_CTYPE`` environment variables; if +you haven't, the default encoding is again UTF-8. The :func:`sys.getfilesystemencoding` function returns the encoding to use on your current system, in case you want to do the encoding manually, but there's @@ -633,8 +633,8 @@ provided the directory path as bytes 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 filenames as bytes. For example, -assuming the default filesystem encoding is UTF-8, running the following -program:: +assuming the default :term:`filesystem encoding ` is UTF-8, running the following program:: fn = 'filename\u4500abc' f = open(fn, 'w') diff --git a/Doc/library/devmode.rst b/Doc/library/devmode.rst index d5a40cdeeac5ef..e6ed59496c242e 100644 --- a/Doc/library/devmode.rst +++ b/Doc/library/devmode.rst @@ -93,6 +93,9 @@ The Python Development Mode does not prevent the :option:`-O` command line option from removing :keyword:`assert` statements nor from setting :const:`__debug__` to ``False``. +The Python Development Mode can only be enabled at the Python startup. Its +value can be read from :data:`sys.flags.dev_mode `. + .. versionchanged:: 3.8 The :class:`io.IOBase` destructor now logs ``close()`` exceptions. diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index df2cda9d67ad15..8fb25a50e2d404 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -313,8 +313,8 @@ The following exceptions are the exceptions that are usually raised. .. versionchanged:: 3.4 The :attr:`filename` attribute is now the original file name passed to the function, instead of the name encoded to or decoded from the - filesystem encoding. Also, the *filename2* constructor argument and - attribute was added. + :term:`filesystem encoding and error handler`. Also, the *filename2* + constructor argument and attribute was added. .. exception:: OverflowError diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst index 678148a0dda294..0a77be47fb8994 100644 --- a/Doc/library/locale.rst +++ b/Doc/library/locale.rst @@ -315,21 +315,25 @@ The :mod:`locale` module defines the following exception and functions: .. function:: getpreferredencoding(do_setlocale=True) - Return the encoding used for text data, according to user preferences. User - preferences are expressed differently on different systems, and might not be - available programmatically on some systems, so this function only returns a - guess. + Return the :term:`locale encoding` used for text data, according to user + preferences. User preferences are expressed differently on different + systems, and might not be available programmatically on some systems, so + this function only returns a guess. - On some systems, it is necessary to invoke :func:`setlocale` to obtain the user - preferences, so this function is not thread-safe. If invoking setlocale is not - necessary or desired, *do_setlocale* should be set to ``False``. + On some systems, it is necessary to invoke :func:`setlocale` to obtain the + user preferences, so this function is not thread-safe. If invoking setlocale + is not necessary or desired, *do_setlocale* should be set to ``False``. - On Android or in the UTF-8 mode (:option:`-X` ``utf8`` option), always - return ``'UTF-8'``, the locale and the *do_setlocale* argument are ignored. + On Android or if the :ref:`Python UTF-8 Mode ` is enabled, always + return ``'UTF-8'``, the :term:`locale encoding` and the *do_setlocale* + argument are ignored. + + The :ref:`Python preinitialization ` configures the LC_CTYPE + locale. See also the :term:`filesystem encoding and error handler`. .. versionchanged:: 3.7 - The function now always returns ``UTF-8`` on Android or if the UTF-8 mode - is enabled. + The function now always returns ``UTF-8`` on Android or if the + :ref:`Python UTF-8 Mode ` is enabled. .. function:: normalize(localename) diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 718d98138d2679..f9f35b3124360d 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -68,8 +68,13 @@ File Names, Command Line Arguments, and Environment Variables In Python, file names, command line arguments, and environment variables are represented using the string type. On some systems, decoding these strings to and from bytes is necessary before passing them to the operating system. Python -uses the file system encoding to perform this conversion (see -:func:`sys.getfilesystemencoding`). +uses the :term:`filesystem encoding and error handler` to perform this +conversion (see :func:`sys.getfilesystemencoding`). + +The :term:`filesystem encoding and error handler` are configured at Python +startup by the :c:func:`PyConfig_Read` function: see +:c:member:`~PyConfig.filesystem_encoding` and +:c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. .. versionchanged:: 3.1 On some systems, conversion using the file system encoding may fail. In this @@ -79,9 +84,70 @@ uses the file system encoding to perform this conversion (see original byte on encoding. -The file system encoding must guarantee to successfully decode all bytes -below 128. If the file system encoding fails to provide this guarantee, API -functions may raise UnicodeErrors. +The :term:`file system encoding ` must +guarantee to successfully decode all bytes below 128. If the file system +encoding fails to provide this guarantee, API functions can raise +:exc:`UnicodeError`. + +See also the :term:`locale encoding`. + + +.. _utf8-mode: + +Python UTF-8 Mode +----------------- + +.. versionadded:: 3.7 + See :pep:`540` for more details. + +The Python UTF-8 Mode ignores the :term:`locale encoding` and forces the usage +of the UTF-8 encoding: + +* Use UTF-8 as the :term:`filesystem encoding `. +* :func:`sys.getfilesystemencoding()` returns ``'UTF-8'``. +* :func:`locale.getpreferredencoding()` returns ``'UTF-8'`` (the *do_setlocale* + argument has no effect). +* :data:`sys.stdin`, :data:`sys.stdout`, and :data:`sys.stderr` all use + UTF-8 as their text encoding, with the ``surrogateescape`` + :ref:`error handler ` being enabled for :data:`sys.stdin` + and :data:`sys.stdout` (:data:`sys.stderr` continues to use + ``backslashreplace`` as it does in the default locale-aware mode) + +Note that the standard stream settings in UTF-8 mode can be overridden by +:envvar:`PYTHONIOENCODING` (just as they can be in the default locale-aware +mode). + +As a consequence of the changes in those lower level APIs, other higher +level APIs also exhibit different default behaviours: + +* Command line arguments, environment variables and filenames are decoded + to text using the UTF-8 encoding. +* :func:`os.fsdecode()` and :func:`os.fsencode()` use the UTF-8 encoding. +* :func:`open()`, :func:`io.open()`, and :func:`codecs.open()` use the UTF-8 + encoding by default. However, they still use the strict error handler by + default so that attempting to open a binary file in text mode is likely + to raise an exception rather than producing nonsense data. + +The :ref:`Python UTF-8 Mode ` is enabled if the LC_CTYPE locale is +``C`` or ``POSIX`` at Python startup (see the :c:func:`PyConfig_Read` +function). + +It can be enabled or disabled using the :option:`-X utf8 <-X>` command line +option and the :envvar:`PYTHONUTF8` environment variable. + +If the :envvar:`PYTHONUTF8` environment variable is not set at all, then the +interpreter defaults to using the current locale settings, *unless* the current +locale is identified as a legacy ASCII-based locale (as described for +:envvar:`PYTHONCOERCECLOCALE`), and locale coercion is either disabled or +fails. In such legacy locales, the interpreter will default to enabling UTF-8 +mode unless explicitly instructed not to do so. + +The Python UTF-8 Mode can only be enabled at the Python startup. Its value +can be read from :data:`sys.flags.utf8_mode `. + +See also the :ref:`UTF-8 mode on Windows ` +and the :term:`filesystem encoding and error handler`. .. _os-procinfo: @@ -165,9 +231,9 @@ process and user. .. function:: fsencode(filename) - Encode :term:`path-like ` *filename* to the filesystem - encoding with ``'surrogateescape'`` error handler, or ``'strict'`` on - Windows; return :class:`bytes` unchanged. + Encode :term:`path-like ` *filename* to the + :term:`filesystem encoding and error handler`; return :class:`bytes` + unchanged. :func:`fsdecode` is the reverse function. @@ -181,8 +247,8 @@ process and user. .. function:: fsdecode(filename) Decode the :term:`path-like ` *filename* from the - filesystem encoding with ``'surrogateescape'`` error handler, or ``'strict'`` - on Windows; return :class:`str` unchanged. + :term:`filesystem encoding and error handler`; return :class:`str` + unchanged. :func:`fsencode` is the reverse function. @@ -3246,7 +3312,7 @@ These functions are all available on Linux only. Removes the extended filesystem attribute *attribute* from *path*. *attribute* should be bytes or str (directly or indirectly through the :class:`PathLike` interface). If it is a string, it is encoded - with the filesystem encoding. + with the :term:`filesystem encoding and error handler`. This function can support :ref:`specifying a file descriptor ` and :ref:`not following symlinks `. @@ -3262,7 +3328,7 @@ These functions are all available on Linux only. Set the extended filesystem attribute *attribute* on *path* to *value*. *attribute* must be a bytes or str with no embedded NULs (directly or indirectly through the :class:`PathLike` interface). If it is a str, - it is encoded with the filesystem encoding. *flags* may be + it is encoded with the :term:`filesystem encoding and error handler`. *flags* may be :data:`XATTR_REPLACE` or :data:`XATTR_CREATE`. If :data:`XATTR_REPLACE` is given and the attribute does not exist, ``EEXISTS`` will be raised. If :data:`XATTR_CREATE` is given and the attribute already exists, the diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index f0acfcfe63988a..0f13adcf0e5b2f 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -627,21 +627,24 @@ always available. .. function:: getfilesystemencoding() - Return the name of the encoding used to convert between Unicode - filenames and bytes filenames. + Get the :term:`filesystem encoding `: + the encoding used with the :term:`filesystem error handler ` to convert between Unicode filenames and bytes + filenames. The filesystem error handler is returned from + :func:`getfilesystemencoding`. For best compatibility, str should be used for filenames in all cases, although representing filenames as bytes is also supported. Functions accepting or returning filenames should support either str or bytes and internally convert to the system's preferred representation. - This encoding is always ASCII-compatible. - :func:`os.fsencode` and :func:`os.fsdecode` should be used to ensure that the correct encoding and errors mode are used. - The filesystem encoding is initialized from - :c:member:`PyConfig.filesystem_encoding`. + The :term:`filesystem encoding and error handler` are configured at Python + startup by the :c:func:`PyConfig_Read` function: see + :c:member:`~PyConfig.filesystem_encoding` and + :c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. .. versionchanged:: 3.2 :func:`getfilesystemencoding` result cannot be ``None`` anymore. @@ -651,20 +654,25 @@ always available. and :func:`_enablelegacywindowsfsencoding` for more information. .. versionchanged:: 3.7 - Return 'utf-8' in the UTF-8 mode. + Return ``'utf-8'`` if the :ref:`Python UTF-8 Mode ` is + enabled. .. function:: getfilesystemencodeerrors() - Return the name of the error mode used to convert between Unicode filenames - and bytes filenames. The encoding name is returned from + Get the :term:`filesystem error handler `: the error handler used with the :term:`filesystem encoding + ` to convert between Unicode + filenames and bytes filenames. The filesystem encoding is returned from :func:`getfilesystemencoding`. :func:`os.fsencode` and :func:`os.fsdecode` should be used to ensure that the correct encoding and errors mode are used. - The filesystem error handler is initialized from - :c:member:`PyConfig.filesystem_errors`. + The :term:`filesystem encoding and error handler` are configured at Python + startup by the :c:func:`PyConfig_Read` function: see + :c:member:`~PyConfig.filesystem_encoding` and + :c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. .. versionadded:: 3.6 @@ -1457,8 +1465,9 @@ always available. .. function:: _enablelegacywindowsfsencoding() - Changes the default filesystem encoding and errors mode to 'mbcs' and - 'replace' respectively, for consistency with versions of Python prior to 3.6. + Changes the :term:`filesystem encoding and error handler` to 'mbcs' and + 'replace' respectively, for consistency with versions of Python prior to + 3.6. This is equivalent to defining the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable before launching Python. @@ -1488,9 +1497,8 @@ always available. returned by the :func:`open` function. Their parameters are chosen as follows: - * The character encoding is platform-dependent. Non-Windows - platforms use the locale encoding (see - :meth:`locale.getpreferredencoding()`). + * The encoding and error handling are is initialized from + :c:member:`PyConfig.stdio_encoding` and :c:member:`PyConfig.stdio_errors`. On Windows, UTF-8 is used for the console device. Non-character devices such as disk files and pipes use the system locale @@ -1498,7 +1506,7 @@ always available. devices such as NUL (i.e. where ``isatty()`` returns ``True``) use the value of the console input and output codepages at startup, respectively for stdin and stdout/stderr. This defaults to the - system locale encoding if the process is not initially attached + system :term:`locale encoding` if the process is not initially attached to a console. The special behaviour of the console can be overridden diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 603b0e105fb43e..04e0f3267dbe78 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -447,10 +447,9 @@ Miscellaneous options * ``-X dev``: enable :ref:`Python Development Mode `, introducing additional runtime checks that are too expensive to be enabled by default. - * ``-X utf8`` enables UTF-8 mode for operating system interfaces, overriding - the default locale-aware mode. ``-X utf8=0`` explicitly disables UTF-8 - mode (even when it would otherwise activate automatically). - See :envvar:`PYTHONUTF8` for more details. + * ``-X utf8`` enables the :ref:`Python UTF-8 Mode `. + ``-X utf8=0`` explicitly disables :ref:`Python UTF-8 Mode ` + (even when it would otherwise activate automatically). * ``-X pycache_prefix=PATH`` enables writing ``.pyc`` files to a parallel tree rooted at the given directory instead of to the code tree. See also :envvar:`PYTHONPYCACHEPREFIX`. @@ -810,9 +809,10 @@ conflict. .. envvar:: PYTHONLEGACYWINDOWSFSENCODING - If set to a non-empty string, the default filesystem encoding and errors mode - will revert to their pre-3.6 values of 'mbcs' and 'replace', respectively. - Otherwise, the new defaults 'utf-8' and 'surrogatepass' are used. + If set to a non-empty string, the default :term:`filesystem encoding and + error handler` mode will revert to their pre-3.6 values of 'mbcs' and + 'replace', respectively. Otherwise, the new defaults 'utf-8' and + 'surrogatepass' are used. This may also be enabled at runtime with :func:`sys._enablelegacywindowsfsencoding()`. @@ -898,54 +898,14 @@ conflict. .. envvar:: PYTHONUTF8 - If set to ``1``, enables the interpreter's UTF-8 mode, where ``UTF-8`` is - used as the text encoding for system interfaces, regardless of the - current locale setting. + If set to ``1``, enable the :ref:`Python UTF-8 Mode `. - This means that: - - * :func:`sys.getfilesystemencoding()` returns ``'UTF-8'`` (the locale - encoding is ignored). - * :func:`locale.getpreferredencoding()` returns ``'UTF-8'`` (the locale - encoding is ignored, and the function's ``do_setlocale`` parameter has no - effect). - * :data:`sys.stdin`, :data:`sys.stdout`, and :data:`sys.stderr` all use - UTF-8 as their text encoding, with the ``surrogateescape`` - :ref:`error handler ` being enabled for :data:`sys.stdin` - and :data:`sys.stdout` (:data:`sys.stderr` continues to use - ``backslashreplace`` as it does in the default locale-aware mode) - - As a consequence of the changes in those lower level APIs, other higher - level APIs also exhibit different default behaviours: - - * Command line arguments, environment variables and filenames are decoded - to text using the UTF-8 encoding. - * :func:`os.fsdecode()` and :func:`os.fsencode()` use the UTF-8 encoding. - * :func:`open()`, :func:`io.open()`, and :func:`codecs.open()` use the UTF-8 - encoding by default. However, they still use the strict error handler by - default so that attempting to open a binary file in text mode is likely - to raise an exception rather than producing nonsense data. - - Note that the standard stream settings in UTF-8 mode can be overridden by - :envvar:`PYTHONIOENCODING` (just as they can be in the default locale-aware - mode). - - If set to ``0``, the interpreter runs in its default locale-aware mode. + If set to ``0``, disable the :ref:`Python UTF-8 Mode `. Setting any other non-empty string causes an error during interpreter initialisation. - If this environment variable is not set at all, then the interpreter defaults - to using the current locale settings, *unless* the current locale is - identified as a legacy ASCII-based locale - (as described for :envvar:`PYTHONCOERCECLOCALE`), and locale coercion is - either disabled or fails. In such legacy locales, the interpreter will - default to enabling UTF-8 mode unless explicitly instructed not to do so. - - Also available as the :option:`-X` ``utf8`` option. - .. versionadded:: 3.7 - See :pep:`540` for more details. Debug-mode variables diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 275495bc6d1292..78c1e03f7462c9 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -614,21 +614,14 @@ Page). Python uses it for the default encoding of text files (e.g. This may cause issues because UTF-8 is widely used on the internet and most Unix systems, including WSL (Windows Subsystem for Linux). -You can use UTF-8 mode to change the default text encoding to UTF-8. -You can enable UTF-8 mode via the ``-X utf8`` command line option, or -the ``PYTHONUTF8=1`` environment variable. See :envvar:`PYTHONUTF8` for -enabling UTF-8 mode, and :ref:`setting-envvars` for how to modify -environment variables. - -When UTF-8 mode is enabled: - -* :func:`locale.getpreferredencoding` returns ``'UTF-8'`` instead of - the system encoding. This function is used for the default text - encoding in many places, including :func:`open`, :class:`Popen`, - :meth:`Path.read_text`, etc. -* :data:`sys.stdin`, :data:`sys.stdout`, and :data:`sys.stderr` - all use UTF-8 as their text encoding. -* You can still use the system encoding via the "mbcs" codec. +You can use the :ref:`Python UTF-8 Mode ` to change the default text +encoding to UTF-8. You can enable the :ref:`Python UTF-8 Mode ` via +the ``-X utf8`` command line option, or the ``PYTHONUTF8=1`` environment +variable. See :envvar:`PYTHONUTF8` for enabling UTF-8 mode, and +:ref:`setting-envvars` for how to modify environment variables. + +When the :ref:`Python UTF-8 Mode ` is enabled, you can still use the +system encoding (the ANSI Code Page) via the "mbcs" codec. Note that adding ``PYTHONUTF8=1`` to the default environment variables will affect all Python 3.7+ applications on your system. @@ -641,7 +634,8 @@ temporarily or use the ``-X utf8`` command line option. on Windows for: * Console I/O including standard I/O (see :pep:`528` for details). - * The filesystem encoding (see :pep:`529` for details). + * The :term:`filesystem encoding ` + (see :pep:`529` for details). .. _launcher: diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 25b1e1e33e325c..7590af35e2838c 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -232,7 +232,8 @@ PEP 540: Forced UTF-8 Runtime Mode ----------------------------------- The new :option:`-X` ``utf8`` command line option and :envvar:`PYTHONUTF8` -environment variable can be used to enable the CPython *UTF-8 mode*. +environment variable can be used to enable the :ref:`Python UTF-8 Mode +`. When in UTF-8 mode, CPython ignores the locale settings, and uses the UTF-8 encoding by default. The error handlers for :data:`sys.stdin` and diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index dd5ca6121cac2c..3a38f77073dc60 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -127,273 +127,84 @@ PyAPI_FUNC(void) PyPreConfig_InitIsolatedConfig(PyPreConfig *config); /* --- PyConfig ---------------------------------------------- */ +/* This structure is best documented in the Doc/c-api/init_config.rst file. */ typedef struct { int _config_init; /* _PyConfigInitEnum value */ - int isolated; /* Isolated mode? see PyPreConfig.isolated */ - int use_environment; /* Use environment variables? see PyPreConfig.use_environment */ - int dev_mode; /* Python Development Mode? See PyPreConfig.dev_mode */ - - /* Install signal handlers? Yes by default. */ + int isolated; + int use_environment; + int dev_mode; int install_signal_handlers; - - int use_hash_seed; /* PYTHONHASHSEED=x */ + int use_hash_seed; unsigned long hash_seed; - - /* Enable faulthandler? - Set to 1 by -X faulthandler and PYTHONFAULTHANDLER. -1 means unset. */ int faulthandler; - - /* Enable tracemalloc? - Set by -X tracemalloc=N and PYTHONTRACEMALLOC. -1 means unset */ int tracemalloc; - - int import_time; /* PYTHONPROFILEIMPORTTIME, -X importtime */ - int show_ref_count; /* -X showrefcount */ - int dump_refs; /* PYTHONDUMPREFS */ - int malloc_stats; /* PYTHONMALLOCSTATS */ - - /* Python filesystem encoding and error handler: - sys.getfilesystemencoding() and sys.getfilesystemencodeerrors(). - - The Doc/c-api/init_config.rst documentation explains how Python selects - the filesystem encoding and error handler. - - _PyUnicode_InitEncodings() updates the encoding name to the Python codec - name. For example, "ANSI_X3.4-1968" is replaced with "ascii". It also - sets Py_FileSystemDefaultEncoding to filesystem_encoding and - sets Py_FileSystemDefaultEncodeErrors to filesystem_errors. */ + int import_time; + int show_ref_count; + int dump_refs; + int malloc_stats; wchar_t *filesystem_encoding; wchar_t *filesystem_errors; - - wchar_t *pycache_prefix; /* PYTHONPYCACHEPREFIX, -X pycache_prefix=PATH */ - int parse_argv; /* Parse argv command line arguments? */ - - /* Command line arguments (sys.argv). - - Set parse_argv to 1 to parse argv as Python command line arguments - and then strip Python arguments from argv. - - If argv is empty, an empty string is added to ensure that sys.argv - always exists and is never empty. */ + wchar_t *pycache_prefix; + int parse_argv; PyWideStringList argv; - - /* Program name: - - - If Py_SetProgramName() was called, use its value. - - On macOS, use PYTHONEXECUTABLE environment variable if set. - - If WITH_NEXT_FRAMEWORK macro is defined, use __PYVENV_LAUNCHER__ - environment variable is set. - - Use argv[0] if available and non-empty. - - Use "python" on Windows, or "python3 on other platforms. */ wchar_t *program_name; - - PyWideStringList xoptions; /* Command line -X options */ - - /* Warnings options: lowest to highest priority. warnings.filters - is built in the reverse order (highest to lowest priority). */ + PyWideStringList xoptions; PyWideStringList warnoptions; - - /* If equal to zero, disable the import of the module site and the - site-dependent manipulations of sys.path that it entails. Also disable - these manipulations if site is explicitly imported later (call - site.main() if you want them to be triggered). - - Set to 0 by the -S command line option. If set to -1 (default), it is - set to !Py_NoSiteFlag. */ int site_import; - - /* Bytes warnings: - - * If equal to 1, issue a warning when comparing bytes or bytearray with - str or bytes with int. - * If equal or greater to 2, issue an error. - - Incremented by the -b command line option. If set to -1 (default), inherit - Py_BytesWarningFlag value. */ int bytes_warning; - - /* If greater than 0, enable inspect: when a script is passed as first - argument or the -c option is used, enter interactive mode after - executing the script or the command, even when sys.stdin does not appear - to be a terminal. - - Incremented by the -i command line option. Set to 1 if the PYTHONINSPECT - environment variable is non-empty. If set to -1 (default), inherit - Py_InspectFlag value. */ int inspect; - - /* If greater than 0: enable the interactive mode (REPL). - - Incremented by the -i command line option. If set to -1 (default), - inherit Py_InteractiveFlag value. */ int interactive; - - /* Optimization level. - - Incremented by the -O command line option. Set by the PYTHONOPTIMIZE - environment variable. If set to -1 (default), inherit Py_OptimizeFlag - value. */ int optimization_level; - - /* If greater than 0, enable the debug mode: turn on parser debugging - output (for expert only, depending on compilation options). - - Incremented by the -d command line option. Set by the PYTHONDEBUG - environment variable. If set to -1 (default), inherit Py_DebugFlag - value. */ int parser_debug; - - /* If equal to 0, Python won't try to write ``.pyc`` files on the - import of source modules. - - Set to 0 by the -B command line option and the PYTHONDONTWRITEBYTECODE - environment variable. If set to -1 (default), it is set to - !Py_DontWriteBytecodeFlag. */ int write_bytecode; - - /* If greater than 0, enable the verbose mode: print a message each time a - module is initialized, showing the place (filename or built-in module) - from which it is loaded. - - If greater or equal to 2, print a message for each file that is checked - for when searching for a module. Also provides information on module - cleanup at exit. - - Incremented by the -v option. Set by the PYTHONVERBOSE environment - variable. If set to -1 (default), inherit Py_VerboseFlag value. */ int verbose; - - /* If greater than 0, enable the quiet mode: Don't display the copyright - and version messages even in interactive mode. - - Incremented by the -q option. If set to -1 (default), inherit - Py_QuietFlag value. */ int quiet; - - /* If greater than 0, don't add the user site-packages directory to - sys.path. - - Set to 0 by the -s and -I command line options , and the PYTHONNOUSERSITE - environment variable. If set to -1 (default), it is set to - !Py_NoUserSiteDirectory. */ int user_site_directory; - - /* If non-zero, configure C standard steams (stdio, stdout, - stderr): - - - Set O_BINARY mode on Windows. - - If buffered_stdio is equal to zero, make streams unbuffered. - Otherwise, enable streams buffering if interactive is non-zero. */ int configure_c_stdio; - - /* If equal to 0, enable unbuffered mode: force the stdout and stderr - streams to be unbuffered. - - Set to 0 by the -u option. Set by the PYTHONUNBUFFERED environment - variable. - If set to -1 (default), it is set to !Py_UnbufferedStdioFlag. */ int buffered_stdio; - - /* Encoding of sys.stdin, sys.stdout and sys.stderr. - Value set from PYTHONIOENCODING environment variable and - Py_SetStandardStreamEncoding() function. - See also 'stdio_errors' attribute. */ wchar_t *stdio_encoding; - - /* Error handler of sys.stdin and sys.stdout. - Value set from PYTHONIOENCODING environment variable and - Py_SetStandardStreamEncoding() function. - See also 'stdio_encoding' attribute. */ wchar_t *stdio_errors; - #ifdef MS_WINDOWS - /* If greater than zero, use io.FileIO instead of WindowsConsoleIO for sys - standard streams. - - Set to 1 if the PYTHONLEGACYWINDOWSSTDIO environment variable is set to - a non-empty string. If set to -1 (default), inherit - Py_LegacyWindowsStdioFlag value. - - See PEP 528 for more details. */ int legacy_windows_stdio; #endif - - /* Value of the --check-hash-based-pycs command line option: - - - "default" means the 'check_source' flag in hash-based pycs - determines invalidation - - "always" causes the interpreter to hash the source file for - invalidation regardless of value of 'check_source' bit - - "never" causes the interpreter to always assume hash-based pycs are - valid - - The default value is "default". - - See PEP 552 "Deterministic pycs" for more details. */ wchar_t *check_hash_pycs_mode; + PyWideStringList orig_argv; /* --- Path configuration inputs ------------ */ - - /* If greater than 0, suppress _PyPathConfig_Calculate() warnings on Unix. - The parameter has no effect on Windows. - - If set to -1 (default), inherit !Py_FrozenFlag value. */ int pathconfig_warnings; - - wchar_t *pythonpath_env; /* PYTHONPATH environment variable */ - wchar_t *home; /* PYTHONHOME environment variable, - see also Py_SetPythonHome(). */ + wchar_t *pythonpath_env; + wchar_t *home; /* --- Path configuration outputs ----------- */ - - int module_search_paths_set; /* If non-zero, use module_search_paths */ - PyWideStringList module_search_paths; /* sys.path paths. Computed if - module_search_paths_set is equal - to zero. */ - - wchar_t *executable; /* sys.executable */ - wchar_t *base_executable; /* sys._base_executable */ - wchar_t *prefix; /* sys.prefix */ - wchar_t *base_prefix; /* sys.base_prefix */ - wchar_t *exec_prefix; /* sys.exec_prefix */ - wchar_t *base_exec_prefix; /* sys.base_exec_prefix */ - wchar_t *platlibdir; /* sys.platlibdir */ + int module_search_paths_set; + PyWideStringList module_search_paths; + wchar_t *executable; + wchar_t *base_executable; + wchar_t *prefix; + wchar_t *base_prefix; + wchar_t *exec_prefix; + wchar_t *base_exec_prefix; + wchar_t *platlibdir; /* --- Parameter only used by Py_Main() ---------- */ - - /* Skip the first line of the source ('run_filename' parameter), allowing use of non-Unix forms of - "#!cmd". This is intended for a DOS specific hack only. - - Set by the -x command line option. */ int skip_source_first_line; - - wchar_t *run_command; /* -c command line argument */ - wchar_t *run_module; /* -m command line argument */ - wchar_t *run_filename; /* Trailing command line argument without -c or -m */ + wchar_t *run_command; + wchar_t *run_module; + wchar_t *run_filename; /* --- Private fields ---------------------------- */ - /* Install importlib? If set to 0, importlib is not initialized at all. - Needed by freeze_importlib. */ + // Install importlib? If equals to 0, importlib is not initialized at all. + // Needed by freeze_importlib. int _install_importlib; - /* If equal to 0, stop Python initialization before the "main" phase */ + // If equal to 0, stop Python initialization before the "main" phase. int _init_main; - /* If non-zero, disallow threads, subprocesses, and fork. - Default: 0. */ + // If non-zero, disallow threads, subprocesses, and fork. + // Default: 0. int _isolated_interpreter; - - /* The list of the original command line arguments passed to the Python - executable. - - If 'orig_argv' list is empty and 'argv' is not a list only containing an - empty string, PyConfig_Read() copies 'argv' into 'orig_argv' before - modifying 'argv' (if 'parse_argv is non-zero). - - _PyConfig_Write() initializes Py_GetArgcArgv() to this list. */ - PyWideStringList orig_argv; } PyConfig; PyAPI_FUNC(void) PyConfig_InitPythonConfig(PyConfig *config); diff --git a/Python/initconfig.c b/Python/initconfig.c index d0ff888c7f778e..7bb28ed01f164a 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -543,6 +543,7 @@ _Py_SetArgcArgv(Py_ssize_t argc, wchar_t * const *argv) } +// _PyConfig_Write() calls _Py_SetArgcArgv() with PyConfig.orig_argv. void Py_GetArgcArgv(int *argc, wchar_t ***argv) { diff --git a/Python/preconfig.c b/Python/preconfig.c index 149afcd99ab32f..b8b0c3a0775ca8 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -19,11 +19,6 @@ preconfig_copy(PyPreConfig *config, const PyPreConfig *config2); /* --- File system encoding/errors -------------------------------- */ -/* The filesystem encoding is chosen by config_init_fs_encoding(), - see also initfsencoding(). - - Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors - are encoded to UTF-8. */ const char *Py_FileSystemDefaultEncoding = NULL; int Py_HasFileSystemDefaultEncoding = 0; const char *Py_FileSystemDefaultEncodeErrors = NULL; @@ -44,7 +39,10 @@ _Py_ClearFileSystemEncoding(void) /* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors - global configuration variables. */ + global configuration variables to PyConfig.filesystem_encoding and + PyConfig.filesystem_errors (encoded to UTF-8). + + Function called by _PyUnicode_InitEncodings(). */ int _Py_SetFileSystemEncoding(const char *encoding, const char *errors) { From cfa929e2eab1839819f59924112688fc8c796e89 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Mon, 2 Nov 2020 11:48:56 -0500 Subject: [PATCH 0447/1261] Revert "bpo-37193: remove thread objects which finished process its request (GH-13893)" (GH-23107) This reverts commit c41559021213cfc9dc62a83fc63306b3bdc3e64b. --- Lib/socketserver.py | 73 ++++--------------- Lib/test/test_socketserver.py | 24 ------ .../2020-06-12-21-23-20.bpo-37193.wJximU.rst | 2 - 3 files changed, 13 insertions(+), 86 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2020-06-12-21-23-20.bpo-37193.wJximU.rst diff --git a/Lib/socketserver.py b/Lib/socketserver.py index 6859b69682e972..57c1ae6e9e8be1 100644 --- a/Lib/socketserver.py +++ b/Lib/socketserver.py @@ -128,7 +128,6 @@ class will essentially render the service "deaf" while one request is import os import sys import threading -import contextlib from io import BufferedIOBase from time import monotonic as time @@ -629,55 +628,6 @@ def server_close(self): self.collect_children(blocking=self.block_on_close) -class _Threads(list): - """ - Joinable list of all non-daemon threads. - """ - def __init__(self): - self._lock = threading.Lock() - - def append(self, thread): - if thread.daemon: - return - with self._lock: - super().append(thread) - - def remove(self, thread): - with self._lock: - # should not happen, but safe to ignore - with contextlib.suppress(ValueError): - super().remove(thread) - - def remove_current(self): - """Remove a current non-daemon thread.""" - thread = threading.current_thread() - if not thread.daemon: - self.remove(thread) - - def pop_all(self): - with self._lock: - self[:], result = [], self[:] - return result - - def join(self): - for thread in self.pop_all(): - thread.join() - - -class _NoThreads: - """ - Degenerate version of _Threads. - """ - def append(self, thread): - pass - - def join(self): - pass - - def remove_current(self): - pass - - class ThreadingMixIn: """Mix-in class to handle each request in a new thread.""" @@ -686,9 +636,9 @@ class ThreadingMixIn: daemon_threads = False # If true, server_close() waits until all non-daemonic threads terminate. block_on_close = True - # Threads object + # For non-daemonic threads, list of threading.Threading objects # used by server_close() to wait for all threads completion. - _threads = _NoThreads() + _threads = None def process_request_thread(self, request, client_address): """Same as in BaseServer but as a thread. @@ -701,24 +651,27 @@ def process_request_thread(self, request, client_address): except Exception: self.handle_error(request, client_address) finally: - try: - self.shutdown_request(request) - finally: - self._threads.remove_current() + self.shutdown_request(request) def process_request(self, request, client_address): """Start a new thread to process the request.""" - if self.block_on_close: - vars(self).setdefault('_threads', _Threads()) t = threading.Thread(target = self.process_request_thread, args = (request, client_address)) t.daemon = self.daemon_threads - self._threads.append(t) + if not t.daemon and self.block_on_close: + if self._threads is None: + self._threads = [] + self._threads.append(t) t.start() def server_close(self): super().server_close() - self._threads.join() + if self.block_on_close: + threads = self._threads + self._threads = None + if threads: + for thread in threads: + thread.join() if hasattr(os, "fork"): diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py index 1944795f058946..7cdd115a951539 100644 --- a/Lib/test/test_socketserver.py +++ b/Lib/test/test_socketserver.py @@ -277,13 +277,6 @@ class MyHandler(socketserver.StreamRequestHandler): t.join() s.server_close() - def test_close_immediately(self): - class MyServer(socketserver.ThreadingMixIn, socketserver.TCPServer): - pass - - server = MyServer((HOST, 0), lambda: None) - server.server_close() - def test_tcpserver_bind_leak(self): # Issue #22435: the server socket wouldn't be closed if bind()/listen() # failed. @@ -498,23 +491,6 @@ def shutdown_request(self, request): self.assertEqual(server.shutdown_called, 1) server.server_close() - def test_threads_reaped(self): - """ - In #37193, users reported a memory leak - due to the saving of every request thread. Ensure that the - threads are cleaned up after the requests complete. - """ - class MyServer(socketserver.ThreadingMixIn, socketserver.TCPServer): - pass - - server = MyServer((HOST, 0), socketserver.StreamRequestHandler) - for n in range(10): - with socket.create_connection(server.server_address): - server.handle_request() - [thread.join() for thread in server._threads] - self.assertEqual(len(server._threads), 0) - server.server_close() - if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-06-12-21-23-20.bpo-37193.wJximU.rst b/Misc/NEWS.d/next/Library/2020-06-12-21-23-20.bpo-37193.wJximU.rst deleted file mode 100644 index fbf56d3194cd22..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-12-21-23-20.bpo-37193.wJximU.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed memory leak in ``socketserver.ThreadingMixIn`` introduced in Python -3.7. From a52307034e9539d14254dfaeb9bdfcc3a4b9ae81 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Mon, 2 Nov 2020 19:25:29 +0000 Subject: [PATCH 0448/1261] =?UTF-8?q?bpo-41943:=20Fix=20bug=20where=20asse?= =?UTF-8?q?rtLogs=20doesn't=20correctly=20filter=20messages=E2=80=A6=20(GH?= =?UTF-8?q?-22565)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … by level @vsajip , @pitrou Automerge-Triggered-By: GH:vsajip --- Lib/unittest/_log.py | 1 + Lib/unittest/test/test_case.py | 12 ++++++++++++ .../Library/2020-10-07-18-36-03.bpo-41943.Pt55fT.rst | 1 + 3 files changed, 14 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-10-07-18-36-03.bpo-41943.Pt55fT.rst diff --git a/Lib/unittest/_log.py b/Lib/unittest/_log.py index 961c448a7fb356..94868e5bb95eb3 100644 --- a/Lib/unittest/_log.py +++ b/Lib/unittest/_log.py @@ -47,6 +47,7 @@ def __enter__(self): logger = self.logger = logging.getLogger(self.logger_name) formatter = logging.Formatter(self.LOGGING_FORMAT) handler = _CapturingHandler() + handler.setLevel(self.level) handler.setFormatter(formatter) self.watcher = handler.watcher self.old_handlers = logger.handlers[:] diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py index 0e416967a30861..b8aca92a8ebe9f 100644 --- a/Lib/unittest/test/test_case.py +++ b/Lib/unittest/test/test_case.py @@ -1673,6 +1673,18 @@ def testAssertLogsFailureLevelTooHigh(self): with self.assertLogs(level='WARNING'): log_foo.info("1") + def testAssertLogsFailureLevelTooHigh_FilterInRootLogger(self): + # Failure due to level too high - message propagated to root + with self.assertNoStderr(): + oldLevel = log_foo.level + log_foo.setLevel(logging.INFO) + try: + with self.assertRaises(self.failureException): + with self.assertLogs(level='WARNING'): + log_foo.info("1") + finally: + log_foo.setLevel(oldLevel) + def testAssertLogsFailureMismatchingLogger(self): # Failure due to mismatching logger (and the logged message is # passed through) diff --git a/Misc/NEWS.d/next/Library/2020-10-07-18-36-03.bpo-41943.Pt55fT.rst b/Misc/NEWS.d/next/Library/2020-10-07-18-36-03.bpo-41943.Pt55fT.rst new file mode 100644 index 00000000000000..3a7874d25aef06 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-07-18-36-03.bpo-41943.Pt55fT.rst @@ -0,0 +1 @@ +Fix bug where TestCase.assertLogs doesn't correctly filter messages by level. \ No newline at end of file From 96798e70273ee3b918763ba0a1792170092b5d06 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 2 Nov 2020 23:01:40 +0200 Subject: [PATCH 0449/1261] bpo-42103: Improve validation of Plist files. (GH-22882) * Prevent some possible DoS attacks via providing invalid Plist files with extremely large number of objects or collection sizes. * Raise InvalidFileException for too large bytes and string size instead of returning garbage. * Raise InvalidFileException instead of ValueError for specific invalid datetime (NaN). * Raise InvalidFileException instead of TypeError for non-hashable dict keys. * Add more tests for invalid Plist files. --- Lib/plistlib.py | 26 +- Lib/test/test_plistlib.py | 389 +++++++++++++++--- .../2020-10-23-19-20-14.bpo-42103.C5obK2.rst | 3 + .../2020-10-23-19-19-30.bpo-42103.cILT66.rst | 2 + 4 files changed, 363 insertions(+), 57 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst create mode 100644 Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst diff --git a/Lib/plistlib.py b/Lib/plistlib.py index a7403510a32168..83b214e9dc49bf 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -477,7 +477,7 @@ def parse(self, fp): return self._read_object(top_object) except (OSError, IndexError, struct.error, OverflowError, - UnicodeDecodeError): + ValueError): raise InvalidFileException() def _get_size(self, tokenL): @@ -493,7 +493,7 @@ def _get_size(self, tokenL): def _read_ints(self, n, size): data = self._fp.read(size * n) if size in _BINARY_FORMAT: - return struct.unpack('>' + _BINARY_FORMAT[size] * n, data) + return struct.unpack(f'>{n}{_BINARY_FORMAT[size]}', data) else: if not size or len(data) != size * n: raise InvalidFileException() @@ -553,14 +553,22 @@ def _read_object(self, ref): elif tokenH == 0x40: # data s = self._get_size(tokenL) result = self._fp.read(s) + if len(result) != s: + raise InvalidFileException() elif tokenH == 0x50: # ascii string s = self._get_size(tokenL) - result = self._fp.read(s).decode('ascii') + data = self._fp.read(s) + if len(data) != s: + raise InvalidFileException() + result = data.decode('ascii') elif tokenH == 0x60: # unicode string - s = self._get_size(tokenL) - result = self._fp.read(s * 2).decode('utf-16be') + s = self._get_size(tokenL) * 2 + data = self._fp.read(s) + if len(data) != s: + raise InvalidFileException() + result = data.decode('utf-16be') elif tokenH == 0x80: # UID # used by Key-Archiver plist files @@ -585,9 +593,11 @@ def _read_object(self, ref): obj_refs = self._read_refs(s) result = self._dict_type() self._objects[ref] = result - for k, o in zip(key_refs, obj_refs): - result[self._read_object(k)] = self._read_object(o) - + try: + for k, o in zip(key_refs, obj_refs): + result[self._read_object(k)] = self._read_object(o) + except TypeError: + raise InvalidFileException() else: raise InvalidFileException() diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py index c9dce0047b79c4..ef96c6ceda21a2 100644 --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -2,6 +2,7 @@ import copy import operator import pickle +import struct import unittest import plistlib import os @@ -119,6 +120,285 @@ ''' +INVALID_BINARY_PLISTS = [ + ('too short data', + b'' + ), + ('too large offset_table_offset and offset_size = 1', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x2a' + ), + ('too large offset_table_offset and nonstandard offset_size', + b'\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x03\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x2c' + ), + ('integer overflow in offset_table_offset', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\xff\xff\xff\xff\xff\xff\xff\xff' + ), + ('too large top_object', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('integer overflow in top_object', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\xff\xff\xff\xff\xff\xff\xff\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('too large num_objects and offset_size = 1', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('too large num_objects and nonstandard offset_size', + b'\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x03\x01' + b'\x00\x00\x00\x00\x00\x00\x00\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('extremally large num_objects (32 bit)', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x7f\xff\xff\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('extremally large num_objects (64 bit)', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\xff\xff\xff\xff\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('integer overflow in num_objects', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\xff\xff\xff\xff\xff\xff\xff\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('offset_size = 0', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('ref_size = 0', + b'\xa1\x01\x00\x08\x0a' + b'\x00\x00\x00\x00\x00\x00\x01\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0b' + ), + ('too large offset', + b'\x00\x2a' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('integer overflow in offset', + b'\x00\xff\xff\xff\xff\xff\xff\xff\xff' + b'\x00\x00\x00\x00\x00\x00\x08\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('too large array size', + b'\xaf\x00\x01\xff\x00\x08\x0c' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0d' + ), + ('extremally large array size (32-bit)', + b'\xaf\x02\x7f\xff\xff\xff\x01\x00\x08\x0f' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x10' + ), + ('extremally large array size (64-bit)', + b'\xaf\x03\x00\x00\x00\xff\xff\xff\xff\xff\x01\x00\x08\x13' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x14' + ), + ('integer overflow in array size', + b'\xaf\x03\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x08\x13' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x14' + ), + ('too large reference index', + b'\xa1\x02\x00\x08\x0a' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0b' + ), + ('integer overflow in reference index', + b'\xa1\xff\xff\xff\xff\xff\xff\xff\xff\x00\x08\x11' + b'\x00\x00\x00\x00\x00\x00\x01\x08' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x12' + ), + ('too large bytes size', + b'\x4f\x00\x23\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0c' + ), + ('extremally large bytes size (32-bit)', + b'\x4f\x02\x7f\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0f' + ), + ('extremally large bytes size (64-bit)', + b'\x4f\x03\x00\x00\x00\xff\xff\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x13' + ), + ('integer overflow in bytes size', + b'\x4f\x03\xff\xff\xff\xff\xff\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x13' + ), + ('too large ASCII size', + b'\x5f\x00\x23\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0c' + ), + ('extremally large ASCII size (32-bit)', + b'\x5f\x02\x7f\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0f' + ), + ('extremally large ASCII size (64-bit)', + b'\x5f\x03\x00\x00\x00\xff\xff\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x13' + ), + ('integer overflow in ASCII size', + b'\x5f\x03\xff\xff\xff\xff\xff\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x13' + ), + ('invalid ASCII', + b'\x51\xff\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0a' + ), + ('too large UTF-16 size', + b'\x6f\x00\x13\x20\xac\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0e' + ), + ('extremally large UTF-16 size (32-bit)', + b'\x6f\x02\x4f\xff\xff\xff\x20\xac\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x11' + ), + ('extremally large UTF-16 size (64-bit)', + b'\x6f\x03\x00\x00\x00\xff\xff\xff\xff\xff\x20\xac\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x15' + ), + ('integer overflow in UTF-16 size', + b'\x6f\x03\xff\xff\xff\xff\xff\xff\xff\xff\x20\xac\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x15' + ), + ('invalid UTF-16', + b'\x61\xd8\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0b' + ), + ('non-hashable key', + b'\xd1\x01\x01\xa0\x08\x0b' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0c' + ), + ('too large datetime (datetime overflow)', + b'\x33\x42\x50\x00\x00\x00\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x11' + ), + ('too large datetime (timedelta overflow)', + b'\x33\x42\xe0\x00\x00\x00\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x11' + ), + ('invalid datetime (Infinity)', + b'\x33\x7f\xf0\x00\x00\x00\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x11' + ), + ('invalid datetime (NaN)', + b'\x33\x7f\xf8\x00\x00\x00\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x11' + ), +] + class TestPlistlib(unittest.TestCase): @@ -558,6 +838,21 @@ def test_xml_plist_with_entity_decl(self): class TestBinaryPlistlib(unittest.TestCase): + @staticmethod + def decode(*objects, offset_size=1, ref_size=1): + data = [b'bplist00'] + offset = 8 + offsets = [] + for x in objects: + offsets.append(offset.to_bytes(offset_size, 'big')) + data.append(x) + offset += len(x) + tail = struct.pack('>6xBBQQQ', offset_size, ref_size, + len(objects), 0, offset) + data.extend(offsets) + data.append(tail) + return plistlib.loads(b''.join(data), fmt=plistlib.FMT_BINARY) + def test_nonstandard_refs_size(self): # Issue #21538: Refs and offsets are 24-bit integers data = (b'bplist00' @@ -572,7 +867,7 @@ def test_nonstandard_refs_size(self): def test_dump_duplicates(self): # Test effectiveness of saving duplicated objects - for x in (None, False, True, 12345, 123.45, 'abcde', b'abcde', + for x in (None, False, True, 12345, 123.45, 'abcde', 'абвгд', b'abcde', datetime.datetime(2004, 10, 26, 10, 33, 33), bytearray(b'abcde'), [12, 345], (12, 345), {'12': 345}): with self.subTest(x=x): @@ -609,6 +904,20 @@ def test_cycles(self): b = plistlib.loads(plistlib.dumps(a, fmt=plistlib.FMT_BINARY)) self.assertIs(b['x'], b) + def test_deep_nesting(self): + for N in [300, 100000]: + chunks = [b'\xa1' + (i + 1).to_bytes(4, 'big') for i in range(N)] + try: + result = self.decode(*chunks, b'\x54seed', offset_size=4, ref_size=4) + except RecursionError: + pass + else: + for i in range(N): + self.assertIsInstance(result, list) + self.assertEqual(len(result), 1) + result = result[0] + self.assertEqual(result, 'seed') + def test_large_timestamp(self): # Issue #26709: 32-bit timestamp out of range for ts in -2**31-1, 2**31: @@ -618,55 +927,37 @@ def test_large_timestamp(self): data = plistlib.dumps(d, fmt=plistlib.FMT_BINARY) self.assertEqual(plistlib.loads(data), d) + def test_load_singletons(self): + self.assertIs(self.decode(b'\x00'), None) + self.assertIs(self.decode(b'\x08'), False) + self.assertIs(self.decode(b'\x09'), True) + self.assertEqual(self.decode(b'\x0f'), b'') + + def test_load_int(self): + self.assertEqual(self.decode(b'\x10\x00'), 0) + self.assertEqual(self.decode(b'\x10\xfe'), 0xfe) + self.assertEqual(self.decode(b'\x11\xfe\xdc'), 0xfedc) + self.assertEqual(self.decode(b'\x12\xfe\xdc\xba\x98'), 0xfedcba98) + self.assertEqual(self.decode(b'\x13\x01\x23\x45\x67\x89\xab\xcd\xef'), + 0x0123456789abcdef) + self.assertEqual(self.decode(b'\x13\xfe\xdc\xba\x98\x76\x54\x32\x10'), + -0x123456789abcdf0) + + def test_unsupported(self): + unsupported = [*range(1, 8), *range(10, 15), + 0x20, 0x21, *range(0x24, 0x33), *range(0x34, 0x40)] + for i in [0x70, 0x90, 0xb0, 0xc0, 0xe0, 0xf0]: + unsupported.extend(i + j for j in range(16)) + for token in unsupported: + with self.subTest(f'token {token:02x}'): + with self.assertRaises(plistlib.InvalidFileException): + self.decode(bytes([token]) + b'\x00'*16) + def test_invalid_binary(self): - for data in [ - # too short data - b'', - # too large offset_table_offset and nonstandard offset_size - b'\x00\x08' - b'\x00\x00\x00\x00\x00\x00\x03\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x2a', - # integer overflow in offset_table_offset - b'\x00\x08' - b'\x00\x00\x00\x00\x00\x00\x01\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\xff\xff\xff\xff\xff\xff\xff\xff', - # offset_size = 0 - b'\x00\x08' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x09', - # ref_size = 0 - b'\xa1\x01\x00\x08\x0a' - b'\x00\x00\x00\x00\x00\x00\x01\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x02' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x0b', - # integer overflow in offset - b'\x00\xff\xff\xff\xff\xff\xff\xff\xff' - b'\x00\x00\x00\x00\x00\x00\x08\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x09', - # invalid ASCII - b'\x51\xff\x08' - b'\x00\x00\x00\x00\x00\x00\x01\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x0a', - # invalid UTF-16 - b'\x61\xd8\x00\x08' - b'\x00\x00\x00\x00\x00\x00\x01\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x0b', - ]: - with self.assertRaises(plistlib.InvalidFileException): - plistlib.loads(b'bplist00' + data, fmt=plistlib.FMT_BINARY) + for name, data in INVALID_BINARY_PLISTS: + with self.subTest(name): + with self.assertRaises(plistlib.InvalidFileException): + plistlib.loads(b'bplist00' + data, fmt=plistlib.FMT_BINARY) class TestKeyedArchive(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst b/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst new file mode 100644 index 00000000000000..4eb694c16a0633 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst @@ -0,0 +1,3 @@ +:exc:`~plistlib.InvalidFileException` and :exc:`RecursionError` are now +the only errors caused by loading malformed binary Plist file (previously +ValueError and TypeError could be raised in some specific cases). diff --git a/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst b/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst new file mode 100644 index 00000000000000..15d7b6549ed465 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst @@ -0,0 +1,2 @@ +Prevented potential DoS attack via CPU and RAM exhaustion when processing +malformed Apple Property List files in binary format. From 755e3bf2583b0365b526a4941cffb141c23b4a8b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 2 Nov 2020 22:03:28 +0100 Subject: [PATCH 0450/1261] bpo-41796: Make _ast module state per interpreter (GH-23024) The ast module internal state is now per interpreter. * Rename "astmodulestate" to "struct ast_state" * Add pycore_ast.h internal header: the ast_state structure is now declared in pycore_ast.h. * Add PyInterpreterState.ast (struct ast_state) * Remove get_ast_state() * Rename get_global_ast_state() to get_ast_state() * PyAST_obj2mod() now handles get_ast_state() failures --- Include/Python-ast.h | 2 +- Include/internal/pycore_ast.h | 234 +++++++++++++++++ Include/internal/pycore_interp.h | 11 +- Makefile.pre.in | 2 + .../2020-10-29-12-49-08.bpo-41796.tkGdHq.rst | 2 + PCbuild/regen.vcxproj | 12 +- Parser/asdl_c.py | 243 +++++++++++------ Python/Python-ast.c | 245 ++++++++++-------- 8 files changed, 549 insertions(+), 202 deletions(-) create mode 100644 Include/internal/pycore_ast.h create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-29-12-49-08.bpo-41796.tkGdHq.rst diff --git a/Include/Python-ast.h b/Include/Python-ast.h index e14bab566fb5a2..fc9f65c97a2296 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -1,4 +1,4 @@ -/* File automatically generated by Parser/asdl_c.py. */ +// File automatically generated by Parser/asdl_c.py. #ifndef Py_PYTHON_AST_H #define Py_PYTHON_AST_H diff --git a/Include/internal/pycore_ast.h b/Include/internal/pycore_ast.h new file mode 100644 index 00000000000000..058fbc0fcdcbb3 --- /dev/null +++ b/Include/internal/pycore_ast.h @@ -0,0 +1,234 @@ +// File automatically generated by Parser/asdl_c.py. + +#ifndef Py_INTERNAL_AST_H +#define Py_INTERNAL_AST_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +struct ast_state { + int initialized; + PyObject *AST_type; + PyObject *Add_singleton; + PyObject *Add_type; + PyObject *And_singleton; + PyObject *And_type; + PyObject *AnnAssign_type; + PyObject *Assert_type; + PyObject *Assign_type; + PyObject *AsyncFor_type; + PyObject *AsyncFunctionDef_type; + PyObject *AsyncWith_type; + PyObject *Attribute_type; + PyObject *AugAssign_type; + PyObject *Await_type; + PyObject *BinOp_type; + PyObject *BitAnd_singleton; + PyObject *BitAnd_type; + PyObject *BitOr_singleton; + PyObject *BitOr_type; + PyObject *BitXor_singleton; + PyObject *BitXor_type; + PyObject *BoolOp_type; + PyObject *Break_type; + PyObject *Call_type; + PyObject *ClassDef_type; + PyObject *Compare_type; + PyObject *Constant_type; + PyObject *Continue_type; + PyObject *Del_singleton; + PyObject *Del_type; + PyObject *Delete_type; + PyObject *DictComp_type; + PyObject *Dict_type; + PyObject *Div_singleton; + PyObject *Div_type; + PyObject *Eq_singleton; + PyObject *Eq_type; + PyObject *ExceptHandler_type; + PyObject *Expr_type; + PyObject *Expression_type; + PyObject *FloorDiv_singleton; + PyObject *FloorDiv_type; + PyObject *For_type; + PyObject *FormattedValue_type; + PyObject *FunctionDef_type; + PyObject *FunctionType_type; + PyObject *GeneratorExp_type; + PyObject *Global_type; + PyObject *GtE_singleton; + PyObject *GtE_type; + PyObject *Gt_singleton; + PyObject *Gt_type; + PyObject *IfExp_type; + PyObject *If_type; + PyObject *ImportFrom_type; + PyObject *Import_type; + PyObject *In_singleton; + PyObject *In_type; + PyObject *Interactive_type; + PyObject *Invert_singleton; + PyObject *Invert_type; + PyObject *IsNot_singleton; + PyObject *IsNot_type; + PyObject *Is_singleton; + PyObject *Is_type; + PyObject *JoinedStr_type; + PyObject *LShift_singleton; + PyObject *LShift_type; + PyObject *Lambda_type; + PyObject *ListComp_type; + PyObject *List_type; + PyObject *Load_singleton; + PyObject *Load_type; + PyObject *LtE_singleton; + PyObject *LtE_type; + PyObject *Lt_singleton; + PyObject *Lt_type; + PyObject *MatMult_singleton; + PyObject *MatMult_type; + PyObject *Mod_singleton; + PyObject *Mod_type; + PyObject *Module_type; + PyObject *Mult_singleton; + PyObject *Mult_type; + PyObject *Name_type; + PyObject *NamedExpr_type; + PyObject *Nonlocal_type; + PyObject *NotEq_singleton; + PyObject *NotEq_type; + PyObject *NotIn_singleton; + PyObject *NotIn_type; + PyObject *Not_singleton; + PyObject *Not_type; + PyObject *Or_singleton; + PyObject *Or_type; + PyObject *Pass_type; + PyObject *Pow_singleton; + PyObject *Pow_type; + PyObject *RShift_singleton; + PyObject *RShift_type; + PyObject *Raise_type; + PyObject *Return_type; + PyObject *SetComp_type; + PyObject *Set_type; + PyObject *Slice_type; + PyObject *Starred_type; + PyObject *Store_singleton; + PyObject *Store_type; + PyObject *Sub_singleton; + PyObject *Sub_type; + PyObject *Subscript_type; + PyObject *Try_type; + PyObject *Tuple_type; + PyObject *TypeIgnore_type; + PyObject *UAdd_singleton; + PyObject *UAdd_type; + PyObject *USub_singleton; + PyObject *USub_type; + PyObject *UnaryOp_type; + PyObject *While_type; + PyObject *With_type; + PyObject *YieldFrom_type; + PyObject *Yield_type; + PyObject *__dict__; + PyObject *__doc__; + PyObject *__module__; + PyObject *_attributes; + PyObject *_fields; + PyObject *alias_type; + PyObject *annotation; + PyObject *arg; + PyObject *arg_type; + PyObject *args; + PyObject *argtypes; + PyObject *arguments_type; + PyObject *asname; + PyObject *ast; + PyObject *attr; + PyObject *bases; + PyObject *body; + PyObject *boolop_type; + PyObject *cause; + PyObject *cmpop_type; + PyObject *col_offset; + PyObject *comparators; + PyObject *comprehension_type; + PyObject *context_expr; + PyObject *conversion; + PyObject *ctx; + PyObject *decorator_list; + PyObject *defaults; + PyObject *elt; + PyObject *elts; + PyObject *end_col_offset; + PyObject *end_lineno; + PyObject *exc; + PyObject *excepthandler_type; + PyObject *expr_context_type; + PyObject *expr_type; + PyObject *finalbody; + PyObject *format_spec; + PyObject *func; + PyObject *generators; + PyObject *handlers; + PyObject *id; + PyObject *ifs; + PyObject *is_async; + PyObject *items; + PyObject *iter; + PyObject *key; + PyObject *keys; + PyObject *keyword_type; + PyObject *keywords; + PyObject *kind; + PyObject *kw_defaults; + PyObject *kwarg; + PyObject *kwonlyargs; + PyObject *left; + PyObject *level; + PyObject *lineno; + PyObject *lower; + PyObject *mod_type; + PyObject *module; + PyObject *msg; + PyObject *name; + PyObject *names; + PyObject *op; + PyObject *operand; + PyObject *operator_type; + PyObject *ops; + PyObject *optional_vars; + PyObject *orelse; + PyObject *posonlyargs; + PyObject *returns; + PyObject *right; + PyObject *simple; + PyObject *slice; + PyObject *step; + PyObject *stmt_type; + PyObject *tag; + PyObject *target; + PyObject *targets; + PyObject *test; + PyObject *type; + PyObject *type_comment; + PyObject *type_ignore_type; + PyObject *type_ignores; + PyObject *unaryop_type; + PyObject *upper; + PyObject *value; + PyObject *values; + PyObject *vararg; + PyObject *withitem_type; +}; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_AST_H */ + diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 69d2108da43226..9923b6b03da7e1 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -8,10 +8,11 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_atomic.h" /* _Py_atomic_address */ -#include "pycore_gil.h" /* struct _gil_runtime_state */ -#include "pycore_gc.h" /* struct _gc_runtime_state */ -#include "pycore_warnings.h" /* struct _warnings_runtime_state */ +#include "pycore_atomic.h" // _Py_atomic_address +#include "pycore_ast.h" // struct ast_state +#include "pycore_gil.h" // struct _gil_runtime_state +#include "pycore_gc.h" // struct _gc_runtime_state +#include "pycore_warnings.h" // struct _warnings_runtime_state struct _pending_calls { PyThread_type_lock lock; @@ -258,6 +259,8 @@ struct _is { struct _Py_async_gen_state async_gen; struct _Py_context_state context; struct _Py_exc_state exc_state; + + struct ast_state ast; }; /* Used by _PyImport_Cleanup() */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 5b6c0b9b62d334..a8912cd418470a 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -840,9 +840,11 @@ regen-ast: $(PYTHON_FOR_REGEN) $(srcdir)/Parser/asdl_c.py \ $(srcdir)/Parser/Python.asdl \ -H $(srcdir)/Include/Python-ast.h.new \ + -I $(srcdir)/Include/internal/pycore_ast.h.new \ -C $(srcdir)/Python/Python-ast.c.new $(UPDATE_FILE) $(srcdir)/Include/Python-ast.h $(srcdir)/Include/Python-ast.h.new + $(UPDATE_FILE) $(srcdir)/Include/internal/pycore_ast.h $(srcdir)/Include/internal/pycore_ast.h.new $(UPDATE_FILE) $(srcdir)/Python/Python-ast.c $(srcdir)/Python/Python-ast.c.new .PHONY: regen-opcode diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-29-12-49-08.bpo-41796.tkGdHq.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-29-12-49-08.bpo-41796.tkGdHq.rst new file mode 100644 index 00000000000000..b3ac08edd84fcd --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-29-12-49-08.bpo-41796.tkGdHq.rst @@ -0,0 +1,2 @@ +The :mod:`ast` module internal state is now per interpreter. Patch by Victor +Stinner. diff --git a/PCbuild/regen.vcxproj b/PCbuild/regen.vcxproj index 90d6dc68d5404f..936f5fd24646a5 100644 --- a/PCbuild/regen.vcxproj +++ b/PCbuild/regen.vcxproj @@ -137,6 +137,8 @@ + + @@ -161,15 +163,18 @@ - - + + - + + + + @@ -204,6 +209,7 @@ + diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 481261cd85359a..9a833e841de41e 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -3,6 +3,7 @@ import os import sys +import textwrap from argparse import ArgumentParser from pathlib import Path @@ -11,7 +12,7 @@ TABSIZE = 4 MAX_COL = 80 -AUTOGEN_MESSAGE = "/* File automatically generated by {}. */\n\n" +AUTOGEN_MESSAGE = "// File automatically generated by {}.\n\n" def get_c_type(name): """Return a string for the C name of the type. @@ -414,7 +415,7 @@ def visitField(self, sum): class Obj2ModPrototypeVisitor(PickleVisitor): def visitProduct(self, prod, name): - code = "static int obj2ast_%s(astmodulestate *state, PyObject* obj, %s* out, PyArena* arena);" + code = "static int obj2ast_%s(struct ast_state *state, PyObject* obj, %s* out, PyArena* arena);" self.emit(code % (name, get_c_type(name)), 0) visitSum = visitProduct @@ -424,7 +425,7 @@ class Obj2ModVisitor(PickleVisitor): def funcHeader(self, name): ctype = get_c_type(name) self.emit("int", 0) - self.emit("obj2ast_%s(astmodulestate *state, PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) + self.emit("obj2ast_%s(struct ast_state *state, PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) self.emit("{", 0) self.emit("int isinstance;", 1) self.emit("", 0) @@ -506,7 +507,7 @@ def visitSum(self, sum, name): def visitProduct(self, prod, name): ctype = get_c_type(name) self.emit("int", 0) - self.emit("obj2ast_%s(astmodulestate *state, PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) + self.emit("obj2ast_%s(struct ast_state *state, PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) self.emit("{", 0) self.emit("PyObject* tmp = NULL;", 1) for f in prod.fields: @@ -640,7 +641,7 @@ class PyTypesDeclareVisitor(PickleVisitor): def visitProduct(self, prod, name): self.emit_type("%s_type" % name) - self.emit("static PyObject* ast2obj_%s(astmodulestate *state, void*);" % name, 0) + self.emit("static PyObject* ast2obj_%s(struct ast_state *state, void*);" % name, 0) if prod.attributes: for a in prod.attributes: self.emit_identifier(a.name) @@ -670,7 +671,7 @@ def visitSum(self, sum, name): ptype = get_c_type(name) for t in sum.types: self.emit_singleton("%s_singleton" % t.name) - self.emit("static PyObject* ast2obj_%s(astmodulestate *state, %s);" % (name, ptype), 0) + self.emit("static PyObject* ast2obj_%s(struct ast_state *state, %s);" % (name, ptype), 0) for t in sum.types: self.visitConstructor(t, name) @@ -725,7 +726,7 @@ def visitModule(self, mod): static int ast_type_init(PyObject *self, PyObject *args, PyObject *kw) { - astmodulestate *state = get_global_ast_state(); + struct ast_state *state = get_ast_state(); if (state == NULL) { return -1; } @@ -801,7 +802,7 @@ def visitModule(self, mod): static PyObject * ast_type_reduce(PyObject *self, PyObject *unused) { - astmodulestate *state = get_global_ast_state(); + struct ast_state *state = get_ast_state(); if (state == NULL) { return NULL; } @@ -856,7 +857,7 @@ def visitModule(self, mod): }; static PyObject * -make_type(astmodulestate *state, const char *type, PyObject* base, +make_type(struct ast_state *state, const char *type, PyObject* base, const char* const* fields, int num_fields, const char *doc) { PyObject *fnames, *result; @@ -882,7 +883,7 @@ def visitModule(self, mod): } static int -add_attributes(astmodulestate *state, PyObject *type, const char * const *attrs, int num_fields) +add_attributes(struct ast_state *state, PyObject *type, const char * const *attrs, int num_fields) { int i, result; PyObject *s, *l = PyTuple_New(num_fields); @@ -903,7 +904,7 @@ def visitModule(self, mod): /* Conversion AST -> Python */ -static PyObject* ast2obj_list(astmodulestate *state, asdl_seq *seq, PyObject* (*func)(astmodulestate *state, void*)) +static PyObject* ast2obj_list(struct ast_state *state, asdl_seq *seq, PyObject* (*func)(struct ast_state *state, void*)) { Py_ssize_t i, n = asdl_seq_LEN(seq); PyObject *result = PyList_New(n); @@ -921,7 +922,7 @@ def visitModule(self, mod): return result; } -static PyObject* ast2obj_object(astmodulestate *Py_UNUSED(state), void *o) +static PyObject* ast2obj_object(struct ast_state *Py_UNUSED(state), void *o) { if (!o) o = Py_None; @@ -932,14 +933,14 @@ def visitModule(self, mod): #define ast2obj_identifier ast2obj_object #define ast2obj_string ast2obj_object -static PyObject* ast2obj_int(astmodulestate *Py_UNUSED(state), long b) +static PyObject* ast2obj_int(struct ast_state *Py_UNUSED(state), long b) { return PyLong_FromLong(b); } /* Conversion Python -> AST */ -static int obj2ast_object(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_object(struct ast_state *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (obj == Py_None) obj = NULL; @@ -954,7 +955,7 @@ def visitModule(self, mod): return 0; } -static int obj2ast_constant(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_constant(struct ast_state *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (PyArena_AddPyObject(arena, obj) < 0) { *out = NULL; @@ -965,7 +966,7 @@ def visitModule(self, mod): return 0; } -static int obj2ast_identifier(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_identifier(struct ast_state *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && obj != Py_None) { PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str"); @@ -974,7 +975,7 @@ def visitModule(self, mod): return obj2ast_object(state, obj, out, arena); } -static int obj2ast_string(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_string(struct ast_state *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) { PyErr_SetString(PyExc_TypeError, "AST string must be of type str"); @@ -983,7 +984,7 @@ def visitModule(self, mod): return obj2ast_object(state, obj, out, arena); } -static int obj2ast_int(astmodulestate* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena) +static int obj2ast_int(struct ast_state* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena) { int i; if (!PyLong_Check(obj)) { @@ -998,7 +999,7 @@ def visitModule(self, mod): return 0; } -static int add_ast_fields(astmodulestate *state) +static int add_ast_fields(struct ast_state *state) { PyObject *empty_tuple; empty_tuple = PyTuple_New(0); @@ -1014,7 +1015,7 @@ def visitModule(self, mod): """, 0, reflow=False) - self.emit("static int init_types(astmodulestate *state)",0) + self.emit("static int init_types(struct ast_state *state)",0) self.emit("{", 0) self.emit("if (state->initialized) return 1;", 1) self.emit("if (init_identifiers(state) < 0) return 0;", 1) @@ -1093,12 +1094,10 @@ def visitModule(self, mod): self.emit("static int", 0) self.emit("astmodule_exec(PyObject *m)", 0) self.emit("{", 0) - self.emit('astmodulestate *state = get_ast_state(m);', 1) - self.emit("", 0) - - self.emit("if (!init_types(state)) {", 1) - self.emit("return -1;", 2) - self.emit("}", 1) + self.emit('struct ast_state *state = get_ast_state();', 1) + self.emit('if (state == NULL) {', 1) + self.emit('return -1;', 2) + self.emit('}', 1) self.emit('if (PyModule_AddObject(m, "AST", state->AST_type) < 0) {', 1) self.emit('return -1;', 2) self.emit('}', 1) @@ -1126,7 +1125,7 @@ def visitModule(self, mod): static struct PyModuleDef _astmodule = { PyModuleDef_HEAD_INIT, .m_name = "_ast", - // The _ast module uses a global state (global_ast_state). + // The _ast module uses a per-interpreter state (PyInterpreterState.ast) .m_size = 0, .m_slots = astmodule_slots, }; @@ -1169,7 +1168,7 @@ class ObjVisitor(PickleVisitor): def func_begin(self, name): ctype = get_c_type(name) self.emit("PyObject*", 0) - self.emit("ast2obj_%s(astmodulestate *state, void* _o)" % (name), 0) + self.emit("ast2obj_%s(struct ast_state *state, void* _o)" % (name), 0) self.emit("{", 0) self.emit("%s o = (%s)_o;" % (ctype, ctype), 1) self.emit("PyObject *result = NULL, *value = NULL;", 1) @@ -1206,7 +1205,7 @@ def visitSum(self, sum, name): self.func_end() def simpleSum(self, sum, name): - self.emit("PyObject* ast2obj_%s(astmodulestate *state, %s_ty o)" % (name, name), 0) + self.emit("PyObject* ast2obj_%s(struct ast_state *state, %s_ty o)" % (name, name), 0) self.emit("{", 0) self.emit("switch(o) {", 1) for t in sum.types: @@ -1280,7 +1279,7 @@ class PartingShots(StaticVisitor): CODE = """ PyObject* PyAST_mod2obj(mod_ty t) { - astmodulestate *state = get_global_ast_state(); + struct ast_state *state = get_ast_state(); if (state == NULL) { return NULL; } @@ -1297,7 +1296,11 @@ class PartingShots(StaticVisitor): return NULL; } - astmodulestate *state = get_global_ast_state(); + struct ast_state *state = get_ast_state(); + if (state == NULL) { + return NULL; + } + PyObject *req_type[3]; req_type[0] = state->Module_type; req_type[1] = state->Expression_type; @@ -1323,7 +1326,7 @@ class PartingShots(StaticVisitor): int PyAST_Check(PyObject* obj) { - astmodulestate *state = get_global_ast_state(); + struct ast_state *state = get_ast_state(); if (state == NULL) { return -1; } @@ -1341,7 +1344,35 @@ def visit(self, object): v.emit("", 0) -def generate_module_def(f, mod): +def generate_ast_state(module_state, f): + f.write('struct ast_state {\n') + f.write(' int initialized;\n') + for s in module_state: + f.write(' PyObject *' + s + ';\n') + f.write('};') + + +def generate_ast_fini(module_state, f): + f.write(""" +void _PyAST_Fini(PyThreadState *tstate) +{ +#ifdef Py_BUILD_CORE + struct ast_state *state = &tstate->interp->ast; +#else + struct ast_state *state = &global_ast_state; +#endif + +""") + for s in module_state: + f.write(" Py_CLEAR(state->" + s + ');\n') + f.write(""" + state->initialized = 0; +} + +""") + + +def generate_module_def(mod, f, internal_h): # Gather all the data needed for ModuleSpec visitor_list = set() with open(os.devnull, "w") as devnull: @@ -1371,50 +1402,64 @@ def generate_module_def(f, mod): module_state.add(tp) state_strings = sorted(state_strings) module_state = sorted(module_state) - f.write('typedef struct {\n') - f.write(' int initialized;\n') - for s in module_state: - f.write(' PyObject *' + s + ';\n') - f.write('} astmodulestate;\n\n') + + generate_ast_state(module_state, internal_h) + + print(textwrap.dedent(f""" + #ifdef Py_BUILD_CORE + # include "pycore_ast.h" // struct ast_state + # include "pycore_interp.h" // _PyInterpreterState.ast + # include "pycore_pystate.h" // _PyInterpreterState_GET() + #else + """).strip(), file=f) + + generate_ast_state(module_state, f) + + print(textwrap.dedent(f""" + #endif // Py_BUILD_CORE + """).rstrip(), file=f) + f.write(""" // Forward declaration -static int init_types(astmodulestate *state); +static int init_types(struct ast_state *state); -// bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. -static astmodulestate global_ast_state = {0}; - -static astmodulestate* -get_global_ast_state(void) +#ifdef Py_BUILD_CORE +static struct ast_state* +get_ast_state(void) { - astmodulestate* state = &global_ast_state; + PyInterpreterState *interp = _PyInterpreterState_GET(); + struct ast_state *state = &interp->ast; if (!init_types(state)) { return NULL; } return state; } +#else +static struct ast_state global_ast_state; -static astmodulestate* -get_ast_state(PyObject* Py_UNUSED(module)) +static struct ast_state* +get_ast_state(void) { - astmodulestate* state = get_global_ast_state(); - // get_ast_state() must only be called after _ast module is imported, - // and astmodule_exec() calls init_types() - assert(state != NULL); + struct ast_state *state = &global_ast_state; + if (!init_types(state)) { + return NULL; + } return state; } - -void _PyAST_Fini(PyThreadState *tstate) -{ - astmodulestate* state = &global_ast_state; +#endif // Py_BUILD_CORE """) - for s in module_state: - f.write(" Py_CLEAR(state->" + s + ');\n') - f.write(""" - state->initialized = 0; -} + # f-string for {mod.name} + f.write(f""" +// Include {mod.name}-ast.h after pycore_interp.h to avoid conflicts +// with the Yield macro redefined by +#include "{mod.name}-ast.h" +#include "structmember.h" """) - f.write('static int init_identifiers(astmodulestate *state)\n') + + generate_ast_fini(module_state, f) + + f.write('static int init_identifiers(struct ast_state *state)\n') f.write('{\n') for identifier in state_strings: f.write(' if ((state->' + identifier) @@ -1423,7 +1468,7 @@ def generate_module_def(f, mod): f.write(' return 1;\n') f.write('};\n\n') -def write_header(f, mod): +def write_header(mod, f): f.write('#ifndef Py_PYTHON_AST_H\n') f.write('#define Py_PYTHON_AST_H\n') f.write('#ifdef __cplusplus\n') @@ -1452,15 +1497,39 @@ def write_header(f, mod): f.write('#endif\n') f.write('#endif /* !Py_PYTHON_AST_H */\n') -def write_source(f, mod): - f.write('#include \n') - f.write('\n') - f.write('#include "Python.h"\n') - f.write('#include "%s-ast.h"\n' % mod.name) - f.write('#include "structmember.h" // PyMemberDef\n') - f.write('\n') - generate_module_def(f, mod) +def write_internal_h_header(mod, f): + print(textwrap.dedent(""" + #ifndef Py_INTERNAL_AST_H + #define Py_INTERNAL_AST_H + #ifdef __cplusplus + extern "C" { + #endif + + #ifndef Py_BUILD_CORE + # error "this header requires Py_BUILD_CORE define" + #endif + """).lstrip(), file=f) + + +def write_internal_h_footer(mod, f): + print(textwrap.dedent(""" + + #ifdef __cplusplus + } + #endif + #endif /* !Py_INTERNAL_AST_H */ + """), file=f) + + +def write_source(mod, f, internal_h_file): + print(textwrap.dedent(f""" + #include + + #include "Python.h" + """), file=f) + + generate_module_def(mod, f, internal_h_file) v = ChainOfVisitors( SequenceConstructorVisitor(f), @@ -1475,27 +1544,37 @@ def write_source(f, mod): ) v.visit(mod) -def main(input_file, c_file, h_file, dump_module=False): +def main(input_filename, c_filename, h_filename, internal_h_filename, dump_module=False): auto_gen_msg = AUTOGEN_MESSAGE.format("/".join(Path(__file__).parts[-2:])) - mod = asdl.parse(input_file) + mod = asdl.parse(input_filename) if dump_module: print('Parsed Module:') print(mod) if not asdl.check(mod): sys.exit(1) - for file, writer in (c_file, write_source), (h_file, write_header): - if file is not None: - with file.open("w") as f: - f.write(auto_gen_msg) - writer(f, mod) - print(file, "regenerated.") + + with c_filename.open("w") as c_file, \ + h_filename.open("w") as h_file, \ + internal_h_filename.open("w") as internal_h_file: + c_file.write(auto_gen_msg) + h_file.write(auto_gen_msg) + internal_h_file.write(auto_gen_msg) + + write_internal_h_header(mod, internal_h_file) + write_source(mod, c_file, internal_h_file) + write_header(mod, h_file) + write_internal_h_footer(mod, internal_h_file) + + print(f"{c_filename}, {h_filename}, {internal_h_filename} regenerated.") if __name__ == "__main__": parser = ArgumentParser() parser.add_argument("input_file", type=Path) - parser.add_argument("-C", "--c-file", type=Path, default=None) - parser.add_argument("-H", "--h-file", type=Path, default=None) + parser.add_argument("-C", "--c-file", type=Path, required=True) + parser.add_argument("-H", "--h-file", type=Path, required=True) + parser.add_argument("-I", "--internal-h-file", type=Path, required=True) parser.add_argument("-d", "--dump-module", action="store_true") - options = parser.parse_args() - main(**vars(options)) + args = parser.parse_args() + main(args.input_file, args.c_file, args.h_file, + args.internal_h_file, args.dump_module) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 13657a67275667..f04addbe2011dd 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -1,12 +1,16 @@ -/* File automatically generated by Parser/asdl_c.py. */ +// File automatically generated by Parser/asdl_c.py. + #include #include "Python.h" -#include "Python-ast.h" -#include "structmember.h" // PyMemberDef -typedef struct { +#ifdef Py_BUILD_CORE +# include "pycore_ast.h" // struct ast_state +# include "pycore_interp.h" // _PyInterpreterState.ast +# include "pycore_pystate.h" // _PyInterpreterState_GET() +#else +struct ast_state { int initialized; PyObject *AST_type; PyObject *Add_singleton; @@ -221,38 +225,50 @@ typedef struct { PyObject *values; PyObject *vararg; PyObject *withitem_type; -} astmodulestate; - +}; +#endif // Py_BUILD_CORE // Forward declaration -static int init_types(astmodulestate *state); +static int init_types(struct ast_state *state); -// bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. -static astmodulestate global_ast_state = {0}; - -static astmodulestate* -get_global_ast_state(void) +#ifdef Py_BUILD_CORE +static struct ast_state* +get_ast_state(void) { - astmodulestate* state = &global_ast_state; + PyInterpreterState *interp = _PyInterpreterState_GET(); + struct ast_state *state = &interp->ast; if (!init_types(state)) { return NULL; } return state; } +#else +static struct ast_state global_ast_state; -static astmodulestate* -get_ast_state(PyObject* Py_UNUSED(module)) +static struct ast_state* +get_ast_state(void) { - astmodulestate* state = get_global_ast_state(); - // get_ast_state() must only be called after _ast module is imported, - // and astmodule_exec() calls init_types() - assert(state != NULL); + struct ast_state *state = &global_ast_state; + if (!init_types(state)) { + return NULL; + } return state; } +#endif // Py_BUILD_CORE + +// Include Python-ast.h after pycore_interp.h to avoid conflicts +// with the Yield macro redefined by +#include "Python-ast.h" +#include "structmember.h" void _PyAST_Fini(PyThreadState *tstate) { - astmodulestate* state = &global_ast_state; +#ifdef Py_BUILD_CORE + struct ast_state *state = &tstate->interp->ast; +#else + struct ast_state *state = &global_ast_state; +#endif + Py_CLEAR(state->AST_type); Py_CLEAR(state->Add_singleton); Py_CLEAR(state->Add_type); @@ -470,7 +486,7 @@ void _PyAST_Fini(PyThreadState *tstate) state->initialized = 0; } -static int init_identifiers(astmodulestate *state) +static int init_identifiers(struct ast_state *state) { if ((state->__dict__ = PyUnicode_InternFromString("__dict__")) == NULL) return 0; if ((state->__doc__ = PyUnicode_InternFromString("__doc__")) == NULL) return 0; @@ -561,7 +577,7 @@ GENERATE_ASDL_SEQ_CONSTRUCTOR(alias, alias_ty) GENERATE_ASDL_SEQ_CONSTRUCTOR(withitem, withitem_ty) GENERATE_ASDL_SEQ_CONSTRUCTOR(type_ignore, type_ignore_ty) -static PyObject* ast2obj_mod(astmodulestate *state, void*); +static PyObject* ast2obj_mod(struct ast_state *state, void*); static const char * const Module_fields[]={ "body", "type_ignores", @@ -582,7 +598,7 @@ static const char * const stmt_attributes[] = { "end_lineno", "end_col_offset", }; -static PyObject* ast2obj_stmt(astmodulestate *state, void*); +static PyObject* ast2obj_stmt(struct ast_state *state, void*); static const char * const FunctionDef_fields[]={ "name", "args", @@ -699,7 +715,7 @@ static const char * const expr_attributes[] = { "end_lineno", "end_col_offset", }; -static PyObject* ast2obj_expr(astmodulestate *state, void*); +static PyObject* ast2obj_expr(struct ast_state *state, void*); static const char * const BoolOp_fields[]={ "op", "values", @@ -812,12 +828,12 @@ static const char * const Slice_fields[]={ "upper", "step", }; -static PyObject* ast2obj_expr_context(astmodulestate *state, expr_context_ty); -static PyObject* ast2obj_boolop(astmodulestate *state, boolop_ty); -static PyObject* ast2obj_operator(astmodulestate *state, operator_ty); -static PyObject* ast2obj_unaryop(astmodulestate *state, unaryop_ty); -static PyObject* ast2obj_cmpop(astmodulestate *state, cmpop_ty); -static PyObject* ast2obj_comprehension(astmodulestate *state, void*); +static PyObject* ast2obj_expr_context(struct ast_state *state, expr_context_ty); +static PyObject* ast2obj_boolop(struct ast_state *state, boolop_ty); +static PyObject* ast2obj_operator(struct ast_state *state, operator_ty); +static PyObject* ast2obj_unaryop(struct ast_state *state, unaryop_ty); +static PyObject* ast2obj_cmpop(struct ast_state *state, cmpop_ty); +static PyObject* ast2obj_comprehension(struct ast_state *state, void*); static const char * const comprehension_fields[]={ "target", "iter", @@ -830,13 +846,13 @@ static const char * const excepthandler_attributes[] = { "end_lineno", "end_col_offset", }; -static PyObject* ast2obj_excepthandler(astmodulestate *state, void*); +static PyObject* ast2obj_excepthandler(struct ast_state *state, void*); static const char * const ExceptHandler_fields[]={ "type", "name", "body", }; -static PyObject* ast2obj_arguments(astmodulestate *state, void*); +static PyObject* ast2obj_arguments(struct ast_state *state, void*); static const char * const arguments_fields[]={ "posonlyargs", "args", @@ -846,7 +862,7 @@ static const char * const arguments_fields[]={ "kwarg", "defaults", }; -static PyObject* ast2obj_arg(astmodulestate *state, void*); +static PyObject* ast2obj_arg(struct ast_state *state, void*); static const char * const arg_attributes[] = { "lineno", "col_offset", @@ -858,7 +874,7 @@ static const char * const arg_fields[]={ "annotation", "type_comment", }; -static PyObject* ast2obj_keyword(astmodulestate *state, void*); +static PyObject* ast2obj_keyword(struct ast_state *state, void*); static const char * const keyword_attributes[] = { "lineno", "col_offset", @@ -869,17 +885,17 @@ static const char * const keyword_fields[]={ "arg", "value", }; -static PyObject* ast2obj_alias(astmodulestate *state, void*); +static PyObject* ast2obj_alias(struct ast_state *state, void*); static const char * const alias_fields[]={ "name", "asname", }; -static PyObject* ast2obj_withitem(astmodulestate *state, void*); +static PyObject* ast2obj_withitem(struct ast_state *state, void*); static const char * const withitem_fields[]={ "context_expr", "optional_vars", }; -static PyObject* ast2obj_type_ignore(astmodulestate *state, void*); +static PyObject* ast2obj_type_ignore(struct ast_state *state, void*); static const char * const TypeIgnore_fields[]={ "lineno", "tag", @@ -923,7 +939,7 @@ ast_clear(AST_object *self) static int ast_type_init(PyObject *self, PyObject *args, PyObject *kw) { - astmodulestate *state = get_global_ast_state(); + struct ast_state *state = get_ast_state(); if (state == NULL) { return -1; } @@ -999,7 +1015,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) static PyObject * ast_type_reduce(PyObject *self, PyObject *unused) { - astmodulestate *state = get_global_ast_state(); + struct ast_state *state = get_ast_state(); if (state == NULL) { return NULL; } @@ -1054,7 +1070,7 @@ static PyType_Spec AST_type_spec = { }; static PyObject * -make_type(astmodulestate *state, const char *type, PyObject* base, +make_type(struct ast_state *state, const char *type, PyObject* base, const char* const* fields, int num_fields, const char *doc) { PyObject *fnames, *result; @@ -1080,7 +1096,7 @@ make_type(astmodulestate *state, const char *type, PyObject* base, } static int -add_attributes(astmodulestate *state, PyObject *type, const char * const *attrs, int num_fields) +add_attributes(struct ast_state *state, PyObject *type, const char * const *attrs, int num_fields) { int i, result; PyObject *s, *l = PyTuple_New(num_fields); @@ -1101,7 +1117,7 @@ add_attributes(astmodulestate *state, PyObject *type, const char * const *attrs, /* Conversion AST -> Python */ -static PyObject* ast2obj_list(astmodulestate *state, asdl_seq *seq, PyObject* (*func)(astmodulestate *state, void*)) +static PyObject* ast2obj_list(struct ast_state *state, asdl_seq *seq, PyObject* (*func)(struct ast_state *state, void*)) { Py_ssize_t i, n = asdl_seq_LEN(seq); PyObject *result = PyList_New(n); @@ -1119,7 +1135,7 @@ static PyObject* ast2obj_list(astmodulestate *state, asdl_seq *seq, PyObject* (* return result; } -static PyObject* ast2obj_object(astmodulestate *Py_UNUSED(state), void *o) +static PyObject* ast2obj_object(struct ast_state *Py_UNUSED(state), void *o) { if (!o) o = Py_None; @@ -1130,14 +1146,14 @@ static PyObject* ast2obj_object(astmodulestate *Py_UNUSED(state), void *o) #define ast2obj_identifier ast2obj_object #define ast2obj_string ast2obj_object -static PyObject* ast2obj_int(astmodulestate *Py_UNUSED(state), long b) +static PyObject* ast2obj_int(struct ast_state *Py_UNUSED(state), long b) { return PyLong_FromLong(b); } /* Conversion Python -> AST */ -static int obj2ast_object(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_object(struct ast_state *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (obj == Py_None) obj = NULL; @@ -1152,7 +1168,7 @@ static int obj2ast_object(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObj return 0; } -static int obj2ast_constant(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_constant(struct ast_state *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (PyArena_AddPyObject(arena, obj) < 0) { *out = NULL; @@ -1163,7 +1179,7 @@ static int obj2ast_constant(astmodulestate *Py_UNUSED(state), PyObject* obj, PyO return 0; } -static int obj2ast_identifier(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_identifier(struct ast_state *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && obj != Py_None) { PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str"); @@ -1172,7 +1188,7 @@ static int obj2ast_identifier(astmodulestate *state, PyObject* obj, PyObject** o return obj2ast_object(state, obj, out, arena); } -static int obj2ast_string(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_string(struct ast_state *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) { PyErr_SetString(PyExc_TypeError, "AST string must be of type str"); @@ -1181,7 +1197,7 @@ static int obj2ast_string(astmodulestate *state, PyObject* obj, PyObject** out, return obj2ast_object(state, obj, out, arena); } -static int obj2ast_int(astmodulestate* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena) +static int obj2ast_int(struct ast_state* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena) { int i; if (!PyLong_Check(obj)) { @@ -1196,7 +1212,7 @@ static int obj2ast_int(astmodulestate* Py_UNUSED(state), PyObject* obj, int* out return 0; } -static int add_ast_fields(astmodulestate *state) +static int add_ast_fields(struct ast_state *state) { PyObject *empty_tuple; empty_tuple = PyTuple_New(0); @@ -1211,7 +1227,7 @@ static int add_ast_fields(astmodulestate *state) } -static int init_types(astmodulestate *state) +static int init_types(struct ast_state *state) { if (state->initialized) return 1; if (init_identifiers(state) < 0) return 0; @@ -1890,37 +1906,37 @@ static int init_types(astmodulestate *state) return 1; } -static int obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, +static int obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena); -static int obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, +static int obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* arena); -static int obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, +static int obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* arena); -static int obj2ast_expr_context(astmodulestate *state, PyObject* obj, +static int obj2ast_expr_context(struct ast_state *state, PyObject* obj, expr_context_ty* out, PyArena* arena); -static int obj2ast_boolop(astmodulestate *state, PyObject* obj, boolop_ty* out, - PyArena* arena); -static int obj2ast_operator(astmodulestate *state, PyObject* obj, operator_ty* - out, PyArena* arena); -static int obj2ast_unaryop(astmodulestate *state, PyObject* obj, unaryop_ty* +static int obj2ast_boolop(struct ast_state *state, PyObject* obj, boolop_ty* + out, PyArena* arena); +static int obj2ast_operator(struct ast_state *state, PyObject* obj, + operator_ty* out, PyArena* arena); +static int obj2ast_unaryop(struct ast_state *state, PyObject* obj, unaryop_ty* out, PyArena* arena); -static int obj2ast_cmpop(astmodulestate *state, PyObject* obj, cmpop_ty* out, +static int obj2ast_cmpop(struct ast_state *state, PyObject* obj, cmpop_ty* out, PyArena* arena); -static int obj2ast_comprehension(astmodulestate *state, PyObject* obj, +static int obj2ast_comprehension(struct ast_state *state, PyObject* obj, comprehension_ty* out, PyArena* arena); -static int obj2ast_excepthandler(astmodulestate *state, PyObject* obj, +static int obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* out, PyArena* arena); -static int obj2ast_arguments(astmodulestate *state, PyObject* obj, +static int obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, PyArena* arena); -static int obj2ast_arg(astmodulestate *state, PyObject* obj, arg_ty* out, +static int obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena); -static int obj2ast_keyword(astmodulestate *state, PyObject* obj, keyword_ty* +static int obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, PyArena* arena); -static int obj2ast_alias(astmodulestate *state, PyObject* obj, alias_ty* out, +static int obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* arena); -static int obj2ast_withitem(astmodulestate *state, PyObject* obj, withitem_ty* - out, PyArena* arena); -static int obj2ast_type_ignore(astmodulestate *state, PyObject* obj, +static int obj2ast_withitem(struct ast_state *state, PyObject* obj, + withitem_ty* out, PyArena* arena); +static int obj2ast_type_ignore(struct ast_state *state, PyObject* obj, type_ignore_ty* out, PyArena* arena); mod_ty @@ -3391,7 +3407,7 @@ TypeIgnore(int lineno, string tag, PyArena *arena) PyObject* -ast2obj_mod(astmodulestate *state, void* _o) +ast2obj_mod(struct ast_state *state, void* _o) { mod_ty o = (mod_ty)_o; PyObject *result = NULL, *value = NULL; @@ -3462,7 +3478,7 @@ ast2obj_mod(astmodulestate *state, void* _o) } PyObject* -ast2obj_stmt(astmodulestate *state, void* _o) +ast2obj_stmt(struct ast_state *state, void* _o) { stmt_ty o = (stmt_ty)_o; PyObject *result = NULL, *value = NULL; @@ -3977,7 +3993,7 @@ ast2obj_stmt(astmodulestate *state, void* _o) } PyObject* -ast2obj_expr(astmodulestate *state, void* _o) +ast2obj_expr(struct ast_state *state, void* _o) { expr_ty o = (expr_ty)_o; PyObject *result = NULL, *value = NULL; @@ -4453,7 +4469,7 @@ ast2obj_expr(astmodulestate *state, void* _o) return NULL; } -PyObject* ast2obj_expr_context(astmodulestate *state, expr_context_ty o) +PyObject* ast2obj_expr_context(struct ast_state *state, expr_context_ty o) { switch(o) { case Load: @@ -4468,7 +4484,7 @@ PyObject* ast2obj_expr_context(astmodulestate *state, expr_context_ty o) } Py_UNREACHABLE(); } -PyObject* ast2obj_boolop(astmodulestate *state, boolop_ty o) +PyObject* ast2obj_boolop(struct ast_state *state, boolop_ty o) { switch(o) { case And: @@ -4480,7 +4496,7 @@ PyObject* ast2obj_boolop(astmodulestate *state, boolop_ty o) } Py_UNREACHABLE(); } -PyObject* ast2obj_operator(astmodulestate *state, operator_ty o) +PyObject* ast2obj_operator(struct ast_state *state, operator_ty o) { switch(o) { case Add: @@ -4525,7 +4541,7 @@ PyObject* ast2obj_operator(astmodulestate *state, operator_ty o) } Py_UNREACHABLE(); } -PyObject* ast2obj_unaryop(astmodulestate *state, unaryop_ty o) +PyObject* ast2obj_unaryop(struct ast_state *state, unaryop_ty o) { switch(o) { case Invert: @@ -4543,7 +4559,7 @@ PyObject* ast2obj_unaryop(astmodulestate *state, unaryop_ty o) } Py_UNREACHABLE(); } -PyObject* ast2obj_cmpop(astmodulestate *state, cmpop_ty o) +PyObject* ast2obj_cmpop(struct ast_state *state, cmpop_ty o) { switch(o) { case Eq: @@ -4580,7 +4596,7 @@ PyObject* ast2obj_cmpop(astmodulestate *state, cmpop_ty o) Py_UNREACHABLE(); } PyObject* -ast2obj_comprehension(astmodulestate *state, void* _o) +ast2obj_comprehension(struct ast_state *state, void* _o) { comprehension_ty o = (comprehension_ty)_o; PyObject *result = NULL, *value = NULL; @@ -4619,7 +4635,7 @@ ast2obj_comprehension(astmodulestate *state, void* _o) } PyObject* -ast2obj_excepthandler(astmodulestate *state, void* _o) +ast2obj_excepthandler(struct ast_state *state, void* _o) { excepthandler_ty o = (excepthandler_ty)_o; PyObject *result = NULL, *value = NULL; @@ -4678,7 +4694,7 @@ ast2obj_excepthandler(astmodulestate *state, void* _o) } PyObject* -ast2obj_arguments(astmodulestate *state, void* _o) +ast2obj_arguments(struct ast_state *state, void* _o) { arguments_ty o = (arguments_ty)_o; PyObject *result = NULL, *value = NULL; @@ -4732,7 +4748,7 @@ ast2obj_arguments(astmodulestate *state, void* _o) } PyObject* -ast2obj_arg(astmodulestate *state, void* _o) +ast2obj_arg(struct ast_state *state, void* _o) { arg_ty o = (arg_ty)_o; PyObject *result = NULL, *value = NULL; @@ -4786,7 +4802,7 @@ ast2obj_arg(astmodulestate *state, void* _o) } PyObject* -ast2obj_keyword(astmodulestate *state, void* _o) +ast2obj_keyword(struct ast_state *state, void* _o) { keyword_ty o = (keyword_ty)_o; PyObject *result = NULL, *value = NULL; @@ -4835,7 +4851,7 @@ ast2obj_keyword(astmodulestate *state, void* _o) } PyObject* -ast2obj_alias(astmodulestate *state, void* _o) +ast2obj_alias(struct ast_state *state, void* _o) { alias_ty o = (alias_ty)_o; PyObject *result = NULL, *value = NULL; @@ -4864,7 +4880,7 @@ ast2obj_alias(astmodulestate *state, void* _o) } PyObject* -ast2obj_withitem(astmodulestate *state, void* _o) +ast2obj_withitem(struct ast_state *state, void* _o) { withitem_ty o = (withitem_ty)_o; PyObject *result = NULL, *value = NULL; @@ -4893,7 +4909,7 @@ ast2obj_withitem(astmodulestate *state, void* _o) } PyObject* -ast2obj_type_ignore(astmodulestate *state, void* _o) +ast2obj_type_ignore(struct ast_state *state, void* _o) { type_ignore_ty o = (type_ignore_ty)_o; PyObject *result = NULL, *value = NULL; @@ -4927,7 +4943,7 @@ ast2obj_type_ignore(astmodulestate *state, void* _o) int -obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena) +obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena) { int isinstance; @@ -5154,7 +5170,8 @@ obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena) } int -obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) +obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* + arena) { int isinstance; @@ -7052,7 +7069,8 @@ obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) } int -obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) +obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* + arena) { int isinstance; @@ -8562,7 +8580,7 @@ obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) } int -obj2ast_expr_context(astmodulestate *state, PyObject* obj, expr_context_ty* +obj2ast_expr_context(struct ast_state *state, PyObject* obj, expr_context_ty* out, PyArena* arena) { int isinstance; @@ -8597,7 +8615,7 @@ obj2ast_expr_context(astmodulestate *state, PyObject* obj, expr_context_ty* } int -obj2ast_boolop(astmodulestate *state, PyObject* obj, boolop_ty* out, PyArena* +obj2ast_boolop(struct ast_state *state, PyObject* obj, boolop_ty* out, PyArena* arena) { int isinstance; @@ -8624,7 +8642,7 @@ obj2ast_boolop(astmodulestate *state, PyObject* obj, boolop_ty* out, PyArena* } int -obj2ast_operator(astmodulestate *state, PyObject* obj, operator_ty* out, +obj2ast_operator(struct ast_state *state, PyObject* obj, operator_ty* out, PyArena* arena) { int isinstance; @@ -8739,8 +8757,8 @@ obj2ast_operator(astmodulestate *state, PyObject* obj, operator_ty* out, } int -obj2ast_unaryop(astmodulestate *state, PyObject* obj, unaryop_ty* out, PyArena* - arena) +obj2ast_unaryop(struct ast_state *state, PyObject* obj, unaryop_ty* out, + PyArena* arena) { int isinstance; @@ -8782,7 +8800,7 @@ obj2ast_unaryop(astmodulestate *state, PyObject* obj, unaryop_ty* out, PyArena* } int -obj2ast_cmpop(astmodulestate *state, PyObject* obj, cmpop_ty* out, PyArena* +obj2ast_cmpop(struct ast_state *state, PyObject* obj, cmpop_ty* out, PyArena* arena) { int isinstance; @@ -8873,7 +8891,7 @@ obj2ast_cmpop(astmodulestate *state, PyObject* obj, cmpop_ty* out, PyArena* } int -obj2ast_comprehension(astmodulestate *state, PyObject* obj, comprehension_ty* +obj2ast_comprehension(struct ast_state *state, PyObject* obj, comprehension_ty* out, PyArena* arena) { PyObject* tmp = NULL; @@ -8962,7 +8980,7 @@ obj2ast_comprehension(astmodulestate *state, PyObject* obj, comprehension_ty* } int -obj2ast_excepthandler(astmodulestate *state, PyObject* obj, excepthandler_ty* +obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* out, PyArena* arena) { int isinstance; @@ -9112,7 +9130,7 @@ obj2ast_excepthandler(astmodulestate *state, PyObject* obj, excepthandler_ty* } int -obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out, +obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, PyArena* arena) { PyObject* tmp = NULL; @@ -9324,7 +9342,7 @@ obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out, } int -obj2ast_arg(astmodulestate *state, PyObject* obj, arg_ty* out, PyArena* arena) +obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) { PyObject* tmp = NULL; identifier arg; @@ -9435,8 +9453,8 @@ obj2ast_arg(astmodulestate *state, PyObject* obj, arg_ty* out, PyArena* arena) } int -obj2ast_keyword(astmodulestate *state, PyObject* obj, keyword_ty* out, PyArena* - arena) +obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, + PyArena* arena) { PyObject* tmp = NULL; identifier arg; @@ -9533,7 +9551,7 @@ obj2ast_keyword(astmodulestate *state, PyObject* obj, keyword_ty* out, PyArena* } int -obj2ast_alias(astmodulestate *state, PyObject* obj, alias_ty* out, PyArena* +obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* arena) { PyObject* tmp = NULL; @@ -9574,7 +9592,7 @@ obj2ast_alias(astmodulestate *state, PyObject* obj, alias_ty* out, PyArena* } int -obj2ast_withitem(astmodulestate *state, PyObject* obj, withitem_ty* out, +obj2ast_withitem(struct ast_state *state, PyObject* obj, withitem_ty* out, PyArena* arena) { PyObject* tmp = NULL; @@ -9615,8 +9633,8 @@ obj2ast_withitem(astmodulestate *state, PyObject* obj, withitem_ty* out, } int -obj2ast_type_ignore(astmodulestate *state, PyObject* obj, type_ignore_ty* out, - PyArena* arena) +obj2ast_type_ignore(struct ast_state *state, PyObject* obj, type_ignore_ty* + out, PyArena* arena) { int isinstance; @@ -9677,9 +9695,8 @@ obj2ast_type_ignore(astmodulestate *state, PyObject* obj, type_ignore_ty* out, static int astmodule_exec(PyObject *m) { - astmodulestate *state = get_ast_state(m); - - if (!init_types(state)) { + struct ast_state *state = get_ast_state(); + if (state == NULL) { return -1; } if (PyModule_AddObject(m, "AST", state->AST_type) < 0) { @@ -10132,7 +10149,7 @@ static PyModuleDef_Slot astmodule_slots[] = { static struct PyModuleDef _astmodule = { PyModuleDef_HEAD_INIT, .m_name = "_ast", - // The _ast module uses a global state (global_ast_state). + // The _ast module uses a per-interpreter state (PyInterpreterState.ast) .m_size = 0, .m_slots = astmodule_slots, }; @@ -10146,7 +10163,7 @@ PyInit__ast(void) PyObject* PyAST_mod2obj(mod_ty t) { - astmodulestate *state = get_global_ast_state(); + struct ast_state *state = get_ast_state(); if (state == NULL) { return NULL; } @@ -10163,7 +10180,11 @@ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) return NULL; } - astmodulestate *state = get_global_ast_state(); + struct ast_state *state = get_ast_state(); + if (state == NULL) { + return NULL; + } + PyObject *req_type[3]; req_type[0] = state->Module_type; req_type[1] = state->Expression_type; @@ -10189,7 +10210,7 @@ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) int PyAST_Check(PyObject* obj) { - astmodulestate *state = get_global_ast_state(); + struct ast_state *state = get_ast_state(); if (state == NULL) { return -1; } From ca9c6fcf45c2f15ce4e5f6be867c01786abe1311 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 2 Nov 2020 23:17:46 +0100 Subject: [PATCH 0451/1261] bpo-26789: Fix logging.FileHandler._open() at exit (GH-23053) The logging.FileHandler class now keeps a reference to the builtin open() function to be able to open or reopen the file during Python finalization. Fix errors like: Exception ignored in: (...) Traceback (most recent call last): (...) File ".../logging/__init__.py", line 1463, in error File ".../logging/__init__.py", line 1577, in _log File ".../logging/__init__.py", line 1587, in handle File ".../logging/__init__.py", line 1649, in callHandlers File ".../logging/__init__.py", line 948, in handle File ".../logging/__init__.py", line 1182, in emit File ".../logging/__init__.py", line 1171, in _open NameError: name 'open' is not defined --- Lib/logging/__init__.py | 9 +++- Lib/test/test_logging.py | 43 ++++++++++++++++--- .../2020-10-31-01-16-49.bpo-26789.9BdNAt.rst | 4 ++ Python/_warnings.c | 2 +- 4 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-31-01-16-49.bpo-26789.9BdNAt.rst diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 265e286101e913..badfd654b16895 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1148,6 +1148,10 @@ def __init__(self, filename, mode='a', encoding=None, delay=False, errors=None): self.encoding = encoding self.errors = errors self.delay = delay + # bpo-26789: FileHandler keeps a reference to the builtin open() + # function to be able to open or reopen the file during Python + # finalization. + self._builtin_open = open if delay: #We don't open the stream, but we still need to call the #Handler constructor to set level, formatter, lock etc. @@ -1183,8 +1187,9 @@ def _open(self): Open the current base file with the (original) mode and encoding. Return the resulting stream. """ - return open(self.baseFilename, self.mode, encoding=self.encoding, - errors=self.errors) + open_func = self._builtin_open + return open_func(self.baseFilename, self.mode, + encoding=self.encoding, errors=self.errors) def emit(self, record): """ diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 7c98e19b7408fc..e2196736dcdf4d 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -4310,8 +4310,8 @@ def __init__(self, name='MyLogger', level=logging.NOTSET): logging.setLoggerClass(logging.Logger) def test_logging_at_shutdown(self): - # Issue #20037 - code = """if 1: + # bpo-20037: Doing text I/O late at interpreter shutdown must not crash + code = textwrap.dedent(""" import logging class A: @@ -4321,22 +4321,55 @@ def __del__(self): except Exception: logging.exception("exception in __del__") - a = A()""" + a = A() + """) rc, out, err = assert_python_ok("-c", code) err = err.decode() self.assertIn("exception in __del__", err) self.assertIn("ValueError: some error", err) + def test_logging_at_shutdown_open(self): + # bpo-26789: FileHandler keeps a reference to the builtin open() + # function to be able to open or reopen the file during Python + # finalization. + filename = os_helper.TESTFN + self.addCleanup(os_helper.unlink, filename) + + code = textwrap.dedent(f""" + import builtins + import logging + + class A: + def __del__(self): + logging.error("log in __del__") + + # basicConfig() opens the file, but logging.shutdown() closes + # it at Python exit. When A.__del__() is called, + # FileHandler._open() must be called again to re-open the file. + logging.basicConfig(filename={filename!r}) + + a = A() + + # Simulate the Python finalization which removes the builtin + # open() function. + del builtins.open + """) + assert_python_ok("-c", code) + + with open(filename) as fp: + self.assertEqual(fp.read().rstrip(), "ERROR:root:log in __del__") + def test_recursion_error(self): # Issue 36272 - code = """if 1: + code = textwrap.dedent(""" import logging def rec(): logging.error("foo") rec() - rec()""" + rec() + """) rc, out, err = assert_python_failure("-c", code) err = err.decode() self.assertNotIn("Cannot recover from stack overflow.", err) diff --git a/Misc/NEWS.d/next/Library/2020-10-31-01-16-49.bpo-26789.9BdNAt.rst b/Misc/NEWS.d/next/Library/2020-10-31-01-16-49.bpo-26789.9BdNAt.rst new file mode 100644 index 00000000000000..d8832401c932b2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-31-01-16-49.bpo-26789.9BdNAt.rst @@ -0,0 +1,4 @@ +The :class:`logging.FileHandler` class now keeps a reference to the builtin +:func:`open` function to be able to open or reopen the file during Python +finalization. Fix errors like: ``NameError: name 'open' is not defined``. Patch +by Victor Stinner. diff --git a/Python/_warnings.c b/Python/_warnings.c index 271cd47f4eee62..3c048af4193a00 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -852,7 +852,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, } if (f == NULL) { - globals = _PyInterpreterState_GET()->sysdict; + globals = tstate->interp->sysdict; *filename = PyUnicode_FromString("sys"); *lineno = 1; } From e729b9e3a950940b97510ffe0f55fcab0050c697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kul=C3=ADk?= Date: Tue, 3 Nov 2020 00:10:01 +0100 Subject: [PATCH 0452/1261] bpo-35455: Fix thread_time for Solaris OS (GH-11118) --- .../2020-11-02-14-10-48.bpo-35455.Q1xTIo.rst | 3 +++ Modules/timemodule.c | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-11-02-14-10-48.bpo-35455.Q1xTIo.rst diff --git a/Misc/NEWS.d/next/Library/2020-11-02-14-10-48.bpo-35455.Q1xTIo.rst b/Misc/NEWS.d/next/Library/2020-11-02-14-10-48.bpo-35455.Q1xTIo.rst new file mode 100644 index 00000000000000..e72c7d277a1123 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-02-14-10-48.bpo-35455.Q1xTIo.rst @@ -0,0 +1,3 @@ +On Solaris, :func:`~time.thread_time` is now implemented with +``gethrvtime()`` because ``clock_gettime(CLOCK_THREAD_CPUTIME_ID)`` is not +always available. Patch by Jakub Kulik. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 8a4d149befb52a..eb192c5e7fd31e 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -1371,6 +1371,23 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) return 0; } +#elif defined(__sun) && defined(__SVR4) +#define HAVE_THREAD_TIME +static int +_PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) +{ + /* bpo-35455: On Solaris, CLOCK_THREAD_CPUTIME_ID clock is not always + available; use gethrvtime() to substitute this functionality. */ + if (info) { + info->implementation = "gethrvtime()"; + info->resolution = 1e-9; + info->monotonic = 1; + info->adjustable = 0; + } + *tp = _PyTime_FromNanoseconds(gethrvtime()); + return 0; +} + #elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) #define HAVE_THREAD_TIME static int From 33cd714f389aac2ae91e21cd24e438a3da6288f9 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 3 Nov 2020 00:00:12 +0000 Subject: [PATCH 0453/1261] Python 3.10.0a2 --- Include/patchlevel.h | 4 +- Lib/pydoc_data/topics.py | 198 ++-- Misc/NEWS.d/3.10.0a2.rst | 912 ++++++++++++++++++ .../2020-10-21-18-31-54.bpo-38980.xz7BNd.rst | 3 - .../2020-09-14-10-17-00.bpo-41784.Yl4gI2.rst | 1 - .../2020-09-28-14-31-07.bpo-41756.ZZ5wJG.rst | 3 - .../2020-10-09-22-50-46.bpo-41986.JUPE59.rst | 2 - .../2020-10-10-14-05-24.bpo-40422.sh8IDY.rst | 1 - .../2020-10-11-05-05-53.bpo-41845.ZFvuQM.rst | 2 - .../2020-10-11-19-17-44.bpo-40423.GsmgEj.rst | 3 - .../2020-10-12-20-13-58.bpo-42015.X4H2_V.rst | 3 - .../2020-10-16-10-47-17.bpo-42157.e3BcPM.rst | 3 - .../2020-05-27-16-08-16.bpo-38605.rcs2uK.rst | 3 - .../2020-08-07-13-42-48.bpo-41435.qPWjJA.rst | 1 - .../2020-10-01-22-44-23.bpo-41902.iLoMVF.rst | 1 - .../2020-10-02-11-35-33.bpo-41894.ffmtOt.rst | 3 - .../2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst | 3 - .../2020-10-08-09-58-19.bpo-41974.8B-q8O.rst | 4 - .../2020-10-09-10-55-50.bpo-41979.ImXIk2.rst | 1 - .../2020-10-10-13-53-52.bpo-41993.YMzixQ.rst | 2 - .../2020-10-14-16-19-43.bpo-41984.SEtKMr.rst | 2 - .../2020-10-15-21-55-32.bpo-42030.PmU2CA.rst | 3 - .../2020-10-20-04-24-07.bpo-42093.ooZZNh.rst | 2 - .../2020-10-21-14-40-54.bpo-41910.CzBMit.rst | 1 - .../2020-10-23-02-43-24.bpo-42123.64gJWC.rst | 3 - .../2020-10-25-21-14-18.bpo-42150.b70u_T.rst | 2 - .../2020-10-27-18-32-49.bpo-41659.d4a-8o.rst | 3 - .../2020-10-27-21-34-05.bpo-42143.N6KXUO.rst | 2 - .../2020-10-29-12-49-08.bpo-41796.tkGdHq.rst | 2 - .../2020-10-30-13-11-01.bpo-42206.xxssR8.rst | 2 - .../2020-10-30-22-16-30.bpo-42214.lXskM_.rst | 2 - .../2020-10-31-17-50-23.bpo-42218.Dp_Z3v.rst | 3 - .../2020-11-01-21-21-38.bpo-42236.MPx-NK.rst | 2 - .../2020-01-22-05-14-53.bpo-39416.uYjhEm.rst | 1 - .../2020-02-24-09-02-05.bpo-39693.QXw0Fm.rst | 1 - .../2020-10-10-01-36-37.bpo-41805.l-CGv5.rst | 3 - .../2020-10-21-02-21-14.bpo-42010.76vJ0u.rst | 4 - .../2020-10-28-21-39-45.bpo-42061._x-0sg.rst | 1 - .../2020-04-22-09-37-40.bpo-38439.ieXL-c.rst | 2 - .../2020-06-16-12-16-13.bpo-40511.XkihpM.rst | 3 - .../2020-10-24-21-27-37.bpo-33987.fIh9JL.rst | 3 - .../2019-12-05-05-22-49.bpo-38976.5MG7Uu.rst | 4 - .../2020-01-19-18-40-26.bpo-27321.8e6SpM.rst | 2 - .../2020-04-21-17-18-33.bpo-34204.9wXTtY.rst | 2 - .../2020-05-04-12-16-00.bpo-40492.ONk9Na.rst | 3 - .../2020-05-14-16-01-34.bpo-40592.Cmk855.rst | 1 - .../2020-05-31-10-48-47.bpo-4356.P8kXqp.rst | 1 - .../2020-07-08-09-45-00.bpo-16936.z8o8Pn.rst | 1 - .../2020-07-19-20-10-41.bpo-41229.p8rJa2.rst | 3 - .../2020-08-19-08-32-13.bpo-41586.IYjmjK.rst | 2 - .../2020-09-04-17-33-04.bpo-30681.LR4fnY.rst | 2 - .../2020-09-08-23-41-29.bpo-41747.M6wLKv.rst | 3 - .../2020-09-13-02-02-18.bpo-39337.L3NXTt.rst | 1 - .../2020-09-22-11-07-50.bpo-41831.k-Eop_.rst | 3 - .../2020-09-29-16-23-54.bpo-41876.QicdDU.rst | 1 - .../2020-09-30-11-05-11.bpo-23706.dHTGjF.rst | 1 - .../2020-10-01-21-11-03.bpo-41905._JpjR4.rst | 1 - .../2020-10-03-23-14-50.bpo-41923.Buonw9.rst | 1 - .../2020-10-07-18-36-03.bpo-41943.Pt55fT.rst | 1 - .../2020-10-08-18-22-28.bpo-41976.Svm0wb.rst | 3 - .../2020-10-11-21-43-03.bpo-39101.-I49Pm.rst | 1 - .../2020-10-12-21-21-24.bpo-42021.8yv_8-.rst | 1 - .../2020-10-15-17-20-37.bpo-42043.OS0p_v.rst | 4 - .../2020-10-16-07-45-35.bpo-35823.SNQo56.rst | 2 - .../2020-10-16-16-08-04.bpo-28660.eX9pvD.rst | 1 - .../2020-10-16-22-48-01.bpo-19270.jd_gkA.rst | 2 - .../2020-10-17-07-52-53.bpo-41966.gwEQRZ.rst | 2 - .../2020-10-17-23-17-18.bpo-42065.85BsRA.rst | 3 - .../2020-10-19-14-02-09.bpo-41491.d1BUWH.rst | 1 - .../2020-10-19-16-53-19.bpo-42089.R1dthW.rst | 2 - .../2020-10-21-23-45-02.bpo-41052.3N7J2J.rst | 2 - .../2020-10-23-08-54-47.bpo-41490.-Yk6OD.rst | 3 - .../2020-10-23-19-20-14.bpo-42103.C5obK2.rst | 3 - .../2020-10-25-19-25-02.bpo-42146.6A8uvS.rst | 2 - .../2020-10-26-19-08-07.bpo-42157.Bdpa04.rst | 4 - .../2020-10-26-23-29-16.bpo-42157.4wuwTe.rst | 3 - .../2020-10-31-01-16-49.bpo-26789.9BdNAt.rst | 4 - .../2020-10-31-13-28-36.bpo-29566.6aDbty.rst | 1 - .../2020-11-02-01-31-15.bpo-42233.YxRj-h.rst | 3 - .../2020-11-02-14-10-48.bpo-35455.Q1xTIo.rst | 3 - .../2020-10-19-10-56-27.bpo-42051.EU_B7u.rst | 3 - .../2020-10-23-19-19-30.bpo-42103.cILT66.rst | 2 - .../2020-08-03-13-44-37.bpo-41306.VDoWXI.rst | 1 - .../2020-10-05-17-43-46.bpo-41944.rf1dYb.rst | 1 - .../2020-10-08-14-00-17.bpo-41970.aZ8QFf.rst | 2 - .../2020-10-12-00-11-47.bpo-41739.wSCc4K.rst | 2 - .../2020-05-30-02-46-43.bpo-38324.476M-5.rst | 1 - .../2020-08-26-09-35-06.bpo-41557.vt00cQ.rst | 1 - .../2020-09-24-23-09-40.bpo-39107.GbUZvD.rst | 1 - .../2020-10-18-18-43-45.bpo-38252.7Nlepg.rst | 1 - .../2020-10-20-13-19-42.bpo-38439.eMLi-t.rst | 1 - .../2020-10-19-12-25-19.bpo-41471.gwA7un.rst | 1 - README.rst | 2 +- 93 files changed, 1047 insertions(+), 255 deletions(-) create mode 100644 Misc/NEWS.d/3.10.0a2.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-10-21-18-31-54.bpo-38980.xz7BNd.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-09-14-10-17-00.bpo-41784.Yl4gI2.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-09-28-14-31-07.bpo-41756.ZZ5wJG.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-10-09-22-50-46.bpo-41986.JUPE59.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-10-10-14-05-24.bpo-40422.sh8IDY.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-10-11-05-05-53.bpo-41845.ZFvuQM.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-10-11-19-17-44.bpo-40423.GsmgEj.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-10-12-20-13-58.bpo-42015.X4H2_V.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-27-16-08-16.bpo-38605.rcs2uK.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-08-07-13-42-48.bpo-41435.qPWjJA.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-01-22-44-23.bpo-41902.iLoMVF.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-02-11-35-33.bpo-41894.ffmtOt.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-08-09-58-19.bpo-41974.8B-q8O.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-09-10-55-50.bpo-41979.ImXIk2.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-10-13-53-52.bpo-41993.YMzixQ.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-14-16-19-43.bpo-41984.SEtKMr.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-15-21-55-32.bpo-42030.PmU2CA.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-20-04-24-07.bpo-42093.ooZZNh.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-21-14-40-54.bpo-41910.CzBMit.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-23-02-43-24.bpo-42123.64gJWC.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-25-21-14-18.bpo-42150.b70u_T.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-27-18-32-49.bpo-41659.d4a-8o.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-27-21-34-05.bpo-42143.N6KXUO.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-29-12-49-08.bpo-41796.tkGdHq.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-30-13-11-01.bpo-42206.xxssR8.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-30-22-16-30.bpo-42214.lXskM_.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-31-17-50-23.bpo-42218.Dp_Z3v.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-01-21-21-38.bpo-42236.MPx-NK.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-01-22-05-14-53.bpo-39416.uYjhEm.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-02-24-09-02-05.bpo-39693.QXw0Fm.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-10-10-01-36-37.bpo-41805.l-CGv5.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-10-21-02-21-14.bpo-42010.76vJ0u.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-10-28-21-39-45.bpo-42061._x-0sg.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-04-22-09-37-40.bpo-38439.ieXL-c.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-06-16-12-16-13.bpo-40511.XkihpM.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-10-24-21-27-37.bpo-33987.fIh9JL.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-12-05-05-22-49.bpo-38976.5MG7Uu.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-19-18-40-26.bpo-27321.8e6SpM.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-04-21-17-18-33.bpo-34204.9wXTtY.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-14-16-01-34.bpo-40592.Cmk855.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-31-10-48-47.bpo-4356.P8kXqp.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-08-09-45-00.bpo-16936.z8o8Pn.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-19-20-10-41.bpo-41229.p8rJa2.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-19-08-32-13.bpo-41586.IYjmjK.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-04-17-33-04.bpo-30681.LR4fnY.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-08-23-41-29.bpo-41747.M6wLKv.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-13-02-02-18.bpo-39337.L3NXTt.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-22-11-07-50.bpo-41831.k-Eop_.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-29-16-23-54.bpo-41876.QicdDU.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-30-11-05-11.bpo-23706.dHTGjF.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-01-21-11-03.bpo-41905._JpjR4.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-03-23-14-50.bpo-41923.Buonw9.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-07-18-36-03.bpo-41943.Pt55fT.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-12-21-21-24.bpo-42021.8yv_8-.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-15-17-20-37.bpo-42043.OS0p_v.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-16-07-45-35.bpo-35823.SNQo56.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-16-16-08-04.bpo-28660.eX9pvD.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-16-22-48-01.bpo-19270.jd_gkA.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-17-07-52-53.bpo-41966.gwEQRZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-17-23-17-18.bpo-42065.85BsRA.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-19-14-02-09.bpo-41491.d1BUWH.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-19-16-53-19.bpo-42089.R1dthW.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-21-23-45-02.bpo-41052.3N7J2J.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-23-08-54-47.bpo-41490.-Yk6OD.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-25-19-25-02.bpo-42146.6A8uvS.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-26-19-08-07.bpo-42157.Bdpa04.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-26-23-29-16.bpo-42157.4wuwTe.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-31-01-16-49.bpo-26789.9BdNAt.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-31-13-28-36.bpo-29566.6aDbty.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-02-01-31-15.bpo-42233.YxRj-h.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-02-14-10-48.bpo-35455.Q1xTIo.rst delete mode 100644 Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst delete mode 100644 Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-08-03-13-44-37.bpo-41306.VDoWXI.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-10-08-14-00-17.bpo-41970.aZ8QFf.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-10-12-00-11-47.bpo-41739.wSCc4K.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-05-30-02-46-43.bpo-38324.476M-5.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-08-26-09-35-06.bpo-41557.vt00cQ.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-09-24-23-09-40.bpo-39107.GbUZvD.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-10-18-18-43-45.bpo-38252.7Nlepg.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-10-20-13-19-42.bpo-38439.eMLi-t.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-10-19-12-25-19.bpo-41471.gwA7un.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index eeb23af9766700..b9bdc598ebccb9 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 10 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 1 +#define PY_RELEASE_SERIAL 2 /* Version as a string */ -#define PY_VERSION "3.10.0a1+" +#define PY_VERSION "3.10.0a2" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 1fdb1ae859e3e0..b424b1d0f9b224 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Mon Oct 5 18:27:28 2020 +# Autogenerated by Sphinx on Tue Nov 3 00:01:01 2020 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -433,11 +433,9 @@ '\n' 'Execution of Python coroutines can be suspended and resumed at ' 'many\n' - 'points (see *coroutine*). Inside the body of a coroutine ' - 'function,\n' - '"await" and "async" identifiers become reserved keywords; "await"\n' - 'expressions, "async for" and "async with" can only be used in\n' - 'coroutine function bodies.\n' + 'points (see *coroutine*). "await" expressions, "async for" and ' + '"async\n' + 'with" can only be used in the body of a coroutine function.\n' '\n' 'Functions defined with "async def" syntax are always coroutine\n' 'functions, even if they do not contain "await" or "async" ' @@ -453,6 +451,10 @@ ' do_stuff()\n' ' await some_coroutine()\n' '\n' + 'Changed in version 3.7: "await" and "async" are now keywords;\n' + 'previously they were only treated as such inside the body of a\n' + 'coroutine function.\n' + '\n' '\n' 'The "async for" statement\n' '=========================\n' @@ -700,6 +702,11 @@ 'syntax or\n' ' built-in functions. See Special method lookup.\n' '\n' + ' For certain sensitive attribute accesses, raises an ' + 'auditing event\n' + ' "object.__getattr__" with arguments "obj" and ' + '"name".\n' + '\n' 'object.__setattr__(self, name, value)\n' '\n' ' Called when an attribute assignment is attempted. ' @@ -716,6 +723,11 @@ 'for example,\n' ' "object.__setattr__(self, name, value)".\n' '\n' + ' For certain sensitive attribute assignments, raises ' + 'an auditing\n' + ' event "object.__setattr__" with arguments "obj", ' + '"name", "value".\n' + '\n' 'object.__delattr__(self, name)\n' '\n' ' Like "__setattr__()" but for attribute deletion ' @@ -724,6 +736,11 @@ 'obj.name" is\n' ' meaningful for the object.\n' '\n' + ' For certain sensitive attribute deletions, raises an ' + 'auditing event\n' + ' "object.__delattr__" with arguments "obj" and ' + '"name".\n' + '\n' 'object.__dir__(self)\n' '\n' ' Called when "dir()" is called on the object. A ' @@ -1464,8 +1481,8 @@ '\n' ' Called when the instance is “called” as a function; if ' 'this method\n' - ' is defined, "x(arg1, arg2, ...)" is a shorthand for\n' - ' "x.__call__(arg1, arg2, ...)".\n', + ' is defined, "x(arg1, arg2, ...)" roughly translates to\n' + ' "type(x).__call__(x, arg1, ...)".\n', 'calls': 'Calls\n' '*****\n' '\n' @@ -2766,20 +2783,11 @@ 'parameter list. These annotations can be any valid Python ' 'expression.\n' 'The presence of annotations does not change the semantics of a\n' - 'function. The annotation values are available as values of a\n' + 'function. The annotation values are available as string values ' + 'in a\n' 'dictionary keyed by the parameters’ names in the ' '"__annotations__"\n' - 'attribute of the function object. If the "annotations" import ' - 'from\n' - '"__future__" is used, annotations are preserved as strings at ' - 'runtime\n' - 'which enables postponed evaluation. Otherwise, they are ' - 'evaluated\n' - 'when the function definition is executed. In this case ' - 'annotations\n' - 'may be evaluated in a different order than they appear in the ' - 'source\n' - 'code.\n' + 'attribute of the function object.\n' '\n' 'It is also possible to create anonymous functions (functions not ' 'bound\n' @@ -2949,12 +2957,9 @@ '\n' 'Execution of Python coroutines can be suspended and resumed at ' 'many\n' - 'points (see *coroutine*). Inside the body of a coroutine ' - 'function,\n' - '"await" and "async" identifiers become reserved keywords; ' - '"await"\n' - 'expressions, "async for" and "async with" can only be used in\n' - 'coroutine function bodies.\n' + 'points (see *coroutine*). "await" expressions, "async for" and ' + '"async\n' + 'with" can only be used in the body of a coroutine function.\n' '\n' 'Functions defined with "async def" syntax are always coroutine\n' 'functions, even if they do not contain "await" or "async" ' @@ -2970,6 +2975,10 @@ ' do_stuff()\n' ' await some_coroutine()\n' '\n' + 'Changed in version 3.7: "await" and "async" are now keywords;\n' + 'previously they were only treated as such inside the body of a\n' + 'coroutine function.\n' + '\n' '\n' 'The "async for" statement\n' '-------------------------\n' @@ -3461,16 +3470,21 @@ ' on the value to determine if the result is true or ' 'false.\n' '\n' - ' By default, "__ne__()" delegates to "__eq__()" and ' - 'inverts the\n' - ' result unless it is "NotImplemented". There are no ' - 'other implied\n' - ' relationships among the comparison operators, for ' - 'example, the\n' - ' truth of "(x` previously did not show the parameterized types in the +``GenericAlias``. They have now been changed to do so. + +.. + +.. bpo: 29566 +.. date: 2020-10-31-13-28-36 +.. nonce: 6aDbty +.. section: Library + +``binhex.binhex()`` consisently writes macOS 9 line endings. + +.. + +.. bpo: 26789 +.. date: 2020-10-31-01-16-49 +.. nonce: 9BdNAt +.. section: Library + +The :class:`logging.FileHandler` class now keeps a reference to the builtin +:func:`open` function to be able to open or reopen the file during Python +finalization. Fix errors like: ``NameError: name 'open' is not defined``. +Patch by Victor Stinner. + +.. + +.. bpo: 42157 +.. date: 2020-10-26-23-29-16 +.. nonce: 4wuwTe +.. section: Library + +Removed the ``unicodedata.ucnhash_CAPI`` attribute which was an internal +PyCapsule object. The related private ``_PyUnicode_Name_CAPI`` structure was +moved to the internal C API. Patch by Victor Stinner. + +.. + +.. bpo: 42157 +.. date: 2020-10-26-19-08-07 +.. nonce: Bdpa04 +.. section: Library + +Convert the :mod:`unicodedata` extension module to the multiphase +initialization API (:pep:`489`) and convert the ``unicodedata.UCD`` static +type to a heap type. Patch by Mohamed Koubaa and Victor Stinner. + +.. + +.. bpo: 42146 +.. date: 2020-10-25-19-25-02 +.. nonce: 6A8uvS +.. section: Library + +Fix memory leak in :func:`subprocess.Popen` in case an uid (gid) specified +in `user` (`group`, `extra_groups`) overflows `uid_t` (`gid_t`). + +.. + +.. bpo: 42103 +.. date: 2020-10-23-19-20-14 +.. nonce: C5obK2 +.. section: Library + +:exc:`~plistlib.InvalidFileException` and :exc:`RecursionError` are now the +only errors caused by loading malformed binary Plist file (previously +ValueError and TypeError could be raised in some specific cases). + +.. + +.. bpo: 41490 +.. date: 2020-10-23-08-54-47 +.. nonce: -Yk6OD +.. section: Library + +In ``importlib.resources``, ``.path`` method is more aggressive about +releasing handles to zipfile objects early, enabling use-cases like certifi +to leave the context open but delete the underlying zip file. + +.. + +.. bpo: 41052 +.. date: 2020-10-21-23-45-02 +.. nonce: 3N7J2J +.. section: Library + +Pickling heap types implemented in C with protocols 0 and 1 raises now an +error instead of producing incorrect data. + +.. + +.. bpo: 42089 +.. date: 2020-10-19-16-53-19 +.. nonce: R1dthW +.. section: Library + +In ``importlib.metadata.PackageNotFoundError``, make reference to the +package metadata being missing to improve the user experience. + +.. + +.. bpo: 41491 +.. date: 2020-10-19-14-02-09 +.. nonce: d1BUWH +.. section: Library + +plistlib: fix parsing XML plists with hexadecimal integer values + +.. + +.. bpo: 42065 +.. date: 2020-10-17-23-17-18 +.. nonce: 85BsRA +.. section: Library + +Fix an incorrectly formatted error from :meth:`_codecs.charmap_decode` when +called with a mapped value outside the range of valid Unicode code points. +PR by Max Bernstein. + +.. + +.. bpo: 41966 +.. date: 2020-10-17-07-52-53 +.. nonce: gwEQRZ +.. section: Library + +Fix pickling pure Python :class:`datetime.time` subclasses. Patch by Dean +Inwood. + +.. + +.. bpo: 19270 +.. date: 2020-10-16-22-48-01 +.. nonce: jd_gkA +.. section: Library + +:meth:`sched.scheduler.cancel()` will now cancel the correct event, if two +events with same priority are scheduled for the same time. Patch by Bar +Harel. + +.. + +.. bpo: 28660 +.. date: 2020-10-16-16-08-04 +.. nonce: eX9pvD +.. section: Library + +:func:`textwrap.wrap` now attempts to break long words after hyphens when +``break_long_words=True`` and ``break_on_hyphens=True``. + +.. + +.. bpo: 35823 +.. date: 2020-10-16-07-45-35 +.. nonce: SNQo56 +.. section: Library + +Use ``vfork()`` instead of ``fork()`` for :func:`subprocess.Popen` on Linux +to improve performance in cases where it is deemed safe. + +.. + +.. bpo: 42043 +.. date: 2020-10-15-17-20-37 +.. nonce: OS0p_v +.. section: Library + +Add support for ``zipfile.Path`` inheritance. ``zipfile.Path.is_file()`` now +returns False for non-existent names. ``zipfile.Path`` objects now expose a +``.filename`` attribute and rely on that to resolve ``.name`` and +``.parent`` when the ``Path`` object is at the root of the zipfile. + +.. + +.. bpo: 42021 +.. date: 2020-10-12-21-21-24 +.. nonce: 8yv_8- +.. section: Library + +Fix possible ref leaks in :mod:`sqlite3` module init. + +.. + +.. bpo: 39101 +.. date: 2020-10-11-21-43-03 +.. nonce: -I49Pm +.. section: Library + +Fixed tests using IsolatedAsyncioTestCase from hanging on BaseExceptions. + +.. + +.. bpo: 41976 +.. date: 2020-10-08-18-22-28 +.. nonce: Svm0wb +.. section: Library + +Fixed a bug that was causing :func:`ctypes.util.find_library` to return +``None`` when triying to locate a library in an environment when gcc>=9 is +available and ``ldconfig`` is not. Patch by Pablo Galindo + +.. + +.. bpo: 41943 +.. date: 2020-10-07-18-36-03 +.. nonce: Pt55fT +.. section: Library + +Fix bug where TestCase.assertLogs doesn't correctly filter messages by +level. + +.. + +.. bpo: 41923 +.. date: 2020-10-03-23-14-50 +.. nonce: Buonw9 +.. section: Library + +Implement :pep:`613`, introducing :data:`typing.TypeAlias` annotation. + +.. + +.. bpo: 41905 +.. date: 2020-10-01-21-11-03 +.. nonce: _JpjR4 +.. section: Library + +A new function in abc: *update_abstractmethods* to re-calculate an abstract +class's abstract status. In addition, *dataclass* has been changed to call +this function. + +.. + +.. bpo: 23706 +.. date: 2020-09-30-11-05-11 +.. nonce: dHTGjF +.. section: Library + +Added *newline* parameter to ``pathlib.Path.write_text()``. + +.. + +.. bpo: 41876 +.. date: 2020-09-29-16-23-54 +.. nonce: QicdDU +.. section: Library + +Tkinter font class repr uses font name + +.. + +.. bpo: 41831 +.. date: 2020-09-22-11-07-50 +.. nonce: k-Eop_ +.. section: Library + +``str()`` for the ``type`` attribute of the ``tkinter.Event`` object always +returns now the numeric code returned by Tk instead of the name of the event +type. + +.. + +.. bpo: 39337 +.. date: 2020-09-13-02-02-18 +.. nonce: L3NXTt +.. section: Library + +:func:`encodings.normalize_encoding` now ignores non-ASCII characters. + +.. + +.. bpo: 41747 +.. date: 2020-09-08-23-41-29 +.. nonce: M6wLKv +.. section: Library + +Ensure all methods that generated from :func:`dataclasses.dataclass` objects +now have the proper ``__qualname__`` attribute referring to the class they +belong to. Patch by Batuhan Taskaya. + +.. + +.. bpo: 30681 +.. date: 2020-09-04-17-33-04 +.. nonce: LR4fnY +.. section: Library + +Handle exceptions caused by unparseable date headers when using email +"default" policy. Patch by Tim Bell, Georges Toth + +.. + +.. bpo: 41586 +.. date: 2020-08-19-08-32-13 +.. nonce: IYjmjK +.. section: Library + +Add F_SETPIPE_SZ and F_GETPIPE_SZ to fcntl module. Allow setting pipesize on +subprocess.Popen. + +.. + +.. bpo: 41229 +.. date: 2020-07-19-20-10-41 +.. nonce: p8rJa2 +.. section: Library + +Add ``contextlib.aclosing`` for deterministic cleanup of async generators +which is analogous to ``contextlib.closing`` for non-async generators. Patch +by Joongi Kim and John Belmonte. + +.. + +.. bpo: 16936 +.. date: 2020-07-08-09-45-00 +.. nonce: z8o8Pn +.. section: Library + +Allow ``ctypes.wintypes`` to be imported on non-Windows systems. + +.. + +.. bpo: 4356 +.. date: 2020-05-31-10-48-47 +.. nonce: P8kXqp +.. section: Library + +Add a key function to the bisect module. + +.. + +.. bpo: 40592 +.. date: 2020-05-14-16-01-34 +.. nonce: Cmk855 +.. section: Library + +:func:`shutil.which` now ignores empty entries in :envvar:`PATHEXT` instead +of treating them as a match. + +.. + +.. bpo: 40492 +.. date: 2020-05-04-12-16-00 +.. nonce: ONk9Na +.. section: Library + +Fix ``--outfile`` for :mod:`cProfile` / :mod:`profile` not writing the +output file in the original directory when the program being profiled +changes the working directory. PR by Anthony Sottile. + +.. + +.. bpo: 34204 +.. date: 2020-04-21-17-18-33 +.. nonce: 9wXTtY +.. section: Library + +The :mod:`shelve` module now uses :data:`pickle.DEFAULT_PROTOCOL` by default +instead of :mod:`pickle` protocol ``3``. + +.. + +.. bpo: 27321 +.. date: 2020-01-19-18-40-26 +.. nonce: 8e6SpM +.. section: Library + +Fixed KeyError exception when flattening an email to a string attempts to +replace a non-existent Content-Transfer-Encoding header. + +.. + +.. bpo: 38976 +.. date: 2019-12-05-05-22-49 +.. nonce: 5MG7Uu +.. section: Library + +The :mod:`http.cookiejar` module now supports the parsing of cookies in +CURL-style cookiejar files through MozillaCookieJar on all platforms. +Previously, such cookie entries would be silently ignored when loading a +cookiejar with such entries. + +Additionally, the HTTP Only attribute is persisted in the object, and will +be correctly written to file if the MozillaCookieJar object is subsequently +dumped. + +.. + +.. bpo: 42061 +.. date: 2020-10-28-21-39-45 +.. nonce: _x-0sg +.. section: Documentation + +Document __format__ functionality for IP addresses. + +.. + +.. bpo: 42010 +.. date: 2020-10-21-02-21-14 +.. nonce: 76vJ0u +.. section: Documentation + +Clarify that subscription expressions are also valid for certain +:term:`classes ` and :term:`types ` in the standard library, +and for user-defined classes and types if the classmethod +:meth:`__class_getitem__` is provided. + +.. + +.. bpo: 41805 +.. date: 2020-10-10-01-36-37 +.. nonce: l-CGv5 +.. section: Documentation + +Documented :ref:`generic alias type ` and +:data:`types.GenericAlias`. Also added an entry in glossary for +:term:`generic types `. + +.. + +.. bpo: 39693 +.. date: 2020-02-24-09-02-05 +.. nonce: QXw0Fm +.. section: Documentation + +Fix tarfile's extractfile documentation + +.. + +.. bpo: 39416 +.. date: 2020-01-22-05-14-53 +.. nonce: uYjhEm +.. section: Documentation + +Document some restrictions on the default string representations of numeric +classes. + +.. + +.. bpo: 41739 +.. date: 2020-10-12-00-11-47 +.. nonce: wSCc4K +.. section: Tests + +Fix test_logging.test_race_between_set_target_and_flush(): the test now +waits until all threads complete to avoid leaking running threads. + +.. + +.. bpo: 41970 +.. date: 2020-10-08-14-00-17 +.. nonce: aZ8QFf +.. section: Tests + +Avoid a test failure in ``test_lib2to3`` if the module has already imported +at the time the test executes. Patch by Pablo Galindo. + +.. + +.. bpo: 41944 +.. date: 2020-10-05-17-43-46 +.. nonce: rf1dYb +.. section: Tests + +Tests for CJK codecs no longer call ``eval()`` on content received via HTTP. + +.. + +.. bpo: 41306 +.. date: 2020-08-03-13-44-37 +.. nonce: VDoWXI +.. section: Tests + +Fixed a failure in ``test_tk.test_widgets.ScaleTest`` happening when +executing the test with Tk 8.6.10. + +.. + +.. bpo: 38980 +.. date: 2020-10-21-18-31-54 +.. nonce: xz7BNd +.. section: Build + +Add ``-fno-semantic-interposition`` to both the compile and link line when +building with ``--enable-optimizations``. Patch by Victor Stinner and Pablo +Galindo. + +.. + +.. bpo: 38439 +.. date: 2020-10-20-13-19-42 +.. nonce: eMLi-t +.. section: Windows + +Updates the icons for IDLE in the Windows Store package. + +.. + +.. bpo: 38252 +.. date: 2020-10-18-18-43-45 +.. nonce: 7Nlepg +.. section: Windows + +Use 8-byte step to detect ASCII sequence in 64-bit Windows build. + +.. + +.. bpo: 39107 +.. date: 2020-09-24-23-09-40 +.. nonce: GbUZvD +.. section: Windows + +Update Tcl and Tk to 8.6.10 in Windows installer. + +.. + +.. bpo: 41557 +.. date: 2020-08-26-09-35-06 +.. nonce: vt00cQ +.. section: Windows + +Update Windows installer to use SQLite 3.33.0. + +.. + +.. bpo: 38324 +.. date: 2020-05-30-02-46-43 +.. nonce: 476M-5 +.. section: Windows + +Avoid Unicode errors when accessing certain locale data on Windows. + +.. + +.. bpo: 41471 +.. date: 2020-10-19-12-25-19 +.. nonce: gwA7un +.. section: macOS + +Ignore invalid prefix lengths in system proxy excludes. + +.. + +.. bpo: 33987 +.. date: 2020-10-24-21-27-37 +.. nonce: fIh9JL +.. section: IDLE + +Mostly finish using ttk widgets, mainly for editor, settings, and searches. +Some patches by Mark Roseman. + +.. + +.. bpo: 40511 +.. date: 2020-06-16-12-16-13 +.. nonce: XkihpM +.. section: IDLE + +Typing opening and closing parentheses inside the parentheses of a function +call will no longer cause unnecessary "flashing" off and on of an existing +open call-tip, e.g. when typed in a string literal. + +.. + +.. bpo: 38439 +.. date: 2020-04-22-09-37-40 +.. nonce: ieXL-c +.. section: IDLE + +Add a 256×256 pixel IDLE icon to the Windows .ico file. Created by Andrew +Clover. Remove the low-color gif variations from the .ico file. + +.. + +.. bpo: 42157 +.. date: 2020-10-16-10-47-17 +.. nonce: e3BcPM +.. section: C API + +The private ``_PyUnicode_Name_CAPI`` structure of the PyCapsule API +``unicodedata.ucnhash_CAPI`` has been moved to the internal C API. Patch by +Victor Stinner. + +.. + +.. bpo: 42015 +.. date: 2020-10-12-20-13-58 +.. nonce: X4H2_V +.. section: C API + +Fix potential crash in deallocating method objects when dynamically +allocated `PyMethodDef`'s lifetime is managed through the ``self`` argument +of a `PyCFunction`. + +.. + +.. bpo: 40423 +.. date: 2020-10-11-19-17-44 +.. nonce: GsmgEj +.. section: C API + +The :mod:`subprocess` module and ``os.closerange`` will now use the +``close_range(low, high, flags)`` syscall when it is available for more +efficient closing of ranges of descriptors. + +.. + +.. bpo: 41845 +.. date: 2020-10-11-05-05-53 +.. nonce: ZFvuQM +.. section: C API + +:c:func:`PyObject_GenericGetDict` is available again in the limited API when +targeting 3.10 or later. + +.. + +.. bpo: 40422 +.. date: 2020-10-10-14-05-24 +.. nonce: sh8IDY +.. section: C API + +Add `_Py_closerange` function to provide performant closing of a range of +file descriptors. + +.. + +.. bpo: 41986 +.. date: 2020-10-09-22-50-46 +.. nonce: JUPE59 +.. section: C API + +:c:data:`Py_FileSystemDefaultEncodeErrors` and :c:data:`Py_UTF8Mode` are +available again in limited API. + +.. + +.. bpo: 41756 +.. date: 2020-09-28-14-31-07 +.. nonce: ZZ5wJG +.. section: C API + +Add `PyIter_Send` function to allow sending value into +generator/coroutine/iterator without raising StopIteration exception to +signal return. + +.. + +.. bpo: 41784 +.. date: 2020-09-14-10-17-00 +.. nonce: Yl4gI2 +.. section: C API + +Added ``PyUnicode_AsUTF8AndSize`` to the limited C API. diff --git a/Misc/NEWS.d/next/Build/2020-10-21-18-31-54.bpo-38980.xz7BNd.rst b/Misc/NEWS.d/next/Build/2020-10-21-18-31-54.bpo-38980.xz7BNd.rst deleted file mode 100644 index c9d34cf12c292c..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-10-21-18-31-54.bpo-38980.xz7BNd.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add ``-fno-semantic-interposition`` to both the compile and link line when -building with ``--enable-optimizations``. Patch by Victor Stinner and Pablo -Galindo. diff --git a/Misc/NEWS.d/next/C API/2020-09-14-10-17-00.bpo-41784.Yl4gI2.rst b/Misc/NEWS.d/next/C API/2020-09-14-10-17-00.bpo-41784.Yl4gI2.rst deleted file mode 100644 index f09e0879ad1945..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-09-14-10-17-00.bpo-41784.Yl4gI2.rst +++ /dev/null @@ -1 +0,0 @@ -Added ``PyUnicode_AsUTF8AndSize`` to the limited C API. diff --git a/Misc/NEWS.d/next/C API/2020-09-28-14-31-07.bpo-41756.ZZ5wJG.rst b/Misc/NEWS.d/next/C API/2020-09-28-14-31-07.bpo-41756.ZZ5wJG.rst deleted file mode 100644 index f7e27b44015296..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-09-28-14-31-07.bpo-41756.ZZ5wJG.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add `PyIter_Send` function to allow sending value into -generator/coroutine/iterator without raising StopIteration exception to -signal return. diff --git a/Misc/NEWS.d/next/C API/2020-10-09-22-50-46.bpo-41986.JUPE59.rst b/Misc/NEWS.d/next/C API/2020-10-09-22-50-46.bpo-41986.JUPE59.rst deleted file mode 100644 index d456ba66bafd61..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-10-09-22-50-46.bpo-41986.JUPE59.rst +++ /dev/null @@ -1,2 +0,0 @@ -:c:data:`Py_FileSystemDefaultEncodeErrors` and :c:data:`Py_UTF8Mode` are -available again in limited API. diff --git a/Misc/NEWS.d/next/C API/2020-10-10-14-05-24.bpo-40422.sh8IDY.rst b/Misc/NEWS.d/next/C API/2020-10-10-14-05-24.bpo-40422.sh8IDY.rst deleted file mode 100644 index 1b6d9e034b5296..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-10-10-14-05-24.bpo-40422.sh8IDY.rst +++ /dev/null @@ -1 +0,0 @@ -Add `_Py_closerange` function to provide performant closing of a range of file descriptors. \ No newline at end of file diff --git a/Misc/NEWS.d/next/C API/2020-10-11-05-05-53.bpo-41845.ZFvuQM.rst b/Misc/NEWS.d/next/C API/2020-10-11-05-05-53.bpo-41845.ZFvuQM.rst deleted file mode 100644 index 31d3154c3c60e9..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-10-11-05-05-53.bpo-41845.ZFvuQM.rst +++ /dev/null @@ -1,2 +0,0 @@ -:c:func:`PyObject_GenericGetDict` is available again in the limited API -when targeting 3.10 or later. diff --git a/Misc/NEWS.d/next/C API/2020-10-11-19-17-44.bpo-40423.GsmgEj.rst b/Misc/NEWS.d/next/C API/2020-10-11-19-17-44.bpo-40423.GsmgEj.rst deleted file mode 100644 index 44e571ebf86daf..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-10-11-19-17-44.bpo-40423.GsmgEj.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :mod:`subprocess` module and ``os.closerange`` will now use the -``close_range(low, high, flags)`` syscall when it is available for more -efficient closing of ranges of descriptors. \ No newline at end of file diff --git a/Misc/NEWS.d/next/C API/2020-10-12-20-13-58.bpo-42015.X4H2_V.rst b/Misc/NEWS.d/next/C API/2020-10-12-20-13-58.bpo-42015.X4H2_V.rst deleted file mode 100644 index d77619f64bb178..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-10-12-20-13-58.bpo-42015.X4H2_V.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix potential crash in deallocating method objects when dynamically -allocated `PyMethodDef`'s lifetime is managed through the ``self`` -argument of a `PyCFunction`. diff --git a/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst b/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst deleted file mode 100644 index 65a56188fa0ad0..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-10-16-10-47-17.bpo-42157.e3BcPM.rst +++ /dev/null @@ -1,3 +0,0 @@ -The private ``_PyUnicode_Name_CAPI`` structure of the PyCapsule API -``unicodedata.ucnhash_CAPI`` has been moved to the internal C API. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-27-16-08-16.bpo-38605.rcs2uK.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-27-16-08-16.bpo-38605.rcs2uK.rst deleted file mode 100644 index cbfe6e23523bbe..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-05-27-16-08-16.bpo-38605.rcs2uK.rst +++ /dev/null @@ -1,3 +0,0 @@ -Enable ``from __future__ import annotations`` (:pep:`563`) by default. -The values found in :attr:`__annotations__` dicts are now strings, e.g. -``{"x": "int"}`` instead of ``{"x": int}``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-07-13-42-48.bpo-41435.qPWjJA.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-07-13-42-48.bpo-41435.qPWjJA.rst deleted file mode 100644 index d2978f9b4ec028..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-08-07-13-42-48.bpo-41435.qPWjJA.rst +++ /dev/null @@ -1 +0,0 @@ -Add `sys._current_exceptions()` function to retrieve a dictionary mapping each thread's identifier to the topmost exception currently active in that thread at the time the function is called. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-01-22-44-23.bpo-41902.iLoMVF.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-01-22-44-23.bpo-41902.iLoMVF.rst deleted file mode 100644 index 738ef5aec95039..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-01-22-44-23.bpo-41902.iLoMVF.rst +++ /dev/null @@ -1 +0,0 @@ -Micro optimization for range.index if step is 1. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-02-11-35-33.bpo-41894.ffmtOt.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-02-11-35-33.bpo-41894.ffmtOt.rst deleted file mode 100644 index 571f5dae1a4a1a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-02-11-35-33.bpo-41894.ffmtOt.rst +++ /dev/null @@ -1,3 +0,0 @@ -When loading a native module and a load failure occurs, prevent a possible -UnicodeDecodeError when not running in a UTF-8 locale by decoding the load -error message using the current locale's encoding. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst deleted file mode 100644 index b118a6a36fae3f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst +++ /dev/null @@ -1,3 +0,0 @@ -Micro optimization when compute :c:member:`~PySequenceMethods.sq_item` and -:c:member:`~PyMappingMethods.mp_subscript` of :class:`range`. Patch by -Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-08-09-58-19.bpo-41974.8B-q8O.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-08-09-58-19.bpo-41974.8B-q8O.rst deleted file mode 100644 index 034cfede84b8ad..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-08-09-58-19.bpo-41974.8B-q8O.rst +++ /dev/null @@ -1,4 +0,0 @@ -Removed special methods ``__int__``, ``__float__``, ``__floordiv__``, -``__mod__``, ``__divmod__``, ``__rfloordiv__``, ``__rmod__`` and -``__rdivmod__`` of the :class:`complex` class. They always raised -a :exc:`TypeError`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-09-10-55-50.bpo-41979.ImXIk2.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-09-10-55-50.bpo-41979.ImXIk2.rst deleted file mode 100644 index 3250309ca22cd3..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-09-10-55-50.bpo-41979.ImXIk2.rst +++ /dev/null @@ -1 +0,0 @@ -Star-unpacking is now allowed for with item's targets in the PEG parser. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-10-13-53-52.bpo-41993.YMzixQ.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-10-13-53-52.bpo-41993.YMzixQ.rst deleted file mode 100644 index 3669cf11ea4cd3..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-10-13-53-52.bpo-41993.YMzixQ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed potential issues with removing not completely initialized module from -``sys.modules`` when import fails. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-14-16-19-43.bpo-41984.SEtKMr.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-14-16-19-43.bpo-41984.SEtKMr.rst deleted file mode 100644 index e70d5dc2b8ddec..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-14-16-19-43.bpo-41984.SEtKMr.rst +++ /dev/null @@ -1,2 +0,0 @@ -The garbage collector now tracks all user-defined classes. Patch by Brandt -Bucher. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-15-21-55-32.bpo-42030.PmU2CA.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-15-21-55-32.bpo-42030.PmU2CA.rst deleted file mode 100644 index e8c691d809614f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-15-21-55-32.bpo-42030.PmU2CA.rst +++ /dev/null @@ -1,3 +0,0 @@ -Support for the legacy AIX-specific shared library loading support has been -removed. All versions of AIX since 4.3 have supported and defaulted to using -the common Unix mechanism instead. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-20-04-24-07.bpo-42093.ooZZNh.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-20-04-24-07.bpo-42093.ooZZNh.rst deleted file mode 100644 index 36a12c1c1cb58a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-20-04-24-07.bpo-42093.ooZZNh.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``LOAD_ATTR`` instruction now uses new "per opcode cache" mechanism and -it is about 36% faster now. Patch by Pablo Galindo and Yury Selivanov. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-21-14-40-54.bpo-41910.CzBMit.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-21-14-40-54.bpo-41910.CzBMit.rst deleted file mode 100644 index a40e2519a62c6a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-21-14-40-54.bpo-41910.CzBMit.rst +++ /dev/null @@ -1 +0,0 @@ -Document the default implementation of `object.__eq__`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-23-02-43-24.bpo-42123.64gJWC.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-23-02-43-24.bpo-42123.64gJWC.rst deleted file mode 100644 index 6461efd76f0f97..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-23-02-43-24.bpo-42123.64gJWC.rst +++ /dev/null @@ -1,3 +0,0 @@ -Run the parser two times. On the first run, disable all the rules that only -generate better error messages to gain performance. If there's a parse -failure, run the parser a second time with those enabled. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-25-21-14-18.bpo-42150.b70u_T.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-25-21-14-18.bpo-42150.b70u_T.rst deleted file mode 100644 index 62fabb857aa380..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-25-21-14-18.bpo-42150.b70u_T.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix possible buffer overflow in the new parser when checking for -continuation lines. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-27-18-32-49.bpo-41659.d4a-8o.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-27-18-32-49.bpo-41659.d4a-8o.rst deleted file mode 100644 index 038749a7b16c9d..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-27-18-32-49.bpo-41659.d4a-8o.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a bug in the parser, where a curly brace following a `primary` didn't fail immediately. -This led to invalid expressions like `a {b}` to throw a :exc:`SyntaxError` with a wrong offset, -or invalid expressions ending with a curly brace like `a {` to not fail immediately in the REPL. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-27-21-34-05.bpo-42143.N6KXUO.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-27-21-34-05.bpo-42143.N6KXUO.rst deleted file mode 100644 index 2b16e69da73b5f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-27-21-34-05.bpo-42143.N6KXUO.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix handling of errors during creation of ``PyFunctionObject``, which resulted -in operations on uninitialized memory. Patch by Yonatan Goldschmidt. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-29-12-49-08.bpo-41796.tkGdHq.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-29-12-49-08.bpo-41796.tkGdHq.rst deleted file mode 100644 index b3ac08edd84fcd..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-29-12-49-08.bpo-41796.tkGdHq.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :mod:`ast` module internal state is now per interpreter. Patch by Victor -Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-30-13-11-01.bpo-42206.xxssR8.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-30-13-11-01.bpo-42206.xxssR8.rst deleted file mode 100644 index b9eb135fec5e9c..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-30-13-11-01.bpo-42206.xxssR8.rst +++ /dev/null @@ -1,2 +0,0 @@ -Propagate and raise the errors caused by :c:func:`PyAST_Validate` in the -parser. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-30-22-16-30.bpo-42214.lXskM_.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-30-22-16-30.bpo-42214.lXskM_.rst deleted file mode 100644 index 3f85bbe83901a0..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-30-22-16-30.bpo-42214.lXskM_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a possible crash in the PEG parser when checking for the '!=' token in -the ``barry_as_flufl`` rule. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-31-17-50-23.bpo-42218.Dp_Z3v.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-31-17-50-23.bpo-42218.Dp_Z3v.rst deleted file mode 100644 index a38a310e4b45b8..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-31-17-50-23.bpo-42218.Dp_Z3v.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed a bug in the PEG parser that was causing crashes in debug mode. Now errors are checked -in left-recursive rules to avoid cases where such errors do not get handled in time and appear -as long-distance crashes in other places. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-01-21-21-38.bpo-42236.MPx-NK.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-01-21-21-38.bpo-42236.MPx-NK.rst deleted file mode 100644 index 22e8c534ff89d7..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-01-21-21-38.bpo-42236.MPx-NK.rst +++ /dev/null @@ -1,2 +0,0 @@ -If the ``nl_langinfo(CODESET)`` function returns an empty string, Python now -uses UTF-8 as the filesystem encoding. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Documentation/2020-01-22-05-14-53.bpo-39416.uYjhEm.rst b/Misc/NEWS.d/next/Documentation/2020-01-22-05-14-53.bpo-39416.uYjhEm.rst deleted file mode 100644 index 279a5f18ff855e..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-01-22-05-14-53.bpo-39416.uYjhEm.rst +++ /dev/null @@ -1 +0,0 @@ -Document some restrictions on the default string representations of numeric classes. diff --git a/Misc/NEWS.d/next/Documentation/2020-02-24-09-02-05.bpo-39693.QXw0Fm.rst b/Misc/NEWS.d/next/Documentation/2020-02-24-09-02-05.bpo-39693.QXw0Fm.rst deleted file mode 100644 index 86049c536815b9..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-02-24-09-02-05.bpo-39693.QXw0Fm.rst +++ /dev/null @@ -1 +0,0 @@ -Fix tarfile's extractfile documentation diff --git a/Misc/NEWS.d/next/Documentation/2020-10-10-01-36-37.bpo-41805.l-CGv5.rst b/Misc/NEWS.d/next/Documentation/2020-10-10-01-36-37.bpo-41805.l-CGv5.rst deleted file mode 100644 index 9c9134350a3176..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-10-10-01-36-37.bpo-41805.l-CGv5.rst +++ /dev/null @@ -1,3 +0,0 @@ -Documented :ref:`generic alias type ` and -:data:`types.GenericAlias`. Also added an entry in glossary for -:term:`generic types `. diff --git a/Misc/NEWS.d/next/Documentation/2020-10-21-02-21-14.bpo-42010.76vJ0u.rst b/Misc/NEWS.d/next/Documentation/2020-10-21-02-21-14.bpo-42010.76vJ0u.rst deleted file mode 100644 index 2a0cbf10757837..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-10-21-02-21-14.bpo-42010.76vJ0u.rst +++ /dev/null @@ -1,4 +0,0 @@ -Clarify that subscription expressions are also valid for certain -:term:`classes ` and :term:`types ` in the standard library, and -for user-defined classes and types if the classmethod -:meth:`__class_getitem__` is provided. diff --git a/Misc/NEWS.d/next/Documentation/2020-10-28-21-39-45.bpo-42061._x-0sg.rst b/Misc/NEWS.d/next/Documentation/2020-10-28-21-39-45.bpo-42061._x-0sg.rst deleted file mode 100644 index b38bb84350171e..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-10-28-21-39-45.bpo-42061._x-0sg.rst +++ /dev/null @@ -1 +0,0 @@ -Document __format__ functionality for IP addresses. \ No newline at end of file diff --git a/Misc/NEWS.d/next/IDLE/2020-04-22-09-37-40.bpo-38439.ieXL-c.rst b/Misc/NEWS.d/next/IDLE/2020-04-22-09-37-40.bpo-38439.ieXL-c.rst deleted file mode 100644 index d8d59015f20e3d..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-04-22-09-37-40.bpo-38439.ieXL-c.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a 256×256 pixel IDLE icon to the Windows .ico file. Created by Andrew -Clover. Remove the low-color gif variations from the .ico file. diff --git a/Misc/NEWS.d/next/IDLE/2020-06-16-12-16-13.bpo-40511.XkihpM.rst b/Misc/NEWS.d/next/IDLE/2020-06-16-12-16-13.bpo-40511.XkihpM.rst deleted file mode 100644 index cc967981381769..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-06-16-12-16-13.bpo-40511.XkihpM.rst +++ /dev/null @@ -1,3 +0,0 @@ -Typing opening and closing parentheses inside the parentheses of a function -call will no longer cause unnecessary "flashing" off and on of an existing -open call-tip, e.g. when typed in a string literal. diff --git a/Misc/NEWS.d/next/IDLE/2020-10-24-21-27-37.bpo-33987.fIh9JL.rst b/Misc/NEWS.d/next/IDLE/2020-10-24-21-27-37.bpo-33987.fIh9JL.rst deleted file mode 100644 index 1e67edc03c658d..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-10-24-21-27-37.bpo-33987.fIh9JL.rst +++ /dev/null @@ -1,3 +0,0 @@ -Mostly finish using ttk widgets, mainly for editor, settings, -and searches. Some patches by Mark Roseman. - diff --git a/Misc/NEWS.d/next/Library/2019-12-05-05-22-49.bpo-38976.5MG7Uu.rst b/Misc/NEWS.d/next/Library/2019-12-05-05-22-49.bpo-38976.5MG7Uu.rst deleted file mode 100644 index 7a48943a6c6cc7..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-05-05-22-49.bpo-38976.5MG7Uu.rst +++ /dev/null @@ -1,4 +0,0 @@ -The :mod:`http.cookiejar` module now supports the parsing of cookies in CURL-style cookiejar files through MozillaCookieJar -on all platforms. Previously, such cookie entries would be silently ignored when loading a cookiejar with such entries. - -Additionally, the HTTP Only attribute is persisted in the object, and will be correctly written to file if the MozillaCookieJar object is subsequently dumped. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-01-19-18-40-26.bpo-27321.8e6SpM.rst b/Misc/NEWS.d/next/Library/2020-01-19-18-40-26.bpo-27321.8e6SpM.rst deleted file mode 100644 index 28acf7f6ef919c..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-19-18-40-26.bpo-27321.8e6SpM.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed KeyError exception when flattening an email to a string attempts to -replace a non-existent Content-Transfer-Encoding header. diff --git a/Misc/NEWS.d/next/Library/2020-04-21-17-18-33.bpo-34204.9wXTtY.rst b/Misc/NEWS.d/next/Library/2020-04-21-17-18-33.bpo-34204.9wXTtY.rst deleted file mode 100644 index bce6d39148a376..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-04-21-17-18-33.bpo-34204.9wXTtY.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :mod:`shelve` module now uses :data:`pickle.DEFAULT_PROTOCOL` by default -instead of :mod:`pickle` protocol ``3``. diff --git a/Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst b/Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst deleted file mode 100644 index 86bc08c79e21e2..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix ``--outfile`` for :mod:`cProfile` / :mod:`profile` not writing the output -file in the original directory when the program being profiled changes the -working directory. PR by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Library/2020-05-14-16-01-34.bpo-40592.Cmk855.rst b/Misc/NEWS.d/next/Library/2020-05-14-16-01-34.bpo-40592.Cmk855.rst deleted file mode 100644 index 3211a1bc345fa5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-14-16-01-34.bpo-40592.Cmk855.rst +++ /dev/null @@ -1 +0,0 @@ -:func:`shutil.which` now ignores empty entries in :envvar:`PATHEXT` instead of treating them as a match. diff --git a/Misc/NEWS.d/next/Library/2020-05-31-10-48-47.bpo-4356.P8kXqp.rst b/Misc/NEWS.d/next/Library/2020-05-31-10-48-47.bpo-4356.P8kXqp.rst deleted file mode 100644 index f5211d8a76f74d..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-31-10-48-47.bpo-4356.P8kXqp.rst +++ /dev/null @@ -1 +0,0 @@ -Add a key function to the bisect module. diff --git a/Misc/NEWS.d/next/Library/2020-07-08-09-45-00.bpo-16936.z8o8Pn.rst b/Misc/NEWS.d/next/Library/2020-07-08-09-45-00.bpo-16936.z8o8Pn.rst deleted file mode 100644 index c76db4eedecff1..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-08-09-45-00.bpo-16936.z8o8Pn.rst +++ /dev/null @@ -1 +0,0 @@ -Allow ``ctypes.wintypes`` to be imported on non-Windows systems. diff --git a/Misc/NEWS.d/next/Library/2020-07-19-20-10-41.bpo-41229.p8rJa2.rst b/Misc/NEWS.d/next/Library/2020-07-19-20-10-41.bpo-41229.p8rJa2.rst deleted file mode 100644 index 926133221d4179..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-19-20-10-41.bpo-41229.p8rJa2.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add ``contextlib.aclosing`` for deterministic cleanup of async generators -which is analogous to ``contextlib.closing`` for non-async generators. -Patch by Joongi Kim and John Belmonte. diff --git a/Misc/NEWS.d/next/Library/2020-08-19-08-32-13.bpo-41586.IYjmjK.rst b/Misc/NEWS.d/next/Library/2020-08-19-08-32-13.bpo-41586.IYjmjK.rst deleted file mode 100644 index 40461679ebdfeb..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-19-08-32-13.bpo-41586.IYjmjK.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add F_SETPIPE_SZ and F_GETPIPE_SZ to fcntl module. Allow setting pipesize on -subprocess.Popen. diff --git a/Misc/NEWS.d/next/Library/2020-09-04-17-33-04.bpo-30681.LR4fnY.rst b/Misc/NEWS.d/next/Library/2020-09-04-17-33-04.bpo-30681.LR4fnY.rst deleted file mode 100644 index 83830e343da66f..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-04-17-33-04.bpo-30681.LR4fnY.rst +++ /dev/null @@ -1,2 +0,0 @@ -Handle exceptions caused by unparseable date headers when using email -"default" policy. Patch by Tim Bell, Georges Toth diff --git a/Misc/NEWS.d/next/Library/2020-09-08-23-41-29.bpo-41747.M6wLKv.rst b/Misc/NEWS.d/next/Library/2020-09-08-23-41-29.bpo-41747.M6wLKv.rst deleted file mode 100644 index 0869462f5bf9d5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-08-23-41-29.bpo-41747.M6wLKv.rst +++ /dev/null @@ -1,3 +0,0 @@ -Ensure all methods that generated from :func:`dataclasses.dataclass` -objects now have the proper ``__qualname__`` attribute referring to -the class they belong to. Patch by Batuhan Taskaya. diff --git a/Misc/NEWS.d/next/Library/2020-09-13-02-02-18.bpo-39337.L3NXTt.rst b/Misc/NEWS.d/next/Library/2020-09-13-02-02-18.bpo-39337.L3NXTt.rst deleted file mode 100644 index c2b4dbe4d12e8e..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-13-02-02-18.bpo-39337.L3NXTt.rst +++ /dev/null @@ -1 +0,0 @@ -:func:`encodings.normalize_encoding` now ignores non-ASCII characters. diff --git a/Misc/NEWS.d/next/Library/2020-09-22-11-07-50.bpo-41831.k-Eop_.rst b/Misc/NEWS.d/next/Library/2020-09-22-11-07-50.bpo-41831.k-Eop_.rst deleted file mode 100644 index 84a3f5253a0604..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-22-11-07-50.bpo-41831.k-Eop_.rst +++ /dev/null @@ -1,3 +0,0 @@ -``str()`` for the ``type`` attribute of the ``tkinter.Event`` object always -returns now the numeric code returned by Tk instead of the name of the event -type. diff --git a/Misc/NEWS.d/next/Library/2020-09-29-16-23-54.bpo-41876.QicdDU.rst b/Misc/NEWS.d/next/Library/2020-09-29-16-23-54.bpo-41876.QicdDU.rst deleted file mode 100644 index d4f5f0a37bf484..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-29-16-23-54.bpo-41876.QicdDU.rst +++ /dev/null @@ -1 +0,0 @@ -Tkinter font class repr uses font name \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-09-30-11-05-11.bpo-23706.dHTGjF.rst b/Misc/NEWS.d/next/Library/2020-09-30-11-05-11.bpo-23706.dHTGjF.rst deleted file mode 100644 index b9a69a55e6a8de..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-30-11-05-11.bpo-23706.dHTGjF.rst +++ /dev/null @@ -1 +0,0 @@ -Added *newline* parameter to ``pathlib.Path.write_text()``. diff --git a/Misc/NEWS.d/next/Library/2020-10-01-21-11-03.bpo-41905._JpjR4.rst b/Misc/NEWS.d/next/Library/2020-10-01-21-11-03.bpo-41905._JpjR4.rst deleted file mode 100644 index 0d8c0ba6a66bd1..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-01-21-11-03.bpo-41905._JpjR4.rst +++ /dev/null @@ -1 +0,0 @@ -A new function in abc: *update_abstractmethods* to re-calculate an abstract class's abstract status. In addition, *dataclass* has been changed to call this function. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-10-03-23-14-50.bpo-41923.Buonw9.rst b/Misc/NEWS.d/next/Library/2020-10-03-23-14-50.bpo-41923.Buonw9.rst deleted file mode 100644 index dd9a1f709f33ff..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-03-23-14-50.bpo-41923.Buonw9.rst +++ /dev/null @@ -1 +0,0 @@ -Implement :pep:`613`, introducing :data:`typing.TypeAlias` annotation. diff --git a/Misc/NEWS.d/next/Library/2020-10-07-18-36-03.bpo-41943.Pt55fT.rst b/Misc/NEWS.d/next/Library/2020-10-07-18-36-03.bpo-41943.Pt55fT.rst deleted file mode 100644 index 3a7874d25aef06..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-07-18-36-03.bpo-41943.Pt55fT.rst +++ /dev/null @@ -1 +0,0 @@ -Fix bug where TestCase.assertLogs doesn't correctly filter messages by level. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst b/Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst deleted file mode 100644 index c8b3fc771845e3..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed a bug that was causing :func:`ctypes.util.find_library` to return -``None`` when triying to locate a library in an environment when gcc>=9 is -available and ``ldconfig`` is not. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst b/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst deleted file mode 100644 index a571e8343cde12..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed tests using IsolatedAsyncioTestCase from hanging on BaseExceptions. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-10-12-21-21-24.bpo-42021.8yv_8-.rst b/Misc/NEWS.d/next/Library/2020-10-12-21-21-24.bpo-42021.8yv_8-.rst deleted file mode 100644 index 7d71e9a70079b9..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-12-21-21-24.bpo-42021.8yv_8-.rst +++ /dev/null @@ -1 +0,0 @@ -Fix possible ref leaks in :mod:`sqlite3` module init. diff --git a/Misc/NEWS.d/next/Library/2020-10-15-17-20-37.bpo-42043.OS0p_v.rst b/Misc/NEWS.d/next/Library/2020-10-15-17-20-37.bpo-42043.OS0p_v.rst deleted file mode 100644 index b6b296956c35d3..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-15-17-20-37.bpo-42043.OS0p_v.rst +++ /dev/null @@ -1,4 +0,0 @@ -Add support for ``zipfile.Path`` inheritance. ``zipfile.Path.is_file()`` now -returns False for non-existent names. ``zipfile.Path`` objects now expose a -``.filename`` attribute and rely on that to resolve ``.name`` and -``.parent`` when the ``Path`` object is at the root of the zipfile. diff --git a/Misc/NEWS.d/next/Library/2020-10-16-07-45-35.bpo-35823.SNQo56.rst b/Misc/NEWS.d/next/Library/2020-10-16-07-45-35.bpo-35823.SNQo56.rst deleted file mode 100644 index cd428d36960c93..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-16-07-45-35.bpo-35823.SNQo56.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use ``vfork()`` instead of ``fork()`` for :func:`subprocess.Popen` on Linux -to improve performance in cases where it is deemed safe. diff --git a/Misc/NEWS.d/next/Library/2020-10-16-16-08-04.bpo-28660.eX9pvD.rst b/Misc/NEWS.d/next/Library/2020-10-16-16-08-04.bpo-28660.eX9pvD.rst deleted file mode 100644 index d67993492f9ffe..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-16-16-08-04.bpo-28660.eX9pvD.rst +++ /dev/null @@ -1 +0,0 @@ -:func:`textwrap.wrap` now attempts to break long words after hyphens when ``break_long_words=True`` and ``break_on_hyphens=True``. diff --git a/Misc/NEWS.d/next/Library/2020-10-16-22-48-01.bpo-19270.jd_gkA.rst b/Misc/NEWS.d/next/Library/2020-10-16-22-48-01.bpo-19270.jd_gkA.rst deleted file mode 100644 index 6330a91a44c544..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-16-22-48-01.bpo-19270.jd_gkA.rst +++ /dev/null @@ -1,2 +0,0 @@ -:meth:`sched.scheduler.cancel()` will now cancel the correct event, if two -events with same priority are scheduled for the same time. Patch by Bar Harel. diff --git a/Misc/NEWS.d/next/Library/2020-10-17-07-52-53.bpo-41966.gwEQRZ.rst b/Misc/NEWS.d/next/Library/2020-10-17-07-52-53.bpo-41966.gwEQRZ.rst deleted file mode 100644 index 0e7fad40077be0..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-17-07-52-53.bpo-41966.gwEQRZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix pickling pure Python :class:`datetime.time` subclasses. Patch by Dean -Inwood. diff --git a/Misc/NEWS.d/next/Library/2020-10-17-23-17-18.bpo-42065.85BsRA.rst b/Misc/NEWS.d/next/Library/2020-10-17-23-17-18.bpo-42065.85BsRA.rst deleted file mode 100644 index 83c86c0799ebfa..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-17-23-17-18.bpo-42065.85BsRA.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix an incorrectly formatted error from :meth:`_codecs.charmap_decode` when -called with a mapped value outside the range of valid Unicode code points. -PR by Max Bernstein. diff --git a/Misc/NEWS.d/next/Library/2020-10-19-14-02-09.bpo-41491.d1BUWH.rst b/Misc/NEWS.d/next/Library/2020-10-19-14-02-09.bpo-41491.d1BUWH.rst deleted file mode 100644 index 4f39c91b284fac..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-19-14-02-09.bpo-41491.d1BUWH.rst +++ /dev/null @@ -1 +0,0 @@ -plistlib: fix parsing XML plists with hexadecimal integer values diff --git a/Misc/NEWS.d/next/Library/2020-10-19-16-53-19.bpo-42089.R1dthW.rst b/Misc/NEWS.d/next/Library/2020-10-19-16-53-19.bpo-42089.R1dthW.rst deleted file mode 100644 index 3f3affd1a7df73..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-19-16-53-19.bpo-42089.R1dthW.rst +++ /dev/null @@ -1,2 +0,0 @@ -In ``importlib.metadata.PackageNotFoundError``, make reference to the -package metadata being missing to improve the user experience. diff --git a/Misc/NEWS.d/next/Library/2020-10-21-23-45-02.bpo-41052.3N7J2J.rst b/Misc/NEWS.d/next/Library/2020-10-21-23-45-02.bpo-41052.3N7J2J.rst deleted file mode 100644 index 528e90ed13493c..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-21-23-45-02.bpo-41052.3N7J2J.rst +++ /dev/null @@ -1,2 +0,0 @@ -Pickling heap types implemented in C with protocols 0 and 1 raises now an -error instead of producing incorrect data. diff --git a/Misc/NEWS.d/next/Library/2020-10-23-08-54-47.bpo-41490.-Yk6OD.rst b/Misc/NEWS.d/next/Library/2020-10-23-08-54-47.bpo-41490.-Yk6OD.rst deleted file mode 100644 index 5ad6af3d148e3c..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-23-08-54-47.bpo-41490.-Yk6OD.rst +++ /dev/null @@ -1,3 +0,0 @@ -In ``importlib.resources``, ``.path`` method is more aggressive about -releasing handles to zipfile objects early, enabling use-cases like certifi -to leave the context open but delete the underlying zip file. diff --git a/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst b/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst deleted file mode 100644 index 4eb694c16a0633..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst +++ /dev/null @@ -1,3 +0,0 @@ -:exc:`~plistlib.InvalidFileException` and :exc:`RecursionError` are now -the only errors caused by loading malformed binary Plist file (previously -ValueError and TypeError could be raised in some specific cases). diff --git a/Misc/NEWS.d/next/Library/2020-10-25-19-25-02.bpo-42146.6A8uvS.rst b/Misc/NEWS.d/next/Library/2020-10-25-19-25-02.bpo-42146.6A8uvS.rst deleted file mode 100644 index 041809803db6a2..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-25-19-25-02.bpo-42146.6A8uvS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix memory leak in :func:`subprocess.Popen` in case an uid (gid) specified in -`user` (`group`, `extra_groups`) overflows `uid_t` (`gid_t`). diff --git a/Misc/NEWS.d/next/Library/2020-10-26-19-08-07.bpo-42157.Bdpa04.rst b/Misc/NEWS.d/next/Library/2020-10-26-19-08-07.bpo-42157.Bdpa04.rst deleted file mode 100644 index 68778906bbbf36..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-26-19-08-07.bpo-42157.Bdpa04.rst +++ /dev/null @@ -1,4 +0,0 @@ -Convert the :mod:`unicodedata` extension module to the multiphase -initialization API (:pep:`489`) and convert the ``unicodedata.UCD`` -static type to a heap type. -Patch by Mohamed Koubaa and Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2020-10-26-23-29-16.bpo-42157.4wuwTe.rst b/Misc/NEWS.d/next/Library/2020-10-26-23-29-16.bpo-42157.4wuwTe.rst deleted file mode 100644 index 39365677ecd19a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-26-23-29-16.bpo-42157.4wuwTe.rst +++ /dev/null @@ -1,3 +0,0 @@ -Removed the ``unicodedata.ucnhash_CAPI`` attribute which was an internal -PyCapsule object. The related private ``_PyUnicode_Name_CAPI`` structure was -moved to the internal C API. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2020-10-31-01-16-49.bpo-26789.9BdNAt.rst b/Misc/NEWS.d/next/Library/2020-10-31-01-16-49.bpo-26789.9BdNAt.rst deleted file mode 100644 index d8832401c932b2..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-31-01-16-49.bpo-26789.9BdNAt.rst +++ /dev/null @@ -1,4 +0,0 @@ -The :class:`logging.FileHandler` class now keeps a reference to the builtin -:func:`open` function to be able to open or reopen the file during Python -finalization. Fix errors like: ``NameError: name 'open' is not defined``. Patch -by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2020-10-31-13-28-36.bpo-29566.6aDbty.rst b/Misc/NEWS.d/next/Library/2020-10-31-13-28-36.bpo-29566.6aDbty.rst deleted file mode 100644 index d54c714688531a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-31-13-28-36.bpo-29566.6aDbty.rst +++ /dev/null @@ -1 +0,0 @@ -``binhex.binhex()`` consisently writes macOS 9 line endings. diff --git a/Misc/NEWS.d/next/Library/2020-11-02-01-31-15.bpo-42233.YxRj-h.rst b/Misc/NEWS.d/next/Library/2020-11-02-01-31-15.bpo-42233.YxRj-h.rst deleted file mode 100644 index aad4249fa165bf..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-02-01-31-15.bpo-42233.YxRj-h.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :func:`repr` of :mod:`typing` types containing -:ref:`Generic Alias Types ` previously did not show the -parameterized types in the ``GenericAlias``. They have now been changed to do so. diff --git a/Misc/NEWS.d/next/Library/2020-11-02-14-10-48.bpo-35455.Q1xTIo.rst b/Misc/NEWS.d/next/Library/2020-11-02-14-10-48.bpo-35455.Q1xTIo.rst deleted file mode 100644 index e72c7d277a1123..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-02-14-10-48.bpo-35455.Q1xTIo.rst +++ /dev/null @@ -1,3 +0,0 @@ -On Solaris, :func:`~time.thread_time` is now implemented with -``gethrvtime()`` because ``clock_gettime(CLOCK_THREAD_CPUTIME_ID)`` is not -always available. Patch by Jakub Kulik. diff --git a/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst b/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst deleted file mode 100644 index e865ed12a03878..00000000000000 --- a/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :mod:`plistlib` module no longer accepts entity declarations in XML -plist files to avoid XML vulnerabilities. This should not affect users as -entity declarations are not used in regular plist files. diff --git a/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst b/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst deleted file mode 100644 index 15d7b6549ed465..00000000000000 --- a/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst +++ /dev/null @@ -1,2 +0,0 @@ -Prevented potential DoS attack via CPU and RAM exhaustion when processing -malformed Apple Property List files in binary format. diff --git a/Misc/NEWS.d/next/Tests/2020-08-03-13-44-37.bpo-41306.VDoWXI.rst b/Misc/NEWS.d/next/Tests/2020-08-03-13-44-37.bpo-41306.VDoWXI.rst deleted file mode 100644 index 5e9ba2d8a27417..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-08-03-13-44-37.bpo-41306.VDoWXI.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a failure in ``test_tk.test_widgets.ScaleTest`` happening when executing the test with Tk 8.6.10. diff --git a/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst b/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst deleted file mode 100644 index 4f9782f1c85af9..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst +++ /dev/null @@ -1 +0,0 @@ -Tests for CJK codecs no longer call ``eval()`` on content received via HTTP. diff --git a/Misc/NEWS.d/next/Tests/2020-10-08-14-00-17.bpo-41970.aZ8QFf.rst b/Misc/NEWS.d/next/Tests/2020-10-08-14-00-17.bpo-41970.aZ8QFf.rst deleted file mode 100644 index 4cdca197fbfc64..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-10-08-14-00-17.bpo-41970.aZ8QFf.rst +++ /dev/null @@ -1,2 +0,0 @@ -Avoid a test failure in ``test_lib2to3`` if the module has already imported -at the time the test executes. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Tests/2020-10-12-00-11-47.bpo-41739.wSCc4K.rst b/Misc/NEWS.d/next/Tests/2020-10-12-00-11-47.bpo-41739.wSCc4K.rst deleted file mode 100644 index 7aee2b94444727..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-10-12-00-11-47.bpo-41739.wSCc4K.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix test_logging.test_race_between_set_target_and_flush(): the test now -waits until all threads complete to avoid leaking running threads. diff --git a/Misc/NEWS.d/next/Windows/2020-05-30-02-46-43.bpo-38324.476M-5.rst b/Misc/NEWS.d/next/Windows/2020-05-30-02-46-43.bpo-38324.476M-5.rst deleted file mode 100644 index c45aa13091429e..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-05-30-02-46-43.bpo-38324.476M-5.rst +++ /dev/null @@ -1 +0,0 @@ -Avoid Unicode errors when accessing certain locale data on Windows. diff --git a/Misc/NEWS.d/next/Windows/2020-08-26-09-35-06.bpo-41557.vt00cQ.rst b/Misc/NEWS.d/next/Windows/2020-08-26-09-35-06.bpo-41557.vt00cQ.rst deleted file mode 100644 index 9d85461f00923f..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-08-26-09-35-06.bpo-41557.vt00cQ.rst +++ /dev/null @@ -1 +0,0 @@ -Update Windows installer to use SQLite 3.33.0. diff --git a/Misc/NEWS.d/next/Windows/2020-09-24-23-09-40.bpo-39107.GbUZvD.rst b/Misc/NEWS.d/next/Windows/2020-09-24-23-09-40.bpo-39107.GbUZvD.rst deleted file mode 100644 index 889ad481404e49..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-09-24-23-09-40.bpo-39107.GbUZvD.rst +++ /dev/null @@ -1 +0,0 @@ -Update Tcl and Tk to 8.6.10 in Windows installer. diff --git a/Misc/NEWS.d/next/Windows/2020-10-18-18-43-45.bpo-38252.7Nlepg.rst b/Misc/NEWS.d/next/Windows/2020-10-18-18-43-45.bpo-38252.7Nlepg.rst deleted file mode 100644 index c103e6cfcc75a6..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-10-18-18-43-45.bpo-38252.7Nlepg.rst +++ /dev/null @@ -1 +0,0 @@ -Use 8-byte step to detect ASCII sequence in 64-bit Windows build. diff --git a/Misc/NEWS.d/next/Windows/2020-10-20-13-19-42.bpo-38439.eMLi-t.rst b/Misc/NEWS.d/next/Windows/2020-10-20-13-19-42.bpo-38439.eMLi-t.rst deleted file mode 100644 index acbc80c10f5e23..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-10-20-13-19-42.bpo-38439.eMLi-t.rst +++ /dev/null @@ -1 +0,0 @@ -Updates the icons for IDLE in the Windows Store package. diff --git a/Misc/NEWS.d/next/macOS/2020-10-19-12-25-19.bpo-41471.gwA7un.rst b/Misc/NEWS.d/next/macOS/2020-10-19-12-25-19.bpo-41471.gwA7un.rst deleted file mode 100644 index db5dd00b19b0d4..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-10-19-12-25-19.bpo-41471.gwA7un.rst +++ /dev/null @@ -1 +0,0 @@ -Ignore invalid prefix lengths in system proxy excludes. diff --git a/README.rst b/README.rst index 33ccfc01d9c291..b27854d9178637 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.10.0 alpha 1 +This is Python version 3.10.0 alpha 2 ===================================== .. image:: https://travis-ci.com/python/cpython.svg?branch=master From d7aae08d54061f75d5bccfde88587e921a670f0b Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Tue, 3 Nov 2020 10:38:31 +0100 Subject: [PATCH 0454/1261] bpo-40077: Convert mmap.mmap static type to a heap type (GH-23108) --- .../2020-11-02-14-39-48.bpo-40077.grY9TG.rst | 1 + Modules/mmapmodule.c | 158 ++++++++++-------- 2 files changed, 91 insertions(+), 68 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-02-14-39-48.bpo-40077.grY9TG.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-02-14-39-48.bpo-40077.grY9TG.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-02-14-39-48.bpo-40077.grY9TG.rst new file mode 100644 index 00000000000000..48565a5a0daefe --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-02-14-39-48.bpo-40077.grY9TG.rst @@ -0,0 +1 @@ +Convert :mod:`mmap` to use heap types. diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 463bd40e78f4fa..1e9684970f5d38 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -20,6 +20,7 @@ #define PY_SSIZE_T_CLEAN #include +#include "structmember.h" // PyMemberDef #include // offsetof() #ifndef MS_WINDOWS @@ -113,10 +114,23 @@ typedef struct { access_mode access; } mmap_object; +typedef struct { + PyTypeObject *mmap_object_type; +} mmap_state; + +static mmap_state * +get_mmap_state(PyObject *module) +{ + mmap_state *state = PyModule_GetState(module); + assert(state); + return state; +} static void mmap_object_dealloc(mmap_object *m_obj) { + PyTypeObject *tp = Py_TYPE(m_obj); + #ifdef MS_WINDOWS Py_BEGIN_ALLOW_THREADS if (m_obj->data != NULL) @@ -142,7 +156,9 @@ mmap_object_dealloc(mmap_object *m_obj) if (m_obj->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) m_obj); - Py_TYPE(m_obj)->tp_free((PyObject*)m_obj); + + tp->tp_free(m_obj); + Py_DECREF(tp); } static PyObject * @@ -793,6 +809,11 @@ mmap_madvise_method(mmap_object *self, PyObject *args) } #endif // HAVE_MADVISE +static struct PyMemberDef mmap_object_members[] = { + {"__weaklistoffset__", T_PYSSIZET, offsetof(mmap_object, weakreflist), READONLY}, + {NULL}, +}; + static struct PyMethodDef mmap_object_methods[] = { {"close", (PyCFunction) mmap_close_method, METH_NOARGS}, {"find", (PyCFunction) mmap_find_method, METH_VARARGS}, @@ -1035,27 +1056,6 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value) } } -static PySequenceMethods mmap_as_sequence = { - (lenfunc)mmap_length, /*sq_length*/ - 0, /*sq_concat*/ - 0, /*sq_repeat*/ - (ssizeargfunc)mmap_item, /*sq_item*/ - 0, /*sq_slice*/ - (ssizeobjargproc)mmap_ass_item, /*sq_ass_item*/ - 0, /*sq_ass_slice*/ -}; - -static PyMappingMethods mmap_as_mapping = { - (lenfunc)mmap_length, - (binaryfunc)mmap_subscript, - (objobjargproc)mmap_ass_subscript, -}; - -static PyBufferProcs mmap_as_buffer = { - (getbufferproc)mmap_buffer_getbuf, - (releasebufferproc)mmap_buffer_releasebuf, -}; - static PyObject * new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict); @@ -1083,47 +1083,39 @@ The default value is MAP_SHARED.\n\ To map anonymous memory, pass -1 as the fileno (both versions)."); -static PyTypeObject mmap_object_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "mmap.mmap", /* tp_name */ - sizeof(mmap_object), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)mmap_object_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)mmap__repr__method, /* tp_repr */ - 0, /* tp_as_number */ - &mmap_as_sequence, /* tp_as_sequence */ - &mmap_as_mapping, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - &mmap_as_buffer, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - mmap_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(mmap_object, weakreflist), /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - mmap_object_methods, /* tp_methods */ - 0, /* tp_members */ - mmap_object_getset, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - new_mmap_object, /* tp_new */ - PyObject_Del, /* tp_free */ +static PyType_Slot mmap_object_slots[] = { + {Py_tp_new, new_mmap_object}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_dealloc, mmap_object_dealloc}, + {Py_tp_free, PyObject_Del}, + {Py_tp_repr, mmap__repr__method}, + {Py_tp_doc, (void *)mmap_doc}, + {Py_tp_methods, mmap_object_methods}, + {Py_tp_members, mmap_object_members}, + {Py_tp_getset, mmap_object_getset}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + + /* as sequence */ + {Py_sq_length, mmap_length}, + {Py_sq_item, mmap_item}, + {Py_sq_ass_item, mmap_ass_item}, + + /* as mapping */ + {Py_mp_length, mmap_length}, + {Py_mp_subscript, mmap_subscript}, + {Py_mp_ass_subscript, mmap_ass_subscript}, + + /* as buffer */ + {Py_bf_getbuffer, mmap_buffer_getbuf}, + {Py_bf_releasebuffer, mmap_buffer_releasebuf}, + {0, NULL}, +}; + +static PyType_Spec mmap_object_spec = { + .name = "mmap.mmap", + .basicsize = sizeof(mmap_object), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .slots = mmap_object_slots, }; @@ -1509,19 +1501,46 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) } #endif /* MS_WINDOWS */ +static int +mmap_traverse(PyObject *module, visitproc visit, void *arg) +{ + mmap_state *state = get_mmap_state(module); + Py_VISIT(state->mmap_object_type); + return 0; +} + +static int +mmap_clear(PyObject *module) +{ + mmap_state *state = get_mmap_state(module); + Py_CLEAR(state->mmap_object_type); + return 0; +} + +static void +mmap_free(void *module) +{ + mmap_clear((PyObject *)module); +} + static int mmap_exec(PyObject *module) { - if (PyType_Ready(&mmap_object_type) < 0) { - return -1; - } + mmap_state *state = get_mmap_state(module); Py_INCREF(PyExc_OSError); if (PyModule_AddObject(module, "error", PyExc_OSError) < 0) { Py_DECREF(PyExc_OSError); return -1; } - if (PyModule_AddType(module, &mmap_object_type) < 0) { + + state->mmap_object_type = (PyTypeObject *)PyType_FromModuleAndSpec(module, + &mmap_object_spec, + NULL); + if (state->mmap_object_type == NULL) { + return -1; + } + if (PyModule_AddType(module, state->mmap_object_type) < 0) { return -1; } @@ -1660,8 +1679,11 @@ static PyModuleDef_Slot mmap_slots[] = { static struct PyModuleDef mmapmodule = { PyModuleDef_HEAD_INIT, .m_name = "mmap", - .m_size = 0, + .m_size = sizeof(mmap_state), .m_slots = mmap_slots, + .m_traverse = mmap_traverse, + .m_clear = mmap_clear, + .m_free = mmap_free, }; PyMODINIT_FUNC From 90068c8abeed1bc0422b957e1b47b25df0778030 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 3 Nov 2020 16:15:56 +0200 Subject: [PATCH 0455/1261] bpo-42249: Fix writing binary Plist files larger than 4 GiB. (GH-23121) --- Lib/plistlib.py | 2 +- .../next/Library/2020-11-03-09-22-56.bpo-42249.vfNO2u.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-03-09-22-56.bpo-42249.vfNO2u.rst diff --git a/Lib/plistlib.py b/Lib/plistlib.py index 83b214e9dc49bf..2eeebe4c9a4244 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -611,7 +611,7 @@ def _count_to_size(count): elif count < 1 << 16: return 2 - elif count << 1 << 32: + elif count < 1 << 32: return 4 else: diff --git a/Misc/NEWS.d/next/Library/2020-11-03-09-22-56.bpo-42249.vfNO2u.rst b/Misc/NEWS.d/next/Library/2020-11-03-09-22-56.bpo-42249.vfNO2u.rst new file mode 100644 index 00000000000000..071a0fdda1ff80 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-03-09-22-56.bpo-42249.vfNO2u.rst @@ -0,0 +1 @@ +Fixed writing binary Plist files larger than 4 GiB. From db605259540a4cef97a627f5cc4a0c0179e8cadb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 3 Nov 2020 18:07:15 +0100 Subject: [PATCH 0456/1261] bpo-41796: Call _PyAST_Fini() earlier to fix a leak (GH-23131) Call _PyAST_Fini() on all interpreters, not only on the main interpreter. Also, call it ealier to fix a reference leak. Python types contain a reference to themselves in in their PyTypeObject.tp_mro member. _PyAST_Fini() must called before the last GC collection to destroy AST types. _PyInterpreterState_Clear() now calls _PyAST_Fini(). It now also calls _PyWarnings_Fini() on subinterpeters, not only on the main interpreter. Add an assertion in AST init_types() to ensure that the _ast module is no longer used after _PyAST_Fini() has been called. --- Include/internal/pycore_pylifecycle.h | 2 +- Parser/asdl_c.py | 69 +++++++++++++++++---------- Python/Python-ast.c | 33 ++++++++++--- Python/pylifecycle.c | 8 ---- Python/pystate.c | 11 +++-- 5 files changed, 79 insertions(+), 44 deletions(-) diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 6d84e37232b305..cba3bbdc2b2565 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -84,7 +84,7 @@ extern void _PyFaulthandler_Fini(void); extern void _PyHash_Fini(void); extern void _PyTraceMalloc_Fini(void); extern void _PyWarnings_Fini(PyInterpreterState *interp); -extern void _PyAST_Fini(PyThreadState *tstate); +extern void _PyAST_Fini(PyInterpreterState *interp); extern PyStatus _PyGILState_Init(PyThreadState *tstate); extern void _PyGILState_Fini(PyThreadState *tstate); diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 9a833e841de41e..9fec7ae017cd7b 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1015,18 +1015,35 @@ def visitModule(self, mod): """, 0, reflow=False) - self.emit("static int init_types(struct ast_state *state)",0) - self.emit("{", 0) - self.emit("if (state->initialized) return 1;", 1) - self.emit("if (init_identifiers(state) < 0) return 0;", 1) - self.emit("state->AST_type = PyType_FromSpec(&AST_type_spec);", 1) - self.emit("if (!state->AST_type) return 0;", 1) - self.emit("if (add_ast_fields(state) < 0) return 0;", 1) + self.file.write(textwrap.dedent(''' + static int + init_types(struct ast_state *state) + { + // init_types() must not be called after _PyAST_Fini() + // has been called + assert(state->initialized >= 0); + + if (state->initialized) { + return 1; + } + if (init_identifiers(state) < 0) { + return 0; + } + state->AST_type = PyType_FromSpec(&AST_type_spec); + if (!state->AST_type) { + return 0; + } + if (add_ast_fields(state) < 0) { + return 0; + } + ''')) for dfn in mod.dfns: self.visit(dfn) - self.emit("state->initialized = 1;", 1) - self.emit("return 1;", 1); - self.emit("}", 0) + self.file.write(textwrap.dedent(''' + state->initialized = 1; + return 1; + } + ''')) def visitProduct(self, prod, name): if prod.fields: @@ -1353,23 +1370,27 @@ def generate_ast_state(module_state, f): def generate_ast_fini(module_state, f): - f.write(""" -void _PyAST_Fini(PyThreadState *tstate) -{ -#ifdef Py_BUILD_CORE - struct ast_state *state = &tstate->interp->ast; -#else - struct ast_state *state = &global_ast_state; -#endif - -""") + f.write(textwrap.dedent(""" + void _PyAST_Fini(PyInterpreterState *interp) + { + #ifdef Py_BUILD_CORE + struct ast_state *state = &interp->ast; + #else + struct ast_state *state = &global_ast_state; + #endif + + """)) for s in module_state: f.write(" Py_CLEAR(state->" + s + ');\n') - f.write(""" - state->initialized = 0; -} + f.write(textwrap.dedent(""" + #if defined(Py_BUILD_CORE) && !defined(NDEBUG) + state->initialized = -1; + #else + state->initialized = 0; + #endif + } -""") + """)) def generate_module_def(mod, f, internal_h): diff --git a/Python/Python-ast.c b/Python/Python-ast.c index f04addbe2011dd..a456b519514256 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -261,10 +261,10 @@ get_ast_state(void) #include "Python-ast.h" #include "structmember.h" -void _PyAST_Fini(PyThreadState *tstate) +void _PyAST_Fini(PyInterpreterState *interp) { #ifdef Py_BUILD_CORE - struct ast_state *state = &tstate->interp->ast; + struct ast_state *state = &interp->ast; #else struct ast_state *state = &global_ast_state; #endif @@ -483,7 +483,11 @@ void _PyAST_Fini(PyThreadState *tstate) Py_CLEAR(state->vararg); Py_CLEAR(state->withitem_type); +#if defined(Py_BUILD_CORE) && !defined(NDEBUG) + state->initialized = -1; +#else state->initialized = 0; +#endif } static int init_identifiers(struct ast_state *state) @@ -1227,13 +1231,27 @@ static int add_ast_fields(struct ast_state *state) } -static int init_types(struct ast_state *state) + +static int +init_types(struct ast_state *state) { - if (state->initialized) return 1; - if (init_identifiers(state) < 0) return 0; + // init_types() must not be called after _PyAST_Fini() + // has been called + assert(state->initialized >= 0); + + if (state->initialized) { + return 1; + } + if (init_identifiers(state) < 0) { + return 0; + } state->AST_type = PyType_FromSpec(&AST_type_spec); - if (!state->AST_type) return 0; - if (add_ast_fields(state) < 0) return 0; + if (!state->AST_type) { + return 0; + } + if (add_ast_fields(state) < 0) { + return 0; + } state->mod_type = make_type(state, "mod", state->AST_type, NULL, 0, "mod = Module(stmt* body, type_ignore* type_ignores)\n" " | Interactive(stmt* body)\n" @@ -1902,6 +1920,7 @@ static int init_types(struct ast_state *state) TypeIgnore_fields, 2, "TypeIgnore(int lineno, string tag)"); if (!state->TypeIgnore_type) return 0; + state->initialized = 1; return 1; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index ff58c1b9153bd0..cad0fa7026bfd5 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1545,12 +1545,6 @@ flush_std_files(void) static void finalize_interp_types(PyThreadState *tstate) { - // The _ast module state is shared by all interpreters. - // The state must only be cleared by the main interpreter. - if (_Py_IsMainInterpreter(tstate)) { - _PyAST_Fini(tstate); - } - _PyExc_Fini(tstate); _PyFrame_Fini(tstate); _PyAsyncGen_Fini(tstate); @@ -1591,8 +1585,6 @@ finalize_interp_clear(PyThreadState *tstate) _Py_ClearFileSystemEncoding(); } - _PyWarnings_Fini(tstate->interp); - finalize_interp_types(tstate); } diff --git a/Python/pystate.c b/Python/pystate.c index e37cbd5a657873..c9882a7f74bc26 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -300,13 +300,16 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate) Py_CLEAR(interp->after_forkers_parent); Py_CLEAR(interp->after_forkers_child); #endif - if (_PyRuntimeState_GetFinalizing(runtime) == NULL) { - _PyWarnings_Fini(interp); - } + + _PyAST_Fini(interp); + _PyWarnings_Fini(interp); + + // All Python types must be destroyed before the last GC collection. Python + // types create a reference cycle to themselves in their in their + // PyTypeObject.tp_mro member (the tuple contains the type). /* Last garbage collection on this interpreter */ _PyGC_CollectNoFail(tstate); - _PyGC_Fini(tstate); /* We don't clear sysdict and builtins until the end of this function. From 1c75b6c0d5f2f048eae8f5939c64ee9c2a27d952 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 3 Nov 2020 17:31:32 +0000 Subject: [PATCH 0457/1261] Post 3.10.0a2 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index b9bdc598ebccb9..b7d2a9aa2e1b93 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 2 /* Version as a string */ -#define PY_VERSION "3.10.0a2" +#define PY_VERSION "3.10.0a2+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. From 9436820c4379e4f0d7fe85929a62f98c7a392dd1 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 3 Nov 2020 22:27:12 +0100 Subject: [PATCH 0458/1261] Add _PyType_GetModuleByDef (GH-22835) See https://mail.python.org/archives/list/capi-sig@python.org/thread/T3P2QNLNLBRFHWSKYSTPMVEIL2EEKFJU/ for discussion. https://bugs.python.org/issue42100 --- Include/cpython/object.h | 2 ++ Modules/_testmultiphase.c | 8 ++++++- Modules/clinic/_testmultiphase.c.h | 7 ++++-- Objects/typeobject.c | 38 ++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 875a600f79565a..0db53c312f07b7 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -296,6 +296,8 @@ PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *); PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *); PyAPI_FUNC(PyObject *) _PyType_GetDocFromInternalDoc(const char *, const char *); PyAPI_FUNC(PyObject *) _PyType_GetTextSignatureFromInternalDoc(const char *, const char *); +struct PyModuleDef; +PyAPI_FUNC(PyObject *) _PyType_GetModuleByDef(PyTypeObject *, struct PyModuleDef *); struct _Py_Identifier; PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c index 8bba077be9bb68..ad60f32f7e7a62 100644 --- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -121,24 +121,30 @@ static PyType_Spec Example_Type_spec = { }; +static PyModuleDef def_meth_state_access; + /*[clinic input] _testmultiphase.StateAccessType.get_defining_module cls: defining_class Return the module of the defining class. + +Also tests that result of _PyType_GetModuleByDef matches defining_class's +module. [clinic start generated code]*/ static PyObject * _testmultiphase_StateAccessType_get_defining_module_impl(StateAccessTypeObject *self, PyTypeObject *cls) -/*[clinic end generated code: output=ba2a14284a5d0921 input=946149f91cf72c0d]*/ +/*[clinic end generated code: output=ba2a14284a5d0921 input=356f999fc16e0933]*/ { PyObject *retval; retval = PyType_GetModule(cls); if (retval == NULL) { return NULL; } + assert(_PyType_GetModuleByDef(Py_TYPE(self), &def_meth_state_access) == retval); Py_INCREF(retval); return retval; } diff --git a/Modules/clinic/_testmultiphase.c.h b/Modules/clinic/_testmultiphase.c.h index 0d38c230f71865..55f934be8c6c1b 100644 --- a/Modules/clinic/_testmultiphase.c.h +++ b/Modules/clinic/_testmultiphase.c.h @@ -6,7 +6,10 @@ PyDoc_STRVAR(_testmultiphase_StateAccessType_get_defining_module__doc__, "get_defining_module($self, /)\n" "--\n" "\n" -"Return the module of the defining class."); +"Return the module of the defining class.\n" +"\n" +"Also tests that result of _PyType_GetModuleByDef matches defining_class\'s\n" +"module."); #define _TESTMULTIPHASE_STATEACCESSTYPE_GET_DEFINING_MODULE_METHODDEF \ {"get_defining_module", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_get_defining_module, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_get_defining_module__doc__}, @@ -98,4 +101,4 @@ _testmultiphase_StateAccessType_get_count(StateAccessTypeObject *self, PyTypeObj exit: return return_value; } -/*[clinic end generated code: output=39eea487e94e7f5d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=f01137bb3b373e14 input=a9049054013a1b77]*/ diff --git a/Objects/typeobject.c b/Objects/typeobject.c index bd1587ace876f5..2daf374f170b02 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3158,6 +3158,44 @@ PyType_GetModuleState(PyTypeObject *type) return PyModule_GetState(m); } + +/* Get the module of the first superclass where the module has the + * given PyModuleDef. + * Implemented by walking the MRO, is relatively slow. + * + * This is internal API for experimentation within stdlib. Discussion: + * https://mail.python.org/archives/list/capi-sig@python.org/thread/T3P2QNLNLBRFHWSKYSTPMVEIL2EEKFJU/ + */ +PyObject * +_PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def) +{ + assert(PyType_Check(type)); + assert(type->tp_mro); + int i; + for (i = 0; i < PyTuple_GET_SIZE(type->tp_mro); i++) { + PyObject *super = PyTuple_GET_ITEM(type->tp_mro, i); + if (!PyType_HasFeature((PyTypeObject *)super, Py_TPFLAGS_HEAPTYPE)) { + /* Currently, there's no way for static types to inherit + * from heap types, but to allow that possibility, + * we `continue` rather than `break`. + * We'll just potentially loop a few more times before throwing + * the error. + */ + continue; + } + PyHeapTypeObject *ht = (PyHeapTypeObject*)super; + if (ht->ht_module && PyModule_GetDef(ht->ht_module) == def) { + return ht->ht_module; + } + } + PyErr_Format( + PyExc_TypeError, + "_PyType_GetModuleByDef: No superclass of '%s' has the given module", + type->tp_name); + return NULL; +} + + /* Internal API to look for a name through the MRO, bypassing the method cache. This returns a borrowed reference, and might set an exception. 'error' is set to: -1: error with exception; 1: error without exception; 0: ok */ From 115b055c08a0f7208acc2d61926d6d04708105c8 Mon Sep 17 00:00:00 2001 From: Matthew Suozzo Date: Tue, 3 Nov 2020 16:28:42 -0500 Subject: [PATCH 0459/1261] Fix incorrect links in ast docs (GH-23017) --- Doc/library/ast.rst | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index b8688ae61a4876..8a5c6ec5f1279d 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -80,12 +80,13 @@ Node classes end_col_offset Instances of :class:`ast.expr` and :class:`ast.stmt` subclasses have - :attr:`lineno`, :attr:`col_offset`, :attr:`lineno`, and :attr:`col_offset` - attributes. The :attr:`lineno` and :attr:`end_lineno` are the first and - last line numbers of source text span (1-indexed so the first line is line 1) - and the :attr:`col_offset` and :attr:`end_col_offset` are the corresponding - UTF-8 byte offsets of the first and last tokens that generated the node. - The UTF-8 offset is recorded because the parser uses UTF-8 internally. + :attr:`lineno`, :attr:`col_offset`, :attr:`end_lineno`, and + :attr:`end_col_offset` attributes. The :attr:`lineno` and :attr:`end_lineno` + are the first and last line numbers of source text span (1-indexed so the + first line is line 1) and the :attr:`col_offset` and :attr:`end_col_offset` + are the corresponding UTF-8 byte offsets of the first and last tokens that + generated the node. The UTF-8 offset is recorded because the parser uses + UTF-8 internally. Note that the end positions are not required by the compiler and are therefore optional. The end offset is *after* the last symbol, for example From 51e36ba419cee083230a0960ed234951bc8da1d0 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 3 Nov 2020 22:31:49 +0000 Subject: [PATCH 0460/1261] Enable signing of nuget.org packages and update to supported timestamp server (GH-23132) --- .azure-pipelines/windows-release/stage-pack-msix.yml | 3 ++- .azure-pipelines/windows-release/stage-pack-nuget.yml | 10 +++++++++- .azure-pipelines/windows-release/stage-sign.yml | 2 +- PCbuild/pyproject.props | 4 ++-- Tools/msi/sdktools.psm1 | 6 +++--- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/.azure-pipelines/windows-release/stage-pack-msix.yml b/.azure-pipelines/windows-release/stage-pack-msix.yml index 26a5712e845ca9..f967cfdbe326f8 100644 --- a/.azure-pipelines/windows-release/stage-pack-msix.yml +++ b/.azure-pipelines/windows-release/stage-pack-msix.yml @@ -120,10 +120,11 @@ jobs: artifactName: unsigned_msix downloadPath: $(Build.BinariesDirectory) + # MSIX must be signed and timestamped simultaneously - powershell: | $failed = $true foreach ($retry in 1..3) { - signtool sign /a /n "$(SigningCertificate)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "$(SigningDescription)" (gi *.msix) + signtool sign /a /n "$(SigningCertificate)" /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d "$(SigningDescription)" (gi *.msix) if ($?) { $failed = $false break diff --git a/.azure-pipelines/windows-release/stage-pack-nuget.yml b/.azure-pipelines/windows-release/stage-pack-nuget.yml index b100364820d95b..8dfea382c35622 100644 --- a/.azure-pipelines/windows-release/stage-pack-nuget.yml +++ b/.azure-pipelines/windows-release/stage-pack-nuget.yml @@ -4,7 +4,7 @@ jobs: condition: and(succeeded(), eq(variables['DoNuget'], 'true')) pool: - vmImage: windows-2019 + name: 'Windows Release' workspace: clean: all @@ -36,6 +36,14 @@ jobs: nuget pack "$(Build.BinariesDirectory)\layout\python.nuspec" -OutputDirectory $(Build.ArtifactStagingDirectory) -NoPackageAnalysis -NonInteractive displayName: 'Create nuget package' + - powershell: | + gci *.nupkg | %{ + nuget sign "$_" -CertificateSubjectName "$(SigningCertificate)" -Timestamper http://timestamp.digicert.com/ -Overwrite + } + displayName: 'Sign nuget package' + workingDirectory: $(Build.ArtifactStagingDirectory) + condition: and(succeeded(), variables['SigningCertificate']) + - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact: nuget' inputs: diff --git a/.azure-pipelines/windows-release/stage-sign.yml b/.azure-pipelines/windows-release/stage-sign.yml index 584772af8b428e..c21e1c9f2b0f9b 100644 --- a/.azure-pipelines/windows-release/stage-sign.yml +++ b/.azure-pipelines/windows-release/stage-sign.yml @@ -57,7 +57,7 @@ jobs: $files = (gi ${{ parameters.Include }} -Exclude ${{ parameters.Exclude }}) $failed = $true foreach ($retry in 1..10) { - signtool timestamp /t http://timestamp.verisign.com/scripts/timestamp.dll $files + signtool timestamp /tr http://timestamp.digicert.com/ /td sha256 $files if ($?) { $failed = $false break diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index c659d14ff8dc93..d7762ca1bc685f 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -176,8 +176,8 @@ public override bool Execute() { $(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot81)\bin\x86 $(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot)\bin\x86 $(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A@InstallationFolder)\Bin\ - <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificate)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /n "$(SigningCertificate)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" - <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificateSha1)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /sha1 "$(SigningCertificateSha1)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" + <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificate)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /n "$(SigningCertificate)" /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d "Python $(PythonVersion)" + <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificateSha1)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /sha1 "$(SigningCertificateSha1)" /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d "Python $(PythonVersion)" <_MakeCatCommand Condition="Exists($(SdkBinPath))">"$(SdkBinPath)\makecat.exe" diff --git a/Tools/msi/sdktools.psm1 b/Tools/msi/sdktools.psm1 index 8081b104d85a7f..c5973f9abc6abf 100644 --- a/Tools/msi/sdktools.psm1 +++ b/Tools/msi/sdktools.psm1 @@ -37,11 +37,11 @@ function Sign-File { foreach ($a in $files) { if ($certsha1) { - SignTool sign /sha1 $certsha1 /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d $description $a + SignTool sign /sha1 $certsha1 /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d $description $a } elseif ($certname) { - SignTool sign /a /n $certname /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d $description $a + SignTool sign /a /n $certname /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d $description $a } elseif ($certfile) { - SignTool sign /f $certfile /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d $description $a + SignTool sign /f $certfile /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d $description $a } } } From 105989ffefad72adad917b6cb922ea9c361101bd Mon Sep 17 00:00:00 2001 From: Mario Corchero Date: Wed, 4 Nov 2020 10:27:43 +0100 Subject: [PATCH 0461/1261] bpo-42251: Add gettrace and getprofile to threading (GH-23125) This allows to retrieve the functions that were set in these two, which might differ from sys.gettrace and sys.getprofile within a thread. --- Doc/library/threading.rst | 20 ++++++++++++++++++ Doc/whatsnew/3.10.rst | 8 +++++++ Lib/test/test_threading.py | 21 +++++++++++++++++++ Lib/threading.py | 10 ++++++++- .../2020-11-03-14-15-35.bpo-42251.6TC32V.rst | 3 +++ 5 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 7eb12fe116bd2d..e05486f7d08494 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -121,6 +121,17 @@ This module defines the following functions: :meth:`~Thread.run` method is called. +.. function:: gettrace() + + .. index:: + single: trace function + single: debugger + + Get the trace function as set by :func:`settrace`. + + .. versionadded:: 3.10 + + .. function:: setprofile(func) .. index:: single: profile function @@ -130,6 +141,15 @@ This module defines the following functions: :meth:`~Thread.run` method is called. +.. function:: getprofile() + + .. index:: single: profile function + + Get the profiler function as set by :func:`setprofile`. + + .. versionadded:: 3.10 + + .. function:: stack_size([size]) Return the thread stack size used when creating new threads. The optional diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 60dee0c6bd1651..89fc300778290a 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -224,6 +224,14 @@ Add :data:`sys.orig_argv` attribute: the list of the original command line arguments passed to the Python executable. (Contributed by Victor Stinner in :issue:`23427`.) +threading +--------- + +Added :func:`threading.gettrace` and :func:`threading.getprofile` to +retrieve the functions set by :func:`threading.settrace` and +:func:`threading.setprofile` respectively. +(Contributed by Mario Corchero in :issue:`42251`.) + types ----- diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 2f0f3ae0946a57..e0e5406ac26a1e 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -765,6 +765,27 @@ def callback(): finally: sys.settrace(old_trace) + def test_gettrace(self): + def noop_trace(frame, event, arg): + # no operation + return noop_trace + old_trace = threading.gettrace() + try: + threading.settrace(noop_trace) + trace_func = threading.gettrace() + self.assertEqual(noop_trace,trace_func) + finally: + threading.settrace(old_trace) + + def test_getprofile(self): + def fn(*args): pass + old_profile = threading.getprofile() + try: + threading.setprofile(fn) + self.assertEqual(fn, threading.getprofile()) + finally: + threading.setprofile(old_profile) + @cpython_only def test_shutdown_locks(self): for daemon in (False, True): diff --git a/Lib/threading.py b/Lib/threading.py index 06c77f70fe74f5..d4fe649e4f04b5 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -28,7 +28,7 @@ 'Event', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier', 'BrokenBarrierError', 'Timer', 'ThreadError', 'setprofile', 'settrace', 'local', 'stack_size', - 'excepthook', 'ExceptHookArgs'] + 'excepthook', 'ExceptHookArgs', 'gettrace', 'getprofile'] # Rename some stuff so "from threading import *" is safe _start_new_thread = _thread.start_new_thread @@ -65,6 +65,10 @@ def setprofile(func): global _profile_hook _profile_hook = func +def getprofile(): + """Get the profiler function as set by threading.setprofile().""" + return _profile_hook + def settrace(func): """Set a trace function for all threads started from the threading module. @@ -75,6 +79,10 @@ def settrace(func): global _trace_hook _trace_hook = func +def gettrace(): + """Get the trace function as set by threading.settrace().""" + return _trace_hook + # Synchronization classes Lock = _allocate_lock diff --git a/Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst b/Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst new file mode 100644 index 00000000000000..7435c837a2cbe1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst @@ -0,0 +1,3 @@ +Added :func:`threading.gettrace` and :func:`threading.getprofile` to +retrieve the functions set by :func:`threading.settrace` and +:func:`threading.setprofile` respectively. Patch by Mario Corchero. From c6b8790f5c79c789c38b78247810736b0a301963 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 Nov 2020 11:20:10 +0100 Subject: [PATCH 0462/1261] bpo-42236: os.device_encoding() respects UTF-8 Mode (GH-23119) On Unix, the os.device_encoding() function now returns 'UTF-8' rather than the device encoding if the Python UTF-8 Mode is enabled. --- Doc/library/os.rst | 8 ++++++ Lib/test/test_utf8_mode.py | 27 +++++++++++++++++++ .../2020-11-02-23-05-17.bpo-42236.aJ6ZBR.rst | 3 +++ Python/fileutils.c | 18 +++++-------- Python/initconfig.c | 13 ++++----- 5 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-02-23-05-17.bpo-42236.aJ6ZBR.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index f9f35b3124360d..3ffcfa04ffa752 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -113,6 +113,8 @@ of the UTF-8 encoding: :ref:`error handler ` being enabled for :data:`sys.stdin` and :data:`sys.stdout` (:data:`sys.stderr` continues to use ``backslashreplace`` as it does in the default locale-aware mode) +* On Unix, :func:`os.device_encoding` returns ``'UTF-8'``. rather than the + device encoding. Note that the standard stream settings in UTF-8 mode can be overridden by :envvar:`PYTHONIOENCODING` (just as they can be in the default locale-aware @@ -808,6 +810,12 @@ as internal buffering of data. Return a string describing the encoding of the device associated with *fd* if it is connected to a terminal; else return :const:`None`. + On Unix, if the :ref:`Python UTF-8 Mode ` is enabled, return + ``'UTF-8'`` rather than the device encoding. + + .. versionchanged:: 3.10 + On Unix, the function now implements the Python UTF-8 Mode. + .. function:: dup(fd) diff --git a/Lib/test/test_utf8_mode.py b/Lib/test/test_utf8_mode.py index bdb93457cfc405..8b6332ee22771b 100644 --- a/Lib/test/test_utf8_mode.py +++ b/Lib/test/test_utf8_mode.py @@ -3,11 +3,13 @@ """ import locale +import subprocess import sys import textwrap import unittest from test import support from test.support.script_helper import assert_python_ok, assert_python_failure +from test.support import os_helper MS_WINDOWS = (sys.platform == 'win32') @@ -250,6 +252,31 @@ def test_optim_level(self): out = self.get_output('-X', 'utf8', '-E', '-c', code) self.assertEqual(out, '1') + @unittest.skipIf(MS_WINDOWS, + "os.device_encoding() doesn't implement " + "the UTF-8 Mode on Windows") + def test_device_encoding(self): + # Use stdout as TTY + if not sys.stdout.isatty(): + self.skipTest("sys.stdout is not a TTY") + + filename = 'out.txt' + self.addCleanup(os_helper.unlink, filename) + + code = (f'import os, sys; fd = sys.stdout.fileno(); ' + f'out = open({filename!r}, "w", encoding="utf-8"); ' + f'print(os.isatty(fd), os.device_encoding(fd), file=out); ' + f'out.close()') + cmd = [sys.executable, '-X', 'utf8', '-c', code] + # The stdout TTY is inherited to the child process + proc = subprocess.run(cmd, text=True) + self.assertEqual(proc.returncode, 0, proc) + + # In UTF-8 Mode, device_encoding(fd) returns "UTF-8" if fd is a TTY + with open(filename, encoding="utf8") as fp: + out = fp.read().rstrip() + self.assertEqual(out, 'True UTF-8') + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-11-02-23-05-17.bpo-42236.aJ6ZBR.rst b/Misc/NEWS.d/next/Library/2020-11-02-23-05-17.bpo-42236.aJ6ZBR.rst new file mode 100644 index 00000000000000..15e2620366556b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-02-23-05-17.bpo-42236.aJ6ZBR.rst @@ -0,0 +1,3 @@ +On Unix, the :func:`os.device_encoding` function now returns ``'UTF-8'`` rather +than the device encoding if the :ref:`Python UTF-8 Mode ` is +enabled. diff --git a/Python/fileutils.c b/Python/fileutils.c index 5177b3728824cd..b589d7390d46dc 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -55,9 +55,6 @@ get_surrogateescape(_Py_error_handler errors, int *surrogateescape) PyObject * _Py_device_encoding(int fd) { -#if defined(MS_WINDOWS) - UINT cp; -#endif int valid; _Py_BEGIN_SUPPRESS_IPH valid = isatty(fd); @@ -66,6 +63,7 @@ _Py_device_encoding(int fd) Py_RETURN_NONE; #if defined(MS_WINDOWS) + UINT cp; if (fd == 0) cp = GetConsoleCP(); else if (fd == 1 || fd == 2) @@ -74,16 +72,14 @@ _Py_device_encoding(int fd) cp = 0; /* GetConsoleCP() and GetConsoleOutputCP() return 0 if the application has no console */ - if (cp != 0) - return PyUnicode_FromFormat("cp%u", (unsigned int)cp); -#elif defined(CODESET) - { - char *codeset = nl_langinfo(CODESET); - if (codeset != NULL && codeset[0] != 0) - return PyUnicode_FromString(codeset); + if (cp == 0) { + Py_RETURN_NONE; } + + return PyUnicode_FromFormat("cp%u", (unsigned int)cp); +#else + return _Py_GetLocaleEncodingObject(); #endif - Py_RETURN_NONE; } #if !defined(_Py_FORCE_UTF8_FS_ENCODING) && !defined(MS_WINDOWS) diff --git a/Python/initconfig.c b/Python/initconfig.c index 7bb28ed01f164a..15fb3e4d2877dd 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1515,8 +1515,8 @@ config_init_stdio_encoding(PyConfig *config, { PyStatus status; - /* If Py_SetStandardStreamEncoding() have been called, use these - parameters. */ + /* If Py_SetStandardStreamEncoding() has been called, use its + arguments if they are not NULL. */ if (config->stdio_encoding == NULL && _Py_StandardStreamEncoding != NULL) { status = CONFIG_SET_BYTES_STR(config, &config->stdio_encoding, _Py_StandardStreamEncoding, @@ -1535,6 +1535,7 @@ config_init_stdio_encoding(PyConfig *config, } } + // Exit if encoding and errors are defined if (config->stdio_encoding != NULL && config->stdio_errors != NULL) { return _PyStatus_OK(); } @@ -1634,12 +1635,12 @@ config_get_fs_encoding(PyConfig *config, const PyPreConfig *preconfig, if (preconfig->utf8_mode) { return PyConfig_SetString(config, fs_encoding, L"utf-8"); } - else if (_Py_GetForceASCII()) { + + if (_Py_GetForceASCII()) { return PyConfig_SetString(config, fs_encoding, L"ascii"); } - else { - return config_get_locale_encoding(config, preconfig, fs_encoding); - } + + return config_get_locale_encoding(config, preconfig, fs_encoding); #endif // !MS_WINDOWS } From fd01c00812c43fce2b96986e304a6d5108ead515 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 Nov 2020 13:59:15 +0100 Subject: [PATCH 0463/1261] bpo-1635741: Add PyModule_AddObjectRef() function (GH-23122) Added PyModule_AddObjectRef() function: similar to PyModule_AddObjectRef() but don't steal a reference to the value on success. --- Doc/c-api/module.rst | 104 +++++++++++++++--- Doc/whatsnew/3.10.rst | 5 + Include/modsupport.h | 10 +- ...2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst | 3 + Python/modsupport.c | 70 ++++++------ 5 files changed, 146 insertions(+), 46 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index 6e9474bfa40eba..41a705d9e99156 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -264,7 +264,7 @@ of the following two module creation functions: instead; only use this if you are sure you need it. Before it is returned from in the initialization function, the resulting module -object is typically populated using functions like :c:func:`PyModule_AddObject`. +object is typically populated using functions like :c:func:`PyModule_AddObjectRef`. .. _multi-phase-initialization: @@ -437,26 +437,102 @@ a function called from a module execution slot (if using multi-phase initialization), can use the following functions to help initialize the module state: +.. c:function:: int PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value) + + Add an object to *module* as *name*. This is a convenience function which + can be used from the module's initialization function. + + On success, return ``0``. On error, raise an exception and return ``-1``. + + Return ``NULL`` if *value* is ``NULL``. It must be called with an exception + raised in this case. + + Example usage:: + + static int + add_spam(PyObject *module, int value) + { + PyObject *obj = PyLong_FromLong(value); + if (obj == NULL) { + return -1; + } + int res = PyModule_AddObjectRef(module, "spam", obj); + Py_DECREF(obj); + return res; + } + + The example can also be written without checking explicitly if *obj* is + ``NULL``:: + + static int + add_spam(PyObject *module, int value) + { + PyObject *obj = PyLong_FromLong(value); + int res = PyModule_AddObjectRef(module, "spam", obj); + Py_XDECREF(obj); + return res; + } + + Note that ``Py_XDECREF()`` should be used instead of ``Py_DECREF()`` in + this case, since *obj* can be ``NULL``. + + .. versionadded:: 3.10 + + .. c:function:: int PyModule_AddObject(PyObject *module, const char *name, PyObject *value) - Add an object to *module* as *name*. This is a convenience function which can - be used from the module's initialization function. This steals a reference to - *value* on success. Return ``-1`` on error, ``0`` on success. + Similar to :c:func:`PyModule_AddObjectRef`, but steals a reference to + *value* on success (if it returns ``0``). + + The new :c:func:`PyModule_AddObjectRef` function is recommended, since it is + easy to introduce reference leaks by misusing the + :c:func:`PyModule_AddObject` function. .. note:: - Unlike other functions that steal references, ``PyModule_AddObject()`` only - decrements the reference count of *value* **on success**. + Unlike other functions that steal references, ``PyModule_AddObject()`` + only decrements the reference count of *value* **on success**. This means that its return value must be checked, and calling code must - :c:func:`Py_DECREF` *value* manually on error. Example usage:: - - Py_INCREF(spam); - if (PyModule_AddObject(module, "spam", spam) < 0) { - Py_DECREF(module); - Py_DECREF(spam); - return NULL; - } + :c:func:`Py_DECREF` *value* manually on error. + + Example usage:: + + static int + add_spam(PyObject *module, int value) + { + PyObject *obj = PyLong_FromLong(value); + if (obj == NULL) { + return -1; + } + if (PyModule_AddObject(module, "spam", obj) < 0) { + Py_DECREF(obj); + return -1; + } + // PyModule_AddObject() stole a reference to obj: + // Py_DECREF(obj) is not needed here + return 0; + } + + The example can also be written without checking explicitly if *obj* is + ``NULL``:: + + static int + add_spam(PyObject *module, int value) + { + PyObject *obj = PyLong_FromLong(value); + if (PyModule_AddObject(module, "spam", obj) < 0) { + Py_XDECREF(obj); + return -1; + } + // PyModule_AddObject() stole a reference to obj: + // Py_DECREF(obj) is not needed here + return 0; + } + + Note that ``Py_XDECREF()`` should be used instead of ``Py_DECREF()`` in + this case, since *obj* can be ``NULL``. + .. c:function:: int PyModule_AddIntConstant(PyObject *module, const char *name, long value) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 89fc300778290a..9d9284897be8ab 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -374,6 +374,11 @@ New Features * Added :c:func:`PyUnicode_AsUTF8AndSize` to the limited C API. (Contributed by Alex Gaynor in :issue:`41784`.) +* Added :c:func:`PyModule_AddObjectRef` function: similar to + :c:func:`PyModule_AddObjectRef` but don't steal a reference to the value on + success. + (Contributed by Victor Stinner in :issue:`1635741`.) + Porting to Python 3.10 ---------------------- diff --git a/Include/modsupport.h b/Include/modsupport.h index 4c4aab65bac103..f009d586bf6202 100644 --- a/Include/modsupport.h +++ b/Include/modsupport.h @@ -136,7 +136,15 @@ PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywords( void _PyArg_Fini(void); #endif /* Py_LIMITED_API */ -PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *); +// Add an attribute with name 'name' and value 'obj' to the module 'mod. +// On success, return 0 on success. +// On error, raise an exception and return -1. +PyAPI_FUNC(int) PyModule_AddObjectRef(PyObject *mod, const char *name, PyObject *value); + +// Similar to PyModule_AddObjectRef() but steal a reference to 'obj' +// (Py_DECREF(obj)) on success (if it returns 0). +PyAPI_FUNC(int) PyModule_AddObject(PyObject *mod, const char *, PyObject *value); + PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 diff --git a/Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst b/Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst new file mode 100644 index 00000000000000..2ab1afb922fa8b --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst @@ -0,0 +1,3 @@ +Added :c:func:`PyModule_AddObjectRef` function: similar to +:c:func:`PyModule_AddObjectRef` but don't steal a reference to the value on +success. Patch by Victor Stinner. diff --git a/Python/modsupport.c b/Python/modsupport.c index 2dabcf383409e9..8655daa1fc5e0e 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -634,56 +634,70 @@ va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len, int -PyModule_AddObject(PyObject *m, const char *name, PyObject *o) +PyModule_AddObjectRef(PyObject *mod, const char *name, PyObject *value) { - PyObject *dict; - if (!PyModule_Check(m)) { + if (!PyModule_Check(mod)) { PyErr_SetString(PyExc_TypeError, - "PyModule_AddObject() needs module as first arg"); + "PyModule_AddObjectRef() first argument " + "must be a module"); return -1; } - if (!o) { - if (!PyErr_Occurred()) - PyErr_SetString(PyExc_TypeError, - "PyModule_AddObject() needs non-NULL value"); + if (!value) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_SystemError, + "PyModule_AddObjectRef() must be called " + "with an exception raised if value is NULL"); + } return -1; } - dict = PyModule_GetDict(m); + PyObject *dict = PyModule_GetDict(mod); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", - PyModule_GetName(m)); + PyModule_GetName(mod)); return -1; } - if (PyDict_SetItemString(dict, name, o)) + + if (PyDict_SetItemString(dict, name, value)) { return -1; - Py_DECREF(o); + } return 0; } + +int +PyModule_AddObject(PyObject *mod, const char *name, PyObject *value) +{ + int res = PyModule_AddObjectRef(mod, name, value); + if (res == 0) { + Py_DECREF(value); + } + return res; +} + int PyModule_AddIntConstant(PyObject *m, const char *name, long value) { - PyObject *o = PyLong_FromLong(value); - if (!o) + PyObject *obj = PyLong_FromLong(value); + if (!obj) { return -1; - if (PyModule_AddObject(m, name, o) == 0) - return 0; - Py_DECREF(o); - return -1; + } + int res = PyModule_AddObjectRef(m, name, obj); + Py_DECREF(obj); + return res; } int PyModule_AddStringConstant(PyObject *m, const char *name, const char *value) { - PyObject *o = PyUnicode_FromString(value); - if (!o) + PyObject *obj = PyUnicode_FromString(value); + if (!obj) { return -1; - if (PyModule_AddObject(m, name, o) == 0) - return 0; - Py_DECREF(o); - return -1; + } + int res = PyModule_AddObjectRef(m, name, obj); + Py_DECREF(obj); + return res; } int @@ -696,11 +710,5 @@ PyModule_AddType(PyObject *module, PyTypeObject *type) const char *name = _PyType_Name(type); assert(name != NULL); - Py_INCREF(type); - if (PyModule_AddObject(module, name, (PyObject *)type) < 0) { - Py_DECREF(type); - return -1; - } - - return 0; + return PyModule_AddObjectRef(module, name, (PyObject *)type); } From c0b9654fb22c2d823c27d41ef045fdd9a89af9bb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 Nov 2020 16:15:54 +0100 Subject: [PATCH 0464/1261] bpo-42260: Reorganize PyConfig (GH-23149) * Move orig_argv before argv * Move program_name and platlibdir with other path configuration inputs Give a name to the PyPreConfig and PyConfig structures and separate the type definitions. --- Include/cpython/initconfig.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 3a38f77073dc60..666c1e419ca24d 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -41,7 +41,7 @@ PyAPI_FUNC(PyStatus) PyWideStringList_Insert(PyWideStringList *list, /* --- PyPreConfig ----------------------------------------------- */ -typedef struct { +typedef struct PyPreConfig { int _config_init; /* _PyConfigInitEnum value */ /* Parse Py_PreInitializeFromBytesArgs() arguments? @@ -128,7 +128,7 @@ PyAPI_FUNC(void) PyPreConfig_InitIsolatedConfig(PyPreConfig *config); /* --- PyConfig ---------------------------------------------- */ /* This structure is best documented in the Doc/c-api/init_config.rst file. */ -typedef struct { +typedef struct PyConfig { int _config_init; /* _PyConfigInitEnum value */ int isolated; @@ -147,8 +147,8 @@ typedef struct { wchar_t *filesystem_errors; wchar_t *pycache_prefix; int parse_argv; + PyWideStringList orig_argv; PyWideStringList argv; - wchar_t *program_name; PyWideStringList xoptions; PyWideStringList warnoptions; int site_import; @@ -169,12 +169,13 @@ typedef struct { int legacy_windows_stdio; #endif wchar_t *check_hash_pycs_mode; - PyWideStringList orig_argv; /* --- Path configuration inputs ------------ */ int pathconfig_warnings; + wchar_t *program_name; wchar_t *pythonpath_env; wchar_t *home; + wchar_t *platlibdir; /* --- Path configuration outputs ----------- */ int module_search_paths_set; @@ -185,7 +186,6 @@ typedef struct { wchar_t *base_prefix; wchar_t *exec_prefix; wchar_t *base_exec_prefix; - wchar_t *platlibdir; /* --- Parameter only used by Py_Main() ---------- */ int skip_source_first_line; From 6c41dfcb3eb05728e628bbef4d253829acd80ae7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 Nov 2020 16:33:55 +0100 Subject: [PATCH 0465/1261] bpo-1635741: _contextvars uses PyModule_AddType() (GH-23147) Replace PyModule_AddObject() with PyModule_AddType() in the _contextvars module (Python-ast.c). Add also the module name to _contextvars types name. --- Modules/_contextvarsmodule.c | 21 +++------------------ Python/context.c | 6 +++--- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/Modules/_contextvarsmodule.c b/Modules/_contextvarsmodule.c index d6d7f375d12307..d13b5962c13c44 100644 --- a/Modules/_contextvarsmodule.c +++ b/Modules/_contextvarsmodule.c @@ -30,30 +30,15 @@ static PyMethodDef _contextvars_methods[] = { static int _contextvars_exec(PyObject *m) { - Py_INCREF(&PyContext_Type); - if (PyModule_AddObject(m, "Context", - (PyObject *)&PyContext_Type) < 0) - { - Py_DECREF(&PyContext_Type); + if (PyModule_AddType(m, &PyContext_Type) < 0) { return -1; } - - Py_INCREF(&PyContextVar_Type); - if (PyModule_AddObject(m, "ContextVar", - (PyObject *)&PyContextVar_Type) < 0) - { - Py_DECREF(&PyContextVar_Type); + if (PyModule_AddType(m, &PyContextVar_Type) < 0) { return -1; } - - Py_INCREF(&PyContextToken_Type); - if (PyModule_AddObject(m, "Token", - (PyObject *)&PyContextToken_Type) < 0) - { - Py_DECREF(&PyContextToken_Type); + if (PyModule_AddType(m, &PyContextToken_Type) < 0) { return -1; } - return 0; } diff --git a/Python/context.c b/Python/context.c index 15d8b8ea4b9b61..82826bf928fa05 100644 --- a/Python/context.c +++ b/Python/context.c @@ -703,7 +703,7 @@ static PyMappingMethods PyContext_as_mapping = { PyTypeObject PyContext_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "Context", + "_contextvars.Context", sizeof(PyContext), .tp_methods = PyContext_methods, .tp_as_mapping = &PyContext_as_mapping, @@ -1056,7 +1056,7 @@ static PyMethodDef PyContextVar_methods[] = { PyTypeObject PyContextVar_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "ContextVar", + "_contextvars.ContextVar", sizeof(PyContextVar), .tp_methods = PyContextVar_methods, .tp_members = PyContextVar_members, @@ -1197,7 +1197,7 @@ static PyMethodDef PyContextTokenType_methods[] = { PyTypeObject PyContextToken_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "Token", + "_contextvars.Token", sizeof(PyContextToken), .tp_methods = PyContextTokenType_methods, .tp_getset = PyContextTokenType_getsetlist, From d8040030529fbf8021a30730a5f9b5edd860f52d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 Nov 2020 16:37:07 +0100 Subject: [PATCH 0466/1261] bpo-1635741: _ast uses PyModule_AddObjectRef() (GH-23146) Replace PyModule_AddObject() with PyModule_AddObjectRef() in the _ast module (Python-ast.c). --- Parser/asdl_c.py | 6 +- Python/Python-ast.c | 331 +++++++++++++++----------------------------- 2 files changed, 117 insertions(+), 220 deletions(-) diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 9fec7ae017cd7b..34bd7010cfb8fb 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1115,10 +1115,9 @@ def visitModule(self, mod): self.emit('if (state == NULL) {', 1) self.emit('return -1;', 2) self.emit('}', 1) - self.emit('if (PyModule_AddObject(m, "AST", state->AST_type) < 0) {', 1) + self.emit('if (PyModule_AddObjectRef(m, "AST", state->AST_type) < 0) {', 1) self.emit('return -1;', 2) self.emit('}', 1) - self.emit('Py_INCREF(state->AST_type);', 1) self.emit('if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) {', 1) self.emit("return -1;", 2) self.emit('}', 1) @@ -1166,11 +1165,10 @@ def visitConstructor(self, cons, name): self.addObj(cons.name) def addObj(self, name): - self.emit("if (PyModule_AddObject(m, \"%s\", " + self.emit("if (PyModule_AddObjectRef(m, \"%s\", " "state->%s_type) < 0) {" % (name, name), 1) self.emit("return -1;", 2) self.emit('}', 1) - self.emit("Py_INCREF(state->%s_type);" % name, 1) class StaticVisitor(PickleVisitor): diff --git a/Python/Python-ast.c b/Python/Python-ast.c index a456b519514256..debd3e3542f5e7 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -9718,10 +9718,9 @@ astmodule_exec(PyObject *m) if (state == NULL) { return -1; } - if (PyModule_AddObject(m, "AST", state->AST_type) < 0) { + if (PyModule_AddObjectRef(m, "AST", state->AST_type) < 0) { return -1; } - Py_INCREF(state->AST_type); if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) { return -1; } @@ -9731,432 +9730,332 @@ astmodule_exec(PyObject *m) if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) { return -1; } - if (PyModule_AddObject(m, "mod", state->mod_type) < 0) { + if (PyModule_AddObjectRef(m, "mod", state->mod_type) < 0) { return -1; } - Py_INCREF(state->mod_type); - if (PyModule_AddObject(m, "Module", state->Module_type) < 0) { + if (PyModule_AddObjectRef(m, "Module", state->Module_type) < 0) { return -1; } - Py_INCREF(state->Module_type); - if (PyModule_AddObject(m, "Interactive", state->Interactive_type) < 0) { + if (PyModule_AddObjectRef(m, "Interactive", state->Interactive_type) < 0) { return -1; } - Py_INCREF(state->Interactive_type); - if (PyModule_AddObject(m, "Expression", state->Expression_type) < 0) { + if (PyModule_AddObjectRef(m, "Expression", state->Expression_type) < 0) { return -1; } - Py_INCREF(state->Expression_type); - if (PyModule_AddObject(m, "FunctionType", state->FunctionType_type) < 0) { + if (PyModule_AddObjectRef(m, "FunctionType", state->FunctionType_type) < 0) + { return -1; } - Py_INCREF(state->FunctionType_type); - if (PyModule_AddObject(m, "stmt", state->stmt_type) < 0) { + if (PyModule_AddObjectRef(m, "stmt", state->stmt_type) < 0) { return -1; } - Py_INCREF(state->stmt_type); - if (PyModule_AddObject(m, "FunctionDef", state->FunctionDef_type) < 0) { + if (PyModule_AddObjectRef(m, "FunctionDef", state->FunctionDef_type) < 0) { return -1; } - Py_INCREF(state->FunctionDef_type); - if (PyModule_AddObject(m, "AsyncFunctionDef", state->AsyncFunctionDef_type) - < 0) { + if (PyModule_AddObjectRef(m, "AsyncFunctionDef", + state->AsyncFunctionDef_type) < 0) { return -1; } - Py_INCREF(state->AsyncFunctionDef_type); - if (PyModule_AddObject(m, "ClassDef", state->ClassDef_type) < 0) { + if (PyModule_AddObjectRef(m, "ClassDef", state->ClassDef_type) < 0) { return -1; } - Py_INCREF(state->ClassDef_type); - if (PyModule_AddObject(m, "Return", state->Return_type) < 0) { + if (PyModule_AddObjectRef(m, "Return", state->Return_type) < 0) { return -1; } - Py_INCREF(state->Return_type); - if (PyModule_AddObject(m, "Delete", state->Delete_type) < 0) { + if (PyModule_AddObjectRef(m, "Delete", state->Delete_type) < 0) { return -1; } - Py_INCREF(state->Delete_type); - if (PyModule_AddObject(m, "Assign", state->Assign_type) < 0) { + if (PyModule_AddObjectRef(m, "Assign", state->Assign_type) < 0) { return -1; } - Py_INCREF(state->Assign_type); - if (PyModule_AddObject(m, "AugAssign", state->AugAssign_type) < 0) { + if (PyModule_AddObjectRef(m, "AugAssign", state->AugAssign_type) < 0) { return -1; } - Py_INCREF(state->AugAssign_type); - if (PyModule_AddObject(m, "AnnAssign", state->AnnAssign_type) < 0) { + if (PyModule_AddObjectRef(m, "AnnAssign", state->AnnAssign_type) < 0) { return -1; } - Py_INCREF(state->AnnAssign_type); - if (PyModule_AddObject(m, "For", state->For_type) < 0) { + if (PyModule_AddObjectRef(m, "For", state->For_type) < 0) { return -1; } - Py_INCREF(state->For_type); - if (PyModule_AddObject(m, "AsyncFor", state->AsyncFor_type) < 0) { + if (PyModule_AddObjectRef(m, "AsyncFor", state->AsyncFor_type) < 0) { return -1; } - Py_INCREF(state->AsyncFor_type); - if (PyModule_AddObject(m, "While", state->While_type) < 0) { + if (PyModule_AddObjectRef(m, "While", state->While_type) < 0) { return -1; } - Py_INCREF(state->While_type); - if (PyModule_AddObject(m, "If", state->If_type) < 0) { + if (PyModule_AddObjectRef(m, "If", state->If_type) < 0) { return -1; } - Py_INCREF(state->If_type); - if (PyModule_AddObject(m, "With", state->With_type) < 0) { + if (PyModule_AddObjectRef(m, "With", state->With_type) < 0) { return -1; } - Py_INCREF(state->With_type); - if (PyModule_AddObject(m, "AsyncWith", state->AsyncWith_type) < 0) { + if (PyModule_AddObjectRef(m, "AsyncWith", state->AsyncWith_type) < 0) { return -1; } - Py_INCREF(state->AsyncWith_type); - if (PyModule_AddObject(m, "Raise", state->Raise_type) < 0) { + if (PyModule_AddObjectRef(m, "Raise", state->Raise_type) < 0) { return -1; } - Py_INCREF(state->Raise_type); - if (PyModule_AddObject(m, "Try", state->Try_type) < 0) { + if (PyModule_AddObjectRef(m, "Try", state->Try_type) < 0) { return -1; } - Py_INCREF(state->Try_type); - if (PyModule_AddObject(m, "Assert", state->Assert_type) < 0) { + if (PyModule_AddObjectRef(m, "Assert", state->Assert_type) < 0) { return -1; } - Py_INCREF(state->Assert_type); - if (PyModule_AddObject(m, "Import", state->Import_type) < 0) { + if (PyModule_AddObjectRef(m, "Import", state->Import_type) < 0) { return -1; } - Py_INCREF(state->Import_type); - if (PyModule_AddObject(m, "ImportFrom", state->ImportFrom_type) < 0) { + if (PyModule_AddObjectRef(m, "ImportFrom", state->ImportFrom_type) < 0) { return -1; } - Py_INCREF(state->ImportFrom_type); - if (PyModule_AddObject(m, "Global", state->Global_type) < 0) { + if (PyModule_AddObjectRef(m, "Global", state->Global_type) < 0) { return -1; } - Py_INCREF(state->Global_type); - if (PyModule_AddObject(m, "Nonlocal", state->Nonlocal_type) < 0) { + if (PyModule_AddObjectRef(m, "Nonlocal", state->Nonlocal_type) < 0) { return -1; } - Py_INCREF(state->Nonlocal_type); - if (PyModule_AddObject(m, "Expr", state->Expr_type) < 0) { + if (PyModule_AddObjectRef(m, "Expr", state->Expr_type) < 0) { return -1; } - Py_INCREF(state->Expr_type); - if (PyModule_AddObject(m, "Pass", state->Pass_type) < 0) { + if (PyModule_AddObjectRef(m, "Pass", state->Pass_type) < 0) { return -1; } - Py_INCREF(state->Pass_type); - if (PyModule_AddObject(m, "Break", state->Break_type) < 0) { + if (PyModule_AddObjectRef(m, "Break", state->Break_type) < 0) { return -1; } - Py_INCREF(state->Break_type); - if (PyModule_AddObject(m, "Continue", state->Continue_type) < 0) { + if (PyModule_AddObjectRef(m, "Continue", state->Continue_type) < 0) { return -1; } - Py_INCREF(state->Continue_type); - if (PyModule_AddObject(m, "expr", state->expr_type) < 0) { + if (PyModule_AddObjectRef(m, "expr", state->expr_type) < 0) { return -1; } - Py_INCREF(state->expr_type); - if (PyModule_AddObject(m, "BoolOp", state->BoolOp_type) < 0) { + if (PyModule_AddObjectRef(m, "BoolOp", state->BoolOp_type) < 0) { return -1; } - Py_INCREF(state->BoolOp_type); - if (PyModule_AddObject(m, "NamedExpr", state->NamedExpr_type) < 0) { + if (PyModule_AddObjectRef(m, "NamedExpr", state->NamedExpr_type) < 0) { return -1; } - Py_INCREF(state->NamedExpr_type); - if (PyModule_AddObject(m, "BinOp", state->BinOp_type) < 0) { + if (PyModule_AddObjectRef(m, "BinOp", state->BinOp_type) < 0) { return -1; } - Py_INCREF(state->BinOp_type); - if (PyModule_AddObject(m, "UnaryOp", state->UnaryOp_type) < 0) { + if (PyModule_AddObjectRef(m, "UnaryOp", state->UnaryOp_type) < 0) { return -1; } - Py_INCREF(state->UnaryOp_type); - if (PyModule_AddObject(m, "Lambda", state->Lambda_type) < 0) { + if (PyModule_AddObjectRef(m, "Lambda", state->Lambda_type) < 0) { return -1; } - Py_INCREF(state->Lambda_type); - if (PyModule_AddObject(m, "IfExp", state->IfExp_type) < 0) { + if (PyModule_AddObjectRef(m, "IfExp", state->IfExp_type) < 0) { return -1; } - Py_INCREF(state->IfExp_type); - if (PyModule_AddObject(m, "Dict", state->Dict_type) < 0) { + if (PyModule_AddObjectRef(m, "Dict", state->Dict_type) < 0) { return -1; } - Py_INCREF(state->Dict_type); - if (PyModule_AddObject(m, "Set", state->Set_type) < 0) { + if (PyModule_AddObjectRef(m, "Set", state->Set_type) < 0) { return -1; } - Py_INCREF(state->Set_type); - if (PyModule_AddObject(m, "ListComp", state->ListComp_type) < 0) { + if (PyModule_AddObjectRef(m, "ListComp", state->ListComp_type) < 0) { return -1; } - Py_INCREF(state->ListComp_type); - if (PyModule_AddObject(m, "SetComp", state->SetComp_type) < 0) { + if (PyModule_AddObjectRef(m, "SetComp", state->SetComp_type) < 0) { return -1; } - Py_INCREF(state->SetComp_type); - if (PyModule_AddObject(m, "DictComp", state->DictComp_type) < 0) { + if (PyModule_AddObjectRef(m, "DictComp", state->DictComp_type) < 0) { return -1; } - Py_INCREF(state->DictComp_type); - if (PyModule_AddObject(m, "GeneratorExp", state->GeneratorExp_type) < 0) { + if (PyModule_AddObjectRef(m, "GeneratorExp", state->GeneratorExp_type) < 0) + { return -1; } - Py_INCREF(state->GeneratorExp_type); - if (PyModule_AddObject(m, "Await", state->Await_type) < 0) { + if (PyModule_AddObjectRef(m, "Await", state->Await_type) < 0) { return -1; } - Py_INCREF(state->Await_type); - if (PyModule_AddObject(m, "Yield", state->Yield_type) < 0) { + if (PyModule_AddObjectRef(m, "Yield", state->Yield_type) < 0) { return -1; } - Py_INCREF(state->Yield_type); - if (PyModule_AddObject(m, "YieldFrom", state->YieldFrom_type) < 0) { + if (PyModule_AddObjectRef(m, "YieldFrom", state->YieldFrom_type) < 0) { return -1; } - Py_INCREF(state->YieldFrom_type); - if (PyModule_AddObject(m, "Compare", state->Compare_type) < 0) { + if (PyModule_AddObjectRef(m, "Compare", state->Compare_type) < 0) { return -1; } - Py_INCREF(state->Compare_type); - if (PyModule_AddObject(m, "Call", state->Call_type) < 0) { + if (PyModule_AddObjectRef(m, "Call", state->Call_type) < 0) { return -1; } - Py_INCREF(state->Call_type); - if (PyModule_AddObject(m, "FormattedValue", state->FormattedValue_type) < - 0) { + if (PyModule_AddObjectRef(m, "FormattedValue", state->FormattedValue_type) + < 0) { return -1; } - Py_INCREF(state->FormattedValue_type); - if (PyModule_AddObject(m, "JoinedStr", state->JoinedStr_type) < 0) { + if (PyModule_AddObjectRef(m, "JoinedStr", state->JoinedStr_type) < 0) { return -1; } - Py_INCREF(state->JoinedStr_type); - if (PyModule_AddObject(m, "Constant", state->Constant_type) < 0) { + if (PyModule_AddObjectRef(m, "Constant", state->Constant_type) < 0) { return -1; } - Py_INCREF(state->Constant_type); - if (PyModule_AddObject(m, "Attribute", state->Attribute_type) < 0) { + if (PyModule_AddObjectRef(m, "Attribute", state->Attribute_type) < 0) { return -1; } - Py_INCREF(state->Attribute_type); - if (PyModule_AddObject(m, "Subscript", state->Subscript_type) < 0) { + if (PyModule_AddObjectRef(m, "Subscript", state->Subscript_type) < 0) { return -1; } - Py_INCREF(state->Subscript_type); - if (PyModule_AddObject(m, "Starred", state->Starred_type) < 0) { + if (PyModule_AddObjectRef(m, "Starred", state->Starred_type) < 0) { return -1; } - Py_INCREF(state->Starred_type); - if (PyModule_AddObject(m, "Name", state->Name_type) < 0) { + if (PyModule_AddObjectRef(m, "Name", state->Name_type) < 0) { return -1; } - Py_INCREF(state->Name_type); - if (PyModule_AddObject(m, "List", state->List_type) < 0) { + if (PyModule_AddObjectRef(m, "List", state->List_type) < 0) { return -1; } - Py_INCREF(state->List_type); - if (PyModule_AddObject(m, "Tuple", state->Tuple_type) < 0) { + if (PyModule_AddObjectRef(m, "Tuple", state->Tuple_type) < 0) { return -1; } - Py_INCREF(state->Tuple_type); - if (PyModule_AddObject(m, "Slice", state->Slice_type) < 0) { + if (PyModule_AddObjectRef(m, "Slice", state->Slice_type) < 0) { return -1; } - Py_INCREF(state->Slice_type); - if (PyModule_AddObject(m, "expr_context", state->expr_context_type) < 0) { + if (PyModule_AddObjectRef(m, "expr_context", state->expr_context_type) < 0) + { return -1; } - Py_INCREF(state->expr_context_type); - if (PyModule_AddObject(m, "Load", state->Load_type) < 0) { + if (PyModule_AddObjectRef(m, "Load", state->Load_type) < 0) { return -1; } - Py_INCREF(state->Load_type); - if (PyModule_AddObject(m, "Store", state->Store_type) < 0) { + if (PyModule_AddObjectRef(m, "Store", state->Store_type) < 0) { return -1; } - Py_INCREF(state->Store_type); - if (PyModule_AddObject(m, "Del", state->Del_type) < 0) { + if (PyModule_AddObjectRef(m, "Del", state->Del_type) < 0) { return -1; } - Py_INCREF(state->Del_type); - if (PyModule_AddObject(m, "boolop", state->boolop_type) < 0) { + if (PyModule_AddObjectRef(m, "boolop", state->boolop_type) < 0) { return -1; } - Py_INCREF(state->boolop_type); - if (PyModule_AddObject(m, "And", state->And_type) < 0) { + if (PyModule_AddObjectRef(m, "And", state->And_type) < 0) { return -1; } - Py_INCREF(state->And_type); - if (PyModule_AddObject(m, "Or", state->Or_type) < 0) { + if (PyModule_AddObjectRef(m, "Or", state->Or_type) < 0) { return -1; } - Py_INCREF(state->Or_type); - if (PyModule_AddObject(m, "operator", state->operator_type) < 0) { + if (PyModule_AddObjectRef(m, "operator", state->operator_type) < 0) { return -1; } - Py_INCREF(state->operator_type); - if (PyModule_AddObject(m, "Add", state->Add_type) < 0) { + if (PyModule_AddObjectRef(m, "Add", state->Add_type) < 0) { return -1; } - Py_INCREF(state->Add_type); - if (PyModule_AddObject(m, "Sub", state->Sub_type) < 0) { + if (PyModule_AddObjectRef(m, "Sub", state->Sub_type) < 0) { return -1; } - Py_INCREF(state->Sub_type); - if (PyModule_AddObject(m, "Mult", state->Mult_type) < 0) { + if (PyModule_AddObjectRef(m, "Mult", state->Mult_type) < 0) { return -1; } - Py_INCREF(state->Mult_type); - if (PyModule_AddObject(m, "MatMult", state->MatMult_type) < 0) { + if (PyModule_AddObjectRef(m, "MatMult", state->MatMult_type) < 0) { return -1; } - Py_INCREF(state->MatMult_type); - if (PyModule_AddObject(m, "Div", state->Div_type) < 0) { + if (PyModule_AddObjectRef(m, "Div", state->Div_type) < 0) { return -1; } - Py_INCREF(state->Div_type); - if (PyModule_AddObject(m, "Mod", state->Mod_type) < 0) { + if (PyModule_AddObjectRef(m, "Mod", state->Mod_type) < 0) { return -1; } - Py_INCREF(state->Mod_type); - if (PyModule_AddObject(m, "Pow", state->Pow_type) < 0) { + if (PyModule_AddObjectRef(m, "Pow", state->Pow_type) < 0) { return -1; } - Py_INCREF(state->Pow_type); - if (PyModule_AddObject(m, "LShift", state->LShift_type) < 0) { + if (PyModule_AddObjectRef(m, "LShift", state->LShift_type) < 0) { return -1; } - Py_INCREF(state->LShift_type); - if (PyModule_AddObject(m, "RShift", state->RShift_type) < 0) { + if (PyModule_AddObjectRef(m, "RShift", state->RShift_type) < 0) { return -1; } - Py_INCREF(state->RShift_type); - if (PyModule_AddObject(m, "BitOr", state->BitOr_type) < 0) { + if (PyModule_AddObjectRef(m, "BitOr", state->BitOr_type) < 0) { return -1; } - Py_INCREF(state->BitOr_type); - if (PyModule_AddObject(m, "BitXor", state->BitXor_type) < 0) { + if (PyModule_AddObjectRef(m, "BitXor", state->BitXor_type) < 0) { return -1; } - Py_INCREF(state->BitXor_type); - if (PyModule_AddObject(m, "BitAnd", state->BitAnd_type) < 0) { + if (PyModule_AddObjectRef(m, "BitAnd", state->BitAnd_type) < 0) { return -1; } - Py_INCREF(state->BitAnd_type); - if (PyModule_AddObject(m, "FloorDiv", state->FloorDiv_type) < 0) { + if (PyModule_AddObjectRef(m, "FloorDiv", state->FloorDiv_type) < 0) { return -1; } - Py_INCREF(state->FloorDiv_type); - if (PyModule_AddObject(m, "unaryop", state->unaryop_type) < 0) { + if (PyModule_AddObjectRef(m, "unaryop", state->unaryop_type) < 0) { return -1; } - Py_INCREF(state->unaryop_type); - if (PyModule_AddObject(m, "Invert", state->Invert_type) < 0) { + if (PyModule_AddObjectRef(m, "Invert", state->Invert_type) < 0) { return -1; } - Py_INCREF(state->Invert_type); - if (PyModule_AddObject(m, "Not", state->Not_type) < 0) { + if (PyModule_AddObjectRef(m, "Not", state->Not_type) < 0) { return -1; } - Py_INCREF(state->Not_type); - if (PyModule_AddObject(m, "UAdd", state->UAdd_type) < 0) { + if (PyModule_AddObjectRef(m, "UAdd", state->UAdd_type) < 0) { return -1; } - Py_INCREF(state->UAdd_type); - if (PyModule_AddObject(m, "USub", state->USub_type) < 0) { + if (PyModule_AddObjectRef(m, "USub", state->USub_type) < 0) { return -1; } - Py_INCREF(state->USub_type); - if (PyModule_AddObject(m, "cmpop", state->cmpop_type) < 0) { + if (PyModule_AddObjectRef(m, "cmpop", state->cmpop_type) < 0) { return -1; } - Py_INCREF(state->cmpop_type); - if (PyModule_AddObject(m, "Eq", state->Eq_type) < 0) { + if (PyModule_AddObjectRef(m, "Eq", state->Eq_type) < 0) { return -1; } - Py_INCREF(state->Eq_type); - if (PyModule_AddObject(m, "NotEq", state->NotEq_type) < 0) { + if (PyModule_AddObjectRef(m, "NotEq", state->NotEq_type) < 0) { return -1; } - Py_INCREF(state->NotEq_type); - if (PyModule_AddObject(m, "Lt", state->Lt_type) < 0) { + if (PyModule_AddObjectRef(m, "Lt", state->Lt_type) < 0) { return -1; } - Py_INCREF(state->Lt_type); - if (PyModule_AddObject(m, "LtE", state->LtE_type) < 0) { + if (PyModule_AddObjectRef(m, "LtE", state->LtE_type) < 0) { return -1; } - Py_INCREF(state->LtE_type); - if (PyModule_AddObject(m, "Gt", state->Gt_type) < 0) { + if (PyModule_AddObjectRef(m, "Gt", state->Gt_type) < 0) { return -1; } - Py_INCREF(state->Gt_type); - if (PyModule_AddObject(m, "GtE", state->GtE_type) < 0) { + if (PyModule_AddObjectRef(m, "GtE", state->GtE_type) < 0) { return -1; } - Py_INCREF(state->GtE_type); - if (PyModule_AddObject(m, "Is", state->Is_type) < 0) { + if (PyModule_AddObjectRef(m, "Is", state->Is_type) < 0) { return -1; } - Py_INCREF(state->Is_type); - if (PyModule_AddObject(m, "IsNot", state->IsNot_type) < 0) { + if (PyModule_AddObjectRef(m, "IsNot", state->IsNot_type) < 0) { return -1; } - Py_INCREF(state->IsNot_type); - if (PyModule_AddObject(m, "In", state->In_type) < 0) { + if (PyModule_AddObjectRef(m, "In", state->In_type) < 0) { return -1; } - Py_INCREF(state->In_type); - if (PyModule_AddObject(m, "NotIn", state->NotIn_type) < 0) { + if (PyModule_AddObjectRef(m, "NotIn", state->NotIn_type) < 0) { return -1; } - Py_INCREF(state->NotIn_type); - if (PyModule_AddObject(m, "comprehension", state->comprehension_type) < 0) { + if (PyModule_AddObjectRef(m, "comprehension", state->comprehension_type) < + 0) { return -1; } - Py_INCREF(state->comprehension_type); - if (PyModule_AddObject(m, "excepthandler", state->excepthandler_type) < 0) { + if (PyModule_AddObjectRef(m, "excepthandler", state->excepthandler_type) < + 0) { return -1; } - Py_INCREF(state->excepthandler_type); - if (PyModule_AddObject(m, "ExceptHandler", state->ExceptHandler_type) < 0) { + if (PyModule_AddObjectRef(m, "ExceptHandler", state->ExceptHandler_type) < + 0) { return -1; } - Py_INCREF(state->ExceptHandler_type); - if (PyModule_AddObject(m, "arguments", state->arguments_type) < 0) { + if (PyModule_AddObjectRef(m, "arguments", state->arguments_type) < 0) { return -1; } - Py_INCREF(state->arguments_type); - if (PyModule_AddObject(m, "arg", state->arg_type) < 0) { + if (PyModule_AddObjectRef(m, "arg", state->arg_type) < 0) { return -1; } - Py_INCREF(state->arg_type); - if (PyModule_AddObject(m, "keyword", state->keyword_type) < 0) { + if (PyModule_AddObjectRef(m, "keyword", state->keyword_type) < 0) { return -1; } - Py_INCREF(state->keyword_type); - if (PyModule_AddObject(m, "alias", state->alias_type) < 0) { + if (PyModule_AddObjectRef(m, "alias", state->alias_type) < 0) { return -1; } - Py_INCREF(state->alias_type); - if (PyModule_AddObject(m, "withitem", state->withitem_type) < 0) { + if (PyModule_AddObjectRef(m, "withitem", state->withitem_type) < 0) { return -1; } - Py_INCREF(state->withitem_type); - if (PyModule_AddObject(m, "type_ignore", state->type_ignore_type) < 0) { + if (PyModule_AddObjectRef(m, "type_ignore", state->type_ignore_type) < 0) { return -1; } - Py_INCREF(state->type_ignore_type); - if (PyModule_AddObject(m, "TypeIgnore", state->TypeIgnore_type) < 0) { + if (PyModule_AddObjectRef(m, "TypeIgnore", state->TypeIgnore_type) < 0) { return -1; } - Py_INCREF(state->TypeIgnore_type); return 0; } From 23eb723de10d1c1f75cd272597bfd267782fc7d2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 Nov 2020 17:33:06 +0100 Subject: [PATCH 0467/1261] bpo-1635741: Fix ref leak in _PyWarnings_Init() error path (GH-23151) Replace PyModule_AddObject() with PyModule_AddObjectRef() in the _warnings module to fix a reference leak on error. Use also PyModule_AddObjectRef() in importdl.c. --- Python/_warnings.c | 11 +++-------- Python/importdl.c | 5 ++--- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Python/_warnings.c b/Python/_warnings.c index 3c048af4193a00..e42b7c3be3db9a 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -1395,18 +1395,13 @@ _PyWarnings_Init(void) goto error; } - Py_INCREF(st->filters); - if (PyModule_AddObject(m, "filters", st->filters) < 0) { + if (PyModule_AddObjectRef(m, "filters", st->filters) < 0) { goto error; } - - Py_INCREF(st->once_registry); - if (PyModule_AddObject(m, "_onceregistry", st->once_registry) < 0) { + if (PyModule_AddObjectRef(m, "_onceregistry", st->once_registry) < 0) { goto error; } - - Py_INCREF(st->default_action); - if (PyModule_AddObject(m, "_defaultaction", st->default_action) < 0) { + if (PyModule_AddObjectRef(m, "_defaultaction", st->default_action) < 0) { goto error; } diff --git a/Python/importdl.c b/Python/importdl.c index fbeb9fb75403e6..1847eba74aef45 100644 --- a/Python/importdl.c +++ b/Python/importdl.c @@ -220,10 +220,9 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp) def->m_base.m_init = p0; /* Remember the filename as the __file__ attribute */ - if (PyModule_AddObject(m, "__file__", path) < 0) + if (PyModule_AddObjectRef(m, "__file__", path) < 0) { PyErr_Clear(); /* Not important enough to report */ - else - Py_INCREF(path); + } PyObject *modules = PyImport_GetModuleDict(); if (_PyImport_FixupExtensionObject(m, name_unicode, path, modules) < 0) From d31616d263550a602895d6b8b4c4432c88384934 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 Nov 2020 17:34:34 +0100 Subject: [PATCH 0468/1261] bpo-42260: Main init modify sys.flags in-place (GH-23150) When Py_Initialize() is called twice, the second call now updates more sys attributes for the configuration, rather than only sys.argv. * Rename _PySys_InitMain() to _PySys_UpdateConfig(). * _PySys_UpdateConfig() now modifies sys.flags in-place, instead of creating a new flags object. * Remove old commented sys.flags flags (unbuffered and skip_first). * Add private _PySys_GetObject() function. * When Py_Initialize(), Py_InitializeFromConfig() and --- Include/internal/pycore_pylifecycle.h | 2 +- .../2020-11-04-16-31-55.bpo-42260.CmgHtF.rst | 3 + Python/pylifecycle.c | 45 +++---- Python/sysmodule.c | 113 +++++++++++------- 4 files changed, 89 insertions(+), 74 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-04-16-31-55.bpo-42260.CmgHtF.rst diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index cba3bbdc2b2565..606252b968da97 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -44,7 +44,7 @@ extern PyStatus _PySys_Create( PyObject **sysmod_p); extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options); extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config); -extern int _PySys_InitMain(PyThreadState *tstate); +extern int _PySys_UpdateConfig(PyThreadState *tstate); extern PyStatus _PyExc_Init(PyThreadState *tstate); extern PyStatus _PyErr_Init(void); extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod); diff --git a/Misc/NEWS.d/next/C API/2020-11-04-16-31-55.bpo-42260.CmgHtF.rst b/Misc/NEWS.d/next/C API/2020-11-04-16-31-55.bpo-42260.CmgHtF.rst new file mode 100644 index 00000000000000..694dd550a8e18d --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-04-16-31-55.bpo-42260.CmgHtF.rst @@ -0,0 +1,3 @@ +When :c:func:`Py_Initialize` is called twice, the second call now updates +more :mod:`sys` attributes for the configuration, rather than only +:data:`sys.argv`. Patch by Victor Stinner. diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index cad0fa7026bfd5..1f826d7f6c4453 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -949,19 +949,10 @@ pyinit_core(_PyRuntimeState *runtime, configuration. Example of bpo-34008: Py_Main() called after Py_Initialize(). */ static PyStatus -_Py_ReconfigureMainInterpreter(PyThreadState *tstate) +pyinit_main_reconfigure(PyThreadState *tstate) { - const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); - - PyObject *argv = _PyWideStringList_AsList(&config->argv); - if (argv == NULL) { - return _PyStatus_NO_MEMORY(); \ - } - - int res = PyDict_SetItemString(tstate->interp->sysdict, "argv", argv); - Py_DECREF(argv); - if (res < 0) { - return _PyStatus_ERR("fail to set sys.argv"); + if (_PySys_UpdateConfig(tstate) < 0) { + return _PyStatus_ERR("fail to update sys for the new conf"); } return _PyStatus_OK(); } @@ -995,7 +986,7 @@ init_interp_main(PyThreadState *tstate) } } - if (_PySys_InitMain(tstate) < 0) { + if (_PySys_UpdateConfig(tstate) < 0) { return _PyStatus_ERR("can't finish initializing sys"); } @@ -1100,7 +1091,7 @@ pyinit_main(PyThreadState *tstate) } if (interp->runtime->initialized) { - return _Py_ReconfigureMainInterpreter(tstate); + return pyinit_main_reconfigure(tstate); } PyStatus status = init_interp_main(tstate); @@ -1111,19 +1102,6 @@ pyinit_main(PyThreadState *tstate) } -PyStatus -_Py_InitializeMain(void) -{ - PyStatus status = _PyRuntime_Initialize(); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - return pyinit_main(tstate); -} - - PyStatus Py_InitializeFromConfig(const PyConfig *config) { @@ -1191,6 +1169,19 @@ Py_Initialize(void) } +PyStatus +_Py_InitializeMain(void) +{ + PyStatus status = _PyRuntime_Initialize(); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + return pyinit_main(tstate); +} + + static void finalize_modules_delete_special(PyThreadState *tstate, int verbose) { diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 945e639ca57560..60b2494651235a 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -84,17 +84,24 @@ _PySys_GetObjectId(_Py_Identifier *key) return sys_get_object_id(tstate, key); } +static PyObject * +_PySys_GetObject(PyThreadState *tstate, const char *name) +{ + PyObject *sysdict = tstate->interp->sysdict; + if (sysdict == NULL) { + return NULL; + } + return _PyDict_GetItemStringWithError(sysdict, name); +} + PyObject * PySys_GetObject(const char *name) { PyThreadState *tstate = _PyThreadState_GET(); - PyObject *sd = tstate->interp->sysdict; - if (sd == NULL) { - return NULL; - } + PyObject *exc_type, *exc_value, *exc_tb; _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); - PyObject *value = _PyDict_GetItemStringWithError(sd, name); + PyObject *value = _PySys_GetObject(tstate, name); /* XXX Suppress a new exception if it was raised and restore * the old one. */ _PyErr_Restore(tstate, exc_type, exc_value, exc_tb); @@ -2464,8 +2471,6 @@ static PyStructSequence_Field flags_fields[] = { {"no_site", "-S"}, {"ignore_environment", "-E"}, {"verbose", "-v"}, - /* {"unbuffered", "-u"}, */ - /* {"skip_first", "-x"}, */ {"bytes_warning", "-b"}, {"quiet", "-q"}, {"hash_randomization", "-R"}, @@ -2482,21 +2487,27 @@ static PyStructSequence_Desc flags_desc = { 15 }; -static PyObject* -make_flags(PyThreadState *tstate) +static int +set_flags_from_config(PyObject *flags, PyThreadState *tstate) { PyInterpreterState *interp = tstate->interp; const PyPreConfig *preconfig = &interp->runtime->preconfig; const PyConfig *config = _PyInterpreterState_GetConfig(interp); - PyObject *seq = PyStructSequence_New(&FlagsType); - if (seq == NULL) { - return NULL; - } - - int pos = 0; -#define SetFlag(flag) \ - PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag)) + // _PySys_UpdateConfig() modifies sys.flags in-place: + // Py_XDECREF() is needed in this case. + Py_ssize_t pos = 0; +#define SetFlagObj(expr) \ + do { \ + PyObject *value = (expr); \ + if (value == NULL) { \ + return -1; \ + } \ + Py_XDECREF(PyStructSequence_GET_ITEM(flags, pos)); \ + PyStructSequence_SET_ITEM(flags, pos, value); \ + pos++; \ + } while (0) +#define SetFlag(expr) SetFlagObj(PyLong_FromLong(expr)) SetFlag(config->parser_debug); SetFlag(config->inspect); @@ -2507,23 +2518,34 @@ make_flags(PyThreadState *tstate) SetFlag(!config->site_import); SetFlag(!config->use_environment); SetFlag(config->verbose); - /* SetFlag(saw_unbuffered_flag); */ - /* SetFlag(skipfirstline); */ SetFlag(config->bytes_warning); SetFlag(config->quiet); SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0); SetFlag(config->isolated); - PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode)); + SetFlagObj(PyBool_FromLong(config->dev_mode)); SetFlag(preconfig->utf8_mode); +#undef SetFlagObj #undef SetFlag + return 0; +} - if (_PyErr_Occurred(tstate)) { - Py_DECREF(seq); + +static PyObject* +make_flags(PyThreadState *tstate) +{ + PyObject *flags = PyStructSequence_New(&FlagsType); + if (flags == NULL) { return NULL; } - return seq; + + if (set_flags_from_config(flags, tstate) < 0) { + Py_DECREF(flags); + return NULL; + } + return flags; } + PyDoc_STRVAR(version_info__doc__, "sys.version_info\n\ \n\ @@ -2767,14 +2789,23 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) /* implementation */ SET_SYS("implementation", make_impl_info(version_info)); - /* flags */ + // sys.flags: updated in-place later by _PySys_UpdateConfig() if (FlagsType.tp_name == 0) { if (PyStructSequence_InitType2(&FlagsType, &flags_desc) < 0) { goto type_init_failed; } } - /* Set flags to their default values (updated by _PySys_InitMain()) */ SET_SYS("flags", make_flags(tstate)); + /* prevent user from creating new instances */ + FlagsType.tp_init = NULL; + FlagsType.tp_new = NULL; + res = PyDict_DelItemString(FlagsType.tp_dict, "__new__"); + if (res < 0) { + if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + goto err_occurred; + } + _PyErr_Clear(tstate); + } #if defined(MS_WINDOWS) /* getwindowsversion */ @@ -2876,8 +2907,10 @@ sys_create_xoptions_dict(const PyConfig *config) } +// Update sys attributes for a new PyConfig configuration. +// This function also adds attributes that _PySys_InitCore() didn't add. int -_PySys_InitMain(PyThreadState *tstate) +_PySys_UpdateConfig(PyThreadState *tstate) { PyObject *sysdict = tstate->interp->sysdict; const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); @@ -2914,28 +2947,16 @@ _PySys_InitMain(PyThreadState *tstate) #undef COPY_LIST #undef SET_SYS_FROM_WSTR - - /* Set flags to their final values */ - SET_SYS("flags", make_flags(tstate)); - /* prevent user from creating new instances */ - FlagsType.tp_init = NULL; - FlagsType.tp_new = NULL; - res = PyDict_DelItemString(FlagsType.tp_dict, "__new__"); - if (res < 0) { - if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { - return res; - } - _PyErr_Clear(tstate); + // sys.flags + PyObject *flags = _PySys_GetObject(tstate, "flags"); // borrowed ref + if (flags == NULL) { + return -1; } - - SET_SYS("dont_write_bytecode", PyBool_FromLong(!config->write_bytecode)); - - if (get_warnoptions(tstate) == NULL) { + if (set_flags_from_config(flags, tstate) < 0) { return -1; } - if (get_xoptions(tstate) == NULL) - return -1; + SET_SYS("dont_write_bytecode", PyBool_FromLong(!config->write_bytecode)); if (_PyErr_Occurred(tstate)) { goto err_occurred; @@ -2977,8 +2998,8 @@ _PySys_SetPreliminaryStderr(PyObject *sysdict) } -/* Create sys module without all attributes: _PySys_InitMain() should be called - later to add remaining attributes. */ +/* Create sys module without all attributes. + _PySys_UpdateConfig() should be called later to add remaining attributes. */ PyStatus _PySys_Create(PyThreadState *tstate, PyObject **sysmod_p) { From 1ba72a38b049692c090260a1a110696efe5efc77 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Wed, 4 Nov 2020 11:37:23 -0600 Subject: [PATCH 0469/1261] bpo-1635741: Fix PyInit_pyexpat() error handling (GH-22489) Split PyInit_pyexpat() into sub-functions and fix reference leaks on error paths. --- Modules/pyexpat.c | 488 ++++++++++++++++++++++++++++------------------ 1 file changed, 299 insertions(+), 189 deletions(-) diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 73ea51385ee80a..7d7da568972a2e 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1587,18 +1587,6 @@ PyDoc_STRVAR(pyexpat_module_documentation, #define MODULE_INITFUNC PyInit_pyexpat #endif -static struct PyModuleDef pyexpatmodule = { - PyModuleDef_HEAD_INIT, - MODULE_NAME, - pyexpat_module_documentation, - -1, - pyexpat_methods, - NULL, - NULL, - NULL, - NULL -}; - static int init_handler_descrs(void) { int i; @@ -1623,210 +1611,182 @@ static int init_handler_descrs(void) return 0; } -PyMODINIT_FUNC -MODULE_INITFUNC(void) +static PyObject * +add_submodule(PyObject *mod, const char *fullname) { - PyObject *m, *d; - PyObject *errmod_name = PyUnicode_FromString(MODULE_NAME ".errors"); - PyObject *errors_module; - PyObject *modelmod_name; - PyObject *model_module; - PyObject *tmpnum, *tmpstr; - PyObject *codes_dict; - PyObject *rev_codes_dict; - int res; - static struct PyExpat_CAPI capi; - PyObject *capi_object; + const char *name = strrchr(fullname, '.') + 1; - if (errmod_name == NULL) - return NULL; - modelmod_name = PyUnicode_FromString(MODULE_NAME ".model"); - if (modelmod_name == NULL) + PyObject *submodule = PyModule_New(fullname); + if (submodule == NULL) { return NULL; + } - if (PyType_Ready(&Xmlparsetype) < 0 || init_handler_descrs() < 0) + PyObject *mod_name = PyUnicode_FromString(fullname); + if (mod_name == NULL) { + Py_DECREF(submodule); return NULL; + } - /* Create the module and add the functions */ - m = PyModule_Create(&pyexpatmodule); - if (m == NULL) + if (_PyImport_SetModule(mod_name, submodule) < 0) { + Py_DECREF(submodule); + Py_DECREF(mod_name); return NULL; + } + Py_DECREF(mod_name); - /* Add some symbolic constants to the module */ - if (ErrorObject == NULL) { - ErrorObject = PyErr_NewException("xml.parsers.expat.ExpatError", - NULL, NULL); - if (ErrorObject == NULL) - return NULL; + /* gives away the reference to the submodule */ + if (PyModule_AddObject(mod, name, submodule) < 0) { + Py_DECREF(submodule); + return NULL; } - Py_INCREF(ErrorObject); - PyModule_AddObject(m, "error", ErrorObject); - Py_INCREF(ErrorObject); - PyModule_AddObject(m, "ExpatError", ErrorObject); - Py_INCREF(&Xmlparsetype); - PyModule_AddObject(m, "XMLParserType", (PyObject *) &Xmlparsetype); - PyModule_AddStringConstant(m, "EXPAT_VERSION", - XML_ExpatVersion()); - { - XML_Expat_Version info = XML_ExpatVersionInfo(); - PyModule_AddObject(m, "version_info", - Py_BuildValue("(iii)", info.major, - info.minor, info.micro)); + return submodule; +} + +static int +add_error(PyObject *errors_module, PyObject *codes_dict, + PyObject *rev_codes_dict, const char *name, int value) +{ + const char *error_string = XML_ErrorString(value); + if (PyModule_AddStringConstant(errors_module, name, error_string) < 0) { + return -1; } - /* XXX When Expat supports some way of figuring out how it was - compiled, this should check and set native_encoding - appropriately. - */ - PyModule_AddStringConstant(m, "native_encoding", "UTF-8"); - d = PyModule_GetDict(m); - if (d == NULL) { - Py_DECREF(m); - return NULL; + PyObject *num = PyLong_FromLong(value); + if (num == NULL) { + return -1; } - errors_module = PyDict_GetItemWithError(d, errmod_name); - if (errors_module == NULL && !PyErr_Occurred()) { - errors_module = PyModule_New(MODULE_NAME ".errors"); - if (errors_module != NULL) { - _PyImport_SetModule(errmod_name, errors_module); - /* gives away the reference to errors_module */ - PyModule_AddObject(m, "errors", errors_module); - } + + if (PyDict_SetItemString(codes_dict, error_string, num) < 0) { + Py_DECREF(num); + return -1; } - Py_DECREF(errmod_name); - model_module = PyDict_GetItemWithError(d, modelmod_name); - if (model_module == NULL && !PyErr_Occurred()) { - model_module = PyModule_New(MODULE_NAME ".model"); - if (model_module != NULL) { - _PyImport_SetModule(modelmod_name, model_module); - /* gives away the reference to model_module */ - PyModule_AddObject(m, "model", model_module); - } + + PyObject *str = PyUnicode_FromString(error_string); + if (str == NULL) { + Py_DECREF(num); + return -1; } - Py_DECREF(modelmod_name); - if (errors_module == NULL || model_module == NULL) { - /* Don't core dump later! */ - Py_DECREF(m); - return NULL; + + int res = PyDict_SetItem(rev_codes_dict, num, str); + Py_DECREF(str); + Py_DECREF(num); + if (res < 0) { + return -1; } -#if XML_COMBINED_VERSION > 19505 - { - const XML_Feature *features = XML_GetFeatureList(); - PyObject *list = PyList_New(0); - if (list == NULL) - /* just ignore it */ - PyErr_Clear(); - else { - int i = 0; - for (; features[i].feature != XML_FEATURE_END; ++i) { - int ok; - PyObject *item = Py_BuildValue("si", features[i].name, - features[i].value); - if (item == NULL) { - Py_DECREF(list); - list = NULL; - break; - } - ok = PyList_Append(list, item); - Py_DECREF(item); - if (ok < 0) { - PyErr_Clear(); - break; - } - } - if (list != NULL) - PyModule_AddObject(m, "features", list); - } + return 0; +} + +static int +add_errors_module(PyObject *mod) +{ + PyObject *errors_module = add_submodule(mod, MODULE_NAME ".errors"); + if (errors_module == NULL) { + return -1; } -#endif - codes_dict = PyDict_New(); - rev_codes_dict = PyDict_New(); + PyObject *codes_dict = PyDict_New(); + PyObject *rev_codes_dict = PyDict_New(); if (codes_dict == NULL || rev_codes_dict == NULL) { - Py_XDECREF(codes_dict); - Py_XDECREF(rev_codes_dict); - return NULL; + goto error; } -#define MYCONST(name) \ - if (PyModule_AddStringConstant(errors_module, #name, \ - XML_ErrorString(name)) < 0) \ - return NULL; \ - tmpnum = PyLong_FromLong(name); \ - if (tmpnum == NULL) return NULL; \ - res = PyDict_SetItemString(codes_dict, \ - XML_ErrorString(name), tmpnum); \ - if (res < 0) return NULL; \ - tmpstr = PyUnicode_FromString(XML_ErrorString(name)); \ - if (tmpstr == NULL) return NULL; \ - res = PyDict_SetItem(rev_codes_dict, tmpnum, tmpstr); \ - Py_DECREF(tmpstr); \ - Py_DECREF(tmpnum); \ - if (res < 0) return NULL; \ - - MYCONST(XML_ERROR_NO_MEMORY); - MYCONST(XML_ERROR_SYNTAX); - MYCONST(XML_ERROR_NO_ELEMENTS); - MYCONST(XML_ERROR_INVALID_TOKEN); - MYCONST(XML_ERROR_UNCLOSED_TOKEN); - MYCONST(XML_ERROR_PARTIAL_CHAR); - MYCONST(XML_ERROR_TAG_MISMATCH); - MYCONST(XML_ERROR_DUPLICATE_ATTRIBUTE); - MYCONST(XML_ERROR_JUNK_AFTER_DOC_ELEMENT); - MYCONST(XML_ERROR_PARAM_ENTITY_REF); - MYCONST(XML_ERROR_UNDEFINED_ENTITY); - MYCONST(XML_ERROR_RECURSIVE_ENTITY_REF); - MYCONST(XML_ERROR_ASYNC_ENTITY); - MYCONST(XML_ERROR_BAD_CHAR_REF); - MYCONST(XML_ERROR_BINARY_ENTITY_REF); - MYCONST(XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF); - MYCONST(XML_ERROR_MISPLACED_XML_PI); - MYCONST(XML_ERROR_UNKNOWN_ENCODING); - MYCONST(XML_ERROR_INCORRECT_ENCODING); - MYCONST(XML_ERROR_UNCLOSED_CDATA_SECTION); - MYCONST(XML_ERROR_EXTERNAL_ENTITY_HANDLING); - MYCONST(XML_ERROR_NOT_STANDALONE); - MYCONST(XML_ERROR_UNEXPECTED_STATE); - MYCONST(XML_ERROR_ENTITY_DECLARED_IN_PE); - MYCONST(XML_ERROR_FEATURE_REQUIRES_XML_DTD); - MYCONST(XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING); +#define ADD_CONST(name) do { \ + if (add_error(errors_module, codes_dict, rev_codes_dict, \ + #name, name) < 0) { \ + goto error; \ + } \ + } while(0) + + ADD_CONST(XML_ERROR_NO_MEMORY); + ADD_CONST(XML_ERROR_SYNTAX); + ADD_CONST(XML_ERROR_NO_ELEMENTS); + ADD_CONST(XML_ERROR_INVALID_TOKEN); + ADD_CONST(XML_ERROR_UNCLOSED_TOKEN); + ADD_CONST(XML_ERROR_PARTIAL_CHAR); + ADD_CONST(XML_ERROR_TAG_MISMATCH); + ADD_CONST(XML_ERROR_DUPLICATE_ATTRIBUTE); + ADD_CONST(XML_ERROR_JUNK_AFTER_DOC_ELEMENT); + ADD_CONST(XML_ERROR_PARAM_ENTITY_REF); + ADD_CONST(XML_ERROR_UNDEFINED_ENTITY); + ADD_CONST(XML_ERROR_RECURSIVE_ENTITY_REF); + ADD_CONST(XML_ERROR_ASYNC_ENTITY); + ADD_CONST(XML_ERROR_BAD_CHAR_REF); + ADD_CONST(XML_ERROR_BINARY_ENTITY_REF); + ADD_CONST(XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF); + ADD_CONST(XML_ERROR_MISPLACED_XML_PI); + ADD_CONST(XML_ERROR_UNKNOWN_ENCODING); + ADD_CONST(XML_ERROR_INCORRECT_ENCODING); + ADD_CONST(XML_ERROR_UNCLOSED_CDATA_SECTION); + ADD_CONST(XML_ERROR_EXTERNAL_ENTITY_HANDLING); + ADD_CONST(XML_ERROR_NOT_STANDALONE); + ADD_CONST(XML_ERROR_UNEXPECTED_STATE); + ADD_CONST(XML_ERROR_ENTITY_DECLARED_IN_PE); + ADD_CONST(XML_ERROR_FEATURE_REQUIRES_XML_DTD); + ADD_CONST(XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING); /* Added in Expat 1.95.7. */ - MYCONST(XML_ERROR_UNBOUND_PREFIX); + ADD_CONST(XML_ERROR_UNBOUND_PREFIX); /* Added in Expat 1.95.8. */ - MYCONST(XML_ERROR_UNDECLARING_PREFIX); - MYCONST(XML_ERROR_INCOMPLETE_PE); - MYCONST(XML_ERROR_XML_DECL); - MYCONST(XML_ERROR_TEXT_DECL); - MYCONST(XML_ERROR_PUBLICID); - MYCONST(XML_ERROR_SUSPENDED); - MYCONST(XML_ERROR_NOT_SUSPENDED); - MYCONST(XML_ERROR_ABORTED); - MYCONST(XML_ERROR_FINISHED); - MYCONST(XML_ERROR_SUSPEND_PE); + ADD_CONST(XML_ERROR_UNDECLARING_PREFIX); + ADD_CONST(XML_ERROR_INCOMPLETE_PE); + ADD_CONST(XML_ERROR_XML_DECL); + ADD_CONST(XML_ERROR_TEXT_DECL); + ADD_CONST(XML_ERROR_PUBLICID); + ADD_CONST(XML_ERROR_SUSPENDED); + ADD_CONST(XML_ERROR_NOT_SUSPENDED); + ADD_CONST(XML_ERROR_ABORTED); + ADD_CONST(XML_ERROR_FINISHED); + ADD_CONST(XML_ERROR_SUSPEND_PE); +#undef ADD_CONST if (PyModule_AddStringConstant(errors_module, "__doc__", "Constants used to describe " - "error conditions.") < 0) - return NULL; + "error conditions.") < 0) { + goto error; + } - if (PyModule_AddObject(errors_module, "codes", codes_dict) < 0) - return NULL; - if (PyModule_AddObject(errors_module, "messages", rev_codes_dict) < 0) - return NULL; + Py_INCREF(codes_dict); + if (PyModule_AddObject(errors_module, "codes", codes_dict) < 0) { + Py_DECREF(codes_dict); + goto error; + } + Py_CLEAR(codes_dict); -#undef MYCONST + Py_INCREF(rev_codes_dict); + if (PyModule_AddObject(errors_module, "messages", rev_codes_dict) < 0) { + Py_DECREF(rev_codes_dict); + goto error; + } + Py_CLEAR(rev_codes_dict); -#define MYCONST(c) PyModule_AddIntConstant(m, #c, c) - MYCONST(XML_PARAM_ENTITY_PARSING_NEVER); - MYCONST(XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE); - MYCONST(XML_PARAM_ENTITY_PARSING_ALWAYS); -#undef MYCONST + return 0; + +error: + Py_XDECREF(codes_dict); + Py_XDECREF(rev_codes_dict); + return -1; +} + +static int +add_model_module(PyObject *mod) +{ + PyObject *model_module = add_submodule(mod, MODULE_NAME ".model"); + if (model_module == NULL) { + return -1; + } + +#define MYCONST(c) do { \ + if (PyModule_AddIntConstant(model_module, #c, c) < 0) { \ + return -1; \ + } \ + } while(0) -#define MYCONST(c) PyModule_AddIntConstant(model_module, #c, c) - PyModule_AddStringConstant(model_module, "__doc__", - "Constants used to interpret content model information."); + if (PyModule_AddStringConstant( + model_module, "__doc__", + "Constants used to interpret content model information.") < 0) { + return -1; + } MYCONST(XML_CTYPE_EMPTY); MYCONST(XML_CTYPE_ANY); @@ -1840,7 +1800,128 @@ MODULE_INITFUNC(void) MYCONST(XML_CQUANT_REP); MYCONST(XML_CQUANT_PLUS); #undef MYCONST + return 0; +} +#if XML_COMBINED_VERSION > 19505 +static int +add_features(PyObject *mod) +{ + PyObject *list = PyList_New(0); + if (list == NULL) { + return -1; + } + + const XML_Feature *features = XML_GetFeatureList(); + for (size_t i = 0; features[i].feature != XML_FEATURE_END; ++i) { + PyObject *item = Py_BuildValue("si", features[i].name, + features[i].value); + if (item == NULL) { + goto error; + } + int ok = PyList_Append(list, item); + Py_DECREF(item); + if (ok < 0) { + goto error; + } + } + if (PyModule_AddObject(mod, "features", list) < 0) { + goto error; + } + return 0; + +error: + Py_DECREF(list); + return -1; +} +#endif + +static int +pyexpat_exec(PyObject *mod) +{ + if (PyType_Ready(&Xmlparsetype) < 0) { + return -1; + } + + if (init_handler_descrs() < 0) { + return -1; + } + + /* Add some symbolic constants to the module */ + if (ErrorObject == NULL) { + ErrorObject = PyErr_NewException("xml.parsers.expat.ExpatError", + NULL, NULL); + } + if (ErrorObject == NULL) { + return -1; + } + + Py_INCREF(ErrorObject); + if (PyModule_AddObject(mod, "error", ErrorObject) < 0) { + Py_DECREF(ErrorObject); + return -1; + } + Py_INCREF(ErrorObject); + if (PyModule_AddObject(mod, "ExpatError", ErrorObject) < 0) { + Py_DECREF(ErrorObject); + return -1; + } + Py_INCREF(&Xmlparsetype); + if (PyModule_AddObject(mod, "XMLParserType", + (PyObject *) &Xmlparsetype) < 0) { + Py_DECREF(&Xmlparsetype); + return -1; + } + + if (PyModule_AddStringConstant(mod, "EXPAT_VERSION", + XML_ExpatVersion()) < 0) { + return -1; + } + { + XML_Expat_Version info = XML_ExpatVersionInfo(); + PyObject *versionInfo = Py_BuildValue("(iii)", + info.major, + info.minor, + info.micro); + if (PyModule_AddObject(mod, "version_info", versionInfo) < 0) { + Py_DECREF(versionInfo); + return -1; + } + } + /* XXX When Expat supports some way of figuring out how it was + compiled, this should check and set native_encoding + appropriately. + */ + if (PyModule_AddStringConstant(mod, "native_encoding", "UTF-8") < 0) { + return -1; + } + + if (add_errors_module(mod) < 0) { + return -1; + } + + if (add_model_module(mod) < 0) { + return -1; + } + +#if XML_COMBINED_VERSION > 19505 + if (add_features(mod) < 0) { + return -1; + } +#endif + +#define MYCONST(c) do { \ + if (PyModule_AddIntConstant(mod, #c, c) < 0) { \ + return -1; \ + } \ + } while(0) + + MYCONST(XML_PARAM_ENTITY_PARSING_NEVER); + MYCONST(XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE); + MYCONST(XML_PARAM_ENTITY_PARSING_ALWAYS); +#undef MYCONST + + static struct PyExpat_CAPI capi; /* initialize pyexpat dispatch table */ capi.size = sizeof(capi); capi.magic = PyExpat_CAPI_MAGIC; @@ -1872,10 +1953,39 @@ MODULE_INITFUNC(void) #endif /* export using capsule */ - capi_object = PyCapsule_New(&capi, PyExpat_CAPSULE_NAME, NULL); - if (capi_object) - PyModule_AddObject(m, "expat_CAPI", capi_object); - return m; + PyObject *capi_object = PyCapsule_New(&capi, PyExpat_CAPSULE_NAME, NULL); + if (capi_object == NULL) { + return -1; + } + + if (PyModule_AddObject(mod, "expat_CAPI", capi_object) < 0) { + Py_DECREF(capi_object); + return -1; + } + + return 0; +} + +static struct PyModuleDef pyexpatmodule = { + PyModuleDef_HEAD_INIT, + .m_name = MODULE_NAME, + .m_doc = pyexpat_module_documentation, + .m_size = -1, + .m_methods = pyexpat_methods, +}; + +PyMODINIT_FUNC +PyInit_pyexpat(void) +{ + PyObject *mod = PyModule_Create(&pyexpatmodule); + if (mod == NULL) + return NULL; + + if (pyexpat_exec(mod) < 0) { + Py_DECREF(mod); + return NULL; + } + return mod; } static void From 3213e910a66f2b4ff2dfeada7e24b5f179b51ed1 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Wed, 4 Nov 2020 20:31:51 +0100 Subject: [PATCH 0470/1261] bpo-1635741: _sqlite3 uses PyModule_AddObjectRef() (GH-23148) --- Modules/_sqlite/microprotocols.c | 8 +++----- Modules/_sqlite/module.c | 25 +++++++++++++------------ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index cf1fefd671851d..41f086791ea4b7 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -43,12 +43,10 @@ pysqlite_microprotocols_init(PyObject *module) return -1; } - if (PyModule_AddObject(module, "adapters", psyco_adapters) < 0) { - Py_DECREF(psyco_adapters); - return -1; - } + int res = PyModule_AddObjectRef(module, "adapters", psyco_adapters); + Py_DECREF(psyco_adapters); - return 0; + return res; } diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 33324402385f44..9fdf51417ed883 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -263,17 +263,17 @@ pysqlite_adapt_impl(PyObject *module, PyObject *obj, PyObject *proto, return pysqlite_microprotocols_adapt(obj, proto, alt); } -static void converters_init(PyObject* module) +static int converters_init(PyObject* module) { _pysqlite_converters = PyDict_New(); if (!_pysqlite_converters) { - return; + return -1; } - if (PyModule_AddObject(module, "converters", _pysqlite_converters) < 0) { - Py_DECREF(_pysqlite_converters); - } - return; + int res = PyModule_AddObjectRef(module, "converters", _pysqlite_converters); + Py_DECREF(_pysqlite_converters); + + return res; } static PyMethodDef module_methods[] = { @@ -361,8 +361,9 @@ do { \ if (!exc) { \ goto error; \ } \ - if (PyModule_AddObject(module, name, exc) < 0) { \ - Py_DECREF(exc); \ + int res = PyModule_AddObjectRef(module, name, exc); \ + Py_DECREF(exc); \ + if (res < 0) { \ goto error; \ } \ } while (0) @@ -416,9 +417,7 @@ PyMODINIT_FUNC PyInit__sqlite3(void) non-ASCII data and bytestrings to be returned for ASCII data. Now OptimizedUnicode is an alias for str, so it has no effect. */ - Py_INCREF((PyObject*)&PyUnicode_Type); - if (PyModule_AddObject(module, "OptimizedUnicode", (PyObject*)&PyUnicode_Type) < 0) { - Py_DECREF((PyObject*)&PyUnicode_Type); + if (PyModule_AddObjectRef(module, "OptimizedUnicode", (PyObject*)&PyUnicode_Type) < 0) { goto error; } @@ -441,7 +440,9 @@ PyMODINIT_FUNC PyInit__sqlite3(void) } /* initialize the default converters */ - converters_init(module); + if (converters_init(module) < 0) { + goto error; + } error: if (PyErr_Occurred()) From 979b9de2bb6e9d8ecb38cfc6191562aba1e567fb Mon Sep 17 00:00:00 2001 From: serge-sans-paille Date: Wed, 4 Nov 2020 23:01:08 +0000 Subject: [PATCH 0471/1261] Disable peg generator tests when building with PGO (GH-23141) Otherwise, when running the testsuite, test_peg_generator tries to compile C code using the optimized flags and fails because it cannot find the profile data. --- Lib/test/test_peg_generator/test_c_parser.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Lib/test/test_peg_generator/test_c_parser.py b/Lib/test/test_peg_generator/test_c_parser.py index 0dffedca789c57..67bb8512118e3a 100644 --- a/Lib/test/test_peg_generator/test_c_parser.py +++ b/Lib/test/test_peg_generator/test_c_parser.py @@ -1,3 +1,4 @@ +import sysconfig import textwrap import unittest from distutils.tests.support import TempdirManager @@ -8,6 +9,11 @@ from test.support import os_helper from test.support.script_helper import assert_python_ok +_py_cflags_nodist = sysconfig.get_config_var('PY_CFLAGS_NODIST') +_pgo_flag = sysconfig.get_config_var('PGO_PROF_USE_FLAG') +if _pgo_flag and _py_cflags_nodist and _pgo_flag in _py_cflags_nodist: + raise unittest.SkipTest("peg_generator test disabled under PGO build") + test_tools.skip_if_missing("peg_generator") with test_tools.imports_under_tool("peg_generator"): from pegen.grammar_parser import GeneratedParser as GrammarParser From 08df9b6ea28bbfd9c6dbac40e59d9d45d8646f03 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 5 Nov 2020 00:45:56 +0100 Subject: [PATCH 0472/1261] bpo-42260: Add _PyInterpreterState_SetConfig() (GH-23158) * Inline _PyInterpreterState_SetConfig(): replace it with _PyConfig_Copy(). * Add _PyErr_SetFromPyStatus() * Add _PyInterpreterState_GetConfigCopy() * Add a new _PyInterpreterState_SetConfig() function. * Add an unit which gets, modifies, and sets the config. --- Doc/c-api/init_config.rst | 2 + Include/cpython/pystate.h | 30 ++++++++++++ Include/internal/pycore_initconfig.h | 2 + Include/internal/pycore_interp.h | 6 --- Lib/test/test_embed.py | 9 ++++ Programs/_testembed.c | 50 ++++++++++++++++++++ Python/initconfig.c | 20 +++++++- Python/pylifecycle.c | 70 ++++++++++++++++++++++++++-- Python/pystate.c | 16 +++++-- 9 files changed, 189 insertions(+), 16 deletions(-) diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index dad1f90bea548b..c957d6c0f723c2 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -128,6 +128,8 @@ PyStatus Initialization error with a message. + *err_msg* must not be ``NULL``. + .. c:function:: PyStatus PyStatus_NoMemory(void) Memory allocation failure (out of memory). diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 25522b4dbeccd8..0e6cc290912366 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -193,6 +193,36 @@ PyAPI_FUNC(void) _PyInterpreterState_SetEvalFrameFunc( PyAPI_FUNC(const PyConfig*) _PyInterpreterState_GetConfig(PyInterpreterState *interp); +/* Get a copy of the current interpreter configuration. + + Return 0 on success. Raise an exception and return -1 on error. + + The caller must initialize 'config', using PyConfig_InitPythonConfig() + for example. + + Python must be preinitialized to call this method. + The caller must hold the GIL. */ +PyAPI_FUNC(int) _PyInterpreterState_GetConfigCopy( + struct PyConfig *config); + +/* Set the configuration of the current interpreter. + + This function should be called during or just after the Python + initialization. + + Update the sys module with the new configuration. If the sys module was + modified directly after the Python initialization, these changes are lost. + + Some configuration like faulthandler or warnoptions can be updated in the + configuration, but don't reconfigure Python (don't enable/disable + faulthandler and don't reconfigure warnings filters). + + Return 0 on success. Raise an exception and return -1 on error. + + The configuration should come from _PyInterpreterState_GetConfigCopy(). */ +PyAPI_FUNC(int) _PyInterpreterState_SetConfig( + const struct PyConfig *config); + // Get the configuration of the currrent interpreter. // The caller must hold the GIL. PyAPI_FUNC(const PyConfig*) _Py_GetConfig(void); diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h index 457a005860b202..df7ad779f477ce 100644 --- a/Include/internal/pycore_initconfig.h +++ b/Include/internal/pycore_initconfig.h @@ -44,6 +44,8 @@ struct pyruntimestate; #define _PyStatus_UPDATE_FUNC(err) \ do { err.func = _PyStatus_GET_FUNC(); } while (0) +PyObject* _PyErr_SetFromPyStatus(PyStatus status); + /* --- PyWideStringList ------------------------------------------------ */ #define _PyWideStringList_INIT (PyWideStringList){.length = 0, .items = NULL} diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 9923b6b03da7e1..4b67a86a25a79f 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -263,13 +263,7 @@ struct _is { struct ast_state ast; }; -/* Used by _PyImport_Cleanup() */ extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp); - -extern PyStatus _PyInterpreterState_SetConfig( - PyInterpreterState *interp, - const PyConfig *config); - extern void _PyInterpreterState_Clear(PyThreadState *tstate); diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 31dc39fd9e8efe..36a0e77e14cee7 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -1394,6 +1394,15 @@ def test_init_warnoptions(self): self.check_all_configs("test_init_warnoptions", config, preconfig, api=API_PYTHON) + def test_init_set_config(self): + config = { + '_init_main': 0, + 'bytes_warning': 2, + 'warnoptions': ['error::BytesWarning'], + } + self.check_all_configs("test_init_set_config", config, + api=API_ISOLATED) + def test_get_argc_argv(self): self.run_embedded_interpreter("test_get_argc_argv") # ignore output diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 5aad16a6f7c47d..cb3a23a101e952 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1526,6 +1526,55 @@ static int test_init_warnoptions(void) } +static int tune_config(void) +{ + PyConfig config; + PyConfig_InitPythonConfig(&config); + if (_PyInterpreterState_GetConfigCopy(&config) < 0) { + PyConfig_Clear(&config); + PyErr_Print(); + return -1; + } + + config.bytes_warning = 2; + + if (_PyInterpreterState_SetConfig(&config) < 0) { + PyConfig_Clear(&config); + return -1; + } + PyConfig_Clear(&config); + return 0; +} + + +static int test_set_config(void) +{ + // Initialize core + PyConfig config; + PyConfig_InitIsolatedConfig(&config); + config_set_string(&config, &config.program_name, PROGRAM_NAME); + config._init_main = 0; + config.bytes_warning = 0; + init_from_config_clear(&config); + + // Tune the configuration using _PyInterpreterState_SetConfig() + if (tune_config() < 0) { + PyErr_Print(); + return 1; + } + + // Finish initialization: main part + PyStatus status = _Py_InitializeMain(); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); + } + + dump_config(); + Py_Finalize(); + return 0; +} + + static void configure_init_main(PyConfig *config) { wchar_t* argv[] = { @@ -1693,6 +1742,7 @@ static struct TestCase TestCases[] = { {"test_init_setpath_config", test_init_setpath_config}, {"test_init_setpythonhome", test_init_setpythonhome}, {"test_init_warnoptions", test_init_warnoptions}, + {"test_init_set_config", test_set_config}, {"test_run_main", test_run_main}, {"test_get_argc_argv", test_get_argc_argv}, diff --git a/Python/initconfig.c b/Python/initconfig.c index 15fb3e4d2877dd..de496ac7b522bf 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -242,8 +242,9 @@ PyStatus PyStatus_Ok(void) PyStatus PyStatus_Error(const char *err_msg) { + assert(err_msg != NULL); return (PyStatus){._type = _PyStatus_TYPE_ERROR, - .err_msg = err_msg}; + .err_msg = err_msg}; } PyStatus PyStatus_NoMemory(void) @@ -262,6 +263,23 @@ int PyStatus_IsExit(PyStatus status) int PyStatus_Exception(PyStatus status) { return _PyStatus_EXCEPTION(status); } +PyObject* +_PyErr_SetFromPyStatus(PyStatus status) +{ + if (!_PyStatus_IS_ERROR(status)) { + PyErr_Format(PyExc_SystemError, + "%s() expects an error PyStatus", + _PyStatus_GET_FUNC()); + } + else if (status.func) { + PyErr_Format(PyExc_ValueError, "%s: %s", status.func, status.err_msg); + } + else { + PyErr_Format(PyExc_ValueError, "%s", status.err_msg); + } + return NULL; +} + /* --- PyWideStringList ------------------------------------------------ */ diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 1f826d7f6c4453..e34d6471e178e4 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -428,6 +428,67 @@ _Py_SetLocaleFromEnv(int category) } +static int +interpreter_set_config(const PyConfig *config) +{ + PyThreadState *tstate = PyThreadState_Get(); + + PyStatus status = _PyConfig_Write(config, tstate->interp->runtime); + if (_PyStatus_EXCEPTION(status)) { + _PyErr_SetFromPyStatus(status); + return -1; + } + + status = _PyConfig_Copy(&tstate->interp->config, config); + if (_PyStatus_EXCEPTION(status)) { + _PyErr_SetFromPyStatus(status); + return -1; + } + config = &tstate->interp->config; + + if (config->_install_importlib && _Py_IsMainInterpreter(tstate)) { + status = _PyConfig_WritePathConfig(config); + if (_PyStatus_EXCEPTION(status)) { + _PyErr_SetFromPyStatus(status); + return -1; + } + } + + // Update the sys module for the new configuration + if (_PySys_UpdateConfig(tstate) < 0) { + return -1; + } + return 0; +} + + +int +_PyInterpreterState_SetConfig(const PyConfig *src_config) +{ + int res = -1; + + PyConfig config; + PyConfig_InitPythonConfig(&config); + PyStatus status = _PyConfig_Copy(&config, src_config); + if (_PyStatus_EXCEPTION(status)) { + _PyErr_SetFromPyStatus(status); + goto done; + } + + status = PyConfig_Read(&config); + if (_PyStatus_EXCEPTION(status)) { + _PyErr_SetFromPyStatus(status); + goto done; + } + + res = interpreter_set_config(&config); + +done: + PyConfig_Clear(&config); + return res; +} + + /* Global initializations. Can be undone by Py_Finalize(). Don't call this twice without an intervening Py_Finalize() call. @@ -462,7 +523,7 @@ pyinit_core_reconfigure(_PyRuntimeState *runtime, return status; } - status = _PyInterpreterState_SetConfig(interp, config); + status = _PyConfig_Copy(&interp->config, config); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -550,7 +611,7 @@ pycore_create_interpreter(_PyRuntimeState *runtime, return _PyStatus_ERR("can't make main interpreter"); } - PyStatus status = _PyInterpreterState_SetConfig(interp, config); + PyStatus status = _PyConfig_Copy(&interp->config, config); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -917,7 +978,7 @@ pyinit_core(_PyRuntimeState *runtime, } PyConfig config; - _PyConfig_InitCompatConfig(&config); + PyConfig_InitPythonConfig(&config); status = _PyConfig_Copy(&config, src_config); if (_PyStatus_EXCEPTION(status)) { @@ -1835,7 +1896,8 @@ new_interpreter(PyThreadState **tstate_p, int isolated_subinterpreter) config = _PyInterpreterState_GetConfig(main_interp); } - status = _PyInterpreterState_SetConfig(interp, config); + + status = _PyConfig_Copy(&interp->config, config); if (_PyStatus_EXCEPTION(status)) { goto error; } diff --git a/Python/pystate.c b/Python/pystate.c index c9882a7f74bc26..600cc5e03a1cf0 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -778,7 +778,7 @@ PyState_RemoveModule(struct PyModuleDef* def) return PyList_SetItem(interp->modules_by_index, index, Py_None); } -/* Used by PyImport_Cleanup() */ +// Used by finalize_modules() void _PyInterpreterState_ClearModules(PyInterpreterState *interp) { @@ -1920,11 +1920,17 @@ _PyInterpreterState_GetConfig(PyInterpreterState *interp) } -PyStatus -_PyInterpreterState_SetConfig(PyInterpreterState *interp, - const PyConfig *config) +int +_PyInterpreterState_GetConfigCopy(PyConfig *config) { - return _PyConfig_Copy(&interp->config, config); + PyInterpreterState *interp = PyInterpreterState_Get(); + + PyStatus status = _PyConfig_Copy(config, &interp->config); + if (PyStatus_Exception(status)) { + _PyErr_SetFromPyStatus(status); + return -1; + } + return 0; } From f2a1747f089445a2c171448e80df2d78e2738a91 Mon Sep 17 00:00:00 2001 From: Kazantcev Andrey <45011689+heckad@users.noreply.github.com> Date: Thu, 5 Nov 2020 11:52:24 +0300 Subject: [PATCH 0473/1261] bpo-40816 Add AsyncContextDecorator class (GH-20516) Co-authored-by: Yury Selivanov --- Doc/library/contextlib.rst | 62 +++++++++++++++++++ Lib/contextlib.py | 25 +++++++- Lib/test/test_contextlib_async.py | 27 ++++++++ .../2020-05-29-15-25-41.bpo-40816.w61Pob.rst | 1 + 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-05-29-15-25-41.bpo-40816.w61Pob.rst diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index e42f5a93281663..ee2becb8dff20d 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -126,6 +126,31 @@ Functions and classes provided: .. versionadded:: 3.7 + Context managers defined with :func:`asynccontextmanager` can be used + either as decorators or with :keyword:`async with` statements:: + + import time + + async def timeit(): + now = time.monotonic() + try: + yield + finally: + print(f'it took {time.monotonic() - now}s to run') + + @timeit() + async def main(): + # ... async code ... + + When used as a decorator, a new generator instance is implicitly created on + each function call. This allows the otherwise "one-shot" context managers + created by :func:`asynccontextmanager` to meet the requirement that context + managers support multiple invocations in order to be used as decorators. + + .. versionchanged:: 3.10 + Async context managers created with :func:`asynccontextmanager` can + be used as decorators. + .. function:: closing(thing) @@ -384,6 +409,43 @@ Functions and classes provided: .. versionadded:: 3.2 +.. class:: AsyncContextManager + + Similar as ContextManger only for async + + Example of ``ContextDecorator``:: + + from asyncio import run + from contextlib import AsyncContextDecorator + + class mycontext(AsyncContextDecorator): + async def __aenter__(self): + print('Starting') + return self + + async def __aexit__(self, *exc): + print('Finishing') + return False + + >>> @mycontext() + ... async def function(): + ... print('The bit in the middle') + ... + >>> run(function()) + Starting + The bit in the middle + Finishing + + >>> async def function(): + ... async with mycontext(): + ... print('The bit in the middle') + ... + >>> run(function()) + Starting + The bit in the middle + Finishing + + .. class:: ExitStack() A context manager that is designed to make it easy to programmatically diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 82ddc1497d8632..56b4968118bdb3 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -80,6 +80,22 @@ def inner(*args, **kwds): return inner +class AsyncContextDecorator(object): + "A base class or mixin that enables async context managers to work as decorators." + + def _recreate_cm(self): + """Return a recreated instance of self. + """ + return self + + def __call__(self, func): + @wraps(func) + async def inner(*args, **kwds): + async with self._recreate_cm(): + return await func(*args, **kwds) + return inner + + class _GeneratorContextManagerBase: """Shared functionality for @contextmanager and @asynccontextmanager.""" @@ -167,9 +183,16 @@ def __exit__(self, type, value, traceback): class _AsyncGeneratorContextManager(_GeneratorContextManagerBase, - AbstractAsyncContextManager): + AbstractAsyncContextManager, + AsyncContextDecorator): """Helper for @asynccontextmanager.""" + def _recreate_cm(self): + # _AGCM instances are one-shot context managers, so the + # ACM must be recreated each time a decorated function is + # called + return self.__class__(self.func, self.args, self.kwds) + async def __aenter__(self): try: return await self.gen.__anext__() diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index 3765f6cbf28c51..109807d633d565 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -278,6 +278,33 @@ async def woohoo(self, func, args, kwds): async with woohoo(self=11, func=22, args=33, kwds=44) as target: self.assertEqual(target, (11, 22, 33, 44)) + @_async_test + async def test_recursive(self): + depth = 0 + ncols = 0 + + @asynccontextmanager + async def woohoo(): + nonlocal ncols + ncols += 1 + + nonlocal depth + before = depth + depth += 1 + yield + depth -= 1 + self.assertEqual(depth, before) + + @woohoo() + async def recursive(): + if depth < 10: + await recursive() + + await recursive() + + self.assertEqual(ncols, 10) + self.assertEqual(depth, 0) + class AclosingTestCase(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2020-05-29-15-25-41.bpo-40816.w61Pob.rst b/Misc/NEWS.d/next/Library/2020-05-29-15-25-41.bpo-40816.w61Pob.rst new file mode 100644 index 00000000000000..66b75779784655 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-05-29-15-25-41.bpo-40816.w61Pob.rst @@ -0,0 +1 @@ +Add AsyncContextDecorator to contextlib to support async context manager as a decorator. \ No newline at end of file From b5da42dcd9ca6e2d7b50fceb4a11136dd49f523b Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 5 Nov 2020 09:23:15 +0000 Subject: [PATCH 0474/1261] bpo-42266: Handle monkey-patching descriptors in LOAD_ATTR cache (GH-23157) --- Lib/test/test_opcache.py | 23 +++++++++++++++++++ .../2020-11-04-23-03-25.bpo-42266.G4hGDe.rst | 3 +++ PCbuild/lib.pyproj | 1 + Python/ceval.c | 8 +------ 4 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 Lib/test/test_opcache.py create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-04-23-03-25.bpo-42266.G4hGDe.rst diff --git a/Lib/test/test_opcache.py b/Lib/test/test_opcache.py new file mode 100644 index 00000000000000..61f337d70ea787 --- /dev/null +++ b/Lib/test/test_opcache.py @@ -0,0 +1,23 @@ +import unittest + +class TestLoadAttrCache(unittest.TestCase): + def test_descriptor_added_after_optimization(self): + class Descriptor: + pass + + class C: + def __init__(self): + self.x = 1 + x = Descriptor() + + def f(o): + return o.x + + o = C() + for i in range(1025): + assert f(o) == 1 + + Descriptor.__get__ = lambda self, instance, value: 2 + Descriptor.__set__ = lambda *args: None + + self.assertEqual(f(o), 2) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-04-23-03-25.bpo-42266.G4hGDe.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-04-23-03-25.bpo-42266.G4hGDe.rst new file mode 100644 index 00000000000000..a8598cfde04205 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-04-23-03-25.bpo-42266.G4hGDe.rst @@ -0,0 +1,3 @@ +Fixed a bug with the LOAD_ATTR opcode cache that was not respecting +monkey-patching a class-level attribute to make it a descriptor. Patch by +Pablo Galindo. diff --git a/PCbuild/lib.pyproj b/PCbuild/lib.pyproj index a15165d92ef125..1be60b1a11b931 100644 --- a/PCbuild/lib.pyproj +++ b/PCbuild/lib.pyproj @@ -1196,6 +1196,7 @@ + diff --git a/Python/ceval.c b/Python/ceval.c index 13b209fc706b6c..32e3019682f0ae 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3179,7 +3179,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) if (co_opcache != NULL && /* co_opcache can be NULL after a DEOPT() call. */ type->tp_getattro == PyObject_GenericGetAttr) { - PyObject *descr; Py_ssize_t ret; if (type->tp_dictoffset > 0) { @@ -3190,12 +3189,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) goto error; } } - - descr = _PyType_Lookup(type, name); - if (descr == NULL || - Py_TYPE(descr)->tp_descr_get == NULL || - !PyDescr_IsData(descr)) - { + if (_PyType_Lookup(type, name) == NULL) { dictptr = (PyObject **) ((char *)owner + type->tp_dictoffset); dict = *dictptr; From f84560fa095e6bd9cf41416e978a3c3b3f8c3034 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 5 Nov 2020 15:02:12 +0100 Subject: [PATCH 0475/1261] bpo-42262: Add Py_NewRef() and Py_XNewRef() (GH-23152) Added Py_NewRef() and Py_XNewRef() functions to increment the reference count of an object and return the object. --- Doc/c-api/refcounting.rst | 31 +++++++++++++++++++ Doc/whatsnew/3.10.rst | 4 +++ Include/boolobject.h | 4 +-- Include/object.h | 30 ++++++++++++++++-- .../2020-11-04-17-22-36.bpo-42262.fCWzBb.rst | 2 ++ Objects/object.c | 16 ++++++++++ PC/python3dll.c | 4 ++- 7 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-04-17-22-36.bpo-42262.fCWzBb.rst diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst index 0df12c67f40bc3..b15c0e6aecc899 100644 --- a/Doc/c-api/refcounting.rst +++ b/Doc/c-api/refcounting.rst @@ -16,12 +16,43 @@ objects. Increment the reference count for object *o*. The object must not be ``NULL``; if you aren't sure that it isn't ``NULL``, use :c:func:`Py_XINCREF`. + See also :c:func:`Py_NewRef`. + .. c:function:: void Py_XINCREF(PyObject *o) Increment the reference count for object *o*. The object may be ``NULL``, in which case the macro has no effect. + See also :c:func:`Py_XNewRef`. + + +.. c:function:: PyObject* Py_NewRef(PyObject *o) + + Increment the reference count of the object *o* and return the object *o*. + + The object *o* must not be ``NULL``. + + For example:: + + Py_INCREF(obj); + self->attr = obj; + + can be written as:: + + self->attr = Py_NewRef(obj); + + .. versionadded:: 3.10 + + +.. c:function:: PyObject* Py_XNewRef(PyObject *o) + + Similar to :c:func:`Py_NewRef`, but the object *o* can be NULL. + + If the object *o* is ``NULL``, the function just returns ``NULL``. + + .. versionadded:: 3.10 + .. c:function:: void Py_DECREF(PyObject *o) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 9d9284897be8ab..bac1a2e6783094 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -379,6 +379,10 @@ New Features success. (Contributed by Victor Stinner in :issue:`1635741`.) +* Added :c:func:`Py_NewRef` and :c:func:`Py_XNewRef` functions to increment the + reference count of an object and return the object. + (Contributed by Victor Stinner in :issue:`42262`.) + Porting to Python 3.10 ---------------------- diff --git a/Include/boolobject.h b/Include/boolobject.h index bb8044a2b02cf6..6673d7206c0b3e 100644 --- a/Include/boolobject.h +++ b/Include/boolobject.h @@ -22,8 +22,8 @@ PyAPI_DATA(struct _longobject) _Py_FalseStruct, _Py_TrueStruct; #define Py_True ((PyObject *) &_Py_TrueStruct) /* Macros for returning Py_True or Py_False, respectively */ -#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True -#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False +#define Py_RETURN_TRUE return Py_NewRef(Py_True) +#define Py_RETURN_FALSE return Py_NewRef(Py_False) /* Function to return a bool from a C long */ PyAPI_FUNC(PyObject *) PyBool_FromLong(long); diff --git a/Include/object.h b/Include/object.h index 6ee4ee7848551e..835d9de01fb72b 100644 --- a/Include/object.h +++ b/Include/object.h @@ -526,6 +526,31 @@ they can have object code that is not dependent on Python compilation flags. PyAPI_FUNC(void) Py_IncRef(PyObject *); PyAPI_FUNC(void) Py_DecRef(PyObject *); +// Increment the reference count of the object and return the object. +PyAPI_FUNC(PyObject*) Py_NewRef(PyObject *obj); + +// Similar to Py_NewRef() but the object can be NULL. +PyAPI_FUNC(PyObject*) Py_XNewRef(PyObject *obj); + +static inline PyObject* _Py_NewRef(PyObject *obj) +{ + Py_INCREF(obj); + return obj; +} + +static inline PyObject* _Py_XNewRef(PyObject *obj) +{ + Py_XINCREF(obj); + return obj; +} + +// Py_NewRef() and Py_XNewRef() are exported as functions for the stable ABI. +// Names overriden with macros by static inline functions for best +// performances. +#define Py_NewRef(obj) _Py_NewRef(obj) +#define Py_XNewRef(obj) _Py_XNewRef(obj) + + /* _Py_NoneStruct is an object of undefined type which can be used in contexts where NULL (nil) is not suitable (since NULL often means 'error'). @@ -536,7 +561,7 @@ PyAPI_DATA(PyObject) _Py_NoneStruct; /* Don't use this directly */ #define Py_None (&_Py_NoneStruct) /* Macro for returning Py_None from a function */ -#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None +#define Py_RETURN_NONE return Py_NewRef(Py_None) /* Py_NotImplemented is a singleton used to signal that an operation is @@ -546,8 +571,7 @@ PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ #define Py_NotImplemented (&_Py_NotImplementedStruct) /* Macro for returning Py_NotImplemented from a function */ -#define Py_RETURN_NOTIMPLEMENTED \ - return Py_INCREF(Py_NotImplemented), Py_NotImplemented +#define Py_RETURN_NOTIMPLEMENTED return Py_NewRef(Py_NotImplemented) /* Rich comparison opcodes */ #define Py_LT 0 diff --git a/Misc/NEWS.d/next/C API/2020-11-04-17-22-36.bpo-42262.fCWzBb.rst b/Misc/NEWS.d/next/C API/2020-11-04-17-22-36.bpo-42262.fCWzBb.rst new file mode 100644 index 00000000000000..8c1e4f418443be --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-04-17-22-36.bpo-42262.fCWzBb.rst @@ -0,0 +1,2 @@ +Added :c:func:`Py_NewRef` and :c:func:`Py_XNewRef` functions to increment the +reference count of an object and return the object. Patch by Victor Stinner. diff --git a/Objects/object.c b/Objects/object.c index 7bc3e48d40a6fd..be7790eefd118f 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2208,6 +2208,22 @@ PyObject_GET_WEAKREFS_LISTPTR(PyObject *op) } +#undef Py_NewRef +#undef Py_XNewRef + +// Export Py_NewRef() and Py_XNewRef() as regular functions for the stable ABI. +PyObject* +Py_NewRef(PyObject *obj) +{ + return _Py_NewRef(obj); +} + +PyObject* +Py_XNewRef(PyObject *obj) +{ + return _Py_XNewRef(obj); +} + #ifdef __cplusplus } #endif diff --git a/PC/python3dll.c b/PC/python3dll.c index 7e4a510177304d..d1fdd0ac54ca8d 100644 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -40,8 +40,8 @@ EXPORT_FUNC(Py_AddPendingCall) EXPORT_FUNC(Py_AtExit) EXPORT_FUNC(Py_BuildValue) EXPORT_FUNC(Py_CompileString) -EXPORT_FUNC(Py_DecodeLocale) EXPORT_FUNC(Py_DecRef) +EXPORT_FUNC(Py_DecodeLocale) EXPORT_FUNC(Py_EncodeLocale) EXPORT_FUNC(Py_EndInterpreter) EXPORT_FUNC(Py_EnterRecursiveCall) @@ -72,6 +72,7 @@ EXPORT_FUNC(Py_LeaveRecursiveCall) EXPORT_FUNC(Py_Main) EXPORT_FUNC(Py_MakePendingCalls) EXPORT_FUNC(Py_NewInterpreter) +EXPORT_FUNC(Py_NewRef) EXPORT_FUNC(Py_ReprEnter) EXPORT_FUNC(Py_ReprLeave) EXPORT_FUNC(Py_SetPath) @@ -80,6 +81,7 @@ EXPORT_FUNC(Py_SetPythonHome) EXPORT_FUNC(Py_SetRecursionLimit) EXPORT_FUNC(Py_SymtableString) EXPORT_FUNC(Py_VaBuildValue) +EXPORT_FUNC(Py_XNewRef) EXPORT_FUNC(PyArg_Parse) EXPORT_FUNC(PyArg_ParseTuple) EXPORT_FUNC(PyArg_ParseTupleAndKeywords) From 49f7456e7c02fba534ee45cd2db08defa9b5b076 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 6 Nov 2020 00:16:27 +0800 Subject: [PATCH 0476/1261] [docs] fix wrongly named AsyncContextDecorator (GH-23164) Also added versionchanged. --- Doc/library/contextlib.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index ee2becb8dff20d..d5a1068a734fd6 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -409,11 +409,11 @@ Functions and classes provided: .. versionadded:: 3.2 -.. class:: AsyncContextManager +.. class:: AsyncContextDecorator - Similar as ContextManger only for async + Similar to :class:`ContextDecorator` but only for asynchronous functions. - Example of ``ContextDecorator``:: + Example of ``AsyncContextDecorator``:: from asyncio import run from contextlib import AsyncContextDecorator @@ -445,6 +445,8 @@ Functions and classes provided: The bit in the middle Finishing + .. versionadded:: 3.10 + .. class:: ExitStack() From 1ad964aa0956caa972eea630fe390f388ca28819 Mon Sep 17 00:00:00 2001 From: vabr-g Date: Thu, 5 Nov 2020 18:04:38 +0100 Subject: [PATCH 0477/1261] bpo-41877 Check for asert, aseert, assrt in mocks (GH-23165) Currently, a Mock object which is not unsafe will raise an AttributeError if an attribute with the prefix assert or assret is accessed on it. This protects against misspellings of real assert method calls, which lead to tests passing silently even if the tested code does not satisfy the intended assertion. Recently a check was done in a large code base (Google) and three more frequent ways of misspelling assert were found causing harm: asert, aseert, assrt. These are now added to the existing check. --- Lib/unittest/mock.py | 4 ++-- Lib/unittest/test/testmock/testmock.py | 11 ++++++++++- .../Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst | 2 ++ 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index b495a5f6ccc017..f5f502f257244c 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -631,9 +631,9 @@ def __getattr__(self, name): elif _is_magic(name): raise AttributeError(name) if not self._mock_unsafe: - if name.startswith(('assert', 'assret')): + if name.startswith(('assert', 'assret', 'asert', 'aseert', 'assrt')): raise AttributeError("Attributes cannot start with 'assert' " - "or 'assret'") + "or its misspellings") result = self._mock_children.get(name) if result is _deleted: diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index ce674e713e99cd..194ce3f61bbfdd 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1598,14 +1598,23 @@ def static_method(): pass #Issue21238 def test_mock_unsafe(self): m = Mock() - msg = "Attributes cannot start with 'assert' or 'assret'" + msg = "Attributes cannot start with 'assert' or its misspellings" with self.assertRaisesRegex(AttributeError, msg): m.assert_foo_call() with self.assertRaisesRegex(AttributeError, msg): m.assret_foo_call() + with self.assertRaisesRegex(AttributeError, msg): + m.asert_foo_call() + with self.assertRaisesRegex(AttributeError, msg): + m.aseert_foo_call() + with self.assertRaisesRegex(AttributeError, msg): + m.assrt_foo_call() m = Mock(unsafe=True) m.assert_foo_call() m.assret_foo_call() + m.asert_foo_call() + m.aseert_foo_call() + m.assrt_foo_call() #Issue21262 def test_assert_not_called(self): diff --git a/Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst b/Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst new file mode 100644 index 00000000000000..6f6fccb1d4cd18 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst @@ -0,0 +1,2 @@ +Mock objects which are not unsafe will now raise an AttributeError if an attribute with the prefix asert, aseert, +or assrt is accessed, in addition to this already happening for the prefixes assert or assret. \ No newline at end of file From 4bd44f566d50438ef2f68f7907bea1fdd49b6a3c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 5 Nov 2020 18:12:33 +0100 Subject: [PATCH 0478/1261] bpo-42260: Add _PyConfig_FromDict() (GH-23167) * Rename config_as_dict() to _PyConfig_AsDict(). * Add 'module_search_paths_set' to _PyConfig_AsDict(). * Add _PyConfig_FromDict(). * Add get_config() and set_config() to _testinternalcapi. * Add config_check_consistency(). --- Include/internal/pycore_initconfig.h | 3 + Lib/test/_test_embed_set_config.py | 243 ++++++++++++++++ Lib/test/test_embed.py | 14 + Modules/_testinternalcapi.c | 39 ++- Python/initconfig.c | 410 +++++++++++++++++++++++---- Python/sysmodule.c | 4 +- 6 files changed, 653 insertions(+), 60 deletions(-) create mode 100644 Lib/test/_test_embed_set_config.py diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h index df7ad779f477ce..325be5494d406a 100644 --- a/Include/internal/pycore_initconfig.h +++ b/Include/internal/pycore_initconfig.h @@ -158,6 +158,9 @@ extern PyStatus _PyConfig_SetPyArgv( PyConfig *config, const _PyArgv *args); +PyAPI_FUNC(PyObject*) _PyConfig_AsDict(const PyConfig *config); +PyAPI_FUNC(int) _PyConfig_FromDict(PyConfig *config, PyObject *dict); + /* --- Function used for testing ---------------------------------- */ diff --git a/Lib/test/_test_embed_set_config.py b/Lib/test/_test_embed_set_config.py new file mode 100644 index 00000000000000..7c913811ded5cf --- /dev/null +++ b/Lib/test/_test_embed_set_config.py @@ -0,0 +1,243 @@ +# bpo-42260: Test _PyInterpreterState_GetConfigCopy() +# and _PyInterpreterState_SetConfig(). +# +# Test run in a subinterpreter since set_config(get_config()) +# does reset sys attributes to their state of the Python startup +# (before the site module is run). + +import _testinternalcapi +import os +import sys +import unittest + + +MS_WINDOWS = (os.name == 'nt') +MAX_HASH_SEED = 4294967295 + +class SetConfigTests(unittest.TestCase): + def setUp(self): + self.old_config = _testinternalcapi.get_config() + self.sys_copy = dict(sys.__dict__) + + def tearDown(self): + self.set_config(parse_argv=0) + sys.__dict__.clear() + sys.__dict__.update(self.sys_copy) + + def set_config(self, **kwargs): + _testinternalcapi.set_config(self.old_config | kwargs) + + def check(self, **kwargs): + self.set_config(**kwargs) + for key, value in kwargs.items(): + self.assertEqual(getattr(sys, key), value, + (key, value)) + + def test_set_invalid(self): + invalid_uint = -1 + NULL = None + invalid_wstr = NULL + # PyWideStringList strings must be non-NULL + invalid_wstrlist = ["abc", NULL, "def"] + + type_tests = [] + value_tests = [ + # enum + ('_config_init', 0), + ('_config_init', 4), + # unsigned long + ("hash_seed", -1), + ("hash_seed", MAX_HASH_SEED + 1), + ] + + # int (unsigned) + options = [ + '_config_init', + 'isolated', + 'use_environment', + 'dev_mode', + 'install_signal_handlers', + 'use_hash_seed', + 'faulthandler', + 'tracemalloc', + 'import_time', + 'show_ref_count', + 'dump_refs', + 'malloc_stats', + 'parse_argv', + 'site_import', + 'bytes_warning', + 'inspect', + 'interactive', + 'optimization_level', + 'parser_debug', + 'write_bytecode', + 'verbose', + 'quiet', + 'user_site_directory', + 'configure_c_stdio', + 'buffered_stdio', + 'pathconfig_warnings', + 'module_search_paths_set', + 'skip_source_first_line', + '_install_importlib', + '_init_main', + '_isolated_interpreter', + ] + if MS_WINDOWS: + options.append('legacy_windows_stdio') + for key in options: + value_tests.append((key, invalid_uint)) + type_tests.append((key, "abc")) + type_tests.append((key, 2.0)) + + # wchar_t* + for key in ( + 'filesystem_encoding', + 'filesystem_errors', + 'stdio_encoding', + 'stdio_errors', + 'check_hash_pycs_mode', + 'program_name', + 'platlibdir', + 'executable', + 'base_executable', + 'prefix', + 'base_prefix', + 'exec_prefix', + 'base_exec_prefix', + # optional wstr: + # 'pythonpath_env' + # 'home', + # 'pycache_prefix' + # 'run_command' + # 'run_module' + # 'run_filename' + ): + value_tests.append((key, invalid_wstr)) + type_tests.append((key, b'bytes')) + type_tests.append((key, 123)) + + # PyWideStringList + for key in ( + 'orig_argv', + 'argv', + 'xoptions', + 'warnoptions', + 'module_search_paths', + ): + value_tests.append((key, invalid_wstrlist)) + type_tests.append((key, 123)) + type_tests.append((key, "abc")) + type_tests.append((key, [123])) + type_tests.append((key, [b"bytes"])) + + + if MS_WINDOWS: + value_tests.append(('legacy_windows_stdio', invalid_uint)) + + for exc_type, tests in ( + (ValueError, value_tests), + (TypeError, type_tests), + ): + for key, value in tests: + config = self.old_config | {key: value} + with self.subTest(key=key, value=value, exc_type=exc_type): + with self.assertRaises(exc_type): + _testinternalcapi.set_config(config) + + def test_flags(self): + for sys_attr, key, value in ( + ("debug", "parser_debug", 1), + ("inspect", "inspect", 2), + ("interactive", "interactive", 3), + ("optimize", "optimization_level", 4), + ("verbose", "verbose", 1), + ("bytes_warning", "bytes_warning", 10), + ("quiet", "quiet", 11), + ("isolated", "isolated", 12), + ): + with self.subTest(sys=sys_attr, key=key, value=value): + self.set_config(**{key: value, 'parse_argv': 0}) + self.assertEqual(getattr(sys.flags, sys_attr), value) + + self.set_config(write_bytecode=0) + self.assertEqual(sys.flags.dont_write_bytecode, True) + self.assertEqual(sys.dont_write_bytecode, True) + + self.set_config(write_bytecode=1) + self.assertEqual(sys.flags.dont_write_bytecode, False) + self.assertEqual(sys.dont_write_bytecode, False) + + self.set_config(user_site_directory=0, isolated=0) + self.assertEqual(sys.flags.no_user_site, 1) + self.set_config(user_site_directory=1, isolated=0) + self.assertEqual(sys.flags.no_user_site, 0) + + self.set_config(site_import=0) + self.assertEqual(sys.flags.no_site, 1) + self.set_config(site_import=1) + self.assertEqual(sys.flags.no_site, 0) + + self.set_config(dev_mode=0) + self.assertEqual(sys.flags.dev_mode, False) + self.set_config(dev_mode=1) + self.assertEqual(sys.flags.dev_mode, True) + + self.set_config(use_environment=0, isolated=0) + self.assertEqual(sys.flags.ignore_environment, 1) + self.set_config(use_environment=1, isolated=0) + self.assertEqual(sys.flags.ignore_environment, 0) + + self.set_config(use_hash_seed=1, hash_seed=0) + self.assertEqual(sys.flags.hash_randomization, 0) + self.set_config(use_hash_seed=0, hash_seed=0) + self.assertEqual(sys.flags.hash_randomization, 1) + self.set_config(use_hash_seed=1, hash_seed=123) + self.assertEqual(sys.flags.hash_randomization, 1) + + def test_options(self): + self.check(warnoptions=[]) + self.check(warnoptions=["default", "ignore"]) + + self.set_config(xoptions=[]) + self.assertEqual(sys._xoptions, {}) + self.set_config(xoptions=["dev", "tracemalloc=5"]) + self.assertEqual(sys._xoptions, {"dev": True, "tracemalloc": "5"}) + + def test_pathconfig(self): + self.check( + executable='executable', + prefix="prefix", + base_prefix="base_prefix", + exec_prefix="exec_prefix", + base_exec_prefix="base_exec_prefix", + platlibdir="platlibdir") + + self.set_config(base_executable="base_executable") + self.assertEqual(sys._base_executable, "base_executable") + + def test_path(self): + self.set_config(module_search_paths_set=1, + module_search_paths=['a', 'b', 'c']) + self.assertEqual(sys.path, ['a', 'b', 'c']) + + # Leave sys.path unchanged if module_search_paths_set=0 + self.set_config(module_search_paths_set=0, + module_search_paths=['new_path']) + self.assertEqual(sys.path, ['a', 'b', 'c']) + + def test_argv(self): + self.set_config(parse_argv=0, + argv=['python_program', 'args'], + orig_argv=['orig', 'orig_args']) + self.assertEqual(sys.argv, ['python_program', 'args']) + self.assertEqual(sys.orig_argv, ['orig', 'orig_args']) + + def test_pycache_prefix(self): + self.check(pycache_prefix=None) + self.check(pycache_prefix="pycache_prefix") + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 36a0e77e14cee7..918206151938d6 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -30,6 +30,8 @@ # _PyCoreConfig_InitIsolatedConfig() API_ISOLATED = 3 +MAX_HASH_SEED = 4294967295 + def debug_build(program): program = os.path.basename(program) @@ -382,6 +384,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'exec_prefix': GET_DEFAULT_CONFIG, 'base_exec_prefix': GET_DEFAULT_CONFIG, 'module_search_paths': GET_DEFAULT_CONFIG, + 'module_search_paths_set': 1, 'platlibdir': sys.platlibdir, 'site_import': 1, @@ -1408,6 +1411,17 @@ def test_get_argc_argv(self): # ignore output +class SetConfigTests(unittest.TestCase): + def test_set_config(self): + # bpo-42260: Test _PyInterpreterState_SetConfig() + cmd = [sys.executable, '-I', '-m', 'test._test_embed_set_config'] + proc = subprocess.run(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + self.assertEqual(proc.returncode, 0, + (proc.returncode, proc.stdout, proc.stderr)) + + class AuditingTests(EmbeddingTestsMixin, unittest.TestCase): def test_open_code_hook(self): self.run_embedded_interpreter("test_open_code_hook") diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index ad74af8363ef45..be144bfba02665 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -13,9 +13,10 @@ #include "Python.h" #include "pycore_bitutils.h" // _Py_bswap32() -#include "pycore_initconfig.h" // _Py_GetConfigsAsDict() -#include "pycore_hashtable.h" // _Py_hashtable_new() #include "pycore_gc.h" // PyGC_Head +#include "pycore_hashtable.h" // _Py_hashtable_new() +#include "pycore_initconfig.h" // _Py_GetConfigsAsDict() +#include "pycore_interp.h" // _PyInterpreterState_GetConfigCopy() static PyObject * @@ -231,6 +232,38 @@ test_hashtable(PyObject *self, PyObject *Py_UNUSED(args)) } +static PyObject * +test_get_config(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(args)) +{ + PyConfig config; + PyConfig_InitIsolatedConfig(&config); + if (_PyInterpreterState_GetConfigCopy(&config) < 0) { + PyConfig_Clear(&config); + return NULL; + } + PyObject *dict = _PyConfig_AsDict(&config); + PyConfig_Clear(&config); + return dict; +} + + +static PyObject * +test_set_config(PyObject *Py_UNUSED(self), PyObject *dict) +{ + PyConfig config; + PyConfig_InitIsolatedConfig(&config); + if (_PyConfig_FromDict(&config, dict) < 0) { + PyConfig_Clear(&config); + return NULL; + } + if (_PyInterpreterState_SetConfig(&config) < 0) { + return NULL; + } + PyConfig_Clear(&config); + Py_RETURN_NONE; +} + + static PyMethodDef TestMethods[] = { {"get_configs", get_configs, METH_NOARGS}, {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, @@ -238,6 +271,8 @@ static PyMethodDef TestMethods[] = { {"test_popcount", test_popcount, METH_NOARGS}, {"test_bit_length", test_bit_length, METH_NOARGS}, {"test_hashtable", test_hashtable, METH_NOARGS}, + {"get_config", test_get_config, METH_NOARGS}, + {"set_config", test_set_config, METH_O}, {NULL, NULL} /* sentinel */ }; diff --git a/Python/initconfig.c b/Python/initconfig.c index de496ac7b522bf..d54d5b7a9991dc 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -577,6 +577,74 @@ Py_GetArgcArgv(int *argc, wchar_t ***argv) ? _PyStatus_ERR("cannot decode " NAME) \ : _PyStatus_NO_MEMORY()) +#define MAX_HASH_SEED 4294967295UL + + +#ifndef NDEBUG +static int +config_check_consistency(const PyConfig *config) +{ + /* Check config consistency */ + assert(config->isolated >= 0); + assert(config->use_environment >= 0); + assert(config->dev_mode >= 0); + assert(config->install_signal_handlers >= 0); + assert(config->use_hash_seed >= 0); + assert(config->hash_seed <= MAX_HASH_SEED); + assert(config->faulthandler >= 0); + assert(config->tracemalloc >= 0); + assert(config->import_time >= 0); + assert(config->show_ref_count >= 0); + assert(config->dump_refs >= 0); + assert(config->malloc_stats >= 0); + assert(config->site_import >= 0); + assert(config->bytes_warning >= 0); + assert(config->inspect >= 0); + assert(config->interactive >= 0); + assert(config->optimization_level >= 0); + assert(config->parser_debug >= 0); + assert(config->write_bytecode >= 0); + assert(config->verbose >= 0); + assert(config->quiet >= 0); + assert(config->user_site_directory >= 0); + assert(config->parse_argv >= 0); + assert(config->configure_c_stdio >= 0); + assert(config->buffered_stdio >= 0); + assert(config->program_name != NULL); + assert(_PyWideStringList_CheckConsistency(&config->orig_argv)); + assert(_PyWideStringList_CheckConsistency(&config->argv)); + /* sys.argv must be non-empty: empty argv is replaced with [''] */ + assert(config->argv.length >= 1); + assert(_PyWideStringList_CheckConsistency(&config->xoptions)); + assert(_PyWideStringList_CheckConsistency(&config->warnoptions)); + assert(_PyWideStringList_CheckConsistency(&config->module_search_paths)); + assert(config->module_search_paths_set >= 0); + if (config->_install_importlib) { + /* don't check config->module_search_paths */ + assert(config->executable != NULL); + assert(config->base_executable != NULL); + assert(config->prefix != NULL); + assert(config->base_prefix != NULL); + assert(config->exec_prefix != NULL); + assert(config->base_exec_prefix != NULL); + } + assert(config->platlibdir != NULL); + assert(config->filesystem_encoding != NULL); + assert(config->filesystem_errors != NULL); + assert(config->stdio_encoding != NULL); + assert(config->stdio_errors != NULL); +#ifdef MS_WINDOWS + assert(config->legacy_windows_stdio >= 0); +#endif + /* -c and -m options are exclusive */ + assert(!(config->run_command != NULL && config->run_module != NULL)); + assert(config->check_hash_pycs_mode != NULL); + assert(config->_install_importlib >= 0); + assert(config->pathconfig_warnings >= 0); + return 1; +} +#endif + /* Free memory allocated in config, but don't clear all attributes */ void @@ -880,8 +948,8 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) } -static PyObject * -config_as_dict(const PyConfig *config) +PyObject * +_PyConfig_AsDict(const PyConfig *config) { PyObject *dict = PyDict_New(); if (dict == NULL) { @@ -936,6 +1004,7 @@ config_as_dict(const PyConfig *config) SET_ITEM_WSTRLIST(warnoptions); SET_ITEM_WSTR(pythonpath_env); SET_ITEM_WSTR(home); + SET_ITEM_INT(module_search_paths_set); SET_ITEM_WSTRLIST(module_search_paths); SET_ITEM_WSTR(executable); SET_ITEM_WSTR(base_executable); @@ -987,6 +1056,285 @@ config_as_dict(const PyConfig *config) } +static PyObject* +config_dict_get(PyObject *dict, const char *name) +{ + PyObject *item = PyDict_GetItemString(dict, name); + if (item == NULL) { + PyErr_Format(PyExc_ValueError, "missing config key: %s", name); + return NULL; + } + return item; +} + + +static void +config_dict_invalid_value(const char *name) +{ + PyErr_Format(PyExc_ValueError, "invalid config value: %s", name); +} + + +static void +config_dict_invalid_type(const char *name) +{ + PyErr_Format(PyExc_TypeError, "invalid config type: %s", name); +} + + +static int +config_dict_get_int(PyObject *dict, const char *name, int *result) +{ + PyObject *item = config_dict_get(dict, name); + if (item == NULL) { + return -1; + } + int value = _PyLong_AsInt(item); + if (value == -1 && PyErr_Occurred()) { + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + config_dict_invalid_type(name); + } + else { + config_dict_invalid_value(name); + } + return -1; + } + *result = value; + return 0; +} + + +static int +config_dict_get_ulong(PyObject *dict, const char *name, unsigned long *result) +{ + PyObject *item = config_dict_get(dict, name); + if (item == NULL) { + return -1; + } + unsigned long value = PyLong_AsUnsignedLong(item); + if (value == (unsigned long)-1 && PyErr_Occurred()) { + config_dict_invalid_value(name); + return -1; + } + *result = value; + return 0; +} + + +static int +config_dict_get_wstr(PyObject *dict, const char *name, PyConfig *config, + wchar_t **result) +{ + PyObject *item = config_dict_get(dict, name); + if (item == NULL) { + return -1; + } + PyStatus status; + if (item == Py_None) { + status = PyConfig_SetString(config, result, NULL); + } + else if (!PyUnicode_Check(item)) { + config_dict_invalid_type(name); + return -1; + } + else { + wchar_t *wstr = PyUnicode_AsWideCharString(item, NULL); + if (wstr == NULL) { + return -1; + } + status = PyConfig_SetString(config, result, wstr); + PyMem_Free(wstr); + } + if (_PyStatus_EXCEPTION(status)) { + PyErr_NoMemory(); + return -1; + } + return 0; +} + + +static int +config_dict_get_wstrlist(PyObject *dict, const char *name, PyConfig *config, + PyWideStringList *result) +{ + PyObject *list = config_dict_get(dict, name); + if (list == NULL) { + return -1; + } + + if (!PyList_CheckExact(list)) { + config_dict_invalid_type(name); + return -1; + } + + PyWideStringList wstrlist = _PyWideStringList_INIT; + for (Py_ssize_t i=0; i < PyList_GET_SIZE(list); i++) { + PyObject *item = PyList_GET_ITEM(list, i); + + if (item == Py_None) { + config_dict_invalid_value(name); + goto error; + } + else if (!PyUnicode_Check(item)) { + config_dict_invalid_type(name); + goto error; + } + wchar_t *wstr = PyUnicode_AsWideCharString(item, NULL); + if (wstr == NULL) { + goto error; + } + PyStatus status = PyWideStringList_Append(&wstrlist, wstr); + PyMem_Free(wstr); + if (_PyStatus_EXCEPTION(status)) { + PyErr_NoMemory(); + goto error; + } + } + + if (_PyWideStringList_Copy(result, &wstrlist) < 0) { + PyErr_NoMemory(); + goto error; + } + _PyWideStringList_Clear(&wstrlist); + return 0; + +error: + _PyWideStringList_Clear(&wstrlist); + return -1; +} + + +int +_PyConfig_FromDict(PyConfig *config, PyObject *dict) +{ + if (!PyDict_Check(dict)) { + PyErr_SetString(PyExc_TypeError, "dict expected"); + return -1; + } + +#define CHECK_VALUE(NAME, TEST) \ + if (!(TEST)) { \ + config_dict_invalid_value(NAME); \ + return -1; \ + } +#define GET_UINT(KEY) \ + do { \ + if (config_dict_get_int(dict, #KEY, &config->KEY) < 0) { \ + return -1; \ + } \ + CHECK_VALUE(#KEY, config->KEY >= 0); \ + } while (0) +#define GET_WSTR(KEY) \ + do { \ + if (config_dict_get_wstr(dict, #KEY, config, &config->KEY) < 0) { \ + return -1; \ + } \ + CHECK_VALUE(#KEY, config->KEY != NULL); \ + } while (0) +#define GET_WSTR_OPT(KEY) \ + do { \ + if (config_dict_get_wstr(dict, #KEY, config, &config->KEY) < 0) { \ + return -1; \ + } \ + } while (0) +#define GET_WSTRLIST(KEY) \ + do { \ + if (config_dict_get_wstrlist(dict, #KEY, config, &config->KEY) < 0) { \ + return -1; \ + } \ + } while (0) + + GET_UINT(_config_init); + CHECK_VALUE("_config_init", + config->_config_init == _PyConfig_INIT_COMPAT + || config->_config_init == _PyConfig_INIT_PYTHON + || config->_config_init == _PyConfig_INIT_ISOLATED); + GET_UINT(isolated); + GET_UINT(use_environment); + GET_UINT(dev_mode); + GET_UINT(install_signal_handlers); + GET_UINT(use_hash_seed); + if (config_dict_get_ulong(dict, "hash_seed", &config->hash_seed) < 0) { + return -1; + } + CHECK_VALUE("hash_seed", config->hash_seed <= MAX_HASH_SEED); + GET_UINT(faulthandler); + GET_UINT(tracemalloc); + GET_UINT(import_time); + GET_UINT(show_ref_count); + GET_UINT(dump_refs); + GET_UINT(malloc_stats); + GET_WSTR(filesystem_encoding); + GET_WSTR(filesystem_errors); + GET_WSTR_OPT(pycache_prefix); + GET_UINT(parse_argv); + GET_WSTRLIST(orig_argv); + GET_WSTRLIST(argv); + GET_WSTRLIST(xoptions); + GET_WSTRLIST(warnoptions); + GET_UINT(site_import); + GET_UINT(bytes_warning); + GET_UINT(inspect); + GET_UINT(interactive); + GET_UINT(optimization_level); + GET_UINT(parser_debug); + GET_UINT(write_bytecode); + GET_UINT(verbose); + GET_UINT(quiet); + GET_UINT(user_site_directory); + GET_UINT(configure_c_stdio); + GET_UINT(buffered_stdio); + GET_WSTR(stdio_encoding); + GET_WSTR(stdio_errors); +#ifdef MS_WINDOWS + GET_UINT(legacy_windows_stdio); +#endif + GET_WSTR(check_hash_pycs_mode); + + GET_UINT(pathconfig_warnings); + GET_WSTR(program_name); + GET_WSTR_OPT(pythonpath_env); + GET_WSTR_OPT(home); + GET_WSTR(platlibdir); + + GET_UINT(module_search_paths_set); + GET_WSTRLIST(module_search_paths); + if (config->_install_importlib) { + GET_WSTR(executable); + GET_WSTR(base_executable); + GET_WSTR(prefix); + GET_WSTR(base_prefix); + GET_WSTR(exec_prefix); + GET_WSTR(base_exec_prefix); + } + else { + GET_WSTR_OPT(executable); + GET_WSTR_OPT(base_executable); + GET_WSTR_OPT(prefix); + GET_WSTR_OPT(base_prefix); + GET_WSTR_OPT(exec_prefix); + GET_WSTR_OPT(base_exec_prefix); + } + + GET_UINT(skip_source_first_line); + GET_WSTR_OPT(run_command); + GET_WSTR_OPT(run_module); + GET_WSTR_OPT(run_filename); + + GET_UINT(_install_importlib); + GET_UINT(_init_main); + GET_UINT(_isolated_interpreter); + + assert(config_check_consistency(config)); + +#undef CHECK_VALUE +#undef GET_UINT +#undef GET_WSTR +#undef GET_WSTR_OPT + return 0; +} + + static const char* config_get_env(const PyConfig *config, const char *name) { @@ -1254,7 +1602,6 @@ config_init_home(PyConfig *config) L"PYTHONHOME", "PYTHONHOME"); } - static PyStatus config_init_hash_seed(PyConfig *config) { @@ -1268,7 +1615,7 @@ config_init_hash_seed(PyConfig *config) errno = 0; seed = strtoul(seed_text, (char **)&endptr, 10); if (*endptr != '\0' - || seed > 4294967295UL + || seed > MAX_HASH_SEED || (errno == ERANGE && seed == ULONG_MAX)) { return _PyStatus_ERR("PYTHONHASHSEED must be \"random\" " @@ -2532,58 +2879,7 @@ PyConfig_Read(PyConfig *config) goto done; } - /* Check config consistency */ - assert(config->isolated >= 0); - assert(config->use_environment >= 0); - assert(config->dev_mode >= 0); - assert(config->install_signal_handlers >= 0); - assert(config->use_hash_seed >= 0); - assert(config->faulthandler >= 0); - assert(config->tracemalloc >= 0); - assert(config->site_import >= 0); - assert(config->bytes_warning >= 0); - assert(config->inspect >= 0); - assert(config->interactive >= 0); - assert(config->optimization_level >= 0); - assert(config->parser_debug >= 0); - assert(config->write_bytecode >= 0); - assert(config->verbose >= 0); - assert(config->quiet >= 0); - assert(config->user_site_directory >= 0); - assert(config->parse_argv >= 0); - assert(config->configure_c_stdio >= 0); - assert(config->buffered_stdio >= 0); - assert(config->program_name != NULL); - assert(_PyWideStringList_CheckConsistency(&config->argv)); - /* sys.argv must be non-empty: empty argv is replaced with [''] */ - assert(config->argv.length >= 1); - assert(_PyWideStringList_CheckConsistency(&config->xoptions)); - assert(_PyWideStringList_CheckConsistency(&config->warnoptions)); - assert(_PyWideStringList_CheckConsistency(&config->module_search_paths)); - if (config->_install_importlib) { - assert(config->module_search_paths_set != 0); - /* don't check config->module_search_paths */ - assert(config->executable != NULL); - assert(config->base_executable != NULL); - assert(config->prefix != NULL); - assert(config->base_prefix != NULL); - assert(config->exec_prefix != NULL); - assert(config->base_exec_prefix != NULL); - } - assert(config->platlibdir != NULL); - assert(config->filesystem_encoding != NULL); - assert(config->filesystem_errors != NULL); - assert(config->stdio_encoding != NULL); - assert(config->stdio_errors != NULL); -#ifdef MS_WINDOWS - assert(config->legacy_windows_stdio >= 0); -#endif - /* -c and -m options are exclusive */ - assert(!(config->run_command != NULL && config->run_module != NULL)); - assert(config->check_hash_pycs_mode != NULL); - assert(config->_install_importlib >= 0); - assert(config->pathconfig_warnings >= 0); - assert(_PyWideStringList_CheckConsistency(&config->orig_argv)); + assert(config_check_consistency(config)); status = _PyStatus_OK(); @@ -2628,7 +2924,7 @@ _Py_GetConfigsAsDict(void) /* core config */ const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); - dict = config_as_dict(config); + dict = _PyConfig_AsDict(config); if (dict == NULL) { goto error; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 60b2494651235a..ae4f0eeb2ee667 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2922,7 +2922,9 @@ _PySys_UpdateConfig(PyThreadState *tstate) #define SET_SYS_FROM_WSTR(KEY, VALUE) \ SET_SYS(KEY, PyUnicode_FromWideChar(VALUE, -1)); - COPY_LIST("path", config->module_search_paths); + if (config->module_search_paths_set) { + COPY_LIST("path", config->module_search_paths); + } SET_SYS_FROM_WSTR("executable", config->executable); SET_SYS_FROM_WSTR("_base_executable", config->base_executable); From 13284ca818b712b37875d14d27815dfb74b66618 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 5 Nov 2020 18:58:07 +0100 Subject: [PATCH 0479/1261] bpo-42260: PyConfig_Read() only parses argv once (GH-23168) The PyConfig_Read() function now only parses PyConfig.argv arguments once: PyConfig.parse_argv is set to 2 after arguments are parsed. Since Python arguments are strippped from PyConfig.argv, parsing arguments twice would parse the application options as Python options. * Rework the PyConfig documentation. * Fix _testinternalcapi.set_config() error handling. * SetConfigTests no longer needs parse_argv=0 when restoring the old configuration. --- Doc/c-api/init_config.rst | 196 ++++++++++-------- Lib/test/_test_embed_set_config.py | 8 +- Lib/test/test_embed.py | 10 +- .../2020-11-05-18-02-07.bpo-42260.pAeaNR.rst | 5 + Modules/_testinternalcapi.c | 9 +- Python/initconfig.c | 11 +- 6 files changed, 134 insertions(+), 105 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-05-18-02-07.bpo-42260.pAeaNR.rst diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index c957d6c0f723c2..edfeba5db7dfab 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -8,55 +8,68 @@ Python Initialization Configuration .. versionadded:: 3.8 -Structures: - -* :c:type:`PyConfig` -* :c:type:`PyPreConfig` -* :c:type:`PyStatus` -* :c:type:`PyWideStringList` - -Functions: - -* :c:func:`PyConfig_Clear` -* :c:func:`PyConfig_InitIsolatedConfig` -* :c:func:`PyConfig_InitPythonConfig` -* :c:func:`PyConfig_Read` -* :c:func:`PyConfig_SetArgv` -* :c:func:`PyConfig_SetBytesArgv` -* :c:func:`PyConfig_SetBytesString` -* :c:func:`PyConfig_SetString` -* :c:func:`PyConfig_SetWideStringList` -* :c:func:`PyPreConfig_InitIsolatedConfig` -* :c:func:`PyPreConfig_InitPythonConfig` -* :c:func:`PyStatus_Error` -* :c:func:`PyStatus_Exception` -* :c:func:`PyStatus_Exit` -* :c:func:`PyStatus_IsError` -* :c:func:`PyStatus_IsExit` -* :c:func:`PyStatus_NoMemory` -* :c:func:`PyStatus_Ok` -* :c:func:`PyWideStringList_Append` -* :c:func:`PyWideStringList_Insert` -* :c:func:`Py_ExitStatusException` -* :c:func:`Py_InitializeFromConfig` -* :c:func:`Py_PreInitialize` -* :c:func:`Py_PreInitializeFromArgs` -* :c:func:`Py_PreInitializeFromBytesArgs` -* :c:func:`Py_RunMain` -* :c:func:`Py_GetArgcArgv` - -The preconfiguration (``PyPreConfig`` type) is stored in -``_PyRuntime.preconfig`` and the configuration (``PyConfig`` type) is stored in -``PyInterpreterState.config``. +Python can be initialized with :c:func:`Py_InitializeFromConfig` and the +:c:type:`PyConfig` structure. It can be preinitialized with +:c:func:`Py_PreInitialize` and the :c:type:`PyPreConfig` structure. + +There are two kinds of configuration: + +* The :ref:`Python Configuration ` can be used to build a + customized Python which behaves as the regular Python. For example, + environments variables and command line arguments are used to configure + Python. + +* The :ref:`Isolated Configuration ` can be used to embed + Python into an application. It isolates Python from the system. For example, + environments variables are ignored, the LC_CTYPE locale is left unchanged and + no signal handler is registred. See also :ref:`Initialization, Finalization, and Threads `. .. seealso:: :pep:`587` "Python Initialization Configuration". +Example +======= + +Example of customized Python always running in isolated mode:: + + int main(int argc, char **argv) + { + PyStatus status; + + PyConfig config; + PyConfig_InitPythonConfig(&config); + config.isolated = 1; + + /* Decode command line arguments. + Implicitly preinitialize Python (in isolated mode). */ + status = PyConfig_SetBytesArgv(&config, argc, argv); + if (PyStatus_Exception(status)) { + goto exception; + } + + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + goto exception; + } + PyConfig_Clear(&config); + + return Py_RunMain(); + + exception: + PyConfig_Clear(&config); + if (PyStatus_IsExit(status)) { + return status.exitcode; + } + /* Display the error message and exit the process with + non-zero exit code */ + Py_ExitStatusException(status); + } + PyWideStringList ----------------- +================ .. c:type:: PyWideStringList @@ -95,7 +108,7 @@ PyWideStringList List items. PyStatus --------- +======== .. c:type:: PyStatus @@ -187,7 +200,7 @@ Example:: PyPreConfig ------------ +=========== .. c:type:: PyPreConfig @@ -317,7 +330,7 @@ PyPreConfig .. _c-preinit: Preinitialize Python with PyPreConfig -------------------------------------- +===================================== The preinitialization of Python: @@ -326,12 +339,17 @@ The preinitialization of Python: * Set the :ref:`Python UTF-8 Mode ` (:c:member:`PyPreConfig.utf8_mode`) +The current preconfiguration (``PyPreConfig`` type) is stored in +``_PyRuntime.preconfig``. + Functions to preinitialize Python: .. c:function:: PyStatus Py_PreInitialize(const PyPreConfig *preconfig) Preinitialize Python from *preconfig* preconfiguration. + *preconfig* must not be ``NULL``. + .. c:function:: PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char * const *argv) Preinitialize Python from *preconfig* preconfiguration. @@ -339,6 +357,8 @@ Functions to preinitialize Python: Parse *argv* command line arguments (bytes strings) if :c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero. + *preconfig* must not be ``NULL``. + .. c:function:: PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t * const * argv) Preinitialize Python from *preconfig* preconfiguration. @@ -346,6 +366,8 @@ Functions to preinitialize Python: Parse *argv* command line arguments (wide strings) if :c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero. + *preconfig* must not be ``NULL``. + The caller is responsible to handle exceptions (error or exit) using :c:func:`PyStatus_Exception` and :c:func:`Py_ExitStatusException`. @@ -388,7 +410,7 @@ the :ref:`Python UTF-8 Mode `:: PyConfig --------- +======== .. c:type:: PyConfig @@ -449,8 +471,20 @@ PyConfig Fields which are already initialized are left unchanged. + The :c:func:`PyConfig_Read` function only parses + :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv` + is set to ``2`` after arguments are parsed. Since Python arguments are + strippped from :c:member:`PyConfig.argv`, parsing arguments twice would + parse the application options as Python options. + :ref:`Preinitialize Python ` if needed. + .. versionchanged:: 3.10 + The :c:member:`PyConfig.argv` arguments are now only parsed once, + :c:member:`PyConfig.parse_argv` is set to ``2`` after arguments are + parsed, and arguments are only parsed if + :c:member:`PyConfig.parse_argv` equals ``1``. + .. c:function:: void PyConfig_Clear(PyConfig *config) Release configuration memory. @@ -833,7 +867,7 @@ PyConfig If :c:member:`~PyConfig.orig_argv` list is empty and :c:member:`~PyConfig.argv` is not a list only containing an empty - string, :c:func:`PyConfig_Read()` copies :c:member:`~PyConfig.argv` into + string, :c:func:`PyConfig_Read` copies :c:member:`~PyConfig.argv` into :c:member:`~PyConfig.orig_argv` before modifying :c:member:`~PyConfig.argv` (if :c:member:`~PyConfig.parse_argv` is non-zero). @@ -849,12 +883,22 @@ PyConfig Parse command line arguments? - If non-zero, parse :c:member:`~PyConfig.argv` the same way the regular + If equals to ``1``, parse :c:member:`~PyConfig.argv` the same way the regular Python parses :ref:`command line arguments `, and strip Python arguments from :c:member:`~PyConfig.argv`. + The :c:func:`PyConfig_Read` function only parses + :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv` + is set to ``2`` after arguments are parsed. Since Python arguments are + strippped from :c:member:`PyConfig.argv`, parsing arguments twice would + parse the application options as Python options. + Default: ``1`` in Python mode, ``0`` in isolated mode. + .. versionchanged:: 3.10 + The :c:member:`PyConfig.argv` arguments are now only parsed if + :c:member:`PyConfig.parse_argv` equals to ``1``. + .. c:member:: int parser_debug Parser debug mode. If greater than 0, turn on parser debugging output (for expert only, depending @@ -1108,7 +1152,7 @@ the :option:`-X` command line option. Initialization with PyConfig ----------------------------- +============================ Function to initialize Python: @@ -1123,6 +1167,9 @@ If :c:func:`PyImport_FrozenModules`, :c:func:`PyImport_AppendInittab` or :c:func:`PyImport_ExtendInittab` are used, they must be set or called after Python preinitialization and before the Python initialization. +The current configuration (``PyConfig`` type) is stored in +``PyInterpreterState.config``. + Example setting the program name:: void init_python(void) @@ -1136,17 +1183,17 @@ Example setting the program name:: status = PyConfig_SetString(&config, &config.program_name, L"/path/to/my_program"); if (PyStatus_Exception(status)) { - goto fail; + goto exception; } status = Py_InitializeFromConfig(&config); if (PyStatus_Exception(status)) { - goto fail; + goto exception; } PyConfig_Clear(&config); return; - fail: + exception: PyConfig_Clear(&config); Py_ExitStatusException(status); } @@ -1202,7 +1249,7 @@ configuration, and then override some parameters:: .. _init-isolated-conf: Isolated Configuration ----------------------- +====================== :c:func:`PyPreConfig_InitIsolatedConfig` and :c:func:`PyConfig_InitIsolatedConfig` functions create a configuration to @@ -1223,7 +1270,7 @@ configuration. .. _init-python-config: Python Configuration --------------------- +==================== :c:func:`PyPreConfig_InitPythonConfig` and :c:func:`PyConfig_InitPythonConfig` functions create a configuration to build a customized Python which behaves as @@ -1237,46 +1284,11 @@ and :ref:`Python UTF-8 Mode ` (:pep:`540`) depending on the LC_CTYPE locale, :envvar:`PYTHONUTF8` and :envvar:`PYTHONCOERCECLOCALE` environment variables. -Example of customized Python always running in isolated mode:: - - int main(int argc, char **argv) - { - PyStatus status; - - PyConfig config; - PyConfig_InitPythonConfig(&config); - config.isolated = 1; - - /* Decode command line arguments. - Implicitly preinitialize Python (in isolated mode). */ - status = PyConfig_SetBytesArgv(&config, argc, argv); - if (PyStatus_Exception(status)) { - goto fail; - } - - status = Py_InitializeFromConfig(&config); - if (PyStatus_Exception(status)) { - goto fail; - } - PyConfig_Clear(&config); - - return Py_RunMain(); - - fail: - PyConfig_Clear(&config); - if (PyStatus_IsExit(status)) { - return status.exitcode; - } - /* Display the error message and exit the process with - non-zero exit code */ - Py_ExitStatusException(status); - } - .. _init-path-config: Path Configuration ------------------- +================== :c:type:`PyConfig` contains multiple fields for the path configuration: @@ -1356,7 +1368,7 @@ The ``__PYVENV_LAUNCHER__`` environment variable is used to set Py_RunMain() ------------- +============ .. c:function:: int Py_RunMain(void) @@ -1376,7 +1388,7 @@ customized Python always running in isolated mode using Py_GetArgcArgv() ----------------- +================ .. c:function:: void Py_GetArgcArgv(int *argc, wchar_t ***argv) @@ -1386,7 +1398,7 @@ Py_GetArgcArgv() Multi-Phase Initialization Private Provisional API --------------------------------------------------- +================================================== This section is a private provisional API introducing multi-phase initialization, the core feature of the :pep:`432`: diff --git a/Lib/test/_test_embed_set_config.py b/Lib/test/_test_embed_set_config.py index 7c913811ded5cf..a19f8db1584f4f 100644 --- a/Lib/test/_test_embed_set_config.py +++ b/Lib/test/_test_embed_set_config.py @@ -20,7 +20,7 @@ def setUp(self): self.sys_copy = dict(sys.__dict__) def tearDown(self): - self.set_config(parse_argv=0) + _testinternalcapi.set_config(self.old_config) sys.__dict__.clear() sys.__dict__.update(self.sys_copy) @@ -234,6 +234,12 @@ def test_argv(self): self.assertEqual(sys.argv, ['python_program', 'args']) self.assertEqual(sys.orig_argv, ['orig', 'orig_args']) + self.set_config(parse_argv=0, + argv=[], + orig_argv=[]) + self.assertEqual(sys.argv, ['']) + self.assertEqual(sys.orig_argv, []) + def test_pycache_prefix(self): self.check(pycache_prefix=None) self.check(pycache_prefix="pycache_prefix") diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 918206151938d6..a7d912178a2ad4 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -422,7 +422,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): CONFIG_PYTHON = dict(CONFIG_COMPAT, _config_init=API_PYTHON, configure_c_stdio=1, - parse_argv=1, + parse_argv=2, ) CONFIG_ISOLATED = dict(CONFIG_COMPAT, _config_init=API_ISOLATED, @@ -800,7 +800,7 @@ def test_init_from_config(self): '-X', 'cmdline_xoption', '-c', 'pass', 'arg2'], - 'parse_argv': 1, + 'parse_argv': 2, 'xoptions': [ 'config_xoption1=3', 'config_xoption2=', @@ -1045,7 +1045,7 @@ def test_init_run_main(self): 'orig_argv': ['python3', '-c', code, 'arg2'], 'program_name': './python3', 'run_command': code + '\n', - 'parse_argv': 1, + 'parse_argv': 2, } self.check_all_configs("test_init_run_main", config, api=API_PYTHON) @@ -1059,7 +1059,7 @@ def test_init_main(self): 'arg2'], 'program_name': './python3', 'run_command': code + '\n', - 'parse_argv': 1, + 'parse_argv': 2, '_init_main': 0, } self.check_all_configs("test_init_main", config, @@ -1068,7 +1068,7 @@ def test_init_main(self): def test_init_parse_argv(self): config = { - 'parse_argv': 1, + 'parse_argv': 2, 'argv': ['-c', 'arg1', '-v', 'arg3'], 'orig_argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], 'program_name': './argv0', diff --git a/Misc/NEWS.d/next/C API/2020-11-05-18-02-07.bpo-42260.pAeaNR.rst b/Misc/NEWS.d/next/C API/2020-11-05-18-02-07.bpo-42260.pAeaNR.rst new file mode 100644 index 00000000000000..0d6a277db88d45 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-05-18-02-07.bpo-42260.pAeaNR.rst @@ -0,0 +1,5 @@ +The :c:func:`PyConfig_Read` function now only parses :c:member:`PyConfig.argv` +arguments once: :c:member:`PyConfig.parse_argv` is set to ``2`` after arguments +are parsed. Since Python arguments are strippped from +:c:member:`PyConfig.argv`, parsing arguments twice would parse the application +options as Python options. diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index be144bfba02665..df4725ea0a1c82 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -253,14 +253,17 @@ test_set_config(PyObject *Py_UNUSED(self), PyObject *dict) PyConfig config; PyConfig_InitIsolatedConfig(&config); if (_PyConfig_FromDict(&config, dict) < 0) { - PyConfig_Clear(&config); - return NULL; + goto error; } if (_PyInterpreterState_SetConfig(&config) < 0) { - return NULL; + goto error; } PyConfig_Clear(&config); Py_RETURN_NONE; + +error: + PyConfig_Clear(&config); + return NULL; } diff --git a/Python/initconfig.c b/Python/initconfig.c index d54d5b7a9991dc..e0811b56cb374e 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1325,8 +1325,6 @@ _PyConfig_FromDict(PyConfig *config, PyObject *dict) GET_UINT(_init_main); GET_UINT(_isolated_interpreter); - assert(config_check_consistency(config)); - #undef CHECK_VALUE #undef GET_UINT #undef GET_WSTR @@ -2145,6 +2143,11 @@ config_read(PyConfig *config) config->configure_c_stdio = 1; } + // Only parse arguments once. + if (config->parse_argv == 1) { + config->parse_argv = 2; + } + return _PyStatus_OK(); } @@ -2635,7 +2638,7 @@ core_read_precmdline(PyConfig *config, _PyPreCmdline *precmdline) { PyStatus status; - if (config->parse_argv) { + if (config->parse_argv == 1) { if (_PyWideStringList_Copy(&precmdline->argv, &config->argv) < 0) { return _PyStatus_NO_MEMORY(); } @@ -2713,7 +2716,7 @@ config_read_cmdline(PyConfig *config) } } - if (config->parse_argv) { + if (config->parse_argv == 1) { Py_ssize_t opt_index; status = config_parse_cmdline(config, &cmdline_warnoptions, &opt_index); if (_PyStatus_EXCEPTION(status)) { From 0772648779b05af930ab8f43bdcd021ed859748e Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Thu, 5 Nov 2020 15:18:44 -0700 Subject: [PATCH 0480/1261] bpo-26389: Allow passing an exception object in the traceback module (GH-22610) The format_exception(), format_exception_only(), and print_exception() functions can now take an exception object as a positional-only argument. Co-Authored-By: Matthias Bussonnier --- Doc/library/traceback.rst | 43 ++++++++++++++----- Doc/whatsnew/3.10.rst | 18 ++++++++ Lib/test/test_traceback.py | 20 +++++++++ Lib/traceback.py | 36 ++++++++++------ .../2020-10-08-23-51-55.bpo-26389.uga44e.rst | 4 ++ 5 files changed, 97 insertions(+), 24 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-08-23-51-55.bpo-26389.uga44e.rst diff --git a/Doc/library/traceback.rst b/Doc/library/traceback.rst index 462a6a5566e201..c233f18d30a29f 100644 --- a/Doc/library/traceback.rst +++ b/Doc/library/traceback.rst @@ -36,7 +36,8 @@ The module defines the following functions: Added negative *limit* support. -.. function:: print_exception(etype, value, tb, limit=None, file=None, chain=True) +.. function:: print_exception(exc, /[, value, tb], limit=None, \ + file=None, chain=True) Print exception information and stack trace entries from traceback object *tb* to *file*. This differs from :func:`print_tb` in the following @@ -45,7 +46,7 @@ The module defines the following functions: * if *tb* is not ``None``, it prints a header ``Traceback (most recent call last):`` - * it prints the exception *etype* and *value* after the stack trace + * it prints the exception type and *value* after the stack trace .. index:: single: ^ (caret); marker @@ -53,6 +54,10 @@ The module defines the following functions: format, it prints the line where the syntax error occurred with a caret indicating the approximate position of the error. + Since Python 3.10, instead of passing *value* and *tb*, an exception object + can be passed as the first argument. If *value* and *tb* are provided, the + first argument is ignored in order to provide backwards compatibility. + The optional *limit* argument has the same meaning as for :func:`print_tb`. If *chain* is true (the default), then chained exceptions (the :attr:`__cause__` or :attr:`__context__` attributes of the exception) will be @@ -62,6 +67,10 @@ The module defines the following functions: .. versionchanged:: 3.5 The *etype* argument is ignored and inferred from the type of *value*. + .. versionchanged:: 3.10 + The *etype* parameter has been renamed to *exc* and is now + positional-only. + .. function:: print_exc(limit=None, file=None, chain=True) @@ -121,18 +130,26 @@ The module defines the following functions: text line is not ``None``. -.. function:: format_exception_only(etype, value) +.. function:: format_exception_only(exc, /[, value]) + + Format the exception part of a traceback using an exception value such as + given by ``sys.last_value``. The return value is a list of strings, each + ending in a newline. Normally, the list contains a single string; however, + for :exc:`SyntaxError` exceptions, it contains several lines that (when + printed) display detailed information about where the syntax error occurred. + The message indicating which exception occurred is the always last string in + the list. - Format the exception part of a traceback. The arguments are the exception - type and value such as given by ``sys.last_type`` and ``sys.last_value``. - The return value is a list of strings, each ending in a newline. Normally, - the list contains a single string; however, for :exc:`SyntaxError` - exceptions, it contains several lines that (when printed) display detailed - information about where the syntax error occurred. The message indicating - which exception occurred is the always last string in the list. + Since Python 3.10, instead of passing *value*, an exception object + can be passed as the first argument. If *value* is provided, the first + argument is ignored in order to provide backwards compatibility. + .. versionchanged:: 3.10 + The *etype* parameter has been renamed to *exc* and is now + positional-only. -.. function:: format_exception(etype, value, tb, limit=None, chain=True) + +.. function:: format_exception(exc, /[, value, tb], limit=None, chain=True) Format a stack trace and the exception information. The arguments have the same meaning as the corresponding arguments to :func:`print_exception`. The @@ -143,6 +160,10 @@ The module defines the following functions: .. versionchanged:: 3.5 The *etype* argument is ignored and inferred from the type of *value*. + .. versionchanged:: 3.10 + This function's behavior and signature were modified to match + :func:`print_exception`. + .. function:: format_exc(limit=None, chain=True) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index bac1a2e6783094..0ed7084ccd2ff0 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -232,6 +232,15 @@ retrieve the functions set by :func:`threading.settrace` and :func:`threading.setprofile` respectively. (Contributed by Mario Corchero in :issue:`42251`.) +traceback +--------- + +The :func:`~traceback.format_exception`, +:func:`~traceback.format_exception_only`, and +:func:`~traceback.print_exception` functions can now take an exception object +as a positional-only argument. +(Contributed by Zackery Spytz and Matthias Bussonnier in :issue:`26389`.) + types ----- @@ -328,6 +337,15 @@ This section lists previously described changes and other bugfixes that may require changes to your code. +Changes in the Python API +------------------------- + +* The *etype* parameters of the :func:`~traceback.format_exception`, + :func:`~traceback.format_exception_only`, and + :func:`~traceback.print_exception` functions in the :mod:`traceback` module + have been renamed to *exc*. + (Contributed by Zackery Spytz and Matthias Bussonnier in :issue:`26389`.) + Build Changes ============= diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 730596efd8bcec..91688ff72bbea1 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -212,6 +212,26 @@ def test_print_exception(self): ) self.assertEqual(output.getvalue(), "Exception: projector\n") + def test_print_exception_exc(self): + output = StringIO() + traceback.print_exception(Exception("projector"), file=output) + self.assertEqual(output.getvalue(), "Exception: projector\n") + + def test_format_exception_exc(self): + e = Exception("projector") + output = traceback.format_exception(e) + self.assertEqual(output, ["Exception: projector\n"]) + with self.assertRaisesRegex(ValueError, 'Both or neither'): + traceback.format_exception(e.__class__, e) + with self.assertRaisesRegex(ValueError, 'Both or neither'): + traceback.format_exception(e.__class__, tb=e.__traceback__) + with self.assertRaisesRegex(TypeError, 'positional-only'): + traceback.format_exception(exc=e) + + def test_format_exception_only_exc(self): + output = traceback.format_exception_only(Exception("projector")) + self.assertEqual(output, ["Exception: projector\n"]) + class TracebackFormatTests(unittest.TestCase): diff --git a/Lib/traceback.py b/Lib/traceback.py index a19e38718b1205..d2d93c8a32ac29 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -84,7 +84,19 @@ def extract_tb(tb, limit=None): "another exception occurred:\n\n") -def print_exception(etype, value, tb, limit=None, file=None, chain=True): +_sentinel = object() + + +def _parse_value_tb(exc, value, tb): + if (value is _sentinel) != (tb is _sentinel): + raise ValueError("Both or neither of value and tb must be given") + if value is tb is _sentinel: + return exc, exc.__traceback__ + return value, tb + + +def print_exception(exc, /, value=_sentinel, tb=_sentinel, limit=None, \ + file=None, chain=True): """Print exception up to 'limit' stack trace entries from 'tb' to 'file'. This differs from print_tb() in the following ways: (1) if @@ -95,9 +107,7 @@ def print_exception(etype, value, tb, limit=None, file=None, chain=True): occurred with a caret on the next line indicating the approximate position of the error. """ - # format_exception has ignored etype for some time, and code such as cgitb - # passes in bogus values as a result. For compatibility with such code we - # ignore it here (rather than in the new TracebackException API). + value, tb = _parse_value_tb(exc, value, tb) if file is None: file = sys.stderr for line in TracebackException( @@ -105,7 +115,8 @@ def print_exception(etype, value, tb, limit=None, file=None, chain=True): print(line, file=file, end="") -def format_exception(etype, value, tb, limit=None, chain=True): +def format_exception(exc, /, value=_sentinel, tb=_sentinel, limit=None, \ + chain=True): """Format a stack trace and the exception information. The arguments have the same meaning as the corresponding arguments @@ -114,19 +125,15 @@ def format_exception(etype, value, tb, limit=None, chain=True): these lines are concatenated and printed, exactly the same text is printed as does print_exception(). """ - # format_exception has ignored etype for some time, and code such as cgitb - # passes in bogus values as a result. For compatibility with such code we - # ignore it here (rather than in the new TracebackException API). + value, tb = _parse_value_tb(exc, value, tb) return list(TracebackException( type(value), value, tb, limit=limit).format(chain=chain)) -def format_exception_only(etype, value): +def format_exception_only(exc, /, value=_sentinel): """Format the exception part of a traceback. - The arguments are the exception type and value such as given by - sys.last_type and sys.last_value. The return value is a list of - strings, each ending in a newline. + The return value is a list of strings, each ending in a newline. Normally, the list contains a single string; however, for SyntaxError exceptions, it contains several lines that (when @@ -137,7 +144,10 @@ def format_exception_only(etype, value): string in the list. """ - return list(TracebackException(etype, value, None).format_exception_only()) + if value is _sentinel: + value = exc + return list(TracebackException( + type(value), value, None).format_exception_only()) # -- not official API but folk probably use these two functions. diff --git a/Misc/NEWS.d/next/Library/2020-10-08-23-51-55.bpo-26389.uga44e.rst b/Misc/NEWS.d/next/Library/2020-10-08-23-51-55.bpo-26389.uga44e.rst new file mode 100644 index 00000000000000..a721a0d7cd0e80 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-08-23-51-55.bpo-26389.uga44e.rst @@ -0,0 +1,4 @@ +The :func:`traceback.format_exception`, +:func:`traceback.format_exception_only`, and +:func:`traceback.print_exception` functions can now take an exception object +as a positional-only argument. From 7e47a7927d45e6cbbf76fc428b061487a59a488b Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Fri, 6 Nov 2020 11:45:01 +0900 Subject: [PATCH 0481/1261] bpo-42179: Doc/tutorial: Remove mention of __cause__ (GH-23162) --- Doc/tutorial/errors.rst | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst index 0ce96466e8c286..efe44da3043c5e 100644 --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -273,15 +273,15 @@ Exception Chaining ================== The :keyword:`raise` statement allows an optional :keyword:`from` which enables -chaining exceptions by setting the ``__cause__`` attribute of the raised -exception. For example:: +chaining exceptions. For example:: - raise RuntimeError from OSError + # exc must be exception instance or None. + raise RuntimeError from exc This can be useful when you are transforming exceptions. For example:: >>> def func(): - ... raise IOError + ... raise IOError ... >>> try: ... func() @@ -297,12 +297,11 @@ This can be useful when you are transforming exceptions. For example:: Traceback (most recent call last): File "", line 4, in - RuntimeError + RuntimeError: Failed to open database -The expression following the :keyword:`from` must be either an exception or -``None``. Exception chaining happens automatically when an exception is raised -inside an exception handler or :keyword:`finally` section. Exception chaining -can be disabled by using ``from None`` idiom: +Exception chaining happens automatically when an exception is raised inside an +:keyword:`except` or :keyword:`finally` section. Exception chaining can be +disabled by using ``from None`` idiom: >>> try: ... open('database.sqlite') @@ -313,6 +312,8 @@ can be disabled by using ``from None`` idiom: File "", line 4, in RuntimeError +For more information about chaining mechanics, see :ref:`bltin-exceptions`. + .. _tut-userexceptions: From 158b61e600b82926c47677c37453a7049466b58e Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 6 Nov 2020 01:30:17 -0800 Subject: [PATCH 0482/1261] Minor grammar edits for the descriptor howto guide (GH-#23175) --- Doc/howto/descriptor.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index fedf8a8c09eac4..8c2e8d562153db 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -112,7 +112,7 @@ different, updated answers each time:: Besides showing how descriptors can run computations, this example also reveals the purpose of the parameters to :meth:`__get__`. The *self* parameter is *size*, an instance of *DirectorySize*. The *obj* parameter is -either *g* or *s*, an instance of *Directory*. It is *obj* parameter that +either *g* or *s*, an instance of *Directory*. It is the *obj* parameter that lets the :meth:`__get__` method learn the target directory. The *objtype* parameter is the class *Directory*. @@ -183,7 +183,7 @@ logged, but that the regular attribute *name* is not logged:: INFO:root:Accessing 'age' giving 40 40 -One major issue with this example is the private name *_age* is hardwired in +One major issue with this example is that the private name *_age* is hardwired in the *LoggedAgeAccess* class. That means that each instance can only have one logged attribute and that its name is unchangeable. In the next example, we'll fix that problem. @@ -192,7 +192,7 @@ we'll fix that problem. Customized names ---------------- -When a class uses descriptors, it can inform each descriptor about what +When a class uses descriptors, it can inform each descriptor about which variable name was used. In this example, the :class:`Person` class has two descriptor instances, @@ -233,7 +233,7 @@ be recorded, giving each descriptor its own *public_name* and *private_name*:: An interactive session shows that the :class:`Person` class has called :meth:`__set_name__` so that the field names would be recorded. Here -we call :func:`vars` to lookup the descriptor without triggering it:: +we call :func:`vars` to look up the descriptor without triggering it:: >>> vars(vars(Person)['name']) {'public_name': 'name', 'private_name': '_name'} @@ -614,8 +614,8 @@ Sometimes it is desirable for a descriptor to know what class variable name it was assigned to. When a new class is created, the :class:`type` metaclass scans the dictionary of the new class. If any of the entries are descriptors and if they define :meth:`__set_name__`, that method is called with two -arguments. The *owner* is the class where the descriptor is used, the *name* -is class variable the descriptor was assigned to. +arguments. The *owner* is the class where the descriptor is used, and the +*name* is the class variable the descriptor was assigned to. The implementation details are in :c:func:`type_new()` and :c:func:`set_names()` in :source:`Objects/typeobject.c`. @@ -703,7 +703,7 @@ Properties ---------- Calling :func:`property` is a succinct way of building a data descriptor that -triggers function calls upon access to an attribute. Its signature is:: +triggers a function call upon access to an attribute. Its signature is:: property(fget=None, fset=None, fdel=None, doc=None) -> property @@ -803,7 +803,7 @@ roughly equivalent to:: To support automatic creation of methods, functions include the :meth:`__get__` method for binding methods during attribute access. This -means that functions are non-data descriptors which return bound methods +means that functions are non-data descriptors that return bound methods during dotted lookup from an instance. Here's how it works:: class Function: @@ -1016,7 +1016,7 @@ attributes stored in ``__slots__``:: class Immutable: - __slots__ = ('_dept', '_name') # Replace instance dictionary + __slots__ = ('_dept', '_name') # Replace the instance dictionary def __init__(self, dept, name): self._dept = dept # Store to private attribute @@ -1086,7 +1086,7 @@ by member descriptors:: The :meth:`type.__new__` method takes care of adding member objects to class variables. The :meth:`object.__new__` method takes care of creating instances -that have slots instead of a instance dictionary. Here is a rough equivalent +that have slots instead of an instance dictionary. Here is a rough equivalent in pure Python:: class Type(type): From d0a2a94b10d59d084750c6af61e12d0d292aeeae Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Sat, 7 Nov 2020 00:04:47 +0800 Subject: [PATCH 0483/1261] bpo-41832: PyType_FromModuleAndSpec() now accepts NULL tp_doc (GH-23123) --- Doc/c-api/type.rst | 6 +++-- Doc/whatsnew/3.10.rst | 4 +++ Lib/test/test_capi.py | 3 +++ .../2020-11-03-19-47-06.bpo-41832.dL1VJJ.rst | 2 ++ Modules/_lsprof.c | 4 +-- Modules/_testcapimodule.c | 25 +++++++++++++++++++ Objects/typeobject.c | 4 +++ 7 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-03-19-47-06.bpo-41832.dL1VJJ.rst diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 73f26875d8194a..fcd92e38e2428e 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -169,6 +169,10 @@ The following functions and structs are used to create .. versionadded:: 3.9 + .. versionchanged:: 3.10 + + The function now accepts NULL ``tp_doc`` slot. + .. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) Equivalent to ``PyType_FromModuleAndSpec(NULL, spec, bases)``. @@ -259,5 +263,3 @@ The following functions and structs are used to create The desired value of the slot. In most cases, this is a pointer to a function. - - May not be ``NULL``. diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 0ed7084ccd2ff0..1e6c7c4067f3fa 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -401,6 +401,10 @@ New Features reference count of an object and return the object. (Contributed by Victor Stinner in :issue:`42262`.) +* The :c:func:`PyType_FromModuleAndSpec` function now accepts NULL ``tp_doc`` + slot. + (Contributed by Hai Shi in :issue:`41832`.) + Porting to Python 3.10 ---------------------- diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index db62b47100ad3a..a4ebe4a0a1b5cb 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -405,6 +405,9 @@ def test_heap_ctype_doc_and_text_signature(self): self.assertEqual(_testcapi.HeapDocCType.__doc__, "somedoc") self.assertEqual(_testcapi.HeapDocCType.__text_signature__, "(arg1, arg2)") + def test_null_type_doc(self): + self.assertEqual(_testcapi.NullTpDocType.__doc__, None) + def test_subclass_of_heap_gc_ctype_with_tpdealloc_decrefs_once(self): class HeapGcCTypeSubclass(_testcapi.HeapGcCType): def __init__(self): diff --git a/Misc/NEWS.d/next/C API/2020-11-03-19-47-06.bpo-41832.dL1VJJ.rst b/Misc/NEWS.d/next/C API/2020-11-03-19-47-06.bpo-41832.dL1VJJ.rst new file mode 100644 index 00000000000000..e0bce54eb93648 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-03-19-47-06.bpo-41832.dL1VJJ.rst @@ -0,0 +1,2 @@ +The :c:func:`PyType_FromModuleAndSpec` function now accepts NULL ``tp_doc`` +slot. diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index 78d464d1481d75..c32699cb8ad580 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -489,15 +489,15 @@ static PyStructSequence_Field profiler_subentry_fields[] = { static PyStructSequence_Desc profiler_entry_desc = { .name = "_lsprof.profiler_entry", - .doc = "", .fields = profiler_entry_fields, + .doc = NULL, .n_in_sequence = 6 }; static PyStructSequence_Desc profiler_subentry_desc = { .name = "_lsprof.profiler_subentry", - .doc = "", .fields = profiler_subentry_fields, + .doc = NULL, .n_in_sequence = 5 }; diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 28d2c124d51775..22d20d220d4089 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -6508,6 +6508,23 @@ static PyType_Spec HeapDocCType_spec = { HeapDocCType_slots }; +typedef struct { + PyObject_HEAD +} NullTpDocTypeObject; + +static PyType_Slot NullTpDocType_slots[] = { + {Py_tp_doc, NULL}, + {0, 0}, +}; + +static PyType_Spec NullTpDocType_spec = { + "_testcapi.NullTpDocType", + sizeof(NullTpDocTypeObject), + 0, + Py_TPFLAGS_DEFAULT, + NullTpDocType_slots +}; + PyDoc_STRVAR(heapgctype__doc__, "A heap type with GC, and with overridden dealloc.\n\n" @@ -7183,6 +7200,14 @@ PyInit__testcapi(void) } PyModule_AddObject(m, "HeapDocCType", HeapDocCType); + /* bpo-41832: Add a new type to test PyType_FromSpec() + now can accept a NULL tp_doc slot. */ + PyObject *NullTpDocType = PyType_FromSpec(&NullTpDocType_spec); + if (NullTpDocType == NULL) { + return NULL; + } + PyModule_AddObject(m, "NullTpDocType", NullTpDocType); + PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec); if (HeapGcCType == NULL) { return NULL; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 2daf374f170b02..3822b8cf813cfb 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3012,6 +3012,10 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) else if (slot->slot == Py_tp_doc) { /* For the docstring slot, which usually points to a static string literal, we need to make a copy */ + if (slot->pfunc == NULL) { + type->tp_doc = NULL; + continue; + } size_t len = strlen(slot->pfunc)+1; char *tp_doc = PyObject_MALLOC(len); if (tp_doc == NULL) { From c51db359413818cee3d0a8b7965abfa761d43224 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Fri, 6 Nov 2020 15:58:14 -0300 Subject: [PATCH 0484/1261] Remove outdated reference to pywin32 from platform module (GH-22005) --- Doc/library/platform.rst | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index 8e8e3775aaff4a..b293adf48e6e33 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -209,13 +209,6 @@ Windows Platform which means the OS version uses debugging code, i.e. code that checks arguments, ranges, etc. - .. note:: - - This function works best with Mark Hammond's - :mod:`win32all` package installed, but also on Python 2.3 and - later (support for this was added in Python 2.6). It obviously - only runs on Win32 compatible platforms. - .. function:: win32_edition() Returns a string representing the current Windows edition. Possible From f5c408cb45d7098080e1e2f738b86b0f0e43b035 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 6 Nov 2020 18:45:56 -0800 Subject: [PATCH 0485/1261] bpo-42133: update parts of the stdlib to fall back to `__spec__.loader` when `__loader__` is missing (#22929) --- Doc/whatsnew/3.10.rst | 24 +++++++++++++++++++ Lib/doctest.py | 18 ++++++++------ Lib/inspect.py | 7 ++++-- Lib/linecache.py | 11 ++++++--- Lib/site.py | 11 +++++++-- .../2020-10-23-15-47-47.bpo-42133.BzizYV.rst | 2 ++ 6 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-23-15-47-47.bpo-42133.BzizYV.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 1e6c7c4067f3fa..a735bf235435ca 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -186,6 +186,12 @@ by :func:`curses.color_content`, :func:`curses.init_color`, support is provided by the underlying ncurses library. (Contributed by Jeffrey Kintscher and Hans Petter Jansson in :issue:`36982`.) +doctest +------- + +When a module does not define ``__loader__``, fall back to ``__spec__.loader``. +(Contributed by Brett Cannon in :issue:`42133`.) + encodings --------- :func:`encodings.normalize_encoding` now ignores non-ASCII characters. @@ -198,6 +204,18 @@ Added the *root_dir* and *dir_fd* parameters in :func:`~glob.glob` and :func:`~glob.iglob` which allow to specify the root directory for searching. (Contributed by Serhiy Storchaka in :issue:`38144`.) +inspect +------- + +When a module does not define ``__loader__``, fall back to ``__spec__.loader``. +(Contributed by Brett Cannon in :issue:`42133`.) + +linecache +--------- + +When a module does not define ``__loader__``, fall back to ``__spec__.loader``. +(Contributed by Brett Cannon in :issue:`42133`.) + os -- @@ -217,6 +235,12 @@ The :mod:`shelve` module now uses :data:`pickle.DEFAULT_PROTOCOL` by default instead of :mod:`pickle` protocol ``3`` when creating shelves. (Contributed by Zackery Spytz in :issue:`34204`.) +site +---- + +When a module does not define ``__loader__``, fall back to ``__spec__.loader``. +(Contributed by Brett Cannon in :issue:`42133`.) + sys --- diff --git a/Lib/doctest.py b/Lib/doctest.py index baa503c83f8757..5bb35c9715d1e9 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -222,13 +222,17 @@ def _load_testfile(filename, package, module_relative, encoding): if module_relative: package = _normalize_module(package, 3) filename = _module_relative_path(package, filename) - if getattr(package, '__loader__', None) is not None: - if hasattr(package.__loader__, 'get_data'): - file_contents = package.__loader__.get_data(filename) - file_contents = file_contents.decode(encoding) - # get_data() opens files as 'rb', so one must do the equivalent - # conversion as universal newlines would do. - return _newline_convert(file_contents), filename + if (loader := getattr(package, '__loader__', None)) is None: + try: + loader = package.__spec__.loader + except AttributeError: + pass + if hasattr(loader, 'get_data'): + file_contents = loader.get_data(filename) + file_contents = file_contents.decode(encoding) + # get_data() opens files as 'rb', so one must do the equivalent + # conversion as universal newlines would do. + return _newline_convert(file_contents), filename with open(filename, encoding=encoding) as f: return f.read(), filename diff --git a/Lib/inspect.py b/Lib/inspect.py index ac127cbd725b9b..7412d0e837cf14 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -707,10 +707,13 @@ def getsourcefile(object): if os.path.exists(filename): return filename # only return a non-existent filename if the module has a PEP 302 loader - if getattr(getmodule(object, filename), '__loader__', None) is not None: + module = getmodule(object, filename) + if getattr(module, '__loader__', None) is not None: + return filename + elif getattr(getattr(module, "__spec__", None), "loader", None) is not None: return filename # or it is in the linecache - if filename in linecache.cache: + elif filename in linecache.cache: return filename def getabsfile(object, _filename=None): diff --git a/Lib/linecache.py b/Lib/linecache.py index fa5dbd09eab869..513b17e999880b 100644 --- a/Lib/linecache.py +++ b/Lib/linecache.py @@ -165,9 +165,14 @@ def lazycache(filename, module_globals): if not filename or (filename.startswith('<') and filename.endswith('>')): return False # Try for a __loader__, if available - if module_globals and '__loader__' in module_globals: - name = module_globals.get('__name__') - loader = module_globals['__loader__'] + if module_globals and '__name__' in module_globals: + name = module_globals['__name__'] + if (loader := module_globals.get('__loader__')) is None: + if spec := module_globals.get('__spec__'): + try: + loader = spec.loader + except AttributeError: + pass get_source = getattr(loader, 'get_source', None) if name and get_source: diff --git a/Lib/site.py b/Lib/site.py index 4d3b869fff77a0..3a0f619d71c86e 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -105,8 +105,15 @@ def makepath(*paths): def abs_paths(): """Set all module __file__ and __cached__ attributes to an absolute path""" for m in set(sys.modules.values()): - if (getattr(getattr(m, '__loader__', None), '__module__', None) not in - ('_frozen_importlib', '_frozen_importlib_external')): + loader_module = None + try: + loader_module = m.__loader__.__module__ + except AttributeError: + try: + loader_module = m.__spec__.loader.__module__ + except AttributeError: + pass + if loader_module not in {'_frozen_importlib', '_frozen_importlib_external'}: continue # don't mess with a PEP 302-supplied __file__ try: m.__file__ = os.path.abspath(m.__file__) diff --git a/Misc/NEWS.d/next/Library/2020-10-23-15-47-47.bpo-42133.BzizYV.rst b/Misc/NEWS.d/next/Library/2020-10-23-15-47-47.bpo-42133.BzizYV.rst new file mode 100644 index 00000000000000..f3cfa1a8dce338 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-23-15-47-47.bpo-42133.BzizYV.rst @@ -0,0 +1,2 @@ +Update various modules in the stdlib to fall back on `__spec__.loader` when +`__loader__` isn't defined on a module. From b947ec92b63728e8fdbae62dc2d86f478d59a9df Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Sat, 7 Nov 2020 12:28:31 +0100 Subject: [PATCH 0486/1261] bpo-41028: Doc: Move switchers to docsbuild-scripts. (GH-20969) --- Doc/Makefile | 4 +- Doc/tools/static/switchers.js | 156 ------------------ Doc/tools/templates/dummy.html | 9 + Doc/tools/templates/indexsidebar.html | 8 +- Doc/tools/templates/layout.html | 10 +- .../2020-06-18-23-37-03.bpo-41028.vM8bC8.rst | 2 + 6 files changed, 16 insertions(+), 173 deletions(-) delete mode 100644 Doc/tools/static/switchers.js create mode 100644 Misc/NEWS.d/next/Documentation/2020-06-18-23-37-03.bpo-41028.vM8bC8.rst diff --git a/Doc/Makefile b/Doc/Makefile index f653d70674eb1c..6bf1f408b56f0d 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -215,12 +215,12 @@ serve: # for development releases: always build autobuild-dev: - make dist SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1 -A switchers=1' + make dist SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' -make suspicious # for quick rebuilds (HTML only) autobuild-dev-html: - make html SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1 -A switchers=1' + make html SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' # for stable releases: only build if not in pre-release stage (alpha, beta) # release candidate downloads are okay, since the stable tree can be in that stage diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js deleted file mode 100644 index 1a1c7d0fa57e23..00000000000000 --- a/Doc/tools/static/switchers.js +++ /dev/null @@ -1,156 +0,0 @@ -(function() { - 'use strict'; - - // Parses versions in URL segments like: - // "3", "dev", "release/2.7" or "3.6rc2" - var version_regexs = [ - '(?:\\d)', - '(?:\\d\\.\\d[\\w\\d\\.]*)', - '(?:dev)', - '(?:release/\\d.\\d[\\x\\d\\.]*)']; - - var all_versions = { - '3.10': 'dev (3.10)', - '3.9': 'pre (3.9)', - '3.8': '3.8', - '3.7': '3.7', - '3.6': '3.6', - '2.7': '2.7', - }; - - var all_languages = { - 'en': 'English', - 'fr': 'French', - 'ja': 'Japanese', - 'ko': 'Korean', - 'pt-br': 'Brazilian Portuguese', - 'zh-cn': 'Simplified Chinese', - }; - - function build_version_select(current_version, current_release) { - var buf = [''); - return buf.join(''); - } - - function build_language_select(current_language) { - var buf = [''); - return buf.join(''); - } - - function navigate_to_first_existing(urls) { - // Navigate to the first existing URL in urls. - var url = urls.shift(); - if (urls.length == 0) { - window.location.href = url; - return; - } - $.ajax({ - url: url, - success: function() { - window.location.href = url; - }, - error: function() { - navigate_to_first_existing(urls); - } - }); - } - - function on_version_switch() { - var selected_version = $(this).children('option:selected').attr('value') + '/'; - var url = window.location.href; - var current_language = language_segment_from_url(url); - var current_version = version_segment_in_url(url); - var new_url = url.replace('.org/' + current_language + current_version, - '.org/' + current_language + selected_version); - if (new_url != url) { - navigate_to_first_existing([ - new_url, - url.replace('.org/' + current_language + current_version, - '.org/' + selected_version), - 'https://docs.python.org/' + current_language + selected_version, - 'https://docs.python.org/' + selected_version, - 'https://docs.python.org/' - ]); - } - } - - function on_language_switch() { - var selected_language = $(this).children('option:selected').attr('value') + '/'; - var url = window.location.href; - var current_language = language_segment_from_url(url); - var current_version = version_segment_in_url(url); - if (selected_language == 'en/') // Special 'default' case for english. - selected_language = ''; - var new_url = url.replace('.org/' + current_language + current_version, - '.org/' + selected_language + current_version); - if (new_url != url) { - navigate_to_first_existing([ - new_url, - 'https://docs.python.org/' - ]); - } - } - - // Returns the path segment of the language as a string, like 'fr/' - // or '' if not found. - function language_segment_from_url(url) { - var language_regexp = '\.org/([a-z]{2}(?:-[a-z]{2})?/)'; - var match = url.match(language_regexp); - if (match !== null) - return match[1]; - return ''; - } - - // Returns the path segment of the version as a string, like '3.6/' - // or '' if not found. - function version_segment_in_url(url) { - var language_segment = '(?:[a-z]{2}(?:-[a-z]{2})?/)'; - var version_segment = '(?:(?:' + version_regexs.join('|') + ')/)'; - var version_regexp = '\\.org/' + language_segment + '?(' + version_segment + ')'; - var match = url.match(version_regexp); - if (match !== null) - return match[1]; - return '' - } - - $(document).ready(function() { - var release = DOCUMENTATION_OPTIONS.VERSION; - var language_segment = language_segment_from_url(window.location.href); - var current_language = language_segment.replace(/\/+$/g, '') || 'en'; - var version = release.substr(0, 3); - var version_select = build_version_select(version, release); - - $('.version_switcher_placeholder').html(version_select); - $('.version_switcher_placeholder select').bind('change', on_version_switch); - - var language_select = build_language_select(current_language); - - $('.language_switcher_placeholder').html(language_select); - $('.language_switcher_placeholder select').bind('change', on_language_switch); - }); -})(); diff --git a/Doc/tools/templates/dummy.html b/Doc/tools/templates/dummy.html index 68ae3ad148ec27..3438b44377fcb9 100644 --- a/Doc/tools/templates/dummy.html +++ b/Doc/tools/templates/dummy.html @@ -6,3 +6,12 @@ {% trans %}CPython implementation detail:{% endtrans %} {% trans %}Deprecated since version {deprecated}, will be removed in version {removed}{% endtrans %} {% trans %}Deprecated since version {deprecated}, removed in version {removed}{% endtrans %} + + +In docsbuild-scripts, when rewriting indexsidebar.html with actual versions: + +{% trans %}in development{% endtrans %} +{% trans %}pre-release{% endtrans %} +{% trans %}stable{% endtrans %} +{% trans %}security-fixes{% endtrans %} +{% trans %}EOL{% endtrans %} diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index 1c1cb5484a4f67..f7bf6d8e491172 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -2,12 +2,8 @@

    {% trans %}Download{% endtrans %}

    {% trans %}Download these documents{% endtrans %}

    {% trans %}Docs by version{% endtrans %}

    diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index 17592d74a4eb52..98ccf4224804b2 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -12,22 +12,14 @@ {% block rootrellink %} {{ super() }} -
  • - {%- if switchers is defined %} - {{ language or 'en' }} - {{ release }} - {% trans %}Documentation {% endtrans %}{{ reldelim1 }} - {%- else %} +
  • {{ shorttitle }}{{ reldelim1 }} - {%- endif %}
  • {% endblock %} {% block extrahead %} {% if builder != "htmlhelp" %} - {% if switchers is defined and not embedded %} - {% endif %} {% if pagename == 'whatsnew/changelog' and not embedded %} {% endif %} {% endif %} diff --git a/Misc/NEWS.d/next/Documentation/2020-06-18-23-37-03.bpo-41028.vM8bC8.rst b/Misc/NEWS.d/next/Documentation/2020-06-18-23-37-03.bpo-41028.vM8bC8.rst new file mode 100644 index 00000000000000..5fc4155b55346b --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-06-18-23-37-03.bpo-41028.vM8bC8.rst @@ -0,0 +1,2 @@ +Language and version switchers, previously maintained in every cpython +branches, are now handled by docsbuild-script. From e2ff8e01b2e6a2f319816089647b92056174c4dd Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sat, 7 Nov 2020 22:35:17 +1000 Subject: [PATCH 0487/1261] bpo-42282: Fold constants inside named expressions (GH-23190) * The AST optimiser wasn't descending into named expressions, so any constant subexpressions weren't being folded at compile time * Remove "default:" clauses inside the AST optimiser code to reduce the risk of similar bugs passing unnoticed in future compiler changes --- .../2020-11-07-21-02-05.bpo-42282.M1W4Wj.rst | 3 ++ Python/ast_opt.c | 54 +++++++++++++++---- 2 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-07-21-02-05.bpo-42282.M1W4Wj.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-07-21-02-05.bpo-42282.M1W4Wj.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-07-21-02-05.bpo-42282.M1W4Wj.rst new file mode 100644 index 00000000000000..74f5c3362385c9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-07-21-02-05.bpo-42282.M1W4Wj.rst @@ -0,0 +1,3 @@ +Optimise constant subexpressions that appear as part of named expressions +(previously the AST optimiser did not descend into named expressions). +Patch by Nick Coghlan. diff --git a/Python/ast_opt.c b/Python/ast_opt.c index 22ca6f23aefa30..8c958ca7f13763 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -7,6 +7,8 @@ static int make_const(expr_ty node, PyObject *val, PyArena *arena) { + // Even if no new value was calculated, make_const may still + // need to clear an error (e.g. for division by zero) if (val == NULL) { if (PyErr_ExceptionMatches(PyExc_KeyboardInterrupt)) { return 0; @@ -49,7 +51,7 @@ fold_unaryop(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) of !=. Detecting such cases doesn't seem worthwhile. Python uses for 'is subset'/'is superset' operations on sets. They don't satisfy not folding laws. */ - int op = asdl_seq_GET(arg->v.Compare.ops, 0); + cmpop_ty op = asdl_seq_GET(arg->v.Compare.ops, 0); switch (op) { case Is: op = IsNot; @@ -63,8 +65,17 @@ fold_unaryop(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) case NotIn: op = In; break; - default: - op = 0; + // The remaining comparison operators can't be safely inverted + case Eq: + case NotEq: + case Lt: + case LtE: + case Gt: + case GtE: + op = 0; // The AST enums leave "0" free as an "unused" marker + break; + // No default case, so the compiler will emit a warning if new + // comparison operators are added without being handled here } if (op) { asdl_seq_SET(arg->v.Compare.ops, 0, op); @@ -224,7 +235,7 @@ fold_binop(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) PyObject *lv = lhs->v.Constant.value; PyObject *rv = rhs->v.Constant.value; - PyObject *newval; + PyObject *newval = NULL; switch (node->v.BinOp.op) { case Add: @@ -263,8 +274,11 @@ fold_binop(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) case BitAnd: newval = PyNumber_And(lv, rv); break; - default: // Unknown operator + // No builtin constants implement the following operators + case MatMult: return 1; + // No default case, so the compiler will emit a warning if new binary + // operators are added without being handled here } return make_const(node, newval, arena); @@ -457,8 +471,11 @@ astfold_mod(mod_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) case Expression_kind: CALL(astfold_expr, expr_ty, node_->v.Expression.body); break; - default: + // The following top level nodes don't participate in constant folding + case FunctionType_kind: break; + // No default case, so the compiler will emit a warning if new top level + // compilation nodes are added without being handled here } return 1; } @@ -567,8 +584,14 @@ astfold_expr(expr_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) return make_const(node_, PyBool_FromLong(!state->optimize), ctx_); } break; - default: + case NamedExpr_kind: + CALL(astfold_expr, expr_ty, node_->v.NamedExpr.value); + break; + case Constant_kind: + // Already a constant, nothing further to do break; + // No default case, so the compiler will emit a warning if new expression + // kinds are added without being handled here } return 1; } @@ -686,8 +709,17 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) case Expr_kind: CALL(astfold_expr, expr_ty, node_->v.Expr.value); break; - default: - break; + // The following statements don't contain any subexpressions to be folded + case Import_kind: + case ImportFrom_kind: + case Global_kind: + case Nonlocal_kind: + case Pass_kind: + case Break_kind: + case Continue_kind: + break; + // No default case, so the compiler will emit a warning if new statement + // kinds are added without being handled here } return 1; } @@ -700,8 +732,8 @@ astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, _PyASTOptimizeState CALL_OPT(astfold_expr, expr_ty, node_->v.ExceptHandler.type); CALL_SEQ(astfold_stmt, stmt, node_->v.ExceptHandler.body); break; - default: - break; + // No default case, so the compiler will emit a warning if new handler + // kinds are added without being handled here } return 1; } From b03ee0ef11038260a52a10fecec4acf00d46f9ad Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Sat, 7 Nov 2020 20:18:37 +0100 Subject: [PATCH 0488/1261] bpo-40077: Convert _queuemodule to use heap types (GH-23136) @vstinner / @corona10, would you mind reviewing this? --- .../2020-11-03-21-58-27.bpo-40077.a9qM1j.rst | 1 + Modules/_queuemodule.c | 184 +++++++++++------- Modules/clinic/_queuemodule.c.h | 58 +++--- 3 files changed, 138 insertions(+), 105 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-03-21-58-27.bpo-40077.a9qM1j.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-03-21-58-27.bpo-40077.a9qM1j.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-03-21-58-27.bpo-40077.a9qM1j.rst new file mode 100644 index 00000000000000..369ba6b63ce2b9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-03-21-58-27.bpo-40077.a9qM1j.rst @@ -0,0 +1 @@ +Convert :mod:`queue` to use heap types. diff --git a/Modules/_queuemodule.c b/Modules/_queuemodule.c index b155ea942398b4..7cf73992795c6b 100644 --- a/Modules/_queuemodule.c +++ b/Modules/_queuemodule.c @@ -1,16 +1,22 @@ #include "Python.h" +#include "structmember.h" // PyMemberDef #include // offsetof() -/*[clinic input] -module _queue -class _queue.SimpleQueue "simplequeueobject *" "&PySimpleQueueType" -[clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=cf49af81bcbbbea6]*/ - -static PyTypeObject PySimpleQueueType; /* forward decl */ - -static PyObject *EmptyError; +typedef struct { + PyTypeObject *SimpleQueueType; + PyObject *EmptyError; +} simplequeue_state; +static simplequeue_state * +simplequeue_get_state(PyObject *module) +{ + simplequeue_state *state = PyModule_GetState(module); + assert(state); + return state; +} +static struct PyModuleDef queuemodule; +#define simplequeue_get_state_by_type(tp) \ + (simplequeue_get_state(_PyType_GetModuleByDef(type, &queuemodule))) typedef struct { PyObject_HEAD @@ -21,10 +27,17 @@ typedef struct { PyObject *weakreflist; } simplequeueobject; +/*[clinic input] +module _queue +class _queue.SimpleQueue "simplequeueobject *" "simplequeue_get_state_by_type(type)->SimpleQueueType" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=0a4023fe4d198c8d]*/ static void simplequeue_dealloc(simplequeueobject *self) { + PyTypeObject *tp = Py_TYPE(self); + PyObject_GC_UnTrack(self); if (self->lock != NULL) { /* Unlock the lock so it's safe to free it */ @@ -36,6 +49,7 @@ simplequeue_dealloc(simplequeueobject *self) if (self->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) self); Py_TYPE(self)->tp_free(self); + Py_DECREF(tp); } static int @@ -155,6 +169,9 @@ simplequeue_pop_item(simplequeueobject *self) /*[clinic input] _queue.SimpleQueue.get + + cls: defining_class + / block: bool = True timeout: object = None @@ -171,9 +188,9 @@ in that case). [clinic start generated code]*/ static PyObject * -_queue_SimpleQueue_get_impl(simplequeueobject *self, int block, - PyObject *timeout) -/*[clinic end generated code: output=ec82a7157dcccd1a input=4bf691f9f01fa297]*/ +_queue_SimpleQueue_get_impl(simplequeueobject *self, PyTypeObject *cls, + int block, PyObject *timeout) +/*[clinic end generated code: output=1969aefa7db63666 input=5fc4d56b9a54757e]*/ { _PyTime_t endtime = 0; _PyTime_t timeout_val; @@ -225,8 +242,10 @@ _queue_SimpleQueue_get_impl(simplequeueobject *self, int block, return NULL; } if (r == PY_LOCK_FAILURE) { + PyObject *module = PyType_GetModule(cls); + simplequeue_state *state = simplequeue_get_state(module); /* Timed out */ - PyErr_SetNone(EmptyError); + PyErr_SetNone(state->EmptyError); return NULL; } self->locked = 1; @@ -251,6 +270,9 @@ _queue_SimpleQueue_get_impl(simplequeueobject *self, int block, /*[clinic input] _queue.SimpleQueue.get_nowait + cls: defining_class + / + Remove and return an item from the queue without blocking. Only get an item if one is immediately available. Otherwise @@ -258,10 +280,11 @@ raise the Empty exception. [clinic start generated code]*/ static PyObject * -_queue_SimpleQueue_get_nowait_impl(simplequeueobject *self) -/*[clinic end generated code: output=a89731a75dbe4937 input=6fe5102db540a1b9]*/ +_queue_SimpleQueue_get_nowait_impl(simplequeueobject *self, + PyTypeObject *cls) +/*[clinic end generated code: output=620c58e2750f8b8a input=842f732bf04216d3]*/ { - return _queue_SimpleQueue_get_impl(self, 0, Py_None); + return _queue_SimpleQueue_get_impl(self, cls, 0, Py_None); } /*[clinic input] @@ -290,6 +313,29 @@ _queue_SimpleQueue_qsize_impl(simplequeueobject *self) return PyList_GET_SIZE(self->lst) - self->lst_pos; } +static int +queue_traverse(PyObject *m, visitproc visit, void *arg) +{ + simplequeue_state *state = simplequeue_get_state(m); + Py_VISIT(state->SimpleQueueType); + Py_VISIT(state->EmptyError); + return 0; +} + +static int +queue_clear(PyObject *m) +{ + simplequeue_state *state = simplequeue_get_state(m); + Py_CLEAR(state->SimpleQueueType); + Py_CLEAR(state->EmptyError); + return 0; +} + +static void +queue_free(void *m) +{ + queue_clear((PyObject *)m); +} #include "clinic/_queuemodule.c.h" @@ -306,48 +352,26 @@ static PyMethodDef simplequeue_methods[] = { {NULL, NULL} /* sentinel */ }; +static struct PyMemberDef simplequeue_members[] = { + {"__weaklistoffset__", T_PYSSIZET, offsetof(simplequeueobject, weakreflist), READONLY}, + {NULL}, +}; + +static PyType_Slot simplequeue_slots[] = { + {Py_tp_dealloc, simplequeue_dealloc}, + {Py_tp_doc, (void *)simplequeue_new__doc__}, + {Py_tp_traverse, simplequeue_traverse}, + {Py_tp_members, simplequeue_members}, + {Py_tp_methods, simplequeue_methods}, + {Py_tp_new, simplequeue_new}, + {0, NULL}, +}; -static PyTypeObject PySimpleQueueType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_queue.SimpleQueue", /*tp_name*/ - sizeof(simplequeueobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)simplequeue_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - simplequeue_new__doc__, /*tp_doc*/ - (traverseproc)simplequeue_traverse, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - offsetof(simplequeueobject, weakreflist), /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - simplequeue_methods, /*tp_methods*/ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - simplequeue_new /* tp_new */ +static PyType_Spec simplequeue_spec = { + .name = "_queue.SimpleQueue", + .basicsize = sizeof(simplequeueobject), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + .slots = simplequeue_slots, }; @@ -358,15 +382,13 @@ PyDoc_STRVAR(queue_module_doc, This module is an implementation detail, please do not use it directly."); static struct PyModuleDef queuemodule = { - PyModuleDef_HEAD_INIT, - "_queue", - queue_module_doc, - -1, - NULL, - NULL, - NULL, - NULL, - NULL + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "_queue", + .m_doc = queue_module_doc, + .m_size = sizeof(simplequeue_state), + .m_traverse = queue_traverse, + .m_clear = queue_clear, + .m_free = queue_free, }; @@ -374,26 +396,40 @@ PyMODINIT_FUNC PyInit__queue(void) { PyObject *m; + simplequeue_state *state; /* Create the module */ m = PyModule_Create(&queuemodule); if (m == NULL) return NULL; - EmptyError = PyErr_NewExceptionWithDoc( + state = simplequeue_get_state(m); + state->EmptyError = PyErr_NewExceptionWithDoc( "_queue.Empty", "Exception raised by Queue.get(block=0)/get_nowait().", NULL, NULL); - if (EmptyError == NULL) - return NULL; + if (state->EmptyError == NULL) + goto error; - Py_INCREF(EmptyError); - if (PyModule_AddObject(m, "Empty", EmptyError) < 0) - return NULL; + Py_INCREF(state->EmptyError); + if (PyModule_AddObject(m, "Empty", state->EmptyError) < 0) { + Py_DECREF(state->EmptyError); + goto error; + } - if (PyModule_AddType(m, &PySimpleQueueType) < 0) { - return NULL; + state->SimpleQueueType = (PyTypeObject *)PyType_FromModuleAndSpec(m, + &simplequeue_spec, + NULL); + if (state->SimpleQueueType == NULL) { + goto error; + } + if (PyModule_AddType(m, state->SimpleQueueType) < 0) { + goto error; } return m; + +error: + Py_DECREF(m); + return NULL; } diff --git a/Modules/clinic/_queuemodule.c.h b/Modules/clinic/_queuemodule.c.h index c25eacf08bc843..8741f7d9aff881 100644 --- a/Modules/clinic/_queuemodule.c.h +++ b/Modules/clinic/_queuemodule.c.h @@ -16,11 +16,11 @@ simplequeue_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; - if ((type == &PySimpleQueueType) && + if ((type == simplequeue_get_state_by_type(type)->SimpleQueueType) && !_PyArg_NoPositional("SimpleQueue", args)) { goto exit; } - if ((type == &PySimpleQueueType) && + if ((type == simplequeue_get_state_by_type(type)->SimpleQueueType) && !_PyArg_NoKeywords("SimpleQueue", kwargs)) { goto exit; } @@ -133,42 +133,26 @@ PyDoc_STRVAR(_queue_SimpleQueue_get__doc__, "in that case)."); #define _QUEUE_SIMPLEQUEUE_GET_METHODDEF \ - {"get", (PyCFunction)(void(*)(void))_queue_SimpleQueue_get, METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_get__doc__}, + {"get", (PyCFunction)(void(*)(void))_queue_SimpleQueue_get, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_get__doc__}, static PyObject * -_queue_SimpleQueue_get_impl(simplequeueobject *self, int block, - PyObject *timeout); +_queue_SimpleQueue_get_impl(simplequeueobject *self, PyTypeObject *cls, + int block, PyObject *timeout); static PyObject * -_queue_SimpleQueue_get(simplequeueobject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_queue_SimpleQueue_get(simplequeueobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"block", "timeout", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "get", 0}; - PyObject *argsbuf[2]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + static _PyArg_Parser _parser = {"|pO:get", _keywords, 0}; int block = 1; PyObject *timeout = Py_None; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); - if (!args) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &block, &timeout)) { goto exit; } - if (!noptargs) { - goto skip_optional_pos; - } - if (args[0]) { - block = PyObject_IsTrue(args[0]); - if (block < 0) { - goto exit; - } - if (!--noptargs) { - goto skip_optional_pos; - } - } - timeout = args[1]; -skip_optional_pos: - return_value = _queue_SimpleQueue_get_impl(self, block, timeout); + return_value = _queue_SimpleQueue_get_impl(self, cls, block, timeout); exit: return return_value; @@ -184,15 +168,27 @@ PyDoc_STRVAR(_queue_SimpleQueue_get_nowait__doc__, "raise the Empty exception."); #define _QUEUE_SIMPLEQUEUE_GET_NOWAIT_METHODDEF \ - {"get_nowait", (PyCFunction)_queue_SimpleQueue_get_nowait, METH_NOARGS, _queue_SimpleQueue_get_nowait__doc__}, + {"get_nowait", (PyCFunction)(void(*)(void))_queue_SimpleQueue_get_nowait, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_get_nowait__doc__}, static PyObject * -_queue_SimpleQueue_get_nowait_impl(simplequeueobject *self); +_queue_SimpleQueue_get_nowait_impl(simplequeueobject *self, + PyTypeObject *cls); static PyObject * -_queue_SimpleQueue_get_nowait(simplequeueobject *self, PyObject *Py_UNUSED(ignored)) +_queue_SimpleQueue_get_nowait(simplequeueobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _queue_SimpleQueue_get_nowait_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":get_nowait", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _queue_SimpleQueue_get_nowait_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(_queue_SimpleQueue_empty__doc__, @@ -250,4 +246,4 @@ _queue_SimpleQueue_qsize(simplequeueobject *self, PyObject *Py_UNUSED(ignored)) exit: return return_value; } -/*[clinic end generated code: output=b4717e2974cbc909 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ce56b46fac150909 input=a9049054013a1b77]*/ From 5be882638f0f5dfb340a20443625c612398f87e2 Mon Sep 17 00:00:00 2001 From: Don Kirkby Date: Sun, 8 Nov 2020 01:01:23 -0800 Subject: [PATCH 0489/1261] Minor wording change in concurrent.futures. (GH-23194) Fixes a grammar problem by adding a missing "as", and clarifies the wording of the valid ranges for max_workers. --- Doc/library/concurrent.futures.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 675a9ffdd0711a..61d6c1143cfdd5 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -236,9 +236,9 @@ to a :class:`ProcessPoolExecutor` will result in deadlock. An :class:`Executor` subclass that executes calls asynchronously using a pool of at most *max_workers* processes. If *max_workers* is ``None`` or not given, it will default to the number of processors on the machine. - If *max_workers* is lower or equal to ``0``, then a :exc:`ValueError` + If *max_workers* is less than or equal to ``0``, then a :exc:`ValueError` will be raised. - On Windows, *max_workers* must be equal or lower than ``61``. If it is not + On Windows, *max_workers* must be less than or equal to ``61``. If it is not then :exc:`ValueError` will be raised. If *max_workers* is ``None``, then the default chosen will be at most ``61``, even if more processors are available. @@ -250,7 +250,7 @@ to a :class:`ProcessPoolExecutor` will result in deadlock. each worker process; *initargs* is a tuple of arguments passed to the initializer. Should *initializer* raise an exception, all currently pending jobs will raise a :exc:`~concurrent.futures.process.BrokenProcessPool`, - as well any attempt to submit more jobs to the pool. + as well as any attempt to submit more jobs to the pool. .. versionchanged:: 3.3 When one of the worker processes terminates abruptly, a From 460ba1796d3884a56be5ad3f316c2eeadf35b945 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sun, 8 Nov 2020 10:05:27 +0100 Subject: [PATCH 0490/1261] bpo-41100: Support macOS 11 and Apple Silicon (GH-22855) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Lawrence D’Anna * Add support for macOS 11 and Apple Silicon (aka arm64) As a side effect of this work use the system copy of libffi on macOS, and remove the vendored copy * Support building on recent versions of macOS while deploying to older versions This allows building installers on macOS 11 while still supporting macOS 10.9. --- Lib/_osx_support.py | 44 +- Lib/ctypes/macholib/dyld.py | 12 + Lib/ctypes/test/test_macholib.py | 15 +- Lib/distutils/tests/test_build_ext.py | 2 +- Lib/test/test_bytes.py | 1 + Lib/test/test_platform.py | 2 +- Lib/test/test_posix.py | 228 +++++ Lib/test/test_time.py | 30 + Lib/test/test_unicode.py | 2 + Mac/BuildScript/build-installer.py | 30 +- Mac/BuildScript/openssl-mac-arm64.patch | 41 + Mac/README.rst | 37 + Mac/Tools/pythonw.c | 12 +- .../2020-11-01-16-40-23.bpo-41100.BApztP.rst | 8 + Modules/_ctypes/callbacks.c | 39 +- Modules/_ctypes/callproc.c | 127 ++- Modules/_ctypes/ctypes.h | 8 + Modules/_ctypes/malloc_closure.c | 15 +- Modules/getpath.c | 4 - Modules/posixmodule.c | 822 ++++++++++++++---- Modules/timemodule.c | 214 +++-- Python/bootstrap_hash.c | 42 +- Python/pytime.c | 31 +- configure | 45 +- configure.ac | 24 +- pyconfig.h.in | 3 + setup.py | 94 +- 27 files changed, 1587 insertions(+), 345 deletions(-) create mode 100644 Mac/BuildScript/openssl-mac-arm64.patch create mode 100644 Misc/NEWS.d/next/macOS/2020-11-01-16-40-23.bpo-41100.BApztP.rst diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py index e9efce7d7ed5bd..8a696ee9895e9b 100644 --- a/Lib/_osx_support.py +++ b/Lib/_osx_support.py @@ -110,6 +110,26 @@ def _get_system_version(): return _SYSTEM_VERSION +_SYSTEM_VERSION_TUPLE = None +def _get_system_version_tuple(): + """ + Return the macOS system version as a tuple + + The return value is safe to use to compare + two version numbers. + """ + global _SYSTEM_VERSION_TUPLE + if _SYSTEM_VERSION_TUPLE is None: + osx_version = _get_system_version() + if osx_version: + try: + _SYSTEM_VERSION_TUPLE = tuple(int(i) for i in osx_version.split('.')) + except ValueError: + _SYSTEM_VERSION_TUPLE = () + + return _SYSTEM_VERSION_TUPLE + + def _remove_original_values(_config_vars): """Remove original unmodified values for testing""" # This is needed for higher-level cross-platform tests of get_platform. @@ -132,14 +152,18 @@ def _supports_universal_builds(): # builds, in particular -isysroot and -arch arguments to the compiler. This # is in support of allowing 10.4 universal builds to run on 10.3.x systems. - osx_version = _get_system_version() - if osx_version: - try: - osx_version = tuple(int(i) for i in osx_version.split('.')) - except ValueError: - osx_version = '' + osx_version = _get_system_version_tuple() return bool(osx_version >= (10, 4)) if osx_version else False +def _supports_arm64_builds(): + """Returns True if arm64 builds are supported on this system""" + # There are two sets of systems supporting macOS/arm64 builds: + # 1. macOS 11 and later, unconditionally + # 2. macOS 10.15 with Xcode 12.2 or later + # For now the second category is ignored. + osx_version = _get_system_version_tuple() + return osx_version >= (11, 0) if osx_version else False + def _find_appropriate_compiler(_config_vars): """Find appropriate C compiler for extension module builds""" @@ -331,6 +355,12 @@ def compiler_fixup(compiler_so, cc_args): except ValueError: break + elif not _supports_arm64_builds(): + # Look for "-arch arm64" and drop that + for idx in range(len(compiler_so)): + if compiler_so[idx] == '-arch' and compiler_so[idx+1] == "arm64": + del compiler_so[idx:idx+2] + if 'ARCHFLAGS' in os.environ and not stripArch: # User specified different -arch flags in the environ, # see also distutils.sysconfig @@ -481,6 +511,8 @@ def get_platform_osx(_config_vars, osname, release, machine): if len(archs) == 1: machine = archs[0] + elif archs == ('arm64', 'x86_64'): + machine = 'universal2' elif archs == ('i386', 'ppc'): machine = 'fat' elif archs == ('i386', 'x86_64'): diff --git a/Lib/ctypes/macholib/dyld.py b/Lib/ctypes/macholib/dyld.py index 9d86b058765a3e..1c3f8fd38b0665 100644 --- a/Lib/ctypes/macholib/dyld.py +++ b/Lib/ctypes/macholib/dyld.py @@ -6,6 +6,11 @@ from ctypes.macholib.framework import framework_info from ctypes.macholib.dylib import dylib_info from itertools import * +try: + from _ctypes import _dyld_shared_cache_contains_path +except ImportError: + def _dyld_shared_cache_contains_path(*args): + raise NotImplementedError __all__ = [ 'dyld_find', 'framework_find', @@ -122,8 +127,15 @@ def dyld_find(name, executable_path=None, env=None): dyld_executable_path_search(name, executable_path), dyld_default_search(name, env), ), env): + if os.path.isfile(path): return path + try: + if _dyld_shared_cache_contains_path(path): + return path + except NotImplementedError: + pass + raise ValueError("dylib %s could not be found" % (name,)) def framework_find(fn, executable_path=None, env=None): diff --git a/Lib/ctypes/test/test_macholib.py b/Lib/ctypes/test/test_macholib.py index 6b3526951acfab..a1bac26a7df058 100644 --- a/Lib/ctypes/test/test_macholib.py +++ b/Lib/ctypes/test/test_macholib.py @@ -45,19 +45,22 @@ def find_lib(name): class MachOTest(unittest.TestCase): @unittest.skipUnless(sys.platform == "darwin", 'OSX-specific test') def test_find(self): - - self.assertEqual(find_lib('pthread'), - '/usr/lib/libSystem.B.dylib') + # On Mac OS 11, system dylibs are only present in the shared cache, + # so symlinks like libpthread.dylib -> libSystem.B.dylib will not + # be resolved by dyld_find + self.assertIn(find_lib('pthread'), + ('/usr/lib/libSystem.B.dylib', '/usr/lib/libpthread.dylib')) result = find_lib('z') # Issue #21093: dyld default search path includes $HOME/lib and # /usr/local/lib before /usr/lib, which caused test failures if # a local copy of libz exists in one of them. Now ignore the head # of the path. - self.assertRegex(result, r".*/lib/libz\..*.*\.dylib") + self.assertRegex(result, r".*/lib/libz.*\.dylib") - self.assertEqual(find_lib('IOKit'), - '/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit') + self.assertIn(find_lib('IOKit'), + ('/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit', + '/System/Library/Frameworks/IOKit.framework/IOKit')) if __name__ == "__main__": unittest.main() diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py index f9e0d766d870e0..6bb009a86f41eb 100644 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -493,7 +493,7 @@ def _try_compile_deployment_target(self, operator, target): # format the target value as defined in the Apple # Availability Macros. We can't use the macro names since # at least one value we test with will not exist yet. - if target[1] < 10: + if target[:2] < (10, 10): # for 10.1 through 10.9.x -> "10n0" target = '%02d%01d0' % target else: diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index e61228d1a266f9..d550abfc65640d 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -1036,6 +1036,7 @@ def test_from_format(self): c_char_p) PyBytes_FromFormat = pythonapi.PyBytes_FromFormat + PyBytes_FromFormat.argtypes = (c_char_p,) PyBytes_FromFormat.restype = py_object # basic tests diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index b5d21e54610e3d..9b6d93cb5fcda4 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -246,7 +246,7 @@ def test_mac_ver(self): self.assertEqual(res[1], ('', '', '')) if sys.byteorder == 'little': - self.assertIn(res[2], ('i386', 'x86_64')) + self.assertIn(res[2], ('i386', 'x86_64', 'arm64')) else: self.assertEqual(res[2], 'PowerPC') diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index f57c88234b5fed..a522717751ac17 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1925,6 +1925,233 @@ def test_posix_spawnp(self): assert_python_ok(*args, PATH=path) +@unittest.skipUnless(sys.platform == "darwin", "test weak linking on macOS") +class TestPosixWeaklinking(unittest.TestCase): + # These test cases verify that weak linking support on macOS works + # as expected. These cases only test new behaviour introduced by weak linking, + # regular behaviour is tested by the normal test cases. + # + # See the section on Weak Linking in Mac/README.txt for more information. + def setUp(self): + import sysconfig + import platform + + config_vars = sysconfig.get_config_vars() + self.available = { nm for nm in config_vars if nm.startswith("HAVE_") and config_vars[nm] } + self.mac_ver = tuple(int(part) for part in platform.mac_ver()[0].split(".")) + + def _verify_available(self, name): + if name not in self.available: + raise unittest.SkipTest(f"{name} not weak-linked") + + def test_pwritev(self): + self._verify_available("HAVE_PWRITEV") + if self.mac_ver >= (10, 16): + self.assertTrue(hasattr(os, "pwritev"), "os.pwritev is not available") + self.assertTrue(hasattr(os, "preadv"), "os.readv is not available") + + else: + self.assertFalse(hasattr(os, "pwritev"), "os.pwritev is available") + self.assertFalse(hasattr(os, "preadv"), "os.readv is available") + + def test_stat(self): + self._verify_available("HAVE_FSTATAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_FSTATAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_FSTATAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.stat("file", dir_fd=0) + + def test_access(self): + self._verify_available("HAVE_FACCESSAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_FACCESSAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_FACCESSAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.access("file", os.R_OK, dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "follow_symlinks unavailable"): + os.access("file", os.R_OK, follow_symlinks=False) + + with self.assertRaisesRegex(NotImplementedError, "effective_ids unavailable"): + os.access("file", os.R_OK, effective_ids=True) + + def test_chmod(self): + self._verify_available("HAVE_FCHMODAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_FCHMODAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_FCHMODAT", posix._have_functions) + self.assertIn("HAVE_LCHMOD", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.chmod("file", 0o644, dir_fd=0) + + def test_chown(self): + self._verify_available("HAVE_FCHOWNAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_FCHOWNAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_FCHOWNAT", posix._have_functions) + self.assertIn("HAVE_LCHOWN", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.chown("file", 0, 0, dir_fd=0) + + def test_link(self): + self._verify_available("HAVE_LINKAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_LINKAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_LINKAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd unavailable"): + os.link("source", "target", src_dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "dst_dir_fd unavailable"): + os.link("source", "target", dst_dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd unavailable"): + os.link("source", "target", src_dir_fd=0, dst_dir_fd=0) + + # issue 41355: !HAVE_LINKAT code path ignores the follow_symlinks flag + with os_helper.temp_dir() as base_path: + link_path = os.path.join(base_path, "link") + target_path = os.path.join(base_path, "target") + source_path = os.path.join(base_path, "source") + + with open(source_path, "w") as fp: + fp.write("data") + + os.symlink("target", link_path) + + # Calling os.link should fail in the link(2) call, and + # should not reject *follow_symlinks* (to match the + # behaviour you'd get when building on a platform without + # linkat) + with self.assertRaises(FileExistsError): + os.link(source_path, link_path, follow_symlinks=True) + + with self.assertRaises(FileExistsError): + os.link(source_path, link_path, follow_symlinks=False) + + + def test_listdir_scandir(self): + self._verify_available("HAVE_FDOPENDIR") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_FDOPENDIR", posix._have_functions) + + else: + self.assertNotIn("HAVE_FDOPENDIR", posix._have_functions) + + with self.assertRaisesRegex(TypeError, "listdir: path should be string, bytes, os.PathLike or None, not int"): + os.listdir(0) + + with self.assertRaisesRegex(TypeError, "scandir: path should be string, bytes, os.PathLike or None, not int"): + os.scandir(0) + + def test_mkdir(self): + self._verify_available("HAVE_MKDIRAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_MKDIRAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_MKDIRAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.mkdir("dir", dir_fd=0) + + def test_rename_replace(self): + self._verify_available("HAVE_RENAMEAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_RENAMEAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_RENAMEAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd and dst_dir_fd unavailable"): + os.rename("a", "b", src_dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd and dst_dir_fd unavailable"): + os.rename("a", "b", dst_dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd and dst_dir_fd unavailable"): + os.replace("a", "b", src_dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd and dst_dir_fd unavailable"): + os.replace("a", "b", dst_dir_fd=0) + + def test_unlink_rmdir(self): + self._verify_available("HAVE_UNLINKAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_UNLINKAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_UNLINKAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.unlink("path", dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.rmdir("path", dir_fd=0) + + def test_open(self): + self._verify_available("HAVE_OPENAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_OPENAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_OPENAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.open("path", os.O_RDONLY, dir_fd=0) + + def test_readlink(self): + self._verify_available("HAVE_READLINKAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_READLINKAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_READLINKAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.readlink("path", dir_fd=0) + + def test_symlink(self): + self._verify_available("HAVE_SYMLINKAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_SYMLINKAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_SYMLINKAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.symlink("a", "b", dir_fd=0) + + def test_utime(self): + self._verify_available("HAVE_FUTIMENS") + self._verify_available("HAVE_UTIMENSAT") + if self.mac_ver >= (10, 13): + self.assertIn("HAVE_FUTIMENS", posix._have_functions) + self.assertIn("HAVE_UTIMENSAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_FUTIMENS", posix._have_functions) + self.assertNotIn("HAVE_UTIMENSAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.utime("path", dir_fd=0) + + def test_main(): try: support.run_unittest( @@ -1932,6 +2159,7 @@ def test_main(): PosixGroupsTester, TestPosixSpawn, TestPosixSpawnP, + TestPosixWeaklinking ) finally: support.reap_children() diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index 6ced0470d07561..325829864851c3 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -1041,6 +1041,36 @@ def test_object_to_timespec(self): with self.assertRaises(ValueError): pytime_object_to_timespec(float('nan'), time_rnd) +@unittest.skipUnless(sys.platform == "darwin", "test weak linking on macOS") +class TestTimeWeaklinking(unittest.TestCase): + # These test cases verify that weak linking support on macOS works + # as expected. These cases only test new behaviour introduced by weak linking, + # regular behaviour is tested by the normal test cases. + # + # See the section on Weak Linking in Mac/README.txt for more information. + def test_clock_functions(self): + import sysconfig + import platform + + config_vars = sysconfig.get_config_vars() + var_name = "HAVE_CLOCK_GETTIME" + if var_name not in config_vars or not config_vars[var_name]: + raise unittest.SkipTest(f"{var_name} is not available") + + mac_ver = tuple(int(x) for x in platform.mac_ver()[0].split(".")) + + clock_names = [ + "CLOCK_MONOTONIC", "clock_gettime", "clock_gettime_ns", "clock_settime", + "clock_settime_ns", "clock_getres"] + + if mac_ver >= (10, 12): + for name in clock_names: + self.assertTrue(hasattr(time, name), f"time.{name} is not available") + + else: + for name in clock_names: + self.assertFalse(hasattr(time, name), f"time.{name} is available") + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 90b0965582272c..4f5636e1426f4d 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -2516,11 +2516,13 @@ class CAPITest(unittest.TestCase): def test_from_format(self): import_helper.import_module('ctypes') from ctypes import ( + c_char_p, pythonapi, py_object, sizeof, c_int, c_long, c_longlong, c_ssize_t, c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) name = "PyUnicode_FromFormat" _PyUnicode_FromFormat = getattr(pythonapi, name) + _PyUnicode_FromFormat.argtypes = (c_char_p,) _PyUnicode_FromFormat.restype = py_object def PyUnicode_FromFormat(format, *args): diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 2548b212d9ea42..0e76d3ca5bbc2e 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -116,7 +116,8 @@ def getFullVersion(): DEPSRC = os.path.join(WORKDIR, 'third-party') DEPSRC = os.path.expanduser('~/Universal/other-sources') -universal_opts_map = { '32-bit': ('i386', 'ppc',), +universal_opts_map = { 'universal2': ('arm64', 'x86_64'), + '32-bit': ('i386', 'ppc',), '64-bit': ('x86_64', 'ppc64',), 'intel': ('i386', 'x86_64'), 'intel-32': ('i386',), @@ -124,6 +125,7 @@ def getFullVersion(): '3-way': ('ppc', 'i386', 'x86_64'), 'all': ('i386', 'ppc', 'x86_64', 'ppc64',) } default_target_map = { + 'universal2': '10.9', '64-bit': '10.5', '3-way': '10.5', 'intel': '10.5', @@ -190,6 +192,27 @@ def getTargetCompilers(): def internalTk(): return getDeptargetTuple() >= (10, 6) + +def tweak_tcl_build(basedir, archList): + with open("Makefile", "r") as fp: + contents = fp.readlines() + + # For reasons I don't understand the tcl configure script + # decides that some stdlib symbols aren't present, before + # deciding that strtod is broken. + new_contents = [] + for line in contents: + if line.startswith("COMPAT_OBJS"): + # note: the space before strtod.o is intentional, + # the detection of a broken strtod results in + # "fixstrod.o" on this line. + for nm in ("strstr.o", "strtoul.o", " strtod.o"): + line = line.replace(nm, "") + new_contents.append(line) + + with open("Makefile", "w") as fp: + fp.writelines(new_contents) + # List of names of third party software built with this installer. # The names will be inserted into the rtf version of the License. THIRD_PARTY_LIBS = [] @@ -215,6 +238,9 @@ def library_recipes(): buildrecipe=build_universal_openssl, configure=None, install=None, + patches=[ + "openssl-mac-arm64.patch", + ], ), ]) @@ -231,6 +257,7 @@ def library_recipes(): '--libdir=/Library/Frameworks/Python.framework/Versions/%s/lib'%(getVersion(),), ], useLDFlags=False, + buildrecipe=tweak_tcl_build, install='make TCL_LIBRARY=%(TCL_LIBRARY)s && make install TCL_LIBRARY=%(TCL_LIBRARY)s DESTDIR=%(DESTDIR)s'%{ "DESTDIR": shellQuote(os.path.join(WORKDIR, 'libraries')), "TCL_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tcl8.6'%(getVersion())), @@ -801,6 +828,7 @@ def build_openssl_arch(archbase, arch): arch_opts = { "i386": ["darwin-i386-cc"], "x86_64": ["darwin64-x86_64-cc", "enable-ec_nistp_64_gcc_128"], + "arm64": ["darwin64-arm64-cc"], "ppc": ["darwin-ppc-cc"], "ppc64": ["darwin64-ppc-cc"], } diff --git a/Mac/BuildScript/openssl-mac-arm64.patch b/Mac/BuildScript/openssl-mac-arm64.patch new file mode 100644 index 00000000000000..11267fb118744a --- /dev/null +++ b/Mac/BuildScript/openssl-mac-arm64.patch @@ -0,0 +1,41 @@ +diff -ur openssl-1.1.1g-orig/Configurations/10-main.conf openssl-1.1.1g/Configurations/10-main.conf +--- openssl-1.1.1g-orig/Configurations/10-main.conf 2020-04-21 14:22:39.000000000 +0200 ++++ openssl-1.1.1g/Configurations/10-main.conf 2020-07-26 12:21:32.000000000 +0200 +@@ -1557,6 +1557,14 @@ + bn_ops => "SIXTY_FOUR_BIT_LONG", + perlasm_scheme => "macosx", + }, ++ "darwin64-arm64-cc" => { ++ inherit_from => [ "darwin-common", asm("aarch64_asm") ], ++ CFLAGS => add("-Wall"), ++ cflags => add("-arch arm64"), ++ lib_cppflags => add("-DL_ENDIAN"), ++ bn_ops => "SIXTY_FOUR_BIT_LONG", ++ perlasm_scheme => "ios64", ++ }, + + ##### GNU Hurd + "hurd-x86" => { +diff -ur openssl-1.1.1g-orig/config openssl-1.1.1g/config +--- openssl-1.1.1g-orig/config 2020-04-21 14:22:39.000000000 +0200 ++++ openssl-1.1.1g/config 2020-07-26 12:21:59.000000000 +0200 +@@ -255,6 +255,9 @@ + ;; + x86_64) + echo "x86_64-apple-darwin${VERSION}" ++ ;; ++ arm64) ++ echo "arm64-apple-darwin${VERSION}" + ;; + *) + echo "i686-apple-darwin${VERSION}" +@@ -497,6 +500,9 @@ + else + OUT="darwin64-x86_64-cc" + fi ;; ++ x86_64-apple-darwin*) ++ OUT="darwin64-arm64-cc" ++ ;; + armv6+7-*-iphoneos) + __CNF_CFLAGS="$__CNF_CFLAGS -arch armv6 -arch armv7" + __CNF_CXXFLAGS="$__CNF_CXXFLAGS -arch armv6 -arch armv7" diff --git a/Mac/README.rst b/Mac/README.rst index ec7d873df277d7..f3638aa0019aaf 100644 --- a/Mac/README.rst +++ b/Mac/README.rst @@ -120,6 +120,8 @@ support ppc (Xcode 4 on 10.6 and later systems). The flavor can be specified using the configure option ``--with-universal-archs=VALUE``. The following values are available: + * ``universal2``: ``arm64``, ``x86_64`` + * ``intel``: ``i386``, ``x86_64`` * ``intel-32``: ``i386`` @@ -155,6 +157,8 @@ following combinations of SDKs and universal-archs flavors are available: * 10.15 and later SDKs support ``intel-64`` only + * 11.0 and later SDKs support ``universal2`` + The makefile for a framework build will also install ``python3.x-32`` binaries when the universal architecture includes at least one 32-bit architecture (that is, for all flavors but ``64-bit`` and ``intel-64``). @@ -352,6 +356,39 @@ A framework install also installs some applications in ``/Applications/Python X. And lastly a framework installation installs files in ``/usr/local/bin``, all of them symbolic links to files in ``/Library/Frameworks/Python.framework/Versions/X.Y/bin``. +Weak linking support +==================== + +The CPython sources support building with the latest SDK while targetting deployment +to macOS 10.9. This is done through weak linking of symbols introduced in macOS +10.10 or later and checking for their availability at runtime. + +This requires the use of Apple's compiler toolchain on macOS 10.13 or later. + +The basic implementation pattern is: + +* ``HAVE_`` is a macro defined (or not) by the configure script + +* ``HAVE__RUNTIME`` is a macro defined in the relevant source + files. This expands to a call to ``__builtin_available`` when using + a new enough Apple compiler, and to a true value otherwise. + +* Use ``HAVE__RUNTIME`` before calling ````. This macro + *must* be used a the sole expression in an if statement:: + + if (HAVE__RUNTIME) { + /* is available */ + } + + Or: + + if (HAVE__RUNTIME) {} else { + /* is not available */ + } + + Using other patterns (such as ``!HAVE__RUNTIME``) is not supported + by Apple's compilers. + Resources ========= diff --git a/Mac/Tools/pythonw.c b/Mac/Tools/pythonw.c index c8bd3ba8d68c15..78813e818e7dac 100644 --- a/Mac/Tools/pythonw.c +++ b/Mac/Tools/pythonw.c @@ -95,9 +95,6 @@ setup_spawnattr(posix_spawnattr_t* spawnattr) size_t count; cpu_type_t cpu_types[1]; short flags = 0; -#ifdef __LP64__ - int ch; -#endif if ((errno = posix_spawnattr_init(spawnattr)) != 0) { err(2, "posix_spawnattr_int"); @@ -119,10 +116,16 @@ setup_spawnattr(posix_spawnattr_t* spawnattr) #elif defined(__ppc__) cpu_types[0] = CPU_TYPE_POWERPC; + #elif defined(__i386__) cpu_types[0] = CPU_TYPE_X86; + +#elif defined(__arm64__) + cpu_types[0] = CPU_TYPE_ARM64; + #else # error "Unknown CPU" + #endif if (posix_spawnattr_setbinpref_np(spawnattr, count, @@ -220,7 +223,8 @@ main(int argc, char **argv) { /* We're weak-linking to posix-spawnv to ensure that * an executable build on 10.5 can work on 10.4. */ - if (posix_spawn != NULL) { + + if (&posix_spawn != NULL) { posix_spawnattr_t spawnattr = NULL; setup_spawnattr(&spawnattr); diff --git a/Misc/NEWS.d/next/macOS/2020-11-01-16-40-23.bpo-41100.BApztP.rst b/Misc/NEWS.d/next/macOS/2020-11-01-16-40-23.bpo-41100.BApztP.rst new file mode 100644 index 00000000000000..6cbb279e7625ea --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2020-11-01-16-40-23.bpo-41100.BApztP.rst @@ -0,0 +1,8 @@ +Add support for macOS 11 and Apple Silicon systems. + +It is now possible to build "Universal 2" binaries using +"--enable-universalsdk --with-universal-archs=universal2". + +Binaries build on later macOS versions can be deployed back to older +versions (tested up to macOS 10.9), when using the correct deployment +target. This is tested using Xcode 11 and later. diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index 5cd8577248514a..3686287e45ac3a 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -1,6 +1,8 @@ #include "Python.h" #include "frameobject.h" +#include + #include #ifdef MS_WIN32 #include @@ -18,7 +20,7 @@ CThunkObject_dealloc(PyObject *myself) Py_XDECREF(self->callable); Py_XDECREF(self->restype); if (self->pcl_write) - ffi_closure_free(self->pcl_write); + Py_ffi_closure_free(self->pcl_write); PyObject_GC_Del(self); } @@ -362,8 +364,7 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, assert(CThunk_CheckExact((PyObject *)p)); - p->pcl_write = ffi_closure_alloc(sizeof(ffi_closure), - &p->pcl_exec); + p->pcl_write = Py_ffi_closure_alloc(sizeof(ffi_closure), &p->pcl_exec); if (p->pcl_write == NULL) { PyErr_NoMemory(); goto error; @@ -409,13 +410,35 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, "ffi_prep_cif failed with %d", result); goto error; } -#if defined(X86_DARWIN) || defined(POWERPC_DARWIN) - result = ffi_prep_closure(p->pcl_write, &p->cif, closure_fcn, p); +#if HAVE_FFI_PREP_CLOSURE_LOC +# if USING_APPLE_OS_LIBFFI +# define HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME __builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *) +# else +# define HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME 1 +# endif + if (HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME) { + result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn, + p, + p->pcl_exec); + } else +#endif + { +#if USING_APPLE_OS_LIBFFI && defined(__arm64__) + PyErr_Format(PyExc_NotImplementedError, "ffi_prep_closure_loc() is missing"); + goto error; #else - result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn, - p, - p->pcl_exec); +#ifdef MACOSX + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" #endif + result = ffi_prep_closure(p->pcl_write, &p->cif, closure_fcn, p); + +#ifdef MACOSX + #pragma clang diagnostic pop +#endif + +#endif + } if (result != FFI_OK) { PyErr_Format(PyExc_RuntimeError, "ffi_prep_closure failed with %d", result); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 261ae5ceb9e48a..a52d343031a090 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -57,6 +57,8 @@ #include "Python.h" #include "structmember.h" // PyMemberDef +#include + #ifdef MS_WIN32 #include #include @@ -64,6 +66,10 @@ #include "ctypes_dlfcn.h" #endif +#ifdef __APPLE__ +#include +#endif + #ifdef MS_WIN32 #include #endif @@ -812,7 +818,8 @@ static int _call_function_pointer(int flags, ffi_type **atypes, ffi_type *restype, void *resmem, - int argcount) + int argcount, + int argtypecount) { PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ PyObject *error_object = NULL; @@ -835,14 +842,70 @@ static int _call_function_pointer(int flags, if ((flags & FUNCFLAG_CDECL) == 0) cc = FFI_STDCALL; #endif - if (FFI_OK != ffi_prep_cif(&cif, - cc, - argcount, - restype, - atypes)) { - PyErr_SetString(PyExc_RuntimeError, - "ffi_prep_cif failed"); - return -1; + +# if USING_APPLE_OS_LIBFFI +# define HAVE_FFI_PREP_CIF_VAR_RUNTIME __builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *) +# elif HAVE_FFI_PREP_CIF_VAR +# define HAVE_FFI_PREP_CIF_VAR_RUNTIME true +# else +# define HAVE_FFI_PREP_CIF_VAR_RUNTIME false +# endif + + /* Even on Apple-arm64 the calling convention for variadic functions conincides + * with the standard calling convention in the case that the function called + * only with its fixed arguments. Thus, we do not need a special flag to be + * set on variadic functions. We treat a function as variadic if it is called + * with a nonzero number of variadic arguments */ + bool is_variadic = (argtypecount != 0 && argcount > argtypecount); + (void) is_variadic; + +#if defined(__APPLE__) && defined(__arm64__) + if (is_variadic) { + if (HAVE_FFI_PREP_CIF_VAR_RUNTIME) { + } else { + PyErr_SetString(PyExc_NotImplementedError, "ffi_prep_cif_var() is missing"); + return -1; + } + } +#endif + +#if HAVE_FFI_PREP_CIF_VAR + if (is_variadic) { + if (HAVE_FFI_PREP_CIF_VAR_RUNTIME) { + if (FFI_OK != ffi_prep_cif_var(&cif, + cc, + argtypecount, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif_var failed"); + return -1; + } + } else { + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } + } + } else +#endif + + { + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } } if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { @@ -1212,9 +1275,8 @@ PyObject *_ctypes_callproc(PPROC pProc, if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, rtype, resbuf, - Py_SAFE_DOWNCAST(argcount, - Py_ssize_t, - int))) + Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), + Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) goto cleanup; #ifdef WORDS_BIGENDIAN @@ -1398,6 +1460,42 @@ copy_com_pointer(PyObject *self, PyObject *args) } #else +#ifdef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH +static PyObject *py_dyld_shared_cache_contains_path(PyObject *self, PyObject *args) +{ + PyObject *name, *name2; + char *name_str; + + if (__builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)) { + int r; + + if (!PyArg_ParseTuple(args, "O", &name)) + return NULL; + + if (name == Py_None) + Py_RETURN_FALSE; + + if (PyUnicode_FSConverter(name, &name2) == 0) + return NULL; + name_str = PyBytes_AS_STRING(name2); + + r = _dyld_shared_cache_contains_path(name_str); + Py_DECREF(name2); + + if (r) { + Py_RETURN_TRUE; + } else { + Py_RETURN_FALSE; + } + + } else { + PyErr_SetString(PyExc_NotImplementedError, "_dyld_shared_cache_contains_path symbol is missing"); + return NULL; + } + + } +#endif + static PyObject *py_dl_open(PyObject *self, PyObject *args) { PyObject *name, *name2; @@ -1887,6 +1985,8 @@ buffer_info(PyObject *self, PyObject *arg) return Py_BuildValue("siN", dict->format, dict->ndim, shape); } + + PyMethodDef _ctypes_module_methods[] = { {"get_errno", get_errno, METH_NOARGS}, {"set_errno", set_errno, METH_VARARGS}, @@ -1908,6 +2008,9 @@ PyMethodDef _ctypes_module_methods[] = { "dlopen(name, flag={RTLD_GLOBAL|RTLD_LOCAL}) open a shared library"}, {"dlclose", py_dl_close, METH_VARARGS, "dlclose a library"}, {"dlsym", py_dl_sym, METH_VARARGS, "find symbol in shared library"}, +#endif +#ifdef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH + {"_dyld_shared_cache_contains_path", py_dyld_shared_cache_contains_path, METH_VARARGS, "check if path is in the shared cache"}, #endif {"alignment", align_func, METH_O, alignment_doc}, {"sizeof", sizeof_func, METH_O, sizeof_doc}, diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index 1effccf9cc5ff9..3f20031d671a8a 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -366,6 +366,14 @@ PyObject *_ctypes_get_errobj(int **pspace); extern PyObject *ComError; #endif +#if USING_MALLOC_CLOSURE_DOT_C +void Py_ffi_closure_free(void *p); +void *Py_ffi_closure_alloc(size_t size, void** codeloc); +#else +#define Py_ffi_closure_free ffi_closure_free +#define Py_ffi_closure_alloc ffi_closure_alloc +#endif + /* Local Variables: compile-command: "python setup.py -q build install --home ~" diff --git a/Modules/_ctypes/malloc_closure.c b/Modules/_ctypes/malloc_closure.c index f9cdb336958c6f..4f220e42ff3fcc 100644 --- a/Modules/_ctypes/malloc_closure.c +++ b/Modules/_ctypes/malloc_closure.c @@ -89,16 +89,27 @@ static void more_core(void) /******************************************************************/ /* put the item back into the free list */ -void ffi_closure_free(void *p) +void Py_ffi_closure_free(void *p) { +#if USING_APPLE_OS_LIBFFI && HAVE_FFI_CLOSURE_ALLOC + if (__builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *)) { + ffi_closure_free(p); + return; + } +#endif ITEM *item = (ITEM *)p; item->next = free_list; free_list = item; } /* return one item from the free list, allocating more if needed */ -void *ffi_closure_alloc(size_t ignored, void** codeloc) +void *Py_ffi_closure_alloc(size_t size, void** codeloc) { +#if USING_APPLE_OS_LIBFFI && HAVE_FFI_CLOSURE_ALLOC + if (__builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *)) { + return ffi_closure_alloc(size, codeloc); + } +#endif ITEM *item; if (!free_list) more_core(); diff --git a/Modules/getpath.c b/Modules/getpath.c index f7a6dd40443054..44453f29df703a 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -923,11 +923,7 @@ static PyStatus calculate_program_macos(wchar_t **abs_path_p) { char execpath[MAXPATHLEN + 1]; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 uint32_t nsexeclength = Py_ARRAY_LENGTH(execpath) - 1; -#else - unsigned long nsexeclength = Py_ARRAY_LENGTH(execpath) - 1; -#endif /* On Mac OS X, if a script uses an interpreter of the form "#!/opt/python2.3/bin/python", the kernel only passes "python" diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 203f98515dfdad..70b47c475feaa5 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -7,18 +7,6 @@ of the compiler used. Different compilers define their own feature test macro, e.g. '_MSC_VER'. */ -#ifdef __APPLE__ - /* - * Step 1 of support for weak-linking a number of symbols existing on - * OSX 10.4 and later, see the comment in the #ifdef __APPLE__ block - * at the end of this file for more information. - */ -# pragma weak lchown -# pragma weak statvfs -# pragma weak fstatvfs - -#endif /* __APPLE__ */ - #define PY_SSIZE_T_CLEAN #include "Python.h" @@ -55,6 +43,127 @@ #include /* needed for ctermid() */ +/* + * A number of APIs are available on macOS from a certain macOS version. + * To support building with a new SDK while deploying to older versions + * the availability test is split into two: + * - HAVE_: The configure check for compile time availability + * - HAVE__RUNTIME: Runtime check for availability + * + * The latter is always true when not on macOS, or when using a compiler + * that does not support __has_builtin (older versions of Xcode). + * + * Due to compiler restrictions there is one valid use of HAVE__RUNTIME: + * if (HAVE__RUNTIME) { ... } + * + * In mixing the test with other tests or using negations will result in compile + * errors. + */ +#if defined(__APPLE__) + +#if defined(__has_builtin) && __has_builtin(__builtin_available) +# define HAVE_FSTATAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_FACCESSAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_FCHMODAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_FCHOWNAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_LINKAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_FDOPENDIR_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_MKDIRAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_RENAMEAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_UNLINKAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_OPENAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_READLINKAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_SYMLINKAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_FUTIMENS_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) +# define HAVE_UTIMENSAT_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) +# define HAVE_PWRITEV_RUNTIME __builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) + +# define HAVE_POSIX_SPAWN_SETSID_RUNTIME __builtin_available(macOS 10.15, *) + +#else /* Xcode 8 or earlier */ + + /* __builtin_available is not present in these compilers, but + * some of the symbols might be weak linked (10.10 SDK or later + * deploying on 10.9. + * + * Fall back to the older style of availability checking for + * symbols introduced in macOS 10.10. + */ + +# ifdef HAVE_FSTATAT +# define HAVE_FSTATAT_RUNTIME (fstatat != NULL) +# endif + +# ifdef HAVE_FACCESSAT +# define HAVE_FACCESSAT_RUNTIME (faccessat != NULL) +# endif + +# ifdef HAVE_FCHMODAT +# define HAVE_FCHMODAT_RUNTIME (fchmodat != NULL) +# endif + +# ifdef HAVE_FCHOWNAT +# define HAVE_FCHOWNAT_RUNTIME (fchownat != NULL) +# endif + +# ifdef HAVE_LINKAT +# define HAVE_LINKAT_RUNTIME (linkat != NULL) +# endif + +# ifdef HAVE_FDOPENDIR +# define HAVE_FDOPENDIR_RUNTIME (fdopendir != NULL) +# endif + +# ifdef HAVE_MKDIRAT +# define HAVE_MKDIRAT_RUNTIME (mkdirat != NULL) +# endif + +# ifdef HAVE_RENAMEAT +# define HAVE_RENAMEAT_RUNTIME (renameat != NULL) +# endif + +# ifdef HAVE_UNLINKAT +# define HAVE_UNLINKAT_RUNTIME (unlinkat != NULL) +# endif + +# ifdef HAVE_OPENAT +# define HAVE_OPENAT_RUNTIME (openat != NULL) +# endif + +# ifdef HAVE_READLINKAT +# define HAVE_READLINKAT_RUNTIME (readlinkat != NULL) +# endif + +# ifdef HAVE_SYMLINKAT +# define HAVE_SYMLINKAT_RUNTIME (symlinkat != NULL) +# endif + +#endif + +#ifdef HAVE_FUTIMESAT +/* Some of the logic for weak linking depends on this assertion */ +# error "HAVE_FUTIMESAT unexpectedly defined" +#endif + +#else +# define HAVE_FSTATAT_RUNTIME 1 +# define HAVE_FACCESSAT_RUNTIME 1 +# define HAVE_FCHMODAT_RUNTIME 1 +# define HAVE_FCHOWNAT_RUNTIME 1 +# define HAVE_LINKAT_RUNTIME 1 +# define HAVE_FDOPENDIR_RUNTIME 1 +# define HAVE_MKDIRAT_RUNTIME 1 +# define HAVE_RENAMEAT_RUNTIME 1 +# define HAVE_UNLINKAT_RUNTIME 1 +# define HAVE_OPENAT_RUNTIME 1 +# define HAVE_READLINKAT_RUNTIME 1 +# define HAVE_SYMLINKAT_RUNTIME 1 +# define HAVE_FUTIMENS_RUNTIME 1 +# define HAVE_UTIMENSAT_RUNTIME 1 +# define HAVE_PWRITEV_RUNTIME 1 +#endif + + #ifdef __cplusplus extern "C" { #endif @@ -2360,6 +2469,10 @@ posix_do_stat(PyObject *module, const char *function_name, path_t *path, STRUCT_STAT st; int result; +#ifdef HAVE_FSTATAT + int fstatat_unavailable = 0; +#endif + #if !defined(MS_WINDOWS) && !defined(HAVE_FSTATAT) && !defined(HAVE_LSTAT) if (follow_symlinks_specified(function_name, follow_symlinks)) return NULL; @@ -2386,15 +2499,27 @@ posix_do_stat(PyObject *module, const char *function_name, path_t *path, else #endif /* HAVE_LSTAT */ #ifdef HAVE_FSTATAT - if ((dir_fd != DEFAULT_DIR_FD) || !follow_symlinks) - result = fstatat(dir_fd, path->narrow, &st, + if ((dir_fd != DEFAULT_DIR_FD) || !follow_symlinks) { + if (HAVE_FSTATAT_RUNTIME) { + result = fstatat(dir_fd, path->narrow, &st, follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW); - else + + } else { + fstatat_unavailable = 1; + } + } else #endif /* HAVE_FSTATAT */ result = STAT(path->narrow, &st); #endif /* MS_WINDOWS */ Py_END_ALLOW_THREADS +#ifdef HAVE_FSTATAT + if (fstatat_unavailable) { + argument_unavailable_error("stat", "dir_fd"); + return NULL; + } +#endif + if (result != 0) { return path_error(path); } @@ -2808,6 +2933,10 @@ os_access_impl(PyObject *module, path_t *path, int mode, int dir_fd, int result; #endif +#ifdef HAVE_FACCESSAT + int faccessat_unavailable = 0; +#endif + #ifndef HAVE_FACCESSAT if (follow_symlinks_specified("access", follow_symlinks)) return -1; @@ -2842,17 +2971,40 @@ os_access_impl(PyObject *module, path_t *path, int mode, int dir_fd, if ((dir_fd != DEFAULT_DIR_FD) || effective_ids || !follow_symlinks) { - int flags = 0; - if (!follow_symlinks) - flags |= AT_SYMLINK_NOFOLLOW; - if (effective_ids) - flags |= AT_EACCESS; - result = faccessat(dir_fd, path->narrow, mode, flags); + + if (HAVE_FACCESSAT_RUNTIME) { + int flags = 0; + if (!follow_symlinks) + flags |= AT_SYMLINK_NOFOLLOW; + if (effective_ids) + flags |= AT_EACCESS; + result = faccessat(dir_fd, path->narrow, mode, flags); + } else { + faccessat_unavailable = 1; + } } else #endif result = access(path->narrow, mode); Py_END_ALLOW_THREADS + +#ifdef HAVE_FACCESSAT + if (faccessat_unavailable) { + if (dir_fd != DEFAULT_DIR_FD) { + argument_unavailable_error("access", "dir_fd"); + return -1; + } + if (follow_symlinks_specified("access", follow_symlinks)) + return -1; + + if (effective_ids) { + argument_unavailable_error("access", "effective_ids"); + return -1; + } + /* should be unreachable */ + return -1; + } +#endif return_value = !result; #endif @@ -3050,6 +3202,7 @@ os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd, #ifdef HAVE_FCHMODAT int fchmodat_nofollow_unsupported = 0; + int fchmodat_unsupported = 0; #endif #if !(defined(HAVE_FCHMODAT) || defined(HAVE_LCHMOD)) @@ -3085,42 +3238,56 @@ os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd, if (path->fd != -1) result = fchmod(path->fd, mode); else -#endif +#endif /* HAVE_CHMOD */ #ifdef HAVE_LCHMOD if ((!follow_symlinks) && (dir_fd == DEFAULT_DIR_FD)) result = lchmod(path->narrow, mode); else -#endif +#endif /* HAVE_LCHMOD */ #ifdef HAVE_FCHMODAT if ((dir_fd != DEFAULT_DIR_FD) || !follow_symlinks) { - /* - * fchmodat() doesn't currently support AT_SYMLINK_NOFOLLOW! - * The documentation specifically shows how to use it, - * and then says it isn't implemented yet. - * (true on linux with glibc 2.15, and openindiana 3.x) - * - * Once it is supported, os.chmod will automatically - * support dir_fd and follow_symlinks=False. (Hopefully.) - * Until then, we need to be careful what exception we raise. - */ - result = fchmodat(dir_fd, path->narrow, mode, - follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW); - /* - * But wait! We can't throw the exception without allowing threads, - * and we can't do that in this nested scope. (Macro trickery, sigh.) - */ - fchmodat_nofollow_unsupported = - result && - ((errno == ENOTSUP) || (errno == EOPNOTSUPP)) && - !follow_symlinks; + if (HAVE_FCHMODAT_RUNTIME) { + /* + * fchmodat() doesn't currently support AT_SYMLINK_NOFOLLOW! + * The documentation specifically shows how to use it, + * and then says it isn't implemented yet. + * (true on linux with glibc 2.15, and openindiana 3.x) + * + * Once it is supported, os.chmod will automatically + * support dir_fd and follow_symlinks=False. (Hopefully.) + * Until then, we need to be careful what exception we raise. + */ + result = fchmodat(dir_fd, path->narrow, mode, + follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW); + /* + * But wait! We can't throw the exception without allowing threads, + * and we can't do that in this nested scope. (Macro trickery, sigh.) + */ + fchmodat_nofollow_unsupported = + result && + ((errno == ENOTSUP) || (errno == EOPNOTSUPP)) && + !follow_symlinks; + } else { + fchmodat_unsupported = 1; + fchmodat_nofollow_unsupported = 1; + + result = -1; + } } else -#endif +#endif /* HAVE_FHCMODAT */ result = chmod(path->narrow, mode); Py_END_ALLOW_THREADS if (result) { #ifdef HAVE_FCHMODAT + if (fchmodat_unsupported) { + if (dir_fd != DEFAULT_DIR_FD) { + argument_unavailable_error("chmod", "dir_fd"); + return NULL; + } + } + if (fchmodat_nofollow_unsupported) { if (dir_fd != DEFAULT_DIR_FD) dir_fd_and_follow_symlinks_invalid("chmod", @@ -3130,10 +3297,10 @@ os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd, return NULL; } else -#endif +#endif /* HAVE_FCHMODAT */ return path_error(path); } -#endif +#endif /* MS_WINDOWS */ Py_RETURN_NONE; } @@ -3421,6 +3588,10 @@ os_chown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid, { int result; +#if defined(HAVE_FCHOWNAT) + int fchownat_unsupported = 0; +#endif + #if !(defined(HAVE_LCHOWN) || defined(HAVE_FCHOWNAT)) if (follow_symlinks_specified("chown", follow_symlinks)) return NULL; @@ -3429,19 +3600,6 @@ os_chown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid, fd_and_follow_symlinks_invalid("chown", path->fd, follow_symlinks)) return NULL; -#ifdef __APPLE__ - /* - * This is for Mac OS X 10.3, which doesn't have lchown. - * (But we still have an lchown symbol because of weak-linking.) - * It doesn't have fchownat either. So there's no possibility - * of a graceful failover. - */ - if ((!follow_symlinks) && (lchown == NULL)) { - follow_symlinks_specified("chown", follow_symlinks); - return NULL; - } -#endif - if (PySys_Audit("os.chown", "OIIi", path->object, uid, gid, dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { return NULL; @@ -3459,14 +3617,28 @@ os_chown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid, else #endif #ifdef HAVE_FCHOWNAT - if ((dir_fd != DEFAULT_DIR_FD) || (!follow_symlinks)) + if ((dir_fd != DEFAULT_DIR_FD) || (!follow_symlinks)) { + if (HAVE_FCHOWNAT_RUNTIME) { result = fchownat(dir_fd, path->narrow, uid, gid, follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW); - else + } else { + fchownat_unsupported = 1; + } + } else #endif result = chown(path->narrow, uid, gid); Py_END_ALLOW_THREADS +#ifdef HAVE_FCHOWNAT + if (fchownat_unsupported) { + /* This would be incorrect if the current platform + * doesn't support lchown. + */ + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (result) return path_error(path); @@ -3712,6 +3884,9 @@ os_link_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd, #else int result; #endif +#if defined(HAVE_LINKAT) + int linkat_unavailable = 0; +#endif #ifndef HAVE_LINKAT if ((src_dir_fd != DEFAULT_DIR_FD) || (dst_dir_fd != DEFAULT_DIR_FD)) { @@ -3746,15 +3921,43 @@ os_link_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd, #ifdef HAVE_LINKAT if ((src_dir_fd != DEFAULT_DIR_FD) || (dst_dir_fd != DEFAULT_DIR_FD) || - (!follow_symlinks)) - result = linkat(src_dir_fd, src->narrow, - dst_dir_fd, dst->narrow, - follow_symlinks ? AT_SYMLINK_FOLLOW : 0); + (!follow_symlinks)) { + + if (HAVE_LINKAT_RUNTIME) { + + result = linkat(src_dir_fd, src->narrow, + dst_dir_fd, dst->narrow, + follow_symlinks ? AT_SYMLINK_FOLLOW : 0); + + } +#ifdef __APPLE__ + else { + if (src_dir_fd == DEFAULT_DIR_FD && dst_dir_fd == DEFAULT_DIR_FD) { + /* See issue 41355: This matches the behaviour of !HAVE_LINKAT */ + result = link(src->narrow, dst->narrow); + } else { + linkat_unavailable = 1; + } + } +#endif + } else #endif /* HAVE_LINKAT */ result = link(src->narrow, dst->narrow); Py_END_ALLOW_THREADS +#ifdef HAVE_LINKAT + if (linkat_unavailable) { + /* Either or both dir_fd arguments were specified */ + if (src_dir_fd != DEFAULT_DIR_FD) { + argument_unavailable_error("link", "src_dir_fd"); + } else { + argument_unavailable_error("link", "dst_dir_fd"); + } + return NULL; + } +#endif + if (result) return path_error2(src, dst); #endif /* MS_WINDOWS */ @@ -3877,6 +4080,7 @@ _posix_listdir(path_t *path, PyObject *list) errno = 0; #ifdef HAVE_FDOPENDIR if (path->fd != -1) { + if (HAVE_FDOPENDIR_RUNTIME) { /* closedir() closes the FD, so we duplicate it */ fd = _Py_dup(path->fd); if (fd == -1) @@ -3887,6 +4091,11 @@ _posix_listdir(path_t *path, PyObject *list) Py_BEGIN_ALLOW_THREADS dirp = fdopendir(fd); Py_END_ALLOW_THREADS + } else { + PyErr_SetString(PyExc_TypeError, + "listdir: path should be string, bytes, os.PathLike or None, not int"); + return NULL; + } } else #endif @@ -4200,6 +4409,9 @@ os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd) /*[clinic end generated code: output=a70446903abe821f input=e965f68377e9b1ce]*/ { int result; +#ifdef HAVE_MKDIRAT + int mkdirat_unavailable = 0; +#endif if (PySys_Audit("os.mkdir", "Oii", path->object, mode, dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { @@ -4216,9 +4428,14 @@ os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd) #else Py_BEGIN_ALLOW_THREADS #if HAVE_MKDIRAT - if (dir_fd != DEFAULT_DIR_FD) + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_MKDIRAT_RUNTIME) { result = mkdirat(dir_fd, path->narrow, mode); - else + + } else { + mkdirat_unavailable = 1; + } + } else #endif #if defined(__WATCOMC__) && !defined(__QNX__) result = mkdir(path->narrow); @@ -4226,6 +4443,14 @@ os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd) result = mkdir(path->narrow, mode); #endif Py_END_ALLOW_THREADS + +#if HAVE_MKDIRAT + if (mkdirat_unavailable) { + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (result < 0) return path_error(path); #endif /* MS_WINDOWS */ @@ -4335,6 +4560,10 @@ internal_rename(path_t *src, path_t *dst, int src_dir_fd, int dst_dir_fd, int is const char *function_name = is_replace ? "replace" : "rename"; int dir_fd_specified; +#ifdef HAVE_RENAMEAT + int renameat_unavailable = 0; +#endif + #ifdef MS_WINDOWS BOOL result; int flags = is_replace ? MOVEFILE_REPLACE_EXISTING : 0; @@ -4374,13 +4603,25 @@ internal_rename(path_t *src, path_t *dst, int src_dir_fd, int dst_dir_fd, int is Py_BEGIN_ALLOW_THREADS #ifdef HAVE_RENAMEAT - if (dir_fd_specified) - result = renameat(src_dir_fd, src->narrow, dst_dir_fd, dst->narrow); - else + if (dir_fd_specified) { + if (HAVE_RENAMEAT_RUNTIME) { + result = renameat(src_dir_fd, src->narrow, dst_dir_fd, dst->narrow); + } else { + renameat_unavailable = 1; + } + } else #endif result = rename(src->narrow, dst->narrow); Py_END_ALLOW_THREADS + +#ifdef HAVE_RENAMEAT + if (renameat_unavailable) { + argument_unavailable_error(function_name, "src_dir_fd and dst_dir_fd"); + return NULL; + } +#endif + if (result) return path_error2(src, dst); #endif @@ -4456,6 +4697,9 @@ os_rmdir_impl(PyObject *module, path_t *path, int dir_fd) /*[clinic end generated code: output=080eb54f506e8301 input=38c8b375ca34a7e2]*/ { int result; +#ifdef HAVE_UNLINKAT + int unlinkat_unavailable = 0; +#endif if (PySys_Audit("os.rmdir", "Oi", path->object, dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { @@ -4468,14 +4712,26 @@ os_rmdir_impl(PyObject *module, path_t *path, int dir_fd) result = !RemoveDirectoryW(path->wide); #else #ifdef HAVE_UNLINKAT - if (dir_fd != DEFAULT_DIR_FD) + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_UNLINKAT_RUNTIME) { result = unlinkat(dir_fd, path->narrow, AT_REMOVEDIR); - else + } else { + unlinkat_unavailable = 1; + result = -1; + } + } else #endif result = rmdir(path->narrow); #endif Py_END_ALLOW_THREADS +#ifdef HAVE_UNLINKAT + if (unlinkat_unavailable) { + argument_unavailable_error("rmdir", "dir_fd"); + return NULL; + } +#endif + if (result) return path_error(path); @@ -4619,6 +4875,9 @@ os_unlink_impl(PyObject *module, path_t *path, int dir_fd) /*[clinic end generated code: output=621797807b9963b1 input=d7bcde2b1b2a2552]*/ { int result; +#ifdef HAVE_UNLINKAT + int unlinkat_unavailable = 0; +#endif if (PySys_Audit("os.remove", "Oi", path->object, dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { @@ -4632,15 +4891,27 @@ os_unlink_impl(PyObject *module, path_t *path, int dir_fd) result = !Py_DeleteFileW(path->wide); #else #ifdef HAVE_UNLINKAT - if (dir_fd != DEFAULT_DIR_FD) + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_UNLINKAT_RUNTIME) { + result = unlinkat(dir_fd, path->narrow, 0); - else + } else { + unlinkat_unavailable = 1; + } + } else #endif /* HAVE_UNLINKAT */ result = unlink(path->narrow); #endif _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS +#ifdef HAVE_UNLINKAT + if (unlinkat_unavailable) { + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (result) return path_error(path); @@ -4811,7 +5082,16 @@ typedef struct { static int utime_dir_fd(utime_t *ut, int dir_fd, const char *path, int follow_symlinks) { -#ifdef HAVE_UTIMENSAT +#if defined(__APPLE__) && defined(HAVE_UTIMENSAT) + if (HAVE_UTIMENSAT_RUNTIME) { + int flags = follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW; + UTIME_TO_TIMESPEC; + return utimensat(dir_fd, path, time, flags); + } else { + errno = ENOSYS; + return -1; + } +#elif defined(HAVE_UTIMENSAT) int flags = follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW; UTIME_TO_TIMESPEC; return utimensat(dir_fd, path, time, flags); @@ -4838,11 +5118,30 @@ static int utime_fd(utime_t *ut, int fd) { #ifdef HAVE_FUTIMENS + + if (HAVE_FUTIMENS_RUNTIME) { + UTIME_TO_TIMESPEC; return futimens(fd, time); -#else + + } else +#ifndef HAVE_FUTIMES + { + /* Not sure if this can happen */ + PyErr_SetString( + PyExc_RuntimeError, + "neither futimens nor futimes are supported" + " on this system"); + return -1; + } +#endif + +#endif +#ifdef HAVE_FUTIMES + { UTIME_TO_TIMEVAL; return futimes(fd, time); + } #endif } @@ -4861,11 +5160,27 @@ static int utime_nofollow_symlinks(utime_t *ut, const char *path) { #ifdef HAVE_UTIMENSAT - UTIME_TO_TIMESPEC; - return utimensat(DEFAULT_DIR_FD, path, time, AT_SYMLINK_NOFOLLOW); -#else + if (HAVE_UTIMENSAT_RUNTIME) { + UTIME_TO_TIMESPEC; + return utimensat(DEFAULT_DIR_FD, path, time, AT_SYMLINK_NOFOLLOW); + } else +#ifndef HAVE_LUTIMES + { + /* Not sure if this can happen */ + PyErr_SetString( + PyExc_RuntimeError, + "neither utimensat nor lutimes are supported" + " on this system"); + return -1; + } +#endif +#endif + +#ifdef HAVE_LUTIMES + { UTIME_TO_TIMEVAL; return lutimes(path, time); + } #endif } @@ -4876,7 +5191,15 @@ utime_nofollow_symlinks(utime_t *ut, const char *path) static int utime_default(utime_t *ut, const char *path) { -#ifdef HAVE_UTIMENSAT +#if defined(__APPLE__) && defined(HAVE_UTIMENSAT) + if (HAVE_UTIMENSAT_RUNTIME) { + UTIME_TO_TIMESPEC; + return utimensat(DEFAULT_DIR_FD, path, time, 0); + } else { + UTIME_TO_TIMEVAL; + return utimes(path, time); + } +#elif defined(HAVE_UTIMENSAT) UTIME_TO_TIMESPEC; return utimensat(DEFAULT_DIR_FD, path, time, 0); #elif defined(HAVE_UTIMES) @@ -5085,9 +5408,10 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, #endif #if defined(HAVE_FUTIMESAT) || defined(HAVE_UTIMENSAT) - if ((dir_fd != DEFAULT_DIR_FD) || (!follow_symlinks)) + if ((dir_fd != DEFAULT_DIR_FD) || (!follow_symlinks)) { result = utime_dir_fd(&utime, dir_fd, path->narrow, follow_symlinks); - else + + } else #endif #if defined(HAVE_FUTIMES) || defined(HAVE_FUTIMENS) @@ -5100,6 +5424,14 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, Py_END_ALLOW_THREADS +#if defined(__APPLE__) && defined(HAVE_UTIMENSAT) + /* See utime_dir_fd implementation */ + if (result == -1 && errno == ENOSYS) { + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (result < 0) { /* see previous comment about not putting filename in error here */ posix_error(); @@ -5498,6 +5830,9 @@ parse_posix_spawn_flags(PyObject *module, const char *func_name, PyObject *setpg } if (setsid) { +#ifdef HAVE_POSIX_SPAWN_SETSID_RUNTIME + if (HAVE_POSIX_SPAWN_SETSID_RUNTIME) { +#endif #ifdef POSIX_SPAWN_SETSID all_flags |= POSIX_SPAWN_SETSID; #elif defined(POSIX_SPAWN_SETSID_NP) @@ -5506,6 +5841,14 @@ parse_posix_spawn_flags(PyObject *module, const char *func_name, PyObject *setpg argument_unavailable_error(func_name, "setsid"); return -1; #endif + +#ifdef HAVE_POSIX_SPAWN_SETSID_RUNTIME + } else { + argument_unavailable_error(func_name, "setsid"); + return -1; + } +#endif /* HAVE_POSIX_SPAWN_SETSID_RUNTIME */ + } if (setsigmask) { @@ -8115,16 +8458,30 @@ os_readlink_impl(PyObject *module, path_t *path, int dir_fd) #if defined(HAVE_READLINK) char buffer[MAXPATHLEN+1]; ssize_t length; +#ifdef HAVE_READLINKAT + int readlinkat_unavailable = 0; +#endif Py_BEGIN_ALLOW_THREADS #ifdef HAVE_READLINKAT - if (dir_fd != DEFAULT_DIR_FD) - length = readlinkat(dir_fd, path->narrow, buffer, MAXPATHLEN); - else + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_READLINKAT_RUNTIME) { + length = readlinkat(dir_fd, path->narrow, buffer, MAXPATHLEN); + } else { + readlinkat_unavailable = 1; + } + } else #endif length = readlink(path->narrow, buffer, MAXPATHLEN); Py_END_ALLOW_THREADS +#ifdef HAVE_READLINKAT + if (readlinkat_unavailable) { + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (length < 0) { return path_error(path); } @@ -8320,6 +8677,9 @@ os_symlink_impl(PyObject *module, path_t *src, path_t *dst, static int windows_has_symlink_unprivileged_flag = TRUE; #else int result; +#ifdef HAVE_SYMLINKAT + int symlinkat_unavailable = 0; +#endif #endif if (PySys_Audit("os.symlink", "OOi", src->object, dst->object, @@ -8382,14 +8742,25 @@ os_symlink_impl(PyObject *module, path_t *src, path_t *dst, } Py_BEGIN_ALLOW_THREADS -#if HAVE_SYMLINKAT - if (dir_fd != DEFAULT_DIR_FD) - result = symlinkat(src->narrow, dir_fd, dst->narrow); - else +#ifdef HAVE_SYMLINKAT + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_SYMLINKAT_RUNTIME) { + result = symlinkat(src->narrow, dir_fd, dst->narrow); + } else { + symlinkat_unavailable = 1; + } + } else #endif result = symlink(src->narrow, dst->narrow); Py_END_ALLOW_THREADS +#ifdef HAVE_SYMLINKAT + if (symlinkat_unavailable) { + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (result) return path_error2(src, dst); #endif @@ -8660,6 +9031,9 @@ os_open_impl(PyObject *module, path_t *path, int flags, int mode, int dir_fd) { int fd; int async_err = 0; +#ifdef HAVE_OPENAT + int openat_unavailable = 0; +#endif #ifdef O_CLOEXEC int *atomic_flag_works = &_Py_open_cloexec_works; @@ -8684,9 +9058,15 @@ os_open_impl(PyObject *module, path_t *path, int flags, int mode, int dir_fd) fd = _wopen(path->wide, flags, mode); #else #ifdef HAVE_OPENAT - if (dir_fd != DEFAULT_DIR_FD) - fd = openat(dir_fd, path->narrow, flags, mode); - else + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_OPENAT_RUNTIME) { + fd = openat(dir_fd, path->narrow, flags, mode); + + } else { + openat_unavailable = 1; + fd = -1; + } + } else #endif /* HAVE_OPENAT */ fd = open(path->narrow, flags, mode); #endif /* !MS_WINDOWS */ @@ -8694,6 +9074,13 @@ os_open_impl(PyObject *module, path_t *path, int flags, int mode, int dir_fd) } while (fd < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); _Py_END_SUPPRESS_IPH +#ifdef HAVE_OPENAT + if (openat_unavailable) { + argument_unavailable_error(NULL, "dir_fd"); + return -1; + } +#endif + if (fd < 0) { if (!async_err) PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path->object); @@ -9233,12 +9620,25 @@ os_preadv_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset, } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); #else do { +#ifdef __APPLE__ +/* This entire function will be removed from the module dict when the API + * is not available. + */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" +#pragma clang diagnostic ignored "-Wunguarded-availability-new" +#endif Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH n = preadv(fd, iov, cnt, offset); _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); + +#ifdef __APPLE__ +#pragma clang diagnostic pop +#endif + #endif iov_cleanup(iov, buf, cnt); @@ -9846,6 +10246,15 @@ os_pwritev_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset, Py_END_ALLOW_THREADS } while (result < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); #else + +#ifdef __APPLE__ +/* This entire function will be removed from the module dict when the API + * is not available. + */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" +#pragma clang diagnostic ignored "-Wunguarded-availability-new" +#endif do { Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH @@ -9853,6 +10262,11 @@ os_pwritev_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset, _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS } while (result < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); + +#ifdef __APPLE__ +#pragma clang diagnostic pop +#endif + #endif iov_cleanup(iov, buf, cnt); @@ -10742,13 +11156,6 @@ os_statvfs_impl(PyObject *module, path_t *path) Py_BEGIN_ALLOW_THREADS #ifdef HAVE_FSTATVFS if (path->fd != -1) { -#ifdef __APPLE__ - /* handle weak-linking on Mac OS X 10.3 */ - if (fstatvfs == NULL) { - fd_specified("statvfs", path->fd); - return NULL; - } -#endif result = fstatvfs(path->fd, &st); } else @@ -12832,13 +13239,17 @@ _Py_COMP_DIAG_POP const char *path = PyBytes_AS_STRING(ub); if (self->dir_fd != DEFAULT_DIR_FD) { #ifdef HAVE_FSTATAT + if (HAVE_FSTATAT_RUNTIME) { result = fstatat(self->dir_fd, path, &st, follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW); -#else + } else + +#endif /* HAVE_FSTATAT */ + { Py_DECREF(ub); PyErr_SetString(PyExc_NotImplementedError, "can't fetch stat"); return NULL; -#endif /* HAVE_FSTATAT */ + } } else #endif @@ -13637,6 +14048,7 @@ os_scandir_impl(PyObject *module, path_t *path) errno = 0; #ifdef HAVE_FDOPENDIR if (iterator->path.fd != -1) { + if (HAVE_FDOPENDIR_RUNTIME) { /* closedir() closes the FD, so we duplicate it */ fd = _Py_dup(iterator->path.fd); if (fd == -1) @@ -13645,6 +14057,11 @@ os_scandir_impl(PyObject *module, path_t *path) Py_BEGIN_ALLOW_THREADS iterator->dirp = fdopendir(fd); Py_END_ALLOW_THREADS + } else { + PyErr_SetString(PyExc_TypeError, + "scandir: path should be string, bytes, os.PathLike or None, not int"); + return NULL; + } } else #endif @@ -14713,137 +15130,210 @@ all_ins(PyObject *m) } -static const char * const have_functions[] = { + +#define PROBE(name, test) \ + static int name(void) \ + { \ + if (test) { \ + return 1; \ + } else { \ + return 0; \ + } \ + } + +#ifdef HAVE_FSTATAT +PROBE(probe_fstatat, HAVE_FSTATAT_RUNTIME) +#endif #ifdef HAVE_FACCESSAT - "HAVE_FACCESSAT", +PROBE(probe_faccessat, HAVE_FACCESSAT_RUNTIME) +#endif + +#ifdef HAVE_FCHMODAT +PROBE(probe_fchmodat, HAVE_FCHMODAT_RUNTIME) +#endif + +#ifdef HAVE_FCHOWNAT +PROBE(probe_fchownat, HAVE_FCHOWNAT_RUNTIME) +#endif + +#ifdef HAVE_LINKAT +PROBE(probe_linkat, HAVE_LINKAT_RUNTIME) +#endif + +#ifdef HAVE_FDOPENDIR +PROBE(probe_fdopendir, HAVE_FDOPENDIR_RUNTIME) +#endif + +#ifdef HAVE_MKDIRAT +PROBE(probe_mkdirat, HAVE_MKDIRAT_RUNTIME) +#endif + +#ifdef HAVE_RENAMEAT +PROBE(probe_renameat, HAVE_RENAMEAT_RUNTIME) +#endif + +#ifdef HAVE_UNLINKAT +PROBE(probe_unlinkat, HAVE_UNLINKAT_RUNTIME) +#endif + +#ifdef HAVE_OPENAT +PROBE(probe_openat, HAVE_OPENAT_RUNTIME) +#endif + +#ifdef HAVE_READLINKAT +PROBE(probe_readlinkat, HAVE_READLINKAT_RUNTIME) +#endif + +#ifdef HAVE_SYMLINKAT +PROBE(probe_symlinkat, HAVE_SYMLINKAT_RUNTIME) +#endif + +#ifdef HAVE_FUTIMENS +PROBE(probe_futimens, HAVE_FUTIMENS_RUNTIME) +#endif + +#ifdef HAVE_UTIMENSAT +PROBE(probe_utimensat, HAVE_UTIMENSAT_RUNTIME) +#endif + + + + +static const struct have_function { + const char * const label; + int (*probe)(void); +} have_functions[] = { + +#ifdef HAVE_FACCESSAT + { "HAVE_FACCESSAT", probe_faccessat }, #endif #ifdef HAVE_FCHDIR - "HAVE_FCHDIR", + { "HAVE_FCHDIR", NULL }, #endif #ifdef HAVE_FCHMOD - "HAVE_FCHMOD", + { "HAVE_FCHMOD", NULL }, #endif #ifdef HAVE_FCHMODAT - "HAVE_FCHMODAT", + { "HAVE_FCHMODAT", probe_fchmodat }, #endif #ifdef HAVE_FCHOWN - "HAVE_FCHOWN", + { "HAVE_FCHOWN", NULL }, #endif #ifdef HAVE_FCHOWNAT - "HAVE_FCHOWNAT", + { "HAVE_FCHOWNAT", probe_fchownat }, #endif #ifdef HAVE_FEXECVE - "HAVE_FEXECVE", + { "HAVE_FEXECVE", NULL }, #endif #ifdef HAVE_FDOPENDIR - "HAVE_FDOPENDIR", + { "HAVE_FDOPENDIR", probe_fdopendir }, #endif #ifdef HAVE_FPATHCONF - "HAVE_FPATHCONF", + { "HAVE_FPATHCONF", NULL }, #endif #ifdef HAVE_FSTATAT - "HAVE_FSTATAT", + { "HAVE_FSTATAT", probe_fstatat }, #endif #ifdef HAVE_FSTATVFS - "HAVE_FSTATVFS", + { "HAVE_FSTATVFS", NULL }, #endif #if defined HAVE_FTRUNCATE || defined MS_WINDOWS - "HAVE_FTRUNCATE", + { "HAVE_FTRUNCATE", NULL }, #endif #ifdef HAVE_FUTIMENS - "HAVE_FUTIMENS", + { "HAVE_FUTIMENS", probe_futimens }, #endif #ifdef HAVE_FUTIMES - "HAVE_FUTIMES", + { "HAVE_FUTIMES", NULL }, #endif #ifdef HAVE_FUTIMESAT - "HAVE_FUTIMESAT", + { "HAVE_FUTIMESAT", NULL }, #endif #ifdef HAVE_LINKAT - "HAVE_LINKAT", + { "HAVE_LINKAT", probe_linkat }, #endif #ifdef HAVE_LCHFLAGS - "HAVE_LCHFLAGS", + { "HAVE_LCHFLAGS", NULL }, #endif #ifdef HAVE_LCHMOD - "HAVE_LCHMOD", + { "HAVE_LCHMOD", NULL }, #endif #ifdef HAVE_LCHOWN - "HAVE_LCHOWN", + { "HAVE_LCHOWN", NULL }, #endif #ifdef HAVE_LSTAT - "HAVE_LSTAT", + { "HAVE_LSTAT", NULL }, #endif #ifdef HAVE_LUTIMES - "HAVE_LUTIMES", + { "HAVE_LUTIMES", NULL }, #endif #ifdef HAVE_MEMFD_CREATE - "HAVE_MEMFD_CREATE", + { "HAVE_MEMFD_CREATE", NULL }, #endif #ifdef HAVE_MKDIRAT - "HAVE_MKDIRAT", + { "HAVE_MKDIRAT", probe_mkdirat }, #endif #ifdef HAVE_MKFIFOAT - "HAVE_MKFIFOAT", + { "HAVE_MKFIFOAT", NULL }, #endif #ifdef HAVE_MKNODAT - "HAVE_MKNODAT", + { "HAVE_MKNODAT", NULL }, #endif #ifdef HAVE_OPENAT - "HAVE_OPENAT", + { "HAVE_OPENAT", probe_openat }, #endif #ifdef HAVE_READLINKAT - "HAVE_READLINKAT", + { "HAVE_READLINKAT", probe_readlinkat }, #endif #ifdef HAVE_RENAMEAT - "HAVE_RENAMEAT", + { "HAVE_RENAMEAT", probe_renameat }, #endif #ifdef HAVE_SYMLINKAT - "HAVE_SYMLINKAT", + { "HAVE_SYMLINKAT", probe_symlinkat }, #endif #ifdef HAVE_UNLINKAT - "HAVE_UNLINKAT", + { "HAVE_UNLINKAT", probe_unlinkat }, #endif #ifdef HAVE_UTIMENSAT - "HAVE_UTIMENSAT", + { "HAVE_UTIMENSAT", probe_utimensat }, #endif #ifdef MS_WINDOWS - "MS_WINDOWS", + { "MS_WINDOWS", NULL }, #endif - NULL + { NULL, NULL } }; @@ -14852,6 +15342,23 @@ posixmodule_exec(PyObject *m) { _posixstate *state = get_posix_state(m); +#if defined(HAVE_PWRITEV) + if (HAVE_PWRITEV_RUNTIME) {} else { + PyObject* dct = PyModule_GetDict(m); + + if (dct == NULL) { + return -1; + } + + if (PyDict_DelItemString(dct, "pwritev") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "preadv") == -1) { + PyErr_Clear(); + } + } +#endif + /* Initialize environ dictionary */ PyObject *v = convertenviron(); Py_XINCREF(v); @@ -14964,44 +15471,6 @@ posixmodule_exec(PyObject *m) PyModule_AddObject(m, "uname_result", (PyObject *)UnameResultType); state->UnameResultType = (PyObject *)UnameResultType; -#ifdef __APPLE__ - /* - * Step 2 of weak-linking support on Mac OS X. - * - * The code below removes functions that are not available on the - * currently active platform. - * - * This block allow one to use a python binary that was build on - * OSX 10.4 on OSX 10.3, without losing access to new APIs on - * OSX 10.4. - */ -#ifdef HAVE_FSTATVFS - if (fstatvfs == NULL) { - if (PyObject_DelAttrString(m, "fstatvfs") == -1) { - return -1; - } - } -#endif /* HAVE_FSTATVFS */ - -#ifdef HAVE_STATVFS - if (statvfs == NULL) { - if (PyObject_DelAttrString(m, "statvfs") == -1) { - return -1; - } - } -#endif /* HAVE_STATVFS */ - -# ifdef HAVE_LCHOWN - if (lchown == NULL) { - if (PyObject_DelAttrString(m, "lchown") == -1) { - return -1; - } - } -#endif /* HAVE_LCHOWN */ - - -#endif /* __APPLE__ */ - if ((state->billion = PyLong_FromLong(1000000000)) == NULL) return -1; #if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) @@ -15031,14 +15500,17 @@ posixmodule_exec(PyObject *m) if (!list) { return -1; } - for (const char * const *trace = have_functions; *trace; trace++) { - PyObject *unicode = PyUnicode_DecodeASCII(*trace, strlen(*trace), NULL); + for (const struct have_function *trace = have_functions; trace->label; trace++) { + PyObject *unicode; + if (trace->probe && !trace->probe()) continue; + unicode = PyUnicode_DecodeASCII(trace->label, strlen(trace->label), NULL); if (!unicode) return -1; if (PyList_Append(list, unicode)) return -1; Py_DECREF(unicode); } + PyModule_AddObject(m, "_have_functions", list); return 0; diff --git a/Modules/timemodule.c b/Modules/timemodule.c index eb192c5e7fd31e..80eab30c95d6f0 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -51,6 +51,15 @@ #define _Py_tzname tzname #endif +#if defined(__APPLE__ ) && defined(__has_builtin) +# if __has_builtin(__builtin_available) +# define HAVE_CLOCK_GETTIME_RUNTIME __builtin_available(macOS 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *) +# endif +#endif +#ifndef HAVE_CLOCK_GETTIME_RUNTIME +# define HAVE_CLOCK_GETTIME_RUNTIME 1 +#endif + #define SEC_TO_NS (1000 * 1000 * 1000) /* Forward declarations */ @@ -149,6 +158,16 @@ perf_counter(_Py_clock_info_t *info) } #ifdef HAVE_CLOCK_GETTIME + +#ifdef __APPLE__ +/* + * The clock_* functions will be removed from the module + * dict entirely when the C API is not available. + */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" +#endif + static PyObject * time_clock_gettime(PyObject *self, PyObject *args) { @@ -297,6 +316,11 @@ PyDoc_STRVAR(clock_getres_doc, "clock_getres(clk_id) -> floating point number\n\ \n\ Return the resolution (precision) of the specified clock clk_id."); + +#ifdef __APPLE__ +#pragma clang diagnostic pop +#endif + #endif /* HAVE_CLOCK_GETRES */ #ifdef HAVE_PTHREAD_GETCPUCLOCKID @@ -1162,31 +1186,35 @@ _PyTime_GetProcessTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) #if defined(HAVE_CLOCK_GETTIME) \ && (defined(CLOCK_PROCESS_CPUTIME_ID) || defined(CLOCK_PROF)) struct timespec ts; + + if (HAVE_CLOCK_GETTIME_RUNTIME) { + #ifdef CLOCK_PROF - const clockid_t clk_id = CLOCK_PROF; - const char *function = "clock_gettime(CLOCK_PROF)"; + const clockid_t clk_id = CLOCK_PROF; + const char *function = "clock_gettime(CLOCK_PROF)"; #else - const clockid_t clk_id = CLOCK_PROCESS_CPUTIME_ID; - const char *function = "clock_gettime(CLOCK_PROCESS_CPUTIME_ID)"; + const clockid_t clk_id = CLOCK_PROCESS_CPUTIME_ID; + const char *function = "clock_gettime(CLOCK_PROCESS_CPUTIME_ID)"; #endif - if (clock_gettime(clk_id, &ts) == 0) { - if (info) { - struct timespec res; - info->implementation = function; - info->monotonic = 1; - info->adjustable = 0; - if (clock_getres(clk_id, &res)) { - PyErr_SetFromErrno(PyExc_OSError); - return -1; + if (clock_gettime(clk_id, &ts) == 0) { + if (info) { + struct timespec res; + info->implementation = function; + info->monotonic = 1; + info->adjustable = 0; + if (clock_getres(clk_id, &res)) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + info->resolution = res.tv_sec + res.tv_nsec * 1e-9; } - info->resolution = res.tv_sec + res.tv_nsec * 1e-9; - } - if (_PyTime_FromTimespec(tp, &ts) < 0) { - return -1; + if (_PyTime_FromTimespec(tp, &ts) < 0) { + return -1; + } + return 0; } - return 0; } #endif @@ -1390,6 +1418,16 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) #elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) #define HAVE_THREAD_TIME + +#if defined(__APPLE__) && defined(__has_attribute) && __has_attribute(availability) +static int +_PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) + __attribute__((availability(macos, introduced=10.12))) + __attribute__((availability(ios, introduced=10.0))) + __attribute__((availability(tvos, introduced=10.0))) + __attribute__((availability(watchos, introduced=3.0))); +#endif + static int _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) { @@ -1421,6 +1459,15 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) #endif #ifdef HAVE_THREAD_TIME +#ifdef __APPLE__ +/* + * The clock_* functions will be removed from the module + * dict entirely when the C API is not available. + */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" +#endif + static PyObject * time_thread_time(PyObject *self, PyObject *unused) { @@ -1451,6 +1498,11 @@ PyDoc_STRVAR(thread_time_ns_doc, \n\ Thread time for profiling as nanoseconds:\n\ sum of the kernel and user-space CPU time."); + +#ifdef __APPLE__ +#pragma clang diagnostic pop +#endif + #endif @@ -1500,9 +1552,19 @@ time_get_clock_info(PyObject *self, PyObject *args) } #ifdef HAVE_THREAD_TIME else if (strcmp(name, "thread_time") == 0) { - if (_PyTime_GetThreadTimeWithInfo(&t, &info) < 0) { + +#ifdef __APPLE__ + if (HAVE_CLOCK_GETTIME_RUNTIME) { +#endif + if (_PyTime_GetThreadTimeWithInfo(&t, &info) < 0) { + return NULL; + } +#ifdef __APPLE__ + } else { + PyErr_SetString(PyExc_ValueError, "unknown clock"); return NULL; } +#endif } #endif else { @@ -1783,68 +1845,116 @@ if it is -1, mktime() should guess based on the date and time.\n"); static int time_exec(PyObject *module) { +#if defined(__APPLE__) && defined(HAVE_CLOCK_GETTIME) + if (HAVE_CLOCK_GETTIME_RUNTIME) { + /* pass: ^^^ cannot use '!' here */ + } else { + PyObject* dct = PyModule_GetDict(module); + if (dct == NULL) { + return -1; + } + + if (PyDict_DelItemString(dct, "clock_gettime") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "clock_gettime_ns") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "clock_settime") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "clock_settime_ns") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "clock_getres") == -1) { + PyErr_Clear(); + } + } +#endif +#if defined(__APPLE__) && defined(HAVE_THREAD_TIME) + if (HAVE_CLOCK_GETTIME_RUNTIME) { + /* pass: ^^^ cannot use '!' here */ + } else { + PyObject* dct = PyModule_GetDict(module); + + if (PyDict_DelItemString(dct, "thread_time") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "thread_time_ns") == -1) { + PyErr_Clear(); + } + } +#endif /* Set, or reset, module variables like time.timezone */ if (init_timezone(module) < 0) { return -1; } #if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_SETTIME) || defined(HAVE_CLOCK_GETRES) + if (HAVE_CLOCK_GETTIME_RUNTIME) { #ifdef CLOCK_REALTIME - if (PyModule_AddIntMacro(module, CLOCK_REALTIME) < 0) { - return -1; - } + if (PyModule_AddIntMacro(module, CLOCK_REALTIME) < 0) { + return -1; + } #endif + #ifdef CLOCK_MONOTONIC - if (PyModule_AddIntMacro(module, CLOCK_MONOTONIC) < 0) { - return -1; - } + + if (PyModule_AddIntMacro(module, CLOCK_MONOTONIC) < 0) { + return -1; + } + #endif #ifdef CLOCK_MONOTONIC_RAW - if (PyModule_AddIntMacro(module, CLOCK_MONOTONIC_RAW) < 0) { - return -1; - } + if (PyModule_AddIntMacro(module, CLOCK_MONOTONIC_RAW) < 0) { + return -1; + } #endif + #ifdef CLOCK_HIGHRES - if (PyModule_AddIntMacro(module, CLOCK_HIGHRES) < 0) { - return -1; - } + if (PyModule_AddIntMacro(module, CLOCK_HIGHRES) < 0) { + return -1; + } #endif #ifdef CLOCK_PROCESS_CPUTIME_ID - if (PyModule_AddIntMacro(module, CLOCK_PROCESS_CPUTIME_ID) < 0) { - return -1; - } + if (PyModule_AddIntMacro(module, CLOCK_PROCESS_CPUTIME_ID) < 0) { + return -1; + } #endif + #ifdef CLOCK_THREAD_CPUTIME_ID - if (PyModule_AddIntMacro(module, CLOCK_THREAD_CPUTIME_ID) < 0) { - return -1; - } + if (PyModule_AddIntMacro(module, CLOCK_THREAD_CPUTIME_ID) < 0) { + return -1; + } #endif #ifdef CLOCK_PROF - if (PyModule_AddIntMacro(module, CLOCK_PROF) < 0) { - return -1; - } + if (PyModule_AddIntMacro(module, CLOCK_PROF) < 0) { + return -1; + } #endif #ifdef CLOCK_BOOTTIME - if (PyModule_AddIntMacro(module, CLOCK_BOOTTIME) < 0) { - return -1; - } + if (PyModule_AddIntMacro(module, CLOCK_BOOTTIME) < 0) { + return -1; + } #endif #ifdef CLOCK_TAI - if (PyModule_AddIntMacro(module, CLOCK_TAI) < 0) { - return -1; - } + if (PyModule_AddIntMacro(module, CLOCK_TAI) < 0) { + return -1; + } #endif #ifdef CLOCK_UPTIME - if (PyModule_AddIntMacro(module, CLOCK_UPTIME) < 0) { - return -1; - } + if (PyModule_AddIntMacro(module, CLOCK_UPTIME) < 0) { + return -1; + } #endif #ifdef CLOCK_UPTIME_RAW - if (PyModule_AddIntMacro(module, CLOCK_UPTIME_RAW) < 0) { - return -1; - } + + if (PyModule_AddIntMacro(module, CLOCK_UPTIME_RAW) < 0) { + return -1; + } #endif + } #endif /* defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_SETTIME) || defined(HAVE_CLOCK_GETRES) */ diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c index 47369305ee88e9..a212f69870ed10 100644 --- a/Python/bootstrap_hash.c +++ b/Python/bootstrap_hash.c @@ -25,6 +25,16 @@ # include #endif +#if defined(__APPLE__) && defined(__has_builtin) +# if __has_builtin(__builtin_available) +# define HAVE_GETENTRYPY_GETRANDOM_RUNTIME __builtin_available(macOS 10.12, iOS 10.10, tvOS 10.0, watchOS 3.0, *) +# endif +#endif +#ifndef HAVE_GETENTRYPY_GETRANDOM_RUNTIME +# define HAVE_GETENTRYPY_GETRANDOM_RUNTIME 1 +#endif + + #ifdef Py_DEBUG int _Py_HashSecret_Initialized = 0; #else @@ -208,6 +218,16 @@ py_getrandom(void *buffer, Py_ssize_t size, int blocking, int raise) error. getentropy() is retried if it failed with EINTR: interrupted by a signal. */ + +#if defined(__APPLE__) && defined(__has_attribute) && __has_attribute(availability) +static int +py_getentropy(char *buffer, Py_ssize_t size, int raise) + __attribute__((availability(macos,introduced=10.12))) + __attribute__((availability(ios,introduced=10.0))) + __attribute__((availability(tvos,introduced=10.0))) + __attribute__((availability(watchos,introduced=3.0))); +#endif + static int py_getentropy(char *buffer, Py_ssize_t size, int raise) { @@ -498,19 +518,21 @@ pyurandom(void *buffer, Py_ssize_t size, int blocking, int raise) #else #if defined(PY_GETRANDOM) || defined(PY_GETENTROPY) + if (HAVE_GETENTRYPY_GETRANDOM_RUNTIME) { #ifdef PY_GETRANDOM - res = py_getrandom(buffer, size, blocking, raise); + res = py_getrandom(buffer, size, blocking, raise); #else - res = py_getentropy(buffer, size, raise); + res = py_getentropy(buffer, size, raise); #endif - if (res < 0) { - return -1; - } - if (res == 1) { - return 0; - } - /* getrandom() or getentropy() function is not available: failed with - ENOSYS or EPERM. Fall back on reading from /dev/urandom. */ + if (res < 0) { + return -1; + } + if (res == 1) { + return 0; + } + /* getrandom() or getentropy() function is not available: failed with + ENOSYS or EPERM. Fall back on reading from /dev/urandom. */ + } /* end of availability block */ #endif return dev_urandom(buffer, size, raise); diff --git a/Python/pytime.c b/Python/pytime.c index b121b432f428d7..89d63e080422b3 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -5,6 +5,12 @@ #if defined(__APPLE__) #include /* mach_absolute_time(), mach_timebase_info() */ + +#if defined(__APPLE__) && defined(__has_builtin) +# if __has_builtin(__builtin_available) +# define HAVE_CLOCK_GETTIME_RUNTIME __builtin_available(macOS 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *) +# endif +#endif #endif #define _PyTime_check_mul_overflow(a, b) \ @@ -683,15 +689,22 @@ pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise) #else /* MS_WINDOWS */ int err; -#ifdef HAVE_CLOCK_GETTIME +#if defined(HAVE_CLOCK_GETTIME) struct timespec ts; -#else +#endif + +#if !defined(HAVE_CLOCK_GETTIME) || defined(__APPLE__) struct timeval tv; #endif assert(info == NULL || raise); #ifdef HAVE_CLOCK_GETTIME + +#ifdef HAVE_CLOCK_GETTIME_RUNTIME + if (HAVE_CLOCK_GETTIME_RUNTIME) { +#endif + err = clock_gettime(CLOCK_REALTIME, &ts); if (err) { if (raise) { @@ -715,7 +728,14 @@ pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise) info->resolution = 1e-9; } } -#else /* HAVE_CLOCK_GETTIME */ + +#ifdef HAVE_CLOCK_GETTIME_RUNTIME + } else { +#endif + +#endif + +#if !defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_GETTIME_RUNTIME) /* test gettimeofday() */ err = gettimeofday(&tv, (struct timezone *)NULL); @@ -735,6 +755,11 @@ pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise) info->monotonic = 0; info->adjustable = 1; } + +#if defined(HAVE_CLOCK_GETTIME_RUNTIME) && defined(HAVE_CLOCK_GETTIME) + } /* end of availibity block */ +#endif + #endif /* !HAVE_CLOCK_GETTIME */ #endif /* !MS_WINDOWS */ return 0; diff --git a/configure b/configure index bc87485bf516d1..68d692d0f6785c 100755 --- a/configure +++ b/configure @@ -1511,8 +1511,8 @@ Optional Packages: specify the kind of universal binary that should be created. this option is only valid when --enable-universalsdk is set; options are: - ("32-bit", "64-bit", "3-way", "intel", "intel-32", - "intel-64", or "all") see Mac/README.rst + ("universal2", "32-bit", "64-bit", "3-way", "intel", + "intel-32", "intel-64", or "all") see Mac/README.rst --with-framework-name=FRAMEWORK specify the name for the python framework on macOS only valid when --enable-framework is set. see @@ -7002,7 +7002,7 @@ fi -# The -arch flags for universal builds on OSX +# The -arch flags for universal builds on macOS UNIVERSAL_ARCH_FLAGS= @@ -7529,6 +7529,11 @@ $as_echo "$CC" >&6; } LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ;; + universal2) + UNIVERSAL_ARCH_FLAGS="-arch arm64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + ;; intel) UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" LIPO_32BIT_FLAGS="-extract i386" @@ -7550,7 +7555,7 @@ $as_echo "$CC" >&6; } ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ;; *) - as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 + as_fn_error $? "proper usage is --with-universal-arch=universal2|32-bit|64-bit|all|intel|3-way" "$LINENO" 5 ;; esac @@ -9382,7 +9387,7 @@ fi MACOSX_DEFAULT_ARCH="ppc" ;; *) - as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 + as_fn_error $? "Unexpected output of 'arch' on macOS" "$LINENO" 5 ;; esac else @@ -9392,9 +9397,12 @@ fi ;; ppc) MACOSX_DEFAULT_ARCH="ppc64" + ;; + arm64) + MACOSX_DEFAULT_ARCH="arm64" ;; *) - as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 + as_fn_error $? "Unexpected output of 'arch' on macOS" "$LINENO" 5 ;; esac @@ -12029,6 +12037,31 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _dyld_shared_cache_contains_path" >&5 +$as_echo_n "checking for _dyld_shared_cache_contains_path... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +void *x=_dyld_shared_cache_contains_path + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext diff --git a/configure.ac b/configure.ac index 49ed09a3a009bf..1edafc342b7120 100644 --- a/configure.ac +++ b/configure.ac @@ -218,7 +218,7 @@ AC_ARG_WITH(universal-archs, AS_HELP_STRING([--with-universal-archs=ARCH], [specify the kind of universal binary that should be created. this option is only valid when --enable-universalsdk is set; options are: - ("32-bit", "64-bit", "3-way", "intel", "intel-32", "intel-64", or "all") + ("universal2", "32-bit", "64-bit", "3-way", "intel", "intel-32", "intel-64", or "all") see Mac/README.rst]), [ UNIVERSAL_ARCHS="$withval" @@ -1597,7 +1597,7 @@ AC_SUBST(BASECFLAGS) AC_SUBST(CFLAGS_NODIST) AC_SUBST(LDFLAGS_NODIST) -# The -arch flags for universal builds on OSX +# The -arch flags for universal builds on macOS UNIVERSAL_ARCH_FLAGS= AC_SUBST(UNIVERSAL_ARCH_FLAGS) @@ -1898,6 +1898,11 @@ yes) LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ;; + universal2) + UNIVERSAL_ARCH_FLAGS="-arch arm64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + ;; intel) UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" LIPO_32BIT_FLAGS="-extract i386" @@ -1919,7 +1924,7 @@ yes) ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ;; *) - AC_MSG_ERROR([proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way]) + AC_MSG_ERROR([proper usage is --with-universal-arch=universal2|32-bit|64-bit|all|intel|3-way]) ;; esac @@ -2489,7 +2494,7 @@ case $ac_sys_system/$ac_sys_release in MACOSX_DEFAULT_ARCH="ppc" ;; *) - AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) + AC_MSG_ERROR([Unexpected output of 'arch' on macOS]) ;; esac else @@ -2499,9 +2504,12 @@ case $ac_sys_system/$ac_sys_release in ;; ppc) MACOSX_DEFAULT_ARCH="ppc64" + ;; + arm64) + MACOSX_DEFAULT_ARCH="arm64" ;; *) - AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) + AC_MSG_ERROR([Unexpected output of 'arch' on macOS]) ;; esac @@ -3774,6 +3782,12 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) ]) +AC_MSG_CHECKING(for _dyld_shared_cache_contains_path) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[void *x=_dyld_shared_cache_contains_path]])], + [AC_DEFINE(HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH, 1, Define if you have the '_dyld_shared_cache_contains_path' function.) + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) +]) AC_MSG_CHECKING(for memfd_create) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ diff --git a/pyconfig.h.in b/pyconfig.h.in index af8a3d6d9c370d..d71ad3fdc8684c 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -784,6 +784,9 @@ /* Define if you have the 'prlimit' functions. */ #undef HAVE_PRLIMIT +/* Define if you have the '_dyld_shared_cache_contains_path' function. */ +#undef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH + /* Define to 1 if you have the header file. */ #undef HAVE_PROCESS_H diff --git a/setup.py b/setup.py index b3f47603f7ad69..c12b5f5042551a 100644 --- a/setup.py +++ b/setup.py @@ -239,6 +239,13 @@ def is_macosx_sdk_path(path): or path.startswith('/Library/') ) +def grep_headers_for(function, headers): + for header in headers: + with open(header, 'r') as f: + if function in f.read(): + return True + return False + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -2105,43 +2112,17 @@ def detect_tkinter(self): library_dirs=added_lib_dirs)) return True - def configure_ctypes_darwin(self, ext): - # Darwin (OS X) uses preconfigured files, in - # the Modules/_ctypes/libffi_osx directory. - ffi_srcdir = os.path.abspath(os.path.join(self.srcdir, 'Modules', - '_ctypes', 'libffi_osx')) - sources = [os.path.join(ffi_srcdir, p) - for p in ['ffi.c', - 'x86/darwin64.S', - 'x86/x86-darwin.S', - 'x86/x86-ffi_darwin.c', - 'x86/x86-ffi64.c', - 'powerpc/ppc-darwin.S', - 'powerpc/ppc-darwin_closure.S', - 'powerpc/ppc-ffi_darwin.c', - 'powerpc/ppc64-darwin_closure.S', - ]] - - # Add .S (preprocessed assembly) to C compiler source extensions. - self.compiler.src_extensions.append('.S') - - include_dirs = [os.path.join(ffi_srcdir, 'include'), - os.path.join(ffi_srcdir, 'powerpc')] - ext.include_dirs.extend(include_dirs) - ext.sources.extend(sources) - return True - def configure_ctypes(self, ext): - if not self.use_system_libffi: - if MACOS: - return self.configure_ctypes_darwin(ext) - print('INFO: Could not locate ffi libs and/or headers') - return False return True def detect_ctypes(self): # Thomas Heller's _ctypes module - self.use_system_libffi = False + + if (not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and MACOS): + self.use_system_libffi = True + else: + self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") + include_dirs = [] extra_compile_args = ['-DPy_BUILD_CORE_MODULE'] extra_link_args = [] @@ -2154,11 +2135,9 @@ def detect_ctypes(self): if MACOS: sources.append('_ctypes/malloc_closure.c') - sources.append('_ctypes/darwin/dlfcn_simple.c') + extra_compile_args.append('-DUSING_MALLOC_CLOSURE_DOT_C=1') extra_compile_args.append('-DMACOSX') include_dirs.append('_ctypes/darwin') - # XXX Is this still needed? - # extra_link_args.extend(['-read_only_relocs', 'warning']) elif HOST_PLATFORM == 'sunos5': # XXX This shouldn't be necessary; it appears that some @@ -2188,31 +2167,48 @@ def detect_ctypes(self): sources=['_ctypes/_ctypes_test.c'], libraries=['m'])) + ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") + ffi_lib = None + ffi_inc_dirs = self.inc_dirs.copy() if MACOS: - if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): - return - # OS X 10.5 comes with libffi.dylib; the include files are - # in /usr/include/ffi - ffi_inc_dirs.append('/usr/include/ffi') - - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] - if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], ffi_inc_dirs) - if ffi_inc is not None: - ffi_h = ffi_inc[0] + '/ffi.h' + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + + if not ffi_inc: + if os.path.exists(ffi_in_sdk): + ext.extra_compile_args.append("-DUSING_APPLE_OS_LIBFFI=1") + ffi_inc = ffi_in_sdk + ffi_lib = 'ffi' + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + ffi_inc_dirs.append('/usr/include/ffi') + + if not ffi_inc: + found = find_file('ffi.h', [], ffi_inc_dirs) + if found: + ffi_inc = found[0] + if ffi_inc: + ffi_h = ffi_inc + '/ffi.h' if not os.path.exists(ffi_h): ffi_inc = None print('Header file {} does not exist'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: + if ffi_lib is None and ffi_inc: for lib_name in ('ffi', 'ffi_pic'): if (self.compiler.find_library_file(self.lib_dirs, lib_name)): ffi_lib = lib_name break if ffi_inc and ffi_lib: - ext.include_dirs.extend(ffi_inc) + ffi_headers = glob(os.path.join(ffi_inc, '*.h')) + if grep_headers_for('ffi_prep_cif_var', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") + if grep_headers_for('ffi_prep_closure_loc', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CLOSURE_LOC=1") + if grep_headers_for('ffi_closure_alloc', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_CLOSURE_ALLOC=1") + + ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) self.use_system_libffi = True From db9de339946031f8f2a292294701eea5dfb2ecde Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sun, 8 Nov 2020 10:46:55 +0100 Subject: [PATCH 0491/1261] bpo-41754: Ignore NotADirectoryError in invocation of xdg-settings (GH-23075) It is not clear why this can happen, but several users have mentioned getting this exception on macOS. --- Lib/webbrowser.py | 2 +- .../next/Library/2020-11-01-15-07-20.bpo-41754.DraSZh.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-01-15-07-20.bpo-41754.DraSZh.rst diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py index cea91308ce1b30..6023c1e13841d2 100755 --- a/Lib/webbrowser.py +++ b/Lib/webbrowser.py @@ -550,7 +550,7 @@ def register_standard_browsers(): cmd = "xdg-settings get default-web-browser".split() raw_result = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) result = raw_result.decode().strip() - except (FileNotFoundError, subprocess.CalledProcessError, PermissionError) : + except (FileNotFoundError, subprocess.CalledProcessError, PermissionError, NotADirectoryError) : pass else: global _os_preferred_browser diff --git a/Misc/NEWS.d/next/Library/2020-11-01-15-07-20.bpo-41754.DraSZh.rst b/Misc/NEWS.d/next/Library/2020-11-01-15-07-20.bpo-41754.DraSZh.rst new file mode 100644 index 00000000000000..181c2d9650a14c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-01-15-07-20.bpo-41754.DraSZh.rst @@ -0,0 +1 @@ +webbrowser: Ignore *NotADirectoryError* when calling ``xdg-settings``. From da66b1297363d69fa8e9c7031e3432046b2f2a8c Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Mon, 9 Nov 2020 12:00:13 +0800 Subject: [PATCH 0492/1261] bpo-42233: Add union type expression support for GenericAlias and fix de-duplicating of GenericAlias (GH-23077) --- Include/internal/pycore_unionobject.h | 1 + Lib/test/test_types.py | 22 +++++++++++++++++++ .../2020-11-01-23-34-56.bpo-42233.zOSzja.rst | 5 +++++ Objects/genericaliasobject.c | 6 +++++ Objects/typeobject.c | 14 ++---------- Objects/unionobject.c | 20 ++++++++++++----- 6 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-01-23-34-56.bpo-42233.zOSzja.rst diff --git a/Include/internal/pycore_unionobject.h b/Include/internal/pycore_unionobject.h index fa8ba6ed944c1a..4d82b6fbeae8b5 100644 --- a/Include/internal/pycore_unionobject.h +++ b/Include/internal/pycore_unionobject.h @@ -10,6 +10,7 @@ extern "C" { PyAPI_FUNC(PyObject *) _Py_Union(PyObject *args); PyAPI_DATA(PyTypeObject) _Py_UnionType; +PyAPI_FUNC(PyObject *) _Py_union_type_or(PyObject* self, PyObject* param); #ifdef __cplusplus } diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 75c5eee42dc543..3058a02d6eeb4a 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -713,6 +713,28 @@ def test_or_type_repr(self): assert repr(int | None) == "int | None" assert repr(int | typing.GenericAlias(list, int)) == "int | list[int]" + def test_or_type_operator_with_genericalias(self): + a = list[int] + b = list[str] + c = dict[float, str] + # equivalence with typing.Union + self.assertEqual(a | b | c, typing.Union[a, b, c]) + # de-duplicate + self.assertEqual(a | c | b | b | a | c, a | b | c) + # order shouldn't matter + self.assertEqual(a | b, b | a) + self.assertEqual(repr(a | b | c), + "list[int] | list[str] | dict[float, str]") + + class BadType(type): + def __eq__(self, other): + return 1 / 0 + + bt = BadType('bt', (), {}) + # Comparison should fail and errors should propagate out for bad types. + with self.assertRaises(ZeroDivisionError): + list[int] | list[bt] + def test_ellipsis_type(self): self.assertIsInstance(Ellipsis, types.EllipsisType) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-01-23-34-56.bpo-42233.zOSzja.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-01-23-34-56.bpo-42233.zOSzja.rst new file mode 100644 index 00000000000000..499bb324fb935e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-01-23-34-56.bpo-42233.zOSzja.rst @@ -0,0 +1,5 @@ +Allow ``GenericAlias`` objects to use :ref:`union type expressions `. +This allows expressions like ``list[int] | dict[float, str]`` where previously a +``TypeError`` would have been thrown. This also fixes union type expressions +not de-duplicating ``GenericAlias`` objects. (Contributed by Ken Jin in +:issue:`42233`.) diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 6508c69cbf7e36..28ea487a44f55f 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -2,6 +2,7 @@ #include "Python.h" #include "pycore_object.h" +#include "pycore_unionobject.h" // _Py_union_as_number #include "structmember.h" // PyMemberDef typedef struct { @@ -573,6 +574,10 @@ ga_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return Py_GenericAlias(origin, arguments); } +static PyNumberMethods ga_as_number = { + .nb_or = (binaryfunc)_Py_union_type_or, // Add __or__ function +}; + // TODO: // - argument clinic? // - __doc__? @@ -586,6 +591,7 @@ PyTypeObject Py_GenericAliasType = { .tp_basicsize = sizeof(gaobject), .tp_dealloc = ga_dealloc, .tp_repr = ga_repr, + .tp_as_number = &ga_as_number, // allow X | Y of GenericAlias objs .tp_as_mapping = &ga_as_mapping, .tp_hash = ga_hash, .tp_call = ga_call, diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 3822b8cf813cfb..55bf9b3f389273 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -6,7 +6,7 @@ #include "pycore_object.h" #include "pycore_pyerrors.h" #include "pycore_pystate.h" // _PyThreadState_GET() -#include "pycore_unionobject.h" // _Py_Union() +#include "pycore_unionobject.h" // _Py_Union(), _Py_union_type_or #include "frameobject.h" #include "structmember.h" // PyMemberDef @@ -3789,19 +3789,9 @@ type_is_gc(PyTypeObject *type) return type->tp_flags & Py_TPFLAGS_HEAPTYPE; } -static PyObject * -type_or(PyTypeObject* self, PyObject* param) { - PyObject *tuple = PyTuple_Pack(2, self, param); - if (tuple == NULL) { - return NULL; - } - PyObject *new_union = _Py_Union(tuple); - Py_DECREF(tuple); - return new_union; -} static PyNumberMethods type_as_number = { - .nb_or = (binaryfunc)type_or, // Add __or__ function + .nb_or = _Py_union_type_or, // Add __or__ function }; PyTypeObject PyType_Type = { diff --git a/Objects/unionobject.c b/Objects/unionobject.c index 1b7f8ab51a4ce2..2308bfc9f2a278 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -237,9 +237,19 @@ dedup_and_flatten_args(PyObject* args) PyObject* i_element = PyTuple_GET_ITEM(args, i); for (Py_ssize_t j = i + 1; j < arg_length; j++) { PyObject* j_element = PyTuple_GET_ITEM(args, j); - if (i_element == j_element) { - is_duplicate = 1; + int is_ga = Py_TYPE(i_element) == &Py_GenericAliasType && + Py_TYPE(j_element) == &Py_GenericAliasType; + // RichCompare to also deduplicate GenericAlias types (slower) + is_duplicate = is_ga ? PyObject_RichCompareBool(i_element, j_element, Py_EQ) + : i_element == j_element; + // Should only happen if RichCompare fails + if (is_duplicate < 0) { + Py_DECREF(args); + Py_DECREF(new_args); + return NULL; } + if (is_duplicate) + break; } if (!is_duplicate) { Py_INCREF(i_element); @@ -290,8 +300,8 @@ is_unionable(PyObject *obj) type == &_Py_UnionType); } -static PyObject * -type_or(PyTypeObject* self, PyObject* param) +PyObject * +_Py_union_type_or(PyObject* self, PyObject* param) { PyObject *tuple = PyTuple_Pack(2, self, param); if (tuple == NULL) { @@ -404,7 +414,7 @@ static PyMethodDef union_methods[] = { {0}}; static PyNumberMethods union_as_number = { - .nb_or = (binaryfunc)type_or, // Add __or__ function + .nb_or = _Py_union_type_or, // Add __or__ function }; PyTypeObject _Py_UnionType = { From 99911cddfdce02b7bf54885827ef8d25ef85bb2f Mon Sep 17 00:00:00 2001 From: Ammar Askar Date: Mon, 9 Nov 2020 02:02:39 -0500 Subject: [PATCH 0493/1261] bpo-40624: Add support for the XPath != operator in xml.etree (GH-22147) --- Doc/library/xml.etree.elementtree.rst | 18 ++++++++++ Lib/test/test_xml_etree.py | 35 +++++++++++++++++++ Lib/xml/etree/ElementPath.py | 31 ++++++++++++---- .../2020-09-08-03-19-04.bpo-40624.0-gYfx.rst | 1 + 4 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-08-03-19-04.bpo-40624.0-gYfx.rst diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index f4bccf6609810e..87f4ee347d604d 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -455,6 +455,12 @@ Supported XPath syntax | | has the given value. The value cannot contain | | | quotes. | +-----------------------+------------------------------------------------------+ +| ``[@attrib!='value']``| Selects all elements for which the given attribute | +| | does not have the given value. The value cannot | +| | contain quotes. | +| | | +| | .. versionadded:: 3.10 | ++-----------------------+------------------------------------------------------+ | ``[tag]`` | Selects all elements that have a child named | | | ``tag``. Only immediate children are supported. | +-----------------------+------------------------------------------------------+ @@ -463,10 +469,22 @@ Supported XPath syntax | | | | | .. versionadded:: 3.7 | +-----------------------+------------------------------------------------------+ +| ``[.!='text']`` | Selects all elements whose complete text content, | +| | including descendants, does not equal the given | +| | ``text``. | +| | | +| | .. versionadded:: 3.10 | ++-----------------------+------------------------------------------------------+ | ``[tag='text']`` | Selects all elements that have a child named | | | ``tag`` whose complete text content, including | | | descendants, equals the given ``text``. | +-----------------------+------------------------------------------------------+ +| ``[tag!='text']`` | Selects all elements that have a child named | +| | ``tag`` whose complete text content, including | +| | descendants, does not equal the given ``text``. | +| | | +| | .. versionadded:: 3.10 | ++-----------------------+------------------------------------------------------+ | ``[position]`` | Selects all elements that are located at the given | | | position. The position can be either an integer | | | (1 is the first position), the expression ``last()`` | diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index 3f1f3781e488c1..fd4a38527fde06 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -2852,8 +2852,12 @@ def test_findall(self): ['tag'] * 3) self.assertEqual(summarize_list(e.findall('.//tag[@class="a"]')), ['tag']) + self.assertEqual(summarize_list(e.findall('.//tag[@class!="a"]')), + ['tag'] * 2) self.assertEqual(summarize_list(e.findall('.//tag[@class="b"]')), ['tag'] * 2) + self.assertEqual(summarize_list(e.findall('.//tag[@class!="b"]')), + ['tag']) self.assertEqual(summarize_list(e.findall('.//tag[@id]')), ['tag']) self.assertEqual(summarize_list(e.findall('.//section[tag]')), @@ -2875,6 +2879,19 @@ def test_findall(self): self.assertEqual(summarize_list(e.findall(".//section[ tag = 'subtext' ]")), ['section']) + # Negations of above tests. They match nothing because the sole section + # tag has subtext. + self.assertEqual(summarize_list(e.findall(".//section[tag!='subtext']")), + []) + self.assertEqual(summarize_list(e.findall(".//section[tag !='subtext']")), + []) + self.assertEqual(summarize_list(e.findall(".//section[tag!= 'subtext']")), + []) + self.assertEqual(summarize_list(e.findall(".//section[tag != 'subtext']")), + []) + self.assertEqual(summarize_list(e.findall(".//section[ tag != 'subtext' ]")), + []) + self.assertEqual(summarize_list(e.findall(".//tag[.='subtext']")), ['tag']) self.assertEqual(summarize_list(e.findall(".//tag[. ='subtext']")), @@ -2890,6 +2907,24 @@ def test_findall(self): self.assertEqual(summarize_list(e.findall(".//tag[.= ' subtext']")), []) + # Negations of above tests. + # Matches everything but the tag containing subtext + self.assertEqual(summarize_list(e.findall(".//tag[.!='subtext']")), + ['tag'] * 3) + self.assertEqual(summarize_list(e.findall(".//tag[. !='subtext']")), + ['tag'] * 3) + self.assertEqual(summarize_list(e.findall('.//tag[.!= "subtext"]')), + ['tag'] * 3) + self.assertEqual(summarize_list(e.findall('.//tag[ . != "subtext" ]')), + ['tag'] * 3) + self.assertEqual(summarize_list(e.findall(".//tag[. != 'subtext']")), + ['tag'] * 3) + # Matches all tags. + self.assertEqual(summarize_list(e.findall(".//tag[. != 'subtext ']")), + ['tag'] * 4) + self.assertEqual(summarize_list(e.findall(".//tag[.!= ' subtext']")), + ['tag'] * 4) + # duplicate section => 2x tag matches e[1] = e[2] self.assertEqual(summarize_list(e.findall(".//section[tag = 'subtext']")), diff --git a/Lib/xml/etree/ElementPath.py b/Lib/xml/etree/ElementPath.py index d318e65d84a4af..1cbd8399d14c50 100644 --- a/Lib/xml/etree/ElementPath.py +++ b/Lib/xml/etree/ElementPath.py @@ -65,8 +65,9 @@ r"//?|" r"\.\.|" r"\(\)|" + r"!=|" r"[/.*:\[\]\(\)@=])|" - r"((?:\{[^}]+\})?[^/\[\]\(\)@=\s]+)|" + r"((?:\{[^}]+\})?[^/\[\]\(\)@!=\s]+)|" r"\s+" ) @@ -253,15 +254,19 @@ def select(context, result): if elem.get(key) is not None: yield elem return select - if signature == "@-='": - # [@attribute='value'] + if signature == "@-='" or signature == "@-!='": + # [@attribute='value'] or [@attribute!='value'] key = predicate[1] value = predicate[-1] def select(context, result): for elem in result: if elem.get(key) == value: yield elem - return select + def select_negated(context, result): + for elem in result: + if (attr_value := elem.get(key)) is not None and attr_value != value: + yield elem + return select_negated if '!=' in signature else select if signature == "-" and not re.match(r"\-?\d+$", predicate[0]): # [tag] tag = predicate[0] @@ -270,8 +275,10 @@ def select(context, result): if elem.find(tag) is not None: yield elem return select - if signature == ".='" or (signature == "-='" and not re.match(r"\-?\d+$", predicate[0])): - # [.='value'] or [tag='value'] + if signature == ".='" or signature == ".!='" or ( + (signature == "-='" or signature == "-!='") + and not re.match(r"\-?\d+$", predicate[0])): + # [.='value'] or [tag='value'] or [.!='value'] or [tag!='value'] tag = predicate[0] value = predicate[-1] if tag: @@ -281,12 +288,22 @@ def select(context, result): if "".join(e.itertext()) == value: yield elem break + def select_negated(context, result): + for elem in result: + for e in elem.iterfind(tag): + if "".join(e.itertext()) != value: + yield elem + break else: def select(context, result): for elem in result: if "".join(elem.itertext()) == value: yield elem - return select + def select_negated(context, result): + for elem in result: + if "".join(elem.itertext()) != value: + yield elem + return select_negated if '!=' in signature else select if signature == "-" or signature == "-()" or signature == "-()-": # [index] or [last()] or [last()-index] if signature == "-": diff --git a/Misc/NEWS.d/next/Library/2020-09-08-03-19-04.bpo-40624.0-gYfx.rst b/Misc/NEWS.d/next/Library/2020-09-08-03-19-04.bpo-40624.0-gYfx.rst new file mode 100644 index 00000000000000..78bad6e4686bee --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-08-03-19-04.bpo-40624.0-gYfx.rst @@ -0,0 +1 @@ +Added support for the XPath ``!=`` operator in xml.etree From 361d6808710baf8ecb5c310258e04c4278cb228f Mon Sep 17 00:00:00 2001 From: Tom Gringauz Date: Mon, 9 Nov 2020 14:34:07 +0200 Subject: [PATCH 0494/1261] bpo-41543: contextlib.nullcontext can fill in for an async context manager (GH-21870) Co-authored-by: Andrew Svetlov --- Doc/library/contextlib.rst | 18 ++++++++++++++++++ Lib/contextlib.py | 8 +++++++- Lib/test/test_contextlib_async.py | 14 +++++++++++++- .../2020-08-14-00-39-04.bpo-41543.RpcRjb.rst | 1 + 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-08-14-00-39-04.bpo-41543.RpcRjb.rst diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index d5a1068a734fd6..91edbba7283472 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -243,8 +243,26 @@ Functions and classes provided: with cm as file: # Perform processing on the file + It can also be used as a stand-in for + :ref:`asynchronous context managers `:: + + async def send_http(session=None): + if not session: + # If no http session, create it with aiohttp + cm = aiohttp.ClientSession() + else: + # Caller is responsible for closing the session + cm = nullcontext(session) + + async with cm as session: + # Send http requests with session + .. versionadded:: 3.7 + .. versionchanged:: 3.10 + :term:`asynchronous context manager` support was added. + + .. function:: suppress(*exceptions) diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 56b4968118bdb3..a0b523c96fb285 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -704,7 +704,7 @@ def _fix_exception_context(new_exc, old_exc): return received_exc and suppressed_exc -class nullcontext(AbstractContextManager): +class nullcontext(AbstractContextManager, AbstractAsyncContextManager): """Context manager that does no additional processing. Used as a stand-in for a normal context manager, when a particular @@ -723,3 +723,9 @@ def __enter__(self): def __exit__(self, *excinfo): pass + + async def __aenter__(self): + return self.enter_result + + async def __aexit__(self, *excinfo): + pass diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index 109807d633d565..290ef05b82a801 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -1,5 +1,7 @@ import asyncio -from contextlib import aclosing, asynccontextmanager, AbstractAsyncContextManager, AsyncExitStack +from contextlib import ( + asynccontextmanager, AbstractAsyncContextManager, + AsyncExitStack, nullcontext, aclosing) import functools from test import support import unittest @@ -537,5 +539,15 @@ async def suppress_exc(*exc_details): self.assertIsInstance(inner_exc.__context__, ZeroDivisionError) +class TestAsyncNullcontext(unittest.TestCase): + @_async_test + async def test_async_nullcontext(self): + class C: + pass + c = C() + async with nullcontext(c) as c_in: + self.assertIs(c_in, c) + + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-08-14-00-39-04.bpo-41543.RpcRjb.rst b/Misc/NEWS.d/next/Library/2020-08-14-00-39-04.bpo-41543.RpcRjb.rst new file mode 100644 index 00000000000000..753dc763f217c4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-14-00-39-04.bpo-41543.RpcRjb.rst @@ -0,0 +1 @@ +Add async context manager support for contextlib.nullcontext. From 07fffe297ee8506d3bc6359523062c3a557ed49c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 9 Nov 2020 13:40:47 +0100 Subject: [PATCH 0495/1261] bpo-42294: Add borrowed/strong reference to doc glossary (GH-23206) Add "borrowed reference" and "strong reference" to the documentation glossary. Enhance also Py_INCREF() and Py_NewRef() documentation. --- Doc/c-api/arg.rst | 3 ++- Doc/c-api/init.rst | 2 +- Doc/c-api/intro.rst | 2 +- Doc/c-api/refcounting.rst | 35 ++++++++++++++++++++++++++--------- Doc/c-api/reflection.rst | 4 ++-- Doc/c-api/structures.rst | 2 +- Doc/c-api/typeobj.rst | 5 +++-- Doc/c-api/weakref.rst | 6 +++--- Doc/data/refcounts.dat | 6 ++++++ Doc/glossary.rst | 24 ++++++++++++++++++++++++ Include/object.h | 5 +++-- 11 files changed, 72 insertions(+), 22 deletions(-) diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index bdaae44e240a02..a91b3c7c9505f8 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -482,7 +482,8 @@ API Functions *min* and no more than *max*; *min* and *max* may be equal. Additional arguments must be passed to the function, each of which should be a pointer to a :c:type:`PyObject*` variable; these will be filled in with the values from - *args*; they will contain borrowed references. The variables which correspond + *args*; they will contain :term:`borrowed references `. + The variables which correspond to optional parameters not given by *args* will not be filled in; these should be initialized by the caller. This function returns true on success and false if *args* is not a tuple or contains the wrong number of elements; an exception diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 3ce689203a8170..3d18bb3f0b9d85 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1077,7 +1077,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. Get the current frame of the Python thread state *tstate*. - Return a strong reference. Return ``NULL`` if no frame is currently + Return a :term:`strong reference`. Return ``NULL`` if no frame is currently executing. See also :c:func:`PyEval_GetFrame`. diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 7ca8693afab79c..bae5ce11b73c4c 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -326,7 +326,7 @@ when it's no longer needed---or passing on this responsibility (usually to its caller). When a function passes ownership of a reference on to its caller, the caller is said to receive a *new* reference. When no ownership is transferred, the caller is said to *borrow* the reference. Nothing needs to be done for a -borrowed reference. +:term:`borrowed reference`. Conversely, when a calling function passes in a reference to an object, there are two possibilities: the function *steals* a reference to the object, or it diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst index b15c0e6aecc899..391907c8c2976a 100644 --- a/Doc/c-api/refcounting.rst +++ b/Doc/c-api/refcounting.rst @@ -13,10 +13,14 @@ objects. .. c:function:: void Py_INCREF(PyObject *o) - Increment the reference count for object *o*. The object must not be ``NULL``; if - you aren't sure that it isn't ``NULL``, use :c:func:`Py_XINCREF`. + Increment the reference count for object *o*. - See also :c:func:`Py_NewRef`. + This function is usually used to convert a :term:`borrowed reference` to a + :term:`strong reference` in-place. The :c:func:`Py_NewRef` function can be + used to create a new :term:`strong reference`. + + The object must not be ``NULL``; if you aren't sure that it isn't + ``NULL``, use :c:func:`Py_XINCREF`. .. c:function:: void Py_XINCREF(PyObject *o) @@ -29,9 +33,14 @@ objects. .. c:function:: PyObject* Py_NewRef(PyObject *o) - Increment the reference count of the object *o* and return the object *o*. + Create a new :term:`strong reference` to an object: increment the reference + count of the object *o* and return the object *o*. + + When the :term:`strong reference` is no longer needed, :c:func:`Py_DECREF` + should be called on it to decrement the object reference count. - The object *o* must not be ``NULL``. + The object *o* must not be ``NULL``; use :c:func:`Py_XNewRef` if *o* can be + ``NULL``. For example:: @@ -42,6 +51,8 @@ objects. self->attr = Py_NewRef(obj); + See also :c:func:`Py_INCREF`. + .. versionadded:: 3.10 @@ -56,10 +67,16 @@ objects. .. c:function:: void Py_DECREF(PyObject *o) - Decrement the reference count for object *o*. The object must not be ``NULL``; if - you aren't sure that it isn't ``NULL``, use :c:func:`Py_XDECREF`. If the reference - count reaches zero, the object's type's deallocation function (which must not be - ``NULL``) is invoked. + Decrement the reference count for object *o*. + + If the reference count reaches zero, the object's type's deallocation + function (which must not be ``NULL``) is invoked. + + This function is usually used to delete a :term:`strong reference` before + exiting its scope. + + The object must not be ``NULL``; if you aren't sure that it isn't ``NULL``, + use :c:func:`Py_XDECREF`. .. warning:: diff --git a/Doc/c-api/reflection.rst b/Doc/c-api/reflection.rst index 9207d86012c8b3..64ce4d1d0c34df 100644 --- a/Doc/c-api/reflection.rst +++ b/Doc/c-api/reflection.rst @@ -35,7 +35,7 @@ Reflection Get the *frame* next outer frame. - Return a strong reference, or ``NULL`` if *frame* has no outer frame. + Return a :term:`strong reference`, or ``NULL`` if *frame* has no outer frame. *frame* must not be ``NULL``. @@ -46,7 +46,7 @@ Reflection Get the *frame* code. - Return a strong reference. + Return a :term:`strong reference`. *frame* must not be ``NULL``. The result (frame code) cannot be ``NULL``. diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index a9e1c6fbcc3f94..03fe479165ffa9 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -66,7 +66,7 @@ the definition of all other Python objects. Get the type of the Python object *o*. - Return a borrowed reference. + Return a :term:`borrowed reference`. .. versionchanged:: 3.10 :c:func:`Py_TYPE()` is changed to the inline static function. diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index ddcb8ae3d0950c..32bbc7ba0a168d 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1213,8 +1213,9 @@ and :c:type:`PyType_Type` effectively act as defaults.) :func:`~gc.get_referents` function will include it. .. warning:: - When implementing :c:member:`~PyTypeObject.tp_traverse`, only the members - that the instance *owns* (by having strong references to them) must be + When implementing :c:member:`~PyTypeObject.tp_traverse`, only the + members that the instance *owns* (by having :term:`strong references + ` to them) must be visited. For instance, if an object supports weak references via the :c:member:`~PyTypeObject.tp_weaklist` slot, the pointer supporting the linked list (what *tp_weaklist* points to) must **not** be diff --git a/Doc/c-api/weakref.rst b/Doc/c-api/weakref.rst index e3a9bda54d671a..fb6628a1bbf022 100644 --- a/Doc/c-api/weakref.rst +++ b/Doc/c-api/weakref.rst @@ -57,10 +57,10 @@ as much as it can. .. note:: - This function returns a **borrowed reference** to the referenced object. + This function returns a :term:`borrowed reference` to the referenced object. This means that you should always call :c:func:`Py_INCREF` on the object - except if you know that it cannot be destroyed while you are still - using it. + except it cannot be destroyed before the last usage of the borrowed + reference. .. c:function:: PyObject* PyWeakref_GET_OBJECT(PyObject *ref) diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index d01e99ca5e3191..8a6ee718a012dd 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -3007,6 +3007,9 @@ Py_GetVersion:const char*::: Py_INCREF:void::: Py_INCREF:PyObject*:o:+1: +Py_NewRef:void::: +Py_NewRef:PyObject*:o:+1: + Py_Initialize:void::: Py_IsInitialized:int::: @@ -3028,6 +3031,9 @@ Py_XDECREF:PyObject*:o:-1:if o is not NULL Py_XINCREF:void::: Py_XINCREF:PyObject*:o:+1:if o is not NULL +Py_XNewRef:void::: +Py_XNewRef:PyObject*:o:+1:if o is not NULL + _PyImport_Fini:void::: _PyObject_New:PyObject*::+1: diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 506973e964b33e..b410585ca818c1 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -158,6 +158,18 @@ Glossary See also :term:`text file` for a file object able to read and write :class:`str` objects. + borrowed reference + In the Python's C API, a borrowed reference is a reference to an object. + It does not modify the object reference count. It becomes a dangling + pointer if the object is destroyed. For example, a garbage collection can + remove the last :term:`strong reference` to the object and so destroy it. + + Calling :c:func:`Py_INCREF` on the :term:`borrowed reference` is + recommended to convert it to a :term:`strong reference` in-place, except + if the object cannot be destroyed before the last usage of the borrowed + reference. The :c:func:`Py_NewRef` function can be used to create a new + :term:`strong reference`. + bytes-like object An object that supports the :ref:`bufferobjects` and can export a C-:term:`contiguous` buffer. This includes all :class:`bytes`, @@ -1100,6 +1112,18 @@ Glossary an :term:`expression` or one of several constructs with a keyword, such as :keyword:`if`, :keyword:`while` or :keyword:`for`. + strong reference + In the Python's C API, a strong reference is a reference to an object + which increments object reference count when it is created and + decrements the object reference count when it is deleted. + + The :c:func:`Py_NewRef` function can be used to create a strong reference + to an object. Usually, the :c:func:`Py_DECREF` function must be called on + the strong reference before exiting the scope of the strong reference, to + avoid leaking one reference. + + See also :term:`borrowed reference`. + text encoding A codec which encodes Unicode strings to bytes. diff --git a/Include/object.h b/Include/object.h index 835d9de01fb72b..eab3228f3abe41 100644 --- a/Include/object.h +++ b/Include/object.h @@ -526,10 +526,11 @@ they can have object code that is not dependent on Python compilation flags. PyAPI_FUNC(void) Py_IncRef(PyObject *); PyAPI_FUNC(void) Py_DecRef(PyObject *); -// Increment the reference count of the object and return the object. +// Create a new strong reference to an object: +// increment the reference count of the object and return the object. PyAPI_FUNC(PyObject*) Py_NewRef(PyObject *obj); -// Similar to Py_NewRef() but the object can be NULL. +// Similar to Py_NewRef(), but the object can be NULL. PyAPI_FUNC(PyObject*) Py_XNewRef(PyObject *obj); static inline PyObject* _Py_NewRef(PyObject *obj) From 9261dbc777f614b02e17b1f9577d474267585fe5 Mon Sep 17 00:00:00 2001 From: Yash Shete Date: Mon, 9 Nov 2020 23:08:09 +0530 Subject: [PATCH 0496/1261] bpo-41712: Avoid runaway regex match in upload scripts (GH-23166) --- Tools/msi/purge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/msi/purge.py b/Tools/msi/purge.py index a8b8f4d8973c40..27b6b054a445ad 100644 --- a/Tools/msi/purge.py +++ b/Tools/msi/purge.py @@ -12,7 +12,7 @@ from urllib.request import * -VERSION_RE = re.compile(r'(\d+\.\d+\.\d+)(\w+\d+)?$') +VERSION_RE = re.compile(r'(\d+\.\d+\.\d+)([A-Za-z_]+\d+)?$') try: m = VERSION_RE.match(sys.argv[1]) From 19c24a6a1d680f479d7429421719fccf97832c93 Mon Sep 17 00:00:00 2001 From: jack1142 <6032823+jack1142@users.noreply.github.com> Date: Mon, 9 Nov 2020 23:50:45 +0100 Subject: [PATCH 0497/1261] bpo-36310: Allow pygettext.py to detect calls to gettext in f-strings. (GH-19875) Adds support to Tools/i18n/pygettext.py for gettext calls in f-strings. This process is done by parsing the f-strings, processing each value, and flagging the ones which contain a gettext call. Co-authored-by: Batuhan Taskaya --- Lib/test/test_tools/test_i18n.py | 70 +++++++++++++++++++ Misc/ACKS | 1 + .../2020-05-03-01-30-46.bpo-36310.xDxxwY.rst | 2 + Tools/i18n/pygettext.py | 53 ++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2020-05-03-01-30-46.bpo-36310.xDxxwY.rst diff --git a/Lib/test/test_tools/test_i18n.py b/Lib/test/test_tools/test_i18n.py index 8da657907eab87..12f778dbf8405d 100644 --- a/Lib/test/test_tools/test_i18n.py +++ b/Lib/test/test_tools/test_i18n.py @@ -220,6 +220,76 @@ class D(L[1:2], F({1: 2}), metaclass=M(lambda x: x)): ''')) self.assertIn('doc', msgids) + def test_calls_in_fstrings(self): + msgids = self.extract_docstrings_from_str(dedent('''\ + f"{_('foo bar')}" + ''')) + self.assertIn('foo bar', msgids) + + def test_calls_in_fstrings_raw(self): + msgids = self.extract_docstrings_from_str(dedent('''\ + rf"{_('foo bar')}" + ''')) + self.assertIn('foo bar', msgids) + + def test_calls_in_fstrings_nested(self): + msgids = self.extract_docstrings_from_str(dedent('''\ + f"""{f'{_("foo bar")}'}""" + ''')) + self.assertIn('foo bar', msgids) + + def test_calls_in_fstrings_attribute(self): + msgids = self.extract_docstrings_from_str(dedent('''\ + f"{obj._('foo bar')}" + ''')) + self.assertIn('foo bar', msgids) + + def test_calls_in_fstrings_with_call_on_call(self): + msgids = self.extract_docstrings_from_str(dedent('''\ + f"{type(str)('foo bar')}" + ''')) + self.assertNotIn('foo bar', msgids) + + def test_calls_in_fstrings_with_format(self): + msgids = self.extract_docstrings_from_str(dedent('''\ + f"{_('foo {bar}').format(bar='baz')}" + ''')) + self.assertIn('foo {bar}', msgids) + + def test_calls_in_fstrings_with_wrong_input_1(self): + msgids = self.extract_docstrings_from_str(dedent('''\ + f"{_(f'foo {bar}')}" + ''')) + self.assertFalse([msgid for msgid in msgids if 'foo {bar}' in msgid]) + + def test_calls_in_fstrings_with_wrong_input_2(self): + msgids = self.extract_docstrings_from_str(dedent('''\ + f"{_(1)}" + ''')) + self.assertNotIn(1, msgids) + + def test_calls_in_fstring_with_multiple_args(self): + msgids = self.extract_docstrings_from_str(dedent('''\ + f"{_('foo', 'bar')}" + ''')) + self.assertNotIn('foo', msgids) + self.assertNotIn('bar', msgids) + + def test_calls_in_fstring_with_keyword_args(self): + msgids = self.extract_docstrings_from_str(dedent('''\ + f"{_('foo', bar='baz')}" + ''')) + self.assertNotIn('foo', msgids) + self.assertNotIn('bar', msgids) + self.assertNotIn('baz', msgids) + + def test_calls_in_fstring_with_partially_wrong_expression(self): + msgids = self.extract_docstrings_from_str(dedent('''\ + f"{_(f'foo') + _('bar')}" + ''')) + self.assertNotIn('foo', msgids) + self.assertIn('bar', msgids) + def test_files_list(self): """Make sure the directories are inspected for source files bpo-31920 diff --git a/Misc/ACKS b/Misc/ACKS index 5285693a6e6d40..35a87ae6b965da 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -949,6 +949,7 @@ Ivan Krstić Anselm Kruis Steven Kryskalla Andrew Kuchling +Jakub Kuczys Dave Kuhlman Jon Kuhn Ilya Kulakov diff --git a/Misc/NEWS.d/next/Tools-Demos/2020-05-03-01-30-46.bpo-36310.xDxxwY.rst b/Misc/NEWS.d/next/Tools-Demos/2020-05-03-01-30-46.bpo-36310.xDxxwY.rst new file mode 100644 index 00000000000000..16749a8fc9665b --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2020-05-03-01-30-46.bpo-36310.xDxxwY.rst @@ -0,0 +1,2 @@ +Allow :file:`Tools/i18n/pygettext.py` to detect calls to ``gettext`` in +f-strings. \ No newline at end of file diff --git a/Tools/i18n/pygettext.py b/Tools/i18n/pygettext.py index b1d281d793bd02..9dd65c221fd9da 100755 --- a/Tools/i18n/pygettext.py +++ b/Tools/i18n/pygettext.py @@ -162,6 +162,7 @@ import glob import time import getopt +import ast import token import tokenize @@ -343,6 +344,58 @@ def __waiting(self, ttype, tstring, lineno): return if ttype == tokenize.NAME and tstring in opts.keywords: self.__state = self.__keywordseen + return + if ttype == tokenize.STRING: + maybe_fstring = ast.parse(tstring, mode='eval').body + if not isinstance(maybe_fstring, ast.JoinedStr): + return + for value in filter(lambda node: isinstance(node, ast.FormattedValue), + maybe_fstring.values): + for call in filter(lambda node: isinstance(node, ast.Call), + ast.walk(value)): + func = call.func + if isinstance(func, ast.Name): + func_name = func.id + elif isinstance(func, ast.Attribute): + func_name = func.attr + else: + continue + + if func_name not in opts.keywords: + continue + if len(call.args) != 1: + print(_( + '*** %(file)s:%(lineno)s: Seen unexpected amount of' + ' positional arguments in gettext call: %(source_segment)s' + ) % { + 'source_segment': ast.get_source_segment(tstring, call) or tstring, + 'file': self.__curfile, + 'lineno': lineno + }, file=sys.stderr) + continue + if call.keywords: + print(_( + '*** %(file)s:%(lineno)s: Seen unexpected keyword arguments' + ' in gettext call: %(source_segment)s' + ) % { + 'source_segment': ast.get_source_segment(tstring, call) or tstring, + 'file': self.__curfile, + 'lineno': lineno + }, file=sys.stderr) + continue + arg = call.args[0] + if not isinstance(arg, ast.Constant): + print(_( + '*** %(file)s:%(lineno)s: Seen unexpected argument type' + ' in gettext call: %(source_segment)s' + ) % { + 'source_segment': ast.get_source_segment(tstring, call) or tstring, + 'file': self.__curfile, + 'lineno': lineno + }, file=sys.stderr) + continue + if isinstance(arg.value, str): + self.__addentry(arg.value, lineno) def __suiteseen(self, ttype, tstring, lineno): # skip over any enclosure pairs until we see the colon From 42332674903d2e89b79e2e32aeb68e52b3710422 Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Tue, 10 Nov 2020 14:57:34 +0900 Subject: [PATCH 0498/1261] Fix typo in unicodeobject.c (GH-23180) exeeds -> exceeds Automerge-Triggered-By: GH:Mariatta --- Objects/unicodeobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 9058018201039c..e7a63e7b973d89 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1894,7 +1894,7 @@ _PyUnicode_Ready(PyObject *unicode) _PyUnicode_WSTR_LENGTH(unicode) = 0; #endif } - /* maxchar exeeds 16 bit, wee need 4 bytes for unicode characters */ + /* maxchar exceeds 16 bit, wee need 4 bytes for unicode characters */ else { #if SIZEOF_WCHAR_T == 2 /* in case the native representation is 2-bytes, we need to allocate a From 4474bba003cc54ca7b7fdb9d3abf3bfaa92c662d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 10 Nov 2020 13:21:52 +0100 Subject: [PATCH 0499/1261] bpo-42260: Compute the path config in the main init (GH-23211) The path configuration is now computed in the "main" initialization. The core initialization no longer computes it. * Add _PyConfig_Read() function to read the configuration without computing the path configuration. * pyinit_core() no longer computes the path configuration: it is now computed by init_interp_main(). * The path configuration output members of PyConfig are now optional: * executable * base_executable * prefix * base_prefix * exec_prefix * base_exec_prefix * _PySys_UpdateConfig() now skips NULL strings in PyConfig. * _testembed: Rename test_set_config() to test_init_set_config() for consistency with other tests. --- Include/internal/pycore_initconfig.h | 1 + Lib/test/_test_embed_set_config.py | 26 ++++++++---- Programs/_testembed.c | 4 +- Python/initconfig.c | 47 +++++++++------------- Python/pylifecycle.c | 59 +++++++++++++++------------- Python/sysmodule.c | 22 +++++++---- 6 files changed, 85 insertions(+), 74 deletions(-) diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h index 325be5494d406a..d8400b1c42e01f 100644 --- a/Include/internal/pycore_initconfig.h +++ b/Include/internal/pycore_initconfig.h @@ -152,6 +152,7 @@ extern PyStatus _PyConfig_Copy( PyConfig *config, const PyConfig *config2); extern PyStatus _PyConfig_InitPathConfig(PyConfig *config); +extern PyStatus _PyConfig_Read(PyConfig *config, int compute_path_config); extern PyStatus _PyConfig_Write(const PyConfig *config, struct pyruntimestate *runtime); extern PyStatus _PyConfig_SetPyArgv( diff --git a/Lib/test/_test_embed_set_config.py b/Lib/test/_test_embed_set_config.py index a19f8db1584f4f..82c5d829823652 100644 --- a/Lib/test/_test_embed_set_config.py +++ b/Lib/test/_test_embed_set_config.py @@ -100,19 +100,19 @@ def test_set_invalid(self): 'check_hash_pycs_mode', 'program_name', 'platlibdir', - 'executable', - 'base_executable', - 'prefix', - 'base_prefix', - 'exec_prefix', - 'base_exec_prefix', # optional wstr: # 'pythonpath_env' - # 'home', + # 'home' # 'pycache_prefix' # 'run_command' # 'run_module' # 'run_filename' + # 'executable' + # 'prefix' + # 'exec_prefix' + # 'base_executable' + # 'base_prefix' + # 'base_exec_prefix' ): value_tests.append((key, invalid_wstr)) type_tests.append((key, b'bytes')) @@ -217,6 +217,18 @@ def test_pathconfig(self): self.set_config(base_executable="base_executable") self.assertEqual(sys._base_executable, "base_executable") + # When base_xxx is NULL, value is copied from xxxx + self.set_config( + executable='executable', + prefix="prefix", + exec_prefix="exec_prefix", + base_executable=None, + base_prefix=None, + base_exec_prefix=None) + self.assertEqual(sys._base_executable, "executable") + self.assertEqual(sys.base_prefix, "prefix") + self.assertEqual(sys.base_exec_prefix, "exec_prefix") + def test_path(self): self.set_config(module_search_paths_set=1, module_search_paths=['a', 'b', 'c']) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index cb3a23a101e952..748ea8a8f33601 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1547,7 +1547,7 @@ static int tune_config(void) } -static int test_set_config(void) +static int test_init_set_config(void) { // Initialize core PyConfig config; @@ -1742,7 +1742,7 @@ static struct TestCase TestCases[] = { {"test_init_setpath_config", test_init_setpath_config}, {"test_init_setpythonhome", test_init_setpythonhome}, {"test_init_warnoptions", test_init_warnoptions}, - {"test_init_set_config", test_set_config}, + {"test_init_set_config", test_init_set_config}, {"test_run_main", test_run_main}, {"test_get_argc_argv", test_get_argc_argv}, diff --git a/Python/initconfig.c b/Python/initconfig.c index e0811b56cb374e..11db4a3ef599d5 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -619,15 +619,6 @@ config_check_consistency(const PyConfig *config) assert(_PyWideStringList_CheckConsistency(&config->warnoptions)); assert(_PyWideStringList_CheckConsistency(&config->module_search_paths)); assert(config->module_search_paths_set >= 0); - if (config->_install_importlib) { - /* don't check config->module_search_paths */ - assert(config->executable != NULL); - assert(config->base_executable != NULL); - assert(config->prefix != NULL); - assert(config->base_prefix != NULL); - assert(config->exec_prefix != NULL); - assert(config->base_exec_prefix != NULL); - } assert(config->platlibdir != NULL); assert(config->filesystem_encoding != NULL); assert(config->filesystem_errors != NULL); @@ -1297,24 +1288,15 @@ _PyConfig_FromDict(PyConfig *config, PyObject *dict) GET_WSTR_OPT(home); GET_WSTR(platlibdir); + // Path configuration output GET_UINT(module_search_paths_set); GET_WSTRLIST(module_search_paths); - if (config->_install_importlib) { - GET_WSTR(executable); - GET_WSTR(base_executable); - GET_WSTR(prefix); - GET_WSTR(base_prefix); - GET_WSTR(exec_prefix); - GET_WSTR(base_exec_prefix); - } - else { - GET_WSTR_OPT(executable); - GET_WSTR_OPT(base_executable); - GET_WSTR_OPT(prefix); - GET_WSTR_OPT(base_prefix); - GET_WSTR_OPT(exec_prefix); - GET_WSTR_OPT(base_exec_prefix); - } + GET_WSTR_OPT(executable); + GET_WSTR_OPT(base_executable); + GET_WSTR_OPT(prefix); + GET_WSTR_OPT(base_prefix); + GET_WSTR_OPT(exec_prefix); + GET_WSTR_OPT(base_exec_prefix); GET_UINT(skip_source_first_line); GET_WSTR_OPT(run_command); @@ -2043,7 +2025,7 @@ config_init_fs_encoding(PyConfig *config, const PyPreConfig *preconfig) static PyStatus -config_read(PyConfig *config) +config_read(PyConfig *config, int compute_path_config) { PyStatus status; const PyPreConfig *preconfig = &_PyRuntime.preconfig; @@ -2087,7 +2069,7 @@ config_read(PyConfig *config) } } - if (config->_install_importlib) { + if (compute_path_config && config->_install_importlib) { status = _PyConfig_InitPathConfig(config); if (_PyStatus_EXCEPTION(status)) { return status; @@ -2834,7 +2816,7 @@ PyConfig_SetWideStringList(PyConfig *config, PyWideStringList *list, The only side effects are to modify config and to call _Py_SetArgcArgv(). */ PyStatus -PyConfig_Read(PyConfig *config) +_PyConfig_Read(PyConfig *config, int compute_path_config) { PyStatus status; @@ -2877,7 +2859,7 @@ PyConfig_Read(PyConfig *config) goto done; } - status = config_read(config); + status = config_read(config, compute_path_config); if (_PyStatus_EXCEPTION(status)) { goto done; } @@ -2892,6 +2874,13 @@ PyConfig_Read(PyConfig *config) } +PyStatus +PyConfig_Read(PyConfig *config) +{ + return _PyConfig_Read(config, 1); +} + + PyObject* _Py_GetConfigsAsDict(void) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index e34d6471e178e4..609e0a42e4dfe6 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -429,25 +429,20 @@ _Py_SetLocaleFromEnv(int category) static int -interpreter_set_config(const PyConfig *config) +interpreter_update_config(PyThreadState *tstate, int only_update_path_config) { - PyThreadState *tstate = PyThreadState_Get(); + const PyConfig *config = &tstate->interp->config; - PyStatus status = _PyConfig_Write(config, tstate->interp->runtime); - if (_PyStatus_EXCEPTION(status)) { - _PyErr_SetFromPyStatus(status); - return -1; - } - - status = _PyConfig_Copy(&tstate->interp->config, config); - if (_PyStatus_EXCEPTION(status)) { - _PyErr_SetFromPyStatus(status); - return -1; + if (!only_update_path_config) { + PyStatus status = _PyConfig_Write(config, tstate->interp->runtime); + if (_PyStatus_EXCEPTION(status)) { + _PyErr_SetFromPyStatus(status); + return -1; + } } - config = &tstate->interp->config; - if (config->_install_importlib && _Py_IsMainInterpreter(tstate)) { - status = _PyConfig_WritePathConfig(config); + if (_Py_IsMainInterpreter(tstate)) { + PyStatus status = _PyConfig_WritePathConfig(config); if (_PyStatus_EXCEPTION(status)) { _PyErr_SetFromPyStatus(status); return -1; @@ -465,6 +460,7 @@ interpreter_set_config(const PyConfig *config) int _PyInterpreterState_SetConfig(const PyConfig *src_config) { + PyThreadState *tstate = PyThreadState_Get(); int res = -1; PyConfig config; @@ -481,7 +477,13 @@ _PyInterpreterState_SetConfig(const PyConfig *src_config) goto done; } - res = interpreter_set_config(&config); + status = _PyConfig_Copy(&tstate->interp->config, &config); + if (_PyStatus_EXCEPTION(status)) { + _PyErr_SetFromPyStatus(status); + goto done; + } + + res = interpreter_update_config(tstate, 0); done: PyConfig_Clear(&config); @@ -763,13 +765,6 @@ pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod) const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); if (config->_install_importlib) { - if (_Py_IsMainInterpreter(tstate)) { - status = _PyConfig_WritePathConfig(config); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - /* This call sets up builtin and frozen import support */ status = init_importlib(tstate, sysmod); if (_PyStatus_EXCEPTION(status)) { @@ -985,7 +980,9 @@ pyinit_core(_PyRuntimeState *runtime, goto done; } - status = PyConfig_Read(&config); + // Read the configuration, but don't compute the path configuration + // (it is computed in the main init). + status = _PyConfig_Read(&config, 0); if (_PyStatus_EXCEPTION(status)) { goto done; } @@ -1012,8 +1009,8 @@ pyinit_core(_PyRuntimeState *runtime, static PyStatus pyinit_main_reconfigure(PyThreadState *tstate) { - if (_PySys_UpdateConfig(tstate) < 0) { - return _PyStatus_ERR("fail to update sys for the new conf"); + if (interpreter_update_config(tstate, 0) < 0) { + return _PyStatus_ERR("fail to reconfigure Python"); } return _PyStatus_OK(); } @@ -1041,14 +1038,20 @@ init_interp_main(PyThreadState *tstate) return _PyStatus_OK(); } + // Compute the path configuration + status = _PyConfig_InitPathConfig(&interp->config); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + if (is_main_interp) { if (_PyTime_Init() < 0) { return _PyStatus_ERR("can't initialize time"); } } - if (_PySys_UpdateConfig(tstate) < 0) { - return _PyStatus_ERR("can't finish initializing sys"); + if (interpreter_update_config(tstate, 1) < 0) { + return _PyStatus_ERR("failed to update the Python config"); } status = init_importlib_external(tstate); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index ae4f0eeb2ee667..61741f7432d34f 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2922,17 +2922,22 @@ _PySys_UpdateConfig(PyThreadState *tstate) #define SET_SYS_FROM_WSTR(KEY, VALUE) \ SET_SYS(KEY, PyUnicode_FromWideChar(VALUE, -1)); +#define COPY_WSTR(SYS_ATTR, WSTR) \ + if (WSTR != NULL) { \ + SET_SYS_FROM_WSTR(SYS_ATTR, WSTR); \ + } + if (config->module_search_paths_set) { COPY_LIST("path", config->module_search_paths); } - SET_SYS_FROM_WSTR("executable", config->executable); - SET_SYS_FROM_WSTR("_base_executable", config->base_executable); - SET_SYS_FROM_WSTR("prefix", config->prefix); - SET_SYS_FROM_WSTR("base_prefix", config->base_prefix); - SET_SYS_FROM_WSTR("exec_prefix", config->exec_prefix); - SET_SYS_FROM_WSTR("base_exec_prefix", config->base_exec_prefix); - SET_SYS_FROM_WSTR("platlibdir", config->platlibdir); + COPY_WSTR("executable", config->executable); + COPY_WSTR("_base_executable", config->base_executable); + COPY_WSTR("prefix", config->prefix); + COPY_WSTR("base_prefix", config->base_prefix); + COPY_WSTR("exec_prefix", config->exec_prefix); + COPY_WSTR("base_exec_prefix", config->base_exec_prefix); + COPY_WSTR("platlibdir", config->platlibdir); if (config->pycache_prefix != NULL) { SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix); @@ -2946,8 +2951,9 @@ _PySys_UpdateConfig(PyThreadState *tstate) SET_SYS("_xoptions", sys_create_xoptions_dict(config)); -#undef COPY_LIST #undef SET_SYS_FROM_WSTR +#undef COPY_LIST +#undef COPY_WSTR // sys.flags PyObject *flags = _PySys_GetObject(tstate, "flags"); // borrowed ref From 44fe153d0839de8f66c528b1129873eb9ebb1460 Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Tue, 10 Nov 2020 21:42:36 +0900 Subject: [PATCH 0500/1261] Fix typo in test_array.py (GH-23189) --- Lib/test/test_array.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index c423f545488f82..77a0c64a88e6c0 100644 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -393,7 +393,7 @@ def test_exhausted_reverse_iterator(self): a.insert(0, self.outside) self.assertEqual(list(exhit), []) # The iterator index points past the 0th position so inserting - # an element in the beggining does not make it appear. + # an element in the beginning does not make it appear. self.assertEqual(list(empit), []) self.assertEqual(list(a), [self.outside] + list(self.example)) From b94aa0c8d606bbdff3865cfe4a150c4caf5198ca Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 10 Nov 2020 14:47:31 +0100 Subject: [PATCH 0501/1261] bpo-42171: Add PEP573-related items to the limited API (GH-23009) --- Doc/c-api/structures.rst | 6 ++++-- Include/methodobject.h | 2 +- .../next/C API/2020-10-27-21-10-14.bpo-42171.S3FWTP.rst | 4 ++++ PC/python3dll.c | 4 ++++ 4 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-10-27-21-10-14.bpo-42171.S3FWTP.rst diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 03fe479165ffa9..37602ed5b4dc78 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -263,10 +263,12 @@ There are these calling conventions: of :c:type:`PyObject*` values indicating the arguments and the third parameter is the number of arguments (the length of the array). - This is not part of the :ref:`limited API `. - .. versionadded:: 3.7 + .. versionchanged:: 3.10 + + ``METH_FASTCALL`` is now part of the stable ABI. + .. data:: METH_FASTCALL | METH_KEYWORDS diff --git a/Include/methodobject.h b/Include/methodobject.h index 12e049b4043ba5..5d06d7691ba324 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -73,7 +73,7 @@ PyAPI_FUNC(PyObject *) PyCMethod_New(PyMethodDef *, PyObject *, #define METH_COEXIST 0x0040 -#ifndef Py_LIMITED_API +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03100000 #define METH_FASTCALL 0x0080 #endif diff --git a/Misc/NEWS.d/next/C API/2020-10-27-21-10-14.bpo-42171.S3FWTP.rst b/Misc/NEWS.d/next/C API/2020-10-27-21-10-14.bpo-42171.S3FWTP.rst new file mode 100644 index 00000000000000..5dfbb23a6a39a4 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-27-21-10-14.bpo-42171.S3FWTP.rst @@ -0,0 +1,4 @@ +The :c:data:`METH_FASTCALL` calling convention is added to the limited API. +The functions :c:func:`PyModule_AddType`, :c:func:`PyType_FromModuleAndSpec`, +:c:func:`PyType_GetModule` and :c:func:`PyType_GetModuleState` are added to +the limited API on Windows. diff --git a/PC/python3dll.c b/PC/python3dll.c index d1fdd0ac54ca8d..27cc315de2dd19 100644 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -344,6 +344,7 @@ EXPORT_FUNC(PyModule_AddFunctions) EXPORT_FUNC(PyModule_AddIntConstant) EXPORT_FUNC(PyModule_AddObject) EXPORT_FUNC(PyModule_AddStringConstant) +EXPORT_FUNC(PyModule_AddType) EXPORT_FUNC(PyModule_Create2) EXPORT_FUNC(PyModule_ExecDef) EXPORT_FUNC(PyModule_FromDefAndSpec2) @@ -547,9 +548,12 @@ EXPORT_FUNC(PyTuple_Size) EXPORT_FUNC(PyType_ClearCache) EXPORT_FUNC(PyType_FromSpec) EXPORT_FUNC(PyType_FromSpecWithBases) +EXPORT_FUNC(PyType_FromModuleAndSpec) EXPORT_FUNC(PyType_GenericAlloc) EXPORT_FUNC(PyType_GenericNew) EXPORT_FUNC(PyType_GetFlags) +EXPORT_FUNC(PyType_GetModule) +EXPORT_FUNC(PyType_GetModuleState) EXPORT_FUNC(PyType_GetSlot) EXPORT_FUNC(PyType_IsSubtype) EXPORT_FUNC(PyType_Modified) From 206c73bc55f40871c51d287f2f56c015297d3cfc Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Tue, 10 Nov 2020 15:58:31 +0200 Subject: [PATCH 0502/1261] bpo-42183: Fix a stack overflow error for asyncio Task or Future repr() (GH-23020) The overflow occurs under some circumstances when a task or future recursively returns itself. Co-authored-by: Kyle Stanley --- Lib/asyncio/base_futures.py | 25 ++++++++++++++++--- Lib/test/test_asyncio/test_futures2.py | 18 +++++++++++++ .../2020-10-29-11-17-35.bpo-42183.50ZcIi.rst | 4 +++ 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 Lib/test/test_asyncio/test_futures2.py create mode 100644 Misc/NEWS.d/next/Library/2020-10-29-11-17-35.bpo-42183.50ZcIi.rst diff --git a/Lib/asyncio/base_futures.py b/Lib/asyncio/base_futures.py index 22f298069c505e..2c01ac98e10fca 100644 --- a/Lib/asyncio/base_futures.py +++ b/Lib/asyncio/base_futures.py @@ -1,6 +1,7 @@ __all__ = () import reprlib +from _thread import get_ident from . import format_helpers @@ -41,6 +42,16 @@ def format_cb(callback): return f'cb=[{cb}]' +# bpo-42183: _repr_running is needed for repr protection +# when a Future or Task result contains itself directly or indirectly. +# The logic is borrowed from @reprlib.recursive_repr decorator. +# Unfortunately, the direct decorator usage is impossible because of +# AttributeError: '_asyncio.Task' object has no attribute '__module__' error. +# +# After fixing this thing we can return to the decorator based approach. +_repr_running = set() + + def _future_repr_info(future): # (Future) -> str """helper function for Future.__repr__""" @@ -49,9 +60,17 @@ def _future_repr_info(future): if future._exception is not None: info.append(f'exception={future._exception!r}') else: - # use reprlib to limit the length of the output, especially - # for very long strings - result = reprlib.repr(future._result) + key = id(future), get_ident() + if key in _repr_running: + result = '...' + else: + _repr_running.add(key) + try: + # use reprlib to limit the length of the output, especially + # for very long strings + result = reprlib.repr(future._result) + finally: + _repr_running.discard(key) info.append(f'result={result}') if future._callbacks: info.append(_format_callbacks(future._callbacks)) diff --git a/Lib/test/test_asyncio/test_futures2.py b/Lib/test/test_asyncio/test_futures2.py new file mode 100644 index 00000000000000..13dbc703277c81 --- /dev/null +++ b/Lib/test/test_asyncio/test_futures2.py @@ -0,0 +1,18 @@ +# IsolatedAsyncioTestCase based tests +import asyncio +import unittest + + +class FutureTests(unittest.IsolatedAsyncioTestCase): + async def test_recursive_repr_for_pending_tasks(self): + # The call crashes if the guard for recursive call + # in base_futures:_future_repr_info is absent + # See Also: https://bugs.python.org/issue42183 + + async def func(): + return asyncio.all_tasks() + + # The repr() call should not raise RecursiveError at first. + # The check for returned string is not very reliable but + # exact comparison for the whole string is even weaker. + self.assertIn('...', repr(await asyncio.wait_for(func(), timeout=10))) diff --git a/Misc/NEWS.d/next/Library/2020-10-29-11-17-35.bpo-42183.50ZcIi.rst b/Misc/NEWS.d/next/Library/2020-10-29-11-17-35.bpo-42183.50ZcIi.rst new file mode 100644 index 00000000000000..f6d7653f2cf09f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-29-11-17-35.bpo-42183.50ZcIi.rst @@ -0,0 +1,4 @@ +Fix a stack overflow error for asyncio Task or Future repr(). + +The overflow occurs under some circumstances when a Task or Future +recursively returns itself. From be41111afd6e5dac89649fea9c136c2bf7994892 Mon Sep 17 00:00:00 2001 From: Joongi Kim Date: Wed, 11 Nov 2020 00:19:11 +0900 Subject: [PATCH 0503/1261] Update whatsnew for 3.10 release about addition of contextlib.aclosing (GH-23217) --- Doc/whatsnew/3.10.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index a735bf235435ca..95cdb06f997b19 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -176,6 +176,13 @@ codecs Add a :func:`codecs.unregister` function to unregister a codec search function. (Contributed by Hai Shi in :issue:`41842`.) +contextlib +---------- + +Add a :func:`contextlib.aclosing` context manager to safely close async generators +and objects representing asynchronously released resources. +(Contributed by Joongi Kim and John Belmonte in :issue:`41229`.) + curses ------ From 08256e1929e61f4b11f39ce9233838647fa967c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 10 Nov 2020 17:06:02 +0100 Subject: [PATCH 0504/1261] bpo-42014: shutil.rmtree: call onerror with correct function (GH-22585) The onerror is supposed to be called with failed function, but in this case lstat is wrongly used instead of open. Not sure if this needs bug or not... Automerge-Triggered-By: GH:hynek --- Lib/shutil.py | 2 +- .../next/Library/2020-11-10-15-40-56.bpo-42014.ShM37l.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-10-15-40-56.bpo-42014.ShM37l.rst diff --git a/Lib/shutil.py b/Lib/shutil.py index 223e9a8a705064..f0e833dc979b79 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -711,7 +711,7 @@ def onerror(*args): try: fd = os.open(path, os.O_RDONLY) except Exception: - onerror(os.lstat, path, sys.exc_info()) + onerror(os.open, path, sys.exc_info()) return try: if os.path.samestat(orig_st, os.fstat(fd)): diff --git a/Misc/NEWS.d/next/Library/2020-11-10-15-40-56.bpo-42014.ShM37l.rst b/Misc/NEWS.d/next/Library/2020-11-10-15-40-56.bpo-42014.ShM37l.rst new file mode 100644 index 00000000000000..d3e1abcd84c1e8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-10-15-40-56.bpo-42014.ShM37l.rst @@ -0,0 +1 @@ +The ``onerror`` callback from ``shutil.rmtree`` now receives correct function when ``os.open`` fails. \ No newline at end of file From 8acd858452c13c8cc8391438db65c4680333c52e Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Tue, 10 Nov 2020 12:09:55 -0800 Subject: [PATCH 0505/1261] bpo-42085: Introduce dedicated entry in PyAsyncMethods for sending values (#22780) --- Doc/c-api/typeobj.rst | 16 ++++++ Include/abstract.h | 5 -- Include/cpython/object.h | 3 + Include/object.h | 14 +++++ Include/typeslots.h | 4 ++ Lib/test/test_sys.py | 2 +- .../2020-10-19-15-58-16.bpo-42085.NhEf3W.rst | 1 + Modules/_asynciomodule.c | 56 ++++++++++++++---- Modules/_testcapimodule.c | 3 +- Objects/abstract.c | 26 +++++++++ Objects/genobject.c | 57 +++++++++---------- Objects/typeobject.c | 7 +++ Objects/typeslots.inc | 1 + 13 files changed, 146 insertions(+), 49 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-10-19-15-58-16.bpo-42085.NhEf3W.rst diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 32bbc7ba0a168d..6a67bfe9010890 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -199,6 +199,8 @@ sub-slots +---------------------------------------------------------+-----------------------------------+--------------+ | :c:member:`~PyAsyncMethods.am_anext` | :c:type:`unaryfunc` | __anext__ | +---------------------------------------------------------+-----------------------------------+--------------+ + | :c:member:`~PyAsyncMethods.am_send` | :c:type:`sendfunc` | | + +---------------------------------------------------------+-----------------------------------+--------------+ | | +---------------------------------------------------------+-----------------------------------+--------------+ | :c:member:`~PyNumberMethods.nb_add` | :c:type:`binaryfunc` | __add__ | @@ -2304,6 +2306,7 @@ Async Object Structures unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; + sendfunc am_send; } PyAsyncMethods; .. c:member:: unaryfunc PyAsyncMethods.am_await @@ -2337,6 +2340,15 @@ Async Object Structures Must return an :term:`awaitable` object. See :meth:`__anext__` for details. This slot may be set to ``NULL``. +.. c:member:: sendfunc PyAsyncMethods.am_send + + The signature of this function is:: + + PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result); + + See :c:func:`PyIter_Send` for details. + This slot may be set to ``NULL``. + .. _slot-typedefs: @@ -2432,6 +2444,10 @@ Slot Type typedefs .. c:type:: PyObject *(*binaryfunc)(PyObject *, PyObject *) +.. c:type:: PySendResult (*sendfunc)(PyObject *, PyObject *, PyObject **) + + See :c:member:`~PyAsyncMethods.am_send`. + .. c:type:: PyObject *(*ternaryfunc)(PyObject *, PyObject *, PyObject *) .. c:type:: PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t) diff --git a/Include/abstract.h b/Include/abstract.h index 28e576b92935f9..0bd1ca936846fe 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -339,11 +339,6 @@ PyAPI_FUNC(int) PyIter_Check(PyObject *); PyAPI_FUNC(PyObject *) PyIter_Next(PyObject *); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 -typedef enum { - PYGEN_RETURN = 0, - PYGEN_ERROR = -1, - PYGEN_NEXT = 1, -} PySendResult; /* Takes generator, coroutine or iterator object and sends the value into it. Returns: diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 0db53c312f07b7..ec6a3647677766 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -167,10 +167,13 @@ typedef struct { objobjargproc mp_ass_subscript; } PyMappingMethods; +typedef PySendResult (*sendfunc)(PyObject *iter, PyObject *value, PyObject **result); + typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; + sendfunc am_send; } PyAsyncMethods; typedef struct { diff --git a/Include/object.h b/Include/object.h index eab3228f3abe41..dd1b217686717e 100644 --- a/Include/object.h +++ b/Include/object.h @@ -356,6 +356,11 @@ given type object has a specified feature. /* Type is abstract and cannot be instantiated */ #define Py_TPFLAGS_IS_ABSTRACT (1UL << 20) +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 +/* Type has am_send entry in tp_as_async slot */ +#define Py_TPFLAGS_HAVE_AM_SEND (1UL << 21) +#endif + /* These flags are used to determine if a type is a subclass. */ #define Py_TPFLAGS_LONG_SUBCLASS (1UL << 24) #define Py_TPFLAGS_LIST_SUBCLASS (1UL << 25) @@ -582,6 +587,15 @@ PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ #define Py_GT 4 #define Py_GE 5 +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 +/* Result of calling PyIter_Send */ +typedef enum { + PYGEN_RETURN = 0, + PYGEN_ERROR = -1, + PYGEN_NEXT = 1, +} PySendResult; +#endif + /* * Macro for implementing rich comparisons * diff --git a/Include/typeslots.h b/Include/typeslots.h index 64f6fff5144493..5800d0158bc924 100644 --- a/Include/typeslots.h +++ b/Include/typeslots.h @@ -88,3 +88,7 @@ /* New in 3.5 */ #define Py_tp_finalize 80 #endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 +/* New in 3.10 */ +#define Py_am_send 81 +#endif diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 332ed8f550c984..173ef9ebb4c195 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1407,7 +1407,7 @@ def delx(self): del self.__x check(int, s) # class s = vsize(fmt + # PyTypeObject - '3P' # PyAsyncMethods + '4P' # PyAsyncMethods '36P' # PyNumberMethods '3P' # PyMappingMethods '10P' # PySequenceMethods diff --git a/Misc/NEWS.d/next/C API/2020-10-19-15-58-16.bpo-42085.NhEf3W.rst b/Misc/NEWS.d/next/C API/2020-10-19-15-58-16.bpo-42085.NhEf3W.rst new file mode 100644 index 00000000000000..53338fb4f446e1 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-19-15-58-16.bpo-42085.NhEf3W.rst @@ -0,0 +1 @@ +Add dedicated entry to PyAsyncMethods for sending values diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 90d288f7393934..d1d0f6bc75e424 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1479,7 +1479,8 @@ future_cls_getitem(PyObject *cls, PyObject *type) static PyAsyncMethods FutureType_as_async = { (unaryfunc)future_new_iter, /* am_await */ 0, /* am_aiter */ - 0 /* am_anext */ + 0, /* am_anext */ + 0, /* am_send */ }; static PyMethodDef FutureType_methods[] = { @@ -1597,37 +1598,60 @@ FutureIter_dealloc(futureiterobject *it) } } -static PyObject * -FutureIter_iternext(futureiterobject *it) +static PySendResult +FutureIter_am_send(futureiterobject *it, + PyObject *Py_UNUSED(arg), + PyObject **result) { + /* arg is unused, see the comment on FutureIter_send for clarification */ + PyObject *res; FutureObj *fut = it->future; + *result = NULL; if (fut == NULL) { - return NULL; + return PYGEN_ERROR; } if (fut->fut_state == STATE_PENDING) { if (!fut->fut_blocking) { fut->fut_blocking = 1; Py_INCREF(fut); - return (PyObject *)fut; + *result = (PyObject *)fut; + return PYGEN_NEXT; } PyErr_SetString(PyExc_RuntimeError, "await wasn't used with future"); - return NULL; + return PYGEN_ERROR; } it->future = NULL; res = _asyncio_Future_result_impl(fut); if (res != NULL) { - /* The result of the Future is not an exception. */ - (void)_PyGen_SetStopIterationValue(res); - Py_DECREF(res); + *result = res; + return PYGEN_RETURN; } Py_DECREF(fut); - return NULL; + return PYGEN_ERROR; +} + +static PyObject * +FutureIter_iternext(futureiterobject *it) +{ + PyObject *result; + switch (FutureIter_am_send(it, Py_None, &result)) { + case PYGEN_RETURN: + (void)_PyGen_SetStopIterationValue(result); + Py_DECREF(result); + return NULL; + case PYGEN_NEXT: + return result; + case PYGEN_ERROR: + return NULL; + default: + Py_UNREACHABLE(); + } } static PyObject * @@ -1716,14 +1740,24 @@ static PyMethodDef FutureIter_methods[] = { {NULL, NULL} /* Sentinel */ }; +static PyAsyncMethods FutureIterType_as_async = { + 0, /* am_await */ + 0, /* am_aiter */ + 0, /* am_anext */ + (sendfunc)FutureIter_am_send, /* am_send */ +}; + + static PyTypeObject FutureIterType = { PyVarObject_HEAD_INIT(NULL, 0) "_asyncio.FutureIter", .tp_basicsize = sizeof(futureiterobject), .tp_itemsize = 0, .tp_dealloc = (destructor)FutureIter_dealloc, + .tp_as_async = &FutureIterType_as_async, .tp_getattro = PyObject_GenericGetAttr, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_HAVE_AM_SEND, .tp_traverse = (traverseproc)FutureIter_traverse, .tp_iter = PyObject_SelfIter, .tp_iternext = (iternextfunc)FutureIter_iternext, diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 22d20d220d4089..4382b642dca7fb 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -6142,7 +6142,8 @@ awaitObject_await(awaitObject *ao) static PyAsyncMethods awaitType_as_async = { (unaryfunc)awaitObject_await, /* am_await */ 0, /* am_aiter */ - 0 /* am_anext */ + 0, /* am_anext */ + 0, /* am_send */ }; diff --git a/Objects/abstract.c b/Objects/abstract.c index 562549876beed8..44ed5b3932bf21 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2669,6 +2669,32 @@ PyIter_Next(PyObject *iter) return result; } +PySendResult +PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result) +{ + _Py_IDENTIFIER(send); + assert(arg != NULL); + assert(result != NULL); + if (PyType_HasFeature(Py_TYPE(iter), Py_TPFLAGS_HAVE_AM_SEND)) { + assert (Py_TYPE(iter)->tp_as_async != NULL); + assert (Py_TYPE(iter)->tp_as_async->am_send != NULL); + return Py_TYPE(iter)->tp_as_async->am_send(iter, arg, result); + } + if (arg == Py_None && PyIter_Check(iter)) { + *result = Py_TYPE(iter)->tp_iternext(iter); + } + else { + *result = _PyObject_CallMethodIdOneArg(iter, &PyId_send, arg); + } + if (*result != NULL) { + return PYGEN_NEXT; + } + if (_PyGen_FetchStopIterationValue(result) == 0) { + return PYGEN_RETURN; + } + return PYGEN_ERROR; +} + /* * Flatten a sequence of bytes() objects into a C array of * NULL terminated string pointers with a NULL char* terminating the array. diff --git a/Objects/genobject.c b/Objects/genobject.c index c1b26e9da33bea..bde92b462da199 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -268,30 +268,10 @@ gen_send_ex2(PyGenObject *gen, PyObject *arg, PyObject **presult, return result ? PYGEN_RETURN : PYGEN_ERROR; } -PySendResult -PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result) +static PySendResult +PyGen_am_send(PyGenObject *gen, PyObject *arg, PyObject **result) { - _Py_IDENTIFIER(send); - assert(arg != NULL); - assert(result != NULL); - - if (PyGen_CheckExact(iter) || PyCoro_CheckExact(iter)) { - return gen_send_ex2((PyGenObject *)iter, arg, result, 0, 0); - } - - if (arg == Py_None && PyIter_Check(iter)) { - *result = Py_TYPE(iter)->tp_iternext(iter); - } - else { - *result = _PyObject_CallMethodIdOneArg(iter, &PyId_send, arg); - } - if (*result != NULL) { - return PYGEN_NEXT; - } - if (_PyGen_FetchStopIterationValue(result) == 0) { - return PYGEN_RETURN; - } - return PYGEN_ERROR; + return gen_send_ex2(gen, arg, result, 0, 0); } static PyObject * @@ -788,6 +768,14 @@ static PyMethodDef gen_methods[] = { {NULL, NULL} /* Sentinel */ }; +static PyAsyncMethods gen_as_async = { + 0, /* am_await */ + 0, /* am_aiter */ + 0, /* am_anext */ + (sendfunc)PyGen_am_send, /* am_send */ +}; + + PyTypeObject PyGen_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "generator", /* tp_name */ @@ -798,7 +786,7 @@ PyTypeObject PyGen_Type = { 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_as_async */ + &gen_as_async, /* tp_as_async */ (reprfunc)gen_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -809,7 +797,8 @@ PyTypeObject PyGen_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_HAVE_AM_SEND, /* tp_flags */ 0, /* tp_doc */ (traverseproc)gen_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -1031,7 +1020,8 @@ static PyMethodDef coro_methods[] = { static PyAsyncMethods coro_as_async = { (unaryfunc)coro_await, /* am_await */ 0, /* am_aiter */ - 0 /* am_anext */ + 0, /* am_anext */ + (sendfunc)PyGen_am_send, /* am_send */ }; PyTypeObject PyCoro_Type = { @@ -1055,7 +1045,8 @@ PyTypeObject PyCoro_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_HAVE_AM_SEND, /* tp_flags */ 0, /* tp_doc */ (traverseproc)gen_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -1413,7 +1404,8 @@ static PyMethodDef async_gen_methods[] = { static PyAsyncMethods async_gen_as_async = { 0, /* am_await */ PyObject_SelfIter, /* am_aiter */ - (unaryfunc)async_gen_anext /* am_anext */ + (unaryfunc)async_gen_anext, /* am_anext */ + (sendfunc)PyGen_am_send, /* am_send */ }; @@ -1438,7 +1430,8 @@ PyTypeObject PyAsyncGen_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_HAVE_AM_SEND, /* tp_flags */ 0, /* tp_doc */ (traverseproc)async_gen_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -1676,7 +1669,8 @@ static PyMethodDef async_gen_asend_methods[] = { static PyAsyncMethods async_gen_asend_as_async = { PyObject_SelfIter, /* am_await */ 0, /* am_aiter */ - 0 /* am_anext */ + 0, /* am_anext */ + 0, /* am_send */ }; @@ -2084,7 +2078,8 @@ static PyMethodDef async_gen_athrow_methods[] = { static PyAsyncMethods async_gen_athrow_as_async = { PyObject_SelfIter, /* am_await */ 0, /* am_aiter */ - 0 /* am_anext */ + 0, /* am_anext */ + 0, /* am_send */ }; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 55bf9b3f389273..b4188b8bcaf045 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -5427,6 +5427,13 @@ PyType_Ready(PyTypeObject *type) _PyObject_ASSERT((PyObject *)type, type->tp_vectorcall_offset > 0); _PyObject_ASSERT((PyObject *)type, type->tp_call != NULL); } + /* Consistency check for Py_TPFLAGS_HAVE_AM_SEND - flag requires + * type->tp_as_async->am_send to be present. + */ + if (type->tp_flags & Py_TPFLAGS_HAVE_AM_SEND) { + _PyObject_ASSERT((PyObject *)type, type->tp_as_async != NULL); + _PyObject_ASSERT((PyObject *)type, type->tp_as_async->am_send != NULL); + } type->tp_flags |= Py_TPFLAGS_READYING; diff --git a/Objects/typeslots.inc b/Objects/typeslots.inc index ffc9bb2e1c7710..cc4ef1170fd28e 100644 --- a/Objects/typeslots.inc +++ b/Objects/typeslots.inc @@ -79,3 +79,4 @@ offsetof(PyHeapTypeObject, as_async.am_await), offsetof(PyHeapTypeObject, as_async.am_aiter), offsetof(PyHeapTypeObject, as_async.am_anext), offsetof(PyHeapTypeObject, ht_type.tp_finalize), +offsetof(PyHeapTypeObject, as_async.am_send), From 6c9b5d3e31b025512e7590daeeb133677156e876 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 10 Nov 2020 21:10:22 +0100 Subject: [PATCH 0506/1261] bpo-42260: Fix _PyConfig_Read() if compute_path_config=0 (GH-23220) Fix _PyConfig_Read() if compute_path_config=0: use values set by Py_SetPath(), Py_SetPythonHome() and Py_SetProgramName(). Add compute_path_config parameter to _PyConfig_InitPathConfig(). The following functions now return NULL if called before Py_Initialize(): * Py_GetExecPrefix() * Py_GetPath() * Py_GetPrefix() * Py_GetProgramFullPath() * Py_GetProgramName() * Py_GetPythonHome() These functions no longer automatically computes the Python Path Configuration. Moreover, Py_SetPath() no longer computes program_full_path. --- Doc/c-api/init.rst | 36 ++++++++ Doc/c-api/init_config.rst | 38 ++++---- Doc/whatsnew/3.10.rst | 8 ++ Include/internal/pycore_initconfig.h | 4 +- .../2020-11-10-14-27-39.bpo-42260.-Br3Co.rst | 7 ++ Python/initconfig.c | 4 +- Python/pathconfig.c | 89 ++++--------------- Python/pylifecycle.c | 2 +- 8 files changed, 93 insertions(+), 95 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-10-14-27-39.bpo-42260.-Br3Co.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 3d18bb3f0b9d85..5736b83f211fb0 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -376,6 +376,12 @@ Process-wide parameters The returned string points into static storage; the caller should not modify its value. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. c:function:: wchar_t* Py_GetPrefix() @@ -389,6 +395,12 @@ Process-wide parameters script at build time. The value is available to Python code as ``sys.prefix``. It is only useful on Unix. See also the next function. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. c:function:: wchar_t* Py_GetExecPrefix() @@ -424,6 +436,12 @@ Process-wide parameters while having :file:`/usr/local/plat` be a different filesystem for each platform. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. c:function:: wchar_t* Py_GetProgramFullPath() @@ -437,6 +455,12 @@ Process-wide parameters static storage; the caller should not modify its value. The value is available to Python code as ``sys.executable``. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. c:function:: wchar_t* Py_GetPath() @@ -455,8 +479,14 @@ Process-wide parameters can be (and usually is) modified later to change the search path for loading modules. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + .. XXX should give the exact rules + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. c:function:: void Py_SetPath(const wchar_t *) @@ -638,6 +668,12 @@ Process-wide parameters :c:func:`Py_SetPythonHome`, or the value of the :envvar:`PYTHONHOME` environment variable if it is set. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. _threads: diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index edfeba5db7dfab..db7c1f43765785 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -24,11 +24,15 @@ There are two kinds of configuration: environments variables are ignored, the LC_CTYPE locale is left unchanged and no signal handler is registred. +The :c:func:`Py_RunMain` function can be used to write a customized Python +program. + See also :ref:`Initialization, Finalization, and Threads `. .. seealso:: :pep:`587` "Python Initialization Configuration". + Example ======= @@ -532,7 +536,7 @@ PyConfig Default: ``NULL``. - Part of the :ref:`Path Configuration ` output. + Part of the :ref:`Python Path Configuration ` output. .. c:member:: wchar_t* base_executable @@ -544,7 +548,7 @@ PyConfig Default: ``NULL``. - Part of the :ref:`Path Configuration ` output. + Part of the :ref:`Python Path Configuration ` output. .. c:member:: wchar_t* base_prefix @@ -552,7 +556,7 @@ PyConfig Default: ``NULL``. - Part of the :ref:`Path Configuration ` output. + Part of the :ref:`Python Path Configuration ` output. .. c:member:: int buffered_stdio @@ -634,7 +638,7 @@ PyConfig Default: ``NULL``. - Part of the :ref:`Path Configuration ` output. + Part of the :ref:`Python Path Configuration ` output. .. c:member:: wchar_t* executable @@ -643,7 +647,7 @@ PyConfig Default: ``NULL``. - Part of the :ref:`Path Configuration ` output. + Part of the :ref:`Python Path Configuration ` output. .. c:member:: int faulthandler @@ -726,7 +730,7 @@ PyConfig Default: ``NULL``. - Part of the :ref:`Path Configuration ` input. + Part of the :ref:`Python Path Configuration ` input. .. c:member:: int import_time @@ -817,7 +821,7 @@ PyConfig Default: value of the ``PLATLIBDIR`` macro which is set at configure time by ``--with-platlibdir`` (default: ``"lib"``). - Part of the :ref:`Path Configuration ` input. + Part of the :ref:`Python Path Configuration ` input. .. versionadded:: 3.9 @@ -830,7 +834,7 @@ PyConfig Default: ``NULL``. - Part of the :ref:`Path Configuration ` input. + Part of the :ref:`Python Path Configuration ` input. .. c:member:: PyWideStringList module_search_paths .. c:member:: int module_search_paths_set @@ -838,14 +842,14 @@ PyConfig Module search paths: :data:`sys.path`. If :c:member:`~PyConfig.module_search_paths_set` is equal to 0, the - function calculating the :ref:`Path Configuration ` + function calculating the :ref:`Python Path Configuration ` overrides the :c:member:`~PyConfig.module_search_paths` and sets :c:member:`~PyConfig.module_search_paths_set` to ``1``. Default: empty list (``module_search_paths``) and ``0`` (``module_search_paths_set``). - Part of the :ref:`Path Configuration ` output. + Part of the :ref:`Python Path Configuration ` output. .. c:member:: int optimization_level @@ -911,7 +915,7 @@ PyConfig .. c:member:: int pathconfig_warnings - On Unix, if non-zero, calculating the :ref:`Path Configuration + On Unix, if non-zero, calculating the :ref:`Python Path Configuration ` can log warnings into ``stderr``. If equals to 0, suppress these warnings. @@ -919,7 +923,7 @@ PyConfig Default: ``1`` in Python mode, ``0`` in isolated mode. - Part of the :ref:`Path Configuration ` input. + Part of the :ref:`Python Path Configuration ` input. .. c:member:: wchar_t* prefix @@ -928,7 +932,7 @@ PyConfig Default: ``NULL``. - Part of the :ref:`Path Configuration ` output. + Part of the :ref:`Python Path Configuration ` output. .. c:member:: wchar_t* program_name @@ -946,7 +950,7 @@ PyConfig Default: ``NULL``. - Part of the :ref:`Path Configuration ` input. + Part of the :ref:`Python Path Configuration ` input. .. c:member:: wchar_t* pycache_prefix @@ -1262,7 +1266,7 @@ and user site directory. The C standard streams (ex: ``stdout``) and the LC_CTYPE locale are left unchanged. Signal handlers are not installed. Configuration files are still used with this configuration. Set the -:ref:`Path Configuration ` ("output fields") to ignore these +:ref:`Python Path Configuration ` ("output fields") to ignore these configuration files and avoid the function computing the default path configuration. @@ -1287,8 +1291,8 @@ and :ref:`Python UTF-8 Mode ` .. _init-path-config: -Path Configuration -================== +Python Path Configuration +========================= :c:type:`PyConfig` contains multiple fields for the path configuration: diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 95cdb06f997b19..76e11f0ddf0c06 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -493,6 +493,14 @@ Porting to Python 3.10 ``unicodedata.ucnhash_CAPI`` has been moved to the internal C API. (Contributed by Victor Stinner in :issue:`42157`.) +* :c:func:`Py_GetPath`, :c:func:`Py_GetPrefix`, :c:func:`Py_GetExecPrefix`, + :c:func:`Py_GetProgramFullPath`, :c:func:`Py_GetPythonHome` and + :c:func:`Py_GetProgramName` functions now return ``NULL`` if called before + :c:func:`Py_Initialize` (before Python is initialized). Use the new + :ref:`Python Initialization Configuration API ` to get the + :ref:`Python Path Configuration. `. + (Contributed by Victor Stinner in :issue:`42260`.) + Deprecated ---------- diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h index d8400b1c42e01f..28cd57030e2181 100644 --- a/Include/internal/pycore_initconfig.h +++ b/Include/internal/pycore_initconfig.h @@ -151,7 +151,9 @@ PyAPI_FUNC(void) _PyConfig_InitCompatConfig(PyConfig *config); extern PyStatus _PyConfig_Copy( PyConfig *config, const PyConfig *config2); -extern PyStatus _PyConfig_InitPathConfig(PyConfig *config); +extern PyStatus _PyConfig_InitPathConfig( + PyConfig *config, + int compute_path_config); extern PyStatus _PyConfig_Read(PyConfig *config, int compute_path_config); extern PyStatus _PyConfig_Write(const PyConfig *config, struct pyruntimestate *runtime); diff --git a/Misc/NEWS.d/next/C API/2020-11-10-14-27-39.bpo-42260.-Br3Co.rst b/Misc/NEWS.d/next/C API/2020-11-10-14-27-39.bpo-42260.-Br3Co.rst new file mode 100644 index 00000000000000..e7b5a558fd4c58 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-10-14-27-39.bpo-42260.-Br3Co.rst @@ -0,0 +1,7 @@ +:c:func:`Py_GetPath`, :c:func:`Py_GetPrefix`, :c:func:`Py_GetExecPrefix`, +:c:func:`Py_GetProgramFullPath`, :c:func:`Py_GetPythonHome` and +:c:func:`Py_GetProgramName` functions now return ``NULL`` if called before +:c:func:`Py_Initialize` (before Python is initialized). Use the new +:ref:`Python Initialization Configuration API ` to get the +:ref:`Python Path Configuration. `. Patch by Victor +Stinner. diff --git a/Python/initconfig.c b/Python/initconfig.c index 11db4a3ef599d5..1fcc3600aa4666 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -2069,8 +2069,8 @@ config_read(PyConfig *config, int compute_path_config) } } - if (compute_path_config && config->_install_importlib) { - status = _PyConfig_InitPathConfig(config); + if (config->_install_importlib) { + status = _PyConfig_InitPathConfig(config, compute_path_config); if (_PyStatus_EXCEPTION(status)) { return status; } diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 12a684a66b718e..470aba75bea969 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -332,7 +332,8 @@ config_init_module_search_paths(PyConfig *config, _PyPathConfig *pathconfig) - _PyPathConfig_Calculate() */ static PyStatus -pathconfig_calculate(_PyPathConfig *pathconfig, const PyConfig *config) +pathconfig_init(_PyPathConfig *pathconfig, const PyConfig *config, + int compute_path_config) { PyStatus status; @@ -349,12 +350,9 @@ pathconfig_calculate(_PyPathConfig *pathconfig, const PyConfig *config) goto done; } - if (_Py_path_config.module_search_path == NULL) { + if (compute_path_config) { status = _PyPathConfig_Calculate(pathconfig, config); } - else { - /* Py_SetPath() has been called: avoid _PyPathConfig_Calculate() */ - } done: PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); @@ -363,17 +361,19 @@ pathconfig_calculate(_PyPathConfig *pathconfig, const PyConfig *config) static PyStatus -config_calculate_pathconfig(PyConfig *config) +config_init_pathconfig(PyConfig *config, int compute_path_config) { _PyPathConfig pathconfig = _PyPathConfig_INIT; PyStatus status; - status = pathconfig_calculate(&pathconfig, config); + status = pathconfig_init(&pathconfig, config, compute_path_config); if (_PyStatus_EXCEPTION(status)) { goto done; } - if (!config->module_search_paths_set) { + if (!config->module_search_paths_set + && pathconfig.module_search_path != NULL) + { status = config_init_module_search_paths(config, &pathconfig); if (_PyStatus_EXCEPTION(status)) { goto done; @@ -381,7 +381,7 @@ config_calculate_pathconfig(PyConfig *config) } #define COPY_ATTR(PATH_ATTR, CONFIG_ATTR) \ - if (config->CONFIG_ATTR == NULL) { \ + if (config->CONFIG_ATTR == NULL && pathconfig.PATH_ATTR != NULL) { \ if (copy_wstr(&config->CONFIG_ATTR, pathconfig.PATH_ATTR) < 0) { \ goto no_memory; \ } \ @@ -427,7 +427,7 @@ config_calculate_pathconfig(PyConfig *config) PyStatus -_PyConfig_InitPathConfig(PyConfig *config) +_PyConfig_InitPathConfig(PyConfig *config, int compute_path_config) { /* Do we need to calculate the path? */ if (!config->module_search_paths_set @@ -435,26 +435,26 @@ _PyConfig_InitPathConfig(PyConfig *config) || config->prefix == NULL || config->exec_prefix == NULL) { - PyStatus status = config_calculate_pathconfig(config); + PyStatus status = config_init_pathconfig(config, compute_path_config); if (_PyStatus_EXCEPTION(status)) { return status; } } - if (config->base_prefix == NULL) { + if (config->base_prefix == NULL && config->prefix != NULL) { if (copy_wstr(&config->base_prefix, config->prefix) < 0) { return _PyStatus_NO_MEMORY(); } } - if (config->base_exec_prefix == NULL) { + if (config->base_exec_prefix == NULL && config->exec_prefix != NULL) { if (copy_wstr(&config->base_exec_prefix, config->exec_prefix) < 0) { return _PyStatus_NO_MEMORY(); } } - if (config->base_executable == NULL) { + if (config->base_executable == NULL && config->executable != NULL) { if (copy_wstr(&config->base_executable, config->executable) < 0) { return _PyStatus_NO_MEMORY(); @@ -465,53 +465,6 @@ _PyConfig_InitPathConfig(PyConfig *config) } -static PyStatus -pathconfig_global_read(_PyPathConfig *pathconfig) -{ - PyConfig config; - _PyConfig_InitCompatConfig(&config); - - /* Call _PyConfig_InitPathConfig() */ - PyStatus status = PyConfig_Read(&config); - if (_PyStatus_EXCEPTION(status)) { - goto done; - } - - status = pathconfig_set_from_config(pathconfig, &config); - -done: - PyConfig_Clear(&config); - return status; -} - - -static void -pathconfig_global_init(void) -{ - PyStatus status; - - if (_Py_path_config.module_search_path == NULL) { - status = pathconfig_global_read(&_Py_path_config); - if (_PyStatus_EXCEPTION(status)) { - Py_ExitStatusException(status); - } - } - else { - /* Global configuration already initialized */ - } - - assert(_Py_path_config.program_full_path != NULL); - assert(_Py_path_config.prefix != NULL); - assert(_Py_path_config.exec_prefix != NULL); - assert(_Py_path_config.module_search_path != NULL); - assert(_Py_path_config.program_name != NULL); - /* home can be NULL */ -#ifdef MS_WINDOWS - assert(_Py_path_config.base_executable != NULL); -#endif -} - - /* External interface */ static void _Py_NO_RETURN @@ -531,23 +484,17 @@ Py_SetPath(const wchar_t *path) PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - /* Getting the program full path calls pathconfig_global_init() */ - wchar_t *program_full_path = _PyMem_RawWcsdup(Py_GetProgramFullPath()); - - PyMem_RawFree(_Py_path_config.program_full_path); PyMem_RawFree(_Py_path_config.prefix); PyMem_RawFree(_Py_path_config.exec_prefix); PyMem_RawFree(_Py_path_config.module_search_path); - _Py_path_config.program_full_path = program_full_path; _Py_path_config.prefix = _PyMem_RawWcsdup(L""); _Py_path_config.exec_prefix = _PyMem_RawWcsdup(L""); _Py_path_config.module_search_path = _PyMem_RawWcsdup(path); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - if (_Py_path_config.program_full_path == NULL - || _Py_path_config.prefix == NULL + if (_Py_path_config.prefix == NULL || _Py_path_config.exec_prefix == NULL || _Py_path_config.module_search_path == NULL) { @@ -621,7 +568,6 @@ _Py_SetProgramFullPath(const wchar_t *program_full_path) wchar_t * Py_GetPath(void) { - pathconfig_global_init(); return _Py_path_config.module_search_path; } @@ -629,7 +575,6 @@ Py_GetPath(void) wchar_t * Py_GetPrefix(void) { - pathconfig_global_init(); return _Py_path_config.prefix; } @@ -637,7 +582,6 @@ Py_GetPrefix(void) wchar_t * Py_GetExecPrefix(void) { - pathconfig_global_init(); return _Py_path_config.exec_prefix; } @@ -645,7 +589,6 @@ Py_GetExecPrefix(void) wchar_t * Py_GetProgramFullPath(void) { - pathconfig_global_init(); return _Py_path_config.program_full_path; } @@ -653,7 +596,6 @@ Py_GetProgramFullPath(void) wchar_t* Py_GetPythonHome(void) { - pathconfig_global_init(); return _Py_path_config.home; } @@ -661,7 +603,6 @@ Py_GetPythonHome(void) wchar_t * Py_GetProgramName(void) { - pathconfig_global_init(); return _Py_path_config.program_name; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 609e0a42e4dfe6..93bce49b63d277 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1039,7 +1039,7 @@ init_interp_main(PyThreadState *tstate) } // Compute the path configuration - status = _PyConfig_InitPathConfig(&interp->config); + status = _PyConfig_InitPathConfig(&interp->config, 1); if (_PyStatus_EXCEPTION(status)) { return status; } From 256590347c39e7327ee3f7dfb89c459a3b6c1a29 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Wed, 11 Nov 2020 04:53:46 +0800 Subject: [PATCH 0507/1261] bpo-41073: PyType_GetSlot() can now accept static types. (GH-21931) PyType_GetSlot() can now accept static types. Co-Authored-By: Petr Viktorin Automerge-Triggered-By: GH:encukou --- Doc/c-api/type.rst | 6 +- Doc/whatsnew/3.10.rst | 3 + .../2020-07-08-21-01-49.bpo-41073.VqQZON.rst | 1 + Modules/_testcapimodule.c | 62 ++++++- Objects/typeobject.c | 48 +++++- Objects/typeslots.inc | 162 +++++++++--------- Objects/typeslots.py | 24 ++- 7 files changed, 205 insertions(+), 101 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-07-08-21-01-49.bpo-41073.VqQZON.rst diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index fcd92e38e2428e..f9037c89d8bd3b 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -105,10 +105,12 @@ Type Objects See :c:member:`PyType_Slot.slot` for possible values of the *slot* argument. - An exception is raised if *type* is not a heap type. - .. versionadded:: 3.4 + .. versionchanged:: 3.10 + :c:func:`PyType_GetSlot` can now accept all types. + Previously, it was limited to heap types. + .. c:function:: PyObject* PyType_GetModule(PyTypeObject *type) Return the module object associated with the given type when the type was diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 76e11f0ddf0c06..807e87f2eef118 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -436,6 +436,9 @@ New Features slot. (Contributed by Hai Shi in :issue:`41832`.) +* The :c:func:`PyType_GetSlot` function can accept static types. + (Contributed by Hai Shi and Petr Viktorin in :issue:`41073`.) + Porting to Python 3.10 ---------------------- diff --git a/Misc/NEWS.d/next/C API/2020-07-08-21-01-49.bpo-41073.VqQZON.rst b/Misc/NEWS.d/next/C API/2020-07-08-21-01-49.bpo-41073.VqQZON.rst new file mode 100644 index 00000000000000..1bec2f1a197e1a --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-07-08-21-01-49.bpo-41073.VqQZON.rst @@ -0,0 +1 @@ +:c:func:`PyType_GetSlot()` can now accept static types. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 4382b642dca7fb..7b6da1e4c90559 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -1018,6 +1018,62 @@ test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored)) } +static PyObject * +test_get_statictype_slots(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + newfunc tp_new = PyType_GetSlot(&PyLong_Type, Py_tp_new); + if (PyLong_Type.tp_new != tp_new) { + PyErr_SetString(PyExc_AssertionError, "mismatch: tp_new of long"); + return NULL; + } + + reprfunc tp_repr = PyType_GetSlot(&PyLong_Type, Py_tp_repr); + if (PyLong_Type.tp_repr != tp_repr) { + PyErr_SetString(PyExc_AssertionError, "mismatch: tp_repr of long"); + return NULL; + } + + ternaryfunc tp_call = PyType_GetSlot(&PyLong_Type, Py_tp_call); + if (tp_call != NULL) { + PyErr_SetString(PyExc_AssertionError, "mismatch: tp_call of long"); + return NULL; + } + + binaryfunc nb_add = PyType_GetSlot(&PyLong_Type, Py_nb_add); + if (PyLong_Type.tp_as_number->nb_add != nb_add) { + PyErr_SetString(PyExc_AssertionError, "mismatch: nb_add of long"); + return NULL; + } + + lenfunc mp_length = PyType_GetSlot(&PyLong_Type, Py_mp_length); + if (mp_length != NULL) { + PyErr_SetString(PyExc_AssertionError, "mismatch: mp_length of long"); + return NULL; + } + + void *over_value = PyType_GetSlot(&PyLong_Type, Py_bf_releasebuffer + 1); + if (over_value != NULL) { + PyErr_SetString(PyExc_AssertionError, "mismatch: max+1 of long"); + return NULL; + } + + tp_new = PyType_GetSlot(&PyLong_Type, 0); + if (tp_new != NULL) { + PyErr_SetString(PyExc_AssertionError, "mismatch: slot 0 of long"); + return NULL; + } + if (PyErr_ExceptionMatches(PyExc_SystemError)) { + // This is the right exception + PyErr_Clear(); + } + else { + return NULL; + } + + Py_RETURN_NONE; +} + + static PyObject * get_args(PyObject *self, PyObject *args) { @@ -5627,8 +5683,10 @@ static PyMethodDef TestMethods[] = { {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS}, {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS}, {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS}, - {"get_args", get_args, METH_VARARGS}, - {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS}, + {"get_args", get_args, METH_VARARGS}, + {"test_get_statictype_slots", test_get_statictype_slots, METH_NOARGS}, + {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, + METH_VARARGS|METH_KEYWORDS}, {"getargs_tuple", getargs_tuple, METH_VARARGS}, {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords, METH_VARARGS|METH_KEYWORDS}, diff --git a/Objects/typeobject.c b/Objects/typeobject.c index b4188b8bcaf045..4d0a3faeceb89d 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -56,6 +56,11 @@ static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP]; static unsigned int next_version_tag = 0; #endif +typedef struct PySlot_Offset { + short subslot_offset; + short slot_offset; +} PySlot_Offset; + #define MCACHE_STATS 0 #if MCACHE_STATS @@ -2870,8 +2875,18 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) return NULL; } -static const short slotoffsets[] = { - -1, /* invalid slot */ +/* An array of type slot offsets corresponding to Py_tp_* constants, + * for use in e.g. PyType_Spec and PyType_GetSlot. + * Each entry has two offsets: "slot_offset" and "subslot_offset". + * If is subslot_offset is -1, slot_offset is an offset within the + * PyTypeObject struct. + * Otherwise slot_offset is an offset to a pointer to a sub-slots struct + * (such as "tp_as_number"), and subslot_offset is the offset within + * that struct. + * The actual table is generated by a script. + */ +static const PySlot_Offset pyslot_offsets[] = { + {0, 0}, #include "typeslots.inc" }; @@ -2892,6 +2907,7 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) const PyType_Slot *slot; Py_ssize_t nmembers, weaklistoffset, dictoffset, vectorcalloffset; char *res_start; + short slot_offset, subslot_offset; nmembers = weaklistoffset = dictoffset = vectorcalloffset = 0; for (slot = spec->slots; slot->slot; slot++) { @@ -3001,7 +3017,7 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) for (slot = spec->slots; slot->slot; slot++) { if (slot->slot < 0 - || (size_t)slot->slot >= Py_ARRAY_LENGTH(slotoffsets)) { + || (size_t)slot->slot >= Py_ARRAY_LENGTH(pyslot_offsets)) { PyErr_SetString(PyExc_RuntimeError, "invalid slot offset"); goto fail; } @@ -3034,7 +3050,15 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) } else { /* Copy other slots directly */ - *(void**)(res_start + slotoffsets[slot->slot]) = slot->pfunc; + PySlot_Offset slotoffsets = pyslot_offsets[slot->slot]; + slot_offset = slotoffsets.slot_offset; + if (slotoffsets.subslot_offset == -1) { + *(void**)((char*)res_start + slot_offset) = slot->pfunc; + } else { + void *parent_slot = *(void**)((char*)res_start + slot_offset); + subslot_offset = slotoffsets.subslot_offset; + *(void**)((char*)parent_slot + subslot_offset) = slot->pfunc; + } } } if (type->tp_dealloc == NULL) { @@ -3117,15 +3141,23 @@ PyType_FromSpec(PyType_Spec *spec) void * PyType_GetSlot(PyTypeObject *type, int slot) { - if (!_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE) || slot < 0) { + void *parent_slot; + int slots_len = Py_ARRAY_LENGTH(pyslot_offsets); + + if (slot <= 0 || slot >= slots_len) { PyErr_BadInternalCall(); return NULL; } - if ((size_t)slot >= Py_ARRAY_LENGTH(slotoffsets)) { - /* Extension module requesting slot from a future version */ + + parent_slot = *(void**)((char*)type + pyslot_offsets[slot].slot_offset); + if (parent_slot == NULL) { return NULL; } - return *(void**)(((char*)type) + slotoffsets[slot]); + /* Return slot directly if we have no sub slot. */ + if (pyslot_offsets[slot].subslot_offset == -1) { + return parent_slot; + } + return *(void**)((char*)parent_slot + pyslot_offsets[slot].subslot_offset); } PyObject * diff --git a/Objects/typeslots.inc b/Objects/typeslots.inc index cc4ef1170fd28e..896daa7d8066b7 100644 --- a/Objects/typeslots.inc +++ b/Objects/typeslots.inc @@ -1,82 +1,82 @@ /* Generated by typeslots.py */ -offsetof(PyHeapTypeObject, as_buffer.bf_getbuffer), -offsetof(PyHeapTypeObject, as_buffer.bf_releasebuffer), -offsetof(PyHeapTypeObject, as_mapping.mp_ass_subscript), -offsetof(PyHeapTypeObject, as_mapping.mp_length), -offsetof(PyHeapTypeObject, as_mapping.mp_subscript), -offsetof(PyHeapTypeObject, as_number.nb_absolute), -offsetof(PyHeapTypeObject, as_number.nb_add), -offsetof(PyHeapTypeObject, as_number.nb_and), -offsetof(PyHeapTypeObject, as_number.nb_bool), -offsetof(PyHeapTypeObject, as_number.nb_divmod), -offsetof(PyHeapTypeObject, as_number.nb_float), -offsetof(PyHeapTypeObject, as_number.nb_floor_divide), -offsetof(PyHeapTypeObject, as_number.nb_index), -offsetof(PyHeapTypeObject, as_number.nb_inplace_add), -offsetof(PyHeapTypeObject, as_number.nb_inplace_and), -offsetof(PyHeapTypeObject, as_number.nb_inplace_floor_divide), -offsetof(PyHeapTypeObject, as_number.nb_inplace_lshift), -offsetof(PyHeapTypeObject, as_number.nb_inplace_multiply), -offsetof(PyHeapTypeObject, as_number.nb_inplace_or), -offsetof(PyHeapTypeObject, as_number.nb_inplace_power), -offsetof(PyHeapTypeObject, as_number.nb_inplace_remainder), -offsetof(PyHeapTypeObject, as_number.nb_inplace_rshift), -offsetof(PyHeapTypeObject, as_number.nb_inplace_subtract), -offsetof(PyHeapTypeObject, as_number.nb_inplace_true_divide), -offsetof(PyHeapTypeObject, as_number.nb_inplace_xor), -offsetof(PyHeapTypeObject, as_number.nb_int), -offsetof(PyHeapTypeObject, as_number.nb_invert), -offsetof(PyHeapTypeObject, as_number.nb_lshift), -offsetof(PyHeapTypeObject, as_number.nb_multiply), -offsetof(PyHeapTypeObject, as_number.nb_negative), -offsetof(PyHeapTypeObject, as_number.nb_or), -offsetof(PyHeapTypeObject, as_number.nb_positive), -offsetof(PyHeapTypeObject, as_number.nb_power), -offsetof(PyHeapTypeObject, as_number.nb_remainder), -offsetof(PyHeapTypeObject, as_number.nb_rshift), -offsetof(PyHeapTypeObject, as_number.nb_subtract), -offsetof(PyHeapTypeObject, as_number.nb_true_divide), -offsetof(PyHeapTypeObject, as_number.nb_xor), -offsetof(PyHeapTypeObject, as_sequence.sq_ass_item), -offsetof(PyHeapTypeObject, as_sequence.sq_concat), -offsetof(PyHeapTypeObject, as_sequence.sq_contains), -offsetof(PyHeapTypeObject, as_sequence.sq_inplace_concat), -offsetof(PyHeapTypeObject, as_sequence.sq_inplace_repeat), -offsetof(PyHeapTypeObject, as_sequence.sq_item), -offsetof(PyHeapTypeObject, as_sequence.sq_length), -offsetof(PyHeapTypeObject, as_sequence.sq_repeat), -offsetof(PyHeapTypeObject, ht_type.tp_alloc), -offsetof(PyHeapTypeObject, ht_type.tp_base), -offsetof(PyHeapTypeObject, ht_type.tp_bases), -offsetof(PyHeapTypeObject, ht_type.tp_call), -offsetof(PyHeapTypeObject, ht_type.tp_clear), -offsetof(PyHeapTypeObject, ht_type.tp_dealloc), -offsetof(PyHeapTypeObject, ht_type.tp_del), -offsetof(PyHeapTypeObject, ht_type.tp_descr_get), -offsetof(PyHeapTypeObject, ht_type.tp_descr_set), -offsetof(PyHeapTypeObject, ht_type.tp_doc), -offsetof(PyHeapTypeObject, ht_type.tp_getattr), -offsetof(PyHeapTypeObject, ht_type.tp_getattro), -offsetof(PyHeapTypeObject, ht_type.tp_hash), -offsetof(PyHeapTypeObject, ht_type.tp_init), -offsetof(PyHeapTypeObject, ht_type.tp_is_gc), -offsetof(PyHeapTypeObject, ht_type.tp_iter), -offsetof(PyHeapTypeObject, ht_type.tp_iternext), -offsetof(PyHeapTypeObject, ht_type.tp_methods), -offsetof(PyHeapTypeObject, ht_type.tp_new), -offsetof(PyHeapTypeObject, ht_type.tp_repr), -offsetof(PyHeapTypeObject, ht_type.tp_richcompare), -offsetof(PyHeapTypeObject, ht_type.tp_setattr), -offsetof(PyHeapTypeObject, ht_type.tp_setattro), -offsetof(PyHeapTypeObject, ht_type.tp_str), -offsetof(PyHeapTypeObject, ht_type.tp_traverse), -offsetof(PyHeapTypeObject, ht_type.tp_members), -offsetof(PyHeapTypeObject, ht_type.tp_getset), -offsetof(PyHeapTypeObject, ht_type.tp_free), -offsetof(PyHeapTypeObject, as_number.nb_matrix_multiply), -offsetof(PyHeapTypeObject, as_number.nb_inplace_matrix_multiply), -offsetof(PyHeapTypeObject, as_async.am_await), -offsetof(PyHeapTypeObject, as_async.am_aiter), -offsetof(PyHeapTypeObject, as_async.am_anext), -offsetof(PyHeapTypeObject, ht_type.tp_finalize), -offsetof(PyHeapTypeObject, as_async.am_send), +{offsetof(PyBufferProcs, bf_getbuffer), offsetof(PyTypeObject, tp_as_buffer)}, +{offsetof(PyBufferProcs, bf_releasebuffer), offsetof(PyTypeObject, tp_as_buffer)}, +{offsetof(PyMappingMethods, mp_ass_subscript), offsetof(PyTypeObject, tp_as_mapping)}, +{offsetof(PyMappingMethods, mp_length), offsetof(PyTypeObject, tp_as_mapping)}, +{offsetof(PyMappingMethods, mp_subscript), offsetof(PyTypeObject, tp_as_mapping)}, +{offsetof(PyNumberMethods, nb_absolute), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_add), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_and), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_bool), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_divmod), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_float), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_floor_divide), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_index), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_add), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_and), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_floor_divide), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_lshift), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_multiply), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_or), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_power), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_remainder), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_rshift), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_subtract), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_true_divide), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_xor), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_int), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_invert), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_lshift), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_multiply), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_negative), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_or), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_positive), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_power), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_remainder), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_rshift), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_subtract), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_true_divide), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_xor), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PySequenceMethods, sq_ass_item), offsetof(PyTypeObject, tp_as_sequence)}, +{offsetof(PySequenceMethods, sq_concat), offsetof(PyTypeObject, tp_as_sequence)}, +{offsetof(PySequenceMethods, sq_contains), offsetof(PyTypeObject, tp_as_sequence)}, +{offsetof(PySequenceMethods, sq_inplace_concat), offsetof(PyTypeObject, tp_as_sequence)}, +{offsetof(PySequenceMethods, sq_inplace_repeat), offsetof(PyTypeObject, tp_as_sequence)}, +{offsetof(PySequenceMethods, sq_item), offsetof(PyTypeObject, tp_as_sequence)}, +{offsetof(PySequenceMethods, sq_length), offsetof(PyTypeObject, tp_as_sequence)}, +{offsetof(PySequenceMethods, sq_repeat), offsetof(PyTypeObject, tp_as_sequence)}, +{-1, offsetof(PyTypeObject, tp_alloc)}, +{-1, offsetof(PyTypeObject, tp_base)}, +{-1, offsetof(PyTypeObject, tp_bases)}, +{-1, offsetof(PyTypeObject, tp_call)}, +{-1, offsetof(PyTypeObject, tp_clear)}, +{-1, offsetof(PyTypeObject, tp_dealloc)}, +{-1, offsetof(PyTypeObject, tp_del)}, +{-1, offsetof(PyTypeObject, tp_descr_get)}, +{-1, offsetof(PyTypeObject, tp_descr_set)}, +{-1, offsetof(PyTypeObject, tp_doc)}, +{-1, offsetof(PyTypeObject, tp_getattr)}, +{-1, offsetof(PyTypeObject, tp_getattro)}, +{-1, offsetof(PyTypeObject, tp_hash)}, +{-1, offsetof(PyTypeObject, tp_init)}, +{-1, offsetof(PyTypeObject, tp_is_gc)}, +{-1, offsetof(PyTypeObject, tp_iter)}, +{-1, offsetof(PyTypeObject, tp_iternext)}, +{-1, offsetof(PyTypeObject, tp_methods)}, +{-1, offsetof(PyTypeObject, tp_new)}, +{-1, offsetof(PyTypeObject, tp_repr)}, +{-1, offsetof(PyTypeObject, tp_richcompare)}, +{-1, offsetof(PyTypeObject, tp_setattr)}, +{-1, offsetof(PyTypeObject, tp_setattro)}, +{-1, offsetof(PyTypeObject, tp_str)}, +{-1, offsetof(PyTypeObject, tp_traverse)}, +{-1, offsetof(PyTypeObject, tp_members)}, +{-1, offsetof(PyTypeObject, tp_getset)}, +{-1, offsetof(PyTypeObject, tp_free)}, +{offsetof(PyNumberMethods, nb_matrix_multiply), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyNumberMethods, nb_inplace_matrix_multiply), offsetof(PyTypeObject, tp_as_number)}, +{offsetof(PyAsyncMethods, am_await), offsetof(PyTypeObject, tp_as_async)}, +{offsetof(PyAsyncMethods, am_aiter), offsetof(PyTypeObject, tp_as_async)}, +{offsetof(PyAsyncMethods, am_anext), offsetof(PyTypeObject, tp_as_async)}, +{-1, offsetof(PyTypeObject, tp_finalize)}, +{offsetof(PyAsyncMethods, am_send), offsetof(PyTypeObject, tp_as_async)}, diff --git a/Objects/typeslots.py b/Objects/typeslots.py index 9b6d4adbc7533b..8ab05f91be12b0 100755 --- a/Objects/typeslots.py +++ b/Objects/typeslots.py @@ -3,6 +3,7 @@ import sys, re + def generate_typeslots(out=sys.stdout): out.write("/* Generated by typeslots.py */\n") res = {} @@ -10,27 +11,34 @@ def generate_typeslots(out=sys.stdout): m = re.match("#define Py_([a-z_]+) ([0-9]+)", line) if not m: continue + member = m.group(1) if member.startswith("tp_"): - member = "ht_type."+member + member = f'{{-1, offsetof(PyTypeObject, {member})}}' elif member.startswith("am_"): - member = "as_async."+member + member = (f'{{offsetof(PyAsyncMethods, {member}),'+ + ' offsetof(PyTypeObject, tp_as_async)}') elif member.startswith("nb_"): - member = "as_number."+member + member = (f'{{offsetof(PyNumberMethods, {member}),'+ + ' offsetof(PyTypeObject, tp_as_number)}') elif member.startswith("mp_"): - member = "as_mapping."+member + member = (f'{{offsetof(PyMappingMethods, {member}),'+ + ' offsetof(PyTypeObject, tp_as_mapping)}') elif member.startswith("sq_"): - member = "as_sequence."+member + member = (f'{{offsetof(PySequenceMethods, {member}),'+ + ' offsetof(PyTypeObject, tp_as_sequence)}') elif member.startswith("bf_"): - member = "as_buffer."+member + member = (f'{{offsetof(PyBufferProcs, {member}),'+ + ' offsetof(PyTypeObject, tp_as_buffer)}') res[int(m.group(2))] = member M = max(res.keys())+1 for i in range(1,M): if i in res: - out.write("offsetof(PyHeapTypeObject, %s),\n" % res[i]) + out.write("%s,\n" % res[i]) else: - out.write("0,\n") + out.write("{0, 0},\n") + def main(): if len(sys.argv) == 2: From cf09d388b67fbb1b760f0aed56f195fe558507d1 Mon Sep 17 00:00:00 2001 From: Diogo Dutra Date: Tue, 10 Nov 2020 19:12:52 -0300 Subject: [PATCH 0508/1261] bpo-42140: Improve asyncio.wait function (GH-22938) # Improve asyncio.wait function The original code creates the futures set two times. We can create this set before, avoiding the second creation. This new behaviour [breaks the aiokafka library](https://github.com/aio-libs/aiokafka/pull/672), because it gives an iterator to that function, so the second iteration become empty. Automerge-Triggered-By: GH:1st1 --- Lib/asyncio/tasks.py | 6 +++-- Lib/test/test_asyncio/test_tasks.py | 24 +++++++++++++++++++ .../2020-10-24-04-02-36.bpo-42140.miLqvb.rst | 1 + 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-24-04-02-36.bpo-42140.miLqvb.rst diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index ad31f5d59796b1..f486b672294111 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -400,13 +400,15 @@ async def wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED): "and scheduled for removal in Python 3.10.", DeprecationWarning, stacklevel=2) - if any(coroutines.iscoroutine(f) for f in set(fs)): + fs = set(fs) + + if any(coroutines.iscoroutine(f) for f in fs): warnings.warn("The explicit passing of coroutine objects to " "asyncio.wait() is deprecated since Python 3.8, and " "scheduled for removal in Python 3.11.", DeprecationWarning, stacklevel=2) - fs = {ensure_future(f, loop=loop) for f in set(fs)} + fs = {ensure_future(f, loop=loop) for f in fs} return await _wait(fs, timeout, return_when, loop) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 74fc1e4a42133c..01f62b7f408726 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1548,6 +1548,30 @@ def gen(): loop.advance_time(10) loop.run_until_complete(asyncio.wait([a, b])) + def test_wait_with_iterator_of_tasks(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.1, when) + when = yield 0 + self.assertAlmostEqual(0.15, when) + yield 0.15 + + loop = self.new_test_loop(gen) + + a = self.new_task(loop, asyncio.sleep(0.1)) + b = self.new_task(loop, asyncio.sleep(0.15)) + + async def foo(): + done, pending = await asyncio.wait(iter([b, a])) + self.assertEqual(done, set([a, b])) + self.assertEqual(pending, set()) + return 42 + + res = loop.run_until_complete(self.new_task(loop, foo())) + self.assertEqual(res, 42) + self.assertAlmostEqual(0.15, loop.time()) + def test_as_completed(self): def gen(): diff --git a/Misc/NEWS.d/next/Library/2020-10-24-04-02-36.bpo-42140.miLqvb.rst b/Misc/NEWS.d/next/Library/2020-10-24-04-02-36.bpo-42140.miLqvb.rst new file mode 100644 index 00000000000000..4160234b5ec685 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-24-04-02-36.bpo-42140.miLqvb.rst @@ -0,0 +1 @@ +Improve asyncio.wait function to create the futures set just one time. From 31a4655e788991f93024995008e26da53f6481ac Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Wed, 11 Nov 2020 07:56:55 +0800 Subject: [PATCH 0509/1261] bpo-42294: Grammar fixes in doc glossary strong/weak refs (GH-23227) --- Doc/c-api/weakref.rst | 2 +- Doc/glossary.rst | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/c-api/weakref.rst b/Doc/c-api/weakref.rst index fb6628a1bbf022..9205ca620a6ad4 100644 --- a/Doc/c-api/weakref.rst +++ b/Doc/c-api/weakref.rst @@ -59,7 +59,7 @@ as much as it can. This function returns a :term:`borrowed reference` to the referenced object. This means that you should always call :c:func:`Py_INCREF` on the object - except it cannot be destroyed before the last usage of the borrowed + except when it cannot be destroyed before the last usage of the borrowed reference. diff --git a/Doc/glossary.rst b/Doc/glossary.rst index b410585ca818c1..0661c8283290ce 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -159,14 +159,14 @@ Glossary :class:`str` objects. borrowed reference - In the Python's C API, a borrowed reference is a reference to an object. + In Python's C API, a borrowed reference is a reference to an object. It does not modify the object reference count. It becomes a dangling pointer if the object is destroyed. For example, a garbage collection can remove the last :term:`strong reference` to the object and so destroy it. Calling :c:func:`Py_INCREF` on the :term:`borrowed reference` is recommended to convert it to a :term:`strong reference` in-place, except - if the object cannot be destroyed before the last usage of the borrowed + when the object cannot be destroyed before the last usage of the borrowed reference. The :c:func:`Py_NewRef` function can be used to create a new :term:`strong reference`. @@ -1113,9 +1113,9 @@ Glossary as :keyword:`if`, :keyword:`while` or :keyword:`for`. strong reference - In the Python's C API, a strong reference is a reference to an object - which increments object reference count when it is created and - decrements the object reference count when it is deleted. + In Python's C API, a strong reference is a reference to an object + which increments the object's reference count when it is created and + decrements the object's reference count when it is deleted. The :c:func:`Py_NewRef` function can be used to create a strong reference to an object. Usually, the :c:func:`Py_DECREF` function must be called on From 8c96e5420d893fa977c053397643a8096c560771 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 11 Nov 2020 01:52:26 +0100 Subject: [PATCH 0510/1261] bpo-1635741: Fix typo in PyModule_AddObjectRef() doc (GH-23234) It is similar to PyModule_AddObject(), not to itself. --- Doc/whatsnew/3.10.rst | 2 +- .../next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 807e87f2eef118..74c1c28ec0ff3b 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -424,7 +424,7 @@ New Features (Contributed by Alex Gaynor in :issue:`41784`.) * Added :c:func:`PyModule_AddObjectRef` function: similar to - :c:func:`PyModule_AddObjectRef` but don't steal a reference to the value on + :c:func:`PyModule_AddObject` but don't steal a reference to the value on success. (Contributed by Victor Stinner in :issue:`1635741`.) diff --git a/Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst b/Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst index 2ab1afb922fa8b..2c118129dbf104 100644 --- a/Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst +++ b/Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst @@ -1,3 +1,3 @@ Added :c:func:`PyModule_AddObjectRef` function: similar to -:c:func:`PyModule_AddObjectRef` but don't steal a reference to the value on +:c:func:`PyModule_AddObject` but don't steal a reference to the value on success. Patch by Victor Stinner. From c1f270934f6032b30bcb884d806766f4bdda97df Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Wed, 11 Nov 2020 10:14:12 +0300 Subject: [PATCH 0511/1261] bpo-39411: pyclbr rewrite on AST (#18103) - Rewrite pyclbr using an AST processor - Add is_async to the pyclbr.Function --- Doc/library/pyclbr.rst | 7 + Lib/pyclbr.py | 313 ++++++------------ Lib/test/test_pyclbr.py | 7 +- .../2020-01-21-16-38-25.bpo-39411.9uHFqT.rst | 2 + 4 files changed, 118 insertions(+), 211 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-21-16-38-25.bpo-39411.9uHFqT.rst diff --git a/Doc/library/pyclbr.rst b/Doc/library/pyclbr.rst index 36e83e85c23141..1c40ba4838ca75 100644 --- a/Doc/library/pyclbr.rst +++ b/Doc/library/pyclbr.rst @@ -97,6 +97,13 @@ statements. They have the following attributes: .. versionadded:: 3.7 +.. attribute:: Function.is_async + + ``True`` for functions that are defined with the ``async`` prefix, ``False`` otherwise. + + .. versionadded:: 3.10 + + .. _pyclbr-class-objects: Class Objects diff --git a/Lib/pyclbr.py b/Lib/pyclbr.py index 99a17343fb61fd..f0c8381946c614 100644 --- a/Lib/pyclbr.py +++ b/Lib/pyclbr.py @@ -25,7 +25,9 @@ children -- nested objects contained in this object. The 'children' attribute is a dictionary mapping names to objects. -Instances of Function describe functions with the attributes from _Object. +Instances of Function describe functions with the attributes from _Object, +plus the following: + is_async -- if a function is defined with an 'async' prefix Instances of Class describe classes with the attributes from _Object, plus the following: @@ -38,11 +40,10 @@ shouldn't happen often. """ -import io +import ast +import copy import sys import importlib.util -import tokenize -from token import NAME, DEDENT, OP __all__ = ["readmodule", "readmodule_ex", "Class", "Function"] @@ -58,41 +59,33 @@ def __init__(self, module, name, file, lineno, parent): self.lineno = lineno self.parent = parent self.children = {} - - def _addchild(self, name, obj): - self.children[name] = obj - + if parent is not None: + parent.children[name] = self class Function(_Object): "Information about a Python function, including methods." - def __init__(self, module, name, file, lineno, parent=None): - _Object.__init__(self, module, name, file, lineno, parent) - + def __init__(self, module, name, file, lineno, parent=None, is_async=False): + super().__init__(module, name, file, lineno, parent) + self.is_async = is_async + if isinstance(parent, Class): + parent.methods[name] = lineno class Class(_Object): "Information about a Python class." - def __init__(self, module, name, super, file, lineno, parent=None): - _Object.__init__(self, module, name, file, lineno, parent) - self.super = [] if super is None else super + def __init__(self, module, name, super_, file, lineno, parent=None): + super().__init__(module, name, file, lineno, parent) + self.super = super_ or [] self.methods = {} - def _addmethod(self, name, lineno): - self.methods[name] = lineno - - -def _nest_function(ob, func_name, lineno): +# These 2 functions are used in these tests +# Lib/test/test_pyclbr, Lib/idlelib/idle_test/test_browser.py +def _nest_function(ob, func_name, lineno, is_async=False): "Return a Function after nesting within ob." - newfunc = Function(ob.module, func_name, ob.file, lineno, ob) - ob._addchild(func_name, newfunc) - if isinstance(ob, Class): - ob._addmethod(func_name, lineno) - return newfunc + return Function(ob.module, func_name, ob.file, lineno, ob, is_async) def _nest_class(ob, class_name, lineno, super=None): "Return a Class after nesting within ob." - newclass = Class(ob.module, class_name, super, ob.file, lineno, ob) - ob._addchild(class_name, newclass) - return newclass + return Class(ob.module, class_name, super, ob.file, lineno, ob) def readmodule(module, path=None): """Return Class objects for the top-level classes in module. @@ -179,187 +172,95 @@ def _readmodule(module, path, inpackage=None): return _create_tree(fullmodule, path, fname, source, tree, inpackage) -def _create_tree(fullmodule, path, fname, source, tree, inpackage): - """Return the tree for a particular module. - - fullmodule (full module name), inpackage+module, becomes o.module. - path is passed to recursive calls of _readmodule. - fname becomes o.file. - source is tokenized. Imports cause recursive calls to _readmodule. - tree is {} or {'__path__': }. - inpackage, None or string, is passed to recursive calls of _readmodule. - - The effect of recursive calls is mutation of global _modules. - """ - f = io.StringIO(source) +class _ModuleBrowser(ast.NodeVisitor): + def __init__(self, module, path, file, tree, inpackage): + self.path = path + self.tree = tree + self.file = file + self.module = module + self.inpackage = inpackage + self.stack = [] + + def visit_ClassDef(self, node): + bases = [] + for base in node.bases: + name = ast.unparse(base) + if name in self.tree: + # We know this super class. + bases.append(self.tree[name]) + elif len(names := name.split(".")) > 1: + # Super class form is module.class: + # look in module for class. + *_, module, class_ = names + if module in _modules: + bases.append(_modules[module].get(class_, name)) + else: + bases.append(name) + + parent = self.stack[-1] if self.stack else None + class_ = Class( + self.module, node.name, bases, self.file, node.lineno, parent + ) + if parent is None: + self.tree[node.name] = class_ + self.stack.append(class_) + self.generic_visit(node) + self.stack.pop() + + def visit_FunctionDef(self, node, *, is_async=False): + parent = self.stack[-1] if self.stack else None + function = Function( + self.module, node.name, self.file, node.lineno, parent, is_async + ) + if parent is None: + self.tree[node.name] = function + self.stack.append(function) + self.generic_visit(node) + self.stack.pop() + + def visit_AsyncFunctionDef(self, node): + self.visit_FunctionDef(node, is_async=True) + + def visit_Import(self, node): + if node.col_offset != 0: + return + + for module in node.names: + try: + try: + _readmodule(module.name, self.path, self.inpackage) + except ImportError: + _readmodule(module.name, []) + except (ImportError, SyntaxError): + # If we can't find or parse the imported module, + # too bad -- don't die here. + continue + + def visit_ImportFrom(self, node): + if node.col_offset != 0: + return + try: + module = "." * node.level + if node.module: + module += node.module + module = _readmodule(module, self.path, self.inpackage) + except (ImportError, SyntaxError): + return + + for name in node.names: + if name.name in module: + self.tree[name.asname or name.name] = module[name.name] + elif name.name == "*": + for import_name, import_value in module.items(): + if import_name.startswith("_"): + continue + self.tree[import_name] = import_value - stack = [] # Initialize stack of (class, indent) pairs. - g = tokenize.generate_tokens(f.readline) - try: - for tokentype, token, start, _end, _line in g: - if tokentype == DEDENT: - lineno, thisindent = start - # Close previous nested classes and defs. - while stack and stack[-1][1] >= thisindent: - del stack[-1] - elif token == 'def': - lineno, thisindent = start - # Close previous nested classes and defs. - while stack and stack[-1][1] >= thisindent: - del stack[-1] - tokentype, func_name, start = next(g)[0:3] - if tokentype != NAME: - continue # Skip def with syntax error. - cur_func = None - if stack: - cur_obj = stack[-1][0] - cur_func = _nest_function(cur_obj, func_name, lineno) - else: - # It is just a function. - cur_func = Function(fullmodule, func_name, fname, lineno) - tree[func_name] = cur_func - stack.append((cur_func, thisindent)) - elif token == 'class': - lineno, thisindent = start - # Close previous nested classes and defs. - while stack and stack[-1][1] >= thisindent: - del stack[-1] - tokentype, class_name, start = next(g)[0:3] - if tokentype != NAME: - continue # Skip class with syntax error. - # Parse what follows the class name. - tokentype, token, start = next(g)[0:3] - inherit = None - if token == '(': - names = [] # Initialize list of superclasses. - level = 1 - super = [] # Tokens making up current superclass. - while True: - tokentype, token, start = next(g)[0:3] - if token in (')', ',') and level == 1: - n = "".join(super) - if n in tree: - # We know this super class. - n = tree[n] - else: - c = n.split('.') - if len(c) > 1: - # Super class form is module.class: - # look in module for class. - m = c[-2] - c = c[-1] - if m in _modules: - d = _modules[m] - if c in d: - n = d[c] - names.append(n) - super = [] - if token == '(': - level += 1 - elif token == ')': - level -= 1 - if level == 0: - break - elif token == ',' and level == 1: - pass - # Only use NAME and OP (== dot) tokens for type name. - elif tokentype in (NAME, OP) and level == 1: - super.append(token) - # Expressions in the base list are not supported. - inherit = names - if stack: - cur_obj = stack[-1][0] - cur_class = _nest_class( - cur_obj, class_name, lineno, inherit) - else: - cur_class = Class(fullmodule, class_name, inherit, - fname, lineno) - tree[class_name] = cur_class - stack.append((cur_class, thisindent)) - elif token == 'import' and start[1] == 0: - modules = _getnamelist(g) - for mod, _mod2 in modules: - try: - # Recursively read the imported module. - if inpackage is None: - _readmodule(mod, path) - else: - try: - _readmodule(mod, path, inpackage) - except ImportError: - _readmodule(mod, []) - except: - # If we can't find or parse the imported module, - # too bad -- don't die here. - pass - elif token == 'from' and start[1] == 0: - mod, token = _getname(g) - if not mod or token != "import": - continue - names = _getnamelist(g) - try: - # Recursively read the imported module. - d = _readmodule(mod, path, inpackage) - except: - # If we can't find or parse the imported module, - # too bad -- don't die here. - continue - # Add any classes that were defined in the imported module - # to our name space if they were mentioned in the list. - for n, n2 in names: - if n in d: - tree[n2 or n] = d[n] - elif n == '*': - # Don't add names that start with _. - for n in d: - if n[0] != '_': - tree[n] = d[n] - except StopIteration: - pass - - f.close() - return tree - - -def _getnamelist(g): - """Return list of (dotted-name, as-name or None) tuples for token source g. - - An as-name is the name that follows 'as' in an as clause. - """ - names = [] - while True: - name, token = _getname(g) - if not name: - break - if token == 'as': - name2, token = _getname(g) - else: - name2 = None - names.append((name, name2)) - while token != "," and "\n" not in token: - token = next(g)[1] - if token != ",": - break - return names - - -def _getname(g): - "Return (dotted-name or None, next-token) tuple for token source g." - parts = [] - tokentype, token = next(g)[0:2] - if tokentype != NAME and token != '*': - return (None, token) - parts.append(token) - while True: - tokentype, token = next(g)[0:2] - if token != '.': - break - tokentype, token = next(g)[0:2] - if tokentype != NAME: - break - parts.append(token) - return (".".join(parts), token) +def _create_tree(fullmodule, path, fname, source, tree, inpackage): + mbrowser = _ModuleBrowser(fullmodule, path, fname, tree, inpackage) + mbrowser.visit(ast.parse(source)) + return mbrowser.tree def _main(): diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index 869799cfa9a66b..2c7afa994f3058 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -150,9 +150,6 @@ def test_easy(self): self.checkModule('difflib', ignore=("Match",)) def test_decorators(self): - # XXX: See comment in pyclbr_input.py for a test that would fail - # if it were not commented out. - # self.checkModule('test.pyclbr_input', ignore=['om']) def test_nested(self): @@ -160,10 +157,10 @@ def test_nested(self): # Set arguments for descriptor creation and _creat_tree call. m, p, f, t, i = 'test', '', 'test.py', {}, None source = dedent("""\ - def f0: + def f0(): def f1(a,b,c): def f2(a=1, b=2, c=3): pass - return f1(a,b,d) + return f1(a,b,d) class c1: pass class C0: "Test class." diff --git a/Misc/NEWS.d/next/Library/2020-01-21-16-38-25.bpo-39411.9uHFqT.rst b/Misc/NEWS.d/next/Library/2020-01-21-16-38-25.bpo-39411.9uHFqT.rst new file mode 100644 index 00000000000000..2377eef4b9f717 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-21-16-38-25.bpo-39411.9uHFqT.rst @@ -0,0 +1,2 @@ +Add an ``is_async`` identifier to :mod:`pyclbr`'s ``Function`` objects. +Patch by Batuhan Taskaya From b2c8fc50b9a951ba77cad91adc3c376d977641aa Mon Sep 17 00:00:00 2001 From: Ammar Askar Date: Wed, 11 Nov 2020 02:29:56 -0500 Subject: [PATCH 0512/1261] bpo-40932: Note security caveat of shlex.quote on Windows (GH-21502) Added a note in the `subprocess` docs that recommend using `shlex.quote` without mentioning that this is only applicable to Unix. Also added a warning straight into the `shlex` docs since it only says "for simple syntaxes resembling that of the Unix shell" and says using `quote` plugs the security hole without mentioning this important caveat. --- Doc/library/shlex.rst | 14 ++++++++++++++ Doc/library/subprocess.rst | 7 ++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst index 7f7f0c7f124ac5..aab6a543792096 100644 --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -61,6 +61,20 @@ The :mod:`shlex` module defines the following functions: string that can safely be used as one token in a shell command line, for cases where you cannot use a list. + .. _shlex-quote-warning: + + .. warning:: + + The ``shlex`` module is **only designed for Unix shells**. + + The :func:`quote` function is not guaranteed to be correct on non-POSIX + compliant shells or shells from other operating systems such as Windows. + Executing commands quoted by this module on such shells can open up the + possibility of a command injection vulnerability. + + Consider using functions that pass command arguments with lists such as + :func:`subprocess.run` with ``shell=False``. + This idiom would be unsafe: >>> filename = 'somefile; rm -rf ~' diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 85d0f46624cead..292f8be20aa987 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -718,11 +718,8 @@ If the shell is invoked explicitly, via ``shell=True``, it is the application's responsibility to ensure that all whitespace and metacharacters are quoted appropriately to avoid `shell injection `_ -vulnerabilities. - -When using ``shell=True``, the :func:`shlex.quote` function can be -used to properly escape whitespace and shell metacharacters in strings -that are going to be used to construct shell commands. +vulnerabilities. On :ref:`some platforms `, it is possible +to use :func:`shlex.quote` for this escaping. Popen Objects From 9da39e55ba6bed9864e9dd82d8048dc177f01c0e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 11 Nov 2020 14:27:32 +0100 Subject: [PATCH 0513/1261] bpo-40170: Fix PyType_Ready() refleak on static type (GH-23236) bpo-1635741, bpo-40170: When called on a static type with NULL tp_base, PyType_Ready() no longer increments the reference count of the PyBaseObject_Type ("object). PyTypeObject.tp_base is a strong reference on a heap type, but it is borrowed reference on a static type. Fix 99 reference leaks at Python exit (showrefcount 18623 => 18524). --- Include/cpython/object.h | 1 + Objects/typeobject.c | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Include/cpython/object.h b/Include/cpython/object.h index ec6a3647677766..43b0be37557a3f 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -244,6 +244,7 @@ struct _typeobject { struct PyMethodDef *tp_methods; struct PyMemberDef *tp_members; struct PyGetSetDef *tp_getset; + // Strong reference on a heap type, borrowed reference on a static type struct _typeobject *tp_base; PyObject *tp_dict; descrgetfunc tp_descr_get; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 4d0a3faeceb89d..fd018b8b032fe6 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -5487,8 +5487,13 @@ PyType_Ready(PyTypeObject *type) /* Initialize tp_base (defaults to BaseObject unless that's us) */ base = type->tp_base; if (base == NULL && type != &PyBaseObject_Type) { - base = type->tp_base = &PyBaseObject_Type; - Py_INCREF(base); + base = &PyBaseObject_Type; + if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) { + type->tp_base = (PyTypeObject*)Py_NewRef((PyObject*)base); + } + else { + type->tp_base = base; + } } /* Now the only way base can still be NULL is if type is From 6092a8177d8664960f040e224b93b14fbdf821df Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Wed, 11 Nov 2020 17:48:53 +0200 Subject: [PATCH 0514/1261] Fix memory leak introduced by GH-22780 (GH-23237) --- Modules/_asynciomodule.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index d1d0f6bc75e424..01e36c656da8fb 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1628,6 +1628,7 @@ FutureIter_am_send(futureiterobject *it, it->future = NULL; res = _asyncio_Future_result_impl(fut); if (res != NULL) { + Py_DECREF(fut); *result = res; return PYGEN_RETURN; } From 18fc9b8c7d17e3e0c9315890a593a58e53ba2d2f Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 12 Nov 2020 09:43:29 +0000 Subject: [PATCH 0515/1261] bpo-42246: Partial implementation of PEP 626. (GH-23113) * Implement new line number table format, as defined in PEP 626. --- Include/cpython/code.h | 28 +- Lib/dis.py | 33 +- Lib/test/test_code.py | 2 +- Lib/test/test_compile.py | 4 +- Lib/test/test_opcodes.py | 2 +- Lib/test/test_pdb.py | 3 +- Lib/test/test_sys_settrace.py | 18 +- .../2020-11-02-15-48-17.bpo-42246.3CNQEX.rst | 2 + Objects/clinic/codeobject.c.h | 26 +- Objects/codeobject.c | 388 +- Objects/frameobject.c | 36 +- Objects/lnotab_notes.txt | 108 +- Python/ceval.c | 73 +- Python/compile.c | 202 +- Python/importlib.h | 3051 +++++------ Python/importlib_external.h | 4666 +++++++++-------- Python/importlib_zipimport.h | 1681 +++--- Python/marshal.c | 12 +- Tools/gdb/libpython.py | 17 +- 19 files changed, 5358 insertions(+), 4994 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-02-15-48-17.bpo-42246.3CNQEX.rst diff --git a/Include/cpython/code.h b/Include/cpython/code.h index cda28ac6ee9343..c3065bb8c4ee87 100644 --- a/Include/cpython/code.h +++ b/Include/cpython/code.h @@ -38,7 +38,7 @@ struct PyCodeObject { Py_ssize_t *co_cell2arg; /* Maps cell vars which are arguments. */ PyObject *co_filename; /* unicode (where it was loaded from) */ PyObject *co_name; /* unicode (name, for reference) */ - PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See + PyObject *co_linetable; /* string (encoding addr<->lineno mapping) See Objects/lnotab_notes.txt for details. */ void *co_zombieframe; /* for optimization only (see frameobject.c) */ PyObject *co_weakreflist; /* to support weakrefs to code objects */ @@ -135,16 +135,18 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); /* for internal use only */ -typedef struct _addr_pair { - int ap_lower; - int ap_upper; -} PyAddrPair; +typedef struct _line_offsets { + int ar_start; + int ar_end; + int ar_line; + int ar_computed_line; + char *lo_next; +} PyCodeAddressRange; /* Update *bounds to describe the first and one-past-the-last instructions in the same line as lasti. Return the number of that line. */ -PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co, - int lasti, PyAddrPair *bounds); +PyAPI_FUNC(int) _PyCode_CheckLineNumber(int lasti, PyCodeAddressRange *bounds); /* Create a comparable key used to compare constants taking in account the * object type. It is used to make sure types are not coerced (e.g., float and @@ -163,3 +165,15 @@ PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra); PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra); + +/** API for initializing the line number table. */ +int _PyCode_InitAddressRange(PyCodeObject* co, PyCodeAddressRange *bounds); + +/** Out of process API for initializing the line number table. */ +void PyLineTable_InitAddressRange(char *linetable, int firstlineno, PyCodeAddressRange *range); + +/** API for traversing the line number table. */ +int PyLineTable_NextAddressRange(PyCodeAddressRange *range); +int PyLineTable_PreviousAddressRange(PyCodeAddressRange *range); + + diff --git a/Lib/dis.py b/Lib/dis.py index e289e176c78ffd..ea50f564c87dc7 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -449,32 +449,15 @@ def findlabels(code): def findlinestarts(code): """Find the offsets in a byte code which are start of lines in the source. - Generate pairs (offset, lineno) as described in Python/compile.c. - + Generate pairs (offset, lineno) """ - byte_increments = code.co_lnotab[0::2] - line_increments = code.co_lnotab[1::2] - bytecode_len = len(code.co_code) - - lastlineno = None - lineno = code.co_firstlineno - addr = 0 - for byte_incr, line_incr in zip(byte_increments, line_increments): - if byte_incr: - if lineno != lastlineno: - yield (addr, lineno) - lastlineno = lineno - addr += byte_incr - if addr >= bytecode_len: - # The rest of the lnotab byte offsets are past the end of - # the bytecode, so the lines were optimized away. - return - if line_incr >= 0x80: - # line_increments is an array of 8-bit signed integers - line_incr -= 0x100 - lineno += line_incr - if lineno != lastlineno: - yield (addr, lineno) + lastline = None + for start, end, line in code.co_lines(): + if line is not None and line != lastline: + lastline = line + yield start, line + return + class Bytecode: """The bytecode operations of a piece of code diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index ac3dde745603db..467e8e5e337f10 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -258,7 +258,7 @@ def func2(): ("co_cellvars", ("cellvar",)), ("co_filename", "newfilename"), ("co_name", "newname"), - ("co_lnotab", code2.co_lnotab), + ("co_linetable", code2.co_linetable), ): with self.subTest(attr=attr, value=value): new_code = code.replace(**{attr: value}) diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 6055192bf70503..0e06d118a047d5 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -155,8 +155,8 @@ def test_indentation(self): def test_leading_newlines(self): s256 = "".join(["\n"] * 256 + ["spam"]) co = compile(s256, 'fn', 'exec') - self.assertEqual(co.co_firstlineno, 257) - self.assertEqual(co.co_lnotab, bytes()) + self.assertEqual(co.co_firstlineno, 1) + self.assertEqual(list(co.co_lines()), [(0, 4, 257), (4, 8, None)]) def test_literals_with_leading_zeroes(self): for arg in ["077787", "0xj", "0x.", "0e", "090000000000000", diff --git a/Lib/test/test_opcodes.py b/Lib/test/test_opcodes.py index 1152eb65bb2c3d..e5103647219f76 100644 --- a/Lib/test/test_opcodes.py +++ b/Lib/test/test_opcodes.py @@ -27,7 +27,7 @@ def test_setup_annotations_line(self): with open(ann_module.__file__) as f: txt = f.read() co = compile(txt, ann_module.__file__, 'exec') - self.assertEqual(co.co_firstlineno, 3) + self.assertEqual(co.co_firstlineno, 1) except OSError: pass diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index e56451360d6438..4bb574fc5b7bff 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1645,9 +1645,10 @@ def test_errors_in_command(self): 'debug doesnotexist', 'c', ]) - stdout, _ = self.run_pdb_script('', commands + '\n') + stdout, _ = self.run_pdb_script('pass', commands + '\n') self.assertEqual(stdout.splitlines()[1:], [ + '-> pass', '(Pdb) *** SyntaxError: unexpected EOF while parsing', '(Pdb) ENTERING RECURSIVE DEBUGGER', diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index dd4418dd98b22a..66b1b360bec1db 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -220,8 +220,7 @@ def ireturn_example(): (2, 'line'), (3, 'line'), (4, 'line'), - (6, 'line'), - (6, 'return')] + (4, 'return')] # Tight loop with while(1) example (SF #765624) def tightloop_example(): @@ -602,6 +601,17 @@ def run(tracer): self.compare_events(doit_async.__code__.co_firstlineno, tracer.events, events) + def test_21_repeated_pass(self): + def func(): + pass + pass + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (2, 'return')]) + def test_loop_in_try_except(self): # https://bugs.python.org/issue41670 @@ -766,7 +776,7 @@ def trace(self, frame, event, arg): if (self.firstLine is None and frame.f_code == self.code and event == 'line'): self.firstLine = frame.f_lineno - 1 - if (event == self.event and self.firstLine and + if (event == self.event and self.firstLine is not None and frame.f_lineno == self.firstLine + self.jumpFrom): f = frame while f is not None and f.f_code != self.code: @@ -1540,7 +1550,7 @@ def test_jump_to_firstlineno(self): """, "", "exec") class fake_function: __code__ = code - tracer = JumpTracer(fake_function, 2, 0) + tracer = JumpTracer(fake_function, 4, 1) sys.settrace(tracer.trace) namespace = {"output": []} exec(code, namespace) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-02-15-48-17.bpo-42246.3CNQEX.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-02-15-48-17.bpo-42246.3CNQEX.rst new file mode 100644 index 00000000000000..358454ce40a7f1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-02-15-48-17.bpo-42246.3CNQEX.rst @@ -0,0 +1,2 @@ +Improved accuracy of line tracing events and f_lineno attribute of Frame +objects. See PEP 626 for details. diff --git a/Objects/clinic/codeobject.c.h b/Objects/clinic/codeobject.c.h index c7395375e64692..bae2ab07644858 100644 --- a/Objects/clinic/codeobject.c.h +++ b/Objects/clinic/codeobject.c.h @@ -5,7 +5,7 @@ preserve PyDoc_STRVAR(code_new__doc__, "code(argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize,\n" " flags, codestring, constants, names, varnames, filename, name,\n" -" firstlineno, lnotab, freevars=(), cellvars=(), /)\n" +" firstlineno, linetable, freevars=(), cellvars=(), /)\n" "--\n" "\n" "Create a code object. Not for the faint of heart."); @@ -15,7 +15,7 @@ code_new_impl(PyTypeObject *type, int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *filename, PyObject *name, - int firstlineno, PyObject *lnotab, PyObject *freevars, + int firstlineno, PyObject *linetable, PyObject *freevars, PyObject *cellvars); static PyObject * @@ -35,7 +35,7 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) PyObject *filename; PyObject *name; int firstlineno; - PyObject *lnotab; + PyObject *linetable; PyObject *freevars = NULL; PyObject *cellvars = NULL; @@ -114,7 +114,7 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) _PyArg_BadArgument("code", "argument 14", "bytes", PyTuple_GET_ITEM(args, 13)); goto exit; } - lnotab = PyTuple_GET_ITEM(args, 13); + linetable = PyTuple_GET_ITEM(args, 13); if (PyTuple_GET_SIZE(args) < 15) { goto skip_optional; } @@ -132,7 +132,7 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) } cellvars = PyTuple_GET_ITEM(args, 15); skip_optional: - return_value = code_new_impl(type, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags, code, consts, names, varnames, filename, name, firstlineno, lnotab, freevars, cellvars); + return_value = code_new_impl(type, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags, code, consts, names, varnames, filename, name, firstlineno, linetable, freevars, cellvars); exit: return return_value; @@ -144,7 +144,7 @@ PyDoc_STRVAR(code_replace__doc__, " co_flags=-1, co_firstlineno=-1, co_code=None, co_consts=None,\n" " co_names=None, co_varnames=None, co_freevars=None,\n" " co_cellvars=None, co_filename=None, co_name=None,\n" -" co_lnotab=None)\n" +" co_linetable=None)\n" "--\n" "\n" "Return a copy of the code object with new values for the specified fields."); @@ -160,13 +160,13 @@ code_replace_impl(PyCodeObject *self, int co_argcount, PyObject *co_consts, PyObject *co_names, PyObject *co_varnames, PyObject *co_freevars, PyObject *co_cellvars, PyObject *co_filename, - PyObject *co_name, PyBytesObject *co_lnotab); + PyObject *co_name, PyBytesObject *co_linetable); static PyObject * code_replace(PyCodeObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"co_argcount", "co_posonlyargcount", "co_kwonlyargcount", "co_nlocals", "co_stacksize", "co_flags", "co_firstlineno", "co_code", "co_consts", "co_names", "co_varnames", "co_freevars", "co_cellvars", "co_filename", "co_name", "co_lnotab", NULL}; + static const char * const _keywords[] = {"co_argcount", "co_posonlyargcount", "co_kwonlyargcount", "co_nlocals", "co_stacksize", "co_flags", "co_firstlineno", "co_code", "co_consts", "co_names", "co_varnames", "co_freevars", "co_cellvars", "co_filename", "co_name", "co_linetable", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "replace", 0}; PyObject *argsbuf[16]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; @@ -185,7 +185,7 @@ code_replace(PyCodeObject *self, PyObject *const *args, Py_ssize_t nargs, PyObje PyObject *co_cellvars = self->co_cellvars; PyObject *co_filename = self->co_filename; PyObject *co_name = self->co_name; - PyBytesObject *co_lnotab = (PyBytesObject *)self->co_lnotab; + PyBytesObject *co_linetable = (PyBytesObject *)self->co_linetable; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); if (!args) { @@ -344,14 +344,14 @@ code_replace(PyCodeObject *self, PyObject *const *args, Py_ssize_t nargs, PyObje } } if (!PyBytes_Check(args[15])) { - _PyArg_BadArgument("replace", "argument 'co_lnotab'", "bytes", args[15]); + _PyArg_BadArgument("replace", "argument 'co_linetable'", "bytes", args[15]); goto exit; } - co_lnotab = (PyBytesObject *)args[15]; + co_linetable = (PyBytesObject *)args[15]; skip_optional_kwonly: - return_value = code_replace_impl(self, co_argcount, co_posonlyargcount, co_kwonlyargcount, co_nlocals, co_stacksize, co_flags, co_firstlineno, co_code, co_consts, co_names, co_varnames, co_freevars, co_cellvars, co_filename, co_name, co_lnotab); + return_value = code_replace_impl(self, co_argcount, co_posonlyargcount, co_kwonlyargcount, co_nlocals, co_stacksize, co_flags, co_firstlineno, co_code, co_consts, co_names, co_varnames, co_freevars, co_cellvars, co_filename, co_name, co_linetable); exit: return return_value; } -/*[clinic end generated code: output=18c31941ec09e9ca input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e3091c7baaaaa420 input=a9049054013a1b77]*/ diff --git a/Objects/codeobject.c b/Objects/codeobject.c index c86d0e1f4ab714..7b224cc145e47f 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -119,7 +119,7 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, int firstlineno, - PyObject *lnotab) + PyObject *linetable) { PyCodeObject *co; Py_ssize_t *cell2arg = NULL; @@ -137,7 +137,7 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, cellvars == NULL || !PyTuple_Check(cellvars) || name == NULL || !PyUnicode_Check(name) || filename == NULL || !PyUnicode_Check(filename) || - lnotab == NULL || !PyBytes_Check(lnotab)) { + linetable == NULL || !PyBytes_Check(linetable)) { PyErr_BadInternalCall(); return NULL; } @@ -258,8 +258,8 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, Py_INCREF(name); co->co_name = name; co->co_firstlineno = firstlineno; - Py_INCREF(lnotab); - co->co_lnotab = lnotab; + Py_INCREF(linetable); + co->co_linetable = linetable; co->co_zombieframe = NULL; co->co_weakreflist = NULL; co->co_extra = NULL; @@ -277,12 +277,12 @@ PyCode_New(int argcount, int kwonlyargcount, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, int firstlineno, - PyObject *lnotab) + PyObject *linetable) { return PyCode_NewWithPosOnlyArgs(argcount, 0, kwonlyargcount, nlocals, stacksize, flags, code, consts, names, varnames, freevars, cellvars, filename, - name, firstlineno, lnotab); + name, firstlineno, linetable); } int @@ -369,7 +369,7 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) filename_ob, /* filename */ funcname_ob, /* name */ firstlineno, /* firstlineno */ - emptystring /* lnotab */ + emptystring /* linetable */ ); failed: @@ -395,11 +395,89 @@ static PyMemberDef code_memberlist[] = { {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY}, {"co_filename", T_OBJECT, OFF(co_filename), READONLY}, {"co_name", T_OBJECT, OFF(co_name), READONLY}, - {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY}, - {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY}, + {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY}, + {"co_linetable", T_OBJECT, OFF(co_linetable), READONLY}, {NULL} /* Sentinel */ }; +static int +emit_pair(PyObject **bytes, int *offset, int a, int b) +{ + Py_ssize_t len = PyBytes_GET_SIZE(*bytes); + if (*offset + 2 >= len) { + if (_PyBytes_Resize(bytes, len * 2) < 0) + return 0; + } + unsigned char *lnotab = (unsigned char *) + PyBytes_AS_STRING(*bytes) + *offset; + *lnotab++ = a; + *lnotab++ = b; + *offset += 2; + return 1; +} + +static int +emit_delta(PyObject **bytes, int bdelta, int ldelta, int *offset) +{ + while (bdelta > 255) { + if (!emit_pair(bytes, offset, 255, 0)) { + return 0; + } + bdelta -= 255; + } + while (ldelta > 127) { + if (!emit_pair(bytes, offset, bdelta, 127)) { + return 0; + } + bdelta = 0; + ldelta -= 127; + } + while (ldelta < -128) { + if (!emit_pair(bytes, offset, bdelta, -128)) { + return 0; + } + bdelta = 0; + ldelta += 128; + } + return emit_pair(bytes, offset, bdelta, ldelta); +} + +static PyObject * +code_getlnotab(PyCodeObject *code, void *closure) +{ + PyCodeAddressRange bounds; + PyObject *bytes; + int table_offset = 0; + int code_offset = 0; + int line = code->co_firstlineno; + bytes = PyBytes_FromStringAndSize(NULL, 64); + if (bytes == NULL) { + return NULL; + } + _PyCode_InitAddressRange(code, &bounds); + while (PyLineTable_NextAddressRange(&bounds)) { + if (bounds.ar_computed_line != line) { + int bdelta = bounds.ar_start - code_offset; + int ldelta = bounds.ar_computed_line - line; + if (!emit_delta(&bytes, bdelta, ldelta, &table_offset)) { + Py_DECREF(bytes); + return NULL; + } + code_offset = bounds.ar_start; + line = bounds.ar_computed_line; + } + } + _PyBytes_Resize(&bytes, table_offset); + return bytes; +} + + +static PyGetSetDef code_getsetlist[] = { + {"co_lnotab", (getter)code_getlnotab, NULL, NULL}, + {0} +}; + + /* Helper for code_new: return a shallow copy of a tuple that is guaranteed to contain exact strings, by converting string subclasses to exact strings and complaining if a non-string is found. */ @@ -459,7 +537,7 @@ code.__new__ as code_new filename: unicode name: unicode firstlineno: int - lnotab: object(subclass_of="&PyBytes_Type") + linetable: object(subclass_of="&PyBytes_Type") freevars: object(subclass_of="&PyTuple_Type", c_default="NULL") = () cellvars: object(subclass_of="&PyTuple_Type", c_default="NULL") = () / @@ -472,9 +550,9 @@ code_new_impl(PyTypeObject *type, int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *filename, PyObject *name, - int firstlineno, PyObject *lnotab, PyObject *freevars, + int firstlineno, PyObject *linetable, PyObject *freevars, PyObject *cellvars) -/*[clinic end generated code: output=612aac5395830184 input=85e678ea4178f234]*/ +/*[clinic end generated code: output=42c1839b082ba293 input=0ec80da632b99f57]*/ { PyObject *co = NULL; PyObject *ournames = NULL; @@ -540,7 +618,7 @@ code_new_impl(PyTypeObject *type, int argcount, int posonlyargcount, code, consts, ournames, ourvarnames, ourfreevars, ourcellvars, filename, - name, firstlineno, lnotab); + name, firstlineno, linetable); cleanup: Py_XDECREF(ournames); Py_XDECREF(ourvarnames); @@ -584,7 +662,7 @@ code_dealloc(PyCodeObject *co) Py_XDECREF(co->co_cellvars); Py_XDECREF(co->co_filename); Py_XDECREF(co->co_name); - Py_XDECREF(co->co_lnotab); + Py_XDECREF(co->co_linetable); if (co->co_cell2arg != NULL) PyMem_FREE(co->co_cell2arg); if (co->co_zombieframe != NULL) @@ -636,7 +714,7 @@ code.replace co_cellvars: object(subclass_of="&PyTuple_Type", c_default="self->co_cellvars") = None co_filename: unicode(c_default="self->co_filename") = None co_name: unicode(c_default="self->co_name") = None - co_lnotab: PyBytesObject(c_default="(PyBytesObject *)self->co_lnotab") = None + co_linetable: PyBytesObject(c_default="(PyBytesObject *)self->co_linetable") = None Return a copy of the code object with new values for the specified fields. [clinic start generated code]*/ @@ -649,8 +727,8 @@ code_replace_impl(PyCodeObject *self, int co_argcount, PyObject *co_consts, PyObject *co_names, PyObject *co_varnames, PyObject *co_freevars, PyObject *co_cellvars, PyObject *co_filename, - PyObject *co_name, PyBytesObject *co_lnotab) -/*[clinic end generated code: output=25c8e303913bcace input=d9051bc8f24e6b28]*/ + PyObject *co_name, PyBytesObject *co_linetable) +/*[clinic end generated code: output=50d77e668d3b449b input=a5f997b173d7f636]*/ { #define CHECK_INT_ARG(ARG) \ if (ARG < 0) { \ @@ -680,7 +758,7 @@ code_replace_impl(PyCodeObject *self, int co_argcount, co_argcount, co_posonlyargcount, co_kwonlyargcount, co_nlocals, co_stacksize, co_flags, (PyObject*)co_code, co_consts, co_names, co_varnames, co_freevars, co_cellvars, co_filename, co_name, - co_firstlineno, (PyObject*)co_lnotab); + co_firstlineno, (PyObject*)co_linetable); } static PyObject * @@ -933,10 +1011,189 @@ code_hash(PyCodeObject *co) return h; } +typedef struct { + PyObject_HEAD + PyCodeObject *li_code; + PyCodeAddressRange li_line; + char *li_end; +} lineiterator; + + +static void +lineiter_dealloc(lineiterator *li) +{ + Py_DECREF(li->li_code); + Py_TYPE(li)->tp_free(li); +} + +static PyObject * +lineiter_next(lineiterator *li) +{ + PyCodeAddressRange *bounds = &li->li_line; + if (!PyLineTable_NextAddressRange(bounds)) { + return NULL; + } + PyObject *start = NULL; + PyObject *end = NULL; + PyObject *line = NULL; + PyObject *result = PyTuple_New(3); + start = PyLong_FromLong(bounds->ar_start); + end = PyLong_FromLong(bounds->ar_end); + if (bounds->ar_line < 0) { + Py_INCREF(Py_None); + line = Py_None; + } + else { + line = PyLong_FromLong(bounds->ar_line); + } + if (result == NULL || start == NULL || end == NULL || line == NULL) { + goto error; + } + PyTuple_SET_ITEM(result, 0, start); + PyTuple_SET_ITEM(result, 1, end); + PyTuple_SET_ITEM(result, 2, line); + return result; +error: + Py_XDECREF(start); + Py_XDECREF(end); + Py_XDECREF(line); + Py_XDECREF(result); + return result; +} + +static PyTypeObject LineIterator = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "line_iterator", /* tp_name */ + sizeof(lineiterator), /* tp_basicsize */ + 0, /* tp_itemsize */ + /* methods */ + (destructor)lineiter_dealloc, /* tp_dealloc */ + 0, /* tp_vectorcall_offset */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_as_async */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + PyObject_SelfIter, /* tp_iter */ + (iternextfunc)lineiter_next, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + PyObject_Del, /* tp_free */ +}; + +static PyObject * +code_linesiterator(PyCodeObject *code, PyObject *Py_UNUSED(args)) +{ + lineiterator *li = (lineiterator *)PyType_GenericAlloc(&LineIterator, 0); + if (li == NULL) { + return NULL; + } + Py_INCREF(code); + li->li_code = code; + _PyCode_InitAddressRange(code, &li->li_line); + return (PyObject *)li; +} + +static void +retreat(PyCodeAddressRange *bounds) +{ + int ldelta = ((signed char *)bounds->lo_next)[-1]; + if (ldelta == -128) { + ldelta = 0; + } + bounds->ar_computed_line -= ldelta; + bounds->lo_next -= 2; + bounds->ar_end = bounds->ar_start; + bounds->ar_start -= ((unsigned char *)bounds->lo_next)[-2]; + ldelta = ((signed char *)bounds->lo_next)[-1]; + if (ldelta == -128) { + bounds->ar_line = -1; + } + else { + bounds->ar_line = bounds->ar_computed_line; + } +} + +static void +advance(PyCodeAddressRange *bounds) +{ + bounds->ar_start = bounds->ar_end; + int delta = ((unsigned char *)bounds->lo_next)[0]; + assert (delta < 255); + bounds->ar_end += delta; + int ldelta = ((signed char *)bounds->lo_next)[1]; + bounds->lo_next += 2; + if (ldelta == -128) { + bounds->ar_line = -1; + } + else { + bounds->ar_computed_line += ldelta; + bounds->ar_line = bounds->ar_computed_line; + } +} + +static inline int +at_end(PyCodeAddressRange *bounds) { + return ((unsigned char *)bounds->lo_next)[0] == 255; +} + +int +PyLineTable_PreviousAddressRange(PyCodeAddressRange *range) +{ + if (range->ar_start <= 0) { + return 0; + } + retreat(range); + while (range->ar_start == range->ar_end) { + assert(range->ar_start > 0); + retreat(range); + } + return 1; +} + +int +PyLineTable_NextAddressRange(PyCodeAddressRange *range) +{ + if (at_end(range)) { + return 0; + } + advance(range); + while (range->ar_start == range->ar_end) { + assert(!at_end(range)); + advance(range); + } + return 1; +} + + /* XXX code objects need to participate in GC? */ static struct PyMethodDef code_methods[] = { {"__sizeof__", (PyCFunction)code_sizeof, METH_NOARGS}, + {"co_lines", (PyCFunction)code_linesiterator, METH_NOARGS}, CODE_REPLACE_METHODDEF {NULL, NULL} /* sentinel */ }; @@ -971,7 +1228,7 @@ PyTypeObject PyCode_Type = { 0, /* tp_iternext */ code_methods, /* tp_methods */ code_memberlist, /* tp_members */ - 0, /* tp_getset */ + code_getsetlist, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ @@ -982,78 +1239,55 @@ PyTypeObject PyCode_Type = { code_new, /* tp_new */ }; -/* Use co_lnotab to compute the line number from a bytecode index, addrq. See +/* Use co_linetable to compute the line number from a bytecode index, addrq. See lnotab_notes.txt for the details of the lnotab representation. */ int PyCode_Addr2Line(PyCodeObject *co, int addrq) { - Py_ssize_t size = PyBytes_Size(co->co_lnotab) / 2; - unsigned char *p = (unsigned char*)PyBytes_AsString(co->co_lnotab); - int line = co->co_firstlineno; - int addr = 0; - while (--size >= 0) { - addr += *p++; - if (addr > addrq) - break; - line += (signed char)*p; - p++; - } - return line; + if (addrq == -1) { + return co->co_firstlineno; + } + assert(addrq >= 0 && addrq < PyBytes_GET_SIZE(co->co_code)); + PyCodeAddressRange bounds; + _PyCode_InitAddressRange(co, &bounds); + return _PyCode_CheckLineNumber(addrq, &bounds); +} + +void +PyLineTable_InitAddressRange(char *linetable, int firstlineno, PyCodeAddressRange *range) +{ + range->lo_next = linetable; + range->ar_start = -1; + range->ar_end = 0; + range->ar_computed_line = range->ar_line = firstlineno; +} + +int +_PyCode_InitAddressRange(PyCodeObject* co, PyCodeAddressRange *bounds) +{ + char *linetable = PyBytes_AS_STRING(co->co_linetable); + PyLineTable_InitAddressRange(linetable, co->co_firstlineno, bounds); + return bounds->ar_line; } /* Update *bounds to describe the first and one-past-the-last instructions in - the same line as lasti. Return the number of that line. */ + the same line as lasti. Return the number of that line, or -1 if lasti is out of bounds. */ int -_PyCode_CheckLineNumber(PyCodeObject* co, int lasti, PyAddrPair *bounds) +_PyCode_CheckLineNumber(int lasti, PyCodeAddressRange *bounds) { - Py_ssize_t size; - int addr, line; - unsigned char* p; - - p = (unsigned char*)PyBytes_AS_STRING(co->co_lnotab); - size = PyBytes_GET_SIZE(co->co_lnotab) / 2; - - addr = 0; - line = co->co_firstlineno; - assert(line > 0); - - /* possible optimization: if f->f_lasti == instr_ub - (likely to be a common case) then we already know - instr_lb -- if we stored the matching value of p - somewhere we could skip the first while loop. */ - - /* See lnotab_notes.txt for the description of - co_lnotab. A point to remember: increments to p - come in (addr, line) pairs. */ - - bounds->ap_lower = 0; - while (size > 0) { - if (addr + *p > lasti) - break; - addr += *p++; - if ((signed char)*p) - bounds->ap_lower = addr; - line += (signed char)*p; - p++; - --size; - } - - if (size > 0) { - while (--size >= 0) { - addr += *p++; - if ((signed char)*p) - break; - p++; + while (bounds->ar_end <= lasti) { + if (!PyLineTable_NextAddressRange(bounds)) { + return -1; } - bounds->ap_upper = addr; } - else { - bounds->ap_upper = INT_MAX; + while (bounds->ar_start > lasti) { + if (!PyLineTable_PreviousAddressRange(bounds)) { + return -1; + } } - - return line; + return bounds->ar_line; } diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 8838b807462e4a..787cd8b272bb18 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -249,36 +249,22 @@ explain_incompatible_block_stack(int64_t to_stack) static int * marklines(PyCodeObject *code, int len) { + PyCodeAddressRange bounds; + _PyCode_InitAddressRange(code, &bounds); + assert (bounds.ar_end == 0); + int *linestarts = PyMem_New(int, len); if (linestarts == NULL) { return NULL; } - Py_ssize_t size = PyBytes_GET_SIZE(code->co_lnotab) / 2; - unsigned char *p = (unsigned char*)PyBytes_AS_STRING(code->co_lnotab); - int line = code->co_firstlineno; - int addr = 0; - int index = 0; - while (--size >= 0) { - addr += *p++; - if (index*2 < addr) { - linestarts[index++] = line; - } - while (index*2 < addr) { - linestarts[index++] = -1; - if (index >= len) { - break; - } - } - line += (signed char)*p; - p++; - } - if (index < len) { - linestarts[index++] = line; + for (int i = 0; i < len; i++) { + linestarts[i] = -1; } - while (index < len) { - linestarts[index++] = -1; + + while (PyLineTable_NextAddressRange(&bounds)) { + assert(bounds.ar_start/2 < len); + linestarts[bounds.ar_start/2] = bounds.ar_line; } - assert(index == len); return linestarts; } @@ -925,7 +911,7 @@ _PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, } f->f_lasti = -1; - f->f_lineno = code->co_firstlineno; + f->f_lineno = 0; f->f_iblock = 0; f->f_state = FRAME_CREATED; f->f_gen = NULL; diff --git a/Objects/lnotab_notes.txt b/Objects/lnotab_notes.txt index 71a297971828c0..046f753ed3232f 100644 --- a/Objects/lnotab_notes.txt +++ b/Objects/lnotab_notes.txt @@ -1,11 +1,103 @@ -All about co_lnotab, the line number table. - -Code objects store a field named co_lnotab. This is an array of unsigned bytes -disguised as a Python bytes object. It is used to map bytecode offsets to -source code line #s for tracebacks and to identify line number boundaries for -line tracing. Because of internals of the peephole optimizer, it's possible -for lnotab to contain bytecode offsets that are no longer valid (for example -if the optimizer removed the last line in a function). +Description of the internal format of the line number table + +Conceptually, the line number table consists of a sequence of triples: + start-offset (inclusive), end-offset (exclusive), line-number. + +Note that note all byte codes have a line number so we need handle `None` for the line-number. + +However, storing the above sequence directly would be very inefficient as we would need 12 bytes per entry. + +First of all, we can note that the end of one entry is the same as the start of the next, so we can overlap entries. +Secondly we also note that we don't really need arbitrary access to the sequence, so we can store deltas. + +We just need to store (end - start, line delta) pairs. The start offset of the first entry is always zero. + +Thirdly, most deltas are small, so we can use a single byte for each value, as long we allow several entries for the same line. + +Consider the following table + Start End Line + 0 6 1 + 6 50 2 + 50 350 7 + 350 360 No line number + 360 376 8 + 376 380 208 + +Stripping the redundant ends gives: + + End-Start Line-delta + 6 +1 + 44 +1 + 300 +5 + 10 No line number + 16 +1 + 4 +200 + + +Note that the end - start value is always positive. + +Finally in order, to fit into a single byte we need to convert start deltas to the range 0 <= delta <= 254, +and line deltas to the range -127 <= delta <= 127. +A line delta of -128 is used to indicate no line number. +A start delta of 255 is used as a sentinel to mark the end of the table. +Also note that a delta of zero indicates that there are no bytecodes in the given range, +which means can use an invalidate line number for that range. + +Final form: + + Start delta Line delta + 6 +1 + 44 +1 + 254 +5 + 46 0 + 10 -128 (No line number, treated as a delta of zero) + 16 +1 + 0 +127 (line 135, but the range is empty as no bytecodes are at line 135) + 4 +73 + 255 (end mark) --- + +Iterating over the table. +------------------------- + +For the `co_lines` attribute we want to emit the full form, omitting the (350, 360, No line number) and empty entries. + +The code is as follows: + +def co_lines(code): + line = code.co_firstlineno + end = 0 + table_iter = iter(code.internal_line_table): + for sdelta, ldelta in table_iter: + if sdelta == 255: + break + if ldelta == 0: # No change to line number, just accumulate changes to end + end += odelta + continue + start = end + end = start + sdelta + if ldelta == -128: # No valid line number -- skip entry + continue + line += ldelta + if end == start: # Empty range, omit. + continue + yield start, end, line + + + + +The historical co_lnotab format +------------------------------- + +prior to 3.10 code objects stored a field named co_lnotab. +This was an array of unsigned bytes disguised as a Python bytes object. + +The old co_lnotab did not account for the presence of bytecodes without a line number, +nor was it well suited to tracing as a number of workarounds were required. + +The old format can still be accessed via `code.co_lnotab`, which is lazily computed from the new format. + +Below is the description of the old co_lnotab format: + The array is conceptually a compressed list of (bytecode offset increment, line number increment) diff --git a/Python/ceval.c b/Python/ceval.c index 32e3019682f0ae..d6b786dc2cda0b 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -66,8 +66,8 @@ static void call_exc_trace(Py_tracefunc, PyObject *, PyThreadState *, PyFrameObject *); static int maybe_call_line_trace(Py_tracefunc, PyObject *, PyThreadState *, PyFrameObject *, - int *, int *, int *); -static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *); + PyCodeAddressRange *, int *); +static void maybe_dtrace_line(PyFrameObject *, PyCodeAddressRange *, int *); static void dtrace_function_entry(PyFrameObject *); static void dtrace_function_return(PyFrameObject *); @@ -976,7 +976,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) is true when the line being executed has changed. The initial values are such as to make this false the first time it is tested. */ - int instr_ub = -1, instr_lb = 0, instr_prev = -1; const _Py_CODEUNIT *first_instr; PyObject *names; @@ -1390,6 +1389,10 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) dtrace_function_entry(f); co = f->f_code; + PyCodeAddressRange bounds; + _PyCode_InitAddressRange(co, &bounds); + int instr_prev = -1; + names = co->co_names; consts = co->co_consts; fastlocals = f->f_localsplus; @@ -1514,7 +1517,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) f->f_lasti = INSTR_OFFSET(); if (PyDTrace_LINE_ENABLED()) - maybe_dtrace_line(f, &instr_lb, &instr_ub, &instr_prev); + maybe_dtrace_line(f, &bounds, &instr_prev); /* line-by-line tracing support */ @@ -1528,7 +1531,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) err = maybe_call_line_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f, - &instr_lb, &instr_ub, &instr_prev); + &bounds, &instr_prev); /* Reload possibly changed frame fields */ JUMPTO(f->f_lasti); stack_pointer = f->f_valuestack+f->f_stackdepth; @@ -4039,14 +4042,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) PUSH(exc); JUMPTO(handler); if (_Py_TracingPossible(ceval2)) { - int needs_new_execution_window = (f->f_lasti < instr_lb || f->f_lasti >= instr_ub); - int needs_line_update = (f->f_lasti == instr_lb || f->f_lasti < instr_prev); - /* Make sure that we trace line after exception if we are in a new execution - * window or we don't need a line update and we are not in the first instruction - * of the line. */ - if (needs_new_execution_window || (!needs_line_update && instr_lb > 0)) { - instr_prev = INT_MAX; - } + instr_prev = INT_MAX; } /* Resume normal execution */ f->f_state = FRAME_EXECUTING; @@ -4960,7 +4956,7 @@ _PyEval_CallTracing(PyObject *func, PyObject *args) static int maybe_call_line_trace(Py_tracefunc func, PyObject *obj, PyThreadState *tstate, PyFrameObject *frame, - int *instr_lb, int *instr_ub, int *instr_prev) + PyCodeAddressRange *bounds, int *instr_prev) { int result = 0; int line = frame->f_lineno; @@ -4968,21 +4964,17 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj, /* If the last instruction executed isn't in the current instruction window, reset the window. */ - if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) { - PyAddrPair bounds; - line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti, - &bounds); - *instr_lb = bounds.ap_lower; - *instr_ub = bounds.ap_upper; - } + line = _PyCode_CheckLineNumber(frame->f_lasti, bounds); /* If the last instruction falls at the start of a line or if it represents a jump backwards, update the frame's line number and then call the trace function if we're tracing source lines. */ - if ((frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev)) { - frame->f_lineno = line; - if (frame->f_trace_lines) { - result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None); + if ((line != frame->f_lineno || frame->f_lasti < *instr_prev)) { + if (line != -1) { + frame->f_lineno = line; + if (frame->f_trace_lines) { + result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None); + } } } /* Always emit an opcode event if we're tracing all opcodes. */ @@ -5907,33 +5899,28 @@ dtrace_function_return(PyFrameObject *f) /* DTrace equivalent of maybe_call_line_trace. */ static void maybe_dtrace_line(PyFrameObject *frame, - int *instr_lb, int *instr_ub, int *instr_prev) + PyCodeAddressRange *bounds, int *instr_prev) { - int line = frame->f_lineno; const char *co_filename, *co_name; /* If the last instruction executed isn't in the current instruction window, reset the window. */ - if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) { - PyAddrPair bounds; - line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti, - &bounds); - *instr_lb = bounds.ap_lower; - *instr_ub = bounds.ap_upper; - } + int line = _PyCode_CheckLineNumber(frame->f_lasti, bounds); /* If the last instruction falls at the start of a line or if it represents a jump backwards, update the frame's line number and call the trace function. */ - if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) { - frame->f_lineno = line; - co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename); - if (!co_filename) - co_filename = "?"; - co_name = PyUnicode_AsUTF8(frame->f_code->co_name); - if (!co_name) - co_name = "?"; - PyDTrace_LINE(co_filename, co_name, line); + if (line != frame->f_lineno || frame->f_lasti < *instr_prev) { + if (line != -1) { + frame->f_lineno = line; + co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename); + if (!co_filename) + co_filename = "?"; + co_name = PyUnicode_AsUTF8(frame->f_code->co_name); + if (!co_name) + co_name = "?"; + PyDTrace_LINE(co_filename, co_name, line); + } } *instr_prev = frame->f_lasti; } diff --git a/Python/compile.c b/Python/compile.c index 15a9046065b5df..b4f2ceb59a3f10 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1827,7 +1827,7 @@ compiler_mod(struct compiler *c, mod_ty mod) return NULL; } /* Use 0 for firstlineno initially, will fixup in assemble(). */ - if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0)) + if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 1)) return NULL; switch (mod->kind) { case Module_kind: @@ -2271,7 +2271,9 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async) c->u->u_argcount = asdl_seq_LEN(args->args); c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs); c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); - VISIT_SEQ_IN_SCOPE(c, stmt, body); + for (i = docstring ? 1 : 0; i < asdl_seq_LEN(body); i++) { + VISIT(c, stmt, (stmt_ty)asdl_seq_GET(body, i)); + } co = assemble(c, 1); qualname = c->u->u_qualname; Py_INCREF(qualname); @@ -2808,6 +2810,8 @@ compiler_async_for(struct compiler *c, stmt_ty s) /* Except block for __anext__ */ compiler_use_next_block(c, except); + + c->u->u_lineno = -1; ADDOP(c, END_ASYNC_FOR); /* `else` block */ @@ -3115,7 +3119,8 @@ compiler_try_except(struct compiler *c, stmt_ty s) compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body); ADDOP(c, POP_BLOCK); ADDOP(c, POP_EXCEPT); - /* name = None; del name */ + /* name = None; del name; # Mark as artificial */ + c->u->u_lineno = -1; ADDOP_LOAD_CONST(c, Py_None); compiler_nameop(c, handler->v.ExceptHandler.name, Store); compiler_nameop(c, handler->v.ExceptHandler.name, Del); @@ -3124,7 +3129,8 @@ compiler_try_except(struct compiler *c, stmt_ty s) /* except: */ compiler_use_next_block(c, cleanup_end); - /* name = None; del name */ + /* name = None; del name; # Mark as artificial */ + c->u->u_lineno = -1; ADDOP_LOAD_CONST(c, Py_None); compiler_nameop(c, handler->v.ExceptHandler.name, Store); compiler_nameop(c, handler->v.ExceptHandler.name, Del); @@ -3359,6 +3365,7 @@ compiler_visit_stmt_expr(struct compiler *c, expr_ty value) if (value->kind == Constant_kind) { /* ignore constant statement */ + ADDOP(c, NOP); return 1; } @@ -3431,6 +3438,7 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s) case Expr_kind: return compiler_visit_stmt_expr(c, s->v.Expr.value); case Pass_kind: + ADDOP(c, NOP); break; case Break_kind: return compiler_break(c); @@ -5429,8 +5437,9 @@ struct assembler { basicblock **a_reverse_postorder; /* list of blocks in dfs postorder */ PyObject *a_lnotab; /* string containing lnotab */ int a_lnotab_off; /* offset into lnotab */ - int a_lineno; /* last lineno of emitted instruction */ - int a_lineno_off; /* bytecode offset of last lineno */ + int a_prevlineno; /* lineno of last emitted line in line table */ + int a_lineno; /* lineno of last emitted instruction */ + int a_lineno_start; /* bytecode start offset of current lineno */ }; static void @@ -5533,7 +5542,7 @@ static int assemble_init(struct assembler *a, int nblocks, int firstlineno) { memset(a, 0, sizeof(struct assembler)); - a->a_lineno = firstlineno; + a->a_prevlineno = a->a_lineno = firstlineno; a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE); if (!a->a_bytecode) return 0; @@ -5573,114 +5582,82 @@ blocksize(basicblock *b) return size; } -/* Appends a pair to the end of the line number table, a_lnotab, representing - the instruction's bytecode offset and line number. See - Objects/lnotab_notes.txt for the description of the line number table. */ - static int -assemble_lnotab(struct assembler *a, struct instr *i) +assemble_emit_linetable_pair(struct assembler *a, int bdelta, int ldelta) { - int d_bytecode, d_lineno; - Py_ssize_t len; - unsigned char *lnotab; - - d_lineno = i->i_lineno - a->a_lineno; - if (d_lineno == 0) { - return 1; + Py_ssize_t len = PyBytes_GET_SIZE(a->a_lnotab); + if (a->a_lnotab_off + 2 >= len) { + if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0) + return 0; } + unsigned char *lnotab = (unsigned char *) + PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; + + a->a_lnotab_off += 2; + *lnotab++ = bdelta; + *lnotab++ = ldelta; + return 1; +} - d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT); - assert(d_bytecode >= 0); +/* Appends a range to the end of the line number table. See + * Objects/lnotab_notes.txt for the description of the line number table. */ - if (d_bytecode > 255) { - int j, nbytes, ncodes = d_bytecode / 255; - nbytes = a->a_lnotab_off + 2 * ncodes; - len = PyBytes_GET_SIZE(a->a_lnotab); - if (nbytes >= len) { - if ((len <= INT_MAX / 2) && (len * 2 < nbytes)) - len = nbytes; - else if (len <= INT_MAX / 2) - len *= 2; - else { - PyErr_NoMemory(); +static int +assemble_line_range(struct assembler *a) +{ + int ldelta, bdelta; + bdelta = (a->a_offset - a->a_lineno_start) * 2; + if (bdelta == 0) { + return 1; + } + if (a->a_lineno < 0) { + ldelta = -128; + } + else { + ldelta = a->a_lineno - a->a_prevlineno; + a->a_prevlineno = a->a_lineno; + while (ldelta > 127) { + if (!assemble_emit_linetable_pair(a, 0, 127)) { return 0; } - if (_PyBytes_Resize(&a->a_lnotab, len) < 0) - return 0; - } - lnotab = (unsigned char *) - PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; - for (j = 0; j < ncodes; j++) { - *lnotab++ = 255; - *lnotab++ = 0; + ldelta -= 127; } - d_bytecode -= ncodes * 255; - a->a_lnotab_off += ncodes * 2; - } - assert(0 <= d_bytecode && d_bytecode <= 255); - - if (d_lineno < -128 || 127 < d_lineno) { - int j, nbytes, ncodes, k; - if (d_lineno < 0) { - k = -128; - /* use division on positive numbers */ - ncodes = (-d_lineno) / 128; - } - else { - k = 127; - ncodes = d_lineno / 127; - } - d_lineno -= ncodes * k; - assert(ncodes >= 1); - nbytes = a->a_lnotab_off + 2 * ncodes; - len = PyBytes_GET_SIZE(a->a_lnotab); - if (nbytes >= len) { - if ((len <= INT_MAX / 2) && len * 2 < nbytes) - len = nbytes; - else if (len <= INT_MAX / 2) - len *= 2; - else { - PyErr_NoMemory(); + while (ldelta < -127) { + if (!assemble_emit_linetable_pair(a, 0, -127)) { return 0; } - if (_PyBytes_Resize(&a->a_lnotab, len) < 0) - return 0; + ldelta += 127; } - lnotab = (unsigned char *) - PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; - *lnotab++ = d_bytecode; - *lnotab++ = k; - d_bytecode = 0; - for (j = 1; j < ncodes; j++) { - *lnotab++ = 0; - *lnotab++ = k; - } - a->a_lnotab_off += ncodes * 2; } - assert(-128 <= d_lineno && d_lineno <= 127); - - len = PyBytes_GET_SIZE(a->a_lnotab); - if (a->a_lnotab_off + 2 >= len) { - if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0) + assert(-128 <= ldelta && ldelta < 128); + while (bdelta > 254) { + if (!assemble_emit_linetable_pair(a, 254, ldelta)) { return 0; + } + ldelta = a->a_lineno < 0 ? -128 : 0; + bdelta -= 254; } - lnotab = (unsigned char *) - PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; + if (!assemble_emit_linetable_pair(a, bdelta, ldelta)) { + return 0; + } + a->a_lineno_start = a->a_offset; + return 1; +} - a->a_lnotab_off += 2; - if (d_bytecode) { - *lnotab++ = d_bytecode; - *lnotab++ = d_lineno; +static int +assemble_lnotab(struct assembler *a, struct instr *i) +{ + if (i->i_lineno == a->a_lineno) { + return 1; } - else { /* First line of a block; def stmt, etc. */ - *lnotab++ = 0; - *lnotab++ = d_lineno; + if (!assemble_line_range(a)) { + return 0; } a->a_lineno = i->i_lineno; - a->a_lineno_off = a->a_offset; return 1; } + /* assemble_emit() Extend the bytecode with a new instruction. Update lnotab if necessary. @@ -5998,7 +5975,7 @@ assemble(struct compiler *c, int addNone) block ends with a jump or return b_next shouldn't set. */ if (!c->u->u_curblock->b_return) { - NEXT_BLOCK(c); + c->u->u_lineno = -1; if (addNone) ADDOP_LOAD_CONST(c, Py_None); ADDOP(c, RETURN_VALUE); @@ -6015,7 +5992,7 @@ assemble(struct compiler *c, int addNone) if (!c->u->u_firstlineno) { if (entryblock && entryblock->b_instr && entryblock->b_instr->i_lineno) c->u->u_firstlineno = entryblock->b_instr->i_lineno; - else + else c->u->u_firstlineno = 1; } if (!assemble_init(&a, nblocks, c->u->u_firstlineno)) @@ -6040,6 +6017,13 @@ assemble(struct compiler *c, int addNone) if (!assemble_emit(&a, &b->b_instr[j])) goto error; } + if (!assemble_line_range(&a)) { + return 0; + } + /* Emit sentinel at end of line number table */ + if (!assemble_emit_linetable_pair(&a, 255, -128)) { + goto error; + } if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) goto error; @@ -6280,22 +6264,42 @@ static void clean_basic_block(basicblock *bb) { /* Remove NOPs and any code following a return or re-raise. */ int dest = 0; + int prev_lineno = -1; for (int src = 0; src < bb->b_iused; src++) { + int lineno = bb->b_instr[src].i_lineno; switch(bb->b_instr[src].i_opcode) { - case NOP: - /* skip */ - break; case RETURN_VALUE: case RERAISE: bb->b_next = NULL; bb->b_instr[dest] = bb->b_instr[src]; dest++; goto end; + case NOP: + { + /* Eliminate no-op if it doesn't have a line number, or + * if the next instruction has same line number or no line number, or + * if the previous instruction had the same line number. */ + if (lineno < 0) { + break; + } + if (prev_lineno == lineno) { + break; + } + if (src < bb->b_iused - 1) { + int next_lineno = bb->b_instr[src+1].i_lineno; + if (next_lineno < 0 || next_lineno == lineno) { + bb->b_instr[src+1].i_lineno = lineno; + break; + } + } + } + /* fallthrough */ default: if (dest != src) { bb->b_instr[dest] = bb->b_instr[src]; } dest++; + prev_lineno = lineno; break; } } diff --git a/Python/importlib.h b/Python/importlib.h index 00d1f3570b3229..8778c973ef064f 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -70,150 +70,152 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 7,114,101,112,108,97,99,101,169,0,114,10,0,0,0,250, 29,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,218,5, - 95,119,114,97,112,27,0,0,0,115,8,0,0,0,0,2, - 8,1,10,1,20,1,114,12,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0, - 67,0,0,0,115,12,0,0,0,116,0,116,1,131,1,124, - 0,131,1,83,0,169,1,78,41,2,218,4,116,121,112,101, - 218,3,115,121,115,169,1,218,4,110,97,109,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,11,95,110, - 101,119,95,109,111,100,117,108,101,35,0,0,0,115,2,0, - 0,0,0,1,114,18,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,64,0, - 0,0,115,12,0,0,0,101,0,90,1,100,0,90,2,100, - 1,83,0,41,2,218,14,95,68,101,97,100,108,111,99,107, - 69,114,114,111,114,78,41,3,114,1,0,0,0,114,0,0, - 0,0,114,2,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,19,0,0,0, - 48,0,0,0,115,2,0,0,0,8,1,114,19,0,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,64,0,0,0,115,56,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, - 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, - 90,8,100,12,83,0,41,13,218,11,95,77,111,100,117,108, - 101,76,111,99,107,122,169,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,0,0,0,0,2,0,0, - 0,2,0,0,0,67,0,0,0,115,48,0,0,0,116,0, - 160,1,161,0,124,0,95,2,116,0,160,1,161,0,124,0, - 95,3,124,1,124,0,95,4,100,0,124,0,95,5,100,1, - 124,0,95,6,100,1,124,0,95,7,100,0,83,0,169,2, - 78,233,0,0,0,0,41,8,218,7,95,116,104,114,101,97, - 100,90,13,97,108,108,111,99,97,116,101,95,108,111,99,107, - 218,4,108,111,99,107,218,6,119,97,107,101,117,112,114,17, - 0,0,0,218,5,111,119,110,101,114,218,5,99,111,117,110, - 116,218,7,119,97,105,116,101,114,115,169,2,218,4,115,101, - 108,102,114,17,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,95,95,105,110,105,116,95,95, - 58,0,0,0,115,12,0,0,0,0,1,10,1,10,1,6, - 1,6,1,6,1,122,20,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,0,0,0,0,5,0,0,0,3,0,0,0, - 67,0,0,0,115,88,0,0,0,116,0,160,1,161,0,125, - 1,124,0,106,2,125,2,116,3,131,0,125,3,116,4,160, - 5,124,2,161,1,125,4,124,4,100,0,117,0,114,42,100, - 1,83,0,124,4,106,2,125,2,124,2,124,1,107,2,114, - 60,100,2,83,0,124,2,124,3,118,0,114,72,100,1,83, - 0,124,3,160,6,124,2,161,1,1,0,113,20,100,0,83, - 0,41,3,78,70,84,41,7,114,23,0,0,0,218,9,103, - 101,116,95,105,100,101,110,116,114,26,0,0,0,218,3,115, - 101,116,218,12,95,98,108,111,99,107,105,110,103,95,111,110, - 218,3,103,101,116,218,3,97,100,100,41,5,114,30,0,0, - 0,90,2,109,101,218,3,116,105,100,90,4,115,101,101,110, - 114,24,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,12,104,97,115,95,100,101,97,100,108,111, - 99,107,66,0,0,0,115,24,0,0,0,0,2,8,1,6, - 1,6,2,10,1,8,1,4,1,6,1,8,1,4,1,8, - 6,4,1,122,24,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,0,0,0,0,2,0,0,0,8,0, - 0,0,67,0,0,0,115,210,0,0,0,116,0,160,1,161, - 0,125,1,124,0,116,2,124,1,60,0,122,180,124,0,106, - 3,143,126,1,0,124,0,106,4,100,1,107,2,115,46,124, - 0,106,5,124,1,107,2,114,90,124,1,124,0,95,5,124, - 0,4,0,106,4,100,2,55,0,2,0,95,4,87,0,100, - 3,4,0,4,0,131,3,1,0,87,0,116,2,124,1,61, - 0,100,4,83,0,124,0,160,6,161,0,114,110,116,7,100, - 5,124,0,22,0,131,1,130,1,124,0,106,8,160,9,100, - 6,161,1,114,136,124,0,4,0,106,10,100,2,55,0,2, - 0,95,10,87,0,100,3,4,0,4,0,131,3,1,0,110, - 16,49,0,115,156,48,0,1,0,1,0,1,0,89,0,1, - 0,124,0,106,8,160,9,161,0,1,0,124,0,106,8,160, - 11,161,0,1,0,113,18,87,0,116,2,124,1,61,0,110, - 8,116,2,124,1,61,0,48,0,100,3,83,0,41,7,122, - 185,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,114,22,0,0,0,233, - 1,0,0,0,78,84,122,23,100,101,97,100,108,111,99,107, - 32,100,101,116,101,99,116,101,100,32,98,121,32,37,114,70, - 41,12,114,23,0,0,0,114,32,0,0,0,114,34,0,0, - 0,114,24,0,0,0,114,27,0,0,0,114,26,0,0,0, - 114,38,0,0,0,114,19,0,0,0,114,25,0,0,0,218, - 7,97,99,113,117,105,114,101,114,28,0,0,0,218,7,114, - 101,108,101,97,115,101,169,2,114,30,0,0,0,114,37,0, + 95,119,114,97,112,27,0,0,0,115,12,0,0,0,8,2, + 10,1,20,1,14,1,4,128,255,128,114,12,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 2,0,0,0,67,0,0,0,115,12,0,0,0,116,0,116, + 1,131,1,124,0,131,1,83,0,169,1,78,41,2,218,4, + 116,121,112,101,218,3,115,121,115,169,1,218,4,110,97,109, + 101,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,11,95,110,101,119,95,109,111,100,117,108,101,35,0,0, + 0,115,4,0,0,0,12,1,255,128,114,18,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,64,0,0,0,115,12,0,0,0,101,0,90, + 1,100,0,90,2,100,1,83,0,41,2,218,14,95,68,101, + 97,100,108,111,99,107,69,114,114,111,114,78,41,3,114,1, + 0,0,0,114,0,0,0,0,114,2,0,0,0,114,10,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,40,0,0,0,87,0,0,0,115,34,0,0,0,0, - 6,8,1,8,1,2,2,8,1,20,1,6,1,14,1,14, - 9,6,247,4,1,8,1,12,1,12,1,44,2,10,1,14, - 2,122,19,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,0, - 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, - 142,0,0,0,116,0,160,1,161,0,125,1,124,0,106,2, - 143,108,1,0,124,0,106,3,124,1,107,3,114,34,116,4, - 100,1,131,1,130,1,124,0,106,5,100,2,107,4,115,48, - 74,0,130,1,124,0,4,0,106,5,100,3,56,0,2,0, - 95,5,124,0,106,5,100,2,107,2,114,108,100,0,124,0, - 95,3,124,0,106,6,114,108,124,0,4,0,106,6,100,3, - 56,0,2,0,95,6,124,0,106,7,160,8,161,0,1,0, - 87,0,100,0,4,0,4,0,131,3,1,0,110,16,49,0, - 115,128,48,0,1,0,1,0,1,0,89,0,1,0,100,0, - 83,0,41,4,78,250,31,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,114,22,0,0,0,114,39,0,0,0, - 41,9,114,23,0,0,0,114,32,0,0,0,114,24,0,0, - 0,114,26,0,0,0,218,12,82,117,110,116,105,109,101,69, - 114,114,111,114,114,27,0,0,0,114,28,0,0,0,114,25, - 0,0,0,114,41,0,0,0,114,42,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,41,0,0, - 0,112,0,0,0,115,22,0,0,0,0,1,8,1,8,1, - 10,1,8,1,14,1,14,1,10,1,6,1,6,1,14,1, - 122,19,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,0,0, - 0,0,1,0,0,0,5,0,0,0,67,0,0,0,115,18, - 0,0,0,100,1,160,0,124,0,106,1,116,2,124,0,131, - 1,161,2,83,0,41,2,78,122,23,95,77,111,100,117,108, - 101,76,111,99,107,40,123,33,114,125,41,32,97,116,32,123, - 125,169,3,218,6,102,111,114,109,97,116,114,17,0,0,0, - 218,2,105,100,169,1,114,30,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,8,95,95,114,101, - 112,114,95,95,125,0,0,0,115,2,0,0,0,0,1,122, - 20,95,77,111,100,117,108,101,76,111,99,107,46,95,95,114, - 101,112,114,95,95,78,41,9,114,1,0,0,0,114,0,0, - 0,0,114,2,0,0,0,114,3,0,0,0,114,31,0,0, - 0,114,38,0,0,0,114,40,0,0,0,114,41,0,0,0, - 114,49,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,20,0,0,0,52,0, - 0,0,115,12,0,0,0,8,1,4,5,8,8,8,21,8, - 25,8,13,114,20,0,0,0,99,0,0,0,0,0,0,0, + 0,114,19,0,0,0,48,0,0,0,115,6,0,0,0,8, + 0,4,1,255,128,114,19,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,56,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,100,6,100,7,132,0,90,6,100,8,100,9, + 132,0,90,7,100,10,100,11,132,0,90,8,100,12,83,0, + 41,13,218,11,95,77,111,100,117,108,101,76,111,99,107,122, + 169,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,0,0,0,0,2,0,0,0,2,0,0,0,67, + 0,0,0,115,48,0,0,0,116,0,160,1,161,0,124,0, + 95,2,116,0,160,1,161,0,124,0,95,3,124,1,124,0, + 95,4,100,0,124,0,95,5,100,1,124,0,95,6,100,1, + 124,0,95,7,100,0,83,0,169,2,78,233,0,0,0,0, + 41,8,218,7,95,116,104,114,101,97,100,90,13,97,108,108, + 111,99,97,116,101,95,108,111,99,107,218,4,108,111,99,107, + 218,6,119,97,107,101,117,112,114,17,0,0,0,218,5,111, + 119,110,101,114,218,5,99,111,117,110,116,218,7,119,97,105, + 116,101,114,115,169,2,218,4,115,101,108,102,114,17,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,8,95,95,105,110,105,116,95,95,58,0,0,0,115,16, + 0,0,0,10,1,10,1,6,1,6,1,6,1,6,1,4, + 128,255,128,122,20,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,0,0,0,0,5,0,0,0,3,0,0,0,67,0, + 0,0,115,88,0,0,0,116,0,160,1,161,0,125,1,124, + 0,106,2,125,2,116,3,131,0,125,3,116,4,160,5,124, + 2,161,1,125,4,124,4,100,0,117,0,114,42,100,1,83, + 0,124,4,106,2,125,2,124,2,124,1,107,2,114,60,100, + 2,83,0,124,2,124,3,118,0,114,72,100,1,83,0,124, + 3,160,6,124,2,161,1,1,0,113,20,100,0,83,0,41, + 3,78,70,84,41,7,114,23,0,0,0,218,9,103,101,116, + 95,105,100,101,110,116,114,26,0,0,0,218,3,115,101,116, + 218,12,95,98,108,111,99,107,105,110,103,95,111,110,218,3, + 103,101,116,218,3,97,100,100,41,5,114,30,0,0,0,90, + 2,109,101,218,3,116,105,100,90,4,115,101,101,110,114,24, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,12,104,97,115,95,100,101,97,100,108,111,99,107, + 66,0,0,0,115,28,0,0,0,8,2,6,1,6,1,10, + 2,8,1,4,1,6,1,8,1,4,1,8,1,4,6,12, + 1,4,128,255,128,122,24,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,0,0,0,0,2,0,0,0, + 8,0,0,0,67,0,0,0,115,210,0,0,0,116,0,160, + 1,161,0,125,1,124,0,116,2,124,1,60,0,122,180,124, + 0,106,3,143,126,1,0,124,0,106,4,100,1,107,2,115, + 46,124,0,106,5,124,1,107,2,114,90,124,1,124,0,95, + 5,124,0,4,0,106,4,100,2,55,0,2,0,95,4,87, + 0,100,3,4,0,4,0,131,3,1,0,87,0,116,2,124, + 1,61,0,100,4,83,0,124,0,160,6,161,0,114,110,116, + 7,100,5,124,0,22,0,131,1,130,1,124,0,106,8,160, + 9,100,6,161,1,114,136,124,0,4,0,106,10,100,2,55, + 0,2,0,95,10,87,0,100,3,4,0,4,0,131,3,1, + 0,110,16,49,0,115,156,48,0,1,0,1,0,1,0,89, + 0,1,0,124,0,106,8,160,9,161,0,1,0,124,0,106, + 8,160,11,161,0,1,0,113,18,87,0,116,2,124,1,61, + 0,110,8,116,2,124,1,61,0,48,0,100,3,83,0,41, + 7,122,185,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,114,22,0,0, + 0,233,1,0,0,0,78,84,122,23,100,101,97,100,108,111, + 99,107,32,100,101,116,101,99,116,101,100,32,98,121,32,37, + 114,70,41,12,114,23,0,0,0,114,32,0,0,0,114,34, + 0,0,0,114,24,0,0,0,114,27,0,0,0,114,26,0, + 0,0,114,38,0,0,0,114,19,0,0,0,114,25,0,0, + 0,218,7,97,99,113,117,105,114,101,114,28,0,0,0,218, + 7,114,101,108,101,97,115,101,169,2,114,30,0,0,0,114, + 37,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,40,0,0,0,87,0,0,0,115,38,0,0, + 0,8,6,8,1,2,1,8,2,20,1,6,1,14,1,14, + 1,6,9,4,247,8,1,12,1,12,1,44,1,10,2,14, + 1,16,2,4,128,255,128,122,19,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,0,0,0,0,2,0,0,0,8,0,0, + 0,67,0,0,0,115,142,0,0,0,116,0,160,1,161,0, + 125,1,124,0,106,2,143,108,1,0,124,0,106,3,124,1, + 107,3,114,34,116,4,100,1,131,1,130,1,124,0,106,5, + 100,2,107,4,115,48,74,0,130,1,124,0,4,0,106,5, + 100,3,56,0,2,0,95,5,124,0,106,5,100,2,107,2, + 114,108,100,0,124,0,95,3,124,0,106,6,114,108,124,0, + 4,0,106,6,100,3,56,0,2,0,95,6,124,0,106,7, + 160,8,161,0,1,0,87,0,100,0,4,0,4,0,131,3, + 1,0,110,16,49,0,115,128,48,0,1,0,1,0,1,0, + 89,0,1,0,100,0,83,0,41,4,78,250,31,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,114,22,0,0, + 0,114,39,0,0,0,41,9,114,23,0,0,0,114,32,0, + 0,0,114,24,0,0,0,114,26,0,0,0,218,12,82,117, + 110,116,105,109,101,69,114,114,111,114,114,27,0,0,0,114, + 28,0,0,0,114,25,0,0,0,114,41,0,0,0,114,42, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,41,0,0,0,112,0,0,0,115,26,0,0,0, + 8,1,8,1,10,1,8,1,14,1,14,1,10,1,6,1, + 6,1,14,1,40,1,4,128,255,128,122,19,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,0,0,0,0,1,0,0,0, + 5,0,0,0,67,0,0,0,115,18,0,0,0,100,1,160, + 0,124,0,106,1,116,2,124,0,131,1,161,2,83,0,41, + 2,78,122,23,95,77,111,100,117,108,101,76,111,99,107,40, + 123,33,114,125,41,32,97,116,32,123,125,169,3,218,6,102, + 111,114,109,97,116,114,17,0,0,0,218,2,105,100,169,1, + 114,30,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,8,95,95,114,101,112,114,95,95,125,0, + 0,0,115,4,0,0,0,18,1,255,128,122,20,95,77,111, + 100,117,108,101,76,111,99,107,46,95,95,114,101,112,114,95, + 95,78,41,9,114,1,0,0,0,114,0,0,0,0,114,2, + 0,0,0,114,3,0,0,0,114,31,0,0,0,114,38,0, + 0,0,114,40,0,0,0,114,41,0,0,0,114,49,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,20,0,0,0,52,0,0,0,115,16, + 0,0,0,8,0,4,1,8,5,8,8,8,21,8,25,12, + 13,255,128,114,20,0,0,0,99,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, 0,115,48,0,0,0,101,0,90,1,100,0,90,2,100,1, 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, @@ -230,42 +232,43 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 124,1,124,0,95,0,100,1,124,0,95,1,100,0,83,0, 114,21,0,0,0,41,2,114,17,0,0,0,114,27,0,0, 0,114,29,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,31,0,0,0,133,0,0,0,115,4, - 0,0,0,0,1,6,1,122,25,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,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,18,0,0,0, - 124,0,4,0,106,0,100,1,55,0,2,0,95,0,100,2, - 83,0,41,3,78,114,39,0,0,0,84,41,1,114,27,0, - 0,0,114,48,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,40,0,0,0,137,0,0,0,115, - 4,0,0,0,0,1,14,1,122,24,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,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,36,0,0,0, - 124,0,106,0,100,1,107,2,114,18,116,1,100,2,131,1, - 130,1,124,0,4,0,106,0,100,3,56,0,2,0,95,0, - 100,0,83,0,41,4,78,114,22,0,0,0,114,43,0,0, - 0,114,39,0,0,0,41,2,114,27,0,0,0,114,44,0, - 0,0,114,48,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,41,0,0,0,141,0,0,0,115, - 6,0,0,0,0,1,10,1,8,1,122,24,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,0,0,0, - 0,1,0,0,0,5,0,0,0,67,0,0,0,115,18,0, - 0,0,100,1,160,0,124,0,106,1,116,2,124,0,131,1, - 161,2,83,0,41,2,78,122,28,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,114,45,0,0,0,114,48,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,49, - 0,0,0,146,0,0,0,115,2,0,0,0,0,1,122,25, + 114,11,0,0,0,114,31,0,0,0,133,0,0,0,115,8, + 0,0,0,6,1,6,1,4,128,255,128,122,25,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,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 18,0,0,0,124,0,4,0,106,0,100,1,55,0,2,0, + 95,0,100,2,83,0,41,3,78,114,39,0,0,0,84,41, + 1,114,27,0,0,0,114,48,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,40,0,0,0,137, + 0,0,0,115,6,0,0,0,14,1,4,1,255,128,122,24, 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,41,8,114,1,0,0, - 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, - 114,31,0,0,0,114,40,0,0,0,114,41,0,0,0,114, - 49,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,50,0,0,0,129,0,0, - 0,115,10,0,0,0,8,1,4,3,8,4,8,4,8,5, + 46,97,99,113,117,105,114,101,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,36,0,0,0,124,0,106,0,100,1,107,2,114,18, + 116,1,100,2,131,1,130,1,124,0,4,0,106,0,100,3, + 56,0,2,0,95,0,100,0,83,0,41,4,78,114,22,0, + 0,0,114,43,0,0,0,114,39,0,0,0,41,2,114,27, + 0,0,0,114,44,0,0,0,114,48,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,41,0,0, + 0,141,0,0,0,115,10,0,0,0,10,1,8,1,14,1, + 4,128,255,128,122,24,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,0,0,0,0,1,0,0,0,5, + 0,0,0,67,0,0,0,115,18,0,0,0,100,1,160,0, + 124,0,106,1,116,2,124,0,131,1,161,2,83,0,41,2, + 78,122,28,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,114, + 45,0,0,0,114,48,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,49,0,0,0,146,0,0, + 0,115,4,0,0,0,18,1,255,128,122,25,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,41,8,114,1,0,0,0,114,0,0, + 0,0,114,2,0,0,0,114,3,0,0,0,114,31,0,0, + 0,114,40,0,0,0,114,41,0,0,0,114,49,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,50,0,0,0,129,0,0,0,115,14,0, + 0,0,8,0,4,1,8,3,8,4,8,4,12,5,255,128, 114,50,0,0,0,99,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,36, 0,0,0,101,0,90,1,100,0,90,2,100,1,100,2,132, @@ -277,34 +280,35 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,100,0,124,0,95,1,100,0,83,0,114,13,0,0,0, 41,2,218,5,95,110,97,109,101,218,5,95,108,111,99,107, 114,29,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,31,0,0,0,152,0,0,0,115,4,0, - 0,0,0,1,6,1,122,27,95,77,111,100,117,108,101,76, - 111,99,107,77,97,110,97,103,101,114,46,95,95,105,110,105, - 116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,2,0,0,0,67,0,0,0,115,26,0,0, - 0,116,0,124,0,106,1,131,1,124,0,95,2,124,0,106, - 2,160,3,161,0,1,0,100,0,83,0,114,13,0,0,0, - 41,4,218,16,95,103,101,116,95,109,111,100,117,108,101,95, - 108,111,99,107,114,52,0,0,0,114,53,0,0,0,114,40, - 0,0,0,114,48,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,9,95,95,101,110,116,101,114, - 95,95,156,0,0,0,115,4,0,0,0,0,1,12,1,122, - 28,95,77,111,100,117,108,101,76,111,99,107,77,97,110,97, - 103,101,114,46,95,95,101,110,116,101,114,95,95,99,1,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0, - 0,0,79,0,0,0,115,14,0,0,0,124,0,106,0,160, - 1,161,0,1,0,100,0,83,0,114,13,0,0,0,41,2, - 114,53,0,0,0,114,41,0,0,0,41,3,114,30,0,0, - 0,218,4,97,114,103,115,90,6,107,119,97,114,103,115,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, - 95,95,101,120,105,116,95,95,160,0,0,0,115,2,0,0, - 0,0,1,122,27,95,77,111,100,117,108,101,76,111,99,107, - 77,97,110,97,103,101,114,46,95,95,101,120,105,116,95,95, - 78,41,6,114,1,0,0,0,114,0,0,0,0,114,2,0, - 0,0,114,31,0,0,0,114,55,0,0,0,114,57,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,51,0,0,0,150,0,0,0,115,6, - 0,0,0,8,2,8,4,8,4,114,51,0,0,0,99,1, + 11,0,0,0,114,31,0,0,0,152,0,0,0,115,8,0, + 0,0,6,1,6,1,4,128,255,128,122,27,95,77,111,100, + 117,108,101,76,111,99,107,77,97,110,97,103,101,114,46,95, + 95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,2,0,0,0,67,0,0,0, + 115,26,0,0,0,116,0,124,0,106,1,131,1,124,0,95, + 2,124,0,106,2,160,3,161,0,1,0,100,0,83,0,114, + 13,0,0,0,41,4,218,16,95,103,101,116,95,109,111,100, + 117,108,101,95,108,111,99,107,114,52,0,0,0,114,53,0, + 0,0,114,40,0,0,0,114,48,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,9,95,95,101, + 110,116,101,114,95,95,156,0,0,0,115,8,0,0,0,12, + 1,10,1,4,128,255,128,122,28,95,77,111,100,117,108,101, + 76,111,99,107,77,97,110,97,103,101,114,46,95,95,101,110, + 116,101,114,95,95,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,2,0,0,0,79,0,0,0,115,14, + 0,0,0,124,0,106,0,160,1,161,0,1,0,100,0,83, + 0,114,13,0,0,0,41,2,114,53,0,0,0,114,41,0, + 0,0,41,3,114,30,0,0,0,218,4,97,114,103,115,90, + 6,107,119,97,114,103,115,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,8,95,95,101,120,105,116,95,95, + 160,0,0,0,115,6,0,0,0,10,1,4,128,255,128,122, + 27,95,77,111,100,117,108,101,76,111,99,107,77,97,110,97, + 103,101,114,46,95,95,101,120,105,116,95,95,78,41,6,114, + 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,31, + 0,0,0,114,55,0,0,0,114,57,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,51,0,0,0,150,0,0,0,115,10,0,0,0,8, + 0,8,2,8,4,12,4,255,128,114,51,0,0,0,99,1, 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8, 0,0,0,67,0,0,0,115,136,0,0,0,116,0,160,1, 161,0,1,0,122,112,122,14,116,2,124,0,25,0,131,0, @@ -335,89 +339,90 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 111,99,107,115,114,35,0,0,0,218,12,114,101,108,101,97, 115,101,95,108,111,99,107,41,2,218,3,114,101,102,114,17, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,2,99,98,185,0,0,0,115,10,0,0,0,0, - 1,8,1,2,4,14,1,8,2,122,28,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,41,10,114,58,0,0,0,114,59, - 0,0,0,114,60,0,0,0,218,8,75,101,121,69,114,114, - 111,114,114,23,0,0,0,114,50,0,0,0,114,20,0,0, - 0,218,8,95,119,101,97,107,114,101,102,114,62,0,0,0, - 114,61,0,0,0,41,3,114,17,0,0,0,114,24,0,0, - 0,114,63,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,54,0,0,0,166,0,0,0,115,28, - 0,0,0,0,6,8,1,2,1,2,1,14,1,12,1,10, - 2,8,1,8,1,10,2,8,2,12,11,18,2,20,2,114, - 54,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,8,0,0,0,67,0,0,0,115,52,0, - 0,0,116,0,124,0,131,1,125,1,122,12,124,1,160,1, - 161,0,1,0,87,0,110,18,4,0,116,2,121,38,1,0, - 1,0,1,0,89,0,110,10,48,0,124,1,160,3,161,0, - 1,0,100,1,83,0,41,2,122,189,65,99,113,117,105,114, - 101,115,32,116,104,101,110,32,114,101,108,101,97,115,101,115, - 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,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,32,32,32,32,78,41,4,114,54,0,0,0,114, - 40,0,0,0,114,19,0,0,0,114,41,0,0,0,41,2, - 114,17,0,0,0,114,24,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,19,95,108,111,99,107, - 95,117,110,108,111,99,107,95,109,111,100,117,108,101,203,0, - 0,0,115,12,0,0,0,0,6,8,1,2,1,12,1,12, - 3,6,2,114,66,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,4,0,0,0,79,0,0, - 0,115,14,0,0,0,124,0,124,1,105,0,124,2,164,1, - 142,1,83,0,41,1,97,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,114,10,0,0,0,41,3, - 218,1,102,114,56,0,0,0,90,4,107,119,100,115,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,25,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,220,0,0,0,115,2,0,0, - 0,0,8,114,68,0,0,0,114,39,0,0,0,41,1,218, - 9,118,101,114,98,111,115,105,116,121,99,1,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,4,0,0,0,71, - 0,0,0,115,54,0,0,0,116,0,106,1,106,2,124,1, - 107,5,114,50,124,0,160,3,100,1,161,1,115,30,100,2, - 124,0,23,0,125,0,116,4,124,0,106,5,124,2,142,0, - 116,0,106,6,100,3,141,2,1,0,100,4,83,0,41,5, - 122,61,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,41, - 2,250,1,35,122,7,105,109,112,111,114,116,32,122,2,35, - 32,41,1,90,4,102,105,108,101,78,41,7,114,15,0,0, - 0,218,5,102,108,97,103,115,218,7,118,101,114,98,111,115, - 101,218,10,115,116,97,114,116,115,119,105,116,104,218,5,112, - 114,105,110,116,114,46,0,0,0,218,6,115,116,100,101,114, - 114,41,3,218,7,109,101,115,115,97,103,101,114,69,0,0, - 0,114,56,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,16,95,118,101,114,98,111,115,101,95, - 109,101,115,115,97,103,101,231,0,0,0,115,8,0,0,0, - 0,2,12,1,10,1,8,1,114,77,0,0,0,99,1,0, + 0,0,218,2,99,98,185,0,0,0,115,14,0,0,0,8, + 1,2,1,14,4,8,1,20,2,4,128,255,128,122,28,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,41,10,114,58,0, + 0,0,114,59,0,0,0,114,60,0,0,0,218,8,75,101, + 121,69,114,114,111,114,114,23,0,0,0,114,50,0,0,0, + 114,20,0,0,0,218,8,95,119,101,97,107,114,101,102,114, + 62,0,0,0,114,61,0,0,0,41,3,114,17,0,0,0, + 114,24,0,0,0,114,63,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,54,0,0,0,166,0, + 0,0,115,30,0,0,0,8,6,2,1,2,1,14,1,12, + 1,10,1,8,2,8,1,10,1,8,2,12,2,18,11,20, + 2,4,2,255,128,114,54,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,67, + 0,0,0,115,52,0,0,0,116,0,124,0,131,1,125,1, + 122,12,124,1,160,1,161,0,1,0,87,0,110,18,4,0, + 116,2,121,38,1,0,1,0,1,0,89,0,110,10,48,0, + 124,1,160,3,161,0,1,0,100,1,83,0,41,2,122,189, + 65,99,113,117,105,114,101,115,32,116,104,101,110,32,114,101, + 108,101,97,115,101,115,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,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,32,32,32,32,78,41,4, + 114,54,0,0,0,114,40,0,0,0,114,19,0,0,0,114, + 41,0,0,0,41,2,114,17,0,0,0,114,24,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 19,95,108,111,99,107,95,117,110,108,111,99,107,95,109,111, + 100,117,108,101,203,0,0,0,115,16,0,0,0,8,6,2, + 1,12,1,12,1,6,3,8,2,4,128,255,128,114,66,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,4,0,0,0,79,0,0,0,115,14,0,0,0, + 124,0,124,1,105,0,124,2,164,1,142,1,83,0,41,1, + 97,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,114,10,0,0,0,41,3,218,1,102,114,56,0, + 0,0,90,4,107,119,100,115,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,25,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,220,0,0,0,115,4,0,0,0,14,8,255,128,114, + 68,0,0,0,114,39,0,0,0,41,1,218,9,118,101,114, + 98,111,115,105,116,121,99,1,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,4,0,0,0,71,0,0,0,115, + 54,0,0,0,116,0,106,1,106,2,124,1,107,5,114,50, + 124,0,160,3,100,1,161,1,115,30,100,2,124,0,23,0, + 125,0,116,4,124,0,106,5,124,2,142,0,116,0,106,6, + 100,3,141,2,1,0,100,4,83,0,41,5,122,61,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,41,2,250,1,35, + 122,7,105,109,112,111,114,116,32,122,2,35,32,41,1,90, + 4,102,105,108,101,78,41,7,114,15,0,0,0,218,5,102, + 108,97,103,115,218,7,118,101,114,98,111,115,101,218,10,115, + 116,97,114,116,115,119,105,116,104,218,5,112,114,105,110,116, + 114,46,0,0,0,218,6,115,116,100,101,114,114,41,3,218, + 7,109,101,115,115,97,103,101,114,69,0,0,0,114,56,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,16,95,118,101,114,98,111,115,101,95,109,101,115,115, + 97,103,101,231,0,0,0,115,12,0,0,0,12,2,10,1, + 8,1,20,1,4,128,255,128,114,77,0,0,0,99,1,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, 0,0,3,0,0,0,115,26,0,0,0,135,0,102,1,100, 1,100,2,132,8,125,1,116,0,124,1,136,0,131,2,1, @@ -438,220 +443,221 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 108,110,97,109,101,169,1,218,3,102,120,110,114,10,0,0, 0,114,11,0,0,0,218,25,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,241,0,0,0,115,10,0,0,0,0,1,10,1,10,1, - 2,255,6,2,122,52,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,169,1,114,12,0,0, - 0,41,2,114,84,0,0,0,114,85,0,0,0,114,10,0, - 0,0,114,83,0,0,0,114,11,0,0,0,218,17,95,114, - 101,113,117,105,114,101,115,95,98,117,105,108,116,105,110,239, - 0,0,0,115,6,0,0,0,0,2,12,5,10,1,114,87, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,3,0,0,0,115,26,0,0, - 0,135,0,102,1,100,1,100,2,132,8,125,1,116,0,124, - 1,136,0,131,2,1,0,124,1,83,0,41,3,122,47,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,0,0,0,0,2,0,0,0,4, - 0,0,0,19,0,0,0,115,38,0,0,0,116,0,160,1, - 124,1,161,1,115,28,116,2,100,1,160,3,124,1,161,1, - 124,1,100,2,141,2,130,1,136,0,124,0,124,1,131,2, - 83,0,169,3,78,122,27,123,33,114,125,32,105,115,32,110, - 111,116,32,97,32,102,114,111,122,101,110,32,109,111,100,117, - 108,101,114,16,0,0,0,41,4,114,58,0,0,0,218,9, - 105,115,95,102,114,111,122,101,110,114,80,0,0,0,114,46, - 0,0,0,114,81,0,0,0,114,83,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,24,95,114,101,113,117,105,114, - 101,115,95,102,114,111,122,101,110,95,119,114,97,112,112,101, - 114,252,0,0,0,115,10,0,0,0,0,1,10,1,10,1, - 2,255,6,2,122,50,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, + 114,241,0,0,0,115,12,0,0,0,10,1,10,1,2,1, + 6,255,10,2,255,128,122,52,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,169,1,114,12, + 0,0,0,41,2,114,84,0,0,0,114,85,0,0,0,114, + 10,0,0,0,114,83,0,0,0,114,11,0,0,0,218,17, + 95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,105, + 110,239,0,0,0,115,8,0,0,0,12,2,10,5,4,1, + 255,128,114,87,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0, + 115,26,0,0,0,135,0,102,1,100,1,100,2,132,8,125, + 1,116,0,124,1,136,0,131,2,1,0,124,1,83,0,41, + 3,122,47,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,0,0,0,0,2, + 0,0,0,4,0,0,0,19,0,0,0,115,38,0,0,0, + 116,0,160,1,124,1,161,1,115,28,116,2,100,1,160,3, + 124,1,161,1,124,1,100,2,141,2,130,1,136,0,124,0, + 124,1,131,2,83,0,169,3,78,122,27,123,33,114,125,32, + 105,115,32,110,111,116,32,97,32,102,114,111,122,101,110,32, + 109,111,100,117,108,101,114,16,0,0,0,41,4,114,58,0, + 0,0,218,9,105,115,95,102,114,111,122,101,110,114,80,0, + 0,0,114,46,0,0,0,114,81,0,0,0,114,83,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,24,95,114,101, + 113,117,105,114,101,115,95,102,114,111,122,101,110,95,119,114, + 97,112,112,101,114,252,0,0,0,115,12,0,0,0,10,1, + 10,1,2,1,6,255,10,2,255,128,122,50,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,114,86, + 0,0,0,41,2,114,84,0,0,0,114,90,0,0,0,114, + 10,0,0,0,114,83,0,0,0,114,11,0,0,0,218,16, 95,114,101,113,117,105,114,101,115,95,102,114,111,122,101,110, - 95,119,114,97,112,112,101,114,114,86,0,0,0,41,2,114, - 84,0,0,0,114,90,0,0,0,114,10,0,0,0,114,83, - 0,0,0,114,11,0,0,0,218,16,95,114,101,113,117,105, - 114,101,115,95,102,114,111,122,101,110,250,0,0,0,115,6, - 0,0,0,0,2,12,5,10,1,114,91,0,0,0,99,2, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3, - 0,0,0,67,0,0,0,115,58,0,0,0,116,0,124,1, - 124,0,131,2,125,2,124,1,116,1,106,2,118,0,114,50, - 116,1,106,2,124,1,25,0,125,3,116,3,124,2,124,3, - 131,2,1,0,116,1,106,2,124,1,25,0,83,0,116,4, - 124,2,131,1,83,0,41,2,122,128,76,111,97,100,32,116, - 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, - 117,108,101,32,105,110,116,111,32,115,121,115,46,109,111,100, - 117,108,101,115,32,97,110,100,32,114,101,116,117,114,110,32, - 105,116,46,10,10,32,32,32,32,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,85,115,101,32,108,111,97,100,101,114,46, - 101,120,101,99,95,109,111,100,117,108,101,32,105,110,115,116, - 101,97,100,46,10,10,32,32,32,32,78,41,5,218,16,115, - 112,101,99,95,102,114,111,109,95,108,111,97,100,101,114,114, - 15,0,0,0,218,7,109,111,100,117,108,101,115,218,5,95, - 101,120,101,99,218,5,95,108,111,97,100,41,4,114,30,0, - 0,0,114,82,0,0,0,218,4,115,112,101,99,218,6,109, - 111,100,117,108,101,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,17,95,108,111,97,100,95,109,111,100,117, - 108,101,95,115,104,105,109,6,1,0,0,115,12,0,0,0, - 0,6,10,1,10,1,10,1,10,1,10,2,114,98,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,8,0,0,0,67,0,0,0,115,210,0,0,0,116, - 0,124,0,100,1,100,0,131,3,125,1,116,1,124,1,100, - 2,131,2,114,54,122,12,124,1,160,2,124,0,161,1,87, - 0,83,0,4,0,116,3,121,52,1,0,1,0,1,0,89, - 0,110,2,48,0,122,10,124,0,106,4,125,2,87,0,110, - 18,4,0,116,5,121,82,1,0,1,0,1,0,89,0,110, - 18,48,0,124,2,100,0,117,1,114,100,116,6,124,2,131, - 1,83,0,122,10,124,0,106,7,125,3,87,0,110,22,4, - 0,116,5,121,132,1,0,1,0,1,0,100,3,125,3,89, - 0,110,2,48,0,122,10,124,0,106,8,125,4,87,0,110, - 52,4,0,116,5,121,196,1,0,1,0,1,0,124,1,100, - 0,117,0,114,180,100,4,160,9,124,3,161,1,6,0,89, - 0,83,0,100,5,160,9,124,3,124,1,161,2,6,0,89, - 0,83,0,48,0,100,6,160,9,124,3,124,4,161,2,83, - 0,41,7,78,218,10,95,95,108,111,97,100,101,114,95,95, - 218,11,109,111,100,117,108,101,95,114,101,112,114,250,1,63, - 250,13,60,109,111,100,117,108,101,32,123,33,114,125,62,250, - 20,60,109,111,100,117,108,101,32,123,33,114,125,32,40,123, - 33,114,125,41,62,250,23,60,109,111,100,117,108,101,32,123, - 33,114,125,32,102,114,111,109,32,123,33,114,125,62,41,10, - 114,6,0,0,0,114,4,0,0,0,114,100,0,0,0,218, - 9,69,120,99,101,112,116,105,111,110,218,8,95,95,115,112, - 101,99,95,95,218,14,65,116,116,114,105,98,117,116,101,69, - 114,114,111,114,218,22,95,109,111,100,117,108,101,95,114,101, - 112,114,95,102,114,111,109,95,115,112,101,99,114,1,0,0, - 0,218,8,95,95,102,105,108,101,95,95,114,46,0,0,0, - 41,5,114,97,0,0,0,218,6,108,111,97,100,101,114,114, - 96,0,0,0,114,17,0,0,0,218,8,102,105,108,101,110, - 97,109,101,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,12,95,109,111,100,117,108,101,95,114,101,112,114, - 22,1,0,0,115,46,0,0,0,0,2,12,1,10,4,2, - 1,12,1,12,1,6,1,2,1,10,1,12,1,6,2,8, - 1,8,4,2,1,10,1,12,1,10,1,2,1,10,1,12, - 1,8,1,14,2,18,2,114,112,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,64,0,0,0,115,114,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,100,2,100,2,100,3,156,3, - 100,4,100,5,132,2,90,4,100,6,100,7,132,0,90,5, - 100,8,100,9,132,0,90,6,101,7,100,10,100,11,132,0, - 131,1,90,8,101,8,106,9,100,12,100,11,132,0,131,1, - 90,8,101,7,100,13,100,14,132,0,131,1,90,10,101,7, - 100,15,100,16,132,0,131,1,90,11,101,11,106,9,100,17, - 100,16,132,0,131,1,90,11,100,2,83,0,41,18,218,10, - 77,111,100,117,108,101,83,112,101,99,97,208,5,0,0,84, - 104,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110, - 32,102,111,114,32,97,32,109,111,100,117,108,101,44,32,117, - 115,101,100,32,102,111,114,32,108,111,97,100,105,110,103,46, - 10,10,32,32,32,32,65,32,109,111,100,117,108,101,39,115, - 32,115,112,101,99,32,105,115,32,116,104,101,32,115,111,117, - 114,99,101,32,102,111,114,32,105,110,102,111,114,109,97,116, - 105,111,110,32,97,98,111,117,116,32,116,104,101,32,109,111, - 100,117,108,101,46,32,32,70,111,114,10,32,32,32,32,100, - 97,116,97,32,97,115,115,111,99,105,97,116,101,100,32,119, - 105,116,104,32,116,104,101,32,109,111,100,117,108,101,44,32, - 105,110,99,108,117,100,105,110,103,32,115,111,117,114,99,101, - 44,32,117,115,101,32,116,104,101,32,115,112,101,99,39,115, - 10,32,32,32,32,108,111,97,100,101,114,46,10,10,32,32, - 32,32,96,110,97,109,101,96,32,105,115,32,116,104,101,32, - 97,98,115,111,108,117,116,101,32,110,97,109,101,32,111,102, - 32,116,104,101,32,109,111,100,117,108,101,46,32,32,96,108, - 111,97,100,101,114,96,32,105,115,32,116,104,101,32,108,111, - 97,100,101,114,10,32,32,32,32,116,111,32,117,115,101,32, - 119,104,101,110,32,108,111,97,100,105,110,103,32,116,104,101, - 32,109,111,100,117,108,101,46,32,32,96,112,97,114,101,110, - 116,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111, - 102,32,116,104,101,10,32,32,32,32,112,97,99,107,97,103, - 101,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32, - 105,110,46,32,32,84,104,101,32,112,97,114,101,110,116,32, - 105,115,32,100,101,114,105,118,101,100,32,102,114,111,109,32, - 116,104,101,32,110,97,109,101,46,10,10,32,32,32,32,96, - 105,115,95,112,97,99,107,97,103,101,96,32,100,101,116,101, - 114,109,105,110,101,115,32,105,102,32,116,104,101,32,109,111, - 100,117,108,101,32,105,115,32,99,111,110,115,105,100,101,114, - 101,100,32,97,32,112,97,99,107,97,103,101,32,111,114,10, - 32,32,32,32,110,111,116,46,32,32,79,110,32,109,111,100, - 117,108,101,115,32,116,104,105,115,32,105,115,32,114,101,102, - 108,101,99,116,101,100,32,98,121,32,116,104,101,32,96,95, - 95,112,97,116,104,95,95,96,32,97,116,116,114,105,98,117, - 116,101,46,10,10,32,32,32,32,96,111,114,105,103,105,110, - 96,32,105,115,32,116,104,101,32,115,112,101,99,105,102,105, - 99,32,108,111,99,97,116,105,111,110,32,117,115,101,100,32, - 98,121,32,116,104,101,32,108,111,97,100,101,114,32,102,114, - 111,109,32,119,104,105,99,104,32,116,111,10,32,32,32,32, - 108,111,97,100,32,116,104,101,32,109,111,100,117,108,101,44, - 32,105,102,32,116,104,97,116,32,105,110,102,111,114,109,97, - 116,105,111,110,32,105,115,32,97,118,97,105,108,97,98,108, - 101,46,32,32,87,104,101,110,32,102,105,108,101,110,97,109, - 101,32,105,115,10,32,32,32,32,115,101,116,44,32,111,114, - 105,103,105,110,32,119,105,108,108,32,109,97,116,99,104,46, - 10,10,32,32,32,32,96,104,97,115,95,108,111,99,97,116, - 105,111,110,96,32,105,110,100,105,99,97,116,101,115,32,116, - 104,97,116,32,97,32,115,112,101,99,39,115,32,34,111,114, - 105,103,105,110,34,32,114,101,102,108,101,99,116,115,32,97, - 32,108,111,99,97,116,105,111,110,46,10,32,32,32,32,87, - 104,101,110,32,116,104,105,115,32,105,115,32,84,114,117,101, - 44,32,96,95,95,102,105,108,101,95,95,96,32,97,116,116, - 114,105,98,117,116,101,32,111,102,32,116,104,101,32,109,111, - 100,117,108,101,32,105,115,32,115,101,116,46,10,10,32,32, - 32,32,96,99,97,99,104,101,100,96,32,105,115,32,116,104, - 101,32,108,111,99,97,116,105,111,110,32,111,102,32,116,104, - 101,32,99,97,99,104,101,100,32,98,121,116,101,99,111,100, - 101,32,102,105,108,101,44,32,105,102,32,97,110,121,46,32, - 32,73,116,10,32,32,32,32,99,111,114,114,101,115,112,111, - 110,100,115,32,116,111,32,116,104,101,32,96,95,95,99,97, - 99,104,101,100,95,95,96,32,97,116,116,114,105,98,117,116, - 101,46,10,10,32,32,32,32,96,115,117,98,109,111,100,117, - 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, - 111,110,115,96,32,105,115,32,116,104,101,32,115,101,113,117, - 101,110,99,101,32,111,102,32,112,97,116,104,32,101,110,116, - 114,105,101,115,32,116,111,10,32,32,32,32,115,101,97,114, - 99,104,32,119,104,101,110,32,105,109,112,111,114,116,105,110, - 103,32,115,117,98,109,111,100,117,108,101,115,46,32,32,73, - 102,32,115,101,116,44,32,105,115,95,112,97,99,107,97,103, - 101,32,115,104,111,117,108,100,32,98,101,10,32,32,32,32, - 84,114,117,101,45,45,97,110,100,32,70,97,108,115,101,32, - 111,116,104,101,114,119,105,115,101,46,10,10,32,32,32,32, - 80,97,99,107,97,103,101,115,32,97,114,101,32,115,105,109, - 112,108,121,32,109,111,100,117,108,101,115,32,116,104,97,116, - 32,40,109,97,121,41,32,104,97,118,101,32,115,117,98,109, - 111,100,117,108,101,115,46,32,32,73,102,32,97,32,115,112, - 101,99,10,32,32,32,32,104,97,115,32,97,32,110,111,110, - 45,78,111,110,101,32,118,97,108,117,101,32,105,110,32,96, + 250,0,0,0,115,8,0,0,0,12,2,10,5,4,1,255, + 128,114,91,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,3,0,0,0,67,0,0,0,115, + 58,0,0,0,116,0,124,1,124,0,131,2,125,2,124,1, + 116,1,106,2,118,0,114,50,116,1,106,2,124,1,25,0, + 125,3,116,3,124,2,124,3,131,2,1,0,116,1,106,2, + 124,1,25,0,83,0,116,4,124,2,131,1,83,0,41,2, + 122,128,76,111,97,100,32,116,104,101,32,115,112,101,99,105, + 102,105,101,100,32,109,111,100,117,108,101,32,105,110,116,111, + 32,115,121,115,46,109,111,100,117,108,101,115,32,97,110,100, + 32,114,101,116,117,114,110,32,105,116,46,10,10,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,108,111,97,100,101,114,46,101,120,101,99,95,109,111,100, + 117,108,101,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,78,41,5,218,16,115,112,101,99,95,102,114,111,109, + 95,108,111,97,100,101,114,114,15,0,0,0,218,7,109,111, + 100,117,108,101,115,218,5,95,101,120,101,99,218,5,95,108, + 111,97,100,41,4,114,30,0,0,0,114,82,0,0,0,218, + 4,115,112,101,99,218,6,109,111,100,117,108,101,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,17,95,108, + 111,97,100,95,109,111,100,117,108,101,95,115,104,105,109,6, + 1,0,0,115,14,0,0,0,10,6,10,1,10,1,10,1, + 10,1,8,2,255,128,114,98,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,8,0,0,0, + 67,0,0,0,115,210,0,0,0,116,0,124,0,100,1,100, + 0,131,3,125,1,116,1,124,1,100,2,131,2,114,54,122, + 12,124,1,160,2,124,0,161,1,87,0,83,0,4,0,116, + 3,121,52,1,0,1,0,1,0,89,0,110,2,48,0,122, + 10,124,0,106,4,125,2,87,0,110,18,4,0,116,5,121, + 82,1,0,1,0,1,0,89,0,110,18,48,0,124,2,100, + 0,117,1,114,100,116,6,124,2,131,1,83,0,122,10,124, + 0,106,7,125,3,87,0,110,22,4,0,116,5,121,132,1, + 0,1,0,1,0,100,3,125,3,89,0,110,2,48,0,122, + 10,124,0,106,8,125,4,87,0,110,52,4,0,116,5,121, + 196,1,0,1,0,1,0,124,1,100,0,117,0,114,180,100, + 4,160,9,124,3,161,1,6,0,89,0,83,0,100,5,160, + 9,124,3,124,1,161,2,6,0,89,0,83,0,48,0,100, + 6,160,9,124,3,124,4,161,2,83,0,41,7,78,218,10, + 95,95,108,111,97,100,101,114,95,95,218,11,109,111,100,117, + 108,101,95,114,101,112,114,250,1,63,250,13,60,109,111,100, + 117,108,101,32,123,33,114,125,62,250,20,60,109,111,100,117, + 108,101,32,123,33,114,125,32,40,123,33,114,125,41,62,250, + 23,60,109,111,100,117,108,101,32,123,33,114,125,32,102,114, + 111,109,32,123,33,114,125,62,41,10,114,6,0,0,0,114, + 4,0,0,0,114,100,0,0,0,218,9,69,120,99,101,112, + 116,105,111,110,218,8,95,95,115,112,101,99,95,95,218,14, + 65,116,116,114,105,98,117,116,101,69,114,114,111,114,218,22, + 95,109,111,100,117,108,101,95,114,101,112,114,95,102,114,111, + 109,95,115,112,101,99,114,1,0,0,0,218,8,95,95,102, + 105,108,101,95,95,114,46,0,0,0,41,5,114,97,0,0, + 0,218,6,108,111,97,100,101,114,114,96,0,0,0,114,17, + 0,0,0,218,8,102,105,108,101,110,97,109,101,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,12,95,109, + 111,100,117,108,101,95,114,101,112,114,22,1,0,0,115,48, + 0,0,0,12,2,10,1,2,4,12,1,12,1,6,1,2, + 1,10,1,12,1,6,1,8,2,8,1,2,4,10,1,12, + 1,10,1,2,1,10,1,12,1,8,1,14,1,18,2,12, + 2,255,128,114,112,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, + 0,115,114,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,2,100,2,100,3,156,3,100,4,100,5, + 132,2,90,4,100,6,100,7,132,0,90,5,100,8,100,9, + 132,0,90,6,101,7,100,10,100,11,132,0,131,1,90,8, + 101,8,106,9,100,12,100,11,132,0,131,1,90,8,101,7, + 100,13,100,14,132,0,131,1,90,10,101,7,100,15,100,16, + 132,0,131,1,90,11,101,11,106,9,100,17,100,16,132,0, + 131,1,90,11,100,2,83,0,41,18,218,10,77,111,100,117, + 108,101,83,112,101,99,97,208,5,0,0,84,104,101,32,115, + 112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114, + 32,97,32,109,111,100,117,108,101,44,32,117,115,101,100,32, + 102,111,114,32,108,111,97,100,105,110,103,46,10,10,32,32, + 32,32,65,32,109,111,100,117,108,101,39,115,32,115,112,101, + 99,32,105,115,32,116,104,101,32,115,111,117,114,99,101,32, + 102,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32, + 97,98,111,117,116,32,116,104,101,32,109,111,100,117,108,101, + 46,32,32,70,111,114,10,32,32,32,32,100,97,116,97,32, + 97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32, + 116,104,101,32,109,111,100,117,108,101,44,32,105,110,99,108, + 117,100,105,110,103,32,115,111,117,114,99,101,44,32,117,115, + 101,32,116,104,101,32,115,112,101,99,39,115,10,32,32,32, + 32,108,111,97,100,101,114,46,10,10,32,32,32,32,96,110, + 97,109,101,96,32,105,115,32,116,104,101,32,97,98,115,111, + 108,117,116,101,32,110,97,109,101,32,111,102,32,116,104,101, + 32,109,111,100,117,108,101,46,32,32,96,108,111,97,100,101, + 114,96,32,105,115,32,116,104,101,32,108,111,97,100,101,114, + 10,32,32,32,32,116,111,32,117,115,101,32,119,104,101,110, + 32,108,111,97,100,105,110,103,32,116,104,101,32,109,111,100, + 117,108,101,46,32,32,96,112,97,114,101,110,116,96,32,105, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,10,32,32,32,32,112,97,99,107,97,103,101,32,116,104, + 101,32,109,111,100,117,108,101,32,105,115,32,105,110,46,32, + 32,84,104,101,32,112,97,114,101,110,116,32,105,115,32,100, + 101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32, + 110,97,109,101,46,10,10,32,32,32,32,96,105,115,95,112, + 97,99,107,97,103,101,96,32,100,101,116,101,114,109,105,110, + 101,115,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, + 32,112,97,99,107,97,103,101,32,111,114,10,32,32,32,32, + 110,111,116,46,32,32,79,110,32,109,111,100,117,108,101,115, + 32,116,104,105,115,32,105,115,32,114,101,102,108,101,99,116, + 101,100,32,98,121,32,116,104,101,32,96,95,95,112,97,116, + 104,95,95,96,32,97,116,116,114,105,98,117,116,101,46,10, + 10,32,32,32,32,96,111,114,105,103,105,110,96,32,105,115, + 32,116,104,101,32,115,112,101,99,105,102,105,99,32,108,111, + 99,97,116,105,111,110,32,117,115,101,100,32,98,121,32,116, + 104,101,32,108,111,97,100,101,114,32,102,114,111,109,32,119, + 104,105,99,104,32,116,111,10,32,32,32,32,108,111,97,100, + 32,116,104,101,32,109,111,100,117,108,101,44,32,105,102,32, + 116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110, + 32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,32, + 87,104,101,110,32,102,105,108,101,110,97,109,101,32,105,115, + 10,32,32,32,32,115,101,116,44,32,111,114,105,103,105,110, + 32,119,105,108,108,32,109,97,116,99,104,46,10,10,32,32, + 32,32,96,104,97,115,95,108,111,99,97,116,105,111,110,96, + 32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32, + 97,32,115,112,101,99,39,115,32,34,111,114,105,103,105,110, + 34,32,114,101,102,108,101,99,116,115,32,97,32,108,111,99, + 97,116,105,111,110,46,10,32,32,32,32,87,104,101,110,32, + 116,104,105,115,32,105,115,32,84,114,117,101,44,32,96,95, + 95,102,105,108,101,95,95,96,32,97,116,116,114,105,98,117, + 116,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,115,101,116,46,10,10,32,32,32,32,96,99, + 97,99,104,101,100,96,32,105,115,32,116,104,101,32,108,111, + 99,97,116,105,111,110,32,111,102,32,116,104,101,32,99,97, + 99,104,101,100,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,44,32,105,102,32,97,110,121,46,32,32,73,116,10, + 32,32,32,32,99,111,114,114,101,115,112,111,110,100,115,32, + 116,111,32,116,104,101,32,96,95,95,99,97,99,104,101,100, + 95,95,96,32,97,116,116,114,105,98,117,116,101,46,10,10, + 32,32,32,32,96,115,117,98,109,111,100,117,108,101,95,115, + 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,96, + 32,105,115,32,116,104,101,32,115,101,113,117,101,110,99,101, + 32,111,102,32,112,97,116,104,32,101,110,116,114,105,101,115, + 32,116,111,10,32,32,32,32,115,101,97,114,99,104,32,119, + 104,101,110,32,105,109,112,111,114,116,105,110,103,32,115,117, + 98,109,111,100,117,108,101,115,46,32,32,73,102,32,115,101, + 116,44,32,105,115,95,112,97,99,107,97,103,101,32,115,104, + 111,117,108,100,32,98,101,10,32,32,32,32,84,114,117,101, + 45,45,97,110,100,32,70,97,108,115,101,32,111,116,104,101, + 114,119,105,115,101,46,10,10,32,32,32,32,80,97,99,107, + 97,103,101,115,32,97,114,101,32,115,105,109,112,108,121,32, + 109,111,100,117,108,101,115,32,116,104,97,116,32,40,109,97, + 121,41,32,104,97,118,101,32,115,117,98,109,111,100,117,108, + 101,115,46,32,32,73,102,32,97,32,115,112,101,99,10,32, + 32,32,32,104,97,115,32,97,32,110,111,110,45,78,111,110, + 101,32,118,97,108,117,101,32,105,110,32,96,115,117,98,109, + 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, + 97,116,105,111,110,115,96,44,32,116,104,101,32,105,109,112, + 111,114,116,10,32,32,32,32,115,121,115,116,101,109,32,119, + 105,108,108,32,99,111,110,115,105,100,101,114,32,109,111,100, + 117,108,101,115,32,108,111,97,100,101,100,32,102,114,111,109, + 32,116,104,101,32,115,112,101,99,32,97,115,32,112,97,99, + 107,97,103,101,115,46,10,10,32,32,32,32,79,110,108,121, + 32,102,105,110,100,101,114,115,32,40,115,101,101,32,105,109, + 112,111,114,116,108,105,98,46,97,98,99,46,77,101,116,97, + 80,97,116,104,70,105,110,100,101,114,32,97,110,100,10,32, + 32,32,32,105,109,112,111,114,116,108,105,98,46,97,98,99, + 46,80,97,116,104,69,110,116,114,121,70,105,110,100,101,114, + 41,32,115,104,111,117,108,100,32,109,111,100,105,102,121,32, + 77,111,100,117,108,101,83,112,101,99,32,105,110,115,116,97, + 110,99,101,115,46,10,10,32,32,32,32,78,41,3,218,6, + 111,114,105,103,105,110,218,12,108,111,97,100,101,114,95,115, + 116,97,116,101,218,10,105,115,95,112,97,99,107,97,103,101, + 99,3,0,0,0,0,0,0,0,3,0,0,0,6,0,0, + 0,2,0,0,0,67,0,0,0,115,54,0,0,0,124,1, + 124,0,95,0,124,2,124,0,95,1,124,3,124,0,95,2, + 124,4,124,0,95,3,124,5,114,32,103,0,110,2,100,0, + 124,0,95,4,100,1,124,0,95,5,100,0,124,0,95,6, + 100,0,83,0,41,2,78,70,41,7,114,17,0,0,0,114, + 110,0,0,0,114,114,0,0,0,114,115,0,0,0,218,26, 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, - 95,108,111,99,97,116,105,111,110,115,96,44,32,116,104,101, - 32,105,109,112,111,114,116,10,32,32,32,32,115,121,115,116, - 101,109,32,119,105,108,108,32,99,111,110,115,105,100,101,114, - 32,109,111,100,117,108,101,115,32,108,111,97,100,101,100,32, - 102,114,111,109,32,116,104,101,32,115,112,101,99,32,97,115, - 32,112,97,99,107,97,103,101,115,46,10,10,32,32,32,32, - 79,110,108,121,32,102,105,110,100,101,114,115,32,40,115,101, - 101,32,105,109,112,111,114,116,108,105,98,46,97,98,99,46, - 77,101,116,97,80,97,116,104,70,105,110,100,101,114,32,97, - 110,100,10,32,32,32,32,105,109,112,111,114,116,108,105,98, - 46,97,98,99,46,80,97,116,104,69,110,116,114,121,70,105, - 110,100,101,114,41,32,115,104,111,117,108,100,32,109,111,100, - 105,102,121,32,77,111,100,117,108,101,83,112,101,99,32,105, - 110,115,116,97,110,99,101,115,46,10,10,32,32,32,32,78, - 41,3,218,6,111,114,105,103,105,110,218,12,108,111,97,100, - 101,114,95,115,116,97,116,101,218,10,105,115,95,112,97,99, - 107,97,103,101,99,3,0,0,0,0,0,0,0,3,0,0, - 0,6,0,0,0,2,0,0,0,67,0,0,0,115,54,0, - 0,0,124,1,124,0,95,0,124,2,124,0,95,1,124,3, - 124,0,95,2,124,4,124,0,95,3,124,5,114,32,103,0, - 110,2,100,0,124,0,95,4,100,1,124,0,95,5,100,0, - 124,0,95,6,100,0,83,0,41,2,78,70,41,7,114,17, - 0,0,0,114,110,0,0,0,114,114,0,0,0,114,115,0, - 0,0,218,26,115,117,98,109,111,100,117,108,101,95,115,101, - 97,114,99,104,95,108,111,99,97,116,105,111,110,115,218,13, - 95,115,101,116,95,102,105,108,101,97,116,116,114,218,7,95, - 99,97,99,104,101,100,41,6,114,30,0,0,0,114,17,0, - 0,0,114,110,0,0,0,114,114,0,0,0,114,115,0,0, - 0,114,116,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,31,0,0,0,95,1,0,0,115,14, - 0,0,0,0,2,6,1,6,1,6,1,6,1,14,3,6, - 1,122,19,77,111,100,117,108,101,83,112,101,99,46,95,95, + 95,108,111,99,97,116,105,111,110,115,218,13,95,115,101,116, + 95,102,105,108,101,97,116,116,114,218,7,95,99,97,99,104, + 101,100,41,6,114,30,0,0,0,114,17,0,0,0,114,110, + 0,0,0,114,114,0,0,0,114,115,0,0,0,114,116,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,31,0,0,0,95,1,0,0,115,18,0,0,0,6, + 2,6,1,6,1,6,1,14,1,6,3,6,1,4,128,255, + 128,122,19,77,111,100,117,108,101,83,112,101,99,46,95,95, 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, 0,0,0,2,0,0,0,6,0,0,0,67,0,0,0,115, 102,0,0,0,100,1,160,0,124,0,106,1,161,1,100,2, @@ -671,244 +677,246 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 218,9,95,95,99,108,97,115,115,95,95,114,1,0,0,0, 218,4,106,111,105,110,41,2,114,30,0,0,0,114,56,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,49,0,0,0,107,1,0,0,115,20,0,0,0,0, - 1,10,1,10,255,4,2,10,1,18,1,10,1,8,1,4, - 255,6,2,122,19,77,111,100,117,108,101,83,112,101,99,46, - 95,95,114,101,112,114,95,95,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, - 0,115,102,0,0,0,124,0,106,0,125,2,122,72,124,0, - 106,1,124,1,106,1,107,2,111,76,124,0,106,2,124,1, - 106,2,107,2,111,76,124,0,106,3,124,1,106,3,107,2, - 111,76,124,2,124,1,106,0,107,2,111,76,124,0,106,4, - 124,1,106,4,107,2,111,76,124,0,106,5,124,1,106,5, - 107,2,87,0,83,0,4,0,116,6,121,100,1,0,1,0, - 1,0,116,7,6,0,89,0,83,0,48,0,114,13,0,0, - 0,41,8,114,117,0,0,0,114,17,0,0,0,114,110,0, - 0,0,114,114,0,0,0,218,6,99,97,99,104,101,100,218, - 12,104,97,115,95,108,111,99,97,116,105,111,110,114,107,0, - 0,0,218,14,78,111,116,73,109,112,108,101,109,101,110,116, - 101,100,41,3,114,30,0,0,0,90,5,111,116,104,101,114, - 90,4,115,109,115,108,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,6,95,95,101,113,95,95,117,1,0, - 0,115,30,0,0,0,0,1,6,1,2,1,12,1,10,255, - 2,2,10,254,2,3,8,253,2,4,10,252,2,5,10,251, - 4,6,12,1,122,17,77,111,100,117,108,101,83,112,101,99, - 46,95,95,101,113,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,58,0,0,0,124,0,106,0,100,0,117,0,114,52,124, - 0,106,1,100,0,117,1,114,52,124,0,106,2,114,52,116, - 3,100,0,117,0,114,38,116,4,130,1,116,3,160,5,124, - 0,106,1,161,1,124,0,95,0,124,0,106,0,83,0,114, - 13,0,0,0,41,6,114,119,0,0,0,114,114,0,0,0, - 114,118,0,0,0,218,19,95,98,111,111,116,115,116,114,97, - 112,95,101,120,116,101,114,110,97,108,218,19,78,111,116,73, - 109,112,108,101,109,101,110,116,101,100,69,114,114,111,114,90, - 11,95,103,101,116,95,99,97,99,104,101,100,114,48,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,123,0,0,0,129,1,0,0,115,12,0,0,0,0,2, - 10,1,16,1,8,1,4,1,14,1,122,17,77,111,100,117, - 108,101,83,112,101,99,46,99,97,99,104,101,100,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0, - 0,0,67,0,0,0,115,10,0,0,0,124,1,124,0,95, - 0,100,0,83,0,114,13,0,0,0,41,1,114,119,0,0, - 0,41,2,114,30,0,0,0,114,123,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,123,0,0, - 0,138,1,0,0,115,2,0,0,0,0,2,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,115,32,0,0,0,124,0,106,0,100,1, - 117,0,114,26,124,0,106,1,160,2,100,2,161,1,100,3, - 25,0,83,0,124,0,106,1,83,0,41,4,122,32,84,104, - 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, - 100,117,108,101,39,115,32,112,97,114,101,110,116,46,78,218, - 1,46,114,22,0,0,0,41,3,114,117,0,0,0,114,17, - 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, - 48,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,6,112,97,114,101,110,116,142,1,0,0,115, - 6,0,0,0,0,3,10,1,16,2,122,17,77,111,100,117, - 108,101,83,112,101,99,46,112,97,114,101,110,116,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, - 0,114,13,0,0,0,41,1,114,118,0,0,0,114,48,0, + 0,114,49,0,0,0,107,1,0,0,115,22,0,0,0,10, + 1,10,1,4,255,10,2,18,1,10,1,8,1,4,1,6, + 255,22,2,255,128,122,19,77,111,100,117,108,101,83,112,101, + 99,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,102,0,0,0,124,0,106,0,125,2,122,72, + 124,0,106,1,124,1,106,1,107,2,111,76,124,0,106,2, + 124,1,106,2,107,2,111,76,124,0,106,3,124,1,106,3, + 107,2,111,76,124,2,124,1,106,0,107,2,111,76,124,0, + 106,4,124,1,106,4,107,2,111,76,124,0,106,5,124,1, + 106,5,107,2,87,0,83,0,4,0,116,6,121,100,1,0, + 1,0,1,0,116,7,6,0,89,0,83,0,48,0,114,13, + 0,0,0,41,8,114,117,0,0,0,114,17,0,0,0,114, + 110,0,0,0,114,114,0,0,0,218,6,99,97,99,104,101, + 100,218,12,104,97,115,95,108,111,99,97,116,105,111,110,114, + 107,0,0,0,218,14,78,111,116,73,109,112,108,101,109,101, + 110,116,101,100,41,3,114,30,0,0,0,90,5,111,116,104, + 101,114,90,4,115,109,115,108,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,6,95,95,101,113,95,95,117, + 1,0,0,115,32,0,0,0,6,1,2,1,12,1,10,1, + 2,255,10,2,2,254,8,3,2,253,10,4,2,252,10,5, + 4,251,12,6,10,1,255,128,122,17,77,111,100,117,108,101, + 83,112,101,99,46,95,95,101,113,95,95,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,58,0,0,0,124,0,106,0,100,0,117, + 0,114,52,124,0,106,1,100,0,117,1,114,52,124,0,106, + 2,114,52,116,3,100,0,117,0,114,38,116,4,130,1,116, + 3,160,5,124,0,106,1,161,1,124,0,95,0,124,0,106, + 0,83,0,114,13,0,0,0,41,6,114,119,0,0,0,114, + 114,0,0,0,114,118,0,0,0,218,19,95,98,111,111,116, + 115,116,114,97,112,95,101,120,116,101,114,110,97,108,218,19, + 78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,114, + 114,111,114,90,11,95,103,101,116,95,99,97,99,104,101,100, + 114,48,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,123,0,0,0,129,1,0,0,115,14,0, + 0,0,10,2,16,1,8,1,4,1,14,1,6,1,255,128, + 122,17,77,111,100,117,108,101,83,112,101,99,46,99,97,99, + 104,101,100,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,2,0,0,0,67,0,0,0,115,10,0,0, + 0,124,1,124,0,95,0,100,0,83,0,114,13,0,0,0, + 41,1,114,119,0,0,0,41,2,114,30,0,0,0,114,123, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,123,0,0,0,138,1,0,0,115,6,0,0,0, + 6,2,4,128,255,128,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 32,0,0,0,124,0,106,0,100,1,117,0,114,26,124,0, + 106,1,160,2,100,2,161,1,100,3,25,0,83,0,124,0, + 106,1,83,0,41,4,122,32,84,104,101,32,110,97,109,101, + 32,111,102,32,116,104,101,32,109,111,100,117,108,101,39,115, + 32,112,97,114,101,110,116,46,78,218,1,46,114,22,0,0, + 0,41,3,114,117,0,0,0,114,17,0,0,0,218,10,114, + 112,97,114,116,105,116,105,111,110,114,48,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,6,112, + 97,114,101,110,116,142,1,0,0,115,8,0,0,0,10,3, + 16,1,6,2,255,128,122,17,77,111,100,117,108,101,83,112, + 101,99,46,112,97,114,101,110,116,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,1,0,0,0,67,0, + 0,0,115,6,0,0,0,124,0,106,0,83,0,114,13,0, + 0,0,41,1,114,118,0,0,0,114,48,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,124,0, + 0,0,150,1,0,0,115,4,0,0,0,6,2,255,128,122, + 23,77,111,100,117,108,101,83,112,101,99,46,104,97,115,95, + 108,111,99,97,116,105,111,110,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,115,14,0,0,0,116,0,124,1,131,1,124,0,95,1, + 100,0,83,0,114,13,0,0,0,41,2,218,4,98,111,111, + 108,114,118,0,0,0,41,2,114,30,0,0,0,218,5,118, + 97,108,117,101,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,124,0,0,0,154,1,0,0,115,6,0,0, + 0,10,2,4,128,255,128,41,12,114,1,0,0,0,114,0, + 0,0,0,114,2,0,0,0,114,3,0,0,0,114,31,0, + 0,0,114,49,0,0,0,114,126,0,0,0,218,8,112,114, + 111,112,101,114,116,121,114,123,0,0,0,218,6,115,101,116, + 116,101,114,114,131,0,0,0,114,124,0,0,0,114,10,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,124,0,0,0,150,1,0,0,115,2,0,0,0,0, - 2,122,23,77,111,100,117,108,101,83,112,101,99,46,104,97, - 115,95,108,111,99,97,116,105,111,110,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67, - 0,0,0,115,14,0,0,0,116,0,124,1,131,1,124,0, - 95,1,100,0,83,0,114,13,0,0,0,41,2,218,4,98, - 111,111,108,114,118,0,0,0,41,2,114,30,0,0,0,218, - 5,118,97,108,117,101,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,124,0,0,0,154,1,0,0,115,2, - 0,0,0,0,2,41,12,114,1,0,0,0,114,0,0,0, - 0,114,2,0,0,0,114,3,0,0,0,114,31,0,0,0, - 114,49,0,0,0,114,126,0,0,0,218,8,112,114,111,112, - 101,114,116,121,114,123,0,0,0,218,6,115,101,116,116,101, - 114,114,131,0,0,0,114,124,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 113,0,0,0,58,1,0,0,115,32,0,0,0,8,1,4, - 36,4,1,2,255,12,12,8,10,8,12,2,1,10,8,4, - 1,10,3,2,1,10,7,2,1,10,3,4,1,114,113,0, - 0,0,169,2,114,114,0,0,0,114,116,0,0,0,99,2, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,150,0,0,0,116,0,124,1, - 100,1,131,2,114,74,116,1,100,2,117,0,114,22,116,2, - 130,1,116,1,106,3,125,4,124,3,100,2,117,0,114,48, - 124,4,124,0,124,1,100,3,141,2,83,0,124,3,114,56, - 103,0,110,2,100,2,125,5,124,4,124,0,124,1,124,5, - 100,4,141,3,83,0,124,3,100,2,117,0,114,134,116,0, - 124,1,100,5,131,2,114,130,122,14,124,1,160,4,124,0, - 161,1,125,3,87,0,110,26,4,0,116,5,121,128,1,0, - 1,0,1,0,100,2,125,3,89,0,110,6,48,0,100,6, - 125,3,116,6,124,0,124,1,124,2,124,3,100,7,141,4, - 83,0,41,8,122,53,82,101,116,117,114,110,32,97,32,109, - 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, - 32,111,110,32,118,97,114,105,111,117,115,32,108,111,97,100, - 101,114,32,109,101,116,104,111,100,115,46,90,12,103,101,116, - 95,102,105,108,101,110,97,109,101,78,41,1,114,110,0,0, - 0,41,2,114,110,0,0,0,114,117,0,0,0,114,116,0, - 0,0,70,114,136,0,0,0,41,7,114,4,0,0,0,114, - 127,0,0,0,114,128,0,0,0,218,23,115,112,101,99,95, - 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, - 111,110,114,116,0,0,0,114,80,0,0,0,114,113,0,0, - 0,41,6,114,17,0,0,0,114,110,0,0,0,114,114,0, - 0,0,114,116,0,0,0,114,137,0,0,0,90,6,115,101, - 97,114,99,104,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,92,0,0,0,159,1,0,0,115,36,0,0, - 0,0,2,10,1,8,1,4,1,6,2,8,1,12,1,12, - 1,6,1,2,255,6,3,8,1,10,1,2,1,14,1,12, - 1,10,3,4,2,114,92,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,67, - 0,0,0,115,40,1,0,0,122,10,124,0,106,0,125,3, - 87,0,110,18,4,0,116,1,121,28,1,0,1,0,1,0, - 89,0,110,14,48,0,124,3,100,0,117,1,114,42,124,3, - 83,0,124,0,106,2,125,4,124,1,100,0,117,0,114,86, - 122,10,124,0,106,3,125,1,87,0,110,18,4,0,116,1, - 121,84,1,0,1,0,1,0,89,0,110,2,48,0,122,10, - 124,0,106,4,125,5,87,0,110,22,4,0,116,1,121,118, - 1,0,1,0,1,0,100,0,125,5,89,0,110,2,48,0, - 124,2,100,0,117,0,114,174,124,5,100,0,117,0,114,170, - 122,10,124,1,106,5,125,2,87,0,110,26,4,0,116,1, - 121,168,1,0,1,0,1,0,100,0,125,2,89,0,110,6, - 48,0,124,5,125,2,122,10,124,0,106,6,125,6,87,0, - 110,22,4,0,116,1,121,206,1,0,1,0,1,0,100,0, - 125,6,89,0,110,2,48,0,122,14,116,7,124,0,106,8, - 131,1,125,7,87,0,110,22,4,0,116,1,121,244,1,0, - 1,0,1,0,100,0,125,7,89,0,110,2,48,0,116,9, - 124,4,124,1,124,2,100,1,141,3,125,3,124,5,100,0, - 117,0,144,1,114,18,100,2,110,2,100,3,124,3,95,10, - 124,6,124,3,95,11,124,7,124,3,95,12,124,3,83,0, - 41,4,78,169,1,114,114,0,0,0,70,84,41,13,114,106, - 0,0,0,114,107,0,0,0,114,1,0,0,0,114,99,0, - 0,0,114,109,0,0,0,218,7,95,79,82,73,71,73,78, - 218,10,95,95,99,97,99,104,101,100,95,95,218,4,108,105, - 115,116,218,8,95,95,112,97,116,104,95,95,114,113,0,0, - 0,114,118,0,0,0,114,123,0,0,0,114,117,0,0,0, - 41,8,114,97,0,0,0,114,110,0,0,0,114,114,0,0, - 0,114,96,0,0,0,114,17,0,0,0,90,8,108,111,99, - 97,116,105,111,110,114,123,0,0,0,114,117,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,17, - 95,115,112,101,99,95,102,114,111,109,95,109,111,100,117,108, - 101,185,1,0,0,115,72,0,0,0,0,2,2,1,10,1, - 12,1,6,2,8,1,4,2,6,1,8,1,2,1,10,1, - 12,2,6,1,2,1,10,1,12,1,10,1,8,1,8,1, - 2,1,10,1,12,1,10,2,4,1,2,1,10,1,12,1, - 10,1,2,1,14,1,12,1,10,2,14,1,20,1,6,1, - 6,1,114,143,0,0,0,70,169,1,218,8,111,118,101,114, - 114,105,100,101,99,2,0,0,0,0,0,0,0,1,0,0, - 0,5,0,0,0,8,0,0,0,67,0,0,0,115,210,1, - 0,0,124,2,115,20,116,0,124,1,100,1,100,0,131,3, - 100,0,117,0,114,52,122,12,124,0,106,1,124,1,95,2, - 87,0,110,18,4,0,116,3,121,50,1,0,1,0,1,0, - 89,0,110,2,48,0,124,2,115,72,116,0,124,1,100,2, - 100,0,131,3,100,0,117,0,114,174,124,0,106,4,125,3, - 124,3,100,0,117,0,114,144,124,0,106,5,100,0,117,1, - 114,144,116,6,100,0,117,0,114,108,116,7,130,1,116,6, - 106,8,125,4,124,4,160,9,124,4,161,1,125,3,124,0, - 106,5,124,3,95,10,124,3,124,0,95,4,100,0,124,1, - 95,11,122,10,124,3,124,1,95,12,87,0,110,18,4,0, - 116,3,121,172,1,0,1,0,1,0,89,0,110,2,48,0, - 124,2,115,194,116,0,124,1,100,3,100,0,131,3,100,0, - 117,0,114,226,122,12,124,0,106,13,124,1,95,14,87,0, - 110,18,4,0,116,3,121,224,1,0,1,0,1,0,89,0, - 110,2,48,0,122,10,124,0,124,1,95,15,87,0,110,18, - 4,0,116,3,121,254,1,0,1,0,1,0,89,0,110,2, - 48,0,124,2,144,1,115,24,116,0,124,1,100,4,100,0, - 131,3,100,0,117,0,144,1,114,70,124,0,106,5,100,0, - 117,1,144,1,114,70,122,12,124,0,106,5,124,1,95,16, - 87,0,110,20,4,0,116,3,144,1,121,68,1,0,1,0, - 1,0,89,0,110,2,48,0,124,0,106,17,144,1,114,206, - 124,2,144,1,115,102,116,0,124,1,100,5,100,0,131,3, - 100,0,117,0,144,1,114,136,122,12,124,0,106,18,124,1, - 95,11,87,0,110,20,4,0,116,3,144,1,121,134,1,0, - 1,0,1,0,89,0,110,2,48,0,124,2,144,1,115,160, - 116,0,124,1,100,6,100,0,131,3,100,0,117,0,144,1, - 114,206,124,0,106,19,100,0,117,1,144,1,114,206,122,12, - 124,0,106,19,124,1,95,20,87,0,110,20,4,0,116,3, - 144,1,121,204,1,0,1,0,1,0,89,0,110,2,48,0, - 124,1,83,0,41,7,78,114,1,0,0,0,114,99,0,0, - 0,218,11,95,95,112,97,99,107,97,103,101,95,95,114,142, - 0,0,0,114,109,0,0,0,114,140,0,0,0,41,21,114, - 6,0,0,0,114,17,0,0,0,114,1,0,0,0,114,107, - 0,0,0,114,110,0,0,0,114,117,0,0,0,114,127,0, - 0,0,114,128,0,0,0,218,16,95,78,97,109,101,115,112, - 97,99,101,76,111,97,100,101,114,218,7,95,95,110,101,119, - 95,95,90,5,95,112,97,116,104,114,109,0,0,0,114,99, - 0,0,0,114,131,0,0,0,114,146,0,0,0,114,106,0, - 0,0,114,142,0,0,0,114,124,0,0,0,114,114,0,0, - 0,114,123,0,0,0,114,140,0,0,0,41,5,114,96,0, - 0,0,114,97,0,0,0,114,145,0,0,0,114,110,0,0, - 0,114,147,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,18,95,105,110,105,116,95,109,111,100, - 117,108,101,95,97,116,116,114,115,230,1,0,0,115,96,0, - 0,0,0,4,20,1,2,1,12,1,12,1,6,2,20,1, - 6,1,8,2,10,1,8,1,4,1,6,2,10,1,8,1, - 6,11,6,1,2,1,10,1,12,1,6,2,20,1,2,1, - 12,1,12,1,6,2,2,1,10,1,12,1,6,2,24,1, - 12,1,2,1,12,1,14,1,6,2,8,1,24,1,2,1, - 12,1,14,1,6,2,24,1,12,1,2,1,12,1,14,1, - 6,1,114,149,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,82,0,0,0,100,1,125,1,116,0,124,0,106,1,100, - 2,131,2,114,30,124,0,106,1,160,2,124,0,161,1,125, - 1,110,20,116,0,124,0,106,1,100,3,131,2,114,50,116, - 3,100,4,131,1,130,1,124,1,100,1,117,0,114,68,116, - 4,124,0,106,5,131,1,125,1,116,6,124,0,124,1,131, - 2,1,0,124,1,83,0,41,5,122,43,67,114,101,97,116, - 101,32,97,32,109,111,100,117,108,101,32,98,97,115,101,100, - 32,111,110,32,116,104,101,32,112,114,111,118,105,100,101,100, - 32,115,112,101,99,46,78,218,13,99,114,101,97,116,101,95, - 109,111,100,117,108,101,218,11,101,120,101,99,95,109,111,100, - 117,108,101,122,66,108,111,97,100,101,114,115,32,116,104,97, - 116,32,100,101,102,105,110,101,32,101,120,101,99,95,109,111, - 100,117,108,101,40,41,32,109,117,115,116,32,97,108,115,111, - 32,100,101,102,105,110,101,32,99,114,101,97,116,101,95,109, - 111,100,117,108,101,40,41,41,7,114,4,0,0,0,114,110, - 0,0,0,114,150,0,0,0,114,80,0,0,0,114,18,0, - 0,0,114,17,0,0,0,114,149,0,0,0,169,2,114,96, - 0,0,0,114,97,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,16,109,111,100,117,108,101,95, - 102,114,111,109,95,115,112,101,99,46,2,0,0,115,18,0, - 0,0,0,3,4,1,12,3,14,1,12,1,8,2,8,1, - 10,1,10,1,114,153,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0, - 0,0,115,100,0,0,0,124,0,106,0,100,1,117,0,114, - 14,100,2,110,4,124,0,106,0,125,1,124,0,106,1,100, - 1,117,0,114,64,124,0,106,2,100,1,117,0,114,50,100, - 3,160,3,124,1,161,1,83,0,100,4,160,3,124,1,124, - 0,106,2,161,2,83,0,124,0,106,4,114,84,100,5,160, - 3,124,1,124,0,106,1,161,2,83,0,100,6,160,3,124, - 0,106,0,124,0,106,1,161,2,83,0,41,7,122,38,82, - 101,116,117,114,110,32,116,104,101,32,114,101,112,114,32,116, - 111,32,117,115,101,32,102,111,114,32,116,104,101,32,109,111, - 100,117,108,101,46,78,114,101,0,0,0,114,102,0,0,0, - 114,103,0,0,0,114,104,0,0,0,250,18,60,109,111,100, - 117,108,101,32,123,33,114,125,32,40,123,125,41,62,41,5, - 114,17,0,0,0,114,114,0,0,0,114,110,0,0,0,114, - 46,0,0,0,114,124,0,0,0,41,2,114,96,0,0,0, - 114,17,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,108,0,0,0,63,2,0,0,115,16,0, - 0,0,0,3,20,1,10,1,10,1,10,2,14,2,6,1, - 14,2,114,108,0,0,0,99,2,0,0,0,0,0,0,0, + 0,114,113,0,0,0,58,1,0,0,115,36,0,0,0,8, + 0,4,1,4,36,2,1,12,255,8,12,8,10,2,12,10, + 1,4,8,10,1,2,3,10,1,2,7,10,1,4,3,14, + 1,255,128,114,113,0,0,0,169,2,114,114,0,0,0,114, + 116,0,0,0,99,2,0,0,0,0,0,0,0,2,0,0, + 0,6,0,0,0,8,0,0,0,67,0,0,0,115,150,0, + 0,0,116,0,124,1,100,1,131,2,114,74,116,1,100,2, + 117,0,114,22,116,2,130,1,116,1,106,3,125,4,124,3, + 100,2,117,0,114,48,124,4,124,0,124,1,100,3,141,2, + 83,0,124,3,114,56,103,0,110,2,100,2,125,5,124,4, + 124,0,124,1,124,5,100,4,141,3,83,0,124,3,100,2, + 117,0,114,134,116,0,124,1,100,5,131,2,114,130,122,14, + 124,1,160,4,124,0,161,1,125,3,87,0,110,26,4,0, + 116,5,121,128,1,0,1,0,1,0,100,2,125,3,89,0, + 110,6,48,0,100,6,125,3,116,6,124,0,124,1,124,2, + 124,3,100,7,141,4,83,0,41,8,122,53,82,101,116,117, + 114,110,32,97,32,109,111,100,117,108,101,32,115,112,101,99, + 32,98,97,115,101,100,32,111,110,32,118,97,114,105,111,117, + 115,32,108,111,97,100,101,114,32,109,101,116,104,111,100,115, + 46,90,12,103,101,116,95,102,105,108,101,110,97,109,101,78, + 41,1,114,110,0,0,0,41,2,114,110,0,0,0,114,117, + 0,0,0,114,116,0,0,0,70,114,136,0,0,0,41,7, + 114,4,0,0,0,114,127,0,0,0,114,128,0,0,0,218, + 23,115,112,101,99,95,102,114,111,109,95,102,105,108,101,95, + 108,111,99,97,116,105,111,110,114,116,0,0,0,114,80,0, + 0,0,114,113,0,0,0,41,6,114,17,0,0,0,114,110, + 0,0,0,114,114,0,0,0,114,116,0,0,0,114,137,0, + 0,0,90,6,115,101,97,114,99,104,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,92,0,0,0,159,1, + 0,0,115,38,0,0,0,10,2,8,1,4,1,6,1,8, + 2,12,1,12,1,6,1,2,1,6,255,8,3,10,1,2, + 1,14,1,12,1,10,1,4,3,16,2,255,128,114,92,0, + 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,8, + 0,0,0,8,0,0,0,67,0,0,0,115,40,1,0,0, + 122,10,124,0,106,0,125,3,87,0,110,18,4,0,116,1, + 121,28,1,0,1,0,1,0,89,0,110,14,48,0,124,3, + 100,0,117,1,114,42,124,3,83,0,124,0,106,2,125,4, + 124,1,100,0,117,0,114,86,122,10,124,0,106,3,125,1, + 87,0,110,18,4,0,116,1,121,84,1,0,1,0,1,0, + 89,0,110,2,48,0,122,10,124,0,106,4,125,5,87,0, + 110,22,4,0,116,1,121,118,1,0,1,0,1,0,100,0, + 125,5,89,0,110,2,48,0,124,2,100,0,117,0,114,174, + 124,5,100,0,117,0,114,170,122,10,124,1,106,5,125,2, + 87,0,110,26,4,0,116,1,121,168,1,0,1,0,1,0, + 100,0,125,2,89,0,110,6,48,0,124,5,125,2,122,10, + 124,0,106,6,125,6,87,0,110,22,4,0,116,1,121,206, + 1,0,1,0,1,0,100,0,125,6,89,0,110,2,48,0, + 122,14,116,7,124,0,106,8,131,1,125,7,87,0,110,22, + 4,0,116,1,121,244,1,0,1,0,1,0,100,0,125,7, + 89,0,110,2,48,0,116,9,124,4,124,1,124,2,100,1, + 141,3,125,3,124,5,100,0,117,0,144,1,114,18,100,2, + 110,2,100,3,124,3,95,10,124,6,124,3,95,11,124,7, + 124,3,95,12,124,3,83,0,41,4,78,169,1,114,114,0, + 0,0,70,84,41,13,114,106,0,0,0,114,107,0,0,0, + 114,1,0,0,0,114,99,0,0,0,114,109,0,0,0,218, + 7,95,79,82,73,71,73,78,218,10,95,95,99,97,99,104, + 101,100,95,95,218,4,108,105,115,116,218,8,95,95,112,97, + 116,104,95,95,114,113,0,0,0,114,118,0,0,0,114,123, + 0,0,0,114,117,0,0,0,41,8,114,97,0,0,0,114, + 110,0,0,0,114,114,0,0,0,114,96,0,0,0,114,17, + 0,0,0,90,8,108,111,99,97,116,105,111,110,114,123,0, + 0,0,114,117,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,17,95,115,112,101,99,95,102,114, + 111,109,95,109,111,100,117,108,101,185,1,0,0,115,74,0, + 0,0,2,2,10,1,12,1,6,1,8,2,4,1,6,2, + 8,1,2,1,10,1,12,1,6,2,2,1,10,1,12,1, + 10,1,8,1,8,1,2,1,10,1,12,1,10,1,4,2, + 2,1,10,1,12,1,10,1,2,1,14,1,12,1,10,1, + 14,2,20,1,6,1,6,1,4,1,255,128,114,143,0,0, + 0,70,169,1,218,8,111,118,101,114,114,105,100,101,99,2, + 0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,8, + 0,0,0,67,0,0,0,115,210,1,0,0,124,2,115,20, + 116,0,124,1,100,1,100,0,131,3,100,0,117,0,114,52, + 122,12,124,0,106,1,124,1,95,2,87,0,110,18,4,0, + 116,3,121,50,1,0,1,0,1,0,89,0,110,2,48,0, + 124,2,115,72,116,0,124,1,100,2,100,0,131,3,100,0, + 117,0,114,174,124,0,106,4,125,3,124,3,100,0,117,0, + 114,144,124,0,106,5,100,0,117,1,114,144,116,6,100,0, + 117,0,114,108,116,7,130,1,116,6,106,8,125,4,124,4, + 160,9,124,4,161,1,125,3,124,0,106,5,124,3,95,10, + 124,3,124,0,95,4,100,0,124,1,95,11,122,10,124,3, + 124,1,95,12,87,0,110,18,4,0,116,3,121,172,1,0, + 1,0,1,0,89,0,110,2,48,0,124,2,115,194,116,0, + 124,1,100,3,100,0,131,3,100,0,117,0,114,226,122,12, + 124,0,106,13,124,1,95,14,87,0,110,18,4,0,116,3, + 121,224,1,0,1,0,1,0,89,0,110,2,48,0,122,10, + 124,0,124,1,95,15,87,0,110,18,4,0,116,3,121,254, + 1,0,1,0,1,0,89,0,110,2,48,0,124,2,144,1, + 115,24,116,0,124,1,100,4,100,0,131,3,100,0,117,0, + 144,1,114,70,124,0,106,5,100,0,117,1,144,1,114,70, + 122,12,124,0,106,5,124,1,95,16,87,0,110,20,4,0, + 116,3,144,1,121,68,1,0,1,0,1,0,89,0,110,2, + 48,0,124,0,106,17,144,1,114,206,124,2,144,1,115,102, + 116,0,124,1,100,5,100,0,131,3,100,0,117,0,144,1, + 114,136,122,12,124,0,106,18,124,1,95,11,87,0,110,20, + 4,0,116,3,144,1,121,134,1,0,1,0,1,0,89,0, + 110,2,48,0,124,2,144,1,115,160,116,0,124,1,100,6, + 100,0,131,3,100,0,117,0,144,1,114,206,124,0,106,19, + 100,0,117,1,144,1,114,206,122,12,124,0,106,19,124,1, + 95,20,87,0,110,20,4,0,116,3,144,1,121,204,1,0, + 1,0,1,0,89,0,110,2,48,0,124,1,83,0,41,7, + 78,114,1,0,0,0,114,99,0,0,0,218,11,95,95,112, + 97,99,107,97,103,101,95,95,114,142,0,0,0,114,109,0, + 0,0,114,140,0,0,0,41,21,114,6,0,0,0,114,17, + 0,0,0,114,1,0,0,0,114,107,0,0,0,114,110,0, + 0,0,114,117,0,0,0,114,127,0,0,0,114,128,0,0, + 0,218,16,95,78,97,109,101,115,112,97,99,101,76,111,97, + 100,101,114,218,7,95,95,110,101,119,95,95,90,5,95,112, + 97,116,104,114,109,0,0,0,114,99,0,0,0,114,131,0, + 0,0,114,146,0,0,0,114,106,0,0,0,114,142,0,0, + 0,114,124,0,0,0,114,114,0,0,0,114,123,0,0,0, + 114,140,0,0,0,41,5,114,96,0,0,0,114,97,0,0, + 0,114,145,0,0,0,114,110,0,0,0,114,147,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 18,95,105,110,105,116,95,109,111,100,117,108,101,95,97,116, + 116,114,115,230,1,0,0,115,98,0,0,0,20,4,2,1, + 12,1,12,1,6,1,20,2,6,1,8,1,10,2,8,1, + 4,1,6,1,10,2,8,1,6,1,6,11,2,1,10,1, + 12,1,6,1,20,2,2,1,12,1,12,1,6,1,2,2, + 10,1,12,1,6,1,24,2,12,1,2,1,12,1,14,1, + 6,1,8,2,24,1,2,1,12,1,14,1,6,1,24,2, + 12,1,2,1,12,1,14,1,6,1,4,1,255,128,114,149, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,82,0,0, + 0,100,1,125,1,116,0,124,0,106,1,100,2,131,2,114, + 30,124,0,106,1,160,2,124,0,161,1,125,1,110,20,116, + 0,124,0,106,1,100,3,131,2,114,50,116,3,100,4,131, + 1,130,1,124,1,100,1,117,0,114,68,116,4,124,0,106, + 5,131,1,125,1,116,6,124,0,124,1,131,2,1,0,124, + 1,83,0,41,5,122,43,67,114,101,97,116,101,32,97,32, + 109,111,100,117,108,101,32,98,97,115,101,100,32,111,110,32, + 116,104,101,32,112,114,111,118,105,100,101,100,32,115,112,101, + 99,46,78,218,13,99,114,101,97,116,101,95,109,111,100,117, + 108,101,218,11,101,120,101,99,95,109,111,100,117,108,101,122, + 66,108,111,97,100,101,114,115,32,116,104,97,116,32,100,101, + 102,105,110,101,32,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,109,117,115,116,32,97,108,115,111,32,100,101,102, + 105,110,101,32,99,114,101,97,116,101,95,109,111,100,117,108, + 101,40,41,41,7,114,4,0,0,0,114,110,0,0,0,114, + 150,0,0,0,114,80,0,0,0,114,18,0,0,0,114,17, + 0,0,0,114,149,0,0,0,169,2,114,96,0,0,0,114, + 97,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,16,109,111,100,117,108,101,95,102,114,111,109, + 95,115,112,101,99,46,2,0,0,115,20,0,0,0,4,3, + 12,1,14,3,12,1,8,1,8,2,10,1,10,1,4,1, + 255,128,114,153,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,4,0,0,0,67,0,0,0, + 115,100,0,0,0,124,0,106,0,100,1,117,0,114,14,100, + 2,110,4,124,0,106,0,125,1,124,0,106,1,100,1,117, + 0,114,64,124,0,106,2,100,1,117,0,114,50,100,3,160, + 3,124,1,161,1,83,0,100,4,160,3,124,1,124,0,106, + 2,161,2,83,0,124,0,106,4,114,84,100,5,160,3,124, + 1,124,0,106,1,161,2,83,0,100,6,160,3,124,0,106, + 0,124,0,106,1,161,2,83,0,41,7,122,38,82,101,116, + 117,114,110,32,116,104,101,32,114,101,112,114,32,116,111,32, + 117,115,101,32,102,111,114,32,116,104,101,32,109,111,100,117, + 108,101,46,78,114,101,0,0,0,114,102,0,0,0,114,103, + 0,0,0,114,104,0,0,0,250,18,60,109,111,100,117,108, + 101,32,123,33,114,125,32,40,123,125,41,62,41,5,114,17, + 0,0,0,114,114,0,0,0,114,110,0,0,0,114,46,0, + 0,0,114,124,0,0,0,41,2,114,96,0,0,0,114,17, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,108,0,0,0,63,2,0,0,115,18,0,0,0, + 20,3,10,1,10,1,10,1,14,2,6,2,14,1,16,2, + 255,128,114,108,0,0,0,99,2,0,0,0,0,0,0,0, 0,0,0,0,4,0,0,0,10,0,0,0,67,0,0,0, 115,250,0,0,0,124,0,106,0,125,2,116,1,124,2,131, 1,143,216,1,0,116,2,106,3,160,4,124,2,161,1,124, @@ -942,164 +950,165 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 114,151,0,0,0,218,3,112,111,112,41,4,114,96,0,0, 0,114,97,0,0,0,114,17,0,0,0,218,3,109,115,103, 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 94,0,0,0,80,2,0,0,115,38,0,0,0,0,2,6, - 1,10,1,16,1,10,1,12,1,2,1,10,1,10,1,14, - 2,16,2,14,1,12,4,14,2,14,4,14,1,14,255,14, - 1,44,1,114,94,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,8,0,0,0,67,0,0, - 0,115,20,1,0,0,122,18,124,0,106,0,160,1,124,0, - 106,2,161,1,1,0,87,0,110,52,1,0,1,0,1,0, - 124,0,106,2,116,3,106,4,118,0,114,64,116,3,106,4, - 160,5,124,0,106,2,161,1,125,1,124,1,116,3,106,4, - 124,0,106,2,60,0,130,0,89,0,110,2,48,0,116,3, + 94,0,0,0,80,2,0,0,115,40,0,0,0,6,2,10, + 1,16,1,10,1,12,1,2,1,10,1,10,1,14,1,16, + 2,14,2,12,1,14,4,14,2,14,4,14,1,14,255,44, + 1,4,1,255,128,114,94,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,67, + 0,0,0,115,20,1,0,0,122,18,124,0,106,0,160,1, + 124,0,106,2,161,1,1,0,87,0,110,52,1,0,1,0, + 1,0,124,0,106,2,116,3,106,4,118,0,114,64,116,3, 106,4,160,5,124,0,106,2,161,1,125,1,124,1,116,3, - 106,4,124,0,106,2,60,0,116,6,124,1,100,1,100,0, - 131,3,100,0,117,0,114,146,122,12,124,0,106,0,124,1, - 95,7,87,0,110,18,4,0,116,8,121,144,1,0,1,0, - 1,0,89,0,110,2,48,0,116,6,124,1,100,2,100,0, - 131,3,100,0,117,0,114,222,122,40,124,1,106,9,124,1, - 95,10,116,11,124,1,100,3,131,2,115,200,124,0,106,2, - 160,12,100,4,161,1,100,5,25,0,124,1,95,10,87,0, - 110,18,4,0,116,8,121,220,1,0,1,0,1,0,89,0, - 110,2,48,0,116,6,124,1,100,6,100,0,131,3,100,0, - 117,0,144,1,114,16,122,10,124,0,124,1,95,13,87,0, - 110,20,4,0,116,8,144,1,121,14,1,0,1,0,1,0, - 89,0,110,2,48,0,124,1,83,0,41,7,78,114,99,0, - 0,0,114,146,0,0,0,114,142,0,0,0,114,129,0,0, - 0,114,22,0,0,0,114,106,0,0,0,41,14,114,110,0, - 0,0,114,156,0,0,0,114,17,0,0,0,114,15,0,0, - 0,114,93,0,0,0,114,157,0,0,0,114,6,0,0,0, - 114,99,0,0,0,114,107,0,0,0,114,1,0,0,0,114, - 146,0,0,0,114,4,0,0,0,114,130,0,0,0,114,106, - 0,0,0,114,152,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,25,95,108,111,97,100,95,98, - 97,99,107,119,97,114,100,95,99,111,109,112,97,116,105,98, - 108,101,110,2,0,0,115,54,0,0,0,0,4,2,1,18, - 1,6,1,12,1,14,1,12,1,8,3,14,1,12,1,16, - 1,2,1,12,1,12,1,6,1,16,1,2,4,8,1,10, + 106,4,124,0,106,2,60,0,130,0,89,0,110,2,48,0, + 116,3,106,4,160,5,124,0,106,2,161,1,125,1,124,1, + 116,3,106,4,124,0,106,2,60,0,116,6,124,1,100,1, + 100,0,131,3,100,0,117,0,114,146,122,12,124,0,106,0, + 124,1,95,7,87,0,110,18,4,0,116,8,121,144,1,0, + 1,0,1,0,89,0,110,2,48,0,116,6,124,1,100,2, + 100,0,131,3,100,0,117,0,114,222,122,40,124,1,106,9, + 124,1,95,10,116,11,124,1,100,3,131,2,115,200,124,0, + 106,2,160,12,100,4,161,1,100,5,25,0,124,1,95,10, + 87,0,110,18,4,0,116,8,121,220,1,0,1,0,1,0, + 89,0,110,2,48,0,116,6,124,1,100,6,100,0,131,3, + 100,0,117,0,144,1,114,16,122,10,124,0,124,1,95,13, + 87,0,110,20,4,0,116,8,144,1,121,14,1,0,1,0, + 1,0,89,0,110,2,48,0,124,1,83,0,41,7,78,114, + 99,0,0,0,114,146,0,0,0,114,142,0,0,0,114,129, + 0,0,0,114,22,0,0,0,114,106,0,0,0,41,14,114, + 110,0,0,0,114,156,0,0,0,114,17,0,0,0,114,15, + 0,0,0,114,93,0,0,0,114,157,0,0,0,114,6,0, + 0,0,114,99,0,0,0,114,107,0,0,0,114,1,0,0, + 0,114,146,0,0,0,114,4,0,0,0,114,130,0,0,0, + 114,106,0,0,0,114,152,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,25,95,108,111,97,100, + 95,98,97,99,107,119,97,114,100,95,99,111,109,112,97,116, + 105,98,108,101,110,2,0,0,115,56,0,0,0,2,4,18, + 1,6,1,12,1,14,1,12,1,8,1,14,3,12,1,16, + 1,2,1,12,1,12,1,6,1,16,1,2,1,8,4,10, 1,22,1,12,1,6,1,18,1,2,1,10,1,14,1,6, - 1,114,159,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,11,0,0,0,67,0,0,0,115, - 216,0,0,0,124,0,106,0,100,0,117,1,114,30,116,1, - 124,0,106,0,100,1,131,2,115,30,116,2,124,0,131,1, - 83,0,116,3,124,0,131,1,125,1,100,2,124,0,95,4, - 122,158,124,1,116,5,106,6,124,0,106,7,60,0,122,52, - 124,0,106,0,100,0,117,0,114,96,124,0,106,8,100,0, - 117,0,114,108,116,9,100,3,124,0,106,7,100,4,141,2, - 130,1,110,12,124,0,106,0,160,10,124,1,161,1,1,0, - 87,0,110,40,1,0,1,0,1,0,122,14,116,5,106,6, - 124,0,106,7,61,0,87,0,130,0,4,0,116,11,121,150, - 1,0,1,0,1,0,89,0,130,0,48,0,116,5,106,6, - 160,12,124,0,106,7,161,1,125,1,124,1,116,5,106,6, - 124,0,106,7,60,0,116,13,100,5,124,0,106,7,124,0, - 106,0,131,3,1,0,87,0,100,6,124,0,95,4,110,8, - 100,6,124,0,95,4,48,0,124,1,83,0,41,7,78,114, - 151,0,0,0,84,114,155,0,0,0,114,16,0,0,0,122, - 18,105,109,112,111,114,116,32,123,33,114,125,32,35,32,123, - 33,114,125,70,41,14,114,110,0,0,0,114,4,0,0,0, - 114,159,0,0,0,114,153,0,0,0,90,13,95,105,110,105, - 116,105,97,108,105,122,105,110,103,114,15,0,0,0,114,93, - 0,0,0,114,17,0,0,0,114,117,0,0,0,114,80,0, - 0,0,114,151,0,0,0,114,64,0,0,0,114,157,0,0, - 0,114,77,0,0,0,114,152,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,14,95,108,111,97, - 100,95,117,110,108,111,99,107,101,100,147,2,0,0,115,44, - 0,0,0,0,2,10,2,12,1,8,2,8,5,6,1,2, - 1,12,1,2,1,10,1,10,1,16,3,16,1,6,1,2, - 1,14,1,12,1,6,6,14,1,12,1,18,2,16,2,114, - 160,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,8,0,0,0,67,0,0,0,115,54,0, - 0,0,116,0,124,0,106,1,131,1,143,24,1,0,116,2, - 124,0,131,1,87,0,2,0,100,1,4,0,4,0,131,3, - 1,0,83,0,49,0,115,40,48,0,1,0,1,0,1,0, - 89,0,1,0,100,1,83,0,41,2,122,191,82,101,116,117, - 114,110,32,97,32,110,101,119,32,109,111,100,117,108,101,32, - 111,98,106,101,99,116,44,32,108,111,97,100,101,100,32,98, - 121,32,116,104,101,32,115,112,101,99,39,115,32,108,111,97, - 100,101,114,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,97,100,100,101, - 100,32,116,111,32,105,116,115,32,112,97,114,101,110,116,46, - 10,10,32,32,32,32,73,102,32,97,32,109,111,100,117,108, - 101,32,105,115,32,97,108,114,101,97,100,121,32,105,110,32, - 115,121,115,46,109,111,100,117,108,101,115,44,32,116,104,97, - 116,32,101,120,105,115,116,105,110,103,32,109,111,100,117,108, - 101,32,103,101,116,115,10,32,32,32,32,99,108,111,98,98, - 101,114,101,100,46,10,10,32,32,32,32,78,41,3,114,51, - 0,0,0,114,17,0,0,0,114,160,0,0,0,41,1,114, + 1,4,1,255,128,114,159,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,11,0,0,0,67, + 0,0,0,115,216,0,0,0,124,0,106,0,100,0,117,1, + 114,30,116,1,124,0,106,0,100,1,131,2,115,30,116,2, + 124,0,131,1,83,0,116,3,124,0,131,1,125,1,100,2, + 124,0,95,4,122,158,124,1,116,5,106,6,124,0,106,7, + 60,0,122,52,124,0,106,0,100,0,117,0,114,96,124,0, + 106,8,100,0,117,0,114,108,116,9,100,3,124,0,106,7, + 100,4,141,2,130,1,110,12,124,0,106,0,160,10,124,1, + 161,1,1,0,87,0,110,40,1,0,1,0,1,0,122,14, + 116,5,106,6,124,0,106,7,61,0,87,0,130,0,4,0, + 116,11,121,150,1,0,1,0,1,0,89,0,130,0,48,0, + 116,5,106,6,160,12,124,0,106,7,161,1,125,1,124,1, + 116,5,106,6,124,0,106,7,60,0,116,13,100,5,124,0, + 106,7,124,0,106,0,131,3,1,0,87,0,100,6,124,0, + 95,4,110,8,100,6,124,0,95,4,48,0,124,1,83,0, + 41,7,78,114,151,0,0,0,84,114,155,0,0,0,114,16, + 0,0,0,122,18,105,109,112,111,114,116,32,123,33,114,125, + 32,35,32,123,33,114,125,70,41,14,114,110,0,0,0,114, + 4,0,0,0,114,159,0,0,0,114,153,0,0,0,90,13, + 95,105,110,105,116,105,97,108,105,122,105,110,103,114,15,0, + 0,0,114,93,0,0,0,114,17,0,0,0,114,117,0,0, + 0,114,80,0,0,0,114,151,0,0,0,114,64,0,0,0, + 114,157,0,0,0,114,77,0,0,0,114,152,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,14, + 95,108,111,97,100,95,117,110,108,111,99,107,101,100,147,2, + 0,0,115,46,0,0,0,10,2,12,2,8,1,8,2,6, + 5,2,1,12,1,2,1,10,1,10,1,16,1,16,3,6, + 1,2,1,14,1,12,1,6,1,14,6,12,1,18,1,16, + 2,4,2,255,128,114,160,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,67, + 0,0,0,115,54,0,0,0,116,0,124,0,106,1,131,1, + 143,24,1,0,116,2,124,0,131,1,87,0,2,0,100,1, + 4,0,4,0,131,3,1,0,83,0,49,0,115,40,48,0, + 1,0,1,0,1,0,89,0,1,0,100,1,83,0,41,2, + 122,191,82,101,116,117,114,110,32,97,32,110,101,119,32,109, + 111,100,117,108,101,32,111,98,106,101,99,116,44,32,108,111, + 97,100,101,100,32,98,121,32,116,104,101,32,115,112,101,99, + 39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111,32,105,116,115,32,112, + 97,114,101,110,116,46,10,10,32,32,32,32,73,102,32,97, + 32,109,111,100,117,108,101,32,105,115,32,97,108,114,101,97, + 100,121,32,105,110,32,115,121,115,46,109,111,100,117,108,101, + 115,44,32,116,104,97,116,32,101,120,105,115,116,105,110,103, + 32,109,111,100,117,108,101,32,103,101,116,115,10,32,32,32, + 32,99,108,111,98,98,101,114,101,100,46,10,10,32,32,32, + 32,78,41,3,114,51,0,0,0,114,17,0,0,0,114,160, + 0,0,0,41,1,114,96,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,95,0,0,0,189,2, + 0,0,115,8,0,0,0,12,9,38,1,4,128,255,128,114, + 95,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,64,0,0,0,115,140,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 90,4,101,5,100,3,100,4,132,0,131,1,90,6,101,7, + 100,20,100,6,100,7,132,1,131,1,90,8,101,7,100,21, + 100,8,100,9,132,1,131,1,90,9,101,7,100,10,100,11, + 132,0,131,1,90,10,101,7,100,12,100,13,132,0,131,1, + 90,11,101,7,101,12,100,14,100,15,132,0,131,1,131,1, + 90,13,101,7,101,12,100,16,100,17,132,0,131,1,131,1, + 90,14,101,7,101,12,100,18,100,19,132,0,131,1,131,1, + 90,15,101,7,101,16,131,1,90,17,100,5,83,0,41,22, + 218,15,66,117,105,108,116,105,110,73,109,112,111,114,116,101, + 114,122,144,77,101,116,97,32,112,97,116,104,32,105,109,112, + 111,114,116,32,102,111,114,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,65, + 108,108,32,109,101,116,104,111,100,115,32,97,114,101,32,101, + 105,116,104,101,114,32,99,108,97,115,115,32,111,114,32,115, + 116,97,116,105,99,32,109,101,116,104,111,100,115,32,116,111, + 32,97,118,111,105,100,32,116,104,101,32,110,101,101,100,32, + 116,111,10,32,32,32,32,105,110,115,116,97,110,116,105,97, + 116,101,32,116,104,101,32,99,108,97,115,115,46,10,10,32, + 32,32,32,122,8,98,117,105,108,116,45,105,110,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0, + 0,0,67,0,0,0,115,22,0,0,0,100,1,124,0,106, + 0,155,2,100,2,116,1,106,2,155,0,100,3,157,5,83, + 0,41,4,250,115,82,101,116,117,114,110,32,114,101,112,114, + 32,102,111,114,32,116,104,101,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,101,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,32,32,84,104,101,32,105,109,112,111,114,116,32, + 109,97,99,104,105,110,101,114,121,32,100,111,101,115,32,116, + 104,101,32,106,111,98,32,105,116,115,101,108,102,46,10,10, + 32,32,32,32,32,32,32,32,122,8,60,109,111,100,117,108, + 101,32,122,2,32,40,122,2,41,62,41,3,114,1,0,0, + 0,114,161,0,0,0,114,139,0,0,0,41,1,114,97,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,100,0,0,0,215,2,0,0,115,4,0,0,0,22, + 7,255,128,122,27,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,4,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,5,0,0,0,67,0,0,0,115,42,0,0,0,124, + 2,100,0,117,1,114,12,100,0,83,0,116,0,160,1,124, + 1,161,1,114,38,116,2,124,1,124,0,124,0,106,3,100, + 1,141,3,83,0,100,0,83,0,169,2,78,114,138,0,0, + 0,41,4,114,58,0,0,0,90,10,105,115,95,98,117,105, + 108,116,105,110,114,92,0,0,0,114,139,0,0,0,169,4, + 218,3,99,108,115,114,82,0,0,0,218,4,112,97,116,104, + 218,6,116,97,114,103,101,116,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,9,102,105,110,100,95,115,112, + 101,99,224,2,0,0,115,12,0,0,0,8,2,4,1,10, + 1,16,1,4,2,255,128,122,25,66,117,105,108,116,105,110, + 73,109,112,111,114,116,101,114,46,102,105,110,100,95,115,112, + 101,99,99,3,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,4,0,0,0,67,0,0,0,115,30,0,0,0, + 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,1, + 117,1,114,26,124,3,106,1,83,0,100,1,83,0,41,2, + 122,175,70,105,110,100,32,116,104,101,32,98,117,105,108,116, + 45,105,110,32,109,111,100,117,108,101,46,10,10,32,32,32, + 32,32,32,32,32,73,102,32,39,112,97,116,104,39,32,105, + 115,32,101,118,101,114,32,115,112,101,99,105,102,105,101,100, + 32,116,104,101,110,32,116,104,101,32,115,101,97,114,99,104, + 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, + 32,102,97,105,108,117,114,101,46,10,10,32,32,32,32,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,78,41,2,114,168,0,0,0,114,110,0,0,0,41,4, + 114,165,0,0,0,114,82,0,0,0,114,166,0,0,0,114, 96,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,95,0,0,0,189,2,0,0,115,4,0,0, - 0,0,9,12,1,114,95,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, - 0,0,0,115,140,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,90,4,101,5,100,3,100,4,132,0, - 131,1,90,6,101,7,100,20,100,6,100,7,132,1,131,1, - 90,8,101,7,100,21,100,8,100,9,132,1,131,1,90,9, - 101,7,100,10,100,11,132,0,131,1,90,10,101,7,100,12, - 100,13,132,0,131,1,90,11,101,7,101,12,100,14,100,15, - 132,0,131,1,131,1,90,13,101,7,101,12,100,16,100,17, - 132,0,131,1,131,1,90,14,101,7,101,12,100,18,100,19, - 132,0,131,1,131,1,90,15,101,7,101,16,131,1,90,17, - 100,5,83,0,41,22,218,15,66,117,105,108,116,105,110,73, - 109,112,111,114,116,101,114,122,144,77,101,116,97,32,112,97, - 116,104,32,105,109,112,111,114,116,32,102,111,114,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,46,10, - 10,32,32,32,32,65,108,108,32,109,101,116,104,111,100,115, - 32,97,114,101,32,101,105,116,104,101,114,32,99,108,97,115, - 115,32,111,114,32,115,116,97,116,105,99,32,109,101,116,104, - 111,100,115,32,116,111,32,97,118,111,105,100,32,116,104,101, - 32,110,101,101,100,32,116,111,10,32,32,32,32,105,110,115, - 116,97,110,116,105,97,116,101,32,116,104,101,32,99,108,97, - 115,115,46,10,10,32,32,32,32,122,8,98,117,105,108,116, - 45,105,110,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,5,0,0,0,67,0,0,0,115,22,0,0, - 0,100,1,124,0,106,0,155,2,100,2,116,1,106,2,155, - 0,100,3,157,5,83,0,41,4,250,115,82,101,116,117,114, - 110,32,114,101,112,114,32,102,111,114,32,116,104,101,32,109, - 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, - 84,104,101,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,84,104,101,32,105, - 109,112,111,114,116,32,109,97,99,104,105,110,101,114,121,32, - 100,111,101,115,32,116,104,101,32,106,111,98,32,105,116,115, - 101,108,102,46,10,10,32,32,32,32,32,32,32,32,122,8, - 60,109,111,100,117,108,101,32,122,2,32,40,122,2,41,62, - 41,3,114,1,0,0,0,114,161,0,0,0,114,139,0,0, - 0,41,1,114,97,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,100,0,0,0,215,2,0,0, - 115,2,0,0,0,0,7,122,27,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,4,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,5,0,0,0,67,0,0,0,115,42, - 0,0,0,124,2,100,0,117,1,114,12,100,0,83,0,116, - 0,160,1,124,1,161,1,114,38,116,2,124,1,124,0,124, - 0,106,3,100,1,141,3,83,0,100,0,83,0,169,2,78, - 114,138,0,0,0,41,4,114,58,0,0,0,90,10,105,115, - 95,98,117,105,108,116,105,110,114,92,0,0,0,114,139,0, - 0,0,169,4,218,3,99,108,115,114,82,0,0,0,218,4, - 112,97,116,104,218,6,116,97,114,103,101,116,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,9,102,105,110, - 100,95,115,112,101,99,224,2,0,0,115,10,0,0,0,0, - 2,8,1,4,1,10,1,16,2,122,25,66,117,105,108,116, - 105,110,73,109,112,111,114,116,101,114,46,102,105,110,100,95, - 115,112,101,99,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,4,0,0,0,67,0,0,0,115,30,0, - 0,0,124,0,160,0,124,1,124,2,161,2,125,3,124,3, - 100,1,117,1,114,26,124,3,106,1,83,0,100,1,83,0, - 41,2,122,175,70,105,110,100,32,116,104,101,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,46,10,10,32, - 32,32,32,32,32,32,32,73,102,32,39,112,97,116,104,39, - 32,105,115,32,101,118,101,114,32,115,112,101,99,105,102,105, - 101,100,32,116,104,101,110,32,116,104,101,32,115,101,97,114, - 99,104,32,105,115,32,99,111,110,115,105,100,101,114,101,100, - 32,97,32,102,97,105,108,117,114,101,46,10,10,32,32,32, - 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, - 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, - 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, - 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, - 32,32,32,78,41,2,114,168,0,0,0,114,110,0,0,0, - 41,4,114,165,0,0,0,114,82,0,0,0,114,166,0,0, - 0,114,96,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,11,102,105,110,100,95,109,111,100,117, - 108,101,233,2,0,0,115,4,0,0,0,0,9,12,1,122, + 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101, + 233,2,0,0,115,6,0,0,0,12,9,18,1,255,128,122, 27,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,0,0,0,0,0,2,0,0,0,4,0,0, @@ -1114,64 +1123,65 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,90,14,99,114,101,97,116,101,95,98,117,105,108, 116,105,110,41,2,114,30,0,0,0,114,96,0,0,0,114, 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,150, - 0,0,0,245,2,0,0,115,10,0,0,0,0,3,12,1, - 12,1,4,255,6,2,122,29,66,117,105,108,116,105,110,73, - 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,16, - 0,0,0,116,0,116,1,106,2,124,1,131,2,1,0,100, - 1,83,0,41,2,122,22,69,120,101,99,32,97,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,78,41,3, - 114,68,0,0,0,114,58,0,0,0,90,12,101,120,101,99, - 95,98,117,105,108,116,105,110,41,2,114,30,0,0,0,114, - 97,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,151,0,0,0,253,2,0,0,115,2,0,0, - 0,0,3,122,27,66,117,105,108,116,105,110,73,109,112,111, - 114,116,101,114,46,101,120,101,99,95,109,111,100,117,108,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, - 83,0,41,2,122,57,82,101,116,117,114,110,32,78,111,110, - 101,32,97,115,32,98,117,105,108,116,45,105,110,32,109,111, - 100,117,108,101,115,32,100,111,32,110,111,116,32,104,97,118, - 101,32,99,111,100,101,32,111,98,106,101,99,116,115,46,78, - 114,10,0,0,0,169,2,114,165,0,0,0,114,82,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,8,103,101,116,95,99,111,100,101,2,3,0,0,115,2, - 0,0,0,0,4,122,24,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,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,122,56,82,101,116,117,114,110,32,78,111,110,101, - 32,97,115,32,98,117,105,108,116,45,105,110,32,109,111,100, - 117,108,101,115,32,100,111,32,110,111,116,32,104,97,118,101, - 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,10, - 0,0,0,114,170,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,10,103,101,116,95,115,111,117, - 114,99,101,8,3,0,0,115,2,0,0,0,0,4,122,26, - 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,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,52, - 82,101,116,117,114,110,32,70,97,108,115,101,32,97,115,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, - 32,97,114,101,32,110,101,118,101,114,32,112,97,99,107,97, - 103,101,115,46,70,114,10,0,0,0,114,170,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,116, - 0,0,0,14,3,0,0,115,2,0,0,0,0,4,122,26, - 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,41,2,78,78,41,1, - 78,41,18,114,1,0,0,0,114,0,0,0,0,114,2,0, - 0,0,114,3,0,0,0,114,139,0,0,0,218,12,115,116, - 97,116,105,99,109,101,116,104,111,100,114,100,0,0,0,218, - 11,99,108,97,115,115,109,101,116,104,111,100,114,168,0,0, - 0,114,169,0,0,0,114,150,0,0,0,114,151,0,0,0, - 114,87,0,0,0,114,171,0,0,0,114,172,0,0,0,114, - 116,0,0,0,114,98,0,0,0,114,156,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,161,0,0,0,204,2,0,0,115,44,0,0,0, - 8,2,4,7,4,2,2,1,10,8,2,1,12,8,2,1, - 12,11,2,1,10,7,2,1,10,4,2,1,2,1,12,4, - 2,1,2,1,12,4,2,1,2,1,12,4,114,161,0,0, + 0,0,0,245,2,0,0,115,12,0,0,0,12,3,12,1, + 4,1,6,255,12,2,255,128,122,29,66,117,105,108,116,105, + 110,73,109,112,111,114,116,101,114,46,99,114,101,97,116,101, + 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,16,0,0,0,116,0,116,1,106,2,124,1,131,2,1, + 0,100,1,83,0,41,2,122,22,69,120,101,99,32,97,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,78, + 41,3,114,68,0,0,0,114,58,0,0,0,90,12,101,120, + 101,99,95,98,117,105,108,116,105,110,41,2,114,30,0,0, + 0,114,97,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,151,0,0,0,253,2,0,0,115,6, + 0,0,0,12,3,4,128,255,128,122,27,66,117,105,108,116, + 105,110,73,109,112,111,114,116,101,114,46,101,120,101,99,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,1,83,0,41,2,122,57,82,101,116,117, + 114,110,32,78,111,110,101,32,97,115,32,98,117,105,108,116, + 45,105,110,32,109,111,100,117,108,101,115,32,100,111,32,110, + 111,116,32,104,97,118,101,32,99,111,100,101,32,111,98,106, + 101,99,116,115,46,78,114,10,0,0,0,169,2,114,165,0, + 0,0,114,82,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,8,103,101,116,95,99,111,100,101, + 2,3,0,0,115,4,0,0,0,4,4,255,128,122,24,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, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,56,82,101,116, + 117,114,110,32,78,111,110,101,32,97,115,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,115,32,100,111,32, + 110,111,116,32,104,97,118,101,32,115,111,117,114,99,101,32, + 99,111,100,101,46,78,114,10,0,0,0,114,170,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 10,103,101,116,95,115,111,117,114,99,101,8,3,0,0,115, + 4,0,0,0,4,4,255,128,122,26,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,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,41,2,122,52,82,101,116,117,114,110, + 32,70,97,108,115,101,32,97,115,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,115,32,97,114,101,32,110, + 101,118,101,114,32,112,97,99,107,97,103,101,115,46,70,114, + 10,0,0,0,114,170,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,116,0,0,0,14,3,0, + 0,115,4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41,18,114, + 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, + 0,0,0,114,139,0,0,0,218,12,115,116,97,116,105,99, + 109,101,116,104,111,100,114,100,0,0,0,218,11,99,108,97, + 115,115,109,101,116,104,111,100,114,168,0,0,0,114,169,0, + 0,0,114,150,0,0,0,114,151,0,0,0,114,87,0,0, + 0,114,171,0,0,0,114,172,0,0,0,114,116,0,0,0, + 114,98,0,0,0,114,156,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,161, + 0,0,0,204,2,0,0,115,48,0,0,0,8,0,4,2, + 4,7,2,2,10,1,2,8,12,1,2,8,12,1,2,11, + 10,1,2,7,10,1,2,4,2,1,12,1,2,4,2,1, + 12,1,2,4,2,1,12,1,12,4,255,128,114,161,0,0, 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,4,0,0,0,64,0,0,0,115,144,0,0,0,101, 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,101, @@ -1200,81 +1210,82 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,41,4,114,46,0,0,0,114,1,0,0,0,114, 175,0,0,0,114,139,0,0,0,41,1,218,1,109,114,10, 0,0,0,114,10,0,0,0,114,11,0,0,0,114,100,0, - 0,0,34,3,0,0,115,2,0,0,0,0,7,122,26,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,4,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, - 0,0,0,115,30,0,0,0,116,0,160,1,124,1,161,1, - 114,26,116,2,124,1,124,0,124,0,106,3,100,1,141,3, - 83,0,100,0,83,0,114,163,0,0,0,41,4,114,58,0, - 0,0,114,89,0,0,0,114,92,0,0,0,114,139,0,0, - 0,114,164,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,168,0,0,0,43,3,0,0,115,6, - 0,0,0,0,2,10,1,16,2,122,24,70,114,111,122,101, - 110,73,109,112,111,114,116,101,114,46,102,105,110,100,95,115, - 112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,3,0,0,0,67,0,0,0,115,18,0,0, - 0,116,0,160,1,124,1,161,1,114,14,124,0,83,0,100, - 1,83,0,41,2,122,93,70,105,110,100,32,97,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40, - 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, - 32,32,32,32,78,41,2,114,58,0,0,0,114,89,0,0, - 0,41,3,114,165,0,0,0,114,82,0,0,0,114,166,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,169,0,0,0,50,3,0,0,115,2,0,0,0,0, - 7,122,26,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,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,115, - 101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,100, - 117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,10, - 0,0,0,41,2,114,165,0,0,0,114,96,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,150, - 0,0,0,59,3,0,0,115,2,0,0,0,0,2,122,28, - 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,99, - 114,101,97,116,101,95,109,111,100,117,108,101,99,1,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, - 0,67,0,0,0,115,64,0,0,0,124,0,106,0,106,1, - 125,1,116,2,160,3,124,1,161,1,115,36,116,4,100,1, - 160,5,124,1,161,1,124,1,100,2,141,2,130,1,116,6, - 116,2,106,7,124,1,131,2,125,2,116,8,124,2,124,0, - 106,9,131,2,1,0,100,0,83,0,114,88,0,0,0,41, - 10,114,106,0,0,0,114,17,0,0,0,114,58,0,0,0, - 114,89,0,0,0,114,80,0,0,0,114,46,0,0,0,114, - 68,0,0,0,218,17,103,101,116,95,102,114,111,122,101,110, - 95,111,98,106,101,99,116,218,4,101,120,101,99,114,7,0, - 0,0,41,3,114,97,0,0,0,114,17,0,0,0,218,4, - 99,111,100,101,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,151,0,0,0,63,3,0,0,115,14,0,0, - 0,0,2,8,1,10,1,10,1,2,255,6,2,12,1,122, + 0,0,34,3,0,0,115,4,0,0,0,16,7,255,128,122, 26,70,114,111,122,101,110,73,109,112,111,114,116,101,114,46, - 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, + 109,111,100,117,108,101,95,114,101,112,114,78,99,4,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0, + 0,67,0,0,0,115,30,0,0,0,116,0,160,1,124,1, + 161,1,114,26,116,2,124,1,124,0,124,0,106,3,100,1, + 141,3,83,0,100,0,83,0,114,163,0,0,0,41,4,114, + 58,0,0,0,114,89,0,0,0,114,92,0,0,0,114,139, + 0,0,0,114,164,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,168,0,0,0,43,3,0,0, + 115,8,0,0,0,10,2,16,1,4,2,255,128,122,24,70, + 114,111,122,101,110,73,109,112,111,114,116,101,114,46,102,105, + 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, + 115,18,0,0,0,116,0,160,1,124,1,161,1,114,14,124, + 0,83,0,100,1,83,0,41,2,122,93,70,105,110,100,32, + 97,32,102,114,111,122,101,110,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,102,105,110,100,95,115, + 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,78,41,2,114,58,0,0,0, + 114,89,0,0,0,41,3,114,165,0,0,0,114,82,0,0, + 0,114,166,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,169,0,0,0,50,3,0,0,115,4, + 0,0,0,18,7,255,128,122,26,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,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,122,42,85,115,101,32,100,101,102, + 97,117,108,116,32,115,101,109,97,110,116,105,99,115,32,102, + 111,114,32,109,111,100,117,108,101,32,99,114,101,97,116,105, + 111,110,46,78,114,10,0,0,0,41,2,114,165,0,0,0, + 114,96,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,150,0,0,0,59,3,0,0,115,4,0, + 0,0,4,128,255,128,122,28,70,114,111,122,101,110,73,109, + 112,111,114,116,101,114,46,99,114,101,97,116,101,95,109,111, + 100,117,108,101,99,1,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,4,0,0,0,67,0,0,0,115,64,0, + 0,0,124,0,106,0,106,1,125,1,116,2,160,3,124,1, + 161,1,115,36,116,4,100,1,160,5,124,1,161,1,124,1, + 100,2,141,2,130,1,116,6,116,2,106,7,124,1,131,2, + 125,2,116,8,124,2,124,0,106,9,131,2,1,0,100,0, + 83,0,114,88,0,0,0,41,10,114,106,0,0,0,114,17, + 0,0,0,114,58,0,0,0,114,89,0,0,0,114,80,0, + 0,0,114,46,0,0,0,114,68,0,0,0,218,17,103,101, + 116,95,102,114,111,122,101,110,95,111,98,106,101,99,116,218, + 4,101,120,101,99,114,7,0,0,0,41,3,114,97,0,0, + 0,114,17,0,0,0,218,4,99,111,100,101,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,151,0,0,0, + 63,3,0,0,115,18,0,0,0,8,2,10,1,10,1,2, + 1,6,255,12,2,12,1,4,128,255,128,122,26,70,114,111, + 122,101,110,73,109,112,111,114,116,101,114,46,101,120,101,99, + 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,10,0,0,0,116,0,124,0,124,1,131,2,83,0,41, + 1,122,95,76,111,97,100,32,97,32,102,114,111,122,101,110, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, + 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, + 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, + 32,32,41,1,114,98,0,0,0,114,170,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,156,0, + 0,0,72,3,0,0,115,4,0,0,0,10,7,255,128,122, + 26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,10,0,0,0,116,0,124,0,124,1,131, - 2,83,0,41,1,122,95,76,111,97,100,32,97,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, - 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,41,1,114,98,0,0,0,114,170,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,156,0,0,0,72,3,0,0,115,2,0,0,0,0, - 7,122,26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, - 1,161,1,83,0,41,1,122,45,82,101,116,117,114,110,32, - 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, - 102,111,114,32,116,104,101,32,102,114,111,122,101,110,32,109, - 111,100,117,108,101,46,41,2,114,58,0,0,0,114,177,0, - 0,0,114,170,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,171,0,0,0,81,3,0,0,115, - 2,0,0,0,0,4,122,23,70,114,111,122,101,110,73,109, + 67,0,0,0,115,10,0,0,0,116,0,160,1,124,1,161, + 1,83,0,41,1,122,45,82,101,116,117,114,110,32,116,104, + 101,32,99,111,100,101,32,111,98,106,101,99,116,32,102,111, + 114,32,116,104,101,32,102,114,111,122,101,110,32,109,111,100, + 117,108,101,46,41,2,114,58,0,0,0,114,177,0,0,0, + 114,170,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,171,0,0,0,81,3,0,0,115,4,0, + 0,0,10,4,255,128,122,23,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,0,0,0,0,2,0,0,0, 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, @@ -1283,213 +1294,215 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, 111,117,114,99,101,32,99,111,100,101,46,78,114,10,0,0, 0,114,170,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,172,0,0,0,87,3,0,0,115,2, - 0,0,0,0,4,122,25,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,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, - 160,1,124,1,161,1,83,0,41,1,122,46,82,101,116,117, - 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,102, - 114,111,122,101,110,32,109,111,100,117,108,101,32,105,115,32, - 97,32,112,97,99,107,97,103,101,46,41,2,114,58,0,0, - 0,90,17,105,115,95,102,114,111,122,101,110,95,112,97,99, - 107,97,103,101,114,170,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,116,0,0,0,93,3,0, - 0,115,2,0,0,0,0,4,122,25,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,41,2,78,78,41,1,78,41,17,114,1,0,0, - 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, - 114,139,0,0,0,114,173,0,0,0,114,100,0,0,0,114, - 174,0,0,0,114,168,0,0,0,114,169,0,0,0,114,150, - 0,0,0,114,151,0,0,0,114,156,0,0,0,114,91,0, - 0,0,114,171,0,0,0,114,172,0,0,0,114,116,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,175,0,0,0,23,3,0,0,115,46, - 0,0,0,8,2,4,7,4,2,2,1,10,8,2,1,12, - 6,2,1,12,8,2,1,10,3,2,1,10,8,2,1,10, - 8,2,1,2,1,12,4,2,1,2,1,12,4,2,1,2, - 1,114,175,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, - 32,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,83,0,41,7,218,18,95,73,109,112,111,114,116,76, - 111,99,107,67,111,110,116,101,120,116,122,36,67,111,110,116, - 101,120,116,32,109,97,110,97,103,101,114,32,102,111,114,32, - 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,2,0,0,0,67,0,0,0,115,12,0,0,0,116,0, - 160,1,161,0,1,0,100,1,83,0,41,2,122,24,65,99, - 113,117,105,114,101,32,116,104,101,32,105,109,112,111,114,116, - 32,108,111,99,107,46,78,41,2,114,58,0,0,0,114,59, - 0,0,0,114,48,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,55,0,0,0,106,3,0,0, - 115,2,0,0,0,0,2,122,28,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,0,0, - 0,0,4,0,0,0,2,0,0,0,67,0,0,0,115,12, - 0,0,0,116,0,160,1,161,0,1,0,100,1,83,0,41, - 2,122,60,82,101,108,101,97,115,101,32,116,104,101,32,105, - 109,112,111,114,116,32,108,111,99,107,32,114,101,103,97,114, - 100,108,101,115,115,32,111,102,32,97,110,121,32,114,97,105, - 115,101,100,32,101,120,99,101,112,116,105,111,110,115,46,78, - 41,2,114,58,0,0,0,114,61,0,0,0,41,4,114,30, - 0,0,0,218,8,101,120,99,95,116,121,112,101,218,9,101, - 120,99,95,118,97,108,117,101,218,13,101,120,99,95,116,114, - 97,99,101,98,97,99,107,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,57,0,0,0,110,3,0,0,115, - 2,0,0,0,0,2,122,27,95,73,109,112,111,114,116,76, + 114,11,0,0,0,114,172,0,0,0,87,3,0,0,115,4, + 0,0,0,4,4,255,128,122,25,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,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0, + 116,0,160,1,124,1,161,1,83,0,41,1,122,46,82,101, + 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101, + 32,102,114,111,122,101,110,32,109,111,100,117,108,101,32,105, + 115,32,97,32,112,97,99,107,97,103,101,46,41,2,114,58, + 0,0,0,90,17,105,115,95,102,114,111,122,101,110,95,112, + 97,99,107,97,103,101,114,170,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,116,0,0,0,93, + 3,0,0,115,4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17, + 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, + 3,0,0,0,114,139,0,0,0,114,173,0,0,0,114,100, + 0,0,0,114,174,0,0,0,114,168,0,0,0,114,169,0, + 0,0,114,150,0,0,0,114,151,0,0,0,114,156,0,0, + 0,114,91,0,0,0,114,171,0,0,0,114,172,0,0,0, + 114,116,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,175,0,0,0,23,3, + 0,0,115,50,0,0,0,8,0,4,2,4,7,2,2,10, + 1,2,8,12,1,2,6,12,1,2,8,10,1,2,3,10, + 1,2,8,10,1,2,8,2,1,12,1,2,4,2,1,12, + 1,2,4,2,1,16,1,255,128,114,175,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,64,0,0,0,115,32,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,100,6,83,0,41,7,218,18, + 95,73,109,112,111,114,116,76,111,99,107,67,111,110,116,101, + 120,116,122,36,67,111,110,116,101,120,116,32,109,97,110,97, + 103,101,114,32,102,111,114,32,116,104,101,32,105,109,112,111, + 114,116,32,108,111,99,107,46,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,0, + 0,115,12,0,0,0,116,0,160,1,161,0,1,0,100,1, + 83,0,41,2,122,24,65,99,113,117,105,114,101,32,116,104, + 101,32,105,109,112,111,114,116,32,108,111,99,107,46,78,41, + 2,114,58,0,0,0,114,59,0,0,0,114,48,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 55,0,0,0,106,3,0,0,115,6,0,0,0,8,2,4, + 128,255,128,122,28,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,0,0,0,0,4,0, + 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,160,1,161,0,1,0,100,1,83,0,41,2,122,60,82, + 101,108,101,97,115,101,32,116,104,101,32,105,109,112,111,114, + 116,32,108,111,99,107,32,114,101,103,97,114,100,108,101,115, + 115,32,111,102,32,97,110,121,32,114,97,105,115,101,100,32, + 101,120,99,101,112,116,105,111,110,115,46,78,41,2,114,58, + 0,0,0,114,61,0,0,0,41,4,114,30,0,0,0,218, + 8,101,120,99,95,116,121,112,101,218,9,101,120,99,95,118, + 97,108,117,101,218,13,101,120,99,95,116,114,97,99,101,98, + 97,99,107,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,57,0,0,0,110,3,0,0,115,6,0,0,0, + 8,2,4,128,255,128,122,27,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,41,6,114,1,0,0,0,114,0,0,0,0, 114,2,0,0,0,114,3,0,0,0,114,55,0,0,0,114, 57,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, 0,0,0,114,11,0,0,0,114,180,0,0,0,102,3,0, - 0,115,6,0,0,0,8,2,4,2,8,4,114,180,0,0, - 0,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,5,0,0,0,67,0,0,0,115,64,0,0,0,124, - 1,160,0,100,1,124,2,100,2,24,0,161,2,125,3,116, - 1,124,3,131,1,124,2,107,0,114,36,116,2,100,3,131, - 1,130,1,124,3,100,4,25,0,125,4,124,0,114,60,100, - 5,160,3,124,4,124,0,161,2,83,0,124,4,83,0,41, - 6,122,50,82,101,115,111,108,118,101,32,97,32,114,101,108, - 97,116,105,118,101,32,109,111,100,117,108,101,32,110,97,109, - 101,32,116,111,32,97,110,32,97,98,115,111,108,117,116,101, - 32,111,110,101,46,114,129,0,0,0,114,39,0,0,0,122, - 50,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, - 105,118,101,32,105,109,112,111,114,116,32,98,101,121,111,110, - 100,32,116,111,112,45,108,101,118,101,108,32,112,97,99,107, - 97,103,101,114,22,0,0,0,250,5,123,125,46,123,125,41, - 4,218,6,114,115,112,108,105,116,218,3,108,101,110,114,80, - 0,0,0,114,46,0,0,0,41,5,114,17,0,0,0,218, - 7,112,97,99,107,97,103,101,218,5,108,101,118,101,108,90, - 4,98,105,116,115,90,4,98,97,115,101,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,13,95,114,101,115, - 111,108,118,101,95,110,97,109,101,115,3,0,0,115,10,0, - 0,0,0,2,16,1,12,1,8,1,8,1,114,189,0,0, - 0,99,3,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,4,0,0,0,67,0,0,0,115,34,0,0,0,124, - 0,160,0,124,1,124,2,161,2,125,3,124,3,100,0,117, - 0,114,24,100,0,83,0,116,1,124,1,124,3,131,2,83, - 0,114,13,0,0,0,41,2,114,169,0,0,0,114,92,0, - 0,0,41,4,218,6,102,105,110,100,101,114,114,17,0,0, - 0,114,166,0,0,0,114,110,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,17,95,102,105,110, - 100,95,115,112,101,99,95,108,101,103,97,99,121,124,3,0, - 0,115,8,0,0,0,0,3,12,1,8,1,4,1,114,191, - 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 10,0,0,0,10,0,0,0,67,0,0,0,115,28,1,0, - 0,116,0,106,1,125,3,124,3,100,1,117,0,114,22,116, - 2,100,2,131,1,130,1,124,3,115,38,116,3,160,4,100, - 3,116,5,161,2,1,0,124,0,116,0,106,6,118,0,125, - 4,124,3,68,0,93,226,125,5,116,7,131,0,143,94,1, - 0,122,10,124,5,106,8,125,6,87,0,110,54,4,0,116, - 9,121,128,1,0,1,0,1,0,116,10,124,5,124,0,124, - 1,131,3,125,7,124,7,100,1,117,0,114,124,89,0,87, - 0,100,1,4,0,4,0,131,3,1,0,113,52,89,0,110, - 14,48,0,124,6,124,0,124,1,124,2,131,3,125,7,87, - 0,100,1,4,0,4,0,131,3,1,0,110,16,49,0,115, - 162,48,0,1,0,1,0,1,0,89,0,1,0,124,7,100, - 1,117,1,114,52,124,4,144,1,115,16,124,0,116,0,106, - 6,118,0,144,1,114,16,116,0,106,6,124,0,25,0,125, - 8,122,10,124,8,106,11,125,9,87,0,110,26,4,0,116, - 9,121,244,1,0,1,0,1,0,124,7,6,0,89,0,2, - 0,1,0,83,0,48,0,124,9,100,1,117,0,144,1,114, - 8,124,7,2,0,1,0,83,0,124,9,2,0,1,0,83, - 0,124,7,2,0,1,0,83,0,100,1,83,0,41,4,122, - 21,70,105,110,100,32,97,32,109,111,100,117,108,101,39,115, - 32,115,112,101,99,46,78,122,53,115,121,115,46,109,101,116, - 97,95,112,97,116,104,32,105,115,32,78,111,110,101,44,32, - 80,121,116,104,111,110,32,105,115,32,108,105,107,101,108,121, - 32,115,104,117,116,116,105,110,103,32,100,111,119,110,122,22, - 115,121,115,46,109,101,116,97,95,112,97,116,104,32,105,115, - 32,101,109,112,116,121,41,12,114,15,0,0,0,218,9,109, - 101,116,97,95,112,97,116,104,114,80,0,0,0,218,9,95, - 119,97,114,110,105,110,103,115,218,4,119,97,114,110,218,13, - 73,109,112,111,114,116,87,97,114,110,105,110,103,114,93,0, - 0,0,114,180,0,0,0,114,168,0,0,0,114,107,0,0, - 0,114,191,0,0,0,114,106,0,0,0,41,10,114,17,0, - 0,0,114,166,0,0,0,114,167,0,0,0,114,192,0,0, - 0,90,9,105,115,95,114,101,108,111,97,100,114,190,0,0, - 0,114,168,0,0,0,114,96,0,0,0,114,97,0,0,0, - 114,106,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,10,95,102,105,110,100,95,115,112,101,99, - 133,3,0,0,115,54,0,0,0,0,2,6,1,8,2,8, - 3,4,1,12,5,10,1,8,1,8,1,2,1,10,1,12, - 1,12,1,8,1,22,2,42,1,8,2,18,1,10,1,2, - 1,10,1,12,4,14,2,10,1,8,2,8,2,8,2,114, - 196,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,5,0,0,0,67,0,0,0,115,108,0, - 0,0,116,0,124,0,116,1,131,2,115,28,116,2,100,1, - 160,3,116,4,124,0,131,1,161,1,131,1,130,1,124,2, - 100,2,107,0,114,44,116,5,100,3,131,1,130,1,124,2, - 100,2,107,4,114,84,116,0,124,1,116,1,131,2,115,72, - 116,2,100,4,131,1,130,1,110,12,124,1,115,84,116,6, - 100,5,131,1,130,1,124,0,115,104,124,2,100,2,107,2, - 114,104,116,5,100,6,131,1,130,1,100,7,83,0,41,8, - 122,28,86,101,114,105,102,121,32,97,114,103,117,109,101,110, - 116,115,32,97,114,101,32,34,115,97,110,101,34,46,122,31, - 109,111,100,117,108,101,32,110,97,109,101,32,109,117,115,116, - 32,98,101,32,115,116,114,44,32,110,111,116,32,123,125,114, - 22,0,0,0,122,18,108,101,118,101,108,32,109,117,115,116, - 32,98,101,32,62,61,32,48,122,31,95,95,112,97,99,107, - 97,103,101,95,95,32,110,111,116,32,115,101,116,32,116,111, - 32,97,32,115,116,114,105,110,103,122,54,97,116,116,101,109, - 112,116,101,100,32,114,101,108,97,116,105,118,101,32,105,109, - 112,111,114,116,32,119,105,116,104,32,110,111,32,107,110,111, - 119,110,32,112,97,114,101,110,116,32,112,97,99,107,97,103, - 101,122,17,69,109,112,116,121,32,109,111,100,117,108,101,32, - 110,97,109,101,78,41,7,218,10,105,115,105,110,115,116,97, - 110,99,101,218,3,115,116,114,218,9,84,121,112,101,69,114, - 114,111,114,114,46,0,0,0,114,14,0,0,0,218,10,86, - 97,108,117,101,69,114,114,111,114,114,80,0,0,0,169,3, - 114,17,0,0,0,114,187,0,0,0,114,188,0,0,0,114, + 0,115,10,0,0,0,8,0,4,2,8,2,12,4,255,128, + 114,180,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,64, + 0,0,0,124,1,160,0,100,1,124,2,100,2,24,0,161, + 2,125,3,116,1,124,3,131,1,124,2,107,0,114,36,116, + 2,100,3,131,1,130,1,124,3,100,4,25,0,125,4,124, + 0,114,60,100,5,160,3,124,4,124,0,161,2,83,0,124, + 4,83,0,41,6,122,50,82,101,115,111,108,118,101,32,97, + 32,114,101,108,97,116,105,118,101,32,109,111,100,117,108,101, + 32,110,97,109,101,32,116,111,32,97,110,32,97,98,115,111, + 108,117,116,101,32,111,110,101,46,114,129,0,0,0,114,39, + 0,0,0,122,50,97,116,116,101,109,112,116,101,100,32,114, + 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,98, + 101,121,111,110,100,32,116,111,112,45,108,101,118,101,108,32, + 112,97,99,107,97,103,101,114,22,0,0,0,250,5,123,125, + 46,123,125,41,4,218,6,114,115,112,108,105,116,218,3,108, + 101,110,114,80,0,0,0,114,46,0,0,0,41,5,114,17, + 0,0,0,218,7,112,97,99,107,97,103,101,218,5,108,101, + 118,101,108,90,4,98,105,116,115,90,4,98,97,115,101,114, 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,13, - 95,115,97,110,105,116,121,95,99,104,101,99,107,180,3,0, - 0,115,22,0,0,0,0,2,10,1,18,1,8,1,8,1, - 8,1,10,1,10,1,4,1,8,2,12,1,114,202,0,0, - 0,122,16,78,111,32,109,111,100,117,108,101,32,110,97,109, - 101,100,32,122,4,123,33,114,125,99,2,0,0,0,0,0, - 0,0,0,0,0,0,9,0,0,0,8,0,0,0,67,0, - 0,0,115,22,1,0,0,100,0,125,2,124,0,160,0,100, - 1,161,1,100,2,25,0,125,3,124,3,114,132,124,3,116, - 1,106,2,118,1,114,42,116,3,124,1,124,3,131,2,1, - 0,124,0,116,1,106,2,118,0,114,62,116,1,106,2,124, - 0,25,0,83,0,116,1,106,2,124,3,25,0,125,4,122, - 10,124,4,106,4,125,2,87,0,110,48,4,0,116,5,121, - 130,1,0,1,0,1,0,116,6,100,3,23,0,160,7,124, - 0,124,3,161,2,125,5,116,8,124,5,124,0,100,4,141, - 2,100,0,130,2,89,0,110,2,48,0,116,9,124,0,124, - 2,131,2,125,6,124,6,100,0,117,0,114,170,116,8,116, - 6,160,7,124,0,161,1,124,0,100,4,141,2,130,1,110, - 8,116,10,124,6,131,1,125,7,124,3,144,1,114,18,116, - 1,106,2,124,3,25,0,125,4,124,0,160,0,100,1,161, - 1,100,5,25,0,125,8,122,16,116,11,124,4,124,8,124, - 7,131,3,1,0,87,0,110,48,4,0,116,5,144,1,121, - 16,1,0,1,0,1,0,100,6,124,3,155,2,100,7,124, - 8,155,2,157,4,125,5,116,12,160,13,124,5,116,14,161, - 2,1,0,89,0,110,2,48,0,124,7,83,0,41,8,78, - 114,129,0,0,0,114,22,0,0,0,122,23,59,32,123,33, - 114,125,32,105,115,32,110,111,116,32,97,32,112,97,99,107, - 97,103,101,114,16,0,0,0,233,2,0,0,0,122,27,67, - 97,110,110,111,116,32,115,101,116,32,97,110,32,97,116,116, - 114,105,98,117,116,101,32,111,110,32,122,18,32,102,111,114, - 32,99,104,105,108,100,32,109,111,100,117,108,101,32,41,15, - 114,130,0,0,0,114,15,0,0,0,114,93,0,0,0,114, - 68,0,0,0,114,142,0,0,0,114,107,0,0,0,218,8, - 95,69,82,82,95,77,83,71,114,46,0,0,0,218,19,77, - 111,100,117,108,101,78,111,116,70,111,117,110,100,69,114,114, - 111,114,114,196,0,0,0,114,160,0,0,0,114,5,0,0, - 0,114,193,0,0,0,114,194,0,0,0,114,195,0,0,0, - 41,9,114,17,0,0,0,218,7,105,109,112,111,114,116,95, - 114,166,0,0,0,114,131,0,0,0,90,13,112,97,114,101, - 110,116,95,109,111,100,117,108,101,114,158,0,0,0,114,96, - 0,0,0,114,97,0,0,0,90,5,99,104,105,108,100,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,23, - 95,102,105,110,100,95,97,110,100,95,108,111,97,100,95,117, - 110,108,111,99,107,101,100,199,3,0,0,115,52,0,0,0, - 0,1,4,1,14,1,4,1,10,1,10,2,10,1,10,1, - 10,1,2,1,10,1,12,1,16,1,20,1,10,1,8,1, - 20,2,8,1,6,2,10,1,14,1,2,1,16,1,14,1, - 16,1,18,1,114,207,0,0,0,99,2,0,0,0,0,0, + 95,114,101,115,111,108,118,101,95,110,97,109,101,115,3,0, + 0,115,12,0,0,0,16,2,12,1,8,1,8,1,20,1, + 255,128,114,189,0,0,0,99,3,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,34,0,0,0,124,0,160,0,124,1,124,2,161,2,125, + 3,124,3,100,0,117,0,114,24,100,0,83,0,116,1,124, + 1,124,3,131,2,83,0,114,13,0,0,0,41,2,114,169, + 0,0,0,114,92,0,0,0,41,4,218,6,102,105,110,100, + 101,114,114,17,0,0,0,114,166,0,0,0,114,110,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,17,95,102,105,110,100,95,115,112,101,99,95,108,101,103, + 97,99,121,124,3,0,0,115,10,0,0,0,12,3,8,1, + 4,1,10,1,255,128,114,191,0,0,0,99,3,0,0,0, + 0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,0, + 67,0,0,0,115,28,1,0,0,116,0,106,1,125,3,124, + 3,100,1,117,0,114,22,116,2,100,2,131,1,130,1,124, + 3,115,38,116,3,160,4,100,3,116,5,161,2,1,0,124, + 0,116,0,106,6,118,0,125,4,124,3,68,0,93,226,125, + 5,116,7,131,0,143,94,1,0,122,10,124,5,106,8,125, + 6,87,0,110,54,4,0,116,9,121,128,1,0,1,0,1, + 0,116,10,124,5,124,0,124,1,131,3,125,7,124,7,100, + 1,117,0,114,124,89,0,87,0,100,1,4,0,4,0,131, + 3,1,0,113,52,89,0,110,14,48,0,124,6,124,0,124, + 1,124,2,131,3,125,7,87,0,100,1,4,0,4,0,131, + 3,1,0,110,16,49,0,115,162,48,0,1,0,1,0,1, + 0,89,0,1,0,124,7,100,1,117,1,114,52,124,4,144, + 1,115,16,124,0,116,0,106,6,118,0,144,1,114,16,116, + 0,106,6,124,0,25,0,125,8,122,10,124,8,106,11,125, + 9,87,0,110,26,4,0,116,9,121,244,1,0,1,0,1, + 0,124,7,6,0,89,0,2,0,1,0,83,0,48,0,124, + 9,100,1,117,0,144,1,114,8,124,7,2,0,1,0,83, + 0,124,9,2,0,1,0,83,0,124,7,2,0,1,0,83, + 0,100,1,83,0,41,4,122,21,70,105,110,100,32,97,32, + 109,111,100,117,108,101,39,115,32,115,112,101,99,46,78,122, + 53,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, + 115,32,78,111,110,101,44,32,80,121,116,104,111,110,32,105, + 115,32,108,105,107,101,108,121,32,115,104,117,116,116,105,110, + 103,32,100,111,119,110,122,22,115,121,115,46,109,101,116,97, + 95,112,97,116,104,32,105,115,32,101,109,112,116,121,41,12, + 114,15,0,0,0,218,9,109,101,116,97,95,112,97,116,104, + 114,80,0,0,0,218,9,95,119,97,114,110,105,110,103,115, + 218,4,119,97,114,110,218,13,73,109,112,111,114,116,87,97, + 114,110,105,110,103,114,93,0,0,0,114,180,0,0,0,114, + 168,0,0,0,114,107,0,0,0,114,191,0,0,0,114,106, + 0,0,0,41,10,114,17,0,0,0,114,166,0,0,0,114, + 167,0,0,0,114,192,0,0,0,90,9,105,115,95,114,101, + 108,111,97,100,114,190,0,0,0,114,168,0,0,0,114,96, + 0,0,0,114,97,0,0,0,114,106,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,10,95,102, + 105,110,100,95,115,112,101,99,133,3,0,0,115,56,0,0, + 0,6,2,8,1,8,2,4,3,12,1,10,5,8,1,8, + 1,2,1,10,1,12,1,12,1,8,1,22,1,42,2,8, + 1,18,2,10,1,2,1,10,1,12,1,14,4,10,2,8, + 1,8,2,8,2,4,2,255,128,114,196,0,0,0,99,3, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, + 0,0,0,67,0,0,0,115,108,0,0,0,116,0,124,0, + 116,1,131,2,115,28,116,2,100,1,160,3,116,4,124,0, + 131,1,161,1,131,1,130,1,124,2,100,2,107,0,114,44, + 116,5,100,3,131,1,130,1,124,2,100,2,107,4,114,84, + 116,0,124,1,116,1,131,2,115,72,116,2,100,4,131,1, + 130,1,110,12,124,1,115,84,116,6,100,5,131,1,130,1, + 124,0,115,104,124,2,100,2,107,2,114,104,116,5,100,6, + 131,1,130,1,100,7,83,0,41,8,122,28,86,101,114,105, + 102,121,32,97,114,103,117,109,101,110,116,115,32,97,114,101, + 32,34,115,97,110,101,34,46,122,31,109,111,100,117,108,101, + 32,110,97,109,101,32,109,117,115,116,32,98,101,32,115,116, + 114,44,32,110,111,116,32,123,125,114,22,0,0,0,122,18, + 108,101,118,101,108,32,109,117,115,116,32,98,101,32,62,61, + 32,48,122,31,95,95,112,97,99,107,97,103,101,95,95,32, + 110,111,116,32,115,101,116,32,116,111,32,97,32,115,116,114, + 105,110,103,122,54,97,116,116,101,109,112,116,101,100,32,114, + 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,119, + 105,116,104,32,110,111,32,107,110,111,119,110,32,112,97,114, + 101,110,116,32,112,97,99,107,97,103,101,122,17,69,109,112, + 116,121,32,109,111,100,117,108,101,32,110,97,109,101,78,41, + 7,218,10,105,115,105,110,115,116,97,110,99,101,218,3,115, + 116,114,218,9,84,121,112,101,69,114,114,111,114,114,46,0, + 0,0,114,14,0,0,0,218,10,86,97,108,117,101,69,114, + 114,111,114,114,80,0,0,0,169,3,114,17,0,0,0,114, + 187,0,0,0,114,188,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,13,95,115,97,110,105,116, + 121,95,99,104,101,99,107,180,3,0,0,115,26,0,0,0, + 10,2,18,1,8,1,8,1,8,1,10,1,10,1,4,1, + 8,1,12,2,8,1,4,128,255,128,114,202,0,0,0,122, + 16,78,111,32,109,111,100,117,108,101,32,110,97,109,101,100, + 32,122,4,123,33,114,125,99,2,0,0,0,0,0,0,0, + 0,0,0,0,9,0,0,0,8,0,0,0,67,0,0,0, + 115,22,1,0,0,100,0,125,2,124,0,160,0,100,1,161, + 1,100,2,25,0,125,3,124,3,114,132,124,3,116,1,106, + 2,118,1,114,42,116,3,124,1,124,3,131,2,1,0,124, + 0,116,1,106,2,118,0,114,62,116,1,106,2,124,0,25, + 0,83,0,116,1,106,2,124,3,25,0,125,4,122,10,124, + 4,106,4,125,2,87,0,110,48,4,0,116,5,121,130,1, + 0,1,0,1,0,116,6,100,3,23,0,160,7,124,0,124, + 3,161,2,125,5,116,8,124,5,124,0,100,4,141,2,100, + 0,130,2,89,0,110,2,48,0,116,9,124,0,124,2,131, + 2,125,6,124,6,100,0,117,0,114,170,116,8,116,6,160, + 7,124,0,161,1,124,0,100,4,141,2,130,1,110,8,116, + 10,124,6,131,1,125,7,124,3,144,1,114,18,116,1,106, + 2,124,3,25,0,125,4,124,0,160,0,100,1,161,1,100, + 5,25,0,125,8,122,16,116,11,124,4,124,8,124,7,131, + 3,1,0,87,0,110,48,4,0,116,5,144,1,121,16,1, + 0,1,0,1,0,100,6,124,3,155,2,100,7,124,8,155, + 2,157,4,125,5,116,12,160,13,124,5,116,14,161,2,1, + 0,89,0,110,2,48,0,124,7,83,0,41,8,78,114,129, + 0,0,0,114,22,0,0,0,122,23,59,32,123,33,114,125, + 32,105,115,32,110,111,116,32,97,32,112,97,99,107,97,103, + 101,114,16,0,0,0,233,2,0,0,0,122,27,67,97,110, + 110,111,116,32,115,101,116,32,97,110,32,97,116,116,114,105, + 98,117,116,101,32,111,110,32,122,18,32,102,111,114,32,99, + 104,105,108,100,32,109,111,100,117,108,101,32,41,15,114,130, + 0,0,0,114,15,0,0,0,114,93,0,0,0,114,68,0, + 0,0,114,142,0,0,0,114,107,0,0,0,218,8,95,69, + 82,82,95,77,83,71,114,46,0,0,0,218,19,77,111,100, + 117,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, + 114,196,0,0,0,114,160,0,0,0,114,5,0,0,0,114, + 193,0,0,0,114,194,0,0,0,114,195,0,0,0,41,9, + 114,17,0,0,0,218,7,105,109,112,111,114,116,95,114,166, + 0,0,0,114,131,0,0,0,90,13,112,97,114,101,110,116, + 95,109,111,100,117,108,101,114,158,0,0,0,114,96,0,0, + 0,114,97,0,0,0,90,5,99,104,105,108,100,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,23,95,102, + 105,110,100,95,97,110,100,95,108,111,97,100,95,117,110,108, + 111,99,107,101,100,199,3,0,0,115,54,0,0,0,4,1, + 14,1,4,1,10,1,10,1,10,2,10,1,10,1,2,1, + 10,1,12,1,16,1,20,1,10,1,8,1,20,1,8,2, + 6,1,10,2,14,1,2,1,16,1,14,1,16,1,18,1, + 4,1,255,128,114,207,0,0,0,99,2,0,0,0,0,0, 0,0,0,0,0,0,4,0,0,0,8,0,0,0,67,0, 0,0,115,128,0,0,0,116,0,124,0,131,1,143,62,1, 0,116,1,106,2,160,3,124,0,116,4,161,2,125,2,124, @@ -1511,298 +1524,300 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 114,17,0,0,0,114,206,0,0,0,114,97,0,0,0,114, 76,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, 0,0,0,218,14,95,102,105,110,100,95,97,110,100,95,108, - 111,97,100,234,3,0,0,115,22,0,0,0,0,2,10,1, - 14,1,8,1,54,2,8,1,4,1,2,255,4,2,12,2, - 8,1,114,209,0,0,0,114,22,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, - 0,67,0,0,0,115,42,0,0,0,116,0,124,0,124,1, - 124,2,131,3,1,0,124,2,100,1,107,4,114,32,116,1, - 124,0,124,1,124,2,131,3,125,0,116,2,124,0,116,3, - 131,2,83,0,41,2,97,50,1,0,0,73,109,112,111,114, - 116,32,97,110,100,32,114,101,116,117,114,110,32,116,104,101, - 32,109,111,100,117,108,101,32,98,97,115,101,100,32,111,110, - 32,105,116,115,32,110,97,109,101,44,32,116,104,101,32,112, - 97,99,107,97,103,101,32,116,104,101,32,99,97,108,108,32, - 105,115,10,32,32,32,32,98,101,105,110,103,32,109,97,100, - 101,32,102,114,111,109,44,32,97,110,100,32,116,104,101,32, - 108,101,118,101,108,32,97,100,106,117,115,116,109,101,110,116, - 46,10,10,32,32,32,32,84,104,105,115,32,102,117,110,99, - 116,105,111,110,32,114,101,112,114,101,115,101,110,116,115,32, - 116,104,101,32,103,114,101,97,116,101,115,116,32,99,111,109, - 109,111,110,32,100,101,110,111,109,105,110,97,116,111,114,32, - 111,102,32,102,117,110,99,116,105,111,110,97,108,105,116,121, - 10,32,32,32,32,98,101,116,119,101,101,110,32,105,109,112, - 111,114,116,95,109,111,100,117,108,101,32,97,110,100,32,95, - 95,105,109,112,111,114,116,95,95,46,32,84,104,105,115,32, - 105,110,99,108,117,100,101,115,32,115,101,116,116,105,110,103, - 32,95,95,112,97,99,107,97,103,101,95,95,32,105,102,10, - 32,32,32,32,116,104,101,32,108,111,97,100,101,114,32,100, - 105,100,32,110,111,116,46,10,10,32,32,32,32,114,22,0, - 0,0,41,4,114,202,0,0,0,114,189,0,0,0,114,209, - 0,0,0,218,11,95,103,99,100,95,105,109,112,111,114,116, - 114,201,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,210,0,0,0,250,3,0,0,115,8,0, - 0,0,0,9,12,1,8,1,12,1,114,210,0,0,0,169, - 1,218,9,114,101,99,117,114,115,105,118,101,99,3,0,0, - 0,0,0,0,0,1,0,0,0,8,0,0,0,11,0,0, - 0,67,0,0,0,115,232,0,0,0,124,1,68,0,93,222, - 125,4,116,0,124,4,116,1,131,2,115,66,124,3,114,34, - 124,0,106,2,100,1,23,0,125,5,110,4,100,2,125,5, - 116,3,100,3,124,5,155,0,100,4,116,4,124,4,131,1, - 106,2,155,0,157,4,131,1,130,1,113,4,124,4,100,5, - 107,2,114,108,124,3,115,226,116,5,124,0,100,6,131,2, - 114,226,116,6,124,0,124,0,106,7,124,2,100,7,100,8, - 141,4,1,0,113,4,116,5,124,0,124,4,131,2,115,4, - 100,9,160,8,124,0,106,2,124,4,161,2,125,6,122,14, - 116,9,124,2,124,6,131,2,1,0,87,0,113,4,4,0, - 116,10,121,224,1,0,125,7,1,0,122,54,124,7,106,11, - 124,6,107,2,114,202,116,12,106,13,160,14,124,6,116,15, - 161,2,100,10,117,1,114,202,87,0,89,0,100,10,125,7, - 126,7,113,4,130,0,87,0,89,0,100,10,125,7,126,7, - 113,4,100,10,125,7,126,7,48,0,48,0,113,4,124,0, - 83,0,41,11,122,238,70,105,103,117,114,101,32,111,117,116, - 32,119,104,97,116,32,95,95,105,109,112,111,114,116,95,95, - 32,115,104,111,117,108,100,32,114,101,116,117,114,110,46,10, - 10,32,32,32,32,84,104,101,32,105,109,112,111,114,116,95, - 32,112,97,114,97,109,101,116,101,114,32,105,115,32,97,32, - 99,97,108,108,97,98,108,101,32,119,104,105,99,104,32,116, - 97,107,101,115,32,116,104,101,32,110,97,109,101,32,111,102, - 32,109,111,100,117,108,101,32,116,111,10,32,32,32,32,105, - 109,112,111,114,116,46,32,73,116,32,105,115,32,114,101,113, - 117,105,114,101,100,32,116,111,32,100,101,99,111,117,112,108, - 101,32,116,104,101,32,102,117,110,99,116,105,111,110,32,102, - 114,111,109,32,97,115,115,117,109,105,110,103,32,105,109,112, - 111,114,116,108,105,98,39,115,10,32,32,32,32,105,109,112, - 111,114,116,32,105,109,112,108,101,109,101,110,116,97,116,105, - 111,110,32,105,115,32,100,101,115,105,114,101,100,46,10,10, - 32,32,32,32,122,8,46,95,95,97,108,108,95,95,122,13, - 96,96,102,114,111,109,32,108,105,115,116,39,39,122,8,73, - 116,101,109,32,105,110,32,122,18,32,109,117,115,116,32,98, - 101,32,115,116,114,44,32,110,111,116,32,250,1,42,218,7, - 95,95,97,108,108,95,95,84,114,211,0,0,0,114,184,0, - 0,0,78,41,16,114,197,0,0,0,114,198,0,0,0,114, - 1,0,0,0,114,199,0,0,0,114,14,0,0,0,114,4, - 0,0,0,218,16,95,104,97,110,100,108,101,95,102,114,111, - 109,108,105,115,116,114,214,0,0,0,114,46,0,0,0,114, - 68,0,0,0,114,205,0,0,0,114,17,0,0,0,114,15, - 0,0,0,114,93,0,0,0,114,35,0,0,0,114,208,0, - 0,0,41,8,114,97,0,0,0,218,8,102,114,111,109,108, - 105,115,116,114,206,0,0,0,114,212,0,0,0,218,1,120, - 90,5,119,104,101,114,101,90,9,102,114,111,109,95,110,97, - 109,101,90,3,101,120,99,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,215,0,0,0,9,4,0,0,115, - 48,0,0,0,0,10,8,1,10,1,4,1,12,2,4,1, - 10,1,8,255,10,2,8,1,14,1,10,1,2,255,8,2, - 10,1,14,1,2,1,14,1,14,4,10,1,16,255,2,2, - 12,1,26,1,114,215,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,6,0,0,0,67,0, - 0,0,115,146,0,0,0,124,0,160,0,100,1,161,1,125, - 1,124,0,160,0,100,2,161,1,125,2,124,1,100,3,117, - 1,114,82,124,2,100,3,117,1,114,78,124,1,124,2,106, - 1,107,3,114,78,116,2,106,3,100,4,124,1,155,2,100, - 5,124,2,106,1,155,2,100,6,157,5,116,4,100,7,100, - 8,141,3,1,0,124,1,83,0,124,2,100,3,117,1,114, - 96,124,2,106,1,83,0,116,2,106,3,100,9,116,4,100, - 7,100,8,141,3,1,0,124,0,100,10,25,0,125,1,100, - 11,124,0,118,1,114,142,124,1,160,5,100,12,161,1,100, - 13,25,0,125,1,124,1,83,0,41,14,122,167,67,97,108, - 99,117,108,97,116,101,32,119,104,97,116,32,95,95,112,97, - 99,107,97,103,101,95,95,32,115,104,111,117,108,100,32,98, - 101,46,10,10,32,32,32,32,95,95,112,97,99,107,97,103, - 101,95,95,32,105,115,32,110,111,116,32,103,117,97,114,97, - 110,116,101,101,100,32,116,111,32,98,101,32,100,101,102,105, - 110,101,100,32,111,114,32,99,111,117,108,100,32,98,101,32, - 115,101,116,32,116,111,32,78,111,110,101,10,32,32,32,32, - 116,111,32,114,101,112,114,101,115,101,110,116,32,116,104,97, - 116,32,105,116,115,32,112,114,111,112,101,114,32,118,97,108, - 117,101,32,105,115,32,117,110,107,110,111,119,110,46,10,10, - 32,32,32,32,114,146,0,0,0,114,106,0,0,0,78,122, - 32,95,95,112,97,99,107,97,103,101,95,95,32,33,61,32, - 95,95,115,112,101,99,95,95,46,112,97,114,101,110,116,32, - 40,122,4,32,33,61,32,250,1,41,233,3,0,0,0,41, - 1,90,10,115,116,97,99,107,108,101,118,101,108,122,89,99, - 97,110,39,116,32,114,101,115,111,108,118,101,32,112,97,99, - 107,97,103,101,32,102,114,111,109,32,95,95,115,112,101,99, - 95,95,32,111,114,32,95,95,112,97,99,107,97,103,101,95, - 95,44,32,102,97,108,108,105,110,103,32,98,97,99,107,32, - 111,110,32,95,95,110,97,109,101,95,95,32,97,110,100,32, - 95,95,112,97,116,104,95,95,114,1,0,0,0,114,142,0, - 0,0,114,129,0,0,0,114,22,0,0,0,41,6,114,35, - 0,0,0,114,131,0,0,0,114,193,0,0,0,114,194,0, - 0,0,114,195,0,0,0,114,130,0,0,0,41,3,218,7, - 103,108,111,98,97,108,115,114,187,0,0,0,114,96,0,0, + 111,97,100,234,3,0,0,115,24,0,0,0,10,2,14,1, + 8,1,54,1,8,2,4,1,2,1,4,255,12,2,8,2, + 4,1,255,128,114,209,0,0,0,114,22,0,0,0,99,3, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, + 0,0,0,67,0,0,0,115,42,0,0,0,116,0,124,0, + 124,1,124,2,131,3,1,0,124,2,100,1,107,4,114,32, + 116,1,124,0,124,1,124,2,131,3,125,0,116,2,124,0, + 116,3,131,2,83,0,41,2,97,50,1,0,0,73,109,112, + 111,114,116,32,97,110,100,32,114,101,116,117,114,110,32,116, + 104,101,32,109,111,100,117,108,101,32,98,97,115,101,100,32, + 111,110,32,105,116,115,32,110,97,109,101,44,32,116,104,101, + 32,112,97,99,107,97,103,101,32,116,104,101,32,99,97,108, + 108,32,105,115,10,32,32,32,32,98,101,105,110,103,32,109, + 97,100,101,32,102,114,111,109,44,32,97,110,100,32,116,104, + 101,32,108,101,118,101,108,32,97,100,106,117,115,116,109,101, + 110,116,46,10,10,32,32,32,32,84,104,105,115,32,102,117, + 110,99,116,105,111,110,32,114,101,112,114,101,115,101,110,116, + 115,32,116,104,101,32,103,114,101,97,116,101,115,116,32,99, + 111,109,109,111,110,32,100,101,110,111,109,105,110,97,116,111, + 114,32,111,102,32,102,117,110,99,116,105,111,110,97,108,105, + 116,121,10,32,32,32,32,98,101,116,119,101,101,110,32,105, + 109,112,111,114,116,95,109,111,100,117,108,101,32,97,110,100, + 32,95,95,105,109,112,111,114,116,95,95,46,32,84,104,105, + 115,32,105,110,99,108,117,100,101,115,32,115,101,116,116,105, + 110,103,32,95,95,112,97,99,107,97,103,101,95,95,32,105, + 102,10,32,32,32,32,116,104,101,32,108,111,97,100,101,114, + 32,100,105,100,32,110,111,116,46,10,10,32,32,32,32,114, + 22,0,0,0,41,4,114,202,0,0,0,114,189,0,0,0, + 114,209,0,0,0,218,11,95,103,99,100,95,105,109,112,111, + 114,116,114,201,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,210,0,0,0,250,3,0,0,115, + 10,0,0,0,12,9,8,1,12,1,10,1,255,128,114,210, + 0,0,0,169,1,218,9,114,101,99,117,114,115,105,118,101, + 99,3,0,0,0,0,0,0,0,1,0,0,0,8,0,0, + 0,11,0,0,0,67,0,0,0,115,232,0,0,0,124,1, + 68,0,93,222,125,4,116,0,124,4,116,1,131,2,115,66, + 124,3,114,34,124,0,106,2,100,1,23,0,125,5,110,4, + 100,2,125,5,116,3,100,3,124,5,155,0,100,4,116,4, + 124,4,131,1,106,2,155,0,157,4,131,1,130,1,113,4, + 124,4,100,5,107,2,114,108,124,3,115,226,116,5,124,0, + 100,6,131,2,114,226,116,6,124,0,124,0,106,7,124,2, + 100,7,100,8,141,4,1,0,113,4,116,5,124,0,124,4, + 131,2,115,4,100,9,160,8,124,0,106,2,124,4,161,2, + 125,6,122,14,116,9,124,2,124,6,131,2,1,0,87,0, + 113,4,4,0,116,10,121,224,1,0,125,7,1,0,122,54, + 124,7,106,11,124,6,107,2,114,202,116,12,106,13,160,14, + 124,6,116,15,161,2,100,10,117,1,114,202,87,0,89,0, + 100,10,125,7,126,7,113,4,130,0,87,0,89,0,100,10, + 125,7,126,7,113,4,100,10,125,7,126,7,48,0,48,0, + 113,4,124,0,83,0,41,11,122,238,70,105,103,117,114,101, + 32,111,117,116,32,119,104,97,116,32,95,95,105,109,112,111, + 114,116,95,95,32,115,104,111,117,108,100,32,114,101,116,117, + 114,110,46,10,10,32,32,32,32,84,104,101,32,105,109,112, + 111,114,116,95,32,112,97,114,97,109,101,116,101,114,32,105, + 115,32,97,32,99,97,108,108,97,98,108,101,32,119,104,105, + 99,104,32,116,97,107,101,115,32,116,104,101,32,110,97,109, + 101,32,111,102,32,109,111,100,117,108,101,32,116,111,10,32, + 32,32,32,105,109,112,111,114,116,46,32,73,116,32,105,115, + 32,114,101,113,117,105,114,101,100,32,116,111,32,100,101,99, + 111,117,112,108,101,32,116,104,101,32,102,117,110,99,116,105, + 111,110,32,102,114,111,109,32,97,115,115,117,109,105,110,103, + 32,105,109,112,111,114,116,108,105,98,39,115,10,32,32,32, + 32,105,109,112,111,114,116,32,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,32,105,115,32,100,101,115,105,114,101, + 100,46,10,10,32,32,32,32,122,8,46,95,95,97,108,108, + 95,95,122,13,96,96,102,114,111,109,32,108,105,115,116,39, + 39,122,8,73,116,101,109,32,105,110,32,122,18,32,109,117, + 115,116,32,98,101,32,115,116,114,44,32,110,111,116,32,250, + 1,42,218,7,95,95,97,108,108,95,95,84,114,211,0,0, + 0,114,184,0,0,0,78,41,16,114,197,0,0,0,114,198, + 0,0,0,114,1,0,0,0,114,199,0,0,0,114,14,0, + 0,0,114,4,0,0,0,218,16,95,104,97,110,100,108,101, + 95,102,114,111,109,108,105,115,116,114,214,0,0,0,114,46, + 0,0,0,114,68,0,0,0,114,205,0,0,0,114,17,0, + 0,0,114,15,0,0,0,114,93,0,0,0,114,35,0,0, + 0,114,208,0,0,0,41,8,114,97,0,0,0,218,8,102, + 114,111,109,108,105,115,116,114,206,0,0,0,114,212,0,0, + 0,218,1,120,90,5,119,104,101,114,101,90,9,102,114,111, + 109,95,110,97,109,101,90,3,101,120,99,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,215,0,0,0,9, + 4,0,0,115,52,0,0,0,8,10,10,1,4,1,12,1, + 4,2,10,1,8,1,10,255,8,2,14,1,10,1,2,1, + 8,255,10,2,14,1,2,1,14,1,14,1,10,4,16,1, + 2,255,12,2,6,1,20,128,4,1,255,128,114,215,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,6,0,0,0,67,0,0,0,115,146,0,0,0,124, + 0,160,0,100,1,161,1,125,1,124,0,160,0,100,2,161, + 1,125,2,124,1,100,3,117,1,114,82,124,2,100,3,117, + 1,114,78,124,1,124,2,106,1,107,3,114,78,116,2,106, + 3,100,4,124,1,155,2,100,5,124,2,106,1,155,2,100, + 6,157,5,116,4,100,7,100,8,141,3,1,0,124,1,83, + 0,124,2,100,3,117,1,114,96,124,2,106,1,83,0,116, + 2,106,3,100,9,116,4,100,7,100,8,141,3,1,0,124, + 0,100,10,25,0,125,1,100,11,124,0,118,1,114,142,124, + 1,160,5,100,12,161,1,100,13,25,0,125,1,124,1,83, + 0,41,14,122,167,67,97,108,99,117,108,97,116,101,32,119, + 104,97,116,32,95,95,112,97,99,107,97,103,101,95,95,32, + 115,104,111,117,108,100,32,98,101,46,10,10,32,32,32,32, + 95,95,112,97,99,107,97,103,101,95,95,32,105,115,32,110, + 111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111, + 32,98,101,32,100,101,102,105,110,101,100,32,111,114,32,99, + 111,117,108,100,32,98,101,32,115,101,116,32,116,111,32,78, + 111,110,101,10,32,32,32,32,116,111,32,114,101,112,114,101, + 115,101,110,116,32,116,104,97,116,32,105,116,115,32,112,114, + 111,112,101,114,32,118,97,108,117,101,32,105,115,32,117,110, + 107,110,111,119,110,46,10,10,32,32,32,32,114,146,0,0, + 0,114,106,0,0,0,78,122,32,95,95,112,97,99,107,97, + 103,101,95,95,32,33,61,32,95,95,115,112,101,99,95,95, + 46,112,97,114,101,110,116,32,40,122,4,32,33,61,32,250, + 1,41,233,3,0,0,0,41,1,90,10,115,116,97,99,107, + 108,101,118,101,108,122,89,99,97,110,39,116,32,114,101,115, + 111,108,118,101,32,112,97,99,107,97,103,101,32,102,114,111, + 109,32,95,95,115,112,101,99,95,95,32,111,114,32,95,95, + 112,97,99,107,97,103,101,95,95,44,32,102,97,108,108,105, + 110,103,32,98,97,99,107,32,111,110,32,95,95,110,97,109, + 101,95,95,32,97,110,100,32,95,95,112,97,116,104,95,95, + 114,1,0,0,0,114,142,0,0,0,114,129,0,0,0,114, + 22,0,0,0,41,6,114,35,0,0,0,114,131,0,0,0, + 114,193,0,0,0,114,194,0,0,0,114,195,0,0,0,114, + 130,0,0,0,41,3,218,7,103,108,111,98,97,108,115,114, + 187,0,0,0,114,96,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,17,95,99,97,108,99,95, + 95,95,112,97,99,107,97,103,101,95,95,46,4,0,0,115, + 44,0,0,0,10,7,10,1,8,1,18,1,6,1,2,1, + 4,255,4,1,6,255,4,2,6,254,4,3,8,1,6,1, + 6,2,4,2,6,254,8,3,8,1,14,1,4,1,255,128, + 114,221,0,0,0,114,10,0,0,0,99,5,0,0,0,0, + 0,0,0,0,0,0,0,9,0,0,0,5,0,0,0,67, + 0,0,0,115,174,0,0,0,124,4,100,1,107,2,114,18, + 116,0,124,0,131,1,125,5,110,36,124,1,100,2,117,1, + 114,30,124,1,110,2,105,0,125,6,116,1,124,6,131,1, + 125,7,116,0,124,0,124,7,124,4,131,3,125,5,124,3, + 115,148,124,4,100,1,107,2,114,84,116,0,124,0,160,2, + 100,3,161,1,100,1,25,0,131,1,83,0,124,0,115,92, + 124,5,83,0,116,3,124,0,131,1,116,3,124,0,160,2, + 100,3,161,1,100,1,25,0,131,1,24,0,125,8,116,4, + 106,5,124,5,106,6,100,2,116,3,124,5,106,6,131,1, + 124,8,24,0,133,2,25,0,25,0,83,0,116,7,124,5, + 100,4,131,2,114,170,116,8,124,5,124,3,116,0,131,3, + 83,0,124,5,83,0,41,5,97,215,1,0,0,73,109,112, + 111,114,116,32,97,32,109,111,100,117,108,101,46,10,10,32, + 32,32,32,84,104,101,32,39,103,108,111,98,97,108,115,39, + 32,97,114,103,117,109,101,110,116,32,105,115,32,117,115,101, + 100,32,116,111,32,105,110,102,101,114,32,119,104,101,114,101, + 32,116,104,101,32,105,109,112,111,114,116,32,105,115,32,111, + 99,99,117,114,114,105,110,103,32,102,114,111,109,10,32,32, + 32,32,116,111,32,104,97,110,100,108,101,32,114,101,108,97, + 116,105,118,101,32,105,109,112,111,114,116,115,46,32,84,104, + 101,32,39,108,111,99,97,108,115,39,32,97,114,103,117,109, + 101,110,116,32,105,115,32,105,103,110,111,114,101,100,46,32, + 84,104,101,10,32,32,32,32,39,102,114,111,109,108,105,115, + 116,39,32,97,114,103,117,109,101,110,116,32,115,112,101,99, + 105,102,105,101,115,32,119,104,97,116,32,115,104,111,117,108, + 100,32,101,120,105,115,116,32,97,115,32,97,116,116,114,105, + 98,117,116,101,115,32,111,110,32,116,104,101,32,109,111,100, + 117,108,101,10,32,32,32,32,98,101,105,110,103,32,105,109, + 112,111,114,116,101,100,32,40,101,46,103,46,32,96,96,102, + 114,111,109,32,109,111,100,117,108,101,32,105,109,112,111,114, + 116,32,60,102,114,111,109,108,105,115,116,62,96,96,41,46, + 32,32,84,104,101,32,39,108,101,118,101,108,39,10,32,32, + 32,32,97,114,103,117,109,101,110,116,32,114,101,112,114,101, + 115,101,110,116,115,32,116,104,101,32,112,97,99,107,97,103, + 101,32,108,111,99,97,116,105,111,110,32,116,111,32,105,109, + 112,111,114,116,32,102,114,111,109,32,105,110,32,97,32,114, + 101,108,97,116,105,118,101,10,32,32,32,32,105,109,112,111, + 114,116,32,40,101,46,103,46,32,96,96,102,114,111,109,32, + 46,46,112,107,103,32,105,109,112,111,114,116,32,109,111,100, + 96,96,32,119,111,117,108,100,32,104,97,118,101,32,97,32, + 39,108,101,118,101,108,39,32,111,102,32,50,41,46,10,10, + 32,32,32,32,114,22,0,0,0,78,114,129,0,0,0,114, + 142,0,0,0,41,9,114,210,0,0,0,114,221,0,0,0, + 218,9,112,97,114,116,105,116,105,111,110,114,186,0,0,0, + 114,15,0,0,0,114,93,0,0,0,114,1,0,0,0,114, + 4,0,0,0,114,215,0,0,0,41,9,114,17,0,0,0, + 114,220,0,0,0,218,6,108,111,99,97,108,115,114,216,0, + 0,0,114,188,0,0,0,114,97,0,0,0,90,8,103,108, + 111,98,97,108,115,95,114,187,0,0,0,90,7,99,117,116, + 95,111,102,102,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,10,95,95,105,109,112,111,114,116,95,95,73, + 4,0,0,115,32,0,0,0,8,11,10,1,16,2,8,1, + 12,1,4,1,8,3,18,1,4,1,4,1,26,4,30,3, + 10,1,12,1,4,2,255,128,114,224,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,38,0,0,0,116,0,160,1,124, + 0,161,1,125,1,124,1,100,0,117,0,114,30,116,2,100, + 1,124,0,23,0,131,1,130,1,116,3,124,1,131,1,83, + 0,41,2,78,122,25,110,111,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,32,110,97,109,101,100,32,41, + 4,114,161,0,0,0,114,168,0,0,0,114,80,0,0,0, + 114,160,0,0,0,41,2,114,17,0,0,0,114,96,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,17,95,99,97,108,99,95,95,95,112,97,99,107,97,103, - 101,95,95,46,4,0,0,115,42,0,0,0,0,7,10,1, - 10,1,8,1,18,1,6,1,2,255,4,1,4,255,6,2, - 4,254,6,3,4,1,8,1,6,2,6,2,4,254,6,3, - 8,1,8,1,14,1,114,221,0,0,0,114,10,0,0,0, - 99,5,0,0,0,0,0,0,0,0,0,0,0,9,0,0, - 0,5,0,0,0,67,0,0,0,115,174,0,0,0,124,4, - 100,1,107,2,114,18,116,0,124,0,131,1,125,5,110,36, - 124,1,100,2,117,1,114,30,124,1,110,2,105,0,125,6, - 116,1,124,6,131,1,125,7,116,0,124,0,124,7,124,4, - 131,3,125,5,124,3,115,148,124,4,100,1,107,2,114,84, - 116,0,124,0,160,2,100,3,161,1,100,1,25,0,131,1, - 83,0,124,0,115,92,124,5,83,0,116,3,124,0,131,1, - 116,3,124,0,160,2,100,3,161,1,100,1,25,0,131,1, - 24,0,125,8,116,4,106,5,124,5,106,6,100,2,116,3, - 124,5,106,6,131,1,124,8,24,0,133,2,25,0,25,0, - 83,0,116,7,124,5,100,4,131,2,114,170,116,8,124,5, - 124,3,116,0,131,3,83,0,124,5,83,0,41,5,97,215, - 1,0,0,73,109,112,111,114,116,32,97,32,109,111,100,117, - 108,101,46,10,10,32,32,32,32,84,104,101,32,39,103,108, - 111,98,97,108,115,39,32,97,114,103,117,109,101,110,116,32, - 105,115,32,117,115,101,100,32,116,111,32,105,110,102,101,114, - 32,119,104,101,114,101,32,116,104,101,32,105,109,112,111,114, - 116,32,105,115,32,111,99,99,117,114,114,105,110,103,32,102, - 114,111,109,10,32,32,32,32,116,111,32,104,97,110,100,108, - 101,32,114,101,108,97,116,105,118,101,32,105,109,112,111,114, - 116,115,46,32,84,104,101,32,39,108,111,99,97,108,115,39, - 32,97,114,103,117,109,101,110,116,32,105,115,32,105,103,110, - 111,114,101,100,46,32,84,104,101,10,32,32,32,32,39,102, - 114,111,109,108,105,115,116,39,32,97,114,103,117,109,101,110, - 116,32,115,112,101,99,105,102,105,101,115,32,119,104,97,116, - 32,115,104,111,117,108,100,32,101,120,105,115,116,32,97,115, - 32,97,116,116,114,105,98,117,116,101,115,32,111,110,32,116, - 104,101,32,109,111,100,117,108,101,10,32,32,32,32,98,101, - 105,110,103,32,105,109,112,111,114,116,101,100,32,40,101,46, - 103,46,32,96,96,102,114,111,109,32,109,111,100,117,108,101, - 32,105,109,112,111,114,116,32,60,102,114,111,109,108,105,115, - 116,62,96,96,41,46,32,32,84,104,101,32,39,108,101,118, - 101,108,39,10,32,32,32,32,97,114,103,117,109,101,110,116, - 32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32, - 112,97,99,107,97,103,101,32,108,111,99,97,116,105,111,110, - 32,116,111,32,105,109,112,111,114,116,32,102,114,111,109,32, - 105,110,32,97,32,114,101,108,97,116,105,118,101,10,32,32, - 32,32,105,109,112,111,114,116,32,40,101,46,103,46,32,96, - 96,102,114,111,109,32,46,46,112,107,103,32,105,109,112,111, - 114,116,32,109,111,100,96,96,32,119,111,117,108,100,32,104, - 97,118,101,32,97,32,39,108,101,118,101,108,39,32,111,102, - 32,50,41,46,10,10,32,32,32,32,114,22,0,0,0,78, - 114,129,0,0,0,114,142,0,0,0,41,9,114,210,0,0, - 0,114,221,0,0,0,218,9,112,97,114,116,105,116,105,111, - 110,114,186,0,0,0,114,15,0,0,0,114,93,0,0,0, - 114,1,0,0,0,114,4,0,0,0,114,215,0,0,0,41, - 9,114,17,0,0,0,114,220,0,0,0,218,6,108,111,99, - 97,108,115,114,216,0,0,0,114,188,0,0,0,114,97,0, - 0,0,90,8,103,108,111,98,97,108,115,95,114,187,0,0, - 0,90,7,99,117,116,95,111,102,102,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,10,95,95,105,109,112, - 111,114,116,95,95,73,4,0,0,115,30,0,0,0,0,11, - 8,1,10,2,16,1,8,1,12,1,4,3,8,1,18,1, - 4,1,4,4,26,3,30,1,10,1,12,2,114,224,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,116, - 0,160,1,124,0,161,1,125,1,124,1,100,0,117,0,114, - 30,116,2,100,1,124,0,23,0,131,1,130,1,116,3,124, - 1,131,1,83,0,41,2,78,122,25,110,111,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,32,110,97,109, - 101,100,32,41,4,114,161,0,0,0,114,168,0,0,0,114, - 80,0,0,0,114,160,0,0,0,41,2,114,17,0,0,0, - 114,96,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,18,95,98,117,105,108,116,105,110,95,102, - 114,111,109,95,110,97,109,101,110,4,0,0,115,8,0,0, - 0,0,1,10,1,8,1,12,1,114,225,0,0,0,99,2, - 0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,5, - 0,0,0,67,0,0,0,115,166,0,0,0,124,1,97,0, - 124,0,97,1,116,2,116,1,131,1,125,2,116,1,106,3, - 160,4,161,0,68,0,93,72,92,2,125,3,125,4,116,5, - 124,4,124,2,131,2,114,26,124,3,116,1,106,6,118,0, - 114,60,116,7,125,5,110,18,116,0,160,8,124,3,161,1, - 114,26,116,9,125,5,110,2,113,26,116,10,124,4,124,5, - 131,2,125,6,116,11,124,6,124,4,131,2,1,0,113,26, - 116,1,106,3,116,12,25,0,125,7,100,1,68,0,93,46, - 125,8,124,8,116,1,106,3,118,1,114,138,116,13,124,8, - 131,1,125,9,110,10,116,1,106,3,124,8,25,0,125,9, - 116,14,124,7,124,8,124,9,131,3,1,0,113,114,100,2, - 83,0,41,3,122,250,83,101,116,117,112,32,105,109,112,111, - 114,116,108,105,98,32,98,121,32,105,109,112,111,114,116,105, - 110,103,32,110,101,101,100,101,100,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,32,97,110,100,32,105, - 110,106,101,99,116,105,110,103,32,116,104,101,109,10,32,32, - 32,32,105,110,116,111,32,116,104,101,32,103,108,111,98,97, - 108,32,110,97,109,101,115,112,97,99,101,46,10,10,32,32, - 32,32,65,115,32,115,121,115,32,105,115,32,110,101,101,100, - 101,100,32,102,111,114,32,115,121,115,46,109,111,100,117,108, - 101,115,32,97,99,99,101,115,115,32,97,110,100,32,95,105, - 109,112,32,105,115,32,110,101,101,100,101,100,32,116,111,32, - 108,111,97,100,32,98,117,105,108,116,45,105,110,10,32,32, - 32,32,109,111,100,117,108,101,115,44,32,116,104,111,115,101, - 32,116,119,111,32,109,111,100,117,108,101,115,32,109,117,115, - 116,32,98,101,32,101,120,112,108,105,99,105,116,108,121,32, - 112,97,115,115,101,100,32,105,110,46,10,10,32,32,32,32, - 41,3,114,23,0,0,0,114,193,0,0,0,114,65,0,0, - 0,78,41,15,114,58,0,0,0,114,15,0,0,0,114,14, - 0,0,0,114,93,0,0,0,218,5,105,116,101,109,115,114, - 197,0,0,0,114,79,0,0,0,114,161,0,0,0,114,89, - 0,0,0,114,175,0,0,0,114,143,0,0,0,114,149,0, - 0,0,114,1,0,0,0,114,225,0,0,0,114,5,0,0, - 0,41,10,218,10,115,121,115,95,109,111,100,117,108,101,218, - 11,95,105,109,112,95,109,111,100,117,108,101,90,11,109,111, - 100,117,108,101,95,116,121,112,101,114,17,0,0,0,114,97, - 0,0,0,114,110,0,0,0,114,96,0,0,0,90,11,115, - 101,108,102,95,109,111,100,117,108,101,90,12,98,117,105,108, - 116,105,110,95,110,97,109,101,90,14,98,117,105,108,116,105, - 110,95,109,111,100,117,108,101,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,6,95,115,101,116,117,112,117, - 4,0,0,115,36,0,0,0,0,9,4,1,4,3,8,1, - 18,1,10,1,10,1,6,1,10,1,6,2,2,1,10,1, - 12,3,10,1,8,1,10,1,10,2,10,1,114,229,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,116, - 0,124,0,124,1,131,2,1,0,116,1,106,2,160,3,116, - 4,161,1,1,0,116,1,106,2,160,3,116,5,161,1,1, - 0,100,1,83,0,41,2,122,48,73,110,115,116,97,108,108, - 32,105,109,112,111,114,116,101,114,115,32,102,111,114,32,98, - 117,105,108,116,105,110,32,97,110,100,32,102,114,111,122,101, - 110,32,109,111,100,117,108,101,115,78,41,6,114,229,0,0, - 0,114,15,0,0,0,114,192,0,0,0,114,120,0,0,0, - 114,161,0,0,0,114,175,0,0,0,41,2,114,227,0,0, - 0,114,228,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,8,95,105,110,115,116,97,108,108,152, - 4,0,0,115,6,0,0,0,0,2,10,2,12,1,114,230, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,4,0,0,0,67,0,0,0,115,32,0,0, - 0,100,1,100,2,108,0,125,0,124,0,97,1,124,0,160, - 2,116,3,106,4,116,5,25,0,161,1,1,0,100,2,83, - 0,41,3,122,57,73,110,115,116,97,108,108,32,105,109,112, - 111,114,116,101,114,115,32,116,104,97,116,32,114,101,113,117, - 105,114,101,32,101,120,116,101,114,110,97,108,32,102,105,108, - 101,115,121,115,116,101,109,32,97,99,99,101,115,115,114,22, - 0,0,0,78,41,6,218,26,95,102,114,111,122,101,110,95, - 105,109,112,111,114,116,108,105,98,95,101,120,116,101,114,110, - 97,108,114,127,0,0,0,114,230,0,0,0,114,15,0,0, - 0,114,93,0,0,0,114,1,0,0,0,41,1,114,231,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,27,95,105,110,115,116,97,108,108,95,101,120,116,101, - 114,110,97,108,95,105,109,112,111,114,116,101,114,115,160,4, - 0,0,115,6,0,0,0,0,3,8,1,4,1,114,232,0, - 0,0,41,2,78,78,41,1,78,41,2,78,114,22,0,0, - 0,41,4,78,78,114,10,0,0,0,114,22,0,0,0,41, - 50,114,3,0,0,0,114,127,0,0,0,114,12,0,0,0, - 114,18,0,0,0,114,60,0,0,0,114,34,0,0,0,114, - 44,0,0,0,114,19,0,0,0,114,20,0,0,0,114,50, - 0,0,0,114,51,0,0,0,114,54,0,0,0,114,66,0, - 0,0,114,68,0,0,0,114,77,0,0,0,114,87,0,0, - 0,114,91,0,0,0,114,98,0,0,0,114,112,0,0,0, - 114,113,0,0,0,114,92,0,0,0,114,143,0,0,0,114, - 149,0,0,0,114,153,0,0,0,114,108,0,0,0,114,94, - 0,0,0,114,159,0,0,0,114,160,0,0,0,114,95,0, - 0,0,114,161,0,0,0,114,175,0,0,0,114,180,0,0, - 0,114,189,0,0,0,114,191,0,0,0,114,196,0,0,0, - 114,202,0,0,0,90,15,95,69,82,82,95,77,83,71,95, - 80,82,69,70,73,88,114,204,0,0,0,114,207,0,0,0, - 218,6,111,98,106,101,99,116,114,208,0,0,0,114,209,0, - 0,0,114,210,0,0,0,114,215,0,0,0,114,221,0,0, - 0,114,224,0,0,0,114,225,0,0,0,114,229,0,0,0, - 114,230,0,0,0,114,232,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, - 60,109,111,100,117,108,101,62,1,0,0,0,115,94,0,0, - 0,4,24,4,2,8,8,8,8,4,2,4,3,16,4,14, - 77,14,21,14,16,8,37,8,17,8,11,14,8,8,11,8, - 12,8,16,8,36,14,101,16,26,10,45,14,72,8,17,8, - 17,8,30,8,37,8,42,8,15,14,75,14,79,14,13,8, - 9,8,9,10,47,8,16,4,1,8,2,8,32,6,3,8, - 16,10,15,14,37,8,27,10,37,8,7,8,35,8,8, + 218,18,95,98,117,105,108,116,105,110,95,102,114,111,109,95, + 110,97,109,101,110,4,0,0,115,10,0,0,0,10,1,8, + 1,12,1,8,1,255,128,114,225,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,10,0,0,0,5,0,0, + 0,67,0,0,0,115,166,0,0,0,124,1,97,0,124,0, + 97,1,116,2,116,1,131,1,125,2,116,1,106,3,160,4, + 161,0,68,0,93,72,92,2,125,3,125,4,116,5,124,4, + 124,2,131,2,114,26,124,3,116,1,106,6,118,0,114,60, + 116,7,125,5,110,18,116,0,160,8,124,3,161,1,114,26, + 116,9,125,5,110,2,113,26,116,10,124,4,124,5,131,2, + 125,6,116,11,124,6,124,4,131,2,1,0,113,26,116,1, + 106,3,116,12,25,0,125,7,100,1,68,0,93,46,125,8, + 124,8,116,1,106,3,118,1,114,138,116,13,124,8,131,1, + 125,9,110,10,116,1,106,3,124,8,25,0,125,9,116,14, + 124,7,124,8,124,9,131,3,1,0,113,114,100,2,83,0, + 41,3,122,250,83,101,116,117,112,32,105,109,112,111,114,116, + 108,105,98,32,98,121,32,105,109,112,111,114,116,105,110,103, + 32,110,101,101,100,101,100,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,115,32,97,110,100,32,105,110,106, + 101,99,116,105,110,103,32,116,104,101,109,10,32,32,32,32, + 105,110,116,111,32,116,104,101,32,103,108,111,98,97,108,32, + 110,97,109,101,115,112,97,99,101,46,10,10,32,32,32,32, + 65,115,32,115,121,115,32,105,115,32,110,101,101,100,101,100, + 32,102,111,114,32,115,121,115,46,109,111,100,117,108,101,115, + 32,97,99,99,101,115,115,32,97,110,100,32,95,105,109,112, + 32,105,115,32,110,101,101,100,101,100,32,116,111,32,108,111, + 97,100,32,98,117,105,108,116,45,105,110,10,32,32,32,32, + 109,111,100,117,108,101,115,44,32,116,104,111,115,101,32,116, + 119,111,32,109,111,100,117,108,101,115,32,109,117,115,116,32, + 98,101,32,101,120,112,108,105,99,105,116,108,121,32,112,97, + 115,115,101,100,32,105,110,46,10,10,32,32,32,32,41,3, + 114,23,0,0,0,114,193,0,0,0,114,65,0,0,0,78, + 41,15,114,58,0,0,0,114,15,0,0,0,114,14,0,0, + 0,114,93,0,0,0,218,5,105,116,101,109,115,114,197,0, + 0,0,114,79,0,0,0,114,161,0,0,0,114,89,0,0, + 0,114,175,0,0,0,114,143,0,0,0,114,149,0,0,0, + 114,1,0,0,0,114,225,0,0,0,114,5,0,0,0,41, + 10,218,10,115,121,115,95,109,111,100,117,108,101,218,11,95, + 105,109,112,95,109,111,100,117,108,101,90,11,109,111,100,117, + 108,101,95,116,121,112,101,114,17,0,0,0,114,97,0,0, + 0,114,110,0,0,0,114,96,0,0,0,90,11,115,101,108, + 102,95,109,111,100,117,108,101,90,12,98,117,105,108,116,105, + 110,95,110,97,109,101,90,14,98,117,105,108,116,105,110,95, + 109,111,100,117,108,101,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,6,95,115,101,116,117,112,117,4,0, + 0,115,40,0,0,0,4,9,4,1,8,3,18,1,10,1, + 10,1,6,1,10,1,6,1,2,2,10,1,12,1,10,3, + 8,1,10,1,10,1,10,2,14,1,4,128,255,128,114,229, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, + 0,116,0,124,0,124,1,131,2,1,0,116,1,106,2,160, + 3,116,4,161,1,1,0,116,1,106,2,160,3,116,5,161, + 1,1,0,100,1,83,0,41,2,122,48,73,110,115,116,97, + 108,108,32,105,109,112,111,114,116,101,114,115,32,102,111,114, + 32,98,117,105,108,116,105,110,32,97,110,100,32,102,114,111, + 122,101,110,32,109,111,100,117,108,101,115,78,41,6,114,229, + 0,0,0,114,15,0,0,0,114,192,0,0,0,114,120,0, + 0,0,114,161,0,0,0,114,175,0,0,0,41,2,114,227, + 0,0,0,114,228,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,8,95,105,110,115,116,97,108, + 108,152,4,0,0,115,10,0,0,0,10,2,12,2,12,1, + 4,128,255,128,114,230,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,4,0,0,0,67,0, + 0,0,115,32,0,0,0,100,1,100,2,108,0,125,0,124, + 0,97,1,124,0,160,2,116,3,106,4,116,5,25,0,161, + 1,1,0,100,2,83,0,41,3,122,57,73,110,115,116,97, + 108,108,32,105,109,112,111,114,116,101,114,115,32,116,104,97, + 116,32,114,101,113,117,105,114,101,32,101,120,116,101,114,110, + 97,108,32,102,105,108,101,115,121,115,116,101,109,32,97,99, + 99,101,115,115,114,22,0,0,0,78,41,6,218,26,95,102, + 114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,95, + 101,120,116,101,114,110,97,108,114,127,0,0,0,114,230,0, + 0,0,114,15,0,0,0,114,93,0,0,0,114,1,0,0, + 0,41,1,114,231,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,27,95,105,110,115,116,97,108, + 108,95,101,120,116,101,114,110,97,108,95,105,109,112,111,114, + 116,101,114,115,160,4,0,0,115,10,0,0,0,8,3,4, + 1,16,1,4,128,255,128,114,232,0,0,0,41,2,78,78, + 41,1,78,41,2,78,114,22,0,0,0,41,4,78,78,114, + 10,0,0,0,114,22,0,0,0,41,50,114,3,0,0,0, + 114,127,0,0,0,114,12,0,0,0,114,18,0,0,0,114, + 60,0,0,0,114,34,0,0,0,114,44,0,0,0,114,19, + 0,0,0,114,20,0,0,0,114,50,0,0,0,114,51,0, + 0,0,114,54,0,0,0,114,66,0,0,0,114,68,0,0, + 0,114,77,0,0,0,114,87,0,0,0,114,91,0,0,0, + 114,98,0,0,0,114,112,0,0,0,114,113,0,0,0,114, + 92,0,0,0,114,143,0,0,0,114,149,0,0,0,114,153, + 0,0,0,114,108,0,0,0,114,94,0,0,0,114,159,0, + 0,0,114,160,0,0,0,114,95,0,0,0,114,161,0,0, + 0,114,175,0,0,0,114,180,0,0,0,114,189,0,0,0, + 114,191,0,0,0,114,196,0,0,0,114,202,0,0,0,90, + 15,95,69,82,82,95,77,83,71,95,80,82,69,70,73,88, + 114,204,0,0,0,114,207,0,0,0,218,6,111,98,106,101, + 99,116,114,208,0,0,0,114,209,0,0,0,114,210,0,0, + 0,114,215,0,0,0,114,221,0,0,0,114,224,0,0,0, + 114,225,0,0,0,114,229,0,0,0,114,230,0,0,0,114, + 232,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,8,60,109,111,100,117,108, + 101,62,1,0,0,0,115,100,0,0,0,4,0,4,24,8, + 2,8,8,4,8,4,2,16,3,14,4,14,77,14,21,8, + 16,8,37,8,17,14,11,8,8,8,11,8,12,8,16,14, + 36,16,101,10,26,14,45,8,72,8,17,8,17,8,30,8, + 37,8,42,14,15,14,75,14,79,8,13,8,9,10,9,8, + 47,4,16,8,1,8,2,6,32,8,3,10,16,14,15,8, + 37,10,27,8,37,8,7,8,35,8,8,4,128,255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 6daddb1fb8dfb7..c0042156d9096f 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -84,506 +84,509 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, 111,111,116,115,116,114,97,112,95,101,120,116,101,114,110,97, 108,62,218,11,95,114,101,108,97,120,95,99,97,115,101,36, - 0,0,0,115,2,0,0,0,0,2,122,37,95,109,97,107, - 101,95,114,101,108,97,120,95,99,97,115,101,46,60,108,111, - 99,97,108,115,62,46,95,114,101,108,97,120,95,99,97,115, - 101,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,83,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,53,84,114,117,101,32,105,102,32,102, - 105,108,101,110,97,109,101,115,32,109,117,115,116,32,98,101, - 32,99,104,101,99,107,101,100,32,99,97,115,101,45,105,110, - 115,101,110,115,105,116,105,118,101,108,121,46,70,114,5,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,9,0,0,0,40,0,0,0,115, - 2,0,0,0,0,2,41,5,114,1,0,0,0,218,8,112, - 108,97,116,102,111,114,109,218,10,115,116,97,114,116,115,119, - 105,116,104,218,27,95,67,65,83,69,95,73,78,83,69,78, - 83,73,84,73,86,69,95,80,76,65,84,70,79,82,77,83, - 218,35,95,67,65,83,69,95,73,78,83,69,78,83,73,84, - 73,86,69,95,80,76,65,84,70,79,82,77,83,95,83,84, - 82,95,75,69,89,41,1,114,9,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,8,0,0,0,218,16,95,109,97, - 107,101,95,114,101,108,97,120,95,99,97,115,101,29,0,0, - 0,115,14,0,0,0,0,1,12,1,12,1,6,2,4,2, - 14,4,8,3,114,14,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,4,0,0,0,67,0, - 0,0,115,20,0,0,0,116,0,124,0,131,1,100,1,64, - 0,160,1,100,2,100,3,161,2,83,0,41,4,122,42,67, - 111,110,118,101,114,116,32,97,32,51,50,45,98,105,116,32, - 105,110,116,101,103,101,114,32,116,111,32,108,105,116,116,108, - 101,45,101,110,100,105,97,110,46,236,3,0,0,0,255,127, - 255,127,3,0,233,4,0,0,0,218,6,108,105,116,116,108, - 101,41,2,218,3,105,110,116,218,8,116,111,95,98,121,116, - 101,115,41,1,218,1,120,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,218,12,95,112,97,99,107,95,117,105, - 110,116,51,50,46,0,0,0,115,2,0,0,0,0,2,114, - 21,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,4,0,0,0,67,0,0,0,115,28,0, - 0,0,116,0,124,0,131,1,100,1,107,2,115,16,74,0, - 130,1,116,1,160,2,124,0,100,2,161,2,83,0,41,3, - 122,47,67,111,110,118,101,114,116,32,52,32,98,121,116,101, - 115,32,105,110,32,108,105,116,116,108,101,45,101,110,100,105, - 97,110,32,116,111,32,97,110,32,105,110,116,101,103,101,114, - 46,114,16,0,0,0,114,17,0,0,0,169,3,218,3,108, - 101,110,114,18,0,0,0,218,10,102,114,111,109,95,98,121, - 116,101,115,169,1,218,4,100,97,116,97,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,218,14,95,117,110,112, - 97,99,107,95,117,105,110,116,51,50,51,0,0,0,115,4, - 0,0,0,0,2,16,1,114,27,0,0,0,99,1,0,0, + 0,0,0,115,4,0,0,0,20,2,255,128,122,37,95,109, + 97,107,101,95,114,101,108,97,120,95,99,97,115,101,46,60, + 108,111,99,97,108,115,62,46,95,114,101,108,97,120,95,99, + 97,115,101,99,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,83,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,122,53,84,114,117,101,32,105,102, + 32,102,105,108,101,110,97,109,101,115,32,109,117,115,116,32, + 98,101,32,99,104,101,99,107,101,100,32,99,97,115,101,45, + 105,110,115,101,110,115,105,116,105,118,101,108,121,46,70,114, + 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,9,0,0,0,40,0,0, + 0,115,4,0,0,0,4,2,255,128,41,5,114,1,0,0, + 0,218,8,112,108,97,116,102,111,114,109,218,10,115,116,97, + 114,116,115,119,105,116,104,218,27,95,67,65,83,69,95,73, + 78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70, + 79,82,77,83,218,35,95,67,65,83,69,95,73,78,83,69, + 78,83,73,84,73,86,69,95,80,76,65,84,70,79,82,77, + 83,95,83,84,82,95,75,69,89,41,1,114,9,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,8,0,0,0,218, + 16,95,109,97,107,101,95,114,101,108,97,120,95,99,97,115, + 101,29,0,0,0,115,16,0,0,0,12,1,12,1,6,1, + 4,2,14,2,8,4,4,3,255,128,114,14,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 4,0,0,0,67,0,0,0,115,20,0,0,0,116,0,124, + 0,131,1,100,1,64,0,160,1,100,2,100,3,161,2,83, + 0,41,4,122,42,67,111,110,118,101,114,116,32,97,32,51, + 50,45,98,105,116,32,105,110,116,101,103,101,114,32,116,111, + 32,108,105,116,116,108,101,45,101,110,100,105,97,110,46,236, + 3,0,0,0,255,127,255,127,3,0,233,4,0,0,0,218, + 6,108,105,116,116,108,101,41,2,218,3,105,110,116,218,8, + 116,111,95,98,121,116,101,115,41,1,218,1,120,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,12,95,112, + 97,99,107,95,117,105,110,116,51,50,46,0,0,0,115,4, + 0,0,0,20,2,255,128,114,21,0,0,0,99,1,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, 0,67,0,0,0,115,28,0,0,0,116,0,124,0,131,1, 100,1,107,2,115,16,74,0,130,1,116,1,160,2,124,0, 100,2,161,2,83,0,41,3,122,47,67,111,110,118,101,114, - 116,32,50,32,98,121,116,101,115,32,105,110,32,108,105,116, + 116,32,52,32,98,121,116,101,115,32,105,110,32,108,105,116, 116,108,101,45,101,110,100,105,97,110,32,116,111,32,97,110, - 32,105,110,116,101,103,101,114,46,233,2,0,0,0,114,17, - 0,0,0,114,22,0,0,0,114,25,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,14,95,117, - 110,112,97,99,107,95,117,105,110,116,49,54,56,0,0,0, - 115,4,0,0,0,0,2,16,1,114,29,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, - 0,0,0,71,0,0,0,115,20,0,0,0,116,0,160,1, - 100,1,100,2,132,0,124,0,68,0,131,1,161,1,83,0, - 41,3,122,31,82,101,112,108,97,99,101,109,101,110,116,32, - 102,111,114,32,111,115,46,112,97,116,104,46,106,111,105,110, - 40,41,46,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,5,0,0,0,83,0,0,0,115,26,0,0, - 0,103,0,124,0,93,18,125,1,124,1,114,4,124,1,160, - 0,116,1,161,1,145,2,113,4,83,0,114,5,0,0,0, - 41,2,218,6,114,115,116,114,105,112,218,15,112,97,116,104, - 95,115,101,112,97,114,97,116,111,114,115,41,2,218,2,46, - 48,218,4,112,97,114,116,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,218,10,60,108,105,115,116,99,111,109, - 112,62,64,0,0,0,115,4,0,0,0,6,1,6,255,122, + 32,105,110,116,101,103,101,114,46,114,16,0,0,0,114,17, + 0,0,0,169,3,218,3,108,101,110,114,18,0,0,0,218, + 10,102,114,111,109,95,98,121,116,101,115,169,1,218,4,100, + 97,116,97,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,14,95,117,110,112,97,99,107,95,117,105,110,116, + 51,50,51,0,0,0,115,6,0,0,0,16,2,12,1,255, + 128,114,27,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, + 28,0,0,0,116,0,124,0,131,1,100,1,107,2,115,16, + 74,0,130,1,116,1,160,2,124,0,100,2,161,2,83,0, + 41,3,122,47,67,111,110,118,101,114,116,32,50,32,98,121, + 116,101,115,32,105,110,32,108,105,116,116,108,101,45,101,110, + 100,105,97,110,32,116,111,32,97,110,32,105,110,116,101,103, + 101,114,46,233,2,0,0,0,114,17,0,0,0,114,22,0, + 0,0,114,25,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,14,95,117,110,112,97,99,107,95, + 117,105,110,116,49,54,56,0,0,0,115,6,0,0,0,16, + 2,12,1,255,128,114,29,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,71, + 0,0,0,115,20,0,0,0,116,0,160,1,100,1,100,2, + 132,0,124,0,68,0,131,1,161,1,83,0,41,3,122,31, + 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32, + 111,115,46,112,97,116,104,46,106,111,105,110,40,41,46,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 5,0,0,0,83,0,0,0,115,26,0,0,0,103,0,124, + 0,93,18,125,1,124,1,114,4,124,1,160,0,116,1,161, + 1,145,2,113,4,83,0,114,5,0,0,0,41,2,218,6, + 114,115,116,114,105,112,218,15,112,97,116,104,95,115,101,112, + 97,114,97,116,111,114,115,41,2,218,2,46,48,218,4,112, + 97,114,116,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,10,60,108,105,115,116,99,111,109,112,62,64,0, + 0,0,115,8,0,0,0,6,0,6,1,14,255,255,128,122, 30,95,112,97,116,104,95,106,111,105,110,46,60,108,111,99, 97,108,115,62,46,60,108,105,115,116,99,111,109,112,62,41, 2,218,8,112,97,116,104,95,115,101,112,218,4,106,111,105, 110,41,1,218,10,112,97,116,104,95,112,97,114,116,115,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,10, - 95,112,97,116,104,95,106,111,105,110,62,0,0,0,115,6, - 0,0,0,0,2,10,1,2,255,114,38,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5, - 0,0,0,67,0,0,0,115,94,0,0,0,116,0,116,1, - 131,1,100,1,107,2,114,36,124,0,160,2,116,3,161,1, - 92,3,125,1,125,2,125,3,124,1,124,3,102,2,83,0, - 116,4,124,0,131,1,68,0,93,40,125,4,124,4,116,1, - 118,0,114,44,124,0,106,5,124,4,100,1,100,2,141,2, - 92,2,125,1,125,3,124,1,124,3,102,2,2,0,1,0, - 83,0,100,3,124,0,102,2,83,0,41,4,122,32,82,101, - 112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,115, - 46,112,97,116,104,46,115,112,108,105,116,40,41,46,233,1, - 0,0,0,41,1,90,8,109,97,120,115,112,108,105,116,218, - 0,41,6,114,23,0,0,0,114,31,0,0,0,218,10,114, - 112,97,114,116,105,116,105,111,110,114,35,0,0,0,218,8, - 114,101,118,101,114,115,101,100,218,6,114,115,112,108,105,116, - 41,5,218,4,112,97,116,104,90,5,102,114,111,110,116,218, - 1,95,218,4,116,97,105,108,114,20,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,11,95,112, - 97,116,104,95,115,112,108,105,116,68,0,0,0,115,16,0, - 0,0,0,2,12,1,16,1,8,1,12,1,8,1,18,1, - 12,1,114,47,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,10,0,0,0,116,0,160,1,124,0,161,1,83,0,41, - 1,122,126,83,116,97,116,32,116,104,101,32,112,97,116,104, - 46,10,10,32,32,32,32,77,97,100,101,32,97,32,115,101, - 112,97,114,97,116,101,32,102,117,110,99,116,105,111,110,32, - 116,111,32,109,97,107,101,32,105,116,32,101,97,115,105,101, - 114,32,116,111,32,111,118,101,114,114,105,100,101,32,105,110, - 32,101,120,112,101,114,105,109,101,110,116,115,10,32,32,32, - 32,40,101,46,103,46,32,99,97,99,104,101,32,115,116,97, - 116,32,114,101,115,117,108,116,115,41,46,10,10,32,32,32, - 32,41,2,114,4,0,0,0,90,4,115,116,97,116,169,1, - 114,44,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,10,95,112,97,116,104,95,115,116,97,116, - 80,0,0,0,115,2,0,0,0,0,7,114,49,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,48,0,0,0,122,12, - 116,0,124,0,131,1,125,2,87,0,110,20,4,0,116,1, - 121,32,1,0,1,0,1,0,89,0,100,1,83,0,48,0, - 124,2,106,2,100,2,64,0,124,1,107,2,83,0,41,3, - 122,49,84,101,115,116,32,119,104,101,116,104,101,114,32,116, - 104,101,32,112,97,116,104,32,105,115,32,116,104,101,32,115, - 112,101,99,105,102,105,101,100,32,109,111,100,101,32,116,121, - 112,101,46,70,105,0,240,0,0,41,3,114,49,0,0,0, - 218,7,79,83,69,114,114,111,114,218,7,115,116,95,109,111, - 100,101,41,3,114,44,0,0,0,218,4,109,111,100,101,90, - 9,115,116,97,116,95,105,110,102,111,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,18,95,112,97,116,104, - 95,105,115,95,109,111,100,101,95,116,121,112,101,90,0,0, - 0,115,10,0,0,0,0,2,2,1,12,1,12,1,8,1, - 114,53,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,10, - 0,0,0,116,0,124,0,100,1,131,2,83,0,41,2,122, - 31,82,101,112,108,97,99,101,109,101,110,116,32,102,111,114, - 32,111,115,46,112,97,116,104,46,105,115,102,105,108,101,46, - 105,0,128,0,0,41,1,114,53,0,0,0,114,48,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,12,95,112,97,116,104,95,105,115,102,105,108,101,99,0, - 0,0,115,2,0,0,0,0,2,114,54,0,0,0,99,1, + 95,112,97,116,104,95,106,111,105,110,62,0,0,0,115,8, + 0,0,0,10,2,2,1,8,255,255,128,114,38,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,5,0,0,0,67,0,0,0,115,94,0,0,0,116,0, + 116,1,131,1,100,1,107,2,114,36,124,0,160,2,116,3, + 161,1,92,3,125,1,125,2,125,3,124,1,124,3,102,2, + 83,0,116,4,124,0,131,1,68,0,93,40,125,4,124,4, + 116,1,118,0,114,44,124,0,106,5,124,4,100,1,100,2, + 141,2,92,2,125,1,125,3,124,1,124,3,102,2,2,0, + 1,0,83,0,100,3,124,0,102,2,83,0,41,4,122,32, + 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32, + 111,115,46,112,97,116,104,46,115,112,108,105,116,40,41,46, + 233,1,0,0,0,41,1,90,8,109,97,120,115,112,108,105, + 116,218,0,41,6,114,23,0,0,0,114,31,0,0,0,218, + 10,114,112,97,114,116,105,116,105,111,110,114,35,0,0,0, + 218,8,114,101,118,101,114,115,101,100,218,6,114,115,112,108, + 105,116,41,5,218,4,112,97,116,104,90,5,102,114,111,110, + 116,218,1,95,218,4,116,97,105,108,114,20,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,11, + 95,112,97,116,104,95,115,112,108,105,116,68,0,0,0,115, + 18,0,0,0,12,2,16,1,8,1,12,1,8,1,18,1, + 12,1,8,1,255,128,114,47,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,10,0,0,0,116,0,160,1,124,0,161, + 1,83,0,41,1,122,126,83,116,97,116,32,116,104,101,32, + 112,97,116,104,46,10,10,32,32,32,32,77,97,100,101,32, + 97,32,115,101,112,97,114,97,116,101,32,102,117,110,99,116, + 105,111,110,32,116,111,32,109,97,107,101,32,105,116,32,101, + 97,115,105,101,114,32,116,111,32,111,118,101,114,114,105,100, + 101,32,105,110,32,101,120,112,101,114,105,109,101,110,116,115, + 10,32,32,32,32,40,101,46,103,46,32,99,97,99,104,101, + 32,115,116,97,116,32,114,101,115,117,108,116,115,41,46,10, + 10,32,32,32,32,41,2,114,4,0,0,0,90,4,115,116, + 97,116,169,1,114,44,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,10,95,112,97,116,104,95, + 115,116,97,116,80,0,0,0,115,4,0,0,0,10,7,255, + 128,114,49,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,115, + 48,0,0,0,122,12,116,0,124,0,131,1,125,2,87,0, + 110,20,4,0,116,1,121,32,1,0,1,0,1,0,89,0, + 100,1,83,0,48,0,124,2,106,2,100,2,64,0,124,1, + 107,2,83,0,41,3,122,49,84,101,115,116,32,119,104,101, + 116,104,101,114,32,116,104,101,32,112,97,116,104,32,105,115, + 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,109, + 111,100,101,32,116,121,112,101,46,70,105,0,240,0,0,41, + 3,114,49,0,0,0,218,7,79,83,69,114,114,111,114,218, + 7,115,116,95,109,111,100,101,41,3,114,44,0,0,0,218, + 4,109,111,100,101,90,9,115,116,97,116,95,105,110,102,111, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 18,95,112,97,116,104,95,105,115,95,109,111,100,101,95,116, + 121,112,101,90,0,0,0,115,12,0,0,0,2,2,12,1, + 12,1,8,1,14,1,255,128,114,53,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,100, + 1,131,2,83,0,41,2,122,31,82,101,112,108,97,99,101, + 109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,104, + 46,105,115,102,105,108,101,46,105,0,128,0,0,41,1,114, + 53,0,0,0,114,48,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,12,95,112,97,116,104,95, + 105,115,102,105,108,101,99,0,0,0,115,4,0,0,0,10, + 2,255,128,114,54,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,22,0,0,0,124,0,115,12,116,0,160,1,161,0, + 125,0,116,2,124,0,100,1,131,2,83,0,41,2,122,30, + 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32, + 111,115,46,112,97,116,104,46,105,115,100,105,114,46,105,0, + 64,0,0,41,3,114,4,0,0,0,218,6,103,101,116,99, + 119,100,114,53,0,0,0,114,48,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,11,95,112,97, + 116,104,95,105,115,100,105,114,104,0,0,0,115,8,0,0, + 0,4,2,8,1,10,1,255,128,114,56,0,0,0,99,1, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,22,0,0,0,124,0,115,12, - 116,0,160,1,161,0,125,0,116,2,124,0,100,1,131,2, - 83,0,41,2,122,30,82,101,112,108,97,99,101,109,101,110, - 116,32,102,111,114,32,111,115,46,112,97,116,104,46,105,115, - 100,105,114,46,105,0,64,0,0,41,3,114,4,0,0,0, - 218,6,103,101,116,99,119,100,114,53,0,0,0,114,48,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,11,95,112,97,116,104,95,105,115,100,105,114,104,0, - 0,0,115,6,0,0,0,0,2,4,1,8,1,114,56,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,26,0,0,0, - 124,0,160,0,116,1,161,1,112,24,124,0,100,1,100,2, - 133,2,25,0,116,2,118,0,83,0,41,3,122,142,82,101, - 112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,115, - 46,112,97,116,104,46,105,115,97,98,115,46,10,10,32,32, - 32,32,67,111,110,115,105,100,101,114,115,32,97,32,87,105, - 110,100,111,119,115,32,100,114,105,118,101,45,114,101,108,97, - 116,105,118,101,32,112,97,116,104,32,40,110,111,32,100,114, - 105,118,101,44,32,98,117,116,32,115,116,97,114,116,115,32, - 119,105,116,104,32,115,108,97,115,104,41,32,116,111,10,32, - 32,32,32,115,116,105,108,108,32,98,101,32,34,97,98,115, - 111,108,117,116,101,34,46,10,32,32,32,32,114,39,0,0, - 0,233,3,0,0,0,41,3,114,11,0,0,0,114,31,0, - 0,0,218,20,95,112,97,116,104,115,101,112,115,95,119,105, - 116,104,95,99,111,108,111,110,114,48,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,11,95,112, - 97,116,104,95,105,115,97,98,115,111,0,0,0,115,2,0, - 0,0,0,6,114,59,0,0,0,233,182,1,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,11, - 0,0,0,67,0,0,0,115,172,0,0,0,100,1,160,0, - 124,0,116,1,124,0,131,1,161,2,125,3,116,2,160,3, - 124,3,116,2,106,4,116,2,106,5,66,0,116,2,106,6, - 66,0,124,2,100,2,64,0,161,3,125,4,122,70,116,7, - 160,8,124,4,100,3,161,2,143,26,125,5,124,5,160,9, - 124,1,161,1,1,0,87,0,100,4,4,0,4,0,131,3, - 1,0,110,16,49,0,115,94,48,0,1,0,1,0,1,0, - 89,0,1,0,116,2,160,10,124,3,124,0,161,2,1,0, - 87,0,110,48,4,0,116,11,121,166,1,0,1,0,1,0, - 122,14,116,2,160,12,124,3,161,1,1,0,87,0,130,0, - 4,0,116,11,121,164,1,0,1,0,1,0,89,0,130,0, - 48,0,48,0,100,4,83,0,41,5,122,162,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,250,5, - 123,125,46,123,125,114,60,0,0,0,90,2,119,98,78,41, - 13,218,6,102,111,114,109,97,116,218,2,105,100,114,4,0, - 0,0,90,4,111,112,101,110,90,6,79,95,69,88,67,76, - 90,7,79,95,67,82,69,65,84,90,8,79,95,87,82,79, - 78,76,89,218,3,95,105,111,218,6,70,105,108,101,73,79, - 218,5,119,114,105,116,101,218,7,114,101,112,108,97,99,101, - 114,50,0,0,0,90,6,117,110,108,105,110,107,41,6,114, - 44,0,0,0,114,26,0,0,0,114,52,0,0,0,90,8, - 112,97,116,104,95,116,109,112,90,2,102,100,218,4,102,105, - 108,101,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,13,95,119,114,105,116,101,95,97,116,111,109,105,99, - 120,0,0,0,115,28,0,0,0,0,5,16,1,6,1,22, - 255,4,2,2,3,14,1,40,1,16,1,12,1,2,1,14, - 1,12,1,6,1,114,69,0,0,0,105,102,13,0,0,114, - 28,0,0,0,114,17,0,0,0,115,2,0,0,0,13,10, - 90,11,95,95,112,121,99,97,99,104,101,95,95,122,4,111, - 112,116,45,122,3,46,112,121,122,4,46,112,121,99,78,41, - 1,218,12,111,112,116,105,109,105,122,97,116,105,111,110,99, - 2,0,0,0,0,0,0,0,1,0,0,0,12,0,0,0, - 5,0,0,0,67,0,0,0,115,88,1,0,0,124,1,100, - 1,117,1,114,52,116,0,160,1,100,2,116,2,161,2,1, - 0,124,2,100,1,117,1,114,40,100,3,125,3,116,3,124, - 3,131,1,130,1,124,1,114,48,100,4,110,2,100,5,125, - 2,116,4,160,5,124,0,161,1,125,0,116,6,124,0,131, - 1,92,2,125,4,125,5,124,5,160,7,100,6,161,1,92, - 3,125,6,125,7,125,8,116,8,106,9,106,10,125,9,124, - 9,100,1,117,0,114,114,116,11,100,7,131,1,130,1,100, - 4,160,12,124,6,114,126,124,6,110,2,124,8,124,7,124, - 9,103,3,161,1,125,10,124,2,100,1,117,0,114,172,116, - 8,106,13,106,14,100,8,107,2,114,164,100,4,125,2,110, - 8,116,8,106,13,106,14,125,2,116,15,124,2,131,1,125, - 2,124,2,100,4,107,3,114,224,124,2,160,16,161,0,115, - 210,116,17,100,9,160,18,124,2,161,1,131,1,130,1,100, - 10,160,18,124,10,116,19,124,2,161,3,125,10,124,10,116, - 20,100,8,25,0,23,0,125,11,116,8,106,21,100,1,117, - 1,144,1,114,76,116,22,124,4,131,1,144,1,115,16,116, - 23,116,4,160,24,161,0,124,4,131,2,125,4,124,4,100, - 5,25,0,100,11,107,2,144,1,114,56,124,4,100,8,25, - 0,116,25,118,1,144,1,114,56,124,4,100,12,100,1,133, - 2,25,0,125,4,116,23,116,8,106,21,124,4,160,26,116, - 25,161,1,124,11,131,3,83,0,116,23,124,4,116,27,124, - 11,131,3,83,0,41,13,97,254,2,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, + 0,0,0,67,0,0,0,115,26,0,0,0,124,0,160,0, + 116,1,161,1,112,24,124,0,100,1,100,2,133,2,25,0, + 116,2,118,0,83,0,41,3,122,142,82,101,112,108,97,99, + 101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,116, + 104,46,105,115,97,98,115,46,10,10,32,32,32,32,67,111, + 110,115,105,100,101,114,115,32,97,32,87,105,110,100,111,119, + 115,32,100,114,105,118,101,45,114,101,108,97,116,105,118,101, + 32,112,97,116,104,32,40,110,111,32,100,114,105,118,101,44, + 32,98,117,116,32,115,116,97,114,116,115,32,119,105,116,104, + 32,115,108,97,115,104,41,32,116,111,10,32,32,32,32,115, + 116,105,108,108,32,98,101,32,34,97,98,115,111,108,117,116, + 101,34,46,10,32,32,32,32,114,39,0,0,0,233,3,0, + 0,0,41,3,114,11,0,0,0,114,31,0,0,0,218,20, + 95,112,97,116,104,115,101,112,115,95,119,105,116,104,95,99, + 111,108,111,110,114,48,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, + 105,115,97,98,115,111,0,0,0,115,4,0,0,0,26,6, + 255,128,114,59,0,0,0,233,182,1,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,11,0,0, + 0,67,0,0,0,115,172,0,0,0,100,1,160,0,124,0, + 116,1,124,0,131,1,161,2,125,3,116,2,160,3,124,3, + 116,2,106,4,116,2,106,5,66,0,116,2,106,6,66,0, + 124,2,100,2,64,0,161,3,125,4,122,70,116,7,160,8, + 124,4,100,3,161,2,143,26,125,5,124,5,160,9,124,1, + 161,1,1,0,87,0,100,4,4,0,4,0,131,3,1,0, + 110,16,49,0,115,94,48,0,1,0,1,0,1,0,89,0, + 1,0,116,2,160,10,124,3,124,0,161,2,1,0,87,0, + 110,48,4,0,116,11,121,166,1,0,1,0,1,0,122,14, + 116,2,160,12,124,3,161,1,1,0,87,0,130,0,4,0, + 116,11,121,164,1,0,1,0,1,0,89,0,130,0,48,0, + 48,0,100,4,83,0,41,5,122,162,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,250,5,123,125, + 46,123,125,114,60,0,0,0,90,2,119,98,78,41,13,218, + 6,102,111,114,109,97,116,218,2,105,100,114,4,0,0,0, + 90,4,111,112,101,110,90,6,79,95,69,88,67,76,90,7, + 79,95,67,82,69,65,84,90,8,79,95,87,82,79,78,76, + 89,218,3,95,105,111,218,6,70,105,108,101,73,79,218,5, + 119,114,105,116,101,218,7,114,101,112,108,97,99,101,114,50, + 0,0,0,90,6,117,110,108,105,110,107,41,6,114,44,0, + 0,0,114,26,0,0,0,114,52,0,0,0,90,8,112,97, + 116,104,95,116,109,112,90,2,102,100,218,4,102,105,108,101, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 13,95,119,114,105,116,101,95,97,116,111,109,105,99,120,0, + 0,0,115,32,0,0,0,16,5,6,1,22,1,4,255,2, + 2,14,3,40,1,16,1,12,1,2,1,14,1,12,1,6, + 1,2,1,4,128,255,128,114,69,0,0,0,105,102,13,0, + 0,114,28,0,0,0,114,17,0,0,0,115,2,0,0,0, + 13,10,90,11,95,95,112,121,99,97,99,104,101,95,95,122, + 4,111,112,116,45,122,3,46,112,121,122,4,46,112,121,99, + 78,41,1,218,12,111,112,116,105,109,105,122,97,116,105,111, + 110,99,2,0,0,0,0,0,0,0,1,0,0,0,12,0, + 0,0,5,0,0,0,67,0,0,0,115,88,1,0,0,124, + 1,100,1,117,1,114,52,116,0,160,1,100,2,116,2,161, + 2,1,0,124,2,100,1,117,1,114,40,100,3,125,3,116, + 3,124,3,131,1,130,1,124,1,114,48,100,4,110,2,100, + 5,125,2,116,4,160,5,124,0,161,1,125,0,116,6,124, + 0,131,1,92,2,125,4,125,5,124,5,160,7,100,6,161, + 1,92,3,125,6,125,7,125,8,116,8,106,9,106,10,125, + 9,124,9,100,1,117,0,114,114,116,11,100,7,131,1,130, + 1,100,4,160,12,124,6,114,126,124,6,110,2,124,8,124, + 7,124,9,103,3,161,1,125,10,124,2,100,1,117,0,114, + 172,116,8,106,13,106,14,100,8,107,2,114,164,100,4,125, + 2,110,8,116,8,106,13,106,14,125,2,116,15,124,2,131, + 1,125,2,124,2,100,4,107,3,114,224,124,2,160,16,161, + 0,115,210,116,17,100,9,160,18,124,2,161,1,131,1,130, + 1,100,10,160,18,124,10,116,19,124,2,161,3,125,10,124, + 10,116,20,100,8,25,0,23,0,125,11,116,8,106,21,100, + 1,117,1,144,1,114,76,116,22,124,4,131,1,144,1,115, + 16,116,23,116,4,160,24,161,0,124,4,131,2,125,4,124, + 4,100,5,25,0,100,11,107,2,144,1,114,56,124,4,100, + 8,25,0,116,25,118,1,144,1,114,56,124,4,100,12,100, + 1,133,2,25,0,125,4,116,23,116,8,106,21,124,4,160, + 26,116,25,161,1,124,11,131,3,83,0,116,23,124,4,116, + 27,124,11,131,3,83,0,41,13,97,254,2,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,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,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,10,10,32,32,32,32,84,104,101,32, + 39,111,112,116,105,109,105,122,97,116,105,111,110,39,32,112, + 97,114,97,109,101,116,101,114,32,99,111,110,116,114,111,108, + 115,32,116,104,101,32,112,114,101,115,117,109,101,100,32,111, + 112,116,105,109,105,122,97,116,105,111,110,32,108,101,118,101, + 108,32,111,102,10,32,32,32,32,116,104,101,32,98,121,116, + 101,99,111,100,101,32,102,105,108,101,46,32,73,102,32,39, + 111,112,116,105,109,105,122,97,116,105,111,110,39,32,105,115, + 32,110,111,116,32,78,111,110,101,44,32,116,104,101,32,115, + 116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,97, + 116,105,111,110,10,32,32,32,32,111,102,32,116,104,101,32, + 97,114,103,117,109,101,110,116,32,105,115,32,116,97,107,101, + 110,32,97,110,100,32,118,101,114,105,102,105,101,100,32,116, + 111,32,98,101,32,97,108,112,104,97,110,117,109,101,114,105, + 99,32,40,101,108,115,101,32,86,97,108,117,101,69,114,114, + 111,114,10,32,32,32,32,105,115,32,114,97,105,115,101,100, + 41,46,10,10,32,32,32,32,84,104,101,32,100,101,98,117, + 103,95,111,118,101,114,114,105,100,101,32,112,97,114,97,109, + 101,116,101,114,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,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,10,32,32,32,32,97,32,84,114,117,101,32,118,97, + 108,117,101,32,105,115,32,116,104,101,32,115,97,109,101,32, + 97,115,32,115,101,116,116,105,110,103,32,39,111,112,116,105, + 109,105,122,97,116,105,111,110,39,32,116,111,32,116,104,101, + 32,101,109,112,116,121,32,115,116,114,105,110,103,10,32,32, + 32,32,119,104,105,108,101,32,97,32,70,97,108,115,101,32, + 118,97,108,117,101,32,105,115,32,101,113,117,105,118,97,108, + 101,110,116,32,116,111,32,115,101,116,116,105,110,103,32,39, + 111,112,116,105,109,105,122,97,116,105,111,110,39,32,116,111, + 32,39,49,39,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,122,70,116, + 104,101,32,100,101,98,117,103,95,111,118,101,114,114,105,100, + 101,32,112,97,114,97,109,101,116,101,114,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,59,32,117,115,101,32,39, + 111,112,116,105,109,105,122,97,116,105,111,110,39,32,105,110, + 115,116,101,97,100,122,50,100,101,98,117,103,95,111,118,101, + 114,114,105,100,101,32,111,114,32,111,112,116,105,109,105,122, + 97,116,105,111,110,32,109,117,115,116,32,98,101,32,115,101, + 116,32,116,111,32,78,111,110,101,114,40,0,0,0,114,39, + 0,0,0,218,1,46,250,36,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,233,0,0,0, + 0,122,24,123,33,114,125,32,105,115,32,110,111,116,32,97, + 108,112,104,97,110,117,109,101,114,105,99,122,7,123,125,46, + 123,125,123,125,250,1,58,114,28,0,0,0,41,28,218,9, + 95,119,97,114,110,105,110,103,115,218,4,119,97,114,110,218, + 18,68,101,112,114,101,99,97,116,105,111,110,87,97,114,110, + 105,110,103,218,9,84,121,112,101,69,114,114,111,114,114,4, + 0,0,0,218,6,102,115,112,97,116,104,114,47,0,0,0, + 114,41,0,0,0,114,1,0,0,0,218,14,105,109,112,108, + 101,109,101,110,116,97,116,105,111,110,218,9,99,97,99,104, + 101,95,116,97,103,218,19,78,111,116,73,109,112,108,101,109, + 101,110,116,101,100,69,114,114,111,114,114,36,0,0,0,114, + 2,0,0,0,218,8,111,112,116,105,109,105,122,101,218,3, + 115,116,114,218,7,105,115,97,108,110,117,109,218,10,86,97, + 108,117,101,69,114,114,111,114,114,62,0,0,0,218,4,95, + 79,80,84,218,17,66,89,84,69,67,79,68,69,95,83,85, + 70,70,73,88,69,83,218,14,112,121,99,97,99,104,101,95, + 112,114,101,102,105,120,114,59,0,0,0,114,38,0,0,0, + 114,55,0,0,0,114,31,0,0,0,218,6,108,115,116,114, + 105,112,218,8,95,80,89,67,65,67,72,69,41,12,114,44, + 0,0,0,90,14,100,101,98,117,103,95,111,118,101,114,114, + 105,100,101,114,70,0,0,0,218,7,109,101,115,115,97,103, + 101,218,4,104,101,97,100,114,46,0,0,0,90,4,98,97, + 115,101,218,3,115,101,112,218,4,114,101,115,116,90,3,116, + 97,103,90,15,97,108,109,111,115,116,95,102,105,108,101,110, + 97,109,101,218,8,102,105,108,101,110,97,109,101,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,17,99,97, + 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,46, + 1,0,0,115,74,0,0,0,8,18,6,1,2,1,4,255, + 8,2,4,1,8,1,12,1,10,1,12,1,16,1,8,1, + 8,1,8,1,24,1,8,1,12,1,6,1,8,2,8,1, + 8,1,8,1,14,1,14,1,12,1,12,1,10,9,14,1, + 28,5,12,1,2,4,4,1,8,1,2,1,4,253,12,5, + 255,128,114,97,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0, + 115,46,1,0,0,116,0,106,1,106,2,100,1,117,0,114, + 20,116,3,100,2,131,1,130,1,116,4,160,5,124,0,161, + 1,125,0,116,6,124,0,131,1,92,2,125,1,125,2,100, + 3,125,3,116,0,106,7,100,1,117,1,114,102,116,0,106, + 7,160,8,116,9,161,1,125,4,124,1,160,10,124,4,116, + 11,23,0,161,1,114,102,124,1,116,12,124,4,131,1,100, + 1,133,2,25,0,125,1,100,4,125,3,124,3,115,144,116, + 6,124,1,131,1,92,2,125,1,125,5,124,5,116,13,107, + 3,114,144,116,14,116,13,155,0,100,5,124,0,155,2,157, + 3,131,1,130,1,124,2,160,15,100,6,161,1,125,6,124, + 6,100,7,118,1,114,178,116,14,100,8,124,2,155,2,157, + 2,131,1,130,1,110,92,124,6,100,9,107,2,144,1,114, + 14,124,2,160,16,100,6,100,10,161,2,100,11,25,0,125, + 7,124,7,160,10,116,17,161,1,115,228,116,14,100,12,116, + 17,155,2,157,2,131,1,130,1,124,7,116,12,116,17,131, + 1,100,1,133,2,25,0,125,8,124,8,160,18,161,0,144, + 1,115,14,116,14,100,13,124,7,155,2,100,14,157,3,131, + 1,130,1,124,2,160,19,100,6,161,1,100,15,25,0,125, + 9,116,20,124,1,124,9,116,21,100,15,25,0,23,0,131, + 2,83,0,41,16,97,110,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,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,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, + 32,46,112,121,32,102,105,108,101,46,10,10,32,32,32,32, + 84,104,101,32,46,112,121,99,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,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,10,10,32,32,32,32,84,104,101,32,39,111, - 112,116,105,109,105,122,97,116,105,111,110,39,32,112,97,114, - 97,109,101,116,101,114,32,99,111,110,116,114,111,108,115,32, - 116,104,101,32,112,114,101,115,117,109,101,100,32,111,112,116, - 105,109,105,122,97,116,105,111,110,32,108,101,118,101,108,32, - 111,102,10,32,32,32,32,116,104,101,32,98,121,116,101,99, - 111,100,101,32,102,105,108,101,46,32,73,102,32,39,111,112, - 116,105,109,105,122,97,116,105,111,110,39,32,105,115,32,110, - 111,116,32,78,111,110,101,44,32,116,104,101,32,115,116,114, - 105,110,103,32,114,101,112,114,101,115,101,110,116,97,116,105, - 111,110,10,32,32,32,32,111,102,32,116,104,101,32,97,114, - 103,117,109,101,110,116,32,105,115,32,116,97,107,101,110,32, - 97,110,100,32,118,101,114,105,102,105,101,100,32,116,111,32, - 98,101,32,97,108,112,104,97,110,117,109,101,114,105,99,32, - 40,101,108,115,101,32,86,97,108,117,101,69,114,114,111,114, - 10,32,32,32,32,105,115,32,114,97,105,115,101,100,41,46, - 10,10,32,32,32,32,84,104,101,32,100,101,98,117,103,95, - 111,118,101,114,114,105,100,101,32,112,97,114,97,109,101,116, - 101,114,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,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, - 10,32,32,32,32,97,32,84,114,117,101,32,118,97,108,117, - 101,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115, - 32,115,101,116,116,105,110,103,32,39,111,112,116,105,109,105, - 122,97,116,105,111,110,39,32,116,111,32,116,104,101,32,101, - 109,112,116,121,32,115,116,114,105,110,103,10,32,32,32,32, - 119,104,105,108,101,32,97,32,70,97,108,115,101,32,118,97, - 108,117,101,32,105,115,32,101,113,117,105,118,97,108,101,110, - 116,32,116,111,32,115,101,116,116,105,110,103,32,39,111,112, - 116,105,109,105,122,97,116,105,111,110,39,32,116,111,32,39, - 49,39,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,122,70,116,104,101, - 32,100,101,98,117,103,95,111,118,101,114,114,105,100,101,32, - 112,97,114,97,109,101,116,101,114,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,59,32,117,115,101,32,39,111,112, - 116,105,109,105,122,97,116,105,111,110,39,32,105,110,115,116, - 101,97,100,122,50,100,101,98,117,103,95,111,118,101,114,114, - 105,100,101,32,111,114,32,111,112,116,105,109,105,122,97,116, - 105,111,110,32,109,117,115,116,32,98,101,32,115,101,116,32, - 116,111,32,78,111,110,101,114,40,0,0,0,114,39,0,0, - 0,218,1,46,250,36,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,233,0,0,0,0,122, - 24,123,33,114,125,32,105,115,32,110,111,116,32,97,108,112, - 104,97,110,117,109,101,114,105,99,122,7,123,125,46,123,125, - 123,125,250,1,58,114,28,0,0,0,41,28,218,9,95,119, - 97,114,110,105,110,103,115,218,4,119,97,114,110,218,18,68, - 101,112,114,101,99,97,116,105,111,110,87,97,114,110,105,110, - 103,218,9,84,121,112,101,69,114,114,111,114,114,4,0,0, - 0,218,6,102,115,112,97,116,104,114,47,0,0,0,114,41, - 0,0,0,114,1,0,0,0,218,14,105,109,112,108,101,109, - 101,110,116,97,116,105,111,110,218,9,99,97,99,104,101,95, - 116,97,103,218,19,78,111,116,73,109,112,108,101,109,101,110, - 116,101,100,69,114,114,111,114,114,36,0,0,0,114,2,0, - 0,0,218,8,111,112,116,105,109,105,122,101,218,3,115,116, - 114,218,7,105,115,97,108,110,117,109,218,10,86,97,108,117, - 101,69,114,114,111,114,114,62,0,0,0,218,4,95,79,80, - 84,218,17,66,89,84,69,67,79,68,69,95,83,85,70,70, - 73,88,69,83,218,14,112,121,99,97,99,104,101,95,112,114, - 101,102,105,120,114,59,0,0,0,114,38,0,0,0,114,55, - 0,0,0,114,31,0,0,0,218,6,108,115,116,114,105,112, - 218,8,95,80,89,67,65,67,72,69,41,12,114,44,0,0, - 0,90,14,100,101,98,117,103,95,111,118,101,114,114,105,100, - 101,114,70,0,0,0,218,7,109,101,115,115,97,103,101,218, - 4,104,101,97,100,114,46,0,0,0,90,4,98,97,115,101, - 218,3,115,101,112,218,4,114,101,115,116,90,3,116,97,103, - 90,15,97,108,109,111,115,116,95,102,105,108,101,110,97,109, - 101,218,8,102,105,108,101,110,97,109,101,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,218,17,99,97,99,104, - 101,95,102,114,111,109,95,115,111,117,114,99,101,46,1,0, - 0,115,72,0,0,0,0,18,8,1,6,1,2,255,4,2, - 8,1,4,1,8,1,12,1,10,1,12,1,16,1,8,1, - 8,1,8,1,24,1,8,1,12,1,6,2,8,1,8,1, - 8,1,8,1,14,1,14,1,12,1,12,9,10,1,14,5, - 28,1,12,4,2,1,4,1,8,1,2,253,4,5,114,97, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 10,0,0,0,5,0,0,0,67,0,0,0,115,46,1,0, - 0,116,0,106,1,106,2,100,1,117,0,114,20,116,3,100, - 2,131,1,130,1,116,4,160,5,124,0,161,1,125,0,116, - 6,124,0,131,1,92,2,125,1,125,2,100,3,125,3,116, - 0,106,7,100,1,117,1,114,102,116,0,106,7,160,8,116, - 9,161,1,125,4,124,1,160,10,124,4,116,11,23,0,161, - 1,114,102,124,1,116,12,124,4,131,1,100,1,133,2,25, - 0,125,1,100,4,125,3,124,3,115,144,116,6,124,1,131, - 1,92,2,125,1,125,5,124,5,116,13,107,3,114,144,116, - 14,116,13,155,0,100,5,124,0,155,2,157,3,131,1,130, - 1,124,2,160,15,100,6,161,1,125,6,124,6,100,7,118, - 1,114,178,116,14,100,8,124,2,155,2,157,2,131,1,130, - 1,110,92,124,6,100,9,107,2,144,1,114,14,124,2,160, - 16,100,6,100,10,161,2,100,11,25,0,125,7,124,7,160, - 10,116,17,161,1,115,228,116,14,100,12,116,17,155,2,157, - 2,131,1,130,1,124,7,116,12,116,17,131,1,100,1,133, - 2,25,0,125,8,124,8,160,18,161,0,144,1,115,14,116, - 14,100,13,124,7,155,2,100,14,157,3,131,1,130,1,124, - 2,160,19,100,6,161,1,100,15,25,0,125,9,116,20,124, - 1,124,9,116,21,100,15,25,0,23,0,131,2,83,0,41, - 16,97,110,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,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,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,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,47,52,56,56,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,114,72,0,0,0,70,84,122,31,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,114,71,0, - 0,0,62,2,0,0,0,114,28,0,0,0,114,57,0,0, - 0,122,29,101,120,112,101,99,116,101,100,32,111,110,108,121, - 32,50,32,111,114,32,51,32,100,111,116,115,32,105,110,32, - 114,57,0,0,0,114,28,0,0,0,233,254,255,255,255,122, - 53,111,112,116,105,109,105,122,97,116,105,111,110,32,112,111, - 114,116,105,111,110,32,111,102,32,102,105,108,101,110,97,109, - 101,32,100,111,101,115,32,110,111,116,32,115,116,97,114,116, - 32,119,105,116,104,32,122,19,111,112,116,105,109,105,122,97, - 116,105,111,110,32,108,101,118,101,108,32,122,29,32,105,115, - 32,110,111,116,32,97,110,32,97,108,112,104,97,110,117,109, - 101,114,105,99,32,118,97,108,117,101,114,73,0,0,0,41, - 22,114,1,0,0,0,114,80,0,0,0,114,81,0,0,0, - 114,82,0,0,0,114,4,0,0,0,114,79,0,0,0,114, - 47,0,0,0,114,89,0,0,0,114,30,0,0,0,114,31, - 0,0,0,114,11,0,0,0,114,35,0,0,0,114,23,0, - 0,0,114,91,0,0,0,114,86,0,0,0,218,5,99,111, - 117,110,116,114,43,0,0,0,114,87,0,0,0,114,85,0, - 0,0,218,9,112,97,114,116,105,116,105,111,110,114,38,0, - 0,0,218,15,83,79,85,82,67,69,95,83,85,70,70,73, - 88,69,83,41,10,114,44,0,0,0,114,93,0,0,0,90, - 16,112,121,99,97,99,104,101,95,102,105,108,101,110,97,109, - 101,90,23,102,111,117,110,100,95,105,110,95,112,121,99,97, - 99,104,101,95,112,114,101,102,105,120,90,13,115,116,114,105, - 112,112,101,100,95,112,97,116,104,90,7,112,121,99,97,99, - 104,101,90,9,100,111,116,95,99,111,117,110,116,114,70,0, - 0,0,90,9,111,112,116,95,108,101,118,101,108,90,13,98, - 97,115,101,95,102,105,108,101,110,97,109,101,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,17,115,111,117, - 114,99,101,95,102,114,111,109,95,99,97,99,104,101,117,1, - 0,0,115,60,0,0,0,0,9,12,1,8,1,10,1,12, - 1,4,1,10,1,12,1,14,1,16,1,4,1,4,1,12, - 1,8,1,8,1,2,255,8,2,10,1,8,1,16,1,10, - 1,16,1,10,1,4,1,2,255,8,2,16,1,10,1,16, - 2,14,1,114,102,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,5,0,0,0,9,0,0,0,67,0,0, - 0,115,124,0,0,0,116,0,124,0,131,1,100,1,107,2, - 114,16,100,2,83,0,124,0,160,1,100,3,161,1,92,3, - 125,1,125,2,125,3,124,1,114,56,124,3,160,2,161,0, - 100,4,100,5,133,2,25,0,100,6,107,3,114,60,124,0, - 83,0,122,12,116,3,124,0,131,1,125,4,87,0,110,34, - 4,0,116,4,116,5,102,2,121,106,1,0,1,0,1,0, - 124,0,100,2,100,5,133,2,25,0,125,4,89,0,110,2, - 48,0,116,6,124,4,131,1,114,120,124,4,83,0,124,0, - 83,0,41,7,122,188,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,114,73,0,0,0,78,114,71,0,0,0,233,253,255, - 255,255,233,255,255,255,255,90,2,112,121,41,7,114,23,0, - 0,0,114,41,0,0,0,218,5,108,111,119,101,114,114,102, - 0,0,0,114,82,0,0,0,114,86,0,0,0,114,54,0, - 0,0,41,5,218,13,98,121,116,101,99,111,100,101,95,112, - 97,116,104,114,95,0,0,0,114,45,0,0,0,90,9,101, - 120,116,101,110,115,105,111,110,218,11,115,111,117,114,99,101, - 95,112,97,116,104,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,15,95,103,101,116,95,115,111,117,114,99, - 101,102,105,108,101,157,1,0,0,115,20,0,0,0,0,7, - 12,1,4,1,16,1,24,1,4,1,2,1,12,1,16,1, - 18,1,114,108,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,8,0,0,0,67,0,0,0, - 115,70,0,0,0,124,0,160,0,116,1,116,2,131,1,161, - 1,114,44,122,10,116,3,124,0,131,1,87,0,83,0,4, - 0,116,4,121,42,1,0,1,0,1,0,89,0,110,24,48, - 0,124,0,160,0,116,1,116,5,131,1,161,1,114,62,124, - 0,83,0,100,0,83,0,100,0,83,0,169,1,78,41,6, - 218,8,101,110,100,115,119,105,116,104,218,5,116,117,112,108, - 101,114,101,0,0,0,114,97,0,0,0,114,82,0,0,0, - 114,88,0,0,0,41,1,114,96,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,11,95,103,101, - 116,95,99,97,99,104,101,100,176,1,0,0,115,16,0,0, - 0,0,1,14,1,2,1,10,1,12,1,6,1,14,1,4, - 2,114,112,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, - 50,0,0,0,122,14,116,0,124,0,131,1,106,1,125,1, - 87,0,110,22,4,0,116,2,121,36,1,0,1,0,1,0, - 100,1,125,1,89,0,110,2,48,0,124,1,100,2,79,0, - 125,1,124,1,83,0,41,3,122,51,67,97,108,99,117,108, - 97,116,101,32,116,104,101,32,109,111,100,101,32,112,101,114, - 109,105,115,115,105,111,110,115,32,102,111,114,32,97,32,98, - 121,116,101,99,111,100,101,32,102,105,108,101,46,114,60,0, - 0,0,233,128,0,0,0,41,3,114,49,0,0,0,114,51, - 0,0,0,114,50,0,0,0,41,2,114,44,0,0,0,114, - 52,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,10,95,99,97,108,99,95,109,111,100,101,188, - 1,0,0,115,12,0,0,0,0,2,2,1,14,1,12,1, - 10,3,8,1,114,114,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,8,0,0,0,3,0, - 0,0,115,66,0,0,0,100,6,135,0,102,1,100,2,100, - 3,132,9,125,1,122,10,116,0,106,1,125,2,87,0,110, - 26,4,0,116,2,121,50,1,0,1,0,1,0,100,4,100, - 5,132,0,125,2,89,0,110,2,48,0,124,2,124,1,136, - 0,131,2,1,0,124,1,83,0,41,7,122,252,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,0,0,0,0,4,0,0,0,4,0,0,0,31, - 0,0,0,115,72,0,0,0,124,1,100,0,117,0,114,16, - 124,0,106,0,125,1,110,32,124,0,106,0,124,1,107,3, - 114,48,116,1,100,1,124,0,106,0,124,1,102,2,22,0, - 124,1,100,2,141,2,130,1,136,0,124,0,124,1,103,2, - 124,2,162,1,82,0,105,0,124,3,164,1,142,1,83,0, - 41,3,78,122,30,108,111,97,100,101,114,32,102,111,114,32, - 37,115,32,99,97,110,110,111,116,32,104,97,110,100,108,101, - 32,37,115,169,1,218,4,110,97,109,101,41,2,114,116,0, - 0,0,218,11,73,109,112,111,114,116,69,114,114,111,114,41, - 4,218,4,115,101,108,102,114,116,0,0,0,218,4,97,114, - 103,115,218,6,107,119,97,114,103,115,169,1,218,6,109,101, - 116,104,111,100,114,5,0,0,0,114,8,0,0,0,218,19, - 95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112, - 112,101,114,208,1,0,0,115,18,0,0,0,0,1,8,1, - 8,1,10,1,4,1,8,255,2,1,2,255,6,2,122,40, + 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,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,47,52,56,56,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,114,72,0,0,0,70,84, + 122,31,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,114,71,0,0,0,62,2,0,0,0,114,28,0,0,0, + 114,57,0,0,0,122,29,101,120,112,101,99,116,101,100,32, + 111,110,108,121,32,50,32,111,114,32,51,32,100,111,116,115, + 32,105,110,32,114,57,0,0,0,114,28,0,0,0,233,254, + 255,255,255,122,53,111,112,116,105,109,105,122,97,116,105,111, + 110,32,112,111,114,116,105,111,110,32,111,102,32,102,105,108, + 101,110,97,109,101,32,100,111,101,115,32,110,111,116,32,115, + 116,97,114,116,32,119,105,116,104,32,122,19,111,112,116,105, + 109,105,122,97,116,105,111,110,32,108,101,118,101,108,32,122, + 29,32,105,115,32,110,111,116,32,97,110,32,97,108,112,104, + 97,110,117,109,101,114,105,99,32,118,97,108,117,101,114,73, + 0,0,0,41,22,114,1,0,0,0,114,80,0,0,0,114, + 81,0,0,0,114,82,0,0,0,114,4,0,0,0,114,79, + 0,0,0,114,47,0,0,0,114,89,0,0,0,114,30,0, + 0,0,114,31,0,0,0,114,11,0,0,0,114,35,0,0, + 0,114,23,0,0,0,114,91,0,0,0,114,86,0,0,0, + 218,5,99,111,117,110,116,114,43,0,0,0,114,87,0,0, + 0,114,85,0,0,0,218,9,112,97,114,116,105,116,105,111, + 110,114,38,0,0,0,218,15,83,79,85,82,67,69,95,83, + 85,70,70,73,88,69,83,41,10,114,44,0,0,0,114,93, + 0,0,0,90,16,112,121,99,97,99,104,101,95,102,105,108, + 101,110,97,109,101,90,23,102,111,117,110,100,95,105,110,95, + 112,121,99,97,99,104,101,95,112,114,101,102,105,120,90,13, + 115,116,114,105,112,112,101,100,95,112,97,116,104,90,7,112, + 121,99,97,99,104,101,90,9,100,111,116,95,99,111,117,110, + 116,114,70,0,0,0,90,9,111,112,116,95,108,101,118,101, + 108,90,13,98,97,115,101,95,102,105,108,101,110,97,109,101, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 17,115,111,117,114,99,101,95,102,114,111,109,95,99,97,99, + 104,101,117,1,0,0,115,62,0,0,0,12,9,8,1,10, + 1,12,1,4,1,10,1,12,1,14,1,16,1,4,1,4, + 1,12,1,8,1,8,1,2,1,8,255,10,2,8,1,16, + 1,10,1,16,1,10,1,4,1,2,1,8,255,16,2,10, + 1,16,1,14,2,18,1,255,128,114,102,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,9, + 0,0,0,67,0,0,0,115,124,0,0,0,116,0,124,0, + 131,1,100,1,107,2,114,16,100,2,83,0,124,0,160,1, + 100,3,161,1,92,3,125,1,125,2,125,3,124,1,114,56, + 124,3,160,2,161,0,100,4,100,5,133,2,25,0,100,6, + 107,3,114,60,124,0,83,0,122,12,116,3,124,0,131,1, + 125,4,87,0,110,34,4,0,116,4,116,5,102,2,121,106, + 1,0,1,0,1,0,124,0,100,2,100,5,133,2,25,0, + 125,4,89,0,110,2,48,0,116,6,124,4,131,1,114,120, + 124,4,83,0,124,0,83,0,41,7,122,188,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,114,73,0,0,0,78,114,71, + 0,0,0,233,253,255,255,255,233,255,255,255,255,90,2,112, + 121,41,7,114,23,0,0,0,114,41,0,0,0,218,5,108, + 111,119,101,114,114,102,0,0,0,114,82,0,0,0,114,86, + 0,0,0,114,54,0,0,0,41,5,218,13,98,121,116,101, + 99,111,100,101,95,112,97,116,104,114,95,0,0,0,114,45, + 0,0,0,90,9,101,120,116,101,110,115,105,111,110,218,11, + 115,111,117,114,99,101,95,112,97,116,104,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,15,95,103,101,116, + 95,115,111,117,114,99,101,102,105,108,101,157,1,0,0,115, + 22,0,0,0,12,7,4,1,16,1,24,1,4,1,2,1, + 12,1,16,1,18,1,16,1,255,128,114,108,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 8,0,0,0,67,0,0,0,115,70,0,0,0,124,0,160, + 0,116,1,116,2,131,1,161,1,114,44,122,10,116,3,124, + 0,131,1,87,0,83,0,4,0,116,4,121,42,1,0,1, + 0,1,0,89,0,110,24,48,0,124,0,160,0,116,1,116, + 5,131,1,161,1,114,62,124,0,83,0,100,0,83,0,100, + 0,83,0,169,1,78,41,6,218,8,101,110,100,115,119,105, + 116,104,218,5,116,117,112,108,101,114,101,0,0,0,114,97, + 0,0,0,114,82,0,0,0,114,88,0,0,0,41,1,114, + 96,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, + 176,1,0,0,115,20,0,0,0,14,1,2,1,10,1,12, + 1,6,1,14,1,4,1,4,2,4,128,255,128,114,112,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,8,0,0,0,67,0,0,0,115,50,0,0,0, + 122,14,116,0,124,0,131,1,106,1,125,1,87,0,110,22, + 4,0,116,2,121,36,1,0,1,0,1,0,100,1,125,1, + 89,0,110,2,48,0,124,1,100,2,79,0,125,1,124,1, + 83,0,41,3,122,51,67,97,108,99,117,108,97,116,101,32, + 116,104,101,32,109,111,100,101,32,112,101,114,109,105,115,115, + 105,111,110,115,32,102,111,114,32,97,32,98,121,116,101,99, + 111,100,101,32,102,105,108,101,46,114,60,0,0,0,233,128, + 0,0,0,41,3,114,49,0,0,0,114,51,0,0,0,114, + 50,0,0,0,41,2,114,44,0,0,0,114,52,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 10,95,99,97,108,99,95,109,111,100,101,188,1,0,0,115, + 14,0,0,0,2,2,14,1,12,1,10,1,8,3,4,1, + 255,128,114,114,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,8,0,0,0,3,0,0,0, + 115,66,0,0,0,100,6,135,0,102,1,100,2,100,3,132, + 9,125,1,122,10,116,0,106,1,125,2,87,0,110,26,4, + 0,116,2,121,50,1,0,1,0,1,0,100,4,100,5,132, + 0,125,2,89,0,110,2,48,0,124,2,124,1,136,0,131, + 2,1,0,124,1,83,0,41,7,122,252,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,0,0,0,0,4,0,0,0,4,0,0,0,31,0,0, + 0,115,72,0,0,0,124,1,100,0,117,0,114,16,124,0, + 106,0,125,1,110,32,124,0,106,0,124,1,107,3,114,48, + 116,1,100,1,124,0,106,0,124,1,102,2,22,0,124,1, + 100,2,141,2,130,1,136,0,124,0,124,1,103,2,124,2, + 162,1,82,0,105,0,124,3,164,1,142,1,83,0,41,3, + 78,122,30,108,111,97,100,101,114,32,102,111,114,32,37,115, + 32,99,97,110,110,111,116,32,104,97,110,100,108,101,32,37, + 115,169,1,218,4,110,97,109,101,41,2,114,116,0,0,0, + 218,11,73,109,112,111,114,116,69,114,114,111,114,41,4,218, + 4,115,101,108,102,114,116,0,0,0,218,4,97,114,103,115, + 218,6,107,119,97,114,103,115,169,1,218,6,109,101,116,104, + 111,100,114,5,0,0,0,114,8,0,0,0,218,19,95,99, + 104,101,99,107,95,110,97,109,101,95,119,114,97,112,112,101, + 114,208,1,0,0,115,20,0,0,0,8,1,8,1,10,1, + 4,1,8,1,2,255,2,1,6,255,24,2,255,128,122,40, 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,99,2,0,0,0,0,0,0, @@ -600,399 +603,401 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,100,105,99,116,95,95,218,6,117,112,100,97,116,101,41, 3,90,3,110,101,119,90,3,111,108,100,114,67,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 5,95,119,114,97,112,219,1,0,0,115,8,0,0,0,0, - 1,8,1,10,1,20,1,122,26,95,99,104,101,99,107,95, - 110,97,109,101,46,60,108,111,99,97,108,115,62,46,95,119, - 114,97,112,41,1,78,41,3,218,10,95,98,111,111,116,115, - 116,114,97,112,114,133,0,0,0,218,9,78,97,109,101,69, - 114,114,111,114,41,3,114,122,0,0,0,114,123,0,0,0, - 114,133,0,0,0,114,5,0,0,0,114,121,0,0,0,114, - 8,0,0,0,218,11,95,99,104,101,99,107,95,110,97,109, - 101,200,1,0,0,115,14,0,0,0,0,8,14,7,2,1, - 10,1,12,2,14,5,10,1,114,136,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0, - 0,0,67,0,0,0,115,60,0,0,0,124,0,160,0,124, - 1,161,1,92,2,125,2,125,3,124,2,100,1,117,0,114, - 56,116,1,124,3,131,1,114,56,100,2,125,4,116,2,160, - 3,124,4,160,4,124,3,100,3,25,0,161,1,116,5,161, - 2,1,0,124,2,83,0,41,4,122,155,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,10,10,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 32,105,110,32,102,97,118,111,114,32,111,102,32,102,105,110, - 100,101,114,46,102,105,110,100,95,115,112,101,99,40,41,46, - 10,10,32,32,32,32,78,122,44,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,114,73,0,0,0,41,6,218,11,102,105, - 110,100,95,108,111,97,100,101,114,114,23,0,0,0,114,75, - 0,0,0,114,76,0,0,0,114,62,0,0,0,218,13,73, - 109,112,111,114,116,87,97,114,110,105,110,103,41,5,114,118, - 0,0,0,218,8,102,117,108,108,110,97,109,101,218,6,108, - 111,97,100,101,114,218,8,112,111,114,116,105,111,110,115,218, - 3,109,115,103,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,17,95,102,105,110,100,95,109,111,100,117,108, - 101,95,115,104,105,109,228,1,0,0,115,10,0,0,0,0, - 10,14,1,16,1,4,1,22,1,114,143,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,4, - 0,0,0,67,0,0,0,115,166,0,0,0,124,0,100,1, - 100,2,133,2,25,0,125,3,124,3,116,0,107,3,114,64, - 100,3,124,1,155,2,100,4,124,3,155,2,157,4,125,4, - 116,1,160,2,100,5,124,4,161,2,1,0,116,3,124,4, - 102,1,105,0,124,2,164,1,142,1,130,1,116,4,124,0, - 131,1,100,6,107,0,114,106,100,7,124,1,155,2,157,2, - 125,4,116,1,160,2,100,5,124,4,161,2,1,0,116,5, - 124,4,131,1,130,1,116,6,124,0,100,2,100,8,133,2, - 25,0,131,1,125,5,124,5,100,9,64,0,114,162,100,10, - 124,5,155,2,100,11,124,1,155,2,157,4,125,4,116,3, - 124,4,102,1,105,0,124,2,164,1,142,1,130,1,124,5, - 83,0,41,12,97,84,2,0,0,80,101,114,102,111,114,109, - 32,98,97,115,105,99,32,118,97,108,105,100,105,116,121,32, - 99,104,101,99,107,105,110,103,32,111,102,32,97,32,112,121, - 99,32,104,101,97,100,101,114,32,97,110,100,32,114,101,116, - 117,114,110,32,116,104,101,32,102,108,97,103,115,32,102,105, - 101,108,100,44,10,32,32,32,32,119,104,105,99,104,32,100, - 101,116,101,114,109,105,110,101,115,32,104,111,119,32,116,104, - 101,32,112,121,99,32,115,104,111,117,108,100,32,98,101,32, - 102,117,114,116,104,101,114,32,118,97,108,105,100,97,116,101, - 100,32,97,103,97,105,110,115,116,32,116,104,101,32,115,111, - 117,114,99,101,46,10,10,32,32,32,32,42,100,97,116,97, - 42,32,105,115,32,116,104,101,32,99,111,110,116,101,110,116, - 115,32,111,102,32,116,104,101,32,112,121,99,32,102,105,108, - 101,46,32,40,79,110,108,121,32,116,104,101,32,102,105,114, - 115,116,32,49,54,32,98,121,116,101,115,32,97,114,101,10, - 32,32,32,32,114,101,113,117,105,114,101,100,44,32,116,104, - 111,117,103,104,46,41,10,10,32,32,32,32,42,110,97,109, - 101,42,32,105,115,32,116,104,101,32,110,97,109,101,32,111, - 102,32,116,104,101,32,109,111,100,117,108,101,32,98,101,105, - 110,103,32,105,109,112,111,114,116,101,100,46,32,73,116,32, - 105,115,32,117,115,101,100,32,102,111,114,32,108,111,103,103, - 105,110,103,46,10,10,32,32,32,32,42,101,120,99,95,100, - 101,116,97,105,108,115,42,32,105,115,32,97,32,100,105,99, - 116,105,111,110,97,114,121,32,112,97,115,115,101,100,32,116, - 111,32,73,109,112,111,114,116,69,114,114,111,114,32,105,102, - 32,105,116,32,114,97,105,115,101,100,32,102,111,114,10,32, - 32,32,32,105,109,112,114,111,118,101,100,32,100,101,98,117, - 103,103,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,119,104,101,110,32,116,104,101, - 32,102,108,97,103,115,10,32,32,32,32,102,105,101,108,100, - 32,105,115,32,105,110,118,97,108,105,100,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,32,116,114,117, - 110,99,97,116,101,100,46,10,10,32,32,32,32,78,114,16, - 0,0,0,122,20,98,97,100,32,109,97,103,105,99,32,110, - 117,109,98,101,114,32,105,110,32,122,2,58,32,250,2,123, - 125,233,16,0,0,0,122,40,114,101,97,99,104,101,100,32, - 69,79,70,32,119,104,105,108,101,32,114,101,97,100,105,110, - 103,32,112,121,99,32,104,101,97,100,101,114,32,111,102,32, - 233,8,0,0,0,233,252,255,255,255,122,14,105,110,118,97, - 108,105,100,32,102,108,97,103,115,32,122,4,32,105,110,32, - 41,7,218,12,77,65,71,73,67,95,78,85,77,66,69,82, - 114,134,0,0,0,218,16,95,118,101,114,98,111,115,101,95, - 109,101,115,115,97,103,101,114,117,0,0,0,114,23,0,0, - 0,218,8,69,79,70,69,114,114,111,114,114,27,0,0,0, - 41,6,114,26,0,0,0,114,116,0,0,0,218,11,101,120, - 99,95,100,101,116,97,105,108,115,90,5,109,97,103,105,99, - 114,92,0,0,0,114,2,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,13,95,99,108,97,115, - 115,105,102,121,95,112,121,99,245,1,0,0,115,28,0,0, - 0,0,16,12,1,8,1,16,1,12,1,16,1,12,1,10, - 1,12,1,8,1,16,2,8,1,16,1,16,1,114,152,0, - 0,0,99,5,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,4,0,0,0,67,0,0,0,115,120,0,0,0, - 116,0,124,0,100,1,100,2,133,2,25,0,131,1,124,1, - 100,3,64,0,107,3,114,62,100,4,124,3,155,2,157,2, - 125,5,116,1,160,2,100,5,124,5,161,2,1,0,116,3, - 124,5,102,1,105,0,124,4,164,1,142,1,130,1,124,2, - 100,6,117,1,114,116,116,0,124,0,100,2,100,7,133,2, - 25,0,131,1,124,2,100,3,64,0,107,3,114,116,116,3, - 100,4,124,3,155,2,157,2,102,1,105,0,124,4,164,1, - 142,1,130,1,100,6,83,0,41,8,97,7,2,0,0,86, - 97,108,105,100,97,116,101,32,97,32,112,121,99,32,97,103, - 97,105,110,115,116,32,116,104,101,32,115,111,117,114,99,101, - 32,108,97,115,116,45,109,111,100,105,102,105,101,100,32,116, - 105,109,101,46,10,10,32,32,32,32,42,100,97,116,97,42, - 32,105,115,32,116,104,101,32,99,111,110,116,101,110,116,115, - 32,111,102,32,116,104,101,32,112,121,99,32,102,105,108,101, - 46,32,40,79,110,108,121,32,116,104,101,32,102,105,114,115, - 116,32,49,54,32,98,121,116,101,115,32,97,114,101,10,32, - 32,32,32,114,101,113,117,105,114,101,100,46,41,10,10,32, - 32,32,32,42,115,111,117,114,99,101,95,109,116,105,109,101, - 42,32,105,115,32,116,104,101,32,108,97,115,116,32,109,111, - 100,105,102,105,101,100,32,116,105,109,101,115,116,97,109,112, - 32,111,102,32,116,104,101,32,115,111,117,114,99,101,32,102, - 105,108,101,46,10,10,32,32,32,32,42,115,111,117,114,99, - 101,95,115,105,122,101,42,32,105,115,32,78,111,110,101,32, - 111,114,32,116,104,101,32,115,105,122,101,32,111,102,32,116, - 104,101,32,115,111,117,114,99,101,32,102,105,108,101,32,105, - 110,32,98,121,116,101,115,46,10,10,32,32,32,32,42,110, - 97,109,101,42,32,105,115,32,116,104,101,32,110,97,109,101, - 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,98, - 101,105,110,103,32,105,109,112,111,114,116,101,100,46,32,73, - 116,32,105,115,32,117,115,101,100,32,102,111,114,32,108,111, - 103,103,105,110,103,46,10,10,32,32,32,32,42,101,120,99, - 95,100,101,116,97,105,108,115,42,32,105,115,32,97,32,100, - 105,99,116,105,111,110,97,114,121,32,112,97,115,115,101,100, - 32,116,111,32,73,109,112,111,114,116,69,114,114,111,114,32, - 105,102,32,105,116,32,114,97,105,115,101,100,32,102,111,114, - 10,32,32,32,32,105,109,112,114,111,118,101,100,32,100,101, - 98,117,103,103,105,110,103,46,10,10,32,32,32,32,65,110, - 32,73,109,112,111,114,116,69,114,114,111,114,32,105,115,32, - 114,97,105,115,101,100,32,105,102,32,116,104,101,32,98,121, - 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,46, - 10,10,32,32,32,32,114,146,0,0,0,233,12,0,0,0, - 114,15,0,0,0,122,22,98,121,116,101,99,111,100,101,32, - 105,115,32,115,116,97,108,101,32,102,111,114,32,114,144,0, - 0,0,78,114,145,0,0,0,41,4,114,27,0,0,0,114, - 134,0,0,0,114,149,0,0,0,114,117,0,0,0,41,6, - 114,26,0,0,0,218,12,115,111,117,114,99,101,95,109,116, - 105,109,101,218,11,115,111,117,114,99,101,95,115,105,122,101, - 114,116,0,0,0,114,151,0,0,0,114,92,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,23, - 95,118,97,108,105,100,97,116,101,95,116,105,109,101,115,116, - 97,109,112,95,112,121,99,22,2,0,0,115,16,0,0,0, - 0,19,24,1,10,1,12,1,16,1,8,1,22,255,2,2, - 114,156,0,0,0,99,4,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,42, - 0,0,0,124,0,100,1,100,2,133,2,25,0,124,1,107, - 3,114,38,116,0,100,3,124,2,155,2,157,2,102,1,105, - 0,124,3,164,1,142,1,130,1,100,4,83,0,41,5,97, - 243,1,0,0,86,97,108,105,100,97,116,101,32,97,32,104, - 97,115,104,45,98,97,115,101,100,32,112,121,99,32,98,121, - 32,99,104,101,99,107,105,110,103,32,116,104,101,32,114,101, - 97,108,32,115,111,117,114,99,101,32,104,97,115,104,32,97, - 103,97,105,110,115,116,32,116,104,101,32,111,110,101,32,105, - 110,10,32,32,32,32,116,104,101,32,112,121,99,32,104,101, - 97,100,101,114,46,10,10,32,32,32,32,42,100,97,116,97, - 42,32,105,115,32,116,104,101,32,99,111,110,116,101,110,116, - 115,32,111,102,32,116,104,101,32,112,121,99,32,102,105,108, - 101,46,32,40,79,110,108,121,32,116,104,101,32,102,105,114, - 115,116,32,49,54,32,98,121,116,101,115,32,97,114,101,10, - 32,32,32,32,114,101,113,117,105,114,101,100,46,41,10,10, - 32,32,32,32,42,115,111,117,114,99,101,95,104,97,115,104, - 42,32,105,115,32,116,104,101,32,105,109,112,111,114,116,108, - 105,98,46,117,116,105,108,46,115,111,117,114,99,101,95,104, - 97,115,104,40,41,32,111,102,32,116,104,101,32,115,111,117, - 114,99,101,32,102,105,108,101,46,10,10,32,32,32,32,42, - 110,97,109,101,42,32,105,115,32,116,104,101,32,110,97,109, - 101,32,111,102,32,116,104,101,32,109,111,100,117,108,101,32, - 98,101,105,110,103,32,105,109,112,111,114,116,101,100,46,32, - 73,116,32,105,115,32,117,115,101,100,32,102,111,114,32,108, - 111,103,103,105,110,103,46,10,10,32,32,32,32,42,101,120, - 99,95,100,101,116,97,105,108,115,42,32,105,115,32,97,32, - 100,105,99,116,105,111,110,97,114,121,32,112,97,115,115,101, - 100,32,116,111,32,73,109,112,111,114,116,69,114,114,111,114, - 32,105,102,32,105,116,32,114,97,105,115,101,100,32,102,111, - 114,10,32,32,32,32,105,109,112,114,111,118,101,100,32,100, - 101,98,117,103,103,105,110,103,46,10,10,32,32,32,32,65, - 110,32,73,109,112,111,114,116,69,114,114,111,114,32,105,115, - 32,114,97,105,115,101,100,32,105,102,32,116,104,101,32,98, - 121,116,101,99,111,100,101,32,105,115,32,115,116,97,108,101, - 46,10,10,32,32,32,32,114,146,0,0,0,114,145,0,0, - 0,122,46,104,97,115,104,32,105,110,32,98,121,116,101,99, - 111,100,101,32,100,111,101,115,110,39,116,32,109,97,116,99, - 104,32,104,97,115,104,32,111,102,32,115,111,117,114,99,101, - 32,78,41,1,114,117,0,0,0,41,4,114,26,0,0,0, - 218,11,115,111,117,114,99,101,95,104,97,115,104,114,116,0, - 0,0,114,151,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,218,18,95,118,97,108,105,100,97,116, - 101,95,104,97,115,104,95,112,121,99,50,2,0,0,115,12, - 0,0,0,0,17,16,1,2,1,8,255,4,2,2,254,114, - 158,0,0,0,99,4,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,5,0,0,0,67,0,0,0,115,80,0, - 0,0,116,0,160,1,124,0,161,1,125,4,116,2,124,4, - 116,3,131,2,114,56,116,4,160,5,100,1,124,2,161,2, - 1,0,124,3,100,2,117,1,114,52,116,6,160,7,124,4, - 124,3,161,2,1,0,124,4,83,0,116,8,100,3,160,9, - 124,2,161,1,124,1,124,2,100,4,141,3,130,1,100,2, - 83,0,41,5,122,35,67,111,109,112,105,108,101,32,98,121, - 116,101,99,111,100,101,32,97,115,32,102,111,117,110,100,32, - 105,110,32,97,32,112,121,99,46,122,21,99,111,100,101,32, - 111,98,106,101,99,116,32,102,114,111,109,32,123,33,114,125, - 78,122,23,78,111,110,45,99,111,100,101,32,111,98,106,101, - 99,116,32,105,110,32,123,33,114,125,169,2,114,116,0,0, - 0,114,44,0,0,0,41,10,218,7,109,97,114,115,104,97, - 108,90,5,108,111,97,100,115,218,10,105,115,105,110,115,116, - 97,110,99,101,218,10,95,99,111,100,101,95,116,121,112,101, - 114,134,0,0,0,114,149,0,0,0,218,4,95,105,109,112, - 90,16,95,102,105,120,95,99,111,95,102,105,108,101,110,97, - 109,101,114,117,0,0,0,114,62,0,0,0,41,5,114,26, - 0,0,0,114,116,0,0,0,114,106,0,0,0,114,107,0, - 0,0,218,4,99,111,100,101,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,17,95,99,111,109,112,105,108, - 101,95,98,121,116,101,99,111,100,101,74,2,0,0,115,18, - 0,0,0,0,2,10,1,10,1,12,1,8,1,12,1,4, - 2,10,1,4,255,114,165,0,0,0,114,73,0,0,0,99, - 3,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 5,0,0,0,67,0,0,0,115,70,0,0,0,116,0,116, - 1,131,1,125,3,124,3,160,2,116,3,100,1,131,1,161, - 1,1,0,124,3,160,2,116,3,124,1,131,1,161,1,1, - 0,124,3,160,2,116,3,124,2,131,1,161,1,1,0,124, - 3,160,2,116,4,160,5,124,0,161,1,161,1,1,0,124, - 3,83,0,41,2,122,43,80,114,111,100,117,99,101,32,116, - 104,101,32,100,97,116,97,32,102,111,114,32,97,32,116,105, - 109,101,115,116,97,109,112,45,98,97,115,101,100,32,112,121, - 99,46,114,73,0,0,0,41,6,218,9,98,121,116,101,97, - 114,114,97,121,114,148,0,0,0,218,6,101,120,116,101,110, - 100,114,21,0,0,0,114,160,0,0,0,218,5,100,117,109, - 112,115,41,4,114,164,0,0,0,218,5,109,116,105,109,101, - 114,155,0,0,0,114,26,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,22,95,99,111,100,101, - 95,116,111,95,116,105,109,101,115,116,97,109,112,95,112,121, - 99,87,2,0,0,115,12,0,0,0,0,2,8,1,14,1, - 14,1,14,1,16,1,114,170,0,0,0,84,99,3,0,0, - 0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0, - 0,67,0,0,0,115,80,0,0,0,116,0,116,1,131,1, - 125,3,100,1,124,2,100,1,62,0,66,0,125,4,124,3, - 160,2,116,3,124,4,131,1,161,1,1,0,116,4,124,1, - 131,1,100,2,107,2,115,50,74,0,130,1,124,3,160,2, - 124,1,161,1,1,0,124,3,160,2,116,5,160,6,124,0, - 161,1,161,1,1,0,124,3,83,0,41,3,122,38,80,114, - 111,100,117,99,101,32,116,104,101,32,100,97,116,97,32,102, - 111,114,32,97,32,104,97,115,104,45,98,97,115,101,100,32, - 112,121,99,46,114,39,0,0,0,114,146,0,0,0,41,7, - 114,166,0,0,0,114,148,0,0,0,114,167,0,0,0,114, - 21,0,0,0,114,23,0,0,0,114,160,0,0,0,114,168, - 0,0,0,41,5,114,164,0,0,0,114,157,0,0,0,90, - 7,99,104,101,99,107,101,100,114,26,0,0,0,114,2,0, + 5,95,119,114,97,112,219,1,0,0,115,12,0,0,0,8, + 1,10,1,20,1,14,1,4,128,255,128,122,26,95,99,104, + 101,99,107,95,110,97,109,101,46,60,108,111,99,97,108,115, + 62,46,95,119,114,97,112,41,1,78,41,3,218,10,95,98, + 111,111,116,115,116,114,97,112,114,133,0,0,0,218,9,78, + 97,109,101,69,114,114,111,114,41,3,114,122,0,0,0,114, + 123,0,0,0,114,133,0,0,0,114,5,0,0,0,114,121, + 0,0,0,114,8,0,0,0,218,11,95,99,104,101,99,107, + 95,110,97,109,101,200,1,0,0,115,16,0,0,0,14,8, + 2,7,10,1,12,1,14,2,10,5,4,1,255,128,114,136, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 5,0,0,0,6,0,0,0,67,0,0,0,115,60,0,0, + 0,124,0,160,0,124,1,161,1,92,2,125,2,125,3,124, + 2,100,1,117,0,114,56,116,1,124,3,131,1,114,56,100, + 2,125,4,116,2,160,3,124,4,160,4,124,3,100,3,25, + 0,161,1,116,5,161,2,1,0,124,2,83,0,41,4,122, + 155,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,10,10,32,32,32,32,84,104,105, + 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, + 101,99,97,116,101,100,32,105,110,32,102,97,118,111,114,32, + 111,102,32,102,105,110,100,101,114,46,102,105,110,100,95,115, + 112,101,99,40,41,46,10,10,32,32,32,32,78,122,44,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,114,73,0,0,0, + 41,6,218,11,102,105,110,100,95,108,111,97,100,101,114,114, + 23,0,0,0,114,75,0,0,0,114,76,0,0,0,114,62, + 0,0,0,218,13,73,109,112,111,114,116,87,97,114,110,105, + 110,103,41,5,114,118,0,0,0,218,8,102,117,108,108,110, + 97,109,101,218,6,108,111,97,100,101,114,218,8,112,111,114, + 116,105,111,110,115,218,3,109,115,103,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,17,95,102,105,110,100, + 95,109,111,100,117,108,101,95,115,104,105,109,228,1,0,0, + 115,12,0,0,0,14,10,16,1,4,1,22,1,4,1,255, + 128,114,143,0,0,0,99,3,0,0,0,0,0,0,0,0, + 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, + 166,0,0,0,124,0,100,1,100,2,133,2,25,0,125,3, + 124,3,116,0,107,3,114,64,100,3,124,1,155,2,100,4, + 124,3,155,2,157,4,125,4,116,1,160,2,100,5,124,4, + 161,2,1,0,116,3,124,4,102,1,105,0,124,2,164,1, + 142,1,130,1,116,4,124,0,131,1,100,6,107,0,114,106, + 100,7,124,1,155,2,157,2,125,4,116,1,160,2,100,5, + 124,4,161,2,1,0,116,5,124,4,131,1,130,1,116,6, + 124,0,100,2,100,8,133,2,25,0,131,1,125,5,124,5, + 100,9,64,0,114,162,100,10,124,5,155,2,100,11,124,1, + 155,2,157,4,125,4,116,3,124,4,102,1,105,0,124,2, + 164,1,142,1,130,1,124,5,83,0,41,12,97,84,2,0, + 0,80,101,114,102,111,114,109,32,98,97,115,105,99,32,118, + 97,108,105,100,105,116,121,32,99,104,101,99,107,105,110,103, + 32,111,102,32,97,32,112,121,99,32,104,101,97,100,101,114, + 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32, + 102,108,97,103,115,32,102,105,101,108,100,44,10,32,32,32, + 32,119,104,105,99,104,32,100,101,116,101,114,109,105,110,101, + 115,32,104,111,119,32,116,104,101,32,112,121,99,32,115,104, + 111,117,108,100,32,98,101,32,102,117,114,116,104,101,114,32, + 118,97,108,105,100,97,116,101,100,32,97,103,97,105,110,115, + 116,32,116,104,101,32,115,111,117,114,99,101,46,10,10,32, + 32,32,32,42,100,97,116,97,42,32,105,115,32,116,104,101, + 32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101, + 32,112,121,99,32,102,105,108,101,46,32,40,79,110,108,121, + 32,116,104,101,32,102,105,114,115,116,32,49,54,32,98,121, + 116,101,115,32,97,114,101,10,32,32,32,32,114,101,113,117, + 105,114,101,100,44,32,116,104,111,117,103,104,46,41,10,10, + 32,32,32,32,42,110,97,109,101,42,32,105,115,32,116,104, + 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, + 100,117,108,101,32,98,101,105,110,103,32,105,109,112,111,114, + 116,101,100,46,32,73,116,32,105,115,32,117,115,101,100,32, + 102,111,114,32,108,111,103,103,105,110,103,46,10,10,32,32, + 32,32,42,101,120,99,95,100,101,116,97,105,108,115,42,32, + 105,115,32,97,32,100,105,99,116,105,111,110,97,114,121,32, + 112,97,115,115,101,100,32,116,111,32,73,109,112,111,114,116, + 69,114,114,111,114,32,105,102,32,105,116,32,114,97,105,115, + 101,100,32,102,111,114,10,32,32,32,32,105,109,112,114,111, + 118,101,100,32,100,101,98,117,103,103,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, + 119,104,101,110,32,116,104,101,32,102,108,97,103,115,10,32, + 32,32,32,102,105,101,108,100,32,105,115,32,105,110,118,97, + 108,105,100,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,32,116,114,117,110,99,97,116,101,100,46,10, + 10,32,32,32,32,78,114,16,0,0,0,122,20,98,97,100, + 32,109,97,103,105,99,32,110,117,109,98,101,114,32,105,110, + 32,122,2,58,32,250,2,123,125,233,16,0,0,0,122,40, + 114,101,97,99,104,101,100,32,69,79,70,32,119,104,105,108, + 101,32,114,101,97,100,105,110,103,32,112,121,99,32,104,101, + 97,100,101,114,32,111,102,32,233,8,0,0,0,233,252,255, + 255,255,122,14,105,110,118,97,108,105,100,32,102,108,97,103, + 115,32,122,4,32,105,110,32,41,7,218,12,77,65,71,73, + 67,95,78,85,77,66,69,82,114,134,0,0,0,218,16,95, + 118,101,114,98,111,115,101,95,109,101,115,115,97,103,101,114, + 117,0,0,0,114,23,0,0,0,218,8,69,79,70,69,114, + 114,111,114,114,27,0,0,0,41,6,114,26,0,0,0,114, + 116,0,0,0,218,11,101,120,99,95,100,101,116,97,105,108, + 115,90,5,109,97,103,105,99,114,92,0,0,0,114,2,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,17,95,99,111,100,101,95,116,111,95,104,97,115,104, - 95,112,121,99,97,2,0,0,115,14,0,0,0,0,2,8, - 1,12,1,14,1,16,1,10,1,16,1,114,171,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,6,0,0,0,67,0,0,0,115,62,0,0,0,100,1, - 100,2,108,0,125,1,116,1,160,2,124,0,161,1,106,3, - 125,2,124,1,160,4,124,2,161,1,125,3,116,1,160,5, - 100,2,100,3,161,2,125,4,124,4,160,6,124,0,160,6, - 124,3,100,1,25,0,161,1,161,1,83,0,41,4,122,121, - 68,101,99,111,100,101,32,98,121,116,101,115,32,114,101,112, - 114,101,115,101,110,116,105,110,103,32,115,111,117,114,99,101, - 32,99,111,100,101,32,97,110,100,32,114,101,116,117,114,110, - 32,116,104,101,32,115,116,114,105,110,103,46,10,10,32,32, - 32,32,85,110,105,118,101,114,115,97,108,32,110,101,119,108, - 105,110,101,32,115,117,112,112,111,114,116,32,105,115,32,117, - 115,101,100,32,105,110,32,116,104,101,32,100,101,99,111,100, - 105,110,103,46,10,32,32,32,32,114,73,0,0,0,78,84, - 41,7,218,8,116,111,107,101,110,105,122,101,114,64,0,0, - 0,90,7,66,121,116,101,115,73,79,90,8,114,101,97,100, - 108,105,110,101,90,15,100,101,116,101,99,116,95,101,110,99, - 111,100,105,110,103,90,25,73,110,99,114,101,109,101,110,116, - 97,108,78,101,119,108,105,110,101,68,101,99,111,100,101,114, - 218,6,100,101,99,111,100,101,41,5,218,12,115,111,117,114, - 99,101,95,98,121,116,101,115,114,172,0,0,0,90,21,115, - 111,117,114,99,101,95,98,121,116,101,115,95,114,101,97,100, - 108,105,110,101,218,8,101,110,99,111,100,105,110,103,90,15, - 110,101,119,108,105,110,101,95,100,101,99,111,100,101,114,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,13, - 100,101,99,111,100,101,95,115,111,117,114,99,101,108,2,0, - 0,115,10,0,0,0,0,5,8,1,12,1,10,1,12,1, - 114,176,0,0,0,169,2,114,140,0,0,0,218,26,115,117, - 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, - 111,99,97,116,105,111,110,115,99,2,0,0,0,0,0,0, - 0,2,0,0,0,9,0,0,0,8,0,0,0,67,0,0, - 0,115,10,1,0,0,124,1,100,1,117,0,114,56,100,2, - 125,1,116,0,124,2,100,3,131,2,114,66,122,14,124,2, - 160,1,124,0,161,1,125,1,87,0,110,28,4,0,116,2, - 121,54,1,0,1,0,1,0,89,0,110,12,48,0,116,3, - 160,4,124,1,161,1,125,1,116,5,106,6,124,0,124,2, - 124,1,100,4,141,3,125,4,100,5,124,4,95,7,124,2, - 100,1,117,0,114,150,116,8,131,0,68,0,93,42,92,2, - 125,5,125,6,124,1,160,9,116,10,124,6,131,1,161,1, - 114,102,124,5,124,0,124,1,131,2,125,2,124,2,124,4, - 95,11,1,0,113,150,113,102,100,1,83,0,124,3,116,12, - 117,0,114,214,116,0,124,2,100,6,131,2,114,220,122,14, - 124,2,160,13,124,0,161,1,125,7,87,0,110,18,4,0, - 116,2,121,200,1,0,1,0,1,0,89,0,110,20,48,0, - 124,7,114,220,103,0,124,4,95,14,110,6,124,3,124,4, - 95,14,124,4,106,14,103,0,107,2,144,1,114,6,124,1, - 144,1,114,6,116,15,124,1,131,1,100,7,25,0,125,8, - 124,4,106,14,160,16,124,8,161,1,1,0,124,4,83,0, - 41,8,97,61,1,0,0,82,101,116,117,114,110,32,97,32, - 109,111,100,117,108,101,32,115,112,101,99,32,98,97,115,101, - 100,32,111,110,32,97,32,102,105,108,101,32,108,111,99,97, - 116,105,111,110,46,10,10,32,32,32,32,84,111,32,105,110, - 100,105,99,97,116,101,32,116,104,97,116,32,116,104,101,32, - 109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,107, - 97,103,101,44,32,115,101,116,10,32,32,32,32,115,117,98, - 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, - 99,97,116,105,111,110,115,32,116,111,32,97,32,108,105,115, - 116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,112, - 97,116,104,115,46,32,32,65,110,10,32,32,32,32,101,109, - 112,116,121,32,108,105,115,116,32,105,115,32,115,117,102,102, - 105,99,105,101,110,116,44,32,116,104,111,117,103,104,32,105, - 116,115,32,110,111,116,32,111,116,104,101,114,119,105,115,101, - 32,117,115,101,102,117,108,32,116,111,32,116,104,101,10,32, - 32,32,32,105,109,112,111,114,116,32,115,121,115,116,101,109, - 46,10,10,32,32,32,32,84,104,101,32,108,111,97,100,101, - 114,32,109,117,115,116,32,116,97,107,101,32,97,32,115,112, - 101,99,32,97,115,32,105,116,115,32,111,110,108,121,32,95, - 95,105,110,105,116,95,95,40,41,32,97,114,103,46,10,10, - 32,32,32,32,78,122,9,60,117,110,107,110,111,119,110,62, - 218,12,103,101,116,95,102,105,108,101,110,97,109,101,169,1, - 218,6,111,114,105,103,105,110,84,218,10,105,115,95,112,97, - 99,107,97,103,101,114,73,0,0,0,41,17,114,128,0,0, - 0,114,179,0,0,0,114,117,0,0,0,114,4,0,0,0, - 114,79,0,0,0,114,134,0,0,0,218,10,77,111,100,117, - 108,101,83,112,101,99,90,13,95,115,101,116,95,102,105,108, - 101,97,116,116,114,218,27,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,114,110,0,0,0,114,111,0,0,0,114,140,0,0, - 0,218,9,95,80,79,80,85,76,65,84,69,114,182,0,0, - 0,114,178,0,0,0,114,47,0,0,0,218,6,97,112,112, - 101,110,100,41,9,114,116,0,0,0,90,8,108,111,99,97, - 116,105,111,110,114,140,0,0,0,114,178,0,0,0,218,4, - 115,112,101,99,218,12,108,111,97,100,101,114,95,99,108,97, - 115,115,218,8,115,117,102,102,105,120,101,115,114,182,0,0, - 0,90,7,100,105,114,110,97,109,101,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,23,115,112,101,99,95, - 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, - 111,110,125,2,0,0,115,62,0,0,0,0,12,8,4,4, - 1,10,2,2,1,14,1,12,1,6,2,10,8,16,1,6, - 3,8,1,14,1,14,1,10,1,6,1,6,2,4,3,8, - 2,10,1,2,1,14,1,12,1,6,2,4,1,8,2,6, - 1,12,1,6,1,12,1,12,2,114,190,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,64,0,0,0,115,80,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,90,4,100,3,90,5, - 100,4,90,6,101,7,100,5,100,6,132,0,131,1,90,8, - 101,7,100,7,100,8,132,0,131,1,90,9,101,7,100,14, - 100,10,100,11,132,1,131,1,90,10,101,7,100,15,100,12, - 100,13,132,1,131,1,90,11,100,9,83,0,41,16,218,21, - 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, - 105,110,100,101,114,122,62,77,101,116,97,32,112,97,116,104, - 32,102,105,110,100,101,114,32,102,111,114,32,109,111,100,117, - 108,101,115,32,100,101,99,108,97,114,101,100,32,105,110,32, - 116,104,101,32,87,105,110,100,111,119,115,32,114,101,103,105, - 115,116,114,121,46,122,59,83,111,102,116,119,97,114,101,92, - 80,121,116,104,111,110,92,80,121,116,104,111,110,67,111,114, - 101,92,123,115,121,115,95,118,101,114,115,105,111,110,125,92, - 77,111,100,117,108,101,115,92,123,102,117,108,108,110,97,109, - 101,125,122,65,83,111,102,116,119,97,114,101,92,80,121,116, - 104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123, - 115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100, - 117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,92, - 68,101,98,117,103,70,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, - 50,0,0,0,122,16,116,0,160,1,116,0,106,2,124,1, - 161,2,87,0,83,0,4,0,116,3,121,48,1,0,1,0, - 1,0,116,0,160,1,116,0,106,4,124,1,161,2,6,0, - 89,0,83,0,48,0,114,109,0,0,0,41,5,218,6,119, - 105,110,114,101,103,90,7,79,112,101,110,75,101,121,90,17, - 72,75,69,89,95,67,85,82,82,69,78,84,95,85,83,69, - 82,114,50,0,0,0,90,18,72,75,69,89,95,76,79,67, - 65,76,95,77,65,67,72,73,78,69,41,2,218,3,99,108, - 115,114,7,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,14,95,111,112,101,110,95,114,101,103, - 105,115,116,114,121,205,2,0,0,115,8,0,0,0,0,2, - 2,1,16,1,12,1,122,36,87,105,110,100,111,119,115,82, + 0,218,13,95,99,108,97,115,115,105,102,121,95,112,121,99, + 245,1,0,0,115,30,0,0,0,12,16,8,1,16,1,12, + 1,16,1,12,1,10,1,12,1,8,1,16,1,8,2,16, + 1,16,1,4,1,255,128,114,152,0,0,0,99,5,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, + 0,67,0,0,0,115,120,0,0,0,116,0,124,0,100,1, + 100,2,133,2,25,0,131,1,124,1,100,3,64,0,107,3, + 114,62,100,4,124,3,155,2,157,2,125,5,116,1,160,2, + 100,5,124,5,161,2,1,0,116,3,124,5,102,1,105,0, + 124,4,164,1,142,1,130,1,124,2,100,6,117,1,114,116, + 116,0,124,0,100,2,100,7,133,2,25,0,131,1,124,2, + 100,3,64,0,107,3,114,116,116,3,100,4,124,3,155,2, + 157,2,102,1,105,0,124,4,164,1,142,1,130,1,100,6, + 83,0,41,8,97,7,2,0,0,86,97,108,105,100,97,116, + 101,32,97,32,112,121,99,32,97,103,97,105,110,115,116,32, + 116,104,101,32,115,111,117,114,99,101,32,108,97,115,116,45, + 109,111,100,105,102,105,101,100,32,116,105,109,101,46,10,10, + 32,32,32,32,42,100,97,116,97,42,32,105,115,32,116,104, + 101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104, + 101,32,112,121,99,32,102,105,108,101,46,32,40,79,110,108, + 121,32,116,104,101,32,102,105,114,115,116,32,49,54,32,98, + 121,116,101,115,32,97,114,101,10,32,32,32,32,114,101,113, + 117,105,114,101,100,46,41,10,10,32,32,32,32,42,115,111, + 117,114,99,101,95,109,116,105,109,101,42,32,105,115,32,116, + 104,101,32,108,97,115,116,32,109,111,100,105,102,105,101,100, + 32,116,105,109,101,115,116,97,109,112,32,111,102,32,116,104, + 101,32,115,111,117,114,99,101,32,102,105,108,101,46,10,10, + 32,32,32,32,42,115,111,117,114,99,101,95,115,105,122,101, + 42,32,105,115,32,78,111,110,101,32,111,114,32,116,104,101, + 32,115,105,122,101,32,111,102,32,116,104,101,32,115,111,117, + 114,99,101,32,102,105,108,101,32,105,110,32,98,121,116,101, + 115,46,10,10,32,32,32,32,42,110,97,109,101,42,32,105, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105, + 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117, + 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46, + 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105, + 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110, + 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32, + 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105, + 109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,110, + 103,46,10,10,32,32,32,32,65,110,32,73,109,112,111,114, + 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, + 32,105,102,32,116,104,101,32,98,121,116,101,99,111,100,101, + 32,105,115,32,115,116,97,108,101,46,10,10,32,32,32,32, + 114,146,0,0,0,233,12,0,0,0,114,15,0,0,0,122, + 22,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97, + 108,101,32,102,111,114,32,114,144,0,0,0,78,114,145,0, + 0,0,41,4,114,27,0,0,0,114,134,0,0,0,114,149, + 0,0,0,114,117,0,0,0,41,6,114,26,0,0,0,218, + 12,115,111,117,114,99,101,95,109,116,105,109,101,218,11,115, + 111,117,114,99,101,95,115,105,122,101,114,116,0,0,0,114, + 151,0,0,0,114,92,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,23,95,118,97,108,105,100, + 97,116,101,95,116,105,109,101,115,116,97,109,112,95,112,121, + 99,22,2,0,0,115,20,0,0,0,24,19,10,1,12,1, + 16,1,8,1,22,1,2,255,22,2,4,128,255,128,114,156, + 0,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,4,0,0,0,67,0,0,0,115,42,0,0, + 0,124,0,100,1,100,2,133,2,25,0,124,1,107,3,114, + 38,116,0,100,3,124,2,155,2,157,2,102,1,105,0,124, + 3,164,1,142,1,130,1,100,4,83,0,41,5,97,243,1, + 0,0,86,97,108,105,100,97,116,101,32,97,32,104,97,115, + 104,45,98,97,115,101,100,32,112,121,99,32,98,121,32,99, + 104,101,99,107,105,110,103,32,116,104,101,32,114,101,97,108, + 32,115,111,117,114,99,101,32,104,97,115,104,32,97,103,97, + 105,110,115,116,32,116,104,101,32,111,110,101,32,105,110,10, + 32,32,32,32,116,104,101,32,112,121,99,32,104,101,97,100, + 101,114,46,10,10,32,32,32,32,42,100,97,116,97,42,32, + 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32, + 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46, + 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116, + 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32, + 32,32,114,101,113,117,105,114,101,100,46,41,10,10,32,32, + 32,32,42,115,111,117,114,99,101,95,104,97,115,104,42,32, + 105,115,32,116,104,101,32,105,109,112,111,114,116,108,105,98, + 46,117,116,105,108,46,115,111,117,114,99,101,95,104,97,115, + 104,40,41,32,111,102,32,116,104,101,32,115,111,117,114,99, + 101,32,102,105,108,101,46,10,10,32,32,32,32,42,110,97, + 109,101,42,32,105,115,32,116,104,101,32,110,97,109,101,32, + 111,102,32,116,104,101,32,109,111,100,117,108,101,32,98,101, + 105,110,103,32,105,109,112,111,114,116,101,100,46,32,73,116, + 32,105,115,32,117,115,101,100,32,102,111,114,32,108,111,103, + 103,105,110,103,46,10,10,32,32,32,32,42,101,120,99,95, + 100,101,116,97,105,108,115,42,32,105,115,32,97,32,100,105, + 99,116,105,111,110,97,114,121,32,112,97,115,115,101,100,32, + 116,111,32,73,109,112,111,114,116,69,114,114,111,114,32,105, + 102,32,105,116,32,114,97,105,115,101,100,32,102,111,114,10, + 32,32,32,32,105,109,112,114,111,118,101,100,32,100,101,98, + 117,103,103,105,110,103,46,10,10,32,32,32,32,65,110,32, + 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114, + 97,105,115,101,100,32,105,102,32,116,104,101,32,98,121,116, + 101,99,111,100,101,32,105,115,32,115,116,97,108,101,46,10, + 10,32,32,32,32,114,146,0,0,0,114,145,0,0,0,122, + 46,104,97,115,104,32,105,110,32,98,121,116,101,99,111,100, + 101,32,100,111,101,115,110,39,116,32,109,97,116,99,104,32, + 104,97,115,104,32,111,102,32,115,111,117,114,99,101,32,78, + 41,1,114,117,0,0,0,41,4,114,26,0,0,0,218,11, + 115,111,117,114,99,101,95,104,97,115,104,114,116,0,0,0, + 114,151,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,18,95,118,97,108,105,100,97,116,101,95, + 104,97,115,104,95,112,121,99,50,2,0,0,115,16,0,0, + 0,16,17,2,1,8,1,4,255,2,2,6,254,4,128,255, + 128,114,158,0,0,0,99,4,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, + 80,0,0,0,116,0,160,1,124,0,161,1,125,4,116,2, + 124,4,116,3,131,2,114,56,116,4,160,5,100,1,124,2, + 161,2,1,0,124,3,100,2,117,1,114,52,116,6,160,7, + 124,4,124,3,161,2,1,0,124,4,83,0,116,8,100,3, + 160,9,124,2,161,1,124,1,124,2,100,4,141,3,130,1, + 100,2,83,0,41,5,122,35,67,111,109,112,105,108,101,32, + 98,121,116,101,99,111,100,101,32,97,115,32,102,111,117,110, + 100,32,105,110,32,97,32,112,121,99,46,122,21,99,111,100, + 101,32,111,98,106,101,99,116,32,102,114,111,109,32,123,33, + 114,125,78,122,23,78,111,110,45,99,111,100,101,32,111,98, + 106,101,99,116,32,105,110,32,123,33,114,125,169,2,114,116, + 0,0,0,114,44,0,0,0,41,10,218,7,109,97,114,115, + 104,97,108,90,5,108,111,97,100,115,218,10,105,115,105,110, + 115,116,97,110,99,101,218,10,95,99,111,100,101,95,116,121, + 112,101,114,134,0,0,0,114,149,0,0,0,218,4,95,105, + 109,112,90,16,95,102,105,120,95,99,111,95,102,105,108,101, + 110,97,109,101,114,117,0,0,0,114,62,0,0,0,41,5, + 114,26,0,0,0,114,116,0,0,0,114,106,0,0,0,114, + 107,0,0,0,218,4,99,111,100,101,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,17,95,99,111,109,112, + 105,108,101,95,98,121,116,101,99,111,100,101,74,2,0,0, + 115,22,0,0,0,10,2,10,1,12,1,8,1,12,1,4, + 1,10,2,4,1,6,255,4,128,255,128,114,165,0,0,0, + 114,73,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,5,0,0,0,67,0,0,0,115,70, + 0,0,0,116,0,116,1,131,1,125,3,124,3,160,2,116, + 3,100,1,131,1,161,1,1,0,124,3,160,2,116,3,124, + 1,131,1,161,1,1,0,124,3,160,2,116,3,124,2,131, + 1,161,1,1,0,124,3,160,2,116,4,160,5,124,0,161, + 1,161,1,1,0,124,3,83,0,41,2,122,43,80,114,111, + 100,117,99,101,32,116,104,101,32,100,97,116,97,32,102,111, + 114,32,97,32,116,105,109,101,115,116,97,109,112,45,98,97, + 115,101,100,32,112,121,99,46,114,73,0,0,0,41,6,218, + 9,98,121,116,101,97,114,114,97,121,114,148,0,0,0,218, + 6,101,120,116,101,110,100,114,21,0,0,0,114,160,0,0, + 0,218,5,100,117,109,112,115,41,4,114,164,0,0,0,218, + 5,109,116,105,109,101,114,155,0,0,0,114,26,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 22,95,99,111,100,101,95,116,111,95,116,105,109,101,115,116, + 97,109,112,95,112,121,99,87,2,0,0,115,14,0,0,0, + 8,2,14,1,14,1,14,1,16,1,4,1,255,128,114,170, + 0,0,0,84,99,3,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,5,0,0,0,67,0,0,0,115,80,0, + 0,0,116,0,116,1,131,1,125,3,100,1,124,2,100,1, + 62,0,66,0,125,4,124,3,160,2,116,3,124,4,131,1, + 161,1,1,0,116,4,124,1,131,1,100,2,107,2,115,50, + 74,0,130,1,124,3,160,2,124,1,161,1,1,0,124,3, + 160,2,116,5,160,6,124,0,161,1,161,1,1,0,124,3, + 83,0,41,3,122,38,80,114,111,100,117,99,101,32,116,104, + 101,32,100,97,116,97,32,102,111,114,32,97,32,104,97,115, + 104,45,98,97,115,101,100,32,112,121,99,46,114,39,0,0, + 0,114,146,0,0,0,41,7,114,166,0,0,0,114,148,0, + 0,0,114,167,0,0,0,114,21,0,0,0,114,23,0,0, + 0,114,160,0,0,0,114,168,0,0,0,41,5,114,164,0, + 0,0,114,157,0,0,0,90,7,99,104,101,99,107,101,100, + 114,26,0,0,0,114,2,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,17,95,99,111,100,101, + 95,116,111,95,104,97,115,104,95,112,121,99,97,2,0,0, + 115,16,0,0,0,8,2,12,1,14,1,16,1,10,1,16, + 1,4,1,255,128,114,171,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,67, + 0,0,0,115,62,0,0,0,100,1,100,2,108,0,125,1, + 116,1,160,2,124,0,161,1,106,3,125,2,124,1,160,4, + 124,2,161,1,125,3,116,1,160,5,100,2,100,3,161,2, + 125,4,124,4,160,6,124,0,160,6,124,3,100,1,25,0, + 161,1,161,1,83,0,41,4,122,121,68,101,99,111,100,101, + 32,98,121,116,101,115,32,114,101,112,114,101,115,101,110,116, + 105,110,103,32,115,111,117,114,99,101,32,99,111,100,101,32, + 97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,115, + 116,114,105,110,103,46,10,10,32,32,32,32,85,110,105,118, + 101,114,115,97,108,32,110,101,119,108,105,110,101,32,115,117, + 112,112,111,114,116,32,105,115,32,117,115,101,100,32,105,110, + 32,116,104,101,32,100,101,99,111,100,105,110,103,46,10,32, + 32,32,32,114,73,0,0,0,78,84,41,7,218,8,116,111, + 107,101,110,105,122,101,114,64,0,0,0,90,7,66,121,116, + 101,115,73,79,90,8,114,101,97,100,108,105,110,101,90,15, + 100,101,116,101,99,116,95,101,110,99,111,100,105,110,103,90, + 25,73,110,99,114,101,109,101,110,116,97,108,78,101,119,108, + 105,110,101,68,101,99,111,100,101,114,218,6,100,101,99,111, + 100,101,41,5,218,12,115,111,117,114,99,101,95,98,121,116, + 101,115,114,172,0,0,0,90,21,115,111,117,114,99,101,95, + 98,121,116,101,115,95,114,101,97,100,108,105,110,101,218,8, + 101,110,99,111,100,105,110,103,90,15,110,101,119,108,105,110, + 101,95,100,101,99,111,100,101,114,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,13,100,101,99,111,100,101, + 95,115,111,117,114,99,101,108,2,0,0,115,12,0,0,0, + 8,5,12,1,10,1,12,1,20,1,255,128,114,176,0,0, + 0,169,2,114,140,0,0,0,218,26,115,117,98,109,111,100, + 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, + 105,111,110,115,99,2,0,0,0,0,0,0,0,2,0,0, + 0,9,0,0,0,8,0,0,0,67,0,0,0,115,10,1, + 0,0,124,1,100,1,117,0,114,56,100,2,125,1,116,0, + 124,2,100,3,131,2,114,66,122,14,124,2,160,1,124,0, + 161,1,125,1,87,0,110,28,4,0,116,2,121,54,1,0, + 1,0,1,0,89,0,110,12,48,0,116,3,160,4,124,1, + 161,1,125,1,116,5,106,6,124,0,124,2,124,1,100,4, + 141,3,125,4,100,5,124,4,95,7,124,2,100,1,117,0, + 114,150,116,8,131,0,68,0,93,42,92,2,125,5,125,6, + 124,1,160,9,116,10,124,6,131,1,161,1,114,102,124,5, + 124,0,124,1,131,2,125,2,124,2,124,4,95,11,1,0, + 113,150,113,102,100,1,83,0,124,3,116,12,117,0,114,214, + 116,0,124,2,100,6,131,2,114,220,122,14,124,2,160,13, + 124,0,161,1,125,7,87,0,110,18,4,0,116,2,121,200, + 1,0,1,0,1,0,89,0,110,20,48,0,124,7,114,220, + 103,0,124,4,95,14,110,6,124,3,124,4,95,14,124,4, + 106,14,103,0,107,2,144,1,114,6,124,1,144,1,114,6, + 116,15,124,1,131,1,100,7,25,0,125,8,124,4,106,14, + 160,16,124,8,161,1,1,0,124,4,83,0,41,8,97,61, + 1,0,0,82,101,116,117,114,110,32,97,32,109,111,100,117, + 108,101,32,115,112,101,99,32,98,97,115,101,100,32,111,110, + 32,97,32,102,105,108,101,32,108,111,99,97,116,105,111,110, + 46,10,10,32,32,32,32,84,111,32,105,110,100,105,99,97, + 116,101,32,116,104,97,116,32,116,104,101,32,109,111,100,117, + 108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,44, + 32,115,101,116,10,32,32,32,32,115,117,98,109,111,100,117, + 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, + 111,110,115,32,116,111,32,97,32,108,105,115,116,32,111,102, + 32,100,105,114,101,99,116,111,114,121,32,112,97,116,104,115, + 46,32,32,65,110,10,32,32,32,32,101,109,112,116,121,32, + 108,105,115,116,32,105,115,32,115,117,102,102,105,99,105,101, + 110,116,44,32,116,104,111,117,103,104,32,105,116,115,32,110, + 111,116,32,111,116,104,101,114,119,105,115,101,32,117,115,101, + 102,117,108,32,116,111,32,116,104,101,10,32,32,32,32,105, + 109,112,111,114,116,32,115,121,115,116,101,109,46,10,10,32, + 32,32,32,84,104,101,32,108,111,97,100,101,114,32,109,117, + 115,116,32,116,97,107,101,32,97,32,115,112,101,99,32,97, + 115,32,105,116,115,32,111,110,108,121,32,95,95,105,110,105, + 116,95,95,40,41,32,97,114,103,46,10,10,32,32,32,32, + 78,122,9,60,117,110,107,110,111,119,110,62,218,12,103,101, + 116,95,102,105,108,101,110,97,109,101,169,1,218,6,111,114, + 105,103,105,110,84,218,10,105,115,95,112,97,99,107,97,103, + 101,114,73,0,0,0,41,17,114,128,0,0,0,114,179,0, + 0,0,114,117,0,0,0,114,4,0,0,0,114,79,0,0, + 0,114,134,0,0,0,218,10,77,111,100,117,108,101,83,112, + 101,99,90,13,95,115,101,116,95,102,105,108,101,97,116,116, + 114,218,27,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,114,110, + 0,0,0,114,111,0,0,0,114,140,0,0,0,218,9,95, + 80,79,80,85,76,65,84,69,114,182,0,0,0,114,178,0, + 0,0,114,47,0,0,0,218,6,97,112,112,101,110,100,41, + 9,114,116,0,0,0,90,8,108,111,99,97,116,105,111,110, + 114,140,0,0,0,114,178,0,0,0,218,4,115,112,101,99, + 218,12,108,111,97,100,101,114,95,99,108,97,115,115,218,8, + 115,117,102,102,105,120,101,115,114,182,0,0,0,90,7,100, + 105,114,110,97,109,101,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,23,115,112,101,99,95,102,114,111,109, + 95,102,105,108,101,95,108,111,99,97,116,105,111,110,125,2, + 0,0,115,64,0,0,0,8,12,4,4,10,1,2,2,14, + 1,12,1,6,1,10,2,16,8,6,1,8,3,14,1,14, + 1,10,1,6,1,6,1,4,2,8,3,10,2,2,1,14, + 1,12,1,6,1,4,2,8,1,6,2,12,1,6,1,12, + 1,12,1,4,2,255,128,114,190,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,64,0,0,0,115,80,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,90,4,100,3,90,5,100,4, + 90,6,101,7,100,5,100,6,132,0,131,1,90,8,101,7, + 100,7,100,8,132,0,131,1,90,9,101,7,100,14,100,10, + 100,11,132,1,131,1,90,10,101,7,100,15,100,12,100,13, + 132,1,131,1,90,11,100,9,83,0,41,16,218,21,87,105, + 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, + 100,101,114,122,62,77,101,116,97,32,112,97,116,104,32,102, + 105,110,100,101,114,32,102,111,114,32,109,111,100,117,108,101, + 115,32,100,101,99,108,97,114,101,100,32,105,110,32,116,104, + 101,32,87,105,110,100,111,119,115,32,114,101,103,105,115,116, + 114,121,46,122,59,83,111,102,116,119,97,114,101,92,80,121, + 116,104,111,110,92,80,121,116,104,111,110,67,111,114,101,92, + 123,115,121,115,95,118,101,114,115,105,111,110,125,92,77,111, + 100,117,108,101,115,92,123,102,117,108,108,110,97,109,101,125, + 122,65,83,111,102,116,119,97,114,101,92,80,121,116,104,111, + 110,92,80,121,116,104,111,110,67,111,114,101,92,123,115,121, + 115,95,118,101,114,115,105,111,110,125,92,77,111,100,117,108, + 101,115,92,123,102,117,108,108,110,97,109,101,125,92,68,101, + 98,117,103,70,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,8,0,0,0,67,0,0,0,115,50,0, + 0,0,122,16,116,0,160,1,116,0,106,2,124,1,161,2, + 87,0,83,0,4,0,116,3,121,48,1,0,1,0,1,0, + 116,0,160,1,116,0,106,4,124,1,161,2,6,0,89,0, + 83,0,48,0,114,109,0,0,0,41,5,218,6,119,105,110, + 114,101,103,90,7,79,112,101,110,75,101,121,90,17,72,75, + 69,89,95,67,85,82,82,69,78,84,95,85,83,69,82,114, + 50,0,0,0,90,18,72,75,69,89,95,76,79,67,65,76, + 95,77,65,67,72,73,78,69,41,2,218,3,99,108,115,114, + 7,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,14,95,111,112,101,110,95,114,101,103,105,115, + 116,114,121,205,2,0,0,115,10,0,0,0,2,2,16,1, + 12,1,20,1,255,128,122,36,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,2,0,0, 0,0,0,0,0,0,0,0,0,6,0,0,0,8,0,0, @@ -1018,105 +1023,106 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,107,101,121,114,7,0,0,0,90,4,104,107,101,121,218, 8,102,105,108,101,112,97,116,104,114,5,0,0,0,114,5, 0,0,0,114,8,0,0,0,218,16,95,115,101,97,114,99, - 104,95,114,101,103,105,115,116,114,121,212,2,0,0,115,24, - 0,0,0,0,2,6,1,8,2,6,1,6,1,16,255,6, - 2,2,1,12,1,46,1,12,1,8,1,122,38,87,105,110, - 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, - 101,114,46,95,115,101,97,114,99,104,95,114,101,103,105,115, - 116,114,121,78,99,4,0,0,0,0,0,0,0,0,0,0, - 0,8,0,0,0,8,0,0,0,67,0,0,0,115,118,0, - 0,0,124,0,160,0,124,1,161,1,125,4,124,4,100,0, - 117,0,114,22,100,0,83,0,122,12,116,1,124,4,131,1, - 1,0,87,0,110,20,4,0,116,2,121,54,1,0,1,0, - 1,0,89,0,100,0,83,0,48,0,116,3,131,0,68,0, - 93,50,92,2,125,5,125,6,124,4,160,4,116,5,124,6, - 131,1,161,1,114,62,116,6,106,7,124,1,124,5,124,1, - 124,4,131,2,124,4,100,1,141,3,125,7,124,7,2,0, - 1,0,83,0,100,0,83,0,41,2,78,114,180,0,0,0, - 41,8,114,200,0,0,0,114,49,0,0,0,114,50,0,0, - 0,114,184,0,0,0,114,110,0,0,0,114,111,0,0,0, - 114,134,0,0,0,218,16,115,112,101,99,95,102,114,111,109, - 95,108,111,97,100,101,114,41,8,114,193,0,0,0,114,139, - 0,0,0,114,44,0,0,0,218,6,116,97,114,103,101,116, - 114,199,0,0,0,114,140,0,0,0,114,189,0,0,0,114, - 187,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,9,102,105,110,100,95,115,112,101,99,227,2, - 0,0,115,28,0,0,0,0,2,10,1,8,1,4,1,2, - 1,12,1,12,1,8,1,14,1,14,1,6,1,8,1,2, - 254,6,3,122,31,87,105,110,100,111,119,115,82,101,103,105, - 115,116,114,121,70,105,110,100,101,114,46,102,105,110,100,95, - 115,112,101,99,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,4,0,0,0,67,0,0,0,115,30,0, - 0,0,124,0,160,0,124,1,124,2,161,2,125,3,124,3, - 100,1,117,1,114,26,124,3,106,1,83,0,100,1,83,0, - 41,2,122,108,70,105,110,100,32,109,111,100,117,108,101,32, - 110,97,109,101,100,32,105,110,32,116,104,101,32,114,101,103, - 105,115,116,114,121,46,10,10,32,32,32,32,32,32,32,32, - 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, - 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, - 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, - 78,169,2,114,203,0,0,0,114,140,0,0,0,169,4,114, - 193,0,0,0,114,139,0,0,0,114,44,0,0,0,114,187, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,11,102,105,110,100,95,109,111,100,117,108,101,243, - 2,0,0,115,8,0,0,0,0,7,12,1,8,1,6,2, - 122,33,87,105,110,100,111,119,115,82,101,103,105,115,116,114, - 121,70,105,110,100,101,114,46,102,105,110,100,95,109,111,100, - 117,108,101,41,2,78,78,41,1,78,41,12,114,125,0,0, - 0,114,124,0,0,0,114,126,0,0,0,114,127,0,0,0, - 114,197,0,0,0,114,196,0,0,0,114,195,0,0,0,218, - 11,99,108,97,115,115,109,101,116,104,111,100,114,194,0,0, - 0,114,200,0,0,0,114,203,0,0,0,114,206,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,191,0,0,0,193,2,0,0,115,28,0, - 0,0,8,2,4,3,2,255,2,4,2,255,2,3,4,2, - 2,1,10,6,2,1,10,14,2,1,12,15,2,1,114,191, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,64,0,0,0,115,48,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, - 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100, - 7,132,0,90,6,100,8,100,9,132,0,90,7,100,10,83, - 0,41,11,218,13,95,76,111,97,100,101,114,66,97,115,105, - 99,115,122,83,66,97,115,101,32,99,108,97,115,115,32,111, - 102,32,99,111,109,109,111,110,32,99,111,100,101,32,110,101, - 101,100,101,100,32,98,121,32,98,111,116,104,32,83,111,117, - 114,99,101,76,111,97,100,101,114,32,97,110,100,10,32,32, - 32,32,83,111,117,114,99,101,108,101,115,115,70,105,108,101, - 76,111,97,100,101,114,46,99,2,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,4,0,0,0,67,0,0,0, - 115,64,0,0,0,116,0,124,0,160,1,124,1,161,1,131, - 1,100,1,25,0,125,2,124,2,160,2,100,2,100,1,161, - 2,100,3,25,0,125,3,124,1,160,3,100,2,161,1,100, - 4,25,0,125,4,124,3,100,5,107,2,111,62,124,4,100, - 5,107,3,83,0,41,6,122,141,67,111,110,99,114,101,116, - 101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, - 32,111,102,32,73,110,115,112,101,99,116,76,111,97,100,101, - 114,46,105,115,95,112,97,99,107,97,103,101,32,98,121,32, - 99,104,101,99,107,105,110,103,32,105,102,10,32,32,32,32, - 32,32,32,32,116,104,101,32,112,97,116,104,32,114,101,116, - 117,114,110,101,100,32,98,121,32,103,101,116,95,102,105,108, - 101,110,97,109,101,32,104,97,115,32,97,32,102,105,108,101, - 110,97,109,101,32,111,102,32,39,95,95,105,110,105,116,95, - 95,46,112,121,39,46,114,39,0,0,0,114,71,0,0,0, - 114,73,0,0,0,114,28,0,0,0,218,8,95,95,105,110, - 105,116,95,95,41,4,114,47,0,0,0,114,179,0,0,0, - 114,43,0,0,0,114,41,0,0,0,41,5,114,118,0,0, - 0,114,139,0,0,0,114,96,0,0,0,90,13,102,105,108, - 101,110,97,109,101,95,98,97,115,101,90,9,116,97,105,108, - 95,110,97,109,101,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,182,0,0,0,6,3,0,0,115,8,0, - 0,0,0,3,18,1,16,1,14,1,122,24,95,76,111,97, - 100,101,114,66,97,115,105,99,115,46,105,115,95,112,97,99, - 107,97,103,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,169,2,122,42,85,115,101,32,100,101, - 102,97,117,108,116,32,115,101,109,97,110,116,105,99,115,32, - 102,111,114,32,109,111,100,117,108,101,32,99,114,101,97,116, - 105,111,110,46,78,114,5,0,0,0,169,2,114,118,0,0, + 104,95,114,101,103,105,115,116,114,121,212,2,0,0,115,26, + 0,0,0,6,2,8,1,6,2,6,1,16,1,6,255,2, + 2,12,1,46,1,12,1,8,1,4,1,255,128,122,38,87, + 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, + 110,100,101,114,46,95,115,101,97,114,99,104,95,114,101,103, + 105,115,116,114,121,78,99,4,0,0,0,0,0,0,0,0, + 0,0,0,8,0,0,0,8,0,0,0,67,0,0,0,115, + 118,0,0,0,124,0,160,0,124,1,161,1,125,4,124,4, + 100,0,117,0,114,22,100,0,83,0,122,12,116,1,124,4, + 131,1,1,0,87,0,110,20,4,0,116,2,121,54,1,0, + 1,0,1,0,89,0,100,0,83,0,48,0,116,3,131,0, + 68,0,93,50,92,2,125,5,125,6,124,4,160,4,116,5, + 124,6,131,1,161,1,114,62,116,6,106,7,124,1,124,5, + 124,1,124,4,131,2,124,4,100,1,141,3,125,7,124,7, + 2,0,1,0,83,0,100,0,83,0,41,2,78,114,180,0, + 0,0,41,8,114,200,0,0,0,114,49,0,0,0,114,50, + 0,0,0,114,184,0,0,0,114,110,0,0,0,114,111,0, + 0,0,114,134,0,0,0,218,16,115,112,101,99,95,102,114, + 111,109,95,108,111,97,100,101,114,41,8,114,193,0,0,0, + 114,139,0,0,0,114,44,0,0,0,218,6,116,97,114,103, + 101,116,114,199,0,0,0,114,140,0,0,0,114,189,0,0, 0,114,187,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,13,99,114,101,97,116,101,95,109,111, - 100,117,108,101,14,3,0,0,115,2,0,0,0,0,1,122, + 114,8,0,0,0,218,9,102,105,110,100,95,115,112,101,99, + 227,2,0,0,115,32,0,0,0,10,2,8,1,4,1,2, + 1,12,1,12,1,8,1,14,1,14,1,6,1,8,1,2, + 1,6,254,8,3,4,128,255,128,122,31,87,105,110,100,111, + 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, + 46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, + 0,0,0,115,30,0,0,0,124,0,160,0,124,1,124,2, + 161,2,125,3,124,3,100,1,117,1,114,26,124,3,106,1, + 83,0,100,1,83,0,41,2,122,108,70,105,110,100,32,109, + 111,100,117,108,101,32,110,97,109,101,100,32,105,110,32,116, + 104,101,32,114,101,103,105,115,116,114,121,46,10,10,32,32, + 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, + 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,32,32,32,32,78,169,2,114,203,0,0,0,114,140, + 0,0,0,169,4,114,193,0,0,0,114,139,0,0,0,114, + 44,0,0,0,114,187,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,11,102,105,110,100,95,109, + 111,100,117,108,101,243,2,0,0,115,10,0,0,0,12,7, + 8,1,6,1,4,2,255,128,122,33,87,105,110,100,111,119, + 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, + 102,105,110,100,95,109,111,100,117,108,101,41,2,78,78,41, + 1,78,41,12,114,125,0,0,0,114,124,0,0,0,114,126, + 0,0,0,114,127,0,0,0,114,197,0,0,0,114,196,0, + 0,0,114,195,0,0,0,218,11,99,108,97,115,115,109,101, + 116,104,111,100,114,194,0,0,0,114,200,0,0,0,114,203, + 0,0,0,114,206,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,191,0,0, + 0,193,2,0,0,115,32,0,0,0,8,0,4,2,2,3, + 2,255,2,4,2,255,4,3,2,2,10,1,2,6,10,1, + 2,14,12,1,2,15,16,1,255,128,114,191,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,64,0,0,0,115,48,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, + 4,100,4,100,5,132,0,90,5,100,6,100,7,132,0,90, + 6,100,8,100,9,132,0,90,7,100,10,83,0,41,11,218, + 13,95,76,111,97,100,101,114,66,97,115,105,99,115,122,83, + 66,97,115,101,32,99,108,97,115,115,32,111,102,32,99,111, + 109,109,111,110,32,99,111,100,101,32,110,101,101,100,101,100, + 32,98,121,32,98,111,116,104,32,83,111,117,114,99,101,76, + 111,97,100,101,114,32,97,110,100,10,32,32,32,32,83,111, + 117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,100, + 101,114,46,99,2,0,0,0,0,0,0,0,0,0,0,0, + 5,0,0,0,4,0,0,0,67,0,0,0,115,64,0,0, + 0,116,0,124,0,160,1,124,1,161,1,131,1,100,1,25, + 0,125,2,124,2,160,2,100,2,100,1,161,2,100,3,25, + 0,125,3,124,1,160,3,100,2,161,1,100,4,25,0,125, + 4,124,3,100,5,107,2,111,62,124,4,100,5,107,3,83, + 0,41,6,122,141,67,111,110,99,114,101,116,101,32,105,109, + 112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32, + 73,110,115,112,101,99,116,76,111,97,100,101,114,46,105,115, + 95,112,97,99,107,97,103,101,32,98,121,32,99,104,101,99, + 107,105,110,103,32,105,102,10,32,32,32,32,32,32,32,32, + 116,104,101,32,112,97,116,104,32,114,101,116,117,114,110,101, + 100,32,98,121,32,103,101,116,95,102,105,108,101,110,97,109, + 101,32,104,97,115,32,97,32,102,105,108,101,110,97,109,101, + 32,111,102,32,39,95,95,105,110,105,116,95,95,46,112,121, + 39,46,114,39,0,0,0,114,71,0,0,0,114,73,0,0, + 0,114,28,0,0,0,218,8,95,95,105,110,105,116,95,95, + 41,4,114,47,0,0,0,114,179,0,0,0,114,43,0,0, + 0,114,41,0,0,0,41,5,114,118,0,0,0,114,139,0, + 0,0,114,96,0,0,0,90,13,102,105,108,101,110,97,109, + 101,95,98,97,115,101,90,9,116,97,105,108,95,110,97,109, + 101,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,182,0,0,0,6,3,0,0,115,10,0,0,0,18,3, + 16,1,14,1,16,1,255,128,122,24,95,76,111,97,100,101, + 114,66,97,115,105,99,115,46,105,115,95,112,97,99,107,97, + 103,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,169,2,122,42,85,115,101,32,100,101,102,97, + 117,108,116,32,115,101,109,97,110,116,105,99,115,32,102,111, + 114,32,109,111,100,117,108,101,32,99,114,101,97,116,105,111, + 110,46,78,114,5,0,0,0,169,2,114,118,0,0,0,114, + 187,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,13,99,114,101,97,116,101,95,109,111,100,117, + 108,101,14,3,0,0,115,4,0,0,0,4,128,255,128,122, 27,95,76,111,97,100,101,114,66,97,115,105,99,115,46,99, 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, @@ -1136,85 +1142,86 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,114,131,0,0,0,41,3,114,118,0,0,0,218,6,109, 111,100,117,108,101,114,164,0,0,0,114,5,0,0,0,114, 5,0,0,0,114,8,0,0,0,218,11,101,120,101,99,95, - 109,111,100,117,108,101,17,3,0,0,115,12,0,0,0,0, - 2,12,1,8,1,6,1,4,255,6,2,122,25,95,76,111, - 97,100,101,114,66,97,115,105,99,115,46,101,120,101,99,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, - 12,0,0,0,116,0,160,1,124,0,124,1,161,2,83,0, - 41,1,122,26,84,104,105,115,32,109,111,100,117,108,101,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,41,2, - 114,134,0,0,0,218,17,95,108,111,97,100,95,109,111,100, - 117,108,101,95,115,104,105,109,169,2,114,118,0,0,0,114, - 139,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, - 25,3,0,0,115,2,0,0,0,0,2,122,25,95,76,111, - 97,100,101,114,66,97,115,105,99,115,46,108,111,97,100,95, - 109,111,100,117,108,101,78,41,8,114,125,0,0,0,114,124, - 0,0,0,114,126,0,0,0,114,127,0,0,0,114,182,0, - 0,0,114,212,0,0,0,114,217,0,0,0,114,220,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,208,0,0,0,1,3,0,0,115,10, - 0,0,0,8,2,4,3,8,8,8,3,8,8,114,208,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,64,0,0,0,115,74,0,0,0, - 101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3, - 100,3,100,4,132,0,90,4,100,5,100,6,132,0,90,5, - 100,7,100,8,132,0,90,6,100,9,100,10,132,0,90,7, - 100,11,100,12,156,1,100,13,100,14,132,2,90,8,100,15, - 100,16,132,0,90,9,100,17,83,0,41,18,218,12,83,111, - 117,114,99,101,76,111,97,100,101,114,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,8,0,0,0,116,0,130,1,100,1,83,0, - 41,2,122,165,79,112,116,105,111,110,97,108,32,109,101,116, - 104,111,100,32,116,104,97,116,32,114,101,116,117,114,110,115, - 32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111, - 110,32,116,105,109,101,32,40,97,110,32,105,110,116,41,32, - 102,111,114,32,116,104,101,10,32,32,32,32,32,32,32,32, - 115,112,101,99,105,102,105,101,100,32,112,97,116,104,32,40, - 97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,32, - 32,82,97,105,115,101,115,32,79,83,69,114,114,111,114,32, - 119,104,101,110,32,116,104,101,32,112,97,116,104,32,99,97, - 110,110,111,116,32,98,101,32,104,97,110,100,108,101,100,46, - 10,32,32,32,32,32,32,32,32,78,41,1,114,50,0,0, - 0,169,2,114,118,0,0,0,114,44,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,10,112,97, - 116,104,95,109,116,105,109,101,32,3,0,0,115,2,0,0, - 0,0,6,122,23,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,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,14,0,0,0,100,1,124,0,160,0, - 124,1,161,1,105,1,83,0,41,2,97,158,1,0,0,79, - 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,114, - 101,116,117,114,110,105,110,103,32,97,32,109,101,116,97,100, - 97,116,97,32,100,105,99,116,32,102,111,114,32,116,104,101, - 32,115,112,101,99,105,102,105,101,100,10,32,32,32,32,32, - 32,32,32,112,97,116,104,32,40,97,32,115,116,114,41,46, - 10,10,32,32,32,32,32,32,32,32,80,111,115,115,105,98, - 108,101,32,107,101,121,115,58,10,32,32,32,32,32,32,32, - 32,45,32,39,109,116,105,109,101,39,32,40,109,97,110,100, - 97,116,111,114,121,41,32,105,115,32,116,104,101,32,110,117, - 109,101,114,105,99,32,116,105,109,101,115,116,97,109,112,32, - 111,102,32,108,97,115,116,32,115,111,117,114,99,101,10,32, - 32,32,32,32,32,32,32,32,32,99,111,100,101,32,109,111, - 100,105,102,105,99,97,116,105,111,110,59,10,32,32,32,32, - 32,32,32,32,45,32,39,115,105,122,101,39,32,40,111,112, - 116,105,111,110,97,108,41,32,105,115,32,116,104,101,32,115, - 105,122,101,32,105,110,32,98,121,116,101,115,32,111,102,32, - 116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,46, - 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, - 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, - 111,100,32,97,108,108,111,119,115,32,116,104,101,32,108,111, - 97,100,101,114,32,116,111,32,114,101,97,100,32,98,121,116, - 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, - 32,32,32,32,32,82,97,105,115,101,115,32,79,83,69,114, - 114,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116, - 104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100, - 108,101,100,46,10,32,32,32,32,32,32,32,32,114,169,0, - 0,0,41,1,114,223,0,0,0,114,222,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,218,10,112, - 97,116,104,95,115,116,97,116,115,40,3,0,0,115,2,0, - 0,0,0,12,122,23,83,111,117,114,99,101,76,111,97,100, + 109,111,100,117,108,101,17,3,0,0,115,16,0,0,0,12, + 2,8,1,6,1,4,1,6,255,16,2,4,128,255,128,122, + 25,95,76,111,97,100,101,114,66,97,115,105,99,115,46,101, + 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, + 0,0,0,115,12,0,0,0,116,0,160,1,124,0,124,1, + 161,2,83,0,41,1,122,26,84,104,105,115,32,109,111,100, + 117,108,101,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,41,2,114,134,0,0,0,218,17,95,108,111,97,100, + 95,109,111,100,117,108,101,95,115,104,105,109,169,2,114,118, + 0,0,0,114,139,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,11,108,111,97,100,95,109,111, + 100,117,108,101,25,3,0,0,115,4,0,0,0,12,2,255, + 128,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, + 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114, + 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, + 0,0,0,114,182,0,0,0,114,212,0,0,0,114,217,0, + 0,0,114,220,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,208,0,0,0, + 1,3,0,0,115,14,0,0,0,8,0,4,2,8,3,8, + 8,8,3,12,8,255,128,114,208,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,64,0,0,0,115,74,0,0,0,101,0,90,1,100,0, + 90,2,100,1,100,2,132,0,90,3,100,3,100,4,132,0, + 90,4,100,5,100,6,132,0,90,5,100,7,100,8,132,0, + 90,6,100,9,100,10,132,0,90,7,100,11,100,12,156,1, + 100,13,100,14,132,2,90,8,100,15,100,16,132,0,90,9, + 100,17,83,0,41,18,218,12,83,111,117,114,99,101,76,111, + 97,100,101,114,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,8,0, + 0,0,116,0,130,1,100,1,83,0,41,2,122,165,79,112, + 116,105,111,110,97,108,32,109,101,116,104,111,100,32,116,104, + 97,116,32,114,101,116,117,114,110,115,32,116,104,101,32,109, + 111,100,105,102,105,99,97,116,105,111,110,32,116,105,109,101, + 32,40,97,110,32,105,110,116,41,32,102,111,114,32,116,104, + 101,10,32,32,32,32,32,32,32,32,115,112,101,99,105,102, + 105,101,100,32,112,97,116,104,32,40,97,32,115,116,114,41, + 46,10,10,32,32,32,32,32,32,32,32,82,97,105,115,101, + 115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,116, + 104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,98, + 101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,32, + 32,32,32,78,41,1,114,50,0,0,0,169,2,114,118,0, + 0,0,114,44,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,10,112,97,116,104,95,109,116,105, + 109,101,32,3,0,0,115,6,0,0,0,4,6,4,128,255, + 128,122,23,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,0,0,0,0,2,0,0,0,4,0,0,0,67, + 0,0,0,115,14,0,0,0,100,1,124,0,160,0,124,1, + 161,1,105,1,83,0,41,2,97,158,1,0,0,79,112,116, + 105,111,110,97,108,32,109,101,116,104,111,100,32,114,101,116, + 117,114,110,105,110,103,32,97,32,109,101,116,97,100,97,116, + 97,32,100,105,99,116,32,102,111,114,32,116,104,101,32,115, + 112,101,99,105,102,105,101,100,10,32,32,32,32,32,32,32, + 32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,10, + 32,32,32,32,32,32,32,32,80,111,115,115,105,98,108,101, + 32,107,101,121,115,58,10,32,32,32,32,32,32,32,32,45, + 32,39,109,116,105,109,101,39,32,40,109,97,110,100,97,116, + 111,114,121,41,32,105,115,32,116,104,101,32,110,117,109,101, + 114,105,99,32,116,105,109,101,115,116,97,109,112,32,111,102, + 32,108,97,115,116,32,115,111,117,114,99,101,10,32,32,32, + 32,32,32,32,32,32,32,99,111,100,101,32,109,111,100,105, + 102,105,99,97,116,105,111,110,59,10,32,32,32,32,32,32, + 32,32,45,32,39,115,105,122,101,39,32,40,111,112,116,105, + 111,110,97,108,41,32,105,115,32,116,104,101,32,115,105,122, + 101,32,105,110,32,98,121,116,101,115,32,111,102,32,116,104, + 101,32,115,111,117,114,99,101,32,99,111,100,101,46,10,10, + 32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,110, + 116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,100, + 32,97,108,108,111,119,115,32,116,104,101,32,108,111,97,100, + 101,114,32,116,111,32,114,101,97,100,32,98,121,116,101,99, + 111,100,101,32,102,105,108,101,115,46,10,32,32,32,32,32, + 32,32,32,82,97,105,115,101,115,32,79,83,69,114,114,111, + 114,32,119,104,101,110,32,116,104,101,32,112,97,116,104,32, + 99,97,110,110,111,116,32,98,101,32,104,97,110,100,108,101, + 100,46,10,32,32,32,32,32,32,32,32,114,169,0,0,0, + 41,1,114,223,0,0,0,114,222,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,10,112,97,116, + 104,95,115,116,97,116,115,40,3,0,0,115,4,0,0,0, + 14,12,255,128,122,23,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,0,0,0,0,4,0,0,0,4,0, 0,0,67,0,0,0,115,12,0,0,0,124,0,160,0,124, @@ -1237,162 +1244,163 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,107,0,0,0,90,10,99,97,99,104,101,95,112, 97,116,104,114,26,0,0,0,114,5,0,0,0,114,5,0, 0,0,114,8,0,0,0,218,15,95,99,97,99,104,101,95, - 98,121,116,101,99,111,100,101,54,3,0,0,115,2,0,0, - 0,0,8,122,28,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,0,0,0,0,3,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,150,79,112,116,105,111,110,97,108,32, - 109,101,116,104,111,100,32,119,104,105,99,104,32,119,114,105, - 116,101,115,32,100,97,116,97,32,40,98,121,116,101,115,41, - 32,116,111,32,97,32,102,105,108,101,32,112,97,116,104,32, - 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, - 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, - 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, - 115,32,102,111,114,32,116,104,101,32,119,114,105,116,105,110, - 103,32,111,102,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,115,46,10,32,32,32,32,32,32,32,32,78,114,5, - 0,0,0,41,3,114,118,0,0,0,114,44,0,0,0,114, - 26,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,225,0,0,0,64,3,0,0,115,2,0,0, - 0,0,1,122,21,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,0,0,0,0,5,0,0,0,10,0,0,0,67, - 0,0,0,115,84,0,0,0,124,0,160,0,124,1,161,1, - 125,2,122,14,124,0,160,1,124,2,161,1,125,3,87,0, - 110,50,4,0,116,2,121,74,1,0,125,4,1,0,122,26, - 116,3,100,1,124,1,100,2,141,2,124,4,130,2,87,0, - 89,0,100,3,125,4,126,4,110,10,100,3,125,4,126,4, - 48,0,48,0,116,4,124,3,131,1,83,0,41,4,122,52, + 98,121,116,101,99,111,100,101,54,3,0,0,115,4,0,0, + 0,12,8,255,128,122,28,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,0,0,0,0, + 3,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,122,150,79,112,116,105,111,110,97, + 108,32,109,101,116,104,111,100,32,119,104,105,99,104,32,119, + 114,105,116,101,115,32,100,97,116,97,32,40,98,121,116,101, + 115,41,32,116,111,32,97,32,102,105,108,101,32,112,97,116, + 104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,32, + 32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,103, + 32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,108, + 111,119,115,32,102,111,114,32,116,104,101,32,119,114,105,116, + 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,78, + 114,5,0,0,0,41,3,114,118,0,0,0,114,44,0,0, + 0,114,26,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,225,0,0,0,64,3,0,0,115,4, + 0,0,0,4,128,255,128,122,21,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,0,0,0,0,5,0,0,0,10, + 0,0,0,67,0,0,0,115,84,0,0,0,124,0,160,0, + 124,1,161,1,125,2,122,14,124,0,160,1,124,2,161,1, + 125,3,87,0,110,50,4,0,116,2,121,74,1,0,125,4, + 1,0,122,26,116,3,100,1,124,1,100,2,141,2,124,4, + 130,2,87,0,89,0,100,3,125,4,126,4,110,10,100,3, + 125,4,126,4,48,0,48,0,116,4,124,3,131,1,83,0, + 41,4,122,52,67,111,110,99,114,101,116,101,32,105,109,112, + 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73, + 110,115,112,101,99,116,76,111,97,100,101,114,46,103,101,116, + 95,115,111,117,114,99,101,46,122,39,115,111,117,114,99,101, + 32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,116, + 104,114,111,117,103,104,32,103,101,116,95,100,97,116,97,40, + 41,114,115,0,0,0,78,41,5,114,179,0,0,0,218,8, + 103,101,116,95,100,97,116,97,114,50,0,0,0,114,117,0, + 0,0,114,176,0,0,0,41,5,114,118,0,0,0,114,139, + 0,0,0,114,44,0,0,0,114,174,0,0,0,218,3,101, + 120,99,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,10,103,101,116,95,115,111,117,114,99,101,71,3,0, + 0,115,24,0,0,0,10,2,2,1,14,1,14,1,4,1, + 2,1,4,255,2,1,6,255,18,128,8,2,255,128,122,23, + 83,111,117,114,99,101,76,111,97,100,101,114,46,103,101,116, + 95,115,111,117,114,99,101,114,104,0,0,0,41,1,218,9, + 95,111,112,116,105,109,105,122,101,99,3,0,0,0,0,0, + 0,0,1,0,0,0,4,0,0,0,8,0,0,0,67,0, + 0,0,115,22,0,0,0,116,0,106,1,116,2,124,1,124, + 2,100,1,100,2,124,3,100,3,141,6,83,0,41,4,122, + 130,82,101,116,117,114,110,32,116,104,101,32,99,111,100,101, + 32,111,98,106,101,99,116,32,99,111,109,112,105,108,101,100, + 32,102,114,111,109,32,115,111,117,114,99,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,101,32,39,100,97,116,97, + 39,32,97,114,103,117,109,101,110,116,32,99,97,110,32,98, + 101,32,97,110,121,32,111,98,106,101,99,116,32,116,121,112, + 101,32,116,104,97,116,32,99,111,109,112,105,108,101,40,41, + 32,115,117,112,112,111,114,116,115,46,10,32,32,32,32,32, + 32,32,32,114,215,0,0,0,84,41,2,218,12,100,111,110, + 116,95,105,110,104,101,114,105,116,114,83,0,0,0,41,3, + 114,134,0,0,0,114,214,0,0,0,218,7,99,111,109,112, + 105,108,101,41,4,114,118,0,0,0,114,26,0,0,0,114, + 44,0,0,0,114,230,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,14,115,111,117,114,99,101, + 95,116,111,95,99,111,100,101,81,3,0,0,115,8,0,0, + 0,12,5,4,1,6,255,255,128,122,27,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,0, + 0,0,0,15,0,0,0,9,0,0,0,67,0,0,0,115, + 24,2,0,0,124,0,160,0,124,1,161,1,125,2,100,1, + 125,3,100,1,125,4,100,1,125,5,100,2,125,6,100,3, + 125,7,122,12,116,1,124,2,131,1,125,8,87,0,110,24, + 4,0,116,2,121,66,1,0,1,0,1,0,100,1,125,8, + 89,0,144,1,110,42,48,0,122,14,124,0,160,3,124,2, + 161,1,125,9,87,0,110,20,4,0,116,4,121,102,1,0, + 1,0,1,0,89,0,144,1,110,6,48,0,116,5,124,9, + 100,4,25,0,131,1,125,3,122,14,124,0,160,6,124,8, + 161,1,125,10,87,0,110,18,4,0,116,4,121,148,1,0, + 1,0,1,0,89,0,110,216,48,0,124,1,124,8,100,5, + 156,2,125,11,122,148,116,7,124,10,124,1,124,11,131,3, + 125,12,116,8,124,10,131,1,100,6,100,1,133,2,25,0, + 125,13,124,12,100,7,64,0,100,8,107,3,125,6,124,6, + 144,1,114,30,124,12,100,9,64,0,100,8,107,3,125,7, + 116,9,106,10,100,10,107,3,144,1,114,50,124,7,115,248, + 116,9,106,10,100,11,107,2,144,1,114,50,124,0,160,6, + 124,2,161,1,125,4,116,9,160,11,116,12,124,4,161,2, + 125,5,116,13,124,10,124,5,124,1,124,11,131,4,1,0, + 110,20,116,14,124,10,124,3,124,9,100,12,25,0,124,1, + 124,11,131,5,1,0,87,0,110,24,4,0,116,15,116,16, + 102,2,144,1,121,76,1,0,1,0,1,0,89,0,110,32, + 48,0,116,17,160,18,100,13,124,8,124,2,161,3,1,0, + 116,19,124,13,124,1,124,8,124,2,100,14,141,4,83,0, + 124,4,100,1,117,0,144,1,114,128,124,0,160,6,124,2, + 161,1,125,4,124,0,160,20,124,4,124,2,161,2,125,14, + 116,17,160,18,100,15,124,2,161,2,1,0,116,21,106,22, + 144,2,115,20,124,8,100,1,117,1,144,2,114,20,124,3, + 100,1,117,1,144,2,114,20,124,6,144,1,114,220,124,5, + 100,1,117,0,144,1,114,206,116,9,160,11,124,4,161,1, + 125,5,116,23,124,14,124,5,124,7,131,3,125,10,110,16, + 116,24,124,14,124,3,116,25,124,4,131,1,131,3,125,10, + 122,18,124,0,160,26,124,2,124,8,124,10,161,3,1,0, + 87,0,110,20,4,0,116,2,144,2,121,18,1,0,1,0, + 1,0,89,0,110,2,48,0,124,14,83,0,41,16,122,190, 67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,101, 110,116,97,116,105,111,110,32,111,102,32,73,110,115,112,101, - 99,116,76,111,97,100,101,114,46,103,101,116,95,115,111,117, - 114,99,101,46,122,39,115,111,117,114,99,101,32,110,111,116, - 32,97,118,97,105,108,97,98,108,101,32,116,104,114,111,117, - 103,104,32,103,101,116,95,100,97,116,97,40,41,114,115,0, - 0,0,78,41,5,114,179,0,0,0,218,8,103,101,116,95, - 100,97,116,97,114,50,0,0,0,114,117,0,0,0,114,176, - 0,0,0,41,5,114,118,0,0,0,114,139,0,0,0,114, - 44,0,0,0,114,174,0,0,0,218,3,101,120,99,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,218,10,103, - 101,116,95,115,111,117,114,99,101,71,3,0,0,115,20,0, - 0,0,0,2,10,1,2,1,14,1,14,1,4,1,2,255, - 4,1,2,255,24,2,122,23,83,111,117,114,99,101,76,111, - 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,114, - 104,0,0,0,41,1,218,9,95,111,112,116,105,109,105,122, - 101,99,3,0,0,0,0,0,0,0,1,0,0,0,4,0, - 0,0,8,0,0,0,67,0,0,0,115,22,0,0,0,116, - 0,106,1,116,2,124,1,124,2,100,1,100,2,124,3,100, - 3,141,6,83,0,41,4,122,130,82,101,116,117,114,110,32, - 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, - 99,111,109,112,105,108,101,100,32,102,114,111,109,32,115,111, - 117,114,99,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,39,100,97,116,97,39,32,97,114,103,117,109,101, - 110,116,32,99,97,110,32,98,101,32,97,110,121,32,111,98, - 106,101,99,116,32,116,121,112,101,32,116,104,97,116,32,99, - 111,109,112,105,108,101,40,41,32,115,117,112,112,111,114,116, - 115,46,10,32,32,32,32,32,32,32,32,114,215,0,0,0, - 84,41,2,218,12,100,111,110,116,95,105,110,104,101,114,105, - 116,114,83,0,0,0,41,3,114,134,0,0,0,114,214,0, - 0,0,218,7,99,111,109,112,105,108,101,41,4,114,118,0, - 0,0,114,26,0,0,0,114,44,0,0,0,114,230,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,14,115,111,117,114,99,101,95,116,111,95,99,111,100,101, - 81,3,0,0,115,6,0,0,0,0,5,12,1,4,255,122, - 27,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,0,0,0,0,15,0,0,0,9,0,0, - 0,67,0,0,0,115,24,2,0,0,124,0,160,0,124,1, - 161,1,125,2,100,1,125,3,100,1,125,4,100,1,125,5, - 100,2,125,6,100,3,125,7,122,12,116,1,124,2,131,1, - 125,8,87,0,110,24,4,0,116,2,121,66,1,0,1,0, - 1,0,100,1,125,8,89,0,144,1,110,42,48,0,122,14, - 124,0,160,3,124,2,161,1,125,9,87,0,110,20,4,0, - 116,4,121,102,1,0,1,0,1,0,89,0,144,1,110,6, - 48,0,116,5,124,9,100,4,25,0,131,1,125,3,122,14, - 124,0,160,6,124,8,161,1,125,10,87,0,110,18,4,0, - 116,4,121,148,1,0,1,0,1,0,89,0,110,216,48,0, - 124,1,124,8,100,5,156,2,125,11,122,148,116,7,124,10, - 124,1,124,11,131,3,125,12,116,8,124,10,131,1,100,6, - 100,1,133,2,25,0,125,13,124,12,100,7,64,0,100,8, - 107,3,125,6,124,6,144,1,114,30,124,12,100,9,64,0, - 100,8,107,3,125,7,116,9,106,10,100,10,107,3,144,1, - 114,50,124,7,115,248,116,9,106,10,100,11,107,2,144,1, - 114,50,124,0,160,6,124,2,161,1,125,4,116,9,160,11, - 116,12,124,4,161,2,125,5,116,13,124,10,124,5,124,1, - 124,11,131,4,1,0,110,20,116,14,124,10,124,3,124,9, - 100,12,25,0,124,1,124,11,131,5,1,0,87,0,110,24, - 4,0,116,15,116,16,102,2,144,1,121,76,1,0,1,0, - 1,0,89,0,110,32,48,0,116,17,160,18,100,13,124,8, - 124,2,161,3,1,0,116,19,124,13,124,1,124,8,124,2, - 100,14,141,4,83,0,124,4,100,1,117,0,144,1,114,128, - 124,0,160,6,124,2,161,1,125,4,124,0,160,20,124,4, - 124,2,161,2,125,14,116,17,160,18,100,15,124,2,161,2, - 1,0,116,21,106,22,144,2,115,20,124,8,100,1,117,1, - 144,2,114,20,124,3,100,1,117,1,144,2,114,20,124,6, - 144,1,114,220,124,5,100,1,117,0,144,1,114,206,116,9, - 160,11,124,4,161,1,125,5,116,23,124,14,124,5,124,7, - 131,3,125,10,110,16,116,24,124,14,124,3,116,25,124,4, - 131,1,131,3,125,10,122,18,124,0,160,26,124,2,124,8, - 124,10,161,3,1,0,87,0,110,20,4,0,116,2,144,2, - 121,18,1,0,1,0,1,0,89,0,110,2,48,0,124,14, - 83,0,41,16,122,190,67,111,110,99,114,101,116,101,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, - 32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,103, - 101,116,95,99,111,100,101,46,10,10,32,32,32,32,32,32, - 32,32,82,101,97,100,105,110,103,32,111,102,32,98,121,116, - 101,99,111,100,101,32,114,101,113,117,105,114,101,115,32,112, - 97,116,104,95,115,116,97,116,115,32,116,111,32,98,101,32, - 105,109,112,108,101,109,101,110,116,101,100,46,32,84,111,32, - 119,114,105,116,101,10,32,32,32,32,32,32,32,32,98,121, - 116,101,99,111,100,101,44,32,115,101,116,95,100,97,116,97, - 32,109,117,115,116,32,97,108,115,111,32,98,101,32,105,109, - 112,108,101,109,101,110,116,101,100,46,10,10,32,32,32,32, - 32,32,32,32,78,70,84,114,169,0,0,0,114,159,0,0, - 0,114,145,0,0,0,114,39,0,0,0,114,73,0,0,0, - 114,28,0,0,0,90,5,110,101,118,101,114,90,6,97,108, - 119,97,121,115,218,4,115,105,122,101,122,13,123,125,32,109, - 97,116,99,104,101,115,32,123,125,41,3,114,116,0,0,0, - 114,106,0,0,0,114,107,0,0,0,122,19,99,111,100,101, - 32,111,98,106,101,99,116,32,102,114,111,109,32,123,125,41, - 27,114,179,0,0,0,114,97,0,0,0,114,82,0,0,0, - 114,224,0,0,0,114,50,0,0,0,114,18,0,0,0,114, - 227,0,0,0,114,152,0,0,0,218,10,109,101,109,111,114, - 121,118,105,101,119,114,163,0,0,0,90,21,99,104,101,99, - 107,95,104,97,115,104,95,98,97,115,101,100,95,112,121,99, - 115,114,157,0,0,0,218,17,95,82,65,87,95,77,65,71, - 73,67,95,78,85,77,66,69,82,114,158,0,0,0,114,156, - 0,0,0,114,117,0,0,0,114,150,0,0,0,114,134,0, - 0,0,114,149,0,0,0,114,165,0,0,0,114,233,0,0, - 0,114,1,0,0,0,218,19,100,111,110,116,95,119,114,105, - 116,101,95,98,121,116,101,99,111,100,101,114,171,0,0,0, - 114,170,0,0,0,114,23,0,0,0,114,226,0,0,0,41, - 15,114,118,0,0,0,114,139,0,0,0,114,107,0,0,0, - 114,154,0,0,0,114,174,0,0,0,114,157,0,0,0,90, - 10,104,97,115,104,95,98,97,115,101,100,90,12,99,104,101, - 99,107,95,115,111,117,114,99,101,114,106,0,0,0,218,2, - 115,116,114,26,0,0,0,114,151,0,0,0,114,2,0,0, - 0,90,10,98,121,116,101,115,95,100,97,116,97,90,11,99, - 111,100,101,95,111,98,106,101,99,116,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,213,0,0,0,89,3, - 0,0,115,152,0,0,0,0,7,10,1,4,1,4,1,4, - 1,4,1,4,1,2,1,12,1,12,1,12,2,2,1,14, - 1,12,1,8,2,12,1,2,1,14,1,12,1,6,3,2, - 1,2,254,6,4,2,1,12,1,16,1,12,1,6,1,12, - 1,12,1,2,255,2,2,8,254,4,3,10,1,4,1,2, - 1,2,254,4,4,8,1,2,255,6,3,2,1,2,1,2, - 1,6,1,2,1,2,251,8,7,18,1,6,2,8,1,2, - 255,4,2,6,1,2,1,2,254,6,3,10,1,10,1,12, - 1,12,1,18,1,6,255,4,2,6,1,10,1,10,1,14, - 2,6,1,6,255,4,2,2,1,18,1,14,1,6,1,122, - 21,83,111,117,114,99,101,76,111,97,100,101,114,46,103,101, - 116,95,99,111,100,101,78,41,10,114,125,0,0,0,114,124, - 0,0,0,114,126,0,0,0,114,223,0,0,0,114,224,0, - 0,0,114,226,0,0,0,114,225,0,0,0,114,229,0,0, - 0,114,233,0,0,0,114,213,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 221,0,0,0,30,3,0,0,115,14,0,0,0,8,2,8, - 8,8,14,8,10,8,7,8,10,14,8,114,221,0,0,0, + 99,116,76,111,97,100,101,114,46,103,101,116,95,99,111,100, + 101,46,10,10,32,32,32,32,32,32,32,32,82,101,97,100, + 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32, + 114,101,113,117,105,114,101,115,32,112,97,116,104,95,115,116, + 97,116,115,32,116,111,32,98,101,32,105,109,112,108,101,109, + 101,110,116,101,100,46,32,84,111,32,119,114,105,116,101,10, + 32,32,32,32,32,32,32,32,98,121,116,101,99,111,100,101, + 44,32,115,101,116,95,100,97,116,97,32,109,117,115,116,32, + 97,108,115,111,32,98,101,32,105,109,112,108,101,109,101,110, + 116,101,100,46,10,10,32,32,32,32,32,32,32,32,78,70, + 84,114,169,0,0,0,114,159,0,0,0,114,145,0,0,0, + 114,39,0,0,0,114,73,0,0,0,114,28,0,0,0,90, + 5,110,101,118,101,114,90,6,97,108,119,97,121,115,218,4, + 115,105,122,101,122,13,123,125,32,109,97,116,99,104,101,115, + 32,123,125,41,3,114,116,0,0,0,114,106,0,0,0,114, + 107,0,0,0,122,19,99,111,100,101,32,111,98,106,101,99, + 116,32,102,114,111,109,32,123,125,41,27,114,179,0,0,0, + 114,97,0,0,0,114,82,0,0,0,114,224,0,0,0,114, + 50,0,0,0,114,18,0,0,0,114,227,0,0,0,114,152, + 0,0,0,218,10,109,101,109,111,114,121,118,105,101,119,114, + 163,0,0,0,90,21,99,104,101,99,107,95,104,97,115,104, + 95,98,97,115,101,100,95,112,121,99,115,114,157,0,0,0, + 218,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, + 66,69,82,114,158,0,0,0,114,156,0,0,0,114,117,0, + 0,0,114,150,0,0,0,114,134,0,0,0,114,149,0,0, + 0,114,165,0,0,0,114,233,0,0,0,114,1,0,0,0, + 218,19,100,111,110,116,95,119,114,105,116,101,95,98,121,116, + 101,99,111,100,101,114,171,0,0,0,114,170,0,0,0,114, + 23,0,0,0,114,226,0,0,0,41,15,114,118,0,0,0, + 114,139,0,0,0,114,107,0,0,0,114,154,0,0,0,114, + 174,0,0,0,114,157,0,0,0,90,10,104,97,115,104,95, + 98,97,115,101,100,90,12,99,104,101,99,107,95,115,111,117, + 114,99,101,114,106,0,0,0,218,2,115,116,114,26,0,0, + 0,114,151,0,0,0,114,2,0,0,0,90,10,98,121,116, + 101,115,95,100,97,116,97,90,11,99,111,100,101,95,111,98, + 106,101,99,116,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,213,0,0,0,89,3,0,0,115,154,0,0, + 0,10,7,4,1,4,1,4,1,4,1,4,1,2,1,12, + 1,12,1,12,1,2,2,14,1,12,1,8,1,12,2,2, + 1,14,1,12,1,6,1,2,3,2,1,6,254,2,4,12, + 1,16,1,12,1,6,1,12,1,12,1,2,1,2,255,8, + 2,4,254,10,3,4,1,2,1,2,1,4,254,8,4,2, + 1,6,255,2,3,2,1,2,1,6,1,2,1,2,1,8, + 251,18,7,6,1,8,2,2,1,4,255,6,2,2,1,2, + 1,6,254,10,3,10,1,12,1,12,1,18,1,6,1,4, + 255,6,2,10,1,10,1,14,1,6,2,6,1,4,255,2, + 2,18,1,14,1,6,1,4,1,255,128,122,21,83,111,117, + 114,99,101,76,111,97,100,101,114,46,103,101,116,95,99,111, + 100,101,78,41,10,114,125,0,0,0,114,124,0,0,0,114, + 126,0,0,0,114,223,0,0,0,114,224,0,0,0,114,226, + 0,0,0,114,225,0,0,0,114,229,0,0,0,114,233,0, + 0,0,114,213,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,221,0,0,0, + 30,3,0,0,115,18,0,0,0,8,0,8,2,8,8,8, + 14,8,10,8,7,14,10,12,8,255,128,114,221,0,0,0, 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,4,0,0,0,0,0,0,0,115,92,0,0,0,101,0, 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, @@ -1418,72 +1426,73 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,32,32,102,105,110,100,101,114,46,78,114, 159,0,0,0,41,3,114,118,0,0,0,114,139,0,0,0, 114,44,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,209,0,0,0,179,3,0,0,115,4,0, - 0,0,0,3,6,1,122,19,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,0,0,0,0,2,0,0,0,2,0,0,0, - 67,0,0,0,115,24,0,0,0,124,0,106,0,124,1,106, - 0,107,2,111,22,124,0,106,1,124,1,106,1,107,2,83, - 0,114,109,0,0,0,169,2,218,9,95,95,99,108,97,115, - 115,95,95,114,131,0,0,0,169,2,114,118,0,0,0,90, - 5,111,116,104,101,114,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,6,95,95,101,113,95,95,185,3,0, - 0,115,6,0,0,0,0,1,12,1,10,255,122,17,70,105, - 108,101,76,111,97,100,101,114,46,95,95,101,113,95,95,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,20,0,0,0,116,0,124, - 0,106,1,131,1,116,0,124,0,106,2,131,1,65,0,83, - 0,114,109,0,0,0,169,3,218,4,104,97,115,104,114,116, - 0,0,0,114,44,0,0,0,169,1,114,118,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,8, - 95,95,104,97,115,104,95,95,189,3,0,0,115,2,0,0, - 0,0,1,122,19,70,105,108,101,76,111,97,100,101,114,46, - 95,95,104,97,115,104,95,95,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,3,0,0,0,3,0,0, - 0,115,16,0,0,0,116,0,116,1,124,0,131,2,160,2, - 124,1,161,1,83,0,41,1,122,100,76,111,97,100,32,97, - 32,109,111,100,117,108,101,32,102,114,111,109,32,97,32,102, - 105,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, - 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,46,32,32,85,115,101,32,101,120, - 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, - 101,97,100,46,10,10,32,32,32,32,32,32,32,32,41,3, - 218,5,115,117,112,101,114,114,239,0,0,0,114,220,0,0, - 0,114,219,0,0,0,169,1,114,241,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,220,0,0,0,192,3,0,0, - 115,2,0,0,0,0,10,122,22,70,105,108,101,76,111,97, - 100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99, + 8,0,0,0,114,209,0,0,0,179,3,0,0,115,8,0, + 0,0,6,3,6,1,4,128,255,128,122,19,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,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, - 0,83,0,169,1,122,58,82,101,116,117,114,110,32,116,104, - 101,32,112,97,116,104,32,116,111,32,116,104,101,32,115,111, - 117,114,99,101,32,102,105,108,101,32,97,115,32,102,111,117, - 110,100,32,98,121,32,116,104,101,32,102,105,110,100,101,114, - 46,114,48,0,0,0,114,219,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,179,0,0,0,204, - 3,0,0,115,2,0,0,0,0,3,122,23,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,0,0,0,0, - 3,0,0,0,8,0,0,0,67,0,0,0,115,126,0,0, - 0,116,0,124,0,116,1,116,2,102,2,131,2,114,70,116, - 3,160,4,116,5,124,1,131,1,161,1,143,24,125,2,124, - 2,160,6,161,0,87,0,2,0,100,1,4,0,4,0,131, - 3,1,0,83,0,49,0,115,58,48,0,1,0,1,0,1, - 0,89,0,1,0,110,52,116,3,160,7,124,1,100,2,161, - 2,143,24,125,2,124,2,160,6,161,0,87,0,2,0,100, - 1,4,0,4,0,131,3,1,0,83,0,49,0,115,112,48, - 0,1,0,1,0,1,0,89,0,1,0,100,1,83,0,41, - 3,122,39,82,101,116,117,114,110,32,116,104,101,32,100,97, - 116,97,32,102,114,111,109,32,112,97,116,104,32,97,115,32, - 114,97,119,32,98,121,116,101,115,46,78,218,1,114,41,8, - 114,161,0,0,0,114,221,0,0,0,218,19,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,114, - 64,0,0,0,90,9,111,112,101,110,95,99,111,100,101,114, - 84,0,0,0,90,4,114,101,97,100,114,65,0,0,0,41, - 3,114,118,0,0,0,114,44,0,0,0,114,68,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 227,0,0,0,209,3,0,0,115,10,0,0,0,0,2,14, - 1,16,1,40,2,14,1,122,19,70,105,108,101,76,111,97, + 2,0,0,0,67,0,0,0,115,24,0,0,0,124,0,106, + 0,124,1,106,0,107,2,111,22,124,0,106,1,124,1,106, + 1,107,2,83,0,114,109,0,0,0,169,2,218,9,95,95, + 99,108,97,115,115,95,95,114,131,0,0,0,169,2,114,118, + 0,0,0,90,5,111,116,104,101,114,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,6,95,95,101,113,95, + 95,185,3,0,0,115,8,0,0,0,12,1,10,1,2,255, + 255,128,122,17,70,105,108,101,76,111,97,100,101,114,46,95, + 95,101,113,95,95,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,20, + 0,0,0,116,0,124,0,106,1,131,1,116,0,124,0,106, + 2,131,1,65,0,83,0,114,109,0,0,0,169,3,218,4, + 104,97,115,104,114,116,0,0,0,114,44,0,0,0,169,1, + 114,118,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,8,95,95,104,97,115,104,95,95,189,3, + 0,0,115,4,0,0,0,20,1,255,128,122,19,70,105,108, + 101,76,111,97,100,101,114,46,95,95,104,97,115,104,95,95, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,3,0,0,0,3,0,0,0,115,16,0,0,0,116,0, + 116,1,124,0,131,2,160,2,124,1,161,1,83,0,41,1, + 122,100,76,111,97,100,32,97,32,109,111,100,117,108,101,32, + 102,114,111,109,32,97,32,102,105,108,101,46,10,10,32,32, + 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, + 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,32,32,32,32,41,3,218,5,115,117,112,101,114,114, + 239,0,0,0,114,220,0,0,0,114,219,0,0,0,169,1, + 114,241,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 220,0,0,0,192,3,0,0,115,4,0,0,0,16,10,255, + 128,122,22,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,6,0,0,0,124,0,106,0,83,0,169,1,122, + 58,82,101,116,117,114,110,32,116,104,101,32,112,97,116,104, + 32,116,111,32,116,104,101,32,115,111,117,114,99,101,32,102, + 105,108,101,32,97,115,32,102,111,117,110,100,32,98,121,32, + 116,104,101,32,102,105,110,100,101,114,46,114,48,0,0,0, + 114,219,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,179,0,0,0,204,3,0,0,115,4,0, + 0,0,6,3,255,128,122,23,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,0,0,0,0,3,0,0,0, + 8,0,0,0,67,0,0,0,115,126,0,0,0,116,0,124, + 0,116,1,116,2,102,2,131,2,114,70,116,3,160,4,116, + 5,124,1,131,1,161,1,143,24,125,2,124,2,160,6,161, + 0,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, + 0,49,0,115,58,48,0,1,0,1,0,1,0,89,0,1, + 0,110,52,116,3,160,7,124,1,100,2,161,2,143,24,125, + 2,124,2,160,6,161,0,87,0,2,0,100,1,4,0,4, + 0,131,3,1,0,83,0,49,0,115,112,48,0,1,0,1, + 0,1,0,89,0,1,0,100,1,83,0,41,3,122,39,82, + 101,116,117,114,110,32,116,104,101,32,100,97,116,97,32,102, + 114,111,109,32,112,97,116,104,32,97,115,32,114,97,119,32, + 98,121,116,101,115,46,78,218,1,114,41,8,114,161,0,0, + 0,114,221,0,0,0,218,19,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,114,64,0,0,0, + 90,9,111,112,101,110,95,99,111,100,101,114,84,0,0,0, + 90,4,114,101,97,100,114,65,0,0,0,41,3,114,118,0, + 0,0,114,44,0,0,0,114,68,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,227,0,0,0, + 209,3,0,0,115,14,0,0,0,14,2,16,1,40,1,14, + 2,38,1,4,128,255,128,122,19,70,105,108,101,76,111,97, 100,101,114,46,103,101,116,95,100,97,116,97,99,2,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0, 0,67,0,0,0,115,20,0,0,0,100,1,100,2,108,0, @@ -1494,153 +1503,155 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,118,0,0,0,114,216,0,0,0,114,253,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,19, 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, - 100,101,114,218,3,0,0,115,4,0,0,0,0,2,12,1, - 122,30,70,105,108,101,76,111,97,100,101,114,46,103,101,116, - 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, - 41,13,114,125,0,0,0,114,124,0,0,0,114,126,0,0, - 0,114,127,0,0,0,114,209,0,0,0,114,243,0,0,0, - 114,247,0,0,0,114,136,0,0,0,114,220,0,0,0,114, - 179,0,0,0,114,227,0,0,0,114,254,0,0,0,90,13, - 95,95,99,108,97,115,115,99,101,108,108,95,95,114,5,0, - 0,0,114,5,0,0,0,114,249,0,0,0,114,8,0,0, - 0,114,239,0,0,0,174,3,0,0,115,22,0,0,0,8, - 2,4,3,8,6,8,4,8,3,2,1,14,11,2,1,10, - 4,8,9,2,1,114,239,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, - 0,0,0,115,46,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,100,7,156,1,100,8,100,9,132,2, - 90,6,100,10,83,0,41,11,218,16,83,111,117,114,99,101, - 70,105,108,101,76,111,97,100,101,114,122,62,67,111,110,99, - 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,32,111,102,32,83,111,117,114,99,101,76,111,97, - 100,101,114,32,117,115,105,110,103,32,116,104,101,32,102,105, - 108,101,32,115,121,115,116,101,109,46,99,2,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, - 0,0,0,115,22,0,0,0,116,0,124,1,131,1,125,2, - 124,2,106,1,124,2,106,2,100,1,156,2,83,0,41,2, - 122,33,82,101,116,117,114,110,32,116,104,101,32,109,101,116, - 97,100,97,116,97,32,102,111,114,32,116,104,101,32,112,97, - 116,104,46,41,2,114,169,0,0,0,114,234,0,0,0,41, - 3,114,49,0,0,0,218,8,115,116,95,109,116,105,109,101, - 90,7,115,116,95,115,105,122,101,41,3,114,118,0,0,0, - 114,44,0,0,0,114,238,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,224,0,0,0,228,3, - 0,0,115,4,0,0,0,0,2,8,1,122,27,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, - 0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,0, - 0,115,24,0,0,0,116,0,124,1,131,1,125,4,124,0, - 106,1,124,2,124,3,124,4,100,1,141,3,83,0,41,2, - 78,169,1,218,5,95,109,111,100,101,41,2,114,114,0,0, - 0,114,225,0,0,0,41,5,114,118,0,0,0,114,107,0, - 0,0,114,106,0,0,0,114,26,0,0,0,114,52,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,226,0,0,0,233,3,0,0,115,4,0,0,0,0,2, - 8,1,122,32,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, - 99,111,100,101,114,60,0,0,0,114,1,1,0,0,99,3, - 0,0,0,0,0,0,0,1,0,0,0,9,0,0,0,11, - 0,0,0,67,0,0,0,115,248,0,0,0,116,0,124,1, - 131,1,92,2,125,4,125,5,103,0,125,6,124,4,114,52, - 116,1,124,4,131,1,115,52,116,0,124,4,131,1,92,2, - 125,4,125,7,124,6,160,2,124,7,161,1,1,0,113,16, - 116,3,124,6,131,1,68,0,93,102,125,7,116,4,124,4, - 124,7,131,2,125,4,122,14,116,5,160,6,124,4,161,1, - 1,0,87,0,113,60,4,0,116,7,121,110,1,0,1,0, - 1,0,89,0,113,60,89,0,113,60,4,0,116,8,121,162, - 1,0,125,8,1,0,122,30,116,9,160,10,100,1,124,4, - 124,8,161,3,1,0,87,0,89,0,100,2,125,8,126,8, - 1,0,100,2,83,0,100,2,125,8,126,8,48,0,48,0, - 122,28,116,11,124,1,124,2,124,3,131,3,1,0,116,9, - 160,10,100,3,124,1,161,2,1,0,87,0,110,50,4,0, - 116,8,121,242,1,0,125,8,1,0,122,26,116,9,160,10, - 100,1,124,1,124,8,161,3,1,0,87,0,89,0,100,2, - 125,8,126,8,110,10,100,2,125,8,126,8,48,0,48,0, - 100,2,83,0,41,4,122,27,87,114,105,116,101,32,98,121, - 116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,105, - 108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,99, - 114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,125, - 78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,41, - 12,114,47,0,0,0,114,56,0,0,0,114,186,0,0,0, - 114,42,0,0,0,114,38,0,0,0,114,4,0,0,0,90, - 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115, - 116,115,69,114,114,111,114,114,50,0,0,0,114,134,0,0, - 0,114,149,0,0,0,114,69,0,0,0,41,9,114,118,0, - 0,0,114,44,0,0,0,114,26,0,0,0,114,2,1,0, - 0,218,6,112,97,114,101,110,116,114,96,0,0,0,114,37, - 0,0,0,114,33,0,0,0,114,228,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,225,0,0, - 0,238,3,0,0,115,46,0,0,0,0,2,12,1,4,2, - 12,1,12,1,12,2,12,1,10,1,2,1,14,1,12,2, - 8,1,14,3,6,1,4,255,4,2,26,1,2,1,12,1, - 16,1,14,2,8,1,2,255,122,25,83,111,117,114,99,101, + 100,101,114,218,3,0,0,115,6,0,0,0,12,2,8,1, + 255,128,122,30,70,105,108,101,76,111,97,100,101,114,46,103, + 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, + 101,114,41,13,114,125,0,0,0,114,124,0,0,0,114,126, + 0,0,0,114,127,0,0,0,114,209,0,0,0,114,243,0, + 0,0,114,247,0,0,0,114,136,0,0,0,114,220,0,0, + 0,114,179,0,0,0,114,227,0,0,0,114,254,0,0,0, + 90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,114, + 5,0,0,0,114,5,0,0,0,114,249,0,0,0,114,8, + 0,0,0,114,239,0,0,0,174,3,0,0,115,26,0,0, + 0,8,0,4,2,8,3,8,6,8,4,2,3,14,1,2, + 11,10,1,8,4,2,9,18,1,255,128,114,239,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,46,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,100,6,100,7,156,1, + 100,8,100,9,132,2,90,6,100,10,83,0,41,11,218,16, + 83,111,117,114,99,101,70,105,108,101,76,111,97,100,101,114, + 122,62,67,111,110,99,114,101,116,101,32,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,32,111,102,32,83,111,117, + 114,99,101,76,111,97,100,101,114,32,117,115,105,110,103,32, + 116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,46, + 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,3,0,0,0,67,0,0,0,115,22,0,0,0,116,0, + 124,1,131,1,125,2,124,2,106,1,124,2,106,2,100,1, + 156,2,83,0,41,2,122,33,82,101,116,117,114,110,32,116, + 104,101,32,109,101,116,97,100,97,116,97,32,102,111,114,32, + 116,104,101,32,112,97,116,104,46,41,2,114,169,0,0,0, + 114,234,0,0,0,41,3,114,49,0,0,0,218,8,115,116, + 95,109,116,105,109,101,90,7,115,116,95,115,105,122,101,41, + 3,114,118,0,0,0,114,44,0,0,0,114,238,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 224,0,0,0,228,3,0,0,115,6,0,0,0,8,2,14, + 1,255,128,122,27,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,0,0,0,0,0,5,0,0, + 0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,0, + 124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,4, + 100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,111, + 100,101,41,2,114,114,0,0,0,114,225,0,0,0,41,5, + 114,118,0,0,0,114,107,0,0,0,114,106,0,0,0,114, + 26,0,0,0,114,52,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,226,0,0,0,233,3,0, + 0,115,6,0,0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,60, + 0,0,0,114,1,1,0,0,99,3,0,0,0,0,0,0, + 0,1,0,0,0,9,0,0,0,11,0,0,0,67,0,0, + 0,115,248,0,0,0,116,0,124,1,131,1,92,2,125,4, + 125,5,103,0,125,6,124,4,114,52,116,1,124,4,131,1, + 115,52,116,0,124,4,131,1,92,2,125,4,125,7,124,6, + 160,2,124,7,161,1,1,0,113,16,116,3,124,6,131,1, + 68,0,93,102,125,7,116,4,124,4,124,7,131,2,125,4, + 122,14,116,5,160,6,124,4,161,1,1,0,87,0,113,60, + 4,0,116,7,121,110,1,0,1,0,1,0,89,0,113,60, + 89,0,113,60,4,0,116,8,121,162,1,0,125,8,1,0, + 122,30,116,9,160,10,100,1,124,4,124,8,161,3,1,0, + 87,0,89,0,100,2,125,8,126,8,1,0,100,2,83,0, + 100,2,125,8,126,8,48,0,48,0,122,28,116,11,124,1, + 124,2,124,3,131,3,1,0,116,9,160,10,100,3,124,1, + 161,2,1,0,87,0,110,50,4,0,116,8,121,242,1,0, + 125,8,1,0,122,26,116,9,160,10,100,1,124,1,124,8, + 161,3,1,0,87,0,89,0,100,2,125,8,126,8,110,10, + 100,2,125,8,126,8,48,0,48,0,100,2,83,0,41,4, + 122,27,87,114,105,116,101,32,98,121,116,101,115,32,100,97, + 116,97,32,116,111,32,97,32,102,105,108,101,46,122,27,99, + 111,117,108,100,32,110,111,116,32,99,114,101,97,116,101,32, + 123,33,114,125,58,32,123,33,114,125,78,122,12,99,114,101, + 97,116,101,100,32,123,33,114,125,41,12,114,47,0,0,0, + 114,56,0,0,0,114,186,0,0,0,114,42,0,0,0,114, + 38,0,0,0,114,4,0,0,0,90,5,109,107,100,105,114, + 218,15,70,105,108,101,69,120,105,115,116,115,69,114,114,111, + 114,114,50,0,0,0,114,134,0,0,0,114,149,0,0,0, + 114,69,0,0,0,41,9,114,118,0,0,0,114,44,0,0, + 0,114,26,0,0,0,114,2,1,0,0,218,6,112,97,114, + 101,110,116,114,96,0,0,0,114,37,0,0,0,114,33,0, + 0,0,114,228,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,225,0,0,0,238,3,0,0,115, + 52,0,0,0,12,2,4,1,12,2,12,1,12,1,12,2, + 10,1,2,1,14,1,12,1,8,2,14,1,6,3,4,1, + 4,255,16,2,10,128,2,1,12,1,16,1,14,1,8,2, + 2,1,8,255,22,128,255,128,122,25,83,111,117,114,99,101, 70,105,108,101,76,111,97,100,101,114,46,115,101,116,95,100, 97,116,97,78,41,7,114,125,0,0,0,114,124,0,0,0, 114,126,0,0,0,114,127,0,0,0,114,224,0,0,0,114, 226,0,0,0,114,225,0,0,0,114,5,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,255,0, - 0,0,224,3,0,0,115,8,0,0,0,8,2,4,2,8, - 5,8,5,114,255,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,83,0,41,7,218,20,83,111,117,114,99,101, - 108,101,115,115,70,105,108,101,76,111,97,100,101,114,122,45, - 76,111,97,100,101,114,32,119,104,105,99,104,32,104,97,110, - 100,108,101,115,32,115,111,117,114,99,101,108,101,115,115,32, - 102,105,108,101,32,105,109,112,111,114,116,115,46,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, - 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,124, - 1,161,1,125,2,124,0,160,1,124,2,161,1,125,3,124, - 1,124,2,100,1,156,2,125,4,116,2,124,3,124,1,124, - 4,131,3,1,0,116,3,116,4,124,3,131,1,100,2,100, - 0,133,2,25,0,124,1,124,2,100,3,141,3,83,0,41, - 4,78,114,159,0,0,0,114,145,0,0,0,41,2,114,116, - 0,0,0,114,106,0,0,0,41,5,114,179,0,0,0,114, - 227,0,0,0,114,152,0,0,0,114,165,0,0,0,114,235, - 0,0,0,41,5,114,118,0,0,0,114,139,0,0,0,114, - 44,0,0,0,114,26,0,0,0,114,151,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,213,0, - 0,0,17,4,0,0,115,22,0,0,0,0,1,10,1,10, - 4,2,1,2,254,6,4,12,1,2,1,14,1,2,1,2, - 253,122,29,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,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, - 83,0,41,2,122,39,82,101,116,117,114,110,32,78,111,110, - 101,32,97,115,32,116,104,101,114,101,32,105,115,32,110,111, - 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,5, - 0,0,0,114,219,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,229,0,0,0,33,4,0,0, - 115,2,0,0,0,0,2,122,31,83,111,117,114,99,101,108, + 0,0,224,3,0,0,115,12,0,0,0,8,0,4,2,8, + 2,8,5,18,5,255,128,114,255,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,64,0,0,0,115,32,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, + 100,5,132,0,90,5,100,6,83,0,41,7,218,20,83,111, + 117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,100, + 101,114,122,45,76,111,97,100,101,114,32,119,104,105,99,104, + 32,104,97,110,100,108,101,115,32,115,111,117,114,99,101,108, + 101,115,115,32,102,105,108,101,32,105,109,112,111,114,116,115, + 46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,5,0,0,0,67,0,0,0,115,68,0,0,0,124, + 0,160,0,124,1,161,1,125,2,124,0,160,1,124,2,161, + 1,125,3,124,1,124,2,100,1,156,2,125,4,116,2,124, + 3,124,1,124,4,131,3,1,0,116,3,116,4,124,3,131, + 1,100,2,100,0,133,2,25,0,124,1,124,2,100,3,141, + 3,83,0,41,4,78,114,159,0,0,0,114,145,0,0,0, + 41,2,114,116,0,0,0,114,106,0,0,0,41,5,114,179, + 0,0,0,114,227,0,0,0,114,152,0,0,0,114,165,0, + 0,0,114,235,0,0,0,41,5,114,118,0,0,0,114,139, + 0,0,0,114,44,0,0,0,114,26,0,0,0,114,151,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,213,0,0,0,17,4,0,0,115,24,0,0,0,10, + 1,10,1,2,4,2,1,6,254,12,4,2,1,14,1,2, + 1,2,1,6,253,255,128,122,29,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,41,6,114,125,0,0,0, - 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, - 213,0,0,0,114,229,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,5,1, - 0,0,13,4,0,0,115,6,0,0,0,8,2,4,2,8, - 16,114,5,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, - 92,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, - 100,10,100,11,132,0,90,8,100,12,100,13,132,0,90,9, - 100,14,100,15,132,0,90,10,100,16,100,17,132,0,90,11, - 101,12,100,18,100,19,132,0,131,1,90,13,100,20,83,0, - 41,21,114,252,0,0,0,122,93,76,111,97,100,101,114,32, - 102,111,114,32,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,115,46,10,10,32,32,32,32,84,104,101,32, - 99,111,110,115,116,114,117,99,116,111,114,32,105,115,32,100, - 101,115,105,103,110,101,100,32,116,111,32,119,111,114,107,32, - 119,105,116,104,32,70,105,108,101,70,105,110,100,101,114,46, - 10,10,32,32,32,32,99,3,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, - 16,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, - 100,0,83,0,114,109,0,0,0,114,159,0,0,0,41,3, - 114,118,0,0,0,114,116,0,0,0,114,44,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,209, - 0,0,0,50,4,0,0,115,4,0,0,0,0,1,6,1, + 116,95,99,111,100,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,1,83,0,41,2,122,39,82,101,116,117, + 114,110,32,78,111,110,101,32,97,115,32,116,104,101,114,101, + 32,105,115,32,110,111,32,115,111,117,114,99,101,32,99,111, + 100,101,46,78,114,5,0,0,0,114,219,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,229,0, + 0,0,33,4,0,0,115,4,0,0,0,4,2,255,128,122, + 31,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,41,6,114,125,0,0,0,114,124,0,0,0,114,126,0, + 0,0,114,127,0,0,0,114,213,0,0,0,114,229,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,5,1,0,0,13,4,0,0,115,10, + 0,0,0,8,0,4,2,8,2,12,16,255,128,114,5,1, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,64,0,0,0,115,92,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, + 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, + 132,0,90,6,100,8,100,9,132,0,90,7,100,10,100,11, + 132,0,90,8,100,12,100,13,132,0,90,9,100,14,100,15, + 132,0,90,10,100,16,100,17,132,0,90,11,101,12,100,18, + 100,19,132,0,131,1,90,13,100,20,83,0,41,21,114,252, + 0,0,0,122,93,76,111,97,100,101,114,32,102,111,114,32, + 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, + 115,46,10,10,32,32,32,32,84,104,101,32,99,111,110,115, + 116,114,117,99,116,111,114,32,105,115,32,100,101,115,105,103, + 110,101,100,32,116,111,32,119,111,114,107,32,119,105,116,104, + 32,70,105,108,101,70,105,110,100,101,114,46,10,10,32,32, + 32,32,99,3,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, + 124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0, + 114,109,0,0,0,114,159,0,0,0,41,3,114,118,0,0, + 0,114,116,0,0,0,114,44,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,50, + 4,0,0,115,8,0,0,0,6,1,6,1,4,128,255,128, 122,28,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,0,0,0,0,2,0,0,0,2, @@ -1648,157 +1659,159 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,1,106,0,107,2,111,22,124,0,106,1,124,1,106,1, 107,2,83,0,114,109,0,0,0,114,240,0,0,0,114,242, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,243,0,0,0,54,4,0,0,115,6,0,0,0, - 0,1,12,1,10,255,122,26,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,95,95,101,113, - 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,20,0,0,0, - 116,0,124,0,106,1,131,1,116,0,124,0,106,2,131,1, - 65,0,83,0,114,109,0,0,0,114,244,0,0,0,114,246, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,247,0,0,0,58,4,0,0,115,2,0,0,0, - 0,1,122,28,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,46,95,95,104,97,115,104,95,95, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,5,0,0,0,67,0,0,0,115,36,0,0,0,116,0, - 160,1,116,2,106,3,124,1,161,2,125,2,116,0,160,4, - 100,1,124,1,106,5,124,0,106,6,161,3,1,0,124,2, - 83,0,41,2,122,38,67,114,101,97,116,101,32,97,110,32, - 117,110,105,116,105,97,108,105,122,101,100,32,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,122,38,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,123, - 33,114,125,32,108,111,97,100,101,100,32,102,114,111,109,32, - 123,33,114,125,41,7,114,134,0,0,0,114,214,0,0,0, - 114,163,0,0,0,90,14,99,114,101,97,116,101,95,100,121, - 110,97,109,105,99,114,149,0,0,0,114,116,0,0,0,114, - 44,0,0,0,41,3,114,118,0,0,0,114,187,0,0,0, - 114,216,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,212,0,0,0,61,4,0,0,115,14,0, - 0,0,0,2,4,1,6,255,4,2,6,1,8,255,4,2, - 122,33,69,120,116,101,110,115,105,111,110,70,105,108,101,76, - 111,97,100,101,114,46,99,114,101,97,116,101,95,109,111,100, - 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,5,0,0,0,67,0,0,0,115,36,0,0, - 0,116,0,160,1,116,2,106,3,124,1,161,2,1,0,116, - 0,160,4,100,1,124,0,106,5,124,0,106,6,161,3,1, - 0,100,2,83,0,41,3,122,30,73,110,105,116,105,97,108, - 105,122,101,32,97,110,32,101,120,116,101,110,115,105,111,110, - 32,109,111,100,117,108,101,122,40,101,120,116,101,110,115,105, - 111,110,32,109,111,100,117,108,101,32,123,33,114,125,32,101, - 120,101,99,117,116,101,100,32,102,114,111,109,32,123,33,114, - 125,78,41,7,114,134,0,0,0,114,214,0,0,0,114,163, - 0,0,0,90,12,101,120,101,99,95,100,121,110,97,109,105, - 99,114,149,0,0,0,114,116,0,0,0,114,44,0,0,0, - 169,2,114,118,0,0,0,114,216,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,114,217,0,0,0, - 69,4,0,0,115,8,0,0,0,0,2,14,1,6,1,8, - 255,122,31,69,120,116,101,110,115,105,111,110,70,105,108,101, - 76,111,97,100,101,114,46,101,120,101,99,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,3,0,0,0,115,36,0,0,0, - 116,0,124,0,106,1,131,1,100,1,25,0,137,0,116,2, - 135,0,102,1,100,2,100,3,132,8,116,3,68,0,131,1, - 131,1,83,0,41,4,122,49,82,101,116,117,114,110,32,84, - 114,117,101,32,105,102,32,116,104,101,32,101,120,116,101,110, - 115,105,111,110,32,109,111,100,117,108,101,32,105,115,32,97, - 32,112,97,99,107,97,103,101,46,114,39,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,51,0,0,0,115,26,0,0,0,124,0,93,18, - 125,1,136,0,100,0,124,1,23,0,107,2,86,0,1,0, - 113,2,100,1,83,0,41,2,114,209,0,0,0,78,114,5, - 0,0,0,169,2,114,32,0,0,0,218,6,115,117,102,102, - 105,120,169,1,90,9,102,105,108,101,95,110,97,109,101,114, - 5,0,0,0,114,8,0,0,0,218,9,60,103,101,110,101, - 120,112,114,62,78,4,0,0,115,4,0,0,0,4,1,2, - 255,122,49,69,120,116,101,110,115,105,111,110,70,105,108,101, + 0,0,114,243,0,0,0,54,4,0,0,115,8,0,0,0, + 12,1,10,1,2,255,255,128,122,26,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95, + 101,113,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,20,0, + 0,0,116,0,124,0,106,1,131,1,116,0,124,0,106,2, + 131,1,65,0,83,0,114,109,0,0,0,114,244,0,0,0, + 114,246,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,247,0,0,0,58,4,0,0,115,4,0, + 0,0,20,1,255,128,122,28,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97, + 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,5,0,0,0,67,0,0,0,115,36,0, + 0,0,116,0,160,1,116,2,106,3,124,1,161,2,125,2, + 116,0,160,4,100,1,124,1,106,5,124,0,106,6,161,3, + 1,0,124,2,83,0,41,2,122,38,67,114,101,97,116,101, + 32,97,110,32,117,110,105,116,105,97,108,105,122,101,100,32, + 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, + 122,38,101,120,116,101,110,115,105,111,110,32,109,111,100,117, + 108,101,32,123,33,114,125,32,108,111,97,100,101,100,32,102, + 114,111,109,32,123,33,114,125,41,7,114,134,0,0,0,114, + 214,0,0,0,114,163,0,0,0,90,14,99,114,101,97,116, + 101,95,100,121,110,97,109,105,99,114,149,0,0,0,114,116, + 0,0,0,114,44,0,0,0,41,3,114,118,0,0,0,114, + 187,0,0,0,114,216,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,212,0,0,0,61,4,0, + 0,115,16,0,0,0,4,2,6,1,4,255,6,2,8,1, + 4,255,4,2,255,128,122,33,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,99,114,101,97, + 116,101,95,109,111,100,117,108,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,5,0,0,0,67,0, + 0,0,115,36,0,0,0,116,0,160,1,116,2,106,3,124, + 1,161,2,1,0,116,0,160,4,100,1,124,0,106,5,124, + 0,106,6,161,3,1,0,100,2,83,0,41,3,122,30,73, + 110,105,116,105,97,108,105,122,101,32,97,110,32,101,120,116, + 101,110,115,105,111,110,32,109,111,100,117,108,101,122,40,101, + 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,32, + 123,33,114,125,32,101,120,101,99,117,116,101,100,32,102,114, + 111,109,32,123,33,114,125,78,41,7,114,134,0,0,0,114, + 214,0,0,0,114,163,0,0,0,90,12,101,120,101,99,95, + 100,121,110,97,109,105,99,114,149,0,0,0,114,116,0,0, + 0,114,44,0,0,0,169,2,114,118,0,0,0,114,216,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,217,0,0,0,69,4,0,0,115,12,0,0,0,14, + 2,6,1,8,1,4,255,4,128,255,128,122,31,69,120,116, + 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, + 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,3,0,0,0,115,36,0,0,0,116,0,124,0,106,1, + 131,1,100,1,25,0,137,0,116,2,135,0,102,1,100,2, + 100,3,132,8,116,3,68,0,131,1,131,1,83,0,41,4, + 122,49,82,101,116,117,114,110,32,84,114,117,101,32,105,102, + 32,116,104,101,32,101,120,116,101,110,115,105,111,110,32,109, + 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, + 103,101,46,114,39,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,51,0,0, + 0,115,26,0,0,0,124,0,93,18,125,1,136,0,100,0, + 124,1,23,0,107,2,86,0,1,0,113,2,100,1,83,0, + 41,2,114,209,0,0,0,78,114,5,0,0,0,169,2,114, + 32,0,0,0,218,6,115,117,102,102,105,120,169,1,90,9, + 102,105,108,101,95,110,97,109,101,114,5,0,0,0,114,8, + 0,0,0,218,9,60,103,101,110,101,120,112,114,62,78,4, + 0,0,115,10,0,0,0,4,0,2,1,16,255,4,128,255, + 128,122,49,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,111,99,97,108,115,62,46,60,103,101,110,101, 120,112,114,62,41,4,114,47,0,0,0,114,44,0,0,0, 218,3,97,110,121,218,18,69,88,84,69,78,83,73,79,78, 95,83,85,70,70,73,88,69,83,114,219,0,0,0,114,5, 0,0,0,114,9,1,0,0,114,8,0,0,0,114,182,0, - 0,0,75,4,0,0,115,8,0,0,0,0,2,14,1,12, - 1,2,255,122,30,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,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,122,63,82,101,116,117,114,110,32, - 78,111,110,101,32,97,115,32,97,110,32,101,120,116,101,110, - 115,105,111,110,32,109,111,100,117,108,101,32,99,97,110,110, - 111,116,32,99,114,101,97,116,101,32,97,32,99,111,100,101, - 32,111,98,106,101,99,116,46,78,114,5,0,0,0,114,219, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,213,0,0,0,81,4,0,0,115,2,0,0,0, - 0,2,122,28,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,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, - 83,0,41,2,122,53,82,101,116,117,114,110,32,78,111,110, - 101,32,97,115,32,101,120,116,101,110,115,105,111,110,32,109, - 111,100,117,108,101,115,32,104,97,118,101,32,110,111,32,115, - 111,117,114,99,101,32,99,111,100,101,46,78,114,5,0,0, - 0,114,219,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,229,0,0,0,85,4,0,0,115,2, - 0,0,0,0,2,122,30,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,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,6, - 0,0,0,124,0,106,0,83,0,114,250,0,0,0,114,48, - 0,0,0,114,219,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,179,0,0,0,89,4,0,0, - 115,2,0,0,0,0,3,122,32,69,120,116,101,110,115,105, - 111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,116, - 95,102,105,108,101,110,97,109,101,78,41,14,114,125,0,0, - 0,114,124,0,0,0,114,126,0,0,0,114,127,0,0,0, - 114,209,0,0,0,114,243,0,0,0,114,247,0,0,0,114, - 212,0,0,0,114,217,0,0,0,114,182,0,0,0,114,213, - 0,0,0,114,229,0,0,0,114,136,0,0,0,114,179,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,252,0,0,0,42,4,0,0,115, - 22,0,0,0,8,2,4,6,8,4,8,4,8,3,8,8, - 8,6,8,6,8,4,8,4,2,1,114,252,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,64,0,0,0,115,104,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, - 4,100,4,100,5,132,0,90,5,100,6,100,7,132,0,90, - 6,100,8,100,9,132,0,90,7,100,10,100,11,132,0,90, - 8,100,12,100,13,132,0,90,9,100,14,100,15,132,0,90, - 10,100,16,100,17,132,0,90,11,100,18,100,19,132,0,90, - 12,100,20,100,21,132,0,90,13,100,22,100,23,132,0,90, - 14,100,24,83,0,41,25,218,14,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,97,38,1,0,0,82,101,112,114, - 101,115,101,110,116,115,32,97,32,110,97,109,101,115,112,97, - 99,101,32,112,97,99,107,97,103,101,39,115,32,112,97,116, - 104,46,32,32,73,116,32,117,115,101,115,32,116,104,101,32, - 109,111,100,117,108,101,32,110,97,109,101,10,32,32,32,32, - 116,111,32,102,105,110,100,32,105,116,115,32,112,97,114,101, - 110,116,32,109,111,100,117,108,101,44,32,97,110,100,32,102, - 114,111,109,32,116,104,101,114,101,32,105,116,32,108,111,111, - 107,115,32,117,112,32,116,104,101,32,112,97,114,101,110,116, - 39,115,10,32,32,32,32,95,95,112,97,116,104,95,95,46, - 32,32,87,104,101,110,32,116,104,105,115,32,99,104,97,110, - 103,101,115,44,32,116,104,101,32,109,111,100,117,108,101,39, - 115,32,111,119,110,32,112,97,116,104,32,105,115,32,114,101, - 99,111,109,112,117,116,101,100,44,10,32,32,32,32,117,115, - 105,110,103,32,112,97,116,104,95,102,105,110,100,101,114,46, - 32,32,70,111,114,32,116,111,112,45,108,101,118,101,108,32, - 109,111,100,117,108,101,115,44,32,116,104,101,32,112,97,114, - 101,110,116,32,109,111,100,117,108,101,39,115,32,112,97,116, - 104,10,32,32,32,32,105,115,32,115,121,115,46,112,97,116, - 104,46,99,4,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,3,0,0,0,67,0,0,0,115,36,0,0,0, - 124,1,124,0,95,0,124,2,124,0,95,1,116,2,124,0, - 160,3,161,0,131,1,124,0,95,4,124,3,124,0,95,5, - 100,0,83,0,114,109,0,0,0,41,6,218,5,95,110,97, - 109,101,218,5,95,112,97,116,104,114,111,0,0,0,218,16, - 95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104, - 218,17,95,108,97,115,116,95,112,97,114,101,110,116,95,112, - 97,116,104,218,12,95,112,97,116,104,95,102,105,110,100,101, - 114,169,4,114,118,0,0,0,114,116,0,0,0,114,44,0, - 0,0,90,11,112,97,116,104,95,102,105,110,100,101,114,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,209, - 0,0,0,102,4,0,0,115,8,0,0,0,0,1,6,1, - 6,1,14,1,122,23,95,78,97,109,101,115,112,97,99,101, + 0,0,75,4,0,0,115,10,0,0,0,14,2,12,1,2, + 1,8,255,255,128,122,30,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,0,0, + 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,122,63,82,101,116,117,114, + 110,32,78,111,110,101,32,97,115,32,97,110,32,101,120,116, + 101,110,115,105,111,110,32,109,111,100,117,108,101,32,99,97, + 110,110,111,116,32,99,114,101,97,116,101,32,97,32,99,111, + 100,101,32,111,98,106,101,99,116,46,78,114,5,0,0,0, + 114,219,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,213,0,0,0,81,4,0,0,115,4,0, + 0,0,4,2,255,128,122,28,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,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,41,2,122,53,82,101,116,117,114,110, + 32,78,111,110,101,32,97,115,32,101,120,116,101,110,115,105, + 111,110,32,109,111,100,117,108,101,115,32,104,97,118,101,32, + 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, + 114,5,0,0,0,114,219,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,229,0,0,0,85,4, + 0,0,115,4,0,0,0,4,2,255,128,122,30,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,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,114, + 250,0,0,0,114,48,0,0,0,114,219,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,179,0, + 0,0,89,4,0,0,115,4,0,0,0,6,3,255,128,122, + 32,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, + 97,100,101,114,46,103,101,116,95,102,105,108,101,110,97,109, + 101,78,41,14,114,125,0,0,0,114,124,0,0,0,114,126, + 0,0,0,114,127,0,0,0,114,209,0,0,0,114,243,0, + 0,0,114,247,0,0,0,114,212,0,0,0,114,217,0,0, + 0,114,182,0,0,0,114,213,0,0,0,114,229,0,0,0, + 114,136,0,0,0,114,179,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,252, + 0,0,0,42,4,0,0,115,26,0,0,0,8,0,4,2, + 8,6,8,4,8,4,8,3,8,8,8,6,8,6,8,4, + 2,4,14,1,255,128,114,252,0,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 64,0,0,0,115,104,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, + 5,132,0,90,5,100,6,100,7,132,0,90,6,100,8,100, + 9,132,0,90,7,100,10,100,11,132,0,90,8,100,12,100, + 13,132,0,90,9,100,14,100,15,132,0,90,10,100,16,100, + 17,132,0,90,11,100,18,100,19,132,0,90,12,100,20,100, + 21,132,0,90,13,100,22,100,23,132,0,90,14,100,24,83, + 0,41,25,218,14,95,78,97,109,101,115,112,97,99,101,80, + 97,116,104,97,38,1,0,0,82,101,112,114,101,115,101,110, + 116,115,32,97,32,110,97,109,101,115,112,97,99,101,32,112, + 97,99,107,97,103,101,39,115,32,112,97,116,104,46,32,32, + 73,116,32,117,115,101,115,32,116,104,101,32,109,111,100,117, + 108,101,32,110,97,109,101,10,32,32,32,32,116,111,32,102, + 105,110,100,32,105,116,115,32,112,97,114,101,110,116,32,109, + 111,100,117,108,101,44,32,97,110,100,32,102,114,111,109,32, + 116,104,101,114,101,32,105,116,32,108,111,111,107,115,32,117, + 112,32,116,104,101,32,112,97,114,101,110,116,39,115,10,32, + 32,32,32,95,95,112,97,116,104,95,95,46,32,32,87,104, + 101,110,32,116,104,105,115,32,99,104,97,110,103,101,115,44, + 32,116,104,101,32,109,111,100,117,108,101,39,115,32,111,119, + 110,32,112,97,116,104,32,105,115,32,114,101,99,111,109,112, + 117,116,101,100,44,10,32,32,32,32,117,115,105,110,103,32, + 112,97,116,104,95,102,105,110,100,101,114,46,32,32,70,111, + 114,32,116,111,112,45,108,101,118,101,108,32,109,111,100,117, + 108,101,115,44,32,116,104,101,32,112,97,114,101,110,116,32, + 109,111,100,117,108,101,39,115,32,112,97,116,104,10,32,32, + 32,32,105,115,32,115,121,115,46,112,97,116,104,46,99,4, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3, + 0,0,0,67,0,0,0,115,36,0,0,0,124,1,124,0, + 95,0,124,2,124,0,95,1,116,2,124,0,160,3,161,0, + 131,1,124,0,95,4,124,3,124,0,95,5,100,0,83,0, + 114,109,0,0,0,41,6,218,5,95,110,97,109,101,218,5, + 95,112,97,116,104,114,111,0,0,0,218,16,95,103,101,116, + 95,112,97,114,101,110,116,95,112,97,116,104,218,17,95,108, + 97,115,116,95,112,97,114,101,110,116,95,112,97,116,104,218, + 12,95,112,97,116,104,95,102,105,110,100,101,114,169,4,114, + 118,0,0,0,114,116,0,0,0,114,44,0,0,0,90,11, + 112,97,116,104,95,102,105,110,100,101,114,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,102, + 4,0,0,115,12,0,0,0,6,1,6,1,14,1,6,1, + 4,128,255,128,122,23,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,0,0,0,0,4,0,0,0,3,0, 0,0,67,0,0,0,115,38,0,0,0,124,0,106,0,160, @@ -1815,70 +1828,71 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 90,2,109,101,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,23,95,102,105,110,100,95,112,97,114,101,110, 116,95,112,97,116,104,95,110,97,109,101,115,108,4,0,0, - 115,8,0,0,0,0,2,18,1,8,2,4,3,122,38,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,101,115,99,1,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,28, - 0,0,0,124,0,160,0,161,0,92,2,125,1,125,2,116, - 1,116,2,106,3,124,1,25,0,124,2,131,2,83,0,114, - 109,0,0,0,41,4,114,21,1,0,0,114,130,0,0,0, - 114,1,0,0,0,218,7,109,111,100,117,108,101,115,41,3, - 114,118,0,0,0,90,18,112,97,114,101,110,116,95,109,111, - 100,117,108,101,95,110,97,109,101,90,14,112,97,116,104,95, - 97,116,116,114,95,110,97,109,101,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,16,1,0,0,118,4,0, - 0,115,4,0,0,0,0,1,12,1,122,31,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,0,0,0,0,3,0,0,0,4,0,0,0, - 67,0,0,0,115,80,0,0,0,116,0,124,0,160,1,161, - 0,131,1,125,1,124,1,124,0,106,2,107,3,114,74,124, - 0,160,3,124,0,106,4,124,1,161,2,125,2,124,2,100, - 0,117,1,114,68,124,2,106,5,100,0,117,0,114,68,124, - 2,106,6,114,68,124,2,106,6,124,0,95,7,124,1,124, - 0,95,2,124,0,106,7,83,0,114,109,0,0,0,41,8, - 114,111,0,0,0,114,16,1,0,0,114,17,1,0,0,114, - 18,1,0,0,114,14,1,0,0,114,140,0,0,0,114,178, - 0,0,0,114,15,1,0,0,41,3,114,118,0,0,0,90, - 11,112,97,114,101,110,116,95,112,97,116,104,114,187,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,12,95,114,101,99,97,108,99,117,108,97,116,101,122,4, - 0,0,115,16,0,0,0,0,2,12,1,10,1,14,3,18, - 1,6,1,8,1,6,1,122,27,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,46,95,114,101,99,97,108,99,117, - 108,97,116,101,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0, - 0,0,116,0,124,0,160,1,161,0,131,1,83,0,114,109, - 0,0,0,41,2,218,4,105,116,101,114,114,23,1,0,0, - 114,246,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,8,95,95,105,116,101,114,95,95,135,4, - 0,0,115,2,0,0,0,0,1,122,23,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,46,95,95,105,116,101,114, - 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,2,0,0,0,67,0,0,0,115,12,0,0,0, - 124,0,160,0,161,0,124,1,25,0,83,0,114,109,0,0, - 0,169,1,114,23,1,0,0,41,2,114,118,0,0,0,218, - 5,105,110,100,101,120,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,11,95,95,103,101,116,105,116,101,109, - 95,95,138,4,0,0,115,2,0,0,0,0,1,122,26,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, - 103,101,116,105,116,101,109,95,95,99,3,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, - 0,0,115,14,0,0,0,124,2,124,0,106,0,124,1,60, - 0,100,0,83,0,114,109,0,0,0,41,1,114,15,1,0, - 0,41,3,114,118,0,0,0,114,27,1,0,0,114,44,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,11,95,95,115,101,116,105,116,101,109,95,95,141,4, - 0,0,115,2,0,0,0,0,1,122,26,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,46,95,95,115,101,116,105, - 116,101,109,95,95,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,116,0,124,0,160,1,161,0,131,1,83,0,114, - 109,0,0,0,41,2,114,23,0,0,0,114,23,1,0,0, - 114,246,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,7,95,95,108,101,110,95,95,144,4,0, - 0,115,2,0,0,0,0,1,122,22,95,78,97,109,101,115, + 115,10,0,0,0,18,2,8,1,4,2,8,3,255,128,122, + 38,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,101,115,99,1,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, + 115,28,0,0,0,124,0,160,0,161,0,92,2,125,1,125, + 2,116,1,116,2,106,3,124,1,25,0,124,2,131,2,83, + 0,114,109,0,0,0,41,4,114,21,1,0,0,114,130,0, + 0,0,114,1,0,0,0,218,7,109,111,100,117,108,101,115, + 41,3,114,118,0,0,0,90,18,112,97,114,101,110,116,95, + 109,111,100,117,108,101,95,110,97,109,101,90,14,112,97,116, + 104,95,97,116,116,114,95,110,97,109,101,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,16,1,0,0,118, + 4,0,0,115,6,0,0,0,12,1,16,1,255,128,122,31, + 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,0,0,0,0,3,0,0,0, + 4,0,0,0,67,0,0,0,115,80,0,0,0,116,0,124, + 0,160,1,161,0,131,1,125,1,124,1,124,0,106,2,107, + 3,114,74,124,0,160,3,124,0,106,4,124,1,161,2,125, + 2,124,2,100,0,117,1,114,68,124,2,106,5,100,0,117, + 0,114,68,124,2,106,6,114,68,124,2,106,6,124,0,95, + 7,124,1,124,0,95,2,124,0,106,7,83,0,114,109,0, + 0,0,41,8,114,111,0,0,0,114,16,1,0,0,114,17, + 1,0,0,114,18,1,0,0,114,14,1,0,0,114,140,0, + 0,0,114,178,0,0,0,114,15,1,0,0,41,3,114,118, + 0,0,0,90,11,112,97,114,101,110,116,95,112,97,116,104, + 114,187,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,12,95,114,101,99,97,108,99,117,108,97, + 116,101,122,4,0,0,115,18,0,0,0,12,2,10,1,14, + 1,18,3,6,1,8,1,6,1,6,1,255,128,122,27,95, + 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,114, + 101,99,97,108,99,117,108,97,116,101,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, + 0,0,0,115,12,0,0,0,116,0,124,0,160,1,161,0, + 131,1,83,0,114,109,0,0,0,41,2,218,4,105,116,101, + 114,114,23,1,0,0,114,246,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,8,95,95,105,116, + 101,114,95,95,135,4,0,0,115,4,0,0,0,12,1,255, + 128,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,46,95,95,105,116,101,114,95,95,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67, + 0,0,0,115,12,0,0,0,124,0,160,0,161,0,124,1, + 25,0,83,0,114,109,0,0,0,169,1,114,23,1,0,0, + 41,2,114,118,0,0,0,218,5,105,110,100,101,120,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,11,95, + 95,103,101,116,105,116,101,109,95,95,138,4,0,0,115,4, + 0,0,0,12,1,255,128,122,26,95,78,97,109,101,115,112, + 97,99,101,80,97,116,104,46,95,95,103,101,116,105,116,101, + 109,95,95,99,3,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,3,0,0,0,67,0,0,0,115,14,0,0, + 0,124,2,124,0,106,0,124,1,60,0,100,0,83,0,114, + 109,0,0,0,41,1,114,15,1,0,0,41,3,114,118,0, + 0,0,114,27,1,0,0,114,44,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,11,95,95,115, + 101,116,105,116,101,109,95,95,141,4,0,0,115,6,0,0, + 0,10,1,4,128,255,128,122,26,95,78,97,109,101,115,112, + 97,99,101,80,97,116,104,46,95,95,115,101,116,105,116,101, + 109,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, + 0,116,0,124,0,160,1,161,0,131,1,83,0,114,109,0, + 0,0,41,2,114,23,0,0,0,114,23,1,0,0,114,246, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,7,95,95,108,101,110,95,95,144,4,0,0,115, + 4,0,0,0,12,1,255,128,122,22,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,0,0,0,0,1,0,0, 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, @@ -1887,48 +1901,49 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,125,41,41,2,114,62,0,0,0,114,15,1,0,0,114, 246,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,8,95,95,114,101,112,114,95,95,147,4,0, - 0,115,2,0,0,0,0,1,122,23,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,0,0,0,0,2,0, - 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,124, - 1,124,0,160,0,161,0,118,0,83,0,114,109,0,0,0, - 114,26,1,0,0,169,2,114,118,0,0,0,218,4,105,116, - 101,109,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,12,95,95,99,111,110,116,97,105,110,115,95,95,150, - 4,0,0,115,2,0,0,0,0,1,122,27,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, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,16,0,0,0,124,0,106,0,160,1,124,1,161,1,1, - 0,100,0,83,0,114,109,0,0,0,41,2,114,15,1,0, - 0,114,186,0,0,0,114,32,1,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,186,0,0,0,153, - 4,0,0,115,2,0,0,0,0,1,122,21,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,46,97,112,112,101,110, - 100,78,41,15,114,125,0,0,0,114,124,0,0,0,114,126, - 0,0,0,114,127,0,0,0,114,209,0,0,0,114,21,1, - 0,0,114,16,1,0,0,114,23,1,0,0,114,25,1,0, - 0,114,28,1,0,0,114,29,1,0,0,114,30,1,0,0, - 114,31,1,0,0,114,34,1,0,0,114,186,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,13,1,0,0,95,4,0,0,115,24,0,0, - 0,8,1,4,6,8,6,8,10,8,4,8,13,8,3,8, - 3,8,3,8,3,8,3,8,3,114,13,1,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,64,0,0,0,115,80,0,0,0,101,0,90,1, - 100,0,90,2,100,1,100,2,132,0,90,3,101,4,100,3, - 100,4,132,0,131,1,90,5,100,5,100,6,132,0,90,6, - 100,7,100,8,132,0,90,7,100,9,100,10,132,0,90,8, - 100,11,100,12,132,0,90,9,100,13,100,14,132,0,90,10, - 100,15,100,16,132,0,90,11,100,17,83,0,41,18,218,16, - 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, - 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,18,0,0,0,116,0, - 124,1,124,2,124,3,131,3,124,0,95,1,100,0,83,0, - 114,109,0,0,0,41,2,114,13,1,0,0,114,15,1,0, - 0,114,19,1,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,209,0,0,0,159,4,0,0,115,2, - 0,0,0,0,1,122,25,95,78,97,109,101,115,112,97,99, + 0,115,4,0,0,0,12,1,255,128,122,23,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,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, + 0,124,1,124,0,160,0,161,0,118,0,83,0,114,109,0, + 0,0,114,26,1,0,0,169,2,114,118,0,0,0,218,4, + 105,116,101,109,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, + 95,150,4,0,0,115,4,0,0,0,12,1,255,128,122,27, + 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,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124, + 1,161,1,1,0,100,0,83,0,114,109,0,0,0,41,2, + 114,15,1,0,0,114,186,0,0,0,114,32,1,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,186, + 0,0,0,153,4,0,0,115,6,0,0,0,12,1,4,128, + 255,128,122,21,95,78,97,109,101,115,112,97,99,101,80,97, + 116,104,46,97,112,112,101,110,100,78,41,15,114,125,0,0, + 0,114,124,0,0,0,114,126,0,0,0,114,127,0,0,0, + 114,209,0,0,0,114,21,1,0,0,114,16,1,0,0,114, + 23,1,0,0,114,25,1,0,0,114,28,1,0,0,114,29, + 1,0,0,114,30,1,0,0,114,31,1,0,0,114,34,1, + 0,0,114,186,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,13,1,0,0, + 95,4,0,0,115,28,0,0,0,8,0,4,1,8,6,8, + 6,8,10,8,4,8,13,8,3,8,3,8,3,8,3,8, + 3,12,3,255,128,114,13,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, + 0,0,0,115,80,0,0,0,101,0,90,1,100,0,90,2, + 100,1,100,2,132,0,90,3,101,4,100,3,100,4,132,0, + 131,1,90,5,100,5,100,6,132,0,90,6,100,7,100,8, + 132,0,90,7,100,9,100,10,132,0,90,8,100,11,100,12, + 132,0,90,9,100,13,100,14,132,0,90,10,100,15,100,16, + 132,0,90,11,100,17,83,0,41,18,218,16,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,99,4,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, + 0,67,0,0,0,115,18,0,0,0,116,0,124,1,124,2, + 124,3,131,3,124,0,95,1,100,0,83,0,114,109,0,0, + 0,41,2,114,13,1,0,0,114,15,1,0,0,114,19,1, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,209,0,0,0,159,4,0,0,115,6,0,0,0,14, + 1,4,128,255,128,122,25,95,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,0,0,0,0,2,0,0, 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, @@ -1945,62 +1960,63 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,125,0,0,0,41,2,114,193,0,0,0,114, 216,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,11,109,111,100,117,108,101,95,114,101,112,114, - 162,4,0,0,115,2,0,0,0,0,7,122,28,95,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,78,84,114, - 5,0,0,0,114,219,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,182,0,0,0,171,4,0, - 0,115,2,0,0,0,0,1,122,27,95,78,97,109,101,115, - 112,97,99,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,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,78,114,40,0,0,0,114, - 5,0,0,0,114,219,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,229,0,0,0,174,4,0, - 0,115,2,0,0,0,0,1,122,27,95,78,97,109,101,115, - 112,97,99,101,76,111,97,100,101,114,46,103,101,116,95,115, - 111,117,114,99,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,6,0,0,0,67,0,0,0,115,16, - 0,0,0,116,0,100,1,100,2,100,3,100,4,100,5,141, - 4,83,0,41,6,78,114,40,0,0,0,122,8,60,115,116, - 114,105,110,103,62,114,215,0,0,0,84,41,1,114,231,0, - 0,0,41,1,114,232,0,0,0,114,219,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,213,0, - 0,0,177,4,0,0,115,2,0,0,0,0,1,122,25,95, + 162,4,0,0,115,4,0,0,0,12,7,255,128,122,28,95, 78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,114,210,0,0,0,114, - 5,0,0,0,114,211,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,212,0,0,0,180,4,0, - 0,115,2,0,0,0,0,1,122,30,95,78,97,109,101,115, - 112,97,99,101,76,111,97,100,101,114,46,99,114,101,97,116, - 101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,0,83,0,114,109,0,0,0,114, - 5,0,0,0,114,6,1,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,217,0,0,0,183,4,0, - 0,115,2,0,0,0,0,1,122,28,95,78,97,109,101,115, - 112,97,99,101,76,111,97,100,101,114,46,101,120,101,99,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, - 26,0,0,0,116,0,160,1,100,1,124,0,106,2,161,2, - 1,0,116,0,160,3,124,0,124,1,161,2,83,0,41,2, - 122,98,76,111,97,100,32,97,32,110,97,109,101,115,112,97, - 99,101,32,109,111,100,117,108,101,46,10,10,32,32,32,32, - 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, - 85,115,101,32,101,120,101,99,95,109,111,100,117,108,101,40, - 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, - 32,32,32,32,122,38,110,97,109,101,115,112,97,99,101,32, - 109,111,100,117,108,101,32,108,111,97,100,101,100,32,119,105, - 116,104,32,112,97,116,104,32,123,33,114,125,41,4,114,134, - 0,0,0,114,149,0,0,0,114,15,1,0,0,114,218,0, - 0,0,114,219,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,220,0,0,0,186,4,0,0,115, - 8,0,0,0,0,7,6,1,4,255,4,2,122,28,95,78, + 109,111,100,117,108,101,95,114,101,112,114,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,78, + 84,114,5,0,0,0,114,219,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,182,0,0,0,171, + 4,0,0,115,4,0,0,0,4,1,255,128,122,27,95,78, + 97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,40, + 0,0,0,114,5,0,0,0,114,219,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,229,0,0, + 0,174,4,0,0,115,4,0,0,0,4,1,255,128,122,27, + 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, + 46,103,101,116,95,115,111,117,114,99,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,6,0,0,0, + 67,0,0,0,115,16,0,0,0,116,0,100,1,100,2,100, + 3,100,4,100,5,141,4,83,0,41,6,78,114,40,0,0, + 0,122,8,60,115,116,114,105,110,103,62,114,215,0,0,0, + 84,41,1,114,231,0,0,0,41,1,114,232,0,0,0,114, + 219,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,213,0,0,0,177,4,0,0,115,4,0,0, + 0,16,1,255,128,122,25,95,78,97,109,101,115,112,97,99, + 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,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 83,0,114,210,0,0,0,114,5,0,0,0,114,211,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,212,0,0,0,180,4,0,0,115,4,0,0,0,4,128, + 255,128,122,30,95,78,97,109,101,115,112,97,99,101,76,111, + 97,100,101,114,46,99,114,101,97,116,101,95,109,111,100,117, + 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,0,83,0,114,109,0,0,0,114,5,0,0,0,114,6, + 1,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,114,217,0,0,0,183,4,0,0,115,6,0,0,0, + 2,1,2,128,255,128,122,28,95,78,97,109,101,115,112,97, + 99,101,76,111,97,100,101,114,46,101,120,101,99,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,4,0,0,0,67,0,0,0,115,26,0, + 0,0,116,0,160,1,100,1,124,0,106,2,161,2,1,0, + 116,0,160,3,124,0,124,1,161,2,83,0,41,2,122,98, + 76,111,97,100,32,97,32,110,97,109,101,115,112,97,99,101, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, + 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, + 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, + 32,32,122,38,110,97,109,101,115,112,97,99,101,32,109,111, + 100,117,108,101,32,108,111,97,100,101,100,32,119,105,116,104, + 32,112,97,116,104,32,123,33,114,125,41,4,114,134,0,0, + 0,114,149,0,0,0,114,15,1,0,0,114,218,0,0,0, + 114,219,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,220,0,0,0,186,4,0,0,115,10,0, + 0,0,6,7,4,1,4,255,12,2,255,128,122,28,95,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,41,12,114,125,0, 0,0,114,124,0,0,0,114,126,0,0,0,114,209,0,0, @@ -2008,148 +2024,149 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,229,0,0,0,114,213,0,0,0,114,212,0,0,0,114, 217,0,0,0,114,220,0,0,0,114,5,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,35,1, - 0,0,158,4,0,0,115,18,0,0,0,8,1,8,3,2, - 1,10,8,8,3,8,3,8,3,8,3,8,3,114,35,1, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,64,0,0,0,115,118,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,101,4,100,2, - 100,3,132,0,131,1,90,5,101,4,100,4,100,5,132,0, - 131,1,90,6,101,4,100,6,100,7,132,0,131,1,90,7, - 101,4,100,8,100,9,132,0,131,1,90,8,101,4,100,19, - 100,11,100,12,132,1,131,1,90,9,101,4,100,20,100,13, - 100,14,132,1,131,1,90,10,101,4,100,21,100,15,100,16, - 132,1,131,1,90,11,101,4,100,17,100,18,132,0,131,1, - 90,12,100,10,83,0,41,22,218,10,80,97,116,104,70,105, - 110,100,101,114,122,62,77,101,116,97,32,112,97,116,104,32, - 102,105,110,100,101,114,32,102,111,114,32,115,121,115,46,112, - 97,116,104,32,97,110,100,32,112,97,99,107,97,103,101,32, - 95,95,112,97,116,104,95,95,32,97,116,116,114,105,98,117, - 116,101,115,46,99,1,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,4,0,0,0,67,0,0,0,115,64,0, - 0,0,116,0,116,1,106,2,160,3,161,0,131,1,68,0, - 93,44,92,2,125,1,125,2,124,2,100,1,117,0,114,40, - 116,1,106,2,124,1,61,0,113,14,116,4,124,2,100,2, - 131,2,114,14,124,2,160,5,161,0,1,0,113,14,100,1, - 83,0,41,3,122,125,67,97,108,108,32,116,104,101,32,105, - 110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115, - 40,41,32,109,101,116,104,111,100,32,111,110,32,97,108,108, - 32,112,97,116,104,32,101,110,116,114,121,32,102,105,110,100, - 101,114,115,10,32,32,32,32,32,32,32,32,115,116,111,114, - 101,100,32,105,110,32,115,121,115,46,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,115,32,40, - 119,104,101,114,101,32,105,109,112,108,101,109,101,110,116,101, - 100,41,46,78,218,17,105,110,118,97,108,105,100,97,116,101, - 95,99,97,99,104,101,115,41,6,218,4,108,105,115,116,114, - 1,0,0,0,218,19,112,97,116,104,95,105,109,112,111,114, - 116,101,114,95,99,97,99,104,101,218,5,105,116,101,109,115, - 114,128,0,0,0,114,38,1,0,0,41,3,114,193,0,0, - 0,114,116,0,0,0,218,6,102,105,110,100,101,114,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,38,1, - 0,0,204,4,0,0,115,10,0,0,0,0,4,22,1,8, - 1,10,1,10,1,122,28,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,0,0,0,0, - 3,0,0,0,9,0,0,0,67,0,0,0,115,80,0,0, - 0,116,0,106,1,100,1,117,1,114,28,116,0,106,1,115, - 28,116,2,160,3,100,2,116,4,161,2,1,0,116,0,106, - 1,68,0,93,40,125,2,122,14,124,2,124,1,131,1,87, - 0,2,0,1,0,83,0,4,0,116,5,121,74,1,0,1, - 0,1,0,89,0,113,34,89,0,113,34,48,0,100,1,83, - 0,41,3,122,46,83,101,97,114,99,104,32,115,121,115,46, - 112,97,116,104,95,104,111,111,107,115,32,102,111,114,32,97, - 32,102,105,110,100,101,114,32,102,111,114,32,39,112,97,116, - 104,39,46,78,122,23,115,121,115,46,112,97,116,104,95,104, - 111,111,107,115,32,105,115,32,101,109,112,116,121,41,6,114, - 1,0,0,0,218,10,112,97,116,104,95,104,111,111,107,115, - 114,75,0,0,0,114,76,0,0,0,114,138,0,0,0,114, - 117,0,0,0,41,3,114,193,0,0,0,114,44,0,0,0, - 90,4,104,111,111,107,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,11,95,112,97,116,104,95,104,111,111, - 107,115,214,4,0,0,115,16,0,0,0,0,3,16,1,12, - 1,10,1,2,1,14,1,12,1,10,2,122,22,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,0,0,0,0, - 3,0,0,0,8,0,0,0,67,0,0,0,115,100,0,0, - 0,124,1,100,1,107,2,114,42,122,12,116,0,160,1,161, - 0,125,1,87,0,110,20,4,0,116,2,121,40,1,0,1, - 0,1,0,89,0,100,2,83,0,48,0,122,14,116,3,106, - 4,124,1,25,0,125,2,87,0,110,38,4,0,116,5,121, - 94,1,0,1,0,1,0,124,0,160,6,124,1,161,1,125, - 2,124,2,116,3,106,4,124,1,60,0,89,0,110,2,48, - 0,124,2,83,0,41,3,122,210,71,101,116,32,116,104,101, - 32,102,105,110,100,101,114,32,102,111,114,32,116,104,101,32, - 112,97,116,104,32,101,110,116,114,121,32,102,114,111,109,32, - 115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101, - 114,95,99,97,99,104,101,46,10,10,32,32,32,32,32,32, - 32,32,73,102,32,116,104,101,32,112,97,116,104,32,101,110, - 116,114,121,32,105,115,32,110,111,116,32,105,110,32,116,104, - 101,32,99,97,99,104,101,44,32,102,105,110,100,32,116,104, - 101,32,97,112,112,114,111,112,114,105,97,116,101,32,102,105, - 110,100,101,114,10,32,32,32,32,32,32,32,32,97,110,100, - 32,99,97,99,104,101,32,105,116,46,32,73,102,32,110,111, - 32,102,105,110,100,101,114,32,105,115,32,97,118,97,105,108, - 97,98,108,101,44,32,115,116,111,114,101,32,78,111,110,101, - 46,10,10,32,32,32,32,32,32,32,32,114,40,0,0,0, - 78,41,7,114,4,0,0,0,114,55,0,0,0,218,17,70, - 105,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, - 114,1,0,0,0,114,40,1,0,0,218,8,75,101,121,69, - 114,114,111,114,114,44,1,0,0,41,3,114,193,0,0,0, - 114,44,0,0,0,114,42,1,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,20,95,112,97,116,104, - 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,227, - 4,0,0,115,22,0,0,0,0,8,8,1,2,1,12,1, - 12,3,8,1,2,1,14,1,12,1,10,1,16,1,122,31, - 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,99,97,99,104,101,99, - 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, - 4,0,0,0,67,0,0,0,115,82,0,0,0,116,0,124, - 2,100,1,131,2,114,26,124,2,160,1,124,1,161,1,92, - 2,125,3,125,4,110,14,124,2,160,2,124,1,161,1,125, - 3,103,0,125,4,124,3,100,0,117,1,114,60,116,3,160, - 4,124,1,124,3,161,2,83,0,116,3,160,5,124,1,100, - 0,161,2,125,5,124,4,124,5,95,6,124,5,83,0,41, - 2,78,114,137,0,0,0,41,7,114,128,0,0,0,114,137, - 0,0,0,114,206,0,0,0,114,134,0,0,0,114,201,0, - 0,0,114,183,0,0,0,114,178,0,0,0,41,6,114,193, - 0,0,0,114,139,0,0,0,114,42,1,0,0,114,140,0, - 0,0,114,141,0,0,0,114,187,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,16,95,108,101, - 103,97,99,121,95,103,101,116,95,115,112,101,99,249,4,0, - 0,115,18,0,0,0,0,4,10,1,16,2,10,1,4,1, - 8,1,12,1,12,1,6,1,122,27,80,97,116,104,70,105, - 110,100,101,114,46,95,108,101,103,97,99,121,95,103,101,116, - 95,115,112,101,99,78,99,4,0,0,0,0,0,0,0,0, - 0,0,0,9,0,0,0,5,0,0,0,67,0,0,0,115, - 166,0,0,0,103,0,125,4,124,2,68,0,93,134,125,5, - 116,0,124,5,116,1,116,2,102,2,131,2,115,28,113,8, - 124,0,160,3,124,5,161,1,125,6,124,6,100,1,117,1, - 114,8,116,4,124,6,100,2,131,2,114,70,124,6,160,5, - 124,1,124,3,161,2,125,7,110,12,124,0,160,6,124,1, - 124,6,161,2,125,7,124,7,100,1,117,0,114,92,113,8, - 124,7,106,7,100,1,117,1,114,110,124,7,2,0,1,0, - 83,0,124,7,106,8,125,8,124,8,100,1,117,0,114,132, - 116,9,100,3,131,1,130,1,124,4,160,10,124,8,161,1, - 1,0,113,8,116,11,160,12,124,1,100,1,161,2,125,7, - 124,4,124,7,95,8,124,7,83,0,41,4,122,63,70,105, - 110,100,32,116,104,101,32,108,111,97,100,101,114,32,111,114, - 32,110,97,109,101,115,112,97,99,101,95,112,97,116,104,32, - 102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,47, - 112,97,99,107,97,103,101,32,110,97,109,101,46,78,114,203, - 0,0,0,122,19,115,112,101,99,32,109,105,115,115,105,110, - 103,32,108,111,97,100,101,114,41,13,114,161,0,0,0,114, - 84,0,0,0,218,5,98,121,116,101,115,114,47,1,0,0, - 114,128,0,0,0,114,203,0,0,0,114,48,1,0,0,114, - 140,0,0,0,114,178,0,0,0,114,117,0,0,0,114,167, - 0,0,0,114,134,0,0,0,114,183,0,0,0,41,9,114, - 193,0,0,0,114,139,0,0,0,114,44,0,0,0,114,202, - 0,0,0,218,14,110,97,109,101,115,112,97,99,101,95,112, - 97,116,104,90,5,101,110,116,114,121,114,42,1,0,0,114, - 187,0,0,0,114,141,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,9,95,103,101,116,95,115, - 112,101,99,8,5,0,0,115,40,0,0,0,0,5,4,1, - 8,1,14,1,2,1,10,1,8,1,10,1,14,2,12,1, - 8,1,2,1,10,1,8,1,6,1,8,1,8,5,12,2, - 12,1,6,1,122,20,80,97,116,104,70,105,110,100,101,114, + 0,0,158,4,0,0,115,22,0,0,0,8,0,8,1,2, + 3,10,1,8,8,8,3,8,3,8,3,8,3,12,3,255, + 128,114,35,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, + 118,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4, + 100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0, + 131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8, + 101,4,100,19,100,11,100,12,132,1,131,1,90,9,101,4, + 100,20,100,13,100,14,132,1,131,1,90,10,101,4,100,21, + 100,15,100,16,132,1,131,1,90,11,101,4,100,17,100,18, + 132,0,131,1,90,12,100,10,83,0,41,22,218,10,80,97, + 116,104,70,105,110,100,101,114,122,62,77,101,116,97,32,112, + 97,116,104,32,102,105,110,100,101,114,32,102,111,114,32,115, + 121,115,46,112,97,116,104,32,97,110,100,32,112,97,99,107, + 97,103,101,32,95,95,112,97,116,104,95,95,32,97,116,116, + 114,105,98,117,116,101,115,46,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, + 0,115,64,0,0,0,116,0,116,1,106,2,160,3,161,0, + 131,1,68,0,93,44,92,2,125,1,125,2,124,2,100,1, + 117,0,114,40,116,1,106,2,124,1,61,0,113,14,116,4, + 124,2,100,2,131,2,114,14,124,2,160,5,161,0,1,0, + 113,14,100,1,83,0,41,3,122,125,67,97,108,108,32,116, + 104,101,32,105,110,118,97,108,105,100,97,116,101,95,99,97, + 99,104,101,115,40,41,32,109,101,116,104,111,100,32,111,110, + 32,97,108,108,32,112,97,116,104,32,101,110,116,114,121,32, + 102,105,110,100,101,114,115,10,32,32,32,32,32,32,32,32, + 115,116,111,114,101,100,32,105,110,32,115,121,115,46,112,97, + 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, + 101,115,32,40,119,104,101,114,101,32,105,109,112,108,101,109, + 101,110,116,101,100,41,46,78,218,17,105,110,118,97,108,105, + 100,97,116,101,95,99,97,99,104,101,115,41,6,218,4,108, + 105,115,116,114,1,0,0,0,218,19,112,97,116,104,95,105, + 109,112,111,114,116,101,114,95,99,97,99,104,101,218,5,105, + 116,101,109,115,114,128,0,0,0,114,38,1,0,0,41,3, + 114,193,0,0,0,114,116,0,0,0,218,6,102,105,110,100, + 101,114,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,38,1,0,0,204,4,0,0,115,14,0,0,0,22, + 4,8,1,10,1,10,1,10,1,4,128,255,128,122,28,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,0,0,0,0,3,0,0,0,9,0,0,0, + 67,0,0,0,115,80,0,0,0,116,0,106,1,100,1,117, + 1,114,28,116,0,106,1,115,28,116,2,160,3,100,2,116, + 4,161,2,1,0,116,0,106,1,68,0,93,40,125,2,122, + 14,124,2,124,1,131,1,87,0,2,0,1,0,83,0,4, + 0,116,5,121,74,1,0,1,0,1,0,89,0,113,34,89, + 0,113,34,48,0,100,1,83,0,41,3,122,46,83,101,97, + 114,99,104,32,115,121,115,46,112,97,116,104,95,104,111,111, + 107,115,32,102,111,114,32,97,32,102,105,110,100,101,114,32, + 102,111,114,32,39,112,97,116,104,39,46,78,122,23,115,121, + 115,46,112,97,116,104,95,104,111,111,107,115,32,105,115,32, + 101,109,112,116,121,41,6,114,1,0,0,0,218,10,112,97, + 116,104,95,104,111,111,107,115,114,75,0,0,0,114,76,0, + 0,0,114,138,0,0,0,114,117,0,0,0,41,3,114,193, + 0,0,0,114,44,0,0,0,90,4,104,111,111,107,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,11,95, + 112,97,116,104,95,104,111,111,107,115,214,4,0,0,115,18, + 0,0,0,16,3,12,1,10,1,2,1,14,1,12,1,10, + 1,4,2,255,128,122,22,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,0,0,0,0,3,0,0,0,8,0, + 0,0,67,0,0,0,115,100,0,0,0,124,1,100,1,107, + 2,114,42,122,12,116,0,160,1,161,0,125,1,87,0,110, + 20,4,0,116,2,121,40,1,0,1,0,1,0,89,0,100, + 2,83,0,48,0,122,14,116,3,106,4,124,1,25,0,125, + 2,87,0,110,38,4,0,116,5,121,94,1,0,1,0,1, + 0,124,0,160,6,124,1,161,1,125,2,124,2,116,3,106, + 4,124,1,60,0,89,0,110,2,48,0,124,2,83,0,41, + 3,122,210,71,101,116,32,116,104,101,32,102,105,110,100,101, + 114,32,102,111,114,32,116,104,101,32,112,97,116,104,32,101, + 110,116,114,121,32,102,114,111,109,32,115,121,115,46,112,97, + 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, + 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,116, + 104,101,32,112,97,116,104,32,101,110,116,114,121,32,105,115, + 32,110,111,116,32,105,110,32,116,104,101,32,99,97,99,104, + 101,44,32,102,105,110,100,32,116,104,101,32,97,112,112,114, + 111,112,114,105,97,116,101,32,102,105,110,100,101,114,10,32, + 32,32,32,32,32,32,32,97,110,100,32,99,97,99,104,101, + 32,105,116,46,32,73,102,32,110,111,32,102,105,110,100,101, + 114,32,105,115,32,97,118,97,105,108,97,98,108,101,44,32, + 115,116,111,114,101,32,78,111,110,101,46,10,10,32,32,32, + 32,32,32,32,32,114,40,0,0,0,78,41,7,114,4,0, + 0,0,114,55,0,0,0,218,17,70,105,108,101,78,111,116, + 70,111,117,110,100,69,114,114,111,114,114,1,0,0,0,114, + 40,1,0,0,218,8,75,101,121,69,114,114,111,114,114,44, + 1,0,0,41,3,114,193,0,0,0,114,44,0,0,0,114, + 42,1,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,20,95,112,97,116,104,95,105,109,112,111,114, + 116,101,114,95,99,97,99,104,101,227,4,0,0,115,24,0, + 0,0,8,8,2,1,12,1,12,1,8,3,2,1,14,1, + 12,1,10,1,16,1,4,1,255,128,122,31,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,99,97,99,104,101,99,3,0,0,0, + 0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0, + 67,0,0,0,115,82,0,0,0,116,0,124,2,100,1,131, + 2,114,26,124,2,160,1,124,1,161,1,92,2,125,3,125, + 4,110,14,124,2,160,2,124,1,161,1,125,3,103,0,125, + 4,124,3,100,0,117,1,114,60,116,3,160,4,124,1,124, + 3,161,2,83,0,116,3,160,5,124,1,100,0,161,2,125, + 5,124,4,124,5,95,6,124,5,83,0,41,2,78,114,137, + 0,0,0,41,7,114,128,0,0,0,114,137,0,0,0,114, + 206,0,0,0,114,134,0,0,0,114,201,0,0,0,114,183, + 0,0,0,114,178,0,0,0,41,6,114,193,0,0,0,114, + 139,0,0,0,114,42,1,0,0,114,140,0,0,0,114,141, + 0,0,0,114,187,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,16,95,108,101,103,97,99,121, + 95,103,101,116,95,115,112,101,99,249,4,0,0,115,20,0, + 0,0,10,4,16,1,10,2,4,1,8,1,12,1,12,1, + 6,1,4,1,255,128,122,27,80,97,116,104,70,105,110,100, + 101,114,46,95,108,101,103,97,99,121,95,103,101,116,95,115, + 112,101,99,78,99,4,0,0,0,0,0,0,0,0,0,0, + 0,9,0,0,0,5,0,0,0,67,0,0,0,115,166,0, + 0,0,103,0,125,4,124,2,68,0,93,134,125,5,116,0, + 124,5,116,1,116,2,102,2,131,2,115,28,113,8,124,0, + 160,3,124,5,161,1,125,6,124,6,100,1,117,1,114,8, + 116,4,124,6,100,2,131,2,114,70,124,6,160,5,124,1, + 124,3,161,2,125,7,110,12,124,0,160,6,124,1,124,6, + 161,2,125,7,124,7,100,1,117,0,114,92,113,8,124,7, + 106,7,100,1,117,1,114,110,124,7,2,0,1,0,83,0, + 124,7,106,8,125,8,124,8,100,1,117,0,114,132,116,9, + 100,3,131,1,130,1,124,4,160,10,124,8,161,1,1,0, + 113,8,116,11,160,12,124,1,100,1,161,2,125,7,124,4, + 124,7,95,8,124,7,83,0,41,4,122,63,70,105,110,100, + 32,116,104,101,32,108,111,97,100,101,114,32,111,114,32,110, + 97,109,101,115,112,97,99,101,95,112,97,116,104,32,102,111, + 114,32,116,104,105,115,32,109,111,100,117,108,101,47,112,97, + 99,107,97,103,101,32,110,97,109,101,46,78,114,203,0,0, + 0,122,19,115,112,101,99,32,109,105,115,115,105,110,103,32, + 108,111,97,100,101,114,41,13,114,161,0,0,0,114,84,0, + 0,0,218,5,98,121,116,101,115,114,47,1,0,0,114,128, + 0,0,0,114,203,0,0,0,114,48,1,0,0,114,140,0, + 0,0,114,178,0,0,0,114,117,0,0,0,114,167,0,0, + 0,114,134,0,0,0,114,183,0,0,0,41,9,114,193,0, + 0,0,114,139,0,0,0,114,44,0,0,0,114,202,0,0, + 0,218,14,110,97,109,101,115,112,97,99,101,95,112,97,116, + 104,90,5,101,110,116,114,121,114,42,1,0,0,114,187,0, + 0,0,114,141,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,9,95,103,101,116,95,115,112,101, + 99,8,5,0,0,115,42,0,0,0,4,5,8,1,14,1, + 2,1,10,1,8,1,10,1,14,1,12,2,8,1,2,1, + 10,1,8,1,6,1,8,1,8,1,12,5,12,2,6,1, + 4,1,255,128,122,20,80,97,116,104,70,105,110,100,101,114, 46,95,103,101,116,95,115,112,101,99,99,4,0,0,0,0, 0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,67, 0,0,0,115,94,0,0,0,124,2,100,1,117,0,114,14, @@ -2173,113 +2190,114 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 193,0,0,0,114,139,0,0,0,114,44,0,0,0,114,202, 0,0,0,114,187,0,0,0,114,50,1,0,0,114,5,0, 0,0,114,5,0,0,0,114,8,0,0,0,114,203,0,0, - 0,40,5,0,0,115,26,0,0,0,0,6,8,1,6,1, - 14,1,8,1,4,1,10,1,6,1,4,3,6,1,16,1, - 4,2,4,2,122,20,80,97,116,104,70,105,110,100,101,114, - 46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, - 0,0,0,115,30,0,0,0,124,0,160,0,124,1,124,2, - 161,2,125,3,124,3,100,1,117,0,114,24,100,1,83,0, - 124,3,106,1,83,0,41,2,122,170,102,105,110,100,32,116, - 104,101,32,109,111,100,117,108,101,32,111,110,32,115,121,115, - 46,112,97,116,104,32,111,114,32,39,112,97,116,104,39,32, - 98,97,115,101,100,32,111,110,32,115,121,115,46,112,97,116, - 104,95,104,111,111,107,115,32,97,110,100,10,32,32,32,32, - 32,32,32,32,115,121,115,46,112,97,116,104,95,105,109,112, - 111,114,116,101,114,95,99,97,99,104,101,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40, - 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, - 32,32,32,32,78,114,204,0,0,0,114,205,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,206, - 0,0,0,64,5,0,0,115,8,0,0,0,0,8,12,1, - 8,1,4,1,122,22,80,97,116,104,70,105,110,100,101,114, - 46,102,105,110,100,95,109,111,100,117,108,101,99,1,0,0, + 0,40,5,0,0,115,28,0,0,0,8,6,6,1,14,1, + 8,1,4,1,10,1,6,1,4,1,6,3,16,1,4,1, + 4,2,4,2,255,128,122,20,80,97,116,104,70,105,110,100, + 101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,0, 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, - 0,79,0,0,0,115,28,0,0,0,100,1,100,2,108,0, - 109,1,125,3,1,0,124,3,106,2,124,1,105,0,124,2, - 164,1,142,1,83,0,41,3,97,32,1,0,0,10,32,32, - 32,32,32,32,32,32,70,105,110,100,32,100,105,115,116,114, - 105,98,117,116,105,111,110,115,46,10,10,32,32,32,32,32, - 32,32,32,82,101,116,117,114,110,32,97,110,32,105,116,101, - 114,97,98,108,101,32,111,102,32,97,108,108,32,68,105,115, - 116,114,105,98,117,116,105,111,110,32,105,110,115,116,97,110, - 99,101,115,32,99,97,112,97,98,108,101,32,111,102,10,32, - 32,32,32,32,32,32,32,108,111,97,100,105,110,103,32,116, - 104,101,32,109,101,116,97,100,97,116,97,32,102,111,114,32, - 112,97,99,107,97,103,101,115,32,109,97,116,99,104,105,110, - 103,32,96,96,99,111,110,116,101,120,116,46,110,97,109,101, - 96,96,10,32,32,32,32,32,32,32,32,40,111,114,32,97, - 108,108,32,110,97,109,101,115,32,105,102,32,96,96,78,111, - 110,101,96,96,32,105,110,100,105,99,97,116,101,100,41,32, - 97,108,111,110,103,32,116,104,101,32,112,97,116,104,115,32, - 105,110,32,116,104,101,32,108,105,115,116,10,32,32,32,32, - 32,32,32,32,111,102,32,100,105,114,101,99,116,111,114,105, - 101,115,32,96,96,99,111,110,116,101,120,116,46,112,97,116, - 104,96,96,46,10,32,32,32,32,32,32,32,32,114,73,0, - 0,0,41,1,218,18,77,101,116,97,100,97,116,97,80,97, - 116,104,70,105,110,100,101,114,41,3,90,18,105,109,112,111, - 114,116,108,105,98,46,109,101,116,97,100,97,116,97,114,52, - 1,0,0,218,18,102,105,110,100,95,100,105,115,116,114,105, - 98,117,116,105,111,110,115,41,4,114,193,0,0,0,114,119, - 0,0,0,114,120,0,0,0,114,52,1,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,53,1,0, - 0,77,5,0,0,115,4,0,0,0,0,10,12,1,122,29, - 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, - 100,105,115,116,114,105,98,117,116,105,111,110,115,41,1,78, - 41,2,78,78,41,1,78,41,13,114,125,0,0,0,114,124, - 0,0,0,114,126,0,0,0,114,127,0,0,0,114,207,0, - 0,0,114,38,1,0,0,114,44,1,0,0,114,47,1,0, - 0,114,48,1,0,0,114,51,1,0,0,114,203,0,0,0, - 114,206,0,0,0,114,53,1,0,0,114,5,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,37, - 1,0,0,200,4,0,0,115,34,0,0,0,8,2,4,2, - 2,1,10,9,2,1,10,12,2,1,10,21,2,1,10,14, - 2,1,12,31,2,1,12,23,2,1,12,12,2,1,114,37, - 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,64,0,0,0,115,90,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, - 3,132,0,90,4,100,4,100,5,132,0,90,5,101,6,90, - 7,100,6,100,7,132,0,90,8,100,8,100,9,132,0,90, - 9,100,19,100,11,100,12,132,1,90,10,100,13,100,14,132, - 0,90,11,101,12,100,15,100,16,132,0,131,1,90,13,100, - 17,100,18,132,0,90,14,100,10,83,0,41,20,218,10,70, - 105,108,101,70,105,110,100,101,114,122,172,70,105,108,101,45, - 98,97,115,101,100,32,102,105,110,100,101,114,46,10,10,32, - 32,32,32,73,110,116,101,114,97,99,116,105,111,110,115,32, - 119,105,116,104,32,116,104,101,32,102,105,108,101,32,115,121, - 115,116,101,109,32,97,114,101,32,99,97,99,104,101,100,32, - 102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,44, - 32,98,101,105,110,103,10,32,32,32,32,114,101,102,114,101, - 115,104,101,100,32,119,104,101,110,32,116,104,101,32,100,105, - 114,101,99,116,111,114,121,32,116,104,101,32,102,105,110,100, - 101,114,32,105,115,32,104,97,110,100,108,105,110,103,32,104, - 97,115,32,98,101,101,110,32,109,111,100,105,102,105,101,100, - 46,10,10,32,32,32,32,99,2,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0, - 115,84,0,0,0,103,0,125,3,124,2,68,0,93,32,92, - 2,137,0,125,4,124,3,160,0,135,0,102,1,100,1,100, - 2,132,8,124,4,68,0,131,1,161,1,1,0,113,8,124, - 3,124,0,95,1,124,1,112,54,100,3,124,0,95,2,100, - 4,124,0,95,3,116,4,131,0,124,0,95,5,116,4,131, - 0,124,0,95,6,100,5,83,0,41,6,122,154,73,110,105, - 116,105,97,108,105,122,101,32,119,105,116,104,32,116,104,101, - 32,112,97,116,104,32,116,111,32,115,101,97,114,99,104,32, - 111,110,32,97,110,100,32,97,32,118,97,114,105,97,98,108, - 101,32,110,117,109,98,101,114,32,111,102,10,32,32,32,32, - 32,32,32,32,50,45,116,117,112,108,101,115,32,99,111,110, - 116,97,105,110,105,110,103,32,116,104,101,32,108,111,97,100, - 101,114,32,97,110,100,32,116,104,101,32,102,105,108,101,32, - 115,117,102,102,105,120,101,115,32,116,104,101,32,108,111,97, - 100,101,114,10,32,32,32,32,32,32,32,32,114,101,99,111, - 103,110,105,122,101,115,46,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,51,0,0,0, - 115,22,0,0,0,124,0,93,14,125,1,124,1,136,0,102, - 2,86,0,1,0,113,2,100,0,83,0,114,109,0,0,0, - 114,5,0,0,0,114,7,1,0,0,169,1,114,140,0,0, - 0,114,5,0,0,0,114,8,0,0,0,114,10,1,0,0, - 106,5,0,0,243,0,0,0,0,122,38,70,105,108,101,70, + 0,67,0,0,0,115,30,0,0,0,124,0,160,0,124,1, + 124,2,161,2,125,3,124,3,100,1,117,0,114,24,100,1, + 83,0,124,3,106,1,83,0,41,2,122,170,102,105,110,100, + 32,116,104,101,32,109,111,100,117,108,101,32,111,110,32,115, + 121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,104, + 39,32,98,97,115,101,100,32,111,110,32,115,121,115,46,112, + 97,116,104,95,104,111,111,107,115,32,97,110,100,10,32,32, + 32,32,32,32,32,32,115,121,115,46,112,97,116,104,95,105, + 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, + 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,32,32,32,32,78,114,204,0,0,0,114,205,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,206,0,0,0,64,5,0,0,115,10,0,0,0,12,8, + 8,1,4,1,6,1,255,128,122,22,80,97,116,104,70,105, + 110,100,101,114,46,102,105,110,100,95,109,111,100,117,108,101, + 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,79,0,0,0,115,28,0,0,0,100,1, + 100,2,108,0,109,1,125,3,1,0,124,3,106,2,124,1, + 105,0,124,2,164,1,142,1,83,0,41,3,97,32,1,0, + 0,10,32,32,32,32,32,32,32,32,70,105,110,100,32,100, + 105,115,116,114,105,98,117,116,105,111,110,115,46,10,10,32, + 32,32,32,32,32,32,32,82,101,116,117,114,110,32,97,110, + 32,105,116,101,114,97,98,108,101,32,111,102,32,97,108,108, + 32,68,105,115,116,114,105,98,117,116,105,111,110,32,105,110, + 115,116,97,110,99,101,115,32,99,97,112,97,98,108,101,32, + 111,102,10,32,32,32,32,32,32,32,32,108,111,97,100,105, + 110,103,32,116,104,101,32,109,101,116,97,100,97,116,97,32, + 102,111,114,32,112,97,99,107,97,103,101,115,32,109,97,116, + 99,104,105,110,103,32,96,96,99,111,110,116,101,120,116,46, + 110,97,109,101,96,96,10,32,32,32,32,32,32,32,32,40, + 111,114,32,97,108,108,32,110,97,109,101,115,32,105,102,32, + 96,96,78,111,110,101,96,96,32,105,110,100,105,99,97,116, + 101,100,41,32,97,108,111,110,103,32,116,104,101,32,112,97, + 116,104,115,32,105,110,32,116,104,101,32,108,105,115,116,10, + 32,32,32,32,32,32,32,32,111,102,32,100,105,114,101,99, + 116,111,114,105,101,115,32,96,96,99,111,110,116,101,120,116, + 46,112,97,116,104,96,96,46,10,32,32,32,32,32,32,32, + 32,114,73,0,0,0,41,1,218,18,77,101,116,97,100,97, + 116,97,80,97,116,104,70,105,110,100,101,114,41,3,90,18, + 105,109,112,111,114,116,108,105,98,46,109,101,116,97,100,97, + 116,97,114,52,1,0,0,218,18,102,105,110,100,95,100,105, + 115,116,114,105,98,117,116,105,111,110,115,41,4,114,193,0, + 0,0,114,119,0,0,0,114,120,0,0,0,114,52,1,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,53,1,0,0,77,5,0,0,115,6,0,0,0,12,10, + 16,1,255,128,122,29,80,97,116,104,70,105,110,100,101,114, + 46,102,105,110,100,95,100,105,115,116,114,105,98,117,116,105, + 111,110,115,41,1,78,41,2,78,78,41,1,78,41,13,114, + 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, + 0,0,0,114,207,0,0,0,114,38,1,0,0,114,44,1, + 0,0,114,47,1,0,0,114,48,1,0,0,114,51,1,0, + 0,114,203,0,0,0,114,206,0,0,0,114,53,1,0,0, + 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,37,1,0,0,200,4,0,0,115,38,0, + 0,0,8,0,4,2,2,2,10,1,2,9,10,1,2,12, + 10,1,2,21,10,1,2,14,12,1,2,31,12,1,2,23, + 12,1,2,12,14,1,255,128,114,37,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,64,0,0,0,115,90,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,101,6,90,7,100,6,100,7,132, + 0,90,8,100,8,100,9,132,0,90,9,100,19,100,11,100, + 12,132,1,90,10,100,13,100,14,132,0,90,11,101,12,100, + 15,100,16,132,0,131,1,90,13,100,17,100,18,132,0,90, + 14,100,10,83,0,41,20,218,10,70,105,108,101,70,105,110, + 100,101,114,122,172,70,105,108,101,45,98,97,115,101,100,32, + 102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,116, + 101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,116, + 104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,97, + 114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,101, + 114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,103, + 10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,119, + 104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,114, + 121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,32, + 104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,101, + 110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,32, + 32,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,6,0,0,0,7,0,0,0,115,84,0,0,0,103, + 0,125,3,124,2,68,0,93,32,92,2,137,0,125,4,124, + 3,160,0,135,0,102,1,100,1,100,2,132,8,124,4,68, + 0,131,1,161,1,1,0,113,8,124,3,124,0,95,1,124, + 1,112,54,100,3,124,0,95,2,100,4,124,0,95,3,116, + 4,131,0,124,0,95,5,116,4,131,0,124,0,95,6,100, + 5,83,0,41,6,122,154,73,110,105,116,105,97,108,105,122, + 101,32,119,105,116,104,32,116,104,101,32,112,97,116,104,32, + 116,111,32,115,101,97,114,99,104,32,111,110,32,97,110,100, + 32,97,32,118,97,114,105,97,98,108,101,32,110,117,109,98, + 101,114,32,111,102,10,32,32,32,32,32,32,32,32,50,45, + 116,117,112,108,101,115,32,99,111,110,116,97,105,110,105,110, + 103,32,116,104,101,32,108,111,97,100,101,114,32,97,110,100, + 32,116,104,101,32,102,105,108,101,32,115,117,102,102,105,120, + 101,115,32,116,104,101,32,108,111,97,100,101,114,10,32,32, + 32,32,32,32,32,32,114,101,99,111,103,110,105,122,101,115, + 46,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,51,0,0,0,115,22,0,0,0,124, + 0,93,14,125,1,124,1,136,0,102,2,86,0,1,0,113, + 2,100,0,83,0,114,109,0,0,0,114,5,0,0,0,114, + 7,1,0,0,169,1,114,140,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,10,1,0,0,106,5,0,0,115,6, + 0,0,0,18,0,4,128,255,128,122,38,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,114,71,0,0,0,114,104,0,0,0,78,41,7,114,167, @@ -2291,218 +2309,220 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,218,14,108,111,97,100,101,114,95,100,101,116,97,105, 108,115,90,7,108,111,97,100,101,114,115,114,189,0,0,0, 114,5,0,0,0,114,55,1,0,0,114,8,0,0,0,114, - 209,0,0,0,100,5,0,0,115,16,0,0,0,0,4,4, - 1,12,1,26,1,6,2,10,1,6,1,8,1,122,19,70, - 105,108,101,70,105,110,100,101,114,46,95,95,105,110,105,116, - 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,2,0,0,0,67,0,0,0,115,10,0,0,0, - 100,1,124,0,95,0,100,2,83,0,41,3,122,31,73,110, - 118,97,108,105,100,97,116,101,32,116,104,101,32,100,105,114, - 101,99,116,111,114,121,32,109,116,105,109,101,46,114,104,0, - 0,0,78,41,1,114,58,1,0,0,114,246,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,38, - 1,0,0,114,5,0,0,115,2,0,0,0,0,2,122,28, - 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,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, - 0,67,0,0,0,115,42,0,0,0,124,0,160,0,124,1, - 161,1,125,2,124,2,100,1,117,0,114,26,100,1,103,0, - 102,2,83,0,124,2,106,1,124,2,106,2,112,38,103,0, - 102,2,83,0,41,2,122,197,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,44,32,111,114,32,116,104,101,32,110,97, - 109,101,115,112,97,99,101,10,32,32,32,32,32,32,32,32, - 112,97,99,107,97,103,101,32,112,111,114,116,105,111,110,115, - 46,32,82,101,116,117,114,110,115,32,40,108,111,97,100,101, - 114,44,32,108,105,115,116,45,111,102,45,112,111,114,116,105, - 111,110,115,41,46,10,10,32,32,32,32,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, - 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,3, - 114,203,0,0,0,114,140,0,0,0,114,178,0,0,0,41, - 3,114,118,0,0,0,114,139,0,0,0,114,187,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 137,0,0,0,120,5,0,0,115,8,0,0,0,0,7,10, - 1,8,1,8,1,122,22,70,105,108,101,70,105,110,100,101, - 114,46,102,105,110,100,95,108,111,97,100,101,114,99,6,0, - 0,0,0,0,0,0,0,0,0,0,7,0,0,0,6,0, - 0,0,67,0,0,0,115,26,0,0,0,124,1,124,2,124, - 3,131,2,125,6,116,0,124,2,124,3,124,6,124,4,100, - 1,141,4,83,0,41,2,78,114,177,0,0,0,41,1,114, - 190,0,0,0,41,7,114,118,0,0,0,114,188,0,0,0, - 114,139,0,0,0,114,44,0,0,0,90,4,115,109,115,108, - 114,202,0,0,0,114,140,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,51,1,0,0,132,5, - 0,0,115,8,0,0,0,0,1,10,1,8,1,2,255,122, - 20,70,105,108,101,70,105,110,100,101,114,46,95,103,101,116, - 95,115,112,101,99,78,99,3,0,0,0,0,0,0,0,0, - 0,0,0,14,0,0,0,8,0,0,0,67,0,0,0,115, - 92,1,0,0,100,1,125,3,124,1,160,0,100,2,161,1, - 100,3,25,0,125,4,122,24,116,1,124,0,106,2,112,34, - 116,3,160,4,161,0,131,1,106,5,125,5,87,0,110,22, - 4,0,116,6,121,64,1,0,1,0,1,0,100,4,125,5, - 89,0,110,2,48,0,124,5,124,0,106,7,107,3,114,90, - 124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,9, - 131,0,114,112,124,0,106,10,125,6,124,4,160,11,161,0, - 125,7,110,10,124,0,106,12,125,6,124,4,125,7,124,7, - 124,6,118,0,114,214,116,13,124,0,106,2,124,4,131,2, - 125,8,124,0,106,14,68,0,93,56,92,2,125,9,125,10, - 100,5,124,9,23,0,125,11,116,13,124,8,124,11,131,2, - 125,12,116,15,124,12,131,1,114,148,124,0,160,16,124,10, - 124,1,124,12,124,8,103,1,124,2,161,5,2,0,1,0, - 83,0,116,17,124,8,131,1,125,3,124,0,106,14,68,0, - 93,80,92,2,125,9,125,10,116,13,124,0,106,2,124,4, - 124,9,23,0,131,2,125,12,116,18,106,19,100,6,124,12, - 100,3,100,7,141,3,1,0,124,7,124,9,23,0,124,6, - 118,0,114,220,116,15,124,12,131,1,114,220,124,0,160,16, - 124,10,124,1,124,12,100,8,124,2,161,5,2,0,1,0, - 83,0,124,3,144,1,114,88,116,18,160,19,100,9,124,8, - 161,2,1,0,116,18,160,20,124,1,100,8,161,2,125,13, - 124,8,103,1,124,13,95,21,124,13,83,0,100,8,83,0, - 41,10,122,111,84,114,121,32,116,111,32,102,105,110,100,32, - 97,32,115,112,101,99,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,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 115,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115, - 112,101,99,44,32,111,114,32,78,111,110,101,32,105,102,32, - 110,111,116,32,102,111,117,110,100,46,10,32,32,32,32,32, - 32,32,32,70,114,71,0,0,0,114,28,0,0,0,114,104, - 0,0,0,114,209,0,0,0,122,9,116,114,121,105,110,103, - 32,123,125,41,1,90,9,118,101,114,98,111,115,105,116,121, - 78,122,25,112,111,115,115,105,98,108,101,32,110,97,109,101, - 115,112,97,99,101,32,102,111,114,32,123,125,41,22,114,41, - 0,0,0,114,49,0,0,0,114,44,0,0,0,114,4,0, - 0,0,114,55,0,0,0,114,0,1,0,0,114,50,0,0, - 0,114,58,1,0,0,218,11,95,102,105,108,108,95,99,97, - 99,104,101,114,9,0,0,0,114,61,1,0,0,114,105,0, - 0,0,114,60,1,0,0,114,38,0,0,0,114,57,1,0, - 0,114,54,0,0,0,114,51,1,0,0,114,56,0,0,0, - 114,134,0,0,0,114,149,0,0,0,114,183,0,0,0,114, - 178,0,0,0,41,14,114,118,0,0,0,114,139,0,0,0, - 114,202,0,0,0,90,12,105,115,95,110,97,109,101,115,112, - 97,99,101,90,11,116,97,105,108,95,109,111,100,117,108,101, - 114,169,0,0,0,90,5,99,97,99,104,101,90,12,99,97, - 99,104,101,95,109,111,100,117,108,101,90,9,98,97,115,101, - 95,112,97,116,104,114,8,1,0,0,114,188,0,0,0,90, - 13,105,110,105,116,95,102,105,108,101,110,97,109,101,90,9, - 102,117,108,108,95,112,97,116,104,114,187,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,203,0, - 0,0,137,5,0,0,115,72,0,0,0,0,5,4,1,14, - 1,2,1,24,1,12,1,10,1,10,1,8,1,6,2,6, - 1,6,1,10,2,6,1,4,2,8,1,12,1,14,1,8, - 1,10,1,8,1,24,4,8,2,14,1,16,1,16,1,12, - 1,8,1,10,1,4,255,8,2,6,1,12,1,12,1,8, - 1,4,1,122,20,70,105,108,101,70,105,110,100,101,114,46, - 102,105,110,100,95,115,112,101,99,99,1,0,0,0,0,0, - 0,0,0,0,0,0,9,0,0,0,10,0,0,0,67,0, - 0,0,115,188,0,0,0,124,0,106,0,125,1,122,22,116, - 1,160,2,124,1,112,22,116,1,160,3,161,0,161,1,125, - 2,87,0,110,28,4,0,116,4,116,5,116,6,102,3,121, - 56,1,0,1,0,1,0,103,0,125,2,89,0,110,2,48, - 0,116,7,106,8,160,9,100,1,161,1,115,82,116,10,124, - 2,131,1,124,0,95,11,110,74,116,10,131,0,125,3,124, - 2,68,0,93,56,125,4,124,4,160,12,100,2,161,1,92, - 3,125,5,125,6,125,7,124,6,114,134,100,3,160,13,124, - 5,124,7,160,14,161,0,161,2,125,8,110,4,124,5,125, - 8,124,3,160,15,124,8,161,1,1,0,113,92,124,3,124, - 0,95,11,116,7,106,8,160,9,116,16,161,1,114,184,100, - 4,100,5,132,0,124,2,68,0,131,1,124,0,95,17,100, - 6,83,0,41,7,122,68,70,105,108,108,32,116,104,101,32, - 99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,105, - 97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,112, - 97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,115, - 32,100,105,114,101,99,116,111,114,121,46,114,0,0,0,0, - 114,71,0,0,0,114,61,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,83, - 0,0,0,115,20,0,0,0,104,0,124,0,93,12,125,1, - 124,1,160,0,161,0,146,2,113,4,83,0,114,5,0,0, - 0,41,1,114,105,0,0,0,41,2,114,32,0,0,0,90, - 2,102,110,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,9,60,115,101,116,99,111,109,112,62,214,5,0, - 0,114,56,1,0,0,122,41,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,115,101,116,99,111,109,112, - 62,78,41,18,114,44,0,0,0,114,4,0,0,0,90,7, - 108,105,115,116,100,105,114,114,55,0,0,0,114,45,1,0, - 0,218,15,80,101,114,109,105,115,115,105,111,110,69,114,114, - 111,114,218,18,78,111,116,65,68,105,114,101,99,116,111,114, - 121,69,114,114,111,114,114,1,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,59,1,0,0,114,60,1,0,0,114, - 100,0,0,0,114,62,0,0,0,114,105,0,0,0,218,3, - 97,100,100,114,12,0,0,0,114,61,1,0,0,41,9,114, - 118,0,0,0,114,44,0,0,0,90,8,99,111,110,116,101, - 110,116,115,90,21,108,111,119,101,114,95,115,117,102,102,105, - 120,95,99,111,110,116,101,110,116,115,114,33,1,0,0,114, - 116,0,0,0,114,20,1,0,0,114,8,1,0,0,90,8, - 110,101,119,95,110,97,109,101,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,63,1,0,0,185,5,0,0, - 115,34,0,0,0,0,2,6,1,2,1,22,1,18,3,10, - 3,12,1,12,7,6,1,8,1,16,1,4,1,18,2,4, - 1,12,1,6,1,12,1,122,22,70,105,108,101,70,105,110, - 100,101,114,46,95,102,105,108,108,95,99,97,99,104,101,99, - 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,7,0,0,0,115,18,0,0,0,135,0,135, - 1,102,2,100,1,100,2,132,8,125,2,124,2,83,0,41, - 3,97,20,1,0,0,65,32,99,108,97,115,115,32,109,101, - 116,104,111,100,32,119,104,105,99,104,32,114,101,116,117,114, - 110,115,32,97,32,99,108,111,115,117,114,101,32,116,111,32, - 117,115,101,32,111,110,32,115,121,115,46,112,97,116,104,95, - 104,111,111,107,10,32,32,32,32,32,32,32,32,119,104,105, - 99,104,32,119,105,108,108,32,114,101,116,117,114,110,32,97, - 110,32,105,110,115,116,97,110,99,101,32,117,115,105,110,103, - 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,108, - 111,97,100,101,114,115,32,97,110,100,32,116,104,101,32,112, - 97,116,104,10,32,32,32,32,32,32,32,32,99,97,108,108, - 101,100,32,111,110,32,116,104,101,32,99,108,111,115,117,114, - 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,116, - 104,101,32,112,97,116,104,32,99,97,108,108,101,100,32,111, - 110,32,116,104,101,32,99,108,111,115,117,114,101,32,105,115, - 32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121, - 44,32,73,109,112,111,114,116,69,114,114,111,114,32,105,115, - 10,32,32,32,32,32,32,32,32,114,97,105,115,101,100,46, - 10,10,32,32,32,32,32,32,32,32,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,19, - 0,0,0,115,36,0,0,0,116,0,124,0,131,1,115,20, - 116,1,100,1,124,0,100,2,141,2,130,1,136,0,124,0, - 103,1,136,1,162,1,82,0,142,0,83,0,41,3,122,45, - 80,97,116,104,32,104,111,111,107,32,102,111,114,32,105,109, - 112,111,114,116,108,105,98,46,109,97,99,104,105,110,101,114, - 121,46,70,105,108,101,70,105,110,100,101,114,46,122,30,111, - 110,108,121,32,100,105,114,101,99,116,111,114,105,101,115,32, - 97,114,101,32,115,117,112,112,111,114,116,101,100,114,48,0, - 0,0,41,2,114,56,0,0,0,114,117,0,0,0,114,48, - 0,0,0,169,2,114,193,0,0,0,114,62,1,0,0,114, - 5,0,0,0,114,8,0,0,0,218,24,112,97,116,104,95, - 104,111,111,107,95,102,111,114,95,70,105,108,101,70,105,110, - 100,101,114,226,5,0,0,115,6,0,0,0,0,2,8,1, - 12,1,122,54,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,107,95,102,111,114,95, - 70,105,108,101,70,105,110,100,101,114,114,5,0,0,0,41, - 3,114,193,0,0,0,114,62,1,0,0,114,69,1,0,0, - 114,5,0,0,0,114,68,1,0,0,114,8,0,0,0,218, - 9,112,97,116,104,95,104,111,111,107,216,5,0,0,115,4, - 0,0,0,0,10,14,6,122,20,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,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,12,0,0,0,100,1,160,0,124, - 0,106,1,161,1,83,0,41,2,78,122,16,70,105,108,101, - 70,105,110,100,101,114,40,123,33,114,125,41,41,2,114,62, - 0,0,0,114,44,0,0,0,114,246,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,31,1,0, - 0,234,5,0,0,115,2,0,0,0,0,1,122,19,70,105, - 108,101,70,105,110,100,101,114,46,95,95,114,101,112,114,95, - 95,41,1,78,41,15,114,125,0,0,0,114,124,0,0,0, - 114,126,0,0,0,114,127,0,0,0,114,209,0,0,0,114, - 38,1,0,0,114,143,0,0,0,114,206,0,0,0,114,137, - 0,0,0,114,51,1,0,0,114,203,0,0,0,114,63,1, - 0,0,114,207,0,0,0,114,70,1,0,0,114,31,1,0, - 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,54,1,0,0,91,5,0,0,115,22, - 0,0,0,8,2,4,7,8,14,8,4,4,2,8,12,8, - 5,10,48,8,31,2,1,10,17,114,54,1,0,0,99,4, + 209,0,0,0,100,5,0,0,115,20,0,0,0,4,4,12, + 1,26,1,6,1,10,2,6,1,8,1,8,1,4,128,255, + 128,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, + 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, + 10,0,0,0,100,1,124,0,95,0,100,2,83,0,41,3, + 122,31,73,110,118,97,108,105,100,97,116,101,32,116,104,101, + 32,100,105,114,101,99,116,111,114,121,32,109,116,105,109,101, + 46,114,104,0,0,0,78,41,1,114,57,1,0,0,114,246, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,114,38,1,0,0,114,5,0,0,115,6,0,0,0, + 6,2,4,128,255,128,122,28,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,0,0,0,0,0,0,0, + 0,3,0,0,0,3,0,0,0,67,0,0,0,115,42,0, + 0,0,124,0,160,0,124,1,161,1,125,2,124,2,100,1, + 117,0,114,26,100,1,103,0,102,2,83,0,124,2,106,1, + 124,2,106,2,112,38,103,0,102,2,83,0,41,2,122,197, + 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,44,32,111, + 114,32,116,104,101,32,110,97,109,101,115,112,97,99,101,10, + 32,32,32,32,32,32,32,32,112,97,99,107,97,103,101,32, + 112,111,114,116,105,111,110,115,46,32,82,101,116,117,114,110, + 115,32,40,108,111,97,100,101,114,44,32,108,105,115,116,45, + 111,102,45,112,111,114,116,105,111,110,115,41,46,10,10,32, + 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99, + 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, + 32,32,32,32,32,78,41,3,114,203,0,0,0,114,140,0, + 0,0,114,178,0,0,0,41,3,114,118,0,0,0,114,139, + 0,0,0,114,187,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,137,0,0,0,120,5,0,0, + 115,10,0,0,0,10,7,8,1,8,1,16,1,255,128,122, + 22,70,105,108,101,70,105,110,100,101,114,46,102,105,110,100, + 95,108,111,97,100,101,114,99,6,0,0,0,0,0,0,0, + 0,0,0,0,7,0,0,0,6,0,0,0,67,0,0,0, + 115,26,0,0,0,124,1,124,2,124,3,131,2,125,6,116, + 0,124,2,124,3,124,6,124,4,100,1,141,4,83,0,41, + 2,78,114,177,0,0,0,41,1,114,190,0,0,0,41,7, + 114,118,0,0,0,114,188,0,0,0,114,139,0,0,0,114, + 44,0,0,0,90,4,115,109,115,108,114,202,0,0,0,114, + 140,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,51,1,0,0,132,5,0,0,115,10,0,0, + 0,10,1,8,1,2,1,6,255,255,128,122,20,70,105,108, + 101,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, + 99,78,99,3,0,0,0,0,0,0,0,0,0,0,0,14, + 0,0,0,8,0,0,0,67,0,0,0,115,92,1,0,0, + 100,1,125,3,124,1,160,0,100,2,161,1,100,3,25,0, + 125,4,122,24,116,1,124,0,106,2,112,34,116,3,160,4, + 161,0,131,1,106,5,125,5,87,0,110,22,4,0,116,6, + 121,64,1,0,1,0,1,0,100,4,125,5,89,0,110,2, + 48,0,124,5,124,0,106,7,107,3,114,90,124,0,160,8, + 161,0,1,0,124,5,124,0,95,7,116,9,131,0,114,112, + 124,0,106,10,125,6,124,4,160,11,161,0,125,7,110,10, + 124,0,106,12,125,6,124,4,125,7,124,7,124,6,118,0, + 114,214,116,13,124,0,106,2,124,4,131,2,125,8,124,0, + 106,14,68,0,93,56,92,2,125,9,125,10,100,5,124,9, + 23,0,125,11,116,13,124,8,124,11,131,2,125,12,116,15, + 124,12,131,1,114,148,124,0,160,16,124,10,124,1,124,12, + 124,8,103,1,124,2,161,5,2,0,1,0,83,0,116,17, + 124,8,131,1,125,3,124,0,106,14,68,0,93,80,92,2, + 125,9,125,10,116,13,124,0,106,2,124,4,124,9,23,0, + 131,2,125,12,116,18,106,19,100,6,124,12,100,3,100,7, + 141,3,1,0,124,7,124,9,23,0,124,6,118,0,114,220, + 116,15,124,12,131,1,114,220,124,0,160,16,124,10,124,1, + 124,12,100,8,124,2,161,5,2,0,1,0,83,0,124,3, + 144,1,114,88,116,18,160,19,100,9,124,8,161,2,1,0, + 116,18,160,20,124,1,100,8,161,2,125,13,124,8,103,1, + 124,13,95,21,124,13,83,0,100,8,83,0,41,10,122,111, + 84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,112, + 101,99,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,46,10,10,32,32, + 32,32,32,32,32,32,82,101,116,117,114,110,115,32,116,104, + 101,32,109,97,116,99,104,105,110,103,32,115,112,101,99,44, + 32,111,114,32,78,111,110,101,32,105,102,32,110,111,116,32, + 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,70, + 114,71,0,0,0,114,28,0,0,0,114,104,0,0,0,114, + 209,0,0,0,122,9,116,114,121,105,110,103,32,123,125,41, + 1,90,9,118,101,114,98,111,115,105,116,121,78,122,25,112, + 111,115,115,105,98,108,101,32,110,97,109,101,115,112,97,99, + 101,32,102,111,114,32,123,125,41,22,114,41,0,0,0,114, + 49,0,0,0,114,44,0,0,0,114,4,0,0,0,114,55, + 0,0,0,114,0,1,0,0,114,50,0,0,0,114,57,1, + 0,0,218,11,95,102,105,108,108,95,99,97,99,104,101,114, + 9,0,0,0,114,60,1,0,0,114,105,0,0,0,114,59, + 1,0,0,114,38,0,0,0,114,56,1,0,0,114,54,0, + 0,0,114,51,1,0,0,114,56,0,0,0,114,134,0,0, + 0,114,149,0,0,0,114,183,0,0,0,114,178,0,0,0, + 41,14,114,118,0,0,0,114,139,0,0,0,114,202,0,0, + 0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,90, + 11,116,97,105,108,95,109,111,100,117,108,101,114,169,0,0, + 0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,95, + 109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,116, + 104,114,8,1,0,0,114,188,0,0,0,90,13,105,110,105, + 116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,108, + 95,112,97,116,104,114,187,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,203,0,0,0,137,5, + 0,0,115,74,0,0,0,4,5,14,1,2,1,24,1,12, + 1,10,1,10,1,8,1,6,1,6,2,6,1,10,1,6, + 2,4,1,8,2,12,1,14,1,8,1,10,1,8,1,24, + 1,8,4,14,2,16,1,16,1,12,1,8,1,10,1,4, + 1,8,255,6,2,12,1,12,1,8,1,4,1,4,1,255, + 128,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0, + 0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0, + 115,188,0,0,0,124,0,106,0,125,1,122,22,116,1,160, + 2,124,1,112,22,116,1,160,3,161,0,161,1,125,2,87, + 0,110,28,4,0,116,4,116,5,116,6,102,3,121,56,1, + 0,1,0,1,0,103,0,125,2,89,0,110,2,48,0,116, + 7,106,8,160,9,100,1,161,1,115,82,116,10,124,2,131, + 1,124,0,95,11,110,74,116,10,131,0,125,3,124,2,68, + 0,93,56,125,4,124,4,160,12,100,2,161,1,92,3,125, + 5,125,6,125,7,124,6,114,134,100,3,160,13,124,5,124, + 7,160,14,161,0,161,2,125,8,110,4,124,5,125,8,124, + 3,160,15,124,8,161,1,1,0,113,92,124,3,124,0,95, + 11,116,7,106,8,160,9,116,16,161,1,114,184,100,4,100, + 5,132,0,124,2,68,0,131,1,124,0,95,17,100,6,83, + 0,41,7,122,68,70,105,108,108,32,116,104,101,32,99,97, + 99,104,101,32,111,102,32,112,111,116,101,110,116,105,97,108, + 32,109,111,100,117,108,101,115,32,97,110,100,32,112,97,99, + 107,97,103,101,115,32,102,111,114,32,116,104,105,115,32,100, + 105,114,101,99,116,111,114,121,46,114,0,0,0,0,114,71, + 0,0,0,114,61,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,83,0,0, + 0,115,20,0,0,0,104,0,124,0,93,12,125,1,124,1, + 160,0,161,0,146,2,113,4,83,0,114,5,0,0,0,41, + 1,114,105,0,0,0,41,2,114,32,0,0,0,90,2,102, + 110,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,9,60,115,101,116,99,111,109,112,62,214,5,0,0,115, + 4,0,0,0,20,0,255,128,122,41,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,115,101,116,99,111, + 109,112,62,78,41,18,114,44,0,0,0,114,4,0,0,0, + 90,7,108,105,115,116,100,105,114,114,55,0,0,0,114,45, + 1,0,0,218,15,80,101,114,109,105,115,115,105,111,110,69, + 114,114,111,114,218,18,78,111,116,65,68,105,114,101,99,116, + 111,114,121,69,114,114,111,114,114,1,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,58,1,0,0,114,59,1,0, + 0,114,100,0,0,0,114,62,0,0,0,114,105,0,0,0, + 218,3,97,100,100,114,12,0,0,0,114,60,1,0,0,41, + 9,114,118,0,0,0,114,44,0,0,0,90,8,99,111,110, + 116,101,110,116,115,90,21,108,111,119,101,114,95,115,117,102, + 102,105,120,95,99,111,110,116,101,110,116,115,114,33,1,0, + 0,114,116,0,0,0,114,20,1,0,0,114,8,1,0,0, + 90,8,110,101,119,95,110,97,109,101,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,62,1,0,0,185,5, + 0,0,115,38,0,0,0,6,2,2,1,22,1,18,1,10, + 3,12,3,12,1,6,7,8,1,16,1,4,1,18,1,4, + 2,12,1,6,1,12,1,16,1,4,128,255,128,122,22,70, + 105,108,101,70,105,110,100,101,114,46,95,102,105,108,108,95, + 99,97,99,104,101,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,3,0,0,0,7,0,0,0,115,18, + 0,0,0,135,0,135,1,102,2,100,1,100,2,132,8,125, + 2,124,2,83,0,41,3,97,20,1,0,0,65,32,99,108, + 97,115,115,32,109,101,116,104,111,100,32,119,104,105,99,104, + 32,114,101,116,117,114,110,115,32,97,32,99,108,111,115,117, + 114,101,32,116,111,32,117,115,101,32,111,110,32,115,121,115, + 46,112,97,116,104,95,104,111,111,107,10,32,32,32,32,32, + 32,32,32,119,104,105,99,104,32,119,105,108,108,32,114,101, + 116,117,114,110,32,97,110,32,105,110,115,116,97,110,99,101, + 32,117,115,105,110,103,32,116,104,101,32,115,112,101,99,105, + 102,105,101,100,32,108,111,97,100,101,114,115,32,97,110,100, + 32,116,104,101,32,112,97,116,104,10,32,32,32,32,32,32, + 32,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32, + 99,108,111,115,117,114,101,46,10,10,32,32,32,32,32,32, + 32,32,73,102,32,116,104,101,32,112,97,116,104,32,99,97, + 108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115, + 117,114,101,32,105,115,32,110,111,116,32,97,32,100,105,114, + 101,99,116,111,114,121,44,32,73,109,112,111,114,116,69,114, + 114,111,114,32,105,115,10,32,32,32,32,32,32,32,32,114, + 97,105,115,101,100,46,10,10,32,32,32,32,32,32,32,32, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,4,0,0,0,19,0,0,0,115,36,0,0,0,116,0, + 124,0,131,1,115,20,116,1,100,1,124,0,100,2,141,2, + 130,1,136,0,124,0,103,1,136,1,162,1,82,0,142,0, + 83,0,41,3,122,45,80,97,116,104,32,104,111,111,107,32, + 102,111,114,32,105,109,112,111,114,116,108,105,98,46,109,97, + 99,104,105,110,101,114,121,46,70,105,108,101,70,105,110,100, + 101,114,46,122,30,111,110,108,121,32,100,105,114,101,99,116, + 111,114,105,101,115,32,97,114,101,32,115,117,112,112,111,114, + 116,101,100,114,48,0,0,0,41,2,114,56,0,0,0,114, + 117,0,0,0,114,48,0,0,0,169,2,114,193,0,0,0, + 114,61,1,0,0,114,5,0,0,0,114,8,0,0,0,218, + 24,112,97,116,104,95,104,111,111,107,95,102,111,114,95,70, + 105,108,101,70,105,110,100,101,114,226,5,0,0,115,8,0, + 0,0,8,2,12,1,16,1,255,128,122,54,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,107,95,102,111,114,95,70,105,108,101,70,105,110,100, + 101,114,114,5,0,0,0,41,3,114,193,0,0,0,114,61, + 1,0,0,114,68,1,0,0,114,5,0,0,0,114,67,1, + 0,0,114,8,0,0,0,218,9,112,97,116,104,95,104,111, + 111,107,216,5,0,0,115,6,0,0,0,14,10,4,6,255, + 128,122,20,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, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,12,0,0,0,100,1,160,0,124,0,106,1,161,1,83, + 0,41,2,78,122,16,70,105,108,101,70,105,110,100,101,114, + 40,123,33,114,125,41,41,2,114,62,0,0,0,114,44,0, + 0,0,114,246,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,31,1,0,0,234,5,0,0,115, + 4,0,0,0,12,1,255,128,122,19,70,105,108,101,70,105, + 110,100,101,114,46,95,95,114,101,112,114,95,95,41,1,78, + 41,15,114,125,0,0,0,114,124,0,0,0,114,126,0,0, + 0,114,127,0,0,0,114,209,0,0,0,114,38,1,0,0, + 114,143,0,0,0,114,206,0,0,0,114,137,0,0,0,114, + 51,1,0,0,114,203,0,0,0,114,62,1,0,0,114,207, + 0,0,0,114,69,1,0,0,114,31,1,0,0,114,5,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,54,1,0,0,91,5,0,0,115,26,0,0,0,8, + 0,4,2,8,7,8,14,4,4,8,2,8,12,10,5,8, + 48,2,31,10,1,12,17,255,128,114,54,1,0,0,99,4, 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,8, 0,0,0,67,0,0,0,115,144,0,0,0,124,0,160,0, 100,1,161,1,125,4,124,0,160,0,100,2,161,1,125,5, @@ -2524,87 +2544,88 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,104,110,97,109,101,114,140,0,0,0,114,187,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, 14,95,102,105,120,95,117,112,95,109,111,100,117,108,101,240, - 5,0,0,115,34,0,0,0,0,2,10,1,10,1,4,1, - 4,1,8,1,8,1,12,2,10,1,4,1,14,1,2,1, - 8,1,8,1,8,1,12,1,12,2,114,75,1,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,38,0,0,0,116,0,116, - 1,160,2,161,0,102,2,125,0,116,3,116,4,102,2,125, - 1,116,5,116,6,102,2,125,2,124,0,124,1,124,2,103, - 3,83,0,41,1,122,95,82,101,116,117,114,110,115,32,97, - 32,108,105,115,116,32,111,102,32,102,105,108,101,45,98,97, - 115,101,100,32,109,111,100,117,108,101,32,108,111,97,100,101, - 114,115,46,10,10,32,32,32,32,69,97,99,104,32,105,116, - 101,109,32,105,115,32,97,32,116,117,112,108,101,32,40,108, - 111,97,100,101,114,44,32,115,117,102,102,105,120,101,115,41, - 46,10,32,32,32,32,41,7,114,252,0,0,0,114,163,0, - 0,0,218,18,101,120,116,101,110,115,105,111,110,95,115,117, - 102,102,105,120,101,115,114,255,0,0,0,114,101,0,0,0, - 114,5,1,0,0,114,88,0,0,0,41,3,90,10,101,120, - 116,101,110,115,105,111,110,115,90,6,115,111,117,114,99,101, - 90,8,98,121,116,101,99,111,100,101,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,184,0,0,0,7,6, - 0,0,115,8,0,0,0,0,5,12,1,8,1,8,1,114, - 184,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,10,0,0,0,9,0,0,0,67,0,0,0,115,130,1, - 0,0,124,0,97,0,116,0,106,1,97,1,116,0,106,2, - 97,2,116,1,106,3,116,4,25,0,125,1,100,1,100,2, - 103,1,102,2,100,3,100,4,100,2,103,2,102,2,102,2, - 125,2,124,2,68,0,93,106,92,2,125,3,125,4,116,5, - 100,5,100,6,132,0,124,4,68,0,131,1,131,1,115,82, - 74,0,130,1,124,4,100,7,25,0,125,5,124,3,116,1, - 106,3,118,0,114,116,116,1,106,3,124,3,25,0,125,6, - 1,0,113,168,113,52,122,20,116,0,160,6,124,3,161,1, - 125,6,87,0,1,0,113,168,87,0,113,52,4,0,116,7, - 121,158,1,0,1,0,1,0,89,0,113,52,89,0,113,52, - 48,0,116,7,100,8,131,1,130,1,116,8,124,1,100,9, - 124,6,131,3,1,0,116,8,124,1,100,10,124,5,131,3, - 1,0,116,8,124,1,100,11,100,12,160,9,124,4,161,1, - 131,3,1,0,116,8,124,1,100,13,100,14,100,15,132,0, - 124,4,68,0,131,1,131,3,1,0,103,0,100,16,162,1, - 125,7,124,3,100,3,107,2,144,1,114,4,124,7,160,10, - 100,17,161,1,1,0,124,7,68,0,93,52,125,8,124,8, - 116,1,106,3,118,1,144,1,114,36,116,0,160,6,124,8, - 161,1,125,9,110,10,116,1,106,3,124,8,25,0,125,9, - 116,8,124,1,124,8,124,9,131,3,1,0,144,1,113,8, - 116,8,124,1,100,18,116,11,131,0,131,3,1,0,116,12, - 160,13,116,2,160,14,161,0,161,1,1,0,124,3,100,3, - 107,2,144,1,114,126,116,15,160,10,100,19,161,1,1,0, - 100,20,116,12,118,0,144,1,114,126,100,21,116,16,95,17, - 100,22,83,0,41,23,122,205,83,101,116,117,112,32,116,104, - 101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112, - 111,114,116,101,114,115,32,102,111,114,32,105,109,112,111,114, - 116,108,105,98,32,98,121,32,105,109,112,111,114,116,105,110, - 103,32,110,101,101,100,101,100,10,32,32,32,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,115,32,97,110, - 100,32,105,110,106,101,99,116,105,110,103,32,116,104,101,109, - 32,105,110,116,111,32,116,104,101,32,103,108,111,98,97,108, - 32,110,97,109,101,115,112,97,99,101,46,10,10,32,32,32, - 32,79,116,104,101,114,32,99,111,109,112,111,110,101,110,116, - 115,32,97,114,101,32,101,120,116,114,97,99,116,101,100,32, - 102,114,111,109,32,116,104,101,32,99,111,114,101,32,98,111, - 111,116,115,116,114,97,112,32,109,111,100,117,108,101,46,10, - 10,32,32,32,32,90,5,112,111,115,105,120,250,1,47,90, - 2,110,116,250,1,92,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,115,0,0,0,115, - 26,0,0,0,124,0,93,18,125,1,116,0,124,1,131,1, - 100,0,107,2,86,0,1,0,113,2,100,1,83,0,41,2, - 114,39,0,0,0,78,41,1,114,23,0,0,0,41,2,114, - 32,0,0,0,114,94,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,10,1,0,0,36,6,0, - 0,114,56,1,0,0,122,25,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,114,73,0,0,0,122,30,105,109,112,111,114,116,108,105, - 98,32,114,101,113,117,105,114,101,115,32,112,111,115,105,120, - 32,111,114,32,110,116,114,4,0,0,0,114,35,0,0,0, - 114,31,0,0,0,114,40,0,0,0,114,58,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,83,0,0,0,115,22,0,0,0,104,0,124, - 0,93,14,125,1,100,0,124,1,155,0,157,2,146,2,113, - 4,83,0,41,1,114,74,0,0,0,114,5,0,0,0,41, - 2,114,32,0,0,0,218,1,115,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,64,1,0,0,53,6,0, - 0,114,56,1,0,0,122,25,95,115,101,116,117,112,46,60, + 5,0,0,115,38,0,0,0,10,2,10,1,4,1,4,1, + 8,1,8,1,12,1,10,2,4,1,14,1,2,1,8,1, + 8,1,8,1,12,1,12,1,6,2,4,128,255,128,114,74, + 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, + 0,116,0,116,1,160,2,161,0,102,2,125,0,116,3,116, + 4,102,2,125,1,116,5,116,6,102,2,125,2,124,0,124, + 1,124,2,103,3,83,0,41,1,122,95,82,101,116,117,114, + 110,115,32,97,32,108,105,115,116,32,111,102,32,102,105,108, + 101,45,98,97,115,101,100,32,109,111,100,117,108,101,32,108, + 111,97,100,101,114,115,46,10,10,32,32,32,32,69,97,99, + 104,32,105,116,101,109,32,105,115,32,97,32,116,117,112,108, + 101,32,40,108,111,97,100,101,114,44,32,115,117,102,102,105, + 120,101,115,41,46,10,32,32,32,32,41,7,114,252,0,0, + 0,114,163,0,0,0,218,18,101,120,116,101,110,115,105,111, + 110,95,115,117,102,102,105,120,101,115,114,255,0,0,0,114, + 101,0,0,0,114,5,1,0,0,114,88,0,0,0,41,3, + 90,10,101,120,116,101,110,115,105,111,110,115,90,6,115,111, + 117,114,99,101,90,8,98,121,116,101,99,111,100,101,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,184,0, + 0,0,7,6,0,0,115,10,0,0,0,12,5,8,1,8, + 1,10,1,255,128,114,184,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,10,0,0,0,9,0,0,0,67, + 0,0,0,115,130,1,0,0,124,0,97,0,116,0,106,1, + 97,1,116,0,106,2,97,2,116,1,106,3,116,4,25,0, + 125,1,100,1,100,2,103,1,102,2,100,3,100,4,100,2, + 103,2,102,2,102,2,125,2,124,2,68,0,93,106,92,2, + 125,3,125,4,116,5,100,5,100,6,132,0,124,4,68,0, + 131,1,131,1,115,82,74,0,130,1,124,4,100,7,25,0, + 125,5,124,3,116,1,106,3,118,0,114,116,116,1,106,3, + 124,3,25,0,125,6,1,0,113,168,113,52,122,20,116,0, + 160,6,124,3,161,1,125,6,87,0,1,0,113,168,87,0, + 113,52,4,0,116,7,121,158,1,0,1,0,1,0,89,0, + 113,52,89,0,113,52,48,0,116,7,100,8,131,1,130,1, + 116,8,124,1,100,9,124,6,131,3,1,0,116,8,124,1, + 100,10,124,5,131,3,1,0,116,8,124,1,100,11,100,12, + 160,9,124,4,161,1,131,3,1,0,116,8,124,1,100,13, + 100,14,100,15,132,0,124,4,68,0,131,1,131,3,1,0, + 103,0,100,16,162,1,125,7,124,3,100,3,107,2,144,1, + 114,4,124,7,160,10,100,17,161,1,1,0,124,7,68,0, + 93,52,125,8,124,8,116,1,106,3,118,1,144,1,114,36, + 116,0,160,6,124,8,161,1,125,9,110,10,116,1,106,3, + 124,8,25,0,125,9,116,8,124,1,124,8,124,9,131,3, + 1,0,144,1,113,8,116,8,124,1,100,18,116,11,131,0, + 131,3,1,0,116,12,160,13,116,2,160,14,161,0,161,1, + 1,0,124,3,100,3,107,2,144,1,114,126,116,15,160,10, + 100,19,161,1,1,0,100,20,116,12,118,0,144,1,114,126, + 100,21,116,16,95,17,100,22,83,0,41,23,122,205,83,101, + 116,117,112,32,116,104,101,32,112,97,116,104,45,98,97,115, + 101,100,32,105,109,112,111,114,116,101,114,115,32,102,111,114, + 32,105,109,112,111,114,116,108,105,98,32,98,121,32,105,109, + 112,111,114,116,105,110,103,32,110,101,101,100,101,100,10,32, + 32,32,32,98,117,105,108,116,45,105,110,32,109,111,100,117, + 108,101,115,32,97,110,100,32,105,110,106,101,99,116,105,110, + 103,32,116,104,101,109,32,105,110,116,111,32,116,104,101,32, + 103,108,111,98,97,108,32,110,97,109,101,115,112,97,99,101, + 46,10,10,32,32,32,32,79,116,104,101,114,32,99,111,109, + 112,111,110,101,110,116,115,32,97,114,101,32,101,120,116,114, + 97,99,116,101,100,32,102,114,111,109,32,116,104,101,32,99, + 111,114,101,32,98,111,111,116,115,116,114,97,112,32,109,111, + 100,117,108,101,46,10,10,32,32,32,32,90,5,112,111,115, + 105,120,250,1,47,90,2,110,116,250,1,92,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,115,0,0,0,115,26,0,0,0,124,0,93,18,125,1, + 116,0,124,1,131,1,100,0,107,2,86,0,1,0,113,2, + 100,1,83,0,41,2,114,39,0,0,0,78,41,1,114,23, + 0,0,0,41,2,114,32,0,0,0,114,94,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,10, + 1,0,0,36,6,0,0,115,6,0,0,0,22,0,4,128, + 255,128,122,25,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,114,73,0, + 0,0,122,30,105,109,112,111,114,116,108,105,98,32,114,101, + 113,117,105,114,101,115,32,112,111,115,105,120,32,111,114,32, + 110,116,114,4,0,0,0,114,35,0,0,0,114,31,0,0, + 0,114,40,0,0,0,114,58,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, + 83,0,0,0,115,22,0,0,0,104,0,124,0,93,14,125, + 1,100,0,124,1,155,0,157,2,146,2,113,4,83,0,41, + 1,114,74,0,0,0,114,5,0,0,0,41,2,114,32,0, + 0,0,218,1,115,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,63,1,0,0,53,6,0,0,115,4,0, + 0,0,22,0,255,128,122,25,95,115,101,116,117,112,46,60, 108,111,99,97,108,115,62,46,60,115,101,116,99,111,109,112, 62,41,3,114,64,0,0,0,114,75,0,0,0,114,160,0, 0,0,114,192,0,0,0,114,9,0,0,0,122,4,46,112, @@ -2614,7 +2635,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 117,105,108,116,105,110,95,102,114,111,109,95,110,97,109,101, 114,117,0,0,0,114,129,0,0,0,114,36,0,0,0,114, 186,0,0,0,114,14,0,0,0,114,12,1,0,0,114,167, - 0,0,0,114,76,1,0,0,114,101,0,0,0,114,191,0, + 0,0,0,114,75,1,0,0,114,101,0,0,0,114,191,0, 0,0,114,195,0,0,0,41,10,218,17,95,98,111,111,116, 115,116,114,97,112,95,109,111,100,117,108,101,90,11,115,101, 108,102,95,109,111,100,117,108,101,90,10,111,115,95,100,101, @@ -2624,64 +2645,65 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,97,109,101,115,90,12,98,117,105,108,116,105,110,95,110, 97,109,101,90,14,98,117,105,108,116,105,110,95,109,111,100, 117,108,101,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,6,95,115,101,116,117,112,18,6,0,0,115,70, - 0,0,0,0,8,4,1,6,1,6,2,10,3,22,1,12, - 2,22,1,8,1,10,1,10,1,6,2,2,1,10,1,10, - 1,12,1,10,2,8,2,12,1,12,1,18,1,22,3,8, - 1,10,1,10,1,8,1,12,1,12,2,10,1,16,3,14, - 1,14,1,10,1,10,1,10,1,114,82,1,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,67,0,0,0,115,50,0,0,0,116,0,124,0, - 131,1,1,0,116,1,131,0,125,1,116,2,106,3,160,4, - 116,5,106,6,124,1,142,0,103,1,161,1,1,0,116,2, - 106,7,160,8,116,9,161,1,1,0,100,1,83,0,41,2, - 122,41,73,110,115,116,97,108,108,32,116,104,101,32,112,97, - 116,104,45,98,97,115,101,100,32,105,109,112,111,114,116,32, - 99,111,109,112,111,110,101,110,116,115,46,78,41,10,114,82, - 1,0,0,114,184,0,0,0,114,1,0,0,0,114,43,1, - 0,0,114,167,0,0,0,114,54,1,0,0,114,70,1,0, - 0,218,9,109,101,116,97,95,112,97,116,104,114,186,0,0, - 0,114,37,1,0,0,41,2,114,81,1,0,0,90,17,115, - 117,112,112,111,114,116,101,100,95,108,111,97,100,101,114,115, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 8,95,105,110,115,116,97,108,108,75,6,0,0,115,8,0, - 0,0,0,2,8,1,6,1,20,1,114,84,1,0,0,41, - 1,114,60,0,0,0,41,1,78,41,3,78,78,78,41,2, - 114,73,0,0,0,114,73,0,0,0,41,1,84,41,1,78, - 41,1,78,41,63,114,127,0,0,0,114,13,0,0,0,90, - 37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, - 86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,84, - 69,83,95,75,69,89,114,12,0,0,0,114,14,0,0,0, - 114,21,0,0,0,114,27,0,0,0,114,29,0,0,0,114, - 38,0,0,0,114,47,0,0,0,114,49,0,0,0,114,53, - 0,0,0,114,54,0,0,0,114,56,0,0,0,114,59,0, - 0,0,114,69,0,0,0,218,4,116,121,112,101,218,8,95, - 95,99,111,100,101,95,95,114,162,0,0,0,114,19,0,0, - 0,114,148,0,0,0,114,18,0,0,0,114,24,0,0,0, - 114,236,0,0,0,114,91,0,0,0,114,87,0,0,0,114, - 101,0,0,0,114,88,0,0,0,90,23,68,69,66,85,71, - 95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88, - 69,83,90,27,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,114, - 97,0,0,0,114,102,0,0,0,114,108,0,0,0,114,112, - 0,0,0,114,114,0,0,0,114,136,0,0,0,114,143,0, - 0,0,114,152,0,0,0,114,156,0,0,0,114,158,0,0, - 0,114,165,0,0,0,114,170,0,0,0,114,171,0,0,0, - 114,176,0,0,0,218,6,111,98,106,101,99,116,114,185,0, - 0,0,114,190,0,0,0,114,191,0,0,0,114,208,0,0, - 0,114,221,0,0,0,114,239,0,0,0,114,255,0,0,0, - 114,5,1,0,0,114,12,1,0,0,114,252,0,0,0,114, - 13,1,0,0,114,35,1,0,0,114,37,1,0,0,114,54, - 1,0,0,114,75,1,0,0,114,184,0,0,0,114,82,1, - 0,0,114,84,1,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,8,60,109,111, - 100,117,108,101,62,1,0,0,0,115,126,0,0,0,4,22, - 4,1,4,1,2,1,2,255,4,4,8,17,8,5,8,5, - 8,6,8,6,8,12,8,10,8,9,8,5,8,7,8,9, - 10,22,10,127,0,21,16,1,12,2,4,1,4,2,6,2, - 6,2,8,2,16,71,8,40,8,19,8,12,8,12,8,28, - 8,17,8,33,8,28,8,24,10,13,10,10,10,11,8,14, - 6,3,4,1,2,255,12,68,14,64,14,29,16,127,0,17, - 14,50,18,45,18,26,4,3,18,53,14,63,14,42,14,127, - 0,20,14,127,0,22,10,23,8,11,8,57, + 0,0,218,6,95,115,101,116,117,112,18,6,0,0,115,74, + 0,0,0,4,8,6,1,6,1,10,2,22,3,12,1,22, + 2,8,1,10,1,10,1,6,1,2,2,10,1,10,1,12, + 1,10,1,8,2,12,2,12,1,18,1,22,1,8,3,10, + 1,10,1,8,1,12,1,12,1,10,2,16,1,14,3,14, + 1,10,1,10,1,10,1,6,1,4,128,255,128,114,81,1, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,0, + 116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,2, + 106,3,160,4,116,5,106,6,124,1,142,0,103,1,161,1, + 1,0,116,2,106,7,160,8,116,9,161,1,1,0,100,1, + 83,0,41,2,122,41,73,110,115,116,97,108,108,32,116,104, + 101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112, + 111,114,116,32,99,111,109,112,111,110,101,110,116,115,46,78, + 41,10,114,81,1,0,0,114,184,0,0,0,114,1,0,0, + 0,114,43,1,0,0,114,167,0,0,0,114,54,1,0,0, + 114,69,1,0,0,218,9,109,101,116,97,95,112,97,116,104, + 114,186,0,0,0,114,37,1,0,0,41,2,114,80,1,0, + 0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,97, + 100,101,114,115,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,8,95,105,110,115,116,97,108,108,75,6,0, + 0,115,12,0,0,0,8,2,6,1,20,1,12,1,4,128, + 255,128,114,83,1,0,0,41,1,114,60,0,0,0,41,1, + 78,41,3,78,78,78,41,2,114,73,0,0,0,114,73,0, + 0,0,41,1,84,41,1,78,41,1,78,41,63,114,127,0, + 0,0,114,13,0,0,0,90,37,95,67,65,83,69,95,73, + 78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70, + 79,82,77,83,95,66,89,84,69,83,95,75,69,89,114,12, + 0,0,0,114,14,0,0,0,114,21,0,0,0,114,27,0, + 0,0,114,29,0,0,0,114,38,0,0,0,114,47,0,0, + 0,114,49,0,0,0,114,53,0,0,0,114,54,0,0,0, + 114,56,0,0,0,114,59,0,0,0,114,69,0,0,0,218, + 4,116,121,112,101,218,8,95,95,99,111,100,101,95,95,114, + 162,0,0,0,114,19,0,0,0,114,148,0,0,0,114,18, + 0,0,0,114,24,0,0,0,114,236,0,0,0,114,91,0, + 0,0,114,87,0,0,0,114,101,0,0,0,114,88,0,0, + 0,90,23,68,69,66,85,71,95,66,89,84,69,67,79,68, + 69,95,83,85,70,70,73,88,69,83,90,27,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,114,97,0,0,0,114,102,0,0, + 0,114,108,0,0,0,114,112,0,0,0,114,114,0,0,0, + 114,136,0,0,0,114,143,0,0,0,114,152,0,0,0,114, + 156,0,0,0,114,158,0,0,0,114,165,0,0,0,114,170, + 0,0,0,114,171,0,0,0,114,176,0,0,0,218,6,111, + 98,106,101,99,116,114,185,0,0,0,114,190,0,0,0,114, + 191,0,0,0,114,208,0,0,0,114,221,0,0,0,114,239, + 0,0,0,114,255,0,0,0,114,5,1,0,0,114,12,1, + 0,0,114,252,0,0,0,114,13,1,0,0,114,35,1,0, + 0,114,37,1,0,0,114,54,1,0,0,114,74,1,0,0, + 114,184,0,0,0,114,81,1,0,0,114,83,1,0,0,114, + 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,0, + 0,115,132,0,0,0,4,0,4,22,4,1,2,1,2,1, + 4,255,8,4,8,17,8,5,8,5,8,6,8,6,8,12, + 8,10,8,9,8,5,8,7,10,9,10,22,0,127,16,21, + 12,1,4,2,4,1,6,2,6,2,8,2,16,2,8,71, + 8,40,8,19,8,12,8,12,8,28,8,17,8,33,8,28, + 10,24,10,13,10,10,8,11,6,14,4,3,2,1,12,255, + 14,68,14,64,16,29,0,127,14,17,18,50,18,45,4,26, + 18,3,14,53,14,63,14,42,0,127,14,20,0,127,10,22, + 8,23,8,11,8,57,4,128,255,128, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index a70d7d2fe78070..c90a5b79aa5631 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -72,154 +72,110 @@ const unsigned char _Py_M__zipimport[] = { 95,113,117,97,108,110,97,109,101,95,95,169,0,114,9,0, 0,0,114,9,0,0,0,250,18,60,102,114,111,122,101,110, 32,122,105,112,105,109,112,111,114,116,62,114,3,0,0,0, - 33,0,0,0,115,2,0,0,0,8,1,233,22,0,0,0, - 115,4,0,0,0,80,75,5,6,105,255,255,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,64,0,0,0,115,108,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, - 100,25,100,5,100,6,132,1,90,5,100,26,100,7,100,8, - 132,1,90,6,100,9,100,10,132,0,90,7,100,11,100,12, - 132,0,90,8,100,13,100,14,132,0,90,9,100,15,100,16, - 132,0,90,10,100,17,100,18,132,0,90,11,100,19,100,20, - 132,0,90,12,100,21,100,22,132,0,90,13,100,23,100,24, - 132,0,90,14,100,4,83,0,41,27,114,4,0,0,0,97, - 255,1,0,0,122,105,112,105,109,112,111,114,116,101,114,40, - 97,114,99,104,105,118,101,112,97,116,104,41,32,45,62,32, + 33,0,0,0,115,6,0,0,0,8,0,4,1,255,128,233, + 22,0,0,0,115,4,0,0,0,80,75,5,6,105,255,255, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,64,0,0,0,115,108,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, + 132,0,90,4,100,25,100,5,100,6,132,1,90,5,100,26, + 100,7,100,8,132,1,90,6,100,9,100,10,132,0,90,7, + 100,11,100,12,132,0,90,8,100,13,100,14,132,0,90,9, + 100,15,100,16,132,0,90,10,100,17,100,18,132,0,90,11, + 100,19,100,20,132,0,90,12,100,21,100,22,132,0,90,13, + 100,23,100,24,132,0,90,14,100,4,83,0,41,27,114,4, + 0,0,0,97,255,1,0,0,122,105,112,105,109,112,111,114, + 116,101,114,40,97,114,99,104,105,118,101,112,97,116,104,41, + 32,45,62,32,122,105,112,105,109,112,111,114,116,101,114,32, + 111,98,106,101,99,116,10,10,32,32,32,32,67,114,101,97, + 116,101,32,97,32,110,101,119,32,122,105,112,105,109,112,111, + 114,116,101,114,32,105,110,115,116,97,110,99,101,46,32,39, + 97,114,99,104,105,118,101,112,97,116,104,39,32,109,117,115, + 116,32,98,101,32,97,32,112,97,116,104,32,116,111,10,32, + 32,32,32,97,32,122,105,112,102,105,108,101,44,32,111,114, + 32,116,111,32,97,32,115,112,101,99,105,102,105,99,32,112, + 97,116,104,32,105,110,115,105,100,101,32,97,32,122,105,112, + 102,105,108,101,46,32,70,111,114,32,101,120,97,109,112,108, + 101,44,32,105,116,32,99,97,110,32,98,101,10,32,32,32, + 32,39,47,116,109,112,47,109,121,105,109,112,111,114,116,46, + 122,105,112,39,44,32,111,114,32,39,47,116,109,112,47,109, + 121,105,109,112,111,114,116,46,122,105,112,47,109,121,100,105, + 114,101,99,116,111,114,121,39,44,32,105,102,32,109,121,100, + 105,114,101,99,116,111,114,121,32,105,115,32,97,10,32,32, + 32,32,118,97,108,105,100,32,100,105,114,101,99,116,111,114, + 121,32,105,110,115,105,100,101,32,116,104,101,32,97,114,99, + 104,105,118,101,46,10,10,32,32,32,32,39,90,105,112,73, + 109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,97, + 105,115,101,100,32,105,102,32,39,97,114,99,104,105,118,101, + 112,97,116,104,39,32,100,111,101,115,110,39,116,32,112,111, + 105,110,116,32,116,111,32,97,32,118,97,108,105,100,32,90, + 105,112,10,32,32,32,32,97,114,99,104,105,118,101,46,10, + 10,32,32,32,32,84,104,101,32,39,97,114,99,104,105,118, + 101,39,32,97,116,116,114,105,98,117,116,101,32,111,102,32, 122,105,112,105,109,112,111,114,116,101,114,32,111,98,106,101, - 99,116,10,10,32,32,32,32,67,114,101,97,116,101,32,97, - 32,110,101,119,32,122,105,112,105,109,112,111,114,116,101,114, - 32,105,110,115,116,97,110,99,101,46,32,39,97,114,99,104, - 105,118,101,112,97,116,104,39,32,109,117,115,116,32,98,101, - 32,97,32,112,97,116,104,32,116,111,10,32,32,32,32,97, - 32,122,105,112,102,105,108,101,44,32,111,114,32,116,111,32, - 97,32,115,112,101,99,105,102,105,99,32,112,97,116,104,32, - 105,110,115,105,100,101,32,97,32,122,105,112,102,105,108,101, - 46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105, - 116,32,99,97,110,32,98,101,10,32,32,32,32,39,47,116, - 109,112,47,109,121,105,109,112,111,114,116,46,122,105,112,39, - 44,32,111,114,32,39,47,116,109,112,47,109,121,105,109,112, - 111,114,116,46,122,105,112,47,109,121,100,105,114,101,99,116, - 111,114,121,39,44,32,105,102,32,109,121,100,105,114,101,99, - 116,111,114,121,32,105,115,32,97,10,32,32,32,32,118,97, - 108,105,100,32,100,105,114,101,99,116,111,114,121,32,105,110, - 115,105,100,101,32,116,104,101,32,97,114,99,104,105,118,101, - 46,10,10,32,32,32,32,39,90,105,112,73,109,112,111,114, - 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, - 32,105,102,32,39,97,114,99,104,105,118,101,112,97,116,104, - 39,32,100,111,101,115,110,39,116,32,112,111,105,110,116,32, - 116,111,32,97,32,118,97,108,105,100,32,90,105,112,10,32, - 32,32,32,97,114,99,104,105,118,101,46,10,10,32,32,32, - 32,84,104,101,32,39,97,114,99,104,105,118,101,39,32,97, - 116,116,114,105,98,117,116,101,32,111,102,32,122,105,112,105, - 109,112,111,114,116,101,114,32,111,98,106,101,99,116,115,32, - 99,111,110,116,97,105,110,115,32,116,104,101,32,110,97,109, - 101,32,111,102,32,116,104,101,10,32,32,32,32,122,105,112, - 102,105,108,101,32,116,97,114,103,101,116,101,100,46,10,32, - 32,32,32,99,2,0,0,0,0,0,0,0,0,0,0,0, - 8,0,0,0,9,0,0,0,67,0,0,0,115,32,1,0, - 0,116,0,124,1,116,1,131,2,115,28,100,1,100,0,108, - 2,125,2,124,2,160,3,124,1,161,1,125,1,124,1,115, - 44,116,4,100,2,124,1,100,3,141,2,130,1,116,5,114, - 60,124,1,160,6,116,5,116,7,161,2,125,1,103,0,125, - 3,122,14,116,8,160,9,124,1,161,1,125,4,87,0,110, - 70,4,0,116,10,116,11,102,2,121,148,1,0,1,0,1, - 0,116,8,160,12,124,1,161,1,92,2,125,5,125,6,124, - 5,124,1,107,2,114,130,116,4,100,4,124,1,100,3,141, - 2,130,1,124,5,125,1,124,3,160,13,124,6,161,1,1, - 0,89,0,113,64,48,0,124,4,106,14,100,5,64,0,100, - 6,107,3,114,180,116,4,100,4,124,1,100,3,141,2,130, - 1,113,180,113,64,122,12,116,15,124,1,25,0,125,7,87, - 0,110,34,4,0,116,16,121,226,1,0,1,0,1,0,116, - 17,124,1,131,1,125,7,124,7,116,15,124,1,60,0,89, - 0,110,2,48,0,124,7,124,0,95,18,124,1,124,0,95, - 19,116,8,106,20,124,3,100,0,100,0,100,7,133,3,25, - 0,142,0,124,0,95,21,124,0,106,21,144,1,114,28,124, - 0,4,0,106,21,116,7,55,0,2,0,95,21,100,0,83, - 0,41,8,78,114,0,0,0,0,122,21,97,114,99,104,105, - 118,101,32,112,97,116,104,32,105,115,32,101,109,112,116,121, - 169,1,218,4,112,97,116,104,122,14,110,111,116,32,97,32, - 90,105,112,32,102,105,108,101,105,0,240,0,0,105,0,128, - 0,0,233,255,255,255,255,41,22,218,10,105,115,105,110,115, - 116,97,110,99,101,218,3,115,116,114,218,2,111,115,90,8, - 102,115,100,101,99,111,100,101,114,3,0,0,0,218,12,97, - 108,116,95,112,97,116,104,95,115,101,112,218,7,114,101,112, - 108,97,99,101,218,8,112,97,116,104,95,115,101,112,218,19, - 95,98,111,111,116,115,116,114,97,112,95,101,120,116,101,114, - 110,97,108,90,10,95,112,97,116,104,95,115,116,97,116,218, - 7,79,83,69,114,114,111,114,218,10,86,97,108,117,101,69, - 114,114,111,114,90,11,95,112,97,116,104,95,115,112,108,105, - 116,218,6,97,112,112,101,110,100,90,7,115,116,95,109,111, - 100,101,218,20,95,122,105,112,95,100,105,114,101,99,116,111, - 114,121,95,99,97,99,104,101,218,8,75,101,121,69,114,114, - 111,114,218,15,95,114,101,97,100,95,100,105,114,101,99,116, - 111,114,121,218,6,95,102,105,108,101,115,218,7,97,114,99, - 104,105,118,101,218,10,95,112,97,116,104,95,106,111,105,110, - 218,6,112,114,101,102,105,120,41,8,218,4,115,101,108,102, - 114,13,0,0,0,114,17,0,0,0,114,31,0,0,0,90, - 2,115,116,90,7,100,105,114,110,97,109,101,90,8,98,97, - 115,101,110,97,109,101,218,5,102,105,108,101,115,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,8,95,95, - 105,110,105,116,95,95,63,0,0,0,115,58,0,0,0,0, - 1,10,1,8,1,10,1,4,1,12,1,4,1,12,2,4, - 2,2,1,14,1,16,3,14,1,8,1,12,1,4,1,16, - 3,14,2,12,1,4,2,2,1,12,1,12,1,8,1,14, - 1,6,1,6,2,22,1,8,1,122,20,122,105,112,105,109, - 112,111,114,116,101,114,46,95,95,105,110,105,116,95,95,78, - 99,3,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,4,0,0,0,67,0,0,0,115,78,0,0,0,116,0, - 124,0,124,1,131,2,125,3,124,3,100,1,117,1,114,26, - 124,0,103,0,102,2,83,0,116,1,124,0,124,1,131,2, - 125,4,116,2,124,0,124,4,131,2,114,70,100,1,124,0, - 106,3,155,0,116,4,155,0,124,4,155,0,157,3,103,1, - 102,2,83,0,100,1,103,0,102,2,83,0,41,2,97,239, - 1,0,0,102,105,110,100,95,108,111,97,100,101,114,40,102, - 117,108,108,110,97,109,101,44,32,112,97,116,104,61,78,111, - 110,101,41,32,45,62,32,115,101,108,102,44,32,115,116,114, - 32,111,114,32,78,111,110,101,46,10,10,32,32,32,32,32, - 32,32,32,83,101,97,114,99,104,32,102,111,114,32,97,32, - 109,111,100,117,108,101,32,115,112,101,99,105,102,105,101,100, - 32,98,121,32,39,102,117,108,108,110,97,109,101,39,46,32, - 39,102,117,108,108,110,97,109,101,39,32,109,117,115,116,32, - 98,101,32,116,104,101,10,32,32,32,32,32,32,32,32,102, - 117,108,108,121,32,113,117,97,108,105,102,105,101,100,32,40, - 100,111,116,116,101,100,41,32,109,111,100,117,108,101,32,110, - 97,109,101,46,32,73,116,32,114,101,116,117,114,110,115,32, - 116,104,101,32,122,105,112,105,109,112,111,114,116,101,114,10, - 32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101, - 32,105,116,115,101,108,102,32,105,102,32,116,104,101,32,109, - 111,100,117,108,101,32,119,97,115,32,102,111,117,110,100,44, - 32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105, - 110,105,110,103,32,116,104,101,10,32,32,32,32,32,32,32, - 32,102,117,108,108,32,112,97,116,104,32,110,97,109,101,32, - 105,102,32,105,116,39,115,32,112,111,115,115,105,98,108,121, - 32,97,32,112,111,114,116,105,111,110,32,111,102,32,97,32, - 110,97,109,101,115,112,97,99,101,32,112,97,99,107,97,103, - 101,44,10,32,32,32,32,32,32,32,32,111,114,32,78,111, - 110,101,32,111,116,104,101,114,119,105,115,101,46,32,84,104, - 101,32,111,112,116,105,111,110,97,108,32,39,112,97,116,104, - 39,32,97,114,103,117,109,101,110,116,32,105,115,32,105,103, - 110,111,114,101,100,32,45,45,32,105,116,39,115,10,32,32, - 32,32,32,32,32,32,116,104,101,114,101,32,102,111,114,32, - 99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105, - 116,104,32,116,104,101,32,105,109,112,111,114,116,101,114,32, - 112,114,111,116,111,99,111,108,46,10,32,32,32,32,32,32, - 32,32,78,41,5,218,16,95,103,101,116,95,109,111,100,117, - 108,101,95,105,110,102,111,218,16,95,103,101,116,95,109,111, - 100,117,108,101,95,112,97,116,104,218,7,95,105,115,95,100, - 105,114,114,29,0,0,0,114,20,0,0,0,41,5,114,32, - 0,0,0,218,8,102,117,108,108,110,97,109,101,114,13,0, - 0,0,218,2,109,105,218,7,109,111,100,112,97,116,104,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,11, - 102,105,110,100,95,108,111,97,100,101,114,109,0,0,0,115, - 14,0,0,0,0,10,10,1,8,2,8,7,10,1,10,4, - 24,2,122,23,122,105,112,105,109,112,111,114,116,101,114,46, - 102,105,110,100,95,108,111,97,100,101,114,99,3,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0, - 67,0,0,0,115,16,0,0,0,124,0,160,0,124,1,124, - 2,161,2,100,1,25,0,83,0,41,2,97,139,1,0,0, - 102,105,110,100,95,109,111,100,117,108,101,40,102,117,108,108, - 110,97,109,101,44,32,112,97,116,104,61,78,111,110,101,41, - 32,45,62,32,115,101,108,102,32,111,114,32,78,111,110,101, + 99,116,115,32,99,111,110,116,97,105,110,115,32,116,104,101, + 32,110,97,109,101,32,111,102,32,116,104,101,10,32,32,32, + 32,122,105,112,102,105,108,101,32,116,97,114,103,101,116,101, + 100,46,10,32,32,32,32,99,2,0,0,0,0,0,0,0, + 0,0,0,0,8,0,0,0,9,0,0,0,67,0,0,0, + 115,32,1,0,0,116,0,124,1,116,1,131,2,115,28,100, + 1,100,0,108,2,125,2,124,2,160,3,124,1,161,1,125, + 1,124,1,115,44,116,4,100,2,124,1,100,3,141,2,130, + 1,116,5,114,60,124,1,160,6,116,5,116,7,161,2,125, + 1,103,0,125,3,122,14,116,8,160,9,124,1,161,1,125, + 4,87,0,110,70,4,0,116,10,116,11,102,2,121,148,1, + 0,1,0,1,0,116,8,160,12,124,1,161,1,92,2,125, + 5,125,6,124,5,124,1,107,2,114,130,116,4,100,4,124, + 1,100,3,141,2,130,1,124,5,125,1,124,3,160,13,124, + 6,161,1,1,0,89,0,113,64,48,0,124,4,106,14,100, + 5,64,0,100,6,107,3,114,180,116,4,100,4,124,1,100, + 3,141,2,130,1,113,180,113,64,122,12,116,15,124,1,25, + 0,125,7,87,0,110,34,4,0,116,16,121,226,1,0,1, + 0,1,0,116,17,124,1,131,1,125,7,124,7,116,15,124, + 1,60,0,89,0,110,2,48,0,124,7,124,0,95,18,124, + 1,124,0,95,19,116,8,106,20,124,3,100,0,100,0,100, + 7,133,3,25,0,142,0,124,0,95,21,124,0,106,21,144, + 1,114,28,124,0,4,0,106,21,116,7,55,0,2,0,95, + 21,100,0,83,0,41,8,78,114,0,0,0,0,122,21,97, + 114,99,104,105,118,101,32,112,97,116,104,32,105,115,32,101, + 109,112,116,121,169,1,218,4,112,97,116,104,122,14,110,111, + 116,32,97,32,90,105,112,32,102,105,108,101,105,0,240,0, + 0,105,0,128,0,0,233,255,255,255,255,41,22,218,10,105, + 115,105,110,115,116,97,110,99,101,218,3,115,116,114,218,2, + 111,115,90,8,102,115,100,101,99,111,100,101,114,3,0,0, + 0,218,12,97,108,116,95,112,97,116,104,95,115,101,112,218, + 7,114,101,112,108,97,99,101,218,8,112,97,116,104,95,115, + 101,112,218,19,95,98,111,111,116,115,116,114,97,112,95,101, + 120,116,101,114,110,97,108,90,10,95,112,97,116,104,95,115, + 116,97,116,218,7,79,83,69,114,114,111,114,218,10,86,97, + 108,117,101,69,114,114,111,114,90,11,95,112,97,116,104,95, + 115,112,108,105,116,218,6,97,112,112,101,110,100,90,7,115, + 116,95,109,111,100,101,218,20,95,122,105,112,95,100,105,114, + 101,99,116,111,114,121,95,99,97,99,104,101,218,8,75,101, + 121,69,114,114,111,114,218,15,95,114,101,97,100,95,100,105, + 114,101,99,116,111,114,121,218,6,95,102,105,108,101,115,218, + 7,97,114,99,104,105,118,101,218,10,95,112,97,116,104,95, + 106,111,105,110,218,6,112,114,101,102,105,120,41,8,218,4, + 115,101,108,102,114,13,0,0,0,114,17,0,0,0,114,31, + 0,0,0,90,2,115,116,90,7,100,105,114,110,97,109,101, + 90,8,98,97,115,101,110,97,109,101,218,5,102,105,108,101, + 115,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,8,95,95,105,110,105,116,95,95,63,0,0,0,115,62, + 0,0,0,10,1,8,1,10,1,4,1,12,1,4,1,12, + 1,4,2,2,2,14,1,16,1,14,3,8,1,12,1,4, + 1,16,1,14,3,12,2,4,1,2,2,12,1,12,1,8, + 1,14,1,6,1,6,1,22,2,8,1,14,1,4,128,255, + 128,122,20,122,105,112,105,109,112,111,114,116,101,114,46,95, + 95,105,110,105,116,95,95,78,99,3,0,0,0,0,0,0, + 0,0,0,0,0,5,0,0,0,4,0,0,0,67,0,0, + 0,115,78,0,0,0,116,0,124,0,124,1,131,2,125,3, + 124,3,100,1,117,1,114,26,124,0,103,0,102,2,83,0, + 116,1,124,0,124,1,131,2,125,4,116,2,124,0,124,4, + 131,2,114,70,100,1,124,0,106,3,155,0,116,4,155,0, + 124,4,155,0,157,3,103,1,102,2,83,0,100,1,103,0, + 102,2,83,0,41,2,97,239,1,0,0,102,105,110,100,95, + 108,111,97,100,101,114,40,102,117,108,108,110,97,109,101,44, + 32,112,97,116,104,61,78,111,110,101,41,32,45,62,32,115, + 101,108,102,44,32,115,116,114,32,111,114,32,78,111,110,101, 46,10,10,32,32,32,32,32,32,32,32,83,101,97,114,99, 104,32,102,111,114,32,97,32,109,111,100,117,108,101,32,115, 112,101,99,105,102,105,101,100,32,98,121,32,39,102,117,108, @@ -232,72 +188,117 @@ const unsigned char _Py_M__zipimport[] = { 109,112,111,114,116,101,114,10,32,32,32,32,32,32,32,32, 105,110,115,116,97,110,99,101,32,105,116,115,101,108,102,32, 105,102,32,116,104,101,32,109,111,100,117,108,101,32,119,97, - 115,32,102,111,117,110,100,44,32,111,114,32,78,111,110,101, - 32,105,102,32,105,116,32,119,97,115,110,39,116,46,10,32, - 32,32,32,32,32,32,32,84,104,101,32,111,112,116,105,111, - 110,97,108,32,39,112,97,116,104,39,32,97,114,103,117,109, - 101,110,116,32,105,115,32,105,103,110,111,114,101,100,32,45, - 45,32,105,116,39,115,32,116,104,101,114,101,32,102,111,114, - 32,99,111,109,112,97,116,105,98,105,108,105,116,121,10,32, - 32,32,32,32,32,32,32,119,105,116,104,32,116,104,101,32, - 105,109,112,111,114,116,101,114,32,112,114,111,116,111,99,111, - 108,46,10,32,32,32,32,32,32,32,32,114,0,0,0,0, - 41,1,114,41,0,0,0,41,3,114,32,0,0,0,114,38, - 0,0,0,114,13,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,11,102,105,110,100,95,109,111, - 100,117,108,101,141,0,0,0,115,2,0,0,0,0,9,122, - 23,122,105,112,105,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,0,0,0,0,5,0,0,0,3,0,0,0,67,0,0, - 0,115,20,0,0,0,116,0,124,0,124,1,131,2,92,3, - 125,2,125,3,125,4,124,2,83,0,41,1,122,163,103,101, - 116,95,99,111,100,101,40,102,117,108,108,110,97,109,101,41, - 32,45,62,32,99,111,100,101,32,111,98,106,101,99,116,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 32,116,104,101,32,99,111,100,101,32,111,98,106,101,99,116, - 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,46,32,82,97,105,115,101, - 32,90,105,112,73,109,112,111,114,116,69,114,114,111,114,10, - 32,32,32,32,32,32,32,32,105,102,32,116,104,101,32,109, - 111,100,117,108,101,32,99,111,117,108,100,110,39,116,32,98, - 101,32,102,111,117,110,100,46,10,32,32,32,32,32,32,32, - 32,169,1,218,16,95,103,101,116,95,109,111,100,117,108,101, - 95,99,111,100,101,169,5,114,32,0,0,0,114,38,0,0, - 0,218,4,99,111,100,101,218,9,105,115,112,97,99,107,97, - 103,101,114,40,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,8,103,101,116,95,99,111,100,101, - 153,0,0,0,115,4,0,0,0,0,6,16,1,122,20,122, - 105,112,105,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,0,0,0,0, - 4,0,0,0,8,0,0,0,67,0,0,0,115,116,0,0, - 0,116,0,114,16,124,1,160,1,116,0,116,2,161,2,125, - 1,124,1,125,2,124,1,160,3,124,0,106,4,116,2,23, - 0,161,1,114,58,124,1,116,5,124,0,106,4,116,2,23, - 0,131,1,100,1,133,2,25,0,125,2,122,14,124,0,106, - 6,124,2,25,0,125,3,87,0,110,30,4,0,116,7,121, - 102,1,0,1,0,1,0,116,8,100,2,100,3,124,2,131, - 3,130,1,89,0,110,2,48,0,116,9,124,0,106,4,124, - 3,131,2,83,0,41,4,122,154,103,101,116,95,100,97,116, - 97,40,112,97,116,104,110,97,109,101,41,32,45,62,32,115, - 116,114,105,110,103,32,119,105,116,104,32,102,105,108,101,32, - 100,97,116,97,46,10,10,32,32,32,32,32,32,32,32,82, - 101,116,117,114,110,32,116,104,101,32,100,97,116,97,32,97, - 115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,39, - 112,97,116,104,110,97,109,101,39,46,32,82,97,105,115,101, - 32,79,83,69,114,114,111,114,32,105,102,10,32,32,32,32, - 32,32,32,32,116,104,101,32,102,105,108,101,32,119,97,115, - 110,39,116,32,102,111,117,110,100,46,10,32,32,32,32,32, - 32,32,32,78,114,0,0,0,0,218,0,41,10,114,18,0, - 0,0,114,19,0,0,0,114,20,0,0,0,218,10,115,116, - 97,114,116,115,119,105,116,104,114,29,0,0,0,218,3,108, - 101,110,114,28,0,0,0,114,26,0,0,0,114,22,0,0, - 0,218,9,95,103,101,116,95,100,97,116,97,41,4,114,32, - 0,0,0,218,8,112,97,116,104,110,97,109,101,90,3,107, - 101,121,218,9,116,111,99,95,101,110,116,114,121,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,8,103,101, - 116,95,100,97,116,97,163,0,0,0,115,20,0,0,0,0, - 6,4,1,12,2,4,1,16,1,22,2,2,1,14,1,12, - 1,18,1,122,20,122,105,112,105,109,112,111,114,116,101,114, + 115,32,102,111,117,110,100,44,32,97,32,115,116,114,105,110, + 103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101, + 10,32,32,32,32,32,32,32,32,102,117,108,108,32,112,97, + 116,104,32,110,97,109,101,32,105,102,32,105,116,39,115,32, + 112,111,115,115,105,98,108,121,32,97,32,112,111,114,116,105, + 111,110,32,111,102,32,97,32,110,97,109,101,115,112,97,99, + 101,32,112,97,99,107,97,103,101,44,10,32,32,32,32,32, + 32,32,32,111,114,32,78,111,110,101,32,111,116,104,101,114, + 119,105,115,101,46,32,84,104,101,32,111,112,116,105,111,110, + 97,108,32,39,112,97,116,104,39,32,97,114,103,117,109,101, + 110,116,32,105,115,32,105,103,110,111,114,101,100,32,45,45, + 32,105,116,39,115,10,32,32,32,32,32,32,32,32,116,104, + 101,114,101,32,102,111,114,32,99,111,109,112,97,116,105,98, + 105,108,105,116,121,32,119,105,116,104,32,116,104,101,32,105, + 109,112,111,114,116,101,114,32,112,114,111,116,111,99,111,108, + 46,10,32,32,32,32,32,32,32,32,78,41,5,218,16,95, + 103,101,116,95,109,111,100,117,108,101,95,105,110,102,111,218, + 16,95,103,101,116,95,109,111,100,117,108,101,95,112,97,116, + 104,218,7,95,105,115,95,100,105,114,114,29,0,0,0,114, + 20,0,0,0,41,5,114,32,0,0,0,218,8,102,117,108, + 108,110,97,109,101,114,13,0,0,0,218,2,109,105,218,7, + 109,111,100,112,97,116,104,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,11,102,105,110,100,95,108,111,97, + 100,101,114,109,0,0,0,115,16,0,0,0,10,10,8,1, + 8,2,10,7,10,1,24,4,8,2,255,128,122,23,122,105, + 112,105,109,112,111,114,116,101,114,46,102,105,110,100,95,108, + 111,97,100,101,114,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,16, + 0,0,0,124,0,160,0,124,1,124,2,161,2,100,1,25, + 0,83,0,41,2,97,139,1,0,0,102,105,110,100,95,109, + 111,100,117,108,101,40,102,117,108,108,110,97,109,101,44,32, + 112,97,116,104,61,78,111,110,101,41,32,45,62,32,115,101, + 108,102,32,111,114,32,78,111,110,101,46,10,10,32,32,32, + 32,32,32,32,32,83,101,97,114,99,104,32,102,111,114,32, + 97,32,109,111,100,117,108,101,32,115,112,101,99,105,102,105, + 101,100,32,98,121,32,39,102,117,108,108,110,97,109,101,39, + 46,32,39,102,117,108,108,110,97,109,101,39,32,109,117,115, + 116,32,98,101,32,116,104,101,10,32,32,32,32,32,32,32, + 32,102,117,108,108,121,32,113,117,97,108,105,102,105,101,100, + 32,40,100,111,116,116,101,100,41,32,109,111,100,117,108,101, + 32,110,97,109,101,46,32,73,116,32,114,101,116,117,114,110, + 115,32,116,104,101,32,122,105,112,105,109,112,111,114,116,101, + 114,10,32,32,32,32,32,32,32,32,105,110,115,116,97,110, + 99,101,32,105,116,115,101,108,102,32,105,102,32,116,104,101, + 32,109,111,100,117,108,101,32,119,97,115,32,102,111,117,110, + 100,44,32,111,114,32,78,111,110,101,32,105,102,32,105,116, + 32,119,97,115,110,39,116,46,10,32,32,32,32,32,32,32, + 32,84,104,101,32,111,112,116,105,111,110,97,108,32,39,112, + 97,116,104,39,32,97,114,103,117,109,101,110,116,32,105,115, + 32,105,103,110,111,114,101,100,32,45,45,32,105,116,39,115, + 32,116,104,101,114,101,32,102,111,114,32,99,111,109,112,97, + 116,105,98,105,108,105,116,121,10,32,32,32,32,32,32,32, + 32,119,105,116,104,32,116,104,101,32,105,109,112,111,114,116, + 101,114,32,112,114,111,116,111,99,111,108,46,10,32,32,32, + 32,32,32,32,32,114,0,0,0,0,41,1,114,41,0,0, + 0,41,3,114,32,0,0,0,114,38,0,0,0,114,13,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,11,102,105,110,100,95,109,111,100,117,108,101,141,0, + 0,0,115,4,0,0,0,16,9,255,128,122,23,122,105,112, + 105,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,0,0,0, + 0,5,0,0,0,3,0,0,0,67,0,0,0,115,20,0, + 0,0,116,0,124,0,124,1,131,2,92,3,125,2,125,3, + 125,4,124,2,83,0,41,1,122,163,103,101,116,95,99,111, + 100,101,40,102,117,108,108,110,97,109,101,41,32,45,62,32, + 99,111,100,101,32,111,98,106,101,99,116,46,10,10,32,32, + 32,32,32,32,32,32,82,101,116,117,114,110,32,116,104,101, + 32,99,111,100,101,32,111,98,106,101,99,116,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,46,32,82,97,105,115,101,32,90,105,112, + 73,109,112,111,114,116,69,114,114,111,114,10,32,32,32,32, + 32,32,32,32,105,102,32,116,104,101,32,109,111,100,117,108, + 101,32,99,111,117,108,100,110,39,116,32,98,101,32,102,111, + 117,110,100,46,10,32,32,32,32,32,32,32,32,169,1,218, + 16,95,103,101,116,95,109,111,100,117,108,101,95,99,111,100, + 101,169,5,114,32,0,0,0,114,38,0,0,0,218,4,99, + 111,100,101,218,9,105,115,112,97,99,107,97,103,101,114,40, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,8,103,101,116,95,99,111,100,101,153,0,0,0, + 115,6,0,0,0,16,6,4,1,255,128,122,20,122,105,112, + 105,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,0,0,0,0,4,0, + 0,0,8,0,0,0,67,0,0,0,115,116,0,0,0,116, + 0,114,16,124,1,160,1,116,0,116,2,161,2,125,1,124, + 1,125,2,124,1,160,3,124,0,106,4,116,2,23,0,161, + 1,114,58,124,1,116,5,124,0,106,4,116,2,23,0,131, + 1,100,1,133,2,25,0,125,2,122,14,124,0,106,6,124, + 2,25,0,125,3,87,0,110,30,4,0,116,7,121,102,1, + 0,1,0,1,0,116,8,100,2,100,3,124,2,131,3,130, + 1,89,0,110,2,48,0,116,9,124,0,106,4,124,3,131, + 2,83,0,41,4,122,154,103,101,116,95,100,97,116,97,40, + 112,97,116,104,110,97,109,101,41,32,45,62,32,115,116,114, + 105,110,103,32,119,105,116,104,32,102,105,108,101,32,100,97, + 116,97,46,10,10,32,32,32,32,32,32,32,32,82,101,116, + 117,114,110,32,116,104,101,32,100,97,116,97,32,97,115,115, + 111,99,105,97,116,101,100,32,119,105,116,104,32,39,112,97, + 116,104,110,97,109,101,39,46,32,82,97,105,115,101,32,79, + 83,69,114,114,111,114,32,105,102,10,32,32,32,32,32,32, + 32,32,116,104,101,32,102,105,108,101,32,119,97,115,110,39, + 116,32,102,111,117,110,100,46,10,32,32,32,32,32,32,32, + 32,78,114,0,0,0,0,218,0,41,10,114,18,0,0,0, + 114,19,0,0,0,114,20,0,0,0,218,10,115,116,97,114, + 116,115,119,105,116,104,114,29,0,0,0,218,3,108,101,110, + 114,28,0,0,0,114,26,0,0,0,114,22,0,0,0,218, + 9,95,103,101,116,95,100,97,116,97,41,4,114,32,0,0, + 0,218,8,112,97,116,104,110,97,109,101,90,3,107,101,121, + 218,9,116,111,99,95,101,110,116,114,121,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,8,103,101,116,95, + 100,97,116,97,163,0,0,0,115,22,0,0,0,4,6,12, + 1,4,2,16,1,22,1,2,2,14,1,12,1,18,1,12, + 1,255,128,122,20,122,105,112,105,109,112,111,114,116,101,114, 46,103,101,116,95,100,97,116,97,99,2,0,0,0,0,0, 0,0,0,0,0,0,5,0,0,0,3,0,0,0,67,0, 0,0,115,20,0,0,0,116,0,124,0,124,1,131,2,92, @@ -311,179 +312,180 @@ const unsigned char _Py_M__zipimport[] = { 10,32,32,32,32,32,32,32,32,114,43,0,0,0,114,45, 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, 0,0,218,12,103,101,116,95,102,105,108,101,110,97,109,101, - 184,0,0,0,115,4,0,0,0,0,7,16,1,122,24,122, - 105,112,105,109,112,111,114,116,101,114,46,103,101,116,95,102, - 105,108,101,110,97,109,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,6,0,0,0,8,0,0,0,67,0,0,0, - 115,126,0,0,0,116,0,124,0,124,1,131,2,125,2,124, + 184,0,0,0,115,6,0,0,0,16,7,4,1,255,128,122, + 24,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, + 95,102,105,108,101,110,97,109,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,8,0,0,0,67,0, + 0,0,115,126,0,0,0,116,0,124,0,124,1,131,2,125, + 2,124,2,100,1,117,0,114,36,116,1,100,2,124,1,155, + 2,157,2,124,1,100,3,141,2,130,1,116,2,124,0,124, + 1,131,2,125,3,124,2,114,64,116,3,160,4,124,3,100, + 4,161,2,125,4,110,10,124,3,155,0,100,5,157,2,125, + 4,122,14,124,0,106,5,124,4,25,0,125,5,87,0,110, + 20,4,0,116,6,121,108,1,0,1,0,1,0,89,0,100, + 1,83,0,48,0,116,7,124,0,106,8,124,5,131,2,160, + 9,161,0,83,0,41,6,122,253,103,101,116,95,115,111,117, + 114,99,101,40,102,117,108,108,110,97,109,101,41,32,45,62, + 32,115,111,117,114,99,101,32,115,116,114,105,110,103,46,10, + 10,32,32,32,32,32,32,32,32,82,101,116,117,114,110,32, + 116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32, + 90,105,112,73,109,112,111,114,116,69,114,114,111,114,10,32, + 32,32,32,32,32,32,32,105,102,32,116,104,101,32,109,111, + 100,117,108,101,32,99,111,117,108,100,110,39,116,32,98,101, + 32,102,111,117,110,100,44,32,114,101,116,117,114,110,32,78, + 111,110,101,32,105,102,32,116,104,101,32,97,114,99,104,105, + 118,101,32,100,111,101,115,10,32,32,32,32,32,32,32,32, + 99,111,110,116,97,105,110,32,116,104,101,32,109,111,100,117, + 108,101,44,32,98,117,116,32,104,97,115,32,110,111,32,115, + 111,117,114,99,101,32,102,111,114,32,105,116,46,10,32,32, + 32,32,32,32,32,32,78,250,18,99,97,110,39,116,32,102, + 105,110,100,32,109,111,100,117,108,101,32,169,1,218,4,110, + 97,109,101,250,11,95,95,105,110,105,116,95,95,46,112,121, + 250,3,46,112,121,41,10,114,35,0,0,0,114,3,0,0, + 0,114,36,0,0,0,114,21,0,0,0,114,30,0,0,0, + 114,28,0,0,0,114,26,0,0,0,114,52,0,0,0,114, + 29,0,0,0,218,6,100,101,99,111,100,101,41,6,114,32, + 0,0,0,114,38,0,0,0,114,39,0,0,0,114,13,0, + 0,0,218,8,102,117,108,108,112,97,116,104,114,54,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,10,103,101,116,95,115,111,117,114,99,101,195,0,0,0, + 115,26,0,0,0,10,7,8,1,18,1,10,2,4,1,14, + 1,10,2,2,2,14,1,12,1,8,2,16,1,255,128,122, + 22,122,105,112,105,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, + 0,0,0,0,3,0,0,0,4,0,0,0,67,0,0,0, + 115,40,0,0,0,116,0,124,0,124,1,131,2,125,2,124, 2,100,1,117,0,114,36,116,1,100,2,124,1,155,2,157, - 2,124,1,100,3,141,2,130,1,116,2,124,0,124,1,131, - 2,125,3,124,2,114,64,116,3,160,4,124,3,100,4,161, - 2,125,4,110,10,124,3,155,0,100,5,157,2,125,4,122, - 14,124,0,106,5,124,4,25,0,125,5,87,0,110,20,4, - 0,116,6,121,108,1,0,1,0,1,0,89,0,100,1,83, - 0,48,0,116,7,124,0,106,8,124,5,131,2,160,9,161, - 0,83,0,41,6,122,253,103,101,116,95,115,111,117,114,99, - 101,40,102,117,108,108,110,97,109,101,41,32,45,62,32,115, - 111,117,114,99,101,32,115,116,114,105,110,103,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,32,116,104, - 101,32,115,111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32,90,105, - 112,73,109,112,111,114,116,69,114,114,111,114,10,32,32,32, - 32,32,32,32,32,105,102,32,116,104,101,32,109,111,100,117, - 108,101,32,99,111,117,108,100,110,39,116,32,98,101,32,102, - 111,117,110,100,44,32,114,101,116,117,114,110,32,78,111,110, - 101,32,105,102,32,116,104,101,32,97,114,99,104,105,118,101, - 32,100,111,101,115,10,32,32,32,32,32,32,32,32,99,111, - 110,116,97,105,110,32,116,104,101,32,109,111,100,117,108,101, - 44,32,98,117,116,32,104,97,115,32,110,111,32,115,111,117, - 114,99,101,32,102,111,114,32,105,116,46,10,32,32,32,32, - 32,32,32,32,78,250,18,99,97,110,39,116,32,102,105,110, - 100,32,109,111,100,117,108,101,32,169,1,218,4,110,97,109, - 101,250,11,95,95,105,110,105,116,95,95,46,112,121,250,3, - 46,112,121,41,10,114,35,0,0,0,114,3,0,0,0,114, - 36,0,0,0,114,21,0,0,0,114,30,0,0,0,114,28, - 0,0,0,114,26,0,0,0,114,52,0,0,0,114,29,0, - 0,0,218,6,100,101,99,111,100,101,41,6,114,32,0,0, - 0,114,38,0,0,0,114,39,0,0,0,114,13,0,0,0, - 218,8,102,117,108,108,112,97,116,104,114,54,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,10, - 103,101,116,95,115,111,117,114,99,101,195,0,0,0,115,24, - 0,0,0,0,7,10,1,8,1,18,2,10,1,4,1,14, - 2,10,2,2,1,14,1,12,2,8,1,122,22,122,105,112, - 105,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,0,0,0,0, - 3,0,0,0,4,0,0,0,67,0,0,0,115,40,0,0, - 0,116,0,124,0,124,1,131,2,125,2,124,2,100,1,117, - 0,114,36,116,1,100,2,124,1,155,2,157,2,124,1,100, - 3,141,2,130,1,124,2,83,0,41,4,122,171,105,115,95, - 112,97,99,107,97,103,101,40,102,117,108,108,110,97,109,101, - 41,32,45,62,32,98,111,111,108,46,10,10,32,32,32,32, - 32,32,32,32,82,101,116,117,114,110,32,84,114,117,101,32, - 105,102,32,116,104,101,32,109,111,100,117,108,101,32,115,112, - 101,99,105,102,105,101,100,32,98,121,32,102,117,108,108,110, - 97,109,101,32,105,115,32,97,32,112,97,99,107,97,103,101, - 46,10,32,32,32,32,32,32,32,32,82,97,105,115,101,32, - 90,105,112,73,109,112,111,114,116,69,114,114,111,114,32,105, - 102,32,116,104,101,32,109,111,100,117,108,101,32,99,111,117, - 108,100,110,39,116,32,98,101,32,102,111,117,110,100,46,10, - 32,32,32,32,32,32,32,32,78,114,57,0,0,0,114,58, - 0,0,0,41,2,114,35,0,0,0,114,3,0,0,0,41, - 3,114,32,0,0,0,114,38,0,0,0,114,39,0,0,0, + 2,124,1,100,3,141,2,130,1,124,2,83,0,41,4,122, + 171,105,115,95,112,97,99,107,97,103,101,40,102,117,108,108, + 110,97,109,101,41,32,45,62,32,98,111,111,108,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,84, + 114,117,101,32,105,102,32,116,104,101,32,109,111,100,117,108, + 101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,102, + 117,108,108,110,97,109,101,32,105,115,32,97,32,112,97,99, + 107,97,103,101,46,10,32,32,32,32,32,32,32,32,82,97, + 105,115,101,32,90,105,112,73,109,112,111,114,116,69,114,114, + 111,114,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,99,111,117,108,100,110,39,116,32,98,101,32,102,111,117, + 110,100,46,10,32,32,32,32,32,32,32,32,78,114,57,0, + 0,0,114,58,0,0,0,41,2,114,35,0,0,0,114,3, + 0,0,0,41,3,114,32,0,0,0,114,38,0,0,0,114, + 39,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,10,105,115,95,112,97,99,107,97,103,101,221, + 0,0,0,115,10,0,0,0,10,6,8,1,18,1,4,1, + 255,128,122,22,122,105,112,105,109,112,111,114,116,101,114,46, + 105,115,95,112,97,99,107,97,103,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,67, + 0,0,0,115,246,0,0,0,116,0,124,0,124,1,131,2, + 92,3,125,2,125,3,125,4,116,1,106,2,160,3,124,1, + 161,1,125,5,124,5,100,1,117,0,115,46,116,4,124,5, + 116,5,131,2,115,64,116,5,124,1,131,1,125,5,124,5, + 116,1,106,2,124,1,60,0,124,0,124,5,95,6,122,84, + 124,3,114,108,116,7,124,0,124,1,131,2,125,6,116,8, + 160,9,124,0,106,10,124,6,161,2,125,7,124,7,103,1, + 124,5,95,11,116,12,124,5,100,2,131,2,115,124,116,13, + 124,5,95,13,116,8,160,14,124,5,106,15,124,1,124,4, + 161,3,1,0,116,16,124,2,124,5,106,15,131,2,1,0, + 87,0,110,22,1,0,1,0,1,0,116,1,106,2,124,1, + 61,0,130,0,89,0,110,2,48,0,122,14,116,1,106,2, + 124,1,25,0,125,5,87,0,110,34,4,0,116,17,121,226, + 1,0,1,0,1,0,116,18,100,3,124,1,155,2,100,4, + 157,3,131,1,130,1,89,0,110,2,48,0,116,19,160,20, + 100,5,124,1,124,4,161,3,1,0,124,5,83,0,41,6, + 122,245,108,111,97,100,95,109,111,100,117,108,101,40,102,117, + 108,108,110,97,109,101,41,32,45,62,32,109,111,100,117,108, + 101,46,10,10,32,32,32,32,32,32,32,32,76,111,97,100, + 32,116,104,101,32,109,111,100,117,108,101,32,115,112,101,99, + 105,102,105,101,100,32,98,121,32,39,102,117,108,108,110,97, + 109,101,39,46,32,39,102,117,108,108,110,97,109,101,39,32, + 109,117,115,116,32,98,101,32,116,104,101,10,32,32,32,32, + 32,32,32,32,102,117,108,108,121,32,113,117,97,108,105,102, + 105,101,100,32,40,100,111,116,116,101,100,41,32,109,111,100, + 117,108,101,32,110,97,109,101,46,32,73,116,32,114,101,116, + 117,114,110,115,32,116,104,101,32,105,109,112,111,114,116,101, + 100,10,32,32,32,32,32,32,32,32,109,111,100,117,108,101, + 44,32,111,114,32,114,97,105,115,101,115,32,90,105,112,73, + 109,112,111,114,116,69,114,114,111,114,32,105,102,32,105,116, + 32,119,97,115,110,39,116,32,102,111,117,110,100,46,10,32, + 32,32,32,32,32,32,32,78,218,12,95,95,98,117,105,108, + 116,105,110,115,95,95,122,14,76,111,97,100,101,100,32,109, + 111,100,117,108,101,32,122,25,32,110,111,116,32,102,111,117, + 110,100,32,105,110,32,115,121,115,46,109,111,100,117,108,101, + 115,122,30,105,109,112,111,114,116,32,123,125,32,35,32,108, + 111,97,100,101,100,32,102,114,111,109,32,90,105,112,32,123, + 125,41,21,114,44,0,0,0,218,3,115,121,115,218,7,109, + 111,100,117,108,101,115,218,3,103,101,116,114,15,0,0,0, + 218,12,95,109,111,100,117,108,101,95,116,121,112,101,218,10, + 95,95,108,111,97,100,101,114,95,95,114,36,0,0,0,114, + 21,0,0,0,114,30,0,0,0,114,29,0,0,0,90,8, + 95,95,112,97,116,104,95,95,218,7,104,97,115,97,116,116, + 114,114,66,0,0,0,90,14,95,102,105,120,95,117,112,95, + 109,111,100,117,108,101,218,8,95,95,100,105,99,116,95,95, + 218,4,101,120,101,99,114,26,0,0,0,218,11,73,109,112, + 111,114,116,69,114,114,111,114,218,10,95,98,111,111,116,115, + 116,114,97,112,218,16,95,118,101,114,98,111,115,101,95,109, + 101,115,115,97,103,101,41,8,114,32,0,0,0,114,38,0, + 0,0,114,46,0,0,0,114,47,0,0,0,114,40,0,0, + 0,90,3,109,111,100,114,13,0,0,0,114,63,0,0,0, 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 10,105,115,95,112,97,99,107,97,103,101,221,0,0,0,115, - 8,0,0,0,0,6,10,1,8,1,18,1,122,22,122,105, - 112,105,109,112,111,114,116,101,114,46,105,115,95,112,97,99, - 107,97,103,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,8,0,0,0,8,0,0,0,67,0,0,0,115,246,0, - 0,0,116,0,124,0,124,1,131,2,92,3,125,2,125,3, - 125,4,116,1,106,2,160,3,124,1,161,1,125,5,124,5, - 100,1,117,0,115,46,116,4,124,5,116,5,131,2,115,64, - 116,5,124,1,131,1,125,5,124,5,116,1,106,2,124,1, - 60,0,124,0,124,5,95,6,122,84,124,3,114,108,116,7, - 124,0,124,1,131,2,125,6,116,8,160,9,124,0,106,10, - 124,6,161,2,125,7,124,7,103,1,124,5,95,11,116,12, - 124,5,100,2,131,2,115,124,116,13,124,5,95,13,116,8, - 160,14,124,5,106,15,124,1,124,4,161,3,1,0,116,16, - 124,2,124,5,106,15,131,2,1,0,87,0,110,22,1,0, - 1,0,1,0,116,1,106,2,124,1,61,0,130,0,89,0, - 110,2,48,0,122,14,116,1,106,2,124,1,25,0,125,5, - 87,0,110,34,4,0,116,17,121,226,1,0,1,0,1,0, - 116,18,100,3,124,1,155,2,100,4,157,3,131,1,130,1, - 89,0,110,2,48,0,116,19,160,20,100,5,124,1,124,4, - 161,3,1,0,124,5,83,0,41,6,122,245,108,111,97,100, - 95,109,111,100,117,108,101,40,102,117,108,108,110,97,109,101, - 41,32,45,62,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,32,32,32,32,76,111,97,100,32,116,104,101,32,109, - 111,100,117,108,101,32,115,112,101,99,105,102,105,101,100,32, - 98,121,32,39,102,117,108,108,110,97,109,101,39,46,32,39, - 102,117,108,108,110,97,109,101,39,32,109,117,115,116,32,98, - 101,32,116,104,101,10,32,32,32,32,32,32,32,32,102,117, - 108,108,121,32,113,117,97,108,105,102,105,101,100,32,40,100, - 111,116,116,101,100,41,32,109,111,100,117,108,101,32,110,97, - 109,101,46,32,73,116,32,114,101,116,117,114,110,115,32,116, - 104,101,32,105,109,112,111,114,116,101,100,10,32,32,32,32, - 32,32,32,32,109,111,100,117,108,101,44,32,111,114,32,114, - 97,105,115,101,115,32,90,105,112,73,109,112,111,114,116,69, - 114,114,111,114,32,105,102,32,105,116,32,119,97,115,110,39, - 116,32,102,111,117,110,100,46,10,32,32,32,32,32,32,32, - 32,78,218,12,95,95,98,117,105,108,116,105,110,115,95,95, - 122,14,76,111,97,100,101,100,32,109,111,100,117,108,101,32, - 122,25,32,110,111,116,32,102,111,117,110,100,32,105,110,32, - 115,121,115,46,109,111,100,117,108,101,115,122,30,105,109,112, - 111,114,116,32,123,125,32,35,32,108,111,97,100,101,100,32, - 102,114,111,109,32,90,105,112,32,123,125,41,21,114,44,0, - 0,0,218,3,115,121,115,218,7,109,111,100,117,108,101,115, - 218,3,103,101,116,114,15,0,0,0,218,12,95,109,111,100, - 117,108,101,95,116,121,112,101,218,10,95,95,108,111,97,100, - 101,114,95,95,114,36,0,0,0,114,21,0,0,0,114,30, - 0,0,0,114,29,0,0,0,90,8,95,95,112,97,116,104, - 95,95,218,7,104,97,115,97,116,116,114,114,66,0,0,0, - 90,14,95,102,105,120,95,117,112,95,109,111,100,117,108,101, - 218,8,95,95,100,105,99,116,95,95,218,4,101,120,101,99, - 114,26,0,0,0,218,11,73,109,112,111,114,116,69,114,114, - 111,114,218,10,95,98,111,111,116,115,116,114,97,112,218,16, - 95,118,101,114,98,111,115,101,95,109,101,115,115,97,103,101, - 41,8,114,32,0,0,0,114,38,0,0,0,114,46,0,0, - 0,114,47,0,0,0,114,40,0,0,0,90,3,109,111,100, - 114,13,0,0,0,114,63,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,11,108,111,97,100,95, - 109,111,100,117,108,101,234,0,0,0,115,48,0,0,0,0, - 7,16,1,12,1,18,1,8,1,10,1,6,2,2,1,4, - 3,10,1,14,1,8,2,10,1,6,1,16,1,16,1,6, - 1,8,1,8,2,2,1,14,1,12,1,22,1,14,1,122, - 23,122,105,112,105,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, - 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, - 0,115,64,0,0,0,122,20,124,0,160,0,124,1,161,1, - 115,18,87,0,100,1,83,0,87,0,110,20,4,0,116,1, - 121,40,1,0,1,0,1,0,89,0,100,1,83,0,48,0, - 100,2,100,3,108,2,109,3,125,2,1,0,124,2,124,0, - 124,1,131,2,83,0,41,4,122,204,82,101,116,117,114,110, - 32,116,104,101,32,82,101,115,111,117,114,99,101,82,101,97, - 100,101,114,32,102,111,114,32,97,32,112,97,99,107,97,103, - 101,32,105,110,32,97,32,122,105,112,32,102,105,108,101,46, - 10,10,32,32,32,32,32,32,32,32,73,102,32,39,102,117, - 108,108,110,97,109,101,39,32,105,115,32,97,32,112,97,99, - 107,97,103,101,32,119,105,116,104,105,110,32,116,104,101,32, - 122,105,112,32,102,105,108,101,44,32,114,101,116,117,114,110, - 32,116,104,101,10,32,32,32,32,32,32,32,32,39,82,101, - 115,111,117,114,99,101,82,101,97,100,101,114,39,32,111,98, - 106,101,99,116,32,102,111,114,32,116,104,101,32,112,97,99, - 107,97,103,101,46,32,32,79,116,104,101,114,119,105,115,101, - 32,114,101,116,117,114,110,32,78,111,110,101,46,10,32,32, - 32,32,32,32,32,32,78,114,0,0,0,0,41,1,218,9, - 90,105,112,82,101,97,100,101,114,41,4,114,65,0,0,0, - 114,3,0,0,0,90,17,105,109,112,111,114,116,108,105,98, - 46,114,101,97,100,101,114,115,114,79,0,0,0,41,3,114, - 32,0,0,0,114,38,0,0,0,114,79,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,19,103, - 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, - 101,114,16,1,0,0,115,14,0,0,0,0,6,2,1,10, - 1,10,1,12,1,8,1,12,1,122,31,122,105,112,105,109, - 112,111,114,116,101,114,46,103,101,116,95,114,101,115,111,117, - 114,99,101,95,114,101,97,100,101,114,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,67, - 0,0,0,115,24,0,0,0,100,1,124,0,106,0,155,0, - 116,1,155,0,124,0,106,2,155,0,100,2,157,5,83,0, - 41,3,78,122,21,60,122,105,112,105,109,112,111,114,116,101, - 114,32,111,98,106,101,99,116,32,34,122,2,34,62,41,3, - 114,29,0,0,0,114,20,0,0,0,114,31,0,0,0,41, - 1,114,32,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,8,95,95,114,101,112,114,95,95,31, - 1,0,0,115,2,0,0,0,0,1,122,20,122,105,112,105, - 109,112,111,114,116,101,114,46,95,95,114,101,112,114,95,95, - 41,1,78,41,1,78,41,15,114,6,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,7,95,95,100,111,99,95,95, - 114,34,0,0,0,114,41,0,0,0,114,42,0,0,0,114, - 48,0,0,0,114,55,0,0,0,114,56,0,0,0,114,64, - 0,0,0,114,65,0,0,0,114,78,0,0,0,114,80,0, - 0,0,114,81,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,114,4,0,0,0, - 45,0,0,0,115,24,0,0,0,8,1,4,17,8,46,10, - 32,10,12,8,10,8,21,8,11,8,26,8,13,8,38,8, - 15,122,12,95,95,105,110,105,116,95,95,46,112,121,99,84, + 11,108,111,97,100,95,109,111,100,117,108,101,234,0,0,0, + 115,50,0,0,0,16,7,12,1,18,1,8,1,10,1,6, + 1,2,2,4,1,10,3,14,1,8,1,10,2,6,1,16, + 1,16,1,6,1,8,1,8,1,2,2,14,1,12,1,22, + 1,14,1,4,1,255,128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0, + 0,8,0,0,0,67,0,0,0,115,64,0,0,0,122,20, + 124,0,160,0,124,1,161,1,115,18,87,0,100,1,83,0, + 87,0,110,20,4,0,116,1,121,40,1,0,1,0,1,0, + 89,0,100,1,83,0,48,0,100,2,100,3,108,2,109,3, + 125,2,1,0,124,2,124,0,124,1,131,2,83,0,41,4, + 122,204,82,101,116,117,114,110,32,116,104,101,32,82,101,115, + 111,117,114,99,101,82,101,97,100,101,114,32,102,111,114,32, + 97,32,112,97,99,107,97,103,101,32,105,110,32,97,32,122, + 105,112,32,102,105,108,101,46,10,10,32,32,32,32,32,32, + 32,32,73,102,32,39,102,117,108,108,110,97,109,101,39,32, + 105,115,32,97,32,112,97,99,107,97,103,101,32,119,105,116, + 104,105,110,32,116,104,101,32,122,105,112,32,102,105,108,101, + 44,32,114,101,116,117,114,110,32,116,104,101,10,32,32,32, + 32,32,32,32,32,39,82,101,115,111,117,114,99,101,82,101, + 97,100,101,114,39,32,111,98,106,101,99,116,32,102,111,114, + 32,116,104,101,32,112,97,99,107,97,103,101,46,32,32,79, + 116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,32, + 78,111,110,101,46,10,32,32,32,32,32,32,32,32,78,114, + 0,0,0,0,41,1,218,9,90,105,112,82,101,97,100,101, + 114,41,4,114,65,0,0,0,114,3,0,0,0,90,17,105, + 109,112,111,114,116,108,105,98,46,114,101,97,100,101,114,115, + 114,79,0,0,0,41,3,114,32,0,0,0,114,38,0,0, + 0,114,79,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,19,103,101,116,95,114,101,115,111,117, + 114,99,101,95,114,101,97,100,101,114,16,1,0,0,115,16, + 0,0,0,2,6,10,1,10,1,12,1,8,1,12,1,10, + 1,255,128,122,31,122,105,112,105,109,112,111,114,116,101,114, + 46,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, + 97,100,101,114,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,5,0,0,0,67,0,0,0,115,24,0, + 0,0,100,1,124,0,106,0,155,0,116,1,155,0,124,0, + 106,2,155,0,100,2,157,5,83,0,41,3,78,122,21,60, + 122,105,112,105,109,112,111,114,116,101,114,32,111,98,106,101, + 99,116,32,34,122,2,34,62,41,3,114,29,0,0,0,114, + 20,0,0,0,114,31,0,0,0,41,1,114,32,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 8,95,95,114,101,112,114,95,95,31,1,0,0,115,4,0, + 0,0,24,1,255,128,122,20,122,105,112,105,109,112,111,114, + 116,101,114,46,95,95,114,101,112,114,95,95,41,1,78,41, + 1,78,41,15,114,6,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,7,95,95,100,111,99,95,95,114,34,0,0, + 0,114,41,0,0,0,114,42,0,0,0,114,48,0,0,0, + 114,55,0,0,0,114,56,0,0,0,114,64,0,0,0,114, + 65,0,0,0,114,78,0,0,0,114,80,0,0,0,114,81, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,114,4,0,0,0,45,0,0,0, + 115,28,0,0,0,8,0,4,1,8,17,10,46,10,32,8, + 12,8,10,8,21,8,11,8,26,8,13,8,38,12,15,255, + 128,122,12,95,95,105,110,105,116,95,95,46,112,121,99,84, 114,60,0,0,0,70,41,3,122,4,46,112,121,99,84,70, 41,3,114,61,0,0,0,70,70,99,2,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0, @@ -492,350 +494,351 @@ const unsigned char _Py_M__zipimport[] = { 46,233,2,0,0,0,41,2,114,31,0,0,0,218,10,114, 112,97,114,116,105,116,105,111,110,41,2,114,32,0,0,0, 114,38,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,36,0,0,0,49,1,0,0,115,2,0, - 0,0,0,1,114,36,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,2,0,0,0,67,0, - 0,0,115,18,0,0,0,124,1,116,0,23,0,125,2,124, - 2,124,0,106,1,118,0,83,0,169,1,78,41,2,114,20, - 0,0,0,114,28,0,0,0,41,3,114,32,0,0,0,114, - 13,0,0,0,90,7,100,105,114,112,97,116,104,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,114,37,0,0, - 0,53,1,0,0,115,4,0,0,0,0,4,8,2,114,37, - 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 7,0,0,0,4,0,0,0,67,0,0,0,115,54,0,0, - 0,116,0,124,0,124,1,131,2,125,2,116,1,68,0,93, - 34,92,3,125,3,125,4,125,5,124,2,124,3,23,0,125, - 6,124,6,124,0,106,2,118,0,114,14,124,5,2,0,1, - 0,83,0,100,0,83,0,114,86,0,0,0,41,3,114,36, - 0,0,0,218,16,95,122,105,112,95,115,101,97,114,99,104, - 111,114,100,101,114,114,28,0,0,0,41,7,114,32,0,0, - 0,114,38,0,0,0,114,13,0,0,0,218,6,115,117,102, - 102,105,120,218,10,105,115,98,121,116,101,99,111,100,101,114, - 47,0,0,0,114,63,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,35,0,0,0,62,1,0, - 0,115,12,0,0,0,0,1,10,1,14,1,8,1,10,1, - 8,1,114,35,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,26,0,0,0,9,0,0,0,67,0,0,0, - 115,2,5,0,0,122,14,116,0,160,1,124,0,161,1,125, - 1,87,0,110,36,4,0,116,2,121,50,1,0,1,0,1, - 0,116,3,100,1,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,89,0,110,2,48,0,124,1,144,4,143,164,1, - 0,122,36,124,1,160,4,116,5,11,0,100,3,161,2,1, - 0,124,1,160,6,161,0,125,2,124,1,160,7,116,5,161, - 1,125,3,87,0,110,36,4,0,116,2,121,132,1,0,1, - 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,89,0,110,2,48,0,116,8,124,3,131, - 1,116,5,107,3,114,164,116,3,100,4,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,124,3,100,0,100,5,133, - 2,25,0,116,9,107,3,144,1,114,170,122,24,124,1,160, - 4,100,6,100,3,161,2,1,0,124,1,160,6,161,0,125, - 4,87,0,110,36,4,0,116,2,121,242,1,0,1,0,1, - 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,89,0,110,2,48,0,116,10,124,4,116,11,24, - 0,116,5,24,0,100,6,131,2,125,5,122,22,124,1,160, - 4,124,5,161,1,1,0,124,1,160,7,161,0,125,6,87, - 0,110,38,4,0,116,2,144,1,121,66,1,0,1,0,1, - 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,89,0,110,2,48,0,124,6,160,12,116,9,161, - 1,125,7,124,7,100,6,107,0,144,1,114,106,116,3,100, - 7,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124, - 6,124,7,124,7,116,5,23,0,133,2,25,0,125,3,116, - 8,124,3,131,1,116,5,107,3,144,1,114,154,116,3,100, - 8,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124, - 4,116,8,124,6,131,1,24,0,124,7,23,0,125,2,116, - 13,124,3,100,9,100,10,133,2,25,0,131,1,125,8,116, - 13,124,3,100,10,100,11,133,2,25,0,131,1,125,9,124, - 2,124,8,107,0,144,1,114,230,116,3,100,12,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,124,2,124,9,107, - 0,144,2,114,2,116,3,100,13,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,124,2,124,8,56,0,125,2,124, - 2,124,9,24,0,125,10,124,10,100,6,107,0,144,2,114, - 46,116,3,100,14,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,105,0,125,11,100,6,125,12,122,14,124,1,160, - 4,124,2,161,1,1,0,87,0,110,38,4,0,116,2,144, - 2,121,106,1,0,1,0,1,0,116,3,100,4,124,0,155, + 10,0,0,0,114,36,0,0,0,49,1,0,0,115,4,0, + 0,0,20,1,255,128,114,36,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0, + 67,0,0,0,115,18,0,0,0,124,1,116,0,23,0,125, + 2,124,2,124,0,106,1,118,0,83,0,169,1,78,41,2, + 114,20,0,0,0,114,28,0,0,0,41,3,114,32,0,0, + 0,114,13,0,0,0,90,7,100,105,114,112,97,116,104,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,37, + 0,0,0,53,1,0,0,115,6,0,0,0,8,4,10,2, + 255,128,114,37,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,7,0,0,0,4,0,0,0,67,0,0,0, + 115,54,0,0,0,116,0,124,0,124,1,131,2,125,2,116, + 1,68,0,93,34,92,3,125,3,125,4,125,5,124,2,124, + 3,23,0,125,6,124,6,124,0,106,2,118,0,114,14,124, + 5,2,0,1,0,83,0,100,0,83,0,114,86,0,0,0, + 41,3,114,36,0,0,0,218,16,95,122,105,112,95,115,101, + 97,114,99,104,111,114,100,101,114,114,28,0,0,0,41,7, + 114,32,0,0,0,114,38,0,0,0,114,13,0,0,0,218, + 6,115,117,102,102,105,120,218,10,105,115,98,121,116,101,99, + 111,100,101,114,47,0,0,0,114,63,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,35,0,0, + 0,62,1,0,0,115,14,0,0,0,10,1,14,1,8,1, + 10,1,8,1,4,1,255,128,114,35,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,26,0,0,0,9,0, + 0,0,67,0,0,0,115,2,5,0,0,122,14,116,0,160, + 1,124,0,161,1,125,1,87,0,110,36,4,0,116,2,121, + 50,1,0,1,0,1,0,116,3,100,1,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,89,0,110,2,48,0,124, + 1,144,4,143,164,1,0,122,36,124,1,160,4,116,5,11, + 0,100,3,161,2,1,0,124,1,160,6,161,0,125,2,124, + 1,160,7,116,5,161,1,125,3,87,0,110,36,4,0,116, + 2,121,132,1,0,1,0,1,0,116,3,100,4,124,0,155, 2,157,2,124,0,100,2,141,2,130,1,89,0,110,2,48, - 0,124,1,160,7,100,15,161,1,125,3,116,8,124,3,131, - 1,100,5,107,0,144,2,114,140,116,14,100,16,131,1,130, - 1,124,3,100,0,100,5,133,2,25,0,100,17,107,3,144, - 2,114,162,144,4,113,208,116,8,124,3,131,1,100,15,107, - 3,144,2,114,184,116,14,100,16,131,1,130,1,116,15,124, - 3,100,18,100,19,133,2,25,0,131,1,125,13,116,15,124, - 3,100,19,100,9,133,2,25,0,131,1,125,14,116,15,124, - 3,100,9,100,20,133,2,25,0,131,1,125,15,116,15,124, - 3,100,20,100,10,133,2,25,0,131,1,125,16,116,13,124, - 3,100,10,100,11,133,2,25,0,131,1,125,17,116,13,124, - 3,100,11,100,21,133,2,25,0,131,1,125,18,116,13,124, - 3,100,21,100,22,133,2,25,0,131,1,125,4,116,15,124, - 3,100,22,100,23,133,2,25,0,131,1,125,19,116,15,124, - 3,100,23,100,24,133,2,25,0,131,1,125,20,116,15,124, - 3,100,24,100,25,133,2,25,0,131,1,125,21,116,13,124, - 3,100,26,100,15,133,2,25,0,131,1,125,22,124,19,124, - 20,23,0,124,21,23,0,125,8,124,22,124,9,107,4,144, - 3,114,144,116,3,100,27,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,124,22,124,10,55,0,125,22,122,14,124, - 1,160,7,124,19,161,1,125,23,87,0,110,38,4,0,116, - 2,144,3,121,204,1,0,1,0,1,0,116,3,100,4,124, + 0,116,8,124,3,131,1,116,5,107,3,114,164,116,3,100, + 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124, + 3,100,0,100,5,133,2,25,0,116,9,107,3,144,1,114, + 170,122,24,124,1,160,4,100,6,100,3,161,2,1,0,124, + 1,160,6,161,0,125,4,87,0,110,36,4,0,116,2,121, + 242,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,89,0,110,2,48,0,116, + 10,124,4,116,11,24,0,116,5,24,0,100,6,131,2,125, + 5,122,22,124,1,160,4,124,5,161,1,1,0,124,1,160, + 7,161,0,125,6,87,0,110,38,4,0,116,2,144,1,121, + 66,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,89,0,110,2,48,0,124, + 6,160,12,116,9,161,1,125,7,124,7,100,6,107,0,144, + 1,114,106,116,3,100,7,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,124,6,124,7,124,7,116,5,23,0,133, + 2,25,0,125,3,116,8,124,3,131,1,116,5,107,3,144, + 1,114,154,116,3,100,8,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,124,4,116,8,124,6,131,1,24,0,124, + 7,23,0,125,2,116,13,124,3,100,9,100,10,133,2,25, + 0,131,1,125,8,116,13,124,3,100,10,100,11,133,2,25, + 0,131,1,125,9,124,2,124,8,107,0,144,1,114,230,116, + 3,100,12,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,124,2,124,9,107,0,144,2,114,2,116,3,100,13,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,124,2,124, + 8,56,0,125,2,124,2,124,9,24,0,125,10,124,10,100, + 6,107,0,144,2,114,46,116,3,100,14,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,105,0,125,11,100,6,125, + 12,122,14,124,1,160,4,124,2,161,1,1,0,87,0,110, + 38,4,0,116,2,144,2,121,106,1,0,1,0,1,0,116, + 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,89,0,110,2,48,0,124,1,160,7,100,15,161,1,125, + 3,116,8,124,3,131,1,100,5,107,0,144,2,114,140,116, + 14,100,16,131,1,130,1,124,3,100,0,100,5,133,2,25, + 0,100,17,107,3,144,2,114,162,144,4,113,208,116,8,124, + 3,131,1,100,15,107,3,144,2,114,184,116,14,100,16,131, + 1,130,1,116,15,124,3,100,18,100,19,133,2,25,0,131, + 1,125,13,116,15,124,3,100,19,100,9,133,2,25,0,131, + 1,125,14,116,15,124,3,100,9,100,20,133,2,25,0,131, + 1,125,15,116,15,124,3,100,20,100,10,133,2,25,0,131, + 1,125,16,116,13,124,3,100,10,100,11,133,2,25,0,131, + 1,125,17,116,13,124,3,100,11,100,21,133,2,25,0,131, + 1,125,18,116,13,124,3,100,21,100,22,133,2,25,0,131, + 1,125,4,116,15,124,3,100,22,100,23,133,2,25,0,131, + 1,125,19,116,15,124,3,100,23,100,24,133,2,25,0,131, + 1,125,20,116,15,124,3,100,24,100,25,133,2,25,0,131, + 1,125,21,116,13,124,3,100,26,100,15,133,2,25,0,131, + 1,125,22,124,19,124,20,23,0,124,21,23,0,125,8,124, + 22,124,9,107,4,144,3,114,144,116,3,100,27,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,124,22,124,10,55, + 0,125,22,122,14,124,1,160,7,124,19,161,1,125,23,87, + 0,110,38,4,0,116,2,144,3,121,204,1,0,1,0,1, + 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, + 2,130,1,89,0,110,2,48,0,116,8,124,23,131,1,124, + 19,107,3,144,3,114,238,116,3,100,4,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,122,50,116,8,124,1,160, + 7,124,8,124,19,24,0,161,1,131,1,124,8,124,19,24, + 0,107,3,144,4,114,30,116,3,100,4,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,87,0,110,38,4,0,116, + 2,144,4,121,70,1,0,1,0,1,0,116,3,100,4,124, 0,155,2,157,2,124,0,100,2,141,2,130,1,89,0,110, - 2,48,0,116,8,124,23,131,1,124,19,107,3,144,3,114, - 238,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,122,50,116,8,124,1,160,7,124,8,124,19,24, - 0,161,1,131,1,124,8,124,19,24,0,107,3,144,4,114, - 30,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,87,0,110,38,4,0,116,2,144,4,121,70,1, - 0,1,0,1,0,116,3,100,4,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,89,0,110,2,48,0,124,13,100, - 28,64,0,144,4,114,92,124,23,160,16,161,0,125,23,110, - 52,122,14,124,23,160,16,100,29,161,1,125,23,87,0,110, - 36,4,0,116,17,144,4,121,142,1,0,1,0,1,0,124, - 23,160,16,100,30,161,1,160,18,116,19,161,1,125,23,89, - 0,110,2,48,0,124,23,160,20,100,31,116,21,161,2,125, - 23,116,22,160,23,124,0,124,23,161,2,125,24,124,24,124, - 14,124,18,124,4,124,22,124,15,124,16,124,17,102,8,125, - 25,124,25,124,11,124,23,60,0,124,12,100,32,55,0,125, - 12,144,2,113,108,87,0,100,0,4,0,4,0,131,3,1, - 0,110,18,49,0,144,4,115,230,48,0,1,0,1,0,1, - 0,89,0,1,0,116,24,160,25,100,33,124,12,124,0,161, - 3,1,0,124,11,83,0,41,34,78,122,21,99,97,110,39, - 116,32,111,112,101,110,32,90,105,112,32,102,105,108,101,58, - 32,114,12,0,0,0,114,84,0,0,0,250,21,99,97,110, - 39,116,32,114,101,97,100,32,90,105,112,32,102,105,108,101, - 58,32,233,4,0,0,0,114,0,0,0,0,122,16,110,111, - 116,32,97,32,90,105,112,32,102,105,108,101,58,32,122,18, - 99,111,114,114,117,112,116,32,90,105,112,32,102,105,108,101, - 58,32,233,12,0,0,0,233,16,0,0,0,233,20,0,0, - 0,122,28,98,97,100,32,99,101,110,116,114,97,108,32,100, - 105,114,101,99,116,111,114,121,32,115,105,122,101,58,32,122, - 30,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, - 101,99,116,111,114,121,32,111,102,102,115,101,116,58,32,122, - 38,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, - 101,99,116,111,114,121,32,115,105,122,101,32,111,114,32,111, - 102,102,115,101,116,58,32,233,46,0,0,0,250,27,69,79, - 70,32,114,101,97,100,32,119,104,101,114,101,32,110,111,116, - 32,101,120,112,101,99,116,101,100,115,4,0,0,0,80,75, - 1,2,233,8,0,0,0,233,10,0,0,0,233,14,0,0, - 0,233,24,0,0,0,233,28,0,0,0,233,30,0,0,0, - 233,32,0,0,0,233,34,0,0,0,233,42,0,0,0,122, - 25,98,97,100,32,108,111,99,97,108,32,104,101,97,100,101, - 114,32,111,102,102,115,101,116,58,32,105,0,8,0,0,218, - 5,97,115,99,105,105,90,6,108,97,116,105,110,49,250,1, - 47,114,5,0,0,0,122,33,122,105,112,105,109,112,111,114, - 116,58,32,102,111,117,110,100,32,123,125,32,110,97,109,101, - 115,32,105,110,32,123,33,114,125,41,26,218,3,95,105,111, - 218,9,111,112,101,110,95,99,111,100,101,114,22,0,0,0, - 114,3,0,0,0,218,4,115,101,101,107,218,20,69,78,68, - 95,67,69,78,84,82,65,76,95,68,73,82,95,83,73,90, - 69,90,4,116,101,108,108,218,4,114,101,97,100,114,51,0, - 0,0,218,18,83,84,82,73,78,71,95,69,78,68,95,65, - 82,67,72,73,86,69,218,3,109,97,120,218,15,77,65,88, - 95,67,79,77,77,69,78,84,95,76,69,78,218,5,114,102, - 105,110,100,114,2,0,0,0,218,8,69,79,70,69,114,114, - 111,114,114,1,0,0,0,114,62,0,0,0,218,18,85,110, - 105,99,111,100,101,68,101,99,111,100,101,69,114,114,111,114, - 218,9,116,114,97,110,115,108,97,116,101,218,11,99,112,52, - 51,55,95,116,97,98,108,101,114,19,0,0,0,114,20,0, - 0,0,114,21,0,0,0,114,30,0,0,0,114,76,0,0, - 0,114,77,0,0,0,41,26,114,29,0,0,0,218,2,102, - 112,90,15,104,101,97,100,101,114,95,112,111,115,105,116,105, - 111,110,218,6,98,117,102,102,101,114,218,9,102,105,108,101, - 95,115,105,122,101,90,17,109,97,120,95,99,111,109,109,101, - 110,116,95,115,116,97,114,116,218,4,100,97,116,97,90,3, - 112,111,115,218,11,104,101,97,100,101,114,95,115,105,122,101, - 90,13,104,101,97,100,101,114,95,111,102,102,115,101,116,90, - 10,97,114,99,95,111,102,102,115,101,116,114,33,0,0,0, - 218,5,99,111,117,110,116,218,5,102,108,97,103,115,218,8, - 99,111,109,112,114,101,115,115,218,4,116,105,109,101,218,4, - 100,97,116,101,218,3,99,114,99,218,9,100,97,116,97,95, - 115,105,122,101,218,9,110,97,109,101,95,115,105,122,101,218, - 10,101,120,116,114,97,95,115,105,122,101,90,12,99,111,109, - 109,101,110,116,95,115,105,122,101,218,11,102,105,108,101,95, - 111,102,102,115,101,116,114,59,0,0,0,114,13,0,0,0, - 218,1,116,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,27,0,0,0,93,1,0,0,115,212,0,0,0, - 0,1,2,1,14,1,12,1,24,2,8,1,2,1,14,1, - 8,1,14,1,12,1,24,1,12,1,18,1,18,3,2,1, - 12,1,12,1,12,1,10,1,2,255,12,2,8,1,2,255, - 2,1,2,255,4,2,2,1,10,1,12,1,14,1,10,1, - 2,255,12,2,10,1,10,1,10,1,2,255,6,2,16,1, - 14,1,10,1,2,255,6,2,16,2,16,1,16,1,10,1, - 18,1,10,1,18,1,8,1,8,1,10,1,18,2,4,2, - 4,1,2,1,14,1,14,1,24,2,10,1,14,1,8,2, - 18,1,4,1,14,1,8,1,16,1,16,1,16,1,16,1, - 16,1,16,1,16,1,16,1,16,1,16,1,16,1,12,1, - 10,1,18,1,8,2,2,1,14,1,14,1,24,1,14,1, - 18,4,2,1,28,1,22,1,14,1,24,2,10,2,10,3, - 2,1,14,1,14,1,22,2,12,1,12,1,20,1,8,1, - 44,1,14,1,114,27,0,0,0,117,190,1,0,0,0,1, - 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, - 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33, - 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49, - 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65, - 66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81, - 82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97, - 98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113, - 114,115,116,117,118,119,120,121,122,123,124,125,126,127,195,135, - 195,188,195,169,195,162,195,164,195,160,195,165,195,167,195,170, - 195,171,195,168,195,175,195,174,195,172,195,132,195,133,195,137, - 195,166,195,134,195,180,195,182,195,178,195,187,195,185,195,191, - 195,150,195,156,194,162,194,163,194,165,226,130,167,198,146,195, - 161,195,173,195,179,195,186,195,177,195,145,194,170,194,186,194, - 191,226,140,144,194,172,194,189,194,188,194,161,194,171,194,187, - 226,150,145,226,150,146,226,150,147,226,148,130,226,148,164,226, - 149,161,226,149,162,226,149,150,226,149,149,226,149,163,226,149, - 145,226,149,151,226,149,157,226,149,156,226,149,155,226,148,144, - 226,148,148,226,148,180,226,148,172,226,148,156,226,148,128,226, - 148,188,226,149,158,226,149,159,226,149,154,226,149,148,226,149, - 169,226,149,166,226,149,160,226,149,144,226,149,172,226,149,167, - 226,149,168,226,149,164,226,149,165,226,149,153,226,149,152,226, - 149,146,226,149,147,226,149,171,226,149,170,226,148,152,226,148, - 140,226,150,136,226,150,132,226,150,140,226,150,144,226,150,128, - 206,177,195,159,206,147,207,128,206,163,207,131,194,181,207,132, - 206,166,206,152,206,169,206,180,226,136,158,207,134,206,181,226, - 136,169,226,137,161,194,177,226,137,165,226,137,164,226,140,160, - 226,140,161,195,183,226,137,136,194,176,226,136,153,194,183,226, - 136,154,226,129,191,194,178,226,150,160,194,160,99,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,67,0,0,0,115,110,0,0,0,116,0,114,22,116,1, - 160,2,100,1,161,1,1,0,116,3,100,2,131,1,130,1, - 100,3,97,0,122,62,122,16,100,4,100,5,108,4,109,5, - 125,0,1,0,87,0,110,36,4,0,116,6,121,80,1,0, - 1,0,1,0,116,1,160,2,100,1,161,1,1,0,116,3, - 100,2,131,1,130,1,89,0,110,2,48,0,87,0,100,6, - 97,0,110,6,100,6,97,0,48,0,116,1,160,2,100,7, - 161,1,1,0,124,0,83,0,41,8,78,122,27,122,105,112, - 105,109,112,111,114,116,58,32,122,108,105,98,32,85,78,65, - 86,65,73,76,65,66,76,69,250,41,99,97,110,39,116,32, - 100,101,99,111,109,112,114,101,115,115,32,100,97,116,97,59, - 32,122,108,105,98,32,110,111,116,32,97,118,97,105,108,97, - 98,108,101,84,114,0,0,0,0,169,1,218,10,100,101,99, - 111,109,112,114,101,115,115,70,122,25,122,105,112,105,109,112, - 111,114,116,58,32,122,108,105,98,32,97,118,97,105,108,97, - 98,108,101,41,7,218,15,95,105,109,112,111,114,116,105,110, - 103,95,122,108,105,98,114,76,0,0,0,114,77,0,0,0, - 114,3,0,0,0,90,4,122,108,105,98,114,139,0,0,0, - 218,9,69,120,99,101,112,116,105,111,110,114,138,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 20,95,103,101,116,95,100,101,99,111,109,112,114,101,115,115, - 95,102,117,110,99,251,1,0,0,115,24,0,0,0,0,2, - 4,3,10,1,8,2,4,1,4,1,16,1,12,1,10,1, - 16,2,12,2,10,1,114,142,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,17,0,0,0,9,0,0,0, - 67,0,0,0,115,144,1,0,0,124,1,92,8,125,2,125, - 3,125,4,125,5,125,6,125,7,125,8,125,9,124,4,100, - 1,107,0,114,36,116,0,100,2,131,1,130,1,116,1,160, - 2,124,0,161,1,144,1,143,14,125,10,122,14,124,10,160, - 3,124,6,161,1,1,0,87,0,110,36,4,0,116,4,121, - 100,1,0,1,0,1,0,116,0,100,3,124,0,155,2,157, - 2,124,0,100,4,141,2,130,1,89,0,110,2,48,0,124, - 10,160,5,100,5,161,1,125,11,116,6,124,11,131,1,100, - 5,107,3,114,132,116,7,100,6,131,1,130,1,124,11,100, - 0,100,7,133,2,25,0,100,8,107,3,114,166,116,0,100, - 9,124,0,155,2,157,2,124,0,100,4,141,2,130,1,116, - 8,124,11,100,10,100,11,133,2,25,0,131,1,125,12,116, - 8,124,11,100,11,100,5,133,2,25,0,131,1,125,13,100, - 5,124,12,23,0,124,13,23,0,125,14,124,6,124,14,55, - 0,125,6,122,14,124,10,160,3,124,6,161,1,1,0,87, - 0,110,38,4,0,116,4,144,1,121,14,1,0,1,0,1, + 2,48,0,124,13,100,28,64,0,144,4,114,92,124,23,160, + 16,161,0,125,23,110,52,122,14,124,23,160,16,100,29,161, + 1,125,23,87,0,110,36,4,0,116,17,144,4,121,142,1, + 0,1,0,1,0,124,23,160,16,100,30,161,1,160,18,116, + 19,161,1,125,23,89,0,110,2,48,0,124,23,160,20,100, + 31,116,21,161,2,125,23,116,22,160,23,124,0,124,23,161, + 2,125,24,124,24,124,14,124,18,124,4,124,22,124,15,124, + 16,124,17,102,8,125,25,124,25,124,11,124,23,60,0,124, + 12,100,32,55,0,125,12,144,2,113,108,87,0,100,0,4, + 0,4,0,131,3,1,0,110,18,49,0,144,4,115,230,48, + 0,1,0,1,0,1,0,89,0,1,0,116,24,160,25,100, + 33,124,12,124,0,161,3,1,0,124,11,83,0,41,34,78, + 122,21,99,97,110,39,116,32,111,112,101,110,32,90,105,112, + 32,102,105,108,101,58,32,114,12,0,0,0,114,84,0,0, + 0,250,21,99,97,110,39,116,32,114,101,97,100,32,90,105, + 112,32,102,105,108,101,58,32,233,4,0,0,0,114,0,0, + 0,0,122,16,110,111,116,32,97,32,90,105,112,32,102,105, + 108,101,58,32,122,18,99,111,114,114,117,112,116,32,90,105, + 112,32,102,105,108,101,58,32,233,12,0,0,0,233,16,0, + 0,0,233,20,0,0,0,122,28,98,97,100,32,99,101,110, + 116,114,97,108,32,100,105,114,101,99,116,111,114,121,32,115, + 105,122,101,58,32,122,30,98,97,100,32,99,101,110,116,114, + 97,108,32,100,105,114,101,99,116,111,114,121,32,111,102,102, + 115,101,116,58,32,122,38,98,97,100,32,99,101,110,116,114, + 97,108,32,100,105,114,101,99,116,111,114,121,32,115,105,122, + 101,32,111,114,32,111,102,102,115,101,116,58,32,233,46,0, + 0,0,250,27,69,79,70,32,114,101,97,100,32,119,104,101, + 114,101,32,110,111,116,32,101,120,112,101,99,116,101,100,115, + 4,0,0,0,80,75,1,2,233,8,0,0,0,233,10,0, + 0,0,233,14,0,0,0,233,24,0,0,0,233,28,0,0, + 0,233,30,0,0,0,233,32,0,0,0,233,34,0,0,0, + 233,42,0,0,0,122,25,98,97,100,32,108,111,99,97,108, + 32,104,101,97,100,101,114,32,111,102,102,115,101,116,58,32, + 105,0,8,0,0,218,5,97,115,99,105,105,90,6,108,97, + 116,105,110,49,250,1,47,114,5,0,0,0,122,33,122,105, + 112,105,109,112,111,114,116,58,32,102,111,117,110,100,32,123, + 125,32,110,97,109,101,115,32,105,110,32,123,33,114,125,41, + 26,218,3,95,105,111,218,9,111,112,101,110,95,99,111,100, + 101,114,22,0,0,0,114,3,0,0,0,218,4,115,101,101, + 107,218,20,69,78,68,95,67,69,78,84,82,65,76,95,68, + 73,82,95,83,73,90,69,90,4,116,101,108,108,218,4,114, + 101,97,100,114,51,0,0,0,218,18,83,84,82,73,78,71, + 95,69,78,68,95,65,82,67,72,73,86,69,218,3,109,97, + 120,218,15,77,65,88,95,67,79,77,77,69,78,84,95,76, + 69,78,218,5,114,102,105,110,100,114,2,0,0,0,218,8, + 69,79,70,69,114,114,111,114,114,1,0,0,0,114,62,0, + 0,0,218,18,85,110,105,99,111,100,101,68,101,99,111,100, + 101,69,114,114,111,114,218,9,116,114,97,110,115,108,97,116, + 101,218,11,99,112,52,51,55,95,116,97,98,108,101,114,19, + 0,0,0,114,20,0,0,0,114,21,0,0,0,114,30,0, + 0,0,114,76,0,0,0,114,77,0,0,0,41,26,114,29, + 0,0,0,218,2,102,112,90,15,104,101,97,100,101,114,95, + 112,111,115,105,116,105,111,110,218,6,98,117,102,102,101,114, + 218,9,102,105,108,101,95,115,105,122,101,90,17,109,97,120, + 95,99,111,109,109,101,110,116,95,115,116,97,114,116,218,4, + 100,97,116,97,90,3,112,111,115,218,11,104,101,97,100,101, + 114,95,115,105,122,101,90,13,104,101,97,100,101,114,95,111, + 102,102,115,101,116,90,10,97,114,99,95,111,102,102,115,101, + 116,114,33,0,0,0,218,5,99,111,117,110,116,218,5,102, + 108,97,103,115,218,8,99,111,109,112,114,101,115,115,218,4, + 116,105,109,101,218,4,100,97,116,101,218,3,99,114,99,218, + 9,100,97,116,97,95,115,105,122,101,218,9,110,97,109,101, + 95,115,105,122,101,218,10,101,120,116,114,97,95,115,105,122, + 101,90,12,99,111,109,109,101,110,116,95,115,105,122,101,218, + 11,102,105,108,101,95,111,102,102,115,101,116,114,59,0,0, + 0,114,13,0,0,0,218,1,116,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,27,0,0,0,93,1,0, + 0,115,214,0,0,0,2,1,14,1,12,1,24,1,8,2, + 2,1,14,1,8,1,14,1,12,1,24,1,12,1,18,1, + 18,1,2,3,12,1,12,1,12,1,10,1,2,1,12,255, + 8,2,2,1,2,255,2,1,4,255,2,2,10,1,12,1, + 14,1,10,1,2,1,12,255,10,2,10,1,10,1,2,1, + 6,255,16,2,14,1,10,1,2,1,6,255,16,2,16,2, + 16,1,10,1,18,1,10,1,18,1,8,1,8,1,10,1, + 18,1,4,2,4,2,2,1,14,1,14,1,24,1,10,2, + 14,1,8,1,18,2,4,1,14,1,8,1,16,1,16,1, + 16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1, + 16,1,12,1,10,1,18,1,8,1,2,2,14,1,14,1, + 24,1,14,1,18,1,2,4,28,1,22,1,14,1,24,1, + 10,2,10,2,2,3,14,1,14,1,22,1,12,2,12,1, + 20,1,8,1,44,1,14,1,4,1,255,128,114,27,0,0, + 0,117,190,1,0,0,0,1,2,3,4,5,6,7,8,9, + 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25, + 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41, + 42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57, + 58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73, + 74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89, + 90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105, + 106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121, + 122,123,124,125,126,127,195,135,195,188,195,169,195,162,195,164, + 195,160,195,165,195,167,195,170,195,171,195,168,195,175,195,174, + 195,172,195,132,195,133,195,137,195,166,195,134,195,180,195,182, + 195,178,195,187,195,185,195,191,195,150,195,156,194,162,194,163, + 194,165,226,130,167,198,146,195,161,195,173,195,179,195,186,195, + 177,195,145,194,170,194,186,194,191,226,140,144,194,172,194,189, + 194,188,194,161,194,171,194,187,226,150,145,226,150,146,226,150, + 147,226,148,130,226,148,164,226,149,161,226,149,162,226,149,150, + 226,149,149,226,149,163,226,149,145,226,149,151,226,149,157,226, + 149,156,226,149,155,226,148,144,226,148,148,226,148,180,226,148, + 172,226,148,156,226,148,128,226,148,188,226,149,158,226,149,159, + 226,149,154,226,149,148,226,149,169,226,149,166,226,149,160,226, + 149,144,226,149,172,226,149,167,226,149,168,226,149,164,226,149, + 165,226,149,153,226,149,152,226,149,146,226,149,147,226,149,171, + 226,149,170,226,148,152,226,148,140,226,150,136,226,150,132,226, + 150,140,226,150,144,226,150,128,206,177,195,159,206,147,207,128, + 206,163,207,131,194,181,207,132,206,166,206,152,206,169,206,180, + 226,136,158,207,134,206,181,226,136,169,226,137,161,194,177,226, + 137,165,226,137,164,226,140,160,226,140,161,195,183,226,137,136, + 194,176,226,136,153,194,183,226,136,154,226,129,191,194,178,226, + 150,160,194,160,99,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,8,0,0,0,67,0,0,0,115,110,0, + 0,0,116,0,114,22,116,1,160,2,100,1,161,1,1,0, + 116,3,100,2,131,1,130,1,100,3,97,0,122,62,122,16, + 100,4,100,5,108,4,109,5,125,0,1,0,87,0,110,36, + 4,0,116,6,121,80,1,0,1,0,1,0,116,1,160,2, + 100,1,161,1,1,0,116,3,100,2,131,1,130,1,89,0, + 110,2,48,0,87,0,100,6,97,0,110,6,100,6,97,0, + 48,0,116,1,160,2,100,7,161,1,1,0,124,0,83,0, + 41,8,78,122,27,122,105,112,105,109,112,111,114,116,58,32, + 122,108,105,98,32,85,78,65,86,65,73,76,65,66,76,69, + 250,41,99,97,110,39,116,32,100,101,99,111,109,112,114,101, + 115,115,32,100,97,116,97,59,32,122,108,105,98,32,110,111, + 116,32,97,118,97,105,108,97,98,108,101,84,114,0,0,0, + 0,169,1,218,10,100,101,99,111,109,112,114,101,115,115,70, + 122,25,122,105,112,105,109,112,111,114,116,58,32,122,108,105, + 98,32,97,118,97,105,108,97,98,108,101,41,7,218,15,95, + 105,109,112,111,114,116,105,110,103,95,122,108,105,98,114,76, + 0,0,0,114,77,0,0,0,114,3,0,0,0,90,4,122, + 108,105,98,114,139,0,0,0,218,9,69,120,99,101,112,116, + 105,111,110,114,138,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,20,95,103,101,116,95,100,101, + 99,111,109,112,114,101,115,115,95,102,117,110,99,251,1,0, + 0,115,26,0,0,0,4,2,10,3,8,1,4,2,4,1, + 16,1,12,1,10,1,16,1,12,2,10,2,4,1,255,128, + 114,142,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,17,0,0,0,9,0,0,0,67,0,0,0,115,144, + 1,0,0,124,1,92,8,125,2,125,3,125,4,125,5,125, + 6,125,7,125,8,125,9,124,4,100,1,107,0,114,36,116, + 0,100,2,131,1,130,1,116,1,160,2,124,0,161,1,144, + 1,143,14,125,10,122,14,124,10,160,3,124,6,161,1,1, + 0,87,0,110,36,4,0,116,4,121,100,1,0,1,0,1, 0,116,0,100,3,124,0,155,2,157,2,124,0,100,4,141, - 2,130,1,89,0,110,2,48,0,124,10,160,5,124,4,161, - 1,125,15,116,6,124,15,131,1,124,4,107,3,144,1,114, - 48,116,4,100,12,131,1,130,1,87,0,100,0,4,0,4, - 0,131,3,1,0,110,18,49,0,144,1,115,70,48,0,1, - 0,1,0,1,0,89,0,1,0,124,3,100,1,107,2,144, - 1,114,94,124,15,83,0,122,10,116,9,131,0,125,16,87, - 0,110,28,4,0,116,10,144,1,121,132,1,0,1,0,1, - 0,116,0,100,13,131,1,130,1,89,0,110,2,48,0,124, - 16,124,15,100,14,131,2,83,0,41,15,78,114,0,0,0, - 0,122,18,110,101,103,97,116,105,118,101,32,100,97,116,97, - 32,115,105,122,101,114,90,0,0,0,114,12,0,0,0,114, - 102,0,0,0,114,96,0,0,0,114,91,0,0,0,115,4, - 0,0,0,80,75,3,4,122,23,98,97,100,32,108,111,99, - 97,108,32,102,105,108,101,32,104,101,97,100,101,114,58,32, - 233,26,0,0,0,114,101,0,0,0,122,26,122,105,112,105, - 109,112,111,114,116,58,32,99,97,110,39,116,32,114,101,97, - 100,32,100,97,116,97,114,137,0,0,0,105,241,255,255,255, - 41,11,114,3,0,0,0,114,108,0,0,0,114,109,0,0, - 0,114,110,0,0,0,114,22,0,0,0,114,112,0,0,0, - 114,51,0,0,0,114,117,0,0,0,114,1,0,0,0,114, - 142,0,0,0,114,141,0,0,0,41,17,114,29,0,0,0, - 114,54,0,0,0,90,8,100,97,116,97,112,97,116,104,114, - 128,0,0,0,114,132,0,0,0,114,123,0,0,0,114,135, - 0,0,0,114,129,0,0,0,114,130,0,0,0,114,131,0, - 0,0,114,121,0,0,0,114,122,0,0,0,114,133,0,0, - 0,114,134,0,0,0,114,125,0,0,0,90,8,114,97,119, - 95,100,97,116,97,114,139,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,52,0,0,0,16,2, - 0,0,115,62,0,0,0,0,1,20,1,8,1,8,2,14, - 2,2,1,14,1,12,1,24,1,10,1,12,1,8,2,16, - 2,18,2,16,1,16,1,12,1,8,1,2,1,14,1,14, - 1,24,1,10,1,14,1,40,2,10,2,4,3,2,1,10, - 1,14,1,14,1,114,52,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,16,0,0,0,116,0,124,0,124,1,24,0, - 131,1,100,1,107,1,83,0,41,2,78,114,5,0,0,0, - 41,1,218,3,97,98,115,41,2,90,2,116,49,90,2,116, - 50,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,9,95,101,113,95,109,116,105,109,101,62,2,0,0,115, - 2,0,0,0,0,2,114,145,0,0,0,99,5,0,0,0, - 0,0,0,0,0,0,0,0,14,0,0,0,8,0,0,0, - 67,0,0,0,115,60,1,0,0,124,3,124,2,100,1,156, - 2,125,5,122,18,116,0,160,1,124,4,124,3,124,5,161, - 3,125,6,87,0,110,20,4,0,116,2,121,48,1,0,1, - 0,1,0,89,0,100,0,83,0,48,0,124,6,100,2,64, - 0,100,3,107,3,125,7,124,7,114,182,124,6,100,4,64, - 0,100,3,107,3,125,8,116,3,106,4,100,5,107,3,144, - 1,114,10,124,8,115,106,116,3,106,4,100,6,107,2,144, - 1,114,10,116,5,124,0,124,2,131,2,125,9,124,9,100, - 0,117,1,144,1,114,10,116,3,160,6,116,0,106,7,124, - 9,161,2,125,10,122,20,116,0,160,8,124,4,124,10,124, - 3,124,5,161,4,1,0,87,0,110,104,4,0,116,2,121, - 180,1,0,1,0,1,0,89,0,100,0,83,0,48,0,116, - 9,124,0,124,2,131,2,92,2,125,11,125,12,124,11,144, - 1,114,10,116,10,116,11,124,4,100,7,100,8,133,2,25, - 0,131,1,124,11,131,2,114,246,116,11,124,4,100,8,100, - 9,133,2,25,0,131,1,124,12,107,3,144,1,114,10,116, - 12,160,13,100,10,124,3,155,2,157,2,161,1,1,0,100, - 0,83,0,116,14,160,15,124,4,100,9,100,0,133,2,25, - 0,161,1,125,13,116,16,124,13,116,17,131,2,144,1,115, - 56,116,18,100,11,124,1,155,2,100,12,157,3,131,1,130, - 1,124,13,83,0,41,13,78,41,2,114,59,0,0,0,114, - 13,0,0,0,114,5,0,0,0,114,0,0,0,0,114,84, - 0,0,0,90,5,110,101,118,101,114,90,6,97,108,119,97, - 121,115,114,97,0,0,0,114,92,0,0,0,114,93,0,0, - 0,122,22,98,121,116,101,99,111,100,101,32,105,115,32,115, - 116,97,108,101,32,102,111,114,32,122,16,99,111,109,112,105, - 108,101,100,32,109,111,100,117,108,101,32,122,21,32,105,115, - 32,110,111,116,32,97,32,99,111,100,101,32,111,98,106,101, - 99,116,41,19,114,21,0,0,0,90,13,95,99,108,97,115, - 115,105,102,121,95,112,121,99,114,75,0,0,0,218,4,95, - 105,109,112,90,21,99,104,101,99,107,95,104,97,115,104,95, - 98,97,115,101,100,95,112,121,99,115,218,15,95,103,101,116, - 95,112,121,99,95,115,111,117,114,99,101,218,11,115,111,117, - 114,99,101,95,104,97,115,104,90,17,95,82,65,87,95,77, - 65,71,73,67,95,78,85,77,66,69,82,90,18,95,118,97, - 108,105,100,97,116,101,95,104,97,115,104,95,112,121,99,218, - 29,95,103,101,116,95,109,116,105,109,101,95,97,110,100,95, - 115,105,122,101,95,111,102,95,115,111,117,114,99,101,114,145, - 0,0,0,114,2,0,0,0,114,76,0,0,0,114,77,0, - 0,0,218,7,109,97,114,115,104,97,108,90,5,108,111,97, - 100,115,114,15,0,0,0,218,10,95,99,111,100,101,95,116, - 121,112,101,218,9,84,121,112,101,69,114,114,111,114,41,14, - 114,32,0,0,0,114,53,0,0,0,114,63,0,0,0,114, - 38,0,0,0,114,124,0,0,0,90,11,101,120,99,95,100, - 101,116,97,105,108,115,114,127,0,0,0,90,10,104,97,115, - 104,95,98,97,115,101,100,90,12,99,104,101,99,107,95,115, - 111,117,114,99,101,90,12,115,111,117,114,99,101,95,98,121, - 116,101,115,114,148,0,0,0,90,12,115,111,117,114,99,101, - 95,109,116,105,109,101,90,11,115,111,117,114,99,101,95,115, - 105,122,101,114,46,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,15,95,117,110,109,97,114,115, - 104,97,108,95,99,111,100,101,72,2,0,0,115,82,0,0, - 0,0,2,2,1,2,254,6,5,2,1,18,1,12,1,8, - 2,12,1,4,1,12,1,12,1,2,255,2,1,8,255,4, - 2,10,1,10,1,4,1,4,1,2,254,4,5,2,1,4, - 1,8,255,8,2,12,1,8,3,8,255,6,3,6,3,22, - 1,18,255,4,2,4,1,8,255,4,2,4,2,18,1,12, - 1,16,1,114,153,0,0,0,99,1,0,0,0,0,0,0, + 2,130,1,89,0,110,2,48,0,124,10,160,5,100,5,161, + 1,125,11,116,6,124,11,131,1,100,5,107,3,114,132,116, + 7,100,6,131,1,130,1,124,11,100,0,100,7,133,2,25, + 0,100,8,107,3,114,166,116,0,100,9,124,0,155,2,157, + 2,124,0,100,4,141,2,130,1,116,8,124,11,100,10,100, + 11,133,2,25,0,131,1,125,12,116,8,124,11,100,11,100, + 5,133,2,25,0,131,1,125,13,100,5,124,12,23,0,124, + 13,23,0,125,14,124,6,124,14,55,0,125,6,122,14,124, + 10,160,3,124,6,161,1,1,0,87,0,110,38,4,0,116, + 4,144,1,121,14,1,0,1,0,1,0,116,0,100,3,124, + 0,155,2,157,2,124,0,100,4,141,2,130,1,89,0,110, + 2,48,0,124,10,160,5,124,4,161,1,125,15,116,6,124, + 15,131,1,124,4,107,3,144,1,114,48,116,4,100,12,131, + 1,130,1,87,0,100,0,4,0,4,0,131,3,1,0,110, + 18,49,0,144,1,115,70,48,0,1,0,1,0,1,0,89, + 0,1,0,124,3,100,1,107,2,144,1,114,94,124,15,83, + 0,122,10,116,9,131,0,125,16,87,0,110,28,4,0,116, + 10,144,1,121,132,1,0,1,0,1,0,116,0,100,13,131, + 1,130,1,89,0,110,2,48,0,124,16,124,15,100,14,131, + 2,83,0,41,15,78,114,0,0,0,0,122,18,110,101,103, + 97,116,105,118,101,32,100,97,116,97,32,115,105,122,101,114, + 90,0,0,0,114,12,0,0,0,114,102,0,0,0,114,96, + 0,0,0,114,91,0,0,0,115,4,0,0,0,80,75,3, + 4,122,23,98,97,100,32,108,111,99,97,108,32,102,105,108, + 101,32,104,101,97,100,101,114,58,32,233,26,0,0,0,114, + 101,0,0,0,122,26,122,105,112,105,109,112,111,114,116,58, + 32,99,97,110,39,116,32,114,101,97,100,32,100,97,116,97, + 114,137,0,0,0,105,241,255,255,255,41,11,114,3,0,0, + 0,114,108,0,0,0,114,109,0,0,0,114,110,0,0,0, + 114,22,0,0,0,114,112,0,0,0,114,51,0,0,0,114, + 117,0,0,0,114,1,0,0,0,114,142,0,0,0,114,141, + 0,0,0,41,17,114,29,0,0,0,114,54,0,0,0,90, + 8,100,97,116,97,112,97,116,104,114,128,0,0,0,114,132, + 0,0,0,114,123,0,0,0,114,135,0,0,0,114,129,0, + 0,0,114,130,0,0,0,114,131,0,0,0,114,121,0,0, + 0,114,122,0,0,0,114,133,0,0,0,114,134,0,0,0, + 114,125,0,0,0,90,8,114,97,119,95,100,97,116,97,114, + 139,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,114,52,0,0,0,16,2,0,0,115,64,0,0, + 0,20,1,8,1,8,1,14,2,2,2,14,1,12,1,24, + 1,10,1,12,1,8,1,16,2,18,2,16,2,16,1,12, + 1,8,1,2,1,14,1,14,1,24,1,10,1,14,1,40, + 1,10,2,4,2,2,3,10,1,14,1,14,1,10,1,255, + 128,114,52,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 16,0,0,0,116,0,124,0,124,1,24,0,131,1,100,1, + 107,1,83,0,41,2,78,114,5,0,0,0,41,1,218,3, + 97,98,115,41,2,90,2,116,49,90,2,116,50,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,9,95,101, + 113,95,109,116,105,109,101,62,2,0,0,115,4,0,0,0, + 16,2,255,128,114,145,0,0,0,99,5,0,0,0,0,0, + 0,0,0,0,0,0,14,0,0,0,8,0,0,0,67,0, + 0,0,115,60,1,0,0,124,3,124,2,100,1,156,2,125, + 5,122,18,116,0,160,1,124,4,124,3,124,5,161,3,125, + 6,87,0,110,20,4,0,116,2,121,48,1,0,1,0,1, + 0,89,0,100,0,83,0,48,0,124,6,100,2,64,0,100, + 3,107,3,125,7,124,7,114,182,124,6,100,4,64,0,100, + 3,107,3,125,8,116,3,106,4,100,5,107,3,144,1,114, + 10,124,8,115,106,116,3,106,4,100,6,107,2,144,1,114, + 10,116,5,124,0,124,2,131,2,125,9,124,9,100,0,117, + 1,144,1,114,10,116,3,160,6,116,0,106,7,124,9,161, + 2,125,10,122,20,116,0,160,8,124,4,124,10,124,3,124, + 5,161,4,1,0,87,0,110,104,4,0,116,2,121,180,1, + 0,1,0,1,0,89,0,100,0,83,0,48,0,116,9,124, + 0,124,2,131,2,92,2,125,11,125,12,124,11,144,1,114, + 10,116,10,116,11,124,4,100,7,100,8,133,2,25,0,131, + 1,124,11,131,2,114,246,116,11,124,4,100,8,100,9,133, + 2,25,0,131,1,124,12,107,3,144,1,114,10,116,12,160, + 13,100,10,124,3,155,2,157,2,161,1,1,0,100,0,83, + 0,116,14,160,15,124,4,100,9,100,0,133,2,25,0,161, + 1,125,13,116,16,124,13,116,17,131,2,144,1,115,56,116, + 18,100,11,124,1,155,2,100,12,157,3,131,1,130,1,124, + 13,83,0,41,13,78,41,2,114,59,0,0,0,114,13,0, + 0,0,114,5,0,0,0,114,0,0,0,0,114,84,0,0, + 0,90,5,110,101,118,101,114,90,6,97,108,119,97,121,115, + 114,97,0,0,0,114,92,0,0,0,114,93,0,0,0,122, + 22,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97, + 108,101,32,102,111,114,32,122,16,99,111,109,112,105,108,101, + 100,32,109,111,100,117,108,101,32,122,21,32,105,115,32,110, + 111,116,32,97,32,99,111,100,101,32,111,98,106,101,99,116, + 41,19,114,21,0,0,0,90,13,95,99,108,97,115,115,105, + 102,121,95,112,121,99,114,75,0,0,0,218,4,95,105,109, + 112,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, + 115,101,100,95,112,121,99,115,218,15,95,103,101,116,95,112, + 121,99,95,115,111,117,114,99,101,218,11,115,111,117,114,99, + 101,95,104,97,115,104,90,17,95,82,65,87,95,77,65,71, + 73,67,95,78,85,77,66,69,82,90,18,95,118,97,108,105, + 100,97,116,101,95,104,97,115,104,95,112,121,99,218,29,95, + 103,101,116,95,109,116,105,109,101,95,97,110,100,95,115,105, + 122,101,95,111,102,95,115,111,117,114,99,101,114,145,0,0, + 0,114,2,0,0,0,114,76,0,0,0,114,77,0,0,0, + 218,7,109,97,114,115,104,97,108,90,5,108,111,97,100,115, + 114,15,0,0,0,218,10,95,99,111,100,101,95,116,121,112, + 101,218,9,84,121,112,101,69,114,114,111,114,41,14,114,32, + 0,0,0,114,53,0,0,0,114,63,0,0,0,114,38,0, + 0,0,114,124,0,0,0,90,11,101,120,99,95,100,101,116, + 97,105,108,115,114,127,0,0,0,90,10,104,97,115,104,95, + 98,97,115,101,100,90,12,99,104,101,99,107,95,115,111,117, + 114,99,101,90,12,115,111,117,114,99,101,95,98,121,116,101, + 115,114,148,0,0,0,90,12,115,111,117,114,99,101,95,109, + 116,105,109,101,90,11,115,111,117,114,99,101,95,115,105,122, + 101,114,46,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,15,95,117,110,109,97,114,115,104,97, + 108,95,99,111,100,101,72,2,0,0,115,84,0,0,0,2, + 2,2,1,6,254,2,5,18,1,12,1,8,1,12,2,4, + 1,12,1,12,1,2,1,2,255,8,1,4,255,10,2,10, + 1,4,1,4,1,2,1,4,254,2,5,4,1,8,1,8, + 255,12,2,8,1,8,3,6,255,6,3,22,3,18,1,4, + 255,4,2,8,1,4,255,4,2,18,2,12,1,16,1,4, + 1,255,128,114,153,0,0,0,99,1,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, 0,115,28,0,0,0,124,0,160,0,100,1,100,2,161,2, 125,0,124,0,160,0,100,3,100,2,161,2,125,0,124,0, @@ -844,117 +847,119 @@ const unsigned char _Py_M__zipimport[] = { 1,218,6,115,111,117,114,99,101,114,9,0,0,0,114,9, 0,0,0,114,10,0,0,0,218,23,95,110,111,114,109,97, 108,105,122,101,95,108,105,110,101,95,101,110,100,105,110,103, - 115,123,2,0,0,115,6,0,0,0,0,1,12,1,12,1, - 114,157,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,6,0,0,0,67,0,0,0,115,24, - 0,0,0,116,0,124,1,131,1,125,1,116,1,124,1,124, - 0,100,1,100,2,100,3,141,4,83,0,41,4,78,114,74, - 0,0,0,84,41,1,90,12,100,111,110,116,95,105,110,104, - 101,114,105,116,41,2,114,157,0,0,0,218,7,99,111,109, - 112,105,108,101,41,2,114,53,0,0,0,114,156,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 15,95,99,111,109,112,105,108,101,95,115,111,117,114,99,101, - 130,2,0,0,115,4,0,0,0,0,1,8,1,114,159,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,11,0,0,0,67,0,0,0,115,68,0,0,0, - 116,0,160,1,124,0,100,1,63,0,100,2,23,0,124,0, - 100,3,63,0,100,4,64,0,124,0,100,5,64,0,124,1, - 100,6,63,0,124,1,100,3,63,0,100,7,64,0,124,1, - 100,5,64,0,100,8,20,0,100,9,100,9,100,9,102,9, - 161,1,83,0,41,10,78,233,9,0,0,0,105,188,7,0, - 0,233,5,0,0,0,233,15,0,0,0,233,31,0,0,0, - 233,11,0,0,0,233,63,0,0,0,114,84,0,0,0,114, - 14,0,0,0,41,2,114,129,0,0,0,90,6,109,107,116, - 105,109,101,41,2,218,1,100,114,136,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,14,95,112, - 97,114,115,101,95,100,111,115,116,105,109,101,136,2,0,0, - 115,18,0,0,0,0,1,4,1,10,1,10,1,6,1,6, - 1,10,1,10,1,6,249,114,167,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,10,0,0, - 0,67,0,0,0,115,110,0,0,0,122,82,124,1,100,1, - 100,0,133,2,25,0,100,2,118,0,115,22,74,0,130,1, - 124,1,100,0,100,1,133,2,25,0,125,1,124,0,106,0, - 124,1,25,0,125,2,124,2,100,3,25,0,125,3,124,2, - 100,4,25,0,125,4,124,2,100,5,25,0,125,5,116,1, - 124,4,124,3,131,2,124,5,102,2,87,0,83,0,4,0, - 116,2,116,3,116,4,102,3,121,108,1,0,1,0,1,0, - 89,0,100,6,83,0,48,0,41,7,78,114,14,0,0,0, - 169,2,218,1,99,218,1,111,114,161,0,0,0,233,6,0, - 0,0,233,3,0,0,0,41,2,114,0,0,0,0,114,0, - 0,0,0,41,5,114,28,0,0,0,114,167,0,0,0,114, - 26,0,0,0,218,10,73,110,100,101,120,69,114,114,111,114, - 114,152,0,0,0,41,6,114,32,0,0,0,114,13,0,0, - 0,114,54,0,0,0,114,129,0,0,0,114,130,0,0,0, - 90,17,117,110,99,111,109,112,114,101,115,115,101,100,95,115, - 105,122,101,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,149,0,0,0,149,2,0,0,115,20,0,0,0, - 0,1,2,2,20,1,12,1,10,3,8,1,8,1,8,1, - 16,1,18,1,114,149,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0, - 0,0,115,80,0,0,0,124,1,100,1,100,0,133,2,25, - 0,100,2,118,0,115,20,74,0,130,1,124,1,100,0,100, - 1,133,2,25,0,125,1,122,14,124,0,106,0,124,1,25, - 0,125,2,87,0,110,20,4,0,116,1,121,66,1,0,1, - 0,1,0,89,0,100,0,83,0,48,0,116,2,124,0,106, - 3,124,2,131,2,83,0,41,3,78,114,14,0,0,0,114, - 168,0,0,0,41,4,114,28,0,0,0,114,26,0,0,0, - 114,52,0,0,0,114,29,0,0,0,41,3,114,32,0,0, - 0,114,13,0,0,0,114,54,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,114,147,0,0,0,168, - 2,0,0,115,14,0,0,0,0,2,20,1,12,2,2,1, - 14,1,12,1,8,2,114,147,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,11,0,0,0,9,0,0,0, - 67,0,0,0,115,194,0,0,0,116,0,124,0,124,1,131, - 2,125,2,116,1,68,0,93,156,92,3,125,3,125,4,125, - 5,124,2,124,3,23,0,125,6,116,2,106,3,100,1,124, - 0,106,4,116,5,124,6,100,2,100,3,141,5,1,0,122, - 14,124,0,106,6,124,6,25,0,125,7,87,0,110,18,4, - 0,116,7,121,86,1,0,1,0,1,0,89,0,113,14,48, - 0,124,7,100,4,25,0,125,8,116,8,124,0,106,4,124, - 7,131,2,125,9,124,4,114,130,116,9,124,0,124,8,124, - 6,124,1,124,9,131,5,125,10,110,10,116,10,124,8,124, - 9,131,2,125,10,124,10,100,0,117,0,114,150,113,14,124, - 7,100,4,25,0,125,8,124,10,124,5,124,8,102,3,2, - 0,1,0,83,0,116,11,100,5,124,1,155,2,157,2,124, - 1,100,6,141,2,130,1,100,0,83,0,41,7,78,122,13, - 116,114,121,105,110,103,32,123,125,123,125,123,125,114,84,0, - 0,0,41,1,90,9,118,101,114,98,111,115,105,116,121,114, - 0,0,0,0,114,57,0,0,0,114,58,0,0,0,41,12, - 114,36,0,0,0,114,87,0,0,0,114,76,0,0,0,114, - 77,0,0,0,114,29,0,0,0,114,20,0,0,0,114,28, - 0,0,0,114,26,0,0,0,114,52,0,0,0,114,153,0, - 0,0,114,159,0,0,0,114,3,0,0,0,41,11,114,32, - 0,0,0,114,38,0,0,0,114,13,0,0,0,114,88,0, - 0,0,114,89,0,0,0,114,47,0,0,0,114,63,0,0, - 0,114,54,0,0,0,114,40,0,0,0,114,124,0,0,0, - 114,46,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,44,0,0,0,183,2,0,0,115,36,0, - 0,0,0,1,10,1,14,1,8,1,22,1,2,1,14,1, - 12,1,6,2,8,1,12,1,4,1,18,2,10,1,8,3, - 2,1,8,1,14,2,114,44,0,0,0,41,44,114,82,0, - 0,0,90,26,95,102,114,111,122,101,110,95,105,109,112,111, - 114,116,108,105,98,95,101,120,116,101,114,110,97,108,114,21, - 0,0,0,114,1,0,0,0,114,2,0,0,0,90,17,95, - 102,114,111,122,101,110,95,105,109,112,111,114,116,108,105,98, - 114,76,0,0,0,114,146,0,0,0,114,108,0,0,0,114, - 150,0,0,0,114,67,0,0,0,114,129,0,0,0,90,7, - 95,95,97,108,108,95,95,114,20,0,0,0,90,15,112,97, - 116,104,95,115,101,112,97,114,97,116,111,114,115,114,18,0, - 0,0,114,75,0,0,0,114,3,0,0,0,114,25,0,0, - 0,218,4,116,121,112,101,114,70,0,0,0,114,111,0,0, - 0,114,113,0,0,0,114,115,0,0,0,114,4,0,0,0, - 114,87,0,0,0,114,36,0,0,0,114,37,0,0,0,114, - 35,0,0,0,114,27,0,0,0,114,120,0,0,0,114,140, - 0,0,0,114,142,0,0,0,114,52,0,0,0,114,145,0, - 0,0,114,153,0,0,0,218,8,95,95,99,111,100,101,95, - 95,114,151,0,0,0,114,157,0,0,0,114,159,0,0,0, - 114,167,0,0,0,114,149,0,0,0,114,147,0,0,0,114, - 44,0,0,0,114,9,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,8,60,109,111,100,117,108, - 101,62,1,0,0,0,115,84,0,0,0,4,16,8,1,16, - 1,8,1,8,1,8,1,8,1,8,1,8,2,8,3,6, - 1,14,3,16,4,4,2,8,2,4,1,4,1,4,2,14, - 127,0,125,12,1,12,1,2,1,2,252,4,9,8,4,8, - 9,8,31,8,126,2,254,2,29,4,5,8,21,8,46,8, - 10,8,46,10,5,8,7,8,6,8,13,8,19,8,15, + 115,123,2,0,0,115,8,0,0,0,12,1,12,1,4,1, + 255,128,114,157,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,6,0,0,0,67,0,0,0, + 115,24,0,0,0,116,0,124,1,131,1,125,1,116,1,124, + 1,124,0,100,1,100,2,100,3,141,4,83,0,41,4,78, + 114,74,0,0,0,84,41,1,90,12,100,111,110,116,95,105, + 110,104,101,114,105,116,41,2,114,157,0,0,0,218,7,99, + 111,109,112,105,108,101,41,2,114,53,0,0,0,114,156,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,15,95,99,111,109,112,105,108,101,95,115,111,117,114, + 99,101,130,2,0,0,115,6,0,0,0,8,1,16,1,255, + 128,114,159,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,11,0,0,0,67,0,0,0,115, + 68,0,0,0,116,0,160,1,124,0,100,1,63,0,100,2, + 23,0,124,0,100,3,63,0,100,4,64,0,124,0,100,5, + 64,0,124,1,100,6,63,0,124,1,100,3,63,0,100,7, + 64,0,124,1,100,5,64,0,100,8,20,0,100,9,100,9, + 100,9,102,9,161,1,83,0,41,10,78,233,9,0,0,0, + 105,188,7,0,0,233,5,0,0,0,233,15,0,0,0,233, + 31,0,0,0,233,11,0,0,0,233,63,0,0,0,114,84, + 0,0,0,114,14,0,0,0,41,2,114,129,0,0,0,90, + 6,109,107,116,105,109,101,41,2,218,1,100,114,136,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,14,95,112,97,114,115,101,95,100,111,115,116,105,109,101, + 136,2,0,0,115,20,0,0,0,4,1,10,1,10,1,6, + 1,6,1,10,1,10,1,6,1,6,249,255,128,114,167,0, + 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,10,0,0,0,67,0,0,0,115,110,0,0,0, + 122,82,124,1,100,1,100,0,133,2,25,0,100,2,118,0, + 115,22,74,0,130,1,124,1,100,0,100,1,133,2,25,0, + 125,1,124,0,106,0,124,1,25,0,125,2,124,2,100,3, + 25,0,125,3,124,2,100,4,25,0,125,4,124,2,100,5, + 25,0,125,5,116,1,124,4,124,3,131,2,124,5,102,2, + 87,0,83,0,4,0,116,2,116,3,116,4,102,3,121,108, + 1,0,1,0,1,0,89,0,100,6,83,0,48,0,41,7, + 78,114,14,0,0,0,169,2,218,1,99,218,1,111,114,161, + 0,0,0,233,6,0,0,0,233,3,0,0,0,41,2,114, + 0,0,0,0,114,0,0,0,0,41,5,114,28,0,0,0, + 114,167,0,0,0,114,26,0,0,0,218,10,73,110,100,101, + 120,69,114,114,111,114,114,152,0,0,0,41,6,114,32,0, + 0,0,114,13,0,0,0,114,54,0,0,0,114,129,0,0, + 0,114,130,0,0,0,90,17,117,110,99,111,109,112,114,101, + 115,115,101,100,95,115,105,122,101,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,149,0,0,0,149,2,0, + 0,115,22,0,0,0,2,1,20,2,12,1,10,1,8,3, + 8,1,8,1,16,1,18,1,8,1,255,128,114,149,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,8,0,0,0,67,0,0,0,115,80,0,0,0,124, + 1,100,1,100,0,133,2,25,0,100,2,118,0,115,20,74, + 0,130,1,124,1,100,0,100,1,133,2,25,0,125,1,122, + 14,124,0,106,0,124,1,25,0,125,2,87,0,110,20,4, + 0,116,1,121,66,1,0,1,0,1,0,89,0,100,0,83, + 0,48,0,116,2,124,0,106,3,124,2,131,2,83,0,41, + 3,78,114,14,0,0,0,114,168,0,0,0,41,4,114,28, + 0,0,0,114,26,0,0,0,114,52,0,0,0,114,29,0, + 0,0,41,3,114,32,0,0,0,114,13,0,0,0,114,54, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,147,0,0,0,168,2,0,0,115,16,0,0,0, + 20,2,12,1,2,2,14,1,12,1,8,1,12,2,255,128, + 114,147,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,11,0,0,0,9,0,0,0,67,0,0,0,115,194, + 0,0,0,116,0,124,0,124,1,131,2,125,2,116,1,68, + 0,93,156,92,3,125,3,125,4,125,5,124,2,124,3,23, + 0,125,6,116,2,106,3,100,1,124,0,106,4,116,5,124, + 6,100,2,100,3,141,5,1,0,122,14,124,0,106,6,124, + 6,25,0,125,7,87,0,110,18,4,0,116,7,121,86,1, + 0,1,0,1,0,89,0,113,14,48,0,124,7,100,4,25, + 0,125,8,116,8,124,0,106,4,124,7,131,2,125,9,124, + 4,114,130,116,9,124,0,124,8,124,6,124,1,124,9,131, + 5,125,10,110,10,116,10,124,8,124,9,131,2,125,10,124, + 10,100,0,117,0,114,150,113,14,124,7,100,4,25,0,125, + 8,124,10,124,5,124,8,102,3,2,0,1,0,83,0,116, + 11,100,5,124,1,155,2,157,2,124,1,100,6,141,2,130, + 1,100,0,83,0,41,7,78,122,13,116,114,121,105,110,103, + 32,123,125,123,125,123,125,114,84,0,0,0,41,1,90,9, + 118,101,114,98,111,115,105,116,121,114,0,0,0,0,114,57, + 0,0,0,114,58,0,0,0,41,12,114,36,0,0,0,114, + 87,0,0,0,114,76,0,0,0,114,77,0,0,0,114,29, + 0,0,0,114,20,0,0,0,114,28,0,0,0,114,26,0, + 0,0,114,52,0,0,0,114,153,0,0,0,114,159,0,0, + 0,114,3,0,0,0,41,11,114,32,0,0,0,114,38,0, + 0,0,114,13,0,0,0,114,88,0,0,0,114,89,0,0, + 0,114,47,0,0,0,114,63,0,0,0,114,54,0,0,0, + 114,40,0,0,0,114,124,0,0,0,114,46,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,44, + 0,0,0,183,2,0,0,115,40,0,0,0,10,1,14,1, + 8,1,22,1,2,1,14,1,12,1,6,1,8,2,12,1, + 4,1,18,1,10,2,8,1,2,3,8,1,14,1,18,2, + 4,128,255,128,114,44,0,0,0,41,44,114,82,0,0,0, + 90,26,95,102,114,111,122,101,110,95,105,109,112,111,114,116, + 108,105,98,95,101,120,116,101,114,110,97,108,114,21,0,0, + 0,114,1,0,0,0,114,2,0,0,0,90,17,95,102,114, + 111,122,101,110,95,105,109,112,111,114,116,108,105,98,114,76, + 0,0,0,114,146,0,0,0,114,108,0,0,0,114,150,0, + 0,0,114,67,0,0,0,114,129,0,0,0,90,7,95,95, + 97,108,108,95,95,114,20,0,0,0,90,15,112,97,116,104, + 95,115,101,112,97,114,97,116,111,114,115,114,18,0,0,0, + 114,75,0,0,0,114,3,0,0,0,114,25,0,0,0,218, + 4,116,121,112,101,114,70,0,0,0,114,111,0,0,0,114, + 113,0,0,0,114,115,0,0,0,114,4,0,0,0,114,87, + 0,0,0,114,36,0,0,0,114,37,0,0,0,114,35,0, + 0,0,114,27,0,0,0,114,120,0,0,0,114,140,0,0, + 0,114,142,0,0,0,114,52,0,0,0,114,145,0,0,0, + 114,153,0,0,0,218,8,95,95,99,111,100,101,95,95,114, + 151,0,0,0,114,157,0,0,0,114,159,0,0,0,114,167, + 0,0,0,114,149,0,0,0,114,147,0,0,0,114,44,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,8,60,109,111,100,117,108,101,62, + 1,0,0,0,115,90,0,0,0,4,0,8,16,16,1,8, + 1,8,1,8,1,8,1,8,1,8,1,8,2,6,3,14, + 1,16,3,4,4,8,2,4,2,4,1,4,1,14,2,0, + 127,12,125,12,1,2,1,2,1,4,252,8,9,8,4,8, + 9,8,31,2,126,2,254,4,29,8,5,8,21,8,46,8, + 10,10,46,8,5,8,7,8,6,8,13,8,19,8,15,4, + 128,255,128, }; diff --git a/Python/marshal.c b/Python/marshal.c index 91a0f8acb12487..d292987ce05f42 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -524,7 +524,7 @@ w_complex_object(PyObject *v, char flag, WFILE *p) w_object(co->co_filename, p); w_object(co->co_name, p); w_long(co->co_firstlineno, p); - w_object(co->co_lnotab, p); + w_object(co->co_linetable, p); } else if (PyObject_CheckBuffer(v)) { /* Write unknown bytes-like objects as a bytes object */ @@ -1312,7 +1312,7 @@ r_object(RFILE *p) PyObject *filename = NULL; PyObject *name = NULL; int firstlineno; - PyObject *lnotab = NULL; + PyObject *linetable = NULL; idx = r_ref_reserve(flag, p); if (idx < 0) @@ -1367,8 +1367,8 @@ r_object(RFILE *p) firstlineno = (int)r_long(p); if (firstlineno == -1 && PyErr_Occurred()) break; - lnotab = r_object(p); - if (lnotab == NULL) + linetable = r_object(p); + if (linetable == NULL) goto code_error; if (PySys_Audit("code.__new__", "OOOiiiiii", @@ -1382,7 +1382,7 @@ r_object(RFILE *p) nlocals, stacksize, flags, code, consts, names, varnames, freevars, cellvars, filename, name, - firstlineno, lnotab); + firstlineno, linetable); v = r_ref_insert(v, idx, flag, p); code_error: @@ -1394,7 +1394,7 @@ r_object(RFILE *p) Py_XDECREF(cellvars); Py_XDECREF(filename); Py_XDECREF(name); - Py_XDECREF(lnotab); + Py_XDECREF(linetable); } retval = v; break; diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index 83a5fa93cf447e..e6555dd96a373b 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -648,19 +648,28 @@ def addr2line(self, addrq): Analogous to PyCode_Addr2Line; translated from pseudocode in Objects/lnotab_notes.txt ''' - co_lnotab = self.pyop_field('co_lnotab').proxyval(set()) + co_linetable = self.pyop_field('co_linetable').proxyval(set()) # Initialize lineno to co_firstlineno as per PyCode_Addr2Line # not 0, as lnotab_notes.txt has it: lineno = int_from_int(self.field('co_firstlineno')) + if addrq < 0: + return lineno addr = 0 - for addr_incr, line_incr in zip(co_lnotab[::2], co_lnotab[1::2]): + for addr_incr, line_incr in zip(co_linetable[::2], co_linetable[1::2]): + if addr_incr == 255: + break addr += ord(addr_incr) + line_delta = ord(line_incr) + if line_delta == 128: + line_delta = 0 + elif line_delta > 128: + line_delta -= 256 + lineno += line_delta if addr > addrq: return lineno - lineno += ord(line_incr) - return lineno + assert False, "Unreachable" class PyDictObjectPtr(PyObjectPtr): From 5439b6c25b8606beb8be4a65c9c4410c05205d80 Mon Sep 17 00:00:00 2001 From: Jakub Stasiak Date: Thu, 12 Nov 2020 10:49:30 +0100 Subject: [PATCH 0516/1261] bpo-42237: Fix os.sendfile() on illumos (GH-23154) --- .../2020-11-10-14-27-49.bpo-42237.F363jO.rst | 1 + Modules/posixmodule.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-11-10-14-27-49.bpo-42237.F363jO.rst diff --git a/Misc/NEWS.d/next/Library/2020-11-10-14-27-49.bpo-42237.F363jO.rst b/Misc/NEWS.d/next/Library/2020-11-10-14-27-49.bpo-42237.F363jO.rst new file mode 100644 index 00000000000000..50cab6e1f11f84 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-10-14-27-49.bpo-42237.F363jO.rst @@ -0,0 +1 @@ +Fix `os.sendfile()` on illumos. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 70b47c475feaa5..6b51d8a848eab2 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -9873,11 +9873,26 @@ os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj, if (offset >= st.st_size) { return Py_BuildValue("i", 0); } + + // On illumos specifically sendfile() may perform a partial write but + // return -1/an error (in one confirmed case the destination socket + // had a 5 second timeout set and errno was EAGAIN) and it's on the client + // code to check if the offset parameter was modified by sendfile(). + // + // We need this variable to track said change. + off_t original_offset = offset; #endif do { Py_BEGIN_ALLOW_THREADS ret = sendfile(out_fd, in_fd, &offset, count); +#if defined(__sun) && defined(__SVR4) + // This handles illumos-specific sendfile() partial write behavior, + // see a comment above for more details. + if (ret < 0 && offset != original_offset) { + ret = offset - original_offset; + } +#endif Py_END_ALLOW_THREADS } while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); if (ret < 0) From 2cd9b7c2830f442abedf46167fa3818423c92678 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 12 Nov 2020 10:42:44 +0000 Subject: [PATCH 0517/1261] Bump magic number. (GH-23245) --- Lib/importlib/_bootstrap_external.py | 3 +- PC/launcher.c | 1 + Python/importlib_external.h | 222 +++++++++++++-------------- 3 files changed, 114 insertions(+), 112 deletions(-) diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index b08ad032ab309d..5c30a67aac44d2 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -278,6 +278,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.9a2 3424 (simplify bytecodes for *value unpacking) # Python 3.9a2 3425 (simplify bytecodes for **value unpacking) # Python 3.10a1 3430 (Make 'annotations' future by default) +# Python 3.10a1 3431 (New line number table format -- PEP 626) # # MAGIC must change whenever the bytecode emitted by the compiler may no @@ -287,7 +288,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3430).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3431).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/PC/launcher.c b/PC/launcher.c index 106fc660755f7e..7ca2f2387801c9 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -1248,6 +1248,7 @@ static PYC_MAGIC magic_values[] = { { 3390, 3399, L"3.7" }, { 3400, 3419, L"3.8" }, { 3420, 3429, L"3.9" }, + { 3430, 3439, L"3.10" }, { 0 } }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index c0042156d9096f..f9264204504b50 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -287,7 +287,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 13,95,119,114,105,116,101,95,97,116,111,109,105,99,120,0, 0,0,115,32,0,0,0,16,5,6,1,22,1,4,255,2, 2,14,3,40,1,16,1,12,1,2,1,14,1,12,1,6, - 1,2,1,4,128,255,128,114,69,0,0,0,105,102,13,0, + 1,2,1,4,128,255,128,114,69,0,0,0,105,103,13,0, 0,114,28,0,0,0,114,17,0,0,0,115,2,0,0,0, 13,10,90,11,95,95,112,121,99,97,99,104,101,95,95,122, 4,111,112,116,45,122,3,46,112,121,122,4,46,112,121,99, @@ -401,7 +401,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,103,90,15,97,108,109,111,115,116,95,102,105,108,101,110, 97,109,101,218,8,102,105,108,101,110,97,109,101,114,5,0, 0,0,114,5,0,0,0,114,8,0,0,0,218,17,99,97, - 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,46, + 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,47, 1,0,0,115,74,0,0,0,8,18,6,1,2,1,4,255, 8,2,4,1,8,1,12,1,10,1,12,1,16,1,8,1, 8,1,8,1,24,1,8,1,12,1,6,1,8,2,8,1, @@ -483,7 +483,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,90,13,98,97,115,101,95,102,105,108,101,110,97,109,101, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, 17,115,111,117,114,99,101,95,102,114,111,109,95,99,97,99, - 104,101,117,1,0,0,115,62,0,0,0,12,9,8,1,10, + 104,101,118,1,0,0,115,62,0,0,0,12,9,8,1,10, 1,12,1,4,1,10,1,12,1,14,1,16,1,4,1,4, 1,12,1,8,1,8,1,2,1,8,255,10,2,8,1,16, 1,10,1,16,1,10,1,4,1,2,1,8,255,16,2,10, @@ -518,7 +518,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,90,9,101,120,116,101,110,115,105,111,110,218,11, 115,111,117,114,99,101,95,112,97,116,104,114,5,0,0,0, 114,5,0,0,0,114,8,0,0,0,218,15,95,103,101,116, - 95,115,111,117,114,99,101,102,105,108,101,157,1,0,0,115, + 95,115,111,117,114,99,101,102,105,108,101,158,1,0,0,115, 22,0,0,0,12,7,4,1,16,1,24,1,4,1,2,1, 12,1,16,1,18,1,16,1,255,128,114,108,0,0,0,99, 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, @@ -532,7 +532,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,82,0,0,0,114,88,0,0,0,41,1,114, 96,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, - 176,1,0,0,115,20,0,0,0,14,1,2,1,10,1,12, + 177,1,0,0,115,20,0,0,0,14,1,2,1,10,1,12, 1,6,1,14,1,4,1,4,2,4,128,255,128,114,112,0, 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, 0,0,0,8,0,0,0,67,0,0,0,115,50,0,0,0, @@ -546,7 +546,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,41,3,114,49,0,0,0,114,51,0,0,0,114, 50,0,0,0,41,2,114,44,0,0,0,114,52,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 10,95,99,97,108,99,95,109,111,100,101,188,1,0,0,115, + 10,95,99,97,108,99,95,109,111,100,101,189,1,0,0,115, 14,0,0,0,2,2,14,1,12,1,10,1,8,3,4,1, 255,128,114,114,0,0,0,99,1,0,0,0,0,0,0,0, 0,0,0,0,3,0,0,0,8,0,0,0,3,0,0,0, @@ -585,7 +585,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 218,6,107,119,97,114,103,115,169,1,218,6,109,101,116,104, 111,100,114,5,0,0,0,114,8,0,0,0,218,19,95,99, 104,101,99,107,95,110,97,109,101,95,119,114,97,112,112,101, - 114,208,1,0,0,115,20,0,0,0,8,1,8,1,10,1, + 114,209,1,0,0,115,20,0,0,0,8,1,8,1,10,1, 4,1,8,1,2,255,2,1,6,255,24,2,255,128,122,40, 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, @@ -603,7 +603,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,100,105,99,116,95,95,218,6,117,112,100,97,116,101,41, 3,90,3,110,101,119,90,3,111,108,100,114,67,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 5,95,119,114,97,112,219,1,0,0,115,12,0,0,0,8, + 5,95,119,114,97,112,220,1,0,0,115,12,0,0,0,8, 1,10,1,20,1,14,1,4,128,255,128,122,26,95,99,104, 101,99,107,95,110,97,109,101,46,60,108,111,99,97,108,115, 62,46,95,119,114,97,112,41,1,78,41,3,218,10,95,98, @@ -611,7 +611,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,109,101,69,114,114,111,114,41,3,114,122,0,0,0,114, 123,0,0,0,114,133,0,0,0,114,5,0,0,0,114,121, 0,0,0,114,8,0,0,0,218,11,95,99,104,101,99,107, - 95,110,97,109,101,200,1,0,0,115,16,0,0,0,14,8, + 95,110,97,109,101,201,1,0,0,115,16,0,0,0,14,8, 2,7,10,1,12,1,14,2,10,5,4,1,255,128,114,136, 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, 5,0,0,0,6,0,0,0,67,0,0,0,115,60,0,0, @@ -639,7 +639,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,109,101,218,6,108,111,97,100,101,114,218,8,112,111,114, 116,105,111,110,115,218,3,109,115,103,114,5,0,0,0,114, 5,0,0,0,114,8,0,0,0,218,17,95,102,105,110,100, - 95,109,111,100,117,108,101,95,115,104,105,109,228,1,0,0, + 95,109,111,100,117,108,101,95,115,104,105,109,229,1,0,0, 115,12,0,0,0,14,10,16,1,4,1,22,1,4,1,255, 128,114,143,0,0,0,99,3,0,0,0,0,0,0,0,0, 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, @@ -707,7 +707,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,90,5,109,97,103,105,99,114,92,0,0,0,114,2,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, 0,218,13,95,99,108,97,115,115,105,102,121,95,112,121,99, - 245,1,0,0,115,30,0,0,0,12,16,8,1,16,1,12, + 246,1,0,0,115,30,0,0,0,12,16,8,1,16,1,12, 1,16,1,12,1,10,1,12,1,8,1,16,1,8,2,16, 1,16,1,4,1,255,128,114,152,0,0,0,99,5,0,0, 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, @@ -762,7 +762,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 151,0,0,0,114,92,0,0,0,114,5,0,0,0,114,5, 0,0,0,114,8,0,0,0,218,23,95,118,97,108,105,100, 97,116,101,95,116,105,109,101,115,116,97,109,112,95,112,121, - 99,22,2,0,0,115,20,0,0,0,24,19,10,1,12,1, + 99,23,2,0,0,115,20,0,0,0,24,19,10,1,12,1, 16,1,8,1,22,1,2,255,22,2,4,128,255,128,114,156, 0,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, 4,0,0,0,4,0,0,0,67,0,0,0,115,42,0,0, @@ -808,7 +808,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,111,117,114,99,101,95,104,97,115,104,114,116,0,0,0, 114,151,0,0,0,114,5,0,0,0,114,5,0,0,0,114, 8,0,0,0,218,18,95,118,97,108,105,100,97,116,101,95, - 104,97,115,104,95,112,121,99,50,2,0,0,115,16,0,0, + 104,97,115,104,95,112,121,99,51,2,0,0,115,16,0,0, 0,16,17,2,1,8,1,4,255,2,2,6,254,4,128,255, 128,114,158,0,0,0,99,4,0,0,0,0,0,0,0,0, 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, @@ -832,7 +832,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,26,0,0,0,114,116,0,0,0,114,106,0,0,0,114, 107,0,0,0,218,4,99,111,100,101,114,5,0,0,0,114, 5,0,0,0,114,8,0,0,0,218,17,95,99,111,109,112, - 105,108,101,95,98,121,116,101,99,111,100,101,74,2,0,0, + 105,108,101,95,98,121,116,101,99,111,100,101,75,2,0,0, 115,22,0,0,0,10,2,10,1,12,1,8,1,12,1,4, 1,10,2,4,1,6,255,4,128,255,128,114,165,0,0,0, 114,73,0,0,0,99,3,0,0,0,0,0,0,0,0,0, @@ -851,7 +851,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 5,109,116,105,109,101,114,155,0,0,0,114,26,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, 22,95,99,111,100,101,95,116,111,95,116,105,109,101,115,116, - 97,109,112,95,112,121,99,87,2,0,0,115,14,0,0,0, + 97,109,112,95,112,121,99,88,2,0,0,115,14,0,0,0, 8,2,14,1,14,1,14,1,16,1,4,1,255,128,114,170, 0,0,0,84,99,3,0,0,0,0,0,0,0,0,0,0, 0,5,0,0,0,5,0,0,0,67,0,0,0,115,80,0, @@ -869,7 +869,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,157,0,0,0,90,7,99,104,101,99,107,101,100, 114,26,0,0,0,114,2,0,0,0,114,5,0,0,0,114, 5,0,0,0,114,8,0,0,0,218,17,95,99,111,100,101, - 95,116,111,95,104,97,115,104,95,112,121,99,97,2,0,0, + 95,116,111,95,104,97,115,104,95,112,121,99,98,2,0,0, 115,16,0,0,0,8,2,12,1,14,1,16,1,10,1,16, 1,4,1,255,128,114,171,0,0,0,99,1,0,0,0,0, 0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,67, @@ -897,7 +897,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,110,99,111,100,105,110,103,90,15,110,101,119,108,105,110, 101,95,100,101,99,111,100,101,114,114,5,0,0,0,114,5, 0,0,0,114,8,0,0,0,218,13,100,101,99,111,100,101, - 95,115,111,117,114,99,101,108,2,0,0,115,12,0,0,0, + 95,115,111,117,114,99,101,109,2,0,0,115,12,0,0,0, 8,5,12,1,10,1,12,1,20,1,255,128,114,176,0,0, 0,169,2,114,140,0,0,0,218,26,115,117,98,109,111,100, 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, @@ -958,7 +958,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,117,102,102,105,120,101,115,114,182,0,0,0,90,7,100, 105,114,110,97,109,101,114,5,0,0,0,114,5,0,0,0, 114,8,0,0,0,218,23,115,112,101,99,95,102,114,111,109, - 95,102,105,108,101,95,108,111,99,97,116,105,111,110,125,2, + 95,102,105,108,101,95,108,111,99,97,116,105,111,110,126,2, 0,0,115,64,0,0,0,8,12,4,4,10,1,2,2,14, 1,12,1,6,1,10,2,16,8,6,1,8,3,14,1,14, 1,10,1,6,1,6,1,4,2,8,3,10,2,2,1,14, @@ -996,7 +996,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,77,65,67,72,73,78,69,41,2,218,3,99,108,115,114, 7,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,14,95,111,112,101,110,95,114,101,103,105,115, - 116,114,121,205,2,0,0,115,10,0,0,0,2,2,16,1, + 116,114,121,206,2,0,0,115,10,0,0,0,2,2,16,1, 12,1,20,1,255,128,122,36,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,2,0,0, @@ -1023,7 +1023,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,107,101,121,114,7,0,0,0,90,4,104,107,101,121,218, 8,102,105,108,101,112,97,116,104,114,5,0,0,0,114,5, 0,0,0,114,8,0,0,0,218,16,95,115,101,97,114,99, - 104,95,114,101,103,105,115,116,114,121,212,2,0,0,115,26, + 104,95,114,101,103,105,115,116,114,121,213,2,0,0,115,26, 0,0,0,6,2,8,1,6,2,6,1,16,1,6,255,2, 2,12,1,46,1,12,1,8,1,4,1,255,128,122,38,87, 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, @@ -1046,7 +1046,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,116,114,199,0,0,0,114,140,0,0,0,114,189,0,0, 0,114,187,0,0,0,114,5,0,0,0,114,5,0,0,0, 114,8,0,0,0,218,9,102,105,110,100,95,115,112,101,99, - 227,2,0,0,115,32,0,0,0,10,2,8,1,4,1,2, + 228,2,0,0,115,32,0,0,0,10,2,8,1,4,1,2, 1,12,1,12,1,8,1,14,1,14,1,6,1,8,1,2, 1,6,254,8,3,4,128,255,128,122,31,87,105,110,100,111, 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, @@ -1065,7 +1065,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,169,4,114,193,0,0,0,114,139,0,0,0,114, 44,0,0,0,114,187,0,0,0,114,5,0,0,0,114,5, 0,0,0,114,8,0,0,0,218,11,102,105,110,100,95,109, - 111,100,117,108,101,243,2,0,0,115,10,0,0,0,12,7, + 111,100,117,108,101,244,2,0,0,115,10,0,0,0,12,7, 8,1,6,1,4,2,255,128,122,33,87,105,110,100,111,119, 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, 102,105,110,100,95,109,111,100,117,108,101,41,2,78,78,41, @@ -1075,7 +1075,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,104,111,100,114,194,0,0,0,114,200,0,0,0,114,203, 0,0,0,114,206,0,0,0,114,5,0,0,0,114,5,0, 0,0,114,5,0,0,0,114,8,0,0,0,114,191,0,0, - 0,193,2,0,0,115,32,0,0,0,8,0,4,2,2,3, + 0,194,2,0,0,115,32,0,0,0,8,0,4,2,2,3, 2,255,2,4,2,255,4,3,2,2,10,1,2,6,10,1, 2,14,12,1,2,15,16,1,255,128,114,191,0,0,0,99, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1111,7 +1111,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,96,0,0,0,90,13,102,105,108,101,110,97,109, 101,95,98,97,115,101,90,9,116,97,105,108,95,110,97,109, 101,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,182,0,0,0,6,3,0,0,115,10,0,0,0,18,3, + 114,182,0,0,0,7,3,0,0,115,10,0,0,0,18,3, 16,1,14,1,16,1,255,128,122,24,95,76,111,97,100,101, 114,66,97,115,105,99,115,46,105,115,95,112,97,99,107,97, 103,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, @@ -1122,7 +1122,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,46,78,114,5,0,0,0,169,2,114,118,0,0,0,114, 187,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,13,99,114,101,97,116,101,95,109,111,100,117, - 108,101,14,3,0,0,115,4,0,0,0,4,128,255,128,122, + 108,101,15,3,0,0,115,4,0,0,0,4,128,255,128,122, 27,95,76,111,97,100,101,114,66,97,115,105,99,115,46,99, 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, @@ -1142,7 +1142,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,114,131,0,0,0,41,3,114,118,0,0,0,218,6,109, 111,100,117,108,101,114,164,0,0,0,114,5,0,0,0,114, 5,0,0,0,114,8,0,0,0,218,11,101,120,101,99,95, - 109,111,100,117,108,101,17,3,0,0,115,16,0,0,0,12, + 109,111,100,117,108,101,18,3,0,0,115,16,0,0,0,12, 2,8,1,6,1,4,1,6,255,16,2,4,128,255,128,122, 25,95,76,111,97,100,101,114,66,97,115,105,99,115,46,101, 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, @@ -1154,14 +1154,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,109,111,100,117,108,101,95,115,104,105,109,169,2,114,118, 0,0,0,114,139,0,0,0,114,5,0,0,0,114,5,0, 0,0,114,8,0,0,0,218,11,108,111,97,100,95,109,111, - 100,117,108,101,25,3,0,0,115,4,0,0,0,12,2,255, + 100,117,108,101,26,3,0,0,115,4,0,0,0,12,2,255, 128,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114, 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, 0,0,0,114,182,0,0,0,114,212,0,0,0,114,217,0, 0,0,114,220,0,0,0,114,5,0,0,0,114,5,0,0, 0,114,5,0,0,0,114,8,0,0,0,114,208,0,0,0, - 1,3,0,0,115,14,0,0,0,8,0,4,2,8,3,8, + 2,3,0,0,115,14,0,0,0,8,0,4,2,8,3,8, 8,8,3,12,8,255,128,114,208,0,0,0,99,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, 0,64,0,0,0,115,74,0,0,0,101,0,90,1,100,0, @@ -1186,7 +1186,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,78,41,1,114,50,0,0,0,169,2,114,118,0, 0,0,114,44,0,0,0,114,5,0,0,0,114,5,0,0, 0,114,8,0,0,0,218,10,112,97,116,104,95,109,116,105, - 109,101,32,3,0,0,115,6,0,0,0,4,6,4,128,255, + 109,101,33,3,0,0,115,6,0,0,0,4,6,4,128,255, 128,122,23,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,0,0,0,0,2,0,0,0,4,0,0,0,67, @@ -1220,7 +1220,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,46,10,32,32,32,32,32,32,32,32,114,169,0,0,0, 41,1,114,223,0,0,0,114,222,0,0,0,114,5,0,0, 0,114,5,0,0,0,114,8,0,0,0,218,10,112,97,116, - 104,95,115,116,97,116,115,40,3,0,0,115,4,0,0,0, + 104,95,115,116,97,116,115,41,3,0,0,115,4,0,0,0, 14,12,255,128,122,23,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,0,0,0,0,4,0,0,0,4,0, @@ -1244,7 +1244,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,107,0,0,0,90,10,99,97,99,104,101,95,112, 97,116,104,114,26,0,0,0,114,5,0,0,0,114,5,0, 0,0,114,8,0,0,0,218,15,95,99,97,99,104,101,95, - 98,121,116,101,99,111,100,101,54,3,0,0,115,4,0,0, + 98,121,116,101,99,111,100,101,55,3,0,0,115,4,0,0, 0,12,8,255,128,122,28,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,0,0,0,0, @@ -1261,7 +1261,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,78, 114,5,0,0,0,41,3,114,118,0,0,0,114,44,0,0, 0,114,26,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,225,0,0,0,64,3,0,0,115,4, + 114,8,0,0,0,114,225,0,0,0,65,3,0,0,115,4, 0,0,0,4,128,255,128,122,21,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,0,0,0,0,5,0,0,0,10, @@ -1282,7 +1282,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,176,0,0,0,41,5,114,118,0,0,0,114,139, 0,0,0,114,44,0,0,0,114,174,0,0,0,218,3,101, 120,99,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,10,103,101,116,95,115,111,117,114,99,101,71,3,0, + 0,218,10,103,101,116,95,115,111,117,114,99,101,72,3,0, 0,115,24,0,0,0,10,2,2,1,14,1,14,1,4,1, 2,1,4,255,2,1,6,255,18,128,8,2,255,128,122,23, 83,111,117,114,99,101,76,111,97,100,101,114,46,103,101,116, @@ -1305,7 +1305,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 105,108,101,41,4,114,118,0,0,0,114,26,0,0,0,114, 44,0,0,0,114,230,0,0,0,114,5,0,0,0,114,5, 0,0,0,114,8,0,0,0,218,14,115,111,117,114,99,101, - 95,116,111,95,99,111,100,101,81,3,0,0,115,8,0,0, + 95,116,111,95,99,111,100,101,82,3,0,0,115,8,0,0, 0,12,5,4,1,6,255,255,128,122,27,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,0, @@ -1382,7 +1382,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,151,0,0,0,114,2,0,0,0,90,10,98,121,116, 101,115,95,100,97,116,97,90,11,99,111,100,101,95,111,98, 106,101,99,116,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,213,0,0,0,89,3,0,0,115,154,0,0, + 0,0,0,114,213,0,0,0,90,3,0,0,115,154,0,0, 0,10,7,4,1,4,1,4,1,4,1,4,1,2,1,12, 1,12,1,12,1,2,2,14,1,12,1,8,1,12,2,2, 1,14,1,12,1,6,1,2,3,2,1,6,254,2,4,12, @@ -1399,7 +1399,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,225,0,0,0,114,229,0,0,0,114,233,0, 0,0,114,213,0,0,0,114,5,0,0,0,114,5,0,0, 0,114,5,0,0,0,114,8,0,0,0,114,221,0,0,0, - 30,3,0,0,115,18,0,0,0,8,0,8,2,8,8,8, + 31,3,0,0,115,18,0,0,0,8,0,8,2,8,8,8, 14,8,10,8,7,14,10,12,8,255,128,114,221,0,0,0, 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,4,0,0,0,0,0,0,0,115,92,0,0,0,101,0, @@ -1426,7 +1426,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,32,32,102,105,110,100,101,114,46,78,114, 159,0,0,0,41,3,114,118,0,0,0,114,139,0,0,0, 114,44,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,209,0,0,0,179,3,0,0,115,8,0, + 8,0,0,0,114,209,0,0,0,180,3,0,0,115,8,0, 0,0,6,3,6,1,4,128,255,128,122,19,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,0,0,0,0,2,0,0,0, @@ -1436,7 +1436,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,108,97,115,115,95,95,114,131,0,0,0,169,2,114,118, 0,0,0,90,5,111,116,104,101,114,114,5,0,0,0,114, 5,0,0,0,114,8,0,0,0,218,6,95,95,101,113,95, - 95,185,3,0,0,115,8,0,0,0,12,1,10,1,2,255, + 95,186,3,0,0,115,8,0,0,0,12,1,10,1,2,255, 255,128,122,17,70,105,108,101,76,111,97,100,101,114,46,95, 95,101,113,95,95,99,1,0,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,20, @@ -1444,7 +1444,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 2,131,1,65,0,83,0,114,109,0,0,0,169,3,218,4, 104,97,115,104,114,116,0,0,0,114,44,0,0,0,169,1, 114,118,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,8,95,95,104,97,115,104,95,95,189,3, + 8,0,0,0,218,8,95,95,104,97,115,104,95,95,190,3, 0,0,115,4,0,0,0,20,1,255,128,122,19,70,105,108, 101,76,111,97,100,101,114,46,95,95,104,97,115,104,95,95, 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, @@ -1459,7 +1459,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,32,41,3,218,5,115,117,112,101,114,114, 239,0,0,0,114,220,0,0,0,114,219,0,0,0,169,1, 114,241,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 220,0,0,0,192,3,0,0,115,4,0,0,0,16,10,255, + 220,0,0,0,193,3,0,0,115,4,0,0,0,16,10,255, 128,122,22,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, @@ -1469,7 +1469,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 105,108,101,32,97,115,32,102,111,117,110,100,32,98,121,32, 116,104,101,32,102,105,110,100,101,114,46,114,48,0,0,0, 114,219,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,179,0,0,0,204,3,0,0,115,4,0, + 8,0,0,0,114,179,0,0,0,205,3,0,0,115,4,0, 0,0,6,3,255,128,122,23,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,0,0,0,0,3,0,0,0, @@ -1491,7 +1491,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 90,4,114,101,97,100,114,65,0,0,0,41,3,114,118,0, 0,0,114,44,0,0,0,114,68,0,0,0,114,5,0,0, 0,114,5,0,0,0,114,8,0,0,0,114,227,0,0,0, - 209,3,0,0,115,14,0,0,0,14,2,16,1,40,1,14, + 210,3,0,0,115,14,0,0,0,14,2,16,1,40,1,14, 2,38,1,4,128,255,128,122,19,70,105,108,101,76,111,97, 100,101,114,46,103,101,116,95,100,97,116,97,99,2,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0, @@ -1503,7 +1503,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,118,0,0,0,114,216,0,0,0,114,253,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,19, 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, - 100,101,114,218,3,0,0,115,6,0,0,0,12,2,8,1, + 100,101,114,219,3,0,0,115,6,0,0,0,12,2,8,1, 255,128,122,30,70,105,108,101,76,111,97,100,101,114,46,103, 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, 101,114,41,13,114,125,0,0,0,114,124,0,0,0,114,126, @@ -1512,7 +1512,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,179,0,0,0,114,227,0,0,0,114,254,0,0,0, 90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,114, 5,0,0,0,114,5,0,0,0,114,249,0,0,0,114,8, - 0,0,0,114,239,0,0,0,174,3,0,0,115,26,0,0, + 0,0,0,114,239,0,0,0,175,3,0,0,115,26,0,0, 0,8,0,4,2,8,3,8,6,8,4,2,3,14,1,2, 11,10,1,8,4,2,9,18,1,255,128,114,239,0,0,0, 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1535,7 +1535,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,109,116,105,109,101,90,7,115,116,95,115,105,122,101,41, 3,114,118,0,0,0,114,44,0,0,0,114,238,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 224,0,0,0,228,3,0,0,115,6,0,0,0,8,2,14, + 224,0,0,0,229,3,0,0,115,6,0,0,0,8,2,14, 1,255,128,122,27,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,0,0,0,0,0,5,0,0, @@ -1545,7 +1545,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,101,41,2,114,114,0,0,0,114,225,0,0,0,41,5, 114,118,0,0,0,114,107,0,0,0,114,106,0,0,0,114, 26,0,0,0,114,52,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,226,0,0,0,233,3,0, + 0,0,0,114,8,0,0,0,114,226,0,0,0,234,3,0, 0,115,6,0,0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,60, @@ -1580,7 +1580,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,26,0,0,0,114,2,1,0,0,218,6,112,97,114, 101,110,116,114,96,0,0,0,114,37,0,0,0,114,33,0, 0,0,114,228,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,225,0,0,0,238,3,0,0,115, + 0,114,8,0,0,0,114,225,0,0,0,239,3,0,0,115, 52,0,0,0,12,2,4,1,12,2,12,1,12,1,12,2, 10,1,2,1,14,1,12,1,8,2,14,1,6,3,4,1, 4,255,16,2,10,128,2,1,12,1,16,1,14,1,8,2, @@ -1590,7 +1590,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,126,0,0,0,114,127,0,0,0,114,224,0,0,0,114, 226,0,0,0,114,225,0,0,0,114,5,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,255,0, - 0,0,224,3,0,0,115,12,0,0,0,8,0,4,2,8, + 0,0,225,3,0,0,115,12,0,0,0,8,0,4,2,8, 2,8,5,18,5,255,128,114,255,0,0,0,99,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, 0,64,0,0,0,115,32,0,0,0,101,0,90,1,100,0, @@ -1612,7 +1612,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,235,0,0,0,41,5,114,118,0,0,0,114,139, 0,0,0,114,44,0,0,0,114,26,0,0,0,114,151,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,213,0,0,0,17,4,0,0,115,24,0,0,0,10, + 0,114,213,0,0,0,18,4,0,0,115,24,0,0,0,10, 1,10,1,2,4,2,1,6,254,12,4,2,1,14,1,2, 1,2,1,6,253,255,128,122,29,83,111,117,114,99,101,108, 101,115,115,70,105,108,101,76,111,97,100,101,114,46,103,101, @@ -1623,13 +1623,13 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,105,115,32,110,111,32,115,111,117,114,99,101,32,99,111, 100,101,46,78,114,5,0,0,0,114,219,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,229,0, - 0,0,33,4,0,0,115,4,0,0,0,4,2,255,128,122, + 0,0,34,4,0,0,115,4,0,0,0,4,2,255,128,122, 31,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,41,6,114,125,0,0,0,114,124,0,0,0,114,126,0, 0,0,114,127,0,0,0,114,213,0,0,0,114,229,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,5,1,0,0,13,4,0,0,115,10, + 114,8,0,0,0,114,5,1,0,0,14,4,0,0,115,10, 0,0,0,8,0,4,2,8,2,12,16,255,128,114,5,1, 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,3,0,0,0,64,0,0,0,115,92,0,0,0, @@ -1650,7 +1650,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0, 114,109,0,0,0,114,159,0,0,0,41,3,114,118,0,0, 0,114,116,0,0,0,114,44,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,50, + 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,51, 4,0,0,115,8,0,0,0,6,1,6,1,4,128,255,128, 122,28,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, @@ -1659,7 +1659,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,1,106,0,107,2,111,22,124,0,106,1,124,1,106,1, 107,2,83,0,114,109,0,0,0,114,240,0,0,0,114,242, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,243,0,0,0,54,4,0,0,115,8,0,0,0, + 0,0,114,243,0,0,0,55,4,0,0,115,8,0,0,0, 12,1,10,1,2,255,255,128,122,26,69,120,116,101,110,115, 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95, 101,113,95,95,99,1,0,0,0,0,0,0,0,0,0,0, @@ -1667,7 +1667,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,116,0,124,0,106,1,131,1,116,0,124,0,106,2, 131,1,65,0,83,0,114,109,0,0,0,114,244,0,0,0, 114,246,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,247,0,0,0,58,4,0,0,115,4,0, + 8,0,0,0,114,247,0,0,0,59,4,0,0,115,4,0, 0,0,20,1,255,128,122,28,69,120,116,101,110,115,105,111, 110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97, 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0, @@ -1684,7 +1684,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,95,100,121,110,97,109,105,99,114,149,0,0,0,114,116, 0,0,0,114,44,0,0,0,41,3,114,118,0,0,0,114, 187,0,0,0,114,216,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,212,0,0,0,61,4,0, + 0,0,0,114,8,0,0,0,114,212,0,0,0,62,4,0, 0,115,16,0,0,0,4,2,6,1,4,255,6,2,8,1, 4,255,4,2,255,128,122,33,69,120,116,101,110,115,105,111, 110,70,105,108,101,76,111,97,100,101,114,46,99,114,101,97, @@ -1702,7 +1702,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,121,110,97,109,105,99,114,149,0,0,0,114,116,0,0, 0,114,44,0,0,0,169,2,114,118,0,0,0,114,216,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,217,0,0,0,69,4,0,0,115,12,0,0,0,14, + 0,114,217,0,0,0,70,4,0,0,115,12,0,0,0,14, 2,6,1,8,1,4,255,4,128,255,128,122,31,69,120,116, 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, @@ -1720,7 +1720,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 41,2,114,209,0,0,0,78,114,5,0,0,0,169,2,114, 32,0,0,0,218,6,115,117,102,102,105,120,169,1,90,9, 102,105,108,101,95,110,97,109,101,114,5,0,0,0,114,8, - 0,0,0,218,9,60,103,101,110,101,120,112,114,62,78,4, + 0,0,0,218,9,60,103,101,110,101,120,112,114,62,79,4, 0,0,115,10,0,0,0,4,0,2,1,16,255,4,128,255, 128,122,49,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, @@ -1729,7 +1729,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 218,3,97,110,121,218,18,69,88,84,69,78,83,73,79,78, 95,83,85,70,70,73,88,69,83,114,219,0,0,0,114,5, 0,0,0,114,9,1,0,0,114,8,0,0,0,114,182,0, - 0,0,75,4,0,0,115,10,0,0,0,14,2,12,1,2, + 0,0,76,4,0,0,115,10,0,0,0,14,2,12,1,2, 1,8,255,255,128,122,30,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,0,0, @@ -1740,7 +1740,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,110,111,116,32,99,114,101,97,116,101,32,97,32,99,111, 100,101,32,111,98,106,101,99,116,46,78,114,5,0,0,0, 114,219,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,213,0,0,0,81,4,0,0,115,4,0, + 8,0,0,0,114,213,0,0,0,82,4,0,0,115,4,0, 0,0,4,2,255,128,122,28,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,0,0,0, @@ -1750,7 +1750,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,110,32,109,111,100,117,108,101,115,32,104,97,118,101,32, 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, 114,5,0,0,0,114,219,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,229,0,0,0,85,4, + 5,0,0,0,114,8,0,0,0,114,229,0,0,0,86,4, 0,0,115,4,0,0,0,4,2,255,128,122,30,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,99,2,0,0,0, @@ -1758,7 +1758,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,114, 250,0,0,0,114,48,0,0,0,114,219,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,179,0, - 0,0,89,4,0,0,115,4,0,0,0,6,3,255,128,122, + 0,0,90,4,0,0,115,4,0,0,0,6,3,255,128,122, 32,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, 97,100,101,114,46,103,101,116,95,102,105,108,101,110,97,109, 101,78,41,14,114,125,0,0,0,114,124,0,0,0,114,126, @@ -1767,7 +1767,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,182,0,0,0,114,213,0,0,0,114,229,0,0,0, 114,136,0,0,0,114,179,0,0,0,114,5,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,252, - 0,0,0,42,4,0,0,115,26,0,0,0,8,0,4,2, + 0,0,0,43,4,0,0,115,26,0,0,0,8,0,4,2, 8,6,8,4,8,4,8,3,8,8,8,6,8,6,8,4, 2,4,14,1,255,128,114,252,0,0,0,99,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, @@ -1809,7 +1809,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 12,95,112,97,116,104,95,102,105,110,100,101,114,169,4,114, 118,0,0,0,114,116,0,0,0,114,44,0,0,0,90,11, 112,97,116,104,95,102,105,110,100,101,114,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,102, + 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,103, 4,0,0,115,12,0,0,0,6,1,6,1,14,1,6,1, 4,128,255,128,122,23,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, @@ -1827,7 +1827,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 4,114,118,0,0,0,114,4,1,0,0,218,3,100,111,116, 90,2,109,101,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,23,95,102,105,110,100,95,112,97,114,101,110, - 116,95,112,97,116,104,95,110,97,109,101,115,108,4,0,0, + 116,95,112,97,116,104,95,110,97,109,101,115,109,4,0,0, 115,10,0,0,0,18,2,8,1,4,2,8,3,255,128,122, 38,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, @@ -1840,7 +1840,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 41,3,114,118,0,0,0,90,18,112,97,114,101,110,116,95, 109,111,100,117,108,101,95,110,97,109,101,90,14,112,97,116, 104,95,97,116,116,114,95,110,97,109,101,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,16,1,0,0,118, + 114,5,0,0,0,114,8,0,0,0,114,16,1,0,0,119, 4,0,0,115,6,0,0,0,12,1,16,1,255,128,122,31, 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, @@ -1857,7 +1857,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,90,11,112,97,114,101,110,116,95,112,97,116,104, 114,187,0,0,0,114,5,0,0,0,114,5,0,0,0,114, 8,0,0,0,218,12,95,114,101,99,97,108,99,117,108,97, - 116,101,122,4,0,0,115,18,0,0,0,12,2,10,1,14, + 116,101,123,4,0,0,115,18,0,0,0,12,2,10,1,14, 1,18,3,6,1,8,1,6,1,6,1,255,128,122,27,95, 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,114, 101,99,97,108,99,117,108,97,116,101,99,1,0,0,0,0, @@ -1866,7 +1866,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 131,1,83,0,114,109,0,0,0,41,2,218,4,105,116,101, 114,114,23,1,0,0,114,246,0,0,0,114,5,0,0,0, 114,5,0,0,0,114,8,0,0,0,218,8,95,95,105,116, - 101,114,95,95,135,4,0,0,115,4,0,0,0,12,1,255, + 101,114,95,95,136,4,0,0,115,4,0,0,0,12,1,255, 128,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116, 104,46,95,95,105,116,101,114,95,95,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67, @@ -1874,7 +1874,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 25,0,83,0,114,109,0,0,0,169,1,114,23,1,0,0, 41,2,114,118,0,0,0,218,5,105,110,100,101,120,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,218,11,95, - 95,103,101,116,105,116,101,109,95,95,138,4,0,0,115,4, + 95,103,101,116,105,116,101,109,95,95,139,4,0,0,115,4, 0,0,0,12,1,255,128,122,26,95,78,97,109,101,115,112, 97,99,101,80,97,116,104,46,95,95,103,101,116,105,116,101, 109,95,95,99,3,0,0,0,0,0,0,0,0,0,0,0, @@ -1883,7 +1883,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 109,0,0,0,41,1,114,15,1,0,0,41,3,114,118,0, 0,0,114,27,1,0,0,114,44,0,0,0,114,5,0,0, 0,114,5,0,0,0,114,8,0,0,0,218,11,95,95,115, - 101,116,105,116,101,109,95,95,141,4,0,0,115,6,0,0, + 101,116,105,116,101,109,95,95,142,4,0,0,115,6,0,0, 0,10,1,4,128,255,128,122,26,95,78,97,109,101,115,112, 97,99,101,80,97,116,104,46,95,95,115,101,116,105,116,101, 109,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, @@ -1891,7 +1891,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,116,0,124,0,160,1,161,0,131,1,83,0,114,109,0, 0,0,41,2,114,23,0,0,0,114,23,1,0,0,114,246, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,7,95,95,108,101,110,95,95,144,4,0,0,115, + 0,0,218,7,95,95,108,101,110,95,95,145,4,0,0,115, 4,0,0,0,12,1,255,128,122,22,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,0,0,0,0,1,0,0, @@ -1900,7 +1900,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, 114,125,41,41,2,114,62,0,0,0,114,15,1,0,0,114, 246,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,8,95,95,114,101,112,114,95,95,147,4,0, + 0,0,0,218,8,95,95,114,101,112,114,95,95,148,4,0, 0,115,4,0,0,0,12,1,255,128,122,23,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,0,0,0,0, @@ -1909,7 +1909,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,26,1,0,0,169,2,114,118,0,0,0,218,4, 105,116,101,109,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, - 95,150,4,0,0,115,4,0,0,0,12,1,255,128,122,27, + 95,151,4,0,0,115,4,0,0,0,12,1,255,128,122,27, 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,0,0,0,0,2,0,0,0,3,0,0,0, @@ -1917,7 +1917,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,161,1,1,0,100,0,83,0,114,109,0,0,0,41,2, 114,15,1,0,0,114,186,0,0,0,114,32,1,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,186, - 0,0,0,153,4,0,0,115,6,0,0,0,12,1,4,128, + 0,0,0,154,4,0,0,115,6,0,0,0,12,1,4,128, 255,128,122,21,95,78,97,109,101,115,112,97,99,101,80,97, 116,104,46,97,112,112,101,110,100,78,41,15,114,125,0,0, 0,114,124,0,0,0,114,126,0,0,0,114,127,0,0,0, @@ -1926,7 +1926,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,0,0,114,30,1,0,0,114,31,1,0,0,114,34,1, 0,0,114,186,0,0,0,114,5,0,0,0,114,5,0,0, 0,114,5,0,0,0,114,8,0,0,0,114,13,1,0,0, - 95,4,0,0,115,28,0,0,0,8,0,4,1,8,6,8, + 96,4,0,0,115,28,0,0,0,8,0,4,1,8,6,8, 6,8,10,8,4,8,13,8,3,8,3,8,3,8,3,8, 3,12,3,255,128,114,13,1,0,0,99,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, @@ -1942,7 +1942,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,3,131,3,124,0,95,1,100,0,83,0,114,109,0,0, 0,41,2,114,13,1,0,0,114,15,1,0,0,114,19,1, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,209,0,0,0,159,4,0,0,115,6,0,0,0,14, + 0,114,209,0,0,0,160,4,0,0,115,6,0,0,0,14, 1,4,128,255,128,122,25,95,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,0,0,0,0,2,0,0, @@ -1960,13 +1960,13 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,125,0,0,0,41,2,114,193,0,0,0,114, 216,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,11,109,111,100,117,108,101,95,114,101,112,114, - 162,4,0,0,115,4,0,0,0,12,7,255,128,122,28,95, + 163,4,0,0,115,4,0,0,0,12,7,255,128,122,28,95, 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,0,0,0,0,2,0,0,0,1,0,0,0, 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,78, 84,114,5,0,0,0,114,219,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,182,0,0,0,171, + 114,5,0,0,0,114,8,0,0,0,114,182,0,0,0,172, 4,0,0,115,4,0,0,0,4,1,255,128,122,27,95,78, 97,109,101,115,112,97,99,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, @@ -1974,7 +1974,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,40, 0,0,0,114,5,0,0,0,114,219,0,0,0,114,5,0, 0,0,114,5,0,0,0,114,8,0,0,0,114,229,0,0, - 0,174,4,0,0,115,4,0,0,0,4,1,255,128,122,27, + 0,175,4,0,0,115,4,0,0,0,4,1,255,128,122,27, 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, 46,103,101,116,95,115,111,117,114,99,101,99,2,0,0,0, 0,0,0,0,0,0,0,0,2,0,0,0,6,0,0,0, @@ -1983,21 +1983,21 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,122,8,60,115,116,114,105,110,103,62,114,215,0,0,0, 84,41,1,114,231,0,0,0,41,1,114,232,0,0,0,114, 219,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,213,0,0,0,177,4,0,0,115,4,0,0, + 0,0,0,114,213,0,0,0,178,4,0,0,115,4,0,0, 0,16,1,255,128,122,25,95,78,97,109,101,115,112,97,99, 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,0,0,0,0,2,0,0, 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, 83,0,114,210,0,0,0,114,5,0,0,0,114,211,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,212,0,0,0,180,4,0,0,115,4,0,0,0,4,128, + 114,212,0,0,0,181,4,0,0,115,4,0,0,0,4,128, 255,128,122,30,95,78,97,109,101,115,112,97,99,101,76,111, 97,100,101,114,46,99,114,101,97,116,101,95,109,111,100,117, 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, 100,0,83,0,114,109,0,0,0,114,5,0,0,0,114,6, 1,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,217,0,0,0,183,4,0,0,115,6,0,0,0, + 0,0,114,217,0,0,0,184,4,0,0,115,6,0,0,0, 2,1,2,128,255,128,122,28,95,78,97,109,101,115,112,97, 99,101,76,111,97,100,101,114,46,101,120,101,99,95,109,111, 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, @@ -2015,7 +2015,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,112,97,116,104,32,123,33,114,125,41,4,114,134,0,0, 0,114,149,0,0,0,114,15,1,0,0,114,218,0,0,0, 114,219,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,220,0,0,0,186,4,0,0,115,10,0, + 8,0,0,0,114,220,0,0,0,187,4,0,0,115,10,0, 0,0,6,7,4,1,4,255,12,2,255,128,122,28,95,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,41,12,114,125,0, @@ -2024,7 +2024,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,229,0,0,0,114,213,0,0,0,114,212,0,0,0,114, 217,0,0,0,114,220,0,0,0,114,5,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,35,1, - 0,0,158,4,0,0,115,22,0,0,0,8,0,8,1,2, + 0,0,159,4,0,0,115,22,0,0,0,8,0,8,1,2, 3,10,1,8,8,8,3,8,3,8,3,8,3,12,3,255, 128,114,35,1,0,0,99,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, @@ -2061,7 +2061,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,101,109,115,114,128,0,0,0,114,38,1,0,0,41,3, 114,193,0,0,0,114,116,0,0,0,218,6,102,105,110,100, 101,114,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,38,1,0,0,204,4,0,0,115,14,0,0,0,22, + 0,114,38,1,0,0,205,4,0,0,115,14,0,0,0,22, 4,8,1,10,1,10,1,10,1,4,128,255,128,122,28,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, @@ -2081,7 +2081,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,138,0,0,0,114,117,0,0,0,41,3,114,193, 0,0,0,114,44,0,0,0,90,4,104,111,111,107,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,218,11,95, - 112,97,116,104,95,104,111,111,107,115,214,4,0,0,115,18, + 112,97,116,104,95,104,111,111,107,115,215,4,0,0,115,18, 0,0,0,16,3,12,1,10,1,2,1,14,1,12,1,10, 1,4,2,255,128,122,22,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, @@ -2113,7 +2113,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,0,0,41,3,114,193,0,0,0,114,44,0,0,0,114, 42,1,0,0,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,20,95,112,97,116,104,95,105,109,112,111,114, - 116,101,114,95,99,97,99,104,101,227,4,0,0,115,24,0, + 116,101,114,95,99,97,99,104,101,228,4,0,0,115,24,0, 0,0,8,8,2,1,12,1,12,1,8,3,2,1,14,1, 12,1,10,1,16,1,4,1,255,128,122,31,80,97,116,104, 70,105,110,100,101,114,46,95,112,97,116,104,95,105,109,112, @@ -2131,7 +2131,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 139,0,0,0,114,42,1,0,0,114,140,0,0,0,114,141, 0,0,0,114,187,0,0,0,114,5,0,0,0,114,5,0, 0,0,114,8,0,0,0,218,16,95,108,101,103,97,99,121, - 95,103,101,116,95,115,112,101,99,249,4,0,0,115,20,0, + 95,103,101,116,95,115,112,101,99,250,4,0,0,115,20,0, 0,0,10,4,16,1,10,2,4,1,8,1,12,1,12,1, 6,1,4,1,255,128,122,27,80,97,116,104,70,105,110,100, 101,114,46,95,108,101,103,97,99,121,95,103,101,116,95,115, @@ -2163,7 +2163,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 104,90,5,101,110,116,114,121,114,42,1,0,0,114,187,0, 0,0,114,141,0,0,0,114,5,0,0,0,114,5,0,0, 0,114,8,0,0,0,218,9,95,103,101,116,95,115,112,101, - 99,8,5,0,0,115,42,0,0,0,4,5,8,1,14,1, + 99,9,5,0,0,115,42,0,0,0,4,5,8,1,14,1, 2,1,10,1,8,1,10,1,14,1,12,2,8,1,2,1, 10,1,8,1,6,1,8,1,8,1,12,5,12,2,6,1, 4,1,255,128,122,20,80,97,116,104,70,105,110,100,101,114, @@ -2190,7 +2190,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 193,0,0,0,114,139,0,0,0,114,44,0,0,0,114,202, 0,0,0,114,187,0,0,0,114,50,1,0,0,114,5,0, 0,0,114,5,0,0,0,114,8,0,0,0,114,203,0,0, - 0,40,5,0,0,115,28,0,0,0,8,6,6,1,14,1, + 0,41,5,0,0,115,28,0,0,0,8,6,6,1,14,1, 8,1,4,1,10,1,6,1,4,1,6,3,16,1,4,1, 4,2,4,2,255,128,122,20,80,97,116,104,70,105,110,100, 101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,0, @@ -2210,7 +2210,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, 32,32,32,32,32,32,78,114,204,0,0,0,114,205,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,206,0,0,0,64,5,0,0,115,10,0,0,0,12,8, + 114,206,0,0,0,65,5,0,0,115,10,0,0,0,12,8, 8,1,4,1,6,1,255,128,122,22,80,97,116,104,70,105, 110,100,101,114,46,102,105,110,100,95,109,111,100,117,108,101, 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0, @@ -2242,7 +2242,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,116,114,105,98,117,116,105,111,110,115,41,4,114,193,0, 0,0,114,119,0,0,0,114,120,0,0,0,114,52,1,0, 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,53,1,0,0,77,5,0,0,115,6,0,0,0,12,10, + 114,53,1,0,0,78,5,0,0,115,6,0,0,0,12,10, 16,1,255,128,122,29,80,97,116,104,70,105,110,100,101,114, 46,102,105,110,100,95,100,105,115,116,114,105,98,117,116,105, 111,110,115,41,1,78,41,2,78,78,41,1,78,41,13,114, @@ -2251,7 +2251,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,47,1,0,0,114,48,1,0,0,114,51,1,0, 0,114,203,0,0,0,114,206,0,0,0,114,53,1,0,0, 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,37,1,0,0,200,4,0,0,115,38,0, + 8,0,0,0,114,37,1,0,0,201,4,0,0,115,38,0, 0,0,8,0,4,2,2,2,10,1,2,9,10,1,2,12, 10,1,2,21,10,1,2,14,12,1,2,31,12,1,2,23, 12,1,2,12,14,1,255,128,114,37,1,0,0,99,0,0, @@ -2296,7 +2296,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,93,14,125,1,124,1,136,0,102,2,86,0,1,0,113, 2,100,0,83,0,114,109,0,0,0,114,5,0,0,0,114, 7,1,0,0,169,1,114,140,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,10,1,0,0,106,5,0,0,115,6, + 114,8,0,0,0,114,10,1,0,0,107,5,0,0,115,6, 0,0,0,18,0,4,128,255,128,122,38,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, @@ -2309,7 +2309,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,218,14,108,111,97,100,101,114,95,100,101,116,97,105, 108,115,90,7,108,111,97,100,101,114,115,114,189,0,0,0, 114,5,0,0,0,114,55,1,0,0,114,8,0,0,0,114, - 209,0,0,0,100,5,0,0,115,20,0,0,0,4,4,12, + 209,0,0,0,101,5,0,0,115,20,0,0,0,4,4,12, 1,26,1,6,1,10,2,6,1,8,1,8,1,4,128,255, 128,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, @@ -2319,7 +2319,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,100,105,114,101,99,116,111,114,121,32,109,116,105,109,101, 46,114,104,0,0,0,78,41,1,114,57,1,0,0,114,246, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,38,1,0,0,114,5,0,0,115,6,0,0,0, + 0,0,114,38,1,0,0,115,5,0,0,115,6,0,0,0, 6,2,4,128,255,128,122,28,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,0,0,0,0,0,0,0, @@ -2342,7 +2342,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,78,41,3,114,203,0,0,0,114,140,0, 0,0,114,178,0,0,0,41,3,114,118,0,0,0,114,139, 0,0,0,114,187,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,137,0,0,0,120,5,0,0, + 0,0,114,8,0,0,0,114,137,0,0,0,121,5,0,0, 115,10,0,0,0,10,7,8,1,8,1,16,1,255,128,122, 22,70,105,108,101,70,105,110,100,101,114,46,102,105,110,100, 95,108,111,97,100,101,114,99,6,0,0,0,0,0,0,0, @@ -2353,7 +2353,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,118,0,0,0,114,188,0,0,0,114,139,0,0,0,114, 44,0,0,0,90,4,115,109,115,108,114,202,0,0,0,114, 140,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,51,1,0,0,132,5,0,0,115,10,0,0, + 0,0,0,114,51,1,0,0,133,5,0,0,115,10,0,0, 0,10,1,8,1,2,1,6,255,255,128,122,20,70,105,108, 101,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, 99,78,99,3,0,0,0,0,0,0,0,0,0,0,0,14, @@ -2407,7 +2407,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 104,114,8,1,0,0,114,188,0,0,0,90,13,105,110,105, 116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,108, 95,112,97,116,104,114,187,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,203,0,0,0,137,5, + 5,0,0,0,114,8,0,0,0,114,203,0,0,0,138,5, 0,0,115,74,0,0,0,4,5,14,1,2,1,24,1,12, 1,10,1,10,1,8,1,6,1,6,2,6,1,10,1,6, 2,4,1,8,2,12,1,14,1,8,1,10,1,8,1,24, @@ -2439,7 +2439,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 160,0,161,0,146,2,113,4,83,0,114,5,0,0,0,41, 1,114,105,0,0,0,41,2,114,32,0,0,0,90,2,102, 110,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,9,60,115,101,116,99,111,109,112,62,214,5,0,0,115, + 218,9,60,115,101,116,99,111,109,112,62,215,5,0,0,115, 4,0,0,0,20,0,255,128,122,41,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,115,101,116,99,111, @@ -2456,7 +2456,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 102,105,120,95,99,111,110,116,101,110,116,115,114,33,1,0, 0,114,116,0,0,0,114,20,1,0,0,114,8,1,0,0, 90,8,110,101,119,95,110,97,109,101,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,62,1,0,0,185,5, + 5,0,0,0,114,8,0,0,0,114,62,1,0,0,186,5, 0,0,115,38,0,0,0,6,2,2,1,22,1,18,1,10, 3,12,3,12,1,6,7,8,1,16,1,4,1,18,1,4, 2,12,1,6,1,12,1,16,1,4,128,255,128,122,22,70, @@ -2495,7 +2495,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 117,0,0,0,114,48,0,0,0,169,2,114,193,0,0,0, 114,61,1,0,0,114,5,0,0,0,114,8,0,0,0,218, 24,112,97,116,104,95,104,111,111,107,95,102,111,114,95,70, - 105,108,101,70,105,110,100,101,114,226,5,0,0,115,8,0, + 105,108,101,70,105,110,100,101,114,227,5,0,0,115,8,0, 0,0,8,2,12,1,16,1,255,128,122,54,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, @@ -2503,7 +2503,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,114,114,5,0,0,0,41,3,114,193,0,0,0,114,61, 1,0,0,114,68,1,0,0,114,5,0,0,0,114,67,1, 0,0,114,8,0,0,0,218,9,112,97,116,104,95,104,111, - 111,107,216,5,0,0,115,6,0,0,0,14,10,4,6,255, + 111,107,217,5,0,0,115,6,0,0,0,14,10,4,6,255, 128,122,20,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, 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, @@ -2511,7 +2511,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,41,2,78,122,16,70,105,108,101,70,105,110,100,101,114, 40,123,33,114,125,41,41,2,114,62,0,0,0,114,44,0, 0,0,114,246,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,31,1,0,0,234,5,0,0,115, + 0,114,8,0,0,0,114,31,1,0,0,235,5,0,0,115, 4,0,0,0,12,1,255,128,122,19,70,105,108,101,70,105, 110,100,101,114,46,95,95,114,101,112,114,95,95,41,1,78, 41,15,114,125,0,0,0,114,124,0,0,0,114,126,0,0, @@ -2520,7 +2520,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 51,1,0,0,114,203,0,0,0,114,62,1,0,0,114,207, 0,0,0,114,69,1,0,0,114,31,1,0,0,114,5,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,54,1,0,0,91,5,0,0,115,26,0,0,0,8, + 0,114,54,1,0,0,92,5,0,0,115,26,0,0,0,8, 0,4,2,8,7,8,14,4,4,8,2,8,12,10,5,8, 48,2,31,10,1,12,17,255,128,114,54,1,0,0,99,4, 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,8, @@ -2543,7 +2543,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,90,8,112,97,116,104,110,97,109,101,90,9,99,112,97, 116,104,110,97,109,101,114,140,0,0,0,114,187,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 14,95,102,105,120,95,117,112,95,109,111,100,117,108,101,240, + 14,95,102,105,120,95,117,112,95,109,111,100,117,108,101,241, 5,0,0,115,38,0,0,0,10,2,10,1,4,1,4,1, 8,1,8,1,12,1,10,2,4,1,14,1,2,1,8,1, 8,1,8,1,12,1,12,1,6,2,4,128,255,128,114,74, @@ -2564,7 +2564,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 90,10,101,120,116,101,110,115,105,111,110,115,90,6,115,111, 117,114,99,101,90,8,98,121,116,101,99,111,100,101,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,114,184,0, - 0,0,7,6,0,0,115,10,0,0,0,12,5,8,1,8, + 0,0,8,6,0,0,115,10,0,0,0,12,5,8,1,8, 1,10,1,255,128,114,184,0,0,0,99,1,0,0,0,0, 0,0,0,0,0,0,0,10,0,0,0,9,0,0,0,67, 0,0,0,115,130,1,0,0,124,0,97,0,116,0,106,1, @@ -2612,7 +2612,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,1,83,0,41,2,114,39,0,0,0,78,41,1,114,23, 0,0,0,41,2,114,32,0,0,0,114,94,0,0,0,114, 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,10, - 1,0,0,36,6,0,0,115,6,0,0,0,22,0,4,128, + 1,0,0,37,6,0,0,115,6,0,0,0,22,0,4,128, 255,128,122,25,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,114,73,0, 0,0,122,30,105,109,112,111,114,116,108,105,98,32,114,101, @@ -2624,7 +2624,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,100,0,124,1,155,0,157,2,146,2,113,4,83,0,41, 1,114,74,0,0,0,114,5,0,0,0,41,2,114,32,0, 0,0,218,1,115,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,63,1,0,0,53,6,0,0,115,4,0, + 8,0,0,0,114,63,1,0,0,54,6,0,0,115,4,0, 0,0,22,0,255,128,122,25,95,115,101,116,117,112,46,60, 108,111,99,97,108,115,62,46,60,115,101,116,99,111,109,112, 62,41,3,114,64,0,0,0,114,75,0,0,0,114,160,0, @@ -2645,7 +2645,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,97,109,101,115,90,12,98,117,105,108,116,105,110,95,110, 97,109,101,90,14,98,117,105,108,116,105,110,95,109,111,100, 117,108,101,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,6,95,115,101,116,117,112,18,6,0,0,115,74, + 0,0,218,6,95,115,101,116,117,112,19,6,0,0,115,74, 0,0,0,4,8,6,1,6,1,10,2,22,3,12,1,22, 2,8,1,10,1,10,1,6,1,2,2,10,1,10,1,12, 1,10,1,8,2,12,2,12,1,18,1,22,1,8,3,10, @@ -2665,7 +2665,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,186,0,0,0,114,37,1,0,0,41,2,114,80,1,0, 0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,97, 100,101,114,115,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,8,95,105,110,115,116,97,108,108,75,6,0, + 0,0,0,218,8,95,105,110,115,116,97,108,108,76,6,0, 0,115,12,0,0,0,8,2,6,1,20,1,12,1,4,128, 255,128,114,83,1,0,0,41,1,114,60,0,0,0,41,1, 78,41,3,78,78,78,41,2,114,73,0,0,0,114,73,0, @@ -2699,7 +2699,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,0, 0,115,132,0,0,0,4,0,4,22,4,1,2,1,2,1, 4,255,8,4,8,17,8,5,8,5,8,6,8,6,8,12, - 8,10,8,9,8,5,8,7,10,9,10,22,0,127,16,21, + 8,10,8,9,8,5,8,7,10,9,10,22,0,127,16,22, 12,1,4,2,4,1,6,2,6,2,8,2,16,2,8,71, 8,40,8,19,8,12,8,12,8,28,8,17,8,33,8,28, 10,24,10,13,10,10,8,11,6,14,4,3,2,1,12,255, From 2c217053ad9ac5bf974d934fa98e800de778aeb1 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 12 Nov 2020 14:09:57 +0100 Subject: [PATCH 0518/1261] bpo-38823: Fix refleaks in _ctypes extension init (GH-23247) Fix reference leaks in the error path of the initialization function the _ctypes extension module: call Py_DECREF(mod) on error. Change PyCFuncPtr_Type name from _ctypes.PyCFuncPtr to _ctypes.CFuncPtr to be consistent with the name exposed in the _ctypes namespace (_ctypes.CFuncPtr). Split PyInit__ctypes() function into sub-functions and add macros for readability. --- Modules/_ctypes/_ctypes.c | 310 ++++++++++++++++++------------------- Modules/_ctypes/callproc.c | 8 +- 2 files changed, 156 insertions(+), 162 deletions(-) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 8d5594c62c4170..299070881100d3 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -125,9 +125,13 @@ PyObject *_ctypes_ptrtype_cache = NULL; static PyTypeObject Simple_Type; -/* a callable object used for unpickling */ +/* a callable object used for unpickling: + strong reference to _ctypes._unpickle() function */ static PyObject *_unpickle; +#ifdef MS_WIN32 +PyObject *ComError; // Borrowed reference to: &PyComError_Type +#endif /****************************************************************/ @@ -4307,7 +4311,7 @@ static PyNumberMethods PyCFuncPtr_as_number = { PyTypeObject PyCFuncPtr_Type = { PyVarObject_HEAD_INIT(NULL, 0) - "_ctypes.PyCFuncPtr", + "_ctypes.CFuncPtr", sizeof(PyCFuncPtrObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)PyCFuncPtr_dealloc, /* tp_dealloc */ @@ -5555,20 +5559,7 @@ static PyTypeObject PyComError_Type = { 0, /* tp_alloc */ 0, /* tp_new */ }; - - -static int -create_comerror(void) -{ - PyComError_Type.tp_base = (PyTypeObject*)PyExc_Exception; - if (PyType_Ready(&PyComError_Type) < 0) - return -1; - Py_INCREF(&PyComError_Type); - ComError = (PyObject*)&PyComError_Type; - return 0; -} - -#endif +#endif // MS_WIN32 static PyObject * string_at(const char *ptr, int size) @@ -5679,128 +5670,70 @@ wstring_at(const wchar_t *ptr, int size) static struct PyModuleDef _ctypesmodule = { PyModuleDef_HEAD_INIT, - "_ctypes", - module_docs, - -1, - _ctypes_module_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "_ctypes", + .m_doc = module_docs, + .m_size = -1, + .m_methods = _ctypes_module_methods, }; -PyMODINIT_FUNC -PyInit__ctypes(void) -{ - PyObject *m; - -/* Note: - ob_type is the metatype (the 'type'), defaults to PyType_Type, - tp_base is the base type, defaults to 'object' aka PyBaseObject_Type. -*/ - m = PyModule_Create(&_ctypesmodule); - if (!m) - return NULL; - - _ctypes_ptrtype_cache = PyDict_New(); - if (_ctypes_ptrtype_cache == NULL) - return NULL; - - PyModule_AddObject(m, "_pointer_type_cache", (PyObject *)_ctypes_ptrtype_cache); - - _unpickle = PyObject_GetAttrString(m, "_unpickle"); - if (_unpickle == NULL) - return NULL; - - if (PyType_Ready(&PyCArg_Type) < 0) - return NULL; - - if (PyType_Ready(&PyCThunk_Type) < 0) - return NULL; +static int +_ctypes_add_types(PyObject *mod) +{ +#define TYPE_READY(TYPE) \ + if (PyType_Ready(TYPE) < 0) { \ + return -1; \ + } + +#define TYPE_READY_BASE(TYPE_EXPR, TP_BASE) \ + do { \ + PyTypeObject *type = (TYPE_EXPR); \ + type->tp_base = (TP_BASE); \ + TYPE_READY(type); \ + } while (0) + +#define MOD_ADD_TYPE(TYPE_EXPR, TP_TYPE, TP_BASE) \ + do { \ + PyTypeObject *type = (TYPE_EXPR); \ + Py_SET_TYPE(type, TP_TYPE); \ + type->tp_base = TP_BASE; \ + if (PyModule_AddType(mod, type) < 0) { \ + return -1; \ + } \ + } while (0) + + /* Note: + ob_type is the metatype (the 'type'), defaults to PyType_Type, + tp_base is the base type, defaults to 'object' aka PyBaseObject_Type. + */ + TYPE_READY(&PyCArg_Type); + TYPE_READY(&PyCThunk_Type); + TYPE_READY(&PyCData_Type); /* StgDict is derived from PyDict_Type */ - PyCStgDict_Type.tp_base = &PyDict_Type; - if (PyType_Ready(&PyCStgDict_Type) < 0) - return NULL; + TYPE_READY_BASE(&PyCStgDict_Type, &PyDict_Type); /************************************************* * * Metaclasses */ - - PyCStructType_Type.tp_base = &PyType_Type; - if (PyType_Ready(&PyCStructType_Type) < 0) - return NULL; - - UnionType_Type.tp_base = &PyType_Type; - if (PyType_Ready(&UnionType_Type) < 0) - return NULL; - - PyCPointerType_Type.tp_base = &PyType_Type; - if (PyType_Ready(&PyCPointerType_Type) < 0) - return NULL; - - PyCArrayType_Type.tp_base = &PyType_Type; - if (PyType_Ready(&PyCArrayType_Type) < 0) - return NULL; - - PyCSimpleType_Type.tp_base = &PyType_Type; - if (PyType_Ready(&PyCSimpleType_Type) < 0) - return NULL; - - PyCFuncPtrType_Type.tp_base = &PyType_Type; - if (PyType_Ready(&PyCFuncPtrType_Type) < 0) - return NULL; + TYPE_READY_BASE(&PyCStructType_Type, &PyType_Type); + TYPE_READY_BASE(&UnionType_Type, &PyType_Type); + TYPE_READY_BASE(&PyCPointerType_Type, &PyType_Type); + TYPE_READY_BASE(&PyCArrayType_Type, &PyType_Type); + TYPE_READY_BASE(&PyCSimpleType_Type, &PyType_Type); + TYPE_READY_BASE(&PyCFuncPtrType_Type, &PyType_Type); /************************************************* * * Classes using a custom metaclass */ - if (PyType_Ready(&PyCData_Type) < 0) - return NULL; - - Py_SET_TYPE(&Struct_Type, &PyCStructType_Type); - Struct_Type.tp_base = &PyCData_Type; - if (PyType_Ready(&Struct_Type) < 0) - return NULL; - Py_INCREF(&Struct_Type); - PyModule_AddObject(m, "Structure", (PyObject *)&Struct_Type); - - Py_SET_TYPE(&Union_Type, &UnionType_Type); - Union_Type.tp_base = &PyCData_Type; - if (PyType_Ready(&Union_Type) < 0) - return NULL; - Py_INCREF(&Union_Type); - PyModule_AddObject(m, "Union", (PyObject *)&Union_Type); - - Py_SET_TYPE(&PyCPointer_Type, &PyCPointerType_Type); - PyCPointer_Type.tp_base = &PyCData_Type; - if (PyType_Ready(&PyCPointer_Type) < 0) - return NULL; - Py_INCREF(&PyCPointer_Type); - PyModule_AddObject(m, "_Pointer", (PyObject *)&PyCPointer_Type); - - Py_SET_TYPE(&PyCArray_Type, &PyCArrayType_Type); - PyCArray_Type.tp_base = &PyCData_Type; - if (PyType_Ready(&PyCArray_Type) < 0) - return NULL; - Py_INCREF(&PyCArray_Type); - PyModule_AddObject(m, "Array", (PyObject *)&PyCArray_Type); - - Py_SET_TYPE(&Simple_Type, &PyCSimpleType_Type); - Simple_Type.tp_base = &PyCData_Type; - if (PyType_Ready(&Simple_Type) < 0) - return NULL; - Py_INCREF(&Simple_Type); - PyModule_AddObject(m, "_SimpleCData", (PyObject *)&Simple_Type); - - Py_SET_TYPE(&PyCFuncPtr_Type, &PyCFuncPtrType_Type); - PyCFuncPtr_Type.tp_base = &PyCData_Type; - if (PyType_Ready(&PyCFuncPtr_Type) < 0) - return NULL; - Py_INCREF(&PyCFuncPtr_Type); - PyModule_AddObject(m, "CFuncPtr", (PyObject *)&PyCFuncPtr_Type); + MOD_ADD_TYPE(&Struct_Type, &PyCStructType_Type, &PyCData_Type); + MOD_ADD_TYPE(&Union_Type, &UnionType_Type, &PyCData_Type); + MOD_ADD_TYPE(&PyCPointer_Type, &PyCPointerType_Type, &PyCData_Type); + MOD_ADD_TYPE(&PyCArray_Type, &PyCArrayType_Type, &PyCData_Type); + MOD_ADD_TYPE(&Simple_Type, &PyCSimpleType_Type, &PyCData_Type); + MOD_ADD_TYPE(&PyCFuncPtr_Type, &PyCFuncPtrType_Type, &PyCData_Type); /************************************************* * @@ -5808,8 +5741,7 @@ PyInit__ctypes(void) */ /* PyCField_Type is derived from PyBaseObject_Type */ - if (PyType_Ready(&PyCField_Type) < 0) - return NULL; + TYPE_READY(&PyCField_Type); /************************************************* * @@ -5817,56 +5749,120 @@ PyInit__ctypes(void) */ DictRemover_Type.tp_new = PyType_GenericNew; - if (PyType_Ready(&DictRemover_Type) < 0) - return NULL; - - if (PyType_Ready(&StructParam_Type) < 0) { - return NULL; - } + TYPE_READY(&DictRemover_Type); + TYPE_READY(&StructParam_Type); #ifdef MS_WIN32 - if (create_comerror() < 0) - return NULL; - PyModule_AddObject(m, "COMError", ComError); + TYPE_READY_BASE(&PyComError_Type, PyExc_Exception); +#endif - PyModule_AddObject(m, "FUNCFLAG_HRESULT", PyLong_FromLong(FUNCFLAG_HRESULT)); - PyModule_AddObject(m, "FUNCFLAG_STDCALL", PyLong_FromLong(FUNCFLAG_STDCALL)); +#undef TYPE_READY +#undef TYPE_READY_BASE +#undef MOD_ADD_TYPE + return 0; +} + + +static int +_ctypes_add_objects(PyObject *mod) +{ +#define MOD_ADD(name, expr) \ + do { \ + PyObject *obj = (expr); \ + if (obj == NULL) { \ + return -1; \ + } \ + if (PyModule_AddObjectRef(mod, name, obj) < 0) { \ + Py_DECREF(obj); \ + return -1; \ + } \ + Py_DECREF(obj); \ + } while (0) + + MOD_ADD("_pointer_type_cache", Py_NewRef(_ctypes_ptrtype_cache)); + +#ifdef MS_WIN32 + MOD_ADD("COMError", Py_NewRef(ComError)); + MOD_ADD("FUNCFLAG_HRESULT", PyLong_FromLong(FUNCFLAG_HRESULT)); + MOD_ADD("FUNCFLAG_STDCALL", PyLong_FromLong(FUNCFLAG_STDCALL)); #endif - PyModule_AddObject(m, "FUNCFLAG_CDECL", PyLong_FromLong(FUNCFLAG_CDECL)); - PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); - PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); - PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); - PyModule_AddStringConstant(m, "__version__", "1.1.0"); - - PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); - PyModule_AddObject(m, "_memset_addr", PyLong_FromVoidPtr(memset)); - PyModule_AddObject(m, "_string_at_addr", PyLong_FromVoidPtr(string_at)); - PyModule_AddObject(m, "_cast_addr", PyLong_FromVoidPtr(cast)); + MOD_ADD("FUNCFLAG_CDECL", PyLong_FromLong(FUNCFLAG_CDECL)); + MOD_ADD("FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); + MOD_ADD("FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); + MOD_ADD("FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); + MOD_ADD("__version__", PyUnicode_FromString("1.1.0")); + + MOD_ADD("_memmove_addr", PyLong_FromVoidPtr(memmove)); + MOD_ADD("_memset_addr", PyLong_FromVoidPtr(memset)); + MOD_ADD("_string_at_addr", PyLong_FromVoidPtr(string_at)); + MOD_ADD("_cast_addr", PyLong_FromVoidPtr(cast)); #ifdef CTYPES_UNICODE - PyModule_AddObject(m, "_wstring_at_addr", PyLong_FromVoidPtr(wstring_at)); + MOD_ADD("_wstring_at_addr", PyLong_FromVoidPtr(wstring_at)); #endif /* If RTLD_LOCAL is not defined (Windows!), set it to zero. */ #if !HAVE_DECL_RTLD_LOCAL -#define RTLD_LOCAL 0 +# define RTLD_LOCAL 0 #endif /* If RTLD_GLOBAL is not defined (cygwin), set it to the same value as - RTLD_LOCAL. -*/ + RTLD_LOCAL. */ #if !HAVE_DECL_RTLD_GLOBAL -#define RTLD_GLOBAL RTLD_LOCAL +# define RTLD_GLOBAL RTLD_LOCAL #endif + MOD_ADD("RTLD_LOCAL", PyLong_FromLong(RTLD_LOCAL)); + MOD_ADD("RTLD_GLOBAL", PyLong_FromLong(RTLD_GLOBAL)); + MOD_ADD("ArgumentError", Py_NewRef(PyExc_ArgError)); + return 0; +#undef MOD_ADD +} + + +static int +_ctypes_mod_exec(PyObject *mod) +{ + _unpickle = PyObject_GetAttrString(mod, "_unpickle"); + if (_unpickle == NULL) { + return -1; + } - PyModule_AddObject(m, "RTLD_LOCAL", PyLong_FromLong(RTLD_LOCAL)); - PyModule_AddObject(m, "RTLD_GLOBAL", PyLong_FromLong(RTLD_GLOBAL)); + _ctypes_ptrtype_cache = PyDict_New(); + if (_ctypes_ptrtype_cache == NULL) { + return -1; + } PyExc_ArgError = PyErr_NewException("ctypes.ArgumentError", NULL, NULL); - if (PyExc_ArgError) { - Py_INCREF(PyExc_ArgError); - PyModule_AddObject(m, "ArgumentError", PyExc_ArgError); + if (!PyExc_ArgError) { + return -1; + } + + if (_ctypes_add_types(mod) < 0) { + return -1; + } +#ifdef MS_WIN32 + ComError = (PyObject*)&PyComError_Type; +#endif + + if (_ctypes_add_objects(mod) < 0) { + return -1; + } + return 0; +} + + +PyMODINIT_FUNC +PyInit__ctypes(void) +{ + PyObject *mod = PyModule_Create(&_ctypesmodule); + if (!mod) { + return NULL; + } + + if (_ctypes_mod_exec(mod) < 0) { + Py_DECREF(mod); + return NULL; } - return m; + return mod; } /* diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index a52d343031a090..13b2fb0da57dd3 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -254,8 +254,6 @@ set_last_error(PyObject *self, PyObject *args) return set_error_internal(self, args, 1); } -PyObject *ComError; - static WCHAR *FormatError(DWORD code) { WCHAR *lpMsgBuf; @@ -1471,14 +1469,14 @@ static PyObject *py_dyld_shared_cache_contains_path(PyObject *self, PyObject *ar if (!PyArg_ParseTuple(args, "O", &name)) return NULL; - + if (name == Py_None) Py_RETURN_FALSE; - + if (PyUnicode_FSConverter(name, &name2) == 0) return NULL; name_str = PyBytes_AS_STRING(name2); - + r = _dyld_shared_cache_contains_path(name_str); Py_DECREF(name2); From 0601b011ac5e71fcfc2de3bd3ed313e360e0a222 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 12 Nov 2020 15:14:13 +0100 Subject: [PATCH 0519/1261] bpo-42260: Initialize time and warnings earlier at startup (GH-23249) * Call _PyTime_Init() and _PyWarnings_InitState() earlier during the Python initialization. * Inline _PyImportHooks_Init() into _PySys_InitCore(). * The _warnings initialization function no longer call _PyWarnings_InitState() to prevent resetting filters_version to 0. * _PyWarnings_InitState() now returns an int and no longer clear the state in case of error (it's done anyway at Python exit). * Rework init_importlib(), fix refleaks on errors. --- Include/internal/pycore_interp.h | 6 +- Include/internal/pycore_pylifecycle.h | 1 - Include/internal/pycore_warnings.h | 2 +- Python/_warnings.c | 30 ++----- Python/import.c | 37 -------- Python/pylifecycle.c | 120 +++++++++++--------------- Python/sysmodule.c | 5 ++ 7 files changed, 68 insertions(+), 133 deletions(-) diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 4b67a86a25a79f..184878ce146032 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -190,10 +190,14 @@ struct _is { struct _ceval_state ceval; struct _gc_runtime_state gc; + // sys.modules dictionary PyObject *modules; PyObject *modules_by_index; + // Dictionary of the sys module PyObject *sysdict; + // Dictionary of the builtins module PyObject *builtins; + // importlib module PyObject *importlib; /* Used in Modules/_threadmodule.c. */ @@ -218,7 +222,7 @@ struct _is { PyObject *builtins_copy; PyObject *import_func; - /* Initialized to PyEval_EvalFrameDefault(). */ + // Initialized to _PyEval_EvalFrameDefault(). _PyFrameEvalFunction eval_frame; Py_ssize_t co_extra_user_count; diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 606252b968da97..e748112cbf7fe1 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -48,7 +48,6 @@ extern int _PySys_UpdateConfig(PyThreadState *tstate); extern PyStatus _PyExc_Init(PyThreadState *tstate); extern PyStatus _PyErr_Init(void); extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod); -extern PyStatus _PyImportHooks_Init(PyThreadState *tstate); extern int _PyFloat_Init(void); extern PyStatus _Py_HashRandomization_Init(const PyConfig *); diff --git a/Include/internal/pycore_warnings.h b/Include/internal/pycore_warnings.h index cafe305edb0e02..2a473b860c47d4 100644 --- a/Include/internal/pycore_warnings.h +++ b/Include/internal/pycore_warnings.h @@ -17,7 +17,7 @@ struct _warnings_runtime_state { long filters_version; }; -extern PyStatus _PyWarnings_InitState(PyThreadState *tstate); +extern int _PyWarnings_InitState(PyThreadState *tstate); #ifdef __cplusplus } diff --git a/Python/_warnings.c b/Python/_warnings.c index e42b7c3be3db9a..8d33fbe0f878b8 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -114,37 +114,34 @@ init_filters(void) } /* Initialize the given warnings module state. */ -static int -warnings_init_state(WarningsState *st) +int +_PyWarnings_InitState(PyThreadState *tstate) { + WarningsState *st = &tstate->interp->warnings; + if (st->filters == NULL) { st->filters = init_filters(); if (st->filters == NULL) { - goto error; + return -1; } } if (st->once_registry == NULL) { st->once_registry = PyDict_New(); if (st->once_registry == NULL) { - goto error; + return -1; } } if (st->default_action == NULL) { st->default_action = PyUnicode_FromString("default"); if (st->default_action == NULL) { - goto error; + return -1; } } st->filters_version = 0; - return 0; - -error: - warnings_clear_state(st); - return -1; } @@ -1367,16 +1364,6 @@ static struct PyModuleDef warningsmodule = { }; -PyStatus -_PyWarnings_InitState(PyThreadState *tstate) -{ - if (warnings_init_state(&tstate->interp->warnings) < 0) { - return _PyStatus_ERR("can't initialize warnings"); - } - return _PyStatus_OK(); -} - - PyMODINIT_FUNC _PyWarnings_Init(void) { @@ -1391,9 +1378,6 @@ _PyWarnings_Init(void) if (st == NULL) { goto error; } - if (warnings_init_state(st) < 0) { - goto error; - } if (PyModule_AddObjectRef(m, "filters", st->filters) < 0) { goto error; diff --git a/Python/import.c b/Python/import.c index 77e6baef011e39..51630c3486af61 100644 --- a/Python/import.c +++ b/Python/import.c @@ -51,43 +51,6 @@ module _imp /* Initialize things */ -PyStatus -_PyImportHooks_Init(PyThreadState *tstate) -{ - PyObject *v, *path_hooks = NULL; - int err = 0; - - /* adding sys.path_hooks and sys.path_importer_cache */ - v = PyList_New(0); - if (v == NULL) - goto error; - err = PySys_SetObject("meta_path", v); - Py_DECREF(v); - if (err) - goto error; - v = PyDict_New(); - if (v == NULL) - goto error; - err = PySys_SetObject("path_importer_cache", v); - Py_DECREF(v); - if (err) - goto error; - path_hooks = PyList_New(0); - if (path_hooks == NULL) - goto error; - err = PySys_SetObject("path_hooks", path_hooks); - if (err) { - goto error; - } - Py_DECREF(path_hooks); - return _PyStatus_OK(); - - error: - _PyErr_Print(tstate); - return _PyStatus_ERR("initializing sys.meta_path, sys.path_hooks, " - "or path_importer_cache failed"); -} - PyStatus _PyImportZip_Init(PyThreadState *tstate) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 93bce49b63d277..2d43e016efd508 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -135,59 +135,61 @@ Py_IsInitialized(void) having the lock, but you cannot use multiple threads.) */ - -static PyStatus +static int init_importlib(PyThreadState *tstate, PyObject *sysmod) { - PyObject *importlib; - PyObject *impmod; - PyObject *value; + assert(!_PyErr_Occurred(tstate)); + PyInterpreterState *interp = tstate->interp; int verbose = _PyInterpreterState_GetConfig(interp)->verbose; - /* Import _importlib through its frozen version, _frozen_importlib. */ - if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) { - return _PyStatus_ERR("can't import _frozen_importlib"); - } - else if (verbose) { + // Import _importlib through its frozen version, _frozen_importlib. + if (verbose) { PySys_FormatStderr("import _frozen_importlib # frozen\n"); } - importlib = PyImport_AddModule("_frozen_importlib"); + if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) { + return -1; + } + PyObject *importlib = PyImport_AddModule("_frozen_importlib"); // borrowed if (importlib == NULL) { - return _PyStatus_ERR("couldn't get _frozen_importlib from sys.modules"); + return -1; } - interp->importlib = importlib; - Py_INCREF(interp->importlib); - - interp->import_func = _PyDict_GetItemStringWithError(interp->builtins, "__import__"); - if (interp->import_func == NULL) - return _PyStatus_ERR("__import__ not found"); - Py_INCREF(interp->import_func); + interp->importlib = Py_NewRef(importlib); - /* Import the _imp module */ - impmod = PyInit__imp(); - if (impmod == NULL) { - return _PyStatus_ERR("can't import _imp"); + PyObject *import_func = _PyDict_GetItemStringWithError(interp->builtins, + "__import__"); + if (import_func == NULL) { + return -1; } - else if (verbose) { + interp->import_func = Py_NewRef(import_func); + + // Import the _imp module + if (verbose) { PySys_FormatStderr("import _imp # builtin\n"); } - if (_PyImport_SetModuleString("_imp", impmod) < 0) { - return _PyStatus_ERR("can't save _imp to sys.modules"); + PyObject *imp_mod = PyInit__imp(); + if (imp_mod == NULL) { + return -1; + } + if (_PyImport_SetModuleString("_imp", imp_mod) < 0) { + Py_DECREF(imp_mod); + return -1; } - /* Install importlib as the implementation of import */ - value = PyObject_CallMethod(importlib, "_install", "OO", sysmod, impmod); + // Install importlib as the implementation of import + PyObject *value = PyObject_CallMethod(importlib, "_install", + "OO", sysmod, imp_mod); + Py_DECREF(imp_mod); if (value == NULL) { - _PyErr_Print(tstate); - return _PyStatus_ERR("importlib install failed"); + return -1; } Py_DECREF(value); - Py_DECREF(impmod); - return _PyStatus_OK(); + assert(!_PyErr_Occurred(tstate)); + return 0; } + static PyStatus init_importlib_external(PyThreadState *tstate) { @@ -700,6 +702,9 @@ pycore_init_types(PyThreadState *tstate) } } + if (_PyWarnings_InitState(tstate) < 0) { + return _PyStatus_ERR("can't initialize warnings"); + } return _PyStatus_OK(); } @@ -747,37 +752,6 @@ pycore_init_builtins(PyThreadState *tstate) } -static PyStatus -pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod) -{ - assert(!_PyErr_Occurred(tstate)); - - PyStatus status = _PyImportHooks_Init(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - /* Initialize _warnings. */ - status = _PyWarnings_InitState(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); - if (config->_install_importlib) { - /* This call sets up builtin and frozen import support */ - status = init_importlib(tstate, sysmod); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - - assert(!_PyErr_Occurred(tstate)); - - return _PyStatus_OK(); -} - - static PyStatus pycore_interp_init(PyThreadState *tstate) { @@ -789,6 +763,12 @@ pycore_interp_init(PyThreadState *tstate) goto done; } + if (_Py_IsMainInterpreter(tstate)) { + if (_PyTime_Init() < 0) { + return _PyStatus_ERR("can't initialize time"); + } + } + status = _PySys_Create(tstate, &sysmod); if (_PyStatus_EXCEPTION(status)) { goto done; @@ -799,7 +779,13 @@ pycore_interp_init(PyThreadState *tstate) goto done; } - status = pycore_init_import_warnings(tstate, sysmod); + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); + if (config->_install_importlib) { + /* This call sets up builtin and frozen import support */ + if (init_importlib(tstate, sysmod) < 0) { + return _PyStatus_ERR("failed to initialize importlib"); + } + } done: /* sys.modules['sys'] contains a strong reference to the module */ @@ -1044,12 +1030,6 @@ init_interp_main(PyThreadState *tstate) return status; } - if (is_main_interp) { - if (_PyTime_Init() < 0) { - return _PyStatus_ERR("can't initialize time"); - } - } - if (interpreter_update_config(tstate, 1) < 0) { return _PyStatus_ERR("failed to update the Python config"); } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 61741f7432d34f..f05b33a9aacf1d 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2841,6 +2841,11 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) } } + /* adding sys.path_hooks and sys.path_importer_cache */ + SET_SYS("meta_path", PyList_New(0)); + SET_SYS("path_importer_cache", PyDict_New()); + SET_SYS("path_hooks", PyList_New(0)); + if (_PyErr_Occurred(tstate)) { goto err_occurred; } From ab461d5f5b968e5165999a15405c06ba8d2c7192 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 12 Nov 2020 15:38:13 +0100 Subject: [PATCH 0520/1261] bpo-38823: Always build _ctypes with wchar_t (GH-23248) It is no longer possible to build the _ctypes extension module without wchar_t type: remove CTYPES_UNICODE macro. Anyway, the wchar_t type is required to build Python. --- .../2020-11-12-13-45-15.bpo-38823.C0z_Fe.rst | 3 +++ Modules/_ctypes/_ctypes.c | 16 +++------------- Modules/_ctypes/callproc.c | 2 -- Modules/_ctypes/cfield.c | 11 +---------- Modules/_ctypes/ctypes.h | 4 ---- Modules/_ctypes/stgdict.c | 2 -- 6 files changed, 7 insertions(+), 31 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-11-12-13-45-15.bpo-38823.C0z_Fe.rst diff --git a/Misc/NEWS.d/next/Build/2020-11-12-13-45-15.bpo-38823.C0z_Fe.rst b/Misc/NEWS.d/next/Build/2020-11-12-13-45-15.bpo-38823.C0z_Fe.rst new file mode 100644 index 00000000000000..4a0f11de5e420d --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-11-12-13-45-15.bpo-38823.C0z_Fe.rst @@ -0,0 +1,3 @@ +It is no longer possible to build the ``_ctypes`` extension module without +:c:type:`wchar_t` type: remove ``CTYPES_UNICODE`` macro. Anyway, the +:c:type:`wchar_t` type is required to build Python. Patch by Victor Stinner. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 299070881100d3..8bb34877c53903 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1358,7 +1358,6 @@ static PyGetSetDef CharArray_getsets[] = { { NULL, NULL } }; -#ifdef CTYPES_UNICODE static PyObject * WCharArray_get_value(CDataObject *self, void *Py_UNUSED(ignored)) { @@ -1408,7 +1407,6 @@ static PyGetSetDef WCharArray_getsets[] = { "string value"}, { NULL, NULL } }; -#endif /* The next three functions copied from Python's typeobject.c. @@ -1615,11 +1613,10 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (itemdict->getfunc == _ctypes_get_fielddesc("c")->getfunc) { if (-1 == add_getset(result, CharArray_getsets)) goto error; -#ifdef CTYPES_UNICODE - } else if (itemdict->getfunc == _ctypes_get_fielddesc("u")->getfunc) { + } + else if (itemdict->getfunc == _ctypes_get_fielddesc("u")->getfunc) { if (-1 == add_getset(result, WCharArray_getsets)) goto error; -#endif } return (PyObject *)result; @@ -4654,7 +4651,6 @@ Array_subscript(PyObject *myself, PyObject *item) PyMem_Free(dest); return np; } -#ifdef CTYPES_UNICODE if (itemdict->getfunc == _ctypes_get_fielddesc("u")->getfunc) { wchar_t *ptr = (wchar_t *)self->b_ptr; wchar_t *dest; @@ -4681,7 +4677,6 @@ Array_subscript(PyObject *myself, PyObject *item) PyMem_Free(dest); return np; } -#endif np = PyList_New(slicelen); if (np == NULL) @@ -5350,7 +5345,6 @@ Pointer_subscript(PyObject *myself, PyObject *item) PyMem_Free(dest); return np; } -#ifdef CTYPES_UNICODE if (itemdict->getfunc == _ctypes_get_fielddesc("u")->getfunc) { wchar_t *ptr = *(wchar_t **)self->b_ptr; wchar_t *dest; @@ -5371,7 +5365,6 @@ Pointer_subscript(PyObject *myself, PyObject *item) PyMem_Free(dest); return np; } -#endif np = PyList_New(len); if (np == NULL) @@ -5653,7 +5646,7 @@ cast(void *ptr, PyObject *src, PyObject *ctype) return NULL; } -#ifdef CTYPES_UNICODE + static PyObject * wstring_at(const wchar_t *ptr, int size) { @@ -5665,7 +5658,6 @@ wstring_at(const wchar_t *ptr, int size) ssize = wcslen(ptr); return PyUnicode_FromWideChar(ptr, ssize); } -#endif static struct PyModuleDef _ctypesmodule = { @@ -5796,9 +5788,7 @@ _ctypes_add_objects(PyObject *mod) MOD_ADD("_memset_addr", PyLong_FromVoidPtr(memset)); MOD_ADD("_string_at_addr", PyLong_FromVoidPtr(string_at)); MOD_ADD("_cast_addr", PyLong_FromVoidPtr(cast)); -#ifdef CTYPES_UNICODE MOD_ADD("_wstring_at_addr", PyLong_FromVoidPtr(wstring_at)); -#endif /* If RTLD_LOCAL is not defined (Windows!), set it to zero. */ #if !HAVE_DECL_RTLD_LOCAL diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 13b2fb0da57dd3..9b629877a8a53a 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -713,7 +713,6 @@ static int ConvParam(PyObject *obj, Py_ssize_t index, struct argument *pa) return 0; } -#ifdef CTYPES_UNICODE if (PyUnicode_Check(obj)) { pa->ffi_type = &ffi_type_pointer; pa->value.p = PyUnicode_AsWideCharString(obj, NULL); @@ -726,7 +725,6 @@ static int ConvParam(PyObject *obj, Py_ssize_t index, struct argument *pa) } return 0; } -#endif { _Py_IDENTIFIER(_as_parameter_); diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 98939290fb97f9..5bd96f1eb8c18b 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -125,13 +125,11 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index, getfunc = fd->getfunc; setfunc = fd->setfunc; } -#ifdef CTYPES_UNICODE if (idict->getfunc == _ctypes_get_fielddesc("u")->getfunc) { struct fielddesc *fd = _ctypes_get_fielddesc("U"); getfunc = fd->getfunc; setfunc = fd->setfunc; } -#endif } } @@ -1137,7 +1135,6 @@ c_get(void *ptr, Py_ssize_t size) return PyBytes_FromStringAndSize((char *)ptr, 1); } -#ifdef CTYPES_UNICODE /* u - a single wchar_t character */ static PyObject * u_set(void *ptr, PyObject *value, Py_ssize_t size) @@ -1232,7 +1229,6 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length) return value; } -#endif static PyObject * s_get(void *ptr, Py_ssize_t size) @@ -1321,7 +1317,6 @@ z_get(void *ptr, Py_ssize_t size) } } -#ifdef CTYPES_UNICODE static PyObject * Z_set(void *ptr, PyObject *value, Py_ssize_t size) { @@ -1373,7 +1368,7 @@ Z_get(void *ptr, Py_ssize_t size) Py_RETURN_NONE; } } -#endif + #ifdef MS_WIN32 static PyObject * @@ -1507,11 +1502,9 @@ static struct fielddesc formattable[] = { #endif { 'P', P_set, P_get, &ffi_type_pointer}, { 'z', z_set, z_get, &ffi_type_pointer}, -#ifdef CTYPES_UNICODE { 'u', u_set, u_get, NULL}, /* ffi_type set later */ { 'U', U_set, U_get, &ffi_type_pointer}, { 'Z', Z_set, Z_get, &ffi_type_pointer}, -#endif #ifdef MS_WIN32 { 'X', BSTR_set, BSTR_get, &ffi_type_pointer}, #endif @@ -1544,14 +1537,12 @@ _ctypes_get_fielddesc(const char *fmt) if (!initialized) { initialized = 1; -#ifdef CTYPES_UNICODE if (sizeof(wchar_t) == sizeof(short)) _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_sshort; else if (sizeof(wchar_t) == sizeof(int)) _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_sint; else if (sizeof(wchar_t) == sizeof(long)) _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_slong; -#endif } for (; table->code; ++table) { diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index 3f20031d671a8a..6110027980827c 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -343,10 +343,6 @@ extern PyObject *PyExc_ArgError; extern char *_ctypes_conversion_encoding; extern char *_ctypes_conversion_errors; -#if defined(HAVE_WCHAR_H) -# define CTYPES_UNICODE -#endif - extern void _ctypes_free_closure(void *); extern void *_ctypes_alloc_closure(void); diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c index 443951a6b03025..747339dee352eb 100644 --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -538,9 +538,7 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct case FFI_TYPE_SINT16: case FFI_TYPE_SINT32: if (dict->getfunc != _ctypes_get_fielddesc("c")->getfunc -#ifdef CTYPES_UNICODE && dict->getfunc != _ctypes_get_fielddesc("u")->getfunc -#endif ) break; /* else fall through */ From 51db8ddd4d1f0b329eacb32900ef8d37b63a06fe Mon Sep 17 00:00:00 2001 From: Mario Corchero Date: Thu, 12 Nov 2020 18:27:44 +0100 Subject: [PATCH 0521/1261] bpo-42308: Add threading.__excepthook__ (GH-23218) Add threading.__excepthook__ to allow retrieving the original value of threading.excepthook in case it is set to a broken or a different value. --- Doc/library/threading.rst | 7 +++++++ Doc/whatsnew/3.10.rst | 5 +++++ Lib/test/test_threading.py | 21 +++++++++++++++++++ Lib/threading.py | 4 ++++ .../2020-11-10-12-09-13.bpo-42308.yaJHH9.rst | 3 +++ 5 files changed, 40 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-11-10-12-09-13.bpo-42308.yaJHH9.rst diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index e05486f7d08494..690735469d0bf6 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -71,6 +71,13 @@ This module defines the following functions: .. versionadded:: 3.8 +.. data:: __excepthook__ + + Holds the original value of :func:`threading.excepthook`. It is saved so that the + original value can be restored in case they happen to get replaced with + broken or alternative objects. + + .. versionadded:: 3.10 .. function:: get_ident() diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 74c1c28ec0ff3b..4d772005581ad4 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -263,6 +263,11 @@ retrieve the functions set by :func:`threading.settrace` and :func:`threading.setprofile` respectively. (Contributed by Mario Corchero in :issue:`42251`.) +Add :data:`threading.__excepthook__` to allow retrieving the original value +of :func:`threading.excepthook` in case it is set to a broken or a different +value. +(Contributed by Mario Corchero in :issue:`42308`.) + traceback --------- diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index e0e5406ac26a1e..db440d42f816d9 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1352,6 +1352,27 @@ def sys_hook(exc_type, exc_value, exc_traceback): 'Exception in threading.excepthook:\n') self.assertEqual(err_str, 'threading_hook failed') + def test_original_excepthook(self): + def run_thread(): + with support.captured_output("stderr") as output: + thread = ThreadRunFail(name="excepthook thread") + thread.start() + thread.join() + return output.getvalue() + + def threading_hook(args): + print("Running a thread failed", file=sys.stderr) + + default_output = run_thread() + with support.swap_attr(threading, 'excepthook', threading_hook): + custom_hook_output = run_thread() + threading.excepthook = threading.__excepthook__ + recovered_output = run_thread() + + self.assertEqual(default_output, recovered_output) + self.assertNotEqual(default_output, custom_hook_output) + self.assertEqual(custom_hook_output, "Running a thread failed\n") + class TimerTests(BaseTestCase): diff --git a/Lib/threading.py b/Lib/threading.py index d4fe649e4f04b5..7dae77dfd4da21 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -1200,6 +1200,10 @@ def excepthook(args, /): stderr.flush() +# Original value of threading.excepthook +__excepthook__ = excepthook + + def _make_invoke_excepthook(): # Create a local namespace to ensure that variables remain alive # when _invoke_excepthook() is called, even if it is called late during diff --git a/Misc/NEWS.d/next/Library/2020-11-10-12-09-13.bpo-42308.yaJHH9.rst b/Misc/NEWS.d/next/Library/2020-11-10-12-09-13.bpo-42308.yaJHH9.rst new file mode 100644 index 00000000000000..3460b0c92b1504 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-10-12-09-13.bpo-42308.yaJHH9.rst @@ -0,0 +1,3 @@ +Add :data:`threading.__excepthook__` to allow retrieving the original value +of :func:`threading.excepthook` in case it is set to a broken or a different +value. Patch by Mario Corchero. From 441e23db8cedcfbfd5724ec01aff5a69584baaa1 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 12 Nov 2020 19:49:33 +0000 Subject: [PATCH 0522/1261] bpo-42246: Eliminate jumps to exit blocks by copying those blocks. (#23251) * Compiler: eliminate jumps to short exit blocks by copying. --- Lib/test/test_dis.py | 229 +- Lib/test/test_sys_settrace.py | 2 +- Python/compile.c | 163 +- Python/importlib.h | 2820 +++++++++---------- Python/importlib_external.h | 5003 ++++++++++++++++----------------- Python/importlib_zipimport.h | 1091 ++++--- 6 files changed, 4653 insertions(+), 4655 deletions(-) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index bbaddd57d29189..216a2dfa24df89 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -264,47 +264,47 @@ def bug1333982(x=[]): 8 INPLACE_ADD 10 STORE_NAME 0 (x) 12 JUMP_ABSOLUTE 4 - 14 LOAD_CONST 2 (None) - 16 RETURN_VALUE """ dis_traceback = """\ -%3d 0 SETUP_FINALLY 12 (to 14) +%3d 0 SETUP_FINALLY 14 (to 16) %3d 2 LOAD_CONST 1 (1) 4 LOAD_CONST 2 (0) --> 6 BINARY_TRUE_DIVIDE 8 POP_TOP 10 POP_BLOCK - 12 JUMP_FORWARD 42 (to 56) - -%3d >> 14 DUP_TOP - 16 LOAD_GLOBAL 0 (Exception) - 18 JUMP_IF_NOT_EXC_MATCH 54 - 20 POP_TOP - 22 STORE_FAST 0 (e) - 24 POP_TOP - 26 SETUP_FINALLY 18 (to 46) - -%3d 28 LOAD_FAST 0 (e) - 30 LOAD_ATTR 1 (__traceback__) - 32 STORE_FAST 1 (tb) - 34 POP_BLOCK - 36 POP_EXCEPT - 38 LOAD_CONST 0 (None) - 40 STORE_FAST 0 (e) - 42 DELETE_FAST 0 (e) - 44 JUMP_FORWARD 10 (to 56) - >> 46 LOAD_CONST 0 (None) - 48 STORE_FAST 0 (e) - 50 DELETE_FAST 0 (e) - 52 RERAISE - >> 54 RERAISE - -%3d >> 56 LOAD_FAST 1 (tb) - 58 RETURN_VALUE + +%3d 12 LOAD_FAST 1 (tb) + 14 RETURN_VALUE + +%3d >> 16 DUP_TOP + 18 LOAD_GLOBAL 0 (Exception) + 20 JUMP_IF_NOT_EXC_MATCH 58 + 22 POP_TOP + 24 STORE_FAST 0 (e) + 26 POP_TOP + 28 SETUP_FINALLY 20 (to 50) + +%3d 30 LOAD_FAST 0 (e) + 32 LOAD_ATTR 1 (__traceback__) + 34 STORE_FAST 1 (tb) + 36 POP_BLOCK + 38 POP_EXCEPT + 40 LOAD_CONST 0 (None) + 42 STORE_FAST 0 (e) + 44 DELETE_FAST 0 (e) + +%3d 46 LOAD_FAST 1 (tb) + 48 RETURN_VALUE + >> 50 LOAD_CONST 0 (None) + 52 STORE_FAST 0 (e) + 54 DELETE_FAST 0 (e) + 56 RERAISE + >> 58 RERAISE """ % (TRACEBACK_CODE.co_firstlineno + 1, TRACEBACK_CODE.co_firstlineno + 2, + TRACEBACK_CODE.co_firstlineno + 5, TRACEBACK_CODE.co_firstlineno + 3, TRACEBACK_CODE.co_firstlineno + 4, TRACEBACK_CODE.co_firstlineno + 5) @@ -992,7 +992,7 @@ def jumpy(): Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=10, argrepr='10', offset=2, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=4, starts_line=None, is_jump_target=False), Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=6, starts_line=None, is_jump_target=False), - Instruction(opname='FOR_ITER', opcode=93, arg=34, argval=44, argrepr='to 44', offset=8, starts_line=None, is_jump_target=True), + Instruction(opname='FOR_ITER', opcode=93, arg=32, argval=42, argrepr='to 42', offset=8, starts_line=None, is_jump_target=True), Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=10, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=12, starts_line=4, is_jump_target=False), Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=14, starts_line=None, is_jump_target=False), @@ -1008,93 +1008,90 @@ def jumpy(): Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=34, starts_line=None, is_jump_target=False), Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=8, argval=8, argrepr='', offset=36, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=38, starts_line=8, is_jump_target=False), - Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=52, argval=52, argrepr='', offset=40, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=8, argval=8, argrepr='', offset=42, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=44, starts_line=10, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=46, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=48, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=50, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=52, starts_line=11, is_jump_target=True), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=94, argval=94, argrepr='', offset=54, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=56, starts_line=12, is_jump_target=False), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=58, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=60, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=62, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=64, starts_line=13, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=66, starts_line=None, is_jump_target=False), - Instruction(opname='INPLACE_SUBTRACT', opcode=56, arg=None, argval=None, argrepr='', offset=68, starts_line=None, is_jump_target=False), - Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=70, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=72, starts_line=14, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=74, starts_line=None, is_jump_target=False), - Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=76, starts_line=None, is_jump_target=False), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=82, argval=82, argrepr='', offset=78, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=52, argval=52, argrepr='', offset=80, starts_line=15, is_jump_target=False), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=82, starts_line=16, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=84, starts_line=None, is_jump_target=False), - Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=86, starts_line=None, is_jump_target=False), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=52, argval=52, argrepr='', offset=88, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=102, argval=102, argrepr='', offset=90, starts_line=17, is_jump_target=False), - Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=52, argval=52, argrepr='', offset=92, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=94, starts_line=19, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=96, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=98, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=100, starts_line=None, is_jump_target=False), - Instruction(opname='SETUP_FINALLY', opcode=122, arg=96, argval=200, argrepr='to 200', offset=102, starts_line=20, is_jump_target=True), - Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=118, argrepr='to 118', offset=104, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=106, starts_line=21, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), - Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=144, argrepr='to 144', offset=116, starts_line=None, is_jump_target=False), - Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=118, starts_line=22, is_jump_target=True), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=120, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_IF_NOT_EXC_MATCH', opcode=121, arg=142, argval=142, argrepr='', offset=122, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=50, argval=50, argrepr='', offset=40, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=42, starts_line=10, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=44, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=46, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=48, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=50, starts_line=11, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=90, argval=90, argrepr='', offset=52, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=54, starts_line=12, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=56, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=58, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=62, starts_line=13, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=64, starts_line=None, is_jump_target=False), + Instruction(opname='INPLACE_SUBTRACT', opcode=56, arg=None, argval=None, argrepr='', offset=66, starts_line=None, is_jump_target=False), + Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=68, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=70, starts_line=14, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=72, starts_line=None, is_jump_target=False), + Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=74, starts_line=None, is_jump_target=False), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=80, argval=80, argrepr='', offset=76, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=50, argval=50, argrepr='', offset=78, starts_line=15, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=80, starts_line=16, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=82, starts_line=None, is_jump_target=False), + Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=84, starts_line=None, is_jump_target=False), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=50, argval=50, argrepr='', offset=86, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=98, argval=98, argrepr='', offset=88, starts_line=17, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=90, starts_line=19, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=92, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=94, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=96, starts_line=None, is_jump_target=False), + Instruction(opname='SETUP_FINALLY', opcode=122, arg=98, argval=198, argrepr='to 198', offset=98, starts_line=20, is_jump_target=True), + Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=114, argrepr='to 114', offset=100, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=102, starts_line=21, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=104, starts_line=None, is_jump_target=False), + Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=106, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=108, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=140, argrepr='to 140', offset=112, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=114, starts_line=22, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=116, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_IF_NOT_EXC_MATCH', opcode=121, arg=138, argval=138, argrepr='', offset=118, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=120, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=122, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=124, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=126, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=128, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=130, starts_line=23, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=132, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=134, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=136, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=46, argval=188, argrepr='to 188', offset=140, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=142, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, starts_line=25, is_jump_target=True), - Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=172, argrepr='to 172', offset=146, starts_line=None, is_jump_target=False), - Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=148, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=150, starts_line=26, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=152, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=154, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=156, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=160, starts_line=None, is_jump_target=False), - Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=162, starts_line=None, is_jump_target=False), - Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=166, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=188, argrepr='to 188', offset=170, starts_line=None, is_jump_target=False), - Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=True), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=178, argval=178, argrepr='', offset=174, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=176, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=True), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=126, starts_line=23, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=128, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=130, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=132, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=134, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=46, argval=184, argrepr='to 184', offset=136, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=140, starts_line=25, is_jump_target=True), + Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=168, argrepr='to 168', offset=142, starts_line=None, is_jump_target=False), + Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=144, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=146, starts_line=26, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=148, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=150, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=152, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=154, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=156, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=162, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=184, argrepr='to 184', offset=166, starts_line=None, is_jump_target=False), + Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=174, argval=174, argrepr='', offset=170, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=174, starts_line=None, is_jump_target=True), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=176, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=188, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=190, starts_line=28, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=192, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=194, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=196, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=10, argval=210, argrepr='to 210', offset=198, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=200, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=202, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=204, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=206, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=208, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=210, starts_line=None, is_jump_target=True), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=212, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=186, starts_line=28, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=188, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=190, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=192, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=194, starts_line=None, is_jump_target=False), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=196, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=198, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=200, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=202, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=204, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=206, starts_line=None, is_jump_target=False), ] # One last piece of inspect fodder to check the default line number handling diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 66b1b360bec1db..ccdb5c2c51a0fe 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -990,7 +990,7 @@ def test_no_jump_over_return_try_finally_in_finally_block(output): pass output.append(12) - @jump_test(3, 4, [1], (ValueError, 'unreachable')) + @jump_test(3, 4, [1], (ValueError, 'after')) def test_no_jump_infinite_while_loop(output): output.append(1) while True: diff --git a/Python/compile.c b/Python/compile.c index b4f2ceb59a3f10..5a0292646b5c65 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -96,6 +96,10 @@ typedef struct basicblock_ { /* b_return is true if a RETURN_VALUE opcode is inserted. */ unsigned b_return : 1; unsigned b_reachable : 1; + /* Basic block has no fall through (it ends with a return, raise or jump) */ + unsigned b_nofallthrough : 1; + /* Basic block exits scope (it ends with a return or raise) */ + unsigned b_exit : 1; /* depth of stack upon entry of block, computed by stackdepth() */ int b_startdepth; /* instruction offset for block, computed by assemble_jump_offsets() */ @@ -5434,28 +5438,14 @@ struct assembler { PyObject *a_bytecode; /* string containing bytecode */ int a_offset; /* offset into bytecode */ int a_nblocks; /* number of reachable blocks */ - basicblock **a_reverse_postorder; /* list of blocks in dfs postorder */ PyObject *a_lnotab; /* string containing lnotab */ int a_lnotab_off; /* offset into lnotab */ int a_prevlineno; /* lineno of last emitted line in line table */ int a_lineno; /* lineno of last emitted instruction */ int a_lineno_start; /* bytecode start offset of current lineno */ + basicblock *a_entry; }; -static void -dfs(struct compiler *c, basicblock *b, struct assembler *a, int end) -{ - - /* There is no real depth-first-search to do here because all the - * blocks are emitted in topological order already, so we just need to - * follow the b_next pointers and place them in a->a_reverse_postorder in - * reverse order and make sure that the first one starts at 0. */ - - for (a->a_nblocks = 0; b != NULL; b = b->b_next) { - a->a_reverse_postorder[a->a_nblocks++] = b; - } -} - Py_LOCAL_INLINE(void) stackdepth_push(basicblock ***sp, basicblock *b, int depth) { @@ -5553,12 +5543,7 @@ assemble_init(struct assembler *a, int nblocks, int firstlineno) PyErr_NoMemory(); return 0; } - a->a_reverse_postorder = (basicblock **)PyObject_Malloc( - sizeof(basicblock *) * nblocks); - if (!a->a_reverse_postorder) { - PyErr_NoMemory(); - return 0; - } + return 1; } @@ -5567,8 +5552,6 @@ assemble_free(struct assembler *a) { Py_XDECREF(a->a_bytecode); Py_XDECREF(a->a_lnotab); - if (a->a_reverse_postorder) - PyObject_Free(a->a_reverse_postorder); } static int @@ -5697,8 +5680,7 @@ assemble_jump_offsets(struct assembler *a, struct compiler *c) Replace block pointer with position in bytecode. */ do { totsize = 0; - for (i = 0; i < a->a_nblocks; i++) { - b = a->a_reverse_postorder[i]; + for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { bsize = blocksize(b); b->b_offset = totsize; totsize += bsize; @@ -5966,7 +5948,7 @@ assemble(struct compiler *c, int addNone) { basicblock *b, *entryblock; struct assembler a; - int i, j, nblocks; + int j, nblocks; PyCodeObject *co = NULL; PyObject *consts = NULL; @@ -5997,7 +5979,8 @@ assemble(struct compiler *c, int addNone) } if (!assemble_init(&a, nblocks, c->u->u_firstlineno)) goto error; - dfs(c, entryblock, &a, nblocks); + a.a_entry = entryblock; + a.a_nblocks = nblocks; consts = consts_dict_keys_inorder(c->u->u_consts); if (consts == NULL) { @@ -6010,9 +5993,8 @@ assemble(struct compiler *c, int addNone) /* Can't modify the bytecode after computing jump offsets. */ assemble_jump_offsets(&a, c); - /* Emit code in reverse postorder from dfs. */ - for (i = 0; i < a.a_nblocks; i++) { - b = a.a_reverse_postorder[i]; + /* Emit code. */ + for(b = entryblock; b != NULL; b = b->b_next) { for (j = 0; j < b->b_iused; j++) if (!assemble_emit(&a, &b->b_instr[j])) goto error; @@ -6097,6 +6079,8 @@ fold_tuple_on_constants(struct instr *inst, return 0; } +/* Maximum size of basic block that should be copied in optimizer */ +#define MAX_COPY_SIZE 4 /* Optimization */ static int @@ -6238,19 +6222,29 @@ optimize_basic_block(basicblock *bb, PyObject *consts) case JUMP_ABSOLUTE: case JUMP_FORWARD: + assert (i == bb->b_iused-1); switch(target->i_opcode) { case JUMP_FORWARD: inst->i_target = target->i_target; break; case JUMP_ABSOLUTE: - case RETURN_VALUE: - case RERAISE: - case RAISE_VARARGS: lineno = inst->i_lineno; *inst = *target; inst->i_lineno = lineno; break; } + if (inst->i_target->b_exit && inst->i_target->b_iused <= MAX_COPY_SIZE) { + basicblock *to_copy = inst->i_target; + *inst = to_copy->b_instr[0]; + for (i = 1; i < to_copy->b_iused; i++) { + int index = compiler_next_instr(bb); + if (index < 0) { + return -1; + } + bb->b_instr[index] = to_copy->b_instr[i]; + } + bb->b_exit = 1; + } break; } } @@ -6262,52 +6256,63 @@ optimize_basic_block(basicblock *bb, PyObject *consts) static void clean_basic_block(basicblock *bb) { - /* Remove NOPs and any code following a return or re-raise. */ + /* Remove NOPs. */ int dest = 0; int prev_lineno = -1; for (int src = 0; src < bb->b_iused; src++) { int lineno = bb->b_instr[src].i_lineno; - switch(bb->b_instr[src].i_opcode) { - case RETURN_VALUE: - case RERAISE: - bb->b_next = NULL; - bb->b_instr[dest] = bb->b_instr[src]; - dest++; - goto end; - case NOP: - { - /* Eliminate no-op if it doesn't have a line number, or - * if the next instruction has same line number or no line number, or - * if the previous instruction had the same line number. */ - if (lineno < 0) { - break; - } - if (prev_lineno == lineno) { - break; - } - if (src < bb->b_iused - 1) { - int next_lineno = bb->b_instr[src+1].i_lineno; - if (next_lineno < 0 || next_lineno == lineno) { - bb->b_instr[src+1].i_lineno = lineno; - break; - } - } + if (bb->b_instr[src].i_opcode == NOP) { + /* Eliminate no-op if it doesn't have a line number, or + * if the next instruction has same line number or no line number, or + * if the previous instruction had the same line number. */ + if (lineno < 0) { + continue; } - /* fallthrough */ - default: - if (dest != src) { - bb->b_instr[dest] = bb->b_instr[src]; + if (prev_lineno == lineno) { + continue; + } + if (src < bb->b_iused - 1) { + int next_lineno = bb->b_instr[src+1].i_lineno; + if (next_lineno < 0 || next_lineno == lineno) { + bb->b_instr[src+1].i_lineno = lineno; + continue; } - dest++; - prev_lineno = lineno; - break; + } + } + if (dest != src) { + bb->b_instr[dest] = bb->b_instr[src]; } + dest++; + prev_lineno = lineno; } -end: assert(dest <= bb->b_iused); bb->b_iused = dest; } +static void +normalise_basic_block(basicblock *bb) { + /* Remove any code following a return or re-raise, + and mark those blocks as exit and/or nofallthrough. */ + for (int i = 0; i < bb->b_iused; i++) { + switch(bb->b_instr[i].i_opcode) { + case RETURN_VALUE: + case RAISE_VARARGS: + case RERAISE: + bb->b_iused = i+1; + bb->b_exit = 1; + bb->b_nofallthrough = 1; + return; + case JUMP_ABSOLUTE: + case JUMP_FORWARD: + bb->b_iused = i+1; + bb->b_nofallthrough = 1; + return; + } + } +} + + + static int mark_reachable(struct assembler *a) { basicblock **stack, **sp; @@ -6315,12 +6320,11 @@ mark_reachable(struct assembler *a) { if (stack == NULL) { return -1; } - basicblock *entry = a->a_reverse_postorder[0]; - entry->b_reachable = 1; - *sp++ = entry; + a->a_entry->b_reachable = 1; + *sp++ = a->a_entry; while (sp > stack) { basicblock *b = *(--sp); - if (b->b_next && b->b_next->b_reachable == 0) { + if (b->b_next && !b->b_nofallthrough && b->b_next->b_reachable == 0) { b->b_next->b_reachable = 1; *sp++ = b->b_next; } @@ -6352,20 +6356,23 @@ mark_reachable(struct assembler *a) { static int optimize_cfg(struct assembler *a, PyObject *consts) { - for (int i = 0; i < a->a_nblocks; i++) { - if (optimize_basic_block(a->a_reverse_postorder[i], consts)) { + for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { + normalise_basic_block(b); + } + for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { + if (optimize_basic_block(b, consts)) { return -1; } - clean_basic_block(a->a_reverse_postorder[i]); - assert(a->a_reverse_postorder[i]->b_reachable == 0); + clean_basic_block(b); + assert(b->b_reachable == 0); } if (mark_reachable(a)) { return -1; } /* Delete unreachable instructions */ - for (int i = 0; i < a->a_nblocks; i++) { - if (a->a_reverse_postorder[i]->b_reachable == 0) { - a->a_reverse_postorder[i]->b_iused = 0; + for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { + if (b->b_reachable == 0) { + b->b_iused = 0; } } return 0; diff --git a/Python/importlib.h b/Python/importlib.h index 8778c973ef064f..3a3e5a7659c8e9 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -120,84 +120,83 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 128,255,128,122,20,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,0,0,0,0,5,0,0,0,3,0,0,0,67,0, - 0,0,115,88,0,0,0,116,0,160,1,161,0,125,1,124, + 0,0,115,84,0,0,0,116,0,160,1,161,0,125,1,124, 0,106,2,125,2,116,3,131,0,125,3,116,4,160,5,124, 2,161,1,125,4,124,4,100,0,117,0,114,42,100,1,83, 0,124,4,106,2,125,2,124,2,124,1,107,2,114,60,100, 2,83,0,124,2,124,3,118,0,114,72,100,1,83,0,124, - 3,160,6,124,2,161,1,1,0,113,20,100,0,83,0,41, - 3,78,70,84,41,7,114,23,0,0,0,218,9,103,101,116, - 95,105,100,101,110,116,114,26,0,0,0,218,3,115,101,116, - 218,12,95,98,108,111,99,107,105,110,103,95,111,110,218,3, - 103,101,116,218,3,97,100,100,41,5,114,30,0,0,0,90, - 2,109,101,218,3,116,105,100,90,4,115,101,101,110,114,24, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,12,104,97,115,95,100,101,97,100,108,111,99,107, - 66,0,0,0,115,28,0,0,0,8,2,6,1,6,1,10, - 2,8,1,4,1,6,1,8,1,4,1,8,1,4,6,12, - 1,4,128,255,128,122,24,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,0,0,0,0,2,0,0,0, - 8,0,0,0,67,0,0,0,115,210,0,0,0,116,0,160, - 1,161,0,125,1,124,0,116,2,124,1,60,0,122,180,124, - 0,106,3,143,126,1,0,124,0,106,4,100,1,107,2,115, - 46,124,0,106,5,124,1,107,2,114,90,124,1,124,0,95, - 5,124,0,4,0,106,4,100,2,55,0,2,0,95,4,87, - 0,100,3,4,0,4,0,131,3,1,0,87,0,116,2,124, - 1,61,0,100,4,83,0,124,0,160,6,161,0,114,110,116, - 7,100,5,124,0,22,0,131,1,130,1,124,0,106,8,160, - 9,100,6,161,1,114,136,124,0,4,0,106,10,100,2,55, - 0,2,0,95,10,87,0,100,3,4,0,4,0,131,3,1, - 0,110,16,49,0,115,156,48,0,1,0,1,0,1,0,89, - 0,1,0,124,0,106,8,160,9,161,0,1,0,124,0,106, - 8,160,11,161,0,1,0,113,18,87,0,116,2,124,1,61, - 0,110,8,116,2,124,1,61,0,48,0,100,3,83,0,41, - 7,122,185,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,114,22,0,0, - 0,233,1,0,0,0,78,84,122,23,100,101,97,100,108,111, - 99,107,32,100,101,116,101,99,116,101,100,32,98,121,32,37, - 114,70,41,12,114,23,0,0,0,114,32,0,0,0,114,34, - 0,0,0,114,24,0,0,0,114,27,0,0,0,114,26,0, - 0,0,114,38,0,0,0,114,19,0,0,0,114,25,0,0, - 0,218,7,97,99,113,117,105,114,101,114,28,0,0,0,218, - 7,114,101,108,101,97,115,101,169,2,114,30,0,0,0,114, - 37,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,40,0,0,0,87,0,0,0,115,38,0,0, - 0,8,6,8,1,2,1,8,2,20,1,6,1,14,1,14, - 1,6,9,4,247,8,1,12,1,12,1,44,1,10,2,14, - 1,16,2,4,128,255,128,122,19,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,0,0,0,0,2,0,0,0,8,0,0, - 0,67,0,0,0,115,142,0,0,0,116,0,160,1,161,0, - 125,1,124,0,106,2,143,108,1,0,124,0,106,3,124,1, - 107,3,114,34,116,4,100,1,131,1,130,1,124,0,106,5, - 100,2,107,4,115,48,74,0,130,1,124,0,4,0,106,5, - 100,3,56,0,2,0,95,5,124,0,106,5,100,2,107,2, - 114,108,100,0,124,0,95,3,124,0,106,6,114,108,124,0, - 4,0,106,6,100,3,56,0,2,0,95,6,124,0,106,7, - 160,8,161,0,1,0,87,0,100,0,4,0,4,0,131,3, - 1,0,110,16,49,0,115,128,48,0,1,0,1,0,1,0, - 89,0,1,0,100,0,83,0,41,4,78,250,31,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,114,22,0,0, - 0,114,39,0,0,0,41,9,114,23,0,0,0,114,32,0, - 0,0,114,24,0,0,0,114,26,0,0,0,218,12,82,117, - 110,116,105,109,101,69,114,114,111,114,114,27,0,0,0,114, - 28,0,0,0,114,25,0,0,0,114,41,0,0,0,114,42, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,41,0,0,0,112,0,0,0,115,26,0,0,0, - 8,1,8,1,10,1,8,1,14,1,14,1,10,1,6,1, - 6,1,14,1,40,1,4,128,255,128,122,19,95,77,111,100, + 3,160,6,124,2,161,1,1,0,113,20,41,3,78,70,84, + 41,7,114,23,0,0,0,218,9,103,101,116,95,105,100,101, + 110,116,114,26,0,0,0,218,3,115,101,116,218,12,95,98, + 108,111,99,107,105,110,103,95,111,110,218,3,103,101,116,218, + 3,97,100,100,41,5,114,30,0,0,0,90,2,109,101,218, + 3,116,105,100,90,4,115,101,101,110,114,24,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,12, + 104,97,115,95,100,101,97,100,108,111,99,107,66,0,0,0, + 115,26,0,0,0,8,2,6,1,6,1,10,2,8,1,4, + 1,6,1,8,1,4,1,8,1,4,6,12,1,255,128,122, + 24,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,0,0,0,0,2,0,0,0,8,0,0,0,67,0, + 0,0,115,196,0,0,0,116,0,160,1,161,0,125,1,124, + 0,116,2,124,1,60,0,122,170,124,0,106,3,143,126,1, + 0,124,0,106,4,100,1,107,2,115,46,124,0,106,5,124, + 1,107,2,114,90,124,1,124,0,95,5,124,0,4,0,106, + 4,100,2,55,0,2,0,95,4,87,0,100,3,4,0,4, + 0,131,3,1,0,87,0,116,2,124,1,61,0,100,4,83, + 0,124,0,160,6,161,0,114,110,116,7,100,5,124,0,22, + 0,131,1,130,1,124,0,106,8,160,9,100,6,161,1,114, + 136,124,0,4,0,106,10,100,2,55,0,2,0,95,10,87, + 0,100,3,4,0,4,0,131,3,1,0,110,16,49,0,115, + 156,48,0,1,0,1,0,1,0,89,0,1,0,124,0,106, + 8,160,9,161,0,1,0,124,0,106,8,160,11,161,0,1, + 0,113,18,116,2,124,1,61,0,48,0,41,7,122,185,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,114,22,0,0,0,233,1,0, + 0,0,78,84,122,23,100,101,97,100,108,111,99,107,32,100, + 101,116,101,99,116,101,100,32,98,121,32,37,114,70,41,12, + 114,23,0,0,0,114,32,0,0,0,114,34,0,0,0,114, + 24,0,0,0,114,27,0,0,0,114,26,0,0,0,114,38, + 0,0,0,114,19,0,0,0,114,25,0,0,0,218,7,97, + 99,113,117,105,114,101,114,28,0,0,0,218,7,114,101,108, + 101,97,115,101,169,2,114,30,0,0,0,114,37,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 40,0,0,0,87,0,0,0,115,36,0,0,0,8,6,8, + 1,2,1,8,2,20,1,6,1,14,1,14,1,6,9,4, + 247,8,1,12,1,12,1,44,1,10,2,12,1,8,2,255, + 128,122,19,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,0, + 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, + 144,0,0,0,116,0,160,1,161,0,125,1,124,0,106,2, + 143,110,1,0,124,0,106,3,124,1,107,3,114,34,116,4, + 100,1,131,1,130,1,124,0,106,5,100,2,107,4,115,48, + 74,0,130,1,124,0,4,0,106,5,100,3,56,0,2,0, + 95,5,124,0,106,5,100,2,107,2,114,108,100,0,124,0, + 95,3,124,0,106,6,114,108,124,0,4,0,106,6,100,3, + 56,0,2,0,95,6,124,0,106,7,160,8,161,0,1,0, + 87,0,100,0,4,0,4,0,131,3,1,0,100,0,83,0, + 49,0,115,130,48,0,1,0,1,0,1,0,89,0,1,0, + 100,0,83,0,41,4,78,250,31,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,114,22,0,0,0,114,39,0, + 0,0,41,9,114,23,0,0,0,114,32,0,0,0,114,24, + 0,0,0,114,26,0,0,0,218,12,82,117,110,116,105,109, + 101,69,114,114,111,114,114,27,0,0,0,114,28,0,0,0, + 114,25,0,0,0,114,41,0,0,0,114,42,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,41, + 0,0,0,112,0,0,0,115,30,0,0,0,8,1,8,1, + 10,1,8,1,14,1,14,1,10,1,6,1,6,1,14,1, + 22,1,4,128,16,0,4,128,255,128,122,19,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,0,0,0,0,1,0,0,0, 5,0,0,0,67,0,0,0,115,18,0,0,0,100,1,160, @@ -310,570 +309,571 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,114,51,0,0,0,150,0,0,0,115,10,0,0,0,8, 0,8,2,8,4,12,4,255,128,114,51,0,0,0,99,1, 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8, - 0,0,0,67,0,0,0,115,136,0,0,0,116,0,160,1, - 161,0,1,0,122,112,122,14,116,2,124,0,25,0,131,0, + 0,0,0,67,0,0,0,115,134,0,0,0,116,0,160,1, + 161,0,1,0,122,114,122,14,116,2,124,0,25,0,131,0, 125,1,87,0,110,22,4,0,116,3,121,46,1,0,1,0, 1,0,100,1,125,1,89,0,110,2,48,0,124,1,100,1, 117,0,114,110,116,4,100,1,117,0,114,74,116,5,124,0, 131,1,125,1,110,8,116,6,124,0,131,1,125,1,124,0, 102,1,100,2,100,3,132,1,125,2,116,7,160,8,124,1, 124,2,161,2,116,2,124,0,60,0,87,0,116,0,160,9, - 161,0,1,0,110,10,116,0,160,9,161,0,1,0,48,0, - 124,1,83,0,41,4,122,139,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,65,99,113,117,105,114,101,47,114,101,108,101, - 97,115,101,32,105,110,116,101,114,110,97,108,108,121,32,116, - 104,101,32,103,108,111,98,97,108,32,105,109,112,111,114,116, - 32,108,111,99,107,32,116,111,32,112,114,111,116,101,99,116, - 10,32,32,32,32,95,109,111,100,117,108,101,95,108,111,99, - 107,115,46,78,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,8,0,0,0,83,0,0,0,115,56,0, - 0,0,116,0,160,1,161,0,1,0,122,32,116,2,160,3, - 124,1,161,1,124,0,117,0,114,30,116,2,124,1,61,0, - 87,0,116,0,160,4,161,0,1,0,110,10,116,0,160,4, - 161,0,1,0,48,0,100,0,83,0,114,13,0,0,0,41, - 5,218,4,95,105,109,112,218,12,97,99,113,117,105,114,101, - 95,108,111,99,107,218,13,95,109,111,100,117,108,101,95,108, - 111,99,107,115,114,35,0,0,0,218,12,114,101,108,101,97, - 115,101,95,108,111,99,107,41,2,218,3,114,101,102,114,17, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,2,99,98,185,0,0,0,115,14,0,0,0,8, - 1,2,1,14,4,8,1,20,2,4,128,255,128,122,28,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,41,10,114,58,0, - 0,0,114,59,0,0,0,114,60,0,0,0,218,8,75,101, - 121,69,114,114,111,114,114,23,0,0,0,114,50,0,0,0, - 114,20,0,0,0,218,8,95,119,101,97,107,114,101,102,114, - 62,0,0,0,114,61,0,0,0,41,3,114,17,0,0,0, - 114,24,0,0,0,114,63,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,54,0,0,0,166,0, - 0,0,115,30,0,0,0,8,6,2,1,2,1,14,1,12, - 1,10,1,8,2,8,1,10,1,8,2,12,2,18,11,20, - 2,4,2,255,128,114,54,0,0,0,99,1,0,0,0,0, + 161,0,1,0,124,1,83,0,116,0,160,9,161,0,1,0, + 48,0,41,4,122,139,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,65,99,113,117,105,114,101,47,114,101,108,101,97,115, + 101,32,105,110,116,101,114,110,97,108,108,121,32,116,104,101, + 32,103,108,111,98,97,108,32,105,109,112,111,114,116,32,108, + 111,99,107,32,116,111,32,112,114,111,116,101,99,116,10,32, + 32,32,32,95,109,111,100,117,108,101,95,108,111,99,107,115, + 46,78,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,8,0,0,0,83,0,0,0,115,54,0,0,0, + 116,0,160,1,161,0,1,0,122,34,116,2,160,3,124,1, + 161,1,124,0,117,0,114,30,116,2,124,1,61,0,87,0, + 116,0,160,4,161,0,1,0,100,0,83,0,116,0,160,4, + 161,0,1,0,48,0,114,13,0,0,0,41,5,218,4,95, + 105,109,112,218,12,97,99,113,117,105,114,101,95,108,111,99, + 107,218,13,95,109,111,100,117,108,101,95,108,111,99,107,115, + 114,35,0,0,0,218,12,114,101,108,101,97,115,101,95,108, + 111,99,107,41,2,218,3,114,101,102,114,17,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,2, + 99,98,185,0,0,0,115,16,0,0,0,8,1,2,1,14, + 4,8,1,8,2,4,128,10,0,255,128,122,28,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,41,10,114,58,0,0,0, + 114,59,0,0,0,114,60,0,0,0,218,8,75,101,121,69, + 114,114,111,114,114,23,0,0,0,114,50,0,0,0,114,20, + 0,0,0,218,8,95,119,101,97,107,114,101,102,114,62,0, + 0,0,114,61,0,0,0,41,3,114,17,0,0,0,114,24, + 0,0,0,114,63,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,54,0,0,0,166,0,0,0, + 115,32,0,0,0,8,6,2,1,2,1,14,1,12,1,10, + 1,8,2,8,1,10,1,8,2,12,2,18,11,8,2,4, + 2,10,254,255,128,114,54,0,0,0,99,1,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,67, - 0,0,0,115,52,0,0,0,116,0,124,0,131,1,125,1, - 122,12,124,1,160,1,161,0,1,0,87,0,110,18,4,0, - 116,2,121,38,1,0,1,0,1,0,89,0,110,10,48,0, - 124,1,160,3,161,0,1,0,100,1,83,0,41,2,122,189, - 65,99,113,117,105,114,101,115,32,116,104,101,110,32,114,101, - 108,101,97,115,101,115,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,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,32,32,32,32,78,41,4, - 114,54,0,0,0,114,40,0,0,0,114,19,0,0,0,114, - 41,0,0,0,41,2,114,17,0,0,0,114,24,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 19,95,108,111,99,107,95,117,110,108,111,99,107,95,109,111, - 100,117,108,101,203,0,0,0,115,16,0,0,0,8,6,2, - 1,12,1,12,1,6,3,8,2,4,128,255,128,114,66,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,4,0,0,0,79,0,0,0,115,14,0,0,0, - 124,0,124,1,105,0,124,2,164,1,142,1,83,0,41,1, - 97,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,114,10,0,0,0,41,3,218,1,102,114,56,0, - 0,0,90,4,107,119,100,115,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,25,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,220,0,0,0,115,4,0,0,0,14,8,255,128,114, - 68,0,0,0,114,39,0,0,0,41,1,218,9,118,101,114, - 98,111,115,105,116,121,99,1,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,4,0,0,0,71,0,0,0,115, - 54,0,0,0,116,0,106,1,106,2,124,1,107,5,114,50, - 124,0,160,3,100,1,161,1,115,30,100,2,124,0,23,0, - 125,0,116,4,124,0,106,5,124,2,142,0,116,0,106,6, - 100,3,141,2,1,0,100,4,83,0,41,5,122,61,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,41,2,250,1,35, - 122,7,105,109,112,111,114,116,32,122,2,35,32,41,1,90, - 4,102,105,108,101,78,41,7,114,15,0,0,0,218,5,102, - 108,97,103,115,218,7,118,101,114,98,111,115,101,218,10,115, - 116,97,114,116,115,119,105,116,104,218,5,112,114,105,110,116, - 114,46,0,0,0,218,6,115,116,100,101,114,114,41,3,218, - 7,109,101,115,115,97,103,101,114,69,0,0,0,114,56,0, + 0,0,0,115,54,0,0,0,116,0,124,0,131,1,125,1, + 122,12,124,1,160,1,161,0,1,0,87,0,110,20,4,0, + 116,2,121,40,1,0,1,0,1,0,89,0,100,1,83,0, + 48,0,124,1,160,3,161,0,1,0,100,1,83,0,41,2, + 122,189,65,99,113,117,105,114,101,115,32,116,104,101,110,32, + 114,101,108,101,97,115,101,115,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,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,32,32,32,32,78, + 41,4,114,54,0,0,0,114,40,0,0,0,114,19,0,0, + 0,114,41,0,0,0,41,2,114,17,0,0,0,114,24,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,16,95,118,101,114,98,111,115,101,95,109,101,115,115, - 97,103,101,231,0,0,0,115,12,0,0,0,12,2,10,1, - 8,1,20,1,4,128,255,128,114,77,0,0,0,99,1,0, + 0,218,19,95,108,111,99,107,95,117,110,108,111,99,107,95, + 109,111,100,117,108,101,203,0,0,0,115,20,0,0,0,8, + 6,2,1,12,1,12,1,2,3,4,128,2,0,8,2,4, + 128,255,128,114,66,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,4,0,0,0,79,0,0, + 0,115,14,0,0,0,124,0,124,1,105,0,124,2,164,1, + 142,1,83,0,41,1,97,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,114,10,0,0,0,41,3, + 218,1,102,114,56,0,0,0,90,4,107,119,100,115,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,25,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,220,0,0,0,115,4,0,0, + 0,14,8,255,128,114,68,0,0,0,114,39,0,0,0,41, + 1,218,9,118,101,114,98,111,115,105,116,121,99,1,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,4,0,0, + 0,71,0,0,0,115,54,0,0,0,116,0,106,1,106,2, + 124,1,107,5,114,50,124,0,160,3,100,1,161,1,115,30, + 100,2,124,0,23,0,125,0,116,4,124,0,106,5,124,2, + 142,0,116,0,106,6,100,3,141,2,1,0,100,4,83,0, + 41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111,114,116,32,122, + 2,35,32,41,1,90,4,102,105,108,101,78,41,7,114,15, + 0,0,0,218,5,102,108,97,103,115,218,7,118,101,114,98, + 111,115,101,218,10,115,116,97,114,116,115,119,105,116,104,218, + 5,112,114,105,110,116,114,46,0,0,0,218,6,115,116,100, + 101,114,114,41,3,218,7,109,101,115,115,97,103,101,114,69, + 0,0,0,114,56,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,16,95,118,101,114,98,111,115, + 101,95,109,101,115,115,97,103,101,231,0,0,0,115,12,0, + 0,0,12,2,10,1,8,1,20,1,4,128,255,128,114,77, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,3,0,0,0,115,26,0,0, + 0,135,0,102,1,100,1,100,2,132,8,125,1,116,0,124, + 1,136,0,131,2,1,0,124,1,83,0,41,3,122,49,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,0,0,0,0,2,0,0, + 0,4,0,0,0,19,0,0,0,115,38,0,0,0,124,1, + 116,0,106,1,118,1,114,28,116,2,100,1,160,3,124,1, + 161,1,124,1,100,2,141,2,130,1,136,0,124,0,124,1, + 131,2,83,0,41,3,78,250,29,123,33,114,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,114,16,0,0,0,41,4,114,15,0, + 0,0,218,20,98,117,105,108,116,105,110,95,109,111,100,117, + 108,101,95,110,97,109,101,115,218,11,73,109,112,111,114,116, + 69,114,114,111,114,114,46,0,0,0,169,2,114,30,0,0, + 0,218,8,102,117,108,108,110,97,109,101,169,1,218,3,102, + 120,110,114,10,0,0,0,114,11,0,0,0,218,25,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,241,0,0,0,115,12,0,0,0, + 10,1,10,1,2,1,6,255,10,2,255,128,122,52,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,169,1,114,12,0,0,0,41,2,114,84,0,0,0, + 114,85,0,0,0,114,10,0,0,0,114,83,0,0,0,114, + 11,0,0,0,218,17,95,114,101,113,117,105,114,101,115,95, + 98,117,105,108,116,105,110,239,0,0,0,115,8,0,0,0, + 12,2,10,5,4,1,255,128,114,87,0,0,0,99,1,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, 0,0,3,0,0,0,115,26,0,0,0,135,0,102,1,100, 1,100,2,132,8,125,1,116,0,124,1,136,0,131,2,1, - 0,124,1,83,0,41,3,122,49,68,101,99,111,114,97,116, + 0,124,1,83,0,41,3,122,47,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,0,0,0,0,2,0,0,0,4,0,0,0,19, - 0,0,0,115,38,0,0,0,124,1,116,0,106,1,118,1, - 114,28,116,2,100,1,160,3,124,1,161,1,124,1,100,2, - 141,2,130,1,136,0,124,0,124,1,131,2,83,0,41,3, - 78,250,29,123,33,114,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, - 114,16,0,0,0,41,4,114,15,0,0,0,218,20,98,117, - 105,108,116,105,110,95,109,111,100,117,108,101,95,110,97,109, - 101,115,218,11,73,109,112,111,114,116,69,114,114,111,114,114, - 46,0,0,0,169,2,114,30,0,0,0,218,8,102,117,108, - 108,110,97,109,101,169,1,218,3,102,120,110,114,10,0,0, - 0,114,11,0,0,0,218,25,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,241,0,0,0,115,12,0,0,0,10,1,10,1,2,1, - 6,255,10,2,255,128,122,52,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,169,1,114,12, - 0,0,0,41,2,114,84,0,0,0,114,85,0,0,0,114, - 10,0,0,0,114,83,0,0,0,114,11,0,0,0,218,17, - 95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,105, - 110,239,0,0,0,115,8,0,0,0,12,2,10,5,4,1, - 255,128,114,87,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0, - 115,26,0,0,0,135,0,102,1,100,1,100,2,132,8,125, - 1,116,0,124,1,136,0,131,2,1,0,124,1,83,0,41, - 3,122,47,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,0,0,0,0,2, - 0,0,0,4,0,0,0,19,0,0,0,115,38,0,0,0, - 116,0,160,1,124,1,161,1,115,28,116,2,100,1,160,3, - 124,1,161,1,124,1,100,2,141,2,130,1,136,0,124,0, - 124,1,131,2,83,0,169,3,78,122,27,123,33,114,125,32, - 105,115,32,110,111,116,32,97,32,102,114,111,122,101,110,32, - 109,111,100,117,108,101,114,16,0,0,0,41,4,114,58,0, - 0,0,218,9,105,115,95,102,114,111,122,101,110,114,80,0, - 0,0,114,46,0,0,0,114,81,0,0,0,114,83,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,24,95,114,101, - 113,117,105,114,101,115,95,102,114,111,122,101,110,95,119,114, - 97,112,112,101,114,252,0,0,0,115,12,0,0,0,10,1, - 10,1,2,1,6,255,10,2,255,128,122,50,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,114,86, - 0,0,0,41,2,114,84,0,0,0,114,90,0,0,0,114, - 10,0,0,0,114,83,0,0,0,114,11,0,0,0,218,16, - 95,114,101,113,117,105,114,101,115,95,102,114,111,122,101,110, - 250,0,0,0,115,8,0,0,0,12,2,10,5,4,1,255, - 128,114,91,0,0,0,99,2,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,3,0,0,0,67,0,0,0,115, - 58,0,0,0,116,0,124,1,124,0,131,2,125,2,124,1, - 116,1,106,2,118,0,114,50,116,1,106,2,124,1,25,0, - 125,3,116,3,124,2,124,3,131,2,1,0,116,1,106,2, - 124,1,25,0,83,0,116,4,124,2,131,1,83,0,41,2, - 122,128,76,111,97,100,32,116,104,101,32,115,112,101,99,105, - 102,105,101,100,32,109,111,100,117,108,101,32,105,110,116,111, - 32,115,121,115,46,109,111,100,117,108,101,115,32,97,110,100, - 32,114,101,116,117,114,110,32,105,116,46,10,10,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,108,111,97,100,101,114,46,101,120,101,99,95,109,111,100, - 117,108,101,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,78,41,5,218,16,115,112,101,99,95,102,114,111,109, - 95,108,111,97,100,101,114,114,15,0,0,0,218,7,109,111, - 100,117,108,101,115,218,5,95,101,120,101,99,218,5,95,108, - 111,97,100,41,4,114,30,0,0,0,114,82,0,0,0,218, - 4,115,112,101,99,218,6,109,111,100,117,108,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,17,95,108, - 111,97,100,95,109,111,100,117,108,101,95,115,104,105,109,6, - 1,0,0,115,14,0,0,0,10,6,10,1,10,1,10,1, - 10,1,8,2,255,128,114,98,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,8,0,0,0, - 67,0,0,0,115,210,0,0,0,116,0,124,0,100,1,100, - 0,131,3,125,1,116,1,124,1,100,2,131,2,114,54,122, - 12,124,1,160,2,124,0,161,1,87,0,83,0,4,0,116, - 3,121,52,1,0,1,0,1,0,89,0,110,2,48,0,122, - 10,124,0,106,4,125,2,87,0,110,18,4,0,116,5,121, - 82,1,0,1,0,1,0,89,0,110,18,48,0,124,2,100, - 0,117,1,114,100,116,6,124,2,131,1,83,0,122,10,124, - 0,106,7,125,3,87,0,110,22,4,0,116,5,121,132,1, - 0,1,0,1,0,100,3,125,3,89,0,110,2,48,0,122, - 10,124,0,106,8,125,4,87,0,110,52,4,0,116,5,121, - 196,1,0,1,0,1,0,124,1,100,0,117,0,114,180,100, - 4,160,9,124,3,161,1,6,0,89,0,83,0,100,5,160, - 9,124,3,124,1,161,2,6,0,89,0,83,0,48,0,100, - 6,160,9,124,3,124,4,161,2,83,0,41,7,78,218,10, - 95,95,108,111,97,100,101,114,95,95,218,11,109,111,100,117, - 108,101,95,114,101,112,114,250,1,63,250,13,60,109,111,100, - 117,108,101,32,123,33,114,125,62,250,20,60,109,111,100,117, - 108,101,32,123,33,114,125,32,40,123,33,114,125,41,62,250, - 23,60,109,111,100,117,108,101,32,123,33,114,125,32,102,114, - 111,109,32,123,33,114,125,62,41,10,114,6,0,0,0,114, - 4,0,0,0,114,100,0,0,0,218,9,69,120,99,101,112, - 116,105,111,110,218,8,95,95,115,112,101,99,95,95,218,14, - 65,116,116,114,105,98,117,116,101,69,114,114,111,114,218,22, - 95,109,111,100,117,108,101,95,114,101,112,114,95,102,114,111, - 109,95,115,112,101,99,114,1,0,0,0,218,8,95,95,102, - 105,108,101,95,95,114,46,0,0,0,41,5,114,97,0,0, - 0,218,6,108,111,97,100,101,114,114,96,0,0,0,114,17, - 0,0,0,218,8,102,105,108,101,110,97,109,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,12,95,109, - 111,100,117,108,101,95,114,101,112,114,22,1,0,0,115,48, - 0,0,0,12,2,10,1,2,4,12,1,12,1,6,1,2, - 1,10,1,12,1,6,1,8,2,8,1,2,4,10,1,12, - 1,10,1,2,1,10,1,12,1,8,1,14,1,18,2,12, - 2,255,128,114,112,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, - 0,115,114,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,2,100,2,100,3,156,3,100,4,100,5, - 132,2,90,4,100,6,100,7,132,0,90,5,100,8,100,9, - 132,0,90,6,101,7,100,10,100,11,132,0,131,1,90,8, - 101,8,106,9,100,12,100,11,132,0,131,1,90,8,101,7, - 100,13,100,14,132,0,131,1,90,10,101,7,100,15,100,16, - 132,0,131,1,90,11,101,11,106,9,100,17,100,16,132,0, - 131,1,90,11,100,2,83,0,41,18,218,10,77,111,100,117, - 108,101,83,112,101,99,97,208,5,0,0,84,104,101,32,115, - 112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114, - 32,97,32,109,111,100,117,108,101,44,32,117,115,101,100,32, - 102,111,114,32,108,111,97,100,105,110,103,46,10,10,32,32, - 32,32,65,32,109,111,100,117,108,101,39,115,32,115,112,101, - 99,32,105,115,32,116,104,101,32,115,111,117,114,99,101,32, - 102,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32, - 97,98,111,117,116,32,116,104,101,32,109,111,100,117,108,101, - 46,32,32,70,111,114,10,32,32,32,32,100,97,116,97,32, - 97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32, - 116,104,101,32,109,111,100,117,108,101,44,32,105,110,99,108, - 117,100,105,110,103,32,115,111,117,114,99,101,44,32,117,115, - 101,32,116,104,101,32,115,112,101,99,39,115,10,32,32,32, - 32,108,111,97,100,101,114,46,10,10,32,32,32,32,96,110, - 97,109,101,96,32,105,115,32,116,104,101,32,97,98,115,111, - 108,117,116,101,32,110,97,109,101,32,111,102,32,116,104,101, - 32,109,111,100,117,108,101,46,32,32,96,108,111,97,100,101, - 114,96,32,105,115,32,116,104,101,32,108,111,97,100,101,114, - 10,32,32,32,32,116,111,32,117,115,101,32,119,104,101,110, - 32,108,111,97,100,105,110,103,32,116,104,101,32,109,111,100, - 117,108,101,46,32,32,96,112,97,114,101,110,116,96,32,105, - 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, - 101,10,32,32,32,32,112,97,99,107,97,103,101,32,116,104, - 101,32,109,111,100,117,108,101,32,105,115,32,105,110,46,32, - 32,84,104,101,32,112,97,114,101,110,116,32,105,115,32,100, - 101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32, - 110,97,109,101,46,10,10,32,32,32,32,96,105,115,95,112, - 97,99,107,97,103,101,96,32,100,101,116,101,114,109,105,110, - 101,115,32,105,102,32,116,104,101,32,109,111,100,117,108,101, - 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, - 32,112,97,99,107,97,103,101,32,111,114,10,32,32,32,32, - 110,111,116,46,32,32,79,110,32,109,111,100,117,108,101,115, - 32,116,104,105,115,32,105,115,32,114,101,102,108,101,99,116, - 101,100,32,98,121,32,116,104,101,32,96,95,95,112,97,116, - 104,95,95,96,32,97,116,116,114,105,98,117,116,101,46,10, - 10,32,32,32,32,96,111,114,105,103,105,110,96,32,105,115, - 32,116,104,101,32,115,112,101,99,105,102,105,99,32,108,111, - 99,97,116,105,111,110,32,117,115,101,100,32,98,121,32,116, - 104,101,32,108,111,97,100,101,114,32,102,114,111,109,32,119, - 104,105,99,104,32,116,111,10,32,32,32,32,108,111,97,100, - 32,116,104,101,32,109,111,100,117,108,101,44,32,105,102,32, - 116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110, - 32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,32, - 87,104,101,110,32,102,105,108,101,110,97,109,101,32,105,115, - 10,32,32,32,32,115,101,116,44,32,111,114,105,103,105,110, - 32,119,105,108,108,32,109,97,116,99,104,46,10,10,32,32, - 32,32,96,104,97,115,95,108,111,99,97,116,105,111,110,96, - 32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32, - 97,32,115,112,101,99,39,115,32,34,111,114,105,103,105,110, - 34,32,114,101,102,108,101,99,116,115,32,97,32,108,111,99, - 97,116,105,111,110,46,10,32,32,32,32,87,104,101,110,32, - 116,104,105,115,32,105,115,32,84,114,117,101,44,32,96,95, - 95,102,105,108,101,95,95,96,32,97,116,116,114,105,98,117, - 116,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, - 32,105,115,32,115,101,116,46,10,10,32,32,32,32,96,99, - 97,99,104,101,100,96,32,105,115,32,116,104,101,32,108,111, - 99,97,116,105,111,110,32,111,102,32,116,104,101,32,99,97, - 99,104,101,100,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,44,32,105,102,32,97,110,121,46,32,32,73,116,10, - 32,32,32,32,99,111,114,114,101,115,112,111,110,100,115,32, - 116,111,32,116,104,101,32,96,95,95,99,97,99,104,101,100, - 95,95,96,32,97,116,116,114,105,98,117,116,101,46,10,10, - 32,32,32,32,96,115,117,98,109,111,100,117,108,101,95,115, - 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,96, - 32,105,115,32,116,104,101,32,115,101,113,117,101,110,99,101, - 32,111,102,32,112,97,116,104,32,101,110,116,114,105,101,115, - 32,116,111,10,32,32,32,32,115,101,97,114,99,104,32,119, - 104,101,110,32,105,109,112,111,114,116,105,110,103,32,115,117, - 98,109,111,100,117,108,101,115,46,32,32,73,102,32,115,101, - 116,44,32,105,115,95,112,97,99,107,97,103,101,32,115,104, - 111,117,108,100,32,98,101,10,32,32,32,32,84,114,117,101, - 45,45,97,110,100,32,70,97,108,115,101,32,111,116,104,101, - 114,119,105,115,101,46,10,10,32,32,32,32,80,97,99,107, - 97,103,101,115,32,97,114,101,32,115,105,109,112,108,121,32, - 109,111,100,117,108,101,115,32,116,104,97,116,32,40,109,97, - 121,41,32,104,97,118,101,32,115,117,98,109,111,100,117,108, - 101,115,46,32,32,73,102,32,97,32,115,112,101,99,10,32, - 32,32,32,104,97,115,32,97,32,110,111,110,45,78,111,110, - 101,32,118,97,108,117,101,32,105,110,32,96,115,117,98,109, - 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,96,44,32,116,104,101,32,105,109,112, - 111,114,116,10,32,32,32,32,115,121,115,116,101,109,32,119, - 105,108,108,32,99,111,110,115,105,100,101,114,32,109,111,100, - 117,108,101,115,32,108,111,97,100,101,100,32,102,114,111,109, - 32,116,104,101,32,115,112,101,99,32,97,115,32,112,97,99, - 107,97,103,101,115,46,10,10,32,32,32,32,79,110,108,121, - 32,102,105,110,100,101,114,115,32,40,115,101,101,32,105,109, - 112,111,114,116,108,105,98,46,97,98,99,46,77,101,116,97, - 80,97,116,104,70,105,110,100,101,114,32,97,110,100,10,32, - 32,32,32,105,109,112,111,114,116,108,105,98,46,97,98,99, - 46,80,97,116,104,69,110,116,114,121,70,105,110,100,101,114, - 41,32,115,104,111,117,108,100,32,109,111,100,105,102,121,32, - 77,111,100,117,108,101,83,112,101,99,32,105,110,115,116,97, - 110,99,101,115,46,10,10,32,32,32,32,78,41,3,218,6, - 111,114,105,103,105,110,218,12,108,111,97,100,101,114,95,115, - 116,97,116,101,218,10,105,115,95,112,97,99,107,97,103,101, - 99,3,0,0,0,0,0,0,0,3,0,0,0,6,0,0, - 0,2,0,0,0,67,0,0,0,115,54,0,0,0,124,1, - 124,0,95,0,124,2,124,0,95,1,124,3,124,0,95,2, - 124,4,124,0,95,3,124,5,114,32,103,0,110,2,100,0, - 124,0,95,4,100,1,124,0,95,5,100,0,124,0,95,6, - 100,0,83,0,41,2,78,70,41,7,114,17,0,0,0,114, - 110,0,0,0,114,114,0,0,0,114,115,0,0,0,218,26, - 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, - 95,108,111,99,97,116,105,111,110,115,218,13,95,115,101,116, - 95,102,105,108,101,97,116,116,114,218,7,95,99,97,99,104, - 101,100,41,6,114,30,0,0,0,114,17,0,0,0,114,110, - 0,0,0,114,114,0,0,0,114,115,0,0,0,114,116,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,31,0,0,0,95,1,0,0,115,18,0,0,0,6, - 2,6,1,6,1,6,1,14,1,6,3,6,1,4,128,255, - 128,122,19,77,111,100,117,108,101,83,112,101,99,46,95,95, - 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,6,0,0,0,67,0,0,0,115, - 102,0,0,0,100,1,160,0,124,0,106,1,161,1,100,2, - 160,0,124,0,106,2,161,1,103,2,125,1,124,0,106,3, - 100,0,117,1,114,52,124,1,160,4,100,3,160,0,124,0, - 106,3,161,1,161,1,1,0,124,0,106,5,100,0,117,1, - 114,80,124,1,160,4,100,4,160,0,124,0,106,5,161,1, - 161,1,1,0,100,5,160,0,124,0,106,6,106,7,100,6, - 160,8,124,1,161,1,161,2,83,0,41,7,78,122,9,110, - 97,109,101,61,123,33,114,125,122,11,108,111,97,100,101,114, - 61,123,33,114,125,122,11,111,114,105,103,105,110,61,123,33, - 114,125,122,29,115,117,98,109,111,100,117,108,101,95,115,101, - 97,114,99,104,95,108,111,99,97,116,105,111,110,115,61,123, - 125,122,6,123,125,40,123,125,41,122,2,44,32,41,9,114, - 46,0,0,0,114,17,0,0,0,114,110,0,0,0,114,114, - 0,0,0,218,6,97,112,112,101,110,100,114,117,0,0,0, - 218,9,95,95,99,108,97,115,115,95,95,114,1,0,0,0, - 218,4,106,111,105,110,41,2,114,30,0,0,0,114,56,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,49,0,0,0,107,1,0,0,115,22,0,0,0,10, - 1,10,1,4,255,10,2,18,1,10,1,8,1,4,1,6, - 255,22,2,255,128,122,19,77,111,100,117,108,101,83,112,101, - 99,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,67, - 0,0,0,115,102,0,0,0,124,0,106,0,125,2,122,72, - 124,0,106,1,124,1,106,1,107,2,111,76,124,0,106,2, - 124,1,106,2,107,2,111,76,124,0,106,3,124,1,106,3, - 107,2,111,76,124,2,124,1,106,0,107,2,111,76,124,0, - 106,4,124,1,106,4,107,2,111,76,124,0,106,5,124,1, - 106,5,107,2,87,0,83,0,4,0,116,6,121,100,1,0, - 1,0,1,0,116,7,6,0,89,0,83,0,48,0,114,13, - 0,0,0,41,8,114,117,0,0,0,114,17,0,0,0,114, - 110,0,0,0,114,114,0,0,0,218,6,99,97,99,104,101, - 100,218,12,104,97,115,95,108,111,99,97,116,105,111,110,114, - 107,0,0,0,218,14,78,111,116,73,109,112,108,101,109,101, - 110,116,101,100,41,3,114,30,0,0,0,90,5,111,116,104, - 101,114,90,4,115,109,115,108,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,6,95,95,101,113,95,95,117, - 1,0,0,115,32,0,0,0,6,1,2,1,12,1,10,1, - 2,255,10,2,2,254,8,3,2,253,10,4,2,252,10,5, - 4,251,12,6,10,1,255,128,122,17,77,111,100,117,108,101, - 83,112,101,99,46,95,95,101,113,95,95,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,58,0,0,0,124,0,106,0,100,0,117, - 0,114,52,124,0,106,1,100,0,117,1,114,52,124,0,106, - 2,114,52,116,3,100,0,117,0,114,38,116,4,130,1,116, - 3,160,5,124,0,106,1,161,1,124,0,95,0,124,0,106, - 0,83,0,114,13,0,0,0,41,6,114,119,0,0,0,114, - 114,0,0,0,114,118,0,0,0,218,19,95,98,111,111,116, - 115,116,114,97,112,95,101,120,116,101,114,110,97,108,218,19, - 78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,114, - 114,111,114,90,11,95,103,101,116,95,99,97,99,104,101,100, - 114,48,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,123,0,0,0,129,1,0,0,115,14,0, - 0,0,10,2,16,1,8,1,4,1,14,1,6,1,255,128, - 122,17,77,111,100,117,108,101,83,112,101,99,46,99,97,99, - 104,101,100,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,2,0,0,0,67,0,0,0,115,10,0,0, - 0,124,1,124,0,95,0,100,0,83,0,114,13,0,0,0, - 41,1,114,119,0,0,0,41,2,114,30,0,0,0,114,123, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,123,0,0,0,138,1,0,0,115,6,0,0,0, - 6,2,4,128,255,128,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 32,0,0,0,124,0,106,0,100,1,117,0,114,26,124,0, - 106,1,160,2,100,2,161,1,100,3,25,0,83,0,124,0, - 106,1,83,0,41,4,122,32,84,104,101,32,110,97,109,101, - 32,111,102,32,116,104,101,32,109,111,100,117,108,101,39,115, - 32,112,97,114,101,110,116,46,78,218,1,46,114,22,0,0, - 0,41,3,114,117,0,0,0,114,17,0,0,0,218,10,114, - 112,97,114,116,105,116,105,111,110,114,48,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,6,112, - 97,114,101,110,116,142,1,0,0,115,8,0,0,0,10,3, - 16,1,6,2,255,128,122,17,77,111,100,117,108,101,83,112, - 101,99,46,112,97,114,101,110,116,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,1,0,0,0,67,0, - 0,0,115,6,0,0,0,124,0,106,0,83,0,114,13,0, - 0,0,41,1,114,118,0,0,0,114,48,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,124,0, - 0,0,150,1,0,0,115,4,0,0,0,6,2,255,128,122, - 23,77,111,100,117,108,101,83,112,101,99,46,104,97,115,95, - 108,111,99,97,116,105,111,110,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, - 0,115,14,0,0,0,116,0,124,1,131,1,124,0,95,1, - 100,0,83,0,114,13,0,0,0,41,2,218,4,98,111,111, - 108,114,118,0,0,0,41,2,114,30,0,0,0,218,5,118, - 97,108,117,101,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,124,0,0,0,154,1,0,0,115,6,0,0, - 0,10,2,4,128,255,128,41,12,114,1,0,0,0,114,0, - 0,0,0,114,2,0,0,0,114,3,0,0,0,114,31,0, - 0,0,114,49,0,0,0,114,126,0,0,0,218,8,112,114, - 111,112,101,114,116,121,114,123,0,0,0,218,6,115,101,116, - 116,101,114,114,131,0,0,0,114,124,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,113,0,0,0,58,1,0,0,115,36,0,0,0,8, - 0,4,1,4,36,2,1,12,255,8,12,8,10,2,12,10, - 1,4,8,10,1,2,3,10,1,2,7,10,1,4,3,14, - 1,255,128,114,113,0,0,0,169,2,114,114,0,0,0,114, - 116,0,0,0,99,2,0,0,0,0,0,0,0,2,0,0, - 0,6,0,0,0,8,0,0,0,67,0,0,0,115,150,0, - 0,0,116,0,124,1,100,1,131,2,114,74,116,1,100,2, - 117,0,114,22,116,2,130,1,116,1,106,3,125,4,124,3, - 100,2,117,0,114,48,124,4,124,0,124,1,100,3,141,2, - 83,0,124,3,114,56,103,0,110,2,100,2,125,5,124,4, - 124,0,124,1,124,5,100,4,141,3,83,0,124,3,100,2, - 117,0,114,134,116,0,124,1,100,5,131,2,114,130,122,14, - 124,1,160,4,124,0,161,1,125,3,87,0,110,26,4,0, - 116,5,121,128,1,0,1,0,1,0,100,2,125,3,89,0, - 110,6,48,0,100,6,125,3,116,6,124,0,124,1,124,2, - 124,3,100,7,141,4,83,0,41,8,122,53,82,101,116,117, - 114,110,32,97,32,109,111,100,117,108,101,32,115,112,101,99, - 32,98,97,115,101,100,32,111,110,32,118,97,114,105,111,117, - 115,32,108,111,97,100,101,114,32,109,101,116,104,111,100,115, - 46,90,12,103,101,116,95,102,105,108,101,110,97,109,101,78, - 41,1,114,110,0,0,0,41,2,114,110,0,0,0,114,117, - 0,0,0,114,116,0,0,0,70,114,136,0,0,0,41,7, - 114,4,0,0,0,114,127,0,0,0,114,128,0,0,0,218, - 23,115,112,101,99,95,102,114,111,109,95,102,105,108,101,95, - 108,111,99,97,116,105,111,110,114,116,0,0,0,114,80,0, - 0,0,114,113,0,0,0,41,6,114,17,0,0,0,114,110, - 0,0,0,114,114,0,0,0,114,116,0,0,0,114,137,0, - 0,0,90,6,115,101,97,114,99,104,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,92,0,0,0,159,1, - 0,0,115,38,0,0,0,10,2,8,1,4,1,6,1,8, - 2,12,1,12,1,6,1,2,1,6,255,8,3,10,1,2, - 1,14,1,12,1,10,1,4,3,16,2,255,128,114,92,0, - 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,8, - 0,0,0,8,0,0,0,67,0,0,0,115,40,1,0,0, - 122,10,124,0,106,0,125,3,87,0,110,18,4,0,116,1, - 121,28,1,0,1,0,1,0,89,0,110,14,48,0,124,3, - 100,0,117,1,114,42,124,3,83,0,124,0,106,2,125,4, - 124,1,100,0,117,0,114,86,122,10,124,0,106,3,125,1, - 87,0,110,18,4,0,116,1,121,84,1,0,1,0,1,0, - 89,0,110,2,48,0,122,10,124,0,106,4,125,5,87,0, - 110,22,4,0,116,1,121,118,1,0,1,0,1,0,100,0, - 125,5,89,0,110,2,48,0,124,2,100,0,117,0,114,174, - 124,5,100,0,117,0,114,170,122,10,124,1,106,5,125,2, - 87,0,110,26,4,0,116,1,121,168,1,0,1,0,1,0, - 100,0,125,2,89,0,110,6,48,0,124,5,125,2,122,10, - 124,0,106,6,125,6,87,0,110,22,4,0,116,1,121,206, - 1,0,1,0,1,0,100,0,125,6,89,0,110,2,48,0, - 122,14,116,7,124,0,106,8,131,1,125,7,87,0,110,22, - 4,0,116,1,121,244,1,0,1,0,1,0,100,0,125,7, - 89,0,110,2,48,0,116,9,124,4,124,1,124,2,100,1, - 141,3,125,3,124,5,100,0,117,0,144,1,114,18,100,2, - 110,2,100,3,124,3,95,10,124,6,124,3,95,11,124,7, - 124,3,95,12,124,3,83,0,41,4,78,169,1,114,114,0, - 0,0,70,84,41,13,114,106,0,0,0,114,107,0,0,0, - 114,1,0,0,0,114,99,0,0,0,114,109,0,0,0,218, - 7,95,79,82,73,71,73,78,218,10,95,95,99,97,99,104, - 101,100,95,95,218,4,108,105,115,116,218,8,95,95,112,97, - 116,104,95,95,114,113,0,0,0,114,118,0,0,0,114,123, - 0,0,0,114,117,0,0,0,41,8,114,97,0,0,0,114, - 110,0,0,0,114,114,0,0,0,114,96,0,0,0,114,17, - 0,0,0,90,8,108,111,99,97,116,105,111,110,114,123,0, - 0,0,114,117,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,17,95,115,112,101,99,95,102,114, - 111,109,95,109,111,100,117,108,101,185,1,0,0,115,74,0, - 0,0,2,2,10,1,12,1,6,1,8,2,4,1,6,2, - 8,1,2,1,10,1,12,1,6,2,2,1,10,1,12,1, - 10,1,8,1,8,1,2,1,10,1,12,1,10,1,4,2, - 2,1,10,1,12,1,10,1,2,1,14,1,12,1,10,1, - 14,2,20,1,6,1,6,1,4,1,255,128,114,143,0,0, - 0,70,169,1,218,8,111,118,101,114,114,105,100,101,99,2, - 0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,8, - 0,0,0,67,0,0,0,115,210,1,0,0,124,2,115,20, - 116,0,124,1,100,1,100,0,131,3,100,0,117,0,114,52, - 122,12,124,0,106,1,124,1,95,2,87,0,110,18,4,0, - 116,3,121,50,1,0,1,0,1,0,89,0,110,2,48,0, - 124,2,115,72,116,0,124,1,100,2,100,0,131,3,100,0, - 117,0,114,174,124,0,106,4,125,3,124,3,100,0,117,0, - 114,144,124,0,106,5,100,0,117,1,114,144,116,6,100,0, - 117,0,114,108,116,7,130,1,116,6,106,8,125,4,124,4, - 160,9,124,4,161,1,125,3,124,0,106,5,124,3,95,10, - 124,3,124,0,95,4,100,0,124,1,95,11,122,10,124,3, - 124,1,95,12,87,0,110,18,4,0,116,3,121,172,1,0, - 1,0,1,0,89,0,110,2,48,0,124,2,115,194,116,0, - 124,1,100,3,100,0,131,3,100,0,117,0,114,226,122,12, - 124,0,106,13,124,1,95,14,87,0,110,18,4,0,116,3, - 121,224,1,0,1,0,1,0,89,0,110,2,48,0,122,10, - 124,0,124,1,95,15,87,0,110,18,4,0,116,3,121,254, - 1,0,1,0,1,0,89,0,110,2,48,0,124,2,144,1, - 115,24,116,0,124,1,100,4,100,0,131,3,100,0,117,0, - 144,1,114,70,124,0,106,5,100,0,117,1,144,1,114,70, - 122,12,124,0,106,5,124,1,95,16,87,0,110,20,4,0, - 116,3,144,1,121,68,1,0,1,0,1,0,89,0,110,2, - 48,0,124,0,106,17,144,1,114,206,124,2,144,1,115,102, - 116,0,124,1,100,5,100,0,131,3,100,0,117,0,144,1, - 114,136,122,12,124,0,106,18,124,1,95,11,87,0,110,20, - 4,0,116,3,144,1,121,134,1,0,1,0,1,0,89,0, - 110,2,48,0,124,2,144,1,115,160,116,0,124,1,100,6, - 100,0,131,3,100,0,117,0,144,1,114,206,124,0,106,19, - 100,0,117,1,144,1,114,206,122,12,124,0,106,19,124,1, - 95,20,87,0,110,20,4,0,116,3,144,1,121,204,1,0, - 1,0,1,0,89,0,110,2,48,0,124,1,83,0,41,7, - 78,114,1,0,0,0,114,99,0,0,0,218,11,95,95,112, - 97,99,107,97,103,101,95,95,114,142,0,0,0,114,109,0, - 0,0,114,140,0,0,0,41,21,114,6,0,0,0,114,17, - 0,0,0,114,1,0,0,0,114,107,0,0,0,114,110,0, - 0,0,114,117,0,0,0,114,127,0,0,0,114,128,0,0, - 0,218,16,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,218,7,95,95,110,101,119,95,95,90,5,95,112, - 97,116,104,114,109,0,0,0,114,99,0,0,0,114,131,0, - 0,0,114,146,0,0,0,114,106,0,0,0,114,142,0,0, - 0,114,124,0,0,0,114,114,0,0,0,114,123,0,0,0, - 114,140,0,0,0,41,5,114,96,0,0,0,114,97,0,0, - 0,114,145,0,0,0,114,110,0,0,0,114,147,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 18,95,105,110,105,116,95,109,111,100,117,108,101,95,97,116, - 116,114,115,230,1,0,0,115,98,0,0,0,20,4,2,1, - 12,1,12,1,6,1,20,2,6,1,8,1,10,2,8,1, - 4,1,6,1,10,2,8,1,6,1,6,11,2,1,10,1, - 12,1,6,1,20,2,2,1,12,1,12,1,6,1,2,2, - 10,1,12,1,6,1,24,2,12,1,2,1,12,1,14,1, - 6,1,8,2,24,1,2,1,12,1,14,1,6,1,24,2, - 12,1,2,1,12,1,14,1,6,1,4,1,255,128,114,149, + 32,102,114,111,122,101,110,46,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,19,0,0, + 0,115,38,0,0,0,116,0,160,1,124,1,161,1,115,28, + 116,2,100,1,160,3,124,1,161,1,124,1,100,2,141,2, + 130,1,136,0,124,0,124,1,131,2,83,0,169,3,78,122, + 27,123,33,114,125,32,105,115,32,110,111,116,32,97,32,102, + 114,111,122,101,110,32,109,111,100,117,108,101,114,16,0,0, + 0,41,4,114,58,0,0,0,218,9,105,115,95,102,114,111, + 122,101,110,114,80,0,0,0,114,46,0,0,0,114,81,0, + 0,0,114,83,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,24,95,114,101,113,117,105,114,101,115,95,102,114,111, + 122,101,110,95,119,114,97,112,112,101,114,252,0,0,0,115, + 12,0,0,0,10,1,10,1,2,1,6,255,10,2,255,128, + 122,50,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,114,86,0,0,0,41,2,114,84,0,0,0, + 114,90,0,0,0,114,10,0,0,0,114,83,0,0,0,114, + 11,0,0,0,218,16,95,114,101,113,117,105,114,101,115,95, + 102,114,111,122,101,110,250,0,0,0,115,8,0,0,0,12, + 2,10,5,4,1,255,128,114,91,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0, + 0,67,0,0,0,115,58,0,0,0,116,0,124,1,124,0, + 131,2,125,2,124,1,116,1,106,2,118,0,114,50,116,1, + 106,2,124,1,25,0,125,3,116,3,124,2,124,3,131,2, + 1,0,116,1,106,2,124,1,25,0,83,0,116,4,124,2, + 131,1,83,0,41,2,122,128,76,111,97,100,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,108, + 101,32,105,110,116,111,32,115,121,115,46,109,111,100,117,108, + 101,115,32,97,110,100,32,114,101,116,117,114,110,32,105,116, + 46,10,10,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,85,115,101,32,108,111,97,100,101,114,46,101,120, + 101,99,95,109,111,100,117,108,101,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,78,41,5,218,16,115,112,101, + 99,95,102,114,111,109,95,108,111,97,100,101,114,114,15,0, + 0,0,218,7,109,111,100,117,108,101,115,218,5,95,101,120, + 101,99,218,5,95,108,111,97,100,41,4,114,30,0,0,0, + 114,82,0,0,0,218,4,115,112,101,99,218,6,109,111,100, + 117,108,101,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,17,95,108,111,97,100,95,109,111,100,117,108,101, + 95,115,104,105,109,6,1,0,0,115,14,0,0,0,10,6, + 10,1,10,1,10,1,10,1,8,2,255,128,114,98,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,8,0,0,0,67,0,0,0,115,210,0,0,0,116, + 0,124,0,100,1,100,0,131,3,125,1,116,1,124,1,100, + 2,131,2,114,54,122,12,124,1,160,2,124,0,161,1,87, + 0,83,0,4,0,116,3,121,52,1,0,1,0,1,0,89, + 0,110,2,48,0,122,10,124,0,106,4,125,2,87,0,110, + 18,4,0,116,5,121,82,1,0,1,0,1,0,89,0,110, + 18,48,0,124,2,100,0,117,1,114,100,116,6,124,2,131, + 1,83,0,122,10,124,0,106,7,125,3,87,0,110,22,4, + 0,116,5,121,132,1,0,1,0,1,0,100,3,125,3,89, + 0,110,2,48,0,122,10,124,0,106,8,125,4,87,0,110, + 52,4,0,116,5,121,196,1,0,1,0,1,0,124,1,100, + 0,117,0,114,180,100,4,160,9,124,3,161,1,6,0,89, + 0,83,0,100,5,160,9,124,3,124,1,161,2,6,0,89, + 0,83,0,48,0,100,6,160,9,124,3,124,4,161,2,83, + 0,41,7,78,218,10,95,95,108,111,97,100,101,114,95,95, + 218,11,109,111,100,117,108,101,95,114,101,112,114,250,1,63, + 250,13,60,109,111,100,117,108,101,32,123,33,114,125,62,250, + 20,60,109,111,100,117,108,101,32,123,33,114,125,32,40,123, + 33,114,125,41,62,250,23,60,109,111,100,117,108,101,32,123, + 33,114,125,32,102,114,111,109,32,123,33,114,125,62,41,10, + 114,6,0,0,0,114,4,0,0,0,114,100,0,0,0,218, + 9,69,120,99,101,112,116,105,111,110,218,8,95,95,115,112, + 101,99,95,95,218,14,65,116,116,114,105,98,117,116,101,69, + 114,114,111,114,218,22,95,109,111,100,117,108,101,95,114,101, + 112,114,95,102,114,111,109,95,115,112,101,99,114,1,0,0, + 0,218,8,95,95,102,105,108,101,95,95,114,46,0,0,0, + 41,5,114,97,0,0,0,218,6,108,111,97,100,101,114,114, + 96,0,0,0,114,17,0,0,0,218,8,102,105,108,101,110, + 97,109,101,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,12,95,109,111,100,117,108,101,95,114,101,112,114, + 22,1,0,0,115,48,0,0,0,12,2,10,1,2,4,12, + 1,12,1,6,1,2,1,10,1,12,1,6,1,8,2,8, + 1,2,4,10,1,12,1,10,1,2,1,10,1,12,1,8, + 1,14,1,18,2,12,2,255,128,114,112,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,64,0,0,0,115,114,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,2,100,2,100,3, + 156,3,100,4,100,5,132,2,90,4,100,6,100,7,132,0, + 90,5,100,8,100,9,132,0,90,6,101,7,100,10,100,11, + 132,0,131,1,90,8,101,8,106,9,100,12,100,11,132,0, + 131,1,90,8,101,7,100,13,100,14,132,0,131,1,90,10, + 101,7,100,15,100,16,132,0,131,1,90,11,101,11,106,9, + 100,17,100,16,132,0,131,1,90,11,100,2,83,0,41,18, + 218,10,77,111,100,117,108,101,83,112,101,99,97,208,5,0, + 0,84,104,101,32,115,112,101,99,105,102,105,99,97,116,105, + 111,110,32,102,111,114,32,97,32,109,111,100,117,108,101,44, + 32,117,115,101,100,32,102,111,114,32,108,111,97,100,105,110, + 103,46,10,10,32,32,32,32,65,32,109,111,100,117,108,101, + 39,115,32,115,112,101,99,32,105,115,32,116,104,101,32,115, + 111,117,114,99,101,32,102,111,114,32,105,110,102,111,114,109, + 97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32, + 109,111,100,117,108,101,46,32,32,70,111,114,10,32,32,32, + 32,100,97,116,97,32,97,115,115,111,99,105,97,116,101,100, + 32,119,105,116,104,32,116,104,101,32,109,111,100,117,108,101, + 44,32,105,110,99,108,117,100,105,110,103,32,115,111,117,114, + 99,101,44,32,117,115,101,32,116,104,101,32,115,112,101,99, + 39,115,10,32,32,32,32,108,111,97,100,101,114,46,10,10, + 32,32,32,32,96,110,97,109,101,96,32,105,115,32,116,104, + 101,32,97,98,115,111,108,117,116,101,32,110,97,109,101,32, + 111,102,32,116,104,101,32,109,111,100,117,108,101,46,32,32, + 96,108,111,97,100,101,114,96,32,105,115,32,116,104,101,32, + 108,111,97,100,101,114,10,32,32,32,32,116,111,32,117,115, + 101,32,119,104,101,110,32,108,111,97,100,105,110,103,32,116, + 104,101,32,109,111,100,117,108,101,46,32,32,96,112,97,114, + 101,110,116,96,32,105,115,32,116,104,101,32,110,97,109,101, + 32,111,102,32,116,104,101,10,32,32,32,32,112,97,99,107, + 97,103,101,32,116,104,101,32,109,111,100,117,108,101,32,105, + 115,32,105,110,46,32,32,84,104,101,32,112,97,114,101,110, + 116,32,105,115,32,100,101,114,105,118,101,100,32,102,114,111, + 109,32,116,104,101,32,110,97,109,101,46,10,10,32,32,32, + 32,96,105,115,95,112,97,99,107,97,103,101,96,32,100,101, + 116,101,114,109,105,110,101,115,32,105,102,32,116,104,101,32, + 109,111,100,117,108,101,32,105,115,32,99,111,110,115,105,100, + 101,114,101,100,32,97,32,112,97,99,107,97,103,101,32,111, + 114,10,32,32,32,32,110,111,116,46,32,32,79,110,32,109, + 111,100,117,108,101,115,32,116,104,105,115,32,105,115,32,114, + 101,102,108,101,99,116,101,100,32,98,121,32,116,104,101,32, + 96,95,95,112,97,116,104,95,95,96,32,97,116,116,114,105, + 98,117,116,101,46,10,10,32,32,32,32,96,111,114,105,103, + 105,110,96,32,105,115,32,116,104,101,32,115,112,101,99,105, + 102,105,99,32,108,111,99,97,116,105,111,110,32,117,115,101, + 100,32,98,121,32,116,104,101,32,108,111,97,100,101,114,32, + 102,114,111,109,32,119,104,105,99,104,32,116,111,10,32,32, + 32,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108, + 101,44,32,105,102,32,116,104,97,116,32,105,110,102,111,114, + 109,97,116,105,111,110,32,105,115,32,97,118,97,105,108,97, + 98,108,101,46,32,32,87,104,101,110,32,102,105,108,101,110, + 97,109,101,32,105,115,10,32,32,32,32,115,101,116,44,32, + 111,114,105,103,105,110,32,119,105,108,108,32,109,97,116,99, + 104,46,10,10,32,32,32,32,96,104,97,115,95,108,111,99, + 97,116,105,111,110,96,32,105,110,100,105,99,97,116,101,115, + 32,116,104,97,116,32,97,32,115,112,101,99,39,115,32,34, + 111,114,105,103,105,110,34,32,114,101,102,108,101,99,116,115, + 32,97,32,108,111,99,97,116,105,111,110,46,10,32,32,32, + 32,87,104,101,110,32,116,104,105,115,32,105,115,32,84,114, + 117,101,44,32,96,95,95,102,105,108,101,95,95,96,32,97, + 116,116,114,105,98,117,116,101,32,111,102,32,116,104,101,32, + 109,111,100,117,108,101,32,105,115,32,115,101,116,46,10,10, + 32,32,32,32,96,99,97,99,104,101,100,96,32,105,115,32, + 116,104,101,32,108,111,99,97,116,105,111,110,32,111,102,32, + 116,104,101,32,99,97,99,104,101,100,32,98,121,116,101,99, + 111,100,101,32,102,105,108,101,44,32,105,102,32,97,110,121, + 46,32,32,73,116,10,32,32,32,32,99,111,114,114,101,115, + 112,111,110,100,115,32,116,111,32,116,104,101,32,96,95,95, + 99,97,99,104,101,100,95,95,96,32,97,116,116,114,105,98, + 117,116,101,46,10,10,32,32,32,32,96,115,117,98,109,111, + 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, + 116,105,111,110,115,96,32,105,115,32,116,104,101,32,115,101, + 113,117,101,110,99,101,32,111,102,32,112,97,116,104,32,101, + 110,116,114,105,101,115,32,116,111,10,32,32,32,32,115,101, + 97,114,99,104,32,119,104,101,110,32,105,109,112,111,114,116, + 105,110,103,32,115,117,98,109,111,100,117,108,101,115,46,32, + 32,73,102,32,115,101,116,44,32,105,115,95,112,97,99,107, + 97,103,101,32,115,104,111,117,108,100,32,98,101,10,32,32, + 32,32,84,114,117,101,45,45,97,110,100,32,70,97,108,115, + 101,32,111,116,104,101,114,119,105,115,101,46,10,10,32,32, + 32,32,80,97,99,107,97,103,101,115,32,97,114,101,32,115, + 105,109,112,108,121,32,109,111,100,117,108,101,115,32,116,104, + 97,116,32,40,109,97,121,41,32,104,97,118,101,32,115,117, + 98,109,111,100,117,108,101,115,46,32,32,73,102,32,97,32, + 115,112,101,99,10,32,32,32,32,104,97,115,32,97,32,110, + 111,110,45,78,111,110,101,32,118,97,108,117,101,32,105,110, + 32,96,115,117,98,109,111,100,117,108,101,95,115,101,97,114, + 99,104,95,108,111,99,97,116,105,111,110,115,96,44,32,116, + 104,101,32,105,109,112,111,114,116,10,32,32,32,32,115,121, + 115,116,101,109,32,119,105,108,108,32,99,111,110,115,105,100, + 101,114,32,109,111,100,117,108,101,115,32,108,111,97,100,101, + 100,32,102,114,111,109,32,116,104,101,32,115,112,101,99,32, + 97,115,32,112,97,99,107,97,103,101,115,46,10,10,32,32, + 32,32,79,110,108,121,32,102,105,110,100,101,114,115,32,40, + 115,101,101,32,105,109,112,111,114,116,108,105,98,46,97,98, + 99,46,77,101,116,97,80,97,116,104,70,105,110,100,101,114, + 32,97,110,100,10,32,32,32,32,105,109,112,111,114,116,108, + 105,98,46,97,98,99,46,80,97,116,104,69,110,116,114,121, + 70,105,110,100,101,114,41,32,115,104,111,117,108,100,32,109, + 111,100,105,102,121,32,77,111,100,117,108,101,83,112,101,99, + 32,105,110,115,116,97,110,99,101,115,46,10,10,32,32,32, + 32,78,41,3,218,6,111,114,105,103,105,110,218,12,108,111, + 97,100,101,114,95,115,116,97,116,101,218,10,105,115,95,112, + 97,99,107,97,103,101,99,3,0,0,0,0,0,0,0,3, + 0,0,0,6,0,0,0,2,0,0,0,67,0,0,0,115, + 54,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, + 124,3,124,0,95,2,124,4,124,0,95,3,124,5,114,32, + 103,0,110,2,100,0,124,0,95,4,100,1,124,0,95,5, + 100,0,124,0,95,6,100,0,83,0,41,2,78,70,41,7, + 114,17,0,0,0,114,110,0,0,0,114,114,0,0,0,114, + 115,0,0,0,218,26,115,117,98,109,111,100,117,108,101,95, + 115,101,97,114,99,104,95,108,111,99,97,116,105,111,110,115, + 218,13,95,115,101,116,95,102,105,108,101,97,116,116,114,218, + 7,95,99,97,99,104,101,100,41,6,114,30,0,0,0,114, + 17,0,0,0,114,110,0,0,0,114,114,0,0,0,114,115, + 0,0,0,114,116,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,31,0,0,0,95,1,0,0, + 115,18,0,0,0,6,2,6,1,6,1,6,1,14,1,6, + 3,6,1,4,128,255,128,122,19,77,111,100,117,108,101,83, + 112,101,99,46,95,95,105,110,105,116,95,95,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,6,0,0, + 0,67,0,0,0,115,102,0,0,0,100,1,160,0,124,0, + 106,1,161,1,100,2,160,0,124,0,106,2,161,1,103,2, + 125,1,124,0,106,3,100,0,117,1,114,52,124,1,160,4, + 100,3,160,0,124,0,106,3,161,1,161,1,1,0,124,0, + 106,5,100,0,117,1,114,80,124,1,160,4,100,4,160,0, + 124,0,106,5,161,1,161,1,1,0,100,5,160,0,124,0, + 106,6,106,7,100,6,160,8,124,1,161,1,161,2,83,0, + 41,7,78,122,9,110,97,109,101,61,123,33,114,125,122,11, + 108,111,97,100,101,114,61,123,33,114,125,122,11,111,114,105, + 103,105,110,61,123,33,114,125,122,29,115,117,98,109,111,100, + 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, + 105,111,110,115,61,123,125,122,6,123,125,40,123,125,41,122, + 2,44,32,41,9,114,46,0,0,0,114,17,0,0,0,114, + 110,0,0,0,114,114,0,0,0,218,6,97,112,112,101,110, + 100,114,117,0,0,0,218,9,95,95,99,108,97,115,115,95, + 95,114,1,0,0,0,218,4,106,111,105,110,41,2,114,30, + 0,0,0,114,56,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,49,0,0,0,107,1,0,0, + 115,22,0,0,0,10,1,10,1,4,255,10,2,18,1,10, + 1,8,1,4,1,6,255,22,2,255,128,122,19,77,111,100, + 117,108,101,83,112,101,99,46,95,95,114,101,112,114,95,95, + 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,8,0,0,0,67,0,0,0,115,102,0,0,0,124,0, + 106,0,125,2,122,72,124,0,106,1,124,1,106,1,107,2, + 111,76,124,0,106,2,124,1,106,2,107,2,111,76,124,0, + 106,3,124,1,106,3,107,2,111,76,124,2,124,1,106,0, + 107,2,111,76,124,0,106,4,124,1,106,4,107,2,111,76, + 124,0,106,5,124,1,106,5,107,2,87,0,83,0,4,0, + 116,6,121,100,1,0,1,0,1,0,116,7,6,0,89,0, + 83,0,48,0,114,13,0,0,0,41,8,114,117,0,0,0, + 114,17,0,0,0,114,110,0,0,0,114,114,0,0,0,218, + 6,99,97,99,104,101,100,218,12,104,97,115,95,108,111,99, + 97,116,105,111,110,114,107,0,0,0,218,14,78,111,116,73, + 109,112,108,101,109,101,110,116,101,100,41,3,114,30,0,0, + 0,90,5,111,116,104,101,114,90,4,115,109,115,108,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,6,95, + 95,101,113,95,95,117,1,0,0,115,32,0,0,0,6,1, + 2,1,12,1,10,1,2,255,10,2,2,254,8,3,2,253, + 10,4,2,252,10,5,4,251,12,6,10,1,255,128,122,17, + 77,111,100,117,108,101,83,112,101,99,46,95,95,101,113,95, + 95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,58,0,0,0,124, + 0,106,0,100,0,117,0,114,52,124,0,106,1,100,0,117, + 1,114,52,124,0,106,2,114,52,116,3,100,0,117,0,114, + 38,116,4,130,1,116,3,160,5,124,0,106,1,161,1,124, + 0,95,0,124,0,106,0,83,0,114,13,0,0,0,41,6, + 114,119,0,0,0,114,114,0,0,0,114,118,0,0,0,218, + 19,95,98,111,111,116,115,116,114,97,112,95,101,120,116,101, + 114,110,97,108,218,19,78,111,116,73,109,112,108,101,109,101, + 110,116,101,100,69,114,114,111,114,90,11,95,103,101,116,95, + 99,97,99,104,101,100,114,48,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,123,0,0,0,129, + 1,0,0,115,14,0,0,0,10,2,16,1,8,1,4,1, + 14,1,6,1,255,128,122,17,77,111,100,117,108,101,83,112, + 101,99,46,99,97,99,104,101,100,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, + 0,0,115,10,0,0,0,124,1,124,0,95,0,100,0,83, + 0,114,13,0,0,0,41,1,114,119,0,0,0,41,2,114, + 30,0,0,0,114,123,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,123,0,0,0,138,1,0, + 0,115,6,0,0,0,6,2,4,128,255,128,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,32,0,0,0,124,0,106,0,100,1, + 117,0,114,26,124,0,106,1,160,2,100,2,161,1,100,3, + 25,0,83,0,124,0,106,1,83,0,41,4,122,32,84,104, + 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, + 100,117,108,101,39,115,32,112,97,114,101,110,116,46,78,218, + 1,46,114,22,0,0,0,41,3,114,117,0,0,0,114,17, + 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, + 48,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,6,112,97,114,101,110,116,142,1,0,0,115, + 8,0,0,0,10,3,16,1,6,2,255,128,122,17,77,111, + 100,117,108,101,83,112,101,99,46,112,97,114,101,110,116,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, + 0,83,0,114,13,0,0,0,41,1,114,118,0,0,0,114, + 48,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,124,0,0,0,150,1,0,0,115,4,0,0, + 0,6,2,255,128,122,23,77,111,100,117,108,101,83,112,101, + 99,46,104,97,115,95,108,111,99,97,116,105,111,110,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, + 0,0,0,67,0,0,0,115,14,0,0,0,116,0,124,1, + 131,1,124,0,95,1,100,0,83,0,114,13,0,0,0,41, + 2,218,4,98,111,111,108,114,118,0,0,0,41,2,114,30, + 0,0,0,218,5,118,97,108,117,101,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,124,0,0,0,154,1, + 0,0,115,6,0,0,0,10,2,4,128,255,128,41,12,114, + 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, + 0,0,0,114,31,0,0,0,114,49,0,0,0,114,126,0, + 0,0,218,8,112,114,111,112,101,114,116,121,114,123,0,0, + 0,218,6,115,101,116,116,101,114,114,131,0,0,0,114,124, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,113,0,0,0,58,1,0,0, + 115,36,0,0,0,8,0,4,1,4,36,2,1,12,255,8, + 12,8,10,2,12,10,1,4,8,10,1,2,3,10,1,2, + 7,10,1,4,3,14,1,255,128,114,113,0,0,0,169,2, + 114,114,0,0,0,114,116,0,0,0,99,2,0,0,0,0, + 0,0,0,2,0,0,0,6,0,0,0,8,0,0,0,67, + 0,0,0,115,150,0,0,0,116,0,124,1,100,1,131,2, + 114,74,116,1,100,2,117,0,114,22,116,2,130,1,116,1, + 106,3,125,4,124,3,100,2,117,0,114,48,124,4,124,0, + 124,1,100,3,141,2,83,0,124,3,114,56,103,0,110,2, + 100,2,125,5,124,4,124,0,124,1,124,5,100,4,141,3, + 83,0,124,3,100,2,117,0,114,134,116,0,124,1,100,5, + 131,2,114,130,122,14,124,1,160,4,124,0,161,1,125,3, + 87,0,110,26,4,0,116,5,121,128,1,0,1,0,1,0, + 100,2,125,3,89,0,110,6,48,0,100,6,125,3,116,6, + 124,0,124,1,124,2,124,3,100,7,141,4,83,0,41,8, + 122,53,82,101,116,117,114,110,32,97,32,109,111,100,117,108, + 101,32,115,112,101,99,32,98,97,115,101,100,32,111,110,32, + 118,97,114,105,111,117,115,32,108,111,97,100,101,114,32,109, + 101,116,104,111,100,115,46,90,12,103,101,116,95,102,105,108, + 101,110,97,109,101,78,41,1,114,110,0,0,0,41,2,114, + 110,0,0,0,114,117,0,0,0,114,116,0,0,0,70,114, + 136,0,0,0,41,7,114,4,0,0,0,114,127,0,0,0, + 114,128,0,0,0,218,23,115,112,101,99,95,102,114,111,109, + 95,102,105,108,101,95,108,111,99,97,116,105,111,110,114,116, + 0,0,0,114,80,0,0,0,114,113,0,0,0,41,6,114, + 17,0,0,0,114,110,0,0,0,114,114,0,0,0,114,116, + 0,0,0,114,137,0,0,0,90,6,115,101,97,114,99,104, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 92,0,0,0,159,1,0,0,115,38,0,0,0,10,2,8, + 1,4,1,6,1,8,2,12,1,12,1,6,1,2,1,6, + 255,8,3,10,1,2,1,14,1,12,1,10,1,4,3,16, + 2,255,128,114,92,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,8,0,0,0,8,0,0,0,67,0,0, + 0,115,40,1,0,0,122,10,124,0,106,0,125,3,87,0, + 110,18,4,0,116,1,121,28,1,0,1,0,1,0,89,0, + 110,14,48,0,124,3,100,0,117,1,114,42,124,3,83,0, + 124,0,106,2,125,4,124,1,100,0,117,0,114,86,122,10, + 124,0,106,3,125,1,87,0,110,18,4,0,116,1,121,84, + 1,0,1,0,1,0,89,0,110,2,48,0,122,10,124,0, + 106,4,125,5,87,0,110,22,4,0,116,1,121,118,1,0, + 1,0,1,0,100,0,125,5,89,0,110,2,48,0,124,2, + 100,0,117,0,114,174,124,5,100,0,117,0,114,170,122,10, + 124,1,106,5,125,2,87,0,110,26,4,0,116,1,121,168, + 1,0,1,0,1,0,100,0,125,2,89,0,110,6,48,0, + 124,5,125,2,122,10,124,0,106,6,125,6,87,0,110,22, + 4,0,116,1,121,206,1,0,1,0,1,0,100,0,125,6, + 89,0,110,2,48,0,122,14,116,7,124,0,106,8,131,1, + 125,7,87,0,110,22,4,0,116,1,121,244,1,0,1,0, + 1,0,100,0,125,7,89,0,110,2,48,0,116,9,124,4, + 124,1,124,2,100,1,141,3,125,3,124,5,100,0,117,0, + 144,1,114,18,100,2,110,2,100,3,124,3,95,10,124,6, + 124,3,95,11,124,7,124,3,95,12,124,3,83,0,41,4, + 78,169,1,114,114,0,0,0,70,84,41,13,114,106,0,0, + 0,114,107,0,0,0,114,1,0,0,0,114,99,0,0,0, + 114,109,0,0,0,218,7,95,79,82,73,71,73,78,218,10, + 95,95,99,97,99,104,101,100,95,95,218,4,108,105,115,116, + 218,8,95,95,112,97,116,104,95,95,114,113,0,0,0,114, + 118,0,0,0,114,123,0,0,0,114,117,0,0,0,41,8, + 114,97,0,0,0,114,110,0,0,0,114,114,0,0,0,114, + 96,0,0,0,114,17,0,0,0,90,8,108,111,99,97,116, + 105,111,110,114,123,0,0,0,114,117,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,17,95,115, + 112,101,99,95,102,114,111,109,95,109,111,100,117,108,101,185, + 1,0,0,115,74,0,0,0,2,2,10,1,12,1,6,1, + 8,2,4,1,6,2,8,1,2,1,10,1,12,1,6,2, + 2,1,10,1,12,1,10,1,8,1,8,1,2,1,10,1, + 12,1,10,1,4,2,2,1,10,1,12,1,10,1,2,1, + 14,1,12,1,10,1,14,2,20,1,6,1,6,1,4,1, + 255,128,114,143,0,0,0,70,169,1,218,8,111,118,101,114, + 114,105,100,101,99,2,0,0,0,0,0,0,0,1,0,0, + 0,5,0,0,0,8,0,0,0,67,0,0,0,115,214,1, + 0,0,124,2,115,20,116,0,124,1,100,1,100,0,131,3, + 100,0,117,0,114,52,122,12,124,0,106,1,124,1,95,2, + 87,0,110,18,4,0,116,3,121,50,1,0,1,0,1,0, + 89,0,110,2,48,0,124,2,115,72,116,0,124,1,100,2, + 100,0,131,3,100,0,117,0,114,174,124,0,106,4,125,3, + 124,3,100,0,117,0,114,144,124,0,106,5,100,0,117,1, + 114,144,116,6,100,0,117,0,114,108,116,7,130,1,116,6, + 106,8,125,4,124,4,160,9,124,4,161,1,125,3,124,0, + 106,5,124,3,95,10,124,3,124,0,95,4,100,0,124,1, + 95,11,122,10,124,3,124,1,95,12,87,0,110,18,4,0, + 116,3,121,172,1,0,1,0,1,0,89,0,110,2,48,0, + 124,2,115,194,116,0,124,1,100,3,100,0,131,3,100,0, + 117,0,114,226,122,12,124,0,106,13,124,1,95,14,87,0, + 110,18,4,0,116,3,121,224,1,0,1,0,1,0,89,0, + 110,2,48,0,122,10,124,0,124,1,95,15,87,0,110,18, + 4,0,116,3,121,254,1,0,1,0,1,0,89,0,110,2, + 48,0,124,2,144,1,115,24,116,0,124,1,100,4,100,0, + 131,3,100,0,117,0,144,1,114,70,124,0,106,5,100,0, + 117,1,144,1,114,70,122,12,124,0,106,5,124,1,95,16, + 87,0,110,20,4,0,116,3,144,1,121,68,1,0,1,0, + 1,0,89,0,110,2,48,0,124,0,106,17,144,1,114,210, + 124,2,144,1,115,102,116,0,124,1,100,5,100,0,131,3, + 100,0,117,0,144,1,114,136,122,12,124,0,106,18,124,1, + 95,11,87,0,110,20,4,0,116,3,144,1,121,134,1,0, + 1,0,1,0,89,0,110,2,48,0,124,2,144,1,115,160, + 116,0,124,1,100,6,100,0,131,3,100,0,117,0,144,1, + 114,210,124,0,106,19,100,0,117,1,144,1,114,210,122,14, + 124,0,106,19,124,1,95,20,87,0,124,1,83,0,4,0, + 116,3,144,1,121,208,1,0,1,0,1,0,89,0,124,1, + 83,0,48,0,124,1,83,0,41,7,78,114,1,0,0,0, + 114,99,0,0,0,218,11,95,95,112,97,99,107,97,103,101, + 95,95,114,142,0,0,0,114,109,0,0,0,114,140,0,0, + 0,41,21,114,6,0,0,0,114,17,0,0,0,114,1,0, + 0,0,114,107,0,0,0,114,110,0,0,0,114,117,0,0, + 0,114,127,0,0,0,114,128,0,0,0,218,16,95,78,97, + 109,101,115,112,97,99,101,76,111,97,100,101,114,218,7,95, + 95,110,101,119,95,95,90,5,95,112,97,116,104,114,109,0, + 0,0,114,99,0,0,0,114,131,0,0,0,114,146,0,0, + 0,114,106,0,0,0,114,142,0,0,0,114,124,0,0,0, + 114,114,0,0,0,114,123,0,0,0,114,140,0,0,0,41, + 5,114,96,0,0,0,114,97,0,0,0,114,145,0,0,0, + 114,110,0,0,0,114,147,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,18,95,105,110,105,116, + 95,109,111,100,117,108,101,95,97,116,116,114,115,230,1,0, + 0,115,104,0,0,0,20,4,2,1,12,1,12,1,6,1, + 20,2,6,1,8,1,10,2,8,1,4,1,6,1,10,2, + 8,1,6,1,6,11,2,1,10,1,12,1,6,1,20,2, + 2,1,12,1,12,1,6,1,2,2,10,1,12,1,6,1, + 24,2,12,1,2,1,12,1,14,1,6,1,8,2,24,1, + 2,1,12,1,14,1,6,1,24,2,12,1,2,1,10,1, + 4,3,14,254,2,1,4,1,2,255,4,1,255,128,114,149, 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,3,0,0,0,67,0,0,0,115,82,0,0, 0,100,1,125,1,116,0,124,0,106,1,100,2,131,2,114, @@ -918,8 +918,8 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 20,3,10,1,10,1,10,1,14,2,6,2,14,1,16,2, 255,128,114,108,0,0,0,99,2,0,0,0,0,0,0,0, 0,0,0,0,4,0,0,0,10,0,0,0,67,0,0,0, - 115,250,0,0,0,124,0,106,0,125,2,116,1,124,2,131, - 1,143,216,1,0,116,2,106,3,160,4,124,2,161,1,124, + 115,252,0,0,0,124,0,106,0,125,2,116,1,124,2,131, + 1,143,218,1,0,116,2,106,3,160,4,124,2,161,1,124, 1,117,1,114,54,100,1,160,5,124,2,161,1,125,3,116, 6,124,3,124,2,100,2,141,2,130,1,122,132,124,0,106, 7,100,3,117,0,114,106,124,0,106,8,100,3,117,0,114, @@ -932,270 +932,126 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 1,125,1,124,1,116,2,106,3,124,0,106,0,60,0,110, 28,116,2,106,3,160,13,124,0,106,0,161,1,125,1,124, 1,116,2,106,3,124,0,106,0,60,0,48,0,87,0,100, - 3,4,0,4,0,131,3,1,0,110,16,49,0,115,236,48, - 0,1,0,1,0,1,0,89,0,1,0,124,1,83,0,41, - 8,122,70,69,120,101,99,117,116,101,32,116,104,101,32,115, - 112,101,99,39,115,32,115,112,101,99,105,102,105,101,100,32, - 109,111,100,117,108,101,32,105,110,32,97,110,32,101,120,105, - 115,116,105,110,103,32,109,111,100,117,108,101,39,115,32,110, - 97,109,101,115,112,97,99,101,46,122,30,109,111,100,117,108, - 101,32,123,33,114,125,32,110,111,116,32,105,110,32,115,121, - 115,46,109,111,100,117,108,101,115,114,16,0,0,0,78,250, - 14,109,105,115,115,105,110,103,32,108,111,97,100,101,114,84, - 114,144,0,0,0,114,151,0,0,0,41,14,114,17,0,0, - 0,114,51,0,0,0,114,15,0,0,0,114,93,0,0,0, - 114,35,0,0,0,114,46,0,0,0,114,80,0,0,0,114, - 110,0,0,0,114,117,0,0,0,114,149,0,0,0,114,4, - 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, - 114,151,0,0,0,218,3,112,111,112,41,4,114,96,0,0, - 0,114,97,0,0,0,114,17,0,0,0,218,3,109,115,103, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 94,0,0,0,80,2,0,0,115,40,0,0,0,6,2,10, - 1,16,1,10,1,12,1,2,1,10,1,10,1,14,1,16, - 2,14,2,12,1,14,4,14,2,14,4,14,1,14,255,44, - 1,4,1,255,128,114,94,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,67, - 0,0,0,115,20,1,0,0,122,18,124,0,106,0,160,1, - 124,0,106,2,161,1,1,0,87,0,110,52,1,0,1,0, - 1,0,124,0,106,2,116,3,106,4,118,0,114,64,116,3, - 106,4,160,5,124,0,106,2,161,1,125,1,124,1,116,3, - 106,4,124,0,106,2,60,0,130,0,89,0,110,2,48,0, + 3,4,0,4,0,131,3,1,0,124,1,83,0,49,0,115, + 238,48,0,1,0,1,0,1,0,89,0,1,0,124,1,83, + 0,41,8,122,70,69,120,101,99,117,116,101,32,116,104,101, + 32,115,112,101,99,39,115,32,115,112,101,99,105,102,105,101, + 100,32,109,111,100,117,108,101,32,105,110,32,97,110,32,101, + 120,105,115,116,105,110,103,32,109,111,100,117,108,101,39,115, + 32,110,97,109,101,115,112,97,99,101,46,122,30,109,111,100, + 117,108,101,32,123,33,114,125,32,110,111,116,32,105,110,32, + 115,121,115,46,109,111,100,117,108,101,115,114,16,0,0,0, + 78,250,14,109,105,115,115,105,110,103,32,108,111,97,100,101, + 114,84,114,144,0,0,0,114,151,0,0,0,41,14,114,17, + 0,0,0,114,51,0,0,0,114,15,0,0,0,114,93,0, + 0,0,114,35,0,0,0,114,46,0,0,0,114,80,0,0, + 0,114,110,0,0,0,114,117,0,0,0,114,149,0,0,0, + 114,4,0,0,0,218,11,108,111,97,100,95,109,111,100,117, + 108,101,114,151,0,0,0,218,3,112,111,112,41,4,114,96, + 0,0,0,114,97,0,0,0,114,17,0,0,0,218,3,109, + 115,103,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,94,0,0,0,80,2,0,0,115,44,0,0,0,6, + 2,10,1,16,1,10,1,12,1,2,1,10,1,10,1,14, + 1,16,2,14,2,12,1,14,4,14,2,14,4,14,1,14, + 255,26,1,4,1,16,255,4,1,255,128,114,94,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,8,0,0,0,67,0,0,0,115,18,1,0,0,122,18, + 124,0,106,0,160,1,124,0,106,2,161,1,1,0,87,0, + 110,46,1,0,1,0,1,0,124,0,106,2,116,3,106,4, + 118,0,114,64,116,3,106,4,160,5,124,0,106,2,161,1, + 125,1,124,1,116,3,106,4,124,0,106,2,60,0,130,0, 116,3,106,4,160,5,124,0,106,2,161,1,125,1,124,1, 116,3,106,4,124,0,106,2,60,0,116,6,124,1,100,1, - 100,0,131,3,100,0,117,0,114,146,122,12,124,0,106,0, - 124,1,95,7,87,0,110,18,4,0,116,8,121,144,1,0, + 100,0,131,3,100,0,117,0,114,140,122,12,124,0,106,0, + 124,1,95,7,87,0,110,18,4,0,116,8,121,138,1,0, 1,0,1,0,89,0,110,2,48,0,116,6,124,1,100,2, - 100,0,131,3,100,0,117,0,114,222,122,40,124,1,106,9, - 124,1,95,10,116,11,124,1,100,3,131,2,115,200,124,0, + 100,0,131,3,100,0,117,0,114,216,122,40,124,1,106,9, + 124,1,95,10,116,11,124,1,100,3,131,2,115,194,124,0, 106,2,160,12,100,4,161,1,100,5,25,0,124,1,95,10, - 87,0,110,18,4,0,116,8,121,220,1,0,1,0,1,0, + 87,0,110,18,4,0,116,8,121,214,1,0,1,0,1,0, 89,0,110,2,48,0,116,6,124,1,100,6,100,0,131,3, - 100,0,117,0,144,1,114,16,122,10,124,0,124,1,95,13, - 87,0,110,20,4,0,116,8,144,1,121,14,1,0,1,0, - 1,0,89,0,110,2,48,0,124,1,83,0,41,7,78,114, - 99,0,0,0,114,146,0,0,0,114,142,0,0,0,114,129, - 0,0,0,114,22,0,0,0,114,106,0,0,0,41,14,114, - 110,0,0,0,114,156,0,0,0,114,17,0,0,0,114,15, - 0,0,0,114,93,0,0,0,114,157,0,0,0,114,6,0, - 0,0,114,99,0,0,0,114,107,0,0,0,114,1,0,0, - 0,114,146,0,0,0,114,4,0,0,0,114,130,0,0,0, - 114,106,0,0,0,114,152,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,25,95,108,111,97,100, - 95,98,97,99,107,119,97,114,100,95,99,111,109,112,97,116, - 105,98,108,101,110,2,0,0,115,56,0,0,0,2,4,18, - 1,6,1,12,1,14,1,12,1,8,1,14,3,12,1,16, - 1,2,1,12,1,12,1,6,1,16,1,2,1,8,4,10, - 1,22,1,12,1,6,1,18,1,2,1,10,1,14,1,6, - 1,4,1,255,128,114,159,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,11,0,0,0,67, - 0,0,0,115,216,0,0,0,124,0,106,0,100,0,117,1, - 114,30,116,1,124,0,106,0,100,1,131,2,115,30,116,2, - 124,0,131,1,83,0,116,3,124,0,131,1,125,1,100,2, - 124,0,95,4,122,158,124,1,116,5,106,6,124,0,106,7, - 60,0,122,52,124,0,106,0,100,0,117,0,114,96,124,0, - 106,8,100,0,117,0,114,108,116,9,100,3,124,0,106,7, - 100,4,141,2,130,1,110,12,124,0,106,0,160,10,124,1, - 161,1,1,0,87,0,110,40,1,0,1,0,1,0,122,14, - 116,5,106,6,124,0,106,7,61,0,87,0,130,0,4,0, - 116,11,121,150,1,0,1,0,1,0,89,0,130,0,48,0, - 116,5,106,6,160,12,124,0,106,7,161,1,125,1,124,1, - 116,5,106,6,124,0,106,7,60,0,116,13,100,5,124,0, - 106,7,124,0,106,0,131,3,1,0,87,0,100,6,124,0, - 95,4,110,8,100,6,124,0,95,4,48,0,124,1,83,0, - 41,7,78,114,151,0,0,0,84,114,155,0,0,0,114,16, - 0,0,0,122,18,105,109,112,111,114,116,32,123,33,114,125, - 32,35,32,123,33,114,125,70,41,14,114,110,0,0,0,114, - 4,0,0,0,114,159,0,0,0,114,153,0,0,0,90,13, - 95,105,110,105,116,105,97,108,105,122,105,110,103,114,15,0, - 0,0,114,93,0,0,0,114,17,0,0,0,114,117,0,0, - 0,114,80,0,0,0,114,151,0,0,0,114,64,0,0,0, - 114,157,0,0,0,114,77,0,0,0,114,152,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,14, - 95,108,111,97,100,95,117,110,108,111,99,107,101,100,147,2, - 0,0,115,46,0,0,0,10,2,12,2,8,1,8,2,6, - 5,2,1,12,1,2,1,10,1,10,1,16,1,16,3,6, - 1,2,1,14,1,12,1,6,1,14,6,12,1,18,1,16, - 2,4,2,255,128,114,160,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,67, - 0,0,0,115,54,0,0,0,116,0,124,0,106,1,131,1, - 143,24,1,0,116,2,124,0,131,1,87,0,2,0,100,1, - 4,0,4,0,131,3,1,0,83,0,49,0,115,40,48,0, - 1,0,1,0,1,0,89,0,1,0,100,1,83,0,41,2, - 122,191,82,101,116,117,114,110,32,97,32,110,101,119,32,109, - 111,100,117,108,101,32,111,98,106,101,99,116,44,32,108,111, - 97,100,101,100,32,98,121,32,116,104,101,32,115,112,101,99, - 39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111,32,105,116,115,32,112, - 97,114,101,110,116,46,10,10,32,32,32,32,73,102,32,97, - 32,109,111,100,117,108,101,32,105,115,32,97,108,114,101,97, - 100,121,32,105,110,32,115,121,115,46,109,111,100,117,108,101, - 115,44,32,116,104,97,116,32,101,120,105,115,116,105,110,103, - 32,109,111,100,117,108,101,32,103,101,116,115,10,32,32,32, - 32,99,108,111,98,98,101,114,101,100,46,10,10,32,32,32, - 32,78,41,3,114,51,0,0,0,114,17,0,0,0,114,160, - 0,0,0,41,1,114,96,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,95,0,0,0,189,2, - 0,0,115,8,0,0,0,12,9,38,1,4,128,255,128,114, - 95,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,64,0,0,0,115,140,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 90,4,101,5,100,3,100,4,132,0,131,1,90,6,101,7, - 100,20,100,6,100,7,132,1,131,1,90,8,101,7,100,21, - 100,8,100,9,132,1,131,1,90,9,101,7,100,10,100,11, - 132,0,131,1,90,10,101,7,100,12,100,13,132,0,131,1, - 90,11,101,7,101,12,100,14,100,15,132,0,131,1,131,1, - 90,13,101,7,101,12,100,16,100,17,132,0,131,1,131,1, - 90,14,101,7,101,12,100,18,100,19,132,0,131,1,131,1, - 90,15,101,7,101,16,131,1,90,17,100,5,83,0,41,22, - 218,15,66,117,105,108,116,105,110,73,109,112,111,114,116,101, - 114,122,144,77,101,116,97,32,112,97,116,104,32,105,109,112, - 111,114,116,32,102,111,114,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,65, - 108,108,32,109,101,116,104,111,100,115,32,97,114,101,32,101, - 105,116,104,101,114,32,99,108,97,115,115,32,111,114,32,115, - 116,97,116,105,99,32,109,101,116,104,111,100,115,32,116,111, - 32,97,118,111,105,100,32,116,104,101,32,110,101,101,100,32, - 116,111,10,32,32,32,32,105,110,115,116,97,110,116,105,97, - 116,101,32,116,104,101,32,99,108,97,115,115,46,10,10,32, - 32,32,32,122,8,98,117,105,108,116,45,105,110,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0, - 0,0,67,0,0,0,115,22,0,0,0,100,1,124,0,106, - 0,155,2,100,2,116,1,106,2,155,0,100,3,157,5,83, - 0,41,4,250,115,82,101,116,117,114,110,32,114,101,112,114, - 32,102,111,114,32,116,104,101,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,101,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,84,104,101,32,105,109,112,111,114,116,32, - 109,97,99,104,105,110,101,114,121,32,100,111,101,115,32,116, - 104,101,32,106,111,98,32,105,116,115,101,108,102,46,10,10, - 32,32,32,32,32,32,32,32,122,8,60,109,111,100,117,108, - 101,32,122,2,32,40,122,2,41,62,41,3,114,1,0,0, - 0,114,161,0,0,0,114,139,0,0,0,41,1,114,97,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,100,0,0,0,215,2,0,0,115,4,0,0,0,22, - 7,255,128,122,27,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,4,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,5,0,0,0,67,0,0,0,115,42,0,0,0,124, - 2,100,0,117,1,114,12,100,0,83,0,116,0,160,1,124, - 1,161,1,114,38,116,2,124,1,124,0,124,0,106,3,100, - 1,141,3,83,0,100,0,83,0,169,2,78,114,138,0,0, - 0,41,4,114,58,0,0,0,90,10,105,115,95,98,117,105, - 108,116,105,110,114,92,0,0,0,114,139,0,0,0,169,4, - 218,3,99,108,115,114,82,0,0,0,218,4,112,97,116,104, - 218,6,116,97,114,103,101,116,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,9,102,105,110,100,95,115,112, - 101,99,224,2,0,0,115,12,0,0,0,8,2,4,1,10, - 1,16,1,4,2,255,128,122,25,66,117,105,108,116,105,110, - 73,109,112,111,114,116,101,114,46,102,105,110,100,95,115,112, - 101,99,99,3,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,4,0,0,0,67,0,0,0,115,30,0,0,0, - 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,1, - 117,1,114,26,124,3,106,1,83,0,100,1,83,0,41,2, - 122,175,70,105,110,100,32,116,104,101,32,98,117,105,108,116, - 45,105,110,32,109,111,100,117,108,101,46,10,10,32,32,32, - 32,32,32,32,32,73,102,32,39,112,97,116,104,39,32,105, - 115,32,101,118,101,114,32,115,112,101,99,105,102,105,101,100, - 32,116,104,101,110,32,116,104,101,32,115,101,97,114,99,104, - 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, - 32,102,97,105,108,117,114,101,46,10,10,32,32,32,32,32, - 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, - 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, - 115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,105, - 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, - 32,78,41,2,114,168,0,0,0,114,110,0,0,0,41,4, - 114,165,0,0,0,114,82,0,0,0,114,166,0,0,0,114, - 96,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101, - 233,2,0,0,115,6,0,0,0,12,9,18,1,255,128,122, - 27,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,0,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,46,0,0,0,124,1,106,0,116,1, - 106,2,118,1,114,34,116,3,100,1,160,4,124,1,106,0, - 161,1,124,1,106,0,100,2,141,2,130,1,116,5,116,6, - 106,7,124,1,131,2,83,0,41,3,122,24,67,114,101,97, - 116,101,32,97,32,98,117,105,108,116,45,105,110,32,109,111, - 100,117,108,101,114,78,0,0,0,114,16,0,0,0,41,8, - 114,17,0,0,0,114,15,0,0,0,114,79,0,0,0,114, - 80,0,0,0,114,46,0,0,0,114,68,0,0,0,114,58, - 0,0,0,90,14,99,114,101,97,116,101,95,98,117,105,108, - 116,105,110,41,2,114,30,0,0,0,114,96,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,150, - 0,0,0,245,2,0,0,115,12,0,0,0,12,3,12,1, - 4,1,6,255,12,2,255,128,122,29,66,117,105,108,116,105, - 110,73,109,112,111,114,116,101,114,46,99,114,101,97,116,101, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,16,0,0,0,116,0,116,1,106,2,124,1,131,2,1, - 0,100,1,83,0,41,2,122,22,69,120,101,99,32,97,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,78, - 41,3,114,68,0,0,0,114,58,0,0,0,90,12,101,120, - 101,99,95,98,117,105,108,116,105,110,41,2,114,30,0,0, - 0,114,97,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,151,0,0,0,253,2,0,0,115,6, - 0,0,0,12,3,4,128,255,128,122,27,66,117,105,108,116, - 105,110,73,109,112,111,114,116,101,114,46,101,120,101,99,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,2,122,57,82,101,116,117, - 114,110,32,78,111,110,101,32,97,115,32,98,117,105,108,116, - 45,105,110,32,109,111,100,117,108,101,115,32,100,111,32,110, - 111,116,32,104,97,118,101,32,99,111,100,101,32,111,98,106, - 101,99,116,115,46,78,114,10,0,0,0,169,2,114,165,0, - 0,0,114,82,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,103,101,116,95,99,111,100,101, - 2,3,0,0,115,4,0,0,0,4,4,255,128,122,24,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, - 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,122,56,82,101,116, - 117,114,110,32,78,111,110,101,32,97,115,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,115,32,100,111,32, - 110,111,116,32,104,97,118,101,32,115,111,117,114,99,101,32, - 99,111,100,101,46,78,114,10,0,0,0,114,170,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 10,103,101,116,95,115,111,117,114,99,101,8,3,0,0,115, - 4,0,0,0,4,4,255,128,122,26,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,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,41,2,122,52,82,101,116,117,114,110, - 32,70,97,108,115,101,32,97,115,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,32,97,114,101,32,110, - 101,118,101,114,32,112,97,99,107,97,103,101,115,46,70,114, - 10,0,0,0,114,170,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,116,0,0,0,14,3,0, - 0,115,4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41,18,114, - 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, - 0,0,0,114,139,0,0,0,218,12,115,116,97,116,105,99, - 109,101,116,104,111,100,114,100,0,0,0,218,11,99,108,97, - 115,115,109,101,116,104,111,100,114,168,0,0,0,114,169,0, - 0,0,114,150,0,0,0,114,151,0,0,0,114,87,0,0, - 0,114,171,0,0,0,114,172,0,0,0,114,116,0,0,0, - 114,98,0,0,0,114,156,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,161, - 0,0,0,204,2,0,0,115,48,0,0,0,8,0,4,2, - 4,7,2,2,10,1,2,8,12,1,2,8,12,1,2,11, - 10,1,2,7,10,1,2,4,2,1,12,1,2,4,2,1, - 12,1,2,4,2,1,12,1,12,4,255,128,114,161,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,64,0,0,0,115,144,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,101, - 5,100,3,100,4,132,0,131,1,90,6,101,7,100,22,100, - 6,100,7,132,1,131,1,90,8,101,7,100,23,100,8,100, - 9,132,1,131,1,90,9,101,7,100,10,100,11,132,0,131, - 1,90,10,101,5,100,12,100,13,132,0,131,1,90,11,101, - 7,100,14,100,15,132,0,131,1,90,12,101,7,101,13,100, - 16,100,17,132,0,131,1,131,1,90,14,101,7,101,13,100, - 18,100,19,132,0,131,1,131,1,90,15,101,7,101,13,100, - 20,100,21,132,0,131,1,131,1,90,16,100,5,83,0,41, - 24,218,14,70,114,111,122,101,110,73,109,112,111,114,116,101, - 114,122,142,77,101,116,97,32,112,97,116,104,32,105,109,112, - 111,114,116,32,102,111,114,32,102,114,111,122,101,110,32,109, + 100,0,117,0,144,1,114,14,122,12,124,0,124,1,95,13, + 87,0,124,1,83,0,4,0,116,8,144,1,121,12,1,0, + 1,0,1,0,89,0,124,1,83,0,48,0,124,1,83,0, + 41,7,78,114,99,0,0,0,114,146,0,0,0,114,142,0, + 0,0,114,129,0,0,0,114,22,0,0,0,114,106,0,0, + 0,41,14,114,110,0,0,0,114,156,0,0,0,114,17,0, + 0,0,114,15,0,0,0,114,93,0,0,0,114,157,0,0, + 0,114,6,0,0,0,114,99,0,0,0,114,107,0,0,0, + 114,1,0,0,0,114,146,0,0,0,114,4,0,0,0,114, + 130,0,0,0,114,106,0,0,0,114,152,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,25,95, + 108,111,97,100,95,98,97,99,107,119,97,114,100,95,99,111, + 109,112,97,116,105,98,108,101,110,2,0,0,115,62,0,0, + 0,2,4,18,1,6,1,12,1,14,1,12,1,2,1,14, + 3,12,1,16,1,2,1,12,1,12,1,6,1,16,1,2, + 1,8,4,10,1,22,1,12,1,6,1,18,1,2,1,8, + 1,4,3,14,254,2,1,4,1,2,255,4,1,255,128,114, + 159,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,11,0,0,0,67,0,0,0,115,212,0, + 0,0,124,0,106,0,100,0,117,1,114,30,116,1,124,0, + 106,0,100,1,131,2,115,30,116,2,124,0,131,1,83,0, + 116,3,124,0,131,1,125,1,100,2,124,0,95,4,122,158, + 124,1,116,5,106,6,124,0,106,7,60,0,122,50,124,0, + 106,0,100,0,117,0,114,94,124,0,106,8,100,0,117,0, + 114,106,116,9,100,3,124,0,106,7,100,4,141,2,130,1, + 124,0,106,0,160,10,124,1,161,1,1,0,87,0,110,40, + 1,0,1,0,1,0,122,14,116,5,106,6,124,0,106,7, + 61,0,87,0,130,0,4,0,116,11,121,148,1,0,1,0, + 1,0,89,0,130,0,48,0,116,5,106,6,160,12,124,0, + 106,7,161,1,125,1,124,1,116,5,106,6,124,0,106,7, + 60,0,116,13,100,5,124,0,106,7,124,0,106,0,131,3, + 1,0,87,0,100,6,124,0,95,4,124,1,83,0,100,6, + 124,0,95,4,48,0,41,7,78,114,151,0,0,0,84,114, + 155,0,0,0,114,16,0,0,0,122,18,105,109,112,111,114, + 116,32,123,33,114,125,32,35,32,123,33,114,125,70,41,14, + 114,110,0,0,0,114,4,0,0,0,114,159,0,0,0,114, + 153,0,0,0,90,13,95,105,110,105,116,105,97,108,105,122, + 105,110,103,114,15,0,0,0,114,93,0,0,0,114,17,0, + 0,0,114,117,0,0,0,114,80,0,0,0,114,151,0,0, + 0,114,64,0,0,0,114,157,0,0,0,114,77,0,0,0, + 114,152,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,14,95,108,111,97,100,95,117,110,108,111, + 99,107,101,100,147,2,0,0,115,54,0,0,0,10,2,12, + 2,8,1,8,2,6,5,2,1,12,1,2,1,10,1,10, + 1,14,1,16,3,6,1,2,1,12,1,2,3,12,254,2, + 1,2,1,2,255,14,6,12,1,18,1,6,2,4,2,8, + 254,255,128,114,160,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,8,0,0,0,67,0,0, + 0,115,54,0,0,0,116,0,124,0,106,1,131,1,143,24, + 1,0,116,2,124,0,131,1,87,0,2,0,100,1,4,0, + 4,0,131,3,1,0,83,0,49,0,115,40,48,0,1,0, + 1,0,1,0,89,0,1,0,100,1,83,0,41,2,122,191, + 82,101,116,117,114,110,32,97,32,110,101,119,32,109,111,100, + 117,108,101,32,111,98,106,101,99,116,44,32,108,111,97,100, + 101,100,32,98,121,32,116,104,101,32,115,112,101,99,39,115, + 32,108,111,97,100,101,114,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, + 97,100,100,101,100,32,116,111,32,105,116,115,32,112,97,114, + 101,110,116,46,10,10,32,32,32,32,73,102,32,97,32,109, + 111,100,117,108,101,32,105,115,32,97,108,114,101,97,100,121, + 32,105,110,32,115,121,115,46,109,111,100,117,108,101,115,44, + 32,116,104,97,116,32,101,120,105,115,116,105,110,103,32,109, + 111,100,117,108,101,32,103,101,116,115,10,32,32,32,32,99, + 108,111,98,98,101,114,101,100,46,10,10,32,32,32,32,78, + 41,3,114,51,0,0,0,114,17,0,0,0,114,160,0,0, + 0,41,1,114,96,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,95,0,0,0,189,2,0,0, + 115,8,0,0,0,12,9,38,1,4,128,255,128,114,95,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,64,0,0,0,115,140,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, + 101,5,100,3,100,4,132,0,131,1,90,6,101,7,100,20, + 100,6,100,7,132,1,131,1,90,8,101,7,100,21,100,8, + 100,9,132,1,131,1,90,9,101,7,100,10,100,11,132,0, + 131,1,90,10,101,7,100,12,100,13,132,0,131,1,90,11, + 101,7,101,12,100,14,100,15,132,0,131,1,131,1,90,13, + 101,7,101,12,100,16,100,17,132,0,131,1,131,1,90,14, + 101,7,101,12,100,18,100,19,132,0,131,1,131,1,90,15, + 101,7,101,16,131,1,90,17,100,5,83,0,41,22,218,15, + 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,122, + 144,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, + 116,32,102,111,114,32,98,117,105,108,116,45,105,110,32,109, 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, @@ -1203,305 +1059,450 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, - 32,90,6,102,114,111,122,101,110,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,4,0,0,0,67,0, - 0,0,115,16,0,0,0,100,1,160,0,124,0,106,1,116, - 2,106,3,161,2,83,0,41,2,114,162,0,0,0,114,154, - 0,0,0,41,4,114,46,0,0,0,114,1,0,0,0,114, - 175,0,0,0,114,139,0,0,0,41,1,218,1,109,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,100,0, - 0,0,34,3,0,0,115,4,0,0,0,16,7,255,128,122, - 26,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,4,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0, - 0,67,0,0,0,115,30,0,0,0,116,0,160,1,124,1, - 161,1,114,26,116,2,124,1,124,0,124,0,106,3,100,1, - 141,3,83,0,100,0,83,0,114,163,0,0,0,41,4,114, - 58,0,0,0,114,89,0,0,0,114,92,0,0,0,114,139, - 0,0,0,114,164,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,168,0,0,0,43,3,0,0, - 115,8,0,0,0,10,2,16,1,4,2,255,128,122,24,70, - 114,111,122,101,110,73,109,112,111,114,116,101,114,46,102,105, - 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, - 115,18,0,0,0,116,0,160,1,124,1,161,1,114,14,124, - 0,83,0,100,1,83,0,41,2,122,93,70,105,110,100,32, - 97,32,102,114,111,122,101,110,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, - 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,32,32,85,115,101,32,102,105,110,100,95,115, - 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,78,41,2,114,58,0,0,0, - 114,89,0,0,0,41,3,114,165,0,0,0,114,82,0,0, - 0,114,166,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,169,0,0,0,50,3,0,0,115,4, - 0,0,0,18,7,255,128,122,26,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,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,122,42,85,115,101,32,100,101,102, - 97,117,108,116,32,115,101,109,97,110,116,105,99,115,32,102, - 111,114,32,109,111,100,117,108,101,32,99,114,101,97,116,105, - 111,110,46,78,114,10,0,0,0,41,2,114,165,0,0,0, - 114,96,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,150,0,0,0,59,3,0,0,115,4,0, - 0,0,4,128,255,128,122,28,70,114,111,122,101,110,73,109, - 112,111,114,116,101,114,46,99,114,101,97,116,101,95,109,111, - 100,117,108,101,99,1,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,4,0,0,0,67,0,0,0,115,64,0, - 0,0,124,0,106,0,106,1,125,1,116,2,160,3,124,1, - 161,1,115,36,116,4,100,1,160,5,124,1,161,1,124,1, - 100,2,141,2,130,1,116,6,116,2,106,7,124,1,131,2, - 125,2,116,8,124,2,124,0,106,9,131,2,1,0,100,0, - 83,0,114,88,0,0,0,41,10,114,106,0,0,0,114,17, - 0,0,0,114,58,0,0,0,114,89,0,0,0,114,80,0, - 0,0,114,46,0,0,0,114,68,0,0,0,218,17,103,101, - 116,95,102,114,111,122,101,110,95,111,98,106,101,99,116,218, - 4,101,120,101,99,114,7,0,0,0,41,3,114,97,0,0, - 0,114,17,0,0,0,218,4,99,111,100,101,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,151,0,0,0, - 63,3,0,0,115,18,0,0,0,8,2,10,1,10,1,2, - 1,6,255,12,2,12,1,4,128,255,128,122,26,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,101,120,101,99, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,10,0,0,0,116,0,124,0,124,1,131,2,83,0,41, - 1,122,95,76,111,97,100,32,97,32,102,114,111,122,101,110, - 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, - 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, - 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, - 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, - 32,32,41,1,114,98,0,0,0,114,170,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,156,0, - 0,0,72,3,0,0,115,4,0,0,0,10,7,255,128,122, - 26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,10,0,0,0,116,0,160,1,124,1,161, - 1,83,0,41,1,122,45,82,101,116,117,114,110,32,116,104, - 101,32,99,111,100,101,32,111,98,106,101,99,116,32,102,111, - 114,32,116,104,101,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,46,41,2,114,58,0,0,0,114,177,0,0,0, - 114,170,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,171,0,0,0,81,3,0,0,115,4,0, - 0,0,10,4,255,128,122,23,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,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,122,54,82,101,116,117,114,110,32,78,111,110,101, - 32,97,115,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, - 111,117,114,99,101,32,99,111,100,101,46,78,114,10,0,0, - 0,114,170,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,172,0,0,0,87,3,0,0,115,4, - 0,0,0,4,4,255,128,122,25,70,114,111,122,101,110,73, + 32,122,8,98,117,105,108,116,45,105,110,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0, + 67,0,0,0,115,22,0,0,0,100,1,124,0,106,0,155, + 2,100,2,116,1,106,2,155,0,100,3,157,5,83,0,41, + 4,250,115,82,101,116,117,114,110,32,114,101,112,114,32,102, + 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, + 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, + 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, + 32,32,32,32,32,32,122,8,60,109,111,100,117,108,101,32, + 122,2,32,40,122,2,41,62,41,3,114,1,0,0,0,114, + 161,0,0,0,114,139,0,0,0,41,1,114,97,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 100,0,0,0,215,2,0,0,115,4,0,0,0,22,7,255, + 128,122,27,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, + 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 5,0,0,0,67,0,0,0,115,42,0,0,0,124,2,100, + 0,117,1,114,12,100,0,83,0,116,0,160,1,124,1,161, + 1,114,38,116,2,124,1,124,0,124,0,106,3,100,1,141, + 3,83,0,100,0,83,0,169,2,78,114,138,0,0,0,41, + 4,114,58,0,0,0,90,10,105,115,95,98,117,105,108,116, + 105,110,114,92,0,0,0,114,139,0,0,0,169,4,218,3, + 99,108,115,114,82,0,0,0,218,4,112,97,116,104,218,6, + 116,97,114,103,101,116,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,9,102,105,110,100,95,115,112,101,99, + 224,2,0,0,115,12,0,0,0,8,2,4,1,10,1,16, + 1,4,2,255,128,122,25,66,117,105,108,116,105,110,73,109, + 112,111,114,116,101,114,46,102,105,110,100,95,115,112,101,99, + 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,30,0,0,0,124,0, + 160,0,124,1,124,2,161,2,125,3,124,3,100,1,117,1, + 114,26,124,3,106,1,83,0,100,1,83,0,41,2,122,175, + 70,105,110,100,32,116,104,101,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, + 32,32,32,73,102,32,39,112,97,116,104,39,32,105,115,32, + 101,118,101,114,32,115,112,101,99,105,102,105,101,100,32,116, + 104,101,110,32,116,104,101,32,115,101,97,114,99,104,32,105, + 115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,102, + 97,105,108,117,114,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, + 41,2,114,168,0,0,0,114,110,0,0,0,41,4,114,165, + 0,0,0,114,82,0,0,0,114,166,0,0,0,114,96,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,11,102,105,110,100,95,109,111,100,117,108,101,233,2, + 0,0,115,6,0,0,0,12,9,18,1,255,128,122,27,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,0,0,0,0,0,2,0,0,0,4,0,0,0,67, + 0,0,0,115,46,0,0,0,124,1,106,0,116,1,106,2, + 118,1,114,34,116,3,100,1,160,4,124,1,106,0,161,1, + 124,1,106,0,100,2,141,2,130,1,116,5,116,6,106,7, + 124,1,131,2,83,0,41,3,122,24,67,114,101,97,116,101, + 32,97,32,98,117,105,108,116,45,105,110,32,109,111,100,117, + 108,101,114,78,0,0,0,114,16,0,0,0,41,8,114,17, + 0,0,0,114,15,0,0,0,114,79,0,0,0,114,80,0, + 0,0,114,46,0,0,0,114,68,0,0,0,114,58,0,0, + 0,90,14,99,114,101,97,116,101,95,98,117,105,108,116,105, + 110,41,2,114,30,0,0,0,114,96,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,150,0,0, + 0,245,2,0,0,115,12,0,0,0,12,3,12,1,4,1, + 6,255,12,2,255,128,122,29,66,117,105,108,116,105,110,73, + 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,16, + 0,0,0,116,0,116,1,106,2,124,1,131,2,1,0,100, + 1,83,0,41,2,122,22,69,120,101,99,32,97,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,78,41,3, + 114,68,0,0,0,114,58,0,0,0,90,12,101,120,101,99, + 95,98,117,105,108,116,105,110,41,2,114,30,0,0,0,114, + 97,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,151,0,0,0,253,2,0,0,115,6,0,0, + 0,12,3,4,128,255,128,122,27,66,117,105,108,116,105,110, + 73,109,112,111,114,116,101,114,46,101,120,101,99,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,41,2,122,57,82,101,116,117,114,110, + 32,78,111,110,101,32,97,115,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,115,32,100,111,32,110,111,116, + 32,104,97,118,101,32,99,111,100,101,32,111,98,106,101,99, + 116,115,46,78,114,10,0,0,0,169,2,114,165,0,0,0, + 114,82,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,8,103,101,116,95,99,111,100,101,2,3, + 0,0,115,4,0,0,0,4,4,255,128,122,24,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,0,0, + 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,122,56,82,101,116,117,114, + 110,32,78,111,110,101,32,97,115,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,115,32,100,111,32,110,111, + 116,32,104,97,118,101,32,115,111,117,114,99,101,32,99,111, + 100,101,46,78,114,10,0,0,0,114,170,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,10,103, + 101,116,95,115,111,117,114,99,101,8,3,0,0,115,4,0, + 0,0,4,4,255,128,122,26,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,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0, - 116,0,160,1,124,1,161,1,83,0,41,1,122,46,82,101, - 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101, - 32,102,114,111,122,101,110,32,109,111,100,117,108,101,32,105, - 115,32,97,32,112,97,99,107,97,103,101,46,41,2,114,58, - 0,0,0,90,17,105,115,95,102,114,111,122,101,110,95,112, - 97,99,107,97,103,101,114,170,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,116,0,0,0,93, - 3,0,0,115,4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17, - 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, - 3,0,0,0,114,139,0,0,0,114,173,0,0,0,114,100, - 0,0,0,114,174,0,0,0,114,168,0,0,0,114,169,0, - 0,0,114,150,0,0,0,114,151,0,0,0,114,156,0,0, - 0,114,91,0,0,0,114,171,0,0,0,114,172,0,0,0, - 114,116,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,175,0,0,0,23,3, - 0,0,115,50,0,0,0,8,0,4,2,4,7,2,2,10, - 1,2,8,12,1,2,6,12,1,2,8,10,1,2,3,10, - 1,2,8,10,1,2,8,2,1,12,1,2,4,2,1,12, - 1,2,4,2,1,16,1,255,128,114,175,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,64,0,0,0,115,32,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, - 100,4,100,5,132,0,90,5,100,6,83,0,41,7,218,18, - 95,73,109,112,111,114,116,76,111,99,107,67,111,110,116,101, - 120,116,122,36,67,111,110,116,101,120,116,32,109,97,110,97, - 103,101,114,32,102,111,114,32,116,104,101,32,105,109,112,111, - 114,116,32,108,111,99,107,46,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,0, - 0,115,12,0,0,0,116,0,160,1,161,0,1,0,100,1, - 83,0,41,2,122,24,65,99,113,117,105,114,101,32,116,104, - 101,32,105,109,112,111,114,116,32,108,111,99,107,46,78,41, - 2,114,58,0,0,0,114,59,0,0,0,114,48,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 55,0,0,0,106,3,0,0,115,6,0,0,0,8,2,4, - 128,255,128,122,28,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,0,0,0,0,4,0, - 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,116, - 0,160,1,161,0,1,0,100,1,83,0,41,2,122,60,82, - 101,108,101,97,115,101,32,116,104,101,32,105,109,112,111,114, - 116,32,108,111,99,107,32,114,101,103,97,114,100,108,101,115, - 115,32,111,102,32,97,110,121,32,114,97,105,115,101,100,32, - 101,120,99,101,112,116,105,111,110,115,46,78,41,2,114,58, - 0,0,0,114,61,0,0,0,41,4,114,30,0,0,0,218, - 8,101,120,99,95,116,121,112,101,218,9,101,120,99,95,118, - 97,108,117,101,218,13,101,120,99,95,116,114,97,99,101,98, - 97,99,107,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,57,0,0,0,110,3,0,0,115,6,0,0,0, - 8,2,4,128,255,128,122,27,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,41,6,114,1,0,0,0,114,0,0,0,0, - 114,2,0,0,0,114,3,0,0,0,114,55,0,0,0,114, - 57,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,180,0,0,0,102,3,0, - 0,115,10,0,0,0,8,0,4,2,8,2,12,4,255,128, - 114,180,0,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,64, - 0,0,0,124,1,160,0,100,1,124,2,100,2,24,0,161, - 2,125,3,116,1,124,3,131,1,124,2,107,0,114,36,116, - 2,100,3,131,1,130,1,124,3,100,4,25,0,125,4,124, - 0,114,60,100,5,160,3,124,4,124,0,161,2,83,0,124, - 4,83,0,41,6,122,50,82,101,115,111,108,118,101,32,97, - 32,114,101,108,97,116,105,118,101,32,109,111,100,117,108,101, - 32,110,97,109,101,32,116,111,32,97,110,32,97,98,115,111, - 108,117,116,101,32,111,110,101,46,114,129,0,0,0,114,39, - 0,0,0,122,50,97,116,116,101,109,112,116,101,100,32,114, - 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,98, - 101,121,111,110,100,32,116,111,112,45,108,101,118,101,108,32, - 112,97,99,107,97,103,101,114,22,0,0,0,250,5,123,125, - 46,123,125,41,4,218,6,114,115,112,108,105,116,218,3,108, - 101,110,114,80,0,0,0,114,46,0,0,0,41,5,114,17, - 0,0,0,218,7,112,97,99,107,97,103,101,218,5,108,101, - 118,101,108,90,4,98,105,116,115,90,4,98,97,115,101,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,13, - 95,114,101,115,111,108,118,101,95,110,97,109,101,115,3,0, - 0,115,12,0,0,0,16,2,12,1,8,1,8,1,20,1, - 255,128,114,189,0,0,0,99,3,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, - 115,34,0,0,0,124,0,160,0,124,1,124,2,161,2,125, - 3,124,3,100,0,117,0,114,24,100,0,83,0,116,1,124, - 1,124,3,131,2,83,0,114,13,0,0,0,41,2,114,169, - 0,0,0,114,92,0,0,0,41,4,218,6,102,105,110,100, - 101,114,114,17,0,0,0,114,166,0,0,0,114,110,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,17,95,102,105,110,100,95,115,112,101,99,95,108,101,103, - 97,99,121,124,3,0,0,115,10,0,0,0,12,3,8,1, - 4,1,10,1,255,128,114,191,0,0,0,99,3,0,0,0, - 0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,0, - 67,0,0,0,115,28,1,0,0,116,0,106,1,125,3,124, - 3,100,1,117,0,114,22,116,2,100,2,131,1,130,1,124, - 3,115,38,116,3,160,4,100,3,116,5,161,2,1,0,124, - 0,116,0,106,6,118,0,125,4,124,3,68,0,93,226,125, - 5,116,7,131,0,143,94,1,0,122,10,124,5,106,8,125, - 6,87,0,110,54,4,0,116,9,121,128,1,0,1,0,1, - 0,116,10,124,5,124,0,124,1,131,3,125,7,124,7,100, - 1,117,0,114,124,89,0,87,0,100,1,4,0,4,0,131, - 3,1,0,113,52,89,0,110,14,48,0,124,6,124,0,124, - 1,124,2,131,3,125,7,87,0,100,1,4,0,4,0,131, - 3,1,0,110,16,49,0,115,162,48,0,1,0,1,0,1, - 0,89,0,1,0,124,7,100,1,117,1,114,52,124,4,144, - 1,115,16,124,0,116,0,106,6,118,0,144,1,114,16,116, - 0,106,6,124,0,25,0,125,8,122,10,124,8,106,11,125, - 9,87,0,110,26,4,0,116,9,121,244,1,0,1,0,1, - 0,124,7,6,0,89,0,2,0,1,0,83,0,48,0,124, - 9,100,1,117,0,144,1,114,8,124,7,2,0,1,0,83, - 0,124,9,2,0,1,0,83,0,124,7,2,0,1,0,83, - 0,100,1,83,0,41,4,122,21,70,105,110,100,32,97,32, - 109,111,100,117,108,101,39,115,32,115,112,101,99,46,78,122, - 53,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, - 115,32,78,111,110,101,44,32,80,121,116,104,111,110,32,105, - 115,32,108,105,107,101,108,121,32,115,104,117,116,116,105,110, - 103,32,100,111,119,110,122,22,115,121,115,46,109,101,116,97, - 95,112,97,116,104,32,105,115,32,101,109,112,116,121,41,12, - 114,15,0,0,0,218,9,109,101,116,97,95,112,97,116,104, - 114,80,0,0,0,218,9,95,119,97,114,110,105,110,103,115, - 218,4,119,97,114,110,218,13,73,109,112,111,114,116,87,97, - 114,110,105,110,103,114,93,0,0,0,114,180,0,0,0,114, - 168,0,0,0,114,107,0,0,0,114,191,0,0,0,114,106, - 0,0,0,41,10,114,17,0,0,0,114,166,0,0,0,114, - 167,0,0,0,114,192,0,0,0,90,9,105,115,95,114,101, - 108,111,97,100,114,190,0,0,0,114,168,0,0,0,114,96, - 0,0,0,114,97,0,0,0,114,106,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,10,95,102, - 105,110,100,95,115,112,101,99,133,3,0,0,115,56,0,0, - 0,6,2,8,1,8,2,4,3,12,1,10,5,8,1,8, - 1,2,1,10,1,12,1,12,1,8,1,22,1,42,2,8, - 1,18,2,10,1,2,1,10,1,12,1,14,4,10,2,8, - 1,8,2,8,2,4,2,255,128,114,196,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, - 0,0,0,67,0,0,0,115,108,0,0,0,116,0,124,0, - 116,1,131,2,115,28,116,2,100,1,160,3,116,4,124,0, - 131,1,161,1,131,1,130,1,124,2,100,2,107,0,114,44, - 116,5,100,3,131,1,130,1,124,2,100,2,107,4,114,84, - 116,0,124,1,116,1,131,2,115,72,116,2,100,4,131,1, - 130,1,110,12,124,1,115,84,116,6,100,5,131,1,130,1, - 124,0,115,104,124,2,100,2,107,2,114,104,116,5,100,6, - 131,1,130,1,100,7,83,0,41,8,122,28,86,101,114,105, - 102,121,32,97,114,103,117,109,101,110,116,115,32,97,114,101, - 32,34,115,97,110,101,34,46,122,31,109,111,100,117,108,101, - 32,110,97,109,101,32,109,117,115,116,32,98,101,32,115,116, - 114,44,32,110,111,116,32,123,125,114,22,0,0,0,122,18, - 108,101,118,101,108,32,109,117,115,116,32,98,101,32,62,61, - 32,48,122,31,95,95,112,97,99,107,97,103,101,95,95,32, - 110,111,116,32,115,101,116,32,116,111,32,97,32,115,116,114, - 105,110,103,122,54,97,116,116,101,109,112,116,101,100,32,114, - 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,119, - 105,116,104,32,110,111,32,107,110,111,119,110,32,112,97,114, - 101,110,116,32,112,97,99,107,97,103,101,122,17,69,109,112, - 116,121,32,109,111,100,117,108,101,32,110,97,109,101,78,41, - 7,218,10,105,115,105,110,115,116,97,110,99,101,218,3,115, - 116,114,218,9,84,121,112,101,69,114,114,111,114,114,46,0, - 0,0,114,14,0,0,0,218,10,86,97,108,117,101,69,114, - 114,111,114,114,80,0,0,0,169,3,114,17,0,0,0,114, - 187,0,0,0,114,188,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,13,95,115,97,110,105,116, - 121,95,99,104,101,99,107,180,3,0,0,115,26,0,0,0, - 10,2,18,1,8,1,8,1,8,1,10,1,10,1,4,1, - 8,1,12,2,8,1,4,128,255,128,114,202,0,0,0,122, - 16,78,111,32,109,111,100,117,108,101,32,110,97,109,101,100, - 32,122,4,123,33,114,125,99,2,0,0,0,0,0,0,0, - 0,0,0,0,9,0,0,0,8,0,0,0,67,0,0,0, - 115,22,1,0,0,100,0,125,2,124,0,160,0,100,1,161, - 1,100,2,25,0,125,3,124,3,114,132,124,3,116,1,106, - 2,118,1,114,42,116,3,124,1,124,3,131,2,1,0,124, - 0,116,1,106,2,118,0,114,62,116,1,106,2,124,0,25, - 0,83,0,116,1,106,2,124,3,25,0,125,4,122,10,124, - 4,106,4,125,2,87,0,110,48,4,0,116,5,121,130,1, - 0,1,0,1,0,116,6,100,3,23,0,160,7,124,0,124, - 3,161,2,125,5,116,8,124,5,124,0,100,4,141,2,100, - 0,130,2,89,0,110,2,48,0,116,9,124,0,124,2,131, - 2,125,6,124,6,100,0,117,0,114,170,116,8,116,6,160, - 7,124,0,161,1,124,0,100,4,141,2,130,1,110,8,116, - 10,124,6,131,1,125,7,124,3,144,1,114,18,116,1,106, - 2,124,3,25,0,125,4,124,0,160,0,100,1,161,1,100, - 5,25,0,125,8,122,16,116,11,124,4,124,8,124,7,131, - 3,1,0,87,0,110,48,4,0,116,5,144,1,121,16,1, - 0,1,0,1,0,100,6,124,3,155,2,100,7,124,8,155, - 2,157,4,125,5,116,12,160,13,124,5,116,14,161,2,1, - 0,89,0,110,2,48,0,124,7,83,0,41,8,78,114,129, - 0,0,0,114,22,0,0,0,122,23,59,32,123,33,114,125, - 32,105,115,32,110,111,116,32,97,32,112,97,99,107,97,103, - 101,114,16,0,0,0,233,2,0,0,0,122,27,67,97,110, - 110,111,116,32,115,101,116,32,97,110,32,97,116,116,114,105, - 98,117,116,101,32,111,110,32,122,18,32,102,111,114,32,99, - 104,105,108,100,32,109,111,100,117,108,101,32,41,15,114,130, - 0,0,0,114,15,0,0,0,114,93,0,0,0,114,68,0, - 0,0,114,142,0,0,0,114,107,0,0,0,218,8,95,69, - 82,82,95,77,83,71,114,46,0,0,0,218,19,77,111,100, - 117,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, - 114,196,0,0,0,114,160,0,0,0,114,5,0,0,0,114, - 193,0,0,0,114,194,0,0,0,114,195,0,0,0,41,9, - 114,17,0,0,0,218,7,105,109,112,111,114,116,95,114,166, - 0,0,0,114,131,0,0,0,90,13,112,97,114,101,110,116, - 95,109,111,100,117,108,101,114,158,0,0,0,114,96,0,0, - 0,114,97,0,0,0,90,5,99,104,105,108,100,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,23,95,102, - 105,110,100,95,97,110,100,95,108,111,97,100,95,117,110,108, - 111,99,107,101,100,199,3,0,0,115,54,0,0,0,4,1, - 14,1,4,1,10,1,10,1,10,2,10,1,10,1,2,1, - 10,1,12,1,16,1,20,1,10,1,8,1,20,1,8,2, - 6,1,10,2,14,1,2,1,16,1,14,1,16,1,18,1, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,41,2,122,52,82,101,116,117,114,110,32,70, + 97,108,115,101,32,97,115,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,115,32,97,114,101,32,110,101,118, + 101,114,32,112,97,99,107,97,103,101,115,46,70,114,10,0, + 0,0,114,170,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,116,0,0,0,14,3,0,0,115, + 4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41,18,114,1,0, + 0,0,114,0,0,0,0,114,2,0,0,0,114,3,0,0, + 0,114,139,0,0,0,218,12,115,116,97,116,105,99,109,101, + 116,104,111,100,114,100,0,0,0,218,11,99,108,97,115,115, + 109,101,116,104,111,100,114,168,0,0,0,114,169,0,0,0, + 114,150,0,0,0,114,151,0,0,0,114,87,0,0,0,114, + 171,0,0,0,114,172,0,0,0,114,116,0,0,0,114,98, + 0,0,0,114,156,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,161,0,0, + 0,204,2,0,0,115,48,0,0,0,8,0,4,2,4,7, + 2,2,10,1,2,8,12,1,2,8,12,1,2,11,10,1, + 2,7,10,1,2,4,2,1,12,1,2,4,2,1,12,1, + 2,4,2,1,12,1,12,4,255,128,114,161,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,64,0,0,0,115,144,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,100,2,90,4,101,5,100, + 3,100,4,132,0,131,1,90,6,101,7,100,22,100,6,100, + 7,132,1,131,1,90,8,101,7,100,23,100,8,100,9,132, + 1,131,1,90,9,101,7,100,10,100,11,132,0,131,1,90, + 10,101,5,100,12,100,13,132,0,131,1,90,11,101,7,100, + 14,100,15,132,0,131,1,90,12,101,7,101,13,100,16,100, + 17,132,0,131,1,131,1,90,14,101,7,101,13,100,18,100, + 19,132,0,131,1,131,1,90,15,101,7,101,13,100,20,100, + 21,132,0,131,1,131,1,90,16,100,5,83,0,41,24,218, + 14,70,114,111,122,101,110,73,109,112,111,114,116,101,114,122, + 142,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, + 116,32,102,111,114,32,102,114,111,122,101,110,32,109,111,100, + 117,108,101,115,46,10,10,32,32,32,32,65,108,108,32,109, + 101,116,104,111,100,115,32,97,114,101,32,101,105,116,104,101, + 114,32,99,108,97,115,115,32,111,114,32,115,116,97,116,105, + 99,32,109,101,116,104,111,100,115,32,116,111,32,97,118,111, + 105,100,32,116,104,101,32,110,101,101,100,32,116,111,10,32, + 32,32,32,105,110,115,116,97,110,116,105,97,116,101,32,116, + 104,101,32,99,108,97,115,115,46,10,10,32,32,32,32,90, + 6,102,114,111,122,101,110,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, + 115,16,0,0,0,100,1,160,0,124,0,106,1,116,2,106, + 3,161,2,83,0,41,2,114,162,0,0,0,114,154,0,0, + 0,41,4,114,46,0,0,0,114,1,0,0,0,114,175,0, + 0,0,114,139,0,0,0,41,1,218,1,109,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,100,0,0,0, + 34,3,0,0,115,4,0,0,0,16,7,255,128,122,26,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,4,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, + 0,0,0,115,30,0,0,0,116,0,160,1,124,1,161,1, + 114,26,116,2,124,1,124,0,124,0,106,3,100,1,141,3, + 83,0,100,0,83,0,114,163,0,0,0,41,4,114,58,0, + 0,0,114,89,0,0,0,114,92,0,0,0,114,139,0,0, + 0,114,164,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,168,0,0,0,43,3,0,0,115,8, + 0,0,0,10,2,16,1,4,2,255,128,122,24,70,114,111, + 122,101,110,73,109,112,111,114,116,101,114,46,102,105,110,100, + 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,18, + 0,0,0,116,0,160,1,124,1,161,1,114,14,124,0,83, + 0,100,1,83,0,41,2,122,93,70,105,110,100,32,97,32, + 102,114,111,122,101,110,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, + 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,32,32,32,32,78,41,2,114,58,0,0,0,114,89, + 0,0,0,41,3,114,165,0,0,0,114,82,0,0,0,114, + 166,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,169,0,0,0,50,3,0,0,115,4,0,0, + 0,18,7,255,128,122,26,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,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,122,42,85,115,101,32,100,101,102,97,117, + 108,116,32,115,101,109,97,110,116,105,99,115,32,102,111,114, + 32,109,111,100,117,108,101,32,99,114,101,97,116,105,111,110, + 46,78,114,10,0,0,0,41,2,114,165,0,0,0,114,96, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,150,0,0,0,59,3,0,0,115,4,0,0,0, + 4,128,255,128,122,28,70,114,111,122,101,110,73,109,112,111, + 114,116,101,114,46,99,114,101,97,116,101,95,109,111,100,117, + 108,101,99,1,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,4,0,0,0,67,0,0,0,115,64,0,0,0, + 124,0,106,0,106,1,125,1,116,2,160,3,124,1,161,1, + 115,36,116,4,100,1,160,5,124,1,161,1,124,1,100,2, + 141,2,130,1,116,6,116,2,106,7,124,1,131,2,125,2, + 116,8,124,2,124,0,106,9,131,2,1,0,100,0,83,0, + 114,88,0,0,0,41,10,114,106,0,0,0,114,17,0,0, + 0,114,58,0,0,0,114,89,0,0,0,114,80,0,0,0, + 114,46,0,0,0,114,68,0,0,0,218,17,103,101,116,95, + 102,114,111,122,101,110,95,111,98,106,101,99,116,218,4,101, + 120,101,99,114,7,0,0,0,41,3,114,97,0,0,0,114, + 17,0,0,0,218,4,99,111,100,101,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,151,0,0,0,63,3, + 0,0,115,18,0,0,0,8,2,10,1,10,1,2,1,6, + 255,12,2,12,1,4,128,255,128,122,26,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,101,120,101,99,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, + 0,0,0,116,0,124,0,124,1,131,2,83,0,41,1,122, + 95,76,111,97,100,32,97,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, + 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, + 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, + 41,1,114,98,0,0,0,114,170,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,156,0,0,0, + 72,3,0,0,115,4,0,0,0,10,7,255,128,122,26,70, + 114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, + 0,0,115,10,0,0,0,116,0,160,1,124,1,161,1,83, + 0,41,1,122,45,82,101,116,117,114,110,32,116,104,101,32, + 99,111,100,101,32,111,98,106,101,99,116,32,102,111,114,32, + 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,46,41,2,114,58,0,0,0,114,177,0,0,0,114,170, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,171,0,0,0,81,3,0,0,115,4,0,0,0, + 10,4,255,128,122,23,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,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,122,54,82,101,116,117,114,110,32,78,111,110,101,32,97, + 115,32,102,114,111,122,101,110,32,109,111,100,117,108,101,115, + 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, + 114,99,101,32,99,111,100,101,46,78,114,10,0,0,0,114, + 170,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,172,0,0,0,87,3,0,0,115,4,0,0, + 0,4,4,255,128,122,25,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,0,0,0,0,2,0,0, + 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, + 160,1,124,1,161,1,83,0,41,1,122,46,82,101,116,117, + 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,102, + 114,111,122,101,110,32,109,111,100,117,108,101,32,105,115,32, + 97,32,112,97,99,107,97,103,101,46,41,2,114,58,0,0, + 0,90,17,105,115,95,102,114,111,122,101,110,95,112,97,99, + 107,97,103,101,114,170,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,116,0,0,0,93,3,0, + 0,115,4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17,114,1, + 0,0,0,114,0,0,0,0,114,2,0,0,0,114,3,0, + 0,0,114,139,0,0,0,114,173,0,0,0,114,100,0,0, + 0,114,174,0,0,0,114,168,0,0,0,114,169,0,0,0, + 114,150,0,0,0,114,151,0,0,0,114,156,0,0,0,114, + 91,0,0,0,114,171,0,0,0,114,172,0,0,0,114,116, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,175,0,0,0,23,3,0,0, + 115,50,0,0,0,8,0,4,2,4,7,2,2,10,1,2, + 8,12,1,2,6,12,1,2,8,10,1,2,3,10,1,2, + 8,10,1,2,8,2,1,12,1,2,4,2,1,12,1,2, + 4,2,1,16,1,255,128,114,175,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,64,0,0,0,115,32,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, + 100,5,132,0,90,5,100,6,83,0,41,7,218,18,95,73, + 109,112,111,114,116,76,111,99,107,67,111,110,116,101,120,116, + 122,36,67,111,110,116,101,120,116,32,109,97,110,97,103,101, + 114,32,102,111,114,32,116,104,101,32,105,109,112,111,114,116, + 32,108,111,99,107,46,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, + 12,0,0,0,116,0,160,1,161,0,1,0,100,1,83,0, + 41,2,122,24,65,99,113,117,105,114,101,32,116,104,101,32, + 105,109,112,111,114,116,32,108,111,99,107,46,78,41,2,114, + 58,0,0,0,114,59,0,0,0,114,48,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,55,0, + 0,0,106,3,0,0,115,6,0,0,0,8,2,4,128,255, + 128,122,28,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,0,0,0,0,4,0,0,0, + 2,0,0,0,67,0,0,0,115,12,0,0,0,116,0,160, + 1,161,0,1,0,100,1,83,0,41,2,122,60,82,101,108, + 101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32, + 108,111,99,107,32,114,101,103,97,114,100,108,101,115,115,32, + 111,102,32,97,110,121,32,114,97,105,115,101,100,32,101,120, + 99,101,112,116,105,111,110,115,46,78,41,2,114,58,0,0, + 0,114,61,0,0,0,41,4,114,30,0,0,0,218,8,101, + 120,99,95,116,121,112,101,218,9,101,120,99,95,118,97,108, + 117,101,218,13,101,120,99,95,116,114,97,99,101,98,97,99, + 107,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,57,0,0,0,110,3,0,0,115,6,0,0,0,8,2, + 4,128,255,128,122,27,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,41,6,114,1,0,0,0,114,0,0,0,0,114,2, + 0,0,0,114,3,0,0,0,114,55,0,0,0,114,57,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,180,0,0,0,102,3,0,0,115, + 10,0,0,0,8,0,4,2,8,2,12,4,255,128,114,180, + 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, + 5,0,0,0,5,0,0,0,67,0,0,0,115,64,0,0, + 0,124,1,160,0,100,1,124,2,100,2,24,0,161,2,125, + 3,116,1,124,3,131,1,124,2,107,0,114,36,116,2,100, + 3,131,1,130,1,124,3,100,4,25,0,125,4,124,0,114, + 60,100,5,160,3,124,4,124,0,161,2,83,0,124,4,83, + 0,41,6,122,50,82,101,115,111,108,118,101,32,97,32,114, + 101,108,97,116,105,118,101,32,109,111,100,117,108,101,32,110, + 97,109,101,32,116,111,32,97,110,32,97,98,115,111,108,117, + 116,101,32,111,110,101,46,114,129,0,0,0,114,39,0,0, + 0,122,50,97,116,116,101,109,112,116,101,100,32,114,101,108, + 97,116,105,118,101,32,105,109,112,111,114,116,32,98,101,121, + 111,110,100,32,116,111,112,45,108,101,118,101,108,32,112,97, + 99,107,97,103,101,114,22,0,0,0,250,5,123,125,46,123, + 125,41,4,218,6,114,115,112,108,105,116,218,3,108,101,110, + 114,80,0,0,0,114,46,0,0,0,41,5,114,17,0,0, + 0,218,7,112,97,99,107,97,103,101,218,5,108,101,118,101, + 108,90,4,98,105,116,115,90,4,98,97,115,101,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,13,95,114, + 101,115,111,108,118,101,95,110,97,109,101,115,3,0,0,115, + 12,0,0,0,16,2,12,1,8,1,8,1,20,1,255,128, + 114,189,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,34, + 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, + 3,100,0,117,0,114,24,100,0,83,0,116,1,124,1,124, + 3,131,2,83,0,114,13,0,0,0,41,2,114,169,0,0, + 0,114,92,0,0,0,41,4,218,6,102,105,110,100,101,114, + 114,17,0,0,0,114,166,0,0,0,114,110,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,17, + 95,102,105,110,100,95,115,112,101,99,95,108,101,103,97,99, + 121,124,3,0,0,115,10,0,0,0,12,3,8,1,4,1, + 10,1,255,128,114,191,0,0,0,99,3,0,0,0,0,0, + 0,0,0,0,0,0,10,0,0,0,10,0,0,0,67,0, + 0,0,115,28,1,0,0,116,0,106,1,125,3,124,3,100, + 1,117,0,114,22,116,2,100,2,131,1,130,1,124,3,115, + 38,116,3,160,4,100,3,116,5,161,2,1,0,124,0,116, + 0,106,6,118,0,125,4,124,3,68,0,93,226,125,5,116, + 7,131,0,143,94,1,0,122,10,124,5,106,8,125,6,87, + 0,110,54,4,0,116,9,121,128,1,0,1,0,1,0,116, + 10,124,5,124,0,124,1,131,3,125,7,124,7,100,1,117, + 0,114,124,89,0,87,0,100,1,4,0,4,0,131,3,1, + 0,113,52,89,0,110,14,48,0,124,6,124,0,124,1,124, + 2,131,3,125,7,87,0,100,1,4,0,4,0,131,3,1, + 0,110,16,49,0,115,162,48,0,1,0,1,0,1,0,89, + 0,1,0,124,7,100,1,117,1,114,52,124,4,144,1,115, + 16,124,0,116,0,106,6,118,0,144,1,114,16,116,0,106, + 6,124,0,25,0,125,8,122,10,124,8,106,11,125,9,87, + 0,110,26,4,0,116,9,121,244,1,0,1,0,1,0,124, + 7,6,0,89,0,2,0,1,0,83,0,48,0,124,9,100, + 1,117,0,144,1,114,8,124,7,2,0,1,0,83,0,124, + 9,2,0,1,0,83,0,124,7,2,0,1,0,83,0,100, + 1,83,0,41,4,122,21,70,105,110,100,32,97,32,109,111, + 100,117,108,101,39,115,32,115,112,101,99,46,78,122,53,115, + 121,115,46,109,101,116,97,95,112,97,116,104,32,105,115,32, + 78,111,110,101,44,32,80,121,116,104,111,110,32,105,115,32, + 108,105,107,101,108,121,32,115,104,117,116,116,105,110,103,32, + 100,111,119,110,122,22,115,121,115,46,109,101,116,97,95,112, + 97,116,104,32,105,115,32,101,109,112,116,121,41,12,114,15, + 0,0,0,218,9,109,101,116,97,95,112,97,116,104,114,80, + 0,0,0,218,9,95,119,97,114,110,105,110,103,115,218,4, + 119,97,114,110,218,13,73,109,112,111,114,116,87,97,114,110, + 105,110,103,114,93,0,0,0,114,180,0,0,0,114,168,0, + 0,0,114,107,0,0,0,114,191,0,0,0,114,106,0,0, + 0,41,10,114,17,0,0,0,114,166,0,0,0,114,167,0, + 0,0,114,192,0,0,0,90,9,105,115,95,114,101,108,111, + 97,100,114,190,0,0,0,114,168,0,0,0,114,96,0,0, + 0,114,97,0,0,0,114,106,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,10,95,102,105,110, + 100,95,115,112,101,99,133,3,0,0,115,56,0,0,0,6, + 2,8,1,8,2,4,3,12,1,10,5,8,1,8,1,2, + 1,10,1,12,1,12,1,8,1,22,1,42,2,8,1,18, + 2,10,1,2,1,10,1,12,1,14,4,10,2,8,1,8, + 2,8,2,4,2,255,128,114,196,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, + 0,67,0,0,0,115,106,0,0,0,116,0,124,0,116,1, + 131,2,115,28,116,2,100,1,160,3,116,4,124,0,131,1, + 161,1,131,1,130,1,124,2,100,2,107,0,114,44,116,5, + 100,3,131,1,130,1,124,2,100,2,107,4,114,82,116,0, + 124,1,116,1,131,2,115,70,116,2,100,4,131,1,130,1, + 124,1,115,82,116,6,100,5,131,1,130,1,124,0,115,102, + 124,2,100,2,107,2,114,102,116,5,100,6,131,1,130,1, + 100,7,83,0,41,8,122,28,86,101,114,105,102,121,32,97, + 114,103,117,109,101,110,116,115,32,97,114,101,32,34,115,97, + 110,101,34,46,122,31,109,111,100,117,108,101,32,110,97,109, + 101,32,109,117,115,116,32,98,101,32,115,116,114,44,32,110, + 111,116,32,123,125,114,22,0,0,0,122,18,108,101,118,101, + 108,32,109,117,115,116,32,98,101,32,62,61,32,48,122,31, + 95,95,112,97,99,107,97,103,101,95,95,32,110,111,116,32, + 115,101,116,32,116,111,32,97,32,115,116,114,105,110,103,122, + 54,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, + 105,118,101,32,105,109,112,111,114,116,32,119,105,116,104,32, + 110,111,32,107,110,111,119,110,32,112,97,114,101,110,116,32, + 112,97,99,107,97,103,101,122,17,69,109,112,116,121,32,109, + 111,100,117,108,101,32,110,97,109,101,78,41,7,218,10,105, + 115,105,110,115,116,97,110,99,101,218,3,115,116,114,218,9, + 84,121,112,101,69,114,114,111,114,114,46,0,0,0,114,14, + 0,0,0,218,10,86,97,108,117,101,69,114,114,111,114,114, + 80,0,0,0,169,3,114,17,0,0,0,114,187,0,0,0, + 114,188,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,13,95,115,97,110,105,116,121,95,99,104, + 101,99,107,180,3,0,0,115,26,0,0,0,10,2,18,1, + 8,1,8,1,8,1,10,1,8,1,4,1,8,1,12,2, + 8,1,4,128,255,128,114,202,0,0,0,122,16,78,111,32, + 109,111,100,117,108,101,32,110,97,109,101,100,32,122,4,123, + 33,114,125,99,2,0,0,0,0,0,0,0,0,0,0,0, + 9,0,0,0,8,0,0,0,67,0,0,0,115,20,1,0, + 0,100,0,125,2,124,0,160,0,100,1,161,1,100,2,25, + 0,125,3,124,3,114,128,124,3,116,1,106,2,118,1,114, + 42,116,3,124,1,124,3,131,2,1,0,124,0,116,1,106, + 2,118,0,114,62,116,1,106,2,124,0,25,0,83,0,116, + 1,106,2,124,3,25,0,125,4,122,10,124,4,106,4,125, + 2,87,0,110,44,4,0,116,5,121,126,1,0,1,0,1, + 0,116,6,100,3,23,0,160,7,124,0,124,3,161,2,125, + 5,116,8,124,5,124,0,100,4,141,2,100,0,130,2,48, + 0,116,9,124,0,124,2,131,2,125,6,124,6,100,0,117, + 0,114,164,116,8,116,6,160,7,124,0,161,1,124,0,100, + 4,141,2,130,1,116,10,124,6,131,1,125,7,124,3,144, + 1,114,16,116,1,106,2,124,3,25,0,125,4,124,0,160, + 0,100,1,161,1,100,5,25,0,125,8,122,18,116,11,124, + 4,124,8,124,7,131,3,1,0,87,0,124,7,83,0,4, + 0,116,5,144,1,121,14,1,0,1,0,1,0,100,6,124, + 3,155,2,100,7,124,8,155,2,157,4,125,5,116,12,160, + 13,124,5,116,14,161,2,1,0,89,0,124,7,83,0,48, + 0,124,7,83,0,41,8,78,114,129,0,0,0,114,22,0, + 0,0,122,23,59,32,123,33,114,125,32,105,115,32,110,111, + 116,32,97,32,112,97,99,107,97,103,101,114,16,0,0,0, + 233,2,0,0,0,122,27,67,97,110,110,111,116,32,115,101, + 116,32,97,110,32,97,116,116,114,105,98,117,116,101,32,111, + 110,32,122,18,32,102,111,114,32,99,104,105,108,100,32,109, + 111,100,117,108,101,32,41,15,114,130,0,0,0,114,15,0, + 0,0,114,93,0,0,0,114,68,0,0,0,114,142,0,0, + 0,114,107,0,0,0,218,8,95,69,82,82,95,77,83,71, + 114,46,0,0,0,218,19,77,111,100,117,108,101,78,111,116, + 70,111,117,110,100,69,114,114,111,114,114,196,0,0,0,114, + 160,0,0,0,114,5,0,0,0,114,193,0,0,0,114,194, + 0,0,0,114,195,0,0,0,41,9,114,17,0,0,0,218, + 7,105,109,112,111,114,116,95,114,166,0,0,0,114,131,0, + 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, + 101,114,158,0,0,0,114,96,0,0,0,114,97,0,0,0, + 90,5,99,104,105,108,100,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,23,95,102,105,110,100,95,97,110, + 100,95,108,111,97,100,95,117,110,108,111,99,107,101,100,199, + 3,0,0,115,60,0,0,0,4,1,14,1,4,1,10,1, + 10,1,10,2,10,1,10,1,2,1,10,1,12,1,16,1, + 16,1,10,1,8,1,18,1,8,2,6,1,10,2,14,1, + 2,1,14,1,4,4,14,253,16,1,14,1,4,1,2,255, 4,1,255,128,114,207,0,0,0,99,2,0,0,0,0,0, 0,0,0,0,0,0,4,0,0,0,8,0,0,0,67,0, 0,0,115,128,0,0,0,116,0,124,0,131,1,143,62,1, @@ -1558,178 +1559,177 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 10,0,0,0,12,9,8,1,12,1,10,1,255,128,114,210, 0,0,0,169,1,218,9,114,101,99,117,114,115,105,118,101, 99,3,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,11,0,0,0,67,0,0,0,115,232,0,0,0,124,1, - 68,0,93,222,125,4,116,0,124,4,116,1,131,2,115,66, + 0,11,0,0,0,67,0,0,0,115,218,0,0,0,124,1, + 68,0,93,208,125,4,116,0,124,4,116,1,131,2,115,64, 124,3,114,34,124,0,106,2,100,1,23,0,125,5,110,4, 100,2,125,5,116,3,100,3,124,5,155,0,100,4,116,4, - 124,4,131,1,106,2,155,0,157,4,131,1,130,1,113,4, - 124,4,100,5,107,2,114,108,124,3,115,226,116,5,124,0, - 100,6,131,2,114,226,116,6,124,0,124,0,106,7,124,2, - 100,7,100,8,141,4,1,0,113,4,116,5,124,0,124,4, - 131,2,115,4,100,9,160,8,124,0,106,2,124,4,161,2, - 125,6,122,14,116,9,124,2,124,6,131,2,1,0,87,0, - 113,4,4,0,116,10,121,224,1,0,125,7,1,0,122,54, - 124,7,106,11,124,6,107,2,114,202,116,12,106,13,160,14, - 124,6,116,15,161,2,100,10,117,1,114,202,87,0,89,0, - 100,10,125,7,126,7,113,4,130,0,87,0,89,0,100,10, - 125,7,126,7,113,4,100,10,125,7,126,7,48,0,48,0, - 113,4,124,0,83,0,41,11,122,238,70,105,103,117,114,101, - 32,111,117,116,32,119,104,97,116,32,95,95,105,109,112,111, - 114,116,95,95,32,115,104,111,117,108,100,32,114,101,116,117, - 114,110,46,10,10,32,32,32,32,84,104,101,32,105,109,112, - 111,114,116,95,32,112,97,114,97,109,101,116,101,114,32,105, - 115,32,97,32,99,97,108,108,97,98,108,101,32,119,104,105, - 99,104,32,116,97,107,101,115,32,116,104,101,32,110,97,109, - 101,32,111,102,32,109,111,100,117,108,101,32,116,111,10,32, - 32,32,32,105,109,112,111,114,116,46,32,73,116,32,105,115, - 32,114,101,113,117,105,114,101,100,32,116,111,32,100,101,99, - 111,117,112,108,101,32,116,104,101,32,102,117,110,99,116,105, - 111,110,32,102,114,111,109,32,97,115,115,117,109,105,110,103, - 32,105,109,112,111,114,116,108,105,98,39,115,10,32,32,32, - 32,105,109,112,111,114,116,32,105,109,112,108,101,109,101,110, - 116,97,116,105,111,110,32,105,115,32,100,101,115,105,114,101, - 100,46,10,10,32,32,32,32,122,8,46,95,95,97,108,108, - 95,95,122,13,96,96,102,114,111,109,32,108,105,115,116,39, - 39,122,8,73,116,101,109,32,105,110,32,122,18,32,109,117, - 115,116,32,98,101,32,115,116,114,44,32,110,111,116,32,250, - 1,42,218,7,95,95,97,108,108,95,95,84,114,211,0,0, - 0,114,184,0,0,0,78,41,16,114,197,0,0,0,114,198, - 0,0,0,114,1,0,0,0,114,199,0,0,0,114,14,0, - 0,0,114,4,0,0,0,218,16,95,104,97,110,100,108,101, - 95,102,114,111,109,108,105,115,116,114,214,0,0,0,114,46, - 0,0,0,114,68,0,0,0,114,205,0,0,0,114,17,0, - 0,0,114,15,0,0,0,114,93,0,0,0,114,35,0,0, - 0,114,208,0,0,0,41,8,114,97,0,0,0,218,8,102, - 114,111,109,108,105,115,116,114,206,0,0,0,114,212,0,0, - 0,218,1,120,90,5,119,104,101,114,101,90,9,102,114,111, - 109,95,110,97,109,101,90,3,101,120,99,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,215,0,0,0,9, - 4,0,0,115,52,0,0,0,8,10,10,1,4,1,12,1, - 4,2,10,1,8,1,10,255,8,2,14,1,10,1,2,1, - 8,255,10,2,14,1,2,1,14,1,14,1,10,4,16,1, - 2,255,12,2,6,1,20,128,4,1,255,128,114,215,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,6,0,0,0,67,0,0,0,115,146,0,0,0,124, - 0,160,0,100,1,161,1,125,1,124,0,160,0,100,2,161, - 1,125,2,124,1,100,3,117,1,114,82,124,2,100,3,117, - 1,114,78,124,1,124,2,106,1,107,3,114,78,116,2,106, - 3,100,4,124,1,155,2,100,5,124,2,106,1,155,2,100, - 6,157,5,116,4,100,7,100,8,141,3,1,0,124,1,83, - 0,124,2,100,3,117,1,114,96,124,2,106,1,83,0,116, - 2,106,3,100,9,116,4,100,7,100,8,141,3,1,0,124, - 0,100,10,25,0,125,1,100,11,124,0,118,1,114,142,124, - 1,160,5,100,12,161,1,100,13,25,0,125,1,124,1,83, - 0,41,14,122,167,67,97,108,99,117,108,97,116,101,32,119, - 104,97,116,32,95,95,112,97,99,107,97,103,101,95,95,32, - 115,104,111,117,108,100,32,98,101,46,10,10,32,32,32,32, - 95,95,112,97,99,107,97,103,101,95,95,32,105,115,32,110, - 111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111, - 32,98,101,32,100,101,102,105,110,101,100,32,111,114,32,99, - 111,117,108,100,32,98,101,32,115,101,116,32,116,111,32,78, - 111,110,101,10,32,32,32,32,116,111,32,114,101,112,114,101, - 115,101,110,116,32,116,104,97,116,32,105,116,115,32,112,114, - 111,112,101,114,32,118,97,108,117,101,32,105,115,32,117,110, - 107,110,111,119,110,46,10,10,32,32,32,32,114,146,0,0, - 0,114,106,0,0,0,78,122,32,95,95,112,97,99,107,97, - 103,101,95,95,32,33,61,32,95,95,115,112,101,99,95,95, - 46,112,97,114,101,110,116,32,40,122,4,32,33,61,32,250, - 1,41,233,3,0,0,0,41,1,90,10,115,116,97,99,107, - 108,101,118,101,108,122,89,99,97,110,39,116,32,114,101,115, - 111,108,118,101,32,112,97,99,107,97,103,101,32,102,114,111, - 109,32,95,95,115,112,101,99,95,95,32,111,114,32,95,95, - 112,97,99,107,97,103,101,95,95,44,32,102,97,108,108,105, - 110,103,32,98,97,99,107,32,111,110,32,95,95,110,97,109, - 101,95,95,32,97,110,100,32,95,95,112,97,116,104,95,95, - 114,1,0,0,0,114,142,0,0,0,114,129,0,0,0,114, - 22,0,0,0,41,6,114,35,0,0,0,114,131,0,0,0, - 114,193,0,0,0,114,194,0,0,0,114,195,0,0,0,114, - 130,0,0,0,41,3,218,7,103,108,111,98,97,108,115,114, - 187,0,0,0,114,96,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,17,95,99,97,108,99,95, - 95,95,112,97,99,107,97,103,101,95,95,46,4,0,0,115, - 44,0,0,0,10,7,10,1,8,1,18,1,6,1,2,1, - 4,255,4,1,6,255,4,2,6,254,4,3,8,1,6,1, - 6,2,4,2,6,254,8,3,8,1,14,1,4,1,255,128, - 114,221,0,0,0,114,10,0,0,0,99,5,0,0,0,0, - 0,0,0,0,0,0,0,9,0,0,0,5,0,0,0,67, - 0,0,0,115,174,0,0,0,124,4,100,1,107,2,114,18, - 116,0,124,0,131,1,125,5,110,36,124,1,100,2,117,1, - 114,30,124,1,110,2,105,0,125,6,116,1,124,6,131,1, - 125,7,116,0,124,0,124,7,124,4,131,3,125,5,124,3, - 115,148,124,4,100,1,107,2,114,84,116,0,124,0,160,2, - 100,3,161,1,100,1,25,0,131,1,83,0,124,0,115,92, - 124,5,83,0,116,3,124,0,131,1,116,3,124,0,160,2, - 100,3,161,1,100,1,25,0,131,1,24,0,125,8,116,4, - 106,5,124,5,106,6,100,2,116,3,124,5,106,6,131,1, - 124,8,24,0,133,2,25,0,25,0,83,0,116,7,124,5, - 100,4,131,2,114,170,116,8,124,5,124,3,116,0,131,3, - 83,0,124,5,83,0,41,5,97,215,1,0,0,73,109,112, - 111,114,116,32,97,32,109,111,100,117,108,101,46,10,10,32, - 32,32,32,84,104,101,32,39,103,108,111,98,97,108,115,39, - 32,97,114,103,117,109,101,110,116,32,105,115,32,117,115,101, - 100,32,116,111,32,105,110,102,101,114,32,119,104,101,114,101, - 32,116,104,101,32,105,109,112,111,114,116,32,105,115,32,111, - 99,99,117,114,114,105,110,103,32,102,114,111,109,10,32,32, - 32,32,116,111,32,104,97,110,100,108,101,32,114,101,108,97, - 116,105,118,101,32,105,109,112,111,114,116,115,46,32,84,104, - 101,32,39,108,111,99,97,108,115,39,32,97,114,103,117,109, - 101,110,116,32,105,115,32,105,103,110,111,114,101,100,46,32, - 84,104,101,10,32,32,32,32,39,102,114,111,109,108,105,115, - 116,39,32,97,114,103,117,109,101,110,116,32,115,112,101,99, - 105,102,105,101,115,32,119,104,97,116,32,115,104,111,117,108, - 100,32,101,120,105,115,116,32,97,115,32,97,116,116,114,105, - 98,117,116,101,115,32,111,110,32,116,104,101,32,109,111,100, - 117,108,101,10,32,32,32,32,98,101,105,110,103,32,105,109, - 112,111,114,116,101,100,32,40,101,46,103,46,32,96,96,102, - 114,111,109,32,109,111,100,117,108,101,32,105,109,112,111,114, - 116,32,60,102,114,111,109,108,105,115,116,62,96,96,41,46, - 32,32,84,104,101,32,39,108,101,118,101,108,39,10,32,32, - 32,32,97,114,103,117,109,101,110,116,32,114,101,112,114,101, - 115,101,110,116,115,32,116,104,101,32,112,97,99,107,97,103, - 101,32,108,111,99,97,116,105,111,110,32,116,111,32,105,109, - 112,111,114,116,32,102,114,111,109,32,105,110,32,97,32,114, - 101,108,97,116,105,118,101,10,32,32,32,32,105,109,112,111, - 114,116,32,40,101,46,103,46,32,96,96,102,114,111,109,32, - 46,46,112,107,103,32,105,109,112,111,114,116,32,109,111,100, - 96,96,32,119,111,117,108,100,32,104,97,118,101,32,97,32, - 39,108,101,118,101,108,39,32,111,102,32,50,41,46,10,10, - 32,32,32,32,114,22,0,0,0,78,114,129,0,0,0,114, - 142,0,0,0,41,9,114,210,0,0,0,114,221,0,0,0, - 218,9,112,97,114,116,105,116,105,111,110,114,186,0,0,0, - 114,15,0,0,0,114,93,0,0,0,114,1,0,0,0,114, - 4,0,0,0,114,215,0,0,0,41,9,114,17,0,0,0, - 114,220,0,0,0,218,6,108,111,99,97,108,115,114,216,0, - 0,0,114,188,0,0,0,114,97,0,0,0,90,8,103,108, - 111,98,97,108,115,95,114,187,0,0,0,90,7,99,117,116, - 95,111,102,102,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,10,95,95,105,109,112,111,114,116,95,95,73, - 4,0,0,115,32,0,0,0,8,11,10,1,16,2,8,1, - 12,1,4,1,8,3,18,1,4,1,4,1,26,4,30,3, - 10,1,12,1,4,2,255,128,114,224,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,38,0,0,0,116,0,160,1,124, - 0,161,1,125,1,124,1,100,0,117,0,114,30,116,2,100, - 1,124,0,23,0,131,1,130,1,116,3,124,1,131,1,83, - 0,41,2,78,122,25,110,111,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,32,110,97,109,101,100,32,41, - 4,114,161,0,0,0,114,168,0,0,0,114,80,0,0,0, - 114,160,0,0,0,41,2,114,17,0,0,0,114,96,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,18,95,98,117,105,108,116,105,110,95,102,114,111,109,95, - 110,97,109,101,110,4,0,0,115,10,0,0,0,10,1,8, - 1,12,1,8,1,255,128,114,225,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,10,0,0,0,5,0,0, - 0,67,0,0,0,115,166,0,0,0,124,1,97,0,124,0, - 97,1,116,2,116,1,131,1,125,2,116,1,106,3,160,4, - 161,0,68,0,93,72,92,2,125,3,125,4,116,5,124,4, - 124,2,131,2,114,26,124,3,116,1,106,6,118,0,114,60, - 116,7,125,5,110,18,116,0,160,8,124,3,161,1,114,26, - 116,9,125,5,110,2,113,26,116,10,124,4,124,5,131,2, + 124,4,131,1,106,2,155,0,157,4,131,1,130,1,124,4, + 100,5,107,2,114,106,124,3,115,212,116,5,124,0,100,6, + 131,2,114,212,116,6,124,0,124,0,106,7,124,2,100,7, + 100,8,141,4,1,0,113,4,116,5,124,0,124,4,131,2, + 115,4,100,9,160,8,124,0,106,2,124,4,161,2,125,6, + 122,14,116,9,124,2,124,6,131,2,1,0,87,0,113,4, + 4,0,116,10,121,210,1,0,125,7,1,0,122,42,124,7, + 106,11,124,6,107,2,114,200,116,12,106,13,160,14,124,6, + 116,15,161,2,100,10,117,1,114,200,87,0,89,0,100,10, + 125,7,126,7,113,4,130,0,100,10,125,7,126,7,48,0, + 48,0,113,4,124,0,83,0,41,11,122,238,70,105,103,117, + 114,101,32,111,117,116,32,119,104,97,116,32,95,95,105,109, + 112,111,114,116,95,95,32,115,104,111,117,108,100,32,114,101, + 116,117,114,110,46,10,10,32,32,32,32,84,104,101,32,105, + 109,112,111,114,116,95,32,112,97,114,97,109,101,116,101,114, + 32,105,115,32,97,32,99,97,108,108,97,98,108,101,32,119, + 104,105,99,104,32,116,97,107,101,115,32,116,104,101,32,110, + 97,109,101,32,111,102,32,109,111,100,117,108,101,32,116,111, + 10,32,32,32,32,105,109,112,111,114,116,46,32,73,116,32, + 105,115,32,114,101,113,117,105,114,101,100,32,116,111,32,100, + 101,99,111,117,112,108,101,32,116,104,101,32,102,117,110,99, + 116,105,111,110,32,102,114,111,109,32,97,115,115,117,109,105, + 110,103,32,105,109,112,111,114,116,108,105,98,39,115,10,32, + 32,32,32,105,109,112,111,114,116,32,105,109,112,108,101,109, + 101,110,116,97,116,105,111,110,32,105,115,32,100,101,115,105, + 114,101,100,46,10,10,32,32,32,32,122,8,46,95,95,97, + 108,108,95,95,122,13,96,96,102,114,111,109,32,108,105,115, + 116,39,39,122,8,73,116,101,109,32,105,110,32,122,18,32, + 109,117,115,116,32,98,101,32,115,116,114,44,32,110,111,116, + 32,250,1,42,218,7,95,95,97,108,108,95,95,84,114,211, + 0,0,0,114,184,0,0,0,78,41,16,114,197,0,0,0, + 114,198,0,0,0,114,1,0,0,0,114,199,0,0,0,114, + 14,0,0,0,114,4,0,0,0,218,16,95,104,97,110,100, + 108,101,95,102,114,111,109,108,105,115,116,114,214,0,0,0, + 114,46,0,0,0,114,68,0,0,0,114,205,0,0,0,114, + 17,0,0,0,114,15,0,0,0,114,93,0,0,0,114,35, + 0,0,0,114,208,0,0,0,41,8,114,97,0,0,0,218, + 8,102,114,111,109,108,105,115,116,114,206,0,0,0,114,212, + 0,0,0,218,1,120,90,5,119,104,101,114,101,90,9,102, + 114,111,109,95,110,97,109,101,90,3,101,120,99,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,215,0,0, + 0,9,4,0,0,115,52,0,0,0,8,10,10,1,4,1, + 12,1,4,2,10,1,8,1,8,255,8,2,14,1,10,1, + 2,1,8,255,10,2,14,1,2,1,14,1,14,1,10,4, + 16,1,2,255,12,2,2,1,12,128,4,1,255,128,114,215, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,6,0,0,0,67,0,0,0,115,146,0,0, + 0,124,0,160,0,100,1,161,1,125,1,124,0,160,0,100, + 2,161,1,125,2,124,1,100,3,117,1,114,82,124,2,100, + 3,117,1,114,78,124,1,124,2,106,1,107,3,114,78,116, + 2,106,3,100,4,124,1,155,2,100,5,124,2,106,1,155, + 2,100,6,157,5,116,4,100,7,100,8,141,3,1,0,124, + 1,83,0,124,2,100,3,117,1,114,96,124,2,106,1,83, + 0,116,2,106,3,100,9,116,4,100,7,100,8,141,3,1, + 0,124,0,100,10,25,0,125,1,100,11,124,0,118,1,114, + 142,124,1,160,5,100,12,161,1,100,13,25,0,125,1,124, + 1,83,0,41,14,122,167,67,97,108,99,117,108,97,116,101, + 32,119,104,97,116,32,95,95,112,97,99,107,97,103,101,95, + 95,32,115,104,111,117,108,100,32,98,101,46,10,10,32,32, + 32,32,95,95,112,97,99,107,97,103,101,95,95,32,105,115, + 32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32, + 116,111,32,98,101,32,100,101,102,105,110,101,100,32,111,114, + 32,99,111,117,108,100,32,98,101,32,115,101,116,32,116,111, + 32,78,111,110,101,10,32,32,32,32,116,111,32,114,101,112, + 114,101,115,101,110,116,32,116,104,97,116,32,105,116,115,32, + 112,114,111,112,101,114,32,118,97,108,117,101,32,105,115,32, + 117,110,107,110,111,119,110,46,10,10,32,32,32,32,114,146, + 0,0,0,114,106,0,0,0,78,122,32,95,95,112,97,99, + 107,97,103,101,95,95,32,33,61,32,95,95,115,112,101,99, + 95,95,46,112,97,114,101,110,116,32,40,122,4,32,33,61, + 32,250,1,41,233,3,0,0,0,41,1,90,10,115,116,97, + 99,107,108,101,118,101,108,122,89,99,97,110,39,116,32,114, + 101,115,111,108,118,101,32,112,97,99,107,97,103,101,32,102, + 114,111,109,32,95,95,115,112,101,99,95,95,32,111,114,32, + 95,95,112,97,99,107,97,103,101,95,95,44,32,102,97,108, + 108,105,110,103,32,98,97,99,107,32,111,110,32,95,95,110, + 97,109,101,95,95,32,97,110,100,32,95,95,112,97,116,104, + 95,95,114,1,0,0,0,114,142,0,0,0,114,129,0,0, + 0,114,22,0,0,0,41,6,114,35,0,0,0,114,131,0, + 0,0,114,193,0,0,0,114,194,0,0,0,114,195,0,0, + 0,114,130,0,0,0,41,3,218,7,103,108,111,98,97,108, + 115,114,187,0,0,0,114,96,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,17,95,99,97,108, + 99,95,95,95,112,97,99,107,97,103,101,95,95,46,4,0, + 0,115,44,0,0,0,10,7,10,1,8,1,18,1,6,1, + 2,1,4,255,4,1,6,255,4,2,6,254,4,3,8,1, + 6,1,6,2,4,2,6,254,8,3,8,1,14,1,4,1, + 255,128,114,221,0,0,0,114,10,0,0,0,99,5,0,0, + 0,0,0,0,0,0,0,0,0,9,0,0,0,5,0,0, + 0,67,0,0,0,115,174,0,0,0,124,4,100,1,107,2, + 114,18,116,0,124,0,131,1,125,5,110,36,124,1,100,2, + 117,1,114,30,124,1,110,2,105,0,125,6,116,1,124,6, + 131,1,125,7,116,0,124,0,124,7,124,4,131,3,125,5, + 124,3,115,148,124,4,100,1,107,2,114,84,116,0,124,0, + 160,2,100,3,161,1,100,1,25,0,131,1,83,0,124,0, + 115,92,124,5,83,0,116,3,124,0,131,1,116,3,124,0, + 160,2,100,3,161,1,100,1,25,0,131,1,24,0,125,8, + 116,4,106,5,124,5,106,6,100,2,116,3,124,5,106,6, + 131,1,124,8,24,0,133,2,25,0,25,0,83,0,116,7, + 124,5,100,4,131,2,114,170,116,8,124,5,124,3,116,0, + 131,3,83,0,124,5,83,0,41,5,97,215,1,0,0,73, + 109,112,111,114,116,32,97,32,109,111,100,117,108,101,46,10, + 10,32,32,32,32,84,104,101,32,39,103,108,111,98,97,108, + 115,39,32,97,114,103,117,109,101,110,116,32,105,115,32,117, + 115,101,100,32,116,111,32,105,110,102,101,114,32,119,104,101, + 114,101,32,116,104,101,32,105,109,112,111,114,116,32,105,115, + 32,111,99,99,117,114,114,105,110,103,32,102,114,111,109,10, + 32,32,32,32,116,111,32,104,97,110,100,108,101,32,114,101, + 108,97,116,105,118,101,32,105,109,112,111,114,116,115,46,32, + 84,104,101,32,39,108,111,99,97,108,115,39,32,97,114,103, + 117,109,101,110,116,32,105,115,32,105,103,110,111,114,101,100, + 46,32,84,104,101,10,32,32,32,32,39,102,114,111,109,108, + 105,115,116,39,32,97,114,103,117,109,101,110,116,32,115,112, + 101,99,105,102,105,101,115,32,119,104,97,116,32,115,104,111, + 117,108,100,32,101,120,105,115,116,32,97,115,32,97,116,116, + 114,105,98,117,116,101,115,32,111,110,32,116,104,101,32,109, + 111,100,117,108,101,10,32,32,32,32,98,101,105,110,103,32, + 105,109,112,111,114,116,101,100,32,40,101,46,103,46,32,96, + 96,102,114,111,109,32,109,111,100,117,108,101,32,105,109,112, + 111,114,116,32,60,102,114,111,109,108,105,115,116,62,96,96, + 41,46,32,32,84,104,101,32,39,108,101,118,101,108,39,10, + 32,32,32,32,97,114,103,117,109,101,110,116,32,114,101,112, + 114,101,115,101,110,116,115,32,116,104,101,32,112,97,99,107, + 97,103,101,32,108,111,99,97,116,105,111,110,32,116,111,32, + 105,109,112,111,114,116,32,102,114,111,109,32,105,110,32,97, + 32,114,101,108,97,116,105,118,101,10,32,32,32,32,105,109, + 112,111,114,116,32,40,101,46,103,46,32,96,96,102,114,111, + 109,32,46,46,112,107,103,32,105,109,112,111,114,116,32,109, + 111,100,96,96,32,119,111,117,108,100,32,104,97,118,101,32, + 97,32,39,108,101,118,101,108,39,32,111,102,32,50,41,46, + 10,10,32,32,32,32,114,22,0,0,0,78,114,129,0,0, + 0,114,142,0,0,0,41,9,114,210,0,0,0,114,221,0, + 0,0,218,9,112,97,114,116,105,116,105,111,110,114,186,0, + 0,0,114,15,0,0,0,114,93,0,0,0,114,1,0,0, + 0,114,4,0,0,0,114,215,0,0,0,41,9,114,17,0, + 0,0,114,220,0,0,0,218,6,108,111,99,97,108,115,114, + 216,0,0,0,114,188,0,0,0,114,97,0,0,0,90,8, + 103,108,111,98,97,108,115,95,114,187,0,0,0,90,7,99, + 117,116,95,111,102,102,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,10,95,95,105,109,112,111,114,116,95, + 95,73,4,0,0,115,32,0,0,0,8,11,10,1,16,2, + 8,1,12,1,4,1,8,3,18,1,4,1,4,1,26,4, + 30,3,10,1,12,1,4,2,255,128,114,224,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,67,0,0,0,115,38,0,0,0,116,0,160, + 1,124,0,161,1,125,1,124,1,100,0,117,0,114,30,116, + 2,100,1,124,0,23,0,131,1,130,1,116,3,124,1,131, + 1,83,0,41,2,78,122,25,110,111,32,98,117,105,108,116, + 45,105,110,32,109,111,100,117,108,101,32,110,97,109,101,100, + 32,41,4,114,161,0,0,0,114,168,0,0,0,114,80,0, + 0,0,114,160,0,0,0,41,2,114,17,0,0,0,114,96, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,18,95,98,117,105,108,116,105,110,95,102,114,111, + 109,95,110,97,109,101,110,4,0,0,115,10,0,0,0,10, + 1,8,1,12,1,8,1,255,128,114,225,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,5, + 0,0,0,67,0,0,0,115,164,0,0,0,124,1,97,0, + 124,0,97,1,116,2,116,1,131,1,125,2,116,1,106,3, + 160,4,161,0,68,0,93,70,92,2,125,3,125,4,116,5, + 124,4,124,2,131,2,114,26,124,3,116,1,106,6,118,0, + 114,60,116,7,125,5,110,16,116,0,160,8,124,3,161,1, + 114,26,116,9,125,5,110,0,116,10,124,4,124,5,131,2, 125,6,116,11,124,6,124,4,131,2,1,0,113,26,116,1, 106,3,116,12,25,0,125,7,100,1,68,0,93,46,125,8, - 124,8,116,1,106,3,118,1,114,138,116,13,124,8,131,1, + 124,8,116,1,106,3,118,1,114,136,116,13,124,8,131,1, 125,9,110,10,116,1,106,3,124,8,25,0,125,9,116,14, - 124,7,124,8,124,9,131,3,1,0,113,114,100,2,83,0, + 124,7,124,8,124,9,131,3,1,0,113,112,100,2,83,0, 41,3,122,250,83,101,116,117,112,32,105,109,112,111,114,116, 108,105,98,32,98,121,32,105,109,112,111,114,116,105,110,103, 32,110,101,101,100,101,100,32,98,117,105,108,116,45,105,110, @@ -1760,64 +1760,64 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 110,95,110,97,109,101,90,14,98,117,105,108,116,105,110,95, 109,111,100,117,108,101,114,10,0,0,0,114,10,0,0,0, 114,11,0,0,0,218,6,95,115,101,116,117,112,117,4,0, - 0,115,40,0,0,0,4,9,4,1,8,3,18,1,10,1, - 10,1,6,1,10,1,6,1,2,2,10,1,12,1,10,3, - 8,1,10,1,10,1,10,2,14,1,4,128,255,128,114,229, - 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, - 0,116,0,124,0,124,1,131,2,1,0,116,1,106,2,160, - 3,116,4,161,1,1,0,116,1,106,2,160,3,116,5,161, - 1,1,0,100,1,83,0,41,2,122,48,73,110,115,116,97, - 108,108,32,105,109,112,111,114,116,101,114,115,32,102,111,114, - 32,98,117,105,108,116,105,110,32,97,110,100,32,102,114,111, - 122,101,110,32,109,111,100,117,108,101,115,78,41,6,114,229, - 0,0,0,114,15,0,0,0,114,192,0,0,0,114,120,0, - 0,0,114,161,0,0,0,114,175,0,0,0,41,2,114,227, - 0,0,0,114,228,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,8,95,105,110,115,116,97,108, - 108,152,4,0,0,115,10,0,0,0,10,2,12,2,12,1, - 4,128,255,128,114,230,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,4,0,0,0,67,0, - 0,0,115,32,0,0,0,100,1,100,2,108,0,125,0,124, - 0,97,1,124,0,160,2,116,3,106,4,116,5,25,0,161, - 1,1,0,100,2,83,0,41,3,122,57,73,110,115,116,97, - 108,108,32,105,109,112,111,114,116,101,114,115,32,116,104,97, - 116,32,114,101,113,117,105,114,101,32,101,120,116,101,114,110, - 97,108,32,102,105,108,101,115,121,115,116,101,109,32,97,99, - 99,101,115,115,114,22,0,0,0,78,41,6,218,26,95,102, - 114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,95, - 101,120,116,101,114,110,97,108,114,127,0,0,0,114,230,0, - 0,0,114,15,0,0,0,114,93,0,0,0,114,1,0,0, - 0,41,1,114,231,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,27,95,105,110,115,116,97,108, - 108,95,101,120,116,101,114,110,97,108,95,105,109,112,111,114, - 116,101,114,115,160,4,0,0,115,10,0,0,0,8,3,4, - 1,16,1,4,128,255,128,114,232,0,0,0,41,2,78,78, - 41,1,78,41,2,78,114,22,0,0,0,41,4,78,78,114, - 10,0,0,0,114,22,0,0,0,41,50,114,3,0,0,0, - 114,127,0,0,0,114,12,0,0,0,114,18,0,0,0,114, - 60,0,0,0,114,34,0,0,0,114,44,0,0,0,114,19, - 0,0,0,114,20,0,0,0,114,50,0,0,0,114,51,0, - 0,0,114,54,0,0,0,114,66,0,0,0,114,68,0,0, - 0,114,77,0,0,0,114,87,0,0,0,114,91,0,0,0, - 114,98,0,0,0,114,112,0,0,0,114,113,0,0,0,114, - 92,0,0,0,114,143,0,0,0,114,149,0,0,0,114,153, - 0,0,0,114,108,0,0,0,114,94,0,0,0,114,159,0, - 0,0,114,160,0,0,0,114,95,0,0,0,114,161,0,0, - 0,114,175,0,0,0,114,180,0,0,0,114,189,0,0,0, - 114,191,0,0,0,114,196,0,0,0,114,202,0,0,0,90, - 15,95,69,82,82,95,77,83,71,95,80,82,69,70,73,88, - 114,204,0,0,0,114,207,0,0,0,218,6,111,98,106,101, - 99,116,114,208,0,0,0,114,209,0,0,0,114,210,0,0, - 0,114,215,0,0,0,114,221,0,0,0,114,224,0,0,0, - 114,225,0,0,0,114,229,0,0,0,114,230,0,0,0,114, - 232,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,8,60,109,111,100,117,108, - 101,62,1,0,0,0,115,100,0,0,0,4,0,4,24,8, - 2,8,8,4,8,4,2,16,3,14,4,14,77,14,21,8, - 16,8,37,8,17,14,11,8,8,8,11,8,12,8,16,14, - 36,16,101,10,26,14,45,8,72,8,17,8,17,8,30,8, - 37,8,42,14,15,14,75,14,79,8,13,8,9,10,9,8, - 47,4,16,8,1,8,2,6,32,8,3,10,16,14,15,8, - 37,10,27,8,37,8,7,8,35,8,8,4,128,255,128, + 0,115,38,0,0,0,4,9,4,1,8,3,18,1,10,1, + 10,1,6,1,10,1,6,1,10,3,12,1,10,3,8,1, + 10,1,10,1,10,2,14,1,4,128,255,128,114,229,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,116, + 0,124,0,124,1,131,2,1,0,116,1,106,2,160,3,116, + 4,161,1,1,0,116,1,106,2,160,3,116,5,161,1,1, + 0,100,1,83,0,41,2,122,48,73,110,115,116,97,108,108, + 32,105,109,112,111,114,116,101,114,115,32,102,111,114,32,98, + 117,105,108,116,105,110,32,97,110,100,32,102,114,111,122,101, + 110,32,109,111,100,117,108,101,115,78,41,6,114,229,0,0, + 0,114,15,0,0,0,114,192,0,0,0,114,120,0,0,0, + 114,161,0,0,0,114,175,0,0,0,41,2,114,227,0,0, + 0,114,228,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,8,95,105,110,115,116,97,108,108,152, + 4,0,0,115,10,0,0,0,10,2,12,2,12,1,4,128, + 255,128,114,230,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, + 115,32,0,0,0,100,1,100,2,108,0,125,0,124,0,97, + 1,124,0,160,2,116,3,106,4,116,5,25,0,161,1,1, + 0,100,2,83,0,41,3,122,57,73,110,115,116,97,108,108, + 32,105,109,112,111,114,116,101,114,115,32,116,104,97,116,32, + 114,101,113,117,105,114,101,32,101,120,116,101,114,110,97,108, + 32,102,105,108,101,115,121,115,116,101,109,32,97,99,99,101, + 115,115,114,22,0,0,0,78,41,6,218,26,95,102,114,111, + 122,101,110,95,105,109,112,111,114,116,108,105,98,95,101,120, + 116,101,114,110,97,108,114,127,0,0,0,114,230,0,0,0, + 114,15,0,0,0,114,93,0,0,0,114,1,0,0,0,41, + 1,114,231,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,27,95,105,110,115,116,97,108,108,95, + 101,120,116,101,114,110,97,108,95,105,109,112,111,114,116,101, + 114,115,160,4,0,0,115,10,0,0,0,8,3,4,1,16, + 1,4,128,255,128,114,232,0,0,0,41,2,78,78,41,1, + 78,41,2,78,114,22,0,0,0,41,4,78,78,114,10,0, + 0,0,114,22,0,0,0,41,50,114,3,0,0,0,114,127, + 0,0,0,114,12,0,0,0,114,18,0,0,0,114,60,0, + 0,0,114,34,0,0,0,114,44,0,0,0,114,19,0,0, + 0,114,20,0,0,0,114,50,0,0,0,114,51,0,0,0, + 114,54,0,0,0,114,66,0,0,0,114,68,0,0,0,114, + 77,0,0,0,114,87,0,0,0,114,91,0,0,0,114,98, + 0,0,0,114,112,0,0,0,114,113,0,0,0,114,92,0, + 0,0,114,143,0,0,0,114,149,0,0,0,114,153,0,0, + 0,114,108,0,0,0,114,94,0,0,0,114,159,0,0,0, + 114,160,0,0,0,114,95,0,0,0,114,161,0,0,0,114, + 175,0,0,0,114,180,0,0,0,114,189,0,0,0,114,191, + 0,0,0,114,196,0,0,0,114,202,0,0,0,90,15,95, + 69,82,82,95,77,83,71,95,80,82,69,70,73,88,114,204, + 0,0,0,114,207,0,0,0,218,6,111,98,106,101,99,116, + 114,208,0,0,0,114,209,0,0,0,114,210,0,0,0,114, + 215,0,0,0,114,221,0,0,0,114,224,0,0,0,114,225, + 0,0,0,114,229,0,0,0,114,230,0,0,0,114,232,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,8,60,109,111,100,117,108,101,62, + 1,0,0,0,115,100,0,0,0,4,0,4,24,8,2,8, + 8,4,8,4,2,16,3,14,4,14,77,14,21,8,16,8, + 37,8,17,14,11,8,8,8,11,8,12,8,16,14,36,16, + 101,10,26,14,45,8,72,8,17,8,17,8,30,8,37,8, + 42,14,15,14,75,14,79,8,13,8,9,10,9,8,47,4, + 16,8,1,8,2,6,32,8,3,10,16,14,15,8,37,10, + 27,8,37,8,7,8,35,8,8,4,128,255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index f9264204504b50..f12e2ef3bfd01c 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -61,780 +61,780 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 46,10,10,41,1,218,3,119,105,110,41,2,90,6,99,121, 103,119,105,110,90,6,100,97,114,119,105,110,99,0,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,3,0,0,0,115,60,0,0,0,116,0,106,1,160,2, - 116,3,161,1,114,48,116,0,106,1,160,2,116,4,161,1, + 0,3,0,0,0,115,62,0,0,0,116,0,106,1,160,2, + 116,3,161,1,114,50,116,0,106,1,160,2,116,4,161,1, 114,30,100,1,137,0,110,4,100,2,137,0,135,0,102,1, - 100,3,100,4,132,8,125,0,110,8,100,5,100,4,132,0, - 125,0,124,0,83,0,41,6,78,90,12,80,89,84,72,79, - 78,67,65,83,69,79,75,115,12,0,0,0,80,89,84,72, - 79,78,67,65,83,69,79,75,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,19,0,0, - 0,115,20,0,0,0,116,0,106,1,106,2,12,0,111,18, - 136,0,116,3,106,4,118,0,83,0,41,1,122,94,84,114, - 117,101,32,105,102,32,102,105,108,101,110,97,109,101,115,32, - 109,117,115,116,32,98,101,32,99,104,101,99,107,101,100,32, - 99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101, - 108,121,32,97,110,100,32,105,103,110,111,114,101,32,101,110, - 118,105,114,111,110,109,101,110,116,32,102,108,97,103,115,32, - 97,114,101,32,110,111,116,32,115,101,116,46,41,5,218,3, - 115,121,115,218,5,102,108,97,103,115,218,18,105,103,110,111, - 114,101,95,101,110,118,105,114,111,110,109,101,110,116,218,3, - 95,111,115,90,7,101,110,118,105,114,111,110,169,0,169,1, - 218,3,107,101,121,114,5,0,0,0,250,38,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,95,101,120,116,101,114,110,97, - 108,62,218,11,95,114,101,108,97,120,95,99,97,115,101,36, - 0,0,0,115,4,0,0,0,20,2,255,128,122,37,95,109, - 97,107,101,95,114,101,108,97,120,95,99,97,115,101,46,60, - 108,111,99,97,108,115,62,46,95,114,101,108,97,120,95,99, - 97,115,101,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,83,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,122,53,84,114,117,101,32,105,102, - 32,102,105,108,101,110,97,109,101,115,32,109,117,115,116,32, - 98,101,32,99,104,101,99,107,101,100,32,99,97,115,101,45, - 105,110,115,101,110,115,105,116,105,118,101,108,121,46,70,114, - 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,9,0,0,0,40,0,0, - 0,115,4,0,0,0,4,2,255,128,41,5,114,1,0,0, - 0,218,8,112,108,97,116,102,111,114,109,218,10,115,116,97, - 114,116,115,119,105,116,104,218,27,95,67,65,83,69,95,73, - 78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70, - 79,82,77,83,218,35,95,67,65,83,69,95,73,78,83,69, - 78,83,73,84,73,86,69,95,80,76,65,84,70,79,82,77, - 83,95,83,84,82,95,75,69,89,41,1,114,9,0,0,0, - 114,5,0,0,0,114,6,0,0,0,114,8,0,0,0,218, - 16,95,109,97,107,101,95,114,101,108,97,120,95,99,97,115, - 101,29,0,0,0,115,16,0,0,0,12,1,12,1,6,1, - 4,2,14,2,8,4,4,3,255,128,114,14,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 4,0,0,0,67,0,0,0,115,20,0,0,0,116,0,124, - 0,131,1,100,1,64,0,160,1,100,2,100,3,161,2,83, - 0,41,4,122,42,67,111,110,118,101,114,116,32,97,32,51, - 50,45,98,105,116,32,105,110,116,101,103,101,114,32,116,111, - 32,108,105,116,116,108,101,45,101,110,100,105,97,110,46,236, - 3,0,0,0,255,127,255,127,3,0,233,4,0,0,0,218, - 6,108,105,116,116,108,101,41,2,218,3,105,110,116,218,8, - 116,111,95,98,121,116,101,115,41,1,218,1,120,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,12,95,112, - 97,99,107,95,117,105,110,116,51,50,46,0,0,0,115,4, - 0,0,0,20,2,255,128,114,21,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,67,0,0,0,115,28,0,0,0,116,0,124,0,131,1, - 100,1,107,2,115,16,74,0,130,1,116,1,160,2,124,0, - 100,2,161,2,83,0,41,3,122,47,67,111,110,118,101,114, - 116,32,52,32,98,121,116,101,115,32,105,110,32,108,105,116, - 116,108,101,45,101,110,100,105,97,110,32,116,111,32,97,110, - 32,105,110,116,101,103,101,114,46,114,16,0,0,0,114,17, - 0,0,0,169,3,218,3,108,101,110,114,18,0,0,0,218, - 10,102,114,111,109,95,98,121,116,101,115,169,1,218,4,100, - 97,116,97,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,14,95,117,110,112,97,99,107,95,117,105,110,116, - 51,50,51,0,0,0,115,6,0,0,0,16,2,12,1,255, - 128,114,27,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, - 28,0,0,0,116,0,124,0,131,1,100,1,107,2,115,16, - 74,0,130,1,116,1,160,2,124,0,100,2,161,2,83,0, - 41,3,122,47,67,111,110,118,101,114,116,32,50,32,98,121, - 116,101,115,32,105,110,32,108,105,116,116,108,101,45,101,110, - 100,105,97,110,32,116,111,32,97,110,32,105,110,116,101,103, - 101,114,46,233,2,0,0,0,114,17,0,0,0,114,22,0, - 0,0,114,25,0,0,0,114,5,0,0,0,114,5,0,0, + 100,3,100,4,132,8,125,0,124,0,83,0,100,5,100,4, + 132,0,125,0,124,0,83,0,41,6,78,90,12,80,89,84, + 72,79,78,67,65,83,69,79,75,115,12,0,0,0,80,89, + 84,72,79,78,67,65,83,69,79,75,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,19, + 0,0,0,115,20,0,0,0,116,0,106,1,106,2,12,0, + 111,18,136,0,116,3,106,4,118,0,83,0,41,1,122,94, + 84,114,117,101,32,105,102,32,102,105,108,101,110,97,109,101, + 115,32,109,117,115,116,32,98,101,32,99,104,101,99,107,101, + 100,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105, + 118,101,108,121,32,97,110,100,32,105,103,110,111,114,101,32, + 101,110,118,105,114,111,110,109,101,110,116,32,102,108,97,103, + 115,32,97,114,101,32,110,111,116,32,115,101,116,46,41,5, + 218,3,115,121,115,218,5,102,108,97,103,115,218,18,105,103, + 110,111,114,101,95,101,110,118,105,114,111,110,109,101,110,116, + 218,3,95,111,115,90,7,101,110,118,105,114,111,110,169,0, + 169,1,218,3,107,101,121,114,5,0,0,0,250,38,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,95,101,120,116,101,114, + 110,97,108,62,218,11,95,114,101,108,97,120,95,99,97,115, + 101,36,0,0,0,115,4,0,0,0,20,2,255,128,122,37, + 95,109,97,107,101,95,114,101,108,97,120,95,99,97,115,101, + 46,60,108,111,99,97,108,115,62,46,95,114,101,108,97,120, + 95,99,97,115,101,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,83,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,122,53,84,114,117,101,32, + 105,102,32,102,105,108,101,110,97,109,101,115,32,109,117,115, + 116,32,98,101,32,99,104,101,99,107,101,100,32,99,97,115, + 101,45,105,110,115,101,110,115,105,116,105,118,101,108,121,46, + 70,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,9,0,0,0,40, + 0,0,0,115,4,0,0,0,4,2,255,128,41,5,114,1, + 0,0,0,218,8,112,108,97,116,102,111,114,109,218,10,115, + 116,97,114,116,115,119,105,116,104,218,27,95,67,65,83,69, + 95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,65, + 84,70,79,82,77,83,218,35,95,67,65,83,69,95,73,78, + 83,69,78,83,73,84,73,86,69,95,80,76,65,84,70,79, + 82,77,83,95,83,84,82,95,75,69,89,41,1,114,9,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,8,0,0, + 0,218,16,95,109,97,107,101,95,114,101,108,97,120,95,99, + 97,115,101,29,0,0,0,115,18,0,0,0,12,1,12,1, + 6,1,4,2,12,2,4,7,8,253,4,3,255,128,114,14, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,4,0,0,0,67,0,0,0,115,20,0,0, + 0,116,0,124,0,131,1,100,1,64,0,160,1,100,2,100, + 3,161,2,83,0,41,4,122,42,67,111,110,118,101,114,116, + 32,97,32,51,50,45,98,105,116,32,105,110,116,101,103,101, + 114,32,116,111,32,108,105,116,116,108,101,45,101,110,100,105, + 97,110,46,236,3,0,0,0,255,127,255,127,3,0,233,4, + 0,0,0,218,6,108,105,116,116,108,101,41,2,218,3,105, + 110,116,218,8,116,111,95,98,121,116,101,115,41,1,218,1, + 120,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,12,95,112,97,99,107,95,117,105,110,116,51,50,46,0, + 0,0,115,4,0,0,0,20,2,255,128,114,21,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,4,0,0,0,67,0,0,0,115,28,0,0,0,116,0, + 124,0,131,1,100,1,107,2,115,16,74,0,130,1,116,1, + 160,2,124,0,100,2,161,2,83,0,41,3,122,47,67,111, + 110,118,101,114,116,32,52,32,98,121,116,101,115,32,105,110, + 32,108,105,116,116,108,101,45,101,110,100,105,97,110,32,116, + 111,32,97,110,32,105,110,116,101,103,101,114,46,114,16,0, + 0,0,114,17,0,0,0,169,3,218,3,108,101,110,114,18, + 0,0,0,218,10,102,114,111,109,95,98,121,116,101,115,169, + 1,218,4,100,97,116,97,114,5,0,0,0,114,5,0,0, 0,114,8,0,0,0,218,14,95,117,110,112,97,99,107,95, - 117,105,110,116,49,54,56,0,0,0,115,6,0,0,0,16, - 2,12,1,255,128,114,29,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,71, - 0,0,0,115,20,0,0,0,116,0,160,1,100,1,100,2, - 132,0,124,0,68,0,131,1,161,1,83,0,41,3,122,31, - 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32, - 111,115,46,112,97,116,104,46,106,111,105,110,40,41,46,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 5,0,0,0,83,0,0,0,115,26,0,0,0,103,0,124, - 0,93,18,125,1,124,1,114,4,124,1,160,0,116,1,161, - 1,145,2,113,4,83,0,114,5,0,0,0,41,2,218,6, - 114,115,116,114,105,112,218,15,112,97,116,104,95,115,101,112, - 97,114,97,116,111,114,115,41,2,218,2,46,48,218,4,112, - 97,114,116,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,10,60,108,105,115,116,99,111,109,112,62,64,0, - 0,0,115,8,0,0,0,6,0,6,1,14,255,255,128,122, - 30,95,112,97,116,104,95,106,111,105,110,46,60,108,111,99, - 97,108,115,62,46,60,108,105,115,116,99,111,109,112,62,41, - 2,218,8,112,97,116,104,95,115,101,112,218,4,106,111,105, - 110,41,1,218,10,112,97,116,104,95,112,97,114,116,115,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,10, - 95,112,97,116,104,95,106,111,105,110,62,0,0,0,115,8, - 0,0,0,10,2,2,1,8,255,255,128,114,38,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,5,0,0,0,67,0,0,0,115,94,0,0,0,116,0, - 116,1,131,1,100,1,107,2,114,36,124,0,160,2,116,3, - 161,1,92,3,125,1,125,2,125,3,124,1,124,3,102,2, - 83,0,116,4,124,0,131,1,68,0,93,40,125,4,124,4, - 116,1,118,0,114,44,124,0,106,5,124,4,100,1,100,2, - 141,2,92,2,125,1,125,3,124,1,124,3,102,2,2,0, - 1,0,83,0,100,3,124,0,102,2,83,0,41,4,122,32, - 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32, - 111,115,46,112,97,116,104,46,115,112,108,105,116,40,41,46, - 233,1,0,0,0,41,1,90,8,109,97,120,115,112,108,105, - 116,218,0,41,6,114,23,0,0,0,114,31,0,0,0,218, - 10,114,112,97,114,116,105,116,105,111,110,114,35,0,0,0, - 218,8,114,101,118,101,114,115,101,100,218,6,114,115,112,108, - 105,116,41,5,218,4,112,97,116,104,90,5,102,114,111,110, - 116,218,1,95,218,4,116,97,105,108,114,20,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,11, - 95,112,97,116,104,95,115,112,108,105,116,68,0,0,0,115, - 18,0,0,0,12,2,16,1,8,1,12,1,8,1,18,1, - 12,1,8,1,255,128,114,47,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,10,0,0,0,116,0,160,1,124,0,161, - 1,83,0,41,1,122,126,83,116,97,116,32,116,104,101,32, - 112,97,116,104,46,10,10,32,32,32,32,77,97,100,101,32, - 97,32,115,101,112,97,114,97,116,101,32,102,117,110,99,116, - 105,111,110,32,116,111,32,109,97,107,101,32,105,116,32,101, - 97,115,105,101,114,32,116,111,32,111,118,101,114,114,105,100, - 101,32,105,110,32,101,120,112,101,114,105,109,101,110,116,115, - 10,32,32,32,32,40,101,46,103,46,32,99,97,99,104,101, - 32,115,116,97,116,32,114,101,115,117,108,116,115,41,46,10, - 10,32,32,32,32,41,2,114,4,0,0,0,90,4,115,116, - 97,116,169,1,114,44,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,10,95,112,97,116,104,95, - 115,116,97,116,80,0,0,0,115,4,0,0,0,10,7,255, - 128,114,49,0,0,0,99,2,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,115, - 48,0,0,0,122,12,116,0,124,0,131,1,125,2,87,0, - 110,20,4,0,116,1,121,32,1,0,1,0,1,0,89,0, - 100,1,83,0,48,0,124,2,106,2,100,2,64,0,124,1, - 107,2,83,0,41,3,122,49,84,101,115,116,32,119,104,101, - 116,104,101,114,32,116,104,101,32,112,97,116,104,32,105,115, - 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,109, - 111,100,101,32,116,121,112,101,46,70,105,0,240,0,0,41, - 3,114,49,0,0,0,218,7,79,83,69,114,114,111,114,218, - 7,115,116,95,109,111,100,101,41,3,114,44,0,0,0,218, - 4,109,111,100,101,90,9,115,116,97,116,95,105,110,102,111, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 18,95,112,97,116,104,95,105,115,95,109,111,100,101,95,116, - 121,112,101,90,0,0,0,115,12,0,0,0,2,2,12,1, - 12,1,8,1,14,1,255,128,114,53,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,100, - 1,131,2,83,0,41,2,122,31,82,101,112,108,97,99,101, - 109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,104, - 46,105,115,102,105,108,101,46,105,0,128,0,0,41,1,114, - 53,0,0,0,114,48,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,12,95,112,97,116,104,95, - 105,115,102,105,108,101,99,0,0,0,115,4,0,0,0,10, - 2,255,128,114,54,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,22,0,0,0,124,0,115,12,116,0,160,1,161,0, - 125,0,116,2,124,0,100,1,131,2,83,0,41,2,122,30, - 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32, - 111,115,46,112,97,116,104,46,105,115,100,105,114,46,105,0, - 64,0,0,41,3,114,4,0,0,0,218,6,103,101,116,99, - 119,100,114,53,0,0,0,114,48,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,11,95,112,97, - 116,104,95,105,115,100,105,114,104,0,0,0,115,8,0,0, - 0,4,2,8,1,10,1,255,128,114,56,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,26,0,0,0,124,0,160,0, - 116,1,161,1,112,24,124,0,100,1,100,2,133,2,25,0, - 116,2,118,0,83,0,41,3,122,142,82,101,112,108,97,99, - 101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,116, - 104,46,105,115,97,98,115,46,10,10,32,32,32,32,67,111, - 110,115,105,100,101,114,115,32,97,32,87,105,110,100,111,119, - 115,32,100,114,105,118,101,45,114,101,108,97,116,105,118,101, - 32,112,97,116,104,32,40,110,111,32,100,114,105,118,101,44, - 32,98,117,116,32,115,116,97,114,116,115,32,119,105,116,104, - 32,115,108,97,115,104,41,32,116,111,10,32,32,32,32,115, - 116,105,108,108,32,98,101,32,34,97,98,115,111,108,117,116, - 101,34,46,10,32,32,32,32,114,39,0,0,0,233,3,0, - 0,0,41,3,114,11,0,0,0,114,31,0,0,0,218,20, - 95,112,97,116,104,115,101,112,115,95,119,105,116,104,95,99, - 111,108,111,110,114,48,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, - 105,115,97,98,115,111,0,0,0,115,4,0,0,0,26,6, - 255,128,114,59,0,0,0,233,182,1,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,11,0,0, - 0,67,0,0,0,115,172,0,0,0,100,1,160,0,124,0, - 116,1,124,0,131,1,161,2,125,3,116,2,160,3,124,3, - 116,2,106,4,116,2,106,5,66,0,116,2,106,6,66,0, - 124,2,100,2,64,0,161,3,125,4,122,70,116,7,160,8, - 124,4,100,3,161,2,143,26,125,5,124,5,160,9,124,1, - 161,1,1,0,87,0,100,4,4,0,4,0,131,3,1,0, - 110,16,49,0,115,94,48,0,1,0,1,0,1,0,89,0, - 1,0,116,2,160,10,124,3,124,0,161,2,1,0,87,0, - 110,48,4,0,116,11,121,166,1,0,1,0,1,0,122,14, - 116,2,160,12,124,3,161,1,1,0,87,0,130,0,4,0, - 116,11,121,164,1,0,1,0,1,0,89,0,130,0,48,0, - 48,0,100,4,83,0,41,5,122,162,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,250,5,123,125, - 46,123,125,114,60,0,0,0,90,2,119,98,78,41,13,218, - 6,102,111,114,109,97,116,218,2,105,100,114,4,0,0,0, - 90,4,111,112,101,110,90,6,79,95,69,88,67,76,90,7, - 79,95,67,82,69,65,84,90,8,79,95,87,82,79,78,76, - 89,218,3,95,105,111,218,6,70,105,108,101,73,79,218,5, - 119,114,105,116,101,218,7,114,101,112,108,97,99,101,114,50, - 0,0,0,90,6,117,110,108,105,110,107,41,6,114,44,0, - 0,0,114,26,0,0,0,114,52,0,0,0,90,8,112,97, - 116,104,95,116,109,112,90,2,102,100,218,4,102,105,108,101, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 13,95,119,114,105,116,101,95,97,116,111,109,105,99,120,0, - 0,0,115,32,0,0,0,16,5,6,1,22,1,4,255,2, - 2,14,3,40,1,16,1,12,1,2,1,14,1,12,1,6, - 1,2,1,4,128,255,128,114,69,0,0,0,105,103,13,0, - 0,114,28,0,0,0,114,17,0,0,0,115,2,0,0,0, - 13,10,90,11,95,95,112,121,99,97,99,104,101,95,95,122, - 4,111,112,116,45,122,3,46,112,121,122,4,46,112,121,99, - 78,41,1,218,12,111,112,116,105,109,105,122,97,116,105,111, - 110,99,2,0,0,0,0,0,0,0,1,0,0,0,12,0, - 0,0,5,0,0,0,67,0,0,0,115,88,1,0,0,124, - 1,100,1,117,1,114,52,116,0,160,1,100,2,116,2,161, - 2,1,0,124,2,100,1,117,1,114,40,100,3,125,3,116, - 3,124,3,131,1,130,1,124,1,114,48,100,4,110,2,100, - 5,125,2,116,4,160,5,124,0,161,1,125,0,116,6,124, - 0,131,1,92,2,125,4,125,5,124,5,160,7,100,6,161, - 1,92,3,125,6,125,7,125,8,116,8,106,9,106,10,125, - 9,124,9,100,1,117,0,114,114,116,11,100,7,131,1,130, - 1,100,4,160,12,124,6,114,126,124,6,110,2,124,8,124, - 7,124,9,103,3,161,1,125,10,124,2,100,1,117,0,114, - 172,116,8,106,13,106,14,100,8,107,2,114,164,100,4,125, - 2,110,8,116,8,106,13,106,14,125,2,116,15,124,2,131, - 1,125,2,124,2,100,4,107,3,114,224,124,2,160,16,161, - 0,115,210,116,17,100,9,160,18,124,2,161,1,131,1,130, - 1,100,10,160,18,124,10,116,19,124,2,161,3,125,10,124, - 10,116,20,100,8,25,0,23,0,125,11,116,8,106,21,100, - 1,117,1,144,1,114,76,116,22,124,4,131,1,144,1,115, - 16,116,23,116,4,160,24,161,0,124,4,131,2,125,4,124, - 4,100,5,25,0,100,11,107,2,144,1,114,56,124,4,100, - 8,25,0,116,25,118,1,144,1,114,56,124,4,100,12,100, - 1,133,2,25,0,125,4,116,23,116,8,106,21,124,4,160, - 26,116,25,161,1,124,11,131,3,83,0,116,23,124,4,116, - 27,124,11,131,3,83,0,41,13,97,254,2,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,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,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,10,10,32,32,32,32,84,104,101,32, - 39,111,112,116,105,109,105,122,97,116,105,111,110,39,32,112, - 97,114,97,109,101,116,101,114,32,99,111,110,116,114,111,108, - 115,32,116,104,101,32,112,114,101,115,117,109,101,100,32,111, - 112,116,105,109,105,122,97,116,105,111,110,32,108,101,118,101, - 108,32,111,102,10,32,32,32,32,116,104,101,32,98,121,116, - 101,99,111,100,101,32,102,105,108,101,46,32,73,102,32,39, - 111,112,116,105,109,105,122,97,116,105,111,110,39,32,105,115, - 32,110,111,116,32,78,111,110,101,44,32,116,104,101,32,115, - 116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,97, - 116,105,111,110,10,32,32,32,32,111,102,32,116,104,101,32, - 97,114,103,117,109,101,110,116,32,105,115,32,116,97,107,101, - 110,32,97,110,100,32,118,101,114,105,102,105,101,100,32,116, - 111,32,98,101,32,97,108,112,104,97,110,117,109,101,114,105, - 99,32,40,101,108,115,101,32,86,97,108,117,101,69,114,114, - 111,114,10,32,32,32,32,105,115,32,114,97,105,115,101,100, - 41,46,10,10,32,32,32,32,84,104,101,32,100,101,98,117, - 103,95,111,118,101,114,114,105,100,101,32,112,97,114,97,109, - 101,116,101,114,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,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,10,32,32,32,32,97,32,84,114,117,101,32,118,97, - 108,117,101,32,105,115,32,116,104,101,32,115,97,109,101,32, - 97,115,32,115,101,116,116,105,110,103,32,39,111,112,116,105, - 109,105,122,97,116,105,111,110,39,32,116,111,32,116,104,101, - 32,101,109,112,116,121,32,115,116,114,105,110,103,10,32,32, - 32,32,119,104,105,108,101,32,97,32,70,97,108,115,101,32, - 118,97,108,117,101,32,105,115,32,101,113,117,105,118,97,108, - 101,110,116,32,116,111,32,115,101,116,116,105,110,103,32,39, - 111,112,116,105,109,105,122,97,116,105,111,110,39,32,116,111, - 32,39,49,39,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,122,70,116, - 104,101,32,100,101,98,117,103,95,111,118,101,114,114,105,100, - 101,32,112,97,114,97,109,101,116,101,114,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,59,32,117,115,101,32,39, - 111,112,116,105,109,105,122,97,116,105,111,110,39,32,105,110, - 115,116,101,97,100,122,50,100,101,98,117,103,95,111,118,101, - 114,114,105,100,101,32,111,114,32,111,112,116,105,109,105,122, - 97,116,105,111,110,32,109,117,115,116,32,98,101,32,115,101, - 116,32,116,111,32,78,111,110,101,114,40,0,0,0,114,39, - 0,0,0,218,1,46,250,36,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,233,0,0,0, - 0,122,24,123,33,114,125,32,105,115,32,110,111,116,32,97, - 108,112,104,97,110,117,109,101,114,105,99,122,7,123,125,46, - 123,125,123,125,250,1,58,114,28,0,0,0,41,28,218,9, - 95,119,97,114,110,105,110,103,115,218,4,119,97,114,110,218, - 18,68,101,112,114,101,99,97,116,105,111,110,87,97,114,110, - 105,110,103,218,9,84,121,112,101,69,114,114,111,114,114,4, - 0,0,0,218,6,102,115,112,97,116,104,114,47,0,0,0, - 114,41,0,0,0,114,1,0,0,0,218,14,105,109,112,108, - 101,109,101,110,116,97,116,105,111,110,218,9,99,97,99,104, - 101,95,116,97,103,218,19,78,111,116,73,109,112,108,101,109, - 101,110,116,101,100,69,114,114,111,114,114,36,0,0,0,114, - 2,0,0,0,218,8,111,112,116,105,109,105,122,101,218,3, - 115,116,114,218,7,105,115,97,108,110,117,109,218,10,86,97, - 108,117,101,69,114,114,111,114,114,62,0,0,0,218,4,95, - 79,80,84,218,17,66,89,84,69,67,79,68,69,95,83,85, - 70,70,73,88,69,83,218,14,112,121,99,97,99,104,101,95, - 112,114,101,102,105,120,114,59,0,0,0,114,38,0,0,0, - 114,55,0,0,0,114,31,0,0,0,218,6,108,115,116,114, - 105,112,218,8,95,80,89,67,65,67,72,69,41,12,114,44, - 0,0,0,90,14,100,101,98,117,103,95,111,118,101,114,114, - 105,100,101,114,70,0,0,0,218,7,109,101,115,115,97,103, - 101,218,4,104,101,97,100,114,46,0,0,0,90,4,98,97, - 115,101,218,3,115,101,112,218,4,114,101,115,116,90,3,116, - 97,103,90,15,97,108,109,111,115,116,95,102,105,108,101,110, - 97,109,101,218,8,102,105,108,101,110,97,109,101,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,17,99,97, - 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,47, - 1,0,0,115,74,0,0,0,8,18,6,1,2,1,4,255, - 8,2,4,1,8,1,12,1,10,1,12,1,16,1,8,1, - 8,1,8,1,24,1,8,1,12,1,6,1,8,2,8,1, - 8,1,8,1,14,1,14,1,12,1,12,1,10,9,14,1, - 28,5,12,1,2,4,4,1,8,1,2,1,4,253,12,5, - 255,128,114,97,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0, - 115,46,1,0,0,116,0,106,1,106,2,100,1,117,0,114, - 20,116,3,100,2,131,1,130,1,116,4,160,5,124,0,161, - 1,125,0,116,6,124,0,131,1,92,2,125,1,125,2,100, - 3,125,3,116,0,106,7,100,1,117,1,114,102,116,0,106, - 7,160,8,116,9,161,1,125,4,124,1,160,10,124,4,116, - 11,23,0,161,1,114,102,124,1,116,12,124,4,131,1,100, - 1,133,2,25,0,125,1,100,4,125,3,124,3,115,144,116, - 6,124,1,131,1,92,2,125,1,125,5,124,5,116,13,107, - 3,114,144,116,14,116,13,155,0,100,5,124,0,155,2,157, - 3,131,1,130,1,124,2,160,15,100,6,161,1,125,6,124, - 6,100,7,118,1,114,178,116,14,100,8,124,2,155,2,157, - 2,131,1,130,1,110,92,124,6,100,9,107,2,144,1,114, - 14,124,2,160,16,100,6,100,10,161,2,100,11,25,0,125, - 7,124,7,160,10,116,17,161,1,115,228,116,14,100,12,116, - 17,155,2,157,2,131,1,130,1,124,7,116,12,116,17,131, - 1,100,1,133,2,25,0,125,8,124,8,160,18,161,0,144, - 1,115,14,116,14,100,13,124,7,155,2,100,14,157,3,131, - 1,130,1,124,2,160,19,100,6,161,1,100,15,25,0,125, - 9,116,20,124,1,124,9,116,21,100,15,25,0,23,0,131, - 2,83,0,41,16,97,110,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,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,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,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,47,52,56,56,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,114,72,0,0,0,70,84, - 122,31,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,114,71,0,0,0,62,2,0,0,0,114,28,0,0,0, - 114,57,0,0,0,122,29,101,120,112,101,99,116,101,100,32, - 111,110,108,121,32,50,32,111,114,32,51,32,100,111,116,115, - 32,105,110,32,114,57,0,0,0,114,28,0,0,0,233,254, - 255,255,255,122,53,111,112,116,105,109,105,122,97,116,105,111, - 110,32,112,111,114,116,105,111,110,32,111,102,32,102,105,108, - 101,110,97,109,101,32,100,111,101,115,32,110,111,116,32,115, - 116,97,114,116,32,119,105,116,104,32,122,19,111,112,116,105, - 109,105,122,97,116,105,111,110,32,108,101,118,101,108,32,122, - 29,32,105,115,32,110,111,116,32,97,110,32,97,108,112,104, - 97,110,117,109,101,114,105,99,32,118,97,108,117,101,114,73, - 0,0,0,41,22,114,1,0,0,0,114,80,0,0,0,114, - 81,0,0,0,114,82,0,0,0,114,4,0,0,0,114,79, - 0,0,0,114,47,0,0,0,114,89,0,0,0,114,30,0, - 0,0,114,31,0,0,0,114,11,0,0,0,114,35,0,0, - 0,114,23,0,0,0,114,91,0,0,0,114,86,0,0,0, - 218,5,99,111,117,110,116,114,43,0,0,0,114,87,0,0, - 0,114,85,0,0,0,218,9,112,97,114,116,105,116,105,111, - 110,114,38,0,0,0,218,15,83,79,85,82,67,69,95,83, - 85,70,70,73,88,69,83,41,10,114,44,0,0,0,114,93, - 0,0,0,90,16,112,121,99,97,99,104,101,95,102,105,108, - 101,110,97,109,101,90,23,102,111,117,110,100,95,105,110,95, - 112,121,99,97,99,104,101,95,112,114,101,102,105,120,90,13, - 115,116,114,105,112,112,101,100,95,112,97,116,104,90,7,112, - 121,99,97,99,104,101,90,9,100,111,116,95,99,111,117,110, - 116,114,70,0,0,0,90,9,111,112,116,95,108,101,118,101, - 108,90,13,98,97,115,101,95,102,105,108,101,110,97,109,101, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 17,115,111,117,114,99,101,95,102,114,111,109,95,99,97,99, - 104,101,118,1,0,0,115,62,0,0,0,12,9,8,1,10, - 1,12,1,4,1,10,1,12,1,14,1,16,1,4,1,4, - 1,12,1,8,1,8,1,2,1,8,255,10,2,8,1,16, - 1,10,1,16,1,10,1,4,1,2,1,8,255,16,2,10, - 1,16,1,14,2,18,1,255,128,114,102,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,9, - 0,0,0,67,0,0,0,115,124,0,0,0,116,0,124,0, - 131,1,100,1,107,2,114,16,100,2,83,0,124,0,160,1, - 100,3,161,1,92,3,125,1,125,2,125,3,124,1,114,56, - 124,3,160,2,161,0,100,4,100,5,133,2,25,0,100,6, - 107,3,114,60,124,0,83,0,122,12,116,3,124,0,131,1, - 125,4,87,0,110,34,4,0,116,4,116,5,102,2,121,106, - 1,0,1,0,1,0,124,0,100,2,100,5,133,2,25,0, - 125,4,89,0,110,2,48,0,116,6,124,4,131,1,114,120, - 124,4,83,0,124,0,83,0,41,7,122,188,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,114,73,0,0,0,78,114,71, - 0,0,0,233,253,255,255,255,233,255,255,255,255,90,2,112, - 121,41,7,114,23,0,0,0,114,41,0,0,0,218,5,108, - 111,119,101,114,114,102,0,0,0,114,82,0,0,0,114,86, - 0,0,0,114,54,0,0,0,41,5,218,13,98,121,116,101, - 99,111,100,101,95,112,97,116,104,114,95,0,0,0,114,45, - 0,0,0,90,9,101,120,116,101,110,115,105,111,110,218,11, - 115,111,117,114,99,101,95,112,97,116,104,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,218,15,95,103,101,116, - 95,115,111,117,114,99,101,102,105,108,101,158,1,0,0,115, - 22,0,0,0,12,7,4,1,16,1,24,1,4,1,2,1, - 12,1,16,1,18,1,16,1,255,128,114,108,0,0,0,99, + 117,105,110,116,51,50,51,0,0,0,115,6,0,0,0,16, + 2,12,1,255,128,114,27,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,67, + 0,0,0,115,28,0,0,0,116,0,124,0,131,1,100,1, + 107,2,115,16,74,0,130,1,116,1,160,2,124,0,100,2, + 161,2,83,0,41,3,122,47,67,111,110,118,101,114,116,32, + 50,32,98,121,116,101,115,32,105,110,32,108,105,116,116,108, + 101,45,101,110,100,105,97,110,32,116,111,32,97,110,32,105, + 110,116,101,103,101,114,46,233,2,0,0,0,114,17,0,0, + 0,114,22,0,0,0,114,25,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,14,95,117,110,112, + 97,99,107,95,117,105,110,116,49,54,56,0,0,0,115,6, + 0,0,0,16,2,12,1,255,128,114,29,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, + 0,0,0,71,0,0,0,115,20,0,0,0,116,0,160,1, + 100,1,100,2,132,0,124,0,68,0,131,1,161,1,83,0, + 41,3,122,31,82,101,112,108,97,99,101,109,101,110,116,32, + 102,111,114,32,111,115,46,112,97,116,104,46,106,111,105,110, + 40,41,46,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,5,0,0,0,83,0,0,0,115,26,0,0, + 0,103,0,124,0,93,18,125,1,124,1,114,4,124,1,160, + 0,116,1,161,1,145,2,113,4,83,0,114,5,0,0,0, + 41,2,218,6,114,115,116,114,105,112,218,15,112,97,116,104, + 95,115,101,112,97,114,97,116,111,114,115,41,2,218,2,46, + 48,218,4,112,97,114,116,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,10,60,108,105,115,116,99,111,109, + 112,62,64,0,0,0,115,8,0,0,0,6,0,6,1,14, + 255,255,128,122,30,95,112,97,116,104,95,106,111,105,110,46, + 60,108,111,99,97,108,115,62,46,60,108,105,115,116,99,111, + 109,112,62,41,2,218,8,112,97,116,104,95,115,101,112,218, + 4,106,111,105,110,41,1,218,10,112,97,116,104,95,112,97, + 114,116,115,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,10,95,112,97,116,104,95,106,111,105,110,62,0, + 0,0,115,8,0,0,0,10,2,2,1,8,255,255,128,114, + 38,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,5,0,0,0,67,0,0,0,115,94,0, + 0,0,116,0,116,1,131,1,100,1,107,2,114,36,124,0, + 160,2,116,3,161,1,92,3,125,1,125,2,125,3,124,1, + 124,3,102,2,83,0,116,4,124,0,131,1,68,0,93,40, + 125,4,124,4,116,1,118,0,114,44,124,0,106,5,124,4, + 100,1,100,2,141,2,92,2,125,1,125,3,124,1,124,3, + 102,2,2,0,1,0,83,0,100,3,124,0,102,2,83,0, + 41,4,122,32,82,101,112,108,97,99,101,109,101,110,116,32, + 102,111,114,32,111,115,46,112,97,116,104,46,115,112,108,105, + 116,40,41,46,233,1,0,0,0,41,1,90,8,109,97,120, + 115,112,108,105,116,218,0,41,6,114,23,0,0,0,114,31, + 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, + 35,0,0,0,218,8,114,101,118,101,114,115,101,100,218,6, + 114,115,112,108,105,116,41,5,218,4,112,97,116,104,90,5, + 102,114,111,110,116,218,1,95,218,4,116,97,105,108,114,20, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,11,95,112,97,116,104,95,115,112,108,105,116,68, + 0,0,0,115,18,0,0,0,12,2,16,1,8,1,12,1, + 8,1,18,1,12,1,8,1,255,128,114,47,0,0,0,99, 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 8,0,0,0,67,0,0,0,115,70,0,0,0,124,0,160, - 0,116,1,116,2,131,1,161,1,114,44,122,10,116,3,124, - 0,131,1,87,0,83,0,4,0,116,4,121,42,1,0,1, - 0,1,0,89,0,110,24,48,0,124,0,160,0,116,1,116, - 5,131,1,161,1,114,62,124,0,83,0,100,0,83,0,100, - 0,83,0,169,1,78,41,6,218,8,101,110,100,115,119,105, - 116,104,218,5,116,117,112,108,101,114,101,0,0,0,114,97, - 0,0,0,114,82,0,0,0,114,88,0,0,0,41,1,114, - 96,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, - 177,1,0,0,115,20,0,0,0,14,1,2,1,10,1,12, - 1,6,1,14,1,4,1,4,2,4,128,255,128,114,112,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,67,0,0,0,115,50,0,0,0, - 122,14,116,0,124,0,131,1,106,1,125,1,87,0,110,22, - 4,0,116,2,121,36,1,0,1,0,1,0,100,1,125,1, - 89,0,110,2,48,0,124,1,100,2,79,0,125,1,124,1, - 83,0,41,3,122,51,67,97,108,99,117,108,97,116,101,32, - 116,104,101,32,109,111,100,101,32,112,101,114,109,105,115,115, - 105,111,110,115,32,102,111,114,32,97,32,98,121,116,101,99, - 111,100,101,32,102,105,108,101,46,114,60,0,0,0,233,128, - 0,0,0,41,3,114,49,0,0,0,114,51,0,0,0,114, - 50,0,0,0,41,2,114,44,0,0,0,114,52,0,0,0, + 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,160, + 1,124,0,161,1,83,0,41,1,122,126,83,116,97,116,32, + 116,104,101,32,112,97,116,104,46,10,10,32,32,32,32,77, + 97,100,101,32,97,32,115,101,112,97,114,97,116,101,32,102, + 117,110,99,116,105,111,110,32,116,111,32,109,97,107,101,32, + 105,116,32,101,97,115,105,101,114,32,116,111,32,111,118,101, + 114,114,105,100,101,32,105,110,32,101,120,112,101,114,105,109, + 101,110,116,115,10,32,32,32,32,40,101,46,103,46,32,99, + 97,99,104,101,32,115,116,97,116,32,114,101,115,117,108,116, + 115,41,46,10,10,32,32,32,32,41,2,114,4,0,0,0, + 90,4,115,116,97,116,169,1,114,44,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,10,95,112, + 97,116,104,95,115,116,97,116,80,0,0,0,115,4,0,0, + 0,10,7,255,128,114,49,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,48,0,0,0,122,12,116,0,124,0,131,1, + 125,2,87,0,110,20,4,0,116,1,121,32,1,0,1,0, + 1,0,89,0,100,1,83,0,48,0,124,2,106,2,100,2, + 64,0,124,1,107,2,83,0,41,3,122,49,84,101,115,116, + 32,119,104,101,116,104,101,114,32,116,104,101,32,112,97,116, + 104,32,105,115,32,116,104,101,32,115,112,101,99,105,102,105, + 101,100,32,109,111,100,101,32,116,121,112,101,46,70,105,0, + 240,0,0,41,3,114,49,0,0,0,218,7,79,83,69,114, + 114,111,114,218,7,115,116,95,109,111,100,101,41,3,114,44, + 0,0,0,218,4,109,111,100,101,90,9,115,116,97,116,95, + 105,110,102,111,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,18,95,112,97,116,104,95,105,115,95,109,111, + 100,101,95,116,121,112,101,90,0,0,0,115,12,0,0,0, + 2,2,12,1,12,1,8,1,14,1,255,128,114,53,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,10,0,0,0,116, + 0,124,0,100,1,131,2,83,0,41,2,122,31,82,101,112, + 108,97,99,101,109,101,110,116,32,102,111,114,32,111,115,46, + 112,97,116,104,46,105,115,102,105,108,101,46,105,0,128,0, + 0,41,1,114,53,0,0,0,114,48,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,12,95,112, + 97,116,104,95,105,115,102,105,108,101,99,0,0,0,115,4, + 0,0,0,10,2,255,128,114,54,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,22,0,0,0,124,0,115,12,116,0, + 160,1,161,0,125,0,116,2,124,0,100,1,131,2,83,0, + 41,2,122,30,82,101,112,108,97,99,101,109,101,110,116,32, + 102,111,114,32,111,115,46,112,97,116,104,46,105,115,100,105, + 114,46,105,0,64,0,0,41,3,114,4,0,0,0,218,6, + 103,101,116,99,119,100,114,53,0,0,0,114,48,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 10,95,99,97,108,99,95,109,111,100,101,189,1,0,0,115, - 14,0,0,0,2,2,14,1,12,1,10,1,8,3,4,1, - 255,128,114,114,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,8,0,0,0,3,0,0,0, - 115,66,0,0,0,100,6,135,0,102,1,100,2,100,3,132, - 9,125,1,122,10,116,0,106,1,125,2,87,0,110,26,4, - 0,116,2,121,50,1,0,1,0,1,0,100,4,100,5,132, - 0,125,2,89,0,110,2,48,0,124,2,124,1,136,0,131, - 2,1,0,124,1,83,0,41,7,122,252,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,0,0,0,0,4,0,0,0,4,0,0,0,31,0,0, - 0,115,72,0,0,0,124,1,100,0,117,0,114,16,124,0, - 106,0,125,1,110,32,124,0,106,0,124,1,107,3,114,48, - 116,1,100,1,124,0,106,0,124,1,102,2,22,0,124,1, - 100,2,141,2,130,1,136,0,124,0,124,1,103,2,124,2, - 162,1,82,0,105,0,124,3,164,1,142,1,83,0,41,3, - 78,122,30,108,111,97,100,101,114,32,102,111,114,32,37,115, - 32,99,97,110,110,111,116,32,104,97,110,100,108,101,32,37, - 115,169,1,218,4,110,97,109,101,41,2,114,116,0,0,0, - 218,11,73,109,112,111,114,116,69,114,114,111,114,41,4,218, - 4,115,101,108,102,114,116,0,0,0,218,4,97,114,103,115, - 218,6,107,119,97,114,103,115,169,1,218,6,109,101,116,104, - 111,100,114,5,0,0,0,114,8,0,0,0,218,19,95,99, - 104,101,99,107,95,110,97,109,101,95,119,114,97,112,112,101, - 114,209,1,0,0,115,20,0,0,0,8,1,8,1,10,1, - 4,1,8,1,2,255,2,1,6,255,24,2,255,128,122,40, - 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,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,7,0,0,0,83,0,0, - 0,115,56,0,0,0,100,1,68,0,93,32,125,2,116,0, - 124,1,124,2,131,2,114,4,116,1,124,0,124,2,116,2, - 124,1,124,2,131,2,131,3,1,0,113,4,124,0,106,3, - 160,4,124,1,106,3,161,1,1,0,100,0,83,0,41,2, - 78,41,4,218,10,95,95,109,111,100,117,108,101,95,95,218, - 8,95,95,110,97,109,101,95,95,218,12,95,95,113,117,97, - 108,110,97,109,101,95,95,218,7,95,95,100,111,99,95,95, - 41,5,218,7,104,97,115,97,116,116,114,218,7,115,101,116, - 97,116,116,114,218,7,103,101,116,97,116,116,114,218,8,95, - 95,100,105,99,116,95,95,218,6,117,112,100,97,116,101,41, - 3,90,3,110,101,119,90,3,111,108,100,114,67,0,0,0, + 11,95,112,97,116,104,95,105,115,100,105,114,104,0,0,0, + 115,8,0,0,0,4,2,8,1,10,1,255,128,114,56,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,26,0,0,0, + 124,0,160,0,116,1,161,1,112,24,124,0,100,1,100,2, + 133,2,25,0,116,2,118,0,83,0,41,3,122,142,82,101, + 112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,115, + 46,112,97,116,104,46,105,115,97,98,115,46,10,10,32,32, + 32,32,67,111,110,115,105,100,101,114,115,32,97,32,87,105, + 110,100,111,119,115,32,100,114,105,118,101,45,114,101,108,97, + 116,105,118,101,32,112,97,116,104,32,40,110,111,32,100,114, + 105,118,101,44,32,98,117,116,32,115,116,97,114,116,115,32, + 119,105,116,104,32,115,108,97,115,104,41,32,116,111,10,32, + 32,32,32,115,116,105,108,108,32,98,101,32,34,97,98,115, + 111,108,117,116,101,34,46,10,32,32,32,32,114,39,0,0, + 0,233,3,0,0,0,41,3,114,11,0,0,0,114,31,0, + 0,0,218,20,95,112,97,116,104,115,101,112,115,95,119,105, + 116,104,95,99,111,108,111,110,114,48,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,11,95,112, + 97,116,104,95,105,115,97,98,115,111,0,0,0,115,4,0, + 0,0,26,6,255,128,114,59,0,0,0,233,182,1,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,11,0,0,0,67,0,0,0,115,170,0,0,0,100,1, + 160,0,124,0,116,1,124,0,131,1,161,2,125,3,116,2, + 160,3,124,3,116,2,106,4,116,2,106,5,66,0,116,2, + 106,6,66,0,124,2,100,2,64,0,161,3,125,4,122,72, + 116,7,160,8,124,4,100,3,161,2,143,26,125,5,124,5, + 160,9,124,1,161,1,1,0,87,0,100,4,4,0,4,0, + 131,3,1,0,110,16,49,0,115,94,48,0,1,0,1,0, + 1,0,89,0,1,0,116,2,160,10,124,3,124,0,161,2, + 1,0,87,0,100,4,83,0,4,0,116,11,121,168,1,0, + 1,0,1,0,122,14,116,2,160,12,124,3,161,1,1,0, + 87,0,130,0,4,0,116,11,121,166,1,0,1,0,1,0, + 89,0,130,0,48,0,48,0,41,5,122,162,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,250,5, + 123,125,46,123,125,114,60,0,0,0,90,2,119,98,78,41, + 13,218,6,102,111,114,109,97,116,218,2,105,100,114,4,0, + 0,0,90,4,111,112,101,110,90,6,79,95,69,88,67,76, + 90,7,79,95,67,82,69,65,84,90,8,79,95,87,82,79, + 78,76,89,218,3,95,105,111,218,6,70,105,108,101,73,79, + 218,5,119,114,105,116,101,218,7,114,101,112,108,97,99,101, + 114,50,0,0,0,90,6,117,110,108,105,110,107,41,6,114, + 44,0,0,0,114,26,0,0,0,114,52,0,0,0,90,8, + 112,97,116,104,95,116,109,112,90,2,102,100,218,4,102,105, + 108,101,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,13,95,119,114,105,116,101,95,97,116,111,109,105,99, + 120,0,0,0,115,38,0,0,0,16,5,6,1,22,1,4, + 255,2,2,14,3,40,1,14,1,4,128,12,1,2,1,12, + 1,2,3,12,254,2,1,2,1,2,255,2,1,255,128,114, + 69,0,0,0,105,103,13,0,0,114,28,0,0,0,114,17, + 0,0,0,115,2,0,0,0,13,10,90,11,95,95,112,121, + 99,97,99,104,101,95,95,122,4,111,112,116,45,122,3,46, + 112,121,122,4,46,112,121,99,78,41,1,218,12,111,112,116, + 105,109,105,122,97,116,105,111,110,99,2,0,0,0,0,0, + 0,0,1,0,0,0,12,0,0,0,5,0,0,0,67,0, + 0,0,115,88,1,0,0,124,1,100,1,117,1,114,52,116, + 0,160,1,100,2,116,2,161,2,1,0,124,2,100,1,117, + 1,114,40,100,3,125,3,116,3,124,3,131,1,130,1,124, + 1,114,48,100,4,110,2,100,5,125,2,116,4,160,5,124, + 0,161,1,125,0,116,6,124,0,131,1,92,2,125,4,125, + 5,124,5,160,7,100,6,161,1,92,3,125,6,125,7,125, + 8,116,8,106,9,106,10,125,9,124,9,100,1,117,0,114, + 114,116,11,100,7,131,1,130,1,100,4,160,12,124,6,114, + 126,124,6,110,2,124,8,124,7,124,9,103,3,161,1,125, + 10,124,2,100,1,117,0,114,172,116,8,106,13,106,14,100, + 8,107,2,114,164,100,4,125,2,110,8,116,8,106,13,106, + 14,125,2,116,15,124,2,131,1,125,2,124,2,100,4,107, + 3,114,224,124,2,160,16,161,0,115,210,116,17,100,9,160, + 18,124,2,161,1,131,1,130,1,100,10,160,18,124,10,116, + 19,124,2,161,3,125,10,124,10,116,20,100,8,25,0,23, + 0,125,11,116,8,106,21,100,1,117,1,144,1,114,76,116, + 22,124,4,131,1,144,1,115,16,116,23,116,4,160,24,161, + 0,124,4,131,2,125,4,124,4,100,5,25,0,100,11,107, + 2,144,1,114,56,124,4,100,8,25,0,116,25,118,1,144, + 1,114,56,124,4,100,12,100,1,133,2,25,0,125,4,116, + 23,116,8,106,21,124,4,160,26,116,25,161,1,124,11,131, + 3,83,0,116,23,124,4,116,27,124,11,131,3,83,0,41, + 13,97,254,2,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,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,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,10,10, + 32,32,32,32,84,104,101,32,39,111,112,116,105,109,105,122, + 97,116,105,111,110,39,32,112,97,114,97,109,101,116,101,114, + 32,99,111,110,116,114,111,108,115,32,116,104,101,32,112,114, + 101,115,117,109,101,100,32,111,112,116,105,109,105,122,97,116, + 105,111,110,32,108,101,118,101,108,32,111,102,10,32,32,32, + 32,116,104,101,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,46,32,73,102,32,39,111,112,116,105,109,105,122,97, + 116,105,111,110,39,32,105,115,32,110,111,116,32,78,111,110, + 101,44,32,116,104,101,32,115,116,114,105,110,103,32,114,101, + 112,114,101,115,101,110,116,97,116,105,111,110,10,32,32,32, + 32,111,102,32,116,104,101,32,97,114,103,117,109,101,110,116, + 32,105,115,32,116,97,107,101,110,32,97,110,100,32,118,101, + 114,105,102,105,101,100,32,116,111,32,98,101,32,97,108,112, + 104,97,110,117,109,101,114,105,99,32,40,101,108,115,101,32, + 86,97,108,117,101,69,114,114,111,114,10,32,32,32,32,105, + 115,32,114,97,105,115,101,100,41,46,10,10,32,32,32,32, + 84,104,101,32,100,101,98,117,103,95,111,118,101,114,114,105, + 100,101,32,112,97,114,97,109,101,116,101,114,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,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,10,32,32,32,32,97, + 32,84,114,117,101,32,118,97,108,117,101,32,105,115,32,116, + 104,101,32,115,97,109,101,32,97,115,32,115,101,116,116,105, + 110,103,32,39,111,112,116,105,109,105,122,97,116,105,111,110, + 39,32,116,111,32,116,104,101,32,101,109,112,116,121,32,115, + 116,114,105,110,103,10,32,32,32,32,119,104,105,108,101,32, + 97,32,70,97,108,115,101,32,118,97,108,117,101,32,105,115, + 32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,115, + 101,116,116,105,110,103,32,39,111,112,116,105,109,105,122,97, + 116,105,111,110,39,32,116,111,32,39,49,39,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,122,70,116,104,101,32,100,101,98,117,103, + 95,111,118,101,114,114,105,100,101,32,112,97,114,97,109,101, + 116,101,114,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,59,32,117,115,101,32,39,111,112,116,105,109,105,122,97, + 116,105,111,110,39,32,105,110,115,116,101,97,100,122,50,100, + 101,98,117,103,95,111,118,101,114,114,105,100,101,32,111,114, + 32,111,112,116,105,109,105,122,97,116,105,111,110,32,109,117, + 115,116,32,98,101,32,115,101,116,32,116,111,32,78,111,110, + 101,114,40,0,0,0,114,39,0,0,0,218,1,46,250,36, + 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,233,0,0,0,0,122,24,123,33,114,125,32, + 105,115,32,110,111,116,32,97,108,112,104,97,110,117,109,101, + 114,105,99,122,7,123,125,46,123,125,123,125,250,1,58,114, + 28,0,0,0,41,28,218,9,95,119,97,114,110,105,110,103, + 115,218,4,119,97,114,110,218,18,68,101,112,114,101,99,97, + 116,105,111,110,87,97,114,110,105,110,103,218,9,84,121,112, + 101,69,114,114,111,114,114,4,0,0,0,218,6,102,115,112, + 97,116,104,114,47,0,0,0,114,41,0,0,0,114,1,0, + 0,0,218,14,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,218,9,99,97,99,104,101,95,116,97,103,218,19,78, + 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, + 111,114,114,36,0,0,0,114,2,0,0,0,218,8,111,112, + 116,105,109,105,122,101,218,3,115,116,114,218,7,105,115,97, + 108,110,117,109,218,10,86,97,108,117,101,69,114,114,111,114, + 114,62,0,0,0,218,4,95,79,80,84,218,17,66,89,84, + 69,67,79,68,69,95,83,85,70,70,73,88,69,83,218,14, + 112,121,99,97,99,104,101,95,112,114,101,102,105,120,114,59, + 0,0,0,114,38,0,0,0,114,55,0,0,0,114,31,0, + 0,0,218,6,108,115,116,114,105,112,218,8,95,80,89,67, + 65,67,72,69,41,12,114,44,0,0,0,90,14,100,101,98, + 117,103,95,111,118,101,114,114,105,100,101,114,70,0,0,0, + 218,7,109,101,115,115,97,103,101,218,4,104,101,97,100,114, + 46,0,0,0,90,4,98,97,115,101,218,3,115,101,112,218, + 4,114,101,115,116,90,3,116,97,103,90,15,97,108,109,111, + 115,116,95,102,105,108,101,110,97,109,101,218,8,102,105,108, + 101,110,97,109,101,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,17,99,97,99,104,101,95,102,114,111,109, + 95,115,111,117,114,99,101,47,1,0,0,115,74,0,0,0, + 8,18,6,1,2,1,4,255,8,2,4,1,8,1,12,1, + 10,1,12,1,16,1,8,1,8,1,8,1,24,1,8,1, + 12,1,6,1,8,2,8,1,8,1,8,1,14,1,14,1, + 12,1,12,1,10,9,14,1,28,5,12,1,2,4,4,1, + 8,1,2,1,4,253,12,5,255,128,114,97,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, + 5,0,0,0,67,0,0,0,115,44,1,0,0,116,0,106, + 1,106,2,100,1,117,0,114,20,116,3,100,2,131,1,130, + 1,116,4,160,5,124,0,161,1,125,0,116,6,124,0,131, + 1,92,2,125,1,125,2,100,3,125,3,116,0,106,7,100, + 1,117,1,114,102,116,0,106,7,160,8,116,9,161,1,125, + 4,124,1,160,10,124,4,116,11,23,0,161,1,114,102,124, + 1,116,12,124,4,131,1,100,1,133,2,25,0,125,1,100, + 4,125,3,124,3,115,144,116,6,124,1,131,1,92,2,125, + 1,125,5,124,5,116,13,107,3,114,144,116,14,116,13,155, + 0,100,5,124,0,155,2,157,3,131,1,130,1,124,2,160, + 15,100,6,161,1,125,6,124,6,100,7,118,1,114,176,116, + 14,100,8,124,2,155,2,157,2,131,1,130,1,124,6,100, + 9,107,2,144,1,114,12,124,2,160,16,100,6,100,10,161, + 2,100,11,25,0,125,7,124,7,160,10,116,17,161,1,115, + 226,116,14,100,12,116,17,155,2,157,2,131,1,130,1,124, + 7,116,12,116,17,131,1,100,1,133,2,25,0,125,8,124, + 8,160,18,161,0,144,1,115,12,116,14,100,13,124,7,155, + 2,100,14,157,3,131,1,130,1,124,2,160,19,100,6,161, + 1,100,15,25,0,125,9,116,20,124,1,124,9,116,21,100, + 15,25,0,23,0,131,2,83,0,41,16,97,110,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,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,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,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,47,52,56,56,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,114, + 72,0,0,0,70,84,122,31,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,114,71,0,0,0,62,2,0,0, + 0,114,28,0,0,0,114,57,0,0,0,122,29,101,120,112, + 101,99,116,101,100,32,111,110,108,121,32,50,32,111,114,32, + 51,32,100,111,116,115,32,105,110,32,114,57,0,0,0,114, + 28,0,0,0,233,254,255,255,255,122,53,111,112,116,105,109, + 105,122,97,116,105,111,110,32,112,111,114,116,105,111,110,32, + 111,102,32,102,105,108,101,110,97,109,101,32,100,111,101,115, + 32,110,111,116,32,115,116,97,114,116,32,119,105,116,104,32, + 122,19,111,112,116,105,109,105,122,97,116,105,111,110,32,108, + 101,118,101,108,32,122,29,32,105,115,32,110,111,116,32,97, + 110,32,97,108,112,104,97,110,117,109,101,114,105,99,32,118, + 97,108,117,101,114,73,0,0,0,41,22,114,1,0,0,0, + 114,80,0,0,0,114,81,0,0,0,114,82,0,0,0,114, + 4,0,0,0,114,79,0,0,0,114,47,0,0,0,114,89, + 0,0,0,114,30,0,0,0,114,31,0,0,0,114,11,0, + 0,0,114,35,0,0,0,114,23,0,0,0,114,91,0,0, + 0,114,86,0,0,0,218,5,99,111,117,110,116,114,43,0, + 0,0,114,87,0,0,0,114,85,0,0,0,218,9,112,97, + 114,116,105,116,105,111,110,114,38,0,0,0,218,15,83,79, + 85,82,67,69,95,83,85,70,70,73,88,69,83,41,10,114, + 44,0,0,0,114,93,0,0,0,90,16,112,121,99,97,99, + 104,101,95,102,105,108,101,110,97,109,101,90,23,102,111,117, + 110,100,95,105,110,95,112,121,99,97,99,104,101,95,112,114, + 101,102,105,120,90,13,115,116,114,105,112,112,101,100,95,112, + 97,116,104,90,7,112,121,99,97,99,104,101,90,9,100,111, + 116,95,99,111,117,110,116,114,70,0,0,0,90,9,111,112, + 116,95,108,101,118,101,108,90,13,98,97,115,101,95,102,105, + 108,101,110,97,109,101,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,17,115,111,117,114,99,101,95,102,114, + 111,109,95,99,97,99,104,101,118,1,0,0,115,62,0,0, + 0,12,9,8,1,10,1,12,1,4,1,10,1,12,1,14, + 1,16,1,4,1,4,1,12,1,8,1,8,1,2,1,8, + 255,10,2,8,1,14,1,10,1,16,1,10,1,4,1,2, + 1,8,255,16,2,10,1,16,1,14,2,18,1,255,128,114, + 102,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,9,0,0,0,67,0,0,0,115,124,0, + 0,0,116,0,124,0,131,1,100,1,107,2,114,16,100,2, + 83,0,124,0,160,1,100,3,161,1,92,3,125,1,125,2, + 125,3,124,1,114,56,124,3,160,2,161,0,100,4,100,5, + 133,2,25,0,100,6,107,3,114,60,124,0,83,0,122,12, + 116,3,124,0,131,1,125,4,87,0,110,34,4,0,116,4, + 116,5,102,2,121,106,1,0,1,0,1,0,124,0,100,2, + 100,5,133,2,25,0,125,4,89,0,110,2,48,0,116,6, + 124,4,131,1,114,120,124,4,83,0,124,0,83,0,41,7, + 122,188,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,114,73, + 0,0,0,78,114,71,0,0,0,233,253,255,255,255,233,255, + 255,255,255,90,2,112,121,41,7,114,23,0,0,0,114,41, + 0,0,0,218,5,108,111,119,101,114,114,102,0,0,0,114, + 82,0,0,0,114,86,0,0,0,114,54,0,0,0,41,5, + 218,13,98,121,116,101,99,111,100,101,95,112,97,116,104,114, + 95,0,0,0,114,45,0,0,0,90,9,101,120,116,101,110, + 115,105,111,110,218,11,115,111,117,114,99,101,95,112,97,116, + 104,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,15,95,103,101,116,95,115,111,117,114,99,101,102,105,108, + 101,158,1,0,0,115,22,0,0,0,12,7,4,1,16,1, + 24,1,4,1,2,1,12,1,16,1,18,1,16,1,255,128, + 114,108,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,8,0,0,0,67,0,0,0,115,68, + 0,0,0,124,0,160,0,116,1,116,2,131,1,161,1,114, + 46,122,10,116,3,124,0,131,1,87,0,83,0,4,0,116, + 4,121,44,1,0,1,0,1,0,89,0,100,0,83,0,48, + 0,124,0,160,0,116,1,116,5,131,1,161,1,114,64,124, + 0,83,0,100,0,83,0,169,1,78,41,6,218,8,101,110, + 100,115,119,105,116,104,218,5,116,117,112,108,101,114,101,0, + 0,0,114,97,0,0,0,114,82,0,0,0,114,88,0,0, + 0,41,1,114,96,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,11,95,103,101,116,95,99,97, + 99,104,101,100,177,1,0,0,115,22,0,0,0,14,1,2, + 1,10,1,12,1,2,1,4,128,2,0,14,1,4,1,4, + 2,255,128,114,112,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,8,0,0,0,67,0,0, + 0,115,50,0,0,0,122,14,116,0,124,0,131,1,106,1, + 125,1,87,0,110,22,4,0,116,2,121,36,1,0,1,0, + 1,0,100,1,125,1,89,0,110,2,48,0,124,1,100,2, + 79,0,125,1,124,1,83,0,41,3,122,51,67,97,108,99, + 117,108,97,116,101,32,116,104,101,32,109,111,100,101,32,112, + 101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,97, + 32,98,121,116,101,99,111,100,101,32,102,105,108,101,46,114, + 60,0,0,0,233,128,0,0,0,41,3,114,49,0,0,0, + 114,51,0,0,0,114,50,0,0,0,41,2,114,44,0,0, + 0,114,52,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,10,95,99,97,108,99,95,109,111,100, + 101,189,1,0,0,115,14,0,0,0,2,2,14,1,12,1, + 10,1,8,3,4,1,255,128,114,114,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0, + 0,0,3,0,0,0,115,66,0,0,0,100,6,135,0,102, + 1,100,2,100,3,132,9,125,1,122,10,116,0,106,1,125, + 2,87,0,110,26,4,0,116,2,121,50,1,0,1,0,1, + 0,100,4,100,5,132,0,125,2,89,0,110,2,48,0,124, + 2,124,1,136,0,131,2,1,0,124,1,83,0,41,7,122, + 252,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,0,0,0,0,4,0,0,0,4, + 0,0,0,31,0,0,0,115,72,0,0,0,124,1,100,0, + 117,0,114,16,124,0,106,0,125,1,110,32,124,0,106,0, + 124,1,107,3,114,48,116,1,100,1,124,0,106,0,124,1, + 102,2,22,0,124,1,100,2,141,2,130,1,136,0,124,0, + 124,1,103,2,124,2,162,1,82,0,105,0,124,3,164,1, + 142,1,83,0,41,3,78,122,30,108,111,97,100,101,114,32, + 102,111,114,32,37,115,32,99,97,110,110,111,116,32,104,97, + 110,100,108,101,32,37,115,169,1,218,4,110,97,109,101,41, + 2,114,116,0,0,0,218,11,73,109,112,111,114,116,69,114, + 114,111,114,41,4,218,4,115,101,108,102,114,116,0,0,0, + 218,4,97,114,103,115,218,6,107,119,97,114,103,115,169,1, + 218,6,109,101,116,104,111,100,114,5,0,0,0,114,8,0, + 0,0,218,19,95,99,104,101,99,107,95,110,97,109,101,95, + 119,114,97,112,112,101,114,209,1,0,0,115,20,0,0,0, + 8,1,8,1,10,1,4,1,8,1,2,255,2,1,6,255, + 24,2,255,128,122,40,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,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,7, + 0,0,0,83,0,0,0,115,56,0,0,0,100,1,68,0, + 93,32,125,2,116,0,124,1,124,2,131,2,114,4,116,1, + 124,0,124,2,116,2,124,1,124,2,131,2,131,3,1,0, + 113,4,124,0,106,3,160,4,124,1,106,3,161,1,1,0, + 100,0,83,0,41,2,78,41,4,218,10,95,95,109,111,100, + 117,108,101,95,95,218,8,95,95,110,97,109,101,95,95,218, + 12,95,95,113,117,97,108,110,97,109,101,95,95,218,7,95, + 95,100,111,99,95,95,41,5,218,7,104,97,115,97,116,116, + 114,218,7,115,101,116,97,116,116,114,218,7,103,101,116,97, + 116,116,114,218,8,95,95,100,105,99,116,95,95,218,6,117, + 112,100,97,116,101,41,3,90,3,110,101,119,90,3,111,108, + 100,114,67,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,5,95,119,114,97,112,220,1,0,0, + 115,12,0,0,0,8,1,10,1,20,1,14,1,4,128,255, + 128,122,26,95,99,104,101,99,107,95,110,97,109,101,46,60, + 108,111,99,97,108,115,62,46,95,119,114,97,112,41,1,78, + 41,3,218,10,95,98,111,111,116,115,116,114,97,112,114,133, + 0,0,0,218,9,78,97,109,101,69,114,114,111,114,41,3, + 114,122,0,0,0,114,123,0,0,0,114,133,0,0,0,114, + 5,0,0,0,114,121,0,0,0,114,8,0,0,0,218,11, + 95,99,104,101,99,107,95,110,97,109,101,201,1,0,0,115, + 16,0,0,0,14,8,2,7,10,1,12,1,14,2,10,5, + 4,1,255,128,114,136,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,6,0,0,0,67,0, + 0,0,115,60,0,0,0,124,0,160,0,124,1,161,1,92, + 2,125,2,125,3,124,2,100,1,117,0,114,56,116,1,124, + 3,131,1,114,56,100,2,125,4,116,2,160,3,124,4,160, + 4,124,3,100,3,25,0,161,1,116,5,161,2,1,0,124, + 2,83,0,41,4,122,155,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,10,10,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,32,105,110,32, + 102,97,118,111,114,32,111,102,32,102,105,110,100,101,114,46, + 102,105,110,100,95,115,112,101,99,40,41,46,10,10,32,32, + 32,32,78,122,44,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,114,73,0,0,0,41,6,218,11,102,105,110,100,95,108, + 111,97,100,101,114,114,23,0,0,0,114,75,0,0,0,114, + 76,0,0,0,114,62,0,0,0,218,13,73,109,112,111,114, + 116,87,97,114,110,105,110,103,41,5,114,118,0,0,0,218, + 8,102,117,108,108,110,97,109,101,218,6,108,111,97,100,101, + 114,218,8,112,111,114,116,105,111,110,115,218,3,109,115,103, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 5,95,119,114,97,112,220,1,0,0,115,12,0,0,0,8, - 1,10,1,20,1,14,1,4,128,255,128,122,26,95,99,104, - 101,99,107,95,110,97,109,101,46,60,108,111,99,97,108,115, - 62,46,95,119,114,97,112,41,1,78,41,3,218,10,95,98, - 111,111,116,115,116,114,97,112,114,133,0,0,0,218,9,78, - 97,109,101,69,114,114,111,114,41,3,114,122,0,0,0,114, - 123,0,0,0,114,133,0,0,0,114,5,0,0,0,114,121, - 0,0,0,114,8,0,0,0,218,11,95,99,104,101,99,107, - 95,110,97,109,101,201,1,0,0,115,16,0,0,0,14,8, - 2,7,10,1,12,1,14,2,10,5,4,1,255,128,114,136, - 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,6,0,0,0,67,0,0,0,115,60,0,0, - 0,124,0,160,0,124,1,161,1,92,2,125,2,125,3,124, - 2,100,1,117,0,114,56,116,1,124,3,131,1,114,56,100, - 2,125,4,116,2,160,3,124,4,160,4,124,3,100,3,25, - 0,161,1,116,5,161,2,1,0,124,2,83,0,41,4,122, - 155,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,10,10,32,32,32,32,84,104,105, - 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,32,105,110,32,102,97,118,111,114,32, - 111,102,32,102,105,110,100,101,114,46,102,105,110,100,95,115, - 112,101,99,40,41,46,10,10,32,32,32,32,78,122,44,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,114,73,0,0,0, - 41,6,218,11,102,105,110,100,95,108,111,97,100,101,114,114, - 23,0,0,0,114,75,0,0,0,114,76,0,0,0,114,62, - 0,0,0,218,13,73,109,112,111,114,116,87,97,114,110,105, - 110,103,41,5,114,118,0,0,0,218,8,102,117,108,108,110, - 97,109,101,218,6,108,111,97,100,101,114,218,8,112,111,114, - 116,105,111,110,115,218,3,109,115,103,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,17,95,102,105,110,100, - 95,109,111,100,117,108,101,95,115,104,105,109,229,1,0,0, - 115,12,0,0,0,14,10,16,1,4,1,22,1,4,1,255, - 128,114,143,0,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, - 166,0,0,0,124,0,100,1,100,2,133,2,25,0,125,3, - 124,3,116,0,107,3,114,64,100,3,124,1,155,2,100,4, - 124,3,155,2,157,4,125,4,116,1,160,2,100,5,124,4, - 161,2,1,0,116,3,124,4,102,1,105,0,124,2,164,1, - 142,1,130,1,116,4,124,0,131,1,100,6,107,0,114,106, - 100,7,124,1,155,2,157,2,125,4,116,1,160,2,100,5, - 124,4,161,2,1,0,116,5,124,4,131,1,130,1,116,6, - 124,0,100,2,100,8,133,2,25,0,131,1,125,5,124,5, - 100,9,64,0,114,162,100,10,124,5,155,2,100,11,124,1, - 155,2,157,4,125,4,116,3,124,4,102,1,105,0,124,2, - 164,1,142,1,130,1,124,5,83,0,41,12,97,84,2,0, - 0,80,101,114,102,111,114,109,32,98,97,115,105,99,32,118, - 97,108,105,100,105,116,121,32,99,104,101,99,107,105,110,103, - 32,111,102,32,97,32,112,121,99,32,104,101,97,100,101,114, - 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32, - 102,108,97,103,115,32,102,105,101,108,100,44,10,32,32,32, - 32,119,104,105,99,104,32,100,101,116,101,114,109,105,110,101, - 115,32,104,111,119,32,116,104,101,32,112,121,99,32,115,104, - 111,117,108,100,32,98,101,32,102,117,114,116,104,101,114,32, - 118,97,108,105,100,97,116,101,100,32,97,103,97,105,110,115, - 116,32,116,104,101,32,115,111,117,114,99,101,46,10,10,32, - 32,32,32,42,100,97,116,97,42,32,105,115,32,116,104,101, - 32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101, - 32,112,121,99,32,102,105,108,101,46,32,40,79,110,108,121, - 32,116,104,101,32,102,105,114,115,116,32,49,54,32,98,121, - 116,101,115,32,97,114,101,10,32,32,32,32,114,101,113,117, - 105,114,101,100,44,32,116,104,111,117,103,104,46,41,10,10, - 32,32,32,32,42,110,97,109,101,42,32,105,115,32,116,104, - 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, - 100,117,108,101,32,98,101,105,110,103,32,105,109,112,111,114, - 116,101,100,46,32,73,116,32,105,115,32,117,115,101,100,32, - 102,111,114,32,108,111,103,103,105,110,103,46,10,10,32,32, - 32,32,42,101,120,99,95,100,101,116,97,105,108,115,42,32, - 105,115,32,97,32,100,105,99,116,105,111,110,97,114,121,32, - 112,97,115,115,101,100,32,116,111,32,73,109,112,111,114,116, - 69,114,114,111,114,32,105,102,32,105,116,32,114,97,105,115, - 101,100,32,102,111,114,10,32,32,32,32,105,109,112,114,111, - 118,101,100,32,100,101,98,117,103,103,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, - 119,104,101,110,32,116,104,101,32,102,108,97,103,115,10,32, - 32,32,32,102,105,101,108,100,32,105,115,32,105,110,118,97, - 108,105,100,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,32,116,114,117,110,99,97,116,101,100,46,10, - 10,32,32,32,32,78,114,16,0,0,0,122,20,98,97,100, - 32,109,97,103,105,99,32,110,117,109,98,101,114,32,105,110, - 32,122,2,58,32,250,2,123,125,233,16,0,0,0,122,40, - 114,101,97,99,104,101,100,32,69,79,70,32,119,104,105,108, - 101,32,114,101,97,100,105,110,103,32,112,121,99,32,104,101, - 97,100,101,114,32,111,102,32,233,8,0,0,0,233,252,255, - 255,255,122,14,105,110,118,97,108,105,100,32,102,108,97,103, - 115,32,122,4,32,105,110,32,41,7,218,12,77,65,71,73, - 67,95,78,85,77,66,69,82,114,134,0,0,0,218,16,95, - 118,101,114,98,111,115,101,95,109,101,115,115,97,103,101,114, - 117,0,0,0,114,23,0,0,0,218,8,69,79,70,69,114, - 114,111,114,114,27,0,0,0,41,6,114,26,0,0,0,114, - 116,0,0,0,218,11,101,120,99,95,100,101,116,97,105,108, - 115,90,5,109,97,103,105,99,114,92,0,0,0,114,2,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,13,95,99,108,97,115,115,105,102,121,95,112,121,99, - 246,1,0,0,115,30,0,0,0,12,16,8,1,16,1,12, - 1,16,1,12,1,10,1,12,1,8,1,16,1,8,2,16, - 1,16,1,4,1,255,128,114,152,0,0,0,99,5,0,0, + 17,95,102,105,110,100,95,109,111,100,117,108,101,95,115,104, + 105,109,229,1,0,0,115,12,0,0,0,14,10,16,1,4, + 1,22,1,4,1,255,128,114,143,0,0,0,99,3,0,0, 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, - 0,67,0,0,0,115,120,0,0,0,116,0,124,0,100,1, - 100,2,133,2,25,0,131,1,124,1,100,3,64,0,107,3, - 114,62,100,4,124,3,155,2,157,2,125,5,116,1,160,2, - 100,5,124,5,161,2,1,0,116,3,124,5,102,1,105,0, - 124,4,164,1,142,1,130,1,124,2,100,6,117,1,114,116, - 116,0,124,0,100,2,100,7,133,2,25,0,131,1,124,2, - 100,3,64,0,107,3,114,116,116,3,100,4,124,3,155,2, - 157,2,102,1,105,0,124,4,164,1,142,1,130,1,100,6, - 83,0,41,8,97,7,2,0,0,86,97,108,105,100,97,116, - 101,32,97,32,112,121,99,32,97,103,97,105,110,115,116,32, - 116,104,101,32,115,111,117,114,99,101,32,108,97,115,116,45, - 109,111,100,105,102,105,101,100,32,116,105,109,101,46,10,10, - 32,32,32,32,42,100,97,116,97,42,32,105,115,32,116,104, - 101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104, - 101,32,112,121,99,32,102,105,108,101,46,32,40,79,110,108, - 121,32,116,104,101,32,102,105,114,115,116,32,49,54,32,98, - 121,116,101,115,32,97,114,101,10,32,32,32,32,114,101,113, - 117,105,114,101,100,46,41,10,10,32,32,32,32,42,115,111, - 117,114,99,101,95,109,116,105,109,101,42,32,105,115,32,116, - 104,101,32,108,97,115,116,32,109,111,100,105,102,105,101,100, - 32,116,105,109,101,115,116,97,109,112,32,111,102,32,116,104, - 101,32,115,111,117,114,99,101,32,102,105,108,101,46,10,10, - 32,32,32,32,42,115,111,117,114,99,101,95,115,105,122,101, - 42,32,105,115,32,78,111,110,101,32,111,114,32,116,104,101, - 32,115,105,122,101,32,111,102,32,116,104,101,32,115,111,117, - 114,99,101,32,102,105,108,101,32,105,110,32,98,121,116,101, - 115,46,10,10,32,32,32,32,42,110,97,109,101,42,32,105, - 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, - 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105, - 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117, - 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46, - 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105, - 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110, - 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109, - 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32, - 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105, - 109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,110, - 103,46,10,10,32,32,32,32,65,110,32,73,109,112,111,114, - 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, - 32,105,102,32,116,104,101,32,98,121,116,101,99,111,100,101, - 32,105,115,32,115,116,97,108,101,46,10,10,32,32,32,32, - 114,146,0,0,0,233,12,0,0,0,114,15,0,0,0,122, - 22,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97, - 108,101,32,102,111,114,32,114,144,0,0,0,78,114,145,0, - 0,0,41,4,114,27,0,0,0,114,134,0,0,0,114,149, - 0,0,0,114,117,0,0,0,41,6,114,26,0,0,0,218, - 12,115,111,117,114,99,101,95,109,116,105,109,101,218,11,115, - 111,117,114,99,101,95,115,105,122,101,114,116,0,0,0,114, - 151,0,0,0,114,92,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,23,95,118,97,108,105,100, - 97,116,101,95,116,105,109,101,115,116,97,109,112,95,112,121, - 99,23,2,0,0,115,20,0,0,0,24,19,10,1,12,1, - 16,1,8,1,22,1,2,255,22,2,4,128,255,128,114,156, - 0,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,42,0,0, - 0,124,0,100,1,100,2,133,2,25,0,124,1,107,3,114, - 38,116,0,100,3,124,2,155,2,157,2,102,1,105,0,124, - 3,164,1,142,1,130,1,100,4,83,0,41,5,97,243,1, - 0,0,86,97,108,105,100,97,116,101,32,97,32,104,97,115, - 104,45,98,97,115,101,100,32,112,121,99,32,98,121,32,99, - 104,101,99,107,105,110,103,32,116,104,101,32,114,101,97,108, - 32,115,111,117,114,99,101,32,104,97,115,104,32,97,103,97, - 105,110,115,116,32,116,104,101,32,111,110,101,32,105,110,10, - 32,32,32,32,116,104,101,32,112,121,99,32,104,101,97,100, - 101,114,46,10,10,32,32,32,32,42,100,97,116,97,42,32, + 0,67,0,0,0,115,166,0,0,0,124,0,100,1,100,2, + 133,2,25,0,125,3,124,3,116,0,107,3,114,64,100,3, + 124,1,155,2,100,4,124,3,155,2,157,4,125,4,116,1, + 160,2,100,5,124,4,161,2,1,0,116,3,124,4,102,1, + 105,0,124,2,164,1,142,1,130,1,116,4,124,0,131,1, + 100,6,107,0,114,106,100,7,124,1,155,2,157,2,125,4, + 116,1,160,2,100,5,124,4,161,2,1,0,116,5,124,4, + 131,1,130,1,116,6,124,0,100,2,100,8,133,2,25,0, + 131,1,125,5,124,5,100,9,64,0,114,162,100,10,124,5, + 155,2,100,11,124,1,155,2,157,4,125,4,116,3,124,4, + 102,1,105,0,124,2,164,1,142,1,130,1,124,5,83,0, + 41,12,97,84,2,0,0,80,101,114,102,111,114,109,32,98, + 97,115,105,99,32,118,97,108,105,100,105,116,121,32,99,104, + 101,99,107,105,110,103,32,111,102,32,97,32,112,121,99,32, + 104,101,97,100,101,114,32,97,110,100,32,114,101,116,117,114, + 110,32,116,104,101,32,102,108,97,103,115,32,102,105,101,108, + 100,44,10,32,32,32,32,119,104,105,99,104,32,100,101,116, + 101,114,109,105,110,101,115,32,104,111,119,32,116,104,101,32, + 112,121,99,32,115,104,111,117,108,100,32,98,101,32,102,117, + 114,116,104,101,114,32,118,97,108,105,100,97,116,101,100,32, + 97,103,97,105,110,115,116,32,116,104,101,32,115,111,117,114, + 99,101,46,10,10,32,32,32,32,42,100,97,116,97,42,32, 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32, 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46, 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116, 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32, - 32,32,114,101,113,117,105,114,101,100,46,41,10,10,32,32, - 32,32,42,115,111,117,114,99,101,95,104,97,115,104,42,32, - 105,115,32,116,104,101,32,105,109,112,111,114,116,108,105,98, - 46,117,116,105,108,46,115,111,117,114,99,101,95,104,97,115, - 104,40,41,32,111,102,32,116,104,101,32,115,111,117,114,99, - 101,32,102,105,108,101,46,10,10,32,32,32,32,42,110,97, - 109,101,42,32,105,115,32,116,104,101,32,110,97,109,101,32, - 111,102,32,116,104,101,32,109,111,100,117,108,101,32,98,101, - 105,110,103,32,105,109,112,111,114,116,101,100,46,32,73,116, - 32,105,115,32,117,115,101,100,32,102,111,114,32,108,111,103, - 103,105,110,103,46,10,10,32,32,32,32,42,101,120,99,95, - 100,101,116,97,105,108,115,42,32,105,115,32,97,32,100,105, - 99,116,105,111,110,97,114,121,32,112,97,115,115,101,100,32, - 116,111,32,73,109,112,111,114,116,69,114,114,111,114,32,105, - 102,32,105,116,32,114,97,105,115,101,100,32,102,111,114,10, - 32,32,32,32,105,109,112,114,111,118,101,100,32,100,101,98, - 117,103,103,105,110,103,46,10,10,32,32,32,32,65,110,32, - 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114, - 97,105,115,101,100,32,105,102,32,116,104,101,32,98,121,116, - 101,99,111,100,101,32,105,115,32,115,116,97,108,101,46,10, - 10,32,32,32,32,114,146,0,0,0,114,145,0,0,0,122, - 46,104,97,115,104,32,105,110,32,98,121,116,101,99,111,100, - 101,32,100,111,101,115,110,39,116,32,109,97,116,99,104,32, - 104,97,115,104,32,111,102,32,115,111,117,114,99,101,32,78, - 41,1,114,117,0,0,0,41,4,114,26,0,0,0,218,11, - 115,111,117,114,99,101,95,104,97,115,104,114,116,0,0,0, - 114,151,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,18,95,118,97,108,105,100,97,116,101,95, - 104,97,115,104,95,112,121,99,51,2,0,0,115,16,0,0, - 0,16,17,2,1,8,1,4,255,2,2,6,254,4,128,255, - 128,114,158,0,0,0,99,4,0,0,0,0,0,0,0,0, - 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, - 80,0,0,0,116,0,160,1,124,0,161,1,125,4,116,2, - 124,4,116,3,131,2,114,56,116,4,160,5,100,1,124,2, - 161,2,1,0,124,3,100,2,117,1,114,52,116,6,160,7, - 124,4,124,3,161,2,1,0,124,4,83,0,116,8,100,3, - 160,9,124,2,161,1,124,1,124,2,100,4,141,3,130,1, - 100,2,83,0,41,5,122,35,67,111,109,112,105,108,101,32, - 98,121,116,101,99,111,100,101,32,97,115,32,102,111,117,110, - 100,32,105,110,32,97,32,112,121,99,46,122,21,99,111,100, - 101,32,111,98,106,101,99,116,32,102,114,111,109,32,123,33, - 114,125,78,122,23,78,111,110,45,99,111,100,101,32,111,98, - 106,101,99,116,32,105,110,32,123,33,114,125,169,2,114,116, - 0,0,0,114,44,0,0,0,41,10,218,7,109,97,114,115, - 104,97,108,90,5,108,111,97,100,115,218,10,105,115,105,110, - 115,116,97,110,99,101,218,10,95,99,111,100,101,95,116,121, - 112,101,114,134,0,0,0,114,149,0,0,0,218,4,95,105, - 109,112,90,16,95,102,105,120,95,99,111,95,102,105,108,101, - 110,97,109,101,114,117,0,0,0,114,62,0,0,0,41,5, - 114,26,0,0,0,114,116,0,0,0,114,106,0,0,0,114, - 107,0,0,0,218,4,99,111,100,101,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,17,95,99,111,109,112, - 105,108,101,95,98,121,116,101,99,111,100,101,75,2,0,0, - 115,22,0,0,0,10,2,10,1,12,1,8,1,12,1,4, - 1,10,2,4,1,6,255,4,128,255,128,114,165,0,0,0, + 32,32,114,101,113,117,105,114,101,100,44,32,116,104,111,117, + 103,104,46,41,10,10,32,32,32,32,42,110,97,109,101,42, + 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, + 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103, + 32,105,109,112,111,114,116,101,100,46,32,73,116,32,105,115, + 32,117,115,101,100,32,102,111,114,32,108,111,103,103,105,110, + 103,46,10,10,32,32,32,32,42,101,120,99,95,100,101,116, + 97,105,108,115,42,32,105,115,32,97,32,100,105,99,116,105, + 111,110,97,114,121,32,112,97,115,115,101,100,32,116,111,32, + 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105, + 116,32,114,97,105,115,101,100,32,102,111,114,10,32,32,32, + 32,105,109,112,114,111,118,101,100,32,100,101,98,117,103,103, + 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,119,104,101,110,32,116,104,101,32,102, + 108,97,103,115,10,32,32,32,32,102,105,101,108,100,32,105, + 115,32,105,110,118,97,108,105,100,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,32,116,114,117,110,99, + 97,116,101,100,46,10,10,32,32,32,32,78,114,16,0,0, + 0,122,20,98,97,100,32,109,97,103,105,99,32,110,117,109, + 98,101,114,32,105,110,32,122,2,58,32,250,2,123,125,233, + 16,0,0,0,122,40,114,101,97,99,104,101,100,32,69,79, + 70,32,119,104,105,108,101,32,114,101,97,100,105,110,103,32, + 112,121,99,32,104,101,97,100,101,114,32,111,102,32,233,8, + 0,0,0,233,252,255,255,255,122,14,105,110,118,97,108,105, + 100,32,102,108,97,103,115,32,122,4,32,105,110,32,41,7, + 218,12,77,65,71,73,67,95,78,85,77,66,69,82,114,134, + 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, + 115,115,97,103,101,114,117,0,0,0,114,23,0,0,0,218, + 8,69,79,70,69,114,114,111,114,114,27,0,0,0,41,6, + 114,26,0,0,0,114,116,0,0,0,218,11,101,120,99,95, + 100,101,116,97,105,108,115,90,5,109,97,103,105,99,114,92, + 0,0,0,114,2,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,13,95,99,108,97,115,115,105, + 102,121,95,112,121,99,246,1,0,0,115,30,0,0,0,12, + 16,8,1,16,1,12,1,16,1,12,1,10,1,12,1,8, + 1,16,1,8,2,16,1,16,1,4,1,255,128,114,152,0, + 0,0,99,5,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,4,0,0,0,67,0,0,0,115,120,0,0,0, + 116,0,124,0,100,1,100,2,133,2,25,0,131,1,124,1, + 100,3,64,0,107,3,114,62,100,4,124,3,155,2,157,2, + 125,5,116,1,160,2,100,5,124,5,161,2,1,0,116,3, + 124,5,102,1,105,0,124,4,164,1,142,1,130,1,124,2, + 100,6,117,1,114,116,116,0,124,0,100,2,100,7,133,2, + 25,0,131,1,124,2,100,3,64,0,107,3,114,116,116,3, + 100,4,124,3,155,2,157,2,102,1,105,0,124,4,164,1, + 142,1,130,1,100,6,83,0,41,8,97,7,2,0,0,86, + 97,108,105,100,97,116,101,32,97,32,112,121,99,32,97,103, + 97,105,110,115,116,32,116,104,101,32,115,111,117,114,99,101, + 32,108,97,115,116,45,109,111,100,105,102,105,101,100,32,116, + 105,109,101,46,10,10,32,32,32,32,42,100,97,116,97,42, + 32,105,115,32,116,104,101,32,99,111,110,116,101,110,116,115, + 32,111,102,32,116,104,101,32,112,121,99,32,102,105,108,101, + 46,32,40,79,110,108,121,32,116,104,101,32,102,105,114,115, + 116,32,49,54,32,98,121,116,101,115,32,97,114,101,10,32, + 32,32,32,114,101,113,117,105,114,101,100,46,41,10,10,32, + 32,32,32,42,115,111,117,114,99,101,95,109,116,105,109,101, + 42,32,105,115,32,116,104,101,32,108,97,115,116,32,109,111, + 100,105,102,105,101,100,32,116,105,109,101,115,116,97,109,112, + 32,111,102,32,116,104,101,32,115,111,117,114,99,101,32,102, + 105,108,101,46,10,10,32,32,32,32,42,115,111,117,114,99, + 101,95,115,105,122,101,42,32,105,115,32,78,111,110,101,32, + 111,114,32,116,104,101,32,115,105,122,101,32,111,102,32,116, + 104,101,32,115,111,117,114,99,101,32,102,105,108,101,32,105, + 110,32,98,121,116,101,115,46,10,10,32,32,32,32,42,110, + 97,109,101,42,32,105,115,32,116,104,101,32,110,97,109,101, + 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,98, + 101,105,110,103,32,105,109,112,111,114,116,101,100,46,32,73, + 116,32,105,115,32,117,115,101,100,32,102,111,114,32,108,111, + 103,103,105,110,103,46,10,10,32,32,32,32,42,101,120,99, + 95,100,101,116,97,105,108,115,42,32,105,115,32,97,32,100, + 105,99,116,105,111,110,97,114,121,32,112,97,115,115,101,100, + 32,116,111,32,73,109,112,111,114,116,69,114,114,111,114,32, + 105,102,32,105,116,32,114,97,105,115,101,100,32,102,111,114, + 10,32,32,32,32,105,109,112,114,111,118,101,100,32,100,101, + 98,117,103,103,105,110,103,46,10,10,32,32,32,32,65,110, + 32,73,109,112,111,114,116,69,114,114,111,114,32,105,115,32, + 114,97,105,115,101,100,32,105,102,32,116,104,101,32,98,121, + 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,46, + 10,10,32,32,32,32,114,146,0,0,0,233,12,0,0,0, + 114,15,0,0,0,122,22,98,121,116,101,99,111,100,101,32, + 105,115,32,115,116,97,108,101,32,102,111,114,32,114,144,0, + 0,0,78,114,145,0,0,0,41,4,114,27,0,0,0,114, + 134,0,0,0,114,149,0,0,0,114,117,0,0,0,41,6, + 114,26,0,0,0,218,12,115,111,117,114,99,101,95,109,116, + 105,109,101,218,11,115,111,117,114,99,101,95,115,105,122,101, + 114,116,0,0,0,114,151,0,0,0,114,92,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,23, + 95,118,97,108,105,100,97,116,101,95,116,105,109,101,115,116, + 97,109,112,95,112,121,99,23,2,0,0,115,20,0,0,0, + 24,19,10,1,12,1,16,1,8,1,22,1,2,255,22,2, + 4,128,255,128,114,156,0,0,0,99,4,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, + 0,0,115,42,0,0,0,124,0,100,1,100,2,133,2,25, + 0,124,1,107,3,114,38,116,0,100,3,124,2,155,2,157, + 2,102,1,105,0,124,3,164,1,142,1,130,1,100,4,83, + 0,41,5,97,243,1,0,0,86,97,108,105,100,97,116,101, + 32,97,32,104,97,115,104,45,98,97,115,101,100,32,112,121, + 99,32,98,121,32,99,104,101,99,107,105,110,103,32,116,104, + 101,32,114,101,97,108,32,115,111,117,114,99,101,32,104,97, + 115,104,32,97,103,97,105,110,115,116,32,116,104,101,32,111, + 110,101,32,105,110,10,32,32,32,32,116,104,101,32,112,121, + 99,32,104,101,97,100,101,114,46,10,10,32,32,32,32,42, + 100,97,116,97,42,32,105,115,32,116,104,101,32,99,111,110, + 116,101,110,116,115,32,111,102,32,116,104,101,32,112,121,99, + 32,102,105,108,101,46,32,40,79,110,108,121,32,116,104,101, + 32,102,105,114,115,116,32,49,54,32,98,121,116,101,115,32, + 97,114,101,10,32,32,32,32,114,101,113,117,105,114,101,100, + 46,41,10,10,32,32,32,32,42,115,111,117,114,99,101,95, + 104,97,115,104,42,32,105,115,32,116,104,101,32,105,109,112, + 111,114,116,108,105,98,46,117,116,105,108,46,115,111,117,114, + 99,101,95,104,97,115,104,40,41,32,111,102,32,116,104,101, + 32,115,111,117,114,99,101,32,102,105,108,101,46,10,10,32, + 32,32,32,42,110,97,109,101,42,32,105,115,32,116,104,101, + 32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,100, + 117,108,101,32,98,101,105,110,103,32,105,109,112,111,114,116, + 101,100,46,32,73,116,32,105,115,32,117,115,101,100,32,102, + 111,114,32,108,111,103,103,105,110,103,46,10,10,32,32,32, + 32,42,101,120,99,95,100,101,116,97,105,108,115,42,32,105, + 115,32,97,32,100,105,99,116,105,111,110,97,114,121,32,112, + 97,115,115,101,100,32,116,111,32,73,109,112,111,114,116,69, + 114,114,111,114,32,105,102,32,105,116,32,114,97,105,115,101, + 100,32,102,111,114,10,32,32,32,32,105,109,112,114,111,118, + 101,100,32,100,101,98,117,103,103,105,110,103,46,10,10,32, + 32,32,32,65,110,32,73,109,112,111,114,116,69,114,114,111, + 114,32,105,115,32,114,97,105,115,101,100,32,105,102,32,116, + 104,101,32,98,121,116,101,99,111,100,101,32,105,115,32,115, + 116,97,108,101,46,10,10,32,32,32,32,114,146,0,0,0, + 114,145,0,0,0,122,46,104,97,115,104,32,105,110,32,98, + 121,116,101,99,111,100,101,32,100,111,101,115,110,39,116,32, + 109,97,116,99,104,32,104,97,115,104,32,111,102,32,115,111, + 117,114,99,101,32,78,41,1,114,117,0,0,0,41,4,114, + 26,0,0,0,218,11,115,111,117,114,99,101,95,104,97,115, + 104,114,116,0,0,0,114,151,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,18,95,118,97,108, + 105,100,97,116,101,95,104,97,115,104,95,112,121,99,51,2, + 0,0,115,16,0,0,0,16,17,2,1,8,1,4,255,2, + 2,6,254,4,128,255,128,114,158,0,0,0,99,4,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0, + 0,67,0,0,0,115,76,0,0,0,116,0,160,1,124,0, + 161,1,125,4,116,2,124,4,116,3,131,2,114,56,116,4, + 160,5,100,1,124,2,161,2,1,0,124,3,100,2,117,1, + 114,52,116,6,160,7,124,4,124,3,161,2,1,0,124,4, + 83,0,116,8,100,3,160,9,124,2,161,1,124,1,124,2, + 100,4,141,3,130,1,41,5,122,35,67,111,109,112,105,108, + 101,32,98,121,116,101,99,111,100,101,32,97,115,32,102,111, + 117,110,100,32,105,110,32,97,32,112,121,99,46,122,21,99, + 111,100,101,32,111,98,106,101,99,116,32,102,114,111,109,32, + 123,33,114,125,78,122,23,78,111,110,45,99,111,100,101,32, + 111,98,106,101,99,116,32,105,110,32,123,33,114,125,169,2, + 114,116,0,0,0,114,44,0,0,0,41,10,218,7,109,97, + 114,115,104,97,108,90,5,108,111,97,100,115,218,10,105,115, + 105,110,115,116,97,110,99,101,218,10,95,99,111,100,101,95, + 116,121,112,101,114,134,0,0,0,114,149,0,0,0,218,4, + 95,105,109,112,90,16,95,102,105,120,95,99,111,95,102,105, + 108,101,110,97,109,101,114,117,0,0,0,114,62,0,0,0, + 41,5,114,26,0,0,0,114,116,0,0,0,114,106,0,0, + 0,114,107,0,0,0,218,4,99,111,100,101,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,17,95,99,111, + 109,112,105,108,101,95,98,121,116,101,99,111,100,101,75,2, + 0,0,115,20,0,0,0,10,2,10,1,12,1,8,1,12, + 1,4,1,10,2,4,1,6,255,255,128,114,165,0,0,0, 114,73,0,0,0,99,3,0,0,0,0,0,0,0,0,0, 0,0,4,0,0,0,5,0,0,0,67,0,0,0,115,70, 0,0,0,116,0,116,1,131,1,125,3,124,3,160,2,116, @@ -902,1175 +902,1174 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,169,2,114,140,0,0,0,218,26,115,117,98,109,111,100, 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, 105,111,110,115,99,2,0,0,0,0,0,0,0,2,0,0, - 0,9,0,0,0,8,0,0,0,67,0,0,0,115,10,1, + 0,9,0,0,0,8,0,0,0,67,0,0,0,115,8,1, 0,0,124,1,100,1,117,0,114,56,100,2,125,1,116,0, 124,2,100,3,131,2,114,66,122,14,124,2,160,1,124,0, 161,1,125,1,87,0,110,28,4,0,116,2,121,54,1,0, 1,0,1,0,89,0,110,12,48,0,116,3,160,4,124,1, 161,1,125,1,116,5,106,6,124,0,124,2,124,1,100,4, 141,3,125,4,100,5,124,4,95,7,124,2,100,1,117,0, - 114,150,116,8,131,0,68,0,93,42,92,2,125,5,125,6, + 114,148,116,8,131,0,68,0,93,40,92,2,125,5,125,6, 124,1,160,9,116,10,124,6,131,1,161,1,114,102,124,5, 124,0,124,1,131,2,125,2,124,2,124,4,95,11,1,0, - 113,150,113,102,100,1,83,0,124,3,116,12,117,0,114,214, - 116,0,124,2,100,6,131,2,114,220,122,14,124,2,160,13, - 124,0,161,1,125,7,87,0,110,18,4,0,116,2,121,200, - 1,0,1,0,1,0,89,0,110,20,48,0,124,7,114,220, - 103,0,124,4,95,14,110,6,124,3,124,4,95,14,124,4, - 106,14,103,0,107,2,144,1,114,6,124,1,144,1,114,6, - 116,15,124,1,131,1,100,7,25,0,125,8,124,4,106,14, - 160,16,124,8,161,1,1,0,124,4,83,0,41,8,97,61, - 1,0,0,82,101,116,117,114,110,32,97,32,109,111,100,117, - 108,101,32,115,112,101,99,32,98,97,115,101,100,32,111,110, - 32,97,32,102,105,108,101,32,108,111,99,97,116,105,111,110, - 46,10,10,32,32,32,32,84,111,32,105,110,100,105,99,97, - 116,101,32,116,104,97,116,32,116,104,101,32,109,111,100,117, - 108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,44, - 32,115,101,116,10,32,32,32,32,115,117,98,109,111,100,117, - 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, - 111,110,115,32,116,111,32,97,32,108,105,115,116,32,111,102, - 32,100,105,114,101,99,116,111,114,121,32,112,97,116,104,115, - 46,32,32,65,110,10,32,32,32,32,101,109,112,116,121,32, - 108,105,115,116,32,105,115,32,115,117,102,102,105,99,105,101, - 110,116,44,32,116,104,111,117,103,104,32,105,116,115,32,110, - 111,116,32,111,116,104,101,114,119,105,115,101,32,117,115,101, - 102,117,108,32,116,111,32,116,104,101,10,32,32,32,32,105, - 109,112,111,114,116,32,115,121,115,116,101,109,46,10,10,32, - 32,32,32,84,104,101,32,108,111,97,100,101,114,32,109,117, - 115,116,32,116,97,107,101,32,97,32,115,112,101,99,32,97, - 115,32,105,116,115,32,111,110,108,121,32,95,95,105,110,105, - 116,95,95,40,41,32,97,114,103,46,10,10,32,32,32,32, - 78,122,9,60,117,110,107,110,111,119,110,62,218,12,103,101, - 116,95,102,105,108,101,110,97,109,101,169,1,218,6,111,114, - 105,103,105,110,84,218,10,105,115,95,112,97,99,107,97,103, - 101,114,73,0,0,0,41,17,114,128,0,0,0,114,179,0, - 0,0,114,117,0,0,0,114,4,0,0,0,114,79,0,0, - 0,114,134,0,0,0,218,10,77,111,100,117,108,101,83,112, - 101,99,90,13,95,115,101,116,95,102,105,108,101,97,116,116, - 114,218,27,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,114,110, - 0,0,0,114,111,0,0,0,114,140,0,0,0,218,9,95, - 80,79,80,85,76,65,84,69,114,182,0,0,0,114,178,0, - 0,0,114,47,0,0,0,218,6,97,112,112,101,110,100,41, - 9,114,116,0,0,0,90,8,108,111,99,97,116,105,111,110, - 114,140,0,0,0,114,178,0,0,0,218,4,115,112,101,99, - 218,12,108,111,97,100,101,114,95,99,108,97,115,115,218,8, - 115,117,102,102,105,120,101,115,114,182,0,0,0,90,7,100, - 105,114,110,97,109,101,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,23,115,112,101,99,95,102,114,111,109, - 95,102,105,108,101,95,108,111,99,97,116,105,111,110,126,2, - 0,0,115,64,0,0,0,8,12,4,4,10,1,2,2,14, - 1,12,1,6,1,10,2,16,8,6,1,8,3,14,1,14, - 1,10,1,6,1,6,1,4,2,8,3,10,2,2,1,14, - 1,12,1,6,1,4,2,8,1,6,2,12,1,6,1,12, - 1,12,1,4,2,255,128,114,190,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,64,0,0,0,115,80,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,90,4,100,3,90,5,100,4, - 90,6,101,7,100,5,100,6,132,0,131,1,90,8,101,7, - 100,7,100,8,132,0,131,1,90,9,101,7,100,14,100,10, - 100,11,132,1,131,1,90,10,101,7,100,15,100,12,100,13, - 132,1,131,1,90,11,100,9,83,0,41,16,218,21,87,105, - 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, - 100,101,114,122,62,77,101,116,97,32,112,97,116,104,32,102, - 105,110,100,101,114,32,102,111,114,32,109,111,100,117,108,101, - 115,32,100,101,99,108,97,114,101,100,32,105,110,32,116,104, - 101,32,87,105,110,100,111,119,115,32,114,101,103,105,115,116, - 114,121,46,122,59,83,111,102,116,119,97,114,101,92,80,121, - 116,104,111,110,92,80,121,116,104,111,110,67,111,114,101,92, - 123,115,121,115,95,118,101,114,115,105,111,110,125,92,77,111, - 100,117,108,101,115,92,123,102,117,108,108,110,97,109,101,125, - 122,65,83,111,102,116,119,97,114,101,92,80,121,116,104,111, - 110,92,80,121,116,104,111,110,67,111,114,101,92,123,115,121, - 115,95,118,101,114,115,105,111,110,125,92,77,111,100,117,108, - 101,115,92,123,102,117,108,108,110,97,109,101,125,92,68,101, - 98,117,103,70,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,8,0,0,0,67,0,0,0,115,50,0, - 0,0,122,16,116,0,160,1,116,0,106,2,124,1,161,2, - 87,0,83,0,4,0,116,3,121,48,1,0,1,0,1,0, - 116,0,160,1,116,0,106,4,124,1,161,2,6,0,89,0, - 83,0,48,0,114,109,0,0,0,41,5,218,6,119,105,110, - 114,101,103,90,7,79,112,101,110,75,101,121,90,17,72,75, - 69,89,95,67,85,82,82,69,78,84,95,85,83,69,82,114, - 50,0,0,0,90,18,72,75,69,89,95,76,79,67,65,76, - 95,77,65,67,72,73,78,69,41,2,218,3,99,108,115,114, - 7,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,14,95,111,112,101,110,95,114,101,103,105,115, - 116,114,121,206,2,0,0,115,10,0,0,0,2,2,16,1, - 12,1,20,1,255,128,122,36,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,2,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,8,0,0, - 0,67,0,0,0,115,132,0,0,0,124,0,106,0,114,14, - 124,0,106,1,125,2,110,6,124,0,106,2,125,2,124,2, - 106,3,124,1,100,1,116,4,106,5,100,0,100,2,133,2, - 25,0,22,0,100,3,141,2,125,3,122,58,124,0,160,6, - 124,3,161,1,143,28,125,4,116,7,160,8,124,4,100,4, - 161,2,125,5,87,0,100,0,4,0,4,0,131,3,1,0, - 110,16,49,0,115,94,48,0,1,0,1,0,1,0,89,0, - 1,0,87,0,110,20,4,0,116,9,121,126,1,0,1,0, - 1,0,89,0,100,0,83,0,48,0,124,5,83,0,41,5, - 78,122,5,37,100,46,37,100,114,28,0,0,0,41,2,114, - 139,0,0,0,90,11,115,121,115,95,118,101,114,115,105,111, - 110,114,40,0,0,0,41,10,218,11,68,69,66,85,71,95, - 66,85,73,76,68,218,18,82,69,71,73,83,84,82,89,95, - 75,69,89,95,68,69,66,85,71,218,12,82,69,71,73,83, - 84,82,89,95,75,69,89,114,62,0,0,0,114,1,0,0, - 0,218,12,118,101,114,115,105,111,110,95,105,110,102,111,114, - 194,0,0,0,114,192,0,0,0,90,10,81,117,101,114,121, - 86,97,108,117,101,114,50,0,0,0,41,6,114,193,0,0, - 0,114,139,0,0,0,90,12,114,101,103,105,115,116,114,121, - 95,107,101,121,114,7,0,0,0,90,4,104,107,101,121,218, - 8,102,105,108,101,112,97,116,104,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,16,95,115,101,97,114,99, - 104,95,114,101,103,105,115,116,114,121,213,2,0,0,115,26, - 0,0,0,6,2,8,1,6,2,6,1,16,1,6,255,2, - 2,12,1,46,1,12,1,8,1,4,1,255,128,122,38,87, - 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, - 110,100,101,114,46,95,115,101,97,114,99,104,95,114,101,103, - 105,115,116,114,121,78,99,4,0,0,0,0,0,0,0,0, - 0,0,0,8,0,0,0,8,0,0,0,67,0,0,0,115, - 118,0,0,0,124,0,160,0,124,1,161,1,125,4,124,4, - 100,0,117,0,114,22,100,0,83,0,122,12,116,1,124,4, - 131,1,1,0,87,0,110,20,4,0,116,2,121,54,1,0, - 1,0,1,0,89,0,100,0,83,0,48,0,116,3,131,0, - 68,0,93,50,92,2,125,5,125,6,124,4,160,4,116,5, - 124,6,131,1,161,1,114,62,116,6,106,7,124,1,124,5, - 124,1,124,4,131,2,124,4,100,1,141,3,125,7,124,7, - 2,0,1,0,83,0,100,0,83,0,41,2,78,114,180,0, - 0,0,41,8,114,200,0,0,0,114,49,0,0,0,114,50, - 0,0,0,114,184,0,0,0,114,110,0,0,0,114,111,0, - 0,0,114,134,0,0,0,218,16,115,112,101,99,95,102,114, - 111,109,95,108,111,97,100,101,114,41,8,114,193,0,0,0, - 114,139,0,0,0,114,44,0,0,0,218,6,116,97,114,103, - 101,116,114,199,0,0,0,114,140,0,0,0,114,189,0,0, - 0,114,187,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,9,102,105,110,100,95,115,112,101,99, - 228,2,0,0,115,32,0,0,0,10,2,8,1,4,1,2, - 1,12,1,12,1,8,1,14,1,14,1,6,1,8,1,2, - 1,6,254,8,3,4,128,255,128,122,31,87,105,110,100,111, + 113,148,100,1,83,0,124,3,116,12,117,0,114,212,116,0, + 124,2,100,6,131,2,114,218,122,14,124,2,160,13,124,0, + 161,1,125,7,87,0,110,18,4,0,116,2,121,198,1,0, + 1,0,1,0,89,0,110,20,48,0,124,7,114,218,103,0, + 124,4,95,14,110,6,124,3,124,4,95,14,124,4,106,14, + 103,0,107,2,144,1,114,4,124,1,144,1,114,4,116,15, + 124,1,131,1,100,7,25,0,125,8,124,4,106,14,160,16, + 124,8,161,1,1,0,124,4,83,0,41,8,97,61,1,0, + 0,82,101,116,117,114,110,32,97,32,109,111,100,117,108,101, + 32,115,112,101,99,32,98,97,115,101,100,32,111,110,32,97, + 32,102,105,108,101,32,108,111,99,97,116,105,111,110,46,10, + 10,32,32,32,32,84,111,32,105,110,100,105,99,97,116,101, + 32,116,104,97,116,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,97,32,112,97,99,107,97,103,101,44,32,115, + 101,116,10,32,32,32,32,115,117,98,109,111,100,117,108,101, + 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, + 115,32,116,111,32,97,32,108,105,115,116,32,111,102,32,100, + 105,114,101,99,116,111,114,121,32,112,97,116,104,115,46,32, + 32,65,110,10,32,32,32,32,101,109,112,116,121,32,108,105, + 115,116,32,105,115,32,115,117,102,102,105,99,105,101,110,116, + 44,32,116,104,111,117,103,104,32,105,116,115,32,110,111,116, + 32,111,116,104,101,114,119,105,115,101,32,117,115,101,102,117, + 108,32,116,111,32,116,104,101,10,32,32,32,32,105,109,112, + 111,114,116,32,115,121,115,116,101,109,46,10,10,32,32,32, + 32,84,104,101,32,108,111,97,100,101,114,32,109,117,115,116, + 32,116,97,107,101,32,97,32,115,112,101,99,32,97,115,32, + 105,116,115,32,111,110,108,121,32,95,95,105,110,105,116,95, + 95,40,41,32,97,114,103,46,10,10,32,32,32,32,78,122, + 9,60,117,110,107,110,111,119,110,62,218,12,103,101,116,95, + 102,105,108,101,110,97,109,101,169,1,218,6,111,114,105,103, + 105,110,84,218,10,105,115,95,112,97,99,107,97,103,101,114, + 73,0,0,0,41,17,114,128,0,0,0,114,179,0,0,0, + 114,117,0,0,0,114,4,0,0,0,114,79,0,0,0,114, + 134,0,0,0,218,10,77,111,100,117,108,101,83,112,101,99, + 90,13,95,115,101,116,95,102,105,108,101,97,116,116,114,218, + 27,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,114,110,0,0, + 0,114,111,0,0,0,114,140,0,0,0,218,9,95,80,79, + 80,85,76,65,84,69,114,182,0,0,0,114,178,0,0,0, + 114,47,0,0,0,218,6,97,112,112,101,110,100,41,9,114, + 116,0,0,0,90,8,108,111,99,97,116,105,111,110,114,140, + 0,0,0,114,178,0,0,0,218,4,115,112,101,99,218,12, + 108,111,97,100,101,114,95,99,108,97,115,115,218,8,115,117, + 102,102,105,120,101,115,114,182,0,0,0,90,7,100,105,114, + 110,97,109,101,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,23,115,112,101,99,95,102,114,111,109,95,102, + 105,108,101,95,108,111,99,97,116,105,111,110,126,2,0,0, + 115,64,0,0,0,8,12,4,4,10,1,2,2,14,1,12, + 1,6,1,10,2,16,8,6,1,8,3,14,1,14,1,10, + 1,6,1,4,1,4,2,8,3,10,2,2,1,14,1,12, + 1,6,1,4,2,8,1,6,2,12,1,6,1,12,1,12, + 1,4,2,255,128,114,190,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, + 0,0,0,115,80,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,90,4,100,3,90,5,100,4,90,6, + 101,7,100,5,100,6,132,0,131,1,90,8,101,7,100,7, + 100,8,132,0,131,1,90,9,101,7,100,14,100,10,100,11, + 132,1,131,1,90,10,101,7,100,15,100,12,100,13,132,1, + 131,1,90,11,100,9,83,0,41,16,218,21,87,105,110,100, + 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, + 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, + 100,101,114,32,102,111,114,32,109,111,100,117,108,101,115,32, + 100,101,99,108,97,114,101,100,32,105,110,32,116,104,101,32, + 87,105,110,100,111,119,115,32,114,101,103,105,115,116,114,121, + 46,122,59,83,111,102,116,119,97,114,101,92,80,121,116,104, + 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, + 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, + 108,101,115,92,123,102,117,108,108,110,97,109,101,125,122,65, + 83,111,102,116,119,97,114,101,92,80,121,116,104,111,110,92, + 80,121,116,104,111,110,67,111,114,101,92,123,115,121,115,95, + 118,101,114,115,105,111,110,125,92,77,111,100,117,108,101,115, + 92,123,102,117,108,108,110,97,109,101,125,92,68,101,98,117, + 103,70,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,8,0,0,0,67,0,0,0,115,50,0,0,0, + 122,16,116,0,160,1,116,0,106,2,124,1,161,2,87,0, + 83,0,4,0,116,3,121,48,1,0,1,0,1,0,116,0, + 160,1,116,0,106,4,124,1,161,2,6,0,89,0,83,0, + 48,0,114,109,0,0,0,41,5,218,6,119,105,110,114,101, + 103,90,7,79,112,101,110,75,101,121,90,17,72,75,69,89, + 95,67,85,82,82,69,78,84,95,85,83,69,82,114,50,0, + 0,0,90,18,72,75,69,89,95,76,79,67,65,76,95,77, + 65,67,72,73,78,69,41,2,218,3,99,108,115,114,7,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,14,95,111,112,101,110,95,114,101,103,105,115,116,114, + 121,206,2,0,0,115,10,0,0,0,2,2,16,1,12,1, + 20,1,255,128,122,36,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,2,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,8,0,0,0,67, + 0,0,0,115,130,0,0,0,124,0,106,0,114,14,124,0, + 106,1,125,2,110,6,124,0,106,2,125,2,124,2,106,3, + 124,1,100,1,116,4,106,5,100,0,100,2,133,2,25,0, + 22,0,100,3,141,2,125,3,122,60,124,0,160,6,124,3, + 161,1,143,28,125,4,116,7,160,8,124,4,100,4,161,2, + 125,5,87,0,100,0,4,0,4,0,131,3,1,0,110,16, + 49,0,115,94,48,0,1,0,1,0,1,0,89,0,1,0, + 87,0,124,5,83,0,4,0,116,9,121,128,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,41,5,78,122,5,37, + 100,46,37,100,114,28,0,0,0,41,2,114,139,0,0,0, + 90,11,115,121,115,95,118,101,114,115,105,111,110,114,40,0, + 0,0,41,10,218,11,68,69,66,85,71,95,66,85,73,76, + 68,218,18,82,69,71,73,83,84,82,89,95,75,69,89,95, + 68,69,66,85,71,218,12,82,69,71,73,83,84,82,89,95, + 75,69,89,114,62,0,0,0,114,1,0,0,0,218,12,118, + 101,114,115,105,111,110,95,105,110,102,111,114,194,0,0,0, + 114,192,0,0,0,90,10,81,117,101,114,121,86,97,108,117, + 101,114,50,0,0,0,41,6,114,193,0,0,0,114,139,0, + 0,0,90,12,114,101,103,105,115,116,114,121,95,107,101,121, + 114,7,0,0,0,90,4,104,107,101,121,218,8,102,105,108, + 101,112,97,116,104,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,16,95,115,101,97,114,99,104,95,114,101, + 103,105,115,116,114,121,213,2,0,0,115,26,0,0,0,6, + 2,8,1,6,2,6,1,16,1,6,255,2,2,12,1,44, + 1,4,3,12,254,8,1,255,128,122,38,87,105,110,100,111, 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, - 46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, - 0,0,0,115,30,0,0,0,124,0,160,0,124,1,124,2, - 161,2,125,3,124,3,100,1,117,1,114,26,124,3,106,1, - 83,0,100,1,83,0,41,2,122,108,70,105,110,100,32,109, - 111,100,117,108,101,32,110,97,109,101,100,32,105,110,32,116, - 104,101,32,114,101,103,105,115,116,114,121,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, - 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,169,2,114,203,0,0,0,114,140, - 0,0,0,169,4,114,193,0,0,0,114,139,0,0,0,114, - 44,0,0,0,114,187,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,11,102,105,110,100,95,109, - 111,100,117,108,101,244,2,0,0,115,10,0,0,0,12,7, - 8,1,6,1,4,2,255,128,122,33,87,105,110,100,111,119, - 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, - 102,105,110,100,95,109,111,100,117,108,101,41,2,78,78,41, - 1,78,41,12,114,125,0,0,0,114,124,0,0,0,114,126, - 0,0,0,114,127,0,0,0,114,197,0,0,0,114,196,0, - 0,0,114,195,0,0,0,218,11,99,108,97,115,115,109,101, - 116,104,111,100,114,194,0,0,0,114,200,0,0,0,114,203, - 0,0,0,114,206,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,191,0,0, - 0,194,2,0,0,115,32,0,0,0,8,0,4,2,2,3, - 2,255,2,4,2,255,4,3,2,2,10,1,2,6,10,1, - 2,14,12,1,2,15,16,1,255,128,114,191,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,64,0,0,0,115,48,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, - 4,100,4,100,5,132,0,90,5,100,6,100,7,132,0,90, - 6,100,8,100,9,132,0,90,7,100,10,83,0,41,11,218, - 13,95,76,111,97,100,101,114,66,97,115,105,99,115,122,83, - 66,97,115,101,32,99,108,97,115,115,32,111,102,32,99,111, - 109,109,111,110,32,99,111,100,101,32,110,101,101,100,101,100, - 32,98,121,32,98,111,116,104,32,83,111,117,114,99,101,76, - 111,97,100,101,114,32,97,110,100,10,32,32,32,32,83,111, - 117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,100, - 101,114,46,99,2,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,4,0,0,0,67,0,0,0,115,64,0,0, - 0,116,0,124,0,160,1,124,1,161,1,131,1,100,1,25, - 0,125,2,124,2,160,2,100,2,100,1,161,2,100,3,25, - 0,125,3,124,1,160,3,100,2,161,1,100,4,25,0,125, - 4,124,3,100,5,107,2,111,62,124,4,100,5,107,3,83, - 0,41,6,122,141,67,111,110,99,114,101,116,101,32,105,109, - 112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32, - 73,110,115,112,101,99,116,76,111,97,100,101,114,46,105,115, - 95,112,97,99,107,97,103,101,32,98,121,32,99,104,101,99, - 107,105,110,103,32,105,102,10,32,32,32,32,32,32,32,32, - 116,104,101,32,112,97,116,104,32,114,101,116,117,114,110,101, - 100,32,98,121,32,103,101,116,95,102,105,108,101,110,97,109, - 101,32,104,97,115,32,97,32,102,105,108,101,110,97,109,101, - 32,111,102,32,39,95,95,105,110,105,116,95,95,46,112,121, - 39,46,114,39,0,0,0,114,71,0,0,0,114,73,0,0, - 0,114,28,0,0,0,218,8,95,95,105,110,105,116,95,95, - 41,4,114,47,0,0,0,114,179,0,0,0,114,43,0,0, - 0,114,41,0,0,0,41,5,114,118,0,0,0,114,139,0, - 0,0,114,96,0,0,0,90,13,102,105,108,101,110,97,109, - 101,95,98,97,115,101,90,9,116,97,105,108,95,110,97,109, - 101,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,182,0,0,0,7,3,0,0,115,10,0,0,0,18,3, - 16,1,14,1,16,1,255,128,122,24,95,76,111,97,100,101, - 114,66,97,115,105,99,115,46,105,115,95,112,97,99,107,97, - 103,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,169,2,122,42,85,115,101,32,100,101,102,97, - 117,108,116,32,115,101,109,97,110,116,105,99,115,32,102,111, - 114,32,109,111,100,117,108,101,32,99,114,101,97,116,105,111, - 110,46,78,114,5,0,0,0,169,2,114,118,0,0,0,114, - 187,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,13,99,114,101,97,116,101,95,109,111,100,117, - 108,101,15,3,0,0,115,4,0,0,0,4,128,255,128,122, - 27,95,76,111,97,100,101,114,66,97,115,105,99,115,46,99, - 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, - 0,67,0,0,0,115,56,0,0,0,124,0,160,0,124,1, - 106,1,161,1,125,2,124,2,100,1,117,0,114,36,116,2, - 100,2,160,3,124,1,106,1,161,1,131,1,130,1,116,4, - 160,5,116,6,124,2,124,1,106,7,161,3,1,0,100,1, - 83,0,41,3,122,19,69,120,101,99,117,116,101,32,116,104, - 101,32,109,111,100,117,108,101,46,78,122,52,99,97,110,110, - 111,116,32,108,111,97,100,32,109,111,100,117,108,101,32,123, - 33,114,125,32,119,104,101,110,32,103,101,116,95,99,111,100, - 101,40,41,32,114,101,116,117,114,110,115,32,78,111,110,101, - 41,8,218,8,103,101,116,95,99,111,100,101,114,125,0,0, - 0,114,117,0,0,0,114,62,0,0,0,114,134,0,0,0, - 218,25,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,218,4,101,120,101, - 99,114,131,0,0,0,41,3,114,118,0,0,0,218,6,109, - 111,100,117,108,101,114,164,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,11,101,120,101,99,95, - 109,111,100,117,108,101,18,3,0,0,115,16,0,0,0,12, - 2,8,1,6,1,4,1,6,255,16,2,4,128,255,128,122, - 25,95,76,111,97,100,101,114,66,97,115,105,99,115,46,101, - 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,12,0,0,0,116,0,160,1,124,0,124,1, - 161,2,83,0,41,1,122,26,84,104,105,115,32,109,111,100, - 117,108,101,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,41,2,114,134,0,0,0,218,17,95,108,111,97,100, - 95,109,111,100,117,108,101,95,115,104,105,109,169,2,114,118, - 0,0,0,114,139,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,11,108,111,97,100,95,109,111, - 100,117,108,101,26,3,0,0,115,4,0,0,0,12,2,255, - 128,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, - 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114, - 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, - 0,0,0,114,182,0,0,0,114,212,0,0,0,114,217,0, - 0,0,114,220,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,114,208,0,0,0, - 2,3,0,0,115,14,0,0,0,8,0,4,2,8,3,8, - 8,8,3,12,8,255,128,114,208,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,64,0,0,0,115,74,0,0,0,101,0,90,1,100,0, - 90,2,100,1,100,2,132,0,90,3,100,3,100,4,132,0, - 90,4,100,5,100,6,132,0,90,5,100,7,100,8,132,0, - 90,6,100,9,100,10,132,0,90,7,100,11,100,12,156,1, - 100,13,100,14,132,2,90,8,100,15,100,16,132,0,90,9, - 100,17,83,0,41,18,218,12,83,111,117,114,99,101,76,111, - 97,100,101,114,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,8,0, - 0,0,116,0,130,1,100,1,83,0,41,2,122,165,79,112, - 116,105,111,110,97,108,32,109,101,116,104,111,100,32,116,104, - 97,116,32,114,101,116,117,114,110,115,32,116,104,101,32,109, - 111,100,105,102,105,99,97,116,105,111,110,32,116,105,109,101, - 32,40,97,110,32,105,110,116,41,32,102,111,114,32,116,104, - 101,10,32,32,32,32,32,32,32,32,115,112,101,99,105,102, - 105,101,100,32,112,97,116,104,32,40,97,32,115,116,114,41, - 46,10,10,32,32,32,32,32,32,32,32,82,97,105,115,101, - 115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,116, - 104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,98, - 101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,32, - 32,32,32,78,41,1,114,50,0,0,0,169,2,114,118,0, - 0,0,114,44,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,218,10,112,97,116,104,95,109,116,105, - 109,101,33,3,0,0,115,6,0,0,0,4,6,4,128,255, - 128,122,23,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,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,14,0,0,0,100,1,124,0,160,0,124,1, - 161,1,105,1,83,0,41,2,97,158,1,0,0,79,112,116, - 105,111,110,97,108,32,109,101,116,104,111,100,32,114,101,116, - 117,114,110,105,110,103,32,97,32,109,101,116,97,100,97,116, - 97,32,100,105,99,116,32,102,111,114,32,116,104,101,32,115, - 112,101,99,105,102,105,101,100,10,32,32,32,32,32,32,32, - 32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,10, - 32,32,32,32,32,32,32,32,80,111,115,115,105,98,108,101, - 32,107,101,121,115,58,10,32,32,32,32,32,32,32,32,45, - 32,39,109,116,105,109,101,39,32,40,109,97,110,100,97,116, - 111,114,121,41,32,105,115,32,116,104,101,32,110,117,109,101, - 114,105,99,32,116,105,109,101,115,116,97,109,112,32,111,102, - 32,108,97,115,116,32,115,111,117,114,99,101,10,32,32,32, - 32,32,32,32,32,32,32,99,111,100,101,32,109,111,100,105, - 102,105,99,97,116,105,111,110,59,10,32,32,32,32,32,32, - 32,32,45,32,39,115,105,122,101,39,32,40,111,112,116,105, - 111,110,97,108,41,32,105,115,32,116,104,101,32,115,105,122, - 101,32,105,110,32,98,121,116,101,115,32,111,102,32,116,104, - 101,32,115,111,117,114,99,101,32,99,111,100,101,46,10,10, - 32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,110, - 116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,100, - 32,97,108,108,111,119,115,32,116,104,101,32,108,111,97,100, - 101,114,32,116,111,32,114,101,97,100,32,98,121,116,101,99, - 111,100,101,32,102,105,108,101,115,46,10,32,32,32,32,32, + 46,95,115,101,97,114,99,104,95,114,101,103,105,115,116,114, + 121,78,99,4,0,0,0,0,0,0,0,0,0,0,0,8, + 0,0,0,8,0,0,0,67,0,0,0,115,118,0,0,0, + 124,0,160,0,124,1,161,1,125,4,124,4,100,0,117,0, + 114,22,100,0,83,0,122,12,116,1,124,4,131,1,1,0, + 87,0,110,20,4,0,116,2,121,54,1,0,1,0,1,0, + 89,0,100,0,83,0,48,0,116,3,131,0,68,0,93,50, + 92,2,125,5,125,6,124,4,160,4,116,5,124,6,131,1, + 161,1,114,62,116,6,106,7,124,1,124,5,124,1,124,4, + 131,2,124,4,100,1,141,3,125,7,124,7,2,0,1,0, + 83,0,100,0,83,0,41,2,78,114,180,0,0,0,41,8, + 114,200,0,0,0,114,49,0,0,0,114,50,0,0,0,114, + 184,0,0,0,114,110,0,0,0,114,111,0,0,0,114,134, + 0,0,0,218,16,115,112,101,99,95,102,114,111,109,95,108, + 111,97,100,101,114,41,8,114,193,0,0,0,114,139,0,0, + 0,114,44,0,0,0,218,6,116,97,114,103,101,116,114,199, + 0,0,0,114,140,0,0,0,114,189,0,0,0,114,187,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,9,102,105,110,100,95,115,112,101,99,228,2,0,0, + 115,32,0,0,0,10,2,8,1,4,1,2,1,12,1,12, + 1,8,1,14,1,14,1,6,1,8,1,2,1,6,254,8, + 3,4,128,255,128,122,31,87,105,110,100,111,119,115,82,101, + 103,105,115,116,114,121,70,105,110,100,101,114,46,102,105,110, + 100,95,115,112,101,99,99,3,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, + 30,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, + 124,3,100,1,117,1,114,26,124,3,106,1,83,0,100,1, + 83,0,41,2,122,108,70,105,110,100,32,109,111,100,117,108, + 101,32,110,97,109,101,100,32,105,110,32,116,104,101,32,114, + 101,103,105,115,116,114,121,46,10,10,32,32,32,32,32,32, + 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, + 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, + 32,32,78,169,2,114,203,0,0,0,114,140,0,0,0,169, + 4,114,193,0,0,0,114,139,0,0,0,114,44,0,0,0, + 114,187,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,11,102,105,110,100,95,109,111,100,117,108, + 101,244,2,0,0,115,10,0,0,0,12,7,8,1,6,1, + 4,2,255,128,122,33,87,105,110,100,111,119,115,82,101,103, + 105,115,116,114,121,70,105,110,100,101,114,46,102,105,110,100, + 95,109,111,100,117,108,101,41,2,78,78,41,1,78,41,12, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 127,0,0,0,114,197,0,0,0,114,196,0,0,0,114,195, + 0,0,0,218,11,99,108,97,115,115,109,101,116,104,111,100, + 114,194,0,0,0,114,200,0,0,0,114,203,0,0,0,114, + 206,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,191,0,0,0,194,2,0, + 0,115,32,0,0,0,8,0,4,2,2,3,2,255,2,4, + 2,255,4,3,2,2,10,1,2,6,10,1,2,14,12,1, + 2,15,16,1,255,128,114,191,0,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 64,0,0,0,115,48,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, + 5,132,0,90,5,100,6,100,7,132,0,90,6,100,8,100, + 9,132,0,90,7,100,10,83,0,41,11,218,13,95,76,111, + 97,100,101,114,66,97,115,105,99,115,122,83,66,97,115,101, + 32,99,108,97,115,115,32,111,102,32,99,111,109,109,111,110, + 32,99,111,100,101,32,110,101,101,100,101,100,32,98,121,32, + 98,111,116,104,32,83,111,117,114,99,101,76,111,97,100,101, + 114,32,97,110,100,10,32,32,32,32,83,111,117,114,99,101, + 108,101,115,115,70,105,108,101,76,111,97,100,101,114,46,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,124, + 0,160,1,124,1,161,1,131,1,100,1,25,0,125,2,124, + 2,160,2,100,2,100,1,161,2,100,3,25,0,125,3,124, + 1,160,3,100,2,161,1,100,4,25,0,125,4,124,3,100, + 5,107,2,111,62,124,4,100,5,107,3,83,0,41,6,122, + 141,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109, + 101,110,116,97,116,105,111,110,32,111,102,32,73,110,115,112, + 101,99,116,76,111,97,100,101,114,46,105,115,95,112,97,99, + 107,97,103,101,32,98,121,32,99,104,101,99,107,105,110,103, + 32,105,102,10,32,32,32,32,32,32,32,32,116,104,101,32, + 112,97,116,104,32,114,101,116,117,114,110,101,100,32,98,121, + 32,103,101,116,95,102,105,108,101,110,97,109,101,32,104,97, + 115,32,97,32,102,105,108,101,110,97,109,101,32,111,102,32, + 39,95,95,105,110,105,116,95,95,46,112,121,39,46,114,39, + 0,0,0,114,71,0,0,0,114,73,0,0,0,114,28,0, + 0,0,218,8,95,95,105,110,105,116,95,95,41,4,114,47, + 0,0,0,114,179,0,0,0,114,43,0,0,0,114,41,0, + 0,0,41,5,114,118,0,0,0,114,139,0,0,0,114,96, + 0,0,0,90,13,102,105,108,101,110,97,109,101,95,98,97, + 115,101,90,9,116,97,105,108,95,110,97,109,101,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,182,0,0, + 0,7,3,0,0,115,10,0,0,0,18,3,16,1,14,1, + 16,1,255,128,122,24,95,76,111,97,100,101,114,66,97,115, + 105,99,115,46,105,115,95,112,97,99,107,97,103,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, + 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, + 169,2,122,42,85,115,101,32,100,101,102,97,117,108,116,32, + 115,101,109,97,110,116,105,99,115,32,102,111,114,32,109,111, + 100,117,108,101,32,99,114,101,97,116,105,111,110,46,78,114, + 5,0,0,0,169,2,114,118,0,0,0,114,187,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 13,99,114,101,97,116,101,95,109,111,100,117,108,101,15,3, + 0,0,115,4,0,0,0,4,128,255,128,122,27,95,76,111, + 97,100,101,114,66,97,115,105,99,115,46,99,114,101,97,116, + 101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0, + 0,115,56,0,0,0,124,0,160,0,124,1,106,1,161,1, + 125,2,124,2,100,1,117,0,114,36,116,2,100,2,160,3, + 124,1,106,1,161,1,131,1,130,1,116,4,160,5,116,6, + 124,2,124,1,106,7,161,3,1,0,100,1,83,0,41,3, + 122,19,69,120,101,99,117,116,101,32,116,104,101,32,109,111, + 100,117,108,101,46,78,122,52,99,97,110,110,111,116,32,108, + 111,97,100,32,109,111,100,117,108,101,32,123,33,114,125,32, + 119,104,101,110,32,103,101,116,95,99,111,100,101,40,41,32, + 114,101,116,117,114,110,115,32,78,111,110,101,41,8,218,8, + 103,101,116,95,99,111,100,101,114,125,0,0,0,114,117,0, + 0,0,114,62,0,0,0,114,134,0,0,0,218,25,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,218,4,101,120,101,99,114,131,0, + 0,0,41,3,114,118,0,0,0,218,6,109,111,100,117,108, + 101,114,164,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,11,101,120,101,99,95,109,111,100,117, + 108,101,18,3,0,0,115,16,0,0,0,12,2,8,1,6, + 1,4,1,6,255,16,2,4,128,255,128,122,25,95,76,111, + 97,100,101,114,66,97,115,105,99,115,46,101,120,101,99,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 12,0,0,0,116,0,160,1,124,0,124,1,161,2,83,0, + 41,1,122,26,84,104,105,115,32,109,111,100,117,108,101,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,41,2, + 114,134,0,0,0,218,17,95,108,111,97,100,95,109,111,100, + 117,108,101,95,115,104,105,109,169,2,114,118,0,0,0,114, + 139,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, + 26,3,0,0,115,4,0,0,0,12,2,255,128,122,25,95, + 76,111,97,100,101,114,66,97,115,105,99,115,46,108,111,97, + 100,95,109,111,100,117,108,101,78,41,8,114,125,0,0,0, + 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, + 182,0,0,0,114,212,0,0,0,114,217,0,0,0,114,220, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,208,0,0,0,2,3,0,0, + 115,14,0,0,0,8,0,4,2,8,3,8,8,8,3,12, + 8,255,128,114,208,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, + 0,115,74,0,0,0,101,0,90,1,100,0,90,2,100,1, + 100,2,132,0,90,3,100,3,100,4,132,0,90,4,100,5, + 100,6,132,0,90,5,100,7,100,8,132,0,90,6,100,9, + 100,10,132,0,90,7,100,11,100,12,156,1,100,13,100,14, + 132,2,90,8,100,15,100,16,132,0,90,9,100,17,83,0, + 41,18,218,12,83,111,117,114,99,101,76,111,97,100,101,114, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,116,0, + 130,1,41,2,122,165,79,112,116,105,111,110,97,108,32,109, + 101,116,104,111,100,32,116,104,97,116,32,114,101,116,117,114, + 110,115,32,116,104,101,32,109,111,100,105,102,105,99,97,116, + 105,111,110,32,116,105,109,101,32,40,97,110,32,105,110,116, + 41,32,102,111,114,32,116,104,101,10,32,32,32,32,32,32, + 32,32,115,112,101,99,105,102,105,101,100,32,112,97,116,104, + 32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,32, 32,32,32,82,97,105,115,101,115,32,79,83,69,114,114,111, 114,32,119,104,101,110,32,116,104,101,32,112,97,116,104,32, 99,97,110,110,111,116,32,98,101,32,104,97,110,100,108,101, - 100,46,10,32,32,32,32,32,32,32,32,114,169,0,0,0, - 41,1,114,223,0,0,0,114,222,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,10,112,97,116, - 104,95,115,116,97,116,115,41,3,0,0,115,4,0,0,0, - 14,12,255,128,122,23,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,0,0,0,0,4,0,0,0,4,0, - 0,0,67,0,0,0,115,12,0,0,0,124,0,160,0,124, - 2,124,3,161,2,83,0,41,1,122,228,79,112,116,105,111, - 110,97,108,32,109,101,116,104,111,100,32,119,104,105,99,104, - 32,119,114,105,116,101,115,32,100,97,116,97,32,40,98,121, - 116,101,115,41,32,116,111,32,97,32,102,105,108,101,32,112, - 97,116,104,32,40,97,32,115,116,114,41,46,10,10,32,32, - 32,32,32,32,32,32,73,109,112,108,101,109,101,110,116,105, - 110,103,32,116,104,105,115,32,109,101,116,104,111,100,32,97, - 108,108,111,119,115,32,102,111,114,32,116,104,101,32,119,114, - 105,116,105,110,103,32,111,102,32,98,121,116,101,99,111,100, - 101,32,102,105,108,101,115,46,10,10,32,32,32,32,32,32, - 32,32,84,104,101,32,115,111,117,114,99,101,32,112,97,116, - 104,32,105,115,32,110,101,101,100,101,100,32,105,110,32,111, - 114,100,101,114,32,116,111,32,99,111,114,114,101,99,116,108, - 121,32,116,114,97,110,115,102,101,114,32,112,101,114,109,105, - 115,115,105,111,110,115,10,32,32,32,32,32,32,32,32,41, - 1,218,8,115,101,116,95,100,97,116,97,41,4,114,118,0, - 0,0,114,107,0,0,0,90,10,99,97,99,104,101,95,112, - 97,116,104,114,26,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,15,95,99,97,99,104,101,95, - 98,121,116,101,99,111,100,101,55,3,0,0,115,4,0,0, - 0,12,8,255,128,122,28,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,0,0,0,0, - 3,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,122,150,79,112,116,105,111,110,97, - 108,32,109,101,116,104,111,100,32,119,104,105,99,104,32,119, - 114,105,116,101,115,32,100,97,116,97,32,40,98,121,116,101, - 115,41,32,116,111,32,97,32,102,105,108,101,32,112,97,116, - 104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,32, - 32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,103, - 32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,108, - 111,119,115,32,102,111,114,32,116,104,101,32,119,114,105,116, - 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32, - 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,78, - 114,5,0,0,0,41,3,114,118,0,0,0,114,44,0,0, - 0,114,26,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,225,0,0,0,65,3,0,0,115,4, - 0,0,0,4,128,255,128,122,21,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,0,0,0,0,5,0,0,0,10, - 0,0,0,67,0,0,0,115,84,0,0,0,124,0,160,0, - 124,1,161,1,125,2,122,14,124,0,160,1,124,2,161,1, - 125,3,87,0,110,50,4,0,116,2,121,74,1,0,125,4, - 1,0,122,26,116,3,100,1,124,1,100,2,141,2,124,4, - 130,2,87,0,89,0,100,3,125,4,126,4,110,10,100,3, - 125,4,126,4,48,0,48,0,116,4,124,3,131,1,83,0, - 41,4,122,52,67,111,110,99,114,101,116,101,32,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73, - 110,115,112,101,99,116,76,111,97,100,101,114,46,103,101,116, - 95,115,111,117,114,99,101,46,122,39,115,111,117,114,99,101, - 32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,116, - 104,114,111,117,103,104,32,103,101,116,95,100,97,116,97,40, - 41,114,115,0,0,0,78,41,5,114,179,0,0,0,218,8, - 103,101,116,95,100,97,116,97,114,50,0,0,0,114,117,0, - 0,0,114,176,0,0,0,41,5,114,118,0,0,0,114,139, - 0,0,0,114,44,0,0,0,114,174,0,0,0,218,3,101, - 120,99,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,10,103,101,116,95,115,111,117,114,99,101,72,3,0, - 0,115,24,0,0,0,10,2,2,1,14,1,14,1,4,1, - 2,1,4,255,2,1,6,255,18,128,8,2,255,128,122,23, - 83,111,117,114,99,101,76,111,97,100,101,114,46,103,101,116, - 95,115,111,117,114,99,101,114,104,0,0,0,41,1,218,9, - 95,111,112,116,105,109,105,122,101,99,3,0,0,0,0,0, - 0,0,1,0,0,0,4,0,0,0,8,0,0,0,67,0, - 0,0,115,22,0,0,0,116,0,106,1,116,2,124,1,124, - 2,100,1,100,2,124,3,100,3,141,6,83,0,41,4,122, - 130,82,101,116,117,114,110,32,116,104,101,32,99,111,100,101, - 32,111,98,106,101,99,116,32,99,111,109,112,105,108,101,100, - 32,102,114,111,109,32,115,111,117,114,99,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,101,32,39,100,97,116,97, - 39,32,97,114,103,117,109,101,110,116,32,99,97,110,32,98, - 101,32,97,110,121,32,111,98,106,101,99,116,32,116,121,112, - 101,32,116,104,97,116,32,99,111,109,112,105,108,101,40,41, - 32,115,117,112,112,111,114,116,115,46,10,32,32,32,32,32, - 32,32,32,114,215,0,0,0,84,41,2,218,12,100,111,110, - 116,95,105,110,104,101,114,105,116,114,83,0,0,0,41,3, - 114,134,0,0,0,114,214,0,0,0,218,7,99,111,109,112, - 105,108,101,41,4,114,118,0,0,0,114,26,0,0,0,114, - 44,0,0,0,114,230,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,14,115,111,117,114,99,101, - 95,116,111,95,99,111,100,101,82,3,0,0,115,8,0,0, - 0,12,5,4,1,6,255,255,128,122,27,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,0, - 0,0,0,15,0,0,0,9,0,0,0,67,0,0,0,115, - 24,2,0,0,124,0,160,0,124,1,161,1,125,2,100,1, - 125,3,100,1,125,4,100,1,125,5,100,2,125,6,100,3, - 125,7,122,12,116,1,124,2,131,1,125,8,87,0,110,24, - 4,0,116,2,121,66,1,0,1,0,1,0,100,1,125,8, - 89,0,144,1,110,42,48,0,122,14,124,0,160,3,124,2, - 161,1,125,9,87,0,110,20,4,0,116,4,121,102,1,0, - 1,0,1,0,89,0,144,1,110,6,48,0,116,5,124,9, - 100,4,25,0,131,1,125,3,122,14,124,0,160,6,124,8, - 161,1,125,10,87,0,110,18,4,0,116,4,121,148,1,0, - 1,0,1,0,89,0,110,216,48,0,124,1,124,8,100,5, - 156,2,125,11,122,148,116,7,124,10,124,1,124,11,131,3, - 125,12,116,8,124,10,131,1,100,6,100,1,133,2,25,0, - 125,13,124,12,100,7,64,0,100,8,107,3,125,6,124,6, - 144,1,114,30,124,12,100,9,64,0,100,8,107,3,125,7, - 116,9,106,10,100,10,107,3,144,1,114,50,124,7,115,248, - 116,9,106,10,100,11,107,2,144,1,114,50,124,0,160,6, - 124,2,161,1,125,4,116,9,160,11,116,12,124,4,161,2, - 125,5,116,13,124,10,124,5,124,1,124,11,131,4,1,0, - 110,20,116,14,124,10,124,3,124,9,100,12,25,0,124,1, - 124,11,131,5,1,0,87,0,110,24,4,0,116,15,116,16, - 102,2,144,1,121,76,1,0,1,0,1,0,89,0,110,32, - 48,0,116,17,160,18,100,13,124,8,124,2,161,3,1,0, - 116,19,124,13,124,1,124,8,124,2,100,14,141,4,83,0, - 124,4,100,1,117,0,144,1,114,128,124,0,160,6,124,2, - 161,1,125,4,124,0,160,20,124,4,124,2,161,2,125,14, - 116,17,160,18,100,15,124,2,161,2,1,0,116,21,106,22, - 144,2,115,20,124,8,100,1,117,1,144,2,114,20,124,3, - 100,1,117,1,144,2,114,20,124,6,144,1,114,220,124,5, - 100,1,117,0,144,1,114,206,116,9,160,11,124,4,161,1, - 125,5,116,23,124,14,124,5,124,7,131,3,125,10,110,16, - 116,24,124,14,124,3,116,25,124,4,131,1,131,3,125,10, - 122,18,124,0,160,26,124,2,124,8,124,10,161,3,1,0, - 87,0,110,20,4,0,116,2,144,2,121,18,1,0,1,0, - 1,0,89,0,110,2,48,0,124,14,83,0,41,16,122,190, - 67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,101, - 110,116,97,116,105,111,110,32,111,102,32,73,110,115,112,101, - 99,116,76,111,97,100,101,114,46,103,101,116,95,99,111,100, - 101,46,10,10,32,32,32,32,32,32,32,32,82,101,97,100, - 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32, - 114,101,113,117,105,114,101,115,32,112,97,116,104,95,115,116, - 97,116,115,32,116,111,32,98,101,32,105,109,112,108,101,109, - 101,110,116,101,100,46,32,84,111,32,119,114,105,116,101,10, - 32,32,32,32,32,32,32,32,98,121,116,101,99,111,100,101, - 44,32,115,101,116,95,100,97,116,97,32,109,117,115,116,32, - 97,108,115,111,32,98,101,32,105,109,112,108,101,109,101,110, - 116,101,100,46,10,10,32,32,32,32,32,32,32,32,78,70, - 84,114,169,0,0,0,114,159,0,0,0,114,145,0,0,0, - 114,39,0,0,0,114,73,0,0,0,114,28,0,0,0,90, - 5,110,101,118,101,114,90,6,97,108,119,97,121,115,218,4, - 115,105,122,101,122,13,123,125,32,109,97,116,99,104,101,115, - 32,123,125,41,3,114,116,0,0,0,114,106,0,0,0,114, - 107,0,0,0,122,19,99,111,100,101,32,111,98,106,101,99, - 116,32,102,114,111,109,32,123,125,41,27,114,179,0,0,0, - 114,97,0,0,0,114,82,0,0,0,114,224,0,0,0,114, - 50,0,0,0,114,18,0,0,0,114,227,0,0,0,114,152, - 0,0,0,218,10,109,101,109,111,114,121,118,105,101,119,114, - 163,0,0,0,90,21,99,104,101,99,107,95,104,97,115,104, - 95,98,97,115,101,100,95,112,121,99,115,114,157,0,0,0, - 218,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, - 66,69,82,114,158,0,0,0,114,156,0,0,0,114,117,0, - 0,0,114,150,0,0,0,114,134,0,0,0,114,149,0,0, - 0,114,165,0,0,0,114,233,0,0,0,114,1,0,0,0, - 218,19,100,111,110,116,95,119,114,105,116,101,95,98,121,116, - 101,99,111,100,101,114,171,0,0,0,114,170,0,0,0,114, - 23,0,0,0,114,226,0,0,0,41,15,114,118,0,0,0, - 114,139,0,0,0,114,107,0,0,0,114,154,0,0,0,114, - 174,0,0,0,114,157,0,0,0,90,10,104,97,115,104,95, - 98,97,115,101,100,90,12,99,104,101,99,107,95,115,111,117, - 114,99,101,114,106,0,0,0,218,2,115,116,114,26,0,0, - 0,114,151,0,0,0,114,2,0,0,0,90,10,98,121,116, - 101,115,95,100,97,116,97,90,11,99,111,100,101,95,111,98, - 106,101,99,116,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,213,0,0,0,90,3,0,0,115,154,0,0, - 0,10,7,4,1,4,1,4,1,4,1,4,1,2,1,12, - 1,12,1,12,1,2,2,14,1,12,1,8,1,12,2,2, - 1,14,1,12,1,6,1,2,3,2,1,6,254,2,4,12, - 1,16,1,12,1,6,1,12,1,12,1,2,1,2,255,8, - 2,4,254,10,3,4,1,2,1,2,1,4,254,8,4,2, - 1,6,255,2,3,2,1,2,1,6,1,2,1,2,1,8, - 251,18,7,6,1,8,2,2,1,4,255,6,2,2,1,2, - 1,6,254,10,3,10,1,12,1,12,1,18,1,6,1,4, - 255,6,2,10,1,10,1,14,1,6,2,6,1,4,255,2, - 2,18,1,14,1,6,1,4,1,255,128,122,21,83,111,117, - 114,99,101,76,111,97,100,101,114,46,103,101,116,95,99,111, - 100,101,78,41,10,114,125,0,0,0,114,124,0,0,0,114, - 126,0,0,0,114,223,0,0,0,114,224,0,0,0,114,226, - 0,0,0,114,225,0,0,0,114,229,0,0,0,114,233,0, - 0,0,114,213,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,114,221,0,0,0, - 31,3,0,0,115,18,0,0,0,8,0,8,2,8,8,8, - 14,8,10,8,7,14,10,12,8,255,128,114,221,0,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,0,0,0,0,115,92,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, - 90,6,101,7,135,0,102,1,100,8,100,9,132,8,131,1, - 90,8,101,7,100,10,100,11,132,0,131,1,90,9,100,12, - 100,13,132,0,90,10,101,7,100,14,100,15,132,0,131,1, - 90,11,135,0,4,0,90,12,83,0,41,16,218,10,70,105, - 108,101,76,111,97,100,101,114,122,103,66,97,115,101,32,102, - 105,108,101,32,108,111,97,100,101,114,32,99,108,97,115,115, - 32,119,104,105,99,104,32,105,109,112,108,101,109,101,110,116, - 115,32,116,104,101,32,108,111,97,100,101,114,32,112,114,111, - 116,111,99,111,108,32,109,101,116,104,111,100,115,32,116,104, - 97,116,10,32,32,32,32,114,101,113,117,105,114,101,32,102, - 105,108,101,32,115,121,115,116,101,109,32,117,115,97,103,101, - 46,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,124, - 1,124,0,95,0,124,2,124,0,95,1,100,1,83,0,41, - 2,122,75,67,97,99,104,101,32,116,104,101,32,109,111,100, - 117,108,101,32,110,97,109,101,32,97,110,100,32,116,104,101, - 32,112,97,116,104,32,116,111,32,116,104,101,32,102,105,108, - 101,32,102,111,117,110,100,32,98,121,32,116,104,101,10,32, - 32,32,32,32,32,32,32,102,105,110,100,101,114,46,78,114, - 159,0,0,0,41,3,114,118,0,0,0,114,139,0,0,0, - 114,44,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,209,0,0,0,180,3,0,0,115,8,0, - 0,0,6,3,6,1,4,128,255,128,122,19,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,0,0,0,0,2,0,0,0, - 2,0,0,0,67,0,0,0,115,24,0,0,0,124,0,106, - 0,124,1,106,0,107,2,111,22,124,0,106,1,124,1,106, - 1,107,2,83,0,114,109,0,0,0,169,2,218,9,95,95, - 99,108,97,115,115,95,95,114,131,0,0,0,169,2,114,118, - 0,0,0,90,5,111,116,104,101,114,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,6,95,95,101,113,95, - 95,186,3,0,0,115,8,0,0,0,12,1,10,1,2,255, - 255,128,122,17,70,105,108,101,76,111,97,100,101,114,46,95, - 95,101,113,95,95,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,20, - 0,0,0,116,0,124,0,106,1,131,1,116,0,124,0,106, - 2,131,1,65,0,83,0,114,109,0,0,0,169,3,218,4, - 104,97,115,104,114,116,0,0,0,114,44,0,0,0,169,1, - 114,118,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,8,95,95,104,97,115,104,95,95,190,3, - 0,0,115,4,0,0,0,20,1,255,128,122,19,70,105,108, - 101,76,111,97,100,101,114,46,95,95,104,97,115,104,95,95, + 100,46,10,32,32,32,32,32,32,32,32,78,41,1,114,50, + 0,0,0,169,2,114,118,0,0,0,114,44,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,10, + 112,97,116,104,95,109,116,105,109,101,33,3,0,0,115,4, + 0,0,0,4,6,255,128,122,23,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,0,0,0,0,2,0,0, - 0,3,0,0,0,3,0,0,0,115,16,0,0,0,116,0, - 116,1,124,0,131,2,160,2,124,1,161,1,83,0,41,1, - 122,100,76,111,97,100,32,97,32,109,111,100,117,108,101,32, - 102,114,111,109,32,97,32,102,105,108,101,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, - 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,41,3,218,5,115,117,112,101,114,114, - 239,0,0,0,114,220,0,0,0,114,219,0,0,0,169,1, - 114,241,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 220,0,0,0,193,3,0,0,115,4,0,0,0,16,10,255, - 128,122,22,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,6,0,0,0,124,0,106,0,83,0,169,1,122, - 58,82,101,116,117,114,110,32,116,104,101,32,112,97,116,104, - 32,116,111,32,116,104,101,32,115,111,117,114,99,101,32,102, - 105,108,101,32,97,115,32,102,111,117,110,100,32,98,121,32, - 116,104,101,32,102,105,110,100,101,114,46,114,48,0,0,0, - 114,219,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,179,0,0,0,205,3,0,0,115,4,0, - 0,0,6,3,255,128,122,23,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,0,0,0,0,3,0,0,0, - 8,0,0,0,67,0,0,0,115,126,0,0,0,116,0,124, - 0,116,1,116,2,102,2,131,2,114,70,116,3,160,4,116, - 5,124,1,131,1,161,1,143,24,125,2,124,2,160,6,161, - 0,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, - 0,49,0,115,58,48,0,1,0,1,0,1,0,89,0,1, - 0,110,52,116,3,160,7,124,1,100,2,161,2,143,24,125, - 2,124,2,160,6,161,0,87,0,2,0,100,1,4,0,4, - 0,131,3,1,0,83,0,49,0,115,112,48,0,1,0,1, - 0,1,0,89,0,1,0,100,1,83,0,41,3,122,39,82, - 101,116,117,114,110,32,116,104,101,32,100,97,116,97,32,102, - 114,111,109,32,112,97,116,104,32,97,115,32,114,97,119,32, - 98,121,116,101,115,46,78,218,1,114,41,8,114,161,0,0, - 0,114,221,0,0,0,218,19,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,114,64,0,0,0, - 90,9,111,112,101,110,95,99,111,100,101,114,84,0,0,0, - 90,4,114,101,97,100,114,65,0,0,0,41,3,114,118,0, - 0,0,114,44,0,0,0,114,68,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,114,227,0,0,0, - 210,3,0,0,115,14,0,0,0,14,2,16,1,40,1,14, - 2,38,1,4,128,255,128,122,19,70,105,108,101,76,111,97, - 100,101,114,46,103,101,116,95,100,97,116,97,99,2,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0, - 0,67,0,0,0,115,20,0,0,0,100,1,100,2,108,0, - 109,1,125,2,1,0,124,2,124,0,131,1,83,0,41,3, - 78,114,73,0,0,0,41,1,218,10,70,105,108,101,82,101, - 97,100,101,114,41,2,90,17,105,109,112,111,114,116,108,105, - 98,46,114,101,97,100,101,114,115,114,253,0,0,0,41,3, - 114,118,0,0,0,114,216,0,0,0,114,253,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,19, - 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, - 100,101,114,219,3,0,0,115,6,0,0,0,12,2,8,1, - 255,128,122,30,70,105,108,101,76,111,97,100,101,114,46,103, - 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, - 101,114,41,13,114,125,0,0,0,114,124,0,0,0,114,126, - 0,0,0,114,127,0,0,0,114,209,0,0,0,114,243,0, - 0,0,114,247,0,0,0,114,136,0,0,0,114,220,0,0, - 0,114,179,0,0,0,114,227,0,0,0,114,254,0,0,0, - 90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,114, - 5,0,0,0,114,5,0,0,0,114,249,0,0,0,114,8, - 0,0,0,114,239,0,0,0,175,3,0,0,115,26,0,0, - 0,8,0,4,2,8,3,8,6,8,4,2,3,14,1,2, - 11,10,1,8,4,2,9,18,1,255,128,114,239,0,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,64,0,0,0,115,46,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,100,7,156,1, - 100,8,100,9,132,2,90,6,100,10,83,0,41,11,218,16, - 83,111,117,114,99,101,70,105,108,101,76,111,97,100,101,114, - 122,62,67,111,110,99,114,101,116,101,32,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,32,111,102,32,83,111,117, - 114,99,101,76,111,97,100,101,114,32,117,115,105,110,103,32, - 116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,46, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,67,0,0,0,115,22,0,0,0,116,0, - 124,1,131,1,125,2,124,2,106,1,124,2,106,2,100,1, - 156,2,83,0,41,2,122,33,82,101,116,117,114,110,32,116, - 104,101,32,109,101,116,97,100,97,116,97,32,102,111,114,32, - 116,104,101,32,112,97,116,104,46,41,2,114,169,0,0,0, - 114,234,0,0,0,41,3,114,49,0,0,0,218,8,115,116, - 95,109,116,105,109,101,90,7,115,116,95,115,105,122,101,41, - 3,114,118,0,0,0,114,44,0,0,0,114,238,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 224,0,0,0,229,3,0,0,115,6,0,0,0,8,2,14, - 1,255,128,122,27,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,0,0,0,0,0,5,0,0, - 0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,0, - 124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,4, - 100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,111, - 100,101,41,2,114,114,0,0,0,114,225,0,0,0,41,5, - 114,118,0,0,0,114,107,0,0,0,114,106,0,0,0,114, - 26,0,0,0,114,52,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,226,0,0,0,234,3,0, - 0,115,6,0,0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,60, - 0,0,0,114,1,1,0,0,99,3,0,0,0,0,0,0, - 0,1,0,0,0,9,0,0,0,11,0,0,0,67,0,0, - 0,115,248,0,0,0,116,0,124,1,131,1,92,2,125,4, - 125,5,103,0,125,6,124,4,114,52,116,1,124,4,131,1, - 115,52,116,0,124,4,131,1,92,2,125,4,125,7,124,6, - 160,2,124,7,161,1,1,0,113,16,116,3,124,6,131,1, - 68,0,93,102,125,7,116,4,124,4,124,7,131,2,125,4, - 122,14,116,5,160,6,124,4,161,1,1,0,87,0,113,60, - 4,0,116,7,121,110,1,0,1,0,1,0,89,0,113,60, - 89,0,113,60,4,0,116,8,121,162,1,0,125,8,1,0, - 122,30,116,9,160,10,100,1,124,4,124,8,161,3,1,0, - 87,0,89,0,100,2,125,8,126,8,1,0,100,2,83,0, - 100,2,125,8,126,8,48,0,48,0,122,28,116,11,124,1, - 124,2,124,3,131,3,1,0,116,9,160,10,100,3,124,1, - 161,2,1,0,87,0,110,50,4,0,116,8,121,242,1,0, - 125,8,1,0,122,26,116,9,160,10,100,1,124,1,124,8, - 161,3,1,0,87,0,89,0,100,2,125,8,126,8,110,10, - 100,2,125,8,126,8,48,0,48,0,100,2,83,0,41,4, - 122,27,87,114,105,116,101,32,98,121,116,101,115,32,100,97, - 116,97,32,116,111,32,97,32,102,105,108,101,46,122,27,99, - 111,117,108,100,32,110,111,116,32,99,114,101,97,116,101,32, - 123,33,114,125,58,32,123,33,114,125,78,122,12,99,114,101, - 97,116,101,100,32,123,33,114,125,41,12,114,47,0,0,0, - 114,56,0,0,0,114,186,0,0,0,114,42,0,0,0,114, - 38,0,0,0,114,4,0,0,0,90,5,109,107,100,105,114, - 218,15,70,105,108,101,69,120,105,115,116,115,69,114,114,111, - 114,114,50,0,0,0,114,134,0,0,0,114,149,0,0,0, - 114,69,0,0,0,41,9,114,118,0,0,0,114,44,0,0, - 0,114,26,0,0,0,114,2,1,0,0,218,6,112,97,114, - 101,110,116,114,96,0,0,0,114,37,0,0,0,114,33,0, - 0,0,114,228,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,225,0,0,0,239,3,0,0,115, - 52,0,0,0,12,2,4,1,12,2,12,1,12,1,12,2, - 10,1,2,1,14,1,12,1,8,2,14,1,6,3,4,1, - 4,255,16,2,10,128,2,1,12,1,16,1,14,1,8,2, - 2,1,8,255,22,128,255,128,122,25,83,111,117,114,99,101, - 70,105,108,101,76,111,97,100,101,114,46,115,101,116,95,100, - 97,116,97,78,41,7,114,125,0,0,0,114,124,0,0,0, - 114,126,0,0,0,114,127,0,0,0,114,224,0,0,0,114, - 226,0,0,0,114,225,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,255,0, - 0,0,225,3,0,0,115,12,0,0,0,8,0,4,2,8, - 2,8,5,18,5,255,128,114,255,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,64,0,0,0,115,32,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, - 100,5,132,0,90,5,100,6,83,0,41,7,218,20,83,111, - 117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,100, - 101,114,122,45,76,111,97,100,101,114,32,119,104,105,99,104, - 32,104,97,110,100,108,101,115,32,115,111,117,114,99,101,108, - 101,115,115,32,102,105,108,101,32,105,109,112,111,114,116,115, - 46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,5,0,0,0,67,0,0,0,115,68,0,0,0,124, - 0,160,0,124,1,161,1,125,2,124,0,160,1,124,2,161, - 1,125,3,124,1,124,2,100,1,156,2,125,4,116,2,124, - 3,124,1,124,4,131,3,1,0,116,3,116,4,124,3,131, - 1,100,2,100,0,133,2,25,0,124,1,124,2,100,3,141, - 3,83,0,41,4,78,114,159,0,0,0,114,145,0,0,0, - 41,2,114,116,0,0,0,114,106,0,0,0,41,5,114,179, - 0,0,0,114,227,0,0,0,114,152,0,0,0,114,165,0, - 0,0,114,235,0,0,0,41,5,114,118,0,0,0,114,139, - 0,0,0,114,44,0,0,0,114,26,0,0,0,114,151,0, + 0,4,0,0,0,67,0,0,0,115,14,0,0,0,100,1, + 124,0,160,0,124,1,161,1,105,1,83,0,41,2,97,158, + 1,0,0,79,112,116,105,111,110,97,108,32,109,101,116,104, + 111,100,32,114,101,116,117,114,110,105,110,103,32,97,32,109, + 101,116,97,100,97,116,97,32,100,105,99,116,32,102,111,114, + 32,116,104,101,32,115,112,101,99,105,102,105,101,100,10,32, + 32,32,32,32,32,32,32,112,97,116,104,32,40,97,32,115, + 116,114,41,46,10,10,32,32,32,32,32,32,32,32,80,111, + 115,115,105,98,108,101,32,107,101,121,115,58,10,32,32,32, + 32,32,32,32,32,45,32,39,109,116,105,109,101,39,32,40, + 109,97,110,100,97,116,111,114,121,41,32,105,115,32,116,104, + 101,32,110,117,109,101,114,105,99,32,116,105,109,101,115,116, + 97,109,112,32,111,102,32,108,97,115,116,32,115,111,117,114, + 99,101,10,32,32,32,32,32,32,32,32,32,32,99,111,100, + 101,32,109,111,100,105,102,105,99,97,116,105,111,110,59,10, + 32,32,32,32,32,32,32,32,45,32,39,115,105,122,101,39, + 32,40,111,112,116,105,111,110,97,108,41,32,105,115,32,116, + 104,101,32,115,105,122,101,32,105,110,32,98,121,116,101,115, + 32,111,102,32,116,104,101,32,115,111,117,114,99,101,32,99, + 111,100,101,46,10,10,32,32,32,32,32,32,32,32,73,109, + 112,108,101,109,101,110,116,105,110,103,32,116,104,105,115,32, + 109,101,116,104,111,100,32,97,108,108,111,119,115,32,116,104, + 101,32,108,111,97,100,101,114,32,116,111,32,114,101,97,100, + 32,98,121,116,101,99,111,100,101,32,102,105,108,101,115,46, + 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32, + 79,83,69,114,114,111,114,32,119,104,101,110,32,116,104,101, + 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32, + 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32, + 32,114,169,0,0,0,41,1,114,223,0,0,0,114,222,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,213,0,0,0,18,4,0,0,115,24,0,0,0,10, - 1,10,1,2,4,2,1,6,254,12,4,2,1,14,1,2, - 1,2,1,6,253,255,128,122,29,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,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,2,122,39,82,101,116,117, - 114,110,32,78,111,110,101,32,97,115,32,116,104,101,114,101, - 32,105,115,32,110,111,32,115,111,117,114,99,101,32,99,111, - 100,101,46,78,114,5,0,0,0,114,219,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,229,0, - 0,0,34,4,0,0,115,4,0,0,0,4,2,255,128,122, - 31,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,41,6,114,125,0,0,0,114,124,0,0,0,114,126,0, - 0,0,114,127,0,0,0,114,213,0,0,0,114,229,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,5,1,0,0,14,4,0,0,115,10, - 0,0,0,8,0,4,2,8,2,12,16,255,128,114,5,1, + 0,218,10,112,97,116,104,95,115,116,97,116,115,41,3,0, + 0,115,4,0,0,0,14,12,255,128,122,23,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,0,0,0,0, + 4,0,0,0,4,0,0,0,67,0,0,0,115,12,0,0, + 0,124,0,160,0,124,2,124,3,161,2,83,0,41,1,122, + 228,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, + 32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,97, + 116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,32, + 102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,114, + 41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, + 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, + 116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,32, + 116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,98, + 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,10, + 32,32,32,32,32,32,32,32,84,104,101,32,115,111,117,114, + 99,101,32,112,97,116,104,32,105,115,32,110,101,101,100,101, + 100,32,105,110,32,111,114,100,101,114,32,116,111,32,99,111, + 114,114,101,99,116,108,121,32,116,114,97,110,115,102,101,114, + 32,112,101,114,109,105,115,115,105,111,110,115,10,32,32,32, + 32,32,32,32,32,41,1,218,8,115,101,116,95,100,97,116, + 97,41,4,114,118,0,0,0,114,107,0,0,0,90,10,99, + 97,99,104,101,95,112,97,116,104,114,26,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,15,95, + 99,97,99,104,101,95,98,121,116,101,99,111,100,101,55,3, + 0,0,115,4,0,0,0,12,8,255,128,122,28,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,0,0,0,0,3,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,150,79, + 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,119, + 104,105,99,104,32,119,114,105,116,101,115,32,100,97,116,97, + 32,40,98,121,116,101,115,41,32,116,111,32,97,32,102,105, + 108,101,32,112,97,116,104,32,40,97,32,115,116,114,41,46, + 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, + 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, + 111,100,32,97,108,108,111,119,115,32,102,111,114,32,116,104, + 101,32,119,114,105,116,105,110,103,32,111,102,32,98,121,116, + 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, + 32,32,32,32,32,78,114,5,0,0,0,41,3,114,118,0, + 0,0,114,44,0,0,0,114,26,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,225,0,0,0, + 65,3,0,0,115,4,0,0,0,4,128,255,128,122,21,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,0,0,0, + 0,5,0,0,0,10,0,0,0,67,0,0,0,115,70,0, + 0,0,124,0,160,0,124,1,161,1,125,2,122,20,124,0, + 160,1,124,2,161,1,125,3,87,0,116,4,124,3,131,1, + 83,0,4,0,116,2,121,68,1,0,125,4,1,0,122,14, + 116,3,100,1,124,1,100,2,141,2,124,4,130,2,100,3, + 125,4,126,4,48,0,48,0,41,4,122,52,67,111,110,99, + 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, + 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, + 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,46, + 122,39,115,111,117,114,99,101,32,110,111,116,32,97,118,97, + 105,108,97,98,108,101,32,116,104,114,111,117,103,104,32,103, + 101,116,95,100,97,116,97,40,41,114,115,0,0,0,78,41, + 5,114,179,0,0,0,218,8,103,101,116,95,100,97,116,97, + 114,50,0,0,0,114,117,0,0,0,114,176,0,0,0,41, + 5,114,118,0,0,0,114,139,0,0,0,114,44,0,0,0, + 114,174,0,0,0,218,3,101,120,99,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,10,103,101,116,95,115, + 111,117,114,99,101,72,3,0,0,115,24,0,0,0,10,2, + 2,1,12,1,8,4,14,253,4,1,2,1,4,255,2,1, + 2,255,10,128,255,128,122,23,83,111,117,114,99,101,76,111, + 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,114, + 104,0,0,0,41,1,218,9,95,111,112,116,105,109,105,122, + 101,99,3,0,0,0,0,0,0,0,1,0,0,0,4,0, + 0,0,8,0,0,0,67,0,0,0,115,22,0,0,0,116, + 0,106,1,116,2,124,1,124,2,100,1,100,2,124,3,100, + 3,141,6,83,0,41,4,122,130,82,101,116,117,114,110,32, + 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, + 99,111,109,112,105,108,101,100,32,102,114,111,109,32,115,111, + 117,114,99,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,101,32,39,100,97,116,97,39,32,97,114,103,117,109,101, + 110,116,32,99,97,110,32,98,101,32,97,110,121,32,111,98, + 106,101,99,116,32,116,121,112,101,32,116,104,97,116,32,99, + 111,109,112,105,108,101,40,41,32,115,117,112,112,111,114,116, + 115,46,10,32,32,32,32,32,32,32,32,114,215,0,0,0, + 84,41,2,218,12,100,111,110,116,95,105,110,104,101,114,105, + 116,114,83,0,0,0,41,3,114,134,0,0,0,114,214,0, + 0,0,218,7,99,111,109,112,105,108,101,41,4,114,118,0, + 0,0,114,26,0,0,0,114,44,0,0,0,114,230,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,14,115,111,117,114,99,101,95,116,111,95,99,111,100,101, + 82,3,0,0,115,8,0,0,0,12,5,4,1,6,255,255, + 128,122,27,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,0,0,0,0,15,0,0,0,9, + 0,0,0,67,0,0,0,115,28,2,0,0,124,0,160,0, + 124,1,161,1,125,2,100,1,125,3,100,1,125,4,100,1, + 125,5,100,2,125,6,100,3,125,7,122,12,116,1,124,2, + 131,1,125,8,87,0,110,24,4,0,116,2,121,66,1,0, + 1,0,1,0,100,1,125,8,89,0,144,1,110,42,48,0, + 122,14,124,0,160,3,124,2,161,1,125,9,87,0,110,20, + 4,0,116,4,121,102,1,0,1,0,1,0,89,0,144,1, + 110,6,48,0,116,5,124,9,100,4,25,0,131,1,125,3, + 122,14,124,0,160,6,124,8,161,1,125,10,87,0,110,18, + 4,0,116,4,121,148,1,0,1,0,1,0,89,0,110,216, + 48,0,124,1,124,8,100,5,156,2,125,11,122,148,116,7, + 124,10,124,1,124,11,131,3,125,12,116,8,124,10,131,1, + 100,6,100,1,133,2,25,0,125,13,124,12,100,7,64,0, + 100,8,107,3,125,6,124,6,144,1,114,30,124,12,100,9, + 64,0,100,8,107,3,125,7,116,9,106,10,100,10,107,3, + 144,1,114,50,124,7,115,248,116,9,106,10,100,11,107,2, + 144,1,114,50,124,0,160,6,124,2,161,1,125,4,116,9, + 160,11,116,12,124,4,161,2,125,5,116,13,124,10,124,5, + 124,1,124,11,131,4,1,0,110,20,116,14,124,10,124,3, + 124,9,100,12,25,0,124,1,124,11,131,5,1,0,87,0, + 110,24,4,0,116,15,116,16,102,2,144,1,121,76,1,0, + 1,0,1,0,89,0,110,32,48,0,116,17,160,18,100,13, + 124,8,124,2,161,3,1,0,116,19,124,13,124,1,124,8, + 124,2,100,14,141,4,83,0,124,4,100,1,117,0,144,1, + 114,128,124,0,160,6,124,2,161,1,125,4,124,0,160,20, + 124,4,124,2,161,2,125,14,116,17,160,18,100,15,124,2, + 161,2,1,0,116,21,106,22,144,2,115,24,124,8,100,1, + 117,1,144,2,114,24,124,3,100,1,117,1,144,2,114,24, + 124,6,144,1,114,220,124,5,100,1,117,0,144,1,114,206, + 116,9,160,11,124,4,161,1,125,5,116,23,124,14,124,5, + 124,7,131,3,125,10,110,16,116,24,124,14,124,3,116,25, + 124,4,131,1,131,3,125,10,122,20,124,0,160,26,124,2, + 124,8,124,10,161,3,1,0,87,0,124,14,83,0,4,0, + 116,2,144,2,121,22,1,0,1,0,1,0,89,0,124,14, + 83,0,48,0,124,14,83,0,41,16,122,190,67,111,110,99, + 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, + 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, + 97,100,101,114,46,103,101,116,95,99,111,100,101,46,10,10, + 32,32,32,32,32,32,32,32,82,101,97,100,105,110,103,32, + 111,102,32,98,121,116,101,99,111,100,101,32,114,101,113,117, + 105,114,101,115,32,112,97,116,104,95,115,116,97,116,115,32, + 116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101, + 100,46,32,84,111,32,119,114,105,116,101,10,32,32,32,32, + 32,32,32,32,98,121,116,101,99,111,100,101,44,32,115,101, + 116,95,100,97,116,97,32,109,117,115,116,32,97,108,115,111, + 32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,46, + 10,10,32,32,32,32,32,32,32,32,78,70,84,114,169,0, + 0,0,114,159,0,0,0,114,145,0,0,0,114,39,0,0, + 0,114,73,0,0,0,114,28,0,0,0,90,5,110,101,118, + 101,114,90,6,97,108,119,97,121,115,218,4,115,105,122,101, + 122,13,123,125,32,109,97,116,99,104,101,115,32,123,125,41, + 3,114,116,0,0,0,114,106,0,0,0,114,107,0,0,0, + 122,19,99,111,100,101,32,111,98,106,101,99,116,32,102,114, + 111,109,32,123,125,41,27,114,179,0,0,0,114,97,0,0, + 0,114,82,0,0,0,114,224,0,0,0,114,50,0,0,0, + 114,18,0,0,0,114,227,0,0,0,114,152,0,0,0,218, + 10,109,101,109,111,114,121,118,105,101,119,114,163,0,0,0, + 90,21,99,104,101,99,107,95,104,97,115,104,95,98,97,115, + 101,100,95,112,121,99,115,114,157,0,0,0,218,17,95,82, + 65,87,95,77,65,71,73,67,95,78,85,77,66,69,82,114, + 158,0,0,0,114,156,0,0,0,114,117,0,0,0,114,150, + 0,0,0,114,134,0,0,0,114,149,0,0,0,114,165,0, + 0,0,114,233,0,0,0,114,1,0,0,0,218,19,100,111, + 110,116,95,119,114,105,116,101,95,98,121,116,101,99,111,100, + 101,114,171,0,0,0,114,170,0,0,0,114,23,0,0,0, + 114,226,0,0,0,41,15,114,118,0,0,0,114,139,0,0, + 0,114,107,0,0,0,114,154,0,0,0,114,174,0,0,0, + 114,157,0,0,0,90,10,104,97,115,104,95,98,97,115,101, + 100,90,12,99,104,101,99,107,95,115,111,117,114,99,101,114, + 106,0,0,0,218,2,115,116,114,26,0,0,0,114,151,0, + 0,0,114,2,0,0,0,90,10,98,121,116,101,115,95,100, + 97,116,97,90,11,99,111,100,101,95,111,98,106,101,99,116, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 213,0,0,0,90,3,0,0,115,160,0,0,0,10,7,4, + 1,4,1,4,1,4,1,4,1,2,1,12,1,12,1,12, + 1,2,2,14,1,12,1,8,1,12,2,2,1,14,1,12, + 1,6,1,2,3,2,1,6,254,2,4,12,1,16,1,12, + 1,6,1,12,1,12,1,2,1,2,255,8,2,4,254,10, + 3,4,1,2,1,2,1,4,254,8,4,2,1,6,255,2, + 3,2,1,2,1,6,1,2,1,2,1,8,251,18,7,6, + 1,8,2,2,1,4,255,6,2,2,1,2,1,6,254,10, + 3,10,1,12,1,12,1,18,1,6,1,4,255,6,2,10, + 1,10,1,14,1,6,2,6,1,4,255,2,2,16,1,4, + 3,14,254,2,1,4,1,2,255,4,1,255,128,122,21,83, + 111,117,114,99,101,76,111,97,100,101,114,46,103,101,116,95, + 99,111,100,101,78,41,10,114,125,0,0,0,114,124,0,0, + 0,114,126,0,0,0,114,223,0,0,0,114,224,0,0,0, + 114,226,0,0,0,114,225,0,0,0,114,229,0,0,0,114, + 233,0,0,0,114,213,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,221,0, + 0,0,31,3,0,0,115,18,0,0,0,8,0,8,2,8, + 8,8,14,8,10,8,7,14,10,12,8,255,128,114,221,0, 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,64,0,0,0,115,92,0,0,0, + 0,0,0,4,0,0,0,0,0,0,0,115,92,0,0,0, 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, - 132,0,90,6,100,8,100,9,132,0,90,7,100,10,100,11, - 132,0,90,8,100,12,100,13,132,0,90,9,100,14,100,15, - 132,0,90,10,100,16,100,17,132,0,90,11,101,12,100,18, - 100,19,132,0,131,1,90,13,100,20,83,0,41,21,114,252, - 0,0,0,122,93,76,111,97,100,101,114,32,102,111,114,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 115,46,10,10,32,32,32,32,84,104,101,32,99,111,110,115, - 116,114,117,99,116,111,114,32,105,115,32,100,101,115,105,103, - 110,101,100,32,116,111,32,119,111,114,107,32,119,105,116,104, - 32,70,105,108,101,70,105,110,100,101,114,46,10,10,32,32, - 32,32,99,3,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, - 124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0, - 114,109,0,0,0,114,159,0,0,0,41,3,114,118,0,0, - 0,114,116,0,0,0,114,44,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,51, - 4,0,0,115,8,0,0,0,6,1,6,1,4,128,255,128, - 122,28,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,0,0,0,0,2,0,0,0,2, - 0,0,0,67,0,0,0,115,24,0,0,0,124,0,106,0, - 124,1,106,0,107,2,111,22,124,0,106,1,124,1,106,1, - 107,2,83,0,114,109,0,0,0,114,240,0,0,0,114,242, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,243,0,0,0,55,4,0,0,115,8,0,0,0, - 12,1,10,1,2,255,255,128,122,26,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95, - 101,113,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,20,0, - 0,0,116,0,124,0,106,1,131,1,116,0,124,0,106,2, - 131,1,65,0,83,0,114,109,0,0,0,114,244,0,0,0, - 114,246,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,247,0,0,0,59,4,0,0,115,4,0, - 0,0,20,1,255,128,122,28,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97, - 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,5,0,0,0,67,0,0,0,115,36,0, - 0,0,116,0,160,1,116,2,106,3,124,1,161,2,125,2, - 116,0,160,4,100,1,124,1,106,5,124,0,106,6,161,3, - 1,0,124,2,83,0,41,2,122,38,67,114,101,97,116,101, - 32,97,110,32,117,110,105,116,105,97,108,105,122,101,100,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 122,38,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,32,123,33,114,125,32,108,111,97,100,101,100,32,102, - 114,111,109,32,123,33,114,125,41,7,114,134,0,0,0,114, - 214,0,0,0,114,163,0,0,0,90,14,99,114,101,97,116, - 101,95,100,121,110,97,109,105,99,114,149,0,0,0,114,116, - 0,0,0,114,44,0,0,0,41,3,114,118,0,0,0,114, - 187,0,0,0,114,216,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,212,0,0,0,62,4,0, - 0,115,16,0,0,0,4,2,6,1,4,255,6,2,8,1, - 4,255,4,2,255,128,122,33,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,99,114,101,97, - 116,101,95,109,111,100,117,108,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,5,0,0,0,67,0, - 0,0,115,36,0,0,0,116,0,160,1,116,2,106,3,124, - 1,161,2,1,0,116,0,160,4,100,1,124,0,106,5,124, - 0,106,6,161,3,1,0,100,2,83,0,41,3,122,30,73, - 110,105,116,105,97,108,105,122,101,32,97,110,32,101,120,116, - 101,110,115,105,111,110,32,109,111,100,117,108,101,122,40,101, - 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,32, - 123,33,114,125,32,101,120,101,99,117,116,101,100,32,102,114, - 111,109,32,123,33,114,125,78,41,7,114,134,0,0,0,114, - 214,0,0,0,114,163,0,0,0,90,12,101,120,101,99,95, - 100,121,110,97,109,105,99,114,149,0,0,0,114,116,0,0, - 0,114,44,0,0,0,169,2,114,118,0,0,0,114,216,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,217,0,0,0,70,4,0,0,115,12,0,0,0,14, - 2,6,1,8,1,4,255,4,128,255,128,122,31,69,120,116, - 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, - 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,3,0,0,0,115,36,0,0,0,116,0,124,0,106,1, - 131,1,100,1,25,0,137,0,116,2,135,0,102,1,100,2, - 100,3,132,8,116,3,68,0,131,1,131,1,83,0,41,4, - 122,49,82,101,116,117,114,110,32,84,114,117,101,32,105,102, - 32,116,104,101,32,101,120,116,101,110,115,105,111,110,32,109, - 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, - 103,101,46,114,39,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,51,0,0, - 0,115,26,0,0,0,124,0,93,18,125,1,136,0,100,0, - 124,1,23,0,107,2,86,0,1,0,113,2,100,1,83,0, - 41,2,114,209,0,0,0,78,114,5,0,0,0,169,2,114, - 32,0,0,0,218,6,115,117,102,102,105,120,169,1,90,9, - 102,105,108,101,95,110,97,109,101,114,5,0,0,0,114,8, - 0,0,0,218,9,60,103,101,110,101,120,112,114,62,79,4, - 0,0,115,10,0,0,0,4,0,2,1,16,255,4,128,255, - 128,122,49,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,111,99,97,108,115,62,46,60,103,101,110,101, - 120,112,114,62,41,4,114,47,0,0,0,114,44,0,0,0, - 218,3,97,110,121,218,18,69,88,84,69,78,83,73,79,78, - 95,83,85,70,70,73,88,69,83,114,219,0,0,0,114,5, - 0,0,0,114,9,1,0,0,114,8,0,0,0,114,182,0, - 0,0,76,4,0,0,115,10,0,0,0,14,2,12,1,2, - 1,8,255,255,128,122,30,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,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,122,63,82,101,116,117,114, - 110,32,78,111,110,101,32,97,115,32,97,110,32,101,120,116, - 101,110,115,105,111,110,32,109,111,100,117,108,101,32,99,97, - 110,110,111,116,32,99,114,101,97,116,101,32,97,32,99,111, - 100,101,32,111,98,106,101,99,116,46,78,114,5,0,0,0, - 114,219,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,213,0,0,0,82,4,0,0,115,4,0, - 0,0,4,2,255,128,122,28,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,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,41,2,122,53,82,101,116,117,114,110, - 32,78,111,110,101,32,97,115,32,101,120,116,101,110,115,105, - 111,110,32,109,111,100,117,108,101,115,32,104,97,118,101,32, - 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, - 114,5,0,0,0,114,219,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,229,0,0,0,86,4, - 0,0,115,4,0,0,0,4,2,255,128,122,30,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,99,2,0,0,0, + 132,0,90,6,101,7,135,0,102,1,100,8,100,9,132,8, + 131,1,90,8,101,7,100,10,100,11,132,0,131,1,90,9, + 100,12,100,13,132,0,90,10,101,7,100,14,100,15,132,0, + 131,1,90,11,135,0,4,0,90,12,83,0,41,16,218,10, + 70,105,108,101,76,111,97,100,101,114,122,103,66,97,115,101, + 32,102,105,108,101,32,108,111,97,100,101,114,32,99,108,97, + 115,115,32,119,104,105,99,104,32,105,109,112,108,101,109,101, + 110,116,115,32,116,104,101,32,108,111,97,100,101,114,32,112, + 114,111,116,111,99,111,108,32,109,101,116,104,111,100,115,32, + 116,104,97,116,10,32,32,32,32,114,101,113,117,105,114,101, + 32,102,105,108,101,32,115,121,115,116,101,109,32,117,115,97, + 103,101,46,99,3,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0, + 0,124,1,124,0,95,0,124,2,124,0,95,1,100,1,83, + 0,41,2,122,75,67,97,99,104,101,32,116,104,101,32,109, + 111,100,117,108,101,32,110,97,109,101,32,97,110,100,32,116, + 104,101,32,112,97,116,104,32,116,111,32,116,104,101,32,102, + 105,108,101,32,102,111,117,110,100,32,98,121,32,116,104,101, + 10,32,32,32,32,32,32,32,32,102,105,110,100,101,114,46, + 78,114,159,0,0,0,41,3,114,118,0,0,0,114,139,0, + 0,0,114,44,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,209,0,0,0,180,3,0,0,115, + 8,0,0,0,6,3,6,1,4,128,255,128,122,19,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,0,0,0,0,2,0, + 0,0,2,0,0,0,67,0,0,0,115,24,0,0,0,124, + 0,106,0,124,1,106,0,107,2,111,22,124,0,106,1,124, + 1,106,1,107,2,83,0,114,109,0,0,0,169,2,218,9, + 95,95,99,108,97,115,115,95,95,114,131,0,0,0,169,2, + 114,118,0,0,0,90,5,111,116,104,101,114,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,6,95,95,101, + 113,95,95,186,3,0,0,115,8,0,0,0,12,1,10,1, + 2,255,255,128,122,17,70,105,108,101,76,111,97,100,101,114, + 46,95,95,101,113,95,95,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,20,0,0,0,116,0,124,0,106,1,131,1,116,0,124, + 0,106,2,131,1,65,0,83,0,114,109,0,0,0,169,3, + 218,4,104,97,115,104,114,116,0,0,0,114,44,0,0,0, + 169,1,114,118,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,8,95,95,104,97,115,104,95,95, + 190,3,0,0,115,4,0,0,0,20,1,255,128,122,19,70, + 105,108,101,76,111,97,100,101,114,46,95,95,104,97,115,104, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,3,0,0,0,115,16,0,0,0, + 116,0,116,1,124,0,131,2,160,2,124,1,161,1,83,0, + 41,1,122,100,76,111,97,100,32,97,32,109,111,100,117,108, + 101,32,102,114,111,109,32,97,32,102,105,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,41,3,218,5,115,117,112,101, + 114,114,239,0,0,0,114,220,0,0,0,114,219,0,0,0, + 169,1,114,241,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,220,0,0,0,193,3,0,0,115,4,0,0,0,16, + 10,255,128,122,22,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,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,114, - 250,0,0,0,114,48,0,0,0,114,219,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,179,0, - 0,0,90,4,0,0,115,4,0,0,0,6,3,255,128,122, - 32,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, + 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,169, + 1,122,58,82,101,116,117,114,110,32,116,104,101,32,112,97, + 116,104,32,116,111,32,116,104,101,32,115,111,117,114,99,101, + 32,102,105,108,101,32,97,115,32,102,111,117,110,100,32,98, + 121,32,116,104,101,32,102,105,110,100,101,114,46,114,48,0, + 0,0,114,219,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,179,0,0,0,205,3,0,0,115, + 4,0,0,0,6,3,255,128,122,23,70,105,108,101,76,111, 97,100,101,114,46,103,101,116,95,102,105,108,101,110,97,109, - 101,78,41,14,114,125,0,0,0,114,124,0,0,0,114,126, - 0,0,0,114,127,0,0,0,114,209,0,0,0,114,243,0, - 0,0,114,247,0,0,0,114,212,0,0,0,114,217,0,0, - 0,114,182,0,0,0,114,213,0,0,0,114,229,0,0,0, - 114,136,0,0,0,114,179,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,252, - 0,0,0,43,4,0,0,115,26,0,0,0,8,0,4,2, - 8,6,8,4,8,4,8,3,8,8,8,6,8,6,8,4, - 2,4,14,1,255,128,114,252,0,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 64,0,0,0,115,104,0,0,0,101,0,90,1,100,0,90, - 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, - 5,132,0,90,5,100,6,100,7,132,0,90,6,100,8,100, - 9,132,0,90,7,100,10,100,11,132,0,90,8,100,12,100, - 13,132,0,90,9,100,14,100,15,132,0,90,10,100,16,100, - 17,132,0,90,11,100,18,100,19,132,0,90,12,100,20,100, - 21,132,0,90,13,100,22,100,23,132,0,90,14,100,24,83, - 0,41,25,218,14,95,78,97,109,101,115,112,97,99,101,80, - 97,116,104,97,38,1,0,0,82,101,112,114,101,115,101,110, - 116,115,32,97,32,110,97,109,101,115,112,97,99,101,32,112, - 97,99,107,97,103,101,39,115,32,112,97,116,104,46,32,32, - 73,116,32,117,115,101,115,32,116,104,101,32,109,111,100,117, - 108,101,32,110,97,109,101,10,32,32,32,32,116,111,32,102, - 105,110,100,32,105,116,115,32,112,97,114,101,110,116,32,109, - 111,100,117,108,101,44,32,97,110,100,32,102,114,111,109,32, - 116,104,101,114,101,32,105,116,32,108,111,111,107,115,32,117, - 112,32,116,104,101,32,112,97,114,101,110,116,39,115,10,32, - 32,32,32,95,95,112,97,116,104,95,95,46,32,32,87,104, - 101,110,32,116,104,105,115,32,99,104,97,110,103,101,115,44, - 32,116,104,101,32,109,111,100,117,108,101,39,115,32,111,119, - 110,32,112,97,116,104,32,105,115,32,114,101,99,111,109,112, - 117,116,101,100,44,10,32,32,32,32,117,115,105,110,103,32, - 112,97,116,104,95,102,105,110,100,101,114,46,32,32,70,111, - 114,32,116,111,112,45,108,101,118,101,108,32,109,111,100,117, - 108,101,115,44,32,116,104,101,32,112,97,114,101,110,116,32, - 109,111,100,117,108,101,39,115,32,112,97,116,104,10,32,32, - 32,32,105,115,32,115,121,115,46,112,97,116,104,46,99,4, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3, - 0,0,0,67,0,0,0,115,36,0,0,0,124,1,124,0, - 95,0,124,2,124,0,95,1,116,2,124,0,160,3,161,0, - 131,1,124,0,95,4,124,3,124,0,95,5,100,0,83,0, - 114,109,0,0,0,41,6,218,5,95,110,97,109,101,218,5, - 95,112,97,116,104,114,111,0,0,0,218,16,95,103,101,116, - 95,112,97,114,101,110,116,95,112,97,116,104,218,17,95,108, - 97,115,116,95,112,97,114,101,110,116,95,112,97,116,104,218, - 12,95,112,97,116,104,95,102,105,110,100,101,114,169,4,114, - 118,0,0,0,114,116,0,0,0,114,44,0,0,0,90,11, - 112,97,116,104,95,102,105,110,100,101,114,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,103, - 4,0,0,115,12,0,0,0,6,1,6,1,14,1,6,1, - 4,128,255,128,122,23,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,0,0,0,0,4,0,0,0,3,0, - 0,0,67,0,0,0,115,38,0,0,0,124,0,106,0,160, - 1,100,1,161,1,92,3,125,1,125,2,125,3,124,2,100, - 2,107,2,114,30,100,3,83,0,124,1,100,4,102,2,83, - 0,41,5,122,62,82,101,116,117,114,110,115,32,97,32,116, - 117,112,108,101,32,111,102,32,40,112,97,114,101,110,116,45, - 109,111,100,117,108,101,45,110,97,109,101,44,32,112,97,114, - 101,110,116,45,112,97,116,104,45,97,116,116,114,45,110,97, - 109,101,41,114,71,0,0,0,114,40,0,0,0,41,2,114, - 1,0,0,0,114,44,0,0,0,90,8,95,95,112,97,116, - 104,95,95,41,2,114,14,1,0,0,114,41,0,0,0,41, - 4,114,118,0,0,0,114,4,1,0,0,218,3,100,111,116, - 90,2,109,101,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,23,95,102,105,110,100,95,112,97,114,101,110, - 116,95,112,97,116,104,95,110,97,109,101,115,109,4,0,0, - 115,10,0,0,0,18,2,8,1,4,2,8,3,255,128,122, - 38,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,101,115,99,1,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, - 115,28,0,0,0,124,0,160,0,161,0,92,2,125,1,125, - 2,116,1,116,2,106,3,124,1,25,0,124,2,131,2,83, - 0,114,109,0,0,0,41,4,114,21,1,0,0,114,130,0, - 0,0,114,1,0,0,0,218,7,109,111,100,117,108,101,115, - 41,3,114,118,0,0,0,90,18,112,97,114,101,110,116,95, - 109,111,100,117,108,101,95,110,97,109,101,90,14,112,97,116, - 104,95,97,116,116,114,95,110,97,109,101,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,16,1,0,0,119, - 4,0,0,115,6,0,0,0,12,1,16,1,255,128,122,31, - 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,0,0,0,0,3,0,0,0, - 4,0,0,0,67,0,0,0,115,80,0,0,0,116,0,124, - 0,160,1,161,0,131,1,125,1,124,1,124,0,106,2,107, - 3,114,74,124,0,160,3,124,0,106,4,124,1,161,2,125, - 2,124,2,100,0,117,1,114,68,124,2,106,5,100,0,117, - 0,114,68,124,2,106,6,114,68,124,2,106,6,124,0,95, - 7,124,1,124,0,95,2,124,0,106,7,83,0,114,109,0, - 0,0,41,8,114,111,0,0,0,114,16,1,0,0,114,17, - 1,0,0,114,18,1,0,0,114,14,1,0,0,114,140,0, - 0,0,114,178,0,0,0,114,15,1,0,0,41,3,114,118, - 0,0,0,90,11,112,97,114,101,110,116,95,112,97,116,104, - 114,187,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,12,95,114,101,99,97,108,99,117,108,97, - 116,101,123,4,0,0,115,18,0,0,0,12,2,10,1,14, - 1,18,3,6,1,8,1,6,1,6,1,255,128,122,27,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,114, - 101,99,97,108,99,117,108,97,116,101,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, - 0,0,0,115,12,0,0,0,116,0,124,0,160,1,161,0, - 131,1,83,0,114,109,0,0,0,41,2,218,4,105,116,101, - 114,114,23,1,0,0,114,246,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,218,8,95,95,105,116, - 101,114,95,95,136,4,0,0,115,4,0,0,0,12,1,255, - 128,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,95,105,116,101,114,95,95,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67, - 0,0,0,115,12,0,0,0,124,0,160,0,161,0,124,1, - 25,0,83,0,114,109,0,0,0,169,1,114,23,1,0,0, - 41,2,114,118,0,0,0,218,5,105,110,100,101,120,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,218,11,95, - 95,103,101,116,105,116,101,109,95,95,139,4,0,0,115,4, - 0,0,0,12,1,255,128,122,26,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,46,95,95,103,101,116,105,116,101, - 109,95,95,99,3,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,3,0,0,0,67,0,0,0,115,14,0,0, - 0,124,2,124,0,106,0,124,1,60,0,100,0,83,0,114, - 109,0,0,0,41,1,114,15,1,0,0,41,3,114,118,0, - 0,0,114,27,1,0,0,114,44,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,11,95,95,115, - 101,116,105,116,101,109,95,95,142,4,0,0,115,6,0,0, - 0,10,1,4,128,255,128,122,26,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,46,95,95,115,101,116,105,116,101, - 109,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, - 0,116,0,124,0,160,1,161,0,131,1,83,0,114,109,0, - 0,0,41,2,114,23,0,0,0,114,23,1,0,0,114,246, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,7,95,95,108,101,110,95,95,145,4,0,0,115, - 4,0,0,0,12,1,255,128,122,22,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,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, - 160,0,124,0,106,1,161,1,83,0,41,2,78,122,20,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, - 114,125,41,41,2,114,62,0,0,0,114,15,1,0,0,114, - 246,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,8,95,95,114,101,112,114,95,95,148,4,0, - 0,115,4,0,0,0,12,1,255,128,122,23,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,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, - 0,124,1,124,0,160,0,161,0,118,0,83,0,114,109,0, - 0,0,114,26,1,0,0,169,2,114,118,0,0,0,218,4, - 105,116,101,109,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, - 95,151,4,0,0,115,4,0,0,0,12,1,255,128,122,27, - 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,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124, - 1,161,1,1,0,100,0,83,0,114,109,0,0,0,41,2, - 114,15,1,0,0,114,186,0,0,0,114,32,1,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,186, - 0,0,0,154,4,0,0,115,6,0,0,0,12,1,4,128, - 255,128,122,21,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,97,112,112,101,110,100,78,41,15,114,125,0,0, - 0,114,124,0,0,0,114,126,0,0,0,114,127,0,0,0, - 114,209,0,0,0,114,21,1,0,0,114,16,1,0,0,114, - 23,1,0,0,114,25,1,0,0,114,28,1,0,0,114,29, - 1,0,0,114,30,1,0,0,114,31,1,0,0,114,34,1, - 0,0,114,186,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,114,13,1,0,0, - 96,4,0,0,115,28,0,0,0,8,0,4,1,8,6,8, - 6,8,10,8,4,8,13,8,3,8,3,8,3,8,3,8, - 3,12,3,255,128,114,13,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, - 0,0,0,115,80,0,0,0,101,0,90,1,100,0,90,2, - 100,1,100,2,132,0,90,3,101,4,100,3,100,4,132,0, - 131,1,90,5,100,5,100,6,132,0,90,6,100,7,100,8, - 132,0,90,7,100,9,100,10,132,0,90,8,100,11,100,12, - 132,0,90,9,100,13,100,14,132,0,90,10,100,15,100,16, - 132,0,90,11,100,17,83,0,41,18,218,16,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,99,4,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, - 0,67,0,0,0,115,18,0,0,0,116,0,124,1,124,2, - 124,3,131,3,124,0,95,1,100,0,83,0,114,109,0,0, - 0,41,2,114,13,1,0,0,114,15,1,0,0,114,19,1, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,8,0,0,0,67,0,0,0,115,128,0,0,0,116, + 0,124,0,116,1,116,2,102,2,131,2,114,72,116,3,160, + 4,116,5,124,1,131,1,161,1,143,24,125,2,124,2,160, + 6,161,0,87,0,2,0,100,1,4,0,4,0,131,3,1, + 0,83,0,49,0,115,58,48,0,1,0,1,0,1,0,89, + 0,1,0,100,1,83,0,116,3,160,7,124,1,100,2,161, + 2,143,24,125,2,124,2,160,6,161,0,87,0,2,0,100, + 1,4,0,4,0,131,3,1,0,83,0,49,0,115,114,48, + 0,1,0,1,0,1,0,89,0,1,0,100,1,83,0,41, + 3,122,39,82,101,116,117,114,110,32,116,104,101,32,100,97, + 116,97,32,102,114,111,109,32,112,97,116,104,32,97,115,32, + 114,97,119,32,98,121,116,101,115,46,78,218,1,114,41,8, + 114,161,0,0,0,114,221,0,0,0,218,19,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,114, + 64,0,0,0,90,9,111,112,101,110,95,99,111,100,101,114, + 84,0,0,0,90,4,114,101,97,100,114,65,0,0,0,41, + 3,114,118,0,0,0,114,44,0,0,0,114,68,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 227,0,0,0,210,3,0,0,115,16,0,0,0,14,2,16, + 1,38,1,4,128,14,2,38,1,4,128,255,128,122,19,70, + 105,108,101,76,111,97,100,101,114,46,103,101,116,95,100,97, + 116,97,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,2,0,0,0,67,0,0,0,115,20,0,0,0, + 100,1,100,2,108,0,109,1,125,2,1,0,124,2,124,0, + 131,1,83,0,41,3,78,114,73,0,0,0,41,1,218,10, + 70,105,108,101,82,101,97,100,101,114,41,2,90,17,105,109, + 112,111,114,116,108,105,98,46,114,101,97,100,101,114,115,114, + 253,0,0,0,41,3,114,118,0,0,0,114,216,0,0,0, + 114,253,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,19,103,101,116,95,114,101,115,111,117,114, + 99,101,95,114,101,97,100,101,114,219,3,0,0,115,6,0, + 0,0,12,2,8,1,255,128,122,30,70,105,108,101,76,111, + 97,100,101,114,46,103,101,116,95,114,101,115,111,117,114,99, + 101,95,114,101,97,100,101,114,41,13,114,125,0,0,0,114, + 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,209, + 0,0,0,114,243,0,0,0,114,247,0,0,0,114,136,0, + 0,0,114,220,0,0,0,114,179,0,0,0,114,227,0,0, + 0,114,254,0,0,0,90,13,95,95,99,108,97,115,115,99, + 101,108,108,95,95,114,5,0,0,0,114,5,0,0,0,114, + 249,0,0,0,114,8,0,0,0,114,239,0,0,0,175,3, + 0,0,115,26,0,0,0,8,0,4,2,8,3,8,6,8, + 4,2,3,14,1,2,11,10,1,8,4,2,9,18,1,255, + 128,114,239,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, + 46,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, + 100,6,100,7,156,1,100,8,100,9,132,2,90,6,100,10, + 83,0,41,11,218,16,83,111,117,114,99,101,70,105,108,101, + 76,111,97,100,101,114,122,62,67,111,110,99,114,101,116,101, + 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, + 111,102,32,83,111,117,114,99,101,76,111,97,100,101,114,32, + 117,115,105,110,103,32,116,104,101,32,102,105,108,101,32,115, + 121,115,116,101,109,46,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, + 22,0,0,0,116,0,124,1,131,1,125,2,124,2,106,1, + 124,2,106,2,100,1,156,2,83,0,41,2,122,33,82,101, + 116,117,114,110,32,116,104,101,32,109,101,116,97,100,97,116, + 97,32,102,111,114,32,116,104,101,32,112,97,116,104,46,41, + 2,114,169,0,0,0,114,234,0,0,0,41,3,114,49,0, + 0,0,218,8,115,116,95,109,116,105,109,101,90,7,115,116, + 95,115,105,122,101,41,3,114,118,0,0,0,114,44,0,0, + 0,114,238,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,224,0,0,0,229,3,0,0,115,6, + 0,0,0,8,2,14,1,255,128,122,27,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,0,0, + 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, + 24,0,0,0,116,0,124,1,131,1,125,4,124,0,106,1, + 124,2,124,3,124,4,100,1,141,3,83,0,41,2,78,169, + 1,218,5,95,109,111,100,101,41,2,114,114,0,0,0,114, + 225,0,0,0,41,5,114,118,0,0,0,114,107,0,0,0, + 114,106,0,0,0,114,26,0,0,0,114,52,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,226, + 0,0,0,234,3,0,0,115,6,0,0,0,8,2,16,1, + 255,128,122,32,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, + 99,111,100,101,114,60,0,0,0,114,1,1,0,0,99,3, + 0,0,0,0,0,0,0,1,0,0,0,9,0,0,0,11, + 0,0,0,67,0,0,0,115,244,0,0,0,116,0,124,1, + 131,1,92,2,125,4,125,5,103,0,125,6,124,4,114,52, + 116,1,124,4,131,1,115,52,116,0,124,4,131,1,92,2, + 125,4,125,7,124,6,160,2,124,7,161,1,1,0,113,16, + 116,3,124,6,131,1,68,0,93,98,125,7,116,4,124,4, + 124,7,131,2,125,4,122,14,116,5,160,6,124,4,161,1, + 1,0,87,0,113,60,4,0,116,7,121,106,1,0,1,0, + 1,0,89,0,113,60,4,0,116,8,121,158,1,0,125,8, + 1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,3, + 1,0,87,0,89,0,100,2,125,8,126,8,1,0,100,2, + 83,0,100,2,125,8,126,8,48,0,48,0,122,30,116,11, + 124,1,124,2,124,3,131,3,1,0,116,9,160,10,100,3, + 124,1,161,2,1,0,87,0,100,2,83,0,4,0,116,8, + 121,242,1,0,125,8,1,0,122,28,116,9,160,10,100,1, + 124,1,124,8,161,3,1,0,87,0,89,0,100,2,125,8, + 126,8,100,2,83,0,100,2,125,8,126,8,48,0,48,0, + 41,4,122,27,87,114,105,116,101,32,98,121,116,101,115,32, + 100,97,116,97,32,116,111,32,97,32,102,105,108,101,46,122, + 27,99,111,117,108,100,32,110,111,116,32,99,114,101,97,116, + 101,32,123,33,114,125,58,32,123,33,114,125,78,122,12,99, + 114,101,97,116,101,100,32,123,33,114,125,41,12,114,47,0, + 0,0,114,56,0,0,0,114,186,0,0,0,114,42,0,0, + 0,114,38,0,0,0,114,4,0,0,0,90,5,109,107,100, + 105,114,218,15,70,105,108,101,69,120,105,115,116,115,69,114, + 114,111,114,114,50,0,0,0,114,134,0,0,0,114,149,0, + 0,0,114,69,0,0,0,41,9,114,118,0,0,0,114,44, + 0,0,0,114,26,0,0,0,114,2,1,0,0,218,6,112, + 97,114,101,110,116,114,96,0,0,0,114,37,0,0,0,114, + 33,0,0,0,114,228,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,225,0,0,0,239,3,0, + 0,115,54,0,0,0,12,2,4,1,12,2,12,1,12,1, + 12,2,10,1,2,1,14,1,12,1,4,2,14,1,6,3, + 4,1,4,255,16,2,10,128,2,1,12,1,14,1,4,128, + 14,1,8,2,2,1,8,255,20,128,255,128,122,25,83,111, + 117,114,99,101,70,105,108,101,76,111,97,100,101,114,46,115, + 101,116,95,100,97,116,97,78,41,7,114,125,0,0,0,114, + 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,224, + 0,0,0,114,226,0,0,0,114,225,0,0,0,114,5,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,209,0,0,0,160,4,0,0,115,6,0,0,0,14, - 1,4,128,255,128,122,25,95,78,97,109,101,115,112,97,99, - 101,76,111,97,100,101,114,46,95,95,105,110,105,116,95,95, + 0,114,255,0,0,0,225,3,0,0,115,12,0,0,0,8, + 0,4,2,8,2,8,5,18,5,255,128,114,255,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,64,0,0,0,115,32,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,100,6,83,0,41,7, + 218,20,83,111,117,114,99,101,108,101,115,115,70,105,108,101, + 76,111,97,100,101,114,122,45,76,111,97,100,101,114,32,119, + 104,105,99,104,32,104,97,110,100,108,101,115,32,115,111,117, + 114,99,101,108,101,115,115,32,102,105,108,101,32,105,109,112, + 111,114,116,115,46,99,2,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,68, + 0,0,0,124,0,160,0,124,1,161,1,125,2,124,0,160, + 1,124,2,161,1,125,3,124,1,124,2,100,1,156,2,125, + 4,116,2,124,3,124,1,124,4,131,3,1,0,116,3,116, + 4,124,3,131,1,100,2,100,0,133,2,25,0,124,1,124, + 2,100,3,141,3,83,0,41,4,78,114,159,0,0,0,114, + 145,0,0,0,41,2,114,116,0,0,0,114,106,0,0,0, + 41,5,114,179,0,0,0,114,227,0,0,0,114,152,0,0, + 0,114,165,0,0,0,114,235,0,0,0,41,5,114,118,0, + 0,0,114,139,0,0,0,114,44,0,0,0,114,26,0,0, + 0,114,151,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,213,0,0,0,18,4,0,0,115,24, + 0,0,0,10,1,10,1,2,4,2,1,6,254,12,4,2, + 1,14,1,2,1,2,1,6,253,255,128,122,29,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,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,39, + 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,116, + 104,101,114,101,32,105,115,32,110,111,32,115,111,117,114,99, + 101,32,99,111,100,101,46,78,114,5,0,0,0,114,219,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,229,0,0,0,34,4,0,0,115,4,0,0,0,4, + 2,255,128,122,31,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,41,6,114,125,0,0,0,114,124,0,0, + 0,114,126,0,0,0,114,127,0,0,0,114,213,0,0,0, + 114,229,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,5,1,0,0,14,4, + 0,0,115,10,0,0,0,8,0,4,2,8,2,12,16,255, + 128,114,5,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, + 92,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, + 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, + 100,10,100,11,132,0,90,8,100,12,100,13,132,0,90,9, + 100,14,100,15,132,0,90,10,100,16,100,17,132,0,90,11, + 101,12,100,18,100,19,132,0,131,1,90,13,100,20,83,0, + 41,21,114,252,0,0,0,122,93,76,111,97,100,101,114,32, + 102,111,114,32,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,115,46,10,10,32,32,32,32,84,104,101,32, + 99,111,110,115,116,114,117,99,116,111,114,32,105,115,32,100, + 101,115,105,103,110,101,100,32,116,111,32,119,111,114,107,32, + 119,105,116,104,32,70,105,108,101,70,105,110,100,101,114,46, + 10,10,32,32,32,32,99,3,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, + 16,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, + 100,0,83,0,114,109,0,0,0,114,159,0,0,0,41,3, + 114,118,0,0,0,114,116,0,0,0,114,44,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,209, + 0,0,0,51,4,0,0,115,8,0,0,0,6,1,6,1, + 4,128,255,128,122,28,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,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,24,0,0,0, + 124,0,106,0,124,1,106,0,107,2,111,22,124,0,106,1, + 124,1,106,1,107,2,83,0,114,109,0,0,0,114,240,0, + 0,0,114,242,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,243,0,0,0,55,4,0,0,115, + 8,0,0,0,12,1,10,1,2,255,255,128,122,26,69,120, + 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, + 114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,0, + 124,0,106,2,131,1,65,0,83,0,114,109,0,0,0,114, + 244,0,0,0,114,246,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,247,0,0,0,59,4,0, + 0,115,4,0,0,0,20,1,255,128,122,28,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, + 95,95,104,97,115,104,95,95,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0, + 0,115,36,0,0,0,116,0,160,1,116,2,106,3,124,1, + 161,2,125,2,116,0,160,4,100,1,124,1,106,5,124,0, + 106,6,161,3,1,0,124,2,83,0,41,2,122,38,67,114, + 101,97,116,101,32,97,110,32,117,110,105,116,105,97,108,105, + 122,101,100,32,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,122,38,101,120,116,101,110,115,105,111,110,32, + 109,111,100,117,108,101,32,123,33,114,125,32,108,111,97,100, + 101,100,32,102,114,111,109,32,123,33,114,125,41,7,114,134, + 0,0,0,114,214,0,0,0,114,163,0,0,0,90,14,99, + 114,101,97,116,101,95,100,121,110,97,109,105,99,114,149,0, + 0,0,114,116,0,0,0,114,44,0,0,0,41,3,114,118, + 0,0,0,114,187,0,0,0,114,216,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,212,0,0, + 0,62,4,0,0,115,16,0,0,0,4,2,6,1,4,255, + 6,2,8,1,4,255,4,2,255,128,122,33,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, + 99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,0, + 0,0,67,0,0,0,115,36,0,0,0,116,0,160,1,116, + 2,106,3,124,1,161,2,1,0,116,0,160,4,100,1,124, + 0,106,5,124,0,106,6,161,3,1,0,100,2,83,0,41, + 3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,110, + 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, + 101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,100, + 117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,101, + 100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,134, + 0,0,0,114,214,0,0,0,114,163,0,0,0,90,12,101, + 120,101,99,95,100,121,110,97,109,105,99,114,149,0,0,0, + 114,116,0,0,0,114,44,0,0,0,169,2,114,118,0,0, + 0,114,216,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,217,0,0,0,70,4,0,0,115,12, + 0,0,0,14,2,6,1,8,1,4,255,4,128,255,128,122, + 31,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, + 97,100,101,114,46,101,120,101,99,95,109,111,100,117,108,101, 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, - 160,0,124,1,106,1,161,1,83,0,41,2,122,115,82,101, - 116,117,114,110,32,114,101,112,114,32,102,111,114,32,116,104, - 101,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, - 32,32,32,84,104,101,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,46,32,32,84,104, - 101,32,105,109,112,111,114,116,32,109,97,99,104,105,110,101, - 114,121,32,100,111,101,115,32,116,104,101,32,106,111,98,32, - 105,116,115,101,108,102,46,10,10,32,32,32,32,32,32,32, - 32,122,25,60,109,111,100,117,108,101,32,123,33,114,125,32, - 40,110,97,109,101,115,112,97,99,101,41,62,41,2,114,62, - 0,0,0,114,125,0,0,0,41,2,114,193,0,0,0,114, - 216,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,11,109,111,100,117,108,101,95,114,101,112,114, - 163,4,0,0,115,4,0,0,0,12,7,255,128,122,28,95, - 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,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,78, - 84,114,5,0,0,0,114,219,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,182,0,0,0,172, - 4,0,0,115,4,0,0,0,4,1,255,128,122,27,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,105, + 0,4,0,0,0,3,0,0,0,115,36,0,0,0,116,0, + 124,0,106,1,131,1,100,1,25,0,137,0,116,2,135,0, + 102,1,100,2,100,3,132,8,116,3,68,0,131,1,131,1, + 83,0,41,4,122,49,82,101,116,117,114,110,32,84,114,117, + 101,32,105,102,32,116,104,101,32,101,120,116,101,110,115,105, + 111,110,32,109,111,100,117,108,101,32,105,115,32,97,32,112, + 97,99,107,97,103,101,46,114,39,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,51,0,0,0,115,26,0,0,0,124,0,93,18,125,1, + 136,0,100,0,124,1,23,0,107,2,86,0,1,0,113,2, + 100,1,83,0,41,2,114,209,0,0,0,78,114,5,0,0, + 0,169,2,114,32,0,0,0,218,6,115,117,102,102,105,120, + 169,1,90,9,102,105,108,101,95,110,97,109,101,114,5,0, + 0,0,114,8,0,0,0,218,9,60,103,101,110,101,120,112, + 114,62,79,4,0,0,115,10,0,0,0,4,0,2,1,16, + 255,4,128,255,128,122,49,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,111,99,97,108,115,62,46,60, + 103,101,110,101,120,112,114,62,41,4,114,47,0,0,0,114, + 44,0,0,0,218,3,97,110,121,218,18,69,88,84,69,78, + 83,73,79,78,95,83,85,70,70,73,88,69,83,114,219,0, + 0,0,114,5,0,0,0,114,9,1,0,0,114,8,0,0, + 0,114,182,0,0,0,76,4,0,0,115,10,0,0,0,14, + 2,12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,40, - 0,0,0,114,5,0,0,0,114,219,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,229,0,0, - 0,175,4,0,0,115,4,0,0,0,4,1,255,128,122,27, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,63,82, + 101,116,117,114,110,32,78,111,110,101,32,97,115,32,97,110, + 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, + 101,32,99,97,110,110,111,116,32,99,114,101,97,116,101,32, + 97,32,99,111,100,101,32,111,98,106,101,99,116,46,78,114, + 5,0,0,0,114,219,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,213,0,0,0,82,4,0, + 0,115,4,0,0,0,4,2,255,128,122,28,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,53,82,101, + 116,117,114,110,32,78,111,110,101,32,97,115,32,101,120,116, + 101,110,115,105,111,110,32,109,111,100,117,108,101,115,32,104, + 97,118,101,32,110,111,32,115,111,117,114,99,101,32,99,111, + 100,101,46,78,114,5,0,0,0,114,219,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,229,0, + 0,0,86,4,0,0,115,4,0,0,0,4,2,255,128,122, + 30,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,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, + 0,83,0,114,250,0,0,0,114,48,0,0,0,114,219,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,179,0,0,0,90,4,0,0,115,4,0,0,0,6, + 3,255,128,122,32,69,120,116,101,110,115,105,111,110,70,105, + 108,101,76,111,97,100,101,114,46,103,101,116,95,102,105,108, + 101,110,97,109,101,78,41,14,114,125,0,0,0,114,124,0, + 0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,0, + 0,114,243,0,0,0,114,247,0,0,0,114,212,0,0,0, + 114,217,0,0,0,114,182,0,0,0,114,213,0,0,0,114, + 229,0,0,0,114,136,0,0,0,114,179,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,114,252,0,0,0,43,4,0,0,115,26,0,0,0, + 8,0,4,2,8,6,8,4,8,4,8,3,8,8,8,6, + 8,6,8,4,2,4,14,1,255,128,114,252,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,64,0,0,0,115,104,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, + 4,100,4,100,5,132,0,90,5,100,6,100,7,132,0,90, + 6,100,8,100,9,132,0,90,7,100,10,100,11,132,0,90, + 8,100,12,100,13,132,0,90,9,100,14,100,15,132,0,90, + 10,100,16,100,17,132,0,90,11,100,18,100,19,132,0,90, + 12,100,20,100,21,132,0,90,13,100,22,100,23,132,0,90, + 14,100,24,83,0,41,25,218,14,95,78,97,109,101,115,112, + 97,99,101,80,97,116,104,97,38,1,0,0,82,101,112,114, + 101,115,101,110,116,115,32,97,32,110,97,109,101,115,112,97, + 99,101,32,112,97,99,107,97,103,101,39,115,32,112,97,116, + 104,46,32,32,73,116,32,117,115,101,115,32,116,104,101,32, + 109,111,100,117,108,101,32,110,97,109,101,10,32,32,32,32, + 116,111,32,102,105,110,100,32,105,116,115,32,112,97,114,101, + 110,116,32,109,111,100,117,108,101,44,32,97,110,100,32,102, + 114,111,109,32,116,104,101,114,101,32,105,116,32,108,111,111, + 107,115,32,117,112,32,116,104,101,32,112,97,114,101,110,116, + 39,115,10,32,32,32,32,95,95,112,97,116,104,95,95,46, + 32,32,87,104,101,110,32,116,104,105,115,32,99,104,97,110, + 103,101,115,44,32,116,104,101,32,109,111,100,117,108,101,39, + 115,32,111,119,110,32,112,97,116,104,32,105,115,32,114,101, + 99,111,109,112,117,116,101,100,44,10,32,32,32,32,117,115, + 105,110,103,32,112,97,116,104,95,102,105,110,100,101,114,46, + 32,32,70,111,114,32,116,111,112,45,108,101,118,101,108,32, + 109,111,100,117,108,101,115,44,32,116,104,101,32,112,97,114, + 101,110,116,32,109,111,100,117,108,101,39,115,32,112,97,116, + 104,10,32,32,32,32,105,115,32,115,121,115,46,112,97,116, + 104,46,99,4,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,3,0,0,0,67,0,0,0,115,36,0,0,0, + 124,1,124,0,95,0,124,2,124,0,95,1,116,2,124,0, + 160,3,161,0,131,1,124,0,95,4,124,3,124,0,95,5, + 100,0,83,0,114,109,0,0,0,41,6,218,5,95,110,97, + 109,101,218,5,95,112,97,116,104,114,111,0,0,0,218,16, + 95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104, + 218,17,95,108,97,115,116,95,112,97,114,101,110,116,95,112, + 97,116,104,218,12,95,112,97,116,104,95,102,105,110,100,101, + 114,169,4,114,118,0,0,0,114,116,0,0,0,114,44,0, + 0,0,90,11,112,97,116,104,95,102,105,110,100,101,114,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,209, + 0,0,0,103,4,0,0,115,12,0,0,0,6,1,6,1, + 14,1,6,1,4,128,255,128,122,23,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,0,0,0,0,4,0, + 0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,124, + 0,106,0,160,1,100,1,161,1,92,3,125,1,125,2,125, + 3,124,2,100,2,107,2,114,30,100,3,83,0,124,1,100, + 4,102,2,83,0,41,5,122,62,82,101,116,117,114,110,115, + 32,97,32,116,117,112,108,101,32,111,102,32,40,112,97,114, + 101,110,116,45,109,111,100,117,108,101,45,110,97,109,101,44, + 32,112,97,114,101,110,116,45,112,97,116,104,45,97,116,116, + 114,45,110,97,109,101,41,114,71,0,0,0,114,40,0,0, + 0,41,2,114,1,0,0,0,114,44,0,0,0,90,8,95, + 95,112,97,116,104,95,95,41,2,114,14,1,0,0,114,41, + 0,0,0,41,4,114,118,0,0,0,114,4,1,0,0,218, + 3,100,111,116,90,2,109,101,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,23,95,102,105,110,100,95,112, + 97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,115, + 109,4,0,0,115,10,0,0,0,18,2,8,1,4,2,8, + 3,255,128,122,38,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,101,115,99,1,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,28,0,0,0,124,0,160,0,161,0,92, + 2,125,1,125,2,116,1,116,2,106,3,124,1,25,0,124, + 2,131,2,83,0,114,109,0,0,0,41,4,114,21,1,0, + 0,114,130,0,0,0,114,1,0,0,0,218,7,109,111,100, + 117,108,101,115,41,3,114,118,0,0,0,90,18,112,97,114, + 101,110,116,95,109,111,100,117,108,101,95,110,97,109,101,90, + 14,112,97,116,104,95,97,116,116,114,95,110,97,109,101,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,16, + 1,0,0,119,4,0,0,115,6,0,0,0,12,1,16,1, + 255,128,122,31,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,0,0,0,0, + 3,0,0,0,4,0,0,0,67,0,0,0,115,80,0,0, + 0,116,0,124,0,160,1,161,0,131,1,125,1,124,1,124, + 0,106,2,107,3,114,74,124,0,160,3,124,0,106,4,124, + 1,161,2,125,2,124,2,100,0,117,1,114,68,124,2,106, + 5,100,0,117,0,114,68,124,2,106,6,114,68,124,2,106, + 6,124,0,95,7,124,1,124,0,95,2,124,0,106,7,83, + 0,114,109,0,0,0,41,8,114,111,0,0,0,114,16,1, + 0,0,114,17,1,0,0,114,18,1,0,0,114,14,1,0, + 0,114,140,0,0,0,114,178,0,0,0,114,15,1,0,0, + 41,3,114,118,0,0,0,90,11,112,97,114,101,110,116,95, + 112,97,116,104,114,187,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,12,95,114,101,99,97,108, + 99,117,108,97,116,101,123,4,0,0,115,18,0,0,0,12, + 2,10,1,14,1,18,3,6,1,8,1,6,1,6,1,255, + 128,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,46,95,114,101,99,97,108,99,117,108,97,116,101,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, + 0,0,0,67,0,0,0,115,12,0,0,0,116,0,124,0, + 160,1,161,0,131,1,83,0,114,109,0,0,0,41,2,218, + 4,105,116,101,114,114,23,1,0,0,114,246,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,8, + 95,95,105,116,101,114,95,95,136,4,0,0,115,4,0,0, + 0,12,1,255,128,122,23,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, + 0,0,0,67,0,0,0,115,12,0,0,0,124,0,160,0, + 161,0,124,1,25,0,83,0,114,109,0,0,0,169,1,114, + 23,1,0,0,41,2,114,118,0,0,0,218,5,105,110,100, + 101,120,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,11,95,95,103,101,116,105,116,101,109,95,95,139,4, + 0,0,115,4,0,0,0,12,1,255,128,122,26,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,95,95,103,101, + 116,105,116,101,109,95,95,99,3,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, + 115,14,0,0,0,124,2,124,0,106,0,124,1,60,0,100, + 0,83,0,114,109,0,0,0,41,1,114,15,1,0,0,41, + 3,114,118,0,0,0,114,27,1,0,0,114,44,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 11,95,95,115,101,116,105,116,101,109,95,95,142,4,0,0, + 115,6,0,0,0,10,1,4,128,255,128,122,26,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,95,95,115,101, + 116,105,116,101,109,95,95,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,12,0,0,0,116,0,124,0,160,1,161,0,131,1,83, + 0,114,109,0,0,0,41,2,114,23,0,0,0,114,23,1, + 0,0,114,246,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,7,95,95,108,101,110,95,95,145, + 4,0,0,115,4,0,0,0,12,1,255,128,122,22,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,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0, + 0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,2, + 78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,40,123,33,114,125,41,41,2,114,62,0,0,0,114,15, + 1,0,0,114,246,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,8,95,95,114,101,112,114,95, + 95,148,4,0,0,115,4,0,0,0,12,1,255,128,122,23, + 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, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,12,0,0,0,124,1,124,0,160,0,161,0,118,0,83, + 0,114,109,0,0,0,114,26,1,0,0,169,2,114,118,0, + 0,0,218,4,105,116,101,109,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,12,95,95,99,111,110,116,97, + 105,110,115,95,95,151,4,0,0,115,4,0,0,0,12,1, + 255,128,122,27,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,0,0,0,0,2,0,0,0, + 3,0,0,0,67,0,0,0,115,16,0,0,0,124,0,106, + 0,160,1,124,1,161,1,1,0,100,0,83,0,114,109,0, + 0,0,41,2,114,15,1,0,0,114,186,0,0,0,114,32, + 1,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,114,186,0,0,0,154,4,0,0,115,6,0,0,0, + 12,1,4,128,255,128,122,21,95,78,97,109,101,115,112,97, + 99,101,80,97,116,104,46,97,112,112,101,110,100,78,41,15, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 127,0,0,0,114,209,0,0,0,114,21,1,0,0,114,16, + 1,0,0,114,23,1,0,0,114,25,1,0,0,114,28,1, + 0,0,114,29,1,0,0,114,30,1,0,0,114,31,1,0, + 0,114,34,1,0,0,114,186,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 13,1,0,0,96,4,0,0,115,28,0,0,0,8,0,4, + 1,8,6,8,6,8,10,8,4,8,13,8,3,8,3,8, + 3,8,3,8,3,12,3,255,128,114,13,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,64,0,0,0,115,80,0,0,0,101,0,90,1, + 100,0,90,2,100,1,100,2,132,0,90,3,101,4,100,3, + 100,4,132,0,131,1,90,5,100,5,100,6,132,0,90,6, + 100,7,100,8,132,0,90,7,100,9,100,10,132,0,90,8, + 100,11,100,12,132,0,90,9,100,13,100,14,132,0,90,10, + 100,15,100,16,132,0,90,11,100,17,83,0,41,18,218,16, 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, - 46,103,101,116,95,115,111,117,114,99,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,6,0,0,0, - 67,0,0,0,115,16,0,0,0,116,0,100,1,100,2,100, - 3,100,4,100,5,141,4,83,0,41,6,78,114,40,0,0, - 0,122,8,60,115,116,114,105,110,103,62,114,215,0,0,0, - 84,41,1,114,231,0,0,0,41,1,114,232,0,0,0,114, - 219,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,213,0,0,0,178,4,0,0,115,4,0,0, - 0,16,1,255,128,122,25,95,78,97,109,101,115,112,97,99, - 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,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, - 83,0,114,210,0,0,0,114,5,0,0,0,114,211,0,0, + 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,18,0,0,0,116,0, + 124,1,124,2,124,3,131,3,124,0,95,1,100,0,83,0, + 114,109,0,0,0,41,2,114,13,1,0,0,114,15,1,0, + 0,114,19,1,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,209,0,0,0,160,4,0,0,115,6, + 0,0,0,14,1,4,128,255,128,122,25,95,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,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0, + 0,0,100,1,160,0,124,1,106,1,161,1,83,0,41,2, + 122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111, + 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99, + 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32, + 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32, + 32,32,32,32,32,122,25,60,109,111,100,117,108,101,32,123, + 33,114,125,32,40,110,97,109,101,115,112,97,99,101,41,62, + 41,2,114,62,0,0,0,114,125,0,0,0,41,2,114,193, + 0,0,0,114,216,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,11,109,111,100,117,108,101,95, + 114,101,112,114,163,4,0,0,115,4,0,0,0,12,7,255, + 128,122,28,95,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,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, + 0,41,2,78,84,114,5,0,0,0,114,219,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,182, + 0,0,0,172,4,0,0,115,4,0,0,0,4,1,255,128, + 122,27,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,78,114,40,0,0,0,114,5,0,0,0,114,219,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,212,0,0,0,181,4,0,0,115,4,0,0,0,4,128, - 255,128,122,30,95,78,97,109,101,115,112,97,99,101,76,111, - 97,100,101,114,46,99,114,101,97,116,101,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,0,83,0,114,109,0,0,0,114,5,0,0,0,114,6, - 1,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,217,0,0,0,184,4,0,0,115,6,0,0,0, - 2,1,2,128,255,128,122,28,95,78,97,109,101,115,112,97, - 99,101,76,111,97,100,101,114,46,101,120,101,99,95,109,111, - 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,4,0,0,0,67,0,0,0,115,26,0, - 0,0,116,0,160,1,100,1,124,0,106,2,161,2,1,0, - 116,0,160,3,124,0,124,1,161,2,83,0,41,2,122,98, - 76,111,97,100,32,97,32,110,97,109,101,115,112,97,99,101, - 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, - 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, - 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, - 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, - 32,32,122,38,110,97,109,101,115,112,97,99,101,32,109,111, - 100,117,108,101,32,108,111,97,100,101,100,32,119,105,116,104, - 32,112,97,116,104,32,123,33,114,125,41,4,114,134,0,0, - 0,114,149,0,0,0,114,15,1,0,0,114,218,0,0,0, - 114,219,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,220,0,0,0,187,4,0,0,115,10,0, - 0,0,6,7,4,1,4,255,12,2,255,128,122,28,95,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,41,12,114,125,0, - 0,0,114,124,0,0,0,114,126,0,0,0,114,209,0,0, - 0,114,207,0,0,0,114,36,1,0,0,114,182,0,0,0, - 114,229,0,0,0,114,213,0,0,0,114,212,0,0,0,114, - 217,0,0,0,114,220,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,35,1, - 0,0,159,4,0,0,115,22,0,0,0,8,0,8,1,2, - 3,10,1,8,8,8,3,8,3,8,3,8,3,12,3,255, - 128,114,35,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 118,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4, - 100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0, - 131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8, - 101,4,100,19,100,11,100,12,132,1,131,1,90,9,101,4, - 100,20,100,13,100,14,132,1,131,1,90,10,101,4,100,21, - 100,15,100,16,132,1,131,1,90,11,101,4,100,17,100,18, - 132,0,131,1,90,12,100,10,83,0,41,22,218,10,80,97, - 116,104,70,105,110,100,101,114,122,62,77,101,116,97,32,112, - 97,116,104,32,102,105,110,100,101,114,32,102,111,114,32,115, - 121,115,46,112,97,116,104,32,97,110,100,32,112,97,99,107, - 97,103,101,32,95,95,112,97,116,104,95,95,32,97,116,116, - 114,105,98,117,116,101,115,46,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, - 0,115,64,0,0,0,116,0,116,1,106,2,160,3,161,0, - 131,1,68,0,93,44,92,2,125,1,125,2,124,2,100,1, - 117,0,114,40,116,1,106,2,124,1,61,0,113,14,116,4, - 124,2,100,2,131,2,114,14,124,2,160,5,161,0,1,0, - 113,14,100,1,83,0,41,3,122,125,67,97,108,108,32,116, - 104,101,32,105,110,118,97,108,105,100,97,116,101,95,99,97, - 99,104,101,115,40,41,32,109,101,116,104,111,100,32,111,110, - 32,97,108,108,32,112,97,116,104,32,101,110,116,114,121,32, - 102,105,110,100,101,114,115,10,32,32,32,32,32,32,32,32, - 115,116,111,114,101,100,32,105,110,32,115,121,115,46,112,97, + 114,229,0,0,0,175,4,0,0,115,4,0,0,0,4,1, + 255,128,122,27,95,78,97,109,101,115,112,97,99,101,76,111, + 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 6,0,0,0,67,0,0,0,115,16,0,0,0,116,0,100, + 1,100,2,100,3,100,4,100,5,141,4,83,0,41,6,78, + 114,40,0,0,0,122,8,60,115,116,114,105,110,103,62,114, + 215,0,0,0,84,41,1,114,231,0,0,0,41,1,114,232, + 0,0,0,114,219,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,213,0,0,0,178,4,0,0, + 115,4,0,0,0,16,1,255,128,122,25,95,78,97,109,101, + 115,112,97,99,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,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,114,210,0,0,0,114,5,0,0,0, + 114,211,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,212,0,0,0,181,4,0,0,115,4,0, + 0,0,4,128,255,128,122,30,95,78,97,109,101,115,112,97, + 99,101,76,111,97,100,101,114,46,99,114,101,97,116,101,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,0,83,0,114,109,0,0,0,114,5,0, + 0,0,114,6,1,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,217,0,0,0,184,4,0,0,115, + 6,0,0,0,2,1,2,128,255,128,122,28,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,46,101,120,101, + 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,0, + 0,115,26,0,0,0,116,0,160,1,100,1,124,0,106,2, + 161,2,1,0,116,0,160,3,124,0,124,1,161,2,83,0, + 41,2,122,98,76,111,97,100,32,97,32,110,97,109,101,115, + 112,97,99,101,32,109,111,100,117,108,101,46,10,10,32,32, + 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, + 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,32,32,32,32,122,38,110,97,109,101,115,112,97,99, + 101,32,109,111,100,117,108,101,32,108,111,97,100,101,100,32, + 119,105,116,104,32,112,97,116,104,32,123,33,114,125,41,4, + 114,134,0,0,0,114,149,0,0,0,114,15,1,0,0,114, + 218,0,0,0,114,219,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,220,0,0,0,187,4,0, + 0,115,10,0,0,0,6,7,4,1,4,255,12,2,255,128, + 122,28,95,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,41, + 12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, + 114,209,0,0,0,114,207,0,0,0,114,36,1,0,0,114, + 182,0,0,0,114,229,0,0,0,114,213,0,0,0,114,212, + 0,0,0,114,217,0,0,0,114,220,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,35,1,0,0,159,4,0,0,115,22,0,0,0,8, + 0,8,1,2,3,10,1,8,8,8,3,8,3,8,3,8, + 3,12,3,255,128,114,35,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, + 0,0,0,115,118,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,101,4,100,2,100,3,132,0,131,1,90,5, + 101,4,100,4,100,5,132,0,131,1,90,6,101,4,100,6, + 100,7,132,0,131,1,90,7,101,4,100,8,100,9,132,0, + 131,1,90,8,101,4,100,19,100,11,100,12,132,1,131,1, + 90,9,101,4,100,20,100,13,100,14,132,1,131,1,90,10, + 101,4,100,21,100,15,100,16,132,1,131,1,90,11,101,4, + 100,17,100,18,132,0,131,1,90,12,100,10,83,0,41,22, + 218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,101, + 116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,102, + 111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,32, + 112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,95, + 32,97,116,116,114,105,98,117,116,101,115,46,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, + 0,67,0,0,0,115,64,0,0,0,116,0,116,1,106,2, + 160,3,161,0,131,1,68,0,93,44,92,2,125,1,125,2, + 124,2,100,1,117,0,114,40,116,1,106,2,124,1,61,0, + 113,14,116,4,124,2,100,2,131,2,114,14,124,2,160,5, + 161,0,1,0,113,14,100,1,83,0,41,3,122,125,67,97, + 108,108,32,116,104,101,32,105,110,118,97,108,105,100,97,116, + 101,95,99,97,99,104,101,115,40,41,32,109,101,116,104,111, + 100,32,111,110,32,97,108,108,32,112,97,116,104,32,101,110, + 116,114,121,32,102,105,110,100,101,114,115,10,32,32,32,32, + 32,32,32,32,115,116,111,114,101,100,32,105,110,32,115,121, + 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95, + 99,97,99,104,101,115,32,40,119,104,101,114,101,32,105,109, + 112,108,101,109,101,110,116,101,100,41,46,78,218,17,105,110, + 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,41, + 6,218,4,108,105,115,116,114,1,0,0,0,218,19,112,97, 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,115,32,40,119,104,101,114,101,32,105,109,112,108,101,109, - 101,110,116,101,100,41,46,78,218,17,105,110,118,97,108,105, - 100,97,116,101,95,99,97,99,104,101,115,41,6,218,4,108, - 105,115,116,114,1,0,0,0,218,19,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,218,5,105, - 116,101,109,115,114,128,0,0,0,114,38,1,0,0,41,3, - 114,193,0,0,0,114,116,0,0,0,218,6,102,105,110,100, - 101,114,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,38,1,0,0,205,4,0,0,115,14,0,0,0,22, - 4,8,1,10,1,10,1,10,1,4,128,255,128,122,28,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,0,0,0,0,3,0,0,0,9,0,0,0, - 67,0,0,0,115,80,0,0,0,116,0,106,1,100,1,117, - 1,114,28,116,0,106,1,115,28,116,2,160,3,100,2,116, - 4,161,2,1,0,116,0,106,1,68,0,93,40,125,2,122, - 14,124,2,124,1,131,1,87,0,2,0,1,0,83,0,4, - 0,116,5,121,74,1,0,1,0,1,0,89,0,113,34,89, + 101,218,5,105,116,101,109,115,114,128,0,0,0,114,38,1, + 0,0,41,3,114,193,0,0,0,114,116,0,0,0,218,6, + 102,105,110,100,101,114,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,38,1,0,0,205,4,0,0,115,14, + 0,0,0,22,4,8,1,10,1,10,1,10,1,4,128,255, + 128,122,28,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,0,0,0,0,3,0,0,0, + 9,0,0,0,67,0,0,0,115,76,0,0,0,116,0,106, + 1,100,1,117,1,114,28,116,0,106,1,115,28,116,2,160, + 3,100,2,116,4,161,2,1,0,116,0,106,1,68,0,93, + 36,125,2,122,14,124,2,124,1,131,1,87,0,2,0,1, + 0,83,0,4,0,116,5,121,70,1,0,1,0,1,0,89, 0,113,34,48,0,100,1,83,0,41,3,122,46,83,101,97, 114,99,104,32,115,121,115,46,112,97,116,104,95,104,111,111, 107,115,32,102,111,114,32,97,32,102,105,110,100,101,114,32, @@ -2082,17 +2081,17 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,44,0,0,0,90,4,104,111,111,107,114,5, 0,0,0,114,5,0,0,0,114,8,0,0,0,218,11,95, 112,97,116,104,95,104,111,111,107,115,215,4,0,0,115,18, - 0,0,0,16,3,12,1,10,1,2,1,14,1,12,1,10, + 0,0,0,16,3,12,1,10,1,2,1,14,1,12,1,6, 1,4,2,255,128,122,22,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,0,0,0,0,3,0,0,0,8,0, 0,0,67,0,0,0,115,100,0,0,0,124,1,100,1,107, 2,114,42,122,12,116,0,160,1,161,0,125,1,87,0,110, 20,4,0,116,2,121,40,1,0,1,0,1,0,89,0,100, - 2,83,0,48,0,122,14,116,3,106,4,124,1,25,0,125, - 2,87,0,110,38,4,0,116,5,121,94,1,0,1,0,1, - 0,124,0,160,6,124,1,161,1,125,2,124,2,116,3,106, - 4,124,1,60,0,89,0,110,2,48,0,124,2,83,0,41, + 2,83,0,48,0,122,16,116,3,106,4,124,1,25,0,125, + 2,87,0,124,2,83,0,4,0,116,5,121,98,1,0,1, + 0,1,0,124,0,160,6,124,1,161,1,125,2,124,2,116, + 3,106,4,124,1,60,0,89,0,124,2,83,0,48,0,41, 3,122,210,71,101,116,32,116,104,101,32,102,105,110,100,101, 114,32,102,111,114,32,116,104,101,32,112,97,116,104,32,101, 110,116,114,121,32,102,114,111,109,32,115,121,115,46,112,97, @@ -2113,597 +2112,597 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,0,0,41,3,114,193,0,0,0,114,44,0,0,0,114, 42,1,0,0,114,5,0,0,0,114,5,0,0,0,114,8, 0,0,0,218,20,95,112,97,116,104,95,105,109,112,111,114, - 116,101,114,95,99,97,99,104,101,228,4,0,0,115,24,0, - 0,0,8,8,2,1,12,1,12,1,8,3,2,1,14,1, - 12,1,10,1,16,1,4,1,255,128,122,31,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,99,97,99,104,101,99,3,0,0,0, - 0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0, - 67,0,0,0,115,82,0,0,0,116,0,124,2,100,1,131, - 2,114,26,124,2,160,1,124,1,161,1,92,2,125,3,125, - 4,110,14,124,2,160,2,124,1,161,1,125,3,103,0,125, - 4,124,3,100,0,117,1,114,60,116,3,160,4,124,1,124, - 3,161,2,83,0,116,3,160,5,124,1,100,0,161,2,125, - 5,124,4,124,5,95,6,124,5,83,0,41,2,78,114,137, - 0,0,0,41,7,114,128,0,0,0,114,137,0,0,0,114, - 206,0,0,0,114,134,0,0,0,114,201,0,0,0,114,183, - 0,0,0,114,178,0,0,0,41,6,114,193,0,0,0,114, - 139,0,0,0,114,42,1,0,0,114,140,0,0,0,114,141, - 0,0,0,114,187,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,16,95,108,101,103,97,99,121, - 95,103,101,116,95,115,112,101,99,250,4,0,0,115,20,0, - 0,0,10,4,16,1,10,2,4,1,8,1,12,1,12,1, - 6,1,4,1,255,128,122,27,80,97,116,104,70,105,110,100, - 101,114,46,95,108,101,103,97,99,121,95,103,101,116,95,115, - 112,101,99,78,99,4,0,0,0,0,0,0,0,0,0,0, - 0,9,0,0,0,5,0,0,0,67,0,0,0,115,166,0, - 0,0,103,0,125,4,124,2,68,0,93,134,125,5,116,0, - 124,5,116,1,116,2,102,2,131,2,115,28,113,8,124,0, - 160,3,124,5,161,1,125,6,124,6,100,1,117,1,114,8, - 116,4,124,6,100,2,131,2,114,70,124,6,160,5,124,1, - 124,3,161,2,125,7,110,12,124,0,160,6,124,1,124,6, - 161,2,125,7,124,7,100,1,117,0,114,92,113,8,124,7, - 106,7,100,1,117,1,114,110,124,7,2,0,1,0,83,0, - 124,7,106,8,125,8,124,8,100,1,117,0,114,132,116,9, - 100,3,131,1,130,1,124,4,160,10,124,8,161,1,1,0, - 113,8,116,11,160,12,124,1,100,1,161,2,125,7,124,4, - 124,7,95,8,124,7,83,0,41,4,122,63,70,105,110,100, - 32,116,104,101,32,108,111,97,100,101,114,32,111,114,32,110, - 97,109,101,115,112,97,99,101,95,112,97,116,104,32,102,111, - 114,32,116,104,105,115,32,109,111,100,117,108,101,47,112,97, - 99,107,97,103,101,32,110,97,109,101,46,78,114,203,0,0, - 0,122,19,115,112,101,99,32,109,105,115,115,105,110,103,32, - 108,111,97,100,101,114,41,13,114,161,0,0,0,114,84,0, - 0,0,218,5,98,121,116,101,115,114,47,1,0,0,114,128, - 0,0,0,114,203,0,0,0,114,48,1,0,0,114,140,0, - 0,0,114,178,0,0,0,114,117,0,0,0,114,167,0,0, - 0,114,134,0,0,0,114,183,0,0,0,41,9,114,193,0, - 0,0,114,139,0,0,0,114,44,0,0,0,114,202,0,0, - 0,218,14,110,97,109,101,115,112,97,99,101,95,112,97,116, - 104,90,5,101,110,116,114,121,114,42,1,0,0,114,187,0, - 0,0,114,141,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,218,9,95,103,101,116,95,115,112,101, - 99,9,5,0,0,115,42,0,0,0,4,5,8,1,14,1, - 2,1,10,1,8,1,10,1,14,1,12,2,8,1,2,1, - 10,1,8,1,6,1,8,1,8,1,12,5,12,2,6,1, - 4,1,255,128,122,20,80,97,116,104,70,105,110,100,101,114, - 46,95,103,101,116,95,115,112,101,99,99,4,0,0,0,0, - 0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,67, - 0,0,0,115,94,0,0,0,124,2,100,1,117,0,114,14, - 116,0,106,1,125,2,124,0,160,2,124,1,124,2,124,3, - 161,3,125,4,124,4,100,1,117,0,114,40,100,1,83,0, - 124,4,106,3,100,1,117,0,114,90,124,4,106,4,125,5, - 124,5,114,86,100,1,124,4,95,5,116,6,124,1,124,5, - 124,0,106,2,131,3,124,4,95,4,124,4,83,0,100,1, - 83,0,124,4,83,0,41,2,122,141,84,114,121,32,116,111, - 32,102,105,110,100,32,97,32,115,112,101,99,32,102,111,114, - 32,39,102,117,108,108,110,97,109,101,39,32,111,110,32,115, - 121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,104, - 39,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, - 115,101,97,114,99,104,32,105,115,32,98,97,115,101,100,32, - 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107, - 115,32,97,110,100,32,115,121,115,46,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,32, - 32,32,32,32,32,32,32,78,41,7,114,1,0,0,0,114, - 44,0,0,0,114,51,1,0,0,114,140,0,0,0,114,178, - 0,0,0,114,181,0,0,0,114,13,1,0,0,41,6,114, - 193,0,0,0,114,139,0,0,0,114,44,0,0,0,114,202, - 0,0,0,114,187,0,0,0,114,50,1,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,203,0,0, - 0,41,5,0,0,115,28,0,0,0,8,6,6,1,14,1, - 8,1,4,1,10,1,6,1,4,1,6,3,16,1,4,1, - 4,2,4,2,255,128,122,20,80,97,116,104,70,105,110,100, - 101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, - 0,67,0,0,0,115,30,0,0,0,124,0,160,0,124,1, - 124,2,161,2,125,3,124,3,100,1,117,0,114,24,100,1, - 83,0,124,3,106,1,83,0,41,2,122,170,102,105,110,100, - 32,116,104,101,32,109,111,100,117,108,101,32,111,110,32,115, - 121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,104, - 39,32,98,97,115,101,100,32,111,110,32,115,121,115,46,112, - 97,116,104,95,104,111,111,107,115,32,97,110,100,10,32,32, - 32,32,32,32,32,32,115,121,115,46,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, - 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,114,204,0,0,0,114,205,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,206,0,0,0,65,5,0,0,115,10,0,0,0,12,8, - 8,1,4,1,6,1,255,128,122,22,80,97,116,104,70,105, - 110,100,101,114,46,102,105,110,100,95,109,111,100,117,108,101, - 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,79,0,0,0,115,28,0,0,0,100,1, - 100,2,108,0,109,1,125,3,1,0,124,3,106,2,124,1, - 105,0,124,2,164,1,142,1,83,0,41,3,97,32,1,0, - 0,10,32,32,32,32,32,32,32,32,70,105,110,100,32,100, - 105,115,116,114,105,98,117,116,105,111,110,115,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,32,97,110, - 32,105,116,101,114,97,98,108,101,32,111,102,32,97,108,108, - 32,68,105,115,116,114,105,98,117,116,105,111,110,32,105,110, - 115,116,97,110,99,101,115,32,99,97,112,97,98,108,101,32, - 111,102,10,32,32,32,32,32,32,32,32,108,111,97,100,105, - 110,103,32,116,104,101,32,109,101,116,97,100,97,116,97,32, - 102,111,114,32,112,97,99,107,97,103,101,115,32,109,97,116, - 99,104,105,110,103,32,96,96,99,111,110,116,101,120,116,46, - 110,97,109,101,96,96,10,32,32,32,32,32,32,32,32,40, - 111,114,32,97,108,108,32,110,97,109,101,115,32,105,102,32, - 96,96,78,111,110,101,96,96,32,105,110,100,105,99,97,116, - 101,100,41,32,97,108,111,110,103,32,116,104,101,32,112,97, - 116,104,115,32,105,110,32,116,104,101,32,108,105,115,116,10, - 32,32,32,32,32,32,32,32,111,102,32,100,105,114,101,99, - 116,111,114,105,101,115,32,96,96,99,111,110,116,101,120,116, - 46,112,97,116,104,96,96,46,10,32,32,32,32,32,32,32, - 32,114,73,0,0,0,41,1,218,18,77,101,116,97,100,97, - 116,97,80,97,116,104,70,105,110,100,101,114,41,3,90,18, - 105,109,112,111,114,116,108,105,98,46,109,101,116,97,100,97, - 116,97,114,52,1,0,0,218,18,102,105,110,100,95,100,105, - 115,116,114,105,98,117,116,105,111,110,115,41,4,114,193,0, - 0,0,114,119,0,0,0,114,120,0,0,0,114,52,1,0, + 116,101,114,95,99,97,99,104,101,228,4,0,0,115,28,0, + 0,0,8,8,2,1,12,1,12,1,8,3,2,1,12,1, + 4,4,12,253,10,1,12,1,4,1,2,255,255,128,122,31, + 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,99,97,99,104,101,99, + 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, + 4,0,0,0,67,0,0,0,115,82,0,0,0,116,0,124, + 2,100,1,131,2,114,26,124,2,160,1,124,1,161,1,92, + 2,125,3,125,4,110,14,124,2,160,2,124,1,161,1,125, + 3,103,0,125,4,124,3,100,0,117,1,114,60,116,3,160, + 4,124,1,124,3,161,2,83,0,116,3,160,5,124,1,100, + 0,161,2,125,5,124,4,124,5,95,6,124,5,83,0,41, + 2,78,114,137,0,0,0,41,7,114,128,0,0,0,114,137, + 0,0,0,114,206,0,0,0,114,134,0,0,0,114,201,0, + 0,0,114,183,0,0,0,114,178,0,0,0,41,6,114,193, + 0,0,0,114,139,0,0,0,114,42,1,0,0,114,140,0, + 0,0,114,141,0,0,0,114,187,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,16,95,108,101, + 103,97,99,121,95,103,101,116,95,115,112,101,99,250,4,0, + 0,115,20,0,0,0,10,4,16,1,10,2,4,1,8,1, + 12,1,12,1,6,1,4,1,255,128,122,27,80,97,116,104, + 70,105,110,100,101,114,46,95,108,101,103,97,99,121,95,103, + 101,116,95,115,112,101,99,78,99,4,0,0,0,0,0,0, + 0,0,0,0,0,9,0,0,0,5,0,0,0,67,0,0, + 0,115,166,0,0,0,103,0,125,4,124,2,68,0,93,134, + 125,5,116,0,124,5,116,1,116,2,102,2,131,2,115,28, + 113,8,124,0,160,3,124,5,161,1,125,6,124,6,100,1, + 117,1,114,8,116,4,124,6,100,2,131,2,114,70,124,6, + 160,5,124,1,124,3,161,2,125,7,110,12,124,0,160,6, + 124,1,124,6,161,2,125,7,124,7,100,1,117,0,114,92, + 113,8,124,7,106,7,100,1,117,1,114,110,124,7,2,0, + 1,0,83,0,124,7,106,8,125,8,124,8,100,1,117,0, + 114,132,116,9,100,3,131,1,130,1,124,4,160,10,124,8, + 161,1,1,0,113,8,116,11,160,12,124,1,100,1,161,2, + 125,7,124,4,124,7,95,8,124,7,83,0,41,4,122,63, + 70,105,110,100,32,116,104,101,32,108,111,97,100,101,114,32, + 111,114,32,110,97,109,101,115,112,97,99,101,95,112,97,116, + 104,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108, + 101,47,112,97,99,107,97,103,101,32,110,97,109,101,46,78, + 114,203,0,0,0,122,19,115,112,101,99,32,109,105,115,115, + 105,110,103,32,108,111,97,100,101,114,41,13,114,161,0,0, + 0,114,84,0,0,0,218,5,98,121,116,101,115,114,47,1, + 0,0,114,128,0,0,0,114,203,0,0,0,114,48,1,0, + 0,114,140,0,0,0,114,178,0,0,0,114,117,0,0,0, + 114,167,0,0,0,114,134,0,0,0,114,183,0,0,0,41, + 9,114,193,0,0,0,114,139,0,0,0,114,44,0,0,0, + 114,202,0,0,0,218,14,110,97,109,101,115,112,97,99,101, + 95,112,97,116,104,90,5,101,110,116,114,121,114,42,1,0, + 0,114,187,0,0,0,114,141,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,9,95,103,101,116, + 95,115,112,101,99,9,5,0,0,115,42,0,0,0,4,5, + 8,1,14,1,2,1,10,1,8,1,10,1,14,1,12,2, + 8,1,2,1,10,1,8,1,6,1,8,1,8,1,12,5, + 12,2,6,1,4,1,255,128,122,20,80,97,116,104,70,105, + 110,100,101,114,46,95,103,101,116,95,115,112,101,99,99,4, + 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5, + 0,0,0,67,0,0,0,115,94,0,0,0,124,2,100,1, + 117,0,114,14,116,0,106,1,125,2,124,0,160,2,124,1, + 124,2,124,3,161,3,125,4,124,4,100,1,117,0,114,40, + 100,1,83,0,124,4,106,3,100,1,117,0,114,90,124,4, + 106,4,125,5,124,5,114,86,100,1,124,4,95,5,116,6, + 124,1,124,5,124,0,106,2,131,3,124,4,95,4,124,4, + 83,0,100,1,83,0,124,4,83,0,41,2,122,141,84,114, + 121,32,116,111,32,102,105,110,100,32,97,32,115,112,101,99, + 32,102,111,114,32,39,102,117,108,108,110,97,109,101,39,32, + 111,110,32,115,121,115,46,112,97,116,104,32,111,114,32,39, + 112,97,116,104,39,46,10,10,32,32,32,32,32,32,32,32, + 84,104,101,32,115,101,97,114,99,104,32,105,115,32,98,97, + 115,101,100,32,111,110,32,115,121,115,46,112,97,116,104,95, + 104,111,111,107,115,32,97,110,100,32,115,121,115,46,112,97, + 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, + 101,46,10,32,32,32,32,32,32,32,32,78,41,7,114,1, + 0,0,0,114,44,0,0,0,114,51,1,0,0,114,140,0, + 0,0,114,178,0,0,0,114,181,0,0,0,114,13,1,0, + 0,41,6,114,193,0,0,0,114,139,0,0,0,114,44,0, + 0,0,114,202,0,0,0,114,187,0,0,0,114,50,1,0, 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,53,1,0,0,78,5,0,0,115,6,0,0,0,12,10, - 16,1,255,128,122,29,80,97,116,104,70,105,110,100,101,114, - 46,102,105,110,100,95,100,105,115,116,114,105,98,117,116,105, - 111,110,115,41,1,78,41,2,78,78,41,1,78,41,13,114, - 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, - 0,0,0,114,207,0,0,0,114,38,1,0,0,114,44,1, - 0,0,114,47,1,0,0,114,48,1,0,0,114,51,1,0, - 0,114,203,0,0,0,114,206,0,0,0,114,53,1,0,0, - 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,37,1,0,0,201,4,0,0,115,38,0, - 0,0,8,0,4,2,2,2,10,1,2,9,10,1,2,12, - 10,1,2,21,10,1,2,14,12,1,2,31,12,1,2,23, - 12,1,2,12,14,1,255,128,114,37,1,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,64,0,0,0,115,90,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,101,6,90,7,100,6,100,7,132, - 0,90,8,100,8,100,9,132,0,90,9,100,19,100,11,100, - 12,132,1,90,10,100,13,100,14,132,0,90,11,101,12,100, - 15,100,16,132,0,131,1,90,13,100,17,100,18,132,0,90, - 14,100,10,83,0,41,20,218,10,70,105,108,101,70,105,110, - 100,101,114,122,172,70,105,108,101,45,98,97,115,101,100,32, - 102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,116, - 101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,116, - 104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,97, - 114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,101, - 114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,103, - 10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,119, - 104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,114, - 121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,32, - 104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,101, - 110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,32, - 32,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,6,0,0,0,7,0,0,0,115,84,0,0,0,103, - 0,125,3,124,2,68,0,93,32,92,2,137,0,125,4,124, - 3,160,0,135,0,102,1,100,1,100,2,132,8,124,4,68, - 0,131,1,161,1,1,0,113,8,124,3,124,0,95,1,124, - 1,112,54,100,3,124,0,95,2,100,4,124,0,95,3,116, - 4,131,0,124,0,95,5,116,4,131,0,124,0,95,6,100, - 5,83,0,41,6,122,154,73,110,105,116,105,97,108,105,122, - 101,32,119,105,116,104,32,116,104,101,32,112,97,116,104,32, - 116,111,32,115,101,97,114,99,104,32,111,110,32,97,110,100, - 32,97,32,118,97,114,105,97,98,108,101,32,110,117,109,98, - 101,114,32,111,102,10,32,32,32,32,32,32,32,32,50,45, - 116,117,112,108,101,115,32,99,111,110,116,97,105,110,105,110, - 103,32,116,104,101,32,108,111,97,100,101,114,32,97,110,100, - 32,116,104,101,32,102,105,108,101,32,115,117,102,102,105,120, - 101,115,32,116,104,101,32,108,111,97,100,101,114,10,32,32, - 32,32,32,32,32,32,114,101,99,111,103,110,105,122,101,115, - 46,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,51,0,0,0,115,22,0,0,0,124, - 0,93,14,125,1,124,1,136,0,102,2,86,0,1,0,113, - 2,100,0,83,0,114,109,0,0,0,114,5,0,0,0,114, - 7,1,0,0,169,1,114,140,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,10,1,0,0,107,5,0,0,115,6, - 0,0,0,18,0,4,128,255,128,122,38,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,114,71,0,0,0,114,104,0,0,0,78,41,7,114,167, - 0,0,0,218,8,95,108,111,97,100,101,114,115,114,44,0, - 0,0,218,11,95,112,97,116,104,95,109,116,105,109,101,218, - 3,115,101,116,218,11,95,112,97,116,104,95,99,97,99,104, - 101,218,19,95,114,101,108,97,120,101,100,95,112,97,116,104, - 95,99,97,99,104,101,41,5,114,118,0,0,0,114,44,0, - 0,0,218,14,108,111,97,100,101,114,95,100,101,116,97,105, - 108,115,90,7,108,111,97,100,101,114,115,114,189,0,0,0, - 114,5,0,0,0,114,55,1,0,0,114,8,0,0,0,114, - 209,0,0,0,101,5,0,0,115,20,0,0,0,4,4,12, - 1,26,1,6,1,10,2,6,1,8,1,8,1,4,128,255, - 128,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, - 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, - 10,0,0,0,100,1,124,0,95,0,100,2,83,0,41,3, - 122,31,73,110,118,97,108,105,100,97,116,101,32,116,104,101, - 32,100,105,114,101,99,116,111,114,121,32,109,116,105,109,101, - 46,114,104,0,0,0,78,41,1,114,57,1,0,0,114,246, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,38,1,0,0,115,5,0,0,115,6,0,0,0, - 6,2,4,128,255,128,122,28,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,0,0,0,0,0,0,0, - 0,3,0,0,0,3,0,0,0,67,0,0,0,115,42,0, - 0,0,124,0,160,0,124,1,161,1,125,2,124,2,100,1, - 117,0,114,26,100,1,103,0,102,2,83,0,124,2,106,1, - 124,2,106,2,112,38,103,0,102,2,83,0,41,2,122,197, - 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,44,32,111, - 114,32,116,104,101,32,110,97,109,101,115,112,97,99,101,10, - 32,32,32,32,32,32,32,32,112,97,99,107,97,103,101,32, - 112,111,114,116,105,111,110,115,46,32,82,101,116,117,114,110, - 115,32,40,108,111,97,100,101,114,44,32,108,105,115,116,45, - 111,102,45,112,111,114,116,105,111,110,115,41,46,10,10,32, - 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99, - 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, - 32,32,32,32,32,78,41,3,114,203,0,0,0,114,140,0, - 0,0,114,178,0,0,0,41,3,114,118,0,0,0,114,139, - 0,0,0,114,187,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,137,0,0,0,121,5,0,0, - 115,10,0,0,0,10,7,8,1,8,1,16,1,255,128,122, - 22,70,105,108,101,70,105,110,100,101,114,46,102,105,110,100, - 95,108,111,97,100,101,114,99,6,0,0,0,0,0,0,0, - 0,0,0,0,7,0,0,0,6,0,0,0,67,0,0,0, - 115,26,0,0,0,124,1,124,2,124,3,131,2,125,6,116, - 0,124,2,124,3,124,6,124,4,100,1,141,4,83,0,41, - 2,78,114,177,0,0,0,41,1,114,190,0,0,0,41,7, - 114,118,0,0,0,114,188,0,0,0,114,139,0,0,0,114, - 44,0,0,0,90,4,115,109,115,108,114,202,0,0,0,114, - 140,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,51,1,0,0,133,5,0,0,115,10,0,0, - 0,10,1,8,1,2,1,6,255,255,128,122,20,70,105,108, - 101,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, - 99,78,99,3,0,0,0,0,0,0,0,0,0,0,0,14, - 0,0,0,8,0,0,0,67,0,0,0,115,92,1,0,0, - 100,1,125,3,124,1,160,0,100,2,161,1,100,3,25,0, - 125,4,122,24,116,1,124,0,106,2,112,34,116,3,160,4, - 161,0,131,1,106,5,125,5,87,0,110,22,4,0,116,6, - 121,64,1,0,1,0,1,0,100,4,125,5,89,0,110,2, - 48,0,124,5,124,0,106,7,107,3,114,90,124,0,160,8, - 161,0,1,0,124,5,124,0,95,7,116,9,131,0,114,112, - 124,0,106,10,125,6,124,4,160,11,161,0,125,7,110,10, - 124,0,106,12,125,6,124,4,125,7,124,7,124,6,118,0, - 114,214,116,13,124,0,106,2,124,4,131,2,125,8,124,0, - 106,14,68,0,93,56,92,2,125,9,125,10,100,5,124,9, - 23,0,125,11,116,13,124,8,124,11,131,2,125,12,116,15, - 124,12,131,1,114,148,124,0,160,16,124,10,124,1,124,12, - 124,8,103,1,124,2,161,5,2,0,1,0,83,0,116,17, - 124,8,131,1,125,3,124,0,106,14,68,0,93,80,92,2, - 125,9,125,10,116,13,124,0,106,2,124,4,124,9,23,0, - 131,2,125,12,116,18,106,19,100,6,124,12,100,3,100,7, - 141,3,1,0,124,7,124,9,23,0,124,6,118,0,114,220, - 116,15,124,12,131,1,114,220,124,0,160,16,124,10,124,1, - 124,12,100,8,124,2,161,5,2,0,1,0,83,0,124,3, - 144,1,114,88,116,18,160,19,100,9,124,8,161,2,1,0, - 116,18,160,20,124,1,100,8,161,2,125,13,124,8,103,1, - 124,13,95,21,124,13,83,0,100,8,83,0,41,10,122,111, - 84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,112, - 101,99,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,46,10,10,32,32, - 32,32,32,32,32,32,82,101,116,117,114,110,115,32,116,104, - 101,32,109,97,116,99,104,105,110,103,32,115,112,101,99,44, - 32,111,114,32,78,111,110,101,32,105,102,32,110,111,116,32, - 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,70, - 114,71,0,0,0,114,28,0,0,0,114,104,0,0,0,114, - 209,0,0,0,122,9,116,114,121,105,110,103,32,123,125,41, - 1,90,9,118,101,114,98,111,115,105,116,121,78,122,25,112, - 111,115,115,105,98,108,101,32,110,97,109,101,115,112,97,99, - 101,32,102,111,114,32,123,125,41,22,114,41,0,0,0,114, - 49,0,0,0,114,44,0,0,0,114,4,0,0,0,114,55, - 0,0,0,114,0,1,0,0,114,50,0,0,0,114,57,1, - 0,0,218,11,95,102,105,108,108,95,99,97,99,104,101,114, - 9,0,0,0,114,60,1,0,0,114,105,0,0,0,114,59, - 1,0,0,114,38,0,0,0,114,56,1,0,0,114,54,0, - 0,0,114,51,1,0,0,114,56,0,0,0,114,134,0,0, - 0,114,149,0,0,0,114,183,0,0,0,114,178,0,0,0, - 41,14,114,118,0,0,0,114,139,0,0,0,114,202,0,0, - 0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,90, - 11,116,97,105,108,95,109,111,100,117,108,101,114,169,0,0, - 0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,95, - 109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,116, - 104,114,8,1,0,0,114,188,0,0,0,90,13,105,110,105, - 116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,108, - 95,112,97,116,104,114,187,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,203,0,0,0,138,5, - 0,0,115,74,0,0,0,4,5,14,1,2,1,24,1,12, - 1,10,1,10,1,8,1,6,1,6,2,6,1,10,1,6, - 2,4,1,8,2,12,1,14,1,8,1,10,1,8,1,24, - 1,8,4,14,2,16,1,16,1,12,1,8,1,10,1,4, - 1,8,255,6,2,12,1,12,1,8,1,4,1,4,1,255, - 128,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105, - 110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0, - 0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0, - 115,188,0,0,0,124,0,106,0,125,1,122,22,116,1,160, - 2,124,1,112,22,116,1,160,3,161,0,161,1,125,2,87, - 0,110,28,4,0,116,4,116,5,116,6,102,3,121,56,1, - 0,1,0,1,0,103,0,125,2,89,0,110,2,48,0,116, - 7,106,8,160,9,100,1,161,1,115,82,116,10,124,2,131, - 1,124,0,95,11,110,74,116,10,131,0,125,3,124,2,68, - 0,93,56,125,4,124,4,160,12,100,2,161,1,92,3,125, - 5,125,6,125,7,124,6,114,134,100,3,160,13,124,5,124, - 7,160,14,161,0,161,2,125,8,110,4,124,5,125,8,124, - 3,160,15,124,8,161,1,1,0,113,92,124,3,124,0,95, - 11,116,7,106,8,160,9,116,16,161,1,114,184,100,4,100, - 5,132,0,124,2,68,0,131,1,124,0,95,17,100,6,83, - 0,41,7,122,68,70,105,108,108,32,116,104,101,32,99,97, - 99,104,101,32,111,102,32,112,111,116,101,110,116,105,97,108, - 32,109,111,100,117,108,101,115,32,97,110,100,32,112,97,99, - 107,97,103,101,115,32,102,111,114,32,116,104,105,115,32,100, - 105,114,101,99,116,111,114,121,46,114,0,0,0,0,114,71, - 0,0,0,114,61,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,83,0,0, - 0,115,20,0,0,0,104,0,124,0,93,12,125,1,124,1, - 160,0,161,0,146,2,113,4,83,0,114,5,0,0,0,41, - 1,114,105,0,0,0,41,2,114,32,0,0,0,90,2,102, - 110,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,9,60,115,101,116,99,111,109,112,62,215,5,0,0,115, - 4,0,0,0,20,0,255,128,122,41,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,115,101,116,99,111, - 109,112,62,78,41,18,114,44,0,0,0,114,4,0,0,0, - 90,7,108,105,115,116,100,105,114,114,55,0,0,0,114,45, - 1,0,0,218,15,80,101,114,109,105,115,115,105,111,110,69, - 114,114,111,114,218,18,78,111,116,65,68,105,114,101,99,116, - 111,114,121,69,114,114,111,114,114,1,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,58,1,0,0,114,59,1,0, - 0,114,100,0,0,0,114,62,0,0,0,114,105,0,0,0, - 218,3,97,100,100,114,12,0,0,0,114,60,1,0,0,41, - 9,114,118,0,0,0,114,44,0,0,0,90,8,99,111,110, - 116,101,110,116,115,90,21,108,111,119,101,114,95,115,117,102, - 102,105,120,95,99,111,110,116,101,110,116,115,114,33,1,0, - 0,114,116,0,0,0,114,20,1,0,0,114,8,1,0,0, - 90,8,110,101,119,95,110,97,109,101,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,62,1,0,0,186,5, - 0,0,115,38,0,0,0,6,2,2,1,22,1,18,1,10, - 3,12,3,12,1,6,7,8,1,16,1,4,1,18,1,4, - 2,12,1,6,1,12,1,16,1,4,128,255,128,122,22,70, - 105,108,101,70,105,110,100,101,114,46,95,102,105,108,108,95, - 99,97,99,104,101,99,1,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,7,0,0,0,115,18, - 0,0,0,135,0,135,1,102,2,100,1,100,2,132,8,125, - 2,124,2,83,0,41,3,97,20,1,0,0,65,32,99,108, - 97,115,115,32,109,101,116,104,111,100,32,119,104,105,99,104, - 32,114,101,116,117,114,110,115,32,97,32,99,108,111,115,117, - 114,101,32,116,111,32,117,115,101,32,111,110,32,115,121,115, - 46,112,97,116,104,95,104,111,111,107,10,32,32,32,32,32, - 32,32,32,119,104,105,99,104,32,119,105,108,108,32,114,101, - 116,117,114,110,32,97,110,32,105,110,115,116,97,110,99,101, - 32,117,115,105,110,103,32,116,104,101,32,115,112,101,99,105, - 102,105,101,100,32,108,111,97,100,101,114,115,32,97,110,100, - 32,116,104,101,32,112,97,116,104,10,32,32,32,32,32,32, - 32,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32, - 99,108,111,115,117,114,101,46,10,10,32,32,32,32,32,32, - 32,32,73,102,32,116,104,101,32,112,97,116,104,32,99,97, - 108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115, - 117,114,101,32,105,115,32,110,111,116,32,97,32,100,105,114, - 101,99,116,111,114,121,44,32,73,109,112,111,114,116,69,114, - 114,111,114,32,105,115,10,32,32,32,32,32,32,32,32,114, - 97,105,115,101,100,46,10,10,32,32,32,32,32,32,32,32, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,4,0,0,0,19,0,0,0,115,36,0,0,0,116,0, - 124,0,131,1,115,20,116,1,100,1,124,0,100,2,141,2, - 130,1,136,0,124,0,103,1,136,1,162,1,82,0,142,0, - 83,0,41,3,122,45,80,97,116,104,32,104,111,111,107,32, - 102,111,114,32,105,109,112,111,114,116,108,105,98,46,109,97, - 99,104,105,110,101,114,121,46,70,105,108,101,70,105,110,100, - 101,114,46,122,30,111,110,108,121,32,100,105,114,101,99,116, - 111,114,105,101,115,32,97,114,101,32,115,117,112,112,111,114, - 116,101,100,114,48,0,0,0,41,2,114,56,0,0,0,114, - 117,0,0,0,114,48,0,0,0,169,2,114,193,0,0,0, - 114,61,1,0,0,114,5,0,0,0,114,8,0,0,0,218, - 24,112,97,116,104,95,104,111,111,107,95,102,111,114,95,70, - 105,108,101,70,105,110,100,101,114,227,5,0,0,115,8,0, - 0,0,8,2,12,1,16,1,255,128,122,54,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,107,95,102,111,114,95,70,105,108,101,70,105,110,100, - 101,114,114,5,0,0,0,41,3,114,193,0,0,0,114,61, - 1,0,0,114,68,1,0,0,114,5,0,0,0,114,67,1, - 0,0,114,8,0,0,0,218,9,112,97,116,104,95,104,111, - 111,107,217,5,0,0,115,6,0,0,0,14,10,4,6,255, - 128,122,20,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, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,100,1,160,0,124,0,106,1,161,1,83, - 0,41,2,78,122,16,70,105,108,101,70,105,110,100,101,114, - 40,123,33,114,125,41,41,2,114,62,0,0,0,114,44,0, + 114,203,0,0,0,41,5,0,0,115,28,0,0,0,8,6, + 6,1,14,1,8,1,4,1,10,1,6,1,4,1,6,3, + 16,1,4,1,4,2,4,2,255,128,122,20,80,97,116,104, + 70,105,110,100,101,114,46,102,105,110,100,95,115,112,101,99, + 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,30,0,0,0,124,0, + 160,0,124,1,124,2,161,2,125,3,124,3,100,1,117,0, + 114,24,100,1,83,0,124,3,106,1,83,0,41,2,122,170, + 102,105,110,100,32,116,104,101,32,109,111,100,117,108,101,32, + 111,110,32,115,121,115,46,112,97,116,104,32,111,114,32,39, + 112,97,116,104,39,32,98,97,115,101,100,32,111,110,32,115, + 121,115,46,112,97,116,104,95,104,111,111,107,115,32,97,110, + 100,10,32,32,32,32,32,32,32,32,115,121,115,46,112,97, + 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,102,105,110,100, + 95,115,112,101,99,40,41,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,32,32,32,32,78,114,204,0,0,0, + 114,205,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,206,0,0,0,65,5,0,0,115,10,0, + 0,0,12,8,8,1,4,1,6,1,255,128,122,22,80,97, + 116,104,70,105,110,100,101,114,46,102,105,110,100,95,109,111, + 100,117,108,101,99,1,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,4,0,0,0,79,0,0,0,115,28,0, + 0,0,100,1,100,2,108,0,109,1,125,3,1,0,124,3, + 106,2,124,1,105,0,124,2,164,1,142,1,83,0,41,3, + 97,32,1,0,0,10,32,32,32,32,32,32,32,32,70,105, + 110,100,32,100,105,115,116,114,105,98,117,116,105,111,110,115, + 46,10,10,32,32,32,32,32,32,32,32,82,101,116,117,114, + 110,32,97,110,32,105,116,101,114,97,98,108,101,32,111,102, + 32,97,108,108,32,68,105,115,116,114,105,98,117,116,105,111, + 110,32,105,110,115,116,97,110,99,101,115,32,99,97,112,97, + 98,108,101,32,111,102,10,32,32,32,32,32,32,32,32,108, + 111,97,100,105,110,103,32,116,104,101,32,109,101,116,97,100, + 97,116,97,32,102,111,114,32,112,97,99,107,97,103,101,115, + 32,109,97,116,99,104,105,110,103,32,96,96,99,111,110,116, + 101,120,116,46,110,97,109,101,96,96,10,32,32,32,32,32, + 32,32,32,40,111,114,32,97,108,108,32,110,97,109,101,115, + 32,105,102,32,96,96,78,111,110,101,96,96,32,105,110,100, + 105,99,97,116,101,100,41,32,97,108,111,110,103,32,116,104, + 101,32,112,97,116,104,115,32,105,110,32,116,104,101,32,108, + 105,115,116,10,32,32,32,32,32,32,32,32,111,102,32,100, + 105,114,101,99,116,111,114,105,101,115,32,96,96,99,111,110, + 116,101,120,116,46,112,97,116,104,96,96,46,10,32,32,32, + 32,32,32,32,32,114,73,0,0,0,41,1,218,18,77,101, + 116,97,100,97,116,97,80,97,116,104,70,105,110,100,101,114, + 41,3,90,18,105,109,112,111,114,116,108,105,98,46,109,101, + 116,97,100,97,116,97,114,52,1,0,0,218,18,102,105,110, + 100,95,100,105,115,116,114,105,98,117,116,105,111,110,115,41, + 4,114,193,0,0,0,114,119,0,0,0,114,120,0,0,0, + 114,52,1,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,53,1,0,0,78,5,0,0,115,6,0, + 0,0,12,10,16,1,255,128,122,29,80,97,116,104,70,105, + 110,100,101,114,46,102,105,110,100,95,100,105,115,116,114,105, + 98,117,116,105,111,110,115,41,1,78,41,2,78,78,41,1, + 78,41,13,114,125,0,0,0,114,124,0,0,0,114,126,0, + 0,0,114,127,0,0,0,114,207,0,0,0,114,38,1,0, + 0,114,44,1,0,0,114,47,1,0,0,114,48,1,0,0, + 114,51,1,0,0,114,203,0,0,0,114,206,0,0,0,114, + 53,1,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,37,1,0,0,201,4,0, + 0,115,38,0,0,0,8,0,4,2,2,2,10,1,2,9, + 10,1,2,12,10,1,2,21,10,1,2,14,12,1,2,31, + 12,1,2,23,12,1,2,12,14,1,255,128,114,37,1,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,64,0,0,0,115,90,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, + 0,90,4,100,4,100,5,132,0,90,5,101,6,90,7,100, + 6,100,7,132,0,90,8,100,8,100,9,132,0,90,9,100, + 19,100,11,100,12,132,1,90,10,100,13,100,14,132,0,90, + 11,101,12,100,15,100,16,132,0,131,1,90,13,100,17,100, + 18,132,0,90,14,100,10,83,0,41,20,218,10,70,105,108, + 101,70,105,110,100,101,114,122,172,70,105,108,101,45,98,97, + 115,101,100,32,102,105,110,100,101,114,46,10,10,32,32,32, + 32,73,110,116,101,114,97,99,116,105,111,110,115,32,119,105, + 116,104,32,116,104,101,32,102,105,108,101,32,115,121,115,116, + 101,109,32,97,114,101,32,99,97,99,104,101,100,32,102,111, + 114,32,112,101,114,102,111,114,109,97,110,99,101,44,32,98, + 101,105,110,103,10,32,32,32,32,114,101,102,114,101,115,104, + 101,100,32,119,104,101,110,32,116,104,101,32,100,105,114,101, + 99,116,111,114,121,32,116,104,101,32,102,105,110,100,101,114, + 32,105,115,32,104,97,110,100,108,105,110,103,32,104,97,115, + 32,98,101,101,110,32,109,111,100,105,102,105,101,100,46,10, + 10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,6,0,0,0,7,0,0,0,115,84, + 0,0,0,103,0,125,3,124,2,68,0,93,32,92,2,137, + 0,125,4,124,3,160,0,135,0,102,1,100,1,100,2,132, + 8,124,4,68,0,131,1,161,1,1,0,113,8,124,3,124, + 0,95,1,124,1,112,54,100,3,124,0,95,2,100,4,124, + 0,95,3,116,4,131,0,124,0,95,5,116,4,131,0,124, + 0,95,6,100,5,83,0,41,6,122,154,73,110,105,116,105, + 97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,112, + 97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,110, + 32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,32, + 110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,32, + 32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,97, + 105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,114, + 32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,117, + 102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,101, + 114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,110, + 105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,22, + 0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,86, + 0,1,0,113,2,100,0,83,0,114,109,0,0,0,114,5, + 0,0,0,114,7,1,0,0,169,1,114,140,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,10,1,0,0,107,5, + 0,0,115,6,0,0,0,18,0,4,128,255,128,122,38,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,114,71,0,0,0,114,104,0,0,0,78, + 41,7,114,167,0,0,0,218,8,95,108,111,97,100,101,114, + 115,114,44,0,0,0,218,11,95,112,97,116,104,95,109,116, + 105,109,101,218,3,115,101,116,218,11,95,112,97,116,104,95, + 99,97,99,104,101,218,19,95,114,101,108,97,120,101,100,95, + 112,97,116,104,95,99,97,99,104,101,41,5,114,118,0,0, + 0,114,44,0,0,0,218,14,108,111,97,100,101,114,95,100, + 101,116,97,105,108,115,90,7,108,111,97,100,101,114,115,114, + 189,0,0,0,114,5,0,0,0,114,55,1,0,0,114,8, + 0,0,0,114,209,0,0,0,101,5,0,0,115,20,0,0, + 0,4,4,12,1,26,1,6,1,10,2,6,1,8,1,8, + 1,4,128,255,128,122,19,70,105,108,101,70,105,110,100,101, + 114,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, + 0,0,0,115,10,0,0,0,100,1,124,0,95,0,100,2, + 83,0,41,3,122,31,73,110,118,97,108,105,100,97,116,101, + 32,116,104,101,32,100,105,114,101,99,116,111,114,121,32,109, + 116,105,109,101,46,114,104,0,0,0,78,41,1,114,57,1, 0,0,114,246,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,31,1,0,0,235,5,0,0,115, - 4,0,0,0,12,1,255,128,122,19,70,105,108,101,70,105, - 110,100,101,114,46,95,95,114,101,112,114,95,95,41,1,78, - 41,15,114,125,0,0,0,114,124,0,0,0,114,126,0,0, - 0,114,127,0,0,0,114,209,0,0,0,114,38,1,0,0, - 114,143,0,0,0,114,206,0,0,0,114,137,0,0,0,114, - 51,1,0,0,114,203,0,0,0,114,62,1,0,0,114,207, - 0,0,0,114,69,1,0,0,114,31,1,0,0,114,5,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,54,1,0,0,92,5,0,0,115,26,0,0,0,8, - 0,4,2,8,7,8,14,4,4,8,2,8,12,10,5,8, - 48,2,31,10,1,12,17,255,128,114,54,1,0,0,99,4, - 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,144,0,0,0,124,0,160,0, - 100,1,161,1,125,4,124,0,160,0,100,2,161,1,125,5, - 124,4,115,66,124,5,114,36,124,5,106,1,125,4,110,30, - 124,2,124,3,107,2,114,56,116,2,124,1,124,2,131,2, - 125,4,110,10,116,3,124,1,124,2,131,2,125,4,124,5, - 115,84,116,4,124,1,124,2,124,4,100,3,141,3,125,5, - 122,36,124,5,124,0,100,2,60,0,124,4,124,0,100,1, - 60,0,124,2,124,0,100,4,60,0,124,3,124,0,100,5, - 60,0,87,0,110,18,4,0,116,5,121,138,1,0,1,0, - 1,0,89,0,110,2,48,0,100,0,83,0,41,6,78,218, - 10,95,95,108,111,97,100,101,114,95,95,218,8,95,95,115, - 112,101,99,95,95,114,55,1,0,0,90,8,95,95,102,105, - 108,101,95,95,90,10,95,95,99,97,99,104,101,100,95,95, - 41,6,218,3,103,101,116,114,140,0,0,0,114,5,1,0, - 0,114,255,0,0,0,114,190,0,0,0,218,9,69,120,99, - 101,112,116,105,111,110,41,6,90,2,110,115,114,116,0,0, - 0,90,8,112,97,116,104,110,97,109,101,90,9,99,112,97, - 116,104,110,97,109,101,114,140,0,0,0,114,187,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 14,95,102,105,120,95,117,112,95,109,111,100,117,108,101,241, - 5,0,0,115,38,0,0,0,10,2,10,1,4,1,4,1, - 8,1,8,1,12,1,10,2,4,1,14,1,2,1,8,1, - 8,1,8,1,12,1,12,1,6,2,4,128,255,128,114,74, - 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, - 0,116,0,116,1,160,2,161,0,102,2,125,0,116,3,116, - 4,102,2,125,1,116,5,116,6,102,2,125,2,124,0,124, - 1,124,2,103,3,83,0,41,1,122,95,82,101,116,117,114, - 110,115,32,97,32,108,105,115,116,32,111,102,32,102,105,108, - 101,45,98,97,115,101,100,32,109,111,100,117,108,101,32,108, - 111,97,100,101,114,115,46,10,10,32,32,32,32,69,97,99, - 104,32,105,116,101,109,32,105,115,32,97,32,116,117,112,108, - 101,32,40,108,111,97,100,101,114,44,32,115,117,102,102,105, - 120,101,115,41,46,10,32,32,32,32,41,7,114,252,0,0, - 0,114,163,0,0,0,218,18,101,120,116,101,110,115,105,111, - 110,95,115,117,102,102,105,120,101,115,114,255,0,0,0,114, - 101,0,0,0,114,5,1,0,0,114,88,0,0,0,41,3, - 90,10,101,120,116,101,110,115,105,111,110,115,90,6,115,111, - 117,114,99,101,90,8,98,121,116,101,99,111,100,101,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,184,0, - 0,0,8,6,0,0,115,10,0,0,0,12,5,8,1,8, - 1,10,1,255,128,114,184,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,10,0,0,0,9,0,0,0,67, - 0,0,0,115,130,1,0,0,124,0,97,0,116,0,106,1, - 97,1,116,0,106,2,97,2,116,1,106,3,116,4,25,0, - 125,1,100,1,100,2,103,1,102,2,100,3,100,4,100,2, - 103,2,102,2,102,2,125,2,124,2,68,0,93,106,92,2, - 125,3,125,4,116,5,100,5,100,6,132,0,124,4,68,0, - 131,1,131,1,115,82,74,0,130,1,124,4,100,7,25,0, - 125,5,124,3,116,1,106,3,118,0,114,116,116,1,106,3, - 124,3,25,0,125,6,1,0,113,168,113,52,122,20,116,0, - 160,6,124,3,161,1,125,6,87,0,1,0,113,168,87,0, - 113,52,4,0,116,7,121,158,1,0,1,0,1,0,89,0, - 113,52,89,0,113,52,48,0,116,7,100,8,131,1,130,1, - 116,8,124,1,100,9,124,6,131,3,1,0,116,8,124,1, - 100,10,124,5,131,3,1,0,116,8,124,1,100,11,100,12, - 160,9,124,4,161,1,131,3,1,0,116,8,124,1,100,13, - 100,14,100,15,132,0,124,4,68,0,131,1,131,3,1,0, - 103,0,100,16,162,1,125,7,124,3,100,3,107,2,144,1, - 114,4,124,7,160,10,100,17,161,1,1,0,124,7,68,0, - 93,52,125,8,124,8,116,1,106,3,118,1,144,1,114,36, - 116,0,160,6,124,8,161,1,125,9,110,10,116,1,106,3, - 124,8,25,0,125,9,116,8,124,1,124,8,124,9,131,3, - 1,0,144,1,113,8,116,8,124,1,100,18,116,11,131,0, - 131,3,1,0,116,12,160,13,116,2,160,14,161,0,161,1, - 1,0,124,3,100,3,107,2,144,1,114,126,116,15,160,10, - 100,19,161,1,1,0,100,20,116,12,118,0,144,1,114,126, - 100,21,116,16,95,17,100,22,83,0,41,23,122,205,83,101, - 116,117,112,32,116,104,101,32,112,97,116,104,45,98,97,115, - 101,100,32,105,109,112,111,114,116,101,114,115,32,102,111,114, - 32,105,109,112,111,114,116,108,105,98,32,98,121,32,105,109, - 112,111,114,116,105,110,103,32,110,101,101,100,101,100,10,32, - 32,32,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,115,32,97,110,100,32,105,110,106,101,99,116,105,110, - 103,32,116,104,101,109,32,105,110,116,111,32,116,104,101,32, - 103,108,111,98,97,108,32,110,97,109,101,115,112,97,99,101, - 46,10,10,32,32,32,32,79,116,104,101,114,32,99,111,109, - 112,111,110,101,110,116,115,32,97,114,101,32,101,120,116,114, - 97,99,116,101,100,32,102,114,111,109,32,116,104,101,32,99, - 111,114,101,32,98,111,111,116,115,116,114,97,112,32,109,111, - 100,117,108,101,46,10,10,32,32,32,32,90,5,112,111,115, - 105,120,250,1,47,90,2,110,116,250,1,92,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, - 0,115,0,0,0,115,26,0,0,0,124,0,93,18,125,1, - 116,0,124,1,131,1,100,0,107,2,86,0,1,0,113,2, - 100,1,83,0,41,2,114,39,0,0,0,78,41,1,114,23, - 0,0,0,41,2,114,32,0,0,0,114,94,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,10, - 1,0,0,37,6,0,0,115,6,0,0,0,22,0,4,128, - 255,128,122,25,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,114,73,0, - 0,0,122,30,105,109,112,111,114,116,108,105,98,32,114,101, - 113,117,105,114,101,115,32,112,111,115,105,120,32,111,114,32, - 110,116,114,4,0,0,0,114,35,0,0,0,114,31,0,0, - 0,114,40,0,0,0,114,58,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 83,0,0,0,115,22,0,0,0,104,0,124,0,93,14,125, - 1,100,0,124,1,155,0,157,2,146,2,113,4,83,0,41, - 1,114,74,0,0,0,114,5,0,0,0,41,2,114,32,0, - 0,0,218,1,115,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,63,1,0,0,54,6,0,0,115,4,0, - 0,0,22,0,255,128,122,25,95,115,101,116,117,112,46,60, - 108,111,99,97,108,115,62,46,60,115,101,116,99,111,109,112, - 62,41,3,114,64,0,0,0,114,75,0,0,0,114,160,0, - 0,0,114,192,0,0,0,114,9,0,0,0,122,4,46,112, - 121,119,122,6,95,100,46,112,121,100,84,78,41,18,114,134, - 0,0,0,114,1,0,0,0,114,163,0,0,0,114,22,1, - 0,0,114,125,0,0,0,218,3,97,108,108,90,18,95,98, - 117,105,108,116,105,110,95,102,114,111,109,95,110,97,109,101, - 114,117,0,0,0,114,129,0,0,0,114,36,0,0,0,114, - 186,0,0,0,114,14,0,0,0,114,12,1,0,0,114,167, - 0,0,0,114,75,1,0,0,114,101,0,0,0,114,191,0, - 0,0,114,195,0,0,0,41,10,218,17,95,98,111,111,116, - 115,116,114,97,112,95,109,111,100,117,108,101,90,11,115,101, - 108,102,95,109,111,100,117,108,101,90,10,111,115,95,100,101, - 116,97,105,108,115,90,10,98,117,105,108,116,105,110,95,111, - 115,114,31,0,0,0,114,35,0,0,0,90,9,111,115,95, - 109,111,100,117,108,101,90,13,98,117,105,108,116,105,110,95, - 110,97,109,101,115,90,12,98,117,105,108,116,105,110,95,110, - 97,109,101,90,14,98,117,105,108,116,105,110,95,109,111,100, - 117,108,101,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,6,95,115,101,116,117,112,19,6,0,0,115,74, - 0,0,0,4,8,6,1,6,1,10,2,22,3,12,1,22, - 2,8,1,10,1,10,1,6,1,2,2,10,1,10,1,12, - 1,10,1,8,2,12,2,12,1,18,1,22,1,8,3,10, - 1,10,1,8,1,12,1,12,1,10,2,16,1,14,3,14, - 1,10,1,10,1,10,1,6,1,4,128,255,128,114,81,1, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,0, - 116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,2, - 106,3,160,4,116,5,106,6,124,1,142,0,103,1,161,1, - 1,0,116,2,106,7,160,8,116,9,161,1,1,0,100,1, - 83,0,41,2,122,41,73,110,115,116,97,108,108,32,116,104, + 0,114,8,0,0,0,114,38,1,0,0,115,5,0,0,115, + 6,0,0,0,6,2,4,128,255,128,122,28,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,0,0,0, + 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, + 0,115,42,0,0,0,124,0,160,0,124,1,161,1,125,2, + 124,2,100,1,117,0,114,26,100,1,103,0,102,2,83,0, + 124,2,106,1,124,2,106,2,112,38,103,0,102,2,83,0, + 41,2,122,197,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,44,32,111,114,32,116,104,101,32,110,97,109,101,115,112, + 97,99,101,10,32,32,32,32,32,32,32,32,112,97,99,107, + 97,103,101,32,112,111,114,116,105,111,110,115,46,32,82,101, + 116,117,114,110,115,32,40,108,111,97,100,101,114,44,32,108, + 105,115,116,45,111,102,45,112,111,114,116,105,111,110,115,41, + 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,102,105,110,100,95, + 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, + 10,32,32,32,32,32,32,32,32,78,41,3,114,203,0,0, + 0,114,140,0,0,0,114,178,0,0,0,41,3,114,118,0, + 0,0,114,139,0,0,0,114,187,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,137,0,0,0, + 121,5,0,0,115,10,0,0,0,10,7,8,1,8,1,16, + 1,255,128,122,22,70,105,108,101,70,105,110,100,101,114,46, + 102,105,110,100,95,108,111,97,100,101,114,99,6,0,0,0, + 0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0, + 67,0,0,0,115,26,0,0,0,124,1,124,2,124,3,131, + 2,125,6,116,0,124,2,124,3,124,6,124,4,100,1,141, + 4,83,0,41,2,78,114,177,0,0,0,41,1,114,190,0, + 0,0,41,7,114,118,0,0,0,114,188,0,0,0,114,139, + 0,0,0,114,44,0,0,0,90,4,115,109,115,108,114,202, + 0,0,0,114,140,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,51,1,0,0,133,5,0,0, + 115,10,0,0,0,10,1,8,1,2,1,6,255,255,128,122, + 20,70,105,108,101,70,105,110,100,101,114,46,95,103,101,116, + 95,115,112,101,99,78,99,3,0,0,0,0,0,0,0,0, + 0,0,0,14,0,0,0,8,0,0,0,67,0,0,0,115, + 92,1,0,0,100,1,125,3,124,1,160,0,100,2,161,1, + 100,3,25,0,125,4,122,24,116,1,124,0,106,2,112,34, + 116,3,160,4,161,0,131,1,106,5,125,5,87,0,110,22, + 4,0,116,6,121,64,1,0,1,0,1,0,100,4,125,5, + 89,0,110,2,48,0,124,5,124,0,106,7,107,3,114,90, + 124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,9, + 131,0,114,112,124,0,106,10,125,6,124,4,160,11,161,0, + 125,7,110,10,124,0,106,12,125,6,124,4,125,7,124,7, + 124,6,118,0,114,214,116,13,124,0,106,2,124,4,131,2, + 125,8,124,0,106,14,68,0,93,56,92,2,125,9,125,10, + 100,5,124,9,23,0,125,11,116,13,124,8,124,11,131,2, + 125,12,116,15,124,12,131,1,114,148,124,0,160,16,124,10, + 124,1,124,12,124,8,103,1,124,2,161,5,2,0,1,0, + 83,0,116,17,124,8,131,1,125,3,124,0,106,14,68,0, + 93,80,92,2,125,9,125,10,116,13,124,0,106,2,124,4, + 124,9,23,0,131,2,125,12,116,18,106,19,100,6,124,12, + 100,3,100,7,141,3,1,0,124,7,124,9,23,0,124,6, + 118,0,114,220,116,15,124,12,131,1,114,220,124,0,160,16, + 124,10,124,1,124,12,100,8,124,2,161,5,2,0,1,0, + 83,0,124,3,144,1,114,88,116,18,160,19,100,9,124,8, + 161,2,1,0,116,18,160,20,124,1,100,8,161,2,125,13, + 124,8,103,1,124,13,95,21,124,13,83,0,100,8,83,0, + 41,10,122,111,84,114,121,32,116,111,32,102,105,110,100,32, + 97,32,115,112,101,99,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,46, + 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, + 115,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115, + 112,101,99,44,32,111,114,32,78,111,110,101,32,105,102,32, + 110,111,116,32,102,111,117,110,100,46,10,32,32,32,32,32, + 32,32,32,70,114,71,0,0,0,114,28,0,0,0,114,104, + 0,0,0,114,209,0,0,0,122,9,116,114,121,105,110,103, + 32,123,125,41,1,90,9,118,101,114,98,111,115,105,116,121, + 78,122,25,112,111,115,115,105,98,108,101,32,110,97,109,101, + 115,112,97,99,101,32,102,111,114,32,123,125,41,22,114,41, + 0,0,0,114,49,0,0,0,114,44,0,0,0,114,4,0, + 0,0,114,55,0,0,0,114,0,1,0,0,114,50,0,0, + 0,114,57,1,0,0,218,11,95,102,105,108,108,95,99,97, + 99,104,101,114,9,0,0,0,114,60,1,0,0,114,105,0, + 0,0,114,59,1,0,0,114,38,0,0,0,114,56,1,0, + 0,114,54,0,0,0,114,51,1,0,0,114,56,0,0,0, + 114,134,0,0,0,114,149,0,0,0,114,183,0,0,0,114, + 178,0,0,0,41,14,114,118,0,0,0,114,139,0,0,0, + 114,202,0,0,0,90,12,105,115,95,110,97,109,101,115,112, + 97,99,101,90,11,116,97,105,108,95,109,111,100,117,108,101, + 114,169,0,0,0,90,5,99,97,99,104,101,90,12,99,97, + 99,104,101,95,109,111,100,117,108,101,90,9,98,97,115,101, + 95,112,97,116,104,114,8,1,0,0,114,188,0,0,0,90, + 13,105,110,105,116,95,102,105,108,101,110,97,109,101,90,9, + 102,117,108,108,95,112,97,116,104,114,187,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,203,0, + 0,0,138,5,0,0,115,74,0,0,0,4,5,14,1,2, + 1,24,1,12,1,10,1,10,1,8,1,6,1,6,2,6, + 1,10,1,6,2,4,1,8,2,12,1,14,1,8,1,10, + 1,8,1,24,1,8,4,14,2,16,1,16,1,12,1,8, + 1,10,1,4,1,8,255,6,2,12,1,12,1,8,1,4, + 1,4,1,255,128,122,20,70,105,108,101,70,105,110,100,101, + 114,46,102,105,110,100,95,115,112,101,99,99,1,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,10,0,0,0, + 67,0,0,0,115,188,0,0,0,124,0,106,0,125,1,122, + 22,116,1,160,2,124,1,112,22,116,1,160,3,161,0,161, + 1,125,2,87,0,110,28,4,0,116,4,116,5,116,6,102, + 3,121,56,1,0,1,0,1,0,103,0,125,2,89,0,110, + 2,48,0,116,7,106,8,160,9,100,1,161,1,115,82,116, + 10,124,2,131,1,124,0,95,11,110,74,116,10,131,0,125, + 3,124,2,68,0,93,56,125,4,124,4,160,12,100,2,161, + 1,92,3,125,5,125,6,125,7,124,6,114,134,100,3,160, + 13,124,5,124,7,160,14,161,0,161,2,125,8,110,4,124, + 5,125,8,124,3,160,15,124,8,161,1,1,0,113,92,124, + 3,124,0,95,11,116,7,106,8,160,9,116,16,161,1,114, + 184,100,4,100,5,132,0,124,2,68,0,131,1,124,0,95, + 17,100,6,83,0,41,7,122,68,70,105,108,108,32,116,104, + 101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110, + 116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100, + 32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104, + 105,115,32,100,105,114,101,99,116,111,114,121,46,114,0,0, + 0,0,114,71,0,0,0,114,61,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,83,0,0,0,115,20,0,0,0,104,0,124,0,93,12, + 125,1,124,1,160,0,161,0,146,2,113,4,83,0,114,5, + 0,0,0,41,1,114,105,0,0,0,41,2,114,32,0,0, + 0,90,2,102,110,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,9,60,115,101,116,99,111,109,112,62,215, + 5,0,0,115,4,0,0,0,20,0,255,128,122,41,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,115, + 101,116,99,111,109,112,62,78,41,18,114,44,0,0,0,114, + 4,0,0,0,90,7,108,105,115,116,100,105,114,114,55,0, + 0,0,114,45,1,0,0,218,15,80,101,114,109,105,115,115, + 105,111,110,69,114,114,111,114,218,18,78,111,116,65,68,105, + 114,101,99,116,111,114,121,69,114,114,111,114,114,1,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,58,1,0,0, + 114,59,1,0,0,114,100,0,0,0,114,62,0,0,0,114, + 105,0,0,0,218,3,97,100,100,114,12,0,0,0,114,60, + 1,0,0,41,9,114,118,0,0,0,114,44,0,0,0,90, + 8,99,111,110,116,101,110,116,115,90,21,108,111,119,101,114, + 95,115,117,102,102,105,120,95,99,111,110,116,101,110,116,115, + 114,33,1,0,0,114,116,0,0,0,114,20,1,0,0,114, + 8,1,0,0,90,8,110,101,119,95,110,97,109,101,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,62,1, + 0,0,186,5,0,0,115,38,0,0,0,6,2,2,1,22, + 1,18,1,10,3,12,3,12,1,6,7,8,1,16,1,4, + 1,18,1,4,2,12,1,6,1,12,1,16,1,4,128,255, + 128,122,22,70,105,108,101,70,105,110,100,101,114,46,95,102, + 105,108,108,95,99,97,99,104,101,99,1,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,3,0,0,0,7,0, + 0,0,115,18,0,0,0,135,0,135,1,102,2,100,1,100, + 2,132,8,125,2,124,2,83,0,41,3,97,20,1,0,0, + 65,32,99,108,97,115,115,32,109,101,116,104,111,100,32,119, + 104,105,99,104,32,114,101,116,117,114,110,115,32,97,32,99, + 108,111,115,117,114,101,32,116,111,32,117,115,101,32,111,110, + 32,115,121,115,46,112,97,116,104,95,104,111,111,107,10,32, + 32,32,32,32,32,32,32,119,104,105,99,104,32,119,105,108, + 108,32,114,101,116,117,114,110,32,97,110,32,105,110,115,116, + 97,110,99,101,32,117,115,105,110,103,32,116,104,101,32,115, + 112,101,99,105,102,105,101,100,32,108,111,97,100,101,114,115, + 32,97,110,100,32,116,104,101,32,112,97,116,104,10,32,32, + 32,32,32,32,32,32,99,97,108,108,101,100,32,111,110,32, + 116,104,101,32,99,108,111,115,117,114,101,46,10,10,32,32, + 32,32,32,32,32,32,73,102,32,116,104,101,32,112,97,116, + 104,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32, + 99,108,111,115,117,114,101,32,105,115,32,110,111,116,32,97, + 32,100,105,114,101,99,116,111,114,121,44,32,73,109,112,111, + 114,116,69,114,114,111,114,32,105,115,10,32,32,32,32,32, + 32,32,32,114,97,105,115,101,100,46,10,10,32,32,32,32, + 32,32,32,32,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,19,0,0,0,115,36,0, + 0,0,116,0,124,0,131,1,115,20,116,1,100,1,124,0, + 100,2,141,2,130,1,136,0,124,0,103,1,136,1,162,1, + 82,0,142,0,83,0,41,3,122,45,80,97,116,104,32,104, + 111,111,107,32,102,111,114,32,105,109,112,111,114,116,108,105, + 98,46,109,97,99,104,105,110,101,114,121,46,70,105,108,101, + 70,105,110,100,101,114,46,122,30,111,110,108,121,32,100,105, + 114,101,99,116,111,114,105,101,115,32,97,114,101,32,115,117, + 112,112,111,114,116,101,100,114,48,0,0,0,41,2,114,56, + 0,0,0,114,117,0,0,0,114,48,0,0,0,169,2,114, + 193,0,0,0,114,61,1,0,0,114,5,0,0,0,114,8, + 0,0,0,218,24,112,97,116,104,95,104,111,111,107,95,102, + 111,114,95,70,105,108,101,70,105,110,100,101,114,227,5,0, + 0,115,8,0,0,0,8,2,12,1,16,1,255,128,122,54, + 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,107,95,102,111,114,95,70,105,108,101, + 70,105,110,100,101,114,114,5,0,0,0,41,3,114,193,0, + 0,0,114,61,1,0,0,114,68,1,0,0,114,5,0,0, + 0,114,67,1,0,0,114,8,0,0,0,218,9,112,97,116, + 104,95,104,111,111,107,217,5,0,0,115,6,0,0,0,14, + 10,4,6,255,128,122,20,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,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,12,0,0,0,100,1,160,0,124,0,106, + 1,161,1,83,0,41,2,78,122,16,70,105,108,101,70,105, + 110,100,101,114,40,123,33,114,125,41,41,2,114,62,0,0, + 0,114,44,0,0,0,114,246,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,31,1,0,0,235, + 5,0,0,115,4,0,0,0,12,1,255,128,122,19,70,105, + 108,101,70,105,110,100,101,114,46,95,95,114,101,112,114,95, + 95,41,1,78,41,15,114,125,0,0,0,114,124,0,0,0, + 114,126,0,0,0,114,127,0,0,0,114,209,0,0,0,114, + 38,1,0,0,114,143,0,0,0,114,206,0,0,0,114,137, + 0,0,0,114,51,1,0,0,114,203,0,0,0,114,62,1, + 0,0,114,207,0,0,0,114,69,1,0,0,114,31,1,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,54,1,0,0,92,5,0,0,115,26, + 0,0,0,8,0,4,2,8,7,8,14,4,4,8,2,8, + 12,10,5,8,48,2,31,10,1,12,17,255,128,114,54,1, + 0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,8,0,0,0,67,0,0,0,115,144,0,0,0, + 124,0,160,0,100,1,161,1,125,4,124,0,160,0,100,2, + 161,1,125,5,124,4,115,66,124,5,114,36,124,5,106,1, + 125,4,110,30,124,2,124,3,107,2,114,56,116,2,124,1, + 124,2,131,2,125,4,110,10,116,3,124,1,124,2,131,2, + 125,4,124,5,115,84,116,4,124,1,124,2,124,4,100,3, + 141,3,125,5,122,38,124,5,124,0,100,2,60,0,124,4, + 124,0,100,1,60,0,124,2,124,0,100,4,60,0,124,3, + 124,0,100,5,60,0,87,0,100,0,83,0,4,0,116,5, + 121,142,1,0,1,0,1,0,89,0,100,0,83,0,48,0, + 41,6,78,218,10,95,95,108,111,97,100,101,114,95,95,218, + 8,95,95,115,112,101,99,95,95,114,55,1,0,0,90,8, + 95,95,102,105,108,101,95,95,90,10,95,95,99,97,99,104, + 101,100,95,95,41,6,218,3,103,101,116,114,140,0,0,0, + 114,5,1,0,0,114,255,0,0,0,114,190,0,0,0,218, + 9,69,120,99,101,112,116,105,111,110,41,6,90,2,110,115, + 114,116,0,0,0,90,8,112,97,116,104,110,97,109,101,90, + 9,99,112,97,116,104,110,97,109,101,114,140,0,0,0,114, + 187,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,14,95,102,105,120,95,117,112,95,109,111,100, + 117,108,101,241,5,0,0,115,42,0,0,0,10,2,10,1, + 4,1,4,1,8,1,8,1,12,1,10,2,4,1,14,1, + 2,1,8,1,8,1,8,1,10,1,4,128,12,1,2,2, + 4,128,2,0,255,128,114,74,1,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,38,0,0,0,116,0,116,1,160,2,161, + 0,102,2,125,0,116,3,116,4,102,2,125,1,116,5,116, + 6,102,2,125,2,124,0,124,1,124,2,103,3,83,0,41, + 1,122,95,82,101,116,117,114,110,115,32,97,32,108,105,115, + 116,32,111,102,32,102,105,108,101,45,98,97,115,101,100,32, + 109,111,100,117,108,101,32,108,111,97,100,101,114,115,46,10, + 10,32,32,32,32,69,97,99,104,32,105,116,101,109,32,105, + 115,32,97,32,116,117,112,108,101,32,40,108,111,97,100,101, + 114,44,32,115,117,102,102,105,120,101,115,41,46,10,32,32, + 32,32,41,7,114,252,0,0,0,114,163,0,0,0,218,18, + 101,120,116,101,110,115,105,111,110,95,115,117,102,102,105,120, + 101,115,114,255,0,0,0,114,101,0,0,0,114,5,1,0, + 0,114,88,0,0,0,41,3,90,10,101,120,116,101,110,115, + 105,111,110,115,90,6,115,111,117,114,99,101,90,8,98,121, + 116,101,99,111,100,101,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,184,0,0,0,8,6,0,0,115,10, + 0,0,0,12,5,8,1,8,1,10,1,255,128,114,184,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,10, + 0,0,0,9,0,0,0,67,0,0,0,115,116,1,0,0, + 124,0,97,0,116,0,106,1,97,1,116,0,106,2,97,2, + 116,1,106,3,116,4,25,0,125,1,100,1,100,2,103,1, + 102,2,100,3,100,4,100,2,103,2,102,2,102,2,125,2, + 124,2,68,0,93,96,92,2,125,3,125,4,116,5,100,5, + 100,6,132,0,124,4,68,0,131,1,131,1,115,82,74,0, + 130,1,124,4,100,7,25,0,125,5,124,3,116,1,106,3, + 118,0,114,114,116,1,106,3,124,3,25,0,125,6,1,0, + 113,158,122,16,116,0,160,6,124,3,161,1,125,6,87,0, + 1,0,113,158,4,0,116,7,121,148,1,0,1,0,1,0, + 89,0,113,52,48,0,116,7,100,8,131,1,130,1,116,8, + 124,1,100,9,124,6,131,3,1,0,116,8,124,1,100,10, + 124,5,131,3,1,0,116,8,124,1,100,11,100,12,160,9, + 124,4,161,1,131,3,1,0,116,8,124,1,100,13,100,14, + 100,15,132,0,124,4,68,0,131,1,131,3,1,0,103,0, + 100,16,162,1,125,7,124,3,100,3,107,2,114,248,124,7, + 160,10,100,17,161,1,1,0,124,7,68,0,93,50,125,8, + 124,8,116,1,106,3,118,1,144,1,114,24,116,0,160,6, + 124,8,161,1,125,9,110,10,116,1,106,3,124,8,25,0, + 125,9,116,8,124,1,124,8,124,9,131,3,1,0,113,252, + 116,8,124,1,100,18,116,11,131,0,131,3,1,0,116,12, + 160,13,116,2,160,14,161,0,161,1,1,0,124,3,100,3, + 107,2,144,1,114,112,116,15,160,10,100,19,161,1,1,0, + 100,20,116,12,118,0,144,1,114,112,100,21,116,16,95,17, + 100,22,83,0,41,23,122,205,83,101,116,117,112,32,116,104, 101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112, - 111,114,116,32,99,111,109,112,111,110,101,110,116,115,46,78, - 41,10,114,81,1,0,0,114,184,0,0,0,114,1,0,0, - 0,114,43,1,0,0,114,167,0,0,0,114,54,1,0,0, - 114,69,1,0,0,218,9,109,101,116,97,95,112,97,116,104, - 114,186,0,0,0,114,37,1,0,0,41,2,114,80,1,0, - 0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,97, - 100,101,114,115,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,8,95,105,110,115,116,97,108,108,76,6,0, - 0,115,12,0,0,0,8,2,6,1,20,1,12,1,4,128, - 255,128,114,83,1,0,0,41,1,114,60,0,0,0,41,1, - 78,41,3,78,78,78,41,2,114,73,0,0,0,114,73,0, - 0,0,41,1,84,41,1,78,41,1,78,41,63,114,127,0, - 0,0,114,13,0,0,0,90,37,95,67,65,83,69,95,73, - 78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70, - 79,82,77,83,95,66,89,84,69,83,95,75,69,89,114,12, - 0,0,0,114,14,0,0,0,114,21,0,0,0,114,27,0, - 0,0,114,29,0,0,0,114,38,0,0,0,114,47,0,0, - 0,114,49,0,0,0,114,53,0,0,0,114,54,0,0,0, - 114,56,0,0,0,114,59,0,0,0,114,69,0,0,0,218, - 4,116,121,112,101,218,8,95,95,99,111,100,101,95,95,114, - 162,0,0,0,114,19,0,0,0,114,148,0,0,0,114,18, - 0,0,0,114,24,0,0,0,114,236,0,0,0,114,91,0, - 0,0,114,87,0,0,0,114,101,0,0,0,114,88,0,0, - 0,90,23,68,69,66,85,71,95,66,89,84,69,67,79,68, - 69,95,83,85,70,70,73,88,69,83,90,27,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,114,97,0,0,0,114,102,0,0, - 0,114,108,0,0,0,114,112,0,0,0,114,114,0,0,0, - 114,136,0,0,0,114,143,0,0,0,114,152,0,0,0,114, - 156,0,0,0,114,158,0,0,0,114,165,0,0,0,114,170, - 0,0,0,114,171,0,0,0,114,176,0,0,0,218,6,111, - 98,106,101,99,116,114,185,0,0,0,114,190,0,0,0,114, - 191,0,0,0,114,208,0,0,0,114,221,0,0,0,114,239, - 0,0,0,114,255,0,0,0,114,5,1,0,0,114,12,1, - 0,0,114,252,0,0,0,114,13,1,0,0,114,35,1,0, - 0,114,37,1,0,0,114,54,1,0,0,114,74,1,0,0, - 114,184,0,0,0,114,81,1,0,0,114,83,1,0,0,114, - 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,0, - 0,115,132,0,0,0,4,0,4,22,4,1,2,1,2,1, - 4,255,8,4,8,17,8,5,8,5,8,6,8,6,8,12, - 8,10,8,9,8,5,8,7,10,9,10,22,0,127,16,22, - 12,1,4,2,4,1,6,2,6,2,8,2,16,2,8,71, - 8,40,8,19,8,12,8,12,8,28,8,17,8,33,8,28, - 10,24,10,13,10,10,8,11,6,14,4,3,2,1,12,255, - 14,68,14,64,16,29,0,127,14,17,18,50,18,45,4,26, - 18,3,14,53,14,63,14,42,0,127,14,20,0,127,10,22, - 8,23,8,11,8,57,4,128,255,128, + 111,114,116,101,114,115,32,102,111,114,32,105,109,112,111,114, + 116,108,105,98,32,98,121,32,105,109,112,111,114,116,105,110, + 103,32,110,101,101,100,101,100,10,32,32,32,32,98,117,105, + 108,116,45,105,110,32,109,111,100,117,108,101,115,32,97,110, + 100,32,105,110,106,101,99,116,105,110,103,32,116,104,101,109, + 32,105,110,116,111,32,116,104,101,32,103,108,111,98,97,108, + 32,110,97,109,101,115,112,97,99,101,46,10,10,32,32,32, + 32,79,116,104,101,114,32,99,111,109,112,111,110,101,110,116, + 115,32,97,114,101,32,101,120,116,114,97,99,116,101,100,32, + 102,114,111,109,32,116,104,101,32,99,111,114,101,32,98,111, + 111,116,115,116,114,97,112,32,109,111,100,117,108,101,46,10, + 10,32,32,32,32,90,5,112,111,115,105,120,250,1,47,90, + 2,110,116,250,1,92,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,115,0,0,0,115, + 26,0,0,0,124,0,93,18,125,1,116,0,124,1,131,1, + 100,0,107,2,86,0,1,0,113,2,100,1,83,0,41,2, + 114,39,0,0,0,78,41,1,114,23,0,0,0,41,2,114, + 32,0,0,0,114,94,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,10,1,0,0,37,6,0, + 0,115,6,0,0,0,22,0,4,128,255,128,122,25,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,114,73,0,0,0,122,30,105,109, + 112,111,114,116,108,105,98,32,114,101,113,117,105,114,101,115, + 32,112,111,115,105,120,32,111,114,32,110,116,114,4,0,0, + 0,114,35,0,0,0,114,31,0,0,0,114,40,0,0,0, + 114,58,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,83,0,0,0,115,22, + 0,0,0,104,0,124,0,93,14,125,1,100,0,124,1,155, + 0,157,2,146,2,113,4,83,0,41,1,114,74,0,0,0, + 114,5,0,0,0,41,2,114,32,0,0,0,218,1,115,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,63, + 1,0,0,54,6,0,0,115,4,0,0,0,22,0,255,128, + 122,25,95,115,101,116,117,112,46,60,108,111,99,97,108,115, + 62,46,60,115,101,116,99,111,109,112,62,41,3,114,64,0, + 0,0,114,75,0,0,0,114,160,0,0,0,114,192,0,0, + 0,114,9,0,0,0,122,4,46,112,121,119,122,6,95,100, + 46,112,121,100,84,78,41,18,114,134,0,0,0,114,1,0, + 0,0,114,163,0,0,0,114,22,1,0,0,114,125,0,0, + 0,218,3,97,108,108,90,18,95,98,117,105,108,116,105,110, + 95,102,114,111,109,95,110,97,109,101,114,117,0,0,0,114, + 129,0,0,0,114,36,0,0,0,114,186,0,0,0,114,14, + 0,0,0,114,12,1,0,0,114,167,0,0,0,114,75,1, + 0,0,114,101,0,0,0,114,191,0,0,0,114,195,0,0, + 0,41,10,218,17,95,98,111,111,116,115,116,114,97,112,95, + 109,111,100,117,108,101,90,11,115,101,108,102,95,109,111,100, + 117,108,101,90,10,111,115,95,100,101,116,97,105,108,115,90, + 10,98,117,105,108,116,105,110,95,111,115,114,31,0,0,0, + 114,35,0,0,0,90,9,111,115,95,109,111,100,117,108,101, + 90,13,98,117,105,108,116,105,110,95,110,97,109,101,115,90, + 12,98,117,105,108,116,105,110,95,110,97,109,101,90,14,98, + 117,105,108,116,105,110,95,109,111,100,117,108,101,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,6,95,115, + 101,116,117,112,19,6,0,0,115,74,0,0,0,4,8,6, + 1,6,1,10,2,22,3,12,1,22,2,8,1,10,1,10, + 1,4,1,2,2,10,1,6,1,12,1,6,1,8,2,12, + 2,12,1,18,1,22,1,8,3,8,1,10,1,8,1,12, + 1,12,1,10,2,14,1,14,3,14,1,10,1,10,1,10, + 1,6,1,4,128,255,128,114,81,1,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,67,0,0,0,115,50,0,0,0,116,0,124,0,131,1, + 1,0,116,1,131,0,125,1,116,2,106,3,160,4,116,5, + 106,6,124,1,142,0,103,1,161,1,1,0,116,2,106,7, + 160,8,116,9,161,1,1,0,100,1,83,0,41,2,122,41, + 73,110,115,116,97,108,108,32,116,104,101,32,112,97,116,104, + 45,98,97,115,101,100,32,105,109,112,111,114,116,32,99,111, + 109,112,111,110,101,110,116,115,46,78,41,10,114,81,1,0, + 0,114,184,0,0,0,114,1,0,0,0,114,43,1,0,0, + 114,167,0,0,0,114,54,1,0,0,114,69,1,0,0,218, + 9,109,101,116,97,95,112,97,116,104,114,186,0,0,0,114, + 37,1,0,0,41,2,114,80,1,0,0,90,17,115,117,112, + 112,111,114,116,101,100,95,108,111,97,100,101,114,115,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,8,95, + 105,110,115,116,97,108,108,76,6,0,0,115,12,0,0,0, + 8,2,6,1,20,1,12,1,4,128,255,128,114,83,1,0, + 0,41,1,114,60,0,0,0,41,1,78,41,3,78,78,78, + 41,2,114,73,0,0,0,114,73,0,0,0,41,1,84,41, + 1,78,41,1,78,41,63,114,127,0,0,0,114,13,0,0, + 0,90,37,95,67,65,83,69,95,73,78,83,69,78,83,73, + 84,73,86,69,95,80,76,65,84,70,79,82,77,83,95,66, + 89,84,69,83,95,75,69,89,114,12,0,0,0,114,14,0, + 0,0,114,21,0,0,0,114,27,0,0,0,114,29,0,0, + 0,114,38,0,0,0,114,47,0,0,0,114,49,0,0,0, + 114,53,0,0,0,114,54,0,0,0,114,56,0,0,0,114, + 59,0,0,0,114,69,0,0,0,218,4,116,121,112,101,218, + 8,95,95,99,111,100,101,95,95,114,162,0,0,0,114,19, + 0,0,0,114,148,0,0,0,114,18,0,0,0,114,24,0, + 0,0,114,236,0,0,0,114,91,0,0,0,114,87,0,0, + 0,114,101,0,0,0,114,88,0,0,0,90,23,68,69,66, + 85,71,95,66,89,84,69,67,79,68,69,95,83,85,70,70, + 73,88,69,83,90,27,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,114,97,0,0,0,114,102,0,0,0,114,108,0,0,0, + 114,112,0,0,0,114,114,0,0,0,114,136,0,0,0,114, + 143,0,0,0,114,152,0,0,0,114,156,0,0,0,114,158, + 0,0,0,114,165,0,0,0,114,170,0,0,0,114,171,0, + 0,0,114,176,0,0,0,218,6,111,98,106,101,99,116,114, + 185,0,0,0,114,190,0,0,0,114,191,0,0,0,114,208, + 0,0,0,114,221,0,0,0,114,239,0,0,0,114,255,0, + 0,0,114,5,1,0,0,114,12,1,0,0,114,252,0,0, + 0,114,13,1,0,0,114,35,1,0,0,114,37,1,0,0, + 114,54,1,0,0,114,74,1,0,0,114,184,0,0,0,114, + 81,1,0,0,114,83,1,0,0,114,5,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,8,60, + 109,111,100,117,108,101,62,1,0,0,0,115,132,0,0,0, + 4,0,4,22,4,1,2,1,2,1,4,255,8,4,8,17, + 8,5,8,5,8,6,8,6,8,12,8,10,8,9,8,5, + 8,7,10,9,10,22,0,127,16,22,12,1,4,2,4,1, + 6,2,6,2,8,2,16,2,8,71,8,40,8,19,8,12, + 8,12,8,28,8,17,8,33,8,28,10,24,10,13,10,10, + 8,11,6,14,4,3,2,1,12,255,14,68,14,64,16,29, + 0,127,14,17,18,50,18,45,4,26,18,3,14,53,14,63, + 14,42,0,127,14,20,0,127,10,22,8,23,8,11,8,57, + 4,128,255,128, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index c90a5b79aa5631..0a07f148028a93 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -117,7 +117,7 @@ const unsigned char _Py_M__zipimport[] = { 32,122,105,112,102,105,108,101,32,116,97,114,103,101,116,101, 100,46,10,32,32,32,32,99,2,0,0,0,0,0,0,0, 0,0,0,0,8,0,0,0,9,0,0,0,67,0,0,0, - 115,32,1,0,0,116,0,124,1,116,1,131,2,115,28,100, + 115,28,1,0,0,116,0,124,1,116,1,131,2,115,28,100, 1,100,0,108,2,125,2,124,2,160,3,124,1,161,1,125, 1,124,1,115,44,116,4,100,2,124,1,100,3,141,2,130, 1,116,5,114,60,124,1,160,6,116,5,116,7,161,2,125, @@ -127,100 +127,55 @@ const unsigned char _Py_M__zipimport[] = { 5,125,6,124,5,124,1,107,2,114,130,116,4,100,4,124, 1,100,3,141,2,130,1,124,5,125,1,124,3,160,13,124, 6,161,1,1,0,89,0,113,64,48,0,124,4,106,14,100, - 5,64,0,100,6,107,3,114,180,116,4,100,4,124,1,100, - 3,141,2,130,1,113,180,113,64,122,12,116,15,124,1,25, - 0,125,7,87,0,110,34,4,0,116,16,121,226,1,0,1, - 0,1,0,116,17,124,1,131,1,125,7,124,7,116,15,124, - 1,60,0,89,0,110,2,48,0,124,7,124,0,95,18,124, - 1,124,0,95,19,116,8,106,20,124,3,100,0,100,0,100, - 7,133,3,25,0,142,0,124,0,95,21,124,0,106,21,144, - 1,114,28,124,0,4,0,106,21,116,7,55,0,2,0,95, - 21,100,0,83,0,41,8,78,114,0,0,0,0,122,21,97, - 114,99,104,105,118,101,32,112,97,116,104,32,105,115,32,101, - 109,112,116,121,169,1,218,4,112,97,116,104,122,14,110,111, - 116,32,97,32,90,105,112,32,102,105,108,101,105,0,240,0, - 0,105,0,128,0,0,233,255,255,255,255,41,22,218,10,105, - 115,105,110,115,116,97,110,99,101,218,3,115,116,114,218,2, - 111,115,90,8,102,115,100,101,99,111,100,101,114,3,0,0, - 0,218,12,97,108,116,95,112,97,116,104,95,115,101,112,218, - 7,114,101,112,108,97,99,101,218,8,112,97,116,104,95,115, - 101,112,218,19,95,98,111,111,116,115,116,114,97,112,95,101, - 120,116,101,114,110,97,108,90,10,95,112,97,116,104,95,115, - 116,97,116,218,7,79,83,69,114,114,111,114,218,10,86,97, - 108,117,101,69,114,114,111,114,90,11,95,112,97,116,104,95, - 115,112,108,105,116,218,6,97,112,112,101,110,100,90,7,115, - 116,95,109,111,100,101,218,20,95,122,105,112,95,100,105,114, - 101,99,116,111,114,121,95,99,97,99,104,101,218,8,75,101, - 121,69,114,114,111,114,218,15,95,114,101,97,100,95,100,105, - 114,101,99,116,111,114,121,218,6,95,102,105,108,101,115,218, - 7,97,114,99,104,105,118,101,218,10,95,112,97,116,104,95, - 106,111,105,110,218,6,112,114,101,102,105,120,41,8,218,4, - 115,101,108,102,114,13,0,0,0,114,17,0,0,0,114,31, - 0,0,0,90,2,115,116,90,7,100,105,114,110,97,109,101, - 90,8,98,97,115,101,110,97,109,101,218,5,102,105,108,101, - 115,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,8,95,95,105,110,105,116,95,95,63,0,0,0,115,62, - 0,0,0,10,1,8,1,10,1,4,1,12,1,4,1,12, - 1,4,2,2,2,14,1,16,1,14,3,8,1,12,1,4, - 1,16,1,14,3,12,2,4,1,2,2,12,1,12,1,8, - 1,14,1,6,1,6,1,22,2,8,1,14,1,4,128,255, - 128,122,20,122,105,112,105,109,112,111,114,116,101,114,46,95, - 95,105,110,105,116,95,95,78,99,3,0,0,0,0,0,0, - 0,0,0,0,0,5,0,0,0,4,0,0,0,67,0,0, - 0,115,78,0,0,0,116,0,124,0,124,1,131,2,125,3, - 124,3,100,1,117,1,114,26,124,0,103,0,102,2,83,0, - 116,1,124,0,124,1,131,2,125,4,116,2,124,0,124,4, - 131,2,114,70,100,1,124,0,106,3,155,0,116,4,155,0, - 124,4,155,0,157,3,103,1,102,2,83,0,100,1,103,0, - 102,2,83,0,41,2,97,239,1,0,0,102,105,110,100,95, - 108,111,97,100,101,114,40,102,117,108,108,110,97,109,101,44, - 32,112,97,116,104,61,78,111,110,101,41,32,45,62,32,115, - 101,108,102,44,32,115,116,114,32,111,114,32,78,111,110,101, - 46,10,10,32,32,32,32,32,32,32,32,83,101,97,114,99, - 104,32,102,111,114,32,97,32,109,111,100,117,108,101,32,115, - 112,101,99,105,102,105,101,100,32,98,121,32,39,102,117,108, - 108,110,97,109,101,39,46,32,39,102,117,108,108,110,97,109, - 101,39,32,109,117,115,116,32,98,101,32,116,104,101,10,32, - 32,32,32,32,32,32,32,102,117,108,108,121,32,113,117,97, - 108,105,102,105,101,100,32,40,100,111,116,116,101,100,41,32, - 109,111,100,117,108,101,32,110,97,109,101,46,32,73,116,32, - 114,101,116,117,114,110,115,32,116,104,101,32,122,105,112,105, - 109,112,111,114,116,101,114,10,32,32,32,32,32,32,32,32, - 105,110,115,116,97,110,99,101,32,105,116,115,101,108,102,32, - 105,102,32,116,104,101,32,109,111,100,117,108,101,32,119,97, - 115,32,102,111,117,110,100,44,32,97,32,115,116,114,105,110, - 103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101, - 10,32,32,32,32,32,32,32,32,102,117,108,108,32,112,97, - 116,104,32,110,97,109,101,32,105,102,32,105,116,39,115,32, - 112,111,115,115,105,98,108,121,32,97,32,112,111,114,116,105, - 111,110,32,111,102,32,97,32,110,97,109,101,115,112,97,99, - 101,32,112,97,99,107,97,103,101,44,10,32,32,32,32,32, - 32,32,32,111,114,32,78,111,110,101,32,111,116,104,101,114, - 119,105,115,101,46,32,84,104,101,32,111,112,116,105,111,110, - 97,108,32,39,112,97,116,104,39,32,97,114,103,117,109,101, - 110,116,32,105,115,32,105,103,110,111,114,101,100,32,45,45, - 32,105,116,39,115,10,32,32,32,32,32,32,32,32,116,104, - 101,114,101,32,102,111,114,32,99,111,109,112,97,116,105,98, - 105,108,105,116,121,32,119,105,116,104,32,116,104,101,32,105, - 109,112,111,114,116,101,114,32,112,114,111,116,111,99,111,108, - 46,10,32,32,32,32,32,32,32,32,78,41,5,218,16,95, - 103,101,116,95,109,111,100,117,108,101,95,105,110,102,111,218, - 16,95,103,101,116,95,109,111,100,117,108,101,95,112,97,116, - 104,218,7,95,105,115,95,100,105,114,114,29,0,0,0,114, - 20,0,0,0,41,5,114,32,0,0,0,218,8,102,117,108, - 108,110,97,109,101,114,13,0,0,0,218,2,109,105,218,7, - 109,111,100,112,97,116,104,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,11,102,105,110,100,95,108,111,97, - 100,101,114,109,0,0,0,115,16,0,0,0,10,10,8,1, - 8,2,10,7,10,1,24,4,8,2,255,128,122,23,122,105, - 112,105,109,112,111,114,116,101,114,46,102,105,110,100,95,108, - 111,97,100,101,114,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,16, - 0,0,0,124,0,160,0,124,1,124,2,161,2,100,1,25, - 0,83,0,41,2,97,139,1,0,0,102,105,110,100,95,109, - 111,100,117,108,101,40,102,117,108,108,110,97,109,101,44,32, - 112,97,116,104,61,78,111,110,101,41,32,45,62,32,115,101, - 108,102,32,111,114,32,78,111,110,101,46,10,10,32,32,32, + 5,64,0,100,6,107,3,114,176,116,4,100,4,124,1,100, + 3,141,2,130,1,122,12,116,15,124,1,25,0,125,7,87, + 0,110,34,4,0,116,16,121,222,1,0,1,0,1,0,116, + 17,124,1,131,1,125,7,124,7,116,15,124,1,60,0,89, + 0,110,2,48,0,124,7,124,0,95,18,124,1,124,0,95, + 19,116,8,106,20,124,3,100,0,100,0,100,7,133,3,25, + 0,142,0,124,0,95,21,124,0,106,21,144,1,114,24,124, + 0,4,0,106,21,116,7,55,0,2,0,95,21,100,0,83, + 0,41,8,78,114,0,0,0,0,122,21,97,114,99,104,105, + 118,101,32,112,97,116,104,32,105,115,32,101,109,112,116,121, + 169,1,218,4,112,97,116,104,122,14,110,111,116,32,97,32, + 90,105,112,32,102,105,108,101,105,0,240,0,0,105,0,128, + 0,0,233,255,255,255,255,41,22,218,10,105,115,105,110,115, + 116,97,110,99,101,218,3,115,116,114,218,2,111,115,90,8, + 102,115,100,101,99,111,100,101,114,3,0,0,0,218,12,97, + 108,116,95,112,97,116,104,95,115,101,112,218,7,114,101,112, + 108,97,99,101,218,8,112,97,116,104,95,115,101,112,218,19, + 95,98,111,111,116,115,116,114,97,112,95,101,120,116,101,114, + 110,97,108,90,10,95,112,97,116,104,95,115,116,97,116,218, + 7,79,83,69,114,114,111,114,218,10,86,97,108,117,101,69, + 114,114,111,114,90,11,95,112,97,116,104,95,115,112,108,105, + 116,218,6,97,112,112,101,110,100,90,7,115,116,95,109,111, + 100,101,218,20,95,122,105,112,95,100,105,114,101,99,116,111, + 114,121,95,99,97,99,104,101,218,8,75,101,121,69,114,114, + 111,114,218,15,95,114,101,97,100,95,100,105,114,101,99,116, + 111,114,121,218,6,95,102,105,108,101,115,218,7,97,114,99, + 104,105,118,101,218,10,95,112,97,116,104,95,106,111,105,110, + 218,6,112,114,101,102,105,120,41,8,218,4,115,101,108,102, + 114,13,0,0,0,114,17,0,0,0,114,31,0,0,0,90, + 2,115,116,90,7,100,105,114,110,97,109,101,90,8,98,97, + 115,101,110,97,109,101,218,5,102,105,108,101,115,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,8,95,95, + 105,110,105,116,95,95,63,0,0,0,115,60,0,0,0,10, + 1,8,1,10,1,4,1,12,1,4,1,12,1,4,2,2, + 2,14,1,16,1,14,3,8,1,12,1,4,1,16,1,14, + 3,12,2,2,3,12,1,12,1,8,1,14,1,6,1,6, + 1,22,2,8,1,14,1,4,128,255,128,122,20,122,105,112, + 105,109,112,111,114,116,101,114,46,95,95,105,110,105,116,95, + 95,78,99,3,0,0,0,0,0,0,0,0,0,0,0,5, + 0,0,0,4,0,0,0,67,0,0,0,115,78,0,0,0, + 116,0,124,0,124,1,131,2,125,3,124,3,100,1,117,1, + 114,26,124,0,103,0,102,2,83,0,116,1,124,0,124,1, + 131,2,125,4,116,2,124,0,124,4,131,2,114,70,100,1, + 124,0,106,3,155,0,116,4,155,0,124,4,155,0,157,3, + 103,1,102,2,83,0,100,1,103,0,102,2,83,0,41,2, + 97,239,1,0,0,102,105,110,100,95,108,111,97,100,101,114, + 40,102,117,108,108,110,97,109,101,44,32,112,97,116,104,61, + 78,111,110,101,41,32,45,62,32,115,101,108,102,44,32,115, + 116,114,32,111,114,32,78,111,110,101,46,10,10,32,32,32, 32,32,32,32,32,83,101,97,114,99,104,32,102,111,114,32, 97,32,109,111,100,117,108,101,32,115,112,101,99,105,102,105, 101,100,32,98,121,32,39,102,117,108,108,110,97,109,101,39, @@ -233,370 +188,412 @@ const unsigned char _Py_M__zipimport[] = { 114,10,32,32,32,32,32,32,32,32,105,110,115,116,97,110, 99,101,32,105,116,115,101,108,102,32,105,102,32,116,104,101, 32,109,111,100,117,108,101,32,119,97,115,32,102,111,117,110, - 100,44,32,111,114,32,78,111,110,101,32,105,102,32,105,116, - 32,119,97,115,110,39,116,46,10,32,32,32,32,32,32,32, - 32,84,104,101,32,111,112,116,105,111,110,97,108,32,39,112, - 97,116,104,39,32,97,114,103,117,109,101,110,116,32,105,115, - 32,105,103,110,111,114,101,100,32,45,45,32,105,116,39,115, - 32,116,104,101,114,101,32,102,111,114,32,99,111,109,112,97, - 116,105,98,105,108,105,116,121,10,32,32,32,32,32,32,32, - 32,119,105,116,104,32,116,104,101,32,105,109,112,111,114,116, - 101,114,32,112,114,111,116,111,99,111,108,46,10,32,32,32, - 32,32,32,32,32,114,0,0,0,0,41,1,114,41,0,0, - 0,41,3,114,32,0,0,0,114,38,0,0,0,114,13,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,11,102,105,110,100,95,109,111,100,117,108,101,141,0, - 0,0,115,4,0,0,0,16,9,255,128,122,23,122,105,112, - 105,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,0,0,0, - 0,5,0,0,0,3,0,0,0,67,0,0,0,115,20,0, - 0,0,116,0,124,0,124,1,131,2,92,3,125,2,125,3, - 125,4,124,2,83,0,41,1,122,163,103,101,116,95,99,111, - 100,101,40,102,117,108,108,110,97,109,101,41,32,45,62,32, - 99,111,100,101,32,111,98,106,101,99,116,46,10,10,32,32, - 32,32,32,32,32,32,82,101,116,117,114,110,32,116,104,101, - 32,99,111,100,101,32,111,98,106,101,99,116,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,46,32,82,97,105,115,101,32,90,105,112, - 73,109,112,111,114,116,69,114,114,111,114,10,32,32,32,32, - 32,32,32,32,105,102,32,116,104,101,32,109,111,100,117,108, - 101,32,99,111,117,108,100,110,39,116,32,98,101,32,102,111, - 117,110,100,46,10,32,32,32,32,32,32,32,32,169,1,218, - 16,95,103,101,116,95,109,111,100,117,108,101,95,99,111,100, - 101,169,5,114,32,0,0,0,114,38,0,0,0,218,4,99, - 111,100,101,218,9,105,115,112,97,99,107,97,103,101,114,40, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,8,103,101,116,95,99,111,100,101,153,0,0,0, - 115,6,0,0,0,16,6,4,1,255,128,122,20,122,105,112, - 105,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,0,0,0,0,4,0, - 0,0,8,0,0,0,67,0,0,0,115,116,0,0,0,116, - 0,114,16,124,1,160,1,116,0,116,2,161,2,125,1,124, - 1,125,2,124,1,160,3,124,0,106,4,116,2,23,0,161, - 1,114,58,124,1,116,5,124,0,106,4,116,2,23,0,131, - 1,100,1,133,2,25,0,125,2,122,14,124,0,106,6,124, - 2,25,0,125,3,87,0,110,30,4,0,116,7,121,102,1, - 0,1,0,1,0,116,8,100,2,100,3,124,2,131,3,130, - 1,89,0,110,2,48,0,116,9,124,0,106,4,124,3,131, - 2,83,0,41,4,122,154,103,101,116,95,100,97,116,97,40, - 112,97,116,104,110,97,109,101,41,32,45,62,32,115,116,114, - 105,110,103,32,119,105,116,104,32,102,105,108,101,32,100,97, - 116,97,46,10,10,32,32,32,32,32,32,32,32,82,101,116, - 117,114,110,32,116,104,101,32,100,97,116,97,32,97,115,115, - 111,99,105,97,116,101,100,32,119,105,116,104,32,39,112,97, - 116,104,110,97,109,101,39,46,32,82,97,105,115,101,32,79, - 83,69,114,114,111,114,32,105,102,10,32,32,32,32,32,32, - 32,32,116,104,101,32,102,105,108,101,32,119,97,115,110,39, - 116,32,102,111,117,110,100,46,10,32,32,32,32,32,32,32, - 32,78,114,0,0,0,0,218,0,41,10,114,18,0,0,0, - 114,19,0,0,0,114,20,0,0,0,218,10,115,116,97,114, - 116,115,119,105,116,104,114,29,0,0,0,218,3,108,101,110, - 114,28,0,0,0,114,26,0,0,0,114,22,0,0,0,218, - 9,95,103,101,116,95,100,97,116,97,41,4,114,32,0,0, - 0,218,8,112,97,116,104,110,97,109,101,90,3,107,101,121, - 218,9,116,111,99,95,101,110,116,114,121,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,8,103,101,116,95, - 100,97,116,97,163,0,0,0,115,22,0,0,0,4,6,12, - 1,4,2,16,1,22,1,2,2,14,1,12,1,18,1,12, - 1,255,128,122,20,122,105,112,105,109,112,111,114,116,101,114, - 46,103,101,116,95,100,97,116,97,99,2,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,3,0,0,0,67,0, - 0,0,115,20,0,0,0,116,0,124,0,124,1,131,2,92, - 3,125,2,125,3,125,4,124,4,83,0,41,1,122,106,103, - 101,116,95,102,105,108,101,110,97,109,101,40,102,117,108,108, - 110,97,109,101,41,32,45,62,32,102,105,108,101,110,97,109, - 101,32,115,116,114,105,110,103,46,10,10,32,32,32,32,32, - 32,32,32,82,101,116,117,114,110,32,116,104,101,32,102,105, - 108,101,110,97,109,101,32,102,111,114,32,116,104,101,32,115, + 100,44,32,97,32,115,116,114,105,110,103,32,99,111,110,116, + 97,105,110,105,110,103,32,116,104,101,10,32,32,32,32,32, + 32,32,32,102,117,108,108,32,112,97,116,104,32,110,97,109, + 101,32,105,102,32,105,116,39,115,32,112,111,115,115,105,98, + 108,121,32,97,32,112,111,114,116,105,111,110,32,111,102,32, + 97,32,110,97,109,101,115,112,97,99,101,32,112,97,99,107, + 97,103,101,44,10,32,32,32,32,32,32,32,32,111,114,32, + 78,111,110,101,32,111,116,104,101,114,119,105,115,101,46,32, + 84,104,101,32,111,112,116,105,111,110,97,108,32,39,112,97, + 116,104,39,32,97,114,103,117,109,101,110,116,32,105,115,32, + 105,103,110,111,114,101,100,32,45,45,32,105,116,39,115,10, + 32,32,32,32,32,32,32,32,116,104,101,114,101,32,102,111, + 114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32, + 119,105,116,104,32,116,104,101,32,105,109,112,111,114,116,101, + 114,32,112,114,111,116,111,99,111,108,46,10,32,32,32,32, + 32,32,32,32,78,41,5,218,16,95,103,101,116,95,109,111, + 100,117,108,101,95,105,110,102,111,218,16,95,103,101,116,95, + 109,111,100,117,108,101,95,112,97,116,104,218,7,95,105,115, + 95,100,105,114,114,29,0,0,0,114,20,0,0,0,41,5, + 114,32,0,0,0,218,8,102,117,108,108,110,97,109,101,114, + 13,0,0,0,218,2,109,105,218,7,109,111,100,112,97,116, + 104,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,11,102,105,110,100,95,108,111,97,100,101,114,109,0,0, + 0,115,16,0,0,0,10,10,8,1,8,2,10,7,10,1, + 24,4,8,2,255,128,122,23,122,105,112,105,109,112,111,114, + 116,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99, + 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 4,0,0,0,67,0,0,0,115,16,0,0,0,124,0,160, + 0,124,1,124,2,161,2,100,1,25,0,83,0,41,2,97, + 139,1,0,0,102,105,110,100,95,109,111,100,117,108,101,40, + 102,117,108,108,110,97,109,101,44,32,112,97,116,104,61,78, + 111,110,101,41,32,45,62,32,115,101,108,102,32,111,114,32, + 78,111,110,101,46,10,10,32,32,32,32,32,32,32,32,83, + 101,97,114,99,104,32,102,111,114,32,97,32,109,111,100,117, + 108,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32, + 39,102,117,108,108,110,97,109,101,39,46,32,39,102,117,108, + 108,110,97,109,101,39,32,109,117,115,116,32,98,101,32,116, + 104,101,10,32,32,32,32,32,32,32,32,102,117,108,108,121, + 32,113,117,97,108,105,102,105,101,100,32,40,100,111,116,116, + 101,100,41,32,109,111,100,117,108,101,32,110,97,109,101,46, + 32,73,116,32,114,101,116,117,114,110,115,32,116,104,101,32, + 122,105,112,105,109,112,111,114,116,101,114,10,32,32,32,32, + 32,32,32,32,105,110,115,116,97,110,99,101,32,105,116,115, + 101,108,102,32,105,102,32,116,104,101,32,109,111,100,117,108, + 101,32,119,97,115,32,102,111,117,110,100,44,32,111,114,32, + 78,111,110,101,32,105,102,32,105,116,32,119,97,115,110,39, + 116,46,10,32,32,32,32,32,32,32,32,84,104,101,32,111, + 112,116,105,111,110,97,108,32,39,112,97,116,104,39,32,97, + 114,103,117,109,101,110,116,32,105,115,32,105,103,110,111,114, + 101,100,32,45,45,32,105,116,39,115,32,116,104,101,114,101, + 32,102,111,114,32,99,111,109,112,97,116,105,98,105,108,105, + 116,121,10,32,32,32,32,32,32,32,32,119,105,116,104,32, + 116,104,101,32,105,109,112,111,114,116,101,114,32,112,114,111, + 116,111,99,111,108,46,10,32,32,32,32,32,32,32,32,114, + 0,0,0,0,41,1,114,41,0,0,0,41,3,114,32,0, + 0,0,114,38,0,0,0,114,13,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,11,102,105,110, + 100,95,109,111,100,117,108,101,141,0,0,0,115,4,0,0, + 0,16,9,255,128,122,23,122,105,112,105,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,0,0,0,0,5,0,0,0,3, + 0,0,0,67,0,0,0,115,20,0,0,0,116,0,124,0, + 124,1,131,2,92,3,125,2,125,3,125,4,124,2,83,0, + 41,1,122,163,103,101,116,95,99,111,100,101,40,102,117,108, + 108,110,97,109,101,41,32,45,62,32,99,111,100,101,32,111, + 98,106,101,99,116,46,10,10,32,32,32,32,32,32,32,32, + 82,101,116,117,114,110,32,116,104,101,32,99,111,100,101,32, + 111,98,106,101,99,116,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,46, - 10,32,32,32,32,32,32,32,32,114,43,0,0,0,114,45, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,12,103,101,116,95,102,105,108,101,110,97,109,101, - 184,0,0,0,115,6,0,0,0,16,7,4,1,255,128,122, - 24,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, - 95,102,105,108,101,110,97,109,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,8,0,0,0,67,0, - 0,0,115,126,0,0,0,116,0,124,0,124,1,131,2,125, - 2,124,2,100,1,117,0,114,36,116,1,100,2,124,1,155, - 2,157,2,124,1,100,3,141,2,130,1,116,2,124,0,124, - 1,131,2,125,3,124,2,114,64,116,3,160,4,124,3,100, - 4,161,2,125,4,110,10,124,3,155,0,100,5,157,2,125, - 4,122,14,124,0,106,5,124,4,25,0,125,5,87,0,110, - 20,4,0,116,6,121,108,1,0,1,0,1,0,89,0,100, - 1,83,0,48,0,116,7,124,0,106,8,124,5,131,2,160, - 9,161,0,83,0,41,6,122,253,103,101,116,95,115,111,117, - 114,99,101,40,102,117,108,108,110,97,109,101,41,32,45,62, - 32,115,111,117,114,99,101,32,115,116,114,105,110,103,46,10, + 32,82,97,105,115,101,32,90,105,112,73,109,112,111,114,116, + 69,114,114,111,114,10,32,32,32,32,32,32,32,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,99,111,117,108, + 100,110,39,116,32,98,101,32,102,111,117,110,100,46,10,32, + 32,32,32,32,32,32,32,169,1,218,16,95,103,101,116,95, + 109,111,100,117,108,101,95,99,111,100,101,169,5,114,32,0, + 0,0,114,38,0,0,0,218,4,99,111,100,101,218,9,105, + 115,112,97,99,107,97,103,101,114,40,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,8,103,101, + 116,95,99,111,100,101,153,0,0,0,115,6,0,0,0,16, + 6,4,1,255,128,122,20,122,105,112,105,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,0,0,0,0,4,0,0,0,8,0,0,0, + 67,0,0,0,115,112,0,0,0,116,0,114,16,124,1,160, + 1,116,0,116,2,161,2,125,1,124,1,125,2,124,1,160, + 3,124,0,106,4,116,2,23,0,161,1,114,58,124,1,116, + 5,124,0,106,4,116,2,23,0,131,1,100,1,133,2,25, + 0,125,2,122,14,124,0,106,6,124,2,25,0,125,3,87, + 0,110,26,4,0,116,7,121,98,1,0,1,0,1,0,116, + 8,100,2,100,3,124,2,131,3,130,1,48,0,116,9,124, + 0,106,4,124,3,131,2,83,0,41,4,122,154,103,101,116, + 95,100,97,116,97,40,112,97,116,104,110,97,109,101,41,32, + 45,62,32,115,116,114,105,110,103,32,119,105,116,104,32,102, + 105,108,101,32,100,97,116,97,46,10,10,32,32,32,32,32, + 32,32,32,82,101,116,117,114,110,32,116,104,101,32,100,97, + 116,97,32,97,115,115,111,99,105,97,116,101,100,32,119,105, + 116,104,32,39,112,97,116,104,110,97,109,101,39,46,32,82, + 97,105,115,101,32,79,83,69,114,114,111,114,32,105,102,10, + 32,32,32,32,32,32,32,32,116,104,101,32,102,105,108,101, + 32,119,97,115,110,39,116,32,102,111,117,110,100,46,10,32, + 32,32,32,32,32,32,32,78,114,0,0,0,0,218,0,41, + 10,114,18,0,0,0,114,19,0,0,0,114,20,0,0,0, + 218,10,115,116,97,114,116,115,119,105,116,104,114,29,0,0, + 0,218,3,108,101,110,114,28,0,0,0,114,26,0,0,0, + 114,22,0,0,0,218,9,95,103,101,116,95,100,97,116,97, + 41,4,114,32,0,0,0,218,8,112,97,116,104,110,97,109, + 101,90,3,107,101,121,218,9,116,111,99,95,101,110,116,114, + 121,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,8,103,101,116,95,100,97,116,97,163,0,0,0,115,22, + 0,0,0,4,6,12,1,4,2,16,1,22,1,2,2,14, + 1,12,1,14,1,12,1,255,128,122,20,122,105,112,105,109, + 112,111,114,116,101,114,46,103,101,116,95,100,97,116,97,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 3,0,0,0,67,0,0,0,115,20,0,0,0,116,0,124, + 0,124,1,131,2,92,3,125,2,125,3,125,4,124,4,83, + 0,41,1,122,106,103,101,116,95,102,105,108,101,110,97,109, + 101,40,102,117,108,108,110,97,109,101,41,32,45,62,32,102, + 105,108,101,110,97,109,101,32,115,116,114,105,110,103,46,10, 10,32,32,32,32,32,32,32,32,82,101,116,117,114,110,32, - 116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32, - 90,105,112,73,109,112,111,114,116,69,114,114,111,114,10,32, - 32,32,32,32,32,32,32,105,102,32,116,104,101,32,109,111, - 100,117,108,101,32,99,111,117,108,100,110,39,116,32,98,101, - 32,102,111,117,110,100,44,32,114,101,116,117,114,110,32,78, - 111,110,101,32,105,102,32,116,104,101,32,97,114,99,104,105, - 118,101,32,100,111,101,115,10,32,32,32,32,32,32,32,32, - 99,111,110,116,97,105,110,32,116,104,101,32,109,111,100,117, - 108,101,44,32,98,117,116,32,104,97,115,32,110,111,32,115, - 111,117,114,99,101,32,102,111,114,32,105,116,46,10,32,32, - 32,32,32,32,32,32,78,250,18,99,97,110,39,116,32,102, - 105,110,100,32,109,111,100,117,108,101,32,169,1,218,4,110, - 97,109,101,250,11,95,95,105,110,105,116,95,95,46,112,121, - 250,3,46,112,121,41,10,114,35,0,0,0,114,3,0,0, - 0,114,36,0,0,0,114,21,0,0,0,114,30,0,0,0, - 114,28,0,0,0,114,26,0,0,0,114,52,0,0,0,114, - 29,0,0,0,218,6,100,101,99,111,100,101,41,6,114,32, - 0,0,0,114,38,0,0,0,114,39,0,0,0,114,13,0, - 0,0,218,8,102,117,108,108,112,97,116,104,114,54,0,0, - 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,10,103,101,116,95,115,111,117,114,99,101,195,0,0,0, - 115,26,0,0,0,10,7,8,1,18,1,10,2,4,1,14, - 1,10,2,2,2,14,1,12,1,8,2,16,1,255,128,122, - 22,122,105,112,105,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, - 0,0,0,0,3,0,0,0,4,0,0,0,67,0,0,0, - 115,40,0,0,0,116,0,124,0,124,1,131,2,125,2,124, - 2,100,1,117,0,114,36,116,1,100,2,124,1,155,2,157, - 2,124,1,100,3,141,2,130,1,124,2,83,0,41,4,122, - 171,105,115,95,112,97,99,107,97,103,101,40,102,117,108,108, - 110,97,109,101,41,32,45,62,32,98,111,111,108,46,10,10, - 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,84, - 114,117,101,32,105,102,32,116,104,101,32,109,111,100,117,108, - 101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,102, - 117,108,108,110,97,109,101,32,105,115,32,97,32,112,97,99, - 107,97,103,101,46,10,32,32,32,32,32,32,32,32,82,97, - 105,115,101,32,90,105,112,73,109,112,111,114,116,69,114,114, - 111,114,32,105,102,32,116,104,101,32,109,111,100,117,108,101, - 32,99,111,117,108,100,110,39,116,32,98,101,32,102,111,117, - 110,100,46,10,32,32,32,32,32,32,32,32,78,114,57,0, - 0,0,114,58,0,0,0,41,2,114,35,0,0,0,114,3, - 0,0,0,41,3,114,32,0,0,0,114,38,0,0,0,114, - 39,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,10,105,115,95,112,97,99,107,97,103,101,221, - 0,0,0,115,10,0,0,0,10,6,8,1,18,1,4,1, - 255,128,122,22,122,105,112,105,109,112,111,114,116,101,114,46, - 105,115,95,112,97,99,107,97,103,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,67, - 0,0,0,115,246,0,0,0,116,0,124,0,124,1,131,2, - 92,3,125,2,125,3,125,4,116,1,106,2,160,3,124,1, - 161,1,125,5,124,5,100,1,117,0,115,46,116,4,124,5, - 116,5,131,2,115,64,116,5,124,1,131,1,125,5,124,5, - 116,1,106,2,124,1,60,0,124,0,124,5,95,6,122,84, - 124,3,114,108,116,7,124,0,124,1,131,2,125,6,116,8, - 160,9,124,0,106,10,124,6,161,2,125,7,124,7,103,1, - 124,5,95,11,116,12,124,5,100,2,131,2,115,124,116,13, - 124,5,95,13,116,8,160,14,124,5,106,15,124,1,124,4, - 161,3,1,0,116,16,124,2,124,5,106,15,131,2,1,0, - 87,0,110,22,1,0,1,0,1,0,116,1,106,2,124,1, - 61,0,130,0,89,0,110,2,48,0,122,14,116,1,106,2, - 124,1,25,0,125,5,87,0,110,34,4,0,116,17,121,226, + 116,104,101,32,102,105,108,101,110,97,109,101,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,46,10,32,32,32,32,32,32,32,32,114, + 43,0,0,0,114,45,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,12,103,101,116,95,102,105, + 108,101,110,97,109,101,184,0,0,0,115,6,0,0,0,16, + 7,4,1,255,128,122,24,122,105,112,105,109,112,111,114,116, + 101,114,46,103,101,116,95,102,105,108,101,110,97,109,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, + 8,0,0,0,67,0,0,0,115,126,0,0,0,116,0,124, + 0,124,1,131,2,125,2,124,2,100,1,117,0,114,36,116, + 1,100,2,124,1,155,2,157,2,124,1,100,3,141,2,130, + 1,116,2,124,0,124,1,131,2,125,3,124,2,114,64,116, + 3,160,4,124,3,100,4,161,2,125,4,110,10,124,3,155, + 0,100,5,157,2,125,4,122,14,124,0,106,5,124,4,25, + 0,125,5,87,0,110,20,4,0,116,6,121,108,1,0,1, + 0,1,0,89,0,100,1,83,0,48,0,116,7,124,0,106, + 8,124,5,131,2,160,9,161,0,83,0,41,6,122,253,103, + 101,116,95,115,111,117,114,99,101,40,102,117,108,108,110,97, + 109,101,41,32,45,62,32,115,111,117,114,99,101,32,115,116, + 114,105,110,103,46,10,10,32,32,32,32,32,32,32,32,82, + 101,116,117,114,110,32,116,104,101,32,115,111,117,114,99,101, + 32,99,111,100,101,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,46,32, + 82,97,105,115,101,32,90,105,112,73,109,112,111,114,116,69, + 114,114,111,114,10,32,32,32,32,32,32,32,32,105,102,32, + 116,104,101,32,109,111,100,117,108,101,32,99,111,117,108,100, + 110,39,116,32,98,101,32,102,111,117,110,100,44,32,114,101, + 116,117,114,110,32,78,111,110,101,32,105,102,32,116,104,101, + 32,97,114,99,104,105,118,101,32,100,111,101,115,10,32,32, + 32,32,32,32,32,32,99,111,110,116,97,105,110,32,116,104, + 101,32,109,111,100,117,108,101,44,32,98,117,116,32,104,97, + 115,32,110,111,32,115,111,117,114,99,101,32,102,111,114,32, + 105,116,46,10,32,32,32,32,32,32,32,32,78,250,18,99, + 97,110,39,116,32,102,105,110,100,32,109,111,100,117,108,101, + 32,169,1,218,4,110,97,109,101,250,11,95,95,105,110,105, + 116,95,95,46,112,121,250,3,46,112,121,41,10,114,35,0, + 0,0,114,3,0,0,0,114,36,0,0,0,114,21,0,0, + 0,114,30,0,0,0,114,28,0,0,0,114,26,0,0,0, + 114,52,0,0,0,114,29,0,0,0,218,6,100,101,99,111, + 100,101,41,6,114,32,0,0,0,114,38,0,0,0,114,39, + 0,0,0,114,13,0,0,0,218,8,102,117,108,108,112,97, + 116,104,114,54,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,10,103,101,116,95,115,111,117,114, + 99,101,195,0,0,0,115,26,0,0,0,10,7,8,1,18, + 1,10,2,4,1,14,1,10,2,2,2,14,1,12,1,8, + 2,16,1,255,128,122,22,122,105,112,105,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,0,0,0,0,3,0,0,0,4,0, + 0,0,67,0,0,0,115,40,0,0,0,116,0,124,0,124, + 1,131,2,125,2,124,2,100,1,117,0,114,36,116,1,100, + 2,124,1,155,2,157,2,124,1,100,3,141,2,130,1,124, + 2,83,0,41,4,122,171,105,115,95,112,97,99,107,97,103, + 101,40,102,117,108,108,110,97,109,101,41,32,45,62,32,98, + 111,111,108,46,10,10,32,32,32,32,32,32,32,32,82,101, + 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101, + 32,109,111,100,117,108,101,32,115,112,101,99,105,102,105,101, + 100,32,98,121,32,102,117,108,108,110,97,109,101,32,105,115, + 32,97,32,112,97,99,107,97,103,101,46,10,32,32,32,32, + 32,32,32,32,82,97,105,115,101,32,90,105,112,73,109,112, + 111,114,116,69,114,114,111,114,32,105,102,32,116,104,101,32, + 109,111,100,117,108,101,32,99,111,117,108,100,110,39,116,32, + 98,101,32,102,111,117,110,100,46,10,32,32,32,32,32,32, + 32,32,78,114,57,0,0,0,114,58,0,0,0,41,2,114, + 35,0,0,0,114,3,0,0,0,41,3,114,32,0,0,0, + 114,38,0,0,0,114,39,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,10,105,115,95,112,97, + 99,107,97,103,101,221,0,0,0,115,10,0,0,0,10,6, + 8,1,18,1,4,1,255,128,122,22,122,105,112,105,109,112, + 111,114,116,101,114,46,105,115,95,112,97,99,107,97,103,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,8,0,0, + 0,8,0,0,0,67,0,0,0,115,236,0,0,0,116,0, + 124,0,124,1,131,2,92,3,125,2,125,3,125,4,116,1, + 106,2,160,3,124,1,161,1,125,5,124,5,100,1,117,0, + 115,46,116,4,124,5,116,5,131,2,115,64,116,5,124,1, + 131,1,125,5,124,5,116,1,106,2,124,1,60,0,124,0, + 124,5,95,6,122,84,124,3,114,108,116,7,124,0,124,1, + 131,2,125,6,116,8,160,9,124,0,106,10,124,6,161,2, + 125,7,124,7,103,1,124,5,95,11,116,12,124,5,100,2, + 131,2,115,124,116,13,124,5,95,13,116,8,160,14,124,5, + 106,15,124,1,124,4,161,3,1,0,116,16,124,2,124,5, + 106,15,131,2,1,0,87,0,110,16,1,0,1,0,1,0, + 116,1,106,2,124,1,61,0,130,0,122,14,116,1,106,2, + 124,1,25,0,125,5,87,0,110,30,4,0,116,17,121,216, 1,0,1,0,1,0,116,18,100,3,124,1,155,2,100,4, - 157,3,131,1,130,1,89,0,110,2,48,0,116,19,160,20, - 100,5,124,1,124,4,161,3,1,0,124,5,83,0,41,6, - 122,245,108,111,97,100,95,109,111,100,117,108,101,40,102,117, - 108,108,110,97,109,101,41,32,45,62,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,76,111,97,100, - 32,116,104,101,32,109,111,100,117,108,101,32,115,112,101,99, - 105,102,105,101,100,32,98,121,32,39,102,117,108,108,110,97, - 109,101,39,46,32,39,102,117,108,108,110,97,109,101,39,32, - 109,117,115,116,32,98,101,32,116,104,101,10,32,32,32,32, - 32,32,32,32,102,117,108,108,121,32,113,117,97,108,105,102, - 105,101,100,32,40,100,111,116,116,101,100,41,32,109,111,100, - 117,108,101,32,110,97,109,101,46,32,73,116,32,114,101,116, - 117,114,110,115,32,116,104,101,32,105,109,112,111,114,116,101, - 100,10,32,32,32,32,32,32,32,32,109,111,100,117,108,101, - 44,32,111,114,32,114,97,105,115,101,115,32,90,105,112,73, - 109,112,111,114,116,69,114,114,111,114,32,105,102,32,105,116, - 32,119,97,115,110,39,116,32,102,111,117,110,100,46,10,32, - 32,32,32,32,32,32,32,78,218,12,95,95,98,117,105,108, - 116,105,110,115,95,95,122,14,76,111,97,100,101,100,32,109, - 111,100,117,108,101,32,122,25,32,110,111,116,32,102,111,117, - 110,100,32,105,110,32,115,121,115,46,109,111,100,117,108,101, - 115,122,30,105,109,112,111,114,116,32,123,125,32,35,32,108, - 111,97,100,101,100,32,102,114,111,109,32,90,105,112,32,123, - 125,41,21,114,44,0,0,0,218,3,115,121,115,218,7,109, - 111,100,117,108,101,115,218,3,103,101,116,114,15,0,0,0, - 218,12,95,109,111,100,117,108,101,95,116,121,112,101,218,10, - 95,95,108,111,97,100,101,114,95,95,114,36,0,0,0,114, - 21,0,0,0,114,30,0,0,0,114,29,0,0,0,90,8, - 95,95,112,97,116,104,95,95,218,7,104,97,115,97,116,116, - 114,114,66,0,0,0,90,14,95,102,105,120,95,117,112,95, - 109,111,100,117,108,101,218,8,95,95,100,105,99,116,95,95, - 218,4,101,120,101,99,114,26,0,0,0,218,11,73,109,112, - 111,114,116,69,114,114,111,114,218,10,95,98,111,111,116,115, - 116,114,97,112,218,16,95,118,101,114,98,111,115,101,95,109, - 101,115,115,97,103,101,41,8,114,32,0,0,0,114,38,0, - 0,0,114,46,0,0,0,114,47,0,0,0,114,40,0,0, - 0,90,3,109,111,100,114,13,0,0,0,114,63,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 11,108,111,97,100,95,109,111,100,117,108,101,234,0,0,0, - 115,50,0,0,0,16,7,12,1,18,1,8,1,10,1,6, - 1,2,2,4,1,10,3,14,1,8,1,10,2,6,1,16, - 1,16,1,6,1,8,1,8,1,2,2,14,1,12,1,22, - 1,14,1,4,1,255,128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,64,0,0,0,122,20, - 124,0,160,0,124,1,161,1,115,18,87,0,100,1,83,0, - 87,0,110,20,4,0,116,1,121,40,1,0,1,0,1,0, - 89,0,100,1,83,0,48,0,100,2,100,3,108,2,109,3, - 125,2,1,0,124,2,124,0,124,1,131,2,83,0,41,4, - 122,204,82,101,116,117,114,110,32,116,104,101,32,82,101,115, - 111,117,114,99,101,82,101,97,100,101,114,32,102,111,114,32, - 97,32,112,97,99,107,97,103,101,32,105,110,32,97,32,122, - 105,112,32,102,105,108,101,46,10,10,32,32,32,32,32,32, - 32,32,73,102,32,39,102,117,108,108,110,97,109,101,39,32, - 105,115,32,97,32,112,97,99,107,97,103,101,32,119,105,116, - 104,105,110,32,116,104,101,32,122,105,112,32,102,105,108,101, - 44,32,114,101,116,117,114,110,32,116,104,101,10,32,32,32, - 32,32,32,32,32,39,82,101,115,111,117,114,99,101,82,101, - 97,100,101,114,39,32,111,98,106,101,99,116,32,102,111,114, - 32,116,104,101,32,112,97,99,107,97,103,101,46,32,32,79, - 116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,32, - 78,111,110,101,46,10,32,32,32,32,32,32,32,32,78,114, - 0,0,0,0,41,1,218,9,90,105,112,82,101,97,100,101, - 114,41,4,114,65,0,0,0,114,3,0,0,0,90,17,105, - 109,112,111,114,116,108,105,98,46,114,101,97,100,101,114,115, - 114,79,0,0,0,41,3,114,32,0,0,0,114,38,0,0, - 0,114,79,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,19,103,101,116,95,114,101,115,111,117, - 114,99,101,95,114,101,97,100,101,114,16,1,0,0,115,16, - 0,0,0,2,6,10,1,10,1,12,1,8,1,12,1,10, - 1,255,128,122,31,122,105,112,105,109,112,111,114,116,101,114, - 46,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, - 97,100,101,114,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,5,0,0,0,67,0,0,0,115,24,0, - 0,0,100,1,124,0,106,0,155,0,116,1,155,0,124,0, - 106,2,155,0,100,2,157,5,83,0,41,3,78,122,21,60, - 122,105,112,105,109,112,111,114,116,101,114,32,111,98,106,101, - 99,116,32,34,122,2,34,62,41,3,114,29,0,0,0,114, - 20,0,0,0,114,31,0,0,0,41,1,114,32,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 8,95,95,114,101,112,114,95,95,31,1,0,0,115,4,0, - 0,0,24,1,255,128,122,20,122,105,112,105,109,112,111,114, - 116,101,114,46,95,95,114,101,112,114,95,95,41,1,78,41, - 1,78,41,15,114,6,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,7,95,95,100,111,99,95,95,114,34,0,0, - 0,114,41,0,0,0,114,42,0,0,0,114,48,0,0,0, - 114,55,0,0,0,114,56,0,0,0,114,64,0,0,0,114, - 65,0,0,0,114,78,0,0,0,114,80,0,0,0,114,81, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,114,4,0,0,0,45,0,0,0, - 115,28,0,0,0,8,0,4,1,8,17,10,46,10,32,8, - 12,8,10,8,21,8,11,8,26,8,13,8,38,12,15,255, - 128,122,12,95,95,105,110,105,116,95,95,46,112,121,99,84, - 114,60,0,0,0,70,41,3,122,4,46,112,121,99,84,70, - 41,3,114,61,0,0,0,70,70,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0, - 0,0,115,20,0,0,0,124,0,106,0,124,1,160,1,100, - 1,161,1,100,2,25,0,23,0,83,0,41,3,78,218,1, - 46,233,2,0,0,0,41,2,114,31,0,0,0,218,10,114, - 112,97,114,116,105,116,105,111,110,41,2,114,32,0,0,0, - 114,38,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,36,0,0,0,49,1,0,0,115,4,0, - 0,0,20,1,255,128,114,36,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0, - 67,0,0,0,115,18,0,0,0,124,1,116,0,23,0,125, - 2,124,2,124,0,106,1,118,0,83,0,169,1,78,41,2, - 114,20,0,0,0,114,28,0,0,0,41,3,114,32,0,0, - 0,114,13,0,0,0,90,7,100,105,114,112,97,116,104,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,37, - 0,0,0,53,1,0,0,115,6,0,0,0,8,4,10,2, - 255,128,114,37,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,7,0,0,0,4,0,0,0,67,0,0,0, - 115,54,0,0,0,116,0,124,0,124,1,131,2,125,2,116, - 1,68,0,93,34,92,3,125,3,125,4,125,5,124,2,124, - 3,23,0,125,6,124,6,124,0,106,2,118,0,114,14,124, - 5,2,0,1,0,83,0,100,0,83,0,114,86,0,0,0, - 41,3,114,36,0,0,0,218,16,95,122,105,112,95,115,101, - 97,114,99,104,111,114,100,101,114,114,28,0,0,0,41,7, - 114,32,0,0,0,114,38,0,0,0,114,13,0,0,0,218, - 6,115,117,102,102,105,120,218,10,105,115,98,121,116,101,99, - 111,100,101,114,47,0,0,0,114,63,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,114,35,0,0, - 0,62,1,0,0,115,14,0,0,0,10,1,14,1,8,1, - 10,1,8,1,4,1,255,128,114,35,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,26,0,0,0,9,0, - 0,0,67,0,0,0,115,2,5,0,0,122,14,116,0,160, - 1,124,0,161,1,125,1,87,0,110,36,4,0,116,2,121, - 50,1,0,1,0,1,0,116,3,100,1,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,89,0,110,2,48,0,124, - 1,144,4,143,164,1,0,122,36,124,1,160,4,116,5,11, - 0,100,3,161,2,1,0,124,1,160,6,161,0,125,2,124, - 1,160,7,116,5,161,1,125,3,87,0,110,36,4,0,116, - 2,121,132,1,0,1,0,1,0,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,89,0,110,2,48, - 0,116,8,124,3,131,1,116,5,107,3,114,164,116,3,100, - 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124, - 3,100,0,100,5,133,2,25,0,116,9,107,3,144,1,114, - 170,122,24,124,1,160,4,100,6,100,3,161,2,1,0,124, - 1,160,6,161,0,125,4,87,0,110,36,4,0,116,2,121, - 242,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,89,0,110,2,48,0,116, + 157,3,131,1,130,1,48,0,116,19,160,20,100,5,124,1, + 124,4,161,3,1,0,124,5,83,0,41,6,122,245,108,111, + 97,100,95,109,111,100,117,108,101,40,102,117,108,108,110,97, + 109,101,41,32,45,62,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,76,111,97,100,32,116,104,101, + 32,109,111,100,117,108,101,32,115,112,101,99,105,102,105,101, + 100,32,98,121,32,39,102,117,108,108,110,97,109,101,39,46, + 32,39,102,117,108,108,110,97,109,101,39,32,109,117,115,116, + 32,98,101,32,116,104,101,10,32,32,32,32,32,32,32,32, + 102,117,108,108,121,32,113,117,97,108,105,102,105,101,100,32, + 40,100,111,116,116,101,100,41,32,109,111,100,117,108,101,32, + 110,97,109,101,46,32,73,116,32,114,101,116,117,114,110,115, + 32,116,104,101,32,105,109,112,111,114,116,101,100,10,32,32, + 32,32,32,32,32,32,109,111,100,117,108,101,44,32,111,114, + 32,114,97,105,115,101,115,32,90,105,112,73,109,112,111,114, + 116,69,114,114,111,114,32,105,102,32,105,116,32,119,97,115, + 110,39,116,32,102,111,117,110,100,46,10,32,32,32,32,32, + 32,32,32,78,218,12,95,95,98,117,105,108,116,105,110,115, + 95,95,122,14,76,111,97,100,101,100,32,109,111,100,117,108, + 101,32,122,25,32,110,111,116,32,102,111,117,110,100,32,105, + 110,32,115,121,115,46,109,111,100,117,108,101,115,122,30,105, + 109,112,111,114,116,32,123,125,32,35,32,108,111,97,100,101, + 100,32,102,114,111,109,32,90,105,112,32,123,125,41,21,114, + 44,0,0,0,218,3,115,121,115,218,7,109,111,100,117,108, + 101,115,218,3,103,101,116,114,15,0,0,0,218,12,95,109, + 111,100,117,108,101,95,116,121,112,101,218,10,95,95,108,111, + 97,100,101,114,95,95,114,36,0,0,0,114,21,0,0,0, + 114,30,0,0,0,114,29,0,0,0,90,8,95,95,112,97, + 116,104,95,95,218,7,104,97,115,97,116,116,114,114,66,0, + 0,0,90,14,95,102,105,120,95,117,112,95,109,111,100,117, + 108,101,218,8,95,95,100,105,99,116,95,95,218,4,101,120, + 101,99,114,26,0,0,0,218,11,73,109,112,111,114,116,69, + 114,114,111,114,218,10,95,98,111,111,116,115,116,114,97,112, + 218,16,95,118,101,114,98,111,115,101,95,109,101,115,115,97, + 103,101,41,8,114,32,0,0,0,114,38,0,0,0,114,46, + 0,0,0,114,47,0,0,0,114,40,0,0,0,90,3,109, + 111,100,114,13,0,0,0,114,63,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,11,108,111,97, + 100,95,109,111,100,117,108,101,234,0,0,0,115,50,0,0, + 0,16,7,12,1,18,1,8,1,10,1,6,1,2,2,4, + 1,10,3,14,1,8,1,10,2,6,1,16,1,16,1,6, + 1,8,1,2,1,2,2,14,1,12,1,18,1,14,1,4, + 1,255,128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0,0,8,0,0, + 0,67,0,0,0,115,64,0,0,0,122,20,124,0,160,0, + 124,1,161,1,115,18,87,0,100,1,83,0,87,0,110,20, + 4,0,116,1,121,40,1,0,1,0,1,0,89,0,100,1, + 83,0,48,0,100,2,100,3,108,2,109,3,125,2,1,0, + 124,2,124,0,124,1,131,2,83,0,41,4,122,204,82,101, + 116,117,114,110,32,116,104,101,32,82,101,115,111,117,114,99, + 101,82,101,97,100,101,114,32,102,111,114,32,97,32,112,97, + 99,107,97,103,101,32,105,110,32,97,32,122,105,112,32,102, + 105,108,101,46,10,10,32,32,32,32,32,32,32,32,73,102, + 32,39,102,117,108,108,110,97,109,101,39,32,105,115,32,97, + 32,112,97,99,107,97,103,101,32,119,105,116,104,105,110,32, + 116,104,101,32,122,105,112,32,102,105,108,101,44,32,114,101, + 116,117,114,110,32,116,104,101,10,32,32,32,32,32,32,32, + 32,39,82,101,115,111,117,114,99,101,82,101,97,100,101,114, + 39,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101, + 32,112,97,99,107,97,103,101,46,32,32,79,116,104,101,114, + 119,105,115,101,32,114,101,116,117,114,110,32,78,111,110,101, + 46,10,32,32,32,32,32,32,32,32,78,114,0,0,0,0, + 41,1,218,9,90,105,112,82,101,97,100,101,114,41,4,114, + 65,0,0,0,114,3,0,0,0,90,17,105,109,112,111,114, + 116,108,105,98,46,114,101,97,100,101,114,115,114,79,0,0, + 0,41,3,114,32,0,0,0,114,38,0,0,0,114,79,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95, + 114,101,97,100,101,114,16,1,0,0,115,16,0,0,0,2, + 6,10,1,10,1,12,1,8,1,12,1,10,1,255,128,122, + 31,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, + 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,5,0,0,0,67,0,0,0,115,24,0,0,0,100,1, + 124,0,106,0,155,0,116,1,155,0,124,0,106,2,155,0, + 100,2,157,5,83,0,41,3,78,122,21,60,122,105,112,105, + 109,112,111,114,116,101,114,32,111,98,106,101,99,116,32,34, + 122,2,34,62,41,3,114,29,0,0,0,114,20,0,0,0, + 114,31,0,0,0,41,1,114,32,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,8,95,95,114, + 101,112,114,95,95,31,1,0,0,115,4,0,0,0,24,1, + 255,128,122,20,122,105,112,105,109,112,111,114,116,101,114,46, + 95,95,114,101,112,114,95,95,41,1,78,41,1,78,41,15, + 114,6,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 7,95,95,100,111,99,95,95,114,34,0,0,0,114,41,0, + 0,0,114,42,0,0,0,114,48,0,0,0,114,55,0,0, + 0,114,56,0,0,0,114,64,0,0,0,114,65,0,0,0, + 114,78,0,0,0,114,80,0,0,0,114,81,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,114,4,0,0,0,45,0,0,0,115,28,0,0, + 0,8,0,4,1,8,17,10,46,10,32,8,12,8,10,8, + 21,8,11,8,26,8,13,8,38,12,15,255,128,122,12,95, + 95,105,110,105,116,95,95,46,112,121,99,84,114,60,0,0, + 0,70,41,3,122,4,46,112,121,99,84,70,41,3,114,61, + 0,0,0,70,70,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,67,0,0,0,115,20, + 0,0,0,124,0,106,0,124,1,160,1,100,1,161,1,100, + 2,25,0,23,0,83,0,41,3,78,218,1,46,233,2,0, + 0,0,41,2,114,31,0,0,0,218,10,114,112,97,114,116, + 105,116,105,111,110,41,2,114,32,0,0,0,114,38,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,36,0,0,0,49,1,0,0,115,4,0,0,0,20,1, + 255,128,114,36,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,2,0,0,0,67,0,0,0, + 115,18,0,0,0,124,1,116,0,23,0,125,2,124,2,124, + 0,106,1,118,0,83,0,169,1,78,41,2,114,20,0,0, + 0,114,28,0,0,0,41,3,114,32,0,0,0,114,13,0, + 0,0,90,7,100,105,114,112,97,116,104,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,37,0,0,0,53, + 1,0,0,115,6,0,0,0,8,4,10,2,255,128,114,37, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 7,0,0,0,4,0,0,0,67,0,0,0,115,54,0,0, + 0,116,0,124,0,124,1,131,2,125,2,116,1,68,0,93, + 34,92,3,125,3,125,4,125,5,124,2,124,3,23,0,125, + 6,124,6,124,0,106,2,118,0,114,14,124,5,2,0,1, + 0,83,0,100,0,83,0,114,86,0,0,0,41,3,114,36, + 0,0,0,218,16,95,122,105,112,95,115,101,97,114,99,104, + 111,114,100,101,114,114,28,0,0,0,41,7,114,32,0,0, + 0,114,38,0,0,0,114,13,0,0,0,218,6,115,117,102, + 102,105,120,218,10,105,115,98,121,116,101,99,111,100,101,114, + 47,0,0,0,114,63,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,35,0,0,0,62,1,0, + 0,115,14,0,0,0,10,1,14,1,8,1,10,1,8,1, + 4,1,255,128,114,35,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,26,0,0,0,9,0,0,0,67,0, + 0,0,115,230,4,0,0,122,14,116,0,160,1,124,0,161, + 1,125,1,87,0,110,32,4,0,116,2,121,46,1,0,1, + 0,1,0,116,3,100,1,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,48,0,124,1,144,4,143,140,1,0,122, + 36,124,1,160,4,116,5,11,0,100,3,161,2,1,0,124, + 1,160,6,161,0,125,2,124,1,160,7,116,5,161,1,125, + 3,87,0,110,32,4,0,116,2,121,124,1,0,1,0,1, + 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, + 2,130,1,48,0,116,8,124,3,131,1,116,5,107,3,114, + 156,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, + 2,130,1,124,3,100,0,100,5,133,2,25,0,116,9,107, + 3,144,1,114,154,122,24,124,1,160,4,100,6,100,3,161, + 2,1,0,124,1,160,6,161,0,125,4,87,0,110,32,4, + 0,116,2,121,230,1,0,1,0,1,0,116,3,100,4,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,48,0,116, 10,124,4,116,11,24,0,116,5,24,0,100,6,131,2,125, 5,122,22,124,1,160,4,124,5,161,1,1,0,124,1,160, - 7,161,0,125,6,87,0,110,38,4,0,116,2,144,1,121, - 66,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,89,0,110,2,48,0,124, - 6,160,12,116,9,161,1,125,7,124,7,100,6,107,0,144, - 1,114,106,116,3,100,7,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,124,6,124,7,124,7,116,5,23,0,133, - 2,25,0,125,3,116,8,124,3,131,1,116,5,107,3,144, - 1,114,154,116,3,100,8,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,124,4,116,8,124,6,131,1,24,0,124, - 7,23,0,125,2,116,13,124,3,100,9,100,10,133,2,25, - 0,131,1,125,8,116,13,124,3,100,10,100,11,133,2,25, - 0,131,1,125,9,124,2,124,8,107,0,144,1,114,230,116, - 3,100,12,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,124,2,124,9,107,0,144,2,114,2,116,3,100,13,124, + 7,161,0,125,6,87,0,110,34,4,0,116,2,144,1,121, + 50,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,48,0,124,6,160,12,116, + 9,161,1,125,7,124,7,100,6,107,0,144,1,114,90,116, + 3,100,7,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,124,6,124,7,124,7,116,5,23,0,133,2,25,0,125, + 3,116,8,124,3,131,1,116,5,107,3,144,1,114,138,116, + 3,100,8,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,124,4,116,8,124,6,131,1,24,0,124,7,23,0,125, + 2,116,13,124,3,100,9,100,10,133,2,25,0,131,1,125, + 8,116,13,124,3,100,10,100,11,133,2,25,0,131,1,125, + 9,124,2,124,8,107,0,144,1,114,214,116,3,100,12,124, 0,155,2,157,2,124,0,100,2,141,2,130,1,124,2,124, - 8,56,0,125,2,124,2,124,9,24,0,125,10,124,10,100, - 6,107,0,144,2,114,46,116,3,100,14,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,105,0,125,11,100,6,125, - 12,122,14,124,1,160,4,124,2,161,1,1,0,87,0,110, - 38,4,0,116,2,144,2,121,106,1,0,1,0,1,0,116, + 9,107,0,144,1,114,242,116,3,100,13,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,124,2,124,8,56,0,125, + 2,124,2,124,9,24,0,125,10,124,10,100,6,107,0,144, + 2,114,30,116,3,100,14,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,105,0,125,11,100,6,125,12,122,14,124, + 1,160,4,124,2,161,1,1,0,87,0,110,34,4,0,116, + 2,144,2,121,86,1,0,1,0,1,0,116,3,100,4,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,48,0,124, + 1,160,7,100,15,161,1,125,3,116,8,124,3,131,1,100, + 5,107,0,144,2,114,120,116,14,100,16,131,1,130,1,124, + 3,100,0,100,5,133,2,25,0,100,17,107,3,144,2,114, + 142,144,4,113,180,116,8,124,3,131,1,100,15,107,3,144, + 2,114,164,116,14,100,16,131,1,130,1,116,15,124,3,100, + 18,100,19,133,2,25,0,131,1,125,13,116,15,124,3,100, + 19,100,9,133,2,25,0,131,1,125,14,116,15,124,3,100, + 9,100,20,133,2,25,0,131,1,125,15,116,15,124,3,100, + 20,100,10,133,2,25,0,131,1,125,16,116,13,124,3,100, + 10,100,11,133,2,25,0,131,1,125,17,116,13,124,3,100, + 11,100,21,133,2,25,0,131,1,125,18,116,13,124,3,100, + 21,100,22,133,2,25,0,131,1,125,4,116,15,124,3,100, + 22,100,23,133,2,25,0,131,1,125,19,116,15,124,3,100, + 23,100,24,133,2,25,0,131,1,125,20,116,15,124,3,100, + 24,100,25,133,2,25,0,131,1,125,21,116,13,124,3,100, + 26,100,15,133,2,25,0,131,1,125,22,124,19,124,20,23, + 0,124,21,23,0,125,8,124,22,124,9,107,4,144,3,114, + 124,116,3,100,27,124,0,155,2,157,2,124,0,100,2,141, + 2,130,1,124,22,124,10,55,0,125,22,122,14,124,1,160, + 7,124,19,161,1,125,23,87,0,110,34,4,0,116,2,144, + 3,121,180,1,0,1,0,1,0,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,48,0,116,8,124, + 23,131,1,124,19,107,3,144,3,114,214,116,3,100,4,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,122,50,116, + 8,124,1,160,7,124,8,124,19,24,0,161,1,131,1,124, + 8,124,19,24,0,107,3,144,4,114,6,116,3,100,4,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,87,0,110, + 34,4,0,116,2,144,4,121,42,1,0,1,0,1,0,116, 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,89,0,110,2,48,0,124,1,160,7,100,15,161,1,125, - 3,116,8,124,3,131,1,100,5,107,0,144,2,114,140,116, - 14,100,16,131,1,130,1,124,3,100,0,100,5,133,2,25, - 0,100,17,107,3,144,2,114,162,144,4,113,208,116,8,124, - 3,131,1,100,15,107,3,144,2,114,184,116,14,100,16,131, - 1,130,1,116,15,124,3,100,18,100,19,133,2,25,0,131, - 1,125,13,116,15,124,3,100,19,100,9,133,2,25,0,131, - 1,125,14,116,15,124,3,100,9,100,20,133,2,25,0,131, - 1,125,15,116,15,124,3,100,20,100,10,133,2,25,0,131, - 1,125,16,116,13,124,3,100,10,100,11,133,2,25,0,131, - 1,125,17,116,13,124,3,100,11,100,21,133,2,25,0,131, - 1,125,18,116,13,124,3,100,21,100,22,133,2,25,0,131, - 1,125,4,116,15,124,3,100,22,100,23,133,2,25,0,131, - 1,125,19,116,15,124,3,100,23,100,24,133,2,25,0,131, - 1,125,20,116,15,124,3,100,24,100,25,133,2,25,0,131, - 1,125,21,116,13,124,3,100,26,100,15,133,2,25,0,131, - 1,125,22,124,19,124,20,23,0,124,21,23,0,125,8,124, - 22,124,9,107,4,144,3,114,144,116,3,100,27,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,124,22,124,10,55, - 0,125,22,122,14,124,1,160,7,124,19,161,1,125,23,87, - 0,110,38,4,0,116,2,144,3,121,204,1,0,1,0,1, - 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,89,0,110,2,48,0,116,8,124,23,131,1,124, - 19,107,3,144,3,114,238,116,3,100,4,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,122,50,116,8,124,1,160, - 7,124,8,124,19,24,0,161,1,131,1,124,8,124,19,24, - 0,107,3,144,4,114,30,116,3,100,4,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,87,0,110,38,4,0,116, - 2,144,4,121,70,1,0,1,0,1,0,116,3,100,4,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,89,0,110, - 2,48,0,124,13,100,28,64,0,144,4,114,92,124,23,160, + 1,48,0,124,13,100,28,64,0,144,4,114,64,124,23,160, 16,161,0,125,23,110,52,122,14,124,23,160,16,100,29,161, - 1,125,23,87,0,110,36,4,0,116,17,144,4,121,142,1, + 1,125,23,87,0,110,36,4,0,116,17,144,4,121,114,1, 0,1,0,1,0,124,23,160,16,100,30,161,1,160,18,116, 19,161,1,125,23,89,0,110,2,48,0,124,23,160,20,100, 31,116,21,161,2,125,23,116,22,160,23,124,0,124,23,161, 2,125,24,124,24,124,14,124,18,124,4,124,22,124,15,124, 16,124,17,102,8,125,25,124,25,124,11,124,23,60,0,124, - 12,100,32,55,0,125,12,144,2,113,108,87,0,100,0,4, - 0,4,0,131,3,1,0,110,18,49,0,144,4,115,230,48, + 12,100,32,55,0,125,12,144,2,113,88,87,0,100,0,4, + 0,4,0,131,3,1,0,110,18,49,0,144,4,115,202,48, 0,1,0,1,0,1,0,89,0,1,0,116,24,160,25,100, 33,124,12,124,0,161,3,1,0,124,11,83,0,41,34,78, 122,21,99,97,110,39,116,32,111,112,101,110,32,90,105,112, @@ -654,18 +651,18 @@ const unsigned char _Py_M__zipimport[] = { 11,102,105,108,101,95,111,102,102,115,101,116,114,59,0,0, 0,114,13,0,0,0,218,1,116,114,9,0,0,0,114,9, 0,0,0,114,10,0,0,0,114,27,0,0,0,93,1,0, - 0,115,214,0,0,0,2,1,14,1,12,1,24,1,8,2, - 2,1,14,1,8,1,14,1,12,1,24,1,12,1,18,1, - 18,1,2,3,12,1,12,1,12,1,10,1,2,1,12,255, + 0,115,214,0,0,0,2,1,14,1,12,1,20,1,8,2, + 2,1,14,1,8,1,14,1,12,1,20,1,12,1,18,1, + 18,1,2,3,12,1,12,1,12,1,10,1,2,1,8,255, 8,2,2,1,2,255,2,1,4,255,2,2,10,1,12,1, - 14,1,10,1,2,1,12,255,10,2,10,1,10,1,2,1, + 14,1,10,1,2,1,8,255,10,2,10,1,10,1,2,1, 6,255,16,2,14,1,10,1,2,1,6,255,16,2,16,2, 16,1,10,1,18,1,10,1,18,1,8,1,8,1,10,1, - 18,1,4,2,4,2,2,1,14,1,14,1,24,1,10,2, + 18,1,4,2,4,2,2,1,14,1,14,1,20,1,10,2, 14,1,8,1,18,2,4,1,14,1,8,1,16,1,16,1, 16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1, 16,1,12,1,10,1,18,1,8,1,2,2,14,1,14,1, - 24,1,14,1,18,1,2,4,28,1,22,1,14,1,24,1, + 20,1,14,1,18,1,2,4,28,1,22,1,14,1,20,1, 10,2,10,2,2,3,14,1,14,1,22,1,12,2,12,1, 20,1,8,1,44,1,14,1,4,1,255,128,114,27,0,0, 0,117,190,1,0,0,0,1,2,3,4,5,6,7,8,9, @@ -697,57 +694,56 @@ const unsigned char _Py_M__zipimport[] = { 137,165,226,137,164,226,140,160,226,140,161,195,183,226,137,136, 194,176,226,136,153,194,183,226,136,154,226,129,191,194,178,226, 150,160,194,160,99,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,8,0,0,0,67,0,0,0,115,110,0, + 0,1,0,0,0,8,0,0,0,67,0,0,0,115,106,0, 0,0,116,0,114,22,116,1,160,2,100,1,161,1,1,0, - 116,3,100,2,131,1,130,1,100,3,97,0,122,62,122,16, - 100,4,100,5,108,4,109,5,125,0,1,0,87,0,110,36, - 4,0,116,6,121,80,1,0,1,0,1,0,116,1,160,2, - 100,1,161,1,1,0,116,3,100,2,131,1,130,1,89,0, - 110,2,48,0,87,0,100,6,97,0,110,6,100,6,97,0, - 48,0,116,1,160,2,100,7,161,1,1,0,124,0,83,0, - 41,8,78,122,27,122,105,112,105,109,112,111,114,116,58,32, - 122,108,105,98,32,85,78,65,86,65,73,76,65,66,76,69, - 250,41,99,97,110,39,116,32,100,101,99,111,109,112,114,101, - 115,115,32,100,97,116,97,59,32,122,108,105,98,32,110,111, - 116,32,97,118,97,105,108,97,98,108,101,84,114,0,0,0, - 0,169,1,218,10,100,101,99,111,109,112,114,101,115,115,70, - 122,25,122,105,112,105,109,112,111,114,116,58,32,122,108,105, - 98,32,97,118,97,105,108,97,98,108,101,41,7,218,15,95, - 105,109,112,111,114,116,105,110,103,95,122,108,105,98,114,76, - 0,0,0,114,77,0,0,0,114,3,0,0,0,90,4,122, - 108,105,98,114,139,0,0,0,218,9,69,120,99,101,112,116, - 105,111,110,114,138,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,20,95,103,101,116,95,100,101, - 99,111,109,112,114,101,115,115,95,102,117,110,99,251,1,0, - 0,115,26,0,0,0,4,2,10,3,8,1,4,2,4,1, - 16,1,12,1,10,1,16,1,12,2,10,2,4,1,255,128, - 114,142,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,17,0,0,0,9,0,0,0,67,0,0,0,115,144, - 1,0,0,124,1,92,8,125,2,125,3,125,4,125,5,125, - 6,125,7,125,8,125,9,124,4,100,1,107,0,114,36,116, - 0,100,2,131,1,130,1,116,1,160,2,124,0,161,1,144, - 1,143,14,125,10,122,14,124,10,160,3,124,6,161,1,1, - 0,87,0,110,36,4,0,116,4,121,100,1,0,1,0,1, - 0,116,0,100,3,124,0,155,2,157,2,124,0,100,4,141, - 2,130,1,89,0,110,2,48,0,124,10,160,5,100,5,161, - 1,125,11,116,6,124,11,131,1,100,5,107,3,114,132,116, - 7,100,6,131,1,130,1,124,11,100,0,100,7,133,2,25, - 0,100,8,107,3,114,166,116,0,100,9,124,0,155,2,157, - 2,124,0,100,4,141,2,130,1,116,8,124,11,100,10,100, - 11,133,2,25,0,131,1,125,12,116,8,124,11,100,11,100, - 5,133,2,25,0,131,1,125,13,100,5,124,12,23,0,124, - 13,23,0,125,14,124,6,124,14,55,0,125,6,122,14,124, - 10,160,3,124,6,161,1,1,0,87,0,110,38,4,0,116, - 4,144,1,121,14,1,0,1,0,1,0,116,0,100,3,124, - 0,155,2,157,2,124,0,100,4,141,2,130,1,89,0,110, - 2,48,0,124,10,160,5,124,4,161,1,125,15,116,6,124, - 15,131,1,124,4,107,3,144,1,114,48,116,4,100,12,131, - 1,130,1,87,0,100,0,4,0,4,0,131,3,1,0,110, - 18,49,0,144,1,115,70,48,0,1,0,1,0,1,0,89, - 0,1,0,124,3,100,1,107,2,144,1,114,94,124,15,83, - 0,122,10,116,9,131,0,125,16,87,0,110,28,4,0,116, - 10,144,1,121,132,1,0,1,0,1,0,116,0,100,13,131, - 1,130,1,89,0,110,2,48,0,124,16,124,15,100,14,131, + 116,3,100,2,131,1,130,1,100,3,97,0,122,58,122,16, + 100,4,100,5,108,4,109,5,125,0,1,0,87,0,110,32, + 4,0,116,6,121,76,1,0,1,0,1,0,116,1,160,2, + 100,1,161,1,1,0,116,3,100,2,131,1,130,1,48,0, + 87,0,100,6,97,0,110,6,100,6,97,0,48,0,116,1, + 160,2,100,7,161,1,1,0,124,0,83,0,41,8,78,122, + 27,122,105,112,105,109,112,111,114,116,58,32,122,108,105,98, + 32,85,78,65,86,65,73,76,65,66,76,69,250,41,99,97, + 110,39,116,32,100,101,99,111,109,112,114,101,115,115,32,100, + 97,116,97,59,32,122,108,105,98,32,110,111,116,32,97,118, + 97,105,108,97,98,108,101,84,114,0,0,0,0,169,1,218, + 10,100,101,99,111,109,112,114,101,115,115,70,122,25,122,105, + 112,105,109,112,111,114,116,58,32,122,108,105,98,32,97,118, + 97,105,108,97,98,108,101,41,7,218,15,95,105,109,112,111, + 114,116,105,110,103,95,122,108,105,98,114,76,0,0,0,114, + 77,0,0,0,114,3,0,0,0,90,4,122,108,105,98,114, + 139,0,0,0,218,9,69,120,99,101,112,116,105,111,110,114, + 138,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,20,95,103,101,116,95,100,101,99,111,109,112, + 114,101,115,115,95,102,117,110,99,251,1,0,0,115,26,0, + 0,0,4,2,10,3,8,1,4,2,4,1,16,1,12,1, + 10,1,12,1,12,2,10,2,4,1,255,128,114,142,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,17,0, + 0,0,9,0,0,0,67,0,0,0,115,132,1,0,0,124, + 1,92,8,125,2,125,3,125,4,125,5,125,6,125,7,125, + 8,125,9,124,4,100,1,107,0,114,36,116,0,100,2,131, + 1,130,1,116,1,160,2,124,0,161,1,144,1,143,6,125, + 10,122,14,124,10,160,3,124,6,161,1,1,0,87,0,110, + 32,4,0,116,4,121,96,1,0,1,0,1,0,116,0,100, + 3,124,0,155,2,157,2,124,0,100,4,141,2,130,1,48, + 0,124,10,160,5,100,5,161,1,125,11,116,6,124,11,131, + 1,100,5,107,3,114,128,116,7,100,6,131,1,130,1,124, + 11,100,0,100,7,133,2,25,0,100,8,107,3,114,162,116, + 0,100,9,124,0,155,2,157,2,124,0,100,4,141,2,130, + 1,116,8,124,11,100,10,100,11,133,2,25,0,131,1,125, + 12,116,8,124,11,100,11,100,5,133,2,25,0,131,1,125, + 13,100,5,124,12,23,0,124,13,23,0,125,14,124,6,124, + 14,55,0,125,6,122,14,124,10,160,3,124,6,161,1,1, + 0,87,0,110,34,4,0,116,4,144,1,121,6,1,0,1, + 0,1,0,116,0,100,3,124,0,155,2,157,2,124,0,100, + 4,141,2,130,1,48,0,124,10,160,5,124,4,161,1,125, + 15,116,6,124,15,131,1,124,4,107,3,144,1,114,40,116, + 4,100,12,131,1,130,1,87,0,100,0,4,0,4,0,131, + 3,1,0,110,18,49,0,144,1,115,62,48,0,1,0,1, + 0,1,0,89,0,1,0,124,3,100,1,107,2,144,1,114, + 86,124,15,83,0,122,10,116,9,131,0,125,16,87,0,110, + 24,4,0,116,10,144,1,121,120,1,0,1,0,1,0,116, + 0,100,13,131,1,130,1,48,0,124,16,124,15,100,14,131, 2,83,0,41,15,78,114,0,0,0,0,122,18,110,101,103, 97,116,105,118,101,32,100,97,116,97,32,115,105,122,101,114, 90,0,0,0,114,12,0,0,0,114,102,0,0,0,114,96, @@ -768,10 +764,10 @@ const unsigned char _Py_M__zipimport[] = { 114,125,0,0,0,90,8,114,97,119,95,100,97,116,97,114, 139,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, 0,0,0,114,52,0,0,0,16,2,0,0,115,64,0,0, - 0,20,1,8,1,8,1,14,2,2,2,14,1,12,1,24, + 0,20,1,8,1,8,1,14,2,2,2,14,1,12,1,20, 1,10,1,12,1,8,1,16,2,18,2,16,2,16,1,12, - 1,8,1,2,1,14,1,14,1,24,1,10,1,14,1,40, - 1,10,2,4,2,2,3,10,1,14,1,14,1,10,1,255, + 1,8,1,2,1,14,1,14,1,20,1,10,1,14,1,40, + 1,10,2,4,2,2,3,10,1,14,1,10,1,10,1,255, 128,114,52,0,0,0,99,2,0,0,0,0,0,0,0,0, 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, 16,0,0,0,116,0,124,0,124,1,24,0,131,1,100,1, @@ -907,7 +903,7 @@ const unsigned char _Py_M__zipimport[] = { 0,0,114,147,0,0,0,168,2,0,0,115,16,0,0,0, 20,2,12,1,2,2,14,1,12,1,8,1,12,2,255,128, 114,147,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,11,0,0,0,9,0,0,0,67,0,0,0,115,194, + 0,0,11,0,0,0,9,0,0,0,67,0,0,0,115,190, 0,0,0,116,0,124,0,124,1,131,2,125,2,116,1,68, 0,93,156,92,3,125,3,125,4,125,5,124,2,124,3,23, 0,125,6,116,2,106,3,100,1,124,0,106,4,116,5,124, @@ -920,46 +916,45 @@ const unsigned char _Py_M__zipimport[] = { 10,100,0,117,0,114,150,113,14,124,7,100,4,25,0,125, 8,124,10,124,5,124,8,102,3,2,0,1,0,83,0,116, 11,100,5,124,1,155,2,157,2,124,1,100,6,141,2,130, - 1,100,0,83,0,41,7,78,122,13,116,114,121,105,110,103, - 32,123,125,123,125,123,125,114,84,0,0,0,41,1,90,9, - 118,101,114,98,111,115,105,116,121,114,0,0,0,0,114,57, - 0,0,0,114,58,0,0,0,41,12,114,36,0,0,0,114, - 87,0,0,0,114,76,0,0,0,114,77,0,0,0,114,29, - 0,0,0,114,20,0,0,0,114,28,0,0,0,114,26,0, - 0,0,114,52,0,0,0,114,153,0,0,0,114,159,0,0, - 0,114,3,0,0,0,41,11,114,32,0,0,0,114,38,0, - 0,0,114,13,0,0,0,114,88,0,0,0,114,89,0,0, - 0,114,47,0,0,0,114,63,0,0,0,114,54,0,0,0, - 114,40,0,0,0,114,124,0,0,0,114,46,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,44, - 0,0,0,183,2,0,0,115,40,0,0,0,10,1,14,1, - 8,1,22,1,2,1,14,1,12,1,6,1,8,2,12,1, - 4,1,18,1,10,2,8,1,2,3,8,1,14,1,18,2, - 4,128,255,128,114,44,0,0,0,41,44,114,82,0,0,0, - 90,26,95,102,114,111,122,101,110,95,105,109,112,111,114,116, - 108,105,98,95,101,120,116,101,114,110,97,108,114,21,0,0, - 0,114,1,0,0,0,114,2,0,0,0,90,17,95,102,114, - 111,122,101,110,95,105,109,112,111,114,116,108,105,98,114,76, - 0,0,0,114,146,0,0,0,114,108,0,0,0,114,150,0, - 0,0,114,67,0,0,0,114,129,0,0,0,90,7,95,95, - 97,108,108,95,95,114,20,0,0,0,90,15,112,97,116,104, - 95,115,101,112,97,114,97,116,111,114,115,114,18,0,0,0, - 114,75,0,0,0,114,3,0,0,0,114,25,0,0,0,218, - 4,116,121,112,101,114,70,0,0,0,114,111,0,0,0,114, - 113,0,0,0,114,115,0,0,0,114,4,0,0,0,114,87, - 0,0,0,114,36,0,0,0,114,37,0,0,0,114,35,0, - 0,0,114,27,0,0,0,114,120,0,0,0,114,140,0,0, - 0,114,142,0,0,0,114,52,0,0,0,114,145,0,0,0, - 114,153,0,0,0,218,8,95,95,99,111,100,101,95,95,114, - 151,0,0,0,114,157,0,0,0,114,159,0,0,0,114,167, - 0,0,0,114,149,0,0,0,114,147,0,0,0,114,44,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,8,60,109,111,100,117,108,101,62, - 1,0,0,0,115,90,0,0,0,4,0,8,16,16,1,8, - 1,8,1,8,1,8,1,8,1,8,1,8,2,6,3,14, - 1,16,3,4,4,8,2,4,2,4,1,4,1,14,2,0, - 127,12,125,12,1,2,1,2,1,4,252,8,9,8,4,8, - 9,8,31,2,126,2,254,4,29,8,5,8,21,8,46,8, - 10,10,46,8,5,8,7,8,6,8,13,8,19,8,15,4, - 128,255,128, + 1,41,7,78,122,13,116,114,121,105,110,103,32,123,125,123, + 125,123,125,114,84,0,0,0,41,1,90,9,118,101,114,98, + 111,115,105,116,121,114,0,0,0,0,114,57,0,0,0,114, + 58,0,0,0,41,12,114,36,0,0,0,114,87,0,0,0, + 114,76,0,0,0,114,77,0,0,0,114,29,0,0,0,114, + 20,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52, + 0,0,0,114,153,0,0,0,114,159,0,0,0,114,3,0, + 0,0,41,11,114,32,0,0,0,114,38,0,0,0,114,13, + 0,0,0,114,88,0,0,0,114,89,0,0,0,114,47,0, + 0,0,114,63,0,0,0,114,54,0,0,0,114,40,0,0, + 0,114,124,0,0,0,114,46,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,44,0,0,0,183, + 2,0,0,115,38,0,0,0,10,1,14,1,8,1,22,1, + 2,1,14,1,12,1,6,1,8,2,12,1,4,1,18,1, + 10,2,8,1,2,3,8,1,14,1,18,2,255,128,114,44, + 0,0,0,41,44,114,82,0,0,0,90,26,95,102,114,111, + 122,101,110,95,105,109,112,111,114,116,108,105,98,95,101,120, + 116,101,114,110,97,108,114,21,0,0,0,114,1,0,0,0, + 114,2,0,0,0,90,17,95,102,114,111,122,101,110,95,105, + 109,112,111,114,116,108,105,98,114,76,0,0,0,114,146,0, + 0,0,114,108,0,0,0,114,150,0,0,0,114,67,0,0, + 0,114,129,0,0,0,90,7,95,95,97,108,108,95,95,114, + 20,0,0,0,90,15,112,97,116,104,95,115,101,112,97,114, + 97,116,111,114,115,114,18,0,0,0,114,75,0,0,0,114, + 3,0,0,0,114,25,0,0,0,218,4,116,121,112,101,114, + 70,0,0,0,114,111,0,0,0,114,113,0,0,0,114,115, + 0,0,0,114,4,0,0,0,114,87,0,0,0,114,36,0, + 0,0,114,37,0,0,0,114,35,0,0,0,114,27,0,0, + 0,114,120,0,0,0,114,140,0,0,0,114,142,0,0,0, + 114,52,0,0,0,114,145,0,0,0,114,153,0,0,0,218, + 8,95,95,99,111,100,101,95,95,114,151,0,0,0,114,157, + 0,0,0,114,159,0,0,0,114,167,0,0,0,114,149,0, + 0,0,114,147,0,0,0,114,44,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,8,60,109,111,100,117,108,101,62,1,0,0,0,115,90, + 0,0,0,4,0,8,16,16,1,8,1,8,1,8,1,8, + 1,8,1,8,1,8,2,6,3,14,1,16,3,4,4,8, + 2,4,2,4,1,4,1,14,2,0,127,12,125,12,1,2, + 1,2,1,4,252,8,9,8,4,8,9,8,31,2,126,2, + 254,4,29,8,5,8,21,8,46,8,10,10,46,8,5,8, + 7,8,6,8,13,8,19,8,15,4,128,255,128, }; From 0e5c9d5e4935a446a4445f125a660bbff0188b03 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Fri, 13 Nov 2020 12:53:53 +0000 Subject: [PATCH 0523/1261] bpo-42246: Fix memory leak in compiler (GH-23256) * Fix potential memory leak in assembler init. * Fix reference leak when encountering error during compilation of function body. --- Python/compile.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Python/compile.c b/Python/compile.c index 5a0292646b5c65..c2fcf096fbad44 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2276,7 +2276,7 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async) c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs); c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); for (i = docstring ? 1 : 0; i < asdl_seq_LEN(body); i++) { - VISIT(c, stmt, (stmt_ty)asdl_seq_GET(body, i)); + VISIT_IN_SCOPE(c, stmt, (stmt_ty)asdl_seq_GET(body, i)); } co = assemble(c, 1); qualname = c->u->u_qualname; @@ -5533,18 +5533,24 @@ assemble_init(struct assembler *a, int nblocks, int firstlineno) { memset(a, 0, sizeof(struct assembler)); a->a_prevlineno = a->a_lineno = firstlineno; + a->a_lnotab = NULL; a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE); - if (!a->a_bytecode) - return 0; + if (a->a_bytecode == NULL) { + goto error; + } a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE); - if (!a->a_lnotab) - return 0; + if (a->a_lnotab == NULL) { + goto error; + } if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) { PyErr_NoMemory(); - return 0; + goto error; } - return 1; +error: + Py_XDECREF(a->a_bytecode); + Py_XDECREF(a->a_lnotab); + return 0; } static void From 15767b21e370bdecfa1f6143f9da803a147655c7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 13 Nov 2020 14:44:11 +0100 Subject: [PATCH 0524/1261] bpo-38823: Fix compiler warning in _ctypes on Windows (GH-23258) Explicitly cast PyExc_Exception to PyTypeObject* to fix the warning: modules\_ctypes\_ctypes.c(5748): warning C4133: '=': incompatible types - from 'PyObject *' to '_typeobject *' --- Modules/_ctypes/_ctypes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 8bb34877c53903..5f8a723f6373ae 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -5745,7 +5745,7 @@ _ctypes_add_types(PyObject *mod) TYPE_READY(&StructParam_Type); #ifdef MS_WIN32 - TYPE_READY_BASE(&PyComError_Type, PyExc_Exception); + TYPE_READY_BASE(&PyComError_Type, (PyTypeObject*)PyExc_Exception); #endif #undef TYPE_READY From 4f4bc2836c49a59925567d6c8575106c5058d6db Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 13 Nov 2020 14:44:42 +0100 Subject: [PATCH 0525/1261] bpo-42296: On Windows, fix CTRL+C regression (GH-23257) On Windows, fix a regression in signal handling which prevented to interrupt a program using CTRL+C. The signal handler can be run in a thread different than the Python thread, in which case the test deciding if the thread can handle signals is wrong. On Windows, _PyEval_SignalReceived() now always sets eval_breaker to 1 since it cannot test _Py_ThreadCanHandleSignals(), and eval_frame_handle_pending() always calls _Py_ThreadCanHandleSignals() to recompute eval_breaker. --- .../2020-11-13-13-53-11.bpo-42296.DuGrLJ.rst | 4 ++ Python/ceval.c | 38 ++++++++++++++++--- 2 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-13-13-53-11.bpo-42296.DuGrLJ.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-13-13-53-11.bpo-42296.DuGrLJ.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-13-13-53-11.bpo-42296.DuGrLJ.rst new file mode 100644 index 00000000000000..841a26e791ea08 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-13-13-53-11.bpo-42296.DuGrLJ.rst @@ -0,0 +1,4 @@ +On Windows, fix a regression in signal handling which prevented to interrupt +a program using CTRL+C. The signal handler can be run in a thread different +than the Python thread, in which case the test deciding if the thread can +handle signals is wrong. diff --git a/Python/ceval.c b/Python/ceval.c index d6b786dc2cda0b..3d65e161302a95 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -203,13 +203,18 @@ UNSIGNAL_PENDING_CALLS(PyInterpreterState *interp) static inline void -SIGNAL_PENDING_SIGNALS(PyInterpreterState *interp) +SIGNAL_PENDING_SIGNALS(PyInterpreterState *interp, int force) { struct _ceval_runtime_state *ceval = &interp->runtime->ceval; struct _ceval_state *ceval2 = &interp->ceval; _Py_atomic_store_relaxed(&ceval->signals_pending, 1); - /* eval_breaker is not set to 1 if thread_can_handle_signals() is false */ - COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); + if (force) { + _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1); + } + else { + /* eval_breaker is not set to 1 if thread_can_handle_signals() is false */ + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); + } } @@ -559,10 +564,22 @@ PyEval_RestoreThread(PyThreadState *tstate) void _PyEval_SignalReceived(PyInterpreterState *interp) { +#ifdef MS_WINDOWS + // bpo-42296: On Windows, _PyEval_SignalReceived() is called from a signal + // handler which can run in a thread different than the Python thread, in + // which case _Py_ThreadCanHandleSignals() is wrong. Ignore + // _Py_ThreadCanHandleSignals() and always set eval_breaker to 1. + // + // The next eval_frame_handle_pending() call will call + // _Py_ThreadCanHandleSignals() to recompute eval_breaker. + int force = 1; +#else + int force = 0; +#endif /* bpo-30703: Function called when the C signal handler of Python gets a signal. We cannot queue a callback using _PyEval_AddPendingCall() since that function is not async-signal-safe. */ - SIGNAL_PENDING_SIGNALS(interp); + SIGNAL_PENDING_SIGNALS(interp, force); } /* Push one item onto the queue while holding the lock. */ @@ -662,7 +679,7 @@ handle_signals(PyThreadState *tstate) UNSIGNAL_PENDING_SIGNALS(tstate->interp); if (_PyErr_CheckSignalsTstate(tstate) < 0) { /* On failure, re-schedule a call to handle_signals(). */ - SIGNAL_PENDING_SIGNALS(tstate->interp); + SIGNAL_PENDING_SIGNALS(tstate->interp, 0); return -1; } return 0; @@ -948,6 +965,17 @@ eval_frame_handle_pending(PyThreadState *tstate) return -1; } +#ifdef MS_WINDOWS + // bpo-42296: On Windows, _PyEval_SignalReceived() can be called in a + // different thread than the Python thread, in which case + // _Py_ThreadCanHandleSignals() is wrong. Recompute eval_breaker in the + // current Python thread with the correct _Py_ThreadCanHandleSignals() + // value. It prevents to interrupt the eval loop at every instruction if + // the current Python thread cannot handle signals (if + // _Py_ThreadCanHandleSignals() is false). + COMPUTE_EVAL_BREAKER(tstate->interp, ceval, ceval2); +#endif + return 0; } From 5065890be964f4f5fd8f9aa1350e669e357b67fa Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 13 Nov 2020 15:38:17 +0100 Subject: [PATCH 0526/1261] bpo-41617: Add _Py__has_builtin() macro (GH-23260) Fix building pycore_bitutils.h internal header on old clang version without __builtin_bswap16() (ex: Xcode 4.6.3 on Mac OS X 10.7). Add a new private _Py__has_builtin() macro to check for availability of a preprocessor builtin function. Co-Authored-By: Joshua Root Co-authored-by: Joshua Root --- Include/internal/pycore_bitutils.h | 15 ++++++--------- Include/pyport.h | 12 ++++++++++++ .../2020-11-13-15-04-53.bpo-41617.98_oaE.rst | 3 +++ 3 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-11-13-15-04-53.bpo-41617.98_oaE.rst diff --git a/Include/internal/pycore_bitutils.h b/Include/internal/pycore_bitutils.h index 1602fc68d94074..e4aa7a3d0d0567 100644 --- a/Include/internal/pycore_bitutils.h +++ b/Include/internal/pycore_bitutils.h @@ -17,12 +17,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#if ((defined(__GNUC__) \ - && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))) \ - || (defined(__clang__) \ - && (__clang_major__ >= 4 \ - || (__clang_major__ == 3 && __clang_minor__ >= 2)))) - /* __builtin_bswap16() is available since GCC 4.8 and clang 3.2, +#if defined(__GNUC__) \ + && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) + /* __builtin_bswap16() is available since GCC 4.8, __builtin_bswap32() is available since GCC 4.3, __builtin_bswap64() is available since GCC 4.3. */ # define _PY_HAVE_BUILTIN_BSWAP @@ -36,7 +33,7 @@ extern "C" { static inline uint16_t _Py_bswap16(uint16_t word) { -#ifdef _PY_HAVE_BUILTIN_BSWAP +#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap16) return __builtin_bswap16(word); #elif defined(_MSC_VER) Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned short)); @@ -51,7 +48,7 @@ _Py_bswap16(uint16_t word) static inline uint32_t _Py_bswap32(uint32_t word) { -#ifdef _PY_HAVE_BUILTIN_BSWAP +#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap32) return __builtin_bswap32(word); #elif defined(_MSC_VER) Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned long)); @@ -68,7 +65,7 @@ _Py_bswap32(uint32_t word) static inline uint64_t _Py_bswap64(uint64_t word) { -#ifdef _PY_HAVE_BUILTIN_BSWAP +#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap64) return __builtin_bswap64(word); #elif defined(_MSC_VER) return _byteswap_uint64(word); diff --git a/Include/pyport.h b/Include/pyport.h index 79fc7c4a5286f4..6687849d844724 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -869,4 +869,16 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; # define _Py_NO_RETURN #endif + +// Preprocessor check for a builtin preprocessor function. Always return 0 +// if __has_builtin() macro is not defined. +// +// __has_builtin() is available on clang and GCC 10. +#ifdef __has_builtin +# define _Py__has_builtin(x) __has_builtin(x) +#else +# define _Py__has_builtin(x) 0 +#endif + + #endif /* Py_PYPORT_H */ diff --git a/Misc/NEWS.d/next/Build/2020-11-13-15-04-53.bpo-41617.98_oaE.rst b/Misc/NEWS.d/next/Build/2020-11-13-15-04-53.bpo-41617.98_oaE.rst new file mode 100644 index 00000000000000..a5f35b25e8bf6a --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-11-13-15-04-53.bpo-41617.98_oaE.rst @@ -0,0 +1,3 @@ +Fix building ``pycore_bitutils.h`` internal header on old clang version +without ``__builtin_bswap16()`` (ex: Xcode 4.6.3 on Mac OS X 10.7). Patch by +Joshua Root and Victor Stinner. From 8ebdf59d60fad7704fd091e3d4e3e4957272fba3 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sat, 14 Nov 2020 00:15:17 +0900 Subject: [PATCH 0527/1261] bpo-42042: Use ids attribute instead of names attribute (GH-22739) --- Doc/tools/extensions/c_annotations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/tools/extensions/c_annotations.py b/Doc/tools/extensions/c_annotations.py index fa8244a8fd318e..76c9d920cbe31f 100644 --- a/Doc/tools/extensions/c_annotations.py +++ b/Doc/tools/extensions/c_annotations.py @@ -79,9 +79,9 @@ def add_annotations(self, app, doctree): classes=['stableabi'])) if par['objtype'] != 'function': continue - if not par[0].has_key('names') or not par[0]['names']: + if not par[0].has_key('ids') or not par[0]['ids']: continue - name = par[0]['names'][0] + name = par[0]['ids'][0] if name.startswith("c."): name = name[2:] entry = self.get(name) From a393bca9bf70ca047bc83f15571ec94258fe2f85 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Fri, 13 Nov 2020 16:37:52 +0100 Subject: [PATCH 0528/1261] bpo-40968: Send http/1.1 ALPN extension (#20959) Signed-off-by: Christian Heimes --- Doc/library/http.client.rst | 5 +++++ Doc/library/urllib.request.rst | 5 +++++ Lib/http/client.py | 3 +++ Lib/urllib/request.py | 2 ++ .../next/Library/2020-06-18-11-35-16.bpo-40968.R8Edbv.rst | 2 ++ 5 files changed, 17 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-06-18-11-35-16.bpo-40968.R8Edbv.rst diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst index 35997db2a9d27d..56f4c0a0d772f4 100644 --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -99,6 +99,11 @@ The module provides the following classes: :attr:`ssl.SSLContext.post_handshake_auth` for the default *context* or when *cert_file* is passed with a custom *context*. + .. versionchanged:: 3.10 + This class now sends an ALPN extension with protocol indicator + ``http/1.1`` when no *context* is given. Custom *context* should set + ALPN protocols with :meth:`~ssl.SSLContext.set_alpn_protocol`. + .. deprecated:: 3.6 *key_file* and *cert_file* are deprecated in favor of *context*. diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index b37f230feb6015..b4435a62ad43d9 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -109,6 +109,11 @@ The :mod:`urllib.request` module defines the following functions: .. versionchanged:: 3.4.3 *context* was added. + .. versionchanged:: 3.10 + HTTPS connection now send an ALPN extension with protocol indicator + ``http/1.1`` when no *context* is given. Custom *context* should set + ALPN protocols with :meth:`~ssl.SSLContext.set_alpn_protocol`. + .. deprecated:: 3.6 *cafile*, *capath* and *cadefault* are deprecated in favor of *context*. diff --git a/Lib/http/client.py b/Lib/http/client.py index 15abcfeada5915..a54679cf84d18a 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -1407,6 +1407,9 @@ def __init__(self, host, port=None, key_file=None, cert_file=None, self.cert_file = cert_file if context is None: context = ssl._create_default_https_context() + # send ALPN extension to indicate HTTP/1.1 protocol + if self._http_vsn == 11: + context.set_alpn_protocols(['http/1.1']) # enable PHA for TLS 1.3 connections if available if context.post_handshake_auth is not None: context.post_handshake_auth = True diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index a8c870b9778eba..39974d975ee1e0 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -202,6 +202,8 @@ def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=cafile, capath=capath) + # send ALPN extension to indicate HTTP/1.1 protocol + context.set_alpn_protocols(['http/1.1']) https_handler = HTTPSHandler(context=context) opener = build_opener(https_handler) elif context: diff --git a/Misc/NEWS.d/next/Library/2020-06-18-11-35-16.bpo-40968.R8Edbv.rst b/Misc/NEWS.d/next/Library/2020-06-18-11-35-16.bpo-40968.R8Edbv.rst new file mode 100644 index 00000000000000..6bcbaaa9ab9291 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-06-18-11-35-16.bpo-40968.R8Edbv.rst @@ -0,0 +1,2 @@ +:mod:`urllib.request` and :mod:`http.client` now send ``http/1.1`` ALPN +extension during TLS handshake when no custom context is supplied. From f1a4d991501716c68af60dad2a24169ee9f20aaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Gmach?= Date: Fri, 13 Nov 2020 19:15:37 +0100 Subject: [PATCH 0529/1261] bpo-42344: Improve pseudo implementation for SimpleNamespace (GH-23264) --- Doc/library/types.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/library/types.rst b/Doc/library/types.rst index ad40a9fbf32739..6f0dc259303fad 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -409,7 +409,9 @@ Additional Utility Classes and Functions return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): - return self.__dict__ == other.__dict__ + if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace): + return self.__dict__ == other.__dict__ + return NotImplemented ``SimpleNamespace`` may be useful as a replacement for ``class NS: pass``. However, for a structured record type use :func:`~collections.namedtuple` From eb59e4b603c9c4e5c94afeb9b095f514faa52e7d Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Fri, 13 Nov 2020 19:48:52 +0100 Subject: [PATCH 0530/1261] bpo-41001: Add os.eventfd() (#20930) Co-authored-by: Kyle Stanley --- Doc/library/os.rst | 96 ++++++++++++ Doc/whatsnew/3.10.rst | 4 + Lib/test/test_os.py | 86 +++++++++++ .../2020-06-17-12-24-26.bpo-41001.5mi7b0.rst | 2 + Modules/clinic/posixmodule.c.h | 142 +++++++++++++++++- Modules/posixmodule.c | 91 +++++++++++ configure | 33 +++- configure.ac | 14 +- pyconfig.h.in | 6 + 9 files changed, 471 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-06-17-12-24-26.bpo-41001.5mi7b0.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 3ffcfa04ffa752..6c7ae0c785dcd9 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3276,6 +3276,102 @@ features: .. versionadded:: 3.8 +.. function:: eventfd(initval[, flags=os.EFD_CLOEXEC]) + + Create and return an event file descriptor. The file descriptors supports + raw :func:`read` and :func:`write` with a buffer size of 8, + :func:`~select.select`, :func:`~select.poll` and similar. See man page + :manpage:`eventfd(2)` for more information. By default, the + new file descriptor is :ref:`non-inheritable `. + + *initval* is the initial value of the event counter. The initial value + must be an 32 bit unsigned integer. Please note that the initial value is + limited to a 32 bit unsigned int although the event counter is an unsigned + 64 bit integer with a maximum value of 2\ :sup:`64`\ -\ 2. + + *flags* can be constructed from :const:`EFD_CLOEXEC`, + :const:`EFD_NONBLOCK`, and :const:`EFD_SEMAPHORE`. + + If :const:`EFD_SEMAPHORE` is specified and the event counter is non-zero, + :func:`eventfd_read` returns 1 and decrements the counter by one. + + If :const:`EFD_SEMAPHORE` is not specified and the event counter is + non-zero, :func:`eventfd_read` returns the current event counter value and + resets the counter to zero. + + If the event counter is zero and :const:`EFD_NONBLOCK` is not + specified, :func:`eventfd_read` blocks. + + :func:`eventfd_write` increments the event counter. Write blocks if the + write operation would increment the counter to a value larger than + 2\ :sup:`64`\ -\ 2. + + Example:: + + import os + + # semaphore with start value '1' + fd = os.eventfd(1, os.EFD_SEMAPHORE | os.EFC_CLOEXEC) + try: + # acquire semaphore + v = os.eventfd_read(fd) + try: + do_work() + finally: + # release semaphore + os.eventfd_write(fd, v) + finally: + os.close(fd) + + .. availability:: Linux 2.6.27 or newer with glibc 2.8 or newer. + + .. versionadded:: 3.10 + +.. function:: eventfd_read(fd) + + Read value from an :func:`eventfd` file descriptor and return a 64 bit + unsigned int. The function does not verify that *fd* is an :func:`eventfd`. + + .. availability:: See :func:`eventfd` + + .. versionadded:: 3.10 + +.. function:: eventfd_write(fd, value) + + Add value to an :func:`eventfd` file descriptor. *value* must be a 64 bit + unsigned int. The function does not verify that *fd* is an :func:`eventfd`. + + .. availability:: See :func:`eventfd` + + .. versionadded:: 3.10 + +.. data:: EFD_CLOEXEC + + Set close-on-exec flag for new :func:`eventfd` file descriptor. + + .. availability:: See :func:`eventfd` + + .. versionadded:: 3.10 + +.. data:: EFD_NONBLOCK + + Set :const:`O_NONBLOCK` status flag for new :func:`eventfd` file + descriptor. + + .. availability:: See :func:`eventfd` + + .. versionadded:: 3.10 + +.. data:: EFD_SEMAPHORE + + Provide semaphore-like semantics for reads from a :func:`eventfd` file + descriptor. On read the internal counter is decremented by one. + + .. availability:: Linux 2.6.30 or newer with glibc 2.8 or newer. + + .. versionadded:: 3.10 + + Linux extended attributes ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 4d772005581ad4..c1ce5f3cdc2a10 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -229,6 +229,10 @@ os Added :func:`os.cpu_count()` support for VxWorks RTOS. (Contributed by Peixing Xin in :issue:`41440`.) +Added a new function :func:`os.eventfd` and related helpers to wrap the +``eventfd2`` syscall on Linux. +(Contributed by Christian Heimes in :issue:`41001`.) + py_compile ---------- diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 5126c84cf30c68..501b4a975566a7 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -15,10 +15,12 @@ import mmap import os import pickle +import select import shutil import signal import socket import stat +import struct import subprocess import sys import sysconfig @@ -59,6 +61,7 @@ except ImportError: INT_MAX = PY_SSIZE_T_MAX = sys.maxsize + from test.support.script_helper import assert_python_ok from test.support import unix_shell from test.support.os_helper import FakePath @@ -3528,6 +3531,89 @@ def test_memfd_create(self): self.assertFalse(os.get_inheritable(fd2)) +@unittest.skipUnless(hasattr(os, 'eventfd'), 'requires os.eventfd') +@support.requires_linux_version(2, 6, 30) +class EventfdTests(unittest.TestCase): + def test_eventfd_initval(self): + def pack(value): + """Pack as native uint64_t + """ + return struct.pack("@Q", value) + size = 8 # read/write 8 bytes + initval = 42 + fd = os.eventfd(initval) + self.assertNotEqual(fd, -1) + self.addCleanup(os.close, fd) + self.assertFalse(os.get_inheritable(fd)) + + # test with raw read/write + res = os.read(fd, size) + self.assertEqual(res, pack(initval)) + + os.write(fd, pack(23)) + res = os.read(fd, size) + self.assertEqual(res, pack(23)) + + os.write(fd, pack(40)) + os.write(fd, pack(2)) + res = os.read(fd, size) + self.assertEqual(res, pack(42)) + + # test with eventfd_read/eventfd_write + os.eventfd_write(fd, 20) + os.eventfd_write(fd, 3) + res = os.eventfd_read(fd) + self.assertEqual(res, 23) + + def test_eventfd_semaphore(self): + initval = 2 + flags = os.EFD_CLOEXEC | os.EFD_SEMAPHORE | os.EFD_NONBLOCK + fd = os.eventfd(initval, flags) + self.assertNotEqual(fd, -1) + self.addCleanup(os.close, fd) + + # semaphore starts has initval 2, two reads return '1' + res = os.eventfd_read(fd) + self.assertEqual(res, 1) + res = os.eventfd_read(fd) + self.assertEqual(res, 1) + # third read would block + with self.assertRaises(BlockingIOError): + os.eventfd_read(fd) + with self.assertRaises(BlockingIOError): + os.read(fd, 8) + + # increase semaphore counter, read one + os.eventfd_write(fd, 1) + res = os.eventfd_read(fd) + self.assertEqual(res, 1) + # next read would block, too + with self.assertRaises(BlockingIOError): + os.eventfd_read(fd) + + def test_eventfd_select(self): + flags = os.EFD_CLOEXEC | os.EFD_NONBLOCK + fd = os.eventfd(0, flags) + self.assertNotEqual(fd, -1) + self.addCleanup(os.close, fd) + + # counter is zero, only writeable + rfd, wfd, xfd = select.select([fd], [fd], [fd], 0) + self.assertEqual((rfd, wfd, xfd), ([], [fd], [])) + + # counter is non-zero, read and writeable + os.eventfd_write(fd, 23) + rfd, wfd, xfd = select.select([fd], [fd], [fd], 0) + self.assertEqual((rfd, wfd, xfd), ([fd], [fd], [])) + self.assertEqual(os.eventfd_read(fd), 23) + + # counter at max, only readable + os.eventfd_write(fd, (2**64) - 2) + rfd, wfd, xfd = select.select([fd], [fd], [fd], 0) + self.assertEqual((rfd, wfd, xfd), ([fd], [], [])) + os.eventfd_read(fd) + + class OSErrorTests(unittest.TestCase): def setUp(self): class Str(str): diff --git a/Misc/NEWS.d/next/Library/2020-06-17-12-24-26.bpo-41001.5mi7b0.rst b/Misc/NEWS.d/next/Library/2020-06-17-12-24-26.bpo-41001.5mi7b0.rst new file mode 100644 index 00000000000000..34ecfbf5e6692b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-06-17-12-24-26.bpo-41001.5mi7b0.rst @@ -0,0 +1,2 @@ +Add func:`os.eventfd` to provide a low level interface for Linux's event +notification file descriptor. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index df680d5738c8e8..f5826e3681251e 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -7620,6 +7620,134 @@ os_memfd_create(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj #endif /* defined(HAVE_MEMFD_CREATE) */ +#if defined(HAVE_EVENTFD) + +PyDoc_STRVAR(os_eventfd__doc__, +"eventfd($module, /, initval, flags=EFD_CLOEXEC)\n" +"--\n" +"\n" +"Creates and returns an event notification file descriptor."); + +#define OS_EVENTFD_METHODDEF \ + {"eventfd", (PyCFunction)(void(*)(void))os_eventfd, METH_FASTCALL|METH_KEYWORDS, os_eventfd__doc__}, + +static PyObject * +os_eventfd_impl(PyObject *module, unsigned int initval, int flags); + +static PyObject * +os_eventfd(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"initval", "flags", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "eventfd", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + unsigned int initval; + int flags = EFD_CLOEXEC; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!_PyLong_UnsignedInt_Converter(args[0], &initval)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + flags = _PyLong_AsInt(args[1]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: + return_value = os_eventfd_impl(module, initval, flags); + +exit: + return return_value; +} + +#endif /* defined(HAVE_EVENTFD) */ + +#if defined(HAVE_EVENTFD) + +PyDoc_STRVAR(os_eventfd_read__doc__, +"eventfd_read($module, /, fd)\n" +"--\n" +"\n" +"Read eventfd value"); + +#define OS_EVENTFD_READ_METHODDEF \ + {"eventfd_read", (PyCFunction)(void(*)(void))os_eventfd_read, METH_FASTCALL|METH_KEYWORDS, os_eventfd_read__doc__}, + +static PyObject * +os_eventfd_read_impl(PyObject *module, int fd); + +static PyObject * +os_eventfd_read(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"fd", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "eventfd_read", 0}; + PyObject *argsbuf[1]; + int fd; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { + goto exit; + } + return_value = os_eventfd_read_impl(module, fd); + +exit: + return return_value; +} + +#endif /* defined(HAVE_EVENTFD) */ + +#if defined(HAVE_EVENTFD) + +PyDoc_STRVAR(os_eventfd_write__doc__, +"eventfd_write($module, /, fd, value)\n" +"--\n" +"\n" +"Write eventfd value."); + +#define OS_EVENTFD_WRITE_METHODDEF \ + {"eventfd_write", (PyCFunction)(void(*)(void))os_eventfd_write, METH_FASTCALL|METH_KEYWORDS, os_eventfd_write__doc__}, + +static PyObject * +os_eventfd_write_impl(PyObject *module, int fd, unsigned long long value); + +static PyObject * +os_eventfd_write(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"fd", "value", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "eventfd_write", 0}; + PyObject *argsbuf[2]; + int fd; + unsigned long long value; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) { + goto exit; + } + if (!_PyLong_UnsignedLongLong_Converter(args[1], &value)) { + goto exit; + } + return_value = os_eventfd_write_impl(module, fd, value); + +exit: + return return_value; +} + +#endif /* defined(HAVE_EVENTFD) */ + #if (defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL)) PyDoc_STRVAR(os_get_terminal_size__doc__, @@ -8884,6 +9012,18 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #define OS_MEMFD_CREATE_METHODDEF #endif /* !defined(OS_MEMFD_CREATE_METHODDEF) */ +#ifndef OS_EVENTFD_METHODDEF + #define OS_EVENTFD_METHODDEF +#endif /* !defined(OS_EVENTFD_METHODDEF) */ + +#ifndef OS_EVENTFD_READ_METHODDEF + #define OS_EVENTFD_READ_METHODDEF +#endif /* !defined(OS_EVENTFD_READ_METHODDEF) */ + +#ifndef OS_EVENTFD_WRITE_METHODDEF + #define OS_EVENTFD_WRITE_METHODDEF +#endif /* !defined(OS_EVENTFD_WRITE_METHODDEF) */ + #ifndef OS_GET_TERMINAL_SIZE_METHODDEF #define OS_GET_TERMINAL_SIZE_METHODDEF #endif /* !defined(OS_GET_TERMINAL_SIZE_METHODDEF) */ @@ -8919,4 +9059,4 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=936f33448cd66ccb input=a9049054013a1b77]*/ +/*[clinic end generated code: output=49b7ed768242ef7c input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 6b51d8a848eab2..0764453f412d56 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -518,6 +518,11 @@ extern char *ctermid_r(char *); # include #endif +/* eventfd() */ +#ifdef HAVE_SYS_EVENTFD_H +# include +#endif + #ifdef _Py_MEMORY_SANITIZER # include #endif @@ -12859,6 +12864,79 @@ os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags) } #endif +#ifdef HAVE_EVENTFD +/*[clinic input] +os.eventfd + + initval: unsigned_int + flags: int(c_default="EFD_CLOEXEC") = EFD_CLOEXEC + +Creates and returns an event notification file descriptor. +[clinic start generated code]*/ + +static PyObject * +os_eventfd_impl(PyObject *module, unsigned int initval, int flags) +/*[clinic end generated code: output=ce9c9bbd1446f2de input=66203e3c50c4028b]*/ + +{ + /* initval is limited to uint32_t, internal counter is uint64_t */ + int fd; + Py_BEGIN_ALLOW_THREADS + fd = eventfd(initval, flags); + Py_END_ALLOW_THREADS + if (fd == -1) { + return PyErr_SetFromErrno(PyExc_OSError); + } + return PyLong_FromLong(fd); +} + +/*[clinic input] +os.eventfd_read + + fd: fildes + +Read eventfd value +[clinic start generated code]*/ + +static PyObject * +os_eventfd_read_impl(PyObject *module, int fd) +/*[clinic end generated code: output=8f2c7b59a3521fd1 input=110f8b57fa596afe]*/ +{ + eventfd_t value; + int result; + Py_BEGIN_ALLOW_THREADS + result = eventfd_read(fd, &value); + Py_END_ALLOW_THREADS + if (result == -1) { + return PyErr_SetFromErrno(PyExc_OSError); + } + return PyLong_FromUnsignedLongLong(value); +} + +/*[clinic input] +os.eventfd_write + + fd: fildes + value: unsigned_long_long + +Write eventfd value. +[clinic start generated code]*/ + +static PyObject * +os_eventfd_write_impl(PyObject *module, int fd, unsigned long long value) +/*[clinic end generated code: output=bebd9040bbf987f5 input=156de8555be5a949]*/ +{ + int result; + Py_BEGIN_ALLOW_THREADS + result = eventfd_write(fd, value); + Py_END_ALLOW_THREADS + if (result == -1) { + return PyErr_SetFromErrno(PyExc_OSError); + } + Py_RETURN_NONE; +} +#endif /* HAVE_EVENTFD */ + /* Terminal size querying */ PyDoc_STRVAR(TerminalSize_docstring, @@ -14619,6 +14697,9 @@ static PyMethodDef posix_methods[] = { OS_FSPATH_METHODDEF OS_GETRANDOM_METHODDEF OS_MEMFD_CREATE_METHODDEF + OS_EVENTFD_METHODDEF + OS_EVENTFD_READ_METHODDEF + OS_EVENTFD_WRITE_METHODDEF OS__ADD_DLL_DIRECTORY_METHODDEF OS__REMOVE_DLL_DIRECTORY_METHODDEF OS_WAITSTATUS_TO_EXITCODE_METHODDEF @@ -15127,6 +15208,12 @@ all_ins(PyObject *m) #ifdef MFD_HUGE_16GB if (PyModule_AddIntMacro(m, MFD_HUGE_16GB)) return -1; #endif +#endif /* HAVE_MEMFD_CREATE */ + +#ifdef HAVE_EVENTFD + if (PyModule_AddIntMacro(m, EFD_CLOEXEC)) return -1; + if (PyModule_AddIntMacro(m, EFD_NONBLOCK)) return -1; + if (PyModule_AddIntMacro(m, EFD_SEMAPHORE)) return -1; #endif #if defined(__APPLE__) @@ -15220,6 +15307,10 @@ static const struct have_function { int (*probe)(void); } have_functions[] = { +#ifdef HAVE_EVENTFD + {"HAVE_EVENTFD", NULL}, +#endif + #ifdef HAVE_FACCESSAT { "HAVE_FACCESSAT", probe_faccessat }, #endif diff --git a/configure b/configure index 68d692d0f6785c..b8b056e4033194 100755 --- a/configure +++ b/configure @@ -8032,7 +8032,8 @@ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ linux/tipc.h linux/random.h spawn.h util.h alloca.h endian.h \ -sys/endian.h sys/sysmacros.h linux/memfd.h linux/wait.h sys/memfd.h sys/mman.h +sys/endian.h sys/sysmacros.h linux/memfd.h linux/wait.h sys/memfd.h \ +sys/mman.h sys/eventfd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" @@ -12098,6 +12099,36 @@ $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for eventfd" >&5 +$as_echo_n "checking for eventfd... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef HAVE_SYS_EVENTFD_H +#include +#endif + +int +main () +{ +int x = eventfd(0, EFD_CLOEXEC) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define HAVE_EVENTFD 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + # On some systems (eg. FreeBSD 5), we would find a definition of the # functions ctermid_r, setgroups in the library, but no prototype # (e.g. because we use _XOPEN_SOURCE). See whether we can take their diff --git a/configure.ac b/configure.ac index 1edafc342b7120..e499cb4da023ec 100644 --- a/configure.ac +++ b/configure.ac @@ -2210,7 +2210,8 @@ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ linux/tipc.h linux/random.h spawn.h util.h alloca.h endian.h \ -sys/endian.h sys/sysmacros.h linux/memfd.h linux/wait.h sys/memfd.h sys/mman.h) +sys/endian.h sys/sysmacros.h linux/memfd.h linux/wait.h sys/memfd.h \ +sys/mman.h sys/eventfd.h) AC_HEADER_DIRENT AC_HEADER_MAJOR @@ -3803,6 +3804,17 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ [AC_MSG_RESULT(no) ]) +AC_MSG_CHECKING(for eventfd) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#ifdef HAVE_SYS_EVENTFD_H +#include +#endif +]], [[int x = eventfd(0, EFD_CLOEXEC)]])], + [AC_DEFINE(HAVE_EVENTFD, 1, Define if you have the 'eventfd' function.) + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) +]) + # On some systems (eg. FreeBSD 5), we would find a definition of the # functions ctermid_r, setgroups in the library, but no prototype # (e.g. because we use _XOPEN_SOURCE). See whether we can take their diff --git a/pyconfig.h.in b/pyconfig.h.in index d71ad3fdc8684c..8a5e9455eca76c 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -308,6 +308,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H +/* Define if you have the 'eventfd' function. */ +#undef HAVE_EVENTFD + /* Define to 1 if you have the `execv' function. */ #undef HAVE_EXECV @@ -1119,6 +1122,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_EPOLL_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_EVENTFD_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_EVENT_H From 7e0d38e8b64cf5f4123eedae0908eed2caf9a3cb Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 13 Nov 2020 22:24:36 +0000 Subject: [PATCH 0531/1261] bpo-40754: Adds _testinternalcapi to Windows installer for test suite (GH-23271) --- .../next/Tests/2020-11-13-21-51-34.bpo-40754.Ekoxkg.rst | 1 + Tools/msi/test/test_files.wxs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-11-13-21-51-34.bpo-40754.Ekoxkg.rst diff --git a/Misc/NEWS.d/next/Tests/2020-11-13-21-51-34.bpo-40754.Ekoxkg.rst b/Misc/NEWS.d/next/Tests/2020-11-13-21-51-34.bpo-40754.Ekoxkg.rst new file mode 100644 index 00000000000000..4bd423b54a4499 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-11-13-21-51-34.bpo-40754.Ekoxkg.rst @@ -0,0 +1 @@ +Include ``_testinternalcapi`` module in Windows installer for test suite diff --git a/Tools/msi/test/test_files.wxs b/Tools/msi/test/test_files.wxs index 82a9115f759023..9127ce894819e5 100644 --- a/Tools/msi/test/test_files.wxs +++ b/Tools/msi/test/test_files.wxs @@ -1,6 +1,6 @@ - + - + From ffc034ec03fbc5720553d97319407b8feafb3983 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 13 Nov 2020 15:14:58 -0800 Subject: [PATCH 0532/1261] bpo-42131: Add PEP 451-related methods to zipimport (GH-23187) Specifically, find_spec(), create_module(), and exec_module(). Co-authored-by: Nick Coghlan --- Doc/library/zipimport.rst | 46 +- Doc/whatsnew/3.10.rst | 7 + Lib/test/test_zipimport.py | 71 +- Lib/zipimport.py | 34 +- .../2020-11-06-18-20-47.bpo-42131.l2rjjG.rst | 5 + Python/importlib_zipimport.h | 1933 +++++++++-------- 6 files changed, 1131 insertions(+), 965 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-06-18-20-47.bpo-42131.l2rjjG.rst diff --git a/Doc/library/zipimport.rst b/Doc/library/zipimport.rst index 8ac3fb16bdb90d..8d579f21c7e8b0 100644 --- a/Doc/library/zipimport.rst +++ b/Doc/library/zipimport.rst @@ -44,8 +44,9 @@ doesn't contain :file:`.pyc` files, importing may be rather slow. follows the specification in :pep:`273`, but uses an implementation written by Just van Rossum that uses the import hooks described in :pep:`302`. - :pep:`302` - New Import Hooks - The PEP to add the import hooks that help this module work. + :mod:`importlib` - The implementation of the import machinery + Package providing the relevant protocols for all importers to + implement. This module defines an exception: @@ -73,7 +74,31 @@ zipimporter Objects :exc:`ZipImportError` is raised if *archivepath* doesn't point to a valid ZIP archive. - .. method:: find_module(fullname[, path]) + .. method:: create_module(spec) + + Implementation of :meth:`importlib.abc.Loader.create_module` that returns + :const:`None` to explicitly request the default semantics. + + .. versionadded:: 3.10 + + + .. method:: exec_module(module) + + Implementation of :meth:`importlib.abc.Loader.exec_module`. + + .. versionadded:: 3.10 + + + .. method:: find_loader(fullname, path=None) + + An implementation of :meth:`importlib.abc.PathEntryFinder.find_loader`. + + .. deprecated:: 3.10 + + Use :meth:`find_spec` instead. + + + .. method:: find_module(fullname, path=None) Search for a module specified by *fullname*. *fullname* must be the fully qualified (dotted) module name. It returns the zipimporter instance itself @@ -81,6 +106,17 @@ zipimporter Objects *path* argument is ignored---it's there for compatibility with the importer protocol. + .. deprecated:: 3.10 + + Use :meth:`find_spec` instead. + + + .. method:: find_spec(fullname, target=None) + + An implementation of :meth:`importlib.abc.PathEntryFinder.find_spec`. + + .. versionadded:: 3.10 + .. method:: get_code(fullname) @@ -126,6 +162,10 @@ zipimporter Objects qualified (dotted) module name. It returns the imported module, or raises :exc:`ZipImportError` if it wasn't found. + .. deprecated:: 3.10 + + Use :meth:`exec_module` instead. + .. attribute:: archive diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index c1ce5f3cdc2a10..b8e6843c4b54f9 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -303,6 +303,13 @@ Add a :class:`~xml.sax.handler.LexicalHandler` class to the :mod:`xml.sax.handler` module. (Contributed by Jonathan Gossage and Zackery Spytz in :issue:`35018`.) +zipimport +--------- +Add methods related to :pep:`451`: :meth:`~zipimport.zipimporter.find_spec`, +:meth:`zipimport.zipimporter.create_module`, and +:meth:`zipimport.zipimporter.exec_module`. +(Contributed by Brett Cannon in :issue:`42131`. + Optimizations ============= diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index 8df7489f754d3f..be0a198010cec1 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -450,8 +450,9 @@ def testZipImporterMethods(self): zi = zipimport.zipimporter(TEMP_ZIP) self.assertEqual(zi.archive, TEMP_ZIP) - self.assertEqual(zi.is_package(TESTPACK), True) + self.assertTrue(zi.is_package(TESTPACK)) + # PEP 302 find_mod = zi.find_module('spam') self.assertIsNotNone(find_mod) self.assertIsInstance(find_mod, zipimport.zipimporter) @@ -462,25 +463,39 @@ def testZipImporterMethods(self): mod = zi.load_module(TESTPACK) self.assertEqual(zi.get_filename(TESTPACK), mod.__file__) + # PEP 451 + spec = zi.find_spec('spam') + self.assertIsNotNone(spec) + self.assertIsInstance(spec.loader, zipimport.zipimporter) + self.assertFalse(spec.loader.is_package('spam')) + exec_mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(exec_mod) + self.assertEqual(spec.loader.get_filename('spam'), exec_mod.__file__) + + spec = zi.find_spec(TESTPACK) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + self.assertEqual(zi.get_filename(TESTPACK), mod.__file__) + existing_pack_path = importlib.import_module(TESTPACK).__path__[0] expected_path_path = os.path.join(TEMP_ZIP, TESTPACK) self.assertEqual(existing_pack_path, expected_path_path) - self.assertEqual(zi.is_package(packdir + '__init__'), False) - self.assertEqual(zi.is_package(packdir + TESTPACK2), True) - self.assertEqual(zi.is_package(packdir2 + TESTMOD), False) + self.assertFalse(zi.is_package(packdir + '__init__')) + self.assertTrue(zi.is_package(packdir + TESTPACK2)) + self.assertFalse(zi.is_package(packdir2 + TESTMOD)) mod_path = packdir2 + TESTMOD mod_name = module_path_to_dotted_name(mod_path) mod = importlib.import_module(mod_name) self.assertTrue(mod_name in sys.modules) - self.assertEqual(zi.get_source(TESTPACK), None) - self.assertEqual(zi.get_source(mod_path), None) + self.assertIsNone(zi.get_source(TESTPACK)) + self.assertIsNone(zi.get_source(mod_path)) self.assertEqual(zi.get_filename(mod_path), mod.__file__) # To pass in the module name instead of the path, we must use the # right importer - loader = mod.__loader__ - self.assertEqual(loader.get_source(mod_name), None) + loader = mod.__spec__.loader + self.assertIsNone(loader.get_source(mod_name)) self.assertEqual(loader.get_filename(mod_name), mod.__file__) # test prefix and archivepath members @@ -505,17 +520,22 @@ def testZipImporterMethodsInSubDirectory(self): zi = zipimport.zipimporter(TEMP_ZIP + os.sep + packdir) self.assertEqual(zi.archive, TEMP_ZIP) self.assertEqual(zi.prefix, packdir) - self.assertEqual(zi.is_package(TESTPACK2), True) + self.assertTrue(zi.is_package(TESTPACK2)) + # PEP 302 mod = zi.load_module(TESTPACK2) self.assertEqual(zi.get_filename(TESTPACK2), mod.__file__) + # PEP 451 + spec = zi.find_spec(TESTPACK2) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + self.assertEqual(spec.loader.get_filename(TESTPACK2), mod.__file__) - self.assertEqual( - zi.is_package(TESTPACK2 + os.sep + '__init__'), False) - self.assertEqual( - zi.is_package(TESTPACK2 + os.sep + TESTMOD), False) + self.assertFalse(zi.is_package(TESTPACK2 + os.sep + '__init__')) + self.assertFalse(zi.is_package(TESTPACK2 + os.sep + TESTMOD)) pkg_path = TEMP_ZIP + os.sep + packdir + TESTPACK2 zi2 = zipimport.zipimporter(pkg_path) + # PEP 302 find_mod_dotted = zi2.find_module(TESTMOD) self.assertIsNotNone(find_mod_dotted) self.assertIsInstance(find_mod_dotted, zipimport.zipimporter) @@ -524,17 +544,27 @@ def testZipImporterMethodsInSubDirectory(self): self.assertEqual( find_mod_dotted.get_filename(TESTMOD), load_mod.__file__) + # PEP 451 + spec = zi2.find_spec(TESTMOD) + self.assertIsNotNone(spec) + self.assertIsInstance(spec.loader, zipimport.zipimporter) + self.assertFalse(spec.loader.is_package(TESTMOD)) + load_mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(load_mod) + self.assertEqual( + spec.loader.get_filename(TESTMOD), load_mod.__file__) + mod_path = TESTPACK2 + os.sep + TESTMOD mod_name = module_path_to_dotted_name(mod_path) mod = importlib.import_module(mod_name) self.assertTrue(mod_name in sys.modules) - self.assertEqual(zi.get_source(TESTPACK2), None) - self.assertEqual(zi.get_source(mod_path), None) + self.assertIsNone(zi.get_source(TESTPACK2)) + self.assertIsNone(zi.get_source(mod_path)) self.assertEqual(zi.get_filename(mod_path), mod.__file__) # To pass in the module name instead of the path, we must use the # right importer. loader = mod.__loader__ - self.assertEqual(loader.get_source(mod_name), None) + self.assertIsNone(loader.get_source(mod_name)) self.assertEqual(loader.get_filename(mod_name), mod.__file__) def testGetData(self): @@ -655,7 +685,9 @@ def testUnencodable(self): zinfo = ZipInfo(TESTMOD + ".py", time.localtime(NOW)) zinfo.compress_type = self.compression z.writestr(zinfo, test_src) - zipimport.zipimporter(filename).load_module(TESTMOD) + spec = zipimport.zipimporter(filename).find_spec(TESTMOD) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) def testBytesPath(self): filename = os_helper.TESTFN + ".zip" @@ -747,6 +779,8 @@ def _testBogusZipFile(self): try: self.assertRaises(TypeError, z.find_module, None) + self.assertRaises(TypeError, z.find_spec, None) + self.assertRaises(TypeError, z.exec_module, None) self.assertRaises(TypeError, z.load_module, None) self.assertRaises(TypeError, z.is_package, None) self.assertRaises(TypeError, z.get_code, None) @@ -754,7 +788,8 @@ def _testBogusZipFile(self): self.assertRaises(TypeError, z.get_source, None) error = zipimport.ZipImportError - self.assertEqual(z.find_module('abc'), None) + self.assertIsNone(z.find_module('abc')) + self.assertIsNone(z.find_spec('abc')) self.assertRaises(error, z.load_module, 'abc') self.assertRaises(error, z.get_code, 'abc') diff --git a/Lib/zipimport.py b/Lib/zipimport.py index 080e0c4d986d63..2e5188a4a0aa54 100644 --- a/Lib/zipimport.py +++ b/Lib/zipimport.py @@ -42,7 +42,7 @@ class ZipImportError(ImportError): STRING_END_ARCHIVE = b'PK\x05\x06' MAX_COMMENT_LEN = (1 << 16) - 1 -class zipimporter: +class zipimporter(_bootstrap_external._LoaderBasics): """zipimporter(archivepath) -> zipimporter object Create a new zipimporter instance. 'archivepath' must be a path to @@ -115,6 +115,8 @@ def find_loader(self, fullname, path=None): full path name if it's possibly a portion of a namespace package, or None otherwise. The optional 'path' argument is ignored -- it's there for compatibility with the importer protocol. + + Deprecated since Python 3.10. Use find_spec() instead. """ mi = _get_module_info(self, fullname) if mi is not None: @@ -146,9 +148,37 @@ def find_module(self, fullname, path=None): instance itself if the module was found, or None if it wasn't. The optional 'path' argument is ignored -- it's there for compatibility with the importer protocol. + + Deprecated since Python 3.10. Use find_spec() instead. """ return self.find_loader(fullname, path)[0] + def find_spec(self, fullname, target=None): + """Create a ModuleSpec for the specified module. + + Returns None if the module cannot be found. + """ + module_info = _get_module_info(self, fullname) + if module_info is not None: + return _bootstrap.spec_from_loader(fullname, self, is_package=module_info) + else: + # Not a module or regular package. See if this is a directory, and + # therefore possibly a portion of a namespace package. + + # We're only interested in the last path component of fullname + # earlier components are recorded in self.prefix. + modpath = _get_module_path(self, fullname) + if _is_dir(self, modpath): + # This is possibly a portion of a namespace + # package. Return the string representing its path, + # without a trailing separator. + path = f'{self.archive}{path_sep}{modpath}' + spec = _bootstrap.ModuleSpec(name=fullname, loader=None, + is_package=True) + spec.submodule_search_locations.append(path) + return spec + else: + return None def get_code(self, fullname): """get_code(fullname) -> code object. @@ -237,6 +267,8 @@ def load_module(self, fullname): Load the module specified by 'fullname'. 'fullname' must be the fully qualified (dotted) module name. It returns the imported module, or raises ZipImportError if it wasn't found. + + Deprecated since Python 3.10. use exec_module() instead. """ code, ispackage, modpath = _get_module_code(self, fullname) mod = sys.modules.get(fullname) diff --git a/Misc/NEWS.d/next/Library/2020-11-06-18-20-47.bpo-42131.l2rjjG.rst b/Misc/NEWS.d/next/Library/2020-11-06-18-20-47.bpo-42131.l2rjjG.rst new file mode 100644 index 00000000000000..4381f5e9754c21 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-06-18-20-47.bpo-42131.l2rjjG.rst @@ -0,0 +1,5 @@ +Implement PEP 451/spec methods on zipimport.zipimporter: find_spec(), +create_module(), and exec_module(). + +This also allows for the documented deprecation of find_loader(), +find_module(), and load_module(). diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index 0a07f148028a93..1e6d71ec6df809 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -1,7 +1,7 @@ /* Auto-generated by Programs/_freeze_importlib.c */ const unsigned char _Py_M__zipimport[] = { 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,64,0,0,0,115,68,1,0,0,100,0, + 0,4,0,0,0,64,0,0,0,115,72,1,0,0,100,0, 90,0,100,1,100,2,108,1,90,2,100,1,100,3,108,1, 109,3,90,3,109,4,90,4,1,0,100,1,100,2,108,5, 90,6,100,1,100,2,108,7,90,7,100,1,100,2,108,8, @@ -11,950 +11,997 @@ const unsigned char _Py_M__zipimport[] = { 133,2,25,0,90,15,71,0,100,7,100,4,132,0,100,4, 101,16,131,3,90,17,105,0,90,18,101,19,101,10,131,1, 90,20,100,8,90,21,100,9,90,22,100,10,90,23,71,0, - 100,11,100,5,132,0,100,5,131,2,90,24,101,13,100,12, - 23,0,100,13,100,13,102,3,101,13,100,14,23,0,100,15, - 100,13,102,3,100,16,100,17,102,4,90,25,100,18,100,19, - 132,0,90,26,100,20,100,21,132,0,90,27,100,22,100,23, - 132,0,90,28,100,24,100,25,132,0,90,29,100,26,90,30, - 100,15,97,31,100,27,100,28,132,0,90,32,100,29,100,30, - 132,0,90,33,100,31,100,32,132,0,90,34,100,33,100,34, - 132,0,90,35,101,19,101,35,106,36,131,1,90,37,100,35, - 100,36,132,0,90,38,100,37,100,38,132,0,90,39,100,39, - 100,40,132,0,90,40,100,41,100,42,132,0,90,41,100,43, - 100,44,132,0,90,42,100,45,100,46,132,0,90,43,100,2, - 83,0,41,47,97,80,2,0,0,122,105,112,105,109,112,111, - 114,116,32,112,114,111,118,105,100,101,115,32,115,117,112,112, - 111,114,116,32,102,111,114,32,105,109,112,111,114,116,105,110, - 103,32,80,121,116,104,111,110,32,109,111,100,117,108,101,115, - 32,102,114,111,109,32,90,105,112,32,97,114,99,104,105,118, - 101,115,46,10,10,84,104,105,115,32,109,111,100,117,108,101, - 32,101,120,112,111,114,116,115,32,116,104,114,101,101,32,111, - 98,106,101,99,116,115,58,10,45,32,122,105,112,105,109,112, - 111,114,116,101,114,58,32,97,32,99,108,97,115,115,59,32, - 105,116,115,32,99,111,110,115,116,114,117,99,116,111,114,32, - 116,97,107,101,115,32,97,32,112,97,116,104,32,116,111,32, - 97,32,90,105,112,32,97,114,99,104,105,118,101,46,10,45, - 32,90,105,112,73,109,112,111,114,116,69,114,114,111,114,58, - 32,101,120,99,101,112,116,105,111,110,32,114,97,105,115,101, - 100,32,98,121,32,122,105,112,105,109,112,111,114,116,101,114, - 32,111,98,106,101,99,116,115,46,32,73,116,39,115,32,97, - 10,32,32,115,117,98,99,108,97,115,115,32,111,102,32,73, - 109,112,111,114,116,69,114,114,111,114,44,32,115,111,32,105, - 116,32,99,97,110,32,98,101,32,99,97,117,103,104,116,32, - 97,115,32,73,109,112,111,114,116,69,114,114,111,114,44,32, - 116,111,111,46,10,45,32,95,122,105,112,95,100,105,114,101, - 99,116,111,114,121,95,99,97,99,104,101,58,32,97,32,100, - 105,99,116,44,32,109,97,112,112,105,110,103,32,97,114,99, - 104,105,118,101,32,112,97,116,104,115,32,116,111,32,122,105, - 112,32,100,105,114,101,99,116,111,114,121,10,32,32,105,110, - 102,111,32,100,105,99,116,115,44,32,97,115,32,117,115,101, - 100,32,105,110,32,122,105,112,105,109,112,111,114,116,101,114, - 46,95,102,105,108,101,115,46,10,10,73,116,32,105,115,32, - 117,115,117,97,108,108,121,32,110,111,116,32,110,101,101,100, - 101,100,32,116,111,32,117,115,101,32,116,104,101,32,122,105, - 112,105,109,112,111,114,116,32,109,111,100,117,108,101,32,101, - 120,112,108,105,99,105,116,108,121,59,32,105,116,32,105,115, - 10,117,115,101,100,32,98,121,32,116,104,101,32,98,117,105, - 108,116,105,110,32,105,109,112,111,114,116,32,109,101,99,104, - 97,110,105,115,109,32,102,111,114,32,115,121,115,46,112,97, - 116,104,32,105,116,101,109,115,32,116,104,97,116,32,97,114, - 101,32,112,97,116,104,115,10,116,111,32,90,105,112,32,97, - 114,99,104,105,118,101,115,46,10,233,0,0,0,0,78,41, - 2,218,14,95,117,110,112,97,99,107,95,117,105,110,116,49, - 54,218,14,95,117,110,112,97,99,107,95,117,105,110,116,51, - 50,218,14,90,105,112,73,109,112,111,114,116,69,114,114,111, - 114,218,11,122,105,112,105,109,112,111,114,116,101,114,233,1, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,64,0,0,0,115,12,0,0, - 0,101,0,90,1,100,0,90,2,100,1,83,0,41,2,114, - 3,0,0,0,78,41,3,218,8,95,95,110,97,109,101,95, - 95,218,10,95,95,109,111,100,117,108,101,95,95,218,12,95, - 95,113,117,97,108,110,97,109,101,95,95,169,0,114,9,0, - 0,0,114,9,0,0,0,250,18,60,102,114,111,122,101,110, - 32,122,105,112,105,109,112,111,114,116,62,114,3,0,0,0, - 33,0,0,0,115,6,0,0,0,8,0,4,1,255,128,233, - 22,0,0,0,115,4,0,0,0,80,75,5,6,105,255,255, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,64,0,0,0,115,108,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,25,100,5,100,6,132,1,90,5,100,26, - 100,7,100,8,132,1,90,6,100,9,100,10,132,0,90,7, - 100,11,100,12,132,0,90,8,100,13,100,14,132,0,90,9, - 100,15,100,16,132,0,90,10,100,17,100,18,132,0,90,11, - 100,19,100,20,132,0,90,12,100,21,100,22,132,0,90,13, - 100,23,100,24,132,0,90,14,100,4,83,0,41,27,114,4, - 0,0,0,97,255,1,0,0,122,105,112,105,109,112,111,114, - 116,101,114,40,97,114,99,104,105,118,101,112,97,116,104,41, - 32,45,62,32,122,105,112,105,109,112,111,114,116,101,114,32, - 111,98,106,101,99,116,10,10,32,32,32,32,67,114,101,97, - 116,101,32,97,32,110,101,119,32,122,105,112,105,109,112,111, - 114,116,101,114,32,105,110,115,116,97,110,99,101,46,32,39, - 97,114,99,104,105,118,101,112,97,116,104,39,32,109,117,115, - 116,32,98,101,32,97,32,112,97,116,104,32,116,111,10,32, - 32,32,32,97,32,122,105,112,102,105,108,101,44,32,111,114, - 32,116,111,32,97,32,115,112,101,99,105,102,105,99,32,112, - 97,116,104,32,105,110,115,105,100,101,32,97,32,122,105,112, - 102,105,108,101,46,32,70,111,114,32,101,120,97,109,112,108, - 101,44,32,105,116,32,99,97,110,32,98,101,10,32,32,32, - 32,39,47,116,109,112,47,109,121,105,109,112,111,114,116,46, - 122,105,112,39,44,32,111,114,32,39,47,116,109,112,47,109, - 121,105,109,112,111,114,116,46,122,105,112,47,109,121,100,105, - 114,101,99,116,111,114,121,39,44,32,105,102,32,109,121,100, - 105,114,101,99,116,111,114,121,32,105,115,32,97,10,32,32, - 32,32,118,97,108,105,100,32,100,105,114,101,99,116,111,114, - 121,32,105,110,115,105,100,101,32,116,104,101,32,97,114,99, - 104,105,118,101,46,10,10,32,32,32,32,39,90,105,112,73, - 109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,97, - 105,115,101,100,32,105,102,32,39,97,114,99,104,105,118,101, - 112,97,116,104,39,32,100,111,101,115,110,39,116,32,112,111, - 105,110,116,32,116,111,32,97,32,118,97,108,105,100,32,90, - 105,112,10,32,32,32,32,97,114,99,104,105,118,101,46,10, - 10,32,32,32,32,84,104,101,32,39,97,114,99,104,105,118, - 101,39,32,97,116,116,114,105,98,117,116,101,32,111,102,32, - 122,105,112,105,109,112,111,114,116,101,114,32,111,98,106,101, - 99,116,115,32,99,111,110,116,97,105,110,115,32,116,104,101, - 32,110,97,109,101,32,111,102,32,116,104,101,10,32,32,32, - 32,122,105,112,102,105,108,101,32,116,97,114,103,101,116,101, - 100,46,10,32,32,32,32,99,2,0,0,0,0,0,0,0, - 0,0,0,0,8,0,0,0,9,0,0,0,67,0,0,0, - 115,28,1,0,0,116,0,124,1,116,1,131,2,115,28,100, - 1,100,0,108,2,125,2,124,2,160,3,124,1,161,1,125, - 1,124,1,115,44,116,4,100,2,124,1,100,3,141,2,130, - 1,116,5,114,60,124,1,160,6,116,5,116,7,161,2,125, - 1,103,0,125,3,122,14,116,8,160,9,124,1,161,1,125, - 4,87,0,110,70,4,0,116,10,116,11,102,2,121,148,1, - 0,1,0,1,0,116,8,160,12,124,1,161,1,92,2,125, - 5,125,6,124,5,124,1,107,2,114,130,116,4,100,4,124, - 1,100,3,141,2,130,1,124,5,125,1,124,3,160,13,124, - 6,161,1,1,0,89,0,113,64,48,0,124,4,106,14,100, - 5,64,0,100,6,107,3,114,176,116,4,100,4,124,1,100, - 3,141,2,130,1,122,12,116,15,124,1,25,0,125,7,87, - 0,110,34,4,0,116,16,121,222,1,0,1,0,1,0,116, - 17,124,1,131,1,125,7,124,7,116,15,124,1,60,0,89, - 0,110,2,48,0,124,7,124,0,95,18,124,1,124,0,95, - 19,116,8,106,20,124,3,100,0,100,0,100,7,133,3,25, - 0,142,0,124,0,95,21,124,0,106,21,144,1,114,24,124, - 0,4,0,106,21,116,7,55,0,2,0,95,21,100,0,83, - 0,41,8,78,114,0,0,0,0,122,21,97,114,99,104,105, - 118,101,32,112,97,116,104,32,105,115,32,101,109,112,116,121, - 169,1,218,4,112,97,116,104,122,14,110,111,116,32,97,32, - 90,105,112,32,102,105,108,101,105,0,240,0,0,105,0,128, - 0,0,233,255,255,255,255,41,22,218,10,105,115,105,110,115, - 116,97,110,99,101,218,3,115,116,114,218,2,111,115,90,8, - 102,115,100,101,99,111,100,101,114,3,0,0,0,218,12,97, - 108,116,95,112,97,116,104,95,115,101,112,218,7,114,101,112, - 108,97,99,101,218,8,112,97,116,104,95,115,101,112,218,19, - 95,98,111,111,116,115,116,114,97,112,95,101,120,116,101,114, - 110,97,108,90,10,95,112,97,116,104,95,115,116,97,116,218, - 7,79,83,69,114,114,111,114,218,10,86,97,108,117,101,69, - 114,114,111,114,90,11,95,112,97,116,104,95,115,112,108,105, - 116,218,6,97,112,112,101,110,100,90,7,115,116,95,109,111, - 100,101,218,20,95,122,105,112,95,100,105,114,101,99,116,111, - 114,121,95,99,97,99,104,101,218,8,75,101,121,69,114,114, - 111,114,218,15,95,114,101,97,100,95,100,105,114,101,99,116, - 111,114,121,218,6,95,102,105,108,101,115,218,7,97,114,99, - 104,105,118,101,218,10,95,112,97,116,104,95,106,111,105,110, - 218,6,112,114,101,102,105,120,41,8,218,4,115,101,108,102, - 114,13,0,0,0,114,17,0,0,0,114,31,0,0,0,90, - 2,115,116,90,7,100,105,114,110,97,109,101,90,8,98,97, - 115,101,110,97,109,101,218,5,102,105,108,101,115,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,8,95,95, - 105,110,105,116,95,95,63,0,0,0,115,60,0,0,0,10, - 1,8,1,10,1,4,1,12,1,4,1,12,1,4,2,2, - 2,14,1,16,1,14,3,8,1,12,1,4,1,16,1,14, - 3,12,2,2,3,12,1,12,1,8,1,14,1,6,1,6, - 1,22,2,8,1,14,1,4,128,255,128,122,20,122,105,112, - 105,109,112,111,114,116,101,114,46,95,95,105,110,105,116,95, - 95,78,99,3,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,4,0,0,0,67,0,0,0,115,78,0,0,0, - 116,0,124,0,124,1,131,2,125,3,124,3,100,1,117,1, - 114,26,124,0,103,0,102,2,83,0,116,1,124,0,124,1, - 131,2,125,4,116,2,124,0,124,4,131,2,114,70,100,1, - 124,0,106,3,155,0,116,4,155,0,124,4,155,0,157,3, - 103,1,102,2,83,0,100,1,103,0,102,2,83,0,41,2, - 97,239,1,0,0,102,105,110,100,95,108,111,97,100,101,114, - 40,102,117,108,108,110,97,109,101,44,32,112,97,116,104,61, - 78,111,110,101,41,32,45,62,32,115,101,108,102,44,32,115, - 116,114,32,111,114,32,78,111,110,101,46,10,10,32,32,32, - 32,32,32,32,32,83,101,97,114,99,104,32,102,111,114,32, - 97,32,109,111,100,117,108,101,32,115,112,101,99,105,102,105, - 101,100,32,98,121,32,39,102,117,108,108,110,97,109,101,39, - 46,32,39,102,117,108,108,110,97,109,101,39,32,109,117,115, - 116,32,98,101,32,116,104,101,10,32,32,32,32,32,32,32, - 32,102,117,108,108,121,32,113,117,97,108,105,102,105,101,100, - 32,40,100,111,116,116,101,100,41,32,109,111,100,117,108,101, - 32,110,97,109,101,46,32,73,116,32,114,101,116,117,114,110, - 115,32,116,104,101,32,122,105,112,105,109,112,111,114,116,101, - 114,10,32,32,32,32,32,32,32,32,105,110,115,116,97,110, - 99,101,32,105,116,115,101,108,102,32,105,102,32,116,104,101, - 32,109,111,100,117,108,101,32,119,97,115,32,102,111,117,110, - 100,44,32,97,32,115,116,114,105,110,103,32,99,111,110,116, - 97,105,110,105,110,103,32,116,104,101,10,32,32,32,32,32, - 32,32,32,102,117,108,108,32,112,97,116,104,32,110,97,109, - 101,32,105,102,32,105,116,39,115,32,112,111,115,115,105,98, - 108,121,32,97,32,112,111,114,116,105,111,110,32,111,102,32, - 97,32,110,97,109,101,115,112,97,99,101,32,112,97,99,107, - 97,103,101,44,10,32,32,32,32,32,32,32,32,111,114,32, - 78,111,110,101,32,111,116,104,101,114,119,105,115,101,46,32, - 84,104,101,32,111,112,116,105,111,110,97,108,32,39,112,97, - 116,104,39,32,97,114,103,117,109,101,110,116,32,105,115,32, - 105,103,110,111,114,101,100,32,45,45,32,105,116,39,115,10, - 32,32,32,32,32,32,32,32,116,104,101,114,101,32,102,111, - 114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32, - 119,105,116,104,32,116,104,101,32,105,109,112,111,114,116,101, - 114,32,112,114,111,116,111,99,111,108,46,10,32,32,32,32, - 32,32,32,32,78,41,5,218,16,95,103,101,116,95,109,111, - 100,117,108,101,95,105,110,102,111,218,16,95,103,101,116,95, - 109,111,100,117,108,101,95,112,97,116,104,218,7,95,105,115, - 95,100,105,114,114,29,0,0,0,114,20,0,0,0,41,5, - 114,32,0,0,0,218,8,102,117,108,108,110,97,109,101,114, - 13,0,0,0,218,2,109,105,218,7,109,111,100,112,97,116, - 104,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,11,102,105,110,100,95,108,111,97,100,101,114,109,0,0, - 0,115,16,0,0,0,10,10,8,1,8,2,10,7,10,1, - 24,4,8,2,255,128,122,23,122,105,112,105,109,112,111,114, - 116,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99, - 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 4,0,0,0,67,0,0,0,115,16,0,0,0,124,0,160, - 0,124,1,124,2,161,2,100,1,25,0,83,0,41,2,97, - 139,1,0,0,102,105,110,100,95,109,111,100,117,108,101,40, - 102,117,108,108,110,97,109,101,44,32,112,97,116,104,61,78, - 111,110,101,41,32,45,62,32,115,101,108,102,32,111,114,32, - 78,111,110,101,46,10,10,32,32,32,32,32,32,32,32,83, - 101,97,114,99,104,32,102,111,114,32,97,32,109,111,100,117, - 108,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32, - 39,102,117,108,108,110,97,109,101,39,46,32,39,102,117,108, - 108,110,97,109,101,39,32,109,117,115,116,32,98,101,32,116, - 104,101,10,32,32,32,32,32,32,32,32,102,117,108,108,121, - 32,113,117,97,108,105,102,105,101,100,32,40,100,111,116,116, - 101,100,41,32,109,111,100,117,108,101,32,110,97,109,101,46, - 32,73,116,32,114,101,116,117,114,110,115,32,116,104,101,32, - 122,105,112,105,109,112,111,114,116,101,114,10,32,32,32,32, - 32,32,32,32,105,110,115,116,97,110,99,101,32,105,116,115, - 101,108,102,32,105,102,32,116,104,101,32,109,111,100,117,108, - 101,32,119,97,115,32,102,111,117,110,100,44,32,111,114,32, - 78,111,110,101,32,105,102,32,105,116,32,119,97,115,110,39, - 116,46,10,32,32,32,32,32,32,32,32,84,104,101,32,111, - 112,116,105,111,110,97,108,32,39,112,97,116,104,39,32,97, - 114,103,117,109,101,110,116,32,105,115,32,105,103,110,111,114, - 101,100,32,45,45,32,105,116,39,115,32,116,104,101,114,101, - 32,102,111,114,32,99,111,109,112,97,116,105,98,105,108,105, - 116,121,10,32,32,32,32,32,32,32,32,119,105,116,104,32, - 116,104,101,32,105,109,112,111,114,116,101,114,32,112,114,111, - 116,111,99,111,108,46,10,32,32,32,32,32,32,32,32,114, - 0,0,0,0,41,1,114,41,0,0,0,41,3,114,32,0, - 0,0,114,38,0,0,0,114,13,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,11,102,105,110, - 100,95,109,111,100,117,108,101,141,0,0,0,115,4,0,0, - 0,16,9,255,128,122,23,122,105,112,105,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,0,0,0,0,5,0,0,0,3, - 0,0,0,67,0,0,0,115,20,0,0,0,116,0,124,0, - 124,1,131,2,92,3,125,2,125,3,125,4,124,2,83,0, - 41,1,122,163,103,101,116,95,99,111,100,101,40,102,117,108, - 108,110,97,109,101,41,32,45,62,32,99,111,100,101,32,111, - 98,106,101,99,116,46,10,10,32,32,32,32,32,32,32,32, - 82,101,116,117,114,110,32,116,104,101,32,99,111,100,101,32, - 111,98,106,101,99,116,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,46, - 32,82,97,105,115,101,32,90,105,112,73,109,112,111,114,116, - 69,114,114,111,114,10,32,32,32,32,32,32,32,32,105,102, - 32,116,104,101,32,109,111,100,117,108,101,32,99,111,117,108, - 100,110,39,116,32,98,101,32,102,111,117,110,100,46,10,32, - 32,32,32,32,32,32,32,169,1,218,16,95,103,101,116,95, - 109,111,100,117,108,101,95,99,111,100,101,169,5,114,32,0, - 0,0,114,38,0,0,0,218,4,99,111,100,101,218,9,105, - 115,112,97,99,107,97,103,101,114,40,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,8,103,101, - 116,95,99,111,100,101,153,0,0,0,115,6,0,0,0,16, - 6,4,1,255,128,122,20,122,105,112,105,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,0,0,0,0,4,0,0,0,8,0,0,0, - 67,0,0,0,115,112,0,0,0,116,0,114,16,124,1,160, - 1,116,0,116,2,161,2,125,1,124,1,125,2,124,1,160, - 3,124,0,106,4,116,2,23,0,161,1,114,58,124,1,116, - 5,124,0,106,4,116,2,23,0,131,1,100,1,133,2,25, - 0,125,2,122,14,124,0,106,6,124,2,25,0,125,3,87, - 0,110,26,4,0,116,7,121,98,1,0,1,0,1,0,116, - 8,100,2,100,3,124,2,131,3,130,1,48,0,116,9,124, - 0,106,4,124,3,131,2,83,0,41,4,122,154,103,101,116, - 95,100,97,116,97,40,112,97,116,104,110,97,109,101,41,32, - 45,62,32,115,116,114,105,110,103,32,119,105,116,104,32,102, - 105,108,101,32,100,97,116,97,46,10,10,32,32,32,32,32, - 32,32,32,82,101,116,117,114,110,32,116,104,101,32,100,97, - 116,97,32,97,115,115,111,99,105,97,116,101,100,32,119,105, - 116,104,32,39,112,97,116,104,110,97,109,101,39,46,32,82, - 97,105,115,101,32,79,83,69,114,114,111,114,32,105,102,10, - 32,32,32,32,32,32,32,32,116,104,101,32,102,105,108,101, - 32,119,97,115,110,39,116,32,102,111,117,110,100,46,10,32, - 32,32,32,32,32,32,32,78,114,0,0,0,0,218,0,41, - 10,114,18,0,0,0,114,19,0,0,0,114,20,0,0,0, - 218,10,115,116,97,114,116,115,119,105,116,104,114,29,0,0, - 0,218,3,108,101,110,114,28,0,0,0,114,26,0,0,0, - 114,22,0,0,0,218,9,95,103,101,116,95,100,97,116,97, - 41,4,114,32,0,0,0,218,8,112,97,116,104,110,97,109, - 101,90,3,107,101,121,218,9,116,111,99,95,101,110,116,114, - 121,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,8,103,101,116,95,100,97,116,97,163,0,0,0,115,22, - 0,0,0,4,6,12,1,4,2,16,1,22,1,2,2,14, - 1,12,1,14,1,12,1,255,128,122,20,122,105,112,105,109, - 112,111,114,116,101,114,46,103,101,116,95,100,97,116,97,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 3,0,0,0,67,0,0,0,115,20,0,0,0,116,0,124, - 0,124,1,131,2,92,3,125,2,125,3,125,4,124,4,83, - 0,41,1,122,106,103,101,116,95,102,105,108,101,110,97,109, - 101,40,102,117,108,108,110,97,109,101,41,32,45,62,32,102, - 105,108,101,110,97,109,101,32,115,116,114,105,110,103,46,10, - 10,32,32,32,32,32,32,32,32,82,101,116,117,114,110,32, - 116,104,101,32,102,105,108,101,110,97,109,101,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,46,10,32,32,32,32,32,32,32,32,114, - 43,0,0,0,114,45,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,12,103,101,116,95,102,105, - 108,101,110,97,109,101,184,0,0,0,115,6,0,0,0,16, - 7,4,1,255,128,122,24,122,105,112,105,109,112,111,114,116, - 101,114,46,103,101,116,95,102,105,108,101,110,97,109,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, - 8,0,0,0,67,0,0,0,115,126,0,0,0,116,0,124, - 0,124,1,131,2,125,2,124,2,100,1,117,0,114,36,116, - 1,100,2,124,1,155,2,157,2,124,1,100,3,141,2,130, - 1,116,2,124,0,124,1,131,2,125,3,124,2,114,64,116, - 3,160,4,124,3,100,4,161,2,125,4,110,10,124,3,155, - 0,100,5,157,2,125,4,122,14,124,0,106,5,124,4,25, - 0,125,5,87,0,110,20,4,0,116,6,121,108,1,0,1, - 0,1,0,89,0,100,1,83,0,48,0,116,7,124,0,106, - 8,124,5,131,2,160,9,161,0,83,0,41,6,122,253,103, - 101,116,95,115,111,117,114,99,101,40,102,117,108,108,110,97, - 109,101,41,32,45,62,32,115,111,117,114,99,101,32,115,116, - 114,105,110,103,46,10,10,32,32,32,32,32,32,32,32,82, - 101,116,117,114,110,32,116,104,101,32,115,111,117,114,99,101, - 32,99,111,100,101,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,46,32, - 82,97,105,115,101,32,90,105,112,73,109,112,111,114,116,69, - 114,114,111,114,10,32,32,32,32,32,32,32,32,105,102,32, - 116,104,101,32,109,111,100,117,108,101,32,99,111,117,108,100, - 110,39,116,32,98,101,32,102,111,117,110,100,44,32,114,101, - 116,117,114,110,32,78,111,110,101,32,105,102,32,116,104,101, - 32,97,114,99,104,105,118,101,32,100,111,101,115,10,32,32, - 32,32,32,32,32,32,99,111,110,116,97,105,110,32,116,104, - 101,32,109,111,100,117,108,101,44,32,98,117,116,32,104,97, - 115,32,110,111,32,115,111,117,114,99,101,32,102,111,114,32, - 105,116,46,10,32,32,32,32,32,32,32,32,78,250,18,99, - 97,110,39,116,32,102,105,110,100,32,109,111,100,117,108,101, - 32,169,1,218,4,110,97,109,101,250,11,95,95,105,110,105, - 116,95,95,46,112,121,250,3,46,112,121,41,10,114,35,0, - 0,0,114,3,0,0,0,114,36,0,0,0,114,21,0,0, - 0,114,30,0,0,0,114,28,0,0,0,114,26,0,0,0, - 114,52,0,0,0,114,29,0,0,0,218,6,100,101,99,111, - 100,101,41,6,114,32,0,0,0,114,38,0,0,0,114,39, - 0,0,0,114,13,0,0,0,218,8,102,117,108,108,112,97, - 116,104,114,54,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,10,103,101,116,95,115,111,117,114, - 99,101,195,0,0,0,115,26,0,0,0,10,7,8,1,18, - 1,10,2,4,1,14,1,10,2,2,2,14,1,12,1,8, - 2,16,1,255,128,122,22,122,105,112,105,109,112,111,114,116, - 101,114,46,103,101,116,95,115,111,117,114,99,101,99,2,0, + 100,11,100,5,132,0,100,5,101,2,106,24,131,3,90,25, + 101,13,100,12,23,0,100,13,100,13,102,3,101,13,100,14, + 23,0,100,15,100,13,102,3,100,16,100,17,102,4,90,26, + 100,18,100,19,132,0,90,27,100,20,100,21,132,0,90,28, + 100,22,100,23,132,0,90,29,100,24,100,25,132,0,90,30, + 100,26,90,31,100,15,97,32,100,27,100,28,132,0,90,33, + 100,29,100,30,132,0,90,34,100,31,100,32,132,0,90,35, + 100,33,100,34,132,0,90,36,101,19,101,36,106,37,131,1, + 90,38,100,35,100,36,132,0,90,39,100,37,100,38,132,0, + 90,40,100,39,100,40,132,0,90,41,100,41,100,42,132,0, + 90,42,100,43,100,44,132,0,90,43,100,45,100,46,132,0, + 90,44,100,2,83,0,41,47,97,80,2,0,0,122,105,112, + 105,109,112,111,114,116,32,112,114,111,118,105,100,101,115,32, + 115,117,112,112,111,114,116,32,102,111,114,32,105,109,112,111, + 114,116,105,110,103,32,80,121,116,104,111,110,32,109,111,100, + 117,108,101,115,32,102,114,111,109,32,90,105,112,32,97,114, + 99,104,105,118,101,115,46,10,10,84,104,105,115,32,109,111, + 100,117,108,101,32,101,120,112,111,114,116,115,32,116,104,114, + 101,101,32,111,98,106,101,99,116,115,58,10,45,32,122,105, + 112,105,109,112,111,114,116,101,114,58,32,97,32,99,108,97, + 115,115,59,32,105,116,115,32,99,111,110,115,116,114,117,99, + 116,111,114,32,116,97,107,101,115,32,97,32,112,97,116,104, + 32,116,111,32,97,32,90,105,112,32,97,114,99,104,105,118, + 101,46,10,45,32,90,105,112,73,109,112,111,114,116,69,114, + 114,111,114,58,32,101,120,99,101,112,116,105,111,110,32,114, + 97,105,115,101,100,32,98,121,32,122,105,112,105,109,112,111, + 114,116,101,114,32,111,98,106,101,99,116,115,46,32,73,116, + 39,115,32,97,10,32,32,115,117,98,99,108,97,115,115,32, + 111,102,32,73,109,112,111,114,116,69,114,114,111,114,44,32, + 115,111,32,105,116,32,99,97,110,32,98,101,32,99,97,117, + 103,104,116,32,97,115,32,73,109,112,111,114,116,69,114,114, + 111,114,44,32,116,111,111,46,10,45,32,95,122,105,112,95, + 100,105,114,101,99,116,111,114,121,95,99,97,99,104,101,58, + 32,97,32,100,105,99,116,44,32,109,97,112,112,105,110,103, + 32,97,114,99,104,105,118,101,32,112,97,116,104,115,32,116, + 111,32,122,105,112,32,100,105,114,101,99,116,111,114,121,10, + 32,32,105,110,102,111,32,100,105,99,116,115,44,32,97,115, + 32,117,115,101,100,32,105,110,32,122,105,112,105,109,112,111, + 114,116,101,114,46,95,102,105,108,101,115,46,10,10,73,116, + 32,105,115,32,117,115,117,97,108,108,121,32,110,111,116,32, + 110,101,101,100,101,100,32,116,111,32,117,115,101,32,116,104, + 101,32,122,105,112,105,109,112,111,114,116,32,109,111,100,117, + 108,101,32,101,120,112,108,105,99,105,116,108,121,59,32,105, + 116,32,105,115,10,117,115,101,100,32,98,121,32,116,104,101, + 32,98,117,105,108,116,105,110,32,105,109,112,111,114,116,32, + 109,101,99,104,97,110,105,115,109,32,102,111,114,32,115,121, + 115,46,112,97,116,104,32,105,116,101,109,115,32,116,104,97, + 116,32,97,114,101,32,112,97,116,104,115,10,116,111,32,90, + 105,112,32,97,114,99,104,105,118,101,115,46,10,233,0,0, + 0,0,78,41,2,218,14,95,117,110,112,97,99,107,95,117, + 105,110,116,49,54,218,14,95,117,110,112,97,99,107,95,117, + 105,110,116,51,50,218,14,90,105,112,73,109,112,111,114,116, + 69,114,114,111,114,218,11,122,105,112,105,109,112,111,114,116, + 101,114,233,1,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,64,0,0,0, + 115,12,0,0,0,101,0,90,1,100,0,90,2,100,1,83, + 0,41,2,114,3,0,0,0,78,41,3,218,8,95,95,110, + 97,109,101,95,95,218,10,95,95,109,111,100,117,108,101,95, + 95,218,12,95,95,113,117,97,108,110,97,109,101,95,95,169, + 0,114,9,0,0,0,114,9,0,0,0,250,18,60,102,114, + 111,122,101,110,32,122,105,112,105,109,112,111,114,116,62,114, + 3,0,0,0,33,0,0,0,115,6,0,0,0,8,0,4, + 1,255,128,233,22,0,0,0,115,4,0,0,0,80,75,5, + 6,105,255,255,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, + 118,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,100,3,132,0,90,4,100,27,100,5,100,6,132,1, + 90,5,100,28,100,7,100,8,132,1,90,6,100,29,100,9, + 100,10,132,1,90,7,100,11,100,12,132,0,90,8,100,13, + 100,14,132,0,90,9,100,15,100,16,132,0,90,10,100,17, + 100,18,132,0,90,11,100,19,100,20,132,0,90,12,100,21, + 100,22,132,0,90,13,100,23,100,24,132,0,90,14,100,25, + 100,26,132,0,90,15,100,4,83,0,41,30,114,4,0,0, + 0,97,255,1,0,0,122,105,112,105,109,112,111,114,116,101, + 114,40,97,114,99,104,105,118,101,112,97,116,104,41,32,45, + 62,32,122,105,112,105,109,112,111,114,116,101,114,32,111,98, + 106,101,99,116,10,10,32,32,32,32,67,114,101,97,116,101, + 32,97,32,110,101,119,32,122,105,112,105,109,112,111,114,116, + 101,114,32,105,110,115,116,97,110,99,101,46,32,39,97,114, + 99,104,105,118,101,112,97,116,104,39,32,109,117,115,116,32, + 98,101,32,97,32,112,97,116,104,32,116,111,10,32,32,32, + 32,97,32,122,105,112,102,105,108,101,44,32,111,114,32,116, + 111,32,97,32,115,112,101,99,105,102,105,99,32,112,97,116, + 104,32,105,110,115,105,100,101,32,97,32,122,105,112,102,105, + 108,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44, + 32,105,116,32,99,97,110,32,98,101,10,32,32,32,32,39, + 47,116,109,112,47,109,121,105,109,112,111,114,116,46,122,105, + 112,39,44,32,111,114,32,39,47,116,109,112,47,109,121,105, + 109,112,111,114,116,46,122,105,112,47,109,121,100,105,114,101, + 99,116,111,114,121,39,44,32,105,102,32,109,121,100,105,114, + 101,99,116,111,114,121,32,105,115,32,97,10,32,32,32,32, + 118,97,108,105,100,32,100,105,114,101,99,116,111,114,121,32, + 105,110,115,105,100,101,32,116,104,101,32,97,114,99,104,105, + 118,101,46,10,10,32,32,32,32,39,90,105,112,73,109,112, + 111,114,116,69,114,114,111,114,32,105,115,32,114,97,105,115, + 101,100,32,105,102,32,39,97,114,99,104,105,118,101,112,97, + 116,104,39,32,100,111,101,115,110,39,116,32,112,111,105,110, + 116,32,116,111,32,97,32,118,97,108,105,100,32,90,105,112, + 10,32,32,32,32,97,114,99,104,105,118,101,46,10,10,32, + 32,32,32,84,104,101,32,39,97,114,99,104,105,118,101,39, + 32,97,116,116,114,105,98,117,116,101,32,111,102,32,122,105, + 112,105,109,112,111,114,116,101,114,32,111,98,106,101,99,116, + 115,32,99,111,110,116,97,105,110,115,32,116,104,101,32,110, + 97,109,101,32,111,102,32,116,104,101,10,32,32,32,32,122, + 105,112,102,105,108,101,32,116,97,114,103,101,116,101,100,46, + 10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0, + 0,0,8,0,0,0,9,0,0,0,67,0,0,0,115,28, + 1,0,0,116,0,124,1,116,1,131,2,115,28,100,1,100, + 0,108,2,125,2,124,2,160,3,124,1,161,1,125,1,124, + 1,115,44,116,4,100,2,124,1,100,3,141,2,130,1,116, + 5,114,60,124,1,160,6,116,5,116,7,161,2,125,1,103, + 0,125,3,122,14,116,8,160,9,124,1,161,1,125,4,87, + 0,110,70,4,0,116,10,116,11,102,2,121,148,1,0,1, + 0,1,0,116,8,160,12,124,1,161,1,92,2,125,5,125, + 6,124,5,124,1,107,2,114,130,116,4,100,4,124,1,100, + 3,141,2,130,1,124,5,125,1,124,3,160,13,124,6,161, + 1,1,0,89,0,113,64,48,0,124,4,106,14,100,5,64, + 0,100,6,107,3,114,176,116,4,100,4,124,1,100,3,141, + 2,130,1,122,12,116,15,124,1,25,0,125,7,87,0,110, + 34,4,0,116,16,121,222,1,0,1,0,1,0,116,17,124, + 1,131,1,125,7,124,7,116,15,124,1,60,0,89,0,110, + 2,48,0,124,7,124,0,95,18,124,1,124,0,95,19,116, + 8,106,20,124,3,100,0,100,0,100,7,133,3,25,0,142, + 0,124,0,95,21,124,0,106,21,144,1,114,24,124,0,4, + 0,106,21,116,7,55,0,2,0,95,21,100,0,83,0,41, + 8,78,114,0,0,0,0,122,21,97,114,99,104,105,118,101, + 32,112,97,116,104,32,105,115,32,101,109,112,116,121,169,1, + 218,4,112,97,116,104,122,14,110,111,116,32,97,32,90,105, + 112,32,102,105,108,101,105,0,240,0,0,105,0,128,0,0, + 233,255,255,255,255,41,22,218,10,105,115,105,110,115,116,97, + 110,99,101,218,3,115,116,114,218,2,111,115,90,8,102,115, + 100,101,99,111,100,101,114,3,0,0,0,218,12,97,108,116, + 95,112,97,116,104,95,115,101,112,218,7,114,101,112,108,97, + 99,101,218,8,112,97,116,104,95,115,101,112,218,19,95,98, + 111,111,116,115,116,114,97,112,95,101,120,116,101,114,110,97, + 108,90,10,95,112,97,116,104,95,115,116,97,116,218,7,79, + 83,69,114,114,111,114,218,10,86,97,108,117,101,69,114,114, + 111,114,90,11,95,112,97,116,104,95,115,112,108,105,116,218, + 6,97,112,112,101,110,100,90,7,115,116,95,109,111,100,101, + 218,20,95,122,105,112,95,100,105,114,101,99,116,111,114,121, + 95,99,97,99,104,101,218,8,75,101,121,69,114,114,111,114, + 218,15,95,114,101,97,100,95,100,105,114,101,99,116,111,114, + 121,218,6,95,102,105,108,101,115,218,7,97,114,99,104,105, + 118,101,218,10,95,112,97,116,104,95,106,111,105,110,218,6, + 112,114,101,102,105,120,41,8,218,4,115,101,108,102,114,13, + 0,0,0,114,17,0,0,0,114,31,0,0,0,90,2,115, + 116,90,7,100,105,114,110,97,109,101,90,8,98,97,115,101, + 110,97,109,101,218,5,102,105,108,101,115,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,8,95,95,105,110, + 105,116,95,95,63,0,0,0,115,60,0,0,0,10,1,8, + 1,10,1,4,1,12,1,4,1,12,1,4,2,2,2,14, + 1,16,1,14,3,8,1,12,1,4,1,16,1,14,3,12, + 2,2,3,12,1,12,1,8,1,14,1,6,1,6,1,22, + 2,8,1,14,1,4,128,255,128,122,20,122,105,112,105,109, + 112,111,114,116,101,114,46,95,95,105,110,105,116,95,95,78, + 99,3,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,4,0,0,0,67,0,0,0,115,78,0,0,0,116,0, + 124,0,124,1,131,2,125,3,124,3,100,1,117,1,114,26, + 124,0,103,0,102,2,83,0,116,1,124,0,124,1,131,2, + 125,4,116,2,124,0,124,4,131,2,114,70,100,1,124,0, + 106,3,155,0,116,4,155,0,124,4,155,0,157,3,103,1, + 102,2,83,0,100,1,103,0,102,2,83,0,41,2,97,47, + 2,0,0,102,105,110,100,95,108,111,97,100,101,114,40,102, + 117,108,108,110,97,109,101,44,32,112,97,116,104,61,78,111, + 110,101,41,32,45,62,32,115,101,108,102,44,32,115,116,114, + 32,111,114,32,78,111,110,101,46,10,10,32,32,32,32,32, + 32,32,32,83,101,97,114,99,104,32,102,111,114,32,97,32, + 109,111,100,117,108,101,32,115,112,101,99,105,102,105,101,100, + 32,98,121,32,39,102,117,108,108,110,97,109,101,39,46,32, + 39,102,117,108,108,110,97,109,101,39,32,109,117,115,116,32, + 98,101,32,116,104,101,10,32,32,32,32,32,32,32,32,102, + 117,108,108,121,32,113,117,97,108,105,102,105,101,100,32,40, + 100,111,116,116,101,100,41,32,109,111,100,117,108,101,32,110, + 97,109,101,46,32,73,116,32,114,101,116,117,114,110,115,32, + 116,104,101,32,122,105,112,105,109,112,111,114,116,101,114,10, + 32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101, + 32,105,116,115,101,108,102,32,105,102,32,116,104,101,32,109, + 111,100,117,108,101,32,119,97,115,32,102,111,117,110,100,44, + 32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105, + 110,105,110,103,32,116,104,101,10,32,32,32,32,32,32,32, + 32,102,117,108,108,32,112,97,116,104,32,110,97,109,101,32, + 105,102,32,105,116,39,115,32,112,111,115,115,105,98,108,121, + 32,97,32,112,111,114,116,105,111,110,32,111,102,32,97,32, + 110,97,109,101,115,112,97,99,101,32,112,97,99,107,97,103, + 101,44,10,32,32,32,32,32,32,32,32,111,114,32,78,111, + 110,101,32,111,116,104,101,114,119,105,115,101,46,32,84,104, + 101,32,111,112,116,105,111,110,97,108,32,39,112,97,116,104, + 39,32,97,114,103,117,109,101,110,116,32,105,115,32,105,103, + 110,111,114,101,100,32,45,45,32,105,116,39,115,10,32,32, + 32,32,32,32,32,32,116,104,101,114,101,32,102,111,114,32, + 99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105, + 116,104,32,116,104,101,32,105,109,112,111,114,116,101,114,32, + 112,114,111,116,111,99,111,108,46,10,10,32,32,32,32,32, + 32,32,32,68,101,112,114,101,99,97,116,101,100,32,115,105, + 110,99,101,32,80,121,116,104,111,110,32,51,46,49,48,46, + 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, + 32,105,110,115,116,101,97,100,46,10,32,32,32,32,32,32, + 32,32,78,41,5,218,16,95,103,101,116,95,109,111,100,117, + 108,101,95,105,110,102,111,218,16,95,103,101,116,95,109,111, + 100,117,108,101,95,112,97,116,104,218,7,95,105,115,95,100, + 105,114,114,29,0,0,0,114,20,0,0,0,41,5,114,32, + 0,0,0,218,8,102,117,108,108,110,97,109,101,114,13,0, + 0,0,218,2,109,105,218,7,109,111,100,112,97,116,104,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,11, + 102,105,110,100,95,108,111,97,100,101,114,109,0,0,0,115, + 16,0,0,0,10,12,8,1,8,2,10,7,10,1,24,4, + 8,2,255,128,122,23,122,105,112,105,109,112,111,114,116,101, + 114,46,102,105,110,100,95,108,111,97,100,101,114,99,3,0, 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,67,0,0,0,115,40,0,0,0,116,0,124,0,124, - 1,131,2,125,2,124,2,100,1,117,0,114,36,116,1,100, - 2,124,1,155,2,157,2,124,1,100,3,141,2,130,1,124, - 2,83,0,41,4,122,171,105,115,95,112,97,99,107,97,103, - 101,40,102,117,108,108,110,97,109,101,41,32,45,62,32,98, - 111,111,108,46,10,10,32,32,32,32,32,32,32,32,82,101, - 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101, - 32,109,111,100,117,108,101,32,115,112,101,99,105,102,105,101, - 100,32,98,121,32,102,117,108,108,110,97,109,101,32,105,115, - 32,97,32,112,97,99,107,97,103,101,46,10,32,32,32,32, - 32,32,32,32,82,97,105,115,101,32,90,105,112,73,109,112, - 111,114,116,69,114,114,111,114,32,105,102,32,116,104,101,32, - 109,111,100,117,108,101,32,99,111,117,108,100,110,39,116,32, - 98,101,32,102,111,117,110,100,46,10,32,32,32,32,32,32, - 32,32,78,114,57,0,0,0,114,58,0,0,0,41,2,114, - 35,0,0,0,114,3,0,0,0,41,3,114,32,0,0,0, - 114,38,0,0,0,114,39,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,10,105,115,95,112,97, - 99,107,97,103,101,221,0,0,0,115,10,0,0,0,10,6, - 8,1,18,1,4,1,255,128,122,22,122,105,112,105,109,112, - 111,114,116,101,114,46,105,115,95,112,97,99,107,97,103,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,8,0,0, - 0,8,0,0,0,67,0,0,0,115,236,0,0,0,116,0, - 124,0,124,1,131,2,92,3,125,2,125,3,125,4,116,1, - 106,2,160,3,124,1,161,1,125,5,124,5,100,1,117,0, - 115,46,116,4,124,5,116,5,131,2,115,64,116,5,124,1, - 131,1,125,5,124,5,116,1,106,2,124,1,60,0,124,0, - 124,5,95,6,122,84,124,3,114,108,116,7,124,0,124,1, - 131,2,125,6,116,8,160,9,124,0,106,10,124,6,161,2, - 125,7,124,7,103,1,124,5,95,11,116,12,124,5,100,2, - 131,2,115,124,116,13,124,5,95,13,116,8,160,14,124,5, - 106,15,124,1,124,4,161,3,1,0,116,16,124,2,124,5, - 106,15,131,2,1,0,87,0,110,16,1,0,1,0,1,0, - 116,1,106,2,124,1,61,0,130,0,122,14,116,1,106,2, - 124,1,25,0,125,5,87,0,110,30,4,0,116,17,121,216, - 1,0,1,0,1,0,116,18,100,3,124,1,155,2,100,4, - 157,3,131,1,130,1,48,0,116,19,160,20,100,5,124,1, - 124,4,161,3,1,0,124,5,83,0,41,6,122,245,108,111, - 97,100,95,109,111,100,117,108,101,40,102,117,108,108,110,97, - 109,101,41,32,45,62,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,76,111,97,100,32,116,104,101, - 32,109,111,100,117,108,101,32,115,112,101,99,105,102,105,101, - 100,32,98,121,32,39,102,117,108,108,110,97,109,101,39,46, - 32,39,102,117,108,108,110,97,109,101,39,32,109,117,115,116, - 32,98,101,32,116,104,101,10,32,32,32,32,32,32,32,32, - 102,117,108,108,121,32,113,117,97,108,105,102,105,101,100,32, - 40,100,111,116,116,101,100,41,32,109,111,100,117,108,101,32, - 110,97,109,101,46,32,73,116,32,114,101,116,117,114,110,115, - 32,116,104,101,32,105,109,112,111,114,116,101,100,10,32,32, - 32,32,32,32,32,32,109,111,100,117,108,101,44,32,111,114, - 32,114,97,105,115,101,115,32,90,105,112,73,109,112,111,114, - 116,69,114,114,111,114,32,105,102,32,105,116,32,119,97,115, - 110,39,116,32,102,111,117,110,100,46,10,32,32,32,32,32, - 32,32,32,78,218,12,95,95,98,117,105,108,116,105,110,115, - 95,95,122,14,76,111,97,100,101,100,32,109,111,100,117,108, - 101,32,122,25,32,110,111,116,32,102,111,117,110,100,32,105, - 110,32,115,121,115,46,109,111,100,117,108,101,115,122,30,105, - 109,112,111,114,116,32,123,125,32,35,32,108,111,97,100,101, - 100,32,102,114,111,109,32,90,105,112,32,123,125,41,21,114, - 44,0,0,0,218,3,115,121,115,218,7,109,111,100,117,108, - 101,115,218,3,103,101,116,114,15,0,0,0,218,12,95,109, - 111,100,117,108,101,95,116,121,112,101,218,10,95,95,108,111, - 97,100,101,114,95,95,114,36,0,0,0,114,21,0,0,0, - 114,30,0,0,0,114,29,0,0,0,90,8,95,95,112,97, - 116,104,95,95,218,7,104,97,115,97,116,116,114,114,66,0, - 0,0,90,14,95,102,105,120,95,117,112,95,109,111,100,117, - 108,101,218,8,95,95,100,105,99,116,95,95,218,4,101,120, - 101,99,114,26,0,0,0,218,11,73,109,112,111,114,116,69, - 114,114,111,114,218,10,95,98,111,111,116,115,116,114,97,112, - 218,16,95,118,101,114,98,111,115,101,95,109,101,115,115,97, - 103,101,41,8,114,32,0,0,0,114,38,0,0,0,114,46, - 0,0,0,114,47,0,0,0,114,40,0,0,0,90,3,109, - 111,100,114,13,0,0,0,114,63,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,11,108,111,97, - 100,95,109,111,100,117,108,101,234,0,0,0,115,50,0,0, - 0,16,7,12,1,18,1,8,1,10,1,6,1,2,2,4, - 1,10,3,14,1,8,1,10,2,6,1,16,1,16,1,6, - 1,8,1,2,1,2,2,14,1,12,1,18,1,14,1,4, - 1,255,128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0,0,8,0,0, - 0,67,0,0,0,115,64,0,0,0,122,20,124,0,160,0, - 124,1,161,1,115,18,87,0,100,1,83,0,87,0,110,20, - 4,0,116,1,121,40,1,0,1,0,1,0,89,0,100,1, - 83,0,48,0,100,2,100,3,108,2,109,3,125,2,1,0, - 124,2,124,0,124,1,131,2,83,0,41,4,122,204,82,101, - 116,117,114,110,32,116,104,101,32,82,101,115,111,117,114,99, - 101,82,101,97,100,101,114,32,102,111,114,32,97,32,112,97, - 99,107,97,103,101,32,105,110,32,97,32,122,105,112,32,102, - 105,108,101,46,10,10,32,32,32,32,32,32,32,32,73,102, - 32,39,102,117,108,108,110,97,109,101,39,32,105,115,32,97, - 32,112,97,99,107,97,103,101,32,119,105,116,104,105,110,32, - 116,104,101,32,122,105,112,32,102,105,108,101,44,32,114,101, - 116,117,114,110,32,116,104,101,10,32,32,32,32,32,32,32, - 32,39,82,101,115,111,117,114,99,101,82,101,97,100,101,114, - 39,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101, - 32,112,97,99,107,97,103,101,46,32,32,79,116,104,101,114, - 119,105,115,101,32,114,101,116,117,114,110,32,78,111,110,101, - 46,10,32,32,32,32,32,32,32,32,78,114,0,0,0,0, - 41,1,218,9,90,105,112,82,101,97,100,101,114,41,4,114, - 65,0,0,0,114,3,0,0,0,90,17,105,109,112,111,114, - 116,108,105,98,46,114,101,97,100,101,114,115,114,79,0,0, - 0,41,3,114,32,0,0,0,114,38,0,0,0,114,79,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95, - 114,101,97,100,101,114,16,1,0,0,115,16,0,0,0,2, - 6,10,1,10,1,12,1,8,1,12,1,10,1,255,128,122, - 31,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, - 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,5,0,0,0,67,0,0,0,115,24,0,0,0,100,1, - 124,0,106,0,155,0,116,1,155,0,124,0,106,2,155,0, - 100,2,157,5,83,0,41,3,78,122,21,60,122,105,112,105, - 109,112,111,114,116,101,114,32,111,98,106,101,99,116,32,34, - 122,2,34,62,41,3,114,29,0,0,0,114,20,0,0,0, - 114,31,0,0,0,41,1,114,32,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,8,95,95,114, - 101,112,114,95,95,31,1,0,0,115,4,0,0,0,24,1, - 255,128,122,20,122,105,112,105,109,112,111,114,116,101,114,46, - 95,95,114,101,112,114,95,95,41,1,78,41,1,78,41,15, + 0,0,67,0,0,0,115,16,0,0,0,124,0,160,0,124, + 1,124,2,161,2,100,1,25,0,83,0,41,2,97,203,1, + 0,0,102,105,110,100,95,109,111,100,117,108,101,40,102,117, + 108,108,110,97,109,101,44,32,112,97,116,104,61,78,111,110, + 101,41,32,45,62,32,115,101,108,102,32,111,114,32,78,111, + 110,101,46,10,10,32,32,32,32,32,32,32,32,83,101,97, + 114,99,104,32,102,111,114,32,97,32,109,111,100,117,108,101, + 32,115,112,101,99,105,102,105,101,100,32,98,121,32,39,102, + 117,108,108,110,97,109,101,39,46,32,39,102,117,108,108,110, + 97,109,101,39,32,109,117,115,116,32,98,101,32,116,104,101, + 10,32,32,32,32,32,32,32,32,102,117,108,108,121,32,113, + 117,97,108,105,102,105,101,100,32,40,100,111,116,116,101,100, + 41,32,109,111,100,117,108,101,32,110,97,109,101,46,32,73, + 116,32,114,101,116,117,114,110,115,32,116,104,101,32,122,105, + 112,105,109,112,111,114,116,101,114,10,32,32,32,32,32,32, + 32,32,105,110,115,116,97,110,99,101,32,105,116,115,101,108, + 102,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32, + 119,97,115,32,102,111,117,110,100,44,32,111,114,32,78,111, + 110,101,32,105,102,32,105,116,32,119,97,115,110,39,116,46, + 10,32,32,32,32,32,32,32,32,84,104,101,32,111,112,116, + 105,111,110,97,108,32,39,112,97,116,104,39,32,97,114,103, + 117,109,101,110,116,32,105,115,32,105,103,110,111,114,101,100, + 32,45,45,32,105,116,39,115,32,116,104,101,114,101,32,102, + 111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121, + 10,32,32,32,32,32,32,32,32,119,105,116,104,32,116,104, + 101,32,105,109,112,111,114,116,101,114,32,112,114,111,116,111, + 99,111,108,46,10,10,32,32,32,32,32,32,32,32,68,101, + 112,114,101,99,97,116,101,100,32,115,105,110,99,101,32,80, + 121,116,104,111,110,32,51,46,49,48,46,32,85,115,101,32, + 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, + 101,97,100,46,10,32,32,32,32,32,32,32,32,114,0,0, + 0,0,41,1,114,41,0,0,0,41,3,114,32,0,0,0, + 114,38,0,0,0,114,13,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,11,102,105,110,100,95, + 109,111,100,117,108,101,143,0,0,0,115,4,0,0,0,16, + 11,255,128,122,23,122,105,112,105,109,112,111,114,116,101,114, + 46,102,105,110,100,95,109,111,100,117,108,101,99,3,0,0, + 0,0,0,0,0,0,0,0,0,7,0,0,0,5,0,0, + 0,67,0,0,0,115,108,0,0,0,116,0,124,0,124,1, + 131,2,125,3,124,3,100,1,117,1,114,34,116,1,106,2, + 124,1,124,0,124,3,100,2,141,3,83,0,116,3,124,0, + 124,1,131,2,125,4,116,4,124,0,124,4,131,2,114,104, + 124,0,106,5,155,0,116,6,155,0,124,4,155,0,157,3, + 125,5,116,1,106,7,124,1,100,1,100,3,100,4,141,3, + 125,6,124,6,106,8,160,9,124,5,161,1,1,0,124,6, + 83,0,100,1,83,0,41,5,122,107,67,114,101,97,116,101, + 32,97,32,77,111,100,117,108,101,83,112,101,99,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,46,10,10,32,32,32,32,32,32,32, + 32,82,101,116,117,114,110,115,32,78,111,110,101,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,99,97,110,110, + 111,116,32,98,101,32,102,111,117,110,100,46,10,32,32,32, + 32,32,32,32,32,78,41,1,218,10,105,115,95,112,97,99, + 107,97,103,101,84,41,3,218,4,110,97,109,101,90,6,108, + 111,97,100,101,114,114,43,0,0,0,41,10,114,35,0,0, + 0,218,10,95,98,111,111,116,115,116,114,97,112,90,16,115, + 112,101,99,95,102,114,111,109,95,108,111,97,100,101,114,114, + 36,0,0,0,114,37,0,0,0,114,29,0,0,0,114,20, + 0,0,0,90,10,77,111,100,117,108,101,83,112,101,99,90, + 26,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, + 104,95,108,111,99,97,116,105,111,110,115,114,24,0,0,0, + 41,7,114,32,0,0,0,114,38,0,0,0,90,6,116,97, + 114,103,101,116,90,11,109,111,100,117,108,101,95,105,110,102, + 111,114,40,0,0,0,114,13,0,0,0,90,4,115,112,101, + 99,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,9,102,105,110,100,95,115,112,101,99,156,0,0,0,115, + 26,0,0,0,10,5,8,1,16,1,10,7,10,1,18,4, + 8,1,2,1,6,255,12,2,4,1,4,2,255,128,122,21, + 122,105,112,105,109,112,111,114,116,101,114,46,102,105,110,100, + 95,115,112,101,99,99,2,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,3,0,0,0,67,0,0,0,115,20, + 0,0,0,116,0,124,0,124,1,131,2,92,3,125,2,125, + 3,125,4,124,2,83,0,41,1,122,163,103,101,116,95,99, + 111,100,101,40,102,117,108,108,110,97,109,101,41,32,45,62, + 32,99,111,100,101,32,111,98,106,101,99,116,46,10,10,32, + 32,32,32,32,32,32,32,82,101,116,117,114,110,32,116,104, + 101,32,99,111,100,101,32,111,98,106,101,99,116,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,46,32,82,97,105,115,101,32,90,105, + 112,73,109,112,111,114,116,69,114,114,111,114,10,32,32,32, + 32,32,32,32,32,105,102,32,116,104,101,32,109,111,100,117, + 108,101,32,99,111,117,108,100,110,39,116,32,98,101,32,102, + 111,117,110,100,46,10,32,32,32,32,32,32,32,32,169,1, + 218,16,95,103,101,116,95,109,111,100,117,108,101,95,99,111, + 100,101,169,5,114,32,0,0,0,114,38,0,0,0,218,4, + 99,111,100,101,218,9,105,115,112,97,99,107,97,103,101,114, + 40,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,8,103,101,116,95,99,111,100,101,183,0,0, + 0,115,6,0,0,0,16,6,4,1,255,128,122,20,122,105, + 112,105,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,0,0,0,0,4, + 0,0,0,8,0,0,0,67,0,0,0,115,112,0,0,0, + 116,0,114,16,124,1,160,1,116,0,116,2,161,2,125,1, + 124,1,125,2,124,1,160,3,124,0,106,4,116,2,23,0, + 161,1,114,58,124,1,116,5,124,0,106,4,116,2,23,0, + 131,1,100,1,133,2,25,0,125,2,122,14,124,0,106,6, + 124,2,25,0,125,3,87,0,110,26,4,0,116,7,121,98, + 1,0,1,0,1,0,116,8,100,2,100,3,124,2,131,3, + 130,1,48,0,116,9,124,0,106,4,124,3,131,2,83,0, + 41,4,122,154,103,101,116,95,100,97,116,97,40,112,97,116, + 104,110,97,109,101,41,32,45,62,32,115,116,114,105,110,103, + 32,119,105,116,104,32,102,105,108,101,32,100,97,116,97,46, + 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, + 32,116,104,101,32,100,97,116,97,32,97,115,115,111,99,105, + 97,116,101,100,32,119,105,116,104,32,39,112,97,116,104,110, + 97,109,101,39,46,32,82,97,105,115,101,32,79,83,69,114, + 114,111,114,32,105,102,10,32,32,32,32,32,32,32,32,116, + 104,101,32,102,105,108,101,32,119,97,115,110,39,116,32,102, + 111,117,110,100,46,10,32,32,32,32,32,32,32,32,78,114, + 0,0,0,0,218,0,41,10,114,18,0,0,0,114,19,0, + 0,0,114,20,0,0,0,218,10,115,116,97,114,116,115,119, + 105,116,104,114,29,0,0,0,218,3,108,101,110,114,28,0, + 0,0,114,26,0,0,0,114,22,0,0,0,218,9,95,103, + 101,116,95,100,97,116,97,41,4,114,32,0,0,0,218,8, + 112,97,116,104,110,97,109,101,90,3,107,101,121,218,9,116, + 111,99,95,101,110,116,114,121,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,8,103,101,116,95,100,97,116, + 97,193,0,0,0,115,22,0,0,0,4,6,12,1,4,2, + 16,1,22,1,2,2,14,1,12,1,14,1,12,1,255,128, + 122,20,122,105,112,105,109,112,111,114,116,101,114,46,103,101, + 116,95,100,97,116,97,99,2,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,3,0,0,0,67,0,0,0,115, + 20,0,0,0,116,0,124,0,124,1,131,2,92,3,125,2, + 125,3,125,4,124,4,83,0,41,1,122,106,103,101,116,95, + 102,105,108,101,110,97,109,101,40,102,117,108,108,110,97,109, + 101,41,32,45,62,32,102,105,108,101,110,97,109,101,32,115, + 116,114,105,110,103,46,10,10,32,32,32,32,32,32,32,32, + 82,101,116,117,114,110,32,116,104,101,32,102,105,108,101,110, + 97,109,101,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,46,10,32,32, + 32,32,32,32,32,32,114,47,0,0,0,114,49,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 12,103,101,116,95,102,105,108,101,110,97,109,101,214,0,0, + 0,115,6,0,0,0,16,7,4,1,255,128,122,24,122,105, + 112,105,109,112,111,114,116,101,114,46,103,101,116,95,102,105, + 108,101,110,97,109,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,115, + 126,0,0,0,116,0,124,0,124,1,131,2,125,2,124,2, + 100,1,117,0,114,36,116,1,100,2,124,1,155,2,157,2, + 124,1,100,3,141,2,130,1,116,2,124,0,124,1,131,2, + 125,3,124,2,114,64,116,3,160,4,124,3,100,4,161,2, + 125,4,110,10,124,3,155,0,100,5,157,2,125,4,122,14, + 124,0,106,5,124,4,25,0,125,5,87,0,110,20,4,0, + 116,6,121,108,1,0,1,0,1,0,89,0,100,1,83,0, + 48,0,116,7,124,0,106,8,124,5,131,2,160,9,161,0, + 83,0,41,6,122,253,103,101,116,95,115,111,117,114,99,101, + 40,102,117,108,108,110,97,109,101,41,32,45,62,32,115,111, + 117,114,99,101,32,115,116,114,105,110,103,46,10,10,32,32, + 32,32,32,32,32,32,82,101,116,117,114,110,32,116,104,101, + 32,115,111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32,90,105,112, + 73,109,112,111,114,116,69,114,114,111,114,10,32,32,32,32, + 32,32,32,32,105,102,32,116,104,101,32,109,111,100,117,108, + 101,32,99,111,117,108,100,110,39,116,32,98,101,32,102,111, + 117,110,100,44,32,114,101,116,117,114,110,32,78,111,110,101, + 32,105,102,32,116,104,101,32,97,114,99,104,105,118,101,32, + 100,111,101,115,10,32,32,32,32,32,32,32,32,99,111,110, + 116,97,105,110,32,116,104,101,32,109,111,100,117,108,101,44, + 32,98,117,116,32,104,97,115,32,110,111,32,115,111,117,114, + 99,101,32,102,111,114,32,105,116,46,10,32,32,32,32,32, + 32,32,32,78,250,18,99,97,110,39,116,32,102,105,110,100, + 32,109,111,100,117,108,101,32,169,1,114,44,0,0,0,250, + 11,95,95,105,110,105,116,95,95,46,112,121,250,3,46,112, + 121,41,10,114,35,0,0,0,114,3,0,0,0,114,36,0, + 0,0,114,21,0,0,0,114,30,0,0,0,114,28,0,0, + 0,114,26,0,0,0,114,56,0,0,0,114,29,0,0,0, + 218,6,100,101,99,111,100,101,41,6,114,32,0,0,0,114, + 38,0,0,0,114,39,0,0,0,114,13,0,0,0,218,8, + 102,117,108,108,112,97,116,104,114,58,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,10,103,101, + 116,95,115,111,117,114,99,101,225,0,0,0,115,26,0,0, + 0,10,7,8,1,18,1,10,2,4,1,14,1,10,2,2, + 2,14,1,12,1,8,2,16,1,255,128,122,22,122,105,112, + 105,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,0,0,0,0, + 3,0,0,0,4,0,0,0,67,0,0,0,115,40,0,0, + 0,116,0,124,0,124,1,131,2,125,2,124,2,100,1,117, + 0,114,36,116,1,100,2,124,1,155,2,157,2,124,1,100, + 3,141,2,130,1,124,2,83,0,41,4,122,171,105,115,95, + 112,97,99,107,97,103,101,40,102,117,108,108,110,97,109,101, + 41,32,45,62,32,98,111,111,108,46,10,10,32,32,32,32, + 32,32,32,32,82,101,116,117,114,110,32,84,114,117,101,32, + 105,102,32,116,104,101,32,109,111,100,117,108,101,32,115,112, + 101,99,105,102,105,101,100,32,98,121,32,102,117,108,108,110, + 97,109,101,32,105,115,32,97,32,112,97,99,107,97,103,101, + 46,10,32,32,32,32,32,32,32,32,82,97,105,115,101,32, + 90,105,112,73,109,112,111,114,116,69,114,114,111,114,32,105, + 102,32,116,104,101,32,109,111,100,117,108,101,32,99,111,117, + 108,100,110,39,116,32,98,101,32,102,111,117,110,100,46,10, + 32,32,32,32,32,32,32,32,78,114,61,0,0,0,114,62, + 0,0,0,41,2,114,35,0,0,0,114,3,0,0,0,41, + 3,114,32,0,0,0,114,38,0,0,0,114,39,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, + 43,0,0,0,251,0,0,0,115,10,0,0,0,10,6,8, + 1,18,1,4,1,255,128,122,22,122,105,112,105,109,112,111, + 114,116,101,114,46,105,115,95,112,97,99,107,97,103,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0, + 8,0,0,0,67,0,0,0,115,236,0,0,0,116,0,124, + 0,124,1,131,2,92,3,125,2,125,3,125,4,116,1,106, + 2,160,3,124,1,161,1,125,5,124,5,100,1,117,0,115, + 46,116,4,124,5,116,5,131,2,115,64,116,5,124,1,131, + 1,125,5,124,5,116,1,106,2,124,1,60,0,124,0,124, + 5,95,6,122,84,124,3,114,108,116,7,124,0,124,1,131, + 2,125,6,116,8,160,9,124,0,106,10,124,6,161,2,125, + 7,124,7,103,1,124,5,95,11,116,12,124,5,100,2,131, + 2,115,124,116,13,124,5,95,13,116,8,160,14,124,5,106, + 15,124,1,124,4,161,3,1,0,116,16,124,2,124,5,106, + 15,131,2,1,0,87,0,110,16,1,0,1,0,1,0,116, + 1,106,2,124,1,61,0,130,0,122,14,116,1,106,2,124, + 1,25,0,125,5,87,0,110,30,4,0,116,17,121,216,1, + 0,1,0,1,0,116,18,100,3,124,1,155,2,100,4,157, + 3,131,1,130,1,48,0,116,19,160,20,100,5,124,1,124, + 4,161,3,1,0,124,5,83,0,41,6,97,55,1,0,0, + 108,111,97,100,95,109,111,100,117,108,101,40,102,117,108,108, + 110,97,109,101,41,32,45,62,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,76,111,97,100,32,116, + 104,101,32,109,111,100,117,108,101,32,115,112,101,99,105,102, + 105,101,100,32,98,121,32,39,102,117,108,108,110,97,109,101, + 39,46,32,39,102,117,108,108,110,97,109,101,39,32,109,117, + 115,116,32,98,101,32,116,104,101,10,32,32,32,32,32,32, + 32,32,102,117,108,108,121,32,113,117,97,108,105,102,105,101, + 100,32,40,100,111,116,116,101,100,41,32,109,111,100,117,108, + 101,32,110,97,109,101,46,32,73,116,32,114,101,116,117,114, + 110,115,32,116,104,101,32,105,109,112,111,114,116,101,100,10, + 32,32,32,32,32,32,32,32,109,111,100,117,108,101,44,32, + 111,114,32,114,97,105,115,101,115,32,90,105,112,73,109,112, + 111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,119, + 97,115,110,39,116,32,102,111,117,110,100,46,10,10,32,32, + 32,32,32,32,32,32,68,101,112,114,101,99,97,116,101,100, + 32,115,105,110,99,101,32,80,121,116,104,111,110,32,51,46, + 49,48,46,32,117,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,32, + 32,32,32,32,32,32,32,78,218,12,95,95,98,117,105,108, + 116,105,110,115,95,95,122,14,76,111,97,100,101,100,32,109, + 111,100,117,108,101,32,122,25,32,110,111,116,32,102,111,117, + 110,100,32,105,110,32,115,121,115,46,109,111,100,117,108,101, + 115,122,30,105,109,112,111,114,116,32,123,125,32,35,32,108, + 111,97,100,101,100,32,102,114,111,109,32,90,105,112,32,123, + 125,41,21,114,48,0,0,0,218,3,115,121,115,218,7,109, + 111,100,117,108,101,115,218,3,103,101,116,114,15,0,0,0, + 218,12,95,109,111,100,117,108,101,95,116,121,112,101,218,10, + 95,95,108,111,97,100,101,114,95,95,114,36,0,0,0,114, + 21,0,0,0,114,30,0,0,0,114,29,0,0,0,90,8, + 95,95,112,97,116,104,95,95,218,7,104,97,115,97,116,116, + 114,114,68,0,0,0,90,14,95,102,105,120,95,117,112,95, + 109,111,100,117,108,101,218,8,95,95,100,105,99,116,95,95, + 218,4,101,120,101,99,114,26,0,0,0,218,11,73,109,112, + 111,114,116,69,114,114,111,114,114,45,0,0,0,218,16,95, + 118,101,114,98,111,115,101,95,109,101,115,115,97,103,101,41, + 8,114,32,0,0,0,114,38,0,0,0,114,50,0,0,0, + 114,51,0,0,0,114,40,0,0,0,90,3,109,111,100,114, + 13,0,0,0,114,66,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,11,108,111,97,100,95,109, + 111,100,117,108,101,8,1,0,0,115,50,0,0,0,16,9, + 12,1,18,1,8,1,10,1,6,1,2,2,4,1,10,3, + 14,1,8,1,10,2,6,1,16,1,16,1,6,1,8,1, + 2,1,2,2,14,1,12,1,18,1,14,1,4,1,255,128, + 122,23,122,105,112,105,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,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0, + 0,0,115,64,0,0,0,122,20,124,0,160,0,124,1,161, + 1,115,18,87,0,100,1,83,0,87,0,110,20,4,0,116, + 1,121,40,1,0,1,0,1,0,89,0,100,1,83,0,48, + 0,100,2,100,3,108,2,109,3,125,2,1,0,124,2,124, + 0,124,1,131,2,83,0,41,4,122,204,82,101,116,117,114, + 110,32,116,104,101,32,82,101,115,111,117,114,99,101,82,101, + 97,100,101,114,32,102,111,114,32,97,32,112,97,99,107,97, + 103,101,32,105,110,32,97,32,122,105,112,32,102,105,108,101, + 46,10,10,32,32,32,32,32,32,32,32,73,102,32,39,102, + 117,108,108,110,97,109,101,39,32,105,115,32,97,32,112,97, + 99,107,97,103,101,32,119,105,116,104,105,110,32,116,104,101, + 32,122,105,112,32,102,105,108,101,44,32,114,101,116,117,114, + 110,32,116,104,101,10,32,32,32,32,32,32,32,32,39,82, + 101,115,111,117,114,99,101,82,101,97,100,101,114,39,32,111, + 98,106,101,99,116,32,102,111,114,32,116,104,101,32,112,97, + 99,107,97,103,101,46,32,32,79,116,104,101,114,119,105,115, + 101,32,114,101,116,117,114,110,32,78,111,110,101,46,10,32, + 32,32,32,32,32,32,32,78,114,0,0,0,0,41,1,218, + 9,90,105,112,82,101,97,100,101,114,41,4,114,43,0,0, + 0,114,3,0,0,0,90,17,105,109,112,111,114,116,108,105, + 98,46,114,101,97,100,101,114,115,114,80,0,0,0,41,3, + 114,32,0,0,0,114,38,0,0,0,114,80,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,19, + 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, + 100,101,114,48,1,0,0,115,16,0,0,0,2,6,10,1, + 10,1,12,1,8,1,12,1,10,1,255,128,122,31,122,105, + 112,105,109,112,111,114,116,101,114,46,103,101,116,95,114,101, + 115,111,117,114,99,101,95,114,101,97,100,101,114,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0, + 0,0,67,0,0,0,115,24,0,0,0,100,1,124,0,106, + 0,155,0,116,1,155,0,124,0,106,2,155,0,100,2,157, + 5,83,0,41,3,78,122,21,60,122,105,112,105,109,112,111, + 114,116,101,114,32,111,98,106,101,99,116,32,34,122,2,34, + 62,41,3,114,29,0,0,0,114,20,0,0,0,114,31,0, + 0,0,41,1,114,32,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,8,95,95,114,101,112,114, + 95,95,63,1,0,0,115,4,0,0,0,24,1,255,128,122, + 20,122,105,112,105,109,112,111,114,116,101,114,46,95,95,114, + 101,112,114,95,95,41,1,78,41,1,78,41,1,78,41,16, 114,6,0,0,0,114,7,0,0,0,114,8,0,0,0,218, 7,95,95,100,111,99,95,95,114,34,0,0,0,114,41,0, - 0,0,114,42,0,0,0,114,48,0,0,0,114,55,0,0, - 0,114,56,0,0,0,114,64,0,0,0,114,65,0,0,0, - 114,78,0,0,0,114,80,0,0,0,114,81,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,114,4,0,0,0,45,0,0,0,115,28,0,0, - 0,8,0,4,1,8,17,10,46,10,32,8,12,8,10,8, - 21,8,11,8,26,8,13,8,38,12,15,255,128,122,12,95, - 95,105,110,105,116,95,95,46,112,121,99,84,114,60,0,0, - 0,70,41,3,122,4,46,112,121,99,84,70,41,3,114,61, - 0,0,0,70,70,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,4,0,0,0,67,0,0,0,115,20, - 0,0,0,124,0,106,0,124,1,160,1,100,1,161,1,100, - 2,25,0,23,0,83,0,41,3,78,218,1,46,233,2,0, - 0,0,41,2,114,31,0,0,0,218,10,114,112,97,114,116, - 105,116,105,111,110,41,2,114,32,0,0,0,114,38,0,0, - 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 114,36,0,0,0,49,1,0,0,115,4,0,0,0,20,1, - 255,128,114,36,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,2,0,0,0,67,0,0,0, - 115,18,0,0,0,124,1,116,0,23,0,125,2,124,2,124, - 0,106,1,118,0,83,0,169,1,78,41,2,114,20,0,0, - 0,114,28,0,0,0,41,3,114,32,0,0,0,114,13,0, - 0,0,90,7,100,105,114,112,97,116,104,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,114,37,0,0,0,53, - 1,0,0,115,6,0,0,0,8,4,10,2,255,128,114,37, - 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 7,0,0,0,4,0,0,0,67,0,0,0,115,54,0,0, - 0,116,0,124,0,124,1,131,2,125,2,116,1,68,0,93, - 34,92,3,125,3,125,4,125,5,124,2,124,3,23,0,125, - 6,124,6,124,0,106,2,118,0,114,14,124,5,2,0,1, - 0,83,0,100,0,83,0,114,86,0,0,0,41,3,114,36, - 0,0,0,218,16,95,122,105,112,95,115,101,97,114,99,104, - 111,114,100,101,114,114,28,0,0,0,41,7,114,32,0,0, - 0,114,38,0,0,0,114,13,0,0,0,218,6,115,117,102, - 102,105,120,218,10,105,115,98,121,116,101,99,111,100,101,114, - 47,0,0,0,114,63,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,35,0,0,0,62,1,0, - 0,115,14,0,0,0,10,1,14,1,8,1,10,1,8,1, - 4,1,255,128,114,35,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,26,0,0,0,9,0,0,0,67,0, - 0,0,115,230,4,0,0,122,14,116,0,160,1,124,0,161, - 1,125,1,87,0,110,32,4,0,116,2,121,46,1,0,1, - 0,1,0,116,3,100,1,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,48,0,124,1,144,4,143,140,1,0,122, - 36,124,1,160,4,116,5,11,0,100,3,161,2,1,0,124, - 1,160,6,161,0,125,2,124,1,160,7,116,5,161,1,125, - 3,87,0,110,32,4,0,116,2,121,124,1,0,1,0,1, - 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,48,0,116,8,124,3,131,1,116,5,107,3,114, - 156,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,124,3,100,0,100,5,133,2,25,0,116,9,107, - 3,144,1,114,154,122,24,124,1,160,4,100,6,100,3,161, - 2,1,0,124,1,160,6,161,0,125,4,87,0,110,32,4, - 0,116,2,121,230,1,0,1,0,1,0,116,3,100,4,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,48,0,116, - 10,124,4,116,11,24,0,116,5,24,0,100,6,131,2,125, - 5,122,22,124,1,160,4,124,5,161,1,1,0,124,1,160, - 7,161,0,125,6,87,0,110,34,4,0,116,2,144,1,121, - 50,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,48,0,124,6,160,12,116, - 9,161,1,125,7,124,7,100,6,107,0,144,1,114,90,116, - 3,100,7,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,124,6,124,7,124,7,116,5,23,0,133,2,25,0,125, - 3,116,8,124,3,131,1,116,5,107,3,144,1,114,138,116, - 3,100,8,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,124,4,116,8,124,6,131,1,24,0,124,7,23,0,125, - 2,116,13,124,3,100,9,100,10,133,2,25,0,131,1,125, - 8,116,13,124,3,100,10,100,11,133,2,25,0,131,1,125, - 9,124,2,124,8,107,0,144,1,114,214,116,3,100,12,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,124,2,124, - 9,107,0,144,1,114,242,116,3,100,13,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,124,2,124,8,56,0,125, - 2,124,2,124,9,24,0,125,10,124,10,100,6,107,0,144, - 2,114,30,116,3,100,14,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,105,0,125,11,100,6,125,12,122,14,124, - 1,160,4,124,2,161,1,1,0,87,0,110,34,4,0,116, - 2,144,2,121,86,1,0,1,0,1,0,116,3,100,4,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,48,0,124, - 1,160,7,100,15,161,1,125,3,116,8,124,3,131,1,100, - 5,107,0,144,2,114,120,116,14,100,16,131,1,130,1,124, - 3,100,0,100,5,133,2,25,0,100,17,107,3,144,2,114, - 142,144,4,113,180,116,8,124,3,131,1,100,15,107,3,144, - 2,114,164,116,14,100,16,131,1,130,1,116,15,124,3,100, - 18,100,19,133,2,25,0,131,1,125,13,116,15,124,3,100, - 19,100,9,133,2,25,0,131,1,125,14,116,15,124,3,100, - 9,100,20,133,2,25,0,131,1,125,15,116,15,124,3,100, - 20,100,10,133,2,25,0,131,1,125,16,116,13,124,3,100, - 10,100,11,133,2,25,0,131,1,125,17,116,13,124,3,100, - 11,100,21,133,2,25,0,131,1,125,18,116,13,124,3,100, - 21,100,22,133,2,25,0,131,1,125,4,116,15,124,3,100, - 22,100,23,133,2,25,0,131,1,125,19,116,15,124,3,100, - 23,100,24,133,2,25,0,131,1,125,20,116,15,124,3,100, - 24,100,25,133,2,25,0,131,1,125,21,116,13,124,3,100, - 26,100,15,133,2,25,0,131,1,125,22,124,19,124,20,23, - 0,124,21,23,0,125,8,124,22,124,9,107,4,144,3,114, - 124,116,3,100,27,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,124,22,124,10,55,0,125,22,122,14,124,1,160, - 7,124,19,161,1,125,23,87,0,110,34,4,0,116,2,144, - 3,121,180,1,0,1,0,1,0,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,48,0,116,8,124, - 23,131,1,124,19,107,3,144,3,114,214,116,3,100,4,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,122,50,116, - 8,124,1,160,7,124,8,124,19,24,0,161,1,131,1,124, - 8,124,19,24,0,107,3,144,4,114,6,116,3,100,4,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,87,0,110, - 34,4,0,116,2,144,4,121,42,1,0,1,0,1,0,116, - 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,48,0,124,13,100,28,64,0,144,4,114,64,124,23,160, - 16,161,0,125,23,110,52,122,14,124,23,160,16,100,29,161, - 1,125,23,87,0,110,36,4,0,116,17,144,4,121,114,1, - 0,1,0,1,0,124,23,160,16,100,30,161,1,160,18,116, - 19,161,1,125,23,89,0,110,2,48,0,124,23,160,20,100, - 31,116,21,161,2,125,23,116,22,160,23,124,0,124,23,161, - 2,125,24,124,24,124,14,124,18,124,4,124,22,124,15,124, - 16,124,17,102,8,125,25,124,25,124,11,124,23,60,0,124, - 12,100,32,55,0,125,12,144,2,113,88,87,0,100,0,4, - 0,4,0,131,3,1,0,110,18,49,0,144,4,115,202,48, - 0,1,0,1,0,1,0,89,0,1,0,116,24,160,25,100, - 33,124,12,124,0,161,3,1,0,124,11,83,0,41,34,78, - 122,21,99,97,110,39,116,32,111,112,101,110,32,90,105,112, - 32,102,105,108,101,58,32,114,12,0,0,0,114,84,0,0, - 0,250,21,99,97,110,39,116,32,114,101,97,100,32,90,105, - 112,32,102,105,108,101,58,32,233,4,0,0,0,114,0,0, - 0,0,122,16,110,111,116,32,97,32,90,105,112,32,102,105, - 108,101,58,32,122,18,99,111,114,114,117,112,116,32,90,105, - 112,32,102,105,108,101,58,32,233,12,0,0,0,233,16,0, - 0,0,233,20,0,0,0,122,28,98,97,100,32,99,101,110, - 116,114,97,108,32,100,105,114,101,99,116,111,114,121,32,115, - 105,122,101,58,32,122,30,98,97,100,32,99,101,110,116,114, - 97,108,32,100,105,114,101,99,116,111,114,121,32,111,102,102, - 115,101,116,58,32,122,38,98,97,100,32,99,101,110,116,114, - 97,108,32,100,105,114,101,99,116,111,114,121,32,115,105,122, - 101,32,111,114,32,111,102,102,115,101,116,58,32,233,46,0, - 0,0,250,27,69,79,70,32,114,101,97,100,32,119,104,101, - 114,101,32,110,111,116,32,101,120,112,101,99,116,101,100,115, - 4,0,0,0,80,75,1,2,233,8,0,0,0,233,10,0, - 0,0,233,14,0,0,0,233,24,0,0,0,233,28,0,0, - 0,233,30,0,0,0,233,32,0,0,0,233,34,0,0,0, - 233,42,0,0,0,122,25,98,97,100,32,108,111,99,97,108, - 32,104,101,97,100,101,114,32,111,102,102,115,101,116,58,32, - 105,0,8,0,0,218,5,97,115,99,105,105,90,6,108,97, - 116,105,110,49,250,1,47,114,5,0,0,0,122,33,122,105, - 112,105,109,112,111,114,116,58,32,102,111,117,110,100,32,123, - 125,32,110,97,109,101,115,32,105,110,32,123,33,114,125,41, - 26,218,3,95,105,111,218,9,111,112,101,110,95,99,111,100, - 101,114,22,0,0,0,114,3,0,0,0,218,4,115,101,101, - 107,218,20,69,78,68,95,67,69,78,84,82,65,76,95,68, - 73,82,95,83,73,90,69,90,4,116,101,108,108,218,4,114, - 101,97,100,114,51,0,0,0,218,18,83,84,82,73,78,71, - 95,69,78,68,95,65,82,67,72,73,86,69,218,3,109,97, - 120,218,15,77,65,88,95,67,79,77,77,69,78,84,95,76, - 69,78,218,5,114,102,105,110,100,114,2,0,0,0,218,8, - 69,79,70,69,114,114,111,114,114,1,0,0,0,114,62,0, - 0,0,218,18,85,110,105,99,111,100,101,68,101,99,111,100, - 101,69,114,114,111,114,218,9,116,114,97,110,115,108,97,116, - 101,218,11,99,112,52,51,55,95,116,97,98,108,101,114,19, - 0,0,0,114,20,0,0,0,114,21,0,0,0,114,30,0, - 0,0,114,76,0,0,0,114,77,0,0,0,41,26,114,29, - 0,0,0,218,2,102,112,90,15,104,101,97,100,101,114,95, - 112,111,115,105,116,105,111,110,218,6,98,117,102,102,101,114, - 218,9,102,105,108,101,95,115,105,122,101,90,17,109,97,120, - 95,99,111,109,109,101,110,116,95,115,116,97,114,116,218,4, - 100,97,116,97,90,3,112,111,115,218,11,104,101,97,100,101, - 114,95,115,105,122,101,90,13,104,101,97,100,101,114,95,111, - 102,102,115,101,116,90,10,97,114,99,95,111,102,102,115,101, - 116,114,33,0,0,0,218,5,99,111,117,110,116,218,5,102, - 108,97,103,115,218,8,99,111,109,112,114,101,115,115,218,4, - 116,105,109,101,218,4,100,97,116,101,218,3,99,114,99,218, - 9,100,97,116,97,95,115,105,122,101,218,9,110,97,109,101, - 95,115,105,122,101,218,10,101,120,116,114,97,95,115,105,122, - 101,90,12,99,111,109,109,101,110,116,95,115,105,122,101,218, - 11,102,105,108,101,95,111,102,102,115,101,116,114,59,0,0, - 0,114,13,0,0,0,218,1,116,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,27,0,0,0,93,1,0, - 0,115,214,0,0,0,2,1,14,1,12,1,20,1,8,2, - 2,1,14,1,8,1,14,1,12,1,20,1,12,1,18,1, - 18,1,2,3,12,1,12,1,12,1,10,1,2,1,8,255, - 8,2,2,1,2,255,2,1,4,255,2,2,10,1,12,1, - 14,1,10,1,2,1,8,255,10,2,10,1,10,1,2,1, - 6,255,16,2,14,1,10,1,2,1,6,255,16,2,16,2, - 16,1,10,1,18,1,10,1,18,1,8,1,8,1,10,1, - 18,1,4,2,4,2,2,1,14,1,14,1,20,1,10,2, - 14,1,8,1,18,2,4,1,14,1,8,1,16,1,16,1, - 16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1, - 16,1,12,1,10,1,18,1,8,1,2,2,14,1,14,1, - 20,1,14,1,18,1,2,4,28,1,22,1,14,1,20,1, - 10,2,10,2,2,3,14,1,14,1,22,1,12,2,12,1, - 20,1,8,1,44,1,14,1,4,1,255,128,114,27,0,0, - 0,117,190,1,0,0,0,1,2,3,4,5,6,7,8,9, - 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25, - 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41, - 42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57, - 58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73, - 74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89, - 90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105, - 106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121, - 122,123,124,125,126,127,195,135,195,188,195,169,195,162,195,164, - 195,160,195,165,195,167,195,170,195,171,195,168,195,175,195,174, - 195,172,195,132,195,133,195,137,195,166,195,134,195,180,195,182, - 195,178,195,187,195,185,195,191,195,150,195,156,194,162,194,163, - 194,165,226,130,167,198,146,195,161,195,173,195,179,195,186,195, - 177,195,145,194,170,194,186,194,191,226,140,144,194,172,194,189, - 194,188,194,161,194,171,194,187,226,150,145,226,150,146,226,150, - 147,226,148,130,226,148,164,226,149,161,226,149,162,226,149,150, - 226,149,149,226,149,163,226,149,145,226,149,151,226,149,157,226, - 149,156,226,149,155,226,148,144,226,148,148,226,148,180,226,148, - 172,226,148,156,226,148,128,226,148,188,226,149,158,226,149,159, - 226,149,154,226,149,148,226,149,169,226,149,166,226,149,160,226, - 149,144,226,149,172,226,149,167,226,149,168,226,149,164,226,149, - 165,226,149,153,226,149,152,226,149,146,226,149,147,226,149,171, - 226,149,170,226,148,152,226,148,140,226,150,136,226,150,132,226, - 150,140,226,150,144,226,150,128,206,177,195,159,206,147,207,128, - 206,163,207,131,194,181,207,132,206,166,206,152,206,169,206,180, - 226,136,158,207,134,206,181,226,136,169,226,137,161,194,177,226, - 137,165,226,137,164,226,140,160,226,140,161,195,183,226,137,136, - 194,176,226,136,153,194,183,226,136,154,226,129,191,194,178,226, - 150,160,194,160,99,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,8,0,0,0,67,0,0,0,115,106,0, - 0,0,116,0,114,22,116,1,160,2,100,1,161,1,1,0, - 116,3,100,2,131,1,130,1,100,3,97,0,122,58,122,16, - 100,4,100,5,108,4,109,5,125,0,1,0,87,0,110,32, - 4,0,116,6,121,76,1,0,1,0,1,0,116,1,160,2, - 100,1,161,1,1,0,116,3,100,2,131,1,130,1,48,0, - 87,0,100,6,97,0,110,6,100,6,97,0,48,0,116,1, - 160,2,100,7,161,1,1,0,124,0,83,0,41,8,78,122, - 27,122,105,112,105,109,112,111,114,116,58,32,122,108,105,98, - 32,85,78,65,86,65,73,76,65,66,76,69,250,41,99,97, - 110,39,116,32,100,101,99,111,109,112,114,101,115,115,32,100, - 97,116,97,59,32,122,108,105,98,32,110,111,116,32,97,118, - 97,105,108,97,98,108,101,84,114,0,0,0,0,169,1,218, - 10,100,101,99,111,109,112,114,101,115,115,70,122,25,122,105, - 112,105,109,112,111,114,116,58,32,122,108,105,98,32,97,118, - 97,105,108,97,98,108,101,41,7,218,15,95,105,109,112,111, - 114,116,105,110,103,95,122,108,105,98,114,76,0,0,0,114, - 77,0,0,0,114,3,0,0,0,90,4,122,108,105,98,114, - 139,0,0,0,218,9,69,120,99,101,112,116,105,111,110,114, - 138,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,20,95,103,101,116,95,100,101,99,111,109,112, - 114,101,115,115,95,102,117,110,99,251,1,0,0,115,26,0, - 0,0,4,2,10,3,8,1,4,2,4,1,16,1,12,1, - 10,1,12,1,12,2,10,2,4,1,255,128,114,142,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,17,0, - 0,0,9,0,0,0,67,0,0,0,115,132,1,0,0,124, - 1,92,8,125,2,125,3,125,4,125,5,125,6,125,7,125, - 8,125,9,124,4,100,1,107,0,114,36,116,0,100,2,131, - 1,130,1,116,1,160,2,124,0,161,1,144,1,143,6,125, - 10,122,14,124,10,160,3,124,6,161,1,1,0,87,0,110, - 32,4,0,116,4,121,96,1,0,1,0,1,0,116,0,100, - 3,124,0,155,2,157,2,124,0,100,4,141,2,130,1,48, - 0,124,10,160,5,100,5,161,1,125,11,116,6,124,11,131, - 1,100,5,107,3,114,128,116,7,100,6,131,1,130,1,124, - 11,100,0,100,7,133,2,25,0,100,8,107,3,114,162,116, - 0,100,9,124,0,155,2,157,2,124,0,100,4,141,2,130, - 1,116,8,124,11,100,10,100,11,133,2,25,0,131,1,125, - 12,116,8,124,11,100,11,100,5,133,2,25,0,131,1,125, - 13,100,5,124,12,23,0,124,13,23,0,125,14,124,6,124, - 14,55,0,125,6,122,14,124,10,160,3,124,6,161,1,1, - 0,87,0,110,34,4,0,116,4,144,1,121,6,1,0,1, - 0,1,0,116,0,100,3,124,0,155,2,157,2,124,0,100, - 4,141,2,130,1,48,0,124,10,160,5,124,4,161,1,125, - 15,116,6,124,15,131,1,124,4,107,3,144,1,114,40,116, - 4,100,12,131,1,130,1,87,0,100,0,4,0,4,0,131, - 3,1,0,110,18,49,0,144,1,115,62,48,0,1,0,1, - 0,1,0,89,0,1,0,124,3,100,1,107,2,144,1,114, - 86,124,15,83,0,122,10,116,9,131,0,125,16,87,0,110, - 24,4,0,116,10,144,1,121,120,1,0,1,0,1,0,116, - 0,100,13,131,1,130,1,48,0,124,16,124,15,100,14,131, - 2,83,0,41,15,78,114,0,0,0,0,122,18,110,101,103, - 97,116,105,118,101,32,100,97,116,97,32,115,105,122,101,114, - 90,0,0,0,114,12,0,0,0,114,102,0,0,0,114,96, - 0,0,0,114,91,0,0,0,115,4,0,0,0,80,75,3, - 4,122,23,98,97,100,32,108,111,99,97,108,32,102,105,108, - 101,32,104,101,97,100,101,114,58,32,233,26,0,0,0,114, - 101,0,0,0,122,26,122,105,112,105,109,112,111,114,116,58, - 32,99,97,110,39,116,32,114,101,97,100,32,100,97,116,97, - 114,137,0,0,0,105,241,255,255,255,41,11,114,3,0,0, - 0,114,108,0,0,0,114,109,0,0,0,114,110,0,0,0, - 114,22,0,0,0,114,112,0,0,0,114,51,0,0,0,114, - 117,0,0,0,114,1,0,0,0,114,142,0,0,0,114,141, - 0,0,0,41,17,114,29,0,0,0,114,54,0,0,0,90, - 8,100,97,116,97,112,97,116,104,114,128,0,0,0,114,132, - 0,0,0,114,123,0,0,0,114,135,0,0,0,114,129,0, - 0,0,114,130,0,0,0,114,131,0,0,0,114,121,0,0, - 0,114,122,0,0,0,114,133,0,0,0,114,134,0,0,0, - 114,125,0,0,0,90,8,114,97,119,95,100,97,116,97,114, - 139,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,114,52,0,0,0,16,2,0,0,115,64,0,0, - 0,20,1,8,1,8,1,14,2,2,2,14,1,12,1,20, - 1,10,1,12,1,8,1,16,2,18,2,16,2,16,1,12, - 1,8,1,2,1,14,1,14,1,20,1,10,1,14,1,40, - 1,10,2,4,2,2,3,10,1,14,1,10,1,10,1,255, - 128,114,52,0,0,0,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 16,0,0,0,116,0,124,0,124,1,24,0,131,1,100,1, - 107,1,83,0,41,2,78,114,5,0,0,0,41,1,218,3, - 97,98,115,41,2,90,2,116,49,90,2,116,50,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,9,95,101, - 113,95,109,116,105,109,101,62,2,0,0,115,4,0,0,0, - 16,2,255,128,114,145,0,0,0,99,5,0,0,0,0,0, - 0,0,0,0,0,0,14,0,0,0,8,0,0,0,67,0, - 0,0,115,60,1,0,0,124,3,124,2,100,1,156,2,125, - 5,122,18,116,0,160,1,124,4,124,3,124,5,161,3,125, - 6,87,0,110,20,4,0,116,2,121,48,1,0,1,0,1, - 0,89,0,100,0,83,0,48,0,124,6,100,2,64,0,100, - 3,107,3,125,7,124,7,114,182,124,6,100,4,64,0,100, - 3,107,3,125,8,116,3,106,4,100,5,107,3,144,1,114, - 10,124,8,115,106,116,3,106,4,100,6,107,2,144,1,114, - 10,116,5,124,0,124,2,131,2,125,9,124,9,100,0,117, - 1,144,1,114,10,116,3,160,6,116,0,106,7,124,9,161, - 2,125,10,122,20,116,0,160,8,124,4,124,10,124,3,124, - 5,161,4,1,0,87,0,110,104,4,0,116,2,121,180,1, - 0,1,0,1,0,89,0,100,0,83,0,48,0,116,9,124, - 0,124,2,131,2,92,2,125,11,125,12,124,11,144,1,114, - 10,116,10,116,11,124,4,100,7,100,8,133,2,25,0,131, - 1,124,11,131,2,114,246,116,11,124,4,100,8,100,9,133, - 2,25,0,131,1,124,12,107,3,144,1,114,10,116,12,160, - 13,100,10,124,3,155,2,157,2,161,1,1,0,100,0,83, - 0,116,14,160,15,124,4,100,9,100,0,133,2,25,0,161, - 1,125,13,116,16,124,13,116,17,131,2,144,1,115,56,116, - 18,100,11,124,1,155,2,100,12,157,3,131,1,130,1,124, - 13,83,0,41,13,78,41,2,114,59,0,0,0,114,13,0, - 0,0,114,5,0,0,0,114,0,0,0,0,114,84,0,0, - 0,90,5,110,101,118,101,114,90,6,97,108,119,97,121,115, - 114,97,0,0,0,114,92,0,0,0,114,93,0,0,0,122, - 22,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97, - 108,101,32,102,111,114,32,122,16,99,111,109,112,105,108,101, - 100,32,109,111,100,117,108,101,32,122,21,32,105,115,32,110, - 111,116,32,97,32,99,111,100,101,32,111,98,106,101,99,116, - 41,19,114,21,0,0,0,90,13,95,99,108,97,115,115,105, - 102,121,95,112,121,99,114,75,0,0,0,218,4,95,105,109, - 112,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, - 115,101,100,95,112,121,99,115,218,15,95,103,101,116,95,112, - 121,99,95,115,111,117,114,99,101,218,11,115,111,117,114,99, - 101,95,104,97,115,104,90,17,95,82,65,87,95,77,65,71, - 73,67,95,78,85,77,66,69,82,90,18,95,118,97,108,105, - 100,97,116,101,95,104,97,115,104,95,112,121,99,218,29,95, - 103,101,116,95,109,116,105,109,101,95,97,110,100,95,115,105, - 122,101,95,111,102,95,115,111,117,114,99,101,114,145,0,0, - 0,114,2,0,0,0,114,76,0,0,0,114,77,0,0,0, - 218,7,109,97,114,115,104,97,108,90,5,108,111,97,100,115, - 114,15,0,0,0,218,10,95,99,111,100,101,95,116,121,112, - 101,218,9,84,121,112,101,69,114,114,111,114,41,14,114,32, - 0,0,0,114,53,0,0,0,114,63,0,0,0,114,38,0, - 0,0,114,124,0,0,0,90,11,101,120,99,95,100,101,116, - 97,105,108,115,114,127,0,0,0,90,10,104,97,115,104,95, - 98,97,115,101,100,90,12,99,104,101,99,107,95,115,111,117, - 114,99,101,90,12,115,111,117,114,99,101,95,98,121,116,101, - 115,114,148,0,0,0,90,12,115,111,117,114,99,101,95,109, - 116,105,109,101,90,11,115,111,117,114,99,101,95,115,105,122, - 101,114,46,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,15,95,117,110,109,97,114,115,104,97, - 108,95,99,111,100,101,72,2,0,0,115,84,0,0,0,2, - 2,2,1,6,254,2,5,18,1,12,1,8,1,12,2,4, - 1,12,1,12,1,2,1,2,255,8,1,4,255,10,2,10, - 1,4,1,4,1,2,1,4,254,2,5,4,1,8,1,8, - 255,12,2,8,1,8,3,6,255,6,3,22,3,18,1,4, - 255,4,2,8,1,4,255,4,2,18,2,12,1,16,1,4, - 1,255,128,114,153,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, - 0,115,28,0,0,0,124,0,160,0,100,1,100,2,161,2, - 125,0,124,0,160,0,100,3,100,2,161,2,125,0,124,0, - 83,0,41,4,78,115,2,0,0,0,13,10,243,1,0,0, - 0,10,243,1,0,0,0,13,41,1,114,19,0,0,0,41, - 1,218,6,115,111,117,114,99,101,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,23,95,110,111,114,109,97, - 108,105,122,101,95,108,105,110,101,95,101,110,100,105,110,103, - 115,123,2,0,0,115,8,0,0,0,12,1,12,1,4,1, - 255,128,114,157,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,6,0,0,0,67,0,0,0, - 115,24,0,0,0,116,0,124,1,131,1,125,1,116,1,124, - 1,124,0,100,1,100,2,100,3,141,4,83,0,41,4,78, - 114,74,0,0,0,84,41,1,90,12,100,111,110,116,95,105, - 110,104,101,114,105,116,41,2,114,157,0,0,0,218,7,99, - 111,109,112,105,108,101,41,2,114,53,0,0,0,114,156,0, + 0,0,114,42,0,0,0,114,46,0,0,0,114,52,0,0, + 0,114,59,0,0,0,114,60,0,0,0,114,67,0,0,0, + 114,43,0,0,0,114,79,0,0,0,114,81,0,0,0,114, + 82,0,0,0,114,9,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,4,0,0,0,45,0,0, + 0,115,30,0,0,0,8,0,4,1,8,17,10,46,10,34, + 10,13,8,27,8,10,8,21,8,11,8,26,8,13,8,40, + 12,15,255,128,122,12,95,95,105,110,105,116,95,95,46,112, + 121,99,84,114,63,0,0,0,70,41,3,122,4,46,112,121, + 99,84,70,41,3,114,64,0,0,0,70,70,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,67,0,0,0,115,20,0,0,0,124,0,106,0,124,1, + 160,1,100,1,161,1,100,2,25,0,23,0,83,0,41,3, + 78,218,1,46,233,2,0,0,0,41,2,114,31,0,0,0, + 218,10,114,112,97,114,116,105,116,105,111,110,41,2,114,32, + 0,0,0,114,38,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,114,36,0,0,0,81,1,0,0, + 115,4,0,0,0,20,1,255,128,114,36,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2, + 0,0,0,67,0,0,0,115,18,0,0,0,124,1,116,0, + 23,0,125,2,124,2,124,0,106,1,118,0,83,0,169,1, + 78,41,2,114,20,0,0,0,114,28,0,0,0,41,3,114, + 32,0,0,0,114,13,0,0,0,90,7,100,105,114,112,97, + 116,104,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,37,0,0,0,85,1,0,0,115,6,0,0,0,8, + 4,10,2,255,128,114,37,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,7,0,0,0,4,0,0,0,67, + 0,0,0,115,54,0,0,0,116,0,124,0,124,1,131,2, + 125,2,116,1,68,0,93,34,92,3,125,3,125,4,125,5, + 124,2,124,3,23,0,125,6,124,6,124,0,106,2,118,0, + 114,14,124,5,2,0,1,0,83,0,100,0,83,0,114,87, + 0,0,0,41,3,114,36,0,0,0,218,16,95,122,105,112, + 95,115,101,97,114,99,104,111,114,100,101,114,114,28,0,0, + 0,41,7,114,32,0,0,0,114,38,0,0,0,114,13,0, + 0,0,218,6,115,117,102,102,105,120,218,10,105,115,98,121, + 116,101,99,111,100,101,114,51,0,0,0,114,66,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, + 35,0,0,0,94,1,0,0,115,14,0,0,0,10,1,14, + 1,8,1,10,1,8,1,4,1,255,128,114,35,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,26,0,0, + 0,9,0,0,0,67,0,0,0,115,230,4,0,0,122,14, + 116,0,160,1,124,0,161,1,125,1,87,0,110,32,4,0, + 116,2,121,46,1,0,1,0,1,0,116,3,100,1,124,0, + 155,2,157,2,124,0,100,2,141,2,130,1,48,0,124,1, + 144,4,143,140,1,0,122,36,124,1,160,4,116,5,11,0, + 100,3,161,2,1,0,124,1,160,6,161,0,125,2,124,1, + 160,7,116,5,161,1,125,3,87,0,110,32,4,0,116,2, + 121,124,1,0,1,0,1,0,116,3,100,4,124,0,155,2, + 157,2,124,0,100,2,141,2,130,1,48,0,116,8,124,3, + 131,1,116,5,107,3,114,156,116,3,100,4,124,0,155,2, + 157,2,124,0,100,2,141,2,130,1,124,3,100,0,100,5, + 133,2,25,0,116,9,107,3,144,1,114,154,122,24,124,1, + 160,4,100,6,100,3,161,2,1,0,124,1,160,6,161,0, + 125,4,87,0,110,32,4,0,116,2,121,230,1,0,1,0, + 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,48,0,116,10,124,4,116,11,24,0,116,5, + 24,0,100,6,131,2,125,5,122,22,124,1,160,4,124,5, + 161,1,1,0,124,1,160,7,161,0,125,6,87,0,110,34, + 4,0,116,2,144,1,121,50,1,0,1,0,1,0,116,3, + 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, + 48,0,124,6,160,12,116,9,161,1,125,7,124,7,100,6, + 107,0,144,1,114,90,116,3,100,7,124,0,155,2,157,2, + 124,0,100,2,141,2,130,1,124,6,124,7,124,7,116,5, + 23,0,133,2,25,0,125,3,116,8,124,3,131,1,116,5, + 107,3,144,1,114,138,116,3,100,8,124,0,155,2,157,2, + 124,0,100,2,141,2,130,1,124,4,116,8,124,6,131,1, + 24,0,124,7,23,0,125,2,116,13,124,3,100,9,100,10, + 133,2,25,0,131,1,125,8,116,13,124,3,100,10,100,11, + 133,2,25,0,131,1,125,9,124,2,124,8,107,0,144,1, + 114,214,116,3,100,12,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,124,2,124,9,107,0,144,1,114,242,116,3, + 100,13,124,0,155,2,157,2,124,0,100,2,141,2,130,1, + 124,2,124,8,56,0,125,2,124,2,124,9,24,0,125,10, + 124,10,100,6,107,0,144,2,114,30,116,3,100,14,124,0, + 155,2,157,2,124,0,100,2,141,2,130,1,105,0,125,11, + 100,6,125,12,122,14,124,1,160,4,124,2,161,1,1,0, + 87,0,110,34,4,0,116,2,144,2,121,86,1,0,1,0, + 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,48,0,124,1,160,7,100,15,161,1,125,3, + 116,8,124,3,131,1,100,5,107,0,144,2,114,120,116,14, + 100,16,131,1,130,1,124,3,100,0,100,5,133,2,25,0, + 100,17,107,3,144,2,114,142,144,4,113,180,116,8,124,3, + 131,1,100,15,107,3,144,2,114,164,116,14,100,16,131,1, + 130,1,116,15,124,3,100,18,100,19,133,2,25,0,131,1, + 125,13,116,15,124,3,100,19,100,9,133,2,25,0,131,1, + 125,14,116,15,124,3,100,9,100,20,133,2,25,0,131,1, + 125,15,116,15,124,3,100,20,100,10,133,2,25,0,131,1, + 125,16,116,13,124,3,100,10,100,11,133,2,25,0,131,1, + 125,17,116,13,124,3,100,11,100,21,133,2,25,0,131,1, + 125,18,116,13,124,3,100,21,100,22,133,2,25,0,131,1, + 125,4,116,15,124,3,100,22,100,23,133,2,25,0,131,1, + 125,19,116,15,124,3,100,23,100,24,133,2,25,0,131,1, + 125,20,116,15,124,3,100,24,100,25,133,2,25,0,131,1, + 125,21,116,13,124,3,100,26,100,15,133,2,25,0,131,1, + 125,22,124,19,124,20,23,0,124,21,23,0,125,8,124,22, + 124,9,107,4,144,3,114,124,116,3,100,27,124,0,155,2, + 157,2,124,0,100,2,141,2,130,1,124,22,124,10,55,0, + 125,22,122,14,124,1,160,7,124,19,161,1,125,23,87,0, + 110,34,4,0,116,2,144,3,121,180,1,0,1,0,1,0, + 116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,48,0,116,8,124,23,131,1,124,19,107,3,144,3, + 114,214,116,3,100,4,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,122,50,116,8,124,1,160,7,124,8,124,19, + 24,0,161,1,131,1,124,8,124,19,24,0,107,3,144,4, + 114,6,116,3,100,4,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,87,0,110,34,4,0,116,2,144,4,121,42, + 1,0,1,0,1,0,116,3,100,4,124,0,155,2,157,2, + 124,0,100,2,141,2,130,1,48,0,124,13,100,28,64,0, + 144,4,114,64,124,23,160,16,161,0,125,23,110,52,122,14, + 124,23,160,16,100,29,161,1,125,23,87,0,110,36,4,0, + 116,17,144,4,121,114,1,0,1,0,1,0,124,23,160,16, + 100,30,161,1,160,18,116,19,161,1,125,23,89,0,110,2, + 48,0,124,23,160,20,100,31,116,21,161,2,125,23,116,22, + 160,23,124,0,124,23,161,2,125,24,124,24,124,14,124,18, + 124,4,124,22,124,15,124,16,124,17,102,8,125,25,124,25, + 124,11,124,23,60,0,124,12,100,32,55,0,125,12,144,2, + 113,88,87,0,100,0,4,0,4,0,131,3,1,0,110,18, + 49,0,144,4,115,202,48,0,1,0,1,0,1,0,89,0, + 1,0,116,24,160,25,100,33,124,12,124,0,161,3,1,0, + 124,11,83,0,41,34,78,122,21,99,97,110,39,116,32,111, + 112,101,110,32,90,105,112,32,102,105,108,101,58,32,114,12, + 0,0,0,114,85,0,0,0,250,21,99,97,110,39,116,32, + 114,101,97,100,32,90,105,112,32,102,105,108,101,58,32,233, + 4,0,0,0,114,0,0,0,0,122,16,110,111,116,32,97, + 32,90,105,112,32,102,105,108,101,58,32,122,18,99,111,114, + 114,117,112,116,32,90,105,112,32,102,105,108,101,58,32,233, + 12,0,0,0,233,16,0,0,0,233,20,0,0,0,122,28, + 98,97,100,32,99,101,110,116,114,97,108,32,100,105,114,101, + 99,116,111,114,121,32,115,105,122,101,58,32,122,30,98,97, + 100,32,99,101,110,116,114,97,108,32,100,105,114,101,99,116, + 111,114,121,32,111,102,102,115,101,116,58,32,122,38,98,97, + 100,32,99,101,110,116,114,97,108,32,100,105,114,101,99,116, + 111,114,121,32,115,105,122,101,32,111,114,32,111,102,102,115, + 101,116,58,32,233,46,0,0,0,250,27,69,79,70,32,114, + 101,97,100,32,119,104,101,114,101,32,110,111,116,32,101,120, + 112,101,99,116,101,100,115,4,0,0,0,80,75,1,2,233, + 8,0,0,0,233,10,0,0,0,233,14,0,0,0,233,24, + 0,0,0,233,28,0,0,0,233,30,0,0,0,233,32,0, + 0,0,233,34,0,0,0,233,42,0,0,0,122,25,98,97, + 100,32,108,111,99,97,108,32,104,101,97,100,101,114,32,111, + 102,102,115,101,116,58,32,105,0,8,0,0,218,5,97,115, + 99,105,105,90,6,108,97,116,105,110,49,250,1,47,114,5, + 0,0,0,122,33,122,105,112,105,109,112,111,114,116,58,32, + 102,111,117,110,100,32,123,125,32,110,97,109,101,115,32,105, + 110,32,123,33,114,125,41,26,218,3,95,105,111,218,9,111, + 112,101,110,95,99,111,100,101,114,22,0,0,0,114,3,0, + 0,0,218,4,115,101,101,107,218,20,69,78,68,95,67,69, + 78,84,82,65,76,95,68,73,82,95,83,73,90,69,90,4, + 116,101,108,108,218,4,114,101,97,100,114,55,0,0,0,218, + 18,83,84,82,73,78,71,95,69,78,68,95,65,82,67,72, + 73,86,69,218,3,109,97,120,218,15,77,65,88,95,67,79, + 77,77,69,78,84,95,76,69,78,218,5,114,102,105,110,100, + 114,2,0,0,0,218,8,69,79,70,69,114,114,111,114,114, + 1,0,0,0,114,65,0,0,0,218,18,85,110,105,99,111, + 100,101,68,101,99,111,100,101,69,114,114,111,114,218,9,116, + 114,97,110,115,108,97,116,101,218,11,99,112,52,51,55,95, + 116,97,98,108,101,114,19,0,0,0,114,20,0,0,0,114, + 21,0,0,0,114,30,0,0,0,114,45,0,0,0,114,78, + 0,0,0,41,26,114,29,0,0,0,218,2,102,112,90,15, + 104,101,97,100,101,114,95,112,111,115,105,116,105,111,110,218, + 6,98,117,102,102,101,114,218,9,102,105,108,101,95,115,105, + 122,101,90,17,109,97,120,95,99,111,109,109,101,110,116,95, + 115,116,97,114,116,218,4,100,97,116,97,90,3,112,111,115, + 218,11,104,101,97,100,101,114,95,115,105,122,101,90,13,104, + 101,97,100,101,114,95,111,102,102,115,101,116,90,10,97,114, + 99,95,111,102,102,115,101,116,114,33,0,0,0,218,5,99, + 111,117,110,116,218,5,102,108,97,103,115,218,8,99,111,109, + 112,114,101,115,115,218,4,116,105,109,101,218,4,100,97,116, + 101,218,3,99,114,99,218,9,100,97,116,97,95,115,105,122, + 101,218,9,110,97,109,101,95,115,105,122,101,218,10,101,120, + 116,114,97,95,115,105,122,101,90,12,99,111,109,109,101,110, + 116,95,115,105,122,101,218,11,102,105,108,101,95,111,102,102, + 115,101,116,114,44,0,0,0,114,13,0,0,0,218,1,116, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, + 27,0,0,0,125,1,0,0,115,214,0,0,0,2,1,14, + 1,12,1,20,1,8,2,2,1,14,1,8,1,14,1,12, + 1,20,1,12,1,18,1,18,1,2,3,12,1,12,1,12, + 1,10,1,2,1,8,255,8,2,2,1,2,255,2,1,4, + 255,2,2,10,1,12,1,14,1,10,1,2,1,8,255,10, + 2,10,1,10,1,2,1,6,255,16,2,14,1,10,1,2, + 1,6,255,16,2,16,2,16,1,10,1,18,1,10,1,18, + 1,8,1,8,1,10,1,18,1,4,2,4,2,2,1,14, + 1,14,1,20,1,10,2,14,1,8,1,18,2,4,1,14, + 1,8,1,16,1,16,1,16,1,16,1,16,1,16,1,16, + 1,16,1,16,1,16,1,16,1,12,1,10,1,18,1,8, + 1,2,2,14,1,14,1,20,1,14,1,18,1,2,4,28, + 1,22,1,14,1,20,1,10,2,10,2,2,3,14,1,14, + 1,22,1,12,2,12,1,20,1,8,1,44,1,14,1,4, + 1,255,128,114,27,0,0,0,117,190,1,0,0,0,1,2, + 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, + 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34, + 35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50, + 51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66, + 67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82, + 83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98, + 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114, + 115,116,117,118,119,120,121,122,123,124,125,126,127,195,135,195, + 188,195,169,195,162,195,164,195,160,195,165,195,167,195,170,195, + 171,195,168,195,175,195,174,195,172,195,132,195,133,195,137,195, + 166,195,134,195,180,195,182,195,178,195,187,195,185,195,191,195, + 150,195,156,194,162,194,163,194,165,226,130,167,198,146,195,161, + 195,173,195,179,195,186,195,177,195,145,194,170,194,186,194,191, + 226,140,144,194,172,194,189,194,188,194,161,194,171,194,187,226, + 150,145,226,150,146,226,150,147,226,148,130,226,148,164,226,149, + 161,226,149,162,226,149,150,226,149,149,226,149,163,226,149,145, + 226,149,151,226,149,157,226,149,156,226,149,155,226,148,144,226, + 148,148,226,148,180,226,148,172,226,148,156,226,148,128,226,148, + 188,226,149,158,226,149,159,226,149,154,226,149,148,226,149,169, + 226,149,166,226,149,160,226,149,144,226,149,172,226,149,167,226, + 149,168,226,149,164,226,149,165,226,149,153,226,149,152,226,149, + 146,226,149,147,226,149,171,226,149,170,226,148,152,226,148,140, + 226,150,136,226,150,132,226,150,140,226,150,144,226,150,128,206, + 177,195,159,206,147,207,128,206,163,207,131,194,181,207,132,206, + 166,206,152,206,169,206,180,226,136,158,207,134,206,181,226,136, + 169,226,137,161,194,177,226,137,165,226,137,164,226,140,160,226, + 140,161,195,183,226,137,136,194,176,226,136,153,194,183,226,136, + 154,226,129,191,194,178,226,150,160,194,160,99,0,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0, + 67,0,0,0,115,106,0,0,0,116,0,114,22,116,1,160, + 2,100,1,161,1,1,0,116,3,100,2,131,1,130,1,100, + 3,97,0,122,58,122,16,100,4,100,5,108,4,109,5,125, + 0,1,0,87,0,110,32,4,0,116,6,121,76,1,0,1, + 0,1,0,116,1,160,2,100,1,161,1,1,0,116,3,100, + 2,131,1,130,1,48,0,87,0,100,6,97,0,110,6,100, + 6,97,0,48,0,116,1,160,2,100,7,161,1,1,0,124, + 0,83,0,41,8,78,122,27,122,105,112,105,109,112,111,114, + 116,58,32,122,108,105,98,32,85,78,65,86,65,73,76,65, + 66,76,69,250,41,99,97,110,39,116,32,100,101,99,111,109, + 112,114,101,115,115,32,100,97,116,97,59,32,122,108,105,98, + 32,110,111,116,32,97,118,97,105,108,97,98,108,101,84,114, + 0,0,0,0,169,1,218,10,100,101,99,111,109,112,114,101, + 115,115,70,122,25,122,105,112,105,109,112,111,114,116,58,32, + 122,108,105,98,32,97,118,97,105,108,97,98,108,101,41,7, + 218,15,95,105,109,112,111,114,116,105,110,103,95,122,108,105, + 98,114,45,0,0,0,114,78,0,0,0,114,3,0,0,0, + 90,4,122,108,105,98,114,140,0,0,0,218,9,69,120,99, + 101,112,116,105,111,110,114,139,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,20,95,103,101,116, + 95,100,101,99,111,109,112,114,101,115,115,95,102,117,110,99, + 27,2,0,0,115,26,0,0,0,4,2,10,3,8,1,4, + 2,4,1,16,1,12,1,10,1,12,1,12,2,10,2,4, + 1,255,128,114,143,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,17,0,0,0,9,0,0,0,67,0,0, + 0,115,132,1,0,0,124,1,92,8,125,2,125,3,125,4, + 125,5,125,6,125,7,125,8,125,9,124,4,100,1,107,0, + 114,36,116,0,100,2,131,1,130,1,116,1,160,2,124,0, + 161,1,144,1,143,6,125,10,122,14,124,10,160,3,124,6, + 161,1,1,0,87,0,110,32,4,0,116,4,121,96,1,0, + 1,0,1,0,116,0,100,3,124,0,155,2,157,2,124,0, + 100,4,141,2,130,1,48,0,124,10,160,5,100,5,161,1, + 125,11,116,6,124,11,131,1,100,5,107,3,114,128,116,7, + 100,6,131,1,130,1,124,11,100,0,100,7,133,2,25,0, + 100,8,107,3,114,162,116,0,100,9,124,0,155,2,157,2, + 124,0,100,4,141,2,130,1,116,8,124,11,100,10,100,11, + 133,2,25,0,131,1,125,12,116,8,124,11,100,11,100,5, + 133,2,25,0,131,1,125,13,100,5,124,12,23,0,124,13, + 23,0,125,14,124,6,124,14,55,0,125,6,122,14,124,10, + 160,3,124,6,161,1,1,0,87,0,110,34,4,0,116,4, + 144,1,121,6,1,0,1,0,1,0,116,0,100,3,124,0, + 155,2,157,2,124,0,100,4,141,2,130,1,48,0,124,10, + 160,5,124,4,161,1,125,15,116,6,124,15,131,1,124,4, + 107,3,144,1,114,40,116,4,100,12,131,1,130,1,87,0, + 100,0,4,0,4,0,131,3,1,0,110,18,49,0,144,1, + 115,62,48,0,1,0,1,0,1,0,89,0,1,0,124,3, + 100,1,107,2,144,1,114,86,124,15,83,0,122,10,116,9, + 131,0,125,16,87,0,110,24,4,0,116,10,144,1,121,120, + 1,0,1,0,1,0,116,0,100,13,131,1,130,1,48,0, + 124,16,124,15,100,14,131,2,83,0,41,15,78,114,0,0, + 0,0,122,18,110,101,103,97,116,105,118,101,32,100,97,116, + 97,32,115,105,122,101,114,91,0,0,0,114,12,0,0,0, + 114,103,0,0,0,114,97,0,0,0,114,92,0,0,0,115, + 4,0,0,0,80,75,3,4,122,23,98,97,100,32,108,111, + 99,97,108,32,102,105,108,101,32,104,101,97,100,101,114,58, + 32,233,26,0,0,0,114,102,0,0,0,122,26,122,105,112, + 105,109,112,111,114,116,58,32,99,97,110,39,116,32,114,101, + 97,100,32,100,97,116,97,114,138,0,0,0,105,241,255,255, + 255,41,11,114,3,0,0,0,114,109,0,0,0,114,110,0, + 0,0,114,111,0,0,0,114,22,0,0,0,114,113,0,0, + 0,114,55,0,0,0,114,118,0,0,0,114,1,0,0,0, + 114,143,0,0,0,114,142,0,0,0,41,17,114,29,0,0, + 0,114,58,0,0,0,90,8,100,97,116,97,112,97,116,104, + 114,129,0,0,0,114,133,0,0,0,114,124,0,0,0,114, + 136,0,0,0,114,130,0,0,0,114,131,0,0,0,114,132, + 0,0,0,114,122,0,0,0,114,123,0,0,0,114,134,0, + 0,0,114,135,0,0,0,114,126,0,0,0,90,8,114,97, + 119,95,100,97,116,97,114,140,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,56,0,0,0,48, + 2,0,0,115,64,0,0,0,20,1,8,1,8,1,14,2, + 2,2,14,1,12,1,20,1,10,1,12,1,8,1,16,2, + 18,2,16,2,16,1,12,1,8,1,2,1,14,1,14,1, + 20,1,10,1,14,1,40,1,10,2,4,2,2,3,10,1, + 14,1,10,1,10,1,255,128,114,56,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,16,0,0,0,116,0,124,0,124, + 1,24,0,131,1,100,1,107,1,83,0,41,2,78,114,5, + 0,0,0,41,1,218,3,97,98,115,41,2,90,2,116,49, + 90,2,116,50,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,9,95,101,113,95,109,116,105,109,101,94,2, + 0,0,115,4,0,0,0,16,2,255,128,114,146,0,0,0, + 99,5,0,0,0,0,0,0,0,0,0,0,0,14,0,0, + 0,8,0,0,0,67,0,0,0,115,60,1,0,0,124,3, + 124,2,100,1,156,2,125,5,122,18,116,0,160,1,124,4, + 124,3,124,5,161,3,125,6,87,0,110,20,4,0,116,2, + 121,48,1,0,1,0,1,0,89,0,100,0,83,0,48,0, + 124,6,100,2,64,0,100,3,107,3,125,7,124,7,114,182, + 124,6,100,4,64,0,100,3,107,3,125,8,116,3,106,4, + 100,5,107,3,144,1,114,10,124,8,115,106,116,3,106,4, + 100,6,107,2,144,1,114,10,116,5,124,0,124,2,131,2, + 125,9,124,9,100,0,117,1,144,1,114,10,116,3,160,6, + 116,0,106,7,124,9,161,2,125,10,122,20,116,0,160,8, + 124,4,124,10,124,3,124,5,161,4,1,0,87,0,110,104, + 4,0,116,2,121,180,1,0,1,0,1,0,89,0,100,0, + 83,0,48,0,116,9,124,0,124,2,131,2,92,2,125,11, + 125,12,124,11,144,1,114,10,116,10,116,11,124,4,100,7, + 100,8,133,2,25,0,131,1,124,11,131,2,114,246,116,11, + 124,4,100,8,100,9,133,2,25,0,131,1,124,12,107,3, + 144,1,114,10,116,12,160,13,100,10,124,3,155,2,157,2, + 161,1,1,0,100,0,83,0,116,14,160,15,124,4,100,9, + 100,0,133,2,25,0,161,1,125,13,116,16,124,13,116,17, + 131,2,144,1,115,56,116,18,100,11,124,1,155,2,100,12, + 157,3,131,1,130,1,124,13,83,0,41,13,78,41,2,114, + 44,0,0,0,114,13,0,0,0,114,5,0,0,0,114,0, + 0,0,0,114,85,0,0,0,90,5,110,101,118,101,114,90, + 6,97,108,119,97,121,115,114,98,0,0,0,114,93,0,0, + 0,114,94,0,0,0,122,22,98,121,116,101,99,111,100,101, + 32,105,115,32,115,116,97,108,101,32,102,111,114,32,122,16, + 99,111,109,112,105,108,101,100,32,109,111,100,117,108,101,32, + 122,21,32,105,115,32,110,111,116,32,97,32,99,111,100,101, + 32,111,98,106,101,99,116,41,19,114,21,0,0,0,90,13, + 95,99,108,97,115,115,105,102,121,95,112,121,99,114,77,0, + 0,0,218,4,95,105,109,112,90,21,99,104,101,99,107,95, + 104,97,115,104,95,98,97,115,101,100,95,112,121,99,115,218, + 15,95,103,101,116,95,112,121,99,95,115,111,117,114,99,101, + 218,11,115,111,117,114,99,101,95,104,97,115,104,90,17,95, + 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, + 90,18,95,118,97,108,105,100,97,116,101,95,104,97,115,104, + 95,112,121,99,218,29,95,103,101,116,95,109,116,105,109,101, + 95,97,110,100,95,115,105,122,101,95,111,102,95,115,111,117, + 114,99,101,114,146,0,0,0,114,2,0,0,0,114,45,0, + 0,0,114,78,0,0,0,218,7,109,97,114,115,104,97,108, + 90,5,108,111,97,100,115,114,15,0,0,0,218,10,95,99, + 111,100,101,95,116,121,112,101,218,9,84,121,112,101,69,114, + 114,111,114,41,14,114,32,0,0,0,114,57,0,0,0,114, + 66,0,0,0,114,38,0,0,0,114,125,0,0,0,90,11, + 101,120,99,95,100,101,116,97,105,108,115,114,128,0,0,0, + 90,10,104,97,115,104,95,98,97,115,101,100,90,12,99,104, + 101,99,107,95,115,111,117,114,99,101,90,12,115,111,117,114, + 99,101,95,98,121,116,101,115,114,149,0,0,0,90,12,115, + 111,117,114,99,101,95,109,116,105,109,101,90,11,115,111,117, + 114,99,101,95,115,105,122,101,114,50,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,15,95,117, + 110,109,97,114,115,104,97,108,95,99,111,100,101,104,2,0, + 0,115,84,0,0,0,2,2,2,1,6,254,2,5,18,1, + 12,1,8,1,12,2,4,1,12,1,12,1,2,1,2,255, + 8,1,4,255,10,2,10,1,4,1,4,1,2,1,4,254, + 2,5,4,1,8,1,8,255,12,2,8,1,8,3,6,255, + 6,3,22,3,18,1,4,255,4,2,8,1,4,255,4,2, + 18,2,12,1,16,1,4,1,255,128,114,154,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 4,0,0,0,67,0,0,0,115,28,0,0,0,124,0,160, + 0,100,1,100,2,161,2,125,0,124,0,160,0,100,3,100, + 2,161,2,125,0,124,0,83,0,41,4,78,115,2,0,0, + 0,13,10,243,1,0,0,0,10,243,1,0,0,0,13,41, + 1,114,19,0,0,0,41,1,218,6,115,111,117,114,99,101, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 23,95,110,111,114,109,97,108,105,122,101,95,108,105,110,101, + 95,101,110,100,105,110,103,115,155,2,0,0,115,8,0,0, + 0,12,1,12,1,4,1,255,128,114,158,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,6, + 0,0,0,67,0,0,0,115,24,0,0,0,116,0,124,1, + 131,1,125,1,116,1,124,1,124,0,100,1,100,2,100,3, + 141,4,83,0,41,4,78,114,76,0,0,0,84,41,1,90, + 12,100,111,110,116,95,105,110,104,101,114,105,116,41,2,114, + 158,0,0,0,218,7,99,111,109,112,105,108,101,41,2,114, + 57,0,0,0,114,157,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,15,95,99,111,109,112,105, + 108,101,95,115,111,117,114,99,101,162,2,0,0,115,6,0, + 0,0,8,1,16,1,255,128,114,160,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,11,0, + 0,0,67,0,0,0,115,68,0,0,0,116,0,160,1,124, + 0,100,1,63,0,100,2,23,0,124,0,100,3,63,0,100, + 4,64,0,124,0,100,5,64,0,124,1,100,6,63,0,124, + 1,100,3,63,0,100,7,64,0,124,1,100,5,64,0,100, + 8,20,0,100,9,100,9,100,9,102,9,161,1,83,0,41, + 10,78,233,9,0,0,0,105,188,7,0,0,233,5,0,0, + 0,233,15,0,0,0,233,31,0,0,0,233,11,0,0,0, + 233,63,0,0,0,114,85,0,0,0,114,14,0,0,0,41, + 2,114,130,0,0,0,90,6,109,107,116,105,109,101,41,2, + 218,1,100,114,137,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,14,95,112,97,114,115,101,95, + 100,111,115,116,105,109,101,168,2,0,0,115,20,0,0,0, + 4,1,10,1,10,1,6,1,6,1,10,1,10,1,6,1, + 6,249,255,128,114,168,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,10,0,0,0,67,0, + 0,0,115,110,0,0,0,122,82,124,1,100,1,100,0,133, + 2,25,0,100,2,118,0,115,22,74,0,130,1,124,1,100, + 0,100,1,133,2,25,0,125,1,124,0,106,0,124,1,25, + 0,125,2,124,2,100,3,25,0,125,3,124,2,100,4,25, + 0,125,4,124,2,100,5,25,0,125,5,116,1,124,4,124, + 3,131,2,124,5,102,2,87,0,83,0,4,0,116,2,116, + 3,116,4,102,3,121,108,1,0,1,0,1,0,89,0,100, + 6,83,0,48,0,41,7,78,114,14,0,0,0,169,2,218, + 1,99,218,1,111,114,162,0,0,0,233,6,0,0,0,233, + 3,0,0,0,41,2,114,0,0,0,0,114,0,0,0,0, + 41,5,114,28,0,0,0,114,168,0,0,0,114,26,0,0, + 0,218,10,73,110,100,101,120,69,114,114,111,114,114,153,0, + 0,0,41,6,114,32,0,0,0,114,13,0,0,0,114,58, + 0,0,0,114,130,0,0,0,114,131,0,0,0,90,17,117, + 110,99,111,109,112,114,101,115,115,101,100,95,115,105,122,101, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, + 150,0,0,0,181,2,0,0,115,22,0,0,0,2,1,20, + 2,12,1,10,1,8,3,8,1,8,1,16,1,18,1,8, + 1,255,128,114,150,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, + 0,115,80,0,0,0,124,1,100,1,100,0,133,2,25,0, + 100,2,118,0,115,20,74,0,130,1,124,1,100,0,100,1, + 133,2,25,0,125,1,122,14,124,0,106,0,124,1,25,0, + 125,2,87,0,110,20,4,0,116,1,121,66,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,116,2,124,0,106,3, + 124,2,131,2,83,0,41,3,78,114,14,0,0,0,114,169, + 0,0,0,41,4,114,28,0,0,0,114,26,0,0,0,114, + 56,0,0,0,114,29,0,0,0,41,3,114,32,0,0,0, + 114,13,0,0,0,114,58,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,148,0,0,0,200,2, + 0,0,115,16,0,0,0,20,2,12,1,2,2,14,1,12, + 1,8,1,12,2,255,128,114,148,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,11,0,0,0,9,0,0, + 0,67,0,0,0,115,190,0,0,0,116,0,124,0,124,1, + 131,2,125,2,116,1,68,0,93,156,92,3,125,3,125,4, + 125,5,124,2,124,3,23,0,125,6,116,2,106,3,100,1, + 124,0,106,4,116,5,124,6,100,2,100,3,141,5,1,0, + 122,14,124,0,106,6,124,6,25,0,125,7,87,0,110,18, + 4,0,116,7,121,86,1,0,1,0,1,0,89,0,113,14, + 48,0,124,7,100,4,25,0,125,8,116,8,124,0,106,4, + 124,7,131,2,125,9,124,4,114,130,116,9,124,0,124,8, + 124,6,124,1,124,9,131,5,125,10,110,10,116,10,124,8, + 124,9,131,2,125,10,124,10,100,0,117,0,114,150,113,14, + 124,7,100,4,25,0,125,8,124,10,124,5,124,8,102,3, + 2,0,1,0,83,0,116,11,100,5,124,1,155,2,157,2, + 124,1,100,6,141,2,130,1,41,7,78,122,13,116,114,121, + 105,110,103,32,123,125,123,125,123,125,114,85,0,0,0,41, + 1,90,9,118,101,114,98,111,115,105,116,121,114,0,0,0, + 0,114,61,0,0,0,114,62,0,0,0,41,12,114,36,0, + 0,0,114,88,0,0,0,114,45,0,0,0,114,78,0,0, + 0,114,29,0,0,0,114,20,0,0,0,114,28,0,0,0, + 114,26,0,0,0,114,56,0,0,0,114,154,0,0,0,114, + 160,0,0,0,114,3,0,0,0,41,11,114,32,0,0,0, + 114,38,0,0,0,114,13,0,0,0,114,89,0,0,0,114, + 90,0,0,0,114,51,0,0,0,114,66,0,0,0,114,58, + 0,0,0,114,40,0,0,0,114,125,0,0,0,114,50,0, 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,15,95,99,111,109,112,105,108,101,95,115,111,117,114, - 99,101,130,2,0,0,115,6,0,0,0,8,1,16,1,255, - 128,114,159,0,0,0,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,11,0,0,0,67,0,0,0,115, - 68,0,0,0,116,0,160,1,124,0,100,1,63,0,100,2, - 23,0,124,0,100,3,63,0,100,4,64,0,124,0,100,5, - 64,0,124,1,100,6,63,0,124,1,100,3,63,0,100,7, - 64,0,124,1,100,5,64,0,100,8,20,0,100,9,100,9, - 100,9,102,9,161,1,83,0,41,10,78,233,9,0,0,0, - 105,188,7,0,0,233,5,0,0,0,233,15,0,0,0,233, - 31,0,0,0,233,11,0,0,0,233,63,0,0,0,114,84, - 0,0,0,114,14,0,0,0,41,2,114,129,0,0,0,90, - 6,109,107,116,105,109,101,41,2,218,1,100,114,136,0,0, - 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,14,95,112,97,114,115,101,95,100,111,115,116,105,109,101, - 136,2,0,0,115,20,0,0,0,4,1,10,1,10,1,6, - 1,6,1,10,1,10,1,6,1,6,249,255,128,114,167,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,10,0,0,0,67,0,0,0,115,110,0,0,0, - 122,82,124,1,100,1,100,0,133,2,25,0,100,2,118,0, - 115,22,74,0,130,1,124,1,100,0,100,1,133,2,25,0, - 125,1,124,0,106,0,124,1,25,0,125,2,124,2,100,3, - 25,0,125,3,124,2,100,4,25,0,125,4,124,2,100,5, - 25,0,125,5,116,1,124,4,124,3,131,2,124,5,102,2, - 87,0,83,0,4,0,116,2,116,3,116,4,102,3,121,108, - 1,0,1,0,1,0,89,0,100,6,83,0,48,0,41,7, - 78,114,14,0,0,0,169,2,218,1,99,218,1,111,114,161, - 0,0,0,233,6,0,0,0,233,3,0,0,0,41,2,114, - 0,0,0,0,114,0,0,0,0,41,5,114,28,0,0,0, - 114,167,0,0,0,114,26,0,0,0,218,10,73,110,100,101, - 120,69,114,114,111,114,114,152,0,0,0,41,6,114,32,0, - 0,0,114,13,0,0,0,114,54,0,0,0,114,129,0,0, - 0,114,130,0,0,0,90,17,117,110,99,111,109,112,114,101, - 115,115,101,100,95,115,105,122,101,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,149,0,0,0,149,2,0, - 0,115,22,0,0,0,2,1,20,2,12,1,10,1,8,3, - 8,1,8,1,16,1,18,1,8,1,255,128,114,149,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,8,0,0,0,67,0,0,0,115,80,0,0,0,124, - 1,100,1,100,0,133,2,25,0,100,2,118,0,115,20,74, - 0,130,1,124,1,100,0,100,1,133,2,25,0,125,1,122, - 14,124,0,106,0,124,1,25,0,125,2,87,0,110,20,4, - 0,116,1,121,66,1,0,1,0,1,0,89,0,100,0,83, - 0,48,0,116,2,124,0,106,3,124,2,131,2,83,0,41, - 3,78,114,14,0,0,0,114,168,0,0,0,41,4,114,28, - 0,0,0,114,26,0,0,0,114,52,0,0,0,114,29,0, - 0,0,41,3,114,32,0,0,0,114,13,0,0,0,114,54, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,147,0,0,0,168,2,0,0,115,16,0,0,0, - 20,2,12,1,2,2,14,1,12,1,8,1,12,2,255,128, - 114,147,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,11,0,0,0,9,0,0,0,67,0,0,0,115,190, - 0,0,0,116,0,124,0,124,1,131,2,125,2,116,1,68, - 0,93,156,92,3,125,3,125,4,125,5,124,2,124,3,23, - 0,125,6,116,2,106,3,100,1,124,0,106,4,116,5,124, - 6,100,2,100,3,141,5,1,0,122,14,124,0,106,6,124, - 6,25,0,125,7,87,0,110,18,4,0,116,7,121,86,1, - 0,1,0,1,0,89,0,113,14,48,0,124,7,100,4,25, - 0,125,8,116,8,124,0,106,4,124,7,131,2,125,9,124, - 4,114,130,116,9,124,0,124,8,124,6,124,1,124,9,131, - 5,125,10,110,10,116,10,124,8,124,9,131,2,125,10,124, - 10,100,0,117,0,114,150,113,14,124,7,100,4,25,0,125, - 8,124,10,124,5,124,8,102,3,2,0,1,0,83,0,116, - 11,100,5,124,1,155,2,157,2,124,1,100,6,141,2,130, - 1,41,7,78,122,13,116,114,121,105,110,103,32,123,125,123, - 125,123,125,114,84,0,0,0,41,1,90,9,118,101,114,98, - 111,115,105,116,121,114,0,0,0,0,114,57,0,0,0,114, - 58,0,0,0,41,12,114,36,0,0,0,114,87,0,0,0, - 114,76,0,0,0,114,77,0,0,0,114,29,0,0,0,114, - 20,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52, - 0,0,0,114,153,0,0,0,114,159,0,0,0,114,3,0, - 0,0,41,11,114,32,0,0,0,114,38,0,0,0,114,13, - 0,0,0,114,88,0,0,0,114,89,0,0,0,114,47,0, - 0,0,114,63,0,0,0,114,54,0,0,0,114,40,0,0, - 0,114,124,0,0,0,114,46,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,114,44,0,0,0,183, - 2,0,0,115,38,0,0,0,10,1,14,1,8,1,22,1, - 2,1,14,1,12,1,6,1,8,2,12,1,4,1,18,1, - 10,2,8,1,2,3,8,1,14,1,18,2,255,128,114,44, - 0,0,0,41,44,114,82,0,0,0,90,26,95,102,114,111, - 122,101,110,95,105,109,112,111,114,116,108,105,98,95,101,120, - 116,101,114,110,97,108,114,21,0,0,0,114,1,0,0,0, - 114,2,0,0,0,90,17,95,102,114,111,122,101,110,95,105, - 109,112,111,114,116,108,105,98,114,76,0,0,0,114,146,0, - 0,0,114,108,0,0,0,114,150,0,0,0,114,67,0,0, - 0,114,129,0,0,0,90,7,95,95,97,108,108,95,95,114, - 20,0,0,0,90,15,112,97,116,104,95,115,101,112,97,114, - 97,116,111,114,115,114,18,0,0,0,114,75,0,0,0,114, - 3,0,0,0,114,25,0,0,0,218,4,116,121,112,101,114, - 70,0,0,0,114,111,0,0,0,114,113,0,0,0,114,115, - 0,0,0,114,4,0,0,0,114,87,0,0,0,114,36,0, - 0,0,114,37,0,0,0,114,35,0,0,0,114,27,0,0, - 0,114,120,0,0,0,114,140,0,0,0,114,142,0,0,0, - 114,52,0,0,0,114,145,0,0,0,114,153,0,0,0,218, - 8,95,95,99,111,100,101,95,95,114,151,0,0,0,114,157, - 0,0,0,114,159,0,0,0,114,167,0,0,0,114,149,0, - 0,0,114,147,0,0,0,114,44,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,8,60,109,111,100,117,108,101,62,1,0,0,0,115,90, - 0,0,0,4,0,8,16,16,1,8,1,8,1,8,1,8, - 1,8,1,8,1,8,2,6,3,14,1,16,3,4,4,8, - 2,4,2,4,1,4,1,14,2,0,127,12,125,12,1,2, - 1,2,1,4,252,8,9,8,4,8,9,8,31,2,126,2, - 254,4,29,8,5,8,21,8,46,8,10,10,46,8,5,8, - 7,8,6,8,13,8,19,8,15,4,128,255,128, + 0,114,48,0,0,0,215,2,0,0,115,38,0,0,0,10, + 1,14,1,8,1,22,1,2,1,14,1,12,1,6,1,8, + 2,12,1,4,1,18,1,10,2,8,1,2,3,8,1,14, + 1,18,2,255,128,114,48,0,0,0,41,45,114,83,0,0, + 0,90,26,95,102,114,111,122,101,110,95,105,109,112,111,114, + 116,108,105,98,95,101,120,116,101,114,110,97,108,114,21,0, + 0,0,114,1,0,0,0,114,2,0,0,0,90,17,95,102, + 114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,114, + 45,0,0,0,114,147,0,0,0,114,109,0,0,0,114,151, + 0,0,0,114,69,0,0,0,114,130,0,0,0,90,7,95, + 95,97,108,108,95,95,114,20,0,0,0,90,15,112,97,116, + 104,95,115,101,112,97,114,97,116,111,114,115,114,18,0,0, + 0,114,77,0,0,0,114,3,0,0,0,114,25,0,0,0, + 218,4,116,121,112,101,114,72,0,0,0,114,112,0,0,0, + 114,114,0,0,0,114,116,0,0,0,90,13,95,76,111,97, + 100,101,114,66,97,115,105,99,115,114,4,0,0,0,114,88, + 0,0,0,114,36,0,0,0,114,37,0,0,0,114,35,0, + 0,0,114,27,0,0,0,114,121,0,0,0,114,141,0,0, + 0,114,143,0,0,0,114,56,0,0,0,114,146,0,0,0, + 114,154,0,0,0,218,8,95,95,99,111,100,101,95,95,114, + 152,0,0,0,114,158,0,0,0,114,160,0,0,0,114,168, + 0,0,0,114,150,0,0,0,114,148,0,0,0,114,48,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,8,60,109,111,100,117,108,101,62, + 1,0,0,0,115,92,0,0,0,4,0,8,16,16,1,8, + 1,8,1,8,1,8,1,8,1,8,1,8,2,6,3,14, + 1,16,3,4,4,8,2,4,2,4,1,4,1,18,2,0, + 127,0,127,12,30,12,1,2,1,2,1,4,252,8,9,8, + 4,8,9,8,31,2,126,2,254,4,29,8,5,8,21,8, + 46,8,10,10,46,8,5,8,7,8,6,8,13,8,19,8, + 15,4,128,255,128, }; From ec83ecacd5d7b0400e6d3a5523a2d80efd3ef9df Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Sat, 14 Nov 2020 12:02:15 +0000 Subject: [PATCH 0533/1261] fix typo in ThreadedChildWatcher docs (GH-23277) --- Doc/library/asyncio-policy.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/asyncio-policy.rst b/Doc/library/asyncio-policy.rst index 88e69ceff9adc1..5e69525e90dd27 100644 --- a/Doc/library/asyncio-policy.rst +++ b/Doc/library/asyncio-policy.rst @@ -209,7 +209,7 @@ implementation used by the asyncio event loop: It works reliably even when the asyncio event loop is run in a non-main OS thread. There is no noticeable overhead when handling a big number of children (*O(1)* each - time a child terminates), but stating a thread per process requires extra memory. + time a child terminates), but starting a thread per process requires extra memory. This watcher is used by default. From 901d99b378e9ac24531556a8de2fa47845c05f8c Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Sat, 14 Nov 2020 20:03:42 +0800 Subject: [PATCH 0534/1261] bpo-41832: Restore note about NULL in PyType_Slot.pfunc (GH-23243) --- Doc/c-api/type.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index f9037c89d8bd3b..84c0a02046a65e 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -265,3 +265,5 @@ The following functions and structs are used to create The desired value of the slot. In most cases, this is a pointer to a function. + + Slots other than ``Py_tp_doc`` may not be ``NULL``. From b0422451590225da5e95ecf3f755c55e1f5f3b5b Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sat, 14 Nov 2020 16:07:47 +0100 Subject: [PATCH 0535/1261] bpo-42351: Avoid error when opening header with non-UTF8 encoding (GH-23279) grep_headers_for() would error out when a header contained text that cannot be interpreted as UTF-8. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c12b5f5042551a..91358af9b616b2 100644 --- a/setup.py +++ b/setup.py @@ -241,7 +241,7 @@ def is_macosx_sdk_path(path): def grep_headers_for(function, headers): for header in headers: - with open(header, 'r') as f: + with open(header, 'r', errors='surrogateescape') as f: if function in f.read(): return True return False From 6be06f91e2d79c542a1a3fd6f9732f1e9ff943ea Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 15 Nov 2020 18:16:59 +0200 Subject: [PATCH 0536/1261] bpo-42318: Fix support of non-BMP characters in Tkinter on macOS (GH-23281) --- Lib/test/test_tcl.py | 46 +++++++++++++--- .../2020-11-14-13-46-27.bpo-42318.wYAcBD.rst | 1 + Modules/_tkinter.c | 54 ++++++++++++++++++- 3 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index cd2a30e533ae03..d104eb89104215 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -1,4 +1,5 @@ import unittest +import locale import re import subprocess import sys @@ -61,6 +62,10 @@ def test_eval_null_in_result(self): tcl = self.interp self.assertEqual(tcl.eval('set a "a\\0b"'), 'a\x00b') + def test_eval_surrogates_in_result(self): + tcl = self.interp + self.assertIn(tcl.eval(r'set a "<\ud83d\udcbb>"'), '<\U0001f4bb>') + def testEvalException(self): tcl = self.interp self.assertRaises(TclError,tcl.eval,'set a') @@ -193,29 +198,48 @@ def test_getboolean(self): def testEvalFile(self): tcl = self.interp - with open(os_helper.TESTFN, 'w') as f: - self.addCleanup(os_helper.unlink, os_helper.TESTFN) + filename = os_helper.TESTFN_ASCII + self.addCleanup(os_helper.unlink, filename) + with open(filename, 'w') as f: f.write("""set a 1 set b 2 set c [ expr $a + $b ] """) - tcl.evalfile(os_helper.TESTFN) + tcl.evalfile(filename) self.assertEqual(tcl.eval('set a'),'1') self.assertEqual(tcl.eval('set b'),'2') self.assertEqual(tcl.eval('set c'),'3') def test_evalfile_null_in_result(self): tcl = self.interp - with open(os_helper.TESTFN, 'w') as f: - self.addCleanup(os_helper.unlink, os_helper.TESTFN) + filename = os_helper.TESTFN_ASCII + self.addCleanup(os_helper.unlink, filename) + with open(filename, 'w') as f: f.write(""" set a "a\0b" set b "a\\0b" """) - tcl.evalfile(os_helper.TESTFN) + tcl.evalfile(filename) self.assertEqual(tcl.eval('set a'), 'a\x00b') self.assertEqual(tcl.eval('set b'), 'a\x00b') + def test_evalfile_surrogates_in_result(self): + tcl = self.interp + encoding = tcl.call('encoding', 'system') + self.addCleanup(tcl.call, 'encoding', 'system', encoding) + tcl.call('encoding', 'system', 'utf-8') + + filename = os_helper.TESTFN_ASCII + self.addCleanup(os_helper.unlink, filename) + with open(filename, 'wb') as f: + f.write(b""" + set a "<\xed\xa0\xbd\xed\xb2\xbb>" + set b "<\\ud83d\\udcbb>" + """) + tcl.evalfile(filename) + self.assertEqual(tcl.eval('set a'), '<\U0001f4bb>') + self.assertEqual(tcl.eval('set b'), '<\U0001f4bb>') + def testEvalFileException(self): tcl = self.interp filename = "doesnotexists" @@ -438,6 +462,11 @@ def passValue(value): self.assertEqual(passValue('str\x00ing\u20ac'), 'str\x00ing\u20ac') self.assertEqual(passValue('str\x00ing\U0001f4bb'), 'str\x00ing\U0001f4bb') + if sys.platform != 'win32': + self.assertEqual(passValue('<\udce2\udc82\udcac>'), + '<\u20ac>') + self.assertEqual(passValue('<\udced\udca0\udcbd\udced\udcb2\udcbb>'), + '<\U0001f4bb>') self.assertEqual(passValue(b'str\x00ing'), b'str\x00ing' if self.wantobjects else 'str\x00ing') self.assertEqual(passValue(b'str\xc0\x80ing'), @@ -497,6 +526,9 @@ def float_eq(actual, expected): check('string\xbd') check('string\u20ac') check('string\U0001f4bb') + if sys.platform != 'win32': + check('<\udce2\udc82\udcac>', '<\u20ac>') + check('<\udced\udca0\udcbd\udced\udcb2\udcbb>', '<\U0001f4bb>') check('') check(b'string', 'string') check(b'string\xe2\x82\xac', 'string\xe2\x82\xac') @@ -540,6 +572,8 @@ def test_splitlist(self): ('a \u20ac', ('a', '\u20ac')), ('a \U0001f4bb', ('a', '\U0001f4bb')), (b'a \xe2\x82\xac', ('a', '\u20ac')), + (b'a \xf0\x9f\x92\xbb', ('a', '\U0001f4bb')), + (b'a \xed\xa0\xbd\xed\xb2\xbb', ('a', '\U0001f4bb')), (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')), ('a {b c}', ('a', 'b c')), (r'a b\ c', ('a', 'b c')), diff --git a/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst b/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst new file mode 100644 index 00000000000000..e72daebb2f152a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst @@ -0,0 +1 @@ +Fixed support of non-BMP characters in :mod:`tkinter` on macOS. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 793c5e71548846..b30141d4497bda 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -395,7 +395,8 @@ unicodeFromTclStringAndSize(const char *s, Py_ssize_t size) char *buf = NULL; PyErr_Clear(); - /* Tcl encodes null character as \xc0\x80 */ + /* Tcl encodes null character as \xc0\x80. + https://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8 */ if (memchr(s, '\xc0', size)) { char *q; const char *e = s + size; @@ -419,6 +420,57 @@ unicodeFromTclStringAndSize(const char *s, Py_ssize_t size) if (buf != NULL) { PyMem_Free(buf); } + if (r == NULL || PyUnicode_KIND(r) == PyUnicode_1BYTE_KIND) { + return r; + } + + /* In CESU-8 non-BMP characters are represented as a surrogate pair, + like in UTF-16, and then each surrogate code point is encoded in UTF-8. + https://en.wikipedia.org/wiki/CESU-8 */ + Py_ssize_t len = PyUnicode_GET_LENGTH(r); + Py_ssize_t i, j; + /* All encoded surrogate characters start with \xED. */ + i = PyUnicode_FindChar(r, 0xdcED, 0, len, 1); + if (i == -2) { + Py_DECREF(r); + return NULL; + } + if (i == -1) { + return r; + } + Py_UCS4 *u = PyUnicode_AsUCS4Copy(r); + Py_DECREF(r); + if (u == NULL) { + return NULL; + } + Py_UCS4 ch; + for (j = i; i < len; i++, u[j++] = ch) { + Py_UCS4 ch1, ch2, ch3, high, low; + /* Low surrogates U+D800 - U+DBFF are encoded as + \xED\xA0\x80 - \xED\xAF\xBF. */ + ch1 = ch = u[i]; + if (ch1 != 0xdcED) continue; + ch2 = u[i + 1]; + if (!(0xdcA0 <= ch2 && ch2 <= 0xdcAF)) continue; + ch3 = u[i + 2]; + if (!(0xdc80 <= ch3 && ch3 <= 0xdcBF)) continue; + high = 0xD000 | ((ch2 & 0x3F) << 6) | (ch3 & 0x3F); + assert(Py_UNICODE_IS_HIGH_SURROGATE(high)); + /* High surrogates U+DC00 - U+DFFF are encoded as + \xED\xB0\x80 - \xED\xBF\xBF. */ + ch1 = u[i + 3]; + if (ch1 != 0xdcED) continue; + ch2 = u[i + 4]; + if (!(0xdcB0 <= ch2 && ch2 <= 0xdcBF)) continue; + ch3 = u[i + 5]; + if (!(0xdc80 <= ch3 && ch3 <= 0xdcBF)) continue; + low = 0xD000 | ((ch2 & 0x3F) << 6) | (ch3 & 0x3F); + assert(Py_UNICODE_IS_HIGH_SURROGATE(high)); + ch = Py_UNICODE_JOIN_SURROGATES(high, low); + i += 5; + } + r = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, u, j); + PyMem_Free(u); return r; } From 6e0be5b4e2cf4df1b14927bb359871eebde44184 Mon Sep 17 00:00:00 2001 From: Dominik1123 <15989985+Dominik1123@users.noreply.github.com> Date: Mon, 16 Nov 2020 02:30:55 +0100 Subject: [PATCH 0537/1261] bpo-42317: Improve docs of typing.get_args concerning Union (GH-23254) --- Doc/library/typing.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 9a993c073277f9..a8de984a5ce41b 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1706,6 +1706,9 @@ Introspection helpers For a typing object of the form ``X[Y, Z, ...]`` these functions return ``X`` and ``(Y, Z, ...)``. If ``X`` is a generic alias for a builtin or :mod:`collections` class, it gets normalized to the original class. + If ``X`` is a :class:`Union` contained in another generic type, + the order of ``(Y, Z, ...)`` may be different from the order of + the original arguments ``[Y, Z, ...]`` due to type caching. For unsupported objects return ``None`` and ``()`` correspondingly. Examples:: From 51788ff91a1cb3d306c39756ecc7da220e0c39f0 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 15 Nov 2020 17:44:28 -0800 Subject: [PATCH 0538/1261] More updates to the descriptor howto guide (GH-23238) --- Doc/howto/descriptor.rst | 107 +++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 45 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 8c2e8d562153db..76987fda22b59d 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -16,7 +16,7 @@ storage, and deletion. This guide has four major sections: 1) The "primer" gives a basic overview, moving gently from simple examples, - adding one feature at a time. It is a great place to start. + adding one feature at a time. Start here if you're new to descriptors. 2) The second section shows a complete, practical descriptor example. If you already know the basics, start there. @@ -42,7 +42,8 @@ add new capabilities one by one. Simple example: A descriptor that returns a constant ---------------------------------------------------- -The :class:`Ten` class is a descriptor that always returns the constant ``10``:: +The :class:`Ten` class is a descriptor that always returns the constant ``10`` +from its :meth:`__get__` method:: class Ten: @@ -64,9 +65,11 @@ and descriptor lookup:: >>> a.y # Descriptor lookup 10 -In the ``a.x`` attribute lookup, the dot operator finds the value ``5`` stored -in the class dictionary. In the ``a.y`` descriptor lookup, the dot operator -calls the descriptor's :meth:`__get__()` method. That method returns ``10``. +In the ``a.x`` attribute lookup, the dot operator finds the key ``x`` and the +value ``5`` in the class dictionary. In the ``a.y`` lookup, the dot operator +finds a descriptor instance, recognized by its ``__get__`` method, and calls +that method which returns ``10``. + Note that the value ``10`` is not stored in either the class dictionary or the instance dictionary. Instead, the value ``10`` is computed on demand. @@ -79,7 +82,8 @@ In the next section, we'll create something more useful, a dynamic lookup. Dynamic lookups --------------- -Interesting descriptors typically run computations instead of doing lookups:: +Interesting descriptors typically run computations instead of returning +constants:: import os @@ -98,16 +102,15 @@ Interesting descriptors typically run computations instead of doing lookups:: An interactive session shows that the lookup is dynamic — it computes different, updated answers each time:: - >>> g = Directory('games') >>> s = Directory('songs') + >>> g = Directory('games') + >>> s.size # The songs directory has twenty files + 20 >>> g.size # The games directory has three files 3 - >>> os.system('touch games/newfile') # Add a fourth file to the directory - 0 - >>> g.size # Automatically updated + >>> open('games/newfile').close() # Add a fourth file to the directory + >>> g.size # File count is automatically updated 4 - >>> s.size # The songs directory has twenty files - 20 Besides showing how descriptors can run computations, this example also reveals the purpose of the parameters to :meth:`__get__`. The *self* @@ -208,7 +211,7 @@ be recorded, giving each descriptor its own *public_name* and *private_name*:: def __set_name__(self, owner, name): self.public_name = name - self.private_name = f'_{name}' + self.private_name = '_' + name def __get__(self, obj, objtype=None): value = getattr(obj, self.private_name) @@ -265,9 +268,10 @@ A :term:`descriptor` is what we call any object that defines :meth:`__get__`, Optionally, descriptors can have a :meth:`__set_name__` method. This is only used in cases where a descriptor needs to know either the class where it was -created or the name of class variable it was assigned to. +created or the name of class variable it was assigned to. (This method, if +present, is called even if the class is not a descriptor.) -Descriptors get invoked by the dot operator during attribute lookup. If a +Descriptors get invoked by the dot "operator" during attribute lookup. If a descriptor is accessed indirectly with ``vars(some_class)[descriptor_name]``, the descriptor instance is returned without invoking it. @@ -275,7 +279,7 @@ Descriptors only work when used as class variables. When put in instances, they have no effect. The main motivation for descriptors is to provide a hook allowing objects -stored in class variables to control what happens during dotted lookup. +stored in class variables to control what happens during attribute lookup. Traditionally, the calling class controls what happens during lookup. Descriptors invert that relationship and allow the data being looked-up to @@ -310,7 +314,7 @@ managed attribute descriptor:: class Validator(ABC): def __set_name__(self, owner, name): - self.private_name = f'_{name}' + self.private_name = '_' + name def __get__(self, obj, objtype=None): return getattr(obj, self.private_name) @@ -435,23 +439,21 @@ Defines descriptors, summarizes the protocol, and shows how descriptors are called. Provides an example showing how object relational mappings work. Learning about descriptors not only provides access to a larger toolset, it -creates a deeper understanding of how Python works and an appreciation for the -elegance of its design. +creates a deeper understanding of how Python works. Definition and introduction --------------------------- -In general, a descriptor is an object attribute with "binding behavior", one -whose attribute access has been overridden by methods in the descriptor -protocol. Those methods are :meth:`__get__`, :meth:`__set__`, and -:meth:`__delete__`. If any of those methods are defined for an object, it is -said to be a :term:`descriptor`. +In general, a descriptor is an attribute value that has one of the methods in +the descriptor protocol. Those methods are :meth:`__get__`, :meth:`__set__`, +and :meth:`__delete__`. If any of those methods are defined for an the +attribute, it is said to be a :term:`descriptor`. The default behavior for attribute access is to get, set, or delete the attribute from an object's dictionary. For instance, ``a.x`` has a lookup chain starting with ``a.__dict__['x']``, then ``type(a).__dict__['x']``, and -continuing through the base classes of ``type(a)``. If the +continuing through the method resolution order of ``type(a)``. If the looked-up value is an object defining one of the descriptor methods, then Python may override the default behavior and invoke the descriptor method instead. Where this occurs in the precedence chain depends on which descriptor methods @@ -479,7 +481,7 @@ as an attribute. If an object defines :meth:`__set__` or :meth:`__delete__`, it is considered a data descriptor. Descriptors that only define :meth:`__get__` are called -non-data descriptors (they are typically used for methods but other uses are +non-data descriptors (they are often used for methods but other uses are possible). Data and non-data descriptors differ in how overrides are calculated with @@ -504,8 +506,9 @@ But it is more common for a descriptor to be invoked automatically from attribute access. The expression ``obj.x`` looks up the attribute ``x`` in the chain of -namespaces for ``obj``. If the search finds a descriptor, its :meth:`__get__` -method is invoked according to the precedence rules listed below. +namespaces for ``obj``. If the search finds a descriptor outside of the +instance ``__dict__``, its :meth:`__get__` method is invoked according to the +precedence rules listed below. The details of invocation depend on whether ``obj`` is an object, class, or instance of super. @@ -529,25 +532,38 @@ a pure Python equivalent:: "Emulate PyObject_GenericGetAttr() in Objects/object.c" null = object() objtype = type(obj) - value = getattr(objtype, name, null) - if value is not null and hasattr(value, '__get__'): - if hasattr(value, '__set__') or hasattr(value, '__delete__'): - return value.__get__(obj, objtype) # data descriptor - try: - return vars(obj)[name] # instance variable - except (KeyError, TypeError): - pass - if hasattr(value, '__get__'): - return value.__get__(obj, objtype) # non-data descriptor - if value is not null: - return value # class variable - # Emulate slot_tp_getattr_hook() in Objects/typeobject.c - if hasattr(objtype, '__getattr__'): - return objtype.__getattr__(obj, name) # __getattr__ hook + cls_var = getattr(objtype, name, null) + descr_get = getattr(type(cls_var), '__get__', null) + if descr_get is not null: + if (hasattr(type(cls_var), '__set__') + or hasattr(type(cls_var), '__delete__')): + return descr_get(cls_var, obj, objtype) # data descriptor + if hasattr(obj, '__dict__') and name in vars(obj): + return vars(obj)[name] # instance variable + if descr_get is not null: + return descr_get(cls_var, obj, objtype) # non-data descriptor + if cls_var is not null: + return cls_var # class variable raise AttributeError(name) -The :exc:`TypeError` exception handler is needed because the instance dictionary -doesn't exist when its class defines :term:`__slots__`. +Interestingly, attribute lookup doesn't call :meth:`object.__getattribute__` +directly. Instead, both the dot operator and the :func:`getattr` function +perform attribute lookup by way of a helper function:: + + def getattr_hook(obj, name): + "Emulate slot_tp_getattr_hook() in Objects/typeobject.c" + try: + return obj.__getattribute__(name) + except AttributeError: + if not hasattr(type(obj), '__getattr__'): + raise + return type(obj).__getattr__(obj, name) # __getattr__ + +So if :meth:`__getattr__` exists, it is called whenever :meth:`__getattribute__` +raises :exc:`AttributeError` (either directly or in one of the descriptor calls). + +Also, if a user calls :meth:`object.__getattribute__` directly, the +:meth:`__getattr__` hook is bypassed entirely. Invocation from a class @@ -690,6 +706,7 @@ it can be updated:: >>> Movie('Star Wars').director 'J.J. Abrams' + Pure Python Equivalents ^^^^^^^^^^^^^^^^^^^^^^^ From 31b7766183553933aa9a22713b77e474c5813077 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Mon, 16 Nov 2020 11:27:23 +0800 Subject: [PATCH 0539/1261] bpo-42332: Add weakref slot to types.GenericAlias (GH-23250) Automerge-Triggered-By: GH:gvanrossum --- Lib/test/test_genericalias.py | 86 +++++++++++-------- .../2020-11-12-23-16-14.bpo-42332.fEQIdk.rst | 1 + Objects/genericaliasobject.c | 6 ++ 3 files changed, 55 insertions(+), 38 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-12-23-16-14.bpo-42332.fEQIdk.rst diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 2979cfb55083cb..912fb33af1a21b 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -47,46 +47,46 @@ class BaseTest(unittest.TestCase): """Test basics.""" + generic_types = [type, tuple, list, dict, set, frozenset, enumerate, + defaultdict, deque, + SequenceMatcher, + dircmp, + FileInput, + OrderedDict, Counter, UserDict, UserList, + Pattern, Match, + partial, partialmethod, cached_property, + AbstractContextManager, AbstractAsyncContextManager, + Awaitable, Coroutine, + AsyncIterable, AsyncIterator, + AsyncGenerator, Generator, + Iterable, Iterator, + Reversible, + Container, Collection, + Callable, + Mailbox, _PartialFile, + ContextVar, Token, + Field, + Set, MutableSet, + Mapping, MutableMapping, MappingView, + KeysView, ItemsView, ValuesView, + Sequence, MutableSequence, + MappingProxyType, AsyncGeneratorType, + DirEntry, + chain, + TemporaryDirectory, SpooledTemporaryFile, + Queue, SimpleQueue, + _AssertRaisesContext, + SplitResult, ParseResult, + ValueProxy, ApplyResult, + WeakSet, ReferenceType, ref, + ShareableList, MPSimpleQueue, + Future, _WorkItem, + Morsel] + if ctypes is not None: + generic_types.extend((ctypes.Array, ctypes.LibraryLoader)) def test_subscriptable(self): - types = [type, tuple, list, dict, set, frozenset, enumerate, - defaultdict, deque, - SequenceMatcher, - dircmp, - FileInput, - OrderedDict, Counter, UserDict, UserList, - Pattern, Match, - partial, partialmethod, cached_property, - AbstractContextManager, AbstractAsyncContextManager, - Awaitable, Coroutine, - AsyncIterable, AsyncIterator, - AsyncGenerator, Generator, - Iterable, Iterator, - Reversible, - Container, Collection, - Callable, - Mailbox, _PartialFile, - ContextVar, Token, - Field, - Set, MutableSet, - Mapping, MutableMapping, MappingView, - KeysView, ItemsView, ValuesView, - Sequence, MutableSequence, - MappingProxyType, AsyncGeneratorType, - DirEntry, - chain, - TemporaryDirectory, SpooledTemporaryFile, - Queue, SimpleQueue, - _AssertRaisesContext, - SplitResult, ParseResult, - ValueProxy, ApplyResult, - WeakSet, ReferenceType, ref, - ShareableList, MPSimpleQueue, - Future, _WorkItem, - Morsel] - if ctypes is not None: - types.extend((ctypes.Array, ctypes.LibraryLoader)) - for t in types: + for t in self.generic_types: if t is None: continue tname = t.__name__ @@ -293,5 +293,15 @@ def test_dir(self): for generic_alias_property in ("__origin__", "__args__", "__parameters__"): self.assertIn(generic_alias_property, dir_of_gen_alias) + def test_weakref(self): + for t in self.generic_types: + if t is None: + continue + tname = t.__name__ + with self.subTest(f"Testing {tname}"): + alias = t[int] + self.assertEqual(ref(alias)(), alias) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-12-23-16-14.bpo-42332.fEQIdk.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-12-23-16-14.bpo-42332.fEQIdk.rst new file mode 100644 index 00000000000000..8a2cb87cc0bd29 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-12-23-16-14.bpo-42332.fEQIdk.rst @@ -0,0 +1 @@ +:class:`types.GenericAlias` objects can now be the targets of weakrefs. diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 28ea487a44f55f..6102e05c165c5d 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -10,6 +10,7 @@ typedef struct { PyObject *origin; PyObject *args; PyObject *parameters; + PyObject* weakreflist; } gaobject; static void @@ -18,6 +19,9 @@ ga_dealloc(PyObject *self) gaobject *alias = (gaobject *)self; _PyObject_GC_UNTRACK(self); + if (alias->weakreflist != NULL) { + PyObject_ClearWeakRefs((PyObject *)alias); + } Py_XDECREF(alias->origin); Py_XDECREF(alias->args); Py_XDECREF(alias->parameters); @@ -599,6 +603,7 @@ PyTypeObject Py_GenericAliasType = { .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, .tp_traverse = ga_traverse, .tp_richcompare = ga_richcompare, + .tp_weaklistoffset = offsetof(gaobject, weakreflist), .tp_methods = ga_methods, .tp_members = ga_members, .tp_alloc = PyType_GenericAlloc, @@ -630,6 +635,7 @@ Py_GenericAlias(PyObject *origin, PyObject *args) alias->origin = origin; alias->args = args; alias->parameters = NULL; + alias->weakreflist = NULL; _PyObject_GC_TRACK(alias); return (PyObject *)alias; } From e67a757df971dd08e7aa533aaaab7192d83f3d22 Mon Sep 17 00:00:00 2001 From: Yash Shete Date: Mon, 16 Nov 2020 10:32:35 +0530 Subject: [PATCH 0540/1261] bpo-42153 Fix link to IMAP documents in imaplib.rst (GH-23297) The University of Washington stopped hosting the IMAP documents. Link to a rescued copy on GitHub. --- Doc/library/imaplib.rst | 6 +++--- .../Documentation/2020-11-15-13-46-31.bpo-42153.KjBhx3.rst | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2020-11-15-13-46-31.bpo-42153.KjBhx3.rst diff --git a/Doc/library/imaplib.rst b/Doc/library/imaplib.rst index 02ecfd95d43767..65681ec093598c 100644 --- a/Doc/library/imaplib.rst +++ b/Doc/library/imaplib.rst @@ -174,9 +174,9 @@ example of usage. .. seealso:: - Documents describing the protocol, and sources and binaries for servers - implementing it, can all be found at the University of Washington's *IMAP - Information Center* (https://www.washington.edu/imap/). + Documents describing the protocol, sources for servers + implementing it, by the University of Washington's IMAP Information Center + can all be found at (**Source Code**) https://github.com/uw-imap/imap (**Not Maintained**). .. _imap4-objects: diff --git a/Misc/NEWS.d/next/Documentation/2020-11-15-13-46-31.bpo-42153.KjBhx3.rst b/Misc/NEWS.d/next/Documentation/2020-11-15-13-46-31.bpo-42153.KjBhx3.rst new file mode 100644 index 00000000000000..0a9451a63fb4f8 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-11-15-13-46-31.bpo-42153.KjBhx3.rst @@ -0,0 +1 @@ +Fix the URL for the IMAP protocol documents. From b2d35380cbf1f222d704698e8a2bbbce864b3294 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 16 Nov 2020 13:21:45 +0100 Subject: [PATCH 0541/1261] bpo-37205: time.perf_counter() and time.monotonic() are system-wide (GH-23284) time.perf_counter() on Windows and time.monotonic() on macOS are now system-wide. Previously, they used an offset computed at startup to reduce the precision loss caused by the float type. Use time.perf_counter_ns() and time.monotonic_ns() added in Python 3.7 to avoid this precision loss. --- Doc/library/time.rst | 43 ++++++++++++++++--- .../2020-11-14-14-34-32.bpo-37205.iDbHrw.rst | 5 +++ Python/pytime.c | 16 +------ 3 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-14-14-34-32.bpo-37205.iDbHrw.rst diff --git a/Doc/library/time.rst b/Doc/library/time.rst index cff6320b526db5..143f84b565f5e1 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -166,6 +166,9 @@ Functions Return the time of the specified clock *clk_id*. Refer to :ref:`time-clock-id-constants` for a list of accepted values for *clk_id*. + Use :func:`clock_gettime_ns` to avoid the precision loss caused by the + :class:`float` type. + .. availability:: Unix. .. versionadded:: 3.3 @@ -185,6 +188,9 @@ Functions Set the time of the specified clock *clk_id*. Currently, :data:`CLOCK_REALTIME` is the only accepted value for *clk_id*. + Use :func:`clock_settime_ns` to avoid the precision loss caused by the + :class:`float` type. + .. availability:: Unix. .. versionadded:: 3.3 @@ -273,10 +279,17 @@ Functions The reference point of the returned value is undefined, so that only the difference between the results of consecutive calls is valid. + Use :func:`monotonic_ns` to avoid the precision loss caused by the + :class:`float` type. + .. versionadded:: 3.3 + .. versionchanged:: 3.5 The function is now always available and always system-wide. + .. versionchanged:: 3.10 + On macOS, the function is now system-wide. + .. function:: monotonic_ns() -> int @@ -295,8 +308,14 @@ Functions point of the returned value is undefined, so that only the difference between the results of consecutive calls is valid. + Use :func:`perf_counter_ns` to avoid the precision loss caused by the + :class:`float` type. + .. versionadded:: 3.3 + .. versionchanged:: 3.10 + On Windows, the function is now system-wide. + .. function:: perf_counter_ns() -> int Similar to :func:`perf_counter`, but return time as nanoseconds. @@ -317,6 +336,9 @@ Functions returned value is undefined, so that only the difference between the results of consecutive calls is valid. + Use :func:`process_time_ns` to avoid the precision loss caused by the + :class:`float` type. + .. versionadded:: 3.3 .. function:: process_time_ns() -> int @@ -581,6 +603,17 @@ Functions :class:`struct_time` object is returned, from which the components of the calendar date may be accessed as attributes. + Use :func:`time_ns` to avoid the precision loss caused by the :class:`float` + type. + + +.. function:: time_ns() -> int + + Similar to :func:`~time.time` but returns time as an integer number of nanoseconds + since the epoch_. + + .. versionadded:: 3.7 + .. function:: thread_time() -> float @@ -595,6 +628,9 @@ Functions returned value is undefined, so that only the difference between the results of consecutive calls in the same thread is valid. + Use :func:`thread_time_ns` to avoid the precision loss caused by the + :class:`float` type. + .. availability:: Windows, Linux, Unix systems supporting ``CLOCK_THREAD_CPUTIME_ID``. @@ -608,13 +644,6 @@ Functions .. versionadded:: 3.7 -.. function:: time_ns() -> int - - Similar to :func:`~time.time` but returns time as an integer number of nanoseconds - since the epoch_. - - .. versionadded:: 3.7 - .. function:: tzset() Reset the time conversion rules used by the library routines. The environment diff --git a/Misc/NEWS.d/next/Library/2020-11-14-14-34-32.bpo-37205.iDbHrw.rst b/Misc/NEWS.d/next/Library/2020-11-14-14-34-32.bpo-37205.iDbHrw.rst new file mode 100644 index 00000000000000..5cf325ec0c19d2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-14-14-34-32.bpo-37205.iDbHrw.rst @@ -0,0 +1,5 @@ +:func:`time.perf_counter()` on Windows and :func:`time.monotonic()` on macOS +are now system-wide. Previously, they used an offset computed at startup to +reduce the precision loss caused by the float type. Use +:func:`time.perf_counter_ns()` and :func:`time.monotonic_ns()` added in Python +3.7 to avoid this precision loss. diff --git a/Python/pytime.c b/Python/pytime.c index 89d63e080422b3..179bced1ac68f7 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -6,7 +6,7 @@ #if defined(__APPLE__) #include /* mach_absolute_time(), mach_timebase_info() */ -#if defined(__APPLE__) && defined(__has_builtin) +#if defined(__APPLE__) && defined(__has_builtin) # if __has_builtin(__builtin_available) # define HAVE_CLOCK_GETTIME_RUNTIME __builtin_available(macOS 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *) # endif @@ -730,7 +730,7 @@ pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise) } #ifdef HAVE_CLOCK_GETTIME_RUNTIME - } else { + } else { #endif #endif @@ -822,7 +822,6 @@ pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise) #elif defined(__APPLE__) static mach_timebase_info_data_t timebase; - static uint64_t t0 = 0; uint64_t ticks; if (timebase.denom == 0) { @@ -859,8 +858,6 @@ pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise) "mach_timebase_info is too large"); return -1; } - - t0 = mach_absolute_time(); } if (info) { @@ -871,9 +868,6 @@ pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise) } ticks = mach_absolute_time(); - /* Use a "time zero" to reduce precision loss when converting time - to floatting point number, as in time.monotonic(). */ - ticks -= t0; *tp = _PyTime_MulDiv(ticks, (_PyTime_t)timebase.numer, (_PyTime_t)timebase.denom); @@ -960,7 +954,6 @@ static int win_perf_counter(_PyTime_t *tp, _Py_clock_info_t *info) { static LONGLONG frequency = 0; - static LONGLONG t0 = 0; LARGE_INTEGER now; LONGLONG ticksll; _PyTime_t ticks; @@ -1000,7 +993,6 @@ win_perf_counter(_PyTime_t *tp, _Py_clock_info_t *info) } QueryPerformanceCounter(&now); - t0 = now.QuadPart; } if (info) { @@ -1013,10 +1005,6 @@ win_perf_counter(_PyTime_t *tp, _Py_clock_info_t *info) QueryPerformanceCounter(&now); ticksll = now.QuadPart; - /* Use a "time zero" to reduce precision loss when converting time - to floatting point number, as in time.perf_counter(). */ - ticksll -= t0; - /* Make sure that casting LONGLONG to _PyTime_t cannot overflow, both types are signed */ Py_BUILD_ASSERT(sizeof(ticksll) <= sizeof(ticks)); From 16614988470f0fa8b0307af59675106c7d5d95af Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 16 Nov 2020 15:20:34 +0100 Subject: [PATCH 0542/1261] bpo-42350: Fix Thread._reset_internal_locks() (GH-23268) Fix the threading.Thread class at fork: do nothing if the thread is already stopped (ex: fork called at Python exit). Previously, an error was logged in the child process. --- Lib/test/test_threading.py | 29 +++++++++++++++++++ Lib/threading.py | 8 +++-- .../2020-11-13-18-53-50.bpo-42350.rsql7V.rst | 3 ++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-13-18-53-50.bpo-42350.rsql7V.rst diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index db440d42f816d9..864cea313aea52 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -469,6 +469,35 @@ def test_daemon_param(self): t = threading.Thread(daemon=True) self.assertTrue(t.daemon) + @unittest.skipUnless(hasattr(os, 'fork'), 'needs os.fork()') + def test_fork_at_exit(self): + # bpo-42350: Calling os.fork() after threading._shutdown() must + # not log an error. + code = textwrap.dedent(""" + import atexit + import os + import sys + from test.support import wait_process + + # Import the threading module to register its "at fork" callback + import threading + + def exit_handler(): + pid = os.fork() + if not pid: + print("child process ok", file=sys.stderr, flush=True) + # child process + sys.exit() + else: + wait_process(pid, exitcode=0) + + # exit_handler() will be called after threading._shutdown() + atexit.register(exit_handler) + """) + _, out, err = assert_python_ok("-c", code) + self.assertEqual(out, b'') + self.assertEqual(err.rstrip(), b'child process ok') + @unittest.skipUnless(hasattr(os, 'fork'), 'test needs fork()') def test_dummy_thread_after_fork(self): # Issue #14308: a dummy thread in the active list doesn't mess up diff --git a/Lib/threading.py b/Lib/threading.py index 7dae77dfd4da21..7b3d63dd211ea4 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -844,8 +844,12 @@ def _reset_internal_locks(self, is_alive): # they may be in an invalid state leading to a deadlock or crash. self._started._at_fork_reinit() if is_alive: - self._tstate_lock._at_fork_reinit() - self._tstate_lock.acquire() + # bpo-42350: If the fork happens when the thread is already stopped + # (ex: after threading._shutdown() has been called), _tstate_lock + # is None. Do nothing in this case. + if self._tstate_lock is not None: + self._tstate_lock._at_fork_reinit() + self._tstate_lock.acquire() else: # The thread isn't alive after fork: it doesn't have a tstate # anymore. diff --git a/Misc/NEWS.d/next/Library/2020-11-13-18-53-50.bpo-42350.rsql7V.rst b/Misc/NEWS.d/next/Library/2020-11-13-18-53-50.bpo-42350.rsql7V.rst new file mode 100644 index 00000000000000..090ea2266633e6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-13-18-53-50.bpo-42350.rsql7V.rst @@ -0,0 +1,3 @@ +Fix the :class:`threading.Thread` class at fork: do nothing if the thread is +already stopped (ex: fork called at Python exit). Previously, an error was +logged in the child process. From 434c198d6f4640b0e40983842bdec7074f5bd3b3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 16 Nov 2020 16:08:05 +0100 Subject: [PATCH 0543/1261] bpo-37205: time.time() cannot fail with fatal error (GH-23314) time.time(), time.perf_counter() and time.monotonic() functions can no longer fail with a Python fatal error, instead raise a regular Python exception on failure. Remove _PyTime_Init(): don't check system, monotonic and perf counter clocks at startup anymore. On error, _PyTime_GetSystemClock(), _PyTime_GetMonotonicClock() and _PyTime_GetPerfCounter() now silently ignore the error and return 0. They cannot fail with a Python fatal error anymore. Add py_mach_timebase_info() and win_perf_counter_frequency() sub-functions. --- Include/pytime.h | 52 ++-- .../2020-11-16-15-08-12.bpo-37205.Wh5svI.rst | 3 + Modules/timemodule.c | 87 +++++-- Python/pylifecycle.c | 6 - Python/pytime.c | 238 ++++++++++-------- 5 files changed, 228 insertions(+), 158 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-16-15-08-12.bpo-37205.Wh5svI.rst diff --git a/Include/pytime.h b/Include/pytime.h index bdda1da2e6b8f2..944170f7d0c4c3 100644 --- a/Include/pytime.h +++ b/Include/pytime.h @@ -164,22 +164,6 @@ PyAPI_FUNC(_PyTime_t) _PyTime_MulDiv(_PyTime_t ticks, _PyTime_t mul, _PyTime_t div); -/* Get the current time from the system clock. - - The function cannot fail. _PyTime_Init() ensures that the system clock - works. */ -PyAPI_FUNC(_PyTime_t) _PyTime_GetSystemClock(void); - -/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. - The clock is not affected by system clock updates. The reference point of - the returned value is undefined, so that only the difference between the - results of consecutive calls is valid. - - The function cannot fail. _PyTime_Init() ensures that a monotonic clock - is available and works. */ -PyAPI_FUNC(_PyTime_t) _PyTime_GetMonotonicClock(void); - - /* Structure used by time.get_clock_info() */ typedef struct { const char *implementation; @@ -189,13 +173,34 @@ typedef struct { } _Py_clock_info_t; /* Get the current time from the system clock. - * Fill clock information if info is not NULL. - * Raise an exception and return -1 on error, return 0 on success. + + If the internal clock fails, silently ignore the error and return 0. + On integer overflow, silently ignore the overflow and truncated the clock to + _PyTime_MIN or _PyTime_MAX. + + Use _PyTime_GetSystemClockWithInfo() to check for failure. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetSystemClock(void); + +/* Get the current time from the system clock. + * On success, set *t and *info (if not NULL), and return 0. + * On error, raise an exception and return -1. */ PyAPI_FUNC(int) _PyTime_GetSystemClockWithInfo( _PyTime_t *t, _Py_clock_info_t *info); +/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. + The clock is not affected by system clock updates. The reference point of + the returned value is undefined, so that only the difference between the + results of consecutive calls is valid. + + If the internal clock fails, silently ignore the error and return 0. + On integer overflow, silently ignore the overflow and truncated the clock to + _PyTime_MIN or _PyTime_MAX. + + Use _PyTime_GetMonotonicClockWithInfo() to check for failure. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetMonotonicClock(void); + /* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. The clock is not affected by system clock updates. The reference point of the returned value is undefined, so that only the difference between the @@ -209,10 +214,6 @@ PyAPI_FUNC(int) _PyTime_GetMonotonicClockWithInfo( _Py_clock_info_t *info); -/* Initialize time. - Return 0 on success, raise an exception and return -1 on error. */ -PyAPI_FUNC(int) _PyTime_Init(void); - /* Converts a timestamp to the Gregorian time, using the local time zone. Return 0 on success, raise an exception and return -1 on error. */ PyAPI_FUNC(int) _PyTime_localtime(time_t t, struct tm *tm); @@ -224,8 +225,11 @@ PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm); /* Get the performance counter: clock with the highest available resolution to measure a short duration. - The function cannot fail. _PyTime_Init() ensures that the system clock - works. */ + If the internal clock fails, silently ignore the error and return 0. + On integer overflow, silently ignore the overflow and truncated the clock to + _PyTime_MIN or _PyTime_MAX. + + Use _PyTime_GetPerfCounterWithInfo() to check for failure. */ PyAPI_FUNC(_PyTime_t) _PyTime_GetPerfCounter(void); /* Get the performance counter: clock with the highest available resolution to diff --git a/Misc/NEWS.d/next/Library/2020-11-16-15-08-12.bpo-37205.Wh5svI.rst b/Misc/NEWS.d/next/Library/2020-11-16-15-08-12.bpo-37205.Wh5svI.rst new file mode 100644 index 00000000000000..9268f2d77f72f4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-16-15-08-12.bpo-37205.Wh5svI.rst @@ -0,0 +1,3 @@ +:func:`time.time()`, :func:`time.perf_counter()` and +:func:`time.monotonic()` functions can no longer fail with a Python fatal +error, instead raise a regular Python exception on failure. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 80eab30c95d6f0..4caacc3b64d7c8 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -51,7 +51,7 @@ #define _Py_tzname tzname #endif -#if defined(__APPLE__ ) && defined(__has_builtin) +#if defined(__APPLE__ ) && defined(__has_builtin) # if __has_builtin(__builtin_available) # define HAVE_CLOCK_GETTIME_RUNTIME __builtin_available(macOS 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *) # endif @@ -74,10 +74,21 @@ _PyFloat_FromPyTime(_PyTime_t t) } +static int +get_system_time(_PyTime_t *t) +{ + // Avoid _PyTime_GetSystemClock() which silently ignores errors. + return _PyTime_GetSystemClockWithInfo(t, NULL); +} + + static PyObject * time_time(PyObject *self, PyObject *unused) { - _PyTime_t t = _PyTime_GetSystemClock(); + _PyTime_t t; + if (get_system_time(&t) < 0) { + return NULL; + } return _PyFloat_FromPyTime(t); } @@ -91,7 +102,10 @@ Fractions of a second may be present if the system clock provides them."); static PyObject * time_time_ns(PyObject *self, PyObject *unused) { - _PyTime_t t = _PyTime_GetSystemClock(); + _PyTime_t t; + if (get_system_time(&t) < 0) { + return NULL; + } return _PyTime_AsNanosecondsObject(t); } @@ -147,20 +161,11 @@ _PyTime_GetClockWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) } #endif /* HAVE_CLOCK */ -static PyObject* -perf_counter(_Py_clock_info_t *info) -{ - _PyTime_t t; - if (_PyTime_GetPerfCounterWithInfo(&t, info) < 0) { - return NULL; - } - return _PyFloat_FromPyTime(t); -} #ifdef HAVE_CLOCK_GETTIME #ifdef __APPLE__ -/* +/* * The clock_* functions will be removed from the module * dict entirely when the C API is not available. */ @@ -1096,10 +1101,22 @@ the local timezone used by methods such as localtime, but this behaviour\n\ should not be relied on."); #endif /* HAVE_WORKING_TZSET */ + +static int +get_monotonic(_PyTime_t *t) +{ + // Avoid _PyTime_GetMonotonicClock() which silently ignores errors. + return _PyTime_GetMonotonicClockWithInfo(t, NULL); +} + + static PyObject * time_monotonic(PyObject *self, PyObject *unused) { - _PyTime_t t = _PyTime_GetMonotonicClock(); + _PyTime_t t; + if (get_monotonic(&t) < 0) { + return NULL; + } return _PyFloat_FromPyTime(t); } @@ -1111,7 +1128,10 @@ Monotonic clock, cannot go backward."); static PyObject * time_monotonic_ns(PyObject *self, PyObject *unused) { - _PyTime_t t = _PyTime_GetMonotonicClock(); + _PyTime_t t; + if (get_monotonic(&t) < 0) { + return NULL; + } return _PyTime_AsNanosecondsObject(t); } @@ -1120,10 +1140,23 @@ PyDoc_STRVAR(monotonic_ns_doc, \n\ Monotonic clock, cannot go backward, as nanoseconds."); + +static int +get_perf_counter(_PyTime_t *t) +{ + // Avoid _PyTime_GetPerfCounter() which silently ignores errors. + return _PyTime_GetPerfCounterWithInfo(t, NULL); +} + + static PyObject * time_perf_counter(PyObject *self, PyObject *unused) { - return perf_counter(NULL); + _PyTime_t t; + if (get_perf_counter(&t) < 0) { + return NULL; + } + return _PyFloat_FromPyTime(t); } PyDoc_STRVAR(perf_counter_doc, @@ -1131,10 +1164,14 @@ PyDoc_STRVAR(perf_counter_doc, \n\ Performance counter for benchmarking."); + static PyObject * time_perf_counter_ns(PyObject *self, PyObject *unused) { - _PyTime_t t = _PyTime_GetPerfCounter(); + _PyTime_t t; + if (get_perf_counter(&t) < 0) { + return NULL; + } return _PyTime_AsNanosecondsObject(t); } @@ -1421,7 +1458,7 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) #if defined(__APPLE__) && defined(__has_attribute) && __has_attribute(availability) static int -_PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) +_PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) __attribute__((availability(macos, introduced=10.12))) __attribute__((availability(ios, introduced=10.0))) __attribute__((availability(tvos, introduced=10.0))) @@ -1460,7 +1497,7 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) #ifdef HAVE_THREAD_TIME #ifdef __APPLE__ -/* +/* * The clock_* functions will be removed from the module * dict entirely when the C API is not available. */ @@ -2025,7 +2062,10 @@ pysleep(_PyTime_t secs) HANDLE hInterruptEvent; #endif - deadline = _PyTime_GetMonotonicClock() + secs; + if (get_monotonic(&monotonic) < 0) { + return -1; + } + deadline = monotonic + secs; do { #ifndef MS_WINDOWS @@ -2077,10 +2117,13 @@ pysleep(_PyTime_t secs) if (PyErr_CheckSignals()) return -1; - monotonic = _PyTime_GetMonotonicClock(); + if (get_monotonic(&monotonic) < 0) { + return -1; + } secs = deadline - monotonic; - if (secs < 0) + if (secs < 0) { break; + } /* retry with the recomputed delay */ } while (1); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 2d43e016efd508..33deafbc0a215f 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -763,12 +763,6 @@ pycore_interp_init(PyThreadState *tstate) goto done; } - if (_Py_IsMainInterpreter(tstate)) { - if (_PyTime_Init() < 0) { - return _PyStatus_ERR("can't initialize time"); - } - } - status = _PySys_Create(tstate, &sysmod); if (_PyStatus_EXCEPTION(status)) { goto done; diff --git a/Python/pytime.c b/Python/pytime.c index 179bced1ac68f7..1ef99aee748466 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -304,8 +304,8 @@ pytime_fromtimespec(_PyTime_t *tp, struct timespec *ts, int raise) if (_PyTime_check_mul_overflow(t, SEC_TO_NS)) { if (raise) { _PyTime_overflow(); + res = -1; } - res = -1; t = (t > 0) ? _PyTime_MAX : _PyTime_MIN; } else { @@ -318,8 +318,8 @@ pytime_fromtimespec(_PyTime_t *tp, struct timespec *ts, int raise) if (t > _PyTime_MAX - nsec) { if (raise) { _PyTime_overflow(); + res = -1; } - res = -1; t = _PyTime_MAX; } else { @@ -350,8 +350,8 @@ pytime_fromtimeval(_PyTime_t *tp, struct timeval *tv, int raise) if (_PyTime_check_mul_overflow(t, SEC_TO_NS)) { if (raise) { _PyTime_overflow(); + res = -1; } - res = -1; t = (t > 0) ? _PyTime_MAX : _PyTime_MIN; } else { @@ -364,8 +364,8 @@ pytime_fromtimeval(_PyTime_t *tp, struct timeval *tv, int raise) if (t > _PyTime_MAX - usec) { if (raise) { _PyTime_overflow(); + res = -1; } - res = -1; t = _PyTime_MAX; } else { @@ -656,7 +656,7 @@ _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts) #endif static int -pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise) +py_get_system_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) { #ifdef MS_WINDOWS FILETIME system_time; @@ -769,9 +769,10 @@ _PyTime_t _PyTime_GetSystemClock(void) { _PyTime_t t; - if (pygettimeofday(&t, NULL, 0) < 0) { - /* should not happen, _PyTime_Init() checked the clock at startup */ - Py_FatalError("pygettimeofday() failed"); + if (py_get_system_clock(&t, NULL, 0) < 0) { + // If clock_gettime(CLOCK_REALTIME) or gettimeofday() fails: + // silently ignore the failure and return 0. + t = 0; } return t; } @@ -779,11 +780,61 @@ _PyTime_GetSystemClock(void) int _PyTime_GetSystemClockWithInfo(_PyTime_t *t, _Py_clock_info_t *info) { - return pygettimeofday(t, info, 1); + return py_get_system_clock(t, info, 1); +} + +#if __APPLE__ +static int +py_mach_timebase_info(_PyTime_t *pnumer, _PyTime_t *pdenom, int raise) +{ + static mach_timebase_info_data_t timebase; + /* According to the Technical Q&A QA1398, mach_timebase_info() cannot + fail: https://developer.apple.com/library/mac/#qa/qa1398/ */ + (void)mach_timebase_info(&timebase); + + /* Sanity check: should never occur in practice */ + if (timebase.numer < 1 || timebase.denom < 1) { + if (raise) { + PyErr_SetString(PyExc_RuntimeError, + "invalid mach_timebase_info"); + } + return -1; + } + + /* Check that timebase.numer and timebase.denom can be casted to + _PyTime_t. In practice, timebase uses uint32_t, so casting cannot + overflow. At the end, only make sure that the type is uint32_t + (_PyTime_t is 64-bit long). */ + Py_BUILD_ASSERT(sizeof(timebase.numer) < sizeof(_PyTime_t)); + Py_BUILD_ASSERT(sizeof(timebase.denom) < sizeof(_PyTime_t)); + + /* Make sure that (ticks * timebase.numer) cannot overflow in + _PyTime_MulDiv(), with ticks < timebase.denom. + + Known time bases: + + * always (1, 1) on Intel + * (1000000000, 33333335) or (1000000000, 25000000) on PowerPC + + None of these time bases can overflow with 64-bit _PyTime_t, but + check for overflow, just in case. */ + if ((_PyTime_t)timebase.numer > _PyTime_MAX / (_PyTime_t)timebase.denom) { + if (raise) { + PyErr_SetString(PyExc_OverflowError, + "mach_timebase_info is too large"); + } + return -1; + } + + *pnumer = (_PyTime_t)timebase.numer; + *pdenom = (_PyTime_t)timebase.denom; + return 0; } +#endif + static int -pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise) +py_get_monotonic_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) { #if defined(MS_WINDOWS) ULONGLONG ticks; @@ -800,10 +851,12 @@ pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise) _PyTime_overflow(); return -1; } - /* Hello, time traveler! */ - Py_FatalError("pymonotonic: integer overflow"); + // Truncate to _PyTime_MAX silently. + *tp = _PyTime_MAX; + } + else { + *tp = t * MS_TO_NS; } - *tp = t * MS_TO_NS; if (info) { DWORD timeAdjustment, timeIncrement; @@ -821,56 +874,23 @@ pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise) } #elif defined(__APPLE__) - static mach_timebase_info_data_t timebase; - uint64_t ticks; - - if (timebase.denom == 0) { - /* According to the Technical Q&A QA1398, mach_timebase_info() cannot - fail: https://developer.apple.com/library/mac/#qa/qa1398/ */ - (void)mach_timebase_info(&timebase); - - /* Sanity check: should never occur in practice */ - if (timebase.numer < 1 || timebase.denom < 1) { - PyErr_SetString(PyExc_RuntimeError, - "invalid mach_timebase_info"); - return -1; - } - - /* Check that timebase.numer and timebase.denom can be casted to - _PyTime_t. In practice, timebase uses uint32_t, so casting cannot - overflow. At the end, only make sure that the type is uint32_t - (_PyTime_t is 64-bit long). */ - assert(sizeof(timebase.numer) < sizeof(_PyTime_t)); - assert(sizeof(timebase.denom) < sizeof(_PyTime_t)); - - /* Make sure that (ticks * timebase.numer) cannot overflow in - _PyTime_MulDiv(), with ticks < timebase.denom. - - Known time bases: - - * always (1, 1) on Intel - * (1000000000, 33333335) or (1000000000, 25000000) on PowerPC - - None of these time bases can overflow with 64-bit _PyTime_t, but - check for overflow, just in case. */ - if ((_PyTime_t)timebase.numer > _PyTime_MAX / (_PyTime_t)timebase.denom) { - PyErr_SetString(PyExc_OverflowError, - "mach_timebase_info is too large"); + static _PyTime_t timebase_numer = 0; + static _PyTime_t timebase_denom = 0; + if (timebase_denom == 0) { + if (py_mach_timebase_info(&timebase_numer, &timebase_denom, raise) < 0) { return -1; } } if (info) { info->implementation = "mach_absolute_time()"; - info->resolution = (double)timebase.numer / (double)timebase.denom * 1e-9; + info->resolution = (double)timebase_numer / (double)timebase_denom * 1e-9; info->monotonic = 1; info->adjustable = 0; } - ticks = mach_absolute_time(); - *tp = _PyTime_MulDiv(ticks, - (_PyTime_t)timebase.numer, - (_PyTime_t)timebase.denom); + uint64_t ticks = mach_absolute_time(); + *tp = _PyTime_MulDiv((_PyTime_t)ticks, timebase_numer, timebase_denom); #elif defined(__hpux) hrtime_t time; @@ -934,10 +954,10 @@ _PyTime_t _PyTime_GetMonotonicClock(void) { _PyTime_t t; - if (pymonotonic(&t, NULL, 0) < 0) { - /* should not happen, _PyTime_Init() checked that monotonic clock at - startup */ - Py_FatalError("pymonotonic() failed"); + if (py_get_monotonic_clock(&t, NULL, 0) < 0) { + // If mach_timebase_info(), clock_gettime() or gethrtime() fails: + // silently ignore the failure and return 0. + t = 0; } return t; } @@ -945,54 +965,69 @@ _PyTime_GetMonotonicClock(void) int _PyTime_GetMonotonicClockWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) { - return pymonotonic(tp, info, 1); + return py_get_monotonic_clock(tp, info, 1); } #ifdef MS_WINDOWS static int -win_perf_counter(_PyTime_t *tp, _Py_clock_info_t *info) +win_perf_counter_frequency(LONGLONG *pfrequency, int raise) { - static LONGLONG frequency = 0; - LARGE_INTEGER now; - LONGLONG ticksll; - _PyTime_t ticks; + LONGLONG frequency; - if (frequency == 0) { - LARGE_INTEGER freq; - if (!QueryPerformanceFrequency(&freq)) { + LARGE_INTEGER freq; + if (!QueryPerformanceFrequency(&freq)) { + if (raise) { PyErr_SetFromWindowsErr(0); - return -1; } - frequency = freq.QuadPart; + return -1; + } + frequency = freq.QuadPart; - /* Sanity check: should never occur in practice */ - if (frequency < 1) { + /* Sanity check: should never occur in practice */ + if (frequency < 1) { + if (raise) { PyErr_SetString(PyExc_RuntimeError, "invalid QueryPerformanceFrequency"); - return -1; } + return -1; + } - /* Check that frequency can be casted to _PyTime_t. + /* Check that frequency can be casted to _PyTime_t. - Make also sure that (ticks * SEC_TO_NS) cannot overflow in - _PyTime_MulDiv(), with ticks < frequency. + Make also sure that (ticks * SEC_TO_NS) cannot overflow in + _PyTime_MulDiv(), with ticks < frequency. - Known QueryPerformanceFrequency() values: + Known QueryPerformanceFrequency() values: - * 10,000,000 (10 MHz): 100 ns resolution - * 3,579,545 Hz (3.6 MHz): 279 ns resolution + * 10,000,000 (10 MHz): 100 ns resolution + * 3,579,545 Hz (3.6 MHz): 279 ns resolution - None of these frequencies can overflow with 64-bit _PyTime_t, but - check for overflow, just in case. */ - if (frequency > _PyTime_MAX - || frequency > (LONGLONG)_PyTime_MAX / (LONGLONG)SEC_TO_NS) { + None of these frequencies can overflow with 64-bit _PyTime_t, but + check for overflow, just in case. */ + if (frequency > _PyTime_MAX + || frequency > (LONGLONG)_PyTime_MAX / (LONGLONG)SEC_TO_NS) + { + if (raise) { PyErr_SetString(PyExc_OverflowError, "QueryPerformanceFrequency is too large"); - return -1; } + return -1; + } - QueryPerformanceCounter(&now); + *pfrequency = frequency; + return 0; +} + + +static int +py_get_win_perf_counter(_PyTime_t *tp, _Py_clock_info_t *info, int raise) +{ + static LONGLONG frequency = 0; + if (frequency == 0) { + if (win_perf_counter_frequency(&frequency, raise) < 0) { + return -1; + } } if (info) { @@ -1002,11 +1037,13 @@ win_perf_counter(_PyTime_t *tp, _Py_clock_info_t *info) info->adjustable = 0; } + LARGE_INTEGER now; QueryPerformanceCounter(&now); - ticksll = now.QuadPart; + LONGLONG ticksll = now.QuadPart; /* Make sure that casting LONGLONG to _PyTime_t cannot overflow, both types are signed */ + _PyTime_t ticks; Py_BUILD_ASSERT(sizeof(ticksll) <= sizeof(ticks)); ticks = (_PyTime_t)ticksll; @@ -1020,7 +1057,7 @@ int _PyTime_GetPerfCounterWithInfo(_PyTime_t *t, _Py_clock_info_t *info) { #ifdef MS_WINDOWS - return win_perf_counter(t, info); + return py_get_win_perf_counter(t, info, 1); #else return _PyTime_GetMonotonicClockWithInfo(t, info); #endif @@ -1031,32 +1068,21 @@ _PyTime_t _PyTime_GetPerfCounter(void) { _PyTime_t t; - if (_PyTime_GetPerfCounterWithInfo(&t, NULL)) { - Py_FatalError("_PyTime_GetPerfCounterWithInfo() failed"); + int res; +#ifdef MS_WINDOWS + res = py_get_win_perf_counter(&t, NULL, 0); +#else + res = py_get_monotonic_clock(&t, NULL, 0); +#endif + if (res < 0) { + // If win_perf_counter_frequency() or py_get_monotonic_clock() fails: + // silently ignore the failure and return 0. + t = 0; } return t; } -int -_PyTime_Init(void) -{ - /* check that time.time(), time.monotonic() and time.perf_counter() clocks - are working properly to not have to check for exceptions at runtime. If - a clock works once, it cannot fail in next calls. */ - _PyTime_t t; - if (_PyTime_GetSystemClockWithInfo(&t, NULL) < 0) { - return -1; - } - if (_PyTime_GetMonotonicClockWithInfo(&t, NULL) < 0) { - return -1; - } - if (_PyTime_GetPerfCounterWithInfo(&t, NULL) < 0) { - return -1; - } - return 0; -} - int _PyTime_localtime(time_t t, struct tm *tm) { From 2197964488cd4330eaf10c069061a3c35a44a252 Mon Sep 17 00:00:00 2001 From: Kevin Adler Date: Mon, 16 Nov 2020 09:16:10 -0600 Subject: [PATCH 0544/1261] bpo-42087: Remove support for AIX 5.3 and below (GH-22830) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As AIX 5.3 and below do not support thread_cputime, it was decided in https://bugs.python.org/issue40680 to require AIX 6.1 and above. This commit removes workarounds for — and references to — older, unsupported AIX versions. --- Makefile.pre.in | 2 +- .../2020-10-19-15-41-05.bpo-42087.2AhRFP.rst | 1 + Misc/README.AIX | 5 --- Modules/_localemodule.c | 1 - Modules/makexp_aix | 44 +++++++------------ configure | 17 +------ configure.ac | 17 +------ 7 files changed, 23 insertions(+), 64 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-10-19-15-41-05.bpo-42087.2AhRFP.rst diff --git a/Makefile.pre.in b/Makefile.pre.in index a8912cd418470a..ee801ec46df73e 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1639,7 +1639,7 @@ libainstall: @DEF_MAKE_RULE@ python-config $(INSTALL_SCRIPT) Modules/ld_so_aix \ $(DESTDIR)$(LIBPL)/ld_so_aix; \ echo "$(LIBPL)/ld_so_aix"; \ - echo; echo "See Misc/AIX-NOTES for details."; \ + echo; echo "See Misc/README.AIX for details."; \ else true; \ fi diff --git a/Misc/NEWS.d/next/Build/2020-10-19-15-41-05.bpo-42087.2AhRFP.rst b/Misc/NEWS.d/next/Build/2020-10-19-15-41-05.bpo-42087.2AhRFP.rst new file mode 100644 index 00000000000000..1a830bfe9f5ecf --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-10-19-15-41-05.bpo-42087.2AhRFP.rst @@ -0,0 +1 @@ +Support was removed for AIX 5.3 and below. See :issue:`40680`. diff --git a/Misc/README.AIX b/Misc/README.AIX index 92ad0293e65850..6903a8146f0479 100644 --- a/Misc/README.AIX +++ b/Misc/README.AIX @@ -37,11 +37,6 @@ cd Python-3.2 CC=xlc_r OPT="-O2 -qmaxmem=70000" ./configure --without-computed-gotos --enable-shared make -Note: -On AIX 5.3 and earlier, you will also need to specify the -"--disable-ipv6" flag to configure. This has been corrected in AIX -6.1. - ====================================================================== Memory Limitations diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 7b3597e06064b9..869e3f80f3f9e6 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -556,7 +556,6 @@ static struct langinfo_constant{ LANGINFO(PM_STR), /* The following constants are available only with XPG4, but... - AIX 3.2. only has CODESET. OpenBSD doesn't have CODESET but has T_FMT_AMPM, and doesn't have a few of the others. Solution: ifdef-test them all. */ diff --git a/Modules/makexp_aix b/Modules/makexp_aix index cb349c28757396..b39d93b682ca1c 100755 --- a/Modules/makexp_aix +++ b/Modules/makexp_aix @@ -3,7 +3,7 @@ # =========================================================================== # FILE: makexp_aix # TYPE: standalone executable -# SYSTEM: AIX 3.2.5 and AIX 4 +# SYSTEM: AIX # # DESCRIPTION: This script creates an export list of ALL global symbols # from a list of object or archive files. @@ -48,34 +48,24 @@ echo "*" >> $expFileName echo "* $notemsg" >> $expFileName echo "*" >> $expFileName -# Extract the symbol list using 'nm' which produces quite -# different output under AIX 4 than under AIX 3.2.5. -# The following handles both versions by using a common flagset. +# Extract the symbol list using 'nm' # Here are some hidden tricks: -# 1. Use /usr/ccs/bin/nm. Relevant to AIX 3.2.5 which has -# another version under /usr/ucb/bin/nm. -# 2. Use the -B flag to have a standard BSD representation -# of the symbol list on both AIX 3.2.5 and AIX 4. The "-B" -# flag is missing in the AIX 3.2.5 online usage help of 'nm'. -# 3. Use the -x flag to have a hex representation of the symbol -# values. This fills the leading whitespaces on AIX 4, -# thus simplifying the sed statement. -# 4. Eliminate all entries except those with either "B", "D" -# or "T" key letters. We are interested only in the global -# (extern) BSS, DATA and TEXT symbols. With the same statement -# we eliminate object member lines relevant to AIX 4. -# 5. Eliminate entries containing a dot. We can have a dot only -# as a symbol prefix, but such symbols are undefined externs. -# 6. Eliminate everything including the key letter, so that we're -# left with just the symbol name. -# 7. Eliminate all entries containing two colons, like Class::method +# - Use the -B flag to have a standard BSD representation +# of the symbol list. +# - Use the -x flag to have a hex representation of the symbol +# values. This fills the leading whitespaces, thus simplifying +# the sed statement. +# - Eliminate all entries except those with either "B", "D" +# or "T" key letters. We are interested only in the global +# (extern) BSS, DATA and TEXT symbols. With the same statement +# we eliminate object member lines relevant to AIX 4. +# - Eliminate entries containing a dot. We can have a dot only +# as a symbol prefix, but such symbols are undefined externs. +# - Eliminate everything including the key letter, so that we're +# left with just the symbol name. +# - Eliminate all entries containing two colons, like Class::method # -# Use -X32_64 if it appears to be implemented in this version of 'nm'. -NM=/usr/ccs/bin/nm -xopt=-X32_64 -$NM -e $xopt $1 >/dev/null 2>&1 || xopt="" - -$NM -Bex $xopt $inputFiles \ +/usr/ccs/bin/nm -Bex -X32_64 $inputFiles \ | sed -e '/ [^BDT] /d' -e '/\./d' -e 's/.* [BDT] //' -e '/::/d' \ | sort | uniq >> $expFileName diff --git a/configure b/configure index b8b056e4033194..491869ef2cb7b1 100755 --- a/configure +++ b/configure @@ -3430,16 +3430,6 @@ $as_echo "#define _BSD_SOURCE 1" >>confdefs.h define_xopen_source=no;; Darwin/[12][0-9].*) define_xopen_source=no;; - # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but - # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined - # or has another value. By not (re)defining it, the defaults come in place. - AIX/4) - define_xopen_source=no;; - AIX/5) - if test `uname -r` -eq 1; then - define_xopen_source=no - fi - ;; # On QNX 6.3.2, defining _XOPEN_SOURCE prevents netdb.h from # defining NI_NUMERICHOST. QNX/6.3.2) @@ -5828,10 +5818,7 @@ $as_echo_n "checking EXPORTSYMS... " >&6; } case $ac_sys_system in AIX*) EXPORTSYMS="Modules/python.exp" - if test $ac_sys_release -ge 5 -o \ - $ac_sys_release -eq 4 -a `uname -r` -ge 2 ; then - EXPORTSFROM=. # the main executable - fi + EXPORTSFROM=. # the main executable ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EXPORTSYMS" >&5 @@ -11657,7 +11644,7 @@ fi DLINCLDIR=. # the dlopen() function means we might want to use dynload_shlib.o. some -# platforms, such as AIX, have dlopen(), but don't want to use it. +# platforms have dlopen(), but don't want to use it. for ac_func in dlopen do : ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" diff --git a/configure.ac b/configure.ac index e499cb4da023ec..440cdd178e1e88 100644 --- a/configure.ac +++ b/configure.ac @@ -512,16 +512,6 @@ case $ac_sys_system/$ac_sys_release in define_xopen_source=no;; Darwin/@<:@[12]@:>@@<:@0-9@:>@.*) define_xopen_source=no;; - # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but - # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined - # or has another value. By not (re)defining it, the defaults come in place. - AIX/4) - define_xopen_source=no;; - AIX/5) - if test `uname -r` -eq 1; then - define_xopen_source=no - fi - ;; # On QNX 6.3.2, defining _XOPEN_SOURCE prevents netdb.h from # defining NI_NUMERICHOST. QNX/6.3.2) @@ -1048,10 +1038,7 @@ AC_MSG_CHECKING(EXPORTSYMS) case $ac_sys_system in AIX*) EXPORTSYMS="Modules/python.exp" - if test $ac_sys_release -ge 5 -o \ - $ac_sys_release -eq 4 -a `uname -r` -ge 2 ; then - EXPORTSFROM=. # the main executable - fi + EXPORTSFROM=. # the main executable ;; esac AC_MSG_RESULT($EXPORTSYMS) @@ -3631,7 +3618,7 @@ AC_SUBST(DLINCLDIR) DLINCLDIR=. # the dlopen() function means we might want to use dynload_shlib.o. some -# platforms, such as AIX, have dlopen(), but don't want to use it. +# platforms have dlopen(), but don't want to use it. AC_CHECK_FUNCS(dlopen) # DYNLOADFILE specifies which dynload_*.o file we will use for dynamic From 0519721ebfc73d90a353259044f6bfb78d44a036 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Mon, 16 Nov 2020 20:46:37 +0200 Subject: [PATCH 0545/1261] bpo-40939: Document removal of the old parser in 3.10 whatsnew (GH-23321) Automerge-Triggered-By: GH:lysnikolaou --- Doc/whatsnew/3.10.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index b8e6843c4b54f9..87ba2e8af74ad0 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -376,6 +376,16 @@ Removed moved to the internal C API. (Contributed by Victor Stinner in :issue:`42157`.) +* Removed the ``parser`` module, which was deprecated in 3.9 due to the + switch to the new PEG parser, as well as all the C source and header files + that were only being used by the old parser, including ``node.h``, ``parser.h``, + ``graminit.h`` and ``grammar.h``. + +* Removed the Public C API functions :c:func:`PyParser_SimpleParseStringFlags`, + :c:func:`PyParser_SimpleParseStringFlagsFilename`, + :c:func:`PyParser_SimpleParseFileFlags` and :c:func:`PyNode_Compile` + that were deprecated in 3.9 due to the switch to the new PEG parser. + Porting to Python 3.10 ====================== From da5c47f35e4e68fc312d31c22ca64da35bec4c39 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Mon, 16 Nov 2020 14:32:35 -0700 Subject: [PATCH 0546/1261] bpo-38506: Fix the Windows py.exe launcher's misordering of 3.10 (GH-18307) --- .../2020-11-15-23-01-14.bpo-38506.hhdnuP.rst | 2 ++ PC/launcher.c | 20 ++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-11-15-23-01-14.bpo-38506.hhdnuP.rst diff --git a/Misc/NEWS.d/next/Windows/2020-11-15-23-01-14.bpo-38506.hhdnuP.rst b/Misc/NEWS.d/next/Windows/2020-11-15-23-01-14.bpo-38506.hhdnuP.rst new file mode 100644 index 00000000000000..8ad75ef5ea093a --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-11-15-23-01-14.bpo-38506.hhdnuP.rst @@ -0,0 +1,2 @@ +The Windows launcher now properly handles Python 3.10 when listing installed +Python versions. diff --git a/PC/launcher.c b/PC/launcher.c index 7ca2f2387801c9..cc2d35b2c4cb7c 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -425,11 +425,21 @@ compare_pythons(const void * p1, const void * p2) INSTALLED_PYTHON * ip1 = (INSTALLED_PYTHON *) p1; INSTALLED_PYTHON * ip2 = (INSTALLED_PYTHON *) p2; /* note reverse sorting on version */ - int result = wcscmp(ip2->version, ip1->version); - - if (result == 0) - result = ip2->bits - ip1->bits; /* 64 before 32 */ - return result; + int result = CompareStringW(LOCALE_INVARIANT, SORT_DIGITSASNUMBERS, + ip2->version, -1, ip1->version, -1); + switch (result) { + case 0: + error(0, L"CompareStringW failed"); + return 0; + case CSTR_LESS_THAN: + return -1; + case CSTR_EQUAL: + return ip2->bits - ip1->bits; /* 64 before 32 */ + case CSTR_GREATER_THAN: + return 1; + default: + return 0; // This should never be reached. + } } static void From 69434fb8839a2e7c96a0acd361c4a7e6f63b269f Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Tue, 17 Nov 2020 01:08:35 +0200 Subject: [PATCH 0547/1261] bpo-42374: Allow unparenthesized walrus in genexps (GH-23319) This fixes a regression that was introduced by the new parser. Automerge-Triggered-By: GH:lysnikolaou --- Grammar/python.gram | 2 +- Lib/test/test_named_expressions.py | 9 +++++++++ .../2020-11-16-17-57-09.bpo-42374.t7np1E.rst | 2 ++ Parser/parser.c | 12 ++++++------ 4 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-57-09.bpo-42374.t7np1E.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index ae5e4b5d4ca64d..91ce520be1ce76 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -517,7 +517,7 @@ group[expr_ty]: | '(' a=(yield_expr | named_expression) ')' { a } | invalid_group genexp[expr_ty]: - | '(' a=expression ~ b=for_if_clauses ')' { _Py_GeneratorExp(a, b, EXTRA) } + | '(' a=named_expression ~ b=for_if_clauses ')' { _Py_GeneratorExp(a, b, EXTRA) } | invalid_comprehension set[expr_ty]: '{' a=expressions_list '}' { _Py_Set(a, EXTRA) } setcomp[expr_ty]: diff --git a/Lib/test/test_named_expressions.py b/Lib/test/test_named_expressions.py index c813830ce6d3cf..d614f3267fad37 100644 --- a/Lib/test/test_named_expressions.py +++ b/Lib/test/test_named_expressions.py @@ -513,6 +513,15 @@ def g(): self.assertEqual(nonlocal_var, None) f() + def test_named_expression_scope_in_genexp(self): + a = 1 + b = [1, 2, 3, 4] + genexp = (c := i + a for i in b) + + self.assertNotIn("c", locals()) + for idx, elem in enumerate(genexp): + self.assertEqual(elem, b[idx] + a) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-57-09.bpo-42374.t7np1E.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-57-09.bpo-42374.t7np1E.rst new file mode 100644 index 00000000000000..d86d038c8425c5 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-57-09.bpo-42374.t7np1E.rst @@ -0,0 +1,2 @@ +Fix a regression introduced by the new parser, where an unparenthesized walrus operator +was not allowed within generator expressions. \ No newline at end of file diff --git a/Parser/parser.c b/Parser/parser.c index 48ebfe65aedafa..94e265881984c5 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -11357,7 +11357,7 @@ group_rule(Parser *p) return _res; } -// genexp: '(' expression ~ for_if_clauses ')' | invalid_comprehension +// genexp: '(' named_expression ~ for_if_clauses ')' | invalid_comprehension static expr_ty genexp_rule(Parser *p) { @@ -11377,12 +11377,12 @@ genexp_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // '(' expression ~ for_if_clauses ')' + { // '(' named_expression ~ for_if_clauses ')' if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> genexp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' expression ~ for_if_clauses ')'")); + D(fprintf(stderr, "%*c> genexp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' named_expression ~ for_if_clauses ')'")); int _cut_var = 0; Token * _literal; Token * _literal_1; @@ -11391,7 +11391,7 @@ genexp_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = expression_rule(p)) // expression + (a = named_expression_rule(p)) // named_expression && (_cut_var = 1) && @@ -11400,7 +11400,7 @@ genexp_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ genexp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' expression ~ for_if_clauses ')'")); + D(fprintf(stderr, "%*c+ genexp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' named_expression ~ for_if_clauses ')'")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -11420,7 +11420,7 @@ genexp_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s genexp[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' expression ~ for_if_clauses ')'")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' named_expression ~ for_if_clauses ')'")); if (_cut_var) { D(p->level--); return NULL; From 00e40946ef88578a1782055c82456604517436cc Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Tue, 17 Nov 2020 01:09:35 +0200 Subject: [PATCH 0548/1261] bpo-42316: Allow unparenthesized walrus operator in indexes (GH-23317) --- Grammar/python.gram | 2 +- Lib/test/test_named_expressions.py | 21 +++++++++++++++++++ .../2020-11-16-17-30-03.bpo-42316._DdmpQ.rst | 1 + Parser/parser.c | 12 +++++------ 4 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-30-03.bpo-42316._DdmpQ.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index 91ce520be1ce76..a0e9a89ab992c4 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -491,7 +491,7 @@ slices[expr_ty]: | a[asdl_expr_seq*]=','.slice+ [','] { _Py_Tuple(a, Load, EXTRA) } slice[expr_ty]: | a=[expression] ':' b=[expression] c=[':' d=[expression] { d }] { _Py_Slice(a, b, c, EXTRA) } - | a=expression { a } + | a=named_expression { a } atom[expr_ty]: | NAME | 'True' { _Py_Constant(Py_True, NULL, EXTRA) } diff --git a/Lib/test/test_named_expressions.py b/Lib/test/test_named_expressions.py index d614f3267fad37..9c9a58ee654bed 100644 --- a/Lib/test/test_named_expressions.py +++ b/Lib/test/test_named_expressions.py @@ -271,6 +271,27 @@ def test_named_expression_assignment_16(self): fib = {(c := a): (a := b) + (b := a + c) - b for __ in range(6)} self.assertEqual(fib, {1: 2, 2: 3, 3: 5, 5: 8, 8: 13, 13: 21}) + def test_named_expression_assignment_17(self): + a = [1] + element = a[b:=0] + self.assertEqual(b, 0) + self.assertEqual(element, a[0]) + + def test_named_expression_assignment_18(self): + class TwoDimensionalList: + def __init__(self, two_dimensional_list): + self.two_dimensional_list = two_dimensional_list + + def __getitem__(self, index): + return self.two_dimensional_list[index[0]][index[1]] + + a = TwoDimensionalList([[1], [2]]) + element = a[b:=0, c:=0] + self.assertEqual(b, 0) + self.assertEqual(c, 0) + self.assertEqual(element, a.two_dimensional_list[b][c]) + + class NamedExpressionScopeTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-30-03.bpo-42316._DdmpQ.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-30-03.bpo-42316._DdmpQ.rst new file mode 100644 index 00000000000000..77eb6662ba827e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-30-03.bpo-42316._DdmpQ.rst @@ -0,0 +1 @@ +Allow an unparenthesized walrus in subscript indexes. \ No newline at end of file diff --git a/Parser/parser.c b/Parser/parser.c index 94e265881984c5..2f6d68f41e8b91 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -10639,7 +10639,7 @@ slices_rule(Parser *p) return _res; } -// slice: expression? ':' expression? [':' expression?] | expression +// slice: expression? ':' expression? [':' expression?] | named_expression static expr_ty slice_rule(Parser *p) { @@ -10701,18 +10701,18 @@ slice_rule(Parser *p) D(fprintf(stderr, "%*c%s slice[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression? ':' expression? [':' expression?]")); } - { // expression + { // named_expression if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> slice[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression")); + D(fprintf(stderr, "%*c> slice[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); expr_ty a; if ( - (a = expression_rule(p)) // expression + (a = named_expression_rule(p)) // named_expression ) { - D(fprintf(stderr, "%*c+ slice[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression")); + D(fprintf(stderr, "%*c+ slice[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); _res = a; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -10723,7 +10723,7 @@ slice_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s slice[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression")); } _res = NULL; done: From a8c7596743cbeadffe64f22a7b0f897fa82a8d95 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 16 Nov 2020 23:22:42 +0000 Subject: [PATCH 0549/1261] bpo-42120: Remove macro defining copysign to _copysign on Windows (GH-23326) --- .../NEWS.d/next/Windows/2020-11-16-22-41-02.bpo-42120.9scgko.rst | 1 + PC/pyconfig.h | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-11-16-22-41-02.bpo-42120.9scgko.rst diff --git a/Misc/NEWS.d/next/Windows/2020-11-16-22-41-02.bpo-42120.9scgko.rst b/Misc/NEWS.d/next/Windows/2020-11-16-22-41-02.bpo-42120.9scgko.rst new file mode 100644 index 00000000000000..c574956d11d932 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-11-16-22-41-02.bpo-42120.9scgko.rst @@ -0,0 +1 @@ +Remove macro definition of ``copysign`` (to ``_copysign``) in headers. diff --git a/PC/pyconfig.h b/PC/pyconfig.h index b29f63c35bccb1..592b487adcb458 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -193,7 +193,6 @@ typedef int pid_t; #define Py_IS_NAN _isnan #define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X)) #define Py_IS_FINITE(X) _finite(X) -#define copysign _copysign /* define some ANSI types that are not defined in earlier Win headers */ #if _MSC_VER >= 1200 From 6d4fa8e89e628584710aba3b7dfe7a1393ae05eb Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 16 Nov 2020 23:59:55 +0000 Subject: [PATCH 0550/1261] Add GCC pragmas to silence compiler warning about ffi_prep_closure (GH-23327) --- Modules/_ctypes/callbacks.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index 3686287e45ac3a..654cb93dcf7776 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -427,15 +427,22 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, PyErr_Format(PyExc_NotImplementedError, "ffi_prep_closure_loc() is missing"); goto error; #else -#ifdef MACOSX +#if defined(__clang__) || defined(MACOSX) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif +#if defined(__GNUC__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif result = ffi_prep_closure(p->pcl_write, &p->cif, closure_fcn, p); -#ifdef MACOSX +#if defined(__clang__) || defined(MACOSX) #pragma clang diagnostic pop #endif +#if defined(__GNUC__) + #pragma GCC diagnostic pop +#endif #endif } From d589e24487e7cceee6a297b0c1f48e02d1146fd0 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 17 Nov 2020 00:00:38 +0000 Subject: [PATCH 0551/1261] bpo-41625: Expose the splice() system call in the os module (GH-21947) --- Doc/library/os.rst | 32 +++++ Doc/whatsnew/3.10.rst | 5 + Lib/test/test_os.py | 117 ++++++++++++++++++ .../2020-08-24-16-59-04.bpo-41625.Cc967V.rst | 2 + Modules/clinic/posixmodule.c.h | 106 +++++++++++++++- Modules/posixmodule.c | 78 +++++++++++- aclocal.m4 | 80 +----------- configure | 2 +- configure.ac | 2 +- pyconfig.h.in | 3 + 10 files changed, 349 insertions(+), 78 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-08-24-16-59-04.bpo-41625.Cc967V.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 6c7ae0c785dcd9..75a8ed44e5b7b2 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1419,6 +1419,38 @@ or `the MSDN `_ on Windo .. versionadded:: 3.3 +.. function:: splice(src, dst, count, offset_src=None, offset_dst=None) + + Transfer *count* bytes from file descriptor *src*, starting from offset + *offset_src*, to file descriptor *dst*, starting from offset *offset_dst*. + At least one of the file descriptors must refer to a pipe. If *offset_src* + is None, then *src* is read from the current position; respectively for + *offset_dst*. The offset associated to the file descriptor that refers to a + pipe must be ``None``. The files pointed by *src* and *dst* must reside in + the same filesystem, otherwise an :exc:`OSError` is raised with + :attr:`~OSError.errno` set to :data:`errno.EXDEV`. + + This copy is done without the additional cost of transferring data + from the kernel to user space and then back into the kernel. Additionally, + some filesystems could implement extra optimizations. The copy is done as if + both files are opened as binary. + + Upon successful completion, returns the number of bytes spliced to or from + the pipe. A return value of 0 means end of input. If *src* refers to a + pipe, then this means that there was no data to transfer, and it would not + make sense to block because there are no writers connected to the write end + of the pipe. + + .. availability:: Linux kernel >= 2.6.17 or glibc >= 2.5 + + .. versionadded:: 3.10 + + +.. data:: SPLICE_F_MOVE + SPLICE_F_NONBLOCK + SPLICE_F_MORE + + .. function:: readv(fd, buffers) Read from a file descriptor *fd* into a number of mutable :term:`bytes-like diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 87ba2e8af74ad0..25b736ec325bad 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -233,6 +233,11 @@ Added a new function :func:`os.eventfd` and related helpers to wrap the ``eventfd2`` syscall on Linux. (Contributed by Christian Heimes in :issue:`41001`.) +Added :func:`os.splice()` that allows to move data between two file +descriptors without copying between kernel address space and user +address space, where one of the file descriptors must refer to a +pipe. (Contributed by Pablo Galindo in :issue:`41625`.) + py_compile ---------- diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 501b4a975566a7..d6da4617d50f7f 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -381,6 +381,123 @@ def test_copy_file_range_offset(self): self.assertEqual(read[out_seek:], data[in_skip:in_skip+i]) + @unittest.skipUnless(hasattr(os, 'splice'), 'test needs os.splice()') + def test_splice_invalid_values(self): + with self.assertRaises(ValueError): + os.splice(0, 1, -10) + + @unittest.skipUnless(hasattr(os, 'splice'), 'test needs os.splice()') + def test_splice(self): + TESTFN2 = os_helper.TESTFN + ".3" + data = b'0123456789' + + create_file(os_helper.TESTFN, data) + self.addCleanup(os_helper.unlink, os_helper.TESTFN) + + in_file = open(os_helper.TESTFN, 'rb') + self.addCleanup(in_file.close) + in_fd = in_file.fileno() + + read_fd, write_fd = os.pipe() + self.addCleanup(lambda: os.close(read_fd)) + self.addCleanup(lambda: os.close(write_fd)) + + try: + i = os.splice(in_fd, write_fd, 5) + except OSError as e: + # Handle the case in which Python was compiled + # in a system with the syscall but without support + # in the kernel. + if e.errno != errno.ENOSYS: + raise + self.skipTest(e) + else: + # The number of copied bytes can be less than + # the number of bytes originally requested. + self.assertIn(i, range(0, 6)); + + self.assertEqual(os.read(read_fd, 100), data[:i]) + + @unittest.skipUnless(hasattr(os, 'splice'), 'test needs os.splice()') + def test_splice_offset_in(self): + TESTFN4 = os_helper.TESTFN + ".4" + data = b'0123456789' + bytes_to_copy = 6 + in_skip = 3 + + create_file(os_helper.TESTFN, data) + self.addCleanup(os_helper.unlink, os_helper.TESTFN) + + in_file = open(os_helper.TESTFN, 'rb') + self.addCleanup(in_file.close) + in_fd = in_file.fileno() + + read_fd, write_fd = os.pipe() + self.addCleanup(lambda: os.close(read_fd)) + self.addCleanup(lambda: os.close(write_fd)) + + try: + i = os.splice(in_fd, write_fd, bytes_to_copy, offset_src=in_skip) + except OSError as e: + # Handle the case in which Python was compiled + # in a system with the syscall but without support + # in the kernel. + if e.errno != errno.ENOSYS: + raise + self.skipTest(e) + else: + # The number of copied bytes can be less than + # the number of bytes originally requested. + self.assertIn(i, range(0, bytes_to_copy+1)); + + read = os.read(read_fd, 100) + # 012 are skipped (in_skip) + # 345678 are copied in the file (in_skip + bytes_to_copy) + self.assertEqual(read, data[in_skip:in_skip+i]) + + @unittest.skipUnless(hasattr(os, 'splice'), 'test needs os.splice()') + def test_splice_offset_out(self): + TESTFN4 = os_helper.TESTFN + ".4" + data = b'0123456789' + bytes_to_copy = 6 + out_seek = 3 + + create_file(os_helper.TESTFN, data) + self.addCleanup(os_helper.unlink, os_helper.TESTFN) + + read_fd, write_fd = os.pipe() + self.addCleanup(lambda: os.close(read_fd)) + self.addCleanup(lambda: os.close(write_fd)) + os.write(write_fd, data) + + out_file = open(TESTFN4, 'w+b') + self.addCleanup(os_helper.unlink, TESTFN4) + self.addCleanup(out_file.close) + out_fd = out_file.fileno() + + try: + i = os.splice(read_fd, out_fd, bytes_to_copy, offset_dst=out_seek) + except OSError as e: + # Handle the case in which Python was compiled + # in a system with the syscall but without support + # in the kernel. + if e.errno != errno.ENOSYS: + raise + self.skipTest(e) + else: + # The number of copied bytes can be less than + # the number of bytes originally requested. + self.assertIn(i, range(0, bytes_to_copy+1)); + + with open(TESTFN4, 'rb') as in_file: + read = in_file.read() + # seeked bytes (5) are zero'ed + self.assertEqual(read[:out_seek], b'\x00'*out_seek) + # 012 are skipped (in_skip) + # 345678 are copied in the file (in_skip + bytes_to_copy) + self.assertEqual(read[out_seek:], data[:i]) + + # Test attributes on return values from os.*stat* family. class StatAttributeTests(unittest.TestCase): def setUp(self): diff --git a/Misc/NEWS.d/next/Library/2020-08-24-16-59-04.bpo-41625.Cc967V.rst b/Misc/NEWS.d/next/Library/2020-08-24-16-59-04.bpo-41625.Cc967V.rst new file mode 100644 index 00000000000000..086788a7b0130f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-24-16-59-04.bpo-41625.Cc967V.rst @@ -0,0 +1,2 @@ +Expose the :c:func:`splice` as :func:`os.splice` in the :mod:`os` module. +Patch by Pablo Galindo diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index f5826e3681251e..ee4ee8ceac5580 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -5674,6 +5674,106 @@ os_copy_file_range(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py #endif /* defined(HAVE_COPY_FILE_RANGE) */ +#if defined(HAVE_SPLICE) + +PyDoc_STRVAR(os_splice__doc__, +"splice($module, /, src, dst, count, offset_src=None, offset_dst=None,\n" +" flags=0)\n" +"--\n" +"\n" +"Transfer count bytes from one pipe to a descriptor or vice versa.\n" +"\n" +" src\n" +" Source file descriptor.\n" +" dst\n" +" Destination file descriptor.\n" +" count\n" +" Number of bytes to copy.\n" +" offset_src\n" +" Starting offset in src.\n" +" offset_dst\n" +" Starting offset in dst.\n" +" flags\n" +" Flags to modify the semantics of the call.\n" +"\n" +"If offset_src is None, then src is read from the current position;\n" +"respectively for offset_dst. The offset associated to the file\n" +"descriptor that refers to a pipe must be None."); + +#define OS_SPLICE_METHODDEF \ + {"splice", (PyCFunction)(void(*)(void))os_splice, METH_FASTCALL|METH_KEYWORDS, os_splice__doc__}, + +static PyObject * +os_splice_impl(PyObject *module, int src, int dst, Py_ssize_t count, + PyObject *offset_src, PyObject *offset_dst, + unsigned int flags); + +static PyObject * +os_splice(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"src", "dst", "count", "offset_src", "offset_dst", "flags", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "splice", 0}; + PyObject *argsbuf[6]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; + int src; + int dst; + Py_ssize_t count; + PyObject *offset_src = Py_None; + PyObject *offset_dst = Py_None; + unsigned int flags = 0; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 6, 0, argsbuf); + if (!args) { + goto exit; + } + src = _PyLong_AsInt(args[0]); + if (src == -1 && PyErr_Occurred()) { + goto exit; + } + dst = _PyLong_AsInt(args[1]); + if (dst == -1 && PyErr_Occurred()) { + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + count = ival; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[3]) { + offset_src = args[3]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[4]) { + offset_dst = args[4]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!_PyLong_UnsignedInt_Converter(args[5], &flags)) { + goto exit; + } +skip_optional_pos: + return_value = os_splice_impl(module, src, dst, count, offset_src, offset_dst, flags); + +exit: + return return_value; +} + +#endif /* defined(HAVE_SPLICE) */ + #if defined(HAVE_MKFIFO) PyDoc_STRVAR(os_mkfifo__doc__, @@ -8864,6 +8964,10 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #define OS_COPY_FILE_RANGE_METHODDEF #endif /* !defined(OS_COPY_FILE_RANGE_METHODDEF) */ +#ifndef OS_SPLICE_METHODDEF + #define OS_SPLICE_METHODDEF +#endif /* !defined(OS_SPLICE_METHODDEF) */ + #ifndef OS_MKFIFO_METHODDEF #define OS_MKFIFO_METHODDEF #endif /* !defined(OS_MKFIFO_METHODDEF) */ @@ -9059,4 +9163,4 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=49b7ed768242ef7c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8a59e91178897267 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 0764453f412d56..ecab147d2f38e7 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6521,7 +6521,6 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv, #endif /* HAVE_SPAWNV */ - #ifdef HAVE_FORK /* Helper function to validate arguments. @@ -10370,6 +10369,75 @@ os_copy_file_range_impl(PyObject *module, int src, int dst, Py_ssize_t count, } #endif /* HAVE_COPY_FILE_RANGE*/ +#ifdef HAVE_SPLICE +/*[clinic input] + +os.splice + src: int + Source file descriptor. + dst: int + Destination file descriptor. + count: Py_ssize_t + Number of bytes to copy. + offset_src: object = None + Starting offset in src. + offset_dst: object = None + Starting offset in dst. + flags: unsigned_int = 0 + Flags to modify the semantics of the call. + +Transfer count bytes from one pipe to a descriptor or vice versa. + +If offset_src is None, then src is read from the current position; +respectively for offset_dst. The offset associated to the file +descriptor that refers to a pipe must be None. +[clinic start generated code]*/ + +static PyObject * +os_splice_impl(PyObject *module, int src, int dst, Py_ssize_t count, + PyObject *offset_src, PyObject *offset_dst, + unsigned int flags) +/*[clinic end generated code: output=d0386f25a8519dc5 input=047527c66c6d2e0a]*/ +{ + off_t offset_src_val, offset_dst_val; + off_t *p_offset_src = NULL; + off_t *p_offset_dst = NULL; + Py_ssize_t ret; + int async_err = 0; + + if (count < 0) { + PyErr_SetString(PyExc_ValueError, "negative value for 'count' not allowed"); + return NULL; + } + + if (offset_src != Py_None) { + if (!Py_off_t_converter(offset_src, &offset_src_val)) { + return NULL; + } + p_offset_src = &offset_src_val; + } + + if (offset_dst != Py_None) { + if (!Py_off_t_converter(offset_dst, &offset_dst_val)) { + return NULL; + } + p_offset_dst = &offset_dst_val; + } + + do { + Py_BEGIN_ALLOW_THREADS + ret = splice(src, p_offset_src, dst, p_offset_dst, count, flags); + Py_END_ALLOW_THREADS + } while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); + + if (ret < 0) { + return (!async_err) ? posix_error() : NULL; + } + + return PyLong_FromSsize_t(ret); +} +#endif /* HAVE_SPLICE*/ + #ifdef HAVE_MKFIFO /*[clinic input] os.mkfifo @@ -14550,6 +14618,7 @@ static PyMethodDef posix_methods[] = { OS_POSIX_SPAWNP_METHODDEF OS_READLINK_METHODDEF OS_COPY_FILE_RANGE_METHODDEF + OS_SPLICE_METHODDEF OS_RENAME_METHODDEF OS_REPLACE_METHODDEF OS_RMDIR_METHODDEF @@ -15072,6 +15141,13 @@ all_ins(PyObject *m) if (PyModule_AddIntConstant(m, "RWF_APPEND", RWF_APPEND)) return -1; #endif +/* constants for splice */ +#ifdef HAVE_SPLICE + if (PyModule_AddIntConstant(m, "SPLICE_F_MOVE", SPLICE_F_MOVE)) return -1; + if (PyModule_AddIntConstant(m, "SPLICE_F_NONBLOCK", SPLICE_F_NONBLOCK)) return -1; + if (PyModule_AddIntConstant(m, "SPLICE_F_MORE", SPLICE_F_MORE)) return -1; +#endif + /* constants for posix_spawn */ #ifdef HAVE_POSIX_SPAWN if (PyModule_AddIntConstant(m, "POSIX_SPAWN_OPEN", POSIX_SPAWN_OPEN)) return -1; diff --git a/aclocal.m4 b/aclocal.m4 index 99913e7f3b85cf..c003f3c7055389 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -67,7 +67,7 @@ AS_VAR_POPDEF([CACHEVAR])dnl ])dnl AX_CHECK_COMPILE_FLAGS # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# serial 11 (pkg-config-0.29.1) +# serial 12 (pkg-config-0.29.2) dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson @@ -109,7 +109,7 @@ dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], -[m4_define([PKG_MACROS_VERSION], [0.29.1]) +[m4_define([PKG_MACROS_VERSION], [0.29.2]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ @@ -210,7 +210,7 @@ AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no -AC_MSG_CHECKING([for $1]) +AC_MSG_CHECKING([for $2]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) @@ -220,11 +220,11 @@ and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` - else + else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs @@ -241,7 +241,7 @@ installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full @@ -342,73 +342,5 @@ AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR -dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, -dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], -dnl [DESCRIPTION], [DEFAULT]) -dnl ------------------------------------------ -dnl -dnl Prepare a "--with-" configure option using the lowercase -dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and -dnl PKG_CHECK_MODULES in a single macro. -AC_DEFUN([PKG_WITH_MODULES], -[ -m4_pushdef([with_arg], m4_tolower([$1])) - -m4_pushdef([description], - [m4_default([$5], [build with ]with_arg[ support])]) - -m4_pushdef([def_arg], [m4_default([$6], [auto])]) -m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) -m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) - -m4_case(def_arg, - [yes],[m4_pushdef([with_without], [--without-]with_arg)], - [m4_pushdef([with_without],[--with-]with_arg)]) - -AC_ARG_WITH(with_arg, - AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, - [AS_TR_SH([with_]with_arg)=def_arg]) - -AS_CASE([$AS_TR_SH([with_]with_arg)], - [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], - [auto],[PKG_CHECK_MODULES([$1],[$2], - [m4_n([def_action_if_found]) $3], - [m4_n([def_action_if_not_found]) $4])]) - -m4_popdef([with_arg]) -m4_popdef([description]) -m4_popdef([def_arg]) - -])dnl PKG_WITH_MODULES - -dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, -dnl [DESCRIPTION], [DEFAULT]) -dnl ----------------------------------------------- -dnl -dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES -dnl check._[VARIABLE-PREFIX] is exported as make variable. -AC_DEFUN([PKG_HAVE_WITH_MODULES], -[ -PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) - -AM_CONDITIONAL([HAVE_][$1], - [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) -])dnl PKG_HAVE_WITH_MODULES - -dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, -dnl [DESCRIPTION], [DEFAULT]) -dnl ------------------------------------------------------ -dnl -dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after -dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make -dnl and preprocessor variable. -AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], -[ -PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) - -AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], - [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) -])dnl PKG_HAVE_DEFINE_WITH_MODULES - m4_include([m4/ax_c_float_words_bigendian.m4]) m4_include([m4/ax_check_openssl.m4]) diff --git a/configure b/configure index 491869ef2cb7b1..e665d135e67b27 100755 --- a/configure +++ b/configure @@ -11726,7 +11726,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ sched_rr_get_interval \ sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \ - sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ + sigtimedwait sigwait sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ truncate uname unlinkat utimensat utimes vfork waitid waitpid wait3 wait4 \ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn diff --git a/configure.ac b/configure.ac index 440cdd178e1e88..668715cdf8f15a 100644 --- a/configure.ac +++ b/configure.ac @@ -3684,7 +3684,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ sched_rr_get_interval \ sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \ - sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ + sigtimedwait sigwait sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ truncate uname unlinkat utimensat utimes vfork waitid waitpid wait3 wait4 \ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn) diff --git a/pyconfig.h.in b/pyconfig.h.in index 8a5e9455eca76c..6ff5fc968a30c2 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -1018,6 +1018,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SPAWN_H +/* Define to 1 if you have the `splice' function. */ +#undef HAVE_SPLICE + /* Define if your compiler provides ssize_t */ #undef HAVE_SSIZE_T From d4037c5145a7d812aa71fd2355f5af9467c39298 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 17 Nov 2020 01:17:12 +0000 Subject: [PATCH 0552/1261] bpo-42381: Allow walrus in set literals and set comprehensions (GH-23332) Currently walruses are not allowerd in set literals and set comprehensions: >>> {y := 4, 4**2, 3**3} File "", line 1 {y := 4, 4**2, 3**3} ^ SyntaxError: invalid syntax but they should be allowed as well per PEP 572 --- Grammar/python.gram | 5 +- Lib/test/test_named_expressions.py | 60 +- .../2020-11-16-23-45-56.bpo-42381.G4AWxL.rst | 2 + Parser/parser.c | 2071 ++++++++--------- 4 files changed, 1014 insertions(+), 1124 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-16-23-45-56.bpo-42381.G4AWxL.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index a0e9a89ab992c4..9e915acf5dbaf6 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -311,7 +311,6 @@ block[asdl_stmt_seq*] (memo): | simple_stmt | invalid_block -expressions_list[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_expression+ [','] { a } star_expressions[expr_ty]: | a=star_expression b=(',' c=star_expression { c })+ [','] { _Py_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } @@ -519,9 +518,9 @@ group[expr_ty]: genexp[expr_ty]: | '(' a=named_expression ~ b=for_if_clauses ')' { _Py_GeneratorExp(a, b, EXTRA) } | invalid_comprehension -set[expr_ty]: '{' a=expressions_list '}' { _Py_Set(a, EXTRA) } +set[expr_ty]: '{' a=star_named_expressions '}' { _Py_Set(a, EXTRA) } setcomp[expr_ty]: - | '{' a=expression ~ b=for_if_clauses '}' { _Py_SetComp(a, b, EXTRA) } + | '{' a=named_expression ~ b=for_if_clauses '}' { _Py_SetComp(a, b, EXTRA) } | invalid_comprehension dict[expr_ty]: | '{' a=[double_starred_kvpairs] '}' { diff --git a/Lib/test/test_named_expressions.py b/Lib/test/test_named_expressions.py index 9c9a58ee654bed..5908f1210857a3 100644 --- a/Lib/test/test_named_expressions.py +++ b/Lib/test/test_named_expressions.py @@ -113,7 +113,7 @@ def test_named_expression_invalid_in_class_body(self): "assignment expression within a comprehension cannot be used in a class body"): exec(code, {}, {}) - def test_named_expression_invalid_rebinding_comprehension_iteration_variable(self): + def test_named_expression_invalid_rebinding_list_comprehension_iteration_variable(self): cases = [ ("Local reuse", 'i', "[i := 0 for i in range(5)]"), ("Nested reuse", 'j', "[[(j := 0) for i in range(5)] for j in range(5)]"), @@ -130,7 +130,7 @@ def test_named_expression_invalid_rebinding_comprehension_iteration_variable(sel with self.assertRaisesRegex(SyntaxError, msg): exec(code, {}, {}) - def test_named_expression_invalid_rebinding_comprehension_inner_loop(self): + def test_named_expression_invalid_rebinding_list_comprehension_inner_loop(self): cases = [ ("Inner reuse", 'j', "[i for i in range(5) if (j := 0) for j in range(5)]"), ("Inner unpacking reuse", 'j', "[i for i in range(5) if (j := 0) for j, k in [(0, 1)]]"), @@ -145,7 +145,7 @@ def test_named_expression_invalid_rebinding_comprehension_inner_loop(self): with self.assertRaisesRegex(SyntaxError, msg): exec(f"lambda: {code}", {}) # Function scope - def test_named_expression_invalid_comprehension_iterable_expression(self): + def test_named_expression_invalid_list_comprehension_iterable_expression(self): cases = [ ("Top level", "[i for i in (i := range(5))]"), ("Inside tuple", "[i for i in (2, 3, i := range(5))]"), @@ -167,6 +167,60 @@ def test_named_expression_invalid_comprehension_iterable_expression(self): with self.assertRaisesRegex(SyntaxError, msg): exec(f"lambda: {code}", {}) # Function scope + def test_named_expression_invalid_rebinding_set_comprehension_iteration_variable(self): + cases = [ + ("Local reuse", 'i', "{i := 0 for i in range(5)}"), + ("Nested reuse", 'j', "{{(j := 0) for i in range(5)} for j in range(5)}"), + ("Reuse inner loop target", 'j', "{(j := 0) for i in range(5) for j in range(5)}"), + ("Unpacking reuse", 'i', "{i := 0 for i, j in {(0, 1)}}"), + ("Reuse in loop condition", 'i', "{i+1 for i in range(5) if (i := 0)}"), + ("Unreachable reuse", 'i', "{False or (i:=0) for i in range(5)}"), + ("Unreachable nested reuse", 'i', + "{(i, j) for i in range(5) for j in range(5) if True or (i:=10)}"), + ] + for case, target, code in cases: + msg = f"assignment expression cannot rebind comprehension iteration variable '{target}'" + with self.subTest(case=case): + with self.assertRaisesRegex(SyntaxError, msg): + exec(code, {}, {}) + + def test_named_expression_invalid_rebinding_set_comprehension_inner_loop(self): + cases = [ + ("Inner reuse", 'j', "{i for i in range(5) if (j := 0) for j in range(5)}"), + ("Inner unpacking reuse", 'j', "{i for i in range(5) if (j := 0) for j, k in {(0, 1)}}"), + ] + for case, target, code in cases: + msg = f"comprehension inner loop cannot rebind assignment expression target '{target}'" + with self.subTest(case=case): + with self.assertRaisesRegex(SyntaxError, msg): + exec(code, {}) # Module scope + with self.assertRaisesRegex(SyntaxError, msg): + exec(code, {}, {}) # Class scope + with self.assertRaisesRegex(SyntaxError, msg): + exec(f"lambda: {code}", {}) # Function scope + + def test_named_expression_invalid_set_comprehension_iterable_expression(self): + cases = [ + ("Top level", "{i for i in (i := range(5))}"), + ("Inside tuple", "{i for i in (2, 3, i := range(5))}"), + ("Inside list", "{i for i in {2, 3, i := range(5)}}"), + ("Different name", "{i for i in (j := range(5))}"), + ("Lambda expression", "{i for i in (lambda:(j := range(5)))()}"), + ("Inner loop", "{i for i in range(5) for j in (i := range(5))}"), + ("Nested comprehension", "{i for i in {j for j in (k := range(5))}}"), + ("Nested comprehension condition", "{i for i in {j for j in range(5) if (j := True)}}"), + ("Nested comprehension body", "{i for i in {(j := True) for j in range(5)}}"), + ] + msg = "assignment expression cannot be used in a comprehension iterable expression" + for case, code in cases: + with self.subTest(case=case): + with self.assertRaisesRegex(SyntaxError, msg): + exec(code, {}) # Module scope + with self.assertRaisesRegex(SyntaxError, msg): + exec(code, {}, {}) # Class scope + with self.assertRaisesRegex(SyntaxError, msg): + exec(f"lambda: {code}", {}) # Function scope + class NamedExpressionAssignmentTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-23-45-56.bpo-42381.G4AWxL.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-23-45-56.bpo-42381.G4AWxL.rst new file mode 100644 index 00000000000000..5bee5141f6cbcd --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-23-45-56.bpo-42381.G4AWxL.rst @@ -0,0 +1,2 @@ +Allow assignment expressions in set literals and set comprehensions as per +PEP 572. Patch by Pablo Galindo. diff --git a/Parser/parser.c b/Parser/parser.c index 2f6d68f41e8b91..f469c8f0e49a8a 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -125,265 +125,262 @@ static KeywordToken *reserved_keywords[] = { #define class_def_type 1056 #define class_def_raw_type 1057 #define block_type 1058 -#define expressions_list_type 1059 -#define star_expressions_type 1060 -#define star_expression_type 1061 -#define star_named_expressions_type 1062 -#define star_named_expression_type 1063 -#define named_expression_type 1064 -#define annotated_rhs_type 1065 -#define expressions_type 1066 -#define expression_type 1067 -#define lambdef_type 1068 -#define lambda_params_type 1069 -#define lambda_parameters_type 1070 -#define lambda_slash_no_default_type 1071 -#define lambda_slash_with_default_type 1072 -#define lambda_star_etc_type 1073 -#define lambda_kwds_type 1074 -#define lambda_param_no_default_type 1075 -#define lambda_param_with_default_type 1076 -#define lambda_param_maybe_default_type 1077 -#define lambda_param_type 1078 -#define disjunction_type 1079 -#define conjunction_type 1080 -#define inversion_type 1081 -#define comparison_type 1082 -#define compare_op_bitwise_or_pair_type 1083 -#define eq_bitwise_or_type 1084 -#define noteq_bitwise_or_type 1085 -#define lte_bitwise_or_type 1086 -#define lt_bitwise_or_type 1087 -#define gte_bitwise_or_type 1088 -#define gt_bitwise_or_type 1089 -#define notin_bitwise_or_type 1090 -#define in_bitwise_or_type 1091 -#define isnot_bitwise_or_type 1092 -#define is_bitwise_or_type 1093 -#define bitwise_or_type 1094 // Left-recursive -#define bitwise_xor_type 1095 // Left-recursive -#define bitwise_and_type 1096 // Left-recursive -#define shift_expr_type 1097 // Left-recursive -#define sum_type 1098 // Left-recursive -#define term_type 1099 // Left-recursive -#define factor_type 1100 -#define power_type 1101 -#define await_primary_type 1102 -#define primary_type 1103 // Left-recursive -#define slices_type 1104 -#define slice_type 1105 -#define atom_type 1106 -#define strings_type 1107 -#define list_type 1108 -#define listcomp_type 1109 -#define tuple_type 1110 -#define group_type 1111 -#define genexp_type 1112 -#define set_type 1113 -#define setcomp_type 1114 -#define dict_type 1115 -#define dictcomp_type 1116 -#define double_starred_kvpairs_type 1117 -#define double_starred_kvpair_type 1118 -#define kvpair_type 1119 -#define for_if_clauses_type 1120 -#define for_if_clause_type 1121 -#define yield_expr_type 1122 -#define arguments_type 1123 -#define args_type 1124 -#define kwargs_type 1125 -#define starred_expression_type 1126 -#define kwarg_or_starred_type 1127 -#define kwarg_or_double_starred_type 1128 -#define star_targets_type 1129 -#define star_targets_seq_type 1130 -#define star_target_type 1131 -#define star_atom_type 1132 -#define single_target_type 1133 -#define single_subscript_attribute_target_type 1134 -#define del_targets_type 1135 -#define del_target_type 1136 -#define del_t_atom_type 1137 -#define targets_type 1138 -#define target_type 1139 -#define t_primary_type 1140 // Left-recursive -#define t_lookahead_type 1141 -#define t_atom_type 1142 -#define invalid_arguments_type 1143 -#define invalid_kwarg_type 1144 -#define invalid_named_expression_type 1145 -#define invalid_assignment_type 1146 -#define invalid_ann_assign_target_type 1147 -#define invalid_del_stmt_type 1148 -#define invalid_block_type 1149 -#define invalid_primary_type 1150 // Left-recursive -#define invalid_comprehension_type 1151 -#define invalid_dict_comprehension_type 1152 -#define invalid_parameters_type 1153 -#define invalid_lambda_parameters_type 1154 -#define invalid_star_etc_type 1155 -#define invalid_lambda_star_etc_type 1156 -#define invalid_double_type_comments_type 1157 -#define invalid_with_item_type 1158 -#define invalid_for_target_type 1159 -#define invalid_group_type 1160 -#define invalid_import_from_targets_type 1161 -#define _loop0_1_type 1162 -#define _loop0_2_type 1163 -#define _loop0_4_type 1164 -#define _gather_3_type 1165 -#define _loop0_6_type 1166 -#define _gather_5_type 1167 -#define _loop0_8_type 1168 -#define _gather_7_type 1169 -#define _loop0_10_type 1170 -#define _gather_9_type 1171 -#define _loop1_11_type 1172 -#define _loop0_13_type 1173 -#define _gather_12_type 1174 -#define _tmp_14_type 1175 -#define _tmp_15_type 1176 -#define _tmp_16_type 1177 -#define _tmp_17_type 1178 -#define _tmp_18_type 1179 -#define _tmp_19_type 1180 -#define _tmp_20_type 1181 -#define _tmp_21_type 1182 -#define _loop1_22_type 1183 -#define _tmp_23_type 1184 -#define _tmp_24_type 1185 -#define _loop0_26_type 1186 -#define _gather_25_type 1187 -#define _loop0_28_type 1188 -#define _gather_27_type 1189 -#define _tmp_29_type 1190 -#define _tmp_30_type 1191 -#define _loop0_31_type 1192 -#define _loop1_32_type 1193 -#define _loop0_34_type 1194 -#define _gather_33_type 1195 -#define _tmp_35_type 1196 -#define _loop0_37_type 1197 -#define _gather_36_type 1198 -#define _tmp_38_type 1199 -#define _loop0_40_type 1200 -#define _gather_39_type 1201 -#define _loop0_42_type 1202 -#define _gather_41_type 1203 -#define _loop0_44_type 1204 -#define _gather_43_type 1205 -#define _loop0_46_type 1206 -#define _gather_45_type 1207 -#define _tmp_47_type 1208 -#define _loop1_48_type 1209 -#define _tmp_49_type 1210 -#define _tmp_50_type 1211 -#define _tmp_51_type 1212 -#define _tmp_52_type 1213 -#define _tmp_53_type 1214 -#define _loop0_54_type 1215 -#define _loop0_55_type 1216 -#define _loop0_56_type 1217 -#define _loop1_57_type 1218 -#define _loop0_58_type 1219 -#define _loop1_59_type 1220 -#define _loop1_60_type 1221 -#define _loop1_61_type 1222 -#define _loop0_62_type 1223 -#define _loop1_63_type 1224 -#define _loop0_64_type 1225 -#define _loop1_65_type 1226 -#define _loop0_66_type 1227 -#define _loop1_67_type 1228 -#define _loop1_68_type 1229 -#define _tmp_69_type 1230 -#define _loop0_71_type 1231 -#define _gather_70_type 1232 -#define _loop1_72_type 1233 +#define star_expressions_type 1059 +#define star_expression_type 1060 +#define star_named_expressions_type 1061 +#define star_named_expression_type 1062 +#define named_expression_type 1063 +#define annotated_rhs_type 1064 +#define expressions_type 1065 +#define expression_type 1066 +#define lambdef_type 1067 +#define lambda_params_type 1068 +#define lambda_parameters_type 1069 +#define lambda_slash_no_default_type 1070 +#define lambda_slash_with_default_type 1071 +#define lambda_star_etc_type 1072 +#define lambda_kwds_type 1073 +#define lambda_param_no_default_type 1074 +#define lambda_param_with_default_type 1075 +#define lambda_param_maybe_default_type 1076 +#define lambda_param_type 1077 +#define disjunction_type 1078 +#define conjunction_type 1079 +#define inversion_type 1080 +#define comparison_type 1081 +#define compare_op_bitwise_or_pair_type 1082 +#define eq_bitwise_or_type 1083 +#define noteq_bitwise_or_type 1084 +#define lte_bitwise_or_type 1085 +#define lt_bitwise_or_type 1086 +#define gte_bitwise_or_type 1087 +#define gt_bitwise_or_type 1088 +#define notin_bitwise_or_type 1089 +#define in_bitwise_or_type 1090 +#define isnot_bitwise_or_type 1091 +#define is_bitwise_or_type 1092 +#define bitwise_or_type 1093 // Left-recursive +#define bitwise_xor_type 1094 // Left-recursive +#define bitwise_and_type 1095 // Left-recursive +#define shift_expr_type 1096 // Left-recursive +#define sum_type 1097 // Left-recursive +#define term_type 1098 // Left-recursive +#define factor_type 1099 +#define power_type 1100 +#define await_primary_type 1101 +#define primary_type 1102 // Left-recursive +#define slices_type 1103 +#define slice_type 1104 +#define atom_type 1105 +#define strings_type 1106 +#define list_type 1107 +#define listcomp_type 1108 +#define tuple_type 1109 +#define group_type 1110 +#define genexp_type 1111 +#define set_type 1112 +#define setcomp_type 1113 +#define dict_type 1114 +#define dictcomp_type 1115 +#define double_starred_kvpairs_type 1116 +#define double_starred_kvpair_type 1117 +#define kvpair_type 1118 +#define for_if_clauses_type 1119 +#define for_if_clause_type 1120 +#define yield_expr_type 1121 +#define arguments_type 1122 +#define args_type 1123 +#define kwargs_type 1124 +#define starred_expression_type 1125 +#define kwarg_or_starred_type 1126 +#define kwarg_or_double_starred_type 1127 +#define star_targets_type 1128 +#define star_targets_seq_type 1129 +#define star_target_type 1130 +#define star_atom_type 1131 +#define single_target_type 1132 +#define single_subscript_attribute_target_type 1133 +#define del_targets_type 1134 +#define del_target_type 1135 +#define del_t_atom_type 1136 +#define targets_type 1137 +#define target_type 1138 +#define t_primary_type 1139 // Left-recursive +#define t_lookahead_type 1140 +#define t_atom_type 1141 +#define invalid_arguments_type 1142 +#define invalid_kwarg_type 1143 +#define invalid_named_expression_type 1144 +#define invalid_assignment_type 1145 +#define invalid_ann_assign_target_type 1146 +#define invalid_del_stmt_type 1147 +#define invalid_block_type 1148 +#define invalid_primary_type 1149 // Left-recursive +#define invalid_comprehension_type 1150 +#define invalid_dict_comprehension_type 1151 +#define invalid_parameters_type 1152 +#define invalid_lambda_parameters_type 1153 +#define invalid_star_etc_type 1154 +#define invalid_lambda_star_etc_type 1155 +#define invalid_double_type_comments_type 1156 +#define invalid_with_item_type 1157 +#define invalid_for_target_type 1158 +#define invalid_group_type 1159 +#define invalid_import_from_targets_type 1160 +#define _loop0_1_type 1161 +#define _loop0_2_type 1162 +#define _loop0_4_type 1163 +#define _gather_3_type 1164 +#define _loop0_6_type 1165 +#define _gather_5_type 1166 +#define _loop0_8_type 1167 +#define _gather_7_type 1168 +#define _loop0_10_type 1169 +#define _gather_9_type 1170 +#define _loop1_11_type 1171 +#define _loop0_13_type 1172 +#define _gather_12_type 1173 +#define _tmp_14_type 1174 +#define _tmp_15_type 1175 +#define _tmp_16_type 1176 +#define _tmp_17_type 1177 +#define _tmp_18_type 1178 +#define _tmp_19_type 1179 +#define _tmp_20_type 1180 +#define _tmp_21_type 1181 +#define _loop1_22_type 1182 +#define _tmp_23_type 1183 +#define _tmp_24_type 1184 +#define _loop0_26_type 1185 +#define _gather_25_type 1186 +#define _loop0_28_type 1187 +#define _gather_27_type 1188 +#define _tmp_29_type 1189 +#define _tmp_30_type 1190 +#define _loop0_31_type 1191 +#define _loop1_32_type 1192 +#define _loop0_34_type 1193 +#define _gather_33_type 1194 +#define _tmp_35_type 1195 +#define _loop0_37_type 1196 +#define _gather_36_type 1197 +#define _tmp_38_type 1198 +#define _loop0_40_type 1199 +#define _gather_39_type 1200 +#define _loop0_42_type 1201 +#define _gather_41_type 1202 +#define _loop0_44_type 1203 +#define _gather_43_type 1204 +#define _loop0_46_type 1205 +#define _gather_45_type 1206 +#define _tmp_47_type 1207 +#define _loop1_48_type 1208 +#define _tmp_49_type 1209 +#define _tmp_50_type 1210 +#define _tmp_51_type 1211 +#define _tmp_52_type 1212 +#define _tmp_53_type 1213 +#define _loop0_54_type 1214 +#define _loop0_55_type 1215 +#define _loop0_56_type 1216 +#define _loop1_57_type 1217 +#define _loop0_58_type 1218 +#define _loop1_59_type 1219 +#define _loop1_60_type 1220 +#define _loop1_61_type 1221 +#define _loop0_62_type 1222 +#define _loop1_63_type 1223 +#define _loop0_64_type 1224 +#define _loop1_65_type 1225 +#define _loop0_66_type 1226 +#define _loop1_67_type 1227 +#define _loop1_68_type 1228 +#define _tmp_69_type 1229 +#define _loop1_70_type 1230 +#define _loop0_72_type 1231 +#define _gather_71_type 1232 +#define _loop1_73_type 1233 #define _loop0_74_type 1234 -#define _gather_73_type 1235 -#define _loop1_75_type 1236 -#define _loop0_76_type 1237 -#define _loop0_77_type 1238 -#define _loop0_78_type 1239 -#define _loop1_79_type 1240 -#define _loop0_80_type 1241 -#define _loop1_81_type 1242 -#define _loop1_82_type 1243 -#define _loop1_83_type 1244 -#define _loop0_84_type 1245 -#define _loop1_85_type 1246 -#define _loop0_86_type 1247 -#define _loop1_87_type 1248 -#define _loop0_88_type 1249 -#define _loop1_89_type 1250 -#define _loop1_90_type 1251 -#define _loop1_91_type 1252 -#define _loop1_92_type 1253 -#define _tmp_93_type 1254 -#define _loop0_95_type 1255 -#define _gather_94_type 1256 -#define _tmp_96_type 1257 -#define _tmp_97_type 1258 -#define _tmp_98_type 1259 -#define _tmp_99_type 1260 -#define _loop1_100_type 1261 -#define _tmp_101_type 1262 -#define _tmp_102_type 1263 +#define _loop0_75_type 1235 +#define _loop0_76_type 1236 +#define _loop1_77_type 1237 +#define _loop0_78_type 1238 +#define _loop1_79_type 1239 +#define _loop1_80_type 1240 +#define _loop1_81_type 1241 +#define _loop0_82_type 1242 +#define _loop1_83_type 1243 +#define _loop0_84_type 1244 +#define _loop1_85_type 1245 +#define _loop0_86_type 1246 +#define _loop1_87_type 1247 +#define _loop1_88_type 1248 +#define _loop1_89_type 1249 +#define _loop1_90_type 1250 +#define _tmp_91_type 1251 +#define _loop0_93_type 1252 +#define _gather_92_type 1253 +#define _tmp_94_type 1254 +#define _tmp_95_type 1255 +#define _tmp_96_type 1256 +#define _tmp_97_type 1257 +#define _loop1_98_type 1258 +#define _tmp_99_type 1259 +#define _tmp_100_type 1260 +#define _loop0_102_type 1261 +#define _gather_101_type 1262 +#define _loop1_103_type 1263 #define _loop0_104_type 1264 -#define _gather_103_type 1265 -#define _loop1_105_type 1266 -#define _loop0_106_type 1267 -#define _loop0_107_type 1268 -#define _loop0_109_type 1269 -#define _gather_108_type 1270 -#define _tmp_110_type 1271 -#define _loop0_112_type 1272 -#define _gather_111_type 1273 -#define _loop0_114_type 1274 -#define _gather_113_type 1275 -#define _loop0_116_type 1276 -#define _gather_115_type 1277 -#define _loop0_118_type 1278 -#define _gather_117_type 1279 -#define _loop0_119_type 1280 -#define _loop0_121_type 1281 -#define _gather_120_type 1282 -#define _tmp_122_type 1283 -#define _loop0_124_type 1284 -#define _gather_123_type 1285 +#define _loop0_105_type 1265 +#define _loop0_107_type 1266 +#define _gather_106_type 1267 +#define _tmp_108_type 1268 +#define _loop0_110_type 1269 +#define _gather_109_type 1270 +#define _loop0_112_type 1271 +#define _gather_111_type 1272 +#define _loop0_114_type 1273 +#define _gather_113_type 1274 +#define _loop0_116_type 1275 +#define _gather_115_type 1276 +#define _loop0_117_type 1277 +#define _loop0_119_type 1278 +#define _gather_118_type 1279 +#define _tmp_120_type 1280 +#define _loop0_122_type 1281 +#define _gather_121_type 1282 +#define _loop0_124_type 1283 +#define _gather_123_type 1284 +#define _tmp_125_type 1285 #define _loop0_126_type 1286 -#define _gather_125_type 1287 -#define _tmp_127_type 1288 -#define _loop0_128_type 1289 -#define _loop0_129_type 1290 -#define _loop0_130_type 1291 -#define _tmp_131_type 1292 -#define _tmp_132_type 1293 -#define _loop0_133_type 1294 -#define _tmp_134_type 1295 -#define _loop0_135_type 1296 -#define _tmp_136_type 1297 -#define _tmp_137_type 1298 -#define _tmp_138_type 1299 -#define _tmp_139_type 1300 -#define _tmp_140_type 1301 -#define _tmp_141_type 1302 -#define _tmp_142_type 1303 -#define _tmp_143_type 1304 -#define _tmp_144_type 1305 -#define _tmp_145_type 1306 -#define _tmp_146_type 1307 -#define _tmp_147_type 1308 -#define _tmp_148_type 1309 -#define _tmp_149_type 1310 -#define _tmp_150_type 1311 -#define _tmp_151_type 1312 -#define _tmp_152_type 1313 -#define _loop1_153_type 1314 -#define _loop1_154_type 1315 -#define _tmp_155_type 1316 -#define _tmp_156_type 1317 +#define _loop0_127_type 1287 +#define _loop0_128_type 1288 +#define _tmp_129_type 1289 +#define _tmp_130_type 1290 +#define _loop0_131_type 1291 +#define _tmp_132_type 1292 +#define _loop0_133_type 1293 +#define _tmp_134_type 1294 +#define _tmp_135_type 1295 +#define _tmp_136_type 1296 +#define _tmp_137_type 1297 +#define _tmp_138_type 1298 +#define _tmp_139_type 1299 +#define _tmp_140_type 1300 +#define _tmp_141_type 1301 +#define _tmp_142_type 1302 +#define _tmp_143_type 1303 +#define _tmp_144_type 1304 +#define _tmp_145_type 1305 +#define _tmp_146_type 1306 +#define _tmp_147_type 1307 +#define _tmp_148_type 1308 +#define _tmp_149_type 1309 +#define _tmp_150_type 1310 +#define _loop1_151_type 1311 +#define _loop1_152_type 1312 +#define _tmp_153_type 1313 +#define _tmp_154_type 1314 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -444,7 +441,6 @@ static asdl_expr_seq* decorators_rule(Parser *p); static stmt_ty class_def_rule(Parser *p); static stmt_ty class_def_raw_rule(Parser *p); static asdl_stmt_seq* block_rule(Parser *p); -static asdl_expr_seq* expressions_list_rule(Parser *p); static expr_ty star_expressions_rule(Parser *p); static expr_ty star_expression_rule(Parser *p); static asdl_expr_seq* star_named_expressions_rule(Parser *p); @@ -616,72 +612,72 @@ static asdl_seq *_loop0_66_rule(Parser *p); static asdl_seq *_loop1_67_rule(Parser *p); static asdl_seq *_loop1_68_rule(Parser *p); static void *_tmp_69_rule(Parser *p); -static asdl_seq *_loop0_71_rule(Parser *p); -static asdl_seq *_gather_70_rule(Parser *p); -static asdl_seq *_loop1_72_rule(Parser *p); +static asdl_seq *_loop1_70_rule(Parser *p); +static asdl_seq *_loop0_72_rule(Parser *p); +static asdl_seq *_gather_71_rule(Parser *p); +static asdl_seq *_loop1_73_rule(Parser *p); static asdl_seq *_loop0_74_rule(Parser *p); -static asdl_seq *_gather_73_rule(Parser *p); -static asdl_seq *_loop1_75_rule(Parser *p); +static asdl_seq *_loop0_75_rule(Parser *p); static asdl_seq *_loop0_76_rule(Parser *p); -static asdl_seq *_loop0_77_rule(Parser *p); +static asdl_seq *_loop1_77_rule(Parser *p); static asdl_seq *_loop0_78_rule(Parser *p); static asdl_seq *_loop1_79_rule(Parser *p); -static asdl_seq *_loop0_80_rule(Parser *p); +static asdl_seq *_loop1_80_rule(Parser *p); static asdl_seq *_loop1_81_rule(Parser *p); -static asdl_seq *_loop1_82_rule(Parser *p); +static asdl_seq *_loop0_82_rule(Parser *p); static asdl_seq *_loop1_83_rule(Parser *p); static asdl_seq *_loop0_84_rule(Parser *p); static asdl_seq *_loop1_85_rule(Parser *p); static asdl_seq *_loop0_86_rule(Parser *p); static asdl_seq *_loop1_87_rule(Parser *p); -static asdl_seq *_loop0_88_rule(Parser *p); +static asdl_seq *_loop1_88_rule(Parser *p); static asdl_seq *_loop1_89_rule(Parser *p); static asdl_seq *_loop1_90_rule(Parser *p); -static asdl_seq *_loop1_91_rule(Parser *p); -static asdl_seq *_loop1_92_rule(Parser *p); -static void *_tmp_93_rule(Parser *p); -static asdl_seq *_loop0_95_rule(Parser *p); -static asdl_seq *_gather_94_rule(Parser *p); +static void *_tmp_91_rule(Parser *p); +static asdl_seq *_loop0_93_rule(Parser *p); +static asdl_seq *_gather_92_rule(Parser *p); +static void *_tmp_94_rule(Parser *p); +static void *_tmp_95_rule(Parser *p); static void *_tmp_96_rule(Parser *p); static void *_tmp_97_rule(Parser *p); -static void *_tmp_98_rule(Parser *p); +static asdl_seq *_loop1_98_rule(Parser *p); static void *_tmp_99_rule(Parser *p); -static asdl_seq *_loop1_100_rule(Parser *p); -static void *_tmp_101_rule(Parser *p); -static void *_tmp_102_rule(Parser *p); +static void *_tmp_100_rule(Parser *p); +static asdl_seq *_loop0_102_rule(Parser *p); +static asdl_seq *_gather_101_rule(Parser *p); +static asdl_seq *_loop1_103_rule(Parser *p); static asdl_seq *_loop0_104_rule(Parser *p); -static asdl_seq *_gather_103_rule(Parser *p); -static asdl_seq *_loop1_105_rule(Parser *p); -static asdl_seq *_loop0_106_rule(Parser *p); +static asdl_seq *_loop0_105_rule(Parser *p); static asdl_seq *_loop0_107_rule(Parser *p); -static asdl_seq *_loop0_109_rule(Parser *p); -static asdl_seq *_gather_108_rule(Parser *p); -static void *_tmp_110_rule(Parser *p); +static asdl_seq *_gather_106_rule(Parser *p); +static void *_tmp_108_rule(Parser *p); +static asdl_seq *_loop0_110_rule(Parser *p); +static asdl_seq *_gather_109_rule(Parser *p); static asdl_seq *_loop0_112_rule(Parser *p); static asdl_seq *_gather_111_rule(Parser *p); static asdl_seq *_loop0_114_rule(Parser *p); static asdl_seq *_gather_113_rule(Parser *p); static asdl_seq *_loop0_116_rule(Parser *p); static asdl_seq *_gather_115_rule(Parser *p); -static asdl_seq *_loop0_118_rule(Parser *p); -static asdl_seq *_gather_117_rule(Parser *p); +static asdl_seq *_loop0_117_rule(Parser *p); static asdl_seq *_loop0_119_rule(Parser *p); -static asdl_seq *_loop0_121_rule(Parser *p); -static asdl_seq *_gather_120_rule(Parser *p); -static void *_tmp_122_rule(Parser *p); +static asdl_seq *_gather_118_rule(Parser *p); +static void *_tmp_120_rule(Parser *p); +static asdl_seq *_loop0_122_rule(Parser *p); +static asdl_seq *_gather_121_rule(Parser *p); static asdl_seq *_loop0_124_rule(Parser *p); static asdl_seq *_gather_123_rule(Parser *p); +static void *_tmp_125_rule(Parser *p); static asdl_seq *_loop0_126_rule(Parser *p); -static asdl_seq *_gather_125_rule(Parser *p); -static void *_tmp_127_rule(Parser *p); +static asdl_seq *_loop0_127_rule(Parser *p); static asdl_seq *_loop0_128_rule(Parser *p); -static asdl_seq *_loop0_129_rule(Parser *p); -static asdl_seq *_loop0_130_rule(Parser *p); -static void *_tmp_131_rule(Parser *p); +static void *_tmp_129_rule(Parser *p); +static void *_tmp_130_rule(Parser *p); +static asdl_seq *_loop0_131_rule(Parser *p); static void *_tmp_132_rule(Parser *p); static asdl_seq *_loop0_133_rule(Parser *p); static void *_tmp_134_rule(Parser *p); -static asdl_seq *_loop0_135_rule(Parser *p); +static void *_tmp_135_rule(Parser *p); static void *_tmp_136_rule(Parser *p); static void *_tmp_137_rule(Parser *p); static void *_tmp_138_rule(Parser *p); @@ -697,12 +693,10 @@ static void *_tmp_147_rule(Parser *p); static void *_tmp_148_rule(Parser *p); static void *_tmp_149_rule(Parser *p); static void *_tmp_150_rule(Parser *p); -static void *_tmp_151_rule(Parser *p); -static void *_tmp_152_rule(Parser *p); -static asdl_seq *_loop1_153_rule(Parser *p); -static asdl_seq *_loop1_154_rule(Parser *p); -static void *_tmp_155_rule(Parser *p); -static void *_tmp_156_rule(Parser *p); +static asdl_seq *_loop1_151_rule(Parser *p); +static asdl_seq *_loop1_152_rule(Parser *p); +static void *_tmp_153_rule(Parser *p); +static void *_tmp_154_rule(Parser *p); // file: statements? $ @@ -6334,51 +6328,6 @@ block_rule(Parser *p) return _res; } -// expressions_list: ','.star_expression+ ','? -static asdl_expr_seq* -expressions_list_rule(Parser *p) -{ - D(p->level++); - if (p->error_indicator) { - D(p->level--); - return NULL; - } - asdl_expr_seq* _res = NULL; - int _mark = p->mark; - { // ','.star_expression+ ','? - if (p->error_indicator) { - D(p->level--); - return NULL; - } - D(fprintf(stderr, "%*c> expressions_list[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.star_expression+ ','?")); - void *_opt_var; - UNUSED(_opt_var); // Silence compiler warnings - asdl_expr_seq* a; - if ( - (a = (asdl_expr_seq*)_gather_70_rule(p)) // ','.star_expression+ - && - (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? - ) - { - D(fprintf(stderr, "%*c+ expressions_list[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.star_expression+ ','?")); - _res = a; - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - D(p->level--); - return NULL; - } - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s expressions_list[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.star_expression+ ','?")); - } - _res = NULL; - done: - D(p->level--); - return _res; -} - // star_expressions: // | star_expression ((',' star_expression))+ ','? // | star_expression ',' @@ -6415,7 +6364,7 @@ star_expressions_rule(Parser *p) if ( (a = star_expression_rule(p)) // star_expression && - (b = _loop1_72_rule(p)) // ((',' star_expression))+ + (b = _loop1_70_rule(p)) // ((',' star_expression))+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -6610,7 +6559,7 @@ star_named_expressions_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_73_rule(p)) // ','.star_named_expression+ + (a = (asdl_expr_seq*)_gather_71_rule(p)) // ','.star_named_expression+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -6915,7 +6864,7 @@ expressions_rule(Parser *p) if ( (a = expression_rule(p)) // expression && - (b = _loop1_75_rule(p)) // ((',' expression))+ + (b = _loop1_73_rule(p)) // ((',' expression))+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -7269,9 +7218,9 @@ lambda_parameters_rule(Parser *p) if ( (a = lambda_slash_no_default_rule(p)) // lambda_slash_no_default && - (b = (asdl_arg_seq*)_loop0_76_rule(p)) // lambda_param_no_default* + (b = (asdl_arg_seq*)_loop0_74_rule(p)) // lambda_param_no_default* && - (c = _loop0_77_rule(p)) // lambda_param_with_default* + (c = _loop0_75_rule(p)) // lambda_param_with_default* && (d = lambda_star_etc_rule(p), 1) // lambda_star_etc? ) @@ -7301,7 +7250,7 @@ lambda_parameters_rule(Parser *p) if ( (a = lambda_slash_with_default_rule(p)) // lambda_slash_with_default && - (b = _loop0_78_rule(p)) // lambda_param_with_default* + (b = _loop0_76_rule(p)) // lambda_param_with_default* && (c = lambda_star_etc_rule(p), 1) // lambda_star_etc? ) @@ -7329,9 +7278,9 @@ lambda_parameters_rule(Parser *p) asdl_seq * b; void *c; if ( - (a = (asdl_arg_seq*)_loop1_79_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_77_rule(p)) // lambda_param_no_default+ && - (b = _loop0_80_rule(p)) // lambda_param_with_default* + (b = _loop0_78_rule(p)) // lambda_param_with_default* && (c = lambda_star_etc_rule(p), 1) // lambda_star_etc? ) @@ -7358,7 +7307,7 @@ lambda_parameters_rule(Parser *p) asdl_seq * a; void *b; if ( - (a = _loop1_81_rule(p)) // lambda_param_with_default+ + (a = _loop1_79_rule(p)) // lambda_param_with_default+ && (b = lambda_star_etc_rule(p), 1) // lambda_star_etc? ) @@ -7429,7 +7378,7 @@ lambda_slash_no_default_rule(Parser *p) Token * _literal_1; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_82_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_80_rule(p)) // lambda_param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -7458,7 +7407,7 @@ lambda_slash_no_default_rule(Parser *p) Token * _literal; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_83_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_81_rule(p)) // lambda_param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -7508,9 +7457,9 @@ lambda_slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_84_rule(p)) // lambda_param_no_default* + (a = _loop0_82_rule(p)) // lambda_param_no_default* && - (b = _loop1_85_rule(p)) // lambda_param_with_default+ + (b = _loop1_83_rule(p)) // lambda_param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -7540,9 +7489,9 @@ lambda_slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_86_rule(p)) // lambda_param_no_default* + (a = _loop0_84_rule(p)) // lambda_param_no_default* && - (b = _loop1_87_rule(p)) // lambda_param_with_default+ + (b = _loop1_85_rule(p)) // lambda_param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -7598,7 +7547,7 @@ lambda_star_etc_rule(Parser *p) && (a = lambda_param_no_default_rule(p)) // lambda_param_no_default && - (b = _loop0_88_rule(p)) // lambda_param_maybe_default* + (b = _loop0_86_rule(p)) // lambda_param_maybe_default* && (c = lambda_kwds_rule(p), 1) // lambda_kwds? ) @@ -7631,7 +7580,7 @@ lambda_star_etc_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _loop1_89_rule(p)) // lambda_param_maybe_default+ + (b = _loop1_87_rule(p)) // lambda_param_maybe_default+ && (c = lambda_kwds_rule(p), 1) // lambda_kwds? ) @@ -8058,7 +8007,7 @@ disjunction_rule(Parser *p) if ( (a = conjunction_rule(p)) // conjunction && - (b = _loop1_90_rule(p)) // (('or' conjunction))+ + (b = _loop1_88_rule(p)) // (('or' conjunction))+ ) { D(fprintf(stderr, "%*c+ disjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "conjunction (('or' conjunction))+")); @@ -8144,7 +8093,7 @@ conjunction_rule(Parser *p) if ( (a = inversion_rule(p)) // inversion && - (b = _loop1_91_rule(p)) // (('and' inversion))+ + (b = _loop1_89_rule(p)) // (('and' inversion))+ ) { D(fprintf(stderr, "%*c+ conjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "inversion (('and' inversion))+")); @@ -8312,7 +8261,7 @@ comparison_rule(Parser *p) if ( (a = bitwise_or_rule(p)) // bitwise_or && - (b = _loop1_92_rule(p)) // compare_op_bitwise_or_pair+ + (b = _loop1_90_rule(p)) // compare_op_bitwise_or_pair+ ) { D(fprintf(stderr, "%*c+ comparison[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or compare_op_bitwise_or_pair+")); @@ -8640,10 +8589,10 @@ noteq_bitwise_or_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> noteq_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('!=') bitwise_or")); - void *_tmp_93_var; + void *_tmp_91_var; expr_ty a; if ( - (_tmp_93_var = _tmp_93_rule(p)) // '!=' + (_tmp_91_var = _tmp_91_rule(p)) // '!=' && (a = bitwise_or_rule(p)) // bitwise_or ) @@ -10606,7 +10555,7 @@ slices_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_94_rule(p)) // ','.slice+ + (a = (asdl_expr_seq*)_gather_92_rule(p)) // ','.slice+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -10676,7 +10625,7 @@ slice_rule(Parser *p) && (b = expression_rule(p), 1) // expression? && - (c = _tmp_96_rule(p), 1) // [':' expression?] + (c = _tmp_94_rule(p), 1) // [':' expression?] ) { D(fprintf(stderr, "%*c+ slice[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression? ':' expression? [':' expression?]")); @@ -10925,15 +10874,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); - void *_tmp_97_var; + void *_tmp_95_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 7) // token='(' && - (_tmp_97_var = _tmp_97_rule(p)) // tuple | group | genexp + (_tmp_95_var = _tmp_95_rule(p)) // tuple | group | genexp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); - _res = _tmp_97_var; + _res = _tmp_95_var; goto done; } p->mark = _mark; @@ -10946,15 +10895,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); - void *_tmp_98_var; + void *_tmp_96_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 9) // token='[' && - (_tmp_98_var = _tmp_98_rule(p)) // list | listcomp + (_tmp_96_var = _tmp_96_rule(p)) // list | listcomp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); - _res = _tmp_98_var; + _res = _tmp_96_var; goto done; } p->mark = _mark; @@ -10967,15 +10916,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); - void *_tmp_99_var; + void *_tmp_97_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 25) // token='{' && - (_tmp_99_var = _tmp_99_rule(p)) // dict | set | dictcomp | setcomp + (_tmp_97_var = _tmp_97_rule(p)) // dict | set | dictcomp | setcomp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); - _res = _tmp_99_var; + _res = _tmp_97_var; goto done; } p->mark = _mark; @@ -11044,7 +10993,7 @@ strings_rule(Parser *p) D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING+")); asdl_seq * a; if ( - (a = _loop1_100_rule(p)) // STRING+ + (a = _loop1_98_rule(p)) // STRING+ ) { D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "STRING+")); @@ -11258,7 +11207,7 @@ tuple_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _tmp_101_rule(p), 1) // [star_named_expression ',' star_named_expressions?] + (a = _tmp_99_rule(p), 1) // [star_named_expression ',' star_named_expressions?] && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) @@ -11314,7 +11263,7 @@ group_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _tmp_102_rule(p)) // yield_expr | named_expression + (a = _tmp_100_rule(p)) // yield_expr | named_expression && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) @@ -11451,7 +11400,7 @@ genexp_rule(Parser *p) return _res; } -// set: '{' expressions_list '}' +// set: '{' star_named_expressions '}' static expr_ty set_rule(Parser *p) { @@ -11471,24 +11420,24 @@ set_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // '{' expressions_list '}' + { // '{' star_named_expressions '}' if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> set[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' expressions_list '}'")); + D(fprintf(stderr, "%*c> set[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' star_named_expressions '}'")); Token * _literal; Token * _literal_1; asdl_expr_seq* a; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && - (a = expressions_list_rule(p)) // expressions_list + (a = star_named_expressions_rule(p)) // star_named_expressions && (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ set[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' expressions_list '}'")); + D(fprintf(stderr, "%*c+ set[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' star_named_expressions '}'")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -11508,7 +11457,7 @@ set_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s set[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' expressions_list '}'")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' star_named_expressions '}'")); } _res = NULL; done: @@ -11516,7 +11465,7 @@ set_rule(Parser *p) return _res; } -// setcomp: '{' expression ~ for_if_clauses '}' | invalid_comprehension +// setcomp: '{' named_expression ~ for_if_clauses '}' | invalid_comprehension static expr_ty setcomp_rule(Parser *p) { @@ -11536,12 +11485,12 @@ setcomp_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // '{' expression ~ for_if_clauses '}' + { // '{' named_expression ~ for_if_clauses '}' if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> setcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' expression ~ for_if_clauses '}'")); + D(fprintf(stderr, "%*c> setcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' named_expression ~ for_if_clauses '}'")); int _cut_var = 0; Token * _literal; Token * _literal_1; @@ -11550,7 +11499,7 @@ setcomp_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' && - (a = expression_rule(p)) // expression + (a = named_expression_rule(p)) // named_expression && (_cut_var = 1) && @@ -11559,7 +11508,7 @@ setcomp_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ setcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' expression ~ for_if_clauses '}'")); + D(fprintf(stderr, "%*c+ setcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' named_expression ~ for_if_clauses '}'")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -11579,7 +11528,7 @@ setcomp_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s setcomp[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' expression ~ for_if_clauses '}'")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' named_expression ~ for_if_clauses '}'")); if (_cut_var) { D(p->level--); return NULL; @@ -11783,7 +11732,7 @@ double_starred_kvpairs_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_seq * a; if ( - (a = _gather_103_rule(p)) // ','.double_starred_kvpair+ + (a = _gather_101_rule(p)) // ','.double_starred_kvpair+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -11936,7 +11885,7 @@ for_if_clauses_rule(Parser *p) D(fprintf(stderr, "%*c> for_if_clauses[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); asdl_comprehension_seq* a; if ( - (a = (asdl_comprehension_seq*)_loop1_105_rule(p)) // for_if_clause+ + (a = (asdl_comprehension_seq*)_loop1_103_rule(p)) // for_if_clause+ ) { D(fprintf(stderr, "%*c+ for_if_clauses[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); @@ -11998,7 +11947,7 @@ for_if_clause_rule(Parser *p) && (b = disjunction_rule(p)) // disjunction && - (c = (asdl_expr_seq*)_loop0_106_rule(p)) // (('if' disjunction))* + (c = (asdl_expr_seq*)_loop0_104_rule(p)) // (('if' disjunction))* ) { D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); @@ -12041,7 +11990,7 @@ for_if_clause_rule(Parser *p) && (b = disjunction_rule(p)) // disjunction && - (c = (asdl_expr_seq*)_loop0_107_rule(p)) // (('if' disjunction))* + (c = (asdl_expr_seq*)_loop0_105_rule(p)) // (('if' disjunction))* ) { D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); @@ -12287,9 +12236,9 @@ args_rule(Parser *p) asdl_expr_seq* a; void *b; if ( - (a = (asdl_expr_seq*)_gather_108_rule(p)) // ','.(starred_expression | named_expression !'=')+ + (a = (asdl_expr_seq*)_gather_106_rule(p)) // ','.(starred_expression | named_expression !'=')+ && - (b = _tmp_110_rule(p), 1) // [',' kwargs] + (b = _tmp_108_rule(p), 1) // [',' kwargs] ) { D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); @@ -12377,11 +12326,11 @@ kwargs_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _gather_111_rule(p)) // ','.kwarg_or_starred+ + (a = _gather_109_rule(p)) // ','.kwarg_or_starred+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _gather_113_rule(p)) // ','.kwarg_or_double_starred+ + (b = _gather_111_rule(p)) // ','.kwarg_or_double_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+")); @@ -12403,13 +12352,13 @@ kwargs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); - asdl_seq * _gather_115_var; + asdl_seq * _gather_113_var; if ( - (_gather_115_var = _gather_115_rule(p)) // ','.kwarg_or_starred+ + (_gather_113_var = _gather_113_rule(p)) // ','.kwarg_or_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); - _res = _gather_115_var; + _res = _gather_113_var; goto done; } p->mark = _mark; @@ -12422,13 +12371,13 @@ kwargs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); - asdl_seq * _gather_117_var; + asdl_seq * _gather_115_var; if ( - (_gather_117_var = _gather_117_rule(p)) // ','.kwarg_or_double_starred+ + (_gather_115_var = _gather_115_rule(p)) // ','.kwarg_or_double_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); - _res = _gather_117_var; + _res = _gather_115_var; goto done; } p->mark = _mark; @@ -12790,7 +12739,7 @@ star_targets_rule(Parser *p) if ( (a = star_target_rule(p)) // star_target && - (b = _loop0_119_rule(p)) // ((',' star_target))* + (b = _loop0_117_rule(p)) // ((',' star_target))* && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -12844,7 +12793,7 @@ star_targets_seq_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_120_rule(p)) // ','.star_target+ + (a = (asdl_expr_seq*)_gather_118_rule(p)) // ','.star_target+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -12907,7 +12856,7 @@ star_target_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (a = _tmp_122_rule(p)) // !'*' star_target + (a = _tmp_120_rule(p)) // !'*' star_target ) { D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (!'*' star_target)")); @@ -13429,7 +13378,7 @@ del_targets_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_123_rule(p)) // ','.del_target+ + (a = (asdl_expr_seq*)_gather_121_rule(p)) // ','.del_target+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -13770,7 +13719,7 @@ targets_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_125_rule(p)) // ','.target+ + (a = (asdl_expr_seq*)_gather_123_rule(p)) // ','.target+ && (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? ) @@ -14484,7 +14433,7 @@ invalid_arguments_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_opt_var = _tmp_127_rule(p), 1) // [args | expression for_if_clauses] + (_opt_var = _tmp_125_rule(p), 1) // [args | expression for_if_clauses] ) { D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); @@ -14742,7 +14691,7 @@ invalid_assignment_rule(Parser *p) D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); Token * _literal; Token * _literal_1; - asdl_seq * _loop0_128_var; + asdl_seq * _loop0_126_var; expr_ty a; expr_ty expression_var; if ( @@ -14750,7 +14699,7 @@ invalid_assignment_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_loop0_128_var = _loop0_128_rule(p)) // star_named_expressions* + (_loop0_126_var = _loop0_126_rule(p)) // star_named_expressions* && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -14807,10 +14756,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* star_expressions '='")); Token * _literal; - asdl_seq * _loop0_129_var; + asdl_seq * _loop0_127_var; expr_ty a; if ( - (_loop0_129_var = _loop0_129_rule(p)) // ((star_targets '='))* + (_loop0_127_var = _loop0_127_rule(p)) // ((star_targets '='))* && (a = star_expressions_rule(p)) // star_expressions && @@ -14837,10 +14786,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* yield_expr '='")); Token * _literal; - asdl_seq * _loop0_130_var; + asdl_seq * _loop0_128_var; expr_ty a; if ( - (_loop0_130_var = _loop0_130_rule(p)) // ((star_targets '='))* + (_loop0_128_var = _loop0_128_rule(p)) // ((star_targets '='))* && (a = yield_expr_rule(p)) // yield_expr && @@ -14866,7 +14815,7 @@ invalid_assignment_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); - void *_tmp_131_var; + void *_tmp_129_var; expr_ty a; AugOperator* augassign_var; if ( @@ -14874,7 +14823,7 @@ invalid_assignment_rule(Parser *p) && (augassign_var = augassign_rule(p)) // augassign && - (_tmp_131_var = _tmp_131_rule(p)) // yield_expr | star_expressions + (_tmp_129_var = _tmp_129_rule(p)) // yield_expr | star_expressions ) { D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); @@ -15130,11 +15079,11 @@ invalid_comprehension_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); - void *_tmp_132_var; + void *_tmp_130_var; expr_ty a; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_132_var = _tmp_132_rule(p)) // '[' | '(' | '{' + (_tmp_130_var = _tmp_130_rule(p)) // '[' | '(' | '{' && (a = starred_expression_rule(p)) // starred_expression && @@ -15231,13 +15180,13 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* (slash_with_default | param_with_default+) param_no_default")); - asdl_seq * _loop0_133_var; - void *_tmp_134_var; + asdl_seq * _loop0_131_var; + void *_tmp_132_var; arg_ty param_no_default_var; if ( - (_loop0_133_var = _loop0_133_rule(p)) // param_no_default* + (_loop0_131_var = _loop0_131_rule(p)) // param_no_default* && - (_tmp_134_var = _tmp_134_rule(p)) // slash_with_default | param_with_default+ + (_tmp_132_var = _tmp_132_rule(p)) // slash_with_default | param_with_default+ && (param_no_default_var = param_no_default_rule(p)) // param_no_default ) @@ -15279,13 +15228,13 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default")); - asdl_seq * _loop0_135_var; - void *_tmp_136_var; + asdl_seq * _loop0_133_var; + void *_tmp_134_var; arg_ty lambda_param_no_default_var; if ( - (_loop0_135_var = _loop0_135_rule(p)) // lambda_param_no_default* + (_loop0_133_var = _loop0_133_rule(p)) // lambda_param_no_default* && - (_tmp_136_var = _tmp_136_rule(p)) // lambda_slash_with_default | lambda_param_with_default+ + (_tmp_134_var = _tmp_134_rule(p)) // lambda_slash_with_default | lambda_param_with_default+ && (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) @@ -15327,11 +15276,11 @@ invalid_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); Token * _literal; - void *_tmp_137_var; + void *_tmp_135_var; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_137_var = _tmp_137_rule(p)) // ')' | ',' (')' | '**') + (_tmp_135_var = _tmp_135_rule(p)) // ')' | ',' (')' | '**') ) { D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); @@ -15401,11 +15350,11 @@ invalid_lambda_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); Token * _literal; - void *_tmp_138_var; + void *_tmp_136_var; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_138_var = _tmp_138_rule(p)) // ':' | ',' (':' | '**') + (_tmp_136_var = _tmp_136_rule(p)) // ':' | ',' (':' | '**') ) { D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); @@ -16914,12 +16863,12 @@ _loop1_22_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_139_var; + void *_tmp_137_var; while ( - (_tmp_139_var = _tmp_139_rule(p)) // star_targets '=' + (_tmp_137_var = _tmp_137_rule(p)) // star_targets '=' ) { - _res = _tmp_139_var; + _res = _tmp_137_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17422,12 +17371,12 @@ _loop0_31_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_140_var; + void *_tmp_138_var; while ( - (_tmp_140_var = _tmp_140_rule(p)) // '.' | '...' + (_tmp_138_var = _tmp_138_rule(p)) // '.' | '...' ) { - _res = _tmp_140_var; + _res = _tmp_138_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17488,12 +17437,12 @@ _loop1_32_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_141_var; + void *_tmp_139_var; while ( - (_tmp_141_var = _tmp_141_rule(p)) // '.' | '...' + (_tmp_139_var = _tmp_139_rule(p)) // '.' | '...' ) { - _res = _tmp_141_var; + _res = _tmp_139_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19650,12 +19599,12 @@ _loop1_68_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); - void *_tmp_142_var; + void *_tmp_140_var; while ( - (_tmp_142_var = _tmp_142_rule(p)) // '@' named_expression NEWLINE + (_tmp_140_var = _tmp_140_rule(p)) // '@' named_expression NEWLINE ) { - _res = _tmp_142_var; + _res = _tmp_140_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19741,123 +19690,9 @@ _tmp_69_rule(Parser *p) return _res; } -// _loop0_71: ',' star_expression +// _loop1_70: (',' star_expression) static asdl_seq * -_loop0_71_rule(Parser *p) -{ - D(p->level++); - if (p->error_indicator) { - D(p->level--); - return NULL; - } - void *_res = NULL; - int _mark = p->mark; - int _start_mark = p->mark; - void **_children = PyMem_Malloc(sizeof(void *)); - if (!_children) { - p->error_indicator = 1; - PyErr_NoMemory(); - D(p->level--); - return NULL; - } - ssize_t _children_capacity = 1; - ssize_t _n = 0; - { // ',' star_expression - if (p->error_indicator) { - D(p->level--); - return NULL; - } - D(fprintf(stderr, "%*c> _loop0_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); - Token * _literal; - expr_ty elem; - while ( - (_literal = _PyPegen_expect_token(p, 12)) // token=',' - && - (elem = star_expression_rule(p)) // star_expression - ) - { - _res = elem; - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - PyMem_Free(_children); - D(p->level--); - return NULL; - } - if (_n == _children_capacity) { - _children_capacity *= 2; - void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); - if (!_new_children) { - p->error_indicator = 1; - PyErr_NoMemory(); - D(p->level--); - return NULL; - } - _children = _new_children; - } - _children[_n++] = _res; - _mark = p->mark; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_71[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); - } - asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); - if (!_seq) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - D(p->level--); - return NULL; - } - for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); - PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_71_type, _seq); - D(p->level--); - return _seq; -} - -// _gather_70: star_expression _loop0_71 -static asdl_seq * -_gather_70_rule(Parser *p) -{ - D(p->level++); - if (p->error_indicator) { - D(p->level--); - return NULL; - } - asdl_seq * _res = NULL; - int _mark = p->mark; - { // star_expression _loop0_71 - if (p->error_indicator) { - D(p->level--); - return NULL; - } - D(fprintf(stderr, "%*c> _gather_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expression _loop0_71")); - expr_ty elem; - asdl_seq * seq; - if ( - (elem = star_expression_rule(p)) // star_expression - && - (seq = _loop0_71_rule(p)) // _loop0_71 - ) - { - D(fprintf(stderr, "%*c+ _gather_70[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expression _loop0_71")); - _res = _PyPegen_seq_insert_in_front(p, elem, seq); - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_70[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expression _loop0_71")); - } - _res = NULL; - done: - D(p->level--); - return _res; -} - -// _loop1_72: (',' star_expression) -static asdl_seq * -_loop1_72_rule(Parser *p) +_loop1_70_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -19881,13 +19716,13 @@ _loop1_72_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); - void *_tmp_143_var; + D(fprintf(stderr, "%*c> _loop1_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); + void *_tmp_141_var; while ( - (_tmp_143_var = _tmp_143_rule(p)) // ',' star_expression + (_tmp_141_var = _tmp_141_rule(p)) // ',' star_expression ) { - _res = _tmp_143_var; + _res = _tmp_141_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19903,7 +19738,7 @@ _loop1_72_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_72[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_70[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_expression)")); } if (_n == 0 || p->error_indicator) { @@ -19921,14 +19756,14 @@ _loop1_72_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_72_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_70_type, _seq); D(p->level--); return _seq; } -// _loop0_74: ',' star_named_expression +// _loop0_72: ',' star_named_expression static asdl_seq * -_loop0_74_rule(Parser *p) +_loop0_72_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -19952,7 +19787,7 @@ _loop0_74_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_74[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); + D(fprintf(stderr, "%*c> _loop0_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); Token * _literal; expr_ty elem; while ( @@ -19983,7 +19818,7 @@ _loop0_74_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_74[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_72[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -19996,14 +19831,14 @@ _loop0_74_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_74_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_72_type, _seq); D(p->level--); return _seq; } -// _gather_73: star_named_expression _loop0_74 +// _gather_71: star_named_expression _loop0_72 static asdl_seq * -_gather_73_rule(Parser *p) +_gather_71_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20012,27 +19847,27 @@ _gather_73_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // star_named_expression _loop0_74 + { // star_named_expression _loop0_72 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_74")); + D(fprintf(stderr, "%*c> _gather_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_72")); expr_ty elem; asdl_seq * seq; if ( (elem = star_named_expression_rule(p)) // star_named_expression && - (seq = _loop0_74_rule(p)) // _loop0_74 + (seq = _loop0_72_rule(p)) // _loop0_72 ) { - D(fprintf(stderr, "%*c+ _gather_73[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_74")); + D(fprintf(stderr, "%*c+ _gather_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_72")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_73[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_74")); + D(fprintf(stderr, "%*c%s _gather_71[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_72")); } _res = NULL; done: @@ -20040,9 +19875,9 @@ _gather_73_rule(Parser *p) return _res; } -// _loop1_75: (',' expression) +// _loop1_73: (',' expression) static asdl_seq * -_loop1_75_rule(Parser *p) +_loop1_73_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20066,13 +19901,13 @@ _loop1_75_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); - void *_tmp_144_var; + D(fprintf(stderr, "%*c> _loop1_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); + void *_tmp_142_var; while ( - (_tmp_144_var = _tmp_144_rule(p)) // ',' expression + (_tmp_142_var = _tmp_142_rule(p)) // ',' expression ) { - _res = _tmp_144_var; + _res = _tmp_142_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -20088,7 +19923,7 @@ _loop1_75_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_75[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_73[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' expression)")); } if (_n == 0 || p->error_indicator) { @@ -20106,14 +19941,14 @@ _loop1_75_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_75_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_73_type, _seq); D(p->level--); return _seq; } -// _loop0_76: lambda_param_no_default +// _loop0_74: lambda_param_no_default static asdl_seq * -_loop0_76_rule(Parser *p) +_loop0_74_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20137,7 +19972,7 @@ _loop0_76_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_74[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -20159,7 +19994,7 @@ _loop0_76_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_76[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_74[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -20172,14 +20007,14 @@ _loop0_76_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_76_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_74_type, _seq); D(p->level--); return _seq; } -// _loop0_77: lambda_param_with_default +// _loop0_75: lambda_param_with_default static asdl_seq * -_loop0_77_rule(Parser *p) +_loop0_75_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20203,7 +20038,7 @@ _loop0_77_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop0_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -20225,7 +20060,7 @@ _loop0_77_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_77[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_75[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -20238,14 +20073,14 @@ _loop0_77_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_77_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_75_type, _seq); D(p->level--); return _seq; } -// _loop0_78: lambda_param_with_default +// _loop0_76: lambda_param_with_default static asdl_seq * -_loop0_78_rule(Parser *p) +_loop0_76_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20269,7 +20104,7 @@ _loop0_78_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop0_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -20291,7 +20126,7 @@ _loop0_78_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_78[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_76[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -20304,14 +20139,14 @@ _loop0_78_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_78_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_76_type, _seq); D(p->level--); return _seq; } -// _loop1_79: lambda_param_no_default +// _loop1_77: lambda_param_no_default static asdl_seq * -_loop1_79_rule(Parser *p) +_loop1_77_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20335,7 +20170,7 @@ _loop1_79_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop1_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -20357,7 +20192,7 @@ _loop1_79_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_79[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_77[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -20375,14 +20210,14 @@ _loop1_79_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_79_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_77_type, _seq); D(p->level--); return _seq; } -// _loop0_80: lambda_param_with_default +// _loop0_78: lambda_param_with_default static asdl_seq * -_loop0_80_rule(Parser *p) +_loop0_78_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20406,7 +20241,7 @@ _loop0_80_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop0_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -20428,7 +20263,7 @@ _loop0_80_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_80[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_78[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -20441,14 +20276,14 @@ _loop0_80_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_80_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_78_type, _seq); D(p->level--); return _seq; } -// _loop1_81: lambda_param_with_default +// _loop1_79: lambda_param_with_default static asdl_seq * -_loop1_81_rule(Parser *p) +_loop1_79_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20472,7 +20307,7 @@ _loop1_81_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -20494,7 +20329,7 @@ _loop1_81_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_81[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_79[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -20512,14 +20347,14 @@ _loop1_81_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_81_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_79_type, _seq); D(p->level--); return _seq; } -// _loop1_82: lambda_param_no_default +// _loop1_80: lambda_param_no_default static asdl_seq * -_loop1_82_rule(Parser *p) +_loop1_80_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20543,7 +20378,7 @@ _loop1_82_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop1_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -20565,7 +20400,7 @@ _loop1_82_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_82[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_80[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -20583,14 +20418,14 @@ _loop1_82_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_82_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_80_type, _seq); D(p->level--); return _seq; } -// _loop1_83: lambda_param_no_default +// _loop1_81: lambda_param_no_default static asdl_seq * -_loop1_83_rule(Parser *p) +_loop1_81_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20614,7 +20449,7 @@ _loop1_83_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop1_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -20636,7 +20471,7 @@ _loop1_83_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_83[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_81[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -20654,14 +20489,14 @@ _loop1_83_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_83_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_81_type, _seq); D(p->level--); return _seq; } -// _loop0_84: lambda_param_no_default +// _loop0_82: lambda_param_no_default static asdl_seq * -_loop0_84_rule(Parser *p) +_loop0_82_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20685,7 +20520,7 @@ _loop0_84_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -20707,7 +20542,7 @@ _loop0_84_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_84[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_82[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -20720,14 +20555,14 @@ _loop0_84_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_84_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_82_type, _seq); D(p->level--); return _seq; } -// _loop1_85: lambda_param_with_default +// _loop1_83: lambda_param_with_default static asdl_seq * -_loop1_85_rule(Parser *p) +_loop1_83_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20751,7 +20586,7 @@ _loop1_85_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -20773,7 +20608,7 @@ _loop1_85_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_85[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_83[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -20791,14 +20626,14 @@ _loop1_85_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_85_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_83_type, _seq); D(p->level--); return _seq; } -// _loop0_86: lambda_param_no_default +// _loop0_84: lambda_param_no_default static asdl_seq * -_loop0_86_rule(Parser *p) +_loop0_84_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20822,7 +20657,7 @@ _loop0_86_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -20844,7 +20679,7 @@ _loop0_86_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_86[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_84[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -20857,14 +20692,14 @@ _loop0_86_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_86_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_84_type, _seq); D(p->level--); return _seq; } -// _loop1_87: lambda_param_with_default +// _loop1_85: lambda_param_with_default static asdl_seq * -_loop1_87_rule(Parser *p) +_loop1_85_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20888,7 +20723,7 @@ _loop1_87_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -20910,7 +20745,7 @@ _loop1_87_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_87[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_85[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -20928,14 +20763,14 @@ _loop1_87_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_87_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_85_type, _seq); D(p->level--); return _seq; } -// _loop0_88: lambda_param_maybe_default +// _loop0_86: lambda_param_maybe_default static asdl_seq * -_loop0_88_rule(Parser *p) +_loop0_86_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -20959,7 +20794,7 @@ _loop0_88_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -20981,7 +20816,7 @@ _loop0_88_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_88[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_86[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -20994,14 +20829,14 @@ _loop0_88_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_88_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_86_type, _seq); D(p->level--); return _seq; } -// _loop1_89: lambda_param_maybe_default +// _loop1_87: lambda_param_maybe_default static asdl_seq * -_loop1_89_rule(Parser *p) +_loop1_87_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21025,7 +20860,7 @@ _loop1_89_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop1_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -21047,7 +20882,7 @@ _loop1_89_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_89[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_87[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } if (_n == 0 || p->error_indicator) { @@ -21065,14 +20900,14 @@ _loop1_89_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_89_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_87_type, _seq); D(p->level--); return _seq; } -// _loop1_90: ('or' conjunction) +// _loop1_88: ('or' conjunction) static asdl_seq * -_loop1_90_rule(Parser *p) +_loop1_88_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21096,13 +20931,13 @@ _loop1_90_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); - void *_tmp_145_var; + D(fprintf(stderr, "%*c> _loop1_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); + void *_tmp_143_var; while ( - (_tmp_145_var = _tmp_145_rule(p)) // 'or' conjunction + (_tmp_143_var = _tmp_143_rule(p)) // 'or' conjunction ) { - _res = _tmp_145_var; + _res = _tmp_143_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21118,7 +20953,7 @@ _loop1_90_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_90[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_88[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('or' conjunction)")); } if (_n == 0 || p->error_indicator) { @@ -21136,14 +20971,14 @@ _loop1_90_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_90_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_88_type, _seq); D(p->level--); return _seq; } -// _loop1_91: ('and' inversion) +// _loop1_89: ('and' inversion) static asdl_seq * -_loop1_91_rule(Parser *p) +_loop1_89_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21167,13 +21002,13 @@ _loop1_91_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); - void *_tmp_146_var; + D(fprintf(stderr, "%*c> _loop1_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); + void *_tmp_144_var; while ( - (_tmp_146_var = _tmp_146_rule(p)) // 'and' inversion + (_tmp_144_var = _tmp_144_rule(p)) // 'and' inversion ) { - _res = _tmp_146_var; + _res = _tmp_144_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21189,7 +21024,7 @@ _loop1_91_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_91[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_89[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('and' inversion)")); } if (_n == 0 || p->error_indicator) { @@ -21207,14 +21042,14 @@ _loop1_91_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_91_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_89_type, _seq); D(p->level--); return _seq; } -// _loop1_92: compare_op_bitwise_or_pair +// _loop1_90: compare_op_bitwise_or_pair static asdl_seq * -_loop1_92_rule(Parser *p) +_loop1_90_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21238,7 +21073,7 @@ _loop1_92_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compare_op_bitwise_or_pair")); + D(fprintf(stderr, "%*c> _loop1_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compare_op_bitwise_or_pair")); CmpopExprPair* compare_op_bitwise_or_pair_var; while ( (compare_op_bitwise_or_pair_var = compare_op_bitwise_or_pair_rule(p)) // compare_op_bitwise_or_pair @@ -21260,7 +21095,7 @@ _loop1_92_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_92[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_90[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compare_op_bitwise_or_pair")); } if (_n == 0 || p->error_indicator) { @@ -21278,14 +21113,14 @@ _loop1_92_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_92_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_90_type, _seq); D(p->level--); return _seq; } -// _tmp_93: '!=' +// _tmp_91: '!=' static void * -_tmp_93_rule(Parser *p) +_tmp_91_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21299,13 +21134,13 @@ _tmp_93_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='")); + D(fprintf(stderr, "%*c> _tmp_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='")); Token * tok; if ( (tok = _PyPegen_expect_token(p, 28)) // token='!=' ) { - D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='")); + D(fprintf(stderr, "%*c+ _tmp_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='")); _res = _PyPegen_check_barry_as_flufl ( p , tok ) ? NULL : tok; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -21315,7 +21150,7 @@ _tmp_93_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_91[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!='")); } _res = NULL; @@ -21324,9 +21159,9 @@ _tmp_93_rule(Parser *p) return _res; } -// _loop0_95: ',' slice +// _loop0_93: ',' slice static asdl_seq * -_loop0_95_rule(Parser *p) +_loop0_93_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21350,7 +21185,7 @@ _loop0_95_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' slice")); + D(fprintf(stderr, "%*c> _loop0_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' slice")); Token * _literal; expr_ty elem; while ( @@ -21381,7 +21216,7 @@ _loop0_95_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_95[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_93[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' slice")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -21394,14 +21229,14 @@ _loop0_95_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_95_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_93_type, _seq); D(p->level--); return _seq; } -// _gather_94: slice _loop0_95 +// _gather_92: slice _loop0_93 static asdl_seq * -_gather_94_rule(Parser *p) +_gather_92_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21410,27 +21245,27 @@ _gather_94_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // slice _loop0_95 + { // slice _loop0_93 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice _loop0_95")); + D(fprintf(stderr, "%*c> _gather_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice _loop0_93")); expr_ty elem; asdl_seq * seq; if ( (elem = slice_rule(p)) // slice && - (seq = _loop0_95_rule(p)) // _loop0_95 + (seq = _loop0_93_rule(p)) // _loop0_93 ) { - D(fprintf(stderr, "%*c+ _gather_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice _loop0_95")); + D(fprintf(stderr, "%*c+ _gather_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice _loop0_93")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_94[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slice _loop0_95")); + D(fprintf(stderr, "%*c%s _gather_92[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slice _loop0_93")); } _res = NULL; done: @@ -21438,9 +21273,9 @@ _gather_94_rule(Parser *p) return _res; } -// _tmp_96: ':' expression? +// _tmp_94: ':' expression? static void * -_tmp_96_rule(Parser *p) +_tmp_94_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21454,7 +21289,7 @@ _tmp_96_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?")); + D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?")); Token * _literal; void *d; if ( @@ -21463,7 +21298,7 @@ _tmp_96_rule(Parser *p) (d = expression_rule(p), 1) // expression? ) { - D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?")); + D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?")); _res = d; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -21473,7 +21308,7 @@ _tmp_96_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' expression?")); } _res = NULL; @@ -21482,9 +21317,9 @@ _tmp_96_rule(Parser *p) return _res; } -// _tmp_97: tuple | group | genexp +// _tmp_95: tuple | group | genexp static void * -_tmp_97_rule(Parser *p) +_tmp_95_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21498,18 +21333,18 @@ _tmp_97_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); expr_ty tuple_var; if ( (tuple_var = tuple_rule(p)) // tuple ) { - D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); _res = tuple_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); } { // group @@ -21517,18 +21352,18 @@ _tmp_97_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "group")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "group")); expr_ty group_var; if ( (group_var = group_rule(p)) // group ) { - D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "group")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "group")); _res = group_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "group")); } { // genexp @@ -21536,18 +21371,18 @@ _tmp_97_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); expr_ty genexp_var; if ( (genexp_var = genexp_rule(p)) // genexp ) { - D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); _res = genexp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "genexp")); } _res = NULL; @@ -21556,9 +21391,9 @@ _tmp_97_rule(Parser *p) return _res; } -// _tmp_98: list | listcomp +// _tmp_96: list | listcomp static void * -_tmp_98_rule(Parser *p) +_tmp_96_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21572,18 +21407,18 @@ _tmp_98_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); expr_ty list_var; if ( (list_var = list_rule(p)) // list ) { - D(fprintf(stderr, "%*c+ _tmp_98[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); _res = list_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_98[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); } { // listcomp @@ -21591,18 +21426,18 @@ _tmp_98_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "listcomp")); + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "listcomp")); expr_ty listcomp_var; if ( (listcomp_var = listcomp_rule(p)) // listcomp ) { - D(fprintf(stderr, "%*c+ _tmp_98[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "listcomp")); + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "listcomp")); _res = listcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_98[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "listcomp")); } _res = NULL; @@ -21611,9 +21446,9 @@ _tmp_98_rule(Parser *p) return _res; } -// _tmp_99: dict | set | dictcomp | setcomp +// _tmp_97: dict | set | dictcomp | setcomp static void * -_tmp_99_rule(Parser *p) +_tmp_97_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21627,18 +21462,18 @@ _tmp_99_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dict")); + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dict")); expr_ty dict_var; if ( (dict_var = dict_rule(p)) // dict ) { - D(fprintf(stderr, "%*c+ _tmp_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dict")); + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dict")); _res = dict_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_99[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dict")); } { // set @@ -21646,18 +21481,18 @@ _tmp_99_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "set")); + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "set")); expr_ty set_var; if ( (set_var = set_rule(p)) // set ) { - D(fprintf(stderr, "%*c+ _tmp_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "set")); + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "set")); _res = set_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_99[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "set")); } { // dictcomp @@ -21665,18 +21500,18 @@ _tmp_99_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dictcomp")); + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dictcomp")); expr_ty dictcomp_var; if ( (dictcomp_var = dictcomp_rule(p)) // dictcomp ) { - D(fprintf(stderr, "%*c+ _tmp_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dictcomp")); + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dictcomp")); _res = dictcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_99[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dictcomp")); } { // setcomp @@ -21684,18 +21519,18 @@ _tmp_99_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "setcomp")); + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "setcomp")); expr_ty setcomp_var; if ( (setcomp_var = setcomp_rule(p)) // setcomp ) { - D(fprintf(stderr, "%*c+ _tmp_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "setcomp")); + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "setcomp")); _res = setcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_99[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "setcomp")); } _res = NULL; @@ -21704,9 +21539,9 @@ _tmp_99_rule(Parser *p) return _res; } -// _loop1_100: STRING +// _loop1_98: STRING static asdl_seq * -_loop1_100_rule(Parser *p) +_loop1_98_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21730,7 +21565,7 @@ _loop1_100_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); + D(fprintf(stderr, "%*c> _loop1_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); expr_ty string_var; while ( (string_var = _PyPegen_string_token(p)) // STRING @@ -21752,7 +21587,7 @@ _loop1_100_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_100[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_98[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING")); } if (_n == 0 || p->error_indicator) { @@ -21770,14 +21605,14 @@ _loop1_100_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_100_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_98_type, _seq); D(p->level--); return _seq; } -// _tmp_101: star_named_expression ',' star_named_expressions? +// _tmp_99: star_named_expression ',' star_named_expressions? static void * -_tmp_101_rule(Parser *p) +_tmp_99_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21791,7 +21626,7 @@ _tmp_101_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + D(fprintf(stderr, "%*c> _tmp_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); Token * _literal; expr_ty y; void *z; @@ -21803,7 +21638,7 @@ _tmp_101_rule(Parser *p) (z = star_named_expressions_rule(p), 1) // star_named_expressions? ) { - D(fprintf(stderr, "%*c+ _tmp_101[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + D(fprintf(stderr, "%*c+ _tmp_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); _res = _PyPegen_seq_insert_in_front ( p , y , z ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -21813,7 +21648,7 @@ _tmp_101_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_101[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_99[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression ',' star_named_expressions?")); } _res = NULL; @@ -21822,9 +21657,9 @@ _tmp_101_rule(Parser *p) return _res; } -// _tmp_102: yield_expr | named_expression +// _tmp_100: yield_expr | named_expression static void * -_tmp_102_rule(Parser *p) +_tmp_100_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21838,18 +21673,18 @@ _tmp_102_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_102[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_100[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_102[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_100[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // named_expression @@ -21857,18 +21692,18 @@ _tmp_102_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); + D(fprintf(stderr, "%*c> _tmp_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); expr_ty named_expression_var; if ( (named_expression_var = named_expression_rule(p)) // named_expression ) { - D(fprintf(stderr, "%*c+ _tmp_102[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); + D(fprintf(stderr, "%*c+ _tmp_100[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); _res = named_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_102[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_100[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression")); } _res = NULL; @@ -21877,9 +21712,9 @@ _tmp_102_rule(Parser *p) return _res; } -// _loop0_104: ',' double_starred_kvpair +// _loop0_102: ',' double_starred_kvpair static asdl_seq * -_loop0_104_rule(Parser *p) +_loop0_102_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21903,7 +21738,7 @@ _loop0_104_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); + D(fprintf(stderr, "%*c> _loop0_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); Token * _literal; KeyValuePair* elem; while ( @@ -21934,7 +21769,7 @@ _loop0_104_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_104[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_102[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -21947,14 +21782,14 @@ _loop0_104_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_104_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_102_type, _seq); D(p->level--); return _seq; } -// _gather_103: double_starred_kvpair _loop0_104 +// _gather_101: double_starred_kvpair _loop0_102 static asdl_seq * -_gather_103_rule(Parser *p) +_gather_101_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -21963,27 +21798,27 @@ _gather_103_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // double_starred_kvpair _loop0_104 + { // double_starred_kvpair _loop0_102 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_104")); + D(fprintf(stderr, "%*c> _gather_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_102")); KeyValuePair* elem; asdl_seq * seq; if ( (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair && - (seq = _loop0_104_rule(p)) // _loop0_104 + (seq = _loop0_102_rule(p)) // _loop0_102 ) { - D(fprintf(stderr, "%*c+ _gather_103[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_104")); + D(fprintf(stderr, "%*c+ _gather_101[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_102")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_103[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_104")); + D(fprintf(stderr, "%*c%s _gather_101[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_102")); } _res = NULL; done: @@ -21991,9 +21826,9 @@ _gather_103_rule(Parser *p) return _res; } -// _loop1_105: for_if_clause +// _loop1_103: for_if_clause static asdl_seq * -_loop1_105_rule(Parser *p) +_loop1_103_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22017,7 +21852,7 @@ _loop1_105_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause")); + D(fprintf(stderr, "%*c> _loop1_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause")); comprehension_ty for_if_clause_var; while ( (for_if_clause_var = for_if_clause_rule(p)) // for_if_clause @@ -22039,7 +21874,7 @@ _loop1_105_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_105[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_103[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause")); } if (_n == 0 || p->error_indicator) { @@ -22057,14 +21892,14 @@ _loop1_105_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_105_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_103_type, _seq); D(p->level--); return _seq; } -// _loop0_106: ('if' disjunction) +// _loop0_104: ('if' disjunction) static asdl_seq * -_loop0_106_rule(Parser *p) +_loop0_104_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22088,13 +21923,13 @@ _loop0_106_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_147_var; + D(fprintf(stderr, "%*c> _loop0_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); + void *_tmp_145_var; while ( - (_tmp_147_var = _tmp_147_rule(p)) // 'if' disjunction + (_tmp_145_var = _tmp_145_rule(p)) // 'if' disjunction ) { - _res = _tmp_147_var; + _res = _tmp_145_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22110,7 +21945,7 @@ _loop0_106_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_106[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_104[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -22123,14 +21958,14 @@ _loop0_106_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_106_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_104_type, _seq); D(p->level--); return _seq; } -// _loop0_107: ('if' disjunction) +// _loop0_105: ('if' disjunction) static asdl_seq * -_loop0_107_rule(Parser *p) +_loop0_105_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22154,13 +21989,13 @@ _loop0_107_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_148_var; + D(fprintf(stderr, "%*c> _loop0_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); + void *_tmp_146_var; while ( - (_tmp_148_var = _tmp_148_rule(p)) // 'if' disjunction + (_tmp_146_var = _tmp_146_rule(p)) // 'if' disjunction ) { - _res = _tmp_148_var; + _res = _tmp_146_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22176,7 +22011,7 @@ _loop0_107_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_107[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_105[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -22189,14 +22024,14 @@ _loop0_107_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_107_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_105_type, _seq); D(p->level--); return _seq; } -// _loop0_109: ',' (starred_expression | named_expression !'=') +// _loop0_107: ',' (starred_expression | named_expression !'=') static asdl_seq * -_loop0_109_rule(Parser *p) +_loop0_107_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22220,13 +22055,13 @@ _loop0_109_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | named_expression !'=')")); + D(fprintf(stderr, "%*c> _loop0_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | named_expression !'=')")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_147_rule(p)) // starred_expression | named_expression !'=' ) { _res = elem; @@ -22251,7 +22086,7 @@ _loop0_109_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_109[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_107[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | named_expression !'=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -22264,14 +22099,14 @@ _loop0_109_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_109_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_107_type, _seq); D(p->level--); return _seq; } -// _gather_108: (starred_expression | named_expression !'=') _loop0_109 +// _gather_106: (starred_expression | named_expression !'=') _loop0_107 static asdl_seq * -_gather_108_rule(Parser *p) +_gather_106_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22280,27 +22115,27 @@ _gather_108_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (starred_expression | named_expression !'=') _loop0_109 + { // (starred_expression | named_expression !'=') _loop0_107 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_109")); + D(fprintf(stderr, "%*c> _gather_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_107")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_147_rule(p)) // starred_expression | named_expression !'=' && - (seq = _loop0_109_rule(p)) // _loop0_109 + (seq = _loop0_107_rule(p)) // _loop0_107 ) { - D(fprintf(stderr, "%*c+ _gather_108[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_109")); + D(fprintf(stderr, "%*c+ _gather_106[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_107")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_108[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_109")); + D(fprintf(stderr, "%*c%s _gather_106[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_107")); } _res = NULL; done: @@ -22308,9 +22143,9 @@ _gather_108_rule(Parser *p) return _res; } -// _tmp_110: ',' kwargs +// _tmp_108: ',' kwargs static void * -_tmp_110_rule(Parser *p) +_tmp_108_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22324,7 +22159,7 @@ _tmp_110_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + D(fprintf(stderr, "%*c> _tmp_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs")); Token * _literal; asdl_seq* k; if ( @@ -22333,7 +22168,7 @@ _tmp_110_rule(Parser *p) (k = kwargs_rule(p)) // kwargs ) { - D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + D(fprintf(stderr, "%*c+ _tmp_108[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs")); _res = k; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -22343,7 +22178,7 @@ _tmp_110_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_110[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_108[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwargs")); } _res = NULL; @@ -22352,9 +22187,9 @@ _tmp_110_rule(Parser *p) return _res; } -// _loop0_112: ',' kwarg_or_starred +// _loop0_110: ',' kwarg_or_starred static asdl_seq * -_loop0_112_rule(Parser *p) +_loop0_110_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22378,7 +22213,7 @@ _loop0_112_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); + D(fprintf(stderr, "%*c> _loop0_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); Token * _literal; KeywordOrStarred* elem; while ( @@ -22409,7 +22244,7 @@ _loop0_112_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_112[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_110[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -22422,14 +22257,14 @@ _loop0_112_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_112_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_110_type, _seq); D(p->level--); return _seq; } -// _gather_111: kwarg_or_starred _loop0_112 +// _gather_109: kwarg_or_starred _loop0_110 static asdl_seq * -_gather_111_rule(Parser *p) +_gather_109_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22438,27 +22273,27 @@ _gather_111_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_starred _loop0_112 + { // kwarg_or_starred _loop0_110 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_112")); + D(fprintf(stderr, "%*c> _gather_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_110")); KeywordOrStarred* elem; asdl_seq * seq; if ( (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred && - (seq = _loop0_112_rule(p)) // _loop0_112 + (seq = _loop0_110_rule(p)) // _loop0_110 ) { - D(fprintf(stderr, "%*c+ _gather_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_112")); + D(fprintf(stderr, "%*c+ _gather_109[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_110")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_111[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_112")); + D(fprintf(stderr, "%*c%s _gather_109[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_110")); } _res = NULL; done: @@ -22466,9 +22301,9 @@ _gather_111_rule(Parser *p) return _res; } -// _loop0_114: ',' kwarg_or_double_starred +// _loop0_112: ',' kwarg_or_double_starred static asdl_seq * -_loop0_114_rule(Parser *p) +_loop0_112_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22492,7 +22327,7 @@ _loop0_114_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + D(fprintf(stderr, "%*c> _loop0_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); Token * _literal; KeywordOrStarred* elem; while ( @@ -22523,7 +22358,7 @@ _loop0_114_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_114[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_112[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -22536,14 +22371,14 @@ _loop0_114_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_114_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_112_type, _seq); D(p->level--); return _seq; } -// _gather_113: kwarg_or_double_starred _loop0_114 +// _gather_111: kwarg_or_double_starred _loop0_112 static asdl_seq * -_gather_113_rule(Parser *p) +_gather_111_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22552,27 +22387,27 @@ _gather_113_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_double_starred _loop0_114 + { // kwarg_or_double_starred _loop0_112 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_114")); + D(fprintf(stderr, "%*c> _gather_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_112")); KeywordOrStarred* elem; asdl_seq * seq; if ( (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred && - (seq = _loop0_114_rule(p)) // _loop0_114 + (seq = _loop0_112_rule(p)) // _loop0_112 ) { - D(fprintf(stderr, "%*c+ _gather_113[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_114")); + D(fprintf(stderr, "%*c+ _gather_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_112")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_113[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_114")); + D(fprintf(stderr, "%*c%s _gather_111[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_112")); } _res = NULL; done: @@ -22580,9 +22415,9 @@ _gather_113_rule(Parser *p) return _res; } -// _loop0_116: ',' kwarg_or_starred +// _loop0_114: ',' kwarg_or_starred static asdl_seq * -_loop0_116_rule(Parser *p) +_loop0_114_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22606,7 +22441,7 @@ _loop0_116_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); + D(fprintf(stderr, "%*c> _loop0_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); Token * _literal; KeywordOrStarred* elem; while ( @@ -22637,7 +22472,7 @@ _loop0_116_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_116[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_114[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -22650,14 +22485,14 @@ _loop0_116_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_116_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_114_type, _seq); D(p->level--); return _seq; } -// _gather_115: kwarg_or_starred _loop0_116 +// _gather_113: kwarg_or_starred _loop0_114 static asdl_seq * -_gather_115_rule(Parser *p) +_gather_113_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22666,27 +22501,27 @@ _gather_115_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_starred _loop0_116 + { // kwarg_or_starred _loop0_114 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_116")); + D(fprintf(stderr, "%*c> _gather_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_114")); KeywordOrStarred* elem; asdl_seq * seq; if ( (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred && - (seq = _loop0_116_rule(p)) // _loop0_116 + (seq = _loop0_114_rule(p)) // _loop0_114 ) { - D(fprintf(stderr, "%*c+ _gather_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_116")); + D(fprintf(stderr, "%*c+ _gather_113[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_114")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_115[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_116")); + D(fprintf(stderr, "%*c%s _gather_113[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_114")); } _res = NULL; done: @@ -22694,9 +22529,9 @@ _gather_115_rule(Parser *p) return _res; } -// _loop0_118: ',' kwarg_or_double_starred +// _loop0_116: ',' kwarg_or_double_starred static asdl_seq * -_loop0_118_rule(Parser *p) +_loop0_116_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22720,7 +22555,7 @@ _loop0_118_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + D(fprintf(stderr, "%*c> _loop0_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); Token * _literal; KeywordOrStarred* elem; while ( @@ -22751,7 +22586,7 @@ _loop0_118_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_118[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_116[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -22764,14 +22599,14 @@ _loop0_118_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_118_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_116_type, _seq); D(p->level--); return _seq; } -// _gather_117: kwarg_or_double_starred _loop0_118 +// _gather_115: kwarg_or_double_starred _loop0_116 static asdl_seq * -_gather_117_rule(Parser *p) +_gather_115_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22780,27 +22615,27 @@ _gather_117_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_double_starred _loop0_118 + { // kwarg_or_double_starred _loop0_116 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_118")); + D(fprintf(stderr, "%*c> _gather_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_116")); KeywordOrStarred* elem; asdl_seq * seq; if ( (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred && - (seq = _loop0_118_rule(p)) // _loop0_118 + (seq = _loop0_116_rule(p)) // _loop0_116 ) { - D(fprintf(stderr, "%*c+ _gather_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_118")); + D(fprintf(stderr, "%*c+ _gather_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_116")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_117[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_118")); + D(fprintf(stderr, "%*c%s _gather_115[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_116")); } _res = NULL; done: @@ -22808,9 +22643,9 @@ _gather_117_rule(Parser *p) return _res; } -// _loop0_119: (',' star_target) +// _loop0_117: (',' star_target) static asdl_seq * -_loop0_119_rule(Parser *p) +_loop0_117_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22834,13 +22669,13 @@ _loop0_119_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_150_var; + D(fprintf(stderr, "%*c> _loop0_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); + void *_tmp_148_var; while ( - (_tmp_150_var = _tmp_150_rule(p)) // ',' star_target + (_tmp_148_var = _tmp_148_rule(p)) // ',' star_target ) { - _res = _tmp_150_var; + _res = _tmp_148_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22856,7 +22691,7 @@ _loop0_119_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_119[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_117[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -22869,14 +22704,14 @@ _loop0_119_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_119_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_117_type, _seq); D(p->level--); return _seq; } -// _loop0_121: ',' star_target +// _loop0_119: ',' star_target static asdl_seq * -_loop0_121_rule(Parser *p) +_loop0_119_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22900,7 +22735,7 @@ _loop0_121_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _loop0_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty elem; while ( @@ -22931,7 +22766,7 @@ _loop0_121_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_121[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_119[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -22944,14 +22779,14 @@ _loop0_121_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_121_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_119_type, _seq); D(p->level--); return _seq; } -// _gather_120: star_target _loop0_121 +// _gather_118: star_target _loop0_119 static asdl_seq * -_gather_120_rule(Parser *p) +_gather_118_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -22960,27 +22795,27 @@ _gather_120_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // star_target _loop0_121 + { // star_target _loop0_119 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_121")); + D(fprintf(stderr, "%*c> _gather_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_119")); expr_ty elem; asdl_seq * seq; if ( (elem = star_target_rule(p)) // star_target && - (seq = _loop0_121_rule(p)) // _loop0_121 + (seq = _loop0_119_rule(p)) // _loop0_119 ) { - D(fprintf(stderr, "%*c+ _gather_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_121")); + D(fprintf(stderr, "%*c+ _gather_118[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_119")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_120[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_121")); + D(fprintf(stderr, "%*c%s _gather_118[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_119")); } _res = NULL; done: @@ -22988,9 +22823,9 @@ _gather_120_rule(Parser *p) return _res; } -// _tmp_122: !'*' star_target +// _tmp_120: !'*' star_target static void * -_tmp_122_rule(Parser *p) +_tmp_120_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23004,7 +22839,7 @@ _tmp_122_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + D(fprintf(stderr, "%*c> _tmp_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); expr_ty star_target_var; if ( _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 16) // token='*' @@ -23012,12 +22847,12 @@ _tmp_122_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + D(fprintf(stderr, "%*c+ _tmp_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); _res = star_target_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_122[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_120[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "!'*' star_target")); } _res = NULL; @@ -23026,9 +22861,9 @@ _tmp_122_rule(Parser *p) return _res; } -// _loop0_124: ',' del_target +// _loop0_122: ',' del_target static asdl_seq * -_loop0_124_rule(Parser *p) +_loop0_122_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23052,7 +22887,7 @@ _loop0_124_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); + D(fprintf(stderr, "%*c> _loop0_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); Token * _literal; expr_ty elem; while ( @@ -23083,7 +22918,7 @@ _loop0_124_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_124[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_122[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' del_target")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -23096,14 +22931,14 @@ _loop0_124_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_124_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_122_type, _seq); D(p->level--); return _seq; } -// _gather_123: del_target _loop0_124 +// _gather_121: del_target _loop0_122 static asdl_seq * -_gather_123_rule(Parser *p) +_gather_121_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23112,27 +22947,27 @@ _gather_123_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // del_target _loop0_124 + { // del_target _loop0_122 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_124")); + D(fprintf(stderr, "%*c> _gather_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_122")); expr_ty elem; asdl_seq * seq; if ( (elem = del_target_rule(p)) // del_target && - (seq = _loop0_124_rule(p)) // _loop0_124 + (seq = _loop0_122_rule(p)) // _loop0_122 ) { - D(fprintf(stderr, "%*c+ _gather_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_124")); + D(fprintf(stderr, "%*c+ _gather_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_122")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_123[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_124")); + D(fprintf(stderr, "%*c%s _gather_121[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_122")); } _res = NULL; done: @@ -23140,9 +22975,9 @@ _gather_123_rule(Parser *p) return _res; } -// _loop0_126: ',' target +// _loop0_124: ',' target static asdl_seq * -_loop0_126_rule(Parser *p) +_loop0_124_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23166,7 +23001,7 @@ _loop0_126_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' target")); + D(fprintf(stderr, "%*c> _loop0_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' target")); Token * _literal; expr_ty elem; while ( @@ -23197,7 +23032,7 @@ _loop0_126_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_126[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_124[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' target")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -23210,14 +23045,14 @@ _loop0_126_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_126_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_124_type, _seq); D(p->level--); return _seq; } -// _gather_125: target _loop0_126 +// _gather_123: target _loop0_124 static asdl_seq * -_gather_125_rule(Parser *p) +_gather_123_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23226,27 +23061,27 @@ _gather_125_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // target _loop0_126 + { // target _loop0_124 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "target _loop0_126")); + D(fprintf(stderr, "%*c> _gather_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "target _loop0_124")); expr_ty elem; asdl_seq * seq; if ( (elem = target_rule(p)) // target && - (seq = _loop0_126_rule(p)) // _loop0_126 + (seq = _loop0_124_rule(p)) // _loop0_124 ) { - D(fprintf(stderr, "%*c+ _gather_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "target _loop0_126")); + D(fprintf(stderr, "%*c+ _gather_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "target _loop0_124")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_125[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "target _loop0_126")); + D(fprintf(stderr, "%*c%s _gather_123[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "target _loop0_124")); } _res = NULL; done: @@ -23254,9 +23089,9 @@ _gather_125_rule(Parser *p) return _res; } -// _tmp_127: args | expression for_if_clauses +// _tmp_125: args | expression for_if_clauses static void * -_tmp_127_rule(Parser *p) +_tmp_125_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23270,18 +23105,18 @@ _tmp_127_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); + D(fprintf(stderr, "%*c> _tmp_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); expr_ty args_var; if ( (args_var = args_rule(p)) // args ) { - D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); + D(fprintf(stderr, "%*c+ _tmp_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); _res = args_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_125[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args")); } { // expression for_if_clauses @@ -23289,7 +23124,7 @@ _tmp_127_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + D(fprintf(stderr, "%*c> _tmp_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); expr_ty expression_var; asdl_comprehension_seq* for_if_clauses_var; if ( @@ -23298,12 +23133,12 @@ _tmp_127_rule(Parser *p) (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses ) { - D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + D(fprintf(stderr, "%*c+ _tmp_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); _res = _PyPegen_dummy_name(p, expression_var, for_if_clauses_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_125[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression for_if_clauses")); } _res = NULL; @@ -23312,9 +23147,9 @@ _tmp_127_rule(Parser *p) return _res; } -// _loop0_128: star_named_expressions +// _loop0_126: star_named_expressions static asdl_seq * -_loop0_128_rule(Parser *p) +_loop0_126_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23338,7 +23173,7 @@ _loop0_128_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); + D(fprintf(stderr, "%*c> _loop0_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); asdl_expr_seq* star_named_expressions_var; while ( (star_named_expressions_var = star_named_expressions_rule(p)) // star_named_expressions @@ -23360,7 +23195,7 @@ _loop0_128_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_128[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_126[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -23373,14 +23208,14 @@ _loop0_128_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_128_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_126_type, _seq); D(p->level--); return _seq; } -// _loop0_129: (star_targets '=') +// _loop0_127: (star_targets '=') static asdl_seq * -_loop0_129_rule(Parser *p) +_loop0_127_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23404,13 +23239,13 @@ _loop0_129_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_151_var; + D(fprintf(stderr, "%*c> _loop0_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_149_var; while ( - (_tmp_151_var = _tmp_151_rule(p)) // star_targets '=' + (_tmp_149_var = _tmp_149_rule(p)) // star_targets '=' ) { - _res = _tmp_151_var; + _res = _tmp_149_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23426,7 +23261,7 @@ _loop0_129_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_129[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_127[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -23439,14 +23274,14 @@ _loop0_129_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_129_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_127_type, _seq); D(p->level--); return _seq; } -// _loop0_130: (star_targets '=') +// _loop0_128: (star_targets '=') static asdl_seq * -_loop0_130_rule(Parser *p) +_loop0_128_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23470,13 +23305,13 @@ _loop0_130_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_152_var; + D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_150_var; while ( - (_tmp_152_var = _tmp_152_rule(p)) // star_targets '=' + (_tmp_150_var = _tmp_150_rule(p)) // star_targets '=' ) { - _res = _tmp_152_var; + _res = _tmp_150_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23492,7 +23327,7 @@ _loop0_130_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_130[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_128[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -23505,14 +23340,14 @@ _loop0_130_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_130_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_128_type, _seq); D(p->level--); return _seq; } -// _tmp_131: yield_expr | star_expressions +// _tmp_129: yield_expr | star_expressions static void * -_tmp_131_rule(Parser *p) +_tmp_129_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23526,18 +23361,18 @@ _tmp_131_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_129[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_129[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -23545,18 +23380,18 @@ _tmp_131_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_129[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_129[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -23565,9 +23400,9 @@ _tmp_131_rule(Parser *p) return _res; } -// _tmp_132: '[' | '(' | '{' +// _tmp_130: '[' | '(' | '{' static void * -_tmp_132_rule(Parser *p) +_tmp_130_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23581,18 +23416,18 @@ _tmp_132_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_130[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '(' @@ -23600,18 +23435,18 @@ _tmp_132_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c> _tmp_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' ) { - D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c+ _tmp_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_130[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); } { // '{' @@ -23619,18 +23454,18 @@ _tmp_132_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_130[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -23639,9 +23474,9 @@ _tmp_132_rule(Parser *p) return _res; } -// _loop0_133: param_no_default +// _loop0_131: param_no_default static asdl_seq * -_loop0_133_rule(Parser *p) +_loop0_131_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23665,7 +23500,7 @@ _loop0_133_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -23687,7 +23522,7 @@ _loop0_133_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_133[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_131[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -23700,14 +23535,14 @@ _loop0_133_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_133_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_131_type, _seq); D(p->level--); return _seq; } -// _tmp_134: slash_with_default | param_with_default+ +// _tmp_132: slash_with_default | param_with_default+ static void * -_tmp_134_rule(Parser *p) +_tmp_132_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23721,18 +23556,18 @@ _tmp_134_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); SlashWithDefault* slash_with_default_var; if ( (slash_with_default_var = slash_with_default_rule(p)) // slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); _res = slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default")); } { // param_with_default+ @@ -23740,18 +23575,18 @@ _tmp_134_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - asdl_seq * _loop1_153_var; + D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+")); + asdl_seq * _loop1_151_var; if ( - (_loop1_153_var = _loop1_153_rule(p)) // param_with_default+ + (_loop1_151_var = _loop1_151_rule(p)) // param_with_default+ ) { - D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - _res = _loop1_153_var; + D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+")); + _res = _loop1_151_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default+")); } _res = NULL; @@ -23760,9 +23595,9 @@ _tmp_134_rule(Parser *p) return _res; } -// _loop0_135: lambda_param_no_default +// _loop0_133: lambda_param_no_default static asdl_seq * -_loop0_135_rule(Parser *p) +_loop0_133_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23786,7 +23621,7 @@ _loop0_135_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -23808,7 +23643,7 @@ _loop0_135_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_135[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_133[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -23821,14 +23656,14 @@ _loop0_135_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_135_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_133_type, _seq); D(p->level--); return _seq; } -// _tmp_136: lambda_slash_with_default | lambda_param_with_default+ +// _tmp_134: lambda_slash_with_default | lambda_param_with_default+ static void * -_tmp_136_rule(Parser *p) +_tmp_134_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23842,18 +23677,18 @@ _tmp_136_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); SlashWithDefault* lambda_slash_with_default_var; if ( (lambda_slash_with_default_var = lambda_slash_with_default_rule(p)) // lambda_slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); _res = lambda_slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default")); } { // lambda_param_with_default+ @@ -23861,18 +23696,18 @@ _tmp_136_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - asdl_seq * _loop1_154_var; + D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); + asdl_seq * _loop1_152_var; if ( - (_loop1_154_var = _loop1_154_rule(p)) // lambda_param_with_default+ + (_loop1_152_var = _loop1_152_rule(p)) // lambda_param_with_default+ ) { - D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - _res = _loop1_154_var; + D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); + _res = _loop1_152_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default+")); } _res = NULL; @@ -23881,9 +23716,9 @@ _tmp_136_rule(Parser *p) return _res; } -// _tmp_137: ')' | ',' (')' | '**') +// _tmp_135: ')' | ',' (')' | '**') static void * -_tmp_137_rule(Parser *p) +_tmp_135_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23897,18 +23732,18 @@ _tmp_137_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_135[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ',' (')' | '**') @@ -23916,21 +23751,21 @@ _tmp_137_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + D(fprintf(stderr, "%*c> _tmp_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); Token * _literal; - void *_tmp_155_var; + void *_tmp_153_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_155_var = _tmp_155_rule(p)) // ')' | '**' + (_tmp_153_var = _tmp_153_rule(p)) // ')' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_155_var); + D(fprintf(stderr, "%*c+ _tmp_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_153_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_135[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (')' | '**')")); } _res = NULL; @@ -23939,9 +23774,9 @@ _tmp_137_rule(Parser *p) return _res; } -// _tmp_138: ':' | ',' (':' | '**') +// _tmp_136: ':' | ',' (':' | '**') static void * -_tmp_138_rule(Parser *p) +_tmp_136_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23955,18 +23790,18 @@ _tmp_138_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // ',' (':' | '**') @@ -23974,21 +23809,21 @@ _tmp_138_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); Token * _literal; - void *_tmp_156_var; + void *_tmp_154_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_156_var = _tmp_156_rule(p)) // ':' | '**' + (_tmp_154_var = _tmp_154_rule(p)) // ':' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_156_var); + D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_154_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (':' | '**')")); } _res = NULL; @@ -23997,9 +23832,9 @@ _tmp_138_rule(Parser *p) return _res; } -// _tmp_139: star_targets '=' +// _tmp_137: star_targets '=' static void * -_tmp_139_rule(Parser *p) +_tmp_137_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24013,7 +23848,7 @@ _tmp_139_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty z; if ( @@ -24022,7 +23857,7 @@ _tmp_139_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24032,7 +23867,7 @@ _tmp_139_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24041,9 +23876,9 @@ _tmp_139_rule(Parser *p) return _res; } -// _tmp_140: '.' | '...' +// _tmp_138: '.' | '...' static void * -_tmp_140_rule(Parser *p) +_tmp_138_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24057,18 +23892,18 @@ _tmp_140_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -24076,18 +23911,18 @@ _tmp_140_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -24096,9 +23931,9 @@ _tmp_140_rule(Parser *p) return _res; } -// _tmp_141: '.' | '...' +// _tmp_139: '.' | '...' static void * -_tmp_141_rule(Parser *p) +_tmp_139_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24112,18 +23947,18 @@ _tmp_141_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -24131,18 +23966,18 @@ _tmp_141_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -24151,9 +23986,9 @@ _tmp_141_rule(Parser *p) return _res; } -// _tmp_142: '@' named_expression NEWLINE +// _tmp_140: '@' named_expression NEWLINE static void * -_tmp_142_rule(Parser *p) +_tmp_140_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24167,7 +24002,7 @@ _tmp_142_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); Token * _literal; expr_ty f; Token * newline_var; @@ -24179,7 +24014,7 @@ _tmp_142_rule(Parser *p) (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); _res = f; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24189,7 +24024,7 @@ _tmp_142_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_142[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); } _res = NULL; @@ -24198,9 +24033,9 @@ _tmp_142_rule(Parser *p) return _res; } -// _tmp_143: ',' star_expression +// _tmp_141: ',' star_expression static void * -_tmp_143_rule(Parser *p) +_tmp_141_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24214,7 +24049,7 @@ _tmp_143_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); Token * _literal; expr_ty c; if ( @@ -24223,7 +24058,7 @@ _tmp_143_rule(Parser *p) (c = star_expression_rule(p)) // star_expression ) { - D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24233,7 +24068,7 @@ _tmp_143_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } _res = NULL; @@ -24242,9 +24077,9 @@ _tmp_143_rule(Parser *p) return _res; } -// _tmp_144: ',' expression +// _tmp_142: ',' expression static void * -_tmp_144_rule(Parser *p) +_tmp_142_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24258,7 +24093,7 @@ _tmp_144_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty c; if ( @@ -24267,7 +24102,7 @@ _tmp_144_rule(Parser *p) (c = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24277,7 +24112,7 @@ _tmp_144_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_142[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -24286,9 +24121,9 @@ _tmp_144_rule(Parser *p) return _res; } -// _tmp_145: 'or' conjunction +// _tmp_143: 'or' conjunction static void * -_tmp_145_rule(Parser *p) +_tmp_143_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24302,7 +24137,7 @@ _tmp_145_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); Token * _keyword; expr_ty c; if ( @@ -24311,7 +24146,7 @@ _tmp_145_rule(Parser *p) (c = conjunction_rule(p)) // conjunction ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24321,7 +24156,7 @@ _tmp_145_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); } _res = NULL; @@ -24330,9 +24165,9 @@ _tmp_145_rule(Parser *p) return _res; } -// _tmp_146: 'and' inversion +// _tmp_144: 'and' inversion static void * -_tmp_146_rule(Parser *p) +_tmp_144_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24346,7 +24181,7 @@ _tmp_146_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); Token * _keyword; expr_ty c; if ( @@ -24355,7 +24190,7 @@ _tmp_146_rule(Parser *p) (c = inversion_rule(p)) // inversion ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24365,7 +24200,7 @@ _tmp_146_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); } _res = NULL; @@ -24374,9 +24209,9 @@ _tmp_146_rule(Parser *p) return _res; } -// _tmp_147: 'if' disjunction +// _tmp_145: 'if' disjunction static void * -_tmp_147_rule(Parser *p) +_tmp_145_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24390,7 +24225,7 @@ _tmp_147_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -24399,7 +24234,7 @@ _tmp_147_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24409,7 +24244,7 @@ _tmp_147_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -24418,9 +24253,9 @@ _tmp_147_rule(Parser *p) return _res; } -// _tmp_148: 'if' disjunction +// _tmp_146: 'if' disjunction static void * -_tmp_148_rule(Parser *p) +_tmp_146_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24434,7 +24269,7 @@ _tmp_148_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -24443,7 +24278,7 @@ _tmp_148_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24453,7 +24288,7 @@ _tmp_148_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -24462,9 +24297,9 @@ _tmp_148_rule(Parser *p) return _res; } -// _tmp_149: starred_expression | named_expression !'=' +// _tmp_147: starred_expression | named_expression !'=' static void * -_tmp_149_rule(Parser *p) +_tmp_147_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24478,18 +24313,18 @@ _tmp_149_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } { // named_expression !'=' @@ -24497,7 +24332,7 @@ _tmp_149_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); expr_ty named_expression_var; if ( (named_expression_var = named_expression_rule(p)) // named_expression @@ -24505,12 +24340,12 @@ _tmp_149_rule(Parser *p) _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); _res = named_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression !'='")); } _res = NULL; @@ -24519,9 +24354,9 @@ _tmp_149_rule(Parser *p) return _res; } -// _tmp_150: ',' star_target +// _tmp_148: ',' star_target static void * -_tmp_150_rule(Parser *p) +_tmp_148_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24535,7 +24370,7 @@ _tmp_150_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -24544,7 +24379,7 @@ _tmp_150_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24554,7 +24389,7 @@ _tmp_150_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -24563,9 +24398,9 @@ _tmp_150_rule(Parser *p) return _res; } -// _tmp_151: star_targets '=' +// _tmp_149: star_targets '=' static void * -_tmp_151_rule(Parser *p) +_tmp_149_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24579,7 +24414,7 @@ _tmp_151_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -24588,12 +24423,12 @@ _tmp_151_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24602,9 +24437,9 @@ _tmp_151_rule(Parser *p) return _res; } -// _tmp_152: star_targets '=' +// _tmp_150: star_targets '=' static void * -_tmp_152_rule(Parser *p) +_tmp_150_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24618,7 +24453,7 @@ _tmp_152_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -24627,12 +24462,12 @@ _tmp_152_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24641,9 +24476,9 @@ _tmp_152_rule(Parser *p) return _res; } -// _loop1_153: param_with_default +// _loop1_151: param_with_default static asdl_seq * -_loop1_153_rule(Parser *p) +_loop1_151_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24667,7 +24502,7 @@ _loop1_153_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -24689,7 +24524,7 @@ _loop1_153_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -24707,14 +24542,14 @@ _loop1_153_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_153_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_151_type, _seq); D(p->level--); return _seq; } -// _loop1_154: lambda_param_with_default +// _loop1_152: lambda_param_with_default static asdl_seq * -_loop1_154_rule(Parser *p) +_loop1_152_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24738,7 +24573,7 @@ _loop1_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -24760,7 +24595,7 @@ _loop1_154_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_152[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -24778,14 +24613,14 @@ _loop1_154_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_154_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_152_type, _seq); D(p->level--); return _seq; } -// _tmp_155: ')' | '**' +// _tmp_153: ')' | '**' static void * -_tmp_155_rule(Parser *p) +_tmp_153_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24799,18 +24634,18 @@ _tmp_155_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // '**' @@ -24818,18 +24653,18 @@ _tmp_155_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -24838,9 +24673,9 @@ _tmp_155_rule(Parser *p) return _res; } -// _tmp_156: ':' | '**' +// _tmp_154: ':' | '**' static void * -_tmp_156_rule(Parser *p) +_tmp_154_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24854,18 +24689,18 @@ _tmp_156_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '**' @@ -24873,18 +24708,18 @@ _tmp_156_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; From d63532db1a4439588bcaa494ddb26895ae41480a Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Tue, 17 Nov 2020 04:23:19 +0200 Subject: [PATCH 0553/1261] bpo-42345: Fix three issues with typing.Literal parameters (GH-23294) Literal equality no longer depends on the order of arguments. Fix issue related to `typing.Literal` caching by adding `typed` parameter to `typing._tp_cache` function. Add deduplication of `typing.Literal` arguments. --- Lib/test/test_typing.py | 25 +++++ Lib/typing.py | 99 ++++++++++++++----- Misc/ACKS | 1 + .../2020-11-15-15-23-34.bpo-42345.hiIR7x.rst | 2 + 4 files changed, 104 insertions(+), 23 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-15-15-23-34.bpo-42345.hiIR7x.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 2ab8be49b2875a..7deba0d71b7c4f 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -528,6 +528,7 @@ def test_repr(self): self.assertEqual(repr(Literal[int]), "typing.Literal[int]") self.assertEqual(repr(Literal), "typing.Literal") self.assertEqual(repr(Literal[None]), "typing.Literal[None]") + self.assertEqual(repr(Literal[1, 2, 3, 3]), "typing.Literal[1, 2, 3]") def test_cannot_init(self): with self.assertRaises(TypeError): @@ -559,6 +560,30 @@ def test_no_multiple_subscripts(self): with self.assertRaises(TypeError): Literal[1][1] + def test_equal(self): + self.assertNotEqual(Literal[0], Literal[False]) + self.assertNotEqual(Literal[True], Literal[1]) + self.assertNotEqual(Literal[1], Literal[2]) + self.assertNotEqual(Literal[1, True], Literal[1]) + self.assertEqual(Literal[1], Literal[1]) + self.assertEqual(Literal[1, 2], Literal[2, 1]) + self.assertEqual(Literal[1, 2, 3], Literal[1, 2, 3, 3]) + + def test_args(self): + self.assertEqual(Literal[1, 2, 3].__args__, (1, 2, 3)) + self.assertEqual(Literal[1, 2, 3, 3].__args__, (1, 2, 3)) + self.assertEqual(Literal[1, Literal[2], Literal[3, 4]].__args__, (1, 2, 3, 4)) + # Mutable arguments will not be deduplicated + self.assertEqual(Literal[[], []].__args__, ([], [])) + + def test_flatten(self): + l1 = Literal[Literal[1], Literal[2], Literal[3]] + l2 = Literal[Literal[1, 2], 3] + l3 = Literal[Literal[1, 2, 3]] + for l in l1, l2, l3: + self.assertEqual(l, Literal[1, 2, 3]) + self.assertEqual(l.__args__, (1, 2, 3)) + XK = TypeVar('XK', str, bytes) XV = TypeVar('XV') diff --git a/Lib/typing.py b/Lib/typing.py index 3fa97a4a15f954..d310b3dd5820dc 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -202,6 +202,20 @@ def _check_generic(cls, parameters, elen): f" actual {alen}, expected {elen}") +def _deduplicate(params): + # Weed out strict duplicates, preserving the first of each occurrence. + all_params = set(params) + if len(all_params) < len(params): + new_params = [] + for t in params: + if t in all_params: + new_params.append(t) + all_params.remove(t) + params = new_params + assert not all_params, all_params + return params + + def _remove_dups_flatten(parameters): """An internal helper for Union creation and substitution: flatten Unions among parameters, then remove duplicates. @@ -215,38 +229,45 @@ def _remove_dups_flatten(parameters): params.extend(p[1:]) else: params.append(p) - # Weed out strict duplicates, preserving the first of each occurrence. - all_params = set(params) - if len(all_params) < len(params): - new_params = [] - for t in params: - if t in all_params: - new_params.append(t) - all_params.remove(t) - params = new_params - assert not all_params, all_params + + return tuple(_deduplicate(params)) + + +def _flatten_literal_params(parameters): + """An internal helper for Literal creation: flatten Literals among parameters""" + params = [] + for p in parameters: + if isinstance(p, _LiteralGenericAlias): + params.extend(p.__args__) + else: + params.append(p) return tuple(params) _cleanups = [] -def _tp_cache(func): +def _tp_cache(func=None, /, *, typed=False): """Internal wrapper caching __getitem__ of generic types with a fallback to original function for non-hashable arguments. """ - cached = functools.lru_cache()(func) - _cleanups.append(cached.cache_clear) + def decorator(func): + cached = functools.lru_cache(typed=typed)(func) + _cleanups.append(cached.cache_clear) - @functools.wraps(func) - def inner(*args, **kwds): - try: - return cached(*args, **kwds) - except TypeError: - pass # All real errors (not unhashable args) are raised below. - return func(*args, **kwds) - return inner + @functools.wraps(func) + def inner(*args, **kwds): + try: + return cached(*args, **kwds) + except TypeError: + pass # All real errors (not unhashable args) are raised below. + return func(*args, **kwds) + return inner + if func is not None: + return decorator(func) + + return decorator def _eval_type(t, globalns, localns, recursive_guard=frozenset()): """Evaluate all forward references in the given type t. @@ -319,6 +340,13 @@ def __subclasscheck__(self, cls): def __getitem__(self, parameters): return self._getitem(self, parameters) + +class _LiteralSpecialForm(_SpecialForm, _root=True): + @_tp_cache(typed=True) + def __getitem__(self, parameters): + return self._getitem(self, parameters) + + @_SpecialForm def Any(self, parameters): """Special type indicating an unconstrained type. @@ -436,7 +464,7 @@ def Optional(self, parameters): arg = _type_check(parameters, f"{self} requires a single type.") return Union[arg, type(None)] -@_SpecialForm +@_LiteralSpecialForm def Literal(self, parameters): """Special typing form to define literal types (a.k.a. value types). @@ -460,7 +488,17 @@ def open_helper(file: str, mode: MODE) -> str: """ # There is no '_type_check' call because arguments to Literal[...] are # values, not types. - return _GenericAlias(self, parameters) + if not isinstance(parameters, tuple): + parameters = (parameters,) + + parameters = _flatten_literal_params(parameters) + + try: + parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters)))) + except TypeError: # unhashable parameters + pass + + return _LiteralGenericAlias(self, parameters) @_SpecialForm @@ -930,6 +968,21 @@ def __subclasscheck__(self, cls): return True +def _value_and_type_iter(parameters): + return ((p, type(p)) for p in parameters) + + +class _LiteralGenericAlias(_GenericAlias, _root=True): + + def __eq__(self, other): + if not isinstance(other, _LiteralGenericAlias): + return NotImplemented + + return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__)) + + def __hash__(self): + return hash(tuple(_value_and_type_iter(self.__args__))) + class Generic: """Abstract base class for generic types. diff --git a/Misc/ACKS b/Misc/ACKS index 35a87ae6b965da..1d106144d467f9 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -861,6 +861,7 @@ Jan Kanis Rafe Kaplan Jacob Kaplan-Moss Allison Kaptur +Yurii Karabas Janne Karila Per Øyvind Karlsen Anton Kasyanov diff --git a/Misc/NEWS.d/next/Library/2020-11-15-15-23-34.bpo-42345.hiIR7x.rst b/Misc/NEWS.d/next/Library/2020-11-15-15-23-34.bpo-42345.hiIR7x.rst new file mode 100644 index 00000000000000..6339182c3ae727 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-15-15-23-34.bpo-42345.hiIR7x.rst @@ -0,0 +1,2 @@ +Fix various issues with ``typing.Literal`` parameter handling (flatten, +deduplicate, use type to cache key). Patch provided by Yurii Karabas. From b98929699e3ef2de420c0e120975e1267295b3eb Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Tue, 17 Nov 2020 13:52:54 +0100 Subject: [PATCH 0554/1261] bpo-41861, _sqlite3 : Add NEWS entry and rename variables (GH-23337) --- .../2020-10-01-15-44-52.bpo-41861.YTqJ7z.rst | 2 ++ Modules/_sqlite/cache.c | 16 ++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-01-15-44-52.bpo-41861.YTqJ7z.rst diff --git a/Misc/NEWS.d/next/Library/2020-10-01-15-44-52.bpo-41861.YTqJ7z.rst b/Misc/NEWS.d/next/Library/2020-10-01-15-44-52.bpo-41861.YTqJ7z.rst new file mode 100644 index 00000000000000..d34658a254e059 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-01-15-44-52.bpo-41861.YTqJ7z.rst @@ -0,0 +1,2 @@ +Convert :mod:`sqlite3` to use heap types (PEP 384). +Patch by Erlend E. Aasland. diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c index 0b02be4f0bec98..8cedd07b4596df 100644 --- a/Modules/_sqlite/cache.c +++ b/Modules/_sqlite/cache.c @@ -258,17 +258,17 @@ PyObject* pysqlite_cache_display(pysqlite_Cache* self, PyObject* args) Py_RETURN_NONE; } -static PyType_Slot pysqlite_NodeType_slots[] = { +static PyType_Slot node_slots[] = { {Py_tp_dealloc, pysqlite_node_dealloc}, {Py_tp_new, PyType_GenericNew}, {0, NULL}, }; -static PyType_Spec pysqlite_NodeType_spec = { +static PyType_Spec node_spec = { .name = MODULE_NAME ".Node", .basicsize = sizeof(pysqlite_Node), .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .slots = pysqlite_NodeType_slots, + .slots = node_slots, }; PyTypeObject *pysqlite_NodeType = NULL; @@ -280,7 +280,7 @@ static PyMethodDef cache_methods[] = { {NULL, NULL} }; -static PyType_Slot pysqlite_CacheType_slots[] = { +static PyType_Slot cache_slots[] = { {Py_tp_dealloc, pysqlite_cache_dealloc}, {Py_tp_methods, cache_methods}, {Py_tp_new, PyType_GenericNew}, @@ -288,22 +288,22 @@ static PyType_Slot pysqlite_CacheType_slots[] = { {0, NULL}, }; -static PyType_Spec pysqlite_CacheType_spec = { +static PyType_Spec cache_spec = { .name = MODULE_NAME ".Cache", .basicsize = sizeof(pysqlite_Cache), .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .slots = pysqlite_CacheType_slots, + .slots = cache_slots, }; PyTypeObject *pysqlite_CacheType = NULL; extern int pysqlite_cache_setup_types(PyObject *mod) { - pysqlite_NodeType = (PyTypeObject *)PyType_FromModuleAndSpec(mod, &pysqlite_NodeType_spec, NULL); + pysqlite_NodeType = (PyTypeObject *)PyType_FromModuleAndSpec(mod, &node_spec, NULL); if (pysqlite_NodeType == NULL) { return -1; } - pysqlite_CacheType = (PyTypeObject *)PyType_FromModuleAndSpec(mod, &pysqlite_CacheType_spec, NULL); + pysqlite_CacheType = (PyTypeObject *)PyType_FromModuleAndSpec(mod, &cache_spec, NULL); if (pysqlite_CacheType == NULL) { return -1; } From b63770dd64a0c7e71d24e38e81661957b04ac2dd Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Tue, 17 Nov 2020 15:40:35 +0100 Subject: [PATCH 0555/1261] bpo-40637: Don't test builtin PBKDF2 without builtin hashes (GH-20980) Skip testing of pure Python PBKDF2 when one or more builtin hash module is not available. Otherwise the import of hashlib prints noise on stderr. Signed-off-by: Christian Heimes --- Lib/test/test_hashlib.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py index 4551011f5ca9ef..f50a4559269d78 100644 --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -26,17 +26,26 @@ # Were we compiled --with-pydebug or with #define Py_DEBUG? COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount') -c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib']) -py_hashlib = import_fresh_module('hashlib', blocked=['_hashlib']) - +# default builtin hash module +default_builtin_hashes = {'md5', 'sha1', 'sha256', 'sha512', 'sha3', 'blake2'} +# --with-builtin-hashlib-hashes override builtin_hashes = sysconfig.get_config_var("PY_BUILTIN_HASHLIB_HASHES") if builtin_hashes is None: - builtin_hashes = {'md5', 'sha1', 'sha256', 'sha512', 'sha3', 'blake2'} + builtin_hashes = default_builtin_hashes else: builtin_hashes = { m.strip() for m in builtin_hashes.strip('"').lower().split(",") } +# hashlib with and without OpenSSL backend for PBKDF2 +# only import builtin_hashlib when all builtin hashes are available. +# Otherwise import prints noise on stderr +openssl_hashlib = import_fresh_module('hashlib', fresh=['_hashlib']) +if builtin_hashes == default_builtin_hashes: + builtin_hashlib = import_fresh_module('hashlib', blocked=['_hashlib']) +else: + builtin_hashlib = None + try: from _hashlib import HASH, HASHXOF, openssl_md_meth_names except ImportError: @@ -1032,16 +1041,16 @@ def _test_pbkdf2_hmac(self, pbkdf2, supported): iterations=1, dklen=None) self.assertEqual(out, self.pbkdf2_results['sha1'][0][0]) + @unittest.skipIf(builtin_hashlib is None, "test requires builtin_hashlib") def test_pbkdf2_hmac_py(self): - self._test_pbkdf2_hmac(py_hashlib.pbkdf2_hmac, builtin_hashes) + self._test_pbkdf2_hmac(builtin_hashlib.pbkdf2_hmac, builtin_hashes) - @unittest.skipUnless(hasattr(c_hashlib, 'pbkdf2_hmac'), + @unittest.skipUnless(hasattr(openssl_hashlib, 'pbkdf2_hmac'), ' test requires OpenSSL > 1.0') def test_pbkdf2_hmac_c(self): - self._test_pbkdf2_hmac(c_hashlib.pbkdf2_hmac, openssl_md_meth_names) - + self._test_pbkdf2_hmac(openssl_hashlib.pbkdf2_hmac, openssl_md_meth_names) - @unittest.skipUnless(hasattr(c_hashlib, 'scrypt'), + @unittest.skipUnless(hasattr(hashlib, 'scrypt'), ' test requires OpenSSL > 1.1') def test_scrypt(self): for password, salt, n, r, p, expected in self.scrypt_test_vectors: From e45225e27ba78c1794c8d738d9b5f9a10151f9f6 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 17 Nov 2020 16:22:23 +0100 Subject: [PATCH 0556/1261] bpo-41713: Remove PyOS_InitInterrupts() function (GH-23342) Remove the undocumented PyOS_InitInterrupts() C function. * Rename PyOS_InitInterrupts() to _PySignal_Init(). It now installs other signal handlers, not only SIGINT. * Rename PyOS_FiniInterrupts() to _PySignal_Fini() --- Doc/whatsnew/3.10.rst | 5 +++ Include/internal/pycore_pylifecycle.h | 3 +- Include/intrcheck.h | 1 - .../2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst | 3 ++ Modules/signalmodule.c | 37 +++++++++++++------ Python/pylifecycle.c | 29 ++------------- 6 files changed, 38 insertions(+), 40 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 25b736ec325bad..ffc34d773570f6 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -583,3 +583,8 @@ Removed ``Py_END_ALLOW_RECURSION`` and the ``recursion_critical`` field of the :c:type:`PyInterpreterState` structure. (Contributed by Serhiy Storchaka in :issue:`41936`.) + +* Removed the undocumented ``PyOS_InitInterrupts()`` function. Initializing + Python already implicitly installs signal handlers: see + :c:member:`PyConfig.install_signal_handlers`. + (Contributed by Victor Stinner in :issue:`41713`.) diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index e748112cbf7fe1..b691e6325780ed 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -68,7 +68,8 @@ extern void _PyFloat_Fini(PyThreadState *tstate); extern void _PySlice_Fini(PyThreadState *tstate); extern void _PyAsyncGen_Fini(PyThreadState *tstate); -extern void PyOS_FiniInterrupts(void); +extern int _PySignal_Init(int install_signal_handlers); +extern void _PySignal_Fini(void); extern void _PyExc_Fini(PyThreadState *tstate); extern void _PyImport_Fini(void); diff --git a/Include/intrcheck.h b/Include/intrcheck.h index 88f2a7076ce379..b8cc65601683cb 100644 --- a/Include/intrcheck.h +++ b/Include/intrcheck.h @@ -5,7 +5,6 @@ extern "C" { #endif PyAPI_FUNC(int) PyOS_InterruptOccurred(void); -PyAPI_FUNC(void) PyOS_InitInterrupts(void); #ifdef HAVE_FORK #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 PyAPI_FUNC(void) PyOS_BeforeFork(void); diff --git a/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst b/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst new file mode 100644 index 00000000000000..5373595aa08b97 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst @@ -0,0 +1,3 @@ +Removed the undocumented ``PyOS_InitInterrupts()`` function. Initializing +Python already implicitly installs signal handlers: see +:c:member:`PyConfig.install_signal_handlers`. Patch by Victor Stinner. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 0ab3a71b180994..c0b211749aaded 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1674,8 +1674,8 @@ PyInit__signal(void) } -static void -finisignal(void) +void +_PySignal_Fini(void) { int i; PyObject *func; @@ -1792,19 +1792,32 @@ PyErr_SetInterrupt(void) } } -void -PyOS_InitInterrupts(void) +int +_PySignal_Init(int install_signal_handlers) { - PyObject *m = PyImport_ImportModule("_signal"); - if (m) { - Py_DECREF(m); + if (!install_signal_handlers) { + // Nothing to do + return 0; } -} -void -PyOS_FiniInterrupts(void) -{ - finisignal(); +#ifdef SIGPIPE + PyOS_setsig(SIGPIPE, SIG_IGN); +#endif +#ifdef SIGXFZ + PyOS_setsig(SIGXFZ, SIG_IGN); +#endif +#ifdef SIGXFSZ + PyOS_setsig(SIGXFSZ, SIG_IGN); +#endif + + // Import _signal to install the Python SIGINT handler + PyObject *module = PyImport_ImportModule("_signal"); + if (!module) { + return -1; + } + Py_DECREF(module); + + return 0; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 33deafbc0a215f..77a18e17e07ead 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -54,7 +54,6 @@ static PyStatus add_main_module(PyInterpreterState *interp); static PyStatus init_import_site(void); static PyStatus init_set_builtins_open(void); static PyStatus init_sys_streams(PyThreadState *tstate); -static PyStatus init_signals(PyThreadState *tstate); static void call_py_exitfuncs(PyThreadState *tstate); static void wait_for_thread_shutdown(PyThreadState *tstate); static void call_ll_exitfuncs(_PyRuntimeState *runtime); @@ -1047,11 +1046,8 @@ init_interp_main(PyThreadState *tstate) } if (is_main_interp) { - if (config->install_signal_handlers) { - status = init_signals(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } + if (_PySignal_Init(config->install_signal_handlers) < 0) { + return _PyStatus_ERR("can't initialize signals"); } if (_PyTraceMalloc_Init(config->tracemalloc) < 0) { @@ -1702,7 +1698,7 @@ Py_FinalizeEx(void) } /* Disable signal handling */ - PyOS_FiniInterrupts(); + _PySignal_Fini(); /* Collect garbage. This may call finalizers; it's nice to call these * before all modules are destroyed. @@ -2730,25 +2726,6 @@ Py_Exit(int sts) exit(sts); } -static PyStatus -init_signals(PyThreadState *tstate) -{ -#ifdef SIGPIPE - PyOS_setsig(SIGPIPE, SIG_IGN); -#endif -#ifdef SIGXFZ - PyOS_setsig(SIGXFZ, SIG_IGN); -#endif -#ifdef SIGXFSZ - PyOS_setsig(SIGXFSZ, SIG_IGN); -#endif - PyOS_InitInterrupts(); /* May imply init_signals() */ - if (_PyErr_Occurred(tstate)) { - return _PyStatus_ERR("can't import signal"); - } - return _PyStatus_OK(); -} - /* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. * From 36a56d207776486ad54f2ebd1fc29ee12c6bae5b Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Tue, 17 Nov 2020 16:55:12 +0100 Subject: [PATCH 0557/1261] bpo-42264: Deprecate sqlite3.OptimizedUnicode (GH-23163) --- Doc/whatsnew/3.10.rst | 5 +++++ Lib/sqlite3/__init__.py | 14 ++++++++++++++ Lib/sqlite3/test/factory.py | 7 ++++--- .../2020-11-05-13-32-41.bpo-42264.r4KYUU.rst | 3 +++ Modules/_sqlite/module.c | 9 --------- 5 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index ffc34d773570f6..786cc61003a593 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -360,6 +360,11 @@ Deprecated as appropriate to help identify code which needs updating during this transition. +* ``sqlite3.OptimizedUnicode`` has been undocumented and obsolete since Python + 3.3, when it was made an alias to :class:`str`. It is now deprecated, + scheduled for removal in Python 3.12. + (Contributed by Erlend E. Aasland in :issue:`42264`.) + Removed ======= diff --git a/Lib/sqlite3/__init__.py b/Lib/sqlite3/__init__.py index 6c91df27cca70d..f001c0678e195f 100644 --- a/Lib/sqlite3/__init__.py +++ b/Lib/sqlite3/__init__.py @@ -21,3 +21,17 @@ # 3. This notice may not be removed or altered from any source distribution. from sqlite3.dbapi2 import * + + +# bpo-42264: OptimizedUnicode was deprecated in Python 3.10. It's scheduled +# for removal in Python 3.12. +def __getattr__(name): + if name == "OptimizedUnicode": + import warnings + msg = (""" + OptimizedUnicode is deprecated and will be removed in Python 3.12. + Since Python 3.3 it has simply been an alias for 'str'. + """) + warnings.warn(msg, DeprecationWarning, stacklevel=2) + return str + raise AttributeError(f"module 'sqlite3' has no attribute '{name}'") diff --git a/Lib/sqlite3/test/factory.py b/Lib/sqlite3/test/factory.py index 95dd24bdfadca6..d91997333b11ca 100644 --- a/Lib/sqlite3/test/factory.py +++ b/Lib/sqlite3/test/factory.py @@ -254,9 +254,10 @@ def CheckCustom(self): self.assertTrue(row[0].endswith("reich"), "column must contain original data") def CheckOptimizedUnicode(self): - # In py3k, str objects are always returned when text_factory - # is OptimizedUnicode - self.con.text_factory = sqlite.OptimizedUnicode + # OptimizedUnicode is deprecated as of Python 3.10 + with self.assertWarns(DeprecationWarning) as cm: + self.con.text_factory = sqlite.OptimizedUnicode + self.assertIn("factory.py", cm.filename) austria = "�sterreich" germany = "Deutchland" a_row = self.con.execute("select ?", (austria,)).fetchone() diff --git a/Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst b/Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst new file mode 100644 index 00000000000000..dd8e6871eb8cd3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst @@ -0,0 +1,3 @@ +``sqlite3.OptimizedUnicode`` has been undocumented and obsolete since Python +3.3, when it was made an alias to :class:`str`. It is now deprecated, +scheduled for removal in Python 3.12. diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 9fdf51417ed883..372f3dda4cbee4 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -412,15 +412,6 @@ PyMODINIT_FUNC PyInit__sqlite3(void) ADD_EXCEPTION(module, "DataError", pysqlite_DataError, pysqlite_DatabaseError); ADD_EXCEPTION(module, "NotSupportedError", pysqlite_NotSupportedError, pysqlite_DatabaseError); - /* In Python 2.x, setting Connection.text_factory to - OptimizedUnicode caused Unicode objects to be returned for - non-ASCII data and bytestrings to be returned for ASCII data. - Now OptimizedUnicode is an alias for str, so it has no - effect. */ - if (PyModule_AddObjectRef(module, "OptimizedUnicode", (PyObject*)&PyUnicode_Type) < 0) { - goto error; - } - /* Set integer constants */ if (add_integer_constants(module) < 0) { goto error; From a799fd3b6b1767b86094df08529189f7b9d3d4b5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 17 Nov 2020 18:15:20 +0100 Subject: [PATCH 0558/1261] bpo-41686: Always create the SIGINT event on Windows (GH-23344) bpo-41686, bpo-41713: On Windows, the SIGINT event, _PyOS_SigintEvent(), is now created even if Python is configured to not install signal handlers (PyConfig.install_signal_handlers=0 or Py_InitializeEx(0)). Changes: * Move global variables initialization from signal_exec() to _PySignal_Init() to clarify that they are global variables cleared by _PySignal_Fini(). * _PySignal_Fini() now closes sigint_event. * IntHandler is no longer a global variable. --- .../2020-11-17-16-25-50.bpo-41686.hX77kL.rst | 4 + Modules/signalmodule.c | 140 +++++++++++------- 2 files changed, 91 insertions(+), 53 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-17-16-25-50.bpo-41686.hX77kL.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-17-16-25-50.bpo-41686.hX77kL.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-17-16-25-50.bpo-41686.hX77kL.rst new file mode 100644 index 00000000000000..0265d48660a3c6 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-17-16-25-50.bpo-41686.hX77kL.rst @@ -0,0 +1,4 @@ +On Windows, the ``SIGINT`` event, ``_PyOS_SigintEvent()``, is now created +even if Python is configured to not install signal handlers (if +:c:member:`PyConfig.install_signal_handlers` equals to 0, or +``Py_InitializeEx(0)``). diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index c0b211749aaded..7cd6666ede82ec 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -130,15 +130,16 @@ static _Py_atomic_int is_tripped; static PyObject *DefaultHandler; static PyObject *IgnoreHandler; -static PyObject *IntHandler; #ifdef MS_WINDOWS static HANDLE sigint_event = NULL; #endif -#ifdef HAVE_GETITIMER +#if defined(HAVE_GETITIMER) || defined(HAVE_SETITIMER) static PyObject *ItimerError; +#endif +#ifdef HAVE_GETITIMER /* auxiliary functions for setitimer */ static int timeval_from_double(PyObject *obj, struct timeval *tv) @@ -1074,7 +1075,6 @@ signal_valid_signals_impl(PyObject *module) #if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT) -static int initialized; static PyStructSequence_Field struct_siginfo_fields[] = { {"si_signo", "signal number"}, {"si_code", "signal code"}, @@ -1384,30 +1384,19 @@ signal_exec(PyObject *m) { /* add the functions */ #if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT) - if (!initialized) { - if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0) { - return -1; - } - } - if (PyModule_AddType(m, &SiginfoType) < 0) { return -1; } - initialized = 1; #endif /* Add some symbolic constants to the module */ PyObject *d = PyModule_GetDict(m); - DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL); - if (!DefaultHandler || - PyDict_SetItemString(d, "SIG_DFL", DefaultHandler) < 0) { + if (PyDict_SetItemString(d, "SIG_DFL", DefaultHandler) < 0) { return -1; } - IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN); - if (!IgnoreHandler || - PyDict_SetItemString(d, "SIG_IGN", IgnoreHandler) < 0) { + if (PyDict_SetItemString(d, "SIG_IGN", IgnoreHandler) < 0) { return -1; } @@ -1427,15 +1416,9 @@ signal_exec(PyObject *m) return -1; #endif - IntHandler = PyMapping_GetItemString(d, "default_int_handler"); - if (!IntHandler) - return -1; - - _Py_atomic_store_relaxed(&Handlers[0].tripped, 0); for (int i = 1; i < NSIG; i++) { void (*t)(int); t = PyOS_getsig(i); - _Py_atomic_store_relaxed(&Handlers[i].tripped, 0); if (t == SIG_DFL) Handlers[i].func = DefaultHandler; else if (t == SIG_IGN) @@ -1445,9 +1428,13 @@ signal_exec(PyObject *m) Py_INCREF(Handlers[i].func); } if (Handlers[SIGINT].func == DefaultHandler) { + PyObject *int_handler = PyMapping_GetItemString(d, "default_int_handler"); + if (!int_handler) { + return -1; + } + /* Install default int handler */ - Py_INCREF(IntHandler); - Py_SETREF(Handlers[SIGINT].func, IntHandler); + Py_SETREF(Handlers[SIGINT].func, int_handler); PyOS_setsig(SIGINT, signal_handler); } @@ -1617,11 +1604,8 @@ signal_exec(PyObject *m) return -1; #endif -#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER) - ItimerError = PyErr_NewException("signal.ItimerError", - PyExc_OSError, NULL); - if (!ItimerError || - PyDict_SetItemString(d, "ItimerError", ItimerError) < 0) { +#if defined(HAVE_GETITIMER) || defined(HAVE_SETITIMER) + if (PyDict_SetItemString(d, "ItimerError", ItimerError) < 0) { return -1; } #endif @@ -1636,11 +1620,6 @@ signal_exec(PyObject *m) return -1; #endif -#ifdef MS_WINDOWS - /* Create manual-reset event, initially unset */ - sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE); -#endif - if (PyErr_Occurred()) { return -1; } @@ -1677,23 +1656,31 @@ PyInit__signal(void) void _PySignal_Fini(void) { - int i; - PyObject *func; - - for (i = 1; i < NSIG; i++) { - func = Handlers[i].func; - _Py_atomic_store_relaxed(&Handlers[i].tripped, 0); - Handlers[i].func = NULL; - if (func != NULL && func != Py_None && - func != DefaultHandler && func != IgnoreHandler) - PyOS_setsig(i, SIG_DFL); + // Restore default signals and clear handlers + for (int signum = 1; signum < NSIG; signum++) { + PyObject *func = Handlers[signum].func; + _Py_atomic_store_relaxed(&Handlers[signum].tripped, 0); + Handlers[signum].func = NULL; + if (func != NULL + && func != Py_None + && func != DefaultHandler + && func != IgnoreHandler) + { + PyOS_setsig(signum, SIG_DFL); + } Py_XDECREF(func); } - Py_CLEAR(IntHandler); +#ifdef MS_WINDOWS + if (sigint_event != NULL) { + CloseHandle(sigint_event); + sigint_event = NULL; + } +#endif + Py_CLEAR(DefaultHandler); Py_CLEAR(IgnoreHandler); -#ifdef HAVE_GETITIMER +#if defined(HAVE_GETITIMER) || defined(HAVE_SETITIMER) Py_CLEAR(ItimerError); #endif } @@ -1792,14 +1779,9 @@ PyErr_SetInterrupt(void) } } -int -_PySignal_Init(int install_signal_handlers) +static int +signal_install_handlers(void) { - if (!install_signal_handlers) { - // Nothing to do - return 0; - } - #ifdef SIGPIPE PyOS_setsig(SIGPIPE, SIG_IGN); #endif @@ -1821,6 +1803,58 @@ _PySignal_Init(int install_signal_handlers) } +int +_PySignal_Init(int install_signal_handlers) +{ + DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL); + if (!DefaultHandler) { + return -1; + } + + IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN); + if (!IgnoreHandler) { + return -1; + } + +#if defined(HAVE_GETITIMER) || defined(HAVE_SETITIMER) + ItimerError = PyErr_NewException("signal.ItimerError", + PyExc_OSError, NULL); + if (!ItimerError) { + return -1; + } +#endif + +#ifdef MS_WINDOWS + /* Create manual-reset event, initially unset */ + sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE); + if (sigint_event == NULL) { + PyErr_SetFromWindowsErr(0); + return -1; + } +#endif + +#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT) + if (SiginfoType.tp_name == NULL) { + if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0) { + return -1; + } + } +#endif + + for (int signum = 1; signum < NSIG; signum++) { + _Py_atomic_store_relaxed(&Handlers[signum].tripped, 0); + } + + if (install_signal_handlers) { + if (signal_install_handlers() < 0) { + return -1; + } + } + + return 0; +} + + // The caller doesn't have to hold the GIL int _PyOS_InterruptOccurred(PyThreadState *tstate) From 5b68634b3700242985636daa7c85dfa5d3b9527d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 17 Nov 2020 18:57:32 +0100 Subject: [PATCH 0559/1261] bpo-41686: Refactor signal_exec() (GH-23346) * Add signal_add_constants() function and add ADD_INT_MACRO macro. * The Python SIGINT handler is now installed at the end of signal_exec(). * Use Py_NewRef(). --- Modules/signalmodule.c | 283 ++++++++++++++++++----------------------- 1 file changed, 125 insertions(+), 158 deletions(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 7cd6666ede82ec..955d4a56e5462f 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -248,10 +248,6 @@ report_wakeup_send_error(void* data) static void trip_signal(int sig_num) { - unsigned char byte; - int fd; - Py_ssize_t rc; - _Py_atomic_store_relaxed(&Handlers[sig_num].tripped, 1); /* Set is_tripped after setting .tripped, as it gets @@ -283,6 +279,7 @@ trip_signal(int sig_num) See bpo-30038 for more details. */ + int fd; #ifdef MS_WINDOWS fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int); #else @@ -290,10 +287,10 @@ trip_signal(int sig_num) #endif if (fd != INVALID_FD) { - byte = (unsigned char)sig_num; + unsigned char byte = (unsigned char)sig_num; #ifdef MS_WINDOWS if (wakeup.use_send) { - rc = send(fd, &byte, 1, 0); + Py_ssize_t rc = send(fd, &byte, 1, 0); if (rc < 0) { int last_error = GetLastError(); @@ -313,7 +310,7 @@ trip_signal(int sig_num) { /* _Py_write_noraise() retries write() if write() is interrupted by a signal (fails with EINTR). */ - rc = _Py_write_noraise(fd, &byte, 1); + Py_ssize_t rc = _Py_write_noraise(fd, &byte, 1); if (rc < 0) { if (wakeup.warn_on_full_buffer || @@ -516,8 +513,7 @@ signal_signal_impl(PyObject *module, int signalnum, PyObject *handler) } old_handler = Handlers[signalnum].func; - Py_INCREF(handler); - Handlers[signalnum].func = handler; + Handlers[signalnum].func = Py_NewRef(handler); if (old_handler != NULL) { return old_handler; @@ -555,8 +551,7 @@ signal_getsignal_impl(PyObject *module, int signalnum) } old_handler = Handlers[signalnum].func; if (old_handler != NULL) { - Py_INCREF(old_handler); - return old_handler; + return Py_NewRef(old_handler); } else { Py_RETURN_NONE; @@ -711,7 +706,7 @@ signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds) if (sockfd == (SOCKET_T)(-1) && PyErr_Occurred()) return NULL; #else - int fd, old_fd; + int fd; if (!PyArg_ParseTupleAndKeywords(args, kwds, "i|$p:set_wakeup_fd", kwlist, &fd, &warn_on_full_buffer)) @@ -793,7 +788,7 @@ signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds) } } - old_fd = wakeup.fd; + int old_fd = wakeup.fd; wakeup.fd = fd; wakeup.warn_on_full_buffer = warn_on_full_buffer; @@ -814,14 +809,14 @@ The fd must be non-blocking."); int PySignal_SetWakeupFd(int fd) { - int old_fd; - if (fd < 0) + if (fd < 0) { fd = -1; + } #ifdef MS_WINDOWS - old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int); + int old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int); #else - old_fd = wakeup.fd; + int old_fd = wakeup.fd; #endif wakeup.fd = fd; wakeup.warn_on_full_buffer = 1; @@ -852,7 +847,7 @@ signal_setitimer_impl(PyObject *module, int which, PyObject *seconds, PyObject *interval) /*[clinic end generated code: output=65f9dcbddc35527b input=de43daf194e6f66f]*/ { - struct itimerval new, old; + struct itimerval new; if (timeval_from_double(seconds, &new.it_value) < 0) { return NULL; @@ -862,6 +857,7 @@ signal_setitimer_impl(PyObject *module, int which, PyObject *seconds, } /* Let OS check "which" value */ + struct itimerval old; if (setitimer(which, &new, &old) != 0) { PyErr_SetFromErrno(ItimerError); return NULL; @@ -1380,251 +1376,222 @@ the first is the signal number, the second is the interrupted stack frame."); static int -signal_exec(PyObject *m) +signal_add_constants(PyObject *module) { - /* add the functions */ -#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT) - if (PyModule_AddType(m, &SiginfoType) < 0) { - return -1; - } -#endif - - /* Add some symbolic constants to the module */ - PyObject *d = PyModule_GetDict(m); - - if (PyDict_SetItemString(d, "SIG_DFL", DefaultHandler) < 0) { - return -1; - } - - if (PyDict_SetItemString(d, "SIG_IGN", IgnoreHandler) < 0) { - return -1; +#define ADD_INT_MACRO(macro) \ + if (PyModule_AddIntConstant(module, #macro, macro) < 0) { \ + return -1; \ } - if (PyModule_AddIntMacro(m, NSIG)) - return -1; + ADD_INT_MACRO(NSIG); + // SIG_xxx pthread_sigmask() constants #ifdef SIG_BLOCK - if (PyModule_AddIntMacro(m, SIG_BLOCK)) - return -1; + ADD_INT_MACRO(SIG_BLOCK); #endif #ifdef SIG_UNBLOCK - if (PyModule_AddIntMacro(m, SIG_UNBLOCK)) - return -1; + ADD_INT_MACRO(SIG_UNBLOCK); #endif #ifdef SIG_SETMASK - if (PyModule_AddIntMacro(m, SIG_SETMASK)) - return -1; + ADD_INT_MACRO(SIG_SETMASK); #endif - for (int i = 1; i < NSIG; i++) { - void (*t)(int); - t = PyOS_getsig(i); - if (t == SIG_DFL) - Handlers[i].func = DefaultHandler; - else if (t == SIG_IGN) - Handlers[i].func = IgnoreHandler; - else - Handlers[i].func = Py_None; /* None of our business */ - Py_INCREF(Handlers[i].func); - } - if (Handlers[SIGINT].func == DefaultHandler) { - PyObject *int_handler = PyMapping_GetItemString(d, "default_int_handler"); - if (!int_handler) { - return -1; - } - - /* Install default int handler */ - Py_SETREF(Handlers[SIGINT].func, int_handler); - PyOS_setsig(SIGINT, signal_handler); - } - + // SIGxxx signal number constants #ifdef SIGHUP - if (PyModule_AddIntMacro(m, SIGHUP)) - return -1; + ADD_INT_MACRO(SIGHUP); #endif #ifdef SIGINT - if (PyModule_AddIntMacro(m, SIGINT)) - return -1; + ADD_INT_MACRO(SIGINT); #endif #ifdef SIGBREAK - if (PyModule_AddIntMacro(m, SIGBREAK)) - return -1; + ADD_INT_MACRO(SIGBREAK); #endif #ifdef SIGQUIT - if (PyModule_AddIntMacro(m, SIGQUIT)) - return -1; + ADD_INT_MACRO(SIGQUIT); #endif #ifdef SIGILL - if (PyModule_AddIntMacro(m, SIGILL)) - return -1; + ADD_INT_MACRO(SIGILL); #endif #ifdef SIGTRAP - if (PyModule_AddIntMacro(m, SIGTRAP)) - return -1; + ADD_INT_MACRO(SIGTRAP); #endif #ifdef SIGIOT - if (PyModule_AddIntMacro(m, SIGIOT)) - return -1; + ADD_INT_MACRO(SIGIOT); #endif #ifdef SIGABRT - if (PyModule_AddIntMacro(m, SIGABRT)) - return -1; + ADD_INT_MACRO(SIGABRT); #endif #ifdef SIGEMT - if (PyModule_AddIntMacro(m, SIGEMT)) - return -1; + ADD_INT_MACRO(SIGEMT); #endif #ifdef SIGFPE - if (PyModule_AddIntMacro(m, SIGFPE)) - return -1; + ADD_INT_MACRO(SIGFPE); #endif #ifdef SIGKILL - if (PyModule_AddIntMacro(m, SIGKILL)) - return -1; + ADD_INT_MACRO(SIGKILL); #endif #ifdef SIGBUS - if (PyModule_AddIntMacro(m, SIGBUS)) - return -1; + ADD_INT_MACRO(SIGBUS); #endif #ifdef SIGSEGV - if (PyModule_AddIntMacro(m, SIGSEGV)) - return -1; + ADD_INT_MACRO(SIGSEGV); #endif #ifdef SIGSYS - if (PyModule_AddIntMacro(m, SIGSYS)) - return -1; + ADD_INT_MACRO(SIGSYS); #endif #ifdef SIGPIPE - if (PyModule_AddIntMacro(m, SIGPIPE)) - return -1; + ADD_INT_MACRO(SIGPIPE); #endif #ifdef SIGALRM - if (PyModule_AddIntMacro(m, SIGALRM)) - return -1; + ADD_INT_MACRO(SIGALRM); #endif #ifdef SIGTERM - if (PyModule_AddIntMacro(m, SIGTERM)) - return -1; + ADD_INT_MACRO(SIGTERM); #endif #ifdef SIGUSR1 - if (PyModule_AddIntMacro(m, SIGUSR1)) - return -1; + ADD_INT_MACRO(SIGUSR1); #endif #ifdef SIGUSR2 - if (PyModule_AddIntMacro(m, SIGUSR2)) - return -1; + ADD_INT_MACRO(SIGUSR2); #endif #ifdef SIGCLD - if (PyModule_AddIntMacro(m, SIGCLD)) - return -1; + ADD_INT_MACRO(SIGCLD); #endif #ifdef SIGCHLD - if (PyModule_AddIntMacro(m, SIGCHLD)) - return -1; + ADD_INT_MACRO(SIGCHLD); #endif #ifdef SIGPWR - if (PyModule_AddIntMacro(m, SIGPWR)) - return -1; + ADD_INT_MACRO(SIGPWR); #endif #ifdef SIGIO - if (PyModule_AddIntMacro(m, SIGIO)) - return -1; + ADD_INT_MACRO(SIGIO); #endif #ifdef SIGURG - if (PyModule_AddIntMacro(m, SIGURG)) - return -1; + ADD_INT_MACRO(SIGURG); #endif #ifdef SIGWINCH - if (PyModule_AddIntMacro(m, SIGWINCH)) - return -1; + ADD_INT_MACRO(SIGWINCH); #endif #ifdef SIGPOLL - if (PyModule_AddIntMacro(m, SIGPOLL)) - return -1; + ADD_INT_MACRO(SIGPOLL); #endif #ifdef SIGSTOP - if (PyModule_AddIntMacro(m, SIGSTOP)) - return -1; + ADD_INT_MACRO(SIGSTOP); #endif #ifdef SIGTSTP - if (PyModule_AddIntMacro(m, SIGTSTP)) - return -1; + ADD_INT_MACRO(SIGTSTP); #endif #ifdef SIGCONT - if (PyModule_AddIntMacro(m, SIGCONT)) - return -1; + ADD_INT_MACRO(SIGCONT); #endif #ifdef SIGTTIN - if (PyModule_AddIntMacro(m, SIGTTIN)) - return -1; + ADD_INT_MACRO(SIGTTIN); #endif #ifdef SIGTTOU - if (PyModule_AddIntMacro(m, SIGTTOU)) - return -1; + ADD_INT_MACRO(SIGTTOU); #endif #ifdef SIGVTALRM - if (PyModule_AddIntMacro(m, SIGVTALRM)) - return -1; + ADD_INT_MACRO(SIGVTALRM); #endif #ifdef SIGPROF - if (PyModule_AddIntMacro(m, SIGPROF)) - return -1; + ADD_INT_MACRO(SIGPROF); #endif #ifdef SIGXCPU - if (PyModule_AddIntMacro(m, SIGXCPU)) - return -1; + ADD_INT_MACRO(SIGXCPU); #endif #ifdef SIGXFSZ - if (PyModule_AddIntMacro(m, SIGXFSZ)) - return -1; + ADD_INT_MACRO(SIGXFSZ); #endif #ifdef SIGRTMIN - if (PyModule_AddIntMacro(m, SIGRTMIN)) - return -1; + ADD_INT_MACRO(SIGRTMIN); #endif #ifdef SIGRTMAX - if (PyModule_AddIntMacro(m, SIGRTMAX)) - return -1; + ADD_INT_MACRO(SIGRTMAX); #endif #ifdef SIGINFO - if (PyModule_AddIntMacro(m, SIGINFO)) - return -1; + ADD_INT_MACRO(SIGINFO); #endif + // ITIMER_xxx constants #ifdef ITIMER_REAL - if (PyModule_AddIntMacro(m, ITIMER_REAL)) - return -1; + ADD_INT_MACRO(ITIMER_REAL); #endif #ifdef ITIMER_VIRTUAL - if (PyModule_AddIntMacro(m, ITIMER_VIRTUAL)) - return -1; + ADD_INT_MACRO(ITIMER_VIRTUAL); #endif #ifdef ITIMER_PROF - if (PyModule_AddIntMacro(m, ITIMER_PROF)) - return -1; + ADD_INT_MACRO(ITIMER_PROF); #endif + // CTRL_xxx Windows signals +#ifdef CTRL_C_EVENT + ADD_INT_MACRO(CTRL_C_EVENT); +#endif +#ifdef CTRL_BREAK_EVENT + ADD_INT_MACRO(CTRL_BREAK_EVENT); +#endif + + return 0; + +#undef ADD_INT_MACRO +} + + +static int +signal_exec(PyObject *m) +{ + assert(!PyErr_Occurred()); + + if (signal_add_constants(m) < 0) { + return -1; + } + + /* Add some symbolic constants to the module */ + PyObject *d = PyModule_GetDict(m); + if (PyDict_SetItemString(d, "SIG_DFL", DefaultHandler) < 0) { + return -1; + } + if (PyDict_SetItemString(d, "SIG_IGN", IgnoreHandler) < 0) { + return -1; + } #if defined(HAVE_GETITIMER) || defined(HAVE_SETITIMER) if (PyDict_SetItemString(d, "ItimerError", ItimerError) < 0) { return -1; } #endif - -#ifdef CTRL_C_EVENT - if (PyModule_AddIntMacro(m, CTRL_C_EVENT)) - return -1; +#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT) + if (PyModule_AddType(m, &SiginfoType) < 0) { + return -1; + } #endif -#ifdef CTRL_BREAK_EVENT - if (PyModule_AddIntMacro(m, CTRL_BREAK_EVENT)) - return -1; -#endif + // Get signal handlers + for (int signum = 1; signum < NSIG; signum++) { + void (*c_handler)(int) = PyOS_getsig(signum); + if (c_handler == SIG_DFL) { + Handlers[signum].func = Py_NewRef(DefaultHandler); + } + else if (c_handler == SIG_IGN) { + Handlers[signum].func = Py_NewRef(IgnoreHandler); + } + else { + Handlers[signum].func = Py_NewRef(Py_None); // None of our business + } + } - if (PyErr_Occurred()) { - return -1; + // Instal Python SIGINT handler which raises KeyboardInterrupt + if (Handlers[SIGINT].func == DefaultHandler) { + PyObject *int_handler = PyMapping_GetItemString(d, "default_int_handler"); + if (!int_handler) { + return -1; + } + + Py_SETREF(Handlers[SIGINT].func, int_handler); + PyOS_setsig(SIGINT, signal_handler); } - return 0; + assert(!PyErr_Occurred()); + return 0; } From 4ee65bcde3a5131e18576fa1bafad9817309cc9a Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 17 Nov 2020 18:13:50 +0000 Subject: [PATCH 0560/1261] bpo-41625: Add versionadded to os.splice() constants (GH-23340) --- Doc/library/os.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 75a8ed44e5b7b2..648c52b4705d90 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1450,6 +1450,7 @@ or `the MSDN `_ on Windo SPLICE_F_NONBLOCK SPLICE_F_MORE + .. versionadded:: 3.10 .. function:: readv(fd, buffers) From ca66426d0e7d1f7a6a92307f2a901c04973154cf Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Tue, 17 Nov 2020 19:30:14 +0000 Subject: [PATCH 0561/1261] bpo-42349: Compiler clean up. More yak-shaving for PEP 626. (GH-23267) Make sure that CFG from compiler front-end is correct. Be a bit more aggressive in the compiler back-end. --- Lib/test/test_compile.py | 24 + Lib/test/test_dis.py | 49 +- .../2020-11-13-17-25-44.bpo-42349.JdWxez.rst | 1 + Python/compile.c | 187 +- Python/importlib.h | 2825 +++++----- Python/importlib_external.h | 4824 +++++++++-------- Python/importlib_zipimport.h | 1498 ++--- 7 files changed, 4752 insertions(+), 4656 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-13-17-25-44.bpo-42349.JdWxez.rst diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 0e06d118a047d5..190e1a66610305 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -752,6 +752,30 @@ def continue_in_while(): self.assertEqual(None, opcodes[0].argval) self.assertEqual('RETURN_VALUE', opcodes[1].opname) + def test_consts_in_conditionals(self): + def and_true(x): + return True and x + + def and_false(x): + return False and x + + def or_true(x): + return True or x + + def or_false(x): + return False or x + + funcs = [and_true, and_false, or_true, or_false] + + # Check that condition is removed. + for func in funcs: + with self.subTest(func=func): + opcodes = list(dis.get_instructions(func)) + self.assertEqual(2, len(opcodes)) + self.assertIn('LOAD_', opcodes[0].opname) + self.assertEqual('RETURN_VALUE', opcodes[1].opname) + + def test_big_dict_literal(self): # The compiler has a flushing point in "compiler_dict" that calls compiles # a portion of the dictionary literal when the loop that iterates over the items diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 216a2dfa24df89..9cd11d3118b604 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -145,30 +145,24 @@ def bug1333982(x=[]): pass dis_bug1333982 = """\ -%3d 0 LOAD_CONST 1 (0) - 2 POP_JUMP_IF_TRUE 26 - 4 LOAD_ASSERTION_ERROR - 6 LOAD_CONST 2 ( at 0x..., file "%s", line %d>) - 8 LOAD_CONST 3 ('bug1333982..') - 10 MAKE_FUNCTION 0 - 12 LOAD_FAST 0 (x) - 14 GET_ITER - 16 CALL_FUNCTION 1 - -%3d 18 LOAD_CONST 4 (1) - -%3d 20 BINARY_ADD - 22 CALL_FUNCTION 1 - 24 RAISE_VARARGS 1 - -%3d >> 26 LOAD_CONST 0 (None) - 28 RETURN_VALUE +%3d 0 LOAD_ASSERTION_ERROR + 2 LOAD_CONST 2 ( at 0x..., file "%s", line %d>) + 4 LOAD_CONST 3 ('bug1333982..') + 6 MAKE_FUNCTION 0 + 8 LOAD_FAST 0 (x) + 10 GET_ITER + 12 CALL_FUNCTION 1 + +%3d 14 LOAD_CONST 4 (1) + +%3d 16 BINARY_ADD + 18 CALL_FUNCTION 1 + 20 RAISE_VARARGS 1 """ % (bug1333982.__code__.co_firstlineno + 1, __file__, bug1333982.__code__.co_firstlineno + 1, bug1333982.__code__.co_firstlineno + 2, - bug1333982.__code__.co_firstlineno + 1, - bug1333982.__code__.co_firstlineno + 3) + bug1333982.__code__.co_firstlineno + 1) _BIG_LINENO_FORMAT = """\ %3d 0 LOAD_GLOBAL 0 (spam) @@ -674,8 +668,15 @@ def get_disassembly(self, func, lasti=-1, wrapper=True, **kwargs): return output.getvalue() +if sys.flags.optimize: + code_info_consts = "0: None" +else: + code_info_consts = ( + """0: 'Formatted details of methods, functions, or code.' + 1: None""" +) -code_info_code_info = """\ +code_info_code_info = f"""\ Name: code_info Filename: (.*) Argument count: 1 @@ -685,13 +686,13 @@ def get_disassembly(self, func, lasti=-1, wrapper=True, **kwargs): Stack size: 3 Flags: OPTIMIZED, NEWLOCALS, NOFREE Constants: - 0: %r + {code_info_consts} Names: 0: _format_code_info 1: _get_code_object Variable names: - 0: x""" % (('Formatted details of methods, functions, or code.',) - if sys.flags.optimize < 2 else (None,)) + 0: x""" + @staticmethod def tricky(a, b, /, x, y, z=True, *args, c, d, e=[], **kwds): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-13-17-25-44.bpo-42349.JdWxez.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-13-17-25-44.bpo-42349.JdWxez.rst new file mode 100644 index 00000000000000..3db695673a00ae --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-13-17-25-44.bpo-42349.JdWxez.rst @@ -0,0 +1 @@ +Make sure that the compiler front-end produces a well-formed control flow graph. Be be more aggressive in the compiler back-end, as it is now safe to do so. diff --git a/Python/compile.c b/Python/compile.c index c2fcf096fbad44..1989b4af320dab 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2587,6 +2587,7 @@ compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond) VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n)); ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n)); ADDOP_JUMP(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next); + NEXT_BLOCK(c); basicblock *end = compiler_new_block(c); if (end == NULL) return 0; @@ -2610,6 +2611,7 @@ compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond) /* general implementation */ VISIT(c, expr, e); ADDOP_JUMP(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next); + NEXT_BLOCK(c); return 1; } @@ -2829,7 +2831,7 @@ compiler_async_for(struct compiler *c, stmt_ty s) static int compiler_while(struct compiler *c, stmt_ty s) { - basicblock *loop, *orelse, *end, *anchor = NULL; + basicblock *loop, *body, *end, *anchor = NULL; int constant = expr_constant(s->v.While.test); if (constant == 0) { @@ -2850,42 +2852,32 @@ compiler_while(struct compiler *c, stmt_ty s) return 1; } loop = compiler_new_block(c); + body = compiler_new_block(c); + anchor = compiler_new_block(c); end = compiler_new_block(c); - if (constant == -1) { - anchor = compiler_new_block(c); - if (anchor == NULL) - return 0; - } - if (loop == NULL || end == NULL) + if (loop == NULL || body == NULL || anchor == NULL || end == NULL) { return 0; - if (s->v.While.orelse) { - orelse = compiler_new_block(c); - if (orelse == NULL) - return 0; } - else - orelse = NULL; - compiler_use_next_block(c, loop); - if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL)) + if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL)) { return 0; + } if (constant == -1) { - if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) + if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) { return 0; + } } + + compiler_use_next_block(c, body); VISIT_SEQ(c, stmt, s->v.While.body); ADDOP_JUMP(c, JUMP_ABSOLUTE, loop); - /* XXX should the two POP instructions be in a separate block - if there is no else clause ? - */ - - if (constant == -1) - compiler_use_next_block(c, anchor); compiler_pop_fblock(c, WHILE_LOOP, loop); - if (orelse != NULL) /* what if orelse is just pass? */ + compiler_use_next_block(c, anchor); + if (s->v.While.orelse) { VISIT_SEQ(c, stmt, s->v.While.orelse); + } compiler_use_next_block(c, end); return 1; @@ -2916,6 +2908,7 @@ compiler_return(struct compiler *c, stmt_ty s) VISIT(c, expr, s->v.Return.value); } ADDOP(c, RETURN_VALUE); + NEXT_BLOCK(c); return 1; } @@ -2934,6 +2927,7 @@ compiler_break(struct compiler *c) return 0; } ADDOP_JUMP(c, JUMP_ABSOLUTE, loop->fb_exit); + NEXT_BLOCK(c); return 1; } @@ -2948,6 +2942,7 @@ compiler_continue(struct compiler *c) return compiler_error(c, "'continue' not properly in loop"); } ADDOP_JUMP(c, JUMP_ABSOLUTE, loop->fb_block); + NEXT_BLOCK(c) return 1; } @@ -3087,6 +3082,7 @@ compiler_try_except(struct compiler *c, stmt_ty s) ADDOP(c, DUP_TOP); VISIT(c, expr, handler->v.ExceptHandler.type); ADDOP_JUMP(c, JUMP_IF_NOT_EXC_MATCH, except); + NEXT_BLOCK(c); } ADDOP(c, POP_TOP); if (handler->v.ExceptHandler.name) { @@ -3427,6 +3423,7 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s) } } ADDOP_I(c, RAISE_VARARGS, (int)n); + NEXT_BLOCK(c); break; case Try_kind: return compiler_try(c, s); @@ -4798,6 +4795,7 @@ compiler_with_except_finish(struct compiler *c) { if (exit == NULL) return 0; ADDOP_JUMP(c, POP_JUMP_IF_TRUE, exit); + NEXT_BLOCK(c); ADDOP(c, RERAISE); compiler_use_next_block(c, exit); ADDOP(c, POP_TOP); @@ -5521,6 +5519,7 @@ stackdepth(struct compiler *c) } } if (next != NULL) { + assert(b->b_nofallthrough == 0); stackdepth_push(&sp, next, depth); } } @@ -6096,7 +6095,6 @@ optimize_basic_block(basicblock *bb, PyObject *consts) struct instr nop; nop.i_opcode = NOP; struct instr *target; - int lineno; for (int i = 0; i < bb->b_iused; i++) { struct instr *inst = &bb->b_instr[i]; int oparg = inst->i_oparg; @@ -6112,23 +6110,50 @@ optimize_basic_block(basicblock *bb, PyObject *consts) target = &nop; } switch (inst->i_opcode) { - /* Skip over LOAD_CONST trueconst - POP_JUMP_IF_FALSE xx. This improves - "while 1" performance. */ + /* Remove LOAD_CONST const; conditional jump */ case LOAD_CONST: - if (nextop != POP_JUMP_IF_FALSE) { - break; - } - PyObject* cnt = PyList_GET_ITEM(consts, oparg); - int is_true = PyObject_IsTrue(cnt); - if (is_true == -1) { - goto error; - } - if (is_true == 1) { - inst->i_opcode = NOP; - bb->b_instr[i+1].i_opcode = NOP; + { + PyObject* cnt; + int is_true; + int jump_if_true; + switch(nextop) { + case POP_JUMP_IF_FALSE: + case POP_JUMP_IF_TRUE: + cnt = PyList_GET_ITEM(consts, oparg); + is_true = PyObject_IsTrue(cnt); + if (is_true == -1) { + goto error; + } + inst->i_opcode = NOP; + jump_if_true = nextop == POP_JUMP_IF_TRUE; + if (is_true == jump_if_true) { + bb->b_instr[i+1].i_opcode = JUMP_ABSOLUTE; + bb->b_nofallthrough = 1; + } + else { + bb->b_instr[i+1].i_opcode = NOP; + } + break; + case JUMP_IF_FALSE_OR_POP: + case JUMP_IF_TRUE_OR_POP: + cnt = PyList_GET_ITEM(consts, oparg); + is_true = PyObject_IsTrue(cnt); + if (is_true == -1) { + goto error; + } + jump_if_true = nextop == JUMP_IF_TRUE_OR_POP; + if (is_true == jump_if_true) { + bb->b_instr[i+1].i_opcode = JUMP_ABSOLUTE; + bb->b_nofallthrough = 1; + } + else { + inst->i_opcode = NOP; + bb->b_instr[i+1].i_opcode = NOP; + } + break; } break; + } /* Try to fold tuples of constants. Skip over BUILD_SEQN 1 UNPACK_SEQN 1. @@ -6176,16 +6201,21 @@ optimize_basic_block(basicblock *bb, PyObject *consts) switch(target->i_opcode) { case POP_JUMP_IF_FALSE: *inst = *target; + --i; break; case JUMP_ABSOLUTE: case JUMP_FORWARD: case JUMP_IF_FALSE_OR_POP: - inst->i_target = target->i_target; + if (inst->i_target != target->i_target) { + inst->i_target = target->i_target; + --i; + } break; case JUMP_IF_TRUE_OR_POP: assert (inst->i_target->b_iused == 1); inst->i_opcode = POP_JUMP_IF_FALSE; inst->i_target = inst->i_target->b_next; + --i; break; } break; @@ -6194,16 +6224,21 @@ optimize_basic_block(basicblock *bb, PyObject *consts) switch(target->i_opcode) { case POP_JUMP_IF_TRUE: *inst = *target; + --i; break; case JUMP_ABSOLUTE: case JUMP_FORWARD: case JUMP_IF_TRUE_OR_POP: - inst->i_target = target->i_target; + if (inst->i_target != target->i_target) { + inst->i_target = target->i_target; + --i; + } break; case JUMP_IF_FALSE_OR_POP: assert (inst->i_target->b_iused == 1); inst->i_opcode = POP_JUMP_IF_TRUE; inst->i_target = inst->i_target->b_next; + --i; break; } break; @@ -6212,7 +6247,10 @@ optimize_basic_block(basicblock *bb, PyObject *consts) switch(target->i_opcode) { case JUMP_ABSOLUTE: case JUMP_FORWARD: - inst->i_target = target->i_target; + if (inst->i_target != target->i_target) { + inst->i_target = target->i_target; + --i; + } break; } break; @@ -6221,7 +6259,10 @@ optimize_basic_block(basicblock *bb, PyObject *consts) switch(target->i_opcode) { case JUMP_ABSOLUTE: case JUMP_FORWARD: - inst->i_target = target->i_target; + if (inst->i_target != target->i_target) { + inst->i_target = target->i_target; + --i; + } break; } break; @@ -6231,12 +6272,17 @@ optimize_basic_block(basicblock *bb, PyObject *consts) assert (i == bb->b_iused-1); switch(target->i_opcode) { case JUMP_FORWARD: - inst->i_target = target->i_target; + if (inst->i_target != target->i_target) { + inst->i_target = target->i_target; + --i; + } break; case JUMP_ABSOLUTE: - lineno = inst->i_lineno; - *inst = *target; - inst->i_lineno = lineno; + if (inst->i_target != target->i_target) { + inst->i_target = target->i_target; + inst->i_opcode = target->i_opcode; + --i; + } break; } if (inst->i_target->b_exit && inst->i_target->b_iused <= MAX_COPY_SIZE) { @@ -6268,15 +6314,15 @@ clean_basic_block(basicblock *bb) { for (int src = 0; src < bb->b_iused; src++) { int lineno = bb->b_instr[src].i_lineno; if (bb->b_instr[src].i_opcode == NOP) { - /* Eliminate no-op if it doesn't have a line number, or - * if the next instruction has same line number or no line number, or - * if the previous instruction had the same line number. */ + /* Eliminate no-op if it doesn't have a line number */ if (lineno < 0) { continue; } + /* or, if the previous instruction had the same line number. */ if (prev_lineno == lineno) { continue; } + /* or, if the next instruction has same line number or no line number */ if (src < bb->b_iused - 1) { int next_lineno = bb->b_instr[src+1].i_lineno; if (next_lineno < 0 || next_lineno == lineno) { @@ -6284,6 +6330,19 @@ clean_basic_block(basicblock *bb) { continue; } } + else { + basicblock* next = bb->b_next; + while (next && next->b_iused == 0) { + next = next->b_next; + } + /* or if last instruction in BB and next BB has same line number */ + if (next) { + if (lineno == next->b_instr[0].i_lineno) { + continue; + } + } + } + } if (dest != src) { bb->b_instr[dest] = bb->b_instr[src]; @@ -6295,30 +6354,36 @@ clean_basic_block(basicblock *bb) { bb->b_iused = dest; } -static void -normalise_basic_block(basicblock *bb) { - /* Remove any code following a return or re-raise, - and mark those blocks as exit and/or nofallthrough. */ + +static int +normalize_basic_block(basicblock *bb) { + /* Mark blocks as exit and/or nofallthrough. + Raise SystemError if CFG is malformed. */ for (int i = 0; i < bb->b_iused; i++) { switch(bb->b_instr[i].i_opcode) { case RETURN_VALUE: case RAISE_VARARGS: case RERAISE: - bb->b_iused = i+1; bb->b_exit = 1; - bb->b_nofallthrough = 1; - return; + /* fall through */ case JUMP_ABSOLUTE: case JUMP_FORWARD: - bb->b_iused = i+1; bb->b_nofallthrough = 1; - return; + /* fall through */ + case POP_JUMP_IF_FALSE: + case POP_JUMP_IF_TRUE: + case JUMP_IF_FALSE_OR_POP: + case JUMP_IF_TRUE_OR_POP: + if (i != bb->b_iused-1) { + PyErr_SetString(PyExc_SystemError, "malformed control flow graph."); + return -1; + } } } + return 0; } - static int mark_reachable(struct assembler *a) { basicblock **stack, **sp; @@ -6363,7 +6428,9 @@ static int optimize_cfg(struct assembler *a, PyObject *consts) { for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { - normalise_basic_block(b); + if (normalize_basic_block(b)) { + return -1; + } } for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { if (optimize_basic_block(b, consts)) { diff --git a/Python/importlib.h b/Python/importlib.h index 3a3e5a7659c8e9..b2a1d7fecefea1 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -377,7 +377,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 128,255,128,114,66,0,0,0,99,1,0,0,0,0,0,0, 0,0,0,0,0,3,0,0,0,4,0,0,0,79,0,0, 0,115,14,0,0,0,124,0,124,1,105,0,124,2,164,1, - 142,1,83,0,41,1,97,46,1,0,0,114,101,109,111,118, + 142,1,83,0,41,2,97,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, @@ -396,1428 +396,1429 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 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,114,10,0,0,0,41,3, - 218,1,102,114,56,0,0,0,90,4,107,119,100,115,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,25,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,220,0,0,0,115,4,0,0, - 0,14,8,255,128,114,68,0,0,0,114,39,0,0,0,41, - 1,218,9,118,101,114,98,111,115,105,116,121,99,1,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,4,0,0, - 0,71,0,0,0,115,54,0,0,0,116,0,106,1,106,2, - 124,1,107,5,114,50,124,0,160,3,100,1,161,1,115,30, - 100,2,124,0,23,0,125,0,116,4,124,0,106,5,124,2, - 142,0,116,0,106,6,100,3,141,2,1,0,100,4,83,0, - 41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111,114,116,32,122, - 2,35,32,41,1,90,4,102,105,108,101,78,41,7,114,15, - 0,0,0,218,5,102,108,97,103,115,218,7,118,101,114,98, - 111,115,101,218,10,115,116,97,114,116,115,119,105,116,104,218, - 5,112,114,105,110,116,114,46,0,0,0,218,6,115,116,100, - 101,114,114,41,3,218,7,109,101,115,115,97,103,101,114,69, - 0,0,0,114,56,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,16,95,118,101,114,98,111,115, - 101,95,109,101,115,115,97,103,101,231,0,0,0,115,12,0, - 0,0,12,2,10,1,8,1,20,1,4,128,255,128,114,77, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,3,0,0,0,115,26,0,0, - 0,135,0,102,1,100,1,100,2,132,8,125,1,116,0,124, - 1,136,0,131,2,1,0,124,1,83,0,41,3,122,49,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,0,0,0,0,2,0,0, - 0,4,0,0,0,19,0,0,0,115,38,0,0,0,124,1, - 116,0,106,1,118,1,114,28,116,2,100,1,160,3,124,1, - 161,1,124,1,100,2,141,2,130,1,136,0,124,0,124,1, - 131,2,83,0,41,3,78,250,29,123,33,114,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,114,16,0,0,0,41,4,114,15,0, - 0,0,218,20,98,117,105,108,116,105,110,95,109,111,100,117, - 108,101,95,110,97,109,101,115,218,11,73,109,112,111,114,116, - 69,114,114,111,114,114,46,0,0,0,169,2,114,30,0,0, - 0,218,8,102,117,108,108,110,97,109,101,169,1,218,3,102, - 120,110,114,10,0,0,0,114,11,0,0,0,218,25,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,241,0,0,0,115,12,0,0,0, - 10,1,10,1,2,1,6,255,10,2,255,128,122,52,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,169,1,114,12,0,0,0,41,2,114,84,0,0,0, - 114,85,0,0,0,114,10,0,0,0,114,83,0,0,0,114, - 11,0,0,0,218,17,95,114,101,113,117,105,114,101,115,95, - 98,117,105,108,116,105,110,239,0,0,0,115,8,0,0,0, - 12,2,10,5,4,1,255,128,114,87,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,3,0,0,0,115,26,0,0,0,135,0,102,1,100, - 1,100,2,132,8,125,1,116,0,124,1,136,0,131,2,1, - 0,124,1,83,0,41,3,122,47,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,0,0,0,0,2,0,0,0,4,0,0,0,19,0,0, - 0,115,38,0,0,0,116,0,160,1,124,1,161,1,115,28, - 116,2,100,1,160,3,124,1,161,1,124,1,100,2,141,2, - 130,1,136,0,124,0,124,1,131,2,83,0,169,3,78,122, - 27,123,33,114,125,32,105,115,32,110,111,116,32,97,32,102, - 114,111,122,101,110,32,109,111,100,117,108,101,114,16,0,0, - 0,41,4,114,58,0,0,0,218,9,105,115,95,102,114,111, - 122,101,110,114,80,0,0,0,114,46,0,0,0,114,81,0, - 0,0,114,83,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,24,95,114,101,113,117,105,114,101,115,95,102,114,111, - 122,101,110,95,119,114,97,112,112,101,114,252,0,0,0,115, - 12,0,0,0,10,1,10,1,2,1,6,255,10,2,255,128, - 122,50,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,114,86,0,0,0,41,2,114,84,0,0,0, - 114,90,0,0,0,114,10,0,0,0,114,83,0,0,0,114, - 11,0,0,0,218,16,95,114,101,113,117,105,114,101,115,95, - 102,114,111,122,101,110,250,0,0,0,115,8,0,0,0,12, - 2,10,5,4,1,255,128,114,91,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0, - 0,67,0,0,0,115,58,0,0,0,116,0,124,1,124,0, - 131,2,125,2,124,1,116,1,106,2,118,0,114,50,116,1, - 106,2,124,1,25,0,125,3,116,3,124,2,124,3,131,2, - 1,0,116,1,106,2,124,1,25,0,83,0,116,4,124,2, - 131,1,83,0,41,2,122,128,76,111,97,100,32,116,104,101, - 32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,108, - 101,32,105,110,116,111,32,115,121,115,46,109,111,100,117,108, - 101,115,32,97,110,100,32,114,101,116,117,114,110,32,105,116, - 46,10,10,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,85,115,101,32,108,111,97,100,101,114,46,101,120, - 101,99,95,109,111,100,117,108,101,32,105,110,115,116,101,97, - 100,46,10,10,32,32,32,32,78,41,5,218,16,115,112,101, - 99,95,102,114,111,109,95,108,111,97,100,101,114,114,15,0, - 0,0,218,7,109,111,100,117,108,101,115,218,5,95,101,120, - 101,99,218,5,95,108,111,97,100,41,4,114,30,0,0,0, - 114,82,0,0,0,218,4,115,112,101,99,218,6,109,111,100, - 117,108,101,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,17,95,108,111,97,100,95,109,111,100,117,108,101, - 95,115,104,105,109,6,1,0,0,115,14,0,0,0,10,6, - 10,1,10,1,10,1,10,1,8,2,255,128,114,98,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,8,0,0,0,67,0,0,0,115,210,0,0,0,116, - 0,124,0,100,1,100,0,131,3,125,1,116,1,124,1,100, - 2,131,2,114,54,122,12,124,1,160,2,124,0,161,1,87, - 0,83,0,4,0,116,3,121,52,1,0,1,0,1,0,89, - 0,110,2,48,0,122,10,124,0,106,4,125,2,87,0,110, - 18,4,0,116,5,121,82,1,0,1,0,1,0,89,0,110, - 18,48,0,124,2,100,0,117,1,114,100,116,6,124,2,131, - 1,83,0,122,10,124,0,106,7,125,3,87,0,110,22,4, - 0,116,5,121,132,1,0,1,0,1,0,100,3,125,3,89, - 0,110,2,48,0,122,10,124,0,106,8,125,4,87,0,110, - 52,4,0,116,5,121,196,1,0,1,0,1,0,124,1,100, - 0,117,0,114,180,100,4,160,9,124,3,161,1,6,0,89, - 0,83,0,100,5,160,9,124,3,124,1,161,2,6,0,89, - 0,83,0,48,0,100,6,160,9,124,3,124,4,161,2,83, - 0,41,7,78,218,10,95,95,108,111,97,100,101,114,95,95, - 218,11,109,111,100,117,108,101,95,114,101,112,114,250,1,63, - 250,13,60,109,111,100,117,108,101,32,123,33,114,125,62,250, - 20,60,109,111,100,117,108,101,32,123,33,114,125,32,40,123, - 33,114,125,41,62,250,23,60,109,111,100,117,108,101,32,123, - 33,114,125,32,102,114,111,109,32,123,33,114,125,62,41,10, - 114,6,0,0,0,114,4,0,0,0,114,100,0,0,0,218, - 9,69,120,99,101,112,116,105,111,110,218,8,95,95,115,112, - 101,99,95,95,218,14,65,116,116,114,105,98,117,116,101,69, - 114,114,111,114,218,22,95,109,111,100,117,108,101,95,114,101, - 112,114,95,102,114,111,109,95,115,112,101,99,114,1,0,0, - 0,218,8,95,95,102,105,108,101,95,95,114,46,0,0,0, - 41,5,114,97,0,0,0,218,6,108,111,97,100,101,114,114, - 96,0,0,0,114,17,0,0,0,218,8,102,105,108,101,110, - 97,109,101,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,12,95,109,111,100,117,108,101,95,114,101,112,114, - 22,1,0,0,115,48,0,0,0,12,2,10,1,2,4,12, - 1,12,1,6,1,2,1,10,1,12,1,6,1,8,2,8, - 1,2,4,10,1,12,1,10,1,2,1,10,1,12,1,8, - 1,14,1,18,2,12,2,255,128,114,112,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,64,0,0,0,115,114,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,2,100,2,100,3, - 156,3,100,4,100,5,132,2,90,4,100,6,100,7,132,0, - 90,5,100,8,100,9,132,0,90,6,101,7,100,10,100,11, - 132,0,131,1,90,8,101,8,106,9,100,12,100,11,132,0, - 131,1,90,8,101,7,100,13,100,14,132,0,131,1,90,10, - 101,7,100,15,100,16,132,0,131,1,90,11,101,11,106,9, - 100,17,100,16,132,0,131,1,90,11,100,2,83,0,41,18, - 218,10,77,111,100,117,108,101,83,112,101,99,97,208,5,0, - 0,84,104,101,32,115,112,101,99,105,102,105,99,97,116,105, - 111,110,32,102,111,114,32,97,32,109,111,100,117,108,101,44, - 32,117,115,101,100,32,102,111,114,32,108,111,97,100,105,110, - 103,46,10,10,32,32,32,32,65,32,109,111,100,117,108,101, - 39,115,32,115,112,101,99,32,105,115,32,116,104,101,32,115, - 111,117,114,99,101,32,102,111,114,32,105,110,102,111,114,109, - 97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32, - 109,111,100,117,108,101,46,32,32,70,111,114,10,32,32,32, - 32,100,97,116,97,32,97,115,115,111,99,105,97,116,101,100, - 32,119,105,116,104,32,116,104,101,32,109,111,100,117,108,101, - 44,32,105,110,99,108,117,100,105,110,103,32,115,111,117,114, - 99,101,44,32,117,115,101,32,116,104,101,32,115,112,101,99, - 39,115,10,32,32,32,32,108,111,97,100,101,114,46,10,10, - 32,32,32,32,96,110,97,109,101,96,32,105,115,32,116,104, - 101,32,97,98,115,111,108,117,116,101,32,110,97,109,101,32, - 111,102,32,116,104,101,32,109,111,100,117,108,101,46,32,32, - 96,108,111,97,100,101,114,96,32,105,115,32,116,104,101,32, - 108,111,97,100,101,114,10,32,32,32,32,116,111,32,117,115, - 101,32,119,104,101,110,32,108,111,97,100,105,110,103,32,116, - 104,101,32,109,111,100,117,108,101,46,32,32,96,112,97,114, - 101,110,116,96,32,105,115,32,116,104,101,32,110,97,109,101, - 32,111,102,32,116,104,101,10,32,32,32,32,112,97,99,107, - 97,103,101,32,116,104,101,32,109,111,100,117,108,101,32,105, - 115,32,105,110,46,32,32,84,104,101,32,112,97,114,101,110, - 116,32,105,115,32,100,101,114,105,118,101,100,32,102,114,111, - 109,32,116,104,101,32,110,97,109,101,46,10,10,32,32,32, - 32,96,105,115,95,112,97,99,107,97,103,101,96,32,100,101, - 116,101,114,109,105,110,101,115,32,105,102,32,116,104,101,32, - 109,111,100,117,108,101,32,105,115,32,99,111,110,115,105,100, - 101,114,101,100,32,97,32,112,97,99,107,97,103,101,32,111, - 114,10,32,32,32,32,110,111,116,46,32,32,79,110,32,109, - 111,100,117,108,101,115,32,116,104,105,115,32,105,115,32,114, - 101,102,108,101,99,116,101,100,32,98,121,32,116,104,101,32, - 96,95,95,112,97,116,104,95,95,96,32,97,116,116,114,105, - 98,117,116,101,46,10,10,32,32,32,32,96,111,114,105,103, - 105,110,96,32,105,115,32,116,104,101,32,115,112,101,99,105, - 102,105,99,32,108,111,99,97,116,105,111,110,32,117,115,101, - 100,32,98,121,32,116,104,101,32,108,111,97,100,101,114,32, - 102,114,111,109,32,119,104,105,99,104,32,116,111,10,32,32, - 32,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108, - 101,44,32,105,102,32,116,104,97,116,32,105,110,102,111,114, - 109,97,116,105,111,110,32,105,115,32,97,118,97,105,108,97, - 98,108,101,46,32,32,87,104,101,110,32,102,105,108,101,110, - 97,109,101,32,105,115,10,32,32,32,32,115,101,116,44,32, - 111,114,105,103,105,110,32,119,105,108,108,32,109,97,116,99, - 104,46,10,10,32,32,32,32,96,104,97,115,95,108,111,99, - 97,116,105,111,110,96,32,105,110,100,105,99,97,116,101,115, - 32,116,104,97,116,32,97,32,115,112,101,99,39,115,32,34, - 111,114,105,103,105,110,34,32,114,101,102,108,101,99,116,115, - 32,97,32,108,111,99,97,116,105,111,110,46,10,32,32,32, - 32,87,104,101,110,32,116,104,105,115,32,105,115,32,84,114, - 117,101,44,32,96,95,95,102,105,108,101,95,95,96,32,97, - 116,116,114,105,98,117,116,101,32,111,102,32,116,104,101,32, - 109,111,100,117,108,101,32,105,115,32,115,101,116,46,10,10, - 32,32,32,32,96,99,97,99,104,101,100,96,32,105,115,32, - 116,104,101,32,108,111,99,97,116,105,111,110,32,111,102,32, - 116,104,101,32,99,97,99,104,101,100,32,98,121,116,101,99, - 111,100,101,32,102,105,108,101,44,32,105,102,32,97,110,121, - 46,32,32,73,116,10,32,32,32,32,99,111,114,114,101,115, - 112,111,110,100,115,32,116,111,32,116,104,101,32,96,95,95, - 99,97,99,104,101,100,95,95,96,32,97,116,116,114,105,98, - 117,116,101,46,10,10,32,32,32,32,96,115,117,98,109,111, - 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, - 116,105,111,110,115,96,32,105,115,32,116,104,101,32,115,101, - 113,117,101,110,99,101,32,111,102,32,112,97,116,104,32,101, - 110,116,114,105,101,115,32,116,111,10,32,32,32,32,115,101, - 97,114,99,104,32,119,104,101,110,32,105,109,112,111,114,116, - 105,110,103,32,115,117,98,109,111,100,117,108,101,115,46,32, - 32,73,102,32,115,101,116,44,32,105,115,95,112,97,99,107, - 97,103,101,32,115,104,111,117,108,100,32,98,101,10,32,32, - 32,32,84,114,117,101,45,45,97,110,100,32,70,97,108,115, - 101,32,111,116,104,101,114,119,105,115,101,46,10,10,32,32, - 32,32,80,97,99,107,97,103,101,115,32,97,114,101,32,115, - 105,109,112,108,121,32,109,111,100,117,108,101,115,32,116,104, - 97,116,32,40,109,97,121,41,32,104,97,118,101,32,115,117, - 98,109,111,100,117,108,101,115,46,32,32,73,102,32,97,32, - 115,112,101,99,10,32,32,32,32,104,97,115,32,97,32,110, - 111,110,45,78,111,110,101,32,118,97,108,117,101,32,105,110, - 32,96,115,117,98,109,111,100,117,108,101,95,115,101,97,114, - 99,104,95,108,111,99,97,116,105,111,110,115,96,44,32,116, - 104,101,32,105,109,112,111,114,116,10,32,32,32,32,115,121, - 115,116,101,109,32,119,105,108,108,32,99,111,110,115,105,100, - 101,114,32,109,111,100,117,108,101,115,32,108,111,97,100,101, - 100,32,102,114,111,109,32,116,104,101,32,115,112,101,99,32, - 97,115,32,112,97,99,107,97,103,101,115,46,10,10,32,32, - 32,32,79,110,108,121,32,102,105,110,100,101,114,115,32,40, - 115,101,101,32,105,109,112,111,114,116,108,105,98,46,97,98, - 99,46,77,101,116,97,80,97,116,104,70,105,110,100,101,114, - 32,97,110,100,10,32,32,32,32,105,109,112,111,114,116,108, - 105,98,46,97,98,99,46,80,97,116,104,69,110,116,114,121, - 70,105,110,100,101,114,41,32,115,104,111,117,108,100,32,109, - 111,100,105,102,121,32,77,111,100,117,108,101,83,112,101,99, - 32,105,110,115,116,97,110,99,101,115,46,10,10,32,32,32, - 32,78,41,3,218,6,111,114,105,103,105,110,218,12,108,111, - 97,100,101,114,95,115,116,97,116,101,218,10,105,115,95,112, - 97,99,107,97,103,101,99,3,0,0,0,0,0,0,0,3, - 0,0,0,6,0,0,0,2,0,0,0,67,0,0,0,115, - 54,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, - 124,3,124,0,95,2,124,4,124,0,95,3,124,5,114,32, - 103,0,110,2,100,0,124,0,95,4,100,1,124,0,95,5, - 100,0,124,0,95,6,100,0,83,0,41,2,78,70,41,7, - 114,17,0,0,0,114,110,0,0,0,114,114,0,0,0,114, - 115,0,0,0,218,26,115,117,98,109,111,100,117,108,101,95, - 115,101,97,114,99,104,95,108,111,99,97,116,105,111,110,115, - 218,13,95,115,101,116,95,102,105,108,101,97,116,116,114,218, - 7,95,99,97,99,104,101,100,41,6,114,30,0,0,0,114, - 17,0,0,0,114,110,0,0,0,114,114,0,0,0,114,115, - 0,0,0,114,116,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,31,0,0,0,95,1,0,0, - 115,18,0,0,0,6,2,6,1,6,1,6,1,14,1,6, - 3,6,1,4,128,255,128,122,19,77,111,100,117,108,101,83, - 112,101,99,46,95,95,105,110,105,116,95,95,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,6,0,0, - 0,67,0,0,0,115,102,0,0,0,100,1,160,0,124,0, - 106,1,161,1,100,2,160,0,124,0,106,2,161,1,103,2, - 125,1,124,0,106,3,100,0,117,1,114,52,124,1,160,4, - 100,3,160,0,124,0,106,3,161,1,161,1,1,0,124,0, - 106,5,100,0,117,1,114,80,124,1,160,4,100,4,160,0, - 124,0,106,5,161,1,161,1,1,0,100,5,160,0,124,0, - 106,6,106,7,100,6,160,8,124,1,161,1,161,2,83,0, - 41,7,78,122,9,110,97,109,101,61,123,33,114,125,122,11, - 108,111,97,100,101,114,61,123,33,114,125,122,11,111,114,105, - 103,105,110,61,123,33,114,125,122,29,115,117,98,109,111,100, - 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, - 105,111,110,115,61,123,125,122,6,123,125,40,123,125,41,122, - 2,44,32,41,9,114,46,0,0,0,114,17,0,0,0,114, - 110,0,0,0,114,114,0,0,0,218,6,97,112,112,101,110, - 100,114,117,0,0,0,218,9,95,95,99,108,97,115,115,95, - 95,114,1,0,0,0,218,4,106,111,105,110,41,2,114,30, - 0,0,0,114,56,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,49,0,0,0,107,1,0,0, - 115,22,0,0,0,10,1,10,1,4,255,10,2,18,1,10, - 1,8,1,4,1,6,255,22,2,255,128,122,19,77,111,100, - 117,108,101,83,112,101,99,46,95,95,114,101,112,114,95,95, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,102,0,0,0,124,0, - 106,0,125,2,122,72,124,0,106,1,124,1,106,1,107,2, - 111,76,124,0,106,2,124,1,106,2,107,2,111,76,124,0, - 106,3,124,1,106,3,107,2,111,76,124,2,124,1,106,0, - 107,2,111,76,124,0,106,4,124,1,106,4,107,2,111,76, - 124,0,106,5,124,1,106,5,107,2,87,0,83,0,4,0, - 116,6,121,100,1,0,1,0,1,0,116,7,6,0,89,0, - 83,0,48,0,114,13,0,0,0,41,8,114,117,0,0,0, - 114,17,0,0,0,114,110,0,0,0,114,114,0,0,0,218, - 6,99,97,99,104,101,100,218,12,104,97,115,95,108,111,99, - 97,116,105,111,110,114,107,0,0,0,218,14,78,111,116,73, - 109,112,108,101,109,101,110,116,101,100,41,3,114,30,0,0, - 0,90,5,111,116,104,101,114,90,4,115,109,115,108,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,6,95, - 95,101,113,95,95,117,1,0,0,115,32,0,0,0,6,1, - 2,1,12,1,10,1,2,255,10,2,2,254,8,3,2,253, - 10,4,2,252,10,5,4,251,12,6,10,1,255,128,122,17, - 77,111,100,117,108,101,83,112,101,99,46,95,95,101,113,95, - 95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,3,0,0,0,67,0,0,0,115,58,0,0,0,124, - 0,106,0,100,0,117,0,114,52,124,0,106,1,100,0,117, - 1,114,52,124,0,106,2,114,52,116,3,100,0,117,0,114, - 38,116,4,130,1,116,3,160,5,124,0,106,1,161,1,124, - 0,95,0,124,0,106,0,83,0,114,13,0,0,0,41,6, - 114,119,0,0,0,114,114,0,0,0,114,118,0,0,0,218, - 19,95,98,111,111,116,115,116,114,97,112,95,101,120,116,101, - 114,110,97,108,218,19,78,111,116,73,109,112,108,101,109,101, - 110,116,101,100,69,114,114,111,114,90,11,95,103,101,116,95, - 99,97,99,104,101,100,114,48,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,123,0,0,0,129, - 1,0,0,115,14,0,0,0,10,2,16,1,8,1,4,1, - 14,1,6,1,255,128,122,17,77,111,100,117,108,101,83,112, - 101,99,46,99,97,99,104,101,100,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, - 0,0,115,10,0,0,0,124,1,124,0,95,0,100,0,83, - 0,114,13,0,0,0,41,1,114,119,0,0,0,41,2,114, - 30,0,0,0,114,123,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,123,0,0,0,138,1,0, - 0,115,6,0,0,0,6,2,4,128,255,128,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,115,32,0,0,0,124,0,106,0,100,1, - 117,0,114,26,124,0,106,1,160,2,100,2,161,1,100,3, - 25,0,83,0,124,0,106,1,83,0,41,4,122,32,84,104, - 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, - 100,117,108,101,39,115,32,112,97,114,101,110,116,46,78,218, - 1,46,114,22,0,0,0,41,3,114,117,0,0,0,114,17, - 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, - 48,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,6,112,97,114,101,110,116,142,1,0,0,115, - 8,0,0,0,10,3,16,1,6,2,255,128,122,17,77,111, - 100,117,108,101,83,112,101,99,46,112,97,114,101,110,116,99, + 111,100,101,41,10,32,32,32,32,78,114,10,0,0,0,41, + 3,218,1,102,114,56,0,0,0,90,4,107,119,100,115,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,25, + 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,220,0,0,0,115,4,0, + 0,0,14,8,255,128,114,68,0,0,0,114,39,0,0,0, + 41,1,218,9,118,101,114,98,111,115,105,116,121,99,1,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,4,0, + 0,0,71,0,0,0,115,54,0,0,0,116,0,106,1,106, + 2,124,1,107,5,114,50,124,0,160,3,100,1,161,1,115, + 30,100,2,124,0,23,0,125,0,116,4,124,0,106,5,124, + 2,142,0,116,0,106,6,100,3,141,2,1,0,100,4,83, + 0,41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111,114,116,32, + 122,2,35,32,41,1,90,4,102,105,108,101,78,41,7,114, + 15,0,0,0,218,5,102,108,97,103,115,218,7,118,101,114, + 98,111,115,101,218,10,115,116,97,114,116,115,119,105,116,104, + 218,5,112,114,105,110,116,114,46,0,0,0,218,6,115,116, + 100,101,114,114,41,3,218,7,109,101,115,115,97,103,101,114, + 69,0,0,0,114,56,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,16,95,118,101,114,98,111, + 115,101,95,109,101,115,115,97,103,101,231,0,0,0,115,12, + 0,0,0,12,2,10,1,8,1,20,1,4,128,255,128,114, + 77,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,3,0,0,0,115,26,0, + 0,0,135,0,102,1,100,1,100,2,132,8,125,1,116,0, + 124,1,136,0,131,2,1,0,124,1,83,0,41,4,122,49, + 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,0,0,0,0,2,0, + 0,0,4,0,0,0,19,0,0,0,115,38,0,0,0,124, + 1,116,0,106,1,118,1,114,28,116,2,100,1,160,3,124, + 1,161,1,124,1,100,2,141,2,130,1,136,0,124,0,124, + 1,131,2,83,0,41,3,78,250,29,123,33,114,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,114,16,0,0,0,41,4,114,15, + 0,0,0,218,20,98,117,105,108,116,105,110,95,109,111,100, + 117,108,101,95,110,97,109,101,115,218,11,73,109,112,111,114, + 116,69,114,114,111,114,114,46,0,0,0,169,2,114,30,0, + 0,0,218,8,102,117,108,108,110,97,109,101,169,1,218,3, + 102,120,110,114,10,0,0,0,114,11,0,0,0,218,25,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,241,0,0,0,115,12,0,0, + 0,10,1,10,1,2,1,6,255,10,2,255,128,122,52,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,78,169,1,114,12,0,0,0,41,2,114,84,0, + 0,0,114,85,0,0,0,114,10,0,0,0,114,83,0,0, + 0,114,11,0,0,0,218,17,95,114,101,113,117,105,114,101, + 115,95,98,117,105,108,116,105,110,239,0,0,0,115,8,0, + 0,0,12,2,10,5,4,1,255,128,114,87,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,3,0,0,0,115,26,0,0,0,135,0,102, + 1,100,1,100,2,132,8,125,1,116,0,124,1,136,0,131, + 2,1,0,124,1,83,0,41,4,122,47,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,0,0,0,0,2,0,0,0,4,0,0,0,19, + 0,0,0,115,38,0,0,0,116,0,160,1,124,1,161,1, + 115,28,116,2,100,1,160,3,124,1,161,1,124,1,100,2, + 141,2,130,1,136,0,124,0,124,1,131,2,83,0,169,3, + 78,122,27,123,33,114,125,32,105,115,32,110,111,116,32,97, + 32,102,114,111,122,101,110,32,109,111,100,117,108,101,114,16, + 0,0,0,41,4,114,58,0,0,0,218,9,105,115,95,102, + 114,111,122,101,110,114,80,0,0,0,114,46,0,0,0,114, + 81,0,0,0,114,83,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,24,95,114,101,113,117,105,114,101,115,95,102, + 114,111,122,101,110,95,119,114,97,112,112,101,114,252,0,0, + 0,115,12,0,0,0,10,1,10,1,2,1,6,255,10,2, + 255,128,122,50,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,78,114,86,0,0,0,41,2,114,84, + 0,0,0,114,90,0,0,0,114,10,0,0,0,114,83,0, + 0,0,114,11,0,0,0,218,16,95,114,101,113,117,105,114, + 101,115,95,102,114,111,122,101,110,250,0,0,0,115,8,0, + 0,0,12,2,10,5,4,1,255,128,114,91,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 3,0,0,0,67,0,0,0,115,58,0,0,0,116,0,124, + 1,124,0,131,2,125,2,124,1,116,1,106,2,118,0,114, + 50,116,1,106,2,124,1,25,0,125,3,116,3,124,2,124, + 3,131,2,1,0,116,1,106,2,124,1,25,0,83,0,116, + 4,124,2,131,1,83,0,41,2,122,128,76,111,97,100,32, + 116,104,101,32,115,112,101,99,105,102,105,101,100,32,109,111, + 100,117,108,101,32,105,110,116,111,32,115,121,115,46,109,111, + 100,117,108,101,115,32,97,110,100,32,114,101,116,117,114,110, + 32,105,116,46,10,10,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,108,111,97,100,101,114, + 46,101,120,101,99,95,109,111,100,117,108,101,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,78,41,5,218,16, + 115,112,101,99,95,102,114,111,109,95,108,111,97,100,101,114, + 114,15,0,0,0,218,7,109,111,100,117,108,101,115,218,5, + 95,101,120,101,99,218,5,95,108,111,97,100,41,4,114,30, + 0,0,0,114,82,0,0,0,218,4,115,112,101,99,218,6, + 109,111,100,117,108,101,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,17,95,108,111,97,100,95,109,111,100, + 117,108,101,95,115,104,105,109,6,1,0,0,115,14,0,0, + 0,10,6,10,1,10,1,10,1,10,1,8,2,255,128,114, + 98,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,8,0,0,0,67,0,0,0,115,210,0, + 0,0,116,0,124,0,100,1,100,0,131,3,125,1,116,1, + 124,1,100,2,131,2,114,54,122,12,124,1,160,2,124,0, + 161,1,87,0,83,0,4,0,116,3,121,52,1,0,1,0, + 1,0,89,0,110,2,48,0,122,10,124,0,106,4,125,2, + 87,0,110,18,4,0,116,5,121,82,1,0,1,0,1,0, + 89,0,110,18,48,0,124,2,100,0,117,1,114,100,116,6, + 124,2,131,1,83,0,122,10,124,0,106,7,125,3,87,0, + 110,22,4,0,116,5,121,132,1,0,1,0,1,0,100,3, + 125,3,89,0,110,2,48,0,122,10,124,0,106,8,125,4, + 87,0,110,52,4,0,116,5,121,196,1,0,1,0,1,0, + 124,1,100,0,117,0,114,180,100,4,160,9,124,3,161,1, + 6,0,89,0,83,0,100,5,160,9,124,3,124,1,161,2, + 6,0,89,0,83,0,48,0,100,6,160,9,124,3,124,4, + 161,2,83,0,41,7,78,218,10,95,95,108,111,97,100,101, + 114,95,95,218,11,109,111,100,117,108,101,95,114,101,112,114, + 250,1,63,250,13,60,109,111,100,117,108,101,32,123,33,114, + 125,62,250,20,60,109,111,100,117,108,101,32,123,33,114,125, + 32,40,123,33,114,125,41,62,250,23,60,109,111,100,117,108, + 101,32,123,33,114,125,32,102,114,111,109,32,123,33,114,125, + 62,41,10,114,6,0,0,0,114,4,0,0,0,114,100,0, + 0,0,218,9,69,120,99,101,112,116,105,111,110,218,8,95, + 95,115,112,101,99,95,95,218,14,65,116,116,114,105,98,117, + 116,101,69,114,114,111,114,218,22,95,109,111,100,117,108,101, + 95,114,101,112,114,95,102,114,111,109,95,115,112,101,99,114, + 1,0,0,0,218,8,95,95,102,105,108,101,95,95,114,46, + 0,0,0,41,5,114,97,0,0,0,218,6,108,111,97,100, + 101,114,114,96,0,0,0,114,17,0,0,0,218,8,102,105, + 108,101,110,97,109,101,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,12,95,109,111,100,117,108,101,95,114, + 101,112,114,22,1,0,0,115,48,0,0,0,12,2,10,1, + 2,4,12,1,12,1,6,1,2,1,10,1,12,1,6,1, + 8,2,8,1,2,4,10,1,12,1,10,1,2,1,10,1, + 12,1,8,1,14,1,18,2,12,2,255,128,114,112,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,64,0,0,0,115,114,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,100,2,100, + 2,100,3,156,3,100,4,100,5,132,2,90,4,100,6,100, + 7,132,0,90,5,100,8,100,9,132,0,90,6,101,7,100, + 10,100,11,132,0,131,1,90,8,101,8,106,9,100,12,100, + 11,132,0,131,1,90,8,101,7,100,13,100,14,132,0,131, + 1,90,10,101,7,100,15,100,16,132,0,131,1,90,11,101, + 11,106,9,100,17,100,16,132,0,131,1,90,11,100,2,83, + 0,41,18,218,10,77,111,100,117,108,101,83,112,101,99,97, + 208,5,0,0,84,104,101,32,115,112,101,99,105,102,105,99, + 97,116,105,111,110,32,102,111,114,32,97,32,109,111,100,117, + 108,101,44,32,117,115,101,100,32,102,111,114,32,108,111,97, + 100,105,110,103,46,10,10,32,32,32,32,65,32,109,111,100, + 117,108,101,39,115,32,115,112,101,99,32,105,115,32,116,104, + 101,32,115,111,117,114,99,101,32,102,111,114,32,105,110,102, + 111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116, + 104,101,32,109,111,100,117,108,101,46,32,32,70,111,114,10, + 32,32,32,32,100,97,116,97,32,97,115,115,111,99,105,97, + 116,101,100,32,119,105,116,104,32,116,104,101,32,109,111,100, + 117,108,101,44,32,105,110,99,108,117,100,105,110,103,32,115, + 111,117,114,99,101,44,32,117,115,101,32,116,104,101,32,115, + 112,101,99,39,115,10,32,32,32,32,108,111,97,100,101,114, + 46,10,10,32,32,32,32,96,110,97,109,101,96,32,105,115, + 32,116,104,101,32,97,98,115,111,108,117,116,101,32,110,97, + 109,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, + 46,32,32,96,108,111,97,100,101,114,96,32,105,115,32,116, + 104,101,32,108,111,97,100,101,114,10,32,32,32,32,116,111, + 32,117,115,101,32,119,104,101,110,32,108,111,97,100,105,110, + 103,32,116,104,101,32,109,111,100,117,108,101,46,32,32,96, + 112,97,114,101,110,116,96,32,105,115,32,116,104,101,32,110, + 97,109,101,32,111,102,32,116,104,101,10,32,32,32,32,112, + 97,99,107,97,103,101,32,116,104,101,32,109,111,100,117,108, + 101,32,105,115,32,105,110,46,32,32,84,104,101,32,112,97, + 114,101,110,116,32,105,115,32,100,101,114,105,118,101,100,32, + 102,114,111,109,32,116,104,101,32,110,97,109,101,46,10,10, + 32,32,32,32,96,105,115,95,112,97,99,107,97,103,101,96, + 32,100,101,116,101,114,109,105,110,101,115,32,105,102,32,116, + 104,101,32,109,111,100,117,108,101,32,105,115,32,99,111,110, + 115,105,100,101,114,101,100,32,97,32,112,97,99,107,97,103, + 101,32,111,114,10,32,32,32,32,110,111,116,46,32,32,79, + 110,32,109,111,100,117,108,101,115,32,116,104,105,115,32,105, + 115,32,114,101,102,108,101,99,116,101,100,32,98,121,32,116, + 104,101,32,96,95,95,112,97,116,104,95,95,96,32,97,116, + 116,114,105,98,117,116,101,46,10,10,32,32,32,32,96,111, + 114,105,103,105,110,96,32,105,115,32,116,104,101,32,115,112, + 101,99,105,102,105,99,32,108,111,99,97,116,105,111,110,32, + 117,115,101,100,32,98,121,32,116,104,101,32,108,111,97,100, + 101,114,32,102,114,111,109,32,119,104,105,99,104,32,116,111, + 10,32,32,32,32,108,111,97,100,32,116,104,101,32,109,111, + 100,117,108,101,44,32,105,102,32,116,104,97,116,32,105,110, + 102,111,114,109,97,116,105,111,110,32,105,115,32,97,118,97, + 105,108,97,98,108,101,46,32,32,87,104,101,110,32,102,105, + 108,101,110,97,109,101,32,105,115,10,32,32,32,32,115,101, + 116,44,32,111,114,105,103,105,110,32,119,105,108,108,32,109, + 97,116,99,104,46,10,10,32,32,32,32,96,104,97,115,95, + 108,111,99,97,116,105,111,110,96,32,105,110,100,105,99,97, + 116,101,115,32,116,104,97,116,32,97,32,115,112,101,99,39, + 115,32,34,111,114,105,103,105,110,34,32,114,101,102,108,101, + 99,116,115,32,97,32,108,111,99,97,116,105,111,110,46,10, + 32,32,32,32,87,104,101,110,32,116,104,105,115,32,105,115, + 32,84,114,117,101,44,32,96,95,95,102,105,108,101,95,95, + 96,32,97,116,116,114,105,98,117,116,101,32,111,102,32,116, + 104,101,32,109,111,100,117,108,101,32,105,115,32,115,101,116, + 46,10,10,32,32,32,32,96,99,97,99,104,101,100,96,32, + 105,115,32,116,104,101,32,108,111,99,97,116,105,111,110,32, + 111,102,32,116,104,101,32,99,97,99,104,101,100,32,98,121, + 116,101,99,111,100,101,32,102,105,108,101,44,32,105,102,32, + 97,110,121,46,32,32,73,116,10,32,32,32,32,99,111,114, + 114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32, + 96,95,95,99,97,99,104,101,100,95,95,96,32,97,116,116, + 114,105,98,117,116,101,46,10,10,32,32,32,32,96,115,117, + 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, + 111,99,97,116,105,111,110,115,96,32,105,115,32,116,104,101, + 32,115,101,113,117,101,110,99,101,32,111,102,32,112,97,116, + 104,32,101,110,116,114,105,101,115,32,116,111,10,32,32,32, + 32,115,101,97,114,99,104,32,119,104,101,110,32,105,109,112, + 111,114,116,105,110,103,32,115,117,98,109,111,100,117,108,101, + 115,46,32,32,73,102,32,115,101,116,44,32,105,115,95,112, + 97,99,107,97,103,101,32,115,104,111,117,108,100,32,98,101, + 10,32,32,32,32,84,114,117,101,45,45,97,110,100,32,70, + 97,108,115,101,32,111,116,104,101,114,119,105,115,101,46,10, + 10,32,32,32,32,80,97,99,107,97,103,101,115,32,97,114, + 101,32,115,105,109,112,108,121,32,109,111,100,117,108,101,115, + 32,116,104,97,116,32,40,109,97,121,41,32,104,97,118,101, + 32,115,117,98,109,111,100,117,108,101,115,46,32,32,73,102, + 32,97,32,115,112,101,99,10,32,32,32,32,104,97,115,32, + 97,32,110,111,110,45,78,111,110,101,32,118,97,108,117,101, + 32,105,110,32,96,115,117,98,109,111,100,117,108,101,95,115, + 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,96, + 44,32,116,104,101,32,105,109,112,111,114,116,10,32,32,32, + 32,115,121,115,116,101,109,32,119,105,108,108,32,99,111,110, + 115,105,100,101,114,32,109,111,100,117,108,101,115,32,108,111, + 97,100,101,100,32,102,114,111,109,32,116,104,101,32,115,112, + 101,99,32,97,115,32,112,97,99,107,97,103,101,115,46,10, + 10,32,32,32,32,79,110,108,121,32,102,105,110,100,101,114, + 115,32,40,115,101,101,32,105,109,112,111,114,116,108,105,98, + 46,97,98,99,46,77,101,116,97,80,97,116,104,70,105,110, + 100,101,114,32,97,110,100,10,32,32,32,32,105,109,112,111, + 114,116,108,105,98,46,97,98,99,46,80,97,116,104,69,110, + 116,114,121,70,105,110,100,101,114,41,32,115,104,111,117,108, + 100,32,109,111,100,105,102,121,32,77,111,100,117,108,101,83, + 112,101,99,32,105,110,115,116,97,110,99,101,115,46,10,10, + 32,32,32,32,78,41,3,218,6,111,114,105,103,105,110,218, + 12,108,111,97,100,101,114,95,115,116,97,116,101,218,10,105, + 115,95,112,97,99,107,97,103,101,99,3,0,0,0,0,0, + 0,0,3,0,0,0,6,0,0,0,2,0,0,0,67,0, + 0,0,115,54,0,0,0,124,1,124,0,95,0,124,2,124, + 0,95,1,124,3,124,0,95,2,124,4,124,0,95,3,124, + 5,114,32,103,0,110,2,100,0,124,0,95,4,100,1,124, + 0,95,5,100,0,124,0,95,6,100,0,83,0,41,2,78, + 70,41,7,114,17,0,0,0,114,110,0,0,0,114,114,0, + 0,0,114,115,0,0,0,218,26,115,117,98,109,111,100,117, + 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, + 111,110,115,218,13,95,115,101,116,95,102,105,108,101,97,116, + 116,114,218,7,95,99,97,99,104,101,100,41,6,114,30,0, + 0,0,114,17,0,0,0,114,110,0,0,0,114,114,0,0, + 0,114,115,0,0,0,114,116,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,31,0,0,0,95, + 1,0,0,115,18,0,0,0,6,2,6,1,6,1,6,1, + 14,1,6,3,6,1,4,128,255,128,122,19,77,111,100,117, + 108,101,83,112,101,99,46,95,95,105,110,105,116,95,95,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 6,0,0,0,67,0,0,0,115,102,0,0,0,100,1,160, + 0,124,0,106,1,161,1,100,2,160,0,124,0,106,2,161, + 1,103,2,125,1,124,0,106,3,100,0,117,1,114,52,124, + 1,160,4,100,3,160,0,124,0,106,3,161,1,161,1,1, + 0,124,0,106,5,100,0,117,1,114,80,124,1,160,4,100, + 4,160,0,124,0,106,5,161,1,161,1,1,0,100,5,160, + 0,124,0,106,6,106,7,100,6,160,8,124,1,161,1,161, + 2,83,0,41,7,78,122,9,110,97,109,101,61,123,33,114, + 125,122,11,108,111,97,100,101,114,61,123,33,114,125,122,11, + 111,114,105,103,105,110,61,123,33,114,125,122,29,115,117,98, + 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, + 99,97,116,105,111,110,115,61,123,125,122,6,123,125,40,123, + 125,41,122,2,44,32,41,9,114,46,0,0,0,114,17,0, + 0,0,114,110,0,0,0,114,114,0,0,0,218,6,97,112, + 112,101,110,100,114,117,0,0,0,218,9,95,95,99,108,97, + 115,115,95,95,114,1,0,0,0,218,4,106,111,105,110,41, + 2,114,30,0,0,0,114,56,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,49,0,0,0,107, + 1,0,0,115,22,0,0,0,10,1,10,1,4,255,10,2, + 18,1,10,1,8,1,4,1,6,255,22,2,255,128,122,19, + 77,111,100,117,108,101,83,112,101,99,46,95,95,114,101,112, + 114,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,8,0,0,0,67,0,0,0,115,102,0,0, + 0,124,0,106,0,125,2,122,72,124,0,106,1,124,1,106, + 1,107,2,111,76,124,0,106,2,124,1,106,2,107,2,111, + 76,124,0,106,3,124,1,106,3,107,2,111,76,124,2,124, + 1,106,0,107,2,111,76,124,0,106,4,124,1,106,4,107, + 2,111,76,124,0,106,5,124,1,106,5,107,2,87,0,83, + 0,4,0,116,6,121,100,1,0,1,0,1,0,116,7,6, + 0,89,0,83,0,48,0,114,13,0,0,0,41,8,114,117, + 0,0,0,114,17,0,0,0,114,110,0,0,0,114,114,0, + 0,0,218,6,99,97,99,104,101,100,218,12,104,97,115,95, + 108,111,99,97,116,105,111,110,114,107,0,0,0,218,14,78, + 111,116,73,109,112,108,101,109,101,110,116,101,100,41,3,114, + 30,0,0,0,90,5,111,116,104,101,114,90,4,115,109,115, + 108,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,6,95,95,101,113,95,95,117,1,0,0,115,32,0,0, + 0,6,1,2,1,12,1,10,1,2,255,10,2,2,254,8, + 3,2,253,10,4,2,252,10,5,4,251,12,6,10,1,255, + 128,122,17,77,111,100,117,108,101,83,112,101,99,46,95,95, + 101,113,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,58,0, + 0,0,124,0,106,0,100,0,117,0,114,52,124,0,106,1, + 100,0,117,1,114,52,124,0,106,2,114,52,116,3,100,0, + 117,0,114,38,116,4,130,1,116,3,160,5,124,0,106,1, + 161,1,124,0,95,0,124,0,106,0,83,0,114,13,0,0, + 0,41,6,114,119,0,0,0,114,114,0,0,0,114,118,0, + 0,0,218,19,95,98,111,111,116,115,116,114,97,112,95,101, + 120,116,101,114,110,97,108,218,19,78,111,116,73,109,112,108, + 101,109,101,110,116,101,100,69,114,114,111,114,90,11,95,103, + 101,116,95,99,97,99,104,101,100,114,48,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,123,0, + 0,0,129,1,0,0,115,14,0,0,0,10,2,16,1,8, + 1,4,1,14,1,6,1,255,128,122,17,77,111,100,117,108, + 101,83,112,101,99,46,99,97,99,104,101,100,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, + 0,67,0,0,0,115,10,0,0,0,124,1,124,0,95,0, + 100,0,83,0,114,13,0,0,0,41,1,114,119,0,0,0, + 41,2,114,30,0,0,0,114,123,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,123,0,0,0, + 138,1,0,0,115,6,0,0,0,6,2,4,128,255,128,99, 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, - 0,83,0,114,13,0,0,0,41,1,114,118,0,0,0,114, - 48,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,124,0,0,0,150,1,0,0,115,4,0,0, - 0,6,2,255,128,122,23,77,111,100,117,108,101,83,112,101, - 99,46,104,97,115,95,108,111,99,97,116,105,111,110,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, - 0,0,0,67,0,0,0,115,14,0,0,0,116,0,124,1, - 131,1,124,0,95,1,100,0,83,0,114,13,0,0,0,41, - 2,218,4,98,111,111,108,114,118,0,0,0,41,2,114,30, - 0,0,0,218,5,118,97,108,117,101,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,124,0,0,0,154,1, - 0,0,115,6,0,0,0,10,2,4,128,255,128,41,12,114, - 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, - 0,0,0,114,31,0,0,0,114,49,0,0,0,114,126,0, - 0,0,218,8,112,114,111,112,101,114,116,121,114,123,0,0, - 0,218,6,115,101,116,116,101,114,114,131,0,0,0,114,124, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,113,0,0,0,58,1,0,0, - 115,36,0,0,0,8,0,4,1,4,36,2,1,12,255,8, - 12,8,10,2,12,10,1,4,8,10,1,2,3,10,1,2, - 7,10,1,4,3,14,1,255,128,114,113,0,0,0,169,2, - 114,114,0,0,0,114,116,0,0,0,99,2,0,0,0,0, - 0,0,0,2,0,0,0,6,0,0,0,8,0,0,0,67, - 0,0,0,115,150,0,0,0,116,0,124,1,100,1,131,2, - 114,74,116,1,100,2,117,0,114,22,116,2,130,1,116,1, - 106,3,125,4,124,3,100,2,117,0,114,48,124,4,124,0, - 124,1,100,3,141,2,83,0,124,3,114,56,103,0,110,2, - 100,2,125,5,124,4,124,0,124,1,124,5,100,4,141,3, - 83,0,124,3,100,2,117,0,114,134,116,0,124,1,100,5, - 131,2,114,130,122,14,124,1,160,4,124,0,161,1,125,3, - 87,0,110,26,4,0,116,5,121,128,1,0,1,0,1,0, - 100,2,125,3,89,0,110,6,48,0,100,6,125,3,116,6, - 124,0,124,1,124,2,124,3,100,7,141,4,83,0,41,8, - 122,53,82,101,116,117,114,110,32,97,32,109,111,100,117,108, - 101,32,115,112,101,99,32,98,97,115,101,100,32,111,110,32, - 118,97,114,105,111,117,115,32,108,111,97,100,101,114,32,109, - 101,116,104,111,100,115,46,90,12,103,101,116,95,102,105,108, - 101,110,97,109,101,78,41,1,114,110,0,0,0,41,2,114, - 110,0,0,0,114,117,0,0,0,114,116,0,0,0,70,114, - 136,0,0,0,41,7,114,4,0,0,0,114,127,0,0,0, - 114,128,0,0,0,218,23,115,112,101,99,95,102,114,111,109, - 95,102,105,108,101,95,108,111,99,97,116,105,111,110,114,116, - 0,0,0,114,80,0,0,0,114,113,0,0,0,41,6,114, - 17,0,0,0,114,110,0,0,0,114,114,0,0,0,114,116, - 0,0,0,114,137,0,0,0,90,6,115,101,97,114,99,104, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 92,0,0,0,159,1,0,0,115,38,0,0,0,10,2,8, - 1,4,1,6,1,8,2,12,1,12,1,6,1,2,1,6, - 255,8,3,10,1,2,1,14,1,12,1,10,1,4,3,16, - 2,255,128,114,92,0,0,0,99,3,0,0,0,0,0,0, - 0,0,0,0,0,8,0,0,0,8,0,0,0,67,0,0, - 0,115,40,1,0,0,122,10,124,0,106,0,125,3,87,0, - 110,18,4,0,116,1,121,28,1,0,1,0,1,0,89,0, - 110,14,48,0,124,3,100,0,117,1,114,42,124,3,83,0, - 124,0,106,2,125,4,124,1,100,0,117,0,114,86,122,10, - 124,0,106,3,125,1,87,0,110,18,4,0,116,1,121,84, - 1,0,1,0,1,0,89,0,110,2,48,0,122,10,124,0, - 106,4,125,5,87,0,110,22,4,0,116,1,121,118,1,0, - 1,0,1,0,100,0,125,5,89,0,110,2,48,0,124,2, - 100,0,117,0,114,174,124,5,100,0,117,0,114,170,122,10, - 124,1,106,5,125,2,87,0,110,26,4,0,116,1,121,168, - 1,0,1,0,1,0,100,0,125,2,89,0,110,6,48,0, - 124,5,125,2,122,10,124,0,106,6,125,6,87,0,110,22, - 4,0,116,1,121,206,1,0,1,0,1,0,100,0,125,6, - 89,0,110,2,48,0,122,14,116,7,124,0,106,8,131,1, - 125,7,87,0,110,22,4,0,116,1,121,244,1,0,1,0, - 1,0,100,0,125,7,89,0,110,2,48,0,116,9,124,4, - 124,1,124,2,100,1,141,3,125,3,124,5,100,0,117,0, - 144,1,114,18,100,2,110,2,100,3,124,3,95,10,124,6, - 124,3,95,11,124,7,124,3,95,12,124,3,83,0,41,4, - 78,169,1,114,114,0,0,0,70,84,41,13,114,106,0,0, - 0,114,107,0,0,0,114,1,0,0,0,114,99,0,0,0, - 114,109,0,0,0,218,7,95,79,82,73,71,73,78,218,10, - 95,95,99,97,99,104,101,100,95,95,218,4,108,105,115,116, - 218,8,95,95,112,97,116,104,95,95,114,113,0,0,0,114, - 118,0,0,0,114,123,0,0,0,114,117,0,0,0,41,8, - 114,97,0,0,0,114,110,0,0,0,114,114,0,0,0,114, - 96,0,0,0,114,17,0,0,0,90,8,108,111,99,97,116, - 105,111,110,114,123,0,0,0,114,117,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,17,95,115, - 112,101,99,95,102,114,111,109,95,109,111,100,117,108,101,185, - 1,0,0,115,74,0,0,0,2,2,10,1,12,1,6,1, - 8,2,4,1,6,2,8,1,2,1,10,1,12,1,6,2, - 2,1,10,1,12,1,10,1,8,1,8,1,2,1,10,1, - 12,1,10,1,4,2,2,1,10,1,12,1,10,1,2,1, - 14,1,12,1,10,1,14,2,20,1,6,1,6,1,4,1, - 255,128,114,143,0,0,0,70,169,1,218,8,111,118,101,114, - 114,105,100,101,99,2,0,0,0,0,0,0,0,1,0,0, - 0,5,0,0,0,8,0,0,0,67,0,0,0,115,214,1, - 0,0,124,2,115,20,116,0,124,1,100,1,100,0,131,3, - 100,0,117,0,114,52,122,12,124,0,106,1,124,1,95,2, - 87,0,110,18,4,0,116,3,121,50,1,0,1,0,1,0, - 89,0,110,2,48,0,124,2,115,72,116,0,124,1,100,2, - 100,0,131,3,100,0,117,0,114,174,124,0,106,4,125,3, - 124,3,100,0,117,0,114,144,124,0,106,5,100,0,117,1, - 114,144,116,6,100,0,117,0,114,108,116,7,130,1,116,6, - 106,8,125,4,124,4,160,9,124,4,161,1,125,3,124,0, - 106,5,124,3,95,10,124,3,124,0,95,4,100,0,124,1, - 95,11,122,10,124,3,124,1,95,12,87,0,110,18,4,0, - 116,3,121,172,1,0,1,0,1,0,89,0,110,2,48,0, - 124,2,115,194,116,0,124,1,100,3,100,0,131,3,100,0, - 117,0,114,226,122,12,124,0,106,13,124,1,95,14,87,0, - 110,18,4,0,116,3,121,224,1,0,1,0,1,0,89,0, - 110,2,48,0,122,10,124,0,124,1,95,15,87,0,110,18, - 4,0,116,3,121,254,1,0,1,0,1,0,89,0,110,2, - 48,0,124,2,144,1,115,24,116,0,124,1,100,4,100,0, - 131,3,100,0,117,0,144,1,114,70,124,0,106,5,100,0, - 117,1,144,1,114,70,122,12,124,0,106,5,124,1,95,16, - 87,0,110,20,4,0,116,3,144,1,121,68,1,0,1,0, - 1,0,89,0,110,2,48,0,124,0,106,17,144,1,114,210, - 124,2,144,1,115,102,116,0,124,1,100,5,100,0,131,3, - 100,0,117,0,144,1,114,136,122,12,124,0,106,18,124,1, - 95,11,87,0,110,20,4,0,116,3,144,1,121,134,1,0, - 1,0,1,0,89,0,110,2,48,0,124,2,144,1,115,160, - 116,0,124,1,100,6,100,0,131,3,100,0,117,0,144,1, - 114,210,124,0,106,19,100,0,117,1,144,1,114,210,122,14, - 124,0,106,19,124,1,95,20,87,0,124,1,83,0,4,0, - 116,3,144,1,121,208,1,0,1,0,1,0,89,0,124,1, - 83,0,48,0,124,1,83,0,41,7,78,114,1,0,0,0, - 114,99,0,0,0,218,11,95,95,112,97,99,107,97,103,101, - 95,95,114,142,0,0,0,114,109,0,0,0,114,140,0,0, - 0,41,21,114,6,0,0,0,114,17,0,0,0,114,1,0, - 0,0,114,107,0,0,0,114,110,0,0,0,114,117,0,0, - 0,114,127,0,0,0,114,128,0,0,0,218,16,95,78,97, - 109,101,115,112,97,99,101,76,111,97,100,101,114,218,7,95, - 95,110,101,119,95,95,90,5,95,112,97,116,104,114,109,0, - 0,0,114,99,0,0,0,114,131,0,0,0,114,146,0,0, - 0,114,106,0,0,0,114,142,0,0,0,114,124,0,0,0, - 114,114,0,0,0,114,123,0,0,0,114,140,0,0,0,41, - 5,114,96,0,0,0,114,97,0,0,0,114,145,0,0,0, - 114,110,0,0,0,114,147,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,18,95,105,110,105,116, - 95,109,111,100,117,108,101,95,97,116,116,114,115,230,1,0, - 0,115,104,0,0,0,20,4,2,1,12,1,12,1,6,1, - 20,2,6,1,8,1,10,2,8,1,4,1,6,1,10,2, - 8,1,6,1,6,11,2,1,10,1,12,1,6,1,20,2, - 2,1,12,1,12,1,6,1,2,2,10,1,12,1,6,1, - 24,2,12,1,2,1,12,1,14,1,6,1,8,2,24,1, - 2,1,12,1,14,1,6,1,24,2,12,1,2,1,10,1, - 4,3,14,254,2,1,4,1,2,255,4,1,255,128,114,149, + 3,0,0,0,67,0,0,0,115,32,0,0,0,124,0,106, + 0,100,1,117,0,114,26,124,0,106,1,160,2,100,2,161, + 1,100,3,25,0,83,0,124,0,106,1,83,0,41,4,122, + 32,84,104,101,32,110,97,109,101,32,111,102,32,116,104,101, + 32,109,111,100,117,108,101,39,115,32,112,97,114,101,110,116, + 46,78,218,1,46,114,22,0,0,0,41,3,114,117,0,0, + 0,114,17,0,0,0,218,10,114,112,97,114,116,105,116,105, + 111,110,114,48,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,6,112,97,114,101,110,116,142,1, + 0,0,115,8,0,0,0,10,3,16,1,6,2,255,128,122, + 17,77,111,100,117,108,101,83,112,101,99,46,112,97,114,101, + 110,116,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,1,0,0,0,67,0,0,0,115,6,0,0,0, + 124,0,106,0,83,0,114,13,0,0,0,41,1,114,118,0, + 0,0,114,48,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,124,0,0,0,150,1,0,0,115, + 4,0,0,0,6,2,255,128,122,23,77,111,100,117,108,101, + 83,112,101,99,46,104,97,115,95,108,111,99,97,116,105,111, + 110,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,2,0,0,0,67,0,0,0,115,14,0,0,0,116, + 0,124,1,131,1,124,0,95,1,100,0,83,0,114,13,0, + 0,0,41,2,218,4,98,111,111,108,114,118,0,0,0,41, + 2,114,30,0,0,0,218,5,118,97,108,117,101,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,124,0,0, + 0,154,1,0,0,115,6,0,0,0,10,2,4,128,255,128, + 41,12,114,1,0,0,0,114,0,0,0,0,114,2,0,0, + 0,114,3,0,0,0,114,31,0,0,0,114,49,0,0,0, + 114,126,0,0,0,218,8,112,114,111,112,101,114,116,121,114, + 123,0,0,0,218,6,115,101,116,116,101,114,114,131,0,0, + 0,114,124,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,113,0,0,0,58, + 1,0,0,115,36,0,0,0,8,0,4,1,4,36,2,1, + 12,255,8,12,8,10,2,12,10,1,4,8,10,1,2,3, + 10,1,2,7,10,1,4,3,14,1,255,128,114,113,0,0, + 0,169,2,114,114,0,0,0,114,116,0,0,0,99,2,0, + 0,0,0,0,0,0,2,0,0,0,6,0,0,0,8,0, + 0,0,67,0,0,0,115,150,0,0,0,116,0,124,1,100, + 1,131,2,114,74,116,1,100,2,117,0,114,22,116,2,130, + 1,116,1,106,3,125,4,124,3,100,2,117,0,114,48,124, + 4,124,0,124,1,100,3,141,2,83,0,124,3,114,56,103, + 0,110,2,100,2,125,5,124,4,124,0,124,1,124,5,100, + 4,141,3,83,0,124,3,100,2,117,0,114,134,116,0,124, + 1,100,5,131,2,114,130,122,14,124,1,160,4,124,0,161, + 1,125,3,87,0,110,26,4,0,116,5,121,128,1,0,1, + 0,1,0,100,2,125,3,89,0,110,6,48,0,100,6,125, + 3,116,6,124,0,124,1,124,2,124,3,100,7,141,4,83, + 0,41,8,122,53,82,101,116,117,114,110,32,97,32,109,111, + 100,117,108,101,32,115,112,101,99,32,98,97,115,101,100,32, + 111,110,32,118,97,114,105,111,117,115,32,108,111,97,100,101, + 114,32,109,101,116,104,111,100,115,46,90,12,103,101,116,95, + 102,105,108,101,110,97,109,101,78,41,1,114,110,0,0,0, + 41,2,114,110,0,0,0,114,117,0,0,0,114,116,0,0, + 0,70,114,136,0,0,0,41,7,114,4,0,0,0,114,127, + 0,0,0,114,128,0,0,0,218,23,115,112,101,99,95,102, + 114,111,109,95,102,105,108,101,95,108,111,99,97,116,105,111, + 110,114,116,0,0,0,114,80,0,0,0,114,113,0,0,0, + 41,6,114,17,0,0,0,114,110,0,0,0,114,114,0,0, + 0,114,116,0,0,0,114,137,0,0,0,90,6,115,101,97, + 114,99,104,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,92,0,0,0,159,1,0,0,115,38,0,0,0, + 10,2,8,1,4,1,6,1,8,2,12,1,12,1,6,1, + 2,1,6,255,8,3,10,1,2,1,14,1,12,1,10,1, + 4,3,16,2,255,128,114,92,0,0,0,99,3,0,0,0, + 0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0, + 67,0,0,0,115,40,1,0,0,122,10,124,0,106,0,125, + 3,87,0,110,18,4,0,116,1,121,28,1,0,1,0,1, + 0,89,0,110,14,48,0,124,3,100,0,117,1,114,42,124, + 3,83,0,124,0,106,2,125,4,124,1,100,0,117,0,114, + 86,122,10,124,0,106,3,125,1,87,0,110,18,4,0,116, + 1,121,84,1,0,1,0,1,0,89,0,110,2,48,0,122, + 10,124,0,106,4,125,5,87,0,110,22,4,0,116,1,121, + 118,1,0,1,0,1,0,100,0,125,5,89,0,110,2,48, + 0,124,2,100,0,117,0,114,174,124,5,100,0,117,0,114, + 170,122,10,124,1,106,5,125,2,87,0,110,26,4,0,116, + 1,121,168,1,0,1,0,1,0,100,0,125,2,89,0,110, + 6,48,0,124,5,125,2,122,10,124,0,106,6,125,6,87, + 0,110,22,4,0,116,1,121,206,1,0,1,0,1,0,100, + 0,125,6,89,0,110,2,48,0,122,14,116,7,124,0,106, + 8,131,1,125,7,87,0,110,22,4,0,116,1,121,244,1, + 0,1,0,1,0,100,0,125,7,89,0,110,2,48,0,116, + 9,124,4,124,1,124,2,100,1,141,3,125,3,124,5,100, + 0,117,0,144,1,114,18,100,2,110,2,100,3,124,3,95, + 10,124,6,124,3,95,11,124,7,124,3,95,12,124,3,83, + 0,41,4,78,169,1,114,114,0,0,0,70,84,41,13,114, + 106,0,0,0,114,107,0,0,0,114,1,0,0,0,114,99, + 0,0,0,114,109,0,0,0,218,7,95,79,82,73,71,73, + 78,218,10,95,95,99,97,99,104,101,100,95,95,218,4,108, + 105,115,116,218,8,95,95,112,97,116,104,95,95,114,113,0, + 0,0,114,118,0,0,0,114,123,0,0,0,114,117,0,0, + 0,41,8,114,97,0,0,0,114,110,0,0,0,114,114,0, + 0,0,114,96,0,0,0,114,17,0,0,0,90,8,108,111, + 99,97,116,105,111,110,114,123,0,0,0,114,117,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 17,95,115,112,101,99,95,102,114,111,109,95,109,111,100,117, + 108,101,185,1,0,0,115,74,0,0,0,2,2,10,1,12, + 1,6,1,8,2,4,1,6,2,8,1,2,1,10,1,12, + 1,6,2,2,1,10,1,12,1,10,1,8,1,8,1,2, + 1,10,1,12,1,10,1,4,2,2,1,10,1,12,1,10, + 1,2,1,14,1,12,1,10,1,14,2,20,1,6,1,6, + 1,4,1,255,128,114,143,0,0,0,70,169,1,218,8,111, + 118,101,114,114,105,100,101,99,2,0,0,0,0,0,0,0, + 1,0,0,0,5,0,0,0,8,0,0,0,67,0,0,0, + 115,214,1,0,0,124,2,115,20,116,0,124,1,100,1,100, + 0,131,3,100,0,117,0,114,52,122,12,124,0,106,1,124, + 1,95,2,87,0,110,18,4,0,116,3,121,50,1,0,1, + 0,1,0,89,0,110,2,48,0,124,2,115,72,116,0,124, + 1,100,2,100,0,131,3,100,0,117,0,114,174,124,0,106, + 4,125,3,124,3,100,0,117,0,114,144,124,0,106,5,100, + 0,117,1,114,144,116,6,100,0,117,0,114,108,116,7,130, + 1,116,6,106,8,125,4,124,4,160,9,124,4,161,1,125, + 3,124,0,106,5,124,3,95,10,124,3,124,0,95,4,100, + 0,124,1,95,11,122,10,124,3,124,1,95,12,87,0,110, + 18,4,0,116,3,121,172,1,0,1,0,1,0,89,0,110, + 2,48,0,124,2,115,194,116,0,124,1,100,3,100,0,131, + 3,100,0,117,0,114,226,122,12,124,0,106,13,124,1,95, + 14,87,0,110,18,4,0,116,3,121,224,1,0,1,0,1, + 0,89,0,110,2,48,0,122,10,124,0,124,1,95,15,87, + 0,110,18,4,0,116,3,121,254,1,0,1,0,1,0,89, + 0,110,2,48,0,124,2,144,1,115,24,116,0,124,1,100, + 4,100,0,131,3,100,0,117,0,144,1,114,70,124,0,106, + 5,100,0,117,1,144,1,114,70,122,12,124,0,106,5,124, + 1,95,16,87,0,110,20,4,0,116,3,144,1,121,68,1, + 0,1,0,1,0,89,0,110,2,48,0,124,0,106,17,144, + 1,114,210,124,2,144,1,115,102,116,0,124,1,100,5,100, + 0,131,3,100,0,117,0,144,1,114,136,122,12,124,0,106, + 18,124,1,95,11,87,0,110,20,4,0,116,3,144,1,121, + 134,1,0,1,0,1,0,89,0,110,2,48,0,124,2,144, + 1,115,160,116,0,124,1,100,6,100,0,131,3,100,0,117, + 0,144,1,114,210,124,0,106,19,100,0,117,1,144,1,114, + 210,122,14,124,0,106,19,124,1,95,20,87,0,124,1,83, + 0,4,0,116,3,144,1,121,208,1,0,1,0,1,0,89, + 0,124,1,83,0,48,0,124,1,83,0,41,7,78,114,1, + 0,0,0,114,99,0,0,0,218,11,95,95,112,97,99,107, + 97,103,101,95,95,114,142,0,0,0,114,109,0,0,0,114, + 140,0,0,0,41,21,114,6,0,0,0,114,17,0,0,0, + 114,1,0,0,0,114,107,0,0,0,114,110,0,0,0,114, + 117,0,0,0,114,127,0,0,0,114,128,0,0,0,218,16, + 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, + 218,7,95,95,110,101,119,95,95,90,5,95,112,97,116,104, + 114,109,0,0,0,114,99,0,0,0,114,131,0,0,0,114, + 146,0,0,0,114,106,0,0,0,114,142,0,0,0,114,124, + 0,0,0,114,114,0,0,0,114,123,0,0,0,114,140,0, + 0,0,41,5,114,96,0,0,0,114,97,0,0,0,114,145, + 0,0,0,114,110,0,0,0,114,147,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,18,95,105, + 110,105,116,95,109,111,100,117,108,101,95,97,116,116,114,115, + 230,1,0,0,115,104,0,0,0,20,4,2,1,12,1,12, + 1,6,1,20,2,6,1,8,1,10,2,8,1,4,1,6, + 1,10,2,8,1,6,1,6,11,2,1,10,1,12,1,6, + 1,20,2,2,1,12,1,12,1,6,1,2,2,10,1,12, + 1,6,1,24,2,12,1,2,1,12,1,14,1,6,1,8, + 2,24,1,2,1,12,1,14,1,6,1,24,2,12,1,2, + 1,10,1,4,3,14,254,2,1,4,1,2,255,4,1,255, + 128,114,149,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 82,0,0,0,100,1,125,1,116,0,124,0,106,1,100,2, + 131,2,114,30,124,0,106,1,160,2,124,0,161,1,125,1, + 110,20,116,0,124,0,106,1,100,3,131,2,114,50,116,3, + 100,4,131,1,130,1,124,1,100,1,117,0,114,68,116,4, + 124,0,106,5,131,1,125,1,116,6,124,0,124,1,131,2, + 1,0,124,1,83,0,41,5,122,43,67,114,101,97,116,101, + 32,97,32,109,111,100,117,108,101,32,98,97,115,101,100,32, + 111,110,32,116,104,101,32,112,114,111,118,105,100,101,100,32, + 115,112,101,99,46,78,218,13,99,114,101,97,116,101,95,109, + 111,100,117,108,101,218,11,101,120,101,99,95,109,111,100,117, + 108,101,122,66,108,111,97,100,101,114,115,32,116,104,97,116, + 32,100,101,102,105,110,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,109,117,115,116,32,97,108,115,111,32, + 100,101,102,105,110,101,32,99,114,101,97,116,101,95,109,111, + 100,117,108,101,40,41,41,7,114,4,0,0,0,114,110,0, + 0,0,114,150,0,0,0,114,80,0,0,0,114,18,0,0, + 0,114,17,0,0,0,114,149,0,0,0,169,2,114,96,0, + 0,0,114,97,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,16,109,111,100,117,108,101,95,102, + 114,111,109,95,115,112,101,99,46,2,0,0,115,20,0,0, + 0,4,3,12,1,14,3,12,1,8,1,8,2,10,1,10, + 1,4,1,255,128,114,153,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, + 0,0,0,115,100,0,0,0,124,0,106,0,100,1,117,0, + 114,14,100,2,110,4,124,0,106,0,125,1,124,0,106,1, + 100,1,117,0,114,64,124,0,106,2,100,1,117,0,114,50, + 100,3,160,3,124,1,161,1,83,0,100,4,160,3,124,1, + 124,0,106,2,161,2,83,0,124,0,106,4,114,84,100,5, + 160,3,124,1,124,0,106,1,161,2,83,0,100,6,160,3, + 124,0,106,0,124,0,106,1,161,2,83,0,41,7,122,38, + 82,101,116,117,114,110,32,116,104,101,32,114,101,112,114,32, + 116,111,32,117,115,101,32,102,111,114,32,116,104,101,32,109, + 111,100,117,108,101,46,78,114,101,0,0,0,114,102,0,0, + 0,114,103,0,0,0,114,104,0,0,0,250,18,60,109,111, + 100,117,108,101,32,123,33,114,125,32,40,123,125,41,62,41, + 5,114,17,0,0,0,114,114,0,0,0,114,110,0,0,0, + 114,46,0,0,0,114,124,0,0,0,41,2,114,96,0,0, + 0,114,17,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,108,0,0,0,63,2,0,0,115,18, + 0,0,0,20,3,10,1,10,1,10,1,14,2,6,2,14, + 1,16,2,255,128,114,108,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,10,0,0,0,67, + 0,0,0,115,252,0,0,0,124,0,106,0,125,2,116,1, + 124,2,131,1,143,218,1,0,116,2,106,3,160,4,124,2, + 161,1,124,1,117,1,114,54,100,1,160,5,124,2,161,1, + 125,3,116,6,124,3,124,2,100,2,141,2,130,1,122,132, + 124,0,106,7,100,3,117,0,114,106,124,0,106,8,100,3, + 117,0,114,90,116,6,100,4,124,0,106,0,100,2,141,2, + 130,1,116,9,124,0,124,1,100,5,100,6,141,3,1,0, + 110,52,116,9,124,0,124,1,100,5,100,6,141,3,1,0, + 116,10,124,0,106,7,100,7,131,2,115,146,124,0,106,7, + 160,11,124,2,161,1,1,0,110,12,124,0,106,7,160,12, + 124,1,161,1,1,0,87,0,116,2,106,3,160,13,124,0, + 106,0,161,1,125,1,124,1,116,2,106,3,124,0,106,0, + 60,0,110,28,116,2,106,3,160,13,124,0,106,0,161,1, + 125,1,124,1,116,2,106,3,124,0,106,0,60,0,48,0, + 87,0,100,3,4,0,4,0,131,3,1,0,124,1,83,0, + 49,0,115,238,48,0,1,0,1,0,1,0,89,0,1,0, + 124,1,83,0,41,8,122,70,69,120,101,99,117,116,101,32, + 116,104,101,32,115,112,101,99,39,115,32,115,112,101,99,105, + 102,105,101,100,32,109,111,100,117,108,101,32,105,110,32,97, + 110,32,101,120,105,115,116,105,110,103,32,109,111,100,117,108, + 101,39,115,32,110,97,109,101,115,112,97,99,101,46,122,30, + 109,111,100,117,108,101,32,123,33,114,125,32,110,111,116,32, + 105,110,32,115,121,115,46,109,111,100,117,108,101,115,114,16, + 0,0,0,78,250,14,109,105,115,115,105,110,103,32,108,111, + 97,100,101,114,84,114,144,0,0,0,114,151,0,0,0,41, + 14,114,17,0,0,0,114,51,0,0,0,114,15,0,0,0, + 114,93,0,0,0,114,35,0,0,0,114,46,0,0,0,114, + 80,0,0,0,114,110,0,0,0,114,117,0,0,0,114,149, + 0,0,0,114,4,0,0,0,218,11,108,111,97,100,95,109, + 111,100,117,108,101,114,151,0,0,0,218,3,112,111,112,41, + 4,114,96,0,0,0,114,97,0,0,0,114,17,0,0,0, + 218,3,109,115,103,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,94,0,0,0,80,2,0,0,115,44,0, + 0,0,6,2,10,1,16,1,10,1,12,1,2,1,10,1, + 10,1,14,1,16,2,14,2,12,1,14,4,14,2,14,4, + 14,1,14,255,26,1,4,1,16,255,4,1,255,128,114,94, 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,82,0,0, - 0,100,1,125,1,116,0,124,0,106,1,100,2,131,2,114, - 30,124,0,106,1,160,2,124,0,161,1,125,1,110,20,116, - 0,124,0,106,1,100,3,131,2,114,50,116,3,100,4,131, - 1,130,1,124,1,100,1,117,0,114,68,116,4,124,0,106, - 5,131,1,125,1,116,6,124,0,124,1,131,2,1,0,124, - 1,83,0,41,5,122,43,67,114,101,97,116,101,32,97,32, - 109,111,100,117,108,101,32,98,97,115,101,100,32,111,110,32, - 116,104,101,32,112,114,111,118,105,100,101,100,32,115,112,101, - 99,46,78,218,13,99,114,101,97,116,101,95,109,111,100,117, - 108,101,218,11,101,120,101,99,95,109,111,100,117,108,101,122, - 66,108,111,97,100,101,114,115,32,116,104,97,116,32,100,101, - 102,105,110,101,32,101,120,101,99,95,109,111,100,117,108,101, - 40,41,32,109,117,115,116,32,97,108,115,111,32,100,101,102, - 105,110,101,32,99,114,101,97,116,101,95,109,111,100,117,108, - 101,40,41,41,7,114,4,0,0,0,114,110,0,0,0,114, - 150,0,0,0,114,80,0,0,0,114,18,0,0,0,114,17, - 0,0,0,114,149,0,0,0,169,2,114,96,0,0,0,114, + 2,0,0,0,8,0,0,0,67,0,0,0,115,18,1,0, + 0,122,18,124,0,106,0,160,1,124,0,106,2,161,1,1, + 0,87,0,110,46,1,0,1,0,1,0,124,0,106,2,116, + 3,106,4,118,0,114,64,116,3,106,4,160,5,124,0,106, + 2,161,1,125,1,124,1,116,3,106,4,124,0,106,2,60, + 0,130,0,116,3,106,4,160,5,124,0,106,2,161,1,125, + 1,124,1,116,3,106,4,124,0,106,2,60,0,116,6,124, + 1,100,1,100,0,131,3,100,0,117,0,114,140,122,12,124, + 0,106,0,124,1,95,7,87,0,110,18,4,0,116,8,121, + 138,1,0,1,0,1,0,89,0,110,2,48,0,116,6,124, + 1,100,2,100,0,131,3,100,0,117,0,114,216,122,40,124, + 1,106,9,124,1,95,10,116,11,124,1,100,3,131,2,115, + 194,124,0,106,2,160,12,100,4,161,1,100,5,25,0,124, + 1,95,10,87,0,110,18,4,0,116,8,121,214,1,0,1, + 0,1,0,89,0,110,2,48,0,116,6,124,1,100,6,100, + 0,131,3,100,0,117,0,144,1,114,14,122,12,124,0,124, + 1,95,13,87,0,124,1,83,0,4,0,116,8,144,1,121, + 12,1,0,1,0,1,0,89,0,124,1,83,0,48,0,124, + 1,83,0,41,7,78,114,99,0,0,0,114,146,0,0,0, + 114,142,0,0,0,114,129,0,0,0,114,22,0,0,0,114, + 106,0,0,0,41,14,114,110,0,0,0,114,156,0,0,0, + 114,17,0,0,0,114,15,0,0,0,114,93,0,0,0,114, + 157,0,0,0,114,6,0,0,0,114,99,0,0,0,114,107, + 0,0,0,114,1,0,0,0,114,146,0,0,0,114,4,0, + 0,0,114,130,0,0,0,114,106,0,0,0,114,152,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,25,95,108,111,97,100,95,98,97,99,107,119,97,114,100, + 95,99,111,109,112,97,116,105,98,108,101,110,2,0,0,115, + 62,0,0,0,2,4,18,1,6,1,12,1,14,1,12,1, + 2,1,14,3,12,1,16,1,2,1,12,1,12,1,6,1, + 16,1,2,1,8,4,10,1,22,1,12,1,6,1,18,1, + 2,1,8,1,4,3,14,254,2,1,4,1,2,255,4,1, + 255,128,114,159,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,11,0,0,0,67,0,0,0, + 115,212,0,0,0,124,0,106,0,100,0,117,1,114,30,116, + 1,124,0,106,0,100,1,131,2,115,30,116,2,124,0,131, + 1,83,0,116,3,124,0,131,1,125,1,100,2,124,0,95, + 4,122,158,124,1,116,5,106,6,124,0,106,7,60,0,122, + 50,124,0,106,0,100,0,117,0,114,94,124,0,106,8,100, + 0,117,0,114,106,116,9,100,3,124,0,106,7,100,4,141, + 2,130,1,124,0,106,0,160,10,124,1,161,1,1,0,87, + 0,110,40,1,0,1,0,1,0,122,14,116,5,106,6,124, + 0,106,7,61,0,87,0,130,0,4,0,116,11,121,148,1, + 0,1,0,1,0,89,0,130,0,48,0,116,5,106,6,160, + 12,124,0,106,7,161,1,125,1,124,1,116,5,106,6,124, + 0,106,7,60,0,116,13,100,5,124,0,106,7,124,0,106, + 0,131,3,1,0,87,0,100,6,124,0,95,4,124,1,83, + 0,100,6,124,0,95,4,48,0,41,7,78,114,151,0,0, + 0,84,114,155,0,0,0,114,16,0,0,0,122,18,105,109, + 112,111,114,116,32,123,33,114,125,32,35,32,123,33,114,125, + 70,41,14,114,110,0,0,0,114,4,0,0,0,114,159,0, + 0,0,114,153,0,0,0,90,13,95,105,110,105,116,105,97, + 108,105,122,105,110,103,114,15,0,0,0,114,93,0,0,0, + 114,17,0,0,0,114,117,0,0,0,114,80,0,0,0,114, + 151,0,0,0,114,64,0,0,0,114,157,0,0,0,114,77, + 0,0,0,114,152,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,14,95,108,111,97,100,95,117, + 110,108,111,99,107,101,100,147,2,0,0,115,54,0,0,0, + 10,2,12,2,8,1,8,2,6,5,2,1,12,1,2,1, + 10,1,10,1,14,1,16,3,6,1,2,1,12,1,2,3, + 12,254,2,1,2,1,2,255,14,6,12,1,18,1,6,2, + 4,2,8,254,255,128,114,160,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0, + 67,0,0,0,115,54,0,0,0,116,0,124,0,106,1,131, + 1,143,24,1,0,116,2,124,0,131,1,87,0,2,0,100, + 1,4,0,4,0,131,3,1,0,83,0,49,0,115,40,48, + 0,1,0,1,0,1,0,89,0,1,0,100,1,83,0,41, + 2,122,191,82,101,116,117,114,110,32,97,32,110,101,119,32, + 109,111,100,117,108,101,32,111,98,106,101,99,116,44,32,108, + 111,97,100,101,100,32,98,121,32,116,104,101,32,115,112,101, + 99,39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111,32,105,116,115,32, + 112,97,114,101,110,116,46,10,10,32,32,32,32,73,102,32, + 97,32,109,111,100,117,108,101,32,105,115,32,97,108,114,101, + 97,100,121,32,105,110,32,115,121,115,46,109,111,100,117,108, + 101,115,44,32,116,104,97,116,32,101,120,105,115,116,105,110, + 103,32,109,111,100,117,108,101,32,103,101,116,115,10,32,32, + 32,32,99,108,111,98,98,101,114,101,100,46,10,10,32,32, + 32,32,78,41,3,114,51,0,0,0,114,17,0,0,0,114, + 160,0,0,0,41,1,114,96,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,95,0,0,0,189, + 2,0,0,115,8,0,0,0,12,9,38,1,4,128,255,128, + 114,95,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,64,0,0,0,115,140, + 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, + 2,90,4,101,5,100,3,100,4,132,0,131,1,90,6,101, + 7,100,20,100,6,100,7,132,1,131,1,90,8,101,7,100, + 21,100,8,100,9,132,1,131,1,90,9,101,7,100,10,100, + 11,132,0,131,1,90,10,101,7,100,12,100,13,132,0,131, + 1,90,11,101,7,101,12,100,14,100,15,132,0,131,1,131, + 1,90,13,101,7,101,12,100,16,100,17,132,0,131,1,131, + 1,90,14,101,7,101,12,100,18,100,19,132,0,131,1,131, + 1,90,15,101,7,101,16,131,1,90,17,100,5,83,0,41, + 22,218,15,66,117,105,108,116,105,110,73,109,112,111,114,116, + 101,114,122,144,77,101,116,97,32,112,97,116,104,32,105,109, + 112,111,114,116,32,102,111,114,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,115,46,10,10,32,32,32,32, + 65,108,108,32,109,101,116,104,111,100,115,32,97,114,101,32, + 101,105,116,104,101,114,32,99,108,97,115,115,32,111,114,32, + 115,116,97,116,105,99,32,109,101,116,104,111,100,115,32,116, + 111,32,97,118,111,105,100,32,116,104,101,32,110,101,101,100, + 32,116,111,10,32,32,32,32,105,110,115,116,97,110,116,105, + 97,116,101,32,116,104,101,32,99,108,97,115,115,46,10,10, + 32,32,32,32,122,8,98,117,105,108,116,45,105,110,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5, + 0,0,0,67,0,0,0,115,22,0,0,0,100,1,124,0, + 106,0,155,2,100,2,116,1,106,2,155,0,100,3,157,5, + 83,0,41,5,250,115,82,101,116,117,114,110,32,114,101,112, + 114,32,102,111,114,32,116,104,101,32,109,111,100,117,108,101, + 46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,84,104,101,32,105,109,112,111,114,116, + 32,109,97,99,104,105,110,101,114,121,32,100,111,101,115,32, + 116,104,101,32,106,111,98,32,105,116,115,101,108,102,46,10, + 10,32,32,32,32,32,32,32,32,122,8,60,109,111,100,117, + 108,101,32,122,2,32,40,122,2,41,62,78,41,3,114,1, + 0,0,0,114,161,0,0,0,114,139,0,0,0,41,1,114, 97,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,16,109,111,100,117,108,101,95,102,114,111,109, - 95,115,112,101,99,46,2,0,0,115,20,0,0,0,4,3, - 12,1,14,3,12,1,8,1,8,2,10,1,10,1,4,1, - 255,128,114,153,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,67,0,0,0, - 115,100,0,0,0,124,0,106,0,100,1,117,0,114,14,100, - 2,110,4,124,0,106,0,125,1,124,0,106,1,100,1,117, - 0,114,64,124,0,106,2,100,1,117,0,114,50,100,3,160, - 3,124,1,161,1,83,0,100,4,160,3,124,1,124,0,106, - 2,161,2,83,0,124,0,106,4,114,84,100,5,160,3,124, - 1,124,0,106,1,161,2,83,0,100,6,160,3,124,0,106, - 0,124,0,106,1,161,2,83,0,41,7,122,38,82,101,116, - 117,114,110,32,116,104,101,32,114,101,112,114,32,116,111,32, - 117,115,101,32,102,111,114,32,116,104,101,32,109,111,100,117, - 108,101,46,78,114,101,0,0,0,114,102,0,0,0,114,103, - 0,0,0,114,104,0,0,0,250,18,60,109,111,100,117,108, - 101,32,123,33,114,125,32,40,123,125,41,62,41,5,114,17, - 0,0,0,114,114,0,0,0,114,110,0,0,0,114,46,0, - 0,0,114,124,0,0,0,41,2,114,96,0,0,0,114,17, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,108,0,0,0,63,2,0,0,115,18,0,0,0, - 20,3,10,1,10,1,10,1,14,2,6,2,14,1,16,2, - 255,128,114,108,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,10,0,0,0,67,0,0,0, - 115,252,0,0,0,124,0,106,0,125,2,116,1,124,2,131, - 1,143,218,1,0,116,2,106,3,160,4,124,2,161,1,124, - 1,117,1,114,54,100,1,160,5,124,2,161,1,125,3,116, - 6,124,3,124,2,100,2,141,2,130,1,122,132,124,0,106, - 7,100,3,117,0,114,106,124,0,106,8,100,3,117,0,114, - 90,116,6,100,4,124,0,106,0,100,2,141,2,130,1,116, - 9,124,0,124,1,100,5,100,6,141,3,1,0,110,52,116, - 9,124,0,124,1,100,5,100,6,141,3,1,0,116,10,124, - 0,106,7,100,7,131,2,115,146,124,0,106,7,160,11,124, - 2,161,1,1,0,110,12,124,0,106,7,160,12,124,1,161, - 1,1,0,87,0,116,2,106,3,160,13,124,0,106,0,161, - 1,125,1,124,1,116,2,106,3,124,0,106,0,60,0,110, - 28,116,2,106,3,160,13,124,0,106,0,161,1,125,1,124, - 1,116,2,106,3,124,0,106,0,60,0,48,0,87,0,100, - 3,4,0,4,0,131,3,1,0,124,1,83,0,49,0,115, - 238,48,0,1,0,1,0,1,0,89,0,1,0,124,1,83, - 0,41,8,122,70,69,120,101,99,117,116,101,32,116,104,101, - 32,115,112,101,99,39,115,32,115,112,101,99,105,102,105,101, - 100,32,109,111,100,117,108,101,32,105,110,32,97,110,32,101, - 120,105,115,116,105,110,103,32,109,111,100,117,108,101,39,115, - 32,110,97,109,101,115,112,97,99,101,46,122,30,109,111,100, - 117,108,101,32,123,33,114,125,32,110,111,116,32,105,110,32, - 115,121,115,46,109,111,100,117,108,101,115,114,16,0,0,0, - 78,250,14,109,105,115,115,105,110,103,32,108,111,97,100,101, - 114,84,114,144,0,0,0,114,151,0,0,0,41,14,114,17, - 0,0,0,114,51,0,0,0,114,15,0,0,0,114,93,0, - 0,0,114,35,0,0,0,114,46,0,0,0,114,80,0,0, - 0,114,110,0,0,0,114,117,0,0,0,114,149,0,0,0, - 114,4,0,0,0,218,11,108,111,97,100,95,109,111,100,117, - 108,101,114,151,0,0,0,218,3,112,111,112,41,4,114,96, - 0,0,0,114,97,0,0,0,114,17,0,0,0,218,3,109, - 115,103,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,94,0,0,0,80,2,0,0,115,44,0,0,0,6, - 2,10,1,16,1,10,1,12,1,2,1,10,1,10,1,14, - 1,16,2,14,2,12,1,14,4,14,2,14,4,14,1,14, - 255,26,1,4,1,16,255,4,1,255,128,114,94,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,8,0,0,0,67,0,0,0,115,18,1,0,0,122,18, - 124,0,106,0,160,1,124,0,106,2,161,1,1,0,87,0, - 110,46,1,0,1,0,1,0,124,0,106,2,116,3,106,4, - 118,0,114,64,116,3,106,4,160,5,124,0,106,2,161,1, - 125,1,124,1,116,3,106,4,124,0,106,2,60,0,130,0, - 116,3,106,4,160,5,124,0,106,2,161,1,125,1,124,1, - 116,3,106,4,124,0,106,2,60,0,116,6,124,1,100,1, - 100,0,131,3,100,0,117,0,114,140,122,12,124,0,106,0, - 124,1,95,7,87,0,110,18,4,0,116,8,121,138,1,0, - 1,0,1,0,89,0,110,2,48,0,116,6,124,1,100,2, - 100,0,131,3,100,0,117,0,114,216,122,40,124,1,106,9, - 124,1,95,10,116,11,124,1,100,3,131,2,115,194,124,0, - 106,2,160,12,100,4,161,1,100,5,25,0,124,1,95,10, - 87,0,110,18,4,0,116,8,121,214,1,0,1,0,1,0, - 89,0,110,2,48,0,116,6,124,1,100,6,100,0,131,3, - 100,0,117,0,144,1,114,14,122,12,124,0,124,1,95,13, - 87,0,124,1,83,0,4,0,116,8,144,1,121,12,1,0, - 1,0,1,0,89,0,124,1,83,0,48,0,124,1,83,0, - 41,7,78,114,99,0,0,0,114,146,0,0,0,114,142,0, - 0,0,114,129,0,0,0,114,22,0,0,0,114,106,0,0, - 0,41,14,114,110,0,0,0,114,156,0,0,0,114,17,0, - 0,0,114,15,0,0,0,114,93,0,0,0,114,157,0,0, - 0,114,6,0,0,0,114,99,0,0,0,114,107,0,0,0, - 114,1,0,0,0,114,146,0,0,0,114,4,0,0,0,114, - 130,0,0,0,114,106,0,0,0,114,152,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,25,95, - 108,111,97,100,95,98,97,99,107,119,97,114,100,95,99,111, - 109,112,97,116,105,98,108,101,110,2,0,0,115,62,0,0, - 0,2,4,18,1,6,1,12,1,14,1,12,1,2,1,14, - 3,12,1,16,1,2,1,12,1,12,1,6,1,16,1,2, - 1,8,4,10,1,22,1,12,1,6,1,18,1,2,1,8, - 1,4,3,14,254,2,1,4,1,2,255,4,1,255,128,114, - 159,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,11,0,0,0,67,0,0,0,115,212,0, - 0,0,124,0,106,0,100,0,117,1,114,30,116,1,124,0, - 106,0,100,1,131,2,115,30,116,2,124,0,131,1,83,0, - 116,3,124,0,131,1,125,1,100,2,124,0,95,4,122,158, - 124,1,116,5,106,6,124,0,106,7,60,0,122,50,124,0, - 106,0,100,0,117,0,114,94,124,0,106,8,100,0,117,0, - 114,106,116,9,100,3,124,0,106,7,100,4,141,2,130,1, - 124,0,106,0,160,10,124,1,161,1,1,0,87,0,110,40, - 1,0,1,0,1,0,122,14,116,5,106,6,124,0,106,7, - 61,0,87,0,130,0,4,0,116,11,121,148,1,0,1,0, - 1,0,89,0,130,0,48,0,116,5,106,6,160,12,124,0, - 106,7,161,1,125,1,124,1,116,5,106,6,124,0,106,7, - 60,0,116,13,100,5,124,0,106,7,124,0,106,0,131,3, - 1,0,87,0,100,6,124,0,95,4,124,1,83,0,100,6, - 124,0,95,4,48,0,41,7,78,114,151,0,0,0,84,114, - 155,0,0,0,114,16,0,0,0,122,18,105,109,112,111,114, - 116,32,123,33,114,125,32,35,32,123,33,114,125,70,41,14, - 114,110,0,0,0,114,4,0,0,0,114,159,0,0,0,114, - 153,0,0,0,90,13,95,105,110,105,116,105,97,108,105,122, - 105,110,103,114,15,0,0,0,114,93,0,0,0,114,17,0, - 0,0,114,117,0,0,0,114,80,0,0,0,114,151,0,0, - 0,114,64,0,0,0,114,157,0,0,0,114,77,0,0,0, - 114,152,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,14,95,108,111,97,100,95,117,110,108,111, - 99,107,101,100,147,2,0,0,115,54,0,0,0,10,2,12, - 2,8,1,8,2,6,5,2,1,12,1,2,1,10,1,10, - 1,14,1,16,3,6,1,2,1,12,1,2,3,12,254,2, - 1,2,1,2,255,14,6,12,1,18,1,6,2,4,2,8, - 254,255,128,114,160,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,8,0,0,0,67,0,0, - 0,115,54,0,0,0,116,0,124,0,106,1,131,1,143,24, - 1,0,116,2,124,0,131,1,87,0,2,0,100,1,4,0, - 4,0,131,3,1,0,83,0,49,0,115,40,48,0,1,0, - 1,0,1,0,89,0,1,0,100,1,83,0,41,2,122,191, - 82,101,116,117,114,110,32,97,32,110,101,119,32,109,111,100, - 117,108,101,32,111,98,106,101,99,116,44,32,108,111,97,100, - 101,100,32,98,121,32,116,104,101,32,115,112,101,99,39,115, - 32,108,111,97,100,101,114,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, - 97,100,100,101,100,32,116,111,32,105,116,115,32,112,97,114, - 101,110,116,46,10,10,32,32,32,32,73,102,32,97,32,109, - 111,100,117,108,101,32,105,115,32,97,108,114,101,97,100,121, - 32,105,110,32,115,121,115,46,109,111,100,117,108,101,115,44, - 32,116,104,97,116,32,101,120,105,115,116,105,110,103,32,109, - 111,100,117,108,101,32,103,101,116,115,10,32,32,32,32,99, - 108,111,98,98,101,114,101,100,46,10,10,32,32,32,32,78, - 41,3,114,51,0,0,0,114,17,0,0,0,114,160,0,0, - 0,41,1,114,96,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,95,0,0,0,189,2,0,0, - 115,8,0,0,0,12,9,38,1,4,128,255,128,114,95,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,64,0,0,0,115,140,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, - 101,5,100,3,100,4,132,0,131,1,90,6,101,7,100,20, - 100,6,100,7,132,1,131,1,90,8,101,7,100,21,100,8, - 100,9,132,1,131,1,90,9,101,7,100,10,100,11,132,0, - 131,1,90,10,101,7,100,12,100,13,132,0,131,1,90,11, - 101,7,101,12,100,14,100,15,132,0,131,1,131,1,90,13, - 101,7,101,12,100,16,100,17,132,0,131,1,131,1,90,14, - 101,7,101,12,100,18,100,19,132,0,131,1,131,1,90,15, - 101,7,101,16,131,1,90,17,100,5,83,0,41,22,218,15, - 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,122, - 144,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, - 116,32,102,111,114,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, - 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, - 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, - 116,105,99,32,109,101,116,104,111,100,115,32,116,111,32,97, - 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, - 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, - 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, - 32,122,8,98,117,105,108,116,45,105,110,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0, - 67,0,0,0,115,22,0,0,0,100,1,124,0,106,0,155, - 2,100,2,116,1,106,2,155,0,100,3,157,5,83,0,41, - 4,250,115,82,101,116,117,114,110,32,114,101,112,114,32,102, - 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, - 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, - 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, - 32,32,32,32,32,32,122,8,60,109,111,100,117,108,101,32, - 122,2,32,40,122,2,41,62,41,3,114,1,0,0,0,114, - 161,0,0,0,114,139,0,0,0,41,1,114,97,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 100,0,0,0,215,2,0,0,115,4,0,0,0,22,7,255, + 0,0,0,114,100,0,0,0,215,2,0,0,115,4,0,0, + 0,22,7,255,128,122,27,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,4,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,5,0,0,0,67,0,0,0,115,42,0,0, + 0,124,2,100,0,117,1,114,12,100,0,83,0,116,0,160, + 1,124,1,161,1,114,38,116,2,124,1,124,0,124,0,106, + 3,100,1,141,3,83,0,100,0,83,0,169,2,78,114,138, + 0,0,0,41,4,114,58,0,0,0,90,10,105,115,95,98, + 117,105,108,116,105,110,114,92,0,0,0,114,139,0,0,0, + 169,4,218,3,99,108,115,114,82,0,0,0,218,4,112,97, + 116,104,218,6,116,97,114,103,101,116,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,9,102,105,110,100,95, + 115,112,101,99,224,2,0,0,115,12,0,0,0,8,2,4, + 1,10,1,16,1,4,2,255,128,122,25,66,117,105,108,116, + 105,110,73,109,112,111,114,116,101,114,46,102,105,110,100,95, + 115,112,101,99,99,3,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,4,0,0,0,67,0,0,0,115,30,0, + 0,0,124,0,160,0,124,1,124,2,161,2,125,3,124,3, + 100,1,117,1,114,26,124,3,106,1,83,0,100,1,83,0, + 41,2,122,175,70,105,110,100,32,116,104,101,32,98,117,105, + 108,116,45,105,110,32,109,111,100,117,108,101,46,10,10,32, + 32,32,32,32,32,32,32,73,102,32,39,112,97,116,104,39, + 32,105,115,32,101,118,101,114,32,115,112,101,99,105,102,105, + 101,100,32,116,104,101,110,32,116,104,101,32,115,101,97,114, + 99,104,32,105,115,32,99,111,110,115,105,100,101,114,101,100, + 32,97,32,102,97,105,108,117,114,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, + 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, + 32,32,32,78,41,2,114,168,0,0,0,114,110,0,0,0, + 41,4,114,165,0,0,0,114,82,0,0,0,114,166,0,0, + 0,114,96,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,11,102,105,110,100,95,109,111,100,117, + 108,101,233,2,0,0,115,6,0,0,0,12,9,18,1,255, 128,122,27,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, - 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 5,0,0,0,67,0,0,0,115,42,0,0,0,124,2,100, - 0,117,1,114,12,100,0,83,0,116,0,160,1,124,1,161, - 1,114,38,116,2,124,1,124,0,124,0,106,3,100,1,141, - 3,83,0,100,0,83,0,169,2,78,114,138,0,0,0,41, - 4,114,58,0,0,0,90,10,105,115,95,98,117,105,108,116, - 105,110,114,92,0,0,0,114,139,0,0,0,169,4,218,3, - 99,108,115,114,82,0,0,0,218,4,112,97,116,104,218,6, - 116,97,114,103,101,116,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,9,102,105,110,100,95,115,112,101,99, - 224,2,0,0,115,12,0,0,0,8,2,4,1,10,1,16, - 1,4,2,255,128,122,25,66,117,105,108,116,105,110,73,109, - 112,111,114,116,101,114,46,102,105,110,100,95,115,112,101,99, - 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,30,0,0,0,124,0, - 160,0,124,1,124,2,161,2,125,3,124,3,100,1,117,1, - 114,26,124,3,106,1,83,0,100,1,83,0,41,2,122,175, - 70,105,110,100,32,116,104,101,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, - 32,32,32,73,102,32,39,112,97,116,104,39,32,105,115,32, - 101,118,101,114,32,115,112,101,99,105,102,105,101,100,32,116, - 104,101,110,32,116,104,101,32,115,101,97,114,99,104,32,105, - 115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,102, - 97,105,108,117,114,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, - 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, - 41,2,114,168,0,0,0,114,110,0,0,0,41,4,114,165, - 0,0,0,114,82,0,0,0,114,166,0,0,0,114,96,0, + 101,114,46,102,105,110,100,95,109,111,100,117,108,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, + 0,0,0,67,0,0,0,115,46,0,0,0,124,1,106,0, + 116,1,106,2,118,1,114,34,116,3,100,1,160,4,124,1, + 106,0,161,1,124,1,106,0,100,2,141,2,130,1,116,5, + 116,6,106,7,124,1,131,2,83,0,41,4,122,24,67,114, + 101,97,116,101,32,97,32,98,117,105,108,116,45,105,110,32, + 109,111,100,117,108,101,114,78,0,0,0,114,16,0,0,0, + 78,41,8,114,17,0,0,0,114,15,0,0,0,114,79,0, + 0,0,114,80,0,0,0,114,46,0,0,0,114,68,0,0, + 0,114,58,0,0,0,90,14,99,114,101,97,116,101,95,98, + 117,105,108,116,105,110,41,2,114,30,0,0,0,114,96,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,11,102,105,110,100,95,109,111,100,117,108,101,233,2, - 0,0,115,6,0,0,0,12,9,18,1,255,128,122,27,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,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,46,0,0,0,124,1,106,0,116,1,106,2, - 118,1,114,34,116,3,100,1,160,4,124,1,106,0,161,1, - 124,1,106,0,100,2,141,2,130,1,116,5,116,6,106,7, - 124,1,131,2,83,0,41,3,122,24,67,114,101,97,116,101, + 0,114,150,0,0,0,245,2,0,0,115,12,0,0,0,12, + 3,12,1,4,1,6,255,12,2,255,128,122,29,66,117,105, + 108,116,105,110,73,109,112,111,114,116,101,114,46,99,114,101, + 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, + 0,0,0,115,16,0,0,0,116,0,116,1,106,2,124,1, + 131,2,1,0,100,1,83,0,41,2,122,22,69,120,101,99, 32,97,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,114,78,0,0,0,114,16,0,0,0,41,8,114,17, - 0,0,0,114,15,0,0,0,114,79,0,0,0,114,80,0, - 0,0,114,46,0,0,0,114,68,0,0,0,114,58,0,0, - 0,90,14,99,114,101,97,116,101,95,98,117,105,108,116,105, - 110,41,2,114,30,0,0,0,114,96,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,150,0,0, - 0,245,2,0,0,115,12,0,0,0,12,3,12,1,4,1, - 6,255,12,2,255,128,122,29,66,117,105,108,116,105,110,73, - 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,16, - 0,0,0,116,0,116,1,106,2,124,1,131,2,1,0,100, - 1,83,0,41,2,122,22,69,120,101,99,32,97,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,78,41,3, - 114,68,0,0,0,114,58,0,0,0,90,12,101,120,101,99, - 95,98,117,105,108,116,105,110,41,2,114,30,0,0,0,114, - 97,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,151,0,0,0,253,2,0,0,115,6,0,0, - 0,12,3,4,128,255,128,122,27,66,117,105,108,116,105,110, - 73,109,112,111,114,116,101,114,46,101,120,101,99,95,109,111, - 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,41,2,122,57,82,101,116,117,114,110, - 32,78,111,110,101,32,97,115,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,115,32,100,111,32,110,111,116, - 32,104,97,118,101,32,99,111,100,101,32,111,98,106,101,99, - 116,115,46,78,114,10,0,0,0,169,2,114,165,0,0,0, - 114,82,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,8,103,101,116,95,99,111,100,101,2,3, - 0,0,115,4,0,0,0,4,4,255,128,122,24,66,117,105, + 108,101,78,41,3,114,68,0,0,0,114,58,0,0,0,90, + 12,101,120,101,99,95,98,117,105,108,116,105,110,41,2,114, + 30,0,0,0,114,97,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,151,0,0,0,253,2,0, + 0,115,6,0,0,0,12,3,4,128,255,128,122,27,66,117, + 105,108,116,105,110,73,109,112,111,114,116,101,114,46,101,120, + 101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,57,82, + 101,116,117,114,110,32,78,111,110,101,32,97,115,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,100, + 111,32,110,111,116,32,104,97,118,101,32,99,111,100,101,32, + 111,98,106,101,99,116,115,46,78,114,10,0,0,0,169,2, + 114,165,0,0,0,114,82,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,8,103,101,116,95,99, + 111,100,101,2,3,0,0,115,4,0,0,0,4,4,255,128, + 122,24,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,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,56, + 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, + 100,111,32,110,111,116,32,104,97,118,101,32,115,111,117,114, + 99,101,32,99,111,100,101,46,78,114,10,0,0,0,114,170, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,10,103,101,116,95,115,111,117,114,99,101,8,3, + 0,0,115,4,0,0,0,4,4,255,128,122,26,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,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,122,56,82,101,116,117,114, - 110,32,78,111,110,101,32,97,115,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,32,100,111,32,110,111, - 116,32,104,97,118,101,32,115,111,117,114,99,101,32,99,111, - 100,101,46,78,114,10,0,0,0,114,170,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,10,103, - 101,116,95,115,111,117,114,99,101,8,3,0,0,115,4,0, - 0,0,4,4,255,128,122,26,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,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,52,82,101,116,117,114,110,32,70, - 97,108,115,101,32,97,115,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,115,32,97,114,101,32,110,101,118, - 101,114,32,112,97,99,107,97,103,101,115,46,70,114,10,0, - 0,0,114,170,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,116,0,0,0,14,3,0,0,115, - 4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41,18,114,1,0, - 0,0,114,0,0,0,0,114,2,0,0,0,114,3,0,0, - 0,114,139,0,0,0,218,12,115,116,97,116,105,99,109,101, - 116,104,111,100,114,100,0,0,0,218,11,99,108,97,115,115, - 109,101,116,104,111,100,114,168,0,0,0,114,169,0,0,0, - 114,150,0,0,0,114,151,0,0,0,114,87,0,0,0,114, - 171,0,0,0,114,172,0,0,0,114,116,0,0,0,114,98, - 0,0,0,114,156,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,161,0,0, - 0,204,2,0,0,115,48,0,0,0,8,0,4,2,4,7, - 2,2,10,1,2,8,12,1,2,8,12,1,2,11,10,1, - 2,7,10,1,2,4,2,1,12,1,2,4,2,1,12,1, - 2,4,2,1,12,1,12,4,255,128,114,161,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,64,0,0,0,115,144,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,90,4,101,5,100, - 3,100,4,132,0,131,1,90,6,101,7,100,22,100,6,100, - 7,132,1,131,1,90,8,101,7,100,23,100,8,100,9,132, - 1,131,1,90,9,101,7,100,10,100,11,132,0,131,1,90, - 10,101,5,100,12,100,13,132,0,131,1,90,11,101,7,100, - 14,100,15,132,0,131,1,90,12,101,7,101,13,100,16,100, - 17,132,0,131,1,131,1,90,14,101,7,101,13,100,18,100, - 19,132,0,131,1,131,1,90,15,101,7,101,13,100,20,100, - 21,132,0,131,1,131,1,90,16,100,5,83,0,41,24,218, - 14,70,114,111,122,101,110,73,109,112,111,114,116,101,114,122, - 142,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, - 116,32,102,111,114,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,115,46,10,10,32,32,32,32,65,108,108,32,109, - 101,116,104,111,100,115,32,97,114,101,32,101,105,116,104,101, - 114,32,99,108,97,115,115,32,111,114,32,115,116,97,116,105, - 99,32,109,101,116,104,111,100,115,32,116,111,32,97,118,111, - 105,100,32,116,104,101,32,110,101,101,100,32,116,111,10,32, - 32,32,32,105,110,115,116,97,110,116,105,97,116,101,32,116, - 104,101,32,99,108,97,115,115,46,10,10,32,32,32,32,90, - 6,102,114,111,122,101,110,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, - 115,16,0,0,0,100,1,160,0,124,0,106,1,116,2,106, - 3,161,2,83,0,41,2,114,162,0,0,0,114,154,0,0, - 0,41,4,114,46,0,0,0,114,1,0,0,0,114,175,0, - 0,0,114,139,0,0,0,41,1,218,1,109,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,100,0,0,0, - 34,3,0,0,115,4,0,0,0,16,7,255,128,122,26,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,4,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, - 0,0,0,115,30,0,0,0,116,0,160,1,124,1,161,1, - 114,26,116,2,124,1,124,0,124,0,106,3,100,1,141,3, - 83,0,100,0,83,0,114,163,0,0,0,41,4,114,58,0, - 0,0,114,89,0,0,0,114,92,0,0,0,114,139,0,0, - 0,114,164,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,168,0,0,0,43,3,0,0,115,8, - 0,0,0,10,2,16,1,4,2,255,128,122,24,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,102,105,110,100, - 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,18, - 0,0,0,116,0,160,1,124,1,161,1,114,14,124,0,83, - 0,100,1,83,0,41,2,122,93,70,105,110,100,32,97,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, - 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,41,2,114,58,0,0,0,114,89, - 0,0,0,41,3,114,165,0,0,0,114,82,0,0,0,114, - 166,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,169,0,0,0,50,3,0,0,115,4,0,0, - 0,18,7,255,128,122,26,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,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,42,85,115,101,32,100,101,102,97,117, - 108,116,32,115,101,109,97,110,116,105,99,115,32,102,111,114, - 32,109,111,100,117,108,101,32,99,114,101,97,116,105,111,110, - 46,78,114,10,0,0,0,41,2,114,165,0,0,0,114,96, + 95,115,111,117,114,99,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,3,122,52,82,101,116, + 117,114,110,32,70,97,108,115,101,32,97,115,32,98,117,105, + 108,116,45,105,110,32,109,111,100,117,108,101,115,32,97,114, + 101,32,110,101,118,101,114,32,112,97,99,107,97,103,101,115, + 46,70,78,114,10,0,0,0,114,170,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,116,0,0, + 0,14,3,0,0,115,4,0,0,0,4,4,255,128,122,26, + 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,41,2,78,78,41,1, + 78,41,18,114,1,0,0,0,114,0,0,0,0,114,2,0, + 0,0,114,3,0,0,0,114,139,0,0,0,218,12,115,116, + 97,116,105,99,109,101,116,104,111,100,114,100,0,0,0,218, + 11,99,108,97,115,115,109,101,116,104,111,100,114,168,0,0, + 0,114,169,0,0,0,114,150,0,0,0,114,151,0,0,0, + 114,87,0,0,0,114,171,0,0,0,114,172,0,0,0,114, + 116,0,0,0,114,98,0,0,0,114,156,0,0,0,114,10, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,150,0,0,0,59,3,0,0,115,4,0,0,0, - 4,128,255,128,122,28,70,114,111,122,101,110,73,109,112,111, - 114,116,101,114,46,99,114,101,97,116,101,95,109,111,100,117, - 108,101,99,1,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,4,0,0,0,67,0,0,0,115,64,0,0,0, - 124,0,106,0,106,1,125,1,116,2,160,3,124,1,161,1, - 115,36,116,4,100,1,160,5,124,1,161,1,124,1,100,2, - 141,2,130,1,116,6,116,2,106,7,124,1,131,2,125,2, - 116,8,124,2,124,0,106,9,131,2,1,0,100,0,83,0, - 114,88,0,0,0,41,10,114,106,0,0,0,114,17,0,0, - 0,114,58,0,0,0,114,89,0,0,0,114,80,0,0,0, - 114,46,0,0,0,114,68,0,0,0,218,17,103,101,116,95, - 102,114,111,122,101,110,95,111,98,106,101,99,116,218,4,101, - 120,101,99,114,7,0,0,0,41,3,114,97,0,0,0,114, - 17,0,0,0,218,4,99,111,100,101,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,151,0,0,0,63,3, - 0,0,115,18,0,0,0,8,2,10,1,10,1,2,1,6, - 255,12,2,12,1,4,128,255,128,122,26,70,114,111,122,101, - 110,73,109,112,111,114,116,101,114,46,101,120,101,99,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, - 0,0,0,116,0,124,0,124,1,131,2,83,0,41,1,122, - 95,76,111,97,100,32,97,32,102,114,111,122,101,110,32,109, - 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, - 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, - 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, - 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, - 41,1,114,98,0,0,0,114,170,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,156,0,0,0, - 72,3,0,0,115,4,0,0,0,10,7,255,128,122,26,70, - 114,111,122,101,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,0,114,161,0,0,0,204,2,0,0,115,48,0,0,0, + 8,0,4,2,4,7,2,2,10,1,2,8,12,1,2,8, + 12,1,2,11,10,1,2,7,10,1,2,4,2,1,12,1, + 2,4,2,1,12,1,2,4,2,1,12,1,12,4,255,128, + 114,161,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,64,0,0,0,115,144, + 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, + 2,90,4,101,5,100,3,100,4,132,0,131,1,90,6,101, + 7,100,22,100,6,100,7,132,1,131,1,90,8,101,7,100, + 23,100,8,100,9,132,1,131,1,90,9,101,7,100,10,100, + 11,132,0,131,1,90,10,101,5,100,12,100,13,132,0,131, + 1,90,11,101,7,100,14,100,15,132,0,131,1,90,12,101, + 7,101,13,100,16,100,17,132,0,131,1,131,1,90,14,101, + 7,101,13,100,18,100,19,132,0,131,1,131,1,90,15,101, + 7,101,13,100,20,100,21,132,0,131,1,131,1,90,16,100, + 5,83,0,41,24,218,14,70,114,111,122,101,110,73,109,112, + 111,114,116,101,114,122,142,77,101,116,97,32,112,97,116,104, + 32,105,109,112,111,114,116,32,102,111,114,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,115,46,10,10,32,32,32, + 32,65,108,108,32,109,101,116,104,111,100,115,32,97,114,101, + 32,101,105,116,104,101,114,32,99,108,97,115,115,32,111,114, + 32,115,116,97,116,105,99,32,109,101,116,104,111,100,115,32, + 116,111,32,97,118,111,105,100,32,116,104,101,32,110,101,101, + 100,32,116,111,10,32,32,32,32,105,110,115,116,97,110,116, + 105,97,116,101,32,116,104,101,32,99,108,97,115,115,46,10, + 10,32,32,32,32,90,6,102,114,111,122,101,110,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, + 0,0,67,0,0,0,115,16,0,0,0,100,1,160,0,124, + 0,106,1,116,2,106,3,161,2,83,0,41,3,114,162,0, + 0,0,114,154,0,0,0,78,41,4,114,46,0,0,0,114, + 1,0,0,0,114,175,0,0,0,114,139,0,0,0,41,1, + 218,1,109,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,100,0,0,0,34,3,0,0,115,4,0,0,0, + 16,7,255,128,122,26,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,4,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,5,0,0,0,67,0,0,0,115,30,0,0,0,116, + 0,160,1,124,1,161,1,114,26,116,2,124,1,124,0,124, + 0,106,3,100,1,141,3,83,0,100,0,83,0,114,163,0, + 0,0,41,4,114,58,0,0,0,114,89,0,0,0,114,92, + 0,0,0,114,139,0,0,0,114,164,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,168,0,0, + 0,43,3,0,0,115,8,0,0,0,10,2,16,1,4,2, + 255,128,122,24,70,114,111,122,101,110,73,109,112,111,114,116, + 101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, + 0,67,0,0,0,115,18,0,0,0,116,0,160,1,124,1, + 161,1,114,14,124,0,83,0,100,1,83,0,41,2,122,93, + 70,105,110,100,32,97,32,102,114,111,122,101,110,32,109,111, + 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, + 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, + 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,2, + 114,58,0,0,0,114,89,0,0,0,41,3,114,165,0,0, + 0,114,82,0,0,0,114,166,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,169,0,0,0,50, + 3,0,0,115,4,0,0,0,18,7,255,128,122,26,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,42,85,115, + 101,32,100,101,102,97,117,108,116,32,115,101,109,97,110,116, + 105,99,115,32,102,111,114,32,109,111,100,117,108,101,32,99, + 114,101,97,116,105,111,110,46,78,114,10,0,0,0,41,2, + 114,165,0,0,0,114,96,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,150,0,0,0,59,3, + 0,0,115,4,0,0,0,4,128,255,128,122,28,70,114,111, + 122,101,110,73,109,112,111,114,116,101,114,46,99,114,101,97, + 116,101,95,109,111,100,117,108,101,99,1,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, + 0,0,115,64,0,0,0,124,0,106,0,106,1,125,1,116, + 2,160,3,124,1,161,1,115,36,116,4,100,1,160,5,124, + 1,161,1,124,1,100,2,141,2,130,1,116,6,116,2,106, + 7,124,1,131,2,125,2,116,8,124,2,124,0,106,9,131, + 2,1,0,100,0,83,0,114,88,0,0,0,41,10,114,106, + 0,0,0,114,17,0,0,0,114,58,0,0,0,114,89,0, + 0,0,114,80,0,0,0,114,46,0,0,0,114,68,0,0, + 0,218,17,103,101,116,95,102,114,111,122,101,110,95,111,98, + 106,101,99,116,218,4,101,120,101,99,114,7,0,0,0,41, + 3,114,97,0,0,0,114,17,0,0,0,218,4,99,111,100, + 101,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,151,0,0,0,63,3,0,0,115,18,0,0,0,8,2, + 10,1,10,1,2,1,6,255,12,2,12,1,4,128,255,128, + 122,26,70,114,111,122,101,110,73,109,112,111,114,116,101,114, + 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,67,0,0,0,115,10,0,0,0,116,0,124,0,124,1, + 131,2,83,0,41,2,122,95,76,111,97,100,32,97,32,102, + 114,111,122,101,110,32,109,111,100,117,108,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,85,115,101,32,101,120,101,99,95,109,111,100,117, + 108,101,40,41,32,105,110,115,116,101,97,100,46,10,10,32, + 32,32,32,32,32,32,32,78,41,1,114,98,0,0,0,114, + 170,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,156,0,0,0,72,3,0,0,115,4,0,0, + 0,10,7,255,128,122,26,70,114,111,122,101,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,0,0,0,0,0,2,0, + 0,0,3,0,0,0,67,0,0,0,115,10,0,0,0,116, + 0,160,1,124,1,161,1,83,0,41,2,122,45,82,101,116, + 117,114,110,32,116,104,101,32,99,111,100,101,32,111,98,106, + 101,99,116,32,102,111,114,32,116,104,101,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,46,78,41,2,114,58,0, + 0,0,114,177,0,0,0,114,170,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,171,0,0,0, + 81,3,0,0,115,4,0,0,0,10,4,255,128,122,23,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,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,1,83,0,41,2,122,54,82,101,116,117, + 114,110,32,78,111,110,101,32,97,115,32,102,114,111,122,101, + 110,32,109,111,100,117,108,101,115,32,100,111,32,110,111,116, + 32,104,97,118,101,32,115,111,117,114,99,101,32,99,111,100, + 101,46,78,114,10,0,0,0,114,170,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,172,0,0, + 0,87,3,0,0,115,4,0,0,0,4,4,255,128,122,25, + 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,0,0,0,0,2,0,0,0,3,0,0,0,67,0, 0,0,115,10,0,0,0,116,0,160,1,124,1,161,1,83, - 0,41,1,122,45,82,101,116,117,114,110,32,116,104,101,32, - 99,111,100,101,32,111,98,106,101,99,116,32,102,111,114,32, - 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,46,41,2,114,58,0,0,0,114,177,0,0,0,114,170, + 0,41,2,122,46,82,101,116,117,114,110,32,84,114,117,101, + 32,105,102,32,116,104,101,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, + 103,101,46,78,41,2,114,58,0,0,0,90,17,105,115,95, + 102,114,111,122,101,110,95,112,97,99,107,97,103,101,114,170, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,171,0,0,0,81,3,0,0,115,4,0,0,0, - 10,4,255,128,122,23,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,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,122,54,82,101,116,117,114,110,32,78,111,110,101,32,97, - 115,32,102,114,111,122,101,110,32,109,111,100,117,108,101,115, - 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, - 114,99,101,32,99,111,100,101,46,78,114,10,0,0,0,114, - 170,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,172,0,0,0,87,3,0,0,115,4,0,0, - 0,4,4,255,128,122,25,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,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, - 160,1,124,1,161,1,83,0,41,1,122,46,82,101,116,117, - 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,102, - 114,111,122,101,110,32,109,111,100,117,108,101,32,105,115,32, - 97,32,112,97,99,107,97,103,101,46,41,2,114,58,0,0, - 0,90,17,105,115,95,102,114,111,122,101,110,95,112,97,99, - 107,97,103,101,114,170,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,116,0,0,0,93,3,0, - 0,115,4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17,114,1, + 0,0,114,116,0,0,0,93,3,0,0,115,4,0,0,0, + 10,4,255,128,122,25,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,41, + 2,78,78,41,1,78,41,17,114,1,0,0,0,114,0,0, + 0,0,114,2,0,0,0,114,3,0,0,0,114,139,0,0, + 0,114,173,0,0,0,114,100,0,0,0,114,174,0,0,0, + 114,168,0,0,0,114,169,0,0,0,114,150,0,0,0,114, + 151,0,0,0,114,156,0,0,0,114,91,0,0,0,114,171, + 0,0,0,114,172,0,0,0,114,116,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,175,0,0,0,23,3,0,0,115,50,0,0,0,8, + 0,4,2,4,7,2,2,10,1,2,8,12,1,2,6,12, + 1,2,8,10,1,2,3,10,1,2,8,10,1,2,8,2, + 1,12,1,2,4,2,1,12,1,2,4,2,1,16,1,255, + 128,114,175,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, + 32,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, + 100,6,83,0,41,7,218,18,95,73,109,112,111,114,116,76, + 111,99,107,67,111,110,116,101,120,116,122,36,67,111,110,116, + 101,120,116,32,109,97,110,97,103,101,114,32,102,111,114,32, + 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,2,0,0,0,67,0,0,0,115,12,0,0,0,116,0, + 160,1,161,0,1,0,100,1,83,0,41,2,122,24,65,99, + 113,117,105,114,101,32,116,104,101,32,105,109,112,111,114,116, + 32,108,111,99,107,46,78,41,2,114,58,0,0,0,114,59, + 0,0,0,114,48,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,55,0,0,0,106,3,0,0, + 115,6,0,0,0,8,2,4,128,255,128,122,28,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,0,0,0,0,4,0,0,0,2,0,0,0,67,0, + 0,0,115,12,0,0,0,116,0,160,1,161,0,1,0,100, + 1,83,0,41,2,122,60,82,101,108,101,97,115,101,32,116, + 104,101,32,105,109,112,111,114,116,32,108,111,99,107,32,114, + 101,103,97,114,100,108,101,115,115,32,111,102,32,97,110,121, + 32,114,97,105,115,101,100,32,101,120,99,101,112,116,105,111, + 110,115,46,78,41,2,114,58,0,0,0,114,61,0,0,0, + 41,4,114,30,0,0,0,218,8,101,120,99,95,116,121,112, + 101,218,9,101,120,99,95,118,97,108,117,101,218,13,101,120, + 99,95,116,114,97,99,101,98,97,99,107,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,57,0,0,0,110, + 3,0,0,115,6,0,0,0,8,2,4,128,255,128,122,27, + 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,41,6,114,1, 0,0,0,114,0,0,0,0,114,2,0,0,0,114,3,0, - 0,0,114,139,0,0,0,114,173,0,0,0,114,100,0,0, - 0,114,174,0,0,0,114,168,0,0,0,114,169,0,0,0, - 114,150,0,0,0,114,151,0,0,0,114,156,0,0,0,114, - 91,0,0,0,114,171,0,0,0,114,172,0,0,0,114,116, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,175,0,0,0,23,3,0,0, - 115,50,0,0,0,8,0,4,2,4,7,2,2,10,1,2, - 8,12,1,2,6,12,1,2,8,10,1,2,3,10,1,2, - 8,10,1,2,8,2,1,12,1,2,4,2,1,12,1,2, - 4,2,1,16,1,255,128,114,175,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,64,0,0,0,115,32,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, - 100,5,132,0,90,5,100,6,83,0,41,7,218,18,95,73, - 109,112,111,114,116,76,111,99,107,67,111,110,116,101,120,116, - 122,36,67,111,110,116,101,120,116,32,109,97,110,97,103,101, - 114,32,102,111,114,32,116,104,101,32,105,109,112,111,114,116, - 32,108,111,99,107,46,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, - 12,0,0,0,116,0,160,1,161,0,1,0,100,1,83,0, - 41,2,122,24,65,99,113,117,105,114,101,32,116,104,101,32, - 105,109,112,111,114,116,32,108,111,99,107,46,78,41,2,114, - 58,0,0,0,114,59,0,0,0,114,48,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,55,0, - 0,0,106,3,0,0,115,6,0,0,0,8,2,4,128,255, - 128,122,28,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,0,0,0,0,4,0,0,0, - 2,0,0,0,67,0,0,0,115,12,0,0,0,116,0,160, - 1,161,0,1,0,100,1,83,0,41,2,122,60,82,101,108, - 101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32, - 108,111,99,107,32,114,101,103,97,114,100,108,101,115,115,32, - 111,102,32,97,110,121,32,114,97,105,115,101,100,32,101,120, - 99,101,112,116,105,111,110,115,46,78,41,2,114,58,0,0, - 0,114,61,0,0,0,41,4,114,30,0,0,0,218,8,101, - 120,99,95,116,121,112,101,218,9,101,120,99,95,118,97,108, - 117,101,218,13,101,120,99,95,116,114,97,99,101,98,97,99, - 107,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,57,0,0,0,110,3,0,0,115,6,0,0,0,8,2, - 4,128,255,128,122,27,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,41,6,114,1,0,0,0,114,0,0,0,0,114,2, - 0,0,0,114,3,0,0,0,114,55,0,0,0,114,57,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,180,0,0,0,102,3,0,0,115, - 10,0,0,0,8,0,4,2,8,2,12,4,255,128,114,180, - 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,5,0,0,0,67,0,0,0,115,64,0,0, - 0,124,1,160,0,100,1,124,2,100,2,24,0,161,2,125, - 3,116,1,124,3,131,1,124,2,107,0,114,36,116,2,100, - 3,131,1,130,1,124,3,100,4,25,0,125,4,124,0,114, - 60,100,5,160,3,124,4,124,0,161,2,83,0,124,4,83, - 0,41,6,122,50,82,101,115,111,108,118,101,32,97,32,114, - 101,108,97,116,105,118,101,32,109,111,100,117,108,101,32,110, - 97,109,101,32,116,111,32,97,110,32,97,98,115,111,108,117, - 116,101,32,111,110,101,46,114,129,0,0,0,114,39,0,0, - 0,122,50,97,116,116,101,109,112,116,101,100,32,114,101,108, - 97,116,105,118,101,32,105,109,112,111,114,116,32,98,101,121, - 111,110,100,32,116,111,112,45,108,101,118,101,108,32,112,97, - 99,107,97,103,101,114,22,0,0,0,250,5,123,125,46,123, - 125,41,4,218,6,114,115,112,108,105,116,218,3,108,101,110, - 114,80,0,0,0,114,46,0,0,0,41,5,114,17,0,0, - 0,218,7,112,97,99,107,97,103,101,218,5,108,101,118,101, - 108,90,4,98,105,116,115,90,4,98,97,115,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,13,95,114, - 101,115,111,108,118,101,95,110,97,109,101,115,3,0,0,115, - 12,0,0,0,16,2,12,1,8,1,8,1,20,1,255,128, - 114,189,0,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,34, - 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, - 3,100,0,117,0,114,24,100,0,83,0,116,1,124,1,124, - 3,131,2,83,0,114,13,0,0,0,41,2,114,169,0,0, - 0,114,92,0,0,0,41,4,218,6,102,105,110,100,101,114, - 114,17,0,0,0,114,166,0,0,0,114,110,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,17, - 95,102,105,110,100,95,115,112,101,99,95,108,101,103,97,99, - 121,124,3,0,0,115,10,0,0,0,12,3,8,1,4,1, - 10,1,255,128,114,191,0,0,0,99,3,0,0,0,0,0, - 0,0,0,0,0,0,10,0,0,0,10,0,0,0,67,0, - 0,0,115,28,1,0,0,116,0,106,1,125,3,124,3,100, - 1,117,0,114,22,116,2,100,2,131,1,130,1,124,3,115, - 38,116,3,160,4,100,3,116,5,161,2,1,0,124,0,116, - 0,106,6,118,0,125,4,124,3,68,0,93,226,125,5,116, - 7,131,0,143,94,1,0,122,10,124,5,106,8,125,6,87, - 0,110,54,4,0,116,9,121,128,1,0,1,0,1,0,116, - 10,124,5,124,0,124,1,131,3,125,7,124,7,100,1,117, - 0,114,124,89,0,87,0,100,1,4,0,4,0,131,3,1, - 0,113,52,89,0,110,14,48,0,124,6,124,0,124,1,124, - 2,131,3,125,7,87,0,100,1,4,0,4,0,131,3,1, - 0,110,16,49,0,115,162,48,0,1,0,1,0,1,0,89, - 0,1,0,124,7,100,1,117,1,114,52,124,4,144,1,115, - 16,124,0,116,0,106,6,118,0,144,1,114,16,116,0,106, - 6,124,0,25,0,125,8,122,10,124,8,106,11,125,9,87, - 0,110,26,4,0,116,9,121,244,1,0,1,0,1,0,124, - 7,6,0,89,0,2,0,1,0,83,0,48,0,124,9,100, - 1,117,0,144,1,114,8,124,7,2,0,1,0,83,0,124, - 9,2,0,1,0,83,0,124,7,2,0,1,0,83,0,100, - 1,83,0,41,4,122,21,70,105,110,100,32,97,32,109,111, - 100,117,108,101,39,115,32,115,112,101,99,46,78,122,53,115, - 121,115,46,109,101,116,97,95,112,97,116,104,32,105,115,32, - 78,111,110,101,44,32,80,121,116,104,111,110,32,105,115,32, - 108,105,107,101,108,121,32,115,104,117,116,116,105,110,103,32, - 100,111,119,110,122,22,115,121,115,46,109,101,116,97,95,112, - 97,116,104,32,105,115,32,101,109,112,116,121,41,12,114,15, - 0,0,0,218,9,109,101,116,97,95,112,97,116,104,114,80, - 0,0,0,218,9,95,119,97,114,110,105,110,103,115,218,4, - 119,97,114,110,218,13,73,109,112,111,114,116,87,97,114,110, - 105,110,103,114,93,0,0,0,114,180,0,0,0,114,168,0, - 0,0,114,107,0,0,0,114,191,0,0,0,114,106,0,0, - 0,41,10,114,17,0,0,0,114,166,0,0,0,114,167,0, - 0,0,114,192,0,0,0,90,9,105,115,95,114,101,108,111, - 97,100,114,190,0,0,0,114,168,0,0,0,114,96,0,0, - 0,114,97,0,0,0,114,106,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,10,95,102,105,110, - 100,95,115,112,101,99,133,3,0,0,115,56,0,0,0,6, - 2,8,1,8,2,4,3,12,1,10,5,8,1,8,1,2, - 1,10,1,12,1,12,1,8,1,22,1,42,2,8,1,18, - 2,10,1,2,1,10,1,12,1,14,4,10,2,8,1,8, - 2,8,2,4,2,255,128,114,196,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, - 0,67,0,0,0,115,106,0,0,0,116,0,124,0,116,1, - 131,2,115,28,116,2,100,1,160,3,116,4,124,0,131,1, - 161,1,131,1,130,1,124,2,100,2,107,0,114,44,116,5, - 100,3,131,1,130,1,124,2,100,2,107,4,114,82,116,0, - 124,1,116,1,131,2,115,70,116,2,100,4,131,1,130,1, - 124,1,115,82,116,6,100,5,131,1,130,1,124,0,115,102, - 124,2,100,2,107,2,114,102,116,5,100,6,131,1,130,1, - 100,7,83,0,41,8,122,28,86,101,114,105,102,121,32,97, - 114,103,117,109,101,110,116,115,32,97,114,101,32,34,115,97, - 110,101,34,46,122,31,109,111,100,117,108,101,32,110,97,109, - 101,32,109,117,115,116,32,98,101,32,115,116,114,44,32,110, - 111,116,32,123,125,114,22,0,0,0,122,18,108,101,118,101, - 108,32,109,117,115,116,32,98,101,32,62,61,32,48,122,31, - 95,95,112,97,99,107,97,103,101,95,95,32,110,111,116,32, - 115,101,116,32,116,111,32,97,32,115,116,114,105,110,103,122, - 54,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, - 105,118,101,32,105,109,112,111,114,116,32,119,105,116,104,32, - 110,111,32,107,110,111,119,110,32,112,97,114,101,110,116,32, - 112,97,99,107,97,103,101,122,17,69,109,112,116,121,32,109, - 111,100,117,108,101,32,110,97,109,101,78,41,7,218,10,105, - 115,105,110,115,116,97,110,99,101,218,3,115,116,114,218,9, - 84,121,112,101,69,114,114,111,114,114,46,0,0,0,114,14, - 0,0,0,218,10,86,97,108,117,101,69,114,114,111,114,114, - 80,0,0,0,169,3,114,17,0,0,0,114,187,0,0,0, - 114,188,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,13,95,115,97,110,105,116,121,95,99,104, - 101,99,107,180,3,0,0,115,26,0,0,0,10,2,18,1, - 8,1,8,1,8,1,10,1,8,1,4,1,8,1,12,2, - 8,1,4,128,255,128,114,202,0,0,0,122,16,78,111,32, - 109,111,100,117,108,101,32,110,97,109,101,100,32,122,4,123, - 33,114,125,99,2,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,8,0,0,0,67,0,0,0,115,20,1,0, - 0,100,0,125,2,124,0,160,0,100,1,161,1,100,2,25, - 0,125,3,124,3,114,128,124,3,116,1,106,2,118,1,114, - 42,116,3,124,1,124,3,131,2,1,0,124,0,116,1,106, - 2,118,0,114,62,116,1,106,2,124,0,25,0,83,0,116, - 1,106,2,124,3,25,0,125,4,122,10,124,4,106,4,125, - 2,87,0,110,44,4,0,116,5,121,126,1,0,1,0,1, - 0,116,6,100,3,23,0,160,7,124,0,124,3,161,2,125, - 5,116,8,124,5,124,0,100,4,141,2,100,0,130,2,48, - 0,116,9,124,0,124,2,131,2,125,6,124,6,100,0,117, - 0,114,164,116,8,116,6,160,7,124,0,161,1,124,0,100, - 4,141,2,130,1,116,10,124,6,131,1,125,7,124,3,144, - 1,114,16,116,1,106,2,124,3,25,0,125,4,124,0,160, - 0,100,1,161,1,100,5,25,0,125,8,122,18,116,11,124, - 4,124,8,124,7,131,3,1,0,87,0,124,7,83,0,4, - 0,116,5,144,1,121,14,1,0,1,0,1,0,100,6,124, - 3,155,2,100,7,124,8,155,2,157,4,125,5,116,12,160, - 13,124,5,116,14,161,2,1,0,89,0,124,7,83,0,48, - 0,124,7,83,0,41,8,78,114,129,0,0,0,114,22,0, - 0,0,122,23,59,32,123,33,114,125,32,105,115,32,110,111, - 116,32,97,32,112,97,99,107,97,103,101,114,16,0,0,0, - 233,2,0,0,0,122,27,67,97,110,110,111,116,32,115,101, - 116,32,97,110,32,97,116,116,114,105,98,117,116,101,32,111, - 110,32,122,18,32,102,111,114,32,99,104,105,108,100,32,109, - 111,100,117,108,101,32,41,15,114,130,0,0,0,114,15,0, - 0,0,114,93,0,0,0,114,68,0,0,0,114,142,0,0, - 0,114,107,0,0,0,218,8,95,69,82,82,95,77,83,71, - 114,46,0,0,0,218,19,77,111,100,117,108,101,78,111,116, - 70,111,117,110,100,69,114,114,111,114,114,196,0,0,0,114, - 160,0,0,0,114,5,0,0,0,114,193,0,0,0,114,194, - 0,0,0,114,195,0,0,0,41,9,114,17,0,0,0,218, - 7,105,109,112,111,114,116,95,114,166,0,0,0,114,131,0, - 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, - 101,114,158,0,0,0,114,96,0,0,0,114,97,0,0,0, - 90,5,99,104,105,108,100,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,23,95,102,105,110,100,95,97,110, - 100,95,108,111,97,100,95,117,110,108,111,99,107,101,100,199, - 3,0,0,115,60,0,0,0,4,1,14,1,4,1,10,1, - 10,1,10,2,10,1,10,1,2,1,10,1,12,1,16,1, - 16,1,10,1,8,1,18,1,8,2,6,1,10,2,14,1, - 2,1,14,1,4,4,14,253,16,1,14,1,4,1,2,255, - 4,1,255,128,114,207,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,8,0,0,0,67,0, - 0,0,115,128,0,0,0,116,0,124,0,131,1,143,62,1, - 0,116,1,106,2,160,3,124,0,116,4,161,2,125,2,124, - 2,116,4,117,0,114,56,116,5,124,0,124,1,131,2,87, - 0,2,0,100,1,4,0,4,0,131,3,1,0,83,0,87, - 0,100,1,4,0,4,0,131,3,1,0,110,16,49,0,115, - 76,48,0,1,0,1,0,1,0,89,0,1,0,124,2,100, - 1,117,0,114,116,100,2,160,6,124,0,161,1,125,3,116, - 7,124,3,124,0,100,3,141,2,130,1,116,8,124,0,131, - 1,1,0,124,2,83,0,41,4,122,25,70,105,110,100,32, - 97,110,100,32,108,111,97,100,32,116,104,101,32,109,111,100, - 117,108,101,46,78,122,40,105,109,112,111,114,116,32,111,102, - 32,123,125,32,104,97,108,116,101,100,59,32,78,111,110,101, - 32,105,110,32,115,121,115,46,109,111,100,117,108,101,115,114, - 16,0,0,0,41,9,114,51,0,0,0,114,15,0,0,0, - 114,93,0,0,0,114,35,0,0,0,218,14,95,78,69,69, - 68,83,95,76,79,65,68,73,78,71,114,207,0,0,0,114, - 46,0,0,0,114,205,0,0,0,114,66,0,0,0,41,4, - 114,17,0,0,0,114,206,0,0,0,114,97,0,0,0,114, - 76,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,14,95,102,105,110,100,95,97,110,100,95,108, - 111,97,100,234,3,0,0,115,24,0,0,0,10,2,14,1, - 8,1,54,1,8,2,4,1,2,1,4,255,12,2,8,2, - 4,1,255,128,114,209,0,0,0,114,22,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, - 0,0,0,67,0,0,0,115,42,0,0,0,116,0,124,0, - 124,1,124,2,131,3,1,0,124,2,100,1,107,4,114,32, - 116,1,124,0,124,1,124,2,131,3,125,0,116,2,124,0, - 116,3,131,2,83,0,41,2,97,50,1,0,0,73,109,112, - 111,114,116,32,97,110,100,32,114,101,116,117,114,110,32,116, - 104,101,32,109,111,100,117,108,101,32,98,97,115,101,100,32, - 111,110,32,105,116,115,32,110,97,109,101,44,32,116,104,101, - 32,112,97,99,107,97,103,101,32,116,104,101,32,99,97,108, - 108,32,105,115,10,32,32,32,32,98,101,105,110,103,32,109, - 97,100,101,32,102,114,111,109,44,32,97,110,100,32,116,104, - 101,32,108,101,118,101,108,32,97,100,106,117,115,116,109,101, - 110,116,46,10,10,32,32,32,32,84,104,105,115,32,102,117, - 110,99,116,105,111,110,32,114,101,112,114,101,115,101,110,116, - 115,32,116,104,101,32,103,114,101,97,116,101,115,116,32,99, - 111,109,109,111,110,32,100,101,110,111,109,105,110,97,116,111, - 114,32,111,102,32,102,117,110,99,116,105,111,110,97,108,105, - 116,121,10,32,32,32,32,98,101,116,119,101,101,110,32,105, - 109,112,111,114,116,95,109,111,100,117,108,101,32,97,110,100, - 32,95,95,105,109,112,111,114,116,95,95,46,32,84,104,105, - 115,32,105,110,99,108,117,100,101,115,32,115,101,116,116,105, - 110,103,32,95,95,112,97,99,107,97,103,101,95,95,32,105, - 102,10,32,32,32,32,116,104,101,32,108,111,97,100,101,114, - 32,100,105,100,32,110,111,116,46,10,10,32,32,32,32,114, - 22,0,0,0,41,4,114,202,0,0,0,114,189,0,0,0, - 114,209,0,0,0,218,11,95,103,99,100,95,105,109,112,111, - 114,116,114,201,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,210,0,0,0,250,3,0,0,115, - 10,0,0,0,12,9,8,1,12,1,10,1,255,128,114,210, - 0,0,0,169,1,218,9,114,101,99,117,114,115,105,118,101, - 99,3,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,11,0,0,0,67,0,0,0,115,218,0,0,0,124,1, - 68,0,93,208,125,4,116,0,124,4,116,1,131,2,115,64, - 124,3,114,34,124,0,106,2,100,1,23,0,125,5,110,4, - 100,2,125,5,116,3,100,3,124,5,155,0,100,4,116,4, - 124,4,131,1,106,2,155,0,157,4,131,1,130,1,124,4, - 100,5,107,2,114,106,124,3,115,212,116,5,124,0,100,6, - 131,2,114,212,116,6,124,0,124,0,106,7,124,2,100,7, - 100,8,141,4,1,0,113,4,116,5,124,0,124,4,131,2, - 115,4,100,9,160,8,124,0,106,2,124,4,161,2,125,6, - 122,14,116,9,124,2,124,6,131,2,1,0,87,0,113,4, - 4,0,116,10,121,210,1,0,125,7,1,0,122,42,124,7, - 106,11,124,6,107,2,114,200,116,12,106,13,160,14,124,6, - 116,15,161,2,100,10,117,1,114,200,87,0,89,0,100,10, - 125,7,126,7,113,4,130,0,100,10,125,7,126,7,48,0, - 48,0,113,4,124,0,83,0,41,11,122,238,70,105,103,117, - 114,101,32,111,117,116,32,119,104,97,116,32,95,95,105,109, - 112,111,114,116,95,95,32,115,104,111,117,108,100,32,114,101, - 116,117,114,110,46,10,10,32,32,32,32,84,104,101,32,105, - 109,112,111,114,116,95,32,112,97,114,97,109,101,116,101,114, - 32,105,115,32,97,32,99,97,108,108,97,98,108,101,32,119, - 104,105,99,104,32,116,97,107,101,115,32,116,104,101,32,110, - 97,109,101,32,111,102,32,109,111,100,117,108,101,32,116,111, - 10,32,32,32,32,105,109,112,111,114,116,46,32,73,116,32, - 105,115,32,114,101,113,117,105,114,101,100,32,116,111,32,100, - 101,99,111,117,112,108,101,32,116,104,101,32,102,117,110,99, - 116,105,111,110,32,102,114,111,109,32,97,115,115,117,109,105, - 110,103,32,105,109,112,111,114,116,108,105,98,39,115,10,32, - 32,32,32,105,109,112,111,114,116,32,105,109,112,108,101,109, - 101,110,116,97,116,105,111,110,32,105,115,32,100,101,115,105, - 114,101,100,46,10,10,32,32,32,32,122,8,46,95,95,97, - 108,108,95,95,122,13,96,96,102,114,111,109,32,108,105,115, - 116,39,39,122,8,73,116,101,109,32,105,110,32,122,18,32, - 109,117,115,116,32,98,101,32,115,116,114,44,32,110,111,116, - 32,250,1,42,218,7,95,95,97,108,108,95,95,84,114,211, - 0,0,0,114,184,0,0,0,78,41,16,114,197,0,0,0, - 114,198,0,0,0,114,1,0,0,0,114,199,0,0,0,114, - 14,0,0,0,114,4,0,0,0,218,16,95,104,97,110,100, - 108,101,95,102,114,111,109,108,105,115,116,114,214,0,0,0, - 114,46,0,0,0,114,68,0,0,0,114,205,0,0,0,114, - 17,0,0,0,114,15,0,0,0,114,93,0,0,0,114,35, - 0,0,0,114,208,0,0,0,41,8,114,97,0,0,0,218, - 8,102,114,111,109,108,105,115,116,114,206,0,0,0,114,212, - 0,0,0,218,1,120,90,5,119,104,101,114,101,90,9,102, - 114,111,109,95,110,97,109,101,90,3,101,120,99,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,215,0,0, - 0,9,4,0,0,115,52,0,0,0,8,10,10,1,4,1, - 12,1,4,2,10,1,8,1,8,255,8,2,14,1,10,1, - 2,1,8,255,10,2,14,1,2,1,14,1,14,1,10,4, - 16,1,2,255,12,2,2,1,12,128,4,1,255,128,114,215, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,6,0,0,0,67,0,0,0,115,146,0,0, - 0,124,0,160,0,100,1,161,1,125,1,124,0,160,0,100, - 2,161,1,125,2,124,1,100,3,117,1,114,82,124,2,100, - 3,117,1,114,78,124,1,124,2,106,1,107,3,114,78,116, - 2,106,3,100,4,124,1,155,2,100,5,124,2,106,1,155, - 2,100,6,157,5,116,4,100,7,100,8,141,3,1,0,124, - 1,83,0,124,2,100,3,117,1,114,96,124,2,106,1,83, - 0,116,2,106,3,100,9,116,4,100,7,100,8,141,3,1, - 0,124,0,100,10,25,0,125,1,100,11,124,0,118,1,114, - 142,124,1,160,5,100,12,161,1,100,13,25,0,125,1,124, - 1,83,0,41,14,122,167,67,97,108,99,117,108,97,116,101, - 32,119,104,97,116,32,95,95,112,97,99,107,97,103,101,95, - 95,32,115,104,111,117,108,100,32,98,101,46,10,10,32,32, - 32,32,95,95,112,97,99,107,97,103,101,95,95,32,105,115, - 32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32, - 116,111,32,98,101,32,100,101,102,105,110,101,100,32,111,114, - 32,99,111,117,108,100,32,98,101,32,115,101,116,32,116,111, - 32,78,111,110,101,10,32,32,32,32,116,111,32,114,101,112, - 114,101,115,101,110,116,32,116,104,97,116,32,105,116,115,32, - 112,114,111,112,101,114,32,118,97,108,117,101,32,105,115,32, - 117,110,107,110,111,119,110,46,10,10,32,32,32,32,114,146, - 0,0,0,114,106,0,0,0,78,122,32,95,95,112,97,99, - 107,97,103,101,95,95,32,33,61,32,95,95,115,112,101,99, - 95,95,46,112,97,114,101,110,116,32,40,122,4,32,33,61, - 32,250,1,41,233,3,0,0,0,41,1,90,10,115,116,97, - 99,107,108,101,118,101,108,122,89,99,97,110,39,116,32,114, - 101,115,111,108,118,101,32,112,97,99,107,97,103,101,32,102, - 114,111,109,32,95,95,115,112,101,99,95,95,32,111,114,32, - 95,95,112,97,99,107,97,103,101,95,95,44,32,102,97,108, - 108,105,110,103,32,98,97,99,107,32,111,110,32,95,95,110, - 97,109,101,95,95,32,97,110,100,32,95,95,112,97,116,104, - 95,95,114,1,0,0,0,114,142,0,0,0,114,129,0,0, - 0,114,22,0,0,0,41,6,114,35,0,0,0,114,131,0, - 0,0,114,193,0,0,0,114,194,0,0,0,114,195,0,0, - 0,114,130,0,0,0,41,3,218,7,103,108,111,98,97,108, - 115,114,187,0,0,0,114,96,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,17,95,99,97,108, - 99,95,95,95,112,97,99,107,97,103,101,95,95,46,4,0, - 0,115,44,0,0,0,10,7,10,1,8,1,18,1,6,1, - 2,1,4,255,4,1,6,255,4,2,6,254,4,3,8,1, - 6,1,6,2,4,2,6,254,8,3,8,1,14,1,4,1, - 255,128,114,221,0,0,0,114,10,0,0,0,99,5,0,0, - 0,0,0,0,0,0,0,0,0,9,0,0,0,5,0,0, - 0,67,0,0,0,115,174,0,0,0,124,4,100,1,107,2, - 114,18,116,0,124,0,131,1,125,5,110,36,124,1,100,2, - 117,1,114,30,124,1,110,2,105,0,125,6,116,1,124,6, - 131,1,125,7,116,0,124,0,124,7,124,4,131,3,125,5, - 124,3,115,148,124,4,100,1,107,2,114,84,116,0,124,0, - 160,2,100,3,161,1,100,1,25,0,131,1,83,0,124,0, - 115,92,124,5,83,0,116,3,124,0,131,1,116,3,124,0, - 160,2,100,3,161,1,100,1,25,0,131,1,24,0,125,8, - 116,4,106,5,124,5,106,6,100,2,116,3,124,5,106,6, - 131,1,124,8,24,0,133,2,25,0,25,0,83,0,116,7, - 124,5,100,4,131,2,114,170,116,8,124,5,124,3,116,0, - 131,3,83,0,124,5,83,0,41,5,97,215,1,0,0,73, - 109,112,111,114,116,32,97,32,109,111,100,117,108,101,46,10, - 10,32,32,32,32,84,104,101,32,39,103,108,111,98,97,108, - 115,39,32,97,114,103,117,109,101,110,116,32,105,115,32,117, - 115,101,100,32,116,111,32,105,110,102,101,114,32,119,104,101, - 114,101,32,116,104,101,32,105,109,112,111,114,116,32,105,115, - 32,111,99,99,117,114,114,105,110,103,32,102,114,111,109,10, - 32,32,32,32,116,111,32,104,97,110,100,108,101,32,114,101, - 108,97,116,105,118,101,32,105,109,112,111,114,116,115,46,32, - 84,104,101,32,39,108,111,99,97,108,115,39,32,97,114,103, - 117,109,101,110,116,32,105,115,32,105,103,110,111,114,101,100, - 46,32,84,104,101,10,32,32,32,32,39,102,114,111,109,108, - 105,115,116,39,32,97,114,103,117,109,101,110,116,32,115,112, - 101,99,105,102,105,101,115,32,119,104,97,116,32,115,104,111, - 117,108,100,32,101,120,105,115,116,32,97,115,32,97,116,116, - 114,105,98,117,116,101,115,32,111,110,32,116,104,101,32,109, - 111,100,117,108,101,10,32,32,32,32,98,101,105,110,103,32, - 105,109,112,111,114,116,101,100,32,40,101,46,103,46,32,96, - 96,102,114,111,109,32,109,111,100,117,108,101,32,105,109,112, - 111,114,116,32,60,102,114,111,109,108,105,115,116,62,96,96, - 41,46,32,32,84,104,101,32,39,108,101,118,101,108,39,10, - 32,32,32,32,97,114,103,117,109,101,110,116,32,114,101,112, - 114,101,115,101,110,116,115,32,116,104,101,32,112,97,99,107, - 97,103,101,32,108,111,99,97,116,105,111,110,32,116,111,32, - 105,109,112,111,114,116,32,102,114,111,109,32,105,110,32,97, - 32,114,101,108,97,116,105,118,101,10,32,32,32,32,105,109, - 112,111,114,116,32,40,101,46,103,46,32,96,96,102,114,111, - 109,32,46,46,112,107,103,32,105,109,112,111,114,116,32,109, - 111,100,96,96,32,119,111,117,108,100,32,104,97,118,101,32, - 97,32,39,108,101,118,101,108,39,32,111,102,32,50,41,46, - 10,10,32,32,32,32,114,22,0,0,0,78,114,129,0,0, - 0,114,142,0,0,0,41,9,114,210,0,0,0,114,221,0, - 0,0,218,9,112,97,114,116,105,116,105,111,110,114,186,0, - 0,0,114,15,0,0,0,114,93,0,0,0,114,1,0,0, - 0,114,4,0,0,0,114,215,0,0,0,41,9,114,17,0, - 0,0,114,220,0,0,0,218,6,108,111,99,97,108,115,114, - 216,0,0,0,114,188,0,0,0,114,97,0,0,0,90,8, - 103,108,111,98,97,108,115,95,114,187,0,0,0,90,7,99, - 117,116,95,111,102,102,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,10,95,95,105,109,112,111,114,116,95, - 95,73,4,0,0,115,32,0,0,0,8,11,10,1,16,2, - 8,1,12,1,4,1,8,3,18,1,4,1,4,1,26,4, - 30,3,10,1,12,1,4,2,255,128,114,224,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,67,0,0,0,115,38,0,0,0,116,0,160, - 1,124,0,161,1,125,1,124,1,100,0,117,0,114,30,116, - 2,100,1,124,0,23,0,131,1,130,1,116,3,124,1,131, - 1,83,0,41,2,78,122,25,110,111,32,98,117,105,108,116, - 45,105,110,32,109,111,100,117,108,101,32,110,97,109,101,100, - 32,41,4,114,161,0,0,0,114,168,0,0,0,114,80,0, - 0,0,114,160,0,0,0,41,2,114,17,0,0,0,114,96, + 0,0,114,55,0,0,0,114,57,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,180,0,0,0,102,3,0,0,115,10,0,0,0,8,0, + 4,2,8,2,12,4,255,128,114,180,0,0,0,99,3,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, + 0,0,67,0,0,0,115,64,0,0,0,124,1,160,0,100, + 1,124,2,100,2,24,0,161,2,125,3,116,1,124,3,131, + 1,124,2,107,0,114,36,116,2,100,3,131,1,130,1,124, + 3,100,4,25,0,125,4,124,0,114,60,100,5,160,3,124, + 4,124,0,161,2,83,0,124,4,83,0,41,7,122,50,82, + 101,115,111,108,118,101,32,97,32,114,101,108,97,116,105,118, + 101,32,109,111,100,117,108,101,32,110,97,109,101,32,116,111, + 32,97,110,32,97,98,115,111,108,117,116,101,32,111,110,101, + 46,114,129,0,0,0,114,39,0,0,0,122,50,97,116,116, + 101,109,112,116,101,100,32,114,101,108,97,116,105,118,101,32, + 105,109,112,111,114,116,32,98,101,121,111,110,100,32,116,111, + 112,45,108,101,118,101,108,32,112,97,99,107,97,103,101,114, + 22,0,0,0,250,5,123,125,46,123,125,78,41,4,218,6, + 114,115,112,108,105,116,218,3,108,101,110,114,80,0,0,0, + 114,46,0,0,0,41,5,114,17,0,0,0,218,7,112,97, + 99,107,97,103,101,218,5,108,101,118,101,108,90,4,98,105, + 116,115,90,4,98,97,115,101,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,13,95,114,101,115,111,108,118, + 101,95,110,97,109,101,115,3,0,0,115,12,0,0,0,16, + 2,12,1,8,1,8,1,20,1,255,128,114,189,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,34,0,0,0,124,0, + 160,0,124,1,124,2,161,2,125,3,124,3,100,0,117,0, + 114,24,100,0,83,0,116,1,124,1,124,3,131,2,83,0, + 114,13,0,0,0,41,2,114,169,0,0,0,114,92,0,0, + 0,41,4,218,6,102,105,110,100,101,114,114,17,0,0,0, + 114,166,0,0,0,114,110,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,17,95,102,105,110,100, + 95,115,112,101,99,95,108,101,103,97,99,121,124,3,0,0, + 115,10,0,0,0,12,3,8,1,4,1,10,1,255,128,114, + 191,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,10,0,0,0,10,0,0,0,67,0,0,0,115,28,1, + 0,0,116,0,106,1,125,3,124,3,100,1,117,0,114,22, + 116,2,100,2,131,1,130,1,124,3,115,38,116,3,160,4, + 100,3,116,5,161,2,1,0,124,0,116,0,106,6,118,0, + 125,4,124,3,68,0,93,226,125,5,116,7,131,0,143,94, + 1,0,122,10,124,5,106,8,125,6,87,0,110,54,4,0, + 116,9,121,128,1,0,1,0,1,0,116,10,124,5,124,0, + 124,1,131,3,125,7,124,7,100,1,117,0,114,124,89,0, + 87,0,100,1,4,0,4,0,131,3,1,0,113,52,89,0, + 110,14,48,0,124,6,124,0,124,1,124,2,131,3,125,7, + 87,0,100,1,4,0,4,0,131,3,1,0,110,16,49,0, + 115,162,48,0,1,0,1,0,1,0,89,0,1,0,124,7, + 100,1,117,1,114,52,124,4,144,1,115,16,124,0,116,0, + 106,6,118,0,144,1,114,16,116,0,106,6,124,0,25,0, + 125,8,122,10,124,8,106,11,125,9,87,0,110,26,4,0, + 116,9,121,244,1,0,1,0,1,0,124,7,6,0,89,0, + 2,0,1,0,83,0,48,0,124,9,100,1,117,0,144,1, + 114,8,124,7,2,0,1,0,83,0,124,9,2,0,1,0, + 83,0,124,7,2,0,1,0,83,0,100,1,83,0,41,4, + 122,21,70,105,110,100,32,97,32,109,111,100,117,108,101,39, + 115,32,115,112,101,99,46,78,122,53,115,121,115,46,109,101, + 116,97,95,112,97,116,104,32,105,115,32,78,111,110,101,44, + 32,80,121,116,104,111,110,32,105,115,32,108,105,107,101,108, + 121,32,115,104,117,116,116,105,110,103,32,100,111,119,110,122, + 22,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, + 115,32,101,109,112,116,121,41,12,114,15,0,0,0,218,9, + 109,101,116,97,95,112,97,116,104,114,80,0,0,0,218,9, + 95,119,97,114,110,105,110,103,115,218,4,119,97,114,110,218, + 13,73,109,112,111,114,116,87,97,114,110,105,110,103,114,93, + 0,0,0,114,180,0,0,0,114,168,0,0,0,114,107,0, + 0,0,114,191,0,0,0,114,106,0,0,0,41,10,114,17, + 0,0,0,114,166,0,0,0,114,167,0,0,0,114,192,0, + 0,0,90,9,105,115,95,114,101,108,111,97,100,114,190,0, + 0,0,114,168,0,0,0,114,96,0,0,0,114,97,0,0, + 0,114,106,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,10,95,102,105,110,100,95,115,112,101, + 99,133,3,0,0,115,56,0,0,0,6,2,8,1,8,2, + 4,3,12,1,10,5,8,1,8,1,2,1,10,1,12,1, + 12,1,8,1,22,1,42,2,8,1,18,2,10,1,2,1, + 10,1,12,1,14,4,10,2,8,1,8,2,8,2,4,2, + 255,128,114,196,0,0,0,99,3,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,5,0,0,0,67,0,0,0, + 115,106,0,0,0,116,0,124,0,116,1,131,2,115,28,116, + 2,100,1,160,3,116,4,124,0,131,1,161,1,131,1,130, + 1,124,2,100,2,107,0,114,44,116,5,100,3,131,1,130, + 1,124,2,100,2,107,4,114,82,116,0,124,1,116,1,131, + 2,115,70,116,2,100,4,131,1,130,1,124,1,115,82,116, + 6,100,5,131,1,130,1,124,0,115,102,124,2,100,2,107, + 2,114,102,116,5,100,6,131,1,130,1,100,7,83,0,41, + 8,122,28,86,101,114,105,102,121,32,97,114,103,117,109,101, + 110,116,115,32,97,114,101,32,34,115,97,110,101,34,46,122, + 31,109,111,100,117,108,101,32,110,97,109,101,32,109,117,115, + 116,32,98,101,32,115,116,114,44,32,110,111,116,32,123,125, + 114,22,0,0,0,122,18,108,101,118,101,108,32,109,117,115, + 116,32,98,101,32,62,61,32,48,122,31,95,95,112,97,99, + 107,97,103,101,95,95,32,110,111,116,32,115,101,116,32,116, + 111,32,97,32,115,116,114,105,110,103,122,54,97,116,116,101, + 109,112,116,101,100,32,114,101,108,97,116,105,118,101,32,105, + 109,112,111,114,116,32,119,105,116,104,32,110,111,32,107,110, + 111,119,110,32,112,97,114,101,110,116,32,112,97,99,107,97, + 103,101,122,17,69,109,112,116,121,32,109,111,100,117,108,101, + 32,110,97,109,101,78,41,7,218,10,105,115,105,110,115,116, + 97,110,99,101,218,3,115,116,114,218,9,84,121,112,101,69, + 114,114,111,114,114,46,0,0,0,114,14,0,0,0,218,10, + 86,97,108,117,101,69,114,114,111,114,114,80,0,0,0,169, + 3,114,17,0,0,0,114,187,0,0,0,114,188,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 13,95,115,97,110,105,116,121,95,99,104,101,99,107,180,3, + 0,0,115,26,0,0,0,10,2,18,1,8,1,8,1,8, + 1,10,1,8,1,4,1,8,1,12,2,8,1,4,128,255, + 128,114,202,0,0,0,122,16,78,111,32,109,111,100,117,108, + 101,32,110,97,109,101,100,32,122,4,123,33,114,125,99,2, + 0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,8, + 0,0,0,67,0,0,0,115,20,1,0,0,100,0,125,2, + 124,0,160,0,100,1,161,1,100,2,25,0,125,3,124,3, + 114,128,124,3,116,1,106,2,118,1,114,42,116,3,124,1, + 124,3,131,2,1,0,124,0,116,1,106,2,118,0,114,62, + 116,1,106,2,124,0,25,0,83,0,116,1,106,2,124,3, + 25,0,125,4,122,10,124,4,106,4,125,2,87,0,110,44, + 4,0,116,5,121,126,1,0,1,0,1,0,116,6,100,3, + 23,0,160,7,124,0,124,3,161,2,125,5,116,8,124,5, + 124,0,100,4,141,2,100,0,130,2,48,0,116,9,124,0, + 124,2,131,2,125,6,124,6,100,0,117,0,114,164,116,8, + 116,6,160,7,124,0,161,1,124,0,100,4,141,2,130,1, + 116,10,124,6,131,1,125,7,124,3,144,1,114,16,116,1, + 106,2,124,3,25,0,125,4,124,0,160,0,100,1,161,1, + 100,5,25,0,125,8,122,18,116,11,124,4,124,8,124,7, + 131,3,1,0,87,0,124,7,83,0,4,0,116,5,144,1, + 121,14,1,0,1,0,1,0,100,6,124,3,155,2,100,7, + 124,8,155,2,157,4,125,5,116,12,160,13,124,5,116,14, + 161,2,1,0,89,0,124,7,83,0,48,0,124,7,83,0, + 41,8,78,114,129,0,0,0,114,22,0,0,0,122,23,59, + 32,123,33,114,125,32,105,115,32,110,111,116,32,97,32,112, + 97,99,107,97,103,101,114,16,0,0,0,233,2,0,0,0, + 122,27,67,97,110,110,111,116,32,115,101,116,32,97,110,32, + 97,116,116,114,105,98,117,116,101,32,111,110,32,122,18,32, + 102,111,114,32,99,104,105,108,100,32,109,111,100,117,108,101, + 32,41,15,114,130,0,0,0,114,15,0,0,0,114,93,0, + 0,0,114,68,0,0,0,114,142,0,0,0,114,107,0,0, + 0,218,8,95,69,82,82,95,77,83,71,114,46,0,0,0, + 218,19,77,111,100,117,108,101,78,111,116,70,111,117,110,100, + 69,114,114,111,114,114,196,0,0,0,114,160,0,0,0,114, + 5,0,0,0,114,193,0,0,0,114,194,0,0,0,114,195, + 0,0,0,41,9,114,17,0,0,0,218,7,105,109,112,111, + 114,116,95,114,166,0,0,0,114,131,0,0,0,90,13,112, + 97,114,101,110,116,95,109,111,100,117,108,101,114,158,0,0, + 0,114,96,0,0,0,114,97,0,0,0,90,5,99,104,105, + 108,100,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,23,95,102,105,110,100,95,97,110,100,95,108,111,97, + 100,95,117,110,108,111,99,107,101,100,199,3,0,0,115,60, + 0,0,0,4,1,14,1,4,1,10,1,10,1,10,2,10, + 1,10,1,2,1,10,1,12,1,16,1,16,1,10,1,8, + 1,18,1,8,2,6,1,10,2,14,1,2,1,14,1,4, + 4,14,253,16,1,14,1,4,1,2,255,4,1,255,128,114, + 207,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,8,0,0,0,67,0,0,0,115,128,0, + 0,0,116,0,124,0,131,1,143,62,1,0,116,1,106,2, + 160,3,124,0,116,4,161,2,125,2,124,2,116,4,117,0, + 114,56,116,5,124,0,124,1,131,2,87,0,2,0,100,1, + 4,0,4,0,131,3,1,0,83,0,87,0,100,1,4,0, + 4,0,131,3,1,0,110,16,49,0,115,76,48,0,1,0, + 1,0,1,0,89,0,1,0,124,2,100,1,117,0,114,116, + 100,2,160,6,124,0,161,1,125,3,116,7,124,3,124,0, + 100,3,141,2,130,1,116,8,124,0,131,1,1,0,124,2, + 83,0,41,4,122,25,70,105,110,100,32,97,110,100,32,108, + 111,97,100,32,116,104,101,32,109,111,100,117,108,101,46,78, + 122,40,105,109,112,111,114,116,32,111,102,32,123,125,32,104, + 97,108,116,101,100,59,32,78,111,110,101,32,105,110,32,115, + 121,115,46,109,111,100,117,108,101,115,114,16,0,0,0,41, + 9,114,51,0,0,0,114,15,0,0,0,114,93,0,0,0, + 114,35,0,0,0,218,14,95,78,69,69,68,83,95,76,79, + 65,68,73,78,71,114,207,0,0,0,114,46,0,0,0,114, + 205,0,0,0,114,66,0,0,0,41,4,114,17,0,0,0, + 114,206,0,0,0,114,97,0,0,0,114,76,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,14, + 95,102,105,110,100,95,97,110,100,95,108,111,97,100,234,3, + 0,0,115,24,0,0,0,10,2,14,1,8,1,54,1,8, + 2,4,1,2,1,4,255,12,2,8,2,4,1,255,128,114, + 209,0,0,0,114,22,0,0,0,99,3,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, + 0,0,115,42,0,0,0,116,0,124,0,124,1,124,2,131, + 3,1,0,124,2,100,1,107,4,114,32,116,1,124,0,124, + 1,124,2,131,3,125,0,116,2,124,0,116,3,131,2,83, + 0,41,3,97,50,1,0,0,73,109,112,111,114,116,32,97, + 110,100,32,114,101,116,117,114,110,32,116,104,101,32,109,111, + 100,117,108,101,32,98,97,115,101,100,32,111,110,32,105,116, + 115,32,110,97,109,101,44,32,116,104,101,32,112,97,99,107, + 97,103,101,32,116,104,101,32,99,97,108,108,32,105,115,10, + 32,32,32,32,98,101,105,110,103,32,109,97,100,101,32,102, + 114,111,109,44,32,97,110,100,32,116,104,101,32,108,101,118, + 101,108,32,97,100,106,117,115,116,109,101,110,116,46,10,10, + 32,32,32,32,84,104,105,115,32,102,117,110,99,116,105,111, + 110,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101, + 32,103,114,101,97,116,101,115,116,32,99,111,109,109,111,110, + 32,100,101,110,111,109,105,110,97,116,111,114,32,111,102,32, + 102,117,110,99,116,105,111,110,97,108,105,116,121,10,32,32, + 32,32,98,101,116,119,101,101,110,32,105,109,112,111,114,116, + 95,109,111,100,117,108,101,32,97,110,100,32,95,95,105,109, + 112,111,114,116,95,95,46,32,84,104,105,115,32,105,110,99, + 108,117,100,101,115,32,115,101,116,116,105,110,103,32,95,95, + 112,97,99,107,97,103,101,95,95,32,105,102,10,32,32,32, + 32,116,104,101,32,108,111,97,100,101,114,32,100,105,100,32, + 110,111,116,46,10,10,32,32,32,32,114,22,0,0,0,78, + 41,4,114,202,0,0,0,114,189,0,0,0,114,209,0,0, + 0,218,11,95,103,99,100,95,105,109,112,111,114,116,114,201, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,18,95,98,117,105,108,116,105,110,95,102,114,111, - 109,95,110,97,109,101,110,4,0,0,115,10,0,0,0,10, - 1,8,1,12,1,8,1,255,128,114,225,0,0,0,99,2, - 0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,5, - 0,0,0,67,0,0,0,115,164,0,0,0,124,1,97,0, - 124,0,97,1,116,2,116,1,131,1,125,2,116,1,106,3, - 160,4,161,0,68,0,93,70,92,2,125,3,125,4,116,5, - 124,4,124,2,131,2,114,26,124,3,116,1,106,6,118,0, - 114,60,116,7,125,5,110,16,116,0,160,8,124,3,161,1, - 114,26,116,9,125,5,110,0,116,10,124,4,124,5,131,2, - 125,6,116,11,124,6,124,4,131,2,1,0,113,26,116,1, - 106,3,116,12,25,0,125,7,100,1,68,0,93,46,125,8, - 124,8,116,1,106,3,118,1,114,136,116,13,124,8,131,1, - 125,9,110,10,116,1,106,3,124,8,25,0,125,9,116,14, - 124,7,124,8,124,9,131,3,1,0,113,112,100,2,83,0, - 41,3,122,250,83,101,116,117,112,32,105,109,112,111,114,116, - 108,105,98,32,98,121,32,105,109,112,111,114,116,105,110,103, - 32,110,101,101,100,101,100,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,115,32,97,110,100,32,105,110,106, - 101,99,116,105,110,103,32,116,104,101,109,10,32,32,32,32, - 105,110,116,111,32,116,104,101,32,103,108,111,98,97,108,32, - 110,97,109,101,115,112,97,99,101,46,10,10,32,32,32,32, - 65,115,32,115,121,115,32,105,115,32,110,101,101,100,101,100, - 32,102,111,114,32,115,121,115,46,109,111,100,117,108,101,115, - 32,97,99,99,101,115,115,32,97,110,100,32,95,105,109,112, - 32,105,115,32,110,101,101,100,101,100,32,116,111,32,108,111, - 97,100,32,98,117,105,108,116,45,105,110,10,32,32,32,32, - 109,111,100,117,108,101,115,44,32,116,104,111,115,101,32,116, - 119,111,32,109,111,100,117,108,101,115,32,109,117,115,116,32, - 98,101,32,101,120,112,108,105,99,105,116,108,121,32,112,97, - 115,115,101,100,32,105,110,46,10,10,32,32,32,32,41,3, - 114,23,0,0,0,114,193,0,0,0,114,65,0,0,0,78, - 41,15,114,58,0,0,0,114,15,0,0,0,114,14,0,0, - 0,114,93,0,0,0,218,5,105,116,101,109,115,114,197,0, - 0,0,114,79,0,0,0,114,161,0,0,0,114,89,0,0, - 0,114,175,0,0,0,114,143,0,0,0,114,149,0,0,0, - 114,1,0,0,0,114,225,0,0,0,114,5,0,0,0,41, - 10,218,10,115,121,115,95,109,111,100,117,108,101,218,11,95, - 105,109,112,95,109,111,100,117,108,101,90,11,109,111,100,117, - 108,101,95,116,121,112,101,114,17,0,0,0,114,97,0,0, - 0,114,110,0,0,0,114,96,0,0,0,90,11,115,101,108, - 102,95,109,111,100,117,108,101,90,12,98,117,105,108,116,105, - 110,95,110,97,109,101,90,14,98,117,105,108,116,105,110,95, - 109,111,100,117,108,101,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,6,95,115,101,116,117,112,117,4,0, - 0,115,38,0,0,0,4,9,4,1,8,3,18,1,10,1, - 10,1,6,1,10,1,6,1,10,3,12,1,10,3,8,1, - 10,1,10,1,10,2,14,1,4,128,255,128,114,229,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,116, - 0,124,0,124,1,131,2,1,0,116,1,106,2,160,3,116, - 4,161,1,1,0,116,1,106,2,160,3,116,5,161,1,1, - 0,100,1,83,0,41,2,122,48,73,110,115,116,97,108,108, - 32,105,109,112,111,114,116,101,114,115,32,102,111,114,32,98, - 117,105,108,116,105,110,32,97,110,100,32,102,114,111,122,101, - 110,32,109,111,100,117,108,101,115,78,41,6,114,229,0,0, - 0,114,15,0,0,0,114,192,0,0,0,114,120,0,0,0, - 114,161,0,0,0,114,175,0,0,0,41,2,114,227,0,0, - 0,114,228,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,8,95,105,110,115,116,97,108,108,152, - 4,0,0,115,10,0,0,0,10,2,12,2,12,1,4,128, - 255,128,114,230,0,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, - 115,32,0,0,0,100,1,100,2,108,0,125,0,124,0,97, - 1,124,0,160,2,116,3,106,4,116,5,25,0,161,1,1, - 0,100,2,83,0,41,3,122,57,73,110,115,116,97,108,108, - 32,105,109,112,111,114,116,101,114,115,32,116,104,97,116,32, - 114,101,113,117,105,114,101,32,101,120,116,101,114,110,97,108, - 32,102,105,108,101,115,121,115,116,101,109,32,97,99,99,101, - 115,115,114,22,0,0,0,78,41,6,218,26,95,102,114,111, - 122,101,110,95,105,109,112,111,114,116,108,105,98,95,101,120, - 116,101,114,110,97,108,114,127,0,0,0,114,230,0,0,0, - 114,15,0,0,0,114,93,0,0,0,114,1,0,0,0,41, - 1,114,231,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,27,95,105,110,115,116,97,108,108,95, - 101,120,116,101,114,110,97,108,95,105,109,112,111,114,116,101, - 114,115,160,4,0,0,115,10,0,0,0,8,3,4,1,16, - 1,4,128,255,128,114,232,0,0,0,41,2,78,78,41,1, - 78,41,2,78,114,22,0,0,0,41,4,78,78,114,10,0, - 0,0,114,22,0,0,0,41,50,114,3,0,0,0,114,127, - 0,0,0,114,12,0,0,0,114,18,0,0,0,114,60,0, - 0,0,114,34,0,0,0,114,44,0,0,0,114,19,0,0, - 0,114,20,0,0,0,114,50,0,0,0,114,51,0,0,0, - 114,54,0,0,0,114,66,0,0,0,114,68,0,0,0,114, - 77,0,0,0,114,87,0,0,0,114,91,0,0,0,114,98, - 0,0,0,114,112,0,0,0,114,113,0,0,0,114,92,0, - 0,0,114,143,0,0,0,114,149,0,0,0,114,153,0,0, - 0,114,108,0,0,0,114,94,0,0,0,114,159,0,0,0, - 114,160,0,0,0,114,95,0,0,0,114,161,0,0,0,114, - 175,0,0,0,114,180,0,0,0,114,189,0,0,0,114,191, - 0,0,0,114,196,0,0,0,114,202,0,0,0,90,15,95, - 69,82,82,95,77,83,71,95,80,82,69,70,73,88,114,204, - 0,0,0,114,207,0,0,0,218,6,111,98,106,101,99,116, - 114,208,0,0,0,114,209,0,0,0,114,210,0,0,0,114, - 215,0,0,0,114,221,0,0,0,114,224,0,0,0,114,225, - 0,0,0,114,229,0,0,0,114,230,0,0,0,114,232,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,60,109,111,100,117,108,101,62, - 1,0,0,0,115,100,0,0,0,4,0,4,24,8,2,8, - 8,4,8,4,2,16,3,14,4,14,77,14,21,8,16,8, - 37,8,17,14,11,8,8,8,11,8,12,8,16,14,36,16, - 101,10,26,14,45,8,72,8,17,8,17,8,30,8,37,8, - 42,14,15,14,75,14,79,8,13,8,9,10,9,8,47,4, - 16,8,1,8,2,6,32,8,3,10,16,14,15,8,37,10, - 27,8,37,8,7,8,35,8,8,4,128,255,128, + 0,0,114,210,0,0,0,250,3,0,0,115,10,0,0,0, + 12,9,8,1,12,1,10,1,255,128,114,210,0,0,0,169, + 1,218,9,114,101,99,117,114,115,105,118,101,99,3,0,0, + 0,0,0,0,0,1,0,0,0,8,0,0,0,11,0,0, + 0,67,0,0,0,115,216,0,0,0,124,1,68,0,93,206, + 125,4,116,0,124,4,116,1,131,2,115,64,124,3,114,34, + 124,0,106,2,100,1,23,0,125,5,110,4,100,2,125,5, + 116,3,100,3,124,5,155,0,100,4,116,4,124,4,131,1, + 106,2,155,0,157,4,131,1,130,1,124,4,100,5,107,2, + 114,106,124,3,115,4,116,5,124,0,100,6,131,2,114,4, + 116,6,124,0,124,0,106,7,124,2,100,7,100,8,141,4, + 1,0,113,4,116,5,124,0,124,4,131,2,115,4,100,9, + 160,8,124,0,106,2,124,4,161,2,125,6,122,14,116,9, + 124,2,124,6,131,2,1,0,87,0,113,4,4,0,116,10, + 121,210,1,0,125,7,1,0,122,42,124,7,106,11,124,6, + 107,2,114,200,116,12,106,13,160,14,124,6,116,15,161,2, + 100,10,117,1,114,200,87,0,89,0,100,10,125,7,126,7, + 113,4,130,0,100,10,125,7,126,7,48,0,48,0,124,0, + 83,0,41,11,122,238,70,105,103,117,114,101,32,111,117,116, + 32,119,104,97,116,32,95,95,105,109,112,111,114,116,95,95, + 32,115,104,111,117,108,100,32,114,101,116,117,114,110,46,10, + 10,32,32,32,32,84,104,101,32,105,109,112,111,114,116,95, + 32,112,97,114,97,109,101,116,101,114,32,105,115,32,97,32, + 99,97,108,108,97,98,108,101,32,119,104,105,99,104,32,116, + 97,107,101,115,32,116,104,101,32,110,97,109,101,32,111,102, + 32,109,111,100,117,108,101,32,116,111,10,32,32,32,32,105, + 109,112,111,114,116,46,32,73,116,32,105,115,32,114,101,113, + 117,105,114,101,100,32,116,111,32,100,101,99,111,117,112,108, + 101,32,116,104,101,32,102,117,110,99,116,105,111,110,32,102, + 114,111,109,32,97,115,115,117,109,105,110,103,32,105,109,112, + 111,114,116,108,105,98,39,115,10,32,32,32,32,105,109,112, + 111,114,116,32,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,32,105,115,32,100,101,115,105,114,101,100,46,10,10, + 32,32,32,32,122,8,46,95,95,97,108,108,95,95,122,13, + 96,96,102,114,111,109,32,108,105,115,116,39,39,122,8,73, + 116,101,109,32,105,110,32,122,18,32,109,117,115,116,32,98, + 101,32,115,116,114,44,32,110,111,116,32,250,1,42,218,7, + 95,95,97,108,108,95,95,84,114,211,0,0,0,114,184,0, + 0,0,78,41,16,114,197,0,0,0,114,198,0,0,0,114, + 1,0,0,0,114,199,0,0,0,114,14,0,0,0,114,4, + 0,0,0,218,16,95,104,97,110,100,108,101,95,102,114,111, + 109,108,105,115,116,114,214,0,0,0,114,46,0,0,0,114, + 68,0,0,0,114,205,0,0,0,114,17,0,0,0,114,15, + 0,0,0,114,93,0,0,0,114,35,0,0,0,114,208,0, + 0,0,41,8,114,97,0,0,0,218,8,102,114,111,109,108, + 105,115,116,114,206,0,0,0,114,212,0,0,0,218,1,120, + 90,5,119,104,101,114,101,90,9,102,114,111,109,95,110,97, + 109,101,90,3,101,120,99,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,215,0,0,0,9,4,0,0,115, + 52,0,0,0,8,10,10,1,4,1,12,1,4,2,10,1, + 8,1,8,255,8,2,14,1,10,1,2,1,8,255,10,2, + 14,1,2,1,14,1,14,1,10,4,16,1,2,255,12,2, + 2,1,10,128,4,1,255,128,114,215,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,6,0, + 0,0,67,0,0,0,115,146,0,0,0,124,0,160,0,100, + 1,161,1,125,1,124,0,160,0,100,2,161,1,125,2,124, + 1,100,3,117,1,114,82,124,2,100,3,117,1,114,78,124, + 1,124,2,106,1,107,3,114,78,116,2,106,3,100,4,124, + 1,155,2,100,5,124,2,106,1,155,2,100,6,157,5,116, + 4,100,7,100,8,141,3,1,0,124,1,83,0,124,2,100, + 3,117,1,114,96,124,2,106,1,83,0,116,2,106,3,100, + 9,116,4,100,7,100,8,141,3,1,0,124,0,100,10,25, + 0,125,1,100,11,124,0,118,1,114,142,124,1,160,5,100, + 12,161,1,100,13,25,0,125,1,124,1,83,0,41,14,122, + 167,67,97,108,99,117,108,97,116,101,32,119,104,97,116,32, + 95,95,112,97,99,107,97,103,101,95,95,32,115,104,111,117, + 108,100,32,98,101,46,10,10,32,32,32,32,95,95,112,97, + 99,107,97,103,101,95,95,32,105,115,32,110,111,116,32,103, + 117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32, + 100,101,102,105,110,101,100,32,111,114,32,99,111,117,108,100, + 32,98,101,32,115,101,116,32,116,111,32,78,111,110,101,10, + 32,32,32,32,116,111,32,114,101,112,114,101,115,101,110,116, + 32,116,104,97,116,32,105,116,115,32,112,114,111,112,101,114, + 32,118,97,108,117,101,32,105,115,32,117,110,107,110,111,119, + 110,46,10,10,32,32,32,32,114,146,0,0,0,114,106,0, + 0,0,78,122,32,95,95,112,97,99,107,97,103,101,95,95, + 32,33,61,32,95,95,115,112,101,99,95,95,46,112,97,114, + 101,110,116,32,40,122,4,32,33,61,32,250,1,41,233,3, + 0,0,0,41,1,90,10,115,116,97,99,107,108,101,118,101, + 108,122,89,99,97,110,39,116,32,114,101,115,111,108,118,101, + 32,112,97,99,107,97,103,101,32,102,114,111,109,32,95,95, + 115,112,101,99,95,95,32,111,114,32,95,95,112,97,99,107, + 97,103,101,95,95,44,32,102,97,108,108,105,110,103,32,98, + 97,99,107,32,111,110,32,95,95,110,97,109,101,95,95,32, + 97,110,100,32,95,95,112,97,116,104,95,95,114,1,0,0, + 0,114,142,0,0,0,114,129,0,0,0,114,22,0,0,0, + 41,6,114,35,0,0,0,114,131,0,0,0,114,193,0,0, + 0,114,194,0,0,0,114,195,0,0,0,114,130,0,0,0, + 41,3,218,7,103,108,111,98,97,108,115,114,187,0,0,0, + 114,96,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,17,95,99,97,108,99,95,95,95,112,97, + 99,107,97,103,101,95,95,46,4,0,0,115,44,0,0,0, + 10,7,10,1,8,1,18,1,6,1,2,1,4,255,4,1, + 6,255,4,2,6,254,4,3,8,1,6,1,6,2,4,2, + 6,254,8,3,8,1,14,1,4,1,255,128,114,221,0,0, + 0,114,10,0,0,0,99,5,0,0,0,0,0,0,0,0, + 0,0,0,9,0,0,0,5,0,0,0,67,0,0,0,115, + 174,0,0,0,124,4,100,1,107,2,114,18,116,0,124,0, + 131,1,125,5,110,36,124,1,100,2,117,1,114,30,124,1, + 110,2,105,0,125,6,116,1,124,6,131,1,125,7,116,0, + 124,0,124,7,124,4,131,3,125,5,124,3,115,148,124,4, + 100,1,107,2,114,84,116,0,124,0,160,2,100,3,161,1, + 100,1,25,0,131,1,83,0,124,0,115,92,124,5,83,0, + 116,3,124,0,131,1,116,3,124,0,160,2,100,3,161,1, + 100,1,25,0,131,1,24,0,125,8,116,4,106,5,124,5, + 106,6,100,2,116,3,124,5,106,6,131,1,124,8,24,0, + 133,2,25,0,25,0,83,0,116,7,124,5,100,4,131,2, + 114,170,116,8,124,5,124,3,116,0,131,3,83,0,124,5, + 83,0,41,5,97,215,1,0,0,73,109,112,111,114,116,32, + 97,32,109,111,100,117,108,101,46,10,10,32,32,32,32,84, + 104,101,32,39,103,108,111,98,97,108,115,39,32,97,114,103, + 117,109,101,110,116,32,105,115,32,117,115,101,100,32,116,111, + 32,105,110,102,101,114,32,119,104,101,114,101,32,116,104,101, + 32,105,109,112,111,114,116,32,105,115,32,111,99,99,117,114, + 114,105,110,103,32,102,114,111,109,10,32,32,32,32,116,111, + 32,104,97,110,100,108,101,32,114,101,108,97,116,105,118,101, + 32,105,109,112,111,114,116,115,46,32,84,104,101,32,39,108, + 111,99,97,108,115,39,32,97,114,103,117,109,101,110,116,32, + 105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,10, + 32,32,32,32,39,102,114,111,109,108,105,115,116,39,32,97, + 114,103,117,109,101,110,116,32,115,112,101,99,105,102,105,101, + 115,32,119,104,97,116,32,115,104,111,117,108,100,32,101,120, + 105,115,116,32,97,115,32,97,116,116,114,105,98,117,116,101, + 115,32,111,110,32,116,104,101,32,109,111,100,117,108,101,10, + 32,32,32,32,98,101,105,110,103,32,105,109,112,111,114,116, + 101,100,32,40,101,46,103,46,32,96,96,102,114,111,109,32, + 109,111,100,117,108,101,32,105,109,112,111,114,116,32,60,102, + 114,111,109,108,105,115,116,62,96,96,41,46,32,32,84,104, + 101,32,39,108,101,118,101,108,39,10,32,32,32,32,97,114, + 103,117,109,101,110,116,32,114,101,112,114,101,115,101,110,116, + 115,32,116,104,101,32,112,97,99,107,97,103,101,32,108,111, + 99,97,116,105,111,110,32,116,111,32,105,109,112,111,114,116, + 32,102,114,111,109,32,105,110,32,97,32,114,101,108,97,116, + 105,118,101,10,32,32,32,32,105,109,112,111,114,116,32,40, + 101,46,103,46,32,96,96,102,114,111,109,32,46,46,112,107, + 103,32,105,109,112,111,114,116,32,109,111,100,96,96,32,119, + 111,117,108,100,32,104,97,118,101,32,97,32,39,108,101,118, + 101,108,39,32,111,102,32,50,41,46,10,10,32,32,32,32, + 114,22,0,0,0,78,114,129,0,0,0,114,142,0,0,0, + 41,9,114,210,0,0,0,114,221,0,0,0,218,9,112,97, + 114,116,105,116,105,111,110,114,186,0,0,0,114,15,0,0, + 0,114,93,0,0,0,114,1,0,0,0,114,4,0,0,0, + 114,215,0,0,0,41,9,114,17,0,0,0,114,220,0,0, + 0,218,6,108,111,99,97,108,115,114,216,0,0,0,114,188, + 0,0,0,114,97,0,0,0,90,8,103,108,111,98,97,108, + 115,95,114,187,0,0,0,90,7,99,117,116,95,111,102,102, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 10,95,95,105,109,112,111,114,116,95,95,73,4,0,0,115, + 32,0,0,0,8,11,10,1,16,2,8,1,12,1,4,1, + 8,3,18,1,4,1,4,1,26,4,30,3,10,1,12,1, + 4,2,255,128,114,224,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, + 0,0,115,38,0,0,0,116,0,160,1,124,0,161,1,125, + 1,124,1,100,0,117,0,114,30,116,2,100,1,124,0,23, + 0,131,1,130,1,116,3,124,1,131,1,83,0,41,2,78, + 122,25,110,111,32,98,117,105,108,116,45,105,110,32,109,111, + 100,117,108,101,32,110,97,109,101,100,32,41,4,114,161,0, + 0,0,114,168,0,0,0,114,80,0,0,0,114,160,0,0, + 0,41,2,114,17,0,0,0,114,96,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,18,95,98, + 117,105,108,116,105,110,95,102,114,111,109,95,110,97,109,101, + 110,4,0,0,115,10,0,0,0,10,1,8,1,12,1,8, + 1,255,128,114,225,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,10,0,0,0,5,0,0,0,67,0,0, + 0,115,164,0,0,0,124,1,97,0,124,0,97,1,116,2, + 116,1,131,1,125,2,116,1,106,3,160,4,161,0,68,0, + 93,70,92,2,125,3,125,4,116,5,124,4,124,2,131,2, + 114,26,124,3,116,1,106,6,118,0,114,60,116,7,125,5, + 110,16,116,0,160,8,124,3,161,1,114,26,116,9,125,5, + 110,0,116,10,124,4,124,5,131,2,125,6,116,11,124,6, + 124,4,131,2,1,0,113,26,116,1,106,3,116,12,25,0, + 125,7,100,1,68,0,93,46,125,8,124,8,116,1,106,3, + 118,1,114,136,116,13,124,8,131,1,125,9,110,10,116,1, + 106,3,124,8,25,0,125,9,116,14,124,7,124,8,124,9, + 131,3,1,0,113,112,100,2,83,0,41,3,122,250,83,101, + 116,117,112,32,105,109,112,111,114,116,108,105,98,32,98,121, + 32,105,109,112,111,114,116,105,110,103,32,110,101,101,100,101, + 100,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,115,32,97,110,100,32,105,110,106,101,99,116,105,110,103, + 32,116,104,101,109,10,32,32,32,32,105,110,116,111,32,116, + 104,101,32,103,108,111,98,97,108,32,110,97,109,101,115,112, + 97,99,101,46,10,10,32,32,32,32,65,115,32,115,121,115, + 32,105,115,32,110,101,101,100,101,100,32,102,111,114,32,115, + 121,115,46,109,111,100,117,108,101,115,32,97,99,99,101,115, + 115,32,97,110,100,32,95,105,109,112,32,105,115,32,110,101, + 101,100,101,100,32,116,111,32,108,111,97,100,32,98,117,105, + 108,116,45,105,110,10,32,32,32,32,109,111,100,117,108,101, + 115,44,32,116,104,111,115,101,32,116,119,111,32,109,111,100, + 117,108,101,115,32,109,117,115,116,32,98,101,32,101,120,112, + 108,105,99,105,116,108,121,32,112,97,115,115,101,100,32,105, + 110,46,10,10,32,32,32,32,41,3,114,23,0,0,0,114, + 193,0,0,0,114,65,0,0,0,78,41,15,114,58,0,0, + 0,114,15,0,0,0,114,14,0,0,0,114,93,0,0,0, + 218,5,105,116,101,109,115,114,197,0,0,0,114,79,0,0, + 0,114,161,0,0,0,114,89,0,0,0,114,175,0,0,0, + 114,143,0,0,0,114,149,0,0,0,114,1,0,0,0,114, + 225,0,0,0,114,5,0,0,0,41,10,218,10,115,121,115, + 95,109,111,100,117,108,101,218,11,95,105,109,112,95,109,111, + 100,117,108,101,90,11,109,111,100,117,108,101,95,116,121,112, + 101,114,17,0,0,0,114,97,0,0,0,114,110,0,0,0, + 114,96,0,0,0,90,11,115,101,108,102,95,109,111,100,117, + 108,101,90,12,98,117,105,108,116,105,110,95,110,97,109,101, + 90,14,98,117,105,108,116,105,110,95,109,111,100,117,108,101, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 6,95,115,101,116,117,112,117,4,0,0,115,38,0,0,0, + 4,9,4,1,8,3,18,1,10,1,10,1,6,1,10,1, + 6,1,10,3,12,1,10,3,8,1,10,1,10,1,10,2, + 14,1,4,128,255,128,114,229,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,38,0,0,0,116,0,124,0,124,1,131, + 2,1,0,116,1,106,2,160,3,116,4,161,1,1,0,116, + 1,106,2,160,3,116,5,161,1,1,0,100,1,83,0,41, + 2,122,48,73,110,115,116,97,108,108,32,105,109,112,111,114, + 116,101,114,115,32,102,111,114,32,98,117,105,108,116,105,110, + 32,97,110,100,32,102,114,111,122,101,110,32,109,111,100,117, + 108,101,115,78,41,6,114,229,0,0,0,114,15,0,0,0, + 114,192,0,0,0,114,120,0,0,0,114,161,0,0,0,114, + 175,0,0,0,41,2,114,227,0,0,0,114,228,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 8,95,105,110,115,116,97,108,108,152,4,0,0,115,10,0, + 0,0,10,2,12,2,12,1,4,128,255,128,114,230,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,4,0,0,0,67,0,0,0,115,32,0,0,0,100, + 1,100,2,108,0,125,0,124,0,97,1,124,0,160,2,116, + 3,106,4,116,5,25,0,161,1,1,0,100,2,83,0,41, + 3,122,57,73,110,115,116,97,108,108,32,105,109,112,111,114, + 116,101,114,115,32,116,104,97,116,32,114,101,113,117,105,114, + 101,32,101,120,116,101,114,110,97,108,32,102,105,108,101,115, + 121,115,116,101,109,32,97,99,99,101,115,115,114,22,0,0, + 0,78,41,6,218,26,95,102,114,111,122,101,110,95,105,109, + 112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108, + 114,127,0,0,0,114,230,0,0,0,114,15,0,0,0,114, + 93,0,0,0,114,1,0,0,0,41,1,114,231,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 27,95,105,110,115,116,97,108,108,95,101,120,116,101,114,110, + 97,108,95,105,109,112,111,114,116,101,114,115,160,4,0,0, + 115,10,0,0,0,8,3,4,1,16,1,4,128,255,128,114, + 232,0,0,0,41,2,78,78,41,1,78,41,2,78,114,22, + 0,0,0,41,4,78,78,114,10,0,0,0,114,22,0,0, + 0,41,50,114,3,0,0,0,114,127,0,0,0,114,12,0, + 0,0,114,18,0,0,0,114,60,0,0,0,114,34,0,0, + 0,114,44,0,0,0,114,19,0,0,0,114,20,0,0,0, + 114,50,0,0,0,114,51,0,0,0,114,54,0,0,0,114, + 66,0,0,0,114,68,0,0,0,114,77,0,0,0,114,87, + 0,0,0,114,91,0,0,0,114,98,0,0,0,114,112,0, + 0,0,114,113,0,0,0,114,92,0,0,0,114,143,0,0, + 0,114,149,0,0,0,114,153,0,0,0,114,108,0,0,0, + 114,94,0,0,0,114,159,0,0,0,114,160,0,0,0,114, + 95,0,0,0,114,161,0,0,0,114,175,0,0,0,114,180, + 0,0,0,114,189,0,0,0,114,191,0,0,0,114,196,0, + 0,0,114,202,0,0,0,90,15,95,69,82,82,95,77,83, + 71,95,80,82,69,70,73,88,114,204,0,0,0,114,207,0, + 0,0,218,6,111,98,106,101,99,116,114,208,0,0,0,114, + 209,0,0,0,114,210,0,0,0,114,215,0,0,0,114,221, + 0,0,0,114,224,0,0,0,114,225,0,0,0,114,229,0, + 0,0,114,230,0,0,0,114,232,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,8,60,109,111,100,117,108,101,62,1,0,0,0,115,100, + 0,0,0,4,0,4,24,8,2,8,8,4,8,4,2,16, + 3,14,4,14,77,14,21,8,16,8,37,8,17,14,11,8, + 8,8,11,8,12,8,16,14,36,16,101,10,26,14,45,8, + 72,8,17,8,17,8,30,8,37,8,42,14,15,14,75,14, + 79,8,13,8,9,10,9,8,47,4,16,8,1,8,2,6, + 32,8,3,10,16,14,15,8,37,10,27,8,37,8,7,8, + 35,8,8,4,128,255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index f12e2ef3bfd01c..790f627ba6cc7d 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -70,1042 +70,1043 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 84,72,79,78,67,65,83,69,79,75,99,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,19, 0,0,0,115,20,0,0,0,116,0,106,1,106,2,12,0, - 111,18,136,0,116,3,106,4,118,0,83,0,41,1,122,94, + 111,18,136,0,116,3,106,4,118,0,83,0,41,2,122,94, 84,114,117,101,32,105,102,32,102,105,108,101,110,97,109,101, 115,32,109,117,115,116,32,98,101,32,99,104,101,99,107,101, 100,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105, 118,101,108,121,32,97,110,100,32,105,103,110,111,114,101,32, 101,110,118,105,114,111,110,109,101,110,116,32,102,108,97,103, - 115,32,97,114,101,32,110,111,116,32,115,101,116,46,41,5, - 218,3,115,121,115,218,5,102,108,97,103,115,218,18,105,103, - 110,111,114,101,95,101,110,118,105,114,111,110,109,101,110,116, - 218,3,95,111,115,90,7,101,110,118,105,114,111,110,169,0, - 169,1,218,3,107,101,121,114,5,0,0,0,250,38,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,95,101,120,116,101,114, - 110,97,108,62,218,11,95,114,101,108,97,120,95,99,97,115, - 101,36,0,0,0,115,4,0,0,0,20,2,255,128,122,37, - 95,109,97,107,101,95,114,101,108,97,120,95,99,97,115,101, - 46,60,108,111,99,97,108,115,62,46,95,114,101,108,97,120, - 95,99,97,115,101,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,83,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,122,53,84,114,117,101,32, - 105,102,32,102,105,108,101,110,97,109,101,115,32,109,117,115, - 116,32,98,101,32,99,104,101,99,107,101,100,32,99,97,115, - 101,45,105,110,115,101,110,115,105,116,105,118,101,108,121,46, - 70,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,9,0,0,0,40, - 0,0,0,115,4,0,0,0,4,2,255,128,41,5,114,1, - 0,0,0,218,8,112,108,97,116,102,111,114,109,218,10,115, - 116,97,114,116,115,119,105,116,104,218,27,95,67,65,83,69, - 95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,65, - 84,70,79,82,77,83,218,35,95,67,65,83,69,95,73,78, - 83,69,78,83,73,84,73,86,69,95,80,76,65,84,70,79, - 82,77,83,95,83,84,82,95,75,69,89,41,1,114,9,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,8,0,0, - 0,218,16,95,109,97,107,101,95,114,101,108,97,120,95,99, - 97,115,101,29,0,0,0,115,18,0,0,0,12,1,12,1, - 6,1,4,2,12,2,4,7,8,253,4,3,255,128,114,14, + 115,32,97,114,101,32,110,111,116,32,115,101,116,46,78,41, + 5,218,3,115,121,115,218,5,102,108,97,103,115,218,18,105, + 103,110,111,114,101,95,101,110,118,105,114,111,110,109,101,110, + 116,218,3,95,111,115,90,7,101,110,118,105,114,111,110,169, + 0,169,1,218,3,107,101,121,114,5,0,0,0,250,38,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,95,101,120,116,101, + 114,110,97,108,62,218,11,95,114,101,108,97,120,95,99,97, + 115,101,36,0,0,0,115,4,0,0,0,20,2,255,128,122, + 37,95,109,97,107,101,95,114,101,108,97,120,95,99,97,115, + 101,46,60,108,111,99,97,108,115,62,46,95,114,101,108,97, + 120,95,99,97,115,101,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,83,0,0,0,115, + 4,0,0,0,100,1,83,0,41,3,122,53,84,114,117,101, + 32,105,102,32,102,105,108,101,110,97,109,101,115,32,109,117, + 115,116,32,98,101,32,99,104,101,99,107,101,100,32,99,97, + 115,101,45,105,110,115,101,110,115,105,116,105,118,101,108,121, + 46,70,78,114,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,9,0,0, + 0,40,0,0,0,115,4,0,0,0,4,2,255,128,41,5, + 114,1,0,0,0,218,8,112,108,97,116,102,111,114,109,218, + 10,115,116,97,114,116,115,119,105,116,104,218,27,95,67,65, + 83,69,95,73,78,83,69,78,83,73,84,73,86,69,95,80, + 76,65,84,70,79,82,77,83,218,35,95,67,65,83,69,95, + 73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,84, + 70,79,82,77,83,95,83,84,82,95,75,69,89,41,1,114, + 9,0,0,0,114,5,0,0,0,114,6,0,0,0,114,8, + 0,0,0,218,16,95,109,97,107,101,95,114,101,108,97,120, + 95,99,97,115,101,29,0,0,0,115,18,0,0,0,12,1, + 12,1,6,1,4,2,12,2,4,7,8,253,4,3,255,128, + 114,14,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,20, + 0,0,0,116,0,124,0,131,1,100,1,64,0,160,1,100, + 2,100,3,161,2,83,0,41,5,122,42,67,111,110,118,101, + 114,116,32,97,32,51,50,45,98,105,116,32,105,110,116,101, + 103,101,114,32,116,111,32,108,105,116,116,108,101,45,101,110, + 100,105,97,110,46,236,3,0,0,0,255,127,255,127,3,0, + 233,4,0,0,0,218,6,108,105,116,116,108,101,78,41,2, + 218,3,105,110,116,218,8,116,111,95,98,121,116,101,115,41, + 1,218,1,120,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,12,95,112,97,99,107,95,117,105,110,116,51, + 50,46,0,0,0,115,4,0,0,0,20,2,255,128,114,21, 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,4,0,0,0,67,0,0,0,115,20,0,0, - 0,116,0,124,0,131,1,100,1,64,0,160,1,100,2,100, - 3,161,2,83,0,41,4,122,42,67,111,110,118,101,114,116, - 32,97,32,51,50,45,98,105,116,32,105,110,116,101,103,101, - 114,32,116,111,32,108,105,116,116,108,101,45,101,110,100,105, - 97,110,46,236,3,0,0,0,255,127,255,127,3,0,233,4, - 0,0,0,218,6,108,105,116,116,108,101,41,2,218,3,105, - 110,116,218,8,116,111,95,98,121,116,101,115,41,1,218,1, - 120,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,12,95,112,97,99,107,95,117,105,110,116,51,50,46,0, - 0,0,115,4,0,0,0,20,2,255,128,114,21,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,4,0,0,0,67,0,0,0,115,28,0,0,0,116,0, - 124,0,131,1,100,1,107,2,115,16,74,0,130,1,116,1, - 160,2,124,0,100,2,161,2,83,0,41,3,122,47,67,111, - 110,118,101,114,116,32,52,32,98,121,116,101,115,32,105,110, - 32,108,105,116,116,108,101,45,101,110,100,105,97,110,32,116, - 111,32,97,110,32,105,110,116,101,103,101,114,46,114,16,0, - 0,0,114,17,0,0,0,169,3,218,3,108,101,110,114,18, - 0,0,0,218,10,102,114,111,109,95,98,121,116,101,115,169, - 1,218,4,100,97,116,97,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,218,14,95,117,110,112,97,99,107,95, - 117,105,110,116,51,50,51,0,0,0,115,6,0,0,0,16, - 2,12,1,255,128,114,27,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,67, - 0,0,0,115,28,0,0,0,116,0,124,0,131,1,100,1, - 107,2,115,16,74,0,130,1,116,1,160,2,124,0,100,2, - 161,2,83,0,41,3,122,47,67,111,110,118,101,114,116,32, - 50,32,98,121,116,101,115,32,105,110,32,108,105,116,116,108, - 101,45,101,110,100,105,97,110,32,116,111,32,97,110,32,105, - 110,116,101,103,101,114,46,233,2,0,0,0,114,17,0,0, - 0,114,22,0,0,0,114,25,0,0,0,114,5,0,0,0, + 1,0,0,0,4,0,0,0,67,0,0,0,115,28,0,0, + 0,116,0,124,0,131,1,100,1,107,2,115,16,74,0,130, + 1,116,1,160,2,124,0,100,2,161,2,83,0,41,4,122, + 47,67,111,110,118,101,114,116,32,52,32,98,121,116,101,115, + 32,105,110,32,108,105,116,116,108,101,45,101,110,100,105,97, + 110,32,116,111,32,97,110,32,105,110,116,101,103,101,114,46, + 114,16,0,0,0,114,17,0,0,0,78,169,3,218,3,108, + 101,110,114,18,0,0,0,218,10,102,114,111,109,95,98,121, + 116,101,115,169,1,218,4,100,97,116,97,114,5,0,0,0, 114,5,0,0,0,114,8,0,0,0,218,14,95,117,110,112, - 97,99,107,95,117,105,110,116,49,54,56,0,0,0,115,6, - 0,0,0,16,2,12,1,255,128,114,29,0,0,0,99,0, + 97,99,107,95,117,105,110,116,51,50,51,0,0,0,115,6, + 0,0,0,16,2,12,1,255,128,114,27,0,0,0,99,1, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, - 0,0,0,71,0,0,0,115,20,0,0,0,116,0,160,1, - 100,1,100,2,132,0,124,0,68,0,131,1,161,1,83,0, - 41,3,122,31,82,101,112,108,97,99,101,109,101,110,116,32, - 102,111,114,32,111,115,46,112,97,116,104,46,106,111,105,110, - 40,41,46,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,5,0,0,0,83,0,0,0,115,26,0,0, - 0,103,0,124,0,93,18,125,1,124,1,114,4,124,1,160, - 0,116,1,161,1,145,2,113,4,83,0,114,5,0,0,0, - 41,2,218,6,114,115,116,114,105,112,218,15,112,97,116,104, - 95,115,101,112,97,114,97,116,111,114,115,41,2,218,2,46, - 48,218,4,112,97,114,116,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,218,10,60,108,105,115,116,99,111,109, - 112,62,64,0,0,0,115,8,0,0,0,6,0,6,1,14, - 255,255,128,122,30,95,112,97,116,104,95,106,111,105,110,46, - 60,108,111,99,97,108,115,62,46,60,108,105,115,116,99,111, - 109,112,62,41,2,218,8,112,97,116,104,95,115,101,112,218, - 4,106,111,105,110,41,1,218,10,112,97,116,104,95,112,97, - 114,116,115,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,10,95,112,97,116,104,95,106,111,105,110,62,0, - 0,0,115,8,0,0,0,10,2,2,1,8,255,255,128,114, - 38,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,5,0,0,0,67,0,0,0,115,94,0, - 0,0,116,0,116,1,131,1,100,1,107,2,114,36,124,0, - 160,2,116,3,161,1,92,3,125,1,125,2,125,3,124,1, - 124,3,102,2,83,0,116,4,124,0,131,1,68,0,93,40, - 125,4,124,4,116,1,118,0,114,44,124,0,106,5,124,4, - 100,1,100,2,141,2,92,2,125,1,125,3,124,1,124,3, - 102,2,2,0,1,0,83,0,100,3,124,0,102,2,83,0, - 41,4,122,32,82,101,112,108,97,99,101,109,101,110,116,32, - 102,111,114,32,111,115,46,112,97,116,104,46,115,112,108,105, - 116,40,41,46,233,1,0,0,0,41,1,90,8,109,97,120, - 115,112,108,105,116,218,0,41,6,114,23,0,0,0,114,31, - 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, - 35,0,0,0,218,8,114,101,118,101,114,115,101,100,218,6, - 114,115,112,108,105,116,41,5,218,4,112,97,116,104,90,5, - 102,114,111,110,116,218,1,95,218,4,116,97,105,108,114,20, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,11,95,112,97,116,104,95,115,112,108,105,116,68, - 0,0,0,115,18,0,0,0,12,2,16,1,8,1,12,1, - 8,1,18,1,12,1,8,1,255,128,114,47,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,160, - 1,124,0,161,1,83,0,41,1,122,126,83,116,97,116,32, - 116,104,101,32,112,97,116,104,46,10,10,32,32,32,32,77, - 97,100,101,32,97,32,115,101,112,97,114,97,116,101,32,102, - 117,110,99,116,105,111,110,32,116,111,32,109,97,107,101,32, - 105,116,32,101,97,115,105,101,114,32,116,111,32,111,118,101, - 114,114,105,100,101,32,105,110,32,101,120,112,101,114,105,109, - 101,110,116,115,10,32,32,32,32,40,101,46,103,46,32,99, - 97,99,104,101,32,115,116,97,116,32,114,101,115,117,108,116, - 115,41,46,10,10,32,32,32,32,41,2,114,4,0,0,0, - 90,4,115,116,97,116,169,1,114,44,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,10,95,112, - 97,116,104,95,115,116,97,116,80,0,0,0,115,4,0,0, - 0,10,7,255,128,114,49,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,67, - 0,0,0,115,48,0,0,0,122,12,116,0,124,0,131,1, - 125,2,87,0,110,20,4,0,116,1,121,32,1,0,1,0, - 1,0,89,0,100,1,83,0,48,0,124,2,106,2,100,2, - 64,0,124,1,107,2,83,0,41,3,122,49,84,101,115,116, - 32,119,104,101,116,104,101,114,32,116,104,101,32,112,97,116, - 104,32,105,115,32,116,104,101,32,115,112,101,99,105,102,105, - 101,100,32,109,111,100,101,32,116,121,112,101,46,70,105,0, - 240,0,0,41,3,114,49,0,0,0,218,7,79,83,69,114, - 114,111,114,218,7,115,116,95,109,111,100,101,41,3,114,44, - 0,0,0,218,4,109,111,100,101,90,9,115,116,97,116,95, - 105,110,102,111,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,18,95,112,97,116,104,95,105,115,95,109,111, - 100,101,95,116,121,112,101,90,0,0,0,115,12,0,0,0, - 2,2,12,1,12,1,8,1,14,1,255,128,114,53,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,3,0,0,0,67,0,0,0,115,10,0,0,0,116, - 0,124,0,100,1,131,2,83,0,41,2,122,31,82,101,112, - 108,97,99,101,109,101,110,116,32,102,111,114,32,111,115,46, - 112,97,116,104,46,105,115,102,105,108,101,46,105,0,128,0, - 0,41,1,114,53,0,0,0,114,48,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,12,95,112, - 97,116,104,95,105,115,102,105,108,101,99,0,0,0,115,4, - 0,0,0,10,2,255,128,114,54,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,115,22,0,0,0,124,0,115,12,116,0, - 160,1,161,0,125,0,116,2,124,0,100,1,131,2,83,0, - 41,2,122,30,82,101,112,108,97,99,101,109,101,110,116,32, - 102,111,114,32,111,115,46,112,97,116,104,46,105,115,100,105, - 114,46,105,0,64,0,0,41,3,114,4,0,0,0,218,6, - 103,101,116,99,119,100,114,53,0,0,0,114,48,0,0,0, + 0,0,0,67,0,0,0,115,28,0,0,0,116,0,124,0, + 131,1,100,1,107,2,115,16,74,0,130,1,116,1,160,2, + 124,0,100,2,161,2,83,0,41,4,122,47,67,111,110,118, + 101,114,116,32,50,32,98,121,116,101,115,32,105,110,32,108, + 105,116,116,108,101,45,101,110,100,105,97,110,32,116,111,32, + 97,110,32,105,110,116,101,103,101,114,46,233,2,0,0,0, + 114,17,0,0,0,78,114,22,0,0,0,114,25,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 11,95,112,97,116,104,95,105,115,100,105,114,104,0,0,0, - 115,8,0,0,0,4,2,8,1,10,1,255,128,114,56,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,26,0,0,0, - 124,0,160,0,116,1,161,1,112,24,124,0,100,1,100,2, - 133,2,25,0,116,2,118,0,83,0,41,3,122,142,82,101, + 14,95,117,110,112,97,99,107,95,117,105,110,116,49,54,56, + 0,0,0,115,6,0,0,0,16,2,12,1,255,128,114,29, + 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,4,0,0,0,71,0,0,0,115,20,0,0, + 0,116,0,160,1,100,1,100,2,132,0,124,0,68,0,131, + 1,161,1,83,0,41,4,122,31,82,101,112,108,97,99,101, + 109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,104, + 46,106,111,105,110,40,41,46,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,5,0,0,0,83,0,0, + 0,115,26,0,0,0,103,0,124,0,93,18,125,1,124,1, + 114,4,124,1,160,0,116,1,161,1,145,2,113,4,83,0, + 114,5,0,0,0,41,2,218,6,114,115,116,114,105,112,218, + 15,112,97,116,104,95,115,101,112,97,114,97,116,111,114,115, + 41,2,218,2,46,48,218,4,112,97,114,116,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,10,60,108,105, + 115,116,99,111,109,112,62,64,0,0,0,115,8,0,0,0, + 6,0,6,1,14,255,255,128,122,30,95,112,97,116,104,95, + 106,111,105,110,46,60,108,111,99,97,108,115,62,46,60,108, + 105,115,116,99,111,109,112,62,78,41,2,218,8,112,97,116, + 104,95,115,101,112,218,4,106,111,105,110,41,1,218,10,112, + 97,116,104,95,112,97,114,116,115,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,10,95,112,97,116,104,95, + 106,111,105,110,62,0,0,0,115,8,0,0,0,10,2,2, + 1,8,255,255,128,114,38,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, + 0,0,0,115,94,0,0,0,116,0,116,1,131,1,100,1, + 107,2,114,36,124,0,160,2,116,3,161,1,92,3,125,1, + 125,2,125,3,124,1,124,3,102,2,83,0,116,4,124,0, + 131,1,68,0,93,40,125,4,124,4,116,1,118,0,114,44, + 124,0,106,5,124,4,100,1,100,2,141,2,92,2,125,1, + 125,3,124,1,124,3,102,2,2,0,1,0,83,0,100,3, + 124,0,102,2,83,0,41,5,122,32,82,101,112,108,97,99, + 101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,116, + 104,46,115,112,108,105,116,40,41,46,233,1,0,0,0,41, + 1,90,8,109,97,120,115,112,108,105,116,218,0,78,41,6, + 114,23,0,0,0,114,31,0,0,0,218,10,114,112,97,114, + 116,105,116,105,111,110,114,35,0,0,0,218,8,114,101,118, + 101,114,115,101,100,218,6,114,115,112,108,105,116,41,5,218, + 4,112,97,116,104,90,5,102,114,111,110,116,218,1,95,218, + 4,116,97,105,108,114,20,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,11,95,112,97,116,104, + 95,115,112,108,105,116,68,0,0,0,115,18,0,0,0,12, + 2,16,1,8,1,12,1,8,1,18,1,12,1,8,1,255, + 128,114,47,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 10,0,0,0,116,0,160,1,124,0,161,1,83,0,41,2, + 122,126,83,116,97,116,32,116,104,101,32,112,97,116,104,46, + 10,10,32,32,32,32,77,97,100,101,32,97,32,115,101,112, + 97,114,97,116,101,32,102,117,110,99,116,105,111,110,32,116, + 111,32,109,97,107,101,32,105,116,32,101,97,115,105,101,114, + 32,116,111,32,111,118,101,114,114,105,100,101,32,105,110,32, + 101,120,112,101,114,105,109,101,110,116,115,10,32,32,32,32, + 40,101,46,103,46,32,99,97,99,104,101,32,115,116,97,116, + 32,114,101,115,117,108,116,115,41,46,10,10,32,32,32,32, + 78,41,2,114,4,0,0,0,90,4,115,116,97,116,169,1, + 114,44,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,10,95,112,97,116,104,95,115,116,97,116, + 80,0,0,0,115,4,0,0,0,10,7,255,128,114,49,0, + 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,8,0,0,0,67,0,0,0,115,48,0,0,0, + 122,12,116,0,124,0,131,1,125,2,87,0,110,20,4,0, + 116,1,121,32,1,0,1,0,1,0,89,0,100,1,83,0, + 48,0,124,2,106,2,100,2,64,0,124,1,107,2,83,0, + 41,4,122,49,84,101,115,116,32,119,104,101,116,104,101,114, + 32,116,104,101,32,112,97,116,104,32,105,115,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,32,109,111,100,101,32, + 116,121,112,101,46,70,105,0,240,0,0,78,41,3,114,49, + 0,0,0,218,7,79,83,69,114,114,111,114,218,7,115,116, + 95,109,111,100,101,41,3,114,44,0,0,0,218,4,109,111, + 100,101,90,9,115,116,97,116,95,105,110,102,111,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,18,95,112, + 97,116,104,95,105,115,95,109,111,100,101,95,116,121,112,101, + 90,0,0,0,115,12,0,0,0,2,2,12,1,12,1,8, + 1,14,1,255,128,114,53,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, + 0,0,0,115,10,0,0,0,116,0,124,0,100,1,131,2, + 83,0,41,3,122,31,82,101,112,108,97,99,101,109,101,110, + 116,32,102,111,114,32,111,115,46,112,97,116,104,46,105,115, + 102,105,108,101,46,105,0,128,0,0,78,41,1,114,53,0, + 0,0,114,48,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,12,95,112,97,116,104,95,105,115, + 102,105,108,101,99,0,0,0,115,4,0,0,0,10,2,255, + 128,114,54,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 22,0,0,0,124,0,115,12,116,0,160,1,161,0,125,0, + 116,2,124,0,100,1,131,2,83,0,41,3,122,30,82,101, 112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,115, - 46,112,97,116,104,46,105,115,97,98,115,46,10,10,32,32, - 32,32,67,111,110,115,105,100,101,114,115,32,97,32,87,105, - 110,100,111,119,115,32,100,114,105,118,101,45,114,101,108,97, - 116,105,118,101,32,112,97,116,104,32,40,110,111,32,100,114, - 105,118,101,44,32,98,117,116,32,115,116,97,114,116,115,32, - 119,105,116,104,32,115,108,97,115,104,41,32,116,111,10,32, - 32,32,32,115,116,105,108,108,32,98,101,32,34,97,98,115, - 111,108,117,116,101,34,46,10,32,32,32,32,114,39,0,0, - 0,233,3,0,0,0,41,3,114,11,0,0,0,114,31,0, - 0,0,218,20,95,112,97,116,104,115,101,112,115,95,119,105, - 116,104,95,99,111,108,111,110,114,48,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,11,95,112, - 97,116,104,95,105,115,97,98,115,111,0,0,0,115,4,0, - 0,0,26,6,255,128,114,59,0,0,0,233,182,1,0,0, - 99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0, - 0,11,0,0,0,67,0,0,0,115,170,0,0,0,100,1, - 160,0,124,0,116,1,124,0,131,1,161,2,125,3,116,2, - 160,3,124,3,116,2,106,4,116,2,106,5,66,0,116,2, - 106,6,66,0,124,2,100,2,64,0,161,3,125,4,122,72, - 116,7,160,8,124,4,100,3,161,2,143,26,125,5,124,5, - 160,9,124,1,161,1,1,0,87,0,100,4,4,0,4,0, - 131,3,1,0,110,16,49,0,115,94,48,0,1,0,1,0, - 1,0,89,0,1,0,116,2,160,10,124,3,124,0,161,2, - 1,0,87,0,100,4,83,0,4,0,116,11,121,168,1,0, - 1,0,1,0,122,14,116,2,160,12,124,3,161,1,1,0, - 87,0,130,0,4,0,116,11,121,166,1,0,1,0,1,0, - 89,0,130,0,48,0,48,0,41,5,122,162,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,250,5, - 123,125,46,123,125,114,60,0,0,0,90,2,119,98,78,41, - 13,218,6,102,111,114,109,97,116,218,2,105,100,114,4,0, - 0,0,90,4,111,112,101,110,90,6,79,95,69,88,67,76, - 90,7,79,95,67,82,69,65,84,90,8,79,95,87,82,79, - 78,76,89,218,3,95,105,111,218,6,70,105,108,101,73,79, - 218,5,119,114,105,116,101,218,7,114,101,112,108,97,99,101, - 114,50,0,0,0,90,6,117,110,108,105,110,107,41,6,114, - 44,0,0,0,114,26,0,0,0,114,52,0,0,0,90,8, - 112,97,116,104,95,116,109,112,90,2,102,100,218,4,102,105, - 108,101,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,13,95,119,114,105,116,101,95,97,116,111,109,105,99, - 120,0,0,0,115,38,0,0,0,16,5,6,1,22,1,4, - 255,2,2,14,3,40,1,14,1,4,128,12,1,2,1,12, - 1,2,3,12,254,2,1,2,1,2,255,2,1,255,128,114, - 69,0,0,0,105,103,13,0,0,114,28,0,0,0,114,17, - 0,0,0,115,2,0,0,0,13,10,90,11,95,95,112,121, - 99,97,99,104,101,95,95,122,4,111,112,116,45,122,3,46, - 112,121,122,4,46,112,121,99,78,41,1,218,12,111,112,116, - 105,109,105,122,97,116,105,111,110,99,2,0,0,0,0,0, - 0,0,1,0,0,0,12,0,0,0,5,0,0,0,67,0, - 0,0,115,88,1,0,0,124,1,100,1,117,1,114,52,116, - 0,160,1,100,2,116,2,161,2,1,0,124,2,100,1,117, - 1,114,40,100,3,125,3,116,3,124,3,131,1,130,1,124, - 1,114,48,100,4,110,2,100,5,125,2,116,4,160,5,124, - 0,161,1,125,0,116,6,124,0,131,1,92,2,125,4,125, - 5,124,5,160,7,100,6,161,1,92,3,125,6,125,7,125, - 8,116,8,106,9,106,10,125,9,124,9,100,1,117,0,114, - 114,116,11,100,7,131,1,130,1,100,4,160,12,124,6,114, - 126,124,6,110,2,124,8,124,7,124,9,103,3,161,1,125, - 10,124,2,100,1,117,0,114,172,116,8,106,13,106,14,100, - 8,107,2,114,164,100,4,125,2,110,8,116,8,106,13,106, - 14,125,2,116,15,124,2,131,1,125,2,124,2,100,4,107, - 3,114,224,124,2,160,16,161,0,115,210,116,17,100,9,160, - 18,124,2,161,1,131,1,130,1,100,10,160,18,124,10,116, - 19,124,2,161,3,125,10,124,10,116,20,100,8,25,0,23, - 0,125,11,116,8,106,21,100,1,117,1,144,1,114,76,116, - 22,124,4,131,1,144,1,115,16,116,23,116,4,160,24,161, - 0,124,4,131,2,125,4,124,4,100,5,25,0,100,11,107, - 2,144,1,114,56,124,4,100,8,25,0,116,25,118,1,144, - 1,114,56,124,4,100,12,100,1,133,2,25,0,125,4,116, - 23,116,8,106,21,124,4,160,26,116,25,161,1,124,11,131, - 3,83,0,116,23,124,4,116,27,124,11,131,3,83,0,41, - 13,97,254,2,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,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,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,10,10, - 32,32,32,32,84,104,101,32,39,111,112,116,105,109,105,122, - 97,116,105,111,110,39,32,112,97,114,97,109,101,116,101,114, - 32,99,111,110,116,114,111,108,115,32,116,104,101,32,112,114, - 101,115,117,109,101,100,32,111,112,116,105,109,105,122,97,116, - 105,111,110,32,108,101,118,101,108,32,111,102,10,32,32,32, - 32,116,104,101,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,46,32,73,102,32,39,111,112,116,105,109,105,122,97, - 116,105,111,110,39,32,105,115,32,110,111,116,32,78,111,110, - 101,44,32,116,104,101,32,115,116,114,105,110,103,32,114,101, - 112,114,101,115,101,110,116,97,116,105,111,110,10,32,32,32, - 32,111,102,32,116,104,101,32,97,114,103,117,109,101,110,116, - 32,105,115,32,116,97,107,101,110,32,97,110,100,32,118,101, - 114,105,102,105,101,100,32,116,111,32,98,101,32,97,108,112, - 104,97,110,117,109,101,114,105,99,32,40,101,108,115,101,32, - 86,97,108,117,101,69,114,114,111,114,10,32,32,32,32,105, - 115,32,114,97,105,115,101,100,41,46,10,10,32,32,32,32, - 84,104,101,32,100,101,98,117,103,95,111,118,101,114,114,105, - 100,101,32,112,97,114,97,109,101,116,101,114,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,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,10,32,32,32,32,97, - 32,84,114,117,101,32,118,97,108,117,101,32,105,115,32,116, - 104,101,32,115,97,109,101,32,97,115,32,115,101,116,116,105, - 110,103,32,39,111,112,116,105,109,105,122,97,116,105,111,110, - 39,32,116,111,32,116,104,101,32,101,109,112,116,121,32,115, - 116,114,105,110,103,10,32,32,32,32,119,104,105,108,101,32, - 97,32,70,97,108,115,101,32,118,97,108,117,101,32,105,115, - 32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,115, - 101,116,116,105,110,103,32,39,111,112,116,105,109,105,122,97, - 116,105,111,110,39,32,116,111,32,39,49,39,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,122,70,116,104,101,32,100,101,98,117,103, - 95,111,118,101,114,114,105,100,101,32,112,97,114,97,109,101, - 116,101,114,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,59,32,117,115,101,32,39,111,112,116,105,109,105,122,97, - 116,105,111,110,39,32,105,110,115,116,101,97,100,122,50,100, - 101,98,117,103,95,111,118,101,114,114,105,100,101,32,111,114, - 32,111,112,116,105,109,105,122,97,116,105,111,110,32,109,117, - 115,116,32,98,101,32,115,101,116,32,116,111,32,78,111,110, - 101,114,40,0,0,0,114,39,0,0,0,218,1,46,250,36, - 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,233,0,0,0,0,122,24,123,33,114,125,32, - 105,115,32,110,111,116,32,97,108,112,104,97,110,117,109,101, - 114,105,99,122,7,123,125,46,123,125,123,125,250,1,58,114, - 28,0,0,0,41,28,218,9,95,119,97,114,110,105,110,103, - 115,218,4,119,97,114,110,218,18,68,101,112,114,101,99,97, - 116,105,111,110,87,97,114,110,105,110,103,218,9,84,121,112, - 101,69,114,114,111,114,114,4,0,0,0,218,6,102,115,112, - 97,116,104,114,47,0,0,0,114,41,0,0,0,114,1,0, - 0,0,218,14,105,109,112,108,101,109,101,110,116,97,116,105, - 111,110,218,9,99,97,99,104,101,95,116,97,103,218,19,78, - 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, - 111,114,114,36,0,0,0,114,2,0,0,0,218,8,111,112, - 116,105,109,105,122,101,218,3,115,116,114,218,7,105,115,97, - 108,110,117,109,218,10,86,97,108,117,101,69,114,114,111,114, - 114,62,0,0,0,218,4,95,79,80,84,218,17,66,89,84, - 69,67,79,68,69,95,83,85,70,70,73,88,69,83,218,14, - 112,121,99,97,99,104,101,95,112,114,101,102,105,120,114,59, - 0,0,0,114,38,0,0,0,114,55,0,0,0,114,31,0, - 0,0,218,6,108,115,116,114,105,112,218,8,95,80,89,67, - 65,67,72,69,41,12,114,44,0,0,0,90,14,100,101,98, - 117,103,95,111,118,101,114,114,105,100,101,114,70,0,0,0, - 218,7,109,101,115,115,97,103,101,218,4,104,101,97,100,114, - 46,0,0,0,90,4,98,97,115,101,218,3,115,101,112,218, - 4,114,101,115,116,90,3,116,97,103,90,15,97,108,109,111, - 115,116,95,102,105,108,101,110,97,109,101,218,8,102,105,108, - 101,110,97,109,101,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,17,99,97,99,104,101,95,102,114,111,109, - 95,115,111,117,114,99,101,47,1,0,0,115,74,0,0,0, - 8,18,6,1,2,1,4,255,8,2,4,1,8,1,12,1, - 10,1,12,1,16,1,8,1,8,1,8,1,24,1,8,1, - 12,1,6,1,8,2,8,1,8,1,8,1,14,1,14,1, - 12,1,12,1,10,9,14,1,28,5,12,1,2,4,4,1, - 8,1,2,1,4,253,12,5,255,128,114,97,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, - 5,0,0,0,67,0,0,0,115,44,1,0,0,116,0,106, - 1,106,2,100,1,117,0,114,20,116,3,100,2,131,1,130, - 1,116,4,160,5,124,0,161,1,125,0,116,6,124,0,131, - 1,92,2,125,1,125,2,100,3,125,3,116,0,106,7,100, - 1,117,1,114,102,116,0,106,7,160,8,116,9,161,1,125, - 4,124,1,160,10,124,4,116,11,23,0,161,1,114,102,124, - 1,116,12,124,4,131,1,100,1,133,2,25,0,125,1,100, - 4,125,3,124,3,115,144,116,6,124,1,131,1,92,2,125, - 1,125,5,124,5,116,13,107,3,114,144,116,14,116,13,155, - 0,100,5,124,0,155,2,157,3,131,1,130,1,124,2,160, - 15,100,6,161,1,125,6,124,6,100,7,118,1,114,176,116, - 14,100,8,124,2,155,2,157,2,131,1,130,1,124,6,100, - 9,107,2,144,1,114,12,124,2,160,16,100,6,100,10,161, - 2,100,11,25,0,125,7,124,7,160,10,116,17,161,1,115, - 226,116,14,100,12,116,17,155,2,157,2,131,1,130,1,124, - 7,116,12,116,17,131,1,100,1,133,2,25,0,125,8,124, - 8,160,18,161,0,144,1,115,12,116,14,100,13,124,7,155, - 2,100,14,157,3,131,1,130,1,124,2,160,19,100,6,161, - 1,100,15,25,0,125,9,116,20,124,1,124,9,116,21,100, - 15,25,0,23,0,131,2,83,0,41,16,97,110,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,32,102,105,108,101,44,32, + 46,112,97,116,104,46,105,115,100,105,114,46,105,0,64,0, + 0,78,41,3,114,4,0,0,0,218,6,103,101,116,99,119, + 100,114,53,0,0,0,114,48,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,11,95,112,97,116, + 104,95,105,115,100,105,114,104,0,0,0,115,8,0,0,0, + 4,2,8,1,10,1,255,128,114,56,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,26,0,0,0,124,0,160,0,116, + 1,161,1,112,24,124,0,100,1,100,2,133,2,25,0,116, + 2,118,0,83,0,41,4,122,142,82,101,112,108,97,99,101, + 109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,104, + 46,105,115,97,98,115,46,10,10,32,32,32,32,67,111,110, + 115,105,100,101,114,115,32,97,32,87,105,110,100,111,119,115, + 32,100,114,105,118,101,45,114,101,108,97,116,105,118,101,32, + 112,97,116,104,32,40,110,111,32,100,114,105,118,101,44,32, + 98,117,116,32,115,116,97,114,116,115,32,119,105,116,104,32, + 115,108,97,115,104,41,32,116,111,10,32,32,32,32,115,116, + 105,108,108,32,98,101,32,34,97,98,115,111,108,117,116,101, + 34,46,10,32,32,32,32,114,39,0,0,0,233,3,0,0, + 0,78,41,3,114,11,0,0,0,114,31,0,0,0,218,20, + 95,112,97,116,104,115,101,112,115,95,119,105,116,104,95,99, + 111,108,111,110,114,48,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, + 105,115,97,98,115,111,0,0,0,115,4,0,0,0,26,6, + 255,128,114,59,0,0,0,233,182,1,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,11,0,0, + 0,67,0,0,0,115,170,0,0,0,100,1,160,0,124,0, + 116,1,124,0,131,1,161,2,125,3,116,2,160,3,124,3, + 116,2,106,4,116,2,106,5,66,0,116,2,106,6,66,0, + 124,2,100,2,64,0,161,3,125,4,122,72,116,7,160,8, + 124,4,100,3,161,2,143,26,125,5,124,5,160,9,124,1, + 161,1,1,0,87,0,100,4,4,0,4,0,131,3,1,0, + 110,16,49,0,115,94,48,0,1,0,1,0,1,0,89,0, + 1,0,116,2,160,10,124,3,124,0,161,2,1,0,87,0, + 100,4,83,0,4,0,116,11,121,168,1,0,1,0,1,0, + 122,14,116,2,160,12,124,3,161,1,1,0,87,0,130,0, + 4,0,116,11,121,166,1,0,1,0,1,0,89,0,130,0, + 48,0,48,0,41,5,122,162,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,250,5,123,125,46,123, + 125,114,60,0,0,0,90,2,119,98,78,41,13,218,6,102, + 111,114,109,97,116,218,2,105,100,114,4,0,0,0,90,4, + 111,112,101,110,90,6,79,95,69,88,67,76,90,7,79,95, + 67,82,69,65,84,90,8,79,95,87,82,79,78,76,89,218, + 3,95,105,111,218,6,70,105,108,101,73,79,218,5,119,114, + 105,116,101,218,7,114,101,112,108,97,99,101,114,50,0,0, + 0,90,6,117,110,108,105,110,107,41,6,114,44,0,0,0, + 114,26,0,0,0,114,52,0,0,0,90,8,112,97,116,104, + 95,116,109,112,90,2,102,100,218,4,102,105,108,101,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,13,95, + 119,114,105,116,101,95,97,116,111,109,105,99,120,0,0,0, + 115,38,0,0,0,16,5,6,1,22,1,4,255,2,2,14, + 3,40,1,14,1,4,128,12,1,2,1,12,1,2,3,12, + 254,2,1,2,1,2,255,2,1,255,128,114,69,0,0,0, + 105,103,13,0,0,114,28,0,0,0,114,17,0,0,0,115, + 2,0,0,0,13,10,90,11,95,95,112,121,99,97,99,104, + 101,95,95,122,4,111,112,116,45,122,3,46,112,121,122,4, + 46,112,121,99,78,41,1,218,12,111,112,116,105,109,105,122, + 97,116,105,111,110,99,2,0,0,0,0,0,0,0,1,0, + 0,0,12,0,0,0,5,0,0,0,67,0,0,0,115,88, + 1,0,0,124,1,100,1,117,1,114,52,116,0,160,1,100, + 2,116,2,161,2,1,0,124,2,100,1,117,1,114,40,100, + 3,125,3,116,3,124,3,131,1,130,1,124,1,114,48,100, + 4,110,2,100,5,125,2,116,4,160,5,124,0,161,1,125, + 0,116,6,124,0,131,1,92,2,125,4,125,5,124,5,160, + 7,100,6,161,1,92,3,125,6,125,7,125,8,116,8,106, + 9,106,10,125,9,124,9,100,1,117,0,114,114,116,11,100, + 7,131,1,130,1,100,4,160,12,124,6,114,126,124,6,110, + 2,124,8,124,7,124,9,103,3,161,1,125,10,124,2,100, + 1,117,0,114,172,116,8,106,13,106,14,100,8,107,2,114, + 164,100,4,125,2,110,8,116,8,106,13,106,14,125,2,116, + 15,124,2,131,1,125,2,124,2,100,4,107,3,114,224,124, + 2,160,16,161,0,115,210,116,17,100,9,160,18,124,2,161, + 1,131,1,130,1,100,10,160,18,124,10,116,19,124,2,161, + 3,125,10,124,10,116,20,100,8,25,0,23,0,125,11,116, + 8,106,21,100,1,117,1,144,1,114,76,116,22,124,4,131, + 1,144,1,115,16,116,23,116,4,160,24,161,0,124,4,131, + 2,125,4,124,4,100,5,25,0,100,11,107,2,144,1,114, + 56,124,4,100,8,25,0,116,25,118,1,144,1,114,56,124, + 4,100,12,100,1,133,2,25,0,125,4,116,23,116,8,106, + 21,124,4,160,26,116,25,161,1,124,11,131,3,83,0,116, + 23,124,4,116,27,124,11,131,3,83,0,41,13,97,254,2, + 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,32,102,105,108,101,46, - 10,10,32,32,32,32,84,104,101,32,46,112,121,99,32,102, + 116,111,32,105,116,115,32,46,112,121,99,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,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,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,47,52,56,56,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,114, - 72,0,0,0,70,84,122,31,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,114,71,0,0,0,62,2,0,0, - 0,114,28,0,0,0,114,57,0,0,0,122,29,101,120,112, - 101,99,116,101,100,32,111,110,108,121,32,50,32,111,114,32, - 51,32,100,111,116,115,32,105,110,32,114,57,0,0,0,114, - 28,0,0,0,233,254,255,255,255,122,53,111,112,116,105,109, - 105,122,97,116,105,111,110,32,112,111,114,116,105,111,110,32, - 111,102,32,102,105,108,101,110,97,109,101,32,100,111,101,115, - 32,110,111,116,32,115,116,97,114,116,32,119,105,116,104,32, - 122,19,111,112,116,105,109,105,122,97,116,105,111,110,32,108, - 101,118,101,108,32,122,29,32,105,115,32,110,111,116,32,97, - 110,32,97,108,112,104,97,110,117,109,101,114,105,99,32,118, - 97,108,117,101,114,73,0,0,0,41,22,114,1,0,0,0, - 114,80,0,0,0,114,81,0,0,0,114,82,0,0,0,114, - 4,0,0,0,114,79,0,0,0,114,47,0,0,0,114,89, - 0,0,0,114,30,0,0,0,114,31,0,0,0,114,11,0, - 0,0,114,35,0,0,0,114,23,0,0,0,114,91,0,0, - 0,114,86,0,0,0,218,5,99,111,117,110,116,114,43,0, - 0,0,114,87,0,0,0,114,85,0,0,0,218,9,112,97, - 114,116,105,116,105,111,110,114,38,0,0,0,218,15,83,79, - 85,82,67,69,95,83,85,70,70,73,88,69,83,41,10,114, - 44,0,0,0,114,93,0,0,0,90,16,112,121,99,97,99, - 104,101,95,102,105,108,101,110,97,109,101,90,23,102,111,117, - 110,100,95,105,110,95,112,121,99,97,99,104,101,95,112,114, - 101,102,105,120,90,13,115,116,114,105,112,112,101,100,95,112, - 97,116,104,90,7,112,121,99,97,99,104,101,90,9,100,111, - 116,95,99,111,117,110,116,114,70,0,0,0,90,9,111,112, - 116,95,108,101,118,101,108,90,13,98,97,115,101,95,102,105, - 108,101,110,97,109,101,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,17,115,111,117,114,99,101,95,102,114, - 111,109,95,99,97,99,104,101,118,1,0,0,115,62,0,0, - 0,12,9,8,1,10,1,12,1,4,1,10,1,12,1,14, - 1,16,1,4,1,4,1,12,1,8,1,8,1,2,1,8, - 255,10,2,8,1,14,1,10,1,16,1,10,1,4,1,2, - 1,8,255,16,2,10,1,16,1,14,2,18,1,255,128,114, - 102,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,9,0,0,0,67,0,0,0,115,124,0, - 0,0,116,0,124,0,131,1,100,1,107,2,114,16,100,2, - 83,0,124,0,160,1,100,3,161,1,92,3,125,1,125,2, - 125,3,124,1,114,56,124,3,160,2,161,0,100,4,100,5, - 133,2,25,0,100,6,107,3,114,60,124,0,83,0,122,12, - 116,3,124,0,131,1,125,4,87,0,110,34,4,0,116,4, - 116,5,102,2,121,106,1,0,1,0,1,0,124,0,100,2, - 100,5,133,2,25,0,125,4,89,0,110,2,48,0,116,6, - 124,4,131,1,114,120,124,4,83,0,124,0,83,0,41,7, - 122,188,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,114,73, - 0,0,0,78,114,71,0,0,0,233,253,255,255,255,233,255, - 255,255,255,90,2,112,121,41,7,114,23,0,0,0,114,41, - 0,0,0,218,5,108,111,119,101,114,114,102,0,0,0,114, - 82,0,0,0,114,86,0,0,0,114,54,0,0,0,41,5, - 218,13,98,121,116,101,99,111,100,101,95,112,97,116,104,114, - 95,0,0,0,114,45,0,0,0,90,9,101,120,116,101,110, - 115,105,111,110,218,11,115,111,117,114,99,101,95,112,97,116, - 104,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,15,95,103,101,116,95,115,111,117,114,99,101,102,105,108, - 101,158,1,0,0,115,22,0,0,0,12,7,4,1,16,1, - 24,1,4,1,2,1,12,1,16,1,18,1,16,1,255,128, - 114,108,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,8,0,0,0,67,0,0,0,115,68, - 0,0,0,124,0,160,0,116,1,116,2,131,1,161,1,114, - 46,122,10,116,3,124,0,131,1,87,0,83,0,4,0,116, - 4,121,44,1,0,1,0,1,0,89,0,100,0,83,0,48, - 0,124,0,160,0,116,1,116,5,131,1,161,1,114,64,124, - 0,83,0,100,0,83,0,169,1,78,41,6,218,8,101,110, - 100,115,119,105,116,104,218,5,116,117,112,108,101,114,101,0, - 0,0,114,97,0,0,0,114,82,0,0,0,114,88,0,0, - 0,41,1,114,96,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,11,95,103,101,116,95,99,97, - 99,104,101,100,177,1,0,0,115,22,0,0,0,14,1,2, - 1,10,1,12,1,2,1,4,128,2,0,14,1,4,1,4, - 2,255,128,114,112,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,8,0,0,0,67,0,0, - 0,115,50,0,0,0,122,14,116,0,124,0,131,1,106,1, - 125,1,87,0,110,22,4,0,116,2,121,36,1,0,1,0, - 1,0,100,1,125,1,89,0,110,2,48,0,124,1,100,2, - 79,0,125,1,124,1,83,0,41,3,122,51,67,97,108,99, - 117,108,97,116,101,32,116,104,101,32,109,111,100,101,32,112, - 101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,97, - 32,98,121,116,101,99,111,100,101,32,102,105,108,101,46,114, - 60,0,0,0,233,128,0,0,0,41,3,114,49,0,0,0, - 114,51,0,0,0,114,50,0,0,0,41,2,114,44,0,0, - 0,114,52,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,10,95,99,97,108,99,95,109,111,100, - 101,189,1,0,0,115,14,0,0,0,2,2,14,1,12,1, - 10,1,8,3,4,1,255,128,114,114,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0, - 0,0,3,0,0,0,115,66,0,0,0,100,6,135,0,102, - 1,100,2,100,3,132,9,125,1,122,10,116,0,106,1,125, - 2,87,0,110,26,4,0,116,2,121,50,1,0,1,0,1, - 0,100,4,100,5,132,0,125,2,89,0,110,2,48,0,124, - 2,124,1,136,0,131,2,1,0,124,1,83,0,41,7,122, - 252,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,0,0,0,0,4,0,0,0,4, - 0,0,0,31,0,0,0,115,72,0,0,0,124,1,100,0, - 117,0,114,16,124,0,106,0,125,1,110,32,124,0,106,0, - 124,1,107,3,114,48,116,1,100,1,124,0,106,0,124,1, - 102,2,22,0,124,1,100,2,141,2,130,1,136,0,124,0, - 124,1,103,2,124,2,162,1,82,0,105,0,124,3,164,1, - 142,1,83,0,41,3,78,122,30,108,111,97,100,101,114,32, - 102,111,114,32,37,115,32,99,97,110,110,111,116,32,104,97, - 110,100,108,101,32,37,115,169,1,218,4,110,97,109,101,41, - 2,114,116,0,0,0,218,11,73,109,112,111,114,116,69,114, - 114,111,114,41,4,218,4,115,101,108,102,114,116,0,0,0, - 218,4,97,114,103,115,218,6,107,119,97,114,103,115,169,1, - 218,6,109,101,116,104,111,100,114,5,0,0,0,114,8,0, - 0,0,218,19,95,99,104,101,99,107,95,110,97,109,101,95, - 119,114,97,112,112,101,114,209,1,0,0,115,20,0,0,0, - 8,1,8,1,10,1,4,1,8,1,2,255,2,1,6,255, - 24,2,255,128,122,40,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,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,7, - 0,0,0,83,0,0,0,115,56,0,0,0,100,1,68,0, - 93,32,125,2,116,0,124,1,124,2,131,2,114,4,116,1, - 124,0,124,2,116,2,124,1,124,2,131,2,131,3,1,0, - 113,4,124,0,106,3,160,4,124,1,106,3,161,1,1,0, - 100,0,83,0,41,2,78,41,4,218,10,95,95,109,111,100, - 117,108,101,95,95,218,8,95,95,110,97,109,101,95,95,218, - 12,95,95,113,117,97,108,110,97,109,101,95,95,218,7,95, - 95,100,111,99,95,95,41,5,218,7,104,97,115,97,116,116, - 114,218,7,115,101,116,97,116,116,114,218,7,103,101,116,97, - 116,116,114,218,8,95,95,100,105,99,116,95,95,218,6,117, - 112,100,97,116,101,41,3,90,3,110,101,119,90,3,111,108, - 100,114,67,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,5,95,119,114,97,112,220,1,0,0, - 115,12,0,0,0,8,1,10,1,20,1,14,1,4,128,255, - 128,122,26,95,99,104,101,99,107,95,110,97,109,101,46,60, - 108,111,99,97,108,115,62,46,95,119,114,97,112,41,1,78, - 41,3,218,10,95,98,111,111,116,115,116,114,97,112,114,133, - 0,0,0,218,9,78,97,109,101,69,114,114,111,114,41,3, - 114,122,0,0,0,114,123,0,0,0,114,133,0,0,0,114, - 5,0,0,0,114,121,0,0,0,114,8,0,0,0,218,11, - 95,99,104,101,99,107,95,110,97,109,101,201,1,0,0,115, - 16,0,0,0,14,8,2,7,10,1,12,1,14,2,10,5, - 4,1,255,128,114,136,0,0,0,99,2,0,0,0,0,0, + 116,104,101,32,112,97,116,104,32,116,111,32,116,104,101,10, + 32,32,32,32,46,112,121,99,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,10,10,32,32,32,32, + 84,104,101,32,39,111,112,116,105,109,105,122,97,116,105,111, + 110,39,32,112,97,114,97,109,101,116,101,114,32,99,111,110, + 116,114,111,108,115,32,116,104,101,32,112,114,101,115,117,109, + 101,100,32,111,112,116,105,109,105,122,97,116,105,111,110,32, + 108,101,118,101,108,32,111,102,10,32,32,32,32,116,104,101, + 32,98,121,116,101,99,111,100,101,32,102,105,108,101,46,32, + 73,102,32,39,111,112,116,105,109,105,122,97,116,105,111,110, + 39,32,105,115,32,110,111,116,32,78,111,110,101,44,32,116, + 104,101,32,115,116,114,105,110,103,32,114,101,112,114,101,115, + 101,110,116,97,116,105,111,110,10,32,32,32,32,111,102,32, + 116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,32, + 116,97,107,101,110,32,97,110,100,32,118,101,114,105,102,105, + 101,100,32,116,111,32,98,101,32,97,108,112,104,97,110,117, + 109,101,114,105,99,32,40,101,108,115,101,32,86,97,108,117, + 101,69,114,114,111,114,10,32,32,32,32,105,115,32,114,97, + 105,115,101,100,41,46,10,10,32,32,32,32,84,104,101,32, + 100,101,98,117,103,95,111,118,101,114,114,105,100,101,32,112, + 97,114,97,109,101,116,101,114,32,105,115,32,100,101,112,114, + 101,99,97,116,101,100,46,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,10,32,32,32,32,97,32,84,114,117, + 101,32,118,97,108,117,101,32,105,115,32,116,104,101,32,115, + 97,109,101,32,97,115,32,115,101,116,116,105,110,103,32,39, + 111,112,116,105,109,105,122,97,116,105,111,110,39,32,116,111, + 32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110, + 103,10,32,32,32,32,119,104,105,108,101,32,97,32,70,97, + 108,115,101,32,118,97,108,117,101,32,105,115,32,101,113,117, + 105,118,97,108,101,110,116,32,116,111,32,115,101,116,116,105, + 110,103,32,39,111,112,116,105,109,105,122,97,116,105,111,110, + 39,32,116,111,32,39,49,39,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,122,70,116,104,101,32,100,101,98,117,103,95,111,118,101, + 114,114,105,100,101,32,112,97,114,97,109,101,116,101,114,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,117, + 115,101,32,39,111,112,116,105,109,105,122,97,116,105,111,110, + 39,32,105,110,115,116,101,97,100,122,50,100,101,98,117,103, + 95,111,118,101,114,114,105,100,101,32,111,114,32,111,112,116, + 105,109,105,122,97,116,105,111,110,32,109,117,115,116,32,98, + 101,32,115,101,116,32,116,111,32,78,111,110,101,114,40,0, + 0,0,114,39,0,0,0,218,1,46,250,36,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, + 233,0,0,0,0,122,24,123,33,114,125,32,105,115,32,110, + 111,116,32,97,108,112,104,97,110,117,109,101,114,105,99,122, + 7,123,125,46,123,125,123,125,250,1,58,114,28,0,0,0, + 41,28,218,9,95,119,97,114,110,105,110,103,115,218,4,119, + 97,114,110,218,18,68,101,112,114,101,99,97,116,105,111,110, + 87,97,114,110,105,110,103,218,9,84,121,112,101,69,114,114, + 111,114,114,4,0,0,0,218,6,102,115,112,97,116,104,114, + 47,0,0,0,114,41,0,0,0,114,1,0,0,0,218,14, + 105,109,112,108,101,109,101,110,116,97,116,105,111,110,218,9, + 99,97,99,104,101,95,116,97,103,218,19,78,111,116,73,109, + 112,108,101,109,101,110,116,101,100,69,114,114,111,114,114,36, + 0,0,0,114,2,0,0,0,218,8,111,112,116,105,109,105, + 122,101,218,3,115,116,114,218,7,105,115,97,108,110,117,109, + 218,10,86,97,108,117,101,69,114,114,111,114,114,62,0,0, + 0,218,4,95,79,80,84,218,17,66,89,84,69,67,79,68, + 69,95,83,85,70,70,73,88,69,83,218,14,112,121,99,97, + 99,104,101,95,112,114,101,102,105,120,114,59,0,0,0,114, + 38,0,0,0,114,55,0,0,0,114,31,0,0,0,218,6, + 108,115,116,114,105,112,218,8,95,80,89,67,65,67,72,69, + 41,12,114,44,0,0,0,90,14,100,101,98,117,103,95,111, + 118,101,114,114,105,100,101,114,70,0,0,0,218,7,109,101, + 115,115,97,103,101,218,4,104,101,97,100,114,46,0,0,0, + 90,4,98,97,115,101,218,3,115,101,112,218,4,114,101,115, + 116,90,3,116,97,103,90,15,97,108,109,111,115,116,95,102, + 105,108,101,110,97,109,101,218,8,102,105,108,101,110,97,109, + 101,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,17,99,97,99,104,101,95,102,114,111,109,95,115,111,117, + 114,99,101,47,1,0,0,115,74,0,0,0,8,18,6,1, + 2,1,4,255,8,2,4,1,8,1,12,1,10,1,12,1, + 16,1,8,1,8,1,8,1,24,1,8,1,12,1,6,1, + 8,2,8,1,8,1,8,1,14,1,14,1,12,1,12,1, + 10,9,14,1,28,5,12,1,2,4,4,1,8,1,2,1, + 4,253,12,5,255,128,114,97,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,10,0,0,0,5,0,0,0, + 67,0,0,0,115,44,1,0,0,116,0,106,1,106,2,100, + 1,117,0,114,20,116,3,100,2,131,1,130,1,116,4,160, + 5,124,0,161,1,125,0,116,6,124,0,131,1,92,2,125, + 1,125,2,100,3,125,3,116,0,106,7,100,1,117,1,114, + 102,116,0,106,7,160,8,116,9,161,1,125,4,124,1,160, + 10,124,4,116,11,23,0,161,1,114,102,124,1,116,12,124, + 4,131,1,100,1,133,2,25,0,125,1,100,4,125,3,124, + 3,115,144,116,6,124,1,131,1,92,2,125,1,125,5,124, + 5,116,13,107,3,114,144,116,14,116,13,155,0,100,5,124, + 0,155,2,157,3,131,1,130,1,124,2,160,15,100,6,161, + 1,125,6,124,6,100,7,118,1,114,176,116,14,100,8,124, + 2,155,2,157,2,131,1,130,1,124,6,100,9,107,2,144, + 1,114,12,124,2,160,16,100,6,100,10,161,2,100,11,25, + 0,125,7,124,7,160,10,116,17,161,1,115,226,116,14,100, + 12,116,17,155,2,157,2,131,1,130,1,124,7,116,12,116, + 17,131,1,100,1,133,2,25,0,125,8,124,8,160,18,161, + 0,144,1,115,12,116,14,100,13,124,7,155,2,100,14,157, + 3,131,1,130,1,124,2,160,19,100,6,161,1,100,15,25, + 0,125,9,116,20,124,1,124,9,116,21,100,15,25,0,23, + 0,131,2,83,0,41,16,97,110,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,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,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,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,47,52,56, + 56,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,114,72,0,0,0, + 70,84,122,31,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,114,71,0,0,0,62,2,0,0,0,114,28,0, + 0,0,114,57,0,0,0,122,29,101,120,112,101,99,116,101, + 100,32,111,110,108,121,32,50,32,111,114,32,51,32,100,111, + 116,115,32,105,110,32,114,57,0,0,0,114,28,0,0,0, + 233,254,255,255,255,122,53,111,112,116,105,109,105,122,97,116, + 105,111,110,32,112,111,114,116,105,111,110,32,111,102,32,102, + 105,108,101,110,97,109,101,32,100,111,101,115,32,110,111,116, + 32,115,116,97,114,116,32,119,105,116,104,32,122,19,111,112, + 116,105,109,105,122,97,116,105,111,110,32,108,101,118,101,108, + 32,122,29,32,105,115,32,110,111,116,32,97,110,32,97,108, + 112,104,97,110,117,109,101,114,105,99,32,118,97,108,117,101, + 114,73,0,0,0,41,22,114,1,0,0,0,114,80,0,0, + 0,114,81,0,0,0,114,82,0,0,0,114,4,0,0,0, + 114,79,0,0,0,114,47,0,0,0,114,89,0,0,0,114, + 30,0,0,0,114,31,0,0,0,114,11,0,0,0,114,35, + 0,0,0,114,23,0,0,0,114,91,0,0,0,114,86,0, + 0,0,218,5,99,111,117,110,116,114,43,0,0,0,114,87, + 0,0,0,114,85,0,0,0,218,9,112,97,114,116,105,116, + 105,111,110,114,38,0,0,0,218,15,83,79,85,82,67,69, + 95,83,85,70,70,73,88,69,83,41,10,114,44,0,0,0, + 114,93,0,0,0,90,16,112,121,99,97,99,104,101,95,102, + 105,108,101,110,97,109,101,90,23,102,111,117,110,100,95,105, + 110,95,112,121,99,97,99,104,101,95,112,114,101,102,105,120, + 90,13,115,116,114,105,112,112,101,100,95,112,97,116,104,90, + 7,112,121,99,97,99,104,101,90,9,100,111,116,95,99,111, + 117,110,116,114,70,0,0,0,90,9,111,112,116,95,108,101, + 118,101,108,90,13,98,97,115,101,95,102,105,108,101,110,97, + 109,101,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,17,115,111,117,114,99,101,95,102,114,111,109,95,99, + 97,99,104,101,118,1,0,0,115,62,0,0,0,12,9,8, + 1,10,1,12,1,4,1,10,1,12,1,14,1,16,1,4, + 1,4,1,12,1,8,1,8,1,2,1,8,255,10,2,8, + 1,14,1,10,1,16,1,10,1,4,1,2,1,8,255,16, + 2,10,1,16,1,14,2,18,1,255,128,114,102,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,9,0,0,0,67,0,0,0,115,124,0,0,0,116,0, + 124,0,131,1,100,1,107,2,114,16,100,2,83,0,124,0, + 160,1,100,3,161,1,92,3,125,1,125,2,125,3,124,1, + 114,56,124,3,160,2,161,0,100,4,100,5,133,2,25,0, + 100,6,107,3,114,60,124,0,83,0,122,12,116,3,124,0, + 131,1,125,4,87,0,110,34,4,0,116,4,116,5,102,2, + 121,106,1,0,1,0,1,0,124,0,100,2,100,5,133,2, + 25,0,125,4,89,0,110,2,48,0,116,6,124,4,131,1, + 114,120,124,4,83,0,124,0,83,0,41,7,122,188,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,114,73,0,0,0,78, + 114,71,0,0,0,233,253,255,255,255,233,255,255,255,255,90, + 2,112,121,41,7,114,23,0,0,0,114,41,0,0,0,218, + 5,108,111,119,101,114,114,102,0,0,0,114,82,0,0,0, + 114,86,0,0,0,114,54,0,0,0,41,5,218,13,98,121, + 116,101,99,111,100,101,95,112,97,116,104,114,95,0,0,0, + 114,45,0,0,0,90,9,101,120,116,101,110,115,105,111,110, + 218,11,115,111,117,114,99,101,95,112,97,116,104,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,15,95,103, + 101,116,95,115,111,117,114,99,101,102,105,108,101,158,1,0, + 0,115,22,0,0,0,12,7,4,1,16,1,24,1,4,1, + 2,1,12,1,16,1,18,1,16,1,255,128,114,108,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,8,0,0,0,67,0,0,0,115,68,0,0,0,124, + 0,160,0,116,1,116,2,131,1,161,1,114,46,122,10,116, + 3,124,0,131,1,87,0,83,0,4,0,116,4,121,44,1, + 0,1,0,1,0,89,0,100,0,83,0,48,0,124,0,160, + 0,116,1,116,5,131,1,161,1,114,64,124,0,83,0,100, + 0,83,0,169,1,78,41,6,218,8,101,110,100,115,119,105, + 116,104,218,5,116,117,112,108,101,114,101,0,0,0,114,97, + 0,0,0,114,82,0,0,0,114,88,0,0,0,41,1,114, + 96,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, + 177,1,0,0,115,22,0,0,0,14,1,2,1,10,1,12, + 1,2,1,4,128,2,0,14,1,4,1,4,2,255,128,114, + 112,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,8,0,0,0,67,0,0,0,115,50,0, + 0,0,122,14,116,0,124,0,131,1,106,1,125,1,87,0, + 110,22,4,0,116,2,121,36,1,0,1,0,1,0,100,1, + 125,1,89,0,110,2,48,0,124,1,100,2,79,0,125,1, + 124,1,83,0,41,4,122,51,67,97,108,99,117,108,97,116, + 101,32,116,104,101,32,109,111,100,101,32,112,101,114,109,105, + 115,115,105,111,110,115,32,102,111,114,32,97,32,98,121,116, + 101,99,111,100,101,32,102,105,108,101,46,114,60,0,0,0, + 233,128,0,0,0,78,41,3,114,49,0,0,0,114,51,0, + 0,0,114,50,0,0,0,41,2,114,44,0,0,0,114,52, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,10,95,99,97,108,99,95,109,111,100,101,189,1, + 0,0,115,14,0,0,0,2,2,14,1,12,1,10,1,8, + 3,4,1,255,128,114,114,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,3, + 0,0,0,115,66,0,0,0,100,6,135,0,102,1,100,2, + 100,3,132,9,125,1,122,10,116,0,106,1,125,2,87,0, + 110,26,4,0,116,2,121,50,1,0,1,0,1,0,100,4, + 100,5,132,0,125,2,89,0,110,2,48,0,124,2,124,1, + 136,0,131,2,1,0,124,1,83,0,41,7,122,252,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,0,0,0,0,4,0,0,0,4,0,0,0, + 31,0,0,0,115,72,0,0,0,124,1,100,0,117,0,114, + 16,124,0,106,0,125,1,110,32,124,0,106,0,124,1,107, + 3,114,48,116,1,100,1,124,0,106,0,124,1,102,2,22, + 0,124,1,100,2,141,2,130,1,136,0,124,0,124,1,103, + 2,124,2,162,1,82,0,105,0,124,3,164,1,142,1,83, + 0,41,3,78,122,30,108,111,97,100,101,114,32,102,111,114, + 32,37,115,32,99,97,110,110,111,116,32,104,97,110,100,108, + 101,32,37,115,169,1,218,4,110,97,109,101,41,2,114,116, + 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, + 41,4,218,4,115,101,108,102,114,116,0,0,0,218,4,97, + 114,103,115,218,6,107,119,97,114,103,115,169,1,218,6,109, + 101,116,104,111,100,114,5,0,0,0,114,8,0,0,0,218, + 19,95,99,104,101,99,107,95,110,97,109,101,95,119,114,97, + 112,112,101,114,209,1,0,0,115,20,0,0,0,8,1,8, + 1,10,1,4,1,8,1,2,255,2,1,6,255,24,2,255, + 128,122,40,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,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0, + 83,0,0,0,115,56,0,0,0,100,1,68,0,93,32,125, + 2,116,0,124,1,124,2,131,2,114,4,116,1,124,0,124, + 2,116,2,124,1,124,2,131,2,131,3,1,0,113,4,124, + 0,106,3,160,4,124,1,106,3,161,1,1,0,100,0,83, + 0,41,2,78,41,4,218,10,95,95,109,111,100,117,108,101, + 95,95,218,8,95,95,110,97,109,101,95,95,218,12,95,95, + 113,117,97,108,110,97,109,101,95,95,218,7,95,95,100,111, + 99,95,95,41,5,218,7,104,97,115,97,116,116,114,218,7, + 115,101,116,97,116,116,114,218,7,103,101,116,97,116,116,114, + 218,8,95,95,100,105,99,116,95,95,218,6,117,112,100,97, + 116,101,41,3,90,3,110,101,119,90,3,111,108,100,114,67, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,5,95,119,114,97,112,220,1,0,0,115,12,0, + 0,0,8,1,10,1,20,1,14,1,4,128,255,128,122,26, + 95,99,104,101,99,107,95,110,97,109,101,46,60,108,111,99, + 97,108,115,62,46,95,119,114,97,112,41,1,78,41,3,218, + 10,95,98,111,111,116,115,116,114,97,112,114,133,0,0,0, + 218,9,78,97,109,101,69,114,114,111,114,41,3,114,122,0, + 0,0,114,123,0,0,0,114,133,0,0,0,114,5,0,0, + 0,114,121,0,0,0,114,8,0,0,0,218,11,95,99,104, + 101,99,107,95,110,97,109,101,201,1,0,0,115,16,0,0, + 0,14,8,2,7,10,1,12,1,14,2,10,5,4,1,255, + 128,114,136,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,6,0,0,0,67,0,0,0,115, + 60,0,0,0,124,0,160,0,124,1,161,1,92,2,125,2, + 125,3,124,2,100,1,117,0,114,56,116,1,124,3,131,1, + 114,56,100,2,125,4,116,2,160,3,124,4,160,4,124,3, + 100,3,25,0,161,1,116,5,161,2,1,0,124,2,83,0, + 41,4,122,155,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,10,10,32,32,32,32, + 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,32,105,110,32,102,97,118, + 111,114,32,111,102,32,102,105,110,100,101,114,46,102,105,110, + 100,95,115,112,101,99,40,41,46,10,10,32,32,32,32,78, + 122,44,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,114,73, + 0,0,0,41,6,218,11,102,105,110,100,95,108,111,97,100, + 101,114,114,23,0,0,0,114,75,0,0,0,114,76,0,0, + 0,114,62,0,0,0,218,13,73,109,112,111,114,116,87,97, + 114,110,105,110,103,41,5,114,118,0,0,0,218,8,102,117, + 108,108,110,97,109,101,218,6,108,111,97,100,101,114,218,8, + 112,111,114,116,105,111,110,115,218,3,109,115,103,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,17,95,102, + 105,110,100,95,109,111,100,117,108,101,95,115,104,105,109,229, + 1,0,0,115,12,0,0,0,14,10,16,1,4,1,22,1, + 4,1,255,128,114,143,0,0,0,99,3,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,0, + 0,0,115,166,0,0,0,124,0,100,1,100,2,133,2,25, + 0,125,3,124,3,116,0,107,3,114,64,100,3,124,1,155, + 2,100,4,124,3,155,2,157,4,125,4,116,1,160,2,100, + 5,124,4,161,2,1,0,116,3,124,4,102,1,105,0,124, + 2,164,1,142,1,130,1,116,4,124,0,131,1,100,6,107, + 0,114,106,100,7,124,1,155,2,157,2,125,4,116,1,160, + 2,100,5,124,4,161,2,1,0,116,5,124,4,131,1,130, + 1,116,6,124,0,100,2,100,8,133,2,25,0,131,1,125, + 5,124,5,100,9,64,0,114,162,100,10,124,5,155,2,100, + 11,124,1,155,2,157,4,125,4,116,3,124,4,102,1,105, + 0,124,2,164,1,142,1,130,1,124,5,83,0,41,12,97, + 84,2,0,0,80,101,114,102,111,114,109,32,98,97,115,105, + 99,32,118,97,108,105,100,105,116,121,32,99,104,101,99,107, + 105,110,103,32,111,102,32,97,32,112,121,99,32,104,101,97, + 100,101,114,32,97,110,100,32,114,101,116,117,114,110,32,116, + 104,101,32,102,108,97,103,115,32,102,105,101,108,100,44,10, + 32,32,32,32,119,104,105,99,104,32,100,101,116,101,114,109, + 105,110,101,115,32,104,111,119,32,116,104,101,32,112,121,99, + 32,115,104,111,117,108,100,32,98,101,32,102,117,114,116,104, + 101,114,32,118,97,108,105,100,97,116,101,100,32,97,103,97, + 105,110,115,116,32,116,104,101,32,115,111,117,114,99,101,46, + 10,10,32,32,32,32,42,100,97,116,97,42,32,105,115,32, + 116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32, + 116,104,101,32,112,121,99,32,102,105,108,101,46,32,40,79, + 110,108,121,32,116,104,101,32,102,105,114,115,116,32,49,54, + 32,98,121,116,101,115,32,97,114,101,10,32,32,32,32,114, + 101,113,117,105,114,101,100,44,32,116,104,111,117,103,104,46, + 41,10,10,32,32,32,32,42,110,97,109,101,42,32,105,115, + 32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101, + 32,109,111,100,117,108,101,32,98,101,105,110,103,32,105,109, + 112,111,114,116,101,100,46,32,73,116,32,105,115,32,117,115, + 101,100,32,102,111,114,32,108,111,103,103,105,110,103,46,10, + 10,32,32,32,32,42,101,120,99,95,100,101,116,97,105,108, + 115,42,32,105,115,32,97,32,100,105,99,116,105,111,110,97, + 114,121,32,112,97,115,115,101,100,32,116,111,32,73,109,112, + 111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,114, + 97,105,115,101,100,32,102,111,114,10,32,32,32,32,105,109, + 112,114,111,118,101,100,32,100,101,98,117,103,103,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,119,104,101,110,32,116,104,101,32,102,108,97,103, + 115,10,32,32,32,32,102,105,101,108,100,32,105,115,32,105, + 110,118,97,108,105,100,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,32,116,114,117,110,99,97,116,101, + 100,46,10,10,32,32,32,32,78,114,16,0,0,0,122,20, + 98,97,100,32,109,97,103,105,99,32,110,117,109,98,101,114, + 32,105,110,32,122,2,58,32,250,2,123,125,233,16,0,0, + 0,122,40,114,101,97,99,104,101,100,32,69,79,70,32,119, + 104,105,108,101,32,114,101,97,100,105,110,103,32,112,121,99, + 32,104,101,97,100,101,114,32,111,102,32,233,8,0,0,0, + 233,252,255,255,255,122,14,105,110,118,97,108,105,100,32,102, + 108,97,103,115,32,122,4,32,105,110,32,41,7,218,12,77, + 65,71,73,67,95,78,85,77,66,69,82,114,134,0,0,0, + 218,16,95,118,101,114,98,111,115,101,95,109,101,115,115,97, + 103,101,114,117,0,0,0,114,23,0,0,0,218,8,69,79, + 70,69,114,114,111,114,114,27,0,0,0,41,6,114,26,0, + 0,0,114,116,0,0,0,218,11,101,120,99,95,100,101,116, + 97,105,108,115,90,5,109,97,103,105,99,114,92,0,0,0, + 114,2,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,13,95,99,108,97,115,115,105,102,121,95, + 112,121,99,246,1,0,0,115,30,0,0,0,12,16,8,1, + 16,1,12,1,16,1,12,1,10,1,12,1,8,1,16,1, + 8,2,16,1,16,1,4,1,255,128,114,152,0,0,0,99, + 5,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, + 4,0,0,0,67,0,0,0,115,120,0,0,0,116,0,124, + 0,100,1,100,2,133,2,25,0,131,1,124,1,100,3,64, + 0,107,3,114,62,100,4,124,3,155,2,157,2,125,5,116, + 1,160,2,100,5,124,5,161,2,1,0,116,3,124,5,102, + 1,105,0,124,4,164,1,142,1,130,1,124,2,100,6,117, + 1,114,116,116,0,124,0,100,2,100,7,133,2,25,0,131, + 1,124,2,100,3,64,0,107,3,114,116,116,3,100,4,124, + 3,155,2,157,2,102,1,105,0,124,4,164,1,142,1,130, + 1,100,6,83,0,41,8,97,7,2,0,0,86,97,108,105, + 100,97,116,101,32,97,32,112,121,99,32,97,103,97,105,110, + 115,116,32,116,104,101,32,115,111,117,114,99,101,32,108,97, + 115,116,45,109,111,100,105,102,105,101,100,32,116,105,109,101, + 46,10,10,32,32,32,32,42,100,97,116,97,42,32,105,115, + 32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102, + 32,116,104,101,32,112,121,99,32,102,105,108,101,46,32,40, + 79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,49, + 54,32,98,121,116,101,115,32,97,114,101,10,32,32,32,32, + 114,101,113,117,105,114,101,100,46,41,10,10,32,32,32,32, + 42,115,111,117,114,99,101,95,109,116,105,109,101,42,32,105, + 115,32,116,104,101,32,108,97,115,116,32,109,111,100,105,102, + 105,101,100,32,116,105,109,101,115,116,97,109,112,32,111,102, + 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, + 46,10,10,32,32,32,32,42,115,111,117,114,99,101,95,115, + 105,122,101,42,32,105,115,32,78,111,110,101,32,111,114,32, + 116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32, + 115,111,117,114,99,101,32,102,105,108,101,32,105,110,32,98, + 121,116,101,115,46,10,10,32,32,32,32,42,110,97,109,101, + 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, + 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, + 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, + 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, + 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, + 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, + 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, + 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, + 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, + 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, + 103,105,110,103,46,10,10,32,32,32,32,65,110,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, + 115,101,100,32,105,102,32,116,104,101,32,98,121,116,101,99, + 111,100,101,32,105,115,32,115,116,97,108,101,46,10,10,32, + 32,32,32,114,146,0,0,0,233,12,0,0,0,114,15,0, + 0,0,122,22,98,121,116,101,99,111,100,101,32,105,115,32, + 115,116,97,108,101,32,102,111,114,32,114,144,0,0,0,78, + 114,145,0,0,0,41,4,114,27,0,0,0,114,134,0,0, + 0,114,149,0,0,0,114,117,0,0,0,41,6,114,26,0, + 0,0,218,12,115,111,117,114,99,101,95,109,116,105,109,101, + 218,11,115,111,117,114,99,101,95,115,105,122,101,114,116,0, + 0,0,114,151,0,0,0,114,92,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,23,95,118,97, + 108,105,100,97,116,101,95,116,105,109,101,115,116,97,109,112, + 95,112,121,99,23,2,0,0,115,20,0,0,0,24,19,10, + 1,12,1,16,1,8,1,22,1,2,255,22,2,4,128,255, + 128,114,156,0,0,0,99,4,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, + 42,0,0,0,124,0,100,1,100,2,133,2,25,0,124,1, + 107,3,114,38,116,0,100,3,124,2,155,2,157,2,102,1, + 105,0,124,3,164,1,142,1,130,1,100,4,83,0,41,5, + 97,243,1,0,0,86,97,108,105,100,97,116,101,32,97,32, + 104,97,115,104,45,98,97,115,101,100,32,112,121,99,32,98, + 121,32,99,104,101,99,107,105,110,103,32,116,104,101,32,114, + 101,97,108,32,115,111,117,114,99,101,32,104,97,115,104,32, + 97,103,97,105,110,115,116,32,116,104,101,32,111,110,101,32, + 105,110,10,32,32,32,32,116,104,101,32,112,121,99,32,104, + 101,97,100,101,114,46,10,10,32,32,32,32,42,100,97,116, + 97,42,32,105,115,32,116,104,101,32,99,111,110,116,101,110, + 116,115,32,111,102,32,116,104,101,32,112,121,99,32,102,105, + 108,101,46,32,40,79,110,108,121,32,116,104,101,32,102,105, + 114,115,116,32,49,54,32,98,121,116,101,115,32,97,114,101, + 10,32,32,32,32,114,101,113,117,105,114,101,100,46,41,10, + 10,32,32,32,32,42,115,111,117,114,99,101,95,104,97,115, + 104,42,32,105,115,32,116,104,101,32,105,109,112,111,114,116, + 108,105,98,46,117,116,105,108,46,115,111,117,114,99,101,95, + 104,97,115,104,40,41,32,111,102,32,116,104,101,32,115,111, + 117,114,99,101,32,102,105,108,101,46,10,10,32,32,32,32, + 42,110,97,109,101,42,32,105,115,32,116,104,101,32,110,97, + 109,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, + 32,98,101,105,110,103,32,105,109,112,111,114,116,101,100,46, + 32,73,116,32,105,115,32,117,115,101,100,32,102,111,114,32, + 108,111,103,103,105,110,103,46,10,10,32,32,32,32,42,101, + 120,99,95,100,101,116,97,105,108,115,42,32,105,115,32,97, + 32,100,105,99,116,105,111,110,97,114,121,32,112,97,115,115, + 101,100,32,116,111,32,73,109,112,111,114,116,69,114,114,111, + 114,32,105,102,32,105,116,32,114,97,105,115,101,100,32,102, + 111,114,10,32,32,32,32,105,109,112,114,111,118,101,100,32, + 100,101,98,117,103,103,105,110,103,46,10,10,32,32,32,32, + 65,110,32,73,109,112,111,114,116,69,114,114,111,114,32,105, + 115,32,114,97,105,115,101,100,32,105,102,32,116,104,101,32, + 98,121,116,101,99,111,100,101,32,105,115,32,115,116,97,108, + 101,46,10,10,32,32,32,32,114,146,0,0,0,114,145,0, + 0,0,122,46,104,97,115,104,32,105,110,32,98,121,116,101, + 99,111,100,101,32,100,111,101,115,110,39,116,32,109,97,116, + 99,104,32,104,97,115,104,32,111,102,32,115,111,117,114,99, + 101,32,78,41,1,114,117,0,0,0,41,4,114,26,0,0, + 0,218,11,115,111,117,114,99,101,95,104,97,115,104,114,116, + 0,0,0,114,151,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,18,95,118,97,108,105,100,97, + 116,101,95,104,97,115,104,95,112,121,99,51,2,0,0,115, + 16,0,0,0,16,17,2,1,8,1,4,255,2,2,6,254, + 4,128,255,128,114,158,0,0,0,99,4,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, + 0,0,115,76,0,0,0,116,0,160,1,124,0,161,1,125, + 4,116,2,124,4,116,3,131,2,114,56,116,4,160,5,100, + 1,124,2,161,2,1,0,124,3,100,2,117,1,114,52,116, + 6,160,7,124,4,124,3,161,2,1,0,124,4,83,0,116, + 8,100,3,160,9,124,2,161,1,124,1,124,2,100,4,141, + 3,130,1,41,5,122,35,67,111,109,112,105,108,101,32,98, + 121,116,101,99,111,100,101,32,97,115,32,102,111,117,110,100, + 32,105,110,32,97,32,112,121,99,46,122,21,99,111,100,101, + 32,111,98,106,101,99,116,32,102,114,111,109,32,123,33,114, + 125,78,122,23,78,111,110,45,99,111,100,101,32,111,98,106, + 101,99,116,32,105,110,32,123,33,114,125,169,2,114,116,0, + 0,0,114,44,0,0,0,41,10,218,7,109,97,114,115,104, + 97,108,90,5,108,111,97,100,115,218,10,105,115,105,110,115, + 116,97,110,99,101,218,10,95,99,111,100,101,95,116,121,112, + 101,114,134,0,0,0,114,149,0,0,0,218,4,95,105,109, + 112,90,16,95,102,105,120,95,99,111,95,102,105,108,101,110, + 97,109,101,114,117,0,0,0,114,62,0,0,0,41,5,114, + 26,0,0,0,114,116,0,0,0,114,106,0,0,0,114,107, + 0,0,0,218,4,99,111,100,101,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,17,95,99,111,109,112,105, + 108,101,95,98,121,116,101,99,111,100,101,75,2,0,0,115, + 20,0,0,0,10,2,10,1,12,1,8,1,12,1,4,1, + 10,2,4,1,6,255,255,128,114,165,0,0,0,114,73,0, + 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,5,0,0,0,67,0,0,0,115,70,0,0,0, + 116,0,116,1,131,1,125,3,124,3,160,2,116,3,100,1, + 131,1,161,1,1,0,124,3,160,2,116,3,124,1,131,1, + 161,1,1,0,124,3,160,2,116,3,124,2,131,1,161,1, + 1,0,124,3,160,2,116,4,160,5,124,0,161,1,161,1, + 1,0,124,3,83,0,41,3,122,43,80,114,111,100,117,99, + 101,32,116,104,101,32,100,97,116,97,32,102,111,114,32,97, + 32,116,105,109,101,115,116,97,109,112,45,98,97,115,101,100, + 32,112,121,99,46,114,73,0,0,0,78,41,6,218,9,98, + 121,116,101,97,114,114,97,121,114,148,0,0,0,218,6,101, + 120,116,101,110,100,114,21,0,0,0,114,160,0,0,0,218, + 5,100,117,109,112,115,41,4,114,164,0,0,0,218,5,109, + 116,105,109,101,114,155,0,0,0,114,26,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,22,95, + 99,111,100,101,95,116,111,95,116,105,109,101,115,116,97,109, + 112,95,112,121,99,88,2,0,0,115,14,0,0,0,8,2, + 14,1,14,1,14,1,16,1,4,1,255,128,114,170,0,0, + 0,84,99,3,0,0,0,0,0,0,0,0,0,0,0,5, + 0,0,0,5,0,0,0,67,0,0,0,115,80,0,0,0, + 116,0,116,1,131,1,125,3,100,1,124,2,100,1,62,0, + 66,0,125,4,124,3,160,2,116,3,124,4,131,1,161,1, + 1,0,116,4,124,1,131,1,100,2,107,2,115,50,74,0, + 130,1,124,3,160,2,124,1,161,1,1,0,124,3,160,2, + 116,5,160,6,124,0,161,1,161,1,1,0,124,3,83,0, + 41,4,122,38,80,114,111,100,117,99,101,32,116,104,101,32, + 100,97,116,97,32,102,111,114,32,97,32,104,97,115,104,45, + 98,97,115,101,100,32,112,121,99,46,114,39,0,0,0,114, + 146,0,0,0,78,41,7,114,166,0,0,0,114,148,0,0, + 0,114,167,0,0,0,114,21,0,0,0,114,23,0,0,0, + 114,160,0,0,0,114,168,0,0,0,41,5,114,164,0,0, + 0,114,157,0,0,0,90,7,99,104,101,99,107,101,100,114, + 26,0,0,0,114,2,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,17,95,99,111,100,101,95, + 116,111,95,104,97,115,104,95,112,121,99,98,2,0,0,115, + 16,0,0,0,8,2,12,1,14,1,16,1,10,1,16,1, + 4,1,255,128,114,171,0,0,0,99,1,0,0,0,0,0, 0,0,0,0,0,0,5,0,0,0,6,0,0,0,67,0, - 0,0,115,60,0,0,0,124,0,160,0,124,1,161,1,92, - 2,125,2,125,3,124,2,100,1,117,0,114,56,116,1,124, - 3,131,1,114,56,100,2,125,4,116,2,160,3,124,4,160, - 4,124,3,100,3,25,0,161,1,116,5,161,2,1,0,124, - 2,83,0,41,4,122,155,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,10,10,32, - 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, - 115,32,100,101,112,114,101,99,97,116,101,100,32,105,110,32, - 102,97,118,111,114,32,111,102,32,102,105,110,100,101,114,46, - 102,105,110,100,95,115,112,101,99,40,41,46,10,10,32,32, - 32,32,78,122,44,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,114,73,0,0,0,41,6,218,11,102,105,110,100,95,108, - 111,97,100,101,114,114,23,0,0,0,114,75,0,0,0,114, - 76,0,0,0,114,62,0,0,0,218,13,73,109,112,111,114, - 116,87,97,114,110,105,110,103,41,5,114,118,0,0,0,218, - 8,102,117,108,108,110,97,109,101,218,6,108,111,97,100,101, - 114,218,8,112,111,114,116,105,111,110,115,218,3,109,115,103, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 17,95,102,105,110,100,95,109,111,100,117,108,101,95,115,104, - 105,109,229,1,0,0,115,12,0,0,0,14,10,16,1,4, - 1,22,1,4,1,255,128,114,143,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, - 0,67,0,0,0,115,166,0,0,0,124,0,100,1,100,2, - 133,2,25,0,125,3,124,3,116,0,107,3,114,64,100,3, - 124,1,155,2,100,4,124,3,155,2,157,4,125,4,116,1, - 160,2,100,5,124,4,161,2,1,0,116,3,124,4,102,1, - 105,0,124,2,164,1,142,1,130,1,116,4,124,0,131,1, - 100,6,107,0,114,106,100,7,124,1,155,2,157,2,125,4, - 116,1,160,2,100,5,124,4,161,2,1,0,116,5,124,4, - 131,1,130,1,116,6,124,0,100,2,100,8,133,2,25,0, - 131,1,125,5,124,5,100,9,64,0,114,162,100,10,124,5, - 155,2,100,11,124,1,155,2,157,4,125,4,116,3,124,4, - 102,1,105,0,124,2,164,1,142,1,130,1,124,5,83,0, - 41,12,97,84,2,0,0,80,101,114,102,111,114,109,32,98, - 97,115,105,99,32,118,97,108,105,100,105,116,121,32,99,104, - 101,99,107,105,110,103,32,111,102,32,97,32,112,121,99,32, - 104,101,97,100,101,114,32,97,110,100,32,114,101,116,117,114, - 110,32,116,104,101,32,102,108,97,103,115,32,102,105,101,108, - 100,44,10,32,32,32,32,119,104,105,99,104,32,100,101,116, - 101,114,109,105,110,101,115,32,104,111,119,32,116,104,101,32, - 112,121,99,32,115,104,111,117,108,100,32,98,101,32,102,117, - 114,116,104,101,114,32,118,97,108,105,100,97,116,101,100,32, - 97,103,97,105,110,115,116,32,116,104,101,32,115,111,117,114, - 99,101,46,10,10,32,32,32,32,42,100,97,116,97,42,32, - 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32, - 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46, - 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116, - 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32, - 32,32,114,101,113,117,105,114,101,100,44,32,116,104,111,117, - 103,104,46,41,10,10,32,32,32,32,42,110,97,109,101,42, - 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, - 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103, - 32,105,109,112,111,114,116,101,100,46,32,73,116,32,105,115, - 32,117,115,101,100,32,102,111,114,32,108,111,103,103,105,110, - 103,46,10,10,32,32,32,32,42,101,120,99,95,100,101,116, - 97,105,108,115,42,32,105,115,32,97,32,100,105,99,116,105, - 111,110,97,114,121,32,112,97,115,115,101,100,32,116,111,32, - 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105, - 116,32,114,97,105,115,101,100,32,102,111,114,10,32,32,32, - 32,105,109,112,114,111,118,101,100,32,100,101,98,117,103,103, - 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,119,104,101,110,32,116,104,101,32,102, - 108,97,103,115,10,32,32,32,32,102,105,101,108,100,32,105, - 115,32,105,110,118,97,108,105,100,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,32,116,114,117,110,99, - 97,116,101,100,46,10,10,32,32,32,32,78,114,16,0,0, - 0,122,20,98,97,100,32,109,97,103,105,99,32,110,117,109, - 98,101,114,32,105,110,32,122,2,58,32,250,2,123,125,233, - 16,0,0,0,122,40,114,101,97,99,104,101,100,32,69,79, - 70,32,119,104,105,108,101,32,114,101,97,100,105,110,103,32, - 112,121,99,32,104,101,97,100,101,114,32,111,102,32,233,8, - 0,0,0,233,252,255,255,255,122,14,105,110,118,97,108,105, - 100,32,102,108,97,103,115,32,122,4,32,105,110,32,41,7, - 218,12,77,65,71,73,67,95,78,85,77,66,69,82,114,134, - 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, - 115,115,97,103,101,114,117,0,0,0,114,23,0,0,0,218, - 8,69,79,70,69,114,114,111,114,114,27,0,0,0,41,6, - 114,26,0,0,0,114,116,0,0,0,218,11,101,120,99,95, - 100,101,116,97,105,108,115,90,5,109,97,103,105,99,114,92, - 0,0,0,114,2,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,13,95,99,108,97,115,115,105, - 102,121,95,112,121,99,246,1,0,0,115,30,0,0,0,12, - 16,8,1,16,1,12,1,16,1,12,1,10,1,12,1,8, - 1,16,1,8,2,16,1,16,1,4,1,255,128,114,152,0, - 0,0,99,5,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,4,0,0,0,67,0,0,0,115,120,0,0,0, - 116,0,124,0,100,1,100,2,133,2,25,0,131,1,124,1, - 100,3,64,0,107,3,114,62,100,4,124,3,155,2,157,2, - 125,5,116,1,160,2,100,5,124,5,161,2,1,0,116,3, - 124,5,102,1,105,0,124,4,164,1,142,1,130,1,124,2, - 100,6,117,1,114,116,116,0,124,0,100,2,100,7,133,2, - 25,0,131,1,124,2,100,3,64,0,107,3,114,116,116,3, - 100,4,124,3,155,2,157,2,102,1,105,0,124,4,164,1, - 142,1,130,1,100,6,83,0,41,8,97,7,2,0,0,86, - 97,108,105,100,97,116,101,32,97,32,112,121,99,32,97,103, - 97,105,110,115,116,32,116,104,101,32,115,111,117,114,99,101, - 32,108,97,115,116,45,109,111,100,105,102,105,101,100,32,116, - 105,109,101,46,10,10,32,32,32,32,42,100,97,116,97,42, - 32,105,115,32,116,104,101,32,99,111,110,116,101,110,116,115, - 32,111,102,32,116,104,101,32,112,121,99,32,102,105,108,101, - 46,32,40,79,110,108,121,32,116,104,101,32,102,105,114,115, - 116,32,49,54,32,98,121,116,101,115,32,97,114,101,10,32, - 32,32,32,114,101,113,117,105,114,101,100,46,41,10,10,32, - 32,32,32,42,115,111,117,114,99,101,95,109,116,105,109,101, - 42,32,105,115,32,116,104,101,32,108,97,115,116,32,109,111, - 100,105,102,105,101,100,32,116,105,109,101,115,116,97,109,112, - 32,111,102,32,116,104,101,32,115,111,117,114,99,101,32,102, - 105,108,101,46,10,10,32,32,32,32,42,115,111,117,114,99, - 101,95,115,105,122,101,42,32,105,115,32,78,111,110,101,32, - 111,114,32,116,104,101,32,115,105,122,101,32,111,102,32,116, - 104,101,32,115,111,117,114,99,101,32,102,105,108,101,32,105, - 110,32,98,121,116,101,115,46,10,10,32,32,32,32,42,110, - 97,109,101,42,32,105,115,32,116,104,101,32,110,97,109,101, - 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,98, - 101,105,110,103,32,105,109,112,111,114,116,101,100,46,32,73, - 116,32,105,115,32,117,115,101,100,32,102,111,114,32,108,111, - 103,103,105,110,103,46,10,10,32,32,32,32,42,101,120,99, - 95,100,101,116,97,105,108,115,42,32,105,115,32,97,32,100, - 105,99,116,105,111,110,97,114,121,32,112,97,115,115,101,100, - 32,116,111,32,73,109,112,111,114,116,69,114,114,111,114,32, - 105,102,32,105,116,32,114,97,105,115,101,100,32,102,111,114, - 10,32,32,32,32,105,109,112,114,111,118,101,100,32,100,101, - 98,117,103,103,105,110,103,46,10,10,32,32,32,32,65,110, - 32,73,109,112,111,114,116,69,114,114,111,114,32,105,115,32, - 114,97,105,115,101,100,32,105,102,32,116,104,101,32,98,121, - 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,46, - 10,10,32,32,32,32,114,146,0,0,0,233,12,0,0,0, - 114,15,0,0,0,122,22,98,121,116,101,99,111,100,101,32, - 105,115,32,115,116,97,108,101,32,102,111,114,32,114,144,0, - 0,0,78,114,145,0,0,0,41,4,114,27,0,0,0,114, - 134,0,0,0,114,149,0,0,0,114,117,0,0,0,41,6, - 114,26,0,0,0,218,12,115,111,117,114,99,101,95,109,116, - 105,109,101,218,11,115,111,117,114,99,101,95,115,105,122,101, - 114,116,0,0,0,114,151,0,0,0,114,92,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,23, - 95,118,97,108,105,100,97,116,101,95,116,105,109,101,115,116, - 97,109,112,95,112,121,99,23,2,0,0,115,20,0,0,0, - 24,19,10,1,12,1,16,1,8,1,22,1,2,255,22,2, - 4,128,255,128,114,156,0,0,0,99,4,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, - 0,0,115,42,0,0,0,124,0,100,1,100,2,133,2,25, - 0,124,1,107,3,114,38,116,0,100,3,124,2,155,2,157, - 2,102,1,105,0,124,3,164,1,142,1,130,1,100,4,83, - 0,41,5,97,243,1,0,0,86,97,108,105,100,97,116,101, - 32,97,32,104,97,115,104,45,98,97,115,101,100,32,112,121, - 99,32,98,121,32,99,104,101,99,107,105,110,103,32,116,104, - 101,32,114,101,97,108,32,115,111,117,114,99,101,32,104,97, - 115,104,32,97,103,97,105,110,115,116,32,116,104,101,32,111, - 110,101,32,105,110,10,32,32,32,32,116,104,101,32,112,121, - 99,32,104,101,97,100,101,114,46,10,10,32,32,32,32,42, - 100,97,116,97,42,32,105,115,32,116,104,101,32,99,111,110, - 116,101,110,116,115,32,111,102,32,116,104,101,32,112,121,99, - 32,102,105,108,101,46,32,40,79,110,108,121,32,116,104,101, - 32,102,105,114,115,116,32,49,54,32,98,121,116,101,115,32, - 97,114,101,10,32,32,32,32,114,101,113,117,105,114,101,100, - 46,41,10,10,32,32,32,32,42,115,111,117,114,99,101,95, - 104,97,115,104,42,32,105,115,32,116,104,101,32,105,109,112, - 111,114,116,108,105,98,46,117,116,105,108,46,115,111,117,114, - 99,101,95,104,97,115,104,40,41,32,111,102,32,116,104,101, - 32,115,111,117,114,99,101,32,102,105,108,101,46,10,10,32, - 32,32,32,42,110,97,109,101,42,32,105,115,32,116,104,101, - 32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,100, - 117,108,101,32,98,101,105,110,103,32,105,109,112,111,114,116, - 101,100,46,32,73,116,32,105,115,32,117,115,101,100,32,102, - 111,114,32,108,111,103,103,105,110,103,46,10,10,32,32,32, - 32,42,101,120,99,95,100,101,116,97,105,108,115,42,32,105, - 115,32,97,32,100,105,99,116,105,111,110,97,114,121,32,112, - 97,115,115,101,100,32,116,111,32,73,109,112,111,114,116,69, - 114,114,111,114,32,105,102,32,105,116,32,114,97,105,115,101, - 100,32,102,111,114,10,32,32,32,32,105,109,112,114,111,118, - 101,100,32,100,101,98,117,103,103,105,110,103,46,10,10,32, - 32,32,32,65,110,32,73,109,112,111,114,116,69,114,114,111, - 114,32,105,115,32,114,97,105,115,101,100,32,105,102,32,116, - 104,101,32,98,121,116,101,99,111,100,101,32,105,115,32,115, - 116,97,108,101,46,10,10,32,32,32,32,114,146,0,0,0, - 114,145,0,0,0,122,46,104,97,115,104,32,105,110,32,98, - 121,116,101,99,111,100,101,32,100,111,101,115,110,39,116,32, - 109,97,116,99,104,32,104,97,115,104,32,111,102,32,115,111, - 117,114,99,101,32,78,41,1,114,117,0,0,0,41,4,114, - 26,0,0,0,218,11,115,111,117,114,99,101,95,104,97,115, - 104,114,116,0,0,0,114,151,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,218,18,95,118,97,108, - 105,100,97,116,101,95,104,97,115,104,95,112,121,99,51,2, - 0,0,115,16,0,0,0,16,17,2,1,8,1,4,255,2, - 2,6,254,4,128,255,128,114,158,0,0,0,99,4,0,0, - 0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0, - 0,67,0,0,0,115,76,0,0,0,116,0,160,1,124,0, - 161,1,125,4,116,2,124,4,116,3,131,2,114,56,116,4, - 160,5,100,1,124,2,161,2,1,0,124,3,100,2,117,1, - 114,52,116,6,160,7,124,4,124,3,161,2,1,0,124,4, - 83,0,116,8,100,3,160,9,124,2,161,1,124,1,124,2, - 100,4,141,3,130,1,41,5,122,35,67,111,109,112,105,108, - 101,32,98,121,116,101,99,111,100,101,32,97,115,32,102,111, - 117,110,100,32,105,110,32,97,32,112,121,99,46,122,21,99, - 111,100,101,32,111,98,106,101,99,116,32,102,114,111,109,32, - 123,33,114,125,78,122,23,78,111,110,45,99,111,100,101,32, - 111,98,106,101,99,116,32,105,110,32,123,33,114,125,169,2, - 114,116,0,0,0,114,44,0,0,0,41,10,218,7,109,97, - 114,115,104,97,108,90,5,108,111,97,100,115,218,10,105,115, - 105,110,115,116,97,110,99,101,218,10,95,99,111,100,101,95, - 116,121,112,101,114,134,0,0,0,114,149,0,0,0,218,4, - 95,105,109,112,90,16,95,102,105,120,95,99,111,95,102,105, - 108,101,110,97,109,101,114,117,0,0,0,114,62,0,0,0, - 41,5,114,26,0,0,0,114,116,0,0,0,114,106,0,0, - 0,114,107,0,0,0,218,4,99,111,100,101,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,17,95,99,111, - 109,112,105,108,101,95,98,121,116,101,99,111,100,101,75,2, - 0,0,115,20,0,0,0,10,2,10,1,12,1,8,1,12, - 1,4,1,10,2,4,1,6,255,255,128,114,165,0,0,0, - 114,73,0,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,5,0,0,0,67,0,0,0,115,70, - 0,0,0,116,0,116,1,131,1,125,3,124,3,160,2,116, - 3,100,1,131,1,161,1,1,0,124,3,160,2,116,3,124, - 1,131,1,161,1,1,0,124,3,160,2,116,3,124,2,131, - 1,161,1,1,0,124,3,160,2,116,4,160,5,124,0,161, - 1,161,1,1,0,124,3,83,0,41,2,122,43,80,114,111, - 100,117,99,101,32,116,104,101,32,100,97,116,97,32,102,111, - 114,32,97,32,116,105,109,101,115,116,97,109,112,45,98,97, - 115,101,100,32,112,121,99,46,114,73,0,0,0,41,6,218, - 9,98,121,116,101,97,114,114,97,121,114,148,0,0,0,218, - 6,101,120,116,101,110,100,114,21,0,0,0,114,160,0,0, - 0,218,5,100,117,109,112,115,41,4,114,164,0,0,0,218, - 5,109,116,105,109,101,114,155,0,0,0,114,26,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 22,95,99,111,100,101,95,116,111,95,116,105,109,101,115,116, - 97,109,112,95,112,121,99,88,2,0,0,115,14,0,0,0, - 8,2,14,1,14,1,14,1,16,1,4,1,255,128,114,170, - 0,0,0,84,99,3,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,5,0,0,0,67,0,0,0,115,80,0, - 0,0,116,0,116,1,131,1,125,3,100,1,124,2,100,1, - 62,0,66,0,125,4,124,3,160,2,116,3,124,4,131,1, - 161,1,1,0,116,4,124,1,131,1,100,2,107,2,115,50, - 74,0,130,1,124,3,160,2,124,1,161,1,1,0,124,3, - 160,2,116,5,160,6,124,0,161,1,161,1,1,0,124,3, - 83,0,41,3,122,38,80,114,111,100,117,99,101,32,116,104, - 101,32,100,97,116,97,32,102,111,114,32,97,32,104,97,115, - 104,45,98,97,115,101,100,32,112,121,99,46,114,39,0,0, - 0,114,146,0,0,0,41,7,114,166,0,0,0,114,148,0, - 0,0,114,167,0,0,0,114,21,0,0,0,114,23,0,0, - 0,114,160,0,0,0,114,168,0,0,0,41,5,114,164,0, - 0,0,114,157,0,0,0,90,7,99,104,101,99,107,101,100, - 114,26,0,0,0,114,2,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,17,95,99,111,100,101, - 95,116,111,95,104,97,115,104,95,112,121,99,98,2,0,0, - 115,16,0,0,0,8,2,12,1,14,1,16,1,10,1,16, - 1,4,1,255,128,114,171,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,67, - 0,0,0,115,62,0,0,0,100,1,100,2,108,0,125,1, - 116,1,160,2,124,0,161,1,106,3,125,2,124,1,160,4, - 124,2,161,1,125,3,116,1,160,5,100,2,100,3,161,2, - 125,4,124,4,160,6,124,0,160,6,124,3,100,1,25,0, - 161,1,161,1,83,0,41,4,122,121,68,101,99,111,100,101, - 32,98,121,116,101,115,32,114,101,112,114,101,115,101,110,116, - 105,110,103,32,115,111,117,114,99,101,32,99,111,100,101,32, - 97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,115, - 116,114,105,110,103,46,10,10,32,32,32,32,85,110,105,118, - 101,114,115,97,108,32,110,101,119,108,105,110,101,32,115,117, - 112,112,111,114,116,32,105,115,32,117,115,101,100,32,105,110, - 32,116,104,101,32,100,101,99,111,100,105,110,103,46,10,32, - 32,32,32,114,73,0,0,0,78,84,41,7,218,8,116,111, - 107,101,110,105,122,101,114,64,0,0,0,90,7,66,121,116, - 101,115,73,79,90,8,114,101,97,100,108,105,110,101,90,15, - 100,101,116,101,99,116,95,101,110,99,111,100,105,110,103,90, - 25,73,110,99,114,101,109,101,110,116,97,108,78,101,119,108, - 105,110,101,68,101,99,111,100,101,114,218,6,100,101,99,111, - 100,101,41,5,218,12,115,111,117,114,99,101,95,98,121,116, - 101,115,114,172,0,0,0,90,21,115,111,117,114,99,101,95, - 98,121,116,101,115,95,114,101,97,100,108,105,110,101,218,8, - 101,110,99,111,100,105,110,103,90,15,110,101,119,108,105,110, - 101,95,100,101,99,111,100,101,114,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,13,100,101,99,111,100,101, - 95,115,111,117,114,99,101,109,2,0,0,115,12,0,0,0, - 8,5,12,1,10,1,12,1,20,1,255,128,114,176,0,0, - 0,169,2,114,140,0,0,0,218,26,115,117,98,109,111,100, - 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, - 105,111,110,115,99,2,0,0,0,0,0,0,0,2,0,0, - 0,9,0,0,0,8,0,0,0,67,0,0,0,115,8,1, - 0,0,124,1,100,1,117,0,114,56,100,2,125,1,116,0, - 124,2,100,3,131,2,114,66,122,14,124,2,160,1,124,0, - 161,1,125,1,87,0,110,28,4,0,116,2,121,54,1,0, - 1,0,1,0,89,0,110,12,48,0,116,3,160,4,124,1, - 161,1,125,1,116,5,106,6,124,0,124,2,124,1,100,4, - 141,3,125,4,100,5,124,4,95,7,124,2,100,1,117,0, - 114,148,116,8,131,0,68,0,93,40,92,2,125,5,125,6, - 124,1,160,9,116,10,124,6,131,1,161,1,114,102,124,5, - 124,0,124,1,131,2,125,2,124,2,124,4,95,11,1,0, - 113,148,100,1,83,0,124,3,116,12,117,0,114,212,116,0, - 124,2,100,6,131,2,114,218,122,14,124,2,160,13,124,0, - 161,1,125,7,87,0,110,18,4,0,116,2,121,198,1,0, - 1,0,1,0,89,0,110,20,48,0,124,7,114,218,103,0, - 124,4,95,14,110,6,124,3,124,4,95,14,124,4,106,14, - 103,0,107,2,144,1,114,4,124,1,144,1,114,4,116,15, - 124,1,131,1,100,7,25,0,125,8,124,4,106,14,160,16, - 124,8,161,1,1,0,124,4,83,0,41,8,97,61,1,0, - 0,82,101,116,117,114,110,32,97,32,109,111,100,117,108,101, - 32,115,112,101,99,32,98,97,115,101,100,32,111,110,32,97, - 32,102,105,108,101,32,108,111,99,97,116,105,111,110,46,10, - 10,32,32,32,32,84,111,32,105,110,100,105,99,97,116,101, - 32,116,104,97,116,32,116,104,101,32,109,111,100,117,108,101, - 32,105,115,32,97,32,112,97,99,107,97,103,101,44,32,115, - 101,116,10,32,32,32,32,115,117,98,109,111,100,117,108,101, - 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, - 115,32,116,111,32,97,32,108,105,115,116,32,111,102,32,100, - 105,114,101,99,116,111,114,121,32,112,97,116,104,115,46,32, - 32,65,110,10,32,32,32,32,101,109,112,116,121,32,108,105, - 115,116,32,105,115,32,115,117,102,102,105,99,105,101,110,116, - 44,32,116,104,111,117,103,104,32,105,116,115,32,110,111,116, - 32,111,116,104,101,114,119,105,115,101,32,117,115,101,102,117, - 108,32,116,111,32,116,104,101,10,32,32,32,32,105,109,112, - 111,114,116,32,115,121,115,116,101,109,46,10,10,32,32,32, - 32,84,104,101,32,108,111,97,100,101,114,32,109,117,115,116, - 32,116,97,107,101,32,97,32,115,112,101,99,32,97,115,32, - 105,116,115,32,111,110,108,121,32,95,95,105,110,105,116,95, - 95,40,41,32,97,114,103,46,10,10,32,32,32,32,78,122, - 9,60,117,110,107,110,111,119,110,62,218,12,103,101,116,95, - 102,105,108,101,110,97,109,101,169,1,218,6,111,114,105,103, - 105,110,84,218,10,105,115,95,112,97,99,107,97,103,101,114, - 73,0,0,0,41,17,114,128,0,0,0,114,179,0,0,0, - 114,117,0,0,0,114,4,0,0,0,114,79,0,0,0,114, - 134,0,0,0,218,10,77,111,100,117,108,101,83,112,101,99, - 90,13,95,115,101,116,95,102,105,108,101,97,116,116,114,218, - 27,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,114,110,0,0, - 0,114,111,0,0,0,114,140,0,0,0,218,9,95,80,79, - 80,85,76,65,84,69,114,182,0,0,0,114,178,0,0,0, - 114,47,0,0,0,218,6,97,112,112,101,110,100,41,9,114, - 116,0,0,0,90,8,108,111,99,97,116,105,111,110,114,140, - 0,0,0,114,178,0,0,0,218,4,115,112,101,99,218,12, - 108,111,97,100,101,114,95,99,108,97,115,115,218,8,115,117, - 102,102,105,120,101,115,114,182,0,0,0,90,7,100,105,114, - 110,97,109,101,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,23,115,112,101,99,95,102,114,111,109,95,102, - 105,108,101,95,108,111,99,97,116,105,111,110,126,2,0,0, - 115,64,0,0,0,8,12,4,4,10,1,2,2,14,1,12, - 1,6,1,10,2,16,8,6,1,8,3,14,1,14,1,10, - 1,6,1,4,1,4,2,8,3,10,2,2,1,14,1,12, - 1,6,1,4,2,8,1,6,2,12,1,6,1,12,1,12, - 1,4,2,255,128,114,190,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, - 0,0,0,115,80,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,90,4,100,3,90,5,100,4,90,6, - 101,7,100,5,100,6,132,0,131,1,90,8,101,7,100,7, - 100,8,132,0,131,1,90,9,101,7,100,14,100,10,100,11, - 132,1,131,1,90,10,101,7,100,15,100,12,100,13,132,1, - 131,1,90,11,100,9,83,0,41,16,218,21,87,105,110,100, - 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, - 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, - 100,101,114,32,102,111,114,32,109,111,100,117,108,101,115,32, - 100,101,99,108,97,114,101,100,32,105,110,32,116,104,101,32, - 87,105,110,100,111,119,115,32,114,101,103,105,115,116,114,121, - 46,122,59,83,111,102,116,119,97,114,101,92,80,121,116,104, - 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, - 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, - 108,101,115,92,123,102,117,108,108,110,97,109,101,125,122,65, - 83,111,102,116,119,97,114,101,92,80,121,116,104,111,110,92, - 80,121,116,104,111,110,67,111,114,101,92,123,115,121,115,95, - 118,101,114,115,105,111,110,125,92,77,111,100,117,108,101,115, - 92,123,102,117,108,108,110,97,109,101,125,92,68,101,98,117, - 103,70,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,67,0,0,0,115,50,0,0,0, - 122,16,116,0,160,1,116,0,106,2,124,1,161,2,87,0, - 83,0,4,0,116,3,121,48,1,0,1,0,1,0,116,0, - 160,1,116,0,106,4,124,1,161,2,6,0,89,0,83,0, - 48,0,114,109,0,0,0,41,5,218,6,119,105,110,114,101, - 103,90,7,79,112,101,110,75,101,121,90,17,72,75,69,89, - 95,67,85,82,82,69,78,84,95,85,83,69,82,114,50,0, - 0,0,90,18,72,75,69,89,95,76,79,67,65,76,95,77, - 65,67,72,73,78,69,41,2,218,3,99,108,115,114,7,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,14,95,111,112,101,110,95,114,101,103,105,115,116,114, - 121,206,2,0,0,115,10,0,0,0,2,2,16,1,12,1, - 20,1,255,128,122,36,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,2,0,0,0,0, - 0,0,0,0,0,0,0,6,0,0,0,8,0,0,0,67, - 0,0,0,115,130,0,0,0,124,0,106,0,114,14,124,0, - 106,1,125,2,110,6,124,0,106,2,125,2,124,2,106,3, - 124,1,100,1,116,4,106,5,100,0,100,2,133,2,25,0, - 22,0,100,3,141,2,125,3,122,60,124,0,160,6,124,3, - 161,1,143,28,125,4,116,7,160,8,124,4,100,4,161,2, - 125,5,87,0,100,0,4,0,4,0,131,3,1,0,110,16, - 49,0,115,94,48,0,1,0,1,0,1,0,89,0,1,0, - 87,0,124,5,83,0,4,0,116,9,121,128,1,0,1,0, - 1,0,89,0,100,0,83,0,48,0,41,5,78,122,5,37, - 100,46,37,100,114,28,0,0,0,41,2,114,139,0,0,0, - 90,11,115,121,115,95,118,101,114,115,105,111,110,114,40,0, - 0,0,41,10,218,11,68,69,66,85,71,95,66,85,73,76, - 68,218,18,82,69,71,73,83,84,82,89,95,75,69,89,95, - 68,69,66,85,71,218,12,82,69,71,73,83,84,82,89,95, - 75,69,89,114,62,0,0,0,114,1,0,0,0,218,12,118, - 101,114,115,105,111,110,95,105,110,102,111,114,194,0,0,0, - 114,192,0,0,0,90,10,81,117,101,114,121,86,97,108,117, - 101,114,50,0,0,0,41,6,114,193,0,0,0,114,139,0, - 0,0,90,12,114,101,103,105,115,116,114,121,95,107,101,121, - 114,7,0,0,0,90,4,104,107,101,121,218,8,102,105,108, - 101,112,97,116,104,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,16,95,115,101,97,114,99,104,95,114,101, - 103,105,115,116,114,121,213,2,0,0,115,26,0,0,0,6, - 2,8,1,6,2,6,1,16,1,6,255,2,2,12,1,44, - 1,4,3,12,254,8,1,255,128,122,38,87,105,110,100,111, + 0,0,115,62,0,0,0,100,1,100,2,108,0,125,1,116, + 1,160,2,124,0,161,1,106,3,125,2,124,1,160,4,124, + 2,161,1,125,3,116,1,160,5,100,2,100,3,161,2,125, + 4,124,4,160,6,124,0,160,6,124,3,100,1,25,0,161, + 1,161,1,83,0,41,4,122,121,68,101,99,111,100,101,32, + 98,121,116,101,115,32,114,101,112,114,101,115,101,110,116,105, + 110,103,32,115,111,117,114,99,101,32,99,111,100,101,32,97, + 110,100,32,114,101,116,117,114,110,32,116,104,101,32,115,116, + 114,105,110,103,46,10,10,32,32,32,32,85,110,105,118,101, + 114,115,97,108,32,110,101,119,108,105,110,101,32,115,117,112, + 112,111,114,116,32,105,115,32,117,115,101,100,32,105,110,32, + 116,104,101,32,100,101,99,111,100,105,110,103,46,10,32,32, + 32,32,114,73,0,0,0,78,84,41,7,218,8,116,111,107, + 101,110,105,122,101,114,64,0,0,0,90,7,66,121,116,101, + 115,73,79,90,8,114,101,97,100,108,105,110,101,90,15,100, + 101,116,101,99,116,95,101,110,99,111,100,105,110,103,90,25, + 73,110,99,114,101,109,101,110,116,97,108,78,101,119,108,105, + 110,101,68,101,99,111,100,101,114,218,6,100,101,99,111,100, + 101,41,5,218,12,115,111,117,114,99,101,95,98,121,116,101, + 115,114,172,0,0,0,90,21,115,111,117,114,99,101,95,98, + 121,116,101,115,95,114,101,97,100,108,105,110,101,218,8,101, + 110,99,111,100,105,110,103,90,15,110,101,119,108,105,110,101, + 95,100,101,99,111,100,101,114,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,13,100,101,99,111,100,101,95, + 115,111,117,114,99,101,109,2,0,0,115,12,0,0,0,8, + 5,12,1,10,1,12,1,20,1,255,128,114,176,0,0,0, + 169,2,114,140,0,0,0,218,26,115,117,98,109,111,100,117, + 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, + 111,110,115,99,2,0,0,0,0,0,0,0,2,0,0,0, + 9,0,0,0,8,0,0,0,67,0,0,0,115,8,1,0, + 0,124,1,100,1,117,0,114,56,100,2,125,1,116,0,124, + 2,100,3,131,2,114,66,122,14,124,2,160,1,124,0,161, + 1,125,1,87,0,110,28,4,0,116,2,121,54,1,0,1, + 0,1,0,89,0,110,12,48,0,116,3,160,4,124,1,161, + 1,125,1,116,5,106,6,124,0,124,2,124,1,100,4,141, + 3,125,4,100,5,124,4,95,7,124,2,100,1,117,0,114, + 148,116,8,131,0,68,0,93,40,92,2,125,5,125,6,124, + 1,160,9,116,10,124,6,131,1,161,1,114,102,124,5,124, + 0,124,1,131,2,125,2,124,2,124,4,95,11,1,0,113, + 148,100,1,83,0,124,3,116,12,117,0,114,212,116,0,124, + 2,100,6,131,2,114,218,122,14,124,2,160,13,124,0,161, + 1,125,7,87,0,110,18,4,0,116,2,121,198,1,0,1, + 0,1,0,89,0,110,20,48,0,124,7,114,218,103,0,124, + 4,95,14,110,6,124,3,124,4,95,14,124,4,106,14,103, + 0,107,2,144,1,114,4,124,1,144,1,114,4,116,15,124, + 1,131,1,100,7,25,0,125,8,124,4,106,14,160,16,124, + 8,161,1,1,0,124,4,83,0,41,8,97,61,1,0,0, + 82,101,116,117,114,110,32,97,32,109,111,100,117,108,101,32, + 115,112,101,99,32,98,97,115,101,100,32,111,110,32,97,32, + 102,105,108,101,32,108,111,99,97,116,105,111,110,46,10,10, + 32,32,32,32,84,111,32,105,110,100,105,99,97,116,101,32, + 116,104,97,116,32,116,104,101,32,109,111,100,117,108,101,32, + 105,115,32,97,32,112,97,99,107,97,103,101,44,32,115,101, + 116,10,32,32,32,32,115,117,98,109,111,100,117,108,101,95, + 115,101,97,114,99,104,95,108,111,99,97,116,105,111,110,115, + 32,116,111,32,97,32,108,105,115,116,32,111,102,32,100,105, + 114,101,99,116,111,114,121,32,112,97,116,104,115,46,32,32, + 65,110,10,32,32,32,32,101,109,112,116,121,32,108,105,115, + 116,32,105,115,32,115,117,102,102,105,99,105,101,110,116,44, + 32,116,104,111,117,103,104,32,105,116,115,32,110,111,116,32, + 111,116,104,101,114,119,105,115,101,32,117,115,101,102,117,108, + 32,116,111,32,116,104,101,10,32,32,32,32,105,109,112,111, + 114,116,32,115,121,115,116,101,109,46,10,10,32,32,32,32, + 84,104,101,32,108,111,97,100,101,114,32,109,117,115,116,32, + 116,97,107,101,32,97,32,115,112,101,99,32,97,115,32,105, + 116,115,32,111,110,108,121,32,95,95,105,110,105,116,95,95, + 40,41,32,97,114,103,46,10,10,32,32,32,32,78,122,9, + 60,117,110,107,110,111,119,110,62,218,12,103,101,116,95,102, + 105,108,101,110,97,109,101,169,1,218,6,111,114,105,103,105, + 110,84,218,10,105,115,95,112,97,99,107,97,103,101,114,73, + 0,0,0,41,17,114,128,0,0,0,114,179,0,0,0,114, + 117,0,0,0,114,4,0,0,0,114,79,0,0,0,114,134, + 0,0,0,218,10,77,111,100,117,108,101,83,112,101,99,90, + 13,95,115,101,116,95,102,105,108,101,97,116,116,114,218,27, + 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,114,110,0,0,0, + 114,111,0,0,0,114,140,0,0,0,218,9,95,80,79,80, + 85,76,65,84,69,114,182,0,0,0,114,178,0,0,0,114, + 47,0,0,0,218,6,97,112,112,101,110,100,41,9,114,116, + 0,0,0,90,8,108,111,99,97,116,105,111,110,114,140,0, + 0,0,114,178,0,0,0,218,4,115,112,101,99,218,12,108, + 111,97,100,101,114,95,99,108,97,115,115,218,8,115,117,102, + 102,105,120,101,115,114,182,0,0,0,90,7,100,105,114,110, + 97,109,101,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,23,115,112,101,99,95,102,114,111,109,95,102,105, + 108,101,95,108,111,99,97,116,105,111,110,126,2,0,0,115, + 64,0,0,0,8,12,4,4,10,1,2,2,14,1,12,1, + 6,1,10,2,16,8,6,1,8,3,14,1,14,1,10,1, + 6,1,4,1,4,2,8,3,10,2,2,1,14,1,12,1, + 6,1,4,2,8,1,6,2,12,1,6,1,12,1,12,1, + 4,2,255,128,114,190,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,64,0, + 0,0,115,80,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,100,2,90,4,100,3,90,5,100,4,90,6,101, + 7,100,5,100,6,132,0,131,1,90,8,101,7,100,7,100, + 8,132,0,131,1,90,9,101,7,100,14,100,10,100,11,132, + 1,131,1,90,10,101,7,100,15,100,12,100,13,132,1,131, + 1,90,11,100,9,83,0,41,16,218,21,87,105,110,100,111, 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, - 46,95,115,101,97,114,99,104,95,114,101,103,105,115,116,114, - 121,78,99,4,0,0,0,0,0,0,0,0,0,0,0,8, - 0,0,0,8,0,0,0,67,0,0,0,115,118,0,0,0, - 124,0,160,0,124,1,161,1,125,4,124,4,100,0,117,0, - 114,22,100,0,83,0,122,12,116,1,124,4,131,1,1,0, - 87,0,110,20,4,0,116,2,121,54,1,0,1,0,1,0, - 89,0,100,0,83,0,48,0,116,3,131,0,68,0,93,50, - 92,2,125,5,125,6,124,4,160,4,116,5,124,6,131,1, - 161,1,114,62,116,6,106,7,124,1,124,5,124,1,124,4, - 131,2,124,4,100,1,141,3,125,7,124,7,2,0,1,0, - 83,0,100,0,83,0,41,2,78,114,180,0,0,0,41,8, - 114,200,0,0,0,114,49,0,0,0,114,50,0,0,0,114, - 184,0,0,0,114,110,0,0,0,114,111,0,0,0,114,134, - 0,0,0,218,16,115,112,101,99,95,102,114,111,109,95,108, - 111,97,100,101,114,41,8,114,193,0,0,0,114,139,0,0, - 0,114,44,0,0,0,218,6,116,97,114,103,101,116,114,199, - 0,0,0,114,140,0,0,0,114,189,0,0,0,114,187,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,9,102,105,110,100,95,115,112,101,99,228,2,0,0, - 115,32,0,0,0,10,2,8,1,4,1,2,1,12,1,12, - 1,8,1,14,1,14,1,6,1,8,1,2,1,6,254,8, - 3,4,128,255,128,122,31,87,105,110,100,111,119,115,82,101, - 103,105,115,116,114,121,70,105,110,100,101,114,46,102,105,110, - 100,95,115,112,101,99,99,3,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, - 30,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, - 124,3,100,1,117,1,114,26,124,3,106,1,83,0,100,1, - 83,0,41,2,122,108,70,105,110,100,32,109,111,100,117,108, - 101,32,110,97,109,101,100,32,105,110,32,116,104,101,32,114, - 101,103,105,115,116,114,121,46,10,10,32,32,32,32,32,32, - 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, - 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, - 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, - 32,32,78,169,2,114,203,0,0,0,114,140,0,0,0,169, - 4,114,193,0,0,0,114,139,0,0,0,114,44,0,0,0, - 114,187,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,11,102,105,110,100,95,109,111,100,117,108, - 101,244,2,0,0,115,10,0,0,0,12,7,8,1,6,1, - 4,2,255,128,122,33,87,105,110,100,111,119,115,82,101,103, + 122,62,77,101,116,97,32,112,97,116,104,32,102,105,110,100, + 101,114,32,102,111,114,32,109,111,100,117,108,101,115,32,100, + 101,99,108,97,114,101,100,32,105,110,32,116,104,101,32,87, + 105,110,100,111,119,115,32,114,101,103,105,115,116,114,121,46, + 122,59,83,111,102,116,119,97,114,101,92,80,121,116,104,111, + 110,92,80,121,116,104,111,110,67,111,114,101,92,123,115,121, + 115,95,118,101,114,115,105,111,110,125,92,77,111,100,117,108, + 101,115,92,123,102,117,108,108,110,97,109,101,125,122,65,83, + 111,102,116,119,97,114,101,92,80,121,116,104,111,110,92,80, + 121,116,104,111,110,67,111,114,101,92,123,115,121,115,95,118, + 101,114,115,105,111,110,125,92,77,111,100,117,108,101,115,92, + 123,102,117,108,108,110,97,109,101,125,92,68,101,98,117,103, + 70,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,8,0,0,0,67,0,0,0,115,50,0,0,0,122, + 16,116,0,160,1,116,0,106,2,124,1,161,2,87,0,83, + 0,4,0,116,3,121,48,1,0,1,0,1,0,116,0,160, + 1,116,0,106,4,124,1,161,2,6,0,89,0,83,0,48, + 0,114,109,0,0,0,41,5,218,6,119,105,110,114,101,103, + 90,7,79,112,101,110,75,101,121,90,17,72,75,69,89,95, + 67,85,82,82,69,78,84,95,85,83,69,82,114,50,0,0, + 0,90,18,72,75,69,89,95,76,79,67,65,76,95,77,65, + 67,72,73,78,69,41,2,218,3,99,108,115,114,7,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,14,95,111,112,101,110,95,114,101,103,105,115,116,114,121, + 206,2,0,0,115,10,0,0,0,2,2,16,1,12,1,20, + 1,255,128,122,36,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,2,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,8,0,0,0,67,0, + 0,0,115,130,0,0,0,124,0,106,0,114,14,124,0,106, + 1,125,2,110,6,124,0,106,2,125,2,124,2,106,3,124, + 1,100,1,116,4,106,5,100,0,100,2,133,2,25,0,22, + 0,100,3,141,2,125,3,122,60,124,0,160,6,124,3,161, + 1,143,28,125,4,116,7,160,8,124,4,100,4,161,2,125, + 5,87,0,100,0,4,0,4,0,131,3,1,0,110,16,49, + 0,115,94,48,0,1,0,1,0,1,0,89,0,1,0,87, + 0,124,5,83,0,4,0,116,9,121,128,1,0,1,0,1, + 0,89,0,100,0,83,0,48,0,41,5,78,122,5,37,100, + 46,37,100,114,28,0,0,0,41,2,114,139,0,0,0,90, + 11,115,121,115,95,118,101,114,115,105,111,110,114,40,0,0, + 0,41,10,218,11,68,69,66,85,71,95,66,85,73,76,68, + 218,18,82,69,71,73,83,84,82,89,95,75,69,89,95,68, + 69,66,85,71,218,12,82,69,71,73,83,84,82,89,95,75, + 69,89,114,62,0,0,0,114,1,0,0,0,218,12,118,101, + 114,115,105,111,110,95,105,110,102,111,114,194,0,0,0,114, + 192,0,0,0,90,10,81,117,101,114,121,86,97,108,117,101, + 114,50,0,0,0,41,6,114,193,0,0,0,114,139,0,0, + 0,90,12,114,101,103,105,115,116,114,121,95,107,101,121,114, + 7,0,0,0,90,4,104,107,101,121,218,8,102,105,108,101, + 112,97,116,104,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,16,95,115,101,97,114,99,104,95,114,101,103, + 105,115,116,114,121,213,2,0,0,115,26,0,0,0,6,2, + 8,1,6,2,6,1,16,1,6,255,2,2,12,1,44,1, + 4,3,12,254,8,1,255,128,122,38,87,105,110,100,111,119, + 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, + 95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,121, + 78,99,4,0,0,0,0,0,0,0,0,0,0,0,8,0, + 0,0,8,0,0,0,67,0,0,0,115,118,0,0,0,124, + 0,160,0,124,1,161,1,125,4,124,4,100,0,117,0,114, + 22,100,0,83,0,122,12,116,1,124,4,131,1,1,0,87, + 0,110,20,4,0,116,2,121,54,1,0,1,0,1,0,89, + 0,100,0,83,0,48,0,116,3,131,0,68,0,93,50,92, + 2,125,5,125,6,124,4,160,4,116,5,124,6,131,1,161, + 1,114,62,116,6,106,7,124,1,124,5,124,1,124,4,131, + 2,124,4,100,1,141,3,125,7,124,7,2,0,1,0,83, + 0,100,0,83,0,41,2,78,114,180,0,0,0,41,8,114, + 200,0,0,0,114,49,0,0,0,114,50,0,0,0,114,184, + 0,0,0,114,110,0,0,0,114,111,0,0,0,114,134,0, + 0,0,218,16,115,112,101,99,95,102,114,111,109,95,108,111, + 97,100,101,114,41,8,114,193,0,0,0,114,139,0,0,0, + 114,44,0,0,0,218,6,116,97,114,103,101,116,114,199,0, + 0,0,114,140,0,0,0,114,189,0,0,0,114,187,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,9,102,105,110,100,95,115,112,101,99,228,2,0,0,115, + 32,0,0,0,10,2,8,1,4,1,2,1,12,1,12,1, + 8,1,14,1,14,1,6,1,8,1,2,1,6,254,8,3, + 4,128,255,128,122,31,87,105,110,100,111,119,115,82,101,103, 105,115,116,114,121,70,105,110,100,101,114,46,102,105,110,100, - 95,109,111,100,117,108,101,41,2,78,78,41,1,78,41,12, - 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, - 127,0,0,0,114,197,0,0,0,114,196,0,0,0,114,195, - 0,0,0,218,11,99,108,97,115,115,109,101,116,104,111,100, - 114,194,0,0,0,114,200,0,0,0,114,203,0,0,0,114, - 206,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,191,0,0,0,194,2,0, - 0,115,32,0,0,0,8,0,4,2,2,3,2,255,2,4, - 2,255,4,3,2,2,10,1,2,6,10,1,2,14,12,1, - 2,15,16,1,255,128,114,191,0,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 64,0,0,0,115,48,0,0,0,101,0,90,1,100,0,90, - 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, - 5,132,0,90,5,100,6,100,7,132,0,90,6,100,8,100, - 9,132,0,90,7,100,10,83,0,41,11,218,13,95,76,111, - 97,100,101,114,66,97,115,105,99,115,122,83,66,97,115,101, - 32,99,108,97,115,115,32,111,102,32,99,111,109,109,111,110, - 32,99,111,100,101,32,110,101,101,100,101,100,32,98,121,32, - 98,111,116,104,32,83,111,117,114,99,101,76,111,97,100,101, - 114,32,97,110,100,10,32,32,32,32,83,111,117,114,99,101, - 108,101,115,115,70,105,108,101,76,111,97,100,101,114,46,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,124, - 0,160,1,124,1,161,1,131,1,100,1,25,0,125,2,124, - 2,160,2,100,2,100,1,161,2,100,3,25,0,125,3,124, - 1,160,3,100,2,161,1,100,4,25,0,125,4,124,3,100, - 5,107,2,111,62,124,4,100,5,107,3,83,0,41,6,122, - 141,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109, - 101,110,116,97,116,105,111,110,32,111,102,32,73,110,115,112, - 101,99,116,76,111,97,100,101,114,46,105,115,95,112,97,99, - 107,97,103,101,32,98,121,32,99,104,101,99,107,105,110,103, - 32,105,102,10,32,32,32,32,32,32,32,32,116,104,101,32, - 112,97,116,104,32,114,101,116,117,114,110,101,100,32,98,121, - 32,103,101,116,95,102,105,108,101,110,97,109,101,32,104,97, - 115,32,97,32,102,105,108,101,110,97,109,101,32,111,102,32, - 39,95,95,105,110,105,116,95,95,46,112,121,39,46,114,39, - 0,0,0,114,71,0,0,0,114,73,0,0,0,114,28,0, - 0,0,218,8,95,95,105,110,105,116,95,95,41,4,114,47, + 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,30, + 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, + 3,100,1,117,1,114,26,124,3,106,1,83,0,100,1,83, + 0,41,2,122,108,70,105,110,100,32,109,111,100,117,108,101, + 32,110,97,109,101,100,32,105,110,32,116,104,101,32,114,101, + 103,105,115,116,114,121,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,78,169,2,114,203,0,0,0,114,140,0,0,0,169,4, + 114,193,0,0,0,114,139,0,0,0,114,44,0,0,0,114, + 187,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101, + 244,2,0,0,115,10,0,0,0,12,7,8,1,6,1,4, + 2,255,128,122,33,87,105,110,100,111,119,115,82,101,103,105, + 115,116,114,121,70,105,110,100,101,114,46,102,105,110,100,95, + 109,111,100,117,108,101,41,2,78,78,41,1,78,41,12,114, + 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, + 0,0,0,114,197,0,0,0,114,196,0,0,0,114,195,0, + 0,0,218,11,99,108,97,115,115,109,101,116,104,111,100,114, + 194,0,0,0,114,200,0,0,0,114,203,0,0,0,114,206, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,191,0,0,0,194,2,0,0, + 115,32,0,0,0,8,0,4,2,2,3,2,255,2,4,2, + 255,4,3,2,2,10,1,2,6,10,1,2,14,12,1,2, + 15,16,1,255,128,114,191,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,48,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,100,6,100,7,132,0,90,6,100,8,100,9, + 132,0,90,7,100,10,83,0,41,11,218,13,95,76,111,97, + 100,101,114,66,97,115,105,99,115,122,83,66,97,115,101,32, + 99,108,97,115,115,32,111,102,32,99,111,109,109,111,110,32, + 99,111,100,101,32,110,101,101,100,101,100,32,98,121,32,98, + 111,116,104,32,83,111,117,114,99,101,76,111,97,100,101,114, + 32,97,110,100,10,32,32,32,32,83,111,117,114,99,101,108, + 101,115,115,70,105,108,101,76,111,97,100,101,114,46,99,2, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4, + 0,0,0,67,0,0,0,115,64,0,0,0,116,0,124,0, + 160,1,124,1,161,1,131,1,100,1,25,0,125,2,124,2, + 160,2,100,2,100,1,161,2,100,3,25,0,125,3,124,1, + 160,3,100,2,161,1,100,4,25,0,125,4,124,3,100,5, + 107,2,111,62,124,4,100,5,107,3,83,0,41,7,122,141, + 67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,101, + 110,116,97,116,105,111,110,32,111,102,32,73,110,115,112,101, + 99,116,76,111,97,100,101,114,46,105,115,95,112,97,99,107, + 97,103,101,32,98,121,32,99,104,101,99,107,105,110,103,32, + 105,102,10,32,32,32,32,32,32,32,32,116,104,101,32,112, + 97,116,104,32,114,101,116,117,114,110,101,100,32,98,121,32, + 103,101,116,95,102,105,108,101,110,97,109,101,32,104,97,115, + 32,97,32,102,105,108,101,110,97,109,101,32,111,102,32,39, + 95,95,105,110,105,116,95,95,46,112,121,39,46,114,39,0, + 0,0,114,71,0,0,0,114,73,0,0,0,114,28,0,0, + 0,218,8,95,95,105,110,105,116,95,95,78,41,4,114,47, 0,0,0,114,179,0,0,0,114,43,0,0,0,114,41,0, 0,0,41,5,114,118,0,0,0,114,139,0,0,0,114,96, 0,0,0,90,13,102,105,108,101,110,97,109,101,95,98,97, @@ -1148,1416 +1149,1417 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, 12,0,0,0,116,0,160,1,124,0,124,1,161,2,83,0, - 41,1,122,26,84,104,105,115,32,109,111,100,117,108,101,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,41,2, - 114,134,0,0,0,218,17,95,108,111,97,100,95,109,111,100, - 117,108,101,95,115,104,105,109,169,2,114,118,0,0,0,114, - 139,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, - 26,3,0,0,115,4,0,0,0,12,2,255,128,122,25,95, - 76,111,97,100,101,114,66,97,115,105,99,115,46,108,111,97, - 100,95,109,111,100,117,108,101,78,41,8,114,125,0,0,0, - 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, - 182,0,0,0,114,212,0,0,0,114,217,0,0,0,114,220, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,208,0,0,0,2,3,0,0, - 115,14,0,0,0,8,0,4,2,8,3,8,8,8,3,12, - 8,255,128,114,208,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,74,0,0,0,101,0,90,1,100,0,90,2,100,1, - 100,2,132,0,90,3,100,3,100,4,132,0,90,4,100,5, - 100,6,132,0,90,5,100,7,100,8,132,0,90,6,100,9, - 100,10,132,0,90,7,100,11,100,12,156,1,100,13,100,14, - 132,2,90,8,100,15,100,16,132,0,90,9,100,17,83,0, - 41,18,218,12,83,111,117,114,99,101,76,111,97,100,101,114, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,116,0, - 130,1,41,2,122,165,79,112,116,105,111,110,97,108,32,109, - 101,116,104,111,100,32,116,104,97,116,32,114,101,116,117,114, - 110,115,32,116,104,101,32,109,111,100,105,102,105,99,97,116, - 105,111,110,32,116,105,109,101,32,40,97,110,32,105,110,116, - 41,32,102,111,114,32,116,104,101,10,32,32,32,32,32,32, - 32,32,115,112,101,99,105,102,105,101,100,32,112,97,116,104, - 32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,32, - 32,32,32,82,97,105,115,101,115,32,79,83,69,114,114,111, - 114,32,119,104,101,110,32,116,104,101,32,112,97,116,104,32, - 99,97,110,110,111,116,32,98,101,32,104,97,110,100,108,101, - 100,46,10,32,32,32,32,32,32,32,32,78,41,1,114,50, - 0,0,0,169,2,114,118,0,0,0,114,44,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,10, - 112,97,116,104,95,109,116,105,109,101,33,3,0,0,115,4, - 0,0,0,4,6,255,128,122,23,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,0,0,0,0,2,0,0, - 0,4,0,0,0,67,0,0,0,115,14,0,0,0,100,1, - 124,0,160,0,124,1,161,1,105,1,83,0,41,2,97,158, - 1,0,0,79,112,116,105,111,110,97,108,32,109,101,116,104, - 111,100,32,114,101,116,117,114,110,105,110,103,32,97,32,109, - 101,116,97,100,97,116,97,32,100,105,99,116,32,102,111,114, - 32,116,104,101,32,115,112,101,99,105,102,105,101,100,10,32, - 32,32,32,32,32,32,32,112,97,116,104,32,40,97,32,115, - 116,114,41,46,10,10,32,32,32,32,32,32,32,32,80,111, - 115,115,105,98,108,101,32,107,101,121,115,58,10,32,32,32, - 32,32,32,32,32,45,32,39,109,116,105,109,101,39,32,40, - 109,97,110,100,97,116,111,114,121,41,32,105,115,32,116,104, - 101,32,110,117,109,101,114,105,99,32,116,105,109,101,115,116, - 97,109,112,32,111,102,32,108,97,115,116,32,115,111,117,114, - 99,101,10,32,32,32,32,32,32,32,32,32,32,99,111,100, - 101,32,109,111,100,105,102,105,99,97,116,105,111,110,59,10, - 32,32,32,32,32,32,32,32,45,32,39,115,105,122,101,39, - 32,40,111,112,116,105,111,110,97,108,41,32,105,115,32,116, - 104,101,32,115,105,122,101,32,105,110,32,98,121,116,101,115, - 32,111,102,32,116,104,101,32,115,111,117,114,99,101,32,99, - 111,100,101,46,10,10,32,32,32,32,32,32,32,32,73,109, + 41,2,122,26,84,104,105,115,32,109,111,100,117,108,101,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,78,41, + 2,114,134,0,0,0,218,17,95,108,111,97,100,95,109,111, + 100,117,108,101,95,115,104,105,109,169,2,114,118,0,0,0, + 114,139,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,11,108,111,97,100,95,109,111,100,117,108, + 101,26,3,0,0,115,4,0,0,0,12,2,255,128,122,25, + 95,76,111,97,100,101,114,66,97,115,105,99,115,46,108,111, + 97,100,95,109,111,100,117,108,101,78,41,8,114,125,0,0, + 0,114,124,0,0,0,114,126,0,0,0,114,127,0,0,0, + 114,182,0,0,0,114,212,0,0,0,114,217,0,0,0,114, + 220,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,208,0,0,0,2,3,0, + 0,115,14,0,0,0,8,0,4,2,8,3,8,8,8,3, + 12,8,255,128,114,208,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0, + 0,0,115,74,0,0,0,101,0,90,1,100,0,90,2,100, + 1,100,2,132,0,90,3,100,3,100,4,132,0,90,4,100, + 5,100,6,132,0,90,5,100,7,100,8,132,0,90,6,100, + 9,100,10,132,0,90,7,100,11,100,12,156,1,100,13,100, + 14,132,2,90,8,100,15,100,16,132,0,90,9,100,17,83, + 0,41,18,218,12,83,111,117,114,99,101,76,111,97,100,101, + 114,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,116, + 0,130,1,41,2,122,165,79,112,116,105,111,110,97,108,32, + 109,101,116,104,111,100,32,116,104,97,116,32,114,101,116,117, + 114,110,115,32,116,104,101,32,109,111,100,105,102,105,99,97, + 116,105,111,110,32,116,105,109,101,32,40,97,110,32,105,110, + 116,41,32,102,111,114,32,116,104,101,10,32,32,32,32,32, + 32,32,32,115,112,101,99,105,102,105,101,100,32,112,97,116, + 104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,32, + 32,32,32,32,82,97,105,115,101,115,32,79,83,69,114,114, + 111,114,32,119,104,101,110,32,116,104,101,32,112,97,116,104, + 32,99,97,110,110,111,116,32,98,101,32,104,97,110,100,108, + 101,100,46,10,32,32,32,32,32,32,32,32,78,41,1,114, + 50,0,0,0,169,2,114,118,0,0,0,114,44,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 10,112,97,116,104,95,109,116,105,109,101,33,3,0,0,115, + 4,0,0,0,4,6,255,128,122,23,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,0,0,0,0,2,0, + 0,0,4,0,0,0,67,0,0,0,115,14,0,0,0,100, + 1,124,0,160,0,124,1,161,1,105,1,83,0,41,3,97, + 158,1,0,0,79,112,116,105,111,110,97,108,32,109,101,116, + 104,111,100,32,114,101,116,117,114,110,105,110,103,32,97,32, + 109,101,116,97,100,97,116,97,32,100,105,99,116,32,102,111, + 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,10, + 32,32,32,32,32,32,32,32,112,97,116,104,32,40,97,32, + 115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,80, + 111,115,115,105,98,108,101,32,107,101,121,115,58,10,32,32, + 32,32,32,32,32,32,45,32,39,109,116,105,109,101,39,32, + 40,109,97,110,100,97,116,111,114,121,41,32,105,115,32,116, + 104,101,32,110,117,109,101,114,105,99,32,116,105,109,101,115, + 116,97,109,112,32,111,102,32,108,97,115,116,32,115,111,117, + 114,99,101,10,32,32,32,32,32,32,32,32,32,32,99,111, + 100,101,32,109,111,100,105,102,105,99,97,116,105,111,110,59, + 10,32,32,32,32,32,32,32,32,45,32,39,115,105,122,101, + 39,32,40,111,112,116,105,111,110,97,108,41,32,105,115,32, + 116,104,101,32,115,105,122,101,32,105,110,32,98,121,116,101, + 115,32,111,102,32,116,104,101,32,115,111,117,114,99,101,32, + 99,111,100,101,46,10,10,32,32,32,32,32,32,32,32,73, + 109,112,108,101,109,101,110,116,105,110,103,32,116,104,105,115, + 32,109,101,116,104,111,100,32,97,108,108,111,119,115,32,116, + 104,101,32,108,111,97,100,101,114,32,116,111,32,114,101,97, + 100,32,98,121,116,101,99,111,100,101,32,102,105,108,101,115, + 46,10,32,32,32,32,32,32,32,32,82,97,105,115,101,115, + 32,79,83,69,114,114,111,114,32,119,104,101,110,32,116,104, + 101,32,112,97,116,104,32,99,97,110,110,111,116,32,98,101, + 32,104,97,110,100,108,101,100,46,10,32,32,32,32,32,32, + 32,32,114,169,0,0,0,78,41,1,114,223,0,0,0,114, + 222,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,10,112,97,116,104,95,115,116,97,116,115,41, + 3,0,0,115,4,0,0,0,14,12,255,128,122,23,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,0,0, + 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,12, + 0,0,0,124,0,160,0,124,2,124,3,161,2,83,0,41, + 2,122,228,79,112,116,105,111,110,97,108,32,109,101,116,104, + 111,100,32,119,104,105,99,104,32,119,114,105,116,101,115,32, + 100,97,116,97,32,40,98,121,116,101,115,41,32,116,111,32, + 97,32,102,105,108,101,32,112,97,116,104,32,40,97,32,115, + 116,114,41,46,10,10,32,32,32,32,32,32,32,32,73,109, 112,108,101,109,101,110,116,105,110,103,32,116,104,105,115,32, - 109,101,116,104,111,100,32,97,108,108,111,119,115,32,116,104, - 101,32,108,111,97,100,101,114,32,116,111,32,114,101,97,100, + 109,101,116,104,111,100,32,97,108,108,111,119,115,32,102,111, + 114,32,116,104,101,32,119,114,105,116,105,110,103,32,111,102, 32,98,121,116,101,99,111,100,101,32,102,105,108,101,115,46, - 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32, - 79,83,69,114,114,111,114,32,119,104,101,110,32,116,104,101, - 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32, - 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32, - 32,114,169,0,0,0,41,1,114,223,0,0,0,114,222,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,10,112,97,116,104,95,115,116,97,116,115,41,3,0, - 0,115,4,0,0,0,14,12,255,128,122,23,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,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,12,0,0, - 0,124,0,160,0,124,2,124,3,161,2,83,0,41,1,122, - 228,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, - 32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,97, - 116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,32, - 102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,114, - 41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, - 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, - 116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,32, - 116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,98, - 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,115,111,117,114, - 99,101,32,112,97,116,104,32,105,115,32,110,101,101,100,101, - 100,32,105,110,32,111,114,100,101,114,32,116,111,32,99,111, - 114,114,101,99,116,108,121,32,116,114,97,110,115,102,101,114, - 32,112,101,114,109,105,115,115,105,111,110,115,10,32,32,32, - 32,32,32,32,32,41,1,218,8,115,101,116,95,100,97,116, - 97,41,4,114,118,0,0,0,114,107,0,0,0,90,10,99, - 97,99,104,101,95,112,97,116,104,114,26,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,218,15,95, - 99,97,99,104,101,95,98,121,116,101,99,111,100,101,55,3, - 0,0,115,4,0,0,0,12,8,255,128,122,28,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,0,0,0,0,3,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,150,79, - 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,119, - 104,105,99,104,32,119,114,105,116,101,115,32,100,97,116,97, - 32,40,98,121,116,101,115,41,32,116,111,32,97,32,102,105, - 108,101,32,112,97,116,104,32,40,97,32,115,116,114,41,46, - 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, - 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, - 111,100,32,97,108,108,111,119,115,32,102,111,114,32,116,104, - 101,32,119,114,105,116,105,110,103,32,111,102,32,98,121,116, - 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, - 32,32,32,32,32,78,114,5,0,0,0,41,3,114,118,0, - 0,0,114,44,0,0,0,114,26,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,114,225,0,0,0, - 65,3,0,0,115,4,0,0,0,4,128,255,128,122,21,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,0,0,0, - 0,5,0,0,0,10,0,0,0,67,0,0,0,115,70,0, - 0,0,124,0,160,0,124,1,161,1,125,2,122,20,124,0, - 160,1,124,2,161,1,125,3,87,0,116,4,124,3,131,1, - 83,0,4,0,116,2,121,68,1,0,125,4,1,0,122,14, - 116,3,100,1,124,1,100,2,141,2,124,4,130,2,100,3, - 125,4,126,4,48,0,48,0,41,4,122,52,67,111,110,99, - 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, - 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,46, - 122,39,115,111,117,114,99,101,32,110,111,116,32,97,118,97, - 105,108,97,98,108,101,32,116,104,114,111,117,103,104,32,103, - 101,116,95,100,97,116,97,40,41,114,115,0,0,0,78,41, - 5,114,179,0,0,0,218,8,103,101,116,95,100,97,116,97, - 114,50,0,0,0,114,117,0,0,0,114,176,0,0,0,41, - 5,114,118,0,0,0,114,139,0,0,0,114,44,0,0,0, - 114,174,0,0,0,218,3,101,120,99,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,10,103,101,116,95,115, - 111,117,114,99,101,72,3,0,0,115,24,0,0,0,10,2, - 2,1,12,1,8,4,14,253,4,1,2,1,4,255,2,1, - 2,255,10,128,255,128,122,23,83,111,117,114,99,101,76,111, - 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,114, - 104,0,0,0,41,1,218,9,95,111,112,116,105,109,105,122, - 101,99,3,0,0,0,0,0,0,0,1,0,0,0,4,0, - 0,0,8,0,0,0,67,0,0,0,115,22,0,0,0,116, - 0,106,1,116,2,124,1,124,2,100,1,100,2,124,3,100, - 3,141,6,83,0,41,4,122,130,82,101,116,117,114,110,32, - 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, - 99,111,109,112,105,108,101,100,32,102,114,111,109,32,115,111, - 117,114,99,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,39,100,97,116,97,39,32,97,114,103,117,109,101, - 110,116,32,99,97,110,32,98,101,32,97,110,121,32,111,98, - 106,101,99,116,32,116,121,112,101,32,116,104,97,116,32,99, - 111,109,112,105,108,101,40,41,32,115,117,112,112,111,114,116, - 115,46,10,32,32,32,32,32,32,32,32,114,215,0,0,0, - 84,41,2,218,12,100,111,110,116,95,105,110,104,101,114,105, - 116,114,83,0,0,0,41,3,114,134,0,0,0,114,214,0, - 0,0,218,7,99,111,109,112,105,108,101,41,4,114,118,0, - 0,0,114,26,0,0,0,114,44,0,0,0,114,230,0,0, + 10,10,32,32,32,32,32,32,32,32,84,104,101,32,115,111, + 117,114,99,101,32,112,97,116,104,32,105,115,32,110,101,101, + 100,101,100,32,105,110,32,111,114,100,101,114,32,116,111,32, + 99,111,114,114,101,99,116,108,121,32,116,114,97,110,115,102, + 101,114,32,112,101,114,109,105,115,115,105,111,110,115,10,32, + 32,32,32,32,32,32,32,78,41,1,218,8,115,101,116,95, + 100,97,116,97,41,4,114,118,0,0,0,114,107,0,0,0, + 90,10,99,97,99,104,101,95,112,97,116,104,114,26,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,14,115,111,117,114,99,101,95,116,111,95,99,111,100,101, - 82,3,0,0,115,8,0,0,0,12,5,4,1,6,255,255, - 128,122,27,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,0,0,0,0,15,0,0,0,9, - 0,0,0,67,0,0,0,115,28,2,0,0,124,0,160,0, - 124,1,161,1,125,2,100,1,125,3,100,1,125,4,100,1, - 125,5,100,2,125,6,100,3,125,7,122,12,116,1,124,2, - 131,1,125,8,87,0,110,24,4,0,116,2,121,66,1,0, - 1,0,1,0,100,1,125,8,89,0,144,1,110,42,48,0, - 122,14,124,0,160,3,124,2,161,1,125,9,87,0,110,20, - 4,0,116,4,121,102,1,0,1,0,1,0,89,0,144,1, - 110,6,48,0,116,5,124,9,100,4,25,0,131,1,125,3, - 122,14,124,0,160,6,124,8,161,1,125,10,87,0,110,18, - 4,0,116,4,121,148,1,0,1,0,1,0,89,0,110,216, - 48,0,124,1,124,8,100,5,156,2,125,11,122,148,116,7, - 124,10,124,1,124,11,131,3,125,12,116,8,124,10,131,1, - 100,6,100,1,133,2,25,0,125,13,124,12,100,7,64,0, - 100,8,107,3,125,6,124,6,144,1,114,30,124,12,100,9, - 64,0,100,8,107,3,125,7,116,9,106,10,100,10,107,3, - 144,1,114,50,124,7,115,248,116,9,106,10,100,11,107,2, - 144,1,114,50,124,0,160,6,124,2,161,1,125,4,116,9, - 160,11,116,12,124,4,161,2,125,5,116,13,124,10,124,5, - 124,1,124,11,131,4,1,0,110,20,116,14,124,10,124,3, - 124,9,100,12,25,0,124,1,124,11,131,5,1,0,87,0, - 110,24,4,0,116,15,116,16,102,2,144,1,121,76,1,0, - 1,0,1,0,89,0,110,32,48,0,116,17,160,18,100,13, - 124,8,124,2,161,3,1,0,116,19,124,13,124,1,124,8, - 124,2,100,14,141,4,83,0,124,4,100,1,117,0,144,1, - 114,128,124,0,160,6,124,2,161,1,125,4,124,0,160,20, - 124,4,124,2,161,2,125,14,116,17,160,18,100,15,124,2, - 161,2,1,0,116,21,106,22,144,2,115,24,124,8,100,1, - 117,1,144,2,114,24,124,3,100,1,117,1,144,2,114,24, - 124,6,144,1,114,220,124,5,100,1,117,0,144,1,114,206, - 116,9,160,11,124,4,161,1,125,5,116,23,124,14,124,5, - 124,7,131,3,125,10,110,16,116,24,124,14,124,3,116,25, - 124,4,131,1,131,3,125,10,122,20,124,0,160,26,124,2, - 124,8,124,10,161,3,1,0,87,0,124,14,83,0,4,0, - 116,2,144,2,121,22,1,0,1,0,1,0,89,0,124,14, - 83,0,48,0,124,14,83,0,41,16,122,190,67,111,110,99, - 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, - 97,100,101,114,46,103,101,116,95,99,111,100,101,46,10,10, - 32,32,32,32,32,32,32,32,82,101,97,100,105,110,103,32, - 111,102,32,98,121,116,101,99,111,100,101,32,114,101,113,117, - 105,114,101,115,32,112,97,116,104,95,115,116,97,116,115,32, - 116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101, - 100,46,32,84,111,32,119,114,105,116,101,10,32,32,32,32, - 32,32,32,32,98,121,116,101,99,111,100,101,44,32,115,101, - 116,95,100,97,116,97,32,109,117,115,116,32,97,108,115,111, - 32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,46, - 10,10,32,32,32,32,32,32,32,32,78,70,84,114,169,0, - 0,0,114,159,0,0,0,114,145,0,0,0,114,39,0,0, - 0,114,73,0,0,0,114,28,0,0,0,90,5,110,101,118, - 101,114,90,6,97,108,119,97,121,115,218,4,115,105,122,101, - 122,13,123,125,32,109,97,116,99,104,101,115,32,123,125,41, - 3,114,116,0,0,0,114,106,0,0,0,114,107,0,0,0, - 122,19,99,111,100,101,32,111,98,106,101,99,116,32,102,114, - 111,109,32,123,125,41,27,114,179,0,0,0,114,97,0,0, - 0,114,82,0,0,0,114,224,0,0,0,114,50,0,0,0, - 114,18,0,0,0,114,227,0,0,0,114,152,0,0,0,218, - 10,109,101,109,111,114,121,118,105,101,119,114,163,0,0,0, - 90,21,99,104,101,99,107,95,104,97,115,104,95,98,97,115, - 101,100,95,112,121,99,115,114,157,0,0,0,218,17,95,82, - 65,87,95,77,65,71,73,67,95,78,85,77,66,69,82,114, - 158,0,0,0,114,156,0,0,0,114,117,0,0,0,114,150, - 0,0,0,114,134,0,0,0,114,149,0,0,0,114,165,0, - 0,0,114,233,0,0,0,114,1,0,0,0,218,19,100,111, - 110,116,95,119,114,105,116,101,95,98,121,116,101,99,111,100, - 101,114,171,0,0,0,114,170,0,0,0,114,23,0,0,0, - 114,226,0,0,0,41,15,114,118,0,0,0,114,139,0,0, - 0,114,107,0,0,0,114,154,0,0,0,114,174,0,0,0, - 114,157,0,0,0,90,10,104,97,115,104,95,98,97,115,101, - 100,90,12,99,104,101,99,107,95,115,111,117,114,99,101,114, - 106,0,0,0,218,2,115,116,114,26,0,0,0,114,151,0, - 0,0,114,2,0,0,0,90,10,98,121,116,101,115,95,100, - 97,116,97,90,11,99,111,100,101,95,111,98,106,101,99,116, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 213,0,0,0,90,3,0,0,115,160,0,0,0,10,7,4, - 1,4,1,4,1,4,1,4,1,2,1,12,1,12,1,12, - 1,2,2,14,1,12,1,8,1,12,2,2,1,14,1,12, - 1,6,1,2,3,2,1,6,254,2,4,12,1,16,1,12, - 1,6,1,12,1,12,1,2,1,2,255,8,2,4,254,10, - 3,4,1,2,1,2,1,4,254,8,4,2,1,6,255,2, - 3,2,1,2,1,6,1,2,1,2,1,8,251,18,7,6, - 1,8,2,2,1,4,255,6,2,2,1,2,1,6,254,10, - 3,10,1,12,1,12,1,18,1,6,1,4,255,6,2,10, - 1,10,1,14,1,6,2,6,1,4,255,2,2,16,1,4, - 3,14,254,2,1,4,1,2,255,4,1,255,128,122,21,83, - 111,117,114,99,101,76,111,97,100,101,114,46,103,101,116,95, - 99,111,100,101,78,41,10,114,125,0,0,0,114,124,0,0, - 0,114,126,0,0,0,114,223,0,0,0,114,224,0,0,0, - 114,226,0,0,0,114,225,0,0,0,114,229,0,0,0,114, - 233,0,0,0,114,213,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,221,0, - 0,0,31,3,0,0,115,18,0,0,0,8,0,8,2,8, - 8,8,14,8,10,8,7,14,10,12,8,255,128,114,221,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,0,0,0,0,115,92,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, - 132,0,90,6,101,7,135,0,102,1,100,8,100,9,132,8, - 131,1,90,8,101,7,100,10,100,11,132,0,131,1,90,9, - 100,12,100,13,132,0,90,10,101,7,100,14,100,15,132,0, - 131,1,90,11,135,0,4,0,90,12,83,0,41,16,218,10, - 70,105,108,101,76,111,97,100,101,114,122,103,66,97,115,101, - 32,102,105,108,101,32,108,111,97,100,101,114,32,99,108,97, - 115,115,32,119,104,105,99,104,32,105,109,112,108,101,109,101, - 110,116,115,32,116,104,101,32,108,111,97,100,101,114,32,112, - 114,111,116,111,99,111,108,32,109,101,116,104,111,100,115,32, - 116,104,97,116,10,32,32,32,32,114,101,113,117,105,114,101, - 32,102,105,108,101,32,115,121,115,116,101,109,32,117,115,97, - 103,101,46,99,3,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0, - 0,124,1,124,0,95,0,124,2,124,0,95,1,100,1,83, - 0,41,2,122,75,67,97,99,104,101,32,116,104,101,32,109, - 111,100,117,108,101,32,110,97,109,101,32,97,110,100,32,116, - 104,101,32,112,97,116,104,32,116,111,32,116,104,101,32,102, - 105,108,101,32,102,111,117,110,100,32,98,121,32,116,104,101, - 10,32,32,32,32,32,32,32,32,102,105,110,100,101,114,46, - 78,114,159,0,0,0,41,3,114,118,0,0,0,114,139,0, - 0,0,114,44,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,209,0,0,0,180,3,0,0,115, - 8,0,0,0,6,3,6,1,4,128,255,128,122,19,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,0,0,0,0,2,0, - 0,0,2,0,0,0,67,0,0,0,115,24,0,0,0,124, - 0,106,0,124,1,106,0,107,2,111,22,124,0,106,1,124, - 1,106,1,107,2,83,0,114,109,0,0,0,169,2,218,9, - 95,95,99,108,97,115,115,95,95,114,131,0,0,0,169,2, - 114,118,0,0,0,90,5,111,116,104,101,114,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,6,95,95,101, - 113,95,95,186,3,0,0,115,8,0,0,0,12,1,10,1, - 2,255,255,128,122,17,70,105,108,101,76,111,97,100,101,114, - 46,95,95,101,113,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,20,0,0,0,116,0,124,0,106,1,131,1,116,0,124, - 0,106,2,131,1,65,0,83,0,114,109,0,0,0,169,3, - 218,4,104,97,115,104,114,116,0,0,0,114,44,0,0,0, - 169,1,114,118,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,218,8,95,95,104,97,115,104,95,95, - 190,3,0,0,115,4,0,0,0,20,1,255,128,122,19,70, - 105,108,101,76,111,97,100,101,114,46,95,95,104,97,115,104, - 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,3,0,0,0,115,16,0,0,0, - 116,0,116,1,124,0,131,2,160,2,124,1,161,1,83,0, - 41,1,122,100,76,111,97,100,32,97,32,109,111,100,117,108, - 101,32,102,114,111,109,32,97,32,102,105,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,41,3,218,5,115,117,112,101, - 114,114,239,0,0,0,114,220,0,0,0,114,219,0,0,0, - 169,1,114,241,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,220,0,0,0,193,3,0,0,115,4,0,0,0,16, - 10,255,128,122,22,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,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,169, - 1,122,58,82,101,116,117,114,110,32,116,104,101,32,112,97, - 116,104,32,116,111,32,116,104,101,32,115,111,117,114,99,101, - 32,102,105,108,101,32,97,115,32,102,111,117,110,100,32,98, - 121,32,116,104,101,32,102,105,110,100,101,114,46,114,48,0, - 0,0,114,219,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,179,0,0,0,205,3,0,0,115, - 4,0,0,0,6,3,255,128,122,23,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,0,0,0,0,3,0, - 0,0,8,0,0,0,67,0,0,0,115,128,0,0,0,116, - 0,124,0,116,1,116,2,102,2,131,2,114,72,116,3,160, - 4,116,5,124,1,131,1,161,1,143,24,125,2,124,2,160, - 6,161,0,87,0,2,0,100,1,4,0,4,0,131,3,1, - 0,83,0,49,0,115,58,48,0,1,0,1,0,1,0,89, - 0,1,0,100,1,83,0,116,3,160,7,124,1,100,2,161, - 2,143,24,125,2,124,2,160,6,161,0,87,0,2,0,100, - 1,4,0,4,0,131,3,1,0,83,0,49,0,115,114,48, - 0,1,0,1,0,1,0,89,0,1,0,100,1,83,0,41, - 3,122,39,82,101,116,117,114,110,32,116,104,101,32,100,97, - 116,97,32,102,114,111,109,32,112,97,116,104,32,97,115,32, - 114,97,119,32,98,121,116,101,115,46,78,218,1,114,41,8, - 114,161,0,0,0,114,221,0,0,0,218,19,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,114, - 64,0,0,0,90,9,111,112,101,110,95,99,111,100,101,114, - 84,0,0,0,90,4,114,101,97,100,114,65,0,0,0,41, - 3,114,118,0,0,0,114,44,0,0,0,114,68,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 227,0,0,0,210,3,0,0,115,16,0,0,0,14,2,16, - 1,38,1,4,128,14,2,38,1,4,128,255,128,122,19,70, - 105,108,101,76,111,97,100,101,114,46,103,101,116,95,100,97, - 116,97,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,2,0,0,0,67,0,0,0,115,20,0,0,0, - 100,1,100,2,108,0,109,1,125,2,1,0,124,2,124,0, - 131,1,83,0,41,3,78,114,73,0,0,0,41,1,218,10, - 70,105,108,101,82,101,97,100,101,114,41,2,90,17,105,109, - 112,111,114,116,108,105,98,46,114,101,97,100,101,114,115,114, - 253,0,0,0,41,3,114,118,0,0,0,114,216,0,0,0, - 114,253,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,19,103,101,116,95,114,101,115,111,117,114, - 99,101,95,114,101,97,100,101,114,219,3,0,0,115,6,0, - 0,0,12,2,8,1,255,128,122,30,70,105,108,101,76,111, - 97,100,101,114,46,103,101,116,95,114,101,115,111,117,114,99, - 101,95,114,101,97,100,101,114,41,13,114,125,0,0,0,114, - 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,209, - 0,0,0,114,243,0,0,0,114,247,0,0,0,114,136,0, - 0,0,114,220,0,0,0,114,179,0,0,0,114,227,0,0, - 0,114,254,0,0,0,90,13,95,95,99,108,97,115,115,99, - 101,108,108,95,95,114,5,0,0,0,114,5,0,0,0,114, - 249,0,0,0,114,8,0,0,0,114,239,0,0,0,175,3, - 0,0,115,26,0,0,0,8,0,4,2,8,3,8,6,8, - 4,2,3,14,1,2,11,10,1,8,4,2,9,18,1,255, - 128,114,239,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, - 46,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,100,7,156,1,100,8,100,9,132,2,90,6,100,10, - 83,0,41,11,218,16,83,111,117,114,99,101,70,105,108,101, - 76,111,97,100,101,114,122,62,67,111,110,99,114,101,116,101, - 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, - 111,102,32,83,111,117,114,99,101,76,111,97,100,101,114,32, - 117,115,105,110,103,32,116,104,101,32,102,105,108,101,32,115, - 121,115,116,101,109,46,99,2,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, - 22,0,0,0,116,0,124,1,131,1,125,2,124,2,106,1, - 124,2,106,2,100,1,156,2,83,0,41,2,122,33,82,101, - 116,117,114,110,32,116,104,101,32,109,101,116,97,100,97,116, - 97,32,102,111,114,32,116,104,101,32,112,97,116,104,46,41, - 2,114,169,0,0,0,114,234,0,0,0,41,3,114,49,0, - 0,0,218,8,115,116,95,109,116,105,109,101,90,7,115,116, - 95,115,105,122,101,41,3,114,118,0,0,0,114,44,0,0, - 0,114,238,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,224,0,0,0,229,3,0,0,115,6, - 0,0,0,8,2,14,1,255,128,122,27,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,0,0, - 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, - 24,0,0,0,116,0,124,1,131,1,125,4,124,0,106,1, - 124,2,124,3,124,4,100,1,141,3,83,0,41,2,78,169, - 1,218,5,95,109,111,100,101,41,2,114,114,0,0,0,114, - 225,0,0,0,41,5,114,118,0,0,0,114,107,0,0,0, - 114,106,0,0,0,114,26,0,0,0,114,52,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,226, - 0,0,0,234,3,0,0,115,6,0,0,0,8,2,16,1, - 255,128,122,32,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, - 99,111,100,101,114,60,0,0,0,114,1,1,0,0,99,3, - 0,0,0,0,0,0,0,1,0,0,0,9,0,0,0,11, - 0,0,0,67,0,0,0,115,244,0,0,0,116,0,124,1, - 131,1,92,2,125,4,125,5,103,0,125,6,124,4,114,52, - 116,1,124,4,131,1,115,52,116,0,124,4,131,1,92,2, - 125,4,125,7,124,6,160,2,124,7,161,1,1,0,113,16, - 116,3,124,6,131,1,68,0,93,98,125,7,116,4,124,4, - 124,7,131,2,125,4,122,14,116,5,160,6,124,4,161,1, - 1,0,87,0,113,60,4,0,116,7,121,106,1,0,1,0, - 1,0,89,0,113,60,4,0,116,8,121,158,1,0,125,8, - 1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,3, - 1,0,87,0,89,0,100,2,125,8,126,8,1,0,100,2, - 83,0,100,2,125,8,126,8,48,0,48,0,122,30,116,11, - 124,1,124,2,124,3,131,3,1,0,116,9,160,10,100,3, - 124,1,161,2,1,0,87,0,100,2,83,0,4,0,116,8, - 121,242,1,0,125,8,1,0,122,28,116,9,160,10,100,1, - 124,1,124,8,161,3,1,0,87,0,89,0,100,2,125,8, - 126,8,100,2,83,0,100,2,125,8,126,8,48,0,48,0, - 41,4,122,27,87,114,105,116,101,32,98,121,116,101,115,32, - 100,97,116,97,32,116,111,32,97,32,102,105,108,101,46,122, - 27,99,111,117,108,100,32,110,111,116,32,99,114,101,97,116, - 101,32,123,33,114,125,58,32,123,33,114,125,78,122,12,99, - 114,101,97,116,101,100,32,123,33,114,125,41,12,114,47,0, - 0,0,114,56,0,0,0,114,186,0,0,0,114,42,0,0, - 0,114,38,0,0,0,114,4,0,0,0,90,5,109,107,100, - 105,114,218,15,70,105,108,101,69,120,105,115,116,115,69,114, - 114,111,114,114,50,0,0,0,114,134,0,0,0,114,149,0, - 0,0,114,69,0,0,0,41,9,114,118,0,0,0,114,44, - 0,0,0,114,26,0,0,0,114,2,1,0,0,218,6,112, - 97,114,101,110,116,114,96,0,0,0,114,37,0,0,0,114, - 33,0,0,0,114,228,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,225,0,0,0,239,3,0, - 0,115,54,0,0,0,12,2,4,1,12,2,12,1,12,1, - 12,2,10,1,2,1,14,1,12,1,4,2,14,1,6,3, - 4,1,4,255,16,2,10,128,2,1,12,1,14,1,4,128, - 14,1,8,2,2,1,8,255,20,128,255,128,122,25,83,111, - 117,114,99,101,70,105,108,101,76,111,97,100,101,114,46,115, - 101,116,95,100,97,116,97,78,41,7,114,125,0,0,0,114, - 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,224, - 0,0,0,114,226,0,0,0,114,225,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,255,0,0,0,225,3,0,0,115,12,0,0,0,8, - 0,4,2,8,2,8,5,18,5,255,128,114,255,0,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,64,0,0,0,115,32,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,83,0,41,7, - 218,20,83,111,117,114,99,101,108,101,115,115,70,105,108,101, - 76,111,97,100,101,114,122,45,76,111,97,100,101,114,32,119, - 104,105,99,104,32,104,97,110,100,108,101,115,32,115,111,117, - 114,99,101,108,101,115,115,32,102,105,108,101,32,105,109,112, - 111,114,116,115,46,99,2,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,68, - 0,0,0,124,0,160,0,124,1,161,1,125,2,124,0,160, - 1,124,2,161,1,125,3,124,1,124,2,100,1,156,2,125, - 4,116,2,124,3,124,1,124,4,131,3,1,0,116,3,116, - 4,124,3,131,1,100,2,100,0,133,2,25,0,124,1,124, - 2,100,3,141,3,83,0,41,4,78,114,159,0,0,0,114, - 145,0,0,0,41,2,114,116,0,0,0,114,106,0,0,0, - 41,5,114,179,0,0,0,114,227,0,0,0,114,152,0,0, - 0,114,165,0,0,0,114,235,0,0,0,41,5,114,118,0, - 0,0,114,139,0,0,0,114,44,0,0,0,114,26,0,0, - 0,114,151,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,213,0,0,0,18,4,0,0,115,24, - 0,0,0,10,1,10,1,2,4,2,1,6,254,12,4,2, - 1,14,1,2,1,2,1,6,253,255,128,122,29,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,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,39, - 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,116, - 104,101,114,101,32,105,115,32,110,111,32,115,111,117,114,99, - 101,32,99,111,100,101,46,78,114,5,0,0,0,114,219,0, + 218,15,95,99,97,99,104,101,95,98,121,116,101,99,111,100, + 101,55,3,0,0,115,4,0,0,0,12,8,255,128,122,28, + 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,0,0,0,0,3,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, + 122,150,79,112,116,105,111,110,97,108,32,109,101,116,104,111, + 100,32,119,104,105,99,104,32,119,114,105,116,101,115,32,100, + 97,116,97,32,40,98,121,116,101,115,41,32,116,111,32,97, + 32,102,105,108,101,32,112,97,116,104,32,40,97,32,115,116, + 114,41,46,10,10,32,32,32,32,32,32,32,32,73,109,112, + 108,101,109,101,110,116,105,110,103,32,116,104,105,115,32,109, + 101,116,104,111,100,32,97,108,108,111,119,115,32,102,111,114, + 32,116,104,101,32,119,114,105,116,105,110,103,32,111,102,32, + 98,121,116,101,99,111,100,101,32,102,105,108,101,115,46,10, + 32,32,32,32,32,32,32,32,78,114,5,0,0,0,41,3, + 114,118,0,0,0,114,44,0,0,0,114,26,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,225, + 0,0,0,65,3,0,0,115,4,0,0,0,4,128,255,128, + 122,21,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, + 0,0,0,0,5,0,0,0,10,0,0,0,67,0,0,0, + 115,70,0,0,0,124,0,160,0,124,1,161,1,125,2,122, + 20,124,0,160,1,124,2,161,1,125,3,87,0,116,4,124, + 3,131,1,83,0,4,0,116,2,121,68,1,0,125,4,1, + 0,122,14,116,3,100,1,124,1,100,2,141,2,124,4,130, + 2,100,3,125,4,126,4,48,0,48,0,41,4,122,52,67, + 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99, + 116,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, + 99,101,46,122,39,115,111,117,114,99,101,32,110,111,116,32, + 97,118,97,105,108,97,98,108,101,32,116,104,114,111,117,103, + 104,32,103,101,116,95,100,97,116,97,40,41,114,115,0,0, + 0,78,41,5,114,179,0,0,0,218,8,103,101,116,95,100, + 97,116,97,114,50,0,0,0,114,117,0,0,0,114,176,0, + 0,0,41,5,114,118,0,0,0,114,139,0,0,0,114,44, + 0,0,0,114,174,0,0,0,218,3,101,120,99,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,10,103,101, + 116,95,115,111,117,114,99,101,72,3,0,0,115,24,0,0, + 0,10,2,2,1,12,1,8,4,14,253,4,1,2,1,4, + 255,2,1,2,255,10,128,255,128,122,23,83,111,117,114,99, + 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, + 99,101,114,104,0,0,0,41,1,218,9,95,111,112,116,105, + 109,105,122,101,99,3,0,0,0,0,0,0,0,1,0,0, + 0,4,0,0,0,8,0,0,0,67,0,0,0,115,22,0, + 0,0,116,0,106,1,116,2,124,1,124,2,100,1,100,2, + 124,3,100,3,141,6,83,0,41,5,122,130,82,101,116,117, + 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101, + 99,116,32,99,111,109,112,105,108,101,100,32,102,114,111,109, + 32,115,111,117,114,99,101,46,10,10,32,32,32,32,32,32, + 32,32,84,104,101,32,39,100,97,116,97,39,32,97,114,103, + 117,109,101,110,116,32,99,97,110,32,98,101,32,97,110,121, + 32,111,98,106,101,99,116,32,116,121,112,101,32,116,104,97, + 116,32,99,111,109,112,105,108,101,40,41,32,115,117,112,112, + 111,114,116,115,46,10,32,32,32,32,32,32,32,32,114,215, + 0,0,0,84,41,2,218,12,100,111,110,116,95,105,110,104, + 101,114,105,116,114,83,0,0,0,78,41,3,114,134,0,0, + 0,114,214,0,0,0,218,7,99,111,109,112,105,108,101,41, + 4,114,118,0,0,0,114,26,0,0,0,114,44,0,0,0, + 114,230,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,14,115,111,117,114,99,101,95,116,111,95, + 99,111,100,101,82,3,0,0,115,8,0,0,0,12,5,4, + 1,6,255,255,128,122,27,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,0,0,0,0,15, + 0,0,0,9,0,0,0,67,0,0,0,115,28,2,0,0, + 124,0,160,0,124,1,161,1,125,2,100,1,125,3,100,1, + 125,4,100,1,125,5,100,2,125,6,100,3,125,7,122,12, + 116,1,124,2,131,1,125,8,87,0,110,24,4,0,116,2, + 121,66,1,0,1,0,1,0,100,1,125,8,89,0,144,1, + 110,42,48,0,122,14,124,0,160,3,124,2,161,1,125,9, + 87,0,110,20,4,0,116,4,121,102,1,0,1,0,1,0, + 89,0,144,1,110,6,48,0,116,5,124,9,100,4,25,0, + 131,1,125,3,122,14,124,0,160,6,124,8,161,1,125,10, + 87,0,110,18,4,0,116,4,121,148,1,0,1,0,1,0, + 89,0,110,216,48,0,124,1,124,8,100,5,156,2,125,11, + 122,148,116,7,124,10,124,1,124,11,131,3,125,12,116,8, + 124,10,131,1,100,6,100,1,133,2,25,0,125,13,124,12, + 100,7,64,0,100,8,107,3,125,6,124,6,144,1,114,30, + 124,12,100,9,64,0,100,8,107,3,125,7,116,9,106,10, + 100,10,107,3,144,1,114,50,124,7,115,248,116,9,106,10, + 100,11,107,2,144,1,114,50,124,0,160,6,124,2,161,1, + 125,4,116,9,160,11,116,12,124,4,161,2,125,5,116,13, + 124,10,124,5,124,1,124,11,131,4,1,0,110,20,116,14, + 124,10,124,3,124,9,100,12,25,0,124,1,124,11,131,5, + 1,0,87,0,110,24,4,0,116,15,116,16,102,2,144,1, + 121,76,1,0,1,0,1,0,89,0,110,32,48,0,116,17, + 160,18,100,13,124,8,124,2,161,3,1,0,116,19,124,13, + 124,1,124,8,124,2,100,14,141,4,83,0,124,4,100,1, + 117,0,144,1,114,128,124,0,160,6,124,2,161,1,125,4, + 124,0,160,20,124,4,124,2,161,2,125,14,116,17,160,18, + 100,15,124,2,161,2,1,0,116,21,106,22,144,2,115,24, + 124,8,100,1,117,1,144,2,114,24,124,3,100,1,117,1, + 144,2,114,24,124,6,144,1,114,220,124,5,100,1,117,0, + 144,1,114,206,116,9,160,11,124,4,161,1,125,5,116,23, + 124,14,124,5,124,7,131,3,125,10,110,16,116,24,124,14, + 124,3,116,25,124,4,131,1,131,3,125,10,122,20,124,0, + 160,26,124,2,124,8,124,10,161,3,1,0,87,0,124,14, + 83,0,4,0,116,2,144,2,121,22,1,0,1,0,1,0, + 89,0,124,14,83,0,48,0,124,14,83,0,41,16,122,190, + 67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,101, + 110,116,97,116,105,111,110,32,111,102,32,73,110,115,112,101, + 99,116,76,111,97,100,101,114,46,103,101,116,95,99,111,100, + 101,46,10,10,32,32,32,32,32,32,32,32,82,101,97,100, + 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32, + 114,101,113,117,105,114,101,115,32,112,97,116,104,95,115,116, + 97,116,115,32,116,111,32,98,101,32,105,109,112,108,101,109, + 101,110,116,101,100,46,32,84,111,32,119,114,105,116,101,10, + 32,32,32,32,32,32,32,32,98,121,116,101,99,111,100,101, + 44,32,115,101,116,95,100,97,116,97,32,109,117,115,116,32, + 97,108,115,111,32,98,101,32,105,109,112,108,101,109,101,110, + 116,101,100,46,10,10,32,32,32,32,32,32,32,32,78,70, + 84,114,169,0,0,0,114,159,0,0,0,114,145,0,0,0, + 114,39,0,0,0,114,73,0,0,0,114,28,0,0,0,90, + 5,110,101,118,101,114,90,6,97,108,119,97,121,115,218,4, + 115,105,122,101,122,13,123,125,32,109,97,116,99,104,101,115, + 32,123,125,41,3,114,116,0,0,0,114,106,0,0,0,114, + 107,0,0,0,122,19,99,111,100,101,32,111,98,106,101,99, + 116,32,102,114,111,109,32,123,125,41,27,114,179,0,0,0, + 114,97,0,0,0,114,82,0,0,0,114,224,0,0,0,114, + 50,0,0,0,114,18,0,0,0,114,227,0,0,0,114,152, + 0,0,0,218,10,109,101,109,111,114,121,118,105,101,119,114, + 163,0,0,0,90,21,99,104,101,99,107,95,104,97,115,104, + 95,98,97,115,101,100,95,112,121,99,115,114,157,0,0,0, + 218,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, + 66,69,82,114,158,0,0,0,114,156,0,0,0,114,117,0, + 0,0,114,150,0,0,0,114,134,0,0,0,114,149,0,0, + 0,114,165,0,0,0,114,233,0,0,0,114,1,0,0,0, + 218,19,100,111,110,116,95,119,114,105,116,101,95,98,121,116, + 101,99,111,100,101,114,171,0,0,0,114,170,0,0,0,114, + 23,0,0,0,114,226,0,0,0,41,15,114,118,0,0,0, + 114,139,0,0,0,114,107,0,0,0,114,154,0,0,0,114, + 174,0,0,0,114,157,0,0,0,90,10,104,97,115,104,95, + 98,97,115,101,100,90,12,99,104,101,99,107,95,115,111,117, + 114,99,101,114,106,0,0,0,218,2,115,116,114,26,0,0, + 0,114,151,0,0,0,114,2,0,0,0,90,10,98,121,116, + 101,115,95,100,97,116,97,90,11,99,111,100,101,95,111,98, + 106,101,99,116,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,213,0,0,0,90,3,0,0,115,160,0,0, + 0,10,7,4,1,4,1,4,1,4,1,4,1,2,1,12, + 1,12,1,12,1,2,2,14,1,12,1,8,1,12,2,2, + 1,14,1,12,1,6,1,2,3,2,1,6,254,2,4,12, + 1,16,1,12,1,6,1,12,1,12,1,2,1,2,255,8, + 2,4,254,10,3,4,1,2,1,2,1,4,254,8,4,2, + 1,6,255,2,3,2,1,2,1,6,1,2,1,2,1,8, + 251,18,7,6,1,8,2,2,1,4,255,6,2,2,1,2, + 1,6,254,10,3,10,1,12,1,12,1,18,1,6,1,4, + 255,6,2,10,1,10,1,14,1,6,2,6,1,4,255,2, + 2,16,1,4,3,14,254,2,1,4,1,2,255,4,1,255, + 128,122,21,83,111,117,114,99,101,76,111,97,100,101,114,46, + 103,101,116,95,99,111,100,101,78,41,10,114,125,0,0,0, + 114,124,0,0,0,114,126,0,0,0,114,223,0,0,0,114, + 224,0,0,0,114,226,0,0,0,114,225,0,0,0,114,229, + 0,0,0,114,233,0,0,0,114,213,0,0,0,114,5,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,229,0,0,0,34,4,0,0,115,4,0,0,0,4, - 2,255,128,122,31,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,41,6,114,125,0,0,0,114,124,0,0, - 0,114,126,0,0,0,114,127,0,0,0,114,213,0,0,0, - 114,229,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,5,1,0,0,14,4, - 0,0,115,10,0,0,0,8,0,4,2,8,2,12,16,255, - 128,114,5,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, + 0,114,221,0,0,0,31,3,0,0,115,18,0,0,0,8, + 0,8,2,8,8,8,14,8,10,8,7,14,10,12,8,255, + 128,114,221,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,115, 92,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, - 100,10,100,11,132,0,90,8,100,12,100,13,132,0,90,9, - 100,14,100,15,132,0,90,10,100,16,100,17,132,0,90,11, - 101,12,100,18,100,19,132,0,131,1,90,13,100,20,83,0, - 41,21,114,252,0,0,0,122,93,76,111,97,100,101,114,32, - 102,111,114,32,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,115,46,10,10,32,32,32,32,84,104,101,32, - 99,111,110,115,116,114,117,99,116,111,114,32,105,115,32,100, - 101,115,105,103,110,101,100,32,116,111,32,119,111,114,107,32, - 119,105,116,104,32,70,105,108,101,70,105,110,100,101,114,46, - 10,10,32,32,32,32,99,3,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, - 16,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, - 100,0,83,0,114,109,0,0,0,114,159,0,0,0,41,3, - 114,118,0,0,0,114,116,0,0,0,114,44,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,209, - 0,0,0,51,4,0,0,115,8,0,0,0,6,1,6,1, - 4,128,255,128,122,28,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,0,0,0,0,2, - 0,0,0,2,0,0,0,67,0,0,0,115,24,0,0,0, - 124,0,106,0,124,1,106,0,107,2,111,22,124,0,106,1, - 124,1,106,1,107,2,83,0,114,109,0,0,0,114,240,0, - 0,0,114,242,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,243,0,0,0,55,4,0,0,115, - 8,0,0,0,12,1,10,1,2,255,255,128,122,26,69,120, - 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, - 114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,0, - 124,0,106,2,131,1,65,0,83,0,114,109,0,0,0,114, - 244,0,0,0,114,246,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,247,0,0,0,59,4,0, - 0,115,4,0,0,0,20,1,255,128,122,28,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 95,95,104,97,115,104,95,95,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0, - 0,115,36,0,0,0,116,0,160,1,116,2,106,3,124,1, - 161,2,125,2,116,0,160,4,100,1,124,1,106,5,124,0, - 106,6,161,3,1,0,124,2,83,0,41,2,122,38,67,114, - 101,97,116,101,32,97,110,32,117,110,105,116,105,97,108,105, - 122,101,100,32,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,122,38,101,120,116,101,110,115,105,111,110,32, - 109,111,100,117,108,101,32,123,33,114,125,32,108,111,97,100, - 101,100,32,102,114,111,109,32,123,33,114,125,41,7,114,134, - 0,0,0,114,214,0,0,0,114,163,0,0,0,90,14,99, - 114,101,97,116,101,95,100,121,110,97,109,105,99,114,149,0, - 0,0,114,116,0,0,0,114,44,0,0,0,41,3,114,118, - 0,0,0,114,187,0,0,0,114,216,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,212,0,0, - 0,62,4,0,0,115,16,0,0,0,4,2,6,1,4,255, - 6,2,8,1,4,255,4,2,255,128,122,33,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,0, - 0,0,67,0,0,0,115,36,0,0,0,116,0,160,1,116, - 2,106,3,124,1,161,2,1,0,116,0,160,4,100,1,124, - 0,106,5,124,0,106,6,161,3,1,0,100,2,83,0,41, - 3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,110, - 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,100, - 117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,101, - 100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,134, - 0,0,0,114,214,0,0,0,114,163,0,0,0,90,12,101, - 120,101,99,95,100,121,110,97,109,105,99,114,149,0,0,0, - 114,116,0,0,0,114,44,0,0,0,169,2,114,118,0,0, - 0,114,216,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,217,0,0,0,70,4,0,0,115,12, - 0,0,0,14,2,6,1,8,1,4,255,4,128,255,128,122, - 31,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, - 97,100,101,114,46,101,120,101,99,95,109,111,100,117,108,101, + 100,6,100,7,132,0,90,6,101,7,135,0,102,1,100,8, + 100,9,132,8,131,1,90,8,101,7,100,10,100,11,132,0, + 131,1,90,9,100,12,100,13,132,0,90,10,101,7,100,14, + 100,15,132,0,131,1,90,11,135,0,4,0,90,12,83,0, + 41,16,218,10,70,105,108,101,76,111,97,100,101,114,122,103, + 66,97,115,101,32,102,105,108,101,32,108,111,97,100,101,114, + 32,99,108,97,115,115,32,119,104,105,99,104,32,105,109,112, + 108,101,109,101,110,116,115,32,116,104,101,32,108,111,97,100, + 101,114,32,112,114,111,116,111,99,111,108,32,109,101,116,104, + 111,100,115,32,116,104,97,116,10,32,32,32,32,114,101,113, + 117,105,114,101,32,102,105,108,101,32,115,121,115,116,101,109, + 32,117,115,97,103,101,46,99,3,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,2,0,0,0,67,0,0,0, + 115,16,0,0,0,124,1,124,0,95,0,124,2,124,0,95, + 1,100,1,83,0,41,2,122,75,67,97,99,104,101,32,116, + 104,101,32,109,111,100,117,108,101,32,110,97,109,101,32,97, + 110,100,32,116,104,101,32,112,97,116,104,32,116,111,32,116, + 104,101,32,102,105,108,101,32,102,111,117,110,100,32,98,121, + 32,116,104,101,10,32,32,32,32,32,32,32,32,102,105,110, + 100,101,114,46,78,114,159,0,0,0,41,3,114,118,0,0, + 0,114,139,0,0,0,114,44,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,180, + 3,0,0,115,8,0,0,0,6,3,6,1,4,128,255,128, + 122,19,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,0,0, + 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,24, + 0,0,0,124,0,106,0,124,1,106,0,107,2,111,22,124, + 0,106,1,124,1,106,1,107,2,83,0,114,109,0,0,0, + 169,2,218,9,95,95,99,108,97,115,115,95,95,114,131,0, + 0,0,169,2,114,118,0,0,0,90,5,111,116,104,101,114, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 6,95,95,101,113,95,95,186,3,0,0,115,8,0,0,0, + 12,1,10,1,2,255,255,128,122,17,70,105,108,101,76,111, + 97,100,101,114,46,95,95,101,113,95,95,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,20,0,0,0,116,0,124,0,106,1,131, + 1,116,0,124,0,106,2,131,1,65,0,83,0,114,109,0, + 0,0,169,3,218,4,104,97,115,104,114,116,0,0,0,114, + 44,0,0,0,169,1,114,118,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,8,95,95,104,97, + 115,104,95,95,190,3,0,0,115,4,0,0,0,20,1,255, + 128,122,19,70,105,108,101,76,111,97,100,101,114,46,95,95, + 104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,115, + 16,0,0,0,116,0,116,1,124,0,131,2,160,2,124,1, + 161,1,83,0,41,2,122,100,76,111,97,100,32,97,32,109, + 111,100,117,108,101,32,102,114,111,109,32,97,32,102,105,108, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99, + 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,32,32,32,32,78,41,3,218, + 5,115,117,112,101,114,114,239,0,0,0,114,220,0,0,0, + 114,219,0,0,0,169,1,114,241,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,220,0,0,0,193,3,0,0,115, + 4,0,0,0,16,10,255,128,122,22,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,0,0,0,0,2,0,0, - 0,4,0,0,0,3,0,0,0,115,36,0,0,0,116,0, - 124,0,106,1,131,1,100,1,25,0,137,0,116,2,135,0, - 102,1,100,2,100,3,132,8,116,3,68,0,131,1,131,1, - 83,0,41,4,122,49,82,101,116,117,114,110,32,84,114,117, - 101,32,105,102,32,116,104,101,32,101,120,116,101,110,115,105, - 111,110,32,109,111,100,117,108,101,32,105,115,32,97,32,112, - 97,99,107,97,103,101,46,114,39,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,51,0,0,0,115,26,0,0,0,124,0,93,18,125,1, - 136,0,100,0,124,1,23,0,107,2,86,0,1,0,113,2, - 100,1,83,0,41,2,114,209,0,0,0,78,114,5,0,0, - 0,169,2,114,32,0,0,0,218,6,115,117,102,102,105,120, - 169,1,90,9,102,105,108,101,95,110,97,109,101,114,5,0, - 0,0,114,8,0,0,0,218,9,60,103,101,110,101,120,112, - 114,62,79,4,0,0,115,10,0,0,0,4,0,2,1,16, - 255,4,128,255,128,122,49,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,111,99,97,108,115,62,46,60, - 103,101,110,101,120,112,114,62,41,4,114,47,0,0,0,114, - 44,0,0,0,218,3,97,110,121,218,18,69,88,84,69,78, - 83,73,79,78,95,83,85,70,70,73,88,69,83,114,219,0, - 0,0,114,5,0,0,0,114,9,1,0,0,114,8,0,0, - 0,114,182,0,0,0,76,4,0,0,115,10,0,0,0,14, - 2,12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,63,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,97,110, - 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,32,99,97,110,110,111,116,32,99,114,101,97,116,101,32, - 97,32,99,111,100,101,32,111,98,106,101,99,116,46,78,114, + 0,1,0,0,0,67,0,0,0,115,6,0,0,0,124,0, + 106,0,83,0,169,2,122,58,82,101,116,117,114,110,32,116, + 104,101,32,112,97,116,104,32,116,111,32,116,104,101,32,115, + 111,117,114,99,101,32,102,105,108,101,32,97,115,32,102,111, + 117,110,100,32,98,121,32,116,104,101,32,102,105,110,100,101, + 114,46,78,114,48,0,0,0,114,219,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,179,0,0, + 0,205,3,0,0,115,4,0,0,0,6,3,255,128,122,23, + 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, + 0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,0, + 115,128,0,0,0,116,0,124,0,116,1,116,2,102,2,131, + 2,114,72,116,3,160,4,116,5,124,1,131,1,161,1,143, + 24,125,2,124,2,160,6,161,0,87,0,2,0,100,1,4, + 0,4,0,131,3,1,0,83,0,49,0,115,58,48,0,1, + 0,1,0,1,0,89,0,1,0,100,1,83,0,116,3,160, + 7,124,1,100,2,161,2,143,24,125,2,124,2,160,6,161, + 0,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, + 0,49,0,115,114,48,0,1,0,1,0,1,0,89,0,1, + 0,100,1,83,0,41,3,122,39,82,101,116,117,114,110,32, + 116,104,101,32,100,97,116,97,32,102,114,111,109,32,112,97, + 116,104,32,97,115,32,114,97,119,32,98,121,116,101,115,46, + 78,218,1,114,41,8,114,161,0,0,0,114,221,0,0,0, + 218,19,69,120,116,101,110,115,105,111,110,70,105,108,101,76, + 111,97,100,101,114,114,64,0,0,0,90,9,111,112,101,110, + 95,99,111,100,101,114,84,0,0,0,90,4,114,101,97,100, + 114,65,0,0,0,41,3,114,118,0,0,0,114,44,0,0, + 0,114,68,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,227,0,0,0,210,3,0,0,115,16, + 0,0,0,14,2,16,1,38,1,4,128,14,2,38,1,4, + 128,255,128,122,19,70,105,108,101,76,111,97,100,101,114,46, + 103,101,116,95,100,97,116,97,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, + 0,115,20,0,0,0,100,1,100,2,108,0,109,1,125,2, + 1,0,124,2,124,0,131,1,83,0,41,3,78,114,73,0, + 0,0,41,1,218,10,70,105,108,101,82,101,97,100,101,114, + 41,2,90,17,105,109,112,111,114,116,108,105,98,46,114,101, + 97,100,101,114,115,114,253,0,0,0,41,3,114,118,0,0, + 0,114,216,0,0,0,114,253,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,19,103,101,116,95, + 114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,219, + 3,0,0,115,6,0,0,0,12,2,8,1,255,128,122,30, + 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,114, + 101,115,111,117,114,99,101,95,114,101,97,100,101,114,41,13, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 127,0,0,0,114,209,0,0,0,114,243,0,0,0,114,247, + 0,0,0,114,136,0,0,0,114,220,0,0,0,114,179,0, + 0,0,114,227,0,0,0,114,254,0,0,0,90,13,95,95, + 99,108,97,115,115,99,101,108,108,95,95,114,5,0,0,0, + 114,5,0,0,0,114,249,0,0,0,114,8,0,0,0,114, + 239,0,0,0,175,3,0,0,115,26,0,0,0,8,0,4, + 2,8,3,8,6,8,4,2,3,14,1,2,11,10,1,8, + 4,2,9,18,1,255,128,114,239,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,64,0,0,0,115,46,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, + 100,5,132,0,90,5,100,6,100,7,156,1,100,8,100,9, + 132,2,90,6,100,10,83,0,41,11,218,16,83,111,117,114, + 99,101,70,105,108,101,76,111,97,100,101,114,122,62,67,111, + 110,99,114,101,116,101,32,105,109,112,108,101,109,101,110,116, + 97,116,105,111,110,32,111,102,32,83,111,117,114,99,101,76, + 111,97,100,101,114,32,117,115,105,110,103,32,116,104,101,32, + 102,105,108,101,32,115,121,115,116,101,109,46,99,2,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, + 0,67,0,0,0,115,22,0,0,0,116,0,124,1,131,1, + 125,2,124,2,106,1,124,2,106,2,100,1,156,2,83,0, + 41,3,122,33,82,101,116,117,114,110,32,116,104,101,32,109, + 101,116,97,100,97,116,97,32,102,111,114,32,116,104,101,32, + 112,97,116,104,46,41,2,114,169,0,0,0,114,234,0,0, + 0,78,41,3,114,49,0,0,0,218,8,115,116,95,109,116, + 105,109,101,90,7,115,116,95,115,105,122,101,41,3,114,118, + 0,0,0,114,44,0,0,0,114,238,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,224,0,0, + 0,229,3,0,0,115,6,0,0,0,8,2,14,1,255,128, + 122,27,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,0,0,0,0,0,5,0,0,0,5,0, + 0,0,67,0,0,0,115,24,0,0,0,116,0,124,1,131, + 1,125,4,124,0,106,1,124,2,124,3,124,4,100,1,141, + 3,83,0,41,2,78,169,1,218,5,95,109,111,100,101,41, + 2,114,114,0,0,0,114,225,0,0,0,41,5,114,118,0, + 0,0,114,107,0,0,0,114,106,0,0,0,114,26,0,0, + 0,114,52,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,226,0,0,0,234,3,0,0,115,6, + 0,0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,60,0,0,0, + 114,1,1,0,0,99,3,0,0,0,0,0,0,0,1,0, + 0,0,9,0,0,0,11,0,0,0,67,0,0,0,115,244, + 0,0,0,116,0,124,1,131,1,92,2,125,4,125,5,103, + 0,125,6,124,4,114,52,116,1,124,4,131,1,115,52,116, + 0,124,4,131,1,92,2,125,4,125,7,124,6,160,2,124, + 7,161,1,1,0,113,16,116,3,124,6,131,1,68,0,93, + 98,125,7,116,4,124,4,124,7,131,2,125,4,122,14,116, + 5,160,6,124,4,161,1,1,0,87,0,113,60,4,0,116, + 7,121,106,1,0,1,0,1,0,89,0,113,60,4,0,116, + 8,121,158,1,0,125,8,1,0,122,30,116,9,160,10,100, + 1,124,4,124,8,161,3,1,0,87,0,89,0,100,2,125, + 8,126,8,1,0,100,2,83,0,100,2,125,8,126,8,48, + 0,48,0,122,30,116,11,124,1,124,2,124,3,131,3,1, + 0,116,9,160,10,100,3,124,1,161,2,1,0,87,0,100, + 2,83,0,4,0,116,8,121,242,1,0,125,8,1,0,122, + 28,116,9,160,10,100,1,124,1,124,8,161,3,1,0,87, + 0,89,0,100,2,125,8,126,8,100,2,83,0,100,2,125, + 8,126,8,48,0,48,0,41,4,122,27,87,114,105,116,101, + 32,98,121,116,101,115,32,100,97,116,97,32,116,111,32,97, + 32,102,105,108,101,46,122,27,99,111,117,108,100,32,110,111, + 116,32,99,114,101,97,116,101,32,123,33,114,125,58,32,123, + 33,114,125,78,122,12,99,114,101,97,116,101,100,32,123,33, + 114,125,41,12,114,47,0,0,0,114,56,0,0,0,114,186, + 0,0,0,114,42,0,0,0,114,38,0,0,0,114,4,0, + 0,0,90,5,109,107,100,105,114,218,15,70,105,108,101,69, + 120,105,115,116,115,69,114,114,111,114,114,50,0,0,0,114, + 134,0,0,0,114,149,0,0,0,114,69,0,0,0,41,9, + 114,118,0,0,0,114,44,0,0,0,114,26,0,0,0,114, + 2,1,0,0,218,6,112,97,114,101,110,116,114,96,0,0, + 0,114,37,0,0,0,114,33,0,0,0,114,228,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 225,0,0,0,239,3,0,0,115,54,0,0,0,12,2,4, + 1,12,2,12,1,12,1,12,2,10,1,2,1,14,1,12, + 1,4,2,14,1,6,3,4,1,4,255,16,2,10,128,2, + 1,12,1,14,1,4,128,14,1,8,2,2,1,8,255,20, + 128,255,128,122,25,83,111,117,114,99,101,70,105,108,101,76, + 111,97,100,101,114,46,115,101,116,95,100,97,116,97,78,41, + 7,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, + 114,127,0,0,0,114,224,0,0,0,114,226,0,0,0,114, + 225,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,255,0,0,0,225,3,0, + 0,115,12,0,0,0,8,0,4,2,8,2,8,5,18,5, + 255,128,114,255,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,64,0,0,0, + 115,32,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, + 5,100,6,83,0,41,7,218,20,83,111,117,114,99,101,108, + 101,115,115,70,105,108,101,76,111,97,100,101,114,122,45,76, + 111,97,100,101,114,32,119,104,105,99,104,32,104,97,110,100, + 108,101,115,32,115,111,117,114,99,101,108,101,115,115,32,102, + 105,108,101,32,105,109,112,111,114,116,115,46,99,2,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0, + 0,67,0,0,0,115,68,0,0,0,124,0,160,0,124,1, + 161,1,125,2,124,0,160,1,124,2,161,1,125,3,124,1, + 124,2,100,1,156,2,125,4,116,2,124,3,124,1,124,4, + 131,3,1,0,116,3,116,4,124,3,131,1,100,2,100,0, + 133,2,25,0,124,1,124,2,100,3,141,3,83,0,41,4, + 78,114,159,0,0,0,114,145,0,0,0,41,2,114,116,0, + 0,0,114,106,0,0,0,41,5,114,179,0,0,0,114,227, + 0,0,0,114,152,0,0,0,114,165,0,0,0,114,235,0, + 0,0,41,5,114,118,0,0,0,114,139,0,0,0,114,44, + 0,0,0,114,26,0,0,0,114,151,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,213,0,0, + 0,18,4,0,0,115,24,0,0,0,10,1,10,1,2,4, + 2,1,6,254,12,4,2,1,14,1,2,1,2,1,6,253, + 255,128,122,29,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,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,122,39,82,101,116,117,114,110,32,78,111, + 110,101,32,97,115,32,116,104,101,114,101,32,105,115,32,110, + 111,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114, 5,0,0,0,114,219,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,213,0,0,0,82,4,0, - 0,115,4,0,0,0,4,2,255,128,122,28,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,53,82,101, - 116,117,114,110,32,78,111,110,101,32,97,115,32,101,120,116, - 101,110,115,105,111,110,32,109,111,100,117,108,101,115,32,104, - 97,118,101,32,110,111,32,115,111,117,114,99,101,32,99,111, - 100,101,46,78,114,5,0,0,0,114,219,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,229,0, - 0,0,86,4,0,0,115,4,0,0,0,4,2,255,128,122, - 30,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,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, - 0,83,0,114,250,0,0,0,114,48,0,0,0,114,219,0, + 0,0,0,114,8,0,0,0,114,229,0,0,0,34,4,0, + 0,115,4,0,0,0,4,2,255,128,122,31,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,41,6,114,125, + 0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,0, + 0,0,114,213,0,0,0,114,229,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,5,1,0,0,14,4,0,0,115,10,0,0,0,8,0, + 4,2,8,2,12,16,255,128,114,5,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,64,0,0,0,115,92,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,100, + 8,100,9,132,0,90,7,100,10,100,11,132,0,90,8,100, + 12,100,13,132,0,90,9,100,14,100,15,132,0,90,10,100, + 16,100,17,132,0,90,11,101,12,100,18,100,19,132,0,131, + 1,90,13,100,20,83,0,41,21,114,252,0,0,0,122,93, + 76,111,97,100,101,114,32,102,111,114,32,101,120,116,101,110, + 115,105,111,110,32,109,111,100,117,108,101,115,46,10,10,32, + 32,32,32,84,104,101,32,99,111,110,115,116,114,117,99,116, + 111,114,32,105,115,32,100,101,115,105,103,110,101,100,32,116, + 111,32,119,111,114,107,32,119,105,116,104,32,70,105,108,101, + 70,105,110,100,101,114,46,10,10,32,32,32,32,99,3,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0, + 0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,95, + 0,124,2,124,0,95,1,100,0,83,0,114,109,0,0,0, + 114,159,0,0,0,41,3,114,118,0,0,0,114,116,0,0, + 0,114,44,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,209,0,0,0,51,4,0,0,115,8, + 0,0,0,6,1,6,1,4,128,255,128,122,28,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0, + 0,0,115,24,0,0,0,124,0,106,0,124,1,106,0,107, + 2,111,22,124,0,106,1,124,1,106,1,107,2,83,0,114, + 109,0,0,0,114,240,0,0,0,114,242,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,243,0, + 0,0,55,4,0,0,115,8,0,0,0,12,1,10,1,2, + 255,255,128,122,26,69,120,116,101,110,115,105,111,110,70,105, + 108,101,76,111,97,100,101,114,46,95,95,101,113,95,95,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,20,0,0,0,116,0,124, + 0,106,1,131,1,116,0,124,0,106,2,131,1,65,0,83, + 0,114,109,0,0,0,114,244,0,0,0,114,246,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 247,0,0,0,59,4,0,0,115,4,0,0,0,20,1,255, + 128,122,28,69,120,116,101,110,115,105,111,110,70,105,108,101, + 76,111,97,100,101,114,46,95,95,104,97,115,104,95,95,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 5,0,0,0,67,0,0,0,115,36,0,0,0,116,0,160, + 1,116,2,106,3,124,1,161,2,125,2,116,0,160,4,100, + 1,124,1,106,5,124,0,106,6,161,3,1,0,124,2,83, + 0,41,3,122,38,67,114,101,97,116,101,32,97,110,32,117, + 110,105,116,105,97,108,105,122,101,100,32,101,120,116,101,110, + 115,105,111,110,32,109,111,100,117,108,101,122,38,101,120,116, + 101,110,115,105,111,110,32,109,111,100,117,108,101,32,123,33, + 114,125,32,108,111,97,100,101,100,32,102,114,111,109,32,123, + 33,114,125,78,41,7,114,134,0,0,0,114,214,0,0,0, + 114,163,0,0,0,90,14,99,114,101,97,116,101,95,100,121, + 110,97,109,105,99,114,149,0,0,0,114,116,0,0,0,114, + 44,0,0,0,41,3,114,118,0,0,0,114,187,0,0,0, + 114,216,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,212,0,0,0,62,4,0,0,115,16,0, + 0,0,4,2,6,1,4,255,6,2,8,1,4,255,4,2, + 255,128,122,33,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,99,114,101,97,116,101,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,5,0,0,0,67,0,0,0,115,36, + 0,0,0,116,0,160,1,116,2,106,3,124,1,161,2,1, + 0,116,0,160,4,100,1,124,0,106,5,124,0,106,6,161, + 3,1,0,100,2,83,0,41,3,122,30,73,110,105,116,105, + 97,108,105,122,101,32,97,110,32,101,120,116,101,110,115,105, + 111,110,32,109,111,100,117,108,101,122,40,101,120,116,101,110, + 115,105,111,110,32,109,111,100,117,108,101,32,123,33,114,125, + 32,101,120,101,99,117,116,101,100,32,102,114,111,109,32,123, + 33,114,125,78,41,7,114,134,0,0,0,114,214,0,0,0, + 114,163,0,0,0,90,12,101,120,101,99,95,100,121,110,97, + 109,105,99,114,149,0,0,0,114,116,0,0,0,114,44,0, + 0,0,169,2,114,118,0,0,0,114,216,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,217,0, + 0,0,70,4,0,0,115,12,0,0,0,14,2,6,1,8, + 1,4,255,4,128,255,128,122,31,69,120,116,101,110,115,105, + 111,110,70,105,108,101,76,111,97,100,101,114,46,101,120,101, + 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,3,0,0, + 0,115,36,0,0,0,116,0,124,0,106,1,131,1,100,1, + 25,0,137,0,116,2,135,0,102,1,100,2,100,3,132,8, + 116,3,68,0,131,1,131,1,83,0,41,5,122,49,82,101, + 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101, + 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, + 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,114, + 39,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,4,0,0,0,51,0,0,0,115,26,0, + 0,0,124,0,93,18,125,1,136,0,100,0,124,1,23,0, + 107,2,86,0,1,0,113,2,100,1,83,0,41,2,114,209, + 0,0,0,78,114,5,0,0,0,169,2,114,32,0,0,0, + 218,6,115,117,102,102,105,120,169,1,90,9,102,105,108,101, + 95,110,97,109,101,114,5,0,0,0,114,8,0,0,0,218, + 9,60,103,101,110,101,120,112,114,62,79,4,0,0,115,10, + 0,0,0,4,0,2,1,16,255,4,128,255,128,122,49,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, + 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62, + 78,41,4,114,47,0,0,0,114,44,0,0,0,218,3,97, + 110,121,218,18,69,88,84,69,78,83,73,79,78,95,83,85, + 70,70,73,88,69,83,114,219,0,0,0,114,5,0,0,0, + 114,9,1,0,0,114,8,0,0,0,114,182,0,0,0,76, + 4,0,0,115,10,0,0,0,14,2,12,1,2,1,8,255, + 255,128,122,30,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,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,41,2,122,63,82,101,116,117,114,110,32,78, + 111,110,101,32,97,115,32,97,110,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,32,99,97,110,110,111, + 116,32,99,114,101,97,116,101,32,97,32,99,111,100,101,32, + 111,98,106,101,99,116,46,78,114,5,0,0,0,114,219,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,179,0,0,0,90,4,0,0,115,4,0,0,0,6, - 3,255,128,122,32,69,120,116,101,110,115,105,111,110,70,105, - 108,101,76,111,97,100,101,114,46,103,101,116,95,102,105,108, - 101,110,97,109,101,78,41,14,114,125,0,0,0,114,124,0, - 0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,0, - 0,114,243,0,0,0,114,247,0,0,0,114,212,0,0,0, - 114,217,0,0,0,114,182,0,0,0,114,213,0,0,0,114, - 229,0,0,0,114,136,0,0,0,114,179,0,0,0,114,5, + 0,114,213,0,0,0,82,4,0,0,115,4,0,0,0,4, + 2,255,128,122,28,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,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,122,53,82,101,116,117,114,110,32,78,111, + 110,101,32,97,115,32,101,120,116,101,110,115,105,111,110,32, + 109,111,100,117,108,101,115,32,104,97,118,101,32,110,111,32, + 115,111,117,114,99,101,32,99,111,100,101,46,78,114,5,0, + 0,0,114,219,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,229,0,0,0,86,4,0,0,115, + 4,0,0,0,4,2,255,128,122,30,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,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,6,0,0,0,124,0,106,0,83,0,114,250,0,0, + 0,114,48,0,0,0,114,219,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,179,0,0,0,90, + 4,0,0,115,4,0,0,0,6,3,255,128,122,32,69,120, + 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, + 114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,41, + 14,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, + 114,127,0,0,0,114,209,0,0,0,114,243,0,0,0,114, + 247,0,0,0,114,212,0,0,0,114,217,0,0,0,114,182, + 0,0,0,114,213,0,0,0,114,229,0,0,0,114,136,0, + 0,0,114,179,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,252,0,0,0, + 43,4,0,0,115,26,0,0,0,8,0,4,2,8,6,8, + 4,8,4,8,3,8,8,8,6,8,6,8,4,2,4,14, + 1,255,128,114,252,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, + 0,115,104,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, + 90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0, + 90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,0, + 90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,0, + 90,11,100,18,100,19,132,0,90,12,100,20,100,21,132,0, + 90,13,100,22,100,23,132,0,90,14,100,24,83,0,41,25, + 218,14,95,78,97,109,101,115,112,97,99,101,80,97,116,104, + 97,38,1,0,0,82,101,112,114,101,115,101,110,116,115,32, + 97,32,110,97,109,101,115,112,97,99,101,32,112,97,99,107, + 97,103,101,39,115,32,112,97,116,104,46,32,32,73,116,32, + 117,115,101,115,32,116,104,101,32,109,111,100,117,108,101,32, + 110,97,109,101,10,32,32,32,32,116,111,32,102,105,110,100, + 32,105,116,115,32,112,97,114,101,110,116,32,109,111,100,117, + 108,101,44,32,97,110,100,32,102,114,111,109,32,116,104,101, + 114,101,32,105,116,32,108,111,111,107,115,32,117,112,32,116, + 104,101,32,112,97,114,101,110,116,39,115,10,32,32,32,32, + 95,95,112,97,116,104,95,95,46,32,32,87,104,101,110,32, + 116,104,105,115,32,99,104,97,110,103,101,115,44,32,116,104, + 101,32,109,111,100,117,108,101,39,115,32,111,119,110,32,112, + 97,116,104,32,105,115,32,114,101,99,111,109,112,117,116,101, + 100,44,10,32,32,32,32,117,115,105,110,103,32,112,97,116, + 104,95,102,105,110,100,101,114,46,32,32,70,111,114,32,116, + 111,112,45,108,101,118,101,108,32,109,111,100,117,108,101,115, + 44,32,116,104,101,32,112,97,114,101,110,116,32,109,111,100, + 117,108,101,39,115,32,112,97,116,104,10,32,32,32,32,105, + 115,32,115,121,115,46,112,97,116,104,46,99,4,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0, + 67,0,0,0,115,36,0,0,0,124,1,124,0,95,0,124, + 2,124,0,95,1,116,2,124,0,160,3,161,0,131,1,124, + 0,95,4,124,3,124,0,95,5,100,0,83,0,114,109,0, + 0,0,41,6,218,5,95,110,97,109,101,218,5,95,112,97, + 116,104,114,111,0,0,0,218,16,95,103,101,116,95,112,97, + 114,101,110,116,95,112,97,116,104,218,17,95,108,97,115,116, + 95,112,97,114,101,110,116,95,112,97,116,104,218,12,95,112, + 97,116,104,95,102,105,110,100,101,114,169,4,114,118,0,0, + 0,114,116,0,0,0,114,44,0,0,0,90,11,112,97,116, + 104,95,102,105,110,100,101,114,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,209,0,0,0,103,4,0,0, + 115,12,0,0,0,6,1,6,1,14,1,6,1,4,128,255, + 128,122,23,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,0,0,0,0,4,0,0,0,3,0,0,0,67, + 0,0,0,115,38,0,0,0,124,0,106,0,160,1,100,1, + 161,1,92,3,125,1,125,2,125,3,124,2,100,2,107,2, + 114,30,100,3,83,0,124,1,100,4,102,2,83,0,41,6, + 122,62,82,101,116,117,114,110,115,32,97,32,116,117,112,108, + 101,32,111,102,32,40,112,97,114,101,110,116,45,109,111,100, + 117,108,101,45,110,97,109,101,44,32,112,97,114,101,110,116, + 45,112,97,116,104,45,97,116,116,114,45,110,97,109,101,41, + 114,71,0,0,0,114,40,0,0,0,41,2,114,1,0,0, + 0,114,44,0,0,0,90,8,95,95,112,97,116,104,95,95, + 78,41,2,114,14,1,0,0,114,41,0,0,0,41,4,114, + 118,0,0,0,114,4,1,0,0,218,3,100,111,116,90,2, + 109,101,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,23,95,102,105,110,100,95,112,97,114,101,110,116,95, + 112,97,116,104,95,110,97,109,101,115,109,4,0,0,115,10, + 0,0,0,18,2,8,1,4,2,8,3,255,128,122,38,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,101,115,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,28, + 0,0,0,124,0,160,0,161,0,92,2,125,1,125,2,116, + 1,116,2,106,3,124,1,25,0,124,2,131,2,83,0,114, + 109,0,0,0,41,4,114,21,1,0,0,114,130,0,0,0, + 114,1,0,0,0,218,7,109,111,100,117,108,101,115,41,3, + 114,118,0,0,0,90,18,112,97,114,101,110,116,95,109,111, + 100,117,108,101,95,110,97,109,101,90,14,112,97,116,104,95, + 97,116,116,114,95,110,97,109,101,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,16,1,0,0,119,4,0, + 0,115,6,0,0,0,12,1,16,1,255,128,122,31,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,0,0,0,0,3,0,0,0,4,0, + 0,0,67,0,0,0,115,80,0,0,0,116,0,124,0,160, + 1,161,0,131,1,125,1,124,1,124,0,106,2,107,3,114, + 74,124,0,160,3,124,0,106,4,124,1,161,2,125,2,124, + 2,100,0,117,1,114,68,124,2,106,5,100,0,117,0,114, + 68,124,2,106,6,114,68,124,2,106,6,124,0,95,7,124, + 1,124,0,95,2,124,0,106,7,83,0,114,109,0,0,0, + 41,8,114,111,0,0,0,114,16,1,0,0,114,17,1,0, + 0,114,18,1,0,0,114,14,1,0,0,114,140,0,0,0, + 114,178,0,0,0,114,15,1,0,0,41,3,114,118,0,0, + 0,90,11,112,97,114,101,110,116,95,112,97,116,104,114,187, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,252,0,0,0,43,4,0,0,115,26,0,0,0, - 8,0,4,2,8,6,8,4,8,4,8,3,8,8,8,6, - 8,6,8,4,2,4,14,1,255,128,114,252,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,64,0,0,0,115,104,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, - 4,100,4,100,5,132,0,90,5,100,6,100,7,132,0,90, - 6,100,8,100,9,132,0,90,7,100,10,100,11,132,0,90, - 8,100,12,100,13,132,0,90,9,100,14,100,15,132,0,90, - 10,100,16,100,17,132,0,90,11,100,18,100,19,132,0,90, - 12,100,20,100,21,132,0,90,13,100,22,100,23,132,0,90, - 14,100,24,83,0,41,25,218,14,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,97,38,1,0,0,82,101,112,114, - 101,115,101,110,116,115,32,97,32,110,97,109,101,115,112,97, - 99,101,32,112,97,99,107,97,103,101,39,115,32,112,97,116, - 104,46,32,32,73,116,32,117,115,101,115,32,116,104,101,32, - 109,111,100,117,108,101,32,110,97,109,101,10,32,32,32,32, - 116,111,32,102,105,110,100,32,105,116,115,32,112,97,114,101, - 110,116,32,109,111,100,117,108,101,44,32,97,110,100,32,102, - 114,111,109,32,116,104,101,114,101,32,105,116,32,108,111,111, - 107,115,32,117,112,32,116,104,101,32,112,97,114,101,110,116, - 39,115,10,32,32,32,32,95,95,112,97,116,104,95,95,46, - 32,32,87,104,101,110,32,116,104,105,115,32,99,104,97,110, - 103,101,115,44,32,116,104,101,32,109,111,100,117,108,101,39, - 115,32,111,119,110,32,112,97,116,104,32,105,115,32,114,101, - 99,111,109,112,117,116,101,100,44,10,32,32,32,32,117,115, - 105,110,103,32,112,97,116,104,95,102,105,110,100,101,114,46, - 32,32,70,111,114,32,116,111,112,45,108,101,118,101,108,32, - 109,111,100,117,108,101,115,44,32,116,104,101,32,112,97,114, - 101,110,116,32,109,111,100,117,108,101,39,115,32,112,97,116, - 104,10,32,32,32,32,105,115,32,115,121,115,46,112,97,116, - 104,46,99,4,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,3,0,0,0,67,0,0,0,115,36,0,0,0, - 124,1,124,0,95,0,124,2,124,0,95,1,116,2,124,0, - 160,3,161,0,131,1,124,0,95,4,124,3,124,0,95,5, - 100,0,83,0,114,109,0,0,0,41,6,218,5,95,110,97, - 109,101,218,5,95,112,97,116,104,114,111,0,0,0,218,16, - 95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104, - 218,17,95,108,97,115,116,95,112,97,114,101,110,116,95,112, - 97,116,104,218,12,95,112,97,116,104,95,102,105,110,100,101, - 114,169,4,114,118,0,0,0,114,116,0,0,0,114,44,0, - 0,0,90,11,112,97,116,104,95,102,105,110,100,101,114,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,209, - 0,0,0,103,4,0,0,115,12,0,0,0,6,1,6,1, - 14,1,6,1,4,128,255,128,122,23,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,0,0,0,0,4,0, - 0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,124, - 0,106,0,160,1,100,1,161,1,92,3,125,1,125,2,125, - 3,124,2,100,2,107,2,114,30,100,3,83,0,124,1,100, - 4,102,2,83,0,41,5,122,62,82,101,116,117,114,110,115, - 32,97,32,116,117,112,108,101,32,111,102,32,40,112,97,114, - 101,110,116,45,109,111,100,117,108,101,45,110,97,109,101,44, - 32,112,97,114,101,110,116,45,112,97,116,104,45,97,116,116, - 114,45,110,97,109,101,41,114,71,0,0,0,114,40,0,0, - 0,41,2,114,1,0,0,0,114,44,0,0,0,90,8,95, - 95,112,97,116,104,95,95,41,2,114,14,1,0,0,114,41, - 0,0,0,41,4,114,118,0,0,0,114,4,1,0,0,218, - 3,100,111,116,90,2,109,101,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,23,95,102,105,110,100,95,112, - 97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,115, - 109,4,0,0,115,10,0,0,0,18,2,8,1,4,2,8, - 3,255,128,122,38,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,101,115,99,1,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,28,0,0,0,124,0,160,0,161,0,92, - 2,125,1,125,2,116,1,116,2,106,3,124,1,25,0,124, - 2,131,2,83,0,114,109,0,0,0,41,4,114,21,1,0, - 0,114,130,0,0,0,114,1,0,0,0,218,7,109,111,100, - 117,108,101,115,41,3,114,118,0,0,0,90,18,112,97,114, - 101,110,116,95,109,111,100,117,108,101,95,110,97,109,101,90, - 14,112,97,116,104,95,97,116,116,114,95,110,97,109,101,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,16, - 1,0,0,119,4,0,0,115,6,0,0,0,12,1,16,1, - 255,128,122,31,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,0,0,0,0, - 3,0,0,0,4,0,0,0,67,0,0,0,115,80,0,0, - 0,116,0,124,0,160,1,161,0,131,1,125,1,124,1,124, - 0,106,2,107,3,114,74,124,0,160,3,124,0,106,4,124, - 1,161,2,125,2,124,2,100,0,117,1,114,68,124,2,106, - 5,100,0,117,0,114,68,124,2,106,6,114,68,124,2,106, - 6,124,0,95,7,124,1,124,0,95,2,124,0,106,7,83, - 0,114,109,0,0,0,41,8,114,111,0,0,0,114,16,1, - 0,0,114,17,1,0,0,114,18,1,0,0,114,14,1,0, - 0,114,140,0,0,0,114,178,0,0,0,114,15,1,0,0, - 41,3,114,118,0,0,0,90,11,112,97,114,101,110,116,95, - 112,97,116,104,114,187,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,12,95,114,101,99,97,108, - 99,117,108,97,116,101,123,4,0,0,115,18,0,0,0,12, - 2,10,1,14,1,18,3,6,1,8,1,6,1,6,1,255, - 128,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,114,101,99,97,108,99,117,108,97,116,101,99,1, + 0,0,218,12,95,114,101,99,97,108,99,117,108,97,116,101, + 123,4,0,0,115,18,0,0,0,12,2,10,1,14,1,18, + 3,6,1,8,1,6,1,6,1,255,128,122,27,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,95,114,101,99, + 97,108,99,117,108,97,116,101,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,12,0,0,0,116,0,124,0,160,1,161,0,131,1, + 83,0,114,109,0,0,0,41,2,218,4,105,116,101,114,114, + 23,1,0,0,114,246,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,8,95,95,105,116,101,114, + 95,95,136,4,0,0,115,4,0,0,0,12,1,255,128,122, + 23,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,95,105,116,101,114,95,95,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,115,12,0,0,0,124,0,160,0,161,0,124,1,25,0, + 83,0,114,109,0,0,0,169,1,114,23,1,0,0,41,2, + 114,118,0,0,0,218,5,105,110,100,101,120,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,11,95,95,103, + 101,116,105,116,101,109,95,95,139,4,0,0,115,4,0,0, + 0,12,1,255,128,122,26,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,95,103,101,116,105,116,101,109,95, + 95,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,3,0,0,0,67,0,0,0,115,14,0,0,0,124, + 2,124,0,106,0,124,1,60,0,100,0,83,0,114,109,0, + 0,0,41,1,114,15,1,0,0,41,3,114,118,0,0,0, + 114,27,1,0,0,114,44,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,11,95,95,115,101,116, + 105,116,101,109,95,95,142,4,0,0,115,6,0,0,0,10, + 1,4,128,255,128,122,26,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,95,115,101,116,105,116,101,109,95, + 95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,124,0,160,1,161,0,131,1,83,0,114,109,0,0,0, + 41,2,114,23,0,0,0,114,23,1,0,0,114,246,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,7,95,95,108,101,110,95,95,145,4,0,0,115,4,0, + 0,0,12,1,255,128,122,22,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,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,12,0,0,0,116,0,124,0, - 160,1,161,0,131,1,83,0,114,109,0,0,0,41,2,218, - 4,105,116,101,114,114,23,1,0,0,114,246,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,8, - 95,95,105,116,101,114,95,95,136,4,0,0,115,4,0,0, - 0,12,1,255,128,122,23,95,78,97,109,101,115,112,97,99, - 101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, - 0,0,0,67,0,0,0,115,12,0,0,0,124,0,160,0, - 161,0,124,1,25,0,83,0,114,109,0,0,0,169,1,114, - 23,1,0,0,41,2,114,118,0,0,0,218,5,105,110,100, - 101,120,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,11,95,95,103,101,116,105,116,101,109,95,95,139,4, - 0,0,115,4,0,0,0,12,1,255,128,122,26,95,78,97, - 109,101,115,112,97,99,101,80,97,116,104,46,95,95,103,101, - 116,105,116,101,109,95,95,99,3,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, - 115,14,0,0,0,124,2,124,0,106,0,124,1,60,0,100, - 0,83,0,114,109,0,0,0,41,1,114,15,1,0,0,41, - 3,114,118,0,0,0,114,27,1,0,0,114,44,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 11,95,95,115,101,116,105,116,101,109,95,95,142,4,0,0, - 115,6,0,0,0,10,1,4,128,255,128,122,26,95,78,97, - 109,101,115,112,97,99,101,80,97,116,104,46,95,95,115,101, - 116,105,116,101,109,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,116,0,124,0,160,1,161,0,131,1,83, - 0,114,109,0,0,0,41,2,114,23,0,0,0,114,23,1, - 0,0,114,246,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,218,7,95,95,108,101,110,95,95,145, - 4,0,0,115,4,0,0,0,12,1,255,128,122,22,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,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0, - 0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,2, - 78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,40,123,33,114,125,41,41,2,114,62,0,0,0,114,15, - 1,0,0,114,246,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,8,95,95,114,101,112,114,95, - 95,148,4,0,0,115,4,0,0,0,12,1,255,128,122,23, - 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, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,124,1,124,0,160,0,161,0,118,0,83, - 0,114,109,0,0,0,114,26,1,0,0,169,2,114,118,0, - 0,0,218,4,105,116,101,109,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,12,95,95,99,111,110,116,97, - 105,110,115,95,95,151,4,0,0,115,4,0,0,0,12,1, - 255,128,122,27,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,0,0,0,0,2,0,0,0, - 3,0,0,0,67,0,0,0,115,16,0,0,0,124,0,106, - 0,160,1,124,1,161,1,1,0,100,0,83,0,114,109,0, - 0,0,41,2,114,15,1,0,0,114,186,0,0,0,114,32, - 1,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,186,0,0,0,154,4,0,0,115,6,0,0,0, - 12,1,4,128,255,128,122,21,95,78,97,109,101,115,112,97, - 99,101,80,97,116,104,46,97,112,112,101,110,100,78,41,15, - 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, - 127,0,0,0,114,209,0,0,0,114,21,1,0,0,114,16, - 1,0,0,114,23,1,0,0,114,25,1,0,0,114,28,1, - 0,0,114,29,1,0,0,114,30,1,0,0,114,31,1,0, - 0,114,34,1,0,0,114,186,0,0,0,114,5,0,0,0, + 0,0,0,67,0,0,0,115,12,0,0,0,100,1,160,0, + 124,0,106,1,161,1,83,0,41,2,78,122,20,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,40,123,33,114,125, + 41,41,2,114,62,0,0,0,114,15,1,0,0,114,246,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,8,95,95,114,101,112,114,95,95,148,4,0,0,115, + 4,0,0,0,12,1,255,128,122,23,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,0,0,0,0,2,0, + 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,124, + 1,124,0,160,0,161,0,118,0,83,0,114,109,0,0,0, + 114,26,1,0,0,169,2,114,118,0,0,0,218,4,105,116, + 101,109,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,12,95,95,99,111,110,116,97,105,110,115,95,95,151, + 4,0,0,115,4,0,0,0,12,1,255,128,122,27,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,0,0,0,0,2,0,0,0,3,0,0,0,67,0, + 0,0,115,16,0,0,0,124,0,106,0,160,1,124,1,161, + 1,1,0,100,0,83,0,114,109,0,0,0,41,2,114,15, + 1,0,0,114,186,0,0,0,114,32,1,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,186,0,0, + 0,154,4,0,0,115,6,0,0,0,12,1,4,128,255,128, + 122,21,95,78,97,109,101,115,112,97,99,101,80,97,116,104, + 46,97,112,112,101,110,100,78,41,15,114,125,0,0,0,114, + 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,209, + 0,0,0,114,21,1,0,0,114,16,1,0,0,114,23,1, + 0,0,114,25,1,0,0,114,28,1,0,0,114,29,1,0, + 0,114,30,1,0,0,114,31,1,0,0,114,34,1,0,0, + 114,186,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,13,1,0,0,96,4, + 0,0,115,28,0,0,0,8,0,4,1,8,6,8,6,8, + 10,8,4,8,13,8,3,8,3,8,3,8,3,8,3,12, + 3,255,128,114,13,1,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, + 0,115,80,0,0,0,101,0,90,1,100,0,90,2,100,1, + 100,2,132,0,90,3,101,4,100,3,100,4,132,0,131,1, + 90,5,100,5,100,6,132,0,90,6,100,7,100,8,132,0, + 90,7,100,9,100,10,132,0,90,8,100,11,100,12,132,0, + 90,9,100,13,100,14,132,0,90,10,100,15,100,16,132,0, + 90,11,100,17,83,0,41,18,218,16,95,78,97,109,101,115, + 112,97,99,101,76,111,97,100,101,114,99,4,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, + 0,0,0,115,18,0,0,0,116,0,124,1,124,2,124,3, + 131,3,124,0,95,1,100,0,83,0,114,109,0,0,0,41, + 2,114,13,1,0,0,114,15,1,0,0,114,19,1,0,0, 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 13,1,0,0,96,4,0,0,115,28,0,0,0,8,0,4, - 1,8,6,8,6,8,10,8,4,8,13,8,3,8,3,8, - 3,8,3,8,3,12,3,255,128,114,13,1,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,64,0,0,0,115,80,0,0,0,101,0,90,1, - 100,0,90,2,100,1,100,2,132,0,90,3,101,4,100,3, - 100,4,132,0,131,1,90,5,100,5,100,6,132,0,90,6, - 100,7,100,8,132,0,90,7,100,9,100,10,132,0,90,8, - 100,11,100,12,132,0,90,9,100,13,100,14,132,0,90,10, - 100,15,100,16,132,0,90,11,100,17,83,0,41,18,218,16, - 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, - 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,18,0,0,0,116,0, - 124,1,124,2,124,3,131,3,124,0,95,1,100,0,83,0, - 114,109,0,0,0,41,2,114,13,1,0,0,114,15,1,0, - 0,114,19,1,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,209,0,0,0,160,4,0,0,115,6, - 0,0,0,14,1,4,128,255,128,122,25,95,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,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0, - 0,0,100,1,160,0,124,1,106,1,161,1,83,0,41,2, - 122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111, - 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99, - 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32, - 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32, - 32,32,32,32,32,122,25,60,109,111,100,117,108,101,32,123, - 33,114,125,32,40,110,97,109,101,115,112,97,99,101,41,62, - 41,2,114,62,0,0,0,114,125,0,0,0,41,2,114,193, - 0,0,0,114,216,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,11,109,111,100,117,108,101,95, - 114,101,112,114,163,4,0,0,115,4,0,0,0,12,7,255, - 128,122,28,95,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, + 209,0,0,0,160,4,0,0,115,6,0,0,0,14,1,4, + 128,255,128,122,25,95,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,0,0,0,0,2,0,0,0,3, + 0,0,0,67,0,0,0,115,12,0,0,0,100,1,160,0, + 124,1,106,1,161,1,83,0,41,3,122,115,82,101,116,117, + 114,110,32,114,101,112,114,32,102,111,114,32,116,104,101,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,101,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,84,104,101,32, + 105,109,112,111,114,116,32,109,97,99,104,105,110,101,114,121, + 32,100,111,101,115,32,116,104,101,32,106,111,98,32,105,116, + 115,101,108,102,46,10,10,32,32,32,32,32,32,32,32,122, + 25,60,109,111,100,117,108,101,32,123,33,114,125,32,40,110, + 97,109,101,115,112,97,99,101,41,62,78,41,2,114,62,0, + 0,0,114,125,0,0,0,41,2,114,193,0,0,0,114,216, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,11,109,111,100,117,108,101,95,114,101,112,114,163, + 4,0,0,115,4,0,0,0,12,7,255,128,122,28,95,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,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,2,78,84, + 114,5,0,0,0,114,219,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,182,0,0,0,172,4, + 0,0,115,4,0,0,0,4,1,255,128,122,27,95,78,97, + 109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,78,114,40,0, + 0,0,114,5,0,0,0,114,219,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,229,0,0,0, + 175,4,0,0,115,4,0,0,0,4,1,255,128,122,27,95, + 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, + 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67, + 0,0,0,115,16,0,0,0,116,0,100,1,100,2,100,3, + 100,4,100,5,141,4,83,0,41,6,78,114,40,0,0,0, + 122,8,60,115,116,114,105,110,103,62,114,215,0,0,0,84, + 41,1,114,231,0,0,0,41,1,114,232,0,0,0,114,219, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,114,213,0,0,0,178,4,0,0,115,4,0,0,0, + 16,1,255,128,122,25,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0, 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,78,84,114,5,0,0,0,114,219,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,182, - 0,0,0,172,4,0,0,115,4,0,0,0,4,1,255,128, - 122,27,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,78,114,40,0,0,0,114,5,0,0,0,114,219,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,229,0,0,0,175,4,0,0,115,4,0,0,0,4,1, - 255,128,122,27,95,78,97,109,101,115,112,97,99,101,76,111, - 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 6,0,0,0,67,0,0,0,115,16,0,0,0,116,0,100, - 1,100,2,100,3,100,4,100,5,141,4,83,0,41,6,78, - 114,40,0,0,0,122,8,60,115,116,114,105,110,103,62,114, - 215,0,0,0,84,41,1,114,231,0,0,0,41,1,114,232, - 0,0,0,114,219,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,213,0,0,0,178,4,0,0, - 115,4,0,0,0,16,1,255,128,122,25,95,78,97,109,101, - 115,112,97,99,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,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,114,210,0,0,0,114,5,0,0,0, - 114,211,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,212,0,0,0,181,4,0,0,115,4,0, - 0,0,4,128,255,128,122,30,95,78,97,109,101,115,112,97, - 99,101,76,111,97,100,101,114,46,99,114,101,97,116,101,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,0,83,0,114,109,0,0,0,114,5,0, - 0,0,114,6,1,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,217,0,0,0,184,4,0,0,115, - 6,0,0,0,2,1,2,128,255,128,122,28,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,101,120,101, - 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,0, - 0,115,26,0,0,0,116,0,160,1,100,1,124,0,106,2, - 161,2,1,0,116,0,160,3,124,0,124,1,161,2,83,0, - 41,2,122,98,76,111,97,100,32,97,32,110,97,109,101,115, - 112,97,99,101,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, - 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,122,38,110,97,109,101,115,112,97,99, - 101,32,109,111,100,117,108,101,32,108,111,97,100,101,100,32, - 119,105,116,104,32,112,97,116,104,32,123,33,114,125,41,4, - 114,134,0,0,0,114,149,0,0,0,114,15,1,0,0,114, - 218,0,0,0,114,219,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,220,0,0,0,187,4,0, - 0,115,10,0,0,0,6,7,4,1,4,255,12,2,255,128, - 122,28,95,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,41, - 12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,209,0,0,0,114,207,0,0,0,114,36,1,0,0,114, - 182,0,0,0,114,229,0,0,0,114,213,0,0,0,114,212, - 0,0,0,114,217,0,0,0,114,220,0,0,0,114,5,0, + 0,114,210,0,0,0,114,5,0,0,0,114,211,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 212,0,0,0,181,4,0,0,115,4,0,0,0,4,128,255, + 128,122,30,95,78,97,109,101,115,112,97,99,101,76,111,97, + 100,101,114,46,99,114,101,97,116,101,95,109,111,100,117,108, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 0,83,0,114,109,0,0,0,114,5,0,0,0,114,6,1, 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,35,1,0,0,159,4,0,0,115,22,0,0,0,8, - 0,8,1,2,3,10,1,8,8,8,3,8,3,8,3,8, - 3,12,3,255,128,114,35,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, - 0,0,0,115,118,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,101,4,100,2,100,3,132,0,131,1,90,5, - 101,4,100,4,100,5,132,0,131,1,90,6,101,4,100,6, - 100,7,132,0,131,1,90,7,101,4,100,8,100,9,132,0, - 131,1,90,8,101,4,100,19,100,11,100,12,132,1,131,1, - 90,9,101,4,100,20,100,13,100,14,132,1,131,1,90,10, - 101,4,100,21,100,15,100,16,132,1,131,1,90,11,101,4, - 100,17,100,18,132,0,131,1,90,12,100,10,83,0,41,22, - 218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,101, - 116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,102, - 111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,32, - 112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,95, - 32,97,116,116,114,105,98,117,116,101,115,46,99,1,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, - 0,67,0,0,0,115,64,0,0,0,116,0,116,1,106,2, - 160,3,161,0,131,1,68,0,93,44,92,2,125,1,125,2, - 124,2,100,1,117,0,114,40,116,1,106,2,124,1,61,0, - 113,14,116,4,124,2,100,2,131,2,114,14,124,2,160,5, - 161,0,1,0,113,14,100,1,83,0,41,3,122,125,67,97, - 108,108,32,116,104,101,32,105,110,118,97,108,105,100,97,116, - 101,95,99,97,99,104,101,115,40,41,32,109,101,116,104,111, - 100,32,111,110,32,97,108,108,32,112,97,116,104,32,101,110, - 116,114,121,32,102,105,110,100,101,114,115,10,32,32,32,32, - 32,32,32,32,115,116,111,114,101,100,32,105,110,32,115,121, - 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,115,32,40,119,104,101,114,101,32,105,109, - 112,108,101,109,101,110,116,101,100,41,46,78,218,17,105,110, - 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,41, - 6,218,4,108,105,115,116,114,1,0,0,0,218,19,112,97, + 0,114,217,0,0,0,184,4,0,0,115,6,0,0,0,2, + 1,2,128,255,128,122,28,95,78,97,109,101,115,112,97,99, + 101,76,111,97,100,101,114,46,101,120,101,99,95,109,111,100, + 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,67,0,0,0,115,26,0,0, + 0,116,0,160,1,100,1,124,0,106,2,161,2,1,0,116, + 0,160,3,124,0,124,1,161,2,83,0,41,3,122,98,76, + 111,97,100,32,97,32,110,97,109,101,115,112,97,99,101,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,122,38,110,97,109,101,115,112,97,99,101,32,109,111,100, + 117,108,101,32,108,111,97,100,101,100,32,119,105,116,104,32, + 112,97,116,104,32,123,33,114,125,78,41,4,114,134,0,0, + 0,114,149,0,0,0,114,15,1,0,0,114,218,0,0,0, + 114,219,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,220,0,0,0,187,4,0,0,115,10,0, + 0,0,6,7,4,1,4,255,12,2,255,128,122,28,95,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,41,12,114,125,0, + 0,0,114,124,0,0,0,114,126,0,0,0,114,209,0,0, + 0,114,207,0,0,0,114,36,1,0,0,114,182,0,0,0, + 114,229,0,0,0,114,213,0,0,0,114,212,0,0,0,114, + 217,0,0,0,114,220,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,35,1, + 0,0,159,4,0,0,115,22,0,0,0,8,0,8,1,2, + 3,10,1,8,8,8,3,8,3,8,3,8,3,12,3,255, + 128,114,35,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, + 118,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4, + 100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0, + 131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8, + 101,4,100,19,100,11,100,12,132,1,131,1,90,9,101,4, + 100,20,100,13,100,14,132,1,131,1,90,10,101,4,100,21, + 100,15,100,16,132,1,131,1,90,11,101,4,100,17,100,18, + 132,0,131,1,90,12,100,10,83,0,41,22,218,10,80,97, + 116,104,70,105,110,100,101,114,122,62,77,101,116,97,32,112, + 97,116,104,32,102,105,110,100,101,114,32,102,111,114,32,115, + 121,115,46,112,97,116,104,32,97,110,100,32,112,97,99,107, + 97,103,101,32,95,95,112,97,116,104,95,95,32,97,116,116, + 114,105,98,117,116,101,115,46,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, + 0,115,64,0,0,0,116,0,116,1,106,2,160,3,161,0, + 131,1,68,0,93,44,92,2,125,1,125,2,124,2,100,1, + 117,0,114,40,116,1,106,2,124,1,61,0,113,14,116,4, + 124,2,100,2,131,2,114,14,124,2,160,5,161,0,1,0, + 113,14,100,1,83,0,41,3,122,125,67,97,108,108,32,116, + 104,101,32,105,110,118,97,108,105,100,97,116,101,95,99,97, + 99,104,101,115,40,41,32,109,101,116,104,111,100,32,111,110, + 32,97,108,108,32,112,97,116,104,32,101,110,116,114,121,32, + 102,105,110,100,101,114,115,10,32,32,32,32,32,32,32,32, + 115,116,111,114,101,100,32,105,110,32,115,121,115,46,112,97, 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,218,5,105,116,101,109,115,114,128,0,0,0,114,38,1, - 0,0,41,3,114,193,0,0,0,114,116,0,0,0,218,6, - 102,105,110,100,101,114,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,38,1,0,0,205,4,0,0,115,14, - 0,0,0,22,4,8,1,10,1,10,1,10,1,4,128,255, - 128,122,28,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,0,0,0,0,3,0,0,0, - 9,0,0,0,67,0,0,0,115,76,0,0,0,116,0,106, - 1,100,1,117,1,114,28,116,0,106,1,115,28,116,2,160, - 3,100,2,116,4,161,2,1,0,116,0,106,1,68,0,93, - 36,125,2,122,14,124,2,124,1,131,1,87,0,2,0,1, - 0,83,0,4,0,116,5,121,70,1,0,1,0,1,0,89, - 0,113,34,48,0,100,1,83,0,41,3,122,46,83,101,97, - 114,99,104,32,115,121,115,46,112,97,116,104,95,104,111,111, - 107,115,32,102,111,114,32,97,32,102,105,110,100,101,114,32, - 102,111,114,32,39,112,97,116,104,39,46,78,122,23,115,121, - 115,46,112,97,116,104,95,104,111,111,107,115,32,105,115,32, - 101,109,112,116,121,41,6,114,1,0,0,0,218,10,112,97, - 116,104,95,104,111,111,107,115,114,75,0,0,0,114,76,0, - 0,0,114,138,0,0,0,114,117,0,0,0,41,3,114,193, - 0,0,0,114,44,0,0,0,90,4,104,111,111,107,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,218,11,95, - 112,97,116,104,95,104,111,111,107,115,215,4,0,0,115,18, - 0,0,0,16,3,12,1,10,1,2,1,14,1,12,1,6, - 1,4,2,255,128,122,22,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,0,0,0,0,3,0,0,0,8,0, - 0,0,67,0,0,0,115,100,0,0,0,124,1,100,1,107, - 2,114,42,122,12,116,0,160,1,161,0,125,1,87,0,110, - 20,4,0,116,2,121,40,1,0,1,0,1,0,89,0,100, - 2,83,0,48,0,122,16,116,3,106,4,124,1,25,0,125, - 2,87,0,124,2,83,0,4,0,116,5,121,98,1,0,1, - 0,1,0,124,0,160,6,124,1,161,1,125,2,124,2,116, - 3,106,4,124,1,60,0,89,0,124,2,83,0,48,0,41, - 3,122,210,71,101,116,32,116,104,101,32,102,105,110,100,101, - 114,32,102,111,114,32,116,104,101,32,112,97,116,104,32,101, - 110,116,114,121,32,102,114,111,109,32,115,121,115,46,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,116, - 104,101,32,112,97,116,104,32,101,110,116,114,121,32,105,115, - 32,110,111,116,32,105,110,32,116,104,101,32,99,97,99,104, - 101,44,32,102,105,110,100,32,116,104,101,32,97,112,112,114, - 111,112,114,105,97,116,101,32,102,105,110,100,101,114,10,32, - 32,32,32,32,32,32,32,97,110,100,32,99,97,99,104,101, - 32,105,116,46,32,73,102,32,110,111,32,102,105,110,100,101, - 114,32,105,115,32,97,118,97,105,108,97,98,108,101,44,32, - 115,116,111,114,101,32,78,111,110,101,46,10,10,32,32,32, - 32,32,32,32,32,114,40,0,0,0,78,41,7,114,4,0, - 0,0,114,55,0,0,0,218,17,70,105,108,101,78,111,116, - 70,111,117,110,100,69,114,114,111,114,114,1,0,0,0,114, - 40,1,0,0,218,8,75,101,121,69,114,114,111,114,114,44, - 1,0,0,41,3,114,193,0,0,0,114,44,0,0,0,114, - 42,1,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,20,95,112,97,116,104,95,105,109,112,111,114, - 116,101,114,95,99,97,99,104,101,228,4,0,0,115,28,0, - 0,0,8,8,2,1,12,1,12,1,8,3,2,1,12,1, - 4,4,12,253,10,1,12,1,4,1,2,255,255,128,122,31, - 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,99,97,99,104,101,99, - 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, - 4,0,0,0,67,0,0,0,115,82,0,0,0,116,0,124, - 2,100,1,131,2,114,26,124,2,160,1,124,1,161,1,92, - 2,125,3,125,4,110,14,124,2,160,2,124,1,161,1,125, - 3,103,0,125,4,124,3,100,0,117,1,114,60,116,3,160, - 4,124,1,124,3,161,2,83,0,116,3,160,5,124,1,100, - 0,161,2,125,5,124,4,124,5,95,6,124,5,83,0,41, - 2,78,114,137,0,0,0,41,7,114,128,0,0,0,114,137, - 0,0,0,114,206,0,0,0,114,134,0,0,0,114,201,0, - 0,0,114,183,0,0,0,114,178,0,0,0,41,6,114,193, - 0,0,0,114,139,0,0,0,114,42,1,0,0,114,140,0, - 0,0,114,141,0,0,0,114,187,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,16,95,108,101, - 103,97,99,121,95,103,101,116,95,115,112,101,99,250,4,0, - 0,115,20,0,0,0,10,4,16,1,10,2,4,1,8,1, - 12,1,12,1,6,1,4,1,255,128,122,27,80,97,116,104, - 70,105,110,100,101,114,46,95,108,101,103,97,99,121,95,103, - 101,116,95,115,112,101,99,78,99,4,0,0,0,0,0,0, - 0,0,0,0,0,9,0,0,0,5,0,0,0,67,0,0, - 0,115,166,0,0,0,103,0,125,4,124,2,68,0,93,134, - 125,5,116,0,124,5,116,1,116,2,102,2,131,2,115,28, - 113,8,124,0,160,3,124,5,161,1,125,6,124,6,100,1, - 117,1,114,8,116,4,124,6,100,2,131,2,114,70,124,6, - 160,5,124,1,124,3,161,2,125,7,110,12,124,0,160,6, - 124,1,124,6,161,2,125,7,124,7,100,1,117,0,114,92, - 113,8,124,7,106,7,100,1,117,1,114,110,124,7,2,0, - 1,0,83,0,124,7,106,8,125,8,124,8,100,1,117,0, - 114,132,116,9,100,3,131,1,130,1,124,4,160,10,124,8, - 161,1,1,0,113,8,116,11,160,12,124,1,100,1,161,2, - 125,7,124,4,124,7,95,8,124,7,83,0,41,4,122,63, - 70,105,110,100,32,116,104,101,32,108,111,97,100,101,114,32, - 111,114,32,110,97,109,101,115,112,97,99,101,95,112,97,116, - 104,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108, - 101,47,112,97,99,107,97,103,101,32,110,97,109,101,46,78, - 114,203,0,0,0,122,19,115,112,101,99,32,109,105,115,115, - 105,110,103,32,108,111,97,100,101,114,41,13,114,161,0,0, - 0,114,84,0,0,0,218,5,98,121,116,101,115,114,47,1, - 0,0,114,128,0,0,0,114,203,0,0,0,114,48,1,0, - 0,114,140,0,0,0,114,178,0,0,0,114,117,0,0,0, - 114,167,0,0,0,114,134,0,0,0,114,183,0,0,0,41, - 9,114,193,0,0,0,114,139,0,0,0,114,44,0,0,0, - 114,202,0,0,0,218,14,110,97,109,101,115,112,97,99,101, - 95,112,97,116,104,90,5,101,110,116,114,121,114,42,1,0, - 0,114,187,0,0,0,114,141,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,218,9,95,103,101,116, - 95,115,112,101,99,9,5,0,0,115,42,0,0,0,4,5, - 8,1,14,1,2,1,10,1,8,1,10,1,14,1,12,2, - 8,1,2,1,10,1,8,1,6,1,8,1,8,1,12,5, - 12,2,6,1,4,1,255,128,122,20,80,97,116,104,70,105, - 110,100,101,114,46,95,103,101,116,95,115,112,101,99,99,4, - 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5, - 0,0,0,67,0,0,0,115,94,0,0,0,124,2,100,1, - 117,0,114,14,116,0,106,1,125,2,124,0,160,2,124,1, - 124,2,124,3,161,3,125,4,124,4,100,1,117,0,114,40, - 100,1,83,0,124,4,106,3,100,1,117,0,114,90,124,4, - 106,4,125,5,124,5,114,86,100,1,124,4,95,5,116,6, - 124,1,124,5,124,0,106,2,131,3,124,4,95,4,124,4, - 83,0,100,1,83,0,124,4,83,0,41,2,122,141,84,114, - 121,32,116,111,32,102,105,110,100,32,97,32,115,112,101,99, - 32,102,111,114,32,39,102,117,108,108,110,97,109,101,39,32, - 111,110,32,115,121,115,46,112,97,116,104,32,111,114,32,39, - 112,97,116,104,39,46,10,10,32,32,32,32,32,32,32,32, - 84,104,101,32,115,101,97,114,99,104,32,105,115,32,98,97, - 115,101,100,32,111,110,32,115,121,115,46,112,97,116,104,95, - 104,111,111,107,115,32,97,110,100,32,115,121,115,46,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,46,10,32,32,32,32,32,32,32,32,78,41,7,114,1, - 0,0,0,114,44,0,0,0,114,51,1,0,0,114,140,0, - 0,0,114,178,0,0,0,114,181,0,0,0,114,13,1,0, - 0,41,6,114,193,0,0,0,114,139,0,0,0,114,44,0, - 0,0,114,202,0,0,0,114,187,0,0,0,114,50,1,0, + 101,115,32,40,119,104,101,114,101,32,105,109,112,108,101,109, + 101,110,116,101,100,41,46,78,218,17,105,110,118,97,108,105, + 100,97,116,101,95,99,97,99,104,101,115,41,6,218,4,108, + 105,115,116,114,1,0,0,0,218,19,112,97,116,104,95,105, + 109,112,111,114,116,101,114,95,99,97,99,104,101,218,5,105, + 116,101,109,115,114,128,0,0,0,114,38,1,0,0,41,3, + 114,193,0,0,0,114,116,0,0,0,218,6,102,105,110,100, + 101,114,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,38,1,0,0,205,4,0,0,115,14,0,0,0,22, + 4,8,1,10,1,10,1,10,1,4,128,255,128,122,28,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,0,0,0,0,3,0,0,0,9,0,0,0, + 67,0,0,0,115,76,0,0,0,116,0,106,1,100,1,117, + 1,114,28,116,0,106,1,115,28,116,2,160,3,100,2,116, + 4,161,2,1,0,116,0,106,1,68,0,93,36,125,2,122, + 14,124,2,124,1,131,1,87,0,2,0,1,0,83,0,4, + 0,116,5,121,70,1,0,1,0,1,0,89,0,113,34,48, + 0,100,1,83,0,41,3,122,46,83,101,97,114,99,104,32, + 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,102, + 111,114,32,97,32,102,105,110,100,101,114,32,102,111,114,32, + 39,112,97,116,104,39,46,78,122,23,115,121,115,46,112,97, + 116,104,95,104,111,111,107,115,32,105,115,32,101,109,112,116, + 121,41,6,114,1,0,0,0,218,10,112,97,116,104,95,104, + 111,111,107,115,114,75,0,0,0,114,76,0,0,0,114,138, + 0,0,0,114,117,0,0,0,41,3,114,193,0,0,0,114, + 44,0,0,0,90,4,104,111,111,107,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,11,95,112,97,116,104, + 95,104,111,111,107,115,215,4,0,0,115,18,0,0,0,16, + 3,12,1,10,1,2,1,14,1,12,1,6,1,4,2,255, + 128,122,22,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,0,0,0,0,3,0,0,0,8,0,0,0,67,0, + 0,0,115,100,0,0,0,124,1,100,1,107,2,114,42,122, + 12,116,0,160,1,161,0,125,1,87,0,110,20,4,0,116, + 2,121,40,1,0,1,0,1,0,89,0,100,2,83,0,48, + 0,122,16,116,3,106,4,124,1,25,0,125,2,87,0,124, + 2,83,0,4,0,116,5,121,98,1,0,1,0,1,0,124, + 0,160,6,124,1,161,1,125,2,124,2,116,3,106,4,124, + 1,60,0,89,0,124,2,83,0,48,0,41,3,122,210,71, + 101,116,32,116,104,101,32,102,105,110,100,101,114,32,102,111, + 114,32,116,104,101,32,112,97,116,104,32,101,110,116,114,121, + 32,102,114,111,109,32,115,121,115,46,112,97,116,104,95,105, + 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,10, + 32,32,32,32,32,32,32,32,73,102,32,116,104,101,32,112, + 97,116,104,32,101,110,116,114,121,32,105,115,32,110,111,116, + 32,105,110,32,116,104,101,32,99,97,99,104,101,44,32,102, + 105,110,100,32,116,104,101,32,97,112,112,114,111,112,114,105, + 97,116,101,32,102,105,110,100,101,114,10,32,32,32,32,32, + 32,32,32,97,110,100,32,99,97,99,104,101,32,105,116,46, + 32,73,102,32,110,111,32,102,105,110,100,101,114,32,105,115, + 32,97,118,97,105,108,97,98,108,101,44,32,115,116,111,114, + 101,32,78,111,110,101,46,10,10,32,32,32,32,32,32,32, + 32,114,40,0,0,0,78,41,7,114,4,0,0,0,114,55, + 0,0,0,218,17,70,105,108,101,78,111,116,70,111,117,110, + 100,69,114,114,111,114,114,1,0,0,0,114,40,1,0,0, + 218,8,75,101,121,69,114,114,111,114,114,44,1,0,0,41, + 3,114,193,0,0,0,114,44,0,0,0,114,42,1,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 20,95,112,97,116,104,95,105,109,112,111,114,116,101,114,95, + 99,97,99,104,101,228,4,0,0,115,28,0,0,0,8,8, + 2,1,12,1,12,1,8,3,2,1,12,1,4,4,12,253, + 10,1,12,1,4,1,2,255,255,128,122,31,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,99,97,99,104,101,99,3,0,0,0, + 0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0, + 67,0,0,0,115,82,0,0,0,116,0,124,2,100,1,131, + 2,114,26,124,2,160,1,124,1,161,1,92,2,125,3,125, + 4,110,14,124,2,160,2,124,1,161,1,125,3,103,0,125, + 4,124,3,100,0,117,1,114,60,116,3,160,4,124,1,124, + 3,161,2,83,0,116,3,160,5,124,1,100,0,161,2,125, + 5,124,4,124,5,95,6,124,5,83,0,41,2,78,114,137, + 0,0,0,41,7,114,128,0,0,0,114,137,0,0,0,114, + 206,0,0,0,114,134,0,0,0,114,201,0,0,0,114,183, + 0,0,0,114,178,0,0,0,41,6,114,193,0,0,0,114, + 139,0,0,0,114,42,1,0,0,114,140,0,0,0,114,141, + 0,0,0,114,187,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,16,95,108,101,103,97,99,121, + 95,103,101,116,95,115,112,101,99,250,4,0,0,115,20,0, + 0,0,10,4,16,1,10,2,4,1,8,1,12,1,12,1, + 6,1,4,1,255,128,122,27,80,97,116,104,70,105,110,100, + 101,114,46,95,108,101,103,97,99,121,95,103,101,116,95,115, + 112,101,99,78,99,4,0,0,0,0,0,0,0,0,0,0, + 0,9,0,0,0,5,0,0,0,67,0,0,0,115,166,0, + 0,0,103,0,125,4,124,2,68,0,93,134,125,5,116,0, + 124,5,116,1,116,2,102,2,131,2,115,28,113,8,124,0, + 160,3,124,5,161,1,125,6,124,6,100,1,117,1,114,8, + 116,4,124,6,100,2,131,2,114,70,124,6,160,5,124,1, + 124,3,161,2,125,7,110,12,124,0,160,6,124,1,124,6, + 161,2,125,7,124,7,100,1,117,0,114,92,113,8,124,7, + 106,7,100,1,117,1,114,110,124,7,2,0,1,0,83,0, + 124,7,106,8,125,8,124,8,100,1,117,0,114,132,116,9, + 100,3,131,1,130,1,124,4,160,10,124,8,161,1,1,0, + 113,8,116,11,160,12,124,1,100,1,161,2,125,7,124,4, + 124,7,95,8,124,7,83,0,41,4,122,63,70,105,110,100, + 32,116,104,101,32,108,111,97,100,101,114,32,111,114,32,110, + 97,109,101,115,112,97,99,101,95,112,97,116,104,32,102,111, + 114,32,116,104,105,115,32,109,111,100,117,108,101,47,112,97, + 99,107,97,103,101,32,110,97,109,101,46,78,114,203,0,0, + 0,122,19,115,112,101,99,32,109,105,115,115,105,110,103,32, + 108,111,97,100,101,114,41,13,114,161,0,0,0,114,84,0, + 0,0,218,5,98,121,116,101,115,114,47,1,0,0,114,128, + 0,0,0,114,203,0,0,0,114,48,1,0,0,114,140,0, + 0,0,114,178,0,0,0,114,117,0,0,0,114,167,0,0, + 0,114,134,0,0,0,114,183,0,0,0,41,9,114,193,0, + 0,0,114,139,0,0,0,114,44,0,0,0,114,202,0,0, + 0,218,14,110,97,109,101,115,112,97,99,101,95,112,97,116, + 104,90,5,101,110,116,114,121,114,42,1,0,0,114,187,0, + 0,0,114,141,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,9,95,103,101,116,95,115,112,101, + 99,9,5,0,0,115,42,0,0,0,4,5,8,1,14,1, + 2,1,10,1,8,1,10,1,14,1,12,2,8,1,2,1, + 10,1,8,1,6,1,8,1,8,1,12,5,12,2,6,1, + 4,1,255,128,122,20,80,97,116,104,70,105,110,100,101,114, + 46,95,103,101,116,95,115,112,101,99,99,4,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,67, + 0,0,0,115,94,0,0,0,124,2,100,1,117,0,114,14, + 116,0,106,1,125,2,124,0,160,2,124,1,124,2,124,3, + 161,3,125,4,124,4,100,1,117,0,114,40,100,1,83,0, + 124,4,106,3,100,1,117,0,114,90,124,4,106,4,125,5, + 124,5,114,86,100,1,124,4,95,5,116,6,124,1,124,5, + 124,0,106,2,131,3,124,4,95,4,124,4,83,0,100,1, + 83,0,124,4,83,0,41,2,122,141,84,114,121,32,116,111, + 32,102,105,110,100,32,97,32,115,112,101,99,32,102,111,114, + 32,39,102,117,108,108,110,97,109,101,39,32,111,110,32,115, + 121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,104, + 39,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, + 115,101,97,114,99,104,32,105,115,32,98,97,115,101,100,32, + 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107, + 115,32,97,110,100,32,115,121,115,46,112,97,116,104,95,105, + 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,32, + 32,32,32,32,32,32,32,78,41,7,114,1,0,0,0,114, + 44,0,0,0,114,51,1,0,0,114,140,0,0,0,114,178, + 0,0,0,114,181,0,0,0,114,13,1,0,0,41,6,114, + 193,0,0,0,114,139,0,0,0,114,44,0,0,0,114,202, + 0,0,0,114,187,0,0,0,114,50,1,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,203,0,0, + 0,41,5,0,0,115,28,0,0,0,8,6,6,1,14,1, + 8,1,4,1,10,1,6,1,4,1,6,3,16,1,4,1, + 4,2,4,2,255,128,122,20,80,97,116,104,70,105,110,100, + 101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, + 0,67,0,0,0,115,30,0,0,0,124,0,160,0,124,1, + 124,2,161,2,125,3,124,3,100,1,117,0,114,24,100,1, + 83,0,124,3,106,1,83,0,41,2,122,170,102,105,110,100, + 32,116,104,101,32,109,111,100,117,108,101,32,111,110,32,115, + 121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,104, + 39,32,98,97,115,101,100,32,111,110,32,115,121,115,46,112, + 97,116,104,95,104,111,111,107,115,32,97,110,100,10,32,32, + 32,32,32,32,32,32,115,121,115,46,112,97,116,104,95,105, + 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, + 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,32,32,32,32,78,114,204,0,0,0,114,205,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,203,0,0,0,41,5,0,0,115,28,0,0,0,8,6, - 6,1,14,1,8,1,4,1,10,1,6,1,4,1,6,3, - 16,1,4,1,4,2,4,2,255,128,122,20,80,97,116,104, - 70,105,110,100,101,114,46,102,105,110,100,95,115,112,101,99, - 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,30,0,0,0,124,0, - 160,0,124,1,124,2,161,2,125,3,124,3,100,1,117,0, - 114,24,100,1,83,0,124,3,106,1,83,0,41,2,122,170, - 102,105,110,100,32,116,104,101,32,109,111,100,117,108,101,32, - 111,110,32,115,121,115,46,112,97,116,104,32,111,114,32,39, - 112,97,116,104,39,32,98,97,115,101,100,32,111,110,32,115, - 121,115,46,112,97,116,104,95,104,111,111,107,115,32,97,110, - 100,10,32,32,32,32,32,32,32,32,115,121,115,46,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, - 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, - 99,97,116,101,100,46,32,32,85,115,101,32,102,105,110,100, - 95,115,112,101,99,40,41,32,105,110,115,116,101,97,100,46, - 10,10,32,32,32,32,32,32,32,32,78,114,204,0,0,0, - 114,205,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,206,0,0,0,65,5,0,0,115,10,0, - 0,0,12,8,8,1,4,1,6,1,255,128,122,22,80,97, - 116,104,70,105,110,100,101,114,46,102,105,110,100,95,109,111, - 100,117,108,101,99,1,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,4,0,0,0,79,0,0,0,115,28,0, - 0,0,100,1,100,2,108,0,109,1,125,3,1,0,124,3, - 106,2,124,1,105,0,124,2,164,1,142,1,83,0,41,3, - 97,32,1,0,0,10,32,32,32,32,32,32,32,32,70,105, - 110,100,32,100,105,115,116,114,105,98,117,116,105,111,110,115, - 46,10,10,32,32,32,32,32,32,32,32,82,101,116,117,114, - 110,32,97,110,32,105,116,101,114,97,98,108,101,32,111,102, - 32,97,108,108,32,68,105,115,116,114,105,98,117,116,105,111, - 110,32,105,110,115,116,97,110,99,101,115,32,99,97,112,97, - 98,108,101,32,111,102,10,32,32,32,32,32,32,32,32,108, - 111,97,100,105,110,103,32,116,104,101,32,109,101,116,97,100, - 97,116,97,32,102,111,114,32,112,97,99,107,97,103,101,115, - 32,109,97,116,99,104,105,110,103,32,96,96,99,111,110,116, - 101,120,116,46,110,97,109,101,96,96,10,32,32,32,32,32, - 32,32,32,40,111,114,32,97,108,108,32,110,97,109,101,115, - 32,105,102,32,96,96,78,111,110,101,96,96,32,105,110,100, - 105,99,97,116,101,100,41,32,97,108,111,110,103,32,116,104, - 101,32,112,97,116,104,115,32,105,110,32,116,104,101,32,108, - 105,115,116,10,32,32,32,32,32,32,32,32,111,102,32,100, - 105,114,101,99,116,111,114,105,101,115,32,96,96,99,111,110, - 116,101,120,116,46,112,97,116,104,96,96,46,10,32,32,32, - 32,32,32,32,32,114,73,0,0,0,41,1,218,18,77,101, - 116,97,100,97,116,97,80,97,116,104,70,105,110,100,101,114, - 41,3,90,18,105,109,112,111,114,116,108,105,98,46,109,101, - 116,97,100,97,116,97,114,52,1,0,0,218,18,102,105,110, - 100,95,100,105,115,116,114,105,98,117,116,105,111,110,115,41, - 4,114,193,0,0,0,114,119,0,0,0,114,120,0,0,0, - 114,52,1,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,53,1,0,0,78,5,0,0,115,6,0, - 0,0,12,10,16,1,255,128,122,29,80,97,116,104,70,105, - 110,100,101,114,46,102,105,110,100,95,100,105,115,116,114,105, - 98,117,116,105,111,110,115,41,1,78,41,2,78,78,41,1, - 78,41,13,114,125,0,0,0,114,124,0,0,0,114,126,0, - 0,0,114,127,0,0,0,114,207,0,0,0,114,38,1,0, - 0,114,44,1,0,0,114,47,1,0,0,114,48,1,0,0, - 114,51,1,0,0,114,203,0,0,0,114,206,0,0,0,114, - 53,1,0,0,114,5,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,37,1,0,0,201,4,0, - 0,115,38,0,0,0,8,0,4,2,2,2,10,1,2,9, - 10,1,2,12,10,1,2,21,10,1,2,14,12,1,2,31, - 12,1,2,23,12,1,2,12,14,1,255,128,114,37,1,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,64,0,0,0,115,90,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, - 0,90,4,100,4,100,5,132,0,90,5,101,6,90,7,100, - 6,100,7,132,0,90,8,100,8,100,9,132,0,90,9,100, - 19,100,11,100,12,132,1,90,10,100,13,100,14,132,0,90, - 11,101,12,100,15,100,16,132,0,131,1,90,13,100,17,100, - 18,132,0,90,14,100,10,83,0,41,20,218,10,70,105,108, - 101,70,105,110,100,101,114,122,172,70,105,108,101,45,98,97, - 115,101,100,32,102,105,110,100,101,114,46,10,10,32,32,32, - 32,73,110,116,101,114,97,99,116,105,111,110,115,32,119,105, - 116,104,32,116,104,101,32,102,105,108,101,32,115,121,115,116, - 101,109,32,97,114,101,32,99,97,99,104,101,100,32,102,111, - 114,32,112,101,114,102,111,114,109,97,110,99,101,44,32,98, - 101,105,110,103,10,32,32,32,32,114,101,102,114,101,115,104, - 101,100,32,119,104,101,110,32,116,104,101,32,100,105,114,101, - 99,116,111,114,121,32,116,104,101,32,102,105,110,100,101,114, - 32,105,115,32,104,97,110,100,108,105,110,103,32,104,97,115, - 32,98,101,101,110,32,109,111,100,105,102,105,101,100,46,10, - 10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,6,0,0,0,7,0,0,0,115,84, - 0,0,0,103,0,125,3,124,2,68,0,93,32,92,2,137, - 0,125,4,124,3,160,0,135,0,102,1,100,1,100,2,132, - 8,124,4,68,0,131,1,161,1,1,0,113,8,124,3,124, - 0,95,1,124,1,112,54,100,3,124,0,95,2,100,4,124, - 0,95,3,116,4,131,0,124,0,95,5,116,4,131,0,124, - 0,95,6,100,5,83,0,41,6,122,154,73,110,105,116,105, - 97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,112, - 97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,110, - 32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,32, - 110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,32, - 32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,97, - 105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,114, - 32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,117, - 102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,101, - 114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,110, - 105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,22, - 0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,86, - 0,1,0,113,2,100,0,83,0,114,109,0,0,0,114,5, - 0,0,0,114,7,1,0,0,169,1,114,140,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,10,1,0,0,107,5, - 0,0,115,6,0,0,0,18,0,4,128,255,128,122,38,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,114,71,0,0,0,114,104,0,0,0,78, - 41,7,114,167,0,0,0,218,8,95,108,111,97,100,101,114, - 115,114,44,0,0,0,218,11,95,112,97,116,104,95,109,116, - 105,109,101,218,3,115,101,116,218,11,95,112,97,116,104,95, - 99,97,99,104,101,218,19,95,114,101,108,97,120,101,100,95, - 112,97,116,104,95,99,97,99,104,101,41,5,114,118,0,0, - 0,114,44,0,0,0,218,14,108,111,97,100,101,114,95,100, - 101,116,97,105,108,115,90,7,108,111,97,100,101,114,115,114, - 189,0,0,0,114,5,0,0,0,114,55,1,0,0,114,8, - 0,0,0,114,209,0,0,0,101,5,0,0,115,20,0,0, - 0,4,4,12,1,26,1,6,1,10,2,6,1,8,1,8, - 1,4,128,255,128,122,19,70,105,108,101,70,105,110,100,101, - 114,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, - 0,0,0,115,10,0,0,0,100,1,124,0,95,0,100,2, - 83,0,41,3,122,31,73,110,118,97,108,105,100,97,116,101, - 32,116,104,101,32,100,105,114,101,99,116,111,114,121,32,109, - 116,105,109,101,46,114,104,0,0,0,78,41,1,114,57,1, - 0,0,114,246,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,38,1,0,0,115,5,0,0,115, - 6,0,0,0,6,2,4,128,255,128,122,28,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,0,0,0, - 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, - 0,115,42,0,0,0,124,0,160,0,124,1,161,1,125,2, - 124,2,100,1,117,0,114,26,100,1,103,0,102,2,83,0, - 124,2,106,1,124,2,106,2,112,38,103,0,102,2,83,0, - 41,2,122,197,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,44,32,111,114,32,116,104,101,32,110,97,109,101,115,112, - 97,99,101,10,32,32,32,32,32,32,32,32,112,97,99,107, - 97,103,101,32,112,111,114,116,105,111,110,115,46,32,82,101, - 116,117,114,110,115,32,40,108,111,97,100,101,114,44,32,108, - 105,115,116,45,111,102,45,112,111,114,116,105,111,110,115,41, - 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,85,115,101,32,102,105,110,100,95, - 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, - 10,32,32,32,32,32,32,32,32,78,41,3,114,203,0,0, - 0,114,140,0,0,0,114,178,0,0,0,41,3,114,118,0, - 0,0,114,139,0,0,0,114,187,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,114,137,0,0,0, - 121,5,0,0,115,10,0,0,0,10,7,8,1,8,1,16, - 1,255,128,122,22,70,105,108,101,70,105,110,100,101,114,46, - 102,105,110,100,95,108,111,97,100,101,114,99,6,0,0,0, - 0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0, - 67,0,0,0,115,26,0,0,0,124,1,124,2,124,3,131, - 2,125,6,116,0,124,2,124,3,124,6,124,4,100,1,141, - 4,83,0,41,2,78,114,177,0,0,0,41,1,114,190,0, - 0,0,41,7,114,118,0,0,0,114,188,0,0,0,114,139, - 0,0,0,114,44,0,0,0,90,4,115,109,115,108,114,202, - 0,0,0,114,140,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,51,1,0,0,133,5,0,0, - 115,10,0,0,0,10,1,8,1,2,1,6,255,255,128,122, - 20,70,105,108,101,70,105,110,100,101,114,46,95,103,101,116, - 95,115,112,101,99,78,99,3,0,0,0,0,0,0,0,0, - 0,0,0,14,0,0,0,8,0,0,0,67,0,0,0,115, - 92,1,0,0,100,1,125,3,124,1,160,0,100,2,161,1, - 100,3,25,0,125,4,122,24,116,1,124,0,106,2,112,34, - 116,3,160,4,161,0,131,1,106,5,125,5,87,0,110,22, - 4,0,116,6,121,64,1,0,1,0,1,0,100,4,125,5, - 89,0,110,2,48,0,124,5,124,0,106,7,107,3,114,90, - 124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,9, - 131,0,114,112,124,0,106,10,125,6,124,4,160,11,161,0, - 125,7,110,10,124,0,106,12,125,6,124,4,125,7,124,7, - 124,6,118,0,114,214,116,13,124,0,106,2,124,4,131,2, - 125,8,124,0,106,14,68,0,93,56,92,2,125,9,125,10, - 100,5,124,9,23,0,125,11,116,13,124,8,124,11,131,2, - 125,12,116,15,124,12,131,1,114,148,124,0,160,16,124,10, - 124,1,124,12,124,8,103,1,124,2,161,5,2,0,1,0, - 83,0,116,17,124,8,131,1,125,3,124,0,106,14,68,0, - 93,80,92,2,125,9,125,10,116,13,124,0,106,2,124,4, - 124,9,23,0,131,2,125,12,116,18,106,19,100,6,124,12, - 100,3,100,7,141,3,1,0,124,7,124,9,23,0,124,6, - 118,0,114,220,116,15,124,12,131,1,114,220,124,0,160,16, - 124,10,124,1,124,12,100,8,124,2,161,5,2,0,1,0, - 83,0,124,3,144,1,114,88,116,18,160,19,100,9,124,8, - 161,2,1,0,116,18,160,20,124,1,100,8,161,2,125,13, - 124,8,103,1,124,13,95,21,124,13,83,0,100,8,83,0, - 41,10,122,111,84,114,121,32,116,111,32,102,105,110,100,32, - 97,32,115,112,101,99,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,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 115,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115, - 112,101,99,44,32,111,114,32,78,111,110,101,32,105,102,32, - 110,111,116,32,102,111,117,110,100,46,10,32,32,32,32,32, - 32,32,32,70,114,71,0,0,0,114,28,0,0,0,114,104, - 0,0,0,114,209,0,0,0,122,9,116,114,121,105,110,103, - 32,123,125,41,1,90,9,118,101,114,98,111,115,105,116,121, - 78,122,25,112,111,115,115,105,98,108,101,32,110,97,109,101, - 115,112,97,99,101,32,102,111,114,32,123,125,41,22,114,41, - 0,0,0,114,49,0,0,0,114,44,0,0,0,114,4,0, - 0,0,114,55,0,0,0,114,0,1,0,0,114,50,0,0, - 0,114,57,1,0,0,218,11,95,102,105,108,108,95,99,97, - 99,104,101,114,9,0,0,0,114,60,1,0,0,114,105,0, - 0,0,114,59,1,0,0,114,38,0,0,0,114,56,1,0, - 0,114,54,0,0,0,114,51,1,0,0,114,56,0,0,0, - 114,134,0,0,0,114,149,0,0,0,114,183,0,0,0,114, - 178,0,0,0,41,14,114,118,0,0,0,114,139,0,0,0, - 114,202,0,0,0,90,12,105,115,95,110,97,109,101,115,112, - 97,99,101,90,11,116,97,105,108,95,109,111,100,117,108,101, - 114,169,0,0,0,90,5,99,97,99,104,101,90,12,99,97, - 99,104,101,95,109,111,100,117,108,101,90,9,98,97,115,101, - 95,112,97,116,104,114,8,1,0,0,114,188,0,0,0,90, - 13,105,110,105,116,95,102,105,108,101,110,97,109,101,90,9, - 102,117,108,108,95,112,97,116,104,114,187,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,203,0, - 0,0,138,5,0,0,115,74,0,0,0,4,5,14,1,2, - 1,24,1,12,1,10,1,10,1,8,1,6,1,6,2,6, - 1,10,1,6,2,4,1,8,2,12,1,14,1,8,1,10, - 1,8,1,24,1,8,4,14,2,16,1,16,1,12,1,8, - 1,10,1,4,1,8,255,6,2,12,1,12,1,8,1,4, - 1,4,1,255,128,122,20,70,105,108,101,70,105,110,100,101, - 114,46,102,105,110,100,95,115,112,101,99,99,1,0,0,0, - 0,0,0,0,0,0,0,0,9,0,0,0,10,0,0,0, - 67,0,0,0,115,188,0,0,0,124,0,106,0,125,1,122, - 22,116,1,160,2,124,1,112,22,116,1,160,3,161,0,161, - 1,125,2,87,0,110,28,4,0,116,4,116,5,116,6,102, - 3,121,56,1,0,1,0,1,0,103,0,125,2,89,0,110, - 2,48,0,116,7,106,8,160,9,100,1,161,1,115,82,116, - 10,124,2,131,1,124,0,95,11,110,74,116,10,131,0,125, - 3,124,2,68,0,93,56,125,4,124,4,160,12,100,2,161, - 1,92,3,125,5,125,6,125,7,124,6,114,134,100,3,160, - 13,124,5,124,7,160,14,161,0,161,2,125,8,110,4,124, - 5,125,8,124,3,160,15,124,8,161,1,1,0,113,92,124, - 3,124,0,95,11,116,7,106,8,160,9,116,16,161,1,114, - 184,100,4,100,5,132,0,124,2,68,0,131,1,124,0,95, - 17,100,6,83,0,41,7,122,68,70,105,108,108,32,116,104, - 101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110, - 116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100, - 32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104, - 105,115,32,100,105,114,101,99,116,111,114,121,46,114,0,0, - 0,0,114,71,0,0,0,114,61,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,83,0,0,0,115,20,0,0,0,104,0,124,0,93,12, - 125,1,124,1,160,0,161,0,146,2,113,4,83,0,114,5, - 0,0,0,41,1,114,105,0,0,0,41,2,114,32,0,0, - 0,90,2,102,110,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,9,60,115,101,116,99,111,109,112,62,215, - 5,0,0,115,4,0,0,0,20,0,255,128,122,41,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,115, - 101,116,99,111,109,112,62,78,41,18,114,44,0,0,0,114, - 4,0,0,0,90,7,108,105,115,116,100,105,114,114,55,0, - 0,0,114,45,1,0,0,218,15,80,101,114,109,105,115,115, - 105,111,110,69,114,114,111,114,218,18,78,111,116,65,68,105, - 114,101,99,116,111,114,121,69,114,114,111,114,114,1,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,58,1,0,0, - 114,59,1,0,0,114,100,0,0,0,114,62,0,0,0,114, - 105,0,0,0,218,3,97,100,100,114,12,0,0,0,114,60, - 1,0,0,41,9,114,118,0,0,0,114,44,0,0,0,90, - 8,99,111,110,116,101,110,116,115,90,21,108,111,119,101,114, - 95,115,117,102,102,105,120,95,99,111,110,116,101,110,116,115, - 114,33,1,0,0,114,116,0,0,0,114,20,1,0,0,114, - 8,1,0,0,90,8,110,101,119,95,110,97,109,101,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,62,1, - 0,0,186,5,0,0,115,38,0,0,0,6,2,2,1,22, - 1,18,1,10,3,12,3,12,1,6,7,8,1,16,1,4, - 1,18,1,4,2,12,1,6,1,12,1,16,1,4,128,255, - 128,122,22,70,105,108,101,70,105,110,100,101,114,46,95,102, - 105,108,108,95,99,97,99,104,101,99,1,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,3,0,0,0,7,0, - 0,0,115,18,0,0,0,135,0,135,1,102,2,100,1,100, - 2,132,8,125,2,124,2,83,0,41,3,97,20,1,0,0, - 65,32,99,108,97,115,115,32,109,101,116,104,111,100,32,119, - 104,105,99,104,32,114,101,116,117,114,110,115,32,97,32,99, - 108,111,115,117,114,101,32,116,111,32,117,115,101,32,111,110, - 32,115,121,115,46,112,97,116,104,95,104,111,111,107,10,32, - 32,32,32,32,32,32,32,119,104,105,99,104,32,119,105,108, - 108,32,114,101,116,117,114,110,32,97,110,32,105,110,115,116, - 97,110,99,101,32,117,115,105,110,103,32,116,104,101,32,115, - 112,101,99,105,102,105,101,100,32,108,111,97,100,101,114,115, - 32,97,110,100,32,116,104,101,32,112,97,116,104,10,32,32, - 32,32,32,32,32,32,99,97,108,108,101,100,32,111,110,32, - 116,104,101,32,99,108,111,115,117,114,101,46,10,10,32,32, - 32,32,32,32,32,32,73,102,32,116,104,101,32,112,97,116, - 104,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32, - 99,108,111,115,117,114,101,32,105,115,32,110,111,116,32,97, - 32,100,105,114,101,99,116,111,114,121,44,32,73,109,112,111, - 114,116,69,114,114,111,114,32,105,115,10,32,32,32,32,32, - 32,32,32,114,97,105,115,101,100,46,10,10,32,32,32,32, - 32,32,32,32,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,4,0,0,0,19,0,0,0,115,36,0, - 0,0,116,0,124,0,131,1,115,20,116,1,100,1,124,0, - 100,2,141,2,130,1,136,0,124,0,103,1,136,1,162,1, - 82,0,142,0,83,0,41,3,122,45,80,97,116,104,32,104, - 111,111,107,32,102,111,114,32,105,109,112,111,114,116,108,105, - 98,46,109,97,99,104,105,110,101,114,121,46,70,105,108,101, - 70,105,110,100,101,114,46,122,30,111,110,108,121,32,100,105, - 114,101,99,116,111,114,105,101,115,32,97,114,101,32,115,117, - 112,112,111,114,116,101,100,114,48,0,0,0,41,2,114,56, - 0,0,0,114,117,0,0,0,114,48,0,0,0,169,2,114, - 193,0,0,0,114,61,1,0,0,114,5,0,0,0,114,8, - 0,0,0,218,24,112,97,116,104,95,104,111,111,107,95,102, - 111,114,95,70,105,108,101,70,105,110,100,101,114,227,5,0, - 0,115,8,0,0,0,8,2,12,1,16,1,255,128,122,54, - 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,107,95,102,111,114,95,70,105,108,101, - 70,105,110,100,101,114,114,5,0,0,0,41,3,114,193,0, - 0,0,114,61,1,0,0,114,68,1,0,0,114,5,0,0, - 0,114,67,1,0,0,114,8,0,0,0,218,9,112,97,116, - 104,95,104,111,111,107,217,5,0,0,115,6,0,0,0,14, - 10,4,6,255,128,122,20,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,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,12,0,0,0,100,1,160,0,124,0,106, - 1,161,1,83,0,41,2,78,122,16,70,105,108,101,70,105, - 110,100,101,114,40,123,33,114,125,41,41,2,114,62,0,0, - 0,114,44,0,0,0,114,246,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,31,1,0,0,235, - 5,0,0,115,4,0,0,0,12,1,255,128,122,19,70,105, - 108,101,70,105,110,100,101,114,46,95,95,114,101,112,114,95, - 95,41,1,78,41,15,114,125,0,0,0,114,124,0,0,0, - 114,126,0,0,0,114,127,0,0,0,114,209,0,0,0,114, - 38,1,0,0,114,143,0,0,0,114,206,0,0,0,114,137, - 0,0,0,114,51,1,0,0,114,203,0,0,0,114,62,1, - 0,0,114,207,0,0,0,114,69,1,0,0,114,31,1,0, + 114,206,0,0,0,65,5,0,0,115,10,0,0,0,12,8, + 8,1,4,1,6,1,255,128,122,22,80,97,116,104,70,105, + 110,100,101,114,46,102,105,110,100,95,109,111,100,117,108,101, + 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,79,0,0,0,115,28,0,0,0,100,1, + 100,2,108,0,109,1,125,3,1,0,124,3,106,2,124,1, + 105,0,124,2,164,1,142,1,83,0,41,4,97,32,1,0, + 0,10,32,32,32,32,32,32,32,32,70,105,110,100,32,100, + 105,115,116,114,105,98,117,116,105,111,110,115,46,10,10,32, + 32,32,32,32,32,32,32,82,101,116,117,114,110,32,97,110, + 32,105,116,101,114,97,98,108,101,32,111,102,32,97,108,108, + 32,68,105,115,116,114,105,98,117,116,105,111,110,32,105,110, + 115,116,97,110,99,101,115,32,99,97,112,97,98,108,101,32, + 111,102,10,32,32,32,32,32,32,32,32,108,111,97,100,105, + 110,103,32,116,104,101,32,109,101,116,97,100,97,116,97,32, + 102,111,114,32,112,97,99,107,97,103,101,115,32,109,97,116, + 99,104,105,110,103,32,96,96,99,111,110,116,101,120,116,46, + 110,97,109,101,96,96,10,32,32,32,32,32,32,32,32,40, + 111,114,32,97,108,108,32,110,97,109,101,115,32,105,102,32, + 96,96,78,111,110,101,96,96,32,105,110,100,105,99,97,116, + 101,100,41,32,97,108,111,110,103,32,116,104,101,32,112,97, + 116,104,115,32,105,110,32,116,104,101,32,108,105,115,116,10, + 32,32,32,32,32,32,32,32,111,102,32,100,105,114,101,99, + 116,111,114,105,101,115,32,96,96,99,111,110,116,101,120,116, + 46,112,97,116,104,96,96,46,10,32,32,32,32,32,32,32, + 32,114,73,0,0,0,41,1,218,18,77,101,116,97,100,97, + 116,97,80,97,116,104,70,105,110,100,101,114,78,41,3,90, + 18,105,109,112,111,114,116,108,105,98,46,109,101,116,97,100, + 97,116,97,114,52,1,0,0,218,18,102,105,110,100,95,100, + 105,115,116,114,105,98,117,116,105,111,110,115,41,4,114,193, + 0,0,0,114,119,0,0,0,114,120,0,0,0,114,52,1, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,53,1,0,0,78,5,0,0,115,6,0,0,0,12, + 10,16,1,255,128,122,29,80,97,116,104,70,105,110,100,101, + 114,46,102,105,110,100,95,100,105,115,116,114,105,98,117,116, + 105,111,110,115,41,1,78,41,2,78,78,41,1,78,41,13, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 127,0,0,0,114,207,0,0,0,114,38,1,0,0,114,44, + 1,0,0,114,47,1,0,0,114,48,1,0,0,114,51,1, + 0,0,114,203,0,0,0,114,206,0,0,0,114,53,1,0, 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,54,1,0,0,92,5,0,0,115,26, - 0,0,0,8,0,4,2,8,7,8,14,4,4,8,2,8, - 12,10,5,8,48,2,31,10,1,12,17,255,128,114,54,1, - 0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,8,0,0,0,67,0,0,0,115,144,0,0,0, - 124,0,160,0,100,1,161,1,125,4,124,0,160,0,100,2, - 161,1,125,5,124,4,115,66,124,5,114,36,124,5,106,1, - 125,4,110,30,124,2,124,3,107,2,114,56,116,2,124,1, - 124,2,131,2,125,4,110,10,116,3,124,1,124,2,131,2, - 125,4,124,5,115,84,116,4,124,1,124,2,124,4,100,3, - 141,3,125,5,122,38,124,5,124,0,100,2,60,0,124,4, - 124,0,100,1,60,0,124,2,124,0,100,4,60,0,124,3, - 124,0,100,5,60,0,87,0,100,0,83,0,4,0,116,5, - 121,142,1,0,1,0,1,0,89,0,100,0,83,0,48,0, - 41,6,78,218,10,95,95,108,111,97,100,101,114,95,95,218, - 8,95,95,115,112,101,99,95,95,114,55,1,0,0,90,8, - 95,95,102,105,108,101,95,95,90,10,95,95,99,97,99,104, - 101,100,95,95,41,6,218,3,103,101,116,114,140,0,0,0, - 114,5,1,0,0,114,255,0,0,0,114,190,0,0,0,218, - 9,69,120,99,101,112,116,105,111,110,41,6,90,2,110,115, - 114,116,0,0,0,90,8,112,97,116,104,110,97,109,101,90, - 9,99,112,97,116,104,110,97,109,101,114,140,0,0,0,114, - 187,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,14,95,102,105,120,95,117,112,95,109,111,100, - 117,108,101,241,5,0,0,115,42,0,0,0,10,2,10,1, - 4,1,4,1,8,1,8,1,12,1,10,2,4,1,14,1, - 2,1,8,1,8,1,8,1,10,1,4,128,12,1,2,2, - 4,128,2,0,255,128,114,74,1,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,38,0,0,0,116,0,116,1,160,2,161, - 0,102,2,125,0,116,3,116,4,102,2,125,1,116,5,116, - 6,102,2,125,2,124,0,124,1,124,2,103,3,83,0,41, - 1,122,95,82,101,116,117,114,110,115,32,97,32,108,105,115, - 116,32,111,102,32,102,105,108,101,45,98,97,115,101,100,32, - 109,111,100,117,108,101,32,108,111,97,100,101,114,115,46,10, - 10,32,32,32,32,69,97,99,104,32,105,116,101,109,32,105, - 115,32,97,32,116,117,112,108,101,32,40,108,111,97,100,101, - 114,44,32,115,117,102,102,105,120,101,115,41,46,10,32,32, - 32,32,41,7,114,252,0,0,0,114,163,0,0,0,218,18, + 114,8,0,0,0,114,37,1,0,0,201,4,0,0,115,38, + 0,0,0,8,0,4,2,2,2,10,1,2,9,10,1,2, + 12,10,1,2,21,10,1,2,14,12,1,2,31,12,1,2, + 23,12,1,2,12,14,1,255,128,114,37,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,64,0,0,0,115,90,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,101,6,90,7,100,6,100,7, + 132,0,90,8,100,8,100,9,132,0,90,9,100,19,100,11, + 100,12,132,1,90,10,100,13,100,14,132,0,90,11,101,12, + 100,15,100,16,132,0,131,1,90,13,100,17,100,18,132,0, + 90,14,100,10,83,0,41,20,218,10,70,105,108,101,70,105, + 110,100,101,114,122,172,70,105,108,101,45,98,97,115,101,100, + 32,102,105,110,100,101,114,46,10,10,32,32,32,32,73,110, + 116,101,114,97,99,116,105,111,110,115,32,119,105,116,104,32, + 116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32, + 97,114,101,32,99,97,99,104,101,100,32,102,111,114,32,112, + 101,114,102,111,114,109,97,110,99,101,44,32,98,101,105,110, + 103,10,32,32,32,32,114,101,102,114,101,115,104,101,100,32, + 119,104,101,110,32,116,104,101,32,100,105,114,101,99,116,111, + 114,121,32,116,104,101,32,102,105,110,100,101,114,32,105,115, + 32,104,97,110,100,108,105,110,103,32,104,97,115,32,98,101, + 101,110,32,109,111,100,105,102,105,101,100,46,10,10,32,32, + 32,32,99,2,0,0,0,0,0,0,0,0,0,0,0,5, + 0,0,0,6,0,0,0,7,0,0,0,115,84,0,0,0, + 103,0,125,3,124,2,68,0,93,32,92,2,137,0,125,4, + 124,3,160,0,135,0,102,1,100,1,100,2,132,8,124,4, + 68,0,131,1,161,1,1,0,113,8,124,3,124,0,95,1, + 124,1,112,54,100,3,124,0,95,2,100,4,124,0,95,3, + 116,4,131,0,124,0,95,5,116,4,131,0,124,0,95,6, + 100,5,83,0,41,6,122,154,73,110,105,116,105,97,108,105, + 122,101,32,119,105,116,104,32,116,104,101,32,112,97,116,104, + 32,116,111,32,115,101,97,114,99,104,32,111,110,32,97,110, + 100,32,97,32,118,97,114,105,97,98,108,101,32,110,117,109, + 98,101,114,32,111,102,10,32,32,32,32,32,32,32,32,50, + 45,116,117,112,108,101,115,32,99,111,110,116,97,105,110,105, + 110,103,32,116,104,101,32,108,111,97,100,101,114,32,97,110, + 100,32,116,104,101,32,102,105,108,101,32,115,117,102,102,105, + 120,101,115,32,116,104,101,32,108,111,97,100,101,114,10,32, + 32,32,32,32,32,32,32,114,101,99,111,103,110,105,122,101, + 115,46,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,51,0,0,0,115,22,0,0,0, + 124,0,93,14,125,1,124,1,136,0,102,2,86,0,1,0, + 113,2,100,0,83,0,114,109,0,0,0,114,5,0,0,0, + 114,7,1,0,0,169,1,114,140,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,10,1,0,0,107,5,0,0,115, + 6,0,0,0,18,0,4,128,255,128,122,38,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,114,71,0,0,0,114,104,0,0,0,78,41,7,114, + 167,0,0,0,218,8,95,108,111,97,100,101,114,115,114,44, + 0,0,0,218,11,95,112,97,116,104,95,109,116,105,109,101, + 218,3,115,101,116,218,11,95,112,97,116,104,95,99,97,99, + 104,101,218,19,95,114,101,108,97,120,101,100,95,112,97,116, + 104,95,99,97,99,104,101,41,5,114,118,0,0,0,114,44, + 0,0,0,218,14,108,111,97,100,101,114,95,100,101,116,97, + 105,108,115,90,7,108,111,97,100,101,114,115,114,189,0,0, + 0,114,5,0,0,0,114,55,1,0,0,114,8,0,0,0, + 114,209,0,0,0,101,5,0,0,115,20,0,0,0,4,4, + 12,1,26,1,6,1,10,2,6,1,8,1,8,1,4,128, + 255,128,122,19,70,105,108,101,70,105,110,100,101,114,46,95, + 95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,2,0,0,0,67,0,0,0, + 115,10,0,0,0,100,1,124,0,95,0,100,2,83,0,41, + 3,122,31,73,110,118,97,108,105,100,97,116,101,32,116,104, + 101,32,100,105,114,101,99,116,111,114,121,32,109,116,105,109, + 101,46,114,104,0,0,0,78,41,1,114,57,1,0,0,114, + 246,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,38,1,0,0,115,5,0,0,115,6,0,0, + 0,6,2,4,128,255,128,122,28,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,0,0,0,0,0,0, + 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,42, + 0,0,0,124,0,160,0,124,1,161,1,125,2,124,2,100, + 1,117,0,114,26,100,1,103,0,102,2,83,0,124,2,106, + 1,124,2,106,2,112,38,103,0,102,2,83,0,41,2,122, + 197,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,44,32, + 111,114,32,116,104,101,32,110,97,109,101,115,112,97,99,101, + 10,32,32,32,32,32,32,32,32,112,97,99,107,97,103,101, + 32,112,111,114,116,105,111,110,115,46,32,82,101,116,117,114, + 110,115,32,40,108,111,97,100,101,114,44,32,108,105,115,116, + 45,111,102,45,112,111,114,116,105,111,110,115,41,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, + 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,32,32,32,32,78,41,3,114,203,0,0,0,114,140, + 0,0,0,114,178,0,0,0,41,3,114,118,0,0,0,114, + 139,0,0,0,114,187,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,114,137,0,0,0,121,5,0, + 0,115,10,0,0,0,10,7,8,1,8,1,16,1,255,128, + 122,22,70,105,108,101,70,105,110,100,101,114,46,102,105,110, + 100,95,108,111,97,100,101,114,99,6,0,0,0,0,0,0, + 0,0,0,0,0,7,0,0,0,6,0,0,0,67,0,0, + 0,115,26,0,0,0,124,1,124,2,124,3,131,2,125,6, + 116,0,124,2,124,3,124,6,124,4,100,1,141,4,83,0, + 41,2,78,114,177,0,0,0,41,1,114,190,0,0,0,41, + 7,114,118,0,0,0,114,188,0,0,0,114,139,0,0,0, + 114,44,0,0,0,90,4,115,109,115,108,114,202,0,0,0, + 114,140,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,51,1,0,0,133,5,0,0,115,10,0, + 0,0,10,1,8,1,2,1,6,255,255,128,122,20,70,105, + 108,101,70,105,110,100,101,114,46,95,103,101,116,95,115,112, + 101,99,78,99,3,0,0,0,0,0,0,0,0,0,0,0, + 14,0,0,0,8,0,0,0,67,0,0,0,115,92,1,0, + 0,100,1,125,3,124,1,160,0,100,2,161,1,100,3,25, + 0,125,4,122,24,116,1,124,0,106,2,112,34,116,3,160, + 4,161,0,131,1,106,5,125,5,87,0,110,22,4,0,116, + 6,121,64,1,0,1,0,1,0,100,4,125,5,89,0,110, + 2,48,0,124,5,124,0,106,7,107,3,114,90,124,0,160, + 8,161,0,1,0,124,5,124,0,95,7,116,9,131,0,114, + 112,124,0,106,10,125,6,124,4,160,11,161,0,125,7,110, + 10,124,0,106,12,125,6,124,4,125,7,124,7,124,6,118, + 0,114,214,116,13,124,0,106,2,124,4,131,2,125,8,124, + 0,106,14,68,0,93,56,92,2,125,9,125,10,100,5,124, + 9,23,0,125,11,116,13,124,8,124,11,131,2,125,12,116, + 15,124,12,131,1,114,148,124,0,160,16,124,10,124,1,124, + 12,124,8,103,1,124,2,161,5,2,0,1,0,83,0,116, + 17,124,8,131,1,125,3,124,0,106,14,68,0,93,80,92, + 2,125,9,125,10,116,13,124,0,106,2,124,4,124,9,23, + 0,131,2,125,12,116,18,106,19,100,6,124,12,100,3,100, + 7,141,3,1,0,124,7,124,9,23,0,124,6,118,0,114, + 220,116,15,124,12,131,1,114,220,124,0,160,16,124,10,124, + 1,124,12,100,8,124,2,161,5,2,0,1,0,83,0,124, + 3,144,1,114,88,116,18,160,19,100,9,124,8,161,2,1, + 0,116,18,160,20,124,1,100,8,161,2,125,13,124,8,103, + 1,124,13,95,21,124,13,83,0,100,8,83,0,41,10,122, + 111,84,114,121,32,116,111,32,102,105,110,100,32,97,32,115, + 112,101,99,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,46,10,10,32, + 32,32,32,32,32,32,32,82,101,116,117,114,110,115,32,116, + 104,101,32,109,97,116,99,104,105,110,103,32,115,112,101,99, + 44,32,111,114,32,78,111,110,101,32,105,102,32,110,111,116, + 32,102,111,117,110,100,46,10,32,32,32,32,32,32,32,32, + 70,114,71,0,0,0,114,28,0,0,0,114,104,0,0,0, + 114,209,0,0,0,122,9,116,114,121,105,110,103,32,123,125, + 41,1,90,9,118,101,114,98,111,115,105,116,121,78,122,25, + 112,111,115,115,105,98,108,101,32,110,97,109,101,115,112,97, + 99,101,32,102,111,114,32,123,125,41,22,114,41,0,0,0, + 114,49,0,0,0,114,44,0,0,0,114,4,0,0,0,114, + 55,0,0,0,114,0,1,0,0,114,50,0,0,0,114,57, + 1,0,0,218,11,95,102,105,108,108,95,99,97,99,104,101, + 114,9,0,0,0,114,60,1,0,0,114,105,0,0,0,114, + 59,1,0,0,114,38,0,0,0,114,56,1,0,0,114,54, + 0,0,0,114,51,1,0,0,114,56,0,0,0,114,134,0, + 0,0,114,149,0,0,0,114,183,0,0,0,114,178,0,0, + 0,41,14,114,118,0,0,0,114,139,0,0,0,114,202,0, + 0,0,90,12,105,115,95,110,97,109,101,115,112,97,99,101, + 90,11,116,97,105,108,95,109,111,100,117,108,101,114,169,0, + 0,0,90,5,99,97,99,104,101,90,12,99,97,99,104,101, + 95,109,111,100,117,108,101,90,9,98,97,115,101,95,112,97, + 116,104,114,8,1,0,0,114,188,0,0,0,90,13,105,110, + 105,116,95,102,105,108,101,110,97,109,101,90,9,102,117,108, + 108,95,112,97,116,104,114,187,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,203,0,0,0,138, + 5,0,0,115,74,0,0,0,4,5,14,1,2,1,24,1, + 12,1,10,1,10,1,8,1,6,1,6,2,6,1,10,1, + 6,2,4,1,8,2,12,1,14,1,8,1,10,1,8,1, + 24,1,8,4,14,2,16,1,16,1,12,1,8,1,10,1, + 4,1,8,255,6,2,12,1,12,1,8,1,4,1,4,1, + 255,128,122,20,70,105,108,101,70,105,110,100,101,114,46,102, + 105,110,100,95,115,112,101,99,99,1,0,0,0,0,0,0, + 0,0,0,0,0,9,0,0,0,10,0,0,0,67,0,0, + 0,115,188,0,0,0,124,0,106,0,125,1,122,22,116,1, + 160,2,124,1,112,22,116,1,160,3,161,0,161,1,125,2, + 87,0,110,28,4,0,116,4,116,5,116,6,102,3,121,56, + 1,0,1,0,1,0,103,0,125,2,89,0,110,2,48,0, + 116,7,106,8,160,9,100,1,161,1,115,82,116,10,124,2, + 131,1,124,0,95,11,110,74,116,10,131,0,125,3,124,2, + 68,0,93,56,125,4,124,4,160,12,100,2,161,1,92,3, + 125,5,125,6,125,7,124,6,114,134,100,3,160,13,124,5, + 124,7,160,14,161,0,161,2,125,8,110,4,124,5,125,8, + 124,3,160,15,124,8,161,1,1,0,113,92,124,3,124,0, + 95,11,116,7,106,8,160,9,116,16,161,1,114,184,100,4, + 100,5,132,0,124,2,68,0,131,1,124,0,95,17,100,6, + 83,0,41,7,122,68,70,105,108,108,32,116,104,101,32,99, + 97,99,104,101,32,111,102,32,112,111,116,101,110,116,105,97, + 108,32,109,111,100,117,108,101,115,32,97,110,100,32,112,97, + 99,107,97,103,101,115,32,102,111,114,32,116,104,105,115,32, + 100,105,114,101,99,116,111,114,121,46,114,0,0,0,0,114, + 71,0,0,0,114,61,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,4,0,0,0,83,0, + 0,0,115,20,0,0,0,104,0,124,0,93,12,125,1,124, + 1,160,0,161,0,146,2,113,4,83,0,114,5,0,0,0, + 41,1,114,105,0,0,0,41,2,114,32,0,0,0,90,2, + 102,110,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,9,60,115,101,116,99,111,109,112,62,215,5,0,0, + 115,4,0,0,0,20,0,255,128,122,41,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,115,101,116,99, + 111,109,112,62,78,41,18,114,44,0,0,0,114,4,0,0, + 0,90,7,108,105,115,116,100,105,114,114,55,0,0,0,114, + 45,1,0,0,218,15,80,101,114,109,105,115,115,105,111,110, + 69,114,114,111,114,218,18,78,111,116,65,68,105,114,101,99, + 116,111,114,121,69,114,114,111,114,114,1,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,58,1,0,0,114,59,1, + 0,0,114,100,0,0,0,114,62,0,0,0,114,105,0,0, + 0,218,3,97,100,100,114,12,0,0,0,114,60,1,0,0, + 41,9,114,118,0,0,0,114,44,0,0,0,90,8,99,111, + 110,116,101,110,116,115,90,21,108,111,119,101,114,95,115,117, + 102,102,105,120,95,99,111,110,116,101,110,116,115,114,33,1, + 0,0,114,116,0,0,0,114,20,1,0,0,114,8,1,0, + 0,90,8,110,101,119,95,110,97,109,101,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,62,1,0,0,186, + 5,0,0,115,38,0,0,0,6,2,2,1,22,1,18,1, + 10,3,12,3,12,1,6,7,8,1,16,1,4,1,18,1, + 4,2,12,1,6,1,12,1,16,1,4,128,255,128,122,22, + 70,105,108,101,70,105,110,100,101,114,46,95,102,105,108,108, + 95,99,97,99,104,101,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,3,0,0,0,7,0,0,0,115, + 18,0,0,0,135,0,135,1,102,2,100,1,100,2,132,8, + 125,2,124,2,83,0,41,4,97,20,1,0,0,65,32,99, + 108,97,115,115,32,109,101,116,104,111,100,32,119,104,105,99, + 104,32,114,101,116,117,114,110,115,32,97,32,99,108,111,115, + 117,114,101,32,116,111,32,117,115,101,32,111,110,32,115,121, + 115,46,112,97,116,104,95,104,111,111,107,10,32,32,32,32, + 32,32,32,32,119,104,105,99,104,32,119,105,108,108,32,114, + 101,116,117,114,110,32,97,110,32,105,110,115,116,97,110,99, + 101,32,117,115,105,110,103,32,116,104,101,32,115,112,101,99, + 105,102,105,101,100,32,108,111,97,100,101,114,115,32,97,110, + 100,32,116,104,101,32,112,97,116,104,10,32,32,32,32,32, + 32,32,32,99,97,108,108,101,100,32,111,110,32,116,104,101, + 32,99,108,111,115,117,114,101,46,10,10,32,32,32,32,32, + 32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,99, + 97,108,108,101,100,32,111,110,32,116,104,101,32,99,108,111, + 115,117,114,101,32,105,115,32,110,111,116,32,97,32,100,105, + 114,101,99,116,111,114,121,44,32,73,109,112,111,114,116,69, + 114,114,111,114,32,105,115,10,32,32,32,32,32,32,32,32, + 114,97,105,115,101,100,46,10,10,32,32,32,32,32,32,32, + 32,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,4,0,0,0,19,0,0,0,115,36,0,0,0,116, + 0,124,0,131,1,115,20,116,1,100,1,124,0,100,2,141, + 2,130,1,136,0,124,0,103,1,136,1,162,1,82,0,142, + 0,83,0,41,4,122,45,80,97,116,104,32,104,111,111,107, + 32,102,111,114,32,105,109,112,111,114,116,108,105,98,46,109, + 97,99,104,105,110,101,114,121,46,70,105,108,101,70,105,110, + 100,101,114,46,122,30,111,110,108,121,32,100,105,114,101,99, + 116,111,114,105,101,115,32,97,114,101,32,115,117,112,112,111, + 114,116,101,100,114,48,0,0,0,78,41,2,114,56,0,0, + 0,114,117,0,0,0,114,48,0,0,0,169,2,114,193,0, + 0,0,114,61,1,0,0,114,5,0,0,0,114,8,0,0, + 0,218,24,112,97,116,104,95,104,111,111,107,95,102,111,114, + 95,70,105,108,101,70,105,110,100,101,114,227,5,0,0,115, + 8,0,0,0,8,2,12,1,16,1,255,128,122,54,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,107,95,102,111,114,95,70,105,108,101,70,105, + 110,100,101,114,78,114,5,0,0,0,41,3,114,193,0,0, + 0,114,61,1,0,0,114,68,1,0,0,114,5,0,0,0, + 114,67,1,0,0,114,8,0,0,0,218,9,112,97,116,104, + 95,104,111,111,107,217,5,0,0,115,6,0,0,0,14,10, + 4,6,255,128,122,20,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,0,0,0,0,1,0,0,0,3,0,0,0,67, + 0,0,0,115,12,0,0,0,100,1,160,0,124,0,106,1, + 161,1,83,0,41,2,78,122,16,70,105,108,101,70,105,110, + 100,101,114,40,123,33,114,125,41,41,2,114,62,0,0,0, + 114,44,0,0,0,114,246,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,31,1,0,0,235,5, + 0,0,115,4,0,0,0,12,1,255,128,122,19,70,105,108, + 101,70,105,110,100,101,114,46,95,95,114,101,112,114,95,95, + 41,1,78,41,15,114,125,0,0,0,114,124,0,0,0,114, + 126,0,0,0,114,127,0,0,0,114,209,0,0,0,114,38, + 1,0,0,114,143,0,0,0,114,206,0,0,0,114,137,0, + 0,0,114,51,1,0,0,114,203,0,0,0,114,62,1,0, + 0,114,207,0,0,0,114,69,1,0,0,114,31,1,0,0, + 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,54,1,0,0,92,5,0,0,115,26,0, + 0,0,8,0,4,2,8,7,8,14,4,4,8,2,8,12, + 10,5,8,48,2,31,10,1,12,17,255,128,114,54,1,0, + 0,99,4,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,8,0,0,0,67,0,0,0,115,144,0,0,0,124, + 0,160,0,100,1,161,1,125,4,124,0,160,0,100,2,161, + 1,125,5,124,4,115,66,124,5,114,36,124,5,106,1,125, + 4,110,30,124,2,124,3,107,2,114,56,116,2,124,1,124, + 2,131,2,125,4,110,10,116,3,124,1,124,2,131,2,125, + 4,124,5,115,84,116,4,124,1,124,2,124,4,100,3,141, + 3,125,5,122,38,124,5,124,0,100,2,60,0,124,4,124, + 0,100,1,60,0,124,2,124,0,100,4,60,0,124,3,124, + 0,100,5,60,0,87,0,100,0,83,0,4,0,116,5,121, + 142,1,0,1,0,1,0,89,0,100,0,83,0,48,0,41, + 6,78,218,10,95,95,108,111,97,100,101,114,95,95,218,8, + 95,95,115,112,101,99,95,95,114,55,1,0,0,90,8,95, + 95,102,105,108,101,95,95,90,10,95,95,99,97,99,104,101, + 100,95,95,41,6,218,3,103,101,116,114,140,0,0,0,114, + 5,1,0,0,114,255,0,0,0,114,190,0,0,0,218,9, + 69,120,99,101,112,116,105,111,110,41,6,90,2,110,115,114, + 116,0,0,0,90,8,112,97,116,104,110,97,109,101,90,9, + 99,112,97,116,104,110,97,109,101,114,140,0,0,0,114,187, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,14,95,102,105,120,95,117,112,95,109,111,100,117, + 108,101,241,5,0,0,115,42,0,0,0,10,2,10,1,4, + 1,4,1,8,1,8,1,12,1,10,2,4,1,14,1,2, + 1,8,1,8,1,8,1,10,1,4,128,12,1,2,2,4, + 128,2,0,255,128,114,74,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,38,0,0,0,116,0,116,1,160,2,161,0, + 102,2,125,0,116,3,116,4,102,2,125,1,116,5,116,6, + 102,2,125,2,124,0,124,1,124,2,103,3,83,0,41,2, + 122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,116, + 32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,109, + 111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,10, + 32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,115, + 32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,114, + 44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,32, + 32,78,41,7,114,252,0,0,0,114,163,0,0,0,218,18, 101,120,116,101,110,115,105,111,110,95,115,117,102,102,105,120, 101,115,114,255,0,0,0,114,101,0,0,0,114,5,1,0, 0,114,88,0,0,0,41,3,90,10,101,120,116,101,110,115, diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index 1e6d71ec6df809..87f787c84a4049 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -221,7 +221,7 @@ const unsigned char _Py_M__zipimport[] = { 114,46,102,105,110,100,95,108,111,97,100,101,114,99,3,0, 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, 0,0,67,0,0,0,115,16,0,0,0,124,0,160,0,124, - 1,124,2,161,2,100,1,25,0,83,0,41,2,97,203,1, + 1,124,2,161,2,100,1,25,0,83,0,41,3,97,203,1, 0,0,102,105,110,100,95,109,111,100,117,108,101,40,102,117, 108,108,110,97,109,101,44,32,112,97,116,104,61,78,111,110, 101,41,32,45,62,32,115,101,108,102,32,111,114,32,78,111, @@ -251,757 +251,757 @@ const unsigned char _Py_M__zipimport[] = { 121,116,104,111,110,32,51,46,49,48,46,32,85,115,101,32, 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, 101,97,100,46,10,32,32,32,32,32,32,32,32,114,0,0, - 0,0,41,1,114,41,0,0,0,41,3,114,32,0,0,0, - 114,38,0,0,0,114,13,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,11,102,105,110,100,95, - 109,111,100,117,108,101,143,0,0,0,115,4,0,0,0,16, - 11,255,128,122,23,122,105,112,105,109,112,111,114,116,101,114, - 46,102,105,110,100,95,109,111,100,117,108,101,99,3,0,0, - 0,0,0,0,0,0,0,0,0,7,0,0,0,5,0,0, - 0,67,0,0,0,115,108,0,0,0,116,0,124,0,124,1, - 131,2,125,3,124,3,100,1,117,1,114,34,116,1,106,2, - 124,1,124,0,124,3,100,2,141,3,83,0,116,3,124,0, - 124,1,131,2,125,4,116,4,124,0,124,4,131,2,114,104, - 124,0,106,5,155,0,116,6,155,0,124,4,155,0,157,3, - 125,5,116,1,106,7,124,1,100,1,100,3,100,4,141,3, - 125,6,124,6,106,8,160,9,124,5,161,1,1,0,124,6, - 83,0,100,1,83,0,41,5,122,107,67,114,101,97,116,101, - 32,97,32,77,111,100,117,108,101,83,112,101,99,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,46,10,10,32,32,32,32,32,32,32, - 32,82,101,116,117,114,110,115,32,78,111,110,101,32,105,102, - 32,116,104,101,32,109,111,100,117,108,101,32,99,97,110,110, - 111,116,32,98,101,32,102,111,117,110,100,46,10,32,32,32, - 32,32,32,32,32,78,41,1,218,10,105,115,95,112,97,99, - 107,97,103,101,84,41,3,218,4,110,97,109,101,90,6,108, - 111,97,100,101,114,114,43,0,0,0,41,10,114,35,0,0, - 0,218,10,95,98,111,111,116,115,116,114,97,112,90,16,115, - 112,101,99,95,102,114,111,109,95,108,111,97,100,101,114,114, - 36,0,0,0,114,37,0,0,0,114,29,0,0,0,114,20, - 0,0,0,90,10,77,111,100,117,108,101,83,112,101,99,90, - 26,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, - 104,95,108,111,99,97,116,105,111,110,115,114,24,0,0,0, - 41,7,114,32,0,0,0,114,38,0,0,0,90,6,116,97, - 114,103,101,116,90,11,109,111,100,117,108,101,95,105,110,102, - 111,114,40,0,0,0,114,13,0,0,0,90,4,115,112,101, - 99,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,9,102,105,110,100,95,115,112,101,99,156,0,0,0,115, - 26,0,0,0,10,5,8,1,16,1,10,7,10,1,18,4, - 8,1,2,1,6,255,12,2,4,1,4,2,255,128,122,21, - 122,105,112,105,109,112,111,114,116,101,114,46,102,105,110,100, - 95,115,112,101,99,99,2,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,3,0,0,0,67,0,0,0,115,20, - 0,0,0,116,0,124,0,124,1,131,2,92,3,125,2,125, - 3,125,4,124,2,83,0,41,1,122,163,103,101,116,95,99, - 111,100,101,40,102,117,108,108,110,97,109,101,41,32,45,62, - 32,99,111,100,101,32,111,98,106,101,99,116,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,32,116,104, - 101,32,99,111,100,101,32,111,98,106,101,99,116,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,46,32,82,97,105,115,101,32,90,105, - 112,73,109,112,111,114,116,69,114,114,111,114,10,32,32,32, - 32,32,32,32,32,105,102,32,116,104,101,32,109,111,100,117, - 108,101,32,99,111,117,108,100,110,39,116,32,98,101,32,102, - 111,117,110,100,46,10,32,32,32,32,32,32,32,32,169,1, - 218,16,95,103,101,116,95,109,111,100,117,108,101,95,99,111, - 100,101,169,5,114,32,0,0,0,114,38,0,0,0,218,4, - 99,111,100,101,218,9,105,115,112,97,99,107,97,103,101,114, - 40,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,8,103,101,116,95,99,111,100,101,183,0,0, - 0,115,6,0,0,0,16,6,4,1,255,128,122,20,122,105, - 112,105,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,0,0,0,0,4, - 0,0,0,8,0,0,0,67,0,0,0,115,112,0,0,0, - 116,0,114,16,124,1,160,1,116,0,116,2,161,2,125,1, - 124,1,125,2,124,1,160,3,124,0,106,4,116,2,23,0, - 161,1,114,58,124,1,116,5,124,0,106,4,116,2,23,0, - 131,1,100,1,133,2,25,0,125,2,122,14,124,0,106,6, - 124,2,25,0,125,3,87,0,110,26,4,0,116,7,121,98, - 1,0,1,0,1,0,116,8,100,2,100,3,124,2,131,3, - 130,1,48,0,116,9,124,0,106,4,124,3,131,2,83,0, - 41,4,122,154,103,101,116,95,100,97,116,97,40,112,97,116, - 104,110,97,109,101,41,32,45,62,32,115,116,114,105,110,103, - 32,119,105,116,104,32,102,105,108,101,32,100,97,116,97,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 32,116,104,101,32,100,97,116,97,32,97,115,115,111,99,105, - 97,116,101,100,32,119,105,116,104,32,39,112,97,116,104,110, - 97,109,101,39,46,32,82,97,105,115,101,32,79,83,69,114, - 114,111,114,32,105,102,10,32,32,32,32,32,32,32,32,116, - 104,101,32,102,105,108,101,32,119,97,115,110,39,116,32,102, - 111,117,110,100,46,10,32,32,32,32,32,32,32,32,78,114, - 0,0,0,0,218,0,41,10,114,18,0,0,0,114,19,0, - 0,0,114,20,0,0,0,218,10,115,116,97,114,116,115,119, - 105,116,104,114,29,0,0,0,218,3,108,101,110,114,28,0, - 0,0,114,26,0,0,0,114,22,0,0,0,218,9,95,103, - 101,116,95,100,97,116,97,41,4,114,32,0,0,0,218,8, - 112,97,116,104,110,97,109,101,90,3,107,101,121,218,9,116, - 111,99,95,101,110,116,114,121,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,8,103,101,116,95,100,97,116, - 97,193,0,0,0,115,22,0,0,0,4,6,12,1,4,2, - 16,1,22,1,2,2,14,1,12,1,14,1,12,1,255,128, - 122,20,122,105,112,105,109,112,111,114,116,101,114,46,103,101, - 116,95,100,97,116,97,99,2,0,0,0,0,0,0,0,0, + 0,0,78,41,1,114,41,0,0,0,41,3,114,32,0,0, + 0,114,38,0,0,0,114,13,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,11,102,105,110,100, + 95,109,111,100,117,108,101,143,0,0,0,115,4,0,0,0, + 16,11,255,128,122,23,122,105,112,105,109,112,111,114,116,101, + 114,46,102,105,110,100,95,109,111,100,117,108,101,99,3,0, + 0,0,0,0,0,0,0,0,0,0,7,0,0,0,5,0, + 0,0,67,0,0,0,115,108,0,0,0,116,0,124,0,124, + 1,131,2,125,3,124,3,100,1,117,1,114,34,116,1,106, + 2,124,1,124,0,124,3,100,2,141,3,83,0,116,3,124, + 0,124,1,131,2,125,4,116,4,124,0,124,4,131,2,114, + 104,124,0,106,5,155,0,116,6,155,0,124,4,155,0,157, + 3,125,5,116,1,106,7,124,1,100,1,100,3,100,4,141, + 3,125,6,124,6,106,8,160,9,124,5,161,1,1,0,124, + 6,83,0,100,1,83,0,41,5,122,107,67,114,101,97,116, + 101,32,97,32,77,111,100,117,108,101,83,112,101,99,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,46,10,10,32,32,32,32,32,32, + 32,32,82,101,116,117,114,110,115,32,78,111,110,101,32,105, + 102,32,116,104,101,32,109,111,100,117,108,101,32,99,97,110, + 110,111,116,32,98,101,32,102,111,117,110,100,46,10,32,32, + 32,32,32,32,32,32,78,41,1,218,10,105,115,95,112,97, + 99,107,97,103,101,84,41,3,218,4,110,97,109,101,90,6, + 108,111,97,100,101,114,114,43,0,0,0,41,10,114,35,0, + 0,0,218,10,95,98,111,111,116,115,116,114,97,112,90,16, + 115,112,101,99,95,102,114,111,109,95,108,111,97,100,101,114, + 114,36,0,0,0,114,37,0,0,0,114,29,0,0,0,114, + 20,0,0,0,90,10,77,111,100,117,108,101,83,112,101,99, + 90,26,115,117,98,109,111,100,117,108,101,95,115,101,97,114, + 99,104,95,108,111,99,97,116,105,111,110,115,114,24,0,0, + 0,41,7,114,32,0,0,0,114,38,0,0,0,90,6,116, + 97,114,103,101,116,90,11,109,111,100,117,108,101,95,105,110, + 102,111,114,40,0,0,0,114,13,0,0,0,90,4,115,112, + 101,99,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,9,102,105,110,100,95,115,112,101,99,156,0,0,0, + 115,26,0,0,0,10,5,8,1,16,1,10,7,10,1,18, + 4,8,1,2,1,6,255,12,2,4,1,4,2,255,128,122, + 21,122,105,112,105,109,112,111,114,116,101,114,46,102,105,110, + 100,95,115,112,101,99,99,2,0,0,0,0,0,0,0,0, 0,0,0,5,0,0,0,3,0,0,0,67,0,0,0,115, 20,0,0,0,116,0,124,0,124,1,131,2,92,3,125,2, - 125,3,125,4,124,4,83,0,41,1,122,106,103,101,116,95, - 102,105,108,101,110,97,109,101,40,102,117,108,108,110,97,109, - 101,41,32,45,62,32,102,105,108,101,110,97,109,101,32,115, - 116,114,105,110,103,46,10,10,32,32,32,32,32,32,32,32, - 82,101,116,117,114,110,32,116,104,101,32,102,105,108,101,110, - 97,109,101,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,46,10,32,32, - 32,32,32,32,32,32,114,47,0,0,0,114,49,0,0,0, + 125,3,125,4,124,2,83,0,41,2,122,163,103,101,116,95, + 99,111,100,101,40,102,117,108,108,110,97,109,101,41,32,45, + 62,32,99,111,100,101,32,111,98,106,101,99,116,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,116, + 104,101,32,99,111,100,101,32,111,98,106,101,99,116,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,46,32,82,97,105,115,101,32,90, + 105,112,73,109,112,111,114,116,69,114,114,111,114,10,32,32, + 32,32,32,32,32,32,105,102,32,116,104,101,32,109,111,100, + 117,108,101,32,99,111,117,108,100,110,39,116,32,98,101,32, + 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,78, + 169,1,218,16,95,103,101,116,95,109,111,100,117,108,101,95, + 99,111,100,101,169,5,114,32,0,0,0,114,38,0,0,0, + 218,4,99,111,100,101,218,9,105,115,112,97,99,107,97,103, + 101,114,40,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,8,103,101,116,95,99,111,100,101,183, + 0,0,0,115,6,0,0,0,16,6,4,1,255,128,122,20, + 122,105,112,105,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,0,0,0, + 0,4,0,0,0,8,0,0,0,67,0,0,0,115,112,0, + 0,0,116,0,114,16,124,1,160,1,116,0,116,2,161,2, + 125,1,124,1,125,2,124,1,160,3,124,0,106,4,116,2, + 23,0,161,1,114,58,124,1,116,5,124,0,106,4,116,2, + 23,0,131,1,100,1,133,2,25,0,125,2,122,14,124,0, + 106,6,124,2,25,0,125,3,87,0,110,26,4,0,116,7, + 121,98,1,0,1,0,1,0,116,8,100,2,100,3,124,2, + 131,3,130,1,48,0,116,9,124,0,106,4,124,3,131,2, + 83,0,41,4,122,154,103,101,116,95,100,97,116,97,40,112, + 97,116,104,110,97,109,101,41,32,45,62,32,115,116,114,105, + 110,103,32,119,105,116,104,32,102,105,108,101,32,100,97,116, + 97,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, + 114,110,32,116,104,101,32,100,97,116,97,32,97,115,115,111, + 99,105,97,116,101,100,32,119,105,116,104,32,39,112,97,116, + 104,110,97,109,101,39,46,32,82,97,105,115,101,32,79,83, + 69,114,114,111,114,32,105,102,10,32,32,32,32,32,32,32, + 32,116,104,101,32,102,105,108,101,32,119,97,115,110,39,116, + 32,102,111,117,110,100,46,10,32,32,32,32,32,32,32,32, + 78,114,0,0,0,0,218,0,41,10,114,18,0,0,0,114, + 19,0,0,0,114,20,0,0,0,218,10,115,116,97,114,116, + 115,119,105,116,104,114,29,0,0,0,218,3,108,101,110,114, + 28,0,0,0,114,26,0,0,0,114,22,0,0,0,218,9, + 95,103,101,116,95,100,97,116,97,41,4,114,32,0,0,0, + 218,8,112,97,116,104,110,97,109,101,90,3,107,101,121,218, + 9,116,111,99,95,101,110,116,114,121,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,8,103,101,116,95,100, + 97,116,97,193,0,0,0,115,22,0,0,0,4,6,12,1, + 4,2,16,1,22,1,2,2,14,1,12,1,14,1,12,1, + 255,128,122,20,122,105,112,105,109,112,111,114,116,101,114,46, + 103,101,116,95,100,97,116,97,99,2,0,0,0,0,0,0, + 0,0,0,0,0,5,0,0,0,3,0,0,0,67,0,0, + 0,115,20,0,0,0,116,0,124,0,124,1,131,2,92,3, + 125,2,125,3,125,4,124,4,83,0,41,2,122,106,103,101, + 116,95,102,105,108,101,110,97,109,101,40,102,117,108,108,110, + 97,109,101,41,32,45,62,32,102,105,108,101,110,97,109,101, + 32,115,116,114,105,110,103,46,10,10,32,32,32,32,32,32, + 32,32,82,101,116,117,114,110,32,116,104,101,32,102,105,108, + 101,110,97,109,101,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,46,10, + 32,32,32,32,32,32,32,32,78,114,47,0,0,0,114,49, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,12,103,101,116,95,102,105,108,101,110,97,109,101, + 214,0,0,0,115,6,0,0,0,16,7,4,1,255,128,122, + 24,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, + 95,102,105,108,101,110,97,109,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,8,0,0,0,67,0, + 0,0,115,126,0,0,0,116,0,124,0,124,1,131,2,125, + 2,124,2,100,1,117,0,114,36,116,1,100,2,124,1,155, + 2,157,2,124,1,100,3,141,2,130,1,116,2,124,0,124, + 1,131,2,125,3,124,2,114,64,116,3,160,4,124,3,100, + 4,161,2,125,4,110,10,124,3,155,0,100,5,157,2,125, + 4,122,14,124,0,106,5,124,4,25,0,125,5,87,0,110, + 20,4,0,116,6,121,108,1,0,1,0,1,0,89,0,100, + 1,83,0,48,0,116,7,124,0,106,8,124,5,131,2,160, + 9,161,0,83,0,41,6,122,253,103,101,116,95,115,111,117, + 114,99,101,40,102,117,108,108,110,97,109,101,41,32,45,62, + 32,115,111,117,114,99,101,32,115,116,114,105,110,103,46,10, + 10,32,32,32,32,32,32,32,32,82,101,116,117,114,110,32, + 116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32, + 90,105,112,73,109,112,111,114,116,69,114,114,111,114,10,32, + 32,32,32,32,32,32,32,105,102,32,116,104,101,32,109,111, + 100,117,108,101,32,99,111,117,108,100,110,39,116,32,98,101, + 32,102,111,117,110,100,44,32,114,101,116,117,114,110,32,78, + 111,110,101,32,105,102,32,116,104,101,32,97,114,99,104,105, + 118,101,32,100,111,101,115,10,32,32,32,32,32,32,32,32, + 99,111,110,116,97,105,110,32,116,104,101,32,109,111,100,117, + 108,101,44,32,98,117,116,32,104,97,115,32,110,111,32,115, + 111,117,114,99,101,32,102,111,114,32,105,116,46,10,32,32, + 32,32,32,32,32,32,78,250,18,99,97,110,39,116,32,102, + 105,110,100,32,109,111,100,117,108,101,32,169,1,114,44,0, + 0,0,250,11,95,95,105,110,105,116,95,95,46,112,121,250, + 3,46,112,121,41,10,114,35,0,0,0,114,3,0,0,0, + 114,36,0,0,0,114,21,0,0,0,114,30,0,0,0,114, + 28,0,0,0,114,26,0,0,0,114,56,0,0,0,114,29, + 0,0,0,218,6,100,101,99,111,100,101,41,6,114,32,0, + 0,0,114,38,0,0,0,114,39,0,0,0,114,13,0,0, + 0,218,8,102,117,108,108,112,97,116,104,114,58,0,0,0, 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 12,103,101,116,95,102,105,108,101,110,97,109,101,214,0,0, - 0,115,6,0,0,0,16,7,4,1,255,128,122,24,122,105, - 112,105,109,112,111,114,116,101,114,46,103,101,116,95,102,105, - 108,101,110,97,109,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,115, - 126,0,0,0,116,0,124,0,124,1,131,2,125,2,124,2, + 10,103,101,116,95,115,111,117,114,99,101,225,0,0,0,115, + 26,0,0,0,10,7,8,1,18,1,10,2,4,1,14,1, + 10,2,2,2,14,1,12,1,8,2,16,1,255,128,122,22, + 122,105,112,105,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,0, + 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115, + 40,0,0,0,116,0,124,0,124,1,131,2,125,2,124,2, 100,1,117,0,114,36,116,1,100,2,124,1,155,2,157,2, - 124,1,100,3,141,2,130,1,116,2,124,0,124,1,131,2, - 125,3,124,2,114,64,116,3,160,4,124,3,100,4,161,2, - 125,4,110,10,124,3,155,0,100,5,157,2,125,4,122,14, - 124,0,106,5,124,4,25,0,125,5,87,0,110,20,4,0, - 116,6,121,108,1,0,1,0,1,0,89,0,100,1,83,0, - 48,0,116,7,124,0,106,8,124,5,131,2,160,9,161,0, - 83,0,41,6,122,253,103,101,116,95,115,111,117,114,99,101, - 40,102,117,108,108,110,97,109,101,41,32,45,62,32,115,111, - 117,114,99,101,32,115,116,114,105,110,103,46,10,10,32,32, - 32,32,32,32,32,32,82,101,116,117,114,110,32,116,104,101, - 32,115,111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32,90,105,112, - 73,109,112,111,114,116,69,114,114,111,114,10,32,32,32,32, - 32,32,32,32,105,102,32,116,104,101,32,109,111,100,117,108, - 101,32,99,111,117,108,100,110,39,116,32,98,101,32,102,111, - 117,110,100,44,32,114,101,116,117,114,110,32,78,111,110,101, - 32,105,102,32,116,104,101,32,97,114,99,104,105,118,101,32, - 100,111,101,115,10,32,32,32,32,32,32,32,32,99,111,110, - 116,97,105,110,32,116,104,101,32,109,111,100,117,108,101,44, - 32,98,117,116,32,104,97,115,32,110,111,32,115,111,117,114, - 99,101,32,102,111,114,32,105,116,46,10,32,32,32,32,32, - 32,32,32,78,250,18,99,97,110,39,116,32,102,105,110,100, - 32,109,111,100,117,108,101,32,169,1,114,44,0,0,0,250, - 11,95,95,105,110,105,116,95,95,46,112,121,250,3,46,112, - 121,41,10,114,35,0,0,0,114,3,0,0,0,114,36,0, - 0,0,114,21,0,0,0,114,30,0,0,0,114,28,0,0, - 0,114,26,0,0,0,114,56,0,0,0,114,29,0,0,0, - 218,6,100,101,99,111,100,101,41,6,114,32,0,0,0,114, - 38,0,0,0,114,39,0,0,0,114,13,0,0,0,218,8, - 102,117,108,108,112,97,116,104,114,58,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,10,103,101, - 116,95,115,111,117,114,99,101,225,0,0,0,115,26,0,0, - 0,10,7,8,1,18,1,10,2,4,1,14,1,10,2,2, - 2,14,1,12,1,8,2,16,1,255,128,122,22,122,105,112, - 105,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,0,0,0,0, - 3,0,0,0,4,0,0,0,67,0,0,0,115,40,0,0, - 0,116,0,124,0,124,1,131,2,125,2,124,2,100,1,117, - 0,114,36,116,1,100,2,124,1,155,2,157,2,124,1,100, - 3,141,2,130,1,124,2,83,0,41,4,122,171,105,115,95, - 112,97,99,107,97,103,101,40,102,117,108,108,110,97,109,101, - 41,32,45,62,32,98,111,111,108,46,10,10,32,32,32,32, - 32,32,32,32,82,101,116,117,114,110,32,84,114,117,101,32, - 105,102,32,116,104,101,32,109,111,100,117,108,101,32,115,112, - 101,99,105,102,105,101,100,32,98,121,32,102,117,108,108,110, - 97,109,101,32,105,115,32,97,32,112,97,99,107,97,103,101, - 46,10,32,32,32,32,32,32,32,32,82,97,105,115,101,32, - 90,105,112,73,109,112,111,114,116,69,114,114,111,114,32,105, - 102,32,116,104,101,32,109,111,100,117,108,101,32,99,111,117, - 108,100,110,39,116,32,98,101,32,102,111,117,110,100,46,10, - 32,32,32,32,32,32,32,32,78,114,61,0,0,0,114,62, - 0,0,0,41,2,114,35,0,0,0,114,3,0,0,0,41, - 3,114,32,0,0,0,114,38,0,0,0,114,39,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, - 43,0,0,0,251,0,0,0,115,10,0,0,0,10,6,8, - 1,18,1,4,1,255,128,122,22,122,105,112,105,109,112,111, - 114,116,101,114,46,105,115,95,112,97,99,107,97,103,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0, - 8,0,0,0,67,0,0,0,115,236,0,0,0,116,0,124, - 0,124,1,131,2,92,3,125,2,125,3,125,4,116,1,106, - 2,160,3,124,1,161,1,125,5,124,5,100,1,117,0,115, - 46,116,4,124,5,116,5,131,2,115,64,116,5,124,1,131, - 1,125,5,124,5,116,1,106,2,124,1,60,0,124,0,124, - 5,95,6,122,84,124,3,114,108,116,7,124,0,124,1,131, - 2,125,6,116,8,160,9,124,0,106,10,124,6,161,2,125, - 7,124,7,103,1,124,5,95,11,116,12,124,5,100,2,131, - 2,115,124,116,13,124,5,95,13,116,8,160,14,124,5,106, - 15,124,1,124,4,161,3,1,0,116,16,124,2,124,5,106, - 15,131,2,1,0,87,0,110,16,1,0,1,0,1,0,116, - 1,106,2,124,1,61,0,130,0,122,14,116,1,106,2,124, - 1,25,0,125,5,87,0,110,30,4,0,116,17,121,216,1, - 0,1,0,1,0,116,18,100,3,124,1,155,2,100,4,157, - 3,131,1,130,1,48,0,116,19,160,20,100,5,124,1,124, - 4,161,3,1,0,124,5,83,0,41,6,97,55,1,0,0, - 108,111,97,100,95,109,111,100,117,108,101,40,102,117,108,108, - 110,97,109,101,41,32,45,62,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,76,111,97,100,32,116, - 104,101,32,109,111,100,117,108,101,32,115,112,101,99,105,102, - 105,101,100,32,98,121,32,39,102,117,108,108,110,97,109,101, - 39,46,32,39,102,117,108,108,110,97,109,101,39,32,109,117, - 115,116,32,98,101,32,116,104,101,10,32,32,32,32,32,32, - 32,32,102,117,108,108,121,32,113,117,97,108,105,102,105,101, - 100,32,40,100,111,116,116,101,100,41,32,109,111,100,117,108, - 101,32,110,97,109,101,46,32,73,116,32,114,101,116,117,114, - 110,115,32,116,104,101,32,105,109,112,111,114,116,101,100,10, - 32,32,32,32,32,32,32,32,109,111,100,117,108,101,44,32, - 111,114,32,114,97,105,115,101,115,32,90,105,112,73,109,112, - 111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,119, - 97,115,110,39,116,32,102,111,117,110,100,46,10,10,32,32, - 32,32,32,32,32,32,68,101,112,114,101,99,97,116,101,100, - 32,115,105,110,99,101,32,80,121,116,104,111,110,32,51,46, - 49,48,46,32,117,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,32, - 32,32,32,32,32,32,32,78,218,12,95,95,98,117,105,108, - 116,105,110,115,95,95,122,14,76,111,97,100,101,100,32,109, - 111,100,117,108,101,32,122,25,32,110,111,116,32,102,111,117, - 110,100,32,105,110,32,115,121,115,46,109,111,100,117,108,101, - 115,122,30,105,109,112,111,114,116,32,123,125,32,35,32,108, - 111,97,100,101,100,32,102,114,111,109,32,90,105,112,32,123, - 125,41,21,114,48,0,0,0,218,3,115,121,115,218,7,109, - 111,100,117,108,101,115,218,3,103,101,116,114,15,0,0,0, - 218,12,95,109,111,100,117,108,101,95,116,121,112,101,218,10, - 95,95,108,111,97,100,101,114,95,95,114,36,0,0,0,114, - 21,0,0,0,114,30,0,0,0,114,29,0,0,0,90,8, - 95,95,112,97,116,104,95,95,218,7,104,97,115,97,116,116, - 114,114,68,0,0,0,90,14,95,102,105,120,95,117,112,95, - 109,111,100,117,108,101,218,8,95,95,100,105,99,116,95,95, - 218,4,101,120,101,99,114,26,0,0,0,218,11,73,109,112, - 111,114,116,69,114,114,111,114,114,45,0,0,0,218,16,95, - 118,101,114,98,111,115,101,95,109,101,115,115,97,103,101,41, - 8,114,32,0,0,0,114,38,0,0,0,114,50,0,0,0, - 114,51,0,0,0,114,40,0,0,0,90,3,109,111,100,114, - 13,0,0,0,114,66,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,11,108,111,97,100,95,109, - 111,100,117,108,101,8,1,0,0,115,50,0,0,0,16,9, - 12,1,18,1,8,1,10,1,6,1,2,2,4,1,10,3, - 14,1,8,1,10,2,6,1,16,1,16,1,6,1,8,1, - 2,1,2,2,14,1,12,1,18,1,14,1,4,1,255,128, - 122,23,122,105,112,105,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,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0, - 0,0,115,64,0,0,0,122,20,124,0,160,0,124,1,161, - 1,115,18,87,0,100,1,83,0,87,0,110,20,4,0,116, - 1,121,40,1,0,1,0,1,0,89,0,100,1,83,0,48, - 0,100,2,100,3,108,2,109,3,125,2,1,0,124,2,124, - 0,124,1,131,2,83,0,41,4,122,204,82,101,116,117,114, - 110,32,116,104,101,32,82,101,115,111,117,114,99,101,82,101, - 97,100,101,114,32,102,111,114,32,97,32,112,97,99,107,97, - 103,101,32,105,110,32,97,32,122,105,112,32,102,105,108,101, - 46,10,10,32,32,32,32,32,32,32,32,73,102,32,39,102, - 117,108,108,110,97,109,101,39,32,105,115,32,97,32,112,97, - 99,107,97,103,101,32,119,105,116,104,105,110,32,116,104,101, - 32,122,105,112,32,102,105,108,101,44,32,114,101,116,117,114, - 110,32,116,104,101,10,32,32,32,32,32,32,32,32,39,82, - 101,115,111,117,114,99,101,82,101,97,100,101,114,39,32,111, - 98,106,101,99,116,32,102,111,114,32,116,104,101,32,112,97, - 99,107,97,103,101,46,32,32,79,116,104,101,114,119,105,115, - 101,32,114,101,116,117,114,110,32,78,111,110,101,46,10,32, - 32,32,32,32,32,32,32,78,114,0,0,0,0,41,1,218, - 9,90,105,112,82,101,97,100,101,114,41,4,114,43,0,0, - 0,114,3,0,0,0,90,17,105,109,112,111,114,116,108,105, - 98,46,114,101,97,100,101,114,115,114,80,0,0,0,41,3, - 114,32,0,0,0,114,38,0,0,0,114,80,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,19, - 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, - 100,101,114,48,1,0,0,115,16,0,0,0,2,6,10,1, - 10,1,12,1,8,1,12,1,10,1,255,128,122,31,122,105, - 112,105,109,112,111,114,116,101,114,46,103,101,116,95,114,101, - 115,111,117,114,99,101,95,114,101,97,100,101,114,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0, - 0,0,67,0,0,0,115,24,0,0,0,100,1,124,0,106, - 0,155,0,116,1,155,0,124,0,106,2,155,0,100,2,157, - 5,83,0,41,3,78,122,21,60,122,105,112,105,109,112,111, - 114,116,101,114,32,111,98,106,101,99,116,32,34,122,2,34, - 62,41,3,114,29,0,0,0,114,20,0,0,0,114,31,0, - 0,0,41,1,114,32,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,8,95,95,114,101,112,114, - 95,95,63,1,0,0,115,4,0,0,0,24,1,255,128,122, - 20,122,105,112,105,109,112,111,114,116,101,114,46,95,95,114, - 101,112,114,95,95,41,1,78,41,1,78,41,1,78,41,16, - 114,6,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 7,95,95,100,111,99,95,95,114,34,0,0,0,114,41,0, - 0,0,114,42,0,0,0,114,46,0,0,0,114,52,0,0, - 0,114,59,0,0,0,114,60,0,0,0,114,67,0,0,0, - 114,43,0,0,0,114,79,0,0,0,114,81,0,0,0,114, - 82,0,0,0,114,9,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,4,0,0,0,45,0,0, - 0,115,30,0,0,0,8,0,4,1,8,17,10,46,10,34, - 10,13,8,27,8,10,8,21,8,11,8,26,8,13,8,40, - 12,15,255,128,122,12,95,95,105,110,105,116,95,95,46,112, - 121,99,84,114,63,0,0,0,70,41,3,122,4,46,112,121, - 99,84,70,41,3,114,64,0,0,0,70,70,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,20,0,0,0,124,0,106,0,124,1, - 160,1,100,1,161,1,100,2,25,0,23,0,83,0,41,3, - 78,218,1,46,233,2,0,0,0,41,2,114,31,0,0,0, - 218,10,114,112,97,114,116,105,116,105,111,110,41,2,114,32, - 0,0,0,114,38,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,114,36,0,0,0,81,1,0,0, - 115,4,0,0,0,20,1,255,128,114,36,0,0,0,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2, - 0,0,0,67,0,0,0,115,18,0,0,0,124,1,116,0, - 23,0,125,2,124,2,124,0,106,1,118,0,83,0,169,1, - 78,41,2,114,20,0,0,0,114,28,0,0,0,41,3,114, - 32,0,0,0,114,13,0,0,0,90,7,100,105,114,112,97, - 116,104,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,37,0,0,0,85,1,0,0,115,6,0,0,0,8, - 4,10,2,255,128,114,37,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,7,0,0,0,4,0,0,0,67, - 0,0,0,115,54,0,0,0,116,0,124,0,124,1,131,2, - 125,2,116,1,68,0,93,34,92,3,125,3,125,4,125,5, - 124,2,124,3,23,0,125,6,124,6,124,0,106,2,118,0, - 114,14,124,5,2,0,1,0,83,0,100,0,83,0,114,87, - 0,0,0,41,3,114,36,0,0,0,218,16,95,122,105,112, - 95,115,101,97,114,99,104,111,114,100,101,114,114,28,0,0, - 0,41,7,114,32,0,0,0,114,38,0,0,0,114,13,0, - 0,0,218,6,115,117,102,102,105,120,218,10,105,115,98,121, - 116,101,99,111,100,101,114,51,0,0,0,114,66,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, - 35,0,0,0,94,1,0,0,115,14,0,0,0,10,1,14, - 1,8,1,10,1,8,1,4,1,255,128,114,35,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,26,0,0, - 0,9,0,0,0,67,0,0,0,115,230,4,0,0,122,14, - 116,0,160,1,124,0,161,1,125,1,87,0,110,32,4,0, - 116,2,121,46,1,0,1,0,1,0,116,3,100,1,124,0, - 155,2,157,2,124,0,100,2,141,2,130,1,48,0,124,1, - 144,4,143,140,1,0,122,36,124,1,160,4,116,5,11,0, - 100,3,161,2,1,0,124,1,160,6,161,0,125,2,124,1, - 160,7,116,5,161,1,125,3,87,0,110,32,4,0,116,2, - 121,124,1,0,1,0,1,0,116,3,100,4,124,0,155,2, - 157,2,124,0,100,2,141,2,130,1,48,0,116,8,124,3, - 131,1,116,5,107,3,114,156,116,3,100,4,124,0,155,2, - 157,2,124,0,100,2,141,2,130,1,124,3,100,0,100,5, - 133,2,25,0,116,9,107,3,144,1,114,154,122,24,124,1, - 160,4,100,6,100,3,161,2,1,0,124,1,160,6,161,0, - 125,4,87,0,110,32,4,0,116,2,121,230,1,0,1,0, - 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,48,0,116,10,124,4,116,11,24,0,116,5, - 24,0,100,6,131,2,125,5,122,22,124,1,160,4,124,5, - 161,1,1,0,124,1,160,7,161,0,125,6,87,0,110,34, - 4,0,116,2,144,1,121,50,1,0,1,0,1,0,116,3, - 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, - 48,0,124,6,160,12,116,9,161,1,125,7,124,7,100,6, - 107,0,144,1,114,90,116,3,100,7,124,0,155,2,157,2, - 124,0,100,2,141,2,130,1,124,6,124,7,124,7,116,5, - 23,0,133,2,25,0,125,3,116,8,124,3,131,1,116,5, - 107,3,144,1,114,138,116,3,100,8,124,0,155,2,157,2, - 124,0,100,2,141,2,130,1,124,4,116,8,124,6,131,1, - 24,0,124,7,23,0,125,2,116,13,124,3,100,9,100,10, - 133,2,25,0,131,1,125,8,116,13,124,3,100,10,100,11, - 133,2,25,0,131,1,125,9,124,2,124,8,107,0,144,1, - 114,214,116,3,100,12,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,124,2,124,9,107,0,144,1,114,242,116,3, - 100,13,124,0,155,2,157,2,124,0,100,2,141,2,130,1, - 124,2,124,8,56,0,125,2,124,2,124,9,24,0,125,10, - 124,10,100,6,107,0,144,2,114,30,116,3,100,14,124,0, - 155,2,157,2,124,0,100,2,141,2,130,1,105,0,125,11, - 100,6,125,12,122,14,124,1,160,4,124,2,161,1,1,0, - 87,0,110,34,4,0,116,2,144,2,121,86,1,0,1,0, - 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,48,0,124,1,160,7,100,15,161,1,125,3, - 116,8,124,3,131,1,100,5,107,0,144,2,114,120,116,14, - 100,16,131,1,130,1,124,3,100,0,100,5,133,2,25,0, - 100,17,107,3,144,2,114,142,144,4,113,180,116,8,124,3, - 131,1,100,15,107,3,144,2,114,164,116,14,100,16,131,1, - 130,1,116,15,124,3,100,18,100,19,133,2,25,0,131,1, - 125,13,116,15,124,3,100,19,100,9,133,2,25,0,131,1, - 125,14,116,15,124,3,100,9,100,20,133,2,25,0,131,1, - 125,15,116,15,124,3,100,20,100,10,133,2,25,0,131,1, - 125,16,116,13,124,3,100,10,100,11,133,2,25,0,131,1, - 125,17,116,13,124,3,100,11,100,21,133,2,25,0,131,1, - 125,18,116,13,124,3,100,21,100,22,133,2,25,0,131,1, - 125,4,116,15,124,3,100,22,100,23,133,2,25,0,131,1, - 125,19,116,15,124,3,100,23,100,24,133,2,25,0,131,1, - 125,20,116,15,124,3,100,24,100,25,133,2,25,0,131,1, - 125,21,116,13,124,3,100,26,100,15,133,2,25,0,131,1, - 125,22,124,19,124,20,23,0,124,21,23,0,125,8,124,22, - 124,9,107,4,144,3,114,124,116,3,100,27,124,0,155,2, - 157,2,124,0,100,2,141,2,130,1,124,22,124,10,55,0, - 125,22,122,14,124,1,160,7,124,19,161,1,125,23,87,0, - 110,34,4,0,116,2,144,3,121,180,1,0,1,0,1,0, - 116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,2, - 130,1,48,0,116,8,124,23,131,1,124,19,107,3,144,3, - 114,214,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,122,50,116,8,124,1,160,7,124,8,124,19, - 24,0,161,1,131,1,124,8,124,19,24,0,107,3,144,4, - 114,6,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,87,0,110,34,4,0,116,2,144,4,121,42, - 1,0,1,0,1,0,116,3,100,4,124,0,155,2,157,2, - 124,0,100,2,141,2,130,1,48,0,124,13,100,28,64,0, - 144,4,114,64,124,23,160,16,161,0,125,23,110,52,122,14, - 124,23,160,16,100,29,161,1,125,23,87,0,110,36,4,0, - 116,17,144,4,121,114,1,0,1,0,1,0,124,23,160,16, - 100,30,161,1,160,18,116,19,161,1,125,23,89,0,110,2, - 48,0,124,23,160,20,100,31,116,21,161,2,125,23,116,22, - 160,23,124,0,124,23,161,2,125,24,124,24,124,14,124,18, - 124,4,124,22,124,15,124,16,124,17,102,8,125,25,124,25, - 124,11,124,23,60,0,124,12,100,32,55,0,125,12,144,2, - 113,88,87,0,100,0,4,0,4,0,131,3,1,0,110,18, - 49,0,144,4,115,202,48,0,1,0,1,0,1,0,89,0, - 1,0,116,24,160,25,100,33,124,12,124,0,161,3,1,0, - 124,11,83,0,41,34,78,122,21,99,97,110,39,116,32,111, - 112,101,110,32,90,105,112,32,102,105,108,101,58,32,114,12, - 0,0,0,114,85,0,0,0,250,21,99,97,110,39,116,32, - 114,101,97,100,32,90,105,112,32,102,105,108,101,58,32,233, - 4,0,0,0,114,0,0,0,0,122,16,110,111,116,32,97, - 32,90,105,112,32,102,105,108,101,58,32,122,18,99,111,114, - 114,117,112,116,32,90,105,112,32,102,105,108,101,58,32,233, - 12,0,0,0,233,16,0,0,0,233,20,0,0,0,122,28, - 98,97,100,32,99,101,110,116,114,97,108,32,100,105,114,101, - 99,116,111,114,121,32,115,105,122,101,58,32,122,30,98,97, - 100,32,99,101,110,116,114,97,108,32,100,105,114,101,99,116, - 111,114,121,32,111,102,102,115,101,116,58,32,122,38,98,97, - 100,32,99,101,110,116,114,97,108,32,100,105,114,101,99,116, - 111,114,121,32,115,105,122,101,32,111,114,32,111,102,102,115, - 101,116,58,32,233,46,0,0,0,250,27,69,79,70,32,114, - 101,97,100,32,119,104,101,114,101,32,110,111,116,32,101,120, - 112,101,99,116,101,100,115,4,0,0,0,80,75,1,2,233, - 8,0,0,0,233,10,0,0,0,233,14,0,0,0,233,24, - 0,0,0,233,28,0,0,0,233,30,0,0,0,233,32,0, - 0,0,233,34,0,0,0,233,42,0,0,0,122,25,98,97, - 100,32,108,111,99,97,108,32,104,101,97,100,101,114,32,111, - 102,102,115,101,116,58,32,105,0,8,0,0,218,5,97,115, - 99,105,105,90,6,108,97,116,105,110,49,250,1,47,114,5, - 0,0,0,122,33,122,105,112,105,109,112,111,114,116,58,32, - 102,111,117,110,100,32,123,125,32,110,97,109,101,115,32,105, - 110,32,123,33,114,125,41,26,218,3,95,105,111,218,9,111, - 112,101,110,95,99,111,100,101,114,22,0,0,0,114,3,0, - 0,0,218,4,115,101,101,107,218,20,69,78,68,95,67,69, - 78,84,82,65,76,95,68,73,82,95,83,73,90,69,90,4, - 116,101,108,108,218,4,114,101,97,100,114,55,0,0,0,218, - 18,83,84,82,73,78,71,95,69,78,68,95,65,82,67,72, - 73,86,69,218,3,109,97,120,218,15,77,65,88,95,67,79, - 77,77,69,78,84,95,76,69,78,218,5,114,102,105,110,100, - 114,2,0,0,0,218,8,69,79,70,69,114,114,111,114,114, - 1,0,0,0,114,65,0,0,0,218,18,85,110,105,99,111, - 100,101,68,101,99,111,100,101,69,114,114,111,114,218,9,116, - 114,97,110,115,108,97,116,101,218,11,99,112,52,51,55,95, - 116,97,98,108,101,114,19,0,0,0,114,20,0,0,0,114, - 21,0,0,0,114,30,0,0,0,114,45,0,0,0,114,78, - 0,0,0,41,26,114,29,0,0,0,218,2,102,112,90,15, - 104,101,97,100,101,114,95,112,111,115,105,116,105,111,110,218, - 6,98,117,102,102,101,114,218,9,102,105,108,101,95,115,105, - 122,101,90,17,109,97,120,95,99,111,109,109,101,110,116,95, - 115,116,97,114,116,218,4,100,97,116,97,90,3,112,111,115, - 218,11,104,101,97,100,101,114,95,115,105,122,101,90,13,104, - 101,97,100,101,114,95,111,102,102,115,101,116,90,10,97,114, - 99,95,111,102,102,115,101,116,114,33,0,0,0,218,5,99, - 111,117,110,116,218,5,102,108,97,103,115,218,8,99,111,109, - 112,114,101,115,115,218,4,116,105,109,101,218,4,100,97,116, - 101,218,3,99,114,99,218,9,100,97,116,97,95,115,105,122, - 101,218,9,110,97,109,101,95,115,105,122,101,218,10,101,120, - 116,114,97,95,115,105,122,101,90,12,99,111,109,109,101,110, - 116,95,115,105,122,101,218,11,102,105,108,101,95,111,102,102, - 115,101,116,114,44,0,0,0,114,13,0,0,0,218,1,116, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, - 27,0,0,0,125,1,0,0,115,214,0,0,0,2,1,14, - 1,12,1,20,1,8,2,2,1,14,1,8,1,14,1,12, - 1,20,1,12,1,18,1,18,1,2,3,12,1,12,1,12, - 1,10,1,2,1,8,255,8,2,2,1,2,255,2,1,4, - 255,2,2,10,1,12,1,14,1,10,1,2,1,8,255,10, - 2,10,1,10,1,2,1,6,255,16,2,14,1,10,1,2, - 1,6,255,16,2,16,2,16,1,10,1,18,1,10,1,18, - 1,8,1,8,1,10,1,18,1,4,2,4,2,2,1,14, - 1,14,1,20,1,10,2,14,1,8,1,18,2,4,1,14, - 1,8,1,16,1,16,1,16,1,16,1,16,1,16,1,16, - 1,16,1,16,1,16,1,16,1,12,1,10,1,18,1,8, - 1,2,2,14,1,14,1,20,1,14,1,18,1,2,4,28, - 1,22,1,14,1,20,1,10,2,10,2,2,3,14,1,14, - 1,22,1,12,2,12,1,20,1,8,1,44,1,14,1,4, - 1,255,128,114,27,0,0,0,117,190,1,0,0,0,1,2, - 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, - 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34, - 35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50, - 51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66, - 67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82, - 83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98, - 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114, - 115,116,117,118,119,120,121,122,123,124,125,126,127,195,135,195, - 188,195,169,195,162,195,164,195,160,195,165,195,167,195,170,195, - 171,195,168,195,175,195,174,195,172,195,132,195,133,195,137,195, - 166,195,134,195,180,195,182,195,178,195,187,195,185,195,191,195, - 150,195,156,194,162,194,163,194,165,226,130,167,198,146,195,161, - 195,173,195,179,195,186,195,177,195,145,194,170,194,186,194,191, - 226,140,144,194,172,194,189,194,188,194,161,194,171,194,187,226, - 150,145,226,150,146,226,150,147,226,148,130,226,148,164,226,149, - 161,226,149,162,226,149,150,226,149,149,226,149,163,226,149,145, - 226,149,151,226,149,157,226,149,156,226,149,155,226,148,144,226, - 148,148,226,148,180,226,148,172,226,148,156,226,148,128,226,148, - 188,226,149,158,226,149,159,226,149,154,226,149,148,226,149,169, - 226,149,166,226,149,160,226,149,144,226,149,172,226,149,167,226, - 149,168,226,149,164,226,149,165,226,149,153,226,149,152,226,149, - 146,226,149,147,226,149,171,226,149,170,226,148,152,226,148,140, - 226,150,136,226,150,132,226,150,140,226,150,144,226,150,128,206, - 177,195,159,206,147,207,128,206,163,207,131,194,181,207,132,206, - 166,206,152,206,169,206,180,226,136,158,207,134,206,181,226,136, - 169,226,137,161,194,177,226,137,165,226,137,164,226,140,160,226, - 140,161,195,183,226,137,136,194,176,226,136,153,194,183,226,136, - 154,226,129,191,194,178,226,150,160,194,160,99,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0, - 67,0,0,0,115,106,0,0,0,116,0,114,22,116,1,160, - 2,100,1,161,1,1,0,116,3,100,2,131,1,130,1,100, - 3,97,0,122,58,122,16,100,4,100,5,108,4,109,5,125, - 0,1,0,87,0,110,32,4,0,116,6,121,76,1,0,1, - 0,1,0,116,1,160,2,100,1,161,1,1,0,116,3,100, - 2,131,1,130,1,48,0,87,0,100,6,97,0,110,6,100, - 6,97,0,48,0,116,1,160,2,100,7,161,1,1,0,124, - 0,83,0,41,8,78,122,27,122,105,112,105,109,112,111,114, - 116,58,32,122,108,105,98,32,85,78,65,86,65,73,76,65, - 66,76,69,250,41,99,97,110,39,116,32,100,101,99,111,109, - 112,114,101,115,115,32,100,97,116,97,59,32,122,108,105,98, - 32,110,111,116,32,97,118,97,105,108,97,98,108,101,84,114, - 0,0,0,0,169,1,218,10,100,101,99,111,109,112,114,101, - 115,115,70,122,25,122,105,112,105,109,112,111,114,116,58,32, - 122,108,105,98,32,97,118,97,105,108,97,98,108,101,41,7, - 218,15,95,105,109,112,111,114,116,105,110,103,95,122,108,105, - 98,114,45,0,0,0,114,78,0,0,0,114,3,0,0,0, - 90,4,122,108,105,98,114,140,0,0,0,218,9,69,120,99, - 101,112,116,105,111,110,114,139,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,20,95,103,101,116, - 95,100,101,99,111,109,112,114,101,115,115,95,102,117,110,99, - 27,2,0,0,115,26,0,0,0,4,2,10,3,8,1,4, - 2,4,1,16,1,12,1,10,1,12,1,12,2,10,2,4, - 1,255,128,114,143,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,17,0,0,0,9,0,0,0,67,0,0, - 0,115,132,1,0,0,124,1,92,8,125,2,125,3,125,4, - 125,5,125,6,125,7,125,8,125,9,124,4,100,1,107,0, - 114,36,116,0,100,2,131,1,130,1,116,1,160,2,124,0, - 161,1,144,1,143,6,125,10,122,14,124,10,160,3,124,6, - 161,1,1,0,87,0,110,32,4,0,116,4,121,96,1,0, - 1,0,1,0,116,0,100,3,124,0,155,2,157,2,124,0, - 100,4,141,2,130,1,48,0,124,10,160,5,100,5,161,1, - 125,11,116,6,124,11,131,1,100,5,107,3,114,128,116,7, - 100,6,131,1,130,1,124,11,100,0,100,7,133,2,25,0, - 100,8,107,3,114,162,116,0,100,9,124,0,155,2,157,2, - 124,0,100,4,141,2,130,1,116,8,124,11,100,10,100,11, - 133,2,25,0,131,1,125,12,116,8,124,11,100,11,100,5, - 133,2,25,0,131,1,125,13,100,5,124,12,23,0,124,13, - 23,0,125,14,124,6,124,14,55,0,125,6,122,14,124,10, - 160,3,124,6,161,1,1,0,87,0,110,34,4,0,116,4, - 144,1,121,6,1,0,1,0,1,0,116,0,100,3,124,0, - 155,2,157,2,124,0,100,4,141,2,130,1,48,0,124,10, - 160,5,124,4,161,1,125,15,116,6,124,15,131,1,124,4, - 107,3,144,1,114,40,116,4,100,12,131,1,130,1,87,0, - 100,0,4,0,4,0,131,3,1,0,110,18,49,0,144,1, - 115,62,48,0,1,0,1,0,1,0,89,0,1,0,124,3, - 100,1,107,2,144,1,114,86,124,15,83,0,122,10,116,9, - 131,0,125,16,87,0,110,24,4,0,116,10,144,1,121,120, - 1,0,1,0,1,0,116,0,100,13,131,1,130,1,48,0, - 124,16,124,15,100,14,131,2,83,0,41,15,78,114,0,0, - 0,0,122,18,110,101,103,97,116,105,118,101,32,100,97,116, - 97,32,115,105,122,101,114,91,0,0,0,114,12,0,0,0, - 114,103,0,0,0,114,97,0,0,0,114,92,0,0,0,115, - 4,0,0,0,80,75,3,4,122,23,98,97,100,32,108,111, - 99,97,108,32,102,105,108,101,32,104,101,97,100,101,114,58, - 32,233,26,0,0,0,114,102,0,0,0,122,26,122,105,112, - 105,109,112,111,114,116,58,32,99,97,110,39,116,32,114,101, - 97,100,32,100,97,116,97,114,138,0,0,0,105,241,255,255, - 255,41,11,114,3,0,0,0,114,109,0,0,0,114,110,0, - 0,0,114,111,0,0,0,114,22,0,0,0,114,113,0,0, - 0,114,55,0,0,0,114,118,0,0,0,114,1,0,0,0, - 114,143,0,0,0,114,142,0,0,0,41,17,114,29,0,0, - 0,114,58,0,0,0,90,8,100,97,116,97,112,97,116,104, - 114,129,0,0,0,114,133,0,0,0,114,124,0,0,0,114, - 136,0,0,0,114,130,0,0,0,114,131,0,0,0,114,132, - 0,0,0,114,122,0,0,0,114,123,0,0,0,114,134,0, - 0,0,114,135,0,0,0,114,126,0,0,0,90,8,114,97, - 119,95,100,97,116,97,114,140,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,114,56,0,0,0,48, - 2,0,0,115,64,0,0,0,20,1,8,1,8,1,14,2, - 2,2,14,1,12,1,20,1,10,1,12,1,8,1,16,2, - 18,2,16,2,16,1,12,1,8,1,2,1,14,1,14,1, - 20,1,10,1,14,1,40,1,10,2,4,2,2,3,10,1, - 14,1,10,1,10,1,255,128,114,56,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,16,0,0,0,116,0,124,0,124, - 1,24,0,131,1,100,1,107,1,83,0,41,2,78,114,5, - 0,0,0,41,1,218,3,97,98,115,41,2,90,2,116,49, - 90,2,116,50,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,9,95,101,113,95,109,116,105,109,101,94,2, - 0,0,115,4,0,0,0,16,2,255,128,114,146,0,0,0, - 99,5,0,0,0,0,0,0,0,0,0,0,0,14,0,0, - 0,8,0,0,0,67,0,0,0,115,60,1,0,0,124,3, - 124,2,100,1,156,2,125,5,122,18,116,0,160,1,124,4, - 124,3,124,5,161,3,125,6,87,0,110,20,4,0,116,2, - 121,48,1,0,1,0,1,0,89,0,100,0,83,0,48,0, - 124,6,100,2,64,0,100,3,107,3,125,7,124,7,114,182, - 124,6,100,4,64,0,100,3,107,3,125,8,116,3,106,4, - 100,5,107,3,144,1,114,10,124,8,115,106,116,3,106,4, - 100,6,107,2,144,1,114,10,116,5,124,0,124,2,131,2, - 125,9,124,9,100,0,117,1,144,1,114,10,116,3,160,6, - 116,0,106,7,124,9,161,2,125,10,122,20,116,0,160,8, - 124,4,124,10,124,3,124,5,161,4,1,0,87,0,110,104, - 4,0,116,2,121,180,1,0,1,0,1,0,89,0,100,0, - 83,0,48,0,116,9,124,0,124,2,131,2,92,2,125,11, - 125,12,124,11,144,1,114,10,116,10,116,11,124,4,100,7, - 100,8,133,2,25,0,131,1,124,11,131,2,114,246,116,11, - 124,4,100,8,100,9,133,2,25,0,131,1,124,12,107,3, - 144,1,114,10,116,12,160,13,100,10,124,3,155,2,157,2, - 161,1,1,0,100,0,83,0,116,14,160,15,124,4,100,9, - 100,0,133,2,25,0,161,1,125,13,116,16,124,13,116,17, - 131,2,144,1,115,56,116,18,100,11,124,1,155,2,100,12, - 157,3,131,1,130,1,124,13,83,0,41,13,78,41,2,114, - 44,0,0,0,114,13,0,0,0,114,5,0,0,0,114,0, - 0,0,0,114,85,0,0,0,90,5,110,101,118,101,114,90, - 6,97,108,119,97,121,115,114,98,0,0,0,114,93,0,0, - 0,114,94,0,0,0,122,22,98,121,116,101,99,111,100,101, - 32,105,115,32,115,116,97,108,101,32,102,111,114,32,122,16, - 99,111,109,112,105,108,101,100,32,109,111,100,117,108,101,32, - 122,21,32,105,115,32,110,111,116,32,97,32,99,111,100,101, - 32,111,98,106,101,99,116,41,19,114,21,0,0,0,90,13, - 95,99,108,97,115,115,105,102,121,95,112,121,99,114,77,0, - 0,0,218,4,95,105,109,112,90,21,99,104,101,99,107,95, - 104,97,115,104,95,98,97,115,101,100,95,112,121,99,115,218, - 15,95,103,101,116,95,112,121,99,95,115,111,117,114,99,101, - 218,11,115,111,117,114,99,101,95,104,97,115,104,90,17,95, - 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, - 90,18,95,118,97,108,105,100,97,116,101,95,104,97,115,104, - 95,112,121,99,218,29,95,103,101,116,95,109,116,105,109,101, - 95,97,110,100,95,115,105,122,101,95,111,102,95,115,111,117, - 114,99,101,114,146,0,0,0,114,2,0,0,0,114,45,0, - 0,0,114,78,0,0,0,218,7,109,97,114,115,104,97,108, - 90,5,108,111,97,100,115,114,15,0,0,0,218,10,95,99, - 111,100,101,95,116,121,112,101,218,9,84,121,112,101,69,114, - 114,111,114,41,14,114,32,0,0,0,114,57,0,0,0,114, - 66,0,0,0,114,38,0,0,0,114,125,0,0,0,90,11, - 101,120,99,95,100,101,116,97,105,108,115,114,128,0,0,0, - 90,10,104,97,115,104,95,98,97,115,101,100,90,12,99,104, - 101,99,107,95,115,111,117,114,99,101,90,12,115,111,117,114, - 99,101,95,98,121,116,101,115,114,149,0,0,0,90,12,115, - 111,117,114,99,101,95,109,116,105,109,101,90,11,115,111,117, - 114,99,101,95,115,105,122,101,114,50,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,15,95,117, - 110,109,97,114,115,104,97,108,95,99,111,100,101,104,2,0, - 0,115,84,0,0,0,2,2,2,1,6,254,2,5,18,1, - 12,1,8,1,12,2,4,1,12,1,12,1,2,1,2,255, - 8,1,4,255,10,2,10,1,4,1,4,1,2,1,4,254, - 2,5,4,1,8,1,8,255,12,2,8,1,8,3,6,255, - 6,3,22,3,18,1,4,255,4,2,8,1,4,255,4,2, - 18,2,12,1,16,1,4,1,255,128,114,154,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 4,0,0,0,67,0,0,0,115,28,0,0,0,124,0,160, - 0,100,1,100,2,161,2,125,0,124,0,160,0,100,3,100, - 2,161,2,125,0,124,0,83,0,41,4,78,115,2,0,0, - 0,13,10,243,1,0,0,0,10,243,1,0,0,0,13,41, - 1,114,19,0,0,0,41,1,218,6,115,111,117,114,99,101, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 23,95,110,111,114,109,97,108,105,122,101,95,108,105,110,101, - 95,101,110,100,105,110,103,115,155,2,0,0,115,8,0,0, - 0,12,1,12,1,4,1,255,128,114,158,0,0,0,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,6, - 0,0,0,67,0,0,0,115,24,0,0,0,116,0,124,1, - 131,1,125,1,116,1,124,1,124,0,100,1,100,2,100,3, - 141,4,83,0,41,4,78,114,76,0,0,0,84,41,1,90, - 12,100,111,110,116,95,105,110,104,101,114,105,116,41,2,114, - 158,0,0,0,218,7,99,111,109,112,105,108,101,41,2,114, - 57,0,0,0,114,157,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,15,95,99,111,109,112,105, - 108,101,95,115,111,117,114,99,101,162,2,0,0,115,6,0, - 0,0,8,1,16,1,255,128,114,160,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,11,0, - 0,0,67,0,0,0,115,68,0,0,0,116,0,160,1,124, - 0,100,1,63,0,100,2,23,0,124,0,100,3,63,0,100, - 4,64,0,124,0,100,5,64,0,124,1,100,6,63,0,124, - 1,100,3,63,0,100,7,64,0,124,1,100,5,64,0,100, - 8,20,0,100,9,100,9,100,9,102,9,161,1,83,0,41, - 10,78,233,9,0,0,0,105,188,7,0,0,233,5,0,0, - 0,233,15,0,0,0,233,31,0,0,0,233,11,0,0,0, - 233,63,0,0,0,114,85,0,0,0,114,14,0,0,0,41, - 2,114,130,0,0,0,90,6,109,107,116,105,109,101,41,2, - 218,1,100,114,137,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,14,95,112,97,114,115,101,95, - 100,111,115,116,105,109,101,168,2,0,0,115,20,0,0,0, - 4,1,10,1,10,1,6,1,6,1,10,1,10,1,6,1, - 6,249,255,128,114,168,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,10,0,0,0,67,0, - 0,0,115,110,0,0,0,122,82,124,1,100,1,100,0,133, - 2,25,0,100,2,118,0,115,22,74,0,130,1,124,1,100, - 0,100,1,133,2,25,0,125,1,124,0,106,0,124,1,25, - 0,125,2,124,2,100,3,25,0,125,3,124,2,100,4,25, - 0,125,4,124,2,100,5,25,0,125,5,116,1,124,4,124, - 3,131,2,124,5,102,2,87,0,83,0,4,0,116,2,116, - 3,116,4,102,3,121,108,1,0,1,0,1,0,89,0,100, - 6,83,0,48,0,41,7,78,114,14,0,0,0,169,2,218, - 1,99,218,1,111,114,162,0,0,0,233,6,0,0,0,233, - 3,0,0,0,41,2,114,0,0,0,0,114,0,0,0,0, - 41,5,114,28,0,0,0,114,168,0,0,0,114,26,0,0, - 0,218,10,73,110,100,101,120,69,114,114,111,114,114,153,0, - 0,0,41,6,114,32,0,0,0,114,13,0,0,0,114,58, - 0,0,0,114,130,0,0,0,114,131,0,0,0,90,17,117, - 110,99,111,109,112,114,101,115,115,101,100,95,115,105,122,101, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, - 150,0,0,0,181,2,0,0,115,22,0,0,0,2,1,20, - 2,12,1,10,1,8,3,8,1,8,1,16,1,18,1,8, - 1,255,128,114,150,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, - 0,115,80,0,0,0,124,1,100,1,100,0,133,2,25,0, - 100,2,118,0,115,20,74,0,130,1,124,1,100,0,100,1, - 133,2,25,0,125,1,122,14,124,0,106,0,124,1,25,0, - 125,2,87,0,110,20,4,0,116,1,121,66,1,0,1,0, - 1,0,89,0,100,0,83,0,48,0,116,2,124,0,106,3, - 124,2,131,2,83,0,41,3,78,114,14,0,0,0,114,169, - 0,0,0,41,4,114,28,0,0,0,114,26,0,0,0,114, - 56,0,0,0,114,29,0,0,0,41,3,114,32,0,0,0, - 114,13,0,0,0,114,58,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,148,0,0,0,200,2, - 0,0,115,16,0,0,0,20,2,12,1,2,2,14,1,12, - 1,8,1,12,2,255,128,114,148,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,11,0,0,0,9,0,0, - 0,67,0,0,0,115,190,0,0,0,116,0,124,0,124,1, - 131,2,125,2,116,1,68,0,93,156,92,3,125,3,125,4, - 125,5,124,2,124,3,23,0,125,6,116,2,106,3,100,1, - 124,0,106,4,116,5,124,6,100,2,100,3,141,5,1,0, - 122,14,124,0,106,6,124,6,25,0,125,7,87,0,110,18, - 4,0,116,7,121,86,1,0,1,0,1,0,89,0,113,14, - 48,0,124,7,100,4,25,0,125,8,116,8,124,0,106,4, - 124,7,131,2,125,9,124,4,114,130,116,9,124,0,124,8, - 124,6,124,1,124,9,131,5,125,10,110,10,116,10,124,8, - 124,9,131,2,125,10,124,10,100,0,117,0,114,150,113,14, - 124,7,100,4,25,0,125,8,124,10,124,5,124,8,102,3, - 2,0,1,0,83,0,116,11,100,5,124,1,155,2,157,2, - 124,1,100,6,141,2,130,1,41,7,78,122,13,116,114,121, - 105,110,103,32,123,125,123,125,123,125,114,85,0,0,0,41, - 1,90,9,118,101,114,98,111,115,105,116,121,114,0,0,0, - 0,114,61,0,0,0,114,62,0,0,0,41,12,114,36,0, - 0,0,114,88,0,0,0,114,45,0,0,0,114,78,0,0, - 0,114,29,0,0,0,114,20,0,0,0,114,28,0,0,0, - 114,26,0,0,0,114,56,0,0,0,114,154,0,0,0,114, - 160,0,0,0,114,3,0,0,0,41,11,114,32,0,0,0, - 114,38,0,0,0,114,13,0,0,0,114,89,0,0,0,114, - 90,0,0,0,114,51,0,0,0,114,66,0,0,0,114,58, - 0,0,0,114,40,0,0,0,114,125,0,0,0,114,50,0, + 124,1,100,3,141,2,130,1,124,2,83,0,41,4,122,171, + 105,115,95,112,97,99,107,97,103,101,40,102,117,108,108,110, + 97,109,101,41,32,45,62,32,98,111,111,108,46,10,10,32, + 32,32,32,32,32,32,32,82,101,116,117,114,110,32,84,114, + 117,101,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,115,112,101,99,105,102,105,101,100,32,98,121,32,102,117, + 108,108,110,97,109,101,32,105,115,32,97,32,112,97,99,107, + 97,103,101,46,10,32,32,32,32,32,32,32,32,82,97,105, + 115,101,32,90,105,112,73,109,112,111,114,116,69,114,114,111, + 114,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32, + 99,111,117,108,100,110,39,116,32,98,101,32,102,111,117,110, + 100,46,10,32,32,32,32,32,32,32,32,78,114,61,0,0, + 0,114,62,0,0,0,41,2,114,35,0,0,0,114,3,0, + 0,0,41,3,114,32,0,0,0,114,38,0,0,0,114,39, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,43,0,0,0,251,0,0,0,115,10,0,0,0, + 10,6,8,1,18,1,4,1,255,128,122,22,122,105,112,105, + 109,112,111,114,116,101,114,46,105,115,95,112,97,99,107,97, + 103,101,99,2,0,0,0,0,0,0,0,0,0,0,0,8, + 0,0,0,8,0,0,0,67,0,0,0,115,236,0,0,0, + 116,0,124,0,124,1,131,2,92,3,125,2,125,3,125,4, + 116,1,106,2,160,3,124,1,161,1,125,5,124,5,100,1, + 117,0,115,46,116,4,124,5,116,5,131,2,115,64,116,5, + 124,1,131,1,125,5,124,5,116,1,106,2,124,1,60,0, + 124,0,124,5,95,6,122,84,124,3,114,108,116,7,124,0, + 124,1,131,2,125,6,116,8,160,9,124,0,106,10,124,6, + 161,2,125,7,124,7,103,1,124,5,95,11,116,12,124,5, + 100,2,131,2,115,124,116,13,124,5,95,13,116,8,160,14, + 124,5,106,15,124,1,124,4,161,3,1,0,116,16,124,2, + 124,5,106,15,131,2,1,0,87,0,110,16,1,0,1,0, + 1,0,116,1,106,2,124,1,61,0,130,0,122,14,116,1, + 106,2,124,1,25,0,125,5,87,0,110,30,4,0,116,17, + 121,216,1,0,1,0,1,0,116,18,100,3,124,1,155,2, + 100,4,157,3,131,1,130,1,48,0,116,19,160,20,100,5, + 124,1,124,4,161,3,1,0,124,5,83,0,41,6,97,55, + 1,0,0,108,111,97,100,95,109,111,100,117,108,101,40,102, + 117,108,108,110,97,109,101,41,32,45,62,32,109,111,100,117, + 108,101,46,10,10,32,32,32,32,32,32,32,32,76,111,97, + 100,32,116,104,101,32,109,111,100,117,108,101,32,115,112,101, + 99,105,102,105,101,100,32,98,121,32,39,102,117,108,108,110, + 97,109,101,39,46,32,39,102,117,108,108,110,97,109,101,39, + 32,109,117,115,116,32,98,101,32,116,104,101,10,32,32,32, + 32,32,32,32,32,102,117,108,108,121,32,113,117,97,108,105, + 102,105,101,100,32,40,100,111,116,116,101,100,41,32,109,111, + 100,117,108,101,32,110,97,109,101,46,32,73,116,32,114,101, + 116,117,114,110,115,32,116,104,101,32,105,109,112,111,114,116, + 101,100,10,32,32,32,32,32,32,32,32,109,111,100,117,108, + 101,44,32,111,114,32,114,97,105,115,101,115,32,90,105,112, + 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105, + 116,32,119,97,115,110,39,116,32,102,111,117,110,100,46,10, + 10,32,32,32,32,32,32,32,32,68,101,112,114,101,99,97, + 116,101,100,32,115,105,110,99,101,32,80,121,116,104,111,110, + 32,51,46,49,48,46,32,117,115,101,32,101,120,101,99,95, + 109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,100, + 46,10,32,32,32,32,32,32,32,32,78,218,12,95,95,98, + 117,105,108,116,105,110,115,95,95,122,14,76,111,97,100,101, + 100,32,109,111,100,117,108,101,32,122,25,32,110,111,116,32, + 102,111,117,110,100,32,105,110,32,115,121,115,46,109,111,100, + 117,108,101,115,122,30,105,109,112,111,114,116,32,123,125,32, + 35,32,108,111,97,100,101,100,32,102,114,111,109,32,90,105, + 112,32,123,125,41,21,114,48,0,0,0,218,3,115,121,115, + 218,7,109,111,100,117,108,101,115,218,3,103,101,116,114,15, + 0,0,0,218,12,95,109,111,100,117,108,101,95,116,121,112, + 101,218,10,95,95,108,111,97,100,101,114,95,95,114,36,0, + 0,0,114,21,0,0,0,114,30,0,0,0,114,29,0,0, + 0,90,8,95,95,112,97,116,104,95,95,218,7,104,97,115, + 97,116,116,114,114,68,0,0,0,90,14,95,102,105,120,95, + 117,112,95,109,111,100,117,108,101,218,8,95,95,100,105,99, + 116,95,95,218,4,101,120,101,99,114,26,0,0,0,218,11, + 73,109,112,111,114,116,69,114,114,111,114,114,45,0,0,0, + 218,16,95,118,101,114,98,111,115,101,95,109,101,115,115,97, + 103,101,41,8,114,32,0,0,0,114,38,0,0,0,114,50, + 0,0,0,114,51,0,0,0,114,40,0,0,0,90,3,109, + 111,100,114,13,0,0,0,114,66,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,11,108,111,97, + 100,95,109,111,100,117,108,101,8,1,0,0,115,50,0,0, + 0,16,9,12,1,18,1,8,1,10,1,6,1,2,2,4, + 1,10,3,14,1,8,1,10,2,6,1,16,1,16,1,6, + 1,8,1,2,1,2,2,14,1,12,1,18,1,14,1,4, + 1,255,128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0,0,8,0,0, + 0,67,0,0,0,115,64,0,0,0,122,20,124,0,160,0, + 124,1,161,1,115,18,87,0,100,1,83,0,87,0,110,20, + 4,0,116,1,121,40,1,0,1,0,1,0,89,0,100,1, + 83,0,48,0,100,2,100,3,108,2,109,3,125,2,1,0, + 124,2,124,0,124,1,131,2,83,0,41,4,122,204,82,101, + 116,117,114,110,32,116,104,101,32,82,101,115,111,117,114,99, + 101,82,101,97,100,101,114,32,102,111,114,32,97,32,112,97, + 99,107,97,103,101,32,105,110,32,97,32,122,105,112,32,102, + 105,108,101,46,10,10,32,32,32,32,32,32,32,32,73,102, + 32,39,102,117,108,108,110,97,109,101,39,32,105,115,32,97, + 32,112,97,99,107,97,103,101,32,119,105,116,104,105,110,32, + 116,104,101,32,122,105,112,32,102,105,108,101,44,32,114,101, + 116,117,114,110,32,116,104,101,10,32,32,32,32,32,32,32, + 32,39,82,101,115,111,117,114,99,101,82,101,97,100,101,114, + 39,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101, + 32,112,97,99,107,97,103,101,46,32,32,79,116,104,101,114, + 119,105,115,101,32,114,101,116,117,114,110,32,78,111,110,101, + 46,10,32,32,32,32,32,32,32,32,78,114,0,0,0,0, + 41,1,218,9,90,105,112,82,101,97,100,101,114,41,4,114, + 43,0,0,0,114,3,0,0,0,90,17,105,109,112,111,114, + 116,108,105,98,46,114,101,97,100,101,114,115,114,80,0,0, + 0,41,3,114,32,0,0,0,114,38,0,0,0,114,80,0, 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,48,0,0,0,215,2,0,0,115,38,0,0,0,10, - 1,14,1,8,1,22,1,2,1,14,1,12,1,6,1,8, - 2,12,1,4,1,18,1,10,2,8,1,2,3,8,1,14, - 1,18,2,255,128,114,48,0,0,0,41,45,114,83,0,0, - 0,90,26,95,102,114,111,122,101,110,95,105,109,112,111,114, - 116,108,105,98,95,101,120,116,101,114,110,97,108,114,21,0, - 0,0,114,1,0,0,0,114,2,0,0,0,90,17,95,102, - 114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,114, - 45,0,0,0,114,147,0,0,0,114,109,0,0,0,114,151, - 0,0,0,114,69,0,0,0,114,130,0,0,0,90,7,95, - 95,97,108,108,95,95,114,20,0,0,0,90,15,112,97,116, - 104,95,115,101,112,97,114,97,116,111,114,115,114,18,0,0, - 0,114,77,0,0,0,114,3,0,0,0,114,25,0,0,0, - 218,4,116,121,112,101,114,72,0,0,0,114,112,0,0,0, - 114,114,0,0,0,114,116,0,0,0,90,13,95,76,111,97, - 100,101,114,66,97,115,105,99,115,114,4,0,0,0,114,88, - 0,0,0,114,36,0,0,0,114,37,0,0,0,114,35,0, - 0,0,114,27,0,0,0,114,121,0,0,0,114,141,0,0, - 0,114,143,0,0,0,114,56,0,0,0,114,146,0,0,0, - 114,154,0,0,0,218,8,95,95,99,111,100,101,95,95,114, - 152,0,0,0,114,158,0,0,0,114,160,0,0,0,114,168, - 0,0,0,114,150,0,0,0,114,148,0,0,0,114,48,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,8,60,109,111,100,117,108,101,62, - 1,0,0,0,115,92,0,0,0,4,0,8,16,16,1,8, - 1,8,1,8,1,8,1,8,1,8,1,8,2,6,3,14, - 1,16,3,4,4,8,2,4,2,4,1,4,1,18,2,0, - 127,0,127,12,30,12,1,2,1,2,1,4,252,8,9,8, - 4,8,9,8,31,2,126,2,254,4,29,8,5,8,21,8, - 46,8,10,10,46,8,5,8,7,8,6,8,13,8,19,8, - 15,4,128,255,128, + 0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95, + 114,101,97,100,101,114,48,1,0,0,115,16,0,0,0,2, + 6,10,1,10,1,12,1,8,1,12,1,10,1,255,128,122, + 31,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, + 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,5,0,0,0,67,0,0,0,115,24,0,0,0,100,1, + 124,0,106,0,155,0,116,1,155,0,124,0,106,2,155,0, + 100,2,157,5,83,0,41,3,78,122,21,60,122,105,112,105, + 109,112,111,114,116,101,114,32,111,98,106,101,99,116,32,34, + 122,2,34,62,41,3,114,29,0,0,0,114,20,0,0,0, + 114,31,0,0,0,41,1,114,32,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,8,95,95,114, + 101,112,114,95,95,63,1,0,0,115,4,0,0,0,24,1, + 255,128,122,20,122,105,112,105,109,112,111,114,116,101,114,46, + 95,95,114,101,112,114,95,95,41,1,78,41,1,78,41,1, + 78,41,16,114,6,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,7,95,95,100,111,99,95,95,114,34,0,0,0, + 114,41,0,0,0,114,42,0,0,0,114,46,0,0,0,114, + 52,0,0,0,114,59,0,0,0,114,60,0,0,0,114,67, + 0,0,0,114,43,0,0,0,114,79,0,0,0,114,81,0, + 0,0,114,82,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,114,4,0,0,0, + 45,0,0,0,115,30,0,0,0,8,0,4,1,8,17,10, + 46,10,34,10,13,8,27,8,10,8,21,8,11,8,26,8, + 13,8,40,12,15,255,128,122,12,95,95,105,110,105,116,95, + 95,46,112,121,99,84,114,63,0,0,0,70,41,3,122,4, + 46,112,121,99,84,70,41,3,114,64,0,0,0,70,70,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,67,0,0,0,115,20,0,0,0,124,0,106, + 0,124,1,160,1,100,1,161,1,100,2,25,0,23,0,83, + 0,41,3,78,218,1,46,233,2,0,0,0,41,2,114,31, + 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,41, + 2,114,32,0,0,0,114,38,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,36,0,0,0,81, + 1,0,0,115,4,0,0,0,20,1,255,128,114,36,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,2,0,0,0,67,0,0,0,115,18,0,0,0,124, + 1,116,0,23,0,125,2,124,2,124,0,106,1,118,0,83, + 0,169,1,78,41,2,114,20,0,0,0,114,28,0,0,0, + 41,3,114,32,0,0,0,114,13,0,0,0,90,7,100,105, + 114,112,97,116,104,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,37,0,0,0,85,1,0,0,115,6,0, + 0,0,8,4,10,2,255,128,114,37,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,7,0,0,0,4,0, + 0,0,67,0,0,0,115,54,0,0,0,116,0,124,0,124, + 1,131,2,125,2,116,1,68,0,93,34,92,3,125,3,125, + 4,125,5,124,2,124,3,23,0,125,6,124,6,124,0,106, + 2,118,0,114,14,124,5,2,0,1,0,83,0,100,0,83, + 0,114,87,0,0,0,41,3,114,36,0,0,0,218,16,95, + 122,105,112,95,115,101,97,114,99,104,111,114,100,101,114,114, + 28,0,0,0,41,7,114,32,0,0,0,114,38,0,0,0, + 114,13,0,0,0,218,6,115,117,102,102,105,120,218,10,105, + 115,98,121,116,101,99,111,100,101,114,51,0,0,0,114,66, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,35,0,0,0,94,1,0,0,115,14,0,0,0, + 10,1,14,1,8,1,10,1,8,1,4,1,255,128,114,35, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 26,0,0,0,9,0,0,0,67,0,0,0,115,230,4,0, + 0,122,14,116,0,160,1,124,0,161,1,125,1,87,0,110, + 32,4,0,116,2,121,46,1,0,1,0,1,0,116,3,100, + 1,124,0,155,2,157,2,124,0,100,2,141,2,130,1,48, + 0,124,1,144,4,143,140,1,0,122,36,124,1,160,4,116, + 5,11,0,100,3,161,2,1,0,124,1,160,6,161,0,125, + 2,124,1,160,7,116,5,161,1,125,3,87,0,110,32,4, + 0,116,2,121,124,1,0,1,0,1,0,116,3,100,4,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,48,0,116, + 8,124,3,131,1,116,5,107,3,114,156,116,3,100,4,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,124,3,100, + 0,100,5,133,2,25,0,116,9,107,3,144,1,114,154,122, + 24,124,1,160,4,100,6,100,3,161,2,1,0,124,1,160, + 6,161,0,125,4,87,0,110,32,4,0,116,2,121,230,1, + 0,1,0,1,0,116,3,100,4,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,48,0,116,10,124,4,116,11,24, + 0,116,5,24,0,100,6,131,2,125,5,122,22,124,1,160, + 4,124,5,161,1,1,0,124,1,160,7,161,0,125,6,87, + 0,110,34,4,0,116,2,144,1,121,50,1,0,1,0,1, + 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, + 2,130,1,48,0,124,6,160,12,116,9,161,1,125,7,124, + 7,100,6,107,0,144,1,114,90,116,3,100,7,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,124,6,124,7,124, + 7,116,5,23,0,133,2,25,0,125,3,116,8,124,3,131, + 1,116,5,107,3,144,1,114,138,116,3,100,8,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,124,4,116,8,124, + 6,131,1,24,0,124,7,23,0,125,2,116,13,124,3,100, + 9,100,10,133,2,25,0,131,1,125,8,116,13,124,3,100, + 10,100,11,133,2,25,0,131,1,125,9,124,2,124,8,107, + 0,144,1,114,214,116,3,100,12,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,124,2,124,9,107,0,144,1,114, + 242,116,3,100,13,124,0,155,2,157,2,124,0,100,2,141, + 2,130,1,124,2,124,8,56,0,125,2,124,2,124,9,24, + 0,125,10,124,10,100,6,107,0,144,2,114,30,116,3,100, + 14,124,0,155,2,157,2,124,0,100,2,141,2,130,1,105, + 0,125,11,100,6,125,12,122,14,124,1,160,4,124,2,161, + 1,1,0,87,0,110,34,4,0,116,2,144,2,121,86,1, + 0,1,0,1,0,116,3,100,4,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,48,0,124,1,160,7,100,15,161, + 1,125,3,116,8,124,3,131,1,100,5,107,0,144,2,114, + 120,116,14,100,16,131,1,130,1,124,3,100,0,100,5,133, + 2,25,0,100,17,107,3,144,2,114,142,144,4,113,180,116, + 8,124,3,131,1,100,15,107,3,144,2,114,164,116,14,100, + 16,131,1,130,1,116,15,124,3,100,18,100,19,133,2,25, + 0,131,1,125,13,116,15,124,3,100,19,100,9,133,2,25, + 0,131,1,125,14,116,15,124,3,100,9,100,20,133,2,25, + 0,131,1,125,15,116,15,124,3,100,20,100,10,133,2,25, + 0,131,1,125,16,116,13,124,3,100,10,100,11,133,2,25, + 0,131,1,125,17,116,13,124,3,100,11,100,21,133,2,25, + 0,131,1,125,18,116,13,124,3,100,21,100,22,133,2,25, + 0,131,1,125,4,116,15,124,3,100,22,100,23,133,2,25, + 0,131,1,125,19,116,15,124,3,100,23,100,24,133,2,25, + 0,131,1,125,20,116,15,124,3,100,24,100,25,133,2,25, + 0,131,1,125,21,116,13,124,3,100,26,100,15,133,2,25, + 0,131,1,125,22,124,19,124,20,23,0,124,21,23,0,125, + 8,124,22,124,9,107,4,144,3,114,124,116,3,100,27,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,124,22,124, + 10,55,0,125,22,122,14,124,1,160,7,124,19,161,1,125, + 23,87,0,110,34,4,0,116,2,144,3,121,180,1,0,1, + 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,48,0,116,8,124,23,131,1,124,19,107, + 3,144,3,114,214,116,3,100,4,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,122,50,116,8,124,1,160,7,124, + 8,124,19,24,0,161,1,131,1,124,8,124,19,24,0,107, + 3,144,4,114,6,116,3,100,4,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,87,0,110,34,4,0,116,2,144, + 4,121,42,1,0,1,0,1,0,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,48,0,124,13,100, + 28,64,0,144,4,114,64,124,23,160,16,161,0,125,23,110, + 52,122,14,124,23,160,16,100,29,161,1,125,23,87,0,110, + 36,4,0,116,17,144,4,121,114,1,0,1,0,1,0,124, + 23,160,16,100,30,161,1,160,18,116,19,161,1,125,23,89, + 0,110,2,48,0,124,23,160,20,100,31,116,21,161,2,125, + 23,116,22,160,23,124,0,124,23,161,2,125,24,124,24,124, + 14,124,18,124,4,124,22,124,15,124,16,124,17,102,8,125, + 25,124,25,124,11,124,23,60,0,124,12,100,32,55,0,125, + 12,144,2,113,88,87,0,100,0,4,0,4,0,131,3,1, + 0,110,18,49,0,144,4,115,202,48,0,1,0,1,0,1, + 0,89,0,1,0,116,24,160,25,100,33,124,12,124,0,161, + 3,1,0,124,11,83,0,41,34,78,122,21,99,97,110,39, + 116,32,111,112,101,110,32,90,105,112,32,102,105,108,101,58, + 32,114,12,0,0,0,114,85,0,0,0,250,21,99,97,110, + 39,116,32,114,101,97,100,32,90,105,112,32,102,105,108,101, + 58,32,233,4,0,0,0,114,0,0,0,0,122,16,110,111, + 116,32,97,32,90,105,112,32,102,105,108,101,58,32,122,18, + 99,111,114,114,117,112,116,32,90,105,112,32,102,105,108,101, + 58,32,233,12,0,0,0,233,16,0,0,0,233,20,0,0, + 0,122,28,98,97,100,32,99,101,110,116,114,97,108,32,100, + 105,114,101,99,116,111,114,121,32,115,105,122,101,58,32,122, + 30,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, + 101,99,116,111,114,121,32,111,102,102,115,101,116,58,32,122, + 38,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, + 101,99,116,111,114,121,32,115,105,122,101,32,111,114,32,111, + 102,102,115,101,116,58,32,233,46,0,0,0,250,27,69,79, + 70,32,114,101,97,100,32,119,104,101,114,101,32,110,111,116, + 32,101,120,112,101,99,116,101,100,115,4,0,0,0,80,75, + 1,2,233,8,0,0,0,233,10,0,0,0,233,14,0,0, + 0,233,24,0,0,0,233,28,0,0,0,233,30,0,0,0, + 233,32,0,0,0,233,34,0,0,0,233,42,0,0,0,122, + 25,98,97,100,32,108,111,99,97,108,32,104,101,97,100,101, + 114,32,111,102,102,115,101,116,58,32,105,0,8,0,0,218, + 5,97,115,99,105,105,90,6,108,97,116,105,110,49,250,1, + 47,114,5,0,0,0,122,33,122,105,112,105,109,112,111,114, + 116,58,32,102,111,117,110,100,32,123,125,32,110,97,109,101, + 115,32,105,110,32,123,33,114,125,41,26,218,3,95,105,111, + 218,9,111,112,101,110,95,99,111,100,101,114,22,0,0,0, + 114,3,0,0,0,218,4,115,101,101,107,218,20,69,78,68, + 95,67,69,78,84,82,65,76,95,68,73,82,95,83,73,90, + 69,90,4,116,101,108,108,218,4,114,101,97,100,114,55,0, + 0,0,218,18,83,84,82,73,78,71,95,69,78,68,95,65, + 82,67,72,73,86,69,218,3,109,97,120,218,15,77,65,88, + 95,67,79,77,77,69,78,84,95,76,69,78,218,5,114,102, + 105,110,100,114,2,0,0,0,218,8,69,79,70,69,114,114, + 111,114,114,1,0,0,0,114,65,0,0,0,218,18,85,110, + 105,99,111,100,101,68,101,99,111,100,101,69,114,114,111,114, + 218,9,116,114,97,110,115,108,97,116,101,218,11,99,112,52, + 51,55,95,116,97,98,108,101,114,19,0,0,0,114,20,0, + 0,0,114,21,0,0,0,114,30,0,0,0,114,45,0,0, + 0,114,78,0,0,0,41,26,114,29,0,0,0,218,2,102, + 112,90,15,104,101,97,100,101,114,95,112,111,115,105,116,105, + 111,110,218,6,98,117,102,102,101,114,218,9,102,105,108,101, + 95,115,105,122,101,90,17,109,97,120,95,99,111,109,109,101, + 110,116,95,115,116,97,114,116,218,4,100,97,116,97,90,3, + 112,111,115,218,11,104,101,97,100,101,114,95,115,105,122,101, + 90,13,104,101,97,100,101,114,95,111,102,102,115,101,116,90, + 10,97,114,99,95,111,102,102,115,101,116,114,33,0,0,0, + 218,5,99,111,117,110,116,218,5,102,108,97,103,115,218,8, + 99,111,109,112,114,101,115,115,218,4,116,105,109,101,218,4, + 100,97,116,101,218,3,99,114,99,218,9,100,97,116,97,95, + 115,105,122,101,218,9,110,97,109,101,95,115,105,122,101,218, + 10,101,120,116,114,97,95,115,105,122,101,90,12,99,111,109, + 109,101,110,116,95,115,105,122,101,218,11,102,105,108,101,95, + 111,102,102,115,101,116,114,44,0,0,0,114,13,0,0,0, + 218,1,116,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,27,0,0,0,125,1,0,0,115,214,0,0,0, + 2,1,14,1,12,1,20,1,8,2,2,1,14,1,8,1, + 14,1,12,1,20,1,12,1,18,1,18,1,2,3,12,1, + 12,1,12,1,10,1,2,1,8,255,8,2,2,1,2,255, + 2,1,4,255,2,2,10,1,12,1,14,1,10,1,2,1, + 8,255,10,2,10,1,10,1,2,1,6,255,16,2,14,1, + 10,1,2,1,6,255,16,2,16,2,16,1,10,1,18,1, + 10,1,18,1,8,1,8,1,10,1,18,1,4,2,4,2, + 2,1,14,1,14,1,20,1,10,2,14,1,8,1,18,2, + 4,1,14,1,8,1,16,1,16,1,16,1,16,1,16,1, + 16,1,16,1,16,1,16,1,16,1,16,1,12,1,10,1, + 18,1,8,1,2,2,14,1,14,1,20,1,14,1,18,1, + 2,4,28,1,22,1,14,1,20,1,10,2,10,2,2,3, + 14,1,14,1,22,1,12,2,12,1,20,1,8,1,44,1, + 14,1,4,1,255,128,114,27,0,0,0,117,190,1,0,0, + 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, + 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, + 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, + 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, + 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, + 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, + 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 195,135,195,188,195,169,195,162,195,164,195,160,195,165,195,167, + 195,170,195,171,195,168,195,175,195,174,195,172,195,132,195,133, + 195,137,195,166,195,134,195,180,195,182,195,178,195,187,195,185, + 195,191,195,150,195,156,194,162,194,163,194,165,226,130,167,198, + 146,195,161,195,173,195,179,195,186,195,177,195,145,194,170,194, + 186,194,191,226,140,144,194,172,194,189,194,188,194,161,194,171, + 194,187,226,150,145,226,150,146,226,150,147,226,148,130,226,148, + 164,226,149,161,226,149,162,226,149,150,226,149,149,226,149,163, + 226,149,145,226,149,151,226,149,157,226,149,156,226,149,155,226, + 148,144,226,148,148,226,148,180,226,148,172,226,148,156,226,148, + 128,226,148,188,226,149,158,226,149,159,226,149,154,226,149,148, + 226,149,169,226,149,166,226,149,160,226,149,144,226,149,172,226, + 149,167,226,149,168,226,149,164,226,149,165,226,149,153,226,149, + 152,226,149,146,226,149,147,226,149,171,226,149,170,226,148,152, + 226,148,140,226,150,136,226,150,132,226,150,140,226,150,144,226, + 150,128,206,177,195,159,206,147,207,128,206,163,207,131,194,181, + 207,132,206,166,206,152,206,169,206,180,226,136,158,207,134,206, + 181,226,136,169,226,137,161,194,177,226,137,165,226,137,164,226, + 140,160,226,140,161,195,183,226,137,136,194,176,226,136,153,194, + 183,226,136,154,226,129,191,194,178,226,150,160,194,160,99,0, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8, + 0,0,0,67,0,0,0,115,106,0,0,0,116,0,114,22, + 116,1,160,2,100,1,161,1,1,0,116,3,100,2,131,1, + 130,1,100,3,97,0,122,58,122,16,100,4,100,5,108,4, + 109,5,125,0,1,0,87,0,110,32,4,0,116,6,121,76, + 1,0,1,0,1,0,116,1,160,2,100,1,161,1,1,0, + 116,3,100,2,131,1,130,1,48,0,87,0,100,6,97,0, + 110,6,100,6,97,0,48,0,116,1,160,2,100,7,161,1, + 1,0,124,0,83,0,41,8,78,122,27,122,105,112,105,109, + 112,111,114,116,58,32,122,108,105,98,32,85,78,65,86,65, + 73,76,65,66,76,69,250,41,99,97,110,39,116,32,100,101, + 99,111,109,112,114,101,115,115,32,100,97,116,97,59,32,122, + 108,105,98,32,110,111,116,32,97,118,97,105,108,97,98,108, + 101,84,114,0,0,0,0,169,1,218,10,100,101,99,111,109, + 112,114,101,115,115,70,122,25,122,105,112,105,109,112,111,114, + 116,58,32,122,108,105,98,32,97,118,97,105,108,97,98,108, + 101,41,7,218,15,95,105,109,112,111,114,116,105,110,103,95, + 122,108,105,98,114,45,0,0,0,114,78,0,0,0,114,3, + 0,0,0,90,4,122,108,105,98,114,140,0,0,0,218,9, + 69,120,99,101,112,116,105,111,110,114,139,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,20,95, + 103,101,116,95,100,101,99,111,109,112,114,101,115,115,95,102, + 117,110,99,27,2,0,0,115,26,0,0,0,4,2,10,3, + 8,1,4,2,4,1,16,1,12,1,10,1,12,1,12,2, + 10,2,4,1,255,128,114,143,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,17,0,0,0,9,0,0,0, + 67,0,0,0,115,132,1,0,0,124,1,92,8,125,2,125, + 3,125,4,125,5,125,6,125,7,125,8,125,9,124,4,100, + 1,107,0,114,36,116,0,100,2,131,1,130,1,116,1,160, + 2,124,0,161,1,144,1,143,6,125,10,122,14,124,10,160, + 3,124,6,161,1,1,0,87,0,110,32,4,0,116,4,121, + 96,1,0,1,0,1,0,116,0,100,3,124,0,155,2,157, + 2,124,0,100,4,141,2,130,1,48,0,124,10,160,5,100, + 5,161,1,125,11,116,6,124,11,131,1,100,5,107,3,114, + 128,116,7,100,6,131,1,130,1,124,11,100,0,100,7,133, + 2,25,0,100,8,107,3,114,162,116,0,100,9,124,0,155, + 2,157,2,124,0,100,4,141,2,130,1,116,8,124,11,100, + 10,100,11,133,2,25,0,131,1,125,12,116,8,124,11,100, + 11,100,5,133,2,25,0,131,1,125,13,100,5,124,12,23, + 0,124,13,23,0,125,14,124,6,124,14,55,0,125,6,122, + 14,124,10,160,3,124,6,161,1,1,0,87,0,110,34,4, + 0,116,4,144,1,121,6,1,0,1,0,1,0,116,0,100, + 3,124,0,155,2,157,2,124,0,100,4,141,2,130,1,48, + 0,124,10,160,5,124,4,161,1,125,15,116,6,124,15,131, + 1,124,4,107,3,144,1,114,40,116,4,100,12,131,1,130, + 1,87,0,100,0,4,0,4,0,131,3,1,0,110,18,49, + 0,144,1,115,62,48,0,1,0,1,0,1,0,89,0,1, + 0,124,3,100,1,107,2,144,1,114,86,124,15,83,0,122, + 10,116,9,131,0,125,16,87,0,110,24,4,0,116,10,144, + 1,121,120,1,0,1,0,1,0,116,0,100,13,131,1,130, + 1,48,0,124,16,124,15,100,14,131,2,83,0,41,15,78, + 114,0,0,0,0,122,18,110,101,103,97,116,105,118,101,32, + 100,97,116,97,32,115,105,122,101,114,91,0,0,0,114,12, + 0,0,0,114,103,0,0,0,114,97,0,0,0,114,92,0, + 0,0,115,4,0,0,0,80,75,3,4,122,23,98,97,100, + 32,108,111,99,97,108,32,102,105,108,101,32,104,101,97,100, + 101,114,58,32,233,26,0,0,0,114,102,0,0,0,122,26, + 122,105,112,105,109,112,111,114,116,58,32,99,97,110,39,116, + 32,114,101,97,100,32,100,97,116,97,114,138,0,0,0,105, + 241,255,255,255,41,11,114,3,0,0,0,114,109,0,0,0, + 114,110,0,0,0,114,111,0,0,0,114,22,0,0,0,114, + 113,0,0,0,114,55,0,0,0,114,118,0,0,0,114,1, + 0,0,0,114,143,0,0,0,114,142,0,0,0,41,17,114, + 29,0,0,0,114,58,0,0,0,90,8,100,97,116,97,112, + 97,116,104,114,129,0,0,0,114,133,0,0,0,114,124,0, + 0,0,114,136,0,0,0,114,130,0,0,0,114,131,0,0, + 0,114,132,0,0,0,114,122,0,0,0,114,123,0,0,0, + 114,134,0,0,0,114,135,0,0,0,114,126,0,0,0,90, + 8,114,97,119,95,100,97,116,97,114,140,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,56,0, + 0,0,48,2,0,0,115,64,0,0,0,20,1,8,1,8, + 1,14,2,2,2,14,1,12,1,20,1,10,1,12,1,8, + 1,16,2,18,2,16,2,16,1,12,1,8,1,2,1,14, + 1,14,1,20,1,10,1,14,1,40,1,10,2,4,2,2, + 3,10,1,14,1,10,1,10,1,255,128,114,56,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,3,0,0,0,67,0,0,0,115,16,0,0,0,116,0, + 124,0,124,1,24,0,131,1,100,1,107,1,83,0,41,2, + 78,114,5,0,0,0,41,1,218,3,97,98,115,41,2,90, + 2,116,49,90,2,116,50,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,9,95,101,113,95,109,116,105,109, + 101,94,2,0,0,115,4,0,0,0,16,2,255,128,114,146, + 0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,0, + 14,0,0,0,8,0,0,0,67,0,0,0,115,60,1,0, + 0,124,3,124,2,100,1,156,2,125,5,122,18,116,0,160, + 1,124,4,124,3,124,5,161,3,125,6,87,0,110,20,4, + 0,116,2,121,48,1,0,1,0,1,0,89,0,100,0,83, + 0,48,0,124,6,100,2,64,0,100,3,107,3,125,7,124, + 7,114,182,124,6,100,4,64,0,100,3,107,3,125,8,116, + 3,106,4,100,5,107,3,144,1,114,10,124,8,115,106,116, + 3,106,4,100,6,107,2,144,1,114,10,116,5,124,0,124, + 2,131,2,125,9,124,9,100,0,117,1,144,1,114,10,116, + 3,160,6,116,0,106,7,124,9,161,2,125,10,122,20,116, + 0,160,8,124,4,124,10,124,3,124,5,161,4,1,0,87, + 0,110,104,4,0,116,2,121,180,1,0,1,0,1,0,89, + 0,100,0,83,0,48,0,116,9,124,0,124,2,131,2,92, + 2,125,11,125,12,124,11,144,1,114,10,116,10,116,11,124, + 4,100,7,100,8,133,2,25,0,131,1,124,11,131,2,114, + 246,116,11,124,4,100,8,100,9,133,2,25,0,131,1,124, + 12,107,3,144,1,114,10,116,12,160,13,100,10,124,3,155, + 2,157,2,161,1,1,0,100,0,83,0,116,14,160,15,124, + 4,100,9,100,0,133,2,25,0,161,1,125,13,116,16,124, + 13,116,17,131,2,144,1,115,56,116,18,100,11,124,1,155, + 2,100,12,157,3,131,1,130,1,124,13,83,0,41,13,78, + 41,2,114,44,0,0,0,114,13,0,0,0,114,5,0,0, + 0,114,0,0,0,0,114,85,0,0,0,90,5,110,101,118, + 101,114,90,6,97,108,119,97,121,115,114,98,0,0,0,114, + 93,0,0,0,114,94,0,0,0,122,22,98,121,116,101,99, + 111,100,101,32,105,115,32,115,116,97,108,101,32,102,111,114, + 32,122,16,99,111,109,112,105,108,101,100,32,109,111,100,117, + 108,101,32,122,21,32,105,115,32,110,111,116,32,97,32,99, + 111,100,101,32,111,98,106,101,99,116,41,19,114,21,0,0, + 0,90,13,95,99,108,97,115,115,105,102,121,95,112,121,99, + 114,77,0,0,0,218,4,95,105,109,112,90,21,99,104,101, + 99,107,95,104,97,115,104,95,98,97,115,101,100,95,112,121, + 99,115,218,15,95,103,101,116,95,112,121,99,95,115,111,117, + 114,99,101,218,11,115,111,117,114,99,101,95,104,97,115,104, + 90,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, + 66,69,82,90,18,95,118,97,108,105,100,97,116,101,95,104, + 97,115,104,95,112,121,99,218,29,95,103,101,116,95,109,116, + 105,109,101,95,97,110,100,95,115,105,122,101,95,111,102,95, + 115,111,117,114,99,101,114,146,0,0,0,114,2,0,0,0, + 114,45,0,0,0,114,78,0,0,0,218,7,109,97,114,115, + 104,97,108,90,5,108,111,97,100,115,114,15,0,0,0,218, + 10,95,99,111,100,101,95,116,121,112,101,218,9,84,121,112, + 101,69,114,114,111,114,41,14,114,32,0,0,0,114,57,0, + 0,0,114,66,0,0,0,114,38,0,0,0,114,125,0,0, + 0,90,11,101,120,99,95,100,101,116,97,105,108,115,114,128, + 0,0,0,90,10,104,97,115,104,95,98,97,115,101,100,90, + 12,99,104,101,99,107,95,115,111,117,114,99,101,90,12,115, + 111,117,114,99,101,95,98,121,116,101,115,114,149,0,0,0, + 90,12,115,111,117,114,99,101,95,109,116,105,109,101,90,11, + 115,111,117,114,99,101,95,115,105,122,101,114,50,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 15,95,117,110,109,97,114,115,104,97,108,95,99,111,100,101, + 104,2,0,0,115,84,0,0,0,2,2,2,1,6,254,2, + 5,18,1,12,1,8,1,12,2,4,1,12,1,12,1,2, + 1,2,255,8,1,4,255,10,2,10,1,4,1,4,1,2, + 1,4,254,2,5,4,1,8,1,8,255,12,2,8,1,8, + 3,6,255,6,3,22,3,18,1,4,255,4,2,8,1,4, + 255,4,2,18,2,12,1,16,1,4,1,255,128,114,154,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,4,0,0,0,67,0,0,0,115,28,0,0,0, + 124,0,160,0,100,1,100,2,161,2,125,0,124,0,160,0, + 100,3,100,2,161,2,125,0,124,0,83,0,41,4,78,115, + 2,0,0,0,13,10,243,1,0,0,0,10,243,1,0,0, + 0,13,41,1,114,19,0,0,0,41,1,218,6,115,111,117, + 114,99,101,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,23,95,110,111,114,109,97,108,105,122,101,95,108, + 105,110,101,95,101,110,100,105,110,103,115,155,2,0,0,115, + 8,0,0,0,12,1,12,1,4,1,255,128,114,158,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,6,0,0,0,67,0,0,0,115,24,0,0,0,116, + 0,124,1,131,1,125,1,116,1,124,1,124,0,100,1,100, + 2,100,3,141,4,83,0,41,4,78,114,76,0,0,0,84, + 41,1,90,12,100,111,110,116,95,105,110,104,101,114,105,116, + 41,2,114,158,0,0,0,218,7,99,111,109,112,105,108,101, + 41,2,114,57,0,0,0,114,157,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,15,95,99,111, + 109,112,105,108,101,95,115,111,117,114,99,101,162,2,0,0, + 115,6,0,0,0,8,1,16,1,255,128,114,160,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,11,0,0,0,67,0,0,0,115,68,0,0,0,116,0, + 160,1,124,0,100,1,63,0,100,2,23,0,124,0,100,3, + 63,0,100,4,64,0,124,0,100,5,64,0,124,1,100,6, + 63,0,124,1,100,3,63,0,100,7,64,0,124,1,100,5, + 64,0,100,8,20,0,100,9,100,9,100,9,102,9,161,1, + 83,0,41,10,78,233,9,0,0,0,105,188,7,0,0,233, + 5,0,0,0,233,15,0,0,0,233,31,0,0,0,233,11, + 0,0,0,233,63,0,0,0,114,85,0,0,0,114,14,0, + 0,0,41,2,114,130,0,0,0,90,6,109,107,116,105,109, + 101,41,2,218,1,100,114,137,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,14,95,112,97,114, + 115,101,95,100,111,115,116,105,109,101,168,2,0,0,115,20, + 0,0,0,4,1,10,1,10,1,6,1,6,1,10,1,10, + 1,6,1,6,249,255,128,114,168,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,10,0,0, + 0,67,0,0,0,115,110,0,0,0,122,82,124,1,100,1, + 100,0,133,2,25,0,100,2,118,0,115,22,74,0,130,1, + 124,1,100,0,100,1,133,2,25,0,125,1,124,0,106,0, + 124,1,25,0,125,2,124,2,100,3,25,0,125,3,124,2, + 100,4,25,0,125,4,124,2,100,5,25,0,125,5,116,1, + 124,4,124,3,131,2,124,5,102,2,87,0,83,0,4,0, + 116,2,116,3,116,4,102,3,121,108,1,0,1,0,1,0, + 89,0,100,6,83,0,48,0,41,7,78,114,14,0,0,0, + 169,2,218,1,99,218,1,111,114,162,0,0,0,233,6,0, + 0,0,233,3,0,0,0,41,2,114,0,0,0,0,114,0, + 0,0,0,41,5,114,28,0,0,0,114,168,0,0,0,114, + 26,0,0,0,218,10,73,110,100,101,120,69,114,114,111,114, + 114,153,0,0,0,41,6,114,32,0,0,0,114,13,0,0, + 0,114,58,0,0,0,114,130,0,0,0,114,131,0,0,0, + 90,17,117,110,99,111,109,112,114,101,115,115,101,100,95,115, + 105,122,101,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,150,0,0,0,181,2,0,0,115,22,0,0,0, + 2,1,20,2,12,1,10,1,8,3,8,1,8,1,16,1, + 18,1,8,1,255,128,114,150,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0, + 67,0,0,0,115,80,0,0,0,124,1,100,1,100,0,133, + 2,25,0,100,2,118,0,115,20,74,0,130,1,124,1,100, + 0,100,1,133,2,25,0,125,1,122,14,124,0,106,0,124, + 1,25,0,125,2,87,0,110,20,4,0,116,1,121,66,1, + 0,1,0,1,0,89,0,100,0,83,0,48,0,116,2,124, + 0,106,3,124,2,131,2,83,0,41,3,78,114,14,0,0, + 0,114,169,0,0,0,41,4,114,28,0,0,0,114,26,0, + 0,0,114,56,0,0,0,114,29,0,0,0,41,3,114,32, + 0,0,0,114,13,0,0,0,114,58,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,148,0,0, + 0,200,2,0,0,115,16,0,0,0,20,2,12,1,2,2, + 14,1,12,1,8,1,12,2,255,128,114,148,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0, + 9,0,0,0,67,0,0,0,115,190,0,0,0,116,0,124, + 0,124,1,131,2,125,2,116,1,68,0,93,156,92,3,125, + 3,125,4,125,5,124,2,124,3,23,0,125,6,116,2,106, + 3,100,1,124,0,106,4,116,5,124,6,100,2,100,3,141, + 5,1,0,122,14,124,0,106,6,124,6,25,0,125,7,87, + 0,110,18,4,0,116,7,121,86,1,0,1,0,1,0,89, + 0,113,14,48,0,124,7,100,4,25,0,125,8,116,8,124, + 0,106,4,124,7,131,2,125,9,124,4,114,130,116,9,124, + 0,124,8,124,6,124,1,124,9,131,5,125,10,110,10,116, + 10,124,8,124,9,131,2,125,10,124,10,100,0,117,0,114, + 150,113,14,124,7,100,4,25,0,125,8,124,10,124,5,124, + 8,102,3,2,0,1,0,83,0,116,11,100,5,124,1,155, + 2,157,2,124,1,100,6,141,2,130,1,41,7,78,122,13, + 116,114,121,105,110,103,32,123,125,123,125,123,125,114,85,0, + 0,0,41,1,90,9,118,101,114,98,111,115,105,116,121,114, + 0,0,0,0,114,61,0,0,0,114,62,0,0,0,41,12, + 114,36,0,0,0,114,88,0,0,0,114,45,0,0,0,114, + 78,0,0,0,114,29,0,0,0,114,20,0,0,0,114,28, + 0,0,0,114,26,0,0,0,114,56,0,0,0,114,154,0, + 0,0,114,160,0,0,0,114,3,0,0,0,41,11,114,32, + 0,0,0,114,38,0,0,0,114,13,0,0,0,114,89,0, + 0,0,114,90,0,0,0,114,51,0,0,0,114,66,0,0, + 0,114,58,0,0,0,114,40,0,0,0,114,125,0,0,0, + 114,50,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,48,0,0,0,215,2,0,0,115,38,0, + 0,0,10,1,14,1,8,1,22,1,2,1,14,1,12,1, + 6,1,8,2,12,1,4,1,18,1,10,2,8,1,2,3, + 8,1,14,1,18,2,255,128,114,48,0,0,0,41,45,114, + 83,0,0,0,90,26,95,102,114,111,122,101,110,95,105,109, + 112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108, + 114,21,0,0,0,114,1,0,0,0,114,2,0,0,0,90, + 17,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, + 105,98,114,45,0,0,0,114,147,0,0,0,114,109,0,0, + 0,114,151,0,0,0,114,69,0,0,0,114,130,0,0,0, + 90,7,95,95,97,108,108,95,95,114,20,0,0,0,90,15, + 112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,114, + 18,0,0,0,114,77,0,0,0,114,3,0,0,0,114,25, + 0,0,0,218,4,116,121,112,101,114,72,0,0,0,114,112, + 0,0,0,114,114,0,0,0,114,116,0,0,0,90,13,95, + 76,111,97,100,101,114,66,97,115,105,99,115,114,4,0,0, + 0,114,88,0,0,0,114,36,0,0,0,114,37,0,0,0, + 114,35,0,0,0,114,27,0,0,0,114,121,0,0,0,114, + 141,0,0,0,114,143,0,0,0,114,56,0,0,0,114,146, + 0,0,0,114,154,0,0,0,218,8,95,95,99,111,100,101, + 95,95,114,152,0,0,0,114,158,0,0,0,114,160,0,0, + 0,114,168,0,0,0,114,150,0,0,0,114,148,0,0,0, + 114,48,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,8,60,109,111,100,117, + 108,101,62,1,0,0,0,115,92,0,0,0,4,0,8,16, + 16,1,8,1,8,1,8,1,8,1,8,1,8,1,8,2, + 6,3,14,1,16,3,4,4,8,2,4,2,4,1,4,1, + 18,2,0,127,0,127,12,30,12,1,2,1,2,1,4,252, + 8,9,8,4,8,9,8,31,2,126,2,254,4,29,8,5, + 8,21,8,46,8,10,10,46,8,5,8,7,8,6,8,13, + 8,19,8,15,4,128,255,128, }; From e788421ccc1342bffeccbdf32688511a0a9ee143 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 17 Nov 2020 19:57:03 +0000 Subject: [PATCH 0562/1261] =?UTF-8?q?bpo-41625:=20Specify=20that=20Linux?= =?UTF-8?q?=20>=3D=202.6.17=20*and*=20glibc=20>=3D=202.5=20are=20requir?= =?UTF-8?q?=E2=80=A6=20(GH-23351)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …ed for splice() --- Doc/library/os.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 648c52b4705d90..a4c5fbb481521e 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1441,7 +1441,7 @@ or `the MSDN `_ on Windo make sense to block because there are no writers connected to the write end of the pipe. - .. availability:: Linux kernel >= 2.6.17 or glibc >= 2.5 + .. availability:: Linux kernel >= 2.6.17 and glibc >= 2.5 .. versionadded:: 3.10 From 23c420b0791c37fe49de29942f43a94dcc62b3db Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 17 Nov 2020 19:57:49 +0000 Subject: [PATCH 0563/1261] bpo-41625: Add a guard for Linux for splice() constants in the os module (GH-23350) --- Modules/posixmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index ecab147d2f38e7..703309f58687da 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -15142,7 +15142,7 @@ all_ins(PyObject *m) #endif /* constants for splice */ -#ifdef HAVE_SPLICE +#if defined(HAVE_SPLICE) && defined(__linux__) if (PyModule_AddIntConstant(m, "SPLICE_F_MOVE", SPLICE_F_MOVE)) return -1; if (PyModule_AddIntConstant(m, "SPLICE_F_NONBLOCK", SPLICE_F_NONBLOCK)) return -1; if (PyModule_AddIntConstant(m, "SPLICE_F_MORE", SPLICE_F_MORE)) return -1; From 87fb2a833b7401f1fc51640b9ac160e9639535e5 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Tue, 17 Nov 2020 22:50:23 +0100 Subject: [PATCH 0564/1261] Fix: Docstrings hidden by slots. (GH-23352) Some `__slots__` where before the docstring, hiding them. --- Lib/_collections_abc.py | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index 36cd9930003475..28690f8c0bdc5c 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -430,7 +430,6 @@ def __subclasshook__(cls, C): class Set(Collection): - """A set is a finite, iterable container. This class provides concrete generic implementations of all @@ -657,17 +656,15 @@ def __isub__(self, it): class Mapping(Collection): - - __slots__ = () - """A Mapping is a generic container for associating key/value pairs. This class provides concrete generic implementations of all methods except for __getitem__, __iter__, and __len__. - """ + __slots__ = () + @abstractmethod def __getitem__(self, key): raise KeyError @@ -789,18 +786,16 @@ def __iter__(self): class MutableMapping(Mapping): - - __slots__ = () - """A MutableMapping is a generic container for associating key/value pairs. This class provides concrete generic implementations of all methods except for __getitem__, __setitem__, __delitem__, __iter__, and __len__. - """ + __slots__ = () + @abstractmethod def __setitem__(self, key, value): raise KeyError @@ -879,7 +874,6 @@ def setdefault(self, key, default=None): class Sequence(Reversible, Collection): - """All the operations on a read-only sequence. Concrete subclasses must override __new__ or __init__, @@ -947,7 +941,6 @@ def count(self, value): class ByteString(Sequence): - """This unifies bytes and bytearray. XXX Should add all their methods. @@ -960,16 +953,14 @@ class ByteString(Sequence): class MutableSequence(Sequence): - - __slots__ = () - """All the operations on a read-write sequence. Concrete subclasses must provide __new__ or __init__, __getitem__, __setitem__, __delitem__, __len__, and insert(). - """ + __slots__ = () + @abstractmethod def __setitem__(self, index, value): raise IndexError From 6046eae04742659abc39b87a4de16e5d89fb0a22 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 17 Nov 2020 22:55:30 +0100 Subject: [PATCH 0565/1261] bpo-41686: Move _Py_RestoreSignals() to signalmodule.c (GH-23353) --- Modules/signalmodule.c | 23 +++++++++++++++++++++++ Python/pylifecycle.c | 23 ----------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 955d4a56e5462f..acaaafe89d1242 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1770,6 +1770,29 @@ signal_install_handlers(void) } +/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. + * + * All of the code in this function must only use async-signal-safe functions, + * listed at `man 7 signal` or + * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html. + * + * If this function is updated, update also _posix_spawn() of subprocess.py. + */ +void +_Py_RestoreSignals(void) +{ +#ifdef SIGPIPE + PyOS_setsig(SIGPIPE, SIG_DFL); +#endif +#ifdef SIGXFZ + PyOS_setsig(SIGXFZ, SIG_DFL); +#endif +#ifdef SIGXFSZ + PyOS_setsig(SIGXFSZ, SIG_DFL); +#endif +} + + int _PySignal_Init(int install_signal_handlers) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 77a18e17e07ead..82ce4f15ad283a 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2727,29 +2727,6 @@ Py_Exit(int sts) } -/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. - * - * All of the code in this function must only use async-signal-safe functions, - * listed at `man 7 signal` or - * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html. - * - * If this function is updated, update also _posix_spawn() of subprocess.py. - */ -void -_Py_RestoreSignals(void) -{ -#ifdef SIGPIPE - PyOS_setsig(SIGPIPE, SIG_DFL); -#endif -#ifdef SIGXFZ - PyOS_setsig(SIGXFZ, SIG_DFL); -#endif -#ifdef SIGXFSZ - PyOS_setsig(SIGXFSZ, SIG_DFL); -#endif -} - - /* * The file descriptor fd is considered ``interactive'' if either * a) isatty(fd) is TRUE, or From fa92270073098e848a71f098cfc09da1111ff7ef Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 17 Nov 2020 23:08:10 +0100 Subject: [PATCH 0566/1261] bpo-41625: Skip os.splice() tests on AIX (GH-23354) On AIX, splice() only works with a socket, whereas the test uses a pipe. --- Lib/test/test_os.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index d6da4617d50f7f..f127cb199bbb5c 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -93,6 +93,11 @@ def create_file(filename, content=b'content'): fp.write(content) +# bpo-41625: On AIX, splice() only works with a socket, not with a pipe. +requires_splice_pipe = unittest.skipIf(sys.platform.startswith("aix"), + 'on AIX, splice() only accepts sockets') + + class MiscTests(unittest.TestCase): def test_getcwd(self): cwd = os.getcwd() @@ -387,6 +392,7 @@ def test_splice_invalid_values(self): os.splice(0, 1, -10) @unittest.skipUnless(hasattr(os, 'splice'), 'test needs os.splice()') + @requires_splice_pipe def test_splice(self): TESTFN2 = os_helper.TESTFN + ".3" data = b'0123456789' @@ -419,6 +425,7 @@ def test_splice(self): self.assertEqual(os.read(read_fd, 100), data[:i]) @unittest.skipUnless(hasattr(os, 'splice'), 'test needs os.splice()') + @requires_splice_pipe def test_splice_offset_in(self): TESTFN4 = os_helper.TESTFN + ".4" data = b'0123456789' @@ -456,6 +463,7 @@ def test_splice_offset_in(self): self.assertEqual(read, data[in_skip:in_skip+i]) @unittest.skipUnless(hasattr(os, 'splice'), 'test needs os.splice()') + @requires_splice_pipe def test_splice_offset_out(self): TESTFN4 = os_helper.TESTFN + ".4" data = b'0123456789' From f370a2a49cb5c8de79e6b064191c0f19aaadd47c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 17 Nov 2020 23:28:25 +0100 Subject: [PATCH 0567/1261] bpo-41713: Port _signal module to multi-phase init (GH-23355) Port the _signal extension module to the multi-phase initialization API (PEP 489). Co-Authored-By: Mohamed Koubaa --- .../2020-11-17-23-00-27.bpo-41713.-Us0tf.rst | 2 ++ Modules/signalmodule.c | 33 ++++++++++--------- 2 files changed, 19 insertions(+), 16 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-17-23-00-27.bpo-41713.-Us0tf.rst diff --git a/Misc/NEWS.d/next/Library/2020-11-17-23-00-27.bpo-41713.-Us0tf.rst b/Misc/NEWS.d/next/Library/2020-11-17-23-00-27.bpo-41713.-Us0tf.rst new file mode 100644 index 00000000000000..4b297d9d7435ae --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-17-23-00-27.bpo-41713.-Us0tf.rst @@ -0,0 +1,2 @@ +Port the ``_signal`` extension module to the multi-phase initialization API +(:pep:`489`). Patch by Victor Stinner and Mohamed Koubaa. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index acaaafe89d1242..fcc8f1cbda227e 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1538,7 +1538,7 @@ signal_add_constants(PyObject *module) static int -signal_exec(PyObject *m) +signal_module_exec(PyObject *m) { assert(!PyErr_Occurred()); @@ -1568,15 +1568,19 @@ signal_exec(PyObject *m) // Get signal handlers for (int signum = 1; signum < NSIG; signum++) { void (*c_handler)(int) = PyOS_getsig(signum); + PyObject *func; if (c_handler == SIG_DFL) { - Handlers[signum].func = Py_NewRef(DefaultHandler); + func = DefaultHandler; } else if (c_handler == SIG_IGN) { - Handlers[signum].func = Py_NewRef(IgnoreHandler); + func = IgnoreHandler; } else { - Handlers[signum].func = Py_NewRef(Py_None); // None of our business + func = Py_None; // None of our business } + // If signal_module_exec() is called more than one, we must + // clear the strong reference to the previous function. + Py_XSETREF(Handlers[signum].func, Py_NewRef(func)); } // Instal Python SIGINT handler which raises KeyboardInterrupt @@ -1595,28 +1599,25 @@ signal_exec(PyObject *m) } -static struct PyModuleDef signalmodule = { +static PyModuleDef_Slot signal_slots[] = { + {Py_mod_exec, signal_module_exec}, + {0, NULL} +}; + +static struct PyModuleDef signal_module = { PyModuleDef_HEAD_INIT, "_signal", .m_doc = module_doc, - .m_size = -1, + .m_size = 0, .m_methods = signal_methods, + .m_slots = signal_slots, }; PyMODINIT_FUNC PyInit__signal(void) { - PyObject *mod = PyModule_Create(&signalmodule); - if (mod == NULL) { - return NULL; - } - - if (signal_exec(mod) < 0) { - Py_DECREF(mod); - return NULL; - } - return mod; + return PyModuleDef_Init(&signal_module); } From 4f40bf109f6cf43964acf71e0fb16b4f042dee69 Mon Sep 17 00:00:00 2001 From: Tom Gringauz Date: Wed, 18 Nov 2020 00:58:35 +0200 Subject: [PATCH 0568/1261] bpo-42396: Add a whatsnew entry about async contextlib.nullcontext (GH-23357) Automerge-Triggered-By: GH:asvetlov --- Doc/whatsnew/3.10.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 786cc61003a593..41252b8e0ab011 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -183,6 +183,9 @@ Add a :func:`contextlib.aclosing` context manager to safely close async generato and objects representing asynchronously released resources. (Contributed by Joongi Kim and John Belmonte in :issue:`41229`.) +Add asynchronous context manager support to :func:`contextlib.nullcontext`. +(Contributed by Tom Gringauz in :issue:`41543`.) + curses ------ From c6f6a54bc8b3bfd85232f485d5bfbc2f3e944a98 Mon Sep 17 00:00:00 2001 From: Tom Gringauz Date: Wed, 18 Nov 2020 01:18:05 +0200 Subject: [PATCH 0569/1261] bpo-42395: Add aclosing to __all__ (GH-23356) Automerge-Triggered-By: GH:asvetlov --- Lib/contextlib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/contextlib.py b/Lib/contextlib.py index a0b523c96fb285..eb5946145b47ee 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -9,7 +9,7 @@ __all__ = ["asynccontextmanager", "contextmanager", "closing", "nullcontext", "AbstractContextManager", "AbstractAsyncContextManager", "AsyncExitStack", "ContextDecorator", "ExitStack", - "redirect_stdout", "redirect_stderr", "suppress"] + "redirect_stdout", "redirect_stderr", "suppress", "aclosing"] class AbstractContextManager(abc.ABC): From 3c9bfa2a6ba62dfefd0ccd84074af169b67b8042 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Wed, 18 Nov 2020 01:08:58 +0100 Subject: [PATCH 0570/1261] bpo-40656: Clean up detect_socket() (GH-20148) --- setup.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/setup.py b/setup.py index 91358af9b616b2..6546544a99d0d9 100644 --- a/setup.py +++ b/setup.py @@ -1154,18 +1154,16 @@ def detect_crypt(self): def detect_socket(self): # socket(2) - if not VXWORKS: - kwargs = {'depends': ['socketmodule.h']} - if MACOS: - # Issue #35569: Expose RFC 3542 socket options. - kwargs['extra_compile_args'] = ['-D__APPLE_USE_RFC_3542'] - - self.add(Extension('_socket', ['socketmodule.c'], **kwargs)) - elif self.compiler.find_library_file(self.lib_dirs, 'net'): - libs = ['net'] - self.add(Extension('_socket', ['socketmodule.c'], - depends=['socketmodule.h'], - libraries=libs)) + kwargs = {'depends': ['socketmodule.h']} + if VXWORKS: + if not self.compiler.find_library_file(self.lib_dirs, 'net'): + return + kwargs['libraries'] = ['net'] + elif MACOS: + # Issue #35569: Expose RFC 3542 socket options. + kwargs['extra_compile_args'] = ['-D__APPLE_USE_RFC_3542'] + + self.add(Extension('_socket', ['socketmodule.c'], **kwargs)) def detect_dbm_gdbm(self): # Modules that provide persistent dictionary-like semantics. You will From b9e53e007019d050c104a31a20e89a7220d4a49f Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Wed, 18 Nov 2020 13:10:53 +0100 Subject: [PATCH 0571/1261] bpo-41561: skip test_min_max_version_mismatch (GH-22308) skip test_min_max_version_mismatch when TLS 1.0 is not available Signed-off-by: Christian Heimes --- Lib/test/test_ssl.py | 1 + Misc/NEWS.d/next/Tests/2020-09-18-16-14-03.bpo-41561.uPnwrW.rst | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2020-09-18-16-14-03.bpo-41561.uPnwrW.rst diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 26eec969a82e0d..8744e597302e40 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -3854,6 +3854,7 @@ def test_min_max_version_tlsv1_1(self): @requires_minimum_version @requires_tls_version('TLSv1_2') + @requires_tls_version('TLSv1') def test_min_max_version_mismatch(self): client_context, server_context, hostname = testing_context() # client 1.0, server 1.2 (mismatch) diff --git a/Misc/NEWS.d/next/Tests/2020-09-18-16-14-03.bpo-41561.uPnwrW.rst b/Misc/NEWS.d/next/Tests/2020-09-18-16-14-03.bpo-41561.uPnwrW.rst new file mode 100644 index 00000000000000..10bce825961c3c --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-09-18-16-14-03.bpo-41561.uPnwrW.rst @@ -0,0 +1 @@ +test_ssl: skip test_min_max_version_mismatch when TLS 1.0 is not available From d4c440b99c37446e2ee8a192a99ed7ef2fa2ea20 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 18 Nov 2020 15:36:27 +0100 Subject: [PATCH 0572/1261] bpo-42398: Fix "make regen-all" race condition (GH-23362) Fix a race condition in "make regen-all" when make -jN option is used to run jobs in parallel. The clinic.py script now only use atomic write to write files. Moveover, generated files are now left unchanged if the content does not change, to not change the file modification time. The "make regen-all" command runs "make clinic" and "make regen-importlib" targets: * "make regen-importlib" builds object files (ex: Modules/_weakref.o) from source files (ex: Modules/_weakref.c) and clinic files (ex: Modules/clinic/_weakref.c.h) * "make clinic" always rewrites all clinic files (ex: Modules/clinic/_weakref.c.h) Since there is no dependency between "clinic" and "regen-importlib" Makefile targets, these two targets can be run in parallel. Moreover, half of clinic.py file writes are not atomic and so there is a race condition when "make regen-all" runs jobs in parallel using make -jN option (which can be passed in MAKEFLAGS environment variable). Fix clinic.py to make all file writes atomic: * Add write_file() function to ensure that all file writes are atomic: write into a temporary file and then use os.replace(). * Moreover, write_file() doesn't recreate or modify the file if the content does not change to avoid modifying the file modification file. * Update test_clinic to verify these assertions with a functional test. * Remove Clinic.force attribute which was no longer used, whereas Clinic.verify remains useful. --- Lib/test/test_clinic.py | 26 ++++++--- .../2020-11-18-11-58-44.bpo-42398.Yt5wO8.rst | 4 ++ Tools/clinic/clinic.py | 54 ++++++++++++------- 3 files changed, 58 insertions(+), 26 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-11-18-11-58-44.bpo-42398.Yt5wO8.rst diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index 80b9aec7c2f5bc..4aa9691a4829d1 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -795,17 +795,29 @@ class ClinicExternalTest(TestCase): maxDiff = None def test_external(self): + # bpo-42398: Test that the destination file is left unchanged if the + # content does not change. Moreover, check also that the file + # modification time does not change in this case. source = support.findfile('clinic.test') with open(source, 'r', encoding='utf-8') as f: - original = f.read() - with os_helper.temp_dir() as testdir: - testfile = os.path.join(testdir, 'clinic.test.c') + orig_contents = f.read() + + with os_helper.temp_dir() as tmp_dir: + testfile = os.path.join(tmp_dir, 'clinic.test.c') with open(testfile, 'w', encoding='utf-8') as f: - f.write(original) - clinic.parse_file(testfile, force=True) + f.write(orig_contents) + old_mtime_ns = os.stat(testfile).st_mtime_ns + + clinic.parse_file(testfile) + with open(testfile, 'r', encoding='utf-8') as f: - result = f.read() - self.assertEqual(result, original) + new_contents = f.read() + new_mtime_ns = os.stat(testfile).st_mtime_ns + + self.assertEqual(new_contents, orig_contents) + # Don't change the file modification time + # if the content does not change + self.assertEqual(new_mtime_ns, old_mtime_ns) if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/Build/2020-11-18-11-58-44.bpo-42398.Yt5wO8.rst b/Misc/NEWS.d/next/Build/2020-11-18-11-58-44.bpo-42398.Yt5wO8.rst new file mode 100644 index 00000000000000..9ab99d0e69dd1d --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-11-18-11-58-44.bpo-42398.Yt5wO8.rst @@ -0,0 +1,4 @@ +Fix a race condition in "make regen-all" when make -jN option is used to run +jobs in parallel. The clinic.py script now only use atomic write to write +files. Moveover, generated files are now left unchanged if the content does not +change, to not change the file modification time. diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 5f2eb53e6a092a..d4d77952468547 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -1777,6 +1777,30 @@ def dump(self): # The callable should not call builtins.print. return_converters = {} + +def write_file(filename, new_contents): + try: + with open(filename, 'r', encoding="utf-8") as fp: + old_contents = fp.read() + + if old_contents == new_contents: + # no change: avoid modifying the file modification time + return + except FileNotFoundError: + pass + + # Atomic write using a temporary file and os.replace() + filename_new = f"{filename}.new" + with open(filename_new, "w", encoding="utf-8") as fp: + fp.write(new_contents) + + try: + os.replace(filename_new, filename) + except: + os.unlink(filename_new) + raise + + clinic = None class Clinic: @@ -1823,7 +1847,7 @@ class Clinic: """ - def __init__(self, language, printer=None, *, force=False, verify=True, filename=None): + def __init__(self, language, printer=None, *, verify=True, filename=None): # maps strings to Parser objects. # (instantiated from the "parsers" global.) self.parsers = {} @@ -1832,7 +1856,6 @@ def __init__(self, language, printer=None, *, force=False, verify=True, filename fail("Custom printers are broken right now") self.printer = printer or BlockPrinter(language) self.verify = verify - self.force = force self.filename = filename self.modules = collections.OrderedDict() self.classes = collections.OrderedDict() @@ -1965,8 +1988,7 @@ def parse(self, input): block.input = 'preserve\n' printer_2 = BlockPrinter(self.language) printer_2.print_block(block) - with open(destination.filename, "wt") as f: - f.write(printer_2.f.getvalue()) + write_file(destination.filename, printer_2.f.getvalue()) continue text = printer.f.getvalue() @@ -2018,7 +2040,10 @@ def _module_and_class(self, fields): return module, cls -def parse_file(filename, *, force=False, verify=True, output=None, encoding='utf-8'): +def parse_file(filename, *, verify=True, output=None): + if not output: + output = filename + extension = os.path.splitext(filename)[1][1:] if not extension: fail("Can't extract file type for file " + repr(filename)) @@ -2028,7 +2053,7 @@ def parse_file(filename, *, force=False, verify=True, output=None, encoding='utf except KeyError: fail("Can't identify file type for file " + repr(filename)) - with open(filename, 'r', encoding=encoding) as f: + with open(filename, 'r', encoding="utf-8") as f: raw = f.read() # exit quickly if there are no clinic markers in the file @@ -2036,19 +2061,10 @@ def parse_file(filename, *, force=False, verify=True, output=None, encoding='utf if not find_start_re.search(raw): return - clinic = Clinic(language, force=force, verify=verify, filename=filename) + clinic = Clinic(language, verify=verify, filename=filename) cooked = clinic.parse(raw) - if (cooked == raw) and not force: - return - - directory = os.path.dirname(filename) or '.' - with tempfile.TemporaryDirectory(prefix="clinic", dir=directory) as tmpdir: - bytes = cooked.encode(encoding) - tmpfilename = os.path.join(tmpdir, os.path.basename(filename)) - with open(tmpfilename, "wb") as f: - f.write(bytes) - os.replace(tmpfilename, output or filename) + write_file(output, cooked) def compute_checksum(input, length=None): @@ -5105,7 +5121,7 @@ def main(argv): path = os.path.join(root, filename) if ns.verbose: print(path) - parse_file(path, force=ns.force, verify=not ns.force) + parse_file(path, verify=not ns.force) return if not ns.filename: @@ -5121,7 +5137,7 @@ def main(argv): for filename in ns.filename: if ns.verbose: print(filename) - parse_file(filename, output=ns.output, force=ns.force, verify=not ns.force) + parse_file(filename, output=ns.output, verify=not ns.force) if __name__ == "__main__": From a4f0bfbcab73f55b0c936381e9e1c61f2b7fcaeb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 18 Nov 2020 15:57:10 +0100 Subject: [PATCH 0573/1261] bpo-40998: Fix a refleak in create_filter() (GH-23365) --- Python/_warnings.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Python/_warnings.c b/Python/_warnings.c index 8d33fbe0f878b8..313420c63148f4 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -69,12 +69,14 @@ create_filter(PyObject *category, _Py_Identifier *id, const char *modname) return NULL; } } else { - modname_obj = Py_None; + modname_obj = Py_NewRef(Py_None); } /* This assumes the line number is zero for now. */ - return PyTuple_Pack(5, action_str, Py_None, - category, modname_obj, _PyLong_GetZero()); + PyObject *filter = PyTuple_Pack(5, action_str, Py_None, + category, modname_obj, _PyLong_GetZero()); + Py_DECREF(modname_obj); + return filter; } #endif From f36388be8d2621776eb585ce65b2e2e355316b9b Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Wed, 18 Nov 2020 16:03:51 +0100 Subject: [PATCH 0574/1261] bpo-1635741: Port symtable module to multiphase initialization (GH-23361) Signed-off-by: Christian Heimes --- ...2020-11-18-10-52-38.bpo-1635741.FrWAwJ.rst | 2 + Modules/symtablemodule.c | 94 ++++++++++--------- 2 files changed, 51 insertions(+), 45 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-18-10-52-38.bpo-1635741.FrWAwJ.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-18-10-52-38.bpo-1635741.FrWAwJ.rst b/Misc/NEWS.d/next/C API/2020-11-18-10-52-38.bpo-1635741.FrWAwJ.rst new file mode 100644 index 00000000000000..9eda94140dd66e --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-18-10-52-38.bpo-1635741.FrWAwJ.rst @@ -0,0 +1,2 @@ +Port :mod:`symtable` extension module to multiphase initialization +(:pep:`489`) diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c index 9180f185e1e877..f6c378fdaedc1d 100644 --- a/Modules/symtablemodule.c +++ b/Modules/symtablemodule.c @@ -71,56 +71,60 @@ static PyMethodDef symtable_methods[] = { {NULL, NULL} /* sentinel */ }; +static int +symtable_init_stentry_type(PyObject *m) +{ + return PyType_Ready(&PySTEntry_Type); +} + +static int +symtable_init_constants(PyObject *m) +{ + if (PyModule_AddIntMacro(m, USE) < 0) return -1; + if (PyModule_AddIntMacro(m, DEF_GLOBAL) < 0) return -1; + if (PyModule_AddIntMacro(m, DEF_NONLOCAL) < 0) return -1; + if (PyModule_AddIntMacro(m, DEF_LOCAL) < 0) return -1; + if (PyModule_AddIntMacro(m, DEF_PARAM) < 0) return -1; + if (PyModule_AddIntMacro(m, DEF_FREE) < 0) return -1; + if (PyModule_AddIntMacro(m, DEF_FREE_CLASS) < 0) return -1; + if (PyModule_AddIntMacro(m, DEF_IMPORT) < 0) return -1; + if (PyModule_AddIntMacro(m, DEF_BOUND) < 0) return -1; + if (PyModule_AddIntMacro(m, DEF_ANNOT) < 0) return -1; + + if (PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock) < 0) + return -1; + if (PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock) < 0) return -1; + if (PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock) < 0) + return -1; + + if (PyModule_AddIntMacro(m, LOCAL) < 0) return -1; + if (PyModule_AddIntMacro(m, GLOBAL_EXPLICIT) < 0) return -1; + if (PyModule_AddIntMacro(m, GLOBAL_IMPLICIT) < 0) return -1; + if (PyModule_AddIntMacro(m, FREE) < 0) return -1; + if (PyModule_AddIntMacro(m, CELL) < 0) return -1; + + if (PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET) < 0) return -1; + if (PyModule_AddIntMacro(m, SCOPE_MASK) < 0) return -1; + + return 0; +} + +static PyModuleDef_Slot symtable_slots[] = { + {Py_mod_exec, symtable_init_stentry_type}, + {Py_mod_exec, symtable_init_constants}, + {0, NULL} +}; + static struct PyModuleDef symtablemodule = { PyModuleDef_HEAD_INIT, - "_symtable", - NULL, - -1, - symtable_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "_symtable", + .m_size = 0, + .m_methods = symtable_methods, + .m_slots = symtable_slots, }; PyMODINIT_FUNC PyInit__symtable(void) { - PyObject *m; - - if (PyType_Ready(&PySTEntry_Type) < 0) - return NULL; - - m = PyModule_Create(&symtablemodule); - if (m == NULL) - return NULL; - PyModule_AddIntMacro(m, USE); - PyModule_AddIntMacro(m, DEF_GLOBAL); - PyModule_AddIntMacro(m, DEF_NONLOCAL); - PyModule_AddIntMacro(m, DEF_LOCAL); - PyModule_AddIntMacro(m, DEF_PARAM); - PyModule_AddIntMacro(m, DEF_FREE); - PyModule_AddIntMacro(m, DEF_FREE_CLASS); - PyModule_AddIntMacro(m, DEF_IMPORT); - PyModule_AddIntMacro(m, DEF_BOUND); - PyModule_AddIntMacro(m, DEF_ANNOT); - - PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock); - PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock); - PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock); - - PyModule_AddIntMacro(m, LOCAL); - PyModule_AddIntMacro(m, GLOBAL_EXPLICIT); - PyModule_AddIntMacro(m, GLOBAL_IMPLICIT); - PyModule_AddIntMacro(m, FREE); - PyModule_AddIntMacro(m, CELL); - - PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET); - PyModule_AddIntMacro(m, SCOPE_MASK); - - if (PyErr_Occurred()) { - Py_DECREF(m); - m = 0; - } - return m; + return PyModuleDef_Init(&symtablemodule); } From c5561c946ae3a7c489e47b882d97b33828fa0284 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Wed, 18 Nov 2020 16:12:13 +0100 Subject: [PATCH 0575/1261] bpo-1635741: Port _hashlib to multiphase initialization (GH-23358) Signed-off-by: Christian Heimes --- ...2020-11-18-08-45-36.bpo-1635741.VLZfiY.rst | 1 + Modules/_hashopenssl.c | 38 +------------------ 2 files changed, 3 insertions(+), 36 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-18-08-45-36.bpo-1635741.VLZfiY.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-18-08-45-36.bpo-1635741.VLZfiY.rst b/Misc/NEWS.d/next/C API/2020-11-18-08-45-36.bpo-1635741.VLZfiY.rst new file mode 100644 index 00000000000000..2300170587d7e0 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-18-08-45-36.bpo-1635741.VLZfiY.rst @@ -0,0 +1 @@ +Port _hashlib extension module to multiphase initialization (:pep:`489`) diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index adc86537732502..56d2a77049e349 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -2078,7 +2078,6 @@ hashlib_init_hmactype(PyObject *module) return 0; } -#if 0 static PyModuleDef_Slot hashlib_slots[] = { /* OpenSSL 1.0.2 and LibreSSL */ {Py_mod_exec, hashlib_openssl_legacy_init}, @@ -2088,7 +2087,6 @@ static PyModuleDef_Slot hashlib_slots[] = { {Py_mod_exec, hashlib_md_meth_names}, {0, NULL} }; -#endif static struct PyModuleDef _hashlibmodule = { PyModuleDef_HEAD_INIT, @@ -2096,7 +2094,7 @@ static struct PyModuleDef _hashlibmodule = { .m_doc = "OpenSSL interface for hashlib module", .m_size = sizeof(_hashlibstate), .m_methods = EVP_functions, - .m_slots = NULL, + .m_slots = hashlib_slots, .m_traverse = hashlib_traverse, .m_clear = hashlib_clear, .m_free = hashlib_free @@ -2105,37 +2103,5 @@ static struct PyModuleDef _hashlibmodule = { PyMODINIT_FUNC PyInit__hashlib(void) { - PyObject *m = PyState_FindModule(&_hashlibmodule); - if (m != NULL) { - Py_INCREF(m); - return m; - } - - m = PyModule_Create(&_hashlibmodule); - if (m == NULL) { - return NULL; - } - - if (hashlib_openssl_legacy_init(m) < 0) { - Py_DECREF(m); - return NULL; - } - if (hashlib_init_evptype(m) < 0) { - Py_DECREF(m); - return NULL; - } - if (hashlib_init_evpxoftype(m) < 0) { - Py_DECREF(m); - return NULL; - } - if (hashlib_init_hmactype(m) < 0) { - Py_DECREF(m); - return NULL; - } - if (hashlib_md_meth_names(m) == -1) { - Py_DECREF(m); - return NULL; - } - - return m; + return PyModuleDef_Init(&_hashlibmodule); } From 881b51180cafb48b8fa65d6177323bb34d92b346 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Wed, 18 Nov 2020 16:38:53 +0100 Subject: [PATCH 0576/1261] bpo-40998: Address compiler warnings found by ubsan (GH-20929) Signed-off-by: Christian Heimes Automerge-Triggered-By: GH:tiran --- .../next/Build/2020-06-17-09-05-02.bpo-40998.sgqmg9.rst | 2 ++ Objects/unicodeobject.c | 6 +++++- Parser/string_parser.c | 3 +++ Python/pylifecycle.c | 7 +++---- 4 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-06-17-09-05-02.bpo-40998.sgqmg9.rst diff --git a/Misc/NEWS.d/next/Build/2020-06-17-09-05-02.bpo-40998.sgqmg9.rst b/Misc/NEWS.d/next/Build/2020-06-17-09-05-02.bpo-40998.sgqmg9.rst new file mode 100644 index 00000000000000..c268e4fd0d9cbf --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-06-17-09-05-02.bpo-40998.sgqmg9.rst @@ -0,0 +1,2 @@ +Addressed three compiler warnings found by undefined behavior sanitizer +(ubsan). diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index e7a63e7b973d89..70688c8c013816 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -839,7 +839,11 @@ xmlcharrefreplace(_PyBytesWriter *writer, char *str, /* generate replacement */ for (i = collstart; i < collend; ++i) { - str += sprintf(str, "&#%d;", PyUnicode_READ(kind, data, i)); + size = sprintf(str, "&#%d;", PyUnicode_READ(kind, data, i)); + if (size < 0) { + return NULL; + } + str += size; } return str; } diff --git a/Parser/string_parser.c b/Parser/string_parser.c index 1285968b319177..8f6433dbcec131 100644 --- a/Parser/string_parser.c +++ b/Parser/string_parser.c @@ -69,6 +69,9 @@ decode_unicode_with_escapes(Parser *parser, const char *s, size_t len, Token *t) return NULL; } p = buf = PyBytes_AsString(u); + if (p == NULL) { + return NULL; + } end = s + len; while (s < end) { if (*s == '\\') { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 82ce4f15ad283a..9771951d2d84ca 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1644,7 +1644,6 @@ Py_FinalizeEx(void) /* Get current thread state and interpreter pointer */ PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - PyInterpreterState *interp = tstate->interp; // Wrap up existing "threading"-module-created, non-daemon threads. wait_for_thread_shutdown(tstate); @@ -1667,13 +1666,13 @@ Py_FinalizeEx(void) /* Copy the core config, PyInterpreterState_Delete() free the core config memory */ #ifdef Py_REF_DEBUG - int show_ref_count = interp->config.show_ref_count; + int show_ref_count = tstate->interp->config.show_ref_count; #endif #ifdef Py_TRACE_REFS - int dump_refs = interp->config.dump_refs; + int dump_refs = tstate->interp->config.dump_refs; #endif #ifdef WITH_PYMALLOC - int malloc_stats = interp->config.malloc_stats; + int malloc_stats = tstate->interp->config.malloc_stats; #endif /* Remaining daemon threads will automatically exit From 68f48842b641009ecd1a102c683aa6b52a9ad9f0 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 18 Nov 2020 17:24:36 +0000 Subject: [PATCH 0577/1261] bpo-42336: Improve PCbuild batch files (GH-23275) --- .azure-pipelines/ci.yml | 2 +- .azure-pipelines/pr.yml | 2 +- .github/workflows/build.yml | 4 ++-- PCbuild/build.bat | 4 ++-- PCbuild/env.bat | 21 ++++++++++++++++----- PCbuild/env.ps1 | 2 ++ PCbuild/idle.bat | 18 +++++++++++++++--- PCbuild/prepare_libffi.bat | 13 ++++++------- PCbuild/rt.bat | 18 +++++++++++++++--- 9 files changed, 60 insertions(+), 24 deletions(-) create mode 100644 PCbuild/env.ps1 diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 531ed060fd3866..3feb85ae6561de 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -104,7 +104,7 @@ jobs: matrix: win32: arch: win32 - buildOpt: + buildOpt: '-p Win32' testRunTitle: '$(Build.SourceBranchName)-win32' testRunPlatform: win32 win64: diff --git a/.azure-pipelines/pr.yml b/.azure-pipelines/pr.yml index 1ffe0a97a2465f..2e94af35600cfc 100644 --- a/.azure-pipelines/pr.yml +++ b/.azure-pipelines/pr.yml @@ -104,7 +104,7 @@ jobs: matrix: win32: arch: win32 - buildOpt: + buildOpt: '-p Win32' testRunTitle: '$(System.PullRequest.TargetBranch)-win32' testRunPlatform: win32 win64: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d00c227182f61a..c9b568002f7b43 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -59,7 +59,7 @@ jobs: - name: Display build info run: .\python.bat -m test.pythoninfo - name: Tests - run: .\PCbuild\rt.bat -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 + run: .\PCbuild\rt.bat -p Win32 -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 build_win_amd64: name: 'Windows (x64)' @@ -73,7 +73,7 @@ jobs: - name: Display build info run: .\python.bat -m test.pythoninfo - name: Tests - run: .\PCbuild\rt.bat -x64 -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 + run: .\PCbuild\rt.bat -p x64 -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 build_macos: name: 'macOS' diff --git a/PCbuild/build.bat b/PCbuild/build.bat index ba7154d8cb1e56..5a41ca57b12391 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -46,7 +46,7 @@ echo.Available arguments: echo. -c Release ^| Debug ^| PGInstrument ^| PGUpdate echo. Set the configuration (default: Release) echo. -p x64 ^| Win32 ^| ARM ^| ARM64 -echo. Set the platform (default: Win32) +echo. Set the platform (default: x64) echo. -t Build ^| Rebuild ^| Clean ^| CleanAll echo. Set the target manually echo. --pgo-job The job to use for PGO training; implies --pgo @@ -55,7 +55,7 @@ exit /b 127 :Run setlocal -set platf=Win32 +set platf=x64 set conf=Release set target=Build set dir=%~dp0 diff --git a/PCbuild/env.bat b/PCbuild/env.bat index 9d4c9d1c32f7a4..2820e304582cff 100644 --- a/PCbuild/env.bat +++ b/PCbuild/env.bat @@ -9,8 +9,19 @@ rem 'v110', 'v120' or 'v140') to the build script. echo Build environments: x86, amd64, x86_amd64 echo. -set VSTOOLS=%VS140COMNTOOLS% -if "%VSTOOLS%"=="" set VSTOOLS=%VS120COMNTOOLS% -if "%VSTOOLS%"=="" set VSTOOLS=%VS110COMNTOOLS% -if "%VSTOOLS%"=="" set VSTOOLS=%VS100COMNTOOLS% -call "%VSTOOLS%..\..\VC\vcvarsall.bat" %* +set _ARGS=%* +if NOT DEFINED _ARGS set _ARGS=amd64 + +if not exist "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" goto :skip_vswhere +set VSTOOLS= +for /F "tokens=*" %%i in ('"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -property installationPath -latest -prerelease -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64') DO @(set VSTOOLS=%%i\VC\Auxiliary\Build\vcvarsall.bat) +if not defined VSTOOLS goto :skip_vswhere +call "%VSTOOLS%" %_ARGS% +exit /B 0 + +:skip_vswhere +if not defined VSTOOLS set VSTOOLS=%VS140COMNTOOLS% +if not defined VSTOOLS set VSTOOLS=%VS120COMNTOOLS% +if not defined VSTOOLS set VSTOOLS=%VS110COMNTOOLS% +if not defined VSTOOLS set VSTOOLS=%VS100COMNTOOLS% +call "%VSTOOLS%..\..\VC\vcvarsall.bat" %_ARGS% diff --git a/PCbuild/env.ps1 b/PCbuild/env.ps1 new file mode 100644 index 00000000000000..19d7ada4c10798 --- /dev/null +++ b/PCbuild/env.ps1 @@ -0,0 +1,2 @@ +$pcbuild = $script:MyInvocation.MyCommand.Path | Split-Path -parent; +& cmd /K "$pcbuild\env.bat" $args diff --git a/PCbuild/idle.bat b/PCbuild/idle.bat index 1978b99f6ee19d..70f3817f09769c 100644 --- a/PCbuild/idle.bat +++ b/PCbuild/idle.bat @@ -4,12 +4,24 @@ rem Usage: idle [-d] rem -d Run Debug build (python_d.exe). Else release build. setlocal -set exe=win32\python +set PCBUILD=%~dp0 +set exedir=%PCBUILD%\amd64 +set exe=python PATH %PATH%;..\externals\tcltk\bin -if "%1"=="-d" (set exe=%exe%_d) & shift +:CheckOpts +if "%1"=="-d" (set exe=%exe%_d) & shift & goto :CheckOpts +if "%1"=="-p" (call :SetExeDir %2) & shift & shift & goto :CheckOpts -set cmd=%exe% ../Lib/idlelib/idle.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +set cmd=%exedir%\%exe% %PCBUILD%\..\Lib\idlelib\idle.py %1 %2 %3 %4 %5 %6 %7 %8 %9 echo on %cmd% +exit /B %LASTERRORCODE% + +:SetExeDir +if /I %1 EQU Win32 (set exedir=%PCBUILD%\win32) +if /I %1 EQU x64 (set exedir=%PCBUILD%\amd64) +if /I %1 EQU ARM (set exedir=%PCBUILD%\arm32) +if /I %1 EQU ARM64 (set exedir=%PCBUILD%\arm64) +exit /B 0 diff --git a/PCbuild/prepare_libffi.bat b/PCbuild/prepare_libffi.bat index f41ba83379af96..922a47565c8da5 100644 --- a/PCbuild/prepare_libffi.bat +++ b/PCbuild/prepare_libffi.bat @@ -22,10 +22,10 @@ echo Based on https://github.com/libffi/libffi/blob/master/.appveyor.yml echo. echo. echo.Available flags: -echo. -x64 build for x64 -echo. -x86 build for x86 -echo. -arm32 build for arm32 -echo. -arm64 build for arm64 +echo. -x64 enable x64 build +echo. -x86 enable x86 build +echo. -arm32 enable arm32 build +echo. -arm64 enable arm64 build echo. -? this help echo. --install-cygwin install cygwin to c:\cygwin exit /b 127 @@ -44,6 +44,7 @@ set INSTALL_CYGWIN= if "%1"=="" goto :CheckOptsDone if /I "%1"=="-x64" (set BUILD_X64=1) & shift & goto :CheckOpts if /I "%1"=="-x86" (set BUILD_X86=1) & shift & goto :CheckOpts +if /I "%1"=="-win32" (set BUILD_X86=1) & shift & goto :CheckOpts if /I "%1"=="-arm32" (set BUILD_ARM32=1) & shift & goto :CheckOpts if /I "%1"=="-arm64" (set BUILD_ARM64=1) & shift & goto :CheckOpts if /I "%1"=="-pdb" (set BUILD_PDB=-g) & shift & goto :CheckOpts @@ -67,9 +68,7 @@ setlocal if NOT DEFINED SH if exist c:\cygwin\bin\sh.exe set SH=c:\cygwin\bin\sh.exe if NOT DEFINED VCVARSALL ( - if exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ( - set VCVARSALL="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" - ) + for /F "tokens=*" %%i in ('"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -property installationPath -latest -prerelease -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64') DO @(set VCVARSALL="%%i\VC\Auxiliary\Build\vcvarsall.bat") ) if ^%VCVARSALL:~0,1% NEQ ^" SET VCVARSALL="%VCVARSALL%" diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index 59f757c0f5888a..29813c5a87fca7 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -6,8 +6,9 @@ rem -O Run python.exe or python_d.exe (see -d) with -O. rem -q "quick" -- normally the tests are run twice, the first time rem after deleting all the .pyc files reachable from Lib/. rem -q runs the tests just once, and without deleting .pyc files. -rem -x64 Run the 64-bit build of python (or python_d if -d was specified) -rem When omitted, uses %PREFIX% if set or the 32-bit build +rem -p or -win32, -x64, -arm32, -arm64 +rem Run the specified architecture of python (or python_d if -d +rem was specified). If omitted, uses %PREFIX% if set or 64-bit. rem All leading instances of these switches are shifted off, and rem whatever remains (up to 9 arguments) is passed to regrtest.py. rem For example, @@ -38,12 +39,14 @@ set exe= if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts +if "%1"=="-win32" (set prefix=%pcbuild%win32) & shift & goto CheckOpts if "%1"=="-x64" (set prefix=%pcbuild%amd64) & shift & goto CheckOpts if "%1"=="-arm64" (set prefix=%pcbuild%arm64) & shift & goto CheckOpts if "%1"=="-arm32" (set prefix=%pcbuild%arm32) & shift & goto CheckOpts +if "%1"=="-p" (call :SetPlatform %~2) & shift & shift & goto CheckOpts if NOT "%1"=="" (set regrtestargs=%regrtestargs% %1) & shift & goto CheckOpts -if not defined prefix set prefix=%pcbuild%win32 +if not defined prefix set prefix=%pcbuild%amd64 set exe=%prefix%\python%suffix%.exe set cmd="%exe%" %dashO% -u -Wd -E -bb -m test %regrtestargs% if defined qmode goto Qmode @@ -60,6 +63,15 @@ echo on echo About to run again without deleting .pyc first: pause +goto Qmode + +:SetPlatform +if /I %1 EQU Win32 (set prefix=%pcbuild%win32) & exit /B 0 +if /I %1 EQU x64 (set prefix=%pcbuild%amd64) & exit /B 0 +if /I %1 EQU ARM64 (set prefix=%pcbuild%arm64) & exit /B 0 +if /I %1 EQU ARM (set prefix=%pcbuild%arm32) & exit /B 0 +echo Invalid platform "%1" +exit /B 1 :Qmode echo on From d8df8fca31821e996065136f341e10b2eb7dca05 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 18 Nov 2020 18:48:06 +0100 Subject: [PATCH 0578/1261] bpo-39573: Convert Py_TYPE() and Py_SIZE() back to macros (GH-23366) This change partically reverts commit ad3252bad905d41635bcbb4b76db30d570cf0087 and the commit fe2978b3b940fe2478335e3a2ca5ad22338cdf9c. Many third party C extension modules rely on the ability of using Py_TYPE() to set an object type: "Py_TYPE(obj) = type;" or to set an object type using: "Py_SIZE(obj) = size;". --- Doc/c-api/structures.rst | 8 ++---- Doc/whatsnew/3.10.rst | 11 -------- Include/object.h | 13 +++------- .../2020-11-18-15-21-59.bpo-39573.VB3G2y.rst | 4 +++ Modules/_testcapimodule.c | 25 +++++++++++++++++++ 5 files changed, 35 insertions(+), 26 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-18-15-21-59.bpo-39573.VB3G2y.rst diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 37602ed5b4dc78..37072d30d57153 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -68,9 +68,7 @@ the definition of all other Python objects. Return a :term:`borrowed reference`. - .. versionchanged:: 3.10 - :c:func:`Py_TYPE()` is changed to the inline static function. - Use :c:func:`Py_SET_TYPE()` to set an object type. + The :c:func:`Py_SET_TYPE` function must be used to set an object type. .. c:function:: int Py_IS_TYPE(PyObject *o, PyTypeObject *type) @@ -108,9 +106,7 @@ the definition of all other Python objects. Get the size of the Python object *o*. - .. versionchanged:: 3.10 - :c:func:`Py_SIZE()` is changed to the inline static function. - Use :c:func:`Py_SET_SIZE()` to set an object size. + The :c:func:`Py_SET_SIZE` function must be used to set an object size. .. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 41252b8e0ab011..cfb0383180f995 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -489,17 +489,6 @@ Porting to Python 3.10 ` and the :pep:`353`. (Contributed by Victor Stinner in :issue:`40943`.) -* Since :c:func:`Py_TYPE()` is changed to the inline static function, - ``Py_TYPE(obj) = new_type`` must be replaced with ``Py_SET_TYPE(obj, new_type)``: - see :c:func:`Py_SET_TYPE()` (available since Python 3.9). For backward - compatibility, this macro can be used:: - - #if PY_VERSION_HEX < 0x030900A4 - # define Py_SET_TYPE(obj, type) ((Py_TYPE(obj) = (type)), (void)0) - #endif - - (Contributed by Dong-hee Na in :issue:`39573`.) - * Since :c:func:`Py_REFCNT()` is changed to the inline static function, ``Py_REFCNT(obj) = new_refcnt`` must be replaced with ``Py_SET_REFCNT(obj, new_refcnt)``: see :c:func:`Py_SET_REFCNT()` (available since Python 3.9). For backward diff --git a/Include/object.h b/Include/object.h index dd1b217686717e..f68423a09c4e4b 100644 --- a/Include/object.h +++ b/Include/object.h @@ -128,16 +128,11 @@ static inline Py_ssize_t _Py_REFCNT(const PyObject *ob) { #define Py_REFCNT(ob) _Py_REFCNT(_PyObject_CAST_CONST(ob)) -static inline Py_ssize_t _Py_SIZE(const PyVarObject *ob) { - return ob->ob_size; -} -#define Py_SIZE(ob) _Py_SIZE(_PyVarObject_CAST_CONST(ob)) - +// bpo-39573: The Py_SET_TYPE() function must be used to set an object type. +#define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type) -static inline PyTypeObject* _Py_TYPE(const PyObject *ob) { - return ob->ob_type; -} -#define Py_TYPE(ob) _Py_TYPE(_PyObject_CAST_CONST(ob)) +// bpo-39573: The Py_SET_SIZE() function must be used to set an object size. +#define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size) static inline int _Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) { diff --git a/Misc/NEWS.d/next/C API/2020-11-18-15-21-59.bpo-39573.VB3G2y.rst b/Misc/NEWS.d/next/C API/2020-11-18-15-21-59.bpo-39573.VB3G2y.rst new file mode 100644 index 00000000000000..b4fade6e202eda --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-18-15-21-59.bpo-39573.VB3G2y.rst @@ -0,0 +1,4 @@ +Convert :c:func:`Py_TYPE` and :c:func:`Py_SIZE` back to macros to allow +using them as an l-value. Many third party C extension modules rely on the +ability of using Py_TYPE() and Py_SIZE() to set an object type and size: +``Py_TYPE(obj) = type;`` and ``Py_SIZE(obj) = size;``. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 7b6da1e4c90559..a1d4c929b02058 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5612,6 +5612,30 @@ pynumber_tobase(PyObject *module, PyObject *args) static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *); + +static PyObject* +test_set_type_size(PyObject* self, PyObject* ignored) +{ + PyObject *obj = PyList_New(0); + if (obj == NULL) { + return NULL; + } + + // Ensure that following tests don't modify the object, + // to ensure that Py_DECREF() will not crash. + assert(Py_TYPE(obj) == &PyList_Type); + assert(Py_SIZE(obj) == 0); + + // bpo-39573: Check that Py_TYPE() and Py_SIZE() can be used + // as l-values to set an object type and size. + Py_TYPE(obj) = &PyList_Type; + Py_SIZE(obj) = 0; + + Py_DECREF(obj); + Py_RETURN_NONE; +} + + static PyMethodDef TestMethods[] = { {"raise_exception", raise_exception, METH_VARARGS}, {"raise_memoryerror", raise_memoryerror, METH_NOARGS}, @@ -5883,6 +5907,7 @@ static PyMethodDef TestMethods[] = { {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS}, {"pynumber_tobase", pynumber_tobase, METH_VARARGS}, {"without_gc", without_gc, METH_O}, + {"test_set_type_size", test_set_type_size, METH_NOARGS}, {NULL, NULL} /* sentinel */ }; From cdb46eb0f67c7cee22e8ce0bfb81f250265668c3 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Wed, 18 Nov 2020 10:58:38 -0800 Subject: [PATCH 0579/1261] bpo-42085: Add documentation for Py_TPFLAGS_HAVE_AM_SEND (GH-23374) Updated docs to include `Py_TPFLAGS_HAVE_AM_SEND`. News section should not be necessary. Automerge-Triggered-By: GH:asvetlov --- Doc/c-api/typeobj.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 6a67bfe9010890..9efe3aac2e1c9f 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1170,6 +1170,14 @@ and :c:type:`PyType_Type` effectively act as defaults.) .. versionadded:: 3.9 + .. data:: Py_TPFLAGS_HAVE_AM_SEND + + This bit is set when the :c:member:`~PyAsyncMethods.am_send` entry is present in the + :c:member:`~PyTypeObject.tp_as_async` slot of type structure. + + .. versionadded:: 3.10 + + .. c:member:: const char* PyTypeObject.tp_doc An optional pointer to a NUL-terminated C string giving the docstring for this From a05d72cbb34ef53b94d15c12155ccc68f4afe37f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Wed, 18 Nov 2020 22:39:03 +0100 Subject: [PATCH 0580/1261] bpo-39573: Remove What's new entry for Py_SIZE() (GH-23375) A follow up for 0e2ac21dd4960574e89561243763eabba685296a --- Doc/whatsnew/3.10.rst | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index cfb0383180f995..0e5e841ff44d70 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -500,17 +500,6 @@ Porting to Python 3.10 (Contributed by Victor Stinner in :issue:`39573`.) -* Since :c:func:`Py_SIZE()` is changed to the inline static function, - ``Py_SIZE(obj) = new_size`` must be replaced with ``Py_SET_SIZE(obj, new_size)``: - see :c:func:`Py_SET_SIZE()` (available since Python 3.9). For backward - compatibility, this macro can be used:: - - #if PY_VERSION_HEX < 0x030900A4 - # define Py_SET_SIZE(obj, size) ((Py_SIZE(obj) = (size)), (void)0) - #endif - - (Contributed by Victor Stinner in :issue:`39573`.) - * Calling :c:func:`PyDict_GetItem` without :term:`GIL` held had been allowed for historical reason. It is no longer allowed. (Contributed by Victor Stinner in :issue:`40839`.) From 61e87593184e15890e69189af7226ac798c6a2a8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 18 Nov 2020 23:18:29 +0100 Subject: [PATCH 0581/1261] bpo-1635741: Convert _imp to multi-phase init (GH-23378) Convert the _imp extension module to the multi-phase initialization API (PEP 489). * Add _PyImport_BootstrapImp() which fix a bootstrap issue: import the _imp module before importlib is initialized. * Add create_builtin() sub-function, used by _imp_create_builtin(). * Initialize PyInterpreterState.import_func earlier, in pycore_init_builtins(). * Remove references to _PyImport_Cleanup(). This function has been renamed to finalize_modules() and moved to pylifecycle.c. --- Include/internal/pycore_import.h | 2 +- Modules/posixmodule.c | 2 +- Python/import.c | 181 +++++++++++++++++++------------ Python/pylifecycle.c | 18 +-- 4 files changed, 122 insertions(+), 81 deletions(-) diff --git a/Include/internal/pycore_import.h b/Include/internal/pycore_import.h index 35a67abebac6f7..fd9fa5ab23faa2 100644 --- a/Include/internal/pycore_import.h +++ b/Include/internal/pycore_import.h @@ -13,7 +13,7 @@ PyAPI_FUNC(PyObject *) _PyImport_FindBuiltin( #ifdef HAVE_FORK extern PyStatus _PyImport_ReInitLock(void); #endif -extern void _PyImport_Cleanup(PyThreadState *tstate); +extern PyObject* _PyImport_BootstrapImp(PyThreadState *tstate); #ifdef __cplusplus } diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 703309f58687da..efa96531d49c1c 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -14501,7 +14501,7 @@ os__remove_dll_directory_impl(PyObject *module, PyObject *cookie) os.waitstatus_to_exitcode() is implemented in C and not in Python, so subprocess can safely call it during late Python finalization without - risking that used os attributes were set to None by _PyImport_Cleanup(). */ + risking that used os attributes were set to None by finalize_modules(). */ #if defined(WIFEXITED) || defined(MS_WINDOWS) /*[clinic input] os.waitstatus_to_exitcode diff --git a/Python/import.c b/Python/import.c index 51630c3486af61..1522abc705ffb2 100644 --- a/Python/import.c +++ b/Python/import.c @@ -4,6 +4,7 @@ #include "Python-ast.h" #undef Yield /* undefine macro conflicting with */ +#include "pycore_import.h" // _PyImport_BootstrapImp() #include "pycore_initconfig.h" #include "pycore_pyerrors.h" #include "pycore_pyhash.h" @@ -978,84 +979,80 @@ PyImport_GetImporter(PyObject *path) return importer; } -/*[clinic input] -_imp.create_builtin - - spec: object - / - -Create an extension module. -[clinic start generated code]*/ - -static PyObject * -_imp_create_builtin(PyObject *module, PyObject *spec) -/*[clinic end generated code: output=ace7ff22271e6f39 input=37f966f890384e47]*/ +static PyObject* +create_builtin(PyThreadState *tstate, PyObject *name, PyObject *spec) { - PyThreadState *tstate = _PyThreadState_GET(); - struct _inittab *p; - PyObject *name; - const char *namestr; - PyObject *mod; - - name = PyObject_GetAttrString(spec, "name"); - if (name == NULL) { - return NULL; - } - - mod = _PyImport_FindExtensionObject(name, name); + PyObject *mod = _PyImport_FindExtensionObject(name, name); if (mod || _PyErr_Occurred(tstate)) { - Py_DECREF(name); Py_XINCREF(mod); return mod; } - namestr = PyUnicode_AsUTF8(name); - if (namestr == NULL) { - Py_DECREF(name); - return NULL; - } - PyObject *modules = tstate->interp->modules; - for (p = PyImport_Inittab; p->name != NULL; p++) { - PyModuleDef *def; + for (struct _inittab *p = PyImport_Inittab; p->name != NULL; p++) { if (_PyUnicode_EqualToASCIIString(name, p->name)) { if (p->initfunc == NULL) { /* Cannot re-init internal module ("sys" or "builtins") */ - mod = PyImport_AddModule(namestr); - Py_DECREF(name); - return mod; + return PyImport_AddModuleObject(name); } + mod = (*p->initfunc)(); if (mod == NULL) { - Py_DECREF(name); return NULL; } + if (PyObject_TypeCheck(mod, &PyModuleDef_Type)) { - Py_DECREF(name); return PyModule_FromDefAndSpec((PyModuleDef*)mod, spec); - } else { + } + else { /* Remember pointer to module init function. */ - def = PyModule_GetDef(mod); + PyModuleDef *def = PyModule_GetDef(mod); if (def == NULL) { - Py_DECREF(name); return NULL; } + def->m_base.m_init = p->initfunc; if (_PyImport_FixupExtensionObject(mod, name, name, modules) < 0) { - Py_DECREF(name); return NULL; } - Py_DECREF(name); return mod; } } } - Py_DECREF(name); + + // not found Py_RETURN_NONE; } + +/*[clinic input] +_imp.create_builtin + + spec: object + / + +Create an extension module. +[clinic start generated code]*/ + +static PyObject * +_imp_create_builtin(PyObject *module, PyObject *spec) +/*[clinic end generated code: output=ace7ff22271e6f39 input=37f966f890384e47]*/ +{ + PyThreadState *tstate = _PyThreadState_GET(); + + PyObject *name = PyObject_GetAttrString(spec, "name"); + if (name == NULL) { + return NULL; + } + + PyObject *mod = create_builtin(tstate, name, spec); + Py_DECREF(name); + return mod; +} + + /* Frozen modules */ static const struct _frozen * @@ -2127,46 +2124,88 @@ static PyMethodDef imp_methods[] = { }; -static struct PyModuleDef impmodule = { +static int +imp_module_exec(PyObject *module) +{ + const wchar_t *mode = _Py_GetConfig()->check_hash_pycs_mode; + PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1); + if (pyc_mode == NULL) { + return -1; + } + if (PyModule_AddObjectRef(module, "check_hash_based_pycs", pyc_mode) < 0) { + Py_DECREF(pyc_mode); + return -1; + } + Py_DECREF(pyc_mode); + + return 0; +} + + +static PyModuleDef_Slot imp_slots[] = { + {Py_mod_exec, imp_module_exec}, + {0, NULL} +}; + +static struct PyModuleDef imp_module = { PyModuleDef_HEAD_INIT, - "_imp", - doc_imp, - 0, - imp_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "_imp", + .m_doc = doc_imp, + .m_size = 0, + .m_methods = imp_methods, + .m_slots = imp_slots, }; PyMODINIT_FUNC PyInit__imp(void) { - PyObject *m, *d; + return PyModuleDef_Init(&imp_module); +} - m = PyModule_Create(&impmodule); - if (m == NULL) { - goto failure; + +// Import the _imp extension by calling manually _imp.create_builtin() and +// _imp.exec_builtin() since importlib is not initialized yet. Initializing +// importlib requires the _imp module: this function fix the bootstrap issue. +PyObject* +_PyImport_BootstrapImp(PyThreadState *tstate) +{ + PyObject *name = PyUnicode_FromString("_imp"); + if (name == NULL) { + return NULL; } - d = PyModule_GetDict(m); - if (d == NULL) { - goto failure; + + // Mock a ModuleSpec object just good enough for PyModule_FromDefAndSpec(): + // an object with just a name attribute. + // + // _imp.__spec__ is overriden by importlib._bootstrap._instal() anyway. + PyObject *attrs = Py_BuildValue("{sO}", "name", name); + if (attrs == NULL) { + goto error; + } + PyObject *spec = _PyNamespace_New(attrs); + Py_DECREF(attrs); + if (spec == NULL) { + goto error; } - const wchar_t *mode = _Py_GetConfig()->check_hash_pycs_mode; - PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1); - if (pyc_mode == NULL) { - goto failure; + // Create the _imp module from its definition. + PyObject *mod = create_builtin(tstate, name, spec); + Py_CLEAR(name); + Py_DECREF(spec); + if (mod == NULL) { + goto error; } - if (PyDict_SetItemString(d, "check_hash_based_pycs", pyc_mode) < 0) { - Py_DECREF(pyc_mode); - goto failure; + assert(mod != Py_None); // not found + + // Execute the _imp module: call imp_module_exec(). + if (exec_builtin_or_dynamic(mod) < 0) { + Py_DECREF(mod); + goto error; } - Py_DECREF(pyc_mode); + return mod; - return m; - failure: - Py_XDECREF(m); +error: + Py_XDECREF(name); return NULL; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 9771951d2d84ca..428c887ef41c50 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -8,6 +8,7 @@ #include "pycore_ceval.h" // _PyEval_FiniGIL() #include "pycore_context.h" // _PyContext_Init() #include "pycore_fileutils.h" // _Py_ResetForceASCII() +#include "pycore_import.h" // _PyImport_BootstrapImp() #include "pycore_initconfig.h" // _PyStatus_OK() #include "pycore_object.h" // _PyDebug_PrintTotalRefs() #include "pycore_pathconfig.h" // _PyConfig_WritePathConfig() @@ -155,18 +156,11 @@ init_importlib(PyThreadState *tstate, PyObject *sysmod) } interp->importlib = Py_NewRef(importlib); - PyObject *import_func = _PyDict_GetItemStringWithError(interp->builtins, - "__import__"); - if (import_func == NULL) { - return -1; - } - interp->import_func = Py_NewRef(import_func); - // Import the _imp module if (verbose) { PySys_FormatStderr("import _imp # builtin\n"); } - PyObject *imp_mod = PyInit__imp(); + PyObject *imp_mod = _PyImport_BootstrapImp(tstate); if (imp_mod == NULL) { return -1; } @@ -741,6 +735,14 @@ pycore_init_builtins(PyThreadState *tstate) } Py_DECREF(bimod); + // Get the __import__ function + PyObject *import_func = _PyDict_GetItemStringWithError(interp->builtins, + "__import__"); + if (import_func == NULL) { + goto error; + } + interp->import_func = Py_NewRef(import_func); + assert(!_PyErr_Occurred(tstate)); return _PyStatus_OK(); From 70a1f03b233d0b175c4c6b6ddfcb4feb6a181fdf Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 18 Nov 2020 19:45:17 -0300 Subject: [PATCH 0582/1261] [doc] Fix smtplib and xml.dom.minidom mark-up (GH-22769) --- Doc/library/smtplib.rst | 2 +- Doc/library/xml.dom.minidom.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index b3cc60357f554a..8f5ca0ac300223 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -115,7 +115,7 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). If the *timeout* parameter is set to be zero, it will raise a :class:`ValueError` to prevent the creation of a non-blocking socket -.. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None, +.. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None, \ source_address=None[, timeout]) The LMTP protocol, which is very similar to ESMTP, is heavily based on the diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 2c78cd939243a8..bf72c46561b7c7 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -132,7 +132,7 @@ module documentation. This section lists the differences between the API and ... # Work with dom. -.. method:: Node.writexml(writer, indent="", addindent="", newl="", +.. method:: Node.writexml(writer, indent="", addindent="", newl="", \ encoding=None, standalone=None) Write XML to the writer object. The writer receives texts but not bytes as input, @@ -174,7 +174,7 @@ module documentation. This section lists the differences between the API and The :meth:`toxml` method now preserves the attribute order specified by the user. -.. method:: Node.toprettyxml(indent="\\t", newl="\\n", encoding=None, +.. method:: Node.toprettyxml(indent="\\t", newl="\\n", encoding=None, \ standalone=None) Return a pretty-printed version of the document. *indent* specifies the From 85f86bb0a4b131fdaf3f4bad41a338f8fc73f9d0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 19 Nov 2020 00:19:06 +0100 Subject: [PATCH 0583/1261] bpo-1635741: Port _warnings to the multi-phase init (GH-23379) Port the _warnings extension module to the multi-phase initialization API (PEP 489). --- ...2020-11-18-23-46-31.bpo-1635741.GVOQ-m.rst | 2 + Python/_warnings.c | 70 ++++++++----------- 2 files changed, 32 insertions(+), 40 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-18-23-46-31.bpo-1635741.GVOQ-m.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-18-23-46-31.bpo-1635741.GVOQ-m.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-18-23-46-31.bpo-1635741.GVOQ-m.rst new file mode 100644 index 00000000000000..ae9cc0bc5dd188 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-18-23-46-31.bpo-1635741.GVOQ-m.rst @@ -0,0 +1,2 @@ +Port the ``_warnings`` extension module to the multi-phase initialization +API (:pep:`489`). Patch by Victor Stinner. diff --git a/Python/_warnings.c b/Python/_warnings.c index 313420c63148f4..021400f5580d6a 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -24,9 +24,6 @@ _Py_IDENTIFIER(ignore); typedef struct _warnings_runtime_state WarningsState; -/* Forward declaration of the _warnings module definition. */ -static struct PyModuleDef warningsmodule; - _Py_IDENTIFIER(__name__); /* Given a module object, get its per-module state. */ @@ -1353,52 +1350,45 @@ static PyMethodDef warnings_functions[] = { }; -static struct PyModuleDef warningsmodule = { - PyModuleDef_HEAD_INIT, - MODULE_NAME, /* m_name */ - warnings__doc__, /* m_doc */ - 0, /* m_size */ - warnings_functions, /* m_methods */ - NULL, /* m_reload */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; - - -PyMODINIT_FUNC -_PyWarnings_Init(void) +static int +warnings_module_exec(PyObject *module) { - PyObject *m; - - m = PyModule_Create(&warningsmodule); - if (m == NULL) { - return NULL; - } - WarningsState *st = warnings_get_state(); if (st == NULL) { - goto error; + return -1; } - - if (PyModule_AddObjectRef(m, "filters", st->filters) < 0) { - goto error; + if (PyModule_AddObjectRef(module, "filters", st->filters) < 0) { + return -1; } - if (PyModule_AddObjectRef(m, "_onceregistry", st->once_registry) < 0) { - goto error; + if (PyModule_AddObjectRef(module, "_onceregistry", st->once_registry) < 0) { + return -1; } - if (PyModule_AddObjectRef(m, "_defaultaction", st->default_action) < 0) { - goto error; + if (PyModule_AddObjectRef(module, "_defaultaction", st->default_action) < 0) { + return -1; } + return 0; +} - return m; -error: - if (st != NULL) { - warnings_clear_state(st); - } - Py_DECREF(m); - return NULL; +static PyModuleDef_Slot warnings_slots[] = { + {Py_mod_exec, warnings_module_exec}, + {0, NULL} +}; + +static struct PyModuleDef warnings_module = { + PyModuleDef_HEAD_INIT, + .m_name = MODULE_NAME, + .m_doc = warnings__doc__, + .m_size = 0, + .m_methods = warnings_functions, + .m_slots = warnings_slots, +}; + + +PyMODINIT_FUNC +_PyWarnings_Init(void) +{ + return PyModuleDef_Init(&warnings_module); } // We need this to ensure that warnings still work until late in finalization. From 55cdc8b444547bcac2a44f3d204f8354f5594b9a Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Thu, 19 Nov 2020 01:49:28 +0200 Subject: [PATCH 0584/1261] bpo-42381: Document walrus-related syntax changes in whatsnew (GH-23382) Automerge-Triggered-By: GH:lysnikolaou --- Doc/whatsnew/3.10.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 0e5e841ff44d70..95594413440b85 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -154,6 +154,9 @@ Other Language Changes :meth:`~object.__index__` method). (Contributed by Serhiy Storchaka in :issue:`37999`.) +* Assignment expressions can now be used unparenthesized within set literals + and set comprehensions, as well as in sequence indexes (but not slices). + New Modules =========== From 16c6d7068f1b477519f74b05779dd4313928cbdf Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Thu, 19 Nov 2020 11:44:24 +0700 Subject: [PATCH 0585/1261] bpo-42345: Add whatsnew for typing.Literal in 3.10 (GH-23385) --- Doc/whatsnew/3.10.rst | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 95594413440b85..ad0ec4def0b70b 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -300,6 +300,32 @@ and :data:`types.NotImplementedType` classes, providing a new set of types readily interpretable by type checkers. (Contributed by Bas van Beek in :issue:`41810`.) +typing +------ + +The behavior of :class:`typing.Literal` was changed to conform with :pep:`586` +and to match the behavior of static type checkers specified in the PEP. + +1. ``Literal`` now de-duplicates parameters. +2. Equality comparisons between ``Literal`` objects are now order independent. +3. ``Literal`` comparisons now respects types. For example, + ``Literal[0] == Literal[False]`` previously evaluated to ``True``. It is + now ``False``. To support this change, the internally used type cache now + supports differentiating types. +4. ``Literal`` objects will now raise a :exc:`TypeError` exception during + equality comparisons if one of their parameters are not :term:`immutable`. + Note that declaring ``Literal`` with mutable parameters will not throw + an error:: + + >>> from typing import Literal + >>> Literal[{0}] + >>> Literal[{0}] == Literal[{False}] + Traceback (most recent call last): + File "", line 1, in + TypeError: unhashable type: 'set' + +(Contributed by Yurii Karabas in :issue:`42345`.) + unittest -------- From 63ae32391bb185af643897ce29151d82e3c62876 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Thu, 19 Nov 2020 07:24:15 +0000 Subject: [PATCH 0586/1261] bpo-42375: subprocess DragonFlyBSD build update. (GH-23320) Same as FreeBSD, file descriptors in /dev/fd id from 0 to 63. --- .../next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst | 1 + Modules/_posixsubprocess.c | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst diff --git a/Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst b/Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst new file mode 100644 index 00000000000000..6d8c80c2f2c0ae --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst @@ -0,0 +1 @@ +subprocess module update for DragonFlyBSD support. \ No newline at end of file diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index a00e13739aca4f..1abe2358aa10b7 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -55,7 +55,7 @@ # endif #endif -#if defined(__FreeBSD__) || (defined(__APPLE__) && defined(__MACH__)) +#if defined(__FreeBSD__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__DragonFly__) # define FD_DIR "/dev/fd" #else # define FD_DIR "/proc/self/fd" @@ -127,9 +127,9 @@ _pos_int_from_ascii(const char *name) } -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined(__DragonFly__) /* When /dev/fd isn't mounted it is often a static directory populated - * with 0 1 2 or entries for 0 .. 63 on FreeBSD, NetBSD and OpenBSD. + * with 0 1 2 or entries for 0 .. 63 on FreeBSD, NetBSD, OpenBSD and DragonFlyBSD. * NetBSD and OpenBSD have a /proc fs available (though not necessarily * mounted) and do not have fdescfs for /dev/fd. MacOS X has a devfs * that properly supports /dev/fd. @@ -377,7 +377,7 @@ _close_open_fds_maybe_unsafe(long start_fd, PyObject* py_fds_to_keep) ++start_fd; #endif -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined(__DragonFly__) if (!_is_fdescfs_mounted_on_dev_fd()) proc_fd_dir = NULL; else From 4f3a28033bf5099cee068410fcbc2672d1d1a98a Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 19 Nov 2020 08:46:29 +0100 Subject: [PATCH 0587/1261] bpo-1635741: Port _random to multiphase initialization (GH-23359) Signed-off-by: Christian Heimes --- ...2020-11-18-09-16-23.bpo-1635741.gkoI7Y.rst | 1 + Modules/_randommodule.c | 94 ++++++++++--------- 2 files changed, 50 insertions(+), 45 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-18-09-16-23.bpo-1635741.gkoI7Y.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-18-09-16-23.bpo-1635741.gkoI7Y.rst b/Misc/NEWS.d/next/C API/2020-11-18-09-16-23.bpo-1635741.gkoI7Y.rst new file mode 100644 index 00000000000000..1f300dca554851 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-18-09-16-23.bpo-1635741.gkoI7Y.rst @@ -0,0 +1 @@ +Port _random extension module to multiphase initialization (:pep:`489`) diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index d33870808622fa..ad4fd474428d4b 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -93,7 +93,8 @@ get_random_state(PyObject *module) static struct PyModuleDef _randommodule; -#define _randomstate_global get_random_state(PyState_FindModule(&_randommodule)) +#define _randomstate_type(type) \ + (get_random_state(_PyType_GetModuleByDef(type, &_randommodule))) typedef struct { PyObject_HEAD @@ -106,9 +107,9 @@ typedef struct { /*[clinic input] module _random -class _random.Random "RandomObject *" "&Random_Type" +class _random.Random "RandomObject *" "_randomstate_type(type)->Random_Type" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f79898ae7847c321]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=70a2c99619474983]*/ /* Random methods */ @@ -290,7 +291,8 @@ random_seed(RandomObject *self, PyObject *arg) } else if (PyLong_Check(arg)) { /* Calling int.__abs__() prevents calling arg.__abs__(), which might return an invalid value. See issue #31478. */ - n = PyObject_CallOneArg(_randomstate_global->Long___abs__, arg); + _randomstate *state = _randomstate_type(Py_TYPE(self)); + n = PyObject_CallOneArg(state->Long___abs__, arg); } else { Py_hash_t hash = PyObject_Hash(arg); @@ -517,8 +519,9 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { RandomObject *self; PyObject *tmp; + _randomstate *state = _randomstate_type(type); - if (type == (PyTypeObject*)_randomstate_global->Random_Type && + if (type == (PyTypeObject*)state->Random_Type && !_PyArg_NoKeywords("Random()", kwds)) { return NULL; } @@ -567,6 +570,45 @@ static PyType_Spec Random_Type_spec = { PyDoc_STRVAR(module_doc, "Module implements the Mersenne Twister random number generator."); +static int +_random_exec(PyObject *module) +{ + _randomstate *state = get_random_state(module); + + state->Random_Type = PyType_FromModuleAndSpec( + module, &Random_Type_spec, NULL); + if (state->Random_Type == NULL) { + return -1; + } + if (PyModule_AddType(module, (PyTypeObject *)state->Random_Type) < 0) { + return -1; + } + + /* Look up and save int.__abs__, which is needed in random_seed(). */ + PyObject *longval = longval = PyLong_FromLong(0); + if (longval == NULL) { + return -1; + } + + PyObject *longtype = PyObject_Type(longval); + Py_DECREF(longval); + if (longtype == NULL) { + return -1; + } + + state->Long___abs__ = PyObject_GetAttrString(longtype, "__abs__"); + Py_DECREF(longtype); + if (state->Long___abs__ == NULL) { + return -1; + } + return 0; +} + +static PyModuleDef_Slot _random_slots[] = { + {Py_mod_exec, _random_exec}, + {0, NULL} +}; + static int _random_traverse(PyObject *module, visitproc visit, void *arg) { @@ -594,7 +636,7 @@ static struct PyModuleDef _randommodule = { module_doc, sizeof(_randomstate), NULL, - NULL, + _random_slots, _random_traverse, _random_clear, _random_free, @@ -603,43 +645,5 @@ static struct PyModuleDef _randommodule = { PyMODINIT_FUNC PyInit__random(void) { - PyObject *m; - - PyObject *Random_Type = PyType_FromSpec(&Random_Type_spec); - if (Random_Type == NULL) { - return NULL; - } - - m = PyModule_Create(&_randommodule); - if (m == NULL) { - Py_DECREF(Random_Type); - return NULL; - } - get_random_state(m)->Random_Type = Random_Type; - - Py_INCREF(Random_Type); - PyModule_AddObject(m, "Random", Random_Type); - - /* Look up and save int.__abs__, which is needed in random_seed(). */ - PyObject *longval = NULL, *longtype = NULL; - longval = PyLong_FromLong(0); - if (longval == NULL) goto fail; - - longtype = PyObject_Type(longval); - if (longtype == NULL) goto fail; - - PyObject *abs = PyObject_GetAttrString(longtype, "__abs__"); - if (abs == NULL) goto fail; - - Py_DECREF(longtype); - Py_DECREF(longval); - get_random_state(m)->Long___abs__ = abs; - - return m; - -fail: - Py_XDECREF(longtype); - Py_XDECREF(longval); - Py_DECREF(m); - return NULL; + return PyModuleDef_Init(&_randommodule); } From d63fb5f79e691eaf674a561fd0463da32dfe49e0 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 19 Nov 2020 08:47:32 +0100 Subject: [PATCH 0588/1261] bpo-1635741: Port grp and pwd to multiphase initialization (GH-23360) Signed-off-by: Christian Heimes --- ...2020-11-18-09-46-35.bpo-1635741.SH8OIT.rst | 2 + Modules/grpmodule.c | 71 ++++++++++--------- Modules/pwdmodule.c | 65 +++++++++-------- 3 files changed, 72 insertions(+), 66 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-18-09-46-35.bpo-1635741.SH8OIT.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-18-09-46-35.bpo-1635741.SH8OIT.rst b/Misc/NEWS.d/next/C API/2020-11-18-09-46-35.bpo-1635741.SH8OIT.rst new file mode 100644 index 00000000000000..34802cd9d3af32 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-18-09-46-35.bpo-1635741.SH8OIT.rst @@ -0,0 +1,2 @@ +Port :mod:`grp` and :mod:`pwd` extension modules to multiphase +initialization (:pep:`489`) diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c index c4d16819e487aa..f6298ca0ee84c1 100644 --- a/Modules/grpmodule.c +++ b/Modules/grpmodule.c @@ -46,20 +46,19 @@ get_grp_state(PyObject *module) return (grpmodulestate *)state; } -#define modulestate_global get_grp_state(PyState_FindModule(&grpmodule)) - static struct PyModuleDef grpmodule; #define DEFAULT_BUFFER_SIZE 1024 static PyObject * -mkgrent(struct group *p) +mkgrent(PyObject *module, struct group *p) { int setIndex = 0; PyObject *v, *w; char **member; - if ((v = PyStructSequence_New(modulestate_global->StructGrpType)) == NULL) + v = PyStructSequence_New(get_grp_state(module)->StructGrpType); + if (v == NULL) return NULL; if ((w = PyList_New(0)) == NULL) { @@ -170,7 +169,7 @@ grp_getgrgid_impl(PyObject *module, PyObject *id) Py_DECREF(gid_obj); return NULL; } - retval = mkgrent(p); + retval = mkgrent(module, p); #ifdef HAVE_GETGRGID_R PyMem_RawFree(buf); #endif @@ -248,7 +247,7 @@ grp_getgrnam_impl(PyObject *module, PyObject *name) } goto out; } - retval = mkgrent(p); + retval = mkgrent(module, p); out: PyMem_RawFree(buf); Py_DECREF(bytes); @@ -275,7 +274,7 @@ grp_getgrall_impl(PyObject *module) return NULL; setgrent(); while ((p = getgrent()) != NULL) { - PyObject *v = mkgrent(p); + PyObject *v = mkgrent(module, p); if (v == NULL || PyList_Append(d, v) != 0) { Py_XDECREF(v); Py_DECREF(d); @@ -311,6 +310,26 @@ users are not explicitly listed as members of the groups they are in\n\ according to the password database. Check both databases to get\n\ complete membership information.)"); +static int +grpmodule_exec(PyObject *module) +{ + grpmodulestate *state = get_grp_state(module); + + state->StructGrpType = PyStructSequence_NewType(&struct_group_type_desc); + if (state->StructGrpType == NULL) { + return -1; + } + if (PyModule_AddType(module, state->StructGrpType) < 0) { + return -1; + } + return 0; +} + +static PyModuleDef_Slot grpmodule_slots[] = { + {Py_mod_exec, grpmodule_exec}, + {0, NULL} +}; + static int grpmodule_traverse(PyObject *m, visitproc visit, void *arg) { Py_VISIT(get_grp_state(m)->StructGrpType); return 0; @@ -326,37 +345,19 @@ static void grpmodule_free(void *m) { } static struct PyModuleDef grpmodule = { - PyModuleDef_HEAD_INIT, - "grp", - grp__doc__, - sizeof(grpmodulestate), - grp_methods, - NULL, - grpmodule_traverse, - grpmodule_clear, - grpmodule_free, + PyModuleDef_HEAD_INIT, + .m_name = "grp", + .m_doc = grp__doc__, + .m_size = sizeof(grpmodulestate), + .m_methods = grp_methods, + .m_slots = grpmodule_slots, + .m_traverse = grpmodule_traverse, + .m_clear = grpmodule_clear, + .m_free = grpmodule_free, }; PyMODINIT_FUNC PyInit_grp(void) { - PyObject *m; - if ((m = PyState_FindModule(&grpmodule)) != NULL) { - Py_INCREF(m); - return m; - } - - if ((m = PyModule_Create(&grpmodule)) == NULL) { - return NULL; - } - - grpmodulestate *state = PyModule_GetState(m); - state->StructGrpType = PyStructSequence_NewType(&struct_group_type_desc); - if (state->StructGrpType == NULL) { - return NULL; - } - - Py_INCREF(state->StructGrpType); - PyModule_AddObject(m, "struct_group", (PyObject *) state->StructGrpType); - return m; + return PyModuleDef_Init(&grpmodule); } diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c index 901a3ed9a2e378..14d3f9dcb1c60f 100644 --- a/Modules/pwdmodule.c +++ b/Modules/pwdmodule.c @@ -59,8 +59,6 @@ get_pwd_state(PyObject *module) return (pwdmodulestate *)state; } -#define modulestate_global get_pwd_state(PyState_FindModule(&pwdmodule)) - static struct PyModuleDef pwdmodule; #define DEFAULT_BUFFER_SIZE 1024 @@ -79,10 +77,10 @@ sets(PyObject *v, int i, const char* val) } static PyObject * -mkpwent(struct passwd *p) +mkpwent(PyObject *module, struct passwd *p) { int setIndex = 0; - PyObject *v = PyStructSequence_New(modulestate_global->StructPwdType); + PyObject *v = PyStructSequence_New(get_pwd_state(module)->StructPwdType); if (v == NULL) return NULL; @@ -194,7 +192,7 @@ pwd_getpwuid(PyObject *module, PyObject *uidobj) Py_DECREF(uid_obj); return NULL; } - retval = mkpwent(p); + retval = mkpwent(module, p); #ifdef HAVE_GETPWUID_R PyMem_RawFree(buf); #endif @@ -274,7 +272,7 @@ pwd_getpwnam_impl(PyObject *module, PyObject *name) } goto out; } - retval = mkpwent(p); + retval = mkpwent(module, p); out: PyMem_RawFree(buf); Py_DECREF(bytes); @@ -300,7 +298,7 @@ pwd_getpwall_impl(PyObject *module) return NULL; setpwent(); while ((p = getpwent()) != NULL) { - PyObject *v = mkpwent(p); + PyObject *v = mkpwent(module, p); if (v == NULL || PyList_Append(d, v) != 0) { Py_XDECREF(v); Py_DECREF(d); @@ -323,6 +321,26 @@ static PyMethodDef pwd_methods[] = { {NULL, NULL} /* sentinel */ }; +static int +pwdmodule_exec(PyObject *module) +{ + pwdmodulestate *state = get_pwd_state(module); + + state->StructPwdType = PyStructSequence_NewType(&struct_pwd_type_desc); + if (state->StructPwdType == NULL) { + return -1; + } + if (PyModule_AddType(module, state->StructPwdType) < 0) { + return -1; + } + return 0; +} + +static PyModuleDef_Slot pwdmodule_slots[] = { + {Py_mod_exec, pwdmodule_exec}, + {0, NULL} +}; + static int pwdmodule_traverse(PyObject *m, visitproc visit, void *arg) { Py_VISIT(get_pwd_state(m)->StructPwdType); return 0; @@ -337,34 +355,19 @@ static void pwdmodule_free(void *m) { static struct PyModuleDef pwdmodule = { PyModuleDef_HEAD_INIT, - "pwd", - pwd__doc__, - sizeof(pwdmodulestate), - pwd_methods, - NULL, - pwdmodule_traverse, - pwdmodule_clear, - pwdmodule_free, + .m_name = "pwd", + .m_doc = pwd__doc__, + .m_size = sizeof(pwdmodulestate), + .m_methods = pwd_methods, + .m_slots = pwdmodule_slots, + .m_traverse = pwdmodule_traverse, + .m_clear = pwdmodule_clear, + .m_free = pwdmodule_free, }; PyMODINIT_FUNC PyInit_pwd(void) { - PyObject *m; - if ((m = PyState_FindModule(&pwdmodule)) != NULL) { - Py_INCREF(m); - return m; - } - if ((m = PyModule_Create(&pwdmodule)) == NULL) - return NULL; - - pwdmodulestate *state = PyModule_GetState(m); - state->StructPwdType = PyStructSequence_NewType(&struct_pwd_type_desc); - if (state->StructPwdType == NULL) { - return NULL; - } - Py_INCREF(state->StructPwdType); - PyModule_AddObject(m, "struct_passwd", (PyObject *) state->StructPwdType); - return m; + return PyModuleDef_Init(&pwdmodule); } From 1bc728148cc15551fd508ca6abe0080506e80df4 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 19 Nov 2020 09:24:37 +0100 Subject: [PATCH 0589/1261] bpo-1635741: Port _queue to multiphase initialization (GH-23376) Signed-off-by: Christian Heimes Automerge-Triggered-By: GH:tiran --- ...2020-11-18-20-11-13.bpo-1635741.fe3iRb.rst | 1 + Modules/_queuemodule.c | 73 +++++++++---------- 2 files changed, 37 insertions(+), 37 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-18-20-11-13.bpo-1635741.fe3iRb.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-18-20-11-13.bpo-1635741.fe3iRb.rst b/Misc/NEWS.d/next/C API/2020-11-18-20-11-13.bpo-1635741.fe3iRb.rst new file mode 100644 index 00000000000000..78df4fe0432266 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-18-20-11-13.bpo-1635741.fe3iRb.rst @@ -0,0 +1 @@ +Port _queue extension module to multiphase initialization (:pep:`489`) diff --git a/Modules/_queuemodule.c b/Modules/_queuemodule.c index 7cf73992795c6b..a2b6ac87a72ebf 100644 --- a/Modules/_queuemodule.c +++ b/Modules/_queuemodule.c @@ -381,11 +381,46 @@ PyDoc_STRVAR(queue_module_doc, "C implementation of the Python queue module.\n\ This module is an implementation detail, please do not use it directly."); +static int +queuemodule_exec(PyObject *module) +{ + simplequeue_state *state = simplequeue_get_state(module); + + state->EmptyError = PyErr_NewExceptionWithDoc( + "_queue.Empty", + "Exception raised by Queue.get(block=0)/get_nowait().", + NULL, NULL); + if (state->EmptyError == NULL) { + return -1; + } + if (PyModule_AddObjectRef(module, "Empty", state->EmptyError) < 0) { + return -1; + } + + state->SimpleQueueType = (PyTypeObject *)PyType_FromModuleAndSpec( + module, &simplequeue_spec, NULL); + if (state->SimpleQueueType == NULL) { + return -1; + } + if (PyModule_AddType(module, state->SimpleQueueType) < 0) { + return -1; + } + + return 0; +} + +static PyModuleDef_Slot queuemodule_slots[] = { + {Py_mod_exec, queuemodule_exec}, + {0, NULL} +}; + + static struct PyModuleDef queuemodule = { .m_base = PyModuleDef_HEAD_INIT, .m_name = "_queue", .m_doc = queue_module_doc, .m_size = sizeof(simplequeue_state), + .m_slots = queuemodule_slots, .m_traverse = queue_traverse, .m_clear = queue_clear, .m_free = queue_free, @@ -395,41 +430,5 @@ static struct PyModuleDef queuemodule = { PyMODINIT_FUNC PyInit__queue(void) { - PyObject *m; - simplequeue_state *state; - - /* Create the module */ - m = PyModule_Create(&queuemodule); - if (m == NULL) - return NULL; - - state = simplequeue_get_state(m); - state->EmptyError = PyErr_NewExceptionWithDoc( - "_queue.Empty", - "Exception raised by Queue.get(block=0)/get_nowait().", - NULL, NULL); - if (state->EmptyError == NULL) - goto error; - - Py_INCREF(state->EmptyError); - if (PyModule_AddObject(m, "Empty", state->EmptyError) < 0) { - Py_DECREF(state->EmptyError); - goto error; - } - - state->SimpleQueueType = (PyTypeObject *)PyType_FromModuleAndSpec(m, - &simplequeue_spec, - NULL); - if (state->SimpleQueueType == NULL) { - goto error; - } - if (PyModule_AddType(m, state->SimpleQueueType) < 0) { - goto error; - } - - return m; - -error: - Py_DECREF(m); - return NULL; + return PyModuleDef_Init(&queuemodule); } From 8e6f5063f256e8165844491645bd19921762c23b Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 19 Nov 2020 10:54:03 +0100 Subject: [PATCH 0590/1261] bpo-1635741: Port spwd to multiphase initialization (GH-23390) Signed-off-by: Christian Heimes --- ...2020-11-19-09-17-01.bpo-1635741.6F9o6L.rst | 1 + Modules/spwdmodule.c | 84 +++++++++++++------ 2 files changed, 58 insertions(+), 27 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-19-09-17-01.bpo-1635741.6F9o6L.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-19-09-17-01.bpo-1635741.6F9o6L.rst b/Misc/NEWS.d/next/C API/2020-11-19-09-17-01.bpo-1635741.6F9o6L.rst new file mode 100644 index 00000000000000..d925a24da1ed7e --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-19-09-17-01.bpo-1635741.6F9o6L.rst @@ -0,0 +1 @@ +Port :mod:`spwd` extension module to multiphase initialization (:pep:`489`) diff --git a/Modules/spwdmodule.c b/Modules/spwdmodule.c index 1601ec0f2fc4e7..acea30679bf5ec 100644 --- a/Modules/spwdmodule.c +++ b/Modules/spwdmodule.c @@ -59,9 +59,19 @@ static PyStructSequence_Desc struct_spwd_type_desc = { 9, }; -static int initialized; -static PyTypeObject StructSpwdType; +typedef struct { + PyTypeObject *StructSpwdType; +} spwdmodulestate; +static inline spwdmodulestate* +get_spwd_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (spwdmodulestate *)state; +} + +static struct PyModuleDef spwdmodule; static void sets(PyObject *v, int i, const char* val) @@ -75,10 +85,10 @@ sets(PyObject *v, int i, const char* val) } } -static PyObject *mkspent(struct spwd *p) +static PyObject *mkspent(PyObject *module, struct spwd *p) { int setIndex = 0; - PyObject *v = PyStructSequence_New(&StructSpwdType); + PyObject *v = PyStructSequence_New(get_spwd_state(module)->StructSpwdType); if (v == NULL) return NULL; @@ -144,7 +154,7 @@ spwd_getspnam_impl(PyObject *module, PyObject *arg) PyErr_SetString(PyExc_KeyError, "getspnam(): name not found"); goto out; } - retval = mkspent(p); + retval = mkspent(module, p); out: Py_DECREF(bytes); return retval; @@ -172,7 +182,7 @@ spwd_getspall_impl(PyObject *module) return NULL; setspent(); while ((p = getspent()) != NULL) { - PyObject *v = mkspent(p); + PyObject *v = mkspent(module, p); if (v == NULL || PyList_Append(d, v) != 0) { Py_XDECREF(v); Py_DECREF(d); @@ -197,34 +207,54 @@ static PyMethodDef spwd_methods[] = { {NULL, NULL} /* sentinel */ }; +static int +spwdmodule_exec(PyObject *module) +{ + spwdmodulestate *state = get_spwd_state(module); + + state->StructSpwdType = PyStructSequence_NewType(&struct_spwd_type_desc); + if (state->StructSpwdType == NULL) { + return -1; + } + if (PyModule_AddType(module, state->StructSpwdType) < 0) { + return -1; + } + return 0; +} + +static PyModuleDef_Slot spwdmodule_slots[] = { + {Py_mod_exec, spwdmodule_exec}, + {0, NULL} +}; + +static int spwdmodule_traverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(get_spwd_state(m)->StructSpwdType); + return 0; +} +static int spwdmodule_clear(PyObject *m) { + Py_CLEAR(get_spwd_state(m)->StructSpwdType); + return 0; +} + +static void spwdmodule_free(void *m) { + spwdmodule_clear((PyObject *)m); +} static struct PyModuleDef spwdmodule = { PyModuleDef_HEAD_INIT, - "spwd", - spwd__doc__, - -1, - spwd_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "spwd", + .m_doc = spwd__doc__, + .m_size = sizeof(spwdmodulestate), + .m_methods = spwd_methods, + .m_slots = spwdmodule_slots, + .m_traverse = spwdmodule_traverse, + .m_clear = spwdmodule_clear, + .m_free = spwdmodule_free, }; PyMODINIT_FUNC PyInit_spwd(void) { - PyObject *m; - m=PyModule_Create(&spwdmodule); - if (m == NULL) - return NULL; - if (!initialized) { - if (PyStructSequence_InitType2(&StructSpwdType, - &struct_spwd_type_desc) < 0) - return NULL; - } - Py_INCREF((PyObject *) &StructSpwdType); - PyModule_AddObject(m, "struct_spwd", (PyObject *) &StructSpwdType); - initialized = 1; - return m; + return PyModuleDef_Init(&spwdmodule); } From 12fb7cc74dc480df55bcf4a2bd5124865f3c0964 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 19 Nov 2020 11:20:57 +0100 Subject: [PATCH 0591/1261] bpo-42403: Fix pyflakes warnings in importlib (GH-23396) Remove unused imports and unused local variables. --- Lib/importlib/abc.py | 1 - Lib/importlib/machinery.py | 2 -- Lib/importlib/util.py | 1 - 3 files changed, 4 deletions(-) diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py index 97d5afa3001930..55e70889f22f70 100644 --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -1,5 +1,4 @@ """Abstract base classes related to import.""" -from . import _bootstrap from . import _bootstrap_external from . import machinery try: diff --git a/Lib/importlib/machinery.py b/Lib/importlib/machinery.py index 1b2b5c9b4f3407..9a7757fb6e4494 100644 --- a/Lib/importlib/machinery.py +++ b/Lib/importlib/machinery.py @@ -1,7 +1,5 @@ """The machinery of importlib: finders, loaders, hooks, etc.""" -import _imp - from ._bootstrap import ModuleSpec from ._bootstrap import BuiltinImporter from ._bootstrap import FrozenImporter diff --git a/Lib/importlib/util.py b/Lib/importlib/util.py index 1e44843a687f2b..98a0fa54dfd873 100644 --- a/Lib/importlib/util.py +++ b/Lib/importlib/util.py @@ -232,7 +232,6 @@ def __getattribute__(self, attr): # Figure out exactly what attributes were mutated between the creation # of the module and now. attrs_then = self.__spec__.loader_state['__dict__'] - original_type = self.__spec__.loader_state['__class__'] attrs_now = self.__dict__ attrs_updated = {} for key, value in attrs_now.items(): From 0bd307355115753333f530103642407e0fac9540 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 19 Nov 2020 13:43:43 +0100 Subject: [PATCH 0592/1261] bpo-42403: Simplify importlib external bootstrap (GH-23397) Simplify the importlib external bootstrap code: importlib._bootstrap_external now uses regular imports to import builtin modules. When it is imported, the builtin __import__() function is already fully working and so can be used to import builtin modules like sys. --- Lib/importlib/__init__.py | 2 +- Lib/importlib/_bootstrap.py | 7 + Lib/importlib/_bootstrap_external.py | 111 +- .../2020-11-19-10-12-39.bpo-42403.t7q5AX.rst | 5 + Python/importlib.h | 3614 +++++------ Python/importlib_external.h | 5310 ++++++++--------- 6 files changed, 4503 insertions(+), 4546 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-19-10-12-39.bpo-42403.t7q5AX.rst diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py index bea37d766262f8..03ff71489abbd6 100644 --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -34,7 +34,7 @@ import _frozen_importlib_external as _bootstrap_external except ImportError: from . import _bootstrap_external - _bootstrap_external._setup(_bootstrap) + _bootstrap_external._set_bootstrap_module(_bootstrap) _bootstrap._bootstrap_external = _bootstrap_external else: _bootstrap_external.__name__ = 'importlib._bootstrap_external' diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index e00b27ece2603e..854b60397b1390 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -22,8 +22,15 @@ # Bootstrap-related code ###################################################### +# Modules injected manually by _setup() +_thread = None +_warnings = None +_weakref = None + +# Import done by _install_external_importers() _bootstrap_external = None + def _wrap(new, old): """Simple substitute for functools.update_wrapper.""" for replace in ['__module__', '__name__', '__qualname__', '__doc__']: diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 5c30a67aac44d2..a0236c488a4041 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -19,6 +19,36 @@ # reference any injected objects! This includes not only global code but also # anything specified at the class level. +# Module injected manually by _set_bootstrap_module() +_bootstrap = None + +# Import builtin modules +import _imp +import _io +import sys +import _warnings +import marshal + + +_MS_WINDOWS = (sys.platform == 'win32') +if _MS_WINDOWS: + import nt as _os + import winreg +else: + import posix as _os + + +if _MS_WINDOWS: + path_separators = ['\\', '/'] +else: + path_separators = ['/'] +# Assumption made in _path_join() +assert all(len(sep) == 1 for sep in path_separators) +path_sep = path_separators[0] +path_separators = ''.join(path_separators) +_pathseps_with_colon = {f':{s}' for s in path_separators} + + # Bootstrap-related code ###################################################### _CASE_INSENSITIVE_PLATFORMS_STR_KEY = 'win', _CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin' @@ -42,6 +72,8 @@ def _relax_case(): return False return _relax_case +_relax_case = _make_relax_case() + def _pack_uint32(x): """Convert a 32-bit integer to little-endian.""" @@ -294,7 +326,11 @@ def _write_atomic(path, data, mode=0o666): _PYCACHE = '__pycache__' _OPT = 'opt-' -SOURCE_SUFFIXES = ['.py'] # _setup() adds .pyw as needed. +SOURCE_SUFFIXES = ['.py'] +if _MS_WINDOWS: + SOURCE_SUFFIXES.append('.pyw') + +EXTENSION_SUFFIXES = _imp.extension_suffixes() BYTECODE_SUFFIXES = ['.pyc'] # Deprecated. @@ -469,15 +505,18 @@ def _check_name_wrapper(self, name=None, *args, **kwargs): raise ImportError('loader for %s cannot handle %s' % (self.name, name), name=name) return method(self, name, *args, **kwargs) - try: + + # FIXME: @_check_name is used to define class methods before the + # _bootstrap module is set by _set_bootstrap_module(). + if _bootstrap is not None: _wrap = _bootstrap._wrap - except NameError: - # XXX yuck + else: def _wrap(new, old): for replace in ['__module__', '__name__', '__qualname__', '__doc__']: if hasattr(old, replace): setattr(new, replace, getattr(old, replace)) new.__dict__.update(old.__dict__) + _wrap(_check_name_wrapper, method) return _check_name_wrapper @@ -713,7 +752,7 @@ class WindowsRegistryFinder: REGISTRY_KEY_DEBUG = ( 'Software\\Python\\PythonCore\\{sys_version}' '\\Modules\\{fullname}\\Debug') - DEBUG_BUILD = False # Changed in _setup() + DEBUG_BUILD = (_MS_WINDOWS and '_d.pyd' in EXTENSION_SUFFIXES) @classmethod def _open_registry(cls, key): @@ -1060,10 +1099,6 @@ def get_source(self, fullname): return None -# Filled in by _setup(). -EXTENSION_SUFFIXES = [] - - class ExtensionFileLoader(FileLoader, _LoaderBasics): """Loader for extension modules. @@ -1552,66 +1587,14 @@ def _get_supported_file_loaders(): return [extensions, source, bytecode] -def _setup(_bootstrap_module): - """Setup the path-based importers for importlib by importing needed - built-in modules and injecting them into the global namespace. - - Other components are extracted from the core bootstrap module. - - """ - global sys, _imp, _bootstrap +def _set_bootstrap_module(_bootstrap_module): + global _bootstrap _bootstrap = _bootstrap_module - sys = _bootstrap.sys - _imp = _bootstrap._imp - - self_module = sys.modules[__name__] - - # Directly load the os module (needed during bootstrap). - os_details = ('posix', ['/']), ('nt', ['\\', '/']) - for builtin_os, path_separators in os_details: - # Assumption made in _path_join() - assert all(len(sep) == 1 for sep in path_separators) - path_sep = path_separators[0] - if builtin_os in sys.modules: - os_module = sys.modules[builtin_os] - break - else: - try: - os_module = _bootstrap._builtin_from_name(builtin_os) - break - except ImportError: - continue - else: - raise ImportError('importlib requires posix or nt') - - setattr(self_module, '_os', os_module) - setattr(self_module, 'path_sep', path_sep) - setattr(self_module, 'path_separators', ''.join(path_separators)) - setattr(self_module, '_pathseps_with_colon', {f':{s}' for s in path_separators}) - - # Directly load built-in modules needed during bootstrap. - builtin_names = ['_io', '_warnings', 'marshal'] - if builtin_os == 'nt': - builtin_names.append('winreg') - for builtin_name in builtin_names: - if builtin_name not in sys.modules: - builtin_module = _bootstrap._builtin_from_name(builtin_name) - else: - builtin_module = sys.modules[builtin_name] - setattr(self_module, builtin_name, builtin_module) - - # Constants - setattr(self_module, '_relax_case', _make_relax_case()) - EXTENSION_SUFFIXES.extend(_imp.extension_suffixes()) - if builtin_os == 'nt': - SOURCE_SUFFIXES.append('.pyw') - if '_d.pyd' in EXTENSION_SUFFIXES: - WindowsRegistryFinder.DEBUG_BUILD = True def _install(_bootstrap_module): """Install the path-based import components.""" - _setup(_bootstrap_module) + _set_bootstrap_module(_bootstrap_module) supported_loaders = _get_supported_file_loaders() sys.path_hooks.extend([FileFinder.path_hook(*supported_loaders)]) sys.meta_path.append(PathFinder) diff --git a/Misc/NEWS.d/next/Library/2020-11-19-10-12-39.bpo-42403.t7q5AX.rst b/Misc/NEWS.d/next/Library/2020-11-19-10-12-39.bpo-42403.t7q5AX.rst new file mode 100644 index 00000000000000..a90459a23ebf7a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-19-10-12-39.bpo-42403.t7q5AX.rst @@ -0,0 +1,5 @@ +Simplify the :mod:`importlib` external bootstrap code: +``importlib._bootstrap_external`` now uses regular imports to import builtin +modules. When it is imported, the builtin :func:`__import__()` function is +already fully working and so can be used to import builtin modules like +:mod:`sys`. Patch by Victor Stinner. diff --git a/Python/importlib.h b/Python/importlib.h index b2a1d7fecefea1..065e6b85833b20 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -1,1824 +1,1826 @@ /* Auto-generated by Programs/_freeze_importlib.c */ const unsigned char _Py_M__importlib_bootstrap[] = { 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,64,0,0,0,115,194,1,0,0,100,0, - 90,0,100,1,97,1,100,2,100,3,132,0,90,2,100,4, - 100,5,132,0,90,3,105,0,90,4,105,0,90,5,71,0, - 100,6,100,7,132,0,100,7,101,6,131,3,90,7,71,0, - 100,8,100,9,132,0,100,9,131,2,90,8,71,0,100,10, - 100,11,132,0,100,11,131,2,90,9,71,0,100,12,100,13, - 132,0,100,13,131,2,90,10,100,14,100,15,132,0,90,11, - 100,16,100,17,132,0,90,12,100,18,100,19,132,0,90,13, - 100,20,100,21,156,1,100,22,100,23,132,2,90,14,100,24, - 100,25,132,0,90,15,100,26,100,27,132,0,90,16,100,28, - 100,29,132,0,90,17,100,30,100,31,132,0,90,18,71,0, - 100,32,100,33,132,0,100,33,131,2,90,19,100,1,100,1, - 100,34,156,2,100,35,100,36,132,2,90,20,100,94,100,37, - 100,38,132,1,90,21,100,39,100,40,156,1,100,41,100,42, - 132,2,90,22,100,43,100,44,132,0,90,23,100,45,100,46, - 132,0,90,24,100,47,100,48,132,0,90,25,100,49,100,50, - 132,0,90,26,100,51,100,52,132,0,90,27,100,53,100,54, - 132,0,90,28,71,0,100,55,100,56,132,0,100,56,131,2, - 90,29,71,0,100,57,100,58,132,0,100,58,131,2,90,30, - 71,0,100,59,100,60,132,0,100,60,131,2,90,31,100,61, - 100,62,132,0,90,32,100,63,100,64,132,0,90,33,100,95, - 100,65,100,66,132,1,90,34,100,67,100,68,132,0,90,35, - 100,69,90,36,101,36,100,70,23,0,90,37,100,71,100,72, - 132,0,90,38,101,39,131,0,90,40,100,73,100,74,132,0, - 90,41,100,96,100,76,100,77,132,1,90,42,100,39,100,78, - 156,1,100,79,100,80,132,2,90,43,100,81,100,82,132,0, - 90,44,100,97,100,84,100,85,132,1,90,45,100,86,100,87, - 132,0,90,46,100,88,100,89,132,0,90,47,100,90,100,91, - 132,0,90,48,100,92,100,93,132,0,90,49,100,1,83,0, - 41,98,97,83,1,0,0,67,111,114,101,32,105,109,112,108, - 101,109,101,110,116,97,116,105,111,110,32,111,102,32,105,109, - 112,111,114,116,46,10,10,84,104,105,115,32,109,111,100,117, - 108,101,32,105,115,32,78,79,84,32,109,101,97,110,116,32, - 116,111,32,98,101,32,100,105,114,101,99,116,108,121,32,105, - 109,112,111,114,116,101,100,33,32,73,116,32,104,97,115,32, - 98,101,101,110,32,100,101,115,105,103,110,101,100,32,115,117, - 99,104,10,116,104,97,116,32,105,116,32,99,97,110,32,98, - 101,32,98,111,111,116,115,116,114,97,112,112,101,100,32,105, - 110,116,111,32,80,121,116,104,111,110,32,97,115,32,116,104, - 101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, - 32,111,102,32,105,109,112,111,114,116,46,32,65,115,10,115, - 117,99,104,32,105,116,32,114,101,113,117,105,114,101,115,32, - 116,104,101,32,105,110,106,101,99,116,105,111,110,32,111,102, - 32,115,112,101,99,105,102,105,99,32,109,111,100,117,108,101, - 115,32,97,110,100,32,97,116,116,114,105,98,117,116,101,115, - 32,105,110,32,111,114,100,101,114,32,116,111,10,119,111,114, - 107,46,32,79,110,101,32,115,104,111,117,108,100,32,117,115, - 101,32,105,109,112,111,114,116,108,105,98,32,97,115,32,116, - 104,101,32,112,117,98,108,105,99,45,102,97,99,105,110,103, - 32,118,101,114,115,105,111,110,32,111,102,32,116,104,105,115, - 32,109,111,100,117,108,101,46,10,10,78,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0, - 67,0,0,0,115,56,0,0,0,100,1,68,0,93,32,125, - 2,116,0,124,1,124,2,131,2,114,4,116,1,124,0,124, - 2,116,2,124,1,124,2,131,2,131,3,1,0,113,4,124, - 0,106,3,160,4,124,1,106,3,161,1,1,0,100,2,83, - 0,41,3,122,47,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,41,4,218,10,95,95,109,111,100,117,108,101, - 95,95,218,8,95,95,110,97,109,101,95,95,218,12,95,95, - 113,117,97,108,110,97,109,101,95,95,218,7,95,95,100,111, - 99,95,95,78,41,5,218,7,104,97,115,97,116,116,114,218, - 7,115,101,116,97,116,116,114,218,7,103,101,116,97,116,116, - 114,218,8,95,95,100,105,99,116,95,95,218,6,117,112,100, - 97,116,101,41,3,90,3,110,101,119,90,3,111,108,100,218, - 7,114,101,112,108,97,99,101,169,0,114,10,0,0,0,250, - 29,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,218,5, - 95,119,114,97,112,27,0,0,0,115,12,0,0,0,8,2, - 10,1,20,1,14,1,4,128,255,128,114,12,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 2,0,0,0,67,0,0,0,115,12,0,0,0,116,0,116, - 1,131,1,124,0,131,1,83,0,169,1,78,41,2,218,4, - 116,121,112,101,218,3,115,121,115,169,1,218,4,110,97,109, - 101,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,11,95,110,101,119,95,109,111,100,117,108,101,35,0,0, - 0,115,4,0,0,0,12,1,255,128,114,18,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,64,0,0,0,115,12,0,0,0,101,0,90, - 1,100,0,90,2,100,1,83,0,41,2,218,14,95,68,101, - 97,100,108,111,99,107,69,114,114,111,114,78,41,3,114,1, - 0,0,0,114,0,0,0,0,114,2,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,19,0,0,0,48,0,0,0,115,6,0,0,0,8, - 0,4,1,255,128,114,19,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,56,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,100,7,132,0,90,6,100,8,100,9, - 132,0,90,7,100,10,100,11,132,0,90,8,100,12,83,0, - 41,13,218,11,95,77,111,100,117,108,101,76,111,99,107,122, - 169,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,0,0,0,0,2,0,0,0,2,0,0,0,67, - 0,0,0,115,48,0,0,0,116,0,160,1,161,0,124,0, - 95,2,116,0,160,1,161,0,124,0,95,3,124,1,124,0, - 95,4,100,0,124,0,95,5,100,1,124,0,95,6,100,1, - 124,0,95,7,100,0,83,0,169,2,78,233,0,0,0,0, - 41,8,218,7,95,116,104,114,101,97,100,90,13,97,108,108, - 111,99,97,116,101,95,108,111,99,107,218,4,108,111,99,107, - 218,6,119,97,107,101,117,112,114,17,0,0,0,218,5,111, - 119,110,101,114,218,5,99,111,117,110,116,218,7,119,97,105, - 116,101,114,115,169,2,218,4,115,101,108,102,114,17,0,0, + 0,4,0,0,0,64,0,0,0,115,206,1,0,0,100,0, + 90,0,100,1,90,1,100,1,90,2,100,1,90,3,100,1, + 97,4,100,2,100,3,132,0,90,5,100,4,100,5,132,0, + 90,6,105,0,90,7,105,0,90,8,71,0,100,6,100,7, + 132,0,100,7,101,9,131,3,90,10,71,0,100,8,100,9, + 132,0,100,9,131,2,90,11,71,0,100,10,100,11,132,0, + 100,11,131,2,90,12,71,0,100,12,100,13,132,0,100,13, + 131,2,90,13,100,14,100,15,132,0,90,14,100,16,100,17, + 132,0,90,15,100,18,100,19,132,0,90,16,100,20,100,21, + 156,1,100,22,100,23,132,2,90,17,100,24,100,25,132,0, + 90,18,100,26,100,27,132,0,90,19,100,28,100,29,132,0, + 90,20,100,30,100,31,132,0,90,21,71,0,100,32,100,33, + 132,0,100,33,131,2,90,22,100,1,100,1,100,34,156,2, + 100,35,100,36,132,2,90,23,100,94,100,37,100,38,132,1, + 90,24,100,39,100,40,156,1,100,41,100,42,132,2,90,25, + 100,43,100,44,132,0,90,26,100,45,100,46,132,0,90,27, + 100,47,100,48,132,0,90,28,100,49,100,50,132,0,90,29, + 100,51,100,52,132,0,90,30,100,53,100,54,132,0,90,31, + 71,0,100,55,100,56,132,0,100,56,131,2,90,32,71,0, + 100,57,100,58,132,0,100,58,131,2,90,33,71,0,100,59, + 100,60,132,0,100,60,131,2,90,34,100,61,100,62,132,0, + 90,35,100,63,100,64,132,0,90,36,100,95,100,65,100,66, + 132,1,90,37,100,67,100,68,132,0,90,38,100,69,90,39, + 101,39,100,70,23,0,90,40,100,71,100,72,132,0,90,41, + 101,42,131,0,90,43,100,73,100,74,132,0,90,44,100,96, + 100,76,100,77,132,1,90,45,100,39,100,78,156,1,100,79, + 100,80,132,2,90,46,100,81,100,82,132,0,90,47,100,97, + 100,84,100,85,132,1,90,48,100,86,100,87,132,0,90,49, + 100,88,100,89,132,0,90,50,100,90,100,91,132,0,90,51, + 100,92,100,93,132,0,90,52,100,1,83,0,41,98,97,83, + 1,0,0,67,111,114,101,32,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,32,111,102,32,105,109,112,111,114,116, + 46,10,10,84,104,105,115,32,109,111,100,117,108,101,32,105, + 115,32,78,79,84,32,109,101,97,110,116,32,116,111,32,98, + 101,32,100,105,114,101,99,116,108,121,32,105,109,112,111,114, + 116,101,100,33,32,73,116,32,104,97,115,32,98,101,101,110, + 32,100,101,115,105,103,110,101,100,32,115,117,99,104,10,116, + 104,97,116,32,105,116,32,99,97,110,32,98,101,32,98,111, + 111,116,115,116,114,97,112,112,101,100,32,105,110,116,111,32, + 80,121,116,104,111,110,32,97,115,32,116,104,101,32,105,109, + 112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32, + 105,109,112,111,114,116,46,32,65,115,10,115,117,99,104,32, + 105,116,32,114,101,113,117,105,114,101,115,32,116,104,101,32, + 105,110,106,101,99,116,105,111,110,32,111,102,32,115,112,101, + 99,105,102,105,99,32,109,111,100,117,108,101,115,32,97,110, + 100,32,97,116,116,114,105,98,117,116,101,115,32,105,110,32, + 111,114,100,101,114,32,116,111,10,119,111,114,107,46,32,79, + 110,101,32,115,104,111,117,108,100,32,117,115,101,32,105,109, + 112,111,114,116,108,105,98,32,97,115,32,116,104,101,32,112, + 117,98,108,105,99,45,102,97,99,105,110,103,32,118,101,114, + 115,105,111,110,32,111,102,32,116,104,105,115,32,109,111,100, + 117,108,101,46,10,10,78,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,7,0,0,0,67,0,0,0, + 115,56,0,0,0,100,1,68,0,93,32,125,2,116,0,124, + 1,124,2,131,2,114,4,116,1,124,0,124,2,116,2,124, + 1,124,2,131,2,131,3,1,0,113,4,124,0,106,3,160, + 4,124,1,106,3,161,1,1,0,100,2,83,0,41,3,122, + 47,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, + 41,4,218,10,95,95,109,111,100,117,108,101,95,95,218,8, + 95,95,110,97,109,101,95,95,218,12,95,95,113,117,97,108, + 110,97,109,101,95,95,218,7,95,95,100,111,99,95,95,78, + 41,5,218,7,104,97,115,97,116,116,114,218,7,115,101,116, + 97,116,116,114,218,7,103,101,116,97,116,116,114,218,8,95, + 95,100,105,99,116,95,95,218,6,117,112,100,97,116,101,41, + 3,90,3,110,101,119,90,3,111,108,100,218,7,114,101,112, + 108,97,99,101,169,0,114,10,0,0,0,250,29,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,218,5,95,119,114,97, + 112,34,0,0,0,115,12,0,0,0,8,2,10,1,20,1, + 14,1,4,128,255,128,114,12,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0, + 67,0,0,0,115,12,0,0,0,116,0,116,1,131,1,124, + 0,131,1,83,0,169,1,78,41,2,218,4,116,121,112,101, + 218,3,115,121,115,169,1,218,4,110,97,109,101,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,11,95,110, + 101,119,95,109,111,100,117,108,101,42,0,0,0,115,4,0, + 0,0,12,1,255,128,114,18,0,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 64,0,0,0,115,12,0,0,0,101,0,90,1,100,0,90, + 2,100,1,83,0,41,2,218,14,95,68,101,97,100,108,111, + 99,107,69,114,114,111,114,78,41,3,114,1,0,0,0,114, + 0,0,0,0,114,2,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,19,0, + 0,0,55,0,0,0,115,6,0,0,0,8,0,4,1,255, + 128,114,19,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, + 56,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, + 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, + 100,10,100,11,132,0,90,8,100,12,83,0,41,13,218,11, + 95,77,111,100,117,108,101,76,111,99,107,122,169,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,0, + 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, + 48,0,0,0,116,0,160,1,161,0,124,0,95,2,116,0, + 160,1,161,0,124,0,95,3,124,1,124,0,95,4,100,0, + 124,0,95,5,100,1,124,0,95,6,100,1,124,0,95,7, + 100,0,83,0,169,2,78,233,0,0,0,0,41,8,218,7, + 95,116,104,114,101,97,100,90,13,97,108,108,111,99,97,116, + 101,95,108,111,99,107,218,4,108,111,99,107,218,6,119,97, + 107,101,117,112,114,17,0,0,0,218,5,111,119,110,101,114, + 218,5,99,111,117,110,116,218,7,119,97,105,116,101,114,115, + 169,2,218,4,115,101,108,102,114,17,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,8,95,95, + 105,110,105,116,95,95,65,0,0,0,115,16,0,0,0,10, + 1,10,1,6,1,6,1,6,1,6,1,4,128,255,128,122, + 20,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,0,0, + 0,0,5,0,0,0,3,0,0,0,67,0,0,0,115,84, + 0,0,0,116,0,160,1,161,0,125,1,124,0,106,2,125, + 2,116,3,131,0,125,3,116,4,160,5,124,2,161,1,125, + 4,124,4,100,0,117,0,114,42,100,1,83,0,124,4,106, + 2,125,2,124,2,124,1,107,2,114,60,100,2,83,0,124, + 2,124,3,118,0,114,72,100,1,83,0,124,3,160,6,124, + 2,161,1,1,0,113,20,41,3,78,70,84,41,7,114,23, + 0,0,0,218,9,103,101,116,95,105,100,101,110,116,114,26, + 0,0,0,218,3,115,101,116,218,12,95,98,108,111,99,107, + 105,110,103,95,111,110,218,3,103,101,116,218,3,97,100,100, + 41,5,114,30,0,0,0,90,2,109,101,218,3,116,105,100, + 90,4,115,101,101,110,114,24,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,12,104,97,115,95, + 100,101,97,100,108,111,99,107,73,0,0,0,115,26,0,0, + 0,8,2,6,1,6,1,10,2,8,1,4,1,6,1,8, + 1,4,1,8,1,4,6,12,1,255,128,122,24,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,0,0, + 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,196, + 0,0,0,116,0,160,1,161,0,125,1,124,0,116,2,124, + 1,60,0,122,170,124,0,106,3,143,126,1,0,124,0,106, + 4,100,1,107,2,115,46,124,0,106,5,124,1,107,2,114, + 90,124,1,124,0,95,5,124,0,4,0,106,4,100,2,55, + 0,2,0,95,4,87,0,100,3,4,0,4,0,131,3,1, + 0,87,0,116,2,124,1,61,0,100,4,83,0,124,0,160, + 6,161,0,114,110,116,7,100,5,124,0,22,0,131,1,130, + 1,124,0,106,8,160,9,100,6,161,1,114,136,124,0,4, + 0,106,10,100,2,55,0,2,0,95,10,87,0,100,3,4, + 0,4,0,131,3,1,0,110,16,49,0,115,156,48,0,1, + 0,1,0,1,0,89,0,1,0,124,0,106,8,160,9,161, + 0,1,0,124,0,106,8,160,11,161,0,1,0,113,18,116, + 2,124,1,61,0,48,0,41,7,122,185,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,114,22,0,0,0,233,1,0,0,0,78,84, + 122,23,100,101,97,100,108,111,99,107,32,100,101,116,101,99, + 116,101,100,32,98,121,32,37,114,70,41,12,114,23,0,0, + 0,114,32,0,0,0,114,34,0,0,0,114,24,0,0,0, + 114,27,0,0,0,114,26,0,0,0,114,38,0,0,0,114, + 19,0,0,0,114,25,0,0,0,218,7,97,99,113,117,105, + 114,101,114,28,0,0,0,218,7,114,101,108,101,97,115,101, + 169,2,114,30,0,0,0,114,37,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,40,0,0,0, + 94,0,0,0,115,36,0,0,0,8,6,8,1,2,1,8, + 2,20,1,6,1,14,1,14,1,6,9,4,247,8,1,12, + 1,12,1,44,1,10,2,12,1,8,2,255,128,122,19,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,0,0,0,0,2, + 0,0,0,8,0,0,0,67,0,0,0,115,144,0,0,0, + 116,0,160,1,161,0,125,1,124,0,106,2,143,110,1,0, + 124,0,106,3,124,1,107,3,114,34,116,4,100,1,131,1, + 130,1,124,0,106,5,100,2,107,4,115,48,74,0,130,1, + 124,0,4,0,106,5,100,3,56,0,2,0,95,5,124,0, + 106,5,100,2,107,2,114,108,100,0,124,0,95,3,124,0, + 106,6,114,108,124,0,4,0,106,6,100,3,56,0,2,0, + 95,6,124,0,106,7,160,8,161,0,1,0,87,0,100,0, + 4,0,4,0,131,3,1,0,100,0,83,0,49,0,115,130, + 48,0,1,0,1,0,1,0,89,0,1,0,100,0,83,0, + 41,4,78,250,31,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,114,22,0,0,0,114,39,0,0,0,41,9, + 114,23,0,0,0,114,32,0,0,0,114,24,0,0,0,114, + 26,0,0,0,218,12,82,117,110,116,105,109,101,69,114,114, + 111,114,114,27,0,0,0,114,28,0,0,0,114,25,0,0, + 0,114,41,0,0,0,114,42,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,41,0,0,0,119, + 0,0,0,115,30,0,0,0,8,1,8,1,10,1,8,1, + 14,1,14,1,10,1,6,1,6,1,14,1,22,1,4,128, + 16,0,4,128,255,128,122,19,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,0,0,0,0,1,0,0,0,5,0,0,0, + 67,0,0,0,115,18,0,0,0,100,1,160,0,124,0,106, + 1,116,2,124,0,131,1,161,2,83,0,41,2,78,122,23, + 95,77,111,100,117,108,101,76,111,99,107,40,123,33,114,125, + 41,32,97,116,32,123,125,169,3,218,6,102,111,114,109,97, + 116,114,17,0,0,0,218,2,105,100,169,1,114,30,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,8,95,95,105,110,105,116,95,95,58,0,0,0,115,16, - 0,0,0,10,1,10,1,6,1,6,1,6,1,6,1,4, - 128,255,128,122,20,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,0,0,0,0,5,0,0,0,3,0,0,0,67,0, - 0,0,115,84,0,0,0,116,0,160,1,161,0,125,1,124, - 0,106,2,125,2,116,3,131,0,125,3,116,4,160,5,124, - 2,161,1,125,4,124,4,100,0,117,0,114,42,100,1,83, - 0,124,4,106,2,125,2,124,2,124,1,107,2,114,60,100, - 2,83,0,124,2,124,3,118,0,114,72,100,1,83,0,124, - 3,160,6,124,2,161,1,1,0,113,20,41,3,78,70,84, - 41,7,114,23,0,0,0,218,9,103,101,116,95,105,100,101, - 110,116,114,26,0,0,0,218,3,115,101,116,218,12,95,98, - 108,111,99,107,105,110,103,95,111,110,218,3,103,101,116,218, - 3,97,100,100,41,5,114,30,0,0,0,90,2,109,101,218, - 3,116,105,100,90,4,115,101,101,110,114,24,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,12, - 104,97,115,95,100,101,97,100,108,111,99,107,66,0,0,0, - 115,26,0,0,0,8,2,6,1,6,1,10,2,8,1,4, - 1,6,1,8,1,4,1,8,1,4,6,12,1,255,128,122, - 24,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,0,0,0,0,2,0,0,0,8,0,0,0,67,0, - 0,0,115,196,0,0,0,116,0,160,1,161,0,125,1,124, - 0,116,2,124,1,60,0,122,170,124,0,106,3,143,126,1, - 0,124,0,106,4,100,1,107,2,115,46,124,0,106,5,124, - 1,107,2,114,90,124,1,124,0,95,5,124,0,4,0,106, - 4,100,2,55,0,2,0,95,4,87,0,100,3,4,0,4, - 0,131,3,1,0,87,0,116,2,124,1,61,0,100,4,83, - 0,124,0,160,6,161,0,114,110,116,7,100,5,124,0,22, - 0,131,1,130,1,124,0,106,8,160,9,100,6,161,1,114, - 136,124,0,4,0,106,10,100,2,55,0,2,0,95,10,87, - 0,100,3,4,0,4,0,131,3,1,0,110,16,49,0,115, - 156,48,0,1,0,1,0,1,0,89,0,1,0,124,0,106, - 8,160,9,161,0,1,0,124,0,106,8,160,11,161,0,1, - 0,113,18,116,2,124,1,61,0,48,0,41,7,122,185,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,114,22,0,0,0,233,1,0, - 0,0,78,84,122,23,100,101,97,100,108,111,99,107,32,100, - 101,116,101,99,116,101,100,32,98,121,32,37,114,70,41,12, - 114,23,0,0,0,114,32,0,0,0,114,34,0,0,0,114, - 24,0,0,0,114,27,0,0,0,114,26,0,0,0,114,38, - 0,0,0,114,19,0,0,0,114,25,0,0,0,218,7,97, - 99,113,117,105,114,101,114,28,0,0,0,218,7,114,101,108, - 101,97,115,101,169,2,114,30,0,0,0,114,37,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 40,0,0,0,87,0,0,0,115,36,0,0,0,8,6,8, - 1,2,1,8,2,20,1,6,1,14,1,14,1,6,9,4, - 247,8,1,12,1,12,1,44,1,10,2,12,1,8,2,255, - 128,122,19,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,0, - 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, - 144,0,0,0,116,0,160,1,161,0,125,1,124,0,106,2, - 143,110,1,0,124,0,106,3,124,1,107,3,114,34,116,4, - 100,1,131,1,130,1,124,0,106,5,100,2,107,4,115,48, - 74,0,130,1,124,0,4,0,106,5,100,3,56,0,2,0, - 95,5,124,0,106,5,100,2,107,2,114,108,100,0,124,0, - 95,3,124,0,106,6,114,108,124,0,4,0,106,6,100,3, - 56,0,2,0,95,6,124,0,106,7,160,8,161,0,1,0, - 87,0,100,0,4,0,4,0,131,3,1,0,100,0,83,0, - 49,0,115,130,48,0,1,0,1,0,1,0,89,0,1,0, - 100,0,83,0,41,4,78,250,31,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,114,22,0,0,0,114,39,0, - 0,0,41,9,114,23,0,0,0,114,32,0,0,0,114,24, - 0,0,0,114,26,0,0,0,218,12,82,117,110,116,105,109, - 101,69,114,114,111,114,114,27,0,0,0,114,28,0,0,0, - 114,25,0,0,0,114,41,0,0,0,114,42,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,41, - 0,0,0,112,0,0,0,115,30,0,0,0,8,1,8,1, - 10,1,8,1,14,1,14,1,10,1,6,1,6,1,14,1, - 22,1,4,128,16,0,4,128,255,128,122,19,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,0,0,0,0,1,0,0,0, - 5,0,0,0,67,0,0,0,115,18,0,0,0,100,1,160, - 0,124,0,106,1,116,2,124,0,131,1,161,2,83,0,41, - 2,78,122,23,95,77,111,100,117,108,101,76,111,99,107,40, - 123,33,114,125,41,32,97,116,32,123,125,169,3,218,6,102, - 111,114,109,97,116,114,17,0,0,0,218,2,105,100,169,1, - 114,30,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,8,95,95,114,101,112,114,95,95,125,0, - 0,0,115,4,0,0,0,18,1,255,128,122,20,95,77,111, - 100,117,108,101,76,111,99,107,46,95,95,114,101,112,114,95, - 95,78,41,9,114,1,0,0,0,114,0,0,0,0,114,2, - 0,0,0,114,3,0,0,0,114,31,0,0,0,114,38,0, - 0,0,114,40,0,0,0,114,41,0,0,0,114,49,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,20,0,0,0,52,0,0,0,115,16, - 0,0,0,8,0,4,1,8,5,8,8,8,21,8,25,12, - 13,255,128,114,20,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,48,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0, - 90,7,100,10,83,0,41,11,218,16,95,68,117,109,109,121, - 77,111,100,117,108,101,76,111,99,107,122,86,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,0,0,0,0,2, - 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, - 124,1,124,0,95,0,100,1,124,0,95,1,100,0,83,0, - 114,21,0,0,0,41,2,114,17,0,0,0,114,27,0,0, - 0,114,29,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,31,0,0,0,133,0,0,0,115,8, - 0,0,0,6,1,6,1,4,128,255,128,122,25,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,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 18,0,0,0,124,0,4,0,106,0,100,1,55,0,2,0, - 95,0,100,2,83,0,41,3,78,114,39,0,0,0,84,41, - 1,114,27,0,0,0,114,48,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,40,0,0,0,137, - 0,0,0,115,6,0,0,0,14,1,4,1,255,128,122,24, - 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,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,36,0,0,0,124,0,106,0,100,1,107,2,114,18, - 116,1,100,2,131,1,130,1,124,0,4,0,106,0,100,3, - 56,0,2,0,95,0,100,0,83,0,41,4,78,114,22,0, - 0,0,114,43,0,0,0,114,39,0,0,0,41,2,114,27, - 0,0,0,114,44,0,0,0,114,48,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,41,0,0, - 0,141,0,0,0,115,10,0,0,0,10,1,8,1,14,1, - 4,128,255,128,122,24,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,0,0,0,0,1,0,0,0,5, - 0,0,0,67,0,0,0,115,18,0,0,0,100,1,160,0, - 124,0,106,1,116,2,124,0,131,1,161,2,83,0,41,2, - 78,122,28,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,114, - 45,0,0,0,114,48,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,49,0,0,0,146,0,0, - 0,115,4,0,0,0,18,1,255,128,122,25,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,41,8,114,1,0,0,0,114,0,0, - 0,0,114,2,0,0,0,114,3,0,0,0,114,31,0,0, - 0,114,40,0,0,0,114,41,0,0,0,114,49,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,50,0,0,0,129,0,0,0,115,14,0, - 0,0,8,0,4,1,8,3,8,4,8,4,12,5,255,128, - 114,50,0,0,0,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,36, - 0,0,0,101,0,90,1,100,0,90,2,100,1,100,2,132, - 0,90,3,100,3,100,4,132,0,90,4,100,5,100,6,132, - 0,90,5,100,7,83,0,41,8,218,18,95,77,111,100,117, - 108,101,76,111,99,107,77,97,110,97,103,101,114,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0, - 0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,95, - 0,100,0,124,0,95,1,100,0,83,0,114,13,0,0,0, - 41,2,218,5,95,110,97,109,101,218,5,95,108,111,99,107, - 114,29,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,31,0,0,0,152,0,0,0,115,8,0, - 0,0,6,1,6,1,4,128,255,128,122,27,95,77,111,100, - 117,108,101,76,111,99,107,77,97,110,97,103,101,114,46,95, - 95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,2,0,0,0,67,0,0,0, - 115,26,0,0,0,116,0,124,0,106,1,131,1,124,0,95, - 2,124,0,106,2,160,3,161,0,1,0,100,0,83,0,114, - 13,0,0,0,41,4,218,16,95,103,101,116,95,109,111,100, - 117,108,101,95,108,111,99,107,114,52,0,0,0,114,53,0, - 0,0,114,40,0,0,0,114,48,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,9,95,95,101, - 110,116,101,114,95,95,156,0,0,0,115,8,0,0,0,12, - 1,10,1,4,128,255,128,122,28,95,77,111,100,117,108,101, - 76,111,99,107,77,97,110,97,103,101,114,46,95,95,101,110, - 116,101,114,95,95,99,1,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,2,0,0,0,79,0,0,0,115,14, - 0,0,0,124,0,106,0,160,1,161,0,1,0,100,0,83, - 0,114,13,0,0,0,41,2,114,53,0,0,0,114,41,0, - 0,0,41,3,114,30,0,0,0,218,4,97,114,103,115,90, - 6,107,119,97,114,103,115,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,95,95,101,120,105,116,95,95, - 160,0,0,0,115,6,0,0,0,10,1,4,128,255,128,122, - 27,95,77,111,100,117,108,101,76,111,99,107,77,97,110,97, - 103,101,114,46,95,95,101,120,105,116,95,95,78,41,6,114, - 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,31, - 0,0,0,114,55,0,0,0,114,57,0,0,0,114,10,0, + 218,8,95,95,114,101,112,114,95,95,132,0,0,0,115,4, + 0,0,0,18,1,255,128,122,20,95,77,111,100,117,108,101, + 76,111,99,107,46,95,95,114,101,112,114,95,95,78,41,9, + 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, + 3,0,0,0,114,31,0,0,0,114,38,0,0,0,114,40, + 0,0,0,114,41,0,0,0,114,49,0,0,0,114,10,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,51,0,0,0,150,0,0,0,115,10,0,0,0,8, - 0,8,2,8,4,12,4,255,128,114,51,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8, - 0,0,0,67,0,0,0,115,134,0,0,0,116,0,160,1, - 161,0,1,0,122,114,122,14,116,2,124,0,25,0,131,0, - 125,1,87,0,110,22,4,0,116,3,121,46,1,0,1,0, - 1,0,100,1,125,1,89,0,110,2,48,0,124,1,100,1, - 117,0,114,110,116,4,100,1,117,0,114,74,116,5,124,0, - 131,1,125,1,110,8,116,6,124,0,131,1,125,1,124,0, - 102,1,100,2,100,3,132,1,125,2,116,7,160,8,124,1, - 124,2,161,2,116,2,124,0,60,0,87,0,116,0,160,9, - 161,0,1,0,124,1,83,0,116,0,160,9,161,0,1,0, - 48,0,41,4,122,139,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,65,99,113,117,105,114,101,47,114,101,108,101,97,115, - 101,32,105,110,116,101,114,110,97,108,108,121,32,116,104,101, - 32,103,108,111,98,97,108,32,105,109,112,111,114,116,32,108, - 111,99,107,32,116,111,32,112,114,111,116,101,99,116,10,32, - 32,32,32,95,109,111,100,117,108,101,95,108,111,99,107,115, - 46,78,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,83,0,0,0,115,54,0,0,0, - 116,0,160,1,161,0,1,0,122,34,116,2,160,3,124,1, - 161,1,124,0,117,0,114,30,116,2,124,1,61,0,87,0, - 116,0,160,4,161,0,1,0,100,0,83,0,116,0,160,4, - 161,0,1,0,48,0,114,13,0,0,0,41,5,218,4,95, - 105,109,112,218,12,97,99,113,117,105,114,101,95,108,111,99, - 107,218,13,95,109,111,100,117,108,101,95,108,111,99,107,115, - 114,35,0,0,0,218,12,114,101,108,101,97,115,101,95,108, - 111,99,107,41,2,218,3,114,101,102,114,17,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,2, - 99,98,185,0,0,0,115,16,0,0,0,8,1,2,1,14, - 4,8,1,8,2,4,128,10,0,255,128,122,28,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,41,10,114,58,0,0,0, - 114,59,0,0,0,114,60,0,0,0,218,8,75,101,121,69, - 114,114,111,114,114,23,0,0,0,114,50,0,0,0,114,20, - 0,0,0,218,8,95,119,101,97,107,114,101,102,114,62,0, - 0,0,114,61,0,0,0,41,3,114,17,0,0,0,114,24, - 0,0,0,114,63,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,54,0,0,0,166,0,0,0, - 115,32,0,0,0,8,6,2,1,2,1,14,1,12,1,10, - 1,8,2,8,1,10,1,8,2,12,2,18,11,8,2,4, - 2,10,254,255,128,114,54,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,67, - 0,0,0,115,54,0,0,0,116,0,124,0,131,1,125,1, - 122,12,124,1,160,1,161,0,1,0,87,0,110,20,4,0, - 116,2,121,40,1,0,1,0,1,0,89,0,100,1,83,0, - 48,0,124,1,160,3,161,0,1,0,100,1,83,0,41,2, - 122,189,65,99,113,117,105,114,101,115,32,116,104,101,110,32, - 114,101,108,101,97,115,101,115,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,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,32,32,32,32,78, - 41,4,114,54,0,0,0,114,40,0,0,0,114,19,0,0, - 0,114,41,0,0,0,41,2,114,17,0,0,0,114,24,0, + 0,114,20,0,0,0,59,0,0,0,115,16,0,0,0,8, + 0,4,1,8,5,8,8,8,21,8,25,12,13,255,128,114, + 20,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,64,0,0,0,115,48,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, + 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, + 83,0,41,11,218,16,95,68,117,109,109,121,77,111,100,117, + 108,101,76,111,99,107,122,86,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,0,0,0,0,2,0,0,0,2, + 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0, + 95,0,100,1,124,0,95,1,100,0,83,0,114,21,0,0, + 0,41,2,114,17,0,0,0,114,27,0,0,0,114,29,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,19,95,108,111,99,107,95,117,110,108,111,99,107,95, - 109,111,100,117,108,101,203,0,0,0,115,20,0,0,0,8, - 6,2,1,12,1,12,1,2,3,4,128,2,0,8,2,4, - 128,255,128,114,66,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,4,0,0,0,79,0,0, - 0,115,14,0,0,0,124,0,124,1,105,0,124,2,164,1, - 142,1,83,0,41,2,97,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,78,114,10,0,0,0,41, - 3,218,1,102,114,56,0,0,0,90,4,107,119,100,115,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,25, - 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,220,0,0,0,115,4,0, - 0,0,14,8,255,128,114,68,0,0,0,114,39,0,0,0, - 41,1,218,9,118,101,114,98,111,115,105,116,121,99,1,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,4,0, - 0,0,71,0,0,0,115,54,0,0,0,116,0,106,1,106, - 2,124,1,107,5,114,50,124,0,160,3,100,1,161,1,115, - 30,100,2,124,0,23,0,125,0,116,4,124,0,106,5,124, - 2,142,0,116,0,106,6,100,3,141,2,1,0,100,4,83, - 0,41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111,114,116,32, - 122,2,35,32,41,1,90,4,102,105,108,101,78,41,7,114, - 15,0,0,0,218,5,102,108,97,103,115,218,7,118,101,114, - 98,111,115,101,218,10,115,116,97,114,116,115,119,105,116,104, - 218,5,112,114,105,110,116,114,46,0,0,0,218,6,115,116, - 100,101,114,114,41,3,218,7,109,101,115,115,97,103,101,114, - 69,0,0,0,114,56,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,16,95,118,101,114,98,111, - 115,101,95,109,101,115,115,97,103,101,231,0,0,0,115,12, - 0,0,0,12,2,10,1,8,1,20,1,4,128,255,128,114, - 77,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,3,0,0,0,115,26,0, - 0,0,135,0,102,1,100,1,100,2,132,8,125,1,116,0, - 124,1,136,0,131,2,1,0,124,1,83,0,41,4,122,49, - 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,0,0,0,0,2,0, - 0,0,4,0,0,0,19,0,0,0,115,38,0,0,0,124, - 1,116,0,106,1,118,1,114,28,116,2,100,1,160,3,124, - 1,161,1,124,1,100,2,141,2,130,1,136,0,124,0,124, - 1,131,2,83,0,41,3,78,250,29,123,33,114,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,114,16,0,0,0,41,4,114,15, - 0,0,0,218,20,98,117,105,108,116,105,110,95,109,111,100, - 117,108,101,95,110,97,109,101,115,218,11,73,109,112,111,114, - 116,69,114,114,111,114,114,46,0,0,0,169,2,114,30,0, - 0,0,218,8,102,117,108,108,110,97,109,101,169,1,218,3, - 102,120,110,114,10,0,0,0,114,11,0,0,0,218,25,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,241,0,0,0,115,12,0,0, - 0,10,1,10,1,2,1,6,255,10,2,255,128,122,52,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,78,169,1,114,12,0,0,0,41,2,114,84,0, - 0,0,114,85,0,0,0,114,10,0,0,0,114,83,0,0, - 0,114,11,0,0,0,218,17,95,114,101,113,117,105,114,101, - 115,95,98,117,105,108,116,105,110,239,0,0,0,115,8,0, - 0,0,12,2,10,5,4,1,255,128,114,87,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,3,0,0,0,115,26,0,0,0,135,0,102, - 1,100,1,100,2,132,8,125,1,116,0,124,1,136,0,131, - 2,1,0,124,1,83,0,41,4,122,47,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,0,0,0,0,2,0,0,0,4,0,0,0,19, - 0,0,0,115,38,0,0,0,116,0,160,1,124,1,161,1, - 115,28,116,2,100,1,160,3,124,1,161,1,124,1,100,2, - 141,2,130,1,136,0,124,0,124,1,131,2,83,0,169,3, - 78,122,27,123,33,114,125,32,105,115,32,110,111,116,32,97, - 32,102,114,111,122,101,110,32,109,111,100,117,108,101,114,16, - 0,0,0,41,4,114,58,0,0,0,218,9,105,115,95,102, - 114,111,122,101,110,114,80,0,0,0,114,46,0,0,0,114, - 81,0,0,0,114,83,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,24,95,114,101,113,117,105,114,101,115,95,102, - 114,111,122,101,110,95,119,114,97,112,112,101,114,252,0,0, - 0,115,12,0,0,0,10,1,10,1,2,1,6,255,10,2, - 255,128,122,50,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,78,114,86,0,0,0,41,2,114,84, - 0,0,0,114,90,0,0,0,114,10,0,0,0,114,83,0, - 0,0,114,11,0,0,0,218,16,95,114,101,113,117,105,114, - 101,115,95,102,114,111,122,101,110,250,0,0,0,115,8,0, - 0,0,12,2,10,5,4,1,255,128,114,91,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 3,0,0,0,67,0,0,0,115,58,0,0,0,116,0,124, - 1,124,0,131,2,125,2,124,1,116,1,106,2,118,0,114, - 50,116,1,106,2,124,1,25,0,125,3,116,3,124,2,124, - 3,131,2,1,0,116,1,106,2,124,1,25,0,83,0,116, - 4,124,2,131,1,83,0,41,2,122,128,76,111,97,100,32, - 116,104,101,32,115,112,101,99,105,102,105,101,100,32,109,111, - 100,117,108,101,32,105,110,116,111,32,115,121,115,46,109,111, - 100,117,108,101,115,32,97,110,100,32,114,101,116,117,114,110, - 32,105,116,46,10,10,32,32,32,32,84,104,105,115,32,109, - 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,32,32,85,115,101,32,108,111,97,100,101,114, - 46,101,120,101,99,95,109,111,100,117,108,101,32,105,110,115, - 116,101,97,100,46,10,10,32,32,32,32,78,41,5,218,16, - 115,112,101,99,95,102,114,111,109,95,108,111,97,100,101,114, - 114,15,0,0,0,218,7,109,111,100,117,108,101,115,218,5, - 95,101,120,101,99,218,5,95,108,111,97,100,41,4,114,30, - 0,0,0,114,82,0,0,0,218,4,115,112,101,99,218,6, - 109,111,100,117,108,101,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,17,95,108,111,97,100,95,109,111,100, - 117,108,101,95,115,104,105,109,6,1,0,0,115,14,0,0, - 0,10,6,10,1,10,1,10,1,10,1,8,2,255,128,114, - 98,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,8,0,0,0,67,0,0,0,115,210,0, - 0,0,116,0,124,0,100,1,100,0,131,3,125,1,116,1, - 124,1,100,2,131,2,114,54,122,12,124,1,160,2,124,0, - 161,1,87,0,83,0,4,0,116,3,121,52,1,0,1,0, - 1,0,89,0,110,2,48,0,122,10,124,0,106,4,125,2, - 87,0,110,18,4,0,116,5,121,82,1,0,1,0,1,0, - 89,0,110,18,48,0,124,2,100,0,117,1,114,100,116,6, - 124,2,131,1,83,0,122,10,124,0,106,7,125,3,87,0, - 110,22,4,0,116,5,121,132,1,0,1,0,1,0,100,3, - 125,3,89,0,110,2,48,0,122,10,124,0,106,8,125,4, - 87,0,110,52,4,0,116,5,121,196,1,0,1,0,1,0, - 124,1,100,0,117,0,114,180,100,4,160,9,124,3,161,1, - 6,0,89,0,83,0,100,5,160,9,124,3,124,1,161,2, - 6,0,89,0,83,0,48,0,100,6,160,9,124,3,124,4, - 161,2,83,0,41,7,78,218,10,95,95,108,111,97,100,101, - 114,95,95,218,11,109,111,100,117,108,101,95,114,101,112,114, - 250,1,63,250,13,60,109,111,100,117,108,101,32,123,33,114, - 125,62,250,20,60,109,111,100,117,108,101,32,123,33,114,125, - 32,40,123,33,114,125,41,62,250,23,60,109,111,100,117,108, - 101,32,123,33,114,125,32,102,114,111,109,32,123,33,114,125, - 62,41,10,114,6,0,0,0,114,4,0,0,0,114,100,0, - 0,0,218,9,69,120,99,101,112,116,105,111,110,218,8,95, - 95,115,112,101,99,95,95,218,14,65,116,116,114,105,98,117, - 116,101,69,114,114,111,114,218,22,95,109,111,100,117,108,101, - 95,114,101,112,114,95,102,114,111,109,95,115,112,101,99,114, - 1,0,0,0,218,8,95,95,102,105,108,101,95,95,114,46, - 0,0,0,41,5,114,97,0,0,0,218,6,108,111,97,100, - 101,114,114,96,0,0,0,114,17,0,0,0,218,8,102,105, - 108,101,110,97,109,101,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,12,95,109,111,100,117,108,101,95,114, - 101,112,114,22,1,0,0,115,48,0,0,0,12,2,10,1, - 2,4,12,1,12,1,6,1,2,1,10,1,12,1,6,1, - 8,2,8,1,2,4,10,1,12,1,10,1,2,1,10,1, - 12,1,8,1,14,1,18,2,12,2,255,128,114,112,0,0, + 0,114,31,0,0,0,140,0,0,0,115,8,0,0,0,6, + 1,6,1,4,128,255,128,122,25,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,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,18,0,0,0, + 124,0,4,0,106,0,100,1,55,0,2,0,95,0,100,2, + 83,0,41,3,78,114,39,0,0,0,84,41,1,114,27,0, + 0,0,114,48,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,40,0,0,0,144,0,0,0,115, + 6,0,0,0,14,1,4,1,255,128,122,24,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,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,36,0, + 0,0,124,0,106,0,100,1,107,2,114,18,116,1,100,2, + 131,1,130,1,124,0,4,0,106,0,100,3,56,0,2,0, + 95,0,100,0,83,0,41,4,78,114,22,0,0,0,114,43, + 0,0,0,114,39,0,0,0,41,2,114,27,0,0,0,114, + 44,0,0,0,114,48,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,41,0,0,0,148,0,0, + 0,115,10,0,0,0,10,1,8,1,14,1,4,128,255,128, + 122,24,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,0,0,0,0,1,0,0,0,5,0,0,0,67, + 0,0,0,115,18,0,0,0,100,1,160,0,124,0,106,1, + 116,2,124,0,131,1,161,2,83,0,41,2,78,122,28,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,114,45,0,0,0, + 114,48,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,49,0,0,0,153,0,0,0,115,4,0, + 0,0,18,1,255,128,122,25,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,41,8,114,1,0,0,0,114,0,0,0,0,114,2, + 0,0,0,114,3,0,0,0,114,31,0,0,0,114,40,0, + 0,0,114,41,0,0,0,114,49,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,50,0,0,0,136,0,0,0,115,14,0,0,0,8,0, + 4,1,8,3,8,4,8,4,12,5,255,128,114,50,0,0, 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,64,0,0,0,115,114,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,100,2,100, - 2,100,3,156,3,100,4,100,5,132,2,90,4,100,6,100, - 7,132,0,90,5,100,8,100,9,132,0,90,6,101,7,100, - 10,100,11,132,0,131,1,90,8,101,8,106,9,100,12,100, - 11,132,0,131,1,90,8,101,7,100,13,100,14,132,0,131, - 1,90,10,101,7,100,15,100,16,132,0,131,1,90,11,101, - 11,106,9,100,17,100,16,132,0,131,1,90,11,100,2,83, - 0,41,18,218,10,77,111,100,117,108,101,83,112,101,99,97, - 208,5,0,0,84,104,101,32,115,112,101,99,105,102,105,99, - 97,116,105,111,110,32,102,111,114,32,97,32,109,111,100,117, - 108,101,44,32,117,115,101,100,32,102,111,114,32,108,111,97, - 100,105,110,103,46,10,10,32,32,32,32,65,32,109,111,100, - 117,108,101,39,115,32,115,112,101,99,32,105,115,32,116,104, - 101,32,115,111,117,114,99,101,32,102,111,114,32,105,110,102, - 111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116, - 104,101,32,109,111,100,117,108,101,46,32,32,70,111,114,10, - 32,32,32,32,100,97,116,97,32,97,115,115,111,99,105,97, - 116,101,100,32,119,105,116,104,32,116,104,101,32,109,111,100, - 117,108,101,44,32,105,110,99,108,117,100,105,110,103,32,115, - 111,117,114,99,101,44,32,117,115,101,32,116,104,101,32,115, - 112,101,99,39,115,10,32,32,32,32,108,111,97,100,101,114, - 46,10,10,32,32,32,32,96,110,97,109,101,96,32,105,115, - 32,116,104,101,32,97,98,115,111,108,117,116,101,32,110,97, - 109,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, - 46,32,32,96,108,111,97,100,101,114,96,32,105,115,32,116, - 104,101,32,108,111,97,100,101,114,10,32,32,32,32,116,111, - 32,117,115,101,32,119,104,101,110,32,108,111,97,100,105,110, - 103,32,116,104,101,32,109,111,100,117,108,101,46,32,32,96, - 112,97,114,101,110,116,96,32,105,115,32,116,104,101,32,110, - 97,109,101,32,111,102,32,116,104,101,10,32,32,32,32,112, - 97,99,107,97,103,101,32,116,104,101,32,109,111,100,117,108, - 101,32,105,115,32,105,110,46,32,32,84,104,101,32,112,97, - 114,101,110,116,32,105,115,32,100,101,114,105,118,101,100,32, - 102,114,111,109,32,116,104,101,32,110,97,109,101,46,10,10, - 32,32,32,32,96,105,115,95,112,97,99,107,97,103,101,96, - 32,100,101,116,101,114,109,105,110,101,115,32,105,102,32,116, - 104,101,32,109,111,100,117,108,101,32,105,115,32,99,111,110, - 115,105,100,101,114,101,100,32,97,32,112,97,99,107,97,103, - 101,32,111,114,10,32,32,32,32,110,111,116,46,32,32,79, - 110,32,109,111,100,117,108,101,115,32,116,104,105,115,32,105, - 115,32,114,101,102,108,101,99,116,101,100,32,98,121,32,116, - 104,101,32,96,95,95,112,97,116,104,95,95,96,32,97,116, - 116,114,105,98,117,116,101,46,10,10,32,32,32,32,96,111, - 114,105,103,105,110,96,32,105,115,32,116,104,101,32,115,112, - 101,99,105,102,105,99,32,108,111,99,97,116,105,111,110,32, - 117,115,101,100,32,98,121,32,116,104,101,32,108,111,97,100, - 101,114,32,102,114,111,109,32,119,104,105,99,104,32,116,111, - 10,32,32,32,32,108,111,97,100,32,116,104,101,32,109,111, - 100,117,108,101,44,32,105,102,32,116,104,97,116,32,105,110, - 102,111,114,109,97,116,105,111,110,32,105,115,32,97,118,97, - 105,108,97,98,108,101,46,32,32,87,104,101,110,32,102,105, - 108,101,110,97,109,101,32,105,115,10,32,32,32,32,115,101, - 116,44,32,111,114,105,103,105,110,32,119,105,108,108,32,109, - 97,116,99,104,46,10,10,32,32,32,32,96,104,97,115,95, - 108,111,99,97,116,105,111,110,96,32,105,110,100,105,99,97, - 116,101,115,32,116,104,97,116,32,97,32,115,112,101,99,39, - 115,32,34,111,114,105,103,105,110,34,32,114,101,102,108,101, - 99,116,115,32,97,32,108,111,99,97,116,105,111,110,46,10, - 32,32,32,32,87,104,101,110,32,116,104,105,115,32,105,115, - 32,84,114,117,101,44,32,96,95,95,102,105,108,101,95,95, - 96,32,97,116,116,114,105,98,117,116,101,32,111,102,32,116, - 104,101,32,109,111,100,117,108,101,32,105,115,32,115,101,116, - 46,10,10,32,32,32,32,96,99,97,99,104,101,100,96,32, - 105,115,32,116,104,101,32,108,111,99,97,116,105,111,110,32, - 111,102,32,116,104,101,32,99,97,99,104,101,100,32,98,121, - 116,101,99,111,100,101,32,102,105,108,101,44,32,105,102,32, - 97,110,121,46,32,32,73,116,10,32,32,32,32,99,111,114, - 114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32, - 96,95,95,99,97,99,104,101,100,95,95,96,32,97,116,116, - 114,105,98,117,116,101,46,10,10,32,32,32,32,96,115,117, - 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, - 111,99,97,116,105,111,110,115,96,32,105,115,32,116,104,101, - 32,115,101,113,117,101,110,99,101,32,111,102,32,112,97,116, - 104,32,101,110,116,114,105,101,115,32,116,111,10,32,32,32, - 32,115,101,97,114,99,104,32,119,104,101,110,32,105,109,112, - 111,114,116,105,110,103,32,115,117,98,109,111,100,117,108,101, - 115,46,32,32,73,102,32,115,101,116,44,32,105,115,95,112, - 97,99,107,97,103,101,32,115,104,111,117,108,100,32,98,101, - 10,32,32,32,32,84,114,117,101,45,45,97,110,100,32,70, - 97,108,115,101,32,111,116,104,101,114,119,105,115,101,46,10, - 10,32,32,32,32,80,97,99,107,97,103,101,115,32,97,114, - 101,32,115,105,109,112,108,121,32,109,111,100,117,108,101,115, - 32,116,104,97,116,32,40,109,97,121,41,32,104,97,118,101, - 32,115,117,98,109,111,100,117,108,101,115,46,32,32,73,102, - 32,97,32,115,112,101,99,10,32,32,32,32,104,97,115,32, - 97,32,110,111,110,45,78,111,110,101,32,118,97,108,117,101, - 32,105,110,32,96,115,117,98,109,111,100,117,108,101,95,115, - 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,96, - 44,32,116,104,101,32,105,109,112,111,114,116,10,32,32,32, - 32,115,121,115,116,101,109,32,119,105,108,108,32,99,111,110, - 115,105,100,101,114,32,109,111,100,117,108,101,115,32,108,111, - 97,100,101,100,32,102,114,111,109,32,116,104,101,32,115,112, - 101,99,32,97,115,32,112,97,99,107,97,103,101,115,46,10, - 10,32,32,32,32,79,110,108,121,32,102,105,110,100,101,114, - 115,32,40,115,101,101,32,105,109,112,111,114,116,108,105,98, - 46,97,98,99,46,77,101,116,97,80,97,116,104,70,105,110, - 100,101,114,32,97,110,100,10,32,32,32,32,105,109,112,111, - 114,116,108,105,98,46,97,98,99,46,80,97,116,104,69,110, - 116,114,121,70,105,110,100,101,114,41,32,115,104,111,117,108, - 100,32,109,111,100,105,102,121,32,77,111,100,117,108,101,83, - 112,101,99,32,105,110,115,116,97,110,99,101,115,46,10,10, - 32,32,32,32,78,41,3,218,6,111,114,105,103,105,110,218, - 12,108,111,97,100,101,114,95,115,116,97,116,101,218,10,105, - 115,95,112,97,99,107,97,103,101,99,3,0,0,0,0,0, - 0,0,3,0,0,0,6,0,0,0,2,0,0,0,67,0, - 0,0,115,54,0,0,0,124,1,124,0,95,0,124,2,124, - 0,95,1,124,3,124,0,95,2,124,4,124,0,95,3,124, - 5,114,32,103,0,110,2,100,0,124,0,95,4,100,1,124, - 0,95,5,100,0,124,0,95,6,100,0,83,0,41,2,78, - 70,41,7,114,17,0,0,0,114,110,0,0,0,114,114,0, - 0,0,114,115,0,0,0,218,26,115,117,98,109,111,100,117, + 0,0,2,0,0,0,64,0,0,0,115,36,0,0,0,101, + 0,90,1,100,0,90,2,100,1,100,2,132,0,90,3,100, + 3,100,4,132,0,90,4,100,5,100,6,132,0,90,5,100, + 7,83,0,41,8,218,18,95,77,111,100,117,108,101,76,111, + 99,107,77,97,110,97,103,101,114,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, + 0,0,115,16,0,0,0,124,1,124,0,95,0,100,0,124, + 0,95,1,100,0,83,0,114,13,0,0,0,41,2,218,5, + 95,110,97,109,101,218,5,95,108,111,99,107,114,29,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,31,0,0,0,159,0,0,0,115,8,0,0,0,6,1, + 6,1,4,128,255,128,122,27,95,77,111,100,117,108,101,76, + 111,99,107,77,97,110,97,103,101,114,46,95,95,105,110,105, + 116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,2,0,0,0,67,0,0,0,115,26,0,0, + 0,116,0,124,0,106,1,131,1,124,0,95,2,124,0,106, + 2,160,3,161,0,1,0,100,0,83,0,114,13,0,0,0, + 41,4,218,16,95,103,101,116,95,109,111,100,117,108,101,95, + 108,111,99,107,114,52,0,0,0,114,53,0,0,0,114,40, + 0,0,0,114,48,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,9,95,95,101,110,116,101,114, + 95,95,163,0,0,0,115,8,0,0,0,12,1,10,1,4, + 128,255,128,122,28,95,77,111,100,117,108,101,76,111,99,107, + 77,97,110,97,103,101,114,46,95,95,101,110,116,101,114,95, + 95,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,2,0,0,0,79,0,0,0,115,14,0,0,0,124, + 0,106,0,160,1,161,0,1,0,100,0,83,0,114,13,0, + 0,0,41,2,114,53,0,0,0,114,41,0,0,0,41,3, + 114,30,0,0,0,218,4,97,114,103,115,90,6,107,119,97, + 114,103,115,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,8,95,95,101,120,105,116,95,95,167,0,0,0, + 115,6,0,0,0,10,1,4,128,255,128,122,27,95,77,111, + 100,117,108,101,76,111,99,107,77,97,110,97,103,101,114,46, + 95,95,101,120,105,116,95,95,78,41,6,114,1,0,0,0, + 114,0,0,0,0,114,2,0,0,0,114,31,0,0,0,114, + 55,0,0,0,114,57,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,51,0, + 0,0,157,0,0,0,115,10,0,0,0,8,0,8,2,8, + 4,12,4,255,128,114,51,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,134,0,0,0,116,0,160,1,161,0,1,0, + 122,114,122,14,116,2,124,0,25,0,131,0,125,1,87,0, + 110,22,4,0,116,3,121,46,1,0,1,0,1,0,100,1, + 125,1,89,0,110,2,48,0,124,1,100,1,117,0,114,110, + 116,4,100,1,117,0,114,74,116,5,124,0,131,1,125,1, + 110,8,116,6,124,0,131,1,125,1,124,0,102,1,100,2, + 100,3,132,1,125,2,116,7,160,8,124,1,124,2,161,2, + 116,2,124,0,60,0,87,0,116,0,160,9,161,0,1,0, + 124,1,83,0,116,0,160,9,161,0,1,0,48,0,41,4, + 122,139,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,65,99, + 113,117,105,114,101,47,114,101,108,101,97,115,101,32,105,110, + 116,101,114,110,97,108,108,121,32,116,104,101,32,103,108,111, + 98,97,108,32,105,109,112,111,114,116,32,108,111,99,107,32, + 116,111,32,112,114,111,116,101,99,116,10,32,32,32,32,95, + 109,111,100,117,108,101,95,108,111,99,107,115,46,78,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,8, + 0,0,0,83,0,0,0,115,54,0,0,0,116,0,160,1, + 161,0,1,0,122,34,116,2,160,3,124,1,161,1,124,0, + 117,0,114,30,116,2,124,1,61,0,87,0,116,0,160,4, + 161,0,1,0,100,0,83,0,116,0,160,4,161,0,1,0, + 48,0,114,13,0,0,0,41,5,218,4,95,105,109,112,218, + 12,97,99,113,117,105,114,101,95,108,111,99,107,218,13,95, + 109,111,100,117,108,101,95,108,111,99,107,115,114,35,0,0, + 0,218,12,114,101,108,101,97,115,101,95,108,111,99,107,41, + 2,218,3,114,101,102,114,17,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,2,99,98,192,0, + 0,0,115,16,0,0,0,8,1,2,1,14,4,8,1,8, + 2,4,128,10,0,255,128,122,28,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,41,10,114,58,0,0,0,114,59,0,0, + 0,114,60,0,0,0,218,8,75,101,121,69,114,114,111,114, + 114,23,0,0,0,114,50,0,0,0,114,20,0,0,0,218, + 8,95,119,101,97,107,114,101,102,114,62,0,0,0,114,61, + 0,0,0,41,3,114,17,0,0,0,114,24,0,0,0,114, + 63,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,54,0,0,0,173,0,0,0,115,32,0,0, + 0,8,6,2,1,2,1,14,1,12,1,10,1,8,2,8, + 1,10,1,8,2,12,2,18,11,8,2,4,2,10,254,255, + 128,114,54,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, + 54,0,0,0,116,0,124,0,131,1,125,1,122,12,124,1, + 160,1,161,0,1,0,87,0,110,20,4,0,116,2,121,40, + 1,0,1,0,1,0,89,0,100,1,83,0,48,0,124,1, + 160,3,161,0,1,0,100,1,83,0,41,2,122,189,65,99, + 113,117,105,114,101,115,32,116,104,101,110,32,114,101,108,101, + 97,115,101,115,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,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,32,32,32,32,78,41,4,114,54, + 0,0,0,114,40,0,0,0,114,19,0,0,0,114,41,0, + 0,0,41,2,114,17,0,0,0,114,24,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,19,95, + 108,111,99,107,95,117,110,108,111,99,107,95,109,111,100,117, + 108,101,210,0,0,0,115,20,0,0,0,8,6,2,1,12, + 1,12,1,2,3,4,128,2,0,8,2,4,128,255,128,114, + 66,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,4,0,0,0,79,0,0,0,115,14,0, + 0,0,124,0,124,1,105,0,124,2,164,1,142,1,83,0, + 41,2,97,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,78,114,10,0,0,0,41,3,218,1,102, + 114,56,0,0,0,90,4,107,119,100,115,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,25,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,227,0,0,0,115,4,0,0,0,14,8, + 255,128,114,68,0,0,0,114,39,0,0,0,41,1,218,9, + 118,101,114,98,111,115,105,116,121,99,1,0,0,0,0,0, + 0,0,1,0,0,0,3,0,0,0,4,0,0,0,71,0, + 0,0,115,54,0,0,0,116,0,106,1,106,2,124,1,107, + 5,114,50,124,0,160,3,100,1,161,1,115,30,100,2,124, + 0,23,0,125,0,116,4,124,0,106,5,124,2,142,0,116, + 0,106,6,100,3,141,2,1,0,100,4,83,0,41,5,122, + 61,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,41,2, + 250,1,35,122,7,105,109,112,111,114,116,32,122,2,35,32, + 41,1,90,4,102,105,108,101,78,41,7,114,15,0,0,0, + 218,5,102,108,97,103,115,218,7,118,101,114,98,111,115,101, + 218,10,115,116,97,114,116,115,119,105,116,104,218,5,112,114, + 105,110,116,114,46,0,0,0,218,6,115,116,100,101,114,114, + 41,3,218,7,109,101,115,115,97,103,101,114,69,0,0,0, + 114,56,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,16,95,118,101,114,98,111,115,101,95,109, + 101,115,115,97,103,101,238,0,0,0,115,12,0,0,0,12, + 2,10,1,8,1,20,1,4,128,255,128,114,77,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,3,0,0,0,3,0,0,0,115,26,0,0,0,135,0, + 102,1,100,1,100,2,132,8,125,1,116,0,124,1,136,0, + 131,2,1,0,124,1,83,0,41,4,122,49,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,0,0,0,0,2,0,0,0,4,0, + 0,0,19,0,0,0,115,38,0,0,0,124,1,116,0,106, + 1,118,1,114,28,116,2,100,1,160,3,124,1,161,1,124, + 1,100,2,141,2,130,1,136,0,124,0,124,1,131,2,83, + 0,41,3,78,250,29,123,33,114,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,114,16,0,0,0,41,4,114,15,0,0,0,218, + 20,98,117,105,108,116,105,110,95,109,111,100,117,108,101,95, + 110,97,109,101,115,218,11,73,109,112,111,114,116,69,114,114, + 111,114,114,46,0,0,0,169,2,114,30,0,0,0,218,8, + 102,117,108,108,110,97,109,101,169,1,218,3,102,120,110,114, + 10,0,0,0,114,11,0,0,0,218,25,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,248,0,0,0,115,12,0,0,0,10,1,10, + 1,2,1,6,255,10,2,255,128,122,52,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,78, + 169,1,114,12,0,0,0,41,2,114,84,0,0,0,114,85, + 0,0,0,114,10,0,0,0,114,83,0,0,0,114,11,0, + 0,0,218,17,95,114,101,113,117,105,114,101,115,95,98,117, + 105,108,116,105,110,246,0,0,0,115,8,0,0,0,12,2, + 10,5,4,1,255,128,114,87,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 3,0,0,0,115,26,0,0,0,135,0,102,1,100,1,100, + 2,132,8,125,1,116,0,124,1,136,0,131,2,1,0,124, + 1,83,0,41,4,122,47,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,0, + 0,0,0,2,0,0,0,4,0,0,0,19,0,0,0,115, + 38,0,0,0,116,0,160,1,124,1,161,1,115,28,116,2, + 100,1,160,3,124,1,161,1,124,1,100,2,141,2,130,1, + 136,0,124,0,124,1,131,2,83,0,169,3,78,122,27,123, + 33,114,125,32,105,115,32,110,111,116,32,97,32,102,114,111, + 122,101,110,32,109,111,100,117,108,101,114,16,0,0,0,41, + 4,114,58,0,0,0,218,9,105,115,95,102,114,111,122,101, + 110,114,80,0,0,0,114,46,0,0,0,114,81,0,0,0, + 114,83,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 24,95,114,101,113,117,105,114,101,115,95,102,114,111,122,101, + 110,95,119,114,97,112,112,101,114,3,1,0,0,115,12,0, + 0,0,10,1,10,1,2,1,6,255,10,2,255,128,122,50, + 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,78,114,86,0,0,0,41,2,114,84,0,0,0,114, + 90,0,0,0,114,10,0,0,0,114,83,0,0,0,114,11, + 0,0,0,218,16,95,114,101,113,117,105,114,101,115,95,102, + 114,111,122,101,110,1,1,0,0,115,8,0,0,0,12,2, + 10,5,4,1,255,128,114,91,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0, + 67,0,0,0,115,58,0,0,0,116,0,124,1,124,0,131, + 2,125,2,124,1,116,1,106,2,118,0,114,50,116,1,106, + 2,124,1,25,0,125,3,116,3,124,2,124,3,131,2,1, + 0,116,1,106,2,124,1,25,0,83,0,116,4,124,2,131, + 1,83,0,41,2,122,128,76,111,97,100,32,116,104,101,32, + 115,112,101,99,105,102,105,101,100,32,109,111,100,117,108,101, + 32,105,110,116,111,32,115,121,115,46,109,111,100,117,108,101, + 115,32,97,110,100,32,114,101,116,117,114,110,32,105,116,46, + 10,10,32,32,32,32,84,104,105,115,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,85,115,101,32,108,111,97,100,101,114,46,101,120,101, + 99,95,109,111,100,117,108,101,32,105,110,115,116,101,97,100, + 46,10,10,32,32,32,32,78,41,5,218,16,115,112,101,99, + 95,102,114,111,109,95,108,111,97,100,101,114,114,15,0,0, + 0,218,7,109,111,100,117,108,101,115,218,5,95,101,120,101, + 99,218,5,95,108,111,97,100,41,4,114,30,0,0,0,114, + 82,0,0,0,218,4,115,112,101,99,218,6,109,111,100,117, + 108,101,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,17,95,108,111,97,100,95,109,111,100,117,108,101,95, + 115,104,105,109,13,1,0,0,115,14,0,0,0,10,6,10, + 1,10,1,10,1,10,1,8,2,255,128,114,98,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,8,0,0,0,67,0,0,0,115,210,0,0,0,116,0, + 124,0,100,1,100,0,131,3,125,1,116,1,124,1,100,2, + 131,2,114,54,122,12,124,1,160,2,124,0,161,1,87,0, + 83,0,4,0,116,3,121,52,1,0,1,0,1,0,89,0, + 110,2,48,0,122,10,124,0,106,4,125,2,87,0,110,18, + 4,0,116,5,121,82,1,0,1,0,1,0,89,0,110,18, + 48,0,124,2,100,0,117,1,114,100,116,6,124,2,131,1, + 83,0,122,10,124,0,106,7,125,3,87,0,110,22,4,0, + 116,5,121,132,1,0,1,0,1,0,100,3,125,3,89,0, + 110,2,48,0,122,10,124,0,106,8,125,4,87,0,110,52, + 4,0,116,5,121,196,1,0,1,0,1,0,124,1,100,0, + 117,0,114,180,100,4,160,9,124,3,161,1,6,0,89,0, + 83,0,100,5,160,9,124,3,124,1,161,2,6,0,89,0, + 83,0,48,0,100,6,160,9,124,3,124,4,161,2,83,0, + 41,7,78,218,10,95,95,108,111,97,100,101,114,95,95,218, + 11,109,111,100,117,108,101,95,114,101,112,114,250,1,63,250, + 13,60,109,111,100,117,108,101,32,123,33,114,125,62,250,20, + 60,109,111,100,117,108,101,32,123,33,114,125,32,40,123,33, + 114,125,41,62,250,23,60,109,111,100,117,108,101,32,123,33, + 114,125,32,102,114,111,109,32,123,33,114,125,62,41,10,114, + 6,0,0,0,114,4,0,0,0,114,100,0,0,0,218,9, + 69,120,99,101,112,116,105,111,110,218,8,95,95,115,112,101, + 99,95,95,218,14,65,116,116,114,105,98,117,116,101,69,114, + 114,111,114,218,22,95,109,111,100,117,108,101,95,114,101,112, + 114,95,102,114,111,109,95,115,112,101,99,114,1,0,0,0, + 218,8,95,95,102,105,108,101,95,95,114,46,0,0,0,41, + 5,114,97,0,0,0,218,6,108,111,97,100,101,114,114,96, + 0,0,0,114,17,0,0,0,218,8,102,105,108,101,110,97, + 109,101,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,12,95,109,111,100,117,108,101,95,114,101,112,114,29, + 1,0,0,115,48,0,0,0,12,2,10,1,2,4,12,1, + 12,1,6,1,2,1,10,1,12,1,6,1,8,2,8,1, + 2,4,10,1,12,1,10,1,2,1,10,1,12,1,8,1, + 14,1,18,2,12,2,255,128,114,112,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,64,0,0,0,115,114,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,2,100,2,100,3,156, + 3,100,4,100,5,132,2,90,4,100,6,100,7,132,0,90, + 5,100,8,100,9,132,0,90,6,101,7,100,10,100,11,132, + 0,131,1,90,8,101,8,106,9,100,12,100,11,132,0,131, + 1,90,8,101,7,100,13,100,14,132,0,131,1,90,10,101, + 7,100,15,100,16,132,0,131,1,90,11,101,11,106,9,100, + 17,100,16,132,0,131,1,90,11,100,2,83,0,41,18,218, + 10,77,111,100,117,108,101,83,112,101,99,97,208,5,0,0, + 84,104,101,32,115,112,101,99,105,102,105,99,97,116,105,111, + 110,32,102,111,114,32,97,32,109,111,100,117,108,101,44,32, + 117,115,101,100,32,102,111,114,32,108,111,97,100,105,110,103, + 46,10,10,32,32,32,32,65,32,109,111,100,117,108,101,39, + 115,32,115,112,101,99,32,105,115,32,116,104,101,32,115,111, + 117,114,99,101,32,102,111,114,32,105,110,102,111,114,109,97, + 116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,109, + 111,100,117,108,101,46,32,32,70,111,114,10,32,32,32,32, + 100,97,116,97,32,97,115,115,111,99,105,97,116,101,100,32, + 119,105,116,104,32,116,104,101,32,109,111,100,117,108,101,44, + 32,105,110,99,108,117,100,105,110,103,32,115,111,117,114,99, + 101,44,32,117,115,101,32,116,104,101,32,115,112,101,99,39, + 115,10,32,32,32,32,108,111,97,100,101,114,46,10,10,32, + 32,32,32,96,110,97,109,101,96,32,105,115,32,116,104,101, + 32,97,98,115,111,108,117,116,101,32,110,97,109,101,32,111, + 102,32,116,104,101,32,109,111,100,117,108,101,46,32,32,96, + 108,111,97,100,101,114,96,32,105,115,32,116,104,101,32,108, + 111,97,100,101,114,10,32,32,32,32,116,111,32,117,115,101, + 32,119,104,101,110,32,108,111,97,100,105,110,103,32,116,104, + 101,32,109,111,100,117,108,101,46,32,32,96,112,97,114,101, + 110,116,96,32,105,115,32,116,104,101,32,110,97,109,101,32, + 111,102,32,116,104,101,10,32,32,32,32,112,97,99,107,97, + 103,101,32,116,104,101,32,109,111,100,117,108,101,32,105,115, + 32,105,110,46,32,32,84,104,101,32,112,97,114,101,110,116, + 32,105,115,32,100,101,114,105,118,101,100,32,102,114,111,109, + 32,116,104,101,32,110,97,109,101,46,10,10,32,32,32,32, + 96,105,115,95,112,97,99,107,97,103,101,96,32,100,101,116, + 101,114,109,105,110,101,115,32,105,102,32,116,104,101,32,109, + 111,100,117,108,101,32,105,115,32,99,111,110,115,105,100,101, + 114,101,100,32,97,32,112,97,99,107,97,103,101,32,111,114, + 10,32,32,32,32,110,111,116,46,32,32,79,110,32,109,111, + 100,117,108,101,115,32,116,104,105,115,32,105,115,32,114,101, + 102,108,101,99,116,101,100,32,98,121,32,116,104,101,32,96, + 95,95,112,97,116,104,95,95,96,32,97,116,116,114,105,98, + 117,116,101,46,10,10,32,32,32,32,96,111,114,105,103,105, + 110,96,32,105,115,32,116,104,101,32,115,112,101,99,105,102, + 105,99,32,108,111,99,97,116,105,111,110,32,117,115,101,100, + 32,98,121,32,116,104,101,32,108,111,97,100,101,114,32,102, + 114,111,109,32,119,104,105,99,104,32,116,111,10,32,32,32, + 32,108,111,97,100,32,116,104,101,32,109,111,100,117,108,101, + 44,32,105,102,32,116,104,97,116,32,105,110,102,111,114,109, + 97,116,105,111,110,32,105,115,32,97,118,97,105,108,97,98, + 108,101,46,32,32,87,104,101,110,32,102,105,108,101,110,97, + 109,101,32,105,115,10,32,32,32,32,115,101,116,44,32,111, + 114,105,103,105,110,32,119,105,108,108,32,109,97,116,99,104, + 46,10,10,32,32,32,32,96,104,97,115,95,108,111,99,97, + 116,105,111,110,96,32,105,110,100,105,99,97,116,101,115,32, + 116,104,97,116,32,97,32,115,112,101,99,39,115,32,34,111, + 114,105,103,105,110,34,32,114,101,102,108,101,99,116,115,32, + 97,32,108,111,99,97,116,105,111,110,46,10,32,32,32,32, + 87,104,101,110,32,116,104,105,115,32,105,115,32,84,114,117, + 101,44,32,96,95,95,102,105,108,101,95,95,96,32,97,116, + 116,114,105,98,117,116,101,32,111,102,32,116,104,101,32,109, + 111,100,117,108,101,32,105,115,32,115,101,116,46,10,10,32, + 32,32,32,96,99,97,99,104,101,100,96,32,105,115,32,116, + 104,101,32,108,111,99,97,116,105,111,110,32,111,102,32,116, + 104,101,32,99,97,99,104,101,100,32,98,121,116,101,99,111, + 100,101,32,102,105,108,101,44,32,105,102,32,97,110,121,46, + 32,32,73,116,10,32,32,32,32,99,111,114,114,101,115,112, + 111,110,100,115,32,116,111,32,116,104,101,32,96,95,95,99, + 97,99,104,101,100,95,95,96,32,97,116,116,114,105,98,117, + 116,101,46,10,10,32,32,32,32,96,115,117,98,109,111,100, + 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, + 105,111,110,115,96,32,105,115,32,116,104,101,32,115,101,113, + 117,101,110,99,101,32,111,102,32,112,97,116,104,32,101,110, + 116,114,105,101,115,32,116,111,10,32,32,32,32,115,101,97, + 114,99,104,32,119,104,101,110,32,105,109,112,111,114,116,105, + 110,103,32,115,117,98,109,111,100,117,108,101,115,46,32,32, + 73,102,32,115,101,116,44,32,105,115,95,112,97,99,107,97, + 103,101,32,115,104,111,117,108,100,32,98,101,10,32,32,32, + 32,84,114,117,101,45,45,97,110,100,32,70,97,108,115,101, + 32,111,116,104,101,114,119,105,115,101,46,10,10,32,32,32, + 32,80,97,99,107,97,103,101,115,32,97,114,101,32,115,105, + 109,112,108,121,32,109,111,100,117,108,101,115,32,116,104,97, + 116,32,40,109,97,121,41,32,104,97,118,101,32,115,117,98, + 109,111,100,117,108,101,115,46,32,32,73,102,32,97,32,115, + 112,101,99,10,32,32,32,32,104,97,115,32,97,32,110,111, + 110,45,78,111,110,101,32,118,97,108,117,101,32,105,110,32, + 96,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, + 104,95,108,111,99,97,116,105,111,110,115,96,44,32,116,104, + 101,32,105,109,112,111,114,116,10,32,32,32,32,115,121,115, + 116,101,109,32,119,105,108,108,32,99,111,110,115,105,100,101, + 114,32,109,111,100,117,108,101,115,32,108,111,97,100,101,100, + 32,102,114,111,109,32,116,104,101,32,115,112,101,99,32,97, + 115,32,112,97,99,107,97,103,101,115,46,10,10,32,32,32, + 32,79,110,108,121,32,102,105,110,100,101,114,115,32,40,115, + 101,101,32,105,109,112,111,114,116,108,105,98,46,97,98,99, + 46,77,101,116,97,80,97,116,104,70,105,110,100,101,114,32, + 97,110,100,10,32,32,32,32,105,109,112,111,114,116,108,105, + 98,46,97,98,99,46,80,97,116,104,69,110,116,114,121,70, + 105,110,100,101,114,41,32,115,104,111,117,108,100,32,109,111, + 100,105,102,121,32,77,111,100,117,108,101,83,112,101,99,32, + 105,110,115,116,97,110,99,101,115,46,10,10,32,32,32,32, + 78,41,3,218,6,111,114,105,103,105,110,218,12,108,111,97, + 100,101,114,95,115,116,97,116,101,218,10,105,115,95,112,97, + 99,107,97,103,101,99,3,0,0,0,0,0,0,0,3,0, + 0,0,6,0,0,0,2,0,0,0,67,0,0,0,115,54, + 0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,124, + 3,124,0,95,2,124,4,124,0,95,3,124,5,114,32,103, + 0,110,2,100,0,124,0,95,4,100,1,124,0,95,5,100, + 0,124,0,95,6,100,0,83,0,41,2,78,70,41,7,114, + 17,0,0,0,114,110,0,0,0,114,114,0,0,0,114,115, + 0,0,0,218,26,115,117,98,109,111,100,117,108,101,95,115, + 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,218, + 13,95,115,101,116,95,102,105,108,101,97,116,116,114,218,7, + 95,99,97,99,104,101,100,41,6,114,30,0,0,0,114,17, + 0,0,0,114,110,0,0,0,114,114,0,0,0,114,115,0, + 0,0,114,116,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,31,0,0,0,102,1,0,0,115, + 18,0,0,0,6,2,6,1,6,1,6,1,14,1,6,3, + 6,1,4,128,255,128,122,19,77,111,100,117,108,101,83,112, + 101,99,46,95,95,105,110,105,116,95,95,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,6,0,0,0, + 67,0,0,0,115,102,0,0,0,100,1,160,0,124,0,106, + 1,161,1,100,2,160,0,124,0,106,2,161,1,103,2,125, + 1,124,0,106,3,100,0,117,1,114,52,124,1,160,4,100, + 3,160,0,124,0,106,3,161,1,161,1,1,0,124,0,106, + 5,100,0,117,1,114,80,124,1,160,4,100,4,160,0,124, + 0,106,5,161,1,161,1,1,0,100,5,160,0,124,0,106, + 6,106,7,100,6,160,8,124,1,161,1,161,2,83,0,41, + 7,78,122,9,110,97,109,101,61,123,33,114,125,122,11,108, + 111,97,100,101,114,61,123,33,114,125,122,11,111,114,105,103, + 105,110,61,123,33,114,125,122,29,115,117,98,109,111,100,117, 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, - 111,110,115,218,13,95,115,101,116,95,102,105,108,101,97,116, - 116,114,218,7,95,99,97,99,104,101,100,41,6,114,30,0, - 0,0,114,17,0,0,0,114,110,0,0,0,114,114,0,0, - 0,114,115,0,0,0,114,116,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,31,0,0,0,95, - 1,0,0,115,18,0,0,0,6,2,6,1,6,1,6,1, - 14,1,6,3,6,1,4,128,255,128,122,19,77,111,100,117, - 108,101,83,112,101,99,46,95,95,105,110,105,116,95,95,99, + 111,110,115,61,123,125,122,6,123,125,40,123,125,41,122,2, + 44,32,41,9,114,46,0,0,0,114,17,0,0,0,114,110, + 0,0,0,114,114,0,0,0,218,6,97,112,112,101,110,100, + 114,117,0,0,0,218,9,95,95,99,108,97,115,115,95,95, + 114,1,0,0,0,218,4,106,111,105,110,41,2,114,30,0, + 0,0,114,56,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,49,0,0,0,114,1,0,0,115, + 22,0,0,0,10,1,10,1,4,255,10,2,18,1,10,1, + 8,1,4,1,6,255,22,2,255,128,122,19,77,111,100,117, + 108,101,83,112,101,99,46,95,95,114,101,112,114,95,95,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 8,0,0,0,67,0,0,0,115,102,0,0,0,124,0,106, + 0,125,2,122,72,124,0,106,1,124,1,106,1,107,2,111, + 76,124,0,106,2,124,1,106,2,107,2,111,76,124,0,106, + 3,124,1,106,3,107,2,111,76,124,2,124,1,106,0,107, + 2,111,76,124,0,106,4,124,1,106,4,107,2,111,76,124, + 0,106,5,124,1,106,5,107,2,87,0,83,0,4,0,116, + 6,121,100,1,0,1,0,1,0,116,7,6,0,89,0,83, + 0,48,0,114,13,0,0,0,41,8,114,117,0,0,0,114, + 17,0,0,0,114,110,0,0,0,114,114,0,0,0,218,6, + 99,97,99,104,101,100,218,12,104,97,115,95,108,111,99,97, + 116,105,111,110,114,107,0,0,0,218,14,78,111,116,73,109, + 112,108,101,109,101,110,116,101,100,41,3,114,30,0,0,0, + 90,5,111,116,104,101,114,90,4,115,109,115,108,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,6,95,95, + 101,113,95,95,124,1,0,0,115,32,0,0,0,6,1,2, + 1,12,1,10,1,2,255,10,2,2,254,8,3,2,253,10, + 4,2,252,10,5,4,251,12,6,10,1,255,128,122,17,77, + 111,100,117,108,101,83,112,101,99,46,95,95,101,113,95,95, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,3,0,0,0,67,0,0,0,115,58,0,0,0,124,0, + 106,0,100,0,117,0,114,52,124,0,106,1,100,0,117,1, + 114,52,124,0,106,2,114,52,116,3,100,0,117,0,114,38, + 116,4,130,1,116,3,160,5,124,0,106,1,161,1,124,0, + 95,0,124,0,106,0,83,0,114,13,0,0,0,41,6,114, + 119,0,0,0,114,114,0,0,0,114,118,0,0,0,218,19, + 95,98,111,111,116,115,116,114,97,112,95,101,120,116,101,114, + 110,97,108,218,19,78,111,116,73,109,112,108,101,109,101,110, + 116,101,100,69,114,114,111,114,90,11,95,103,101,116,95,99, + 97,99,104,101,100,114,48,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,123,0,0,0,136,1, + 0,0,115,14,0,0,0,10,2,16,1,8,1,4,1,14, + 1,6,1,255,128,122,17,77,111,100,117,108,101,83,112,101, + 99,46,99,97,99,104,101,100,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,115,10,0,0,0,124,1,124,0,95,0,100,0,83,0, + 114,13,0,0,0,41,1,114,119,0,0,0,41,2,114,30, + 0,0,0,114,123,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,123,0,0,0,145,1,0,0, + 115,6,0,0,0,6,2,4,128,255,128,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,32,0,0,0,124,0,106,0,100,1,117, + 0,114,26,124,0,106,1,160,2,100,2,161,1,100,3,25, + 0,83,0,124,0,106,1,83,0,41,4,122,32,84,104,101, + 32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,100, + 117,108,101,39,115,32,112,97,114,101,110,116,46,78,218,1, + 46,114,22,0,0,0,41,3,114,117,0,0,0,114,17,0, + 0,0,218,10,114,112,97,114,116,105,116,105,111,110,114,48, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,6,112,97,114,101,110,116,149,1,0,0,115,8, + 0,0,0,10,3,16,1,6,2,255,128,122,17,77,111,100, + 117,108,101,83,112,101,99,46,112,97,114,101,110,116,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1, + 0,0,0,67,0,0,0,115,6,0,0,0,124,0,106,0, + 83,0,114,13,0,0,0,41,1,114,118,0,0,0,114,48, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,124,0,0,0,157,1,0,0,115,4,0,0,0, + 6,2,255,128,122,23,77,111,100,117,108,101,83,112,101,99, + 46,104,97,115,95,108,111,99,97,116,105,111,110,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0, + 0,0,67,0,0,0,115,14,0,0,0,116,0,124,1,131, + 1,124,0,95,1,100,0,83,0,114,13,0,0,0,41,2, + 218,4,98,111,111,108,114,118,0,0,0,41,2,114,30,0, + 0,0,218,5,118,97,108,117,101,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,124,0,0,0,161,1,0, + 0,115,6,0,0,0,10,2,4,128,255,128,41,12,114,1, + 0,0,0,114,0,0,0,0,114,2,0,0,0,114,3,0, + 0,0,114,31,0,0,0,114,49,0,0,0,114,126,0,0, + 0,218,8,112,114,111,112,101,114,116,121,114,123,0,0,0, + 218,6,115,101,116,116,101,114,114,131,0,0,0,114,124,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,113,0,0,0,65,1,0,0,115, + 36,0,0,0,8,0,4,1,4,36,2,1,12,255,8,12, + 8,10,2,12,10,1,4,8,10,1,2,3,10,1,2,7, + 10,1,4,3,14,1,255,128,114,113,0,0,0,169,2,114, + 114,0,0,0,114,116,0,0,0,99,2,0,0,0,0,0, + 0,0,2,0,0,0,6,0,0,0,8,0,0,0,67,0, + 0,0,115,150,0,0,0,116,0,124,1,100,1,131,2,114, + 74,116,1,100,2,117,0,114,22,116,2,130,1,116,1,106, + 3,125,4,124,3,100,2,117,0,114,48,124,4,124,0,124, + 1,100,3,141,2,83,0,124,3,114,56,103,0,110,2,100, + 2,125,5,124,4,124,0,124,1,124,5,100,4,141,3,83, + 0,124,3,100,2,117,0,114,134,116,0,124,1,100,5,131, + 2,114,130,122,14,124,1,160,4,124,0,161,1,125,3,87, + 0,110,26,4,0,116,5,121,128,1,0,1,0,1,0,100, + 2,125,3,89,0,110,6,48,0,100,6,125,3,116,6,124, + 0,124,1,124,2,124,3,100,7,141,4,83,0,41,8,122, + 53,82,101,116,117,114,110,32,97,32,109,111,100,117,108,101, + 32,115,112,101,99,32,98,97,115,101,100,32,111,110,32,118, + 97,114,105,111,117,115,32,108,111,97,100,101,114,32,109,101, + 116,104,111,100,115,46,90,12,103,101,116,95,102,105,108,101, + 110,97,109,101,78,41,1,114,110,0,0,0,41,2,114,110, + 0,0,0,114,117,0,0,0,114,116,0,0,0,70,114,136, + 0,0,0,41,7,114,4,0,0,0,114,127,0,0,0,114, + 128,0,0,0,218,23,115,112,101,99,95,102,114,111,109,95, + 102,105,108,101,95,108,111,99,97,116,105,111,110,114,116,0, + 0,0,114,80,0,0,0,114,113,0,0,0,41,6,114,17, + 0,0,0,114,110,0,0,0,114,114,0,0,0,114,116,0, + 0,0,114,137,0,0,0,90,6,115,101,97,114,99,104,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,92, + 0,0,0,166,1,0,0,115,38,0,0,0,10,2,8,1, + 4,1,6,1,8,2,12,1,12,1,6,1,2,1,6,255, + 8,3,10,1,2,1,14,1,12,1,10,1,4,3,16,2, + 255,128,114,92,0,0,0,99,3,0,0,0,0,0,0,0, + 0,0,0,0,8,0,0,0,8,0,0,0,67,0,0,0, + 115,40,1,0,0,122,10,124,0,106,0,125,3,87,0,110, + 18,4,0,116,1,121,28,1,0,1,0,1,0,89,0,110, + 14,48,0,124,3,100,0,117,1,114,42,124,3,83,0,124, + 0,106,2,125,4,124,1,100,0,117,0,114,86,122,10,124, + 0,106,3,125,1,87,0,110,18,4,0,116,1,121,84,1, + 0,1,0,1,0,89,0,110,2,48,0,122,10,124,0,106, + 4,125,5,87,0,110,22,4,0,116,1,121,118,1,0,1, + 0,1,0,100,0,125,5,89,0,110,2,48,0,124,2,100, + 0,117,0,114,174,124,5,100,0,117,0,114,170,122,10,124, + 1,106,5,125,2,87,0,110,26,4,0,116,1,121,168,1, + 0,1,0,1,0,100,0,125,2,89,0,110,6,48,0,124, + 5,125,2,122,10,124,0,106,6,125,6,87,0,110,22,4, + 0,116,1,121,206,1,0,1,0,1,0,100,0,125,6,89, + 0,110,2,48,0,122,14,116,7,124,0,106,8,131,1,125, + 7,87,0,110,22,4,0,116,1,121,244,1,0,1,0,1, + 0,100,0,125,7,89,0,110,2,48,0,116,9,124,4,124, + 1,124,2,100,1,141,3,125,3,124,5,100,0,117,0,144, + 1,114,18,100,2,110,2,100,3,124,3,95,10,124,6,124, + 3,95,11,124,7,124,3,95,12,124,3,83,0,41,4,78, + 169,1,114,114,0,0,0,70,84,41,13,114,106,0,0,0, + 114,107,0,0,0,114,1,0,0,0,114,99,0,0,0,114, + 109,0,0,0,218,7,95,79,82,73,71,73,78,218,10,95, + 95,99,97,99,104,101,100,95,95,218,4,108,105,115,116,218, + 8,95,95,112,97,116,104,95,95,114,113,0,0,0,114,118, + 0,0,0,114,123,0,0,0,114,117,0,0,0,41,8,114, + 97,0,0,0,114,110,0,0,0,114,114,0,0,0,114,96, + 0,0,0,114,17,0,0,0,90,8,108,111,99,97,116,105, + 111,110,114,123,0,0,0,114,117,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,17,95,115,112, + 101,99,95,102,114,111,109,95,109,111,100,117,108,101,192,1, + 0,0,115,74,0,0,0,2,2,10,1,12,1,6,1,8, + 2,4,1,6,2,8,1,2,1,10,1,12,1,6,2,2, + 1,10,1,12,1,10,1,8,1,8,1,2,1,10,1,12, + 1,10,1,4,2,2,1,10,1,12,1,10,1,2,1,14, + 1,12,1,10,1,14,2,20,1,6,1,6,1,4,1,255, + 128,114,143,0,0,0,70,169,1,218,8,111,118,101,114,114, + 105,100,101,99,2,0,0,0,0,0,0,0,1,0,0,0, + 5,0,0,0,8,0,0,0,67,0,0,0,115,214,1,0, + 0,124,2,115,20,116,0,124,1,100,1,100,0,131,3,100, + 0,117,0,114,52,122,12,124,0,106,1,124,1,95,2,87, + 0,110,18,4,0,116,3,121,50,1,0,1,0,1,0,89, + 0,110,2,48,0,124,2,115,72,116,0,124,1,100,2,100, + 0,131,3,100,0,117,0,114,174,124,0,106,4,125,3,124, + 3,100,0,117,0,114,144,124,0,106,5,100,0,117,1,114, + 144,116,6,100,0,117,0,114,108,116,7,130,1,116,6,106, + 8,125,4,124,4,160,9,124,4,161,1,125,3,124,0,106, + 5,124,3,95,10,124,3,124,0,95,4,100,0,124,1,95, + 11,122,10,124,3,124,1,95,12,87,0,110,18,4,0,116, + 3,121,172,1,0,1,0,1,0,89,0,110,2,48,0,124, + 2,115,194,116,0,124,1,100,3,100,0,131,3,100,0,117, + 0,114,226,122,12,124,0,106,13,124,1,95,14,87,0,110, + 18,4,0,116,3,121,224,1,0,1,0,1,0,89,0,110, + 2,48,0,122,10,124,0,124,1,95,15,87,0,110,18,4, + 0,116,3,121,254,1,0,1,0,1,0,89,0,110,2,48, + 0,124,2,144,1,115,24,116,0,124,1,100,4,100,0,131, + 3,100,0,117,0,144,1,114,70,124,0,106,5,100,0,117, + 1,144,1,114,70,122,12,124,0,106,5,124,1,95,16,87, + 0,110,20,4,0,116,3,144,1,121,68,1,0,1,0,1, + 0,89,0,110,2,48,0,124,0,106,17,144,1,114,210,124, + 2,144,1,115,102,116,0,124,1,100,5,100,0,131,3,100, + 0,117,0,144,1,114,136,122,12,124,0,106,18,124,1,95, + 11,87,0,110,20,4,0,116,3,144,1,121,134,1,0,1, + 0,1,0,89,0,110,2,48,0,124,2,144,1,115,160,116, + 0,124,1,100,6,100,0,131,3,100,0,117,0,144,1,114, + 210,124,0,106,19,100,0,117,1,144,1,114,210,122,14,124, + 0,106,19,124,1,95,20,87,0,124,1,83,0,4,0,116, + 3,144,1,121,208,1,0,1,0,1,0,89,0,124,1,83, + 0,48,0,124,1,83,0,41,7,78,114,1,0,0,0,114, + 99,0,0,0,218,11,95,95,112,97,99,107,97,103,101,95, + 95,114,142,0,0,0,114,109,0,0,0,114,140,0,0,0, + 41,21,114,6,0,0,0,114,17,0,0,0,114,1,0,0, + 0,114,107,0,0,0,114,110,0,0,0,114,117,0,0,0, + 114,127,0,0,0,114,128,0,0,0,218,16,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,218,7,95,95, + 110,101,119,95,95,90,5,95,112,97,116,104,114,109,0,0, + 0,114,99,0,0,0,114,131,0,0,0,114,146,0,0,0, + 114,106,0,0,0,114,142,0,0,0,114,124,0,0,0,114, + 114,0,0,0,114,123,0,0,0,114,140,0,0,0,41,5, + 114,96,0,0,0,114,97,0,0,0,114,145,0,0,0,114, + 110,0,0,0,114,147,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,18,95,105,110,105,116,95, + 109,111,100,117,108,101,95,97,116,116,114,115,237,1,0,0, + 115,104,0,0,0,20,4,2,1,12,1,12,1,6,1,20, + 2,6,1,8,1,10,2,8,1,4,1,6,1,10,2,8, + 1,6,1,6,11,2,1,10,1,12,1,6,1,20,2,2, + 1,12,1,12,1,6,1,2,2,10,1,12,1,6,1,24, + 2,12,1,2,1,12,1,14,1,6,1,8,2,24,1,2, + 1,12,1,14,1,6,1,24,2,12,1,2,1,10,1,4, + 3,14,254,2,1,4,1,2,255,4,1,255,128,114,149,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,82,0,0,0, + 100,1,125,1,116,0,124,0,106,1,100,2,131,2,114,30, + 124,0,106,1,160,2,124,0,161,1,125,1,110,20,116,0, + 124,0,106,1,100,3,131,2,114,50,116,3,100,4,131,1, + 130,1,124,1,100,1,117,0,114,68,116,4,124,0,106,5, + 131,1,125,1,116,6,124,0,124,1,131,2,1,0,124,1, + 83,0,41,5,122,43,67,114,101,97,116,101,32,97,32,109, + 111,100,117,108,101,32,98,97,115,101,100,32,111,110,32,116, + 104,101,32,112,114,111,118,105,100,101,100,32,115,112,101,99, + 46,78,218,13,99,114,101,97,116,101,95,109,111,100,117,108, + 101,218,11,101,120,101,99,95,109,111,100,117,108,101,122,66, + 108,111,97,100,101,114,115,32,116,104,97,116,32,100,101,102, + 105,110,101,32,101,120,101,99,95,109,111,100,117,108,101,40, + 41,32,109,117,115,116,32,97,108,115,111,32,100,101,102,105, + 110,101,32,99,114,101,97,116,101,95,109,111,100,117,108,101, + 40,41,41,7,114,4,0,0,0,114,110,0,0,0,114,150, + 0,0,0,114,80,0,0,0,114,18,0,0,0,114,17,0, + 0,0,114,149,0,0,0,169,2,114,96,0,0,0,114,97, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,16,109,111,100,117,108,101,95,102,114,111,109,95, + 115,112,101,99,53,2,0,0,115,20,0,0,0,4,3,12, + 1,14,3,12,1,8,1,8,2,10,1,10,1,4,1,255, + 128,114,153,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 100,0,0,0,124,0,106,0,100,1,117,0,114,14,100,2, + 110,4,124,0,106,0,125,1,124,0,106,1,100,1,117,0, + 114,64,124,0,106,2,100,1,117,0,114,50,100,3,160,3, + 124,1,161,1,83,0,100,4,160,3,124,1,124,0,106,2, + 161,2,83,0,124,0,106,4,114,84,100,5,160,3,124,1, + 124,0,106,1,161,2,83,0,100,6,160,3,124,0,106,0, + 124,0,106,1,161,2,83,0,41,7,122,38,82,101,116,117, + 114,110,32,116,104,101,32,114,101,112,114,32,116,111,32,117, + 115,101,32,102,111,114,32,116,104,101,32,109,111,100,117,108, + 101,46,78,114,101,0,0,0,114,102,0,0,0,114,103,0, + 0,0,114,104,0,0,0,250,18,60,109,111,100,117,108,101, + 32,123,33,114,125,32,40,123,125,41,62,41,5,114,17,0, + 0,0,114,114,0,0,0,114,110,0,0,0,114,46,0,0, + 0,114,124,0,0,0,41,2,114,96,0,0,0,114,17,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,108,0,0,0,70,2,0,0,115,18,0,0,0,20, + 3,10,1,10,1,10,1,14,2,6,2,14,1,16,2,255, + 128,114,108,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,10,0,0,0,67,0,0,0,115, + 252,0,0,0,124,0,106,0,125,2,116,1,124,2,131,1, + 143,218,1,0,116,2,106,3,160,4,124,2,161,1,124,1, + 117,1,114,54,100,1,160,5,124,2,161,1,125,3,116,6, + 124,3,124,2,100,2,141,2,130,1,122,132,124,0,106,7, + 100,3,117,0,114,106,124,0,106,8,100,3,117,0,114,90, + 116,6,100,4,124,0,106,0,100,2,141,2,130,1,116,9, + 124,0,124,1,100,5,100,6,141,3,1,0,110,52,116,9, + 124,0,124,1,100,5,100,6,141,3,1,0,116,10,124,0, + 106,7,100,7,131,2,115,146,124,0,106,7,160,11,124,2, + 161,1,1,0,110,12,124,0,106,7,160,12,124,1,161,1, + 1,0,87,0,116,2,106,3,160,13,124,0,106,0,161,1, + 125,1,124,1,116,2,106,3,124,0,106,0,60,0,110,28, + 116,2,106,3,160,13,124,0,106,0,161,1,125,1,124,1, + 116,2,106,3,124,0,106,0,60,0,48,0,87,0,100,3, + 4,0,4,0,131,3,1,0,124,1,83,0,49,0,115,238, + 48,0,1,0,1,0,1,0,89,0,1,0,124,1,83,0, + 41,8,122,70,69,120,101,99,117,116,101,32,116,104,101,32, + 115,112,101,99,39,115,32,115,112,101,99,105,102,105,101,100, + 32,109,111,100,117,108,101,32,105,110,32,97,110,32,101,120, + 105,115,116,105,110,103,32,109,111,100,117,108,101,39,115,32, + 110,97,109,101,115,112,97,99,101,46,122,30,109,111,100,117, + 108,101,32,123,33,114,125,32,110,111,116,32,105,110,32,115, + 121,115,46,109,111,100,117,108,101,115,114,16,0,0,0,78, + 250,14,109,105,115,115,105,110,103,32,108,111,97,100,101,114, + 84,114,144,0,0,0,114,151,0,0,0,41,14,114,17,0, + 0,0,114,51,0,0,0,114,15,0,0,0,114,93,0,0, + 0,114,35,0,0,0,114,46,0,0,0,114,80,0,0,0, + 114,110,0,0,0,114,117,0,0,0,114,149,0,0,0,114, + 4,0,0,0,218,11,108,111,97,100,95,109,111,100,117,108, + 101,114,151,0,0,0,218,3,112,111,112,41,4,114,96,0, + 0,0,114,97,0,0,0,114,17,0,0,0,218,3,109,115, + 103,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,94,0,0,0,87,2,0,0,115,44,0,0,0,6,2, + 10,1,16,1,10,1,12,1,2,1,10,1,10,1,14,1, + 16,2,14,2,12,1,14,4,14,2,14,4,14,1,14,255, + 26,1,4,1,16,255,4,1,255,128,114,94,0,0,0,99, 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 6,0,0,0,67,0,0,0,115,102,0,0,0,100,1,160, - 0,124,0,106,1,161,1,100,2,160,0,124,0,106,2,161, - 1,103,2,125,1,124,0,106,3,100,0,117,1,114,52,124, - 1,160,4,100,3,160,0,124,0,106,3,161,1,161,1,1, - 0,124,0,106,5,100,0,117,1,114,80,124,1,160,4,100, - 4,160,0,124,0,106,5,161,1,161,1,1,0,100,5,160, - 0,124,0,106,6,106,7,100,6,160,8,124,1,161,1,161, - 2,83,0,41,7,78,122,9,110,97,109,101,61,123,33,114, - 125,122,11,108,111,97,100,101,114,61,123,33,114,125,122,11, - 111,114,105,103,105,110,61,123,33,114,125,122,29,115,117,98, - 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, - 99,97,116,105,111,110,115,61,123,125,122,6,123,125,40,123, - 125,41,122,2,44,32,41,9,114,46,0,0,0,114,17,0, - 0,0,114,110,0,0,0,114,114,0,0,0,218,6,97,112, - 112,101,110,100,114,117,0,0,0,218,9,95,95,99,108,97, - 115,115,95,95,114,1,0,0,0,218,4,106,111,105,110,41, - 2,114,30,0,0,0,114,56,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,49,0,0,0,107, - 1,0,0,115,22,0,0,0,10,1,10,1,4,255,10,2, - 18,1,10,1,8,1,4,1,6,255,22,2,255,128,122,19, - 77,111,100,117,108,101,83,112,101,99,46,95,95,114,101,112, - 114,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,8,0,0,0,67,0,0,0,115,102,0,0, - 0,124,0,106,0,125,2,122,72,124,0,106,1,124,1,106, - 1,107,2,111,76,124,0,106,2,124,1,106,2,107,2,111, - 76,124,0,106,3,124,1,106,3,107,2,111,76,124,2,124, - 1,106,0,107,2,111,76,124,0,106,4,124,1,106,4,107, - 2,111,76,124,0,106,5,124,1,106,5,107,2,87,0,83, - 0,4,0,116,6,121,100,1,0,1,0,1,0,116,7,6, - 0,89,0,83,0,48,0,114,13,0,0,0,41,8,114,117, - 0,0,0,114,17,0,0,0,114,110,0,0,0,114,114,0, - 0,0,218,6,99,97,99,104,101,100,218,12,104,97,115,95, - 108,111,99,97,116,105,111,110,114,107,0,0,0,218,14,78, - 111,116,73,109,112,108,101,109,101,110,116,101,100,41,3,114, - 30,0,0,0,90,5,111,116,104,101,114,90,4,115,109,115, - 108,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,6,95,95,101,113,95,95,117,1,0,0,115,32,0,0, - 0,6,1,2,1,12,1,10,1,2,255,10,2,2,254,8, - 3,2,253,10,4,2,252,10,5,4,251,12,6,10,1,255, - 128,122,17,77,111,100,117,108,101,83,112,101,99,46,95,95, - 101,113,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,58,0, - 0,0,124,0,106,0,100,0,117,0,114,52,124,0,106,1, - 100,0,117,1,114,52,124,0,106,2,114,52,116,3,100,0, - 117,0,114,38,116,4,130,1,116,3,160,5,124,0,106,1, - 161,1,124,0,95,0,124,0,106,0,83,0,114,13,0,0, - 0,41,6,114,119,0,0,0,114,114,0,0,0,114,118,0, - 0,0,218,19,95,98,111,111,116,115,116,114,97,112,95,101, - 120,116,101,114,110,97,108,218,19,78,111,116,73,109,112,108, - 101,109,101,110,116,101,100,69,114,114,111,114,90,11,95,103, - 101,116,95,99,97,99,104,101,100,114,48,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,123,0, - 0,0,129,1,0,0,115,14,0,0,0,10,2,16,1,8, - 1,4,1,14,1,6,1,255,128,122,17,77,111,100,117,108, - 101,83,112,101,99,46,99,97,99,104,101,100,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, - 0,67,0,0,0,115,10,0,0,0,124,1,124,0,95,0, - 100,0,83,0,114,13,0,0,0,41,1,114,119,0,0,0, - 41,2,114,30,0,0,0,114,123,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,123,0,0,0, - 138,1,0,0,115,6,0,0,0,6,2,4,128,255,128,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,32,0,0,0,124,0,106, - 0,100,1,117,0,114,26,124,0,106,1,160,2,100,2,161, - 1,100,3,25,0,83,0,124,0,106,1,83,0,41,4,122, - 32,84,104,101,32,110,97,109,101,32,111,102,32,116,104,101, - 32,109,111,100,117,108,101,39,115,32,112,97,114,101,110,116, - 46,78,218,1,46,114,22,0,0,0,41,3,114,117,0,0, - 0,114,17,0,0,0,218,10,114,112,97,114,116,105,116,105, - 111,110,114,48,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,6,112,97,114,101,110,116,142,1, - 0,0,115,8,0,0,0,10,3,16,1,6,2,255,128,122, - 17,77,111,100,117,108,101,83,112,101,99,46,112,97,114,101, - 110,116,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,1,0,0,0,67,0,0,0,115,6,0,0,0, - 124,0,106,0,83,0,114,13,0,0,0,41,1,114,118,0, - 0,0,114,48,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,124,0,0,0,150,1,0,0,115, - 4,0,0,0,6,2,255,128,122,23,77,111,100,117,108,101, - 83,112,101,99,46,104,97,115,95,108,111,99,97,116,105,111, - 110,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,2,0,0,0,67,0,0,0,115,14,0,0,0,116, - 0,124,1,131,1,124,0,95,1,100,0,83,0,114,13,0, - 0,0,41,2,218,4,98,111,111,108,114,118,0,0,0,41, - 2,114,30,0,0,0,218,5,118,97,108,117,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,124,0,0, - 0,154,1,0,0,115,6,0,0,0,10,2,4,128,255,128, - 41,12,114,1,0,0,0,114,0,0,0,0,114,2,0,0, - 0,114,3,0,0,0,114,31,0,0,0,114,49,0,0,0, - 114,126,0,0,0,218,8,112,114,111,112,101,114,116,121,114, - 123,0,0,0,218,6,115,101,116,116,101,114,114,131,0,0, - 0,114,124,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,113,0,0,0,58, - 1,0,0,115,36,0,0,0,8,0,4,1,4,36,2,1, - 12,255,8,12,8,10,2,12,10,1,4,8,10,1,2,3, - 10,1,2,7,10,1,4,3,14,1,255,128,114,113,0,0, - 0,169,2,114,114,0,0,0,114,116,0,0,0,99,2,0, - 0,0,0,0,0,0,2,0,0,0,6,0,0,0,8,0, - 0,0,67,0,0,0,115,150,0,0,0,116,0,124,1,100, - 1,131,2,114,74,116,1,100,2,117,0,114,22,116,2,130, - 1,116,1,106,3,125,4,124,3,100,2,117,0,114,48,124, - 4,124,0,124,1,100,3,141,2,83,0,124,3,114,56,103, - 0,110,2,100,2,125,5,124,4,124,0,124,1,124,5,100, - 4,141,3,83,0,124,3,100,2,117,0,114,134,116,0,124, - 1,100,5,131,2,114,130,122,14,124,1,160,4,124,0,161, - 1,125,3,87,0,110,26,4,0,116,5,121,128,1,0,1, - 0,1,0,100,2,125,3,89,0,110,6,48,0,100,6,125, - 3,116,6,124,0,124,1,124,2,124,3,100,7,141,4,83, - 0,41,8,122,53,82,101,116,117,114,110,32,97,32,109,111, - 100,117,108,101,32,115,112,101,99,32,98,97,115,101,100,32, - 111,110,32,118,97,114,105,111,117,115,32,108,111,97,100,101, - 114,32,109,101,116,104,111,100,115,46,90,12,103,101,116,95, - 102,105,108,101,110,97,109,101,78,41,1,114,110,0,0,0, - 41,2,114,110,0,0,0,114,117,0,0,0,114,116,0,0, - 0,70,114,136,0,0,0,41,7,114,4,0,0,0,114,127, - 0,0,0,114,128,0,0,0,218,23,115,112,101,99,95,102, - 114,111,109,95,102,105,108,101,95,108,111,99,97,116,105,111, - 110,114,116,0,0,0,114,80,0,0,0,114,113,0,0,0, - 41,6,114,17,0,0,0,114,110,0,0,0,114,114,0,0, - 0,114,116,0,0,0,114,137,0,0,0,90,6,115,101,97, - 114,99,104,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,92,0,0,0,159,1,0,0,115,38,0,0,0, - 10,2,8,1,4,1,6,1,8,2,12,1,12,1,6,1, - 2,1,6,255,8,3,10,1,2,1,14,1,12,1,10,1, - 4,3,16,2,255,128,114,92,0,0,0,99,3,0,0,0, - 0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0, - 67,0,0,0,115,40,1,0,0,122,10,124,0,106,0,125, - 3,87,0,110,18,4,0,116,1,121,28,1,0,1,0,1, - 0,89,0,110,14,48,0,124,3,100,0,117,1,114,42,124, - 3,83,0,124,0,106,2,125,4,124,1,100,0,117,0,114, - 86,122,10,124,0,106,3,125,1,87,0,110,18,4,0,116, - 1,121,84,1,0,1,0,1,0,89,0,110,2,48,0,122, - 10,124,0,106,4,125,5,87,0,110,22,4,0,116,1,121, - 118,1,0,1,0,1,0,100,0,125,5,89,0,110,2,48, - 0,124,2,100,0,117,0,114,174,124,5,100,0,117,0,114, - 170,122,10,124,1,106,5,125,2,87,0,110,26,4,0,116, - 1,121,168,1,0,1,0,1,0,100,0,125,2,89,0,110, - 6,48,0,124,5,125,2,122,10,124,0,106,6,125,6,87, - 0,110,22,4,0,116,1,121,206,1,0,1,0,1,0,100, - 0,125,6,89,0,110,2,48,0,122,14,116,7,124,0,106, - 8,131,1,125,7,87,0,110,22,4,0,116,1,121,244,1, - 0,1,0,1,0,100,0,125,7,89,0,110,2,48,0,116, - 9,124,4,124,1,124,2,100,1,141,3,125,3,124,5,100, - 0,117,0,144,1,114,18,100,2,110,2,100,3,124,3,95, - 10,124,6,124,3,95,11,124,7,124,3,95,12,124,3,83, - 0,41,4,78,169,1,114,114,0,0,0,70,84,41,13,114, - 106,0,0,0,114,107,0,0,0,114,1,0,0,0,114,99, - 0,0,0,114,109,0,0,0,218,7,95,79,82,73,71,73, - 78,218,10,95,95,99,97,99,104,101,100,95,95,218,4,108, - 105,115,116,218,8,95,95,112,97,116,104,95,95,114,113,0, - 0,0,114,118,0,0,0,114,123,0,0,0,114,117,0,0, - 0,41,8,114,97,0,0,0,114,110,0,0,0,114,114,0, - 0,0,114,96,0,0,0,114,17,0,0,0,90,8,108,111, - 99,97,116,105,111,110,114,123,0,0,0,114,117,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 17,95,115,112,101,99,95,102,114,111,109,95,109,111,100,117, - 108,101,185,1,0,0,115,74,0,0,0,2,2,10,1,12, - 1,6,1,8,2,4,1,6,2,8,1,2,1,10,1,12, - 1,6,2,2,1,10,1,12,1,10,1,8,1,8,1,2, - 1,10,1,12,1,10,1,4,2,2,1,10,1,12,1,10, - 1,2,1,14,1,12,1,10,1,14,2,20,1,6,1,6, - 1,4,1,255,128,114,143,0,0,0,70,169,1,218,8,111, - 118,101,114,114,105,100,101,99,2,0,0,0,0,0,0,0, - 1,0,0,0,5,0,0,0,8,0,0,0,67,0,0,0, - 115,214,1,0,0,124,2,115,20,116,0,124,1,100,1,100, - 0,131,3,100,0,117,0,114,52,122,12,124,0,106,1,124, - 1,95,2,87,0,110,18,4,0,116,3,121,50,1,0,1, - 0,1,0,89,0,110,2,48,0,124,2,115,72,116,0,124, - 1,100,2,100,0,131,3,100,0,117,0,114,174,124,0,106, - 4,125,3,124,3,100,0,117,0,114,144,124,0,106,5,100, - 0,117,1,114,144,116,6,100,0,117,0,114,108,116,7,130, - 1,116,6,106,8,125,4,124,4,160,9,124,4,161,1,125, - 3,124,0,106,5,124,3,95,10,124,3,124,0,95,4,100, - 0,124,1,95,11,122,10,124,3,124,1,95,12,87,0,110, - 18,4,0,116,3,121,172,1,0,1,0,1,0,89,0,110, - 2,48,0,124,2,115,194,116,0,124,1,100,3,100,0,131, - 3,100,0,117,0,114,226,122,12,124,0,106,13,124,1,95, - 14,87,0,110,18,4,0,116,3,121,224,1,0,1,0,1, - 0,89,0,110,2,48,0,122,10,124,0,124,1,95,15,87, - 0,110,18,4,0,116,3,121,254,1,0,1,0,1,0,89, - 0,110,2,48,0,124,2,144,1,115,24,116,0,124,1,100, - 4,100,0,131,3,100,0,117,0,144,1,114,70,124,0,106, - 5,100,0,117,1,144,1,114,70,122,12,124,0,106,5,124, - 1,95,16,87,0,110,20,4,0,116,3,144,1,121,68,1, - 0,1,0,1,0,89,0,110,2,48,0,124,0,106,17,144, - 1,114,210,124,2,144,1,115,102,116,0,124,1,100,5,100, - 0,131,3,100,0,117,0,144,1,114,136,122,12,124,0,106, - 18,124,1,95,11,87,0,110,20,4,0,116,3,144,1,121, - 134,1,0,1,0,1,0,89,0,110,2,48,0,124,2,144, - 1,115,160,116,0,124,1,100,6,100,0,131,3,100,0,117, - 0,144,1,114,210,124,0,106,19,100,0,117,1,144,1,114, - 210,122,14,124,0,106,19,124,1,95,20,87,0,124,1,83, - 0,4,0,116,3,144,1,121,208,1,0,1,0,1,0,89, - 0,124,1,83,0,48,0,124,1,83,0,41,7,78,114,1, - 0,0,0,114,99,0,0,0,218,11,95,95,112,97,99,107, - 97,103,101,95,95,114,142,0,0,0,114,109,0,0,0,114, - 140,0,0,0,41,21,114,6,0,0,0,114,17,0,0,0, - 114,1,0,0,0,114,107,0,0,0,114,110,0,0,0,114, - 117,0,0,0,114,127,0,0,0,114,128,0,0,0,218,16, - 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, - 218,7,95,95,110,101,119,95,95,90,5,95,112,97,116,104, - 114,109,0,0,0,114,99,0,0,0,114,131,0,0,0,114, - 146,0,0,0,114,106,0,0,0,114,142,0,0,0,114,124, - 0,0,0,114,114,0,0,0,114,123,0,0,0,114,140,0, - 0,0,41,5,114,96,0,0,0,114,97,0,0,0,114,145, - 0,0,0,114,110,0,0,0,114,147,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,18,95,105, - 110,105,116,95,109,111,100,117,108,101,95,97,116,116,114,115, - 230,1,0,0,115,104,0,0,0,20,4,2,1,12,1,12, - 1,6,1,20,2,6,1,8,1,10,2,8,1,4,1,6, - 1,10,2,8,1,6,1,6,11,2,1,10,1,12,1,6, - 1,20,2,2,1,12,1,12,1,6,1,2,2,10,1,12, - 1,6,1,24,2,12,1,2,1,12,1,14,1,6,1,8, - 2,24,1,2,1,12,1,14,1,6,1,24,2,12,1,2, - 1,10,1,4,3,14,254,2,1,4,1,2,255,4,1,255, - 128,114,149,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 82,0,0,0,100,1,125,1,116,0,124,0,106,1,100,2, - 131,2,114,30,124,0,106,1,160,2,124,0,161,1,125,1, - 110,20,116,0,124,0,106,1,100,3,131,2,114,50,116,3, - 100,4,131,1,130,1,124,1,100,1,117,0,114,68,116,4, - 124,0,106,5,131,1,125,1,116,6,124,0,124,1,131,2, - 1,0,124,1,83,0,41,5,122,43,67,114,101,97,116,101, - 32,97,32,109,111,100,117,108,101,32,98,97,115,101,100,32, - 111,110,32,116,104,101,32,112,114,111,118,105,100,101,100,32, - 115,112,101,99,46,78,218,13,99,114,101,97,116,101,95,109, - 111,100,117,108,101,218,11,101,120,101,99,95,109,111,100,117, - 108,101,122,66,108,111,97,100,101,114,115,32,116,104,97,116, - 32,100,101,102,105,110,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,109,117,115,116,32,97,108,115,111,32, - 100,101,102,105,110,101,32,99,114,101,97,116,101,95,109,111, - 100,117,108,101,40,41,41,7,114,4,0,0,0,114,110,0, - 0,0,114,150,0,0,0,114,80,0,0,0,114,18,0,0, - 0,114,17,0,0,0,114,149,0,0,0,169,2,114,96,0, - 0,0,114,97,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,16,109,111,100,117,108,101,95,102, - 114,111,109,95,115,112,101,99,46,2,0,0,115,20,0,0, - 0,4,3,12,1,14,3,12,1,8,1,8,2,10,1,10, - 1,4,1,255,128,114,153,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,100,0,0,0,124,0,106,0,100,1,117,0, - 114,14,100,2,110,4,124,0,106,0,125,1,124,0,106,1, - 100,1,117,0,114,64,124,0,106,2,100,1,117,0,114,50, - 100,3,160,3,124,1,161,1,83,0,100,4,160,3,124,1, - 124,0,106,2,161,2,83,0,124,0,106,4,114,84,100,5, - 160,3,124,1,124,0,106,1,161,2,83,0,100,6,160,3, - 124,0,106,0,124,0,106,1,161,2,83,0,41,7,122,38, - 82,101,116,117,114,110,32,116,104,101,32,114,101,112,114,32, - 116,111,32,117,115,101,32,102,111,114,32,116,104,101,32,109, - 111,100,117,108,101,46,78,114,101,0,0,0,114,102,0,0, - 0,114,103,0,0,0,114,104,0,0,0,250,18,60,109,111, - 100,117,108,101,32,123,33,114,125,32,40,123,125,41,62,41, - 5,114,17,0,0,0,114,114,0,0,0,114,110,0,0,0, - 114,46,0,0,0,114,124,0,0,0,41,2,114,96,0,0, - 0,114,17,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,108,0,0,0,63,2,0,0,115,18, - 0,0,0,20,3,10,1,10,1,10,1,14,2,6,2,14, - 1,16,2,255,128,114,108,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,10,0,0,0,67, - 0,0,0,115,252,0,0,0,124,0,106,0,125,2,116,1, - 124,2,131,1,143,218,1,0,116,2,106,3,160,4,124,2, - 161,1,124,1,117,1,114,54,100,1,160,5,124,2,161,1, - 125,3,116,6,124,3,124,2,100,2,141,2,130,1,122,132, - 124,0,106,7,100,3,117,0,114,106,124,0,106,8,100,3, - 117,0,114,90,116,6,100,4,124,0,106,0,100,2,141,2, - 130,1,116,9,124,0,124,1,100,5,100,6,141,3,1,0, - 110,52,116,9,124,0,124,1,100,5,100,6,141,3,1,0, - 116,10,124,0,106,7,100,7,131,2,115,146,124,0,106,7, - 160,11,124,2,161,1,1,0,110,12,124,0,106,7,160,12, - 124,1,161,1,1,0,87,0,116,2,106,3,160,13,124,0, - 106,0,161,1,125,1,124,1,116,2,106,3,124,0,106,0, - 60,0,110,28,116,2,106,3,160,13,124,0,106,0,161,1, - 125,1,124,1,116,2,106,3,124,0,106,0,60,0,48,0, - 87,0,100,3,4,0,4,0,131,3,1,0,124,1,83,0, - 49,0,115,238,48,0,1,0,1,0,1,0,89,0,1,0, - 124,1,83,0,41,8,122,70,69,120,101,99,117,116,101,32, - 116,104,101,32,115,112,101,99,39,115,32,115,112,101,99,105, - 102,105,101,100,32,109,111,100,117,108,101,32,105,110,32,97, - 110,32,101,120,105,115,116,105,110,103,32,109,111,100,117,108, - 101,39,115,32,110,97,109,101,115,112,97,99,101,46,122,30, - 109,111,100,117,108,101,32,123,33,114,125,32,110,111,116,32, - 105,110,32,115,121,115,46,109,111,100,117,108,101,115,114,16, - 0,0,0,78,250,14,109,105,115,115,105,110,103,32,108,111, - 97,100,101,114,84,114,144,0,0,0,114,151,0,0,0,41, - 14,114,17,0,0,0,114,51,0,0,0,114,15,0,0,0, - 114,93,0,0,0,114,35,0,0,0,114,46,0,0,0,114, - 80,0,0,0,114,110,0,0,0,114,117,0,0,0,114,149, - 0,0,0,114,4,0,0,0,218,11,108,111,97,100,95,109, - 111,100,117,108,101,114,151,0,0,0,218,3,112,111,112,41, - 4,114,96,0,0,0,114,97,0,0,0,114,17,0,0,0, - 218,3,109,115,103,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,94,0,0,0,80,2,0,0,115,44,0, - 0,0,6,2,10,1,16,1,10,1,12,1,2,1,10,1, - 10,1,14,1,16,2,14,2,12,1,14,4,14,2,14,4, - 14,1,14,255,26,1,4,1,16,255,4,1,255,128,114,94, + 8,0,0,0,67,0,0,0,115,18,1,0,0,122,18,124, + 0,106,0,160,1,124,0,106,2,161,1,1,0,87,0,110, + 46,1,0,1,0,1,0,124,0,106,2,116,3,106,4,118, + 0,114,64,116,3,106,4,160,5,124,0,106,2,161,1,125, + 1,124,1,116,3,106,4,124,0,106,2,60,0,130,0,116, + 3,106,4,160,5,124,0,106,2,161,1,125,1,124,1,116, + 3,106,4,124,0,106,2,60,0,116,6,124,1,100,1,100, + 0,131,3,100,0,117,0,114,140,122,12,124,0,106,0,124, + 1,95,7,87,0,110,18,4,0,116,8,121,138,1,0,1, + 0,1,0,89,0,110,2,48,0,116,6,124,1,100,2,100, + 0,131,3,100,0,117,0,114,216,122,40,124,1,106,9,124, + 1,95,10,116,11,124,1,100,3,131,2,115,194,124,0,106, + 2,160,12,100,4,161,1,100,5,25,0,124,1,95,10,87, + 0,110,18,4,0,116,8,121,214,1,0,1,0,1,0,89, + 0,110,2,48,0,116,6,124,1,100,6,100,0,131,3,100, + 0,117,0,144,1,114,14,122,12,124,0,124,1,95,13,87, + 0,124,1,83,0,4,0,116,8,144,1,121,12,1,0,1, + 0,1,0,89,0,124,1,83,0,48,0,124,1,83,0,41, + 7,78,114,99,0,0,0,114,146,0,0,0,114,142,0,0, + 0,114,129,0,0,0,114,22,0,0,0,114,106,0,0,0, + 41,14,114,110,0,0,0,114,156,0,0,0,114,17,0,0, + 0,114,15,0,0,0,114,93,0,0,0,114,157,0,0,0, + 114,6,0,0,0,114,99,0,0,0,114,107,0,0,0,114, + 1,0,0,0,114,146,0,0,0,114,4,0,0,0,114,130, + 0,0,0,114,106,0,0,0,114,152,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,25,95,108, + 111,97,100,95,98,97,99,107,119,97,114,100,95,99,111,109, + 112,97,116,105,98,108,101,117,2,0,0,115,62,0,0,0, + 2,4,18,1,6,1,12,1,14,1,12,1,2,1,14,3, + 12,1,16,1,2,1,12,1,12,1,6,1,16,1,2,1, + 8,4,10,1,22,1,12,1,6,1,18,1,2,1,8,1, + 4,3,14,254,2,1,4,1,2,255,4,1,255,128,114,159, 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,8,0,0,0,67,0,0,0,115,18,1,0, - 0,122,18,124,0,106,0,160,1,124,0,106,2,161,1,1, - 0,87,0,110,46,1,0,1,0,1,0,124,0,106,2,116, - 3,106,4,118,0,114,64,116,3,106,4,160,5,124,0,106, - 2,161,1,125,1,124,1,116,3,106,4,124,0,106,2,60, - 0,130,0,116,3,106,4,160,5,124,0,106,2,161,1,125, - 1,124,1,116,3,106,4,124,0,106,2,60,0,116,6,124, - 1,100,1,100,0,131,3,100,0,117,0,114,140,122,12,124, - 0,106,0,124,1,95,7,87,0,110,18,4,0,116,8,121, - 138,1,0,1,0,1,0,89,0,110,2,48,0,116,6,124, - 1,100,2,100,0,131,3,100,0,117,0,114,216,122,40,124, - 1,106,9,124,1,95,10,116,11,124,1,100,3,131,2,115, - 194,124,0,106,2,160,12,100,4,161,1,100,5,25,0,124, - 1,95,10,87,0,110,18,4,0,116,8,121,214,1,0,1, - 0,1,0,89,0,110,2,48,0,116,6,124,1,100,6,100, - 0,131,3,100,0,117,0,144,1,114,14,122,12,124,0,124, - 1,95,13,87,0,124,1,83,0,4,0,116,8,144,1,121, - 12,1,0,1,0,1,0,89,0,124,1,83,0,48,0,124, - 1,83,0,41,7,78,114,99,0,0,0,114,146,0,0,0, - 114,142,0,0,0,114,129,0,0,0,114,22,0,0,0,114, - 106,0,0,0,41,14,114,110,0,0,0,114,156,0,0,0, - 114,17,0,0,0,114,15,0,0,0,114,93,0,0,0,114, - 157,0,0,0,114,6,0,0,0,114,99,0,0,0,114,107, - 0,0,0,114,1,0,0,0,114,146,0,0,0,114,4,0, - 0,0,114,130,0,0,0,114,106,0,0,0,114,152,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,25,95,108,111,97,100,95,98,97,99,107,119,97,114,100, - 95,99,111,109,112,97,116,105,98,108,101,110,2,0,0,115, - 62,0,0,0,2,4,18,1,6,1,12,1,14,1,12,1, - 2,1,14,3,12,1,16,1,2,1,12,1,12,1,6,1, - 16,1,2,1,8,4,10,1,22,1,12,1,6,1,18,1, - 2,1,8,1,4,3,14,254,2,1,4,1,2,255,4,1, - 255,128,114,159,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,11,0,0,0,67,0,0,0, - 115,212,0,0,0,124,0,106,0,100,0,117,1,114,30,116, - 1,124,0,106,0,100,1,131,2,115,30,116,2,124,0,131, - 1,83,0,116,3,124,0,131,1,125,1,100,2,124,0,95, - 4,122,158,124,1,116,5,106,6,124,0,106,7,60,0,122, - 50,124,0,106,0,100,0,117,0,114,94,124,0,106,8,100, - 0,117,0,114,106,116,9,100,3,124,0,106,7,100,4,141, - 2,130,1,124,0,106,0,160,10,124,1,161,1,1,0,87, - 0,110,40,1,0,1,0,1,0,122,14,116,5,106,6,124, - 0,106,7,61,0,87,0,130,0,4,0,116,11,121,148,1, - 0,1,0,1,0,89,0,130,0,48,0,116,5,106,6,160, - 12,124,0,106,7,161,1,125,1,124,1,116,5,106,6,124, - 0,106,7,60,0,116,13,100,5,124,0,106,7,124,0,106, - 0,131,3,1,0,87,0,100,6,124,0,95,4,124,1,83, - 0,100,6,124,0,95,4,48,0,41,7,78,114,151,0,0, - 0,84,114,155,0,0,0,114,16,0,0,0,122,18,105,109, - 112,111,114,116,32,123,33,114,125,32,35,32,123,33,114,125, - 70,41,14,114,110,0,0,0,114,4,0,0,0,114,159,0, - 0,0,114,153,0,0,0,90,13,95,105,110,105,116,105,97, - 108,105,122,105,110,103,114,15,0,0,0,114,93,0,0,0, - 114,17,0,0,0,114,117,0,0,0,114,80,0,0,0,114, - 151,0,0,0,114,64,0,0,0,114,157,0,0,0,114,77, - 0,0,0,114,152,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,14,95,108,111,97,100,95,117, - 110,108,111,99,107,101,100,147,2,0,0,115,54,0,0,0, - 10,2,12,2,8,1,8,2,6,5,2,1,12,1,2,1, - 10,1,10,1,14,1,16,3,6,1,2,1,12,1,2,3, - 12,254,2,1,2,1,2,255,14,6,12,1,18,1,6,2, - 4,2,8,254,255,128,114,160,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0, - 67,0,0,0,115,54,0,0,0,116,0,124,0,106,1,131, - 1,143,24,1,0,116,2,124,0,131,1,87,0,2,0,100, - 1,4,0,4,0,131,3,1,0,83,0,49,0,115,40,48, - 0,1,0,1,0,1,0,89,0,1,0,100,1,83,0,41, - 2,122,191,82,101,116,117,114,110,32,97,32,110,101,119,32, - 109,111,100,117,108,101,32,111,98,106,101,99,116,44,32,108, - 111,97,100,101,100,32,98,121,32,116,104,101,32,115,112,101, - 99,39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111,32,105,116,115,32, - 112,97,114,101,110,116,46,10,10,32,32,32,32,73,102,32, - 97,32,109,111,100,117,108,101,32,105,115,32,97,108,114,101, - 97,100,121,32,105,110,32,115,121,115,46,109,111,100,117,108, - 101,115,44,32,116,104,97,116,32,101,120,105,115,116,105,110, - 103,32,109,111,100,117,108,101,32,103,101,116,115,10,32,32, - 32,32,99,108,111,98,98,101,114,101,100,46,10,10,32,32, - 32,32,78,41,3,114,51,0,0,0,114,17,0,0,0,114, - 160,0,0,0,41,1,114,96,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,95,0,0,0,189, - 2,0,0,115,8,0,0,0,12,9,38,1,4,128,255,128, - 114,95,0,0,0,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,64,0,0,0,115,140, - 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, - 2,90,4,101,5,100,3,100,4,132,0,131,1,90,6,101, - 7,100,20,100,6,100,7,132,1,131,1,90,8,101,7,100, - 21,100,8,100,9,132,1,131,1,90,9,101,7,100,10,100, - 11,132,0,131,1,90,10,101,7,100,12,100,13,132,0,131, - 1,90,11,101,7,101,12,100,14,100,15,132,0,131,1,131, - 1,90,13,101,7,101,12,100,16,100,17,132,0,131,1,131, - 1,90,14,101,7,101,12,100,18,100,19,132,0,131,1,131, - 1,90,15,101,7,101,16,131,1,90,17,100,5,83,0,41, - 22,218,15,66,117,105,108,116,105,110,73,109,112,111,114,116, - 101,114,122,144,77,101,116,97,32,112,97,116,104,32,105,109, - 112,111,114,116,32,102,111,114,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,115,46,10,10,32,32,32,32, - 65,108,108,32,109,101,116,104,111,100,115,32,97,114,101,32, - 101,105,116,104,101,114,32,99,108,97,115,115,32,111,114,32, - 115,116,97,116,105,99,32,109,101,116,104,111,100,115,32,116, - 111,32,97,118,111,105,100,32,116,104,101,32,110,101,101,100, - 32,116,111,10,32,32,32,32,105,110,115,116,97,110,116,105, - 97,116,101,32,116,104,101,32,99,108,97,115,115,46,10,10, - 32,32,32,32,122,8,98,117,105,108,116,45,105,110,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5, - 0,0,0,67,0,0,0,115,22,0,0,0,100,1,124,0, - 106,0,155,2,100,2,116,1,106,2,155,0,100,3,157,5, - 83,0,41,5,250,115,82,101,116,117,114,110,32,114,101,112, - 114,32,102,111,114,32,116,104,101,32,109,111,100,117,108,101, - 46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,109, - 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,32,32,84,104,101,32,105,109,112,111,114,116, - 32,109,97,99,104,105,110,101,114,121,32,100,111,101,115,32, - 116,104,101,32,106,111,98,32,105,116,115,101,108,102,46,10, - 10,32,32,32,32,32,32,32,32,122,8,60,109,111,100,117, - 108,101,32,122,2,32,40,122,2,41,62,78,41,3,114,1, - 0,0,0,114,161,0,0,0,114,139,0,0,0,41,1,114, - 97,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,100,0,0,0,215,2,0,0,115,4,0,0, - 0,22,7,255,128,122,27,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,4,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,5,0,0,0,67,0,0,0,115,42,0,0, - 0,124,2,100,0,117,1,114,12,100,0,83,0,116,0,160, - 1,124,1,161,1,114,38,116,2,124,1,124,0,124,0,106, - 3,100,1,141,3,83,0,100,0,83,0,169,2,78,114,138, - 0,0,0,41,4,114,58,0,0,0,90,10,105,115,95,98, - 117,105,108,116,105,110,114,92,0,0,0,114,139,0,0,0, - 169,4,218,3,99,108,115,114,82,0,0,0,218,4,112,97, - 116,104,218,6,116,97,114,103,101,116,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,9,102,105,110,100,95, - 115,112,101,99,224,2,0,0,115,12,0,0,0,8,2,4, - 1,10,1,16,1,4,2,255,128,122,25,66,117,105,108,116, - 105,110,73,109,112,111,114,116,101,114,46,102,105,110,100,95, - 115,112,101,99,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,4,0,0,0,67,0,0,0,115,30,0, - 0,0,124,0,160,0,124,1,124,2,161,2,125,3,124,3, - 100,1,117,1,114,26,124,3,106,1,83,0,100,1,83,0, - 41,2,122,175,70,105,110,100,32,116,104,101,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,46,10,10,32, - 32,32,32,32,32,32,32,73,102,32,39,112,97,116,104,39, - 32,105,115,32,101,118,101,114,32,115,112,101,99,105,102,105, - 101,100,32,116,104,101,110,32,116,104,101,32,115,101,97,114, - 99,104,32,105,115,32,99,111,110,115,105,100,101,114,101,100, - 32,97,32,102,97,105,108,117,114,101,46,10,10,32,32,32, - 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, - 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, - 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, - 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, - 32,32,32,78,41,2,114,168,0,0,0,114,110,0,0,0, - 41,4,114,165,0,0,0,114,82,0,0,0,114,166,0,0, - 0,114,96,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,11,102,105,110,100,95,109,111,100,117, - 108,101,233,2,0,0,115,6,0,0,0,12,9,18,1,255, + 2,0,0,0,11,0,0,0,67,0,0,0,115,212,0,0, + 0,124,0,106,0,100,0,117,1,114,30,116,1,124,0,106, + 0,100,1,131,2,115,30,116,2,124,0,131,1,83,0,116, + 3,124,0,131,1,125,1,100,2,124,0,95,4,122,158,124, + 1,116,5,106,6,124,0,106,7,60,0,122,50,124,0,106, + 0,100,0,117,0,114,94,124,0,106,8,100,0,117,0,114, + 106,116,9,100,3,124,0,106,7,100,4,141,2,130,1,124, + 0,106,0,160,10,124,1,161,1,1,0,87,0,110,40,1, + 0,1,0,1,0,122,14,116,5,106,6,124,0,106,7,61, + 0,87,0,130,0,4,0,116,11,121,148,1,0,1,0,1, + 0,89,0,130,0,48,0,116,5,106,6,160,12,124,0,106, + 7,161,1,125,1,124,1,116,5,106,6,124,0,106,7,60, + 0,116,13,100,5,124,0,106,7,124,0,106,0,131,3,1, + 0,87,0,100,6,124,0,95,4,124,1,83,0,100,6,124, + 0,95,4,48,0,41,7,78,114,151,0,0,0,84,114,155, + 0,0,0,114,16,0,0,0,122,18,105,109,112,111,114,116, + 32,123,33,114,125,32,35,32,123,33,114,125,70,41,14,114, + 110,0,0,0,114,4,0,0,0,114,159,0,0,0,114,153, + 0,0,0,90,13,95,105,110,105,116,105,97,108,105,122,105, + 110,103,114,15,0,0,0,114,93,0,0,0,114,17,0,0, + 0,114,117,0,0,0,114,80,0,0,0,114,151,0,0,0, + 114,64,0,0,0,114,157,0,0,0,114,77,0,0,0,114, + 152,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,14,95,108,111,97,100,95,117,110,108,111,99, + 107,101,100,154,2,0,0,115,54,0,0,0,10,2,12,2, + 8,1,8,2,6,5,2,1,12,1,2,1,10,1,10,1, + 14,1,16,3,6,1,2,1,12,1,2,3,12,254,2,1, + 2,1,2,255,14,6,12,1,18,1,6,2,4,2,8,254, + 255,128,114,160,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,8,0,0,0,67,0,0,0, + 115,54,0,0,0,116,0,124,0,106,1,131,1,143,24,1, + 0,116,2,124,0,131,1,87,0,2,0,100,1,4,0,4, + 0,131,3,1,0,83,0,49,0,115,40,48,0,1,0,1, + 0,1,0,89,0,1,0,100,1,83,0,41,2,122,191,82, + 101,116,117,114,110,32,97,32,110,101,119,32,109,111,100,117, + 108,101,32,111,98,106,101,99,116,44,32,108,111,97,100,101, + 100,32,98,121,32,116,104,101,32,115,112,101,99,39,115,32, + 108,111,97,100,101,114,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,97, + 100,100,101,100,32,116,111,32,105,116,115,32,112,97,114,101, + 110,116,46,10,10,32,32,32,32,73,102,32,97,32,109,111, + 100,117,108,101,32,105,115,32,97,108,114,101,97,100,121,32, + 105,110,32,115,121,115,46,109,111,100,117,108,101,115,44,32, + 116,104,97,116,32,101,120,105,115,116,105,110,103,32,109,111, + 100,117,108,101,32,103,101,116,115,10,32,32,32,32,99,108, + 111,98,98,101,114,101,100,46,10,10,32,32,32,32,78,41, + 3,114,51,0,0,0,114,17,0,0,0,114,160,0,0,0, + 41,1,114,96,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,95,0,0,0,196,2,0,0,115, + 8,0,0,0,12,9,38,1,4,128,255,128,114,95,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,64,0,0,0,115,140,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,101, + 5,100,3,100,4,132,0,131,1,90,6,101,7,100,20,100, + 6,100,7,132,1,131,1,90,8,101,7,100,21,100,8,100, + 9,132,1,131,1,90,9,101,7,100,10,100,11,132,0,131, + 1,90,10,101,7,100,12,100,13,132,0,131,1,90,11,101, + 7,101,12,100,14,100,15,132,0,131,1,131,1,90,13,101, + 7,101,12,100,16,100,17,132,0,131,1,131,1,90,14,101, + 7,101,12,100,18,100,19,132,0,131,1,131,1,90,15,101, + 7,101,16,131,1,90,17,100,5,83,0,41,22,218,15,66, + 117,105,108,116,105,110,73,109,112,111,114,116,101,114,122,144, + 77,101,116,97,32,112,97,116,104,32,105,109,112,111,114,116, + 32,102,111,114,32,98,117,105,108,116,45,105,110,32,109,111, + 100,117,108,101,115,46,10,10,32,32,32,32,65,108,108,32, + 109,101,116,104,111,100,115,32,97,114,101,32,101,105,116,104, + 101,114,32,99,108,97,115,115,32,111,114,32,115,116,97,116, + 105,99,32,109,101,116,104,111,100,115,32,116,111,32,97,118, + 111,105,100,32,116,104,101,32,110,101,101,100,32,116,111,10, + 32,32,32,32,105,110,115,116,97,110,116,105,97,116,101,32, + 116,104,101,32,99,108,97,115,115,46,10,10,32,32,32,32, + 122,8,98,117,105,108,116,45,105,110,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,67, + 0,0,0,115,22,0,0,0,100,1,124,0,106,0,155,2, + 100,2,116,1,106,2,155,0,100,3,157,5,83,0,41,5, + 250,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111, + 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99, + 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32, + 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32, + 32,32,32,32,32,122,8,60,109,111,100,117,108,101,32,122, + 2,32,40,122,2,41,62,78,41,3,114,1,0,0,0,114, + 161,0,0,0,114,139,0,0,0,41,1,114,97,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 100,0,0,0,222,2,0,0,115,4,0,0,0,22,7,255, 128,122,27,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,0,0,0,0,0,2,0,0,0,4, - 0,0,0,67,0,0,0,115,46,0,0,0,124,1,106,0, - 116,1,106,2,118,1,114,34,116,3,100,1,160,4,124,1, - 106,0,161,1,124,1,106,0,100,2,141,2,130,1,116,5, - 116,6,106,7,124,1,131,2,83,0,41,4,122,24,67,114, - 101,97,116,101,32,97,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,114,78,0,0,0,114,16,0,0,0, - 78,41,8,114,17,0,0,0,114,15,0,0,0,114,79,0, - 0,0,114,80,0,0,0,114,46,0,0,0,114,68,0,0, - 0,114,58,0,0,0,90,14,99,114,101,97,116,101,95,98, - 117,105,108,116,105,110,41,2,114,30,0,0,0,114,96,0, + 101,114,46,109,111,100,117,108,101,95,114,101,112,114,78,99, + 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 5,0,0,0,67,0,0,0,115,42,0,0,0,124,2,100, + 0,117,1,114,12,100,0,83,0,116,0,160,1,124,1,161, + 1,114,38,116,2,124,1,124,0,124,0,106,3,100,1,141, + 3,83,0,100,0,83,0,169,2,78,114,138,0,0,0,41, + 4,114,58,0,0,0,90,10,105,115,95,98,117,105,108,116, + 105,110,114,92,0,0,0,114,139,0,0,0,169,4,218,3, + 99,108,115,114,82,0,0,0,218,4,112,97,116,104,218,6, + 116,97,114,103,101,116,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,9,102,105,110,100,95,115,112,101,99, + 231,2,0,0,115,12,0,0,0,8,2,4,1,10,1,16, + 1,4,2,255,128,122,25,66,117,105,108,116,105,110,73,109, + 112,111,114,116,101,114,46,102,105,110,100,95,115,112,101,99, + 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,30,0,0,0,124,0, + 160,0,124,1,124,2,161,2,125,3,124,3,100,1,117,1, + 114,26,124,3,106,1,83,0,100,1,83,0,41,2,122,175, + 70,105,110,100,32,116,104,101,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, + 32,32,32,73,102,32,39,112,97,116,104,39,32,105,115,32, + 101,118,101,114,32,115,112,101,99,105,102,105,101,100,32,116, + 104,101,110,32,116,104,101,32,115,101,97,114,99,104,32,105, + 115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,102, + 97,105,108,117,114,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, + 41,2,114,168,0,0,0,114,110,0,0,0,41,4,114,165, + 0,0,0,114,82,0,0,0,114,166,0,0,0,114,96,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,150,0,0,0,245,2,0,0,115,12,0,0,0,12, - 3,12,1,4,1,6,255,12,2,255,128,122,29,66,117,105, - 108,116,105,110,73,109,112,111,114,116,101,114,46,99,114,101, - 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,16,0,0,0,116,0,116,1,106,2,124,1, - 131,2,1,0,100,1,83,0,41,2,122,22,69,120,101,99, + 0,218,11,102,105,110,100,95,109,111,100,117,108,101,240,2, + 0,0,115,6,0,0,0,12,9,18,1,255,128,122,27,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,0,0,0,0,0,2,0,0,0,4,0,0,0,67, + 0,0,0,115,46,0,0,0,124,1,106,0,116,1,106,2, + 118,1,114,34,116,3,100,1,160,4,124,1,106,0,161,1, + 124,1,106,0,100,2,141,2,130,1,116,5,116,6,106,7, + 124,1,131,2,83,0,41,4,122,24,67,114,101,97,116,101, 32,97,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,78,41,3,114,68,0,0,0,114,58,0,0,0,90, - 12,101,120,101,99,95,98,117,105,108,116,105,110,41,2,114, - 30,0,0,0,114,97,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,151,0,0,0,253,2,0, - 0,115,6,0,0,0,12,3,4,128,255,128,122,27,66,117, - 105,108,116,105,110,73,109,112,111,114,116,101,114,46,101,120, - 101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,57,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,100, - 111,32,110,111,116,32,104,97,118,101,32,99,111,100,101,32, - 111,98,106,101,99,116,115,46,78,114,10,0,0,0,169,2, - 114,165,0,0,0,114,82,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,8,103,101,116,95,99, - 111,100,101,2,3,0,0,115,4,0,0,0,4,4,255,128, - 122,24,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,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,56, - 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, - 100,111,32,110,111,116,32,104,97,118,101,32,115,111,117,114, - 99,101,32,99,111,100,101,46,78,114,10,0,0,0,114,170, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,10,103,101,116,95,115,111,117,114,99,101,8,3, - 0,0,115,4,0,0,0,4,4,255,128,122,26,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, - 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,3,122,52,82,101,116, - 117,114,110,32,70,97,108,115,101,32,97,115,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,115,32,97,114, - 101,32,110,101,118,101,114,32,112,97,99,107,97,103,101,115, - 46,70,78,114,10,0,0,0,114,170,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,116,0,0, - 0,14,3,0,0,115,4,0,0,0,4,4,255,128,122,26, - 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,41,2,78,78,41,1, - 78,41,18,114,1,0,0,0,114,0,0,0,0,114,2,0, - 0,0,114,3,0,0,0,114,139,0,0,0,218,12,115,116, - 97,116,105,99,109,101,116,104,111,100,114,100,0,0,0,218, - 11,99,108,97,115,115,109,101,116,104,111,100,114,168,0,0, - 0,114,169,0,0,0,114,150,0,0,0,114,151,0,0,0, - 114,87,0,0,0,114,171,0,0,0,114,172,0,0,0,114, - 116,0,0,0,114,98,0,0,0,114,156,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,161,0,0,0,204,2,0,0,115,48,0,0,0, - 8,0,4,2,4,7,2,2,10,1,2,8,12,1,2,8, - 12,1,2,11,10,1,2,7,10,1,2,4,2,1,12,1, - 2,4,2,1,12,1,2,4,2,1,12,1,12,4,255,128, - 114,161,0,0,0,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,64,0,0,0,115,144, - 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, - 2,90,4,101,5,100,3,100,4,132,0,131,1,90,6,101, - 7,100,22,100,6,100,7,132,1,131,1,90,8,101,7,100, - 23,100,8,100,9,132,1,131,1,90,9,101,7,100,10,100, - 11,132,0,131,1,90,10,101,5,100,12,100,13,132,0,131, - 1,90,11,101,7,100,14,100,15,132,0,131,1,90,12,101, - 7,101,13,100,16,100,17,132,0,131,1,131,1,90,14,101, - 7,101,13,100,18,100,19,132,0,131,1,131,1,90,15,101, - 7,101,13,100,20,100,21,132,0,131,1,131,1,90,16,100, - 5,83,0,41,24,218,14,70,114,111,122,101,110,73,109,112, - 111,114,116,101,114,122,142,77,101,116,97,32,112,97,116,104, - 32,105,109,112,111,114,116,32,102,111,114,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,115,46,10,10,32,32,32, - 32,65,108,108,32,109,101,116,104,111,100,115,32,97,114,101, - 32,101,105,116,104,101,114,32,99,108,97,115,115,32,111,114, - 32,115,116,97,116,105,99,32,109,101,116,104,111,100,115,32, - 116,111,32,97,118,111,105,100,32,116,104,101,32,110,101,101, - 100,32,116,111,10,32,32,32,32,105,110,115,116,97,110,116, - 105,97,116,101,32,116,104,101,32,99,108,97,115,115,46,10, - 10,32,32,32,32,90,6,102,114,111,122,101,110,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, - 0,0,67,0,0,0,115,16,0,0,0,100,1,160,0,124, - 0,106,1,116,2,106,3,161,2,83,0,41,3,114,162,0, - 0,0,114,154,0,0,0,78,41,4,114,46,0,0,0,114, - 1,0,0,0,114,175,0,0,0,114,139,0,0,0,41,1, - 218,1,109,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,100,0,0,0,34,3,0,0,115,4,0,0,0, - 16,7,255,128,122,26,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,4,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,5,0,0,0,67,0,0,0,115,30,0,0,0,116, - 0,160,1,124,1,161,1,114,26,116,2,124,1,124,0,124, - 0,106,3,100,1,141,3,83,0,100,0,83,0,114,163,0, - 0,0,41,4,114,58,0,0,0,114,89,0,0,0,114,92, - 0,0,0,114,139,0,0,0,114,164,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,168,0,0, - 0,43,3,0,0,115,8,0,0,0,10,2,16,1,4,2, - 255,128,122,24,70,114,111,122,101,110,73,109,112,111,114,116, - 101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, - 0,67,0,0,0,115,18,0,0,0,116,0,160,1,124,1, - 161,1,114,14,124,0,83,0,100,1,83,0,41,2,122,93, - 70,105,110,100,32,97,32,102,114,111,122,101,110,32,109,111, - 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, - 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,2, - 114,58,0,0,0,114,89,0,0,0,41,3,114,165,0,0, - 0,114,82,0,0,0,114,166,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,169,0,0,0,50, - 3,0,0,115,4,0,0,0,18,7,255,128,122,26,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,42,85,115, - 101,32,100,101,102,97,117,108,116,32,115,101,109,97,110,116, - 105,99,115,32,102,111,114,32,109,111,100,117,108,101,32,99, - 114,101,97,116,105,111,110,46,78,114,10,0,0,0,41,2, - 114,165,0,0,0,114,96,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,150,0,0,0,59,3, - 0,0,115,4,0,0,0,4,128,255,128,122,28,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,99,114,101,97, - 116,101,95,109,111,100,117,108,101,99,1,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, - 0,0,115,64,0,0,0,124,0,106,0,106,1,125,1,116, - 2,160,3,124,1,161,1,115,36,116,4,100,1,160,5,124, - 1,161,1,124,1,100,2,141,2,130,1,116,6,116,2,106, - 7,124,1,131,2,125,2,116,8,124,2,124,0,106,9,131, - 2,1,0,100,0,83,0,114,88,0,0,0,41,10,114,106, - 0,0,0,114,17,0,0,0,114,58,0,0,0,114,89,0, - 0,0,114,80,0,0,0,114,46,0,0,0,114,68,0,0, - 0,218,17,103,101,116,95,102,114,111,122,101,110,95,111,98, - 106,101,99,116,218,4,101,120,101,99,114,7,0,0,0,41, - 3,114,97,0,0,0,114,17,0,0,0,218,4,99,111,100, - 101,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,151,0,0,0,63,3,0,0,115,18,0,0,0,8,2, - 10,1,10,1,2,1,6,255,12,2,12,1,4,128,255,128, - 122,26,70,114,111,122,101,110,73,109,112,111,114,116,101,114, - 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, - 0,67,0,0,0,115,10,0,0,0,116,0,124,0,124,1, - 131,2,83,0,41,2,122,95,76,111,97,100,32,97,32,102, - 114,111,122,101,110,32,109,111,100,117,108,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,85,115,101,32,101,120,101,99,95,109,111,100,117, - 108,101,40,41,32,105,110,115,116,101,97,100,46,10,10,32, - 32,32,32,32,32,32,32,78,41,1,114,98,0,0,0,114, - 170,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,156,0,0,0,72,3,0,0,115,4,0,0, - 0,10,7,255,128,122,26,70,114,111,122,101,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,0,0,0,0,0,2,0, - 0,0,3,0,0,0,67,0,0,0,115,10,0,0,0,116, - 0,160,1,124,1,161,1,83,0,41,2,122,45,82,101,116, - 117,114,110,32,116,104,101,32,99,111,100,101,32,111,98,106, - 101,99,116,32,102,111,114,32,116,104,101,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,46,78,41,2,114,58,0, - 0,0,114,177,0,0,0,114,170,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,171,0,0,0, - 81,3,0,0,115,4,0,0,0,10,4,255,128,122,23,70, - 114,111,122,101,110,73,109,112,111,114,116,101,114,46,103,101, + 108,101,114,78,0,0,0,114,16,0,0,0,78,41,8,114, + 17,0,0,0,114,15,0,0,0,114,79,0,0,0,114,80, + 0,0,0,114,46,0,0,0,114,68,0,0,0,114,58,0, + 0,0,90,14,99,114,101,97,116,101,95,98,117,105,108,116, + 105,110,41,2,114,30,0,0,0,114,96,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,150,0, + 0,0,252,2,0,0,115,12,0,0,0,12,3,12,1,4, + 1,6,255,12,2,255,128,122,29,66,117,105,108,116,105,110, + 73,109,112,111,114,116,101,114,46,99,114,101,97,116,101,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 16,0,0,0,116,0,116,1,106,2,124,1,131,2,1,0, + 100,1,83,0,41,2,122,22,69,120,101,99,32,97,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,78,41, + 3,114,68,0,0,0,114,58,0,0,0,90,12,101,120,101, + 99,95,98,117,105,108,116,105,110,41,2,114,30,0,0,0, + 114,97,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,151,0,0,0,4,3,0,0,115,6,0, + 0,0,12,3,4,128,255,128,122,27,66,117,105,108,116,105, + 110,73,109,112,111,114,116,101,114,46,101,120,101,99,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,122,57,82,101,116,117,114, + 110,32,78,111,110,101,32,97,115,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,115,32,100,111,32,110,111, + 116,32,104,97,118,101,32,99,111,100,101,32,111,98,106,101, + 99,116,115,46,78,114,10,0,0,0,169,2,114,165,0,0, + 0,114,82,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,8,103,101,116,95,99,111,100,101,9, + 3,0,0,115,4,0,0,0,4,4,255,128,122,24,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,0, 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,2,122,54,82,101,116,117, - 114,110,32,78,111,110,101,32,97,115,32,102,114,111,122,101, - 110,32,109,111,100,117,108,101,115,32,100,111,32,110,111,116, - 32,104,97,118,101,32,115,111,117,114,99,101,32,99,111,100, - 101,46,78,114,10,0,0,0,114,170,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,172,0,0, - 0,87,3,0,0,115,4,0,0,0,4,4,255,128,122,25, - 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,0,0,0,0,2,0,0,0,3,0,0,0,67,0, - 0,0,115,10,0,0,0,116,0,160,1,124,1,161,1,83, - 0,41,2,122,46,82,101,116,117,114,110,32,84,114,117,101, - 32,105,102,32,116,104,101,32,102,114,111,122,101,110,32,109, - 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, - 103,101,46,78,41,2,114,58,0,0,0,90,17,105,115,95, - 102,114,111,122,101,110,95,112,97,99,107,97,103,101,114,170, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,116,0,0,0,93,3,0,0,115,4,0,0,0, - 10,4,255,128,122,25,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,41, - 2,78,78,41,1,78,41,17,114,1,0,0,0,114,0,0, - 0,0,114,2,0,0,0,114,3,0,0,0,114,139,0,0, - 0,114,173,0,0,0,114,100,0,0,0,114,174,0,0,0, - 114,168,0,0,0,114,169,0,0,0,114,150,0,0,0,114, - 151,0,0,0,114,156,0,0,0,114,91,0,0,0,114,171, - 0,0,0,114,172,0,0,0,114,116,0,0,0,114,10,0, + 4,0,0,0,100,1,83,0,41,2,122,56,82,101,116,117, + 114,110,32,78,111,110,101,32,97,115,32,98,117,105,108,116, + 45,105,110,32,109,111,100,117,108,101,115,32,100,111,32,110, + 111,116,32,104,97,118,101,32,115,111,117,114,99,101,32,99, + 111,100,101,46,78,114,10,0,0,0,114,170,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,10, + 103,101,116,95,115,111,117,114,99,101,15,3,0,0,115,4, + 0,0,0,4,4,255,128,122,26,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,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,3,122,52,82,101,116,117,114,110,32, + 70,97,108,115,101,32,97,115,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,115,32,97,114,101,32,110,101, + 118,101,114,32,112,97,99,107,97,103,101,115,46,70,78,114, + 10,0,0,0,114,170,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,116,0,0,0,21,3,0, + 0,115,4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41,18,114, + 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, + 0,0,0,114,139,0,0,0,218,12,115,116,97,116,105,99, + 109,101,116,104,111,100,114,100,0,0,0,218,11,99,108,97, + 115,115,109,101,116,104,111,100,114,168,0,0,0,114,169,0, + 0,0,114,150,0,0,0,114,151,0,0,0,114,87,0,0, + 0,114,171,0,0,0,114,172,0,0,0,114,116,0,0,0, + 114,98,0,0,0,114,156,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,161, + 0,0,0,211,2,0,0,115,48,0,0,0,8,0,4,2, + 4,7,2,2,10,1,2,8,12,1,2,8,12,1,2,11, + 10,1,2,7,10,1,2,4,2,1,12,1,2,4,2,1, + 12,1,2,4,2,1,12,1,12,4,255,128,114,161,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,64,0,0,0,115,144,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,101, + 5,100,3,100,4,132,0,131,1,90,6,101,7,100,22,100, + 6,100,7,132,1,131,1,90,8,101,7,100,23,100,8,100, + 9,132,1,131,1,90,9,101,7,100,10,100,11,132,0,131, + 1,90,10,101,5,100,12,100,13,132,0,131,1,90,11,101, + 7,100,14,100,15,132,0,131,1,90,12,101,7,101,13,100, + 16,100,17,132,0,131,1,131,1,90,14,101,7,101,13,100, + 18,100,19,132,0,131,1,131,1,90,15,101,7,101,13,100, + 20,100,21,132,0,131,1,131,1,90,16,100,5,83,0,41, + 24,218,14,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,122,142,77,101,116,97,32,112,97,116,104,32,105,109,112, + 111,114,116,32,102,111,114,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, + 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, + 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, + 116,105,99,32,109,101,116,104,111,100,115,32,116,111,32,97, + 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, + 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, + 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, + 32,90,6,102,114,111,122,101,110,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,4,0,0,0,67,0, + 0,0,115,16,0,0,0,100,1,160,0,124,0,106,1,116, + 2,106,3,161,2,83,0,41,3,114,162,0,0,0,114,154, + 0,0,0,78,41,4,114,46,0,0,0,114,1,0,0,0, + 114,175,0,0,0,114,139,0,0,0,41,1,218,1,109,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,100, + 0,0,0,41,3,0,0,115,4,0,0,0,16,7,255,128, + 122,26,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,4,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, + 0,0,67,0,0,0,115,30,0,0,0,116,0,160,1,124, + 1,161,1,114,26,116,2,124,1,124,0,124,0,106,3,100, + 1,141,3,83,0,100,0,83,0,114,163,0,0,0,41,4, + 114,58,0,0,0,114,89,0,0,0,114,92,0,0,0,114, + 139,0,0,0,114,164,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,168,0,0,0,50,3,0, + 0,115,8,0,0,0,10,2,16,1,4,2,255,128,122,24, + 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,102, + 105,110,100,95,115,112,101,99,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, + 0,115,18,0,0,0,116,0,160,1,124,1,161,1,114,14, + 124,0,83,0,100,1,83,0,41,2,122,93,70,105,110,100, + 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101, + 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,102,105,110,100,95, + 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, + 10,32,32,32,32,32,32,32,32,78,41,2,114,58,0,0, + 0,114,89,0,0,0,41,3,114,165,0,0,0,114,82,0, + 0,0,114,166,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,169,0,0,0,57,3,0,0,115, + 4,0,0,0,18,7,255,128,122,26,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,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,41,2,122,42,85,115,101,32,100,101, + 102,97,117,108,116,32,115,101,109,97,110,116,105,99,115,32, + 102,111,114,32,109,111,100,117,108,101,32,99,114,101,97,116, + 105,111,110,46,78,114,10,0,0,0,41,2,114,165,0,0, + 0,114,96,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,150,0,0,0,66,3,0,0,115,4, + 0,0,0,4,128,255,128,122,28,70,114,111,122,101,110,73, + 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, + 111,100,117,108,101,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,64, + 0,0,0,124,0,106,0,106,1,125,1,116,2,160,3,124, + 1,161,1,115,36,116,4,100,1,160,5,124,1,161,1,124, + 1,100,2,141,2,130,1,116,6,116,2,106,7,124,1,131, + 2,125,2,116,8,124,2,124,0,106,9,131,2,1,0,100, + 0,83,0,114,88,0,0,0,41,10,114,106,0,0,0,114, + 17,0,0,0,114,58,0,0,0,114,89,0,0,0,114,80, + 0,0,0,114,46,0,0,0,114,68,0,0,0,218,17,103, + 101,116,95,102,114,111,122,101,110,95,111,98,106,101,99,116, + 218,4,101,120,101,99,114,7,0,0,0,41,3,114,97,0, + 0,0,114,17,0,0,0,218,4,99,111,100,101,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,151,0,0, + 0,70,3,0,0,115,18,0,0,0,8,2,10,1,10,1, + 2,1,6,255,12,2,12,1,4,128,255,128,122,26,70,114, + 111,122,101,110,73,109,112,111,114,116,101,114,46,101,120,101, + 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,10,0,0,0,116,0,124,0,124,1,131,2,83,0, + 41,2,122,95,76,111,97,100,32,97,32,102,114,111,122,101, + 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,101,120,101,99,95,109,111,100,117,108,101,40,41, + 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, + 32,32,32,78,41,1,114,98,0,0,0,114,170,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 156,0,0,0,79,3,0,0,115,4,0,0,0,10,7,255, + 128,122,26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, + 1,161,1,83,0,41,2,122,45,82,101,116,117,114,110,32, + 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, + 102,111,114,32,116,104,101,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,46,78,41,2,114,58,0,0,0,114,177, + 0,0,0,114,170,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,171,0,0,0,88,3,0,0, + 115,4,0,0,0,10,4,255,128,122,23,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,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,41,2,122,54,82,101,116,117,114,110,32,78, + 111,110,101,32,97,115,32,102,114,111,122,101,110,32,109,111, + 100,117,108,101,115,32,100,111,32,110,111,116,32,104,97,118, + 101,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114, + 10,0,0,0,114,170,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,172,0,0,0,94,3,0, + 0,115,4,0,0,0,4,4,255,128,122,25,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,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, + 0,0,0,116,0,160,1,124,1,161,1,83,0,41,2,122, + 46,82,101,116,117,114,110,32,84,114,117,101,32,105,102,32, + 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,78, + 41,2,114,58,0,0,0,90,17,105,115,95,102,114,111,122, + 101,110,95,112,97,99,107,97,103,101,114,170,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,116, + 0,0,0,100,3,0,0,115,4,0,0,0,10,4,255,128, + 122,25,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,41,2,78,78,41, + 1,78,41,17,114,1,0,0,0,114,0,0,0,0,114,2, + 0,0,0,114,3,0,0,0,114,139,0,0,0,114,173,0, + 0,0,114,100,0,0,0,114,174,0,0,0,114,168,0,0, + 0,114,169,0,0,0,114,150,0,0,0,114,151,0,0,0, + 114,156,0,0,0,114,91,0,0,0,114,171,0,0,0,114, + 172,0,0,0,114,116,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,175,0, + 0,0,30,3,0,0,115,50,0,0,0,8,0,4,2,4, + 7,2,2,10,1,2,8,12,1,2,6,12,1,2,8,10, + 1,2,3,10,1,2,8,10,1,2,8,2,1,12,1,2, + 4,2,1,12,1,2,4,2,1,16,1,255,128,114,175,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,64,0,0,0,115,32,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, + 132,0,90,4,100,4,100,5,132,0,90,5,100,6,83,0, + 41,7,218,18,95,73,109,112,111,114,116,76,111,99,107,67, + 111,110,116,101,120,116,122,36,67,111,110,116,101,120,116,32, + 109,97,110,97,103,101,114,32,102,111,114,32,116,104,101,32, + 105,109,112,111,114,116,32,108,111,99,107,46,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, + 0,67,0,0,0,115,12,0,0,0,116,0,160,1,161,0, + 1,0,100,1,83,0,41,2,122,24,65,99,113,117,105,114, + 101,32,116,104,101,32,105,109,112,111,114,116,32,108,111,99, + 107,46,78,41,2,114,58,0,0,0,114,59,0,0,0,114, + 48,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,55,0,0,0,113,3,0,0,115,6,0,0, + 0,8,2,4,128,255,128,122,28,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,0,0, + 0,0,4,0,0,0,2,0,0,0,67,0,0,0,115,12, + 0,0,0,116,0,160,1,161,0,1,0,100,1,83,0,41, + 2,122,60,82,101,108,101,97,115,101,32,116,104,101,32,105, + 109,112,111,114,116,32,108,111,99,107,32,114,101,103,97,114, + 100,108,101,115,115,32,111,102,32,97,110,121,32,114,97,105, + 115,101,100,32,101,120,99,101,112,116,105,111,110,115,46,78, + 41,2,114,58,0,0,0,114,61,0,0,0,41,4,114,30, + 0,0,0,218,8,101,120,99,95,116,121,112,101,218,9,101, + 120,99,95,118,97,108,117,101,218,13,101,120,99,95,116,114, + 97,99,101,98,97,99,107,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,57,0,0,0,117,3,0,0,115, + 6,0,0,0,8,2,4,128,255,128,122,27,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,41,6,114,1,0,0,0,114, + 0,0,0,0,114,2,0,0,0,114,3,0,0,0,114,55, + 0,0,0,114,57,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,180,0,0, + 0,109,3,0,0,115,10,0,0,0,8,0,4,2,8,2, + 12,4,255,128,114,180,0,0,0,99,3,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, + 0,0,115,64,0,0,0,124,1,160,0,100,1,124,2,100, + 2,24,0,161,2,125,3,116,1,124,3,131,1,124,2,107, + 0,114,36,116,2,100,3,131,1,130,1,124,3,100,4,25, + 0,125,4,124,0,114,60,100,5,160,3,124,4,124,0,161, + 2,83,0,124,4,83,0,41,7,122,50,82,101,115,111,108, + 118,101,32,97,32,114,101,108,97,116,105,118,101,32,109,111, + 100,117,108,101,32,110,97,109,101,32,116,111,32,97,110,32, + 97,98,115,111,108,117,116,101,32,111,110,101,46,114,129,0, + 0,0,114,39,0,0,0,122,50,97,116,116,101,109,112,116, + 101,100,32,114,101,108,97,116,105,118,101,32,105,109,112,111, + 114,116,32,98,101,121,111,110,100,32,116,111,112,45,108,101, + 118,101,108,32,112,97,99,107,97,103,101,114,22,0,0,0, + 250,5,123,125,46,123,125,78,41,4,218,6,114,115,112,108, + 105,116,218,3,108,101,110,114,80,0,0,0,114,46,0,0, + 0,41,5,114,17,0,0,0,218,7,112,97,99,107,97,103, + 101,218,5,108,101,118,101,108,90,4,98,105,116,115,90,4, + 98,97,115,101,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,13,95,114,101,115,111,108,118,101,95,110,97, + 109,101,122,3,0,0,115,12,0,0,0,16,2,12,1,8, + 1,8,1,20,1,255,128,114,189,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, + 0,67,0,0,0,115,34,0,0,0,124,0,160,0,124,1, + 124,2,161,2,125,3,124,3,100,0,117,0,114,24,100,0, + 83,0,116,1,124,1,124,3,131,2,83,0,114,13,0,0, + 0,41,2,114,169,0,0,0,114,92,0,0,0,41,4,218, + 6,102,105,110,100,101,114,114,17,0,0,0,114,166,0,0, + 0,114,110,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,17,95,102,105,110,100,95,115,112,101, + 99,95,108,101,103,97,99,121,131,3,0,0,115,10,0,0, + 0,12,3,8,1,4,1,10,1,255,128,114,191,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,10,0,0, + 0,10,0,0,0,67,0,0,0,115,28,1,0,0,116,0, + 106,1,125,3,124,3,100,1,117,0,114,22,116,2,100,2, + 131,1,130,1,124,3,115,38,116,3,160,4,100,3,116,5, + 161,2,1,0,124,0,116,0,106,6,118,0,125,4,124,3, + 68,0,93,226,125,5,116,7,131,0,143,94,1,0,122,10, + 124,5,106,8,125,6,87,0,110,54,4,0,116,9,121,128, + 1,0,1,0,1,0,116,10,124,5,124,0,124,1,131,3, + 125,7,124,7,100,1,117,0,114,124,89,0,87,0,100,1, + 4,0,4,0,131,3,1,0,113,52,89,0,110,14,48,0, + 124,6,124,0,124,1,124,2,131,3,125,7,87,0,100,1, + 4,0,4,0,131,3,1,0,110,16,49,0,115,162,48,0, + 1,0,1,0,1,0,89,0,1,0,124,7,100,1,117,1, + 114,52,124,4,144,1,115,16,124,0,116,0,106,6,118,0, + 144,1,114,16,116,0,106,6,124,0,25,0,125,8,122,10, + 124,8,106,11,125,9,87,0,110,26,4,0,116,9,121,244, + 1,0,1,0,1,0,124,7,6,0,89,0,2,0,1,0, + 83,0,48,0,124,9,100,1,117,0,144,1,114,8,124,7, + 2,0,1,0,83,0,124,9,2,0,1,0,83,0,124,7, + 2,0,1,0,83,0,100,1,83,0,41,4,122,21,70,105, + 110,100,32,97,32,109,111,100,117,108,101,39,115,32,115,112, + 101,99,46,78,122,53,115,121,115,46,109,101,116,97,95,112, + 97,116,104,32,105,115,32,78,111,110,101,44,32,80,121,116, + 104,111,110,32,105,115,32,108,105,107,101,108,121,32,115,104, + 117,116,116,105,110,103,32,100,111,119,110,122,22,115,121,115, + 46,109,101,116,97,95,112,97,116,104,32,105,115,32,101,109, + 112,116,121,41,12,114,15,0,0,0,218,9,109,101,116,97, + 95,112,97,116,104,114,80,0,0,0,218,9,95,119,97,114, + 110,105,110,103,115,218,4,119,97,114,110,218,13,73,109,112, + 111,114,116,87,97,114,110,105,110,103,114,93,0,0,0,114, + 180,0,0,0,114,168,0,0,0,114,107,0,0,0,114,191, + 0,0,0,114,106,0,0,0,41,10,114,17,0,0,0,114, + 166,0,0,0,114,167,0,0,0,114,192,0,0,0,90,9, + 105,115,95,114,101,108,111,97,100,114,190,0,0,0,114,168, + 0,0,0,114,96,0,0,0,114,97,0,0,0,114,106,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,175,0,0,0,23,3,0,0,115,50,0,0,0,8, - 0,4,2,4,7,2,2,10,1,2,8,12,1,2,6,12, - 1,2,8,10,1,2,3,10,1,2,8,10,1,2,8,2, - 1,12,1,2,4,2,1,12,1,2,4,2,1,16,1,255, - 128,114,175,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, - 32,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,83,0,41,7,218,18,95,73,109,112,111,114,116,76, - 111,99,107,67,111,110,116,101,120,116,122,36,67,111,110,116, - 101,120,116,32,109,97,110,97,103,101,114,32,102,111,114,32, - 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,2,0,0,0,67,0,0,0,115,12,0,0,0,116,0, - 160,1,161,0,1,0,100,1,83,0,41,2,122,24,65,99, - 113,117,105,114,101,32,116,104,101,32,105,109,112,111,114,116, - 32,108,111,99,107,46,78,41,2,114,58,0,0,0,114,59, - 0,0,0,114,48,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,55,0,0,0,106,3,0,0, - 115,6,0,0,0,8,2,4,128,255,128,122,28,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,0,0,0,0,4,0,0,0,2,0,0,0,67,0, - 0,0,115,12,0,0,0,116,0,160,1,161,0,1,0,100, - 1,83,0,41,2,122,60,82,101,108,101,97,115,101,32,116, - 104,101,32,105,109,112,111,114,116,32,108,111,99,107,32,114, - 101,103,97,114,100,108,101,115,115,32,111,102,32,97,110,121, - 32,114,97,105,115,101,100,32,101,120,99,101,112,116,105,111, - 110,115,46,78,41,2,114,58,0,0,0,114,61,0,0,0, - 41,4,114,30,0,0,0,218,8,101,120,99,95,116,121,112, - 101,218,9,101,120,99,95,118,97,108,117,101,218,13,101,120, - 99,95,116,114,97,99,101,98,97,99,107,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,57,0,0,0,110, - 3,0,0,115,6,0,0,0,8,2,4,128,255,128,122,27, - 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,41,6,114,1, - 0,0,0,114,0,0,0,0,114,2,0,0,0,114,3,0, - 0,0,114,55,0,0,0,114,57,0,0,0,114,10,0,0, + 0,218,10,95,102,105,110,100,95,115,112,101,99,140,3,0, + 0,115,56,0,0,0,6,2,8,1,8,2,4,3,12,1, + 10,5,8,1,8,1,2,1,10,1,12,1,12,1,8,1, + 22,1,42,2,8,1,18,2,10,1,2,1,10,1,12,1, + 14,4,10,2,8,1,8,2,8,2,4,2,255,128,114,196, + 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,5,0,0,0,67,0,0,0,115,106,0,0, + 0,116,0,124,0,116,1,131,2,115,28,116,2,100,1,160, + 3,116,4,124,0,131,1,161,1,131,1,130,1,124,2,100, + 2,107,0,114,44,116,5,100,3,131,1,130,1,124,2,100, + 2,107,4,114,82,116,0,124,1,116,1,131,2,115,70,116, + 2,100,4,131,1,130,1,124,1,115,82,116,6,100,5,131, + 1,130,1,124,0,115,102,124,2,100,2,107,2,114,102,116, + 5,100,6,131,1,130,1,100,7,83,0,41,8,122,28,86, + 101,114,105,102,121,32,97,114,103,117,109,101,110,116,115,32, + 97,114,101,32,34,115,97,110,101,34,46,122,31,109,111,100, + 117,108,101,32,110,97,109,101,32,109,117,115,116,32,98,101, + 32,115,116,114,44,32,110,111,116,32,123,125,114,22,0,0, + 0,122,18,108,101,118,101,108,32,109,117,115,116,32,98,101, + 32,62,61,32,48,122,31,95,95,112,97,99,107,97,103,101, + 95,95,32,110,111,116,32,115,101,116,32,116,111,32,97,32, + 115,116,114,105,110,103,122,54,97,116,116,101,109,112,116,101, + 100,32,114,101,108,97,116,105,118,101,32,105,109,112,111,114, + 116,32,119,105,116,104,32,110,111,32,107,110,111,119,110,32, + 112,97,114,101,110,116,32,112,97,99,107,97,103,101,122,17, + 69,109,112,116,121,32,109,111,100,117,108,101,32,110,97,109, + 101,78,41,7,218,10,105,115,105,110,115,116,97,110,99,101, + 218,3,115,116,114,218,9,84,121,112,101,69,114,114,111,114, + 114,46,0,0,0,114,14,0,0,0,218,10,86,97,108,117, + 101,69,114,114,111,114,114,80,0,0,0,169,3,114,17,0, + 0,0,114,187,0,0,0,114,188,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,13,95,115,97, + 110,105,116,121,95,99,104,101,99,107,187,3,0,0,115,26, + 0,0,0,10,2,18,1,8,1,8,1,8,1,10,1,8, + 1,4,1,8,1,12,2,8,1,4,128,255,128,114,202,0, + 0,0,122,16,78,111,32,109,111,100,117,108,101,32,110,97, + 109,101,100,32,122,4,123,33,114,125,99,2,0,0,0,0, + 0,0,0,0,0,0,0,9,0,0,0,8,0,0,0,67, + 0,0,0,115,20,1,0,0,100,0,125,2,124,0,160,0, + 100,1,161,1,100,2,25,0,125,3,124,3,114,128,124,3, + 116,1,106,2,118,1,114,42,116,3,124,1,124,3,131,2, + 1,0,124,0,116,1,106,2,118,0,114,62,116,1,106,2, + 124,0,25,0,83,0,116,1,106,2,124,3,25,0,125,4, + 122,10,124,4,106,4,125,2,87,0,110,44,4,0,116,5, + 121,126,1,0,1,0,1,0,116,6,100,3,23,0,160,7, + 124,0,124,3,161,2,125,5,116,8,124,5,124,0,100,4, + 141,2,100,0,130,2,48,0,116,9,124,0,124,2,131,2, + 125,6,124,6,100,0,117,0,114,164,116,8,116,6,160,7, + 124,0,161,1,124,0,100,4,141,2,130,1,116,10,124,6, + 131,1,125,7,124,3,144,1,114,16,116,1,106,2,124,3, + 25,0,125,4,124,0,160,0,100,1,161,1,100,5,25,0, + 125,8,122,18,116,11,124,4,124,8,124,7,131,3,1,0, + 87,0,124,7,83,0,4,0,116,5,144,1,121,14,1,0, + 1,0,1,0,100,6,124,3,155,2,100,7,124,8,155,2, + 157,4,125,5,116,12,160,13,124,5,116,14,161,2,1,0, + 89,0,124,7,83,0,48,0,124,7,83,0,41,8,78,114, + 129,0,0,0,114,22,0,0,0,122,23,59,32,123,33,114, + 125,32,105,115,32,110,111,116,32,97,32,112,97,99,107,97, + 103,101,114,16,0,0,0,233,2,0,0,0,122,27,67,97, + 110,110,111,116,32,115,101,116,32,97,110,32,97,116,116,114, + 105,98,117,116,101,32,111,110,32,122,18,32,102,111,114,32, + 99,104,105,108,100,32,109,111,100,117,108,101,32,41,15,114, + 130,0,0,0,114,15,0,0,0,114,93,0,0,0,114,68, + 0,0,0,114,142,0,0,0,114,107,0,0,0,218,8,95, + 69,82,82,95,77,83,71,114,46,0,0,0,218,19,77,111, + 100,117,108,101,78,111,116,70,111,117,110,100,69,114,114,111, + 114,114,196,0,0,0,114,160,0,0,0,114,5,0,0,0, + 114,193,0,0,0,114,194,0,0,0,114,195,0,0,0,41, + 9,114,17,0,0,0,218,7,105,109,112,111,114,116,95,114, + 166,0,0,0,114,131,0,0,0,90,13,112,97,114,101,110, + 116,95,109,111,100,117,108,101,114,158,0,0,0,114,96,0, + 0,0,114,97,0,0,0,90,5,99,104,105,108,100,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,23,95, + 102,105,110,100,95,97,110,100,95,108,111,97,100,95,117,110, + 108,111,99,107,101,100,206,3,0,0,115,60,0,0,0,4, + 1,14,1,4,1,10,1,10,1,10,2,10,1,10,1,2, + 1,10,1,12,1,16,1,16,1,10,1,8,1,18,1,8, + 2,6,1,10,2,14,1,2,1,14,1,4,4,14,253,16, + 1,14,1,4,1,2,255,4,1,255,128,114,207,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,8,0,0,0,67,0,0,0,115,128,0,0,0,116,0, + 124,0,131,1,143,62,1,0,116,1,106,2,160,3,124,0, + 116,4,161,2,125,2,124,2,116,4,117,0,114,56,116,5, + 124,0,124,1,131,2,87,0,2,0,100,1,4,0,4,0, + 131,3,1,0,83,0,87,0,100,1,4,0,4,0,131,3, + 1,0,110,16,49,0,115,76,48,0,1,0,1,0,1,0, + 89,0,1,0,124,2,100,1,117,0,114,116,100,2,160,6, + 124,0,161,1,125,3,116,7,124,3,124,0,100,3,141,2, + 130,1,116,8,124,0,131,1,1,0,124,2,83,0,41,4, + 122,25,70,105,110,100,32,97,110,100,32,108,111,97,100,32, + 116,104,101,32,109,111,100,117,108,101,46,78,122,40,105,109, + 112,111,114,116,32,111,102,32,123,125,32,104,97,108,116,101, + 100,59,32,78,111,110,101,32,105,110,32,115,121,115,46,109, + 111,100,117,108,101,115,114,16,0,0,0,41,9,114,51,0, + 0,0,114,15,0,0,0,114,93,0,0,0,114,35,0,0, + 0,218,14,95,78,69,69,68,83,95,76,79,65,68,73,78, + 71,114,207,0,0,0,114,46,0,0,0,114,205,0,0,0, + 114,66,0,0,0,41,4,114,17,0,0,0,114,206,0,0, + 0,114,97,0,0,0,114,76,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,14,95,102,105,110, + 100,95,97,110,100,95,108,111,97,100,241,3,0,0,115,24, + 0,0,0,10,2,14,1,8,1,54,1,8,2,4,1,2, + 1,4,255,12,2,8,2,4,1,255,128,114,209,0,0,0, + 114,22,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,42, + 0,0,0,116,0,124,0,124,1,124,2,131,3,1,0,124, + 2,100,1,107,4,114,32,116,1,124,0,124,1,124,2,131, + 3,125,0,116,2,124,0,116,3,131,2,83,0,41,3,97, + 50,1,0,0,73,109,112,111,114,116,32,97,110,100,32,114, + 101,116,117,114,110,32,116,104,101,32,109,111,100,117,108,101, + 32,98,97,115,101,100,32,111,110,32,105,116,115,32,110,97, + 109,101,44,32,116,104,101,32,112,97,99,107,97,103,101,32, + 116,104,101,32,99,97,108,108,32,105,115,10,32,32,32,32, + 98,101,105,110,103,32,109,97,100,101,32,102,114,111,109,44, + 32,97,110,100,32,116,104,101,32,108,101,118,101,108,32,97, + 100,106,117,115,116,109,101,110,116,46,10,10,32,32,32,32, + 84,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101, + 112,114,101,115,101,110,116,115,32,116,104,101,32,103,114,101, + 97,116,101,115,116,32,99,111,109,109,111,110,32,100,101,110, + 111,109,105,110,97,116,111,114,32,111,102,32,102,117,110,99, + 116,105,111,110,97,108,105,116,121,10,32,32,32,32,98,101, + 116,119,101,101,110,32,105,109,112,111,114,116,95,109,111,100, + 117,108,101,32,97,110,100,32,95,95,105,109,112,111,114,116, + 95,95,46,32,84,104,105,115,32,105,110,99,108,117,100,101, + 115,32,115,101,116,116,105,110,103,32,95,95,112,97,99,107, + 97,103,101,95,95,32,105,102,10,32,32,32,32,116,104,101, + 32,108,111,97,100,101,114,32,100,105,100,32,110,111,116,46, + 10,10,32,32,32,32,114,22,0,0,0,78,41,4,114,202, + 0,0,0,114,189,0,0,0,114,209,0,0,0,218,11,95, + 103,99,100,95,105,109,112,111,114,116,114,201,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,210, + 0,0,0,1,4,0,0,115,10,0,0,0,12,9,8,1, + 12,1,10,1,255,128,114,210,0,0,0,169,1,218,9,114, + 101,99,117,114,115,105,118,101,99,3,0,0,0,0,0,0, + 0,1,0,0,0,8,0,0,0,11,0,0,0,67,0,0, + 0,115,216,0,0,0,124,1,68,0,93,206,125,4,116,0, + 124,4,116,1,131,2,115,64,124,3,114,34,124,0,106,2, + 100,1,23,0,125,5,110,4,100,2,125,5,116,3,100,3, + 124,5,155,0,100,4,116,4,124,4,131,1,106,2,155,0, + 157,4,131,1,130,1,124,4,100,5,107,2,114,106,124,3, + 115,4,116,5,124,0,100,6,131,2,114,4,116,6,124,0, + 124,0,106,7,124,2,100,7,100,8,141,4,1,0,113,4, + 116,5,124,0,124,4,131,2,115,4,100,9,160,8,124,0, + 106,2,124,4,161,2,125,6,122,14,116,9,124,2,124,6, + 131,2,1,0,87,0,113,4,4,0,116,10,121,210,1,0, + 125,7,1,0,122,42,124,7,106,11,124,6,107,2,114,200, + 116,12,106,13,160,14,124,6,116,15,161,2,100,10,117,1, + 114,200,87,0,89,0,100,10,125,7,126,7,113,4,130,0, + 100,10,125,7,126,7,48,0,48,0,124,0,83,0,41,11, + 122,238,70,105,103,117,114,101,32,111,117,116,32,119,104,97, + 116,32,95,95,105,109,112,111,114,116,95,95,32,115,104,111, + 117,108,100,32,114,101,116,117,114,110,46,10,10,32,32,32, + 32,84,104,101,32,105,109,112,111,114,116,95,32,112,97,114, + 97,109,101,116,101,114,32,105,115,32,97,32,99,97,108,108, + 97,98,108,101,32,119,104,105,99,104,32,116,97,107,101,115, + 32,116,104,101,32,110,97,109,101,32,111,102,32,109,111,100, + 117,108,101,32,116,111,10,32,32,32,32,105,109,112,111,114, + 116,46,32,73,116,32,105,115,32,114,101,113,117,105,114,101, + 100,32,116,111,32,100,101,99,111,117,112,108,101,32,116,104, + 101,32,102,117,110,99,116,105,111,110,32,102,114,111,109,32, + 97,115,115,117,109,105,110,103,32,105,109,112,111,114,116,108, + 105,98,39,115,10,32,32,32,32,105,109,112,111,114,116,32, + 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,105, + 115,32,100,101,115,105,114,101,100,46,10,10,32,32,32,32, + 122,8,46,95,95,97,108,108,95,95,122,13,96,96,102,114, + 111,109,32,108,105,115,116,39,39,122,8,73,116,101,109,32, + 105,110,32,122,18,32,109,117,115,116,32,98,101,32,115,116, + 114,44,32,110,111,116,32,250,1,42,218,7,95,95,97,108, + 108,95,95,84,114,211,0,0,0,114,184,0,0,0,78,41, + 16,114,197,0,0,0,114,198,0,0,0,114,1,0,0,0, + 114,199,0,0,0,114,14,0,0,0,114,4,0,0,0,218, + 16,95,104,97,110,100,108,101,95,102,114,111,109,108,105,115, + 116,114,214,0,0,0,114,46,0,0,0,114,68,0,0,0, + 114,205,0,0,0,114,17,0,0,0,114,15,0,0,0,114, + 93,0,0,0,114,35,0,0,0,114,208,0,0,0,41,8, + 114,97,0,0,0,218,8,102,114,111,109,108,105,115,116,114, + 206,0,0,0,114,212,0,0,0,218,1,120,90,5,119,104, + 101,114,101,90,9,102,114,111,109,95,110,97,109,101,90,3, + 101,120,99,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,215,0,0,0,16,4,0,0,115,52,0,0,0, + 8,10,10,1,4,1,12,1,4,2,10,1,8,1,8,255, + 8,2,14,1,10,1,2,1,8,255,10,2,14,1,2,1, + 14,1,14,1,10,4,16,1,2,255,12,2,2,1,10,128, + 4,1,255,128,114,215,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,6,0,0,0,67,0, + 0,0,115,146,0,0,0,124,0,160,0,100,1,161,1,125, + 1,124,0,160,0,100,2,161,1,125,2,124,1,100,3,117, + 1,114,82,124,2,100,3,117,1,114,78,124,1,124,2,106, + 1,107,3,114,78,116,2,106,3,100,4,124,1,155,2,100, + 5,124,2,106,1,155,2,100,6,157,5,116,4,100,7,100, + 8,141,3,1,0,124,1,83,0,124,2,100,3,117,1,114, + 96,124,2,106,1,83,0,116,2,106,3,100,9,116,4,100, + 7,100,8,141,3,1,0,124,0,100,10,25,0,125,1,100, + 11,124,0,118,1,114,142,124,1,160,5,100,12,161,1,100, + 13,25,0,125,1,124,1,83,0,41,14,122,167,67,97,108, + 99,117,108,97,116,101,32,119,104,97,116,32,95,95,112,97, + 99,107,97,103,101,95,95,32,115,104,111,117,108,100,32,98, + 101,46,10,10,32,32,32,32,95,95,112,97,99,107,97,103, + 101,95,95,32,105,115,32,110,111,116,32,103,117,97,114,97, + 110,116,101,101,100,32,116,111,32,98,101,32,100,101,102,105, + 110,101,100,32,111,114,32,99,111,117,108,100,32,98,101,32, + 115,101,116,32,116,111,32,78,111,110,101,10,32,32,32,32, + 116,111,32,114,101,112,114,101,115,101,110,116,32,116,104,97, + 116,32,105,116,115,32,112,114,111,112,101,114,32,118,97,108, + 117,101,32,105,115,32,117,110,107,110,111,119,110,46,10,10, + 32,32,32,32,114,146,0,0,0,114,106,0,0,0,78,122, + 32,95,95,112,97,99,107,97,103,101,95,95,32,33,61,32, + 95,95,115,112,101,99,95,95,46,112,97,114,101,110,116,32, + 40,122,4,32,33,61,32,250,1,41,233,3,0,0,0,41, + 1,90,10,115,116,97,99,107,108,101,118,101,108,122,89,99, + 97,110,39,116,32,114,101,115,111,108,118,101,32,112,97,99, + 107,97,103,101,32,102,114,111,109,32,95,95,115,112,101,99, + 95,95,32,111,114,32,95,95,112,97,99,107,97,103,101,95, + 95,44,32,102,97,108,108,105,110,103,32,98,97,99,107,32, + 111,110,32,95,95,110,97,109,101,95,95,32,97,110,100,32, + 95,95,112,97,116,104,95,95,114,1,0,0,0,114,142,0, + 0,0,114,129,0,0,0,114,22,0,0,0,41,6,114,35, + 0,0,0,114,131,0,0,0,114,193,0,0,0,114,194,0, + 0,0,114,195,0,0,0,114,130,0,0,0,41,3,218,7, + 103,108,111,98,97,108,115,114,187,0,0,0,114,96,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,180,0,0,0,102,3,0,0,115,10,0,0,0,8,0, - 4,2,8,2,12,4,255,128,114,180,0,0,0,99,3,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, - 0,0,67,0,0,0,115,64,0,0,0,124,1,160,0,100, - 1,124,2,100,2,24,0,161,2,125,3,116,1,124,3,131, - 1,124,2,107,0,114,36,116,2,100,3,131,1,130,1,124, - 3,100,4,25,0,125,4,124,0,114,60,100,5,160,3,124, - 4,124,0,161,2,83,0,124,4,83,0,41,7,122,50,82, - 101,115,111,108,118,101,32,97,32,114,101,108,97,116,105,118, - 101,32,109,111,100,117,108,101,32,110,97,109,101,32,116,111, - 32,97,110,32,97,98,115,111,108,117,116,101,32,111,110,101, - 46,114,129,0,0,0,114,39,0,0,0,122,50,97,116,116, - 101,109,112,116,101,100,32,114,101,108,97,116,105,118,101,32, - 105,109,112,111,114,116,32,98,101,121,111,110,100,32,116,111, - 112,45,108,101,118,101,108,32,112,97,99,107,97,103,101,114, - 22,0,0,0,250,5,123,125,46,123,125,78,41,4,218,6, - 114,115,112,108,105,116,218,3,108,101,110,114,80,0,0,0, - 114,46,0,0,0,41,5,114,17,0,0,0,218,7,112,97, - 99,107,97,103,101,218,5,108,101,118,101,108,90,4,98,105, - 116,115,90,4,98,97,115,101,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,13,95,114,101,115,111,108,118, - 101,95,110,97,109,101,115,3,0,0,115,12,0,0,0,16, - 2,12,1,8,1,8,1,20,1,255,128,114,189,0,0,0, - 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,34,0,0,0,124,0, - 160,0,124,1,124,2,161,2,125,3,124,3,100,0,117,0, - 114,24,100,0,83,0,116,1,124,1,124,3,131,2,83,0, - 114,13,0,0,0,41,2,114,169,0,0,0,114,92,0,0, - 0,41,4,218,6,102,105,110,100,101,114,114,17,0,0,0, - 114,166,0,0,0,114,110,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,17,95,102,105,110,100, - 95,115,112,101,99,95,108,101,103,97,99,121,124,3,0,0, - 115,10,0,0,0,12,3,8,1,4,1,10,1,255,128,114, - 191,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,10,0,0,0,10,0,0,0,67,0,0,0,115,28,1, - 0,0,116,0,106,1,125,3,124,3,100,1,117,0,114,22, - 116,2,100,2,131,1,130,1,124,3,115,38,116,3,160,4, - 100,3,116,5,161,2,1,0,124,0,116,0,106,6,118,0, - 125,4,124,3,68,0,93,226,125,5,116,7,131,0,143,94, - 1,0,122,10,124,5,106,8,125,6,87,0,110,54,4,0, - 116,9,121,128,1,0,1,0,1,0,116,10,124,5,124,0, - 124,1,131,3,125,7,124,7,100,1,117,0,114,124,89,0, - 87,0,100,1,4,0,4,0,131,3,1,0,113,52,89,0, - 110,14,48,0,124,6,124,0,124,1,124,2,131,3,125,7, - 87,0,100,1,4,0,4,0,131,3,1,0,110,16,49,0, - 115,162,48,0,1,0,1,0,1,0,89,0,1,0,124,7, - 100,1,117,1,114,52,124,4,144,1,115,16,124,0,116,0, - 106,6,118,0,144,1,114,16,116,0,106,6,124,0,25,0, - 125,8,122,10,124,8,106,11,125,9,87,0,110,26,4,0, - 116,9,121,244,1,0,1,0,1,0,124,7,6,0,89,0, - 2,0,1,0,83,0,48,0,124,9,100,1,117,0,144,1, - 114,8,124,7,2,0,1,0,83,0,124,9,2,0,1,0, - 83,0,124,7,2,0,1,0,83,0,100,1,83,0,41,4, - 122,21,70,105,110,100,32,97,32,109,111,100,117,108,101,39, - 115,32,115,112,101,99,46,78,122,53,115,121,115,46,109,101, - 116,97,95,112,97,116,104,32,105,115,32,78,111,110,101,44, - 32,80,121,116,104,111,110,32,105,115,32,108,105,107,101,108, - 121,32,115,104,117,116,116,105,110,103,32,100,111,119,110,122, - 22,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, - 115,32,101,109,112,116,121,41,12,114,15,0,0,0,218,9, - 109,101,116,97,95,112,97,116,104,114,80,0,0,0,218,9, - 95,119,97,114,110,105,110,103,115,218,4,119,97,114,110,218, - 13,73,109,112,111,114,116,87,97,114,110,105,110,103,114,93, - 0,0,0,114,180,0,0,0,114,168,0,0,0,114,107,0, - 0,0,114,191,0,0,0,114,106,0,0,0,41,10,114,17, - 0,0,0,114,166,0,0,0,114,167,0,0,0,114,192,0, - 0,0,90,9,105,115,95,114,101,108,111,97,100,114,190,0, - 0,0,114,168,0,0,0,114,96,0,0,0,114,97,0,0, - 0,114,106,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,10,95,102,105,110,100,95,115,112,101, - 99,133,3,0,0,115,56,0,0,0,6,2,8,1,8,2, - 4,3,12,1,10,5,8,1,8,1,2,1,10,1,12,1, - 12,1,8,1,22,1,42,2,8,1,18,2,10,1,2,1, - 10,1,12,1,14,4,10,2,8,1,8,2,8,2,4,2, - 255,128,114,196,0,0,0,99,3,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,5,0,0,0,67,0,0,0, - 115,106,0,0,0,116,0,124,0,116,1,131,2,115,28,116, - 2,100,1,160,3,116,4,124,0,131,1,161,1,131,1,130, - 1,124,2,100,2,107,0,114,44,116,5,100,3,131,1,130, - 1,124,2,100,2,107,4,114,82,116,0,124,1,116,1,131, - 2,115,70,116,2,100,4,131,1,130,1,124,1,115,82,116, - 6,100,5,131,1,130,1,124,0,115,102,124,2,100,2,107, - 2,114,102,116,5,100,6,131,1,130,1,100,7,83,0,41, - 8,122,28,86,101,114,105,102,121,32,97,114,103,117,109,101, - 110,116,115,32,97,114,101,32,34,115,97,110,101,34,46,122, - 31,109,111,100,117,108,101,32,110,97,109,101,32,109,117,115, - 116,32,98,101,32,115,116,114,44,32,110,111,116,32,123,125, - 114,22,0,0,0,122,18,108,101,118,101,108,32,109,117,115, - 116,32,98,101,32,62,61,32,48,122,31,95,95,112,97,99, - 107,97,103,101,95,95,32,110,111,116,32,115,101,116,32,116, - 111,32,97,32,115,116,114,105,110,103,122,54,97,116,116,101, - 109,112,116,101,100,32,114,101,108,97,116,105,118,101,32,105, - 109,112,111,114,116,32,119,105,116,104,32,110,111,32,107,110, - 111,119,110,32,112,97,114,101,110,116,32,112,97,99,107,97, - 103,101,122,17,69,109,112,116,121,32,109,111,100,117,108,101, - 32,110,97,109,101,78,41,7,218,10,105,115,105,110,115,116, - 97,110,99,101,218,3,115,116,114,218,9,84,121,112,101,69, - 114,114,111,114,114,46,0,0,0,114,14,0,0,0,218,10, - 86,97,108,117,101,69,114,114,111,114,114,80,0,0,0,169, - 3,114,17,0,0,0,114,187,0,0,0,114,188,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 13,95,115,97,110,105,116,121,95,99,104,101,99,107,180,3, - 0,0,115,26,0,0,0,10,2,18,1,8,1,8,1,8, - 1,10,1,8,1,4,1,8,1,12,2,8,1,4,128,255, - 128,114,202,0,0,0,122,16,78,111,32,109,111,100,117,108, - 101,32,110,97,109,101,100,32,122,4,123,33,114,125,99,2, - 0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,8, - 0,0,0,67,0,0,0,115,20,1,0,0,100,0,125,2, - 124,0,160,0,100,1,161,1,100,2,25,0,125,3,124,3, - 114,128,124,3,116,1,106,2,118,1,114,42,116,3,124,1, - 124,3,131,2,1,0,124,0,116,1,106,2,118,0,114,62, - 116,1,106,2,124,0,25,0,83,0,116,1,106,2,124,3, - 25,0,125,4,122,10,124,4,106,4,125,2,87,0,110,44, - 4,0,116,5,121,126,1,0,1,0,1,0,116,6,100,3, - 23,0,160,7,124,0,124,3,161,2,125,5,116,8,124,5, - 124,0,100,4,141,2,100,0,130,2,48,0,116,9,124,0, - 124,2,131,2,125,6,124,6,100,0,117,0,114,164,116,8, - 116,6,160,7,124,0,161,1,124,0,100,4,141,2,130,1, - 116,10,124,6,131,1,125,7,124,3,144,1,114,16,116,1, - 106,2,124,3,25,0,125,4,124,0,160,0,100,1,161,1, - 100,5,25,0,125,8,122,18,116,11,124,4,124,8,124,7, - 131,3,1,0,87,0,124,7,83,0,4,0,116,5,144,1, - 121,14,1,0,1,0,1,0,100,6,124,3,155,2,100,7, - 124,8,155,2,157,4,125,5,116,12,160,13,124,5,116,14, - 161,2,1,0,89,0,124,7,83,0,48,0,124,7,83,0, - 41,8,78,114,129,0,0,0,114,22,0,0,0,122,23,59, - 32,123,33,114,125,32,105,115,32,110,111,116,32,97,32,112, - 97,99,107,97,103,101,114,16,0,0,0,233,2,0,0,0, - 122,27,67,97,110,110,111,116,32,115,101,116,32,97,110,32, - 97,116,116,114,105,98,117,116,101,32,111,110,32,122,18,32, - 102,111,114,32,99,104,105,108,100,32,109,111,100,117,108,101, - 32,41,15,114,130,0,0,0,114,15,0,0,0,114,93,0, - 0,0,114,68,0,0,0,114,142,0,0,0,114,107,0,0, - 0,218,8,95,69,82,82,95,77,83,71,114,46,0,0,0, - 218,19,77,111,100,117,108,101,78,111,116,70,111,117,110,100, - 69,114,114,111,114,114,196,0,0,0,114,160,0,0,0,114, - 5,0,0,0,114,193,0,0,0,114,194,0,0,0,114,195, - 0,0,0,41,9,114,17,0,0,0,218,7,105,109,112,111, - 114,116,95,114,166,0,0,0,114,131,0,0,0,90,13,112, - 97,114,101,110,116,95,109,111,100,117,108,101,114,158,0,0, - 0,114,96,0,0,0,114,97,0,0,0,90,5,99,104,105, - 108,100,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,23,95,102,105,110,100,95,97,110,100,95,108,111,97, - 100,95,117,110,108,111,99,107,101,100,199,3,0,0,115,60, - 0,0,0,4,1,14,1,4,1,10,1,10,1,10,2,10, - 1,10,1,2,1,10,1,12,1,16,1,16,1,10,1,8, - 1,18,1,8,2,6,1,10,2,14,1,2,1,14,1,4, - 4,14,253,16,1,14,1,4,1,2,255,4,1,255,128,114, - 207,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,8,0,0,0,67,0,0,0,115,128,0, - 0,0,116,0,124,0,131,1,143,62,1,0,116,1,106,2, - 160,3,124,0,116,4,161,2,125,2,124,2,116,4,117,0, - 114,56,116,5,124,0,124,1,131,2,87,0,2,0,100,1, - 4,0,4,0,131,3,1,0,83,0,87,0,100,1,4,0, - 4,0,131,3,1,0,110,16,49,0,115,76,48,0,1,0, - 1,0,1,0,89,0,1,0,124,2,100,1,117,0,114,116, - 100,2,160,6,124,0,161,1,125,3,116,7,124,3,124,0, - 100,3,141,2,130,1,116,8,124,0,131,1,1,0,124,2, - 83,0,41,4,122,25,70,105,110,100,32,97,110,100,32,108, - 111,97,100,32,116,104,101,32,109,111,100,117,108,101,46,78, - 122,40,105,109,112,111,114,116,32,111,102,32,123,125,32,104, - 97,108,116,101,100,59,32,78,111,110,101,32,105,110,32,115, - 121,115,46,109,111,100,117,108,101,115,114,16,0,0,0,41, - 9,114,51,0,0,0,114,15,0,0,0,114,93,0,0,0, - 114,35,0,0,0,218,14,95,78,69,69,68,83,95,76,79, - 65,68,73,78,71,114,207,0,0,0,114,46,0,0,0,114, - 205,0,0,0,114,66,0,0,0,41,4,114,17,0,0,0, - 114,206,0,0,0,114,97,0,0,0,114,76,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,14, - 95,102,105,110,100,95,97,110,100,95,108,111,97,100,234,3, - 0,0,115,24,0,0,0,10,2,14,1,8,1,54,1,8, - 2,4,1,2,1,4,255,12,2,8,2,4,1,255,128,114, - 209,0,0,0,114,22,0,0,0,99,3,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, - 0,0,115,42,0,0,0,116,0,124,0,124,1,124,2,131, - 3,1,0,124,2,100,1,107,4,114,32,116,1,124,0,124, - 1,124,2,131,3,125,0,116,2,124,0,116,3,131,2,83, - 0,41,3,97,50,1,0,0,73,109,112,111,114,116,32,97, - 110,100,32,114,101,116,117,114,110,32,116,104,101,32,109,111, - 100,117,108,101,32,98,97,115,101,100,32,111,110,32,105,116, - 115,32,110,97,109,101,44,32,116,104,101,32,112,97,99,107, - 97,103,101,32,116,104,101,32,99,97,108,108,32,105,115,10, - 32,32,32,32,98,101,105,110,103,32,109,97,100,101,32,102, - 114,111,109,44,32,97,110,100,32,116,104,101,32,108,101,118, - 101,108,32,97,100,106,117,115,116,109,101,110,116,46,10,10, - 32,32,32,32,84,104,105,115,32,102,117,110,99,116,105,111, - 110,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101, - 32,103,114,101,97,116,101,115,116,32,99,111,109,109,111,110, - 32,100,101,110,111,109,105,110,97,116,111,114,32,111,102,32, - 102,117,110,99,116,105,111,110,97,108,105,116,121,10,32,32, - 32,32,98,101,116,119,101,101,110,32,105,109,112,111,114,116, - 95,109,111,100,117,108,101,32,97,110,100,32,95,95,105,109, - 112,111,114,116,95,95,46,32,84,104,105,115,32,105,110,99, - 108,117,100,101,115,32,115,101,116,116,105,110,103,32,95,95, - 112,97,99,107,97,103,101,95,95,32,105,102,10,32,32,32, - 32,116,104,101,32,108,111,97,100,101,114,32,100,105,100,32, - 110,111,116,46,10,10,32,32,32,32,114,22,0,0,0,78, - 41,4,114,202,0,0,0,114,189,0,0,0,114,209,0,0, - 0,218,11,95,103,99,100,95,105,109,112,111,114,116,114,201, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,210,0,0,0,250,3,0,0,115,10,0,0,0, - 12,9,8,1,12,1,10,1,255,128,114,210,0,0,0,169, - 1,218,9,114,101,99,117,114,115,105,118,101,99,3,0,0, - 0,0,0,0,0,1,0,0,0,8,0,0,0,11,0,0, - 0,67,0,0,0,115,216,0,0,0,124,1,68,0,93,206, - 125,4,116,0,124,4,116,1,131,2,115,64,124,3,114,34, - 124,0,106,2,100,1,23,0,125,5,110,4,100,2,125,5, - 116,3,100,3,124,5,155,0,100,4,116,4,124,4,131,1, - 106,2,155,0,157,4,131,1,130,1,124,4,100,5,107,2, - 114,106,124,3,115,4,116,5,124,0,100,6,131,2,114,4, - 116,6,124,0,124,0,106,7,124,2,100,7,100,8,141,4, - 1,0,113,4,116,5,124,0,124,4,131,2,115,4,100,9, - 160,8,124,0,106,2,124,4,161,2,125,6,122,14,116,9, - 124,2,124,6,131,2,1,0,87,0,113,4,4,0,116,10, - 121,210,1,0,125,7,1,0,122,42,124,7,106,11,124,6, - 107,2,114,200,116,12,106,13,160,14,124,6,116,15,161,2, - 100,10,117,1,114,200,87,0,89,0,100,10,125,7,126,7, - 113,4,130,0,100,10,125,7,126,7,48,0,48,0,124,0, - 83,0,41,11,122,238,70,105,103,117,114,101,32,111,117,116, - 32,119,104,97,116,32,95,95,105,109,112,111,114,116,95,95, - 32,115,104,111,117,108,100,32,114,101,116,117,114,110,46,10, - 10,32,32,32,32,84,104,101,32,105,109,112,111,114,116,95, - 32,112,97,114,97,109,101,116,101,114,32,105,115,32,97,32, - 99,97,108,108,97,98,108,101,32,119,104,105,99,104,32,116, - 97,107,101,115,32,116,104,101,32,110,97,109,101,32,111,102, - 32,109,111,100,117,108,101,32,116,111,10,32,32,32,32,105, - 109,112,111,114,116,46,32,73,116,32,105,115,32,114,101,113, - 117,105,114,101,100,32,116,111,32,100,101,99,111,117,112,108, - 101,32,116,104,101,32,102,117,110,99,116,105,111,110,32,102, - 114,111,109,32,97,115,115,117,109,105,110,103,32,105,109,112, - 111,114,116,108,105,98,39,115,10,32,32,32,32,105,109,112, - 111,114,116,32,105,109,112,108,101,109,101,110,116,97,116,105, - 111,110,32,105,115,32,100,101,115,105,114,101,100,46,10,10, - 32,32,32,32,122,8,46,95,95,97,108,108,95,95,122,13, - 96,96,102,114,111,109,32,108,105,115,116,39,39,122,8,73, - 116,101,109,32,105,110,32,122,18,32,109,117,115,116,32,98, - 101,32,115,116,114,44,32,110,111,116,32,250,1,42,218,7, - 95,95,97,108,108,95,95,84,114,211,0,0,0,114,184,0, - 0,0,78,41,16,114,197,0,0,0,114,198,0,0,0,114, - 1,0,0,0,114,199,0,0,0,114,14,0,0,0,114,4, - 0,0,0,218,16,95,104,97,110,100,108,101,95,102,114,111, - 109,108,105,115,116,114,214,0,0,0,114,46,0,0,0,114, - 68,0,0,0,114,205,0,0,0,114,17,0,0,0,114,15, - 0,0,0,114,93,0,0,0,114,35,0,0,0,114,208,0, - 0,0,41,8,114,97,0,0,0,218,8,102,114,111,109,108, - 105,115,116,114,206,0,0,0,114,212,0,0,0,218,1,120, - 90,5,119,104,101,114,101,90,9,102,114,111,109,95,110,97, - 109,101,90,3,101,120,99,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,215,0,0,0,9,4,0,0,115, - 52,0,0,0,8,10,10,1,4,1,12,1,4,2,10,1, - 8,1,8,255,8,2,14,1,10,1,2,1,8,255,10,2, - 14,1,2,1,14,1,14,1,10,4,16,1,2,255,12,2, - 2,1,10,128,4,1,255,128,114,215,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,6,0, - 0,0,67,0,0,0,115,146,0,0,0,124,0,160,0,100, - 1,161,1,125,1,124,0,160,0,100,2,161,1,125,2,124, - 1,100,3,117,1,114,82,124,2,100,3,117,1,114,78,124, - 1,124,2,106,1,107,3,114,78,116,2,106,3,100,4,124, - 1,155,2,100,5,124,2,106,1,155,2,100,6,157,5,116, - 4,100,7,100,8,141,3,1,0,124,1,83,0,124,2,100, - 3,117,1,114,96,124,2,106,1,83,0,116,2,106,3,100, - 9,116,4,100,7,100,8,141,3,1,0,124,0,100,10,25, - 0,125,1,100,11,124,0,118,1,114,142,124,1,160,5,100, - 12,161,1,100,13,25,0,125,1,124,1,83,0,41,14,122, - 167,67,97,108,99,117,108,97,116,101,32,119,104,97,116,32, - 95,95,112,97,99,107,97,103,101,95,95,32,115,104,111,117, - 108,100,32,98,101,46,10,10,32,32,32,32,95,95,112,97, - 99,107,97,103,101,95,95,32,105,115,32,110,111,116,32,103, - 117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32, - 100,101,102,105,110,101,100,32,111,114,32,99,111,117,108,100, - 32,98,101,32,115,101,116,32,116,111,32,78,111,110,101,10, - 32,32,32,32,116,111,32,114,101,112,114,101,115,101,110,116, - 32,116,104,97,116,32,105,116,115,32,112,114,111,112,101,114, - 32,118,97,108,117,101,32,105,115,32,117,110,107,110,111,119, - 110,46,10,10,32,32,32,32,114,146,0,0,0,114,106,0, - 0,0,78,122,32,95,95,112,97,99,107,97,103,101,95,95, - 32,33,61,32,95,95,115,112,101,99,95,95,46,112,97,114, - 101,110,116,32,40,122,4,32,33,61,32,250,1,41,233,3, - 0,0,0,41,1,90,10,115,116,97,99,107,108,101,118,101, - 108,122,89,99,97,110,39,116,32,114,101,115,111,108,118,101, - 32,112,97,99,107,97,103,101,32,102,114,111,109,32,95,95, - 115,112,101,99,95,95,32,111,114,32,95,95,112,97,99,107, - 97,103,101,95,95,44,32,102,97,108,108,105,110,103,32,98, - 97,99,107,32,111,110,32,95,95,110,97,109,101,95,95,32, - 97,110,100,32,95,95,112,97,116,104,95,95,114,1,0,0, - 0,114,142,0,0,0,114,129,0,0,0,114,22,0,0,0, - 41,6,114,35,0,0,0,114,131,0,0,0,114,193,0,0, - 0,114,194,0,0,0,114,195,0,0,0,114,130,0,0,0, - 41,3,218,7,103,108,111,98,97,108,115,114,187,0,0,0, - 114,96,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,17,95,99,97,108,99,95,95,95,112,97, - 99,107,97,103,101,95,95,46,4,0,0,115,44,0,0,0, - 10,7,10,1,8,1,18,1,6,1,2,1,4,255,4,1, - 6,255,4,2,6,254,4,3,8,1,6,1,6,2,4,2, - 6,254,8,3,8,1,14,1,4,1,255,128,114,221,0,0, - 0,114,10,0,0,0,99,5,0,0,0,0,0,0,0,0, - 0,0,0,9,0,0,0,5,0,0,0,67,0,0,0,115, - 174,0,0,0,124,4,100,1,107,2,114,18,116,0,124,0, - 131,1,125,5,110,36,124,1,100,2,117,1,114,30,124,1, - 110,2,105,0,125,6,116,1,124,6,131,1,125,7,116,0, - 124,0,124,7,124,4,131,3,125,5,124,3,115,148,124,4, - 100,1,107,2,114,84,116,0,124,0,160,2,100,3,161,1, - 100,1,25,0,131,1,83,0,124,0,115,92,124,5,83,0, - 116,3,124,0,131,1,116,3,124,0,160,2,100,3,161,1, - 100,1,25,0,131,1,24,0,125,8,116,4,106,5,124,5, - 106,6,100,2,116,3,124,5,106,6,131,1,124,8,24,0, - 133,2,25,0,25,0,83,0,116,7,124,5,100,4,131,2, - 114,170,116,8,124,5,124,3,116,0,131,3,83,0,124,5, - 83,0,41,5,97,215,1,0,0,73,109,112,111,114,116,32, - 97,32,109,111,100,117,108,101,46,10,10,32,32,32,32,84, - 104,101,32,39,103,108,111,98,97,108,115,39,32,97,114,103, - 117,109,101,110,116,32,105,115,32,117,115,101,100,32,116,111, - 32,105,110,102,101,114,32,119,104,101,114,101,32,116,104,101, - 32,105,109,112,111,114,116,32,105,115,32,111,99,99,117,114, - 114,105,110,103,32,102,114,111,109,10,32,32,32,32,116,111, - 32,104,97,110,100,108,101,32,114,101,108,97,116,105,118,101, - 32,105,109,112,111,114,116,115,46,32,84,104,101,32,39,108, - 111,99,97,108,115,39,32,97,114,103,117,109,101,110,116,32, - 105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,10, - 32,32,32,32,39,102,114,111,109,108,105,115,116,39,32,97, - 114,103,117,109,101,110,116,32,115,112,101,99,105,102,105,101, - 115,32,119,104,97,116,32,115,104,111,117,108,100,32,101,120, - 105,115,116,32,97,115,32,97,116,116,114,105,98,117,116,101, - 115,32,111,110,32,116,104,101,32,109,111,100,117,108,101,10, - 32,32,32,32,98,101,105,110,103,32,105,109,112,111,114,116, - 101,100,32,40,101,46,103,46,32,96,96,102,114,111,109,32, - 109,111,100,117,108,101,32,105,109,112,111,114,116,32,60,102, - 114,111,109,108,105,115,116,62,96,96,41,46,32,32,84,104, - 101,32,39,108,101,118,101,108,39,10,32,32,32,32,97,114, - 103,117,109,101,110,116,32,114,101,112,114,101,115,101,110,116, - 115,32,116,104,101,32,112,97,99,107,97,103,101,32,108,111, - 99,97,116,105,111,110,32,116,111,32,105,109,112,111,114,116, - 32,102,114,111,109,32,105,110,32,97,32,114,101,108,97,116, - 105,118,101,10,32,32,32,32,105,109,112,111,114,116,32,40, - 101,46,103,46,32,96,96,102,114,111,109,32,46,46,112,107, - 103,32,105,109,112,111,114,116,32,109,111,100,96,96,32,119, - 111,117,108,100,32,104,97,118,101,32,97,32,39,108,101,118, - 101,108,39,32,111,102,32,50,41,46,10,10,32,32,32,32, - 114,22,0,0,0,78,114,129,0,0,0,114,142,0,0,0, - 41,9,114,210,0,0,0,114,221,0,0,0,218,9,112,97, - 114,116,105,116,105,111,110,114,186,0,0,0,114,15,0,0, - 0,114,93,0,0,0,114,1,0,0,0,114,4,0,0,0, - 114,215,0,0,0,41,9,114,17,0,0,0,114,220,0,0, - 0,218,6,108,111,99,97,108,115,114,216,0,0,0,114,188, - 0,0,0,114,97,0,0,0,90,8,103,108,111,98,97,108, - 115,95,114,187,0,0,0,90,7,99,117,116,95,111,102,102, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 10,95,95,105,109,112,111,114,116,95,95,73,4,0,0,115, - 32,0,0,0,8,11,10,1,16,2,8,1,12,1,4,1, - 8,3,18,1,4,1,4,1,26,4,30,3,10,1,12,1, - 4,2,255,128,114,224,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, - 0,0,115,38,0,0,0,116,0,160,1,124,0,161,1,125, - 1,124,1,100,0,117,0,114,30,116,2,100,1,124,0,23, - 0,131,1,130,1,116,3,124,1,131,1,83,0,41,2,78, - 122,25,110,111,32,98,117,105,108,116,45,105,110,32,109,111, - 100,117,108,101,32,110,97,109,101,100,32,41,4,114,161,0, - 0,0,114,168,0,0,0,114,80,0,0,0,114,160,0,0, - 0,41,2,114,17,0,0,0,114,96,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,18,95,98, - 117,105,108,116,105,110,95,102,114,111,109,95,110,97,109,101, - 110,4,0,0,115,10,0,0,0,10,1,8,1,12,1,8, - 1,255,128,114,225,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,10,0,0,0,5,0,0,0,67,0,0, - 0,115,164,0,0,0,124,1,97,0,124,0,97,1,116,2, - 116,1,131,1,125,2,116,1,106,3,160,4,161,0,68,0, - 93,70,92,2,125,3,125,4,116,5,124,4,124,2,131,2, - 114,26,124,3,116,1,106,6,118,0,114,60,116,7,125,5, - 110,16,116,0,160,8,124,3,161,1,114,26,116,9,125,5, - 110,0,116,10,124,4,124,5,131,2,125,6,116,11,124,6, - 124,4,131,2,1,0,113,26,116,1,106,3,116,12,25,0, - 125,7,100,1,68,0,93,46,125,8,124,8,116,1,106,3, - 118,1,114,136,116,13,124,8,131,1,125,9,110,10,116,1, - 106,3,124,8,25,0,125,9,116,14,124,7,124,8,124,9, - 131,3,1,0,113,112,100,2,83,0,41,3,122,250,83,101, - 116,117,112,32,105,109,112,111,114,116,108,105,98,32,98,121, - 32,105,109,112,111,114,116,105,110,103,32,110,101,101,100,101, - 100,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,115,32,97,110,100,32,105,110,106,101,99,116,105,110,103, - 32,116,104,101,109,10,32,32,32,32,105,110,116,111,32,116, - 104,101,32,103,108,111,98,97,108,32,110,97,109,101,115,112, - 97,99,101,46,10,10,32,32,32,32,65,115,32,115,121,115, - 32,105,115,32,110,101,101,100,101,100,32,102,111,114,32,115, - 121,115,46,109,111,100,117,108,101,115,32,97,99,99,101,115, - 115,32,97,110,100,32,95,105,109,112,32,105,115,32,110,101, - 101,100,101,100,32,116,111,32,108,111,97,100,32,98,117,105, - 108,116,45,105,110,10,32,32,32,32,109,111,100,117,108,101, - 115,44,32,116,104,111,115,101,32,116,119,111,32,109,111,100, - 117,108,101,115,32,109,117,115,116,32,98,101,32,101,120,112, - 108,105,99,105,116,108,121,32,112,97,115,115,101,100,32,105, - 110,46,10,10,32,32,32,32,41,3,114,23,0,0,0,114, - 193,0,0,0,114,65,0,0,0,78,41,15,114,58,0,0, - 0,114,15,0,0,0,114,14,0,0,0,114,93,0,0,0, - 218,5,105,116,101,109,115,114,197,0,0,0,114,79,0,0, - 0,114,161,0,0,0,114,89,0,0,0,114,175,0,0,0, - 114,143,0,0,0,114,149,0,0,0,114,1,0,0,0,114, - 225,0,0,0,114,5,0,0,0,41,10,218,10,115,121,115, - 95,109,111,100,117,108,101,218,11,95,105,109,112,95,109,111, - 100,117,108,101,90,11,109,111,100,117,108,101,95,116,121,112, - 101,114,17,0,0,0,114,97,0,0,0,114,110,0,0,0, - 114,96,0,0,0,90,11,115,101,108,102,95,109,111,100,117, - 108,101,90,12,98,117,105,108,116,105,110,95,110,97,109,101, - 90,14,98,117,105,108,116,105,110,95,109,111,100,117,108,101, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 6,95,115,101,116,117,112,117,4,0,0,115,38,0,0,0, - 4,9,4,1,8,3,18,1,10,1,10,1,6,1,10,1, - 6,1,10,3,12,1,10,3,8,1,10,1,10,1,10,2, - 14,1,4,128,255,128,114,229,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,38,0,0,0,116,0,124,0,124,1,131, - 2,1,0,116,1,106,2,160,3,116,4,161,1,1,0,116, - 1,106,2,160,3,116,5,161,1,1,0,100,1,83,0,41, - 2,122,48,73,110,115,116,97,108,108,32,105,109,112,111,114, - 116,101,114,115,32,102,111,114,32,98,117,105,108,116,105,110, - 32,97,110,100,32,102,114,111,122,101,110,32,109,111,100,117, - 108,101,115,78,41,6,114,229,0,0,0,114,15,0,0,0, - 114,192,0,0,0,114,120,0,0,0,114,161,0,0,0,114, - 175,0,0,0,41,2,114,227,0,0,0,114,228,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 8,95,105,110,115,116,97,108,108,152,4,0,0,115,10,0, - 0,0,10,2,12,2,12,1,4,128,255,128,114,230,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,4,0,0,0,67,0,0,0,115,32,0,0,0,100, - 1,100,2,108,0,125,0,124,0,97,1,124,0,160,2,116, - 3,106,4,116,5,25,0,161,1,1,0,100,2,83,0,41, - 3,122,57,73,110,115,116,97,108,108,32,105,109,112,111,114, - 116,101,114,115,32,116,104,97,116,32,114,101,113,117,105,114, - 101,32,101,120,116,101,114,110,97,108,32,102,105,108,101,115, - 121,115,116,101,109,32,97,99,99,101,115,115,114,22,0,0, - 0,78,41,6,218,26,95,102,114,111,122,101,110,95,105,109, - 112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108, - 114,127,0,0,0,114,230,0,0,0,114,15,0,0,0,114, - 93,0,0,0,114,1,0,0,0,41,1,114,231,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 27,95,105,110,115,116,97,108,108,95,101,120,116,101,114,110, - 97,108,95,105,109,112,111,114,116,101,114,115,160,4,0,0, - 115,10,0,0,0,8,3,4,1,16,1,4,128,255,128,114, - 232,0,0,0,41,2,78,78,41,1,78,41,2,78,114,22, - 0,0,0,41,4,78,78,114,10,0,0,0,114,22,0,0, - 0,41,50,114,3,0,0,0,114,127,0,0,0,114,12,0, - 0,0,114,18,0,0,0,114,60,0,0,0,114,34,0,0, - 0,114,44,0,0,0,114,19,0,0,0,114,20,0,0,0, - 114,50,0,0,0,114,51,0,0,0,114,54,0,0,0,114, - 66,0,0,0,114,68,0,0,0,114,77,0,0,0,114,87, - 0,0,0,114,91,0,0,0,114,98,0,0,0,114,112,0, - 0,0,114,113,0,0,0,114,92,0,0,0,114,143,0,0, - 0,114,149,0,0,0,114,153,0,0,0,114,108,0,0,0, - 114,94,0,0,0,114,159,0,0,0,114,160,0,0,0,114, - 95,0,0,0,114,161,0,0,0,114,175,0,0,0,114,180, - 0,0,0,114,189,0,0,0,114,191,0,0,0,114,196,0, - 0,0,114,202,0,0,0,90,15,95,69,82,82,95,77,83, - 71,95,80,82,69,70,73,88,114,204,0,0,0,114,207,0, - 0,0,218,6,111,98,106,101,99,116,114,208,0,0,0,114, - 209,0,0,0,114,210,0,0,0,114,215,0,0,0,114,221, - 0,0,0,114,224,0,0,0,114,225,0,0,0,114,229,0, - 0,0,114,230,0,0,0,114,232,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,8,60,109,111,100,117,108,101,62,1,0,0,0,115,100, - 0,0,0,4,0,4,24,8,2,8,8,4,8,4,2,16, - 3,14,4,14,77,14,21,8,16,8,37,8,17,14,11,8, - 8,8,11,8,12,8,16,14,36,16,101,10,26,14,45,8, - 72,8,17,8,17,8,30,8,37,8,42,14,15,14,75,14, - 79,8,13,8,9,10,9,8,47,4,16,8,1,8,2,6, - 32,8,3,10,16,14,15,8,37,10,27,8,37,8,7,8, - 35,8,8,4,128,255,128, + 218,17,95,99,97,108,99,95,95,95,112,97,99,107,97,103, + 101,95,95,53,4,0,0,115,44,0,0,0,10,7,10,1, + 8,1,18,1,6,1,2,1,4,255,4,1,6,255,4,2, + 6,254,4,3,8,1,6,1,6,2,4,2,6,254,8,3, + 8,1,14,1,4,1,255,128,114,221,0,0,0,114,10,0, + 0,0,99,5,0,0,0,0,0,0,0,0,0,0,0,9, + 0,0,0,5,0,0,0,67,0,0,0,115,174,0,0,0, + 124,4,100,1,107,2,114,18,116,0,124,0,131,1,125,5, + 110,36,124,1,100,2,117,1,114,30,124,1,110,2,105,0, + 125,6,116,1,124,6,131,1,125,7,116,0,124,0,124,7, + 124,4,131,3,125,5,124,3,115,148,124,4,100,1,107,2, + 114,84,116,0,124,0,160,2,100,3,161,1,100,1,25,0, + 131,1,83,0,124,0,115,92,124,5,83,0,116,3,124,0, + 131,1,116,3,124,0,160,2,100,3,161,1,100,1,25,0, + 131,1,24,0,125,8,116,4,106,5,124,5,106,6,100,2, + 116,3,124,5,106,6,131,1,124,8,24,0,133,2,25,0, + 25,0,83,0,116,7,124,5,100,4,131,2,114,170,116,8, + 124,5,124,3,116,0,131,3,83,0,124,5,83,0,41,5, + 97,215,1,0,0,73,109,112,111,114,116,32,97,32,109,111, + 100,117,108,101,46,10,10,32,32,32,32,84,104,101,32,39, + 103,108,111,98,97,108,115,39,32,97,114,103,117,109,101,110, + 116,32,105,115,32,117,115,101,100,32,116,111,32,105,110,102, + 101,114,32,119,104,101,114,101,32,116,104,101,32,105,109,112, + 111,114,116,32,105,115,32,111,99,99,117,114,114,105,110,103, + 32,102,114,111,109,10,32,32,32,32,116,111,32,104,97,110, + 100,108,101,32,114,101,108,97,116,105,118,101,32,105,109,112, + 111,114,116,115,46,32,84,104,101,32,39,108,111,99,97,108, + 115,39,32,97,114,103,117,109,101,110,116,32,105,115,32,105, + 103,110,111,114,101,100,46,32,84,104,101,10,32,32,32,32, + 39,102,114,111,109,108,105,115,116,39,32,97,114,103,117,109, + 101,110,116,32,115,112,101,99,105,102,105,101,115,32,119,104, + 97,116,32,115,104,111,117,108,100,32,101,120,105,115,116,32, + 97,115,32,97,116,116,114,105,98,117,116,101,115,32,111,110, + 32,116,104,101,32,109,111,100,117,108,101,10,32,32,32,32, + 98,101,105,110,103,32,105,109,112,111,114,116,101,100,32,40, + 101,46,103,46,32,96,96,102,114,111,109,32,109,111,100,117, + 108,101,32,105,109,112,111,114,116,32,60,102,114,111,109,108, + 105,115,116,62,96,96,41,46,32,32,84,104,101,32,39,108, + 101,118,101,108,39,10,32,32,32,32,97,114,103,117,109,101, + 110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104, + 101,32,112,97,99,107,97,103,101,32,108,111,99,97,116,105, + 111,110,32,116,111,32,105,109,112,111,114,116,32,102,114,111, + 109,32,105,110,32,97,32,114,101,108,97,116,105,118,101,10, + 32,32,32,32,105,109,112,111,114,116,32,40,101,46,103,46, + 32,96,96,102,114,111,109,32,46,46,112,107,103,32,105,109, + 112,111,114,116,32,109,111,100,96,96,32,119,111,117,108,100, + 32,104,97,118,101,32,97,32,39,108,101,118,101,108,39,32, + 111,102,32,50,41,46,10,10,32,32,32,32,114,22,0,0, + 0,78,114,129,0,0,0,114,142,0,0,0,41,9,114,210, + 0,0,0,114,221,0,0,0,218,9,112,97,114,116,105,116, + 105,111,110,114,186,0,0,0,114,15,0,0,0,114,93,0, + 0,0,114,1,0,0,0,114,4,0,0,0,114,215,0,0, + 0,41,9,114,17,0,0,0,114,220,0,0,0,218,6,108, + 111,99,97,108,115,114,216,0,0,0,114,188,0,0,0,114, + 97,0,0,0,90,8,103,108,111,98,97,108,115,95,114,187, + 0,0,0,90,7,99,117,116,95,111,102,102,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,10,95,95,105, + 109,112,111,114,116,95,95,80,4,0,0,115,32,0,0,0, + 8,11,10,1,16,2,8,1,12,1,4,1,8,3,18,1, + 4,1,4,1,26,4,30,3,10,1,12,1,4,2,255,128, + 114,224,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,38, + 0,0,0,116,0,160,1,124,0,161,1,125,1,124,1,100, + 0,117,0,114,30,116,2,100,1,124,0,23,0,131,1,130, + 1,116,3,124,1,131,1,83,0,41,2,78,122,25,110,111, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 32,110,97,109,101,100,32,41,4,114,161,0,0,0,114,168, + 0,0,0,114,80,0,0,0,114,160,0,0,0,41,2,114, + 17,0,0,0,114,96,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,18,95,98,117,105,108,116, + 105,110,95,102,114,111,109,95,110,97,109,101,117,4,0,0, + 115,10,0,0,0,10,1,8,1,12,1,8,1,255,128,114, + 225,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,10,0,0,0,5,0,0,0,67,0,0,0,115,164,0, + 0,0,124,1,97,0,124,0,97,1,116,2,116,1,131,1, + 125,2,116,1,106,3,160,4,161,0,68,0,93,70,92,2, + 125,3,125,4,116,5,124,4,124,2,131,2,114,26,124,3, + 116,1,106,6,118,0,114,60,116,7,125,5,110,16,116,0, + 160,8,124,3,161,1,114,26,116,9,125,5,110,0,116,10, + 124,4,124,5,131,2,125,6,116,11,124,6,124,4,131,2, + 1,0,113,26,116,1,106,3,116,12,25,0,125,7,100,1, + 68,0,93,46,125,8,124,8,116,1,106,3,118,1,114,136, + 116,13,124,8,131,1,125,9,110,10,116,1,106,3,124,8, + 25,0,125,9,116,14,124,7,124,8,124,9,131,3,1,0, + 113,112,100,2,83,0,41,3,122,250,83,101,116,117,112,32, + 105,109,112,111,114,116,108,105,98,32,98,121,32,105,109,112, + 111,114,116,105,110,103,32,110,101,101,100,101,100,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,97, + 110,100,32,105,110,106,101,99,116,105,110,103,32,116,104,101, + 109,10,32,32,32,32,105,110,116,111,32,116,104,101,32,103, + 108,111,98,97,108,32,110,97,109,101,115,112,97,99,101,46, + 10,10,32,32,32,32,65,115,32,115,121,115,32,105,115,32, + 110,101,101,100,101,100,32,102,111,114,32,115,121,115,46,109, + 111,100,117,108,101,115,32,97,99,99,101,115,115,32,97,110, + 100,32,95,105,109,112,32,105,115,32,110,101,101,100,101,100, + 32,116,111,32,108,111,97,100,32,98,117,105,108,116,45,105, + 110,10,32,32,32,32,109,111,100,117,108,101,115,44,32,116, + 104,111,115,101,32,116,119,111,32,109,111,100,117,108,101,115, + 32,109,117,115,116,32,98,101,32,101,120,112,108,105,99,105, + 116,108,121,32,112,97,115,115,101,100,32,105,110,46,10,10, + 32,32,32,32,41,3,114,23,0,0,0,114,193,0,0,0, + 114,65,0,0,0,78,41,15,114,58,0,0,0,114,15,0, + 0,0,114,14,0,0,0,114,93,0,0,0,218,5,105,116, + 101,109,115,114,197,0,0,0,114,79,0,0,0,114,161,0, + 0,0,114,89,0,0,0,114,175,0,0,0,114,143,0,0, + 0,114,149,0,0,0,114,1,0,0,0,114,225,0,0,0, + 114,5,0,0,0,41,10,218,10,115,121,115,95,109,111,100, + 117,108,101,218,11,95,105,109,112,95,109,111,100,117,108,101, + 90,11,109,111,100,117,108,101,95,116,121,112,101,114,17,0, + 0,0,114,97,0,0,0,114,110,0,0,0,114,96,0,0, + 0,90,11,115,101,108,102,95,109,111,100,117,108,101,90,12, + 98,117,105,108,116,105,110,95,110,97,109,101,90,14,98,117, + 105,108,116,105,110,95,109,111,100,117,108,101,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,6,95,115,101, + 116,117,112,124,4,0,0,115,38,0,0,0,4,9,4,1, + 8,3,18,1,10,1,10,1,6,1,10,1,6,1,10,3, + 12,1,10,3,8,1,10,1,10,1,10,2,14,1,4,128, + 255,128,114,229,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,38,0,0,0,116,0,124,0,124,1,131,2,1,0,116, + 1,106,2,160,3,116,4,161,1,1,0,116,1,106,2,160, + 3,116,5,161,1,1,0,100,1,83,0,41,2,122,48,73, + 110,115,116,97,108,108,32,105,109,112,111,114,116,101,114,115, + 32,102,111,114,32,98,117,105,108,116,105,110,32,97,110,100, + 32,102,114,111,122,101,110,32,109,111,100,117,108,101,115,78, + 41,6,114,229,0,0,0,114,15,0,0,0,114,192,0,0, + 0,114,120,0,0,0,114,161,0,0,0,114,175,0,0,0, + 41,2,114,227,0,0,0,114,228,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,8,95,105,110, + 115,116,97,108,108,159,4,0,0,115,10,0,0,0,10,2, + 12,2,12,1,4,128,255,128,114,230,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, + 0,0,67,0,0,0,115,32,0,0,0,100,1,100,2,108, + 0,125,0,124,0,97,1,124,0,160,2,116,3,106,4,116, + 5,25,0,161,1,1,0,100,2,83,0,41,3,122,57,73, + 110,115,116,97,108,108,32,105,109,112,111,114,116,101,114,115, + 32,116,104,97,116,32,114,101,113,117,105,114,101,32,101,120, + 116,101,114,110,97,108,32,102,105,108,101,115,121,115,116,101, + 109,32,97,99,99,101,115,115,114,22,0,0,0,78,41,6, + 218,26,95,102,114,111,122,101,110,95,105,109,112,111,114,116, + 108,105,98,95,101,120,116,101,114,110,97,108,114,127,0,0, + 0,114,230,0,0,0,114,15,0,0,0,114,93,0,0,0, + 114,1,0,0,0,41,1,114,231,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,27,95,105,110, + 115,116,97,108,108,95,101,120,116,101,114,110,97,108,95,105, + 109,112,111,114,116,101,114,115,167,4,0,0,115,10,0,0, + 0,8,3,4,1,16,1,4,128,255,128,114,232,0,0,0, + 41,2,78,78,41,1,78,41,2,78,114,22,0,0,0,41, + 4,78,78,114,10,0,0,0,114,22,0,0,0,41,53,114, + 3,0,0,0,114,23,0,0,0,114,193,0,0,0,114,65, + 0,0,0,114,127,0,0,0,114,12,0,0,0,114,18,0, + 0,0,114,60,0,0,0,114,34,0,0,0,114,44,0,0, + 0,114,19,0,0,0,114,20,0,0,0,114,50,0,0,0, + 114,51,0,0,0,114,54,0,0,0,114,66,0,0,0,114, + 68,0,0,0,114,77,0,0,0,114,87,0,0,0,114,91, + 0,0,0,114,98,0,0,0,114,112,0,0,0,114,113,0, + 0,0,114,92,0,0,0,114,143,0,0,0,114,149,0,0, + 0,114,153,0,0,0,114,108,0,0,0,114,94,0,0,0, + 114,159,0,0,0,114,160,0,0,0,114,95,0,0,0,114, + 161,0,0,0,114,175,0,0,0,114,180,0,0,0,114,189, + 0,0,0,114,191,0,0,0,114,196,0,0,0,114,202,0, + 0,0,90,15,95,69,82,82,95,77,83,71,95,80,82,69, + 70,73,88,114,204,0,0,0,114,207,0,0,0,218,6,111, + 98,106,101,99,116,114,208,0,0,0,114,209,0,0,0,114, + 210,0,0,0,114,215,0,0,0,114,221,0,0,0,114,224, + 0,0,0,114,225,0,0,0,114,229,0,0,0,114,230,0, + 0,0,114,232,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,8,60,109,111, + 100,117,108,101,62,1,0,0,0,115,106,0,0,0,4,0, + 4,25,4,1,4,1,4,3,8,3,8,8,4,8,4,2, + 16,3,14,4,14,77,14,21,8,16,8,37,8,17,14,11, + 8,8,8,11,8,12,8,16,14,36,16,101,10,26,14,45, + 8,72,8,17,8,17,8,30,8,37,8,42,14,15,14,75, + 14,79,8,13,8,9,10,9,8,47,4,16,8,1,8,2, + 6,32,8,3,10,16,14,15,8,37,10,27,8,37,8,7, + 8,35,8,8,4,128,255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 790f627ba6cc7d..58b53d9526ec48 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -1,2710 +1,2670 @@ /* Auto-generated by Programs/_freeze_importlib.c */ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,64,0,0,0,115,32,2,0,0,100,0, - 90,0,100,1,90,1,100,2,90,2,101,2,101,1,23,0, - 90,3,100,3,100,4,132,0,90,4,100,5,100,6,132,0, - 90,5,100,7,100,8,132,0,90,6,100,9,100,10,132,0, - 90,7,100,11,100,12,132,0,90,8,100,13,100,14,132,0, - 90,9,100,15,100,16,132,0,90,10,100,17,100,18,132,0, - 90,11,100,19,100,20,132,0,90,12,100,21,100,22,132,0, - 90,13,100,23,100,24,132,0,90,14,100,101,100,26,100,27, - 132,1,90,15,101,16,101,15,106,17,131,1,90,18,100,28, - 160,19,100,29,100,30,161,2,100,31,23,0,90,20,101,21, - 160,22,101,20,100,30,161,2,90,23,100,32,90,24,100,33, - 90,25,100,34,103,1,90,26,100,35,103,1,90,27,101,27, - 4,0,90,28,90,29,100,102,100,36,100,37,156,1,100,38, - 100,39,132,3,90,30,100,40,100,41,132,0,90,31,100,42, - 100,43,132,0,90,32,100,44,100,45,132,0,90,33,100,46, - 100,47,132,0,90,34,100,48,100,49,132,0,90,35,100,50, - 100,51,132,0,90,36,100,52,100,53,132,0,90,37,100,54, - 100,55,132,0,90,38,100,56,100,57,132,0,90,39,100,103, - 100,58,100,59,132,1,90,40,100,104,100,61,100,62,132,1, - 90,41,100,105,100,64,100,65,132,1,90,42,100,66,100,67, - 132,0,90,43,101,44,131,0,90,45,100,106,100,36,101,45, - 100,68,156,2,100,69,100,70,132,3,90,46,71,0,100,71, - 100,72,132,0,100,72,131,2,90,47,71,0,100,73,100,74, - 132,0,100,74,131,2,90,48,71,0,100,75,100,76,132,0, - 100,76,101,48,131,3,90,49,71,0,100,77,100,78,132,0, - 100,78,131,2,90,50,71,0,100,79,100,80,132,0,100,80, - 101,50,101,49,131,4,90,51,71,0,100,81,100,82,132,0, - 100,82,101,50,101,48,131,4,90,52,103,0,90,53,71,0, - 100,83,100,84,132,0,100,84,101,50,101,48,131,4,90,54, - 71,0,100,85,100,86,132,0,100,86,131,2,90,55,71,0, - 100,87,100,88,132,0,100,88,131,2,90,56,71,0,100,89, - 100,90,132,0,100,90,131,2,90,57,71,0,100,91,100,92, - 132,0,100,92,131,2,90,58,100,107,100,93,100,94,132,1, - 90,59,100,95,100,96,132,0,90,60,100,97,100,98,132,0, - 90,61,100,99,100,100,132,0,90,62,100,36,83,0,41,108, - 97,94,1,0,0,67,111,114,101,32,105,109,112,108,101,109, - 101,110,116,97,116,105,111,110,32,111,102,32,112,97,116,104, - 45,98,97,115,101,100,32,105,109,112,111,114,116,46,10,10, - 84,104,105,115,32,109,111,100,117,108,101,32,105,115,32,78, - 79,84,32,109,101,97,110,116,32,116,111,32,98,101,32,100, - 105,114,101,99,116,108,121,32,105,109,112,111,114,116,101,100, - 33,32,73,116,32,104,97,115,32,98,101,101,110,32,100,101, - 115,105,103,110,101,100,32,115,117,99,104,10,116,104,97,116, - 32,105,116,32,99,97,110,32,98,101,32,98,111,111,116,115, - 116,114,97,112,112,101,100,32,105,110,116,111,32,80,121,116, - 104,111,110,32,97,115,32,116,104,101,32,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,32,111,102,32,105,109,112, - 111,114,116,46,32,65,115,10,115,117,99,104,32,105,116,32, - 114,101,113,117,105,114,101,115,32,116,104,101,32,105,110,106, - 101,99,116,105,111,110,32,111,102,32,115,112,101,99,105,102, - 105,99,32,109,111,100,117,108,101,115,32,97,110,100,32,97, - 116,116,114,105,98,117,116,101,115,32,105,110,32,111,114,100, - 101,114,32,116,111,10,119,111,114,107,46,32,79,110,101,32, - 115,104,111,117,108,100,32,117,115,101,32,105,109,112,111,114, - 116,108,105,98,32,97,115,32,116,104,101,32,112,117,98,108, - 105,99,45,102,97,99,105,110,103,32,118,101,114,115,105,111, - 110,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101, - 46,10,10,41,1,218,3,119,105,110,41,2,90,6,99,121, - 103,119,105,110,90,6,100,97,114,119,105,110,99,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,3,0,0,0,115,62,0,0,0,116,0,106,1,160,2, - 116,3,161,1,114,50,116,0,106,1,160,2,116,4,161,1, - 114,30,100,1,137,0,110,4,100,2,137,0,135,0,102,1, - 100,3,100,4,132,8,125,0,124,0,83,0,100,5,100,4, - 132,0,125,0,124,0,83,0,41,6,78,90,12,80,89,84, - 72,79,78,67,65,83,69,79,75,115,12,0,0,0,80,89, - 84,72,79,78,67,65,83,69,79,75,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,19, - 0,0,0,115,20,0,0,0,116,0,106,1,106,2,12,0, - 111,18,136,0,116,3,106,4,118,0,83,0,41,2,122,94, - 84,114,117,101,32,105,102,32,102,105,108,101,110,97,109,101, - 115,32,109,117,115,116,32,98,101,32,99,104,101,99,107,101, - 100,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105, - 118,101,108,121,32,97,110,100,32,105,103,110,111,114,101,32, - 101,110,118,105,114,111,110,109,101,110,116,32,102,108,97,103, - 115,32,97,114,101,32,110,111,116,32,115,101,116,46,78,41, - 5,218,3,115,121,115,218,5,102,108,97,103,115,218,18,105, - 103,110,111,114,101,95,101,110,118,105,114,111,110,109,101,110, - 116,218,3,95,111,115,90,7,101,110,118,105,114,111,110,169, - 0,169,1,218,3,107,101,121,114,5,0,0,0,250,38,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,95,101,120,116,101, - 114,110,97,108,62,218,11,95,114,101,108,97,120,95,99,97, - 115,101,36,0,0,0,115,4,0,0,0,20,2,255,128,122, - 37,95,109,97,107,101,95,114,101,108,97,120,95,99,97,115, - 101,46,60,108,111,99,97,108,115,62,46,95,114,101,108,97, - 120,95,99,97,115,101,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,83,0,0,0,115, - 4,0,0,0,100,1,83,0,41,3,122,53,84,114,117,101, - 32,105,102,32,102,105,108,101,110,97,109,101,115,32,109,117, - 115,116,32,98,101,32,99,104,101,99,107,101,100,32,99,97, - 115,101,45,105,110,115,101,110,115,105,116,105,118,101,108,121, - 46,70,78,114,5,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,9,0,0, - 0,40,0,0,0,115,4,0,0,0,4,2,255,128,41,5, - 114,1,0,0,0,218,8,112,108,97,116,102,111,114,109,218, - 10,115,116,97,114,116,115,119,105,116,104,218,27,95,67,65, - 83,69,95,73,78,83,69,78,83,73,84,73,86,69,95,80, - 76,65,84,70,79,82,77,83,218,35,95,67,65,83,69,95, - 73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,84, - 70,79,82,77,83,95,83,84,82,95,75,69,89,41,1,114, - 9,0,0,0,114,5,0,0,0,114,6,0,0,0,114,8, - 0,0,0,218,16,95,109,97,107,101,95,114,101,108,97,120, - 95,99,97,115,101,29,0,0,0,115,18,0,0,0,12,1, - 12,1,6,1,4,2,12,2,4,7,8,253,4,3,255,128, - 114,14,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,20, - 0,0,0,116,0,124,0,131,1,100,1,64,0,160,1,100, - 2,100,3,161,2,83,0,41,5,122,42,67,111,110,118,101, - 114,116,32,97,32,51,50,45,98,105,116,32,105,110,116,101, - 103,101,114,32,116,111,32,108,105,116,116,108,101,45,101,110, - 100,105,97,110,46,236,3,0,0,0,255,127,255,127,3,0, - 233,4,0,0,0,218,6,108,105,116,116,108,101,78,41,2, - 218,3,105,110,116,218,8,116,111,95,98,121,116,101,115,41, - 1,218,1,120,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,12,95,112,97,99,107,95,117,105,110,116,51, - 50,46,0,0,0,115,4,0,0,0,20,2,255,128,114,21, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,4,0,0,0,67,0,0,0,115,28,0,0, - 0,116,0,124,0,131,1,100,1,107,2,115,16,74,0,130, - 1,116,1,160,2,124,0,100,2,161,2,83,0,41,4,122, - 47,67,111,110,118,101,114,116,32,52,32,98,121,116,101,115, - 32,105,110,32,108,105,116,116,108,101,45,101,110,100,105,97, - 110,32,116,111,32,97,110,32,105,110,116,101,103,101,114,46, - 114,16,0,0,0,114,17,0,0,0,78,169,3,218,3,108, - 101,110,114,18,0,0,0,218,10,102,114,111,109,95,98,121, - 116,101,115,169,1,218,4,100,97,116,97,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,218,14,95,117,110,112, - 97,99,107,95,117,105,110,116,51,50,51,0,0,0,115,6, - 0,0,0,16,2,12,1,255,128,114,27,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, - 0,0,0,67,0,0,0,115,28,0,0,0,116,0,124,0, - 131,1,100,1,107,2,115,16,74,0,130,1,116,1,160,2, - 124,0,100,2,161,2,83,0,41,4,122,47,67,111,110,118, - 101,114,116,32,50,32,98,121,116,101,115,32,105,110,32,108, - 105,116,116,108,101,45,101,110,100,105,97,110,32,116,111,32, - 97,110,32,105,110,116,101,103,101,114,46,233,2,0,0,0, - 114,17,0,0,0,78,114,22,0,0,0,114,25,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 14,95,117,110,112,97,99,107,95,117,105,110,116,49,54,56, - 0,0,0,115,6,0,0,0,16,2,12,1,255,128,114,29, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,4,0,0,0,71,0,0,0,115,20,0,0, - 0,116,0,160,1,100,1,100,2,132,0,124,0,68,0,131, - 1,161,1,83,0,41,4,122,31,82,101,112,108,97,99,101, - 109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,104, - 46,106,111,105,110,40,41,46,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,5,0,0,0,83,0,0, - 0,115,26,0,0,0,103,0,124,0,93,18,125,1,124,1, - 114,4,124,1,160,0,116,1,161,1,145,2,113,4,83,0, - 114,5,0,0,0,41,2,218,6,114,115,116,114,105,112,218, - 15,112,97,116,104,95,115,101,112,97,114,97,116,111,114,115, - 41,2,218,2,46,48,218,4,112,97,114,116,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,10,60,108,105, - 115,116,99,111,109,112,62,64,0,0,0,115,8,0,0,0, - 6,0,6,1,14,255,255,128,122,30,95,112,97,116,104,95, - 106,111,105,110,46,60,108,111,99,97,108,115,62,46,60,108, - 105,115,116,99,111,109,112,62,78,41,2,218,8,112,97,116, - 104,95,115,101,112,218,4,106,111,105,110,41,1,218,10,112, - 97,116,104,95,112,97,114,116,115,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,10,95,112,97,116,104,95, - 106,111,105,110,62,0,0,0,115,8,0,0,0,10,2,2, - 1,8,255,255,128,114,38,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, - 0,0,0,115,94,0,0,0,116,0,116,1,131,1,100,1, - 107,2,114,36,124,0,160,2,116,3,161,1,92,3,125,1, - 125,2,125,3,124,1,124,3,102,2,83,0,116,4,124,0, - 131,1,68,0,93,40,125,4,124,4,116,1,118,0,114,44, - 124,0,106,5,124,4,100,1,100,2,141,2,92,2,125,1, - 125,3,124,1,124,3,102,2,2,0,1,0,83,0,100,3, - 124,0,102,2,83,0,41,5,122,32,82,101,112,108,97,99, + 0,5,0,0,0,64,0,0,0,115,216,2,0,0,100,0, + 90,0,100,1,97,1,100,2,100,1,108,2,90,2,100,2, + 100,1,108,3,90,3,100,2,100,1,108,4,90,4,100,2, + 100,1,108,5,90,5,100,2,100,1,108,6,90,6,101,4, + 106,7,100,3,107,2,90,8,101,8,114,80,100,2,100,1, + 108,9,90,10,100,2,100,1,108,11,90,11,110,8,100,2, + 100,1,108,12,90,10,101,8,114,102,100,4,100,5,103,2, + 90,13,110,6,100,5,103,1,90,13,101,14,100,6,100,7, + 132,0,101,13,68,0,131,1,131,1,115,130,74,0,130,1, + 101,13,100,2,25,0,90,15,100,8,160,16,101,13,161,1, + 90,13,100,9,100,10,132,0,101,13,68,0,131,1,90,17, + 100,11,90,18,100,12,90,19,101,19,101,18,23,0,90,20, + 100,13,100,14,132,0,90,21,101,21,131,0,90,22,100,15, + 100,16,132,0,90,23,100,17,100,18,132,0,90,24,100,19, + 100,20,132,0,90,25,100,21,100,22,132,0,90,26,100,23, + 100,24,132,0,90,27,100,25,100,26,132,0,90,28,100,27, + 100,28,132,0,90,29,100,29,100,30,132,0,90,30,100,31, + 100,32,132,0,90,31,100,33,100,34,132,0,90,32,100,110, + 100,36,100,37,132,1,90,33,101,34,101,33,106,35,131,1, + 90,36,100,38,160,37,100,39,100,40,161,2,100,41,23,0, + 90,38,101,39,160,40,101,38,100,40,161,2,90,41,100,42, + 90,42,100,43,90,43,100,44,103,1,90,44,101,8,144,1, + 114,94,101,44,160,45,100,45,161,1,1,0,101,2,160,46, + 161,0,90,47,100,46,103,1,90,48,101,48,4,0,90,49, + 90,50,100,111,100,1,100,47,156,1,100,48,100,49,132,3, + 90,51,100,50,100,51,132,0,90,52,100,52,100,53,132,0, + 90,53,100,54,100,55,132,0,90,54,100,56,100,57,132,0, + 90,55,100,58,100,59,132,0,90,56,100,60,100,61,132,0, + 90,57,100,62,100,63,132,0,90,58,100,64,100,65,132,0, + 90,59,100,66,100,67,132,0,90,60,100,112,100,68,100,69, + 132,1,90,61,100,113,100,70,100,71,132,1,90,62,100,114, + 100,73,100,74,132,1,90,63,100,75,100,76,132,0,90,64, + 101,65,131,0,90,66,100,115,100,1,101,66,100,77,156,2, + 100,78,100,79,132,3,90,67,71,0,100,80,100,81,132,0, + 100,81,131,2,90,68,71,0,100,82,100,83,132,0,100,83, + 131,2,90,69,71,0,100,84,100,85,132,0,100,85,101,69, + 131,3,90,70,71,0,100,86,100,87,132,0,100,87,131,2, + 90,71,71,0,100,88,100,89,132,0,100,89,101,71,101,70, + 131,4,90,72,71,0,100,90,100,91,132,0,100,91,101,71, + 101,69,131,4,90,73,71,0,100,92,100,93,132,0,100,93, + 101,71,101,69,131,4,90,74,71,0,100,94,100,95,132,0, + 100,95,131,2,90,75,71,0,100,96,100,97,132,0,100,97, + 131,2,90,76,71,0,100,98,100,99,132,0,100,99,131,2, + 90,77,71,0,100,100,100,101,132,0,100,101,131,2,90,78, + 100,116,100,102,100,103,132,1,90,79,100,104,100,105,132,0, + 90,80,100,106,100,107,132,0,90,81,100,108,100,109,132,0, + 90,82,100,1,83,0,41,117,97,94,1,0,0,67,111,114, + 101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, + 32,111,102,32,112,97,116,104,45,98,97,115,101,100,32,105, + 109,112,111,114,116,46,10,10,84,104,105,115,32,109,111,100, + 117,108,101,32,105,115,32,78,79,84,32,109,101,97,110,116, + 32,116,111,32,98,101,32,100,105,114,101,99,116,108,121,32, + 105,109,112,111,114,116,101,100,33,32,73,116,32,104,97,115, + 32,98,101,101,110,32,100,101,115,105,103,110,101,100,32,115, + 117,99,104,10,116,104,97,116,32,105,116,32,99,97,110,32, + 98,101,32,98,111,111,116,115,116,114,97,112,112,101,100,32, + 105,110,116,111,32,80,121,116,104,111,110,32,97,115,32,116, + 104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,32,111,102,32,105,109,112,111,114,116,46,32,65,115,10, + 115,117,99,104,32,105,116,32,114,101,113,117,105,114,101,115, + 32,116,104,101,32,105,110,106,101,99,116,105,111,110,32,111, + 102,32,115,112,101,99,105,102,105,99,32,109,111,100,117,108, + 101,115,32,97,110,100,32,97,116,116,114,105,98,117,116,101, + 115,32,105,110,32,111,114,100,101,114,32,116,111,10,119,111, + 114,107,46,32,79,110,101,32,115,104,111,117,108,100,32,117, + 115,101,32,105,109,112,111,114,116,108,105,98,32,97,115,32, + 116,104,101,32,112,117,98,108,105,99,45,102,97,99,105,110, + 103,32,118,101,114,115,105,111,110,32,111,102,32,116,104,105, + 115,32,109,111,100,117,108,101,46,10,10,78,233,0,0,0, + 0,90,5,119,105,110,51,50,250,1,92,250,1,47,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,99,0,0,0,115,26,0,0,0,124,0,93,18, + 125,1,116,0,124,1,131,1,100,0,107,2,86,0,1,0, + 113,2,100,1,83,0,41,2,233,1,0,0,0,78,41,1, + 218,3,108,101,110,41,2,218,2,46,48,218,3,115,101,112, + 169,0,114,7,0,0,0,250,38,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,95,101,120,116,101,114,110,97,108,62,218, + 9,60,103,101,110,101,120,112,114,62,46,0,0,0,115,6, + 0,0,0,22,0,4,128,255,128,114,9,0,0,0,218,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,67,0,0,0,115,22,0,0,0,104,0, + 124,0,93,14,125,1,100,0,124,1,155,0,157,2,146,2, + 113,4,83,0,41,1,250,1,58,114,7,0,0,0,41,2, + 114,5,0,0,0,218,1,115,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,9,60,115,101,116,99,111,109, + 112,62,49,0,0,0,115,4,0,0,0,22,0,255,128,114, + 13,0,0,0,41,1,218,3,119,105,110,41,2,90,6,99, + 121,103,119,105,110,90,6,100,97,114,119,105,110,99,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,3,0,0,0,115,62,0,0,0,116,0,106,1,160, + 2,116,3,161,1,114,50,116,0,106,1,160,2,116,4,161, + 1,114,30,100,1,137,0,110,4,100,2,137,0,135,0,102, + 1,100,3,100,4,132,8,125,0,124,0,83,0,100,5,100, + 4,132,0,125,0,124,0,83,0,41,6,78,90,12,80,89, + 84,72,79,78,67,65,83,69,79,75,115,12,0,0,0,80, + 89,84,72,79,78,67,65,83,69,79,75,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 19,0,0,0,115,20,0,0,0,116,0,106,1,106,2,12, + 0,111,18,136,0,116,3,106,4,118,0,83,0,41,2,122, + 94,84,114,117,101,32,105,102,32,102,105,108,101,110,97,109, + 101,115,32,109,117,115,116,32,98,101,32,99,104,101,99,107, + 101,100,32,99,97,115,101,45,105,110,115,101,110,115,105,116, + 105,118,101,108,121,32,97,110,100,32,105,103,110,111,114,101, + 32,101,110,118,105,114,111,110,109,101,110,116,32,102,108,97, + 103,115,32,97,114,101,32,110,111,116,32,115,101,116,46,78, + 41,5,218,3,115,121,115,218,5,102,108,97,103,115,218,18, + 105,103,110,111,114,101,95,101,110,118,105,114,111,110,109,101, + 110,116,218,3,95,111,115,90,7,101,110,118,105,114,111,110, + 114,7,0,0,0,169,1,218,3,107,101,121,114,7,0,0, + 0,114,8,0,0,0,218,11,95,114,101,108,97,120,95,99, + 97,115,101,66,0,0,0,115,4,0,0,0,20,2,255,128, + 122,37,95,109,97,107,101,95,114,101,108,97,120,95,99,97, + 115,101,46,60,108,111,99,97,108,115,62,46,95,114,101,108, + 97,120,95,99,97,115,101,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,83,0,0,0, + 115,4,0,0,0,100,1,83,0,41,3,122,53,84,114,117, + 101,32,105,102,32,102,105,108,101,110,97,109,101,115,32,109, + 117,115,116,32,98,101,32,99,104,101,99,107,101,100,32,99, + 97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,108, + 121,46,70,78,114,7,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,21,0, + 0,0,70,0,0,0,115,4,0,0,0,4,2,255,128,41, + 5,114,15,0,0,0,218,8,112,108,97,116,102,111,114,109, + 218,10,115,116,97,114,116,115,119,105,116,104,218,27,95,67, + 65,83,69,95,73,78,83,69,78,83,73,84,73,86,69,95, + 80,76,65,84,70,79,82,77,83,218,35,95,67,65,83,69, + 95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,65, + 84,70,79,82,77,83,95,83,84,82,95,75,69,89,41,1, + 114,21,0,0,0,114,7,0,0,0,114,19,0,0,0,114, + 8,0,0,0,218,16,95,109,97,107,101,95,114,101,108,97, + 120,95,99,97,115,101,59,0,0,0,115,18,0,0,0,12, + 1,12,1,6,1,4,2,12,2,4,7,8,253,4,3,255, + 128,114,26,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, + 20,0,0,0,116,0,124,0,131,1,100,1,64,0,160,1, + 100,2,100,3,161,2,83,0,41,5,122,42,67,111,110,118, + 101,114,116,32,97,32,51,50,45,98,105,116,32,105,110,116, + 101,103,101,114,32,116,111,32,108,105,116,116,108,101,45,101, + 110,100,105,97,110,46,236,3,0,0,0,255,127,255,127,3, + 0,233,4,0,0,0,218,6,108,105,116,116,108,101,78,41, + 2,218,3,105,110,116,218,8,116,111,95,98,121,116,101,115, + 41,1,218,1,120,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,12,95,112,97,99,107,95,117,105,110,116, + 51,50,78,0,0,0,115,4,0,0,0,20,2,255,128,114, + 33,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,67,0,0,0,115,28,0, + 0,0,116,0,124,0,131,1,100,1,107,2,115,16,74,0, + 130,1,116,1,160,2,124,0,100,2,161,2,83,0,41,4, + 122,47,67,111,110,118,101,114,116,32,52,32,98,121,116,101, + 115,32,105,110,32,108,105,116,116,108,101,45,101,110,100,105, + 97,110,32,116,111,32,97,110,32,105,110,116,101,103,101,114, + 46,114,28,0,0,0,114,29,0,0,0,78,169,3,114,4, + 0,0,0,114,30,0,0,0,218,10,102,114,111,109,95,98, + 121,116,101,115,169,1,218,4,100,97,116,97,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,14,95,117,110, + 112,97,99,107,95,117,105,110,116,51,50,83,0,0,0,115, + 6,0,0,0,16,2,12,1,255,128,114,38,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 4,0,0,0,67,0,0,0,115,28,0,0,0,116,0,124, + 0,131,1,100,1,107,2,115,16,74,0,130,1,116,1,160, + 2,124,0,100,2,161,2,83,0,41,4,122,47,67,111,110, + 118,101,114,116,32,50,32,98,121,116,101,115,32,105,110,32, + 108,105,116,116,108,101,45,101,110,100,105,97,110,32,116,111, + 32,97,110,32,105,110,116,101,103,101,114,46,233,2,0,0, + 0,114,29,0,0,0,78,114,34,0,0,0,114,36,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,14,95,117,110,112,97,99,107,95,117,105,110,116,49,54, + 88,0,0,0,115,6,0,0,0,16,2,12,1,255,128,114, + 40,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,71,0,0,0,115,20,0, + 0,0,116,0,160,1,100,1,100,2,132,0,124,0,68,0, + 131,1,161,1,83,0,41,4,122,31,82,101,112,108,97,99, 101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,116, - 104,46,115,112,108,105,116,40,41,46,233,1,0,0,0,41, - 1,90,8,109,97,120,115,112,108,105,116,218,0,78,41,6, - 114,23,0,0,0,114,31,0,0,0,218,10,114,112,97,114, - 116,105,116,105,111,110,114,35,0,0,0,218,8,114,101,118, - 101,114,115,101,100,218,6,114,115,112,108,105,116,41,5,218, - 4,112,97,116,104,90,5,102,114,111,110,116,218,1,95,218, - 4,116,97,105,108,114,20,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,11,95,112,97,116,104, - 95,115,112,108,105,116,68,0,0,0,115,18,0,0,0,12, - 2,16,1,8,1,12,1,8,1,18,1,12,1,8,1,255, - 128,114,47,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 10,0,0,0,116,0,160,1,124,0,161,1,83,0,41,2, - 122,126,83,116,97,116,32,116,104,101,32,112,97,116,104,46, - 10,10,32,32,32,32,77,97,100,101,32,97,32,115,101,112, - 97,114,97,116,101,32,102,117,110,99,116,105,111,110,32,116, - 111,32,109,97,107,101,32,105,116,32,101,97,115,105,101,114, - 32,116,111,32,111,118,101,114,114,105,100,101,32,105,110,32, - 101,120,112,101,114,105,109,101,110,116,115,10,32,32,32,32, - 40,101,46,103,46,32,99,97,99,104,101,32,115,116,97,116, - 32,114,101,115,117,108,116,115,41,46,10,10,32,32,32,32, - 78,41,2,114,4,0,0,0,90,4,115,116,97,116,169,1, - 114,44,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,10,95,112,97,116,104,95,115,116,97,116, - 80,0,0,0,115,4,0,0,0,10,7,255,128,114,49,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,8,0,0,0,67,0,0,0,115,48,0,0,0, - 122,12,116,0,124,0,131,1,125,2,87,0,110,20,4,0, - 116,1,121,32,1,0,1,0,1,0,89,0,100,1,83,0, - 48,0,124,2,106,2,100,2,64,0,124,1,107,2,83,0, - 41,4,122,49,84,101,115,116,32,119,104,101,116,104,101,114, - 32,116,104,101,32,112,97,116,104,32,105,115,32,116,104,101, - 32,115,112,101,99,105,102,105,101,100,32,109,111,100,101,32, - 116,121,112,101,46,70,105,0,240,0,0,78,41,3,114,49, - 0,0,0,218,7,79,83,69,114,114,111,114,218,7,115,116, - 95,109,111,100,101,41,3,114,44,0,0,0,218,4,109,111, - 100,101,90,9,115,116,97,116,95,105,110,102,111,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,18,95,112, - 97,116,104,95,105,115,95,109,111,100,101,95,116,121,112,101, - 90,0,0,0,115,12,0,0,0,2,2,12,1,12,1,8, - 1,14,1,255,128,114,53,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, - 0,0,0,115,10,0,0,0,116,0,124,0,100,1,131,2, - 83,0,41,3,122,31,82,101,112,108,97,99,101,109,101,110, - 116,32,102,111,114,32,111,115,46,112,97,116,104,46,105,115, - 102,105,108,101,46,105,0,128,0,0,78,41,1,114,53,0, - 0,0,114,48,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,218,12,95,112,97,116,104,95,105,115, - 102,105,108,101,99,0,0,0,115,4,0,0,0,10,2,255, - 128,114,54,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 22,0,0,0,124,0,115,12,116,0,160,1,161,0,125,0, - 116,2,124,0,100,1,131,2,83,0,41,3,122,30,82,101, + 104,46,106,111,105,110,40,41,46,99,1,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,5,0,0,0,83,0, + 0,0,115,26,0,0,0,103,0,124,0,93,18,125,1,124, + 1,114,4,124,1,160,0,116,1,161,1,145,2,113,4,83, + 0,114,7,0,0,0,41,2,218,6,114,115,116,114,105,112, + 218,15,112,97,116,104,95,115,101,112,97,114,97,116,111,114, + 115,41,2,114,5,0,0,0,218,4,112,97,114,116,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,10,60, + 108,105,115,116,99,111,109,112,62,96,0,0,0,115,8,0, + 0,0,6,0,6,1,14,255,255,128,122,30,95,112,97,116, + 104,95,106,111,105,110,46,60,108,111,99,97,108,115,62,46, + 60,108,105,115,116,99,111,109,112,62,78,41,2,218,8,112, + 97,116,104,95,115,101,112,218,4,106,111,105,110,41,1,218, + 10,112,97,116,104,95,112,97,114,116,115,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,10,95,112,97,116, + 104,95,106,111,105,110,94,0,0,0,115,8,0,0,0,10, + 2,2,1,8,255,255,128,114,48,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0, + 0,67,0,0,0,115,94,0,0,0,116,0,116,1,131,1, + 100,1,107,2,114,36,124,0,160,2,116,3,161,1,92,3, + 125,1,125,2,125,3,124,1,124,3,102,2,83,0,116,4, + 124,0,131,1,68,0,93,40,125,4,124,4,116,1,118,0, + 114,44,124,0,106,5,124,4,100,1,100,2,141,2,92,2, + 125,1,125,3,124,1,124,3,102,2,2,0,1,0,83,0, + 100,3,124,0,102,2,83,0,41,5,122,32,82,101,112,108, + 97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,112, + 97,116,104,46,115,112,108,105,116,40,41,46,114,3,0,0, + 0,41,1,90,8,109,97,120,115,112,108,105,116,114,10,0, + 0,0,78,41,6,114,4,0,0,0,114,42,0,0,0,218, + 10,114,112,97,114,116,105,116,105,111,110,114,45,0,0,0, + 218,8,114,101,118,101,114,115,101,100,218,6,114,115,112,108, + 105,116,41,5,218,4,112,97,116,104,90,5,102,114,111,110, + 116,218,1,95,218,4,116,97,105,108,114,32,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11, + 95,112,97,116,104,95,115,112,108,105,116,100,0,0,0,115, + 18,0,0,0,12,2,16,1,8,1,12,1,8,1,18,1, + 12,1,8,1,255,128,114,55,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,10,0,0,0,116,0,160,1,124,0,161, + 1,83,0,41,2,122,126,83,116,97,116,32,116,104,101,32, + 112,97,116,104,46,10,10,32,32,32,32,77,97,100,101,32, + 97,32,115,101,112,97,114,97,116,101,32,102,117,110,99,116, + 105,111,110,32,116,111,32,109,97,107,101,32,105,116,32,101, + 97,115,105,101,114,32,116,111,32,111,118,101,114,114,105,100, + 101,32,105,110,32,101,120,112,101,114,105,109,101,110,116,115, + 10,32,32,32,32,40,101,46,103,46,32,99,97,99,104,101, + 32,115,116,97,116,32,114,101,115,117,108,116,115,41,46,10, + 10,32,32,32,32,78,41,2,114,18,0,0,0,90,4,115, + 116,97,116,169,1,114,52,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,10,95,112,97,116,104, + 95,115,116,97,116,112,0,0,0,115,4,0,0,0,10,7, + 255,128,114,57,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,0, + 115,48,0,0,0,122,12,116,0,124,0,131,1,125,2,87, + 0,110,20,4,0,116,1,121,32,1,0,1,0,1,0,89, + 0,100,1,83,0,48,0,124,2,106,2,100,2,64,0,124, + 1,107,2,83,0,41,4,122,49,84,101,115,116,32,119,104, + 101,116,104,101,114,32,116,104,101,32,112,97,116,104,32,105, + 115,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, + 109,111,100,101,32,116,121,112,101,46,70,105,0,240,0,0, + 78,41,3,114,57,0,0,0,218,7,79,83,69,114,114,111, + 114,218,7,115,116,95,109,111,100,101,41,3,114,52,0,0, + 0,218,4,109,111,100,101,90,9,115,116,97,116,95,105,110, + 102,111,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,18,95,112,97,116,104,95,105,115,95,109,111,100,101, + 95,116,121,112,101,122,0,0,0,115,12,0,0,0,2,2, + 12,1,12,1,8,1,14,1,255,128,114,61,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,124, + 0,100,1,131,2,83,0,41,3,122,31,82,101,112,108,97, + 99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,97, + 116,104,46,105,115,102,105,108,101,46,105,0,128,0,0,78, + 41,1,114,61,0,0,0,114,56,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,12,95,112,97, + 116,104,95,105,115,102,105,108,101,131,0,0,0,115,4,0, + 0,0,10,2,255,128,114,62,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,22,0,0,0,124,0,115,12,116,0,160, + 1,161,0,125,0,116,2,124,0,100,1,131,2,83,0,41, + 3,122,30,82,101,112,108,97,99,101,109,101,110,116,32,102, + 111,114,32,111,115,46,112,97,116,104,46,105,115,100,105,114, + 46,105,0,64,0,0,78,41,3,114,18,0,0,0,218,6, + 103,101,116,99,119,100,114,61,0,0,0,114,56,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 11,95,112,97,116,104,95,105,115,100,105,114,136,0,0,0, + 115,8,0,0,0,4,2,8,1,10,1,255,128,114,64,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,26,0,0,0, + 124,0,160,0,116,1,161,1,112,24,124,0,100,1,100,2, + 133,2,25,0,116,2,118,0,83,0,41,4,122,142,82,101, 112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,115, - 46,112,97,116,104,46,105,115,100,105,114,46,105,0,64,0, - 0,78,41,3,114,4,0,0,0,218,6,103,101,116,99,119, - 100,114,53,0,0,0,114,48,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,218,11,95,112,97,116, - 104,95,105,115,100,105,114,104,0,0,0,115,8,0,0,0, - 4,2,8,1,10,1,255,128,114,56,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,26,0,0,0,124,0,160,0,116, - 1,161,1,112,24,124,0,100,1,100,2,133,2,25,0,116, - 2,118,0,83,0,41,4,122,142,82,101,112,108,97,99,101, - 109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,104, - 46,105,115,97,98,115,46,10,10,32,32,32,32,67,111,110, - 115,105,100,101,114,115,32,97,32,87,105,110,100,111,119,115, - 32,100,114,105,118,101,45,114,101,108,97,116,105,118,101,32, - 112,97,116,104,32,40,110,111,32,100,114,105,118,101,44,32, - 98,117,116,32,115,116,97,114,116,115,32,119,105,116,104,32, - 115,108,97,115,104,41,32,116,111,10,32,32,32,32,115,116, - 105,108,108,32,98,101,32,34,97,98,115,111,108,117,116,101, - 34,46,10,32,32,32,32,114,39,0,0,0,233,3,0,0, - 0,78,41,3,114,11,0,0,0,114,31,0,0,0,218,20, - 95,112,97,116,104,115,101,112,115,95,119,105,116,104,95,99, - 111,108,111,110,114,48,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, - 105,115,97,98,115,111,0,0,0,115,4,0,0,0,26,6, - 255,128,114,59,0,0,0,233,182,1,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,11,0,0, - 0,67,0,0,0,115,170,0,0,0,100,1,160,0,124,0, - 116,1,124,0,131,1,161,2,125,3,116,2,160,3,124,3, - 116,2,106,4,116,2,106,5,66,0,116,2,106,6,66,0, - 124,2,100,2,64,0,161,3,125,4,122,72,116,7,160,8, - 124,4,100,3,161,2,143,26,125,5,124,5,160,9,124,1, - 161,1,1,0,87,0,100,4,4,0,4,0,131,3,1,0, - 110,16,49,0,115,94,48,0,1,0,1,0,1,0,89,0, - 1,0,116,2,160,10,124,3,124,0,161,2,1,0,87,0, - 100,4,83,0,4,0,116,11,121,168,1,0,1,0,1,0, - 122,14,116,2,160,12,124,3,161,1,1,0,87,0,130,0, - 4,0,116,11,121,166,1,0,1,0,1,0,89,0,130,0, - 48,0,48,0,41,5,122,162,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,250,5,123,125,46,123, - 125,114,60,0,0,0,90,2,119,98,78,41,13,218,6,102, - 111,114,109,97,116,218,2,105,100,114,4,0,0,0,90,4, - 111,112,101,110,90,6,79,95,69,88,67,76,90,7,79,95, - 67,82,69,65,84,90,8,79,95,87,82,79,78,76,89,218, - 3,95,105,111,218,6,70,105,108,101,73,79,218,5,119,114, - 105,116,101,218,7,114,101,112,108,97,99,101,114,50,0,0, - 0,90,6,117,110,108,105,110,107,41,6,114,44,0,0,0, - 114,26,0,0,0,114,52,0,0,0,90,8,112,97,116,104, - 95,116,109,112,90,2,102,100,218,4,102,105,108,101,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,218,13,95, - 119,114,105,116,101,95,97,116,111,109,105,99,120,0,0,0, - 115,38,0,0,0,16,5,6,1,22,1,4,255,2,2,14, - 3,40,1,14,1,4,128,12,1,2,1,12,1,2,3,12, - 254,2,1,2,1,2,255,2,1,255,128,114,69,0,0,0, - 105,103,13,0,0,114,28,0,0,0,114,17,0,0,0,115, - 2,0,0,0,13,10,90,11,95,95,112,121,99,97,99,104, - 101,95,95,122,4,111,112,116,45,122,3,46,112,121,122,4, - 46,112,121,99,78,41,1,218,12,111,112,116,105,109,105,122, - 97,116,105,111,110,99,2,0,0,0,0,0,0,0,1,0, - 0,0,12,0,0,0,5,0,0,0,67,0,0,0,115,88, - 1,0,0,124,1,100,1,117,1,114,52,116,0,160,1,100, - 2,116,2,161,2,1,0,124,2,100,1,117,1,114,40,100, - 3,125,3,116,3,124,3,131,1,130,1,124,1,114,48,100, - 4,110,2,100,5,125,2,116,4,160,5,124,0,161,1,125, - 0,116,6,124,0,131,1,92,2,125,4,125,5,124,5,160, - 7,100,6,161,1,92,3,125,6,125,7,125,8,116,8,106, - 9,106,10,125,9,124,9,100,1,117,0,114,114,116,11,100, - 7,131,1,130,1,100,4,160,12,124,6,114,126,124,6,110, - 2,124,8,124,7,124,9,103,3,161,1,125,10,124,2,100, - 1,117,0,114,172,116,8,106,13,106,14,100,8,107,2,114, - 164,100,4,125,2,110,8,116,8,106,13,106,14,125,2,116, - 15,124,2,131,1,125,2,124,2,100,4,107,3,114,224,124, - 2,160,16,161,0,115,210,116,17,100,9,160,18,124,2,161, - 1,131,1,130,1,100,10,160,18,124,10,116,19,124,2,161, - 3,125,10,124,10,116,20,100,8,25,0,23,0,125,11,116, - 8,106,21,100,1,117,1,144,1,114,76,116,22,124,4,131, - 1,144,1,115,16,116,23,116,4,160,24,161,0,124,4,131, - 2,125,4,124,4,100,5,25,0,100,11,107,2,144,1,114, - 56,124,4,100,8,25,0,116,25,118,1,144,1,114,56,124, - 4,100,12,100,1,133,2,25,0,125,4,116,23,116,8,106, - 21,124,4,160,26,116,25,161,1,124,11,131,3,83,0,116, - 23,124,4,116,27,124,11,131,3,83,0,41,13,97,254,2, - 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,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,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,10,10,32,32,32,32, - 84,104,101,32,39,111,112,116,105,109,105,122,97,116,105,111, - 110,39,32,112,97,114,97,109,101,116,101,114,32,99,111,110, - 116,114,111,108,115,32,116,104,101,32,112,114,101,115,117,109, - 101,100,32,111,112,116,105,109,105,122,97,116,105,111,110,32, - 108,101,118,101,108,32,111,102,10,32,32,32,32,116,104,101, - 32,98,121,116,101,99,111,100,101,32,102,105,108,101,46,32, - 73,102,32,39,111,112,116,105,109,105,122,97,116,105,111,110, - 39,32,105,115,32,110,111,116,32,78,111,110,101,44,32,116, - 104,101,32,115,116,114,105,110,103,32,114,101,112,114,101,115, - 101,110,116,97,116,105,111,110,10,32,32,32,32,111,102,32, - 116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,32, - 116,97,107,101,110,32,97,110,100,32,118,101,114,105,102,105, - 101,100,32,116,111,32,98,101,32,97,108,112,104,97,110,117, - 109,101,114,105,99,32,40,101,108,115,101,32,86,97,108,117, - 101,69,114,114,111,114,10,32,32,32,32,105,115,32,114,97, - 105,115,101,100,41,46,10,10,32,32,32,32,84,104,101,32, - 100,101,98,117,103,95,111,118,101,114,114,105,100,101,32,112, - 97,114,97,109,101,116,101,114,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,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,10,32,32,32,32,97,32,84,114,117, - 101,32,118,97,108,117,101,32,105,115,32,116,104,101,32,115, - 97,109,101,32,97,115,32,115,101,116,116,105,110,103,32,39, - 111,112,116,105,109,105,122,97,116,105,111,110,39,32,116,111, - 32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110, - 103,10,32,32,32,32,119,104,105,108,101,32,97,32,70,97, - 108,115,101,32,118,97,108,117,101,32,105,115,32,101,113,117, - 105,118,97,108,101,110,116,32,116,111,32,115,101,116,116,105, - 110,103,32,39,111,112,116,105,109,105,122,97,116,105,111,110, - 39,32,116,111,32,39,49,39,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,122,70,116,104,101,32,100,101,98,117,103,95,111,118,101, - 114,114,105,100,101,32,112,97,114,97,109,101,116,101,114,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,117, - 115,101,32,39,111,112,116,105,109,105,122,97,116,105,111,110, - 39,32,105,110,115,116,101,97,100,122,50,100,101,98,117,103, - 95,111,118,101,114,114,105,100,101,32,111,114,32,111,112,116, - 105,109,105,122,97,116,105,111,110,32,109,117,115,116,32,98, - 101,32,115,101,116,32,116,111,32,78,111,110,101,114,40,0, - 0,0,114,39,0,0,0,218,1,46,250,36,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, - 233,0,0,0,0,122,24,123,33,114,125,32,105,115,32,110, - 111,116,32,97,108,112,104,97,110,117,109,101,114,105,99,122, - 7,123,125,46,123,125,123,125,250,1,58,114,28,0,0,0, - 41,28,218,9,95,119,97,114,110,105,110,103,115,218,4,119, - 97,114,110,218,18,68,101,112,114,101,99,97,116,105,111,110, - 87,97,114,110,105,110,103,218,9,84,121,112,101,69,114,114, - 111,114,114,4,0,0,0,218,6,102,115,112,97,116,104,114, - 47,0,0,0,114,41,0,0,0,114,1,0,0,0,218,14, - 105,109,112,108,101,109,101,110,116,97,116,105,111,110,218,9, - 99,97,99,104,101,95,116,97,103,218,19,78,111,116,73,109, - 112,108,101,109,101,110,116,101,100,69,114,114,111,114,114,36, - 0,0,0,114,2,0,0,0,218,8,111,112,116,105,109,105, - 122,101,218,3,115,116,114,218,7,105,115,97,108,110,117,109, - 218,10,86,97,108,117,101,69,114,114,111,114,114,62,0,0, - 0,218,4,95,79,80,84,218,17,66,89,84,69,67,79,68, - 69,95,83,85,70,70,73,88,69,83,218,14,112,121,99,97, - 99,104,101,95,112,114,101,102,105,120,114,59,0,0,0,114, - 38,0,0,0,114,55,0,0,0,114,31,0,0,0,218,6, - 108,115,116,114,105,112,218,8,95,80,89,67,65,67,72,69, - 41,12,114,44,0,0,0,90,14,100,101,98,117,103,95,111, - 118,101,114,114,105,100,101,114,70,0,0,0,218,7,109,101, - 115,115,97,103,101,218,4,104,101,97,100,114,46,0,0,0, - 90,4,98,97,115,101,218,3,115,101,112,218,4,114,101,115, - 116,90,3,116,97,103,90,15,97,108,109,111,115,116,95,102, - 105,108,101,110,97,109,101,218,8,102,105,108,101,110,97,109, - 101,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,17,99,97,99,104,101,95,102,114,111,109,95,115,111,117, - 114,99,101,47,1,0,0,115,74,0,0,0,8,18,6,1, - 2,1,4,255,8,2,4,1,8,1,12,1,10,1,12,1, - 16,1,8,1,8,1,8,1,24,1,8,1,12,1,6,1, - 8,2,8,1,8,1,8,1,14,1,14,1,12,1,12,1, - 10,9,14,1,28,5,12,1,2,4,4,1,8,1,2,1, - 4,253,12,5,255,128,114,97,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,10,0,0,0,5,0,0,0, - 67,0,0,0,115,44,1,0,0,116,0,106,1,106,2,100, - 1,117,0,114,20,116,3,100,2,131,1,130,1,116,4,160, - 5,124,0,161,1,125,0,116,6,124,0,131,1,92,2,125, - 1,125,2,100,3,125,3,116,0,106,7,100,1,117,1,114, - 102,116,0,106,7,160,8,116,9,161,1,125,4,124,1,160, - 10,124,4,116,11,23,0,161,1,114,102,124,1,116,12,124, - 4,131,1,100,1,133,2,25,0,125,1,100,4,125,3,124, - 3,115,144,116,6,124,1,131,1,92,2,125,1,125,5,124, - 5,116,13,107,3,114,144,116,14,116,13,155,0,100,5,124, - 0,155,2,157,3,131,1,130,1,124,2,160,15,100,6,161, - 1,125,6,124,6,100,7,118,1,114,176,116,14,100,8,124, - 2,155,2,157,2,131,1,130,1,124,6,100,9,107,2,144, - 1,114,12,124,2,160,16,100,6,100,10,161,2,100,11,25, - 0,125,7,124,7,160,10,116,17,161,1,115,226,116,14,100, - 12,116,17,155,2,157,2,131,1,130,1,124,7,116,12,116, - 17,131,1,100,1,133,2,25,0,125,8,124,8,160,18,161, - 0,144,1,115,12,116,14,100,13,124,7,155,2,100,14,157, - 3,131,1,130,1,124,2,160,19,100,6,161,1,100,15,25, - 0,125,9,116,20,124,1,124,9,116,21,100,15,25,0,23, - 0,131,2,83,0,41,16,97,110,1,0,0,71,105,118,101, + 46,112,97,116,104,46,105,115,97,98,115,46,10,10,32,32, + 32,32,67,111,110,115,105,100,101,114,115,32,97,32,87,105, + 110,100,111,119,115,32,100,114,105,118,101,45,114,101,108,97, + 116,105,118,101,32,112,97,116,104,32,40,110,111,32,100,114, + 105,118,101,44,32,98,117,116,32,115,116,97,114,116,115,32, + 119,105,116,104,32,115,108,97,115,104,41,32,116,111,10,32, + 32,32,32,115,116,105,108,108,32,98,101,32,34,97,98,115, + 111,108,117,116,101,34,46,10,32,32,32,32,114,3,0,0, + 0,233,3,0,0,0,78,41,3,114,23,0,0,0,114,42, + 0,0,0,218,20,95,112,97,116,104,115,101,112,115,95,119, + 105,116,104,95,99,111,108,111,110,114,56,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, + 112,97,116,104,95,105,115,97,98,115,143,0,0,0,115,4, + 0,0,0,26,6,255,128,114,67,0,0,0,233,182,1,0, + 0,99,3,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,11,0,0,0,67,0,0,0,115,170,0,0,0,100, + 1,160,0,124,0,116,1,124,0,131,1,161,2,125,3,116, + 2,160,3,124,3,116,2,106,4,116,2,106,5,66,0,116, + 2,106,6,66,0,124,2,100,2,64,0,161,3,125,4,122, + 72,116,7,160,8,124,4,100,3,161,2,143,26,125,5,124, + 5,160,9,124,1,161,1,1,0,87,0,100,4,4,0,4, + 0,131,3,1,0,110,16,49,0,115,94,48,0,1,0,1, + 0,1,0,89,0,1,0,116,2,160,10,124,3,124,0,161, + 2,1,0,87,0,100,4,83,0,4,0,116,11,121,168,1, + 0,1,0,1,0,122,14,116,2,160,12,124,3,161,1,1, + 0,87,0,130,0,4,0,116,11,121,166,1,0,1,0,1, + 0,89,0,130,0,48,0,48,0,41,5,122,162,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,250, + 5,123,125,46,123,125,114,68,0,0,0,90,2,119,98,78, + 41,13,218,6,102,111,114,109,97,116,218,2,105,100,114,18, + 0,0,0,90,4,111,112,101,110,90,6,79,95,69,88,67, + 76,90,7,79,95,67,82,69,65,84,90,8,79,95,87,82, + 79,78,76,89,218,3,95,105,111,218,6,70,105,108,101,73, + 79,218,5,119,114,105,116,101,218,7,114,101,112,108,97,99, + 101,114,58,0,0,0,90,6,117,110,108,105,110,107,41,6, + 114,52,0,0,0,114,37,0,0,0,114,60,0,0,0,90, + 8,112,97,116,104,95,116,109,112,90,2,102,100,218,4,102, + 105,108,101,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,13,95,119,114,105,116,101,95,97,116,111,109,105, + 99,152,0,0,0,115,38,0,0,0,16,5,6,1,22,1, + 4,255,2,2,14,3,40,1,14,1,4,128,12,1,2,1, + 12,1,2,3,12,254,2,1,2,1,2,255,2,1,255,128, + 114,77,0,0,0,105,103,13,0,0,114,39,0,0,0,114, + 29,0,0,0,115,2,0,0,0,13,10,90,11,95,95,112, + 121,99,97,99,104,101,95,95,122,4,111,112,116,45,122,3, + 46,112,121,122,4,46,112,121,119,122,4,46,112,121,99,41, + 1,218,12,111,112,116,105,109,105,122,97,116,105,111,110,99, + 2,0,0,0,0,0,0,0,1,0,0,0,12,0,0,0, + 5,0,0,0,67,0,0,0,115,88,1,0,0,124,1,100, + 1,117,1,114,52,116,0,160,1,100,2,116,2,161,2,1, + 0,124,2,100,1,117,1,114,40,100,3,125,3,116,3,124, + 3,131,1,130,1,124,1,114,48,100,4,110,2,100,5,125, + 2,116,4,160,5,124,0,161,1,125,0,116,6,124,0,131, + 1,92,2,125,4,125,5,124,5,160,7,100,6,161,1,92, + 3,125,6,125,7,125,8,116,8,106,9,106,10,125,9,124, + 9,100,1,117,0,114,114,116,11,100,7,131,1,130,1,100, + 4,160,12,124,6,114,126,124,6,110,2,124,8,124,7,124, + 9,103,3,161,1,125,10,124,2,100,1,117,0,114,172,116, + 8,106,13,106,14,100,8,107,2,114,164,100,4,125,2,110, + 8,116,8,106,13,106,14,125,2,116,15,124,2,131,1,125, + 2,124,2,100,4,107,3,114,224,124,2,160,16,161,0,115, + 210,116,17,100,9,160,18,124,2,161,1,131,1,130,1,100, + 10,160,18,124,10,116,19,124,2,161,3,125,10,124,10,116, + 20,100,8,25,0,23,0,125,11,116,8,106,21,100,1,117, + 1,144,1,114,76,116,22,124,4,131,1,144,1,115,16,116, + 23,116,4,160,24,161,0,124,4,131,2,125,4,124,4,100, + 5,25,0,100,11,107,2,144,1,114,56,124,4,100,8,25, + 0,116,25,118,1,144,1,114,56,124,4,100,12,100,1,133, + 2,25,0,125,4,116,23,116,8,106,21,124,4,160,26,116, + 25,161,1,124,11,131,3,83,0,116,23,124,4,116,27,124, + 11,131,3,83,0,41,13,97,254,2,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,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,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,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,47,52,56, - 56,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, + 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,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,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,10,10,32,32,32,32,84,104,101,32,39,111, + 112,116,105,109,105,122,97,116,105,111,110,39,32,112,97,114, + 97,109,101,116,101,114,32,99,111,110,116,114,111,108,115,32, + 116,104,101,32,112,114,101,115,117,109,101,100,32,111,112,116, + 105,109,105,122,97,116,105,111,110,32,108,101,118,101,108,32, + 111,102,10,32,32,32,32,116,104,101,32,98,121,116,101,99, + 111,100,101,32,102,105,108,101,46,32,73,102,32,39,111,112, + 116,105,109,105,122,97,116,105,111,110,39,32,105,115,32,110, + 111,116,32,78,111,110,101,44,32,116,104,101,32,115,116,114, + 105,110,103,32,114,101,112,114,101,115,101,110,116,97,116,105, + 111,110,10,32,32,32,32,111,102,32,116,104,101,32,97,114, + 103,117,109,101,110,116,32,105,115,32,116,97,107,101,110,32, + 97,110,100,32,118,101,114,105,102,105,101,100,32,116,111,32, + 98,101,32,97,108,112,104,97,110,117,109,101,114,105,99,32, + 40,101,108,115,101,32,86,97,108,117,101,69,114,114,111,114, + 10,32,32,32,32,105,115,32,114,97,105,115,101,100,41,46, + 10,10,32,32,32,32,84,104,101,32,100,101,98,117,103,95, + 111,118,101,114,114,105,100,101,32,112,97,114,97,109,101,116, + 101,114,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,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, + 10,32,32,32,32,97,32,84,114,117,101,32,118,97,108,117, + 101,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115, + 32,115,101,116,116,105,110,103,32,39,111,112,116,105,109,105, + 122,97,116,105,111,110,39,32,116,111,32,116,104,101,32,101, + 109,112,116,121,32,115,116,114,105,110,103,10,32,32,32,32, + 119,104,105,108,101,32,97,32,70,97,108,115,101,32,118,97, + 108,117,101,32,105,115,32,101,113,117,105,118,97,108,101,110, + 116,32,116,111,32,115,101,116,116,105,110,103,32,39,111,112, + 116,105,109,105,122,97,116,105,111,110,39,32,116,111,32,39, + 49,39,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,114,72,0,0,0, - 70,84,122,31,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,114,71,0,0,0,62,2,0,0,0,114,28,0, - 0,0,114,57,0,0,0,122,29,101,120,112,101,99,116,101, - 100,32,111,110,108,121,32,50,32,111,114,32,51,32,100,111, - 116,115,32,105,110,32,114,57,0,0,0,114,28,0,0,0, - 233,254,255,255,255,122,53,111,112,116,105,109,105,122,97,116, - 105,111,110,32,112,111,114,116,105,111,110,32,111,102,32,102, - 105,108,101,110,97,109,101,32,100,111,101,115,32,110,111,116, - 32,115,116,97,114,116,32,119,105,116,104,32,122,19,111,112, - 116,105,109,105,122,97,116,105,111,110,32,108,101,118,101,108, - 32,122,29,32,105,115,32,110,111,116,32,97,110,32,97,108, - 112,104,97,110,117,109,101,114,105,99,32,118,97,108,117,101, - 114,73,0,0,0,41,22,114,1,0,0,0,114,80,0,0, - 0,114,81,0,0,0,114,82,0,0,0,114,4,0,0,0, - 114,79,0,0,0,114,47,0,0,0,114,89,0,0,0,114, - 30,0,0,0,114,31,0,0,0,114,11,0,0,0,114,35, - 0,0,0,114,23,0,0,0,114,91,0,0,0,114,86,0, - 0,0,218,5,99,111,117,110,116,114,43,0,0,0,114,87, - 0,0,0,114,85,0,0,0,218,9,112,97,114,116,105,116, - 105,111,110,114,38,0,0,0,218,15,83,79,85,82,67,69, - 95,83,85,70,70,73,88,69,83,41,10,114,44,0,0,0, - 114,93,0,0,0,90,16,112,121,99,97,99,104,101,95,102, - 105,108,101,110,97,109,101,90,23,102,111,117,110,100,95,105, - 110,95,112,121,99,97,99,104,101,95,112,114,101,102,105,120, - 90,13,115,116,114,105,112,112,101,100,95,112,97,116,104,90, - 7,112,121,99,97,99,104,101,90,9,100,111,116,95,99,111, - 117,110,116,114,70,0,0,0,90,9,111,112,116,95,108,101, - 118,101,108,90,13,98,97,115,101,95,102,105,108,101,110,97, - 109,101,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,17,115,111,117,114,99,101,95,102,114,111,109,95,99, - 97,99,104,101,118,1,0,0,115,62,0,0,0,12,9,8, - 1,10,1,12,1,4,1,10,1,12,1,14,1,16,1,4, - 1,4,1,12,1,8,1,8,1,2,1,8,255,10,2,8, - 1,14,1,10,1,16,1,10,1,4,1,2,1,8,255,16, - 2,10,1,16,1,14,2,18,1,255,128,114,102,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,9,0,0,0,67,0,0,0,115,124,0,0,0,116,0, - 124,0,131,1,100,1,107,2,114,16,100,2,83,0,124,0, - 160,1,100,3,161,1,92,3,125,1,125,2,125,3,124,1, - 114,56,124,3,160,2,161,0,100,4,100,5,133,2,25,0, - 100,6,107,3,114,60,124,0,83,0,122,12,116,3,124,0, - 131,1,125,4,87,0,110,34,4,0,116,4,116,5,102,2, - 121,106,1,0,1,0,1,0,124,0,100,2,100,5,133,2, - 25,0,125,4,89,0,110,2,48,0,116,6,124,4,131,1, - 114,120,124,4,83,0,124,0,83,0,41,7,122,188,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,114,73,0,0,0,78, - 114,71,0,0,0,233,253,255,255,255,233,255,255,255,255,90, - 2,112,121,41,7,114,23,0,0,0,114,41,0,0,0,218, - 5,108,111,119,101,114,114,102,0,0,0,114,82,0,0,0, - 114,86,0,0,0,114,54,0,0,0,41,5,218,13,98,121, - 116,101,99,111,100,101,95,112,97,116,104,114,95,0,0,0, - 114,45,0,0,0,90,9,101,120,116,101,110,115,105,111,110, - 218,11,115,111,117,114,99,101,95,112,97,116,104,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,15,95,103, - 101,116,95,115,111,117,114,99,101,102,105,108,101,158,1,0, - 0,115,22,0,0,0,12,7,4,1,16,1,24,1,4,1, - 2,1,12,1,16,1,18,1,16,1,255,128,114,108,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,8,0,0,0,67,0,0,0,115,68,0,0,0,124, - 0,160,0,116,1,116,2,131,1,161,1,114,46,122,10,116, - 3,124,0,131,1,87,0,83,0,4,0,116,4,121,44,1, - 0,1,0,1,0,89,0,100,0,83,0,48,0,124,0,160, - 0,116,1,116,5,131,1,161,1,114,64,124,0,83,0,100, - 0,83,0,169,1,78,41,6,218,8,101,110,100,115,119,105, - 116,104,218,5,116,117,112,108,101,114,101,0,0,0,114,97, - 0,0,0,114,82,0,0,0,114,88,0,0,0,41,1,114, - 96,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, - 177,1,0,0,115,22,0,0,0,14,1,2,1,10,1,12, - 1,2,1,4,128,2,0,14,1,4,1,4,2,255,128,114, - 112,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,8,0,0,0,67,0,0,0,115,50,0, - 0,0,122,14,116,0,124,0,131,1,106,1,125,1,87,0, - 110,22,4,0,116,2,121,36,1,0,1,0,1,0,100,1, - 125,1,89,0,110,2,48,0,124,1,100,2,79,0,125,1, - 124,1,83,0,41,4,122,51,67,97,108,99,117,108,97,116, - 101,32,116,104,101,32,109,111,100,101,32,112,101,114,109,105, - 115,115,105,111,110,115,32,102,111,114,32,97,32,98,121,116, - 101,99,111,100,101,32,102,105,108,101,46,114,60,0,0,0, - 233,128,0,0,0,78,41,3,114,49,0,0,0,114,51,0, - 0,0,114,50,0,0,0,41,2,114,44,0,0,0,114,52, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,10,95,99,97,108,99,95,109,111,100,101,189,1, - 0,0,115,14,0,0,0,2,2,14,1,12,1,10,1,8, - 3,4,1,255,128,114,114,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,3, - 0,0,0,115,66,0,0,0,100,6,135,0,102,1,100,2, - 100,3,132,9,125,1,122,10,116,0,106,1,125,2,87,0, - 110,26,4,0,116,2,121,50,1,0,1,0,1,0,100,4, - 100,5,132,0,125,2,89,0,110,2,48,0,124,2,124,1, - 136,0,131,2,1,0,124,1,83,0,41,7,122,252,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,0,0,0,0,4,0,0,0,4,0,0,0, - 31,0,0,0,115,72,0,0,0,124,1,100,0,117,0,114, - 16,124,0,106,0,125,1,110,32,124,0,106,0,124,1,107, - 3,114,48,116,1,100,1,124,0,106,0,124,1,102,2,22, - 0,124,1,100,2,141,2,130,1,136,0,124,0,124,1,103, - 2,124,2,162,1,82,0,105,0,124,3,164,1,142,1,83, - 0,41,3,78,122,30,108,111,97,100,101,114,32,102,111,114, - 32,37,115,32,99,97,110,110,111,116,32,104,97,110,100,108, - 101,32,37,115,169,1,218,4,110,97,109,101,41,2,114,116, - 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, - 41,4,218,4,115,101,108,102,114,116,0,0,0,218,4,97, - 114,103,115,218,6,107,119,97,114,103,115,169,1,218,6,109, - 101,116,104,111,100,114,5,0,0,0,114,8,0,0,0,218, - 19,95,99,104,101,99,107,95,110,97,109,101,95,119,114,97, - 112,112,101,114,209,1,0,0,115,20,0,0,0,8,1,8, - 1,10,1,4,1,8,1,2,255,2,1,6,255,24,2,255, - 128,122,40,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,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0, - 83,0,0,0,115,56,0,0,0,100,1,68,0,93,32,125, - 2,116,0,124,1,124,2,131,2,114,4,116,1,124,0,124, - 2,116,2,124,1,124,2,131,2,131,3,1,0,113,4,124, - 0,106,3,160,4,124,1,106,3,161,1,1,0,100,0,83, - 0,41,2,78,41,4,218,10,95,95,109,111,100,117,108,101, - 95,95,218,8,95,95,110,97,109,101,95,95,218,12,95,95, - 113,117,97,108,110,97,109,101,95,95,218,7,95,95,100,111, - 99,95,95,41,5,218,7,104,97,115,97,116,116,114,218,7, - 115,101,116,97,116,116,114,218,7,103,101,116,97,116,116,114, - 218,8,95,95,100,105,99,116,95,95,218,6,117,112,100,97, - 116,101,41,3,90,3,110,101,119,90,3,111,108,100,114,67, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,5,95,119,114,97,112,220,1,0,0,115,12,0, - 0,0,8,1,10,1,20,1,14,1,4,128,255,128,122,26, - 95,99,104,101,99,107,95,110,97,109,101,46,60,108,111,99, - 97,108,115,62,46,95,119,114,97,112,41,1,78,41,3,218, - 10,95,98,111,111,116,115,116,114,97,112,114,133,0,0,0, - 218,9,78,97,109,101,69,114,114,111,114,41,3,114,122,0, - 0,0,114,123,0,0,0,114,133,0,0,0,114,5,0,0, - 0,114,121,0,0,0,114,8,0,0,0,218,11,95,99,104, - 101,99,107,95,110,97,109,101,201,1,0,0,115,16,0,0, - 0,14,8,2,7,10,1,12,1,14,2,10,5,4,1,255, - 128,114,136,0,0,0,99,2,0,0,0,0,0,0,0,0, - 0,0,0,5,0,0,0,6,0,0,0,67,0,0,0,115, - 60,0,0,0,124,0,160,0,124,1,161,1,92,2,125,2, - 125,3,124,2,100,1,117,0,114,56,116,1,124,3,131,1, - 114,56,100,2,125,4,116,2,160,3,124,4,160,4,124,3, - 100,3,25,0,161,1,116,5,161,2,1,0,124,2,83,0, - 41,4,122,155,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,10,10,32,32,32,32, - 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,32,105,110,32,102,97,118, - 111,114,32,111,102,32,102,105,110,100,101,114,46,102,105,110, - 100,95,115,112,101,99,40,41,46,10,10,32,32,32,32,78, - 122,44,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,114,73, - 0,0,0,41,6,218,11,102,105,110,100,95,108,111,97,100, - 101,114,114,23,0,0,0,114,75,0,0,0,114,76,0,0, - 0,114,62,0,0,0,218,13,73,109,112,111,114,116,87,97, - 114,110,105,110,103,41,5,114,118,0,0,0,218,8,102,117, - 108,108,110,97,109,101,218,6,108,111,97,100,101,114,218,8, - 112,111,114,116,105,111,110,115,218,3,109,115,103,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,17,95,102, - 105,110,100,95,109,111,100,117,108,101,95,115,104,105,109,229, - 1,0,0,115,12,0,0,0,14,10,16,1,4,1,22,1, - 4,1,255,128,114,143,0,0,0,99,3,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,0, - 0,0,115,166,0,0,0,124,0,100,1,100,2,133,2,25, - 0,125,3,124,3,116,0,107,3,114,64,100,3,124,1,155, - 2,100,4,124,3,155,2,157,4,125,4,116,1,160,2,100, - 5,124,4,161,2,1,0,116,3,124,4,102,1,105,0,124, - 2,164,1,142,1,130,1,116,4,124,0,131,1,100,6,107, - 0,114,106,100,7,124,1,155,2,157,2,125,4,116,1,160, - 2,100,5,124,4,161,2,1,0,116,5,124,4,131,1,130, - 1,116,6,124,0,100,2,100,8,133,2,25,0,131,1,125, - 5,124,5,100,9,64,0,114,162,100,10,124,5,155,2,100, - 11,124,1,155,2,157,4,125,4,116,3,124,4,102,1,105, - 0,124,2,164,1,142,1,130,1,124,5,83,0,41,12,97, - 84,2,0,0,80,101,114,102,111,114,109,32,98,97,115,105, - 99,32,118,97,108,105,100,105,116,121,32,99,104,101,99,107, - 105,110,103,32,111,102,32,97,32,112,121,99,32,104,101,97, - 100,101,114,32,97,110,100,32,114,101,116,117,114,110,32,116, - 104,101,32,102,108,97,103,115,32,102,105,101,108,100,44,10, - 32,32,32,32,119,104,105,99,104,32,100,101,116,101,114,109, - 105,110,101,115,32,104,111,119,32,116,104,101,32,112,121,99, - 32,115,104,111,117,108,100,32,98,101,32,102,117,114,116,104, - 101,114,32,118,97,108,105,100,97,116,101,100,32,97,103,97, - 105,110,115,116,32,116,104,101,32,115,111,117,114,99,101,46, - 10,10,32,32,32,32,42,100,97,116,97,42,32,105,115,32, - 116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32, - 116,104,101,32,112,121,99,32,102,105,108,101,46,32,40,79, - 110,108,121,32,116,104,101,32,102,105,114,115,116,32,49,54, - 32,98,121,116,101,115,32,97,114,101,10,32,32,32,32,114, - 101,113,117,105,114,101,100,44,32,116,104,111,117,103,104,46, - 41,10,10,32,32,32,32,42,110,97,109,101,42,32,105,115, - 32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101, - 32,109,111,100,117,108,101,32,98,101,105,110,103,32,105,109, - 112,111,114,116,101,100,46,32,73,116,32,105,115,32,117,115, - 101,100,32,102,111,114,32,108,111,103,103,105,110,103,46,10, - 10,32,32,32,32,42,101,120,99,95,100,101,116,97,105,108, - 115,42,32,105,115,32,97,32,100,105,99,116,105,111,110,97, - 114,121,32,112,97,115,115,101,100,32,116,111,32,73,109,112, - 111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,114, - 97,105,115,101,100,32,102,111,114,10,32,32,32,32,105,109, - 112,114,111,118,101,100,32,100,101,98,117,103,103,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,119,104,101,110,32,116,104,101,32,102,108,97,103, - 115,10,32,32,32,32,102,105,101,108,100,32,105,115,32,105, - 110,118,97,108,105,100,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,32,116,114,117,110,99,97,116,101, - 100,46,10,10,32,32,32,32,78,114,16,0,0,0,122,20, - 98,97,100,32,109,97,103,105,99,32,110,117,109,98,101,114, - 32,105,110,32,122,2,58,32,250,2,123,125,233,16,0,0, - 0,122,40,114,101,97,99,104,101,100,32,69,79,70,32,119, - 104,105,108,101,32,114,101,97,100,105,110,103,32,112,121,99, - 32,104,101,97,100,101,114,32,111,102,32,233,8,0,0,0, - 233,252,255,255,255,122,14,105,110,118,97,108,105,100,32,102, - 108,97,103,115,32,122,4,32,105,110,32,41,7,218,12,77, - 65,71,73,67,95,78,85,77,66,69,82,114,134,0,0,0, - 218,16,95,118,101,114,98,111,115,101,95,109,101,115,115,97, - 103,101,114,117,0,0,0,114,23,0,0,0,218,8,69,79, - 70,69,114,114,111,114,114,27,0,0,0,41,6,114,26,0, - 0,0,114,116,0,0,0,218,11,101,120,99,95,100,101,116, - 97,105,108,115,90,5,109,97,103,105,99,114,92,0,0,0, - 114,2,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,13,95,99,108,97,115,115,105,102,121,95, - 112,121,99,246,1,0,0,115,30,0,0,0,12,16,8,1, - 16,1,12,1,16,1,12,1,10,1,12,1,8,1,16,1, - 8,2,16,1,16,1,4,1,255,128,114,152,0,0,0,99, - 5,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, - 4,0,0,0,67,0,0,0,115,120,0,0,0,116,0,124, - 0,100,1,100,2,133,2,25,0,131,1,124,1,100,3,64, - 0,107,3,114,62,100,4,124,3,155,2,157,2,125,5,116, - 1,160,2,100,5,124,5,161,2,1,0,116,3,124,5,102, - 1,105,0,124,4,164,1,142,1,130,1,124,2,100,6,117, - 1,114,116,116,0,124,0,100,2,100,7,133,2,25,0,131, - 1,124,2,100,3,64,0,107,3,114,116,116,3,100,4,124, - 3,155,2,157,2,102,1,105,0,124,4,164,1,142,1,130, - 1,100,6,83,0,41,8,97,7,2,0,0,86,97,108,105, - 100,97,116,101,32,97,32,112,121,99,32,97,103,97,105,110, - 115,116,32,116,104,101,32,115,111,117,114,99,101,32,108,97, - 115,116,45,109,111,100,105,102,105,101,100,32,116,105,109,101, + 115,101,100,46,10,10,32,32,32,32,78,122,70,116,104,101, + 32,100,101,98,117,103,95,111,118,101,114,114,105,100,101,32, + 112,97,114,97,109,101,116,101,114,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,59,32,117,115,101,32,39,111,112, + 116,105,109,105,122,97,116,105,111,110,39,32,105,110,115,116, + 101,97,100,122,50,100,101,98,117,103,95,111,118,101,114,114, + 105,100,101,32,111,114,32,111,112,116,105,109,105,122,97,116, + 105,111,110,32,109,117,115,116,32,98,101,32,115,101,116,32, + 116,111,32,78,111,110,101,114,10,0,0,0,114,3,0,0, + 0,218,1,46,250,36,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,114,0,0,0,0,122, + 24,123,33,114,125,32,105,115,32,110,111,116,32,97,108,112, + 104,97,110,117,109,101,114,105,99,122,7,123,125,46,123,125, + 123,125,114,11,0,0,0,114,39,0,0,0,41,28,218,9, + 95,119,97,114,110,105,110,103,115,218,4,119,97,114,110,218, + 18,68,101,112,114,101,99,97,116,105,111,110,87,97,114,110, + 105,110,103,218,9,84,121,112,101,69,114,114,111,114,114,18, + 0,0,0,218,6,102,115,112,97,116,104,114,55,0,0,0, + 114,49,0,0,0,114,15,0,0,0,218,14,105,109,112,108, + 101,109,101,110,116,97,116,105,111,110,218,9,99,97,99,104, + 101,95,116,97,103,218,19,78,111,116,73,109,112,108,101,109, + 101,110,116,101,100,69,114,114,111,114,114,46,0,0,0,114, + 16,0,0,0,218,8,111,112,116,105,109,105,122,101,218,3, + 115,116,114,218,7,105,115,97,108,110,117,109,218,10,86,97, + 108,117,101,69,114,114,111,114,114,70,0,0,0,218,4,95, + 79,80,84,218,17,66,89,84,69,67,79,68,69,95,83,85, + 70,70,73,88,69,83,218,14,112,121,99,97,99,104,101,95, + 112,114,101,102,105,120,114,67,0,0,0,114,48,0,0,0, + 114,63,0,0,0,114,42,0,0,0,218,6,108,115,116,114, + 105,112,218,8,95,80,89,67,65,67,72,69,41,12,114,52, + 0,0,0,90,14,100,101,98,117,103,95,111,118,101,114,114, + 105,100,101,114,78,0,0,0,218,7,109,101,115,115,97,103, + 101,218,4,104,101,97,100,114,54,0,0,0,90,4,98,97, + 115,101,114,6,0,0,0,218,4,114,101,115,116,90,3,116, + 97,103,90,15,97,108,109,111,115,116,95,102,105,108,101,110, + 97,109,101,218,8,102,105,108,101,110,97,109,101,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,17,99,97, + 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,83, + 1,0,0,115,74,0,0,0,8,18,6,1,2,1,4,255, + 8,2,4,1,8,1,12,1,10,1,12,1,16,1,8,1, + 8,1,8,1,24,1,8,1,12,1,6,1,8,2,8,1, + 8,1,8,1,14,1,14,1,12,1,12,1,10,9,14,1, + 28,5,12,1,2,4,4,1,8,1,2,1,4,253,12,5, + 255,128,114,102,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0, + 115,44,1,0,0,116,0,106,1,106,2,100,1,117,0,114, + 20,116,3,100,2,131,1,130,1,116,4,160,5,124,0,161, + 1,125,0,116,6,124,0,131,1,92,2,125,1,125,2,100, + 3,125,3,116,0,106,7,100,1,117,1,114,102,116,0,106, + 7,160,8,116,9,161,1,125,4,124,1,160,10,124,4,116, + 11,23,0,161,1,114,102,124,1,116,12,124,4,131,1,100, + 1,133,2,25,0,125,1,100,4,125,3,124,3,115,144,116, + 6,124,1,131,1,92,2,125,1,125,5,124,5,116,13,107, + 3,114,144,116,14,116,13,155,0,100,5,124,0,155,2,157, + 3,131,1,130,1,124,2,160,15,100,6,161,1,125,6,124, + 6,100,7,118,1,114,176,116,14,100,8,124,2,155,2,157, + 2,131,1,130,1,124,6,100,9,107,2,144,1,114,12,124, + 2,160,16,100,6,100,10,161,2,100,11,25,0,125,7,124, + 7,160,10,116,17,161,1,115,226,116,14,100,12,116,17,155, + 2,157,2,131,1,130,1,124,7,116,12,116,17,131,1,100, + 1,133,2,25,0,125,8,124,8,160,18,161,0,144,1,115, + 12,116,14,100,13,124,7,155,2,100,14,157,3,131,1,130, + 1,124,2,160,19,100,6,161,1,100,15,25,0,125,9,116, + 20,124,1,124,9,116,21,100,15,25,0,23,0,131,2,83, + 0,41,16,97,110,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,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,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,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,47,52,56,56,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,114,80,0,0,0,70,84,122,31, + 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,114, + 79,0,0,0,62,2,0,0,0,114,39,0,0,0,114,65, + 0,0,0,122,29,101,120,112,101,99,116,101,100,32,111,110, + 108,121,32,50,32,111,114,32,51,32,100,111,116,115,32,105, + 110,32,114,65,0,0,0,114,39,0,0,0,233,254,255,255, + 255,122,53,111,112,116,105,109,105,122,97,116,105,111,110,32, + 112,111,114,116,105,111,110,32,111,102,32,102,105,108,101,110, + 97,109,101,32,100,111,101,115,32,110,111,116,32,115,116,97, + 114,116,32,119,105,116,104,32,122,19,111,112,116,105,109,105, + 122,97,116,105,111,110,32,108,101,118,101,108,32,122,29,32, + 105,115,32,110,111,116,32,97,110,32,97,108,112,104,97,110, + 117,109,101,114,105,99,32,118,97,108,117,101,114,0,0,0, + 0,41,22,114,15,0,0,0,114,86,0,0,0,114,87,0, + 0,0,114,88,0,0,0,114,18,0,0,0,114,85,0,0, + 0,114,55,0,0,0,114,95,0,0,0,114,41,0,0,0, + 114,42,0,0,0,114,23,0,0,0,114,45,0,0,0,114, + 4,0,0,0,114,97,0,0,0,114,92,0,0,0,218,5, + 99,111,117,110,116,114,51,0,0,0,114,93,0,0,0,114, + 91,0,0,0,218,9,112,97,114,116,105,116,105,111,110,114, + 48,0,0,0,218,15,83,79,85,82,67,69,95,83,85,70, + 70,73,88,69,83,41,10,114,52,0,0,0,114,99,0,0, + 0,90,16,112,121,99,97,99,104,101,95,102,105,108,101,110, + 97,109,101,90,23,102,111,117,110,100,95,105,110,95,112,121, + 99,97,99,104,101,95,112,114,101,102,105,120,90,13,115,116, + 114,105,112,112,101,100,95,112,97,116,104,90,7,112,121,99, + 97,99,104,101,90,9,100,111,116,95,99,111,117,110,116,114, + 78,0,0,0,90,9,111,112,116,95,108,101,118,101,108,90, + 13,98,97,115,101,95,102,105,108,101,110,97,109,101,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,17,115, + 111,117,114,99,101,95,102,114,111,109,95,99,97,99,104,101, + 154,1,0,0,115,62,0,0,0,12,9,8,1,10,1,12, + 1,4,1,10,1,12,1,14,1,16,1,4,1,4,1,12, + 1,8,1,8,1,2,1,8,255,10,2,8,1,14,1,10, + 1,16,1,10,1,4,1,2,1,8,255,16,2,10,1,16, + 1,14,2,18,1,255,128,114,107,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,9,0,0, + 0,67,0,0,0,115,124,0,0,0,116,0,124,0,131,1, + 100,1,107,2,114,16,100,2,83,0,124,0,160,1,100,3, + 161,1,92,3,125,1,125,2,125,3,124,1,114,56,124,3, + 160,2,161,0,100,4,100,5,133,2,25,0,100,6,107,3, + 114,60,124,0,83,0,122,12,116,3,124,0,131,1,125,4, + 87,0,110,34,4,0,116,4,116,5,102,2,121,106,1,0, + 1,0,1,0,124,0,100,2,100,5,133,2,25,0,125,4, + 89,0,110,2,48,0,116,6,124,4,131,1,114,120,124,4, + 83,0,124,0,83,0,41,7,122,188,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,114,0,0,0,0,78,114,79,0,0, + 0,233,253,255,255,255,233,255,255,255,255,90,2,112,121,41, + 7,114,4,0,0,0,114,49,0,0,0,218,5,108,111,119, + 101,114,114,107,0,0,0,114,88,0,0,0,114,92,0,0, + 0,114,62,0,0,0,41,5,218,13,98,121,116,101,99,111, + 100,101,95,112,97,116,104,114,100,0,0,0,114,53,0,0, + 0,90,9,101,120,116,101,110,115,105,111,110,218,11,115,111, + 117,114,99,101,95,112,97,116,104,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,15,95,103,101,116,95,115, + 111,117,114,99,101,102,105,108,101,194,1,0,0,115,22,0, + 0,0,12,7,4,1,16,1,24,1,4,1,2,1,12,1, + 16,1,18,1,16,1,255,128,114,113,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0, + 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,116, + 1,116,2,131,1,161,1,114,46,122,10,116,3,124,0,131, + 1,87,0,83,0,4,0,116,4,121,44,1,0,1,0,1, + 0,89,0,100,0,83,0,48,0,124,0,160,0,116,1,116, + 5,131,1,161,1,114,64,124,0,83,0,100,0,83,0,169, + 1,78,41,6,218,8,101,110,100,115,119,105,116,104,218,5, + 116,117,112,108,101,114,106,0,0,0,114,102,0,0,0,114, + 88,0,0,0,114,94,0,0,0,41,1,114,101,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 11,95,103,101,116,95,99,97,99,104,101,100,213,1,0,0, + 115,22,0,0,0,14,1,2,1,10,1,12,1,2,1,4, + 128,2,0,14,1,4,1,4,2,255,128,114,117,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,8,0,0,0,67,0,0,0,115,50,0,0,0,122,14, + 116,0,124,0,131,1,106,1,125,1,87,0,110,22,4,0, + 116,2,121,36,1,0,1,0,1,0,100,1,125,1,89,0, + 110,2,48,0,124,1,100,2,79,0,125,1,124,1,83,0, + 41,4,122,51,67,97,108,99,117,108,97,116,101,32,116,104, + 101,32,109,111,100,101,32,112,101,114,109,105,115,115,105,111, + 110,115,32,102,111,114,32,97,32,98,121,116,101,99,111,100, + 101,32,102,105,108,101,46,114,68,0,0,0,233,128,0,0, + 0,78,41,3,114,57,0,0,0,114,59,0,0,0,114,58, + 0,0,0,41,2,114,52,0,0,0,114,60,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, + 95,99,97,108,99,95,109,111,100,101,225,1,0,0,115,14, + 0,0,0,2,2,14,1,12,1,10,1,8,3,4,1,255, + 128,114,119,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,115, + 52,0,0,0,100,6,135,0,102,1,100,2,100,3,132,9, + 125,1,116,0,100,1,117,1,114,30,116,0,106,1,125,2, + 110,8,100,4,100,5,132,0,125,2,124,2,124,1,136,0, + 131,2,1,0,124,1,83,0,41,7,122,252,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,0,0,0,0,4,0,0,0,4,0,0,0,31,0, + 0,0,115,72,0,0,0,124,1,100,0,117,0,114,16,124, + 0,106,0,125,1,110,32,124,0,106,0,124,1,107,3,114, + 48,116,1,100,1,124,0,106,0,124,1,102,2,22,0,124, + 1,100,2,141,2,130,1,136,0,124,0,124,1,103,2,124, + 2,162,1,82,0,105,0,124,3,164,1,142,1,83,0,41, + 3,78,122,30,108,111,97,100,101,114,32,102,111,114,32,37, + 115,32,99,97,110,110,111,116,32,104,97,110,100,108,101,32, + 37,115,169,1,218,4,110,97,109,101,41,2,114,121,0,0, + 0,218,11,73,109,112,111,114,116,69,114,114,111,114,41,4, + 218,4,115,101,108,102,114,121,0,0,0,218,4,97,114,103, + 115,218,6,107,119,97,114,103,115,169,1,218,6,109,101,116, + 104,111,100,114,7,0,0,0,114,8,0,0,0,218,19,95, + 99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,112, + 101,114,245,1,0,0,115,20,0,0,0,8,1,8,1,10, + 1,4,1,8,1,2,255,2,1,6,255,24,2,255,128,122, + 40,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,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,7,0,0,0,83,0, + 0,0,115,56,0,0,0,100,1,68,0,93,32,125,2,116, + 0,124,1,124,2,131,2,114,4,116,1,124,0,124,2,116, + 2,124,1,124,2,131,2,131,3,1,0,113,4,124,0,106, + 3,160,4,124,1,106,3,161,1,1,0,100,0,83,0,41, + 2,78,41,4,218,10,95,95,109,111,100,117,108,101,95,95, + 218,8,95,95,110,97,109,101,95,95,218,12,95,95,113,117, + 97,108,110,97,109,101,95,95,218,7,95,95,100,111,99,95, + 95,41,5,218,7,104,97,115,97,116,116,114,218,7,115,101, + 116,97,116,116,114,218,7,103,101,116,97,116,116,114,218,8, + 95,95,100,105,99,116,95,95,218,6,117,112,100,97,116,101, + 41,3,90,3,110,101,119,90,3,111,108,100,114,75,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,5,95,119,114,97,112,2,2,0,0,115,12,0,0,0, + 8,1,10,1,20,1,14,1,4,128,255,128,122,26,95,99, + 104,101,99,107,95,110,97,109,101,46,60,108,111,99,97,108, + 115,62,46,95,119,114,97,112,41,1,78,41,2,218,10,95, + 98,111,111,116,115,116,114,97,112,114,138,0,0,0,41,3, + 114,127,0,0,0,114,128,0,0,0,114,138,0,0,0,114, + 7,0,0,0,114,126,0,0,0,114,8,0,0,0,218,11, + 95,99,104,101,99,107,95,110,97,109,101,237,1,0,0,115, + 14,0,0,0,14,8,8,10,8,1,8,2,10,6,4,1, + 255,128,114,140,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,6,0,0,0,67,0,0,0, + 115,60,0,0,0,124,0,160,0,124,1,161,1,92,2,125, + 2,125,3,124,2,100,1,117,0,114,56,116,1,124,3,131, + 1,114,56,100,2,125,4,116,2,160,3,124,4,160,4,124, + 3,100,3,25,0,161,1,116,5,161,2,1,0,124,2,83, + 0,41,4,122,155,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,10,10,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,32,105,110,32,102,97, + 118,111,114,32,111,102,32,102,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,40,41,46,10,10,32,32,32,32, + 78,122,44,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,114, + 0,0,0,0,41,6,218,11,102,105,110,100,95,108,111,97, + 100,101,114,114,4,0,0,0,114,81,0,0,0,114,82,0, + 0,0,114,70,0,0,0,218,13,73,109,112,111,114,116,87, + 97,114,110,105,110,103,41,5,114,123,0,0,0,218,8,102, + 117,108,108,110,97,109,101,218,6,108,111,97,100,101,114,218, + 8,112,111,114,116,105,111,110,115,218,3,109,115,103,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,17,95, + 102,105,110,100,95,109,111,100,117,108,101,95,115,104,105,109, + 12,2,0,0,115,12,0,0,0,14,10,16,1,4,1,22, + 1,4,1,255,128,114,147,0,0,0,99,3,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67, + 0,0,0,115,166,0,0,0,124,0,100,1,100,2,133,2, + 25,0,125,3,124,3,116,0,107,3,114,64,100,3,124,1, + 155,2,100,4,124,3,155,2,157,4,125,4,116,1,160,2, + 100,5,124,4,161,2,1,0,116,3,124,4,102,1,105,0, + 124,2,164,1,142,1,130,1,116,4,124,0,131,1,100,6, + 107,0,114,106,100,7,124,1,155,2,157,2,125,4,116,1, + 160,2,100,5,124,4,161,2,1,0,116,5,124,4,131,1, + 130,1,116,6,124,0,100,2,100,8,133,2,25,0,131,1, + 125,5,124,5,100,9,64,0,114,162,100,10,124,5,155,2, + 100,11,124,1,155,2,157,4,125,4,116,3,124,4,102,1, + 105,0,124,2,164,1,142,1,130,1,124,5,83,0,41,12, + 97,84,2,0,0,80,101,114,102,111,114,109,32,98,97,115, + 105,99,32,118,97,108,105,100,105,116,121,32,99,104,101,99, + 107,105,110,103,32,111,102,32,97,32,112,121,99,32,104,101, + 97,100,101,114,32,97,110,100,32,114,101,116,117,114,110,32, + 116,104,101,32,102,108,97,103,115,32,102,105,101,108,100,44, + 10,32,32,32,32,119,104,105,99,104,32,100,101,116,101,114, + 109,105,110,101,115,32,104,111,119,32,116,104,101,32,112,121, + 99,32,115,104,111,117,108,100,32,98,101,32,102,117,114,116, + 104,101,114,32,118,97,108,105,100,97,116,101,100,32,97,103, + 97,105,110,115,116,32,116,104,101,32,115,111,117,114,99,101, 46,10,10,32,32,32,32,42,100,97,116,97,42,32,105,115, 32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102, 32,116,104,101,32,112,121,99,32,102,105,108,101,46,32,40, 79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,49, 54,32,98,121,116,101,115,32,97,114,101,10,32,32,32,32, - 114,101,113,117,105,114,101,100,46,41,10,10,32,32,32,32, - 42,115,111,117,114,99,101,95,109,116,105,109,101,42,32,105, - 115,32,116,104,101,32,108,97,115,116,32,109,111,100,105,102, - 105,101,100,32,116,105,109,101,115,116,97,109,112,32,111,102, - 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, - 46,10,10,32,32,32,32,42,115,111,117,114,99,101,95,115, - 105,122,101,42,32,105,115,32,78,111,110,101,32,111,114,32, - 116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32, - 115,111,117,114,99,101,32,102,105,108,101,32,105,110,32,98, - 121,116,101,115,46,10,10,32,32,32,32,42,110,97,109,101, - 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, - 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, - 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, - 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, - 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, - 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, - 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, - 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, - 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, - 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, - 103,105,110,103,46,10,10,32,32,32,32,65,110,32,73,109, - 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, - 115,101,100,32,105,102,32,116,104,101,32,98,121,116,101,99, - 111,100,101,32,105,115,32,115,116,97,108,101,46,10,10,32, - 32,32,32,114,146,0,0,0,233,12,0,0,0,114,15,0, - 0,0,122,22,98,121,116,101,99,111,100,101,32,105,115,32, - 115,116,97,108,101,32,102,111,114,32,114,144,0,0,0,78, - 114,145,0,0,0,41,4,114,27,0,0,0,114,134,0,0, - 0,114,149,0,0,0,114,117,0,0,0,41,6,114,26,0, - 0,0,218,12,115,111,117,114,99,101,95,109,116,105,109,101, - 218,11,115,111,117,114,99,101,95,115,105,122,101,114,116,0, - 0,0,114,151,0,0,0,114,92,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,23,95,118,97, - 108,105,100,97,116,101,95,116,105,109,101,115,116,97,109,112, - 95,112,121,99,23,2,0,0,115,20,0,0,0,24,19,10, - 1,12,1,16,1,8,1,22,1,2,255,22,2,4,128,255, - 128,114,156,0,0,0,99,4,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, - 42,0,0,0,124,0,100,1,100,2,133,2,25,0,124,1, - 107,3,114,38,116,0,100,3,124,2,155,2,157,2,102,1, - 105,0,124,3,164,1,142,1,130,1,100,4,83,0,41,5, - 97,243,1,0,0,86,97,108,105,100,97,116,101,32,97,32, - 104,97,115,104,45,98,97,115,101,100,32,112,121,99,32,98, - 121,32,99,104,101,99,107,105,110,103,32,116,104,101,32,114, - 101,97,108,32,115,111,117,114,99,101,32,104,97,115,104,32, - 97,103,97,105,110,115,116,32,116,104,101,32,111,110,101,32, - 105,110,10,32,32,32,32,116,104,101,32,112,121,99,32,104, - 101,97,100,101,114,46,10,10,32,32,32,32,42,100,97,116, - 97,42,32,105,115,32,116,104,101,32,99,111,110,116,101,110, - 116,115,32,111,102,32,116,104,101,32,112,121,99,32,102,105, - 108,101,46,32,40,79,110,108,121,32,116,104,101,32,102,105, - 114,115,116,32,49,54,32,98,121,116,101,115,32,97,114,101, - 10,32,32,32,32,114,101,113,117,105,114,101,100,46,41,10, - 10,32,32,32,32,42,115,111,117,114,99,101,95,104,97,115, - 104,42,32,105,115,32,116,104,101,32,105,109,112,111,114,116, - 108,105,98,46,117,116,105,108,46,115,111,117,114,99,101,95, - 104,97,115,104,40,41,32,111,102,32,116,104,101,32,115,111, - 117,114,99,101,32,102,105,108,101,46,10,10,32,32,32,32, - 42,110,97,109,101,42,32,105,115,32,116,104,101,32,110,97, - 109,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, - 32,98,101,105,110,103,32,105,109,112,111,114,116,101,100,46, - 32,73,116,32,105,115,32,117,115,101,100,32,102,111,114,32, - 108,111,103,103,105,110,103,46,10,10,32,32,32,32,42,101, - 120,99,95,100,101,116,97,105,108,115,42,32,105,115,32,97, - 32,100,105,99,116,105,111,110,97,114,121,32,112,97,115,115, - 101,100,32,116,111,32,73,109,112,111,114,116,69,114,114,111, - 114,32,105,102,32,105,116,32,114,97,105,115,101,100,32,102, - 111,114,10,32,32,32,32,105,109,112,114,111,118,101,100,32, - 100,101,98,117,103,103,105,110,103,46,10,10,32,32,32,32, - 65,110,32,73,109,112,111,114,116,69,114,114,111,114,32,105, - 115,32,114,97,105,115,101,100,32,105,102,32,116,104,101,32, - 98,121,116,101,99,111,100,101,32,105,115,32,115,116,97,108, - 101,46,10,10,32,32,32,32,114,146,0,0,0,114,145,0, - 0,0,122,46,104,97,115,104,32,105,110,32,98,121,116,101, - 99,111,100,101,32,100,111,101,115,110,39,116,32,109,97,116, - 99,104,32,104,97,115,104,32,111,102,32,115,111,117,114,99, - 101,32,78,41,1,114,117,0,0,0,41,4,114,26,0,0, - 0,218,11,115,111,117,114,99,101,95,104,97,115,104,114,116, - 0,0,0,114,151,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,18,95,118,97,108,105,100,97, - 116,101,95,104,97,115,104,95,112,121,99,51,2,0,0,115, - 16,0,0,0,16,17,2,1,8,1,4,255,2,2,6,254, - 4,128,255,128,114,158,0,0,0,99,4,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, - 0,0,115,76,0,0,0,116,0,160,1,124,0,161,1,125, - 4,116,2,124,4,116,3,131,2,114,56,116,4,160,5,100, - 1,124,2,161,2,1,0,124,3,100,2,117,1,114,52,116, - 6,160,7,124,4,124,3,161,2,1,0,124,4,83,0,116, - 8,100,3,160,9,124,2,161,1,124,1,124,2,100,4,141, - 3,130,1,41,5,122,35,67,111,109,112,105,108,101,32,98, - 121,116,101,99,111,100,101,32,97,115,32,102,111,117,110,100, - 32,105,110,32,97,32,112,121,99,46,122,21,99,111,100,101, - 32,111,98,106,101,99,116,32,102,114,111,109,32,123,33,114, - 125,78,122,23,78,111,110,45,99,111,100,101,32,111,98,106, - 101,99,116,32,105,110,32,123,33,114,125,169,2,114,116,0, - 0,0,114,44,0,0,0,41,10,218,7,109,97,114,115,104, - 97,108,90,5,108,111,97,100,115,218,10,105,115,105,110,115, - 116,97,110,99,101,218,10,95,99,111,100,101,95,116,121,112, - 101,114,134,0,0,0,114,149,0,0,0,218,4,95,105,109, - 112,90,16,95,102,105,120,95,99,111,95,102,105,108,101,110, - 97,109,101,114,117,0,0,0,114,62,0,0,0,41,5,114, - 26,0,0,0,114,116,0,0,0,114,106,0,0,0,114,107, - 0,0,0,218,4,99,111,100,101,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,17,95,99,111,109,112,105, - 108,101,95,98,121,116,101,99,111,100,101,75,2,0,0,115, - 20,0,0,0,10,2,10,1,12,1,8,1,12,1,4,1, - 10,2,4,1,6,255,255,128,114,165,0,0,0,114,73,0, - 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,5,0,0,0,67,0,0,0,115,70,0,0,0, - 116,0,116,1,131,1,125,3,124,3,160,2,116,3,100,1, - 131,1,161,1,1,0,124,3,160,2,116,3,124,1,131,1, - 161,1,1,0,124,3,160,2,116,3,124,2,131,1,161,1, - 1,0,124,3,160,2,116,4,160,5,124,0,161,1,161,1, - 1,0,124,3,83,0,41,3,122,43,80,114,111,100,117,99, - 101,32,116,104,101,32,100,97,116,97,32,102,111,114,32,97, - 32,116,105,109,101,115,116,97,109,112,45,98,97,115,101,100, - 32,112,121,99,46,114,73,0,0,0,78,41,6,218,9,98, - 121,116,101,97,114,114,97,121,114,148,0,0,0,218,6,101, - 120,116,101,110,100,114,21,0,0,0,114,160,0,0,0,218, - 5,100,117,109,112,115,41,4,114,164,0,0,0,218,5,109, - 116,105,109,101,114,155,0,0,0,114,26,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,218,22,95, - 99,111,100,101,95,116,111,95,116,105,109,101,115,116,97,109, - 112,95,112,121,99,88,2,0,0,115,14,0,0,0,8,2, - 14,1,14,1,14,1,16,1,4,1,255,128,114,170,0,0, - 0,84,99,3,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,5,0,0,0,67,0,0,0,115,80,0,0,0, - 116,0,116,1,131,1,125,3,100,1,124,2,100,1,62,0, - 66,0,125,4,124,3,160,2,116,3,124,4,131,1,161,1, - 1,0,116,4,124,1,131,1,100,2,107,2,115,50,74,0, - 130,1,124,3,160,2,124,1,161,1,1,0,124,3,160,2, - 116,5,160,6,124,0,161,1,161,1,1,0,124,3,83,0, - 41,4,122,38,80,114,111,100,117,99,101,32,116,104,101,32, - 100,97,116,97,32,102,111,114,32,97,32,104,97,115,104,45, - 98,97,115,101,100,32,112,121,99,46,114,39,0,0,0,114, - 146,0,0,0,78,41,7,114,166,0,0,0,114,148,0,0, - 0,114,167,0,0,0,114,21,0,0,0,114,23,0,0,0, - 114,160,0,0,0,114,168,0,0,0,41,5,114,164,0,0, - 0,114,157,0,0,0,90,7,99,104,101,99,107,101,100,114, - 26,0,0,0,114,2,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,17,95,99,111,100,101,95, - 116,111,95,104,97,115,104,95,112,121,99,98,2,0,0,115, - 16,0,0,0,8,2,12,1,14,1,16,1,10,1,16,1, - 4,1,255,128,114,171,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,6,0,0,0,67,0, - 0,0,115,62,0,0,0,100,1,100,2,108,0,125,1,116, - 1,160,2,124,0,161,1,106,3,125,2,124,1,160,4,124, - 2,161,1,125,3,116,1,160,5,100,2,100,3,161,2,125, - 4,124,4,160,6,124,0,160,6,124,3,100,1,25,0,161, - 1,161,1,83,0,41,4,122,121,68,101,99,111,100,101,32, - 98,121,116,101,115,32,114,101,112,114,101,115,101,110,116,105, - 110,103,32,115,111,117,114,99,101,32,99,111,100,101,32,97, - 110,100,32,114,101,116,117,114,110,32,116,104,101,32,115,116, - 114,105,110,103,46,10,10,32,32,32,32,85,110,105,118,101, - 114,115,97,108,32,110,101,119,108,105,110,101,32,115,117,112, - 112,111,114,116,32,105,115,32,117,115,101,100,32,105,110,32, - 116,104,101,32,100,101,99,111,100,105,110,103,46,10,32,32, - 32,32,114,73,0,0,0,78,84,41,7,218,8,116,111,107, - 101,110,105,122,101,114,64,0,0,0,90,7,66,121,116,101, - 115,73,79,90,8,114,101,97,100,108,105,110,101,90,15,100, - 101,116,101,99,116,95,101,110,99,111,100,105,110,103,90,25, - 73,110,99,114,101,109,101,110,116,97,108,78,101,119,108,105, - 110,101,68,101,99,111,100,101,114,218,6,100,101,99,111,100, - 101,41,5,218,12,115,111,117,114,99,101,95,98,121,116,101, - 115,114,172,0,0,0,90,21,115,111,117,114,99,101,95,98, - 121,116,101,115,95,114,101,97,100,108,105,110,101,218,8,101, - 110,99,111,100,105,110,103,90,15,110,101,119,108,105,110,101, - 95,100,101,99,111,100,101,114,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,13,100,101,99,111,100,101,95, - 115,111,117,114,99,101,109,2,0,0,115,12,0,0,0,8, - 5,12,1,10,1,12,1,20,1,255,128,114,176,0,0,0, - 169,2,114,140,0,0,0,218,26,115,117,98,109,111,100,117, - 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, - 111,110,115,99,2,0,0,0,0,0,0,0,2,0,0,0, - 9,0,0,0,8,0,0,0,67,0,0,0,115,8,1,0, - 0,124,1,100,1,117,0,114,56,100,2,125,1,116,0,124, - 2,100,3,131,2,114,66,122,14,124,2,160,1,124,0,161, - 1,125,1,87,0,110,28,4,0,116,2,121,54,1,0,1, - 0,1,0,89,0,110,12,48,0,116,3,160,4,124,1,161, - 1,125,1,116,5,106,6,124,0,124,2,124,1,100,4,141, - 3,125,4,100,5,124,4,95,7,124,2,100,1,117,0,114, - 148,116,8,131,0,68,0,93,40,92,2,125,5,125,6,124, - 1,160,9,116,10,124,6,131,1,161,1,114,102,124,5,124, - 0,124,1,131,2,125,2,124,2,124,4,95,11,1,0,113, - 148,100,1,83,0,124,3,116,12,117,0,114,212,116,0,124, - 2,100,6,131,2,114,218,122,14,124,2,160,13,124,0,161, - 1,125,7,87,0,110,18,4,0,116,2,121,198,1,0,1, - 0,1,0,89,0,110,20,48,0,124,7,114,218,103,0,124, - 4,95,14,110,6,124,3,124,4,95,14,124,4,106,14,103, - 0,107,2,144,1,114,4,124,1,144,1,114,4,116,15,124, - 1,131,1,100,7,25,0,125,8,124,4,106,14,160,16,124, - 8,161,1,1,0,124,4,83,0,41,8,97,61,1,0,0, - 82,101,116,117,114,110,32,97,32,109,111,100,117,108,101,32, - 115,112,101,99,32,98,97,115,101,100,32,111,110,32,97,32, - 102,105,108,101,32,108,111,99,97,116,105,111,110,46,10,10, - 32,32,32,32,84,111,32,105,110,100,105,99,97,116,101,32, - 116,104,97,116,32,116,104,101,32,109,111,100,117,108,101,32, - 105,115,32,97,32,112,97,99,107,97,103,101,44,32,115,101, - 116,10,32,32,32,32,115,117,98,109,111,100,117,108,101,95, - 115,101,97,114,99,104,95,108,111,99,97,116,105,111,110,115, - 32,116,111,32,97,32,108,105,115,116,32,111,102,32,100,105, - 114,101,99,116,111,114,121,32,112,97,116,104,115,46,32,32, - 65,110,10,32,32,32,32,101,109,112,116,121,32,108,105,115, - 116,32,105,115,32,115,117,102,102,105,99,105,101,110,116,44, - 32,116,104,111,117,103,104,32,105,116,115,32,110,111,116,32, - 111,116,104,101,114,119,105,115,101,32,117,115,101,102,117,108, - 32,116,111,32,116,104,101,10,32,32,32,32,105,109,112,111, - 114,116,32,115,121,115,116,101,109,46,10,10,32,32,32,32, - 84,104,101,32,108,111,97,100,101,114,32,109,117,115,116,32, - 116,97,107,101,32,97,32,115,112,101,99,32,97,115,32,105, - 116,115,32,111,110,108,121,32,95,95,105,110,105,116,95,95, - 40,41,32,97,114,103,46,10,10,32,32,32,32,78,122,9, - 60,117,110,107,110,111,119,110,62,218,12,103,101,116,95,102, - 105,108,101,110,97,109,101,169,1,218,6,111,114,105,103,105, - 110,84,218,10,105,115,95,112,97,99,107,97,103,101,114,73, - 0,0,0,41,17,114,128,0,0,0,114,179,0,0,0,114, - 117,0,0,0,114,4,0,0,0,114,79,0,0,0,114,134, - 0,0,0,218,10,77,111,100,117,108,101,83,112,101,99,90, - 13,95,115,101,116,95,102,105,108,101,97,116,116,114,218,27, - 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,114,110,0,0,0, - 114,111,0,0,0,114,140,0,0,0,218,9,95,80,79,80, - 85,76,65,84,69,114,182,0,0,0,114,178,0,0,0,114, - 47,0,0,0,218,6,97,112,112,101,110,100,41,9,114,116, - 0,0,0,90,8,108,111,99,97,116,105,111,110,114,140,0, - 0,0,114,178,0,0,0,218,4,115,112,101,99,218,12,108, - 111,97,100,101,114,95,99,108,97,115,115,218,8,115,117,102, - 102,105,120,101,115,114,182,0,0,0,90,7,100,105,114,110, - 97,109,101,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,23,115,112,101,99,95,102,114,111,109,95,102,105, - 108,101,95,108,111,99,97,116,105,111,110,126,2,0,0,115, - 64,0,0,0,8,12,4,4,10,1,2,2,14,1,12,1, - 6,1,10,2,16,8,6,1,8,3,14,1,14,1,10,1, - 6,1,4,1,4,2,8,3,10,2,2,1,14,1,12,1, - 6,1,4,2,8,1,6,2,12,1,6,1,12,1,12,1, - 4,2,255,128,114,190,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,64,0, - 0,0,115,80,0,0,0,101,0,90,1,100,0,90,2,100, - 1,90,3,100,2,90,4,100,3,90,5,100,4,90,6,101, - 7,100,5,100,6,132,0,131,1,90,8,101,7,100,7,100, - 8,132,0,131,1,90,9,101,7,100,14,100,10,100,11,132, - 1,131,1,90,10,101,7,100,15,100,12,100,13,132,1,131, - 1,90,11,100,9,83,0,41,16,218,21,87,105,110,100,111, - 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, - 122,62,77,101,116,97,32,112,97,116,104,32,102,105,110,100, - 101,114,32,102,111,114,32,109,111,100,117,108,101,115,32,100, - 101,99,108,97,114,101,100,32,105,110,32,116,104,101,32,87, - 105,110,100,111,119,115,32,114,101,103,105,115,116,114,121,46, - 122,59,83,111,102,116,119,97,114,101,92,80,121,116,104,111, - 110,92,80,121,116,104,111,110,67,111,114,101,92,123,115,121, - 115,95,118,101,114,115,105,111,110,125,92,77,111,100,117,108, - 101,115,92,123,102,117,108,108,110,97,109,101,125,122,65,83, - 111,102,116,119,97,114,101,92,80,121,116,104,111,110,92,80, - 121,116,104,111,110,67,111,114,101,92,123,115,121,115,95,118, - 101,114,115,105,111,110,125,92,77,111,100,117,108,101,115,92, - 123,102,117,108,108,110,97,109,101,125,92,68,101,98,117,103, - 70,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,8,0,0,0,67,0,0,0,115,50,0,0,0,122, - 16,116,0,160,1,116,0,106,2,124,1,161,2,87,0,83, - 0,4,0,116,3,121,48,1,0,1,0,1,0,116,0,160, - 1,116,0,106,4,124,1,161,2,6,0,89,0,83,0,48, - 0,114,109,0,0,0,41,5,218,6,119,105,110,114,101,103, - 90,7,79,112,101,110,75,101,121,90,17,72,75,69,89,95, - 67,85,82,82,69,78,84,95,85,83,69,82,114,50,0,0, - 0,90,18,72,75,69,89,95,76,79,67,65,76,95,77,65, - 67,72,73,78,69,41,2,218,3,99,108,115,114,7,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,14,95,111,112,101,110,95,114,101,103,105,115,116,114,121, - 206,2,0,0,115,10,0,0,0,2,2,16,1,12,1,20, - 1,255,128,122,36,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,2,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,8,0,0,0,67,0, - 0,0,115,130,0,0,0,124,0,106,0,114,14,124,0,106, - 1,125,2,110,6,124,0,106,2,125,2,124,2,106,3,124, - 1,100,1,116,4,106,5,100,0,100,2,133,2,25,0,22, - 0,100,3,141,2,125,3,122,60,124,0,160,6,124,3,161, - 1,143,28,125,4,116,7,160,8,124,4,100,4,161,2,125, - 5,87,0,100,0,4,0,4,0,131,3,1,0,110,16,49, - 0,115,94,48,0,1,0,1,0,1,0,89,0,1,0,87, - 0,124,5,83,0,4,0,116,9,121,128,1,0,1,0,1, - 0,89,0,100,0,83,0,48,0,41,5,78,122,5,37,100, - 46,37,100,114,28,0,0,0,41,2,114,139,0,0,0,90, - 11,115,121,115,95,118,101,114,115,105,111,110,114,40,0,0, - 0,41,10,218,11,68,69,66,85,71,95,66,85,73,76,68, - 218,18,82,69,71,73,83,84,82,89,95,75,69,89,95,68, - 69,66,85,71,218,12,82,69,71,73,83,84,82,89,95,75, - 69,89,114,62,0,0,0,114,1,0,0,0,218,12,118,101, - 114,115,105,111,110,95,105,110,102,111,114,194,0,0,0,114, - 192,0,0,0,90,10,81,117,101,114,121,86,97,108,117,101, - 114,50,0,0,0,41,6,114,193,0,0,0,114,139,0,0, - 0,90,12,114,101,103,105,115,116,114,121,95,107,101,121,114, - 7,0,0,0,90,4,104,107,101,121,218,8,102,105,108,101, - 112,97,116,104,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,16,95,115,101,97,114,99,104,95,114,101,103, - 105,115,116,114,121,213,2,0,0,115,26,0,0,0,6,2, - 8,1,6,2,6,1,16,1,6,255,2,2,12,1,44,1, - 4,3,12,254,8,1,255,128,122,38,87,105,110,100,111,119, - 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, + 114,101,113,117,105,114,101,100,44,32,116,104,111,117,103,104, + 46,41,10,10,32,32,32,32,42,110,97,109,101,42,32,105, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105, + 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117, + 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46, + 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105, + 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110, + 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32, + 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105, + 109,112,114,111,118,101,100,32,100,101,98,117,103,103,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,119,104,101,110,32,116,104,101,32,102,108,97, + 103,115,10,32,32,32,32,102,105,101,108,100,32,105,115,32, + 105,110,118,97,108,105,100,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,32,116,114,117,110,99,97,116, + 101,100,46,10,10,32,32,32,32,78,114,28,0,0,0,122, + 20,98,97,100,32,109,97,103,105,99,32,110,117,109,98,101, + 114,32,105,110,32,122,2,58,32,250,2,123,125,233,16,0, + 0,0,122,40,114,101,97,99,104,101,100,32,69,79,70,32, + 119,104,105,108,101,32,114,101,97,100,105,110,103,32,112,121, + 99,32,104,101,97,100,101,114,32,111,102,32,233,8,0,0, + 0,233,252,255,255,255,122,14,105,110,118,97,108,105,100,32, + 102,108,97,103,115,32,122,4,32,105,110,32,41,7,218,12, + 77,65,71,73,67,95,78,85,77,66,69,82,114,139,0,0, + 0,218,16,95,118,101,114,98,111,115,101,95,109,101,115,115, + 97,103,101,114,122,0,0,0,114,4,0,0,0,218,8,69, + 79,70,69,114,114,111,114,114,38,0,0,0,41,6,114,37, + 0,0,0,114,121,0,0,0,218,11,101,120,99,95,100,101, + 116,97,105,108,115,90,5,109,97,103,105,99,114,98,0,0, + 0,114,16,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,13,95,99,108,97,115,115,105,102,121, + 95,112,121,99,29,2,0,0,115,30,0,0,0,12,16,8, + 1,16,1,12,1,16,1,12,1,10,1,12,1,8,1,16, + 1,8,2,16,1,16,1,4,1,255,128,114,156,0,0,0, + 99,5,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,4,0,0,0,67,0,0,0,115,120,0,0,0,116,0, + 124,0,100,1,100,2,133,2,25,0,131,1,124,1,100,3, + 64,0,107,3,114,62,100,4,124,3,155,2,157,2,125,5, + 116,1,160,2,100,5,124,5,161,2,1,0,116,3,124,5, + 102,1,105,0,124,4,164,1,142,1,130,1,124,2,100,6, + 117,1,114,116,116,0,124,0,100,2,100,7,133,2,25,0, + 131,1,124,2,100,3,64,0,107,3,114,116,116,3,100,4, + 124,3,155,2,157,2,102,1,105,0,124,4,164,1,142,1, + 130,1,100,6,83,0,41,8,97,7,2,0,0,86,97,108, + 105,100,97,116,101,32,97,32,112,121,99,32,97,103,97,105, + 110,115,116,32,116,104,101,32,115,111,117,114,99,101,32,108, + 97,115,116,45,109,111,100,105,102,105,101,100,32,116,105,109, + 101,46,10,10,32,32,32,32,42,100,97,116,97,42,32,105, + 115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111, + 102,32,116,104,101,32,112,121,99,32,102,105,108,101,46,32, + 40,79,110,108,121,32,116,104,101,32,102,105,114,115,116,32, + 49,54,32,98,121,116,101,115,32,97,114,101,10,32,32,32, + 32,114,101,113,117,105,114,101,100,46,41,10,10,32,32,32, + 32,42,115,111,117,114,99,101,95,109,116,105,109,101,42,32, + 105,115,32,116,104,101,32,108,97,115,116,32,109,111,100,105, + 102,105,101,100,32,116,105,109,101,115,116,97,109,112,32,111, + 102,32,116,104,101,32,115,111,117,114,99,101,32,102,105,108, + 101,46,10,10,32,32,32,32,42,115,111,117,114,99,101,95, + 115,105,122,101,42,32,105,115,32,78,111,110,101,32,111,114, + 32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101, + 32,115,111,117,114,99,101,32,102,105,108,101,32,105,110,32, + 98,121,116,101,115,46,10,10,32,32,32,32,42,110,97,109, + 101,42,32,105,115,32,116,104,101,32,110,97,109,101,32,111, + 102,32,116,104,101,32,109,111,100,117,108,101,32,98,101,105, + 110,103,32,105,109,112,111,114,116,101,100,46,32,73,116,32, + 105,115,32,117,115,101,100,32,102,111,114,32,108,111,103,103, + 105,110,103,46,10,10,32,32,32,32,42,101,120,99,95,100, + 101,116,97,105,108,115,42,32,105,115,32,97,32,100,105,99, + 116,105,111,110,97,114,121,32,112,97,115,115,101,100,32,116, + 111,32,73,109,112,111,114,116,69,114,114,111,114,32,105,102, + 32,105,116,32,114,97,105,115,101,100,32,102,111,114,10,32, + 32,32,32,105,109,112,114,111,118,101,100,32,100,101,98,117, + 103,103,105,110,103,46,10,10,32,32,32,32,65,110,32,73, + 109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,97, + 105,115,101,100,32,105,102,32,116,104,101,32,98,121,116,101, + 99,111,100,101,32,105,115,32,115,116,97,108,101,46,10,10, + 32,32,32,32,114,150,0,0,0,233,12,0,0,0,114,27, + 0,0,0,122,22,98,121,116,101,99,111,100,101,32,105,115, + 32,115,116,97,108,101,32,102,111,114,32,114,148,0,0,0, + 78,114,149,0,0,0,41,4,114,38,0,0,0,114,139,0, + 0,0,114,153,0,0,0,114,122,0,0,0,41,6,114,37, + 0,0,0,218,12,115,111,117,114,99,101,95,109,116,105,109, + 101,218,11,115,111,117,114,99,101,95,115,105,122,101,114,121, + 0,0,0,114,155,0,0,0,114,98,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,23,95,118, + 97,108,105,100,97,116,101,95,116,105,109,101,115,116,97,109, + 112,95,112,121,99,62,2,0,0,115,20,0,0,0,24,19, + 10,1,12,1,16,1,8,1,22,1,2,255,22,2,4,128, + 255,128,114,160,0,0,0,99,4,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,42,0,0,0,124,0,100,1,100,2,133,2,25,0,124, + 1,107,3,114,38,116,0,100,3,124,2,155,2,157,2,102, + 1,105,0,124,3,164,1,142,1,130,1,100,4,83,0,41, + 5,97,243,1,0,0,86,97,108,105,100,97,116,101,32,97, + 32,104,97,115,104,45,98,97,115,101,100,32,112,121,99,32, + 98,121,32,99,104,101,99,107,105,110,103,32,116,104,101,32, + 114,101,97,108,32,115,111,117,114,99,101,32,104,97,115,104, + 32,97,103,97,105,110,115,116,32,116,104,101,32,111,110,101, + 32,105,110,10,32,32,32,32,116,104,101,32,112,121,99,32, + 104,101,97,100,101,114,46,10,10,32,32,32,32,42,100,97, + 116,97,42,32,105,115,32,116,104,101,32,99,111,110,116,101, + 110,116,115,32,111,102,32,116,104,101,32,112,121,99,32,102, + 105,108,101,46,32,40,79,110,108,121,32,116,104,101,32,102, + 105,114,115,116,32,49,54,32,98,121,116,101,115,32,97,114, + 101,10,32,32,32,32,114,101,113,117,105,114,101,100,46,41, + 10,10,32,32,32,32,42,115,111,117,114,99,101,95,104,97, + 115,104,42,32,105,115,32,116,104,101,32,105,109,112,111,114, + 116,108,105,98,46,117,116,105,108,46,115,111,117,114,99,101, + 95,104,97,115,104,40,41,32,111,102,32,116,104,101,32,115, + 111,117,114,99,101,32,102,105,108,101,46,10,10,32,32,32, + 32,42,110,97,109,101,42,32,105,115,32,116,104,101,32,110, + 97,109,101,32,111,102,32,116,104,101,32,109,111,100,117,108, + 101,32,98,101,105,110,103,32,105,109,112,111,114,116,101,100, + 46,32,73,116,32,105,115,32,117,115,101,100,32,102,111,114, + 32,108,111,103,103,105,110,103,46,10,10,32,32,32,32,42, + 101,120,99,95,100,101,116,97,105,108,115,42,32,105,115,32, + 97,32,100,105,99,116,105,111,110,97,114,121,32,112,97,115, + 115,101,100,32,116,111,32,73,109,112,111,114,116,69,114,114, + 111,114,32,105,102,32,105,116,32,114,97,105,115,101,100,32, + 102,111,114,10,32,32,32,32,105,109,112,114,111,118,101,100, + 32,100,101,98,117,103,103,105,110,103,46,10,10,32,32,32, + 32,65,110,32,73,109,112,111,114,116,69,114,114,111,114,32, + 105,115,32,114,97,105,115,101,100,32,105,102,32,116,104,101, + 32,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97, + 108,101,46,10,10,32,32,32,32,114,150,0,0,0,114,149, + 0,0,0,122,46,104,97,115,104,32,105,110,32,98,121,116, + 101,99,111,100,101,32,100,111,101,115,110,39,116,32,109,97, + 116,99,104,32,104,97,115,104,32,111,102,32,115,111,117,114, + 99,101,32,78,41,1,114,122,0,0,0,41,4,114,37,0, + 0,0,218,11,115,111,117,114,99,101,95,104,97,115,104,114, + 121,0,0,0,114,155,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,18,95,118,97,108,105,100, + 97,116,101,95,104,97,115,104,95,112,121,99,90,2,0,0, + 115,16,0,0,0,16,17,2,1,8,1,4,255,2,2,6, + 254,4,128,255,128,114,162,0,0,0,99,4,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, + 0,0,0,115,76,0,0,0,116,0,160,1,124,0,161,1, + 125,4,116,2,124,4,116,3,131,2,114,56,116,4,160,5, + 100,1,124,2,161,2,1,0,124,3,100,2,117,1,114,52, + 116,6,160,7,124,4,124,3,161,2,1,0,124,4,83,0, + 116,8,100,3,160,9,124,2,161,1,124,1,124,2,100,4, + 141,3,130,1,41,5,122,35,67,111,109,112,105,108,101,32, + 98,121,116,101,99,111,100,101,32,97,115,32,102,111,117,110, + 100,32,105,110,32,97,32,112,121,99,46,122,21,99,111,100, + 101,32,111,98,106,101,99,116,32,102,114,111,109,32,123,33, + 114,125,78,122,23,78,111,110,45,99,111,100,101,32,111,98, + 106,101,99,116,32,105,110,32,123,33,114,125,169,2,114,121, + 0,0,0,114,52,0,0,0,41,10,218,7,109,97,114,115, + 104,97,108,90,5,108,111,97,100,115,218,10,105,115,105,110, + 115,116,97,110,99,101,218,10,95,99,111,100,101,95,116,121, + 112,101,114,139,0,0,0,114,153,0,0,0,218,4,95,105, + 109,112,90,16,95,102,105,120,95,99,111,95,102,105,108,101, + 110,97,109,101,114,122,0,0,0,114,70,0,0,0,41,5, + 114,37,0,0,0,114,121,0,0,0,114,111,0,0,0,114, + 112,0,0,0,218,4,99,111,100,101,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,17,95,99,111,109,112, + 105,108,101,95,98,121,116,101,99,111,100,101,114,2,0,0, + 115,20,0,0,0,10,2,10,1,12,1,8,1,12,1,4, + 1,10,2,4,1,6,255,255,128,114,169,0,0,0,99,3, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5, + 0,0,0,67,0,0,0,115,70,0,0,0,116,0,116,1, + 131,1,125,3,124,3,160,2,116,3,100,1,131,1,161,1, + 1,0,124,3,160,2,116,3,124,1,131,1,161,1,1,0, + 124,3,160,2,116,3,124,2,131,1,161,1,1,0,124,3, + 160,2,116,4,160,5,124,0,161,1,161,1,1,0,124,3, + 83,0,41,3,122,43,80,114,111,100,117,99,101,32,116,104, + 101,32,100,97,116,97,32,102,111,114,32,97,32,116,105,109, + 101,115,116,97,109,112,45,98,97,115,101,100,32,112,121,99, + 46,114,0,0,0,0,78,41,6,218,9,98,121,116,101,97, + 114,114,97,121,114,152,0,0,0,218,6,101,120,116,101,110, + 100,114,33,0,0,0,114,164,0,0,0,218,5,100,117,109, + 112,115,41,4,114,168,0,0,0,218,5,109,116,105,109,101, + 114,159,0,0,0,114,37,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,22,95,99,111,100,101, + 95,116,111,95,116,105,109,101,115,116,97,109,112,95,112,121, + 99,127,2,0,0,115,14,0,0,0,8,2,14,1,14,1, + 14,1,16,1,4,1,255,128,114,174,0,0,0,84,99,3, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5, + 0,0,0,67,0,0,0,115,80,0,0,0,116,0,116,1, + 131,1,125,3,100,1,124,2,100,1,62,0,66,0,125,4, + 124,3,160,2,116,3,124,4,131,1,161,1,1,0,116,4, + 124,1,131,1,100,2,107,2,115,50,74,0,130,1,124,3, + 160,2,124,1,161,1,1,0,124,3,160,2,116,5,160,6, + 124,0,161,1,161,1,1,0,124,3,83,0,41,4,122,38, + 80,114,111,100,117,99,101,32,116,104,101,32,100,97,116,97, + 32,102,111,114,32,97,32,104,97,115,104,45,98,97,115,101, + 100,32,112,121,99,46,114,3,0,0,0,114,150,0,0,0, + 78,41,7,114,170,0,0,0,114,152,0,0,0,114,171,0, + 0,0,114,33,0,0,0,114,4,0,0,0,114,164,0,0, + 0,114,172,0,0,0,41,5,114,168,0,0,0,114,161,0, + 0,0,90,7,99,104,101,99,107,101,100,114,37,0,0,0, + 114,16,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,17,95,99,111,100,101,95,116,111,95,104, + 97,115,104,95,112,121,99,137,2,0,0,115,16,0,0,0, + 8,2,12,1,14,1,16,1,10,1,16,1,4,1,255,128, + 114,175,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,6,0,0,0,67,0,0,0,115,62, + 0,0,0,100,1,100,2,108,0,125,1,116,1,160,2,124, + 0,161,1,106,3,125,2,124,1,160,4,124,2,161,1,125, + 3,116,1,160,5,100,2,100,3,161,2,125,4,124,4,160, + 6,124,0,160,6,124,3,100,1,25,0,161,1,161,1,83, + 0,41,4,122,121,68,101,99,111,100,101,32,98,121,116,101, + 115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,115, + 111,117,114,99,101,32,99,111,100,101,32,97,110,100,32,114, + 101,116,117,114,110,32,116,104,101,32,115,116,114,105,110,103, + 46,10,10,32,32,32,32,85,110,105,118,101,114,115,97,108, + 32,110,101,119,108,105,110,101,32,115,117,112,112,111,114,116, + 32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32, + 100,101,99,111,100,105,110,103,46,10,32,32,32,32,114,0, + 0,0,0,78,84,41,7,218,8,116,111,107,101,110,105,122, + 101,114,72,0,0,0,90,7,66,121,116,101,115,73,79,90, + 8,114,101,97,100,108,105,110,101,90,15,100,101,116,101,99, + 116,95,101,110,99,111,100,105,110,103,90,25,73,110,99,114, + 101,109,101,110,116,97,108,78,101,119,108,105,110,101,68,101, + 99,111,100,101,114,218,6,100,101,99,111,100,101,41,5,218, + 12,115,111,117,114,99,101,95,98,121,116,101,115,114,176,0, + 0,0,90,21,115,111,117,114,99,101,95,98,121,116,101,115, + 95,114,101,97,100,108,105,110,101,218,8,101,110,99,111,100, + 105,110,103,90,15,110,101,119,108,105,110,101,95,100,101,99, + 111,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,13,100,101,99,111,100,101,95,115,111,117,114, + 99,101,148,2,0,0,115,12,0,0,0,8,5,12,1,10, + 1,12,1,20,1,255,128,114,180,0,0,0,169,2,114,144, + 0,0,0,218,26,115,117,98,109,111,100,117,108,101,95,115, + 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,99, + 2,0,0,0,0,0,0,0,2,0,0,0,9,0,0,0, + 8,0,0,0,67,0,0,0,115,8,1,0,0,124,1,100, + 1,117,0,114,56,100,2,125,1,116,0,124,2,100,3,131, + 2,114,66,122,14,124,2,160,1,124,0,161,1,125,1,87, + 0,110,28,4,0,116,2,121,54,1,0,1,0,1,0,89, + 0,110,12,48,0,116,3,160,4,124,1,161,1,125,1,116, + 5,106,6,124,0,124,2,124,1,100,4,141,3,125,4,100, + 5,124,4,95,7,124,2,100,1,117,0,114,148,116,8,131, + 0,68,0,93,40,92,2,125,5,125,6,124,1,160,9,116, + 10,124,6,131,1,161,1,114,102,124,5,124,0,124,1,131, + 2,125,2,124,2,124,4,95,11,1,0,113,148,100,1,83, + 0,124,3,116,12,117,0,114,212,116,0,124,2,100,6,131, + 2,114,218,122,14,124,2,160,13,124,0,161,1,125,7,87, + 0,110,18,4,0,116,2,121,198,1,0,1,0,1,0,89, + 0,110,20,48,0,124,7,114,218,103,0,124,4,95,14,110, + 6,124,3,124,4,95,14,124,4,106,14,103,0,107,2,144, + 1,114,4,124,1,144,1,114,4,116,15,124,1,131,1,100, + 7,25,0,125,8,124,4,106,14,160,16,124,8,161,1,1, + 0,124,4,83,0,41,8,97,61,1,0,0,82,101,116,117, + 114,110,32,97,32,109,111,100,117,108,101,32,115,112,101,99, + 32,98,97,115,101,100,32,111,110,32,97,32,102,105,108,101, + 32,108,111,99,97,116,105,111,110,46,10,10,32,32,32,32, + 84,111,32,105,110,100,105,99,97,116,101,32,116,104,97,116, + 32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,97, + 32,112,97,99,107,97,103,101,44,32,115,101,116,10,32,32, + 32,32,115,117,98,109,111,100,117,108,101,95,115,101,97,114, + 99,104,95,108,111,99,97,116,105,111,110,115,32,116,111,32, + 97,32,108,105,115,116,32,111,102,32,100,105,114,101,99,116, + 111,114,121,32,112,97,116,104,115,46,32,32,65,110,10,32, + 32,32,32,101,109,112,116,121,32,108,105,115,116,32,105,115, + 32,115,117,102,102,105,99,105,101,110,116,44,32,116,104,111, + 117,103,104,32,105,116,115,32,110,111,116,32,111,116,104,101, + 114,119,105,115,101,32,117,115,101,102,117,108,32,116,111,32, + 116,104,101,10,32,32,32,32,105,109,112,111,114,116,32,115, + 121,115,116,101,109,46,10,10,32,32,32,32,84,104,101,32, + 108,111,97,100,101,114,32,109,117,115,116,32,116,97,107,101, + 32,97,32,115,112,101,99,32,97,115,32,105,116,115,32,111, + 110,108,121,32,95,95,105,110,105,116,95,95,40,41,32,97, + 114,103,46,10,10,32,32,32,32,78,122,9,60,117,110,107, + 110,111,119,110,62,218,12,103,101,116,95,102,105,108,101,110, + 97,109,101,169,1,218,6,111,114,105,103,105,110,84,218,10, + 105,115,95,112,97,99,107,97,103,101,114,0,0,0,0,41, + 17,114,133,0,0,0,114,183,0,0,0,114,122,0,0,0, + 114,18,0,0,0,114,85,0,0,0,114,139,0,0,0,218, + 10,77,111,100,117,108,101,83,112,101,99,90,13,95,115,101, + 116,95,102,105,108,101,97,116,116,114,218,27,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,114,115,0,0,0,114,116,0,0, + 0,114,144,0,0,0,218,9,95,80,79,80,85,76,65,84, + 69,114,186,0,0,0,114,182,0,0,0,114,55,0,0,0, + 218,6,97,112,112,101,110,100,41,9,114,121,0,0,0,90, + 8,108,111,99,97,116,105,111,110,114,144,0,0,0,114,182, + 0,0,0,218,4,115,112,101,99,218,12,108,111,97,100,101, + 114,95,99,108,97,115,115,218,8,115,117,102,102,105,120,101, + 115,114,186,0,0,0,90,7,100,105,114,110,97,109,101,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,23, + 115,112,101,99,95,102,114,111,109,95,102,105,108,101,95,108, + 111,99,97,116,105,111,110,165,2,0,0,115,64,0,0,0, + 8,12,4,4,10,1,2,2,14,1,12,1,6,1,10,2, + 16,8,6,1,8,3,14,1,14,1,10,1,6,1,4,1, + 4,2,8,3,10,2,2,1,14,1,12,1,6,1,4,2, + 8,1,6,2,12,1,6,1,12,1,12,1,4,2,255,128, + 114,194,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,64,0,0,0,115,88, + 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, + 2,90,4,100,3,90,5,101,6,111,30,100,4,101,7,118, + 0,90,8,101,9,100,5,100,6,132,0,131,1,90,10,101, + 9,100,7,100,8,132,0,131,1,90,11,101,9,100,14,100, + 10,100,11,132,1,131,1,90,12,101,9,100,15,100,12,100, + 13,132,1,131,1,90,13,100,9,83,0,41,16,218,21,87, + 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, + 110,100,101,114,122,62,77,101,116,97,32,112,97,116,104,32, + 102,105,110,100,101,114,32,102,111,114,32,109,111,100,117,108, + 101,115,32,100,101,99,108,97,114,101,100,32,105,110,32,116, + 104,101,32,87,105,110,100,111,119,115,32,114,101,103,105,115, + 116,114,121,46,122,59,83,111,102,116,119,97,114,101,92,80, + 121,116,104,111,110,92,80,121,116,104,111,110,67,111,114,101, + 92,123,115,121,115,95,118,101,114,115,105,111,110,125,92,77, + 111,100,117,108,101,115,92,123,102,117,108,108,110,97,109,101, + 125,122,65,83,111,102,116,119,97,114,101,92,80,121,116,104, + 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, + 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, + 108,101,115,92,123,102,117,108,108,110,97,109,101,125,92,68, + 101,98,117,103,122,6,95,100,46,112,121,100,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,8,0,0, + 0,67,0,0,0,115,50,0,0,0,122,16,116,0,160,1, + 116,0,106,2,124,1,161,2,87,0,83,0,4,0,116,3, + 121,48,1,0,1,0,1,0,116,0,160,1,116,0,106,4, + 124,1,161,2,6,0,89,0,83,0,48,0,114,114,0,0, + 0,41,5,218,6,119,105,110,114,101,103,90,7,79,112,101, + 110,75,101,121,90,17,72,75,69,89,95,67,85,82,82,69, + 78,84,95,85,83,69,82,114,58,0,0,0,90,18,72,75, + 69,89,95,76,79,67,65,76,95,77,65,67,72,73,78,69, + 41,2,218,3,99,108,115,114,20,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,14,95,111,112, + 101,110,95,114,101,103,105,115,116,114,121,245,2,0,0,115, + 10,0,0,0,2,2,16,1,12,1,20,1,255,128,122,36, + 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,2,0,0,0,0,0,0,0,0,0,0, + 0,6,0,0,0,8,0,0,0,67,0,0,0,115,130,0, + 0,0,124,0,106,0,114,14,124,0,106,1,125,2,110,6, + 124,0,106,2,125,2,124,2,106,3,124,1,100,1,116,4, + 106,5,100,0,100,2,133,2,25,0,22,0,100,3,141,2, + 125,3,122,60,124,0,160,6,124,3,161,1,143,28,125,4, + 116,7,160,8,124,4,100,4,161,2,125,5,87,0,100,0, + 4,0,4,0,131,3,1,0,110,16,49,0,115,94,48,0, + 1,0,1,0,1,0,89,0,1,0,87,0,124,5,83,0, + 4,0,116,9,121,128,1,0,1,0,1,0,89,0,100,0, + 83,0,48,0,41,5,78,122,5,37,100,46,37,100,114,39, + 0,0,0,41,2,114,143,0,0,0,90,11,115,121,115,95, + 118,101,114,115,105,111,110,114,10,0,0,0,41,10,218,11, + 68,69,66,85,71,95,66,85,73,76,68,218,18,82,69,71, + 73,83,84,82,89,95,75,69,89,95,68,69,66,85,71,218, + 12,82,69,71,73,83,84,82,89,95,75,69,89,114,70,0, + 0,0,114,15,0,0,0,218,12,118,101,114,115,105,111,110, + 95,105,110,102,111,114,198,0,0,0,114,196,0,0,0,90, + 10,81,117,101,114,121,86,97,108,117,101,114,58,0,0,0, + 41,6,114,197,0,0,0,114,143,0,0,0,90,12,114,101, + 103,105,115,116,114,121,95,107,101,121,114,20,0,0,0,90, + 4,104,107,101,121,218,8,102,105,108,101,112,97,116,104,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,16, 95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,121, - 78,99,4,0,0,0,0,0,0,0,0,0,0,0,8,0, - 0,0,8,0,0,0,67,0,0,0,115,118,0,0,0,124, - 0,160,0,124,1,161,1,125,4,124,4,100,0,117,0,114, - 22,100,0,83,0,122,12,116,1,124,4,131,1,1,0,87, - 0,110,20,4,0,116,2,121,54,1,0,1,0,1,0,89, - 0,100,0,83,0,48,0,116,3,131,0,68,0,93,50,92, - 2,125,5,125,6,124,4,160,4,116,5,124,6,131,1,161, - 1,114,62,116,6,106,7,124,1,124,5,124,1,124,4,131, - 2,124,4,100,1,141,3,125,7,124,7,2,0,1,0,83, - 0,100,0,83,0,41,2,78,114,180,0,0,0,41,8,114, - 200,0,0,0,114,49,0,0,0,114,50,0,0,0,114,184, - 0,0,0,114,110,0,0,0,114,111,0,0,0,114,134,0, - 0,0,218,16,115,112,101,99,95,102,114,111,109,95,108,111, - 97,100,101,114,41,8,114,193,0,0,0,114,139,0,0,0, - 114,44,0,0,0,218,6,116,97,114,103,101,116,114,199,0, - 0,0,114,140,0,0,0,114,189,0,0,0,114,187,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,9,102,105,110,100,95,115,112,101,99,228,2,0,0,115, - 32,0,0,0,10,2,8,1,4,1,2,1,12,1,12,1, - 8,1,14,1,14,1,6,1,8,1,2,1,6,254,8,3, - 4,128,255,128,122,31,87,105,110,100,111,119,115,82,101,103, - 105,115,116,114,121,70,105,110,100,101,114,46,102,105,110,100, - 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,30, - 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, - 3,100,1,117,1,114,26,124,3,106,1,83,0,100,1,83, - 0,41,2,122,108,70,105,110,100,32,109,111,100,117,108,101, - 32,110,97,109,101,100,32,105,110,32,116,104,101,32,114,101, - 103,105,115,116,114,121,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, - 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, - 32,78,169,2,114,203,0,0,0,114,140,0,0,0,169,4, - 114,193,0,0,0,114,139,0,0,0,114,44,0,0,0,114, - 187,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101, - 244,2,0,0,115,10,0,0,0,12,7,8,1,6,1,4, - 2,255,128,122,33,87,105,110,100,111,119,115,82,101,103,105, - 115,116,114,121,70,105,110,100,101,114,46,102,105,110,100,95, - 109,111,100,117,108,101,41,2,78,78,41,1,78,41,12,114, - 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, - 0,0,0,114,197,0,0,0,114,196,0,0,0,114,195,0, - 0,0,218,11,99,108,97,115,115,109,101,116,104,111,100,114, - 194,0,0,0,114,200,0,0,0,114,203,0,0,0,114,206, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,191,0,0,0,194,2,0,0, - 115,32,0,0,0,8,0,4,2,2,3,2,255,2,4,2, - 255,4,3,2,2,10,1,2,6,10,1,2,14,12,1,2, - 15,16,1,255,128,114,191,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,48,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,100,7,132,0,90,6,100,8,100,9, - 132,0,90,7,100,10,83,0,41,11,218,13,95,76,111,97, - 100,101,114,66,97,115,105,99,115,122,83,66,97,115,101,32, - 99,108,97,115,115,32,111,102,32,99,111,109,109,111,110,32, - 99,111,100,101,32,110,101,101,100,101,100,32,98,121,32,98, - 111,116,104,32,83,111,117,114,99,101,76,111,97,100,101,114, - 32,97,110,100,10,32,32,32,32,83,111,117,114,99,101,108, - 101,115,115,70,105,108,101,76,111,97,100,101,114,46,99,2, - 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4, - 0,0,0,67,0,0,0,115,64,0,0,0,116,0,124,0, - 160,1,124,1,161,1,131,1,100,1,25,0,125,2,124,2, - 160,2,100,2,100,1,161,2,100,3,25,0,125,3,124,1, - 160,3,100,2,161,1,100,4,25,0,125,4,124,3,100,5, - 107,2,111,62,124,4,100,5,107,3,83,0,41,7,122,141, - 67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,101, - 110,116,97,116,105,111,110,32,111,102,32,73,110,115,112,101, - 99,116,76,111,97,100,101,114,46,105,115,95,112,97,99,107, - 97,103,101,32,98,121,32,99,104,101,99,107,105,110,103,32, - 105,102,10,32,32,32,32,32,32,32,32,116,104,101,32,112, - 97,116,104,32,114,101,116,117,114,110,101,100,32,98,121,32, - 103,101,116,95,102,105,108,101,110,97,109,101,32,104,97,115, - 32,97,32,102,105,108,101,110,97,109,101,32,111,102,32,39, - 95,95,105,110,105,116,95,95,46,112,121,39,46,114,39,0, - 0,0,114,71,0,0,0,114,73,0,0,0,114,28,0,0, - 0,218,8,95,95,105,110,105,116,95,95,78,41,4,114,47, - 0,0,0,114,179,0,0,0,114,43,0,0,0,114,41,0, - 0,0,41,5,114,118,0,0,0,114,139,0,0,0,114,96, - 0,0,0,90,13,102,105,108,101,110,97,109,101,95,98,97, - 115,101,90,9,116,97,105,108,95,110,97,109,101,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,182,0,0, - 0,7,3,0,0,115,10,0,0,0,18,3,16,1,14,1, - 16,1,255,128,122,24,95,76,111,97,100,101,114,66,97,115, - 105,99,115,46,105,115,95,112,97,99,107,97,103,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, - 169,2,122,42,85,115,101,32,100,101,102,97,117,108,116,32, - 115,101,109,97,110,116,105,99,115,32,102,111,114,32,109,111, - 100,117,108,101,32,99,114,101,97,116,105,111,110,46,78,114, - 5,0,0,0,169,2,114,118,0,0,0,114,187,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 13,99,114,101,97,116,101,95,109,111,100,117,108,101,15,3, - 0,0,115,4,0,0,0,4,128,255,128,122,27,95,76,111, - 97,100,101,114,66,97,115,105,99,115,46,99,114,101,97,116, - 101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0, - 0,115,56,0,0,0,124,0,160,0,124,1,106,1,161,1, - 125,2,124,2,100,1,117,0,114,36,116,2,100,2,160,3, - 124,1,106,1,161,1,131,1,130,1,116,4,160,5,116,6, - 124,2,124,1,106,7,161,3,1,0,100,1,83,0,41,3, - 122,19,69,120,101,99,117,116,101,32,116,104,101,32,109,111, - 100,117,108,101,46,78,122,52,99,97,110,110,111,116,32,108, - 111,97,100,32,109,111,100,117,108,101,32,123,33,114,125,32, - 119,104,101,110,32,103,101,116,95,99,111,100,101,40,41,32, - 114,101,116,117,114,110,115,32,78,111,110,101,41,8,218,8, - 103,101,116,95,99,111,100,101,114,125,0,0,0,114,117,0, - 0,0,114,62,0,0,0,114,134,0,0,0,218,25,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,218,4,101,120,101,99,114,131,0, - 0,0,41,3,114,118,0,0,0,218,6,109,111,100,117,108, - 101,114,164,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,218,11,101,120,101,99,95,109,111,100,117, - 108,101,18,3,0,0,115,16,0,0,0,12,2,8,1,6, - 1,4,1,6,255,16,2,4,128,255,128,122,25,95,76,111, - 97,100,101,114,66,97,115,105,99,115,46,101,120,101,99,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, - 12,0,0,0,116,0,160,1,124,0,124,1,161,2,83,0, - 41,2,122,26,84,104,105,115,32,109,111,100,117,108,101,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,78,41, - 2,114,134,0,0,0,218,17,95,108,111,97,100,95,109,111, - 100,117,108,101,95,115,104,105,109,169,2,114,118,0,0,0, - 114,139,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,11,108,111,97,100,95,109,111,100,117,108, - 101,26,3,0,0,115,4,0,0,0,12,2,255,128,122,25, - 95,76,111,97,100,101,114,66,97,115,105,99,115,46,108,111, - 97,100,95,109,111,100,117,108,101,78,41,8,114,125,0,0, - 0,114,124,0,0,0,114,126,0,0,0,114,127,0,0,0, - 114,182,0,0,0,114,212,0,0,0,114,217,0,0,0,114, - 220,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,208,0,0,0,2,3,0, - 0,115,14,0,0,0,8,0,4,2,8,3,8,8,8,3, - 12,8,255,128,114,208,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0, - 0,0,115,74,0,0,0,101,0,90,1,100,0,90,2,100, - 1,100,2,132,0,90,3,100,3,100,4,132,0,90,4,100, - 5,100,6,132,0,90,5,100,7,100,8,132,0,90,6,100, - 9,100,10,132,0,90,7,100,11,100,12,156,1,100,13,100, - 14,132,2,90,8,100,15,100,16,132,0,90,9,100,17,83, - 0,41,18,218,12,83,111,117,114,99,101,76,111,97,100,101, - 114,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,116, - 0,130,1,41,2,122,165,79,112,116,105,111,110,97,108,32, - 109,101,116,104,111,100,32,116,104,97,116,32,114,101,116,117, - 114,110,115,32,116,104,101,32,109,111,100,105,102,105,99,97, - 116,105,111,110,32,116,105,109,101,32,40,97,110,32,105,110, - 116,41,32,102,111,114,32,116,104,101,10,32,32,32,32,32, - 32,32,32,115,112,101,99,105,102,105,101,100,32,112,97,116, - 104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,32, - 32,32,32,32,82,97,105,115,101,115,32,79,83,69,114,114, - 111,114,32,119,104,101,110,32,116,104,101,32,112,97,116,104, - 32,99,97,110,110,111,116,32,98,101,32,104,97,110,100,108, - 101,100,46,10,32,32,32,32,32,32,32,32,78,41,1,114, - 50,0,0,0,169,2,114,118,0,0,0,114,44,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 10,112,97,116,104,95,109,116,105,109,101,33,3,0,0,115, - 4,0,0,0,4,6,255,128,122,23,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,0,0,0,0,2,0, - 0,0,4,0,0,0,67,0,0,0,115,14,0,0,0,100, - 1,124,0,160,0,124,1,161,1,105,1,83,0,41,3,97, - 158,1,0,0,79,112,116,105,111,110,97,108,32,109,101,116, - 104,111,100,32,114,101,116,117,114,110,105,110,103,32,97,32, - 109,101,116,97,100,97,116,97,32,100,105,99,116,32,102,111, - 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,10, - 32,32,32,32,32,32,32,32,112,97,116,104,32,40,97,32, - 115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,80, - 111,115,115,105,98,108,101,32,107,101,121,115,58,10,32,32, - 32,32,32,32,32,32,45,32,39,109,116,105,109,101,39,32, - 40,109,97,110,100,97,116,111,114,121,41,32,105,115,32,116, - 104,101,32,110,117,109,101,114,105,99,32,116,105,109,101,115, - 116,97,109,112,32,111,102,32,108,97,115,116,32,115,111,117, - 114,99,101,10,32,32,32,32,32,32,32,32,32,32,99,111, - 100,101,32,109,111,100,105,102,105,99,97,116,105,111,110,59, - 10,32,32,32,32,32,32,32,32,45,32,39,115,105,122,101, - 39,32,40,111,112,116,105,111,110,97,108,41,32,105,115,32, - 116,104,101,32,115,105,122,101,32,105,110,32,98,121,116,101, - 115,32,111,102,32,116,104,101,32,115,111,117,114,99,101,32, - 99,111,100,101,46,10,10,32,32,32,32,32,32,32,32,73, - 109,112,108,101,109,101,110,116,105,110,103,32,116,104,105,115, - 32,109,101,116,104,111,100,32,97,108,108,111,119,115,32,116, - 104,101,32,108,111,97,100,101,114,32,116,111,32,114,101,97, - 100,32,98,121,116,101,99,111,100,101,32,102,105,108,101,115, - 46,10,32,32,32,32,32,32,32,32,82,97,105,115,101,115, - 32,79,83,69,114,114,111,114,32,119,104,101,110,32,116,104, - 101,32,112,97,116,104,32,99,97,110,110,111,116,32,98,101, - 32,104,97,110,100,108,101,100,46,10,32,32,32,32,32,32, - 32,32,114,169,0,0,0,78,41,1,114,223,0,0,0,114, - 222,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,218,10,112,97,116,104,95,115,116,97,116,115,41, - 3,0,0,115,4,0,0,0,14,12,255,128,122,23,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,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,12, - 0,0,0,124,0,160,0,124,2,124,3,161,2,83,0,41, - 2,122,228,79,112,116,105,111,110,97,108,32,109,101,116,104, - 111,100,32,119,104,105,99,104,32,119,114,105,116,101,115,32, - 100,97,116,97,32,40,98,121,116,101,115,41,32,116,111,32, - 97,32,102,105,108,101,32,112,97,116,104,32,40,97,32,115, - 116,114,41,46,10,10,32,32,32,32,32,32,32,32,73,109, - 112,108,101,109,101,110,116,105,110,103,32,116,104,105,115,32, - 109,101,116,104,111,100,32,97,108,108,111,119,115,32,102,111, - 114,32,116,104,101,32,119,114,105,116,105,110,103,32,111,102, - 32,98,121,116,101,99,111,100,101,32,102,105,108,101,115,46, - 10,10,32,32,32,32,32,32,32,32,84,104,101,32,115,111, - 117,114,99,101,32,112,97,116,104,32,105,115,32,110,101,101, - 100,101,100,32,105,110,32,111,114,100,101,114,32,116,111,32, - 99,111,114,114,101,99,116,108,121,32,116,114,97,110,115,102, - 101,114,32,112,101,114,109,105,115,115,105,111,110,115,10,32, - 32,32,32,32,32,32,32,78,41,1,218,8,115,101,116,95, - 100,97,116,97,41,4,114,118,0,0,0,114,107,0,0,0, - 90,10,99,97,99,104,101,95,112,97,116,104,114,26,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,15,95,99,97,99,104,101,95,98,121,116,101,99,111,100, - 101,55,3,0,0,115,4,0,0,0,12,8,255,128,122,28, - 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,0,0,0,0,3,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, - 122,150,79,112,116,105,111,110,97,108,32,109,101,116,104,111, - 100,32,119,104,105,99,104,32,119,114,105,116,101,115,32,100, - 97,116,97,32,40,98,121,116,101,115,41,32,116,111,32,97, - 32,102,105,108,101,32,112,97,116,104,32,40,97,32,115,116, - 114,41,46,10,10,32,32,32,32,32,32,32,32,73,109,112, - 108,101,109,101,110,116,105,110,103,32,116,104,105,115,32,109, - 101,116,104,111,100,32,97,108,108,111,119,115,32,102,111,114, - 32,116,104,101,32,119,114,105,116,105,110,103,32,111,102,32, - 98,121,116,101,99,111,100,101,32,102,105,108,101,115,46,10, - 32,32,32,32,32,32,32,32,78,114,5,0,0,0,41,3, - 114,118,0,0,0,114,44,0,0,0,114,26,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,225, - 0,0,0,65,3,0,0,115,4,0,0,0,4,128,255,128, - 122,21,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, - 0,0,0,0,5,0,0,0,10,0,0,0,67,0,0,0, - 115,70,0,0,0,124,0,160,0,124,1,161,1,125,2,122, - 20,124,0,160,1,124,2,161,1,125,3,87,0,116,4,124, - 3,131,1,83,0,4,0,116,2,121,68,1,0,125,4,1, - 0,122,14,116,3,100,1,124,1,100,2,141,2,124,4,130, - 2,100,3,125,4,126,4,48,0,48,0,41,4,122,52,67, - 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, - 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99, - 116,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, - 99,101,46,122,39,115,111,117,114,99,101,32,110,111,116,32, - 97,118,97,105,108,97,98,108,101,32,116,104,114,111,117,103, - 104,32,103,101,116,95,100,97,116,97,40,41,114,115,0,0, - 0,78,41,5,114,179,0,0,0,218,8,103,101,116,95,100, - 97,116,97,114,50,0,0,0,114,117,0,0,0,114,176,0, - 0,0,41,5,114,118,0,0,0,114,139,0,0,0,114,44, - 0,0,0,114,174,0,0,0,218,3,101,120,99,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,10,103,101, - 116,95,115,111,117,114,99,101,72,3,0,0,115,24,0,0, - 0,10,2,2,1,12,1,8,4,14,253,4,1,2,1,4, - 255,2,1,2,255,10,128,255,128,122,23,83,111,117,114,99, - 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, - 99,101,114,104,0,0,0,41,1,218,9,95,111,112,116,105, - 109,105,122,101,99,3,0,0,0,0,0,0,0,1,0,0, - 0,4,0,0,0,8,0,0,0,67,0,0,0,115,22,0, - 0,0,116,0,106,1,116,2,124,1,124,2,100,1,100,2, - 124,3,100,3,141,6,83,0,41,5,122,130,82,101,116,117, - 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101, - 99,116,32,99,111,109,112,105,108,101,100,32,102,114,111,109, - 32,115,111,117,114,99,101,46,10,10,32,32,32,32,32,32, - 32,32,84,104,101,32,39,100,97,116,97,39,32,97,114,103, - 117,109,101,110,116,32,99,97,110,32,98,101,32,97,110,121, - 32,111,98,106,101,99,116,32,116,121,112,101,32,116,104,97, - 116,32,99,111,109,112,105,108,101,40,41,32,115,117,112,112, - 111,114,116,115,46,10,32,32,32,32,32,32,32,32,114,215, - 0,0,0,84,41,2,218,12,100,111,110,116,95,105,110,104, - 101,114,105,116,114,83,0,0,0,78,41,3,114,134,0,0, - 0,114,214,0,0,0,218,7,99,111,109,112,105,108,101,41, - 4,114,118,0,0,0,114,26,0,0,0,114,44,0,0,0, - 114,230,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,218,14,115,111,117,114,99,101,95,116,111,95, - 99,111,100,101,82,3,0,0,115,8,0,0,0,12,5,4, - 1,6,255,255,128,122,27,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,0,0,0,0,15, - 0,0,0,9,0,0,0,67,0,0,0,115,28,2,0,0, - 124,0,160,0,124,1,161,1,125,2,100,1,125,3,100,1, - 125,4,100,1,125,5,100,2,125,6,100,3,125,7,122,12, - 116,1,124,2,131,1,125,8,87,0,110,24,4,0,116,2, - 121,66,1,0,1,0,1,0,100,1,125,8,89,0,144,1, - 110,42,48,0,122,14,124,0,160,3,124,2,161,1,125,9, - 87,0,110,20,4,0,116,4,121,102,1,0,1,0,1,0, - 89,0,144,1,110,6,48,0,116,5,124,9,100,4,25,0, - 131,1,125,3,122,14,124,0,160,6,124,8,161,1,125,10, - 87,0,110,18,4,0,116,4,121,148,1,0,1,0,1,0, - 89,0,110,216,48,0,124,1,124,8,100,5,156,2,125,11, - 122,148,116,7,124,10,124,1,124,11,131,3,125,12,116,8, - 124,10,131,1,100,6,100,1,133,2,25,0,125,13,124,12, - 100,7,64,0,100,8,107,3,125,6,124,6,144,1,114,30, - 124,12,100,9,64,0,100,8,107,3,125,7,116,9,106,10, - 100,10,107,3,144,1,114,50,124,7,115,248,116,9,106,10, - 100,11,107,2,144,1,114,50,124,0,160,6,124,2,161,1, - 125,4,116,9,160,11,116,12,124,4,161,2,125,5,116,13, - 124,10,124,5,124,1,124,11,131,4,1,0,110,20,116,14, - 124,10,124,3,124,9,100,12,25,0,124,1,124,11,131,5, - 1,0,87,0,110,24,4,0,116,15,116,16,102,2,144,1, - 121,76,1,0,1,0,1,0,89,0,110,32,48,0,116,17, - 160,18,100,13,124,8,124,2,161,3,1,0,116,19,124,13, - 124,1,124,8,124,2,100,14,141,4,83,0,124,4,100,1, - 117,0,144,1,114,128,124,0,160,6,124,2,161,1,125,4, - 124,0,160,20,124,4,124,2,161,2,125,14,116,17,160,18, - 100,15,124,2,161,2,1,0,116,21,106,22,144,2,115,24, - 124,8,100,1,117,1,144,2,114,24,124,3,100,1,117,1, - 144,2,114,24,124,6,144,1,114,220,124,5,100,1,117,0, - 144,1,114,206,116,9,160,11,124,4,161,1,125,5,116,23, - 124,14,124,5,124,7,131,3,125,10,110,16,116,24,124,14, - 124,3,116,25,124,4,131,1,131,3,125,10,122,20,124,0, - 160,26,124,2,124,8,124,10,161,3,1,0,87,0,124,14, - 83,0,4,0,116,2,144,2,121,22,1,0,1,0,1,0, - 89,0,124,14,83,0,48,0,124,14,83,0,41,16,122,190, - 67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,101, - 110,116,97,116,105,111,110,32,111,102,32,73,110,115,112,101, - 99,116,76,111,97,100,101,114,46,103,101,116,95,99,111,100, - 101,46,10,10,32,32,32,32,32,32,32,32,82,101,97,100, - 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32, - 114,101,113,117,105,114,101,115,32,112,97,116,104,95,115,116, - 97,116,115,32,116,111,32,98,101,32,105,109,112,108,101,109, - 101,110,116,101,100,46,32,84,111,32,119,114,105,116,101,10, - 32,32,32,32,32,32,32,32,98,121,116,101,99,111,100,101, - 44,32,115,101,116,95,100,97,116,97,32,109,117,115,116,32, - 97,108,115,111,32,98,101,32,105,109,112,108,101,109,101,110, - 116,101,100,46,10,10,32,32,32,32,32,32,32,32,78,70, - 84,114,169,0,0,0,114,159,0,0,0,114,145,0,0,0, - 114,39,0,0,0,114,73,0,0,0,114,28,0,0,0,90, - 5,110,101,118,101,114,90,6,97,108,119,97,121,115,218,4, - 115,105,122,101,122,13,123,125,32,109,97,116,99,104,101,115, - 32,123,125,41,3,114,116,0,0,0,114,106,0,0,0,114, - 107,0,0,0,122,19,99,111,100,101,32,111,98,106,101,99, - 116,32,102,114,111,109,32,123,125,41,27,114,179,0,0,0, - 114,97,0,0,0,114,82,0,0,0,114,224,0,0,0,114, - 50,0,0,0,114,18,0,0,0,114,227,0,0,0,114,152, - 0,0,0,218,10,109,101,109,111,114,121,118,105,101,119,114, - 163,0,0,0,90,21,99,104,101,99,107,95,104,97,115,104, - 95,98,97,115,101,100,95,112,121,99,115,114,157,0,0,0, - 218,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, - 66,69,82,114,158,0,0,0,114,156,0,0,0,114,117,0, - 0,0,114,150,0,0,0,114,134,0,0,0,114,149,0,0, - 0,114,165,0,0,0,114,233,0,0,0,114,1,0,0,0, - 218,19,100,111,110,116,95,119,114,105,116,101,95,98,121,116, - 101,99,111,100,101,114,171,0,0,0,114,170,0,0,0,114, - 23,0,0,0,114,226,0,0,0,41,15,114,118,0,0,0, - 114,139,0,0,0,114,107,0,0,0,114,154,0,0,0,114, - 174,0,0,0,114,157,0,0,0,90,10,104,97,115,104,95, - 98,97,115,101,100,90,12,99,104,101,99,107,95,115,111,117, - 114,99,101,114,106,0,0,0,218,2,115,116,114,26,0,0, - 0,114,151,0,0,0,114,2,0,0,0,90,10,98,121,116, - 101,115,95,100,97,116,97,90,11,99,111,100,101,95,111,98, - 106,101,99,116,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,213,0,0,0,90,3,0,0,115,160,0,0, - 0,10,7,4,1,4,1,4,1,4,1,4,1,2,1,12, - 1,12,1,12,1,2,2,14,1,12,1,8,1,12,2,2, - 1,14,1,12,1,6,1,2,3,2,1,6,254,2,4,12, - 1,16,1,12,1,6,1,12,1,12,1,2,1,2,255,8, - 2,4,254,10,3,4,1,2,1,2,1,4,254,8,4,2, - 1,6,255,2,3,2,1,2,1,6,1,2,1,2,1,8, - 251,18,7,6,1,8,2,2,1,4,255,6,2,2,1,2, - 1,6,254,10,3,10,1,12,1,12,1,18,1,6,1,4, - 255,6,2,10,1,10,1,14,1,6,2,6,1,4,255,2, - 2,16,1,4,3,14,254,2,1,4,1,2,255,4,1,255, - 128,122,21,83,111,117,114,99,101,76,111,97,100,101,114,46, - 103,101,116,95,99,111,100,101,78,41,10,114,125,0,0,0, - 114,124,0,0,0,114,126,0,0,0,114,223,0,0,0,114, - 224,0,0,0,114,226,0,0,0,114,225,0,0,0,114,229, - 0,0,0,114,233,0,0,0,114,213,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,221,0,0,0,31,3,0,0,115,18,0,0,0,8, - 0,8,2,8,8,8,14,8,10,8,7,14,10,12,8,255, - 128,114,221,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,115, - 92,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 252,2,0,0,115,26,0,0,0,6,2,8,1,6,2,6, + 1,16,1,6,255,2,2,12,1,44,1,4,3,12,254,8, + 1,255,128,122,38,87,105,110,100,111,119,115,82,101,103,105, + 115,116,114,121,70,105,110,100,101,114,46,95,115,101,97,114, + 99,104,95,114,101,103,105,115,116,114,121,78,99,4,0,0, + 0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0, + 0,67,0,0,0,115,118,0,0,0,124,0,160,0,124,1, + 161,1,125,4,124,4,100,0,117,0,114,22,100,0,83,0, + 122,12,116,1,124,4,131,1,1,0,87,0,110,20,4,0, + 116,2,121,54,1,0,1,0,1,0,89,0,100,0,83,0, + 48,0,116,3,131,0,68,0,93,50,92,2,125,5,125,6, + 124,4,160,4,116,5,124,6,131,1,161,1,114,62,116,6, + 106,7,124,1,124,5,124,1,124,4,131,2,124,4,100,1, + 141,3,125,7,124,7,2,0,1,0,83,0,100,0,83,0, + 41,2,78,114,184,0,0,0,41,8,114,204,0,0,0,114, + 57,0,0,0,114,58,0,0,0,114,188,0,0,0,114,115, + 0,0,0,114,116,0,0,0,114,139,0,0,0,218,16,115, + 112,101,99,95,102,114,111,109,95,108,111,97,100,101,114,41, + 8,114,197,0,0,0,114,143,0,0,0,114,52,0,0,0, + 218,6,116,97,114,103,101,116,114,203,0,0,0,114,144,0, + 0,0,114,193,0,0,0,114,191,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,9,102,105,110, + 100,95,115,112,101,99,11,3,0,0,115,32,0,0,0,10, + 2,8,1,4,1,2,1,12,1,12,1,8,1,14,1,14, + 1,6,1,8,1,2,1,6,254,8,3,4,128,255,128,122, + 31,87,105,110,100,111,119,115,82,101,103,105,115,116,114,121, + 70,105,110,100,101,114,46,102,105,110,100,95,115,112,101,99, + 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,30,0,0,0,124,0, + 160,0,124,1,124,2,161,2,125,3,124,3,100,1,117,1, + 114,26,124,3,106,1,83,0,100,1,83,0,41,2,122,108, + 70,105,110,100,32,109,111,100,117,108,101,32,110,97,109,101, + 100,32,105,110,32,116,104,101,32,114,101,103,105,115,116,114, + 121,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99, + 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,32,32,32,32,78,169,2,114, + 207,0,0,0,114,144,0,0,0,169,4,114,197,0,0,0, + 114,143,0,0,0,114,52,0,0,0,114,191,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11, + 102,105,110,100,95,109,111,100,117,108,101,27,3,0,0,115, + 10,0,0,0,12,7,8,1,6,1,4,2,255,128,122,33, + 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, + 105,110,100,101,114,46,102,105,110,100,95,109,111,100,117,108, + 101,41,2,78,78,41,1,78,41,14,114,130,0,0,0,114, + 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,201, + 0,0,0,114,200,0,0,0,218,11,95,77,83,95,87,73, + 78,68,79,87,83,218,18,69,88,84,69,78,83,73,79,78, + 95,83,85,70,70,73,88,69,83,114,199,0,0,0,218,11, + 99,108,97,115,115,109,101,116,104,111,100,114,198,0,0,0, + 114,204,0,0,0,114,207,0,0,0,114,210,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,195,0,0,0,233,2,0,0,115,32,0,0, + 0,8,0,4,2,2,3,2,255,2,4,2,255,12,3,2, + 2,10,1,2,6,10,1,2,14,12,1,2,15,16,1,255, + 128,114,195,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, + 48,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,100,7,132,0,90,6,101,7,135,0,102,1,100,8, - 100,9,132,8,131,1,90,8,101,7,100,10,100,11,132,0, - 131,1,90,9,100,12,100,13,132,0,90,10,101,7,100,14, - 100,15,132,0,131,1,90,11,135,0,4,0,90,12,83,0, - 41,16,218,10,70,105,108,101,76,111,97,100,101,114,122,103, - 66,97,115,101,32,102,105,108,101,32,108,111,97,100,101,114, - 32,99,108,97,115,115,32,119,104,105,99,104,32,105,109,112, - 108,101,109,101,110,116,115,32,116,104,101,32,108,111,97,100, - 101,114,32,112,114,111,116,111,99,111,108,32,109,101,116,104, - 111,100,115,32,116,104,97,116,10,32,32,32,32,114,101,113, - 117,105,114,101,32,102,105,108,101,32,115,121,115,116,101,109, - 32,117,115,97,103,101,46,99,3,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,2,0,0,0,67,0,0,0, - 115,16,0,0,0,124,1,124,0,95,0,124,2,124,0,95, - 1,100,1,83,0,41,2,122,75,67,97,99,104,101,32,116, - 104,101,32,109,111,100,117,108,101,32,110,97,109,101,32,97, - 110,100,32,116,104,101,32,112,97,116,104,32,116,111,32,116, - 104,101,32,102,105,108,101,32,102,111,117,110,100,32,98,121, - 32,116,104,101,10,32,32,32,32,32,32,32,32,102,105,110, - 100,101,114,46,78,114,159,0,0,0,41,3,114,118,0,0, - 0,114,139,0,0,0,114,44,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,180, - 3,0,0,115,8,0,0,0,6,3,6,1,4,128,255,128, - 122,19,70,105,108,101,76,111,97,100,101,114,46,95,95,105, + 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, + 100,10,83,0,41,11,218,13,95,76,111,97,100,101,114,66, + 97,115,105,99,115,122,83,66,97,115,101,32,99,108,97,115, + 115,32,111,102,32,99,111,109,109,111,110,32,99,111,100,101, + 32,110,101,101,100,101,100,32,98,121,32,98,111,116,104,32, + 83,111,117,114,99,101,76,111,97,100,101,114,32,97,110,100, + 10,32,32,32,32,83,111,117,114,99,101,108,101,115,115,70, + 105,108,101,76,111,97,100,101,114,46,99,2,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,67, + 0,0,0,115,64,0,0,0,116,0,124,0,160,1,124,1, + 161,1,131,1,100,1,25,0,125,2,124,2,160,2,100,2, + 100,1,161,2,100,3,25,0,125,3,124,1,160,3,100,2, + 161,1,100,4,25,0,125,4,124,3,100,5,107,2,111,62, + 124,4,100,5,107,3,83,0,41,7,122,141,67,111,110,99, + 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, + 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, + 97,100,101,114,46,105,115,95,112,97,99,107,97,103,101,32, + 98,121,32,99,104,101,99,107,105,110,103,32,105,102,10,32, + 32,32,32,32,32,32,32,116,104,101,32,112,97,116,104,32, + 114,101,116,117,114,110,101,100,32,98,121,32,103,101,116,95, + 102,105,108,101,110,97,109,101,32,104,97,115,32,97,32,102, + 105,108,101,110,97,109,101,32,111,102,32,39,95,95,105,110, + 105,116,95,95,46,112,121,39,46,114,3,0,0,0,114,79, + 0,0,0,114,0,0,0,0,114,39,0,0,0,218,8,95, + 95,105,110,105,116,95,95,78,41,4,114,55,0,0,0,114, + 183,0,0,0,114,51,0,0,0,114,49,0,0,0,41,5, + 114,123,0,0,0,114,143,0,0,0,114,101,0,0,0,90, + 13,102,105,108,101,110,97,109,101,95,98,97,115,101,90,9, + 116,97,105,108,95,110,97,109,101,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,186,0,0,0,46,3,0, + 0,115,10,0,0,0,18,3,16,1,14,1,16,1,255,128, + 122,24,95,76,111,97,100,101,114,66,97,115,105,99,115,46, + 105,115,95,112,97,99,107,97,103,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,169,2,122,42, + 85,115,101,32,100,101,102,97,117,108,116,32,115,101,109,97, + 110,116,105,99,115,32,102,111,114,32,109,111,100,117,108,101, + 32,99,114,101,97,116,105,111,110,46,78,114,7,0,0,0, + 169,2,114,123,0,0,0,114,191,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,13,99,114,101, + 97,116,101,95,109,111,100,117,108,101,54,3,0,0,115,4, + 0,0,0,4,128,255,128,122,27,95,76,111,97,100,101,114, + 66,97,115,105,99,115,46,99,114,101,97,116,101,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,5,0,0,0,67,0,0,0,115,56,0, + 0,0,124,0,160,0,124,1,106,1,161,1,125,2,124,2, + 100,1,117,0,114,36,116,2,100,2,160,3,124,1,106,1, + 161,1,131,1,130,1,116,4,160,5,116,6,124,2,124,1, + 106,7,161,3,1,0,100,1,83,0,41,3,122,19,69,120, + 101,99,117,116,101,32,116,104,101,32,109,111,100,117,108,101, + 46,78,122,52,99,97,110,110,111,116,32,108,111,97,100,32, + 109,111,100,117,108,101,32,123,33,114,125,32,119,104,101,110, + 32,103,101,116,95,99,111,100,101,40,41,32,114,101,116,117, + 114,110,115,32,78,111,110,101,41,8,218,8,103,101,116,95, + 99,111,100,101,114,130,0,0,0,114,122,0,0,0,114,70, + 0,0,0,114,139,0,0,0,218,25,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,218,4,101,120,101,99,114,136,0,0,0,41,3, + 114,123,0,0,0,218,6,109,111,100,117,108,101,114,168,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,11,101,120,101,99,95,109,111,100,117,108,101,57,3, + 0,0,115,16,0,0,0,12,2,8,1,6,1,4,1,6, + 255,16,2,4,128,255,128,122,25,95,76,111,97,100,101,114, + 66,97,115,105,99,115,46,101,120,101,99,95,109,111,100,117, + 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,4,0,0,0,67,0,0,0,115,12,0,0,0, + 116,0,160,1,124,0,124,1,161,2,83,0,41,2,122,26, + 84,104,105,115,32,109,111,100,117,108,101,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,78,41,2,114,139,0, + 0,0,218,17,95,108,111,97,100,95,109,111,100,117,108,101, + 95,115,104,105,109,169,2,114,123,0,0,0,114,143,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,11,108,111,97,100,95,109,111,100,117,108,101,65,3,0, + 0,115,4,0,0,0,12,2,255,128,122,25,95,76,111,97, + 100,101,114,66,97,115,105,99,115,46,108,111,97,100,95,109, + 111,100,117,108,101,78,41,8,114,130,0,0,0,114,129,0, + 0,0,114,131,0,0,0,114,132,0,0,0,114,186,0,0, + 0,114,218,0,0,0,114,223,0,0,0,114,226,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,214,0,0,0,41,3,0,0,115,14,0, + 0,0,8,0,4,2,8,3,8,8,8,3,12,8,255,128, + 114,214,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,74, + 0,0,0,101,0,90,1,100,0,90,2,100,1,100,2,132, + 0,90,3,100,3,100,4,132,0,90,4,100,5,100,6,132, + 0,90,5,100,7,100,8,132,0,90,6,100,9,100,10,132, + 0,90,7,100,11,100,12,156,1,100,13,100,14,132,2,90, + 8,100,15,100,16,132,0,90,9,100,17,83,0,41,18,218, + 12,83,111,117,114,99,101,76,111,97,100,101,114,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,116,0,130,1,41, + 2,122,165,79,112,116,105,111,110,97,108,32,109,101,116,104, + 111,100,32,116,104,97,116,32,114,101,116,117,114,110,115,32, + 116,104,101,32,109,111,100,105,102,105,99,97,116,105,111,110, + 32,116,105,109,101,32,40,97,110,32,105,110,116,41,32,102, + 111,114,32,116,104,101,10,32,32,32,32,32,32,32,32,115, + 112,101,99,105,102,105,101,100,32,112,97,116,104,32,40,97, + 32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,32, + 82,97,105,115,101,115,32,79,83,69,114,114,111,114,32,119, + 104,101,110,32,116,104,101,32,112,97,116,104,32,99,97,110, + 110,111,116,32,98,101,32,104,97,110,100,108,101,100,46,10, + 32,32,32,32,32,32,32,32,78,41,1,114,58,0,0,0, + 169,2,114,123,0,0,0,114,52,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,10,112,97,116, + 104,95,109,116,105,109,101,72,3,0,0,115,4,0,0,0, + 4,6,255,128,122,23,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,0,0,0,0,2,0,0,0,4,0, + 0,0,67,0,0,0,115,14,0,0,0,100,1,124,0,160, + 0,124,1,161,1,105,1,83,0,41,3,97,158,1,0,0, + 79,112,116,105,111,110,97,108,32,109,101,116,104,111,100,32, + 114,101,116,117,114,110,105,110,103,32,97,32,109,101,116,97, + 100,97,116,97,32,100,105,99,116,32,102,111,114,32,116,104, + 101,32,115,112,101,99,105,102,105,101,100,10,32,32,32,32, + 32,32,32,32,112,97,116,104,32,40,97,32,115,116,114,41, + 46,10,10,32,32,32,32,32,32,32,32,80,111,115,115,105, + 98,108,101,32,107,101,121,115,58,10,32,32,32,32,32,32, + 32,32,45,32,39,109,116,105,109,101,39,32,40,109,97,110, + 100,97,116,111,114,121,41,32,105,115,32,116,104,101,32,110, + 117,109,101,114,105,99,32,116,105,109,101,115,116,97,109,112, + 32,111,102,32,108,97,115,116,32,115,111,117,114,99,101,10, + 32,32,32,32,32,32,32,32,32,32,99,111,100,101,32,109, + 111,100,105,102,105,99,97,116,105,111,110,59,10,32,32,32, + 32,32,32,32,32,45,32,39,115,105,122,101,39,32,40,111, + 112,116,105,111,110,97,108,41,32,105,115,32,116,104,101,32, + 115,105,122,101,32,105,110,32,98,121,116,101,115,32,111,102, + 32,116,104,101,32,115,111,117,114,99,101,32,99,111,100,101, + 46,10,10,32,32,32,32,32,32,32,32,73,109,112,108,101, + 109,101,110,116,105,110,103,32,116,104,105,115,32,109,101,116, + 104,111,100,32,97,108,108,111,119,115,32,116,104,101,32,108, + 111,97,100,101,114,32,116,111,32,114,101,97,100,32,98,121, + 116,101,99,111,100,101,32,102,105,108,101,115,46,10,32,32, + 32,32,32,32,32,32,82,97,105,115,101,115,32,79,83,69, + 114,114,111,114,32,119,104,101,110,32,116,104,101,32,112,97, + 116,104,32,99,97,110,110,111,116,32,98,101,32,104,97,110, + 100,108,101,100,46,10,32,32,32,32,32,32,32,32,114,173, + 0,0,0,78,41,1,114,229,0,0,0,114,228,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 10,112,97,116,104,95,115,116,97,116,115,80,3,0,0,115, + 4,0,0,0,14,12,255,128,122,23,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,0,0,0,0,4,0, + 0,0,4,0,0,0,67,0,0,0,115,12,0,0,0,124, + 0,160,0,124,2,124,3,161,2,83,0,41,2,122,228,79, + 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,119, + 104,105,99,104,32,119,114,105,116,101,115,32,100,97,116,97, + 32,40,98,121,116,101,115,41,32,116,111,32,97,32,102,105, + 108,101,32,112,97,116,104,32,40,97,32,115,116,114,41,46, + 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, + 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, + 111,100,32,97,108,108,111,119,115,32,102,111,114,32,116,104, + 101,32,119,114,105,116,105,110,103,32,111,102,32,98,121,116, + 101,99,111,100,101,32,102,105,108,101,115,46,10,10,32,32, + 32,32,32,32,32,32,84,104,101,32,115,111,117,114,99,101, + 32,112,97,116,104,32,105,115,32,110,101,101,100,101,100,32, + 105,110,32,111,114,100,101,114,32,116,111,32,99,111,114,114, + 101,99,116,108,121,32,116,114,97,110,115,102,101,114,32,112, + 101,114,109,105,115,115,105,111,110,115,10,32,32,32,32,32, + 32,32,32,78,41,1,218,8,115,101,116,95,100,97,116,97, + 41,4,114,123,0,0,0,114,112,0,0,0,90,10,99,97, + 99,104,101,95,112,97,116,104,114,37,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,15,95,99, + 97,99,104,101,95,98,121,116,101,99,111,100,101,94,3,0, + 0,115,4,0,0,0,12,8,255,128,122,28,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,0,0,0,0,3,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,150,79,112, + 116,105,111,110,97,108,32,109,101,116,104,111,100,32,119,104, + 105,99,104,32,119,114,105,116,101,115,32,100,97,116,97,32, + 40,98,121,116,101,115,41,32,116,111,32,97,32,102,105,108, + 101,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, + 10,32,32,32,32,32,32,32,32,73,109,112,108,101,109,101, + 110,116,105,110,103,32,116,104,105,115,32,109,101,116,104,111, + 100,32,97,108,108,111,119,115,32,102,111,114,32,116,104,101, + 32,119,114,105,116,105,110,103,32,111,102,32,98,121,116,101, + 99,111,100,101,32,102,105,108,101,115,46,10,32,32,32,32, + 32,32,32,32,78,114,7,0,0,0,41,3,114,123,0,0, + 0,114,52,0,0,0,114,37,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,231,0,0,0,104, + 3,0,0,115,4,0,0,0,4,128,255,128,122,21,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,0,0,0,0, + 5,0,0,0,10,0,0,0,67,0,0,0,115,70,0,0, + 0,124,0,160,0,124,1,161,1,125,2,122,20,124,0,160, + 1,124,2,161,1,125,3,87,0,116,4,124,3,131,1,83, + 0,4,0,116,2,121,68,1,0,125,4,1,0,122,14,116, + 3,100,1,124,1,100,2,141,2,124,4,130,2,100,3,125, + 4,126,4,48,0,48,0,41,4,122,52,67,111,110,99,114, + 101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,32,111,102,32,73,110,115,112,101,99,116,76,111,97, + 100,101,114,46,103,101,116,95,115,111,117,114,99,101,46,122, + 39,115,111,117,114,99,101,32,110,111,116,32,97,118,97,105, + 108,97,98,108,101,32,116,104,114,111,117,103,104,32,103,101, + 116,95,100,97,116,97,40,41,114,120,0,0,0,78,41,5, + 114,183,0,0,0,218,8,103,101,116,95,100,97,116,97,114, + 58,0,0,0,114,122,0,0,0,114,180,0,0,0,41,5, + 114,123,0,0,0,114,143,0,0,0,114,52,0,0,0,114, + 178,0,0,0,218,3,101,120,99,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,10,103,101,116,95,115,111, + 117,114,99,101,111,3,0,0,115,24,0,0,0,10,2,2, + 1,12,1,8,4,14,253,4,1,2,1,4,255,2,1,2, + 255,10,128,255,128,122,23,83,111,117,114,99,101,76,111,97, + 100,101,114,46,103,101,116,95,115,111,117,114,99,101,114,109, + 0,0,0,41,1,218,9,95,111,112,116,105,109,105,122,101, + 99,3,0,0,0,0,0,0,0,1,0,0,0,4,0,0, + 0,8,0,0,0,67,0,0,0,115,22,0,0,0,116,0, + 106,1,116,2,124,1,124,2,100,1,100,2,124,3,100,3, + 141,6,83,0,41,5,122,130,82,101,116,117,114,110,32,116, + 104,101,32,99,111,100,101,32,111,98,106,101,99,116,32,99, + 111,109,112,105,108,101,100,32,102,114,111,109,32,115,111,117, + 114,99,101,46,10,10,32,32,32,32,32,32,32,32,84,104, + 101,32,39,100,97,116,97,39,32,97,114,103,117,109,101,110, + 116,32,99,97,110,32,98,101,32,97,110,121,32,111,98,106, + 101,99,116,32,116,121,112,101,32,116,104,97,116,32,99,111, + 109,112,105,108,101,40,41,32,115,117,112,112,111,114,116,115, + 46,10,32,32,32,32,32,32,32,32,114,221,0,0,0,84, + 41,2,218,12,100,111,110,116,95,105,110,104,101,114,105,116, + 114,89,0,0,0,78,41,3,114,139,0,0,0,114,220,0, + 0,0,218,7,99,111,109,112,105,108,101,41,4,114,123,0, + 0,0,114,37,0,0,0,114,52,0,0,0,114,236,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,14,115,111,117,114,99,101,95,116,111,95,99,111,100,101, + 121,3,0,0,115,8,0,0,0,12,5,4,1,6,255,255, + 128,122,27,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,0,0,0,0,15,0,0,0,9, + 0,0,0,67,0,0,0,115,28,2,0,0,124,0,160,0, + 124,1,161,1,125,2,100,1,125,3,100,1,125,4,100,1, + 125,5,100,2,125,6,100,3,125,7,122,12,116,1,124,2, + 131,1,125,8,87,0,110,24,4,0,116,2,121,66,1,0, + 1,0,1,0,100,1,125,8,89,0,144,1,110,42,48,0, + 122,14,124,0,160,3,124,2,161,1,125,9,87,0,110,20, + 4,0,116,4,121,102,1,0,1,0,1,0,89,0,144,1, + 110,6,48,0,116,5,124,9,100,4,25,0,131,1,125,3, + 122,14,124,0,160,6,124,8,161,1,125,10,87,0,110,18, + 4,0,116,4,121,148,1,0,1,0,1,0,89,0,110,216, + 48,0,124,1,124,8,100,5,156,2,125,11,122,148,116,7, + 124,10,124,1,124,11,131,3,125,12,116,8,124,10,131,1, + 100,6,100,1,133,2,25,0,125,13,124,12,100,7,64,0, + 100,8,107,3,125,6,124,6,144,1,114,30,124,12,100,9, + 64,0,100,8,107,3,125,7,116,9,106,10,100,10,107,3, + 144,1,114,50,124,7,115,248,116,9,106,10,100,11,107,2, + 144,1,114,50,124,0,160,6,124,2,161,1,125,4,116,9, + 160,11,116,12,124,4,161,2,125,5,116,13,124,10,124,5, + 124,1,124,11,131,4,1,0,110,20,116,14,124,10,124,3, + 124,9,100,12,25,0,124,1,124,11,131,5,1,0,87,0, + 110,24,4,0,116,15,116,16,102,2,144,1,121,76,1,0, + 1,0,1,0,89,0,110,32,48,0,116,17,160,18,100,13, + 124,8,124,2,161,3,1,0,116,19,124,13,124,1,124,8, + 124,2,100,14,141,4,83,0,124,4,100,1,117,0,144,1, + 114,128,124,0,160,6,124,2,161,1,125,4,124,0,160,20, + 124,4,124,2,161,2,125,14,116,17,160,18,100,15,124,2, + 161,2,1,0,116,21,106,22,144,2,115,24,124,8,100,1, + 117,1,144,2,114,24,124,3,100,1,117,1,144,2,114,24, + 124,6,144,1,114,220,124,5,100,1,117,0,144,1,114,206, + 116,9,160,11,124,4,161,1,125,5,116,23,124,14,124,5, + 124,7,131,3,125,10,110,16,116,24,124,14,124,3,116,25, + 124,4,131,1,131,3,125,10,122,20,124,0,160,26,124,2, + 124,8,124,10,161,3,1,0,87,0,124,14,83,0,4,0, + 116,2,144,2,121,22,1,0,1,0,1,0,89,0,124,14, + 83,0,48,0,124,14,83,0,41,16,122,190,67,111,110,99, + 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, + 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, + 97,100,101,114,46,103,101,116,95,99,111,100,101,46,10,10, + 32,32,32,32,32,32,32,32,82,101,97,100,105,110,103,32, + 111,102,32,98,121,116,101,99,111,100,101,32,114,101,113,117, + 105,114,101,115,32,112,97,116,104,95,115,116,97,116,115,32, + 116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101, + 100,46,32,84,111,32,119,114,105,116,101,10,32,32,32,32, + 32,32,32,32,98,121,116,101,99,111,100,101,44,32,115,101, + 116,95,100,97,116,97,32,109,117,115,116,32,97,108,115,111, + 32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,46, + 10,10,32,32,32,32,32,32,32,32,78,70,84,114,173,0, + 0,0,114,163,0,0,0,114,149,0,0,0,114,3,0,0, + 0,114,0,0,0,0,114,39,0,0,0,90,5,110,101,118, + 101,114,90,6,97,108,119,97,121,115,218,4,115,105,122,101, + 122,13,123,125,32,109,97,116,99,104,101,115,32,123,125,41, + 3,114,121,0,0,0,114,111,0,0,0,114,112,0,0,0, + 122,19,99,111,100,101,32,111,98,106,101,99,116,32,102,114, + 111,109,32,123,125,41,27,114,183,0,0,0,114,102,0,0, + 0,114,88,0,0,0,114,230,0,0,0,114,58,0,0,0, + 114,30,0,0,0,114,233,0,0,0,114,156,0,0,0,218, + 10,109,101,109,111,114,121,118,105,101,119,114,167,0,0,0, + 90,21,99,104,101,99,107,95,104,97,115,104,95,98,97,115, + 101,100,95,112,121,99,115,114,161,0,0,0,218,17,95,82, + 65,87,95,77,65,71,73,67,95,78,85,77,66,69,82,114, + 162,0,0,0,114,160,0,0,0,114,122,0,0,0,114,154, + 0,0,0,114,139,0,0,0,114,153,0,0,0,114,169,0, + 0,0,114,239,0,0,0,114,15,0,0,0,218,19,100,111, + 110,116,95,119,114,105,116,101,95,98,121,116,101,99,111,100, + 101,114,175,0,0,0,114,174,0,0,0,114,4,0,0,0, + 114,232,0,0,0,41,15,114,123,0,0,0,114,143,0,0, + 0,114,112,0,0,0,114,158,0,0,0,114,178,0,0,0, + 114,161,0,0,0,90,10,104,97,115,104,95,98,97,115,101, + 100,90,12,99,104,101,99,107,95,115,111,117,114,99,101,114, + 111,0,0,0,218,2,115,116,114,37,0,0,0,114,155,0, + 0,0,114,16,0,0,0,90,10,98,121,116,101,115,95,100, + 97,116,97,90,11,99,111,100,101,95,111,98,106,101,99,116, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 219,0,0,0,129,3,0,0,115,160,0,0,0,10,7,4, + 1,4,1,4,1,4,1,4,1,2,1,12,1,12,1,12, + 1,2,2,14,1,12,1,8,1,12,2,2,1,14,1,12, + 1,6,1,2,3,2,1,6,254,2,4,12,1,16,1,12, + 1,6,1,12,1,12,1,2,1,2,255,8,2,4,254,10, + 3,4,1,2,1,2,1,4,254,8,4,2,1,6,255,2, + 3,2,1,2,1,6,1,2,1,2,1,8,251,18,7,6, + 1,8,2,2,1,4,255,6,2,2,1,2,1,6,254,10, + 3,10,1,12,1,12,1,18,1,6,1,4,255,6,2,10, + 1,10,1,14,1,6,2,6,1,4,255,2,2,16,1,4, + 3,14,254,2,1,4,1,2,255,4,1,255,128,122,21,83, + 111,117,114,99,101,76,111,97,100,101,114,46,103,101,116,95, + 99,111,100,101,78,41,10,114,130,0,0,0,114,129,0,0, + 0,114,131,0,0,0,114,229,0,0,0,114,230,0,0,0, + 114,232,0,0,0,114,231,0,0,0,114,235,0,0,0,114, + 239,0,0,0,114,219,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,227,0, + 0,0,70,3,0,0,115,18,0,0,0,8,0,8,2,8, + 8,8,14,8,10,8,7,14,10,12,8,255,128,114,227,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,0,0,0,0,115,92,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, + 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, + 132,0,90,6,101,7,135,0,102,1,100,8,100,9,132,8, + 131,1,90,8,101,7,100,10,100,11,132,0,131,1,90,9, + 100,12,100,13,132,0,90,10,101,7,100,14,100,15,132,0, + 131,1,90,11,135,0,4,0,90,12,83,0,41,16,218,10, + 70,105,108,101,76,111,97,100,101,114,122,103,66,97,115,101, + 32,102,105,108,101,32,108,111,97,100,101,114,32,99,108,97, + 115,115,32,119,104,105,99,104,32,105,109,112,108,101,109,101, + 110,116,115,32,116,104,101,32,108,111,97,100,101,114,32,112, + 114,111,116,111,99,111,108,32,109,101,116,104,111,100,115,32, + 116,104,97,116,10,32,32,32,32,114,101,113,117,105,114,101, + 32,102,105,108,101,32,115,121,115,116,101,109,32,117,115,97, + 103,101,46,99,3,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0, + 0,124,1,124,0,95,0,124,2,124,0,95,1,100,1,83, + 0,41,2,122,75,67,97,99,104,101,32,116,104,101,32,109, + 111,100,117,108,101,32,110,97,109,101,32,97,110,100,32,116, + 104,101,32,112,97,116,104,32,116,111,32,116,104,101,32,102, + 105,108,101,32,102,111,117,110,100,32,98,121,32,116,104,101, + 10,32,32,32,32,32,32,32,32,102,105,110,100,101,114,46, + 78,114,163,0,0,0,41,3,114,123,0,0,0,114,143,0, + 0,0,114,52,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,215,0,0,0,219,3,0,0,115, + 8,0,0,0,6,3,6,1,4,128,255,128,122,19,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,0,0,0,0,2,0, + 0,0,2,0,0,0,67,0,0,0,115,24,0,0,0,124, + 0,106,0,124,1,106,0,107,2,111,22,124,0,106,1,124, + 1,106,1,107,2,83,0,114,114,0,0,0,169,2,218,9, + 95,95,99,108,97,115,115,95,95,114,136,0,0,0,169,2, + 114,123,0,0,0,90,5,111,116,104,101,114,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,6,95,95,101, + 113,95,95,225,3,0,0,115,8,0,0,0,12,1,10,1, + 2,255,255,128,122,17,70,105,108,101,76,111,97,100,101,114, + 46,95,95,101,113,95,95,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,20,0,0,0,116,0,124,0,106,1,131,1,116,0,124, + 0,106,2,131,1,65,0,83,0,114,114,0,0,0,169,3, + 218,4,104,97,115,104,114,121,0,0,0,114,52,0,0,0, + 169,1,114,123,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,8,95,95,104,97,115,104,95,95, + 229,3,0,0,115,4,0,0,0,20,1,255,128,122,19,70, + 105,108,101,76,111,97,100,101,114,46,95,95,104,97,115,104, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,3,0,0,0,115,16,0,0,0, + 116,0,116,1,124,0,131,2,160,2,124,1,161,1,83,0, + 41,2,122,100,76,111,97,100,32,97,32,109,111,100,117,108, + 101,32,102,114,111,109,32,97,32,102,105,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,78,41,3,218,5,115,117,112, + 101,114,114,245,0,0,0,114,226,0,0,0,114,225,0,0, + 0,169,1,114,247,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,226,0,0,0,232,3,0,0,115,4,0,0,0, + 16,10,255,128,122,22,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,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,6,0,0,0,124,0,106,0,83,0, + 169,2,122,58,82,101,116,117,114,110,32,116,104,101,32,112, + 97,116,104,32,116,111,32,116,104,101,32,115,111,117,114,99, + 101,32,102,105,108,101,32,97,115,32,102,111,117,110,100,32, + 98,121,32,116,104,101,32,102,105,110,100,101,114,46,78,114, + 56,0,0,0,114,225,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,183,0,0,0,244,3,0, + 0,115,4,0,0,0,6,3,255,128,122,23,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,0,0,0,0, + 3,0,0,0,8,0,0,0,67,0,0,0,115,128,0,0, + 0,116,0,124,0,116,1,116,2,102,2,131,2,114,72,116, + 3,160,4,116,5,124,1,131,1,161,1,143,24,125,2,124, + 2,160,6,161,0,87,0,2,0,100,1,4,0,4,0,131, + 3,1,0,83,0,49,0,115,58,48,0,1,0,1,0,1, + 0,89,0,1,0,100,1,83,0,116,3,160,7,124,1,100, + 2,161,2,143,24,125,2,124,2,160,6,161,0,87,0,2, + 0,100,1,4,0,4,0,131,3,1,0,83,0,49,0,115, + 114,48,0,1,0,1,0,1,0,89,0,1,0,100,1,83, + 0,41,3,122,39,82,101,116,117,114,110,32,116,104,101,32, + 100,97,116,97,32,102,114,111,109,32,112,97,116,104,32,97, + 115,32,114,97,119,32,98,121,116,101,115,46,78,218,1,114, + 41,8,114,165,0,0,0,114,227,0,0,0,218,19,69,120, + 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, + 114,114,72,0,0,0,90,9,111,112,101,110,95,99,111,100, + 101,114,90,0,0,0,90,4,114,101,97,100,114,73,0,0, + 0,41,3,114,123,0,0,0,114,52,0,0,0,114,76,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,233,0,0,0,249,3,0,0,115,16,0,0,0,14, + 2,16,1,38,1,4,128,14,2,38,1,4,128,255,128,122, + 19,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, + 100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,2,0,0,0,67,0,0,0,115,20,0, + 0,0,100,1,100,2,108,0,109,1,125,2,1,0,124,2, + 124,0,131,1,83,0,41,3,78,114,0,0,0,0,41,1, + 218,10,70,105,108,101,82,101,97,100,101,114,41,2,90,17, + 105,109,112,111,114,116,108,105,98,46,114,101,97,100,101,114, + 115,114,3,1,0,0,41,3,114,123,0,0,0,114,222,0, + 0,0,114,3,1,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,19,103,101,116,95,114,101,115,111, + 117,114,99,101,95,114,101,97,100,101,114,2,4,0,0,115, + 6,0,0,0,12,2,8,1,255,128,122,30,70,105,108,101, + 76,111,97,100,101,114,46,103,101,116,95,114,101,115,111,117, + 114,99,101,95,114,101,97,100,101,114,41,13,114,130,0,0, + 0,114,129,0,0,0,114,131,0,0,0,114,132,0,0,0, + 114,215,0,0,0,114,249,0,0,0,114,253,0,0,0,114, + 140,0,0,0,114,226,0,0,0,114,183,0,0,0,114,233, + 0,0,0,114,4,1,0,0,90,13,95,95,99,108,97,115, + 115,99,101,108,108,95,95,114,7,0,0,0,114,7,0,0, + 0,114,255,0,0,0,114,8,0,0,0,114,245,0,0,0, + 214,3,0,0,115,26,0,0,0,8,0,4,2,8,3,8, + 6,8,4,2,3,14,1,2,11,10,1,8,4,2,9,18, + 1,255,128,114,245,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, + 0,115,46,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, + 90,5,100,6,100,7,156,1,100,8,100,9,132,2,90,6, + 100,10,83,0,41,11,218,16,83,111,117,114,99,101,70,105, + 108,101,76,111,97,100,101,114,122,62,67,111,110,99,114,101, + 116,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,32,111,102,32,83,111,117,114,99,101,76,111,97,100,101, + 114,32,117,115,105,110,103,32,116,104,101,32,102,105,108,101, + 32,115,121,115,116,101,109,46,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, + 0,115,22,0,0,0,116,0,124,1,131,1,125,2,124,2, + 106,1,124,2,106,2,100,1,156,2,83,0,41,3,122,33, + 82,101,116,117,114,110,32,116,104,101,32,109,101,116,97,100, + 97,116,97,32,102,111,114,32,116,104,101,32,112,97,116,104, + 46,41,2,114,173,0,0,0,114,240,0,0,0,78,41,3, + 114,57,0,0,0,218,8,115,116,95,109,116,105,109,101,90, + 7,115,116,95,115,105,122,101,41,3,114,123,0,0,0,114, + 52,0,0,0,114,244,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,230,0,0,0,12,4,0, + 0,115,6,0,0,0,8,2,14,1,255,128,122,27,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,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, + 0,0,115,24,0,0,0,116,0,124,1,131,1,125,4,124, + 0,106,1,124,2,124,3,124,4,100,1,141,3,83,0,41, + 2,78,169,1,218,5,95,109,111,100,101,41,2,114,119,0, + 0,0,114,231,0,0,0,41,5,114,123,0,0,0,114,112, + 0,0,0,114,111,0,0,0,114,37,0,0,0,114,60,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,232,0,0,0,17,4,0,0,115,6,0,0,0,8, + 2,16,1,255,128,122,32,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,99,111,100,101,114,68,0,0,0,114,7,1,0, + 0,99,3,0,0,0,0,0,0,0,1,0,0,0,9,0, + 0,0,11,0,0,0,67,0,0,0,115,244,0,0,0,116, + 0,124,1,131,1,92,2,125,4,125,5,103,0,125,6,124, + 4,114,52,116,1,124,4,131,1,115,52,116,0,124,4,131, + 1,92,2,125,4,125,7,124,6,160,2,124,7,161,1,1, + 0,113,16,116,3,124,6,131,1,68,0,93,98,125,7,116, + 4,124,4,124,7,131,2,125,4,122,14,116,5,160,6,124, + 4,161,1,1,0,87,0,113,60,4,0,116,7,121,106,1, + 0,1,0,1,0,89,0,113,60,4,0,116,8,121,158,1, + 0,125,8,1,0,122,30,116,9,160,10,100,1,124,4,124, + 8,161,3,1,0,87,0,89,0,100,2,125,8,126,8,1, + 0,100,2,83,0,100,2,125,8,126,8,48,0,48,0,122, + 30,116,11,124,1,124,2,124,3,131,3,1,0,116,9,160, + 10,100,3,124,1,161,2,1,0,87,0,100,2,83,0,4, + 0,116,8,121,242,1,0,125,8,1,0,122,28,116,9,160, + 10,100,1,124,1,124,8,161,3,1,0,87,0,89,0,100, + 2,125,8,126,8,100,2,83,0,100,2,125,8,126,8,48, + 0,48,0,41,4,122,27,87,114,105,116,101,32,98,121,116, + 101,115,32,100,97,116,97,32,116,111,32,97,32,102,105,108, + 101,46,122,27,99,111,117,108,100,32,110,111,116,32,99,114, + 101,97,116,101,32,123,33,114,125,58,32,123,33,114,125,78, + 122,12,99,114,101,97,116,101,100,32,123,33,114,125,41,12, + 114,55,0,0,0,114,64,0,0,0,114,190,0,0,0,114, + 50,0,0,0,114,48,0,0,0,114,18,0,0,0,90,5, + 109,107,100,105,114,218,15,70,105,108,101,69,120,105,115,116, + 115,69,114,114,111,114,114,58,0,0,0,114,139,0,0,0, + 114,153,0,0,0,114,77,0,0,0,41,9,114,123,0,0, + 0,114,52,0,0,0,114,37,0,0,0,114,8,1,0,0, + 218,6,112,97,114,101,110,116,114,101,0,0,0,114,47,0, + 0,0,114,43,0,0,0,114,234,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,231,0,0,0, + 22,4,0,0,115,54,0,0,0,12,2,4,1,12,2,12, + 1,12,1,12,2,10,1,2,1,14,1,12,1,4,2,14, + 1,6,3,4,1,4,255,16,2,10,128,2,1,12,1,14, + 1,4,128,14,1,8,2,2,1,8,255,20,128,255,128,122, + 25,83,111,117,114,99,101,70,105,108,101,76,111,97,100,101, + 114,46,115,101,116,95,100,97,116,97,78,41,7,114,130,0, + 0,0,114,129,0,0,0,114,131,0,0,0,114,132,0,0, + 0,114,230,0,0,0,114,232,0,0,0,114,231,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,5,1,0,0,8,4,0,0,115,12,0, + 0,0,8,0,4,2,8,2,8,5,18,5,255,128,114,5, + 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,64,0,0,0,115,32,0,0, + 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, + 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,83, + 0,41,7,218,20,83,111,117,114,99,101,108,101,115,115,70, + 105,108,101,76,111,97,100,101,114,122,45,76,111,97,100,101, + 114,32,119,104,105,99,104,32,104,97,110,100,108,101,115,32, + 115,111,117,114,99,101,108,101,115,115,32,102,105,108,101,32, + 105,109,112,111,114,116,115,46,99,2,0,0,0,0,0,0, + 0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,0, + 0,115,68,0,0,0,124,0,160,0,124,1,161,1,125,2, + 124,0,160,1,124,2,161,1,125,3,124,1,124,2,100,1, + 156,2,125,4,116,2,124,3,124,1,124,4,131,3,1,0, + 116,3,116,4,124,3,131,1,100,2,100,0,133,2,25,0, + 124,1,124,2,100,3,141,3,83,0,41,4,78,114,163,0, + 0,0,114,149,0,0,0,41,2,114,121,0,0,0,114,111, + 0,0,0,41,5,114,183,0,0,0,114,233,0,0,0,114, + 156,0,0,0,114,169,0,0,0,114,241,0,0,0,41,5, + 114,123,0,0,0,114,143,0,0,0,114,52,0,0,0,114, + 37,0,0,0,114,155,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,219,0,0,0,57,4,0, + 0,115,24,0,0,0,10,1,10,1,2,4,2,1,6,254, + 12,4,2,1,14,1,2,1,2,1,6,253,255,128,122,29, + 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,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,122,39,82,101,116,117,114,110,32,78,111,110,101,32,97, + 115,32,116,104,101,114,101,32,105,115,32,110,111,32,115,111, + 117,114,99,101,32,99,111,100,101,46,78,114,7,0,0,0, + 114,225,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,235,0,0,0,73,4,0,0,115,4,0, + 0,0,4,2,255,128,122,31,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,41,6,114,130,0,0,0,114, + 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,219, + 0,0,0,114,235,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,11,1,0, + 0,53,4,0,0,115,10,0,0,0,8,0,4,2,8,2, + 12,16,255,128,114,11,1,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0, + 0,0,115,92,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, + 0,90,5,100,6,100,7,132,0,90,6,100,8,100,9,132, + 0,90,7,100,10,100,11,132,0,90,8,100,12,100,13,132, + 0,90,9,100,14,100,15,132,0,90,10,100,16,100,17,132, + 0,90,11,101,12,100,18,100,19,132,0,131,1,90,13,100, + 20,83,0,41,21,114,2,1,0,0,122,93,76,111,97,100, + 101,114,32,102,111,114,32,101,120,116,101,110,115,105,111,110, + 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,84, + 104,101,32,99,111,110,115,116,114,117,99,116,111,114,32,105, + 115,32,100,101,115,105,103,110,101,100,32,116,111,32,119,111, + 114,107,32,119,105,116,104,32,70,105,108,101,70,105,110,100, + 101,114,46,10,10,32,32,32,32,99,3,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,2,0,0,0,67,0, + 0,0,115,16,0,0,0,124,1,124,0,95,0,124,2,124, + 0,95,1,100,0,83,0,114,114,0,0,0,114,163,0,0, + 0,41,3,114,123,0,0,0,114,121,0,0,0,114,52,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,215,0,0,0,86,4,0,0,115,8,0,0,0,6, + 1,6,1,4,128,255,128,122,28,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,0,0, 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,24, 0,0,0,124,0,106,0,124,1,106,0,107,2,111,22,124, - 0,106,1,124,1,106,1,107,2,83,0,114,109,0,0,0, - 169,2,218,9,95,95,99,108,97,115,115,95,95,114,131,0, - 0,0,169,2,114,118,0,0,0,90,5,111,116,104,101,114, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 6,95,95,101,113,95,95,186,3,0,0,115,8,0,0,0, - 12,1,10,1,2,255,255,128,122,17,70,105,108,101,76,111, + 0,106,1,124,1,106,1,107,2,83,0,114,114,0,0,0, + 114,246,0,0,0,114,248,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,249,0,0,0,90,4, + 0,0,115,8,0,0,0,12,1,10,1,2,255,255,128,122, + 26,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, 97,100,101,114,46,95,95,101,113,95,95,99,1,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, 67,0,0,0,115,20,0,0,0,116,0,124,0,106,1,131, - 1,116,0,124,0,106,2,131,1,65,0,83,0,114,109,0, - 0,0,169,3,218,4,104,97,115,104,114,116,0,0,0,114, - 44,0,0,0,169,1,114,118,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,218,8,95,95,104,97, - 115,104,95,95,190,3,0,0,115,4,0,0,0,20,1,255, - 128,122,19,70,105,108,101,76,111,97,100,101,114,46,95,95, - 104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,115, - 16,0,0,0,116,0,116,1,124,0,131,2,160,2,124,1, - 161,1,83,0,41,2,122,100,76,111,97,100,32,97,32,109, - 111,100,117,108,101,32,102,114,111,109,32,97,32,102,105,108, - 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, - 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, - 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99, - 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, - 100,46,10,10,32,32,32,32,32,32,32,32,78,41,3,218, - 5,115,117,112,101,114,114,239,0,0,0,114,220,0,0,0, - 114,219,0,0,0,169,1,114,241,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,220,0,0,0,193,3,0,0,115, - 4,0,0,0,16,10,255,128,122,22,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,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,6,0,0,0,124,0, - 106,0,83,0,169,2,122,58,82,101,116,117,114,110,32,116, - 104,101,32,112,97,116,104,32,116,111,32,116,104,101,32,115, - 111,117,114,99,101,32,102,105,108,101,32,97,115,32,102,111, - 117,110,100,32,98,121,32,116,104,101,32,102,105,110,100,101, - 114,46,78,114,48,0,0,0,114,219,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,179,0,0, - 0,205,3,0,0,115,4,0,0,0,6,3,255,128,122,23, - 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, - 0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,0, - 115,128,0,0,0,116,0,124,0,116,1,116,2,102,2,131, - 2,114,72,116,3,160,4,116,5,124,1,131,1,161,1,143, - 24,125,2,124,2,160,6,161,0,87,0,2,0,100,1,4, - 0,4,0,131,3,1,0,83,0,49,0,115,58,48,0,1, - 0,1,0,1,0,89,0,1,0,100,1,83,0,116,3,160, - 7,124,1,100,2,161,2,143,24,125,2,124,2,160,6,161, - 0,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, - 0,49,0,115,114,48,0,1,0,1,0,1,0,89,0,1, - 0,100,1,83,0,41,3,122,39,82,101,116,117,114,110,32, - 116,104,101,32,100,97,116,97,32,102,114,111,109,32,112,97, - 116,104,32,97,115,32,114,97,119,32,98,121,116,101,115,46, - 78,218,1,114,41,8,114,161,0,0,0,114,221,0,0,0, - 218,19,69,120,116,101,110,115,105,111,110,70,105,108,101,76, - 111,97,100,101,114,114,64,0,0,0,90,9,111,112,101,110, - 95,99,111,100,101,114,84,0,0,0,90,4,114,101,97,100, - 114,65,0,0,0,41,3,114,118,0,0,0,114,44,0,0, - 0,114,68,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,227,0,0,0,210,3,0,0,115,16, - 0,0,0,14,2,16,1,38,1,4,128,14,2,38,1,4, - 128,255,128,122,19,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,100,97,116,97,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, - 0,115,20,0,0,0,100,1,100,2,108,0,109,1,125,2, - 1,0,124,2,124,0,131,1,83,0,41,3,78,114,73,0, - 0,0,41,1,218,10,70,105,108,101,82,101,97,100,101,114, - 41,2,90,17,105,109,112,111,114,116,108,105,98,46,114,101, - 97,100,101,114,115,114,253,0,0,0,41,3,114,118,0,0, - 0,114,216,0,0,0,114,253,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,218,19,103,101,116,95, - 114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,219, - 3,0,0,115,6,0,0,0,12,2,8,1,255,128,122,30, - 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,114, - 101,115,111,117,114,99,101,95,114,101,97,100,101,114,41,13, - 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, - 127,0,0,0,114,209,0,0,0,114,243,0,0,0,114,247, - 0,0,0,114,136,0,0,0,114,220,0,0,0,114,179,0, - 0,0,114,227,0,0,0,114,254,0,0,0,90,13,95,95, - 99,108,97,115,115,99,101,108,108,95,95,114,5,0,0,0, - 114,5,0,0,0,114,249,0,0,0,114,8,0,0,0,114, - 239,0,0,0,175,3,0,0,115,26,0,0,0,8,0,4, - 2,8,3,8,6,8,4,2,3,14,1,2,11,10,1,8, - 4,2,9,18,1,255,128,114,239,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,64,0,0,0,115,46,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, - 100,5,132,0,90,5,100,6,100,7,156,1,100,8,100,9, - 132,2,90,6,100,10,83,0,41,11,218,16,83,111,117,114, - 99,101,70,105,108,101,76,111,97,100,101,114,122,62,67,111, - 110,99,114,101,116,101,32,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,32,111,102,32,83,111,117,114,99,101,76, - 111,97,100,101,114,32,117,115,105,110,103,32,116,104,101,32, - 102,105,108,101,32,115,121,115,116,101,109,46,99,2,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, - 0,67,0,0,0,115,22,0,0,0,116,0,124,1,131,1, - 125,2,124,2,106,1,124,2,106,2,100,1,156,2,83,0, - 41,3,122,33,82,101,116,117,114,110,32,116,104,101,32,109, - 101,116,97,100,97,116,97,32,102,111,114,32,116,104,101,32, - 112,97,116,104,46,41,2,114,169,0,0,0,114,234,0,0, - 0,78,41,3,114,49,0,0,0,218,8,115,116,95,109,116, - 105,109,101,90,7,115,116,95,115,105,122,101,41,3,114,118, - 0,0,0,114,44,0,0,0,114,238,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,224,0,0, - 0,229,3,0,0,115,6,0,0,0,8,2,14,1,255,128, - 122,27,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,0,0,0,0,0,5,0,0,0,5,0, - 0,0,67,0,0,0,115,24,0,0,0,116,0,124,1,131, - 1,125,4,124,0,106,1,124,2,124,3,124,4,100,1,141, - 3,83,0,41,2,78,169,1,218,5,95,109,111,100,101,41, - 2,114,114,0,0,0,114,225,0,0,0,41,5,114,118,0, - 0,0,114,107,0,0,0,114,106,0,0,0,114,26,0,0, - 0,114,52,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,226,0,0,0,234,3,0,0,115,6, - 0,0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,60,0,0,0, - 114,1,1,0,0,99,3,0,0,0,0,0,0,0,1,0, - 0,0,9,0,0,0,11,0,0,0,67,0,0,0,115,244, - 0,0,0,116,0,124,1,131,1,92,2,125,4,125,5,103, - 0,125,6,124,4,114,52,116,1,124,4,131,1,115,52,116, - 0,124,4,131,1,92,2,125,4,125,7,124,6,160,2,124, - 7,161,1,1,0,113,16,116,3,124,6,131,1,68,0,93, - 98,125,7,116,4,124,4,124,7,131,2,125,4,122,14,116, - 5,160,6,124,4,161,1,1,0,87,0,113,60,4,0,116, - 7,121,106,1,0,1,0,1,0,89,0,113,60,4,0,116, - 8,121,158,1,0,125,8,1,0,122,30,116,9,160,10,100, - 1,124,4,124,8,161,3,1,0,87,0,89,0,100,2,125, - 8,126,8,1,0,100,2,83,0,100,2,125,8,126,8,48, - 0,48,0,122,30,116,11,124,1,124,2,124,3,131,3,1, - 0,116,9,160,10,100,3,124,1,161,2,1,0,87,0,100, - 2,83,0,4,0,116,8,121,242,1,0,125,8,1,0,122, - 28,116,9,160,10,100,1,124,1,124,8,161,3,1,0,87, - 0,89,0,100,2,125,8,126,8,100,2,83,0,100,2,125, - 8,126,8,48,0,48,0,41,4,122,27,87,114,105,116,101, - 32,98,121,116,101,115,32,100,97,116,97,32,116,111,32,97, - 32,102,105,108,101,46,122,27,99,111,117,108,100,32,110,111, - 116,32,99,114,101,97,116,101,32,123,33,114,125,58,32,123, - 33,114,125,78,122,12,99,114,101,97,116,101,100,32,123,33, - 114,125,41,12,114,47,0,0,0,114,56,0,0,0,114,186, - 0,0,0,114,42,0,0,0,114,38,0,0,0,114,4,0, - 0,0,90,5,109,107,100,105,114,218,15,70,105,108,101,69, - 120,105,115,116,115,69,114,114,111,114,114,50,0,0,0,114, - 134,0,0,0,114,149,0,0,0,114,69,0,0,0,41,9, - 114,118,0,0,0,114,44,0,0,0,114,26,0,0,0,114, - 2,1,0,0,218,6,112,97,114,101,110,116,114,96,0,0, - 0,114,37,0,0,0,114,33,0,0,0,114,228,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 225,0,0,0,239,3,0,0,115,54,0,0,0,12,2,4, - 1,12,2,12,1,12,1,12,2,10,1,2,1,14,1,12, - 1,4,2,14,1,6,3,4,1,4,255,16,2,10,128,2, - 1,12,1,14,1,4,128,14,1,8,2,2,1,8,255,20, - 128,255,128,122,25,83,111,117,114,99,101,70,105,108,101,76, - 111,97,100,101,114,46,115,101,116,95,100,97,116,97,78,41, - 7,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,127,0,0,0,114,224,0,0,0,114,226,0,0,0,114, - 225,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,255,0,0,0,225,3,0, - 0,115,12,0,0,0,8,0,4,2,8,2,8,5,18,5, - 255,128,114,255,0,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,64,0,0,0, - 115,32,0,0,0,101,0,90,1,100,0,90,2,100,1,90, - 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, - 5,100,6,83,0,41,7,218,20,83,111,117,114,99,101,108, - 101,115,115,70,105,108,101,76,111,97,100,101,114,122,45,76, - 111,97,100,101,114,32,119,104,105,99,104,32,104,97,110,100, - 108,101,115,32,115,111,117,114,99,101,108,101,115,115,32,102, - 105,108,101,32,105,109,112,111,114,116,115,46,99,2,0,0, - 0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0, - 0,67,0,0,0,115,68,0,0,0,124,0,160,0,124,1, - 161,1,125,2,124,0,160,1,124,2,161,1,125,3,124,1, - 124,2,100,1,156,2,125,4,116,2,124,3,124,1,124,4, - 131,3,1,0,116,3,116,4,124,3,131,1,100,2,100,0, - 133,2,25,0,124,1,124,2,100,3,141,3,83,0,41,4, - 78,114,159,0,0,0,114,145,0,0,0,41,2,114,116,0, - 0,0,114,106,0,0,0,41,5,114,179,0,0,0,114,227, - 0,0,0,114,152,0,0,0,114,165,0,0,0,114,235,0, - 0,0,41,5,114,118,0,0,0,114,139,0,0,0,114,44, - 0,0,0,114,26,0,0,0,114,151,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,213,0,0, - 0,18,4,0,0,115,24,0,0,0,10,1,10,1,2,4, - 2,1,6,254,12,4,2,1,14,1,2,1,2,1,6,253, - 255,128,122,29,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,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,39,82,101,116,117,114,110,32,78,111, - 110,101,32,97,115,32,116,104,101,114,101,32,105,115,32,110, - 111,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114, - 5,0,0,0,114,219,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,229,0,0,0,34,4,0, - 0,115,4,0,0,0,4,2,255,128,122,31,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,41,6,114,125, - 0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,0, - 0,0,114,213,0,0,0,114,229,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,5,1,0,0,14,4,0,0,115,10,0,0,0,8,0, - 4,2,8,2,12,16,255,128,114,5,1,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,64,0,0,0,115,92,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,100, - 8,100,9,132,0,90,7,100,10,100,11,132,0,90,8,100, - 12,100,13,132,0,90,9,100,14,100,15,132,0,90,10,100, - 16,100,17,132,0,90,11,101,12,100,18,100,19,132,0,131, - 1,90,13,100,20,83,0,41,21,114,252,0,0,0,122,93, - 76,111,97,100,101,114,32,102,111,114,32,101,120,116,101,110, - 115,105,111,110,32,109,111,100,117,108,101,115,46,10,10,32, - 32,32,32,84,104,101,32,99,111,110,115,116,114,117,99,116, - 111,114,32,105,115,32,100,101,115,105,103,110,101,100,32,116, - 111,32,119,111,114,107,32,119,105,116,104,32,70,105,108,101, - 70,105,110,100,101,114,46,10,10,32,32,32,32,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0, - 0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,95, - 0,124,2,124,0,95,1,100,0,83,0,114,109,0,0,0, - 114,159,0,0,0,41,3,114,118,0,0,0,114,116,0,0, - 0,114,44,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,209,0,0,0,51,4,0,0,115,8, - 0,0,0,6,1,6,1,4,128,255,128,122,28,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0, - 0,0,115,24,0,0,0,124,0,106,0,124,1,106,0,107, - 2,111,22,124,0,106,1,124,1,106,1,107,2,83,0,114, - 109,0,0,0,114,240,0,0,0,114,242,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,243,0, - 0,0,55,4,0,0,115,8,0,0,0,12,1,10,1,2, - 255,255,128,122,26,69,120,116,101,110,115,105,111,110,70,105, - 108,101,76,111,97,100,101,114,46,95,95,101,113,95,95,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,20,0,0,0,116,0,124, - 0,106,1,131,1,116,0,124,0,106,2,131,1,65,0,83, - 0,114,109,0,0,0,114,244,0,0,0,114,246,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 247,0,0,0,59,4,0,0,115,4,0,0,0,20,1,255, - 128,122,28,69,120,116,101,110,115,105,111,110,70,105,108,101, - 76,111,97,100,101,114,46,95,95,104,97,115,104,95,95,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 5,0,0,0,67,0,0,0,115,36,0,0,0,116,0,160, - 1,116,2,106,3,124,1,161,2,125,2,116,0,160,4,100, - 1,124,1,106,5,124,0,106,6,161,3,1,0,124,2,83, - 0,41,3,122,38,67,114,101,97,116,101,32,97,110,32,117, - 110,105,116,105,97,108,105,122,101,100,32,101,120,116,101,110, - 115,105,111,110,32,109,111,100,117,108,101,122,38,101,120,116, - 101,110,115,105,111,110,32,109,111,100,117,108,101,32,123,33, - 114,125,32,108,111,97,100,101,100,32,102,114,111,109,32,123, - 33,114,125,78,41,7,114,134,0,0,0,114,214,0,0,0, - 114,163,0,0,0,90,14,99,114,101,97,116,101,95,100,121, - 110,97,109,105,99,114,149,0,0,0,114,116,0,0,0,114, - 44,0,0,0,41,3,114,118,0,0,0,114,187,0,0,0, - 114,216,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,212,0,0,0,62,4,0,0,115,16,0, - 0,0,4,2,6,1,4,255,6,2,8,1,4,255,4,2, - 255,128,122,33,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,46,99,114,101,97,116,101,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,5,0,0,0,67,0,0,0,115,36, - 0,0,0,116,0,160,1,116,2,106,3,124,1,161,2,1, - 0,116,0,160,4,100,1,124,0,106,5,124,0,106,6,161, - 3,1,0,100,2,83,0,41,3,122,30,73,110,105,116,105, - 97,108,105,122,101,32,97,110,32,101,120,116,101,110,115,105, - 111,110,32,109,111,100,117,108,101,122,40,101,120,116,101,110, - 115,105,111,110,32,109,111,100,117,108,101,32,123,33,114,125, - 32,101,120,101,99,117,116,101,100,32,102,114,111,109,32,123, - 33,114,125,78,41,7,114,134,0,0,0,114,214,0,0,0, - 114,163,0,0,0,90,12,101,120,101,99,95,100,121,110,97, - 109,105,99,114,149,0,0,0,114,116,0,0,0,114,44,0, - 0,0,169,2,114,118,0,0,0,114,216,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,217,0, - 0,0,70,4,0,0,115,12,0,0,0,14,2,6,1,8, - 1,4,255,4,128,255,128,122,31,69,120,116,101,110,115,105, - 111,110,70,105,108,101,76,111,97,100,101,114,46,101,120,101, - 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,3,0,0, - 0,115,36,0,0,0,116,0,124,0,106,1,131,1,100,1, - 25,0,137,0,116,2,135,0,102,1,100,2,100,3,132,8, - 116,3,68,0,131,1,131,1,83,0,41,5,122,49,82,101, - 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101, - 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,114, - 39,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,4,0,0,0,51,0,0,0,115,26,0, - 0,0,124,0,93,18,125,1,136,0,100,0,124,1,23,0, - 107,2,86,0,1,0,113,2,100,1,83,0,41,2,114,209, - 0,0,0,78,114,5,0,0,0,169,2,114,32,0,0,0, - 218,6,115,117,102,102,105,120,169,1,90,9,102,105,108,101, - 95,110,97,109,101,114,5,0,0,0,114,8,0,0,0,218, - 9,60,103,101,110,101,120,112,114,62,79,4,0,0,115,10, - 0,0,0,4,0,2,1,16,255,4,128,255,128,122,49,69, + 1,116,0,124,0,106,2,131,1,65,0,83,0,114,114,0, + 0,0,114,250,0,0,0,114,252,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,253,0,0,0, + 94,4,0,0,115,4,0,0,0,20,1,255,128,122,28,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, - 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62, - 78,41,4,114,47,0,0,0,114,44,0,0,0,218,3,97, - 110,121,218,18,69,88,84,69,78,83,73,79,78,95,83,85, - 70,70,73,88,69,83,114,219,0,0,0,114,5,0,0,0, - 114,9,1,0,0,114,8,0,0,0,114,182,0,0,0,76, - 4,0,0,115,10,0,0,0,14,2,12,1,2,1,8,255, - 255,128,122,30,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,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,63,82,101,116,117,114,110,32,78, - 111,110,101,32,97,115,32,97,110,32,101,120,116,101,110,115, - 105,111,110,32,109,111,100,117,108,101,32,99,97,110,110,111, - 116,32,99,114,101,97,116,101,32,97,32,99,111,100,101,32, - 111,98,106,101,99,116,46,78,114,5,0,0,0,114,219,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,213,0,0,0,82,4,0,0,115,4,0,0,0,4, - 2,255,128,122,28,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,114,46,95,95,104,97,115,104,95,95,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,5,0,0,0, + 67,0,0,0,115,36,0,0,0,116,0,160,1,116,2,106, + 3,124,1,161,2,125,2,116,0,160,4,100,1,124,1,106, + 5,124,0,106,6,161,3,1,0,124,2,83,0,41,3,122, + 38,67,114,101,97,116,101,32,97,110,32,117,110,105,116,105, + 97,108,105,122,101,100,32,101,120,116,101,110,115,105,111,110, + 32,109,111,100,117,108,101,122,38,101,120,116,101,110,115,105, + 111,110,32,109,111,100,117,108,101,32,123,33,114,125,32,108, + 111,97,100,101,100,32,102,114,111,109,32,123,33,114,125,78, + 41,7,114,139,0,0,0,114,220,0,0,0,114,167,0,0, + 0,90,14,99,114,101,97,116,101,95,100,121,110,97,109,105, + 99,114,153,0,0,0,114,121,0,0,0,114,52,0,0,0, + 41,3,114,123,0,0,0,114,191,0,0,0,114,222,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,218,0,0,0,97,4,0,0,115,16,0,0,0,4,2, + 6,1,4,255,6,2,8,1,4,255,4,2,255,128,122,33, + 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, + 100,101,114,46,99,114,101,97,116,101,95,109,111,100,117,108, 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,53,82,101,116,117,114,110,32,78,111, - 110,101,32,97,115,32,101,120,116,101,110,115,105,111,110,32, - 109,111,100,117,108,101,115,32,104,97,118,101,32,110,111,32, - 115,111,117,114,99,101,32,99,111,100,101,46,78,114,5,0, - 0,0,114,219,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,229,0,0,0,86,4,0,0,115, - 4,0,0,0,4,2,255,128,122,30,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,99,2,0,0,0,0,0,0, + 0,0,5,0,0,0,67,0,0,0,115,36,0,0,0,116, + 0,160,1,116,2,106,3,124,1,161,2,1,0,116,0,160, + 4,100,1,124,0,106,5,124,0,106,6,161,3,1,0,100, + 2,83,0,41,3,122,30,73,110,105,116,105,97,108,105,122, + 101,32,97,110,32,101,120,116,101,110,115,105,111,110,32,109, + 111,100,117,108,101,122,40,101,120,116,101,110,115,105,111,110, + 32,109,111,100,117,108,101,32,123,33,114,125,32,101,120,101, + 99,117,116,101,100,32,102,114,111,109,32,123,33,114,125,78, + 41,7,114,139,0,0,0,114,220,0,0,0,114,167,0,0, + 0,90,12,101,120,101,99,95,100,121,110,97,109,105,99,114, + 153,0,0,0,114,121,0,0,0,114,52,0,0,0,169,2, + 114,123,0,0,0,114,222,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,223,0,0,0,105,4, + 0,0,115,12,0,0,0,14,2,6,1,8,1,4,255,4, + 128,255,128,122,31,69,120,116,101,110,115,105,111,110,70,105, + 108,101,76,111,97,100,101,114,46,101,120,101,99,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,4,0,0,0,3,0,0,0,115,36,0, + 0,0,116,0,124,0,106,1,131,1,100,1,25,0,137,0, + 116,2,135,0,102,1,100,2,100,3,132,8,116,3,68,0, + 131,1,131,1,83,0,41,5,122,49,82,101,116,117,114,110, + 32,84,114,117,101,32,105,102,32,116,104,101,32,101,120,116, + 101,110,115,105,111,110,32,109,111,100,117,108,101,32,105,115, + 32,97,32,112,97,99,107,97,103,101,46,114,3,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,51,0,0,0,115,26,0,0,0,124,0, + 93,18,125,1,136,0,100,0,124,1,23,0,107,2,86,0, + 1,0,113,2,100,1,83,0,41,2,114,215,0,0,0,78, + 114,7,0,0,0,169,2,114,5,0,0,0,218,6,115,117, + 102,102,105,120,169,1,90,9,102,105,108,101,95,110,97,109, + 101,114,7,0,0,0,114,8,0,0,0,114,9,0,0,0, + 114,4,0,0,115,10,0,0,0,4,0,2,1,16,255,4, + 128,255,128,122,49,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,111,99,97,108,115,62,46,60,103,101, + 110,101,120,112,114,62,78,41,4,114,55,0,0,0,114,52, + 0,0,0,218,3,97,110,121,114,212,0,0,0,114,225,0, + 0,0,114,7,0,0,0,114,15,1,0,0,114,8,0,0, + 0,114,186,0,0,0,111,4,0,0,115,10,0,0,0,14, + 2,12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,63,82, + 101,116,117,114,110,32,78,111,110,101,32,97,115,32,97,110, + 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, + 101,32,99,97,110,110,111,116,32,99,114,101,97,116,101,32, + 97,32,99,111,100,101,32,111,98,106,101,99,116,46,78,114, + 7,0,0,0,114,225,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,219,0,0,0,117,4,0, + 0,115,4,0,0,0,4,2,255,128,122,28,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,6,0,0,0,124,0,106,0,83,0,114,250,0,0, - 0,114,48,0,0,0,114,219,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,179,0,0,0,90, - 4,0,0,115,4,0,0,0,6,3,255,128,122,32,69,120, - 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, - 114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,41, - 14,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,127,0,0,0,114,209,0,0,0,114,243,0,0,0,114, - 247,0,0,0,114,212,0,0,0,114,217,0,0,0,114,182, - 0,0,0,114,213,0,0,0,114,229,0,0,0,114,136,0, - 0,0,114,179,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,114,252,0,0,0, - 43,4,0,0,115,26,0,0,0,8,0,4,2,8,6,8, - 4,8,4,8,3,8,8,8,6,8,6,8,4,2,4,14, - 1,255,128,114,252,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,104,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0, - 90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,0, - 90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,0, - 90,11,100,18,100,19,132,0,90,12,100,20,100,21,132,0, - 90,13,100,22,100,23,132,0,90,14,100,24,83,0,41,25, - 218,14,95,78,97,109,101,115,112,97,99,101,80,97,116,104, - 97,38,1,0,0,82,101,112,114,101,115,101,110,116,115,32, - 97,32,110,97,109,101,115,112,97,99,101,32,112,97,99,107, - 97,103,101,39,115,32,112,97,116,104,46,32,32,73,116,32, - 117,115,101,115,32,116,104,101,32,109,111,100,117,108,101,32, - 110,97,109,101,10,32,32,32,32,116,111,32,102,105,110,100, - 32,105,116,115,32,112,97,114,101,110,116,32,109,111,100,117, - 108,101,44,32,97,110,100,32,102,114,111,109,32,116,104,101, - 114,101,32,105,116,32,108,111,111,107,115,32,117,112,32,116, - 104,101,32,112,97,114,101,110,116,39,115,10,32,32,32,32, - 95,95,112,97,116,104,95,95,46,32,32,87,104,101,110,32, - 116,104,105,115,32,99,104,97,110,103,101,115,44,32,116,104, - 101,32,109,111,100,117,108,101,39,115,32,111,119,110,32,112, - 97,116,104,32,105,115,32,114,101,99,111,109,112,117,116,101, - 100,44,10,32,32,32,32,117,115,105,110,103,32,112,97,116, - 104,95,102,105,110,100,101,114,46,32,32,70,111,114,32,116, - 111,112,45,108,101,118,101,108,32,109,111,100,117,108,101,115, - 44,32,116,104,101,32,112,97,114,101,110,116,32,109,111,100, - 117,108,101,39,115,32,112,97,116,104,10,32,32,32,32,105, - 115,32,115,121,115,46,112,97,116,104,46,99,4,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0, - 67,0,0,0,115,36,0,0,0,124,1,124,0,95,0,124, - 2,124,0,95,1,116,2,124,0,160,3,161,0,131,1,124, - 0,95,4,124,3,124,0,95,5,100,0,83,0,114,109,0, - 0,0,41,6,218,5,95,110,97,109,101,218,5,95,112,97, - 116,104,114,111,0,0,0,218,16,95,103,101,116,95,112,97, - 114,101,110,116,95,112,97,116,104,218,17,95,108,97,115,116, - 95,112,97,114,101,110,116,95,112,97,116,104,218,12,95,112, - 97,116,104,95,102,105,110,100,101,114,169,4,114,118,0,0, - 0,114,116,0,0,0,114,44,0,0,0,90,11,112,97,116, - 104,95,102,105,110,100,101,114,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,114,209,0,0,0,103,4,0,0, - 115,12,0,0,0,6,1,6,1,14,1,6,1,4,128,255, - 128,122,23,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,0,0,0,0,4,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,124,0,106,0,160,1,100,1, - 161,1,92,3,125,1,125,2,125,3,124,2,100,2,107,2, - 114,30,100,3,83,0,124,1,100,4,102,2,83,0,41,6, - 122,62,82,101,116,117,114,110,115,32,97,32,116,117,112,108, - 101,32,111,102,32,40,112,97,114,101,110,116,45,109,111,100, - 117,108,101,45,110,97,109,101,44,32,112,97,114,101,110,116, - 45,112,97,116,104,45,97,116,116,114,45,110,97,109,101,41, - 114,71,0,0,0,114,40,0,0,0,41,2,114,1,0,0, - 0,114,44,0,0,0,90,8,95,95,112,97,116,104,95,95, - 78,41,2,114,14,1,0,0,114,41,0,0,0,41,4,114, - 118,0,0,0,114,4,1,0,0,218,3,100,111,116,90,2, - 109,101,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,23,95,102,105,110,100,95,112,97,114,101,110,116,95, - 112,97,116,104,95,110,97,109,101,115,109,4,0,0,115,10, - 0,0,0,18,2,8,1,4,2,8,3,255,128,122,38,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,101,115,99,1,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,28, - 0,0,0,124,0,160,0,161,0,92,2,125,1,125,2,116, - 1,116,2,106,3,124,1,25,0,124,2,131,2,83,0,114, - 109,0,0,0,41,4,114,21,1,0,0,114,130,0,0,0, - 114,1,0,0,0,218,7,109,111,100,117,108,101,115,41,3, - 114,118,0,0,0,90,18,112,97,114,101,110,116,95,109,111, - 100,117,108,101,95,110,97,109,101,90,14,112,97,116,104,95, - 97,116,116,114,95,110,97,109,101,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,16,1,0,0,119,4,0, - 0,115,6,0,0,0,12,1,16,1,255,128,122,31,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,0,0,0,0,3,0,0,0,4,0, - 0,0,67,0,0,0,115,80,0,0,0,116,0,124,0,160, - 1,161,0,131,1,125,1,124,1,124,0,106,2,107,3,114, - 74,124,0,160,3,124,0,106,4,124,1,161,2,125,2,124, - 2,100,0,117,1,114,68,124,2,106,5,100,0,117,0,114, - 68,124,2,106,6,114,68,124,2,106,6,124,0,95,7,124, - 1,124,0,95,2,124,0,106,7,83,0,114,109,0,0,0, - 41,8,114,111,0,0,0,114,16,1,0,0,114,17,1,0, - 0,114,18,1,0,0,114,14,1,0,0,114,140,0,0,0, - 114,178,0,0,0,114,15,1,0,0,41,3,114,118,0,0, - 0,90,11,112,97,114,101,110,116,95,112,97,116,104,114,187, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,12,95,114,101,99,97,108,99,117,108,97,116,101, - 123,4,0,0,115,18,0,0,0,12,2,10,1,14,1,18, - 3,6,1,8,1,6,1,6,1,255,128,122,27,95,78,97, - 109,101,115,112,97,99,101,80,97,116,104,46,95,114,101,99, - 97,108,99,117,108,97,116,101,99,1,0,0,0,0,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,53,82,101, + 116,117,114,110,32,78,111,110,101,32,97,115,32,101,120,116, + 101,110,115,105,111,110,32,109,111,100,117,108,101,115,32,104, + 97,118,101,32,110,111,32,115,111,117,114,99,101,32,99,111, + 100,101,46,78,114,7,0,0,0,114,225,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,235,0, + 0,0,121,4,0,0,115,4,0,0,0,4,2,255,128,122, + 30,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,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, + 0,83,0,114,0,1,0,0,114,56,0,0,0,114,225,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,183,0,0,0,125,4,0,0,115,4,0,0,0,6, + 3,255,128,122,32,69,120,116,101,110,115,105,111,110,70,105, + 108,101,76,111,97,100,101,114,46,103,101,116,95,102,105,108, + 101,110,97,109,101,78,41,14,114,130,0,0,0,114,129,0, + 0,0,114,131,0,0,0,114,132,0,0,0,114,215,0,0, + 0,114,249,0,0,0,114,253,0,0,0,114,218,0,0,0, + 114,223,0,0,0,114,186,0,0,0,114,219,0,0,0,114, + 235,0,0,0,114,140,0,0,0,114,183,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,2,1,0,0,78,4,0,0,115,26,0,0,0, + 8,0,4,2,8,6,8,4,8,4,8,3,8,8,8,6, + 8,6,8,4,2,4,14,1,255,128,114,2,1,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,64,0,0,0,115,104,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, + 4,100,4,100,5,132,0,90,5,100,6,100,7,132,0,90, + 6,100,8,100,9,132,0,90,7,100,10,100,11,132,0,90, + 8,100,12,100,13,132,0,90,9,100,14,100,15,132,0,90, + 10,100,16,100,17,132,0,90,11,100,18,100,19,132,0,90, + 12,100,20,100,21,132,0,90,13,100,22,100,23,132,0,90, + 14,100,24,83,0,41,25,218,14,95,78,97,109,101,115,112, + 97,99,101,80,97,116,104,97,38,1,0,0,82,101,112,114, + 101,115,101,110,116,115,32,97,32,110,97,109,101,115,112,97, + 99,101,32,112,97,99,107,97,103,101,39,115,32,112,97,116, + 104,46,32,32,73,116,32,117,115,101,115,32,116,104,101,32, + 109,111,100,117,108,101,32,110,97,109,101,10,32,32,32,32, + 116,111,32,102,105,110,100,32,105,116,115,32,112,97,114,101, + 110,116,32,109,111,100,117,108,101,44,32,97,110,100,32,102, + 114,111,109,32,116,104,101,114,101,32,105,116,32,108,111,111, + 107,115,32,117,112,32,116,104,101,32,112,97,114,101,110,116, + 39,115,10,32,32,32,32,95,95,112,97,116,104,95,95,46, + 32,32,87,104,101,110,32,116,104,105,115,32,99,104,97,110, + 103,101,115,44,32,116,104,101,32,109,111,100,117,108,101,39, + 115,32,111,119,110,32,112,97,116,104,32,105,115,32,114,101, + 99,111,109,112,117,116,101,100,44,10,32,32,32,32,117,115, + 105,110,103,32,112,97,116,104,95,102,105,110,100,101,114,46, + 32,32,70,111,114,32,116,111,112,45,108,101,118,101,108,32, + 109,111,100,117,108,101,115,44,32,116,104,101,32,112,97,114, + 101,110,116,32,109,111,100,117,108,101,39,115,32,112,97,116, + 104,10,32,32,32,32,105,115,32,115,121,115,46,112,97,116, + 104,46,99,4,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,3,0,0,0,67,0,0,0,115,36,0,0,0, + 124,1,124,0,95,0,124,2,124,0,95,1,116,2,124,0, + 160,3,161,0,131,1,124,0,95,4,124,3,124,0,95,5, + 100,0,83,0,114,114,0,0,0,41,6,218,5,95,110,97, + 109,101,218,5,95,112,97,116,104,114,116,0,0,0,218,16, + 95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104, + 218,17,95,108,97,115,116,95,112,97,114,101,110,116,95,112, + 97,116,104,218,12,95,112,97,116,104,95,102,105,110,100,101, + 114,169,4,114,123,0,0,0,114,121,0,0,0,114,52,0, + 0,0,90,11,112,97,116,104,95,102,105,110,100,101,114,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,215, + 0,0,0,138,4,0,0,115,12,0,0,0,6,1,6,1, + 14,1,6,1,4,128,255,128,122,23,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,0,0,0,0,4,0, + 0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,124, + 0,106,0,160,1,100,1,161,1,92,3,125,1,125,2,125, + 3,124,2,100,2,107,2,114,30,100,3,83,0,124,1,100, + 4,102,2,83,0,41,6,122,62,82,101,116,117,114,110,115, + 32,97,32,116,117,112,108,101,32,111,102,32,40,112,97,114, + 101,110,116,45,109,111,100,117,108,101,45,110,97,109,101,44, + 32,112,97,114,101,110,116,45,112,97,116,104,45,97,116,116, + 114,45,110,97,109,101,41,114,79,0,0,0,114,10,0,0, + 0,41,2,114,15,0,0,0,114,52,0,0,0,90,8,95, + 95,112,97,116,104,95,95,78,41,2,114,18,1,0,0,114, + 49,0,0,0,41,4,114,123,0,0,0,114,10,1,0,0, + 218,3,100,111,116,90,2,109,101,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,23,95,102,105,110,100,95, + 112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,101, + 115,144,4,0,0,115,10,0,0,0,18,2,8,1,4,2, + 8,3,255,128,122,38,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,101,115,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, + 0,67,0,0,0,115,28,0,0,0,124,0,160,0,161,0, + 92,2,125,1,125,2,116,1,116,2,106,3,124,1,25,0, + 124,2,131,2,83,0,114,114,0,0,0,41,4,114,25,1, + 0,0,114,135,0,0,0,114,15,0,0,0,218,7,109,111, + 100,117,108,101,115,41,3,114,123,0,0,0,90,18,112,97, + 114,101,110,116,95,109,111,100,117,108,101,95,110,97,109,101, + 90,14,112,97,116,104,95,97,116,116,114,95,110,97,109,101, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 20,1,0,0,154,4,0,0,115,6,0,0,0,12,1,16, + 1,255,128,122,31,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,0,0,0, + 0,3,0,0,0,4,0,0,0,67,0,0,0,115,80,0, + 0,0,116,0,124,0,160,1,161,0,131,1,125,1,124,1, + 124,0,106,2,107,3,114,74,124,0,160,3,124,0,106,4, + 124,1,161,2,125,2,124,2,100,0,117,1,114,68,124,2, + 106,5,100,0,117,0,114,68,124,2,106,6,114,68,124,2, + 106,6,124,0,95,7,124,1,124,0,95,2,124,0,106,7, + 83,0,114,114,0,0,0,41,8,114,116,0,0,0,114,20, + 1,0,0,114,21,1,0,0,114,22,1,0,0,114,18,1, + 0,0,114,144,0,0,0,114,182,0,0,0,114,19,1,0, + 0,41,3,114,123,0,0,0,90,11,112,97,114,101,110,116, + 95,112,97,116,104,114,191,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,12,95,114,101,99,97, + 108,99,117,108,97,116,101,158,4,0,0,115,18,0,0,0, + 12,2,10,1,14,1,18,3,6,1,8,1,6,1,6,1, + 255,128,122,27,95,78,97,109,101,115,112,97,99,101,80,97, + 116,104,46,95,114,101,99,97,108,99,117,108,97,116,101,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,12,0,0,0,116,0,124, + 0,160,1,161,0,131,1,83,0,114,114,0,0,0,41,2, + 218,4,105,116,101,114,114,27,1,0,0,114,252,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 8,95,95,105,116,101,114,95,95,171,4,0,0,115,4,0, + 0,0,12,1,255,128,122,23,95,78,97,109,101,115,112,97, + 99,101,80,97,116,104,46,95,95,105,116,101,114,95,95,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 2,0,0,0,67,0,0,0,115,12,0,0,0,124,0,160, + 0,161,0,124,1,25,0,83,0,114,114,0,0,0,169,1, + 114,27,1,0,0,41,2,114,123,0,0,0,218,5,105,110, + 100,101,120,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,11,95,95,103,101,116,105,116,101,109,95,95,174, + 4,0,0,115,4,0,0,0,12,1,255,128,122,26,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,103, + 101,116,105,116,101,109,95,95,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, + 0,115,14,0,0,0,124,2,124,0,106,0,124,1,60,0, + 100,0,83,0,114,114,0,0,0,41,1,114,19,1,0,0, + 41,3,114,123,0,0,0,114,31,1,0,0,114,52,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,11,95,95,115,101,116,105,116,101,109,95,95,177,4,0, + 0,115,6,0,0,0,10,1,4,128,255,128,122,26,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,115, + 101,116,105,116,101,109,95,95,99,1,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, 0,115,12,0,0,0,116,0,124,0,160,1,161,0,131,1, - 83,0,114,109,0,0,0,41,2,218,4,105,116,101,114,114, - 23,1,0,0,114,246,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,218,8,95,95,105,116,101,114, - 95,95,136,4,0,0,115,4,0,0,0,12,1,255,128,122, + 83,0,114,114,0,0,0,41,2,114,4,0,0,0,114,27, + 1,0,0,114,252,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,7,95,95,108,101,110,95,95, + 180,4,0,0,115,4,0,0,0,12,1,255,128,122,22,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,0,0, + 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12, + 0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,41, + 2,78,122,20,95,78,97,109,101,115,112,97,99,101,80,97, + 116,104,40,123,33,114,125,41,41,2,114,70,0,0,0,114, + 19,1,0,0,114,252,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,8,95,95,114,101,112,114, + 95,95,183,4,0,0,115,4,0,0,0,12,1,255,128,122, 23,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, - 95,95,105,116,101,114,95,95,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, - 0,115,12,0,0,0,124,0,160,0,161,0,124,1,25,0, - 83,0,114,109,0,0,0,169,1,114,23,1,0,0,41,2, - 114,118,0,0,0,218,5,105,110,100,101,120,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,218,11,95,95,103, - 101,116,105,116,101,109,95,95,139,4,0,0,115,4,0,0, - 0,12,1,255,128,122,26,95,78,97,109,101,115,112,97,99, - 101,80,97,116,104,46,95,95,103,101,116,105,116,101,109,95, - 95,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,3,0,0,0,67,0,0,0,115,14,0,0,0,124, - 2,124,0,106,0,124,1,60,0,100,0,83,0,114,109,0, - 0,0,41,1,114,15,1,0,0,41,3,114,118,0,0,0, - 114,27,1,0,0,114,44,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,11,95,95,115,101,116, - 105,116,101,109,95,95,142,4,0,0,115,6,0,0,0,10, - 1,4,128,255,128,122,26,95,78,97,109,101,115,112,97,99, - 101,80,97,116,104,46,95,95,115,101,116,105,116,101,109,95, - 95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,116, - 0,124,0,160,1,161,0,131,1,83,0,114,109,0,0,0, - 41,2,114,23,0,0,0,114,23,1,0,0,114,246,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 218,7,95,95,108,101,110,95,95,145,4,0,0,115,4,0, - 0,0,12,1,255,128,122,22,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,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,12,0,0,0,100,1,160,0, - 124,0,106,1,161,1,83,0,41,2,78,122,20,95,78,97, - 109,101,115,112,97,99,101,80,97,116,104,40,123,33,114,125, - 41,41,2,114,62,0,0,0,114,15,1,0,0,114,246,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,8,95,95,114,101,112,114,95,95,148,4,0,0,115, - 4,0,0,0,12,1,255,128,122,23,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,0,0,0,0,2,0, - 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,124, - 1,124,0,160,0,161,0,118,0,83,0,114,109,0,0,0, - 114,26,1,0,0,169,2,114,118,0,0,0,218,4,105,116, - 101,109,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,12,95,95,99,111,110,116,97,105,110,115,95,95,151, - 4,0,0,115,4,0,0,0,12,1,255,128,122,27,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,0,0,0,0,2,0,0,0,3,0,0,0,67,0, - 0,0,115,16,0,0,0,124,0,106,0,160,1,124,1,161, - 1,1,0,100,0,83,0,114,109,0,0,0,41,2,114,15, - 1,0,0,114,186,0,0,0,114,32,1,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,186,0,0, - 0,154,4,0,0,115,6,0,0,0,12,1,4,128,255,128, - 122,21,95,78,97,109,101,115,112,97,99,101,80,97,116,104, - 46,97,112,112,101,110,100,78,41,15,114,125,0,0,0,114, - 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,209, - 0,0,0,114,21,1,0,0,114,16,1,0,0,114,23,1, - 0,0,114,25,1,0,0,114,28,1,0,0,114,29,1,0, - 0,114,30,1,0,0,114,31,1,0,0,114,34,1,0,0, - 114,186,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,13,1,0,0,96,4, - 0,0,115,28,0,0,0,8,0,4,1,8,6,8,6,8, - 10,8,4,8,13,8,3,8,3,8,3,8,3,8,3,12, - 3,255,128,114,13,1,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,80,0,0,0,101,0,90,1,100,0,90,2,100,1, - 100,2,132,0,90,3,101,4,100,3,100,4,132,0,131,1, - 90,5,100,5,100,6,132,0,90,6,100,7,100,8,132,0, - 90,7,100,9,100,10,132,0,90,8,100,11,100,12,132,0, - 90,9,100,13,100,14,132,0,90,10,100,15,100,16,132,0, - 90,11,100,17,83,0,41,18,218,16,95,78,97,109,101,115, - 112,97,99,101,76,111,97,100,101,114,99,4,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, - 0,0,0,115,18,0,0,0,116,0,124,1,124,2,124,3, - 131,3,124,0,95,1,100,0,83,0,114,109,0,0,0,41, - 2,114,13,1,0,0,114,15,1,0,0,114,19,1,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 209,0,0,0,160,4,0,0,115,6,0,0,0,14,1,4, - 128,255,128,122,25,95,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,0,0,0,0,2,0,0,0,3, - 0,0,0,67,0,0,0,115,12,0,0,0,100,1,160,0, - 124,1,106,1,161,1,83,0,41,3,122,115,82,101,116,117, - 114,110,32,114,101,112,114,32,102,111,114,32,116,104,101,32, - 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,101,32,109,101,116,104,111,100,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,32,84,104,101,32, - 105,109,112,111,114,116,32,109,97,99,104,105,110,101,114,121, - 32,100,111,101,115,32,116,104,101,32,106,111,98,32,105,116, - 115,101,108,102,46,10,10,32,32,32,32,32,32,32,32,122, - 25,60,109,111,100,117,108,101,32,123,33,114,125,32,40,110, - 97,109,101,115,112,97,99,101,41,62,78,41,2,114,62,0, - 0,0,114,125,0,0,0,41,2,114,193,0,0,0,114,216, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,11,109,111,100,117,108,101,95,114,101,112,114,163, - 4,0,0,115,4,0,0,0,12,7,255,128,122,28,95,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,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,78,84, - 114,5,0,0,0,114,219,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,182,0,0,0,172,4, - 0,0,115,4,0,0,0,4,1,255,128,122,27,95,78,97, - 109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,78,114,40,0, - 0,0,114,5,0,0,0,114,219,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,8,0,0,0,114,229,0,0,0, - 175,4,0,0,115,4,0,0,0,4,1,255,128,122,27,95, - 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, - 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67, - 0,0,0,115,16,0,0,0,116,0,100,1,100,2,100,3, - 100,4,100,5,141,4,83,0,41,6,78,114,40,0,0,0, - 122,8,60,115,116,114,105,110,103,62,114,215,0,0,0,84, - 41,1,114,231,0,0,0,41,1,114,232,0,0,0,114,219, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,114,213,0,0,0,178,4,0,0,115,4,0,0,0, - 16,1,255,128,122,25,95,78,97,109,101,115,112,97,99,101, - 76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,99, + 95,95,114,101,112,114,95,95,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,12,0,0,0,124,1,124,0,160,0,161,0,118,0, + 83,0,114,114,0,0,0,114,30,1,0,0,169,2,114,123, + 0,0,0,218,4,105,116,101,109,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,12,95,95,99,111,110,116, + 97,105,110,115,95,95,186,4,0,0,115,4,0,0,0,12, + 1,255,128,122,27,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,0,0,0,0,2,0,0, + 0,3,0,0,0,67,0,0,0,115,16,0,0,0,124,0, + 106,0,160,1,124,1,161,1,1,0,100,0,83,0,114,114, + 0,0,0,41,2,114,19,1,0,0,114,190,0,0,0,114, + 36,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,190,0,0,0,189,4,0,0,115,6,0,0, + 0,12,1,4,128,255,128,122,21,95,78,97,109,101,115,112, + 97,99,101,80,97,116,104,46,97,112,112,101,110,100,78,41, + 15,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, + 114,132,0,0,0,114,215,0,0,0,114,25,1,0,0,114, + 20,1,0,0,114,27,1,0,0,114,29,1,0,0,114,32, + 1,0,0,114,33,1,0,0,114,34,1,0,0,114,35,1, + 0,0,114,38,1,0,0,114,190,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,17,1,0,0,131,4,0,0,115,28,0,0,0,8,0, + 4,1,8,6,8,6,8,10,8,4,8,13,8,3,8,3, + 8,3,8,3,8,3,12,3,255,128,114,17,1,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,64,0,0,0,115,80,0,0,0,101,0,90, + 1,100,0,90,2,100,1,100,2,132,0,90,3,101,4,100, + 3,100,4,132,0,131,1,90,5,100,5,100,6,132,0,90, + 6,100,7,100,8,132,0,90,7,100,9,100,10,132,0,90, + 8,100,11,100,12,132,0,90,9,100,13,100,14,132,0,90, + 10,100,15,100,16,132,0,90,11,100,17,83,0,41,18,218, + 16,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,99,4,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,4,0,0,0,67,0,0,0,115,18,0,0,0,116, + 0,124,1,124,2,124,3,131,3,124,0,95,1,100,0,83, + 0,114,114,0,0,0,41,2,114,17,1,0,0,114,19,1, + 0,0,114,23,1,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,215,0,0,0,195,4,0,0,115, + 6,0,0,0,14,1,4,128,255,128,122,25,95,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,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12, + 0,0,0,100,1,160,0,124,1,106,1,161,1,83,0,41, + 3,122,115,82,101,116,117,114,110,32,114,101,112,114,32,102, + 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, + 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, + 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, + 32,32,32,32,32,32,122,25,60,109,111,100,117,108,101,32, + 123,33,114,125,32,40,110,97,109,101,115,112,97,99,101,41, + 62,78,41,2,114,70,0,0,0,114,130,0,0,0,41,2, + 114,197,0,0,0,114,222,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,11,109,111,100,117,108, + 101,95,114,101,112,114,198,4,0,0,115,4,0,0,0,12, + 7,255,128,122,28,95,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,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,78,84,114,7,0,0,0,114,225,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,186,0,0,0,207,4,0,0,115,4,0,0,0,4,1, + 255,128,122,27,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0, 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,114,210,0,0,0,114,5,0,0,0,114,211,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, - 212,0,0,0,181,4,0,0,115,4,0,0,0,4,128,255, - 128,122,30,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,46,99,114,101,97,116,101,95,109,111,100,117,108, + 0,41,2,78,114,10,0,0,0,114,7,0,0,0,114,225, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,235,0,0,0,210,4,0,0,115,4,0,0,0, + 4,1,255,128,122,27,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 0,83,0,114,109,0,0,0,114,5,0,0,0,114,6,1, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,217,0,0,0,184,4,0,0,115,6,0,0,0,2, - 1,2,128,255,128,122,28,95,78,97,109,101,115,112,97,99, - 101,76,111,97,100,101,114,46,101,120,101,99,95,109,111,100, - 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,4,0,0,0,67,0,0,0,115,26,0,0, - 0,116,0,160,1,100,1,124,0,106,2,161,2,1,0,116, - 0,160,3,124,0,124,1,161,2,83,0,41,3,122,98,76, - 111,97,100,32,97,32,110,97,109,101,115,112,97,99,101,32, - 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, - 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, - 32,122,38,110,97,109,101,115,112,97,99,101,32,109,111,100, - 117,108,101,32,108,111,97,100,101,100,32,119,105,116,104,32, - 112,97,116,104,32,123,33,114,125,78,41,4,114,134,0,0, - 0,114,149,0,0,0,114,15,1,0,0,114,218,0,0,0, - 114,219,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,220,0,0,0,187,4,0,0,115,10,0, - 0,0,6,7,4,1,4,255,12,2,255,128,122,28,95,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,41,12,114,125,0, - 0,0,114,124,0,0,0,114,126,0,0,0,114,209,0,0, - 0,114,207,0,0,0,114,36,1,0,0,114,182,0,0,0, - 114,229,0,0,0,114,213,0,0,0,114,212,0,0,0,114, - 217,0,0,0,114,220,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,114,35,1, - 0,0,159,4,0,0,115,22,0,0,0,8,0,8,1,2, - 3,10,1,8,8,8,3,8,3,8,3,8,3,12,3,255, - 128,114,35,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 118,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4, - 100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0, - 131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8, - 101,4,100,19,100,11,100,12,132,1,131,1,90,9,101,4, - 100,20,100,13,100,14,132,1,131,1,90,10,101,4,100,21, - 100,15,100,16,132,1,131,1,90,11,101,4,100,17,100,18, - 132,0,131,1,90,12,100,10,83,0,41,22,218,10,80,97, - 116,104,70,105,110,100,101,114,122,62,77,101,116,97,32,112, - 97,116,104,32,102,105,110,100,101,114,32,102,111,114,32,115, - 121,115,46,112,97,116,104,32,97,110,100,32,112,97,99,107, - 97,103,101,32,95,95,112,97,116,104,95,95,32,97,116,116, - 114,105,98,117,116,101,115,46,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, - 0,115,64,0,0,0,116,0,116,1,106,2,160,3,161,0, - 131,1,68,0,93,44,92,2,125,1,125,2,124,2,100,1, - 117,0,114,40,116,1,106,2,124,1,61,0,113,14,116,4, - 124,2,100,2,131,2,114,14,124,2,160,5,161,0,1,0, - 113,14,100,1,83,0,41,3,122,125,67,97,108,108,32,116, - 104,101,32,105,110,118,97,108,105,100,97,116,101,95,99,97, - 99,104,101,115,40,41,32,109,101,116,104,111,100,32,111,110, - 32,97,108,108,32,112,97,116,104,32,101,110,116,114,121,32, - 102,105,110,100,101,114,115,10,32,32,32,32,32,32,32,32, - 115,116,111,114,101,100,32,105,110,32,115,121,115,46,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,115,32,40,119,104,101,114,101,32,105,109,112,108,101,109, - 101,110,116,101,100,41,46,78,218,17,105,110,118,97,108,105, - 100,97,116,101,95,99,97,99,104,101,115,41,6,218,4,108, - 105,115,116,114,1,0,0,0,218,19,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,218,5,105, - 116,101,109,115,114,128,0,0,0,114,38,1,0,0,41,3, - 114,193,0,0,0,114,116,0,0,0,218,6,102,105,110,100, - 101,114,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,38,1,0,0,205,4,0,0,115,14,0,0,0,22, - 4,8,1,10,1,10,1,10,1,4,128,255,128,122,28,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,0,0,0,0,3,0,0,0,9,0,0,0, - 67,0,0,0,115,76,0,0,0,116,0,106,1,100,1,117, - 1,114,28,116,0,106,1,115,28,116,2,160,3,100,2,116, - 4,161,2,1,0,116,0,106,1,68,0,93,36,125,2,122, - 14,124,2,124,1,131,1,87,0,2,0,1,0,83,0,4, - 0,116,5,121,70,1,0,1,0,1,0,89,0,113,34,48, - 0,100,1,83,0,41,3,122,46,83,101,97,114,99,104,32, - 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,102, - 111,114,32,97,32,102,105,110,100,101,114,32,102,111,114,32, - 39,112,97,116,104,39,46,78,122,23,115,121,115,46,112,97, - 116,104,95,104,111,111,107,115,32,105,115,32,101,109,112,116, - 121,41,6,114,1,0,0,0,218,10,112,97,116,104,95,104, - 111,111,107,115,114,75,0,0,0,114,76,0,0,0,114,138, - 0,0,0,114,117,0,0,0,41,3,114,193,0,0,0,114, - 44,0,0,0,90,4,104,111,111,107,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,218,11,95,112,97,116,104, - 95,104,111,111,107,115,215,4,0,0,115,18,0,0,0,16, - 3,12,1,10,1,2,1,14,1,12,1,6,1,4,2,255, - 128,122,22,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,0,0,0,0,3,0,0,0,8,0,0,0,67,0, - 0,0,115,100,0,0,0,124,1,100,1,107,2,114,42,122, - 12,116,0,160,1,161,0,125,1,87,0,110,20,4,0,116, - 2,121,40,1,0,1,0,1,0,89,0,100,2,83,0,48, - 0,122,16,116,3,106,4,124,1,25,0,125,2,87,0,124, - 2,83,0,4,0,116,5,121,98,1,0,1,0,1,0,124, - 0,160,6,124,1,161,1,125,2,124,2,116,3,106,4,124, - 1,60,0,89,0,124,2,83,0,48,0,41,3,122,210,71, - 101,116,32,116,104,101,32,102,105,110,100,101,114,32,102,111, - 114,32,116,104,101,32,112,97,116,104,32,101,110,116,114,121, - 32,102,114,111,109,32,115,121,115,46,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,10, - 32,32,32,32,32,32,32,32,73,102,32,116,104,101,32,112, - 97,116,104,32,101,110,116,114,121,32,105,115,32,110,111,116, - 32,105,110,32,116,104,101,32,99,97,99,104,101,44,32,102, - 105,110,100,32,116,104,101,32,97,112,112,114,111,112,114,105, - 97,116,101,32,102,105,110,100,101,114,10,32,32,32,32,32, - 32,32,32,97,110,100,32,99,97,99,104,101,32,105,116,46, - 32,73,102,32,110,111,32,102,105,110,100,101,114,32,105,115, - 32,97,118,97,105,108,97,98,108,101,44,32,115,116,111,114, - 101,32,78,111,110,101,46,10,10,32,32,32,32,32,32,32, - 32,114,40,0,0,0,78,41,7,114,4,0,0,0,114,55, - 0,0,0,218,17,70,105,108,101,78,111,116,70,111,117,110, - 100,69,114,114,111,114,114,1,0,0,0,114,40,1,0,0, - 218,8,75,101,121,69,114,114,111,114,114,44,1,0,0,41, - 3,114,193,0,0,0,114,44,0,0,0,114,42,1,0,0, - 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, - 20,95,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,228,4,0,0,115,28,0,0,0,8,8, - 2,1,12,1,12,1,8,3,2,1,12,1,4,4,12,253, - 10,1,12,1,4,1,2,255,255,128,122,31,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,99,97,99,104,101,99,3,0,0,0, - 0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0, - 67,0,0,0,115,82,0,0,0,116,0,124,2,100,1,131, - 2,114,26,124,2,160,1,124,1,161,1,92,2,125,3,125, - 4,110,14,124,2,160,2,124,1,161,1,125,3,103,0,125, - 4,124,3,100,0,117,1,114,60,116,3,160,4,124,1,124, - 3,161,2,83,0,116,3,160,5,124,1,100,0,161,2,125, - 5,124,4,124,5,95,6,124,5,83,0,41,2,78,114,137, - 0,0,0,41,7,114,128,0,0,0,114,137,0,0,0,114, - 206,0,0,0,114,134,0,0,0,114,201,0,0,0,114,183, - 0,0,0,114,178,0,0,0,41,6,114,193,0,0,0,114, - 139,0,0,0,114,42,1,0,0,114,140,0,0,0,114,141, - 0,0,0,114,187,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,8,0,0,0,218,16,95,108,101,103,97,99,121, - 95,103,101,116,95,115,112,101,99,250,4,0,0,115,20,0, - 0,0,10,4,16,1,10,2,4,1,8,1,12,1,12,1, - 6,1,4,1,255,128,122,27,80,97,116,104,70,105,110,100, - 101,114,46,95,108,101,103,97,99,121,95,103,101,116,95,115, - 112,101,99,78,99,4,0,0,0,0,0,0,0,0,0,0, - 0,9,0,0,0,5,0,0,0,67,0,0,0,115,166,0, - 0,0,103,0,125,4,124,2,68,0,93,134,125,5,116,0, - 124,5,116,1,116,2,102,2,131,2,115,28,113,8,124,0, - 160,3,124,5,161,1,125,6,124,6,100,1,117,1,114,8, - 116,4,124,6,100,2,131,2,114,70,124,6,160,5,124,1, - 124,3,161,2,125,7,110,12,124,0,160,6,124,1,124,6, - 161,2,125,7,124,7,100,1,117,0,114,92,113,8,124,7, - 106,7,100,1,117,1,114,110,124,7,2,0,1,0,83,0, - 124,7,106,8,125,8,124,8,100,1,117,0,114,132,116,9, - 100,3,131,1,130,1,124,4,160,10,124,8,161,1,1,0, - 113,8,116,11,160,12,124,1,100,1,161,2,125,7,124,4, - 124,7,95,8,124,7,83,0,41,4,122,63,70,105,110,100, - 32,116,104,101,32,108,111,97,100,101,114,32,111,114,32,110, - 97,109,101,115,112,97,99,101,95,112,97,116,104,32,102,111, - 114,32,116,104,105,115,32,109,111,100,117,108,101,47,112,97, - 99,107,97,103,101,32,110,97,109,101,46,78,114,203,0,0, - 0,122,19,115,112,101,99,32,109,105,115,115,105,110,103,32, - 108,111,97,100,101,114,41,13,114,161,0,0,0,114,84,0, - 0,0,218,5,98,121,116,101,115,114,47,1,0,0,114,128, - 0,0,0,114,203,0,0,0,114,48,1,0,0,114,140,0, - 0,0,114,178,0,0,0,114,117,0,0,0,114,167,0,0, - 0,114,134,0,0,0,114,183,0,0,0,41,9,114,193,0, - 0,0,114,139,0,0,0,114,44,0,0,0,114,202,0,0, - 0,218,14,110,97,109,101,115,112,97,99,101,95,112,97,116, - 104,90,5,101,110,116,114,121,114,42,1,0,0,114,187,0, - 0,0,114,141,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,8,0,0,0,218,9,95,103,101,116,95,115,112,101, - 99,9,5,0,0,115,42,0,0,0,4,5,8,1,14,1, - 2,1,10,1,8,1,10,1,14,1,12,2,8,1,2,1, - 10,1,8,1,6,1,8,1,8,1,12,5,12,2,6,1, - 4,1,255,128,122,20,80,97,116,104,70,105,110,100,101,114, - 46,95,103,101,116,95,115,112,101,99,99,4,0,0,0,0, - 0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,67, - 0,0,0,115,94,0,0,0,124,2,100,1,117,0,114,14, - 116,0,106,1,125,2,124,0,160,2,124,1,124,2,124,3, - 161,3,125,4,124,4,100,1,117,0,114,40,100,1,83,0, - 124,4,106,3,100,1,117,0,114,90,124,4,106,4,125,5, - 124,5,114,86,100,1,124,4,95,5,116,6,124,1,124,5, - 124,0,106,2,131,3,124,4,95,4,124,4,83,0,100,1, - 83,0,124,4,83,0,41,2,122,141,84,114,121,32,116,111, - 32,102,105,110,100,32,97,32,115,112,101,99,32,102,111,114, - 32,39,102,117,108,108,110,97,109,101,39,32,111,110,32,115, - 121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,104, - 39,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, - 115,101,97,114,99,104,32,105,115,32,98,97,115,101,100,32, - 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107, - 115,32,97,110,100,32,115,121,115,46,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,32, - 32,32,32,32,32,32,32,78,41,7,114,1,0,0,0,114, - 44,0,0,0,114,51,1,0,0,114,140,0,0,0,114,178, - 0,0,0,114,181,0,0,0,114,13,1,0,0,41,6,114, - 193,0,0,0,114,139,0,0,0,114,44,0,0,0,114,202, - 0,0,0,114,187,0,0,0,114,50,1,0,0,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,114,203,0,0, - 0,41,5,0,0,115,28,0,0,0,8,6,6,1,14,1, - 8,1,4,1,10,1,6,1,4,1,6,3,16,1,4,1, - 4,2,4,2,255,128,122,20,80,97,116,104,70,105,110,100, - 101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, - 0,67,0,0,0,115,30,0,0,0,124,0,160,0,124,1, - 124,2,161,2,125,3,124,3,100,1,117,0,114,24,100,1, - 83,0,124,3,106,1,83,0,41,2,122,170,102,105,110,100, - 32,116,104,101,32,109,111,100,117,108,101,32,111,110,32,115, - 121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,104, - 39,32,98,97,115,101,100,32,111,110,32,115,121,115,46,112, - 97,116,104,95,104,111,111,107,115,32,97,110,100,10,32,32, - 32,32,32,32,32,32,115,121,115,46,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, - 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,114,204,0,0,0,114,205,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, - 114,206,0,0,0,65,5,0,0,115,10,0,0,0,12,8, - 8,1,4,1,6,1,255,128,122,22,80,97,116,104,70,105, - 110,100,101,114,46,102,105,110,100,95,109,111,100,117,108,101, - 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,79,0,0,0,115,28,0,0,0,100,1, - 100,2,108,0,109,1,125,3,1,0,124,3,106,2,124,1, - 105,0,124,2,164,1,142,1,83,0,41,4,97,32,1,0, - 0,10,32,32,32,32,32,32,32,32,70,105,110,100,32,100, - 105,115,116,114,105,98,117,116,105,111,110,115,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,32,97,110, - 32,105,116,101,114,97,98,108,101,32,111,102,32,97,108,108, - 32,68,105,115,116,114,105,98,117,116,105,111,110,32,105,110, - 115,116,97,110,99,101,115,32,99,97,112,97,98,108,101,32, - 111,102,10,32,32,32,32,32,32,32,32,108,111,97,100,105, - 110,103,32,116,104,101,32,109,101,116,97,100,97,116,97,32, - 102,111,114,32,112,97,99,107,97,103,101,115,32,109,97,116, - 99,104,105,110,103,32,96,96,99,111,110,116,101,120,116,46, - 110,97,109,101,96,96,10,32,32,32,32,32,32,32,32,40, - 111,114,32,97,108,108,32,110,97,109,101,115,32,105,102,32, - 96,96,78,111,110,101,96,96,32,105,110,100,105,99,97,116, - 101,100,41,32,97,108,111,110,103,32,116,104,101,32,112,97, - 116,104,115,32,105,110,32,116,104,101,32,108,105,115,116,10, - 32,32,32,32,32,32,32,32,111,102,32,100,105,114,101,99, - 116,111,114,105,101,115,32,96,96,99,111,110,116,101,120,116, - 46,112,97,116,104,96,96,46,10,32,32,32,32,32,32,32, - 32,114,73,0,0,0,41,1,218,18,77,101,116,97,100,97, - 116,97,80,97,116,104,70,105,110,100,101,114,78,41,3,90, - 18,105,109,112,111,114,116,108,105,98,46,109,101,116,97,100, - 97,116,97,114,52,1,0,0,218,18,102,105,110,100,95,100, - 105,115,116,114,105,98,117,116,105,111,110,115,41,4,114,193, - 0,0,0,114,119,0,0,0,114,120,0,0,0,114,52,1, - 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,114,53,1,0,0,78,5,0,0,115,6,0,0,0,12, - 10,16,1,255,128,122,29,80,97,116,104,70,105,110,100,101, - 114,46,102,105,110,100,95,100,105,115,116,114,105,98,117,116, - 105,111,110,115,41,1,78,41,2,78,78,41,1,78,41,13, - 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, - 127,0,0,0,114,207,0,0,0,114,38,1,0,0,114,44, - 1,0,0,114,47,1,0,0,114,48,1,0,0,114,51,1, - 0,0,114,203,0,0,0,114,206,0,0,0,114,53,1,0, - 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,37,1,0,0,201,4,0,0,115,38, - 0,0,0,8,0,4,2,2,2,10,1,2,9,10,1,2, - 12,10,1,2,21,10,1,2,14,12,1,2,31,12,1,2, - 23,12,1,2,12,14,1,255,128,114,37,1,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,64,0,0,0,115,90,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, - 100,4,100,5,132,0,90,5,101,6,90,7,100,6,100,7, - 132,0,90,8,100,8,100,9,132,0,90,9,100,19,100,11, - 100,12,132,1,90,10,100,13,100,14,132,0,90,11,101,12, - 100,15,100,16,132,0,131,1,90,13,100,17,100,18,132,0, - 90,14,100,10,83,0,41,20,218,10,70,105,108,101,70,105, - 110,100,101,114,122,172,70,105,108,101,45,98,97,115,101,100, - 32,102,105,110,100,101,114,46,10,10,32,32,32,32,73,110, - 116,101,114,97,99,116,105,111,110,115,32,119,105,116,104,32, - 116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32, - 97,114,101,32,99,97,99,104,101,100,32,102,111,114,32,112, - 101,114,102,111,114,109,97,110,99,101,44,32,98,101,105,110, - 103,10,32,32,32,32,114,101,102,114,101,115,104,101,100,32, - 119,104,101,110,32,116,104,101,32,100,105,114,101,99,116,111, - 114,121,32,116,104,101,32,102,105,110,100,101,114,32,105,115, - 32,104,97,110,100,108,105,110,103,32,104,97,115,32,98,101, - 101,110,32,109,111,100,105,102,105,101,100,46,10,10,32,32, - 32,32,99,2,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,6,0,0,0,7,0,0,0,115,84,0,0,0, - 103,0,125,3,124,2,68,0,93,32,92,2,137,0,125,4, - 124,3,160,0,135,0,102,1,100,1,100,2,132,8,124,4, - 68,0,131,1,161,1,1,0,113,8,124,3,124,0,95,1, - 124,1,112,54,100,3,124,0,95,2,100,4,124,0,95,3, - 116,4,131,0,124,0,95,5,116,4,131,0,124,0,95,6, - 100,5,83,0,41,6,122,154,73,110,105,116,105,97,108,105, - 122,101,32,119,105,116,104,32,116,104,101,32,112,97,116,104, - 32,116,111,32,115,101,97,114,99,104,32,111,110,32,97,110, - 100,32,97,32,118,97,114,105,97,98,108,101,32,110,117,109, - 98,101,114,32,111,102,10,32,32,32,32,32,32,32,32,50, - 45,116,117,112,108,101,115,32,99,111,110,116,97,105,110,105, - 110,103,32,116,104,101,32,108,111,97,100,101,114,32,97,110, - 100,32,116,104,101,32,102,105,108,101,32,115,117,102,102,105, - 120,101,115,32,116,104,101,32,108,111,97,100,101,114,10,32, - 32,32,32,32,32,32,32,114,101,99,111,103,110,105,122,101, - 115,46,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,51,0,0,0,115,22,0,0,0, - 124,0,93,14,125,1,124,1,136,0,102,2,86,0,1,0, - 113,2,100,0,83,0,114,109,0,0,0,114,5,0,0,0, - 114,7,1,0,0,169,1,114,140,0,0,0,114,5,0,0, - 0,114,8,0,0,0,114,10,1,0,0,107,5,0,0,115, - 6,0,0,0,18,0,4,128,255,128,122,38,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,114,71,0,0,0,114,104,0,0,0,78,41,7,114, - 167,0,0,0,218,8,95,108,111,97,100,101,114,115,114,44, - 0,0,0,218,11,95,112,97,116,104,95,109,116,105,109,101, - 218,3,115,101,116,218,11,95,112,97,116,104,95,99,97,99, - 104,101,218,19,95,114,101,108,97,120,101,100,95,112,97,116, - 104,95,99,97,99,104,101,41,5,114,118,0,0,0,114,44, - 0,0,0,218,14,108,111,97,100,101,114,95,100,101,116,97, - 105,108,115,90,7,108,111,97,100,101,114,115,114,189,0,0, - 0,114,5,0,0,0,114,55,1,0,0,114,8,0,0,0, - 114,209,0,0,0,101,5,0,0,115,20,0,0,0,4,4, - 12,1,26,1,6,1,10,2,6,1,8,1,8,1,4,128, - 255,128,122,19,70,105,108,101,70,105,110,100,101,114,46,95, - 95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,2,0,0,0,67,0,0,0, - 115,10,0,0,0,100,1,124,0,95,0,100,2,83,0,41, - 3,122,31,73,110,118,97,108,105,100,97,116,101,32,116,104, - 101,32,100,105,114,101,99,116,111,114,121,32,109,116,105,109, - 101,46,114,104,0,0,0,78,41,1,114,57,1,0,0,114, - 246,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, - 0,0,0,114,38,1,0,0,115,5,0,0,115,6,0,0, - 0,6,2,4,128,255,128,122,28,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,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,42, - 0,0,0,124,0,160,0,124,1,161,1,125,2,124,2,100, - 1,117,0,114,26,100,1,103,0,102,2,83,0,124,2,106, - 1,124,2,106,2,112,38,103,0,102,2,83,0,41,2,122, - 197,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,44,32, - 111,114,32,116,104,101,32,110,97,109,101,115,112,97,99,101, - 10,32,32,32,32,32,32,32,32,112,97,99,107,97,103,101, - 32,112,111,114,116,105,111,110,115,46,32,82,101,116,117,114, - 110,115,32,40,108,111,97,100,101,114,44,32,108,105,115,116, - 45,111,102,45,112,111,114,116,105,111,110,115,41,46,10,10, + 0,0,6,0,0,0,67,0,0,0,115,16,0,0,0,116, + 0,100,1,100,2,100,3,100,4,100,5,141,4,83,0,41, + 6,78,114,10,0,0,0,122,8,60,115,116,114,105,110,103, + 62,114,221,0,0,0,84,41,1,114,237,0,0,0,41,1, + 114,238,0,0,0,114,225,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,219,0,0,0,213,4, + 0,0,115,4,0,0,0,16,1,255,128,122,25,95,78,97, + 109,101,115,112,97,99,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,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,1,83,0,114,216,0,0,0,114,7,0, + 0,0,114,217,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,218,0,0,0,216,4,0,0,115, + 4,0,0,0,4,128,255,128,122,30,95,78,97,109,101,115, + 112,97,99,101,76,111,97,100,101,114,46,99,114,101,97,116, + 101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,0,83,0,114,114,0,0,0,114, + 7,0,0,0,114,12,1,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,223,0,0,0,219,4,0, + 0,115,6,0,0,0,2,1,2,128,255,128,122,28,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, + 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, + 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, + 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, + 83,0,41,3,122,98,76,111,97,100,32,97,32,110,97,109, + 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, - 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,41,3,114,203,0,0,0,114,140, - 0,0,0,114,178,0,0,0,41,3,114,118,0,0,0,114, - 139,0,0,0,114,187,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,137,0,0,0,121,5,0, - 0,115,10,0,0,0,10,7,8,1,8,1,16,1,255,128, - 122,22,70,105,108,101,70,105,110,100,101,114,46,102,105,110, - 100,95,108,111,97,100,101,114,99,6,0,0,0,0,0,0, - 0,0,0,0,0,7,0,0,0,6,0,0,0,67,0,0, - 0,115,26,0,0,0,124,1,124,2,124,3,131,2,125,6, - 116,0,124,2,124,3,124,6,124,4,100,1,141,4,83,0, - 41,2,78,114,177,0,0,0,41,1,114,190,0,0,0,41, - 7,114,118,0,0,0,114,188,0,0,0,114,139,0,0,0, - 114,44,0,0,0,90,4,115,109,115,108,114,202,0,0,0, - 114,140,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,51,1,0,0,133,5,0,0,115,10,0, - 0,0,10,1,8,1,2,1,6,255,255,128,122,20,70,105, - 108,101,70,105,110,100,101,114,46,95,103,101,116,95,115,112, - 101,99,78,99,3,0,0,0,0,0,0,0,0,0,0,0, - 14,0,0,0,8,0,0,0,67,0,0,0,115,92,1,0, - 0,100,1,125,3,124,1,160,0,100,2,161,1,100,3,25, - 0,125,4,122,24,116,1,124,0,106,2,112,34,116,3,160, - 4,161,0,131,1,106,5,125,5,87,0,110,22,4,0,116, - 6,121,64,1,0,1,0,1,0,100,4,125,5,89,0,110, - 2,48,0,124,5,124,0,106,7,107,3,114,90,124,0,160, - 8,161,0,1,0,124,5,124,0,95,7,116,9,131,0,114, - 112,124,0,106,10,125,6,124,4,160,11,161,0,125,7,110, - 10,124,0,106,12,125,6,124,4,125,7,124,7,124,6,118, - 0,114,214,116,13,124,0,106,2,124,4,131,2,125,8,124, - 0,106,14,68,0,93,56,92,2,125,9,125,10,100,5,124, - 9,23,0,125,11,116,13,124,8,124,11,131,2,125,12,116, - 15,124,12,131,1,114,148,124,0,160,16,124,10,124,1,124, - 12,124,8,103,1,124,2,161,5,2,0,1,0,83,0,116, - 17,124,8,131,1,125,3,124,0,106,14,68,0,93,80,92, - 2,125,9,125,10,116,13,124,0,106,2,124,4,124,9,23, - 0,131,2,125,12,116,18,106,19,100,6,124,12,100,3,100, - 7,141,3,1,0,124,7,124,9,23,0,124,6,118,0,114, - 220,116,15,124,12,131,1,114,220,124,0,160,16,124,10,124, - 1,124,12,100,8,124,2,161,5,2,0,1,0,83,0,124, - 3,144,1,114,88,116,18,160,19,100,9,124,8,161,2,1, - 0,116,18,160,20,124,1,100,8,161,2,125,13,124,8,103, - 1,124,13,95,21,124,13,83,0,100,8,83,0,41,10,122, - 111,84,114,121,32,116,111,32,102,105,110,100,32,97,32,115, - 112,101,99,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,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,115,32,116, - 104,101,32,109,97,116,99,104,105,110,103,32,115,112,101,99, - 44,32,111,114,32,78,111,110,101,32,105,102,32,110,111,116, - 32,102,111,117,110,100,46,10,32,32,32,32,32,32,32,32, - 70,114,71,0,0,0,114,28,0,0,0,114,104,0,0,0, - 114,209,0,0,0,122,9,116,114,121,105,110,103,32,123,125, - 41,1,90,9,118,101,114,98,111,115,105,116,121,78,122,25, - 112,111,115,115,105,98,108,101,32,110,97,109,101,115,112,97, - 99,101,32,102,111,114,32,123,125,41,22,114,41,0,0,0, - 114,49,0,0,0,114,44,0,0,0,114,4,0,0,0,114, - 55,0,0,0,114,0,1,0,0,114,50,0,0,0,114,57, - 1,0,0,218,11,95,102,105,108,108,95,99,97,99,104,101, - 114,9,0,0,0,114,60,1,0,0,114,105,0,0,0,114, - 59,1,0,0,114,38,0,0,0,114,56,1,0,0,114,54, - 0,0,0,114,51,1,0,0,114,56,0,0,0,114,134,0, - 0,0,114,149,0,0,0,114,183,0,0,0,114,178,0,0, - 0,41,14,114,118,0,0,0,114,139,0,0,0,114,202,0, - 0,0,90,12,105,115,95,110,97,109,101,115,112,97,99,101, - 90,11,116,97,105,108,95,109,111,100,117,108,101,114,169,0, - 0,0,90,5,99,97,99,104,101,90,12,99,97,99,104,101, - 95,109,111,100,117,108,101,90,9,98,97,115,101,95,112,97, - 116,104,114,8,1,0,0,114,188,0,0,0,90,13,105,110, - 105,116,95,102,105,108,101,110,97,109,101,90,9,102,117,108, - 108,95,112,97,116,104,114,187,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,203,0,0,0,138, - 5,0,0,115,74,0,0,0,4,5,14,1,2,1,24,1, - 12,1,10,1,10,1,8,1,6,1,6,2,6,1,10,1, - 6,2,4,1,8,2,12,1,14,1,8,1,10,1,8,1, - 24,1,8,4,14,2,16,1,16,1,12,1,8,1,10,1, - 4,1,8,255,6,2,12,1,12,1,8,1,4,1,4,1, - 255,128,122,20,70,105,108,101,70,105,110,100,101,114,46,102, - 105,110,100,95,115,112,101,99,99,1,0,0,0,0,0,0, - 0,0,0,0,0,9,0,0,0,10,0,0,0,67,0,0, - 0,115,188,0,0,0,124,0,106,0,125,1,122,22,116,1, - 160,2,124,1,112,22,116,1,160,3,161,0,161,1,125,2, - 87,0,110,28,4,0,116,4,116,5,116,6,102,3,121,56, - 1,0,1,0,1,0,103,0,125,2,89,0,110,2,48,0, - 116,7,106,8,160,9,100,1,161,1,115,82,116,10,124,2, - 131,1,124,0,95,11,110,74,116,10,131,0,125,3,124,2, - 68,0,93,56,125,4,124,4,160,12,100,2,161,1,92,3, - 125,5,125,6,125,7,124,6,114,134,100,3,160,13,124,5, - 124,7,160,14,161,0,161,2,125,8,110,4,124,5,125,8, - 124,3,160,15,124,8,161,1,1,0,113,92,124,3,124,0, - 95,11,116,7,106,8,160,9,116,16,161,1,114,184,100,4, - 100,5,132,0,124,2,68,0,131,1,124,0,95,17,100,6, - 83,0,41,7,122,68,70,105,108,108,32,116,104,101,32,99, - 97,99,104,101,32,111,102,32,112,111,116,101,110,116,105,97, - 108,32,109,111,100,117,108,101,115,32,97,110,100,32,112,97, - 99,107,97,103,101,115,32,102,111,114,32,116,104,105,115,32, - 100,105,114,101,99,116,111,114,121,46,114,0,0,0,0,114, - 71,0,0,0,114,61,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,4,0,0,0,83,0, - 0,0,115,20,0,0,0,104,0,124,0,93,12,125,1,124, - 1,160,0,161,0,146,2,113,4,83,0,114,5,0,0,0, - 41,1,114,105,0,0,0,41,2,114,32,0,0,0,90,2, - 102,110,114,5,0,0,0,114,5,0,0,0,114,8,0,0, - 0,218,9,60,115,101,116,99,111,109,112,62,215,5,0,0, - 115,4,0,0,0,20,0,255,128,122,41,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,115,101,116,99, - 111,109,112,62,78,41,18,114,44,0,0,0,114,4,0,0, - 0,90,7,108,105,115,116,100,105,114,114,55,0,0,0,114, - 45,1,0,0,218,15,80,101,114,109,105,115,115,105,111,110, - 69,114,114,111,114,218,18,78,111,116,65,68,105,114,101,99, - 116,111,114,121,69,114,114,111,114,114,1,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,58,1,0,0,114,59,1, - 0,0,114,100,0,0,0,114,62,0,0,0,114,105,0,0, - 0,218,3,97,100,100,114,12,0,0,0,114,60,1,0,0, - 41,9,114,118,0,0,0,114,44,0,0,0,90,8,99,111, - 110,116,101,110,116,115,90,21,108,111,119,101,114,95,115,117, - 102,102,105,120,95,99,111,110,116,101,110,116,115,114,33,1, - 0,0,114,116,0,0,0,114,20,1,0,0,114,8,1,0, - 0,90,8,110,101,119,95,110,97,109,101,114,5,0,0,0, - 114,5,0,0,0,114,8,0,0,0,114,62,1,0,0,186, - 5,0,0,115,38,0,0,0,6,2,2,1,22,1,18,1, - 10,3,12,3,12,1,6,7,8,1,16,1,4,1,18,1, - 4,2,12,1,6,1,12,1,16,1,4,128,255,128,122,22, - 70,105,108,101,70,105,110,100,101,114,46,95,102,105,108,108, - 95,99,97,99,104,101,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,7,0,0,0,115, - 18,0,0,0,135,0,135,1,102,2,100,1,100,2,132,8, - 125,2,124,2,83,0,41,4,97,20,1,0,0,65,32,99, - 108,97,115,115,32,109,101,116,104,111,100,32,119,104,105,99, - 104,32,114,101,116,117,114,110,115,32,97,32,99,108,111,115, - 117,114,101,32,116,111,32,117,115,101,32,111,110,32,115,121, - 115,46,112,97,116,104,95,104,111,111,107,10,32,32,32,32, - 32,32,32,32,119,104,105,99,104,32,119,105,108,108,32,114, - 101,116,117,114,110,32,97,110,32,105,110,115,116,97,110,99, - 101,32,117,115,105,110,103,32,116,104,101,32,115,112,101,99, - 105,102,105,101,100,32,108,111,97,100,101,114,115,32,97,110, - 100,32,116,104,101,32,112,97,116,104,10,32,32,32,32,32, - 32,32,32,99,97,108,108,101,100,32,111,110,32,116,104,101, - 32,99,108,111,115,117,114,101,46,10,10,32,32,32,32,32, - 32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,99, - 97,108,108,101,100,32,111,110,32,116,104,101,32,99,108,111, - 115,117,114,101,32,105,115,32,110,111,116,32,97,32,100,105, - 114,101,99,116,111,114,121,44,32,73,109,112,111,114,116,69, - 114,114,111,114,32,105,115,10,32,32,32,32,32,32,32,32, - 114,97,105,115,101,100,46,10,10,32,32,32,32,32,32,32, - 32,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,4,0,0,0,19,0,0,0,115,36,0,0,0,116, - 0,124,0,131,1,115,20,116,1,100,1,124,0,100,2,141, - 2,130,1,136,0,124,0,103,1,136,1,162,1,82,0,142, - 0,83,0,41,4,122,45,80,97,116,104,32,104,111,111,107, - 32,102,111,114,32,105,109,112,111,114,116,108,105,98,46,109, - 97,99,104,105,110,101,114,121,46,70,105,108,101,70,105,110, - 100,101,114,46,122,30,111,110,108,121,32,100,105,114,101,99, - 116,111,114,105,101,115,32,97,114,101,32,115,117,112,112,111, - 114,116,101,100,114,48,0,0,0,78,41,2,114,56,0,0, - 0,114,117,0,0,0,114,48,0,0,0,169,2,114,193,0, - 0,0,114,61,1,0,0,114,5,0,0,0,114,8,0,0, - 0,218,24,112,97,116,104,95,104,111,111,107,95,102,111,114, - 95,70,105,108,101,70,105,110,100,101,114,227,5,0,0,115, - 8,0,0,0,8,2,12,1,16,1,255,128,122,54,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,107,95,102,111,114,95,70,105,108,101,70,105, - 110,100,101,114,78,114,5,0,0,0,41,3,114,193,0,0, - 0,114,61,1,0,0,114,68,1,0,0,114,5,0,0,0, - 114,67,1,0,0,114,8,0,0,0,218,9,112,97,116,104, - 95,104,111,111,107,217,5,0,0,115,6,0,0,0,14,10, - 4,6,255,128,122,20,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,0,0,0,0,1,0,0,0,3,0,0,0,67, - 0,0,0,115,12,0,0,0,100,1,160,0,124,0,106,1, - 161,1,83,0,41,2,78,122,16,70,105,108,101,70,105,110, - 100,101,114,40,123,33,114,125,41,41,2,114,62,0,0,0, - 114,44,0,0,0,114,246,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,8,0,0,0,114,31,1,0,0,235,5, - 0,0,115,4,0,0,0,12,1,255,128,122,19,70,105,108, - 101,70,105,110,100,101,114,46,95,95,114,101,112,114,95,95, - 41,1,78,41,15,114,125,0,0,0,114,124,0,0,0,114, - 126,0,0,0,114,127,0,0,0,114,209,0,0,0,114,38, - 1,0,0,114,143,0,0,0,114,206,0,0,0,114,137,0, - 0,0,114,51,1,0,0,114,203,0,0,0,114,62,1,0, - 0,114,207,0,0,0,114,69,1,0,0,114,31,1,0,0, - 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 8,0,0,0,114,54,1,0,0,92,5,0,0,115,26,0, - 0,0,8,0,4,2,8,7,8,14,4,4,8,2,8,12, - 10,5,8,48,2,31,10,1,12,17,255,128,114,54,1,0, - 0,99,4,0,0,0,0,0,0,0,0,0,0,0,6,0, - 0,0,8,0,0,0,67,0,0,0,115,144,0,0,0,124, - 0,160,0,100,1,161,1,125,4,124,0,160,0,100,2,161, - 1,125,5,124,4,115,66,124,5,114,36,124,5,106,1,125, - 4,110,30,124,2,124,3,107,2,114,56,116,2,124,1,124, - 2,131,2,125,4,110,10,116,3,124,1,124,2,131,2,125, - 4,124,5,115,84,116,4,124,1,124,2,124,4,100,3,141, - 3,125,5,122,38,124,5,124,0,100,2,60,0,124,4,124, - 0,100,1,60,0,124,2,124,0,100,4,60,0,124,3,124, - 0,100,5,60,0,87,0,100,0,83,0,4,0,116,5,121, - 142,1,0,1,0,1,0,89,0,100,0,83,0,48,0,41, - 6,78,218,10,95,95,108,111,97,100,101,114,95,95,218,8, - 95,95,115,112,101,99,95,95,114,55,1,0,0,90,8,95, - 95,102,105,108,101,95,95,90,10,95,95,99,97,99,104,101, - 100,95,95,41,6,218,3,103,101,116,114,140,0,0,0,114, - 5,1,0,0,114,255,0,0,0,114,190,0,0,0,218,9, - 69,120,99,101,112,116,105,111,110,41,6,90,2,110,115,114, - 116,0,0,0,90,8,112,97,116,104,110,97,109,101,90,9, - 99,112,97,116,104,110,97,109,101,114,140,0,0,0,114,187, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, - 0,0,218,14,95,102,105,120,95,117,112,95,109,111,100,117, - 108,101,241,5,0,0,115,42,0,0,0,10,2,10,1,4, - 1,4,1,8,1,8,1,12,1,10,2,4,1,14,1,2, - 1,8,1,8,1,8,1,10,1,4,128,12,1,2,2,4, - 128,2,0,255,128,114,74,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,116,1,160,2,161,0, - 102,2,125,0,116,3,116,4,102,2,125,1,116,5,116,6, - 102,2,125,2,124,0,124,1,124,2,103,3,83,0,41,2, - 122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,116, - 32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,109, - 111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,10, - 32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,115, - 32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,114, - 44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,32, - 32,78,41,7,114,252,0,0,0,114,163,0,0,0,218,18, - 101,120,116,101,110,115,105,111,110,95,115,117,102,102,105,120, - 101,115,114,255,0,0,0,114,101,0,0,0,114,5,1,0, - 0,114,88,0,0,0,41,3,90,10,101,120,116,101,110,115, - 105,111,110,115,90,6,115,111,117,114,99,101,90,8,98,121, - 116,101,99,111,100,101,114,5,0,0,0,114,5,0,0,0, - 114,8,0,0,0,114,184,0,0,0,8,6,0,0,115,10, - 0,0,0,12,5,8,1,8,1,10,1,255,128,114,184,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,10, - 0,0,0,9,0,0,0,67,0,0,0,115,116,1,0,0, - 124,0,97,0,116,0,106,1,97,1,116,0,106,2,97,2, - 116,1,106,3,116,4,25,0,125,1,100,1,100,2,103,1, - 102,2,100,3,100,4,100,2,103,2,102,2,102,2,125,2, - 124,2,68,0,93,96,92,2,125,3,125,4,116,5,100,5, - 100,6,132,0,124,4,68,0,131,1,131,1,115,82,74,0, - 130,1,124,4,100,7,25,0,125,5,124,3,116,1,106,3, - 118,0,114,114,116,1,106,3,124,3,25,0,125,6,1,0, - 113,158,122,16,116,0,160,6,124,3,161,1,125,6,87,0, - 1,0,113,158,4,0,116,7,121,148,1,0,1,0,1,0, - 89,0,113,52,48,0,116,7,100,8,131,1,130,1,116,8, - 124,1,100,9,124,6,131,3,1,0,116,8,124,1,100,10, - 124,5,131,3,1,0,116,8,124,1,100,11,100,12,160,9, - 124,4,161,1,131,3,1,0,116,8,124,1,100,13,100,14, - 100,15,132,0,124,4,68,0,131,1,131,3,1,0,103,0, - 100,16,162,1,125,7,124,3,100,3,107,2,114,248,124,7, - 160,10,100,17,161,1,1,0,124,7,68,0,93,50,125,8, - 124,8,116,1,106,3,118,1,144,1,114,24,116,0,160,6, - 124,8,161,1,125,9,110,10,116,1,106,3,124,8,25,0, - 125,9,116,8,124,1,124,8,124,9,131,3,1,0,113,252, - 116,8,124,1,100,18,116,11,131,0,131,3,1,0,116,12, - 160,13,116,2,160,14,161,0,161,1,1,0,124,3,100,3, - 107,2,144,1,114,112,116,15,160,10,100,19,161,1,1,0, - 100,20,116,12,118,0,144,1,114,112,100,21,116,16,95,17, - 100,22,83,0,41,23,122,205,83,101,116,117,112,32,116,104, - 101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112, - 111,114,116,101,114,115,32,102,111,114,32,105,109,112,111,114, - 116,108,105,98,32,98,121,32,105,109,112,111,114,116,105,110, - 103,32,110,101,101,100,101,100,10,32,32,32,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,115,32,97,110, - 100,32,105,110,106,101,99,116,105,110,103,32,116,104,101,109, - 32,105,110,116,111,32,116,104,101,32,103,108,111,98,97,108, - 32,110,97,109,101,115,112,97,99,101,46,10,10,32,32,32, - 32,79,116,104,101,114,32,99,111,109,112,111,110,101,110,116, - 115,32,97,114,101,32,101,120,116,114,97,99,116,101,100,32, - 102,114,111,109,32,116,104,101,32,99,111,114,101,32,98,111, - 111,116,115,116,114,97,112,32,109,111,100,117,108,101,46,10, - 10,32,32,32,32,90,5,112,111,115,105,120,250,1,47,90, - 2,110,116,250,1,92,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,115,0,0,0,115, - 26,0,0,0,124,0,93,18,125,1,116,0,124,1,131,1, - 100,0,107,2,86,0,1,0,113,2,100,1,83,0,41,2, - 114,39,0,0,0,78,41,1,114,23,0,0,0,41,2,114, - 32,0,0,0,114,94,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,8,0,0,0,114,10,1,0,0,37,6,0, - 0,115,6,0,0,0,22,0,4,128,255,128,122,25,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,114,73,0,0,0,122,30,105,109, - 112,111,114,116,108,105,98,32,114,101,113,117,105,114,101,115, - 32,112,111,115,105,120,32,111,114,32,110,116,114,4,0,0, - 0,114,35,0,0,0,114,31,0,0,0,114,40,0,0,0, - 114,58,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,4,0,0,0,83,0,0,0,115,22, - 0,0,0,104,0,124,0,93,14,125,1,100,0,124,1,155, - 0,157,2,146,2,113,4,83,0,41,1,114,74,0,0,0, - 114,5,0,0,0,41,2,114,32,0,0,0,218,1,115,114, - 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,63, - 1,0,0,54,6,0,0,115,4,0,0,0,22,0,255,128, - 122,25,95,115,101,116,117,112,46,60,108,111,99,97,108,115, - 62,46,60,115,101,116,99,111,109,112,62,41,3,114,64,0, - 0,0,114,75,0,0,0,114,160,0,0,0,114,192,0,0, - 0,114,9,0,0,0,122,4,46,112,121,119,122,6,95,100, - 46,112,121,100,84,78,41,18,114,134,0,0,0,114,1,0, - 0,0,114,163,0,0,0,114,22,1,0,0,114,125,0,0, - 0,218,3,97,108,108,90,18,95,98,117,105,108,116,105,110, - 95,102,114,111,109,95,110,97,109,101,114,117,0,0,0,114, - 129,0,0,0,114,36,0,0,0,114,186,0,0,0,114,14, - 0,0,0,114,12,1,0,0,114,167,0,0,0,114,75,1, - 0,0,114,101,0,0,0,114,191,0,0,0,114,195,0,0, - 0,41,10,218,17,95,98,111,111,116,115,116,114,97,112,95, - 109,111,100,117,108,101,90,11,115,101,108,102,95,109,111,100, - 117,108,101,90,10,111,115,95,100,101,116,97,105,108,115,90, - 10,98,117,105,108,116,105,110,95,111,115,114,31,0,0,0, - 114,35,0,0,0,90,9,111,115,95,109,111,100,117,108,101, - 90,13,98,117,105,108,116,105,110,95,110,97,109,101,115,90, - 12,98,117,105,108,116,105,110,95,110,97,109,101,90,14,98, - 117,105,108,116,105,110,95,109,111,100,117,108,101,114,5,0, - 0,0,114,5,0,0,0,114,8,0,0,0,218,6,95,115, - 101,116,117,112,19,6,0,0,115,74,0,0,0,4,8,6, - 1,6,1,10,2,22,3,12,1,22,2,8,1,10,1,10, - 1,4,1,2,2,10,1,6,1,12,1,6,1,8,2,12, - 2,12,1,18,1,22,1,8,3,8,1,10,1,8,1,12, - 1,12,1,10,2,14,1,14,3,14,1,10,1,10,1,10, - 1,6,1,4,128,255,128,114,81,1,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,50,0,0,0,116,0,124,0,131,1, - 1,0,116,1,131,0,125,1,116,2,106,3,160,4,116,5, - 106,6,124,1,142,0,103,1,161,1,1,0,116,2,106,7, - 160,8,116,9,161,1,1,0,100,1,83,0,41,2,122,41, - 73,110,115,116,97,108,108,32,116,104,101,32,112,97,116,104, - 45,98,97,115,101,100,32,105,109,112,111,114,116,32,99,111, - 109,112,111,110,101,110,116,115,46,78,41,10,114,81,1,0, - 0,114,184,0,0,0,114,1,0,0,0,114,43,1,0,0, - 114,167,0,0,0,114,54,1,0,0,114,69,1,0,0,218, - 9,109,101,116,97,95,112,97,116,104,114,186,0,0,0,114, - 37,1,0,0,41,2,114,80,1,0,0,90,17,115,117,112, - 112,111,114,116,101,100,95,108,111,97,100,101,114,115,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,218,8,95, - 105,110,115,116,97,108,108,76,6,0,0,115,12,0,0,0, - 8,2,6,1,20,1,12,1,4,128,255,128,114,83,1,0, - 0,41,1,114,60,0,0,0,41,1,78,41,3,78,78,78, - 41,2,114,73,0,0,0,114,73,0,0,0,41,1,84,41, - 1,78,41,1,78,41,63,114,127,0,0,0,114,13,0,0, - 0,90,37,95,67,65,83,69,95,73,78,83,69,78,83,73, - 84,73,86,69,95,80,76,65,84,70,79,82,77,83,95,66, - 89,84,69,83,95,75,69,89,114,12,0,0,0,114,14,0, - 0,0,114,21,0,0,0,114,27,0,0,0,114,29,0,0, - 0,114,38,0,0,0,114,47,0,0,0,114,49,0,0,0, - 114,53,0,0,0,114,54,0,0,0,114,56,0,0,0,114, - 59,0,0,0,114,69,0,0,0,218,4,116,121,112,101,218, - 8,95,95,99,111,100,101,95,95,114,162,0,0,0,114,19, - 0,0,0,114,148,0,0,0,114,18,0,0,0,114,24,0, - 0,0,114,236,0,0,0,114,91,0,0,0,114,87,0,0, - 0,114,101,0,0,0,114,88,0,0,0,90,23,68,69,66, - 85,71,95,66,89,84,69,67,79,68,69,95,83,85,70,70, - 73,88,69,83,90,27,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,114,97,0,0,0,114,102,0,0,0,114,108,0,0,0, - 114,112,0,0,0,114,114,0,0,0,114,136,0,0,0,114, - 143,0,0,0,114,152,0,0,0,114,156,0,0,0,114,158, - 0,0,0,114,165,0,0,0,114,170,0,0,0,114,171,0, - 0,0,114,176,0,0,0,218,6,111,98,106,101,99,116,114, - 185,0,0,0,114,190,0,0,0,114,191,0,0,0,114,208, - 0,0,0,114,221,0,0,0,114,239,0,0,0,114,255,0, - 0,0,114,5,1,0,0,114,12,1,0,0,114,252,0,0, - 0,114,13,1,0,0,114,35,1,0,0,114,37,1,0,0, - 114,54,1,0,0,114,74,1,0,0,114,184,0,0,0,114, - 81,1,0,0,114,83,1,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,8,0,0,0,218,8,60, - 109,111,100,117,108,101,62,1,0,0,0,115,132,0,0,0, - 4,0,4,22,4,1,2,1,2,1,4,255,8,4,8,17, - 8,5,8,5,8,6,8,6,8,12,8,10,8,9,8,5, - 8,7,10,9,10,22,0,127,16,22,12,1,4,2,4,1, - 6,2,6,2,8,2,16,2,8,71,8,40,8,19,8,12, - 8,12,8,28,8,17,8,33,8,28,10,24,10,13,10,10, - 8,11,6,14,4,3,2,1,12,255,14,68,14,64,16,29, - 0,127,14,17,18,50,18,45,4,26,18,3,14,53,14,63, - 14,42,0,127,14,20,0,127,10,22,8,23,8,11,8,57, - 4,128,255,128, + 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, + 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, + 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, + 78,41,4,114,139,0,0,0,114,153,0,0,0,114,19,1, + 0,0,114,224,0,0,0,114,225,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,226,0,0,0, + 222,4,0,0,115,10,0,0,0,6,7,4,1,4,255,12, + 2,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0,114,131, + 0,0,0,114,215,0,0,0,114,213,0,0,0,114,40,1, + 0,0,114,186,0,0,0,114,235,0,0,0,114,219,0,0, + 0,114,218,0,0,0,114,223,0,0,0,114,226,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,39,1,0,0,194,4,0,0,115,22,0, + 0,0,8,0,8,1,2,3,10,1,8,8,8,3,8,3, + 8,3,8,3,12,3,255,128,114,39,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,64,0,0,0,115,118,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,101,4,100,2,100,3,132,0,131, + 1,90,5,101,4,100,4,100,5,132,0,131,1,90,6,101, + 4,100,6,100,7,132,0,131,1,90,7,101,4,100,8,100, + 9,132,0,131,1,90,8,101,4,100,19,100,11,100,12,132, + 1,131,1,90,9,101,4,100,20,100,13,100,14,132,1,131, + 1,90,10,101,4,100,21,100,15,100,16,132,1,131,1,90, + 11,101,4,100,17,100,18,132,0,131,1,90,12,100,10,83, + 0,41,22,218,10,80,97,116,104,70,105,110,100,101,114,122, + 62,77,101,116,97,32,112,97,116,104,32,102,105,110,100,101, + 114,32,102,111,114,32,115,121,115,46,112,97,116,104,32,97, + 110,100,32,112,97,99,107,97,103,101,32,95,95,112,97,116, + 104,95,95,32,97,116,116,114,105,98,117,116,101,115,46,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,116, + 1,106,2,160,3,161,0,131,1,68,0,93,44,92,2,125, + 1,125,2,124,2,100,1,117,0,114,40,116,1,106,2,124, + 1,61,0,113,14,116,4,124,2,100,2,131,2,114,14,124, + 2,160,5,161,0,1,0,113,14,100,1,83,0,41,3,122, + 125,67,97,108,108,32,116,104,101,32,105,110,118,97,108,105, + 100,97,116,101,95,99,97,99,104,101,115,40,41,32,109,101, + 116,104,111,100,32,111,110,32,97,108,108,32,112,97,116,104, + 32,101,110,116,114,121,32,102,105,110,100,101,114,115,10,32, + 32,32,32,32,32,32,32,115,116,111,114,101,100,32,105,110, + 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, + 101,114,95,99,97,99,104,101,115,32,40,119,104,101,114,101, + 32,105,109,112,108,101,109,101,110,116,101,100,41,46,78,218, + 17,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104, + 101,115,41,6,218,4,108,105,115,116,114,15,0,0,0,218, + 19,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, + 97,99,104,101,218,5,105,116,101,109,115,114,133,0,0,0, + 114,42,1,0,0,41,3,114,197,0,0,0,114,121,0,0, + 0,218,6,102,105,110,100,101,114,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,42,1,0,0,240,4,0, + 0,115,14,0,0,0,22,4,8,1,10,1,10,1,10,1, + 4,128,255,128,122,28,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,0,0,0,0,3, + 0,0,0,9,0,0,0,67,0,0,0,115,76,0,0,0, + 116,0,106,1,100,1,117,1,114,28,116,0,106,1,115,28, + 116,2,160,3,100,2,116,4,161,2,1,0,116,0,106,1, + 68,0,93,36,125,2,122,14,124,2,124,1,131,1,87,0, + 2,0,1,0,83,0,4,0,116,5,121,70,1,0,1,0, + 1,0,89,0,113,34,48,0,100,1,83,0,41,3,122,46, + 83,101,97,114,99,104,32,115,121,115,46,112,97,116,104,95, + 104,111,111,107,115,32,102,111,114,32,97,32,102,105,110,100, + 101,114,32,102,111,114,32,39,112,97,116,104,39,46,78,122, + 23,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32, + 105,115,32,101,109,112,116,121,41,6,114,15,0,0,0,218, + 10,112,97,116,104,95,104,111,111,107,115,114,81,0,0,0, + 114,82,0,0,0,114,142,0,0,0,114,122,0,0,0,41, + 3,114,197,0,0,0,114,52,0,0,0,90,4,104,111,111, + 107,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,11,95,112,97,116,104,95,104,111,111,107,115,250,4,0, + 0,115,18,0,0,0,16,3,12,1,10,1,2,1,14,1, + 12,1,6,1,4,2,255,128,122,22,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,0,0,0,0,3,0,0, + 0,8,0,0,0,67,0,0,0,115,100,0,0,0,124,1, + 100,1,107,2,114,42,122,12,116,0,160,1,161,0,125,1, + 87,0,110,20,4,0,116,2,121,40,1,0,1,0,1,0, + 89,0,100,2,83,0,48,0,122,16,116,3,106,4,124,1, + 25,0,125,2,87,0,124,2,83,0,4,0,116,5,121,98, + 1,0,1,0,1,0,124,0,160,6,124,1,161,1,125,2, + 124,2,116,3,106,4,124,1,60,0,89,0,124,2,83,0, + 48,0,41,3,122,210,71,101,116,32,116,104,101,32,102,105, + 110,100,101,114,32,102,111,114,32,116,104,101,32,112,97,116, + 104,32,101,110,116,114,121,32,102,114,111,109,32,115,121,115, + 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, + 97,99,104,101,46,10,10,32,32,32,32,32,32,32,32,73, + 102,32,116,104,101,32,112,97,116,104,32,101,110,116,114,121, + 32,105,115,32,110,111,116,32,105,110,32,116,104,101,32,99, + 97,99,104,101,44,32,102,105,110,100,32,116,104,101,32,97, + 112,112,114,111,112,114,105,97,116,101,32,102,105,110,100,101, + 114,10,32,32,32,32,32,32,32,32,97,110,100,32,99,97, + 99,104,101,32,105,116,46,32,73,102,32,110,111,32,102,105, + 110,100,101,114,32,105,115,32,97,118,97,105,108,97,98,108, + 101,44,32,115,116,111,114,101,32,78,111,110,101,46,10,10, + 32,32,32,32,32,32,32,32,114,10,0,0,0,78,41,7, + 114,18,0,0,0,114,63,0,0,0,218,17,70,105,108,101, + 78,111,116,70,111,117,110,100,69,114,114,111,114,114,15,0, + 0,0,114,44,1,0,0,218,8,75,101,121,69,114,114,111, + 114,114,48,1,0,0,41,3,114,197,0,0,0,114,52,0, + 0,0,114,46,1,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,20,95,112,97,116,104,95,105,109, + 112,111,114,116,101,114,95,99,97,99,104,101,7,5,0,0, + 115,28,0,0,0,8,8,2,1,12,1,12,1,8,3,2, + 1,12,1,4,4,12,253,10,1,12,1,4,1,2,255,255, + 128,122,31,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,99,97,99, + 104,101,99,3,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,4,0,0,0,67,0,0,0,115,82,0,0,0, + 116,0,124,2,100,1,131,2,114,26,124,2,160,1,124,1, + 161,1,92,2,125,3,125,4,110,14,124,2,160,2,124,1, + 161,1,125,3,103,0,125,4,124,3,100,0,117,1,114,60, + 116,3,160,4,124,1,124,3,161,2,83,0,116,3,160,5, + 124,1,100,0,161,2,125,5,124,4,124,5,95,6,124,5, + 83,0,41,2,78,114,141,0,0,0,41,7,114,133,0,0, + 0,114,141,0,0,0,114,210,0,0,0,114,139,0,0,0, + 114,205,0,0,0,114,187,0,0,0,114,182,0,0,0,41, + 6,114,197,0,0,0,114,143,0,0,0,114,46,1,0,0, + 114,144,0,0,0,114,145,0,0,0,114,191,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,16, + 95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99, + 29,5,0,0,115,20,0,0,0,10,4,16,1,10,2,4, + 1,8,1,12,1,12,1,6,1,4,1,255,128,122,27,80, + 97,116,104,70,105,110,100,101,114,46,95,108,101,103,97,99, + 121,95,103,101,116,95,115,112,101,99,78,99,4,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, + 67,0,0,0,115,166,0,0,0,103,0,125,4,124,2,68, + 0,93,134,125,5,116,0,124,5,116,1,116,2,102,2,131, + 2,115,28,113,8,124,0,160,3,124,5,161,1,125,6,124, + 6,100,1,117,1,114,8,116,4,124,6,100,2,131,2,114, + 70,124,6,160,5,124,1,124,3,161,2,125,7,110,12,124, + 0,160,6,124,1,124,6,161,2,125,7,124,7,100,1,117, + 0,114,92,113,8,124,7,106,7,100,1,117,1,114,110,124, + 7,2,0,1,0,83,0,124,7,106,8,125,8,124,8,100, + 1,117,0,114,132,116,9,100,3,131,1,130,1,124,4,160, + 10,124,8,161,1,1,0,113,8,116,11,160,12,124,1,100, + 1,161,2,125,7,124,4,124,7,95,8,124,7,83,0,41, + 4,122,63,70,105,110,100,32,116,104,101,32,108,111,97,100, + 101,114,32,111,114,32,110,97,109,101,115,112,97,99,101,95, + 112,97,116,104,32,102,111,114,32,116,104,105,115,32,109,111, + 100,117,108,101,47,112,97,99,107,97,103,101,32,110,97,109, + 101,46,78,114,207,0,0,0,122,19,115,112,101,99,32,109, + 105,115,115,105,110,103,32,108,111,97,100,101,114,41,13,114, + 165,0,0,0,114,90,0,0,0,218,5,98,121,116,101,115, + 114,51,1,0,0,114,133,0,0,0,114,207,0,0,0,114, + 52,1,0,0,114,144,0,0,0,114,182,0,0,0,114,122, + 0,0,0,114,171,0,0,0,114,139,0,0,0,114,187,0, + 0,0,41,9,114,197,0,0,0,114,143,0,0,0,114,52, + 0,0,0,114,206,0,0,0,218,14,110,97,109,101,115,112, + 97,99,101,95,112,97,116,104,90,5,101,110,116,114,121,114, + 46,1,0,0,114,191,0,0,0,114,145,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,9,95, + 103,101,116,95,115,112,101,99,44,5,0,0,115,42,0,0, + 0,4,5,8,1,14,1,2,1,10,1,8,1,10,1,14, + 1,12,2,8,1,2,1,10,1,8,1,6,1,8,1,8, + 1,12,5,12,2,6,1,4,1,255,128,122,20,80,97,116, + 104,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, + 99,99,4,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,5,0,0,0,67,0,0,0,115,94,0,0,0,124, + 2,100,1,117,0,114,14,116,0,106,1,125,2,124,0,160, + 2,124,1,124,2,124,3,161,3,125,4,124,4,100,1,117, + 0,114,40,100,1,83,0,124,4,106,3,100,1,117,0,114, + 90,124,4,106,4,125,5,124,5,114,86,100,1,124,4,95, + 5,116,6,124,1,124,5,124,0,106,2,131,3,124,4,95, + 4,124,4,83,0,100,1,83,0,124,4,83,0,41,2,122, + 141,84,114,121,32,116,111,32,102,105,110,100,32,97,32,115, + 112,101,99,32,102,111,114,32,39,102,117,108,108,110,97,109, + 101,39,32,111,110,32,115,121,115,46,112,97,116,104,32,111, + 114,32,39,112,97,116,104,39,46,10,10,32,32,32,32,32, + 32,32,32,84,104,101,32,115,101,97,114,99,104,32,105,115, + 32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,97, + 116,104,95,104,111,111,107,115,32,97,110,100,32,115,121,115, + 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, + 97,99,104,101,46,10,32,32,32,32,32,32,32,32,78,41, + 7,114,15,0,0,0,114,52,0,0,0,114,55,1,0,0, + 114,144,0,0,0,114,182,0,0,0,114,185,0,0,0,114, + 17,1,0,0,41,6,114,197,0,0,0,114,143,0,0,0, + 114,52,0,0,0,114,206,0,0,0,114,191,0,0,0,114, + 54,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,207,0,0,0,76,5,0,0,115,28,0,0, + 0,8,6,6,1,14,1,8,1,4,1,10,1,6,1,4, + 1,6,3,16,1,4,1,4,2,4,2,255,128,122,20,80, + 97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,115, + 112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,4,0,0,0,67,0,0,0,115,30,0,0, + 0,124,0,160,0,124,1,124,2,161,2,125,3,124,3,100, + 1,117,0,114,24,100,1,83,0,124,3,106,1,83,0,41, + 2,122,170,102,105,110,100,32,116,104,101,32,109,111,100,117, + 108,101,32,111,110,32,115,121,115,46,112,97,116,104,32,111, + 114,32,39,112,97,116,104,39,32,98,97,115,101,100,32,111, + 110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,115, + 32,97,110,100,10,32,32,32,32,32,32,32,32,115,121,115, + 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, + 97,99,104,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, + 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, + 97,100,46,10,10,32,32,32,32,32,32,32,32,78,114,208, + 0,0,0,114,209,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,210,0,0,0,100,5,0,0, + 115,10,0,0,0,12,8,8,1,4,1,6,1,255,128,122, + 22,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, + 95,109,111,100,117,108,101,99,1,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,79,0,0,0, + 115,28,0,0,0,100,1,100,2,108,0,109,1,125,3,1, + 0,124,3,106,2,124,1,105,0,124,2,164,1,142,1,83, + 0,41,4,97,32,1,0,0,10,32,32,32,32,32,32,32, + 32,70,105,110,100,32,100,105,115,116,114,105,98,117,116,105, + 111,110,115,46,10,10,32,32,32,32,32,32,32,32,82,101, + 116,117,114,110,32,97,110,32,105,116,101,114,97,98,108,101, + 32,111,102,32,97,108,108,32,68,105,115,116,114,105,98,117, + 116,105,111,110,32,105,110,115,116,97,110,99,101,115,32,99, + 97,112,97,98,108,101,32,111,102,10,32,32,32,32,32,32, + 32,32,108,111,97,100,105,110,103,32,116,104,101,32,109,101, + 116,97,100,97,116,97,32,102,111,114,32,112,97,99,107,97, + 103,101,115,32,109,97,116,99,104,105,110,103,32,96,96,99, + 111,110,116,101,120,116,46,110,97,109,101,96,96,10,32,32, + 32,32,32,32,32,32,40,111,114,32,97,108,108,32,110,97, + 109,101,115,32,105,102,32,96,96,78,111,110,101,96,96,32, + 105,110,100,105,99,97,116,101,100,41,32,97,108,111,110,103, + 32,116,104,101,32,112,97,116,104,115,32,105,110,32,116,104, + 101,32,108,105,115,116,10,32,32,32,32,32,32,32,32,111, + 102,32,100,105,114,101,99,116,111,114,105,101,115,32,96,96, + 99,111,110,116,101,120,116,46,112,97,116,104,96,96,46,10, + 32,32,32,32,32,32,32,32,114,0,0,0,0,41,1,218, + 18,77,101,116,97,100,97,116,97,80,97,116,104,70,105,110, + 100,101,114,78,41,3,90,18,105,109,112,111,114,116,108,105, + 98,46,109,101,116,97,100,97,116,97,114,56,1,0,0,218, + 18,102,105,110,100,95,100,105,115,116,114,105,98,117,116,105, + 111,110,115,41,4,114,197,0,0,0,114,124,0,0,0,114, + 125,0,0,0,114,56,1,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,57,1,0,0,113,5,0, + 0,115,6,0,0,0,12,10,16,1,255,128,122,29,80,97, + 116,104,70,105,110,100,101,114,46,102,105,110,100,95,100,105, + 115,116,114,105,98,117,116,105,111,110,115,41,1,78,41,2, + 78,78,41,1,78,41,13,114,130,0,0,0,114,129,0,0, + 0,114,131,0,0,0,114,132,0,0,0,114,213,0,0,0, + 114,42,1,0,0,114,48,1,0,0,114,51,1,0,0,114, + 52,1,0,0,114,55,1,0,0,114,207,0,0,0,114,210, + 0,0,0,114,57,1,0,0,114,7,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,41,1,0, + 0,236,4,0,0,115,38,0,0,0,8,0,4,2,2,2, + 10,1,2,9,10,1,2,12,10,1,2,21,10,1,2,14, + 12,1,2,31,12,1,2,23,12,1,2,12,14,1,255,128, + 114,41,1,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,90, + 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, + 2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,101, + 6,90,7,100,6,100,7,132,0,90,8,100,8,100,9,132, + 0,90,9,100,19,100,11,100,12,132,1,90,10,100,13,100, + 14,132,0,90,11,101,12,100,15,100,16,132,0,131,1,90, + 13,100,17,100,18,132,0,90,14,100,10,83,0,41,20,218, + 10,70,105,108,101,70,105,110,100,101,114,122,172,70,105,108, + 101,45,98,97,115,101,100,32,102,105,110,100,101,114,46,10, + 10,32,32,32,32,73,110,116,101,114,97,99,116,105,111,110, + 115,32,119,105,116,104,32,116,104,101,32,102,105,108,101,32, + 115,121,115,116,101,109,32,97,114,101,32,99,97,99,104,101, + 100,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99, + 101,44,32,98,101,105,110,103,10,32,32,32,32,114,101,102, + 114,101,115,104,101,100,32,119,104,101,110,32,116,104,101,32, + 100,105,114,101,99,116,111,114,121,32,116,104,101,32,102,105, + 110,100,101,114,32,105,115,32,104,97,110,100,108,105,110,103, + 32,104,97,115,32,98,101,101,110,32,109,111,100,105,102,105, + 101,100,46,10,10,32,32,32,32,99,2,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,6,0,0,0,7,0, + 0,0,115,84,0,0,0,103,0,125,3,124,2,68,0,93, + 32,92,2,137,0,125,4,124,3,160,0,135,0,102,1,100, + 1,100,2,132,8,124,4,68,0,131,1,161,1,1,0,113, + 8,124,3,124,0,95,1,124,1,112,54,100,3,124,0,95, + 2,100,4,124,0,95,3,116,4,131,0,124,0,95,5,116, + 4,131,0,124,0,95,6,100,5,83,0,41,6,122,154,73, + 110,105,116,105,97,108,105,122,101,32,119,105,116,104,32,116, + 104,101,32,112,97,116,104,32,116,111,32,115,101,97,114,99, + 104,32,111,110,32,97,110,100,32,97,32,118,97,114,105,97, + 98,108,101,32,110,117,109,98,101,114,32,111,102,10,32,32, + 32,32,32,32,32,32,50,45,116,117,112,108,101,115,32,99, + 111,110,116,97,105,110,105,110,103,32,116,104,101,32,108,111, + 97,100,101,114,32,97,110,100,32,116,104,101,32,102,105,108, + 101,32,115,117,102,102,105,120,101,115,32,116,104,101,32,108, + 111,97,100,101,114,10,32,32,32,32,32,32,32,32,114,101, + 99,111,103,110,105,122,101,115,46,99,1,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,3,0,0,0,51,0, + 0,0,115,22,0,0,0,124,0,93,14,125,1,124,1,136, + 0,102,2,86,0,1,0,113,2,100,0,83,0,114,114,0, + 0,0,114,7,0,0,0,114,13,1,0,0,169,1,114,144, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,9,0, + 0,0,142,5,0,0,115,6,0,0,0,18,0,4,128,255, + 128,122,38,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,114,79,0,0,0,114,109, + 0,0,0,78,41,7,114,171,0,0,0,218,8,95,108,111, + 97,100,101,114,115,114,52,0,0,0,218,11,95,112,97,116, + 104,95,109,116,105,109,101,218,3,115,101,116,218,11,95,112, + 97,116,104,95,99,97,99,104,101,218,19,95,114,101,108,97, + 120,101,100,95,112,97,116,104,95,99,97,99,104,101,41,5, + 114,123,0,0,0,114,52,0,0,0,218,14,108,111,97,100, + 101,114,95,100,101,116,97,105,108,115,90,7,108,111,97,100, + 101,114,115,114,193,0,0,0,114,7,0,0,0,114,59,1, + 0,0,114,8,0,0,0,114,215,0,0,0,136,5,0,0, + 115,20,0,0,0,4,4,12,1,26,1,6,1,10,2,6, + 1,8,1,8,1,4,128,255,128,122,19,70,105,108,101,70, + 105,110,100,101,114,46,95,95,105,110,105,116,95,95,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, + 0,0,0,67,0,0,0,115,10,0,0,0,100,1,124,0, + 95,0,100,2,83,0,41,3,122,31,73,110,118,97,108,105, + 100,97,116,101,32,116,104,101,32,100,105,114,101,99,116,111, + 114,121,32,109,116,105,109,101,46,114,109,0,0,0,78,41, + 1,114,61,1,0,0,114,252,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,42,1,0,0,150, + 5,0,0,115,6,0,0,0,6,2,4,128,255,128,122,28, + 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,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, + 0,67,0,0,0,115,42,0,0,0,124,0,160,0,124,1, + 161,1,125,2,124,2,100,1,117,0,114,26,100,1,103,0, + 102,2,83,0,124,2,106,1,124,2,106,2,112,38,103,0, + 102,2,83,0,41,2,122,197,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,44,32,111,114,32,116,104,101,32,110,97, + 109,101,115,112,97,99,101,10,32,32,32,32,32,32,32,32, + 112,97,99,107,97,103,101,32,112,111,114,116,105,111,110,115, + 46,32,82,101,116,117,114,110,115,32,40,108,111,97,100,101, + 114,44,32,108,105,115,116,45,111,102,45,112,111,114,116,105, + 111,110,115,41,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, + 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, + 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,3, + 114,207,0,0,0,114,144,0,0,0,114,182,0,0,0,41, + 3,114,123,0,0,0,114,143,0,0,0,114,191,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 141,0,0,0,156,5,0,0,115,10,0,0,0,10,7,8, + 1,8,1,16,1,255,128,122,22,70,105,108,101,70,105,110, + 100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99, + 6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0, + 6,0,0,0,67,0,0,0,115,26,0,0,0,124,1,124, + 2,124,3,131,2,125,6,116,0,124,2,124,3,124,6,124, + 4,100,1,141,4,83,0,41,2,78,114,181,0,0,0,41, + 1,114,194,0,0,0,41,7,114,123,0,0,0,114,192,0, + 0,0,114,143,0,0,0,114,52,0,0,0,90,4,115,109, + 115,108,114,206,0,0,0,114,144,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,55,1,0,0, + 168,5,0,0,115,10,0,0,0,10,1,8,1,2,1,6, + 255,255,128,122,20,70,105,108,101,70,105,110,100,101,114,46, + 95,103,101,116,95,115,112,101,99,78,99,3,0,0,0,0, + 0,0,0,0,0,0,0,14,0,0,0,8,0,0,0,67, + 0,0,0,115,92,1,0,0,100,1,125,3,124,1,160,0, + 100,2,161,1,100,3,25,0,125,4,122,24,116,1,124,0, + 106,2,112,34,116,3,160,4,161,0,131,1,106,5,125,5, + 87,0,110,22,4,0,116,6,121,64,1,0,1,0,1,0, + 100,4,125,5,89,0,110,2,48,0,124,5,124,0,106,7, + 107,3,114,90,124,0,160,8,161,0,1,0,124,5,124,0, + 95,7,116,9,131,0,114,112,124,0,106,10,125,6,124,4, + 160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,4, + 125,7,124,7,124,6,118,0,114,214,116,13,124,0,106,2, + 124,4,131,2,125,8,124,0,106,14,68,0,93,56,92,2, + 125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,8, + 124,11,131,2,125,12,116,15,124,12,131,1,114,148,124,0, + 160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,5, + 2,0,1,0,83,0,116,17,124,8,131,1,125,3,124,0, + 106,14,68,0,93,80,92,2,125,9,125,10,116,13,124,0, + 106,2,124,4,124,9,23,0,131,2,125,12,116,18,106,19, + 100,6,124,12,100,3,100,7,141,3,1,0,124,7,124,9, + 23,0,124,6,118,0,114,220,116,15,124,12,131,1,114,220, + 124,0,160,16,124,10,124,1,124,12,100,8,124,2,161,5, + 2,0,1,0,83,0,124,3,144,1,114,88,116,18,160,19, + 100,9,124,8,161,2,1,0,116,18,160,20,124,1,100,8, + 161,2,125,13,124,8,103,1,124,13,95,21,124,13,83,0, + 100,8,83,0,41,10,122,111,84,114,121,32,116,111,32,102, + 105,110,100,32,97,32,115,112,101,99,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,46,10,10,32,32,32,32,32,32,32,32,82,101, + 116,117,114,110,115,32,116,104,101,32,109,97,116,99,104,105, + 110,103,32,115,112,101,99,44,32,111,114,32,78,111,110,101, + 32,105,102,32,110,111,116,32,102,111,117,110,100,46,10,32, + 32,32,32,32,32,32,32,70,114,79,0,0,0,114,39,0, + 0,0,114,109,0,0,0,114,215,0,0,0,122,9,116,114, + 121,105,110,103,32,123,125,41,1,90,9,118,101,114,98,111, + 115,105,116,121,78,122,25,112,111,115,115,105,98,108,101,32, + 110,97,109,101,115,112,97,99,101,32,102,111,114,32,123,125, + 41,22,114,49,0,0,0,114,57,0,0,0,114,52,0,0, + 0,114,18,0,0,0,114,63,0,0,0,114,6,1,0,0, + 114,58,0,0,0,114,61,1,0,0,218,11,95,102,105,108, + 108,95,99,97,99,104,101,114,21,0,0,0,114,64,1,0, + 0,114,110,0,0,0,114,63,1,0,0,114,48,0,0,0, + 114,60,1,0,0,114,62,0,0,0,114,55,1,0,0,114, + 64,0,0,0,114,139,0,0,0,114,153,0,0,0,114,187, + 0,0,0,114,182,0,0,0,41,14,114,123,0,0,0,114, + 143,0,0,0,114,206,0,0,0,90,12,105,115,95,110,97, + 109,101,115,112,97,99,101,90,11,116,97,105,108,95,109,111, + 100,117,108,101,114,173,0,0,0,90,5,99,97,99,104,101, + 90,12,99,97,99,104,101,95,109,111,100,117,108,101,90,9, + 98,97,115,101,95,112,97,116,104,114,14,1,0,0,114,192, + 0,0,0,90,13,105,110,105,116,95,102,105,108,101,110,97, + 109,101,90,9,102,117,108,108,95,112,97,116,104,114,191,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,207,0,0,0,173,5,0,0,115,74,0,0,0,4, + 5,14,1,2,1,24,1,12,1,10,1,10,1,8,1,6, + 1,6,2,6,1,10,1,6,2,4,1,8,2,12,1,14, + 1,8,1,10,1,8,1,24,1,8,4,14,2,16,1,16, + 1,12,1,8,1,10,1,4,1,8,255,6,2,12,1,12, + 1,8,1,4,1,4,1,255,128,122,20,70,105,108,101,70, + 105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,99, + 1,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, + 10,0,0,0,67,0,0,0,115,188,0,0,0,124,0,106, + 0,125,1,122,22,116,1,160,2,124,1,112,22,116,1,160, + 3,161,0,161,1,125,2,87,0,110,28,4,0,116,4,116, + 5,116,6,102,3,121,56,1,0,1,0,1,0,103,0,125, + 2,89,0,110,2,48,0,116,7,106,8,160,9,100,1,161, + 1,115,82,116,10,124,2,131,1,124,0,95,11,110,74,116, + 10,131,0,125,3,124,2,68,0,93,56,125,4,124,4,160, + 12,100,2,161,1,92,3,125,5,125,6,125,7,124,6,114, + 134,100,3,160,13,124,5,124,7,160,14,161,0,161,2,125, + 8,110,4,124,5,125,8,124,3,160,15,124,8,161,1,1, + 0,113,92,124,3,124,0,95,11,116,7,106,8,160,9,116, + 16,161,1,114,184,100,4,100,5,132,0,124,2,68,0,131, + 1,124,0,95,17,100,6,83,0,41,7,122,68,70,105,108, + 108,32,116,104,101,32,99,97,99,104,101,32,111,102,32,112, + 111,116,101,110,116,105,97,108,32,109,111,100,117,108,101,115, + 32,97,110,100,32,112,97,99,107,97,103,101,115,32,102,111, + 114,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121, + 46,114,14,0,0,0,114,79,0,0,0,114,69,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,83,0,0,0,115,20,0,0,0,104,0, + 124,0,93,12,125,1,124,1,160,0,161,0,146,2,113,4, + 83,0,114,7,0,0,0,41,1,114,110,0,0,0,41,2, + 114,5,0,0,0,90,2,102,110,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,13,0,0,0,250,5,0, + 0,115,4,0,0,0,20,0,255,128,122,41,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,115,101,116, + 99,111,109,112,62,78,41,18,114,52,0,0,0,114,18,0, + 0,0,90,7,108,105,115,116,100,105,114,114,63,0,0,0, + 114,49,1,0,0,218,15,80,101,114,109,105,115,115,105,111, + 110,69,114,114,111,114,218,18,78,111,116,65,68,105,114,101, + 99,116,111,114,121,69,114,114,111,114,114,15,0,0,0,114, + 22,0,0,0,114,23,0,0,0,114,62,1,0,0,114,63, + 1,0,0,114,105,0,0,0,114,70,0,0,0,114,110,0, + 0,0,218,3,97,100,100,114,24,0,0,0,114,64,1,0, + 0,41,9,114,123,0,0,0,114,52,0,0,0,90,8,99, + 111,110,116,101,110,116,115,90,21,108,111,119,101,114,95,115, + 117,102,102,105,120,95,99,111,110,116,101,110,116,115,114,37, + 1,0,0,114,121,0,0,0,114,24,1,0,0,114,14,1, + 0,0,90,8,110,101,119,95,110,97,109,101,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,66,1,0,0, + 221,5,0,0,115,38,0,0,0,6,2,2,1,22,1,18, + 1,10,3,12,3,12,1,6,7,8,1,16,1,4,1,18, + 1,4,2,12,1,6,1,12,1,16,1,4,128,255,128,122, + 22,70,105,108,101,70,105,110,100,101,114,46,95,102,105,108, + 108,95,99,97,99,104,101,99,1,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,7,0,0,0, + 115,18,0,0,0,135,0,135,1,102,2,100,1,100,2,132, + 8,125,2,124,2,83,0,41,4,97,20,1,0,0,65,32, + 99,108,97,115,115,32,109,101,116,104,111,100,32,119,104,105, + 99,104,32,114,101,116,117,114,110,115,32,97,32,99,108,111, + 115,117,114,101,32,116,111,32,117,115,101,32,111,110,32,115, + 121,115,46,112,97,116,104,95,104,111,111,107,10,32,32,32, + 32,32,32,32,32,119,104,105,99,104,32,119,105,108,108,32, + 114,101,116,117,114,110,32,97,110,32,105,110,115,116,97,110, + 99,101,32,117,115,105,110,103,32,116,104,101,32,115,112,101, + 99,105,102,105,101,100,32,108,111,97,100,101,114,115,32,97, + 110,100,32,116,104,101,32,112,97,116,104,10,32,32,32,32, + 32,32,32,32,99,97,108,108,101,100,32,111,110,32,116,104, + 101,32,99,108,111,115,117,114,101,46,10,10,32,32,32,32, + 32,32,32,32,73,102,32,116,104,101,32,112,97,116,104,32, + 99,97,108,108,101,100,32,111,110,32,116,104,101,32,99,108, + 111,115,117,114,101,32,105,115,32,110,111,116,32,97,32,100, + 105,114,101,99,116,111,114,121,44,32,73,109,112,111,114,116, + 69,114,114,111,114,32,105,115,10,32,32,32,32,32,32,32, + 32,114,97,105,115,101,100,46,10,10,32,32,32,32,32,32, + 32,32,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,4,0,0,0,19,0,0,0,115,36,0,0,0, + 116,0,124,0,131,1,115,20,116,1,100,1,124,0,100,2, + 141,2,130,1,136,0,124,0,103,1,136,1,162,1,82,0, + 142,0,83,0,41,4,122,45,80,97,116,104,32,104,111,111, + 107,32,102,111,114,32,105,109,112,111,114,116,108,105,98,46, + 109,97,99,104,105,110,101,114,121,46,70,105,108,101,70,105, + 110,100,101,114,46,122,30,111,110,108,121,32,100,105,114,101, + 99,116,111,114,105,101,115,32,97,114,101,32,115,117,112,112, + 111,114,116,101,100,114,56,0,0,0,78,41,2,114,64,0, + 0,0,114,122,0,0,0,114,56,0,0,0,169,2,114,197, + 0,0,0,114,65,1,0,0,114,7,0,0,0,114,8,0, + 0,0,218,24,112,97,116,104,95,104,111,111,107,95,102,111, + 114,95,70,105,108,101,70,105,110,100,101,114,6,6,0,0, + 115,8,0,0,0,8,2,12,1,16,1,255,128,122,54,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,107,95,102,111,114,95,70,105,108,101,70, + 105,110,100,101,114,78,114,7,0,0,0,41,3,114,197,0, + 0,0,114,65,1,0,0,114,71,1,0,0,114,7,0,0, + 0,114,70,1,0,0,114,8,0,0,0,218,9,112,97,116, + 104,95,104,111,111,107,252,5,0,0,115,6,0,0,0,14, + 10,4,6,255,128,122,20,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,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,12,0,0,0,100,1,160,0,124,0,106, + 1,161,1,83,0,41,2,78,122,16,70,105,108,101,70,105, + 110,100,101,114,40,123,33,114,125,41,41,2,114,70,0,0, + 0,114,52,0,0,0,114,252,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,35,1,0,0,14, + 6,0,0,115,4,0,0,0,12,1,255,128,122,19,70,105, + 108,101,70,105,110,100,101,114,46,95,95,114,101,112,114,95, + 95,41,1,78,41,15,114,130,0,0,0,114,129,0,0,0, + 114,131,0,0,0,114,132,0,0,0,114,215,0,0,0,114, + 42,1,0,0,114,147,0,0,0,114,210,0,0,0,114,141, + 0,0,0,114,55,1,0,0,114,207,0,0,0,114,66,1, + 0,0,114,213,0,0,0,114,72,1,0,0,114,35,1,0, + 0,114,7,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,58,1,0,0,127,5,0,0,115,26, + 0,0,0,8,0,4,2,8,7,8,14,4,4,8,2,8, + 12,10,5,8,48,2,31,10,1,12,17,255,128,114,58,1, + 0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,8,0,0,0,67,0,0,0,115,144,0,0,0, + 124,0,160,0,100,1,161,1,125,4,124,0,160,0,100,2, + 161,1,125,5,124,4,115,66,124,5,114,36,124,5,106,1, + 125,4,110,30,124,2,124,3,107,2,114,56,116,2,124,1, + 124,2,131,2,125,4,110,10,116,3,124,1,124,2,131,2, + 125,4,124,5,115,84,116,4,124,1,124,2,124,4,100,3, + 141,3,125,5,122,38,124,5,124,0,100,2,60,0,124,4, + 124,0,100,1,60,0,124,2,124,0,100,4,60,0,124,3, + 124,0,100,5,60,0,87,0,100,0,83,0,4,0,116,5, + 121,142,1,0,1,0,1,0,89,0,100,0,83,0,48,0, + 41,6,78,218,10,95,95,108,111,97,100,101,114,95,95,218, + 8,95,95,115,112,101,99,95,95,114,59,1,0,0,90,8, + 95,95,102,105,108,101,95,95,90,10,95,95,99,97,99,104, + 101,100,95,95,41,6,218,3,103,101,116,114,144,0,0,0, + 114,11,1,0,0,114,5,1,0,0,114,194,0,0,0,218, + 9,69,120,99,101,112,116,105,111,110,41,6,90,2,110,115, + 114,121,0,0,0,90,8,112,97,116,104,110,97,109,101,90, + 9,99,112,97,116,104,110,97,109,101,114,144,0,0,0,114, + 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,14,95,102,105,120,95,117,112,95,109,111,100, + 117,108,101,20,6,0,0,115,42,0,0,0,10,2,10,1, + 4,1,4,1,8,1,8,1,12,1,10,2,4,1,14,1, + 2,1,8,1,8,1,8,1,10,1,4,128,12,1,2,2, + 4,128,2,0,255,128,114,77,1,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,38,0,0,0,116,0,116,1,160,2,161, + 0,102,2,125,0,116,3,116,4,102,2,125,1,116,5,116, + 6,102,2,125,2,124,0,124,1,124,2,103,3,83,0,41, + 2,122,95,82,101,116,117,114,110,115,32,97,32,108,105,115, + 116,32,111,102,32,102,105,108,101,45,98,97,115,101,100,32, + 109,111,100,117,108,101,32,108,111,97,100,101,114,115,46,10, + 10,32,32,32,32,69,97,99,104,32,105,116,101,109,32,105, + 115,32,97,32,116,117,112,108,101,32,40,108,111,97,100,101, + 114,44,32,115,117,102,102,105,120,101,115,41,46,10,32,32, + 32,32,78,41,7,114,2,1,0,0,114,167,0,0,0,218, + 18,101,120,116,101,110,115,105,111,110,95,115,117,102,102,105, + 120,101,115,114,5,1,0,0,114,106,0,0,0,114,11,1, + 0,0,114,94,0,0,0,41,3,90,10,101,120,116,101,110, + 115,105,111,110,115,90,6,115,111,117,114,99,101,90,8,98, + 121,116,101,99,111,100,101,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,188,0,0,0,43,6,0,0,115, + 10,0,0,0,12,5,8,1,8,1,10,1,255,128,114,188, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,1,0,0,0,67,0,0,0,115,8,0,0, + 0,124,0,97,0,100,0,83,0,114,114,0,0,0,41,1, + 114,139,0,0,0,41,1,218,17,95,98,111,111,116,115,116, + 114,97,112,95,109,111,100,117,108,101,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,21,95,115,101,116,95, + 98,111,111,116,115,116,114,97,112,95,109,111,100,117,108,101, + 54,6,0,0,115,6,0,0,0,4,2,4,128,255,128,114, + 80,1,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,4,0,0,0,67,0,0,0,115,50,0, + 0,0,116,0,124,0,131,1,1,0,116,1,131,0,125,1, + 116,2,106,3,160,4,116,5,106,6,124,1,142,0,103,1, + 161,1,1,0,116,2,106,7,160,8,116,9,161,1,1,0, + 100,1,83,0,41,2,122,41,73,110,115,116,97,108,108,32, + 116,104,101,32,112,97,116,104,45,98,97,115,101,100,32,105, + 109,112,111,114,116,32,99,111,109,112,111,110,101,110,116,115, + 46,78,41,10,114,80,1,0,0,114,188,0,0,0,114,15, + 0,0,0,114,47,1,0,0,114,171,0,0,0,114,58,1, + 0,0,114,72,1,0,0,218,9,109,101,116,97,95,112,97, + 116,104,114,190,0,0,0,114,41,1,0,0,41,2,114,79, + 1,0,0,90,17,115,117,112,112,111,114,116,101,100,95,108, + 111,97,100,101,114,115,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,8,95,105,110,115,116,97,108,108,59, + 6,0,0,115,12,0,0,0,8,2,6,1,20,1,12,1, + 4,128,255,128,114,82,1,0,0,41,1,114,68,0,0,0, + 41,1,78,41,3,78,78,78,41,2,114,0,0,0,0,114, + 0,0,0,0,41,1,84,41,1,78,41,1,78,41,83,114, + 132,0,0,0,114,139,0,0,0,114,167,0,0,0,114,72, + 0,0,0,114,15,0,0,0,114,81,0,0,0,114,164,0, + 0,0,114,22,0,0,0,114,211,0,0,0,90,2,110,116, + 114,18,0,0,0,114,196,0,0,0,90,5,112,111,115,105, + 120,114,42,0,0,0,218,3,97,108,108,114,45,0,0,0, + 114,46,0,0,0,114,66,0,0,0,114,25,0,0,0,90, + 37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, + 86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,84, + 69,83,95,75,69,89,114,24,0,0,0,114,26,0,0,0, + 114,21,0,0,0,114,33,0,0,0,114,38,0,0,0,114, + 40,0,0,0,114,48,0,0,0,114,55,0,0,0,114,57, + 0,0,0,114,61,0,0,0,114,62,0,0,0,114,64,0, + 0,0,114,67,0,0,0,114,77,0,0,0,218,4,116,121, + 112,101,218,8,95,95,99,111,100,101,95,95,114,166,0,0, + 0,114,31,0,0,0,114,152,0,0,0,114,30,0,0,0, + 114,35,0,0,0,114,242,0,0,0,114,97,0,0,0,114, + 93,0,0,0,114,106,0,0,0,114,190,0,0,0,114,78, + 1,0,0,114,212,0,0,0,114,94,0,0,0,90,23,68, + 69,66,85,71,95,66,89,84,69,67,79,68,69,95,83,85, + 70,70,73,88,69,83,90,27,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,114,102,0,0,0,114,107,0,0,0,114,113,0, + 0,0,114,117,0,0,0,114,119,0,0,0,114,140,0,0, + 0,114,147,0,0,0,114,156,0,0,0,114,160,0,0,0, + 114,162,0,0,0,114,169,0,0,0,114,174,0,0,0,114, + 175,0,0,0,114,180,0,0,0,218,6,111,98,106,101,99, + 116,114,189,0,0,0,114,194,0,0,0,114,195,0,0,0, + 114,214,0,0,0,114,227,0,0,0,114,245,0,0,0,114, + 5,1,0,0,114,11,1,0,0,114,2,1,0,0,114,17, + 1,0,0,114,39,1,0,0,114,41,1,0,0,114,58,1, + 0,0,114,77,1,0,0,114,188,0,0,0,114,80,1,0, + 0,114,82,1,0,0,114,7,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,8,60,109,111,100, + 117,108,101,62,1,0,0,0,115,174,0,0,0,4,0,4, + 22,8,3,8,1,8,1,8,1,8,1,10,3,4,1,8, + 1,10,1,8,2,4,3,10,1,6,2,22,2,8,1,10, + 1,14,1,4,4,4,1,2,1,2,1,4,255,8,4,6, + 16,8,3,8,5,8,5,8,6,8,6,8,12,8,10,8, + 9,8,5,8,7,10,9,10,22,0,127,16,22,12,1,4, + 2,4,1,6,2,6,1,10,1,8,2,6,2,8,2,16, + 2,8,71,8,40,8,19,8,12,8,12,8,31,8,17,8, + 33,8,28,10,24,10,13,10,10,8,11,6,14,4,3,2, + 1,12,255,14,68,14,64,16,29,0,127,14,17,18,50,18, + 45,18,25,14,53,14,63,14,42,0,127,14,20,0,127,10, + 22,8,23,8,11,8,5,4,128,255,128, }; From a5128da3431b638d9ea9200dc9540fcdb1a8c8ec Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 19 Nov 2020 14:36:23 +0100 Subject: [PATCH 0593/1261] bpo-1635741: Port _struct to multiphase initialization (GH-23398) Signed-off-by: Christian Heimes --- ...2020-11-19-12-06-43.bpo-1635741.KEfZpn.rst | 1 + Modules/_struct.c | 498 ++++++++++-------- Modules/clinic/_struct.c.h | 10 +- 3 files changed, 271 insertions(+), 238 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-19-12-06-43.bpo-1635741.KEfZpn.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-19-12-06-43.bpo-1635741.KEfZpn.rst b/Misc/NEWS.d/next/C API/2020-11-19-12-06-43.bpo-1635741.KEfZpn.rst new file mode 100644 index 00000000000000..fc64757e00b3ac --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-19-12-06-43.bpo-1635741.KEfZpn.rst @@ -0,0 +1 @@ +Port _struct extension module to multiphase initialization (:pep:`489`) diff --git a/Modules/_struct.c b/Modules/_struct.c index 81cdbb9b817d31..8dfcd882a444b9 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -15,6 +15,7 @@ class Struct "PyStructObject *" "&PyStructType" /*[clinic end generated code: output=da39a3ee5e6b4b0d input=9b032058a83ed7c3]*/ typedef struct { + PyObject *cache; PyObject *PyStructType; PyObject *unpackiter_type; PyObject *StructError; @@ -30,16 +31,19 @@ get_struct_state(PyObject *module) static struct PyModuleDef _structmodule; -#define _structmodulestate_global get_struct_state(PyState_FindModule(&_structmodule)) +#define get_struct_state_structinst(self) \ + (get_struct_state(_PyType_GetModuleByDef(Py_TYPE(self), &_structmodule))) +#define get_struct_state_iterinst(self) \ + (get_struct_state(PyType_GetModule(Py_TYPE(self)))) /* The translation function for each format character is table driven */ typedef struct _formatdef { char format; Py_ssize_t size; Py_ssize_t alignment; - PyObject* (*unpack)(const char *, + PyObject* (*unpack)(_structmodulestate *, const char *, const struct _formatdef *); - int (*pack)(char *, PyObject *, + int (*pack)(_structmodulestate *, char *, PyObject *, const struct _formatdef *); } formatdef; @@ -61,10 +65,7 @@ typedef struct { PyObject *weakreflist; /* List of weak references */ } PyStructObject; - -#define PyStruct_Check(op) PyObject_TypeCheck(op, (PyTypeObject *)_structmodulestate_global->PyStructType) -#define PyStruct_CheckExact(op) Py_IS_TYPE(op, (PyTypeObject *)_structmodulestate_global->PyStructType) - +#define PyStruct_Check(op, state) PyObject_TypeCheck(op, (PyTypeObject *)(state)->PyStructType) /* Define various structs to figure out the alignments of types */ @@ -102,12 +103,20 @@ class cache_struct_converter(CConverter): converter = 'cache_struct_converter' c_default = "NULL" + def parse_arg(self, argname, displayname): + return """ + if (!{converter}(module, {argname}, &{paramname})) {{{{ + goto exit; + }}}} + """.format(argname=argname, paramname=self.name, + converter=self.converter) + def cleanup(self): return "Py_XDECREF(%s);\n" % self.name [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=49957cca130ffb63]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=d6746621c2fb1a7d]*/ -static int cache_struct_converter(PyObject *, PyStructObject **); +static int cache_struct_converter(PyObject *, PyObject *, PyStructObject **); #include "clinic/_struct.c.h" @@ -115,7 +124,7 @@ static int cache_struct_converter(PyObject *, PyStructObject **); PyLongObject if possible, otherwise fails. Caller should decref. */ static PyObject * -get_pylong(PyObject *v) +get_pylong(_structmodulestate *state, PyObject *v) { assert(v != NULL); if (!PyLong_Check(v)) { @@ -126,7 +135,7 @@ get_pylong(PyObject *v) return NULL; } else { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "required argument is not an integer"); return NULL; } @@ -142,11 +151,11 @@ get_pylong(PyObject *v) one */ static int -get_long(PyObject *v, long *p) +get_long(_structmodulestate *state, PyObject *v, long *p) { long x; - v = get_pylong(v); + v = get_pylong(state, v); if (v == NULL) return -1; assert(PyLong_Check(v)); @@ -154,7 +163,7 @@ get_long(PyObject *v, long *p) Py_DECREF(v); if (x == (long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "argument out of range"); return -1; } @@ -166,11 +175,11 @@ get_long(PyObject *v, long *p) /* Same, but handling unsigned long */ static int -get_ulong(PyObject *v, unsigned long *p) +get_ulong(_structmodulestate *state, PyObject *v, unsigned long *p) { unsigned long x; - v = get_pylong(v); + v = get_pylong(state, v); if (v == NULL) return -1; assert(PyLong_Check(v)); @@ -178,7 +187,7 @@ get_ulong(PyObject *v, unsigned long *p) Py_DECREF(v); if (x == (unsigned long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "argument out of range"); return -1; } @@ -189,11 +198,11 @@ get_ulong(PyObject *v, unsigned long *p) /* Same, but handling native long long. */ static int -get_longlong(PyObject *v, long long *p) +get_longlong(_structmodulestate *state, PyObject *v, long long *p) { long long x; - v = get_pylong(v); + v = get_pylong(state, v); if (v == NULL) return -1; assert(PyLong_Check(v)); @@ -201,7 +210,7 @@ get_longlong(PyObject *v, long long *p) Py_DECREF(v); if (x == (long long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "argument out of range"); return -1; } @@ -212,11 +221,11 @@ get_longlong(PyObject *v, long long *p) /* Same, but handling native unsigned long long. */ static int -get_ulonglong(PyObject *v, unsigned long long *p) +get_ulonglong(_structmodulestate *state, PyObject *v, unsigned long long *p) { unsigned long long x; - v = get_pylong(v); + v = get_pylong(state, v); if (v == NULL) return -1; assert(PyLong_Check(v)); @@ -224,7 +233,7 @@ get_ulonglong(PyObject *v, unsigned long long *p) Py_DECREF(v); if (x == (unsigned long long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "argument out of range"); return -1; } @@ -235,11 +244,11 @@ get_ulonglong(PyObject *v, unsigned long long *p) /* Same, but handling Py_ssize_t */ static int -get_ssize_t(PyObject *v, Py_ssize_t *p) +get_ssize_t(_structmodulestate *state, PyObject *v, Py_ssize_t *p) { Py_ssize_t x; - v = get_pylong(v); + v = get_pylong(state, v); if (v == NULL) return -1; assert(PyLong_Check(v)); @@ -247,7 +256,7 @@ get_ssize_t(PyObject *v, Py_ssize_t *p) Py_DECREF(v); if (x == (Py_ssize_t)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "argument out of range"); return -1; } @@ -258,11 +267,11 @@ get_ssize_t(PyObject *v, Py_ssize_t *p) /* Same, but handling size_t */ static int -get_size_t(PyObject *v, size_t *p) +get_size_t(_structmodulestate *state, PyObject *v, size_t *p) { size_t x; - v = get_pylong(v); + v = get_pylong(state, v); if (v == NULL) return -1; assert(PyLong_Check(v)); @@ -270,7 +279,7 @@ get_size_t(PyObject *v, size_t *p) Py_DECREF(v); if (x == (size_t)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "argument out of range"); return -1; } @@ -279,7 +288,7 @@ get_size_t(PyObject *v, size_t *p) } -#define RANGE_ERROR(x, f, flag, mask) return _range_error(f, flag) +#define RANGE_ERROR(state, x, f, flag, mask) return _range_error(state, f, flag) /* Floating point helpers */ @@ -298,13 +307,14 @@ unpack_halffloat(const char *p, /* start of 2-byte string */ } static int -pack_halffloat(char *p, /* start of 2-byte string */ +pack_halffloat(_structmodulestate *state, + char *p, /* start of 2-byte string */ PyObject *v, /* value to pack */ int le) /* true for little-endian, false for big-endian */ { double x = PyFloat_AsDouble(v); if (x == -1.0 && PyErr_Occurred()) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "required argument is not a float"); return -1; } @@ -337,7 +347,7 @@ unpack_double(const char *p, /* start of 8-byte string */ /* Helper to format the range error exceptions */ static int -_range_error(const formatdef *f, int is_unsigned) +_range_error(_structmodulestate *state, const formatdef *f, int is_unsigned) { /* ulargest is the largest unsigned value with f->size bytes. * Note that the simpler: @@ -350,13 +360,13 @@ _range_error(const formatdef *f, int is_unsigned) const size_t ulargest = (size_t)-1 >> ((SIZEOF_SIZE_T - f->size)*8); assert(f->size >= 1 && f->size <= SIZEOF_SIZE_T); if (is_unsigned) - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "'%c' format requires 0 <= number <= %zu", f->format, ulargest); else { const Py_ssize_t largest = (Py_ssize_t)(ulargest >> 1); - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "'%c' format requires %zd <= number <= %zd", f->format, ~ largest, @@ -388,25 +398,25 @@ _range_error(const formatdef *f, int is_unsigned) does this). */ static PyObject * -nu_char(const char *p, const formatdef *f) +nu_char(_structmodulestate *state, const char *p, const formatdef *f) { return PyBytes_FromStringAndSize(p, 1); } static PyObject * -nu_byte(const char *p, const formatdef *f) +nu_byte(_structmodulestate *state, const char *p, const formatdef *f) { return PyLong_FromLong((long) *(signed char *)p); } static PyObject * -nu_ubyte(const char *p, const formatdef *f) +nu_ubyte(_structmodulestate *state, const char *p, const formatdef *f) { return PyLong_FromLong((long) *(unsigned char *)p); } static PyObject * -nu_short(const char *p, const formatdef *f) +nu_short(_structmodulestate *state, const char *p, const formatdef *f) { short x; memcpy((char *)&x, p, sizeof x); @@ -414,7 +424,7 @@ nu_short(const char *p, const formatdef *f) } static PyObject * -nu_ushort(const char *p, const formatdef *f) +nu_ushort(_structmodulestate *state, const char *p, const formatdef *f) { unsigned short x; memcpy((char *)&x, p, sizeof x); @@ -422,7 +432,7 @@ nu_ushort(const char *p, const formatdef *f) } static PyObject * -nu_int(const char *p, const formatdef *f) +nu_int(_structmodulestate *state, const char *p, const formatdef *f) { int x; memcpy((char *)&x, p, sizeof x); @@ -430,7 +440,7 @@ nu_int(const char *p, const formatdef *f) } static PyObject * -nu_uint(const char *p, const formatdef *f) +nu_uint(_structmodulestate *state, const char *p, const formatdef *f) { unsigned int x; memcpy((char *)&x, p, sizeof x); @@ -438,7 +448,7 @@ nu_uint(const char *p, const formatdef *f) } static PyObject * -nu_long(const char *p, const formatdef *f) +nu_long(_structmodulestate *state, const char *p, const formatdef *f) { long x; memcpy((char *)&x, p, sizeof x); @@ -446,7 +456,7 @@ nu_long(const char *p, const formatdef *f) } static PyObject * -nu_ulong(const char *p, const formatdef *f) +nu_ulong(_structmodulestate *state, const char *p, const formatdef *f) { unsigned long x; memcpy((char *)&x, p, sizeof x); @@ -454,7 +464,7 @@ nu_ulong(const char *p, const formatdef *f) } static PyObject * -nu_ssize_t(const char *p, const formatdef *f) +nu_ssize_t(_structmodulestate *state, const char *p, const formatdef *f) { Py_ssize_t x; memcpy((char *)&x, p, sizeof x); @@ -462,7 +472,7 @@ nu_ssize_t(const char *p, const formatdef *f) } static PyObject * -nu_size_t(const char *p, const formatdef *f) +nu_size_t(_structmodulestate *state, const char *p, const formatdef *f) { size_t x; memcpy((char *)&x, p, sizeof x); @@ -470,7 +480,7 @@ nu_size_t(const char *p, const formatdef *f) } static PyObject * -nu_longlong(const char *p, const formatdef *f) +nu_longlong(_structmodulestate *state, const char *p, const formatdef *f) { long long x; memcpy((char *)&x, p, sizeof x); @@ -478,7 +488,7 @@ nu_longlong(const char *p, const formatdef *f) } static PyObject * -nu_ulonglong(const char *p, const formatdef *f) +nu_ulonglong(_structmodulestate *state, const char *p, const formatdef *f) { unsigned long long x; memcpy((char *)&x, p, sizeof x); @@ -486,7 +496,7 @@ nu_ulonglong(const char *p, const formatdef *f) } static PyObject * -nu_bool(const char *p, const formatdef *f) +nu_bool(_structmodulestate *state, const char *p, const formatdef *f) { _Bool x; memcpy((char *)&x, p, sizeof x); @@ -495,7 +505,7 @@ nu_bool(const char *p, const formatdef *f) static PyObject * -nu_halffloat(const char *p, const formatdef *f) +nu_halffloat(_structmodulestate *state, const char *p, const formatdef *f) { #if PY_LITTLE_ENDIAN return unpack_halffloat(p, 1); @@ -505,7 +515,7 @@ nu_halffloat(const char *p, const formatdef *f) } static PyObject * -nu_float(const char *p, const formatdef *f) +nu_float(_structmodulestate *state, const char *p, const formatdef *f) { float x; memcpy((char *)&x, p, sizeof x); @@ -513,7 +523,7 @@ nu_float(const char *p, const formatdef *f) } static PyObject * -nu_double(const char *p, const formatdef *f) +nu_double(_structmodulestate *state, const char *p, const formatdef *f) { double x; memcpy((char *)&x, p, sizeof x); @@ -521,7 +531,7 @@ nu_double(const char *p, const formatdef *f) } static PyObject * -nu_void_p(const char *p, const formatdef *f) +nu_void_p(_structmodulestate *state, const char *p, const formatdef *f) { void *x; memcpy((char *)&x, p, sizeof x); @@ -529,13 +539,13 @@ nu_void_p(const char *p, const formatdef *f) } static int -np_byte(char *p, PyObject *v, const formatdef *f) +np_byte(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { long x; - if (get_long(v, &x) < 0) + if (get_long(state, v, &x) < 0) return -1; if (x < -128 || x > 127) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "byte format requires -128 <= number <= 127"); return -1; } @@ -544,13 +554,13 @@ np_byte(char *p, PyObject *v, const formatdef *f) } static int -np_ubyte(char *p, PyObject *v, const formatdef *f) +np_ubyte(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { long x; - if (get_long(v, &x) < 0) + if (get_long(state, v, &x) < 0) return -1; if (x < 0 || x > 255) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "ubyte format requires 0 <= number <= 255"); return -1; } @@ -559,10 +569,10 @@ np_ubyte(char *p, PyObject *v, const formatdef *f) } static int -np_char(char *p, PyObject *v, const formatdef *f) +np_char(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { if (!PyBytes_Check(v) || PyBytes_Size(v) != 1) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "char format requires a bytes object of length 1"); return -1; } @@ -571,14 +581,14 @@ np_char(char *p, PyObject *v, const formatdef *f) } static int -np_short(char *p, PyObject *v, const formatdef *f) +np_short(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { long x; short y; - if (get_long(v, &x) < 0) + if (get_long(state, v, &x) < 0) return -1; if (x < SHRT_MIN || x > SHRT_MAX) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "short format requires " Py_STRINGIFY(SHRT_MIN) " <= number <= " Py_STRINGIFY(SHRT_MAX)); return -1; @@ -589,14 +599,14 @@ np_short(char *p, PyObject *v, const formatdef *f) } static int -np_ushort(char *p, PyObject *v, const formatdef *f) +np_ushort(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { long x; unsigned short y; - if (get_long(v, &x) < 0) + if (get_long(state, v, &x) < 0) return -1; if (x < 0 || x > USHRT_MAX) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "ushort format requires 0 <= number <= " Py_STRINGIFY(USHRT_MAX)); return -1; @@ -607,15 +617,15 @@ np_ushort(char *p, PyObject *v, const formatdef *f) } static int -np_int(char *p, PyObject *v, const formatdef *f) +np_int(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { long x; int y; - if (get_long(v, &x) < 0) + if (get_long(state, v, &x) < 0) return -1; #if (SIZEOF_LONG > SIZEOF_INT) if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX))) - RANGE_ERROR(x, f, 0, -1); + RANGE_ERROR(state, x, f, 0, -1); #endif y = (int)x; memcpy(p, (char *)&y, sizeof y); @@ -623,76 +633,76 @@ np_int(char *p, PyObject *v, const formatdef *f) } static int -np_uint(char *p, PyObject *v, const formatdef *f) +np_uint(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { unsigned long x; unsigned int y; - if (get_ulong(v, &x) < 0) + if (get_ulong(state, v, &x) < 0) return -1; y = (unsigned int)x; #if (SIZEOF_LONG > SIZEOF_INT) if (x > ((unsigned long)UINT_MAX)) - RANGE_ERROR(y, f, 1, -1); + RANGE_ERROR(state, y, f, 1, -1); #endif memcpy(p, (char *)&y, sizeof y); return 0; } static int -np_long(char *p, PyObject *v, const formatdef *f) +np_long(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { long x; - if (get_long(v, &x) < 0) + if (get_long(state, v, &x) < 0) return -1; memcpy(p, (char *)&x, sizeof x); return 0; } static int -np_ulong(char *p, PyObject *v, const formatdef *f) +np_ulong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { unsigned long x; - if (get_ulong(v, &x) < 0) + if (get_ulong(state, v, &x) < 0) return -1; memcpy(p, (char *)&x, sizeof x); return 0; } static int -np_ssize_t(char *p, PyObject *v, const formatdef *f) +np_ssize_t(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { Py_ssize_t x; - if (get_ssize_t(v, &x) < 0) + if (get_ssize_t(state, v, &x) < 0) return -1; memcpy(p, (char *)&x, sizeof x); return 0; } static int -np_size_t(char *p, PyObject *v, const formatdef *f) +np_size_t(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { size_t x; - if (get_size_t(v, &x) < 0) + if (get_size_t(state, v, &x) < 0) return -1; memcpy(p, (char *)&x, sizeof x); return 0; } static int -np_longlong(char *p, PyObject *v, const formatdef *f) +np_longlong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { long long x; - if (get_longlong(v, &x) < 0) + if (get_longlong(state, v, &x) < 0) return -1; memcpy(p, (char *)&x, sizeof x); return 0; } static int -np_ulonglong(char *p, PyObject *v, const formatdef *f) +np_ulonglong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { unsigned long long x; - if (get_ulonglong(v, &x) < 0) + if (get_ulonglong(state, v, &x) < 0) return -1; memcpy(p, (char *)&x, sizeof x); return 0; @@ -700,7 +710,7 @@ np_ulonglong(char *p, PyObject *v, const formatdef *f) static int -np_bool(char *p, PyObject *v, const formatdef *f) +np_bool(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { int y; _Bool x; @@ -713,21 +723,21 @@ np_bool(char *p, PyObject *v, const formatdef *f) } static int -np_halffloat(char *p, PyObject *v, const formatdef *f) +np_halffloat(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { #if PY_LITTLE_ENDIAN - return pack_halffloat(p, v, 1); + return pack_halffloat(state, p, v, 1); #else - return pack_halffloat(p, v, 0); + return pack_halffloat(statem p, v, 0); #endif } static int -np_float(char *p, PyObject *v, const formatdef *f) +np_float(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { float x = (float)PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "required argument is not a float"); return -1; } @@ -736,11 +746,11 @@ np_float(char *p, PyObject *v, const formatdef *f) } static int -np_double(char *p, PyObject *v, const formatdef *f) +np_double(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "required argument is not a float"); return -1; } @@ -749,11 +759,11 @@ np_double(char *p, PyObject *v, const formatdef *f) } static int -np_void_p(char *p, PyObject *v, const formatdef *f) +np_void_p(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { void *x; - v = get_pylong(v); + v = get_pylong(state, v); if (v == NULL) return -1; assert(PyLong_Check(v)); @@ -793,7 +803,7 @@ static const formatdef native_table[] = { /* Big-endian routines. *****************************************************/ static PyObject * -bu_int(const char *p, const formatdef *f) +bu_int(_structmodulestate *state, const char *p, const formatdef *f) { long x = 0; Py_ssize_t i = f->size; @@ -808,7 +818,7 @@ bu_int(const char *p, const formatdef *f) } static PyObject * -bu_uint(const char *p, const formatdef *f) +bu_uint(_structmodulestate *state, const char *p, const formatdef *f) { unsigned long x = 0; Py_ssize_t i = f->size; @@ -820,7 +830,7 @@ bu_uint(const char *p, const formatdef *f) } static PyObject * -bu_longlong(const char *p, const formatdef *f) +bu_longlong(_structmodulestate *state, const char *p, const formatdef *f) { long long x = 0; Py_ssize_t i = f->size; @@ -835,7 +845,7 @@ bu_longlong(const char *p, const formatdef *f) } static PyObject * -bu_ulonglong(const char *p, const formatdef *f) +bu_ulonglong(_structmodulestate *state, const char *p, const formatdef *f) { unsigned long long x = 0; Py_ssize_t i = f->size; @@ -847,44 +857,44 @@ bu_ulonglong(const char *p, const formatdef *f) } static PyObject * -bu_halffloat(const char *p, const formatdef *f) +bu_halffloat(_structmodulestate *state, const char *p, const formatdef *f) { return unpack_halffloat(p, 0); } static PyObject * -bu_float(const char *p, const formatdef *f) +bu_float(_structmodulestate *state, const char *p, const formatdef *f) { return unpack_float(p, 0); } static PyObject * -bu_double(const char *p, const formatdef *f) +bu_double(_structmodulestate *state, const char *p, const formatdef *f) { return unpack_double(p, 0); } static PyObject * -bu_bool(const char *p, const formatdef *f) +bu_bool(_structmodulestate *state, const char *p, const formatdef *f) { return PyBool_FromLong(*p != 0); } static int -bp_int(char *p, PyObject *v, const formatdef *f) +bp_int(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { long x; Py_ssize_t i; unsigned char *q = (unsigned char *)p; - if (get_long(v, &x) < 0) + if (get_long(state, v, &x) < 0) return -1; i = f->size; if (i != SIZEOF_LONG) { if ((i == 2) && (x < -32768 || x > 32767)) - RANGE_ERROR(x, f, 0, 0xffffL); + RANGE_ERROR(state, x, f, 0, 0xffffL); #if (SIZEOF_LONG != 4) else if ((i == 4) && (x < -2147483648L || x > 2147483647L)) - RANGE_ERROR(x, f, 0, 0xffffffffL); + RANGE_ERROR(state, x, f, 0, 0xffffffffL); #endif } do { @@ -895,19 +905,19 @@ bp_int(char *p, PyObject *v, const formatdef *f) } static int -bp_uint(char *p, PyObject *v, const formatdef *f) +bp_uint(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { unsigned long x; Py_ssize_t i; unsigned char *q = (unsigned char *)p; - if (get_ulong(v, &x) < 0) + if (get_ulong(state, v, &x) < 0) return -1; i = f->size; if (i != SIZEOF_LONG) { unsigned long maxint = 1; maxint <<= (unsigned long)(i * 8); if (x >= maxint) - RANGE_ERROR(x, f, 1, maxint - 1); + RANGE_ERROR(state, x, f, 1, maxint - 1); } do { q[--i] = (unsigned char)(x & 0xffUL); @@ -917,10 +927,10 @@ bp_uint(char *p, PyObject *v, const formatdef *f) } static int -bp_longlong(char *p, PyObject *v, const formatdef *f) +bp_longlong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { int res; - v = get_pylong(v); + v = get_pylong(state, v); if (v == NULL) return -1; res = _PyLong_AsByteArray((PyLongObject *)v, @@ -933,10 +943,10 @@ bp_longlong(char *p, PyObject *v, const formatdef *f) } static int -bp_ulonglong(char *p, PyObject *v, const formatdef *f) +bp_ulonglong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { int res; - v = get_pylong(v); + v = get_pylong(state, v); if (v == NULL) return -1; res = _PyLong_AsByteArray((PyLongObject *)v, @@ -949,17 +959,17 @@ bp_ulonglong(char *p, PyObject *v, const formatdef *f) } static int -bp_halffloat(char *p, PyObject *v, const formatdef *f) +bp_halffloat(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { - return pack_halffloat(p, v, 0); + return pack_halffloat(state, p, v, 0); } static int -bp_float(char *p, PyObject *v, const formatdef *f) +bp_float(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "required argument is not a float"); return -1; } @@ -967,11 +977,11 @@ bp_float(char *p, PyObject *v, const formatdef *f) } static int -bp_double(char *p, PyObject *v, const formatdef *f) +bp_double(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "required argument is not a float"); return -1; } @@ -979,7 +989,7 @@ bp_double(char *p, PyObject *v, const formatdef *f) } static int -bp_bool(char *p, PyObject *v, const formatdef *f) +bp_bool(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { int y; y = PyObject_IsTrue(v); @@ -1014,7 +1024,7 @@ static formatdef bigendian_table[] = { /* Little-endian routines. *****************************************************/ static PyObject * -lu_int(const char *p, const formatdef *f) +lu_int(_structmodulestate *state, const char *p, const formatdef *f) { long x = 0; Py_ssize_t i = f->size; @@ -1029,7 +1039,7 @@ lu_int(const char *p, const formatdef *f) } static PyObject * -lu_uint(const char *p, const formatdef *f) +lu_uint(_structmodulestate *state, const char *p, const formatdef *f) { unsigned long x = 0; Py_ssize_t i = f->size; @@ -1041,7 +1051,7 @@ lu_uint(const char *p, const formatdef *f) } static PyObject * -lu_longlong(const char *p, const formatdef *f) +lu_longlong(_structmodulestate *state, const char *p, const formatdef *f) { long long x = 0; Py_ssize_t i = f->size; @@ -1056,7 +1066,7 @@ lu_longlong(const char *p, const formatdef *f) } static PyObject * -lu_ulonglong(const char *p, const formatdef *f) +lu_ulonglong(_structmodulestate *state, const char *p, const formatdef *f) { unsigned long long x = 0; Py_ssize_t i = f->size; @@ -1068,38 +1078,38 @@ lu_ulonglong(const char *p, const formatdef *f) } static PyObject * -lu_halffloat(const char *p, const formatdef *f) +lu_halffloat(_structmodulestate *state, const char *p, const formatdef *f) { return unpack_halffloat(p, 1); } static PyObject * -lu_float(const char *p, const formatdef *f) +lu_float(_structmodulestate *state, const char *p, const formatdef *f) { return unpack_float(p, 1); } static PyObject * -lu_double(const char *p, const formatdef *f) +lu_double(_structmodulestate *state, const char *p, const formatdef *f) { return unpack_double(p, 1); } static int -lp_int(char *p, PyObject *v, const formatdef *f) +lp_int(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { long x; Py_ssize_t i; unsigned char *q = (unsigned char *)p; - if (get_long(v, &x) < 0) + if (get_long(state, v, &x) < 0) return -1; i = f->size; if (i != SIZEOF_LONG) { if ((i == 2) && (x < -32768 || x > 32767)) - RANGE_ERROR(x, f, 0, 0xffffL); + RANGE_ERROR(state, x, f, 0, 0xffffL); #if (SIZEOF_LONG != 4) else if ((i == 4) && (x < -2147483648L || x > 2147483647L)) - RANGE_ERROR(x, f, 0, 0xffffffffL); + RANGE_ERROR(state, x, f, 0, 0xffffffffL); #endif } do { @@ -1110,19 +1120,19 @@ lp_int(char *p, PyObject *v, const formatdef *f) } static int -lp_uint(char *p, PyObject *v, const formatdef *f) +lp_uint(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { unsigned long x; Py_ssize_t i; unsigned char *q = (unsigned char *)p; - if (get_ulong(v, &x) < 0) + if (get_ulong(state, v, &x) < 0) return -1; i = f->size; if (i != SIZEOF_LONG) { unsigned long maxint = 1; maxint <<= (unsigned long)(i * 8); if (x >= maxint) - RANGE_ERROR(x, f, 1, maxint - 1); + RANGE_ERROR(state, x, f, 1, maxint - 1); } do { *q++ = (unsigned char)(x & 0xffUL); @@ -1132,10 +1142,10 @@ lp_uint(char *p, PyObject *v, const formatdef *f) } static int -lp_longlong(char *p, PyObject *v, const formatdef *f) +lp_longlong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { int res; - v = get_pylong(v); + v = get_pylong(state, v); if (v == NULL) return -1; res = _PyLong_AsByteArray((PyLongObject*)v, @@ -1148,10 +1158,10 @@ lp_longlong(char *p, PyObject *v, const formatdef *f) } static int -lp_ulonglong(char *p, PyObject *v, const formatdef *f) +lp_ulonglong(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { int res; - v = get_pylong(v); + v = get_pylong(state, v); if (v == NULL) return -1; res = _PyLong_AsByteArray((PyLongObject*)v, @@ -1164,17 +1174,17 @@ lp_ulonglong(char *p, PyObject *v, const formatdef *f) } static int -lp_halffloat(char *p, PyObject *v, const formatdef *f) +lp_halffloat(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { - return pack_halffloat(p, v, 1); + return pack_halffloat(state, p, v, 1); } static int -lp_float(char *p, PyObject *v, const formatdef *f) +lp_float(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "required argument is not a float"); return -1; } @@ -1182,11 +1192,11 @@ lp_float(char *p, PyObject *v, const formatdef *f) } static int -lp_double(char *p, PyObject *v, const formatdef *f) +lp_double(_structmodulestate *state, char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "required argument is not a float"); return -1; } @@ -1246,14 +1256,14 @@ whichtable(const char **pfmt) /* Get the table entry for a format code */ static const formatdef * -getentry(int c, const formatdef *f) +getentry(_structmodulestate *state, int c, const formatdef *f) { for (; f->format != '\0'; f++) { if (f->format == c) { return f; } } - PyErr_SetString(_structmodulestate_global->StructError, "bad char in struct format"); + PyErr_SetString(state->StructError, "bad char in struct format"); return NULL; } @@ -1295,9 +1305,11 @@ prepare_s(PyStructObject *self) Py_ssize_t size, len, num, itemsize; size_t ncodes; + _structmodulestate *state = get_struct_state_structinst(self); + fmt = PyBytes_AS_STRING(self->s_format); if (strlen(fmt) != (size_t)PyBytes_GET_SIZE(self->s_format)) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "embedded null character"); return -1; } @@ -1323,7 +1335,7 @@ prepare_s(PyStructObject *self) num = num*10 + (c - '0'); } if (c == '\0') { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "repeat count given without format specifier"); return -1; } @@ -1331,7 +1343,7 @@ prepare_s(PyStructObject *self) else num = 1; - e = getentry(c, f); + e = getentry(state, c, f); if (e == NULL) return -1; @@ -1384,7 +1396,7 @@ prepare_s(PyStructObject *self) else num = 1; - e = getentry(c, f); + e = getentry(state, c, f); size = align(size, c, e); if (c == 's' || c == 'p') { @@ -1413,7 +1425,7 @@ prepare_s(PyStructObject *self) return 0; overflow: - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "total struct size too long"); return -1; } @@ -1499,7 +1511,8 @@ s_dealloc(PyStructObject *s) } static PyObject * -s_unpack_internal(PyStructObject *soself, const char *startfrom) { +s_unpack_internal(PyStructObject *soself, const char *startfrom, + _structmodulestate *state) { formatcode *code; Py_ssize_t i = 0; PyObject *result = PyTuple_New(soself->s_len); @@ -1520,7 +1533,7 @@ s_unpack_internal(PyStructObject *soself, const char *startfrom) { n = code->size - 1; v = PyBytes_FromStringAndSize(res + 1, n); } else { - v = e->unpack(res, e); + v = e->unpack(state, res, e); } if (v == NULL) goto fail; @@ -1554,14 +1567,15 @@ static PyObject * Struct_unpack_impl(PyStructObject *self, Py_buffer *buffer) /*[clinic end generated code: output=873a24faf02e848a input=3113f8e7038b2f6c]*/ { + _structmodulestate *state = get_struct_state_structinst(self); assert(self->s_codes != NULL); if (buffer->len != self->s_size) { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "unpack requires a buffer of %zd bytes", self->s_size); return NULL; } - return s_unpack_internal(self, buffer->buf); + return s_unpack_internal(self, buffer->buf, state); } /*[clinic input] @@ -1585,11 +1599,12 @@ Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer, Py_ssize_t offset) /*[clinic end generated code: output=57fac875e0977316 input=cafd4851d473c894]*/ { + _structmodulestate *state = get_struct_state_structinst(self); assert(self->s_codes != NULL); if (offset < 0) { if (offset + self->s_size > 0) { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "not enough data to unpack %zd bytes at offset %zd", self->s_size, offset); @@ -1597,7 +1612,7 @@ Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer, } if (offset + buffer->len < 0) { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "offset %zd out of range for %zd-byte buffer", offset, buffer->len); @@ -1607,7 +1622,7 @@ Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer, } if ((buffer->len - offset) < self->s_size) { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "unpack_from requires a buffer of at least %zu bytes for " "unpacking %zd bytes at offset %zd " "(actual buffer size is %zd)", @@ -1617,7 +1632,7 @@ Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer, buffer->len); return NULL; } - return s_unpack_internal(self, (char*)buffer->buf + offset); + return s_unpack_internal(self, (char*)buffer->buf + offset, state); } @@ -1671,6 +1686,7 @@ static PyMethodDef unpackiter_methods[] = { static PyObject * unpackiter_iternext(unpackiterobject *self) { + _structmodulestate *state = get_struct_state_iterinst(self); PyObject *result; if (self->so == NULL) return NULL; @@ -1682,7 +1698,8 @@ unpackiter_iternext(unpackiterobject *self) } assert(self->index + self->so->s_size <= self->buf.len); result = s_unpack_internal(self->so, - (char*) self->buf.buf + self->index); + (char*) self->buf.buf + self->index, + state); self->index += self->so->s_size; return result; } @@ -1729,17 +1746,18 @@ static PyObject * Struct_iter_unpack(PyStructObject *self, PyObject *buffer) /*[clinic end generated code: output=172d83d0cd15dbab input=6d65b3f3107dbc99]*/ { + _structmodulestate *state = get_struct_state_structinst(self); unpackiterobject *iter; assert(self->s_codes != NULL); if (self->s_size == 0) { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "cannot iteratively unpack with a struct of length 0"); return NULL; } - iter = (unpackiterobject *) PyType_GenericAlloc((PyTypeObject *)_structmodulestate_global->unpackiter_type, 0); + iter = (unpackiterobject *) PyType_GenericAlloc((PyTypeObject *)state->unpackiter_type, 0); if (iter == NULL) return NULL; @@ -1748,7 +1766,7 @@ Struct_iter_unpack(PyStructObject *self, PyObject *buffer) return NULL; } if (iter->buf.len % self->s_size != 0) { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "iterative unpacking requires a buffer of " "a multiple of %zd bytes", self->s_size); @@ -1773,7 +1791,8 @@ Struct_iter_unpack(PyStructObject *self, PyObject *buffer) * */ static int -s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, char* buf) +s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, + char* buf, _structmodulestate *state) { formatcode *code; /* XXX(nnorwitz): why does i need to be a local? can we use @@ -1794,7 +1813,7 @@ s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, char* const void *p; isstring = PyBytes_Check(v); if (!isstring && !PyByteArray_Check(v)) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "argument for 's' must be a bytes object"); return -1; } @@ -1816,7 +1835,7 @@ s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, char* const void *p; isstring = PyBytes_Check(v); if (!isstring && !PyByteArray_Check(v)) { - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "argument for 'p' must be a bytes object"); return -1; } @@ -1836,9 +1855,9 @@ s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, char* n = 255; *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char); } else { - if (e->pack(res, v, e) < 0) { + if (e->pack(state, res, v, e) < 0) { if (PyLong_Check(v) && PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(_structmodulestate_global->StructError, + PyErr_SetString(state->StructError, "int too large to convert"); return -1; } @@ -1864,14 +1883,15 @@ s_pack(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { char *buf; PyStructObject *soself; + _structmodulestate *state = get_struct_state_structinst(self); /* Validate arguments. */ soself = (PyStructObject *)self; - assert(PyStruct_Check(self)); + assert(PyStruct_Check(self, state)); assert(soself->s_codes != NULL); if (nargs != soself->s_len) { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "pack expected %zd items for packing (got %zd)", soself->s_len, nargs); return NULL; } @@ -1886,7 +1906,7 @@ s_pack(PyObject *self, PyObject *const *args, Py_ssize_t nargs) } /* Call the guts */ - if ( s_pack_internal(soself, args, 0, buf) != 0 ) { + if ( s_pack_internal(soself, args, 0, buf, state) != 0 ) { _PyBytesWriter_Dealloc(&writer); return NULL; } @@ -1908,23 +1928,24 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) PyStructObject *soself; Py_buffer buffer; Py_ssize_t offset; + _structmodulestate *state = get_struct_state_structinst(self); /* Validate arguments. +1 is for the first arg as buffer. */ soself = (PyStructObject *)self; - assert(PyStruct_Check(self)); + assert(PyStruct_Check(self, state)); assert(soself->s_codes != NULL); if (nargs != (soself->s_len + 2)) { if (nargs == 0) { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "pack_into expected buffer argument"); } else if (nargs == 1) { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "pack_into expected offset argument"); } else { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "pack_into expected %zd items for packing (got %zd)", soself->s_len, (nargs - 2)); } @@ -1947,7 +1968,7 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) if (offset < 0) { /* Check that negative offset is low enough to fit data */ if (offset + soself->s_size > 0) { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "no space to pack %zd bytes at offset %zd", soself->s_size, offset); @@ -1957,7 +1978,7 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) /* Check that negative offset is not crossing buffer boundary */ if (offset + buffer.len < 0) { - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "offset %zd out of range for %zd-byte buffer", offset, buffer.len); @@ -1973,7 +1994,7 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) assert(offset >= 0); assert(soself->s_size >= 0); - PyErr_Format(_structmodulestate_global->StructError, + PyErr_Format(state->StructError, "pack_into requires a buffer of at least %zu bytes for " "packing %zd bytes at offset %zd " "(actual buffer size is %zd)", @@ -1986,7 +2007,7 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) } /* Call the guts */ - if (s_pack_internal(soself, args, 2, (char*)buffer.buf + offset) != 0) { + if (s_pack_internal(soself, args, 2, (char*)buffer.buf + offset, state) != 0) { PyBuffer_Release(&buffer); return NULL; } @@ -2080,12 +2101,12 @@ static PyType_Spec PyStructType_spec = { /* ---- Standalone functions ---- */ #define MAXCACHE 100 -static PyObject *cache = NULL; static int -cache_struct_converter(PyObject *fmt, PyStructObject **ptr) +cache_struct_converter(PyObject *module, PyObject *fmt, PyStructObject **ptr) { PyObject * s_object; + _structmodulestate *state = get_struct_state(module); if (fmt == NULL) { Py_DECREF(*ptr); @@ -2093,13 +2114,13 @@ cache_struct_converter(PyObject *fmt, PyStructObject **ptr) return 1; } - if (cache == NULL) { - cache = PyDict_New(); - if (cache == NULL) + if (state->cache == NULL) { + state->cache = PyDict_New(); + if (state->cache == NULL) return 0; } - s_object = PyDict_GetItemWithError(cache, fmt); + s_object = PyDict_GetItemWithError(state->cache, fmt); if (s_object != NULL) { Py_INCREF(s_object); *ptr = (PyStructObject *)s_object; @@ -2109,12 +2130,12 @@ cache_struct_converter(PyObject *fmt, PyStructObject **ptr) return 0; } - s_object = PyObject_CallOneArg(_structmodulestate_global->PyStructType, fmt); + s_object = PyObject_CallOneArg(state->PyStructType, fmt); if (s_object != NULL) { - if (PyDict_GET_SIZE(cache) >= MAXCACHE) - PyDict_Clear(cache); + if (PyDict_GET_SIZE(state->cache) >= MAXCACHE) + PyDict_Clear(state->cache); /* Attempt to cache the result */ - if (PyDict_SetItem(cache, fmt, s_object) == -1) + if (PyDict_SetItem(state->cache, fmt, s_object) == -1) PyErr_Clear(); *ptr = (PyStructObject *)s_object; return Py_CLEANUP_SUPPORTED; @@ -2132,7 +2153,7 @@ static PyObject * _clearcache_impl(PyObject *module) /*[clinic end generated code: output=ce4fb8a7bf7cb523 input=463eaae04bab3211]*/ { - Py_CLEAR(cache); + Py_CLEAR(get_struct_state(module)->cache); Py_RETURN_NONE; } @@ -2160,7 +2181,7 @@ Return a bytes object containing the values v1, v2, ... packed according\n\ to the format string. See help(struct) for more on format strings."); static PyObject * -pack(PyObject *self, PyObject *const *args, Py_ssize_t nargs) +pack(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *s_object = NULL; PyObject *format, *result; @@ -2171,7 +2192,7 @@ pack(PyObject *self, PyObject *const *args, Py_ssize_t nargs) } format = args[0]; - if (!cache_struct_converter(format, (PyStructObject **)&s_object)) { + if (!cache_struct_converter(module, format, (PyStructObject **)&s_object)) { return NULL; } result = s_pack(s_object, args + 1, nargs - 1); @@ -2188,7 +2209,7 @@ that the offset is a required argument. See help(struct) for more\n\ on format strings."); static PyObject * -pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) +pack_into(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *s_object = NULL; PyObject *format, *result; @@ -2199,7 +2220,7 @@ pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) } format = args[0]; - if (!cache_struct_converter(format, (PyStructObject **)&s_object)) { + if (!cache_struct_converter(module, format, (PyStructObject **)&s_object)) { return NULL; } result = s_pack_into(s_object, args + 1, nargs - 1); @@ -2322,8 +2343,9 @@ The variable struct.error is an exception raised on errors.\n"); static int _structmodule_traverse(PyObject *module, visitproc visit, void *arg) { - _structmodulestate *state = (_structmodulestate *)PyModule_GetState(module); + _structmodulestate *state = get_struct_state(module); if (state) { + Py_VISIT(state->cache); Py_VISIT(state->PyStructType); Py_VISIT(state->unpackiter_type); Py_VISIT(state->StructError); @@ -2334,8 +2356,9 @@ _structmodule_traverse(PyObject *module, visitproc visit, void *arg) static int _structmodule_clear(PyObject *module) { - _structmodulestate *state = (_structmodulestate *)PyModule_GetState(module); + _structmodulestate *state = get_struct_state(module); if (state) { + Py_CLEAR(state->cache); Py_CLEAR(state->PyStructType); Py_CLEAR(state->unpackiter_type); Py_CLEAR(state->StructError); @@ -2349,40 +2372,25 @@ _structmodule_free(void *module) _structmodule_clear((PyObject *)module); } -static struct PyModuleDef _structmodule = { - PyModuleDef_HEAD_INIT, - "_struct", - module_doc, - sizeof(_structmodulestate), - module_functions, - NULL, - _structmodule_traverse, - _structmodule_clear, - _structmodule_free, -}; - -PyMODINIT_FUNC -PyInit__struct(void) +static int +_structmodule_exec(PyObject *m) { - PyObject *m; + _structmodulestate *state = get_struct_state(m); - m = PyModule_Create(&_structmodule); - if (m == NULL) - return NULL; - - PyObject *PyStructType = PyType_FromSpec(&PyStructType_spec); - if (PyStructType == NULL) { - return NULL; + state->PyStructType = PyType_FromModuleAndSpec( + m, &PyStructType_spec, NULL); + if (state->PyStructType == NULL) { + return -1; + } + if (PyModule_AddType(m, (PyTypeObject *)state->PyStructType) < 0) { + return -1; } - Py_INCREF(PyStructType); - PyModule_AddObject(m, "Struct", PyStructType); - get_struct_state(m)->PyStructType = PyStructType; - PyObject *unpackiter_type = PyType_FromSpec(&unpackiter_type_spec); - if (unpackiter_type == NULL) { - return NULL; + state->unpackiter_type = PyType_FromModuleAndSpec( + m, &unpackiter_type_spec, NULL); + if (state->unpackiter_type == NULL) { + return -1; } - get_struct_state(m)->unpackiter_type = unpackiter_type; /* Check endian and swap in faster functions */ { @@ -2427,12 +2435,36 @@ PyInit__struct(void) } /* Add some symbolic constants to the module */ - PyObject *StructError = PyErr_NewException("struct.error", NULL, NULL); - if (StructError == NULL) - return NULL; - Py_INCREF(StructError); - PyModule_AddObject(m, "error", StructError); - get_struct_state(m)->StructError = StructError; + state->StructError = PyErr_NewException("struct.error", NULL, NULL); + if (state->StructError == NULL) { + return -1; + } + if (PyModule_AddObjectRef(m, "error", state->StructError) < 0) { + return -1; + } + + return 0; +} - return m; +static PyModuleDef_Slot _structmodule_slots[] = { + {Py_mod_exec, _structmodule_exec}, + {0, NULL} +}; + +static struct PyModuleDef _structmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_struct", + .m_doc = module_doc, + .m_size = sizeof(_structmodulestate), + .m_methods = module_functions, + .m_slots = _structmodule_slots, + .m_traverse = _structmodule_traverse, + .m_clear = _structmodule_clear, + .m_free = _structmodule_free, +}; + +PyMODINIT_FUNC +PyInit__struct(void) +{ + return PyModuleDef_Init(&_structmodule); } diff --git a/Modules/clinic/_struct.c.h b/Modules/clinic/_struct.c.h index 1cfaef3b7131e9..b0c1eb4587ae23 100644 --- a/Modules/clinic/_struct.c.h +++ b/Modules/clinic/_struct.c.h @@ -199,7 +199,7 @@ calcsize(PyObject *module, PyObject *arg) PyStructObject *s_object = NULL; Py_ssize_t _return_value; - if (!cache_struct_converter(arg, &s_object)) { + if (!cache_struct_converter(module, arg, &s_object)) { goto exit; } _return_value = calcsize_impl(module, s_object); @@ -241,7 +241,7 @@ unpack(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("unpack", nargs, 2, 2)) { goto exit; } - if (!cache_struct_converter(args[0], &s_object)) { + if (!cache_struct_converter(module, args[0], &s_object)) { goto exit; } if (PyObject_GetBuffer(args[1], &buffer, PyBUF_SIMPLE) != 0) { @@ -297,7 +297,7 @@ unpack_from(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject if (!args) { goto exit; } - if (!cache_struct_converter(args[0], &s_object)) { + if (!cache_struct_converter(module, args[0], &s_object)) { goto exit; } if (PyObject_GetBuffer(args[1], &buffer, PyBUF_SIMPLE) != 0) { @@ -364,7 +364,7 @@ iter_unpack(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("iter_unpack", nargs, 2, 2)) { goto exit; } - if (!cache_struct_converter(args[0], &s_object)) { + if (!cache_struct_converter(module, args[0], &s_object)) { goto exit; } buffer = args[1]; @@ -376,4 +376,4 @@ iter_unpack(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return return_value; } -/*[clinic end generated code: output=8089792d8ed0c1be input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a3d3cd900091cb1c input=a9049054013a1b77]*/ From 50e518466a29c06e15e219e1e18639ee2a02fdd1 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 19 Nov 2020 15:08:34 +0100 Subject: [PATCH 0594/1261] bpo-1635741: Port gc module to multiphase initialization (GH-23377) Signed-off-by: Christian Heimes Automerge-Triggered-By: GH:tiran --- ...2020-11-18-20-33-35.bpo-1635741.B4ztSk.rst | 1 + Modules/gcmodule.c | 86 +++++++++---------- 2 files changed, 42 insertions(+), 45 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-18-20-33-35.bpo-1635741.B4ztSk.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-18-20-33-35.bpo-1635741.B4ztSk.rst b/Misc/NEWS.d/next/C API/2020-11-18-20-33-35.bpo-1635741.B4ztSk.rst new file mode 100644 index 00000000000000..bce80c86de5019 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-18-20-33-35.bpo-1635741.B4ztSk.rst @@ -0,0 +1 @@ +Port :mod:`gc` extension module to multiphase initialization (:pep:`489`) diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index e6ad0f2dd42227..45201435f24605 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -165,12 +165,17 @@ PyStatus _PyGC_Init(PyThreadState *tstate) { GCState *gcstate = &tstate->interp->gc; + + gcstate->garbage = PyList_New(0); if (gcstate->garbage == NULL) { - gcstate->garbage = PyList_New(0); - if (gcstate->garbage == NULL) { - return _PyStatus_NO_MEMORY(); - } + return _PyStatus_NO_MEMORY(); + } + + gcstate->callbacks = PyList_New(0); + if (gcstate->callbacks == NULL) { + return _PyStatus_NO_MEMORY(); } + return _PyStatus_OK(); } @@ -1992,59 +1997,50 @@ static PyMethodDef GcMethods[] = { {NULL, NULL} /* Sentinel */ }; -static struct PyModuleDef gcmodule = { - PyModuleDef_HEAD_INIT, - "gc", /* m_name */ - gc__doc__, /* m_doc */ - -1, /* m_size */ - GcMethods, /* m_methods */ - NULL, /* m_reload */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; - -PyMODINIT_FUNC -PyInit_gc(void) +static int +gcmodule_exec(PyObject *module) { GCState *gcstate = get_gc_state(); - PyObject *m = PyModule_Create(&gcmodule); - - if (m == NULL) { - return NULL; - } - - if (gcstate->garbage == NULL) { - gcstate->garbage = PyList_New(0); - if (gcstate->garbage == NULL) { - return NULL; - } - } - Py_INCREF(gcstate->garbage); - if (PyModule_AddObject(m, "garbage", gcstate->garbage) < 0) { - return NULL; - } - - if (gcstate->callbacks == NULL) { - gcstate->callbacks = PyList_New(0); - if (gcstate->callbacks == NULL) { - return NULL; - } + /* garbage and callbacks are initialized by _PyGC_Init() early in + * interpreter lifecycle. */ + assert(gcstate->garbage != NULL); + if (PyModule_AddObjectRef(module, "garbage", gcstate->garbage) < 0) { + return -1; } - Py_INCREF(gcstate->callbacks); - if (PyModule_AddObject(m, "callbacks", gcstate->callbacks) < 0) { - return NULL; + assert(gcstate->callbacks != NULL); + if (PyModule_AddObjectRef(module, "callbacks", gcstate->callbacks) < 0) { + return -1; } -#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) { return NULL; } +#define ADD_INT(NAME) if (PyModule_AddIntConstant(module, #NAME, NAME) < 0) { return -1; } ADD_INT(DEBUG_STATS); ADD_INT(DEBUG_COLLECTABLE); ADD_INT(DEBUG_UNCOLLECTABLE); ADD_INT(DEBUG_SAVEALL); ADD_INT(DEBUG_LEAK); #undef ADD_INT - return m; + return 0; +} + +static PyModuleDef_Slot gcmodule_slots[] = { + {Py_mod_exec, gcmodule_exec}, + {0, NULL} +}; + +static struct PyModuleDef gcmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "gc", + .m_doc = gc__doc__, + .m_size = 0, // per interpreter state, see: get_gc_state() + .m_methods = GcMethods, + .m_slots = gcmodule_slots +}; + +PyMODINIT_FUNC +PyInit_gc(void) +{ + return PyModuleDef_Init(&gcmodule); } /* Public API to invoke gc.collect() from C */ From dfd7d1ce496330bd663e263cf99a40a2c6bc2362 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 19 Nov 2020 23:14:34 +0900 Subject: [PATCH 0595/1261] bpo-1635741: Fix _struct for build bot error (GH-23402) Automerge-Triggered-By: GH:tiran --- Modules/_struct.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_struct.c b/Modules/_struct.c index 8dfcd882a444b9..eeccc17965468c 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -728,7 +728,7 @@ np_halffloat(_structmodulestate *state, char *p, PyObject *v, const formatdef *f #if PY_LITTLE_ENDIAN return pack_halffloat(state, p, v, 1); #else - return pack_halffloat(statem p, v, 0); + return pack_halffloat(state, p, v, 0); #endif } From ab274e3a53e2379002703287e2077a4203f4ac6b Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 19 Nov 2020 16:20:42 +0100 Subject: [PATCH 0596/1261] bpo-1635741: Port _posixshmem extension module to multiphase initialization (GH-23404) Signed-off-by: Christian Heimes --- ...2020-11-19-15-33-42.bpo-1635741.9tVsZt.rst | 1 + Modules/_multiprocessing/posixshmem.c | 22 ++++++++----------- 2 files changed, 10 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-19-15-33-42.bpo-1635741.9tVsZt.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-19-15-33-42.bpo-1635741.9tVsZt.rst b/Misc/NEWS.d/next/C API/2020-11-19-15-33-42.bpo-1635741.9tVsZt.rst new file mode 100644 index 00000000000000..201b7aed56cc5d --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-19-15-33-42.bpo-1635741.9tVsZt.rst @@ -0,0 +1 @@ +Port _posixshmem extension module to multiphase initialization (:pep:`489`) diff --git a/Modules/_multiprocessing/posixshmem.c b/Modules/_multiprocessing/posixshmem.c index 436ac6d6b39f49..d64ded4168228f 100644 --- a/Modules/_multiprocessing/posixshmem.c +++ b/Modules/_multiprocessing/posixshmem.c @@ -110,21 +110,17 @@ static PyMethodDef module_methods[ ] = { }; -static struct PyModuleDef this_module = { - PyModuleDef_HEAD_INIT, // m_base - "_posixshmem", // m_name - "POSIX shared memory module", // m_doc - -1, // m_size (space allocated for module globals) - module_methods, // m_methods +static struct PyModuleDef _posixshmemmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_posixshmem", + .m_doc = "POSIX shared memory module", + .m_size = 0, + .m_methods = module_methods, }; /* Module init function */ PyMODINIT_FUNC -PyInit__posixshmem(void) { - PyObject *module; - module = PyModule_Create(&this_module); - if (!module) { - return NULL; - } - return module; +PyInit__posixshmem(void) +{ + return PyModuleDef_Init(&_posixshmemmodule); } From d19e1a1e303283fa3d15977b220f2695386d04c2 Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Thu, 19 Nov 2020 18:17:38 +0200 Subject: [PATCH 0597/1261] bpo-42345: Fix hash implementation of typing.Literal (GH-23383) Fix hash implementation of `typing.Literal`. Update docs regarding `typing.Litaral` caching. Base implementation was done in PR #23294. --- Doc/library/typing.rst | 6 +++--- Lib/test/test_typing.py | 5 +++++ Lib/typing.py | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index a8de984a5ce41b..5b66e3c2c5b639 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1706,9 +1706,9 @@ Introspection helpers For a typing object of the form ``X[Y, Z, ...]`` these functions return ``X`` and ``(Y, Z, ...)``. If ``X`` is a generic alias for a builtin or :mod:`collections` class, it gets normalized to the original class. - If ``X`` is a :class:`Union` contained in another generic type, - the order of ``(Y, Z, ...)`` may be different from the order of - the original arguments ``[Y, Z, ...]`` due to type caching. + If ``X`` is a :class:`Union` or :class:`Literal` contained in another + generic type, the order of ``(Y, Z, ...)`` may be different from the order + of the original arguments ``[Y, Z, ...]`` due to type caching. For unsupported objects return ``None`` and ``()`` correspondingly. Examples:: diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 7deba0d71b7c4f..8ffc7f40cebdd2 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -569,6 +569,11 @@ def test_equal(self): self.assertEqual(Literal[1, 2], Literal[2, 1]) self.assertEqual(Literal[1, 2, 3], Literal[1, 2, 3, 3]) + def test_hash(self): + self.assertEqual(hash(Literal[1]), hash(Literal[1])) + self.assertEqual(hash(Literal[1, 2]), hash(Literal[2, 1])) + self.assertEqual(hash(Literal[1, 2, 3]), hash(Literal[1, 2, 3, 3])) + def test_args(self): self.assertEqual(Literal[1, 2, 3].__args__, (1, 2, 3)) self.assertEqual(Literal[1, 2, 3, 3].__args__, (1, 2, 3)) diff --git a/Lib/typing.py b/Lib/typing.py index d310b3dd5820dc..46c54c406992f7 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -981,7 +981,7 @@ def __eq__(self, other): return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__)) def __hash__(self): - return hash(tuple(_value_and_type_iter(self.__args__))) + return hash(frozenset(_value_and_type_iter(self.__args__))) class Generic: From 6729be5c72af12c7c79fde5b1ffb68364d0993aa Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 20 Nov 2020 00:37:26 +0700 Subject: [PATCH 0598/1261] bpo-42345: Add whatsnew and versionchanged for typing.Literal in 3.9 (GH-23386) * Whatsnew entry in 3.9 same as the one in 3.10. * versionchanged for typing.Literal docs Needs backport to 3.9. --- Doc/library/typing.rst | 6 ++++++ Doc/whatsnew/3.9.rst | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 5b66e3c2c5b639..67fd55e7b8a24f 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -674,6 +674,12 @@ These can be used as types in annotations using ``[]``, each having a unique syn .. versionadded:: 3.8 + .. versionchanged:: 3.9.1 + ``Literal`` now de-duplicates parameters. Equality comparison of + ``Literal`` objects are no longer order dependent. ``Literal`` objects + will now raise a :exc:`TypeError` exception during equality comparisons + if one of their parameters are not :term:`immutable`. + .. data:: ClassVar Special type construct to mark class variables. diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index a601b16f1c6059..b89faf101d0435 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -1454,3 +1454,32 @@ Removed ``PyNullImporter_Type``, ``PyCmpWrapper_Type``, ``PySortWrapper_Type``, ``PyNoArgsFunction``. (Contributed by Pablo Galindo Salgado in :issue:`39372`.) + +Notable changes in Python 3.9.1 +=============================== + +typing +------ + +The behavior of :class:`typing.Literal` was changed to conform with :pep:`586` +and to match the behavior of static type checkers specified in the PEP. + +1. ``Literal`` now de-duplicates parameters. +2. Equality comparisons between ``Literal`` objects are now order independent. +3. ``Literal`` comparisons now respect types. For example, + ``Literal[0] == Literal[False]`` previously evaluated to ``True``. It is + now ``False``. To support this change, the internally used type cache now + supports differentiating types. +4. ``Literal`` objects will now raise a :exc:`TypeError` exception during + equality comparisons if one of their parameters are not :term:`immutable`. + Note that declaring ``Literal`` with mutable parameters will not throw + an error:: + + >>> from typing import Literal + >>> Literal[{0}] + >>> Literal[{0}] == Literal[{False}] + Traceback (most recent call last): + File "", line 1, in + TypeError: unhashable type: 'set' + +(Contributed by Yurii Karabas in :issue:`42345`.) \ No newline at end of file From 0c4f840fb56e69c105207c651046fc493431af02 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Fri, 20 Nov 2020 01:59:11 -0500 Subject: [PATCH 0599/1261] bpo-42416: Use inspect.getdoc for IDLE calltips (GH-23416) Inspect.getdoc(ob) sometimes gets docstrings when ob.__doc__ is None. --- Lib/idlelib/NEWS.txt | 3 +++ Lib/idlelib/calltip.py | 6 ++---- Lib/idlelib/idle_test/test_calltip.py | 9 +++++++-- .../next/IDLE/2020-11-20-01-30-27.bpo-42415.CyD-va.rst | 1 + 4 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-11-20-01-30-27.bpo-42415.CyD-va.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 3ece623b3aa187..c9f28f62a1a5d1 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2021-10-04? ====================================== +bpo-42416: Get docstrings for IDLE calltips more often +by using inspect.getdoc. + bpo-33987: Mostly finish using ttk widgets, mainly for editor, settings, and searches. Some patches by Mark Roseman. diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index 549e224015cccb..40bc5a0ad798fe 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -165,6 +165,7 @@ def get_argspec(ob): ob_call = ob.__call__ except BaseException: # Buggy user object could raise anything. return '' # No popup for non-callables. + # For Get_argspecTest.test_buggy_getattr_class, CallA() & CallB(). fob = ob_call if isinstance(ob_call, types.MethodType) else ob # Initialize argspec and wrap it to get lines. @@ -185,10 +186,7 @@ def get_argspec(ob): if len(argspec) > _MAX_COLS else [argspec] if argspec else []) # Augment lines from docstring, if any, and join to get argspec. - if isinstance(ob_call, types.MethodType): - doc = ob_call.__doc__ - else: - doc = getattr(ob, "__doc__", "") + doc = inspect.getdoc(ob) if doc: for line in doc.split('\n', _MAX_LINES)[:_MAX_LINES]: line = line.strip() diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index 489b6899baf424..a76829f3656c80 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -99,7 +99,12 @@ def test_signature_wrap(self): (width=70, initial_indent='', subsequent_indent='', expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, *, max_lines=None, - placeholder=' [...]')''') + placeholder=' [...]') +Object for wrapping/filling text. The public interface consists of +the wrap() and fill() methods; the other methods are just there for +subclasses to override in order to tweak the default behaviour. +If you want to completely replace the main wrapping algorithm, +you\'ll probably have to override _wrap_chunks().''') def test_properly_formated(self): @@ -241,7 +246,7 @@ class Type(type): # Type() requires 3 type args, returns class. __class__ = property({}.__getitem__, {}.__setitem__) class Object(metaclass=Type): __slots__ = '__class__' - for meth, mtip in ((Type, default_tip), (Object, default_tip), + for meth, mtip in ((Type, get_spec(type)), (Object, default_tip), (Object(), '')): with self.subTest(meth=meth, mtip=mtip): self.assertEqual(get_spec(meth), mtip) diff --git a/Misc/NEWS.d/next/IDLE/2020-11-20-01-30-27.bpo-42415.CyD-va.rst b/Misc/NEWS.d/next/IDLE/2020-11-20-01-30-27.bpo-42415.CyD-va.rst new file mode 100644 index 00000000000000..b61032c1e48e2a --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-11-20-01-30-27.bpo-42415.CyD-va.rst @@ -0,0 +1 @@ +Get docstrings for IDLE calltips more often by using inspect.getdoc. From 3afa607e5a0666f87d5eb37158620d973f91c987 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Fri, 20 Nov 2020 09:26:07 +0100 Subject: [PATCH 0600/1261] bpo-42413: socket.timeout is now an alias of TimeoutError (GH-23413) Signed-off-by: Christian Heimes --- Doc/library/smtplib.rst | 2 +- Doc/library/socket.rst | 7 +++- Doc/whatsnew/3.10.rst | 6 ++++ Lib/http/server.py | 2 +- Lib/idlelib/pyshell.py | 4 +-- Lib/socket.py | 2 +- Lib/test/support/socket_helper.py | 2 +- Lib/test/test_asyncio/functional.py | 2 +- Lib/test/test_asyncore.py | 2 +- Lib/test/test_exception_hierarchy.py | 4 +-- Lib/test/test_ftplib.py | 2 +- Lib/test/test_imaplib.py | 2 +- Lib/test/test_poplib.py | 2 +- Lib/test/test_signal.py | 2 +- Lib/test/test_smtplib.py | 4 +-- Lib/test/test_socket.py | 36 ++++++++++--------- Lib/test/test_ssl.py | 6 ++-- Lib/test/test_telnetlib.py | 2 +- Lib/test/test_timeout.py | 8 ++--- Lib/test/test_urllib2net.py | 2 +- Lib/test/test_xmlrpc.py | 4 +-- .../2020-11-19-20-27-51.bpo-42413.fjHrHx.rst | 1 + Modules/_ssl.c | 12 +++---- Modules/socketmodule.c | 18 ++++------ 24 files changed, 72 insertions(+), 62 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-19-20-27-51.bpo-42413.fjHrHx.rst diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index 8f5ca0ac300223..52220f7a7f30ac 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -32,7 +32,7 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). than a success code, an :exc:`SMTPConnectError` is raised. The optional *timeout* parameter specifies a timeout in seconds for blocking operations like the connection attempt (if not specified, the global default timeout - setting will be used). If the timeout expires, :exc:`socket.timeout` is + setting will be used). If the timeout expires, :exc:`TimeoutError` is raised. The optional source_address parameter allows binding to some specific source address in a machine with multiple network interfaces, and/or to some specific source TCP port. It takes a 2-tuple diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index faf8a76251420e..d52b84f610ed67 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -283,6 +283,8 @@ Exceptions .. exception:: timeout + A deprecated alias of :exc:`TimeoutError`. + A subclass of :exc:`OSError`, this exception is raised when a timeout occurs on a socket which has had timeouts enabled via a prior call to :meth:`~socket.settimeout` (or implicitly through @@ -292,6 +294,9 @@ Exceptions .. versionchanged:: 3.3 This class was made a subclass of :exc:`OSError`. + .. versionchanged:: 3.10 + This class was made an alias of :exc:`TimeoutError`. + Constants ^^^^^^^^^ @@ -1208,7 +1213,7 @@ to sockets. address family --- see above.) If the connection is interrupted by a signal, the method waits until the - connection completes, or raise a :exc:`socket.timeout` on timeout, if the + connection completes, or raise a :exc:`TimeoutError` on timeout, if the signal handler doesn't raise an exception and the socket is blocking or has a timeout. For non-blocking sockets, the method raises an :exc:`InterruptedError` exception if the connection is interrupted by a diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index ad0ec4def0b70b..826d12704a1c9e 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -263,6 +263,12 @@ site When a module does not define ``__loader__``, fall back to ``__spec__.loader``. (Contributed by Brett Cannon in :issue:`42133`.) +socket +------ + +The exception :exc:`socket.timeout` is now an alias of :exc:`TimeoutError`. +(Contributed by Christian Heimes in :issue:`42413`.) + sys --- diff --git a/Lib/http/server.py b/Lib/http/server.py index fa204fbc15e3d7..ee991821099135 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -414,7 +414,7 @@ def handle_one_request(self): method = getattr(self, mname) method() self.wfile.flush() #actually send the response if not already done. - except socket.timeout as e: + except TimeoutError as e: #a read or a write timed out. Discard this connection self.log_error("Request timed out: %r", e) self.close_connection = True diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index b69916dbe876ca..343d2ef32d7a76 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -463,7 +463,7 @@ def start_subprocess(self): self.rpcclt.listening_sock.settimeout(10) try: self.rpcclt.accept() - except socket.timeout: + except TimeoutError: self.display_no_subprocess_error() return None self.rpcclt.register("console", self.tkconsole) @@ -498,7 +498,7 @@ def restart_subprocess(self, with_cwd=False, filename=''): self.spawn_subprocess() try: self.rpcclt.accept() - except socket.timeout: + except TimeoutError: self.display_no_subprocess_error() return None self.transfer_path(with_cwd=with_cwd) diff --git a/Lib/socket.py b/Lib/socket.py index cafa573a30c052..54a380787601ea 100755 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -377,7 +377,7 @@ def _sendfile_use_sendfile(self, file, offset=0, count=None): try: while True: if timeout and not selector_select(timeout): - raise _socket.timeout('timed out') + raise TimeoutError('timed out') if count: blocksize = count - total_sent if blocksize <= 0: diff --git a/Lib/test/support/socket_helper.py b/Lib/test/support/socket_helper.py index 7070c12c253f6d..e78712b74b1377 100644 --- a/Lib/test/support/socket_helper.py +++ b/Lib/test/support/socket_helper.py @@ -225,7 +225,7 @@ def transient_internet(resource_name, *, timeout=_NOT_SET, errnos=()): def filter_error(err): n = getattr(err, 'errno', None) - if (isinstance(err, socket.timeout) or + if (isinstance(err, TimeoutError) or (isinstance(err, socket.gaierror) and n in gai_errnos) or (isinstance(err, urllib.error.HTTPError) and 500 <= err.code <= 599) or diff --git a/Lib/test/test_asyncio/functional.py b/Lib/test/test_asyncio/functional.py index 5cd0659387d843..74490a869de9d9 100644 --- a/Lib/test/test_asyncio/functional.py +++ b/Lib/test/test_asyncio/functional.py @@ -248,7 +248,7 @@ def _run(self): conn, addr = self._sock.accept() except BlockingIOError: continue - except socket.timeout: + except TimeoutError: if not self._active: return else: diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py index 06c6bc2e99dc02..3bd904d1774bc3 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -69,7 +69,7 @@ def capture_server(evt, buf, serv): try: serv.listen() conn, addr = serv.accept() - except socket.timeout: + except TimeoutError: pass else: n = 200 diff --git a/Lib/test/test_exception_hierarchy.py b/Lib/test/test_exception_hierarchy.py index 43b4af84039c0c..89fe9ddcefba3e 100644 --- a/Lib/test/test_exception_hierarchy.py +++ b/Lib/test/test_exception_hierarchy.py @@ -40,10 +40,10 @@ def test_builtin_errors(self): self.assertIs(EnvironmentError, OSError) def test_socket_errors(self): - self.assertIs(socket.error, IOError) + self.assertIs(socket.error, OSError) self.assertIs(socket.gaierror.__base__, OSError) self.assertIs(socket.herror.__base__, OSError) - self.assertIs(socket.timeout.__base__, OSError) + self.assertIs(socket.timeout, TimeoutError) def test_select_error(self): self.assertIs(select.error, OSError) diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index 39658f22aa18c3..2424911c7ac5e9 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -1036,7 +1036,7 @@ def server(self): self.evt.set() try: conn, addr = self.sock.accept() - except socket.timeout: + except TimeoutError: pass else: conn.sendall(b"1 Hola mundo\n") diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index 96bcb09261e9e7..0cab7897a96dcb 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -476,7 +476,7 @@ def handle(self): _, server = self._setup(TimeoutHandler) addr = server.server_address[1] - with self.assertRaises(socket.timeout): + with self.assertRaises(TimeoutError): client = self.imap_class("localhost", addr, timeout=0.001) def test_with_statement(self): diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py index 2ac345ddd68a95..548868362a397f 100644 --- a/Lib/test/test_poplib.py +++ b/Lib/test/test_poplib.py @@ -501,7 +501,7 @@ def server(self, evt, serv): conn, addr = serv.accept() conn.send(b"+ Hola mundo\n") conn.close() - except socket.timeout: + except TimeoutError: pass finally: serv.close() diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index c6567906321fe1..5a8ff361f9656b 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -528,7 +528,7 @@ def handler(signum, frame): while True: write.send(chunk) written += chunk_size - except (BlockingIOError, socket.timeout): + except (BlockingIOError, TimeoutError): pass print(f"%s bytes written into the socketpair" % written, flush=True) diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py index 7816ed34886e95..91985384ec7ff9 100644 --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -40,7 +40,7 @@ def server(evt, buf, serv): evt.set() try: conn, addr = serv.accept() - except socket.timeout: + except TimeoutError: pass else: n = 500 @@ -193,7 +193,7 @@ def debugging_server(serv, serv_evt, client_evt): n -= 1 - except socket.timeout: + except TimeoutError: pass finally: if not client_evt.is_set(): diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 80638325ba3a05..5f57ab2f89d8d3 100755 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -1611,7 +1611,7 @@ def raising_handler(*args): if with_timeout: signal.signal(signal.SIGALRM, ok_handler) signal.alarm(1) - self.assertRaises(socket.timeout, c.sendall, + self.assertRaises(TimeoutError, c.sendall, b"x" * support.SOCK_MAX_SIZE) finally: signal.alarm(0) @@ -2966,7 +2966,7 @@ def _testSendmsgTimeout(self): try: while True: self.sendmsgToServer([b"a"*512]) - except socket.timeout: + except TimeoutError: pass except OSError as exc: if exc.errno != errno.ENOMEM: @@ -2974,7 +2974,7 @@ def _testSendmsgTimeout(self): # bpo-33937 the test randomly fails on Travis CI with # "OSError: [Errno 12] Cannot allocate memory" else: - self.fail("socket.timeout not raised") + self.fail("TimeoutError not raised") finally: self.misc_event.set() @@ -3109,7 +3109,7 @@ def testRecvmsgTimeout(self): # Check that timeout works. try: self.serv_sock.settimeout(0.03) - self.assertRaises(socket.timeout, + self.assertRaises(TimeoutError, self.doRecvmsg, self.serv_sock, len(MSG)) finally: self.misc_event.set() @@ -4827,7 +4827,7 @@ def testReadAfterTimeout(self): self.cli_conn.settimeout(1) self.read_file.read(3) # First read raises a timeout - self.assertRaises(socket.timeout, self.read_file.read, 1) + self.assertRaises(TimeoutError, self.read_file.read, 1) # Second read is disallowed with self.assertRaises(OSError) as ctx: self.read_file.read(1) @@ -5092,7 +5092,7 @@ class NetworkConnectionNoServer(unittest.TestCase): class MockSocket(socket.socket): def connect(self, *args): - raise socket.timeout('timed out') + raise TimeoutError('timed out') @contextlib.contextmanager def mocked_socket_module(self): @@ -5142,13 +5142,13 @@ def test_create_connection_timeout(self): with self.mocked_socket_module(): try: socket.create_connection((HOST, 1234)) - except socket.timeout: + except TimeoutError: pass except OSError as exc: if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT: raise else: - self.fail('socket.timeout not raised') + self.fail('TimeoutError not raised') class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest): @@ -5250,7 +5250,7 @@ def _testInsideTimeout(self): def _testOutsideTimeout(self): self.cli = sock = socket.create_connection((HOST, self.port), timeout=1) - self.assertRaises(socket.timeout, lambda: sock.recv(5)) + self.assertRaises(TimeoutError, lambda: sock.recv(5)) class TCPTimeoutTest(SocketTCPTest): @@ -5259,7 +5259,7 @@ def testTCPTimeout(self): def raise_timeout(*args, **kwargs): self.serv.settimeout(1.0) self.serv.accept() - self.assertRaises(socket.timeout, raise_timeout, + self.assertRaises(TimeoutError, raise_timeout, "Error generating a timeout exception (TCP)") def testTimeoutZero(self): @@ -5267,7 +5267,7 @@ def testTimeoutZero(self): try: self.serv.settimeout(0.0) foo = self.serv.accept() - except socket.timeout: + except TimeoutError: self.fail("caught timeout instead of error (TCP)") except OSError: ok = True @@ -5292,7 +5292,7 @@ def alarm_handler(signal, frame): try: signal.alarm(2) # POSIX allows alarm to be up to 1 second early foo = self.serv.accept() - except socket.timeout: + except TimeoutError: self.fail("caught timeout instead of Alarm") except Alarm: pass @@ -5316,7 +5316,7 @@ def testUDPTimeout(self): def raise_timeout(*args, **kwargs): self.serv.settimeout(1.0) self.serv.recv(1024) - self.assertRaises(socket.timeout, raise_timeout, + self.assertRaises(TimeoutError, raise_timeout, "Error generating a timeout exception (UDP)") def testTimeoutZero(self): @@ -5324,7 +5324,7 @@ def testTimeoutZero(self): try: self.serv.settimeout(0.0) foo = self.serv.recv(1024) - except socket.timeout: + except TimeoutError: self.fail("caught timeout instead of error (UDP)") except OSError: ok = True @@ -5341,7 +5341,7 @@ def testUDPLITETimeout(self): def raise_timeout(*args, **kwargs): self.serv.settimeout(1.0) self.serv.recv(1024) - self.assertRaises(socket.timeout, raise_timeout, + self.assertRaises(TimeoutError, raise_timeout, "Error generating a timeout exception (UDPLITE)") def testTimeoutZero(self): @@ -5349,7 +5349,7 @@ def testTimeoutZero(self): try: self.serv.settimeout(0.0) foo = self.serv.recv(1024) - except socket.timeout: + except TimeoutError: self.fail("caught timeout instead of error (UDPLITE)") except OSError: ok = True @@ -5365,6 +5365,8 @@ def testExceptionTree(self): self.assertTrue(issubclass(socket.herror, OSError)) self.assertTrue(issubclass(socket.gaierror, OSError)) self.assertTrue(issubclass(socket.timeout, OSError)) + self.assertIs(socket.error, OSError) + self.assertIs(socket.timeout, TimeoutError) def test_setblocking_invalidfd(self): # Regression test for issue #28471 @@ -6167,7 +6169,7 @@ def _testWithTimeoutTriggeredSend(self): with socket.create_connection(address) as sock: sock.settimeout(0.01) meth = self.meth_from_sock(sock) - self.assertRaises(socket.timeout, meth, file) + self.assertRaises(TimeoutError, meth, file) def testWithTimeoutTriggeredSend(self): conn = self.accept_conn() diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 8744e597302e40..e5cd962e84710e 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -2574,7 +2574,7 @@ def run(self): handler = self.ConnectionHandler(self, newconn, connaddr) handler.start() handler.join() - except socket.timeout: + except TimeoutError: pass except KeyboardInterrupt: self.stop() @@ -3691,7 +3691,7 @@ def serve(): c.settimeout(0.2) c.connect((host, port)) # Will attempt handshake and time out - self.assertRaisesRegex(socket.timeout, "timed out", + self.assertRaisesRegex(TimeoutError, "timed out", test_wrap_socket, c) finally: c.close() @@ -3700,7 +3700,7 @@ def serve(): c = test_wrap_socket(c) c.settimeout(0.2) # Will attempt handshake and time out - self.assertRaisesRegex(socket.timeout, "timed out", + self.assertRaisesRegex(TimeoutError, "timed out", c.connect, (host, port)) finally: c.close() diff --git a/Lib/test/test_telnetlib.py b/Lib/test/test_telnetlib.py index 7633901c96c84e..8e36051cd095ba 100644 --- a/Lib/test/test_telnetlib.py +++ b/Lib/test/test_telnetlib.py @@ -16,7 +16,7 @@ def server(evt, serv): try: conn, addr = serv.accept() conn.close() - except socket.timeout: + except TimeoutError: pass finally: serv.close() diff --git a/Lib/test/test_timeout.py b/Lib/test/test_timeout.py index ac803f5d638237..823d5c3e1767e4 100644 --- a/Lib/test/test_timeout.py +++ b/Lib/test/test_timeout.py @@ -122,7 +122,7 @@ def _sock_operation(self, count, timeout, method, *args): """ Test the specified socket method. - The method is run at most `count` times and must raise a socket.timeout + The method is run at most `count` times and must raise a TimeoutError within `timeout` + self.fuzz seconds. """ self.sock.settimeout(timeout) @@ -131,11 +131,11 @@ def _sock_operation(self, count, timeout, method, *args): t1 = time.monotonic() try: method(*args) - except socket.timeout as e: + except TimeoutError as e: delta = time.monotonic() - t1 break else: - self.fail('socket.timeout was not raised') + self.fail('TimeoutError was not raised') # These checks should account for timing unprecision self.assertLess(delta, timeout + self.fuzz) self.assertGreater(delta, timeout - 1.0) @@ -204,7 +204,7 @@ def testConnectTimeout(self): sock.settimeout(timeout) try: sock.connect((whitehole)) - except socket.timeout: + except TimeoutError: pass except OSError as err: if err.errno == errno.ECONNREFUSED: diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index c1d55ee8b29b34..4750ad9600cc3e 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -277,7 +277,7 @@ def _test_urls(self, urls, handlers, retry=True): ioerror_peer_reset: buf = f.read() debug("read %d bytes" % len(buf)) - except socket.timeout: + except TimeoutError: print("" % url, file=sys.stderr) f.close() time.sleep(0.1) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 3dfa84bf77db01..c54aeb109450db 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -648,7 +648,7 @@ def _(x, y): serv.handle_request() numrequests -= 1 - except socket.timeout: + except TimeoutError: pass finally: serv.socket.close() @@ -713,7 +713,7 @@ def _marshaled_dispatch(self, data, dispatch_method=None, path=None): serv.handle_request() numrequests -= 1 - except socket.timeout: + except TimeoutError: pass finally: serv.socket.close() diff --git a/Misc/NEWS.d/next/Library/2020-11-19-20-27-51.bpo-42413.fjHrHx.rst b/Misc/NEWS.d/next/Library/2020-11-19-20-27-51.bpo-42413.fjHrHx.rst new file mode 100644 index 00000000000000..ef1bf0fe9d3c0b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-19-20-27-51.bpo-42413.fjHrHx.rst @@ -0,0 +1 @@ +The exception :exc:`socket.timeout` is now an alias of :exc:`TimeoutError`. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 54c365b88e6951..a34313b78543c9 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -1102,7 +1102,7 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self) } if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySocketModule.timeout_error, + PyErr_SetString(PyExc_TimeoutError, ERRSTR("The handshake operation timed out")); goto error; } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { @@ -2419,7 +2419,7 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b) sockstate = PySSL_select(sock, 1, timeout); if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySocketModule.timeout_error, + PyErr_SetString(PyExc_TimeoutError, "The write operation timed out"); goto error; } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { @@ -2454,7 +2454,7 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b) } if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySocketModule.timeout_error, + PyErr_SetString(PyExc_TimeoutError, "The write operation timed out"); goto error; } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { @@ -2609,7 +2609,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1, sockstate = SOCKET_OPERATION_OK; if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySocketModule.timeout_error, + PyErr_SetString(PyExc_TimeoutError, "The read operation timed out"); goto error; } else if (sockstate == SOCKET_IS_NONBLOCKING) { @@ -2724,10 +2724,10 @@ _ssl__SSLSocket_shutdown_impl(PySSLSocket *self) if (sockstate == SOCKET_HAS_TIMED_OUT) { if (err.ssl == SSL_ERROR_WANT_READ) - PyErr_SetString(PySocketModule.timeout_error, + PyErr_SetString(PyExc_TimeoutError, "The read operation timed out"); else - PyErr_SetString(PySocketModule.timeout_error, + PyErr_SetString(PyExc_TimeoutError, "The write operation timed out"); goto error; } diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index d7738367029e85..f8e4de5825f7ad 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -514,7 +514,6 @@ remove_unusable_flags(PyObject *m) by this module (but not argument type or memory errors, etc.). */ static PyObject *socket_herror; static PyObject *socket_gaierror; -static PyObject *socket_timeout; /* A forward reference to the socket type object. The sock_type variable contains pointers to various functions, @@ -886,7 +885,7 @@ sock_call_ex(PySocketSockObject *s, if (err) *err = SOCK_TIMEOUT_ERR; else - PyErr_SetString(socket_timeout, "timed out"); + PyErr_SetString(PyExc_TimeoutError, "timed out"); return -1; } @@ -2880,7 +2879,7 @@ sock_settimeout(PySocketSockObject *s, PyObject *arg) /* Blocking mode for a Python socket object means that operations like :meth:`recv` or :meth:`sendall` will block the execution of the current thread until they are complete or aborted with a - `socket.timeout` or `socket.error` errors. When timeout is `None`, + `TimeoutError` or `socket.error` errors. When timeout is `None`, the underlying FD is in a blocking mode. When timeout is a positive number, the FD is in a non-blocking mode, and socket ops are implemented with a `select()` call. @@ -4206,7 +4205,7 @@ sock_sendall(PySocketSockObject *s, PyObject *args) } if (interval <= 0) { - PyErr_SetString(socket_timeout, "timed out"); + PyErr_SetString(PyExc_TimeoutError, "timed out"); goto done; } } @@ -7123,13 +7122,10 @@ PyInit__socket(void) return NULL; Py_INCREF(socket_gaierror); PyModule_AddObject(m, "gaierror", socket_gaierror); - socket_timeout = PyErr_NewException("socket.timeout", - PyExc_OSError, NULL); - if (socket_timeout == NULL) - return NULL; - PySocketModuleAPI.timeout_error = socket_timeout; - Py_INCREF(socket_timeout); - PyModule_AddObject(m, "timeout", socket_timeout); + + PySocketModuleAPI.timeout_error = PyExc_TimeoutError; + PyModule_AddObjectRef(m, "timeout", PyExc_TimeoutError); + Py_INCREF((PyObject *)&sock_type); if (PyModule_AddObject(m, "SocketType", (PyObject *)&sock_type) != 0) From 49203ebf1994494e3c8771c939bfc6567f4718bf Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Fri, 20 Nov 2020 09:40:12 +0100 Subject: [PATCH 0601/1261] bpo-42333: Port _ssl extension module to heap types (GH-23392) All types in _ssl module are now heap types. --- .../2020-11-12-18-21-15.bpo-42333.J9vFmV.rst | 1 + Modules/_ssl.c | 682 +++++++++--------- Modules/clinic/_ssl.c.h | 16 +- 3 files changed, 363 insertions(+), 336 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-12-18-21-15.bpo-42333.J9vFmV.rst diff --git a/Misc/NEWS.d/next/Library/2020-11-12-18-21-15.bpo-42333.J9vFmV.rst b/Misc/NEWS.d/next/Library/2020-11-12-18-21-15.bpo-42333.J9vFmV.rst new file mode 100644 index 00000000000000..f8755c7685642a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-12-18-21-15.bpo-42333.J9vFmV.rst @@ -0,0 +1 @@ +Port _ssl extension module to heap types. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index a34313b78543c9..130dce40eec71a 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -487,10 +487,10 @@ typedef struct { PySSLContext *ctx; } PySSLSession; -static PyTypeObject PySSLContext_Type; -static PyTypeObject PySSLSocket_Type; -static PyTypeObject PySSLMemoryBIO_Type; -static PyTypeObject PySSLSession_Type; +static PyTypeObject *PySSLContext_Type; +static PyTypeObject *PySSLSocket_Type; +static PyTypeObject *PySSLMemoryBIO_Type; +static PyTypeObject *PySSLSession_Type; static inline _PySSLError _PySSL_errno(int failed, const SSL *ssl, int retcode) { @@ -508,12 +508,12 @@ static inline _PySSLError _PySSL_errno(int failed, const SSL *ssl, int retcode) /*[clinic input] module _ssl -class _ssl._SSLContext "PySSLContext *" "&PySSLContext_Type" -class _ssl._SSLSocket "PySSLSocket *" "&PySSLSocket_Type" -class _ssl.MemoryBIO "PySSLMemoryBIO *" "&PySSLMemoryBIO_Type" -class _ssl.SSLSession "PySSLSession *" "&PySSLSession_Type" +class _ssl._SSLContext "PySSLContext *" "PySSLContext_Type" +class _ssl._SSLSocket "PySSLSocket *" "PySSLSocket_Type" +class _ssl.MemoryBIO "PySSLMemoryBIO *" "PySSLMemoryBIO_Type" +class _ssl.SSLSession "PySSLSession *" "PySSLSession_Type" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=bdc67fafeeaa8109]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=cc4883756da17954]*/ #include "clinic/_ssl.c.h" @@ -521,9 +521,9 @@ static int PySSL_select(PySocketSockObject *s, int writing, _PyTime_t timeout); static int PySSL_set_owner(PySSLSocket *, PyObject *, void *); static int PySSL_set_session(PySSLSocket *, PyObject *, void *); -#define PySSLSocket_Check(v) Py_IS_TYPE(v, &PySSLSocket_Type) -#define PySSLMemoryBIO_Check(v) Py_IS_TYPE(v, &PySSLMemoryBIO_Type) -#define PySSLSession_Check(v) Py_IS_TYPE(v, &PySSLSession_Type) +#define PySSLSocket_Check(v) Py_IS_TYPE(v, PySSLSocket_Type) +#define PySSLMemoryBIO_Check(v) Py_IS_TYPE(v, PySSLMemoryBIO_Type) +#define PySSLSession_Check(v) Py_IS_TYPE(v, PySSLSession_Type) typedef enum { SOCKET_IS_NONBLOCKING, @@ -587,7 +587,6 @@ SSLError_str(PyOSErrorObject *self) } static PyType_Slot sslerror_type_slots[] = { - {Py_tp_base, NULL}, /* Filled out in module init as it's not a constant */ {Py_tp_doc, (void*)SSLError_doc}, {Py_tp_str, SSLError_str}, {0, 0}, @@ -937,7 +936,7 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock, SSL_CTX *ctx = sslctx->ctx; _PySSLError err = { 0 }; - self = PyObject_New(PySSLSocket, &PySSLSocket_Type); + self = PyObject_New(PySSLSocket, PySSLSocket_Type); if (self == NULL) return NULL; @@ -2194,7 +2193,7 @@ static PySSLContext *PySSL_get_context(PySSLSocket *self, void *closure) { static int PySSL_set_context(PySSLSocket *self, PyObject *value, void *closure) { - if (PyObject_TypeCheck(value, &PySSLContext_Type)) { + if (PyObject_TypeCheck(value, PySSLContext_Type)) { #if !HAVE_SNI PyErr_SetString(PyExc_NotImplementedError, "setting a socket's " "context is not supported by your OpenSSL library"); @@ -2289,6 +2288,7 @@ PySSL_clear(PySSLSocket *self) static void PySSL_dealloc(PySSLSocket *self) { + PyTypeObject *tp = Py_TYPE(self); if (self->ssl) SSL_free(self->ssl); Py_XDECREF(self->Socket); @@ -2296,6 +2296,7 @@ PySSL_dealloc(PySSLSocket *self) Py_XDECREF(self->server_hostname); Py_XDECREF(self->owner); PyObject_Del(self); + Py_DECREF(tp); } /* If the socket has a timeout, do a select()/poll() on the socket. @@ -2895,7 +2896,7 @@ PySSL_get_session(PySSLSocket *self, void *closure) { Py_RETURN_NONE; } #endif - pysess = PyObject_GC_New(PySSLSession, &PySSLSession_Type); + pysess = PyObject_GC_New(PySSLSession, PySSLSession_Type); if (pysess == NULL) { SSL_SESSION_free(session); return NULL; @@ -3008,38 +3009,21 @@ static PyMethodDef PySSLMethods[] = { {NULL, NULL} }; -static PyTypeObject PySSLSocket_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_ssl._SSLSocket", /*tp_name*/ - sizeof(PySSLSocket), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)PySSL_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - (traverseproc) PySSL_traverse, /*tp_traverse*/ - (inquiry) PySSL_clear, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - PySSLMethods, /*tp_methods*/ - 0, /*tp_members*/ - ssl_getsetlist, /*tp_getset*/ +static PyType_Slot PySSLSocket_slots[] = { + {Py_tp_methods, PySSLMethods}, + {Py_tp_getset, ssl_getsetlist}, + {Py_tp_dealloc, PySSL_dealloc}, + {Py_tp_traverse, PySSL_traverse}, + {Py_tp_clear, PySSL_clear}, + {0, 0}, +}; + +static PyType_Spec PySSLSocket_spec = { + "_ssl._SSLSocket", + sizeof(PySSLSocket), + 0, + Py_TPFLAGS_DEFAULT, + PySSLSocket_slots, }; @@ -3316,6 +3300,7 @@ context_clear(PySSLContext *self) static void context_dealloc(PySSLContext *self) { + PyTypeObject *tp = Py_TYPE(self); /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(self); context_clear(self); @@ -3327,6 +3312,7 @@ context_dealloc(PySSLContext *self) PyMem_FREE(self->alpn_protocols); #endif Py_TYPE(self)->tp_free(self); + Py_DECREF(tp); } /*[clinic input] @@ -4366,8 +4352,8 @@ _ssl__SSLContext__wrap_socket_impl(PySSLContext *self, PyObject *sock, /*[clinic input] _ssl._SSLContext._wrap_bio - incoming: object(subclass_of="&PySSLMemoryBIO_Type", type="PySSLMemoryBIO *") - outgoing: object(subclass_of="&PySSLMemoryBIO_Type", type="PySSLMemoryBIO *") + incoming: object(subclass_of="PySSLMemoryBIO_Type", type="PySSLMemoryBIO *") + outgoing: object(subclass_of="PySSLMemoryBIO_Type", type="PySSLMemoryBIO *") server_side: int server_hostname as hostname_obj: object = None * @@ -4381,7 +4367,7 @@ _ssl__SSLContext__wrap_bio_impl(PySSLContext *self, PySSLMemoryBIO *incoming, PySSLMemoryBIO *outgoing, int server_side, PyObject *hostname_obj, PyObject *owner, PyObject *session) -/*[clinic end generated code: output=5c5d6d9b41f99332 input=8cf22f4d586ac56a]*/ +/*[clinic end generated code: output=5c5d6d9b41f99332 input=63867b8f3e1a1aa3]*/ { char *hostname = NULL; PyObject *res; @@ -4829,45 +4815,22 @@ static struct PyMethodDef context_methods[] = { {NULL, NULL} /* sentinel */ }; -static PyTypeObject PySSLContext_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_ssl._SSLContext", /*tp_name*/ - sizeof(PySSLContext), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)context_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - (traverseproc) context_traverse, /*tp_traverse*/ - (inquiry) context_clear, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - context_methods, /*tp_methods*/ - 0, /*tp_members*/ - context_getsetlist, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - _ssl__SSLContext, /*tp_new*/ +static PyType_Slot PySSLContext_slots[] = { + {Py_tp_methods, context_methods}, + {Py_tp_getset, context_getsetlist}, + {Py_tp_new, _ssl__SSLContext}, + {Py_tp_dealloc, context_dealloc}, + {Py_tp_traverse, context_traverse}, + {Py_tp_clear, context_clear}, + {0, 0}, +}; + +static PyType_Spec PySSLContext_spec = { + "_ssl._SSLContext", + sizeof(PySSLContext), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + PySSLContext_slots, }; @@ -4915,8 +4878,10 @@ _ssl_MemoryBIO_impl(PyTypeObject *type) static void memory_bio_dealloc(PySSLMemoryBIO *self) { + PyTypeObject *tp = Py_TYPE(self); BIO_free(self->bio); Py_TYPE(self)->tp_free(self); + Py_DECREF(tp); } static PyObject * @@ -5054,47 +5019,21 @@ static struct PyMethodDef memory_bio_methods[] = { {NULL, NULL} /* sentinel */ }; -static PyTypeObject PySSLMemoryBIO_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_ssl.MemoryBIO", /*tp_name*/ - sizeof(PySSLMemoryBIO), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)memory_bio_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - memory_bio_methods, /*tp_methods*/ - 0, /*tp_members*/ - memory_bio_getsetlist, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - _ssl_MemoryBIO, /*tp_new*/ +static PyType_Slot PySSLMemoryBIO_slots[] = { + {Py_tp_methods, memory_bio_methods}, + {Py_tp_getset, memory_bio_getsetlist}, + {Py_tp_new, _ssl_MemoryBIO}, + {Py_tp_dealloc, memory_bio_dealloc}, + {0, 0}, }; +static PyType_Spec PySSLMemoryBIO_spec = { + "_ssl.MemoryBIO", + sizeof(PySSLMemoryBIO), + 0, + Py_TPFLAGS_DEFAULT, + PySSLMemoryBIO_slots, +}; /* * SSL Session object @@ -5103,6 +5042,7 @@ static PyTypeObject PySSLMemoryBIO_Type = { static void PySSLSession_dealloc(PySSLSession *self) { + PyTypeObject *tp = Py_TYPE(self); /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(self); Py_XDECREF(self->ctx); @@ -5110,6 +5050,7 @@ PySSLSession_dealloc(PySSLSession *self) SSL_SESSION_free(self->session); } PyObject_GC_Del(self); + Py_DECREF(tp); } static PyObject * @@ -5251,37 +5192,21 @@ static PyGetSetDef PySSLSession_getsetlist[] = { {NULL}, /* sentinel */ }; -static PyTypeObject PySSLSession_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_ssl.Session", /*tp_name*/ - sizeof(PySSLSession), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySSLSession_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - (traverseproc)PySSLSession_traverse, /*tp_traverse*/ - (inquiry)PySSLSession_clear, /*tp_clear*/ - PySSLSession_richcompare, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - 0, /*tp_methods*/ - 0, /*tp_members*/ - PySSLSession_getsetlist, /*tp_getset*/ +static PyType_Slot PySSLSession_slots[] = { + {Py_tp_getset,PySSLSession_getsetlist}, + {Py_tp_richcompare, PySSLSession_richcompare}, + {Py_tp_dealloc, PySSLSession_dealloc}, + {Py_tp_traverse, PySSLSession_traverse}, + {Py_tp_clear, PySSLSession_clear}, + {0, 0}, +}; + +static PyType_Spec PySSLSession_spec = { + "_ssl.SSLSession", + sizeof(PySSLSession), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + PySSLSession_slots, }; @@ -5979,23 +5904,195 @@ static int _setup_ssl_threads(void) { #endif /* HAVE_OPENSSL_CRYPTO_LOCK for OpenSSL < 1.1.0 */ -PyDoc_STRVAR(module_doc, -"Implementation module for SSL socket operations. See the socket module\n\ -for documentation."); +static int +sslmodule_init_types(PyObject *module) +{ + PySSLContext_Type = (PyTypeObject *)PyType_FromModuleAndSpec( + module, &PySSLContext_spec, NULL + ); + if (PySSLContext_Type == NULL) + return -1; + PySSLSocket_Type = (PyTypeObject *)PyType_FromModuleAndSpec( + module, &PySSLSocket_spec, NULL + ); + if (PySSLSocket_Type == NULL) + return -1; -static struct PyModuleDef _sslmodule = { - PyModuleDef_HEAD_INIT, - "_ssl", - module_doc, - -1, - PySSL_methods, - NULL, - NULL, - NULL, - NULL -}; + PySSLMemoryBIO_Type = (PyTypeObject *)PyType_FromModuleAndSpec( + module, &PySSLMemoryBIO_spec, NULL + ); + if (PySSLMemoryBIO_Type == NULL) + return -1; + PySSLSession_Type = (PyTypeObject *)PyType_FromModuleAndSpec( + module, &PySSLSession_spec, NULL + ); + if (PySSLSession_Type == NULL) + return -1; + + if (PyModule_AddType(module, PySSLContext_Type)) + return -1; + if (PyModule_AddType(module, PySSLSocket_Type)) + return -1; + if (PyModule_AddType(module, PySSLMemoryBIO_Type)) + return -1; + if (PyModule_AddType(module, PySSLSession_Type)) + return -1; + + return 0; +} + +static int +sslmodule_init_exceptions(PyObject *module) +{ + PyObject *bases = NULL; + +#define add_exception(exc, name, doc, base) \ +do { \ + (exc) = PyErr_NewExceptionWithDoc("ssl." name, (doc), (base), NULL); \ + if ((exc) == NULL) goto error; \ + if (PyModule_AddObjectRef(module, name, exc) < 0) goto error; \ +} while(0) + + bases = PyTuple_Pack(1, PyExc_OSError); + if (bases == NULL) { + goto error; + } + PySSLErrorObject = PyType_FromSpecWithBases(&sslerror_type_spec, bases); + Py_CLEAR(bases); + if (PySSLErrorObject == NULL) { + goto error; + } + if (PyModule_AddObjectRef(module, "SSLError", PySSLErrorObject) < 0) { + goto error; + } + + /* ssl.CertificateError used to be a subclass of ValueError */ + bases = PyTuple_Pack(2, PySSLErrorObject, PyExc_ValueError); + if (bases == NULL) { + goto error; + } + add_exception( + PySSLCertVerificationErrorObject, + "SSLCertVerificationError", + SSLCertVerificationError_doc, + bases + ); + Py_CLEAR(bases); + + add_exception( + PySSLZeroReturnErrorObject, + "SSLZeroReturnError", + SSLZeroReturnError_doc, + PySSLErrorObject + ); + + add_exception( + PySSLWantWriteErrorObject, + "SSLWantWriteError", + SSLWantWriteError_doc, + PySSLErrorObject + ); + + add_exception( + PySSLWantReadErrorObject, + "SSLWantReadError", + SSLWantReadError_doc, + PySSLErrorObject + ); + + add_exception( + PySSLSyscallErrorObject, + "SSLSyscallError", + SSLSyscallError_doc, + PySSLErrorObject + ); + + add_exception( + PySSLEOFErrorObject, + "SSLEOFError", + SSLEOFError_doc, + PySSLErrorObject + ); +#undef add_exception + + return 0; + error: + Py_XDECREF(bases); + return -1; +} + +static int +sslmodule_init_socketapi(PyObject *module) +{ + PySocketModule_APIObject *socket_api; + + /* Load _socket module and its C API */ + socket_api = PySocketModule_ImportModuleAndAPI(); + if (socket_api == NULL) + return -1; + PySocketModule = *socket_api; + + return 0; +} + +static int +sslmodule_init_errorcodes(PyObject *module) +{ + struct py_ssl_error_code *errcode; + struct py_ssl_library_code *libcode; + + /* Mappings for error codes */ + err_codes_to_names = PyDict_New(); + if (err_codes_to_names == NULL) + return -1; + err_names_to_codes = PyDict_New(); + if (err_names_to_codes == NULL) + return -1; + lib_codes_to_names = PyDict_New(); + if (lib_codes_to_names == NULL) + return -1; + + errcode = error_codes; + while (errcode->mnemonic != NULL) { + PyObject *mnemo, *key; + mnemo = PyUnicode_FromString(errcode->mnemonic); + key = Py_BuildValue("ii", errcode->library, errcode->reason); + if (mnemo == NULL || key == NULL) + return -1; + if (PyDict_SetItem(err_codes_to_names, key, mnemo)) + return -1; + if (PyDict_SetItem(err_names_to_codes, mnemo, key)) + return -1; + Py_DECREF(key); + Py_DECREF(mnemo); + errcode++; + } + + libcode = library_codes; + while (libcode->library != NULL) { + PyObject *mnemo, *key; + key = PyLong_FromLong(libcode->code); + mnemo = PyUnicode_FromString(libcode->library); + if (key == NULL || mnemo == NULL) + return -1; + if (PyDict_SetItem(lib_codes_to_names, key, mnemo)) + return -1; + Py_DECREF(key); + Py_DECREF(mnemo); + libcode++; + } + + if (PyModule_AddObject(module, "err_codes_to_names", err_codes_to_names)) + return -1; + if (PyModule_AddObject(module, "err_names_to_codes", err_names_to_codes)) + return -1; + if (PyModule_AddObject(module, "lib_codes_to_names", lib_codes_to_names)) + return -1; + + return 0; +} static void parse_openssl_version(unsigned long libver, @@ -6014,113 +6111,43 @@ parse_openssl_version(unsigned long libver, *major = libver & 0xFF; } -PyMODINIT_FUNC -PyInit__ssl(void) +static int +sslmodule_init_versioninfo(PyObject *m) { - PyObject *m, *d, *r, *bases; + PyObject *r; unsigned long libver; unsigned int major, minor, fix, patch, status; - PySocketModule_APIObject *socket_api; - struct py_ssl_error_code *errcode; - struct py_ssl_library_code *libcode; - - if (PyType_Ready(&PySSLContext_Type) < 0) - return NULL; - if (PyType_Ready(&PySSLSocket_Type) < 0) - return NULL; - if (PyType_Ready(&PySSLMemoryBIO_Type) < 0) - return NULL; - if (PyType_Ready(&PySSLSession_Type) < 0) - return NULL; - - m = PyModule_Create(&_sslmodule); - if (m == NULL) - return NULL; - d = PyModule_GetDict(m); - - /* Load _socket module and its C API */ - socket_api = PySocketModule_ImportModuleAndAPI(); - if (!socket_api) - return NULL; - PySocketModule = *socket_api; + /* OpenSSL version */ + /* SSLeay() gives us the version of the library linked against, + which could be different from the headers version. + */ + libver = OpenSSL_version_num(); + r = PyLong_FromUnsignedLong(libver); + if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r)) + return -1; -#ifndef OPENSSL_VERSION_1_1 - /* Load all algorithms and initialize cpuid */ - OPENSSL_add_all_algorithms_noconf(); - /* Init OpenSSL */ - SSL_load_error_strings(); - SSL_library_init(); -#endif + parse_openssl_version(libver, &major, &minor, &fix, &patch, &status); + r = Py_BuildValue("IIIII", major, minor, fix, patch, status); + if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r)) + return -1; -#ifdef HAVE_OPENSSL_CRYPTO_LOCK - /* note that this will start threading if not already started */ - if (!_setup_ssl_threads()) { - return NULL; - } -#elif OPENSSL_VERSION_1_1 - /* OpenSSL 1.1.0 builtin thread support is enabled */ - _ssl_locks_count++; -#endif + r = PyUnicode_FromString(OpenSSL_version(OPENSSL_VERSION)); + if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r)) + return -1; - /* Add symbols to module dict */ - sslerror_type_slots[0].pfunc = PyExc_OSError; - PySSLErrorObject = PyType_FromSpec(&sslerror_type_spec); - if (PySSLErrorObject == NULL) - return NULL; + libver = OPENSSL_VERSION_NUMBER; + parse_openssl_version(libver, &major, &minor, &fix, &patch, &status); + r = Py_BuildValue("IIIII", major, minor, fix, patch, status); + if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r)) + return -1; - /* ssl.CertificateError used to be a subclass of ValueError */ - bases = Py_BuildValue("OO", PySSLErrorObject, PyExc_ValueError); - if (bases == NULL) - return NULL; - PySSLCertVerificationErrorObject = PyErr_NewExceptionWithDoc( - "ssl.SSLCertVerificationError", SSLCertVerificationError_doc, - bases, NULL); - Py_DECREF(bases); - PySSLZeroReturnErrorObject = PyErr_NewExceptionWithDoc( - "ssl.SSLZeroReturnError", SSLZeroReturnError_doc, - PySSLErrorObject, NULL); - PySSLWantReadErrorObject = PyErr_NewExceptionWithDoc( - "ssl.SSLWantReadError", SSLWantReadError_doc, - PySSLErrorObject, NULL); - PySSLWantWriteErrorObject = PyErr_NewExceptionWithDoc( - "ssl.SSLWantWriteError", SSLWantWriteError_doc, - PySSLErrorObject, NULL); - PySSLSyscallErrorObject = PyErr_NewExceptionWithDoc( - "ssl.SSLSyscallError", SSLSyscallError_doc, - PySSLErrorObject, NULL); - PySSLEOFErrorObject = PyErr_NewExceptionWithDoc( - "ssl.SSLEOFError", SSLEOFError_doc, - PySSLErrorObject, NULL); - if (PySSLCertVerificationErrorObject == NULL - || PySSLZeroReturnErrorObject == NULL - || PySSLWantReadErrorObject == NULL - || PySSLWantWriteErrorObject == NULL - || PySSLSyscallErrorObject == NULL - || PySSLEOFErrorObject == NULL) - return NULL; - if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0 - || PyDict_SetItemString(d, "SSLCertVerificationError", - PySSLCertVerificationErrorObject) != 0 - || PyDict_SetItemString(d, "SSLZeroReturnError", PySSLZeroReturnErrorObject) != 0 - || PyDict_SetItemString(d, "SSLWantReadError", PySSLWantReadErrorObject) != 0 - || PyDict_SetItemString(d, "SSLWantWriteError", PySSLWantWriteErrorObject) != 0 - || PyDict_SetItemString(d, "SSLSyscallError", PySSLSyscallErrorObject) != 0 - || PyDict_SetItemString(d, "SSLEOFError", PySSLEOFErrorObject) != 0) - return NULL; - if (PyDict_SetItemString(d, "_SSLContext", - (PyObject *)&PySSLContext_Type) != 0) - return NULL; - if (PyDict_SetItemString(d, "_SSLSocket", - (PyObject *)&PySSLSocket_Type) != 0) - return NULL; - if (PyDict_SetItemString(d, "MemoryBIO", - (PyObject *)&PySSLMemoryBIO_Type) != 0) - return NULL; - if (PyDict_SetItemString(d, "SSLSession", - (PyObject *)&PySSLSession_Type) != 0) - return NULL; + return 0; +} +static int +sslmodule_init_constants(PyObject *m) +{ PyModule_AddStringConstant(m, "_DEFAULT_CIPHERS", PY_SSL_DEFAULT_CIPHER_STRING); @@ -6377,72 +6404,71 @@ PyInit__ssl(void) addbool(m, "HAS_TLSv1_3", 0); #endif - /* Mappings for error codes */ - err_codes_to_names = PyDict_New(); - err_names_to_codes = PyDict_New(); - if (err_codes_to_names == NULL || err_names_to_codes == NULL) + return 0; +} + +static int +sslmodule_legacy(PyObject *module) +{ +#ifndef OPENSSL_VERSION_1_1 + /* Load all algorithms and initialize cpuid */ + OPENSSL_add_all_algorithms_noconf(); + /* Init OpenSSL */ + SSL_load_error_strings(); + SSL_library_init(); +#endif + +#ifdef HAVE_OPENSSL_CRYPTO_LOCK + /* note that this will start threading if not already started */ + if (!_setup_ssl_threads()) { return NULL; - errcode = error_codes; - while (errcode->mnemonic != NULL) { - PyObject *mnemo, *key; - mnemo = PyUnicode_FromString(errcode->mnemonic); - key = Py_BuildValue("ii", errcode->library, errcode->reason); - if (mnemo == NULL || key == NULL) - return NULL; - if (PyDict_SetItem(err_codes_to_names, key, mnemo)) - return NULL; - if (PyDict_SetItem(err_names_to_codes, mnemo, key)) - return NULL; - Py_DECREF(key); - Py_DECREF(mnemo); - errcode++; } - if (PyModule_AddObject(m, "err_codes_to_names", err_codes_to_names)) - return NULL; - if (PyModule_AddObject(m, "err_names_to_codes", err_names_to_codes)) +#elif OPENSSL_VERSION_1_1 + /* OpenSSL 1.1.0 builtin thread support is enabled */ + _ssl_locks_count++; +#endif + return 0; +} + +PyDoc_STRVAR(module_doc, +"Implementation module for SSL socket operations. See the socket module\n\ +for documentation."); + + +static struct PyModuleDef _sslmodule = { + PyModuleDef_HEAD_INIT, + "_ssl", + module_doc, + -1, + PySSL_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit__ssl(void) +{ + PyObject *m; + + m = PyModule_Create(&_sslmodule); + if (m == NULL) return NULL; - lib_codes_to_names = PyDict_New(); - if (lib_codes_to_names == NULL) + if (sslmodule_init_types(m) != 0) return NULL; - libcode = library_codes; - while (libcode->library != NULL) { - PyObject *mnemo, *key; - key = PyLong_FromLong(libcode->code); - mnemo = PyUnicode_FromString(libcode->library); - if (key == NULL || mnemo == NULL) - return NULL; - if (PyDict_SetItem(lib_codes_to_names, key, mnemo)) - return NULL; - Py_DECREF(key); - Py_DECREF(mnemo); - libcode++; - } - if (PyModule_AddObject(m, "lib_codes_to_names", lib_codes_to_names)) + if (sslmodule_init_exceptions(m) != 0) return NULL; - - /* OpenSSL version */ - /* SSLeay() gives us the version of the library linked against, - which could be different from the headers version. - */ - libver = OpenSSL_version_num(); - r = PyLong_FromUnsignedLong(libver); - if (r == NULL) + if (sslmodule_init_socketapi(m) != 0) return NULL; - if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r)) + if (sslmodule_init_errorcodes(m) != 0) return NULL; - parse_openssl_version(libver, &major, &minor, &fix, &patch, &status); - r = Py_BuildValue("IIIII", major, minor, fix, patch, status); - if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r)) + if (sslmodule_init_constants(m) != 0) return NULL; - r = PyUnicode_FromString(OpenSSL_version(OPENSSL_VERSION)); - if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r)) + if (sslmodule_init_versioninfo(m) != 0) return NULL; - - libver = OPENSSL_VERSION_NUMBER; - parse_openssl_version(libver, &major, &minor, &fix, &patch, &status); - r = Py_BuildValue("IIIII", major, minor, fix, patch, status); - if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r)) + if (sslmodule_legacy(m) != 0) return NULL; return m; diff --git a/Modules/clinic/_ssl.c.h b/Modules/clinic/_ssl.c.h index 2375f83b325c7f..43469d3c358242 100644 --- a/Modules/clinic/_ssl.c.h +++ b/Modules/clinic/_ssl.c.h @@ -399,7 +399,7 @@ _ssl__SSLContext(PyTypeObject *type, PyObject *args, PyObject *kwargs) PyObject *return_value = NULL; int proto_version; - if ((type == &PySSLContext_Type) && + if ((type == PySSLContext_Type) && !_PyArg_NoKeywords("_SSLContext", kwargs)) { goto exit; } @@ -754,13 +754,13 @@ _ssl__SSLContext__wrap_bio(PySSLContext *self, PyObject *const *args, Py_ssize_t if (!args) { goto exit; } - if (!PyObject_TypeCheck(args[0], &PySSLMemoryBIO_Type)) { - _PyArg_BadArgument("_wrap_bio", "argument 'incoming'", (&PySSLMemoryBIO_Type)->tp_name, args[0]); + if (!PyObject_TypeCheck(args[0], PySSLMemoryBIO_Type)) { + _PyArg_BadArgument("_wrap_bio", "argument 'incoming'", (PySSLMemoryBIO_Type)->tp_name, args[0]); goto exit; } incoming = (PySSLMemoryBIO *)args[0]; - if (!PyObject_TypeCheck(args[1], &PySSLMemoryBIO_Type)) { - _PyArg_BadArgument("_wrap_bio", "argument 'outgoing'", (&PySSLMemoryBIO_Type)->tp_name, args[1]); + if (!PyObject_TypeCheck(args[1], PySSLMemoryBIO_Type)) { + _PyArg_BadArgument("_wrap_bio", "argument 'outgoing'", (PySSLMemoryBIO_Type)->tp_name, args[1]); goto exit; } outgoing = (PySSLMemoryBIO *)args[1]; @@ -919,11 +919,11 @@ _ssl_MemoryBIO(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; - if ((type == &PySSLMemoryBIO_Type) && + if ((type == PySSLMemoryBIO_Type) && !_PyArg_NoPositional("MemoryBIO", args)) { goto exit; } - if ((type == &PySSLMemoryBIO_Type) && + if ((type == PySSLMemoryBIO_Type) && !_PyArg_NoKeywords("MemoryBIO", kwargs)) { goto exit; } @@ -1447,4 +1447,4 @@ _ssl_enum_crls(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje #ifndef _SSL_ENUM_CRLS_METHODDEF #define _SSL_ENUM_CRLS_METHODDEF #endif /* !defined(_SSL_ENUM_CRLS_METHODDEF) */ -/*[clinic end generated code: output=d4e4f9cdd08819f4 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2bb53a80040c9b35 input=a9049054013a1b77]*/ From 7a1af5e5f549f3c8028c7ed8f1ce75f2ee35d9d6 Mon Sep 17 00:00:00 2001 From: Mohamed Koubaa Date: Fri, 20 Nov 2020 04:39:40 -0600 Subject: [PATCH 0602/1261] bpo-1635741: Enhance _datetime error handling (GH-23139) --- Modules/_datetimemodule.c | 220 ++++++++++++++++++-------------------- 1 file changed, 103 insertions(+), 117 deletions(-) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index e59f89b3d10fb0..c3e0b52baa6fac 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -6494,32 +6494,9 @@ static PyDateTime_CAPI CAPI = { new_time_ex2 }; - - -static struct PyModuleDef datetimemodule = { - PyModuleDef_HEAD_INIT, - "_datetime", - "Fast implementation of the datetime type.", - -1, - module_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit__datetime(void) +static int +_datetime_exec(PyObject *module) { - PyObject *m; /* a module object */ - PyObject *d; /* its dict */ - PyObject *x; - PyObject *delta; - - m = PyModule_Create(&datetimemodule); - if (m == NULL) - return NULL; - // `&...` is not a constant expression according to a strict reading // of C standards. Fill tp_base at run-time rather than statically. // See https://bugs.python.org/issue40777 @@ -6537,98 +6514,72 @@ PyInit__datetime(void) }; for (size_t i = 0; i < Py_ARRAY_LENGTH(types); i++) { - if (PyModule_AddType(m, types[i]) < 0) { - return NULL; + if (PyModule_AddType(module, types[i]) < 0) { + return -1; } } if (PyType_Ready(&PyDateTime_IsoCalendarDateType) < 0) { - return NULL; + return -1; } - Py_INCREF(&PyDateTime_IsoCalendarDateType); - - /* timedelta values */ - d = PyDateTime_DeltaType.tp_dict; - - x = new_delta(0, 0, 1, 0); - if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) - return NULL; - Py_DECREF(x); - x = new_delta(-MAX_DELTA_DAYS, 0, 0, 0); - if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) - return NULL; - Py_DECREF(x); +#define DATETIME_ADD_MACRO(dict, c, value_expr) \ + do { \ + PyObject *value = (value_expr); \ + if (value == NULL) { \ + return -1; \ + } \ + if (PyDict_SetItemString(dict, c, value) < 0) { \ + Py_DECREF(value); \ + return -1; \ + } \ + Py_DECREF(value); \ + } while(0) - x = new_delta(MAX_DELTA_DAYS, 24*3600-1, 1000000-1, 0); - if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) - return NULL; - Py_DECREF(x); + /* timedelta values */ + PyObject *d = PyDateTime_DeltaType.tp_dict; + DATETIME_ADD_MACRO(d, "resolution", new_delta(0, 0, 1, 0)); + DATETIME_ADD_MACRO(d, "min", new_delta(-MAX_DELTA_DAYS, 0, 0, 0)); + DATETIME_ADD_MACRO(d, "max", + new_delta(MAX_DELTA_DAYS, 24*3600-1, 1000000-1, 0)); /* date values */ d = PyDateTime_DateType.tp_dict; - - x = new_date(1, 1, 1); - if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) - return NULL; - Py_DECREF(x); - - x = new_date(MAXYEAR, 12, 31); - if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) - return NULL; - Py_DECREF(x); - - x = new_delta(1, 0, 0, 0); - if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) - return NULL; - Py_DECREF(x); + DATETIME_ADD_MACRO(d, "min", new_date(1, 1, 1)); + DATETIME_ADD_MACRO(d, "max", new_date(MAXYEAR, 12, 31)); + DATETIME_ADD_MACRO(d, "resolution", new_delta(1, 0, 0, 0)); /* time values */ d = PyDateTime_TimeType.tp_dict; - - x = new_time(0, 0, 0, 0, Py_None, 0); - if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) - return NULL; - Py_DECREF(x); - - x = new_time(23, 59, 59, 999999, Py_None, 0); - if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) - return NULL; - Py_DECREF(x); - - x = new_delta(0, 0, 1, 0); - if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) - return NULL; - Py_DECREF(x); + DATETIME_ADD_MACRO(d, "min", new_time(0, 0, 0, 0, Py_None, 0)); + DATETIME_ADD_MACRO(d, "max", new_time(23, 59, 59, 999999, Py_None, 0)); + DATETIME_ADD_MACRO(d, "resolution", new_delta(0, 0, 1, 0)); /* datetime values */ d = PyDateTime_DateTimeType.tp_dict; - - x = new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None, 0); - if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) - return NULL; - Py_DECREF(x); - - x = new_datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, Py_None, 0); - if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) - return NULL; - Py_DECREF(x); - - x = new_delta(0, 0, 1, 0); - if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) - return NULL; - Py_DECREF(x); + DATETIME_ADD_MACRO(d, "min", + new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None, 0)); + DATETIME_ADD_MACRO(d, "max", new_datetime(MAXYEAR, 12, 31, 23, 59, 59, + 999999, Py_None, 0)); + DATETIME_ADD_MACRO(d, "resolution", new_delta(0, 0, 1, 0)); /* timezone values */ d = PyDateTime_TimeZoneType.tp_dict; + PyObject *delta = new_delta(0, 0, 0, 0); + if (delta == NULL) { + return -1; + } - delta = new_delta(0, 0, 0, 0); - if (delta == NULL) - return NULL; - x = create_timezone(delta, NULL); + PyObject *x = create_timezone(delta, NULL); Py_DECREF(delta); - if (x == NULL || PyDict_SetItemString(d, "utc", x) < 0) - return NULL; + if (x == NULL) { + return -1; + } + if (PyDict_SetItemString(d, "utc", x) < 0) { + Py_DECREF(x); + return -1; + } + PyDateTime_TimeZone_UTC = x; CAPI.TimeZone_UTC = PyDateTime_TimeZone_UTC; @@ -6636,37 +6587,47 @@ PyInit__datetime(void) * compatibility, even though the constructor will accept a wider range of * values. This may change in the future.*/ delta = new_delta(-1, 60, 0, 1); /* -23:59 */ - if (delta == NULL) - return NULL; + if (delta == NULL) { + return -1; + } + x = create_timezone(delta, NULL); Py_DECREF(delta); - if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) - return NULL; - Py_DECREF(x); + DATETIME_ADD_MACRO(d, "min", x); delta = new_delta(0, (23 * 60 + 59) * 60, 0, 0); /* +23:59 */ - if (delta == NULL) - return NULL; + if (delta == NULL) { + return -1; + } + x = create_timezone(delta, NULL); Py_DECREF(delta); - if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) - return NULL; - Py_DECREF(x); + DATETIME_ADD_MACRO(d, "max", x); /* Epoch */ PyDateTime_Epoch = new_datetime(1970, 1, 1, 0, 0, 0, 0, PyDateTime_TimeZone_UTC, 0); - if (PyDateTime_Epoch == NULL) - return NULL; + if (PyDateTime_Epoch == NULL) { + return -1; + } /* module initialization */ - PyModule_AddIntMacro(m, MINYEAR); - PyModule_AddIntMacro(m, MAXYEAR); + if (PyModule_AddIntMacro(module, MINYEAR) < 0) { + return -1; + } + if (PyModule_AddIntMacro(module, MAXYEAR) < 0) { + return -1; + } x = PyCapsule_New(&CAPI, PyDateTime_CAPSULE_NAME, NULL); - if (x == NULL) - return NULL; - PyModule_AddObject(m, "datetime_CAPI", x); + if (x == NULL) { + return -1; + } + + if (PyModule_AddObject(module, "datetime_CAPI", x) < 0) { + Py_DECREF(x); + return -1; + } /* A 4-year cycle has an extra leap day over what we'd get from * pasting together 4 single years. @@ -6691,8 +6652,9 @@ PyInit__datetime(void) us_per_minute = PyLong_FromLong(60000000); seconds_per_day = PyLong_FromLong(24 * 3600); if (us_per_ms == NULL || us_per_second == NULL || - us_per_minute == NULL || seconds_per_day == NULL) - return NULL; + us_per_minute == NULL || seconds_per_day == NULL) { + return -1; + } /* The rest are too big for 32-bit ints, but even * us_per_week fits in 40 bits, so doubles should be exact. @@ -6700,9 +6662,33 @@ PyInit__datetime(void) us_per_hour = PyLong_FromDouble(3600000000.0); us_per_day = PyLong_FromDouble(86400000000.0); us_per_week = PyLong_FromDouble(604800000000.0); - if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL) + if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL) { + return -1; + } + return 0; +} + +static struct PyModuleDef datetimemodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_datetime", + .m_doc = "Fast implementation of the datetime type.", + .m_size = -1, + .m_methods = module_methods, +}; + +PyMODINIT_FUNC +PyInit__datetime(void) +{ + PyObject *mod = PyModule_Create(&datetimemodule); + if (mod == NULL) return NULL; - return m; + + if (_datetime_exec(mod) < 0) { + Py_DECREF(mod); + return NULL; + } + + return mod; } /* --------------------------------------------------------------------------- From acdf30c0070c5f0c2ecd90478b22212a098a0dc5 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Fri, 20 Nov 2020 13:36:23 +0100 Subject: [PATCH 0603/1261] bpo-1635741: Convert _sre types to heap types and establish module state (PEP 384) (GH-23393) --- Lib/test/test_re.py | 4 + ...2020-11-19-09-59-07.bpo-1635741.7cMypH.rst | 2 + Modules/_sre.c | 473 ++++++++++-------- Modules/clinic/_sre.c.h | 378 ++++---------- 4 files changed, 374 insertions(+), 483 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-19-09-59-07.bpo-1635741.7cMypH.rst diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 1bfbcb853c4ed1..c1d02cfaf0dcb6 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -2197,6 +2197,10 @@ def test_overlap_table(self): self.assertEqual(f("ababba"), [0, 0, 1, 2, 0, 1]) self.assertEqual(f("abcabdac"), [0, 0, 0, 1, 2, 0, 1, 0]) + def test_signedness(self): + self.assertGreaterEqual(sre_compile.MAXREPEAT, 0) + self.assertGreaterEqual(sre_compile.MAXGROUPS, 0) + class ExternalTests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2020-11-19-09-59-07.bpo-1635741.7cMypH.rst b/Misc/NEWS.d/next/Library/2020-11-19-09-59-07.bpo-1635741.7cMypH.rst new file mode 100644 index 00000000000000..1e7d412680a1b2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-19-09-59-07.bpo-1635741.7cMypH.rst @@ -0,0 +1,2 @@ +Convert _sre module types to heap types (PEP 384). Patch by Erlend E. +Aasland. diff --git a/Modules/_sre.c b/Modules/_sre.c index fbabeb7c9f3054..0a5ca60097af36 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -248,22 +248,36 @@ data_stack_grow(SRE_STATE* state, Py_ssize_t size) /* -------------------------------------------------------------------- */ /* factories and destructors */ -/* see sre.h for object declarations */ -static PyObject*pattern_new_match(PatternObject*, SRE_STATE*, Py_ssize_t); -static PyObject *pattern_scanner(PatternObject *, PyObject *, Py_ssize_t, Py_ssize_t); +/* module state */ +typedef struct { + PyTypeObject *Pattern_Type; + PyTypeObject *Match_Type; + PyTypeObject *Scanner_Type; +} _sremodulestate; + +static _sremodulestate * +get_sre_module_state(PyObject *m) +{ + _sremodulestate *state = (_sremodulestate *)PyModule_GetState(m); + assert(state); + return state; +} +static struct PyModuleDef sremodule; +#define get_sre_module_state_by_class(cls) \ + (get_sre_module_state(PyType_GetModule(cls))) + +/* see sre.h for object declarations */ +static PyObject*pattern_new_match(_sremodulestate *, PatternObject*, SRE_STATE*, Py_ssize_t); +static PyObject *pattern_scanner(_sremodulestate *, PatternObject *, PyObject *, Py_ssize_t, Py_ssize_t); /*[clinic input] module _sre -class _sre.SRE_Pattern "PatternObject *" "&Pattern_Type" -class _sre.SRE_Match "MatchObject *" "&Match_Type" -class _sre.SRE_Scanner "ScannerObject *" "&Scanner_Type" +class _sre.SRE_Pattern "PatternObject *" "get_sre_module_state_by_class(tp)->Pattern_Type" +class _sre.SRE_Match "MatchObject *" "get_sre_module_state_by_class(tp)->Match_Type" +class _sre.SRE_Scanner "ScannerObject *" "get_sre_module_state_by_class(tp)->Scanner_Type" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=b0230ec19a0deac8]*/ - -static PyTypeObject Pattern_Type; -static PyTypeObject Match_Type; -static PyTypeObject Scanner_Type; +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=fe2966e32b66a231]*/ /*[clinic input] _sre.getcodesize -> int @@ -550,12 +564,15 @@ pattern_error(Py_ssize_t status) static void pattern_dealloc(PatternObject* self) { + PyTypeObject *tp = Py_TYPE(self); + if (self->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) self); Py_XDECREF(self->pattern); Py_XDECREF(self->groupindex); Py_XDECREF(self->indexgroup); PyObject_DEL(self); + Py_DECREF(tp); } LOCAL(Py_ssize_t) @@ -583,6 +600,8 @@ sre_search(SRE_STATE* state, SRE_CODE* pattern) /*[clinic input] _sre.SRE_Pattern.match + cls: defining_class + / string: object pos: Py_ssize_t = 0 endpos: Py_ssize_t(c_default="PY_SSIZE_T_MAX") = sys.maxsize @@ -591,10 +610,12 @@ Matches zero or more characters at the beginning of the string. [clinic start generated code]*/ static PyObject * -_sre_SRE_Pattern_match_impl(PatternObject *self, PyObject *string, - Py_ssize_t pos, Py_ssize_t endpos) -/*[clinic end generated code: output=ea2d838888510661 input=a2ba191647abebe5]*/ +_sre_SRE_Pattern_match_impl(PatternObject *self, PyTypeObject *cls, + PyObject *string, Py_ssize_t pos, + Py_ssize_t endpos) +/*[clinic end generated code: output=ec6208ea58a0cca0 input=4bdb9c3e564d13ac]*/ { + _sremodulestate *module_state = get_sre_module_state_by_class(cls); SRE_STATE state; Py_ssize_t status; PyObject *match; @@ -614,7 +635,7 @@ _sre_SRE_Pattern_match_impl(PatternObject *self, PyObject *string, return NULL; } - match = pattern_new_match(self, &state, status); + match = pattern_new_match(module_state, self, &state, status); state_fini(&state); return match; } @@ -622,6 +643,8 @@ _sre_SRE_Pattern_match_impl(PatternObject *self, PyObject *string, /*[clinic input] _sre.SRE_Pattern.fullmatch + cls: defining_class + / string: object pos: Py_ssize_t = 0 endpos: Py_ssize_t(c_default="PY_SSIZE_T_MAX") = sys.maxsize @@ -630,10 +653,12 @@ Matches against all of the string. [clinic start generated code]*/ static PyObject * -_sre_SRE_Pattern_fullmatch_impl(PatternObject *self, PyObject *string, - Py_ssize_t pos, Py_ssize_t endpos) -/*[clinic end generated code: output=5833c47782a35f4a input=d9fb03a7625b5828]*/ +_sre_SRE_Pattern_fullmatch_impl(PatternObject *self, PyTypeObject *cls, + PyObject *string, Py_ssize_t pos, + Py_ssize_t endpos) +/*[clinic end generated code: output=625b75b027ef94da input=50981172ab0fcfdd]*/ { + _sremodulestate *module_state = get_sre_module_state_by_class(cls); SRE_STATE state; Py_ssize_t status; PyObject *match; @@ -654,7 +679,7 @@ _sre_SRE_Pattern_fullmatch_impl(PatternObject *self, PyObject *string, return NULL; } - match = pattern_new_match(self, &state, status); + match = pattern_new_match(module_state, self, &state, status); state_fini(&state); return match; } @@ -662,6 +687,8 @@ _sre_SRE_Pattern_fullmatch_impl(PatternObject *self, PyObject *string, /*[clinic input] _sre.SRE_Pattern.search + cls: defining_class + / string: object pos: Py_ssize_t = 0 endpos: Py_ssize_t(c_default="PY_SSIZE_T_MAX") = sys.maxsize @@ -672,10 +699,12 @@ Return None if no position in the string matches. [clinic start generated code]*/ static PyObject * -_sre_SRE_Pattern_search_impl(PatternObject *self, PyObject *string, - Py_ssize_t pos, Py_ssize_t endpos) -/*[clinic end generated code: output=25f302a644e951e8 input=4ae5cb7dc38fed1b]*/ +_sre_SRE_Pattern_search_impl(PatternObject *self, PyTypeObject *cls, + PyObject *string, Py_ssize_t pos, + Py_ssize_t endpos) +/*[clinic end generated code: output=bd7f2d9d583e1463 input=afa9afb66a74a4b3]*/ { + _sremodulestate *module_state = get_sre_module_state_by_class(cls); SRE_STATE state; Py_ssize_t status; PyObject *match; @@ -694,7 +723,7 @@ _sre_SRE_Pattern_search_impl(PatternObject *self, PyObject *string, return NULL; } - match = pattern_new_match(self, &state, status); + match = pattern_new_match(module_state, self, &state, status); state_fini(&state); return match; } @@ -826,6 +855,8 @@ _sre_SRE_Pattern_findall_impl(PatternObject *self, PyObject *string, /*[clinic input] _sre.SRE_Pattern.finditer + cls: defining_class + / string: object pos: Py_ssize_t = 0 endpos: Py_ssize_t(c_default="PY_SSIZE_T_MAX") = sys.maxsize @@ -836,15 +867,17 @@ For each match, the iterator returns a match object. [clinic start generated code]*/ static PyObject * -_sre_SRE_Pattern_finditer_impl(PatternObject *self, PyObject *string, - Py_ssize_t pos, Py_ssize_t endpos) -/*[clinic end generated code: output=0bbb1a0aeb38bb14 input=612aab69e9fe08e4]*/ +_sre_SRE_Pattern_finditer_impl(PatternObject *self, PyTypeObject *cls, + PyObject *string, Py_ssize_t pos, + Py_ssize_t endpos) +/*[clinic end generated code: output=1791dbf3618ade56 input=812e332a4848cbaf]*/ { + _sremodulestate *module_state = get_sre_module_state_by_class(cls); PyObject* scanner; PyObject* search; PyObject* iterator; - scanner = pattern_scanner(self, string, pos, endpos); + scanner = pattern_scanner(module_state, self, string, pos, endpos); if (!scanner) return NULL; @@ -862,6 +895,8 @@ _sre_SRE_Pattern_finditer_impl(PatternObject *self, PyObject *string, /*[clinic input] _sre.SRE_Pattern.scanner + cls: defining_class + / string: object pos: Py_ssize_t = 0 endpos: Py_ssize_t(c_default="PY_SSIZE_T_MAX") = sys.maxsize @@ -869,11 +904,14 @@ _sre.SRE_Pattern.scanner [clinic start generated code]*/ static PyObject * -_sre_SRE_Pattern_scanner_impl(PatternObject *self, PyObject *string, - Py_ssize_t pos, Py_ssize_t endpos) -/*[clinic end generated code: output=54ea548aed33890b input=3aacdbde77a3a637]*/ +_sre_SRE_Pattern_scanner_impl(PatternObject *self, PyTypeObject *cls, + PyObject *string, Py_ssize_t pos, + Py_ssize_t endpos) +/*[clinic end generated code: output=f70cd506112f1bd9 input=2e487e5151bcee4c]*/ { - return pattern_scanner(self, string, pos, endpos); + _sremodulestate *module_state = get_sre_module_state_by_class(cls); + + return pattern_scanner(module_state, self, string, pos, endpos); } /*[clinic input] @@ -980,8 +1018,12 @@ _sre_SRE_Pattern_split_impl(PatternObject *self, PyObject *string, } static PyObject* -pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, - Py_ssize_t count, Py_ssize_t subn) +pattern_subx(_sremodulestate* module_state, + PatternObject* self, + PyObject* ptemplate, + PyObject* string, + Py_ssize_t count, + Py_ssize_t subn) { SRE_STATE state; PyObject* list; @@ -1083,7 +1125,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, if (filter_is_callable) { /* pass match object through filter */ - match = pattern_new_match(self, &state, 1); + match = pattern_new_match(module_state, self, &state, 1); if (!match) goto error; item = PyObject_CallOneArg(filter, match); @@ -1163,6 +1205,8 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, /*[clinic input] _sre.SRE_Pattern.sub + cls: defining_class + / repl: object string: object count: Py_ssize_t = 0 @@ -1171,16 +1215,20 @@ Return the string obtained by replacing the leftmost non-overlapping occurrences [clinic start generated code]*/ static PyObject * -_sre_SRE_Pattern_sub_impl(PatternObject *self, PyObject *repl, - PyObject *string, Py_ssize_t count) -/*[clinic end generated code: output=1dbf2ec3479cba00 input=c53d70be0b3caf86]*/ +_sre_SRE_Pattern_sub_impl(PatternObject *self, PyTypeObject *cls, + PyObject *repl, PyObject *string, Py_ssize_t count) +/*[clinic end generated code: output=4be141ab04bca60d input=d8d1d4ac2311a07c]*/ { - return pattern_subx(self, repl, string, count, 0); + _sremodulestate *module_state = get_sre_module_state_by_class(cls); + + return pattern_subx(module_state, self, repl, string, count, 0); } /*[clinic input] _sre.SRE_Pattern.subn + cls: defining_class + / repl: object string: object count: Py_ssize_t = 0 @@ -1189,11 +1237,14 @@ Return the tuple (new_string, number_of_subs_made) found by replacing the leftmo [clinic start generated code]*/ static PyObject * -_sre_SRE_Pattern_subn_impl(PatternObject *self, PyObject *repl, - PyObject *string, Py_ssize_t count) -/*[clinic end generated code: output=0d9522cd529e9728 input=e7342d7ce6083577]*/ +_sre_SRE_Pattern_subn_impl(PatternObject *self, PyTypeObject *cls, + PyObject *repl, PyObject *string, + Py_ssize_t count) +/*[clinic end generated code: output=da02fd85258b1e1f input=8b78a65b8302e58d]*/ { - return pattern_subx(self, repl, string, count, 1); + _sremodulestate *module_state = get_sre_module_state_by_class(cls); + + return pattern_subx(module_state, self, repl, string, count, 1); } /*[clinic input] @@ -1338,12 +1389,13 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags, { /* "compile" pattern descriptor to pattern object */ + _sremodulestate *module_state = get_sre_module_state(module); PatternObject* self; Py_ssize_t i, n; n = PyList_GET_SIZE(code); /* coverity[ampersand_in_size] */ - self = PyObject_NewVar(PatternObject, &Pattern_Type, n); + self = PyObject_NewVar(PatternObject, module_state->Pattern_Type, n); if (!self) return NULL; self->weakreflist = NULL; @@ -1887,10 +1939,13 @@ _validate(PatternObject *self) static void match_dealloc(MatchObject* self) { + PyTypeObject *tp = Py_TYPE(self); + Py_XDECREF(self->regs); Py_XDECREF(self->string); Py_DECREF(self->pattern); PyObject_DEL(self); + Py_DECREF(tp); } static PyObject* @@ -2319,7 +2374,10 @@ match_repr(MatchObject *self) static PyObject* -pattern_new_match(PatternObject* pattern, SRE_STATE* state, Py_ssize_t status) +pattern_new_match(_sremodulestate* module_state, + PatternObject* pattern, + SRE_STATE* state, + Py_ssize_t status) { /* create match object (from state object) */ @@ -2332,7 +2390,8 @@ pattern_new_match(PatternObject* pattern, SRE_STATE* state, Py_ssize_t status) /* create match object (with room for extra group marks) */ /* coverity[ampersand_in_size] */ - match = PyObject_NewVar(MatchObject, &Match_Type, + match = PyObject_NewVar(MatchObject, + module_state->Match_Type, 2*(pattern->groups+1)); if (!match) return NULL; @@ -2387,20 +2446,27 @@ pattern_new_match(PatternObject* pattern, SRE_STATE* state, Py_ssize_t status) static void scanner_dealloc(ScannerObject* self) { + PyTypeObject *tp = Py_TYPE(self); + state_fini(&self->state); Py_XDECREF(self->pattern); PyObject_DEL(self); + Py_DECREF(tp); } /*[clinic input] _sre.SRE_Scanner.match + cls: defining_class + / + [clinic start generated code]*/ static PyObject * -_sre_SRE_Scanner_match_impl(ScannerObject *self) -/*[clinic end generated code: output=936b30c63d4b81eb input=881a0154f8c13d9a]*/ +_sre_SRE_Scanner_match_impl(ScannerObject *self, PyTypeObject *cls) +/*[clinic end generated code: output=6e22c149dc0f0325 input=b5146e1f30278cb7]*/ { + _sremodulestate *module_state = get_sre_module_state_by_class(cls); SRE_STATE* state = &self->state; PyObject* match; Py_ssize_t status; @@ -2416,8 +2482,8 @@ _sre_SRE_Scanner_match_impl(ScannerObject *self) if (PyErr_Occurred()) return NULL; - match = pattern_new_match((PatternObject*) self->pattern, - state, status); + match = pattern_new_match(module_state, (PatternObject*) self->pattern, + state, status); if (status == 0) state->start = NULL; @@ -2433,12 +2499,16 @@ _sre_SRE_Scanner_match_impl(ScannerObject *self) /*[clinic input] _sre.SRE_Scanner.search + cls: defining_class + / + [clinic start generated code]*/ static PyObject * -_sre_SRE_Scanner_search_impl(ScannerObject *self) -/*[clinic end generated code: output=7dc211986088f025 input=161223ee92ef9270]*/ +_sre_SRE_Scanner_search_impl(ScannerObject *self, PyTypeObject *cls) +/*[clinic end generated code: output=23e8fc78013f9161 input=056c2d37171d0bf2]*/ { + _sremodulestate *module_state = get_sre_module_state_by_class(cls); SRE_STATE* state = &self->state; PyObject* match; Py_ssize_t status; @@ -2454,8 +2524,8 @@ _sre_SRE_Scanner_search_impl(ScannerObject *self) if (PyErr_Occurred()) return NULL; - match = pattern_new_match((PatternObject*) self->pattern, - state, status); + match = pattern_new_match(module_state, (PatternObject*) self->pattern, + state, status); if (status == 0) state->start = NULL; @@ -2468,12 +2538,16 @@ _sre_SRE_Scanner_search_impl(ScannerObject *self) } static PyObject * -pattern_scanner(PatternObject *self, PyObject *string, Py_ssize_t pos, Py_ssize_t endpos) +pattern_scanner(_sremodulestate *module_state, + PatternObject *self, + PyObject *string, + Py_ssize_t pos, + Py_ssize_t endpos) { ScannerObject* scanner; /* create scanner object */ - scanner = PyObject_New(ScannerObject, &Scanner_Type); + scanner = PyObject_New(ScannerObject, module_state->Scanner_Type); if (!scanner) return NULL; scanner->pattern = NULL; @@ -2516,6 +2590,8 @@ pattern_hash(PatternObject *self) static PyObject* pattern_richcompare(PyObject *lefto, PyObject *righto, int op) { + PyTypeObject *tp = Py_TYPE(lefto); + _sremodulestate *module_state = get_sre_module_state_by_class(tp); PatternObject *left, *right; int cmp; @@ -2523,7 +2599,8 @@ pattern_richcompare(PyObject *lefto, PyObject *righto, int op) Py_RETURN_NOTIMPLEMENTED; } - if (!Py_IS_TYPE(lefto, &Pattern_Type) || !Py_IS_TYPE(righto, &Pattern_Type)) { + if (!Py_IS_TYPE(righto, module_state->Pattern_Type)) + { Py_RETURN_NOTIMPLEMENTED; } @@ -2592,47 +2669,28 @@ static PyMemberDef pattern_members[] = { "The regex matching flags."}, {"groups", T_PYSSIZET, PAT_OFF(groups), READONLY, "The number of capturing groups in the pattern."}, + {"__weaklistoffset__", T_PYSSIZET, offsetof(PatternObject, weakreflist), READONLY}, {NULL} /* Sentinel */ }; -static PyTypeObject Pattern_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "re.Pattern", - sizeof(PatternObject), sizeof(SRE_CODE), - (destructor)pattern_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)pattern_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - (hashfunc)pattern_hash, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - pattern_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - pattern_richcompare, /* tp_richcompare */ - offsetof(PatternObject, weakreflist), /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - pattern_methods, /* tp_methods */ - pattern_members, /* tp_members */ - pattern_getset, /* tp_getset */ +static PyType_Slot pattern_slots[] = { + {Py_tp_dealloc, (destructor)pattern_dealloc}, + {Py_tp_repr, (reprfunc)pattern_repr}, + {Py_tp_hash, (hashfunc)pattern_hash}, + {Py_tp_doc, (void *)pattern_doc}, + {Py_tp_richcompare, pattern_richcompare}, + {Py_tp_methods, pattern_methods}, + {Py_tp_members, pattern_members}, + {Py_tp_getset, pattern_getset}, + {0, NULL}, }; -/* Match objects do not support length or assignment, but do support - __getitem__. */ -static PyMappingMethods match_as_mapping = { - NULL, - (binaryfunc)match_getitem, - NULL +static PyType_Spec pattern_spec = { + .name = "re.Pattern", + .basicsize = sizeof(PatternObject), + .itemsize = sizeof(SRE_CODE), + .flags = Py_TPFLAGS_DEFAULT, + .slots = pattern_slots, }; static PyMethodDef match_methods[] = { @@ -2674,37 +2732,30 @@ static PyMemberDef match_members[] = { /* FIXME: implement setattr("string", None) as a special case (to detach the associated string, if any */ +static PyType_Slot match_slots[] = { + {Py_tp_dealloc, match_dealloc}, + {Py_tp_repr, match_repr}, + {Py_tp_doc, (void *)match_doc}, + {Py_tp_methods, match_methods}, + {Py_tp_members, match_members}, + {Py_tp_getset, match_getset}, + + /* As mapping. + * + * Match objects do not support length or assignment, but do support + * __getitem__. + */ + {Py_mp_subscript, match_getitem}, + + {0, NULL}, +}; -static PyTypeObject Match_Type = { - PyVarObject_HEAD_INIT(NULL,0) - "re.Match", - sizeof(MatchObject), sizeof(Py_ssize_t), - (destructor)match_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)match_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - &match_as_mapping, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - match_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - match_methods, /* tp_methods */ - match_members, /* tp_members */ - match_getset, /* tp_getset */ +static PyType_Spec match_spec = { + .name = "re.Match", + .basicsize = sizeof(MatchObject), + .itemsize = sizeof(Py_ssize_t), + .flags = Py_TPFLAGS_DEFAULT, + .slots = match_slots, }; static PyMethodDef scanner_methods[] = { @@ -2719,36 +2770,18 @@ static PyMemberDef scanner_members[] = { {NULL} /* Sentinel */ }; -static PyTypeObject Scanner_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_" SRE_MODULE ".SRE_Scanner", - sizeof(ScannerObject), 0, - (destructor)scanner_dealloc,/* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - scanner_methods, /* tp_methods */ - scanner_members, /* tp_members */ - 0, /* tp_getset */ +static PyType_Slot scanner_slots[] = { + {Py_tp_dealloc, scanner_dealloc}, + {Py_tp_methods, scanner_methods}, + {Py_tp_members, scanner_members}, + {0, NULL}, +}; + +static PyType_Spec scanner_spec = { + .name = "_" SRE_MODULE ".SRE_Scanner", + .basicsize = sizeof(ScannerObject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = scanner_slots, }; static PyMethodDef _functions[] = { @@ -2761,64 +2794,108 @@ static PyMethodDef _functions[] = { {NULL, NULL} }; -static struct PyModuleDef sremodule = { - PyModuleDef_HEAD_INIT, - "_" SRE_MODULE, - NULL, - -1, - _functions, - NULL, - NULL, - NULL, - NULL -}; +static int +sre_traverse(PyObject *module, visitproc visit, void *arg) +{ + _sremodulestate *state = get_sre_module_state(module); + + Py_VISIT(state->Pattern_Type); + Py_VISIT(state->Match_Type); + Py_VISIT(state->Scanner_Type); + + return 0; +} -PyMODINIT_FUNC PyInit__sre(void) +static int +sre_clear(PyObject *module) { - PyObject* m; - PyObject* d; - PyObject* x; + _sremodulestate *state = get_sre_module_state(module); - /* Patch object types */ - if (PyType_Ready(&Pattern_Type) || PyType_Ready(&Match_Type) || - PyType_Ready(&Scanner_Type)) - return NULL; + Py_CLEAR(state->Pattern_Type); + Py_CLEAR(state->Match_Type); + Py_CLEAR(state->Scanner_Type); - m = PyModule_Create(&sremodule); - if (m == NULL) - return NULL; - d = PyModule_GetDict(m); + return 0; +} - x = PyLong_FromLong(SRE_MAGIC); - if (x) { - PyDict_SetItemString(d, "MAGIC", x); - Py_DECREF(x); - } +static void +sre_free(void *module) +{ + sre_clear((PyObject *)module); +} + +#define CREATE_TYPE(m, type, spec) \ +do { \ + type = (PyTypeObject *)PyType_FromModuleAndSpec(m, spec, NULL); \ + if (type == NULL) { \ + goto error; \ + } \ +} while (0) + +#define ADD_ULONG_CONSTANT(module, name, value) \ + do { \ + PyObject *o = PyLong_FromUnsignedLong(value); \ + if (!o) \ + goto error; \ + int res = PyModule_AddObjectRef(module, name, o); \ + Py_DECREF(o); \ + if (res < 0) { \ + goto error; \ + } \ +} while (0) - x = PyLong_FromLong(sizeof(SRE_CODE)); - if (x) { - PyDict_SetItemString(d, "CODESIZE", x); - Py_DECREF(x); - } +static int +sre_exec(PyObject *m) +{ + _sremodulestate *state; + + /* Create heap types */ + state = get_sre_module_state(m); + CREATE_TYPE(m, state->Pattern_Type, &pattern_spec); + CREATE_TYPE(m, state->Match_Type, &match_spec); + CREATE_TYPE(m, state->Scanner_Type, &scanner_spec); - x = PyLong_FromUnsignedLong(SRE_MAXREPEAT); - if (x) { - PyDict_SetItemString(d, "MAXREPEAT", x); - Py_DECREF(x); + if (PyModule_AddIntConstant(m, "MAGIC", SRE_MAGIC) < 0) { + goto error; } - x = PyLong_FromUnsignedLong(SRE_MAXGROUPS); - if (x) { - PyDict_SetItemString(d, "MAXGROUPS", x); - Py_DECREF(x); + if (PyModule_AddIntConstant(m, "CODESIZE", sizeof(SRE_CODE)) < 0) { + goto error; } - x = PyUnicode_FromString(copyright); - if (x) { - PyDict_SetItemString(d, "copyright", x); - Py_DECREF(x); + ADD_ULONG_CONSTANT(m, "MAXREPEAT", SRE_MAXREPEAT); + ADD_ULONG_CONSTANT(m, "MAXGROUPS", SRE_MAXGROUPS); + + if (PyModule_AddStringConstant(m, "copyright", copyright) < 0) { + goto error; } - return m; + + return 0; + +error: + return -1; +} + +static PyModuleDef_Slot sre_slots[] = { + {Py_mod_exec, sre_exec}, + {0, NULL}, +}; + +static struct PyModuleDef sremodule = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "_" SRE_MODULE, + .m_size = sizeof(_sremodulestate), + .m_methods = _functions, + .m_slots = sre_slots, + .m_traverse = sre_traverse, + .m_free = sre_free, + .m_clear = sre_clear, +}; + +PyMODINIT_FUNC +PyInit__sre(void) +{ + return PyModuleDef_Init(&sremodule); } /* vim:ts=4:sw=4:et diff --git a/Modules/clinic/_sre.c.h b/Modules/clinic/_sre.c.h index 2314114a1bc805..72d772c289ae8b 100644 --- a/Modules/clinic/_sre.c.h +++ b/Modules/clinic/_sre.c.h @@ -164,63 +164,28 @@ PyDoc_STRVAR(_sre_SRE_Pattern_match__doc__, "Matches zero or more characters at the beginning of the string."); #define _SRE_SRE_PATTERN_MATCH_METHODDEF \ - {"match", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_match, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_match__doc__}, + {"match", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_match, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_match__doc__}, static PyObject * -_sre_SRE_Pattern_match_impl(PatternObject *self, PyObject *string, - Py_ssize_t pos, Py_ssize_t endpos); +_sre_SRE_Pattern_match_impl(PatternObject *self, PyTypeObject *cls, + PyObject *string, Py_ssize_t pos, + Py_ssize_t endpos); static PyObject * -_sre_SRE_Pattern_match(PatternObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_sre_SRE_Pattern_match(PatternObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "match", 0}; - PyObject *argsbuf[3]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + static _PyArg_Parser _parser = {"O|nn:match", _keywords, 0}; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); - if (!args) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &string, &pos, &endpos)) { goto exit; } - string = args[0]; - if (!noptargs) { - goto skip_optional_pos; - } - if (args[1]) { - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[1]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - pos = ival; - } - if (!--noptargs) { - goto skip_optional_pos; - } - } - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[2]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - endpos = ival; - } -skip_optional_pos: - return_value = _sre_SRE_Pattern_match_impl(self, string, pos, endpos); + return_value = _sre_SRE_Pattern_match_impl(self, cls, string, pos, endpos); exit: return return_value; @@ -233,63 +198,28 @@ PyDoc_STRVAR(_sre_SRE_Pattern_fullmatch__doc__, "Matches against all of the string."); #define _SRE_SRE_PATTERN_FULLMATCH_METHODDEF \ - {"fullmatch", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_fullmatch, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_fullmatch__doc__}, + {"fullmatch", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_fullmatch, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_fullmatch__doc__}, static PyObject * -_sre_SRE_Pattern_fullmatch_impl(PatternObject *self, PyObject *string, - Py_ssize_t pos, Py_ssize_t endpos); +_sre_SRE_Pattern_fullmatch_impl(PatternObject *self, PyTypeObject *cls, + PyObject *string, Py_ssize_t pos, + Py_ssize_t endpos); static PyObject * -_sre_SRE_Pattern_fullmatch(PatternObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_sre_SRE_Pattern_fullmatch(PatternObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "fullmatch", 0}; - PyObject *argsbuf[3]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + static _PyArg_Parser _parser = {"O|nn:fullmatch", _keywords, 0}; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); - if (!args) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &string, &pos, &endpos)) { goto exit; } - string = args[0]; - if (!noptargs) { - goto skip_optional_pos; - } - if (args[1]) { - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[1]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - pos = ival; - } - if (!--noptargs) { - goto skip_optional_pos; - } - } - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[2]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - endpos = ival; - } -skip_optional_pos: - return_value = _sre_SRE_Pattern_fullmatch_impl(self, string, pos, endpos); + return_value = _sre_SRE_Pattern_fullmatch_impl(self, cls, string, pos, endpos); exit: return return_value; @@ -304,63 +234,28 @@ PyDoc_STRVAR(_sre_SRE_Pattern_search__doc__, "Return None if no position in the string matches."); #define _SRE_SRE_PATTERN_SEARCH_METHODDEF \ - {"search", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_search, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_search__doc__}, + {"search", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_search, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_search__doc__}, static PyObject * -_sre_SRE_Pattern_search_impl(PatternObject *self, PyObject *string, - Py_ssize_t pos, Py_ssize_t endpos); +_sre_SRE_Pattern_search_impl(PatternObject *self, PyTypeObject *cls, + PyObject *string, Py_ssize_t pos, + Py_ssize_t endpos); static PyObject * -_sre_SRE_Pattern_search(PatternObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_sre_SRE_Pattern_search(PatternObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "search", 0}; - PyObject *argsbuf[3]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + static _PyArg_Parser _parser = {"O|nn:search", _keywords, 0}; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); - if (!args) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &string, &pos, &endpos)) { goto exit; } - string = args[0]; - if (!noptargs) { - goto skip_optional_pos; - } - if (args[1]) { - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[1]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - pos = ival; - } - if (!--noptargs) { - goto skip_optional_pos; - } - } - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[2]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - endpos = ival; - } -skip_optional_pos: - return_value = _sre_SRE_Pattern_search_impl(self, string, pos, endpos); + return_value = _sre_SRE_Pattern_search_impl(self, cls, string, pos, endpos); exit: return return_value; @@ -444,63 +339,28 @@ PyDoc_STRVAR(_sre_SRE_Pattern_finditer__doc__, "For each match, the iterator returns a match object."); #define _SRE_SRE_PATTERN_FINDITER_METHODDEF \ - {"finditer", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_finditer, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_finditer__doc__}, + {"finditer", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_finditer, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_finditer__doc__}, static PyObject * -_sre_SRE_Pattern_finditer_impl(PatternObject *self, PyObject *string, - Py_ssize_t pos, Py_ssize_t endpos); +_sre_SRE_Pattern_finditer_impl(PatternObject *self, PyTypeObject *cls, + PyObject *string, Py_ssize_t pos, + Py_ssize_t endpos); static PyObject * -_sre_SRE_Pattern_finditer(PatternObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_sre_SRE_Pattern_finditer(PatternObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "finditer", 0}; - PyObject *argsbuf[3]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + static _PyArg_Parser _parser = {"O|nn:finditer", _keywords, 0}; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); - if (!args) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &string, &pos, &endpos)) { goto exit; } - string = args[0]; - if (!noptargs) { - goto skip_optional_pos; - } - if (args[1]) { - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[1]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - pos = ival; - } - if (!--noptargs) { - goto skip_optional_pos; - } - } - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[2]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - endpos = ival; - } -skip_optional_pos: - return_value = _sre_SRE_Pattern_finditer_impl(self, string, pos, endpos); + return_value = _sre_SRE_Pattern_finditer_impl(self, cls, string, pos, endpos); exit: return return_value; @@ -512,63 +372,28 @@ PyDoc_STRVAR(_sre_SRE_Pattern_scanner__doc__, "\n"); #define _SRE_SRE_PATTERN_SCANNER_METHODDEF \ - {"scanner", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_scanner, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_scanner__doc__}, + {"scanner", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_scanner, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_scanner__doc__}, static PyObject * -_sre_SRE_Pattern_scanner_impl(PatternObject *self, PyObject *string, - Py_ssize_t pos, Py_ssize_t endpos); +_sre_SRE_Pattern_scanner_impl(PatternObject *self, PyTypeObject *cls, + PyObject *string, Py_ssize_t pos, + Py_ssize_t endpos); static PyObject * -_sre_SRE_Pattern_scanner(PatternObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_sre_SRE_Pattern_scanner(PatternObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "scanner", 0}; - PyObject *argsbuf[3]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + static _PyArg_Parser _parser = {"O|nn:scanner", _keywords, 0}; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); - if (!args) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &string, &pos, &endpos)) { goto exit; } - string = args[0]; - if (!noptargs) { - goto skip_optional_pos; - } - if (args[1]) { - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[1]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - pos = ival; - } - if (!--noptargs) { - goto skip_optional_pos; - } - } - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[2]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - endpos = ival; - } -skip_optional_pos: - return_value = _sre_SRE_Pattern_scanner_impl(self, string, pos, endpos); + return_value = _sre_SRE_Pattern_scanner_impl(self, cls, string, pos, endpos); exit: return return_value; @@ -632,47 +457,27 @@ PyDoc_STRVAR(_sre_SRE_Pattern_sub__doc__, "Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl."); #define _SRE_SRE_PATTERN_SUB_METHODDEF \ - {"sub", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_sub, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_sub__doc__}, + {"sub", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_sub, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_sub__doc__}, static PyObject * -_sre_SRE_Pattern_sub_impl(PatternObject *self, PyObject *repl, - PyObject *string, Py_ssize_t count); +_sre_SRE_Pattern_sub_impl(PatternObject *self, PyTypeObject *cls, + PyObject *repl, PyObject *string, Py_ssize_t count); static PyObject * -_sre_SRE_Pattern_sub(PatternObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_sre_SRE_Pattern_sub(PatternObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"repl", "string", "count", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "sub", 0}; - PyObject *argsbuf[3]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + static _PyArg_Parser _parser = {"OO|n:sub", _keywords, 0}; PyObject *repl; PyObject *string; Py_ssize_t count = 0; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); - if (!args) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &repl, &string, &count)) { goto exit; } - repl = args[0]; - string = args[1]; - if (!noptargs) { - goto skip_optional_pos; - } - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[2]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - count = ival; - } -skip_optional_pos: - return_value = _sre_SRE_Pattern_sub_impl(self, repl, string, count); + return_value = _sre_SRE_Pattern_sub_impl(self, cls, repl, string, count); exit: return return_value; @@ -685,47 +490,28 @@ PyDoc_STRVAR(_sre_SRE_Pattern_subn__doc__, "Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost non-overlapping occurrences of pattern with the replacement repl."); #define _SRE_SRE_PATTERN_SUBN_METHODDEF \ - {"subn", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_subn, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_subn__doc__}, + {"subn", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_subn, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_subn__doc__}, static PyObject * -_sre_SRE_Pattern_subn_impl(PatternObject *self, PyObject *repl, - PyObject *string, Py_ssize_t count); +_sre_SRE_Pattern_subn_impl(PatternObject *self, PyTypeObject *cls, + PyObject *repl, PyObject *string, + Py_ssize_t count); static PyObject * -_sre_SRE_Pattern_subn(PatternObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_sre_SRE_Pattern_subn(PatternObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"repl", "string", "count", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "subn", 0}; - PyObject *argsbuf[3]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + static _PyArg_Parser _parser = {"OO|n:subn", _keywords, 0}; PyObject *repl; PyObject *string; Py_ssize_t count = 0; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); - if (!args) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &repl, &string, &count)) { goto exit; } - repl = args[0]; - string = args[1]; - if (!noptargs) { - goto skip_optional_pos; - } - { - Py_ssize_t ival = -1; - PyObject *iobj = _PyNumber_Index(args[2]); - if (iobj != NULL) { - ival = PyLong_AsSsize_t(iobj); - Py_DECREF(iobj); - } - if (ival == -1 && PyErr_Occurred()) { - goto exit; - } - count = ival; - } -skip_optional_pos: - return_value = _sre_SRE_Pattern_subn_impl(self, repl, string, count); + return_value = _sre_SRE_Pattern_subn_impl(self, cls, repl, string, count); exit: return return_value; @@ -1075,15 +861,26 @@ PyDoc_STRVAR(_sre_SRE_Scanner_match__doc__, "\n"); #define _SRE_SRE_SCANNER_MATCH_METHODDEF \ - {"match", (PyCFunction)_sre_SRE_Scanner_match, METH_NOARGS, _sre_SRE_Scanner_match__doc__}, + {"match", (PyCFunction)(void(*)(void))_sre_SRE_Scanner_match, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Scanner_match__doc__}, static PyObject * -_sre_SRE_Scanner_match_impl(ScannerObject *self); +_sre_SRE_Scanner_match_impl(ScannerObject *self, PyTypeObject *cls); static PyObject * -_sre_SRE_Scanner_match(ScannerObject *self, PyObject *Py_UNUSED(ignored)) +_sre_SRE_Scanner_match(ScannerObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _sre_SRE_Scanner_match_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":match", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _sre_SRE_Scanner_match_impl(self, cls); + +exit: + return return_value; } PyDoc_STRVAR(_sre_SRE_Scanner_search__doc__, @@ -1092,14 +889,25 @@ PyDoc_STRVAR(_sre_SRE_Scanner_search__doc__, "\n"); #define _SRE_SRE_SCANNER_SEARCH_METHODDEF \ - {"search", (PyCFunction)_sre_SRE_Scanner_search, METH_NOARGS, _sre_SRE_Scanner_search__doc__}, + {"search", (PyCFunction)(void(*)(void))_sre_SRE_Scanner_search, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Scanner_search__doc__}, static PyObject * -_sre_SRE_Scanner_search_impl(ScannerObject *self); +_sre_SRE_Scanner_search_impl(ScannerObject *self, PyTypeObject *cls); static PyObject * -_sre_SRE_Scanner_search(ScannerObject *self, PyObject *Py_UNUSED(ignored)) +_sre_SRE_Scanner_search(ScannerObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _sre_SRE_Scanner_search_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":search", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _sre_SRE_Scanner_search_impl(self, cls); + +exit: + return return_value; } -/*[clinic end generated code: output=0e27915b1eb7c0e4 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=518f7bb775c1184f input=a9049054013a1b77]*/ From 65ac8d5246578c3936ae3b606bbf7ad1c80cf633 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 20 Nov 2020 14:44:02 +0100 Subject: [PATCH 0604/1261] bpo-42403: Use @staticmethod in importlib (GH-23395) Use @staticmethod on methods using @classmethod but don't use their cls parameter on the following classes: * BuiltinImporter * FrozenImporter * WindowsRegistryFinder * PathFinder Leave methods using @_requires_builtin or @_requires_frozen unchanged, since this decorator requires the wrapped method to have an extra parameter (cls or self). --- Lib/importlib/_bootstrap.py | 12 +- Lib/importlib/_bootstrap_external.py | 20 +- Python/importlib.h | 1417 ++++++----- Python/importlib_external.h | 3262 +++++++++++++------------- 4 files changed, 2355 insertions(+), 2356 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 854b60397b1390..9b7335b7b9c704 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -761,16 +761,16 @@ def find_module(cls, fullname, path=None): spec = cls.find_spec(fullname, path) return spec.loader if spec is not None else None - @classmethod - def create_module(self, spec): + @staticmethod + def create_module(spec): """Create a built-in module""" if spec.name not in sys.builtin_module_names: raise ImportError('{!r} is not a built-in module'.format(spec.name), name=spec.name) return _call_with_frames_removed(_imp.create_builtin, spec) - @classmethod - def exec_module(self, module): + @staticmethod + def exec_module(module): """Exec a built-in module""" _call_with_frames_removed(_imp.exec_builtin, module) @@ -831,8 +831,8 @@ def find_module(cls, fullname, path=None): """ return cls if _imp.is_frozen(fullname) else None - @classmethod - def create_module(cls, spec): + @staticmethod + def create_module(spec): """Use default semantics for module creation.""" @staticmethod diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index a0236c488a4041..0ae49cf5ba3908 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -754,8 +754,8 @@ class WindowsRegistryFinder: '\\Modules\\{fullname}\\Debug') DEBUG_BUILD = (_MS_WINDOWS and '_d.pyd' in EXTENSION_SUFFIXES) - @classmethod - def _open_registry(cls, key): + @staticmethod + def _open_registry(key): try: return winreg.OpenKey(winreg.HKEY_CURRENT_USER, key) except OSError: @@ -1219,8 +1219,8 @@ class _NamespaceLoader: def __init__(self, name, path, path_finder): self._path = _NamespacePath(name, path, path_finder) - @classmethod - def module_repr(cls, module): + @staticmethod + def module_repr(module): """Return repr for the module. The method is deprecated. The import machinery does the job itself. @@ -1261,8 +1261,8 @@ class PathFinder: """Meta path finder for sys.path and package __path__ attributes.""" - @classmethod - def invalidate_caches(cls): + @staticmethod + def invalidate_caches(): """Call the invalidate_caches() method on all path entry finders stored in sys.path_importer_caches (where implemented).""" for name, finder in list(sys.path_importer_cache.items()): @@ -1271,8 +1271,8 @@ def invalidate_caches(cls): elif hasattr(finder, 'invalidate_caches'): finder.invalidate_caches() - @classmethod - def _path_hooks(cls, path): + @staticmethod + def _path_hooks(path): """Search sys.path_hooks for a finder for 'path'.""" if sys.path_hooks is not None and not sys.path_hooks: _warnings.warn('sys.path_hooks is empty', ImportWarning) @@ -1390,8 +1390,8 @@ def find_module(cls, fullname, path=None): return None return spec.loader - @classmethod - def find_distributions(cls, *args, **kwargs): + @staticmethod + def find_distributions(*args, **kwargs): """ Find distributions. diff --git a/Python/importlib.h b/Python/importlib.h index 065e6b85833b20..c76ee3c5592921 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -1036,7 +1036,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 100,117,108,101,32,103,101,116,115,10,32,32,32,32,99,108, 111,98,98,101,114,101,100,46,10,10,32,32,32,32,78,41, 3,114,51,0,0,0,114,17,0,0,0,114,160,0,0,0, - 41,1,114,96,0,0,0,114,10,0,0,0,114,10,0,0, + 169,1,114,96,0,0,0,114,10,0,0,0,114,10,0,0, 0,114,11,0,0,0,114,95,0,0,0,196,2,0,0,115, 8,0,0,0,12,9,38,1,4,128,255,128,114,95,0,0, 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1044,8 +1044,8 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,101, 5,100,3,100,4,132,0,131,1,90,6,101,7,100,20,100, 6,100,7,132,1,131,1,90,8,101,7,100,21,100,8,100, - 9,132,1,131,1,90,9,101,7,100,10,100,11,132,0,131, - 1,90,10,101,7,100,12,100,13,132,0,131,1,90,11,101, + 9,132,1,131,1,90,9,101,5,100,10,100,11,132,0,131, + 1,90,10,101,5,100,12,100,13,132,0,131,1,90,11,101, 7,101,12,100,14,100,15,132,0,131,1,131,1,90,13,101, 7,101,12,100,16,100,17,132,0,131,1,131,1,90,14,101, 7,101,12,100,18,100,19,132,0,131,1,131,1,90,15,101, @@ -1073,7 +1073,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32, 32,32,32,32,32,122,8,60,109,111,100,117,108,101,32,122, 2,32,40,122,2,41,62,78,41,3,114,1,0,0,0,114, - 161,0,0,0,114,139,0,0,0,41,1,114,97,0,0,0, + 162,0,0,0,114,139,0,0,0,169,1,114,97,0,0,0, 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, 100,0,0,0,222,2,0,0,115,4,0,0,0,22,7,255, 128,122,27,66,117,105,108,116,105,110,73,109,112,111,114,116, @@ -1106,721 +1106,720 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, - 41,2,114,168,0,0,0,114,110,0,0,0,41,4,114,165, - 0,0,0,114,82,0,0,0,114,166,0,0,0,114,96,0, + 41,2,114,170,0,0,0,114,110,0,0,0,41,4,114,167, + 0,0,0,114,82,0,0,0,114,168,0,0,0,114,96,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, 0,218,11,102,105,110,100,95,109,111,100,117,108,101,240,2, 0,0,115,6,0,0,0,12,9,18,1,255,128,122,27,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,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,46,0,0,0,124,1,106,0,116,1,106,2, - 118,1,114,34,116,3,100,1,160,4,124,1,106,0,161,1, - 124,1,106,0,100,2,141,2,130,1,116,5,116,6,106,7, - 124,1,131,2,83,0,41,4,122,24,67,114,101,97,116,101, + 105,110,100,95,109,111,100,117,108,101,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,67, + 0,0,0,115,46,0,0,0,124,0,106,0,116,1,106,2, + 118,1,114,34,116,3,100,1,160,4,124,0,106,0,161,1, + 124,0,106,0,100,2,141,2,130,1,116,5,116,6,106,7, + 124,0,131,2,83,0,41,4,122,24,67,114,101,97,116,101, 32,97,32,98,117,105,108,116,45,105,110,32,109,111,100,117, 108,101,114,78,0,0,0,114,16,0,0,0,78,41,8,114, 17,0,0,0,114,15,0,0,0,114,79,0,0,0,114,80, 0,0,0,114,46,0,0,0,114,68,0,0,0,114,58,0, 0,0,90,14,99,114,101,97,116,101,95,98,117,105,108,116, - 105,110,41,2,114,30,0,0,0,114,96,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,150,0, - 0,0,252,2,0,0,115,12,0,0,0,12,3,12,1,4, - 1,6,255,12,2,255,128,122,29,66,117,105,108,116,105,110, - 73,109,112,111,114,116,101,114,46,99,114,101,97,116,101,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 16,0,0,0,116,0,116,1,106,2,124,1,131,2,1,0, - 100,1,83,0,41,2,122,22,69,120,101,99,32,97,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,78,41, - 3,114,68,0,0,0,114,58,0,0,0,90,12,101,120,101, - 99,95,98,117,105,108,116,105,110,41,2,114,30,0,0,0, - 114,97,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,151,0,0,0,4,3,0,0,115,6,0, - 0,0,12,3,4,128,255,128,122,27,66,117,105,108,116,105, - 110,73,109,112,111,114,116,101,114,46,101,120,101,99,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 105,110,114,161,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,150,0,0,0,252,2,0,0,115, + 12,0,0,0,12,3,12,1,4,1,6,255,12,2,255,128, + 122,29,66,117,105,108,116,105,110,73,109,112,111,114,116,101, + 114,46,99,114,101,97,116,101,95,109,111,100,117,108,101,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,16,0,0,0,116,0,116, + 1,106,2,124,0,131,2,1,0,100,1,83,0,41,2,122, + 22,69,120,101,99,32,97,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,78,41,3,114,68,0,0,0,114, + 58,0,0,0,90,12,101,120,101,99,95,98,117,105,108,116, + 105,110,114,164,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,151,0,0,0,4,3,0,0,115, + 6,0,0,0,12,3,4,128,255,128,122,27,66,117,105,108, + 116,105,110,73,109,112,111,114,116,101,114,46,101,120,101,99, + 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,57,82,101,116, + 117,114,110,32,78,111,110,101,32,97,115,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,115,32,100,111,32, + 110,111,116,32,104,97,118,101,32,99,111,100,101,32,111,98, + 106,101,99,116,115,46,78,114,10,0,0,0,169,2,114,167, + 0,0,0,114,82,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,8,103,101,116,95,99,111,100, + 101,9,3,0,0,115,4,0,0,0,4,4,255,128,122,24, + 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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,56,82,101, + 116,117,114,110,32,78,111,110,101,32,97,115,32,98,117,105, + 108,116,45,105,110,32,109,111,100,117,108,101,115,32,100,111, + 32,110,111,116,32,104,97,118,101,32,115,111,117,114,99,101, + 32,99,111,100,101,46,78,114,10,0,0,0,114,172,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,10,103,101,116,95,115,111,117,114,99,101,15,3,0,0, + 115,4,0,0,0,4,4,255,128,122,26,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,0,0, 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,122,57,82,101,116,117,114, - 110,32,78,111,110,101,32,97,115,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,32,100,111,32,110,111, - 116,32,104,97,118,101,32,99,111,100,101,32,111,98,106,101, - 99,116,115,46,78,114,10,0,0,0,169,2,114,165,0,0, - 0,114,82,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,8,103,101,116,95,99,111,100,101,9, - 3,0,0,115,4,0,0,0,4,4,255,128,122,24,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,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,2,122,56,82,101,116,117, - 114,110,32,78,111,110,101,32,97,115,32,98,117,105,108,116, - 45,105,110,32,109,111,100,117,108,101,115,32,100,111,32,110, - 111,116,32,104,97,118,101,32,115,111,117,114,99,101,32,99, - 111,100,101,46,78,114,10,0,0,0,114,170,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,10, - 103,101,116,95,115,111,117,114,99,101,15,3,0,0,115,4, - 0,0,0,4,4,255,128,122,26,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,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,3,122,52,82,101,116,117,114,110,32, - 70,97,108,115,101,32,97,115,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,115,32,97,114,101,32,110,101, - 118,101,114,32,112,97,99,107,97,103,101,115,46,70,78,114, - 10,0,0,0,114,170,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,116,0,0,0,21,3,0, - 0,115,4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41,18,114, - 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, - 0,0,0,114,139,0,0,0,218,12,115,116,97,116,105,99, - 109,101,116,104,111,100,114,100,0,0,0,218,11,99,108,97, - 115,115,109,101,116,104,111,100,114,168,0,0,0,114,169,0, - 0,0,114,150,0,0,0,114,151,0,0,0,114,87,0,0, - 0,114,171,0,0,0,114,172,0,0,0,114,116,0,0,0, - 114,98,0,0,0,114,156,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,161, - 0,0,0,211,2,0,0,115,48,0,0,0,8,0,4,2, - 4,7,2,2,10,1,2,8,12,1,2,8,12,1,2,11, - 10,1,2,7,10,1,2,4,2,1,12,1,2,4,2,1, - 12,1,2,4,2,1,12,1,12,4,255,128,114,161,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,64,0,0,0,115,144,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,101, - 5,100,3,100,4,132,0,131,1,90,6,101,7,100,22,100, - 6,100,7,132,1,131,1,90,8,101,7,100,23,100,8,100, - 9,132,1,131,1,90,9,101,7,100,10,100,11,132,0,131, - 1,90,10,101,5,100,12,100,13,132,0,131,1,90,11,101, - 7,100,14,100,15,132,0,131,1,90,12,101,7,101,13,100, - 16,100,17,132,0,131,1,131,1,90,14,101,7,101,13,100, - 18,100,19,132,0,131,1,131,1,90,15,101,7,101,13,100, - 20,100,21,132,0,131,1,131,1,90,16,100,5,83,0,41, - 24,218,14,70,114,111,122,101,110,73,109,112,111,114,116,101, - 114,122,142,77,101,116,97,32,112,97,116,104,32,105,109,112, - 111,114,116,32,102,111,114,32,102,114,111,122,101,110,32,109, - 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, - 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, - 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, - 116,105,99,32,109,101,116,104,111,100,115,32,116,111,32,97, - 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, - 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, - 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, - 32,90,6,102,114,111,122,101,110,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,4,0,0,0,67,0, - 0,0,115,16,0,0,0,100,1,160,0,124,0,106,1,116, - 2,106,3,161,2,83,0,41,3,114,162,0,0,0,114,154, - 0,0,0,78,41,4,114,46,0,0,0,114,1,0,0,0, - 114,175,0,0,0,114,139,0,0,0,41,1,218,1,109,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,100, - 0,0,0,41,3,0,0,115,4,0,0,0,16,7,255,128, - 122,26,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,4,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, - 0,0,67,0,0,0,115,30,0,0,0,116,0,160,1,124, - 1,161,1,114,26,116,2,124,1,124,0,124,0,106,3,100, - 1,141,3,83,0,100,0,83,0,114,163,0,0,0,41,4, - 114,58,0,0,0,114,89,0,0,0,114,92,0,0,0,114, - 139,0,0,0,114,164,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,168,0,0,0,50,3,0, - 0,115,8,0,0,0,10,2,16,1,4,2,255,128,122,24, - 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,102, - 105,110,100,95,115,112,101,99,99,3,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, - 0,115,18,0,0,0,116,0,160,1,124,1,161,1,114,14, - 124,0,83,0,100,1,83,0,41,2,122,93,70,105,110,100, - 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101, - 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,85,115,101,32,102,105,110,100,95, - 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, - 10,32,32,32,32,32,32,32,32,78,41,2,114,58,0,0, - 0,114,89,0,0,0,41,3,114,165,0,0,0,114,82,0, - 0,0,114,166,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,169,0,0,0,57,3,0,0,115, - 4,0,0,0,18,7,255,128,122,26,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,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,41,2,122,42,85,115,101,32,100,101, - 102,97,117,108,116,32,115,101,109,97,110,116,105,99,115,32, - 102,111,114,32,109,111,100,117,108,101,32,99,114,101,97,116, - 105,111,110,46,78,114,10,0,0,0,41,2,114,165,0,0, - 0,114,96,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,150,0,0,0,66,3,0,0,115,4, - 0,0,0,4,128,255,128,122,28,70,114,111,122,101,110,73, - 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, - 111,100,117,108,101,99,1,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,64, - 0,0,0,124,0,106,0,106,1,125,1,116,2,160,3,124, - 1,161,1,115,36,116,4,100,1,160,5,124,1,161,1,124, - 1,100,2,141,2,130,1,116,6,116,2,106,7,124,1,131, - 2,125,2,116,8,124,2,124,0,106,9,131,2,1,0,100, - 0,83,0,114,88,0,0,0,41,10,114,106,0,0,0,114, - 17,0,0,0,114,58,0,0,0,114,89,0,0,0,114,80, - 0,0,0,114,46,0,0,0,114,68,0,0,0,218,17,103, - 101,116,95,102,114,111,122,101,110,95,111,98,106,101,99,116, - 218,4,101,120,101,99,114,7,0,0,0,41,3,114,97,0, - 0,0,114,17,0,0,0,218,4,99,111,100,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,151,0,0, - 0,70,3,0,0,115,18,0,0,0,8,2,10,1,10,1, - 2,1,6,255,12,2,12,1,4,128,255,128,122,26,70,114, - 111,122,101,110,73,109,112,111,114,116,101,114,46,101,120,101, - 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,100,1,83,0,41,3,122,52,82,101,116,117,114, + 110,32,70,97,108,115,101,32,97,115,32,98,117,105,108,116, + 45,105,110,32,109,111,100,117,108,101,115,32,97,114,101,32, + 110,101,118,101,114,32,112,97,99,107,97,103,101,115,46,70, + 78,114,10,0,0,0,114,172,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,116,0,0,0,21, + 3,0,0,115,4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41, + 18,114,1,0,0,0,114,0,0,0,0,114,2,0,0,0, + 114,3,0,0,0,114,139,0,0,0,218,12,115,116,97,116, + 105,99,109,101,116,104,111,100,114,100,0,0,0,218,11,99, + 108,97,115,115,109,101,116,104,111,100,114,170,0,0,0,114, + 171,0,0,0,114,150,0,0,0,114,151,0,0,0,114,87, + 0,0,0,114,173,0,0,0,114,174,0,0,0,114,116,0, + 0,0,114,98,0,0,0,114,156,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,162,0,0,0,211,2,0,0,115,48,0,0,0,8,0, + 4,2,4,7,2,2,10,1,2,8,12,1,2,8,12,1, + 2,11,10,1,2,7,10,1,2,4,2,1,12,1,2,4, + 2,1,12,1,2,4,2,1,12,1,12,4,255,128,114,162, + 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,64,0,0,0,115,144,0,0, + 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,90, + 4,101,5,100,3,100,4,132,0,131,1,90,6,101,7,100, + 22,100,6,100,7,132,1,131,1,90,8,101,7,100,23,100, + 8,100,9,132,1,131,1,90,9,101,5,100,10,100,11,132, + 0,131,1,90,10,101,5,100,12,100,13,132,0,131,1,90, + 11,101,7,100,14,100,15,132,0,131,1,90,12,101,7,101, + 13,100,16,100,17,132,0,131,1,131,1,90,14,101,7,101, + 13,100,18,100,19,132,0,131,1,131,1,90,15,101,7,101, + 13,100,20,100,21,132,0,131,1,131,1,90,16,100,5,83, + 0,41,24,218,14,70,114,111,122,101,110,73,109,112,111,114, + 116,101,114,122,142,77,101,116,97,32,112,97,116,104,32,105, + 109,112,111,114,116,32,102,111,114,32,102,114,111,122,101,110, + 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,65, + 108,108,32,109,101,116,104,111,100,115,32,97,114,101,32,101, + 105,116,104,101,114,32,99,108,97,115,115,32,111,114,32,115, + 116,97,116,105,99,32,109,101,116,104,111,100,115,32,116,111, + 32,97,118,111,105,100,32,116,104,101,32,110,101,101,100,32, + 116,111,10,32,32,32,32,105,110,115,116,97,110,116,105,97, + 116,101,32,116,104,101,32,99,108,97,115,115,46,10,10,32, + 32,32,32,90,6,102,114,111,122,101,110,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, + 67,0,0,0,115,16,0,0,0,100,1,160,0,124,0,106, + 1,116,2,106,3,161,2,83,0,41,3,114,163,0,0,0, + 114,154,0,0,0,78,41,4,114,46,0,0,0,114,1,0, + 0,0,114,177,0,0,0,114,139,0,0,0,41,1,218,1, + 109,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,100,0,0,0,41,3,0,0,115,4,0,0,0,16,7, + 255,128,122,26,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, + 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 5,0,0,0,67,0,0,0,115,30,0,0,0,116,0,160, + 1,124,1,161,1,114,26,116,2,124,1,124,0,124,0,106, + 3,100,1,141,3,83,0,100,0,83,0,114,165,0,0,0, + 41,4,114,58,0,0,0,114,89,0,0,0,114,92,0,0, + 0,114,139,0,0,0,114,166,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,170,0,0,0,50, + 3,0,0,115,8,0,0,0,10,2,16,1,4,2,255,128, + 122,24,70,114,111,122,101,110,73,109,112,111,114,116,101,114, + 46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,18,0,0,0,116,0,160,1,124,1,161,1, + 114,14,124,0,83,0,100,1,83,0,41,2,122,93,70,105, + 110,100,32,97,32,102,114,111,122,101,110,32,109,111,100,117, + 108,101,46,10,10,32,32,32,32,32,32,32,32,84,104,105, + 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, + 101,99,97,116,101,100,46,32,32,85,115,101,32,102,105,110, + 100,95,115,112,101,99,40,41,32,105,110,115,116,101,97,100, + 46,10,10,32,32,32,32,32,32,32,32,78,41,2,114,58, + 0,0,0,114,89,0,0,0,41,3,114,167,0,0,0,114, + 82,0,0,0,114,168,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,171,0,0,0,57,3,0, + 0,115,4,0,0,0,18,7,255,128,122,26,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,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,1,83,0,41,2,122,42,85,115,101,32, + 100,101,102,97,117,108,116,32,115,101,109,97,110,116,105,99, + 115,32,102,111,114,32,109,111,100,117,108,101,32,99,114,101, + 97,116,105,111,110,46,78,114,10,0,0,0,114,161,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,150,0,0,0,66,3,0,0,115,4,0,0,0,4,128, + 255,128,122,28,70,114,111,122,101,110,73,109,112,111,114,116, + 101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,101, + 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,67,0,0,0,115,64,0,0,0,124,0, + 106,0,106,1,125,1,116,2,160,3,124,1,161,1,115,36, + 116,4,100,1,160,5,124,1,161,1,124,1,100,2,141,2, + 130,1,116,6,116,2,106,7,124,1,131,2,125,2,116,8, + 124,2,124,0,106,9,131,2,1,0,100,0,83,0,114,88, + 0,0,0,41,10,114,106,0,0,0,114,17,0,0,0,114, + 58,0,0,0,114,89,0,0,0,114,80,0,0,0,114,46, + 0,0,0,114,68,0,0,0,218,17,103,101,116,95,102,114, + 111,122,101,110,95,111,98,106,101,99,116,218,4,101,120,101, + 99,114,7,0,0,0,41,3,114,97,0,0,0,114,17,0, + 0,0,218,4,99,111,100,101,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,151,0,0,0,70,3,0,0, + 115,18,0,0,0,8,2,10,1,10,1,2,1,6,255,12, + 2,12,1,4,128,255,128,122,26,70,114,111,122,101,110,73, + 109,112,111,114,116,101,114,46,101,120,101,99,95,109,111,100, + 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,10,0,0, + 0,116,0,124,0,124,1,131,2,83,0,41,2,122,95,76, + 111,97,100,32,97,32,102,114,111,122,101,110,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, + 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,32,85,115,101,32,101,120, + 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, + 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,41, + 1,114,98,0,0,0,114,172,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,156,0,0,0,79, + 3,0,0,115,4,0,0,0,10,7,255,128,122,26,70,114, + 111,122,101,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, 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, - 0,115,10,0,0,0,116,0,124,0,124,1,131,2,83,0, - 41,2,122,95,76,111,97,100,32,97,32,102,114,111,122,101, - 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, - 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, - 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, - 115,101,32,101,120,101,99,95,109,111,100,117,108,101,40,41, - 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, - 32,32,32,78,41,1,114,98,0,0,0,114,170,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 156,0,0,0,79,3,0,0,115,4,0,0,0,10,7,255, - 128,122,26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, - 1,161,1,83,0,41,2,122,45,82,101,116,117,114,110,32, - 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, - 102,111,114,32,116,104,101,32,102,114,111,122,101,110,32,109, - 111,100,117,108,101,46,78,41,2,114,58,0,0,0,114,177, - 0,0,0,114,170,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,171,0,0,0,88,3,0,0, - 115,4,0,0,0,10,4,255,128,122,23,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,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,54,82,101,116,117,114,110,32,78, - 111,110,101,32,97,115,32,102,114,111,122,101,110,32,109,111, - 100,117,108,101,115,32,100,111,32,110,111,116,32,104,97,118, - 101,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114, - 10,0,0,0,114,170,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,172,0,0,0,94,3,0, - 0,115,4,0,0,0,4,4,255,128,122,25,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,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, - 0,0,0,116,0,160,1,124,1,161,1,83,0,41,2,122, - 46,82,101,116,117,114,110,32,84,114,117,101,32,105,102,32, - 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,78, - 41,2,114,58,0,0,0,90,17,105,115,95,102,114,111,122, - 101,110,95,112,97,99,107,97,103,101,114,170,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,116, - 0,0,0,100,3,0,0,115,4,0,0,0,10,4,255,128, - 122,25,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,41,2,78,78,41, - 1,78,41,17,114,1,0,0,0,114,0,0,0,0,114,2, - 0,0,0,114,3,0,0,0,114,139,0,0,0,114,173,0, - 0,0,114,100,0,0,0,114,174,0,0,0,114,168,0,0, - 0,114,169,0,0,0,114,150,0,0,0,114,151,0,0,0, - 114,156,0,0,0,114,91,0,0,0,114,171,0,0,0,114, - 172,0,0,0,114,116,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,175,0, - 0,0,30,3,0,0,115,50,0,0,0,8,0,4,2,4, - 7,2,2,10,1,2,8,12,1,2,6,12,1,2,8,10, - 1,2,3,10,1,2,8,10,1,2,8,2,1,12,1,2, - 4,2,1,12,1,2,4,2,1,16,1,255,128,114,175,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,64,0,0,0,115,32,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,83,0, - 41,7,218,18,95,73,109,112,111,114,116,76,111,99,107,67, - 111,110,116,101,120,116,122,36,67,111,110,116,101,120,116,32, - 109,97,110,97,103,101,114,32,102,111,114,32,116,104,101,32, - 105,109,112,111,114,116,32,108,111,99,107,46,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, - 0,67,0,0,0,115,12,0,0,0,116,0,160,1,161,0, - 1,0,100,1,83,0,41,2,122,24,65,99,113,117,105,114, - 101,32,116,104,101,32,105,109,112,111,114,116,32,108,111,99, - 107,46,78,41,2,114,58,0,0,0,114,59,0,0,0,114, - 48,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,55,0,0,0,113,3,0,0,115,6,0,0, - 0,8,2,4,128,255,128,122,28,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,0,0, - 0,0,4,0,0,0,2,0,0,0,67,0,0,0,115,12, - 0,0,0,116,0,160,1,161,0,1,0,100,1,83,0,41, - 2,122,60,82,101,108,101,97,115,101,32,116,104,101,32,105, - 109,112,111,114,116,32,108,111,99,107,32,114,101,103,97,114, - 100,108,101,115,115,32,111,102,32,97,110,121,32,114,97,105, - 115,101,100,32,101,120,99,101,112,116,105,111,110,115,46,78, - 41,2,114,58,0,0,0,114,61,0,0,0,41,4,114,30, - 0,0,0,218,8,101,120,99,95,116,121,112,101,218,9,101, - 120,99,95,118,97,108,117,101,218,13,101,120,99,95,116,114, - 97,99,101,98,97,99,107,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,57,0,0,0,117,3,0,0,115, - 6,0,0,0,8,2,4,128,255,128,122,27,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,41,6,114,1,0,0,0,114, - 0,0,0,0,114,2,0,0,0,114,3,0,0,0,114,55, - 0,0,0,114,57,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,180,0,0, - 0,109,3,0,0,115,10,0,0,0,8,0,4,2,8,2, - 12,4,255,128,114,180,0,0,0,99,3,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, - 0,0,115,64,0,0,0,124,1,160,0,100,1,124,2,100, - 2,24,0,161,2,125,3,116,1,124,3,131,1,124,2,107, - 0,114,36,116,2,100,3,131,1,130,1,124,3,100,4,25, - 0,125,4,124,0,114,60,100,5,160,3,124,4,124,0,161, - 2,83,0,124,4,83,0,41,7,122,50,82,101,115,111,108, - 118,101,32,97,32,114,101,108,97,116,105,118,101,32,109,111, - 100,117,108,101,32,110,97,109,101,32,116,111,32,97,110,32, - 97,98,115,111,108,117,116,101,32,111,110,101,46,114,129,0, - 0,0,114,39,0,0,0,122,50,97,116,116,101,109,112,116, - 101,100,32,114,101,108,97,116,105,118,101,32,105,109,112,111, - 114,116,32,98,101,121,111,110,100,32,116,111,112,45,108,101, - 118,101,108,32,112,97,99,107,97,103,101,114,22,0,0,0, - 250,5,123,125,46,123,125,78,41,4,218,6,114,115,112,108, - 105,116,218,3,108,101,110,114,80,0,0,0,114,46,0,0, - 0,41,5,114,17,0,0,0,218,7,112,97,99,107,97,103, - 101,218,5,108,101,118,101,108,90,4,98,105,116,115,90,4, - 98,97,115,101,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,13,95,114,101,115,111,108,118,101,95,110,97, - 109,101,122,3,0,0,115,12,0,0,0,16,2,12,1,8, - 1,8,1,20,1,255,128,114,189,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, - 0,67,0,0,0,115,34,0,0,0,124,0,160,0,124,1, - 124,2,161,2,125,3,124,3,100,0,117,0,114,24,100,0, - 83,0,116,1,124,1,124,3,131,2,83,0,114,13,0,0, - 0,41,2,114,169,0,0,0,114,92,0,0,0,41,4,218, - 6,102,105,110,100,101,114,114,17,0,0,0,114,166,0,0, - 0,114,110,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,17,95,102,105,110,100,95,115,112,101, - 99,95,108,101,103,97,99,121,131,3,0,0,115,10,0,0, - 0,12,3,8,1,4,1,10,1,255,128,114,191,0,0,0, - 99,3,0,0,0,0,0,0,0,0,0,0,0,10,0,0, - 0,10,0,0,0,67,0,0,0,115,28,1,0,0,116,0, - 106,1,125,3,124,3,100,1,117,0,114,22,116,2,100,2, - 131,1,130,1,124,3,115,38,116,3,160,4,100,3,116,5, - 161,2,1,0,124,0,116,0,106,6,118,0,125,4,124,3, - 68,0,93,226,125,5,116,7,131,0,143,94,1,0,122,10, - 124,5,106,8,125,6,87,0,110,54,4,0,116,9,121,128, - 1,0,1,0,1,0,116,10,124,5,124,0,124,1,131,3, - 125,7,124,7,100,1,117,0,114,124,89,0,87,0,100,1, - 4,0,4,0,131,3,1,0,113,52,89,0,110,14,48,0, - 124,6,124,0,124,1,124,2,131,3,125,7,87,0,100,1, - 4,0,4,0,131,3,1,0,110,16,49,0,115,162,48,0, - 1,0,1,0,1,0,89,0,1,0,124,7,100,1,117,1, - 114,52,124,4,144,1,115,16,124,0,116,0,106,6,118,0, - 144,1,114,16,116,0,106,6,124,0,25,0,125,8,122,10, - 124,8,106,11,125,9,87,0,110,26,4,0,116,9,121,244, - 1,0,1,0,1,0,124,7,6,0,89,0,2,0,1,0, - 83,0,48,0,124,9,100,1,117,0,144,1,114,8,124,7, - 2,0,1,0,83,0,124,9,2,0,1,0,83,0,124,7, - 2,0,1,0,83,0,100,1,83,0,41,4,122,21,70,105, - 110,100,32,97,32,109,111,100,117,108,101,39,115,32,115,112, - 101,99,46,78,122,53,115,121,115,46,109,101,116,97,95,112, - 97,116,104,32,105,115,32,78,111,110,101,44,32,80,121,116, - 104,111,110,32,105,115,32,108,105,107,101,108,121,32,115,104, - 117,116,116,105,110,103,32,100,111,119,110,122,22,115,121,115, - 46,109,101,116,97,95,112,97,116,104,32,105,115,32,101,109, - 112,116,121,41,12,114,15,0,0,0,218,9,109,101,116,97, - 95,112,97,116,104,114,80,0,0,0,218,9,95,119,97,114, - 110,105,110,103,115,218,4,119,97,114,110,218,13,73,109,112, - 111,114,116,87,97,114,110,105,110,103,114,93,0,0,0,114, - 180,0,0,0,114,168,0,0,0,114,107,0,0,0,114,191, - 0,0,0,114,106,0,0,0,41,10,114,17,0,0,0,114, - 166,0,0,0,114,167,0,0,0,114,192,0,0,0,90,9, - 105,115,95,114,101,108,111,97,100,114,190,0,0,0,114,168, - 0,0,0,114,96,0,0,0,114,97,0,0,0,114,106,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,10,95,102,105,110,100,95,115,112,101,99,140,3,0, - 0,115,56,0,0,0,6,2,8,1,8,2,4,3,12,1, - 10,5,8,1,8,1,2,1,10,1,12,1,12,1,8,1, - 22,1,42,2,8,1,18,2,10,1,2,1,10,1,12,1, - 14,4,10,2,8,1,8,2,8,2,4,2,255,128,114,196, - 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,5,0,0,0,67,0,0,0,115,106,0,0, - 0,116,0,124,0,116,1,131,2,115,28,116,2,100,1,160, - 3,116,4,124,0,131,1,161,1,131,1,130,1,124,2,100, - 2,107,0,114,44,116,5,100,3,131,1,130,1,124,2,100, - 2,107,4,114,82,116,0,124,1,116,1,131,2,115,70,116, - 2,100,4,131,1,130,1,124,1,115,82,116,6,100,5,131, - 1,130,1,124,0,115,102,124,2,100,2,107,2,114,102,116, - 5,100,6,131,1,130,1,100,7,83,0,41,8,122,28,86, - 101,114,105,102,121,32,97,114,103,117,109,101,110,116,115,32, - 97,114,101,32,34,115,97,110,101,34,46,122,31,109,111,100, - 117,108,101,32,110,97,109,101,32,109,117,115,116,32,98,101, - 32,115,116,114,44,32,110,111,116,32,123,125,114,22,0,0, - 0,122,18,108,101,118,101,108,32,109,117,115,116,32,98,101, - 32,62,61,32,48,122,31,95,95,112,97,99,107,97,103,101, - 95,95,32,110,111,116,32,115,101,116,32,116,111,32,97,32, - 115,116,114,105,110,103,122,54,97,116,116,101,109,112,116,101, - 100,32,114,101,108,97,116,105,118,101,32,105,109,112,111,114, - 116,32,119,105,116,104,32,110,111,32,107,110,111,119,110,32, - 112,97,114,101,110,116,32,112,97,99,107,97,103,101,122,17, - 69,109,112,116,121,32,109,111,100,117,108,101,32,110,97,109, - 101,78,41,7,218,10,105,115,105,110,115,116,97,110,99,101, - 218,3,115,116,114,218,9,84,121,112,101,69,114,114,111,114, - 114,46,0,0,0,114,14,0,0,0,218,10,86,97,108,117, - 101,69,114,114,111,114,114,80,0,0,0,169,3,114,17,0, - 0,0,114,187,0,0,0,114,188,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,13,95,115,97, - 110,105,116,121,95,99,104,101,99,107,187,3,0,0,115,26, - 0,0,0,10,2,18,1,8,1,8,1,8,1,10,1,8, - 1,4,1,8,1,12,2,8,1,4,128,255,128,114,202,0, - 0,0,122,16,78,111,32,109,111,100,117,108,101,32,110,97, - 109,101,100,32,122,4,123,33,114,125,99,2,0,0,0,0, - 0,0,0,0,0,0,0,9,0,0,0,8,0,0,0,67, - 0,0,0,115,20,1,0,0,100,0,125,2,124,0,160,0, - 100,1,161,1,100,2,25,0,125,3,124,3,114,128,124,3, - 116,1,106,2,118,1,114,42,116,3,124,1,124,3,131,2, - 1,0,124,0,116,1,106,2,118,0,114,62,116,1,106,2, - 124,0,25,0,83,0,116,1,106,2,124,3,25,0,125,4, - 122,10,124,4,106,4,125,2,87,0,110,44,4,0,116,5, - 121,126,1,0,1,0,1,0,116,6,100,3,23,0,160,7, - 124,0,124,3,161,2,125,5,116,8,124,5,124,0,100,4, - 141,2,100,0,130,2,48,0,116,9,124,0,124,2,131,2, - 125,6,124,6,100,0,117,0,114,164,116,8,116,6,160,7, - 124,0,161,1,124,0,100,4,141,2,130,1,116,10,124,6, - 131,1,125,7,124,3,144,1,114,16,116,1,106,2,124,3, - 25,0,125,4,124,0,160,0,100,1,161,1,100,5,25,0, - 125,8,122,18,116,11,124,4,124,8,124,7,131,3,1,0, - 87,0,124,7,83,0,4,0,116,5,144,1,121,14,1,0, - 1,0,1,0,100,6,124,3,155,2,100,7,124,8,155,2, - 157,4,125,5,116,12,160,13,124,5,116,14,161,2,1,0, - 89,0,124,7,83,0,48,0,124,7,83,0,41,8,78,114, - 129,0,0,0,114,22,0,0,0,122,23,59,32,123,33,114, - 125,32,105,115,32,110,111,116,32,97,32,112,97,99,107,97, - 103,101,114,16,0,0,0,233,2,0,0,0,122,27,67,97, - 110,110,111,116,32,115,101,116,32,97,110,32,97,116,116,114, - 105,98,117,116,101,32,111,110,32,122,18,32,102,111,114,32, - 99,104,105,108,100,32,109,111,100,117,108,101,32,41,15,114, - 130,0,0,0,114,15,0,0,0,114,93,0,0,0,114,68, - 0,0,0,114,142,0,0,0,114,107,0,0,0,218,8,95, - 69,82,82,95,77,83,71,114,46,0,0,0,218,19,77,111, - 100,117,108,101,78,111,116,70,111,117,110,100,69,114,114,111, - 114,114,196,0,0,0,114,160,0,0,0,114,5,0,0,0, - 114,193,0,0,0,114,194,0,0,0,114,195,0,0,0,41, - 9,114,17,0,0,0,218,7,105,109,112,111,114,116,95,114, - 166,0,0,0,114,131,0,0,0,90,13,112,97,114,101,110, - 116,95,109,111,100,117,108,101,114,158,0,0,0,114,96,0, - 0,0,114,97,0,0,0,90,5,99,104,105,108,100,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,23,95, - 102,105,110,100,95,97,110,100,95,108,111,97,100,95,117,110, - 108,111,99,107,101,100,206,3,0,0,115,60,0,0,0,4, - 1,14,1,4,1,10,1,10,1,10,2,10,1,10,1,2, - 1,10,1,12,1,16,1,16,1,10,1,8,1,18,1,8, - 2,6,1,10,2,14,1,2,1,14,1,4,4,14,253,16, - 1,14,1,4,1,2,255,4,1,255,128,114,207,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,8,0,0,0,67,0,0,0,115,128,0,0,0,116,0, - 124,0,131,1,143,62,1,0,116,1,106,2,160,3,124,0, - 116,4,161,2,125,2,124,2,116,4,117,0,114,56,116,5, - 124,0,124,1,131,2,87,0,2,0,100,1,4,0,4,0, - 131,3,1,0,83,0,87,0,100,1,4,0,4,0,131,3, - 1,0,110,16,49,0,115,76,48,0,1,0,1,0,1,0, - 89,0,1,0,124,2,100,1,117,0,114,116,100,2,160,6, - 124,0,161,1,125,3,116,7,124,3,124,0,100,3,141,2, - 130,1,116,8,124,0,131,1,1,0,124,2,83,0,41,4, - 122,25,70,105,110,100,32,97,110,100,32,108,111,97,100,32, - 116,104,101,32,109,111,100,117,108,101,46,78,122,40,105,109, - 112,111,114,116,32,111,102,32,123,125,32,104,97,108,116,101, - 100,59,32,78,111,110,101,32,105,110,32,115,121,115,46,109, - 111,100,117,108,101,115,114,16,0,0,0,41,9,114,51,0, - 0,0,114,15,0,0,0,114,93,0,0,0,114,35,0,0, - 0,218,14,95,78,69,69,68,83,95,76,79,65,68,73,78, - 71,114,207,0,0,0,114,46,0,0,0,114,205,0,0,0, - 114,66,0,0,0,41,4,114,17,0,0,0,114,206,0,0, - 0,114,97,0,0,0,114,76,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,14,95,102,105,110, - 100,95,97,110,100,95,108,111,97,100,241,3,0,0,115,24, - 0,0,0,10,2,14,1,8,1,54,1,8,2,4,1,2, - 1,4,255,12,2,8,2,4,1,255,128,114,209,0,0,0, - 114,22,0,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,42, - 0,0,0,116,0,124,0,124,1,124,2,131,3,1,0,124, - 2,100,1,107,4,114,32,116,1,124,0,124,1,124,2,131, - 3,125,0,116,2,124,0,116,3,131,2,83,0,41,3,97, - 50,1,0,0,73,109,112,111,114,116,32,97,110,100,32,114, - 101,116,117,114,110,32,116,104,101,32,109,111,100,117,108,101, - 32,98,97,115,101,100,32,111,110,32,105,116,115,32,110,97, - 109,101,44,32,116,104,101,32,112,97,99,107,97,103,101,32, - 116,104,101,32,99,97,108,108,32,105,115,10,32,32,32,32, - 98,101,105,110,103,32,109,97,100,101,32,102,114,111,109,44, - 32,97,110,100,32,116,104,101,32,108,101,118,101,108,32,97, - 100,106,117,115,116,109,101,110,116,46,10,10,32,32,32,32, - 84,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101, - 112,114,101,115,101,110,116,115,32,116,104,101,32,103,114,101, - 97,116,101,115,116,32,99,111,109,109,111,110,32,100,101,110, - 111,109,105,110,97,116,111,114,32,111,102,32,102,117,110,99, - 116,105,111,110,97,108,105,116,121,10,32,32,32,32,98,101, - 116,119,101,101,110,32,105,109,112,111,114,116,95,109,111,100, - 117,108,101,32,97,110,100,32,95,95,105,109,112,111,114,116, - 95,95,46,32,84,104,105,115,32,105,110,99,108,117,100,101, - 115,32,115,101,116,116,105,110,103,32,95,95,112,97,99,107, - 97,103,101,95,95,32,105,102,10,32,32,32,32,116,104,101, - 32,108,111,97,100,101,114,32,100,105,100,32,110,111,116,46, - 10,10,32,32,32,32,114,22,0,0,0,78,41,4,114,202, - 0,0,0,114,189,0,0,0,114,209,0,0,0,218,11,95, - 103,99,100,95,105,109,112,111,114,116,114,201,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,210, - 0,0,0,1,4,0,0,115,10,0,0,0,12,9,8,1, - 12,1,10,1,255,128,114,210,0,0,0,169,1,218,9,114, - 101,99,117,114,115,105,118,101,99,3,0,0,0,0,0,0, - 0,1,0,0,0,8,0,0,0,11,0,0,0,67,0,0, - 0,115,216,0,0,0,124,1,68,0,93,206,125,4,116,0, - 124,4,116,1,131,2,115,64,124,3,114,34,124,0,106,2, - 100,1,23,0,125,5,110,4,100,2,125,5,116,3,100,3, - 124,5,155,0,100,4,116,4,124,4,131,1,106,2,155,0, - 157,4,131,1,130,1,124,4,100,5,107,2,114,106,124,3, - 115,4,116,5,124,0,100,6,131,2,114,4,116,6,124,0, - 124,0,106,7,124,2,100,7,100,8,141,4,1,0,113,4, - 116,5,124,0,124,4,131,2,115,4,100,9,160,8,124,0, - 106,2,124,4,161,2,125,6,122,14,116,9,124,2,124,6, - 131,2,1,0,87,0,113,4,4,0,116,10,121,210,1,0, - 125,7,1,0,122,42,124,7,106,11,124,6,107,2,114,200, - 116,12,106,13,160,14,124,6,116,15,161,2,100,10,117,1, - 114,200,87,0,89,0,100,10,125,7,126,7,113,4,130,0, - 100,10,125,7,126,7,48,0,48,0,124,0,83,0,41,11, - 122,238,70,105,103,117,114,101,32,111,117,116,32,119,104,97, - 116,32,95,95,105,109,112,111,114,116,95,95,32,115,104,111, - 117,108,100,32,114,101,116,117,114,110,46,10,10,32,32,32, - 32,84,104,101,32,105,109,112,111,114,116,95,32,112,97,114, - 97,109,101,116,101,114,32,105,115,32,97,32,99,97,108,108, - 97,98,108,101,32,119,104,105,99,104,32,116,97,107,101,115, - 32,116,104,101,32,110,97,109,101,32,111,102,32,109,111,100, - 117,108,101,32,116,111,10,32,32,32,32,105,109,112,111,114, - 116,46,32,73,116,32,105,115,32,114,101,113,117,105,114,101, - 100,32,116,111,32,100,101,99,111,117,112,108,101,32,116,104, - 101,32,102,117,110,99,116,105,111,110,32,102,114,111,109,32, - 97,115,115,117,109,105,110,103,32,105,109,112,111,114,116,108, - 105,98,39,115,10,32,32,32,32,105,109,112,111,114,116,32, - 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,105, - 115,32,100,101,115,105,114,101,100,46,10,10,32,32,32,32, - 122,8,46,95,95,97,108,108,95,95,122,13,96,96,102,114, - 111,109,32,108,105,115,116,39,39,122,8,73,116,101,109,32, - 105,110,32,122,18,32,109,117,115,116,32,98,101,32,115,116, - 114,44,32,110,111,116,32,250,1,42,218,7,95,95,97,108, - 108,95,95,84,114,211,0,0,0,114,184,0,0,0,78,41, - 16,114,197,0,0,0,114,198,0,0,0,114,1,0,0,0, - 114,199,0,0,0,114,14,0,0,0,114,4,0,0,0,218, - 16,95,104,97,110,100,108,101,95,102,114,111,109,108,105,115, - 116,114,214,0,0,0,114,46,0,0,0,114,68,0,0,0, - 114,205,0,0,0,114,17,0,0,0,114,15,0,0,0,114, - 93,0,0,0,114,35,0,0,0,114,208,0,0,0,41,8, - 114,97,0,0,0,218,8,102,114,111,109,108,105,115,116,114, - 206,0,0,0,114,212,0,0,0,218,1,120,90,5,119,104, - 101,114,101,90,9,102,114,111,109,95,110,97,109,101,90,3, - 101,120,99,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,215,0,0,0,16,4,0,0,115,52,0,0,0, - 8,10,10,1,4,1,12,1,4,2,10,1,8,1,8,255, - 8,2,14,1,10,1,2,1,8,255,10,2,14,1,2,1, - 14,1,14,1,10,4,16,1,2,255,12,2,2,1,10,128, - 4,1,255,128,114,215,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,6,0,0,0,67,0, - 0,0,115,146,0,0,0,124,0,160,0,100,1,161,1,125, - 1,124,0,160,0,100,2,161,1,125,2,124,1,100,3,117, - 1,114,82,124,2,100,3,117,1,114,78,124,1,124,2,106, - 1,107,3,114,78,116,2,106,3,100,4,124,1,155,2,100, - 5,124,2,106,1,155,2,100,6,157,5,116,4,100,7,100, - 8,141,3,1,0,124,1,83,0,124,2,100,3,117,1,114, - 96,124,2,106,1,83,0,116,2,106,3,100,9,116,4,100, - 7,100,8,141,3,1,0,124,0,100,10,25,0,125,1,100, - 11,124,0,118,1,114,142,124,1,160,5,100,12,161,1,100, - 13,25,0,125,1,124,1,83,0,41,14,122,167,67,97,108, - 99,117,108,97,116,101,32,119,104,97,116,32,95,95,112,97, - 99,107,97,103,101,95,95,32,115,104,111,117,108,100,32,98, - 101,46,10,10,32,32,32,32,95,95,112,97,99,107,97,103, - 101,95,95,32,105,115,32,110,111,116,32,103,117,97,114,97, - 110,116,101,101,100,32,116,111,32,98,101,32,100,101,102,105, - 110,101,100,32,111,114,32,99,111,117,108,100,32,98,101,32, - 115,101,116,32,116,111,32,78,111,110,101,10,32,32,32,32, - 116,111,32,114,101,112,114,101,115,101,110,116,32,116,104,97, - 116,32,105,116,115,32,112,114,111,112,101,114,32,118,97,108, - 117,101,32,105,115,32,117,110,107,110,111,119,110,46,10,10, - 32,32,32,32,114,146,0,0,0,114,106,0,0,0,78,122, - 32,95,95,112,97,99,107,97,103,101,95,95,32,33,61,32, - 95,95,115,112,101,99,95,95,46,112,97,114,101,110,116,32, - 40,122,4,32,33,61,32,250,1,41,233,3,0,0,0,41, - 1,90,10,115,116,97,99,107,108,101,118,101,108,122,89,99, - 97,110,39,116,32,114,101,115,111,108,118,101,32,112,97,99, - 107,97,103,101,32,102,114,111,109,32,95,95,115,112,101,99, - 95,95,32,111,114,32,95,95,112,97,99,107,97,103,101,95, - 95,44,32,102,97,108,108,105,110,103,32,98,97,99,107,32, - 111,110,32,95,95,110,97,109,101,95,95,32,97,110,100,32, - 95,95,112,97,116,104,95,95,114,1,0,0,0,114,142,0, - 0,0,114,129,0,0,0,114,22,0,0,0,41,6,114,35, - 0,0,0,114,131,0,0,0,114,193,0,0,0,114,194,0, - 0,0,114,195,0,0,0,114,130,0,0,0,41,3,218,7, - 103,108,111,98,97,108,115,114,187,0,0,0,114,96,0,0, + 0,115,10,0,0,0,116,0,160,1,124,1,161,1,83,0, + 41,2,122,45,82,101,116,117,114,110,32,116,104,101,32,99, + 111,100,101,32,111,98,106,101,99,116,32,102,111,114,32,116, + 104,101,32,102,114,111,122,101,110,32,109,111,100,117,108,101, + 46,78,41,2,114,58,0,0,0,114,179,0,0,0,114,172, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,173,0,0,0,88,3,0,0,115,4,0,0,0, + 10,4,255,128,122,23,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,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,122,54,82,101,116,117,114,110,32,78,111,110,101,32,97, + 115,32,102,114,111,122,101,110,32,109,111,100,117,108,101,115, + 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, + 114,99,101,32,99,111,100,101,46,78,114,10,0,0,0,114, + 172,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,174,0,0,0,94,3,0,0,115,4,0,0, + 0,4,4,255,128,122,25,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,0,0,0,0,2,0,0, + 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, + 160,1,124,1,161,1,83,0,41,2,122,46,82,101,116,117, + 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,102, + 114,111,122,101,110,32,109,111,100,117,108,101,32,105,115,32, + 97,32,112,97,99,107,97,103,101,46,78,41,2,114,58,0, + 0,0,90,17,105,115,95,102,114,111,122,101,110,95,112,97, + 99,107,97,103,101,114,172,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,116,0,0,0,100,3, + 0,0,115,4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17,114, + 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, + 0,0,0,114,139,0,0,0,114,175,0,0,0,114,100,0, + 0,0,114,176,0,0,0,114,170,0,0,0,114,171,0,0, + 0,114,150,0,0,0,114,151,0,0,0,114,156,0,0,0, + 114,91,0,0,0,114,173,0,0,0,114,174,0,0,0,114, + 116,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,177,0,0,0,30,3,0, + 0,115,50,0,0,0,8,0,4,2,4,7,2,2,10,1, + 2,8,12,1,2,6,12,1,2,8,10,1,2,3,10,1, + 2,8,10,1,2,8,2,1,12,1,2,4,2,1,12,1, + 2,4,2,1,16,1,255,128,114,177,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,64,0,0,0,115,32,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,100,6,83,0,41,7,218,18,95, + 73,109,112,111,114,116,76,111,99,107,67,111,110,116,101,120, + 116,122,36,67,111,110,116,101,120,116,32,109,97,110,97,103, + 101,114,32,102,111,114,32,116,104,101,32,105,109,112,111,114, + 116,32,108,111,99,107,46,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,2,0,0,0,67,0,0,0, + 115,12,0,0,0,116,0,160,1,161,0,1,0,100,1,83, + 0,41,2,122,24,65,99,113,117,105,114,101,32,116,104,101, + 32,105,109,112,111,114,116,32,108,111,99,107,46,78,41,2, + 114,58,0,0,0,114,59,0,0,0,114,48,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,55, + 0,0,0,113,3,0,0,115,6,0,0,0,8,2,4,128, + 255,128,122,28,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,0,0,0,0,4,0,0, + 0,2,0,0,0,67,0,0,0,115,12,0,0,0,116,0, + 160,1,161,0,1,0,100,1,83,0,41,2,122,60,82,101, + 108,101,97,115,101,32,116,104,101,32,105,109,112,111,114,116, + 32,108,111,99,107,32,114,101,103,97,114,100,108,101,115,115, + 32,111,102,32,97,110,121,32,114,97,105,115,101,100,32,101, + 120,99,101,112,116,105,111,110,115,46,78,41,2,114,58,0, + 0,0,114,61,0,0,0,41,4,114,30,0,0,0,218,8, + 101,120,99,95,116,121,112,101,218,9,101,120,99,95,118,97, + 108,117,101,218,13,101,120,99,95,116,114,97,99,101,98,97, + 99,107,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,57,0,0,0,117,3,0,0,115,6,0,0,0,8, + 2,4,128,255,128,122,27,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,41,6,114,1,0,0,0,114,0,0,0,0,114, + 2,0,0,0,114,3,0,0,0,114,55,0,0,0,114,57, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,182,0,0,0,109,3,0,0, + 115,10,0,0,0,8,0,4,2,8,2,12,4,255,128,114, + 182,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,5,0,0,0,67,0,0,0,115,64,0, + 0,0,124,1,160,0,100,1,124,2,100,2,24,0,161,2, + 125,3,116,1,124,3,131,1,124,2,107,0,114,36,116,2, + 100,3,131,1,130,1,124,3,100,4,25,0,125,4,124,0, + 114,60,100,5,160,3,124,4,124,0,161,2,83,0,124,4, + 83,0,41,7,122,50,82,101,115,111,108,118,101,32,97,32, + 114,101,108,97,116,105,118,101,32,109,111,100,117,108,101,32, + 110,97,109,101,32,116,111,32,97,110,32,97,98,115,111,108, + 117,116,101,32,111,110,101,46,114,129,0,0,0,114,39,0, + 0,0,122,50,97,116,116,101,109,112,116,101,100,32,114,101, + 108,97,116,105,118,101,32,105,109,112,111,114,116,32,98,101, + 121,111,110,100,32,116,111,112,45,108,101,118,101,108,32,112, + 97,99,107,97,103,101,114,22,0,0,0,250,5,123,125,46, + 123,125,78,41,4,218,6,114,115,112,108,105,116,218,3,108, + 101,110,114,80,0,0,0,114,46,0,0,0,41,5,114,17, + 0,0,0,218,7,112,97,99,107,97,103,101,218,5,108,101, + 118,101,108,90,4,98,105,116,115,90,4,98,97,115,101,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,13, + 95,114,101,115,111,108,118,101,95,110,97,109,101,122,3,0, + 0,115,12,0,0,0,16,2,12,1,8,1,8,1,20,1, + 255,128,114,191,0,0,0,99,3,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,34,0,0,0,124,0,160,0,124,1,124,2,161,2,125, + 3,124,3,100,0,117,0,114,24,100,0,83,0,116,1,124, + 1,124,3,131,2,83,0,114,13,0,0,0,41,2,114,171, + 0,0,0,114,92,0,0,0,41,4,218,6,102,105,110,100, + 101,114,114,17,0,0,0,114,168,0,0,0,114,110,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,17,95,99,97,108,99,95,95,95,112,97,99,107,97,103, - 101,95,95,53,4,0,0,115,44,0,0,0,10,7,10,1, - 8,1,18,1,6,1,2,1,4,255,4,1,6,255,4,2, - 6,254,4,3,8,1,6,1,6,2,4,2,6,254,8,3, - 8,1,14,1,4,1,255,128,114,221,0,0,0,114,10,0, - 0,0,99,5,0,0,0,0,0,0,0,0,0,0,0,9, - 0,0,0,5,0,0,0,67,0,0,0,115,174,0,0,0, - 124,4,100,1,107,2,114,18,116,0,124,0,131,1,125,5, - 110,36,124,1,100,2,117,1,114,30,124,1,110,2,105,0, - 125,6,116,1,124,6,131,1,125,7,116,0,124,0,124,7, - 124,4,131,3,125,5,124,3,115,148,124,4,100,1,107,2, - 114,84,116,0,124,0,160,2,100,3,161,1,100,1,25,0, - 131,1,83,0,124,0,115,92,124,5,83,0,116,3,124,0, - 131,1,116,3,124,0,160,2,100,3,161,1,100,1,25,0, - 131,1,24,0,125,8,116,4,106,5,124,5,106,6,100,2, - 116,3,124,5,106,6,131,1,124,8,24,0,133,2,25,0, - 25,0,83,0,116,7,124,5,100,4,131,2,114,170,116,8, - 124,5,124,3,116,0,131,3,83,0,124,5,83,0,41,5, - 97,215,1,0,0,73,109,112,111,114,116,32,97,32,109,111, - 100,117,108,101,46,10,10,32,32,32,32,84,104,101,32,39, - 103,108,111,98,97,108,115,39,32,97,114,103,117,109,101,110, - 116,32,105,115,32,117,115,101,100,32,116,111,32,105,110,102, - 101,114,32,119,104,101,114,101,32,116,104,101,32,105,109,112, - 111,114,116,32,105,115,32,111,99,99,117,114,114,105,110,103, - 32,102,114,111,109,10,32,32,32,32,116,111,32,104,97,110, - 100,108,101,32,114,101,108,97,116,105,118,101,32,105,109,112, - 111,114,116,115,46,32,84,104,101,32,39,108,111,99,97,108, - 115,39,32,97,114,103,117,109,101,110,116,32,105,115,32,105, - 103,110,111,114,101,100,46,32,84,104,101,10,32,32,32,32, - 39,102,114,111,109,108,105,115,116,39,32,97,114,103,117,109, - 101,110,116,32,115,112,101,99,105,102,105,101,115,32,119,104, - 97,116,32,115,104,111,117,108,100,32,101,120,105,115,116,32, - 97,115,32,97,116,116,114,105,98,117,116,101,115,32,111,110, - 32,116,104,101,32,109,111,100,117,108,101,10,32,32,32,32, - 98,101,105,110,103,32,105,109,112,111,114,116,101,100,32,40, - 101,46,103,46,32,96,96,102,114,111,109,32,109,111,100,117, - 108,101,32,105,109,112,111,114,116,32,60,102,114,111,109,108, - 105,115,116,62,96,96,41,46,32,32,84,104,101,32,39,108, - 101,118,101,108,39,10,32,32,32,32,97,114,103,117,109,101, - 110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104, - 101,32,112,97,99,107,97,103,101,32,108,111,99,97,116,105, - 111,110,32,116,111,32,105,109,112,111,114,116,32,102,114,111, - 109,32,105,110,32,97,32,114,101,108,97,116,105,118,101,10, - 32,32,32,32,105,109,112,111,114,116,32,40,101,46,103,46, - 32,96,96,102,114,111,109,32,46,46,112,107,103,32,105,109, - 112,111,114,116,32,109,111,100,96,96,32,119,111,117,108,100, - 32,104,97,118,101,32,97,32,39,108,101,118,101,108,39,32, - 111,102,32,50,41,46,10,10,32,32,32,32,114,22,0,0, - 0,78,114,129,0,0,0,114,142,0,0,0,41,9,114,210, - 0,0,0,114,221,0,0,0,218,9,112,97,114,116,105,116, - 105,111,110,114,186,0,0,0,114,15,0,0,0,114,93,0, - 0,0,114,1,0,0,0,114,4,0,0,0,114,215,0,0, - 0,41,9,114,17,0,0,0,114,220,0,0,0,218,6,108, - 111,99,97,108,115,114,216,0,0,0,114,188,0,0,0,114, - 97,0,0,0,90,8,103,108,111,98,97,108,115,95,114,187, - 0,0,0,90,7,99,117,116,95,111,102,102,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,10,95,95,105, - 109,112,111,114,116,95,95,80,4,0,0,115,32,0,0,0, - 8,11,10,1,16,2,8,1,12,1,4,1,8,3,18,1, - 4,1,4,1,26,4,30,3,10,1,12,1,4,2,255,128, - 114,224,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,38, - 0,0,0,116,0,160,1,124,0,161,1,125,1,124,1,100, - 0,117,0,114,30,116,2,100,1,124,0,23,0,131,1,130, - 1,116,3,124,1,131,1,83,0,41,2,78,122,25,110,111, - 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, - 32,110,97,109,101,100,32,41,4,114,161,0,0,0,114,168, - 0,0,0,114,80,0,0,0,114,160,0,0,0,41,2,114, - 17,0,0,0,114,96,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,18,95,98,117,105,108,116, - 105,110,95,102,114,111,109,95,110,97,109,101,117,4,0,0, - 115,10,0,0,0,10,1,8,1,12,1,8,1,255,128,114, - 225,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,10,0,0,0,5,0,0,0,67,0,0,0,115,164,0, - 0,0,124,1,97,0,124,0,97,1,116,2,116,1,131,1, - 125,2,116,1,106,3,160,4,161,0,68,0,93,70,92,2, - 125,3,125,4,116,5,124,4,124,2,131,2,114,26,124,3, - 116,1,106,6,118,0,114,60,116,7,125,5,110,16,116,0, - 160,8,124,3,161,1,114,26,116,9,125,5,110,0,116,10, - 124,4,124,5,131,2,125,6,116,11,124,6,124,4,131,2, - 1,0,113,26,116,1,106,3,116,12,25,0,125,7,100,1, - 68,0,93,46,125,8,124,8,116,1,106,3,118,1,114,136, - 116,13,124,8,131,1,125,9,110,10,116,1,106,3,124,8, - 25,0,125,9,116,14,124,7,124,8,124,9,131,3,1,0, - 113,112,100,2,83,0,41,3,122,250,83,101,116,117,112,32, - 105,109,112,111,114,116,108,105,98,32,98,121,32,105,109,112, - 111,114,116,105,110,103,32,110,101,101,100,101,100,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,97, - 110,100,32,105,110,106,101,99,116,105,110,103,32,116,104,101, - 109,10,32,32,32,32,105,110,116,111,32,116,104,101,32,103, - 108,111,98,97,108,32,110,97,109,101,115,112,97,99,101,46, - 10,10,32,32,32,32,65,115,32,115,121,115,32,105,115,32, - 110,101,101,100,101,100,32,102,111,114,32,115,121,115,46,109, - 111,100,117,108,101,115,32,97,99,99,101,115,115,32,97,110, - 100,32,95,105,109,112,32,105,115,32,110,101,101,100,101,100, - 32,116,111,32,108,111,97,100,32,98,117,105,108,116,45,105, - 110,10,32,32,32,32,109,111,100,117,108,101,115,44,32,116, - 104,111,115,101,32,116,119,111,32,109,111,100,117,108,101,115, - 32,109,117,115,116,32,98,101,32,101,120,112,108,105,99,105, - 116,108,121,32,112,97,115,115,101,100,32,105,110,46,10,10, - 32,32,32,32,41,3,114,23,0,0,0,114,193,0,0,0, - 114,65,0,0,0,78,41,15,114,58,0,0,0,114,15,0, - 0,0,114,14,0,0,0,114,93,0,0,0,218,5,105,116, - 101,109,115,114,197,0,0,0,114,79,0,0,0,114,161,0, - 0,0,114,89,0,0,0,114,175,0,0,0,114,143,0,0, - 0,114,149,0,0,0,114,1,0,0,0,114,225,0,0,0, - 114,5,0,0,0,41,10,218,10,115,121,115,95,109,111,100, - 117,108,101,218,11,95,105,109,112,95,109,111,100,117,108,101, - 90,11,109,111,100,117,108,101,95,116,121,112,101,114,17,0, - 0,0,114,97,0,0,0,114,110,0,0,0,114,96,0,0, - 0,90,11,115,101,108,102,95,109,111,100,117,108,101,90,12, - 98,117,105,108,116,105,110,95,110,97,109,101,90,14,98,117, - 105,108,116,105,110,95,109,111,100,117,108,101,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,6,95,115,101, - 116,117,112,124,4,0,0,115,38,0,0,0,4,9,4,1, - 8,3,18,1,10,1,10,1,6,1,10,1,6,1,10,3, - 12,1,10,3,8,1,10,1,10,1,10,2,14,1,4,128, - 255,128,114,229,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,38,0,0,0,116,0,124,0,124,1,131,2,1,0,116, - 1,106,2,160,3,116,4,161,1,1,0,116,1,106,2,160, - 3,116,5,161,1,1,0,100,1,83,0,41,2,122,48,73, - 110,115,116,97,108,108,32,105,109,112,111,114,116,101,114,115, - 32,102,111,114,32,98,117,105,108,116,105,110,32,97,110,100, - 32,102,114,111,122,101,110,32,109,111,100,117,108,101,115,78, - 41,6,114,229,0,0,0,114,15,0,0,0,114,192,0,0, - 0,114,120,0,0,0,114,161,0,0,0,114,175,0,0,0, - 41,2,114,227,0,0,0,114,228,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,8,95,105,110, - 115,116,97,108,108,159,4,0,0,115,10,0,0,0,10,2, - 12,2,12,1,4,128,255,128,114,230,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, - 0,0,67,0,0,0,115,32,0,0,0,100,1,100,2,108, - 0,125,0,124,0,97,1,124,0,160,2,116,3,106,4,116, - 5,25,0,161,1,1,0,100,2,83,0,41,3,122,57,73, - 110,115,116,97,108,108,32,105,109,112,111,114,116,101,114,115, - 32,116,104,97,116,32,114,101,113,117,105,114,101,32,101,120, - 116,101,114,110,97,108,32,102,105,108,101,115,121,115,116,101, - 109,32,97,99,99,101,115,115,114,22,0,0,0,78,41,6, - 218,26,95,102,114,111,122,101,110,95,105,109,112,111,114,116, - 108,105,98,95,101,120,116,101,114,110,97,108,114,127,0,0, - 0,114,230,0,0,0,114,15,0,0,0,114,93,0,0,0, - 114,1,0,0,0,41,1,114,231,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,27,95,105,110, - 115,116,97,108,108,95,101,120,116,101,114,110,97,108,95,105, - 109,112,111,114,116,101,114,115,167,4,0,0,115,10,0,0, - 0,8,3,4,1,16,1,4,128,255,128,114,232,0,0,0, - 41,2,78,78,41,1,78,41,2,78,114,22,0,0,0,41, - 4,78,78,114,10,0,0,0,114,22,0,0,0,41,53,114, - 3,0,0,0,114,23,0,0,0,114,193,0,0,0,114,65, - 0,0,0,114,127,0,0,0,114,12,0,0,0,114,18,0, - 0,0,114,60,0,0,0,114,34,0,0,0,114,44,0,0, - 0,114,19,0,0,0,114,20,0,0,0,114,50,0,0,0, - 114,51,0,0,0,114,54,0,0,0,114,66,0,0,0,114, - 68,0,0,0,114,77,0,0,0,114,87,0,0,0,114,91, - 0,0,0,114,98,0,0,0,114,112,0,0,0,114,113,0, - 0,0,114,92,0,0,0,114,143,0,0,0,114,149,0,0, - 0,114,153,0,0,0,114,108,0,0,0,114,94,0,0,0, - 114,159,0,0,0,114,160,0,0,0,114,95,0,0,0,114, - 161,0,0,0,114,175,0,0,0,114,180,0,0,0,114,189, - 0,0,0,114,191,0,0,0,114,196,0,0,0,114,202,0, - 0,0,90,15,95,69,82,82,95,77,83,71,95,80,82,69, - 70,73,88,114,204,0,0,0,114,207,0,0,0,218,6,111, - 98,106,101,99,116,114,208,0,0,0,114,209,0,0,0,114, - 210,0,0,0,114,215,0,0,0,114,221,0,0,0,114,224, - 0,0,0,114,225,0,0,0,114,229,0,0,0,114,230,0, - 0,0,114,232,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,8,60,109,111, - 100,117,108,101,62,1,0,0,0,115,106,0,0,0,4,0, - 4,25,4,1,4,1,4,3,8,3,8,8,4,8,4,2, - 16,3,14,4,14,77,14,21,8,16,8,37,8,17,14,11, - 8,8,8,11,8,12,8,16,14,36,16,101,10,26,14,45, - 8,72,8,17,8,17,8,30,8,37,8,42,14,15,14,75, - 14,79,8,13,8,9,10,9,8,47,4,16,8,1,8,2, - 6,32,8,3,10,16,14,15,8,37,10,27,8,37,8,7, - 8,35,8,8,4,128,255,128, + 218,17,95,102,105,110,100,95,115,112,101,99,95,108,101,103, + 97,99,121,131,3,0,0,115,10,0,0,0,12,3,8,1, + 4,1,10,1,255,128,114,193,0,0,0,99,3,0,0,0, + 0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,0, + 67,0,0,0,115,28,1,0,0,116,0,106,1,125,3,124, + 3,100,1,117,0,114,22,116,2,100,2,131,1,130,1,124, + 3,115,38,116,3,160,4,100,3,116,5,161,2,1,0,124, + 0,116,0,106,6,118,0,125,4,124,3,68,0,93,226,125, + 5,116,7,131,0,143,94,1,0,122,10,124,5,106,8,125, + 6,87,0,110,54,4,0,116,9,121,128,1,0,1,0,1, + 0,116,10,124,5,124,0,124,1,131,3,125,7,124,7,100, + 1,117,0,114,124,89,0,87,0,100,1,4,0,4,0,131, + 3,1,0,113,52,89,0,110,14,48,0,124,6,124,0,124, + 1,124,2,131,3,125,7,87,0,100,1,4,0,4,0,131, + 3,1,0,110,16,49,0,115,162,48,0,1,0,1,0,1, + 0,89,0,1,0,124,7,100,1,117,1,114,52,124,4,144, + 1,115,16,124,0,116,0,106,6,118,0,144,1,114,16,116, + 0,106,6,124,0,25,0,125,8,122,10,124,8,106,11,125, + 9,87,0,110,26,4,0,116,9,121,244,1,0,1,0,1, + 0,124,7,6,0,89,0,2,0,1,0,83,0,48,0,124, + 9,100,1,117,0,144,1,114,8,124,7,2,0,1,0,83, + 0,124,9,2,0,1,0,83,0,124,7,2,0,1,0,83, + 0,100,1,83,0,41,4,122,21,70,105,110,100,32,97,32, + 109,111,100,117,108,101,39,115,32,115,112,101,99,46,78,122, + 53,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, + 115,32,78,111,110,101,44,32,80,121,116,104,111,110,32,105, + 115,32,108,105,107,101,108,121,32,115,104,117,116,116,105,110, + 103,32,100,111,119,110,122,22,115,121,115,46,109,101,116,97, + 95,112,97,116,104,32,105,115,32,101,109,112,116,121,41,12, + 114,15,0,0,0,218,9,109,101,116,97,95,112,97,116,104, + 114,80,0,0,0,218,9,95,119,97,114,110,105,110,103,115, + 218,4,119,97,114,110,218,13,73,109,112,111,114,116,87,97, + 114,110,105,110,103,114,93,0,0,0,114,182,0,0,0,114, + 170,0,0,0,114,107,0,0,0,114,193,0,0,0,114,106, + 0,0,0,41,10,114,17,0,0,0,114,168,0,0,0,114, + 169,0,0,0,114,194,0,0,0,90,9,105,115,95,114,101, + 108,111,97,100,114,192,0,0,0,114,170,0,0,0,114,96, + 0,0,0,114,97,0,0,0,114,106,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,10,95,102, + 105,110,100,95,115,112,101,99,140,3,0,0,115,56,0,0, + 0,6,2,8,1,8,2,4,3,12,1,10,5,8,1,8, + 1,2,1,10,1,12,1,12,1,8,1,22,1,42,2,8, + 1,18,2,10,1,2,1,10,1,12,1,14,4,10,2,8, + 1,8,2,8,2,4,2,255,128,114,198,0,0,0,99,3, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, + 0,0,0,67,0,0,0,115,106,0,0,0,116,0,124,0, + 116,1,131,2,115,28,116,2,100,1,160,3,116,4,124,0, + 131,1,161,1,131,1,130,1,124,2,100,2,107,0,114,44, + 116,5,100,3,131,1,130,1,124,2,100,2,107,4,114,82, + 116,0,124,1,116,1,131,2,115,70,116,2,100,4,131,1, + 130,1,124,1,115,82,116,6,100,5,131,1,130,1,124,0, + 115,102,124,2,100,2,107,2,114,102,116,5,100,6,131,1, + 130,1,100,7,83,0,41,8,122,28,86,101,114,105,102,121, + 32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,34, + 115,97,110,101,34,46,122,31,109,111,100,117,108,101,32,110, + 97,109,101,32,109,117,115,116,32,98,101,32,115,116,114,44, + 32,110,111,116,32,123,125,114,22,0,0,0,122,18,108,101, + 118,101,108,32,109,117,115,116,32,98,101,32,62,61,32,48, + 122,31,95,95,112,97,99,107,97,103,101,95,95,32,110,111, + 116,32,115,101,116,32,116,111,32,97,32,115,116,114,105,110, + 103,122,54,97,116,116,101,109,112,116,101,100,32,114,101,108, + 97,116,105,118,101,32,105,109,112,111,114,116,32,119,105,116, + 104,32,110,111,32,107,110,111,119,110,32,112,97,114,101,110, + 116,32,112,97,99,107,97,103,101,122,17,69,109,112,116,121, + 32,109,111,100,117,108,101,32,110,97,109,101,78,41,7,218, + 10,105,115,105,110,115,116,97,110,99,101,218,3,115,116,114, + 218,9,84,121,112,101,69,114,114,111,114,114,46,0,0,0, + 114,14,0,0,0,218,10,86,97,108,117,101,69,114,114,111, + 114,114,80,0,0,0,169,3,114,17,0,0,0,114,189,0, + 0,0,114,190,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,13,95,115,97,110,105,116,121,95, + 99,104,101,99,107,187,3,0,0,115,26,0,0,0,10,2, + 18,1,8,1,8,1,8,1,10,1,8,1,4,1,8,1, + 12,2,8,1,4,128,255,128,114,204,0,0,0,122,16,78, + 111,32,109,111,100,117,108,101,32,110,97,109,101,100,32,122, + 4,123,33,114,125,99,2,0,0,0,0,0,0,0,0,0, + 0,0,9,0,0,0,8,0,0,0,67,0,0,0,115,20, + 1,0,0,100,0,125,2,124,0,160,0,100,1,161,1,100, + 2,25,0,125,3,124,3,114,128,124,3,116,1,106,2,118, + 1,114,42,116,3,124,1,124,3,131,2,1,0,124,0,116, + 1,106,2,118,0,114,62,116,1,106,2,124,0,25,0,83, + 0,116,1,106,2,124,3,25,0,125,4,122,10,124,4,106, + 4,125,2,87,0,110,44,4,0,116,5,121,126,1,0,1, + 0,1,0,116,6,100,3,23,0,160,7,124,0,124,3,161, + 2,125,5,116,8,124,5,124,0,100,4,141,2,100,0,130, + 2,48,0,116,9,124,0,124,2,131,2,125,6,124,6,100, + 0,117,0,114,164,116,8,116,6,160,7,124,0,161,1,124, + 0,100,4,141,2,130,1,116,10,124,6,131,1,125,7,124, + 3,144,1,114,16,116,1,106,2,124,3,25,0,125,4,124, + 0,160,0,100,1,161,1,100,5,25,0,125,8,122,18,116, + 11,124,4,124,8,124,7,131,3,1,0,87,0,124,7,83, + 0,4,0,116,5,144,1,121,14,1,0,1,0,1,0,100, + 6,124,3,155,2,100,7,124,8,155,2,157,4,125,5,116, + 12,160,13,124,5,116,14,161,2,1,0,89,0,124,7,83, + 0,48,0,124,7,83,0,41,8,78,114,129,0,0,0,114, + 22,0,0,0,122,23,59,32,123,33,114,125,32,105,115,32, + 110,111,116,32,97,32,112,97,99,107,97,103,101,114,16,0, + 0,0,233,2,0,0,0,122,27,67,97,110,110,111,116,32, + 115,101,116,32,97,110,32,97,116,116,114,105,98,117,116,101, + 32,111,110,32,122,18,32,102,111,114,32,99,104,105,108,100, + 32,109,111,100,117,108,101,32,41,15,114,130,0,0,0,114, + 15,0,0,0,114,93,0,0,0,114,68,0,0,0,114,142, + 0,0,0,114,107,0,0,0,218,8,95,69,82,82,95,77, + 83,71,114,46,0,0,0,218,19,77,111,100,117,108,101,78, + 111,116,70,111,117,110,100,69,114,114,111,114,114,198,0,0, + 0,114,160,0,0,0,114,5,0,0,0,114,195,0,0,0, + 114,196,0,0,0,114,197,0,0,0,41,9,114,17,0,0, + 0,218,7,105,109,112,111,114,116,95,114,168,0,0,0,114, + 131,0,0,0,90,13,112,97,114,101,110,116,95,109,111,100, + 117,108,101,114,158,0,0,0,114,96,0,0,0,114,97,0, + 0,0,90,5,99,104,105,108,100,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,23,95,102,105,110,100,95, + 97,110,100,95,108,111,97,100,95,117,110,108,111,99,107,101, + 100,206,3,0,0,115,60,0,0,0,4,1,14,1,4,1, + 10,1,10,1,10,2,10,1,10,1,2,1,10,1,12,1, + 16,1,16,1,10,1,8,1,18,1,8,2,6,1,10,2, + 14,1,2,1,14,1,4,4,14,253,16,1,14,1,4,1, + 2,255,4,1,255,128,114,209,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,8,0,0,0, + 67,0,0,0,115,128,0,0,0,116,0,124,0,131,1,143, + 62,1,0,116,1,106,2,160,3,124,0,116,4,161,2,125, + 2,124,2,116,4,117,0,114,56,116,5,124,0,124,1,131, + 2,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, + 0,87,0,100,1,4,0,4,0,131,3,1,0,110,16,49, + 0,115,76,48,0,1,0,1,0,1,0,89,0,1,0,124, + 2,100,1,117,0,114,116,100,2,160,6,124,0,161,1,125, + 3,116,7,124,3,124,0,100,3,141,2,130,1,116,8,124, + 0,131,1,1,0,124,2,83,0,41,4,122,25,70,105,110, + 100,32,97,110,100,32,108,111,97,100,32,116,104,101,32,109, + 111,100,117,108,101,46,78,122,40,105,109,112,111,114,116,32, + 111,102,32,123,125,32,104,97,108,116,101,100,59,32,78,111, + 110,101,32,105,110,32,115,121,115,46,109,111,100,117,108,101, + 115,114,16,0,0,0,41,9,114,51,0,0,0,114,15,0, + 0,0,114,93,0,0,0,114,35,0,0,0,218,14,95,78, + 69,69,68,83,95,76,79,65,68,73,78,71,114,209,0,0, + 0,114,46,0,0,0,114,207,0,0,0,114,66,0,0,0, + 41,4,114,17,0,0,0,114,208,0,0,0,114,97,0,0, + 0,114,76,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,14,95,102,105,110,100,95,97,110,100, + 95,108,111,97,100,241,3,0,0,115,24,0,0,0,10,2, + 14,1,8,1,54,1,8,2,4,1,2,1,4,255,12,2, + 8,2,4,1,255,128,114,211,0,0,0,114,22,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,67,0,0,0,115,42,0,0,0,116,0, + 124,0,124,1,124,2,131,3,1,0,124,2,100,1,107,4, + 114,32,116,1,124,0,124,1,124,2,131,3,125,0,116,2, + 124,0,116,3,131,2,83,0,41,3,97,50,1,0,0,73, + 109,112,111,114,116,32,97,110,100,32,114,101,116,117,114,110, + 32,116,104,101,32,109,111,100,117,108,101,32,98,97,115,101, + 100,32,111,110,32,105,116,115,32,110,97,109,101,44,32,116, + 104,101,32,112,97,99,107,97,103,101,32,116,104,101,32,99, + 97,108,108,32,105,115,10,32,32,32,32,98,101,105,110,103, + 32,109,97,100,101,32,102,114,111,109,44,32,97,110,100,32, + 116,104,101,32,108,101,118,101,108,32,97,100,106,117,115,116, + 109,101,110,116,46,10,10,32,32,32,32,84,104,105,115,32, + 102,117,110,99,116,105,111,110,32,114,101,112,114,101,115,101, + 110,116,115,32,116,104,101,32,103,114,101,97,116,101,115,116, + 32,99,111,109,109,111,110,32,100,101,110,111,109,105,110,97, + 116,111,114,32,111,102,32,102,117,110,99,116,105,111,110,97, + 108,105,116,121,10,32,32,32,32,98,101,116,119,101,101,110, + 32,105,109,112,111,114,116,95,109,111,100,117,108,101,32,97, + 110,100,32,95,95,105,109,112,111,114,116,95,95,46,32,84, + 104,105,115,32,105,110,99,108,117,100,101,115,32,115,101,116, + 116,105,110,103,32,95,95,112,97,99,107,97,103,101,95,95, + 32,105,102,10,32,32,32,32,116,104,101,32,108,111,97,100, + 101,114,32,100,105,100,32,110,111,116,46,10,10,32,32,32, + 32,114,22,0,0,0,78,41,4,114,204,0,0,0,114,191, + 0,0,0,114,211,0,0,0,218,11,95,103,99,100,95,105, + 109,112,111,114,116,114,203,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,212,0,0,0,1,4, + 0,0,115,10,0,0,0,12,9,8,1,12,1,10,1,255, + 128,114,212,0,0,0,169,1,218,9,114,101,99,117,114,115, + 105,118,101,99,3,0,0,0,0,0,0,0,1,0,0,0, + 8,0,0,0,11,0,0,0,67,0,0,0,115,216,0,0, + 0,124,1,68,0,93,206,125,4,116,0,124,4,116,1,131, + 2,115,64,124,3,114,34,124,0,106,2,100,1,23,0,125, + 5,110,4,100,2,125,5,116,3,100,3,124,5,155,0,100, + 4,116,4,124,4,131,1,106,2,155,0,157,4,131,1,130, + 1,124,4,100,5,107,2,114,106,124,3,115,4,116,5,124, + 0,100,6,131,2,114,4,116,6,124,0,124,0,106,7,124, + 2,100,7,100,8,141,4,1,0,113,4,116,5,124,0,124, + 4,131,2,115,4,100,9,160,8,124,0,106,2,124,4,161, + 2,125,6,122,14,116,9,124,2,124,6,131,2,1,0,87, + 0,113,4,4,0,116,10,121,210,1,0,125,7,1,0,122, + 42,124,7,106,11,124,6,107,2,114,200,116,12,106,13,160, + 14,124,6,116,15,161,2,100,10,117,1,114,200,87,0,89, + 0,100,10,125,7,126,7,113,4,130,0,100,10,125,7,126, + 7,48,0,48,0,124,0,83,0,41,11,122,238,70,105,103, + 117,114,101,32,111,117,116,32,119,104,97,116,32,95,95,105, + 109,112,111,114,116,95,95,32,115,104,111,117,108,100,32,114, + 101,116,117,114,110,46,10,10,32,32,32,32,84,104,101,32, + 105,109,112,111,114,116,95,32,112,97,114,97,109,101,116,101, + 114,32,105,115,32,97,32,99,97,108,108,97,98,108,101,32, + 119,104,105,99,104,32,116,97,107,101,115,32,116,104,101,32, + 110,97,109,101,32,111,102,32,109,111,100,117,108,101,32,116, + 111,10,32,32,32,32,105,109,112,111,114,116,46,32,73,116, + 32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32, + 100,101,99,111,117,112,108,101,32,116,104,101,32,102,117,110, + 99,116,105,111,110,32,102,114,111,109,32,97,115,115,117,109, + 105,110,103,32,105,109,112,111,114,116,108,105,98,39,115,10, + 32,32,32,32,105,109,112,111,114,116,32,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,32,105,115,32,100,101,115, + 105,114,101,100,46,10,10,32,32,32,32,122,8,46,95,95, + 97,108,108,95,95,122,13,96,96,102,114,111,109,32,108,105, + 115,116,39,39,122,8,73,116,101,109,32,105,110,32,122,18, + 32,109,117,115,116,32,98,101,32,115,116,114,44,32,110,111, + 116,32,250,1,42,218,7,95,95,97,108,108,95,95,84,114, + 213,0,0,0,114,186,0,0,0,78,41,16,114,199,0,0, + 0,114,200,0,0,0,114,1,0,0,0,114,201,0,0,0, + 114,14,0,0,0,114,4,0,0,0,218,16,95,104,97,110, + 100,108,101,95,102,114,111,109,108,105,115,116,114,216,0,0, + 0,114,46,0,0,0,114,68,0,0,0,114,207,0,0,0, + 114,17,0,0,0,114,15,0,0,0,114,93,0,0,0,114, + 35,0,0,0,114,210,0,0,0,41,8,114,97,0,0,0, + 218,8,102,114,111,109,108,105,115,116,114,208,0,0,0,114, + 214,0,0,0,218,1,120,90,5,119,104,101,114,101,90,9, + 102,114,111,109,95,110,97,109,101,90,3,101,120,99,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,217,0, + 0,0,16,4,0,0,115,52,0,0,0,8,10,10,1,4, + 1,12,1,4,2,10,1,8,1,8,255,8,2,14,1,10, + 1,2,1,8,255,10,2,14,1,2,1,14,1,14,1,10, + 4,16,1,2,255,12,2,2,1,10,128,4,1,255,128,114, + 217,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,6,0,0,0,67,0,0,0,115,146,0, + 0,0,124,0,160,0,100,1,161,1,125,1,124,0,160,0, + 100,2,161,1,125,2,124,1,100,3,117,1,114,82,124,2, + 100,3,117,1,114,78,124,1,124,2,106,1,107,3,114,78, + 116,2,106,3,100,4,124,1,155,2,100,5,124,2,106,1, + 155,2,100,6,157,5,116,4,100,7,100,8,141,3,1,0, + 124,1,83,0,124,2,100,3,117,1,114,96,124,2,106,1, + 83,0,116,2,106,3,100,9,116,4,100,7,100,8,141,3, + 1,0,124,0,100,10,25,0,125,1,100,11,124,0,118,1, + 114,142,124,1,160,5,100,12,161,1,100,13,25,0,125,1, + 124,1,83,0,41,14,122,167,67,97,108,99,117,108,97,116, + 101,32,119,104,97,116,32,95,95,112,97,99,107,97,103,101, + 95,95,32,115,104,111,117,108,100,32,98,101,46,10,10,32, + 32,32,32,95,95,112,97,99,107,97,103,101,95,95,32,105, + 115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100, + 32,116,111,32,98,101,32,100,101,102,105,110,101,100,32,111, + 114,32,99,111,117,108,100,32,98,101,32,115,101,116,32,116, + 111,32,78,111,110,101,10,32,32,32,32,116,111,32,114,101, + 112,114,101,115,101,110,116,32,116,104,97,116,32,105,116,115, + 32,112,114,111,112,101,114,32,118,97,108,117,101,32,105,115, + 32,117,110,107,110,111,119,110,46,10,10,32,32,32,32,114, + 146,0,0,0,114,106,0,0,0,78,122,32,95,95,112,97, + 99,107,97,103,101,95,95,32,33,61,32,95,95,115,112,101, + 99,95,95,46,112,97,114,101,110,116,32,40,122,4,32,33, + 61,32,250,1,41,233,3,0,0,0,41,1,90,10,115,116, + 97,99,107,108,101,118,101,108,122,89,99,97,110,39,116,32, + 114,101,115,111,108,118,101,32,112,97,99,107,97,103,101,32, + 102,114,111,109,32,95,95,115,112,101,99,95,95,32,111,114, + 32,95,95,112,97,99,107,97,103,101,95,95,44,32,102,97, + 108,108,105,110,103,32,98,97,99,107,32,111,110,32,95,95, + 110,97,109,101,95,95,32,97,110,100,32,95,95,112,97,116, + 104,95,95,114,1,0,0,0,114,142,0,0,0,114,129,0, + 0,0,114,22,0,0,0,41,6,114,35,0,0,0,114,131, + 0,0,0,114,195,0,0,0,114,196,0,0,0,114,197,0, + 0,0,114,130,0,0,0,41,3,218,7,103,108,111,98,97, + 108,115,114,189,0,0,0,114,96,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,17,95,99,97, + 108,99,95,95,95,112,97,99,107,97,103,101,95,95,53,4, + 0,0,115,44,0,0,0,10,7,10,1,8,1,18,1,6, + 1,2,1,4,255,4,1,6,255,4,2,6,254,4,3,8, + 1,6,1,6,2,4,2,6,254,8,3,8,1,14,1,4, + 1,255,128,114,223,0,0,0,114,10,0,0,0,99,5,0, + 0,0,0,0,0,0,0,0,0,0,9,0,0,0,5,0, + 0,0,67,0,0,0,115,174,0,0,0,124,4,100,1,107, + 2,114,18,116,0,124,0,131,1,125,5,110,36,124,1,100, + 2,117,1,114,30,124,1,110,2,105,0,125,6,116,1,124, + 6,131,1,125,7,116,0,124,0,124,7,124,4,131,3,125, + 5,124,3,115,148,124,4,100,1,107,2,114,84,116,0,124, + 0,160,2,100,3,161,1,100,1,25,0,131,1,83,0,124, + 0,115,92,124,5,83,0,116,3,124,0,131,1,116,3,124, + 0,160,2,100,3,161,1,100,1,25,0,131,1,24,0,125, + 8,116,4,106,5,124,5,106,6,100,2,116,3,124,5,106, + 6,131,1,124,8,24,0,133,2,25,0,25,0,83,0,116, + 7,124,5,100,4,131,2,114,170,116,8,124,5,124,3,116, + 0,131,3,83,0,124,5,83,0,41,5,97,215,1,0,0, + 73,109,112,111,114,116,32,97,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,84,104,101,32,39,103,108,111,98,97, + 108,115,39,32,97,114,103,117,109,101,110,116,32,105,115,32, + 117,115,101,100,32,116,111,32,105,110,102,101,114,32,119,104, + 101,114,101,32,116,104,101,32,105,109,112,111,114,116,32,105, + 115,32,111,99,99,117,114,114,105,110,103,32,102,114,111,109, + 10,32,32,32,32,116,111,32,104,97,110,100,108,101,32,114, + 101,108,97,116,105,118,101,32,105,109,112,111,114,116,115,46, + 32,84,104,101,32,39,108,111,99,97,108,115,39,32,97,114, + 103,117,109,101,110,116,32,105,115,32,105,103,110,111,114,101, + 100,46,32,84,104,101,10,32,32,32,32,39,102,114,111,109, + 108,105,115,116,39,32,97,114,103,117,109,101,110,116,32,115, + 112,101,99,105,102,105,101,115,32,119,104,97,116,32,115,104, + 111,117,108,100,32,101,120,105,115,116,32,97,115,32,97,116, + 116,114,105,98,117,116,101,115,32,111,110,32,116,104,101,32, + 109,111,100,117,108,101,10,32,32,32,32,98,101,105,110,103, + 32,105,109,112,111,114,116,101,100,32,40,101,46,103,46,32, + 96,96,102,114,111,109,32,109,111,100,117,108,101,32,105,109, + 112,111,114,116,32,60,102,114,111,109,108,105,115,116,62,96, + 96,41,46,32,32,84,104,101,32,39,108,101,118,101,108,39, + 10,32,32,32,32,97,114,103,117,109,101,110,116,32,114,101, + 112,114,101,115,101,110,116,115,32,116,104,101,32,112,97,99, + 107,97,103,101,32,108,111,99,97,116,105,111,110,32,116,111, + 32,105,109,112,111,114,116,32,102,114,111,109,32,105,110,32, + 97,32,114,101,108,97,116,105,118,101,10,32,32,32,32,105, + 109,112,111,114,116,32,40,101,46,103,46,32,96,96,102,114, + 111,109,32,46,46,112,107,103,32,105,109,112,111,114,116,32, + 109,111,100,96,96,32,119,111,117,108,100,32,104,97,118,101, + 32,97,32,39,108,101,118,101,108,39,32,111,102,32,50,41, + 46,10,10,32,32,32,32,114,22,0,0,0,78,114,129,0, + 0,0,114,142,0,0,0,41,9,114,212,0,0,0,114,223, + 0,0,0,218,9,112,97,114,116,105,116,105,111,110,114,188, + 0,0,0,114,15,0,0,0,114,93,0,0,0,114,1,0, + 0,0,114,4,0,0,0,114,217,0,0,0,41,9,114,17, + 0,0,0,114,222,0,0,0,218,6,108,111,99,97,108,115, + 114,218,0,0,0,114,190,0,0,0,114,97,0,0,0,90, + 8,103,108,111,98,97,108,115,95,114,189,0,0,0,90,7, + 99,117,116,95,111,102,102,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,10,95,95,105,109,112,111,114,116, + 95,95,80,4,0,0,115,32,0,0,0,8,11,10,1,16, + 2,8,1,12,1,4,1,8,3,18,1,4,1,4,1,26, + 4,30,3,10,1,12,1,4,2,255,128,114,226,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, + 160,1,124,0,161,1,125,1,124,1,100,0,117,0,114,30, + 116,2,100,1,124,0,23,0,131,1,130,1,116,3,124,1, + 131,1,83,0,41,2,78,122,25,110,111,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,32,110,97,109,101, + 100,32,41,4,114,162,0,0,0,114,170,0,0,0,114,80, + 0,0,0,114,160,0,0,0,41,2,114,17,0,0,0,114, + 96,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,18,95,98,117,105,108,116,105,110,95,102,114, + 111,109,95,110,97,109,101,117,4,0,0,115,10,0,0,0, + 10,1,8,1,12,1,8,1,255,128,114,227,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, + 5,0,0,0,67,0,0,0,115,164,0,0,0,124,1,97, + 0,124,0,97,1,116,2,116,1,131,1,125,2,116,1,106, + 3,160,4,161,0,68,0,93,70,92,2,125,3,125,4,116, + 5,124,4,124,2,131,2,114,26,124,3,116,1,106,6,118, + 0,114,60,116,7,125,5,110,16,116,0,160,8,124,3,161, + 1,114,26,116,9,125,5,110,0,116,10,124,4,124,5,131, + 2,125,6,116,11,124,6,124,4,131,2,1,0,113,26,116, + 1,106,3,116,12,25,0,125,7,100,1,68,0,93,46,125, + 8,124,8,116,1,106,3,118,1,114,136,116,13,124,8,131, + 1,125,9,110,10,116,1,106,3,124,8,25,0,125,9,116, + 14,124,7,124,8,124,9,131,3,1,0,113,112,100,2,83, + 0,41,3,122,250,83,101,116,117,112,32,105,109,112,111,114, + 116,108,105,98,32,98,121,32,105,109,112,111,114,116,105,110, + 103,32,110,101,101,100,101,100,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,115,32,97,110,100,32,105,110, + 106,101,99,116,105,110,103,32,116,104,101,109,10,32,32,32, + 32,105,110,116,111,32,116,104,101,32,103,108,111,98,97,108, + 32,110,97,109,101,115,112,97,99,101,46,10,10,32,32,32, + 32,65,115,32,115,121,115,32,105,115,32,110,101,101,100,101, + 100,32,102,111,114,32,115,121,115,46,109,111,100,117,108,101, + 115,32,97,99,99,101,115,115,32,97,110,100,32,95,105,109, + 112,32,105,115,32,110,101,101,100,101,100,32,116,111,32,108, + 111,97,100,32,98,117,105,108,116,45,105,110,10,32,32,32, + 32,109,111,100,117,108,101,115,44,32,116,104,111,115,101,32, + 116,119,111,32,109,111,100,117,108,101,115,32,109,117,115,116, + 32,98,101,32,101,120,112,108,105,99,105,116,108,121,32,112, + 97,115,115,101,100,32,105,110,46,10,10,32,32,32,32,41, + 3,114,23,0,0,0,114,195,0,0,0,114,65,0,0,0, + 78,41,15,114,58,0,0,0,114,15,0,0,0,114,14,0, + 0,0,114,93,0,0,0,218,5,105,116,101,109,115,114,199, + 0,0,0,114,79,0,0,0,114,162,0,0,0,114,89,0, + 0,0,114,177,0,0,0,114,143,0,0,0,114,149,0,0, + 0,114,1,0,0,0,114,227,0,0,0,114,5,0,0,0, + 41,10,218,10,115,121,115,95,109,111,100,117,108,101,218,11, + 95,105,109,112,95,109,111,100,117,108,101,90,11,109,111,100, + 117,108,101,95,116,121,112,101,114,17,0,0,0,114,97,0, + 0,0,114,110,0,0,0,114,96,0,0,0,90,11,115,101, + 108,102,95,109,111,100,117,108,101,90,12,98,117,105,108,116, + 105,110,95,110,97,109,101,90,14,98,117,105,108,116,105,110, + 95,109,111,100,117,108,101,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,6,95,115,101,116,117,112,124,4, + 0,0,115,38,0,0,0,4,9,4,1,8,3,18,1,10, + 1,10,1,6,1,10,1,6,1,10,3,12,1,10,3,8, + 1,10,1,10,1,10,2,14,1,4,128,255,128,114,231,0, + 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 116,0,124,0,124,1,131,2,1,0,116,1,106,2,160,3, + 116,4,161,1,1,0,116,1,106,2,160,3,116,5,161,1, + 1,0,100,1,83,0,41,2,122,48,73,110,115,116,97,108, + 108,32,105,109,112,111,114,116,101,114,115,32,102,111,114,32, + 98,117,105,108,116,105,110,32,97,110,100,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,115,78,41,6,114,231,0, + 0,0,114,15,0,0,0,114,194,0,0,0,114,120,0,0, + 0,114,162,0,0,0,114,177,0,0,0,41,2,114,229,0, + 0,0,114,230,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,8,95,105,110,115,116,97,108,108, + 159,4,0,0,115,10,0,0,0,10,2,12,2,12,1,4, + 128,255,128,114,232,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, + 0,115,32,0,0,0,100,1,100,2,108,0,125,0,124,0, + 97,1,124,0,160,2,116,3,106,4,116,5,25,0,161,1, + 1,0,100,2,83,0,41,3,122,57,73,110,115,116,97,108, + 108,32,105,109,112,111,114,116,101,114,115,32,116,104,97,116, + 32,114,101,113,117,105,114,101,32,101,120,116,101,114,110,97, + 108,32,102,105,108,101,115,121,115,116,101,109,32,97,99,99, + 101,115,115,114,22,0,0,0,78,41,6,218,26,95,102,114, + 111,122,101,110,95,105,109,112,111,114,116,108,105,98,95,101, + 120,116,101,114,110,97,108,114,127,0,0,0,114,232,0,0, + 0,114,15,0,0,0,114,93,0,0,0,114,1,0,0,0, + 41,1,114,233,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,27,95,105,110,115,116,97,108,108, + 95,101,120,116,101,114,110,97,108,95,105,109,112,111,114,116, + 101,114,115,167,4,0,0,115,10,0,0,0,8,3,4,1, + 16,1,4,128,255,128,114,234,0,0,0,41,2,78,78,41, + 1,78,41,2,78,114,22,0,0,0,41,4,78,78,114,10, + 0,0,0,114,22,0,0,0,41,53,114,3,0,0,0,114, + 23,0,0,0,114,195,0,0,0,114,65,0,0,0,114,127, + 0,0,0,114,12,0,0,0,114,18,0,0,0,114,60,0, + 0,0,114,34,0,0,0,114,44,0,0,0,114,19,0,0, + 0,114,20,0,0,0,114,50,0,0,0,114,51,0,0,0, + 114,54,0,0,0,114,66,0,0,0,114,68,0,0,0,114, + 77,0,0,0,114,87,0,0,0,114,91,0,0,0,114,98, + 0,0,0,114,112,0,0,0,114,113,0,0,0,114,92,0, + 0,0,114,143,0,0,0,114,149,0,0,0,114,153,0,0, + 0,114,108,0,0,0,114,94,0,0,0,114,159,0,0,0, + 114,160,0,0,0,114,95,0,0,0,114,162,0,0,0,114, + 177,0,0,0,114,182,0,0,0,114,191,0,0,0,114,193, + 0,0,0,114,198,0,0,0,114,204,0,0,0,90,15,95, + 69,82,82,95,77,83,71,95,80,82,69,70,73,88,114,206, + 0,0,0,114,209,0,0,0,218,6,111,98,106,101,99,116, + 114,210,0,0,0,114,211,0,0,0,114,212,0,0,0,114, + 217,0,0,0,114,223,0,0,0,114,226,0,0,0,114,227, + 0,0,0,114,231,0,0,0,114,232,0,0,0,114,234,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,8,60,109,111,100,117,108,101,62, + 1,0,0,0,115,106,0,0,0,4,0,4,25,4,1,4, + 1,4,3,8,3,8,8,4,8,4,2,16,3,14,4,14, + 77,14,21,8,16,8,37,8,17,14,11,8,8,8,11,8, + 12,8,16,14,36,16,101,10,26,14,45,8,72,8,17,8, + 17,8,30,8,37,8,42,14,15,14,75,14,79,8,13,8, + 9,10,9,8,47,4,16,8,1,8,2,6,32,8,3,10, + 16,14,15,8,37,10,27,8,37,8,7,8,35,8,8,4, + 128,255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 58b53d9526ec48..bf272428b49b92 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -996,9 +996,9 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, 2,90,4,100,3,90,5,101,6,111,30,100,4,101,7,118, 0,90,8,101,9,100,5,100,6,132,0,131,1,90,10,101, - 9,100,7,100,8,132,0,131,1,90,11,101,9,100,14,100, - 10,100,11,132,1,131,1,90,12,101,9,100,15,100,12,100, - 13,132,1,131,1,90,13,100,9,83,0,41,16,218,21,87, + 11,100,7,100,8,132,0,131,1,90,12,101,11,100,14,100, + 10,100,11,132,1,131,1,90,13,101,11,100,15,100,12,100, + 13,132,1,131,1,90,14,100,9,83,0,41,16,218,21,87, 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, 110,100,101,114,122,62,77,101,116,97,32,112,97,116,104,32, 102,105,110,100,101,114,32,102,111,114,32,109,111,100,117,108, @@ -1012,1659 +1012,1659 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, 108,101,115,92,123,102,117,108,108,110,97,109,101,125,92,68, - 101,98,117,103,122,6,95,100,46,112,121,100,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,8,0,0, + 101,98,117,103,122,6,95,100,46,112,121,100,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, 0,67,0,0,0,115,50,0,0,0,122,16,116,0,160,1, - 116,0,106,2,124,1,161,2,87,0,83,0,4,0,116,3, + 116,0,106,2,124,0,161,2,87,0,83,0,4,0,116,3, 121,48,1,0,1,0,1,0,116,0,160,1,116,0,106,4, - 124,1,161,2,6,0,89,0,83,0,48,0,114,114,0,0, + 124,0,161,2,6,0,89,0,83,0,48,0,114,114,0,0, 0,41,5,218,6,119,105,110,114,101,103,90,7,79,112,101, 110,75,101,121,90,17,72,75,69,89,95,67,85,82,82,69, 78,84,95,85,83,69,82,114,58,0,0,0,90,18,72,75, 69,89,95,76,79,67,65,76,95,77,65,67,72,73,78,69, - 41,2,218,3,99,108,115,114,20,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,14,95,111,112, - 101,110,95,114,101,103,105,115,116,114,121,245,2,0,0,115, - 10,0,0,0,2,2,16,1,12,1,20,1,255,128,122,36, - 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,2,0,0,0,0,0,0,0,0,0,0, - 0,6,0,0,0,8,0,0,0,67,0,0,0,115,130,0, - 0,0,124,0,106,0,114,14,124,0,106,1,125,2,110,6, - 124,0,106,2,125,2,124,2,106,3,124,1,100,1,116,4, - 106,5,100,0,100,2,133,2,25,0,22,0,100,3,141,2, - 125,3,122,60,124,0,160,6,124,3,161,1,143,28,125,4, - 116,7,160,8,124,4,100,4,161,2,125,5,87,0,100,0, - 4,0,4,0,131,3,1,0,110,16,49,0,115,94,48,0, - 1,0,1,0,1,0,89,0,1,0,87,0,124,5,83,0, - 4,0,116,9,121,128,1,0,1,0,1,0,89,0,100,0, - 83,0,48,0,41,5,78,122,5,37,100,46,37,100,114,39, - 0,0,0,41,2,114,143,0,0,0,90,11,115,121,115,95, - 118,101,114,115,105,111,110,114,10,0,0,0,41,10,218,11, - 68,69,66,85,71,95,66,85,73,76,68,218,18,82,69,71, - 73,83,84,82,89,95,75,69,89,95,68,69,66,85,71,218, - 12,82,69,71,73,83,84,82,89,95,75,69,89,114,70,0, - 0,0,114,15,0,0,0,218,12,118,101,114,115,105,111,110, - 95,105,110,102,111,114,198,0,0,0,114,196,0,0,0,90, - 10,81,117,101,114,121,86,97,108,117,101,114,58,0,0,0, - 41,6,114,197,0,0,0,114,143,0,0,0,90,12,114,101, - 103,105,115,116,114,121,95,107,101,121,114,20,0,0,0,90, - 4,104,107,101,121,218,8,102,105,108,101,112,97,116,104,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,16, - 95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,121, - 252,2,0,0,115,26,0,0,0,6,2,8,1,6,2,6, - 1,16,1,6,255,2,2,12,1,44,1,4,3,12,254,8, - 1,255,128,122,38,87,105,110,100,111,119,115,82,101,103,105, - 115,116,114,121,70,105,110,100,101,114,46,95,115,101,97,114, - 99,104,95,114,101,103,105,115,116,114,121,78,99,4,0,0, - 0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0, - 0,67,0,0,0,115,118,0,0,0,124,0,160,0,124,1, - 161,1,125,4,124,4,100,0,117,0,114,22,100,0,83,0, - 122,12,116,1,124,4,131,1,1,0,87,0,110,20,4,0, - 116,2,121,54,1,0,1,0,1,0,89,0,100,0,83,0, - 48,0,116,3,131,0,68,0,93,50,92,2,125,5,125,6, - 124,4,160,4,116,5,124,6,131,1,161,1,114,62,116,6, - 106,7,124,1,124,5,124,1,124,4,131,2,124,4,100,1, - 141,3,125,7,124,7,2,0,1,0,83,0,100,0,83,0, - 41,2,78,114,184,0,0,0,41,8,114,204,0,0,0,114, - 57,0,0,0,114,58,0,0,0,114,188,0,0,0,114,115, - 0,0,0,114,116,0,0,0,114,139,0,0,0,218,16,115, - 112,101,99,95,102,114,111,109,95,108,111,97,100,101,114,41, - 8,114,197,0,0,0,114,143,0,0,0,114,52,0,0,0, - 218,6,116,97,114,103,101,116,114,203,0,0,0,114,144,0, - 0,0,114,193,0,0,0,114,191,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,9,102,105,110, - 100,95,115,112,101,99,11,3,0,0,115,32,0,0,0,10, - 2,8,1,4,1,2,1,12,1,12,1,8,1,14,1,14, - 1,6,1,8,1,2,1,6,254,8,3,4,128,255,128,122, - 31,87,105,110,100,111,119,115,82,101,103,105,115,116,114,121, - 70,105,110,100,101,114,46,102,105,110,100,95,115,112,101,99, - 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,30,0,0,0,124,0, - 160,0,124,1,124,2,161,2,125,3,124,3,100,1,117,1, - 114,26,124,3,106,1,83,0,100,1,83,0,41,2,122,108, - 70,105,110,100,32,109,111,100,117,108,101,32,110,97,109,101, - 100,32,105,110,32,116,104,101,32,114,101,103,105,115,116,114, - 121,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, - 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, - 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99, - 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, - 100,46,10,10,32,32,32,32,32,32,32,32,78,169,2,114, - 207,0,0,0,114,144,0,0,0,169,4,114,197,0,0,0, - 114,143,0,0,0,114,52,0,0,0,114,191,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11, - 102,105,110,100,95,109,111,100,117,108,101,27,3,0,0,115, - 10,0,0,0,12,7,8,1,6,1,4,2,255,128,122,33, - 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, - 105,110,100,101,114,46,102,105,110,100,95,109,111,100,117,108, - 101,41,2,78,78,41,1,78,41,14,114,130,0,0,0,114, - 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,201, - 0,0,0,114,200,0,0,0,218,11,95,77,83,95,87,73, - 78,68,79,87,83,218,18,69,88,84,69,78,83,73,79,78, - 95,83,85,70,70,73,88,69,83,114,199,0,0,0,218,11, - 99,108,97,115,115,109,101,116,104,111,100,114,198,0,0,0, - 114,204,0,0,0,114,207,0,0,0,114,210,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,195,0,0,0,233,2,0,0,115,32,0,0, - 0,8,0,4,2,2,3,2,255,2,4,2,255,12,3,2, - 2,10,1,2,6,10,1,2,14,12,1,2,15,16,1,255, - 128,114,195,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, - 48,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, - 100,10,83,0,41,11,218,13,95,76,111,97,100,101,114,66, - 97,115,105,99,115,122,83,66,97,115,101,32,99,108,97,115, - 115,32,111,102,32,99,111,109,109,111,110,32,99,111,100,101, - 32,110,101,101,100,101,100,32,98,121,32,98,111,116,104,32, - 83,111,117,114,99,101,76,111,97,100,101,114,32,97,110,100, - 10,32,32,32,32,83,111,117,114,99,101,108,101,115,115,70, - 105,108,101,76,111,97,100,101,114,46,99,2,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,67, - 0,0,0,115,64,0,0,0,116,0,124,0,160,1,124,1, - 161,1,131,1,100,1,25,0,125,2,124,2,160,2,100,2, - 100,1,161,2,100,3,25,0,125,3,124,1,160,3,100,2, - 161,1,100,4,25,0,125,4,124,3,100,5,107,2,111,62, - 124,4,100,5,107,3,83,0,41,7,122,141,67,111,110,99, - 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, - 97,100,101,114,46,105,115,95,112,97,99,107,97,103,101,32, - 98,121,32,99,104,101,99,107,105,110,103,32,105,102,10,32, - 32,32,32,32,32,32,32,116,104,101,32,112,97,116,104,32, - 114,101,116,117,114,110,101,100,32,98,121,32,103,101,116,95, - 102,105,108,101,110,97,109,101,32,104,97,115,32,97,32,102, - 105,108,101,110,97,109,101,32,111,102,32,39,95,95,105,110, - 105,116,95,95,46,112,121,39,46,114,3,0,0,0,114,79, - 0,0,0,114,0,0,0,0,114,39,0,0,0,218,8,95, - 95,105,110,105,116,95,95,78,41,4,114,55,0,0,0,114, - 183,0,0,0,114,51,0,0,0,114,49,0,0,0,41,5, - 114,123,0,0,0,114,143,0,0,0,114,101,0,0,0,90, - 13,102,105,108,101,110,97,109,101,95,98,97,115,101,90,9, - 116,97,105,108,95,110,97,109,101,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,186,0,0,0,46,3,0, - 0,115,10,0,0,0,18,3,16,1,14,1,16,1,255,128, - 122,24,95,76,111,97,100,101,114,66,97,115,105,99,115,46, - 105,115,95,112,97,99,107,97,103,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,169,2,122,42, - 85,115,101,32,100,101,102,97,117,108,116,32,115,101,109,97, - 110,116,105,99,115,32,102,111,114,32,109,111,100,117,108,101, - 32,99,114,101,97,116,105,111,110,46,78,114,7,0,0,0, - 169,2,114,123,0,0,0,114,191,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,13,99,114,101, - 97,116,101,95,109,111,100,117,108,101,54,3,0,0,115,4, - 0,0,0,4,128,255,128,122,27,95,76,111,97,100,101,114, - 66,97,115,105,99,115,46,99,114,101,97,116,101,95,109,111, - 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,5,0,0,0,67,0,0,0,115,56,0, - 0,0,124,0,160,0,124,1,106,1,161,1,125,2,124,2, - 100,1,117,0,114,36,116,2,100,2,160,3,124,1,106,1, - 161,1,131,1,130,1,116,4,160,5,116,6,124,2,124,1, - 106,7,161,3,1,0,100,1,83,0,41,3,122,19,69,120, - 101,99,117,116,101,32,116,104,101,32,109,111,100,117,108,101, - 46,78,122,52,99,97,110,110,111,116,32,108,111,97,100,32, - 109,111,100,117,108,101,32,123,33,114,125,32,119,104,101,110, - 32,103,101,116,95,99,111,100,101,40,41,32,114,101,116,117, - 114,110,115,32,78,111,110,101,41,8,218,8,103,101,116,95, - 99,111,100,101,114,130,0,0,0,114,122,0,0,0,114,70, - 0,0,0,114,139,0,0,0,218,25,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,218,4,101,120,101,99,114,136,0,0,0,41,3, - 114,123,0,0,0,218,6,109,111,100,117,108,101,114,168,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,101,120,101,99,95,109,111,100,117,108,101,57,3, - 0,0,115,16,0,0,0,12,2,8,1,6,1,4,1,6, - 255,16,2,4,128,255,128,122,25,95,76,111,97,100,101,114, - 66,97,115,105,99,115,46,101,120,101,99,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,67,0,0,0,115,12,0,0,0, - 116,0,160,1,124,0,124,1,161,2,83,0,41,2,122,26, - 84,104,105,115,32,109,111,100,117,108,101,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,78,41,2,114,139,0, - 0,0,218,17,95,108,111,97,100,95,109,111,100,117,108,101, - 95,115,104,105,109,169,2,114,123,0,0,0,114,143,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,11,108,111,97,100,95,109,111,100,117,108,101,65,3,0, - 0,115,4,0,0,0,12,2,255,128,122,25,95,76,111,97, - 100,101,114,66,97,115,105,99,115,46,108,111,97,100,95,109, - 111,100,117,108,101,78,41,8,114,130,0,0,0,114,129,0, - 0,0,114,131,0,0,0,114,132,0,0,0,114,186,0,0, - 0,114,218,0,0,0,114,223,0,0,0,114,226,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,214,0,0,0,41,3,0,0,115,14,0, - 0,0,8,0,4,2,8,3,8,8,8,3,12,8,255,128, - 114,214,0,0,0,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,74, - 0,0,0,101,0,90,1,100,0,90,2,100,1,100,2,132, - 0,90,3,100,3,100,4,132,0,90,4,100,5,100,6,132, - 0,90,5,100,7,100,8,132,0,90,6,100,9,100,10,132, - 0,90,7,100,11,100,12,156,1,100,13,100,14,132,2,90, - 8,100,15,100,16,132,0,90,9,100,17,83,0,41,18,218, - 12,83,111,117,114,99,101,76,111,97,100,101,114,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,116,0,130,1,41, - 2,122,165,79,112,116,105,111,110,97,108,32,109,101,116,104, - 111,100,32,116,104,97,116,32,114,101,116,117,114,110,115,32, - 116,104,101,32,109,111,100,105,102,105,99,97,116,105,111,110, - 32,116,105,109,101,32,40,97,110,32,105,110,116,41,32,102, - 111,114,32,116,104,101,10,32,32,32,32,32,32,32,32,115, - 112,101,99,105,102,105,101,100,32,112,97,116,104,32,40,97, - 32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,32, - 82,97,105,115,101,115,32,79,83,69,114,114,111,114,32,119, - 104,101,110,32,116,104,101,32,112,97,116,104,32,99,97,110, - 110,111,116,32,98,101,32,104,97,110,100,108,101,100,46,10, - 32,32,32,32,32,32,32,32,78,41,1,114,58,0,0,0, - 169,2,114,123,0,0,0,114,52,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,10,112,97,116, - 104,95,109,116,105,109,101,72,3,0,0,115,4,0,0,0, - 4,6,255,128,122,23,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,0,0,0,0,2,0,0,0,4,0, - 0,0,67,0,0,0,115,14,0,0,0,100,1,124,0,160, - 0,124,1,161,1,105,1,83,0,41,3,97,158,1,0,0, - 79,112,116,105,111,110,97,108,32,109,101,116,104,111,100,32, - 114,101,116,117,114,110,105,110,103,32,97,32,109,101,116,97, - 100,97,116,97,32,100,105,99,116,32,102,111,114,32,116,104, - 101,32,115,112,101,99,105,102,105,101,100,10,32,32,32,32, - 32,32,32,32,112,97,116,104,32,40,97,32,115,116,114,41, - 46,10,10,32,32,32,32,32,32,32,32,80,111,115,115,105, - 98,108,101,32,107,101,121,115,58,10,32,32,32,32,32,32, - 32,32,45,32,39,109,116,105,109,101,39,32,40,109,97,110, - 100,97,116,111,114,121,41,32,105,115,32,116,104,101,32,110, - 117,109,101,114,105,99,32,116,105,109,101,115,116,97,109,112, - 32,111,102,32,108,97,115,116,32,115,111,117,114,99,101,10, - 32,32,32,32,32,32,32,32,32,32,99,111,100,101,32,109, - 111,100,105,102,105,99,97,116,105,111,110,59,10,32,32,32, - 32,32,32,32,32,45,32,39,115,105,122,101,39,32,40,111, - 112,116,105,111,110,97,108,41,32,105,115,32,116,104,101,32, - 115,105,122,101,32,105,110,32,98,121,116,101,115,32,111,102, - 32,116,104,101,32,115,111,117,114,99,101,32,99,111,100,101, - 46,10,10,32,32,32,32,32,32,32,32,73,109,112,108,101, - 109,101,110,116,105,110,103,32,116,104,105,115,32,109,101,116, - 104,111,100,32,97,108,108,111,119,115,32,116,104,101,32,108, - 111,97,100,101,114,32,116,111,32,114,101,97,100,32,98,121, - 116,101,99,111,100,101,32,102,105,108,101,115,46,10,32,32, - 32,32,32,32,32,32,82,97,105,115,101,115,32,79,83,69, - 114,114,111,114,32,119,104,101,110,32,116,104,101,32,112,97, - 116,104,32,99,97,110,110,111,116,32,98,101,32,104,97,110, - 100,108,101,100,46,10,32,32,32,32,32,32,32,32,114,173, - 0,0,0,78,41,1,114,229,0,0,0,114,228,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 10,112,97,116,104,95,115,116,97,116,115,80,3,0,0,115, - 4,0,0,0,14,12,255,128,122,23,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,0,0,0,0,4,0, - 0,0,4,0,0,0,67,0,0,0,115,12,0,0,0,124, - 0,160,0,124,2,124,3,161,2,83,0,41,2,122,228,79, - 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,119, - 104,105,99,104,32,119,114,105,116,101,115,32,100,97,116,97, - 32,40,98,121,116,101,115,41,32,116,111,32,97,32,102,105, - 108,101,32,112,97,116,104,32,40,97,32,115,116,114,41,46, - 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, - 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, - 111,100,32,97,108,108,111,119,115,32,102,111,114,32,116,104, - 101,32,119,114,105,116,105,110,103,32,111,102,32,98,121,116, - 101,99,111,100,101,32,102,105,108,101,115,46,10,10,32,32, - 32,32,32,32,32,32,84,104,101,32,115,111,117,114,99,101, - 32,112,97,116,104,32,105,115,32,110,101,101,100,101,100,32, - 105,110,32,111,114,100,101,114,32,116,111,32,99,111,114,114, - 101,99,116,108,121,32,116,114,97,110,115,102,101,114,32,112, - 101,114,109,105,115,115,105,111,110,115,10,32,32,32,32,32, - 32,32,32,78,41,1,218,8,115,101,116,95,100,97,116,97, - 41,4,114,123,0,0,0,114,112,0,0,0,90,10,99,97, - 99,104,101,95,112,97,116,104,114,37,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,15,95,99, - 97,99,104,101,95,98,121,116,101,99,111,100,101,94,3,0, - 0,115,4,0,0,0,12,8,255,128,122,28,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,0,0,0,0,3,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,150,79,112, - 116,105,111,110,97,108,32,109,101,116,104,111,100,32,119,104, - 105,99,104,32,119,114,105,116,101,115,32,100,97,116,97,32, - 40,98,121,116,101,115,41,32,116,111,32,97,32,102,105,108, - 101,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, - 10,32,32,32,32,32,32,32,32,73,109,112,108,101,109,101, - 110,116,105,110,103,32,116,104,105,115,32,109,101,116,104,111, - 100,32,97,108,108,111,119,115,32,102,111,114,32,116,104,101, - 32,119,114,105,116,105,110,103,32,111,102,32,98,121,116,101, - 99,111,100,101,32,102,105,108,101,115,46,10,32,32,32,32, - 32,32,32,32,78,114,7,0,0,0,41,3,114,123,0,0, - 0,114,52,0,0,0,114,37,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,231,0,0,0,104, - 3,0,0,115,4,0,0,0,4,128,255,128,122,21,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,0,0,0,0, - 5,0,0,0,10,0,0,0,67,0,0,0,115,70,0,0, - 0,124,0,160,0,124,1,161,1,125,2,122,20,124,0,160, - 1,124,2,161,1,125,3,87,0,116,4,124,3,131,1,83, - 0,4,0,116,2,121,68,1,0,125,4,1,0,122,14,116, - 3,100,1,124,1,100,2,141,2,124,4,130,2,100,3,125, - 4,126,4,48,0,48,0,41,4,122,52,67,111,110,99,114, - 101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,105, - 111,110,32,111,102,32,73,110,115,112,101,99,116,76,111,97, - 100,101,114,46,103,101,116,95,115,111,117,114,99,101,46,122, - 39,115,111,117,114,99,101,32,110,111,116,32,97,118,97,105, - 108,97,98,108,101,32,116,104,114,111,117,103,104,32,103,101, - 116,95,100,97,116,97,40,41,114,120,0,0,0,78,41,5, - 114,183,0,0,0,218,8,103,101,116,95,100,97,116,97,114, - 58,0,0,0,114,122,0,0,0,114,180,0,0,0,41,5, - 114,123,0,0,0,114,143,0,0,0,114,52,0,0,0,114, - 178,0,0,0,218,3,101,120,99,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,10,103,101,116,95,115,111, - 117,114,99,101,111,3,0,0,115,24,0,0,0,10,2,2, - 1,12,1,8,4,14,253,4,1,2,1,4,255,2,1,2, - 255,10,128,255,128,122,23,83,111,117,114,99,101,76,111,97, - 100,101,114,46,103,101,116,95,115,111,117,114,99,101,114,109, - 0,0,0,41,1,218,9,95,111,112,116,105,109,105,122,101, - 99,3,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,8,0,0,0,67,0,0,0,115,22,0,0,0,116,0, - 106,1,116,2,124,1,124,2,100,1,100,2,124,3,100,3, - 141,6,83,0,41,5,122,130,82,101,116,117,114,110,32,116, - 104,101,32,99,111,100,101,32,111,98,106,101,99,116,32,99, - 111,109,112,105,108,101,100,32,102,114,111,109,32,115,111,117, - 114,99,101,46,10,10,32,32,32,32,32,32,32,32,84,104, - 101,32,39,100,97,116,97,39,32,97,114,103,117,109,101,110, - 116,32,99,97,110,32,98,101,32,97,110,121,32,111,98,106, - 101,99,116,32,116,121,112,101,32,116,104,97,116,32,99,111, - 109,112,105,108,101,40,41,32,115,117,112,112,111,114,116,115, - 46,10,32,32,32,32,32,32,32,32,114,221,0,0,0,84, - 41,2,218,12,100,111,110,116,95,105,110,104,101,114,105,116, - 114,89,0,0,0,78,41,3,114,139,0,0,0,114,220,0, - 0,0,218,7,99,111,109,112,105,108,101,41,4,114,123,0, - 0,0,114,37,0,0,0,114,52,0,0,0,114,236,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,14,115,111,117,114,99,101,95,116,111,95,99,111,100,101, - 121,3,0,0,115,8,0,0,0,12,5,4,1,6,255,255, - 128,122,27,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,0,0,0,0,15,0,0,0,9, - 0,0,0,67,0,0,0,115,28,2,0,0,124,0,160,0, - 124,1,161,1,125,2,100,1,125,3,100,1,125,4,100,1, - 125,5,100,2,125,6,100,3,125,7,122,12,116,1,124,2, - 131,1,125,8,87,0,110,24,4,0,116,2,121,66,1,0, - 1,0,1,0,100,1,125,8,89,0,144,1,110,42,48,0, - 122,14,124,0,160,3,124,2,161,1,125,9,87,0,110,20, - 4,0,116,4,121,102,1,0,1,0,1,0,89,0,144,1, - 110,6,48,0,116,5,124,9,100,4,25,0,131,1,125,3, - 122,14,124,0,160,6,124,8,161,1,125,10,87,0,110,18, - 4,0,116,4,121,148,1,0,1,0,1,0,89,0,110,216, - 48,0,124,1,124,8,100,5,156,2,125,11,122,148,116,7, - 124,10,124,1,124,11,131,3,125,12,116,8,124,10,131,1, - 100,6,100,1,133,2,25,0,125,13,124,12,100,7,64,0, - 100,8,107,3,125,6,124,6,144,1,114,30,124,12,100,9, - 64,0,100,8,107,3,125,7,116,9,106,10,100,10,107,3, - 144,1,114,50,124,7,115,248,116,9,106,10,100,11,107,2, - 144,1,114,50,124,0,160,6,124,2,161,1,125,4,116,9, - 160,11,116,12,124,4,161,2,125,5,116,13,124,10,124,5, - 124,1,124,11,131,4,1,0,110,20,116,14,124,10,124,3, - 124,9,100,12,25,0,124,1,124,11,131,5,1,0,87,0, - 110,24,4,0,116,15,116,16,102,2,144,1,121,76,1,0, - 1,0,1,0,89,0,110,32,48,0,116,17,160,18,100,13, - 124,8,124,2,161,3,1,0,116,19,124,13,124,1,124,8, - 124,2,100,14,141,4,83,0,124,4,100,1,117,0,144,1, - 114,128,124,0,160,6,124,2,161,1,125,4,124,0,160,20, - 124,4,124,2,161,2,125,14,116,17,160,18,100,15,124,2, - 161,2,1,0,116,21,106,22,144,2,115,24,124,8,100,1, - 117,1,144,2,114,24,124,3,100,1,117,1,144,2,114,24, - 124,6,144,1,114,220,124,5,100,1,117,0,144,1,114,206, - 116,9,160,11,124,4,161,1,125,5,116,23,124,14,124,5, - 124,7,131,3,125,10,110,16,116,24,124,14,124,3,116,25, - 124,4,131,1,131,3,125,10,122,20,124,0,160,26,124,2, - 124,8,124,10,161,3,1,0,87,0,124,14,83,0,4,0, - 116,2,144,2,121,22,1,0,1,0,1,0,89,0,124,14, - 83,0,48,0,124,14,83,0,41,16,122,190,67,111,110,99, - 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, - 97,100,101,114,46,103,101,116,95,99,111,100,101,46,10,10, - 32,32,32,32,32,32,32,32,82,101,97,100,105,110,103,32, - 111,102,32,98,121,116,101,99,111,100,101,32,114,101,113,117, - 105,114,101,115,32,112,97,116,104,95,115,116,97,116,115,32, - 116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101, - 100,46,32,84,111,32,119,114,105,116,101,10,32,32,32,32, - 32,32,32,32,98,121,116,101,99,111,100,101,44,32,115,101, - 116,95,100,97,116,97,32,109,117,115,116,32,97,108,115,111, - 32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,46, - 10,10,32,32,32,32,32,32,32,32,78,70,84,114,173,0, - 0,0,114,163,0,0,0,114,149,0,0,0,114,3,0,0, - 0,114,0,0,0,0,114,39,0,0,0,90,5,110,101,118, - 101,114,90,6,97,108,119,97,121,115,218,4,115,105,122,101, - 122,13,123,125,32,109,97,116,99,104,101,115,32,123,125,41, - 3,114,121,0,0,0,114,111,0,0,0,114,112,0,0,0, - 122,19,99,111,100,101,32,111,98,106,101,99,116,32,102,114, - 111,109,32,123,125,41,27,114,183,0,0,0,114,102,0,0, - 0,114,88,0,0,0,114,230,0,0,0,114,58,0,0,0, - 114,30,0,0,0,114,233,0,0,0,114,156,0,0,0,218, - 10,109,101,109,111,114,121,118,105,101,119,114,167,0,0,0, - 90,21,99,104,101,99,107,95,104,97,115,104,95,98,97,115, - 101,100,95,112,121,99,115,114,161,0,0,0,218,17,95,82, - 65,87,95,77,65,71,73,67,95,78,85,77,66,69,82,114, - 162,0,0,0,114,160,0,0,0,114,122,0,0,0,114,154, - 0,0,0,114,139,0,0,0,114,153,0,0,0,114,169,0, - 0,0,114,239,0,0,0,114,15,0,0,0,218,19,100,111, - 110,116,95,119,114,105,116,101,95,98,121,116,101,99,111,100, - 101,114,175,0,0,0,114,174,0,0,0,114,4,0,0,0, - 114,232,0,0,0,41,15,114,123,0,0,0,114,143,0,0, - 0,114,112,0,0,0,114,158,0,0,0,114,178,0,0,0, - 114,161,0,0,0,90,10,104,97,115,104,95,98,97,115,101, - 100,90,12,99,104,101,99,107,95,115,111,117,114,99,101,114, - 111,0,0,0,218,2,115,116,114,37,0,0,0,114,155,0, - 0,0,114,16,0,0,0,90,10,98,121,116,101,115,95,100, - 97,116,97,90,11,99,111,100,101,95,111,98,106,101,99,116, + 114,19,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,14,95,111,112,101,110,95,114,101,103,105, + 115,116,114,121,245,2,0,0,115,10,0,0,0,2,2,16, + 1,12,1,20,1,255,128,122,36,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,2,0, + 0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0, + 0,0,67,0,0,0,115,130,0,0,0,124,0,106,0,114, + 14,124,0,106,1,125,2,110,6,124,0,106,2,125,2,124, + 2,106,3,124,1,100,1,116,4,106,5,100,0,100,2,133, + 2,25,0,22,0,100,3,141,2,125,3,122,60,124,0,160, + 6,124,3,161,1,143,28,125,4,116,7,160,8,124,4,100, + 4,161,2,125,5,87,0,100,0,4,0,4,0,131,3,1, + 0,110,16,49,0,115,94,48,0,1,0,1,0,1,0,89, + 0,1,0,87,0,124,5,83,0,4,0,116,9,121,128,1, + 0,1,0,1,0,89,0,100,0,83,0,48,0,41,5,78, + 122,5,37,100,46,37,100,114,39,0,0,0,41,2,114,143, + 0,0,0,90,11,115,121,115,95,118,101,114,115,105,111,110, + 114,10,0,0,0,41,10,218,11,68,69,66,85,71,95,66, + 85,73,76,68,218,18,82,69,71,73,83,84,82,89,95,75, + 69,89,95,68,69,66,85,71,218,12,82,69,71,73,83,84, + 82,89,95,75,69,89,114,70,0,0,0,114,15,0,0,0, + 218,12,118,101,114,115,105,111,110,95,105,110,102,111,114,197, + 0,0,0,114,196,0,0,0,90,10,81,117,101,114,121,86, + 97,108,117,101,114,58,0,0,0,41,6,218,3,99,108,115, + 114,143,0,0,0,90,12,114,101,103,105,115,116,114,121,95, + 107,101,121,114,20,0,0,0,90,4,104,107,101,121,218,8, + 102,105,108,101,112,97,116,104,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,16,95,115,101,97,114,99,104, + 95,114,101,103,105,115,116,114,121,252,2,0,0,115,26,0, + 0,0,6,2,8,1,6,2,6,1,16,1,6,255,2,2, + 12,1,44,1,4,3,12,254,8,1,255,128,122,38,87,105, + 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, + 100,101,114,46,95,115,101,97,114,99,104,95,114,101,103,105, + 115,116,114,121,78,99,4,0,0,0,0,0,0,0,0,0, + 0,0,8,0,0,0,8,0,0,0,67,0,0,0,115,118, + 0,0,0,124,0,160,0,124,1,161,1,125,4,124,4,100, + 0,117,0,114,22,100,0,83,0,122,12,116,1,124,4,131, + 1,1,0,87,0,110,20,4,0,116,2,121,54,1,0,1, + 0,1,0,89,0,100,0,83,0,48,0,116,3,131,0,68, + 0,93,50,92,2,125,5,125,6,124,4,160,4,116,5,124, + 6,131,1,161,1,114,62,116,6,106,7,124,1,124,5,124, + 1,124,4,131,2,124,4,100,1,141,3,125,7,124,7,2, + 0,1,0,83,0,100,0,83,0,41,2,78,114,184,0,0, + 0,41,8,114,204,0,0,0,114,57,0,0,0,114,58,0, + 0,0,114,188,0,0,0,114,115,0,0,0,114,116,0,0, + 0,114,139,0,0,0,218,16,115,112,101,99,95,102,114,111, + 109,95,108,111,97,100,101,114,41,8,114,202,0,0,0,114, + 143,0,0,0,114,52,0,0,0,218,6,116,97,114,103,101, + 116,114,203,0,0,0,114,144,0,0,0,114,193,0,0,0, + 114,191,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,9,102,105,110,100,95,115,112,101,99,11, + 3,0,0,115,32,0,0,0,10,2,8,1,4,1,2,1, + 12,1,12,1,8,1,14,1,14,1,6,1,8,1,2,1, + 6,254,8,3,4,128,255,128,122,31,87,105,110,100,111,119, + 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, + 102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, + 0,0,115,30,0,0,0,124,0,160,0,124,1,124,2,161, + 2,125,3,124,3,100,1,117,1,114,26,124,3,106,1,83, + 0,100,1,83,0,41,2,122,108,70,105,110,100,32,109,111, + 100,117,108,101,32,110,97,109,101,100,32,105,110,32,116,104, + 101,32,114,101,103,105,115,116,114,121,46,10,10,32,32,32, + 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, + 32,32,32,32,32,78,169,2,114,207,0,0,0,114,144,0, + 0,0,169,4,114,202,0,0,0,114,143,0,0,0,114,52, + 0,0,0,114,191,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,11,102,105,110,100,95,109,111, + 100,117,108,101,27,3,0,0,115,10,0,0,0,12,7,8, + 1,6,1,4,2,255,128,122,33,87,105,110,100,111,119,115, + 82,101,103,105,115,116,114,121,70,105,110,100,101,114,46,102, + 105,110,100,95,109,111,100,117,108,101,41,2,78,78,41,1, + 78,41,15,114,130,0,0,0,114,129,0,0,0,114,131,0, + 0,0,114,132,0,0,0,114,200,0,0,0,114,199,0,0, + 0,218,11,95,77,83,95,87,73,78,68,79,87,83,218,18, + 69,88,84,69,78,83,73,79,78,95,83,85,70,70,73,88, + 69,83,114,198,0,0,0,218,12,115,116,97,116,105,99,109, + 101,116,104,111,100,114,197,0,0,0,218,11,99,108,97,115, + 115,109,101,116,104,111,100,114,204,0,0,0,114,207,0,0, + 0,114,210,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,195,0,0,0,233, + 2,0,0,115,32,0,0,0,8,0,4,2,2,3,2,255, + 2,4,2,255,12,3,2,2,10,1,2,6,10,1,2,14, + 12,1,2,15,16,1,255,128,114,195,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,64,0,0,0,115,48,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,100, + 8,100,9,132,0,90,7,100,10,83,0,41,11,218,13,95, + 76,111,97,100,101,114,66,97,115,105,99,115,122,83,66,97, + 115,101,32,99,108,97,115,115,32,111,102,32,99,111,109,109, + 111,110,32,99,111,100,101,32,110,101,101,100,101,100,32,98, + 121,32,98,111,116,104,32,83,111,117,114,99,101,76,111,97, + 100,101,114,32,97,110,100,10,32,32,32,32,83,111,117,114, + 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, + 46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116, + 0,124,0,160,1,124,1,161,1,131,1,100,1,25,0,125, + 2,124,2,160,2,100,2,100,1,161,2,100,3,25,0,125, + 3,124,1,160,3,100,2,161,1,100,4,25,0,125,4,124, + 3,100,5,107,2,111,62,124,4,100,5,107,3,83,0,41, + 7,122,141,67,111,110,99,114,101,116,101,32,105,109,112,108, + 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110, + 115,112,101,99,116,76,111,97,100,101,114,46,105,115,95,112, + 97,99,107,97,103,101,32,98,121,32,99,104,101,99,107,105, + 110,103,32,105,102,10,32,32,32,32,32,32,32,32,116,104, + 101,32,112,97,116,104,32,114,101,116,117,114,110,101,100,32, + 98,121,32,103,101,116,95,102,105,108,101,110,97,109,101,32, + 104,97,115,32,97,32,102,105,108,101,110,97,109,101,32,111, + 102,32,39,95,95,105,110,105,116,95,95,46,112,121,39,46, + 114,3,0,0,0,114,79,0,0,0,114,0,0,0,0,114, + 39,0,0,0,218,8,95,95,105,110,105,116,95,95,78,41, + 4,114,55,0,0,0,114,183,0,0,0,114,51,0,0,0, + 114,49,0,0,0,41,5,114,123,0,0,0,114,143,0,0, + 0,114,101,0,0,0,90,13,102,105,108,101,110,97,109,101, + 95,98,97,115,101,90,9,116,97,105,108,95,110,97,109,101, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 219,0,0,0,129,3,0,0,115,160,0,0,0,10,7,4, - 1,4,1,4,1,4,1,4,1,2,1,12,1,12,1,12, - 1,2,2,14,1,12,1,8,1,12,2,2,1,14,1,12, - 1,6,1,2,3,2,1,6,254,2,4,12,1,16,1,12, - 1,6,1,12,1,12,1,2,1,2,255,8,2,4,254,10, - 3,4,1,2,1,2,1,4,254,8,4,2,1,6,255,2, - 3,2,1,2,1,6,1,2,1,2,1,8,251,18,7,6, - 1,8,2,2,1,4,255,6,2,2,1,2,1,6,254,10, - 3,10,1,12,1,12,1,18,1,6,1,4,255,6,2,10, - 1,10,1,14,1,6,2,6,1,4,255,2,2,16,1,4, - 3,14,254,2,1,4,1,2,255,4,1,255,128,122,21,83, - 111,117,114,99,101,76,111,97,100,101,114,46,103,101,116,95, - 99,111,100,101,78,41,10,114,130,0,0,0,114,129,0,0, - 0,114,131,0,0,0,114,229,0,0,0,114,230,0,0,0, - 114,232,0,0,0,114,231,0,0,0,114,235,0,0,0,114, - 239,0,0,0,114,219,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,227,0, - 0,0,70,3,0,0,115,18,0,0,0,8,0,8,2,8, - 8,8,14,8,10,8,7,14,10,12,8,255,128,114,227,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,0,0,0,0,115,92,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, - 132,0,90,6,101,7,135,0,102,1,100,8,100,9,132,8, - 131,1,90,8,101,7,100,10,100,11,132,0,131,1,90,9, - 100,12,100,13,132,0,90,10,101,7,100,14,100,15,132,0, - 131,1,90,11,135,0,4,0,90,12,83,0,41,16,218,10, - 70,105,108,101,76,111,97,100,101,114,122,103,66,97,115,101, - 32,102,105,108,101,32,108,111,97,100,101,114,32,99,108,97, - 115,115,32,119,104,105,99,104,32,105,109,112,108,101,109,101, - 110,116,115,32,116,104,101,32,108,111,97,100,101,114,32,112, - 114,111,116,111,99,111,108,32,109,101,116,104,111,100,115,32, - 116,104,97,116,10,32,32,32,32,114,101,113,117,105,114,101, - 32,102,105,108,101,32,115,121,115,116,101,109,32,117,115,97, - 103,101,46,99,3,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0, - 0,124,1,124,0,95,0,124,2,124,0,95,1,100,1,83, - 0,41,2,122,75,67,97,99,104,101,32,116,104,101,32,109, - 111,100,117,108,101,32,110,97,109,101,32,97,110,100,32,116, - 104,101,32,112,97,116,104,32,116,111,32,116,104,101,32,102, - 105,108,101,32,102,111,117,110,100,32,98,121,32,116,104,101, - 10,32,32,32,32,32,32,32,32,102,105,110,100,101,114,46, - 78,114,163,0,0,0,41,3,114,123,0,0,0,114,143,0, - 0,0,114,52,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,215,0,0,0,219,3,0,0,115, - 8,0,0,0,6,3,6,1,4,128,255,128,122,19,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,0,0,0,0,2,0, - 0,0,2,0,0,0,67,0,0,0,115,24,0,0,0,124, - 0,106,0,124,1,106,0,107,2,111,22,124,0,106,1,124, - 1,106,1,107,2,83,0,114,114,0,0,0,169,2,218,9, - 95,95,99,108,97,115,115,95,95,114,136,0,0,0,169,2, - 114,123,0,0,0,90,5,111,116,104,101,114,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,6,95,95,101, - 113,95,95,225,3,0,0,115,8,0,0,0,12,1,10,1, - 2,255,255,128,122,17,70,105,108,101,76,111,97,100,101,114, - 46,95,95,101,113,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,20,0,0,0,116,0,124,0,106,1,131,1,116,0,124, - 0,106,2,131,1,65,0,83,0,114,114,0,0,0,169,3, - 218,4,104,97,115,104,114,121,0,0,0,114,52,0,0,0, - 169,1,114,123,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,8,95,95,104,97,115,104,95,95, - 229,3,0,0,115,4,0,0,0,20,1,255,128,122,19,70, - 105,108,101,76,111,97,100,101,114,46,95,95,104,97,115,104, - 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,3,0,0,0,115,16,0,0,0, - 116,0,116,1,124,0,131,2,160,2,124,1,161,1,83,0, - 41,2,122,100,76,111,97,100,32,97,32,109,111,100,117,108, - 101,32,102,114,111,109,32,97,32,102,105,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,78,41,3,218,5,115,117,112, - 101,114,114,245,0,0,0,114,226,0,0,0,114,225,0,0, - 0,169,1,114,247,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,226,0,0,0,232,3,0,0,115,4,0,0,0, - 16,10,255,128,122,22,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,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,6,0,0,0,124,0,106,0,83,0, - 169,2,122,58,82,101,116,117,114,110,32,116,104,101,32,112, - 97,116,104,32,116,111,32,116,104,101,32,115,111,117,114,99, - 101,32,102,105,108,101,32,97,115,32,102,111,117,110,100,32, - 98,121,32,116,104,101,32,102,105,110,100,101,114,46,78,114, - 56,0,0,0,114,225,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,183,0,0,0,244,3,0, - 0,115,4,0,0,0,6,3,255,128,122,23,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,0,0,0,0, - 3,0,0,0,8,0,0,0,67,0,0,0,115,128,0,0, - 0,116,0,124,0,116,1,116,2,102,2,131,2,114,72,116, - 3,160,4,116,5,124,1,131,1,161,1,143,24,125,2,124, - 2,160,6,161,0,87,0,2,0,100,1,4,0,4,0,131, - 3,1,0,83,0,49,0,115,58,48,0,1,0,1,0,1, - 0,89,0,1,0,100,1,83,0,116,3,160,7,124,1,100, - 2,161,2,143,24,125,2,124,2,160,6,161,0,87,0,2, - 0,100,1,4,0,4,0,131,3,1,0,83,0,49,0,115, - 114,48,0,1,0,1,0,1,0,89,0,1,0,100,1,83, - 0,41,3,122,39,82,101,116,117,114,110,32,116,104,101,32, - 100,97,116,97,32,102,114,111,109,32,112,97,116,104,32,97, - 115,32,114,97,119,32,98,121,116,101,115,46,78,218,1,114, - 41,8,114,165,0,0,0,114,227,0,0,0,218,19,69,120, - 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, - 114,114,72,0,0,0,90,9,111,112,101,110,95,99,111,100, - 101,114,90,0,0,0,90,4,114,101,97,100,114,73,0,0, - 0,41,3,114,123,0,0,0,114,52,0,0,0,114,76,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,233,0,0,0,249,3,0,0,115,16,0,0,0,14, - 2,16,1,38,1,4,128,14,2,38,1,4,128,255,128,122, - 19,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, - 100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,2,0,0,0,67,0,0,0,115,20,0, - 0,0,100,1,100,2,108,0,109,1,125,2,1,0,124,2, - 124,0,131,1,83,0,41,3,78,114,0,0,0,0,41,1, - 218,10,70,105,108,101,82,101,97,100,101,114,41,2,90,17, - 105,109,112,111,114,116,108,105,98,46,114,101,97,100,101,114, - 115,114,3,1,0,0,41,3,114,123,0,0,0,114,222,0, - 0,0,114,3,1,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,19,103,101,116,95,114,101,115,111, - 117,114,99,101,95,114,101,97,100,101,114,2,4,0,0,115, - 6,0,0,0,12,2,8,1,255,128,122,30,70,105,108,101, - 76,111,97,100,101,114,46,103,101,116,95,114,101,115,111,117, - 114,99,101,95,114,101,97,100,101,114,41,13,114,130,0,0, - 0,114,129,0,0,0,114,131,0,0,0,114,132,0,0,0, - 114,215,0,0,0,114,249,0,0,0,114,253,0,0,0,114, - 140,0,0,0,114,226,0,0,0,114,183,0,0,0,114,233, - 0,0,0,114,4,1,0,0,90,13,95,95,99,108,97,115, - 115,99,101,108,108,95,95,114,7,0,0,0,114,7,0,0, - 0,114,255,0,0,0,114,8,0,0,0,114,245,0,0,0, - 214,3,0,0,115,26,0,0,0,8,0,4,2,8,3,8, - 6,8,4,2,3,14,1,2,11,10,1,8,4,2,9,18, - 1,255,128,114,245,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,46,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,100,7,156,1,100,8,100,9,132,2,90,6, - 100,10,83,0,41,11,218,16,83,111,117,114,99,101,70,105, - 108,101,76,111,97,100,101,114,122,62,67,111,110,99,114,101, - 116,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111, - 110,32,111,102,32,83,111,117,114,99,101,76,111,97,100,101, - 114,32,117,115,105,110,103,32,116,104,101,32,102,105,108,101, - 32,115,121,115,116,101,109,46,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, - 0,115,22,0,0,0,116,0,124,1,131,1,125,2,124,2, - 106,1,124,2,106,2,100,1,156,2,83,0,41,3,122,33, - 82,101,116,117,114,110,32,116,104,101,32,109,101,116,97,100, - 97,116,97,32,102,111,114,32,116,104,101,32,112,97,116,104, - 46,41,2,114,173,0,0,0,114,240,0,0,0,78,41,3, - 114,57,0,0,0,218,8,115,116,95,109,116,105,109,101,90, - 7,115,116,95,115,105,122,101,41,3,114,123,0,0,0,114, - 52,0,0,0,114,244,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,230,0,0,0,12,4,0, - 0,115,6,0,0,0,8,2,14,1,255,128,122,27,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,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, - 0,0,115,24,0,0,0,116,0,124,1,131,1,125,4,124, - 0,106,1,124,2,124,3,124,4,100,1,141,3,83,0,41, - 2,78,169,1,218,5,95,109,111,100,101,41,2,114,119,0, - 0,0,114,231,0,0,0,41,5,114,123,0,0,0,114,112, - 0,0,0,114,111,0,0,0,114,37,0,0,0,114,60,0, + 186,0,0,0,46,3,0,0,115,10,0,0,0,18,3,16, + 1,14,1,16,1,255,128,122,24,95,76,111,97,100,101,114, + 66,97,115,105,99,115,46,105,115,95,112,97,99,107,97,103, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,169,2,122,42,85,115,101,32,100,101,102,97,117, + 108,116,32,115,101,109,97,110,116,105,99,115,32,102,111,114, + 32,109,111,100,117,108,101,32,99,114,101,97,116,105,111,110, + 46,78,114,7,0,0,0,169,2,114,123,0,0,0,114,191, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,13,99,114,101,97,116,101,95,109,111,100,117,108, + 101,54,3,0,0,115,4,0,0,0,4,128,255,128,122,27, + 95,76,111,97,100,101,114,66,97,115,105,99,115,46,99,114, + 101,97,116,101,95,109,111,100,117,108,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,5,0,0,0, + 67,0,0,0,115,56,0,0,0,124,0,160,0,124,1,106, + 1,161,1,125,2,124,2,100,1,117,0,114,36,116,2,100, + 2,160,3,124,1,106,1,161,1,131,1,130,1,116,4,160, + 5,116,6,124,2,124,1,106,7,161,3,1,0,100,1,83, + 0,41,3,122,19,69,120,101,99,117,116,101,32,116,104,101, + 32,109,111,100,117,108,101,46,78,122,52,99,97,110,110,111, + 116,32,108,111,97,100,32,109,111,100,117,108,101,32,123,33, + 114,125,32,119,104,101,110,32,103,101,116,95,99,111,100,101, + 40,41,32,114,101,116,117,114,110,115,32,78,111,110,101,41, + 8,218,8,103,101,116,95,99,111,100,101,114,130,0,0,0, + 114,122,0,0,0,114,70,0,0,0,114,139,0,0,0,218, + 25,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,218,4,101,120,101,99, + 114,136,0,0,0,41,3,114,123,0,0,0,218,6,109,111, + 100,117,108,101,114,168,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,11,101,120,101,99,95,109, + 111,100,117,108,101,57,3,0,0,115,16,0,0,0,12,2, + 8,1,6,1,4,1,6,255,16,2,4,128,255,128,122,25, + 95,76,111,97,100,101,114,66,97,115,105,99,115,46,101,120, + 101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0, + 0,0,115,12,0,0,0,116,0,160,1,124,0,124,1,161, + 2,83,0,41,2,122,26,84,104,105,115,32,109,111,100,117, + 108,101,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,78,41,2,114,139,0,0,0,218,17,95,108,111,97,100, + 95,109,111,100,117,108,101,95,115,104,105,109,169,2,114,123, + 0,0,0,114,143,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,11,108,111,97,100,95,109,111, + 100,117,108,101,65,3,0,0,115,4,0,0,0,12,2,255, + 128,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, + 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114, + 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, + 0,0,0,114,186,0,0,0,114,219,0,0,0,114,224,0, + 0,0,114,227,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,215,0,0,0, + 41,3,0,0,115,14,0,0,0,8,0,4,2,8,3,8, + 8,8,3,12,8,255,128,114,215,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,64,0,0,0,115,74,0,0,0,101,0,90,1,100,0, + 90,2,100,1,100,2,132,0,90,3,100,3,100,4,132,0, + 90,4,100,5,100,6,132,0,90,5,100,7,100,8,132,0, + 90,6,100,9,100,10,132,0,90,7,100,11,100,12,156,1, + 100,13,100,14,132,2,90,8,100,15,100,16,132,0,90,9, + 100,17,83,0,41,18,218,12,83,111,117,114,99,101,76,111, + 97,100,101,114,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,116,0,130,1,41,2,122,165,79,112,116,105,111,110, + 97,108,32,109,101,116,104,111,100,32,116,104,97,116,32,114, + 101,116,117,114,110,115,32,116,104,101,32,109,111,100,105,102, + 105,99,97,116,105,111,110,32,116,105,109,101,32,40,97,110, + 32,105,110,116,41,32,102,111,114,32,116,104,101,10,32,32, + 32,32,32,32,32,32,115,112,101,99,105,102,105,101,100,32, + 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, + 32,32,32,32,32,32,32,82,97,105,115,101,115,32,79,83, + 69,114,114,111,114,32,119,104,101,110,32,116,104,101,32,112, + 97,116,104,32,99,97,110,110,111,116,32,98,101,32,104,97, + 110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,78, + 41,1,114,58,0,0,0,169,2,114,123,0,0,0,114,52, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,10,112,97,116,104,95,109,116,105,109,101,72,3, + 0,0,115,4,0,0,0,4,6,255,128,122,23,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,0,0,0, + 0,2,0,0,0,4,0,0,0,67,0,0,0,115,14,0, + 0,0,100,1,124,0,160,0,124,1,161,1,105,1,83,0, + 41,3,97,158,1,0,0,79,112,116,105,111,110,97,108,32, + 109,101,116,104,111,100,32,114,101,116,117,114,110,105,110,103, + 32,97,32,109,101,116,97,100,97,116,97,32,100,105,99,116, + 32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105, + 101,100,10,32,32,32,32,32,32,32,32,112,97,116,104,32, + 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, + 32,32,80,111,115,115,105,98,108,101,32,107,101,121,115,58, + 10,32,32,32,32,32,32,32,32,45,32,39,109,116,105,109, + 101,39,32,40,109,97,110,100,97,116,111,114,121,41,32,105, + 115,32,116,104,101,32,110,117,109,101,114,105,99,32,116,105, + 109,101,115,116,97,109,112,32,111,102,32,108,97,115,116,32, + 115,111,117,114,99,101,10,32,32,32,32,32,32,32,32,32, + 32,99,111,100,101,32,109,111,100,105,102,105,99,97,116,105, + 111,110,59,10,32,32,32,32,32,32,32,32,45,32,39,115, + 105,122,101,39,32,40,111,112,116,105,111,110,97,108,41,32, + 105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98, + 121,116,101,115,32,111,102,32,116,104,101,32,115,111,117,114, + 99,101,32,99,111,100,101,46,10,10,32,32,32,32,32,32, + 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, + 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, + 115,32,116,104,101,32,108,111,97,100,101,114,32,116,111,32, + 114,101,97,100,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,115,46,10,32,32,32,32,32,32,32,32,82,97,105, + 115,101,115,32,79,83,69,114,114,111,114,32,119,104,101,110, + 32,116,104,101,32,112,97,116,104,32,99,97,110,110,111,116, + 32,98,101,32,104,97,110,100,108,101,100,46,10,32,32,32, + 32,32,32,32,32,114,173,0,0,0,78,41,1,114,230,0, + 0,0,114,229,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,10,112,97,116,104,95,115,116,97, + 116,115,80,3,0,0,115,4,0,0,0,14,12,255,128,122, + 23,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,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, + 0,115,12,0,0,0,124,0,160,0,124,2,124,3,161,2, + 83,0,41,2,122,228,79,112,116,105,111,110,97,108,32,109, + 101,116,104,111,100,32,119,104,105,99,104,32,119,114,105,116, + 101,115,32,100,97,116,97,32,40,98,121,116,101,115,41,32, + 116,111,32,97,32,102,105,108,101,32,112,97,116,104,32,40, + 97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,32, + 32,73,109,112,108,101,109,101,110,116,105,110,103,32,116,104, + 105,115,32,109,101,116,104,111,100,32,97,108,108,111,119,115, + 32,102,111,114,32,116,104,101,32,119,114,105,116,105,110,103, + 32,111,102,32,98,121,116,101,99,111,100,101,32,102,105,108, + 101,115,46,10,10,32,32,32,32,32,32,32,32,84,104,101, + 32,115,111,117,114,99,101,32,112,97,116,104,32,105,115,32, + 110,101,101,100,101,100,32,105,110,32,111,114,100,101,114,32, + 116,111,32,99,111,114,114,101,99,116,108,121,32,116,114,97, + 110,115,102,101,114,32,112,101,114,109,105,115,115,105,111,110, + 115,10,32,32,32,32,32,32,32,32,78,41,1,218,8,115, + 101,116,95,100,97,116,97,41,4,114,123,0,0,0,114,112, + 0,0,0,90,10,99,97,99,104,101,95,112,97,116,104,114, + 37,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,15,95,99,97,99,104,101,95,98,121,116,101, + 99,111,100,101,94,3,0,0,115,4,0,0,0,12,8,255, + 128,122,28,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,0,0,0,0,3,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, + 0,41,2,122,150,79,112,116,105,111,110,97,108,32,109,101, + 116,104,111,100,32,119,104,105,99,104,32,119,114,105,116,101, + 115,32,100,97,116,97,32,40,98,121,116,101,115,41,32,116, + 111,32,97,32,102,105,108,101,32,112,97,116,104,32,40,97, + 32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,32, + 73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,105, + 115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,32, + 102,111,114,32,116,104,101,32,119,114,105,116,105,110,103,32, + 111,102,32,98,121,116,101,99,111,100,101,32,102,105,108,101, + 115,46,10,32,32,32,32,32,32,32,32,78,114,7,0,0, + 0,41,3,114,123,0,0,0,114,52,0,0,0,114,37,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,232,0,0,0,17,4,0,0,115,6,0,0,0,8, - 2,16,1,255,128,122,32,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,99,111,100,101,114,68,0,0,0,114,7,1,0, - 0,99,3,0,0,0,0,0,0,0,1,0,0,0,9,0, - 0,0,11,0,0,0,67,0,0,0,115,244,0,0,0,116, - 0,124,1,131,1,92,2,125,4,125,5,103,0,125,6,124, - 4,114,52,116,1,124,4,131,1,115,52,116,0,124,4,131, - 1,92,2,125,4,125,7,124,6,160,2,124,7,161,1,1, - 0,113,16,116,3,124,6,131,1,68,0,93,98,125,7,116, - 4,124,4,124,7,131,2,125,4,122,14,116,5,160,6,124, - 4,161,1,1,0,87,0,113,60,4,0,116,7,121,106,1, - 0,1,0,1,0,89,0,113,60,4,0,116,8,121,158,1, - 0,125,8,1,0,122,30,116,9,160,10,100,1,124,4,124, - 8,161,3,1,0,87,0,89,0,100,2,125,8,126,8,1, - 0,100,2,83,0,100,2,125,8,126,8,48,0,48,0,122, - 30,116,11,124,1,124,2,124,3,131,3,1,0,116,9,160, - 10,100,3,124,1,161,2,1,0,87,0,100,2,83,0,4, - 0,116,8,121,242,1,0,125,8,1,0,122,28,116,9,160, - 10,100,1,124,1,124,8,161,3,1,0,87,0,89,0,100, - 2,125,8,126,8,100,2,83,0,100,2,125,8,126,8,48, - 0,48,0,41,4,122,27,87,114,105,116,101,32,98,121,116, - 101,115,32,100,97,116,97,32,116,111,32,97,32,102,105,108, - 101,46,122,27,99,111,117,108,100,32,110,111,116,32,99,114, - 101,97,116,101,32,123,33,114,125,58,32,123,33,114,125,78, - 122,12,99,114,101,97,116,101,100,32,123,33,114,125,41,12, - 114,55,0,0,0,114,64,0,0,0,114,190,0,0,0,114, - 50,0,0,0,114,48,0,0,0,114,18,0,0,0,90,5, - 109,107,100,105,114,218,15,70,105,108,101,69,120,105,115,116, - 115,69,114,114,111,114,114,58,0,0,0,114,139,0,0,0, - 114,153,0,0,0,114,77,0,0,0,41,9,114,123,0,0, - 0,114,52,0,0,0,114,37,0,0,0,114,8,1,0,0, - 218,6,112,97,114,101,110,116,114,101,0,0,0,114,47,0, - 0,0,114,43,0,0,0,114,234,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,231,0,0,0, - 22,4,0,0,115,54,0,0,0,12,2,4,1,12,2,12, - 1,12,1,12,2,10,1,2,1,14,1,12,1,4,2,14, - 1,6,3,4,1,4,255,16,2,10,128,2,1,12,1,14, - 1,4,128,14,1,8,2,2,1,8,255,20,128,255,128,122, - 25,83,111,117,114,99,101,70,105,108,101,76,111,97,100,101, - 114,46,115,101,116,95,100,97,116,97,78,41,7,114,130,0, - 0,0,114,129,0,0,0,114,131,0,0,0,114,132,0,0, - 0,114,230,0,0,0,114,232,0,0,0,114,231,0,0,0, + 0,114,232,0,0,0,104,3,0,0,115,4,0,0,0,4, + 128,255,128,122,21,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,0,0,0,0,5,0,0,0,10,0,0,0,67, + 0,0,0,115,70,0,0,0,124,0,160,0,124,1,161,1, + 125,2,122,20,124,0,160,1,124,2,161,1,125,3,87,0, + 116,4,124,3,131,1,83,0,4,0,116,2,121,68,1,0, + 125,4,1,0,122,14,116,3,100,1,124,1,100,2,141,2, + 124,4,130,2,100,3,125,4,126,4,48,0,48,0,41,4, + 122,52,67,111,110,99,114,101,116,101,32,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,115, + 112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,115, + 111,117,114,99,101,46,122,39,115,111,117,114,99,101,32,110, + 111,116,32,97,118,97,105,108,97,98,108,101,32,116,104,114, + 111,117,103,104,32,103,101,116,95,100,97,116,97,40,41,114, + 120,0,0,0,78,41,5,114,183,0,0,0,218,8,103,101, + 116,95,100,97,116,97,114,58,0,0,0,114,122,0,0,0, + 114,180,0,0,0,41,5,114,123,0,0,0,114,143,0,0, + 0,114,52,0,0,0,114,178,0,0,0,218,3,101,120,99, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 10,103,101,116,95,115,111,117,114,99,101,111,3,0,0,115, + 24,0,0,0,10,2,2,1,12,1,8,4,14,253,4,1, + 2,1,4,255,2,1,2,255,10,128,255,128,122,23,83,111, + 117,114,99,101,76,111,97,100,101,114,46,103,101,116,95,115, + 111,117,114,99,101,114,109,0,0,0,41,1,218,9,95,111, + 112,116,105,109,105,122,101,99,3,0,0,0,0,0,0,0, + 1,0,0,0,4,0,0,0,8,0,0,0,67,0,0,0, + 115,22,0,0,0,116,0,106,1,116,2,124,1,124,2,100, + 1,100,2,124,3,100,3,141,6,83,0,41,5,122,130,82, + 101,116,117,114,110,32,116,104,101,32,99,111,100,101,32,111, + 98,106,101,99,116,32,99,111,109,112,105,108,101,100,32,102, + 114,111,109,32,115,111,117,114,99,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,101,32,39,100,97,116,97,39,32, + 97,114,103,117,109,101,110,116,32,99,97,110,32,98,101,32, + 97,110,121,32,111,98,106,101,99,116,32,116,121,112,101,32, + 116,104,97,116,32,99,111,109,112,105,108,101,40,41,32,115, + 117,112,112,111,114,116,115,46,10,32,32,32,32,32,32,32, + 32,114,222,0,0,0,84,41,2,218,12,100,111,110,116,95, + 105,110,104,101,114,105,116,114,89,0,0,0,78,41,3,114, + 139,0,0,0,114,221,0,0,0,218,7,99,111,109,112,105, + 108,101,41,4,114,123,0,0,0,114,37,0,0,0,114,52, + 0,0,0,114,237,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,14,115,111,117,114,99,101,95, + 116,111,95,99,111,100,101,121,3,0,0,115,8,0,0,0, + 12,5,4,1,6,255,255,128,122,27,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,0,0, + 0,0,15,0,0,0,9,0,0,0,67,0,0,0,115,28, + 2,0,0,124,0,160,0,124,1,161,1,125,2,100,1,125, + 3,100,1,125,4,100,1,125,5,100,2,125,6,100,3,125, + 7,122,12,116,1,124,2,131,1,125,8,87,0,110,24,4, + 0,116,2,121,66,1,0,1,0,1,0,100,1,125,8,89, + 0,144,1,110,42,48,0,122,14,124,0,160,3,124,2,161, + 1,125,9,87,0,110,20,4,0,116,4,121,102,1,0,1, + 0,1,0,89,0,144,1,110,6,48,0,116,5,124,9,100, + 4,25,0,131,1,125,3,122,14,124,0,160,6,124,8,161, + 1,125,10,87,0,110,18,4,0,116,4,121,148,1,0,1, + 0,1,0,89,0,110,216,48,0,124,1,124,8,100,5,156, + 2,125,11,122,148,116,7,124,10,124,1,124,11,131,3,125, + 12,116,8,124,10,131,1,100,6,100,1,133,2,25,0,125, + 13,124,12,100,7,64,0,100,8,107,3,125,6,124,6,144, + 1,114,30,124,12,100,9,64,0,100,8,107,3,125,7,116, + 9,106,10,100,10,107,3,144,1,114,50,124,7,115,248,116, + 9,106,10,100,11,107,2,144,1,114,50,124,0,160,6,124, + 2,161,1,125,4,116,9,160,11,116,12,124,4,161,2,125, + 5,116,13,124,10,124,5,124,1,124,11,131,4,1,0,110, + 20,116,14,124,10,124,3,124,9,100,12,25,0,124,1,124, + 11,131,5,1,0,87,0,110,24,4,0,116,15,116,16,102, + 2,144,1,121,76,1,0,1,0,1,0,89,0,110,32,48, + 0,116,17,160,18,100,13,124,8,124,2,161,3,1,0,116, + 19,124,13,124,1,124,8,124,2,100,14,141,4,83,0,124, + 4,100,1,117,0,144,1,114,128,124,0,160,6,124,2,161, + 1,125,4,124,0,160,20,124,4,124,2,161,2,125,14,116, + 17,160,18,100,15,124,2,161,2,1,0,116,21,106,22,144, + 2,115,24,124,8,100,1,117,1,144,2,114,24,124,3,100, + 1,117,1,144,2,114,24,124,6,144,1,114,220,124,5,100, + 1,117,0,144,1,114,206,116,9,160,11,124,4,161,1,125, + 5,116,23,124,14,124,5,124,7,131,3,125,10,110,16,116, + 24,124,14,124,3,116,25,124,4,131,1,131,3,125,10,122, + 20,124,0,160,26,124,2,124,8,124,10,161,3,1,0,87, + 0,124,14,83,0,4,0,116,2,144,2,121,22,1,0,1, + 0,1,0,89,0,124,14,83,0,48,0,124,14,83,0,41, + 16,122,190,67,111,110,99,114,101,116,101,32,105,109,112,108, + 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110, + 115,112,101,99,116,76,111,97,100,101,114,46,103,101,116,95, + 99,111,100,101,46,10,10,32,32,32,32,32,32,32,32,82, + 101,97,100,105,110,103,32,111,102,32,98,121,116,101,99,111, + 100,101,32,114,101,113,117,105,114,101,115,32,112,97,116,104, + 95,115,116,97,116,115,32,116,111,32,98,101,32,105,109,112, + 108,101,109,101,110,116,101,100,46,32,84,111,32,119,114,105, + 116,101,10,32,32,32,32,32,32,32,32,98,121,116,101,99, + 111,100,101,44,32,115,101,116,95,100,97,116,97,32,109,117, + 115,116,32,97,108,115,111,32,98,101,32,105,109,112,108,101, + 109,101,110,116,101,100,46,10,10,32,32,32,32,32,32,32, + 32,78,70,84,114,173,0,0,0,114,163,0,0,0,114,149, + 0,0,0,114,3,0,0,0,114,0,0,0,0,114,39,0, + 0,0,90,5,110,101,118,101,114,90,6,97,108,119,97,121, + 115,218,4,115,105,122,101,122,13,123,125,32,109,97,116,99, + 104,101,115,32,123,125,41,3,114,121,0,0,0,114,111,0, + 0,0,114,112,0,0,0,122,19,99,111,100,101,32,111,98, + 106,101,99,116,32,102,114,111,109,32,123,125,41,27,114,183, + 0,0,0,114,102,0,0,0,114,88,0,0,0,114,231,0, + 0,0,114,58,0,0,0,114,30,0,0,0,114,234,0,0, + 0,114,156,0,0,0,218,10,109,101,109,111,114,121,118,105, + 101,119,114,167,0,0,0,90,21,99,104,101,99,107,95,104, + 97,115,104,95,98,97,115,101,100,95,112,121,99,115,114,161, + 0,0,0,218,17,95,82,65,87,95,77,65,71,73,67,95, + 78,85,77,66,69,82,114,162,0,0,0,114,160,0,0,0, + 114,122,0,0,0,114,154,0,0,0,114,139,0,0,0,114, + 153,0,0,0,114,169,0,0,0,114,240,0,0,0,114,15, + 0,0,0,218,19,100,111,110,116,95,119,114,105,116,101,95, + 98,121,116,101,99,111,100,101,114,175,0,0,0,114,174,0, + 0,0,114,4,0,0,0,114,233,0,0,0,41,15,114,123, + 0,0,0,114,143,0,0,0,114,112,0,0,0,114,158,0, + 0,0,114,178,0,0,0,114,161,0,0,0,90,10,104,97, + 115,104,95,98,97,115,101,100,90,12,99,104,101,99,107,95, + 115,111,117,114,99,101,114,111,0,0,0,218,2,115,116,114, + 37,0,0,0,114,155,0,0,0,114,16,0,0,0,90,10, + 98,121,116,101,115,95,100,97,116,97,90,11,99,111,100,101, + 95,111,98,106,101,99,116,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,220,0,0,0,129,3,0,0,115, + 160,0,0,0,10,7,4,1,4,1,4,1,4,1,4,1, + 2,1,12,1,12,1,12,1,2,2,14,1,12,1,8,1, + 12,2,2,1,14,1,12,1,6,1,2,3,2,1,6,254, + 2,4,12,1,16,1,12,1,6,1,12,1,12,1,2,1, + 2,255,8,2,4,254,10,3,4,1,2,1,2,1,4,254, + 8,4,2,1,6,255,2,3,2,1,2,1,6,1,2,1, + 2,1,8,251,18,7,6,1,8,2,2,1,4,255,6,2, + 2,1,2,1,6,254,10,3,10,1,12,1,12,1,18,1, + 6,1,4,255,6,2,10,1,10,1,14,1,6,2,6,1, + 4,255,2,2,16,1,4,3,14,254,2,1,4,1,2,255, + 4,1,255,128,122,21,83,111,117,114,99,101,76,111,97,100, + 101,114,46,103,101,116,95,99,111,100,101,78,41,10,114,130, + 0,0,0,114,129,0,0,0,114,131,0,0,0,114,230,0, + 0,0,114,231,0,0,0,114,233,0,0,0,114,232,0,0, + 0,114,236,0,0,0,114,240,0,0,0,114,220,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,5,1,0,0,8,4,0,0,115,12,0, - 0,0,8,0,4,2,8,2,8,5,18,5,255,128,114,5, - 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,64,0,0,0,115,32,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, - 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,83, - 0,41,7,218,20,83,111,117,114,99,101,108,101,115,115,70, - 105,108,101,76,111,97,100,101,114,122,45,76,111,97,100,101, - 114,32,119,104,105,99,104,32,104,97,110,100,108,101,115,32, - 115,111,117,114,99,101,108,101,115,115,32,102,105,108,101,32, - 105,109,112,111,114,116,115,46,99,2,0,0,0,0,0,0, - 0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,0, - 0,115,68,0,0,0,124,0,160,0,124,1,161,1,125,2, - 124,0,160,1,124,2,161,1,125,3,124,1,124,2,100,1, - 156,2,125,4,116,2,124,3,124,1,124,4,131,3,1,0, - 116,3,116,4,124,3,131,1,100,2,100,0,133,2,25,0, - 124,1,124,2,100,3,141,3,83,0,41,4,78,114,163,0, - 0,0,114,149,0,0,0,41,2,114,121,0,0,0,114,111, - 0,0,0,41,5,114,183,0,0,0,114,233,0,0,0,114, - 156,0,0,0,114,169,0,0,0,114,241,0,0,0,41,5, - 114,123,0,0,0,114,143,0,0,0,114,52,0,0,0,114, - 37,0,0,0,114,155,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,219,0,0,0,57,4,0, - 0,115,24,0,0,0,10,1,10,1,2,4,2,1,6,254, - 12,4,2,1,14,1,2,1,2,1,6,253,255,128,122,29, - 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,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,122,39,82,101,116,117,114,110,32,78,111,110,101,32,97, - 115,32,116,104,101,114,101,32,105,115,32,110,111,32,115,111, - 117,114,99,101,32,99,111,100,101,46,78,114,7,0,0,0, - 114,225,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,235,0,0,0,73,4,0,0,115,4,0, - 0,0,4,2,255,128,122,31,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,41,6,114,130,0,0,0,114, - 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,219, - 0,0,0,114,235,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,11,1,0, - 0,53,4,0,0,115,10,0,0,0,8,0,4,2,8,2, - 12,16,255,128,114,11,1,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0, + 8,0,0,0,114,228,0,0,0,70,3,0,0,115,18,0, + 0,0,8,0,8,2,8,8,8,14,8,10,8,7,14,10, + 12,8,255,128,114,228,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, 0,0,115,92,0,0,0,101,0,90,1,100,0,90,2,100, 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, - 0,90,5,100,6,100,7,132,0,90,6,100,8,100,9,132, - 0,90,7,100,10,100,11,132,0,90,8,100,12,100,13,132, - 0,90,9,100,14,100,15,132,0,90,10,100,16,100,17,132, - 0,90,11,101,12,100,18,100,19,132,0,131,1,90,13,100, - 20,83,0,41,21,114,2,1,0,0,122,93,76,111,97,100, - 101,114,32,102,111,114,32,101,120,116,101,110,115,105,111,110, - 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,84, - 104,101,32,99,111,110,115,116,114,117,99,116,111,114,32,105, - 115,32,100,101,115,105,103,110,101,100,32,116,111,32,119,111, - 114,107,32,119,105,116,104,32,70,105,108,101,70,105,110,100, - 101,114,46,10,10,32,32,32,32,99,3,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,2,0,0,0,67,0, - 0,0,115,16,0,0,0,124,1,124,0,95,0,124,2,124, - 0,95,1,100,0,83,0,114,114,0,0,0,114,163,0,0, - 0,41,3,114,123,0,0,0,114,121,0,0,0,114,52,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,215,0,0,0,86,4,0,0,115,8,0,0,0,6, - 1,6,1,4,128,255,128,122,28,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,0,0, - 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,24, - 0,0,0,124,0,106,0,124,1,106,0,107,2,111,22,124, - 0,106,1,124,1,106,1,107,2,83,0,114,114,0,0,0, - 114,246,0,0,0,114,248,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,249,0,0,0,90,4, - 0,0,115,8,0,0,0,12,1,10,1,2,255,255,128,122, - 26,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, - 97,100,101,114,46,95,95,101,113,95,95,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,20,0,0,0,116,0,124,0,106,1,131, - 1,116,0,124,0,106,2,131,1,65,0,83,0,114,114,0, - 0,0,114,250,0,0,0,114,252,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,253,0,0,0, - 94,4,0,0,115,4,0,0,0,20,1,255,128,122,28,69, - 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, - 101,114,46,95,95,104,97,115,104,95,95,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,5,0,0,0, - 67,0,0,0,115,36,0,0,0,116,0,160,1,116,2,106, - 3,124,1,161,2,125,2,116,0,160,4,100,1,124,1,106, - 5,124,0,106,6,161,3,1,0,124,2,83,0,41,3,122, - 38,67,114,101,97,116,101,32,97,110,32,117,110,105,116,105, - 97,108,105,122,101,100,32,101,120,116,101,110,115,105,111,110, - 32,109,111,100,117,108,101,122,38,101,120,116,101,110,115,105, - 111,110,32,109,111,100,117,108,101,32,123,33,114,125,32,108, - 111,97,100,101,100,32,102,114,111,109,32,123,33,114,125,78, - 41,7,114,139,0,0,0,114,220,0,0,0,114,167,0,0, - 0,90,14,99,114,101,97,116,101,95,100,121,110,97,109,105, - 99,114,153,0,0,0,114,121,0,0,0,114,52,0,0,0, - 41,3,114,123,0,0,0,114,191,0,0,0,114,222,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,218,0,0,0,97,4,0,0,115,16,0,0,0,4,2, - 6,1,4,255,6,2,8,1,4,255,4,2,255,128,122,33, - 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, - 100,101,114,46,99,114,101,97,116,101,95,109,111,100,117,108, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,5,0,0,0,67,0,0,0,115,36,0,0,0,116, - 0,160,1,116,2,106,3,124,1,161,2,1,0,116,0,160, - 4,100,1,124,0,106,5,124,0,106,6,161,3,1,0,100, - 2,83,0,41,3,122,30,73,110,105,116,105,97,108,105,122, - 101,32,97,110,32,101,120,116,101,110,115,105,111,110,32,109, - 111,100,117,108,101,122,40,101,120,116,101,110,115,105,111,110, - 32,109,111,100,117,108,101,32,123,33,114,125,32,101,120,101, - 99,117,116,101,100,32,102,114,111,109,32,123,33,114,125,78, - 41,7,114,139,0,0,0,114,220,0,0,0,114,167,0,0, - 0,90,12,101,120,101,99,95,100,121,110,97,109,105,99,114, - 153,0,0,0,114,121,0,0,0,114,52,0,0,0,169,2, - 114,123,0,0,0,114,222,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,223,0,0,0,105,4, - 0,0,115,12,0,0,0,14,2,6,1,8,1,4,255,4, - 128,255,128,122,31,69,120,116,101,110,115,105,111,110,70,105, - 108,101,76,111,97,100,101,114,46,101,120,101,99,95,109,111, - 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,4,0,0,0,3,0,0,0,115,36,0, - 0,0,116,0,124,0,106,1,131,1,100,1,25,0,137,0, - 116,2,135,0,102,1,100,2,100,3,132,8,116,3,68,0, - 131,1,131,1,83,0,41,5,122,49,82,101,116,117,114,110, - 32,84,114,117,101,32,105,102,32,116,104,101,32,101,120,116, - 101,110,115,105,111,110,32,109,111,100,117,108,101,32,105,115, - 32,97,32,112,97,99,107,97,103,101,46,114,3,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,4,0,0,0,51,0,0,0,115,26,0,0,0,124,0, - 93,18,125,1,136,0,100,0,124,1,23,0,107,2,86,0, - 1,0,113,2,100,1,83,0,41,2,114,215,0,0,0,78, - 114,7,0,0,0,169,2,114,5,0,0,0,218,6,115,117, - 102,102,105,120,169,1,90,9,102,105,108,101,95,110,97,109, - 101,114,7,0,0,0,114,8,0,0,0,114,9,0,0,0, - 114,4,0,0,115,10,0,0,0,4,0,2,1,16,255,4, - 128,255,128,122,49,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,111,99,97,108,115,62,46,60,103,101, - 110,101,120,112,114,62,78,41,4,114,55,0,0,0,114,52, - 0,0,0,218,3,97,110,121,114,212,0,0,0,114,225,0, - 0,0,114,7,0,0,0,114,15,1,0,0,114,8,0,0, - 0,114,186,0,0,0,111,4,0,0,115,10,0,0,0,14, - 2,12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,63,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,97,110, - 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,32,99,97,110,110,111,116,32,99,114,101,97,116,101,32, - 97,32,99,111,100,101,32,111,98,106,101,99,116,46,78,114, - 7,0,0,0,114,225,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,219,0,0,0,117,4,0, - 0,115,4,0,0,0,4,2,255,128,122,28,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,53,82,101, - 116,117,114,110,32,78,111,110,101,32,97,115,32,101,120,116, - 101,110,115,105,111,110,32,109,111,100,117,108,101,115,32,104, - 97,118,101,32,110,111,32,115,111,117,114,99,101,32,99,111, - 100,101,46,78,114,7,0,0,0,114,225,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,235,0, - 0,0,121,4,0,0,115,4,0,0,0,4,2,255,128,122, - 30,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,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, - 0,83,0,114,0,1,0,0,114,56,0,0,0,114,225,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,183,0,0,0,125,4,0,0,115,4,0,0,0,6, - 3,255,128,122,32,69,120,116,101,110,115,105,111,110,70,105, - 108,101,76,111,97,100,101,114,46,103,101,116,95,102,105,108, - 101,110,97,109,101,78,41,14,114,130,0,0,0,114,129,0, - 0,0,114,131,0,0,0,114,132,0,0,0,114,215,0,0, - 0,114,249,0,0,0,114,253,0,0,0,114,218,0,0,0, - 114,223,0,0,0,114,186,0,0,0,114,219,0,0,0,114, - 235,0,0,0,114,140,0,0,0,114,183,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,2,1,0,0,78,4,0,0,115,26,0,0,0, - 8,0,4,2,8,6,8,4,8,4,8,3,8,8,8,6, - 8,6,8,4,2,4,14,1,255,128,114,2,1,0,0,99, + 0,90,5,100,6,100,7,132,0,90,6,101,7,135,0,102, + 1,100,8,100,9,132,8,131,1,90,8,101,7,100,10,100, + 11,132,0,131,1,90,9,100,12,100,13,132,0,90,10,101, + 7,100,14,100,15,132,0,131,1,90,11,135,0,4,0,90, + 12,83,0,41,16,218,10,70,105,108,101,76,111,97,100,101, + 114,122,103,66,97,115,101,32,102,105,108,101,32,108,111,97, + 100,101,114,32,99,108,97,115,115,32,119,104,105,99,104,32, + 105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,108, + 111,97,100,101,114,32,112,114,111,116,111,99,111,108,32,109, + 101,116,104,111,100,115,32,116,104,97,116,10,32,32,32,32, + 114,101,113,117,105,114,101,32,102,105,108,101,32,115,121,115, + 116,101,109,32,117,115,97,103,101,46,99,3,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,67, + 0,0,0,115,16,0,0,0,124,1,124,0,95,0,124,2, + 124,0,95,1,100,1,83,0,41,2,122,75,67,97,99,104, + 101,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109, + 101,32,97,110,100,32,116,104,101,32,112,97,116,104,32,116, + 111,32,116,104,101,32,102,105,108,101,32,102,111,117,110,100, + 32,98,121,32,116,104,101,10,32,32,32,32,32,32,32,32, + 102,105,110,100,101,114,46,78,114,163,0,0,0,41,3,114, + 123,0,0,0,114,143,0,0,0,114,52,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, + 0,0,219,3,0,0,115,8,0,0,0,6,3,6,1,4, + 128,255,128,122,19,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,115,24,0,0,0,124,0,106,0,124,1,106,0,107,2, + 111,22,124,0,106,1,124,1,106,1,107,2,83,0,114,114, + 0,0,0,169,2,218,9,95,95,99,108,97,115,115,95,95, + 114,136,0,0,0,169,2,114,123,0,0,0,90,5,111,116, + 104,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,6,95,95,101,113,95,95,225,3,0,0,115,8, + 0,0,0,12,1,10,1,2,255,255,128,122,17,70,105,108, + 101,76,111,97,100,101,114,46,95,95,101,113,95,95,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, + 0,0,0,67,0,0,0,115,20,0,0,0,116,0,124,0, + 106,1,131,1,116,0,124,0,106,2,131,1,65,0,83,0, + 114,114,0,0,0,169,3,218,4,104,97,115,104,114,121,0, + 0,0,114,52,0,0,0,169,1,114,123,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,95, + 95,104,97,115,104,95,95,229,3,0,0,115,4,0,0,0, + 20,1,255,128,122,19,70,105,108,101,76,111,97,100,101,114, + 46,95,95,104,97,115,104,95,95,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,3,0,0,0,3,0, + 0,0,115,16,0,0,0,116,0,116,1,124,0,131,2,160, + 2,124,1,161,1,83,0,41,2,122,100,76,111,97,100,32, + 97,32,109,111,100,117,108,101,32,102,114,111,109,32,97,32, + 102,105,108,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101, + 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, + 41,3,218,5,115,117,112,101,114,114,246,0,0,0,114,227, + 0,0,0,114,226,0,0,0,169,1,114,248,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,227,0,0,0,232,3, + 0,0,115,4,0,0,0,16,10,255,128,122,22,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,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,6,0,0, + 0,124,0,106,0,83,0,169,2,122,58,82,101,116,117,114, + 110,32,116,104,101,32,112,97,116,104,32,116,111,32,116,104, + 101,32,115,111,117,114,99,101,32,102,105,108,101,32,97,115, + 32,102,111,117,110,100,32,98,121,32,116,104,101,32,102,105, + 110,100,101,114,46,78,114,56,0,0,0,114,226,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 183,0,0,0,244,3,0,0,115,4,0,0,0,6,3,255, + 128,122,23,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,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,128,0,0,0,116,0,124,0,116,1,116,2, + 102,2,131,2,114,72,116,3,160,4,116,5,124,1,131,1, + 161,1,143,24,125,2,124,2,160,6,161,0,87,0,2,0, + 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,58, + 48,0,1,0,1,0,1,0,89,0,1,0,100,1,83,0, + 116,3,160,7,124,1,100,2,161,2,143,24,125,2,124,2, + 160,6,161,0,87,0,2,0,100,1,4,0,4,0,131,3, + 1,0,83,0,49,0,115,114,48,0,1,0,1,0,1,0, + 89,0,1,0,100,1,83,0,41,3,122,39,82,101,116,117, + 114,110,32,116,104,101,32,100,97,116,97,32,102,114,111,109, + 32,112,97,116,104,32,97,115,32,114,97,119,32,98,121,116, + 101,115,46,78,218,1,114,41,8,114,165,0,0,0,114,228, + 0,0,0,218,19,69,120,116,101,110,115,105,111,110,70,105, + 108,101,76,111,97,100,101,114,114,72,0,0,0,90,9,111, + 112,101,110,95,99,111,100,101,114,90,0,0,0,90,4,114, + 101,97,100,114,73,0,0,0,41,3,114,123,0,0,0,114, + 52,0,0,0,114,76,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,234,0,0,0,249,3,0, + 0,115,16,0,0,0,14,2,16,1,38,1,4,128,14,2, + 38,1,4,128,255,128,122,19,70,105,108,101,76,111,97,100, + 101,114,46,103,101,116,95,100,97,116,97,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0, + 67,0,0,0,115,20,0,0,0,100,1,100,2,108,0,109, + 1,125,2,1,0,124,2,124,0,131,1,83,0,41,3,78, + 114,0,0,0,0,41,1,218,10,70,105,108,101,82,101,97, + 100,101,114,41,2,90,17,105,109,112,111,114,116,108,105,98, + 46,114,101,97,100,101,114,115,114,4,1,0,0,41,3,114, + 123,0,0,0,114,223,0,0,0,114,4,1,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,19,103, + 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, + 101,114,2,4,0,0,115,6,0,0,0,12,2,8,1,255, + 128,122,30,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,101, + 114,41,13,114,130,0,0,0,114,129,0,0,0,114,131,0, + 0,0,114,132,0,0,0,114,216,0,0,0,114,250,0,0, + 0,114,254,0,0,0,114,140,0,0,0,114,227,0,0,0, + 114,183,0,0,0,114,234,0,0,0,114,5,1,0,0,90, + 13,95,95,99,108,97,115,115,99,101,108,108,95,95,114,7, + 0,0,0,114,7,0,0,0,114,0,1,0,0,114,8,0, + 0,0,114,246,0,0,0,214,3,0,0,115,26,0,0,0, + 8,0,4,2,8,3,8,6,8,4,2,3,14,1,2,11, + 10,1,8,4,2,9,18,1,255,128,114,246,0,0,0,99, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,64,0,0,0,115,104,0,0,0,101,0,90, + 3,0,0,0,64,0,0,0,115,46,0,0,0,101,0,90, 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, - 4,100,4,100,5,132,0,90,5,100,6,100,7,132,0,90, - 6,100,8,100,9,132,0,90,7,100,10,100,11,132,0,90, - 8,100,12,100,13,132,0,90,9,100,14,100,15,132,0,90, - 10,100,16,100,17,132,0,90,11,100,18,100,19,132,0,90, - 12,100,20,100,21,132,0,90,13,100,22,100,23,132,0,90, - 14,100,24,83,0,41,25,218,14,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,97,38,1,0,0,82,101,112,114, - 101,115,101,110,116,115,32,97,32,110,97,109,101,115,112,97, - 99,101,32,112,97,99,107,97,103,101,39,115,32,112,97,116, - 104,46,32,32,73,116,32,117,115,101,115,32,116,104,101,32, - 109,111,100,117,108,101,32,110,97,109,101,10,32,32,32,32, - 116,111,32,102,105,110,100,32,105,116,115,32,112,97,114,101, - 110,116,32,109,111,100,117,108,101,44,32,97,110,100,32,102, - 114,111,109,32,116,104,101,114,101,32,105,116,32,108,111,111, - 107,115,32,117,112,32,116,104,101,32,112,97,114,101,110,116, - 39,115,10,32,32,32,32,95,95,112,97,116,104,95,95,46, - 32,32,87,104,101,110,32,116,104,105,115,32,99,104,97,110, - 103,101,115,44,32,116,104,101,32,109,111,100,117,108,101,39, - 115,32,111,119,110,32,112,97,116,104,32,105,115,32,114,101, - 99,111,109,112,117,116,101,100,44,10,32,32,32,32,117,115, - 105,110,103,32,112,97,116,104,95,102,105,110,100,101,114,46, - 32,32,70,111,114,32,116,111,112,45,108,101,118,101,108,32, - 109,111,100,117,108,101,115,44,32,116,104,101,32,112,97,114, - 101,110,116,32,109,111,100,117,108,101,39,115,32,112,97,116, - 104,10,32,32,32,32,105,115,32,115,121,115,46,112,97,116, - 104,46,99,4,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,3,0,0,0,67,0,0,0,115,36,0,0,0, - 124,1,124,0,95,0,124,2,124,0,95,1,116,2,124,0, - 160,3,161,0,131,1,124,0,95,4,124,3,124,0,95,5, - 100,0,83,0,114,114,0,0,0,41,6,218,5,95,110,97, - 109,101,218,5,95,112,97,116,104,114,116,0,0,0,218,16, - 95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104, - 218,17,95,108,97,115,116,95,112,97,114,101,110,116,95,112, - 97,116,104,218,12,95,112,97,116,104,95,102,105,110,100,101, - 114,169,4,114,123,0,0,0,114,121,0,0,0,114,52,0, - 0,0,90,11,112,97,116,104,95,102,105,110,100,101,114,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,215, - 0,0,0,138,4,0,0,115,12,0,0,0,6,1,6,1, - 14,1,6,1,4,128,255,128,122,23,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,0,0,0,0,4,0, - 0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,124, - 0,106,0,160,1,100,1,161,1,92,3,125,1,125,2,125, - 3,124,2,100,2,107,2,114,30,100,3,83,0,124,1,100, - 4,102,2,83,0,41,6,122,62,82,101,116,117,114,110,115, - 32,97,32,116,117,112,108,101,32,111,102,32,40,112,97,114, - 101,110,116,45,109,111,100,117,108,101,45,110,97,109,101,44, - 32,112,97,114,101,110,116,45,112,97,116,104,45,97,116,116, - 114,45,110,97,109,101,41,114,79,0,0,0,114,10,0,0, - 0,41,2,114,15,0,0,0,114,52,0,0,0,90,8,95, - 95,112,97,116,104,95,95,78,41,2,114,18,1,0,0,114, - 49,0,0,0,41,4,114,123,0,0,0,114,10,1,0,0, - 218,3,100,111,116,90,2,109,101,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,23,95,102,105,110,100,95, - 112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,101, - 115,144,4,0,0,115,10,0,0,0,18,2,8,1,4,2, - 8,3,255,128,122,38,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,101,115,99,1,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, - 0,67,0,0,0,115,28,0,0,0,124,0,160,0,161,0, - 92,2,125,1,125,2,116,1,116,2,106,3,124,1,25,0, - 124,2,131,2,83,0,114,114,0,0,0,41,4,114,25,1, - 0,0,114,135,0,0,0,114,15,0,0,0,218,7,109,111, - 100,117,108,101,115,41,3,114,123,0,0,0,90,18,112,97, - 114,101,110,116,95,109,111,100,117,108,101,95,110,97,109,101, - 90,14,112,97,116,104,95,97,116,116,114,95,110,97,109,101, + 4,100,4,100,5,132,0,90,5,100,6,100,7,156,1,100, + 8,100,9,132,2,90,6,100,10,83,0,41,11,218,16,83, + 111,117,114,99,101,70,105,108,101,76,111,97,100,101,114,122, + 62,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109, + 101,110,116,97,116,105,111,110,32,111,102,32,83,111,117,114, + 99,101,76,111,97,100,101,114,32,117,115,105,110,103,32,116, + 104,101,32,102,105,108,101,32,115,121,115,116,101,109,46,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,22,0,0,0,116,0,124, + 1,131,1,125,2,124,2,106,1,124,2,106,2,100,1,156, + 2,83,0,41,3,122,33,82,101,116,117,114,110,32,116,104, + 101,32,109,101,116,97,100,97,116,97,32,102,111,114,32,116, + 104,101,32,112,97,116,104,46,41,2,114,173,0,0,0,114, + 241,0,0,0,78,41,3,114,57,0,0,0,218,8,115,116, + 95,109,116,105,109,101,90,7,115,116,95,115,105,122,101,41, + 3,114,123,0,0,0,114,52,0,0,0,114,245,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 20,1,0,0,154,4,0,0,115,6,0,0,0,12,1,16, - 1,255,128,122,31,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,0,0,0, - 0,3,0,0,0,4,0,0,0,67,0,0,0,115,80,0, - 0,0,116,0,124,0,160,1,161,0,131,1,125,1,124,1, - 124,0,106,2,107,3,114,74,124,0,160,3,124,0,106,4, - 124,1,161,2,125,2,124,2,100,0,117,1,114,68,124,2, - 106,5,100,0,117,0,114,68,124,2,106,6,114,68,124,2, - 106,6,124,0,95,7,124,1,124,0,95,2,124,0,106,7, - 83,0,114,114,0,0,0,41,8,114,116,0,0,0,114,20, - 1,0,0,114,21,1,0,0,114,22,1,0,0,114,18,1, - 0,0,114,144,0,0,0,114,182,0,0,0,114,19,1,0, - 0,41,3,114,123,0,0,0,90,11,112,97,114,101,110,116, - 95,112,97,116,104,114,191,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,12,95,114,101,99,97, - 108,99,117,108,97,116,101,158,4,0,0,115,18,0,0,0, - 12,2,10,1,14,1,18,3,6,1,8,1,6,1,6,1, - 255,128,122,27,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,95,114,101,99,97,108,99,117,108,97,116,101,99, + 231,0,0,0,12,4,0,0,115,6,0,0,0,8,2,14, + 1,255,128,122,27,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,0,0,0,0,0,5,0,0, + 0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,0, + 124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,4, + 100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,111, + 100,101,41,2,114,119,0,0,0,114,232,0,0,0,41,5, + 114,123,0,0,0,114,112,0,0,0,114,111,0,0,0,114, + 37,0,0,0,114,60,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,233,0,0,0,17,4,0, + 0,115,6,0,0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,68, + 0,0,0,114,8,1,0,0,99,3,0,0,0,0,0,0, + 0,1,0,0,0,9,0,0,0,11,0,0,0,67,0,0, + 0,115,244,0,0,0,116,0,124,1,131,1,92,2,125,4, + 125,5,103,0,125,6,124,4,114,52,116,1,124,4,131,1, + 115,52,116,0,124,4,131,1,92,2,125,4,125,7,124,6, + 160,2,124,7,161,1,1,0,113,16,116,3,124,6,131,1, + 68,0,93,98,125,7,116,4,124,4,124,7,131,2,125,4, + 122,14,116,5,160,6,124,4,161,1,1,0,87,0,113,60, + 4,0,116,7,121,106,1,0,1,0,1,0,89,0,113,60, + 4,0,116,8,121,158,1,0,125,8,1,0,122,30,116,9, + 160,10,100,1,124,4,124,8,161,3,1,0,87,0,89,0, + 100,2,125,8,126,8,1,0,100,2,83,0,100,2,125,8, + 126,8,48,0,48,0,122,30,116,11,124,1,124,2,124,3, + 131,3,1,0,116,9,160,10,100,3,124,1,161,2,1,0, + 87,0,100,2,83,0,4,0,116,8,121,242,1,0,125,8, + 1,0,122,28,116,9,160,10,100,1,124,1,124,8,161,3, + 1,0,87,0,89,0,100,2,125,8,126,8,100,2,83,0, + 100,2,125,8,126,8,48,0,48,0,41,4,122,27,87,114, + 105,116,101,32,98,121,116,101,115,32,100,97,116,97,32,116, + 111,32,97,32,102,105,108,101,46,122,27,99,111,117,108,100, + 32,110,111,116,32,99,114,101,97,116,101,32,123,33,114,125, + 58,32,123,33,114,125,78,122,12,99,114,101,97,116,101,100, + 32,123,33,114,125,41,12,114,55,0,0,0,114,64,0,0, + 0,114,190,0,0,0,114,50,0,0,0,114,48,0,0,0, + 114,18,0,0,0,90,5,109,107,100,105,114,218,15,70,105, + 108,101,69,120,105,115,116,115,69,114,114,111,114,114,58,0, + 0,0,114,139,0,0,0,114,153,0,0,0,114,77,0,0, + 0,41,9,114,123,0,0,0,114,52,0,0,0,114,37,0, + 0,0,114,9,1,0,0,218,6,112,97,114,101,110,116,114, + 101,0,0,0,114,47,0,0,0,114,43,0,0,0,114,235, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,232,0,0,0,22,4,0,0,115,54,0,0,0, + 12,2,4,1,12,2,12,1,12,1,12,2,10,1,2,1, + 14,1,12,1,4,2,14,1,6,3,4,1,4,255,16,2, + 10,128,2,1,12,1,14,1,4,128,14,1,8,2,2,1, + 8,255,20,128,255,128,122,25,83,111,117,114,99,101,70,105, + 108,101,76,111,97,100,101,114,46,115,101,116,95,100,97,116, + 97,78,41,7,114,130,0,0,0,114,129,0,0,0,114,131, + 0,0,0,114,132,0,0,0,114,231,0,0,0,114,233,0, + 0,0,114,232,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,6,1,0,0, + 8,4,0,0,115,12,0,0,0,8,0,4,2,8,2,8, + 5,18,5,255,128,114,6,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114, + 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, + 122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104, + 97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115, + 115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160, + 0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125, + 3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124, + 1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100, + 2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83, + 0,41,4,78,114,163,0,0,0,114,149,0,0,0,41,2, + 114,121,0,0,0,114,111,0,0,0,41,5,114,183,0,0, + 0,114,234,0,0,0,114,156,0,0,0,114,169,0,0,0, + 114,242,0,0,0,41,5,114,123,0,0,0,114,143,0,0, + 0,114,52,0,0,0,114,37,0,0,0,114,155,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 220,0,0,0,57,4,0,0,115,24,0,0,0,10,1,10, + 1,2,4,2,1,6,254,12,4,2,1,14,1,2,1,2, + 1,6,253,255,128,122,29,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,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,41,2,122,39,82,101,116,117,114,110, + 32,78,111,110,101,32,97,115,32,116,104,101,114,101,32,105, + 115,32,110,111,32,115,111,117,114,99,101,32,99,111,100,101, + 46,78,114,7,0,0,0,114,226,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,236,0,0,0, + 73,4,0,0,115,4,0,0,0,4,2,255,128,122,31,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,41, + 6,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, + 114,132,0,0,0,114,220,0,0,0,114,236,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,12,1,0,0,53,4,0,0,115,10,0,0, + 0,8,0,4,2,8,2,12,16,255,128,114,12,1,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,92,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, + 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, + 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, + 90,10,100,16,100,17,132,0,90,11,101,12,100,18,100,19, + 132,0,131,1,90,13,100,20,83,0,41,21,114,3,1,0, + 0,122,93,76,111,97,100,101,114,32,102,111,114,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,46, + 10,10,32,32,32,32,84,104,101,32,99,111,110,115,116,114, + 117,99,116,111,114,32,105,115,32,100,101,115,105,103,110,101, + 100,32,116,111,32,119,111,114,107,32,119,105,116,104,32,70, + 105,108,101,70,105,110,100,101,114,46,10,10,32,32,32,32, + 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,2,0,0,0,67,0,0,0,115,16,0,0,0,124,1, + 124,0,95,0,124,2,124,0,95,1,100,0,83,0,114,114, + 0,0,0,114,163,0,0,0,41,3,114,123,0,0,0,114, + 121,0,0,0,114,52,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,216,0,0,0,86,4,0, + 0,115,8,0,0,0,6,1,6,1,4,128,255,128,122,28, + 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,0,0,0,0,2,0,0,0,2,0,0, + 0,67,0,0,0,115,24,0,0,0,124,0,106,0,124,1, + 106,0,107,2,111,22,124,0,106,1,124,1,106,1,107,2, + 83,0,114,114,0,0,0,114,247,0,0,0,114,249,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,250,0,0,0,90,4,0,0,115,8,0,0,0,12,1, + 10,1,2,255,255,128,122,26,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,95,95,101,113, + 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,20,0,0,0, + 116,0,124,0,106,1,131,1,116,0,124,0,106,2,131,1, + 65,0,83,0,114,114,0,0,0,114,251,0,0,0,114,253, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,254,0,0,0,94,4,0,0,115,4,0,0,0, + 20,1,255,128,122,28,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,95,95,104,97,115,104, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,5,0,0,0,67,0,0,0,115,36,0,0,0, + 116,0,160,1,116,2,106,3,124,1,161,2,125,2,116,0, + 160,4,100,1,124,1,106,5,124,0,106,6,161,3,1,0, + 124,2,83,0,41,3,122,38,67,114,101,97,116,101,32,97, + 110,32,117,110,105,116,105,97,108,105,122,101,100,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,122,38, + 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, + 32,123,33,114,125,32,108,111,97,100,101,100,32,102,114,111, + 109,32,123,33,114,125,78,41,7,114,139,0,0,0,114,221, + 0,0,0,114,167,0,0,0,90,14,99,114,101,97,116,101, + 95,100,121,110,97,109,105,99,114,153,0,0,0,114,121,0, + 0,0,114,52,0,0,0,41,3,114,123,0,0,0,114,191, + 0,0,0,114,223,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,219,0,0,0,97,4,0,0, + 115,16,0,0,0,4,2,6,1,4,255,6,2,8,1,4, + 255,4,2,255,128,122,33,69,120,116,101,110,115,105,111,110, + 70,105,108,101,76,111,97,100,101,114,46,99,114,101,97,116, + 101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,5,0,0,0,67,0,0, + 0,115,36,0,0,0,116,0,160,1,116,2,106,3,124,1, + 161,2,1,0,116,0,160,4,100,1,124,0,106,5,124,0, + 106,6,161,3,1,0,100,2,83,0,41,3,122,30,73,110, + 105,116,105,97,108,105,122,101,32,97,110,32,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,122,40,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,123, + 33,114,125,32,101,120,101,99,117,116,101,100,32,102,114,111, + 109,32,123,33,114,125,78,41,7,114,139,0,0,0,114,221, + 0,0,0,114,167,0,0,0,90,12,101,120,101,99,95,100, + 121,110,97,109,105,99,114,153,0,0,0,114,121,0,0,0, + 114,52,0,0,0,169,2,114,123,0,0,0,114,223,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,224,0,0,0,105,4,0,0,115,12,0,0,0,14,2, + 6,1,8,1,4,255,4,128,255,128,122,31,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, + 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, + 3,0,0,0,115,36,0,0,0,116,0,124,0,106,1,131, + 1,100,1,25,0,137,0,116,2,135,0,102,1,100,2,100, + 3,132,8,116,3,68,0,131,1,131,1,83,0,41,5,122, + 49,82,101,116,117,114,110,32,84,114,117,101,32,105,102,32, + 116,104,101,32,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,32,105,115,32,97,32,112,97,99,107,97,103, + 101,46,114,3,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,4,0,0,0,51,0,0,0, + 115,26,0,0,0,124,0,93,18,125,1,136,0,100,0,124, + 1,23,0,107,2,86,0,1,0,113,2,100,1,83,0,41, + 2,114,216,0,0,0,78,114,7,0,0,0,169,2,114,5, + 0,0,0,218,6,115,117,102,102,105,120,169,1,90,9,102, + 105,108,101,95,110,97,109,101,114,7,0,0,0,114,8,0, + 0,0,114,9,0,0,0,114,4,0,0,115,10,0,0,0, + 4,0,2,1,16,255,4,128,255,128,122,49,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,111,99,97, + 108,115,62,46,60,103,101,110,101,120,112,114,62,78,41,4, + 114,55,0,0,0,114,52,0,0,0,218,3,97,110,121,114, + 212,0,0,0,114,226,0,0,0,114,7,0,0,0,114,16, + 1,0,0,114,8,0,0,0,114,186,0,0,0,111,4,0, + 0,115,10,0,0,0,14,2,12,1,2,1,8,255,255,128, + 122,30,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,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 83,0,41,2,122,63,82,101,116,117,114,110,32,78,111,110, + 101,32,97,115,32,97,110,32,101,120,116,101,110,115,105,111, + 110,32,109,111,100,117,108,101,32,99,97,110,110,111,116,32, + 99,114,101,97,116,101,32,97,32,99,111,100,101,32,111,98, + 106,101,99,116,46,78,114,7,0,0,0,114,226,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 220,0,0,0,117,4,0,0,115,4,0,0,0,4,2,255, + 128,122,28,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,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, + 0,41,2,122,53,82,101,116,117,114,110,32,78,111,110,101, + 32,97,115,32,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,115,32,104,97,118,101,32,110,111,32,115,111, + 117,114,99,101,32,99,111,100,101,46,78,114,7,0,0,0, + 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,236,0,0,0,121,4,0,0,115,4,0, + 0,0,4,2,255,128,122,30,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,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 6,0,0,0,124,0,106,0,83,0,114,1,1,0,0,114, + 56,0,0,0,114,226,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,183,0,0,0,125,4,0, + 0,115,4,0,0,0,6,3,255,128,122,32,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, + 103,101,116,95,102,105,108,101,110,97,109,101,78,41,14,114, + 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, + 0,0,0,114,216,0,0,0,114,250,0,0,0,114,254,0, + 0,0,114,219,0,0,0,114,224,0,0,0,114,186,0,0, + 0,114,220,0,0,0,114,236,0,0,0,114,140,0,0,0, + 114,183,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,3,1,0,0,78,4, + 0,0,115,26,0,0,0,8,0,4,2,8,6,8,4,8, + 4,8,3,8,8,8,6,8,6,8,4,2,4,14,1,255, + 128,114,3,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, + 104,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, + 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, + 100,10,100,11,132,0,90,8,100,12,100,13,132,0,90,9, + 100,14,100,15,132,0,90,10,100,16,100,17,132,0,90,11, + 100,18,100,19,132,0,90,12,100,20,100,21,132,0,90,13, + 100,22,100,23,132,0,90,14,100,24,83,0,41,25,218,14, + 95,78,97,109,101,115,112,97,99,101,80,97,116,104,97,38, + 1,0,0,82,101,112,114,101,115,101,110,116,115,32,97,32, + 110,97,109,101,115,112,97,99,101,32,112,97,99,107,97,103, + 101,39,115,32,112,97,116,104,46,32,32,73,116,32,117,115, + 101,115,32,116,104,101,32,109,111,100,117,108,101,32,110,97, + 109,101,10,32,32,32,32,116,111,32,102,105,110,100,32,105, + 116,115,32,112,97,114,101,110,116,32,109,111,100,117,108,101, + 44,32,97,110,100,32,102,114,111,109,32,116,104,101,114,101, + 32,105,116,32,108,111,111,107,115,32,117,112,32,116,104,101, + 32,112,97,114,101,110,116,39,115,10,32,32,32,32,95,95, + 112,97,116,104,95,95,46,32,32,87,104,101,110,32,116,104, + 105,115,32,99,104,97,110,103,101,115,44,32,116,104,101,32, + 109,111,100,117,108,101,39,115,32,111,119,110,32,112,97,116, + 104,32,105,115,32,114,101,99,111,109,112,117,116,101,100,44, + 10,32,32,32,32,117,115,105,110,103,32,112,97,116,104,95, + 102,105,110,100,101,114,46,32,32,70,111,114,32,116,111,112, + 45,108,101,118,101,108,32,109,111,100,117,108,101,115,44,32, + 116,104,101,32,112,97,114,101,110,116,32,109,111,100,117,108, + 101,39,115,32,112,97,116,104,10,32,32,32,32,105,115,32, + 115,121,115,46,112,97,116,104,46,99,4,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,3,0,0,0,67,0, + 0,0,115,36,0,0,0,124,1,124,0,95,0,124,2,124, + 0,95,1,116,2,124,0,160,3,161,0,131,1,124,0,95, + 4,124,3,124,0,95,5,100,0,83,0,114,114,0,0,0, + 41,6,218,5,95,110,97,109,101,218,5,95,112,97,116,104, + 114,116,0,0,0,218,16,95,103,101,116,95,112,97,114,101, + 110,116,95,112,97,116,104,218,17,95,108,97,115,116,95,112, + 97,114,101,110,116,95,112,97,116,104,218,12,95,112,97,116, + 104,95,102,105,110,100,101,114,169,4,114,123,0,0,0,114, + 121,0,0,0,114,52,0,0,0,90,11,112,97,116,104,95, + 102,105,110,100,101,114,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,216,0,0,0,138,4,0,0,115,12, + 0,0,0,6,1,6,1,14,1,6,1,4,128,255,128,122, + 23,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,0,0,0,0,4,0,0,0,3,0,0,0,67,0,0, + 0,115,38,0,0,0,124,0,106,0,160,1,100,1,161,1, + 92,3,125,1,125,2,125,3,124,2,100,2,107,2,114,30, + 100,3,83,0,124,1,100,4,102,2,83,0,41,6,122,62, + 82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32, + 111,102,32,40,112,97,114,101,110,116,45,109,111,100,117,108, + 101,45,110,97,109,101,44,32,112,97,114,101,110,116,45,112, + 97,116,104,45,97,116,116,114,45,110,97,109,101,41,114,79, + 0,0,0,114,10,0,0,0,41,2,114,15,0,0,0,114, + 52,0,0,0,90,8,95,95,112,97,116,104,95,95,78,41, + 2,114,19,1,0,0,114,49,0,0,0,41,4,114,123,0, + 0,0,114,11,1,0,0,218,3,100,111,116,90,2,109,101, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 23,95,102,105,110,100,95,112,97,114,101,110,116,95,112,97, + 116,104,95,110,97,109,101,115,144,4,0,0,115,10,0,0, + 0,18,2,8,1,4,2,8,3,255,128,122,38,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,101,115,99,1,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,3,0,0,0,67,0,0,0,115,28,0,0, + 0,124,0,160,0,161,0,92,2,125,1,125,2,116,1,116, + 2,106,3,124,1,25,0,124,2,131,2,83,0,114,114,0, + 0,0,41,4,114,26,1,0,0,114,135,0,0,0,114,15, + 0,0,0,218,7,109,111,100,117,108,101,115,41,3,114,123, + 0,0,0,90,18,112,97,114,101,110,116,95,109,111,100,117, + 108,101,95,110,97,109,101,90,14,112,97,116,104,95,97,116, + 116,114,95,110,97,109,101,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,21,1,0,0,154,4,0,0,115, + 6,0,0,0,12,1,16,1,255,128,122,31,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,0,0,0,0,3,0,0,0,4,0,0,0, + 67,0,0,0,115,80,0,0,0,116,0,124,0,160,1,161, + 0,131,1,125,1,124,1,124,0,106,2,107,3,114,74,124, + 0,160,3,124,0,106,4,124,1,161,2,125,2,124,2,100, + 0,117,1,114,68,124,2,106,5,100,0,117,0,114,68,124, + 2,106,6,114,68,124,2,106,6,124,0,95,7,124,1,124, + 0,95,2,124,0,106,7,83,0,114,114,0,0,0,41,8, + 114,116,0,0,0,114,21,1,0,0,114,22,1,0,0,114, + 23,1,0,0,114,19,1,0,0,114,144,0,0,0,114,182, + 0,0,0,114,20,1,0,0,41,3,114,123,0,0,0,90, + 11,112,97,114,101,110,116,95,112,97,116,104,114,191,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,12,95,114,101,99,97,108,99,117,108,97,116,101,158,4, + 0,0,115,18,0,0,0,12,2,10,1,14,1,18,3,6, + 1,8,1,6,1,6,1,255,128,122,27,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,114,101,99,97,108, + 99,117,108,97,116,101,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 12,0,0,0,116,0,124,0,160,1,161,0,131,1,83,0, + 114,114,0,0,0,41,2,218,4,105,116,101,114,114,28,1, + 0,0,114,253,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,8,95,95,105,116,101,114,95,95, + 171,4,0,0,115,4,0,0,0,12,1,255,128,122,23,95, + 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, + 105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, + 12,0,0,0,124,0,160,0,161,0,124,1,25,0,83,0, + 114,114,0,0,0,169,1,114,28,1,0,0,41,2,114,123, + 0,0,0,218,5,105,110,100,101,120,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,11,95,95,103,101,116, + 105,116,101,109,95,95,174,4,0,0,115,4,0,0,0,12, + 1,255,128,122,26,95,78,97,109,101,115,112,97,99,101,80, + 97,116,104,46,95,95,103,101,116,105,116,101,109,95,95,99, + 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,14,0,0,0,124,2,124, + 0,106,0,124,1,60,0,100,0,83,0,114,114,0,0,0, + 41,1,114,20,1,0,0,41,3,114,123,0,0,0,114,32, + 1,0,0,114,52,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,11,95,95,115,101,116,105,116, + 101,109,95,95,177,4,0,0,115,6,0,0,0,10,1,4, + 128,255,128,122,26,95,78,97,109,101,115,112,97,99,101,80, + 97,116,104,46,95,95,115,101,116,105,116,101,109,95,95,99, 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, 3,0,0,0,67,0,0,0,115,12,0,0,0,116,0,124, 0,160,1,161,0,131,1,83,0,114,114,0,0,0,41,2, - 218,4,105,116,101,114,114,27,1,0,0,114,252,0,0,0, + 114,4,0,0,0,114,28,1,0,0,114,253,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,7, + 95,95,108,101,110,95,95,180,4,0,0,115,4,0,0,0, + 12,1,255,128,122,22,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,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, + 106,1,161,1,83,0,41,2,78,122,20,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,40,123,33,114,125,41,41, + 2,114,70,0,0,0,114,20,1,0,0,114,253,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 8,95,95,105,116,101,114,95,95,171,4,0,0,115,4,0, + 8,95,95,114,101,112,114,95,95,183,4,0,0,115,4,0, 0,0,12,1,255,128,122,23,95,78,97,109,101,115,112,97, - 99,101,80,97,116,104,46,95,95,105,116,101,114,95,95,99, + 99,101,80,97,116,104,46,95,95,114,101,112,114,95,95,99, 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 2,0,0,0,67,0,0,0,115,12,0,0,0,124,0,160, - 0,161,0,124,1,25,0,83,0,114,114,0,0,0,169,1, - 114,27,1,0,0,41,2,114,123,0,0,0,218,5,105,110, - 100,101,120,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,11,95,95,103,101,116,105,116,101,109,95,95,174, - 4,0,0,115,4,0,0,0,12,1,255,128,122,26,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,103, - 101,116,105,116,101,109,95,95,99,3,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, - 0,115,14,0,0,0,124,2,124,0,106,0,124,1,60,0, - 100,0,83,0,114,114,0,0,0,41,1,114,19,1,0,0, - 41,3,114,123,0,0,0,114,31,1,0,0,114,52,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,11,95,95,115,101,116,105,116,101,109,95,95,177,4,0, - 0,115,6,0,0,0,10,1,4,128,255,128,122,26,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,115, - 101,116,105,116,101,109,95,95,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,12,0,0,0,116,0,124,0,160,1,161,0,131,1, - 83,0,114,114,0,0,0,41,2,114,4,0,0,0,114,27, - 1,0,0,114,252,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,7,95,95,108,101,110,95,95, - 180,4,0,0,115,4,0,0,0,12,1,255,128,122,22,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,0,0, - 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,41, - 2,78,122,20,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,40,123,33,114,125,41,41,2,114,70,0,0,0,114, - 19,1,0,0,114,252,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,8,95,95,114,101,112,114, - 95,95,183,4,0,0,115,4,0,0,0,12,1,255,128,122, - 23,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,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, - 0,115,12,0,0,0,124,1,124,0,160,0,161,0,118,0, - 83,0,114,114,0,0,0,114,30,1,0,0,169,2,114,123, - 0,0,0,218,4,105,116,101,109,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,12,95,95,99,111,110,116, - 97,105,110,115,95,95,186,4,0,0,115,4,0,0,0,12, - 1,255,128,122,27,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,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,16,0,0,0,124,0, - 106,0,160,1,124,1,161,1,1,0,100,0,83,0,114,114, - 0,0,0,41,2,114,19,1,0,0,114,190,0,0,0,114, - 36,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,190,0,0,0,189,4,0,0,115,6,0,0, - 0,12,1,4,128,255,128,122,21,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,46,97,112,112,101,110,100,78,41, - 15,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, - 114,132,0,0,0,114,215,0,0,0,114,25,1,0,0,114, - 20,1,0,0,114,27,1,0,0,114,29,1,0,0,114,32, - 1,0,0,114,33,1,0,0,114,34,1,0,0,114,35,1, - 0,0,114,38,1,0,0,114,190,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,17,1,0,0,131,4,0,0,115,28,0,0,0,8,0, - 4,1,8,6,8,6,8,10,8,4,8,13,8,3,8,3, - 8,3,8,3,8,3,12,3,255,128,114,17,1,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,64,0,0,0,115,80,0,0,0,101,0,90, - 1,100,0,90,2,100,1,100,2,132,0,90,3,101,4,100, - 3,100,4,132,0,131,1,90,5,100,5,100,6,132,0,90, - 6,100,7,100,8,132,0,90,7,100,9,100,10,132,0,90, - 8,100,11,100,12,132,0,90,9,100,13,100,14,132,0,90, - 10,100,15,100,16,132,0,90,11,100,17,83,0,41,18,218, - 16,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, - 114,99,4,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,4,0,0,0,67,0,0,0,115,18,0,0,0,116, - 0,124,1,124,2,124,3,131,3,124,0,95,1,100,0,83, - 0,114,114,0,0,0,41,2,114,17,1,0,0,114,19,1, - 0,0,114,23,1,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,215,0,0,0,195,4,0,0,115, - 6,0,0,0,14,1,4,128,255,128,122,25,95,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,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,100,1,160,0,124,1,106,1,161,1,83,0,41, - 3,122,115,82,101,116,117,114,110,32,114,101,112,114,32,102, - 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, - 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, - 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, - 32,32,32,32,32,32,122,25,60,109,111,100,117,108,101,32, - 123,33,114,125,32,40,110,97,109,101,115,112,97,99,101,41, - 62,78,41,2,114,70,0,0,0,114,130,0,0,0,41,2, - 114,197,0,0,0,114,222,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,11,109,111,100,117,108, - 101,95,114,101,112,114,198,4,0,0,115,4,0,0,0,12, - 7,255,128,122,28,95,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,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,78,84,114,7,0,0,0,114,225,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,186,0,0,0,207,4,0,0,115,4,0,0,0,4,1, - 255,128,122,27,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,78,114,10,0,0,0,114,7,0,0,0,114,225, + 3,0,0,0,67,0,0,0,115,12,0,0,0,124,1,124, + 0,160,0,161,0,118,0,83,0,114,114,0,0,0,114,31, + 1,0,0,169,2,114,123,0,0,0,218,4,105,116,101,109, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 12,95,95,99,111,110,116,97,105,110,115,95,95,186,4,0, + 0,115,4,0,0,0,12,1,255,128,122,27,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, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,16,0,0,0,124,0,106,0,160,1,124,1,161,1,1, + 0,100,0,83,0,114,114,0,0,0,41,2,114,20,1,0, + 0,114,190,0,0,0,114,37,1,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,190,0,0,0,189, + 4,0,0,115,6,0,0,0,12,1,4,128,255,128,122,21, + 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,97, + 112,112,101,110,100,78,41,15,114,130,0,0,0,114,129,0, + 0,0,114,131,0,0,0,114,132,0,0,0,114,216,0,0, + 0,114,26,1,0,0,114,21,1,0,0,114,28,1,0,0, + 114,30,1,0,0,114,33,1,0,0,114,34,1,0,0,114, + 35,1,0,0,114,36,1,0,0,114,39,1,0,0,114,190, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,18,1,0,0,131,4,0,0, + 115,28,0,0,0,8,0,4,1,8,6,8,6,8,10,8, + 4,8,13,8,3,8,3,8,3,8,3,8,3,12,3,255, + 128,114,18,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, + 80,0,0,0,101,0,90,1,100,0,90,2,100,1,100,2, + 132,0,90,3,101,4,100,3,100,4,132,0,131,1,90,5, + 100,5,100,6,132,0,90,6,100,7,100,8,132,0,90,7, + 100,9,100,10,132,0,90,8,100,11,100,12,132,0,90,9, + 100,13,100,14,132,0,90,10,100,15,100,16,132,0,90,11, + 100,17,83,0,41,18,218,16,95,78,97,109,101,115,112,97, + 99,101,76,111,97,100,101,114,99,4,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, + 0,115,18,0,0,0,116,0,124,1,124,2,124,3,131,3, + 124,0,95,1,100,0,83,0,114,114,0,0,0,41,2,114, + 18,1,0,0,114,20,1,0,0,114,24,1,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, + 0,0,195,4,0,0,115,6,0,0,0,14,1,4,128,255, + 128,122,25,95,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,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, + 106,1,161,1,83,0,41,3,122,115,82,101,116,117,114,110, + 32,114,101,112,114,32,102,111,114,32,116,104,101,32,109,111, + 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,101,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,32,84,104,101,32,105,109, + 112,111,114,116,32,109,97,99,104,105,110,101,114,121,32,100, + 111,101,115,32,116,104,101,32,106,111,98,32,105,116,115,101, + 108,102,46,10,10,32,32,32,32,32,32,32,32,122,25,60, + 109,111,100,117,108,101,32,123,33,114,125,32,40,110,97,109, + 101,115,112,97,99,101,41,62,78,41,2,114,70,0,0,0, + 114,130,0,0,0,41,1,114,223,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,11,109,111,100, + 117,108,101,95,114,101,112,114,198,4,0,0,115,4,0,0, + 0,12,7,255,128,122,28,95,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,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,78,84,114,7,0,0,0,114,226, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,235,0,0,0,210,4,0,0,115,4,0,0,0, + 0,0,114,186,0,0,0,207,4,0,0,115,4,0,0,0, 4,1,255,128,122,27,95,78,97,109,101,115,112,97,99,101, - 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, + 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,0,0,0,0,2,0, - 0,0,6,0,0,0,67,0,0,0,115,16,0,0,0,116, - 0,100,1,100,2,100,3,100,4,100,5,141,4,83,0,41, - 6,78,114,10,0,0,0,122,8,60,115,116,114,105,110,103, - 62,114,221,0,0,0,84,41,1,114,237,0,0,0,41,1, - 114,238,0,0,0,114,225,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,219,0,0,0,213,4, - 0,0,115,4,0,0,0,16,1,255,128,122,25,95,78,97, - 109,101,115,112,97,99,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,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,114,216,0,0,0,114,7,0, - 0,0,114,217,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,218,0,0,0,216,4,0,0,115, - 4,0,0,0,4,128,255,128,122,30,95,78,97,109,101,115, - 112,97,99,101,76,111,97,100,101,114,46,99,114,101,97,116, - 101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,78,114,10,0,0,0,114,7,0,0,0, + 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,236,0,0,0,210,4,0,0,115,4,0, + 0,0,4,1,255,128,122,27,95,78,97,109,101,115,112,97, + 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117, + 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,6,0,0,0,67,0,0,0,115,16,0,0, + 0,116,0,100,1,100,2,100,3,100,4,100,5,141,4,83, + 0,41,6,78,114,10,0,0,0,122,8,60,115,116,114,105, + 110,103,62,114,222,0,0,0,84,41,1,114,238,0,0,0, + 41,1,114,239,0,0,0,114,226,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,220,0,0,0, + 213,4,0,0,115,4,0,0,0,16,1,255,128,122,25,95, + 78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,0,83,0,114,114,0,0,0,114, - 7,0,0,0,114,12,1,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,223,0,0,0,219,4,0, - 0,115,6,0,0,0,2,1,2,128,255,128,122,28,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, - 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, - 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, - 83,0,41,3,122,98,76,111,97,100,32,97,32,110,97,109, - 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, - 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, - 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, - 78,41,4,114,139,0,0,0,114,153,0,0,0,114,19,1, - 0,0,114,224,0,0,0,114,225,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,226,0,0,0, - 222,4,0,0,115,10,0,0,0,6,7,4,1,4,255,12, - 2,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0,114,131, - 0,0,0,114,215,0,0,0,114,213,0,0,0,114,40,1, - 0,0,114,186,0,0,0,114,235,0,0,0,114,219,0,0, - 0,114,218,0,0,0,114,223,0,0,0,114,226,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,39,1,0,0,194,4,0,0,115,22,0, - 0,0,8,0,8,1,2,3,10,1,8,8,8,3,8,3, - 8,3,8,3,12,3,255,128,114,39,1,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,64,0,0,0,115,118,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,101,4,100,2,100,3,132,0,131, - 1,90,5,101,4,100,4,100,5,132,0,131,1,90,6,101, - 4,100,6,100,7,132,0,131,1,90,7,101,4,100,8,100, - 9,132,0,131,1,90,8,101,4,100,19,100,11,100,12,132, - 1,131,1,90,9,101,4,100,20,100,13,100,14,132,1,131, - 1,90,10,101,4,100,21,100,15,100,16,132,1,131,1,90, - 11,101,4,100,17,100,18,132,0,131,1,90,12,100,10,83, - 0,41,22,218,10,80,97,116,104,70,105,110,100,101,114,122, - 62,77,101,116,97,32,112,97,116,104,32,102,105,110,100,101, - 114,32,102,111,114,32,115,121,115,46,112,97,116,104,32,97, - 110,100,32,112,97,99,107,97,103,101,32,95,95,112,97,116, - 104,95,95,32,97,116,116,114,105,98,117,116,101,115,46,99, - 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,116, - 1,106,2,160,3,161,0,131,1,68,0,93,44,92,2,125, - 1,125,2,124,2,100,1,117,0,114,40,116,1,106,2,124, - 1,61,0,113,14,116,4,124,2,100,2,131,2,114,14,124, - 2,160,5,161,0,1,0,113,14,100,1,83,0,41,3,122, - 125,67,97,108,108,32,116,104,101,32,105,110,118,97,108,105, - 100,97,116,101,95,99,97,99,104,101,115,40,41,32,109,101, - 116,104,111,100,32,111,110,32,97,108,108,32,112,97,116,104, - 32,101,110,116,114,121,32,102,105,110,100,101,114,115,10,32, - 32,32,32,32,32,32,32,115,116,111,114,101,100,32,105,110, - 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, - 101,114,95,99,97,99,104,101,115,32,40,119,104,101,114,101, - 32,105,109,112,108,101,109,101,110,116,101,100,41,46,78,218, - 17,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104, - 101,115,41,6,218,4,108,105,115,116,114,15,0,0,0,218, - 19,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,218,5,105,116,101,109,115,114,133,0,0,0, - 114,42,1,0,0,41,3,114,197,0,0,0,114,121,0,0, - 0,218,6,102,105,110,100,101,114,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,42,1,0,0,240,4,0, - 0,115,14,0,0,0,22,4,8,1,10,1,10,1,10,1, - 4,128,255,128,122,28,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,0,0,0,0,3, - 0,0,0,9,0,0,0,67,0,0,0,115,76,0,0,0, - 116,0,106,1,100,1,117,1,114,28,116,0,106,1,115,28, - 116,2,160,3,100,2,116,4,161,2,1,0,116,0,106,1, - 68,0,93,36,125,2,122,14,124,2,124,1,131,1,87,0, - 2,0,1,0,83,0,4,0,116,5,121,70,1,0,1,0, - 1,0,89,0,113,34,48,0,100,1,83,0,41,3,122,46, - 83,101,97,114,99,104,32,115,121,115,46,112,97,116,104,95, - 104,111,111,107,115,32,102,111,114,32,97,32,102,105,110,100, - 101,114,32,102,111,114,32,39,112,97,116,104,39,46,78,122, - 23,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32, - 105,115,32,101,109,112,116,121,41,6,114,15,0,0,0,218, - 10,112,97,116,104,95,104,111,111,107,115,114,81,0,0,0, - 114,82,0,0,0,114,142,0,0,0,114,122,0,0,0,41, - 3,114,197,0,0,0,114,52,0,0,0,90,4,104,111,111, - 107,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,11,95,112,97,116,104,95,104,111,111,107,115,250,4,0, - 0,115,18,0,0,0,16,3,12,1,10,1,2,1,14,1, - 12,1,6,1,4,2,255,128,122,22,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,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,100,0,0,0,124,1, - 100,1,107,2,114,42,122,12,116,0,160,1,161,0,125,1, - 87,0,110,20,4,0,116,2,121,40,1,0,1,0,1,0, - 89,0,100,2,83,0,48,0,122,16,116,3,106,4,124,1, - 25,0,125,2,87,0,124,2,83,0,4,0,116,5,121,98, - 1,0,1,0,1,0,124,0,160,6,124,1,161,1,125,2, - 124,2,116,3,106,4,124,1,60,0,89,0,124,2,83,0, - 48,0,41,3,122,210,71,101,116,32,116,104,101,32,102,105, - 110,100,101,114,32,102,111,114,32,116,104,101,32,112,97,116, - 104,32,101,110,116,114,121,32,102,114,111,109,32,115,121,115, - 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,46,10,10,32,32,32,32,32,32,32,32,73, - 102,32,116,104,101,32,112,97,116,104,32,101,110,116,114,121, - 32,105,115,32,110,111,116,32,105,110,32,116,104,101,32,99, - 97,99,104,101,44,32,102,105,110,100,32,116,104,101,32,97, - 112,112,114,111,112,114,105,97,116,101,32,102,105,110,100,101, - 114,10,32,32,32,32,32,32,32,32,97,110,100,32,99,97, - 99,104,101,32,105,116,46,32,73,102,32,110,111,32,102,105, - 110,100,101,114,32,105,115,32,97,118,97,105,108,97,98,108, - 101,44,32,115,116,111,114,101,32,78,111,110,101,46,10,10, - 32,32,32,32,32,32,32,32,114,10,0,0,0,78,41,7, - 114,18,0,0,0,114,63,0,0,0,218,17,70,105,108,101, - 78,111,116,70,111,117,110,100,69,114,114,111,114,114,15,0, - 0,0,114,44,1,0,0,218,8,75,101,121,69,114,114,111, - 114,114,48,1,0,0,41,3,114,197,0,0,0,114,52,0, - 0,0,114,46,1,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,20,95,112,97,116,104,95,105,109, - 112,111,114,116,101,114,95,99,97,99,104,101,7,5,0,0, - 115,28,0,0,0,8,8,2,1,12,1,12,1,8,3,2, - 1,12,1,4,4,12,253,10,1,12,1,4,1,2,255,255, - 128,122,31,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,99,97,99, - 104,101,99,3,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,4,0,0,0,67,0,0,0,115,82,0,0,0, - 116,0,124,2,100,1,131,2,114,26,124,2,160,1,124,1, - 161,1,92,2,125,3,125,4,110,14,124,2,160,2,124,1, - 161,1,125,3,103,0,125,4,124,3,100,0,117,1,114,60, - 116,3,160,4,124,1,124,3,161,2,83,0,116,3,160,5, - 124,1,100,0,161,2,125,5,124,4,124,5,95,6,124,5, - 83,0,41,2,78,114,141,0,0,0,41,7,114,133,0,0, - 0,114,141,0,0,0,114,210,0,0,0,114,139,0,0,0, - 114,205,0,0,0,114,187,0,0,0,114,182,0,0,0,41, - 6,114,197,0,0,0,114,143,0,0,0,114,46,1,0,0, - 114,144,0,0,0,114,145,0,0,0,114,191,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,16, - 95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99, - 29,5,0,0,115,20,0,0,0,10,4,16,1,10,2,4, - 1,8,1,12,1,12,1,6,1,4,1,255,128,122,27,80, - 97,116,104,70,105,110,100,101,114,46,95,108,101,103,97,99, - 121,95,103,101,116,95,115,112,101,99,78,99,4,0,0,0, - 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, - 67,0,0,0,115,166,0,0,0,103,0,125,4,124,2,68, - 0,93,134,125,5,116,0,124,5,116,1,116,2,102,2,131, - 2,115,28,113,8,124,0,160,3,124,5,161,1,125,6,124, - 6,100,1,117,1,114,8,116,4,124,6,100,2,131,2,114, - 70,124,6,160,5,124,1,124,3,161,2,125,7,110,12,124, - 0,160,6,124,1,124,6,161,2,125,7,124,7,100,1,117, - 0,114,92,113,8,124,7,106,7,100,1,117,1,114,110,124, - 7,2,0,1,0,83,0,124,7,106,8,125,8,124,8,100, - 1,117,0,114,132,116,9,100,3,131,1,130,1,124,4,160, - 10,124,8,161,1,1,0,113,8,116,11,160,12,124,1,100, - 1,161,2,125,7,124,4,124,7,95,8,124,7,83,0,41, - 4,122,63,70,105,110,100,32,116,104,101,32,108,111,97,100, - 101,114,32,111,114,32,110,97,109,101,115,112,97,99,101,95, - 112,97,116,104,32,102,111,114,32,116,104,105,115,32,109,111, - 100,117,108,101,47,112,97,99,107,97,103,101,32,110,97,109, - 101,46,78,114,207,0,0,0,122,19,115,112,101,99,32,109, - 105,115,115,105,110,103,32,108,111,97,100,101,114,41,13,114, - 165,0,0,0,114,90,0,0,0,218,5,98,121,116,101,115, - 114,51,1,0,0,114,133,0,0,0,114,207,0,0,0,114, - 52,1,0,0,114,144,0,0,0,114,182,0,0,0,114,122, - 0,0,0,114,171,0,0,0,114,139,0,0,0,114,187,0, - 0,0,41,9,114,197,0,0,0,114,143,0,0,0,114,52, - 0,0,0,114,206,0,0,0,218,14,110,97,109,101,115,112, - 97,99,101,95,112,97,116,104,90,5,101,110,116,114,121,114, - 46,1,0,0,114,191,0,0,0,114,145,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,9,95, - 103,101,116,95,115,112,101,99,44,5,0,0,115,42,0,0, - 0,4,5,8,1,14,1,2,1,10,1,8,1,10,1,14, - 1,12,2,8,1,2,1,10,1,8,1,6,1,8,1,8, - 1,12,5,12,2,6,1,4,1,255,128,122,20,80,97,116, - 104,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, - 99,99,4,0,0,0,0,0,0,0,0,0,0,0,6,0, - 0,0,5,0,0,0,67,0,0,0,115,94,0,0,0,124, - 2,100,1,117,0,114,14,116,0,106,1,125,2,124,0,160, - 2,124,1,124,2,124,3,161,3,125,4,124,4,100,1,117, - 0,114,40,100,1,83,0,124,4,106,3,100,1,117,0,114, - 90,124,4,106,4,125,5,124,5,114,86,100,1,124,4,95, - 5,116,6,124,1,124,5,124,0,106,2,131,3,124,4,95, - 4,124,4,83,0,100,1,83,0,124,4,83,0,41,2,122, - 141,84,114,121,32,116,111,32,102,105,110,100,32,97,32,115, - 112,101,99,32,102,111,114,32,39,102,117,108,108,110,97,109, - 101,39,32,111,110,32,115,121,115,46,112,97,116,104,32,111, - 114,32,39,112,97,116,104,39,46,10,10,32,32,32,32,32, - 32,32,32,84,104,101,32,115,101,97,114,99,104,32,105,115, - 32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,97, - 116,104,95,104,111,111,107,115,32,97,110,100,32,115,121,115, - 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,46,10,32,32,32,32,32,32,32,32,78,41, - 7,114,15,0,0,0,114,52,0,0,0,114,55,1,0,0, - 114,144,0,0,0,114,182,0,0,0,114,185,0,0,0,114, - 17,1,0,0,41,6,114,197,0,0,0,114,143,0,0,0, - 114,52,0,0,0,114,206,0,0,0,114,191,0,0,0,114, - 54,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,207,0,0,0,76,5,0,0,115,28,0,0, - 0,8,6,6,1,14,1,8,1,4,1,10,1,6,1,4, - 1,6,3,16,1,4,1,4,2,4,2,255,128,122,20,80, - 97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,115, - 112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,30,0,0, - 0,124,0,160,0,124,1,124,2,161,2,125,3,124,3,100, - 1,117,0,114,24,100,1,83,0,124,3,106,1,83,0,41, - 2,122,170,102,105,110,100,32,116,104,101,32,109,111,100,117, - 108,101,32,111,110,32,115,121,115,46,112,97,116,104,32,111, - 114,32,39,112,97,116,104,39,32,98,97,115,101,100,32,111, + 0,115,4,0,0,0,100,1,83,0,114,217,0,0,0,114, + 7,0,0,0,114,218,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,219,0,0,0,216,4,0, + 0,115,4,0,0,0,4,128,255,128,122,30,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, + 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,0,83,0,114,114,0,0, + 0,114,7,0,0,0,114,13,1,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,224,0,0,0,219, + 4,0,0,115,6,0,0,0,2,1,2,128,255,128,122,28, + 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, + 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,67,0,0,0,115,26,0,0,0,116,0,160,1,100,1, + 124,0,106,2,161,2,1,0,116,0,160,3,124,0,124,1, + 161,2,83,0,41,3,122,98,76,111,97,100,32,97,32,110, + 97,109,101,115,112,97,99,101,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,109, + 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,32,32,32,32,122,38,110,97,109,101, + 115,112,97,99,101,32,109,111,100,117,108,101,32,108,111,97, + 100,101,100,32,119,105,116,104,32,112,97,116,104,32,123,33, + 114,125,78,41,4,114,139,0,0,0,114,153,0,0,0,114, + 20,1,0,0,114,225,0,0,0,114,226,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,227,0, + 0,0,222,4,0,0,115,10,0,0,0,6,7,4,1,4, + 255,12,2,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0, + 114,131,0,0,0,114,216,0,0,0,114,213,0,0,0,114, + 41,1,0,0,114,186,0,0,0,114,236,0,0,0,114,220, + 0,0,0,114,219,0,0,0,114,224,0,0,0,114,227,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,40,1,0,0,194,4,0,0,115, + 22,0,0,0,8,0,8,1,2,3,10,1,8,8,8,3, + 8,3,8,3,8,3,12,3,255,128,114,40,1,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,64,0,0,0,115,118,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,101,4,100,2,100,3,132, + 0,131,1,90,5,101,4,100,4,100,5,132,0,131,1,90, + 6,101,7,100,6,100,7,132,0,131,1,90,8,101,7,100, + 8,100,9,132,0,131,1,90,9,101,7,100,19,100,11,100, + 12,132,1,131,1,90,10,101,7,100,20,100,13,100,14,132, + 1,131,1,90,11,101,7,100,21,100,15,100,16,132,1,131, + 1,90,12,101,4,100,17,100,18,132,0,131,1,90,13,100, + 10,83,0,41,22,218,10,80,97,116,104,70,105,110,100,101, + 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, + 100,101,114,32,102,111,114,32,115,121,115,46,112,97,116,104, + 32,97,110,100,32,112,97,99,107,97,103,101,32,95,95,112, + 97,116,104,95,95,32,97,116,116,114,105,98,117,116,101,115, + 46,99,0,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116, + 0,116,1,106,2,160,3,161,0,131,1,68,0,93,44,92, + 2,125,0,125,1,124,1,100,1,117,0,114,40,116,1,106, + 2,124,0,61,0,113,14,116,4,124,1,100,2,131,2,114, + 14,124,1,160,5,161,0,1,0,113,14,100,1,83,0,41, + 3,122,125,67,97,108,108,32,116,104,101,32,105,110,118,97, + 108,105,100,97,116,101,95,99,97,99,104,101,115,40,41,32, + 109,101,116,104,111,100,32,111,110,32,97,108,108,32,112,97, + 116,104,32,101,110,116,114,121,32,102,105,110,100,101,114,115, + 10,32,32,32,32,32,32,32,32,115,116,111,114,101,100,32, + 105,110,32,115,121,115,46,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,115,32,40,119,104,101, + 114,101,32,105,109,112,108,101,109,101,110,116,101,100,41,46, + 78,218,17,105,110,118,97,108,105,100,97,116,101,95,99,97, + 99,104,101,115,41,6,218,4,108,105,115,116,114,15,0,0, + 0,218,19,112,97,116,104,95,105,109,112,111,114,116,101,114, + 95,99,97,99,104,101,218,5,105,116,101,109,115,114,133,0, + 0,0,114,43,1,0,0,41,2,114,121,0,0,0,218,6, + 102,105,110,100,101,114,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,43,1,0,0,240,4,0,0,115,14, + 0,0,0,22,4,8,1,10,1,10,1,10,1,4,128,255, + 128,122,28,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, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 9,0,0,0,67,0,0,0,115,76,0,0,0,116,0,106, + 1,100,1,117,1,114,28,116,0,106,1,115,28,116,2,160, + 3,100,2,116,4,161,2,1,0,116,0,106,1,68,0,93, + 36,125,1,122,14,124,1,124,0,131,1,87,0,2,0,1, + 0,83,0,4,0,116,5,121,70,1,0,1,0,1,0,89, + 0,113,34,48,0,100,1,83,0,41,3,122,46,83,101,97, + 114,99,104,32,115,121,115,46,112,97,116,104,95,104,111,111, + 107,115,32,102,111,114,32,97,32,102,105,110,100,101,114,32, + 102,111,114,32,39,112,97,116,104,39,46,78,122,23,115,121, + 115,46,112,97,116,104,95,104,111,111,107,115,32,105,115,32, + 101,109,112,116,121,41,6,114,15,0,0,0,218,10,112,97, + 116,104,95,104,111,111,107,115,114,81,0,0,0,114,82,0, + 0,0,114,142,0,0,0,114,122,0,0,0,41,2,114,52, + 0,0,0,90,4,104,111,111,107,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, + 104,111,111,107,115,250,4,0,0,115,18,0,0,0,16,3, + 12,1,10,1,2,1,14,1,12,1,6,1,4,2,255,128, + 122,22,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,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, + 0,115,100,0,0,0,124,1,100,1,107,2,114,42,122,12, + 116,0,160,1,161,0,125,1,87,0,110,20,4,0,116,2, + 121,40,1,0,1,0,1,0,89,0,100,2,83,0,48,0, + 122,16,116,3,106,4,124,1,25,0,125,2,87,0,124,2, + 83,0,4,0,116,5,121,98,1,0,1,0,1,0,124,0, + 160,6,124,1,161,1,125,2,124,2,116,3,106,4,124,1, + 60,0,89,0,124,2,83,0,48,0,41,3,122,210,71,101, + 116,32,116,104,101,32,102,105,110,100,101,114,32,102,111,114, + 32,116,104,101,32,112,97,116,104,32,101,110,116,114,121,32, + 102,114,111,109,32,115,121,115,46,112,97,116,104,95,105,109, + 112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,32, + 32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,97, + 116,104,32,101,110,116,114,121,32,105,115,32,110,111,116,32, + 105,110,32,116,104,101,32,99,97,99,104,101,44,32,102,105, + 110,100,32,116,104,101,32,97,112,112,114,111,112,114,105,97, + 116,101,32,102,105,110,100,101,114,10,32,32,32,32,32,32, + 32,32,97,110,100,32,99,97,99,104,101,32,105,116,46,32, + 73,102,32,110,111,32,102,105,110,100,101,114,32,105,115,32, + 97,118,97,105,108,97,98,108,101,44,32,115,116,111,114,101, + 32,78,111,110,101,46,10,10,32,32,32,32,32,32,32,32, + 114,10,0,0,0,78,41,7,114,18,0,0,0,114,63,0, + 0,0,218,17,70,105,108,101,78,111,116,70,111,117,110,100, + 69,114,114,111,114,114,15,0,0,0,114,45,1,0,0,218, + 8,75,101,121,69,114,114,111,114,114,49,1,0,0,41,3, + 114,202,0,0,0,114,52,0,0,0,114,47,1,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,20, + 95,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, + 97,99,104,101,7,5,0,0,115,28,0,0,0,8,8,2, + 1,12,1,12,1,8,3,2,1,12,1,4,4,12,253,10, + 1,12,1,4,1,2,255,255,128,122,31,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,99,97,99,104,101,99,3,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67, + 0,0,0,115,82,0,0,0,116,0,124,2,100,1,131,2, + 114,26,124,2,160,1,124,1,161,1,92,2,125,3,125,4, + 110,14,124,2,160,2,124,1,161,1,125,3,103,0,125,4, + 124,3,100,0,117,1,114,60,116,3,160,4,124,1,124,3, + 161,2,83,0,116,3,160,5,124,1,100,0,161,2,125,5, + 124,4,124,5,95,6,124,5,83,0,41,2,78,114,141,0, + 0,0,41,7,114,133,0,0,0,114,141,0,0,0,114,210, + 0,0,0,114,139,0,0,0,114,205,0,0,0,114,187,0, + 0,0,114,182,0,0,0,41,6,114,202,0,0,0,114,143, + 0,0,0,114,47,1,0,0,114,144,0,0,0,114,145,0, + 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,16,95,108,101,103,97,99,121,95, + 103,101,116,95,115,112,101,99,29,5,0,0,115,20,0,0, + 0,10,4,16,1,10,2,4,1,8,1,12,1,12,1,6, + 1,4,1,255,128,122,27,80,97,116,104,70,105,110,100,101, + 114,46,95,108,101,103,97,99,121,95,103,101,116,95,115,112, + 101,99,78,99,4,0,0,0,0,0,0,0,0,0,0,0, + 9,0,0,0,5,0,0,0,67,0,0,0,115,166,0,0, + 0,103,0,125,4,124,2,68,0,93,134,125,5,116,0,124, + 5,116,1,116,2,102,2,131,2,115,28,113,8,124,0,160, + 3,124,5,161,1,125,6,124,6,100,1,117,1,114,8,116, + 4,124,6,100,2,131,2,114,70,124,6,160,5,124,1,124, + 3,161,2,125,7,110,12,124,0,160,6,124,1,124,6,161, + 2,125,7,124,7,100,1,117,0,114,92,113,8,124,7,106, + 7,100,1,117,1,114,110,124,7,2,0,1,0,83,0,124, + 7,106,8,125,8,124,8,100,1,117,0,114,132,116,9,100, + 3,131,1,130,1,124,4,160,10,124,8,161,1,1,0,113, + 8,116,11,160,12,124,1,100,1,161,2,125,7,124,4,124, + 7,95,8,124,7,83,0,41,4,122,63,70,105,110,100,32, + 116,104,101,32,108,111,97,100,101,114,32,111,114,32,110,97, + 109,101,115,112,97,99,101,95,112,97,116,104,32,102,111,114, + 32,116,104,105,115,32,109,111,100,117,108,101,47,112,97,99, + 107,97,103,101,32,110,97,109,101,46,78,114,207,0,0,0, + 122,19,115,112,101,99,32,109,105,115,115,105,110,103,32,108, + 111,97,100,101,114,41,13,114,165,0,0,0,114,90,0,0, + 0,218,5,98,121,116,101,115,114,52,1,0,0,114,133,0, + 0,0,114,207,0,0,0,114,53,1,0,0,114,144,0,0, + 0,114,182,0,0,0,114,122,0,0,0,114,171,0,0,0, + 114,139,0,0,0,114,187,0,0,0,41,9,114,202,0,0, + 0,114,143,0,0,0,114,52,0,0,0,114,206,0,0,0, + 218,14,110,97,109,101,115,112,97,99,101,95,112,97,116,104, + 90,5,101,110,116,114,121,114,47,1,0,0,114,191,0,0, + 0,114,145,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,9,95,103,101,116,95,115,112,101,99, + 44,5,0,0,115,42,0,0,0,4,5,8,1,14,1,2, + 1,10,1,8,1,10,1,14,1,12,2,8,1,2,1,10, + 1,8,1,6,1,8,1,8,1,12,5,12,2,6,1,4, + 1,255,128,122,20,80,97,116,104,70,105,110,100,101,114,46, + 95,103,101,116,95,115,112,101,99,99,4,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,5,0,0,0,67,0, + 0,0,115,94,0,0,0,124,2,100,1,117,0,114,14,116, + 0,106,1,125,2,124,0,160,2,124,1,124,2,124,3,161, + 3,125,4,124,4,100,1,117,0,114,40,100,1,83,0,124, + 4,106,3,100,1,117,0,114,90,124,4,106,4,125,5,124, + 5,114,86,100,1,124,4,95,5,116,6,124,1,124,5,124, + 0,106,2,131,3,124,4,95,4,124,4,83,0,100,1,83, + 0,124,4,83,0,41,2,122,141,84,114,121,32,116,111,32, + 102,105,110,100,32,97,32,115,112,101,99,32,102,111,114,32, + 39,102,117,108,108,110,97,109,101,39,32,111,110,32,115,121, + 115,46,112,97,116,104,32,111,114,32,39,112,97,116,104,39, + 46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,115, + 101,97,114,99,104,32,105,115,32,98,97,115,101,100,32,111, 110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,115, - 32,97,110,100,10,32,32,32,32,32,32,32,32,115,121,115, - 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, - 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,32,32,32,32,78,114,208, - 0,0,0,114,209,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,210,0,0,0,100,5,0,0, - 115,10,0,0,0,12,8,8,1,4,1,6,1,255,128,122, - 22,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, - 95,109,111,100,117,108,101,99,1,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,79,0,0,0, - 115,28,0,0,0,100,1,100,2,108,0,109,1,125,3,1, - 0,124,3,106,2,124,1,105,0,124,2,164,1,142,1,83, - 0,41,4,97,32,1,0,0,10,32,32,32,32,32,32,32, - 32,70,105,110,100,32,100,105,115,116,114,105,98,117,116,105, - 111,110,115,46,10,10,32,32,32,32,32,32,32,32,82,101, - 116,117,114,110,32,97,110,32,105,116,101,114,97,98,108,101, - 32,111,102,32,97,108,108,32,68,105,115,116,114,105,98,117, - 116,105,111,110,32,105,110,115,116,97,110,99,101,115,32,99, - 97,112,97,98,108,101,32,111,102,10,32,32,32,32,32,32, - 32,32,108,111,97,100,105,110,103,32,116,104,101,32,109,101, - 116,97,100,97,116,97,32,102,111,114,32,112,97,99,107,97, - 103,101,115,32,109,97,116,99,104,105,110,103,32,96,96,99, - 111,110,116,101,120,116,46,110,97,109,101,96,96,10,32,32, - 32,32,32,32,32,32,40,111,114,32,97,108,108,32,110,97, - 109,101,115,32,105,102,32,96,96,78,111,110,101,96,96,32, - 105,110,100,105,99,97,116,101,100,41,32,97,108,111,110,103, - 32,116,104,101,32,112,97,116,104,115,32,105,110,32,116,104, - 101,32,108,105,115,116,10,32,32,32,32,32,32,32,32,111, - 102,32,100,105,114,101,99,116,111,114,105,101,115,32,96,96, - 99,111,110,116,101,120,116,46,112,97,116,104,96,96,46,10, - 32,32,32,32,32,32,32,32,114,0,0,0,0,41,1,218, - 18,77,101,116,97,100,97,116,97,80,97,116,104,70,105,110, - 100,101,114,78,41,3,90,18,105,109,112,111,114,116,108,105, - 98,46,109,101,116,97,100,97,116,97,114,56,1,0,0,218, - 18,102,105,110,100,95,100,105,115,116,114,105,98,117,116,105, - 111,110,115,41,4,114,197,0,0,0,114,124,0,0,0,114, - 125,0,0,0,114,56,1,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,57,1,0,0,113,5,0, - 0,115,6,0,0,0,12,10,16,1,255,128,122,29,80,97, - 116,104,70,105,110,100,101,114,46,102,105,110,100,95,100,105, - 115,116,114,105,98,117,116,105,111,110,115,41,1,78,41,2, - 78,78,41,1,78,41,13,114,130,0,0,0,114,129,0,0, - 0,114,131,0,0,0,114,132,0,0,0,114,213,0,0,0, - 114,42,1,0,0,114,48,1,0,0,114,51,1,0,0,114, - 52,1,0,0,114,55,1,0,0,114,207,0,0,0,114,210, - 0,0,0,114,57,1,0,0,114,7,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,41,1,0, - 0,236,4,0,0,115,38,0,0,0,8,0,4,2,2,2, - 10,1,2,9,10,1,2,12,10,1,2,21,10,1,2,14, - 12,1,2,31,12,1,2,23,12,1,2,12,14,1,255,128, - 114,41,1,0,0,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,90, - 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, - 2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,101, - 6,90,7,100,6,100,7,132,0,90,8,100,8,100,9,132, - 0,90,9,100,19,100,11,100,12,132,1,90,10,100,13,100, - 14,132,0,90,11,101,12,100,15,100,16,132,0,131,1,90, - 13,100,17,100,18,132,0,90,14,100,10,83,0,41,20,218, - 10,70,105,108,101,70,105,110,100,101,114,122,172,70,105,108, - 101,45,98,97,115,101,100,32,102,105,110,100,101,114,46,10, - 10,32,32,32,32,73,110,116,101,114,97,99,116,105,111,110, - 115,32,119,105,116,104,32,116,104,101,32,102,105,108,101,32, - 115,121,115,116,101,109,32,97,114,101,32,99,97,99,104,101, - 100,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99, - 101,44,32,98,101,105,110,103,10,32,32,32,32,114,101,102, - 114,101,115,104,101,100,32,119,104,101,110,32,116,104,101,32, - 100,105,114,101,99,116,111,114,121,32,116,104,101,32,102,105, - 110,100,101,114,32,105,115,32,104,97,110,100,108,105,110,103, - 32,104,97,115,32,98,101,101,110,32,109,111,100,105,102,105, - 101,100,46,10,10,32,32,32,32,99,2,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,6,0,0,0,7,0, - 0,0,115,84,0,0,0,103,0,125,3,124,2,68,0,93, - 32,92,2,137,0,125,4,124,3,160,0,135,0,102,1,100, - 1,100,2,132,8,124,4,68,0,131,1,161,1,1,0,113, - 8,124,3,124,0,95,1,124,1,112,54,100,3,124,0,95, - 2,100,4,124,0,95,3,116,4,131,0,124,0,95,5,116, - 4,131,0,124,0,95,6,100,5,83,0,41,6,122,154,73, - 110,105,116,105,97,108,105,122,101,32,119,105,116,104,32,116, - 104,101,32,112,97,116,104,32,116,111,32,115,101,97,114,99, - 104,32,111,110,32,97,110,100,32,97,32,118,97,114,105,97, - 98,108,101,32,110,117,109,98,101,114,32,111,102,10,32,32, - 32,32,32,32,32,32,50,45,116,117,112,108,101,115,32,99, - 111,110,116,97,105,110,105,110,103,32,116,104,101,32,108,111, - 97,100,101,114,32,97,110,100,32,116,104,101,32,102,105,108, - 101,32,115,117,102,102,105,120,101,115,32,116,104,101,32,108, - 111,97,100,101,114,10,32,32,32,32,32,32,32,32,114,101, - 99,111,103,110,105,122,101,115,46,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,3,0,0,0,51,0, - 0,0,115,22,0,0,0,124,0,93,14,125,1,124,1,136, - 0,102,2,86,0,1,0,113,2,100,0,83,0,114,114,0, - 0,0,114,7,0,0,0,114,13,1,0,0,169,1,114,144, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,9,0, - 0,0,142,5,0,0,115,6,0,0,0,18,0,4,128,255, - 128,122,38,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,114,79,0,0,0,114,109, - 0,0,0,78,41,7,114,171,0,0,0,218,8,95,108,111, - 97,100,101,114,115,114,52,0,0,0,218,11,95,112,97,116, - 104,95,109,116,105,109,101,218,3,115,101,116,218,11,95,112, - 97,116,104,95,99,97,99,104,101,218,19,95,114,101,108,97, - 120,101,100,95,112,97,116,104,95,99,97,99,104,101,41,5, - 114,123,0,0,0,114,52,0,0,0,218,14,108,111,97,100, - 101,114,95,100,101,116,97,105,108,115,90,7,108,111,97,100, - 101,114,115,114,193,0,0,0,114,7,0,0,0,114,59,1, - 0,0,114,8,0,0,0,114,215,0,0,0,136,5,0,0, - 115,20,0,0,0,4,4,12,1,26,1,6,1,10,2,6, - 1,8,1,8,1,4,128,255,128,122,19,70,105,108,101,70, - 105,110,100,101,114,46,95,95,105,110,105,116,95,95,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, - 0,0,0,67,0,0,0,115,10,0,0,0,100,1,124,0, - 95,0,100,2,83,0,41,3,122,31,73,110,118,97,108,105, - 100,97,116,101,32,116,104,101,32,100,105,114,101,99,116,111, - 114,121,32,109,116,105,109,101,46,114,109,0,0,0,78,41, - 1,114,61,1,0,0,114,252,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,42,1,0,0,150, - 5,0,0,115,6,0,0,0,6,2,4,128,255,128,122,28, - 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,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, - 0,67,0,0,0,115,42,0,0,0,124,0,160,0,124,1, - 161,1,125,2,124,2,100,1,117,0,114,26,100,1,103,0, - 102,2,83,0,124,2,106,1,124,2,106,2,112,38,103,0, - 102,2,83,0,41,2,122,197,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,44,32,111,114,32,116,104,101,32,110,97, - 109,101,115,112,97,99,101,10,32,32,32,32,32,32,32,32, - 112,97,99,107,97,103,101,32,112,111,114,116,105,111,110,115, - 46,32,82,101,116,117,114,110,115,32,40,108,111,97,100,101, - 114,44,32,108,105,115,116,45,111,102,45,112,111,114,116,105, - 111,110,115,41,46,10,10,32,32,32,32,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, - 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,3, - 114,207,0,0,0,114,144,0,0,0,114,182,0,0,0,41, - 3,114,123,0,0,0,114,143,0,0,0,114,191,0,0,0, + 32,97,110,100,32,115,121,115,46,112,97,116,104,95,105,109, + 112,111,114,116,101,114,95,99,97,99,104,101,46,10,32,32, + 32,32,32,32,32,32,78,41,7,114,15,0,0,0,114,52, + 0,0,0,114,56,1,0,0,114,144,0,0,0,114,182,0, + 0,0,114,185,0,0,0,114,18,1,0,0,41,6,114,202, + 0,0,0,114,143,0,0,0,114,52,0,0,0,114,206,0, + 0,0,114,191,0,0,0,114,55,1,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,207,0,0,0, + 76,5,0,0,115,28,0,0,0,8,6,6,1,14,1,8, + 1,4,1,10,1,6,1,4,1,6,3,16,1,4,1,4, + 2,4,2,255,128,122,20,80,97,116,104,70,105,110,100,101, + 114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, + 67,0,0,0,115,30,0,0,0,124,0,160,0,124,1,124, + 2,161,2,125,3,124,3,100,1,117,0,114,24,100,1,83, + 0,124,3,106,1,83,0,41,2,122,170,102,105,110,100,32, + 116,104,101,32,109,111,100,117,108,101,32,111,110,32,115,121, + 115,46,112,97,116,104,32,111,114,32,39,112,97,116,104,39, + 32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,97, + 116,104,95,104,111,111,107,115,32,97,110,100,10,32,32,32, + 32,32,32,32,32,115,121,115,46,112,97,116,104,95,105,109, + 112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99, + 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, + 32,32,32,32,32,78,114,208,0,0,0,114,209,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 141,0,0,0,156,5,0,0,115,10,0,0,0,10,7,8, - 1,8,1,16,1,255,128,122,22,70,105,108,101,70,105,110, - 100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99, - 6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0, - 6,0,0,0,67,0,0,0,115,26,0,0,0,124,1,124, - 2,124,3,131,2,125,6,116,0,124,2,124,3,124,6,124, - 4,100,1,141,4,83,0,41,2,78,114,181,0,0,0,41, - 1,114,194,0,0,0,41,7,114,123,0,0,0,114,192,0, - 0,0,114,143,0,0,0,114,52,0,0,0,90,4,115,109, - 115,108,114,206,0,0,0,114,144,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,55,1,0,0, - 168,5,0,0,115,10,0,0,0,10,1,8,1,2,1,6, - 255,255,128,122,20,70,105,108,101,70,105,110,100,101,114,46, - 95,103,101,116,95,115,112,101,99,78,99,3,0,0,0,0, - 0,0,0,0,0,0,0,14,0,0,0,8,0,0,0,67, - 0,0,0,115,92,1,0,0,100,1,125,3,124,1,160,0, - 100,2,161,1,100,3,25,0,125,4,122,24,116,1,124,0, - 106,2,112,34,116,3,160,4,161,0,131,1,106,5,125,5, - 87,0,110,22,4,0,116,6,121,64,1,0,1,0,1,0, - 100,4,125,5,89,0,110,2,48,0,124,5,124,0,106,7, - 107,3,114,90,124,0,160,8,161,0,1,0,124,5,124,0, - 95,7,116,9,131,0,114,112,124,0,106,10,125,6,124,4, - 160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,4, - 125,7,124,7,124,6,118,0,114,214,116,13,124,0,106,2, - 124,4,131,2,125,8,124,0,106,14,68,0,93,56,92,2, - 125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,8, - 124,11,131,2,125,12,116,15,124,12,131,1,114,148,124,0, - 160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,5, - 2,0,1,0,83,0,116,17,124,8,131,1,125,3,124,0, - 106,14,68,0,93,80,92,2,125,9,125,10,116,13,124,0, - 106,2,124,4,124,9,23,0,131,2,125,12,116,18,106,19, - 100,6,124,12,100,3,100,7,141,3,1,0,124,7,124,9, - 23,0,124,6,118,0,114,220,116,15,124,12,131,1,114,220, - 124,0,160,16,124,10,124,1,124,12,100,8,124,2,161,5, - 2,0,1,0,83,0,124,3,144,1,114,88,116,18,160,19, - 100,9,124,8,161,2,1,0,116,18,160,20,124,1,100,8, - 161,2,125,13,124,8,103,1,124,13,95,21,124,13,83,0, - 100,8,83,0,41,10,122,111,84,114,121,32,116,111,32,102, - 105,110,100,32,97,32,115,112,101,99,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,46,10,10,32,32,32,32,32,32,32,32,82,101, - 116,117,114,110,115,32,116,104,101,32,109,97,116,99,104,105, - 110,103,32,115,112,101,99,44,32,111,114,32,78,111,110,101, - 32,105,102,32,110,111,116,32,102,111,117,110,100,46,10,32, - 32,32,32,32,32,32,32,70,114,79,0,0,0,114,39,0, - 0,0,114,109,0,0,0,114,215,0,0,0,122,9,116,114, - 121,105,110,103,32,123,125,41,1,90,9,118,101,114,98,111, - 115,105,116,121,78,122,25,112,111,115,115,105,98,108,101,32, - 110,97,109,101,115,112,97,99,101,32,102,111,114,32,123,125, - 41,22,114,49,0,0,0,114,57,0,0,0,114,52,0,0, - 0,114,18,0,0,0,114,63,0,0,0,114,6,1,0,0, - 114,58,0,0,0,114,61,1,0,0,218,11,95,102,105,108, - 108,95,99,97,99,104,101,114,21,0,0,0,114,64,1,0, - 0,114,110,0,0,0,114,63,1,0,0,114,48,0,0,0, - 114,60,1,0,0,114,62,0,0,0,114,55,1,0,0,114, - 64,0,0,0,114,139,0,0,0,114,153,0,0,0,114,187, - 0,0,0,114,182,0,0,0,41,14,114,123,0,0,0,114, - 143,0,0,0,114,206,0,0,0,90,12,105,115,95,110,97, - 109,101,115,112,97,99,101,90,11,116,97,105,108,95,109,111, - 100,117,108,101,114,173,0,0,0,90,5,99,97,99,104,101, - 90,12,99,97,99,104,101,95,109,111,100,117,108,101,90,9, - 98,97,115,101,95,112,97,116,104,114,14,1,0,0,114,192, - 0,0,0,90,13,105,110,105,116,95,102,105,108,101,110,97, - 109,101,90,9,102,117,108,108,95,112,97,116,104,114,191,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,207,0,0,0,173,5,0,0,115,74,0,0,0,4, - 5,14,1,2,1,24,1,12,1,10,1,10,1,8,1,6, - 1,6,2,6,1,10,1,6,2,4,1,8,2,12,1,14, - 1,8,1,10,1,8,1,24,1,8,4,14,2,16,1,16, - 1,12,1,8,1,10,1,4,1,8,255,6,2,12,1,12, - 1,8,1,4,1,4,1,255,128,122,20,70,105,108,101,70, - 105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,99, - 1,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, - 10,0,0,0,67,0,0,0,115,188,0,0,0,124,0,106, - 0,125,1,122,22,116,1,160,2,124,1,112,22,116,1,160, - 3,161,0,161,1,125,2,87,0,110,28,4,0,116,4,116, - 5,116,6,102,3,121,56,1,0,1,0,1,0,103,0,125, - 2,89,0,110,2,48,0,116,7,106,8,160,9,100,1,161, - 1,115,82,116,10,124,2,131,1,124,0,95,11,110,74,116, - 10,131,0,125,3,124,2,68,0,93,56,125,4,124,4,160, - 12,100,2,161,1,92,3,125,5,125,6,125,7,124,6,114, - 134,100,3,160,13,124,5,124,7,160,14,161,0,161,2,125, - 8,110,4,124,5,125,8,124,3,160,15,124,8,161,1,1, - 0,113,92,124,3,124,0,95,11,116,7,106,8,160,9,116, - 16,161,1,114,184,100,4,100,5,132,0,124,2,68,0,131, - 1,124,0,95,17,100,6,83,0,41,7,122,68,70,105,108, - 108,32,116,104,101,32,99,97,99,104,101,32,111,102,32,112, - 111,116,101,110,116,105,97,108,32,109,111,100,117,108,101,115, - 32,97,110,100,32,112,97,99,107,97,103,101,115,32,102,111, - 114,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121, - 46,114,14,0,0,0,114,79,0,0,0,114,69,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,4,0,0,0,83,0,0,0,115,20,0,0,0,104,0, - 124,0,93,12,125,1,124,1,160,0,161,0,146,2,113,4, - 83,0,114,7,0,0,0,41,1,114,110,0,0,0,41,2, - 114,5,0,0,0,90,2,102,110,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,13,0,0,0,250,5,0, - 0,115,4,0,0,0,20,0,255,128,122,41,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,115,101,116, - 99,111,109,112,62,78,41,18,114,52,0,0,0,114,18,0, - 0,0,90,7,108,105,115,116,100,105,114,114,63,0,0,0, - 114,49,1,0,0,218,15,80,101,114,109,105,115,115,105,111, - 110,69,114,114,111,114,218,18,78,111,116,65,68,105,114,101, - 99,116,111,114,121,69,114,114,111,114,114,15,0,0,0,114, - 22,0,0,0,114,23,0,0,0,114,62,1,0,0,114,63, - 1,0,0,114,105,0,0,0,114,70,0,0,0,114,110,0, - 0,0,218,3,97,100,100,114,24,0,0,0,114,64,1,0, - 0,41,9,114,123,0,0,0,114,52,0,0,0,90,8,99, - 111,110,116,101,110,116,115,90,21,108,111,119,101,114,95,115, - 117,102,102,105,120,95,99,111,110,116,101,110,116,115,114,37, - 1,0,0,114,121,0,0,0,114,24,1,0,0,114,14,1, - 0,0,90,8,110,101,119,95,110,97,109,101,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,66,1,0,0, - 221,5,0,0,115,38,0,0,0,6,2,2,1,22,1,18, - 1,10,3,12,3,12,1,6,7,8,1,16,1,4,1,18, - 1,4,2,12,1,6,1,12,1,16,1,4,128,255,128,122, - 22,70,105,108,101,70,105,110,100,101,114,46,95,102,105,108, - 108,95,99,97,99,104,101,99,1,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,3,0,0,0,7,0,0,0, - 115,18,0,0,0,135,0,135,1,102,2,100,1,100,2,132, - 8,125,2,124,2,83,0,41,4,97,20,1,0,0,65,32, - 99,108,97,115,115,32,109,101,116,104,111,100,32,119,104,105, - 99,104,32,114,101,116,117,114,110,115,32,97,32,99,108,111, - 115,117,114,101,32,116,111,32,117,115,101,32,111,110,32,115, - 121,115,46,112,97,116,104,95,104,111,111,107,10,32,32,32, - 32,32,32,32,32,119,104,105,99,104,32,119,105,108,108,32, - 114,101,116,117,114,110,32,97,110,32,105,110,115,116,97,110, - 99,101,32,117,115,105,110,103,32,116,104,101,32,115,112,101, - 99,105,102,105,101,100,32,108,111,97,100,101,114,115,32,97, - 110,100,32,116,104,101,32,112,97,116,104,10,32,32,32,32, - 32,32,32,32,99,97,108,108,101,100,32,111,110,32,116,104, - 101,32,99,108,111,115,117,114,101,46,10,10,32,32,32,32, - 32,32,32,32,73,102,32,116,104,101,32,112,97,116,104,32, - 99,97,108,108,101,100,32,111,110,32,116,104,101,32,99,108, - 111,115,117,114,101,32,105,115,32,110,111,116,32,97,32,100, - 105,114,101,99,116,111,114,121,44,32,73,109,112,111,114,116, - 69,114,114,111,114,32,105,115,10,32,32,32,32,32,32,32, - 32,114,97,105,115,101,100,46,10,10,32,32,32,32,32,32, - 32,32,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,4,0,0,0,19,0,0,0,115,36,0,0,0, - 116,0,124,0,131,1,115,20,116,1,100,1,124,0,100,2, - 141,2,130,1,136,0,124,0,103,1,136,1,162,1,82,0, - 142,0,83,0,41,4,122,45,80,97,116,104,32,104,111,111, - 107,32,102,111,114,32,105,109,112,111,114,116,108,105,98,46, - 109,97,99,104,105,110,101,114,121,46,70,105,108,101,70,105, - 110,100,101,114,46,122,30,111,110,108,121,32,100,105,114,101, - 99,116,111,114,105,101,115,32,97,114,101,32,115,117,112,112, - 111,114,116,101,100,114,56,0,0,0,78,41,2,114,64,0, - 0,0,114,122,0,0,0,114,56,0,0,0,169,2,114,197, - 0,0,0,114,65,1,0,0,114,7,0,0,0,114,8,0, - 0,0,218,24,112,97,116,104,95,104,111,111,107,95,102,111, - 114,95,70,105,108,101,70,105,110,100,101,114,6,6,0,0, - 115,8,0,0,0,8,2,12,1,16,1,255,128,122,54,70, + 210,0,0,0,100,5,0,0,115,10,0,0,0,12,8,8, + 1,4,1,6,1,255,128,122,22,80,97,116,104,70,105,110, + 100,101,114,46,102,105,110,100,95,109,111,100,117,108,101,99, + 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 4,0,0,0,79,0,0,0,115,28,0,0,0,100,1,100, + 2,108,0,109,1,125,2,1,0,124,2,106,2,124,0,105, + 0,124,1,164,1,142,1,83,0,41,4,97,32,1,0,0, + 10,32,32,32,32,32,32,32,32,70,105,110,100,32,100,105, + 115,116,114,105,98,117,116,105,111,110,115,46,10,10,32,32, + 32,32,32,32,32,32,82,101,116,117,114,110,32,97,110,32, + 105,116,101,114,97,98,108,101,32,111,102,32,97,108,108,32, + 68,105,115,116,114,105,98,117,116,105,111,110,32,105,110,115, + 116,97,110,99,101,115,32,99,97,112,97,98,108,101,32,111, + 102,10,32,32,32,32,32,32,32,32,108,111,97,100,105,110, + 103,32,116,104,101,32,109,101,116,97,100,97,116,97,32,102, + 111,114,32,112,97,99,107,97,103,101,115,32,109,97,116,99, + 104,105,110,103,32,96,96,99,111,110,116,101,120,116,46,110, + 97,109,101,96,96,10,32,32,32,32,32,32,32,32,40,111, + 114,32,97,108,108,32,110,97,109,101,115,32,105,102,32,96, + 96,78,111,110,101,96,96,32,105,110,100,105,99,97,116,101, + 100,41,32,97,108,111,110,103,32,116,104,101,32,112,97,116, + 104,115,32,105,110,32,116,104,101,32,108,105,115,116,10,32, + 32,32,32,32,32,32,32,111,102,32,100,105,114,101,99,116, + 111,114,105,101,115,32,96,96,99,111,110,116,101,120,116,46, + 112,97,116,104,96,96,46,10,32,32,32,32,32,32,32,32, + 114,0,0,0,0,41,1,218,18,77,101,116,97,100,97,116, + 97,80,97,116,104,70,105,110,100,101,114,78,41,3,90,18, + 105,109,112,111,114,116,108,105,98,46,109,101,116,97,100,97, + 116,97,114,57,1,0,0,218,18,102,105,110,100,95,100,105, + 115,116,114,105,98,117,116,105,111,110,115,41,3,114,124,0, + 0,0,114,125,0,0,0,114,57,1,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,58,1,0,0, + 113,5,0,0,115,6,0,0,0,12,10,16,1,255,128,122, + 29,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, + 95,100,105,115,116,114,105,98,117,116,105,111,110,115,41,1, + 78,41,2,78,78,41,1,78,41,14,114,130,0,0,0,114, + 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,213, + 0,0,0,114,43,1,0,0,114,49,1,0,0,114,214,0, + 0,0,114,52,1,0,0,114,53,1,0,0,114,56,1,0, + 0,114,207,0,0,0,114,210,0,0,0,114,58,1,0,0, + 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,42,1,0,0,236,4,0,0,115,38,0, + 0,0,8,0,4,2,2,2,10,1,2,9,10,1,2,12, + 10,1,2,21,10,1,2,14,12,1,2,31,12,1,2,23, + 12,1,2,12,14,1,255,128,114,42,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,64,0,0,0,115,90,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,101,6,90,7,100,6,100,7,132, + 0,90,8,100,8,100,9,132,0,90,9,100,19,100,11,100, + 12,132,1,90,10,100,13,100,14,132,0,90,11,101,12,100, + 15,100,16,132,0,131,1,90,13,100,17,100,18,132,0,90, + 14,100,10,83,0,41,20,218,10,70,105,108,101,70,105,110, + 100,101,114,122,172,70,105,108,101,45,98,97,115,101,100,32, + 102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,116, + 101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,116, + 104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,97, + 114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,101, + 114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,103, + 10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,119, + 104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,114, + 121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,32, + 104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,101, + 110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,32, + 32,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,6,0,0,0,7,0,0,0,115,84,0,0,0,103, + 0,125,3,124,2,68,0,93,32,92,2,137,0,125,4,124, + 3,160,0,135,0,102,1,100,1,100,2,132,8,124,4,68, + 0,131,1,161,1,1,0,113,8,124,3,124,0,95,1,124, + 1,112,54,100,3,124,0,95,2,100,4,124,0,95,3,116, + 4,131,0,124,0,95,5,116,4,131,0,124,0,95,6,100, + 5,83,0,41,6,122,154,73,110,105,116,105,97,108,105,122, + 101,32,119,105,116,104,32,116,104,101,32,112,97,116,104,32, + 116,111,32,115,101,97,114,99,104,32,111,110,32,97,110,100, + 32,97,32,118,97,114,105,97,98,108,101,32,110,117,109,98, + 101,114,32,111,102,10,32,32,32,32,32,32,32,32,50,45, + 116,117,112,108,101,115,32,99,111,110,116,97,105,110,105,110, + 103,32,116,104,101,32,108,111,97,100,101,114,32,97,110,100, + 32,116,104,101,32,102,105,108,101,32,115,117,102,102,105,120, + 101,115,32,116,104,101,32,108,111,97,100,101,114,10,32,32, + 32,32,32,32,32,32,114,101,99,111,103,110,105,122,101,115, + 46,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,51,0,0,0,115,22,0,0,0,124, + 0,93,14,125,1,124,1,136,0,102,2,86,0,1,0,113, + 2,100,0,83,0,114,114,0,0,0,114,7,0,0,0,114, + 14,1,0,0,169,1,114,144,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,9,0,0,0,142,5,0,0,115,6, + 0,0,0,18,0,4,128,255,128,122,38,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,114,79,0,0,0,114,109,0,0,0,78,41,7,114,171, + 0,0,0,218,8,95,108,111,97,100,101,114,115,114,52,0, + 0,0,218,11,95,112,97,116,104,95,109,116,105,109,101,218, + 3,115,101,116,218,11,95,112,97,116,104,95,99,97,99,104, + 101,218,19,95,114,101,108,97,120,101,100,95,112,97,116,104, + 95,99,97,99,104,101,41,5,114,123,0,0,0,114,52,0, + 0,0,218,14,108,111,97,100,101,114,95,100,101,116,97,105, + 108,115,90,7,108,111,97,100,101,114,115,114,193,0,0,0, + 114,7,0,0,0,114,60,1,0,0,114,8,0,0,0,114, + 216,0,0,0,136,5,0,0,115,20,0,0,0,4,4,12, + 1,26,1,6,1,10,2,6,1,8,1,8,1,4,128,255, + 128,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, + 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, + 10,0,0,0,100,1,124,0,95,0,100,2,83,0,41,3, + 122,31,73,110,118,97,108,105,100,97,116,101,32,116,104,101, + 32,100,105,114,101,99,116,111,114,121,32,109,116,105,109,101, + 46,114,109,0,0,0,78,41,1,114,62,1,0,0,114,253, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,43,1,0,0,150,5,0,0,115,6,0,0,0, + 6,2,4,128,255,128,122,28,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,0,0,0,0,0,0,0, + 0,3,0,0,0,3,0,0,0,67,0,0,0,115,42,0, + 0,0,124,0,160,0,124,1,161,1,125,2,124,2,100,1, + 117,0,114,26,100,1,103,0,102,2,83,0,124,2,106,1, + 124,2,106,2,112,38,103,0,102,2,83,0,41,2,122,197, + 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,44,32,111, + 114,32,116,104,101,32,110,97,109,101,115,112,97,99,101,10, + 32,32,32,32,32,32,32,32,112,97,99,107,97,103,101,32, + 112,111,114,116,105,111,110,115,46,32,82,101,116,117,114,110, + 115,32,40,108,111,97,100,101,114,44,32,108,105,115,116,45, + 111,102,45,112,111,114,116,105,111,110,115,41,46,10,10,32, + 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99, + 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, + 32,32,32,32,32,78,41,3,114,207,0,0,0,114,144,0, + 0,0,114,182,0,0,0,41,3,114,123,0,0,0,114,143, + 0,0,0,114,191,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,141,0,0,0,156,5,0,0, + 115,10,0,0,0,10,7,8,1,8,1,16,1,255,128,122, + 22,70,105,108,101,70,105,110,100,101,114,46,102,105,110,100, + 95,108,111,97,100,101,114,99,6,0,0,0,0,0,0,0, + 0,0,0,0,7,0,0,0,6,0,0,0,67,0,0,0, + 115,26,0,0,0,124,1,124,2,124,3,131,2,125,6,116, + 0,124,2,124,3,124,6,124,4,100,1,141,4,83,0,41, + 2,78,114,181,0,0,0,41,1,114,194,0,0,0,41,7, + 114,123,0,0,0,114,192,0,0,0,114,143,0,0,0,114, + 52,0,0,0,90,4,115,109,115,108,114,206,0,0,0,114, + 144,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,56,1,0,0,168,5,0,0,115,10,0,0, + 0,10,1,8,1,2,1,6,255,255,128,122,20,70,105,108, + 101,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, + 99,78,99,3,0,0,0,0,0,0,0,0,0,0,0,14, + 0,0,0,8,0,0,0,67,0,0,0,115,92,1,0,0, + 100,1,125,3,124,1,160,0,100,2,161,1,100,3,25,0, + 125,4,122,24,116,1,124,0,106,2,112,34,116,3,160,4, + 161,0,131,1,106,5,125,5,87,0,110,22,4,0,116,6, + 121,64,1,0,1,0,1,0,100,4,125,5,89,0,110,2, + 48,0,124,5,124,0,106,7,107,3,114,90,124,0,160,8, + 161,0,1,0,124,5,124,0,95,7,116,9,131,0,114,112, + 124,0,106,10,125,6,124,4,160,11,161,0,125,7,110,10, + 124,0,106,12,125,6,124,4,125,7,124,7,124,6,118,0, + 114,214,116,13,124,0,106,2,124,4,131,2,125,8,124,0, + 106,14,68,0,93,56,92,2,125,9,125,10,100,5,124,9, + 23,0,125,11,116,13,124,8,124,11,131,2,125,12,116,15, + 124,12,131,1,114,148,124,0,160,16,124,10,124,1,124,12, + 124,8,103,1,124,2,161,5,2,0,1,0,83,0,116,17, + 124,8,131,1,125,3,124,0,106,14,68,0,93,80,92,2, + 125,9,125,10,116,13,124,0,106,2,124,4,124,9,23,0, + 131,2,125,12,116,18,106,19,100,6,124,12,100,3,100,7, + 141,3,1,0,124,7,124,9,23,0,124,6,118,0,114,220, + 116,15,124,12,131,1,114,220,124,0,160,16,124,10,124,1, + 124,12,100,8,124,2,161,5,2,0,1,0,83,0,124,3, + 144,1,114,88,116,18,160,19,100,9,124,8,161,2,1,0, + 116,18,160,20,124,1,100,8,161,2,125,13,124,8,103,1, + 124,13,95,21,124,13,83,0,100,8,83,0,41,10,122,111, + 84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,112, + 101,99,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,46,10,10,32,32, + 32,32,32,32,32,32,82,101,116,117,114,110,115,32,116,104, + 101,32,109,97,116,99,104,105,110,103,32,115,112,101,99,44, + 32,111,114,32,78,111,110,101,32,105,102,32,110,111,116,32, + 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,70, + 114,79,0,0,0,114,39,0,0,0,114,109,0,0,0,114, + 216,0,0,0,122,9,116,114,121,105,110,103,32,123,125,41, + 1,90,9,118,101,114,98,111,115,105,116,121,78,122,25,112, + 111,115,115,105,98,108,101,32,110,97,109,101,115,112,97,99, + 101,32,102,111,114,32,123,125,41,22,114,49,0,0,0,114, + 57,0,0,0,114,52,0,0,0,114,18,0,0,0,114,63, + 0,0,0,114,7,1,0,0,114,58,0,0,0,114,62,1, + 0,0,218,11,95,102,105,108,108,95,99,97,99,104,101,114, + 21,0,0,0,114,65,1,0,0,114,110,0,0,0,114,64, + 1,0,0,114,48,0,0,0,114,61,1,0,0,114,62,0, + 0,0,114,56,1,0,0,114,64,0,0,0,114,139,0,0, + 0,114,153,0,0,0,114,187,0,0,0,114,182,0,0,0, + 41,14,114,123,0,0,0,114,143,0,0,0,114,206,0,0, + 0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,90, + 11,116,97,105,108,95,109,111,100,117,108,101,114,173,0,0, + 0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,95, + 109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,116, + 104,114,15,1,0,0,114,192,0,0,0,90,13,105,110,105, + 116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,108, + 95,112,97,116,104,114,191,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,207,0,0,0,173,5, + 0,0,115,74,0,0,0,4,5,14,1,2,1,24,1,12, + 1,10,1,10,1,8,1,6,1,6,2,6,1,10,1,6, + 2,4,1,8,2,12,1,14,1,8,1,10,1,8,1,24, + 1,8,4,14,2,16,1,16,1,12,1,8,1,10,1,4, + 1,8,255,6,2,12,1,12,1,8,1,4,1,4,1,255, + 128,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0, + 0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0, + 115,188,0,0,0,124,0,106,0,125,1,122,22,116,1,160, + 2,124,1,112,22,116,1,160,3,161,0,161,1,125,2,87, + 0,110,28,4,0,116,4,116,5,116,6,102,3,121,56,1, + 0,1,0,1,0,103,0,125,2,89,0,110,2,48,0,116, + 7,106,8,160,9,100,1,161,1,115,82,116,10,124,2,131, + 1,124,0,95,11,110,74,116,10,131,0,125,3,124,2,68, + 0,93,56,125,4,124,4,160,12,100,2,161,1,92,3,125, + 5,125,6,125,7,124,6,114,134,100,3,160,13,124,5,124, + 7,160,14,161,0,161,2,125,8,110,4,124,5,125,8,124, + 3,160,15,124,8,161,1,1,0,113,92,124,3,124,0,95, + 11,116,7,106,8,160,9,116,16,161,1,114,184,100,4,100, + 5,132,0,124,2,68,0,131,1,124,0,95,17,100,6,83, + 0,41,7,122,68,70,105,108,108,32,116,104,101,32,99,97, + 99,104,101,32,111,102,32,112,111,116,101,110,116,105,97,108, + 32,109,111,100,117,108,101,115,32,97,110,100,32,112,97,99, + 107,97,103,101,115,32,102,111,114,32,116,104,105,115,32,100, + 105,114,101,99,116,111,114,121,46,114,14,0,0,0,114,79, + 0,0,0,114,69,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,83,0,0, + 0,115,20,0,0,0,104,0,124,0,93,12,125,1,124,1, + 160,0,161,0,146,2,113,4,83,0,114,7,0,0,0,41, + 1,114,110,0,0,0,41,2,114,5,0,0,0,90,2,102, + 110,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,13,0,0,0,250,5,0,0,115,4,0,0,0,20,0, + 255,128,122,41,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,115,101,116,99,111,109,112,62,78,41,18, + 114,52,0,0,0,114,18,0,0,0,90,7,108,105,115,116, + 100,105,114,114,63,0,0,0,114,50,1,0,0,218,15,80, + 101,114,109,105,115,115,105,111,110,69,114,114,111,114,218,18, + 78,111,116,65,68,105,114,101,99,116,111,114,121,69,114,114, + 111,114,114,15,0,0,0,114,22,0,0,0,114,23,0,0, + 0,114,63,1,0,0,114,64,1,0,0,114,105,0,0,0, + 114,70,0,0,0,114,110,0,0,0,218,3,97,100,100,114, + 24,0,0,0,114,65,1,0,0,41,9,114,123,0,0,0, + 114,52,0,0,0,90,8,99,111,110,116,101,110,116,115,90, + 21,108,111,119,101,114,95,115,117,102,102,105,120,95,99,111, + 110,116,101,110,116,115,114,38,1,0,0,114,121,0,0,0, + 114,25,1,0,0,114,15,1,0,0,90,8,110,101,119,95, + 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,67,1,0,0,221,5,0,0,115,38,0,0, + 0,6,2,2,1,22,1,18,1,10,3,12,3,12,1,6, + 7,8,1,16,1,4,1,18,1,4,2,12,1,6,1,12, + 1,16,1,4,128,255,128,122,22,70,105,108,101,70,105,110, + 100,101,114,46,95,102,105,108,108,95,99,97,99,104,101,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,7,0,0,0,115,18,0,0,0,135,0,135, + 1,102,2,100,1,100,2,132,8,125,2,124,2,83,0,41, + 4,97,20,1,0,0,65,32,99,108,97,115,115,32,109,101, + 116,104,111,100,32,119,104,105,99,104,32,114,101,116,117,114, + 110,115,32,97,32,99,108,111,115,117,114,101,32,116,111,32, + 117,115,101,32,111,110,32,115,121,115,46,112,97,116,104,95, + 104,111,111,107,10,32,32,32,32,32,32,32,32,119,104,105, + 99,104,32,119,105,108,108,32,114,101,116,117,114,110,32,97, + 110,32,105,110,115,116,97,110,99,101,32,117,115,105,110,103, + 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,108, + 111,97,100,101,114,115,32,97,110,100,32,116,104,101,32,112, + 97,116,104,10,32,32,32,32,32,32,32,32,99,97,108,108, + 101,100,32,111,110,32,116,104,101,32,99,108,111,115,117,114, + 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,116, + 104,101,32,112,97,116,104,32,99,97,108,108,101,100,32,111, + 110,32,116,104,101,32,99,108,111,115,117,114,101,32,105,115, + 32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121, + 44,32,73,109,112,111,114,116,69,114,114,111,114,32,105,115, + 10,32,32,32,32,32,32,32,32,114,97,105,115,101,100,46, + 10,10,32,32,32,32,32,32,32,32,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,19, + 0,0,0,115,36,0,0,0,116,0,124,0,131,1,115,20, + 116,1,100,1,124,0,100,2,141,2,130,1,136,0,124,0, + 103,1,136,1,162,1,82,0,142,0,83,0,41,4,122,45, + 80,97,116,104,32,104,111,111,107,32,102,111,114,32,105,109, + 112,111,114,116,108,105,98,46,109,97,99,104,105,110,101,114, + 121,46,70,105,108,101,70,105,110,100,101,114,46,122,30,111, + 110,108,121,32,100,105,114,101,99,116,111,114,105,101,115,32, + 97,114,101,32,115,117,112,112,111,114,116,101,100,114,56,0, + 0,0,78,41,2,114,64,0,0,0,114,122,0,0,0,114, + 56,0,0,0,169,2,114,202,0,0,0,114,66,1,0,0, + 114,7,0,0,0,114,8,0,0,0,218,24,112,97,116,104, + 95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,105, + 110,100,101,114,6,6,0,0,115,8,0,0,0,8,2,12, + 1,16,1,255,128,122,54,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,107,95,102, + 111,114,95,70,105,108,101,70,105,110,100,101,114,78,114,7, + 0,0,0,41,3,114,202,0,0,0,114,66,1,0,0,114, + 72,1,0,0,114,7,0,0,0,114,71,1,0,0,114,8, + 0,0,0,218,9,112,97,116,104,95,104,111,111,107,252,5, + 0,0,115,6,0,0,0,14,10,4,6,255,128,122,20,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,107,95,102,111,114,95,70,105,108,101,70, - 105,110,100,101,114,78,114,7,0,0,0,41,3,114,197,0, - 0,0,114,65,1,0,0,114,71,1,0,0,114,7,0,0, - 0,114,70,1,0,0,114,8,0,0,0,218,9,112,97,116, - 104,95,104,111,111,107,252,5,0,0,115,6,0,0,0,14, - 10,4,6,255,128,122,20,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,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,12,0,0,0,100,1,160,0,124,0,106, - 1,161,1,83,0,41,2,78,122,16,70,105,108,101,70,105, - 110,100,101,114,40,123,33,114,125,41,41,2,114,70,0,0, - 0,114,52,0,0,0,114,252,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,35,1,0,0,14, - 6,0,0,115,4,0,0,0,12,1,255,128,122,19,70,105, - 108,101,70,105,110,100,101,114,46,95,95,114,101,112,114,95, - 95,41,1,78,41,15,114,130,0,0,0,114,129,0,0,0, - 114,131,0,0,0,114,132,0,0,0,114,215,0,0,0,114, - 42,1,0,0,114,147,0,0,0,114,210,0,0,0,114,141, - 0,0,0,114,55,1,0,0,114,207,0,0,0,114,66,1, - 0,0,114,213,0,0,0,114,72,1,0,0,114,35,1,0, - 0,114,7,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,58,1,0,0,127,5,0,0,115,26, - 0,0,0,8,0,4,2,8,7,8,14,4,4,8,2,8, - 12,10,5,8,48,2,31,10,1,12,17,255,128,114,58,1, - 0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,8,0,0,0,67,0,0,0,115,144,0,0,0, - 124,0,160,0,100,1,161,1,125,4,124,0,160,0,100,2, - 161,1,125,5,124,4,115,66,124,5,114,36,124,5,106,1, - 125,4,110,30,124,2,124,3,107,2,114,56,116,2,124,1, - 124,2,131,2,125,4,110,10,116,3,124,1,124,2,131,2, - 125,4,124,5,115,84,116,4,124,1,124,2,124,4,100,3, - 141,3,125,5,122,38,124,5,124,0,100,2,60,0,124,4, - 124,0,100,1,60,0,124,2,124,0,100,4,60,0,124,3, - 124,0,100,5,60,0,87,0,100,0,83,0,4,0,116,5, - 121,142,1,0,1,0,1,0,89,0,100,0,83,0,48,0, - 41,6,78,218,10,95,95,108,111,97,100,101,114,95,95,218, - 8,95,95,115,112,101,99,95,95,114,59,1,0,0,90,8, - 95,95,102,105,108,101,95,95,90,10,95,95,99,97,99,104, - 101,100,95,95,41,6,218,3,103,101,116,114,144,0,0,0, - 114,11,1,0,0,114,5,1,0,0,114,194,0,0,0,218, - 9,69,120,99,101,112,116,105,111,110,41,6,90,2,110,115, - 114,121,0,0,0,90,8,112,97,116,104,110,97,109,101,90, - 9,99,112,97,116,104,110,97,109,101,114,144,0,0,0,114, - 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,14,95,102,105,120,95,117,112,95,109,111,100, - 117,108,101,20,6,0,0,115,42,0,0,0,10,2,10,1, - 4,1,4,1,8,1,8,1,12,1,10,2,4,1,14,1, - 2,1,8,1,8,1,8,1,10,1,4,128,12,1,2,2, - 4,128,2,0,255,128,114,77,1,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,38,0,0,0,116,0,116,1,160,2,161, - 0,102,2,125,0,116,3,116,4,102,2,125,1,116,5,116, - 6,102,2,125,2,124,0,124,1,124,2,103,3,83,0,41, - 2,122,95,82,101,116,117,114,110,115,32,97,32,108,105,115, - 116,32,111,102,32,102,105,108,101,45,98,97,115,101,100,32, - 109,111,100,117,108,101,32,108,111,97,100,101,114,115,46,10, - 10,32,32,32,32,69,97,99,104,32,105,116,101,109,32,105, - 115,32,97,32,116,117,112,108,101,32,40,108,111,97,100,101, - 114,44,32,115,117,102,102,105,120,101,115,41,46,10,32,32, - 32,32,78,41,7,114,2,1,0,0,114,167,0,0,0,218, - 18,101,120,116,101,110,115,105,111,110,95,115,117,102,102,105, - 120,101,115,114,5,1,0,0,114,106,0,0,0,114,11,1, - 0,0,114,94,0,0,0,41,3,90,10,101,120,116,101,110, - 115,105,111,110,115,90,6,115,111,117,114,99,101,90,8,98, - 121,116,101,99,111,100,101,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,188,0,0,0,43,6,0,0,115, - 10,0,0,0,12,5,8,1,8,1,10,1,255,128,114,188, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,1,0,0,0,67,0,0,0,115,8,0,0, - 0,124,0,97,0,100,0,83,0,114,114,0,0,0,41,1, - 114,139,0,0,0,41,1,218,17,95,98,111,111,116,115,116, - 114,97,112,95,109,111,100,117,108,101,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,21,95,115,101,116,95, - 98,111,111,116,115,116,114,97,112,95,109,111,100,117,108,101, - 54,6,0,0,115,6,0,0,0,4,2,4,128,255,128,114, - 80,1,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,4,0,0,0,67,0,0,0,115,50,0, - 0,0,116,0,124,0,131,1,1,0,116,1,131,0,125,1, - 116,2,106,3,160,4,116,5,106,6,124,1,142,0,103,1, - 161,1,1,0,116,2,106,7,160,8,116,9,161,1,1,0, - 100,1,83,0,41,2,122,41,73,110,115,116,97,108,108,32, - 116,104,101,32,112,97,116,104,45,98,97,115,101,100,32,105, - 109,112,111,114,116,32,99,111,109,112,111,110,101,110,116,115, - 46,78,41,10,114,80,1,0,0,114,188,0,0,0,114,15, - 0,0,0,114,47,1,0,0,114,171,0,0,0,114,58,1, - 0,0,114,72,1,0,0,218,9,109,101,116,97,95,112,97, - 116,104,114,190,0,0,0,114,41,1,0,0,41,2,114,79, - 1,0,0,90,17,115,117,112,112,111,114,116,101,100,95,108, - 111,97,100,101,114,115,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,8,95,105,110,115,116,97,108,108,59, - 6,0,0,115,12,0,0,0,8,2,6,1,20,1,12,1, - 4,128,255,128,114,82,1,0,0,41,1,114,68,0,0,0, - 41,1,78,41,3,78,78,78,41,2,114,0,0,0,0,114, - 0,0,0,0,41,1,84,41,1,78,41,1,78,41,83,114, - 132,0,0,0,114,139,0,0,0,114,167,0,0,0,114,72, - 0,0,0,114,15,0,0,0,114,81,0,0,0,114,164,0, - 0,0,114,22,0,0,0,114,211,0,0,0,90,2,110,116, - 114,18,0,0,0,114,196,0,0,0,90,5,112,111,115,105, - 120,114,42,0,0,0,218,3,97,108,108,114,45,0,0,0, - 114,46,0,0,0,114,66,0,0,0,114,25,0,0,0,90, - 37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, - 86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,84, - 69,83,95,75,69,89,114,24,0,0,0,114,26,0,0,0, - 114,21,0,0,0,114,33,0,0,0,114,38,0,0,0,114, - 40,0,0,0,114,48,0,0,0,114,55,0,0,0,114,57, - 0,0,0,114,61,0,0,0,114,62,0,0,0,114,64,0, - 0,0,114,67,0,0,0,114,77,0,0,0,218,4,116,121, - 112,101,218,8,95,95,99,111,100,101,95,95,114,166,0,0, - 0,114,31,0,0,0,114,152,0,0,0,114,30,0,0,0, - 114,35,0,0,0,114,242,0,0,0,114,97,0,0,0,114, - 93,0,0,0,114,106,0,0,0,114,190,0,0,0,114,78, - 1,0,0,114,212,0,0,0,114,94,0,0,0,90,23,68, - 69,66,85,71,95,66,89,84,69,67,79,68,69,95,83,85, - 70,70,73,88,69,83,90,27,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,114,102,0,0,0,114,107,0,0,0,114,113,0, - 0,0,114,117,0,0,0,114,119,0,0,0,114,140,0,0, - 0,114,147,0,0,0,114,156,0,0,0,114,160,0,0,0, - 114,162,0,0,0,114,169,0,0,0,114,174,0,0,0,114, - 175,0,0,0,114,180,0,0,0,218,6,111,98,106,101,99, - 116,114,189,0,0,0,114,194,0,0,0,114,195,0,0,0, - 114,214,0,0,0,114,227,0,0,0,114,245,0,0,0,114, - 5,1,0,0,114,11,1,0,0,114,2,1,0,0,114,17, - 1,0,0,114,39,1,0,0,114,41,1,0,0,114,58,1, - 0,0,114,77,1,0,0,114,188,0,0,0,114,80,1,0, - 0,114,82,1,0,0,114,7,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,8,60,109,111,100, - 117,108,101,62,1,0,0,0,115,174,0,0,0,4,0,4, - 22,8,3,8,1,8,1,8,1,8,1,10,3,4,1,8, - 1,10,1,8,2,4,3,10,1,6,2,22,2,8,1,10, - 1,14,1,4,4,4,1,2,1,2,1,4,255,8,4,6, - 16,8,3,8,5,8,5,8,6,8,6,8,12,8,10,8, - 9,8,5,8,7,10,9,10,22,0,127,16,22,12,1,4, - 2,4,1,6,2,6,1,10,1,8,2,6,2,8,2,16, - 2,8,71,8,40,8,19,8,12,8,12,8,31,8,17,8, - 33,8,28,10,24,10,13,10,10,8,11,6,14,4,3,2, - 1,12,255,14,68,14,64,16,29,0,127,14,17,18,50,18, - 45,18,25,14,53,14,63,14,42,0,127,14,20,0,127,10, - 22,8,23,8,11,8,5,4,128,255,128, + 111,111,107,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, + 0,100,1,160,0,124,0,106,1,161,1,83,0,41,2,78, + 122,16,70,105,108,101,70,105,110,100,101,114,40,123,33,114, + 125,41,41,2,114,70,0,0,0,114,52,0,0,0,114,253, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,36,1,0,0,14,6,0,0,115,4,0,0,0, + 12,1,255,128,122,19,70,105,108,101,70,105,110,100,101,114, + 46,95,95,114,101,112,114,95,95,41,1,78,41,15,114,130, + 0,0,0,114,129,0,0,0,114,131,0,0,0,114,132,0, + 0,0,114,216,0,0,0,114,43,1,0,0,114,147,0,0, + 0,114,210,0,0,0,114,141,0,0,0,114,56,1,0,0, + 114,207,0,0,0,114,67,1,0,0,114,214,0,0,0,114, + 73,1,0,0,114,36,1,0,0,114,7,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,59,1, + 0,0,127,5,0,0,115,26,0,0,0,8,0,4,2,8, + 7,8,14,4,4,8,2,8,12,10,5,8,48,2,31,10, + 1,12,17,255,128,114,59,1,0,0,99,4,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,8,0,0,0,67, + 0,0,0,115,144,0,0,0,124,0,160,0,100,1,161,1, + 125,4,124,0,160,0,100,2,161,1,125,5,124,4,115,66, + 124,5,114,36,124,5,106,1,125,4,110,30,124,2,124,3, + 107,2,114,56,116,2,124,1,124,2,131,2,125,4,110,10, + 116,3,124,1,124,2,131,2,125,4,124,5,115,84,116,4, + 124,1,124,2,124,4,100,3,141,3,125,5,122,38,124,5, + 124,0,100,2,60,0,124,4,124,0,100,1,60,0,124,2, + 124,0,100,4,60,0,124,3,124,0,100,5,60,0,87,0, + 100,0,83,0,4,0,116,5,121,142,1,0,1,0,1,0, + 89,0,100,0,83,0,48,0,41,6,78,218,10,95,95,108, + 111,97,100,101,114,95,95,218,8,95,95,115,112,101,99,95, + 95,114,60,1,0,0,90,8,95,95,102,105,108,101,95,95, + 90,10,95,95,99,97,99,104,101,100,95,95,41,6,218,3, + 103,101,116,114,144,0,0,0,114,12,1,0,0,114,6,1, + 0,0,114,194,0,0,0,218,9,69,120,99,101,112,116,105, + 111,110,41,6,90,2,110,115,114,121,0,0,0,90,8,112, + 97,116,104,110,97,109,101,90,9,99,112,97,116,104,110,97, + 109,101,114,144,0,0,0,114,191,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,14,95,102,105, + 120,95,117,112,95,109,111,100,117,108,101,20,6,0,0,115, + 42,0,0,0,10,2,10,1,4,1,4,1,8,1,8,1, + 12,1,10,2,4,1,14,1,2,1,8,1,8,1,8,1, + 10,1,4,128,12,1,2,2,4,128,2,0,255,128,114,78, + 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, + 0,116,0,116,1,160,2,161,0,102,2,125,0,116,3,116, + 4,102,2,125,1,116,5,116,6,102,2,125,2,124,0,124, + 1,124,2,103,3,83,0,41,2,122,95,82,101,116,117,114, + 110,115,32,97,32,108,105,115,116,32,111,102,32,102,105,108, + 101,45,98,97,115,101,100,32,109,111,100,117,108,101,32,108, + 111,97,100,101,114,115,46,10,10,32,32,32,32,69,97,99, + 104,32,105,116,101,109,32,105,115,32,97,32,116,117,112,108, + 101,32,40,108,111,97,100,101,114,44,32,115,117,102,102,105, + 120,101,115,41,46,10,32,32,32,32,78,41,7,114,3,1, + 0,0,114,167,0,0,0,218,18,101,120,116,101,110,115,105, + 111,110,95,115,117,102,102,105,120,101,115,114,6,1,0,0, + 114,106,0,0,0,114,12,1,0,0,114,94,0,0,0,41, + 3,90,10,101,120,116,101,110,115,105,111,110,115,90,6,115, + 111,117,114,99,101,90,8,98,121,116,101,99,111,100,101,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,188, + 0,0,0,43,6,0,0,115,10,0,0,0,12,5,8,1, + 8,1,10,1,255,128,114,188,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0, + 67,0,0,0,115,8,0,0,0,124,0,97,0,100,0,83, + 0,114,114,0,0,0,41,1,114,139,0,0,0,41,1,218, + 17,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, + 108,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,21,95,115,101,116,95,98,111,111,116,115,116,114,97, + 112,95,109,111,100,117,108,101,54,6,0,0,115,6,0,0, + 0,4,2,4,128,255,128,114,81,1,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,67,0,0,0,115,50,0,0,0,116,0,124,0,131,1, + 1,0,116,1,131,0,125,1,116,2,106,3,160,4,116,5, + 106,6,124,1,142,0,103,1,161,1,1,0,116,2,106,7, + 160,8,116,9,161,1,1,0,100,1,83,0,41,2,122,41, + 73,110,115,116,97,108,108,32,116,104,101,32,112,97,116,104, + 45,98,97,115,101,100,32,105,109,112,111,114,116,32,99,111, + 109,112,111,110,101,110,116,115,46,78,41,10,114,81,1,0, + 0,114,188,0,0,0,114,15,0,0,0,114,48,1,0,0, + 114,171,0,0,0,114,59,1,0,0,114,73,1,0,0,218, + 9,109,101,116,97,95,112,97,116,104,114,190,0,0,0,114, + 42,1,0,0,41,2,114,80,1,0,0,90,17,115,117,112, + 112,111,114,116,101,100,95,108,111,97,100,101,114,115,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,95, + 105,110,115,116,97,108,108,59,6,0,0,115,12,0,0,0, + 8,2,6,1,20,1,12,1,4,128,255,128,114,83,1,0, + 0,41,1,114,68,0,0,0,41,1,78,41,3,78,78,78, + 41,2,114,0,0,0,0,114,0,0,0,0,41,1,84,41, + 1,78,41,1,78,41,83,114,132,0,0,0,114,139,0,0, + 0,114,167,0,0,0,114,72,0,0,0,114,15,0,0,0, + 114,81,0,0,0,114,164,0,0,0,114,22,0,0,0,114, + 211,0,0,0,90,2,110,116,114,18,0,0,0,114,196,0, + 0,0,90,5,112,111,115,105,120,114,42,0,0,0,218,3, + 97,108,108,114,45,0,0,0,114,46,0,0,0,114,66,0, + 0,0,114,25,0,0,0,90,37,95,67,65,83,69,95,73, + 78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70, + 79,82,77,83,95,66,89,84,69,83,95,75,69,89,114,24, + 0,0,0,114,26,0,0,0,114,21,0,0,0,114,33,0, + 0,0,114,38,0,0,0,114,40,0,0,0,114,48,0,0, + 0,114,55,0,0,0,114,57,0,0,0,114,61,0,0,0, + 114,62,0,0,0,114,64,0,0,0,114,67,0,0,0,114, + 77,0,0,0,218,4,116,121,112,101,218,8,95,95,99,111, + 100,101,95,95,114,166,0,0,0,114,31,0,0,0,114,152, + 0,0,0,114,30,0,0,0,114,35,0,0,0,114,243,0, + 0,0,114,97,0,0,0,114,93,0,0,0,114,106,0,0, + 0,114,190,0,0,0,114,79,1,0,0,114,212,0,0,0, + 114,94,0,0,0,90,23,68,69,66,85,71,95,66,89,84, + 69,67,79,68,69,95,83,85,70,70,73,88,69,83,90,27, + 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,114,102,0,0,0, + 114,107,0,0,0,114,113,0,0,0,114,117,0,0,0,114, + 119,0,0,0,114,140,0,0,0,114,147,0,0,0,114,156, + 0,0,0,114,160,0,0,0,114,162,0,0,0,114,169,0, + 0,0,114,174,0,0,0,114,175,0,0,0,114,180,0,0, + 0,218,6,111,98,106,101,99,116,114,189,0,0,0,114,194, + 0,0,0,114,195,0,0,0,114,215,0,0,0,114,228,0, + 0,0,114,246,0,0,0,114,6,1,0,0,114,12,1,0, + 0,114,3,1,0,0,114,18,1,0,0,114,40,1,0,0, + 114,42,1,0,0,114,59,1,0,0,114,78,1,0,0,114, + 188,0,0,0,114,81,1,0,0,114,83,1,0,0,114,7, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,8,60,109,111,100,117,108,101,62,1,0,0,0, + 115,174,0,0,0,4,0,4,22,8,3,8,1,8,1,8, + 1,8,1,10,3,4,1,8,1,10,1,8,2,4,3,10, + 1,6,2,22,2,8,1,10,1,14,1,4,4,4,1,2, + 1,2,1,4,255,8,4,6,16,8,3,8,5,8,5,8, + 6,8,6,8,12,8,10,8,9,8,5,8,7,10,9,10, + 22,0,127,16,22,12,1,4,2,4,1,6,2,6,1,10, + 1,8,2,6,2,8,2,16,2,8,71,8,40,8,19,8, + 12,8,12,8,31,8,17,8,33,8,28,10,24,10,13,10, + 10,8,11,6,14,4,3,2,1,12,255,14,68,14,64,16, + 29,0,127,14,17,18,50,18,45,18,25,14,53,14,63,14, + 42,0,127,14,20,0,127,10,22,8,23,8,11,8,5,4, + 128,255,128, }; From 17e55cd47d81ec51017e588ed7fc0b56b7107681 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filipe=20La=C3=ADns?= Date: Fri, 20 Nov 2020 14:14:16 +0000 Subject: [PATCH 0605/1261] bpo-42212: Check if generated files are up-to-date in GitHub Actions (GH-23042) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https: //github.com/python/core-workflow/issues/380 Signed-off-by: Filipe Laíns --- .github/workflows/build.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c9b568002f7b43..c1a017165665f6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,6 +47,34 @@ jobs: # https://github.com/python/core-workflow/issues/373 git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qvE '(\.rst$|^Doc|^Misc)' && echo '::set-output name=run_tests::true' || true fi + + check_generated_files: + name: 'Check if generated files are up to date' + runs-on: ubuntu-latest + needs: check_source + if: needs.check_source.outputs.run_tests == 'true' + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + - name: Install Dependencies + run: sudo ./.github/workflows/posix-deps-apt.sh + - name: Build CPython + run: | + ./configure --with-pydebug + make -j4 regen-all + - name: Check for changes + run: | + changes=$(git status --porcelain) + # Check for changes in regenerated files + if ! test -z "$changes" + then + echo "Generated files not up to date. Perhaps you forgot to run make regen-all ;)" + echo "$changes" + exit 1 + fi + - name: Check exported libpython symbols + run: make smelly + build_win32: name: 'Windows (x86)' runs-on: windows-latest From 91d05112a2053e38c506d5f40b06fbd861ca5be4 Mon Sep 17 00:00:00 2001 From: Joshua Cannon Date: Fri, 20 Nov 2020 09:40:39 -0600 Subject: [PATCH 0606/1261] bpo-35498: Added slice support to PathLib parents attribute. (GH-11165) Added slice support to the `pathlib.Path.parents` sequence. For a `Path` `p`, slices of `p.parents` should return the same thing as slices of `tuple(p.parents)`. --- Doc/library/pathlib.rst | 2 ++ Doc/whatsnew/3.10.rst | 6 ++++ Lib/pathlib.py | 2 ++ Lib/test/test_pathlib.py | 30 +++++++++++++++++++ Misc/ACKS | 1 + .../2018-12-14-13-29-17.bpo-35498.LEJHl7.rst | 1 + 6 files changed, 42 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 9de72bb725c758..2071e7ed5f4bfe 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -336,6 +336,8 @@ Pure paths provide the following methods and properties: >>> p.parents[2] PureWindowsPath('c:/') + .. versionchanged:: 3.10 + Slice support was added. .. data:: PurePath.parent diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 826d12704a1c9e..16cb7efe2984ea 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -244,6 +244,12 @@ descriptors without copying between kernel address space and user address space, where one of the file descriptors must refer to a pipe. (Contributed by Pablo Galindo in :issue:`41625`.) +pathlib +------- + +Added slice support to :meth:`~pathlib.Path.parents`. +(Contributed by Joshua Cannon in :issue:`35498`) + py_compile ---------- diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 178c5b981d8e50..af310393c3e40e 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -630,6 +630,8 @@ def __len__(self): return len(self._parts) def __getitem__(self, idx): + if isinstance(idx, slice): + return tuple(self[i] for i in range(*idx.indices(len(self)))) if idx < 0 or idx >= len(self): raise IndexError(idx) return self._pathcls._from_parsed_parts(self._drv, self._root, diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 17292dc1abf73f..f1451796b6427d 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -440,6 +440,12 @@ def test_parents_common(self): self.assertEqual(par[0], P('a/b')) self.assertEqual(par[1], P('a')) self.assertEqual(par[2], P('.')) + self.assertEqual(par[0:1], (P('a/b'),)) + self.assertEqual(par[:2], (P('a/b'), P('a'))) + self.assertEqual(par[:-1], (P('a/b'), P('a'))) + self.assertEqual(par[1:], (P('a'), P('.'))) + self.assertEqual(par[::2], (P('a/b'), P('.'))) + self.assertEqual(par[::-1], (P('.'), P('a'), P('a/b'))) self.assertEqual(list(par), [P('a/b'), P('a'), P('.')]) with self.assertRaises(IndexError): par[-1] @@ -454,6 +460,12 @@ def test_parents_common(self): self.assertEqual(par[0], P('/a/b')) self.assertEqual(par[1], P('/a')) self.assertEqual(par[2], P('/')) + self.assertEqual(par[0:1], (P('/a/b'),)) + self.assertEqual(par[:2], (P('/a/b'), P('/a'))) + self.assertEqual(par[:-1], (P('/a/b'), P('/a'))) + self.assertEqual(par[1:], (P('/a'), P('/'))) + self.assertEqual(par[::2], (P('/a/b'), P('/'))) + self.assertEqual(par[::-1], (P('/'), P('/a'), P('/a/b'))) self.assertEqual(list(par), [P('/a/b'), P('/a'), P('/')]) with self.assertRaises(IndexError): par[3] @@ -905,6 +917,12 @@ def test_parents(self): self.assertEqual(len(par), 2) self.assertEqual(par[0], P('z:a')) self.assertEqual(par[1], P('z:')) + self.assertEqual(par[0:1], (P('z:a'),)) + self.assertEqual(par[:-1], (P('z:a'),)) + self.assertEqual(par[:2], (P('z:a'), P('z:'))) + self.assertEqual(par[1:], (P('z:'),)) + self.assertEqual(par[::2], (P('z:a'),)) + self.assertEqual(par[::-1], (P('z:'), P('z:a'))) self.assertEqual(list(par), [P('z:a'), P('z:')]) with self.assertRaises(IndexError): par[2] @@ -913,6 +931,12 @@ def test_parents(self): self.assertEqual(len(par), 2) self.assertEqual(par[0], P('z:/a')) self.assertEqual(par[1], P('z:/')) + self.assertEqual(par[0:1], (P('z:/a'),)) + self.assertEqual(par[0:-1], (P('z:/a'),)) + self.assertEqual(par[:2], (P('z:/a'), P('z:/'))) + self.assertEqual(par[1:], (P('z:/'),)) + self.assertEqual(par[::2], (P('z:/a'),)) + self.assertEqual(par[::-1], (P('z:/'), P('z:/a'),)) self.assertEqual(list(par), [P('z:/a'), P('z:/')]) with self.assertRaises(IndexError): par[2] @@ -921,6 +945,12 @@ def test_parents(self): self.assertEqual(len(par), 2) self.assertEqual(par[0], P('//a/b/c')) self.assertEqual(par[1], P('//a/b')) + self.assertEqual(par[0:1], (P('//a/b/c'),)) + self.assertEqual(par[0:-1], (P('//a/b/c'),)) + self.assertEqual(par[:2], (P('//a/b/c'), P('//a/b'))) + self.assertEqual(par[1:], (P('//a/b'),)) + self.assertEqual(par[::2], (P('//a/b/c'),)) + self.assertEqual(par[::-1], (P('//a/b'), P('//a/b/c'))) self.assertEqual(list(par), [P('//a/b/c'), P('//a/b')]) with self.assertRaises(IndexError): par[2] diff --git a/Misc/ACKS b/Misc/ACKS index 1d106144d467f9..43030caae669d4 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -270,6 +270,7 @@ Daniel Calvelo Tony Campbell Giovanni Cappellotto Brett Cannon +Joshua Cannon Tristan Carel Mike Carlton Pierre Carrier diff --git a/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst b/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst new file mode 100644 index 00000000000000..fb24ce027c2186 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst @@ -0,0 +1 @@ +Add slice support to :meth:`~pathlib.Path.parents`. From 2e8ba852e189c8aac1485a58b1440fe69aee1f6f Mon Sep 17 00:00:00 2001 From: Zhang Maiyun Date: Sat, 21 Nov 2020 02:16:46 +0800 Subject: [PATCH 0607/1261] Fix wrong availability for signal.SIGCHLD (#23285) I believe this is a mistake. SIGCHLD is only available on Unix systems, not Windows. --- Doc/library/signal.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 00a730b6b9ca6a..84a569d03eb293 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -117,7 +117,7 @@ The variables defined in the :mod:`signal` module are: Child process stopped or terminated. - .. availability:: Windows. + .. availability:: Unix. .. data:: SIGCLD From eb0d0a10e617c6786b43d97f46d3a8a83623d306 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 20 Nov 2020 12:49:32 -0800 Subject: [PATCH 0608/1261] bpo-42360: Add advice to help avoid pickling issues. (GH-23305) --- Doc/library/collections.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index f538da5e1c9faa..1293f542b04377 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -862,6 +862,9 @@ they add the ability to access fields by name instead of position index. Named tuple instances do not have per-instance dictionaries, so they are lightweight and require no more memory than regular tuples. + To support pickling, the named tuple class should be assigned to a variable + that matches *typename*. + .. versionchanged:: 3.1 Added support for *rename*. From 77083820bdce66bcaacf17934c18e8b934da9652 Mon Sep 17 00:00:00 2001 From: Shantanu <12621235+hauntsaninja@users.noreply.github.com> Date: Fri, 20 Nov 2020 13:16:42 -0800 Subject: [PATCH 0609/1261] bpo-28002: Roundtrip f-strings with ast.unparse better (#19612) By attempting to avoid backslashes in f-string expressions. We also now proactively raise errors for some backslashes we can't avoid while unparsing FormattedValues Co-authored-by: hauntsaninja <> Co-authored-by: Shantanu Co-authored-by: Batuhan Taskaya --- Lib/ast.py | 110 ++++++++++++++++++++++++++++++--------- Lib/test/test_unparse.py | 42 ++++++++++----- 2 files changed, 115 insertions(+), 37 deletions(-) diff --git a/Lib/ast.py b/Lib/ast.py index d8bd3373701dec..7275fe28ba8126 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -662,17 +662,23 @@ def next(self): except ValueError: return self + +_SINGLE_QUOTES = ("'", '"') +_MULTI_QUOTES = ('"""', "'''") +_ALL_QUOTES = (*_SINGLE_QUOTES, *_MULTI_QUOTES) + class _Unparser(NodeVisitor): """Methods in this class recursively traverse an AST and output source code for the abstract syntax; original formatting is disregarded.""" - def __init__(self): + def __init__(self, *, _avoid_backslashes=False): self._source = [] self._buffer = [] self._precedences = {} self._type_ignores = {} self._indent = 0 + self._avoid_backslashes = _avoid_backslashes def interleave(self, inter, f, seq): """Call f on each item in seq, calling inter() in between.""" @@ -1067,15 +1073,85 @@ def visit_AsyncWith(self, node): with self.block(extra=self.get_type_comment(node)): self.traverse(node.body) + def _str_literal_helper( + self, string, *, quote_types=_ALL_QUOTES, escape_special_whitespace=False + ): + """Helper for writing string literals, minimizing escapes. + Returns the tuple (string literal to write, possible quote types). + """ + def escape_char(c): + # \n and \t are non-printable, but we only escape them if + # escape_special_whitespace is True + if not escape_special_whitespace and c in "\n\t": + return c + # Always escape backslashes and other non-printable characters + if c == "\\" or not c.isprintable(): + return c.encode("unicode_escape").decode("ascii") + return c + + escaped_string = "".join(map(escape_char, string)) + possible_quotes = quote_types + if "\n" in escaped_string: + possible_quotes = [q for q in possible_quotes if q in _MULTI_QUOTES] + possible_quotes = [q for q in possible_quotes if q not in escaped_string] + if not possible_quotes: + # If there aren't any possible_quotes, fallback to using repr + # on the original string. Try to use a quote from quote_types, + # e.g., so that we use triple quotes for docstrings. + string = repr(string) + quote = next((q for q in quote_types if string[0] in q), string[0]) + return string[1:-1], [quote] + if escaped_string: + # Sort so that we prefer '''"''' over """\"""" + possible_quotes.sort(key=lambda q: q[0] == escaped_string[-1]) + # If we're using triple quotes and we'd need to escape a final + # quote, escape it + if possible_quotes[0][0] == escaped_string[-1]: + assert len(possible_quotes[0]) == 3 + escaped_string = escaped_string[:-1] + "\\" + escaped_string[-1] + return escaped_string, possible_quotes + + def _write_str_avoiding_backslashes(self, string, *, quote_types=_ALL_QUOTES): + """Write string literal value with a best effort attempt to avoid backslashes.""" + string, quote_types = self._str_literal_helper(string, quote_types=quote_types) + quote_type = quote_types[0] + self.write(f"{quote_type}{string}{quote_type}") + def visit_JoinedStr(self, node): self.write("f") - self._fstring_JoinedStr(node, self.buffer_writer) - self.write(repr(self.buffer)) + if self._avoid_backslashes: + self._fstring_JoinedStr(node, self.buffer_writer) + self._write_str_avoiding_backslashes(self.buffer) + return + + # If we don't need to avoid backslashes globally (i.e., we only need + # to avoid them inside FormattedValues), it's cosmetically preferred + # to use escaped whitespace. That is, it's preferred to use backslashes + # for cases like: f"{x}\n". To accomplish this, we keep track of what + # in our buffer corresponds to FormattedValues and what corresponds to + # Constant parts of the f-string, and allow escapes accordingly. + buffer = [] + for value in node.values: + meth = getattr(self, "_fstring_" + type(value).__name__) + meth(value, self.buffer_writer) + buffer.append((self.buffer, isinstance(value, Constant))) + new_buffer = [] + quote_types = _ALL_QUOTES + for value, is_constant in buffer: + # Repeatedly narrow down the list of possible quote_types + value, quote_types = self._str_literal_helper( + value, quote_types=quote_types, + escape_special_whitespace=is_constant + ) + new_buffer.append(value) + value = "".join(new_buffer) + quote_type = quote_types[0] + self.write(f"{quote_type}{value}{quote_type}") def visit_FormattedValue(self, node): self.write("f") self._fstring_FormattedValue(node, self.buffer_writer) - self.write(repr(self.buffer)) + self._write_str_avoiding_backslashes(self.buffer) def _fstring_JoinedStr(self, node, write): for value in node.values: @@ -1090,11 +1166,13 @@ def _fstring_Constant(self, node, write): def _fstring_FormattedValue(self, node, write): write("{") - unparser = type(self)() + unparser = type(self)(_avoid_backslashes=True) unparser.set_precedence(_Precedence.TEST.next(), node.value) expr = unparser.visit(node.value) if expr.startswith("{"): write(" ") # Separate pair of opening brackets as "{ {" + if "\\" in expr: + raise ValueError("Unable to avoid backslash in f-string expression part") write(expr) if node.conversion != -1: conversion = chr(node.conversion) @@ -1111,33 +1189,17 @@ def visit_Name(self, node): self.write(node.id) def _write_docstring(self, node): - def esc_char(c): - if c in ("\n", "\t"): - # In the AST form, we don't know the author's intentation - # about how this should be displayed. We'll only escape - # \n and \t, because they are more likely to be unescaped - # in the source - return c - return c.encode('unicode_escape').decode('ascii') - self.fill() if node.kind == "u": self.write("u") - - value = node.value - if value: - # Preserve quotes in the docstring by escaping them - value = "".join(map(esc_char, value)) - if value[-1] == '"': - value = value.replace('"', '\\"', -1) - value = value.replace('"""', '""\\"') - - self.write(f'"""{value}"""') + self._write_str_avoiding_backslashes(node.value, quote_types=_MULTI_QUOTES) def _write_constant(self, value): if isinstance(value, (float, complex)): # Substitute overflowing decimal literal for AST infinities. self.write(repr(value).replace("inf", _INFSTR)) + elif self._avoid_backslashes and isinstance(value, str): + self._write_str_avoiding_backslashes(value) else: self.write(repr(value)) diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 532aa3a6390414..c7c8613ea2793f 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -152,6 +152,18 @@ def test_fstrings(self): # See issue 25180 self.check_ast_roundtrip(r"""f'{f"{0}"*3}'""") self.check_ast_roundtrip(r"""f'{f"{y}"*3}'""") + self.check_ast_roundtrip("""f''""") + self.check_ast_roundtrip('''f"""'end' "quote\\""""''') + + def test_fstrings_complicated(self): + # See issue 28002 + self.check_ast_roundtrip("""f'''{"'"}'''""") + self.check_ast_roundtrip('''f\'\'\'-{f"""*{f"+{f'.{x}.'}+"}*"""}-\'\'\'''') + self.check_ast_roundtrip('''f\'\'\'-{f"""*{f"+{f'.{x}.'}+"}*"""}-'single quote\\'\'\'\'''') + self.check_ast_roundtrip('f"""{\'\'\'\n\'\'\'}"""') + self.check_ast_roundtrip('f"""{g(\'\'\'\n\'\'\')}"""') + self.check_ast_roundtrip('''f"a\\r\\nb"''') + self.check_ast_roundtrip('''f"\\u2028{'x'}"''') def test_strings(self): self.check_ast_roundtrip("u'foo'") @@ -311,6 +323,9 @@ def test_invalid_fstring_conversion(self): ) ) + def test_invalid_fstring_backslash(self): + self.check_invalid(ast.FormattedValue(value=ast.Constant(value="\\\\"))) + def test_invalid_set(self): self.check_invalid(ast.Set(elts=[])) @@ -330,8 +345,8 @@ def test_docstrings(self): '\r\\r\t\\t\n\\n', '""">>> content = \"\"\"blabla\"\"\" <<<"""', r'foo\n\x00', - '🐍⛎𩸽üéş^\N{LONG RIGHTWARDS SQUIGGLE ARROW}' - + "' \\'\\'\\'\"\"\" \"\"\\'\\' \\'", + '🐍⛎𩸽üéş^\\\\X\\\\BB\N{LONG RIGHTWARDS SQUIGGLE ARROW}' ) for docstring in docstrings: # check as Module docstrings for easy testing @@ -416,7 +431,6 @@ def test_simple_expressions_parens(self): self.check_src_roundtrip("call((yield x))") self.check_src_roundtrip("return x + (yield x)") - def test_class_bases_and_keywords(self): self.check_src_roundtrip("class X:\n pass") self.check_src_roundtrip("class X(A):\n pass") @@ -429,6 +443,13 @@ def test_class_bases_and_keywords(self): self.check_src_roundtrip("class X(*args):\n pass") self.check_src_roundtrip("class X(*args, **kwargs):\n pass") + def test_fstrings(self): + self.check_src_roundtrip('''f\'\'\'-{f"""*{f"+{f'.{x}.'}+"}*"""}-\'\'\'''') + self.check_src_roundtrip('''f"\\u2028{'x'}"''') + self.check_src_roundtrip(r"f'{x}\n'") + self.check_src_roundtrip('''f''\'{"""\n"""}\\n''\'''') + self.check_src_roundtrip('''f''\'{f"""{x}\n"""}\\n''\'''') + def test_docstrings(self): docstrings = ( '"""simple doc string"""', @@ -443,6 +464,10 @@ def test_docstrings(self): '""""""', '"""\'\'\'"""', '"""\'\'\'\'\'\'"""', + '"""🐍⛎𩸽üéş^\\\\X\\\\BB⟿"""', + '"""end in single \'quote\'"""', + "'''end in double \"quote\"'''", + '"""almost end in double "quote"."""', ) for prefix in docstring_prefixes: @@ -483,9 +508,8 @@ class DirectoryTestCase(ASTTestCase): lib_dir = pathlib.Path(__file__).parent / ".." test_directories = (lib_dir, lib_dir / "test") - skip_files = {"test_fstring.py"} run_always_files = {"test_grammar.py", "test_syntax.py", "test_compile.py", - "test_ast.py", "test_asdl_parser.py"} + "test_ast.py", "test_asdl_parser.py", "test_fstring.py"} _files_to_test = None @@ -525,14 +549,6 @@ def test_files(self): if test.support.verbose: print(f"Testing {item.absolute()}") - # Some f-strings are not correctly round-tripped by - # Tools/parser/unparse.py. See issue 28002 for details. - # We need to skip files that contain such f-strings. - if item.name in self.skip_files: - if test.support.verbose: - print(f"Skipping {item.absolute()}: see issue 28002") - continue - with self.subTest(filename=item): source = read_pyfile(item) self.check_ast_roundtrip(source) From 8e190d70a0ccd4f76da6d4a35e8408c6c8076b42 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Fri, 20 Nov 2020 15:39:28 -0700 Subject: [PATCH 0610/1261] bpo-36876: [c-analyzer tool] Tighten up the results and output. (GH-23431) We also update the "ignored" file with a temporary list of all known globals. --- Tools/c-analyzer/c_analyzer/__main__.py | 18 +- Tools/c-analyzer/c_analyzer/datafiles.py | 71 +- Tools/c-analyzer/c_analyzer/info.py | 13 +- Tools/c-analyzer/c_common/fsutil.py | 120 +- Tools/c-analyzer/c_common/scriptutil.py | 34 +- Tools/c-analyzer/c_common/tables.py | 13 +- Tools/c-analyzer/c_parser/__main__.py | 10 +- Tools/c-analyzer/c_parser/datafiles.py | 35 +- Tools/c-analyzer/c_parser/info.py | 44 +- Tools/c-analyzer/cpython/__main__.py | 7 +- Tools/c-analyzer/cpython/_analyzer.py | 4 +- Tools/c-analyzer/cpython/_parser.py | 6 + Tools/c-analyzer/cpython/ignored.tsv | 2936 ++++++++++++++++++++++ 13 files changed, 3202 insertions(+), 109 deletions(-) diff --git a/Tools/c-analyzer/c_analyzer/__main__.py b/Tools/c-analyzer/c_analyzer/__main__.py index 4cff1d4efb5fe9..44325f2952e28c 100644 --- a/Tools/c-analyzer/c_analyzer/__main__.py +++ b/Tools/c-analyzer/c_analyzer/__main__.py @@ -5,6 +5,7 @@ import re import sys +from c_common import fsutil from c_common.logging import VERBOSITY, Printer from c_common.scriptutil import ( add_verbosity_cli, @@ -298,9 +299,9 @@ def cmd_check(filenames, *, checks=None, ignored=None, fmt=None, - relroot=None, failfast=False, iter_filenames=None, + relroot=fsutil.USE_CWD, track_progress=None, verbosity=VERBOSITY, _analyze=_analyze, @@ -317,14 +318,14 @@ def cmd_check(filenames, *, (handle_failure, handle_after, div ) = _get_check_handlers(fmt, printer, verbosity) - filenames = filter_filenames(filenames, iter_filenames) + filenames, relroot = fsutil.fix_filenames(filenames, relroot=relroot) + filenames = filter_filenames(filenames, iter_filenames, relroot) if track_progress: filenames = track_progress(filenames) logger.info('analyzing files...') analyzed = _analyze(filenames, **kwargs) - if relroot: - analyzed.fix_filenames(relroot) + analyzed.fix_filenames(relroot, normalize=False) decls = filter_forward(analyzed, markpublic=True) logger.info('checking analysis results...') @@ -374,6 +375,7 @@ def _cli_analyze(parser, **kwargs): def cmd_analyze(filenames, *, fmt=None, iter_filenames=None, + relroot=fsutil.USE_CWD, track_progress=None, verbosity=None, _analyze=_analyze, @@ -387,12 +389,14 @@ def cmd_analyze(filenames, *, except KeyError: raise ValueError(f'unsupported fmt {fmt!r}') - filenames = filter_filenames(filenames, iter_filenames) + filenames, relroot = fsutil.fix_filenames(filenames, relroot=relroot) + filenames = filter_filenames(filenames, iter_filenames, relroot) if track_progress: filenames = track_progress(filenames) logger.info('analyzing files...') analyzed = _analyze(filenames, **kwargs) + analyzed.fix_filenames(relroot, normalize=False) decls = filter_forward(analyzed, markpublic=True) for line in do_fmt(decls): @@ -434,7 +438,7 @@ def cmd_data(datacmd, filenames, known=None, *, _analyze=_analyze, formats=FORMATS, extracolumns=None, - relroot=None, + relroot=fsutil.USE_CWD, track_progress=None, **kwargs ): @@ -447,9 +451,11 @@ def cmd_data(datacmd, filenames, known=None, *, for line in do_fmt(known): print(line) elif datacmd == 'dump': + filenames, relroot = fsutil.fix_filenames(filenames, relroot=relroot) if track_progress: filenames = track_progress(filenames) analyzed = _analyze(filenames, **kwargs) + analyzed.fix_filenames(relroot, normalize=False) if known is None or usestdout: outfile = io.StringIO() _datafiles.write_known(analyzed, outfile, extracolumns, diff --git a/Tools/c-analyzer/c_analyzer/datafiles.py b/Tools/c-analyzer/c_analyzer/datafiles.py index d37a4eefe351ad..d5db3bd3ed74ac 100644 --- a/Tools/c-analyzer/c_analyzer/datafiles.py +++ b/Tools/c-analyzer/c_analyzer/datafiles.py @@ -1,3 +1,6 @@ +import os.path + +from c_common import fsutil import c_common.tables as _tables import c_parser.info as _info import c_parser.match as _match @@ -13,31 +16,10 @@ ] -def analyze_known(known, *, - analyze_resolved=None, - handle_unresolved=True, - ): - knowntypes = knowntypespecs = {} - collated = _match.group_by_kinds(known) - types = {decl: None for decl in collated['type']} - typespecs = _analyze.get_typespecs(types) - def analyze_decl(decl): - return _analyze.analyze_decl( - decl, - typespecs, - knowntypespecs, - types, - knowntypes, - analyze_resolved=analyze_resolved, - ) - _analyze.analyze_type_decls(types, analyze_decl, handle_unresolved) - return types, typespecs - - def get_known(known, extracolumns=None, *, analyze_resolved=None, handle_unresolved=True, - relroot=None, + relroot=fsutil.USE_CWD, ): if isinstance(known, str): known = read_known(known, extracolumns, relroot) @@ -48,7 +30,7 @@ def get_known(known, extracolumns=None, *, ) -def read_known(infile, extracolumns=None, relroot=None): +def read_known(infile, extracolumns=None, relroot=fsutil.USE_CWD): extracolumns = EXTRA_COLUMNS + ( list(extracolumns) if extracolumns else [] ) @@ -58,8 +40,29 @@ def read_known(infile, extracolumns=None, relroot=None): return known +def analyze_known(known, *, + analyze_resolved=None, + handle_unresolved=True, + ): + knowntypes = knowntypespecs = {} + collated = _match.group_by_kinds(known) + types = {decl: None for decl in collated['type']} + typespecs = _analyze.get_typespecs(types) + def analyze_decl(decl): + return _analyze.analyze_decl( + decl, + typespecs, + knowntypespecs, + types, + knowntypes, + analyze_resolved=analyze_resolved, + ) + _analyze.analyze_type_decls(types, analyze_decl, handle_unresolved) + return types, typespecs + + def write_known(rows, outfile, extracolumns=None, *, - relroot=None, + relroot=fsutil.USE_CWD, backup=True, ): extracolumns = EXTRA_COLUMNS + ( @@ -86,22 +89,34 @@ def write_known(rows, outfile, extracolumns=None, *, IGNORED_HEADER = '\t'.join(IGNORED_COLUMNS) -def read_ignored(infile): - return dict(_iter_ignored(infile)) +def read_ignored(infile, relroot=fsutil.USE_CWD): + return dict(_iter_ignored(infile, relroot)) -def _iter_ignored(infile): +def _iter_ignored(infile, relroot): + if relroot and relroot is not fsutil.USE_CWD: + relroot = os.path.abspath(relroot) + bogus = {_tables.EMPTY, _tables.UNKNOWN} for row in _tables.read_table(infile, IGNORED_HEADER, sep='\t'): *varidinfo, reason = row + if _tables.EMPTY in varidinfo or _tables.UNKNOWN in varidinfo: + varidinfo = tuple(None if v in bogus else v + for v in varidinfo) + if reason in bogus: + reason = None varid = _info.DeclID.from_row(varidinfo) + varid = varid.fix_filename(relroot, formatted=False, fixroot=False) yield varid, reason -def write_ignored(variables, outfile): +def write_ignored(variables, outfile, relroot=fsutil.USE_CWD): raise NotImplementedError + if relroot and relroot is not fsutil.USE_CWD: + relroot = os.path.abspath(relroot) reason = '???' #if not isinstance(varid, DeclID): # varid = getattr(varid, 'parsed', varid).id + decls = (d.fix_filename(relroot, fixroot=False) for d in decls) _tables.write_table( outfile, IGNORED_HEADER, diff --git a/Tools/c-analyzer/c_analyzer/info.py b/Tools/c-analyzer/c_analyzer/info.py index be9281502d250d..b75918e5e7a687 100644 --- a/Tools/c-analyzer/c_analyzer/info.py +++ b/Tools/c-analyzer/c_analyzer/info.py @@ -1,5 +1,7 @@ from collections import namedtuple +import os.path +from c_common import fsutil from c_common.clsutil import classonly import c_common.misc as _misc from c_parser.info import ( @@ -223,8 +225,9 @@ def is_known(self): else: return UNKNOWN not in self.typedecl - def fix_filename(self, relroot): - self.item.fix_filename(relroot) + def fix_filename(self, relroot=fsutil.USE_CWD, **kwargs): + self.item.fix_filename(relroot, **kwargs) + return self def as_rowdata(self, columns=None): # XXX finsih! @@ -309,9 +312,11 @@ def __getitem__(self, key): else: return self._analyzed[key] - def fix_filenames(self, relroot): + def fix_filenames(self, relroot=fsutil.USE_CWD, **kwargs): + if relroot and relroot is not fsutil.USE_CWD: + relroot = os.path.abspath(relroot) for item in self._analyzed: - item.fix_filename(relroot) + item.fix_filename(relroot, fixroot=False, **kwargs) def _add_result(self, info, resolved): analyzed = type(self).build_item(info, resolved) diff --git a/Tools/c-analyzer/c_common/fsutil.py b/Tools/c-analyzer/c_common/fsutil.py index 56023f33523b0d..120a140288fb72 100644 --- a/Tools/c-analyzer/c_common/fsutil.py +++ b/Tools/c-analyzer/c_common/fsutil.py @@ -8,6 +8,9 @@ from .iterutil import iter_many +USE_CWD = object() + + C_SOURCE_SUFFIXES = ('.c', '.h') @@ -29,6 +32,78 @@ def create_backup(old, backup=None): return backup +################################## +# filenames + +def fix_filename(filename, relroot=USE_CWD, *, + fixroot=True, + _badprefix=f'..{os.path.sep}', + ): + """Return a normalized, absolute-path copy of the given filename.""" + if not relroot or relroot is USE_CWD: + return os.path.abspath(filename) + if fixroot: + relroot = os.path.abspath(relroot) + return _fix_filename(filename, relroot) + + +def _fix_filename(filename, relroot, *, + _badprefix=f'..{os.path.sep}', + ): + orig = filename + + # First we normalize. + filename = os.path.normpath(filename) + if filename.startswith(_badprefix): + raise ValueError(f'bad filename {orig!r} (resolves beyond relative root') + + # Now make sure it is absolute (relative to relroot). + if not os.path.isabs(filename): + filename = os.path.join(relroot, filename) + else: + relpath = os.path.relpath(filename, relroot) + if os.path.join(relroot, relpath) != filename: + raise ValueError(f'expected {relroot!r} as lroot, got {orig!r}') + + return filename + + +def fix_filenames(filenames, relroot=USE_CWD): + if not relroot or relroot is USE_CWD: + filenames = (os.path.abspath(v) for v in filenames) + else: + relroot = os.path.abspath(relroot) + filenames = (_fix_filename(v, relroot) for v in filenames) + return filenames, relroot + + +def format_filename(filename, relroot=USE_CWD, *, + fixroot=True, + normalize=True, + _badprefix=f'..{os.path.sep}', + ): + """Return a consistent relative-path representation of the filename.""" + orig = filename + if normalize: + filename = os.path.normpath(filename) + if relroot is None: + # Otherwise leave it as-is. + return filename + elif relroot is USE_CWD: + # Make it relative to CWD. + filename = os.path.relpath(filename) + else: + # Make it relative to "relroot". + if fixroot: + relroot = os.path.abspath(relroot) + elif not relroot: + raise ValueError('missing relroot') + filename = os.path.relpath(filename, relroot) + if filename.startswith(_badprefix): + raise ValueError(f'bad filename {orig!r} (resolves beyond relative root') + return filename + + ################################## # find files @@ -54,34 +129,29 @@ def match_glob(filename, pattern): return fnmatch.fnmatch(filename, pattern.replace('**/', '', 1)) -def iter_filenames(filenames, *, - start=None, - include=None, - exclude=None, - ): +def process_filenames(filenames, *, + start=None, + include=None, + exclude=None, + relroot=USE_CWD, + ): + if relroot and relroot is not USE_CWD: + relroot = os.path.abspath(relroot) + if start: + start = fix_filename(start, relroot, fixroot=False) + if include: + include = set(fix_filename(v, relroot, fixroot=False) + for v in include) + if exclude: + exclude = set(fix_filename(v, relroot, fixroot=False) + for v in exclude) + onempty = Exception('no filenames provided') for filename, solo in iter_many(filenames, onempty): + filename = fix_filename(filename, relroot, fixroot=False) + relfile = format_filename(filename, relroot, fixroot=False, normalize=False) check, start = _get_check(filename, start, include, exclude) - yield filename, check, solo -# filenames = iter(filenames or ()) -# try: -# first = next(filenames) -# except StopIteration: -# raise Exception('no filenames provided') -# try: -# second = next(filenames) -# except StopIteration: -# check, _ = _get_check(first, start, include, exclude) -# yield first, check, False -# return -# -# check, start = _get_check(first, start, include, exclude) -# yield first, check, True -# check, start = _get_check(second, start, include, exclude) -# yield second, check, True -# for filename in filenames: -# check, start = _get_check(filename, start, include, exclude) -# yield filename, check, True + yield filename, relfile, check, solo def expand_filenames(filenames): diff --git a/Tools/c-analyzer/c_common/scriptutil.py b/Tools/c-analyzer/c_common/scriptutil.py index 222059015d76ec..50dd7548869193 100644 --- a/Tools/c-analyzer/c_common/scriptutil.py +++ b/Tools/c-analyzer/c_common/scriptutil.py @@ -307,7 +307,9 @@ def process_args(args): exclude=tuple(_parse_files(_exclude)), # We use the default for "show_header" ) - ns[key] = (lambda files: fsutil.iter_filenames(files, **kwargs)) + def process_filenames(filenames, relroot=None): + return fsutil.process_filenames(filenames, relroot=relroot, **kwargs) + ns[key] = process_filenames return process_args @@ -529,42 +531,46 @@ def decorator(func): ################################## # main() helpers -def filter_filenames(filenames, iter_filenames=None): - for filename, check, _ in _iter_filenames(filenames, iter_filenames): +def filter_filenames(filenames, process_filenames=None, relroot=fsutil.USE_CWD): + # We expect each filename to be a normalized, absolute path. + for filename, _, check, _ in _iter_filenames(filenames, process_filenames, relroot): if (reason := check()): logger.debug(f'{filename}: {reason}') continue yield filename -def main_for_filenames(filenames, iter_filenames=None): - for filename, check, show in _iter_filenames(filenames, iter_filenames): +def main_for_filenames(filenames, process_filenames=None, relroot=fsutil.USE_CWD): + filenames, relroot = fsutil.fix_filenames(filenames, relroot=relroot) + for filename, relfile, check, show in _iter_filenames(filenames, process_filenames, relroot): if show: print() + print(relfile) print('-------------------------------------------') - print(filename) if (reason := check()): print(reason) continue - yield filename + yield filename, relfile -def _iter_filenames(filenames, iter_files): - if iter_files is None: - iter_files = fsutil.iter_filenames - yield from iter_files(filenames) +def _iter_filenames(filenames, process, relroot): + if process is None: + yield from fsutil.process_filenames(filenames, relroot=relroot) return onempty = Exception('no filenames provided') - items = iter_files(filenames) + items = process(filenames, relroot=relroot) items, peeked = iterutil.peek_and_iter(items) if not items: raise onempty if isinstance(peeked, str): + if relroot and relroot is not fsutil.USE_CWD: + relroot = os.path.abspath(relroot) check = (lambda: True) for filename, ismany in iterutil.iter_many(items, onempty): - yield filename, check, ismany - elif len(peeked) == 3: + relfile = fsutil.format_filename(filename, relroot, fixroot=False) + yield filename, relfile, check, ismany + elif len(peeked) == 4: yield from items else: raise NotImplementedError diff --git a/Tools/c-analyzer/c_common/tables.py b/Tools/c-analyzer/c_common/tables.py index 70a230a90b6e85..411152e3f9498f 100644 --- a/Tools/c-analyzer/c_common/tables.py +++ b/Tools/c-analyzer/c_common/tables.py @@ -26,13 +26,14 @@ def fix_row(row, **markers): unknown = parse_markers(markers.pop('unknown', ('???',))) row = (val if val else None for val in row) if not empty: - if not unknown: - return row - return (UNKNOWN if val in unknown else val for val in row) + if unknown: + row = (UNKNOWN if val in unknown else val for val in row) elif not unknown: - return (EMPTY if val in empty else val for val in row) - return (EMPTY if val in empty else (UNKNOWN if val in unknown else val) - for val in row) + row = (EMPTY if val in empty else val for val in row) + else: + row = (EMPTY if val in empty else (UNKNOWN if val in unknown else val) + for val in row) + return tuple(row) def _fix_read_default(row): diff --git a/Tools/c-analyzer/c_parser/__main__.py b/Tools/c-analyzer/c_parser/__main__.py index 1752a703f606ad..539cec509cecb4 100644 --- a/Tools/c-analyzer/c_parser/__main__.py +++ b/Tools/c-analyzer/c_parser/__main__.py @@ -2,6 +2,7 @@ import os.path import sys +from c_common import fsutil from c_common.scriptutil import ( CLIArgSpec as Arg, add_verbosity_cli, @@ -64,8 +65,9 @@ def fmt_raw(filename, item, *, showfwd=None): def fmt_summary(filename, item, *, showfwd=None): - if item.filename and item.filename != os.path.join('.', filename): + if item.filename != filename: yield f'> {item.filename}' + if showfwd is None: LINE = ' {lno:>5} {kind:10} {funcname:40} {fwd:1} {name:40} {data}' else: @@ -172,6 +174,7 @@ def cmd_parse(filenames, *, fmt='summary', showfwd=None, iter_filenames=None, + relroot=None, **kwargs ): if 'get_file_preprocessor' not in kwargs: @@ -180,9 +183,10 @@ def cmd_parse(filenames, *, do_fmt = FORMATS[fmt] except KeyError: raise ValueError(f'unsupported fmt {fmt!r}') - for filename in main_for_filenames(filenames, iter_filenames): + for filename, relfile in main_for_filenames(filenames, iter_filenames, relroot): for item in _iter_parsed(filename, **kwargs): - for line in do_fmt(filename, item, showfwd=showfwd): + item = item.fix_filename(relroot, fixroot=False, normalize=False) + for line in do_fmt(relfile, item, showfwd=showfwd): print(line) diff --git a/Tools/c-analyzer/c_parser/datafiles.py b/Tools/c-analyzer/c_parser/datafiles.py index cdd69b1f9b2d8a..f053056619f05f 100644 --- a/Tools/c-analyzer/c_parser/datafiles.py +++ b/Tools/c-analyzer/c_parser/datafiles.py @@ -1,5 +1,6 @@ import os.path +from c_common import fsutil import c_common.tables as _tables import c_parser.info as _info @@ -81,21 +82,27 @@ def _get_format_handlers(group, fmt): # tsv -def iter_decls_tsv(infile, extracolumns=None, relroot=None): - for info, extra in _iter_decls_tsv(infile, extracolumns, relroot): +def iter_decls_tsv(infile, extracolumns=None, relroot=fsutil.USE_CWD): + if relroot and relroot is not fsutil.USE_CWD: + relroot = os.path.abspath(relroot) + for info, extra in _iter_decls_tsv(infile, extracolumns): decl = _info.Declaration.from_row(info) + decl = decl.fix_filename(relroot, formatted=False, fixroot=False) yield decl, extra def write_decls_tsv(decls, outfile, extracolumns=None, *, - relroot=None, + relroot=fsutil.USE_CWD, **kwargs ): + if relroot and relroot is not fsutil.USE_CWD: + relroot = os.path.abspath(relroot) + decls = (d.fix_filename(relroot, fixroot=False) for d in decls) # XXX Move the row rendering here. - _write_decls_tsv(decls, outfile, extracolumns, relroot, kwargs) + _write_decls_tsv(decls, outfile, extracolumns, kwargs) -def _iter_decls_tsv(infile, extracolumns=None, relroot=None): +def _iter_decls_tsv(infile, extracolumns=None): columns = _get_columns('decls', extracolumns) for row in _tables.read_table(infile, columns, sep='\t'): if extracolumns: @@ -104,15 +111,13 @@ def _iter_decls_tsv(infile, extracolumns=None, relroot=None): else: declinfo = row extra = None - if relroot: - # XXX Use something like tables.fix_row() here. - declinfo = [None if v == '-' else v - for v in declinfo] - declinfo[0] = os.path.join(relroot, declinfo[0]) + # XXX Use something like tables.fix_row() here. + declinfo = [None if v == '-' else v + for v in declinfo] yield declinfo, extra -def _write_decls_tsv(decls, outfile, extracolumns, relroot,kwargs): +def _write_decls_tsv(decls, outfile, extracolumns, kwargs): columns = _get_columns('decls', extracolumns) if extracolumns: def render_decl(decl): @@ -121,7 +126,7 @@ def render_decl(decl): else: extra = () extra += ('???',) * (len(extraColumns) - len(extra)) - *row, declaration = _render_known_row(decl, relroot) + *row, declaration = _render_known_row(decl) row += extra + (declaration,) return row else: @@ -129,13 +134,13 @@ def render_decl(decl): _tables.write_table( outfile, header='\t'.join(columns), - rows=(render_decl(d, relroot) for d in decls), + rows=(render_decl(d) for d in decls), sep='\t', **kwargs ) -def _render_known_decl(decl, relroot, *, +def _render_known_decl(decl, *, # These match BASE_COLUMNS + END_COLUMNS[group]. _columns = 'filename parent name kind data'.split(), ): @@ -143,8 +148,6 @@ def _render_known_decl(decl, relroot, *, # e.g. Analyzed decl = decl.decl rowdata = decl.render_rowdata(_columns) - if relroot: - rowdata['filename'] = os.path.relpath(rowdata['filename'], relroot) return [rowdata[c] or '-' for c in _columns] # XXX #return _tables.fix_row(rowdata[c] for c in columns) diff --git a/Tools/c-analyzer/c_parser/info.py b/Tools/c-analyzer/c_parser/info.py index 798a45d2e08e71..98ff511cfe64a0 100644 --- a/Tools/c-analyzer/c_parser/info.py +++ b/Tools/c-analyzer/c_parser/info.py @@ -3,6 +3,7 @@ import os.path import re +from c_common import fsutil from c_common.clsutil import classonly import c_common.misc as _misc import c_common.strutil as _strutil @@ -148,6 +149,16 @@ def get_kind_group(item): ############################# # low-level +def _fix_filename(filename, relroot, *, + formatted=True, + **kwargs): + if formatted: + fix = fsutil.format_filename + else: + fix = fsutil.fix_filename + return fix(filename, relroot=relroot, **kwargs) + + class FileInfo(namedtuple('FileInfo', 'filename lno')): @classmethod def from_raw(cls, raw): @@ -165,8 +176,10 @@ def from_raw(cls, raw): def __str__(self): return self.filename - def fix_filename(self, relroot): - filename = os.path.relpath(self.filename, relroot) + def fix_filename(self, relroot=fsutil.USE_CWD, **kwargs): + filename = _fix_filename(self.filename, relroot, **kwargs) + if filename == self.filename: + return self return self._replace(filename=filename) @@ -194,6 +207,16 @@ def from_row(cls, row, **markers): row = _tables.fix_row(row, **markers) return cls(*row) + # We have to provde _make() becaose we implemented __new__(). + + @classmethod + def _make(cls, iterable): + try: + return cls(*iterable) + except Exception: + super()._make(iterable) + raise # re-raise + def __new__(cls, filename, funcname, name): self = super().__new__( cls, @@ -221,6 +244,12 @@ def __gt__(self, other): return NotImplemented return self._compare > other + def fix_filename(self, relroot=fsutil.USE_CWD, **kwargs): + filename = _fix_filename(self.filename, relroot, **kwargs) + if filename == self.filename: + return self + return self._replace(filename=filename) + class ParsedItem(namedtuple('ParsedItem', 'file kind parent name data')): @@ -290,6 +319,12 @@ def funcname(self): else: return self.parent.name + def fix_filename(self, relroot=fsutil.USE_CWD, **kwargs): + fixed = self.file.fix_filename(relroot, **kwargs) + if fixed == self.file: + return self + return self._replace(file=fixed) + def as_row(self, columns=None): if not columns: columns = self._fields @@ -591,9 +626,10 @@ def parsed(self): ) return self._parsed - def fix_filename(self, relroot): + def fix_filename(self, relroot=fsutil.USE_CWD, **kwargs): if self.file: - self.file = self.file.fix_filename(relroot) + self.file = self.file.fix_filename(relroot, **kwargs) + return self def as_rowdata(self, columns=None): columns, datacolumns, colnames = self._parse_columns(columns) diff --git a/Tools/c-analyzer/cpython/__main__.py b/Tools/c-analyzer/cpython/__main__.py index 23ce29776ca68e..6d78af299bb6f8 100644 --- a/Tools/c-analyzer/cpython/__main__.py +++ b/Tools/c-analyzer/cpython/__main__.py @@ -105,7 +105,11 @@ def cmd_parse(filenames=None, **kwargs): filenames = _resolve_filenames(filenames) if 'get_file_preprocessor' not in kwargs: kwargs['get_file_preprocessor'] = _parser.get_preprocessor() - c_parser.cmd_parse(filenames, **kwargs) + c_parser.cmd_parse( + filenames, + relroot=REPO_ROOT, + **kwargs + ) def _cli_check(parser, **kwargs): @@ -131,6 +135,7 @@ def cmd_analyze(filenames=None, **kwargs): kwargs['get_file_preprocessor'] = _parser.get_preprocessor(log_err=print) c_analyzer.cmd_analyze( filenames, + relroot=REPO_ROOT, _analyze=_analyzer.analyze, formats=formats, **kwargs diff --git a/Tools/c-analyzer/cpython/_analyzer.py b/Tools/c-analyzer/cpython/_analyzer.py index 978831d1fd9496..09904236cd623d 100644 --- a/Tools/c-analyzer/cpython/_analyzer.py +++ b/Tools/c-analyzer/cpython/_analyzer.py @@ -84,13 +84,13 @@ def write_known(): def read_ignored(): if not _IGNORED: - _IGNORED.update(_datafiles.read_ignored(IGNORED_FILE)) + _IGNORED.update(_datafiles.read_ignored(IGNORED_FILE, relroot=REPO_ROOT)) return dict(_IGNORED) def write_ignored(): raise NotImplementedError - datafiles.write_ignored(variables, IGNORED_FILE) + _datafiles.write_ignored(variables, IGNORED_FILE, relroot=REPO_ROOT) def analyze(filenames, *, diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index 7c8c2966653989..eef758495386c4 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -162,6 +162,12 @@ def clean_lines(text): Modules/_ctypes/cfield.c Py_BUILD_CORE 1 Modules/_heapqmodule.c Py_BUILD_CORE 1 Modules/_posixsubprocess.c Py_BUILD_CORE 1 +Modules/_sre.c Py_BUILD_CORE 1 +Modules/_collectionsmodule.c Py_BUILD_CORE 1 +Modules/_zoneinfo.c Py_BUILD_CORE 1 +Modules/unicodedata.c Py_BUILD_CORE 1 +Modules/_cursesmodule.c Py_BUILD_CORE 1 +Modules/_ctypes/_ctypes.c Py_BUILD_CORE 1 Objects/stringlib/codecs.h Py_BUILD_CORE 1 Python/ceval_gil.h Py_BUILD_CORE 1 Python/condvar.h Py_BUILD_CORE 1 diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 2c456db063e429..e5d93782076c3d 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -1,2 +1,2938 @@ filename funcname name reason #??? - somevar ??? + +# XXX The analyzer should have ignored these (forward/extern references): +Include/py_curses.h - PyCurses_API - +Include/pydecimal.h - _decimal_api - +Modules/_blake2/blake2module.c - blake2b_type_spec - +Modules/_blake2/blake2module.c - blake2s_type_spec - +Modules/_io/fileio.c - _Py_open_cloexec_works - +Modules/_io/_iomodule.h - PyIOBase_Type - +Modules/_io/_iomodule.h - PyRawIOBase_Type - +Modules/_io/_iomodule.h - PyBufferedIOBase_Type - +Modules/_io/_iomodule.h - PyTextIOBase_Type - +Modules/_io/_iomodule.h - PyFileIO_Type - +Modules/_io/_iomodule.h - PyBytesIO_Type - +Modules/_io/_iomodule.h - PyStringIO_Type - +Modules/_io/_iomodule.h - PyBufferedReader_Type - +Modules/_io/_iomodule.h - PyBufferedWriter_Type - +Modules/_io/_iomodule.h - PyBufferedRWPair_Type - +Modules/_io/_iomodule.h - PyBufferedRandom_Type - +Modules/_io/_iomodule.h - PyTextIOWrapper_Type - +Modules/_io/_iomodule.h - PyIncrementalNewlineDecoder_Type - +Modules/_io/_iomodule.h - _PyBytesIOBuffer_Type - +Modules/_io/_iomodule.h - _PyIO_str_close - +Modules/_io/_iomodule.h - _PyIO_str_closed - +Modules/_io/_iomodule.h - _PyIO_str_decode - +Modules/_io/_iomodule.h - _PyIO_str_encode - +Modules/_io/_iomodule.h - _PyIO_str_fileno - +Modules/_io/_iomodule.h - _PyIO_str_flush - +Modules/_io/_iomodule.h - _PyIO_str_getstate - +Modules/_io/_iomodule.h - _PyIO_str_isatty - +Modules/_io/_iomodule.h - _PyIO_str_newlines - +Modules/_io/_iomodule.h - _PyIO_str_nl - +Modules/_io/_iomodule.h - _PyIO_str_peek - +Modules/_io/_iomodule.h - _PyIO_str_read - +Modules/_io/_iomodule.h - _PyIO_str_read1 - +Modules/_io/_iomodule.h - _PyIO_str_readable - +Modules/_io/_iomodule.h - _PyIO_str_readall - +Modules/_io/_iomodule.h - _PyIO_str_readinto - +Modules/_io/_iomodule.h - _PyIO_str_readline - +Modules/_io/_iomodule.h - _PyIO_str_reset - +Modules/_io/_iomodule.h - _PyIO_str_seek - +Modules/_io/_iomodule.h - _PyIO_str_seekable - +Modules/_io/_iomodule.h - _PyIO_str_setstate - +Modules/_io/_iomodule.h - _PyIO_str_tell - +Modules/_io/_iomodule.h - _PyIO_str_truncate - +Modules/_io/_iomodule.h - _PyIO_str_writable - +Modules/_io/_iomodule.h - _PyIO_str_write - +Modules/_io/_iomodule.h - _PyIO_empty_str - +Modules/_io/_iomodule.h - _PyIO_empty_bytes - +Modules/_multiprocessing/multiprocessing.h - _PyMp_SemLockType - +Modules/_sqlite/cache.h - pysqlite_NodeType - +Modules/_sqlite/cache.h - pysqlite_CacheType - +Modules/_sqlite/cursor.h - pysqlite_CursorType - +Modules/_sqlite/row.h - pysqlite_RowType - +Modules/_sqlite/prepare_protocol.h - pysqlite_PrepareProtocolType - +Modules/_sqlite/statement.h - pysqlite_StatementType - +Modules/_sqlite/connection.h - pysqlite_ConnectionType - +Modules/_sqlite/module.c - pysqlite_Error - +Modules/_sqlite/module.c - pysqlite_Warning - +Modules/_sqlite/module.c - pysqlite_InterfaceError - +Modules/_sqlite/module.c - pysqlite_DatabaseError - +Modules/_sqlite/module.c - pysqlite_InternalError - +Modules/_sqlite/module.c - pysqlite_OperationalError - +Modules/_sqlite/module.c - pysqlite_ProgrammingError - +Modules/_sqlite/module.c - pysqlite_IntegrityError - +Modules/_sqlite/module.c - pysqlite_DataError - +Modules/_sqlite/module.c - pysqlite_NotSupportedError - +Modules/_sqlite/module.c - _pysqlite_converters - +Modules/_sqlite/module.c - _pysqlite_enable_callback_tracebacks - +Modules/_sqlite/module.c - pysqlite_BaseTypeAdapted - +Modules/_testcapimodule.c - _PyBytesIOBuffer_Type - +Modules/posixmodule.c - _Py_open_cloexec_works - +Python/importdl.h - _PyImport_DynLoadFiletab - + + +################################## +# test code +# [] + +Modules/_ctypes/_ctypes_test.c - _ctypes_test_slots - +Modules/_ctypes/_ctypes_test.c - module_methods - +Modules/_ctypes/_ctypes_test.c - my_spams - +Modules/_ctypes/_ctypes_test.c - my_eggs - +Modules/_ctypes/_ctypes_test.c - an_integer - +Modules/_ctypes/_ctypes_test.c - _xxx_lib - +Modules/_ctypes/_ctypes_test.c - left - +Modules/_ctypes/_ctypes_test.c - top - +Modules/_ctypes/_ctypes_test.c - right - +Modules/_ctypes/_ctypes_test.c - bottom - +Modules/_ctypes/_ctypes_test.c - _ctypes_testmodule - +Modules/_ctypes/_ctypes_test.c - last_tfrsuv_arg - +Modules/_ctypes/_ctypes_test.c - last_tf_arg_s - +Modules/_ctypes/_ctypes_test.c - last_tf_arg_u - +Modules/_testbuffer.c - simple_format - +Modules/_testbuffer.c - static_mem - +Modules/_testbuffer.c - static_shape - +Modules/_testbuffer.c - static_strides - +Modules/_testbuffer.c - NDArray_Type - +Modules/_testbuffer.c - StaticArray_Type - +Modules/_testbuffer.c ndarray_init kwlist - +Modules/_testbuffer.c ndarray_push kwlist - +Modules/_testbuffer.c staticarray_init kwlist - +Modules/_testbuffer.c - ndarray_methods - +Modules/_testbuffer.c - _testbuffer_functions - +Modules/_testbuffer.c - ndarray_getset - +Modules/_testbuffer.c - ndarray_as_buffer - +Modules/_testbuffer.c - staticarray_as_buffer - +Modules/_testbuffer.c - ndarray_as_sequence - +Modules/_testbuffer.c - ndarray_as_mapping - +Modules/_testbuffer.c - structmodule - +Modules/_testbuffer.c - _testbuffermodule - +Modules/_testbuffer.c - Struct - +Modules/_testbuffer.c - calcsize - +Modules/_testbuffer.c - simple_fmt - +Modules/_testbuffer.c - static_buffer - +Modules/_testbuffer.c ndarray_memoryview_from_buffer format - +Modules/_testbuffer.c ndarray_memoryview_from_buffer shape - +Modules/_testbuffer.c ndarray_memoryview_from_buffer strides - +Modules/_testbuffer.c ndarray_memoryview_from_buffer suboffsets - +Modules/_testbuffer.c ndarray_memoryview_from_buffer info - +Modules/_testbuffer.c - infobuf - +Modules/_testcapimodule.c - TestError - +Modules/_testcapimodule.c test_capsule buffer - +Modules/_testcapimodule.c - decimal_initialized - +Modules/_testcapimodule.c - thread_done - +Modules/_testcapimodule.c - capsule_error - +Modules/_testcapimodule.c - capsule_destructor_call_count - +Modules/_testcapimodule.c - str1 - +Modules/_testcapimodule.c - str2 - +Modules/_testcapimodule.c - test_run_counter - +Modules/_testcapimodule.c - FmHook - +Modules/_testcapimodule.c - FmData - +Modules/_testcapimodule.c - _testcapimodule - +Modules/_testcapimodule.c - _HashInheritanceTester_Type - +Modules/_testcapimodule.c - test_structmembersType - +Modules/_testcapimodule.c - matmulType - +Modules/_testcapimodule.c - ipowType - +Modules/_testcapimodule.c - awaitType - +Modules/_testcapimodule.c - PyRecursingInfinitelyError_Type - +Modules/_testcapimodule.c - MyList_Type - +Modules/_testcapimodule.c - GenericAlias_Type - +Modules/_testcapimodule.c - Generic_Type - +Modules/_testcapimodule.c - MethodDescriptorBase_Type - +Modules/_testcapimodule.c - MethodDescriptorDerived_Type - +Modules/_testcapimodule.c - MethodDescriptorNopGet_Type - +Modules/_testcapimodule.c - MethodDescriptor2_Type - +Modules/_testcapimodule.c - MethInstance_Type - +Modules/_testcapimodule.c - MethClass_Type - +Modules/_testcapimodule.c - MethStatic_Type - +Modules/_testcapimodule.c - ContainerNoGC_type - +Modules/_testcapimodule.c slot_tp_del PyId___tp_del__ - +Modules/_testcapimodule.c raise_SIGINT_then_send_None PyId_send - +Modules/_testcapimodule.c - HeapDocCType_spec - +Modules/_testcapimodule.c - HeapGcCType_spec - +Modules/_testcapimodule.c - HeapCType_spec - +Modules/_testcapimodule.c - HeapCTypeSubclass_spec - +Modules/_testcapimodule.c - HeapCTypeWithBuffer_spec - +Modules/_testcapimodule.c - HeapCTypeSubclassWithFinalizer_spec - +Modules/_testcapimodule.c - HeapCTypeWithDict_spec - +Modules/_testcapimodule.c - HeapCTypeWithNegativeDict_spec - +Modules/_testcapimodule.c - HeapCTypeWithWeakref_spec - +Modules/_testcapimodule.c - HeapCTypeSetattr_spec - +Modules/_testcapimodule.c - capsule_name - +Modules/_testcapimodule.c - capsule_pointer - +Modules/_testcapimodule.c - capsule_context - +Modules/_testcapimodule.c - x - +Modules/_testcapimodule.c getargs_keyword_only keywords - +Modules/_testcapimodule.c getargs_keywords keywords - +Modules/_testcapimodule.c getargs_positional_only_and_keywords keywords - +Modules/_testcapimodule.c make_exception_with_doc kwlist - +Modules/_testcapimodule.c test_empty_argparse kwlist - +Modules/_testcapimodule.c test_structmembers_new keywords - +Modules/_testcapimodule.c - ml - +Modules/_testcapimodule.c - TestMethods - +Modules/_testcapimodule.c - generic_alias_methods - +Modules/_testcapimodule.c - generic_methods - +Modules/_testcapimodule.c - meth_instance_methods - +Modules/_testcapimodule.c - meth_class_methods - +Modules/_testcapimodule.c - meth_static_methods - +Modules/_testcapimodule.c - test_members - +Modules/_testcapimodule.c - heapctype_members - +Modules/_testcapimodule.c - heapctypesubclass_members - +Modules/_testcapimodule.c - heapctypewithdict_members - +Modules/_testcapimodule.c - heapctypewithnegativedict_members - +Modules/_testcapimodule.c - heapctypewithweakref_members - +Modules/_testcapimodule.c - heapctypesetattr_members - +Modules/_testcapimodule.c - ContainerNoGC_members - +Modules/_testcapimodule.c - matmulType_as_number - +Modules/_testcapimodule.c - ipowType_as_number - +Modules/_testcapimodule.c - awaitType_as_async - +Modules/_testcapimodule.c - heapctypewithdict_getsetlist - +Modules/_testcapimodule.c - HeapDocCType_slots - +Modules/_testcapimodule.c - HeapGcCType_slots - +Modules/_testcapimodule.c - HeapCType_slots - +Modules/_testcapimodule.c - HeapCTypeSubclass_slots - +Modules/_testcapimodule.c - HeapCTypeWithBuffer_slots - +Modules/_testcapimodule.c - HeapCTypeSubclassWithFinalizer_slots - +Modules/_testcapimodule.c - HeapCTypeWithDict_slots - +Modules/_testcapimodule.c - HeapCTypeWithNegativeDict_slots - +Modules/_testcapimodule.c - HeapCTypeWithWeakref_slots - +Modules/_testcapimodule.c - HeapCTypeSetattr_slots - +Modules/_testimportmultiple.c - _foomodule - +Modules/_testimportmultiple.c - _barmodule - +Modules/_testimportmultiple.c - _testimportmultiple - +Modules/_testinternalcapi.c - _testcapimodule - +Modules/_testinternalcapi.c - TestMethods - +Modules/_testmultiphase.c - slots_create_nonmodule - +Modules/_testmultiphase.c - def_nonmodule - +Modules/_testmultiphase.c - main_def - +Modules/_testmultiphase.c - def_nonmodule_with_methods - +Modules/_testmultiphase.c - def_nonascii_latin - +Modules/_testmultiphase.c - def_nonascii_kana - +Modules/_testmultiphase.c - null_slots_def - +Modules/_testmultiphase.c - def_bad_large - +Modules/_testmultiphase.c - def_bad_negative - +Modules/_testmultiphase.c - def_create_int_with_state - +Modules/_testmultiphase.c - def_negative_size - +Modules/_testmultiphase.c - uninitialized_def - +Modules/_testmultiphase.c - def_create_null - +Modules/_testmultiphase.c - def_create_raise - +Modules/_testmultiphase.c - def_create_unreported_exception - +Modules/_testmultiphase.c - def_nonmodule_with_exec_slots - +Modules/_testmultiphase.c - def_exec_err - +Modules/_testmultiphase.c - def_exec_raise - +Modules/_testmultiphase.c - def_exec_unreported_exception - +Modules/_testmultiphase.c - def_meth_state_access - +Modules/_testmultiphase.c - imp_dummy_def - +Modules/_testmultiphase.c - Example_Type_slots - +Modules/_testmultiphase.c - StateAccessType_Type_slots - +Modules/_testmultiphase.c - Str_Type_slots - +Modules/_testmultiphase.c - main_slots - +Modules/_testmultiphase.c - slots_create_nonmodule - +Modules/_testmultiphase.c - slots_bad_large - +Modules/_testmultiphase.c - slots_bad_negative - +Modules/_testmultiphase.c - slots_create_null - +Modules/_testmultiphase.c - slots_create_raise - +Modules/_testmultiphase.c - slots_create_unreported_exception - +Modules/_testmultiphase.c - slots_nonmodule_with_exec_slots - +Modules/_testmultiphase.c - slots_exec_err - +Modules/_testmultiphase.c - slots_exec_raise - +Modules/_testmultiphase.c - slots_exec_unreported_exception - +Modules/_testmultiphase.c - meth_state_access_slots - +Modules/_testmultiphase.c - Example_methods - +Modules/_testmultiphase.c - StateAccessType_methods - +Modules/_testmultiphase.c - testexport_methods - +Modules/_testmultiphase.c - nonmodule_methods - +Modules/_testmultiphase.c - Example_Type_spec - +Modules/_testmultiphase.c - StateAccessType_spec - +Modules/_testmultiphase.c - Str_Type_spec - +Modules/_xxtestfuzz/_xxtestfuzz.c - module_methods - +Modules/_xxtestfuzz/_xxtestfuzz.c - _fuzzmodule - +Modules/_xxtestfuzz/fuzzer.c - csv_module - +Modules/_xxtestfuzz/fuzzer.c - regex_patterns - +Modules/_xxtestfuzz/fuzzer.c - struct_unpack_method - +Modules/_xxtestfuzz/fuzzer.c - struct_error - +Modules/_xxtestfuzz/fuzzer.c - json_loads_method - +Modules/_xxtestfuzz/fuzzer.c - sre_compile_method - +Modules/_xxtestfuzz/fuzzer.c - sre_error_exception - +Modules/_xxtestfuzz/fuzzer.c - compiled_patterns - +Modules/_xxtestfuzz/fuzzer.c - csv_error - +Modules/_xxtestfuzz/fuzzer.c - SRE_FLAG_DEBUG - +Modules/_xxtestfuzz/fuzzer.c LLVMFuzzerTestOneInput STRUCT_UNPACK_INITIALIZED - +Modules/_xxtestfuzz/fuzzer.c LLVMFuzzerTestOneInput JSON_LOADS_INITIALIZED - +Modules/_xxtestfuzz/fuzzer.c LLVMFuzzerTestOneInput SRE_COMPILE_INITIALIZED - +Modules/_xxtestfuzz/fuzzer.c LLVMFuzzerTestOneInput SRE_MATCH_INITIALIZED - +Modules/_xxtestfuzz/fuzzer.c LLVMFuzzerTestOneInput CSV_READER_INITIALIZED - + + +################################## +# temporary whitelist - should be const + +# These are all variables that we will be making non-global. + +#----------------------- +# keywords for PyArg_ParseTupleAndKeywords() +# "static char *name[]" -> "static const char * const name[]" +# [] + +Modules/cjkcodecs/multibytecodec.c - incnewkwarglist - +Modules/cjkcodecs/multibytecodec.c - streamkwarglist - +Modules/_csv.c - dialect_kws - +Modules/_datetimemodule.c date_fromisocalendar keywords - +Modules/_datetimemodule.c - date_kws - +Modules/_datetimemodule.c date_strftime keywords - +Modules/_datetimemodule.c datetime_astimezone keywords - +Modules/_datetimemodule.c datetime_combine keywords - +Modules/_datetimemodule.c datetime_fromtimestamp keywords - +Modules/_datetimemodule.c datetime_isoformat keywords - +Modules/_datetimemodule.c - datetime_kws - +Modules/_datetimemodule.c delta_new keywords - +Modules/_datetimemodule.c time_isoformat keywords - +Modules/_datetimemodule.c - time_kws - +Modules/_datetimemodule.c time_strftime keywords - +Modules/_datetimemodule.c - timezone_kws - +Modules/_decimal/_decimal.c context_init kwlist - +Modules/_decimal/_decimal.c ctxmanager_new kwlist - +Modules/_decimal/_decimal.c ctx_mpd_qpow kwlist - +Modules/_decimal/_decimal.c dec_mpd_class kwlist - +Modules/_decimal/_decimal.c dec_mpd_compare_total kwlist - +Modules/_decimal/_decimal.c dec_mpd_compare_total_mag kwlist - +Modules/_decimal/_decimal.c dec_mpd_isnormal kwlist - +Modules/_decimal/_decimal.c dec_mpd_issubnormal kwlist - +Modules/_decimal/_decimal.c dec_mpd_qand kwlist - +Modules/_decimal/_decimal.c dec_mpd_qcompare kwlist - +Modules/_decimal/_decimal.c dec_mpd_qcompare_signal kwlist - +Modules/_decimal/_decimal.c dec_mpd_qcopy_sign kwlist - +Modules/_decimal/_decimal.c dec_mpd_qexp kwlist - +Modules/_decimal/_decimal.c dec_mpd_qfma kwlist - +Modules/_decimal/_decimal.c dec_mpd_qinvert kwlist - +Modules/_decimal/_decimal.c dec_mpd_qln kwlist - +Modules/_decimal/_decimal.c dec_mpd_qlog10 kwlist - +Modules/_decimal/_decimal.c dec_mpd_qlogb kwlist - +Modules/_decimal/_decimal.c dec_mpd_qmax kwlist - +Modules/_decimal/_decimal.c dec_mpd_qmax_mag kwlist - +Modules/_decimal/_decimal.c dec_mpd_qmin kwlist - +Modules/_decimal/_decimal.c dec_mpd_qmin_mag kwlist - +Modules/_decimal/_decimal.c dec_mpd_qnext_minus kwlist - +Modules/_decimal/_decimal.c dec_mpd_qnext_plus kwlist - +Modules/_decimal/_decimal.c dec_mpd_qnext_toward kwlist - +Modules/_decimal/_decimal.c dec_mpd_qor kwlist - +Modules/_decimal/_decimal.c dec_mpd_qquantize kwlist - +Modules/_decimal/_decimal.c dec_mpd_qreduce kwlist - +Modules/_decimal/_decimal.c dec_mpd_qrem_near kwlist - +Modules/_decimal/_decimal.c dec_mpd_qrotate kwlist - +Modules/_decimal/_decimal.c dec_mpd_qscaleb kwlist - +Modules/_decimal/_decimal.c dec_mpd_qshift kwlist - +Modules/_decimal/_decimal.c dec_mpd_qsqrt kwlist - +Modules/_decimal/_decimal.c dec_mpd_qxor kwlist - +Modules/_decimal/_decimal.c dec_mpd_same_quantum kwlist - +Modules/_decimal/_decimal.c dec_mpd_to_eng kwlist - +Modules/_decimal/_decimal.c dec_new kwlist - +Modules/_decimal/_decimal.c PyDec_ToIntegralExact kwlist - +Modules/_decimal/_decimal.c PyDec_ToIntegralValue kwlist - +Modules/_elementtree.c element_setstate_from_Python kwlist - +Modules/faulthandler.c faulthandler_dump_traceback_later kwlist - +Modules/faulthandler.c faulthandler_dump_traceback_py kwlist - +Modules/faulthandler.c faulthandler_py_enable kwlist - +Modules/faulthandler.c faulthandler_register_py kwlist - +Modules/_functoolsmodule.c functools_cmp_to_key kwargs - +Modules/_functoolsmodule.c keyobject_call kwargs - +Modules/_functoolsmodule.c lru_cache_new keywords - +Modules/itertoolsmodule.c repeat_new kwargs - +Modules/_json.c encoder_call kwlist - +Modules/_json.c encoder_new kwlist - +Modules/_json.c scanner_call kwlist - +Modules/_json.c scanner_new kwlist - +Modules/_lsprof.c profiler_enable kwlist - +Modules/_lsprof.c profiler_init kwlist - +Modules/_lzmamodule.c Compressor_init arg_names - +Modules/_lzmamodule.c parse_filter_spec_bcj optnames - +Modules/_lzmamodule.c parse_filter_spec_delta optnames - +Modules/_lzmamodule.c parse_filter_spec_lzma optnames - +Modules/mmapmodule.c new_mmap_object keywords - +Modules/nismodule.c nis_cat kwlist - +Modules/nismodule.c nis_maps kwlist - +Modules/nismodule.c nis_match kwlist - +Modules/signalmodule.c signal_set_wakeup_fd kwlist - +Modules/socketmodule.c sock_initobj keywords - +Modules/socketmodule.c sock_recvfrom_into kwlist - +Modules/socketmodule.c sock_recv_into kwlist - +Modules/socketmodule.c sock_sendmsg_afalg keywords - +Modules/socketmodule.c socket_getaddrinfo kwnames - +Modules/_sqlite/connection.c pysqlite_connection_backup keywords - +Modules/_sqlite/connection.c pysqlite_connection_create_aggregate kwlist - +Modules/_sqlite/connection.c pysqlite_connection_create_function kwlist - +Modules/_sqlite/connection.c pysqlite_connection_cursor kwlist - +Modules/_sqlite/connection.c pysqlite_connection_init kwlist - +Modules/_sqlite/connection.c pysqlite_connection_set_authorizer kwlist - +Modules/_sqlite/connection.c pysqlite_connection_set_progress_handler kwlist - +Modules/_sqlite/connection.c pysqlite_connection_set_trace_callback kwlist - +Modules/_sqlite/cursor.c pysqlite_cursor_fetchmany kwlist - +Modules/_sqlite/module.c module_complete kwlist - +Modules/_sqlite/module.c module_connect kwlist - +Modules/_sqlite/module.c module_enable_shared_cache kwlist - +Modules/syslogmodule.c syslog_openlog keywords - +Modules/_xxsubinterpretersmodule.c channel_close kwlist - +Modules/_xxsubinterpretersmodule.c channel_destroy kwlist - +Modules/_xxsubinterpretersmodule.c channelid_new kwlist - +Modules/_xxsubinterpretersmodule.c channel_list_interpreters kwlist - +Modules/_xxsubinterpretersmodule.c channel_recv kwlist - +Modules/_xxsubinterpretersmodule.c channel_release kwlist - +Modules/_xxsubinterpretersmodule.c channel_send kwlist - +Modules/_xxsubinterpretersmodule.c interp_create kwlist - +Modules/_xxsubinterpretersmodule.c interp_destroy kwlist - +Modules/_xxsubinterpretersmodule.c interp_is_running kwlist - +Modules/_xxsubinterpretersmodule.c interp_run_string kwlist - +Modules/_xxsubinterpretersmodule.c object_is_shareable kwlist - +Modules/_zoneinfo.c zoneinfo_clear_cache kwlist - +Modules/_zoneinfo.c zoneinfo_from_file kwlist - +Modules/_zoneinfo.c zoneinfo_new kwlist - +Modules/_zoneinfo.c zoneinfo_no_cache kwlist - +Objects/exceptions.c ImportError_init kwlist - +Objects/interpreteridobject.c interpid_new kwlist - +Objects/weakrefobject.c weakref_call kwlist - + +#----------------------- +# PyModuleDef_Slot +# [] + +Modules/_abc.c - _abcmodule_slots - +Modules/arraymodule.c - arrayslots - +Modules/atexitmodule.c - atexit_slots - +Modules/audioop.c - audioop_slots - +Modules/binascii.c - binascii_slots - +Modules/_blake2/blake2module.c - _blake2_slots - +Modules/cmathmodule.c - cmath_slots - +Modules/_codecsmodule.c - _codecs_slots - +Modules/_cryptmodule.c - _crypt_slots - +Modules/_curses_panel.c - _curses_slots - +Modules/_dbmmodule.c - _dbmmodule_slots - +Modules/errnomodule.c - errno_slots - +Modules/faulthandler.c - faulthandler_slots - +Modules/fcntlmodule.c - fcntl_slots - +Modules/_gdbmmodule.c - _gdbm_module_slots - +Modules/_hashopenssl.c - hashlib_slots - +Modules/_json.c - _json_slots - +Modules/_lsprof.c - _lsprofslots - +Modules/_lzmamodule.c - lzma_slots - +Modules/mathmodule.c - math_slots - +Modules/md5module.c - _md5_slots - +Modules/mmapmodule.c - mmap_slots - +Modules/_multiprocessing/multiprocessing.c - multiprocessing_slots - +Modules/nismodule.c - nis_slots - +Modules/overlapped.c - overlapped_slots - +Modules/posixmodule.c - posixmodile_slots - +Modules/_scproxy.c - _scproxy_slots - +Modules/sha1module.c - _sha1_slots - +Modules/sha256module.c - _sha256_slots - +Modules/_sha3/sha3module.c - _sha3_slots - +Modules/sha512module.c - _sha512_slots - +Modules/_stat.c - stat_slots - +Modules/syslogmodule.c - syslog_slots - +Modules/termios.c - termios_slots - +Modules/unicodedata.c - unicodedata_slots - +Modules/_uuidmodule.c - uuid_slots - +Modules/_winapi.c - winapi_slots - +Modules/xxlimited.c - xx_slots - +Modules/zlibmodule.c - zlib_slots - +Modules/_zoneinfo.c - zoneinfomodule_slots - +Python/marshal.c - marshalmodule_slots - +Python/Python-ast.c - astmodule_slots - +Modules/_bz2module.c - _bz2_slots - +Modules/_collectionsmodule.c - collections_slots - +Modules/_contextvarsmodule.c - _contextvars_slots - +Modules/_functoolsmodule.c - _functools_slots - +Modules/_heapqmodule.c - heapq_slots - +Modules/itertoolsmodule.c - itertoolsmodule_slots - +Modules/_localemodule.c - _locale_slots - +Modules/_operator.c - operator_slots - +Modules/resource.c - resource_slots - +Modules/_statisticsmodule.c - _statisticsmodule_slots - +Modules/timemodule.c - time_slots - +Modules/_weakref.c - weakref_slots - +Modules/xxmodule.c - xx_slots - +Modules/xxsubtype.c - xxsubtype_slots - + +#----------------------- +# PyMethodDef and PyMethodDef[], for static types and modules +# [] + +Modules/_abc.c - _destroy_def - +Modules/_abc.c - _abcmodule_methods - +Modules/arraymodule.c - array_methods - +Modules/arraymodule.c - arrayiter_methods - +Modules/arraymodule.c - a_methods - +Modules/_asynciomodule.c - FutureType_methods - +Modules/_asynciomodule.c - FutureIter_methods - +Modules/_asynciomodule.c - TaskType_methods - +Modules/_asynciomodule.c - asyncio_methods - +Modules/_asynciomodule.c - TaskWakeupDef - +Modules/atexitmodule.c - atexit_methods - +Modules/audioop.c - audioop_methods - +Modules/binascii.c - binascii_module_methods - +Modules/_bisectmodule.c - bisect_methods - +Modules/_blake2/blake2b_impl.c - py_blake2b_methods - +Modules/_blake2/blake2module.c - blake2mod_functions - +Modules/_blake2/blake2s_impl.c - py_blake2s_methods - +Modules/_bz2module.c - BZ2Compressor_methods - +Modules/_bz2module.c - BZ2Decompressor_methods - +Modules/cjkcodecs/multibytecodec.c - multibytecodec_methods - +Modules/cjkcodecs/multibytecodec.c - mbiencoder_methods - +Modules/cjkcodecs/multibytecodec.c - mbidecoder_methods - +Modules/cjkcodecs/multibytecodec.c - mbstreamreader_methods - +Modules/cjkcodecs/multibytecodec.c - mbstreamwriter_methods - +Modules/cjkcodecs/multibytecodec.c - __methods - +Modules/cmathmodule.c - cmath_methods - +Modules/_codecsmodule.c - _codecs_functions - +Modules/_collectionsmodule.c - deque_methods - +Modules/_collectionsmodule.c - dequeiter_methods - +Modules/_collectionsmodule.c - defdict_methods - +Modules/_collectionsmodule.c - tuplegetter_methods - +Modules/_collectionsmodule.c - collections_methods - +Modules/_contextvarsmodule.c - _contextvars_methods - +Modules/_cryptmodule.c - crypt_methods - +Modules/_csv.c - Reader_methods - +Modules/_csv.c - Writer_methods - +Modules/_csv.c - csv_methods - +Modules/_ctypes/callproc.c - _ctypes_module_methods - +Modules/_ctypes/_ctypes.c - CDataType_methods - +Modules/_ctypes/_ctypes.c - PyCPointerType_methods - +Modules/_ctypes/_ctypes.c - c_void_p_method - +Modules/_ctypes/_ctypes.c - c_char_p_method - +Modules/_ctypes/_ctypes.c - c_wchar_p_method - +Modules/_ctypes/_ctypes.c - PyCSimpleType_methods - +Modules/_ctypes/_ctypes.c - PyCData_methods - +Modules/_ctypes/_ctypes.c - Array_methods - +Modules/_ctypes/_ctypes.c - Simple_methods - +Modules/_ctypes/stgdict.c - PyCStgDict_methods - +Modules/_cursesmodule.c - PyCursesWindow_Methods - +Modules/_cursesmodule.c - PyCurses_methods - +Modules/_curses_panel.c - PyCursesPanel_Methods - +Modules/_curses_panel.c - PyCurses_methods - +Modules/_datetimemodule.c - delta_methods - +Modules/_datetimemodule.c - iso_calendar_date_methods - +Modules/_datetimemodule.c - date_methods - +Modules/_datetimemodule.c - tzinfo_methods - +Modules/_datetimemodule.c - timezone_methods - +Modules/_datetimemodule.c - time_methods - +Modules/_datetimemodule.c - datetime_methods - +Modules/_datetimemodule.c - module_methods - +Modules/_dbmmodule.c - dbm_methods - +Modules/_dbmmodule.c - dbmmodule_methods - +Modules/_decimal/_decimal.c - signaldict_methods - +Modules/_decimal/_decimal.c - ctxmanager_methods - +Modules/_decimal/_decimal.c - dec_methods - +Modules/_decimal/_decimal.c - context_methods - +Modules/_decimal/_decimal.c - _decimal_methods - +Modules/_elementtree.c - element_methods - +Modules/_elementtree.c - treebuilder_methods - +Modules/_elementtree.c - xmlparser_methods - +Modules/_elementtree.c - _functions - +Modules/errnomodule.c - errno_methods - +Modules/faulthandler.c - module_methods - +Modules/fcntlmodule.c - fcntl_methods - +Modules/_functoolsmodule.c - partial_methods - +Modules/_functoolsmodule.c - lru_cache_methods - +Modules/_functoolsmodule.c - _functools_methods - +Modules/gcmodule.c - GcMethods - +Modules/_gdbmmodule.c - gdbm_methods - +Modules/_gdbmmodule.c - _gdbm_module_methods - +Modules/grpmodule.c - grp_methods - +Modules/_hashopenssl.c - EVP_methods - +Modules/_hashopenssl.c - EVPXOF_methods - +Modules/_hashopenssl.c - HMAC_methods - +Modules/_hashopenssl.c - EVP_functions - +Modules/_heapqmodule.c - heapq_methods - +Modules/_io/bufferedio.c - bufferediobase_methods - +Modules/_io/bufferedio.c - bufferedreader_methods - +Modules/_io/bufferedio.c - bufferedwriter_methods - +Modules/_io/bufferedio.c - bufferedrwpair_methods - +Modules/_io/bufferedio.c - bufferedrandom_methods - +Modules/_io/bytesio.c - bytesio_methods - +Modules/_io/fileio.c - fileio_methods - +Modules/_io/iobase.c - iobase_methods - +Modules/_io/iobase.c - rawiobase_methods - +Modules/_io/_iomodule.c - module_methods - +Modules/_io/stringio.c - stringio_methods - +Modules/_io/textio.c - textiobase_methods - +Modules/_io/textio.c - incrementalnewlinedecoder_methods - +Modules/_io/textio.c - textiowrapper_methods - +Modules/_io/winconsoleio.c - winconsoleio_methods - +Modules/itertoolsmodule.c - groupby_methods - +Modules/itertoolsmodule.c - _grouper_methods - +Modules/itertoolsmodule.c - teedataobject_methods - +Modules/itertoolsmodule.c - tee_methods - +Modules/itertoolsmodule.c - cycle_methods - +Modules/itertoolsmodule.c - dropwhile_methods - +Modules/itertoolsmodule.c - takewhile_reduce_methods - +Modules/itertoolsmodule.c - islice_methods - +Modules/itertoolsmodule.c - starmap_methods - +Modules/itertoolsmodule.c - chain_methods - +Modules/itertoolsmodule.c - product_methods - +Modules/itertoolsmodule.c - combinations_methods - +Modules/itertoolsmodule.c - cwr_methods - +Modules/itertoolsmodule.c - permuations_methods - +Modules/itertoolsmodule.c - accumulate_methods - +Modules/itertoolsmodule.c - compress_methods - +Modules/itertoolsmodule.c - filterfalse_methods - +Modules/itertoolsmodule.c - count_methods - +Modules/itertoolsmodule.c - repeat_methods - +Modules/itertoolsmodule.c - zip_longest_methods - +Modules/itertoolsmodule.c - module_methods - +Modules/_json.c - speedups_methods - +Modules/_localemodule.c - PyLocale_Methods - +Modules/_lsprof.c - profiler_methods - +Modules/_lsprof.c - moduleMethods - +Modules/_lzmamodule.c - Compressor_methods - +Modules/_lzmamodule.c - Decompressor_methods - +Modules/_lzmamodule.c - lzma_methods - +Modules/mathmodule.c - math_methods - +Modules/md5module.c - MD5_methods - +Modules/md5module.c - MD5_functions - +Modules/mmapmodule.c - mmap_object_methods - +Modules/_multiprocessing/multiprocessing.c - module_methods - +Modules/_multiprocessing/posixshmem.c - module_methods - +Modules/_multiprocessing/semaphore.c - semlock_methods - +Modules/nismodule.c - nis_methods - +Modules/_opcode.c - opcode_functions - +Modules/_operator.c - operator_methods - +Modules/_operator.c - itemgetter_methods - +Modules/_operator.c - attrgetter_methods - +Modules/_operator.c - methodcaller_methods - +Modules/ossaudiodev.c - oss_methods - +Modules/ossaudiodev.c - oss_mixer_methods - +Modules/ossaudiodev.c - ossaudiodev_methods - +Modules/overlapped.c - Overlapped_methods - +Modules/overlapped.c - overlapped_functions - +Modules/_pickle.c - Pickler_methods - +Modules/_pickle.c - picklerproxy_methods - +Modules/_pickle.c - Unpickler_methods - +Modules/_pickle.c - unpicklerproxy_methods - +Modules/_pickle.c - pickle_methods - +Modules/posixmodule.c - DirEntry_methods - +Modules/posixmodule.c - ScandirIterator_methods - +Modules/posixmodule.c - posix_methods - +Modules/_posixsubprocess.c - module_methods - +Modules/pwdmodule.c - pwd_methods - +Modules/pyexpat.c - xmlparse_methods - +Modules/pyexpat.c - pyexpat_methods - +Modules/_queuemodule.c - simplequeue_methods - +Modules/_randommodule.c - random_methods - +Modules/readline.c - readline_methods - +Modules/resource.c - resource_methods - +Modules/_scproxy.c - mod_methods - +Modules/selectmodule.c - poll_methods - +Modules/selectmodule.c - devpoll_methods - +Modules/selectmodule.c - pyepoll_methods - +Modules/selectmodule.c - kqueue_queue_methods - +Modules/selectmodule.c - select_methods - +Modules/sha1module.c - SHA1_methods - +Modules/sha1module.c - SHA1_functions - +Modules/sha256module.c - SHA_methods - +Modules/sha256module.c - SHA_functions - +Modules/_sha3/sha3module.c - SHA3_methods - +Modules/_sha3/sha3module.c - SHAKE_methods - +Modules/sha512module.c - SHA_methods - +Modules/sha512module.c - SHA_functions - +Modules/signalmodule.c - signal_methods - +Modules/socketmodule.c - sock_methods - +Modules/socketmodule.c - socket_methods - +Modules/spwdmodule.c - spwd_methods - +Modules/_sqlite/cache.c - cache_methods - +Modules/_sqlite/connection.c - connection_methods - +Modules/_sqlite/cursor.c - cursor_methods - +Modules/_sqlite/module.c - module_methods - +Modules/_sqlite/row.c - row_methods - +Modules/_sre.c - pattern_methods - +Modules/_sre.c - match_methods - +Modules/_sre.c - scanner_methods - +Modules/_sre.c - _functions - +Modules/_ssl.c - PySSLMethods - +Modules/_ssl.c - context_methods - +Modules/_ssl.c - memory_bio_methods - +Modules/_ssl.c - PySSL_methods - +Modules/_stat.c - stat_methods - +Modules/_statisticsmodule.c - statistics_methods - +Modules/_struct.c - unpackiter_methods - +Modules/_struct.c - s_methods - +Modules/_struct.c - module_functions - +Modules/symtablemodule.c - symtable_methods - +Modules/syslogmodule.c - syslog_methods - +Modules/termios.c - termios_methods - +Modules/_threadmodule.c - lock_methods - +Modules/_threadmodule.c - rlock_methods - +Modules/_threadmodule.c local_new wr_callback_def - +Modules/_threadmodule.c - thread_methods - +Modules/timemodule.c - time_methods - +Modules/_tkinter.c - Tktt_methods - +Modules/_tkinter.c - Tkapp_methods - +Modules/_tkinter.c - moduleMethods - +Modules/_tracemalloc.c - module_methods - +Modules/unicodedata.c - unicodedata_functions - +Modules/_uuidmodule.c - uuid_methods - +Modules/_weakref.c - weakref_functions - +Modules/_winapi.c - overlapped_methods - +Modules/_winapi.c - winapi_functions - +Modules/xxlimited.c - Xxo_methods - +Modules/xxlimited.c - xx_methods - +Modules/xxmodule.c - Xxo_methods - +Modules/xxmodule.c - xx_methods - +Modules/_xxsubinterpretersmodule.c - module_functions - +Modules/xxsubtype.c - spamlist_methods - +Modules/xxsubtype.c - spamdict_methods - +Modules/xxsubtype.c - xxsubtype_functions - +Modules/zlibmodule.c - comp_methods - +Modules/zlibmodule.c - Decomp_methods - +Modules/zlibmodule.c - zlib_methods - +Modules/_zoneinfo.c - zoneinfo_methods - +Modules/_zoneinfo.c - module_methods - +Modules/cjkcodecs/cjkcodecs.h - __methods - +Objects/bytearrayobject.c - bytearray_methods - +Objects/bytearrayobject.c - bytearrayiter_methods - +Objects/bytesobject.c - bytes_methods - +Objects/bytesobject.c - striter_methods - +Objects/classobject.c - method_methods - +Objects/codeobject.c - code_methods - +Objects/complexobject.c - complex_methods - +Objects/descrobject.c - descr_methods - +Objects/descrobject.c - mappingproxy_methods - +Objects/descrobject.c - wrapper_methods - +Objects/descrobject.c - property_methods - +Objects/dictobject.c - mapp_methods - +Objects/dictobject.c - dictiter_methods - +Objects/dictobject.c - dictkeys_methods - +Objects/dictobject.c - dictitems_methods - +Objects/dictobject.c - dictvalues_methods - +Objects/enumobject.c - enum_methods - +Objects/enumobject.c - reversediter_methods - +Objects/exceptions.c - BaseException_methods - +Objects/exceptions.c - ImportError_methods - +Objects/exceptions.c - OSError_methods - +Objects/fileobject.c - stdprinter_methods - +Objects/floatobject.c - float_methods - +Objects/frameobject.c - frame_methods - +Objects/genericaliasobject.c - ga_methods - +Objects/genobject.c - gen_methods - +Objects/genobject.c - coro_methods - +Objects/genobject.c - coro_wrapper_methods - +Objects/genobject.c - async_gen_methods - +Objects/genobject.c - async_gen_asend_methods - +Objects/genobject.c - async_gen_athrow_methods - +Objects/iterobject.c - seqiter_methods - +Objects/iterobject.c - calliter_methods - +Objects/listobject.c - list_methods - +Objects/listobject.c - listiter_methods - +Objects/listobject.c - listreviter_methods - +Objects/longobject.c - long_methods - +Objects/memoryobject.c - memory_methods - +Objects/methodobject.c - meth_methods - +Objects/moduleobject.c - module_methods - +Objects/namespaceobject.c - namespace_methods - +Objects/object.c - notimplemented_methods - +Objects/odictobject.c - odict_methods - +Objects/odictobject.c - odictiter_methods - +Objects/odictobject.c - odictkeys_methods - +Objects/odictobject.c - odictitems_methods - +Objects/odictobject.c - odictvalues_methods - +Objects/picklebufobject.c - picklebuf_methods - +Objects/rangeobject.c - range_methods - +Objects/rangeobject.c - rangeiter_methods - +Objects/rangeobject.c - longrangeiter_methods - +Objects/setobject.c - setiter_methods - +Objects/setobject.c - set_methods - +Objects/setobject.c - frozenset_methods - +Objects/sliceobject.c - ellipsis_methods - +Objects/sliceobject.c - slice_methods - +Objects/structseq.c - structseq_methods - +Objects/tupleobject.c - tuple_methods - +Objects/tupleobject.c - tupleiter_methods - +Objects/typeobject.c - type_methods - +Objects/typeobject.c - object_methods - +Objects/typeobject.c - tp_new_methoddef - +Objects/unicodeobject.c - encoding_map_methods - +Objects/unicodeobject.c - unicode_methods - +Objects/unicodeobject.c - unicodeiter_methods - +Objects/unicodeobject.c - _string_methods - +Objects/unionobject.c - union_methods - +Objects/weakrefobject.c - weakref_methods - +Objects/weakrefobject.c - proxy_methods - +Objects/stringlib/unicode_format.h - formatteriter_methods - +Objects/stringlib/unicode_format.h - fieldnameiter_methods - +Python/bltinmodule.c - filter_methods - +Python/bltinmodule.c - map_methods - +Python/bltinmodule.c - zip_methods - +Python/bltinmodule.c - builtin_methods - +Python/context.c - PyContext_methods - +Python/context.c - PyContextVar_methods - +Python/context.c - PyContextTokenType_methods - +Python/hamt.c - PyHamt_methods - +Python/import.c - imp_methods - +Python/marshal.c - marshal_methods - +Python/Python-ast.c - ast_type_methods - +Python/sysmodule.c - sys_methods - +Python/traceback.c - tb_methods - +Python/_warnings.c - warnings_functions - + +#----------------------- +# PyMemberDef[], for static types and strucseq +# [] + +Modules/_bz2module.c - BZ2Decompressor_members - +Modules/cjkcodecs/multibytecodec.c - mbstreamreader_members - +Modules/cjkcodecs/multibytecodec.c - mbstreamwriter_members - +Modules/_collectionsmodule.c - defdict_members - +Modules/_collectionsmodule.c - tuplegetter_members - +Modules/_csv.c - Dialect_memberlist - +Modules/_csv.c - Reader_memberlist - +Modules/_csv.c - Writer_memberlist - +Modules/_ctypes/callproc.c - PyCArgType_members - +Modules/_ctypes/_ctypes.c - PyCData_members - +Modules/_datetimemodule.c - delta_members - +Modules/_elementtree.c - xmlparser_members - +Modules/_functoolsmodule.c - partial_memberlist - +Modules/_functoolsmodule.c - keyobject_members - +Modules/_io/bufferedio.c - bufferedreader_members - +Modules/_io/bufferedio.c - bufferedwriter_members - +Modules/_io/bufferedio.c - bufferedrandom_members - +Modules/_io/fileio.c - fileio_members - +Modules/_io/textio.c - textiowrapper_members - +Modules/_io/winconsoleio.c - winconsoleio_members - +Modules/_json.c - scanner_members - +Modules/_json.c - encoder_members - +Modules/_lzmamodule.c - Decompressor_members - +Modules/_multiprocessing/semaphore.c - semlock_members - +Modules/ossaudiodev.c - oss_members - +Modules/overlapped.c - Overlapped_members - +Modules/_pickle.c - Pickler_members - +Modules/posixmodule.c - DirEntry_members - +Modules/pyexpat.c - xmlparse_members - +Modules/selectmodule.c - kqueue_event_members - +Modules/sha256module.c - SHA_members - +Modules/sha512module.c - SHA_members - +Modules/socketmodule.c - sock_memberlist - +Modules/_sqlite/connection.c - connection_members - +Modules/_sqlite/cursor.c - cursor_members - +Modules/_sqlite/statement.c - stmt_members - +Modules/_sre.c - pattern_members - +Modules/_sre.c - match_members - +Modules/_sre.c - scanner_members - +Modules/_struct.c - s_members - +Modules/unicodedata.c - DB_members - +Modules/_winapi.c - overlapped_members - +Modules/xxsubtype.c - spamdict_members - +Modules/zlibmodule.c - Decomp_members - +Modules/_zoneinfo.c - zoneinfo_members - +Objects/classobject.c - method_memberlist - +Objects/classobject.c - instancemethod_memberlist - +Objects/codeobject.c - code_memberlist - +Objects/complexobject.c - complex_members - +Objects/descrobject.c - descr_members - +Objects/descrobject.c - wrapper_members - +Objects/descrobject.c - property_members - +Objects/exceptions.c - BaseException_members - +Objects/exceptions.c - StopIteration_members - +Objects/exceptions.c - SystemExit_members - +Objects/exceptions.c - ImportError_members - +Objects/exceptions.c - OSError_members - +Objects/exceptions.c - SyntaxError_members - +Objects/exceptions.c - UnicodeError_members - +Objects/frameobject.c - frame_memberlist - +Objects/funcobject.c - func_memberlist - +Objects/funcobject.c - cm_memberlist - +Objects/funcobject.c - sm_memberlist - +Objects/genericaliasobject.c - ga_members - +Objects/genobject.c - gen_memberlist - +Objects/genobject.c - coro_memberlist - +Objects/genobject.c - async_gen_memberlist - +Objects/methodobject.c - meth_members - +Objects/moduleobject.c - module_members - +Objects/namespaceobject.c - namespace_members - +Objects/rangeobject.c - range_members - +Objects/sliceobject.c - slice_members - +Objects/typeobject.c - type_members - +Objects/typeobject.c - super_members - +Objects/unionobject.c - union_members - +Objects/weakrefobject.c - weakref_members - +Python/context.c - PyContextVar_members - +Python/Python-ast.c - ast_type_members - +Python/symtable.c - ste_memberlist - +Python/traceback.c - tb_memberlist - + +#----------------------- +# for static types +# [] + +# PyNumberMethods [] +Modules/_collectionsmodule.c - deque_as_number - +Modules/_collectionsmodule.c - defdict_as_number - +Modules/_ctypes/_ctypes.c - PyCFuncPtr_as_number - +Modules/_ctypes/_ctypes.c - Simple_as_number - +Modules/_ctypes/_ctypes.c - Pointer_as_number - +Modules/_datetimemodule.c - delta_as_number - +Modules/_datetimemodule.c - date_as_number - +Modules/_datetimemodule.c - datetime_as_number - +Modules/_decimal/_decimal.c - dec_number_methods - +Modules/_xxsubinterpretersmodule.c - channelid_as_number - +Objects/boolobject.c - bool_as_number - +Objects/bytearrayobject.c - bytearray_as_number - +Objects/bytesobject.c - bytes_as_number - +Objects/complexobject.c - complex_as_number - +Objects/descrobject.c - mappingproxy_as_number - +Objects/dictobject.c - dict_as_number - +Objects/dictobject.c - dictviews_as_number - +Objects/floatobject.c - float_as_number - +Objects/interpreteridobject.c - interpid_as_number - +Objects/longobject.c - long_as_number - +Objects/object.c - none_as_number - +Objects/object.c - notimplemented_as_number - +Objects/odictobject.c - odict_as_number - +Objects/rangeobject.c - range_as_number - +Objects/setobject.c - set_as_number - +Objects/setobject.c - frozenset_as_number - +Objects/typeobject.c - type_as_number - +Objects/unicodeobject.c - unicode_as_number - +Objects/unionobject.c - union_as_number - +Objects/weakrefobject.c - proxy_as_number - + +# PySequenceMethods [] +Modules/arraymodule.c - array_as_sequence - +Modules/_collectionsmodule.c - deque_as_sequence - +Modules/_ctypes/_ctypes.c - CDataType_as_sequence - +Modules/_ctypes/_ctypes.c - Array_as_sequence - +Modules/_ctypes/_ctypes.c - Pointer_as_sequence - +Modules/_elementtree.c - element_as_sequence - +Modules/mmapmodule.c - mmap_as_sequence - +Objects/bytearrayobject.c - bytearray_as_sequence - +Objects/bytesobject.c - bytes_as_sequence - +Objects/descrobject.c - mappingproxy_as_sequence - +Objects/dictobject.c - dict_as_sequence - +Objects/dictobject.c - dictkeys_as_sequence - +Objects/dictobject.c - dictitems_as_sequence - +Objects/dictobject.c - dictvalues_as_sequence - +Objects/listobject.c - list_as_sequence - +Objects/memoryobject.c - memory_as_sequence - +Objects/rangeobject.c - range_as_sequence - +Objects/setobject.c - set_as_sequence - +Objects/tupleobject.c - tuple_as_sequence - +Objects/unicodeobject.c - unicode_as_sequence - +Objects/weakrefobject.c - proxy_as_sequence - +Python/context.c - PyContext_as_sequence - +Python/hamt.c - PyHamt_as_sequence - + +# PyMappingMethods [] +Modules/arraymodule.c - array_as_mapping - +Modules/_ctypes/_ctypes.c - Array_as_mapping - +Modules/_ctypes/_ctypes.c - Pointer_as_mapping - +Modules/_decimal/_decimal.c - signaldict_as_mapping - +Modules/_elementtree.c - element_as_mapping - +Modules/mmapmodule.c - mmap_as_mapping - +Modules/_sre.c - match_as_mapping - +Objects/bytearrayobject.c - bytearray_as_mapping - +Objects/bytesobject.c - bytes_as_mapping - +Objects/descrobject.c - mappingproxy_as_mapping - +Objects/dictobject.c - dict_as_mapping - +Objects/genericaliasobject.c - ga_as_mapping - +Objects/listobject.c - list_as_mapping - +Objects/memoryobject.c - memory_as_mapping - +Objects/odictobject.c - odict_as_mapping - +Objects/rangeobject.c - range_as_mapping - +Objects/tupleobject.c - tuple_as_mapping - +Objects/unicodeobject.c - unicode_as_mapping - +Objects/weakrefobject.c - proxy_as_mapping - +Python/context.c - PyContext_as_mapping - +Python/hamt.c - PyHamtIterator_as_mapping - +Python/hamt.c - PyHamt_as_mapping - + +# PyAsyncMethods [] +Modules/_asynciomodule.c - FutureType_as_async - +Objects/genobject.c - coro_as_async - +Objects/genobject.c - async_gen_as_async - +Objects/genobject.c - async_gen_asend_as_async - +Objects/genobject.c - async_gen_athrow_as_async - + +# PyBufferProcs [] +Modules/arraymodule.c - array_as_buffer - +Modules/_ctypes/_ctypes.c - PyCData_as_buffer - +Modules/_io/bytesio.c - bytesiobuf_as_buffer - +Modules/mmapmodule.c - mmap_as_buffer - +Objects/bytearrayobject.c - bytearray_as_buffer - +Objects/bytesobject.c - bytes_as_buffer - +Objects/memoryobject.c - memory_as_buffer - +Objects/picklebufobject.c - picklebuf_as_buffer - + +# PyGetSetDef [] +Modules/arraymodule.c - array_getsets - +Modules/_asynciomodule.c - FutureType_getsetlist - +Modules/_asynciomodule.c - TaskStepMethWrapper_getsetlist - +Modules/_asynciomodule.c - TaskType_getsetlist - +Modules/_blake2/blake2b_impl.c - py_blake2b_getsetters - +Modules/_blake2/blake2s_impl.c - py_blake2s_getsetters - +Modules/cjkcodecs/multibytecodec.c - codecctx_getsets - +Modules/_collectionsmodule.c - deque_getset - +Modules/_csv.c - Dialect_getsetlist - +Modules/_ctypes/cfield.c - PyCField_getset - +Modules/_ctypes/_ctypes.c - CharArray_getsets - +Modules/_ctypes/_ctypes.c - WCharArray_getsets - +Modules/_ctypes/_ctypes.c - PyCFuncPtr_getsets - +Modules/_ctypes/_ctypes.c - Simple_getsets - +Modules/_ctypes/_ctypes.c - Pointer_getsets - +Modules/_cursesmodule.c - PyCursesWindow_getsets - +Modules/_datetimemodule.c - date_getset - +Modules/_datetimemodule.c - iso_calendar_date_getset - +Modules/_datetimemodule.c - time_getset - +Modules/_datetimemodule.c - datetime_getset - +Modules/_decimal/_decimal.c - context_getsets - +Modules/_decimal/_decimal.c - dec_getsets - +Modules/_elementtree.c - xmlparser_getsetlist - +Modules/_elementtree.c - element_getsetlist - +Modules/_functoolsmodule.c - partial_getsetlist - +Modules/_functoolsmodule.c - lru_cache_getsetlist - +Modules/_hashopenssl.c - EVP_getseters - +Modules/_hashopenssl.c - EVPXOF_getseters - +Modules/_hashopenssl.c - HMAC_getset - +Modules/_io/bufferedio.c - bufferedreader_getset - +Modules/_io/bufferedio.c - bufferedwriter_getset - +Modules/_io/bufferedio.c - bufferedrwpair_getset - +Modules/_io/bufferedio.c - bufferedrandom_getset - +Modules/_io/bytesio.c - bytesio_getsetlist - +Modules/_io/fileio.c - fileio_getsetlist - +Modules/_io/iobase.c - iobase_getset - +Modules/_io/stringio.c - stringio_getset - +Modules/_io/textio.c - textiobase_getset - +Modules/_io/textio.c - incrementalnewlinedecoder_getset - +Modules/_io/textio.c - textiowrapper_getset - +Modules/_io/winconsoleio.c - winconsoleio_getsetlist - +Modules/md5module.c - MD5_getseters - +Modules/mmapmodule.c - mmap_object_getset - +Modules/ossaudiodev.c - oss_getsetlist - +Modules/overlapped.c - Overlapped_getsets - +Modules/_pickle.c - Pickler_getsets - +Modules/_pickle.c - Unpickler_getsets - +Modules/pyexpat.c - xmlparse_getsetlist - +Modules/selectmodule.c - devpoll_getsetlist - +Modules/selectmodule.c - pyepoll_getsetlist - +Modules/selectmodule.c - kqueue_queue_getsetlist - +Modules/sha1module.c - SHA1_getseters - +Modules/sha256module.c - SHA_getseters - +Modules/_sha3/sha3module.c - SHA3_getseters - +Modules/sha512module.c - SHA_getseters - +Modules/socketmodule.c - sock_getsetlist - +Modules/_sqlite/connection.c - connection_getset - +Modules/_sre.c - pattern_getset - +Modules/_sre.c - match_getset - +Modules/_ssl.c - ssl_getsetlist - +Modules/_ssl.c - context_getsetlist - +Modules/_ssl.c - memory_bio_getsetlist - +Modules/_ssl.c - PySSLSession_getsetlist - +Modules/_struct.c - s_getsetlist - +Modules/_tkinter.c - PyTclObject_getsetlist - +Modules/_xxsubinterpretersmodule.c - channelid_getsets - +Modules/xxsubtype.c - spamlist_getsets - +Objects/cellobject.c - cell_getsetlist - +Objects/classobject.c - method_getset - +Objects/classobject.c - instancemethod_getset - +Objects/descrobject.c - method_getset - +Objects/descrobject.c - member_getset - +Objects/descrobject.c - getset_getset - +Objects/descrobject.c - wrapperdescr_getset - +Objects/descrobject.c - wrapper_getsets - +Objects/descrobject.c - property_getsetlist - +Objects/dictobject.c - dictview_getset - +Objects/exceptions.c - BaseException_getset - +Objects/exceptions.c - OSError_getset - +Objects/fileobject.c - stdprinter_getsetlist - +Objects/floatobject.c - float_getset - +Objects/frameobject.c - frame_getsetlist - +Objects/funcobject.c - func_getsetlist - +Objects/funcobject.c - cm_getsetlist - +Objects/funcobject.c - sm_getsetlist - +Objects/genericaliasobject.c - ga_properties - +Objects/genobject.c - gen_getsetlist - +Objects/genobject.c - coro_getsetlist - +Objects/genobject.c - async_gen_getsetlist - +Objects/longobject.c - long_getset - +Objects/memoryobject.c - memory_getsetlist - +Objects/methodobject.c - meth_getsets - +Objects/odictobject.c - odict_getset - +Objects/typeobject.c - type_getsets - +Objects/typeobject.c - subtype_getsets_full - +Objects/typeobject.c - subtype_getsets_dict_only - +Objects/typeobject.c - subtype_getsets_weakref_only - +Objects/typeobject.c - object_getsets - +Python/context.c - PyContextTokenType_getsetlist - +Python/Python-ast.c - ast_type_getsets - +Python/traceback.c - tb_getsetters - + +#----------------------- +# for heap types +# [] + +# PyType_Slot [] +Modules/_abc.c - _abc_data_type_spec_slots - +Modules/_blake2/blake2b_impl.c - blake2b_type_slots - +Modules/_blake2/blake2s_impl.c - blake2s_type_slots - +Modules/_bz2module.c - bz2_compressor_type_slots - +Modules/_bz2module.c - bz2_decompressor_type_slots - +Modules/_curses_panel.c - PyCursesPanel_Type_slots - +Modules/_dbmmodule.c - dbmtype_spec_slots - +Modules/_gdbmmodule.c - gdbmtype_spec_slots - +Modules/_hashopenssl.c - EVPtype_slots - +Modules/_hashopenssl.c - EVPXOFtype_slots - +Modules/_hashopenssl.c - HMACtype_slots - +Modules/_json.c - PyScannerType_slots - +Modules/_json.c - PyEncoderType_slots - +Modules/_lsprof.c - _lsprof_profiler_type_spec_slots - +Modules/_lzmamodule.c - lzma_compressor_type_slots - +Modules/_lzmamodule.c - lzma_decompressor_type_slots - +Modules/md5module.c - md5_type_slots - +Modules/_operator.c - itemgetter_type_slots - +Modules/_operator.c - attrgetter_type_slots - +Modules/_operator.c - methodcaller_type_slots - +Modules/overlapped.c - overlapped_type_slots - +Modules/posixmodule.c - DirEntryType_slots - +Modules/posixmodule.c - ScandirIteratorType_slots - +Modules/_randommodule.c - Random_Type_slots - +Modules/selectmodule.c - devpoll_Type_slots - +Modules/selectmodule.c - kqueue_event_Type_slots - +Modules/selectmodule.c - poll_Type_slots - +Modules/selectmodule.c - pyEpoll_Type_slots - +Modules/selectmodule.c - kqueue_queue_Type_slots - +Modules/sha1module.c - sha1_type_slots - +Modules/sha256module.c - sha256_types_slots - +Modules/_sha3/sha3module.c - sha3_224_slots - +Modules/_sha3/sha3module.c - sha3_256_slots - +Modules/_sha3/sha3module.c - sha3_384_slots - +Modules/_sha3/sha3module.c - sha3_512_slots - +Modules/_sha3/sha3module.c - SHAKE128slots - +Modules/_sha3/sha3module.c - SHAKE256slots - +Modules/_sha3/sha3module.c - type_slots_obj - +Modules/sha512module.c - sha512_sha384_type_slots - +Modules/sha512module.c - sha512_sha512_type_slots - +Modules/_sqlite/cache.c - pysqlite_NodeType_slots - +Modules/_sqlite/cache.c - pysqlite_CacheType_slots - +Modules/_sqlite/connection.c - connection_slots - +Modules/_sqlite/cursor.c - cursor_slots - +Modules/_sqlite/prepare_protocol.c - type_slots - +Modules/_sqlite/row.c - row_slots - +Modules/_sqlite/statement.c - stmt_slots - +Modules/_ssl.c - sslerror_type_slots - +Modules/_struct.c - unpackiter_type_slots - +Modules/_struct.c - PyStructType_slots - +Modules/_tkinter.c - PyTclObject_Type_slots - +Modules/_tkinter.c - Tktt_Type_slots - +Modules/_tkinter.c - Tkapp_Type_slots - +Modules/unicodedata.c - ucd_type_slots - +Modules/_winapi.c - winapi_overlapped_type_slots - +Modules/xxlimited.c - Xxo_Type_slots - +Modules/xxlimited.c - Str_Type_slots - +Modules/xxlimited.c - Null_Type_slots - +Modules/zlibmodule.c - Comptype_slots - +Modules/zlibmodule.c - Decomptype_slots - +Python/Python-ast.c - AST_type_slots - + +# PyType_Spec [] +Modules/_abc.c - _abc_data_type_spec - +Modules/_blake2/blake2b_impl.c - blake2b_type_spec - +Modules/_blake2/blake2s_impl.c - blake2s_type_spec - +Modules/_bz2module.c - bz2_compressor_type_spec - +Modules/_bz2module.c - bz2_decompressor_type_spec - +Modules/_curses_panel.c - PyCursesPanel_Type_spec - +Modules/_dbmmodule.c - dbmtype_spec - +Modules/_gdbmmodule.c - gdbmtype_spec - +Modules/_hashopenssl.c - EVPtype_spec - +Modules/_hashopenssl.c - EVPXOFtype_spec - +Modules/_hashopenssl.c - HMACtype_spec - +Modules/_json.c - PyScannerType_spec - +Modules/_json.c - PyEncoderType_spec - +Modules/_lsprof.c - _lsprof_profiler_type_spec - +Modules/_lzmamodule.c - lzma_compressor_type_spec - +Modules/_lzmamodule.c - lzma_decompressor_type_spec - +Modules/_operator.c - itemgetter_type_spec - +Modules/_operator.c - attrgetter_type_spec - +Modules/_operator.c - methodcaller_type_spec - +Modules/_randommodule.c - Random_Type_spec - +Modules/_sha3/sha3module.c - sha3_224_spec - +Modules/_sha3/sha3module.c - sha3_256_spec - +Modules/_sha3/sha3module.c - sha3_384_spec - +Modules/_sha3/sha3module.c - sha3_512_spec - +Modules/_sha3/sha3module.c - SHAKE128_spec - +Modules/_sha3/sha3module.c - SHAKE256_spec - +Modules/_sha3/sha3module.c - type_spec_obj - +Modules/_sqlite/cache.c - pysqlite_NodeType_spec - +Modules/_sqlite/cache.c - pysqlite_CacheType_spec - +Modules/_sqlite/connection.c - connection_spec - +Modules/_sqlite/cursor.c - cursor_spec - +Modules/_sqlite/prepare_protocol.c - type_spec - +Modules/_sqlite/row.c - row_spec - +Modules/_sqlite/statement.c - stmt_spec - +Modules/_ssl.c - sslerror_type_spec - +Modules/_struct.c - unpackiter_type_spec - +Modules/_struct.c - PyStructType_spec - +Modules/_tkinter.c - PyTclObject_Type_spec - +Modules/_tkinter.c - Tktt_Type_spec - +Modules/_tkinter.c - Tkapp_Type_spec - +Modules/_winapi.c - winapi_overlapped_type_spec - +Modules/_zoneinfo.c - DAYS_IN_MONTH - +Modules/_zoneinfo.c - DAYS_BEFORE_MONTH - +Modules/md5module.c - md5_type_spec - +Modules/overlapped.c - overlapped_type_spec - +Modules/posixmodule.c - DirEntryType_spec - +Modules/posixmodule.c - ScandirIteratorType_spec - +Modules/selectmodule.c - devpoll_Type_spec - +Modules/selectmodule.c - kqueue_event_Type_spec - +Modules/selectmodule.c - poll_Type_spec - +Modules/selectmodule.c - pyEpoll_Type_spec - +Modules/selectmodule.c - kqueue_queue_Type_spec - +Modules/sha1module.c - sha1_type_spec - +Modules/sha256module.c - sha224_type_spec - +Modules/sha256module.c - sha256_type_spec - +Modules/sha512module.c - sha512_sha384_type_spec - +Modules/sha512module.c - sha512_sha512_type_spec - +Modules/unicodedata.c - ucd_type_spec - +Modules/xxlimited.c - Xxo_Type_spec - +Modules/xxlimited.c - Str_Type_spec - +Modules/xxlimited.c - Null_Type_spec - +Modules/zlibmodule.c - Comptype_spec - +Modules/zlibmodule.c - Decomptype_spec - +Python/Python-ast.c - AST_type_spec - + +#----------------------- +# for structseq +# [] + +# PyStructSequence_Field[] [] +Modules/_cursesmodule.c - ncurses_version_fields - +Modules/grpmodule.c - struct_group_type_fields - +Modules/_lsprof.c - profiler_entry_fields - +Modules/_lsprof.c - profiler_subentry_fields - +Modules/posixmodule.c - stat_result_fields - +Modules/posixmodule.c - statvfs_result_fields - +Modules/posixmodule.c - waitid_result_fields - +Modules/posixmodule.c - uname_result_fields - +Modules/posixmodule.c - sched_param_fields - +Modules/posixmodule.c - times_result_fields - +Modules/posixmodule.c - TerminalSize_fields - +Modules/pwdmodule.c - struct_pwd_type_fields - +Modules/resource.c - struct_rusage_fields - +Modules/signalmodule.c - struct_siginfo_fields - +Modules/spwdmodule.c - struct_spwd_type_fields - +Modules/_threadmodule.c - ExceptHookArgs_fields - +Modules/timemodule.c - struct_time_type_fields - +Objects/floatobject.c - floatinfo_fields - +Objects/longobject.c - int_info_fields - +Python/errors.c - UnraisableHookArgs_fields - +Python/sysmodule.c - asyncgen_hooks_fields - +Python/sysmodule.c - hash_info_fields - +Python/sysmodule.c - windows_version_fields - +Python/sysmodule.c - flags_fields - +Python/sysmodule.c - version_info_fields - +Python/thread.c - threadinfo_fields - + +# PyStructSequence_Desc [] +Modules/_cursesmodule.c - ncurses_version_desc - +Modules/grpmodule.c - struct_group_type_desc - +Modules/_lsprof.c - profiler_entry_desc - +Modules/_lsprof.c - profiler_subentry_desc - +Modules/posixmodule.c - stat_result_desc - +Modules/posixmodule.c - statvfs_result_desc - +Modules/posixmodule.c - waitid_result_desc - +Modules/posixmodule.c - uname_result_desc - +Modules/posixmodule.c - sched_param_desc - +Modules/posixmodule.c - times_result_desc - +Modules/posixmodule.c - TerminalSize_desc - +Modules/pwdmodule.c - struct_pwd_type_desc - +Modules/resource.c - struct_rusage_desc - +Modules/signalmodule.c - struct_siginfo_desc - +Modules/spwdmodule.c - struct_spwd_type_desc - +Modules/_threadmodule.c - ExceptHookArgs_desc - +Modules/timemodule.c - struct_time_type_desc - +Objects/floatobject.c - floatinfo_desc - +Objects/longobject.c - int_info_desc - +Python/errors.c - UnraisableHookArgs_desc - +Python/sysmodule.c - asyncgen_hooks_desc - +Python/sysmodule.c - hash_info_desc - +Python/sysmodule.c - windows_version_desc - +Python/sysmodule.c - flags_desc - +Python/sysmodule.c - version_info_desc - +Python/thread.c - threadinfo_desc - + +#----------------------- +# _PyArg_Parser +# [] + +Modules/clinic/md5module.c.h MD5Type_copy _parser - +Modules/clinic/md5module.c.h _md5_md5 _parser - +Modules/clinic/_dbmmodule.c.h _dbm_dbm_keys _parser - +Modules/clinic/_dbmmodule.c.h _dbm_dbm_get _parser - +Modules/clinic/_dbmmodule.c.h _dbm_dbm_setdefault _parser - +Modules/clinic/posixmodule.c.h os_stat _parser - +Modules/clinic/posixmodule.c.h os_lstat _parser - +Modules/clinic/posixmodule.c.h os_access _parser - +Modules/clinic/posixmodule.c.h os_chdir _parser - +Modules/clinic/posixmodule.c.h os_chmod _parser - +Modules/clinic/posixmodule.c.h os_listdir _parser - +Modules/clinic/posixmodule.c.h os_mkdir _parser - +Modules/clinic/posixmodule.c.h os_rename _parser - +Modules/clinic/posixmodule.c.h os_replace _parser - +Modules/clinic/posixmodule.c.h os_rmdir _parser - +Modules/clinic/posixmodule.c.h os_unlink _parser - +Modules/clinic/posixmodule.c.h os_remove _parser - +Modules/clinic/posixmodule.c.h os_utime _parser - +Modules/clinic/posixmodule.c.h os__exit _parser - +Modules/clinic/posixmodule.c.h os_open _parser - +Modules/clinic/posixmodule.c.h os_close _parser - +Modules/clinic/posixmodule.c.h os_dup2 _parser - +Modules/clinic/posixmodule.c.h os_fstat _parser - +Modules/clinic/posixmodule.c.h os_device_encoding _parser - +Modules/clinic/posixmodule.c.h os_DirEntry_is_symlink _parser - +Modules/clinic/posixmodule.c.h os_DirEntry_stat _parser - +Modules/clinic/posixmodule.c.h os_DirEntry_is_dir _parser - +Modules/clinic/posixmodule.c.h os_DirEntry_is_file _parser - +Modules/clinic/posixmodule.c.h os_scandir _parser - +Modules/clinic/posixmodule.c.h os_fspath _parser - +Modules/clinic/cmathmodule.c.h cmath_isclose _parser - +Modules/clinic/sha256module.c.h SHA256Type_copy _parser - +Modules/clinic/sha256module.c.h _sha256_sha256 _parser - +Modules/clinic/sha256module.c.h _sha256_sha224 _parser - +Modules/clinic/_hashopenssl.c.h EVP_new _parser - +Modules/clinic/_hashopenssl.c.h _hashlib_openssl_md5 _parser - +Modules/clinic/_hashopenssl.c.h _hashlib_openssl_sha1 _parser - +Modules/clinic/_hashopenssl.c.h _hashlib_openssl_sha224 _parser - +Modules/clinic/_hashopenssl.c.h _hashlib_openssl_sha256 _parser - +Modules/clinic/_hashopenssl.c.h _hashlib_openssl_sha384 _parser - +Modules/clinic/_hashopenssl.c.h _hashlib_openssl_sha512 _parser - +Modules/clinic/_hashopenssl.c.h pbkdf2_hmac _parser - +Modules/clinic/_hashopenssl.c.h _hashlib_hmac_singleshot _parser - +Modules/clinic/_hashopenssl.c.h _hashlib_hmac_new _parser - +Modules/clinic/_hashopenssl.c.h _hashlib_HMAC_update _parser - +Modules/clinic/_ssl.c.h _ssl__SSLSocket_get_channel_binding _parser - +Modules/clinic/_ssl.c.h _ssl__SSLContext_load_cert_chain _parser - +Modules/clinic/_ssl.c.h _ssl__SSLContext_load_verify_locations _parser - +Modules/clinic/_ssl.c.h _ssl__SSLContext__wrap_socket _parser - +Modules/clinic/_ssl.c.h _ssl__SSLContext__wrap_bio _parser - +Modules/clinic/_ssl.c.h _ssl__SSLContext_get_ca_certs _parser - +Modules/clinic/_ssl.c.h _ssl_txt2obj _parser - +Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_put _parser - +Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_put_nowait _parser - +Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_get _parser - +Modules/clinic/_lsprof.c.h _lsprof_Profiler_getstats _parser - +Modules/clinic/_datetimemodule.c.h iso_calendar_date_new _parser - +Modules/clinic/_datetimemodule.c.h datetime_datetime_now _parser - +Modules/clinic/_opcode.c.h _opcode_stack_effect _parser - +Modules/clinic/_lzmamodule.c.h _lzma_LZMADecompressor_decompress _parser - +Modules/clinic/_lzmamodule.c.h _lzma_LZMADecompressor___init__ _parser - +Modules/clinic/pyexpat.c.h pyexpat_ParserCreate _parser - +Modules/clinic/mathmodule.c.h math_isclose _parser - +Modules/clinic/mathmodule.c.h math_prod _parser - +Modules/clinic/_curses_panel.c.h _curses_panel_panel_bottom _parser - +Modules/clinic/_curses_panel.c.h _curses_panel_panel_hide _parser - +Modules/clinic/_curses_panel.c.h _curses_panel_panel_show _parser - +Modules/clinic/_curses_panel.c.h _curses_panel_panel_top _parser - +Modules/clinic/_curses_panel.c.h _curses_panel_panel_move _parser - +Modules/clinic/_curses_panel.c.h _curses_panel_panel_replace _parser - +Modules/clinic/_curses_panel.c.h _curses_panel_panel_set_userptr _parser - +Modules/clinic/_curses_panel.c.h _curses_panel_panel_userptr _parser - +Modules/clinic/_elementtree.c.h _elementtree_Element_find _parser - +Modules/clinic/_elementtree.c.h _elementtree_Element_findtext _parser - +Modules/clinic/_elementtree.c.h _elementtree_Element_findall _parser - +Modules/clinic/_elementtree.c.h _elementtree_Element_iterfind _parser - +Modules/clinic/_elementtree.c.h _elementtree_Element_get _parser - +Modules/clinic/_elementtree.c.h _elementtree_Element_iter _parser - +Modules/clinic/_elementtree.c.h _elementtree_TreeBuilder___init__ _parser - +Modules/clinic/_elementtree.c.h _elementtree_XMLParser___init__ _parser - +Modules/clinic/_asynciomodule.c.h _asyncio_Future___init__ _parser - +Modules/clinic/_asynciomodule.c.h _asyncio_Future_add_done_callback _parser - +Modules/clinic/_asynciomodule.c.h _asyncio_Future_cancel _parser - +Modules/clinic/_asynciomodule.c.h _asyncio_Task___init__ _parser - +Modules/clinic/_asynciomodule.c.h _asyncio_Task_cancel _parser - +Modules/clinic/_asynciomodule.c.h _asyncio_Task_get_stack _parser - +Modules/clinic/_asynciomodule.c.h _asyncio_Task_print_stack _parser - +Modules/clinic/_asynciomodule.c.h _asyncio__register_task _parser - +Modules/clinic/_asynciomodule.c.h _asyncio__unregister_task _parser - +Modules/clinic/_asynciomodule.c.h _asyncio__enter_task _parser - +Modules/clinic/_asynciomodule.c.h _asyncio__leave_task _parser - +Modules/clinic/gcmodule.c.h gc_collect _parser - +Modules/clinic/gcmodule.c.h gc_get_objects _parser - +Modules/clinic/grpmodule.c.h grp_getgrgid _parser - +Modules/clinic/grpmodule.c.h grp_getgrnam _parser - +Modules/clinic/_pickle.c.h _pickle_Pickler___init__ _parser - +Modules/clinic/_pickle.c.h _pickle_Unpickler___init__ _parser - +Modules/clinic/_pickle.c.h _pickle_dump _parser - +Modules/clinic/_pickle.c.h _pickle_dumps _parser - +Modules/clinic/_pickle.c.h _pickle_load _parser - +Modules/clinic/_pickle.c.h _pickle_loads _parser - +Modules/clinic/_struct.c.h Struct___init__ _parser - +Modules/clinic/_struct.c.h Struct_unpack_from _parser - +Modules/clinic/_struct.c.h unpack_from _parser - +Modules/clinic/_testmultiphase.c.h _testmultiphase_StateAccessType_get_defining_module _parser - +Modules/clinic/_testmultiphase.c.h _testmultiphase_StateAccessType_increment_count_clinic _parser - +Modules/clinic/_testmultiphase.c.h _testmultiphase_StateAccessType_get_count _parser - +Modules/clinic/_gdbmmodule.c.h _gdbm_gdbm_keys _parser - +Modules/clinic/_gdbmmodule.c.h _gdbm_gdbm_firstkey _parser - +Modules/clinic/_gdbmmodule.c.h _gdbm_gdbm_nextkey _parser - +Modules/clinic/_gdbmmodule.c.h _gdbm_gdbm_reorganize _parser - +Modules/clinic/_gdbmmodule.c.h _gdbm_gdbm_sync _parser - +Modules/clinic/_sre.c.h _sre_SRE_Pattern_match _parser - +Modules/clinic/_sre.c.h _sre_SRE_Pattern_fullmatch _parser - +Modules/clinic/_sre.c.h _sre_SRE_Pattern_search _parser - +Modules/clinic/_sre.c.h _sre_SRE_Pattern_findall _parser - +Modules/clinic/_sre.c.h _sre_SRE_Pattern_finditer _parser - +Modules/clinic/_sre.c.h _sre_SRE_Pattern_scanner _parser - +Modules/clinic/_sre.c.h _sre_SRE_Pattern_split _parser - +Modules/clinic/_sre.c.h _sre_SRE_Pattern_sub _parser - +Modules/clinic/_sre.c.h _sre_SRE_Pattern_subn _parser - +Modules/clinic/_sre.c.h _sre_compile _parser - +Modules/clinic/_sre.c.h _sre_SRE_Match_expand _parser - +Modules/clinic/_sre.c.h _sre_SRE_Match_groups _parser - +Modules/clinic/_sre.c.h _sre_SRE_Match_groupdict _parser - +Modules/clinic/overlapped.c.h _overlapped_Overlapped _parser - +Modules/clinic/_bisectmodule.c.h _bisect_bisect_right _parser - +Modules/clinic/_bisectmodule.c.h _bisect_insort_right _parser - +Modules/clinic/_bisectmodule.c.h _bisect_bisect_left _parser - +Modules/clinic/_bisectmodule.c.h _bisect_insort_left _parser - +Modules/clinic/zlibmodule.c.h zlib_compress _parser - +Modules/clinic/zlibmodule.c.h zlib_decompress _parser - +Modules/clinic/zlibmodule.c.h zlib_compressobj _parser - +Modules/clinic/zlibmodule.c.h zlib_decompressobj _parser - +Modules/clinic/zlibmodule.c.h zlib_Compress_compress _parser - +Modules/clinic/zlibmodule.c.h zlib_Decompress_decompress _parser - +Modules/clinic/zlibmodule.c.h zlib_Compress_flush _parser - +Modules/clinic/zlibmodule.c.h zlib_Decompress_flush _parser - +Modules/clinic/sha512module.c.h SHA512Type_copy _parser - +Modules/clinic/sha512module.c.h _sha512_sha512 _parser - +Modules/clinic/sha512module.c.h _sha512_sha384 _parser - +Modules/clinic/_bz2module.c.h _bz2_BZ2Decompressor_decompress _parser - +Modules/clinic/sha1module.c.h SHA1Type_copy _parser - +Modules/clinic/sha1module.c.h _sha1_sha1 _parser - +Modules/clinic/_winapi.c.h _winapi_ConnectNamedPipe _parser - +Modules/clinic/_winapi.c.h _winapi_ReadFile _parser - +Modules/clinic/_winapi.c.h _winapi_WriteFile _parser - +Modules/clinic/_winapi.c.h _winapi_GetFileType _parser - +Modules/clinic/_codecsmodule.c.h _codecs_encode _parser - +Modules/clinic/_codecsmodule.c.h _codecs_decode _parser - +Modules/clinic/_cursesmodule.c.h _curses_setupterm _parser - +Modules/clinic/itertoolsmodule.c.h itertools_groupby _parser - +Modules/clinic/itertoolsmodule.c.h itertools_combinations _parser - +Modules/clinic/itertoolsmodule.c.h itertools_combinations_with_replacement _parser - +Modules/clinic/itertoolsmodule.c.h itertools_permutations _parser - +Modules/clinic/itertoolsmodule.c.h itertools_accumulate _parser - +Modules/clinic/itertoolsmodule.c.h itertools_compress _parser - +Modules/clinic/itertoolsmodule.c.h itertools_count _parser - +Modules/clinic/binascii.c.h binascii_b2a_uu _parser - +Modules/clinic/binascii.c.h binascii_b2a_base64 _parser - +Modules/clinic/binascii.c.h binascii_b2a_hex _parser - +Modules/clinic/binascii.c.h binascii_hexlify _parser - +Modules/clinic/binascii.c.h binascii_a2b_qp _parser - +Modules/clinic/binascii.c.h binascii_b2a_qp _parser - +Objects/clinic/enumobject.c.h enum_new _parser - +Objects/clinic/bytearrayobject.c.h bytearray___init__ _parser - +Objects/clinic/bytearrayobject.c.h bytearray_translate _parser - +Objects/clinic/bytearrayobject.c.h bytearray_split _parser - +Objects/clinic/bytearrayobject.c.h bytearray_rsplit _parser - +Objects/clinic/bytearrayobject.c.h bytearray_decode _parser - +Objects/clinic/bytearrayobject.c.h bytearray_splitlines _parser - +Objects/clinic/bytearrayobject.c.h bytearray_hex _parser - +Objects/clinic/descrobject.c.h mappingproxy_new _parser - +Objects/clinic/descrobject.c.h property_init _parser - +Objects/clinic/longobject.c.h long_new _parser - +Objects/clinic/longobject.c.h int_to_bytes _parser - +Objects/clinic/longobject.c.h int_from_bytes _parser - +Objects/clinic/moduleobject.c.h module___init__ _parser - +Objects/clinic/structseq.c.h structseq_new _parser - +Objects/clinic/memoryobject.c.h memoryview _parser - +Objects/clinic/memoryobject.c.h memoryview_cast _parser - +Objects/clinic/memoryobject.c.h memoryview_tobytes _parser - +Objects/clinic/memoryobject.c.h memoryview_hex _parser - +Objects/clinic/listobject.c.h list_sort _parser - +Objects/clinic/odictobject.c.h OrderedDict_fromkeys _parser - +Objects/clinic/odictobject.c.h OrderedDict_setdefault _parser - +Objects/clinic/odictobject.c.h OrderedDict_pop _parser - +Objects/clinic/odictobject.c.h OrderedDict_popitem _parser - +Objects/clinic/odictobject.c.h OrderedDict_move_to_end _parser - +Objects/clinic/complexobject.c.h complex_new _parser - +Objects/clinic/unicodeobject.c.h unicode_encode _parser - +Objects/clinic/unicodeobject.c.h unicode_expandtabs _parser - +Objects/clinic/unicodeobject.c.h unicode_split _parser - +Objects/clinic/unicodeobject.c.h unicode_rsplit _parser - +Objects/clinic/unicodeobject.c.h unicode_splitlines _parser - +Objects/clinic/unicodeobject.c.h unicode_new _parser - +Objects/clinic/bytesobject.c.h bytes_split _parser - +Objects/clinic/bytesobject.c.h bytes_rsplit _parser - +Objects/clinic/bytesobject.c.h bytes_translate _parser - +Objects/clinic/bytesobject.c.h bytes_decode _parser - +Objects/clinic/bytesobject.c.h bytes_splitlines _parser - +Objects/clinic/bytesobject.c.h bytes_hex _parser - +Objects/clinic/bytesobject.c.h bytes_new _parser - +Objects/clinic/funcobject.c.h func_new _parser - +Objects/clinic/codeobject.c.h code_replace _parser - +Python/clinic/traceback.c.h tb_new _parser - +Python/clinic/bltinmodule.c.h builtin_compile _parser - +Python/clinic/bltinmodule.c.h builtin_pow _parser - +Python/clinic/bltinmodule.c.h builtin_round _parser - +Python/clinic/bltinmodule.c.h builtin_sum _parser - +Python/clinic/import.c.h _imp_source_hash _parser - +Python/clinic/sysmodule.c.h sys_addaudithook _parser - +Python/clinic/sysmodule.c.h sys_set_coroutine_origin_tracking_depth _parser - +Python/clinic/_warnings.c.h warnings_warn _parser - + +#----------------------- +# other vars that are actually constant +# [] + +Modules/_csv.c - quote_styles - +Modules/_ctypes/cfield.c - ffi_type_void - +Modules/_ctypes/cfield.c - ffi_type_uint8 - +Modules/_ctypes/cfield.c - ffi_type_sint8 - +Modules/_ctypes/cfield.c - ffi_type_uint16 - +Modules/_ctypes/cfield.c - ffi_type_sint16 - +Modules/_ctypes/cfield.c - ffi_type_uint32 - +Modules/_ctypes/cfield.c - ffi_type_sint32 - +Modules/_ctypes/cfield.c - ffi_type_uint64 - +Modules/_ctypes/cfield.c - ffi_type_sint64 - +Modules/_ctypes/cfield.c - ffi_type_float - +Modules/_ctypes/cfield.c - ffi_type_double - +Modules/_ctypes/cfield.c - ffi_type_longdouble - +Modules/_ctypes/cfield.c - ffi_type_pointer - +Modules/_datetimemodule.c - epoch - +Modules/_datetimemodule.c - max_fold_seconds - +Modules/_datetimemodule.c datetime_isoformat specs - +Modules/_datetimemodule.c time_isoformat specs - +Modules/_decimal/_decimal.c - cond_map - +Modules/_decimal/_decimal.c - dec_signal_string - +Modules/_decimal/_decimal.c - dflt_ctx - +Modules/_decimal/_decimal.c - int_constants - +Modules/_decimal/_decimal.c - invalid_rounding_err - +Modules/_decimal/_decimal.c - invalid_signals_err - +Modules/_decimal/_decimal.c - signal_map - +Modules/_decimal/_decimal.c - ssize_constants - +Modules/_elementtree.c - ExpatMemoryHandler - +Modules/_io/textio.c - encodefuncs - +Modules/_localemodule.c - langinfo_constants - +Modules/_sre.c pattern_repr flag_names - +Modules/_struct.c - bigendian_table - +Modules/_struct.c - lilendian_table - +Modules/_tkinter.c - state_key - +Modules/_xxsubinterpretersmodule.c - _channelid_end_send - +Modules/_xxsubinterpretersmodule.c - _channelid_end_recv - +Modules/arraymodule.c - descriptors - +Modules/arraymodule.c - emptybuf - +Modules/cjkcodecs/cjkcodecs.h - __methods - +Modules/cmathmodule.c - acos_special_values - +Modules/cmathmodule.c - acosh_special_values - +Modules/cmathmodule.c - asinh_special_values - +Modules/cmathmodule.c - atanh_special_values - +Modules/cmathmodule.c - cosh_special_values - +Modules/cmathmodule.c - exp_special_values - +Modules/cmathmodule.c - log_special_values - +Modules/cmathmodule.c - sinh_special_values - +Modules/cmathmodule.c - sqrt_special_values - +Modules/cmathmodule.c - tanh_special_values - +Modules/cmathmodule.c - rect_special_values - +Modules/config.c - _PyImport_Inittab - +Modules/faulthandler.c - faulthandler_handlers - +Modules/getnameinfo.c - gni_afdl - +Modules/ossaudiodev.c - control_labels - +Modules/ossaudiodev.c - control_names - +Modules/nismodule.c - aliases - +Modules/nismodule.c - TIMEOUT - +Modules/posixmodule.c - posix_constants_pathconf - +Modules/posixmodule.c - posix_constants_confstr - +Modules/posixmodule.c - posix_constants_sysconf - +Modules/pyexpat.c - ExpatMemoryHandler - +Modules/pyexpat.c - handler_info - +Modules/termios.c - termios_constants - +Modules/timemodule.c init_timezone YEAR - +Objects/bytearrayobject.c - _PyByteArray_empty_string - +Objects/complexobject.c - c_1 - +Objects/genobject.c - NON_INIT_CORO_MSG - +Objects/genobject.c - ASYNC_GEN_IGNORED_EXIT_MSG - +Objects/longobject.c - _PyLong_DigitValue - +Objects/object.c - _Py_abstract_hack - +Objects/object.c - _Py_SwappedOp - +Objects/obmalloc.c - _PyMem - +Objects/obmalloc.c - _PyMem_Debug - +Objects/obmalloc.c - _PyMem_Raw - +Objects/obmalloc.c - _PyObject - +Objects/obmalloc.c - usedpools - +Objects/unicodeobject.c unicode_decode_call_errorhandler_wchar argparse - +Objects/unicodeobject.c unicode_decode_call_errorhandler_writer argparse - +Objects/unicodeobject.c unicode_encode_call_errorhandler argparse - +Objects/unicodeobject.c unicode_translate_call_errorhandler argparse - +Objects/unicodeobject.c - stripfuncnames - +Objects/unicodeobject.c - utf7_category - +Parser/parser.c - reserved_keywords - +Parser/tokenizer.c - type_comment_prefix - +Python/opcode_targets.h - opcode_targets - + + +################################## +# temporary whitelist - globals to fix + +# These are all variables that we will be making non-global. + +#----------------------- +# runtime static types +# [] + +Objects/floatobject.c - FloatInfoType - +Objects/floatobject.c - PyFloat_Type - +Objects/listobject.c - PyList_Type - +Objects/listobject.c - PyListIter_Type - +Objects/listobject.c - PyListRevIter_Type - +Objects/setobject.c - _PySetDummy_Type - +Objects/setobject.c - PySetIter_Type - +Objects/setobject.c - PySet_Type - +Objects/setobject.c - PyFrozenSet_Type - +Objects/genobject.c - PyGen_Type - +Objects/genobject.c - PyCoro_Type - +Objects/genobject.c - _PyCoroWrapper_Type - +Objects/genobject.c - PyAsyncGen_Type - +Objects/genobject.c - _PyAsyncGenASend_Type - +Objects/genobject.c - _PyAsyncGenWrappedValue_Type - +Objects/genobject.c - _PyAsyncGenAThrow_Type - +Objects/classobject.c - PyMethod_Type - +Objects/classobject.c - PyInstanceMethod_Type - +Objects/complexobject.c - PyComplex_Type - +Objects/sliceobject.c - PyEllipsis_Type - +Objects/sliceobject.c - PySlice_Type - +Objects/bytesobject.c - PyBytes_Type - +Objects/bytesobject.c - PyBytesIter_Type - +Objects/descrobject.c - PyMethodDescr_Type - +Objects/descrobject.c - PyClassMethodDescr_Type - +Objects/descrobject.c - PyMemberDescr_Type - +Objects/descrobject.c - PyGetSetDescr_Type - +Objects/descrobject.c - PyWrapperDescr_Type - +Objects/descrobject.c - _PyMethodWrapper_Type - +Objects/descrobject.c - PyDictProxy_Type - +Objects/descrobject.c - PyProperty_Type - +Objects/unicodeobject.c - EncodingMapType - +Objects/unicodeobject.c - PyUnicode_Type - +Objects/unicodeobject.c - PyUnicodeIter_Type - +Objects/unionobject.c - _Py_UnionType - +Objects/moduleobject.c - PyModuleDef_Type - +Objects/moduleobject.c - PyModule_Type - +Objects/capsule.c - PyCapsule_Type - +Objects/methodobject.c - PyCFunction_Type - +Objects/methodobject.c - PyCMethod_Type - +Objects/bytearrayobject.c - PyByteArray_Type - +Objects/bytearrayobject.c - PyByteArrayIter_Type - +Objects/interpreteridobject.c - _PyInterpreterID_Type - +Objects/enumobject.c - PyEnum_Type - +Objects/enumobject.c - PyReversed_Type - +Objects/picklebufobject.c - PyPickleBuffer_Type - +Objects/object.c - _PyNone_Type - +Objects/object.c - _PyNotImplemented_Type - +Objects/fileobject.c - PyStdPrinter_Type - +Objects/weakrefobject.c - _PyWeakref_RefType - +Objects/weakrefobject.c - _PyWeakref_ProxyType - +Objects/weakrefobject.c - _PyWeakref_CallableProxyType - +Objects/genericaliasobject.c - Py_GenericAliasType - +Objects/rangeobject.c - PyRange_Type - +Objects/rangeobject.c - PyRangeIter_Type - +Objects/rangeobject.c - PyLongRangeIter_Type - +Objects/namespaceobject.c - _PyNamespace_Type - +Objects/iterobject.c - PySeqIter_Type - +Objects/iterobject.c - PyCallIter_Type - +Objects/boolobject.c - PyBool_Type - +Objects/frameobject.c - PyFrame_Type - +Objects/longobject.c - Int_InfoType - +Objects/longobject.c - PyLong_Type - +Objects/funcobject.c - PyFunction_Type - +Objects/funcobject.c - PyClassMethod_Type - +Objects/funcobject.c - PyStaticMethod_Type - +Objects/typeobject.c - PyType_Type - +Objects/typeobject.c - PyBaseObject_Type - +Objects/typeobject.c - PySuper_Type - +Objects/cellobject.c - PyCell_Type - +Objects/odictobject.c - PyODict_Type - +Objects/odictobject.c - PyODictIter_Type - +Objects/odictobject.c - PyODictKeys_Type - +Objects/odictobject.c - PyODictItems_Type - +Objects/odictobject.c - PyODictValues_Type - +Objects/dictobject.c - PyDict_Type - +Objects/dictobject.c - PyDictIterKey_Type - +Objects/dictobject.c - PyDictIterValue_Type - +Objects/dictobject.c - PyDictIterItem_Type - +Objects/dictobject.c - PyDictRevIterKey_Type - +Objects/dictobject.c - PyDictRevIterItem_Type - +Objects/dictobject.c - PyDictRevIterValue_Type - +Objects/dictobject.c - PyDictKeys_Type - +Objects/dictobject.c - PyDictItems_Type - +Objects/dictobject.c - PyDictValues_Type - +Objects/memoryobject.c - PyMemoryIter_Type - +Objects/memoryobject.c - _PyManagedBuffer_Type - +Objects/memoryobject.c - PyMemoryView_Type - +Objects/tupleobject.c - PyTuple_Type - +Objects/tupleobject.c - PyTupleIter_Type - +Objects/codeobject.c - PyCode_Type - + +#----------------------- +# builtin exception types +# [] + +Objects/exceptions.c - _PyExc_BaseException - +Objects/exceptions.c - _PyExc_UnicodeEncodeError - +Objects/exceptions.c - _PyExc_UnicodeDecodeError - +Objects/exceptions.c - _PyExc_UnicodeTranslateError - +Objects/exceptions.c - _PyExc_MemoryError - +Objects/exceptions.c - _PyExc_Exception - +Objects/exceptions.c - _PyExc_TypeError - +Objects/exceptions.c - _PyExc_StopAsyncIteration - +Objects/exceptions.c - _PyExc_StopIteration - +Objects/exceptions.c - _PyExc_GeneratorExit - +Objects/exceptions.c - _PyExc_SystemExit - +Objects/exceptions.c - _PyExc_KeyboardInterrupt - +Objects/exceptions.c - _PyExc_ImportError - +Objects/exceptions.c - _PyExc_ModuleNotFoundError - +Objects/exceptions.c - _PyExc_OSError - +Objects/exceptions.c - _PyExc_BlockingIOError - +Objects/exceptions.c - _PyExc_ConnectionError - +Objects/exceptions.c - _PyExc_ChildProcessError - +Objects/exceptions.c - _PyExc_BrokenPipeError - +Objects/exceptions.c - _PyExc_ConnectionAbortedError - +Objects/exceptions.c - _PyExc_ConnectionRefusedError - +Objects/exceptions.c - _PyExc_ConnectionResetError - +Objects/exceptions.c - _PyExc_FileExistsError - +Objects/exceptions.c - _PyExc_FileNotFoundError - +Objects/exceptions.c - _PyExc_IsADirectoryError - +Objects/exceptions.c - _PyExc_NotADirectoryError - +Objects/exceptions.c - _PyExc_InterruptedError - +Objects/exceptions.c - _PyExc_PermissionError - +Objects/exceptions.c - _PyExc_ProcessLookupError - +Objects/exceptions.c - _PyExc_TimeoutError - +Objects/exceptions.c - _PyExc_EOFError - +Objects/exceptions.c - _PyExc_RuntimeError - +Objects/exceptions.c - _PyExc_RecursionError - +Objects/exceptions.c - _PyExc_NotImplementedError - +Objects/exceptions.c - _PyExc_NameError - +Objects/exceptions.c - _PyExc_UnboundLocalError - +Objects/exceptions.c - _PyExc_AttributeError - +Objects/exceptions.c - _PyExc_SyntaxError - +Objects/exceptions.c - _PyExc_IndentationError - +Objects/exceptions.c - _PyExc_TabError - +Objects/exceptions.c - _PyExc_LookupError - +Objects/exceptions.c - _PyExc_IndexError - +Objects/exceptions.c - _PyExc_KeyError - +Objects/exceptions.c - _PyExc_ValueError - +Objects/exceptions.c - _PyExc_UnicodeError - +Objects/exceptions.c - _PyExc_AssertionError - +Objects/exceptions.c - _PyExc_ArithmeticError - +Objects/exceptions.c - _PyExc_FloatingPointError - +Objects/exceptions.c - _PyExc_OverflowError - +Objects/exceptions.c - _PyExc_ZeroDivisionError - +Objects/exceptions.c - _PyExc_SystemError - +Objects/exceptions.c - _PyExc_ReferenceError - +Objects/exceptions.c - _PyExc_BufferError - +Objects/exceptions.c - _PyExc_Warning - +Objects/exceptions.c - _PyExc_UserWarning - +Objects/exceptions.c - _PyExc_DeprecationWarning - +Objects/exceptions.c - _PyExc_PendingDeprecationWarning - +Objects/exceptions.c - _PyExc_SyntaxWarning - +Objects/exceptions.c - _PyExc_RuntimeWarning - +Objects/exceptions.c - _PyExc_FutureWarning - +Objects/exceptions.c - _PyExc_ImportWarning - +Objects/exceptions.c - _PyExc_UnicodeWarning - +Objects/exceptions.c - _PyExc_BytesWarning - +Objects/exceptions.c - _PyExc_ResourceWarning - +Objects/exceptions.c - PyExc_EnvironmentError - +Objects/exceptions.c - PyExc_IOError - +Objects/exceptions.c - PyExc_BaseException - +Objects/exceptions.c - PyExc_Exception - +Objects/exceptions.c - PyExc_TypeError - +Objects/exceptions.c - PyExc_StopAsyncIteration - +Objects/exceptions.c - PyExc_StopIteration - +Objects/exceptions.c - PyExc_GeneratorExit - +Objects/exceptions.c - PyExc_SystemExit - +Objects/exceptions.c - PyExc_KeyboardInterrupt - +Objects/exceptions.c - PyExc_ImportError - +Objects/exceptions.c - PyExc_ModuleNotFoundError - +Objects/exceptions.c - PyExc_OSError - +Objects/exceptions.c - PyExc_BlockingIOError - +Objects/exceptions.c - PyExc_ConnectionError - +Objects/exceptions.c - PyExc_ChildProcessError - +Objects/exceptions.c - PyExc_BrokenPipeError - +Objects/exceptions.c - PyExc_ConnectionAbortedError - +Objects/exceptions.c - PyExc_ConnectionRefusedError - +Objects/exceptions.c - PyExc_ConnectionResetError - +Objects/exceptions.c - PyExc_FileExistsError - +Objects/exceptions.c - PyExc_FileNotFoundError - +Objects/exceptions.c - PyExc_IsADirectoryError - +Objects/exceptions.c - PyExc_NotADirectoryError - +Objects/exceptions.c - PyExc_InterruptedError - +Objects/exceptions.c - PyExc_PermissionError - +Objects/exceptions.c - PyExc_ProcessLookupError - +Objects/exceptions.c - PyExc_TimeoutError - +Objects/exceptions.c - PyExc_EOFError - +Objects/exceptions.c - PyExc_RuntimeError - +Objects/exceptions.c - PyExc_RecursionError - +Objects/exceptions.c - PyExc_NotImplementedError - +Objects/exceptions.c - PyExc_NameError - +Objects/exceptions.c - PyExc_UnboundLocalError - +Objects/exceptions.c - PyExc_AttributeError - +Objects/exceptions.c - PyExc_SyntaxError - +Objects/exceptions.c - PyExc_IndentationError - +Objects/exceptions.c - PyExc_TabError - +Objects/exceptions.c - PyExc_LookupError - +Objects/exceptions.c - PyExc_IndexError - +Objects/exceptions.c - PyExc_KeyError - +Objects/exceptions.c - PyExc_ValueError - +Objects/exceptions.c - PyExc_UnicodeError - +Objects/exceptions.c - PyExc_UnicodeEncodeError - +Objects/exceptions.c - PyExc_UnicodeDecodeError - +Objects/exceptions.c - PyExc_UnicodeTranslateError - +Objects/exceptions.c - PyExc_AssertionError - +Objects/exceptions.c - PyExc_ArithmeticError - +Objects/exceptions.c - PyExc_FloatingPointError - +Objects/exceptions.c - PyExc_OverflowError - +Objects/exceptions.c - PyExc_ZeroDivisionError - +Objects/exceptions.c - PyExc_SystemError - +Objects/exceptions.c - PyExc_ReferenceError - +Objects/exceptions.c - PyExc_MemoryError - +Objects/exceptions.c - PyExc_BufferError - +Objects/exceptions.c - PyExc_Warning - +Objects/exceptions.c - PyExc_UserWarning - +Objects/exceptions.c - PyExc_DeprecationWarning - +Objects/exceptions.c - PyExc_PendingDeprecationWarning - +Objects/exceptions.c - PyExc_SyntaxWarning - +Objects/exceptions.c - PyExc_RuntimeWarning - +Objects/exceptions.c - PyExc_FutureWarning - +Objects/exceptions.c - PyExc_ImportWarning - +Objects/exceptions.c - PyExc_UnicodeWarning - +Objects/exceptions.c - PyExc_BytesWarning - +Objects/exceptions.c - PyExc_ResourceWarning - + +#----------------------- +# singletons +# [] + +Objects/boolobject.c - _Py_FalseStruct - +Objects/boolobject.c - _Py_TrueStruct - +Objects/dictobject.c - empty_keys_struct - +Objects/dictobject.c - empty_values - +Objects/object.c - _Py_NoneStruct - +Objects/object.c - _Py_NotImplementedStruct - +Objects/setobject.c - _dummy_struct - +Objects/setobject.c - _PySet_Dummy - +Objects/sliceobject.c - _Py_EllipsisObject - + +#----------------------- +# runtime initialized once - cached PyUnicode +# [] + +# Py_IDENTIFIER (global) [] +Objects/classobject.c - PyId___name__ - +Objects/classobject.c - PyId___qualname__ - +Objects/structseq.c - PyId_n_sequence_fields - +Objects/structseq.c - PyId_n_fields - +Objects/structseq.c - PyId_n_unnamed_fields - +Objects/bytesobject.c - PyId___bytes__ - +Objects/descrobject.c - PyId_getattr - +Objects/moduleobject.c - PyId___doc__ - +Objects/moduleobject.c - PyId___name__ - +Objects/moduleobject.c - PyId___spec__ - +Objects/object.c - PyId_Py_Repr - +Objects/object.c - PyId___bytes__ - +Objects/object.c - PyId___dir__ - +Objects/object.c - PyId___isabstractmethod__ - +Objects/fileobject.c - PyId_open - +Objects/rangeobject.c - PyId_iter - +Objects/iterobject.c - PyId_iter - +Objects/frameobject.c - PyId___builtins__ - +Objects/longobject.c - PyId_little - +Objects/longobject.c - PyId_big - +Objects/typeobject.c - PyId___abstractmethods__ - +Objects/typeobject.c - PyId___class__ - +Objects/typeobject.c - PyId___class_getitem__ - +Objects/typeobject.c - PyId___delitem__ - +Objects/typeobject.c - PyId___dict__ - +Objects/typeobject.c - PyId___doc__ - +Objects/typeobject.c - PyId___getattribute__ - +Objects/typeobject.c - PyId___getitem__ - +Objects/typeobject.c - PyId___hash__ - +Objects/typeobject.c - PyId___init_subclass__ - +Objects/typeobject.c - PyId___len__ - +Objects/typeobject.c - PyId___module__ - +Objects/typeobject.c - PyId___name__ - +Objects/typeobject.c - PyId___new__ - +Objects/typeobject.c - PyId___set_name__ - +Objects/typeobject.c - PyId___setitem__ - +Objects/typeobject.c - PyId_builtins - +Objects/typeobject.c - PyId_mro - +Objects/odictobject.c - PyId_items - + +# Py_IDENTIFIER (local) [] +Objects/listobject.c listiter_reduce_general PyId_iter - +Objects/listobject.c listiter_reduce_general PyId_reversed - +Objects/setobject.c setiter_reduce PyId_iter - +Objects/setobject.c set_reduce PyId___dict__ - +Objects/abstract.c PyObject_LengthHint PyId___length_hint__ - +Objects/abstract.c PyObject_GetItem PyId___class_getitem__ - +Objects/abstract.c PyObject_Format PyId___format__ - +Objects/abstract.c PyNumber_Long PyId___trunc__ - +Objects/abstract.c PyMapping_Keys PyId_keys - +Objects/abstract.c PyMapping_Items PyId_items - +Objects/abstract.c PyMapping_Values PyId_values - +Objects/abstract.c abstract_get_bases PyId___bases__ - +Objects/abstract.c object_isinstance PyId___class__ - +Objects/abstract.c object_recursive_isinstance PyId___instancecheck__ - +Objects/abstract.c object_issubclass PyId___subclasscheck__ - +Objects/genobject.c PyIter_Send PyId_send - +Objects/genobject.c gen_close_iter PyId_close - +Objects/genobject.c _gen_throw PyId_throw - +Objects/classobject.c method_reduce PyId_getattr - +Objects/complexobject.c try_complex_special_method PyId___complex__ - +Objects/bytesobject.c striter_reduce PyId_iter - +Objects/descrobject.c calculate_qualname PyId___qualname__ - +Objects/descrobject.c mappingproxy_get PyId_get - +Objects/descrobject.c mappingproxy_keys PyId_keys - +Objects/descrobject.c mappingproxy_values PyId_values - +Objects/descrobject.c mappingproxy_items PyId_items - +Objects/descrobject.c mappingproxy_copy PyId_copy - +Objects/descrobject.c mappingproxy_reversed PyId___reversed__ - +Objects/descrobject.c property_init_impl PyId___doc__ - +Objects/unicodeobject.c unicodeiter_reduce PyId_iter - +Objects/unionobject.c union_repr_item PyId___module__ - +Objects/unionobject.c union_repr_item PyId___qualname__ - +Objects/unionobject.c union_repr_item PyId___origin__ - +Objects/unionobject.c union_repr_item PyId___args__ - +Objects/moduleobject.c module_init_dict PyId___package__ - +Objects/moduleobject.c module_init_dict PyId___loader__ - +Objects/moduleobject.c PyModule_GetFilenameObject PyId___file__ - +Objects/moduleobject.c _PyModuleSpec_IsInitializing PyId__initializing - +Objects/moduleobject.c module_getattro PyId___getattr__ - +Objects/moduleobject.c module_dir PyId___dict__ - +Objects/moduleobject.c module_dir PyId___dir__ - +Objects/methodobject.c meth_reduce PyId_getattr - +Objects/methodobject.c meth_get__qualname__ PyId___qualname__ - +Objects/bytearrayobject.c _common_reduce PyId___dict__ - +Objects/bytearrayobject.c bytearrayiter_reduce PyId_iter - +Objects/enumobject.c reversed_new_impl PyId___reversed__ - +Objects/object.c _PyObject_FunctionStr PyId___module__ - +Objects/object.c _PyObject_FunctionStr PyId___qualname__ - +Objects/object.c _PyObject_FunctionStr PyId_builtins - +Objects/fileobject.c PyFile_GetLine PyId_readline - +Objects/fileobject.c PyFile_WriteObject PyId_write - +Objects/fileobject.c PyObject_AsFileDescriptor PyId_fileno - +Objects/weakrefobject.c weakref_repr PyId___name__ - +Objects/weakrefobject.c proxy_bytes PyId___bytes__ - +Objects/weakrefobject.c proxy_reversed PyId___reversed__ - +Objects/genericaliasobject.c ga_repr_item PyId___module__ - +Objects/genericaliasobject.c ga_repr_item PyId___qualname__ - +Objects/genericaliasobject.c ga_repr_item PyId___origin__ - +Objects/genericaliasobject.c ga_repr_item PyId___args__ - +Objects/genericaliasobject.c make_parameters PyId___parameters__ - +Objects/genericaliasobject.c subs_tvars PyId___parameters__ - +Objects/exceptions.c ImportError_getstate PyId_name - +Objects/exceptions.c ImportError_getstate PyId_path - +Objects/typeobject.c type_new PyId___qualname__ - +Objects/typeobject.c type_new PyId___slots__ - +Objects/typeobject.c type_new PyId___classcell__ - +Objects/typeobject.c type_new PyId___mro_entries__ - +Objects/typeobject.c merge_class_dict PyId___bases__ - +Objects/typeobject.c import_copyreg PyId_copyreg - +Objects/typeobject.c _PyType_GetSlotNames PyId___slotnames__ - +Objects/typeobject.c _PyType_GetSlotNames PyId__slotnames - +Objects/typeobject.c _PyObject_GetState PyId___getstate__ - +Objects/typeobject.c _PyObject_GetNewArguments PyId___getnewargs_ex__ - +Objects/typeobject.c _PyObject_GetNewArguments PyId___getnewargs__ - +Objects/typeobject.c _PyObject_GetItemsIter PyId_items - +Objects/typeobject.c reduce_newobj PyId___newobj__ - +Objects/typeobject.c reduce_newobj PyId___newobj_ex__ - +Objects/typeobject.c object___reduce_ex___impl PyId___reduce__ - +Objects/typeobject.c overrides_hash PyId___eq__ - +Objects/typeobject.c slot_sq_contains PyId___contains__ - +Objects/typeobject.c slot_nb_power PyId___pow__ - +Objects/typeobject.c slot_nb_bool PyId___bool__ - +Objects/typeobject.c slot_nb_index PyId___index__ - +Objects/typeobject.c slot_nb_inplace_power PyId___ipow__ - +Objects/typeobject.c slot_tp_repr PyId___repr__ - +Objects/typeobject.c slot_tp_call PyId___call__ - +Objects/typeobject.c slot_tp_getattr_hook PyId___getattr__ - +Objects/typeobject.c slot_tp_setattro PyId___delattr__ - +Objects/typeobject.c slot_tp_setattro PyId___setattr__ - +Objects/typeobject.c slot_tp_iter PyId___iter__ - +Objects/typeobject.c slot_tp_iternext PyId___next__ - +Objects/typeobject.c slot_tp_descr_get PyId___get__ - +Objects/typeobject.c slot_tp_descr_set PyId___delete__ - +Objects/typeobject.c slot_tp_descr_set PyId___set__ - +Objects/typeobject.c slot_tp_init PyId___init__ - +Objects/typeobject.c slot_tp_finalize PyId___del__ - +Objects/typeobject.c slot_am_await PyId___await__ - +Objects/typeobject.c slot_am_aiter PyId___aiter__ - +Objects/typeobject.c slot_am_anext PyId___anext__ - +Objects/odictobject.c odict_reduce PyId___dict__ - +Objects/odictobject.c odictiter_reduce PyId_iter - +Objects/odictobject.c mutablemapping_update_arg PyId_keys - +Objects/dictobject.c dict_subscript PyId___missing__ - +Objects/dictobject.c dict_update_arg PyId_keys - +Objects/dictobject.c dictiter_reduce PyId_iter - +Objects/dictobject.c dictviews_sub PyId_difference_update - +Objects/dictobject.c _PyDictView_Intersect PyId_intersection - +Objects/dictobject.c dictitems_xor PyId_items - +Objects/dictobject.c dictviews_xor PyId_symmetric_difference_update - +Objects/tupleobject.c tupleiter_reduce PyId_iter - +Parser/tokenizer.c fp_setreadl PyId_open - +Parser/tokenizer.c fp_setreadl PyId_readline - + +# _Py_static_string [] +Objects/typeobject.c - name_op - +Objects/typeobject.c object_new comma_id - +Objects/typeobject.c slot_mp_subscript id - +Objects/typeobject.c slot_nb_add op_id - +Objects/typeobject.c slot_nb_add rop_id - +Objects/typeobject.c slot_nb_subtract op_id - +Objects/typeobject.c slot_nb_subtract rop_id - +Objects/typeobject.c slot_nb_multiply op_id - +Objects/typeobject.c slot_nb_multiply rop_id - +Objects/typeobject.c slot_nb_matrix_multiply op_id - +Objects/typeobject.c slot_nb_matrix_multiply rop_id - +Objects/typeobject.c slot_nb_remainder op_id - +Objects/typeobject.c slot_nb_remainder rop_id - +Objects/typeobject.c slot_nb_divmod op_id - +Objects/typeobject.c slot_nb_divmod rop_id - +Objects/typeobject.c slot_nb_power_binary op_id - +Objects/typeobject.c slot_nb_power_binary rop_id - +Objects/typeobject.c slot_nb_negative id - +Objects/typeobject.c slot_nb_positive id - +Objects/typeobject.c slot_nb_absolute id - +Objects/typeobject.c slot_nb_invert id - +Objects/typeobject.c slot_nb_lshift op_id - +Objects/typeobject.c slot_nb_lshift rop_id - +Objects/typeobject.c slot_nb_rshift op_id - +Objects/typeobject.c slot_nb_rshift rop_id - +Objects/typeobject.c slot_nb_and op_id - +Objects/typeobject.c slot_nb_and rop_id - +Objects/typeobject.c slot_nb_xor op_id - +Objects/typeobject.c slot_nb_xor rop_id - +Objects/typeobject.c slot_nb_or op_id - +Objects/typeobject.c slot_nb_or rop_id - +Objects/typeobject.c slot_nb_int id - +Objects/typeobject.c slot_nb_float id - +Objects/typeobject.c slot_nb_inplace_add id - +Objects/typeobject.c slot_nb_inplace_subtract id - +Objects/typeobject.c slot_nb_inplace_multiply id - +Objects/typeobject.c slot_nb_inplace_matrix_multiply id - +Objects/typeobject.c slot_nb_inplace_remainder id - +Objects/typeobject.c slot_nb_inplace_lshift id - +Objects/typeobject.c slot_nb_inplace_rshift id - +Objects/typeobject.c slot_nb_inplace_and id - +Objects/typeobject.c slot_nb_inplace_xor id - +Objects/typeobject.c slot_nb_inplace_or id - +Objects/typeobject.c slot_nb_floor_divide op_id - +Objects/typeobject.c slot_nb_floor_divide rop_id - +Objects/typeobject.c slot_nb_true_divide op_id - +Objects/typeobject.c slot_nb_true_divide rop_id - +Objects/typeobject.c slot_nb_inplace_floor_divide id - +Objects/typeobject.c slot_nb_inplace_true_divide id - +Objects/typeobject.c slot_tp_str id - +Python/compile.c compiler_set_qualname dot - +Python/compile.c compiler_set_qualname dot_locals - + +# manually cached PyUnicodeOjbect [] +Objects/boolobject.c - false_str - +Objects/boolobject.c - true_str - +Objects/classobject.c method_get_doc docstr - +Objects/classobject.c instancemethod_get_doc docstr - +Objects/codeobject.c PyCode_NewEmpty emptystring - +Objects/exceptions.c _check_for_legacy_statements print_prefix - +Objects/exceptions.c _check_for_legacy_statements exec_prefix - +Objects/funcobject.c PyFunction_NewWithQualName __name__ - +Objects/listobject.c - indexerr - +Objects/typeobject.c object___reduce_ex___impl objreduce - +# XXX This should have been found by the analyzer but wasn't: +Python/ast_unparse.c - _str_close_br - +# XXX This should have been found by the analyzer but wasn't: +Python/ast_unparse.c - _str_dbl_close_br - +# XXX This should have been found by the analyzer but wasn't: +Python/ast_unparse.c - _str_dbl_open_br - +# XXX This should have been found by the analyzer but wasn't: +Python/ast_unparse.c - _str_inf - +# XXX This should have been found by the analyzer but wasn't: +Python/ast_unparse.c - _str_open_br - +# XXX This should have been found by the analyzer but wasn't: +Python/ast_unparse.c - _str_replace_inf - +# XXX This should have been found by the analyzer but wasn't: +Python/compile.c - __annotations__ - +# XXX This should have been found by the analyzer but wasn't: +Python/compile.c - __doc__ - +# XXX This should have been found by the analyzer but wasn't: +Python/compile.c compiler_dictcomp name - +# XXX This should have been found by the analyzer but wasn't: +Python/compile.c compiler_from_import empty_string - +# XXX This should have been found by the analyzer but wasn't: +Python/compile.c compiler_genexp name - +# XXX This should have been found by the analyzer but wasn't: +Python/compile.c compiler_lambda name - +# XXX This should have been found by the analyzer but wasn't: +Python/compile.c compiler_listcomp name - +# XXX This should have been found by the analyzer but wasn't: +Python/compile.c compiler_setcomp name - +# XXX This should have been found by the analyzer but wasn't: +Python/compile.c compiler_visit_annotations return_str - +# XXX This should have been found by the analyzer but wasn't: +Python/import.c PyImport_Import builtins_str - +# XXX This should have been found by the analyzer but wasn't: +Python/import.c PyImport_Import import_str - +# XXX This should have been found by the analyzer but wasn't: +Python/sysmodule.c - whatstrings - +# XXX This should have been found by the analyzer but wasn't: +Python/sysmodule.c sys_displayhook newline - +# XXX This should have been found by the analyzer but wasn't: +Python/_warnings.c is_internal_frame bootstrap_string - +# XXX This should have been found by the analyzer but wasn't: +Python/_warnings.c is_internal_frame importlib_string - + +#----------------------- +# runtime initialized once - other PyObject +# [] + +# cache [] +Objects/unicodeobject.c - interned - +Objects/unicodeobject.c - static_strings - +Objects/typeobject.c - method_cache - + +# other [] +# XXX This should have been found by the analyzer but wasn't: +Python/context.c - _token_missing - +# XXX This should have been found by the analyzer but wasn't: +Python/hamt.c - _empty_bitmap_node - +# XXX This should have been found by the analyzer but wasn't: +Python/hamt.c - _empty_hamt - +# XXX This should have been found by the analyzer but wasn't: +Python/import.c PyImport_Import silly_list - + +#----------------------- +# runtime initialized once - non-PyObject +# [] + +# during init [] +Parser/parser.c - Py_DebugFlag - + +# other [] +Objects/codeobject.c PyCode_NewEmpty nulltuple - +Objects/longobject.c PyLong_FromString log_base_BASE - +Objects/longobject.c PyLong_FromString convwidth_base - +Objects/longobject.c PyLong_FromString convmultmax_base - +Objects/typeobject.c - slotdefs - +Objects/typeobject.c - slotdefs_initialized - +Objects/unicodeobject.c - bloom_linebreak - +Objects/unicodeobject.c - ucnhash_capi - +Parser/pegen.c _PyPegen_dummy_name cache - +# XXX This should have been found by the analyzer but wasn't: +Python/import.c - import_lock - +# XXX This should have been found by the analyzer but wasn't: +Python/import.c import_find_and_load header - + +#----------------------- +# runtime state + +# (look at the bottome of the file) + +#----------------------- +# modules +# [119] + +Modules/pwdmodule.c - pwdmodule - +Modules/grpmodule.c - grpmodule - +Modules/_ssl.c - PySocketModule - +Modules/_ssl.c - _sslmodule - +Modules/_struct.c - _structmodule - +Modules/_sre.c - sremodule - +Modules/timemodule.c - timemodule - +Modules/xxmodule.c - xxmodule - +Modules/itertoolsmodule.c - itertoolsmodule - +Modules/_tkinter.c - _tkintermodule - +Modules/gcmodule.c - gcmodule - +Modules/mmapmodule.c - mmapmodule - +Modules/errnomodule.c - errnomodule - +Modules/_gdbmmodule.c - _gdbmmodule - +Modules/xxlimited.c - xxmodule - +Modules/arraymodule.c - arraymodule - +Modules/_uuidmodule.c - uuidmodule - +Modules/_collectionsmodule.c - _collectionsmodule - +Modules/_csv.c - _csvmodule - +Modules/_json.c - jsonmodule - +Modules/zlibmodule.c - zlibmodule - +Modules/readline.c - readlinemodule - +Modules/faulthandler.c - module_def - +Modules/_codecsmodule.c - codecsmodule - +Modules/_asynciomodule.c - _asynciomodule - +Modules/signalmodule.c - signalmodule - +Modules/binascii.c - binasciimodule - +Modules/mathmodule.c - mathmodule - +Modules/_stat.c - statmodule - +Modules/_opcode.c - opcodemodule - +Modules/_operator.c - operatormodule - +Modules/_cryptmodule.c - cryptmodule - +Modules/cmathmodule.c - cmathmodule - +Modules/_lzmamodule.c - _lzmamodule - +Modules/_zoneinfo.c - zoneinfomodule - +Modules/posixmodule.c - posixmodule - +Modules/_bz2module.c - _bz2module - +Modules/_functoolsmodule.c - _functools_module - +Modules/_abc.c - _abcmodule - +Modules/_heapqmodule.c - _heapqmodule - +Modules/_bisectmodule.c - _bisectmodule - +Modules/_tracemalloc.c - module_def - +Modules/pyexpat.c - pyexpatmodule - +Modules/_randommodule.c - _randommodule - +Modules/atexitmodule.c - atexitmodule - +Modules/syslogmodule.c - syslogmodule - +Modules/_queuemodule.c - queuemodule - +Modules/_threadmodule.c - threadmodule - +Modules/_weakref.c - weakrefmodule - +Modules/spwdmodule.c - spwdmodule - +Modules/_contextvarsmodule.c - _contextvarsmodule - +Modules/_posixsubprocess.c - _posixsubprocessmodule - +Modules/_xxsubinterpretersmodule.c - interpretersmodule - +Modules/_curses_panel.c - _curses_panelmodule - +Modules/audioop.c - audioopmodule - +Modules/nismodule.c - nismodule - +Modules/_elementtree.c - elementtreemodule - +Modules/sha256module.c - _sha256module - +Modules/resource.c - resourcemodule - +Modules/symtablemodule.c - symtablemodule - +Modules/sha1module.c - _sha1module - +Modules/selectmodule.c - selectmodule - +Modules/_pickle.c - _picklemodule - +Modules/_localemodule.c - _localemodule - +Modules/unicodedata.c - unicodedata_module - +Modules/_statisticsmodule.c - statisticsmodule - +Modules/termios.c - termiosmodule - +Modules/xxsubtype.c - xxsubtypemodule - +Modules/sha512module.c - _sha512module - +Modules/_cursesmodule.c - _cursesmodule - +Modules/md5module.c - _md5module - +Modules/socketmodule.c - socketmodule - +Modules/_datetimemodule.c - datetimemodule - +Modules/_hashopenssl.c - _hashlibmodule - +Modules/fcntlmodule.c - fcntlmodule - +Modules/ossaudiodev.c - ossaudiodevmodule - +Modules/_lsprof.c - _lsprofmodule - +Modules/_blake2/blake2module.c - blake2_module - +Modules/_multiprocessing/multiprocessing.c - multiprocessing_module - +Modules/_multiprocessing/posixshmem.c - this_module - +Modules/_sqlite/module.c - _sqlite3module - +Modules/_sha3/sha3module.c - _sha3module - +Modules/cjkcodecs/multibytecodec.c - _multibytecodecmodule - +Modules/_decimal/_decimal.c - _decimal_module - +Modules/_ctypes/_ctypes.c - _ctypesmodule - +Objects/unicodeobject.c - _string_module - +Modules/_io/_iomodule.h - _PyIO_Module - +Modules/_io/_iomodule.c - _PyIO_Module - + +#----------------------- +# module static types +# [] + +Modules/arraymodule.c - Arraytype - +Modules/arraymodule.c - PyArrayIter_Type - +Modules/_asynciomodule.c - FutureType - +Modules/_asynciomodule.c - FutureIterType - +Modules/_asynciomodule.c - TaskStepMethWrapper_Type - +Modules/_asynciomodule.c - TaskType - +Modules/_asynciomodule.c - PyRunningLoopHolder_Type - +Modules/cjkcodecs/multibytecodec.c - MultibyteCodec_Type - +Modules/cjkcodecs/multibytecodec.c - MultibyteIncrementalEncoder_Type - +Modules/cjkcodecs/multibytecodec.c - MultibyteIncrementalDecoder_Type - +Modules/cjkcodecs/multibytecodec.c - MultibyteStreamReader_Type - +Modules/cjkcodecs/multibytecodec.c - MultibyteStreamWriter_Type - +Modules/_collectionsmodule.c - deque_type - +Modules/_collectionsmodule.c - dequeiter_type - +Modules/_collectionsmodule.c - dequereviter_type - +Modules/_collectionsmodule.c - defdict_type - +Modules/_collectionsmodule.c - tuplegetter_type - +Modules/_csv.c - Dialect_Type - +Modules/_csv.c - Reader_Type - +Modules/_csv.c - Writer_Type - +Modules/_ctypes/callbacks.c - PyCThunk_Type - +Modules/_ctypes/callproc.c - PyCArg_Type - +Modules/_ctypes/cfield.c - PyCField_Type - +Modules/_ctypes/_ctypes.c - DictRemover_Type - +Modules/_ctypes/_ctypes.c - StructParam_Type - +Modules/_ctypes/_ctypes.c - PyCStructType_Type - +Modules/_ctypes/_ctypes.c - UnionType_Type - +Modules/_ctypes/_ctypes.c - PyCPointerType_Type - +Modules/_ctypes/_ctypes.c - PyCArrayType_Type - +Modules/_ctypes/_ctypes.c - PyCSimpleType_Type - +Modules/_ctypes/_ctypes.c - PyCFuncPtrType_Type - +Modules/_ctypes/_ctypes.c - PyCData_Type - +Modules/_ctypes/_ctypes.c - PyCFuncPtr_Type - +Modules/_ctypes/_ctypes.c - Struct_Type - +Modules/_ctypes/_ctypes.c - Union_Type - +Modules/_ctypes/_ctypes.c - PyCArray_Type - +Modules/_ctypes/_ctypes.c - Simple_Type - +Modules/_ctypes/_ctypes.c - PyCPointer_Type - +Modules/_ctypes/_ctypes.c - PyComError_Type - +Modules/_ctypes/stgdict.c - PyCStgDict_Type - +Modules/_cursesmodule.c - PyCursesWindow_Type - +Modules/_datetimemodule.c - PyDateTime_DeltaType - +Modules/_datetimemodule.c - PyDateTime_IsoCalendarDateType - +Modules/_datetimemodule.c - PyDateTime_DateType - +Modules/_datetimemodule.c - PyDateTime_TZInfoType - +Modules/_datetimemodule.c - PyDateTime_TimeZoneType - +Modules/_datetimemodule.c - PyDateTime_TimeType - +Modules/_datetimemodule.c - PyDateTime_DateTimeType - +Modules/_decimal/_decimal.c - PyDecSignalDictMixin_Type - +Modules/_decimal/_decimal.c - PyDecContextManager_Type - +Modules/_decimal/_decimal.c - PyDec_Type - +Modules/_decimal/_decimal.c - PyDecContext_Type - +Modules/_elementtree.c - ElementIter_Type - +Modules/_elementtree.c - Element_Type - +Modules/_elementtree.c - TreeBuilder_Type - +Modules/_elementtree.c - XMLParser_Type - +Modules/_functoolsmodule.c - partial_type - +Modules/_functoolsmodule.c - keyobject_type - +Modules/_functoolsmodule.c - lru_list_elem_type - +Modules/_functoolsmodule.c - lru_cache_type - +Modules/_io/bufferedio.c - PyBufferedIOBase_Type - +Modules/_io/bufferedio.c - PyBufferedReader_Type - +Modules/_io/bufferedio.c - PyBufferedWriter_Type - +Modules/_io/bufferedio.c - PyBufferedRWPair_Type - +Modules/_io/bufferedio.c - PyBufferedRandom_Type - +Modules/_io/bytesio.c - PyBytesIO_Type - +Modules/_io/bytesio.c - _PyBytesIOBuffer_Type - +Modules/_io/fileio.c - PyFileIO_Type - +Modules/_io/iobase.c - PyIOBase_Type - +Modules/_io/iobase.c - PyRawIOBase_Type - +Modules/_io/stringio.c - PyStringIO_Type - +Modules/_io/textio.c - PyTextIOBase_Type - +Modules/_io/textio.c - PyIncrementalNewlineDecoder_Type - +Modules/_io/textio.c - PyTextIOWrapper_Type - +Modules/_io/winconsoleio.c - PyWindowsConsoleIO_Type - +Modules/itertoolsmodule.c - groupby_type - +Modules/itertoolsmodule.c - _grouper_type - +Modules/itertoolsmodule.c - teedataobject_type - +Modules/itertoolsmodule.c - tee_type - +Modules/itertoolsmodule.c - cycle_type - +Modules/itertoolsmodule.c - dropwhile_type - +Modules/itertoolsmodule.c - takewhile_type - +Modules/itertoolsmodule.c - islice_type - +Modules/itertoolsmodule.c - starmap_type - +Modules/itertoolsmodule.c - chain_type - +Modules/itertoolsmodule.c - product_type - +Modules/itertoolsmodule.c - combinations_type - +Modules/itertoolsmodule.c - cwr_type - +Modules/itertoolsmodule.c - permutations_type - +Modules/itertoolsmodule.c - accumulate_type - +Modules/itertoolsmodule.c - compress_type - +Modules/itertoolsmodule.c - filterfalse_type - +Modules/itertoolsmodule.c - count_type - +Modules/itertoolsmodule.c - repeat_type - +Modules/itertoolsmodule.c - ziplongest_type - +Modules/mmapmodule.c - mmap_object_type - +Modules/_multiprocessing/semaphore.c - _PyMp_SemLockType - +Modules/ossaudiodev.c - OSSAudioType - +Modules/ossaudiodev.c - OSSMixerType - +Modules/_pickle.c - Pdata_Type - +Modules/_pickle.c - PicklerMemoProxyType - +Modules/_pickle.c - Pickler_Type - +Modules/_pickle.c - UnpicklerMemoProxyType - +Modules/_pickle.c - Unpickler_Type - +Modules/pyexpat.c - Xmlparsetype - +Modules/_queuemodule.c - PySimpleQueueType - +Modules/socketmodule.c - sock_type - +Modules/_sre.c - Pattern_Type - +Modules/_sre.c - Match_Type - +Modules/_sre.c - Scanner_Type - +Modules/_ssl.c - PySSLSocket_Type - +Modules/_ssl.c - PySSLContext_Type - +Modules/_ssl.c - PySSLMemoryBIO_Type - +Modules/_ssl.c - PySSLSession_Type - +Modules/_threadmodule.c - Locktype - +Modules/_threadmodule.c - RLocktype - +Modules/_threadmodule.c - localdummytype - +Modules/_threadmodule.c - localtype - +Modules/xxmodule.c - Xxo_Type - +Modules/xxmodule.c - Str_Type - +Modules/xxmodule.c - Null_Type - +Modules/_xxsubinterpretersmodule.c - ChannelIDtype - +Modules/xxsubtype.c - spamlist_type - +Modules/xxsubtype.c - spamdict_type - +Modules/_zoneinfo.c - PyZoneInfo_ZoneInfoType - + +#----------------------- +# module initialized once - non-static types +# [] + +# structseq types [6] +Modules/timemodule.c - StructTimeType - +Modules/signalmodule.c - SiginfoType - +Modules/_threadmodule.c - ExceptHookArgsType - +Modules/spwdmodule.c - StructSpwdType - +Modules/resource.c - StructRUsageType - +Modules/_cursesmodule.c - NcursesVersionType - + +# heap types [12] +Modules/_tkinter.c - Tkapp_Type - +Modules/_tkinter.c - PyTclObject_Type - +Modules/_tkinter.c - Tktt_Type - +Modules/xxlimited.c - Xxo_Type - +Modules/_decimal/_decimal.c - DecimalTuple - +Modules/_decimal/_decimal.c - PyDecSignalDict_Type - +Modules/_sqlite/connection.c - pysqlite_ConnectionType - +Modules/_sqlite/statement.c - pysqlite_StatementType - +Modules/_sqlite/cache.c - pysqlite_NodeType - +Modules/_sqlite/cache.c - pysqlite_CacheType - +Modules/_sqlite/row.c - pysqlite_RowType - +Modules/_sqlite/prepare_protocol.c - pysqlite_PrepareProtocolType - +Modules/_sqlite/cursor.c - pysqlite_CursorType - + +# exception types [] +Modules/_ctypes/_ctypes.c - PyExc_ArgError - +Modules/_cursesmodule.c - PyCursesError - +Modules/_decimal/_decimal.c - DecimalException - +Modules/_queuemodule.c - EmptyError - +Modules/_sqlite/module.h - pysqlite_Error - +Modules/_sqlite/module.h - pysqlite_Warning - +Modules/_sqlite/module.h - pysqlite_InterfaceError - +Modules/_sqlite/module.h - pysqlite_DatabaseError - +Modules/_sqlite/module.h - pysqlite_InternalError - +Modules/_sqlite/module.h - pysqlite_OperationalError - +Modules/_sqlite/module.h - pysqlite_ProgrammingError - +Modules/_sqlite/module.h - pysqlite_IntegrityError - +Modules/_sqlite/module.h - pysqlite_DataError - +Modules/_sqlite/module.h - pysqlite_NotSupportedError - +Modules/_ssl.c - PySSLErrorObject - +Modules/_ssl.c - PySSLCertVerificationErrorObject - +Modules/_ssl.c - PySSLZeroReturnErrorObject - +Modules/_ssl.c - PySSLWantReadErrorObject - +Modules/_ssl.c - PySSLWantWriteErrorObject - +Modules/_ssl.c - PySSLSyscallErrorObject - +Modules/_ssl.c - PySSLEOFErrorObject - +Modules/_threadmodule.c - ThreadError - +Modules/_tkinter.c - Tkinter_TclError - +Modules/_xxsubinterpretersmodule.c - ChannelError - +Modules/_xxsubinterpretersmodule.c - ChannelNotFoundError - +Modules/_xxsubinterpretersmodule.c - ChannelClosedError - +Modules/_xxsubinterpretersmodule.c - ChannelEmptyError - +Modules/_xxsubinterpretersmodule.c - ChannelNotEmptyError - +Modules/_xxsubinterpretersmodule.c - RunFailedError - +Modules/ossaudiodev.c - OSSAudioError - +Modules/pyexpat.c - ErrorObject - +Modules/signalmodule.c - ItimerError - +Modules/socketmodule.c - socket_herror - +Modules/socketmodule.c - socket_gaierror - +Modules/socketmodule.c - socket_timeout - +Modules/xxlimited.c - ErrorObject - +Modules/xxmodule.c - ErrorObject - + +#----------------------- +# module initialized once - cached PyUnicode +# [] + +# Py_IDENTIFIER (global) [] +Modules/faulthandler.c - PyId_enable - +Modules/faulthandler.c - PyId_fileno - +Modules/faulthandler.c - PyId_flush - +Modules/faulthandler.c - PyId_stderr - +Modules/_asynciomodule.c - PyId___asyncio_running_event_loop__ - +Modules/_asynciomodule.c - PyId__asyncio_future_blocking - +Modules/_asynciomodule.c - PyId_add_done_callback - +Modules/_asynciomodule.c - PyId_call_soon - +Modules/_asynciomodule.c - PyId_cancel - +Modules/_asynciomodule.c - PyId_get_event_loop - +Modules/_asynciomodule.c - PyId_throw - +Modules/posixmodule.c - PyId___fspath__ - +Modules/_abc.c - PyId___abstractmethods__ - +Modules/_abc.c - PyId___class__ - +Modules/_abc.c - PyId___dict__ - +Modules/_abc.c - PyId___bases__ - +Modules/_abc.c - PyId__abc_impl - +Modules/_abc.c - PyId___subclasscheck__ - +Modules/_abc.c - PyId___subclasshook__ - +Modules/_bisectmodule.c - PyId_insert - +Modules/_threadmodule.c - PyId_stderr - +Modules/_threadmodule.c - PyId_flush - +Modules/unicodedata.c - PyId_NFC - +Modules/unicodedata.c - PyId_NFD - +Modules/unicodedata.c - PyId_NFKC - +Modules/unicodedata.c - PyId_NFKD - +Modules/_datetimemodule.c - PyId_as_integer_ratio - +Modules/_datetimemodule.c - PyId_fromutc - +Modules/_datetimemodule.c - PyId_isoformat - +Modules/_datetimemodule.c - PyId_strftime - +Modules/_sqlite/connection.c - PyId_cursor - +Modules/cjkcodecs/multibytecodec.c - PyId_write - +Modules/_io/textio.c - PyId_close - +Modules/_io/textio.c - PyId__dealloc_warn - +Modules/_io/textio.c - PyId_decode - +Modules/_io/textio.c - PyId_fileno - +Modules/_io/textio.c - PyId_flush - +Modules/_io/textio.c - PyId_getpreferredencoding - +Modules/_io/textio.c - PyId_isatty - +Modules/_io/textio.c - PyId_mode - +Modules/_io/textio.c - PyId_name - +Modules/_io/textio.c - PyId_raw - +Modules/_io/textio.c - PyId_read - +Modules/_io/textio.c - PyId_readable - +Modules/_io/textio.c - PyId_replace - +Modules/_io/textio.c - PyId_reset - +Modules/_io/textio.c - PyId_seek - +Modules/_io/textio.c - PyId_seekable - +Modules/_io/textio.c - PyId_setstate - +Modules/_io/textio.c - PyId_strict - +Modules/_io/textio.c - PyId_tell - +Modules/_io/textio.c - PyId_writable - +Modules/_io/fileio.c - PyId_name - +Modules/_io/bufferedio.c - PyId_close - +Modules/_io/bufferedio.c - PyId__dealloc_warn - +Modules/_io/bufferedio.c - PyId_flush - +Modules/_io/bufferedio.c - PyId_isatty - +Modules/_io/bufferedio.c - PyId_mode - +Modules/_io/bufferedio.c - PyId_name - +Modules/_io/bufferedio.c - PyId_peek - +Modules/_io/bufferedio.c - PyId_read - +Modules/_io/bufferedio.c - PyId_read1 - +Modules/_io/bufferedio.c - PyId_readable - +Modules/_io/bufferedio.c - PyId_readinto - +Modules/_io/bufferedio.c - PyId_readinto1 - +Modules/_io/bufferedio.c - PyId_writable - +Modules/_io/bufferedio.c - PyId_write - +Modules/_io/iobase.c - PyId___IOBase_closed - +Modules/_io/iobase.c - PyId_read - + +# Py_IDENTIFIER (local) [] +Modules/_ssl.c fill_and_set_sslerror PyId_reason - +Modules/_ssl.c fill_and_set_sslerror PyId_library - +Modules/_ssl.c fill_and_set_sslerror PyId_verify_message - +Modules/_ssl.c fill_and_set_sslerror PyId_verify_code - +Modules/timemodule.c time_strptime PyId__strptime_time - +Modules/itertoolsmodule.c _grouper_reduce PyId_iter - +Modules/itertoolsmodule.c itertools_tee_impl PyId___copy__ - +Modules/itertoolsmodule.c cycle_reduce PyId___setstate__ - +Modules/itertoolsmodule.c zip_longest_new PyId_fillvalue - +Modules/mmapmodule.c mmap__exit__method PyId_close - +Modules/_gdbmmodule.c gdbm__exit__ PyId_close - +Modules/arraymodule.c array_array_fromfile_impl PyId_read - +Modules/arraymodule.c array_array_tofile PyId_write - +Modules/arraymodule.c array_array___reduce_ex__ PyId__array_reconstructor - +Modules/arraymodule.c array_array___reduce_ex__ PyId___dict__ - +Modules/arraymodule.c array_arrayiterator___reduce___impl PyId_iter - +Modules/_collectionsmodule.c deque_reduce PyId___dict__ - +Modules/_collectionsmodule.c defdict_reduce PyId_items - +Modules/_collectionsmodule.c _collections__count_elements_impl PyId_get - +Modules/_collectionsmodule.c _collections__count_elements_impl PyId___setitem__ - +Modules/_csv.c csv_writer PyId_write - +Modules/_asynciomodule.c get_future_loop PyId_get_loop - +Modules/_asynciomodule.c get_future_loop PyId__loop - +Modules/_asynciomodule.c future_init PyId_get_debug - +Modules/_asynciomodule.c FutureObj_get_state PyId_PENDING - +Modules/_asynciomodule.c FutureObj_get_state PyId_CANCELLED - +Modules/_asynciomodule.c FutureObj_get_state PyId_FINISHED - +Modules/_asynciomodule.c FutureObj_repr PyId__repr_info - +Modules/_asynciomodule.c FutureObj_finalize PyId_call_exception_handler - +Modules/_asynciomodule.c FutureObj_finalize PyId_message - +Modules/_asynciomodule.c FutureObj_finalize PyId_exception - +Modules/_asynciomodule.c FutureObj_finalize PyId_future - +Modules/_asynciomodule.c FutureObj_finalize PyId_source_traceback - +Modules/_asynciomodule.c register_task PyId_add - +Modules/_asynciomodule.c unregister_task PyId_discard - +Modules/_asynciomodule.c TaskObj_finalize PyId_call_exception_handler - +Modules/_asynciomodule.c TaskObj_finalize PyId_task - +Modules/_asynciomodule.c TaskObj_finalize PyId_message - +Modules/_asynciomodule.c TaskObj_finalize PyId_source_traceback - +Modules/mathmodule.c math_ceil PyId___ceil__ - +Modules/mathmodule.c math_floor PyId___floor__ - +Modules/mathmodule.c math_trunc PyId___trunc__ - +Modules/_operator.c methodcaller_reduce PyId_partial - +Modules/_lzmamodule.c build_filter_spec PyId_id - +Modules/_lzmamodule.c build_filter_spec PyId_lc - +Modules/_lzmamodule.c build_filter_spec PyId_lp - +Modules/_lzmamodule.c build_filter_spec PyId_pb - +Modules/_lzmamodule.c build_filter_spec PyId_dict_size - +Modules/_lzmamodule.c build_filter_spec PyId_dist - +Modules/_lzmamodule.c build_filter_spec PyId_start_offset - +Modules/pyexpat.c pyexpat_xmlparser_ParseFile PyId_read - +Modules/_threadmodule.c thread_excepthook_file PyId_name - +Modules/_elementtree.c _elementtree_Element_find_impl PyId_find - +Modules/_elementtree.c _elementtree_Element_findtext_impl PyId_findtext - +Modules/_elementtree.c _elementtree_Element_findall_impl PyId_findall - +Modules/_elementtree.c _elementtree_Element_iterfind_impl PyId_iterfind - +Modules/_elementtree.c treebuilder_flush_data PyId_text - +Modules/_elementtree.c treebuilder_flush_data PyId_tail - +Modules/_elementtree.c treebuilder_add_subelement PyId_append - +Modules/_elementtree.c expat_start_doctype_handler PyId_doctype - +Modules/_pickle.c _Pickle_InitState PyId_getattr - +Modules/_pickle.c _Pickler_SetOutputStream PyId_write - +Modules/_pickle.c _Unpickler_SetInputStream PyId_peek - +Modules/_pickle.c _Unpickler_SetInputStream PyId_read - +Modules/_pickle.c _Unpickler_SetInputStream PyId_readinto - +Modules/_pickle.c _Unpickler_SetInputStream PyId_readline - +Modules/_pickle.c whichmodule PyId___module__ - +Modules/_pickle.c whichmodule PyId_modules - +Modules/_pickle.c whichmodule PyId___main__ - +Modules/_pickle.c save_bytes PyId_latin1 - +Modules/_pickle.c save_dict PyId_items - +Modules/_pickle.c save_global PyId___name__ - +Modules/_pickle.c save_global PyId___qualname__ - +Modules/_pickle.c get_class PyId___class__ - +Modules/_pickle.c save_reduce PyId___name__ - +Modules/_pickle.c save_reduce PyId___newobj_ex__ - +Modules/_pickle.c save_reduce PyId___newobj__ - +Modules/_pickle.c save_reduce PyId___new__ - +Modules/_pickle.c save PyId___reduce__ - +Modules/_pickle.c save PyId___reduce_ex__ - +Modules/_pickle.c dump PyId_reducer_override - +Modules/_pickle.c _pickle_Pickler___init___impl PyId_persistent_id - +Modules/_pickle.c _pickle_Pickler___init___impl PyId_dispatch_table - +Modules/_pickle.c find_class PyId_find_class - +Modules/_pickle.c instantiate PyId___getinitargs__ - +Modules/_pickle.c instantiate PyId___new__ - +Modules/_pickle.c do_append PyId_extend - +Modules/_pickle.c do_append PyId_append - +Modules/_pickle.c load_additems PyId_add - +Modules/_pickle.c load_build PyId___setstate__ - +Modules/_pickle.c load_build PyId___dict__ - +Modules/_pickle.c _pickle_Unpickler___init___impl PyId_persistent_load - +Modules/_cursesmodule.c _curses_window_putwin PyId_write - +Modules/_cursesmodule.c _curses_getwin PyId_read - +Modules/_cursesmodule.c update_lines_cols PyId_LINES - +Modules/_cursesmodule.c update_lines_cols PyId_COLS - +Modules/_datetimemodule.c call_tzname PyId_tzname - +Modules/_datetimemodule.c make_Zreplacement PyId_replace - +Modules/_datetimemodule.c time_time PyId_time - +Modules/_datetimemodule.c build_struct_time PyId_struct_time - +Modules/_datetimemodule.c date_today PyId_fromtimestamp - +Modules/_datetimemodule.c date_strftime PyId_timetuple - +Modules/_datetimemodule.c tzinfo_reduce PyId___getinitargs__ - +Modules/_datetimemodule.c tzinfo_reduce PyId___getstate__ - +Modules/_datetimemodule.c datetime_strptime PyId__strptime_datetime - +Modules/ossaudiodev.c oss_exit PyId_close - +Modules/main.c pymain_sys_path_add_path0 PyId_path - +Modules/_sqlite/microprotocols.c pysqlite_microprotocols_adapt PyId___adapt__ - +Modules/_sqlite/microprotocols.c pysqlite_microprotocols_adapt PyId___conform__ - +Modules/_sqlite/connection.c _pysqlite_final_callback PyId_finalize - +Modules/_sqlite/connection.c pysqlite_connection_set_isolation_level PyId_upper - +Modules/_sqlite/connection.c pysqlite_connection_iterdump PyId__iterdump - +Modules/_sqlite/connection.c pysqlite_connection_create_collation PyId_upper - +Modules/_sqlite/module.c module_register_converter PyId_upper - +Modules/_sqlite/cursor.c _pysqlite_get_converter PyId_upper - +Modules/_io/_iomodule.c _io_open_impl PyId__blksize - +Modules/_io/_iomodule.c _io_open_impl PyId_isatty - +Modules/_io/_iomodule.c _io_open_impl PyId_mode - +Modules/_io/_iomodule.c _io_open_impl PyId_close - +Modules/_io/fileio.c _io_FileIO_close_impl PyId_close - +Modules/_io/iobase.c _io__IOBase_tell_impl PyId_seek - +Modules/_io/iobase.c iobase_finalize PyId__finalizing - +Modules/_io/iobase.c _io__IOBase_readlines_impl PyId_extend - +Modules/_io/iobase.c _io__RawIOBase_read_impl PyId_readall - +Modules/_ctypes/stgdict.c MakeAnonFields PyId__anonymous_ - +Modules/_ctypes/stgdict.c PyCStructUnionType_update_stgdict PyId__swappedbytes_ - +Modules/_ctypes/stgdict.c PyCStructUnionType_update_stgdict PyId__use_broken_old_ctypes_structure_semantics_ - +Modules/_ctypes/stgdict.c PyCStructUnionType_update_stgdict PyId__pack_ - +Modules/_ctypes/callproc.c ConvParam PyId__as_parameter_ - +Modules/_ctypes/callproc.c unpickle PyId___new__ - +Modules/_ctypes/callproc.c unpickle PyId___setstate__ - +Modules/_ctypes/_ctypes.c StructUnionType_new PyId__abstract_ - +Modules/_ctypes/_ctypes.c StructUnionType_new PyId__fields_ - +Modules/_ctypes/_ctypes.c CDataType_from_param PyId__as_parameter_ - +Modules/_ctypes/_ctypes.c PyCPointerType_new PyId__type_ - +Modules/_ctypes/_ctypes.c PyCPointerType_set_type PyId__type_ - +Modules/_ctypes/_ctypes.c PyCArrayType_new PyId__length_ - +Modules/_ctypes/_ctypes.c PyCArrayType_new PyId__type_ - +Modules/_ctypes/_ctypes.c c_wchar_p_from_param PyId__as_parameter_ - +Modules/_ctypes/_ctypes.c c_char_p_from_param PyId__as_parameter_ - +Modules/_ctypes/_ctypes.c c_void_p_from_param PyId__as_parameter_ - +Modules/_ctypes/_ctypes.c PyCSimpleType_new PyId__type_ - +Modules/_ctypes/_ctypes.c PyCSimpleType_from_param PyId__as_parameter_ - +Modules/_ctypes/_ctypes.c converters_from_argtypes PyId_from_param - +Modules/_ctypes/_ctypes.c make_funcptrtype_dict PyId__flags_ - +Modules/_ctypes/_ctypes.c make_funcptrtype_dict PyId__argtypes_ - +Modules/_ctypes/_ctypes.c make_funcptrtype_dict PyId__restype_ - +Modules/_ctypes/_ctypes.c make_funcptrtype_dict PyId__check_retval_ - +Modules/_ctypes/_ctypes.c PyCFuncPtr_set_restype PyId__check_retval_ - +Modules/_ctypes/_ctypes.c _build_result PyId___ctypes_from_outparam__ - +Modules/_ctypes/_ctypes.c _init_pos_args PyId__fields_ - + +# _Py_static_string [] +Modules/_pickle.c get_dotted_path PyId_dot - + +# manually cached PyUnicodeOjbect [] +Modules/_asynciomodule.c - context_kwname - +Modules/_ctypes/callproc.c _ctypes_get_errobj error_object_name - +Modules/_ctypes/_ctypes.c CreateSwappedType suffix - +Modules/_io/_iomodule.c - _PyIO_str_close - +Modules/_io/_iomodule.c - _PyIO_str_closed - +Modules/_io/_iomodule.c - _PyIO_str_decode - +Modules/_io/_iomodule.c - _PyIO_str_encode - +Modules/_io/_iomodule.c - _PyIO_str_fileno - +Modules/_io/_iomodule.c - _PyIO_str_flush - +Modules/_io/_iomodule.c - _PyIO_str_getstate - +Modules/_io/_iomodule.c - _PyIO_str_isatty - +Modules/_io/_iomodule.c - _PyIO_str_newlines - +Modules/_io/_iomodule.c - _PyIO_str_nl - +Modules/_io/_iomodule.c - _PyIO_str_peek - +Modules/_io/_iomodule.c - _PyIO_str_read - +Modules/_io/_iomodule.c - _PyIO_str_read1 - +Modules/_io/_iomodule.c - _PyIO_str_readable - +Modules/_io/_iomodule.c - _PyIO_str_readall - +Modules/_io/_iomodule.c - _PyIO_str_readinto - +Modules/_io/_iomodule.c - _PyIO_str_readline - +Modules/_io/_iomodule.c - _PyIO_str_reset - +Modules/_io/_iomodule.c - _PyIO_str_seek - +Modules/_io/_iomodule.c - _PyIO_str_seekable - +Modules/_io/_iomodule.c - _PyIO_str_setstate - +Modules/_io/_iomodule.c - _PyIO_str_tell - +Modules/_io/_iomodule.c - _PyIO_str_truncate - +Modules/_io/_iomodule.c - _PyIO_str_writable - +Modules/_io/_iomodule.c - _PyIO_str_write - +Modules/_io/_iomodule.c - _PyIO_empty_str - +Modules/_json.c _encoded_const s_null - +Modules/_json.c _encoded_const s_true - +Modules/_json.c _encoded_const s_false - +Modules/_json.c encoder_listencode_dict open_dict - +Modules/_json.c encoder_listencode_dict close_dict - +Modules/_json.c encoder_listencode_dict empty_dict - +Modules/_json.c encoder_listencode_list open_array - +Modules/_json.c encoder_listencode_list close_array - +Modules/_json.c encoder_listencode_list empty_array - +Modules/_threadmodule.c - str_dict - +Modules/_tracemalloc.c - unknown_filename - + +#----------------------- +# module initialized once - other PyObject +# [] + +# cached during module init [] +Modules/_asynciomodule.c - asyncio_mod - +Modules/_asynciomodule.c - traceback_extract_stack - +Modules/_asynciomodule.c - asyncio_get_event_loop_policy - +Modules/_asynciomodule.c - asyncio_future_repr_info_func - +Modules/_asynciomodule.c - asyncio_iscoroutine_func - +Modules/_asynciomodule.c - asyncio_task_get_stack_func - +Modules/_asynciomodule.c - asyncio_task_print_stack_func - +Modules/_asynciomodule.c - asyncio_task_repr_info_func - +Modules/_asynciomodule.c - asyncio_InvalidStateError - +Modules/_asynciomodule.c - asyncio_CancelledError - +Modules/_zoneinfo.c - io_open - +Modules/_zoneinfo.c - _tzpath_find_tzfile - +Modules/_zoneinfo.c - _common_mod - + +# other [] +Modules/_ctypes/_ctypes.c - _unpickle - +Modules/_ctypes/_ctypes.c PyCArrayType_from_ctype cache - +Modules/_cursesmodule.c - ModDict - +Modules/_datetimemodule.c datetime_strptime module - +Modules/_datetimemodule.c - PyDateTime_TimeZone_UTC - +Modules/_datetimemodule.c - PyDateTime_Epoch - +Modules/_datetimemodule.c - us_per_ms - +Modules/_datetimemodule.c - us_per_second - +Modules/_datetimemodule.c - us_per_minute - +Modules/_datetimemodule.c - us_per_hour - +Modules/_datetimemodule.c - us_per_day - +Modules/_datetimemodule.c - us_per_week - +Modules/_datetimemodule.c - seconds_per_day - +Modules/_decimal/_decimal.c PyInit__decimal capsule - +Modules/_decimal/_decimal.c - basic_context_template - +Modules/_decimal/_decimal.c - current_context_var - +Modules/_decimal/_decimal.c - default_context_template - +Modules/_decimal/_decimal.c - extended_context_template - +Modules/_decimal/_decimal.c - round_map - +Modules/_decimal/_decimal.c - Rational - +Modules/_decimal/_decimal.c - SignalTuple - +Modules/_functoolsmodule.c - kwd_mark - +Modules/_io/_iomodule.c - _PyIO_empty_bytes - +Modules/_json.c raise_errmsg JSONDecodeError - +Modules/_sqlite/microprotocols.c - psyco_adapters - +Modules/_sqlite/module.h - _pysqlite_converters - +Modules/_ssl.c - err_codes_to_names - +Modules/_ssl.c - err_names_to_codes - +Modules/_ssl.c - lib_codes_to_names - +# XXX This should have been found by the analyzer but wasn't: +Modules/_ssl.c - _ssl_locks - +Modules/_struct.c - cache - +Modules/_tracemalloc.c - tracemalloc_empty_traceback - +Modules/arraymodule.c array_array___reduce_ex__ array_reconstructor - +Modules/cjkcodecs/cjkcodecs.h getmultibytecodec cofunc - +Modules/signalmodule.c - DefaultHandler - +Modules/signalmodule.c - IgnoreHandler - +Modules/signalmodule.c - IntHandler - + +#----------------------- +# module initialized once - non-PyObject +# [] + +# pre-allocated buffer [] +Modules/getbuildinfo.c Py_GetBuildInfo buildinfo - +Modules/nismodule.c nisproc_maplist_2 res - +Modules/pyexpat.c PyUnknownEncodingHandler template_buffer - + +# other [] +Include/datetime.h - PyDateTimeAPI - +Modules/_asynciomodule.c - module_initialized - +Modules/_ctypes/cfield.c _ctypes_get_fielddesc initialized - +Modules/_ctypes/malloc_closure.c - _pagesize - +Modules/_cursesmodule.c - initialised - +Modules/_cursesmodule.c - initialised_setupterm - +Modules/_cursesmodule.c - initialisedcolors - +Modules/_cursesmodule.c - screen_encoding - +Modules/_cursesmodule.c PyInit__curses PyCurses_API - +Modules/_datetimemodule.c - CAPI - +Modules/_decimal/_decimal.c PyInit__decimal initialized - +Modules/_decimal/_decimal.c - _py_long_multiply - +Modules/_decimal/_decimal.c - _py_long_floor_divide - +Modules/_decimal/_decimal.c - _py_long_power - +Modules/_decimal/_decimal.c - _py_float_abs - +Modules/_decimal/_decimal.c - _py_long_bit_length - +Modules/_decimal/_decimal.c - _py_float_as_integer_ratio - +Modules/_decimal/_decimal.c - _decimal_api - +Modules/_elementtree.c - expat_capi - +Modules/_io/bufferedio.c _PyIO_trap_eintr eintr_int - +Modules/_sqlite/module.h - _pysqlite_enable_callback_tracebacks - +Modules/_sqlite/module.h - pysqlite_BaseTypeAdapted - +Modules/_ssl.c - _ssl_locks_count - +Modules/cjkcodecs/cjkcodecs.h - codec_list - +Modules/cjkcodecs/cjkcodecs.h - mapping_list - +# XXX This should have been found by the analyzer but wasn't: +Python/fileutils.c - _Py_open_cloexec_works - +Modules/getaddrinfo.c - gai_afdl - +Modules/posixmodule.c os_dup2_impl dup3_works - +Modules/posixmodule.c - structseq_new - +Modules/posixmodule.c - ticks_per_second - +Modules/pyexpat.c PyInit_pyexpat capi - +Modules/readline.c - using_libedit_emulation - +Modules/readline.c - libedit_history_start - +Modules/resource.c - initialized - +Modules/signalmodule.c - initialized - +Modules/socketmodule.c - accept4_works - +Modules/socketmodule.c - sock_cloexec_works - +Modules/socketmodule.c - PySocketModuleAPI - +Modules/spwdmodule.c - initialized - +Modules/timemodule.c - initialized - +Modules/timemodule.c _PyTime_GetClockWithInfo initialized - +Modules/timemodule.c _PyTime_GetProcessTimeWithInfo ticks_per_second - + +#----------------------- +# module state +# [] + +Modules/posixmodule.c - environ - + +# PyObject [] +Modules/_asynciomodule.c - cached_running_holder - +Modules/_asynciomodule.c - fi_freelist - +Modules/_asynciomodule.c - fi_freelist_len - +Modules/_asynciomodule.c - all_tasks - +Modules/_asynciomodule.c - current_tasks - +Modules/_asynciomodule.c - iscoroutine_typecache - +Modules/_ctypes/_ctypes.c - _ctypes_ptrtype_cache - +Modules/_tkinter.c - tcl_lock - +Modules/_tkinter.c - excInCmd - +Modules/_tkinter.c - valInCmd - +Modules/_tkinter.c - trbInCmd - +Modules/_zoneinfo.c - TIMEDELTA_CACHE - +Modules/_zoneinfo.c - ZONEINFO_WEAK_CACHE - +Modules/faulthandler.c - fatal_error - +Modules/faulthandler.c - thread - +Modules/faulthandler.c - user_signals - +Modules/faulthandler.c - stack - +Modules/faulthandler.c - old_stack - +Modules/signalmodule.c - Handlers - +Modules/syslogmodule.c - S_ident_o - + +# other [] +Modules/_asynciomodule.c - cached_running_holder_tsid - +Modules/_asynciomodule.c - task_name_counter - +Modules/_ctypes/cfield.c - formattable - +Modules/_ctypes/malloc_closure.c - free_list - +Modules/_curses_panel.c - lop - +Modules/_tkinter.c - quitMainLoop - +Modules/_tkinter.c - errorInCmd - +Modules/_tkinter.c - Tkinter_busywaitinterval - +Modules/_tkinter.c - call_mutex - +Modules/_tkinter.c - var_mutex - +Modules/_tkinter.c - command_mutex - +Modules/_tkinter.c - HeadFHCD - +Modules/_tkinter.c - stdin_ready - +Modules/_tkinter.c - event_tstate - +Modules/_tracemalloc.c - allocators - +Modules/_tracemalloc.c - tables_lock - +Modules/_tracemalloc.c - tracemalloc_traced_memory - +Modules/_tracemalloc.c - tracemalloc_peak_traced_memory - +Modules/_tracemalloc.c - tracemalloc_filenames - +Modules/_tracemalloc.c - tracemalloc_traceback - +Modules/_tracemalloc.c - tracemalloc_tracebacks - +Modules/_tracemalloc.c - tracemalloc_traces - +Modules/_tracemalloc.c - tracemalloc_domains - +Modules/_tracemalloc.c - tracemalloc_reentrant_key - +Modules/_xxsubinterpretersmodule.c - _globals - +Modules/_zoneinfo.c - ZONEINFO_STRONG_CACHE - +Modules/_zoneinfo.c - ZONEINFO_STRONG_CACHE_MAX_SIZE - +Modules/_zoneinfo.c - NO_TTINFO - +Modules/faulthandler.c faulthandler_dump_traceback reentrant - +Modules/readline.c - completer_word_break_characters - +Modules/readline.c - _history_length - +Modules/readline.c - should_auto_add_history - +Modules/readline.c - sigwinch_received - +Modules/readline.c - sigwinch_ohandler - +Modules/readline.c - completed_input_string - +Modules/rotatingtree.c - random_stream - +Modules/rotatingtree.c - random_value - +Modules/signalmodule.c - is_tripped - +Modules/signalmodule.c - wakeup - +Modules/socketmodule.c - defaulttimeout - +Modules/syslogmodule.c - S_log_open - + +#----------------------- +# runtime state +# [] + +# PyObject [] +Objects/typeobject.c resolve_slotdups pname - +# XXX This should have been found by the analyzer but wasn't: +Python/import.c - extensions - + +# allocator [] +Objects/obmalloc.c - _Py_tracemalloc_config - +Objects/obmalloc.c - _PyObject_Arena - +Objects/obmalloc.c - arenas - +Objects/obmalloc.c - maxarenas - +Objects/obmalloc.c - unused_arena_objects - +Objects/obmalloc.c - usable_arenas - +Objects/obmalloc.c - nfp2lasta - +Objects/obmalloc.c - narenas_currently_allocated - +Objects/obmalloc.c - ntimes_arena_allocated - +Objects/obmalloc.c - narenas_highwater - +Objects/obmalloc.c - raw_allocated_blocks - +Objects/obmalloc.c new_arena debug_stats - + +# REPL [] +Parser/myreadline.c - _PyOS_ReadlineLock - +Parser/myreadline.c - _PyOS_ReadlineTState - +Parser/myreadline.c - PyOS_InputHook - +Parser/myreadline.c - PyOS_ReadlineFunctionPointer - + +# other [] +Objects/dictobject.c - pydict_global_version - +Objects/floatobject.c - double_format - +Objects/floatobject.c - float_format - +Objects/floatobject.c - detected_double_format - +Objects/floatobject.c - detected_float_format - +Objects/moduleobject.c - max_module_number - +Objects/object.c - _Py_RefTotal - +Objects/typeobject.c - next_version_tag - +Objects/typeobject.c resolve_slotdups ptrs - +Parser/pegen.c - memo_statistics - +# XXX This should have been found by the analyzer but wasn't: +Python/bootstrap_hash.c - urandom_cache - +# XXX This should have been found by the analyzer but wasn't: +Python/ceval.c - lltrace - +# XXX This should have been found by the analyzer but wasn't: +Python/ceval.c make_pending_calls busy - +Python/dynload_shlib.c - handles - +Python/dynload_shlib.c - nhandles - +# XXX This should have been found by the analyzer but wasn't: +Python/import.c - import_lock_level - +# XXX This should have been found by the analyzer but wasn't: +Python/import.c - import_lock_thread - +# XXX This should have been found by the analyzer but wasn't: +Python/import.c import_find_and_load accumulated - +# XXX This should have been found by the analyzer but wasn't: +Python/import.c import_find_and_load import_level - +# XXX This should have been found by the analyzer but wasn't: +Python/pylifecycle.c - _Py_UnhandledKeyboardInterrupt - +# XXX This should have been found by the analyzer but wasn't: +Python/pylifecycle.c fatal_error reentrant - From a636a38fa109053f4eab6e62557f756718088ac2 Mon Sep 17 00:00:00 2001 From: ArioA Date: Sat, 21 Nov 2020 02:37:54 +0000 Subject: [PATCH 0611/1261] bpo-42407: Use possessive appostrophe in multiprocessing doc (GH-23400) --- Doc/library/multiprocessing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index f8e7556f25b4e0..20cd99d8ce2c87 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -98,7 +98,7 @@ to start a process. These *start methods* are *spawn* The parent process starts a fresh python interpreter process. The child process will only inherit those resources necessary to run - the process objects :meth:`~Process.run` method. In particular, + the process object's :meth:`~Process.run` method. In particular, unnecessary file descriptors and handles from the parent process will not be inherited. Starting a process using this method is rather slow compared to using *fork* or *forkserver*. From 50d72038e3d23e2fc7be324a990b587e2095d4dc Mon Sep 17 00:00:00 2001 From: Quentin Hibon Date: Sat, 21 Nov 2020 05:07:22 +0100 Subject: [PATCH 0612/1261] bpo-42419: Correct 'deprecatations' is What's New 3.9 (GH-23421) --- Doc/whatsnew/3.9.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index b89faf101d0435..a638e544cb38fe 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -135,8 +135,8 @@ More generally, try to run your tests in the :ref:`Python Development Mode ` which helps to prepare your code to make it compatible with the next Python version. -Note: a number of pre-existing deprecatations were removed in this version -of Python as well. Consult the :ref:`removed-in-python-39` section. +Note: a number of pre-existing deprecations were removed in this version of +Python as well. Consult the :ref:`removed-in-python-39` section. New Features From d5c34486c321b3c9c0f92d8df7614f266d01a031 Mon Sep 17 00:00:00 2001 From: Devin Jeanpierre Date: Sat, 21 Nov 2020 01:55:23 -0700 Subject: [PATCH 0613/1261] bpo-40791: Make compare_digest more constant-time. (GH-20444) * bpo-40791: Make compare_digest more constant-time. The existing volatile `left`/`right` pointers guarantee that the reads will all occur, but does not guarantee that they will be _used_. So a compiler can still short-circuit the loop, saving e.g. the overhead of doing the xors and especially the overhead of the data dependency between `result` and the reads. That would change performance depending on where the first unequal byte occurs. This change removes that optimization. (This is change #1 from https://bugs.python.org/issue40791 .) --- .../next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst | 1 + Modules/_operator.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst diff --git a/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst b/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst new file mode 100644 index 00000000000000..69b9de1beae0d1 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst @@ -0,0 +1 @@ +Add ``volatile`` to the accumulator variable in ``hmac.compare_digest``, making constant-time-defeating optimizations less likely. \ No newline at end of file diff --git a/Modules/_operator.c b/Modules/_operator.c index c9d38aa3423667..da1e43158ee0ac 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -749,7 +749,7 @@ _tscmp(const unsigned char *a, const unsigned char *b, volatile const unsigned char *left; volatile const unsigned char *right; Py_ssize_t i; - unsigned char result; + volatile unsigned char result; /* loop count depends on length of b */ length = len_b; From 92c4faa1cb79e32500f9564e864815fdd069ff20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filipe=20La=C3=ADns?= Date: Sat, 21 Nov 2020 09:22:08 +0000 Subject: [PATCH 0614/1261] bpo-40550: Fix time-of-check/time-of-action issue in subprocess.Popen.send_signal. (GH-20010) send_signal() now swallows the exception if the process it thought was still alive winds up not to exist anymore (always a plausible race condition despite the checks). Co-authored-by: Gregory P. Smith --- Lib/subprocess.py | 6 +++++- Lib/test/test_subprocess.py | 13 +++++++++++++ .../2020-05-08-21-30-54.bpo-40550.i7GWkb.rst | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-05-08-21-30-54.bpo-40550.i7GWkb.rst diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 6a6c2fc98e83f3..e259dc3a8e538a 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -2078,7 +2078,11 @@ def send_signal(self, sig): # The race condition can still happen if the race condition # described above happens between the returncode test # and the kill() call. - os.kill(self.pid, sig) + try: + os.kill(self.pid, sig) + except ProcessLookupError: + # Supress the race condition error; bpo-40550. + pass def terminate(self): """Terminate the process with SIGTERM diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index e25474abed4b78..2a4c47530e6a1b 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -3229,6 +3229,19 @@ def test_send_signal_race(self): # so Popen failed to read it and uses a default returncode instead. self.assertIsNotNone(proc.returncode) + def test_send_signal_race2(self): + # bpo-40550: the process might exist between the returncode check and + # the kill operation + p = subprocess.Popen([sys.executable, '-c', 'exit(1)']) + + # wait for process to exit + while not p.returncode: + p.poll() + + with mock.patch.object(p, 'poll', new=lambda: None): + p.returncode = None + p.send_signal(signal.SIGTERM) + def test_communicate_repeated_call_after_stdout_close(self): proc = subprocess.Popen([sys.executable, '-c', 'import os, time; os.close(1), time.sleep(2)'], diff --git a/Misc/NEWS.d/next/Library/2020-05-08-21-30-54.bpo-40550.i7GWkb.rst b/Misc/NEWS.d/next/Library/2020-05-08-21-30-54.bpo-40550.i7GWkb.rst new file mode 100644 index 00000000000000..b0f3f03c34bbc5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-05-08-21-30-54.bpo-40550.i7GWkb.rst @@ -0,0 +1 @@ +Fix time-of-check/time-of-action issue in subprocess.Popen.send_signal. From 040b496a470d4cfa16a4fbea0a5e2b244a277feb Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 21 Nov 2020 12:02:53 +0200 Subject: [PATCH 0615/1261] bpo-42412: Fix possible leaks and check arguments in PyType_FromModuleAndSpec() (GH-23410) * There were leaks if Py_tp_bases is used more than once or if some call is failed before setting tp_bases. * There was a crash if the bases argument or the Py_tp_bases slot is not a tuple. * The documentation was not accurate. --- Doc/c-api/type.rst | 6 ++++-- Objects/typeobject.c | 23 ++++++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 84c0a02046a65e..a822b671ac4766 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -157,7 +157,8 @@ The following functions and structs are used to create If *bases* is a tuple, the created heap type contains all types contained in it as base types. - If *bases* is ``NULL``, the *Py_tp_base* slot is used instead. + If *bases* is ``NULL``, the *Py_tp_bases* slot is used instead. + If that also is ``NULL``, the *Py_tp_base* slot is used instead. If that also is ``NULL``, the new type derives from :class:`object`. The *module* argument can be used to record the module in which the new @@ -253,7 +254,8 @@ The following functions and structs are used to create * :c:member:`~PyBufferProcs.bf_getbuffer` * :c:member:`~PyBufferProcs.bf_releasebuffer` - Setting :c:data:`Py_tp_bases` may be problematic on some platforms. + Setting :c:data:`Py_tp_bases` or :c:data:`Py_tp_base` may be + problematic on some platforms. To avoid issues, use the *bases* argument of :py:func:`PyType_FromSpecWithBases` instead. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index fd018b8b032fe6..9ebeeeb2c31682 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2977,26 +2977,40 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) base = slot->pfunc; else if (slot->slot == Py_tp_bases) { bases = slot->pfunc; - Py_INCREF(bases); } } - if (!bases) + if (!bases) { bases = PyTuple_Pack(1, base); - if (!bases) + if (!bases) + goto fail; + } + else if (!PyTuple_Check(bases)) { + PyErr_SetString(PyExc_SystemError, "Py_tp_bases is not a tuple"); goto fail; + } + else { + Py_INCREF(bases); + } } - else + else if (!PyTuple_Check(bases)) { + PyErr_SetString(PyExc_SystemError, "bases is not a tuple"); + goto fail; + } + else { Py_INCREF(bases); + } /* Calculate best base, and check that all bases are type objects */ base = best_base(bases); if (base == NULL) { + Py_DECREF(bases); goto fail; } if (!_PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) { PyErr_Format(PyExc_TypeError, "type '%.100s' is not an acceptable base type", base->tp_name); + Py_DECREF(bases); goto fail; } @@ -3008,7 +3022,6 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) type->tp_as_buffer = &res->as_buffer; /* Set tp_base and tp_bases */ type->tp_bases = bases; - bases = NULL; Py_INCREF(base); type->tp_base = base; From bb0653205a2b6eaf592639ab55d1f71be1098120 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Sat, 21 Nov 2020 11:39:56 +0000 Subject: [PATCH 0616/1261] bpo-42232: mmap module add Darwin specific madvise options. (GH-23076) --- Doc/library/mmap.rst | 2 ++ .../next/macOS/2020-11-01-15-10-28.bpo-42232.2zI1GN.rst | 1 + Modules/mmapmodule.c | 8 ++++++++ 3 files changed, 11 insertions(+) create mode 100644 Misc/NEWS.d/next/macOS/2020-11-01-15-10-28.bpo-42232.2zI1GN.rst diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst index 698c17653786b3..d9825b47c71333 100644 --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -337,6 +337,8 @@ MADV_* Constants MADV_NOCORE MADV_CORE MADV_PROTECT + MADV_FREE_REUSABLE + MADV_FREE_REUSE These options can be passed to :meth:`mmap.madvise`. Not every option will be present on every system. diff --git a/Misc/NEWS.d/next/macOS/2020-11-01-15-10-28.bpo-42232.2zI1GN.rst b/Misc/NEWS.d/next/macOS/2020-11-01-15-10-28.bpo-42232.2zI1GN.rst new file mode 100644 index 00000000000000..d431a9d1e32288 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2020-11-01-15-10-28.bpo-42232.2zI1GN.rst @@ -0,0 +1 @@ +Added Darwin specific madvise options to mmap module. \ No newline at end of file diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 1e9684970f5d38..1e66962d37b0e0 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -1667,6 +1667,14 @@ mmap_exec(PyObject *module) #ifdef MADV_PROTECT ADD_INT_MACRO(module, MADV_PROTECT); #endif + + // Darwin-specific +#ifdef MADV_FREE_REUSABLE // (As MADV_FREE but reclaims more faithful for task_info/Activity Monitor...) + ADD_INT_MACRO(module, MADV_FREE_REUSABLE); +#endif +#ifdef MADV_FREE_REUSE // (Reuse pages previously tagged as reusable) + ADD_INT_MACRO(module, MADV_FREE_REUSE); +#endif #endif // HAVE_MADVISE return 0; } From 31122ebfbbf8c6d7cb9846a08a6aa112c19cf7fc Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 21 Nov 2020 19:17:46 +0200 Subject: [PATCH 0617/1261] bpo-42425: Fix possible leak in initialization of errmap for OSError (GH-23446) --- Objects/exceptions.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c index b14da20db0c4e7..d4824938a0f507 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2547,8 +2547,10 @@ _PyExc_Init(PyThreadState *tstate) do { \ PyObject *_code = PyLong_FromLong(CODE); \ assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \ - if (!_code || PyDict_SetItem(state->errnomap, _code, PyExc_ ## TYPE)) \ + if (!_code || PyDict_SetItem(state->errnomap, _code, PyExc_ ## TYPE)) { \ + Py_XDECREF(_code); \ return _PyStatus_ERR("errmap insertion problem."); \ + } \ Py_DECREF(_code); \ } while (0) From 47a264e02514ed075c078543aa16784b05d6bd0e Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Sat, 21 Nov 2020 20:28:14 +0100 Subject: [PATCH 0618/1261] bpo-1635741: Port _posixsubprocess module to multiphase init (GH-23406) --- ...2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst | 1 + Modules/_posixsubprocess.c | 77 ++++++++++--------- 2 files changed, 43 insertions(+), 35 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst b/Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst new file mode 100644 index 00000000000000..cdaabfcc0910b8 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst @@ -0,0 +1 @@ +Port _posixshmem extension module to multiphase initialization (:pep:`489`). diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 1abe2358aa10b7..46c41d3c20a146 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -85,11 +85,9 @@ get_posixsubprocess_state(PyObject *module) return (_posixsubprocessstate *)state; } -#define _posixsubprocessstate_global get_posixsubprocess_state(PyState_FindModule(&_posixsubprocessmodule)) - /* If gc was disabled, call gc.enable(). Ignore errors. */ static void -_enable_gc(int need_to_reenable_gc, PyObject *gc_module) +_enable_gc(int need_to_reenable_gc, PyObject *gc_module, _posixsubprocessstate *state) { PyObject *result; PyObject *exctype, *val, *tb; @@ -97,7 +95,7 @@ _enable_gc(int need_to_reenable_gc, PyObject *gc_module) if (need_to_reenable_gc) { PyErr_Fetch(&exctype, &val, &tb); result = PyObject_CallMethodNoArgs( - gc_module, _posixsubprocessstate_global->enable); + gc_module, state->enable); if (result == NULL) { /* We might have created a child process at this point, we * we have no good way to handle a failure to reenable GC @@ -758,7 +756,7 @@ do_fork_exec(char *const exec_array[], static PyObject * -subprocess_fork_exec(PyObject* self, PyObject *args) +subprocess_fork_exec(PyObject *module, PyObject *args) { PyObject *gc_module = NULL; PyObject *executable_list, *py_fds_to_keep; @@ -782,6 +780,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) Py_ssize_t arg_num, num_groups = 0; int need_after_fork = 0; int saved_errno = 0; + _posixsubprocessstate *state = get_posixsubprocess_state(module); if (!PyArg_ParseTuple( args, "OOpO!OOiiiiiiiiiiOOOiO:fork_exec", @@ -827,7 +826,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) if (gc_module == NULL) return NULL; result = PyObject_CallMethodNoArgs( - gc_module, _posixsubprocessstate_global->isenabled); + gc_module, state->isenabled); if (result == NULL) { Py_DECREF(gc_module); return NULL; @@ -839,7 +838,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) return NULL; } result = PyObject_CallMethodNoArgs( - gc_module, _posixsubprocessstate_global->disable); + gc_module, state->disable); if (result == NULL) { Py_DECREF(gc_module); return NULL; @@ -1073,7 +1072,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) if (exec_array) _Py_FreeCharPArray(exec_array); - _enable_gc(need_to_reenable_gc, gc_module); + _enable_gc(need_to_reenable_gc, gc_module, state); Py_XDECREF(gc_module); return pid == -1 ? NULL : PyLong_FromPid(pid); @@ -1113,12 +1112,38 @@ Raises: Only on an error in the parent process.\n\ PyDoc_STRVAR(module_doc, "A POSIX helper for the subprocess module."); +static int +_posixsubprocess_exec(PyObject *module) +{ + _posixsubprocessstate *state = get_posixsubprocess_state(module); + + state->disable = PyUnicode_InternFromString("disable"); + if (state->disable == NULL) { + return -1; + } + + state->enable = PyUnicode_InternFromString("enable"); + if (state->enable == NULL) { + return -1; + } + + state->isenabled = PyUnicode_InternFromString("isenabled"); + if (state->isenabled == NULL) { + return -1; + } + + return 0; +} static PyMethodDef module_methods[] = { {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc}, {NULL, NULL} /* sentinel */ }; +static PyModuleDef_Slot _posixsubprocess_slots[] = { + {Py_mod_exec, _posixsubprocess_exec}, + {0, NULL} +}; static int _posixsubprocess_traverse(PyObject *m, visitproc visit, void *arg) { Py_VISIT(get_posixsubprocess_state(m)->disable); @@ -1140,36 +1165,18 @@ static void _posixsubprocess_free(void *m) { static struct PyModuleDef _posixsubprocessmodule = { PyModuleDef_HEAD_INIT, - "_posixsubprocess", - module_doc, - sizeof(_posixsubprocessstate), - module_methods, - NULL, - _posixsubprocess_traverse, - _posixsubprocess_clear, - _posixsubprocess_free, + .m_name = "_posixsubprocess", + .m_doc = module_doc, + .m_size = sizeof(_posixsubprocessstate), + .m_methods = module_methods, + .m_slots = _posixsubprocess_slots, + .m_traverse = _posixsubprocess_traverse, + .m_clear = _posixsubprocess_clear, + .m_free = _posixsubprocess_free, }; PyMODINIT_FUNC PyInit__posixsubprocess(void) { - PyObject* m; - - m = PyState_FindModule(&_posixsubprocessmodule); - if (m != NULL) { - Py_INCREF(m); - return m; - } - - m = PyModule_Create(&_posixsubprocessmodule); - if (m == NULL) { - return NULL; - } - - get_posixsubprocess_state(m)->disable = PyUnicode_InternFromString("disable"); - get_posixsubprocess_state(m)->enable = PyUnicode_InternFromString("enable"); - get_posixsubprocess_state(m)->isenabled = PyUnicode_InternFromString("isenabled"); - - PyState_AddModule(m, &_posixsubprocessmodule); - return m; + return PyModuleDef_Init(&_posixsubprocessmodule); } From 03dc893598b1d22aee289d5e37426abce3b4acc2 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Sat, 21 Nov 2020 20:29:26 +0100 Subject: [PATCH 0619/1261] bpo-1635741: Port select module to multiphase init (GH-23409) --- ...2020-11-19-17-44-36.bpo-1635741.qBZc3o.rst | 2 + Modules/clinic/selectmodule.c.h | 6 +- Modules/selectmodule.c | 187 ++++++++++-------- 3 files changed, 110 insertions(+), 85 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-19-17-44-36.bpo-1635741.qBZc3o.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-19-17-44-36.bpo-1635741.qBZc3o.rst b/Misc/NEWS.d/next/C API/2020-11-19-17-44-36.bpo-1635741.qBZc3o.rst new file mode 100644 index 00000000000000..e66e8d7e406265 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-19-17-44-36.bpo-1635741.qBZc3o.rst @@ -0,0 +1,2 @@ +Port :mod:`select` extension module to multiphase initialization +(:pep:`489`). diff --git a/Modules/clinic/selectmodule.c.h b/Modules/clinic/selectmodule.c.h index 00a78c48477b41..d7095dfb00ead9 100644 --- a/Modules/clinic/selectmodule.c.h +++ b/Modules/clinic/selectmodule.c.h @@ -933,11 +933,11 @@ select_kqueue(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; - if ((type == _selectstate_global->kqueue_queue_Type) && + if ((type == _selectstate_by_type(type)->kqueue_queue_Type) && !_PyArg_NoPositional("kqueue", args)) { goto exit; } - if ((type == _selectstate_global->kqueue_queue_Type) && + if ((type == _selectstate_by_type(type)->kqueue_queue_Type) && !_PyArg_NoKeywords("kqueue", kwargs)) { goto exit; } @@ -1179,4 +1179,4 @@ select_kqueue_control(kqueue_queue_Object *self, PyObject *const *args, Py_ssize #ifndef SELECT_KQUEUE_CONTROL_METHODDEF #define SELECT_KQUEUE_CONTROL_METHODDEF #endif /* !defined(SELECT_KQUEUE_CONTROL_METHODDEF) */ -/*[clinic end generated code: output=162f4f4efa850416 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=cd2062a787e13b35 input=a9049054013a1b77]*/ diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index d02e3905f57e5f..693a833caea77b 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -77,16 +77,16 @@ get_select_state(PyObject *module) return (_selectstate *)state; } -#define _selectstate_global get_select_state(PyState_FindModule(&selectmodule)) +#define _selectstate_by_type(type) get_select_state(PyType_GetModule(type)) /*[clinic input] module select -class select.poll "pollObject *" "&poll_Type" -class select.devpoll "devpollObject *" "&devpoll_Type" -class select.epoll "pyEpoll_Object *" "&pyEpoll_Type" -class select.kqueue "kqueue_queue_Object *" "_selectstate_global->kqueue_queue_Type" +class select.poll "pollObject *" "_selectstate_by_type(type)->poll_Type" +class select.devpoll "devpollObject *" "_selectstate_by_type(type)->devpoll_Type" +class select.epoll "pyEpoll_Object *" "_selectstate_by_type(type)->pyEpoll_Type" +class select.kqueue "kqueue_queue_Object *" "_selectstate_by_type(type)->kqueue_queue_Type" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=41071028e0ede093]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=8072de35824aa327]*/ /* list of Python objects and their file descriptor */ typedef struct { @@ -709,10 +709,10 @@ select_poll_poll_impl(pollObject *self, PyObject *timeout_obj) } static pollObject * -newPollObject(void) +newPollObject(PyObject *module) { pollObject *self; - self = PyObject_New(pollObject, _selectstate_global->poll_Type); + self = PyObject_New(pollObject, get_select_state(module)->poll_Type); if (self == NULL) return NULL; /* ufd_uptodate is a Boolean, denoting whether the @@ -1073,7 +1073,7 @@ static PyGetSetDef devpoll_getsetlist[] = { }; static devpollObject * -newDevPollObject(void) +newDevPollObject(PyObject *module) { devpollObject *self; int fd_devpoll, limit_result; @@ -1103,7 +1103,7 @@ newDevPollObject(void) return NULL; } - self = PyObject_New(devpollObject, _selectstate_global->devpoll_Type); + self = PyObject_New(devpollObject, get_select_state(module)->devpoll_Type); if (self == NULL) { close(fd_devpoll); PyMem_DEL(fds); @@ -1166,7 +1166,7 @@ static PyObject * select_poll_impl(PyObject *module) /*[clinic end generated code: output=16a665a4e1d228c5 input=3f877909d5696bbf]*/ { - return (PyObject *)newPollObject(); + return (PyObject *)newPollObject(module); } #ifdef HAVE_SYS_DEVPOLL_H @@ -1184,7 +1184,7 @@ static PyObject * select_devpoll_impl(PyObject *module) /*[clinic end generated code: output=ea9213cc87fd9581 input=53a1af94564f00a3]*/ { - return (PyObject *)newDevPollObject(); + return (PyObject *)newDevPollObject(module); } #endif @@ -1238,8 +1238,6 @@ typedef struct { SOCKET epfd; /* epoll control file descriptor */ } pyEpoll_Object; -#define pyepoll_CHECK(op) (PyObject_TypeCheck((op), _selectstate_global->pyEpoll_Type)) - static PyObject * pyepoll_err_closed(void) { @@ -1667,7 +1665,8 @@ select_epoll___exit___impl(pyEpoll_Object *self, PyObject *exc_type, PyObject *exc_value, PyObject *exc_tb) /*[clinic end generated code: output=c480f38ce361748e input=7ae81a5a4c1a98d8]*/ { - return PyObject_CallMethodObjArgs((PyObject *)self, _selectstate_global->close, NULL); + _selectstate *state = _selectstate_by_type(Py_TYPE(self)); + return PyObject_CallMethodObjArgs((PyObject *)self, state->close, NULL); } static PyGetSetDef pyepoll_getsetlist[] = { @@ -1741,15 +1740,13 @@ typedef struct { struct kevent e; } kqueue_event_Object; -#define kqueue_event_Check(op) (PyObject_TypeCheck((op), _selectstate_global->kqueue_event_Type)) +#define kqueue_event_Check(op, state) (PyObject_TypeCheck((op), state->kqueue_event_Type)) typedef struct { PyObject_HEAD SOCKET kqfd; /* kqueue control fd */ } kqueue_queue_Object; -#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), _selectstate_global->kqueue_queue_Type)) - #if (SIZEOF_UINTPTR_T != SIZEOF_VOID_P) # error uintptr_t does not match void *! #elif (SIZEOF_UINTPTR_T == SIZEOF_LONG_LONG) @@ -1890,8 +1887,9 @@ kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o, int op) { int result; + _selectstate *state = _selectstate_by_type(Py_TYPE(s)); - if (!kqueue_event_Check(o)) { + if (!kqueue_event_Check(o, state)) { Py_RETURN_NOTIMPLEMENTED; } @@ -2113,6 +2111,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist, struct timespec timeoutspec; struct timespec *ptimeoutspec; _PyTime_t timeout, deadline = 0; + _selectstate *state = _selectstate_by_type(Py_TYPE(self)); if (self->kqfd < 0) return kqueue_queue_err_closed(); @@ -2165,9 +2164,10 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist, PyErr_NoMemory(); goto error; } + _selectstate *state = _selectstate_by_type(Py_TYPE(self)); for (i = 0; i < nchanges; ++i) { ei = PySequence_Fast_GET_ITEM(seq, i); - if (!kqueue_event_Check(ei)) { + if (!kqueue_event_Check(ei, state)) { PyErr_SetString(PyExc_TypeError, "changelist must be an iterable of " "select.kevent objects"); @@ -2229,7 +2229,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist, for (i = 0; i < gotevents; i++) { kqueue_event_Object *ch; - ch = PyObject_New(kqueue_event_Object, _selectstate_global->kqueue_event_Type); + ch = PyObject_New(kqueue_event_Object, state->kqueue_event_Type); if (ch == NULL) { goto error; } @@ -2392,24 +2392,28 @@ On Windows, only sockets are supported; on Unix, all file descriptors."); static int _select_traverse(PyObject *module, visitproc visit, void *arg) { - Py_VISIT(get_select_state(module)->close); - Py_VISIT(get_select_state(module)->poll_Type); - Py_VISIT(get_select_state(module)->devpoll_Type); - Py_VISIT(get_select_state(module)->pyEpoll_Type); - Py_VISIT(get_select_state(module)->kqueue_event_Type); - Py_VISIT(get_select_state(module)->kqueue_queue_Type); + _selectstate *state = get_select_state(module); + + Py_VISIT(state->close); + Py_VISIT(state->poll_Type); + Py_VISIT(state->devpoll_Type); + Py_VISIT(state->pyEpoll_Type); + Py_VISIT(state->kqueue_event_Type); + Py_VISIT(state->kqueue_queue_Type); return 0; } static int _select_clear(PyObject *module) { - Py_CLEAR(get_select_state(module)->close); - Py_CLEAR(get_select_state(module)->poll_Type); - Py_CLEAR(get_select_state(module)->devpoll_Type); - Py_CLEAR(get_select_state(module)->pyEpoll_Type); - Py_CLEAR(get_select_state(module)->kqueue_event_Type); - Py_CLEAR(get_select_state(module)->kqueue_queue_Type); + _selectstate *state = get_select_state(module); + + Py_CLEAR(state->close); + Py_CLEAR(state->poll_Type); + Py_CLEAR(state->devpoll_Type); + Py_CLEAR(state->pyEpoll_Type); + Py_CLEAR(state->kqueue_event_Type); + Py_CLEAR(state->kqueue_queue_Type); return 0; } @@ -2419,30 +2423,18 @@ _select_free(void *module) _select_clear((PyObject *)module); } -static struct PyModuleDef selectmodule = { - PyModuleDef_HEAD_INIT, - "select", - module_doc, - sizeof(_selectstate), - select_methods, - NULL, - _select_traverse, - _select_clear, - _select_free, -}; - -PyMODINIT_FUNC -PyInit_select(void) +int +_select_exec(PyObject *m) { - PyObject *m; - m = PyModule_Create(&selectmodule); - if (m == NULL) - return NULL; + _selectstate *state = get_select_state(m); - get_select_state(m)->close = PyUnicode_InternFromString("close"); - - Py_INCREF(PyExc_OSError); - PyModule_AddObject(m, "error", PyExc_OSError); + state->close = PyUnicode_InternFromString("close"); + if (state->close == NULL) { + return -1; + } + if (PyModule_AddObjectRef(m, "error", PyExc_OSError) < 0) { + return -1; + } #ifdef PIPE_BUF #ifdef HAVE_BROKEN_PIPE_BUF @@ -2462,10 +2454,11 @@ PyInit_select(void) #else { #endif - PyObject *poll_Type = PyType_FromSpec(&poll_Type_spec); - if (poll_Type == NULL) - return NULL; - get_select_state(m)->poll_Type = (PyTypeObject *)poll_Type; + state->poll_Type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &poll_Type_spec, NULL); + if (state->poll_Type == NULL) { + return -1; + } PyModule_AddIntMacro(m, POLLIN); PyModule_AddIntMacro(m, POLLPRI); @@ -2497,19 +2490,22 @@ PyInit_select(void) #endif /* HAVE_POLL */ #ifdef HAVE_SYS_DEVPOLL_H - PyObject *devpoll_Type = PyType_FromSpec(&devpoll_Type_spec); - if (devpoll_Type == NULL) - return NULL; - get_select_state(m)->devpoll_Type = (PyTypeObject *)devpoll_Type; + state->devpoll_Type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &devpoll_Type_spec, NULL); + if (state->devpoll_Type == NULL) { + return -1; + } #endif #ifdef HAVE_EPOLL - PyObject *pyEpoll_Type = PyType_FromSpec(&pyEpoll_Type_spec); - if (pyEpoll_Type == NULL) - return NULL; - get_select_state(m)->pyEpoll_Type = (PyTypeObject *)pyEpoll_Type; - Py_INCREF(pyEpoll_Type); - PyModule_AddObject(m, "epoll", (PyObject *)get_select_state(m)->pyEpoll_Type); + state->pyEpoll_Type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &pyEpoll_Type_spec, NULL); + if (state->pyEpoll_Type == NULL) { + return -1; + } + if (PyModule_AddType(m, state->pyEpoll_Type) < 0) { + return -1; + } PyModule_AddIntMacro(m, EPOLLIN); PyModule_AddIntMacro(m, EPOLLOUT); @@ -2551,19 +2547,23 @@ PyInit_select(void) #endif /* HAVE_EPOLL */ #ifdef HAVE_KQUEUE - PyObject *kqueue_event_Type = PyType_FromSpec(&kqueue_event_Type_spec); - if (kqueue_event_Type == NULL) - return NULL; - get_select_state(m)->kqueue_event_Type = (PyTypeObject *)kqueue_event_Type; - Py_INCREF(get_select_state(m)->kqueue_event_Type); - PyModule_AddObject(m, "kevent", kqueue_event_Type); + state->kqueue_event_Type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &kqueue_event_Type_spec, NULL); + if (state->kqueue_event_Type == NULL) { + return -1; + } + if (PyModule_AddType(m, state->kqueue_event_Type) < 0) { + return -1; + } - PyObject *kqueue_queue_Type = PyType_FromSpec(&kqueue_queue_Type_spec); - if (kqueue_queue_Type == NULL) - return NULL; - get_select_state(m)->kqueue_queue_Type = (PyTypeObject *)kqueue_queue_Type; - Py_INCREF(get_select_state(m)->kqueue_queue_Type); - PyModule_AddObject(m, "kqueue", kqueue_queue_Type); + state->kqueue_queue_Type = (PyTypeObject *)PyType_FromModuleAndSpec( + m, &kqueue_queue_Type_spec, NULL); + if (state->kqueue_queue_Type == NULL) { + return -1; + } + if (PyModule_AddType(m, state->kqueue_queue_Type) < 0) { + return -1; + } /* event filters */ PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ); @@ -2640,5 +2640,28 @@ PyInit_select(void) #endif #endif /* HAVE_KQUEUE */ - return m; + return 0; +} + +static PyModuleDef_Slot _select_slots[] = { + {Py_mod_exec, _select_exec}, + {0, NULL} +}; + +static struct PyModuleDef selectmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "select", + .m_doc = module_doc, + .m_size = sizeof(_selectstate), + .m_methods = select_methods, + .m_slots = _select_slots, + .m_traverse = _select_traverse, + .m_clear = _select_clear, + .m_free = _select_free, +}; + +PyMODINIT_FUNC +PyInit_select(void) +{ + return PyModuleDef_Init(&selectmodule); } From aead64ae58630330d6987c03c7297284e708f97e Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 21 Nov 2020 11:56:24 -0800 Subject: [PATCH 0620/1261] Clarify that Set._from_iterable is not required to be a classmethod. (GH-23272) --- Doc/library/collections.abc.rst | 2 +- Lib/test/test_collections.py | 56 +++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst index db0e25bb0772eb..2345e78a17e4f5 100644 --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -291,7 +291,7 @@ Notes on using :class:`Set` and :class:`MutableSet` as a mixin: :meth:`_from_iterable` which calls ``cls(iterable)`` to produce a new set. If the :class:`Set` mixin is being used in a class with a different constructor signature, you will need to override :meth:`_from_iterable` - with a classmethod that can construct new instances from + with a classmethod or regular method that can construct new instances from an iterable argument. (2) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 7c7f8655b0fbdd..150c2a1c0e3498 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -1559,6 +1559,62 @@ def assertSameSet(self, s1, s2): # coerce both to a real set then check equality self.assertSetEqual(set(s1), set(s2)) + def test_Set_from_iterable(self): + """Verify _from_iterable overriden to an instance method works.""" + class SetUsingInstanceFromIterable(MutableSet): + def __init__(self, values, created_by): + if not created_by: + raise ValueError(f'created_by must be specified') + self.created_by = created_by + self._values = set(values) + + def _from_iterable(self, values): + return type(self)(values, 'from_iterable') + + def __contains__(self, value): + return value in self._values + + def __iter__(self): + yield from self._values + + def __len__(self): + return len(self._values) + + def add(self, value): + self._values.add(value) + + def discard(self, value): + self._values.discard(value) + + impl = SetUsingInstanceFromIterable([1, 2, 3], 'test') + + actual = impl - {1} + self.assertIsInstance(actual, SetUsingInstanceFromIterable) + self.assertEqual('from_iterable', actual.created_by) + self.assertEqual({2, 3}, actual) + + actual = impl | {4} + self.assertIsInstance(actual, SetUsingInstanceFromIterable) + self.assertEqual('from_iterable', actual.created_by) + self.assertEqual({1, 2, 3, 4}, actual) + + actual = impl & {2} + self.assertIsInstance(actual, SetUsingInstanceFromIterable) + self.assertEqual('from_iterable', actual.created_by) + self.assertEqual({2}, actual) + + actual = impl ^ {3, 4} + self.assertIsInstance(actual, SetUsingInstanceFromIterable) + self.assertEqual('from_iterable', actual.created_by) + self.assertEqual({1, 2, 4}, actual) + + # NOTE: ixor'ing with a list is important here: internally, __ixor__ + # only calls _from_iterable if the other value isn't already a Set. + impl ^= [3, 4] + self.assertIsInstance(impl, SetUsingInstanceFromIterable) + self.assertEqual('test', impl.created_by) + self.assertEqual({1, 2, 4}, impl) + def test_Set_interoperability_with_real_sets(self): # Issue: 8743 class ListSet(Set): From 01f94c5bd8cf3afb434a2556120f5c912f87b199 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sun, 22 Nov 2020 02:13:11 +0100 Subject: [PATCH 0621/1261] bpo-38443: Check that the specified universal architectures work (GH-22910) As [bpo-38443]() says the error message from configure when specifying --enable-universalsdk with a set of architectures that is not supported by the compiler is not very helpful. This PR explicitly checks if the compiler works and bails out if it doesn't. --- .../2020-10-23-10-26-53.bpo-38443.vu64tl.rst | 2 ++ configure | 25 +++++++++++++++++++ configure.ac | 7 ++++++ 3 files changed, 34 insertions(+) create mode 100644 Misc/NEWS.d/next/macOS/2020-10-23-10-26-53.bpo-38443.vu64tl.rst diff --git a/Misc/NEWS.d/next/macOS/2020-10-23-10-26-53.bpo-38443.vu64tl.rst b/Misc/NEWS.d/next/macOS/2020-10-23-10-26-53.bpo-38443.vu64tl.rst new file mode 100644 index 00000000000000..008c972e5c6ab0 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2020-10-23-10-26-53.bpo-38443.vu64tl.rst @@ -0,0 +1,2 @@ +The ``--enable-universalsdk`` and ``--with-universal-archs`` options for the +configure script now check that the specified architectures can be used. diff --git a/configure b/configure index e665d135e67b27..9ee750b70f4a19 100755 --- a/configure +++ b/configure @@ -7611,6 +7611,31 @@ $as_echo_n "checking which MACOSX_DEPLOYMENT_TARGET to use... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MACOSX_DEPLOYMENT_TARGET" >&5 $as_echo "$MACOSX_DEPLOYMENT_TARGET" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if specified universal architectures work" >&5 +$as_echo_n "checking if specified universal architectures work... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +printf("%d", 42); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "check config.log and use the '--with-universal-archs' option" "$LINENO" 5 + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + # end of Darwin* tests ;; esac diff --git a/configure.ac b/configure.ac index 668715cdf8f15a..7f7dfa588a8144 100644 --- a/configure.ac +++ b/configure.ac @@ -1978,6 +1978,13 @@ yes) EXPORT_MACOSX_DEPLOYMENT_TARGET='' AC_MSG_RESULT($MACOSX_DEPLOYMENT_TARGET) + AC_MSG_CHECKING(if specified universal architectures work) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[printf("%d", 42);]])], + [AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) + AC_MSG_ERROR(check config.log and use the '--with-universal-archs' option) + ]) + # end of Darwin* tests ;; esac From c721486877baa2c40e799a2828f36fc7258d1dcf Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sun, 22 Nov 2020 03:05:34 +0100 Subject: [PATCH 0622/1261] bpo-42361: Use Tcl/Tk 8.6.10 when building the installer on recent macOS (GH-23293) Building on older versions, and in particular macOS 10.9 still use Tk 8.6.8 because of build problems on that version of macOS. --- Mac/BuildScript/build-installer.py | 41 +++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 0e76d3ca5bbc2e..184add4c4f06c5 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -153,6 +153,9 @@ def getFullVersion(): def getDeptargetTuple(): return tuple([int(n) for n in DEPTARGET.split('.')[0:2]]) +def getBuildTuple(): + return tuple([int(n) for n in platform.mac_ver()[0].split('.')[0:2]]) + def getTargetCompilers(): target_cc_map = { '10.4': ('gcc-4.0', 'g++-4.0'), @@ -192,6 +195,13 @@ def getTargetCompilers(): def internalTk(): return getDeptargetTuple() >= (10, 6) +# Do we use 8.6.8 when building our own copy +# of Tcl/Tk or a modern version. +# We use the old version when buildin on +# old versions of macOS due to build issues. +def useOldTk(): + return getBuildTuple() < (10, 15) + def tweak_tcl_build(basedir, archList): with open("Makefile", "r") as fp: @@ -245,11 +255,26 @@ def library_recipes(): ]) if internalTk(): + if useOldTk(): + tcl_tk_ver='8.6.8' + tcl_checksum='81656d3367af032e0ae6157eff134f89' + + tk_checksum='5e0faecba458ee1386078fb228d008ba' + tk_patches = ['tk868_on_10_8_10_9.patch'] + + else: + tcl_tk_ver='8.6.10' + tcl_checksum='97c55573f8520bcab74e21bfd8d0aadc' + + tk_checksum='602a47ad9ecac7bf655ada729d140a94' + tk_patches = [ ] + + result.extend([ dict( - name="Tcl 8.6.8", - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tcl8.6.8-src.tar.gz", - checksum='81656d3367af032e0ae6157eff134f89', + name="Tcl %s"%(tcl_tk_ver,), + url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tcl%s-src.tar.gz"%(tcl_tk_ver,), + checksum=tcl_checksum, buildDir="unix", configure_pre=[ '--enable-shared', @@ -264,12 +289,10 @@ def library_recipes(): }, ), dict( - name="Tk 8.6.8", - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tk8.6.8-src.tar.gz", - checksum='5e0faecba458ee1386078fb228d008ba', - patches=[ - "tk868_on_10_8_10_9.patch", - ], + name="Tk %s"%(tcl_tk_ver,), + url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tk%s-src.tar.gz"%(tcl_tk_ver,), + checksum=tk_checksum, + patches=tk_patches, buildDir="unix", configure_pre=[ '--enable-aqua', From 9828530f40b8706cd9ae18286fcdca1d5e705db2 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sun, 22 Nov 2020 03:17:18 +0100 Subject: [PATCH 0623/1261] bpo-41100: Stripping '-arch arm64' didn't work after all (GH-23280) --- Lib/_osx_support.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py index 8a696ee9895e9b..0cbfeed0c4ecfd 100644 --- a/Lib/_osx_support.py +++ b/Lib/_osx_support.py @@ -128,7 +128,7 @@ def _get_system_version_tuple(): _SYSTEM_VERSION_TUPLE = () return _SYSTEM_VERSION_TUPLE - + def _remove_original_values(_config_vars): """Remove original unmodified values for testing""" @@ -357,7 +357,7 @@ def compiler_fixup(compiler_so, cc_args): elif not _supports_arm64_builds(): # Look for "-arch arm64" and drop that - for idx in range(len(compiler_so)): + for idx in reversed(range(len(compiler_so))): if compiler_so[idx] == '-arch' and compiler_so[idx+1] == "arm64": del compiler_so[idx:idx+2] From 7903bc9c9bc01926c51e8ffe6036ccd159679f51 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 22 Nov 2020 07:06:51 +0200 Subject: [PATCH 0624/1261] bpo-42426: IDLE: Fix reporting offset of the RE error in searchengine (GH-23447) --- Lib/idlelib/NEWS.txt | 2 ++ Lib/idlelib/idle_test/test_searchengine.py | 6 ++++-- Lib/idlelib/searchengine.py | 11 ++++------- .../IDLE/2020-11-21-17-21-21.bpo-42426.kNnPoC.rst | 1 + 4 files changed, 11 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-11-21-17-21-21.bpo-42426.kNnPoC.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index c9f28f62a1a5d1..34f28d6084f7a4 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2021-10-04? ====================================== +bpo-42426: Fix reporting offset of the RE error in searchengine. + bpo-42416: Get docstrings for IDLE calltips more often by using inspect.getdoc. diff --git a/Lib/idlelib/idle_test/test_searchengine.py b/Lib/idlelib/idle_test/test_searchengine.py index 3d26d62a95a873..f8401ce9380f25 100644 --- a/Lib/idlelib/idle_test/test_searchengine.py +++ b/Lib/idlelib/idle_test/test_searchengine.py @@ -175,11 +175,13 @@ def test_getprog(self): engine.setpat('') Equal(engine.getprog(), None) + Equal(Mbox.showerror.message, + 'Error: Empty regular expression') engine.setpat('+') engine.revar.set(1) Equal(engine.getprog(), None) - self.assertEqual(Mbox.showerror.message, - 'Error: nothing to repeat at position 0\nPattern: +') + Equal(Mbox.showerror.message, + 'Error: nothing to repeat\nPattern: +\nOffset: 0') def test_report_error(self): showerror = Mbox.showerror diff --git a/Lib/idlelib/searchengine.py b/Lib/idlelib/searchengine.py index 911e7d4691cac1..a50038e282ba6c 100644 --- a/Lib/idlelib/searchengine.py +++ b/Lib/idlelib/searchengine.py @@ -84,20 +84,17 @@ def getprog(self): flags = flags | re.IGNORECASE try: prog = re.compile(pat, flags) - except re.error as what: - args = what.args - msg = args[0] - col = args[1] if len(args) >= 2 else -1 - self.report_error(pat, msg, col) + except re.error as e: + self.report_error(pat, e.msg, e.pos) return None return prog - def report_error(self, pat, msg, col=-1): + def report_error(self, pat, msg, col=None): # Derived class could override this with something fancier msg = "Error: " + str(msg) if pat: msg = msg + "\nPattern: " + str(pat) - if col >= 0: + if col is not None: msg = msg + "\nOffset: " + str(col) tkMessageBox.showerror("Regular expression error", msg, master=self.root) diff --git a/Misc/NEWS.d/next/IDLE/2020-11-21-17-21-21.bpo-42426.kNnPoC.rst b/Misc/NEWS.d/next/IDLE/2020-11-21-17-21-21.bpo-42426.kNnPoC.rst new file mode 100644 index 00000000000000..0ab7972aad982e --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-11-21-17-21-21.bpo-42426.kNnPoC.rst @@ -0,0 +1 @@ +Fix reporting offset of the RE error in searchengine. From 601627c2d08bae9b449fef10dc175dfe762b0272 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sun, 22 Nov 2020 06:14:25 +0100 Subject: [PATCH 0625/1261] bpo-41116: Ensure system supplied libraries are found on macOS 11 (GH-23301) On macOS system provided libraries are in a shared library cache and not at their usual location. This PR teaches distutils to search in the SDK, even if there was no "-sysroot" argument in the compiler flags. --- Lib/_osx_support.py | 34 +++++++++++++++++-- Lib/distutils/unixccompiler.py | 2 +- .../2020-11-15-16-43-45.bpo-41116.oCkbrF.rst | 1 + setup.py | 31 +++-------------- 4 files changed, 38 insertions(+), 30 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2020-11-15-16-43-45.bpo-41116.oCkbrF.rst diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py index 0cbfeed0c4ecfd..37975fe8a3eefa 100644 --- a/Lib/_osx_support.py +++ b/Lib/_osx_support.py @@ -52,7 +52,7 @@ def _find_executable(executable, path=None): return executable -def _read_output(commandstring): +def _read_output(commandstring, capture_stderr=False): """Output from successful command execution or None""" # Similar to os.popen(commandstring, "r").read(), # but without actually using os.popen because that @@ -67,7 +67,10 @@ def _read_output(commandstring): os.getpid(),), "w+b") with contextlib.closing(fp) as fp: - cmd = "%s 2>/dev/null >'%s'" % (commandstring, fp.name) + if capture_stderr: + cmd = "%s >'%s' 2>&1" % (commandstring, fp.name) + else: + cmd = "%s 2>/dev/null >'%s'" % (commandstring, fp.name) return fp.read().decode('utf-8').strip() if not os.system(cmd) else None @@ -145,6 +148,33 @@ def _save_modified_value(_config_vars, cv, newvalue): _config_vars[_INITPRE + cv] = oldvalue _config_vars[cv] = newvalue + +_cache_default_sysroot = None +def _default_sysroot(cc): + """ Returns the root of the default SDK for this system, or '/' """ + global _cache_default_sysroot + + if _cache_default_sysroot is not None: + return _cache_default_sysroot + + contents = _read_output('%s -c -E -v - "): + in_incdirs = True + elif line.startswith("End of search list"): + in_incdirs = False + elif in_incdirs: + line = line.strip() + if line == '/usr/include': + _cache_default_sysroot = '/' + elif line.endswith(".sdk/usr/include"): + _cache_default_sysroot = line[:-12] + if _cache_default_sysroot is None: + _cache_default_sysroot = '/' + + return _cache_default_sysroot + def _supports_universal_builds(): """Returns True if universal builds are supported on this system""" # As an approximation, we assume that if we are running on 10.4 or above, diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py index 4d7a6de740ab3a..f0792de74a1a48 100644 --- a/Lib/distutils/unixccompiler.py +++ b/Lib/distutils/unixccompiler.py @@ -290,7 +290,7 @@ def find_library_file(self, dirs, lib, debug=0): cflags = sysconfig.get_config_var('CFLAGS') m = re.search(r'-isysroot\s*(\S+)', cflags) if m is None: - sysroot = '/' + sysroot = _osx_support._default_sysroot(sysconfig.get_config_var('CC')) else: sysroot = m.group(1) diff --git a/Misc/NEWS.d/next/macOS/2020-11-15-16-43-45.bpo-41116.oCkbrF.rst b/Misc/NEWS.d/next/macOS/2020-11-15-16-43-45.bpo-41116.oCkbrF.rst new file mode 100644 index 00000000000000..c982224e92d719 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2020-11-15-16-43-45.bpo-41116.oCkbrF.rst @@ -0,0 +1 @@ +Ensure distutils.unixxcompiler.find_library_file can find system provided libraries on macOS 11. \ No newline at end of file diff --git a/setup.py b/setup.py index 6546544a99d0d9..398d9251a6c410 100644 --- a/setup.py +++ b/setup.py @@ -9,6 +9,7 @@ import sys import sysconfig from glob import glob, escape +import _osx_support try: @@ -176,34 +177,10 @@ def macosx_sdk_root(): m = re.search(r'-isysroot\s*(\S+)', cflags) if m is not None: MACOS_SDK_ROOT = m.group(1) - MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' else: - MACOS_SDK_ROOT = '/' - MACOS_SDK_SPECIFIED = False - cc = sysconfig.get_config_var('CC') - tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() - try: - os.unlink(tmpfile) - except: - pass - ret = run_command('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) - in_incdirs = False - try: - if ret == 0: - with open(tmpfile) as fp: - for line in fp.readlines(): - if line.startswith("#include <...>"): - in_incdirs = True - elif line.startswith("End of search list"): - in_incdirs = False - elif in_incdirs: - line = line.strip() - if line == '/usr/include': - MACOS_SDK_ROOT = '/' - elif line.endswith(".sdk/usr/include"): - MACOS_SDK_ROOT = line[:-12] - finally: - os.unlink(tmpfile) + MACOS_SDK_ROOT = _osx_support._default_sysroot( + sysconfig.get_config_var('CC')) + MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' return MACOS_SDK_ROOT From 6b933c0cd6dd91050408196fc90afffdb62d1434 Mon Sep 17 00:00:00 2001 From: Ram Rachum Date: Sun, 22 Nov 2020 07:59:48 +0200 Subject: [PATCH 0626/1261] bpo-42391: Clarify documentation of TestCase.assertIs (GH-23348) Removing 'evaluate' makes it more consistent with other assertX entries. --- Doc/library/unittest.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 51e10119d3e8d0..0a0993518efddc 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -897,8 +897,7 @@ Test cases .. method:: assertIs(first, second, msg=None) assertIsNot(first, second, msg=None) - Test that *first* and *second* evaluate (or don't evaluate) to the - same object. + Test that *first* and *second* are (or are not) the same object. .. versionadded:: 3.1 From 8fc3186bfa40d38368478163fd36cb67087562fa Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 22 Nov 2020 10:28:34 +0200 Subject: [PATCH 0627/1261] bpo-42427: Use the errno attribute of OSError instead of args[0] (GH-23449) --- Lib/asyncore.py | 16 ++++++++-------- Lib/smtpd.py | 2 +- Lib/socket.py | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Lib/asyncore.py b/Lib/asyncore.py index ce16f11a2f5cee..eeea48888616d7 100644 --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -113,7 +113,7 @@ def readwrite(obj, flags): if flags & (select.POLLHUP | select.POLLERR | select.POLLNVAL): obj.handle_close() except OSError as e: - if e.args[0] not in _DISCONNECTED: + if e.errno not in _DISCONNECTED: obj.handle_error() else: obj.handle_close() @@ -236,7 +236,7 @@ def __init__(self, sock=None, map=None): try: self.addr = sock.getpeername() except OSError as err: - if err.args[0] in (ENOTCONN, EINVAL): + if err.errno in (ENOTCONN, EINVAL): # To handle the case where we got an unconnected # socket. self.connected = False @@ -346,7 +346,7 @@ def accept(self): except TypeError: return None except OSError as why: - if why.args[0] in (EWOULDBLOCK, ECONNABORTED, EAGAIN): + if why.errno in (EWOULDBLOCK, ECONNABORTED, EAGAIN): return None else: raise @@ -358,9 +358,9 @@ def send(self, data): result = self.socket.send(data) return result except OSError as why: - if why.args[0] == EWOULDBLOCK: + if why.errno == EWOULDBLOCK: return 0 - elif why.args[0] in _DISCONNECTED: + elif why.errno in _DISCONNECTED: self.handle_close() return 0 else: @@ -378,7 +378,7 @@ def recv(self, buffer_size): return data except OSError as why: # winsock sometimes raises ENOTCONN - if why.args[0] in _DISCONNECTED: + if why.errno in _DISCONNECTED: self.handle_close() return b'' else: @@ -393,7 +393,7 @@ def close(self): try: self.socket.close() except OSError as why: - if why.args[0] not in (ENOTCONN, EBADF): + if why.errno not in (ENOTCONN, EBADF): raise # log and log_info may be overridden to provide more sophisticated @@ -557,7 +557,7 @@ def close_all(map=None, ignore_all=False): try: x.close() except OSError as x: - if x.args[0] == EBADF: + if x.errno == EBADF: pass elif not ignore_all: raise diff --git a/Lib/smtpd.py b/Lib/smtpd.py index 8f1a22e937871d..1e2adc87a2bf2a 100755 --- a/Lib/smtpd.py +++ b/Lib/smtpd.py @@ -163,7 +163,7 @@ def __init__(self, server, conn, addr, data_size_limit=DATA_SIZE_DEFAULT, # a race condition may occur if the other end is closing # before we can get the peername self.close() - if err.args[0] != errno.ENOTCONN: + if err.errno != errno.ENOTCONN: raise return print('Peer:', repr(self.peer), file=DEBUGSTREAM) diff --git a/Lib/socket.py b/Lib/socket.py index 54a380787601ea..5276cc8ba3d619 100755 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -706,7 +706,7 @@ def readinto(self, b): self._timeout_occurred = True raise except error as e: - if e.args[0] in _blocking_errnos: + if e.errno in _blocking_errnos: return None raise @@ -722,7 +722,7 @@ def write(self, b): return self._sock.send(b) except error as e: # XXX what about EINTR? - if e.args[0] in _blocking_errnos: + if e.errno in _blocking_errnos: return None raise From dee48010ef91c918f52a50b093f996bf221ed52d Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 22 Nov 2020 13:25:02 +0200 Subject: [PATCH 0628/1261] bpo-42423: Accept single base class in PyType_FromModuleAndSpec() (GH-23441) --- Doc/c-api/type.rst | 8 ++++---- Doc/whatsnew/3.10.rst | 4 ++++ .../next/C API/2020-11-21-12-27-19.bpo-42423.ByJHhY.rst | 3 +++ Modules/_hashopenssl.c | 9 +-------- Modules/_ssl.c | 7 +------ Objects/structseq.c | 9 +-------- Objects/typeobject.c | 5 +++-- 7 files changed, 17 insertions(+), 28 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-21-12-27-19.bpo-42423.ByJHhY.rst diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index a822b671ac4766..a869859dd421d1 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -154,9 +154,8 @@ The following functions and structs are used to create Creates and returns a heap type object from the *spec* (:const:`Py_TPFLAGS_HEAPTYPE`). - If *bases* is a tuple, the created heap type contains all types contained - in it as base types. - + The *bases* argument can be used to specify base classes; it can either + be only one class or a tuple of classes. If *bases* is ``NULL``, the *Py_tp_bases* slot is used instead. If that also is ``NULL``, the *Py_tp_base* slot is used instead. If that also is ``NULL``, the new type derives from :class:`object`. @@ -174,7 +173,8 @@ The following functions and structs are used to create .. versionchanged:: 3.10 - The function now accepts NULL ``tp_doc`` slot. + The function now accepts a single class as the *bases* argument and + ``NULL`` as the ``tp_doc`` slot. .. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 16cb7efe2984ea..ce66b1de1b7f20 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -512,6 +512,10 @@ New Features reference count of an object and return the object. (Contributed by Victor Stinner in :issue:`42262`.) +* The :c:func:`PyType_FromSpecWithBases` and :c:func:`PyType_FromModuleAndSpec` + functions now accept a single class as the *bases* argument. + (Contributed by Serhiy Storchaka in :issue:`42423`.) + * The :c:func:`PyType_FromModuleAndSpec` function now accepts NULL ``tp_doc`` slot. (Contributed by Hai Shi in :issue:`41832`.) diff --git a/Misc/NEWS.d/next/C API/2020-11-21-12-27-19.bpo-42423.ByJHhY.rst b/Misc/NEWS.d/next/C API/2020-11-21-12-27-19.bpo-42423.ByJHhY.rst new file mode 100644 index 00000000000000..046a89d7eb8392 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-21-12-27-19.bpo-42423.ByJHhY.rst @@ -0,0 +1,3 @@ +The :c:func:`PyType_FromSpecWithBases` and +:c:func:`PyType_FromModuleAndSpec` functions now accept a single class as +the *bases* argument. diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index 56d2a77049e349..7e176cf21d6297 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -2038,21 +2038,14 @@ hashlib_init_evpxoftype(PyObject *module) { #ifdef PY_OPENSSL_HAS_SHAKE _hashlibstate *state = get_hashlib_state(module); - PyObject *bases; if (state->EVPtype == NULL) { return -1; } - bases = PyTuple_Pack(1, state->EVPtype); - if (bases == NULL) { - return -1; - } - state->EVPXOFtype = (PyTypeObject *)PyType_FromSpecWithBases( - &EVPXOFtype_spec, bases + &EVPXOFtype_spec, (PyObject *)state->EVPtype ); - Py_DECREF(bases); if (state->EVPXOFtype == NULL) { return -1; } diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 130dce40eec71a..6f799ee6618520 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -5955,12 +5955,7 @@ do { \ if (PyModule_AddObjectRef(module, name, exc) < 0) goto error; \ } while(0) - bases = PyTuple_Pack(1, PyExc_OSError); - if (bases == NULL) { - goto error; - } - PySSLErrorObject = PyType_FromSpecWithBases(&sslerror_type_spec, bases); - Py_CLEAR(bases); + PySSLErrorObject = PyType_FromSpecWithBases(&sslerror_type_spec, PyExc_OSError); if (PySSLErrorObject == NULL) { goto error; } diff --git a/Objects/structseq.c b/Objects/structseq.c index 5caa3bd52e4d4f..bb28e113978b39 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -492,7 +492,6 @@ PyTypeObject * PyStructSequence_NewType(PyStructSequence_Desc *desc) { PyMemberDef *members; - PyObject *bases; PyTypeObject *type; PyType_Slot slots[8]; PyType_Spec spec; @@ -526,13 +525,7 @@ PyStructSequence_NewType(PyStructSequence_Desc *desc) spec.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC; spec.slots = slots; - bases = PyTuple_Pack(1, &PyTuple_Type); - if (bases == NULL) { - PyMem_FREE(members); - return NULL; - } - type = (PyTypeObject *)PyType_FromSpecWithBases(&spec, bases); - Py_DECREF(bases); + type = (PyTypeObject *)PyType_FromSpecWithBases(&spec, (PyObject *)&PyTuple_Type); PyMem_FREE(members); if (type == NULL) { return NULL; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 9ebeeeb2c31682..3a6143a8ad6135 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2993,8 +2993,9 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) } } else if (!PyTuple_Check(bases)) { - PyErr_SetString(PyExc_SystemError, "bases is not a tuple"); - goto fail; + bases = PyTuple_Pack(1, bases); + if (!bases) + goto fail; } else { Py_INCREF(bases); From d17f149260d22069cd62f90637947f203c77d60f Mon Sep 17 00:00:00 2001 From: John Belmonte Date: Sun, 22 Nov 2020 23:54:19 +0900 Subject: [PATCH 0629/1261] Doc: fix typo in typing.Type docs (GH-23460) --- Doc/library/typing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 67fd55e7b8a24f..b07bb8943d16fd 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -641,7 +641,7 @@ These can be used as types in annotations using ``[]``, each having a unique syn :ref:`type variables `, and unions of any of these types. For example:: - def new_non_team_user(user_class: Type[Union[BaseUser, ProUser]]): ... + def new_non_team_user(user_class: Type[Union[BasicUser, ProUser]]): ... ``Type[Any]`` is equivalent to ``Type`` which in turn is equivalent to ``type``, which is the root of Python's metaclass hierarchy. From 615608a883721731597eed6bf7256133cb9f4fca Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 22 Nov 2020 22:00:53 +0200 Subject: [PATCH 0630/1261] bpo-42435: Speed up comparison of bytes and bytearray object (GH--23461) * Speed up comparison of bytes objects with non-bytes objects when option -b is specified. * Speed up comparison of bytarray objects with non-buffer object. --- .../2020-11-22-14-34-55.bpo-42435.uwlB2W.rst | 2 ++ Objects/bytearrayobject.c | 20 ++++++--------- Objects/bytesobject.c | 25 +++---------------- 3 files changed, 14 insertions(+), 33 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-22-14-34-55.bpo-42435.uwlB2W.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-22-14-34-55.bpo-42435.uwlB2W.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-22-14-34-55.bpo-42435.uwlB2W.rst new file mode 100644 index 00000000000000..46a8486b78a68a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-22-14-34-55.bpo-42435.uwlB2W.rst @@ -0,0 +1,2 @@ +Speed up comparison of bytes objects with non-bytes objects when option :option:`-b` +is specified. Speed up comparison of bytarray objects with non-buffer object. diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 8b57fb679d31dc..805707a4529c62 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -1005,23 +1005,19 @@ bytearray_richcompare(PyObject *self, PyObject *other, int op) { Py_ssize_t self_size, other_size; Py_buffer self_bytes, other_bytes; - int cmp, rc; + int cmp; /* Bytes can be compared to anything that supports the (binary) buffer API. Except that a comparison with Unicode is always an error, even if the comparison is for equality. */ - rc = PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type); - if (!rc) - rc = PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type); - if (rc < 0) - return NULL; - if (rc) { - if (_Py_GetConfig()->bytes_warning && (op == Py_EQ || op == Py_NE)) { - if (PyErr_WarnEx(PyExc_BytesWarning, - "Comparison between bytearray and string", 1)) - return NULL; + if (!PyObject_CheckBuffer(self) || !PyObject_CheckBuffer(other)) { + if (PyUnicode_Check(self) || PyUnicode_Check(other)) { + if (_Py_GetConfig()->bytes_warning && (op == Py_EQ || op == Py_NE)) { + if (PyErr_WarnEx(PyExc_BytesWarning, + "Comparison between bytearray and string", 1)) + return NULL; + } } - Py_RETURN_NOTIMPLEMENTED; } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 990730cd8cdc10..bb844090b8622f 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1538,36 +1538,19 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op) int c; Py_ssize_t len_a, len_b; Py_ssize_t min_len; - int rc; /* Make sure both arguments are strings. */ if (!(PyBytes_Check(a) && PyBytes_Check(b))) { if (_Py_GetConfig()->bytes_warning && (op == Py_EQ || op == Py_NE)) { - rc = PyObject_IsInstance((PyObject*)a, - (PyObject*)&PyUnicode_Type); - if (!rc) - rc = PyObject_IsInstance((PyObject*)b, - (PyObject*)&PyUnicode_Type); - if (rc < 0) - return NULL; - if (rc) { + if (PyUnicode_Check(a) || PyUnicode_Check(b)) { if (PyErr_WarnEx(PyExc_BytesWarning, "Comparison between bytes and string", 1)) return NULL; } - else { - rc = PyObject_IsInstance((PyObject*)a, - (PyObject*)&PyLong_Type); - if (!rc) - rc = PyObject_IsInstance((PyObject*)b, - (PyObject*)&PyLong_Type); - if (rc < 0) + if (PyLong_Check(a) || PyLong_Check(b)) { + if (PyErr_WarnEx(PyExc_BytesWarning, + "Comparison between bytes and int", 1)) return NULL; - if (rc) { - if (PyErr_WarnEx(PyExc_BytesWarning, - "Comparison between bytes and int", 1)) - return NULL; - } } } Py_RETURN_NOTIMPLEMENTED; From f7713a22c8fb054ab007891f835334acf0ee67d3 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 22 Nov 2020 22:48:52 +0200 Subject: [PATCH 0631/1261] bpo-42328: Fix tkinter.ttk.Style.map(). (GH-23300) The function accepts now the representation of the default state as empty sequence (as returned by Style.map()). The structure of the result is now the same on all platform and does not depend on the value of wantobjects. --- Lib/tkinter/test/test_ttk/test_functions.py | 7 +- Lib/tkinter/test/test_ttk/test_style.py | 90 +++++++++++++++++-- Lib/tkinter/ttk.py | 38 ++++---- .../2020-11-15-17-02-00.bpo-42328.bqpPlR.rst | 4 + 4 files changed, 111 insertions(+), 28 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-15-17-02-00.bpo-42328.bqpPlR.rst diff --git a/Lib/tkinter/test/test_ttk/test_functions.py b/Lib/tkinter/test/test_ttk/test_functions.py index f8e69a9f4165d6..5c23d6fecf8b42 100644 --- a/Lib/tkinter/test/test_ttk/test_functions.py +++ b/Lib/tkinter/test/test_ttk/test_functions.py @@ -137,6 +137,9 @@ def test_format_mapdict(self): result = ttk._format_mapdict(opts) self.assertEqual(result, ('-üñíćódè', 'á vãl')) + self.assertEqual(ttk._format_mapdict({'opt': [('value',)]}), + ('-opt', '{} value')) + # empty states valid = {'opt': [('', '', 'hi')]} self.assertEqual(ttk._format_mapdict(valid), ('-opt', '{ } hi')) @@ -159,10 +162,6 @@ def test_format_mapdict(self): opts = {'a': None} self.assertRaises(TypeError, ttk._format_mapdict, opts) - # items in the value must have size >= 2 - self.assertRaises(IndexError, ttk._format_mapdict, - {'a': [('invalid', )]}) - def test_format_elemcreate(self): self.assertTrue(ttk._format_elemcreate(None), (None, ())) diff --git a/Lib/tkinter/test/test_ttk/test_style.py b/Lib/tkinter/test/test_ttk/test_style.py index 3537536d81bc56..54e913311766f1 100644 --- a/Lib/tkinter/test/test_ttk/test_style.py +++ b/Lib/tkinter/test/test_ttk/test_style.py @@ -1,11 +1,22 @@ import unittest import tkinter from tkinter import ttk +from test import support from test.support import requires, run_unittest from tkinter.test.support import AbstractTkTest requires('gui') +CLASS_NAMES = [ + '.', 'ComboboxPopdownFrame', 'Heading', + 'Horizontal.TProgressbar', 'Horizontal.TScale', 'Item', 'Sash', + 'TButton', 'TCheckbutton', 'TCombobox', 'TEntry', + 'TLabelframe', 'TLabelframe.Label', 'TMenubutton', + 'TNotebook', 'TNotebook.Tab', 'Toolbutton', 'TProgressbar', + 'TRadiobutton', 'Treeview', 'TScale', 'TScrollbar', 'TSpinbox', + 'Vertical.TProgressbar', 'Vertical.TScale' +] + class StyleTest(AbstractTkTest, unittest.TestCase): def setUp(self): @@ -23,11 +34,36 @@ def test_configure(self): def test_map(self): style = self.style - style.map('TButton', background=[('active', 'background', 'blue')]) - self.assertEqual(style.map('TButton', 'background'), - [('active', 'background', 'blue')] if self.wantobjects else - [('active background', 'blue')]) - self.assertIsInstance(style.map('TButton'), dict) + + # Single state + for states in ['active'], [('active',)]: + with self.subTest(states=states): + style.map('TButton', background=[(*states, 'white')]) + expected = [('active', 'white')] + self.assertEqual(style.map('TButton', 'background'), expected) + m = style.map('TButton') + self.assertIsInstance(m, dict) + self.assertEqual(m['background'], expected) + + # Multiple states + for states in ['pressed', '!disabled'], ['pressed !disabled'], [('pressed', '!disabled')]: + with self.subTest(states=states): + style.map('TButton', background=[(*states, 'black')]) + expected = [('pressed', '!disabled', 'black')] + self.assertEqual(style.map('TButton', 'background'), expected) + m = style.map('TButton') + self.assertIsInstance(m, dict) + self.assertEqual(m['background'], expected) + + # Default state + for states in [], [''], [()]: + with self.subTest(states=states): + style.map('TButton', background=[(*states, 'grey')]) + expected = [('grey',)] + self.assertEqual(style.map('TButton', 'background'), expected) + m = style.map('TButton') + self.assertIsInstance(m, dict) + self.assertEqual(m['background'], expected) def test_lookup(self): @@ -86,6 +122,50 @@ def test_theme_use(self): self.style.theme_use(curr_theme) + def test_configure_custom_copy(self): + style = self.style + + curr_theme = self.style.theme_use() + self.addCleanup(self.style.theme_use, curr_theme) + for theme in self.style.theme_names(): + self.style.theme_use(theme) + for name in CLASS_NAMES: + default = style.configure(name) + if not default: + continue + with self.subTest(theme=theme, name=name): + if support.verbose >= 2: + print('configure', theme, name, default) + newname = f'C.{name}' + self.assertEqual(style.configure(newname), None) + style.configure(newname, **default) + self.assertEqual(style.configure(newname), default) + for key, value in default.items(): + self.assertEqual(style.configure(newname, key), value) + + + def test_map_custom_copy(self): + style = self.style + + curr_theme = self.style.theme_use() + self.addCleanup(self.style.theme_use, curr_theme) + for theme in self.style.theme_names(): + self.style.theme_use(theme) + for name in CLASS_NAMES: + default = style.map(name) + if not default: + continue + with self.subTest(theme=theme, name=name): + if support.verbose >= 2: + print('map', theme, name, default) + newname = f'C.{name}' + self.assertEqual(style.map(newname), {}) + style.map(newname, **default) + self.assertEqual(style.map(newname), default) + for key, value in default.items(): + self.assertEqual(style.map(newname, key), value) + + tests_gui = (StyleTest, ) if __name__ == "__main__": diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index c7c71cd5a559cf..968fd54dce1ee0 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -81,8 +81,6 @@ def _mapdict_values(items): # ['active selected', 'grey', 'focus', [1, 2, 3, 4]] opt_val = [] for *state, val in items: - # hacks for backward compatibility - state[0] # raise IndexError if empty if len(state) == 1: # if it is empty (something that evaluates to False), then # format it to Tcl code to denote the "normal" state @@ -243,19 +241,22 @@ def _script_from_settings(settings): def _list_from_statespec(stuple): """Construct a list from the given statespec tuple according to the accepted statespec accepted by _format_mapdict.""" - nval = [] - for val in stuple: - typename = getattr(val, 'typename', None) - if typename is None: - nval.append(val) - else: # this is a Tcl object + if isinstance(stuple, str): + return stuple + result = [] + it = iter(stuple) + for state, val in zip(it, it): + if hasattr(state, 'typename'): # this is a Tcl object + state = str(state).split() + elif isinstance(state, str): + state = state.split() + elif not isinstance(state, (tuple, list)): + state = (state,) + if hasattr(val, 'typename'): val = str(val) - if typename == 'StateSpec': - val = val.split() - nval.append(val) + result.append((*state, val)) - it = iter(nval) - return [_flatten(spec) for spec in zip(it, it)] + return result def _list_from_layouttuple(tk, ltuple): """Construct a list from the tuple returned by ttk::layout, this is @@ -395,13 +396,12 @@ def map(self, style, query_opt=None, **kw): or something else of your preference. A statespec is compound of one or more states and then a value.""" if query_opt is not None: - return _list_from_statespec(self.tk.splitlist( - self.tk.call(self._name, "map", style, '-%s' % query_opt))) + result = self.tk.call(self._name, "map", style, '-%s' % query_opt) + return _list_from_statespec(self.tk.splitlist(result)) - return _splitdict( - self.tk, - self.tk.call(self._name, "map", style, *_format_mapdict(kw)), - conv=_tclobj_to_py) + result = self.tk.call(self._name, "map", style, *_format_mapdict(kw)) + return {k: _list_from_statespec(self.tk.splitlist(v)) + for k, v in _splitdict(self.tk, result).items()} def lookup(self, style, option, state=None, default=None): diff --git a/Misc/NEWS.d/next/Library/2020-11-15-17-02-00.bpo-42328.bqpPlR.rst b/Misc/NEWS.d/next/Library/2020-11-15-17-02-00.bpo-42328.bqpPlR.rst new file mode 100644 index 00000000000000..7e6a176c889412 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-15-17-02-00.bpo-42328.bqpPlR.rst @@ -0,0 +1,4 @@ +Fixed :meth:`tkinter.ttk.Style.map`. The function accepts now the +representation of the default state as empty sequence (as returned by +``Style.map()``). The structure of the result is now the same on all platform +and does not depend on the value of ``wantobjects``. From 0511151bae2f6658be80982cd09bba01f273a4ea Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Mon, 23 Nov 2020 13:31:31 +0000 Subject: [PATCH 0632/1261] bpo-28850: Fix PrettyPrinter.format overrides ignored for contents of small containers (GH-22120) --- Lib/pprint.py | 150 +++++++++--------- Lib/test/test_pprint.py | 13 +- .../2020-09-06-21-55-44.bpo-28850.HJNggD.rst | 1 + 3 files changed, 89 insertions(+), 75 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-06-21-55-44.bpo-28850.HJNggD.rst diff --git a/Lib/pprint.py b/Lib/pprint.py index 213998e3491ef7..a8af50e5a68611 100644 --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -64,15 +64,15 @@ def pp(object, *args, sort_dicts=False, **kwargs): def saferepr(object): """Version of repr() which can handle recursive data structures.""" - return _safe_repr(object, {}, None, 0, True)[0] + return PrettyPrinter()._safe_repr(object, {}, None, 0)[0] def isreadable(object): """Determine if saferepr(object) is readable by eval().""" - return _safe_repr(object, {}, None, 0, True)[1] + return PrettyPrinter()._safe_repr(object, {}, None, 0)[1] def isrecursive(object): """Determine if object requires a recursive representation.""" - return _safe_repr(object, {}, None, 0, True)[2] + return PrettyPrinter()._safe_repr(object, {}, None, 0)[2] class _safe_key: """Helper function for key functions when sorting unorderable objects. @@ -435,7 +435,7 @@ def format(self, object, context, maxlevels, level): and flags indicating whether the representation is 'readable' and whether the object represents a recursive construct. """ - return _safe_repr(object, context, maxlevels, level, self._sort_dicts) + return self._safe_repr(object, context, maxlevels, level) def _pprint_default_dict(self, object, stream, indent, allowance, context, level): if not len(object): @@ -518,77 +518,79 @@ def _pprint_user_string(self, object, stream, indent, allowance, context, level) _dispatch[_collections.UserString.__repr__] = _pprint_user_string -# Return triple (repr_string, isreadable, isrecursive). + def _safe_repr(self, object, context, maxlevels, level): + # Return triple (repr_string, isreadable, isrecursive). + typ = type(object) + if typ in _builtin_scalars: + return repr(object), True, False -def _safe_repr(object, context, maxlevels, level, sort_dicts): - typ = type(object) - if typ in _builtin_scalars: - return repr(object), True, False - - r = getattr(typ, "__repr__", None) - if issubclass(typ, dict) and r is dict.__repr__: - if not object: - return "{}", True, False - objid = id(object) - if maxlevels and level >= maxlevels: - return "{...}", False, objid in context - if objid in context: - return _recursion(object), False, True - context[objid] = 1 - readable = True - recursive = False - components = [] - append = components.append - level += 1 - if sort_dicts: - items = sorted(object.items(), key=_safe_tuple) - else: - items = object.items() - for k, v in items: - krepr, kreadable, krecur = _safe_repr(k, context, maxlevels, level, sort_dicts) - vrepr, vreadable, vrecur = _safe_repr(v, context, maxlevels, level, sort_dicts) - append("%s: %s" % (krepr, vrepr)) - readable = readable and kreadable and vreadable - if krecur or vrecur: - recursive = True - del context[objid] - return "{%s}" % ", ".join(components), readable, recursive - - if (issubclass(typ, list) and r is list.__repr__) or \ - (issubclass(typ, tuple) and r is tuple.__repr__): - if issubclass(typ, list): + r = getattr(typ, "__repr__", None) + if issubclass(typ, dict) and r is dict.__repr__: if not object: - return "[]", True, False - format = "[%s]" - elif len(object) == 1: - format = "(%s,)" - else: - if not object: - return "()", True, False - format = "(%s)" - objid = id(object) - if maxlevels and level >= maxlevels: - return format % "...", False, objid in context - if objid in context: - return _recursion(object), False, True - context[objid] = 1 - readable = True - recursive = False - components = [] - append = components.append - level += 1 - for o in object: - orepr, oreadable, orecur = _safe_repr(o, context, maxlevels, level, sort_dicts) - append(orepr) - if not oreadable: - readable = False - if orecur: - recursive = True - del context[objid] - return format % ", ".join(components), readable, recursive - - rep = repr(object) - return rep, (rep and not rep.startswith('<')), False + return "{}", True, False + objid = id(object) + if maxlevels and level >= maxlevels: + return "{...}", False, objid in context + if objid in context: + return _recursion(object), False, True + context[objid] = 1 + readable = True + recursive = False + components = [] + append = components.append + level += 1 + if self._sort_dicts: + items = sorted(object.items(), key=_safe_tuple) + else: + items = object.items() + for k, v in items: + krepr, kreadable, krecur = self.format( + k, context, maxlevels, level) + vrepr, vreadable, vrecur = self.format( + v, context, maxlevels, level) + append("%s: %s" % (krepr, vrepr)) + readable = readable and kreadable and vreadable + if krecur or vrecur: + recursive = True + del context[objid] + return "{%s}" % ", ".join(components), readable, recursive + + if (issubclass(typ, list) and r is list.__repr__) or \ + (issubclass(typ, tuple) and r is tuple.__repr__): + if issubclass(typ, list): + if not object: + return "[]", True, False + format = "[%s]" + elif len(object) == 1: + format = "(%s,)" + else: + if not object: + return "()", True, False + format = "(%s)" + objid = id(object) + if maxlevels and level >= maxlevels: + return format % "...", False, objid in context + if objid in context: + return _recursion(object), False, True + context[objid] = 1 + readable = True + recursive = False + components = [] + append = components.append + level += 1 + for o in object: + orepr, oreadable, orecur = self.format( + o, context, maxlevels, level) + append(orepr) + if not oreadable: + readable = False + if orecur: + recursive = True + del context[objid] + return format % ", ".join(components), readable, recursive + + rep = repr(object) + return rep, (rep and not rep.startswith('<')), False _builtin_scalars = frozenset({str, bytes, bytearray, int, float, complex, bool, type(None)}) @@ -604,7 +606,7 @@ def _perfcheck(object=None): object = [("string", (1, 2), [3, 4], {5: 6, 7: 8})] * 100000 p = PrettyPrinter() t1 = time.perf_counter() - _safe_repr(object, {}, None, 0, True) + p._safe_repr(object, {}, None, 0, True) t2 = time.perf_counter() p.pformat(object) t3 = time.perf_counter() diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py index 8ee18e8fef84f7..c4a8578a9fc8fb 100644 --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -453,12 +453,23 @@ class AdvancedNamespace(types.SimpleNamespace): pass dog=8)""") def test_subclassing(self): + # length(repr(obj)) > width o = {'names with spaces': 'should be presented using repr()', 'others.should.not.be': 'like.this'} exp = """\ {'names with spaces': 'should be presented using repr()', others.should.not.be: like.this}""" - self.assertEqual(DottedPrettyPrinter().pformat(o), exp) + + dotted_printer = DottedPrettyPrinter() + self.assertEqual(dotted_printer.pformat(o), exp) + + # length(repr(obj)) < width + o1 = ['with space'] + exp1 = "['with space']" + self.assertEqual(dotted_printer.pformat(o1), exp1) + o2 = ['without.space'] + exp2 = "[without.space]" + self.assertEqual(dotted_printer.pformat(o2), exp2) def test_set_reprs(self): self.assertEqual(pprint.pformat(set()), 'set()') diff --git a/Misc/NEWS.d/next/Library/2020-09-06-21-55-44.bpo-28850.HJNggD.rst b/Misc/NEWS.d/next/Library/2020-09-06-21-55-44.bpo-28850.HJNggD.rst new file mode 100644 index 00000000000000..fc6bd1d57e2ae7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-06-21-55-44.bpo-28850.HJNggD.rst @@ -0,0 +1 @@ +Fix :meth:`pprint.PrettyPrinter.format` overrides being ignored for contents of small containers. The :func:`pprint._safe_repr` function was removed. From 2e650525ebc512f49fa2263a2d2cdf8e458022e1 Mon Sep 17 00:00:00 2001 From: Nick Crews Date: Mon, 23 Nov 2020 09:29:37 -0700 Subject: [PATCH 0633/1261] bpo-15450: Allow subclassing of dircmp (GH-23424) (#23424) Co-authored-by: Chris Jerdonek --- Doc/library/filecmp.rst | 8 ++- Lib/filecmp.py | 9 ++-- Lib/test/test_filecmp.py | 53 +++++++++++++++---- Misc/ACKS | 1 + .../2020-11-20-10-38-34.bpo-15450.E-y9PA.rst | 2 + 5 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-20-10-38-34.bpo-15450.E-y9PA.rst diff --git a/Doc/library/filecmp.rst b/Doc/library/filecmp.rst index 31b9b4afab9348..c60603b30a6d7d 100644 --- a/Doc/library/filecmp.rst +++ b/Doc/library/filecmp.rst @@ -173,7 +173,13 @@ The :class:`dircmp` class .. attribute:: subdirs A dictionary mapping names in :attr:`common_dirs` to :class:`dircmp` - objects. + instances (or MyDirCmp instances if this instance is of type MyDirCmp, a + subclass of :class:`dircmp`). + + .. versionchanged:: 3.10 + Previously entries were always :class:`dircmp` instances. Now entries + are the same type as *self*, if *self* is a subclass of + :class:`dircmp`. .. attribute:: DEFAULT_IGNORES diff --git a/Lib/filecmp.py b/Lib/filecmp.py index 7a4da6beb50500..7c47eb022cc8c0 100644 --- a/Lib/filecmp.py +++ b/Lib/filecmp.py @@ -115,7 +115,9 @@ class dircmp: same_files: list of identical files. diff_files: list of filenames which differ. funny_files: list of files which could not be compared. - subdirs: a dictionary of dircmp objects, keyed by names in common_dirs. + subdirs: a dictionary of dircmp instances (or MyDirCmp instances if this + object is of type MyDirCmp, a subclass of dircmp), keyed by names + in common_dirs. """ def __init__(self, a, b, ignore=None, hide=None): # Initialize @@ -185,14 +187,15 @@ def phase3(self): # Find out differences between common files self.same_files, self.diff_files, self.funny_files = xx def phase4(self): # Find out differences between common subdirectories - # A new dircmp object is created for each common subdirectory, + # A new dircmp (or MyDirCmp if dircmp was subclassed) object is created + # for each common subdirectory, # these are stored in a dictionary indexed by filename. # The hide and ignore properties are inherited from the parent self.subdirs = {} for x in self.common_dirs: a_x = os.path.join(self.left, x) b_x = os.path.join(self.right, x) - self.subdirs[x] = dircmp(a_x, b_x, self.ignore, self.hide) + self.subdirs[x] = self.__class__(a_x, b_x, self.ignore, self.hide) def phase4_closure(self): # Recursively call phase4() on subdirectories self.phase4() diff --git a/Lib/test/test_filecmp.py b/Lib/test/test_filecmp.py index ca9b4f354a5c0c..fa4f67b6eb5f92 100644 --- a/Lib/test/test_filecmp.py +++ b/Lib/test/test_filecmp.py @@ -66,6 +66,8 @@ def setUp(self): for dir in (self.dir, self.dir_same, self.dir_diff, self.dir_ignored): shutil.rmtree(dir, True) os.mkdir(dir) + subdir_path = os.path.join(dir, 'subdir') + os.mkdir(subdir_path) if self.caseinsensitive and dir is self.dir_same: fn = 'FiLe' # Verify case-insensitive comparison else: @@ -110,6 +112,11 @@ def test_cmpfiles(self): "Comparing mismatched directories fails") + def _assert_lists(self, actual, expected): + """Assert that two lists are equal, up to ordering.""" + self.assertEqual(sorted(actual), sorted(expected)) + + def test_dircmp(self): # Check attributes for comparison of two identical directories left_dir, right_dir = self.dir, self.dir_same @@ -117,10 +124,13 @@ def test_dircmp(self): self.assertEqual(d.left, left_dir) self.assertEqual(d.right, right_dir) if self.caseinsensitive: - self.assertEqual([d.left_list, d.right_list],[['file'], ['FiLe']]) + self._assert_lists(d.left_list, ['file', 'subdir']) + self._assert_lists(d.right_list, ['FiLe', 'subdir']) else: - self.assertEqual([d.left_list, d.right_list],[['file'], ['file']]) - self.assertEqual(d.common, ['file']) + self._assert_lists(d.left_list, ['file', 'subdir']) + self._assert_lists(d.right_list, ['file', 'subdir']) + self._assert_lists(d.common, ['file', 'subdir']) + self._assert_lists(d.common_dirs, ['subdir']) self.assertEqual(d.left_only, []) self.assertEqual(d.right_only, []) self.assertEqual(d.same_files, ['file']) @@ -128,6 +138,7 @@ def test_dircmp(self): expected_report = [ "diff {} {}".format(self.dir, self.dir_same), "Identical files : ['file']", + "Common subdirectories : ['subdir']", ] self._assert_report(d.report, expected_report) @@ -136,9 +147,10 @@ def test_dircmp(self): d = filecmp.dircmp(left_dir, right_dir) self.assertEqual(d.left, left_dir) self.assertEqual(d.right, right_dir) - self.assertEqual(d.left_list, ['file']) - self.assertEqual(d.right_list, ['file', 'file2']) - self.assertEqual(d.common, ['file']) + self._assert_lists(d.left_list, ['file', 'subdir']) + self._assert_lists(d.right_list, ['file', 'file2', 'subdir']) + self._assert_lists(d.common, ['file', 'subdir']) + self._assert_lists(d.common_dirs, ['subdir']) self.assertEqual(d.left_only, []) self.assertEqual(d.right_only, ['file2']) self.assertEqual(d.same_files, ['file']) @@ -147,6 +159,7 @@ def test_dircmp(self): "diff {} {}".format(self.dir, self.dir_diff), "Only in {} : ['file2']".format(self.dir_diff), "Identical files : ['file']", + "Common subdirectories : ['subdir']", ] self._assert_report(d.report, expected_report) @@ -159,9 +172,9 @@ def test_dircmp(self): d = filecmp.dircmp(left_dir, right_dir) self.assertEqual(d.left, left_dir) self.assertEqual(d.right, right_dir) - self.assertEqual(d.left_list, ['file', 'file2']) - self.assertEqual(d.right_list, ['file']) - self.assertEqual(d.common, ['file']) + self._assert_lists(d.left_list, ['file', 'file2', 'subdir']) + self._assert_lists(d.right_list, ['file', 'subdir']) + self._assert_lists(d.common, ['file', 'subdir']) self.assertEqual(d.left_only, ['file2']) self.assertEqual(d.right_only, []) self.assertEqual(d.same_files, ['file']) @@ -170,6 +183,7 @@ def test_dircmp(self): "diff {} {}".format(self.dir, self.dir_diff), "Only in {} : ['file2']".format(self.dir), "Identical files : ['file']", + "Common subdirectories : ['subdir']", ] self._assert_report(d.report, expected_report) @@ -183,24 +197,45 @@ def test_dircmp(self): "diff {} {}".format(self.dir, self.dir_diff), "Identical files : ['file']", "Differing files : ['file2']", + "Common subdirectories : ['subdir']", ] self._assert_report(d.report, expected_report) + def test_dircmp_subdirs_type(self): + """Check that dircmp.subdirs respects subclassing.""" + class MyDirCmp(filecmp.dircmp): + pass + d = MyDirCmp(self.dir, self.dir_diff) + sub_dirs = d.subdirs + self.assertEqual(list(sub_dirs.keys()), ['subdir']) + sub_dcmp = sub_dirs['subdir'] + self.assertEqual(type(sub_dcmp), MyDirCmp) + def test_report_partial_closure(self): left_dir, right_dir = self.dir, self.dir_same d = filecmp.dircmp(left_dir, right_dir) + left_subdir = os.path.join(left_dir, 'subdir') + right_subdir = os.path.join(right_dir, 'subdir') expected_report = [ "diff {} {}".format(self.dir, self.dir_same), "Identical files : ['file']", + "Common subdirectories : ['subdir']", + '', + "diff {} {}".format(left_subdir, right_subdir), ] self._assert_report(d.report_partial_closure, expected_report) def test_report_full_closure(self): left_dir, right_dir = self.dir, self.dir_same d = filecmp.dircmp(left_dir, right_dir) + left_subdir = os.path.join(left_dir, 'subdir') + right_subdir = os.path.join(right_dir, 'subdir') expected_report = [ "diff {} {}".format(self.dir, self.dir_same), "Identical files : ['file']", + "Common subdirectories : ['subdir']", + '', + "diff {} {}".format(left_subdir, right_subdir), ] self._assert_report(d.report_full_closure, expected_report) diff --git a/Misc/ACKS b/Misc/ACKS index 43030caae669d4..16bc42f65fbbcf 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -368,6 +368,7 @@ Ryan Coyner Christopher A. Craig Jeremy Craven Laura Creighton +Nick Crews Tyler Crompton Simon Cross Felipe Cruz diff --git a/Misc/NEWS.d/next/Library/2020-11-20-10-38-34.bpo-15450.E-y9PA.rst b/Misc/NEWS.d/next/Library/2020-11-20-10-38-34.bpo-15450.E-y9PA.rst new file mode 100644 index 00000000000000..dc3740669280b0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-20-10-38-34.bpo-15450.E-y9PA.rst @@ -0,0 +1,2 @@ +Make :class:`filecmp.dircmp` respect subclassing. Now the +:attr:`filecmp.dircmp.subdirs` behaves as expected when subclassing dircmp. From 2964ef6315da2d6fad5053f38db790c990876c34 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Mon, 23 Nov 2020 10:56:59 -0800 Subject: [PATCH 0634/1261] Descriptor HowTo: Improve the fidelity of the member object simulation (GH-23475) --- Doc/howto/descriptor.rst | 57 ++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 76987fda22b59d..8c6e90319a7f36 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -1079,6 +1079,8 @@ simulation where the actual C structure for slots is emulated by a private ``_slotvalues`` list. Reads and writes to that private structure are managed by member descriptors:: + null = object() + class Member: def __init__(self, name, clsname, offset): @@ -1091,20 +1093,28 @@ by member descriptors:: def __get__(self, obj, objtype=None): 'Emulate member_get() in Objects/descrobject.c' # Also see PyMember_GetOne() in Python/structmember.c - return obj._slotvalues[self.offset] + value = obj._slotvalues[self.offset] + if value is null: + raise AttributeError(self.name) + return value def __set__(self, obj, value): 'Emulate member_set() in Objects/descrobject.c' obj._slotvalues[self.offset] = value + def __delete__(self, obj): + 'Emulate member_delete() in Objects/descrobject.c' + value = obj._slotvalues[self.offset] + if value is null: + raise AttributeError(self.name) + obj._slotvalues[self.offset] = null + def __repr__(self): 'Emulate member_repr() in Objects/descrobject.c' return f'' The :meth:`type.__new__` method takes care of adding member objects to class -variables. The :meth:`object.__new__` method takes care of creating instances -that have slots instead of an instance dictionary. Here is a rough equivalent -in pure Python:: +variables:: class Type(type): 'Simulate how the type metaclass adds member objects for slots' @@ -1117,6 +1127,10 @@ in pure Python:: mapping[name] = Member(name, clsname, offset) return type.__new__(mcls, clsname, bases, mapping) +The :meth:`object.__new__` method takes care of creating instances that have +slots instead of an instance dictionary. Here is a rough simulation in pure +Python:: + class Object: 'Simulate how object.__new__() allocates memory for __slots__' @@ -1124,13 +1138,33 @@ in pure Python:: 'Emulate object_new() in Objects/typeobject.c' inst = super().__new__(cls) if hasattr(cls, 'slot_names'): - inst._slotvalues = [None] * len(cls.slot_names) + empty_slots = [null] * len(cls.slot_names) + object.__setattr__(inst, '_slotvalues', empty_slots) return inst + def __setattr__(self, name, value): + 'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c' + cls = type(self) + if hasattr(cls, 'slot_names') and name not in cls.slot_names: + raise AttributeError( + f'{type(self).__name__!r} object has no attribute {name!r}' + ) + super().__setattr__(name, value) + + def __delattr__(self, name): + 'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c' + cls = type(self) + if hasattr(cls, 'slot_names') and name not in cls.slot_names: + raise AttributeError( + f'{type(self).__name__!r} object has no attribute {name!r}' + ) + super().__delattr__(name) + To use the simulation in a real class, just inherit from :class:`Object` and set the :term:`metaclass` to :class:`Type`:: class H(Object, metaclass=Type): + 'Instance variables stored in slots' slot_names = ['x', 'y'] @@ -1143,11 +1177,11 @@ At this point, the metaclass has loaded member objects for *x* and *y*:: >>> import pprint >>> pprint.pp(dict(vars(H))) {'__module__': '__main__', + '__doc__': 'Instance variables stored in slots', 'slot_names': ['x', 'y'], '__init__': , 'x': , - 'y': , - '__doc__': None} + 'y': } When instances are created, they have a ``slot_values`` list where the attributes are stored:: @@ -1159,8 +1193,9 @@ attributes are stored:: >>> vars(h) {'_slotvalues': [55, 20]} -Unlike the real ``__slots__``, this simulation does have an instance -dictionary just to hold the ``_slotvalues`` array. So, unlike the real code, -this simulation doesn't block assignments to misspelled attributes:: +Misspelled or unassigned attributes will raise an exception:: - >>> h.xz = 30 # For actual __slots__ this would raise an AttributeError + >>> h.xz + Traceback (most recent call last): + ... + AttributeError: 'H' object has no attribute 'xz' From df7ed6b60e32e9a2a49078f339fd777b708749c3 Mon Sep 17 00:00:00 2001 From: Yaroslav Pankovych <31005942+ypankovych@users.noreply.github.com> Date: Mon, 23 Nov 2020 22:06:22 +0200 Subject: [PATCH 0635/1261] Added support for negative indexes to PurePath.parents (GH-21799) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit also fixes up some of the overlapping documentation changed in bpo-35498, which added support for indexing with slices. Fixes bpo-21041. https://bugs.python.org/issue21041 Co-authored-by: Paul Ganssle Co-authored-by: Rémi Lapeyre --- Doc/library/pathlib.rst | 2 +- Doc/whatsnew/3.10.rst | 6 +++++- Lib/pathlib.py | 3 ++- Lib/test/test_pathlib.py | 5 ++++- Misc/ACKS | 1 + .../next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst | 2 +- .../next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst | 1 + 7 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 2071e7ed5f4bfe..2bbf3aad619884 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -337,7 +337,7 @@ Pure paths provide the following methods and properties: PureWindowsPath('c:/') .. versionchanged:: 3.10 - Slice support was added. + The parents sequence now supports :term:`slices ` and negative index values. .. data:: PurePath.parent diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index ce66b1de1b7f20..f3e433abf08283 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -247,9 +247,13 @@ pipe. (Contributed by Pablo Galindo in :issue:`41625`.) pathlib ------- -Added slice support to :meth:`~pathlib.Path.parents`. +Added slice support to :attr:`PurePath.parents `. (Contributed by Joshua Cannon in :issue:`35498`) +Added negative indexing support to :attr:`PurePath.parents +`. +(Contributed by Yaroslav Pankovych in :issue:`21041`) + py_compile ---------- diff --git a/Lib/pathlib.py b/Lib/pathlib.py index af310393c3e40e..531a699a40df49 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -632,7 +632,8 @@ def __len__(self): def __getitem__(self, idx): if isinstance(idx, slice): return tuple(self[i] for i in range(*idx.indices(len(self)))) - if idx < 0 or idx >= len(self): + + if idx >= len(self) or idx < -len(self): raise IndexError(idx) return self._pathcls._from_parsed_parts(self._drv, self._root, self._parts[:-idx - 1]) diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index f1451796b6427d..5e5e065b988aaf 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -440,6 +440,9 @@ def test_parents_common(self): self.assertEqual(par[0], P('a/b')) self.assertEqual(par[1], P('a')) self.assertEqual(par[2], P('.')) + self.assertEqual(par[-1], P('.')) + self.assertEqual(par[-2], P('a')) + self.assertEqual(par[-3], P('a/b')) self.assertEqual(par[0:1], (P('a/b'),)) self.assertEqual(par[:2], (P('a/b'), P('a'))) self.assertEqual(par[:-1], (P('a/b'), P('a'))) @@ -448,7 +451,7 @@ def test_parents_common(self): self.assertEqual(par[::-1], (P('.'), P('a'), P('a/b'))) self.assertEqual(list(par), [P('a/b'), P('a'), P('.')]) with self.assertRaises(IndexError): - par[-1] + par[-4] with self.assertRaises(IndexError): par[3] with self.assertRaises(TypeError): diff --git a/Misc/ACKS b/Misc/ACKS index 16bc42f65fbbcf..253349017c5cdc 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1283,6 +1283,7 @@ Michael Otteneder Richard Oudkerk Russel Owen Joonas Paalasmaa +Yaroslav Pankovych Martin Packman Elisha Paine Shriphani Palakodety diff --git a/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst b/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst index fb24ce027c2186..1ab0093fcde041 100644 --- a/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst +++ b/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst @@ -1 +1 @@ -Add slice support to :meth:`~pathlib.Path.parents`. +Add slice support to :attr:`pathlib.PurePath.parents`. diff --git a/Misc/NEWS.d/next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst b/Misc/NEWS.d/next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst new file mode 100644 index 00000000000000..4f14fd39d8827f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst @@ -0,0 +1 @@ +:attr:`pathlib.PurePath.parents` now supports negative indexing. Patch contributed by Yaroslav Pankovych. From bf8d3408133db912ab973c32b5080fe914d613e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Cea?= Date: Tue, 24 Nov 2020 00:56:30 +0100 Subject: [PATCH 0636/1261] Typo (#23482) --- Doc/library/asyncio-task.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index eb51c704cea394..c638f1263fdaa1 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -618,7 +618,7 @@ Running in Threads Asynchronously run function *func* in a separate thread. Any \*args and \*\*kwargs supplied for this function are directly passed - to *func*. Also, the current :class:`contextvars.Context` is propogated, + to *func*. Also, the current :class:`contextvars.Context` is propagated, allowing context variables from the event loop thread to be accessed in the separate thread. From adecb65b09b07ca8fe36e57d2b18c1a73c447b16 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Mon, 23 Nov 2020 19:04:40 -0500 Subject: [PATCH 0637/1261] bpo-41100: minor build installer fixes (GH-23480) --- Mac/BuildScript/build-installer.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 184add4c4f06c5..16816d1cf86a44 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -587,8 +587,8 @@ def checkEnvironment(): Check that we're running on a supported system. """ - if sys.version_info[0:2] < (2, 5): - fatal("This script must be run with Python 2.5 (or later)") + if sys.version_info[0:2] < (2, 7): + fatal("This script must be run with Python 2.7 (or later)") if platform.system() != 'Darwin': fatal("This script should be run on a macOS 10.5 (or later) system") @@ -656,9 +656,6 @@ def checkEnvironment(): base_path = base_path + ':' + OLD_DEVELOPER_TOOLS os.environ['PATH'] = base_path print("Setting default PATH: %s"%(os.environ['PATH'])) - # Ensure we have access to sphinx-build. - # You may have to create a link in /usr/bin for it. - runCommand('sphinx-build --version') def parseOptions(args=None): """ @@ -1618,8 +1615,17 @@ def buildDMG(): if os.path.exists(outdir): shutil.rmtree(outdir) + # We used to use the deployment target as the last characters of the + # installer file name. With the introduction of weaklinked installer + # variants, we may have two variants with the same file name, i.e. + # both ending in '10.9'. To avoid this, we now use the major/minor + # version numbers of the macOS version we are building on, i.e. + # '10.9' as before for 10.9+ variant, '11.0' for universal2 11.0-. + # it's not ideal but should cause the least disruption to packaging + # workflows. + build_system_version = '.'.join(platform.mac_ver()[0].split('.')[0:2]) imagepath = os.path.join(outdir, - 'python-%s-macosx%s'%(getFullVersion(),DEPTARGET)) + 'python-%s-macosx%s'%(getFullVersion(),build_system_version)) if INCLUDE_TIMESTAMP: imagepath = imagepath + '-%04d-%02d-%02d'%(time.localtime()[:3]) imagepath = imagepath + '.dmg' From 74734a518a51be53efaef4e3936a4321b1d888c9 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 24 Nov 2020 01:20:35 -0500 Subject: [PATCH 0638/1261] bpo-41100: in test_platform, ignore 10.16 (GH-23485) --- Lib/test/test_platform.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 9b6d93cb5fcda4..1590cd509b95c5 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -238,7 +238,10 @@ def test_mac_ver(self): # On Snow Leopard, sw_vers reports 10.6.0 as 10.6 if len_diff > 0: expect_list.extend(['0'] * len_diff) - self.assertEqual(result_list, expect_list) + # For compatibility with older binaries, macOS 11.x may report + # itself as '10.16' rather than '11.x.y'. + if result_list != ['10', '16']: + self.assertEqual(result_list, expect_list) # res[1] claims to contain # (version, dev_stage, non_release_version) From c60f6f0453084ab768ac7ae46124ba1a076a5136 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 24 Nov 2020 14:07:32 +0200 Subject: [PATCH 0639/1261] bpo-42260: Improve error handling in _PyConfig_FromDict (GH-23488) --- Python/initconfig.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Python/initconfig.c b/Python/initconfig.c index 1fcc3600aa4666..4d95ac5d8859b1 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1050,8 +1050,8 @@ _PyConfig_AsDict(const PyConfig *config) static PyObject* config_dict_get(PyObject *dict, const char *name) { - PyObject *item = PyDict_GetItemString(dict, name); - if (item == NULL) { + PyObject *item = _PyDict_GetItemStringWithError(dict, name); + if (item == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_ValueError, "missing config key: %s", name); return NULL; } @@ -1085,7 +1085,7 @@ config_dict_get_int(PyObject *dict, const char *name, int *result) if (PyErr_ExceptionMatches(PyExc_TypeError)) { config_dict_invalid_type(name); } - else { + else if (PyErr_ExceptionMatches(PyExc_OverflowError)) { config_dict_invalid_value(name); } return -1; @@ -1104,7 +1104,12 @@ config_dict_get_ulong(PyObject *dict, const char *name, unsigned long *result) } unsigned long value = PyLong_AsUnsignedLong(item); if (value == (unsigned long)-1 && PyErr_Occurred()) { - config_dict_invalid_value(name); + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + config_dict_invalid_type(name); + } + else if (PyErr_ExceptionMatches(PyExc_OverflowError)) { + config_dict_invalid_value(name); + } return -1; } *result = value; From 68103820ed18cfc9eade4bd193f84d2440922e60 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 24 Nov 2020 13:38:08 +0100 Subject: [PATCH 0640/1261] bpo-42212: smelly.py also checks the dynamic library (GH-23423) The smelly.py script now also checks the Python dynamic library and extension modules, not only the Python static library. Make also the script more verbose: explain what it does. The GitHub Action job now builds Python with the libpython dynamic library. --- .github/workflows/build.yml | 3 +- .../2020-11-20-15-11-05.bpo-42212.sjzgOf.rst | 3 + Tools/scripts/smelly.py | 154 ++++++++++++++---- 3 files changed, 124 insertions(+), 36 deletions(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2020-11-20-15-11-05.bpo-42212.sjzgOf.rst diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c1a017165665f6..f543a94af363b8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,7 +60,8 @@ jobs: run: sudo ./.github/workflows/posix-deps-apt.sh - name: Build CPython run: | - ./configure --with-pydebug + # Build Python with the libpython dynamic library + ./configure --with-pydebug --enable-shared make -j4 regen-all - name: Check for changes run: | diff --git a/Misc/NEWS.d/next/Tools-Demos/2020-11-20-15-11-05.bpo-42212.sjzgOf.rst b/Misc/NEWS.d/next/Tools-Demos/2020-11-20-15-11-05.bpo-42212.sjzgOf.rst new file mode 100644 index 00000000000000..d2cbe3de6fe92e --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2020-11-20-15-11-05.bpo-42212.sjzgOf.rst @@ -0,0 +1,3 @@ +The smelly.py script now also checks the Python dynamic library and extension +modules, not only the Python static library. Make also the script more verbose: +explain what it does. diff --git a/Tools/scripts/smelly.py b/Tools/scripts/smelly.py index 43d091654d2dc8..e8a375c808cdaa 100755 --- a/Tools/scripts/smelly.py +++ b/Tools/scripts/smelly.py @@ -1,17 +1,47 @@ #!/usr/bin/env python # Script checking that all symbols exported by libpython start with Py or _Py +import os.path import subprocess import sys import sysconfig -def get_exported_symbols(): - LIBRARY = sysconfig.get_config_var('LIBRARY') - if not LIBRARY: - raise Exception("failed to get LIBRARY") +ALLOWED_PREFIXES = ('Py', '_Py') +if sys.platform == 'darwin': + ALLOWED_PREFIXES += ('__Py',) + +IGNORED_EXTENSION = "_ctypes_test" +# Ignore constructor and destructor functions +IGNORED_SYMBOLS = {'_init', '_fini'} + + +def is_local_symbol_type(symtype): + # Ignore local symbols. + + # If lowercase, the symbol is usually local; if uppercase, the symbol + # is global (external). There are however a few lowercase symbols that + # are shown for special global symbols ("u", "v" and "w"). + if symtype.islower() and symtype not in "uvw": + return True + + # Ignore the initialized data section (d and D) and the BSS data + # section. For example, ignore "__bss_start (type: B)" + # and "_edata (type: D)". + if symtype in "bBdD": + return True + + return False - args = ('nm', '-p', LIBRARY) + +def get_exported_symbols(library, dynamic=False): + print(f"Check that {library} only exports symbols starting with Py or _Py") + + # Only look at dynamic symbols + args = ['nm', '--no-sort'] + if dynamic: + args.append('--dynamic') + args.append(library) print("+ %s" % ' '.join(args)) proc = subprocess.run(args, stdout=subprocess.PIPE, universal_newlines=True) if proc.returncode: @@ -25,12 +55,9 @@ def get_exported_symbols(): def get_smelly_symbols(stdout): - symbols = [] - ignored_symtypes = set() - - allowed_prefixes = ('Py', '_Py') - if sys.platform == 'darwin': - allowed_prefixes += ('__Py',) + smelly_symbols = [] + python_symbols = [] + local_symbols = [] for line in stdout.splitlines(): # Split line '0000000000001b80 D PyTextIOWrapper_Type' @@ -42,41 +69,98 @@ def get_smelly_symbols(stdout): continue symtype = parts[1].strip() - # Ignore private symbols. - # - # If lowercase, the symbol is usually local; if uppercase, the symbol - # is global (external). There are however a few lowercase symbols that - # are shown for special global symbols ("u", "v" and "w"). - if symtype.islower() and symtype not in "uvw": - ignored_symtypes.add(symtype) + symbol = parts[-1] + result = '%s (type: %s)' % (symbol, symtype) + + if symbol.startswith(ALLOWED_PREFIXES): + python_symbols.append(result) continue - symbol = parts[-1] - if symbol.startswith(allowed_prefixes): + if is_local_symbol_type(symtype): + local_symbols.append(result) + elif symbol in IGNORED_SYMBOLS: + local_symbols.append(result) + else: + smelly_symbols.append(result) + + if local_symbols: + print(f"Ignore {len(local_symbols)} local symbols") + return smelly_symbols, python_symbols + + +def check_library(library, dynamic=False): + nm_output = get_exported_symbols(library, dynamic) + smelly_symbols, python_symbols = get_smelly_symbols(nm_output) + + if not smelly_symbols: + print(f"OK: no smelly symbol found ({len(python_symbols)} Python symbols)") + return 0 + + print() + smelly_symbols.sort() + for symbol in smelly_symbols: + print("Smelly symbol: %s" % symbol) + + print() + print("ERROR: Found %s smelly symbols!" % len(smelly_symbols)) + return len(smelly_symbols) + + +def check_extensions(): + print(__file__) + srcdir = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + filename = os.path.join(srcdir, "pybuilddir.txt") + try: + with open(filename, encoding="utf-8") as fp: + pybuilddir = fp.readline() + except FileNotFoundError: + print(f"Cannot check extensions because {filename} does not exist") + return True + + print(f"Check extension modules from {pybuilddir} directory") + builddir = os.path.join(srcdir, pybuilddir) + nsymbol = 0 + for name in os.listdir(builddir): + if not name.endswith(".so"): + continue + if IGNORED_EXTENSION in name: + print() + print(f"Ignore extension: {name}") continue - symbol = '%s (type: %s)' % (symbol, symtype) - symbols.append(symbol) - if ignored_symtypes: - print("Ignored symbol types: %s" % ', '.join(sorted(ignored_symtypes))) print() - return symbols + filename = os.path.join(builddir, name) + nsymbol += check_library(filename, dynamic=True) + + return nsymbol def main(): - nm_output = get_exported_symbols() - symbols = get_smelly_symbols(nm_output) + # static library + LIBRARY = sysconfig.get_config_var('LIBRARY') + if not LIBRARY: + raise Exception("failed to get LIBRARY variable from sysconfig") + nsymbol = check_library(LIBRARY) + + # dynamic library + LDLIBRARY = sysconfig.get_config_var('LDLIBRARY') + if not LDLIBRARY: + raise Exception("failed to get LDLIBRARY variable from sysconfig") + if LDLIBRARY != LIBRARY: + print() + nsymbol += check_library(LDLIBRARY, dynamic=True) - if not symbols: - print("OK: no smelly symbol found") - sys.exit(0) + # Check extension modules like _ssl.cpython-310d-x86_64-linux-gnu.so + nsymbol += check_extensions() + + if nsymbol: + print() + print(f"ERROR: Found {nsymbol} smelly symbols in total!") + sys.exit(1) - symbols.sort() - for symbol in symbols: - print("Smelly symbol: %s" % symbol) print() - print("ERROR: Found %s smelly symbols!" % len(symbols)) - sys.exit(1) + print(f"OK: all exported symbols of all libraries " + f"are prefixed with {' or '.join(map(repr, ALLOWED_PREFIXES))}") if __name__ == "__main__": From be1a3ae2ddd8480955889731b86b437ede48e080 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 24 Nov 2020 19:35:39 +0200 Subject: [PATCH 0641/1261] bpo-42370: Check element before making mouse click in ttk tests (GH-23491) --- Lib/tkinter/test/test_ttk/test_widgets.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Lib/tkinter/test/test_ttk/test_widgets.py b/Lib/tkinter/test/test_ttk/test_widgets.py index 2598bc67652075..e20ec390710856 100644 --- a/Lib/tkinter/test/test_ttk/test_widgets.py +++ b/Lib/tkinter/test/test_ttk/test_widgets.py @@ -437,11 +437,12 @@ def test_height(self): def _show_drop_down_listbox(self): width = self.combo.winfo_width() - self.combo.event_generate('', x=width - 5, y=5) - self.combo.event_generate('', x=width - 5, y=5) + x, y = width - 5, 5 + self.assertRegex(self.combo.identify(x, y), r'.*downarrow\Z') + self.combo.event_generate('', x=x, y=y) + self.combo.event_generate('', x=x, y=y) self.combo.update_idletasks() - def test_virtual_event(self): success = [] @@ -1088,6 +1089,7 @@ def test_traversal(self): self.nb.select(0) + self.assertEqual(self.nb.identify(5, 5), 'focus') simulate_mouse_click(self.nb, 5, 5) self.nb.focus_force() self.nb.event_generate('') @@ -1102,6 +1104,7 @@ def test_traversal(self): self.nb.tab(self.child1, text='a', underline=0) self.nb.enable_traversal() self.nb.focus_force() + self.assertEqual(self.nb.identify(5, 5), 'focus') simulate_mouse_click(self.nb, 5, 5) if sys.platform == 'darwin': self.nb.event_generate('') @@ -1132,6 +1135,7 @@ def _click_increment_arrow(self): height = self.spin.winfo_height() x = width - 5 y = height//2 - 5 + self.assertRegex(self.spin.identify(x, y), r'.*uparrow\Z') self.spin.event_generate('', x=x, y=y) self.spin.event_generate('', x=x, y=y) self.spin.update_idletasks() @@ -1141,6 +1145,7 @@ def _click_decrement_arrow(self): height = self.spin.winfo_height() x = width - 5 y = height//2 + 4 + self.assertRegex(self.spin.identify(x, y), r'.*downarrow\Z') self.spin.event_generate('', x=x, y=y) self.spin.event_generate('', x=x, y=y) self.spin.update_idletasks() @@ -1530,6 +1535,9 @@ def test_heading(self): def test_heading_callback(self): def simulate_heading_click(x, y): + if tcl_version >= (8, 6): + self.assertEqual(self.tv.identify_column(x), '#0') + self.assertEqual(self.tv.identify_region(x, y), 'heading') simulate_mouse_click(self.tv, x, y) self.tv.update() From 96cf67dbc0f5c558d2475e202b634f6ce135a42f Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Tue, 24 Nov 2020 20:08:54 +0200 Subject: [PATCH 0642/1261] bpo-42392: Remove loop parameter form asyncio locks and Queue (#23420) Co-authored-by: Andrew Svetlov --- Lib/asyncio/locks.py | 69 ++--- Lib/asyncio/mixins.py | 21 ++ Lib/asyncio/queues.py | 20 +- Lib/asyncio/tasks.py | 2 +- Lib/test/test_asyncio/test_events.py | 242 +++++++++--------- Lib/test/test_asyncio/test_locks.py | 205 +++++---------- Lib/test/test_asyncio/test_pep492.py | 26 +- Lib/test/test_asyncio/test_queues.py | 152 ++++------- Lib/test/test_asyncio/utils.py | 16 +- .../2020-11-20-14-01-29.bpo-42392.-OUzvl.rst | 2 + 10 files changed, 304 insertions(+), 451 deletions(-) create mode 100644 Lib/asyncio/mixins.py create mode 100644 Misc/NEWS.d/next/Library/2020-11-20-14-01-29.bpo-42392.-OUzvl.rst diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index f1ce7324785ba9..6f322c258cfe4f 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -3,10 +3,9 @@ __all__ = ('Lock', 'Event', 'Condition', 'Semaphore', 'BoundedSemaphore') import collections -import warnings -from . import events from . import exceptions +from . import mixins class _ContextManagerMixin: @@ -20,7 +19,7 @@ async def __aexit__(self, exc_type, exc, tb): self.release() -class Lock(_ContextManagerMixin): +class Lock(_ContextManagerMixin, mixins._LoopBoundedMixin): """Primitive lock objects. A primitive lock is a synchronization primitive that is not owned @@ -74,16 +73,9 @@ class Lock(_ContextManagerMixin): """ - def __init__(self, *, loop=None): + def __init__(self): self._waiters = None self._locked = False - if loop is None: - self._loop = events.get_event_loop() - else: - self._loop = loop - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) def __repr__(self): res = super().__repr__() @@ -109,7 +101,7 @@ async def acquire(self): if self._waiters is None: self._waiters = collections.deque() - fut = self._loop.create_future() + fut = self._get_loop().create_future() self._waiters.append(fut) # Finally block should be called before the CancelledError @@ -161,7 +153,7 @@ def _wake_up_first(self): fut.set_result(True) -class Event: +class Event(mixins._LoopBoundedMixin): """Asynchronous equivalent to threading.Event. Class implementing event objects. An event manages a flag that can be set @@ -170,16 +162,9 @@ class Event: false. """ - def __init__(self, *, loop=None): + def __init__(self): self._waiters = collections.deque() self._value = False - if loop is None: - self._loop = events.get_event_loop() - else: - self._loop = loop - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) def __repr__(self): res = super().__repr__() @@ -220,7 +205,7 @@ async def wait(self): if self._value: return True - fut = self._loop.create_future() + fut = self._get_loop().create_future() self._waiters.append(fut) try: await fut @@ -229,7 +214,7 @@ async def wait(self): self._waiters.remove(fut) -class Condition(_ContextManagerMixin): +class Condition(_ContextManagerMixin, mixins._LoopBoundedMixin): """Asynchronous equivalent to threading.Condition. This class implements condition variable objects. A condition variable @@ -239,18 +224,10 @@ class Condition(_ContextManagerMixin): A new Lock object is created and used as the underlying lock. """ - def __init__(self, lock=None, *, loop=None): - if loop is None: - self._loop = events.get_event_loop() - else: - self._loop = loop - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) - + def __init__(self, lock=None): if lock is None: - lock = Lock(loop=loop) - elif lock._loop is not self._loop: + lock = Lock() + elif lock._loop is not self._get_loop(): raise ValueError("loop argument must agree with lock") self._lock = lock @@ -284,7 +261,7 @@ async def wait(self): self.release() try: - fut = self._loop.create_future() + fut = self._get_loop().create_future() self._waiters.append(fut) try: await fut @@ -351,7 +328,7 @@ def notify_all(self): self.notify(len(self._waiters)) -class Semaphore(_ContextManagerMixin): +class Semaphore(_ContextManagerMixin, mixins._LoopBoundedMixin): """A Semaphore implementation. A semaphore manages an internal counter which is decremented by each @@ -366,18 +343,11 @@ class Semaphore(_ContextManagerMixin): ValueError is raised. """ - def __init__(self, value=1, *, loop=None): + def __init__(self, value=1): if value < 0: raise ValueError("Semaphore initial value must be >= 0") self._value = value self._waiters = collections.deque() - if loop is None: - self._loop = events.get_event_loop() - else: - self._loop = loop - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) def __repr__(self): res = super().__repr__() @@ -407,7 +377,7 @@ async def acquire(self): True. """ while self._value <= 0: - fut = self._loop.create_future() + fut = self._get_loop().create_future() self._waiters.append(fut) try: await fut @@ -436,14 +406,9 @@ class BoundedSemaphore(Semaphore): above the initial value. """ - def __init__(self, value=1, *, loop=None): - if loop: - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) - + def __init__(self, value=1): self._bound_value = value - super().__init__(value, loop=loop) + super().__init__(value) def release(self): if self._value >= self._bound_value: diff --git a/Lib/asyncio/mixins.py b/Lib/asyncio/mixins.py new file mode 100644 index 00000000000000..dbc4b5faccb019 --- /dev/null +++ b/Lib/asyncio/mixins.py @@ -0,0 +1,21 @@ +"""Event loop mixins.""" + +import threading +from . import events + +_global_lock = threading.Lock() + + +class _LoopBoundedMixin: + _loop = None + + def _get_loop(self): + loop = events._get_running_loop() + + if self._loop is None: + with _global_lock: + if self._loop is None: + self._loop = loop + if loop is not self._loop: + raise RuntimeError(f'{type(self).__name__} have already bounded to another loop') + return loop diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py index cd3f7c6a567891..78ae9e99ccf0e9 100644 --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -2,10 +2,9 @@ import collections import heapq -import warnings -from . import events from . import locks +from . import mixins class QueueEmpty(Exception): @@ -18,7 +17,7 @@ class QueueFull(Exception): pass -class Queue: +class Queue(mixins._LoopBoundedMixin): """A queue, useful for coordinating producer and consumer coroutines. If maxsize is less than or equal to zero, the queue size is infinite. If it @@ -30,14 +29,7 @@ class Queue: interrupted between calling qsize() and doing an operation on the Queue. """ - def __init__(self, maxsize=0, *, loop=None): - if loop is None: - self._loop = events.get_event_loop() - else: - self._loop = loop - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) + def __init__(self, maxsize=0): self._maxsize = maxsize # Futures. @@ -45,7 +37,7 @@ def __init__(self, maxsize=0, *, loop=None): # Futures. self._putters = collections.deque() self._unfinished_tasks = 0 - self._finished = locks.Event(loop=loop) + self._finished = locks.Event() self._finished.set() self._init(maxsize) @@ -122,7 +114,7 @@ async def put(self, item): slot is available before adding item. """ while self.full(): - putter = self._loop.create_future() + putter = self._get_loop().create_future() self._putters.append(putter) try: await putter @@ -160,7 +152,7 @@ async def get(self): If queue is empty, wait until an item is available. """ while self.empty(): - getter = self._loop.create_future() + getter = self._get_loop().create_future() self._getters.append(getter) try: await getter diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index f486b672294111..03d8451fa1744a 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -578,7 +578,7 @@ def as_completed(fs, *, loop=None, timeout=None): raise TypeError(f"expect an iterable of futures, not {type(fs).__name__}") from .queues import Queue # Import here to avoid circular import problem. - done = Queue(loop=loop) + done = Queue() if loop is None: loop = events.get_event_loop() diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index b8fe466cd53dfc..7f76011d2b92dc 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -206,8 +206,8 @@ def __init__(self, loop): self.disconnects = {fd: loop.create_future() for fd in range(3)} self.data = {1: b'', 2: b''} self.returncode = None - self.got_data = {1: asyncio.Event(loop=loop), - 2: asyncio.Event(loop=loop)} + self.got_data = {1: asyncio.Event(), + 2: asyncio.Event()} def connection_made(self, transport): self.transport = transport @@ -1740,20 +1740,20 @@ def test_subprocess_exec(self): connect = self.loop.subprocess_exec( functools.partial(MySubprocessProtocol, self.loop), sys.executable, prog) - with self.assertWarns(DeprecationWarning): - transp, proto = self.loop.run_until_complete(connect) - self.assertIsInstance(proto, MySubprocessProtocol) - self.loop.run_until_complete(proto.connected) - self.assertEqual('CONNECTED', proto.state) - stdin = transp.get_pipe_transport(0) - stdin.write(b'Python The Winner') - self.loop.run_until_complete(proto.got_data[1].wait()) - with test_utils.disable_logger(): - transp.close() - self.loop.run_until_complete(proto.completed) - self.check_killed(proto.returncode) - self.assertEqual(b'Python The Winner', proto.data[1]) + transp, proto = self.loop.run_until_complete(connect) + self.assertIsInstance(proto, MySubprocessProtocol) + self.loop.run_until_complete(proto.connected) + self.assertEqual('CONNECTED', proto.state) + + stdin = transp.get_pipe_transport(0) + stdin.write(b'Python The Winner') + self.loop.run_until_complete(proto.got_data[1].wait()) + with test_utils.disable_logger(): + transp.close() + self.loop.run_until_complete(proto.completed) + self.check_killed(proto.returncode) + self.assertEqual(b'Python The Winner', proto.data[1]) def test_subprocess_interactive(self): prog = os.path.join(os.path.dirname(__file__), 'echo.py') @@ -1762,51 +1762,48 @@ def test_subprocess_interactive(self): functools.partial(MySubprocessProtocol, self.loop), sys.executable, prog) - with self.assertWarns(DeprecationWarning): - transp, proto = self.loop.run_until_complete(connect) - self.assertIsInstance(proto, MySubprocessProtocol) - self.loop.run_until_complete(proto.connected) - self.assertEqual('CONNECTED', proto.state) + transp, proto = self.loop.run_until_complete(connect) + self.assertIsInstance(proto, MySubprocessProtocol) + self.loop.run_until_complete(proto.connected) + self.assertEqual('CONNECTED', proto.state) - stdin = transp.get_pipe_transport(0) - stdin.write(b'Python ') - self.loop.run_until_complete(proto.got_data[1].wait()) - proto.got_data[1].clear() - self.assertEqual(b'Python ', proto.data[1]) + stdin = transp.get_pipe_transport(0) + stdin.write(b'Python ') + self.loop.run_until_complete(proto.got_data[1].wait()) + proto.got_data[1].clear() + self.assertEqual(b'Python ', proto.data[1]) - stdin.write(b'The Winner') - self.loop.run_until_complete(proto.got_data[1].wait()) - self.assertEqual(b'Python The Winner', proto.data[1]) + stdin.write(b'The Winner') + self.loop.run_until_complete(proto.got_data[1].wait()) + self.assertEqual(b'Python The Winner', proto.data[1]) - with test_utils.disable_logger(): - transp.close() - self.loop.run_until_complete(proto.completed) - self.check_killed(proto.returncode) + with test_utils.disable_logger(): + transp.close() + self.loop.run_until_complete(proto.completed) + self.check_killed(proto.returncode) def test_subprocess_shell(self): - with self.assertWarns(DeprecationWarning): - connect = self.loop.subprocess_shell( - functools.partial(MySubprocessProtocol, self.loop), - 'echo Python') - transp, proto = self.loop.run_until_complete(connect) - self.assertIsInstance(proto, MySubprocessProtocol) - self.loop.run_until_complete(proto.connected) + connect = self.loop.subprocess_shell( + functools.partial(MySubprocessProtocol, self.loop), + 'echo Python') + transp, proto = self.loop.run_until_complete(connect) + self.assertIsInstance(proto, MySubprocessProtocol) + self.loop.run_until_complete(proto.connected) - transp.get_pipe_transport(0).close() - self.loop.run_until_complete(proto.completed) - self.assertEqual(0, proto.returncode) - self.assertTrue(all(f.done() for f in proto.disconnects.values())) - self.assertEqual(proto.data[1].rstrip(b'\r\n'), b'Python') - self.assertEqual(proto.data[2], b'') - transp.close() + transp.get_pipe_transport(0).close() + self.loop.run_until_complete(proto.completed) + self.assertEqual(0, proto.returncode) + self.assertTrue(all(f.done() for f in proto.disconnects.values())) + self.assertEqual(proto.data[1].rstrip(b'\r\n'), b'Python') + self.assertEqual(proto.data[2], b'') + transp.close() def test_subprocess_exitcode(self): connect = self.loop.subprocess_shell( functools.partial(MySubprocessProtocol, self.loop), 'exit 7', stdin=None, stdout=None, stderr=None) - with self.assertWarns(DeprecationWarning): - transp, proto = self.loop.run_until_complete(connect) + transp, proto = self.loop.run_until_complete(connect) self.assertIsInstance(proto, MySubprocessProtocol) self.loop.run_until_complete(proto.completed) self.assertEqual(7, proto.returncode) @@ -1816,8 +1813,8 @@ def test_subprocess_close_after_finish(self): connect = self.loop.subprocess_shell( functools.partial(MySubprocessProtocol, self.loop), 'exit 7', stdin=None, stdout=None, stderr=None) - with self.assertWarns(DeprecationWarning): - transp, proto = self.loop.run_until_complete(connect) + + transp, proto = self.loop.run_until_complete(connect) self.assertIsInstance(proto, MySubprocessProtocol) self.assertIsNone(transp.get_pipe_transport(0)) self.assertIsNone(transp.get_pipe_transport(1)) @@ -1833,15 +1830,14 @@ def test_subprocess_kill(self): functools.partial(MySubprocessProtocol, self.loop), sys.executable, prog) - with self.assertWarns(DeprecationWarning): - transp, proto = self.loop.run_until_complete(connect) - self.assertIsInstance(proto, MySubprocessProtocol) - self.loop.run_until_complete(proto.connected) + transp, proto = self.loop.run_until_complete(connect) + self.assertIsInstance(proto, MySubprocessProtocol) + self.loop.run_until_complete(proto.connected) - transp.kill() - self.loop.run_until_complete(proto.completed) - self.check_killed(proto.returncode) - transp.close() + transp.kill() + self.loop.run_until_complete(proto.completed) + self.check_killed(proto.returncode) + transp.close() def test_subprocess_terminate(self): prog = os.path.join(os.path.dirname(__file__), 'echo.py') @@ -1850,15 +1846,14 @@ def test_subprocess_terminate(self): functools.partial(MySubprocessProtocol, self.loop), sys.executable, prog) - with self.assertWarns(DeprecationWarning): - transp, proto = self.loop.run_until_complete(connect) - self.assertIsInstance(proto, MySubprocessProtocol) - self.loop.run_until_complete(proto.connected) + transp, proto = self.loop.run_until_complete(connect) + self.assertIsInstance(proto, MySubprocessProtocol) + self.loop.run_until_complete(proto.connected) - transp.terminate() - self.loop.run_until_complete(proto.completed) - self.check_terminated(proto.returncode) - transp.close() + transp.terminate() + self.loop.run_until_complete(proto.completed) + self.check_terminated(proto.returncode) + transp.close() @unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP") def test_subprocess_send_signal(self): @@ -1873,15 +1868,15 @@ def test_subprocess_send_signal(self): functools.partial(MySubprocessProtocol, self.loop), sys.executable, prog) - with self.assertWarns(DeprecationWarning): - transp, proto = self.loop.run_until_complete(connect) - self.assertIsInstance(proto, MySubprocessProtocol) - self.loop.run_until_complete(proto.connected) - transp.send_signal(signal.SIGHUP) - self.loop.run_until_complete(proto.completed) - self.assertEqual(-signal.SIGHUP, proto.returncode) - transp.close() + transp, proto = self.loop.run_until_complete(connect) + self.assertIsInstance(proto, MySubprocessProtocol) + self.loop.run_until_complete(proto.connected) + + transp.send_signal(signal.SIGHUP) + self.loop.run_until_complete(proto.completed) + self.assertEqual(-signal.SIGHUP, proto.returncode) + transp.close() finally: signal.signal(signal.SIGHUP, old_handler) @@ -1892,20 +1887,19 @@ def test_subprocess_stderr(self): functools.partial(MySubprocessProtocol, self.loop), sys.executable, prog) - with self.assertWarns(DeprecationWarning): - transp, proto = self.loop.run_until_complete(connect) - self.assertIsInstance(proto, MySubprocessProtocol) - self.loop.run_until_complete(proto.connected) + transp, proto = self.loop.run_until_complete(connect) + self.assertIsInstance(proto, MySubprocessProtocol) + self.loop.run_until_complete(proto.connected) - stdin = transp.get_pipe_transport(0) - stdin.write(b'test') + stdin = transp.get_pipe_transport(0) + stdin.write(b'test') - self.loop.run_until_complete(proto.completed) + self.loop.run_until_complete(proto.completed) - transp.close() - self.assertEqual(b'OUT:test', proto.data[1]) - self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2]) - self.assertEqual(0, proto.returncode) + transp.close() + self.assertEqual(b'OUT:test', proto.data[1]) + self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2]) + self.assertEqual(0, proto.returncode) def test_subprocess_stderr_redirect_to_stdout(self): prog = os.path.join(os.path.dirname(__file__), 'echo2.py') @@ -1914,23 +1908,23 @@ def test_subprocess_stderr_redirect_to_stdout(self): functools.partial(MySubprocessProtocol, self.loop), sys.executable, prog, stderr=subprocess.STDOUT) - with self.assertWarns(DeprecationWarning): - transp, proto = self.loop.run_until_complete(connect) - self.assertIsInstance(proto, MySubprocessProtocol) - self.loop.run_until_complete(proto.connected) - stdin = transp.get_pipe_transport(0) - self.assertIsNotNone(transp.get_pipe_transport(1)) - self.assertIsNone(transp.get_pipe_transport(2)) + transp, proto = self.loop.run_until_complete(connect) + self.assertIsInstance(proto, MySubprocessProtocol) + self.loop.run_until_complete(proto.connected) - stdin.write(b'test') - self.loop.run_until_complete(proto.completed) - self.assertTrue(proto.data[1].startswith(b'OUT:testERR:test'), - proto.data[1]) - self.assertEqual(b'', proto.data[2]) + stdin = transp.get_pipe_transport(0) + self.assertIsNotNone(transp.get_pipe_transport(1)) + self.assertIsNone(transp.get_pipe_transport(2)) - transp.close() - self.assertEqual(0, proto.returncode) + stdin.write(b'test') + self.loop.run_until_complete(proto.completed) + self.assertTrue(proto.data[1].startswith(b'OUT:testERR:test'), + proto.data[1]) + self.assertEqual(b'', proto.data[2]) + + transp.close() + self.assertEqual(0, proto.returncode) def test_subprocess_close_client_stream(self): prog = os.path.join(os.path.dirname(__file__), 'echo3.py') @@ -1938,33 +1932,33 @@ def test_subprocess_close_client_stream(self): connect = self.loop.subprocess_exec( functools.partial(MySubprocessProtocol, self.loop), sys.executable, prog) - with self.assertWarns(DeprecationWarning): - transp, proto = self.loop.run_until_complete(connect) - self.assertIsInstance(proto, MySubprocessProtocol) - self.loop.run_until_complete(proto.connected) - stdin = transp.get_pipe_transport(0) - stdout = transp.get_pipe_transport(1) - stdin.write(b'test') - self.loop.run_until_complete(proto.got_data[1].wait()) - self.assertEqual(b'OUT:test', proto.data[1]) + transp, proto = self.loop.run_until_complete(connect) + self.assertIsInstance(proto, MySubprocessProtocol) + self.loop.run_until_complete(proto.connected) - stdout.close() - self.loop.run_until_complete(proto.disconnects[1]) - stdin.write(b'xxx') - self.loop.run_until_complete(proto.got_data[2].wait()) - if sys.platform != 'win32': - self.assertEqual(b'ERR:BrokenPipeError', proto.data[2]) - else: - # After closing the read-end of a pipe, writing to the - # write-end using os.write() fails with errno==EINVAL and - # GetLastError()==ERROR_INVALID_NAME on Windows!?! (Using - # WriteFile() we get ERROR_BROKEN_PIPE as expected.) - self.assertEqual(b'ERR:OSError', proto.data[2]) - with test_utils.disable_logger(): - transp.close() - self.loop.run_until_complete(proto.completed) - self.check_killed(proto.returncode) + stdin = transp.get_pipe_transport(0) + stdout = transp.get_pipe_transport(1) + stdin.write(b'test') + self.loop.run_until_complete(proto.got_data[1].wait()) + self.assertEqual(b'OUT:test', proto.data[1]) + + stdout.close() + self.loop.run_until_complete(proto.disconnects[1]) + stdin.write(b'xxx') + self.loop.run_until_complete(proto.got_data[2].wait()) + if sys.platform != 'win32': + self.assertEqual(b'ERR:BrokenPipeError', proto.data[2]) + else: + # After closing the read-end of a pipe, writing to the + # write-end using os.write() fails with errno==EINVAL and + # GetLastError()==ERROR_INVALID_NAME on Windows!?! (Using + # WriteFile() we get ERROR_BROKEN_PIPE as expected.) + self.assertEqual(b'ERR:OSError', proto.data[2]) + with test_utils.disable_logger(): + transp.close() + self.loop.run_until_complete(proto.completed) + self.check_killed(proto.returncode) def test_subprocess_wait_no_same_group(self): # start the new process in a new session diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py index 8c93fae2b51c6c..6c34ef60e30b51 100644 --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -26,24 +26,8 @@ def setUp(self): super().setUp() self.loop = self.new_test_loop() - def test_ctor_loop(self): - loop = mock.Mock() - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=loop) - self.assertIs(lock._loop, loop) - - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) - self.assertIs(lock._loop, self.loop) - - def test_ctor_noloop(self): - asyncio.set_event_loop(self.loop) - lock = asyncio.Lock() - self.assertIs(lock._loop, self.loop) - def test_repr(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + lock = asyncio.Lock() self.assertTrue(repr(lock).endswith('[unlocked]>')) self.assertTrue(RGX_REPR.match(repr(lock))) @@ -52,9 +36,9 @@ def test_repr(self): self.assertTrue(RGX_REPR.match(repr(lock))) def test_lock(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + lock = asyncio.Lock() + with self.assertWarns(DeprecationWarning): @asyncio.coroutine def acquire_lock(): return (yield from lock) @@ -70,14 +54,14 @@ def acquire_lock(): def test_lock_by_with_statement(self): loop = asyncio.new_event_loop() # don't use TestLoop quirks self.set_event_loop(loop) - with self.assertWarns(DeprecationWarning): - primitives = [ - asyncio.Lock(loop=loop), - asyncio.Condition(loop=loop), - asyncio.Semaphore(loop=loop), - asyncio.BoundedSemaphore(loop=loop), - ] + primitives = [ + asyncio.Lock(), + asyncio.Condition(), + asyncio.Semaphore(), + asyncio.BoundedSemaphore(), + ] + with self.assertWarns(DeprecationWarning): @asyncio.coroutine def test(lock): yield from asyncio.sleep(0.01) @@ -95,8 +79,7 @@ def test(lock): self.assertFalse(primitive.locked()) def test_acquire(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + lock = asyncio.Lock() result = [] self.assertTrue(self.loop.run_until_complete(lock.acquire())) @@ -147,8 +130,7 @@ async def c3(result): self.assertTrue(t3.result()) def test_acquire_cancel(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + lock = asyncio.Lock() self.assertTrue(self.loop.run_until_complete(lock.acquire())) task = self.loop.create_task(lock.acquire()) @@ -173,8 +155,7 @@ def test_cancel_race(self): # B's waiter; instead, it should move on to C's waiter. # Setup: A has the lock, b and c are waiting. - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + lock = asyncio.Lock() async def lockit(name, blocker): await lock.acquire() @@ -210,8 +191,7 @@ def test_cancel_release_race(self): # Issue 32734 # Acquire 4 locks, cancel second, release first # and 2 locks are taken at once. - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + lock = asyncio.Lock() lock_count = 0 call_count = 0 @@ -256,8 +236,7 @@ def trigger(): self.assertTrue(t3.cancelled()) def test_finished_waiter_cancelled(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + lock = asyncio.Lock() ta = self.loop.create_task(lock.acquire()) test_utils.run_briefly(self.loop) @@ -279,14 +258,12 @@ def test_finished_waiter_cancelled(self): self.assertTrue(tb.cancelled()) def test_release_not_acquired(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + lock = asyncio.Lock() self.assertRaises(RuntimeError, lock.release) def test_release_no_waiters(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + lock = asyncio.Lock() self.loop.run_until_complete(lock.acquire()) self.assertTrue(lock.locked()) @@ -312,24 +289,8 @@ def setUp(self): super().setUp() self.loop = self.new_test_loop() - def test_ctor_loop(self): - loop = mock.Mock() - with self.assertWarns(DeprecationWarning): - ev = asyncio.Event(loop=loop) - self.assertIs(ev._loop, loop) - - with self.assertWarns(DeprecationWarning): - ev = asyncio.Event(loop=self.loop) - self.assertIs(ev._loop, self.loop) - - def test_ctor_noloop(self): - asyncio.set_event_loop(self.loop) - ev = asyncio.Event() - self.assertIs(ev._loop, self.loop) - def test_repr(self): - with self.assertWarns(DeprecationWarning): - ev = asyncio.Event(loop=self.loop) + ev = asyncio.Event() self.assertTrue(repr(ev).endswith('[unset]>')) match = RGX_REPR.match(repr(ev)) self.assertEqual(match.group('extras'), 'unset') @@ -343,8 +304,7 @@ def test_repr(self): self.assertTrue(RGX_REPR.match(repr(ev))) def test_wait(self): - with self.assertWarns(DeprecationWarning): - ev = asyncio.Event(loop=self.loop) + ev = asyncio.Event() self.assertFalse(ev.is_set()) result = [] @@ -381,16 +341,14 @@ async def c3(result): self.assertIsNone(t3.result()) def test_wait_on_set(self): - with self.assertWarns(DeprecationWarning): - ev = asyncio.Event(loop=self.loop) + ev = asyncio.Event() ev.set() res = self.loop.run_until_complete(ev.wait()) self.assertTrue(res) def test_wait_cancel(self): - with self.assertWarns(DeprecationWarning): - ev = asyncio.Event(loop=self.loop) + ev = asyncio.Event() wait = self.loop.create_task(ev.wait()) self.loop.call_soon(wait.cancel) @@ -400,8 +358,7 @@ def test_wait_cancel(self): self.assertFalse(ev._waiters) def test_clear(self): - with self.assertWarns(DeprecationWarning): - ev = asyncio.Event(loop=self.loop) + ev = asyncio.Event() self.assertFalse(ev.is_set()) ev.set() @@ -411,8 +368,7 @@ def test_clear(self): self.assertFalse(ev.is_set()) def test_clear_with_waiters(self): - with self.assertWarns(DeprecationWarning): - ev = asyncio.Event(loop=self.loop) + ev = asyncio.Event() result = [] async def c1(result): @@ -446,23 +402,8 @@ def setUp(self): super().setUp() self.loop = self.new_test_loop() - def test_ctor_loop(self): - loop = mock.Mock() - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=loop) - self.assertIs(cond._loop, loop) - - cond = asyncio.Condition(loop=self.loop) - self.assertIs(cond._loop, self.loop) - - def test_ctor_noloop(self): - asyncio.set_event_loop(self.loop) - cond = asyncio.Condition() - self.assertIs(cond._loop, self.loop) - def test_wait(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + cond = asyncio.Condition() result = [] async def c1(result): @@ -525,8 +466,7 @@ async def c3(result): self.assertTrue(t3.result()) def test_wait_cancel(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + cond = asyncio.Condition() self.loop.run_until_complete(cond.acquire()) wait = self.loop.create_task(cond.wait()) @@ -538,8 +478,7 @@ def test_wait_cancel(self): self.assertTrue(cond.locked()) def test_wait_cancel_contested(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + cond = asyncio.Condition() self.loop.run_until_complete(cond.acquire()) self.assertTrue(cond.locked()) @@ -565,10 +504,11 @@ def test_wait_cancel_contested(self): def test_wait_cancel_after_notify(self): # See bpo-32841 - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) waited = False + cond = asyncio.Condition() + cond._loop = self.loop + async def wait_on_cond(): nonlocal waited async with cond: @@ -590,15 +530,13 @@ async def wait_on_cond(): self.assertTrue(waited) def test_wait_unacquired(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + cond = asyncio.Condition() self.assertRaises( RuntimeError, self.loop.run_until_complete, cond.wait()) def test_wait_for(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + cond = asyncio.Condition() presult = False def predicate(): @@ -635,8 +573,7 @@ async def c1(result): self.assertTrue(t.result()) def test_wait_for_unacquired(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + cond = asyncio.Condition() # predicate can return true immediately res = self.loop.run_until_complete(cond.wait_for(lambda: [1, 2, 3])) @@ -648,8 +585,7 @@ def test_wait_for_unacquired(self): cond.wait_for(lambda: False)) def test_notify(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + cond = asyncio.Condition() result = [] async def c1(result): @@ -701,8 +637,7 @@ async def c3(result): self.assertTrue(t3.result()) def test_notify_all(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + cond = asyncio.Condition() result = [] @@ -738,18 +673,15 @@ async def c2(result): self.assertTrue(t2.result()) def test_notify_unacquired(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + cond = asyncio.Condition() self.assertRaises(RuntimeError, cond.notify) def test_notify_all_unacquired(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + cond = asyncio.Condition() self.assertRaises(RuntimeError, cond.notify_all) def test_repr(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + cond = asyncio.Condition() self.assertTrue('unlocked' in repr(cond)) self.assertTrue(RGX_REPR.match(repr(cond))) @@ -775,9 +707,8 @@ async def f(): self.loop.run_until_complete(f()) def test_explicit_lock(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) - cond = asyncio.Condition(lock, loop=self.loop) + lock = asyncio.Lock() + cond = asyncio.Condition(lock) self.assertIs(cond._lock, lock) self.assertIs(cond._loop, lock._loop) @@ -785,23 +716,27 @@ def test_explicit_lock(self): def test_ambiguous_loops(self): loop = self.new_test_loop() self.addCleanup(loop.close) - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + + lock = asyncio.Lock() + lock._loop = loop + + async def _create_condition(): with self.assertRaises(ValueError): - asyncio.Condition(lock, loop=loop) + asyncio.Condition(lock) + + self.loop.run_until_complete(_create_condition()) def test_timeout_in_block(self): loop = asyncio.new_event_loop() self.addCleanup(loop.close) async def task_timeout(): - condition = asyncio.Condition(loop=loop) + condition = asyncio.Condition() async with condition: with self.assertRaises(asyncio.TimeoutError): await asyncio.wait_for(condition.wait(), timeout=0.5) - with self.assertWarns(DeprecationWarning): - loop.run_until_complete(task_timeout()) + loop.run_until_complete(task_timeout()) class SemaphoreTests(test_utils.TestCase): @@ -810,29 +745,12 @@ def setUp(self): super().setUp() self.loop = self.new_test_loop() - def test_ctor_loop(self): - loop = mock.Mock() - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(loop=loop) - self.assertIs(sem._loop, loop) - - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(loop=self.loop) - self.assertIs(sem._loop, self.loop) - - def test_ctor_noloop(self): - asyncio.set_event_loop(self.loop) - sem = asyncio.Semaphore() - self.assertIs(sem._loop, self.loop) - def test_initial_value_zero(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(0, loop=self.loop) + sem = asyncio.Semaphore(0) self.assertTrue(sem.locked()) def test_repr(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(loop=self.loop) + sem = asyncio.Semaphore() self.assertTrue(repr(sem).endswith('[unlocked, value:1]>')) self.assertTrue(RGX_REPR.match(repr(sem))) @@ -850,8 +768,7 @@ def test_repr(self): self.assertTrue(RGX_REPR.match(repr(sem))) def test_semaphore(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(loop=self.loop) + sem = asyncio.Semaphore() self.assertEqual(1, sem._value) with self.assertWarns(DeprecationWarning): @@ -872,8 +789,7 @@ def test_semaphore_value(self): self.assertRaises(ValueError, asyncio.Semaphore, -1) def test_acquire(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(3, loop=self.loop) + sem = asyncio.Semaphore(3) result = [] self.assertTrue(self.loop.run_until_complete(sem.acquire())) @@ -934,8 +850,7 @@ async def c4(result): self.loop.run_until_complete(asyncio.gather(*race_tasks)) def test_acquire_cancel(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(loop=self.loop) + sem = asyncio.Semaphore() self.loop.run_until_complete(sem.acquire()) acquire = self.loop.create_task(sem.acquire()) @@ -947,8 +862,7 @@ def test_acquire_cancel(self): all(waiter.done() for waiter in sem._waiters)) def test_acquire_cancel_before_awoken(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(value=0, loop=self.loop) + sem = asyncio.Semaphore(value=0) t1 = self.loop.create_task(sem.acquire()) t2 = self.loop.create_task(sem.acquire()) @@ -970,8 +884,7 @@ def test_acquire_cancel_before_awoken(self): test_utils.run_briefly(self.loop) def test_acquire_hang(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(value=0, loop=self.loop) + sem = asyncio.Semaphore(value=0) t1 = self.loop.create_task(sem.acquire()) t2 = self.loop.create_task(sem.acquire()) @@ -985,14 +898,12 @@ def test_acquire_hang(self): self.assertTrue(sem.locked()) def test_release_not_acquired(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.BoundedSemaphore(loop=self.loop) + sem = asyncio.BoundedSemaphore() self.assertRaises(ValueError, sem.release) def test_release_no_waiters(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(loop=self.loop) + sem = asyncio.Semaphore() self.loop.run_until_complete(sem.acquire()) self.assertTrue(sem.locked()) diff --git a/Lib/test/test_asyncio/test_pep492.py b/Lib/test/test_asyncio/test_pep492.py index c5e3a5c1483573..4bd50f4123e579 100644 --- a/Lib/test/test_asyncio/test_pep492.py +++ b/Lib/test/test_asyncio/test_pep492.py @@ -43,13 +43,12 @@ def setUp(self): class LockTests(BaseTest): def test_context_manager_async_with(self): - with self.assertWarns(DeprecationWarning): - primitives = [ - asyncio.Lock(loop=self.loop), - asyncio.Condition(loop=self.loop), - asyncio.Semaphore(loop=self.loop), - asyncio.BoundedSemaphore(loop=self.loop), - ] + primitives = [ + asyncio.Lock(), + asyncio.Condition(), + asyncio.Semaphore(), + asyncio.BoundedSemaphore(), + ] async def test(lock): await asyncio.sleep(0.01) @@ -66,13 +65,12 @@ async def test(lock): self.assertFalse(primitive.locked()) def test_context_manager_with_await(self): - with self.assertWarns(DeprecationWarning): - primitives = [ - asyncio.Lock(loop=self.loop), - asyncio.Condition(loop=self.loop), - asyncio.Semaphore(loop=self.loop), - asyncio.BoundedSemaphore(loop=self.loop), - ] + primitives = [ + asyncio.Lock(), + asyncio.Condition(), + asyncio.Semaphore(), + asyncio.BoundedSemaphore(), + ] async def test(lock): await asyncio.sleep(0.01) diff --git a/Lib/test/test_asyncio/test_queues.py b/Lib/test/test_asyncio/test_queues.py index 5c9aaa82c311a5..dc97673b6f1945 100644 --- a/Lib/test/test_asyncio/test_queues.py +++ b/Lib/test/test_asyncio/test_queues.py @@ -35,14 +35,13 @@ def gen(): loop = self.new_test_loop(gen) - with self.assertWarns(DeprecationWarning): - q = asyncio.Queue(loop=loop) + q = asyncio.Queue() self.assertTrue(fn(q).startswith(' Date: Wed, 25 Nov 2020 06:03:31 +0800 Subject: [PATCH 0643/1261] bpo-40170: Hide impl detail of Py_TRASHCAN_BEGIN macro (GH-23235) The Py_TRASHCAN_BEGIN macro no longer accesses PyTypeObject attributes, but now can get the condition by calling the new private _PyTrash_cond() function which hides implementation details. --- Include/cpython/object.h | 4 +++- .../next/C API/2020-11-13-01-40-28.bpo-40170.uh8lEf.rst | 3 +++ Objects/object.c | 9 +++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-13-01-40-28.bpo-40170.uh8lEf.rst diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 43b0be37557a3f..19c066b0ab78c7 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -516,6 +516,8 @@ struct _ts; /* Python 3.9 private API, invoked by the macros below. */ PyAPI_FUNC(int) _PyTrash_begin(struct _ts *tstate, PyObject *op); PyAPI_FUNC(void) _PyTrash_end(struct _ts *tstate); +/* Python 3.10 private API, invoked by the Py_TRASHCAN_BEGIN(). */ +PyAPI_FUNC(int) _PyTrash_cond(PyObject *op, destructor dealloc); #define PyTrash_UNWIND_LEVEL 50 @@ -539,7 +541,7 @@ PyAPI_FUNC(void) _PyTrash_end(struct _ts *tstate); #define Py_TRASHCAN_BEGIN(op, dealloc) \ Py_TRASHCAN_BEGIN_CONDITION(op, \ - Py_TYPE(op)->tp_dealloc == (destructor)(dealloc)) + _PyTrash_cond(_PyObject_CAST(op), (destructor)dealloc)) /* For backwards compatibility, these macros enable the trashcan * unconditionally */ diff --git a/Misc/NEWS.d/next/C API/2020-11-13-01-40-28.bpo-40170.uh8lEf.rst b/Misc/NEWS.d/next/C API/2020-11-13-01-40-28.bpo-40170.uh8lEf.rst new file mode 100644 index 00000000000000..741f9520686f31 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-13-01-40-28.bpo-40170.uh8lEf.rst @@ -0,0 +1,3 @@ +The ``Py_TRASHCAN_BEGIN`` macro no longer accesses PyTypeObject attributes, +but now can get the condition by calling the new private +:c:func:`_PyTrash_cond()` function which hides implementation details. diff --git a/Objects/object.c b/Objects/object.c index be7790eefd118f..2e8717f506ca0e 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2134,6 +2134,15 @@ _PyTrash_end(PyThreadState *tstate) } +/* bpo-40170: It's only be used in Py_TRASHCAN_BEGIN macro to hide + implementation details. */ +int +_PyTrash_cond(PyObject *op, destructor dealloc) +{ + return Py_TYPE(op)->tp_dealloc == dealloc; +} + + void _Py_NO_RETURN _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, const char *file, int line, const char *function) From 56560d9522f6fdc5c6cb5e3cd140e1c8013b730e Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 24 Nov 2020 20:57:02 -0800 Subject: [PATCH 0644/1261] Add doctests to the descriptor HowTo (GH-23500) --- Doc/howto/descriptor.rst | 454 ++++++++++++++++++++++++++++++++++----- 1 file changed, 397 insertions(+), 57 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 8c6e90319a7f36..e94f0ef88416ed 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -43,21 +43,26 @@ Simple example: A descriptor that returns a constant ---------------------------------------------------- The :class:`Ten` class is a descriptor that always returns the constant ``10`` -from its :meth:`__get__` method:: +from its :meth:`__get__` method: +.. testcode:: class Ten: def __get__(self, obj, objtype=None): return 10 -To use the descriptor, it must be stored as a class variable in another class:: +To use the descriptor, it must be stored as a class variable in another class: + +.. testcode:: class A: x = 5 # Regular class attribute y = Ten() # Descriptor instance An interactive session shows the difference between normal attribute lookup -and descriptor lookup:: +and descriptor lookup: + +.. doctest:: >>> a = A() # Make an instance of class A >>> a.x # Normal attribute lookup @@ -83,7 +88,9 @@ Dynamic lookups --------------- Interesting descriptors typically run computations instead of returning -constants:: +constants: + +.. testcode:: import os @@ -131,7 +138,9 @@ the public attribute is accessed. In the following example, *age* is the public attribute and *_age* is the private attribute. When the public attribute is accessed, the descriptor logs -the lookup or update:: +the lookup or update: + +.. testcode:: import logging @@ -201,7 +210,9 @@ variable name was used. In this example, the :class:`Person` class has two descriptor instances, *name* and *age*. When the :class:`Person` class is defined, it makes a callback to :meth:`__set_name__` in *LoggedAccess* so that the field names can -be recorded, giving each descriptor its own *public_name* and *private_name*:: +be recorded, giving each descriptor its own *public_name* and *private_name*: + +.. testcode:: import logging @@ -236,7 +247,9 @@ be recorded, giving each descriptor its own *public_name* and *private_name*:: An interactive session shows that the :class:`Person` class has called :meth:`__set_name__` so that the field names would be recorded. Here -we call :func:`vars` to look up the descriptor without triggering it:: +we call :func:`vars` to look up the descriptor without triggering it: + +.. doctest:: >>> vars(vars(Person)['name']) {'public_name': 'name', 'private_name': '_name'} @@ -307,7 +320,9 @@ restrictions. If those restrictions aren't met, it raises an exception to prevent data corruption at its source. This :class:`Validator` class is both an :term:`abstract base class` and a -managed attribute descriptor:: +managed attribute descriptor: + +.. testcode:: from abc import ABC, abstractmethod @@ -347,7 +362,7 @@ Here are three practical data validation utilities: user-defined `predicate `_ as well. -:: +.. testcode:: class OneOf(Validator): @@ -400,10 +415,12 @@ Here are three practical data validation utilities: ) -Practical use -------------- +Practical application +--------------------- + +Here's how the data validators can be used in a real class: -Here's how the data validators can be used in a real class:: +.. testcode:: class Component: @@ -418,11 +435,26 @@ Here's how the data validators can be used in a real class:: The descriptors prevent invalid instances from being created:: - Component('WIDGET', 'metal', 5) # Allowed. - Component('Widget', 'metal', 5) # Blocked: 'Widget' is not all uppercase - Component('WIDGET', 'metle', 5) # Blocked: 'metle' is misspelled - Component('WIDGET', 'metal', -5) # Blocked: -5 is negative - Component('WIDGET', 'metal', 'V') # Blocked: 'V' isn't a number + >>> Component('Widget', 'metal', 5) # Blocked: 'Widget' is not all uppercase + Traceback (most recent call last): + ... + ValueError: Expected to be true for 'Widget' + + >>> Component('WIDGET', 'metle', 5) # Blocked: 'metle' is misspelled + Traceback (most recent call last): + ... + ValueError: Expected 'metle' to be one of {'metal', 'plastic', 'wood'} + + >>> Component('WIDGET', 'metal', -5) # Blocked: -5 is negative + Traceback (most recent call last): + ... + ValueError: Expected -5 to be at least 0 + >>> Component('WIDGET', 'metal', 'V') # Blocked: 'V' isn't a number + Traceback (most recent call last): + ... + TypeError: Expected 'V' to be an int or float + + >>> c = Component('WIDGET', 'metal', 5) # Allowed: The inputs are valid Technical Tutorial @@ -526,7 +558,9 @@ If a descriptor is found for ``a.x``, then it is invoked with: ``desc.__get__(a, type(a))``. The logic for a dotted lookup is in :meth:`object.__getattribute__`. Here is -a pure Python equivalent:: +a pure Python equivalent: + +.. testcode:: def object_getattribute(obj, name): "Emulate PyObject_GenericGetAttr() in Objects/object.c" @@ -546,9 +580,108 @@ a pure Python equivalent:: return cls_var # class variable raise AttributeError(name) + +.. testcode:: + :hide: + + # Test the fidelity of object_getattribute() by comparing it with the + # normal object.__getattribute__(). The former will be accessed by + # square brackets and the latter by the dot operator. + + class Object: + + def __getitem__(obj, name): + try: + return object_getattribute(obj, name) + except AttributeError: + if not hasattr(type(obj), '__getattr__'): + raise + return type(obj).__getattr__(obj, name) # __getattr__ + + class DualOperator(Object): + + x = 10 + + def __init__(self, z): + self.z = z + + @property + def p2(self): + return 2 * self.x + + @property + def p3(self): + return 3 * self.x + + def m5(self, y): + return 5 * y + + def m7(self, y): + return 7 * y + + def __getattr__(self, name): + return ('getattr_hook', self, name) + + class DualOperatorWithSlots: + + __getitem__ = Object.__getitem__ + + __slots__ = ['z'] + + x = 15 + + def __init__(self, z): + self.z = z + + @property + def p2(self): + return 2 * self.x + + def m5(self, y): + return 5 * y + + def __getattr__(self, name): + return ('getattr_hook', self, name) + + +.. doctest:: + :hide: + + >>> a = DualOperator(11) + >>> vars(a).update(p3 = '_p3', m7 = '_m7') + >>> a.x == a['x'] == 10 + True + >>> a.z == a['z'] == 11 + True + >>> a.p2 == a['p2'] == 20 + True + >>> a.p3 == a['p3'] == 30 + True + >>> a.m5(100) == a.m5(100) == 500 + True + >>> a.m7 == a['m7'] == '_m7' + True + >>> a.g == a['g'] == ('getattr_hook', a, 'g') + True + + >>> b = DualOperatorWithSlots(22) + >>> b.x == b['x'] == 15 + True + >>> b.z == b['z'] == 22 + True + >>> b.p2 == b['p2'] == 30 + True + >>> b.m5(200) == b['m5'](200) == 1000 + True + >>> b.g == b['g'] == ('getattr_hook', b, 'g') + True + + Interestingly, attribute lookup doesn't call :meth:`object.__getattribute__` directly. Instead, both the dot operator and the :func:`getattr` function -perform attribute lookup by way of a helper function:: +perform attribute lookup by way of a helper function: + +.. testcode:: def getattr_hook(obj, name): "Emulate slot_tp_getattr_hook() in Objects/typeobject.c" @@ -650,7 +783,9 @@ be used to implement an `object relational mapping The essential idea is that the data is stored in an external database. The Python instances only hold keys to the database's tables. Descriptors take -care of lookups or updates:: +care of lookups or updates: + +.. testcode:: class Field: @@ -665,8 +800,11 @@ care of lookups or updates:: conn.execute(self.store, [value, obj.key]) conn.commit() -We can use the :class:`Field` class to define "models" that describe the schema -for each table in a database:: +We can use the :class:`Field` class to define `models +`_ that describe the schema for +each table in a database: + +.. testcode:: class Movie: table = 'Movies' # Table name @@ -687,12 +825,41 @@ for each table in a database:: def __init__(self, key): self.key = key -An interactive session shows how data is retrieved from the database and how -it can be updated:: +To use the models, first connect to the database:: >>> import sqlite3 >>> conn = sqlite3.connect('entertainment.db') +An interactive session shows how data is retrieved from the database and how +it can be updated: + +.. testsetup:: + + song_data = [ + ('Country Roads', 'John Denver', 1972), + ('Me and Bobby McGee', 'Janice Joplin', 1971), + ('Coal Miners Daughter', 'Loretta Lynn', 1970), + ] + + movie_data = [ + ('Star Wars', 'George Lucas', 1977), + ('Jaws', 'Steven Spielberg', 1975), + ('Aliens', 'James Cameron', 1986), + ] + + import sqlite3 + + conn = sqlite3.connect(':memory:') + conn.execute('CREATE TABLE Music (title text, artist text, year integer);') + conn.execute('CREATE INDEX MusicNdx ON Music (title);') + conn.executemany('INSERT INTO Music VALUES (?, ?, ?);', song_data) + conn.execute('CREATE TABLE Movies (title text, director text, year integer);') + conn.execute('CREATE INDEX MovieNdx ON Music (title);') + conn.executemany('INSERT INTO Movies VALUES (?, ?, ?);', movie_data) + conn.commit() + +.. doctest:: + >>> Movie('Star Wars').director 'George Lucas' >>> jaws = Movie('Jaws') @@ -724,7 +891,9 @@ triggers a function call upon access to an attribute. Its signature is:: property(fget=None, fset=None, fdel=None, doc=None) -> property -The documentation shows a typical use to define a managed attribute ``x``:: +The documentation shows a typical use to define a managed attribute ``x``: + +.. testcode:: class C: def getx(self): return self.__x @@ -733,7 +902,9 @@ The documentation shows a typical use to define a managed attribute ``x``:: x = property(getx, setx, delx, "I'm the 'x' property.") To see how :func:`property` is implemented in terms of the descriptor protocol, -here is a pure Python equivalent:: +here is a pure Python equivalent: + +.. testcode:: class Property: "Emulate PyProperty_Type() in Objects/descrobject.c" @@ -772,6 +943,57 @@ here is a pure Python equivalent:: def deleter(self, fdel): return type(self)(self.fget, self.fset, fdel, self.__doc__) +.. testcode:: + :hide: + + # Verify the Property() emulation + + class CC: + def getx(self): + return self.__x + def setx(self, value): + self.__x = value + def delx(self): + del self.__x + x = Property(getx, setx, delx, "I'm the 'x' property.") + + # Now do it again but use the decorator style + + class CCC: + @Property + def x(self): + return self.__x + @x.setter + def x(self, value): + self.__x = value + @x.deleter + def x(self): + del self.__x + + +.. doctest:: + :hide: + + >>> cc = CC() + >>> hasattr(cc, 'x') + False + >>> cc.x = 33 + >>> cc.x + 33 + >>> del cc.x + >>> hasattr(cc, 'x') + False + + >>> ccc = CCC() + >>> hasattr(ccc, 'x') + False + >>> ccc.x = 333 + >>> ccc.x == 333 + True + >>> del ccc.x + >>> hasattr(ccc, 'x') + False + The :func:`property` builtin helps whenever a user interface has granted attribute access and then subsequent changes require the intervention of a method. @@ -780,7 +1002,9 @@ For instance, a spreadsheet class may grant access to a cell value through ``Cell('b10').value``. Subsequent improvements to the program require the cell to be recalculated on every access; however, the programmer does not want to affect existing client code accessing the attribute directly. The solution is -to wrap access to the value attribute in a property data descriptor:: +to wrap access to the value attribute in a property data descriptor: + +.. testcode:: class Cell: ... @@ -791,6 +1015,9 @@ to wrap access to the value attribute in a property data descriptor:: self.recalc() return self._value +Either the built-in :func:`property` or our :func:`Property` equivalent would +work in this example. + Functions and methods --------------------- @@ -804,7 +1031,9 @@ prepended to the other arguments. By convention, the instance is called *self* but could be called *this* or any other variable name. Methods can be created manually with :class:`types.MethodType` which is -roughly equivalent to:: +roughly equivalent to: + +.. testcode:: class MethodType: "Emulate Py_MethodType in Objects/classobject.c" @@ -821,7 +1050,9 @@ roughly equivalent to:: To support automatic creation of methods, functions include the :meth:`__get__` method for binding methods during attribute access. This means that functions are non-data descriptors that return bound methods -during dotted lookup from an instance. Here's how it works:: +during dotted lookup from an instance. Here's how it works: + +.. testcode:: class Function: ... @@ -833,13 +1064,17 @@ during dotted lookup from an instance. Here's how it works:: return MethodType(self, obj) Running the following class in the interpreter shows how the function -descriptor works in practice:: +descriptor works in practice: + +.. testcode:: class D: def f(self, x): return x -The function has a :term:`qualified name` attribute to support introspection:: +The function has a :term:`qualified name` attribute to support introspection: + +.. doctest:: >>> D.f.__qualname__ 'D.f' @@ -867,7 +1102,7 @@ Internally, the bound method stores the underlying function and the bound instance:: >>> d.f.__func__ - + >>> d.f.__self__ <__main__.D object at 0x1012e1f98> @@ -919,20 +1154,26 @@ It can be called either from an object or the class: ``s.erf(1.5) --> .9332`` o ``Sample.erf(1.5) --> .9332``. Since static methods return the underlying function with no changes, the -example calls are unexciting:: +example calls are unexciting: + +.. testcode:: class E: @staticmethod def f(x): print(x) +.. doctest:: + >>> E.f(3) 3 >>> E().f(3) 3 Using the non-data descriptor protocol, a pure Python version of -:func:`staticmethod` would look like this:: +:func:`staticmethod` would look like this: + +.. doctest:: class StaticMethod: "Emulate PyStaticMethod_Type() in Objects/funcobject.c" @@ -949,27 +1190,31 @@ Class methods Unlike static methods, class methods prepend the class reference to the argument list before calling the function. This format is the same -for whether the caller is an object or a class:: +for whether the caller is an object or a class: + +.. testcode:: class F: @classmethod def f(cls, x): return cls.__name__, x - >>> print(F.f(3)) +.. doctest:: + + >>> F.f(3) ('F', 3) - >>> print(F().f(3)) + >>> F().f(3) ('F', 3) This behavior is useful whenever the method only needs to have a class reference and does rely on data stored in a specific instance. One use for class methods is to create alternate class constructors. For example, the classmethod :func:`dict.fromkeys` creates a new dictionary from a list of -keys. The pure Python equivalent is:: +keys. The pure Python equivalent is: - class Dict: - ... +.. testcode:: + class Dict(dict): @classmethod def fromkeys(cls, iterable, value=None): "Emulate dict_fromkeys() in Objects/dictobject.c" @@ -978,13 +1223,17 @@ keys. The pure Python equivalent is:: d[key] = value return d -Now a new dictionary of unique keys can be constructed like this:: +Now a new dictionary of unique keys can be constructed like this: + +.. doctest:: >>> Dict.fromkeys('abracadabra') - {'a': None, 'r': None, 'b': None, 'c': None, 'd': None} + {'a': None, 'b': None, 'r': None, 'c': None, 'd': None} Using the non-data descriptor protocol, a pure Python version of -:func:`classmethod` would look like this:: +:func:`classmethod` would look like this: + +.. testcode:: class ClassMethod: "Emulate PyClassMethod_Type() in Objects/funcobject.c" @@ -999,9 +1248,31 @@ Using the non-data descriptor protocol, a pure Python version of return self.f.__get__(cls) return MethodType(self.f, cls) +.. testcode:: + :hide: + + # Verify the emulation works + class T: + @ClassMethod + def cm(cls, x, y): + return (cls, x, y) + +.. doctest:: + :hide: + + >>> T.cm(11, 22) + (, 11, 22) + + # Also call it from an instance + >>> t = T() + >>> t.cm(11, 22) + (, 11, 22) + The code path for ``hasattr(obj, '__get__')`` was added in Python 3.9 and makes it possible for :func:`classmethod` to support chained decorators. -For example, a classmethod and property could be chained together:: +For example, a classmethod and property could be chained together: + +.. testcode:: class G: @classmethod @@ -1009,6 +1280,12 @@ For example, a classmethod and property could be chained together:: def __doc__(cls): return f'A doc for {cls.__name__!r}' +.. doctest:: + + >>> G.__doc__ + "A doc for 'G'" + + Member objects and __slots__ ---------------------------- @@ -1017,11 +1294,15 @@ fixed-length array of slot values. From a user point of view that has several effects: 1. Provides immediate detection of bugs due to misspelled attribute -assignments. Only attribute names specified in ``__slots__`` are allowed:: +assignments. Only attribute names specified in ``__slots__`` are allowed: + +.. testcode:: class Vehicle: __slots__ = ('id_number', 'make', 'model') +.. doctest:: + >>> auto = Vehicle() >>> auto.id_nubmer = 'VYE483814LQEX' Traceback (most recent call last): @@ -1029,7 +1310,9 @@ assignments. Only attribute names specified in ``__slots__`` are allowed:: AttributeError: 'Vehicle' object has no attribute 'id_nubmer' 2. Helps create immutable objects where descriptors manage access to private -attributes stored in ``__slots__``:: +attributes stored in ``__slots__``: + +.. testcode:: class Immutable: @@ -1047,7 +1330,19 @@ attributes stored in ``__slots__``:: def name(self): # Read-only descriptor return self._name - mark = Immutable('Botany', 'Mark Watney') # Create an immutable instance +.. doctest:: + + >>> mark = Immutable('Botany', 'Mark Watney') + >>> mark.dept + 'Botany' + >>> mark.dept = 'Space Pirate' + Traceback (most recent call last): + ... + AttributeError: can't set attribute + >>> mark.location = 'Mars' + Traceback (most recent call last): + ... + AttributeError: 'Immutable' object has no attribute 'location' 3. Saves memory. On a 64-bit Linux build, an instance with two attributes takes 48 bytes with ``__slots__`` and 152 bytes without. This `flyweight @@ -1055,7 +1350,9 @@ design pattern `_ likely only matters when a large number of instances are going to be created. 4. Blocks tools like :func:`functools.cached_property` which require an -instance dictionary to function correctly:: +instance dictionary to function correctly: + +.. testcode:: from functools import cached_property @@ -1067,17 +1364,21 @@ instance dictionary to function correctly:: return 4 * sum((-1.0)**n / (2.0*n + 1.0) for n in reversed(range(100_000))) +.. doctest:: + >>> CP().pi Traceback (most recent call last): ... TypeError: No '__dict__' attribute on 'CP' instance to cache 'pi' property. -It's not possible to create an exact drop-in pure Python version of +It is not possible to create an exact drop-in pure Python version of ``__slots__`` because it requires direct access to C structures and control over object memory allocation. However, we can build a mostly faithful simulation where the actual C structure for slots is emulated by a private ``_slotvalues`` list. Reads and writes to that private structure are managed -by member descriptors:: +by member descriptors: + +.. testcode:: null = object() @@ -1114,7 +1415,9 @@ by member descriptors:: return f'' The :meth:`type.__new__` method takes care of adding member objects to class -variables:: +variables: + +.. testcode:: class Type(type): 'Simulate how the type metaclass adds member objects for slots' @@ -1129,7 +1432,9 @@ variables:: The :meth:`object.__new__` method takes care of creating instances that have slots instead of an instance dictionary. Here is a rough simulation in pure -Python:: +Python: + +.. testcode:: class Object: 'Simulate how object.__new__() allocates memory for __slots__' @@ -1161,7 +1466,9 @@ Python:: super().__delattr__(name) To use the simulation in a real class, just inherit from :class:`Object` and -set the :term:`metaclass` to :class:`Type`:: +set the :term:`metaclass` to :class:`Type`: + +.. testcode:: class H(Object, metaclass=Type): 'Instance variables stored in slots' @@ -1174,8 +1481,8 @@ set the :term:`metaclass` to :class:`Type`:: At this point, the metaclass has loaded member objects for *x* and *y*:: - >>> import pprint - >>> pprint.pp(dict(vars(H))) + >>> from pprint import pp + >>> pp(dict(vars(H))) {'__module__': '__main__', '__doc__': 'Instance variables stored in slots', 'slot_names': ['x', 'y'], @@ -1183,8 +1490,20 @@ At this point, the metaclass has loaded member objects for *x* and *y*:: 'x': , 'y': } +.. doctest:: + :hide: + + # We test this separately because the preceding section is not + # doctestable due to the hex memory address for the __init__ function + >>> isinstance(vars(H)['x'], Member) + True + >>> isinstance(vars(H)['y'], Member) + True + When instances are created, they have a ``slot_values`` list where the -attributes are stored:: +attributes are stored: + +.. doctest:: >>> h = H(10, 20) >>> vars(h) @@ -1193,9 +1512,30 @@ attributes are stored:: >>> vars(h) {'_slotvalues': [55, 20]} -Misspelled or unassigned attributes will raise an exception:: +Misspelled or unassigned attributes will raise an exception: + +.. doctest:: >>> h.xz Traceback (most recent call last): ... AttributeError: 'H' object has no attribute 'xz' + +.. doctest:: + :hide: + + # Examples for deleted attributes are not shown because this section + # is already a bit lengthy. We still test that code here. + >>> del h.x + >>> hasattr(h, 'x') + False + + # Also test the code for uninitialized slots + >>> class HU(Object, metaclass=Type): + ... slot_names = ['x', 'y'] + ... + >>> hu = HU() + >>> hasattr(hu, 'x') + False + >>> hasattr(hu, 'y') + False From 70d3898180d9c36369ff80765fb79eb292ce4512 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Wed, 25 Nov 2020 11:59:59 +0700 Subject: [PATCH 0645/1261] Doc: Minor fixes (GH-23422) --- Doc/library/stdtypes.rst | 2 +- Doc/whatsnew/3.10.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 84d5a3a59f0b40..59c2b84b52719c 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -5065,7 +5065,7 @@ instantiated from the type:: >>> class M(type): ... def __or__(self, other): - ... return "Hello" + ... return "Hello" ... >>> class C(metaclass=M): ... pass diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index f3e433abf08283..c5efaaa5047e2b 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -120,8 +120,8 @@ See :pep:`613` for more details. (Contributed by Mikhail Golubev in :issue:`41923`.) -PEP604: New Type Union Operator -------------------------------- +PEP 604: New Type Union Operator +-------------------------------- A new type union operator was introduced which enables the syntax ``X | Y``. This provides a cleaner way of expressing 'either type X or type Y' instead of From 2934d7e067bc52b50d327b45db59b5a4fa7bcb5a Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Wed, 25 Nov 2020 10:18:00 +0100 Subject: [PATCH 0646/1261] bpo-42238: Doc: Remove make suspicious from the CI and docs builds. (GH-23313) It probably helped a lot a while back, but may not be as usefull today. We'll continue monitoring it before deletion, so true positives can be migrated to rstlint. --- .azure-pipelines/docs-steps.yml | 2 +- .github/workflows/doc.yml | 2 +- .travis.yml | 2 +- Doc/Makefile | 1 - .../next/Documentation/2020-11-24-22-54-49.bpo-42238.62EOTu.rst | 2 ++ 5 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2020-11-24-22-54-49.bpo-42238.62EOTu.rst diff --git a/.azure-pipelines/docs-steps.yml b/.azure-pipelines/docs-steps.yml index eaf4ad01927aeb..55c38611b95c81 100644 --- a/.azure-pipelines/docs-steps.yml +++ b/.azure-pipelines/docs-steps.yml @@ -16,7 +16,7 @@ steps: displayName: 'Install build dependencies' - ${{ if ne(parameters.latex, 'true') }}: - - script: make check suspicious html PYTHON=python + - script: make check html PYTHON=python workingDirectory: '$(build.sourcesDirectory)/Doc' displayName: 'Build documentation' diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 7c6012eed4f2d2..f0dbfcd9d3b49e 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -36,7 +36,7 @@ jobs: - name: 'Install build dependencies' run: make -C Doc/ PYTHON=../python venv - name: 'Build documentation' - run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" doctest suspicious html + run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" doctest html - name: 'Upload' uses: actions/upload-artifact@v2.2.0 with: diff --git a/.travis.yml b/.travis.yml index 254a4ea35ab944..dfdf670bff5f9b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -53,7 +53,7 @@ matrix: - cd Doc - make venv PYTHON=python script: - - make check suspicious html SPHINXOPTS="-q -W -j4" + - make check html SPHINXOPTS="-q -W -j4" - name: "Documentation tests" os: linux language: c diff --git a/Doc/Makefile b/Doc/Makefile index 6bf1f408b56f0d..c24c70c699a06a 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -216,7 +216,6 @@ serve: # for development releases: always build autobuild-dev: make dist SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' - -make suspicious # for quick rebuilds (HTML only) autobuild-dev-html: diff --git a/Misc/NEWS.d/next/Documentation/2020-11-24-22-54-49.bpo-42238.62EOTu.rst b/Misc/NEWS.d/next/Documentation/2020-11-24-22-54-49.bpo-42238.62EOTu.rst new file mode 100644 index 00000000000000..d9edf9cdf79b3d --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-11-24-22-54-49.bpo-42238.62EOTu.rst @@ -0,0 +1,2 @@ +Tentative to deprecate ``make suspicious`` by first removing it from the CI +and documentation builds, but keeping it around for manual uses. From 4d4b4f4e5824424ce1795d49cbe55bd93b4345ed Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Wed, 25 Nov 2020 10:23:17 +0100 Subject: [PATCH 0647/1261] bpo-12800: tarfile: Restore fix from 011525ee9 (GH-21409) Restore fix from 011525ee92eb1c13ad1a62d28725a840e28f8160. --- Lib/tarfile.py | 3 +++ Lib/test/test_tarfile.py | 6 +++--- .../next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst | 4 ++++ 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index e42279470dac65..1d15612616f1d8 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -2237,6 +2237,9 @@ def makelink(self, tarinfo, targetpath): try: # For systems that support symbolic and hard links. if tarinfo.issym(): + if os.path.lexists(targetpath): + # Avoid FileExistsError on following os.symlink. + os.unlink(targetpath) os.symlink(tarinfo.linkname, targetpath) else: # See extract(). diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 7b34d53d216013..77ad8305c3107a 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1347,10 +1347,10 @@ def test_extractall_symlinks(self): f.write('something\n') os.symlink(source_file, target_file) with tarfile.open(temparchive, 'w') as tar: - tar.add(source_file) - tar.add(target_file) + tar.add(source_file, arcname="source") + tar.add(target_file, arcname="symlink") # Let's extract it to the location which contains the symlink - with tarfile.open(temparchive) as tar: + with tarfile.open(temparchive, errorlevel=2) as tar: # this should not raise OSError: [Errno 17] File exists try: tar.extractall(path=tempdir) diff --git a/Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst b/Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst new file mode 100644 index 00000000000000..fdd7c5e74f33a3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst @@ -0,0 +1,4 @@ +Extracting a symlink from a tarball should succeed and overwrite the symlink +if it already exists. The fix is to remove the existing file or symlink +before extraction. Based on patch by Chris AtLee, Jeffrey Kintscher, and +Senthil Kumaran. From 7553f04e226a437243b55864e80cabd1615c6c28 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 25 Nov 2020 01:54:24 -0800 Subject: [PATCH 0648/1261] Add more tests to the descriptor howto guide (GH-23506) --- Doc/howto/descriptor.rst | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index e94f0ef88416ed..bc741c738b98da 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -170,7 +170,15 @@ the lookup or update: An interactive session shows that all access to the managed attribute *age* is -logged, but that the regular attribute *name* is not logged:: +logged, but that the regular attribute *name* is not logged: + +.. testcode:: + :hide: + + import logging, sys + logging.basicConfig(level=logging.INFO, stream=sys.stdout, force=True) + +.. doctest:: >>> mary = Person('Mary M', 30) # The initial age update is logged INFO:root:Updating 'age' to 30 @@ -256,7 +264,15 @@ we call :func:`vars` to look up the descriptor without triggering it: >>> vars(vars(Person)['age']) {'public_name': 'age', 'private_name': '_age'} -The new class now logs access to both *name* and *age*:: +The new class now logs access to both *name* and *age*: + +.. testcode:: + :hide: + + import logging, sys + logging.basicConfig(level=logging.INFO, stream=sys.stdout, force=True) + +.. doctest:: >>> pete = Person('Peter P', 10) INFO:root:Updating 'name' to 'Peter P' @@ -433,7 +449,9 @@ Here's how the data validators can be used in a real class: self.kind = kind self.quantity = quantity -The descriptors prevent invalid instances from being created:: +The descriptors prevent invalid instances from being created: + +.. doctest:: >>> Component('Widget', 'metal', 5) # Blocked: 'Widget' is not all uppercase Traceback (most recent call last): @@ -1227,7 +1245,10 @@ Now a new dictionary of unique keys can be constructed like this: .. doctest:: - >>> Dict.fromkeys('abracadabra') + >>> d = Dict.fromkeys('abracadabra') + >>> type(d) is Dict + True + >>> d {'a': None, 'b': None, 'r': None, 'c': None, 'd': None} Using the non-data descriptor protocol, a pure Python version of From d0fb68194131e82e8925e2765b7e7cdce3d4f764 Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Wed, 25 Nov 2020 12:43:18 +0200 Subject: [PATCH 0649/1261] bpo-42202: Store func annotations as a tuple (GH-23316) Reduce memory footprint and improve performance of loading modules having many func annotations. >>> sys.getsizeof({"a":"int","b":"int","return":"int"}) 232 >>> sys.getsizeof(("a","int","b","int","return","int")) 88 The tuple is converted into dict on the fly when `func.__annotations__` is accessed first. Co-authored-by: Serhiy Storchaka Co-authored-by: Inada Naoki --- Doc/library/dis.rst | 4 +- Doc/whatsnew/3.10.rst | 11 + Lib/importlib/_bootstrap_external.py | 3 +- .../2020-11-16-18-13-07.bpo-42202.ZxenYD.rst | 2 + Objects/funcobject.c | 19 ++ Python/ceval.c | 2 +- Python/compile.c | 70 +++--- Python/importlib_external.h | 218 +++++++++--------- 8 files changed, 174 insertions(+), 155 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-16-18-13-07.bpo-42202.ZxenYD.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index d0307bd8e9f3d0..8347c50ce3e0db 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1144,11 +1144,13 @@ All of the following opcodes use their arguments. * ``0x01`` a tuple of default values for positional-only and positional-or-keyword parameters in positional order * ``0x02`` a dictionary of keyword-only parameters' default values - * ``0x04`` an annotation dictionary + * ``0x04`` a tuple of strings containing parameters' annotations * ``0x08`` a tuple containing cells for free variables, making a closure * the code associated with the function (at TOS1) * the :term:`qualified name` of the function (at TOS) + .. versionchanged:: 3.10 + Flag value ``0x04`` is a tuple of strings instead of dictionary .. opcode:: BUILD_SLICE (argc) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index c5efaaa5047e2b..704de8156f312d 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -388,6 +388,11 @@ Optimizations for more details. (Contributed by Victor Stinner and Pablo Galindo in :issue:`38980`) +* Function parameters and their annotations are no longer computed at runtime, + but rather at compilation time. They are stored as a tuple of strings at the + bytecode level. It is now around 100% faster to create a function with parameter + annotations. (Contributed by Yurii Karabas and Inada Naoki in :issue:`42202`) + Deprecated ========== @@ -461,6 +466,12 @@ Changes in the Python API have been renamed to *exc*. (Contributed by Zackery Spytz and Matthias Bussonnier in :issue:`26389`.) +CPython bytecode changes +======================== + +* The ``MAKE_FUNCTION`` instruction accepts tuple of strings as annotations + instead of dictionary. + (Contributed by Yurii Karabas and Inada Naoki in :issue:`42202`) Build Changes ============= diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 0ae49cf5ba3908..b8dd128238f033 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -311,6 +311,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.9a2 3425 (simplify bytecodes for **value unpacking) # Python 3.10a1 3430 (Make 'annotations' future by default) # Python 3.10a1 3431 (New line number table format -- PEP 626) +# Python 3.10a2 3432 (Function annotation for MAKE_FUNCTION is changed from dict to tuple bpo-42202) # # MAGIC must change whenever the bytecode emitted by the compiler may no @@ -320,7 +321,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3431).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3432).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-18-13-07.bpo-42202.ZxenYD.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-18-13-07.bpo-42202.ZxenYD.rst new file mode 100644 index 00000000000000..aba8ce6686fa29 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-18-13-07.bpo-42202.ZxenYD.rst @@ -0,0 +1,2 @@ +Change function parameters annotations internal representation to tuple +of strings. Patch provided by Yurii Karabas. diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 9b4302a13c10f8..e7961b3e6eb4b7 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -424,6 +424,25 @@ func_get_annotations(PyFunctionObject *op, void *Py_UNUSED(ignored)) if (op->func_annotations == NULL) return NULL; } + if (PyTuple_CheckExact(op->func_annotations)) { + PyObject *ann_tuple = op->func_annotations; + PyObject *ann_dict = PyDict_New(); + if (ann_dict == NULL) { + return NULL; + } + + assert(PyTuple_GET_SIZE(ann_tuple) % 2 == 0); + + for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(ann_tuple); i += 2) { + int err = PyDict_SetItem(ann_dict, + PyTuple_GET_ITEM(ann_tuple, i), + PyTuple_GET_ITEM(ann_tuple, i + 1)); + + if (err < 0) + return NULL; + } + Py_SETREF(op->func_annotations, ann_dict); + } Py_INCREF(op->func_annotations); return op->func_annotations; } diff --git a/Python/ceval.c b/Python/ceval.c index 3d65e161302a95..693852e15b7c35 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3880,7 +3880,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) func ->func_closure = POP(); } if (oparg & 0x04) { - assert(PyDict_CheckExact(TOP())); + assert(PyTuple_CheckExact(TOP())); func->func_annotations = POP(); } if (oparg & 0x02) { diff --git a/Python/compile.c b/Python/compile.c index 1989b4af320dab..57aa43476becd5 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2027,26 +2027,24 @@ compiler_visit_annexpr(struct compiler *c, expr_ty annotation) static int compiler_visit_argannotation(struct compiler *c, identifier id, - expr_ty annotation, PyObject *names) + expr_ty annotation, Py_ssize_t *annotations_len) { if (annotation) { - PyObject *mangled; - VISIT(c, annexpr, annotation); - mangled = _Py_Mangle(c->u->u_private, id); + PyObject *mangled = _Py_Mangle(c->u->u_private, id); if (!mangled) return 0; - if (PyList_Append(names, mangled) < 0) { - Py_DECREF(mangled); - return 0; - } + + ADDOP_LOAD_CONST(c, mangled); Py_DECREF(mangled); + VISIT(c, annexpr, annotation); + *annotations_len += 2; } return 1; } static int compiler_visit_argannotations(struct compiler *c, asdl_arg_seq* args, - PyObject *names) + Py_ssize_t *annotations_len) { int i; for (i = 0; i < asdl_seq_LEN(args); i++) { @@ -2055,7 +2053,7 @@ compiler_visit_argannotations(struct compiler *c, asdl_arg_seq* args, c, arg->arg, arg->annotation, - names)) + annotations_len)) return 0; } return 1; @@ -2065,58 +2063,44 @@ static int compiler_visit_annotations(struct compiler *c, arguments_ty args, expr_ty returns) { - /* Push arg annotation dict. + /* Push arg annotation names and values. The expressions are evaluated out-of-order wrt the source code. - Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed. + Return 0 on error, -1 if no annotations pushed, 1 if a annotations is pushed. */ static identifier return_str; - PyObject *names; - Py_ssize_t len; - names = PyList_New(0); - if (!names) - return 0; + Py_ssize_t annotations_len = 0; - if (!compiler_visit_argannotations(c, args->args, names)) - goto error; - if (!compiler_visit_argannotations(c, args->posonlyargs, names)) - goto error; + if (!compiler_visit_argannotations(c, args->args, &annotations_len)) + return 0; + if (!compiler_visit_argannotations(c, args->posonlyargs, &annotations_len)) + return 0; if (args->vararg && args->vararg->annotation && !compiler_visit_argannotation(c, args->vararg->arg, - args->vararg->annotation, names)) - goto error; - if (!compiler_visit_argannotations(c, args->kwonlyargs, names)) - goto error; + args->vararg->annotation, &annotations_len)) + return 0; + if (!compiler_visit_argannotations(c, args->kwonlyargs, &annotations_len)) + return 0; if (args->kwarg && args->kwarg->annotation && !compiler_visit_argannotation(c, args->kwarg->arg, - args->kwarg->annotation, names)) - goto error; + args->kwarg->annotation, &annotations_len)) + return 0; if (!return_str) { return_str = PyUnicode_InternFromString("return"); if (!return_str) - goto error; + return 0; } - if (!compiler_visit_argannotation(c, return_str, returns, names)) { - goto error; + if (!compiler_visit_argannotation(c, return_str, returns, &annotations_len)) { + return 0; } - len = PyList_GET_SIZE(names); - if (len) { - PyObject *keytuple = PyList_AsTuple(names); - Py_DECREF(names); - ADDOP_LOAD_CONST_NEW(c, keytuple); - ADDOP_I(c, BUILD_CONST_KEY_MAP, len); + if (annotations_len) { + ADDOP_I(c, BUILD_TUPLE, annotations_len); return 1; } - else { - Py_DECREF(names); - return -1; - } -error: - Py_DECREF(names); - return 0; + return -1; } static int diff --git a/Python/importlib_external.h b/Python/importlib_external.h index bf272428b49b92..de4db360b06064 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -317,7 +317,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,152,0,0,0,115,38,0,0,0,16,5,6,1,22,1, 4,255,2,2,14,3,40,1,14,1,4,128,12,1,2,1, 12,1,2,3,12,254,2,1,2,1,2,255,2,1,255,128, - 114,77,0,0,0,105,103,13,0,0,114,39,0,0,0,114, + 114,77,0,0,0,105,104,13,0,0,114,39,0,0,0,114, 29,0,0,0,115,2,0,0,0,13,10,90,11,95,95,112, 121,99,97,99,104,101,95,95,122,4,111,112,116,45,122,3, 46,112,121,122,4,46,112,121,119,122,4,46,112,121,99,41, @@ -431,7 +431,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,103,90,15,97,108,109,111,115,116,95,102,105,108,101,110, 97,109,101,218,8,102,105,108,101,110,97,109,101,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,17,99,97, - 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,83, + 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,84, 1,0,0,115,74,0,0,0,8,18,6,1,2,1,4,255, 8,2,4,1,8,1,12,1,10,1,12,1,16,1,8,1, 8,1,8,1,24,1,8,1,12,1,6,1,8,2,8,1, @@ -513,7 +513,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 13,98,97,115,101,95,102,105,108,101,110,97,109,101,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,17,115, 111,117,114,99,101,95,102,114,111,109,95,99,97,99,104,101, - 154,1,0,0,115,62,0,0,0,12,9,8,1,10,1,12, + 155,1,0,0,115,62,0,0,0,12,9,8,1,10,1,12, 1,4,1,10,1,12,1,14,1,16,1,4,1,4,1,12, 1,8,1,8,1,2,1,8,255,10,2,8,1,14,1,10, 1,16,1,10,1,4,1,2,1,8,255,16,2,10,1,16, @@ -548,7 +548,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,90,9,101,120,116,101,110,115,105,111,110,218,11,115,111, 117,114,99,101,95,112,97,116,104,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,15,95,103,101,116,95,115, - 111,117,114,99,101,102,105,108,101,194,1,0,0,115,22,0, + 111,117,114,99,101,102,105,108,101,195,1,0,0,115,22,0, 0,0,12,7,4,1,16,1,24,1,4,1,2,1,12,1, 16,1,18,1,16,1,255,128,114,113,0,0,0,99,1,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0, @@ -561,7 +561,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,117,112,108,101,114,106,0,0,0,114,102,0,0,0,114, 88,0,0,0,114,94,0,0,0,41,1,114,101,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,95,103,101,116,95,99,97,99,104,101,100,213,1,0,0, + 11,95,103,101,116,95,99,97,99,104,101,100,214,1,0,0, 115,22,0,0,0,14,1,2,1,10,1,12,1,2,1,4, 128,2,0,14,1,4,1,4,2,255,128,114,117,0,0,0, 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, @@ -576,7 +576,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,78,41,3,114,57,0,0,0,114,59,0,0,0,114,58, 0,0,0,41,2,114,52,0,0,0,114,60,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, - 95,99,97,108,99,95,109,111,100,101,225,1,0,0,115,14, + 95,99,97,108,99,95,109,111,100,101,226,1,0,0,115,14, 0,0,0,2,2,14,1,12,1,10,1,8,3,4,1,255, 128,114,119,0,0,0,99,1,0,0,0,0,0,0,0,0, 0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,115, @@ -614,7 +614,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,218,6,107,119,97,114,103,115,169,1,218,6,109,101,116, 104,111,100,114,7,0,0,0,114,8,0,0,0,218,19,95, 99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,112, - 101,114,245,1,0,0,115,20,0,0,0,8,1,8,1,10, + 101,114,246,1,0,0,115,20,0,0,0,8,1,8,1,10, 1,4,1,8,1,2,255,2,1,6,255,24,2,255,128,122, 40,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, @@ -632,14 +632,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,95,100,105,99,116,95,95,218,6,117,112,100,97,116,101, 41,3,90,3,110,101,119,90,3,111,108,100,114,75,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,5,95,119,114,97,112,2,2,0,0,115,12,0,0,0, + 218,5,95,119,114,97,112,3,2,0,0,115,12,0,0,0, 8,1,10,1,20,1,14,1,4,128,255,128,122,26,95,99, 104,101,99,107,95,110,97,109,101,46,60,108,111,99,97,108, 115,62,46,95,119,114,97,112,41,1,78,41,2,218,10,95, 98,111,111,116,115,116,114,97,112,114,138,0,0,0,41,3, 114,127,0,0,0,114,128,0,0,0,114,138,0,0,0,114, 7,0,0,0,114,126,0,0,0,114,8,0,0,0,218,11, - 95,99,104,101,99,107,95,110,97,109,101,237,1,0,0,115, + 95,99,104,101,99,107,95,110,97,109,101,238,1,0,0,115, 14,0,0,0,14,8,8,10,8,1,8,2,10,6,4,1, 255,128,114,140,0,0,0,99,2,0,0,0,0,0,0,0, 0,0,0,0,5,0,0,0,6,0,0,0,67,0,0,0, @@ -668,7 +668,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 8,112,111,114,116,105,111,110,115,218,3,109,115,103,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,17,95, 102,105,110,100,95,109,111,100,117,108,101,95,115,104,105,109, - 12,2,0,0,115,12,0,0,0,14,10,16,1,4,1,22, + 13,2,0,0,115,12,0,0,0,14,10,16,1,4,1,22, 1,4,1,255,128,114,147,0,0,0,99,3,0,0,0,0, 0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67, 0,0,0,115,166,0,0,0,124,0,100,1,100,2,133,2, @@ -735,7 +735,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,97,105,108,115,90,5,109,97,103,105,99,114,98,0,0, 0,114,16,0,0,0,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,13,95,99,108,97,115,115,105,102,121, - 95,112,121,99,29,2,0,0,115,30,0,0,0,12,16,8, + 95,112,121,99,30,2,0,0,115,30,0,0,0,12,16,8, 1,16,1,12,1,16,1,12,1,10,1,12,1,8,1,16, 1,8,2,16,1,16,1,4,1,255,128,114,156,0,0,0, 99,5,0,0,0,0,0,0,0,0,0,0,0,6,0,0, @@ -790,7 +790,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,155,0,0,0,114,98,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,23,95,118, 97,108,105,100,97,116,101,95,116,105,109,101,115,116,97,109, - 112,95,112,121,99,62,2,0,0,115,20,0,0,0,24,19, + 112,95,112,121,99,63,2,0,0,115,20,0,0,0,24,19, 10,1,12,1,16,1,8,1,22,1,2,255,22,2,4,128, 255,128,114,160,0,0,0,99,4,0,0,0,0,0,0,0, 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, @@ -836,7 +836,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,218,11,115,111,117,114,99,101,95,104,97,115,104,114, 121,0,0,0,114,155,0,0,0,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,18,95,118,97,108,105,100, - 97,116,101,95,104,97,115,104,95,112,121,99,90,2,0,0, + 97,116,101,95,104,97,115,104,95,112,121,99,91,2,0,0, 115,16,0,0,0,16,17,2,1,8,1,4,255,2,2,6, 254,4,128,255,128,114,162,0,0,0,99,4,0,0,0,0, 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, @@ -860,7 +860,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,37,0,0,0,114,121,0,0,0,114,111,0,0,0,114, 112,0,0,0,218,4,99,111,100,101,114,7,0,0,0,114, 7,0,0,0,114,8,0,0,0,218,17,95,99,111,109,112, - 105,108,101,95,98,121,116,101,99,111,100,101,114,2,0,0, + 105,108,101,95,98,121,116,101,99,111,100,101,115,2,0,0, 115,20,0,0,0,10,2,10,1,12,1,8,1,12,1,4, 1,10,2,4,1,6,255,255,128,114,169,0,0,0,99,3, 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5, @@ -879,7 +879,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,159,0,0,0,114,37,0,0,0,114,7,0,0,0,114, 7,0,0,0,114,8,0,0,0,218,22,95,99,111,100,101, 95,116,111,95,116,105,109,101,115,116,97,109,112,95,112,121, - 99,127,2,0,0,115,14,0,0,0,8,2,14,1,14,1, + 99,128,2,0,0,115,14,0,0,0,8,2,14,1,14,1, 14,1,16,1,4,1,255,128,114,174,0,0,0,84,99,3, 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5, 0,0,0,67,0,0,0,115,80,0,0,0,116,0,116,1, @@ -897,7 +897,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,90,7,99,104,101,99,107,101,100,114,37,0,0,0, 114,16,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,17,95,99,111,100,101,95,116,111,95,104, - 97,115,104,95,112,121,99,137,2,0,0,115,16,0,0,0, + 97,115,104,95,112,121,99,138,2,0,0,115,16,0,0,0, 8,2,12,1,14,1,16,1,10,1,16,1,4,1,255,128, 114,175,0,0,0,99,1,0,0,0,0,0,0,0,0,0, 0,0,5,0,0,0,6,0,0,0,67,0,0,0,115,62, @@ -925,7 +925,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 105,110,103,90,15,110,101,119,108,105,110,101,95,100,101,99, 111,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, 0,0,0,218,13,100,101,99,111,100,101,95,115,111,117,114, - 99,101,148,2,0,0,115,12,0,0,0,8,5,12,1,10, + 99,101,149,2,0,0,115,12,0,0,0,8,5,12,1,10, 1,12,1,20,1,255,128,114,180,0,0,0,169,2,114,144, 0,0,0,218,26,115,117,98,109,111,100,117,108,101,95,115, 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,99, @@ -986,7 +986,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,114,186,0,0,0,90,7,100,105,114,110,97,109,101,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,23, 115,112,101,99,95,102,114,111,109,95,102,105,108,101,95,108, - 111,99,97,116,105,111,110,165,2,0,0,115,64,0,0,0, + 111,99,97,116,105,111,110,166,2,0,0,115,64,0,0,0, 8,12,4,4,10,1,2,2,14,1,12,1,6,1,10,2, 16,8,6,1,8,3,14,1,14,1,10,1,6,1,4,1, 4,2,8,3,10,2,2,1,14,1,12,1,6,1,4,2, @@ -1024,7 +1024,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 69,89,95,76,79,67,65,76,95,77,65,67,72,73,78,69, 114,19,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,14,95,111,112,101,110,95,114,101,103,105, - 115,116,114,121,245,2,0,0,115,10,0,0,0,2,2,16, + 115,116,114,121,246,2,0,0,115,10,0,0,0,2,2,16, 1,12,1,20,1,255,128,122,36,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,2,0, @@ -1051,7 +1051,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 107,101,121,114,20,0,0,0,90,4,104,107,101,121,218,8, 102,105,108,101,112,97,116,104,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,16,95,115,101,97,114,99,104, - 95,114,101,103,105,115,116,114,121,252,2,0,0,115,26,0, + 95,114,101,103,105,115,116,114,121,253,2,0,0,115,26,0, 0,0,6,2,8,1,6,2,6,1,16,1,6,255,2,2, 12,1,44,1,4,3,12,254,8,1,255,128,122,38,87,105, 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, @@ -1073,7 +1073,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 143,0,0,0,114,52,0,0,0,218,6,116,97,114,103,101, 116,114,203,0,0,0,114,144,0,0,0,114,193,0,0,0, 114,191,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,9,102,105,110,100,95,115,112,101,99,11, + 8,0,0,0,218,9,102,105,110,100,95,115,112,101,99,12, 3,0,0,115,32,0,0,0,10,2,8,1,4,1,2,1, 12,1,12,1,8,1,14,1,14,1,6,1,8,1,2,1, 6,254,8,3,4,128,255,128,122,31,87,105,110,100,111,119, @@ -1093,7 +1093,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,169,4,114,202,0,0,0,114,143,0,0,0,114,52, 0,0,0,114,191,0,0,0,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,11,102,105,110,100,95,109,111, - 100,117,108,101,27,3,0,0,115,10,0,0,0,12,7,8, + 100,117,108,101,28,3,0,0,115,10,0,0,0,12,7,8, 1,6,1,4,2,255,128,122,33,87,105,110,100,111,119,115, 82,101,103,105,115,116,114,121,70,105,110,100,101,114,46,102, 105,110,100,95,109,111,100,117,108,101,41,2,78,78,41,1, @@ -1105,7 +1105,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,116,104,111,100,114,197,0,0,0,218,11,99,108,97,115, 115,109,101,116,104,111,100,114,204,0,0,0,114,207,0,0, 0,114,210,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,195,0,0,0,233, + 114,7,0,0,0,114,8,0,0,0,114,195,0,0,0,234, 2,0,0,115,32,0,0,0,8,0,4,2,2,3,2,255, 2,4,2,255,12,3,2,2,10,1,2,6,10,1,2,14, 12,1,2,15,16,1,255,128,114,195,0,0,0,99,0,0, @@ -1142,7 +1142,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,101,0,0,0,90,13,102,105,108,101,110,97,109,101, 95,98,97,115,101,90,9,116,97,105,108,95,110,97,109,101, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 186,0,0,0,46,3,0,0,115,10,0,0,0,18,3,16, + 186,0,0,0,47,3,0,0,115,10,0,0,0,18,3,16, 1,14,1,16,1,255,128,122,24,95,76,111,97,100,101,114, 66,97,115,105,99,115,46,105,115,95,112,97,99,107,97,103, 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, @@ -1153,7 +1153,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 46,78,114,7,0,0,0,169,2,114,123,0,0,0,114,191, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, 0,0,218,13,99,114,101,97,116,101,95,109,111,100,117,108, - 101,54,3,0,0,115,4,0,0,0,4,128,255,128,122,27, + 101,55,3,0,0,115,4,0,0,0,4,128,255,128,122,27, 95,76,111,97,100,101,114,66,97,115,105,99,115,46,99,114, 101,97,116,101,95,109,111,100,117,108,101,99,2,0,0,0, 0,0,0,0,0,0,0,0,3,0,0,0,5,0,0,0, @@ -1173,7 +1173,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,136,0,0,0,41,3,114,123,0,0,0,218,6,109,111, 100,117,108,101,114,168,0,0,0,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,11,101,120,101,99,95,109, - 111,100,117,108,101,57,3,0,0,115,16,0,0,0,12,2, + 111,100,117,108,101,58,3,0,0,115,16,0,0,0,12,2, 8,1,6,1,4,1,6,255,16,2,4,128,255,128,122,25, 95,76,111,97,100,101,114,66,97,115,105,99,115,46,101,120, 101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,0, @@ -1185,14 +1185,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,109,111,100,117,108,101,95,115,104,105,109,169,2,114,123, 0,0,0,114,143,0,0,0,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,11,108,111,97,100,95,109,111, - 100,117,108,101,65,3,0,0,115,4,0,0,0,12,2,255, + 100,117,108,101,66,3,0,0,115,4,0,0,0,12,2,255, 128,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114, 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, 0,0,0,114,186,0,0,0,114,219,0,0,0,114,224,0, 0,0,114,227,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,215,0,0,0, - 41,3,0,0,115,14,0,0,0,8,0,4,2,8,3,8, + 42,3,0,0,115,14,0,0,0,8,0,4,2,8,3,8, 8,8,3,12,8,255,128,114,215,0,0,0,99,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, 0,64,0,0,0,115,74,0,0,0,101,0,90,1,100,0, @@ -1216,7 +1216,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,78, 41,1,114,58,0,0,0,169,2,114,123,0,0,0,114,52, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,10,112,97,116,104,95,109,116,105,109,101,72,3, + 0,0,218,10,112,97,116,104,95,109,116,105,109,101,73,3, 0,0,115,4,0,0,0,4,6,255,128,122,23,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,0,0,0, @@ -1251,7 +1251,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,114,173,0,0,0,78,41,1,114,230,0, 0,0,114,229,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,10,112,97,116,104,95,115,116,97, - 116,115,80,3,0,0,115,4,0,0,0,14,12,255,128,122, + 116,115,81,3,0,0,115,4,0,0,0,14,12,255,128,122, 23,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,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, @@ -1275,7 +1275,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,90,10,99,97,99,104,101,95,112,97,116,104,114, 37,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, 0,0,0,218,15,95,99,97,99,104,101,95,98,121,116,101, - 99,111,100,101,94,3,0,0,115,4,0,0,0,12,8,255, + 99,111,100,101,95,3,0,0,115,4,0,0,0,12,8,255, 128,122,28,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,0,0,0,0,3,0,0,0, @@ -1292,7 +1292,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,46,10,32,32,32,32,32,32,32,32,78,114,7,0,0, 0,41,3,114,123,0,0,0,114,52,0,0,0,114,37,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,232,0,0,0,104,3,0,0,115,4,0,0,0,4, + 0,114,232,0,0,0,105,3,0,0,115,4,0,0,0,4, 128,255,128,122,21,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,0,0,0,0,5,0,0,0,10,0,0,0,67, @@ -1312,7 +1312,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,180,0,0,0,41,5,114,123,0,0,0,114,143,0,0, 0,114,52,0,0,0,114,178,0,0,0,218,3,101,120,99, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 10,103,101,116,95,115,111,117,114,99,101,111,3,0,0,115, + 10,103,101,116,95,115,111,117,114,99,101,112,3,0,0,115, 24,0,0,0,10,2,2,1,12,1,8,4,14,253,4,1, 2,1,4,255,2,1,2,255,10,128,255,128,122,23,83,111, 117,114,99,101,76,111,97,100,101,114,46,103,101,116,95,115, @@ -1335,7 +1335,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,101,41,4,114,123,0,0,0,114,37,0,0,0,114,52, 0,0,0,114,237,0,0,0,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,14,115,111,117,114,99,101,95, - 116,111,95,99,111,100,101,121,3,0,0,115,8,0,0,0, + 116,111,95,99,111,100,101,122,3,0,0,115,8,0,0,0, 12,5,4,1,6,255,255,128,122,27,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,0,0, @@ -1412,7 +1412,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 37,0,0,0,114,155,0,0,0,114,16,0,0,0,90,10, 98,121,116,101,115,95,100,97,116,97,90,11,99,111,100,101, 95,111,98,106,101,99,116,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,220,0,0,0,129,3,0,0,115, + 0,114,8,0,0,0,114,220,0,0,0,130,3,0,0,115, 160,0,0,0,10,7,4,1,4,1,4,1,4,1,4,1, 2,1,12,1,12,1,12,1,2,2,14,1,12,1,8,1, 12,2,2,1,14,1,12,1,6,1,2,3,2,1,6,254, @@ -1429,7 +1429,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,231,0,0,0,114,233,0,0,0,114,232,0,0, 0,114,236,0,0,0,114,240,0,0,0,114,220,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,228,0,0,0,70,3,0,0,115,18,0, + 8,0,0,0,114,228,0,0,0,71,3,0,0,115,18,0, 0,0,8,0,8,2,8,8,8,14,8,10,8,7,14,10, 12,8,255,128,114,228,0,0,0,99,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, @@ -1457,7 +1457,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 102,105,110,100,101,114,46,78,114,163,0,0,0,41,3,114, 123,0,0,0,114,143,0,0,0,114,52,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, - 0,0,219,3,0,0,115,8,0,0,0,6,3,6,1,4, + 0,0,220,3,0,0,115,8,0,0,0,6,3,6,1,4, 128,255,128,122,19,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, @@ -1466,7 +1466,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,169,2,218,9,95,95,99,108,97,115,115,95,95, 114,136,0,0,0,169,2,114,123,0,0,0,90,5,111,116, 104,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,6,95,95,101,113,95,95,225,3,0,0,115,8, + 0,0,218,6,95,95,101,113,95,95,226,3,0,0,115,8, 0,0,0,12,1,10,1,2,255,255,128,122,17,70,105,108, 101,76,111,97,100,101,114,46,95,95,101,113,95,95,99,1, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, @@ -1475,7 +1475,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,114,0,0,0,169,3,218,4,104,97,115,104,114,121,0, 0,0,114,52,0,0,0,169,1,114,123,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,95, - 95,104,97,115,104,95,95,229,3,0,0,115,4,0,0,0, + 95,104,97,115,104,95,95,230,3,0,0,115,4,0,0,0, 20,1,255,128,122,19,70,105,108,101,76,111,97,100,101,114, 46,95,95,104,97,115,104,95,95,99,2,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,3,0,0,0,3,0, @@ -1489,7 +1489,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, 41,3,218,5,115,117,112,101,114,114,246,0,0,0,114,227, 0,0,0,114,226,0,0,0,169,1,114,248,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,227,0,0,0,232,3, + 7,0,0,0,114,8,0,0,0,114,227,0,0,0,233,3, 0,0,115,4,0,0,0,16,10,255,128,122,22,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,0,0,0,0, @@ -1500,7 +1500,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,102,111,117,110,100,32,98,121,32,116,104,101,32,102,105, 110,100,101,114,46,78,114,56,0,0,0,114,226,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 183,0,0,0,244,3,0,0,115,4,0,0,0,6,3,255, + 183,0,0,0,245,3,0,0,115,4,0,0,0,6,3,255, 128,122,23,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,0,0,0,0,3,0,0,0,8,0,0,0,67, @@ -1521,7 +1521,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 112,101,110,95,99,111,100,101,114,90,0,0,0,90,4,114, 101,97,100,114,73,0,0,0,41,3,114,123,0,0,0,114, 52,0,0,0,114,76,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,234,0,0,0,249,3,0, + 0,0,0,114,8,0,0,0,114,234,0,0,0,250,3,0, 0,115,16,0,0,0,14,2,16,1,38,1,4,128,14,2, 38,1,4,128,255,128,122,19,70,105,108,101,76,111,97,100, 101,114,46,103,101,116,95,100,97,116,97,99,2,0,0,0, @@ -1534,7 +1534,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 123,0,0,0,114,223,0,0,0,114,4,1,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,19,103, 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, - 101,114,2,4,0,0,115,6,0,0,0,12,2,8,1,255, + 101,114,3,4,0,0,115,6,0,0,0,12,2,8,1,255, 128,122,30,70,105,108,101,76,111,97,100,101,114,46,103,101, 116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,101, 114,41,13,114,130,0,0,0,114,129,0,0,0,114,131,0, @@ -1543,7 +1543,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,183,0,0,0,114,234,0,0,0,114,5,1,0,0,90, 13,95,95,99,108,97,115,115,99,101,108,108,95,95,114,7, 0,0,0,114,7,0,0,0,114,0,1,0,0,114,8,0, - 0,0,114,246,0,0,0,214,3,0,0,115,26,0,0,0, + 0,0,114,246,0,0,0,215,3,0,0,115,26,0,0,0, 8,0,4,2,8,3,8,6,8,4,2,3,14,1,2,11, 10,1,8,4,2,9,18,1,255,128,114,246,0,0,0,99, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1566,7 +1566,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,109,116,105,109,101,90,7,115,116,95,115,105,122,101,41, 3,114,123,0,0,0,114,52,0,0,0,114,245,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 231,0,0,0,12,4,0,0,115,6,0,0,0,8,2,14, + 231,0,0,0,13,4,0,0,115,6,0,0,0,8,2,14, 1,255,128,122,27,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,0,0,0,0,0,5,0,0, @@ -1576,7 +1576,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,101,41,2,114,119,0,0,0,114,232,0,0,0,41,5, 114,123,0,0,0,114,112,0,0,0,114,111,0,0,0,114, 37,0,0,0,114,60,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,233,0,0,0,17,4,0, + 0,0,0,114,8,0,0,0,114,233,0,0,0,18,4,0, 0,115,6,0,0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,68, @@ -1611,7 +1611,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,9,1,0,0,218,6,112,97,114,101,110,116,114, 101,0,0,0,114,47,0,0,0,114,43,0,0,0,114,235, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,232,0,0,0,22,4,0,0,115,54,0,0,0, + 0,0,114,232,0,0,0,23,4,0,0,115,54,0,0,0, 12,2,4,1,12,2,12,1,12,1,12,2,10,1,2,1, 14,1,12,1,4,2,14,1,6,3,4,1,4,255,16,2, 10,128,2,1,12,1,14,1,4,128,14,1,8,2,2,1, @@ -1621,7 +1621,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,132,0,0,0,114,231,0,0,0,114,233,0, 0,0,114,232,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,6,1,0,0, - 8,4,0,0,115,12,0,0,0,8,0,4,2,8,2,8, + 9,4,0,0,115,12,0,0,0,8,0,4,2,8,2,8, 5,18,5,255,128,114,6,1,0,0,99,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, @@ -1643,7 +1643,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,242,0,0,0,41,5,114,123,0,0,0,114,143,0,0, 0,114,52,0,0,0,114,37,0,0,0,114,155,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 220,0,0,0,57,4,0,0,115,24,0,0,0,10,1,10, + 220,0,0,0,58,4,0,0,115,24,0,0,0,10,1,10, 1,2,4,2,1,6,254,12,4,2,1,14,1,2,1,2, 1,6,253,255,128,122,29,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, @@ -1654,13 +1654,13 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,32,110,111,32,115,111,117,114,99,101,32,99,111,100,101, 46,78,114,7,0,0,0,114,226,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,236,0,0,0, - 73,4,0,0,115,4,0,0,0,4,2,255,128,122,31,83, + 74,4,0,0,115,4,0,0,0,4,2,255,128,122,31,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,41, 6,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, 114,132,0,0,0,114,220,0,0,0,114,236,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,12,1,0,0,53,4,0,0,115,10,0,0, + 0,0,0,114,12,1,0,0,54,4,0,0,115,10,0,0, 0,8,0,4,2,8,2,12,16,255,128,114,12,1,0,0, 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,0,0,64,0,0,0,115,92,0,0,0,101,0, @@ -1681,7 +1681,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,0,95,0,124,2,124,0,95,1,100,0,83,0,114,114, 0,0,0,114,163,0,0,0,41,3,114,123,0,0,0,114, 121,0,0,0,114,52,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,216,0,0,0,86,4,0, + 0,0,0,114,8,0,0,0,114,216,0,0,0,87,4,0, 0,115,8,0,0,0,6,1,6,1,4,128,255,128,122,28, 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, @@ -1690,7 +1690,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 106,0,107,2,111,22,124,0,106,1,124,1,106,1,107,2, 83,0,114,114,0,0,0,114,247,0,0,0,114,249,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,250,0,0,0,90,4,0,0,115,8,0,0,0,12,1, + 114,250,0,0,0,91,4,0,0,115,8,0,0,0,12,1, 10,1,2,255,255,128,122,26,69,120,116,101,110,115,105,111, 110,70,105,108,101,76,111,97,100,101,114,46,95,95,101,113, 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, @@ -1698,7 +1698,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,0,124,0,106,1,131,1,116,0,124,0,106,2,131,1, 65,0,83,0,114,114,0,0,0,114,251,0,0,0,114,253, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,254,0,0,0,94,4,0,0,115,4,0,0,0, + 0,0,114,254,0,0,0,95,4,0,0,115,4,0,0,0, 20,1,255,128,122,28,69,120,116,101,110,115,105,111,110,70, 105,108,101,76,111,97,100,101,114,46,95,95,104,97,115,104, 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,3, @@ -1715,7 +1715,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,100,121,110,97,109,105,99,114,153,0,0,0,114,121,0, 0,0,114,52,0,0,0,41,3,114,123,0,0,0,114,191, 0,0,0,114,223,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,219,0,0,0,97,4,0,0, + 0,0,114,8,0,0,0,114,219,0,0,0,98,4,0,0, 115,16,0,0,0,4,2,6,1,4,255,6,2,8,1,4, 255,4,2,255,128,122,33,69,120,116,101,110,115,105,111,110, 70,105,108,101,76,111,97,100,101,114,46,99,114,101,97,116, @@ -1733,7 +1733,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 121,110,97,109,105,99,114,153,0,0,0,114,121,0,0,0, 114,52,0,0,0,169,2,114,123,0,0,0,114,223,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,224,0,0,0,105,4,0,0,115,12,0,0,0,14,2, + 114,224,0,0,0,106,4,0,0,115,12,0,0,0,14,2, 6,1,8,1,4,255,4,128,255,128,122,31,69,120,116,101, 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, @@ -1751,14 +1751,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 2,114,216,0,0,0,78,114,7,0,0,0,169,2,114,5, 0,0,0,218,6,115,117,102,102,105,120,169,1,90,9,102, 105,108,101,95,110,97,109,101,114,7,0,0,0,114,8,0, - 0,0,114,9,0,0,0,114,4,0,0,115,10,0,0,0, + 0,0,114,9,0,0,0,115,4,0,0,115,10,0,0,0, 4,0,2,1,16,255,4,128,255,128,122,49,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,111,99,97, 108,115,62,46,60,103,101,110,101,120,112,114,62,78,41,4, 114,55,0,0,0,114,52,0,0,0,218,3,97,110,121,114, 212,0,0,0,114,226,0,0,0,114,7,0,0,0,114,16, - 1,0,0,114,8,0,0,0,114,186,0,0,0,111,4,0, + 1,0,0,114,8,0,0,0,114,186,0,0,0,112,4,0, 0,115,10,0,0,0,14,2,12,1,2,1,8,255,255,128, 122,30,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, @@ -1770,7 +1770,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,114,101,97,116,101,32,97,32,99,111,100,101,32,111,98, 106,101,99,116,46,78,114,7,0,0,0,114,226,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 220,0,0,0,117,4,0,0,115,4,0,0,0,4,2,255, + 220,0,0,0,118,4,0,0,115,4,0,0,0,4,2,255, 128,122,28,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,0,0,0,0,2,0,0,0, @@ -1780,14 +1780,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,117,108,101,115,32,104,97,118,101,32,110,111,32,115,111, 117,114,99,101,32,99,111,100,101,46,78,114,7,0,0,0, 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,236,0,0,0,121,4,0,0,115,4,0, + 8,0,0,0,114,236,0,0,0,122,4,0,0,115,4,0, 0,0,4,2,255,128,122,30,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,99,2,0,0,0,0,0,0,0,0, 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, 6,0,0,0,124,0,106,0,83,0,114,1,1,0,0,114, 56,0,0,0,114,226,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,183,0,0,0,125,4,0, + 0,0,0,114,8,0,0,0,114,183,0,0,0,126,4,0, 0,115,4,0,0,0,6,3,255,128,122,32,69,120,116,101, 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, 103,101,116,95,102,105,108,101,110,97,109,101,78,41,14,114, @@ -1796,7 +1796,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,219,0,0,0,114,224,0,0,0,114,186,0,0, 0,114,220,0,0,0,114,236,0,0,0,114,140,0,0,0, 114,183,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,3,1,0,0,78,4, + 7,0,0,0,114,8,0,0,0,114,3,1,0,0,79,4, 0,0,115,26,0,0,0,8,0,4,2,8,6,8,4,8, 4,8,3,8,8,8,6,8,6,8,4,2,4,14,1,255, 128,114,3,1,0,0,99,0,0,0,0,0,0,0,0,0, @@ -1839,7 +1839,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 104,95,102,105,110,100,101,114,169,4,114,123,0,0,0,114, 121,0,0,0,114,52,0,0,0,90,11,112,97,116,104,95, 102,105,110,100,101,114,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,216,0,0,0,138,4,0,0,115,12, + 114,8,0,0,0,114,216,0,0,0,139,4,0,0,115,12, 0,0,0,6,1,6,1,14,1,6,1,4,128,255,128,122, 23,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, @@ -1857,7 +1857,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,11,1,0,0,218,3,100,111,116,90,2,109,101, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, 23,95,102,105,110,100,95,112,97,114,101,110,116,95,112,97, - 116,104,95,110,97,109,101,115,144,4,0,0,115,10,0,0, + 116,104,95,110,97,109,101,115,145,4,0,0,115,10,0,0, 0,18,2,8,1,4,2,8,3,255,128,122,38,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, @@ -1870,7 +1870,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,90,18,112,97,114,101,110,116,95,109,111,100,117, 108,101,95,110,97,109,101,90,14,112,97,116,104,95,97,116, 116,114,95,110,97,109,101,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,21,1,0,0,154,4,0,0,115, + 0,114,8,0,0,0,114,21,1,0,0,155,4,0,0,115, 6,0,0,0,12,1,16,1,255,128,122,31,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, @@ -1886,7 +1886,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,20,1,0,0,41,3,114,123,0,0,0,90, 11,112,97,114,101,110,116,95,112,97,116,104,114,191,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,12,95,114,101,99,97,108,99,117,108,97,116,101,158,4, + 218,12,95,114,101,99,97,108,99,117,108,97,116,101,159,4, 0,0,115,18,0,0,0,12,2,10,1,14,1,18,3,6, 1,8,1,6,1,6,1,255,128,122,27,95,78,97,109,101, 115,112,97,99,101,80,97,116,104,46,95,114,101,99,97,108, @@ -1896,7 +1896,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,114,0,0,0,41,2,218,4,105,116,101,114,114,28,1, 0,0,114,253,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,8,95,95,105,116,101,114,95,95, - 171,4,0,0,115,4,0,0,0,12,1,255,128,122,23,95, + 172,4,0,0,115,4,0,0,0,12,1,255,128,122,23,95, 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, 105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,0, 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, @@ -1904,7 +1904,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,114,0,0,0,169,1,114,28,1,0,0,41,2,114,123, 0,0,0,218,5,105,110,100,101,120,114,7,0,0,0,114, 7,0,0,0,114,8,0,0,0,218,11,95,95,103,101,116, - 105,116,101,109,95,95,174,4,0,0,115,4,0,0,0,12, + 105,116,101,109,95,95,175,4,0,0,115,4,0,0,0,12, 1,255,128,122,26,95,78,97,109,101,115,112,97,99,101,80, 97,116,104,46,95,95,103,101,116,105,116,101,109,95,95,99, 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, @@ -1913,7 +1913,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 41,1,114,20,1,0,0,41,3,114,123,0,0,0,114,32, 1,0,0,114,52,0,0,0,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,11,95,95,115,101,116,105,116, - 101,109,95,95,177,4,0,0,115,6,0,0,0,10,1,4, + 101,109,95,95,178,4,0,0,115,6,0,0,0,10,1,4, 128,255,128,122,26,95,78,97,109,101,115,112,97,99,101,80, 97,116,104,46,95,95,115,101,116,105,116,101,109,95,95,99, 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, @@ -1921,7 +1921,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,160,1,161,0,131,1,83,0,114,114,0,0,0,41,2, 114,4,0,0,0,114,28,1,0,0,114,253,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,7, - 95,95,108,101,110,95,95,180,4,0,0,115,4,0,0,0, + 95,95,108,101,110,95,95,181,4,0,0,115,4,0,0,0, 12,1,255,128,122,22,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,0,0,0,0,1,0,0,0,3,0,0, @@ -1930,7 +1930,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,112,97,99,101,80,97,116,104,40,123,33,114,125,41,41, 2,114,70,0,0,0,114,20,1,0,0,114,253,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 8,95,95,114,101,112,114,95,95,183,4,0,0,115,4,0, + 8,95,95,114,101,112,114,95,95,184,4,0,0,115,4,0, 0,0,12,1,255,128,122,23,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,0,0,0,0,2,0,0,0, @@ -1938,7 +1938,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,160,0,161,0,118,0,83,0,114,114,0,0,0,114,31, 1,0,0,169,2,114,123,0,0,0,218,4,105,116,101,109, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 12,95,95,99,111,110,116,97,105,110,115,95,95,186,4,0, + 12,95,95,99,111,110,116,97,105,110,115,95,95,187,4,0, 0,115,4,0,0,0,12,1,255,128,122,27,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, @@ -1946,7 +1946,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,16,0,0,0,124,0,106,0,160,1,124,1,161,1,1, 0,100,0,83,0,114,114,0,0,0,41,2,114,20,1,0, 0,114,190,0,0,0,114,37,1,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,190,0,0,0,189, + 114,7,0,0,0,114,8,0,0,0,114,190,0,0,0,190, 4,0,0,115,6,0,0,0,12,1,4,128,255,128,122,21, 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,97, 112,112,101,110,100,78,41,15,114,130,0,0,0,114,129,0, @@ -1955,7 +1955,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,30,1,0,0,114,33,1,0,0,114,34,1,0,0,114, 35,1,0,0,114,36,1,0,0,114,39,1,0,0,114,190, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,18,1,0,0,131,4,0,0, + 0,0,114,8,0,0,0,114,18,1,0,0,132,4,0,0, 115,28,0,0,0,8,0,4,1,8,6,8,6,8,10,8, 4,8,13,8,3,8,3,8,3,8,3,8,3,12,3,255, 128,114,18,1,0,0,99,0,0,0,0,0,0,0,0,0, @@ -1972,7 +1972,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,0,95,1,100,0,83,0,114,114,0,0,0,41,2,114, 18,1,0,0,114,20,1,0,0,114,24,1,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, - 0,0,195,4,0,0,115,6,0,0,0,14,1,4,128,255, + 0,0,196,4,0,0,115,6,0,0,0,14,1,4,128,255, 128,122,25,95,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,1,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, @@ -1989,21 +1989,21 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,115,112,97,99,101,41,62,78,41,2,114,70,0,0,0, 114,130,0,0,0,41,1,114,223,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,11,109,111,100, - 117,108,101,95,114,101,112,114,198,4,0,0,115,4,0,0, + 117,108,101,95,114,101,112,114,199,4,0,0,115,4,0,0, 0,12,7,255,128,122,28,95,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,0,0,0,0, 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, 0,100,1,83,0,41,2,78,84,114,7,0,0,0,114,226, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,186,0,0,0,207,4,0,0,115,4,0,0,0, + 0,0,114,186,0,0,0,208,4,0,0,115,4,0,0,0, 4,1,255,128,122,27,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0, 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, 1,83,0,41,2,78,114,10,0,0,0,114,7,0,0,0, 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,236,0,0,0,210,4,0,0,115,4,0, + 8,0,0,0,114,236,0,0,0,211,4,0,0,115,4,0, 0,0,4,1,255,128,122,27,95,78,97,109,101,115,112,97, 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117, 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0, @@ -2013,20 +2013,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,103,62,114,222,0,0,0,84,41,1,114,238,0,0,0, 41,1,114,239,0,0,0,114,226,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,220,0,0,0, - 213,4,0,0,115,4,0,0,0,16,1,255,128,122,25,95, + 214,4,0,0,115,4,0,0,0,16,1,255,128,122,25,95, 78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, 0,115,4,0,0,0,100,1,83,0,114,217,0,0,0,114, 7,0,0,0,114,218,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,219,0,0,0,216,4,0, + 0,0,0,114,8,0,0,0,114,219,0,0,0,217,4,0, 0,115,4,0,0,0,4,128,255,128,122,30,95,78,97,109, 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, 0,0,0,115,4,0,0,0,100,0,83,0,114,114,0,0, 0,114,7,0,0,0,114,13,1,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,224,0,0,0,219, + 114,7,0,0,0,114,8,0,0,0,114,224,0,0,0,220, 4,0,0,115,6,0,0,0,2,1,2,128,255,128,122,28, 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, @@ -2045,7 +2045,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,125,78,41,4,114,139,0,0,0,114,153,0,0,0,114, 20,1,0,0,114,225,0,0,0,114,226,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,227,0, - 0,0,222,4,0,0,115,10,0,0,0,6,7,4,1,4, + 0,0,223,4,0,0,115,10,0,0,0,6,7,4,1,4, 255,12,2,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0, @@ -2053,7 +2053,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 41,1,0,0,114,186,0,0,0,114,236,0,0,0,114,220, 0,0,0,114,219,0,0,0,114,224,0,0,0,114,227,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,40,1,0,0,194,4,0,0,115, + 0,114,8,0,0,0,114,40,1,0,0,195,4,0,0,115, 22,0,0,0,8,0,8,1,2,3,10,1,8,8,8,3, 8,3,8,3,8,3,12,3,255,128,114,40,1,0,0,99, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2090,7 +2090,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,99,97,99,104,101,218,5,105,116,101,109,115,114,133,0, 0,0,114,43,1,0,0,41,2,114,121,0,0,0,218,6, 102,105,110,100,101,114,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,43,1,0,0,240,4,0,0,115,14, + 114,8,0,0,0,114,43,1,0,0,241,4,0,0,115,14, 0,0,0,22,4,8,1,10,1,10,1,10,1,4,128,255, 128,122,28,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, @@ -2110,7 +2110,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,142,0,0,0,114,122,0,0,0,41,2,114,52, 0,0,0,90,4,104,111,111,107,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, - 104,111,111,107,115,250,4,0,0,115,18,0,0,0,16,3, + 104,111,111,107,115,251,4,0,0,115,18,0,0,0,16,3, 12,1,10,1,2,1,14,1,12,1,6,1,4,2,255,128, 122,22,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, @@ -2142,7 +2142,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,202,0,0,0,114,52,0,0,0,114,47,1,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,20, 95,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,7,5,0,0,115,28,0,0,0,8,8,2, + 97,99,104,101,8,5,0,0,115,28,0,0,0,8,8,2, 1,12,1,12,1,8,3,2,1,12,1,4,4,12,253,10, 1,12,1,4,1,2,255,255,128,122,31,80,97,116,104,70, 105,110,100,101,114,46,95,112,97,116,104,95,105,109,112,111, @@ -2160,7 +2160,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,47,1,0,0,114,144,0,0,0,114,145,0, 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,16,95,108,101,103,97,99,121,95, - 103,101,116,95,115,112,101,99,29,5,0,0,115,20,0,0, + 103,101,116,95,115,112,101,99,30,5,0,0,115,20,0,0, 0,10,4,16,1,10,2,4,1,8,1,12,1,12,1,6, 1,4,1,255,128,122,27,80,97,116,104,70,105,110,100,101, 114,46,95,108,101,103,97,99,121,95,103,101,116,95,115,112, @@ -2192,7 +2192,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 90,5,101,110,116,114,121,114,47,1,0,0,114,191,0,0, 0,114,145,0,0,0,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,9,95,103,101,116,95,115,112,101,99, - 44,5,0,0,115,42,0,0,0,4,5,8,1,14,1,2, + 45,5,0,0,115,42,0,0,0,4,5,8,1,14,1,2, 1,10,1,8,1,10,1,14,1,12,2,8,1,2,1,10, 1,8,1,6,1,8,1,8,1,12,5,12,2,6,1,4, 1,255,128,122,20,80,97,116,104,70,105,110,100,101,114,46, @@ -2219,7 +2219,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,143,0,0,0,114,52,0,0,0,114,206,0, 0,0,114,191,0,0,0,114,55,1,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,207,0,0,0, - 76,5,0,0,115,28,0,0,0,8,6,6,1,14,1,8, + 77,5,0,0,115,28,0,0,0,8,6,6,1,14,1,8, 1,4,1,10,1,6,1,4,1,6,3,16,1,4,1,4, 2,4,2,255,128,122,20,80,97,116,104,70,105,110,100,101, 114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,0, @@ -2239,7 +2239,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, 32,32,32,32,32,78,114,208,0,0,0,114,209,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 210,0,0,0,100,5,0,0,115,10,0,0,0,12,8,8, + 210,0,0,0,101,5,0,0,115,10,0,0,0,12,8,8, 1,4,1,6,1,255,128,122,22,80,97,116,104,70,105,110, 100,101,114,46,102,105,110,100,95,109,111,100,117,108,101,99, 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, @@ -2271,7 +2271,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,116,114,105,98,117,116,105,111,110,115,41,3,114,124,0, 0,0,114,125,0,0,0,114,57,1,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,58,1,0,0, - 113,5,0,0,115,6,0,0,0,12,10,16,1,255,128,122, + 114,5,0,0,115,6,0,0,0,12,10,16,1,255,128,122, 29,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, 95,100,105,115,116,114,105,98,117,116,105,111,110,115,41,1, 78,41,2,78,78,41,1,78,41,14,114,130,0,0,0,114, @@ -2280,7 +2280,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,52,1,0,0,114,53,1,0,0,114,56,1,0, 0,114,207,0,0,0,114,210,0,0,0,114,58,1,0,0, 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,42,1,0,0,236,4,0,0,115,38,0, + 8,0,0,0,114,42,1,0,0,237,4,0,0,115,38,0, 0,0,8,0,4,2,2,2,10,1,2,9,10,1,2,12, 10,1,2,21,10,1,2,14,12,1,2,31,12,1,2,23, 12,1,2,12,14,1,255,128,114,42,1,0,0,99,0,0, @@ -2325,7 +2325,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,93,14,125,1,124,1,136,0,102,2,86,0,1,0,113, 2,100,0,83,0,114,114,0,0,0,114,7,0,0,0,114, 14,1,0,0,169,1,114,144,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,9,0,0,0,142,5,0,0,115,6, + 114,8,0,0,0,114,9,0,0,0,143,5,0,0,115,6, 0,0,0,18,0,4,128,255,128,122,38,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, @@ -2338,7 +2338,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,218,14,108,111,97,100,101,114,95,100,101,116,97,105, 108,115,90,7,108,111,97,100,101,114,115,114,193,0,0,0, 114,7,0,0,0,114,60,1,0,0,114,8,0,0,0,114, - 216,0,0,0,136,5,0,0,115,20,0,0,0,4,4,12, + 216,0,0,0,137,5,0,0,115,20,0,0,0,4,4,12, 1,26,1,6,1,10,2,6,1,8,1,8,1,4,128,255, 128,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, @@ -2348,7 +2348,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,100,105,114,101,99,116,111,114,121,32,109,116,105,109,101, 46,114,109,0,0,0,78,41,1,114,62,1,0,0,114,253, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,43,1,0,0,150,5,0,0,115,6,0,0,0, + 0,0,114,43,1,0,0,151,5,0,0,115,6,0,0,0, 6,2,4,128,255,128,122,28,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,0,0,0,0,0,0,0, @@ -2371,7 +2371,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,78,41,3,114,207,0,0,0,114,144,0, 0,0,114,182,0,0,0,41,3,114,123,0,0,0,114,143, 0,0,0,114,191,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,141,0,0,0,156,5,0,0, + 0,0,114,8,0,0,0,114,141,0,0,0,157,5,0,0, 115,10,0,0,0,10,7,8,1,8,1,16,1,255,128,122, 22,70,105,108,101,70,105,110,100,101,114,46,102,105,110,100, 95,108,111,97,100,101,114,99,6,0,0,0,0,0,0,0, @@ -2382,7 +2382,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,123,0,0,0,114,192,0,0,0,114,143,0,0,0,114, 52,0,0,0,90,4,115,109,115,108,114,206,0,0,0,114, 144,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,56,1,0,0,168,5,0,0,115,10,0,0, + 0,0,0,114,56,1,0,0,169,5,0,0,115,10,0,0, 0,10,1,8,1,2,1,6,255,255,128,122,20,70,105,108, 101,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, 99,78,99,3,0,0,0,0,0,0,0,0,0,0,0,14, @@ -2436,7 +2436,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 104,114,15,1,0,0,114,192,0,0,0,90,13,105,110,105, 116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,108, 95,112,97,116,104,114,191,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,207,0,0,0,173,5, + 7,0,0,0,114,8,0,0,0,114,207,0,0,0,174,5, 0,0,115,74,0,0,0,4,5,14,1,2,1,24,1,12, 1,10,1,10,1,8,1,6,1,6,2,6,1,10,1,6, 2,4,1,8,2,12,1,14,1,8,1,10,1,8,1,24, @@ -2468,7 +2468,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 160,0,161,0,146,2,113,4,83,0,114,7,0,0,0,41, 1,114,110,0,0,0,41,2,114,5,0,0,0,90,2,102, 110,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,13,0,0,0,250,5,0,0,115,4,0,0,0,20,0, + 114,13,0,0,0,251,5,0,0,115,4,0,0,0,20,0, 255,128,122,41,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,115,101,116,99,111,109,112,62,78,41,18, @@ -2485,7 +2485,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,116,101,110,116,115,114,38,1,0,0,114,121,0,0,0, 114,25,1,0,0,114,15,1,0,0,90,8,110,101,119,95, 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,67,1,0,0,221,5,0,0,115,38,0,0, + 0,0,0,114,67,1,0,0,222,5,0,0,115,38,0,0, 0,6,2,2,1,22,1,18,1,10,3,12,3,12,1,6, 7,8,1,16,1,4,1,18,1,4,2,12,1,6,1,12, 1,16,1,4,128,255,128,122,22,70,105,108,101,70,105,110, @@ -2524,14 +2524,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 56,0,0,0,169,2,114,202,0,0,0,114,66,1,0,0, 114,7,0,0,0,114,8,0,0,0,218,24,112,97,116,104, 95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,105, - 110,100,101,114,6,6,0,0,115,8,0,0,0,8,2,12, + 110,100,101,114,7,6,0,0,115,8,0,0,0,8,2,12, 1,16,1,255,128,122,54,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,107,95,102, 111,114,95,70,105,108,101,70,105,110,100,101,114,78,114,7, 0,0,0,41,3,114,202,0,0,0,114,66,1,0,0,114, 72,1,0,0,114,7,0,0,0,114,71,1,0,0,114,8, - 0,0,0,218,9,112,97,116,104,95,104,111,111,107,252,5, + 0,0,0,218,9,112,97,116,104,95,104,111,111,107,253,5, 0,0,115,6,0,0,0,14,10,4,6,255,128,122,20,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,0,0,0,0, @@ -2540,7 +2540,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 122,16,70,105,108,101,70,105,110,100,101,114,40,123,33,114, 125,41,41,2,114,70,0,0,0,114,52,0,0,0,114,253, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,36,1,0,0,14,6,0,0,115,4,0,0,0, + 0,0,114,36,1,0,0,15,6,0,0,115,4,0,0,0, 12,1,255,128,122,19,70,105,108,101,70,105,110,100,101,114, 46,95,95,114,101,112,114,95,95,41,1,78,41,15,114,130, 0,0,0,114,129,0,0,0,114,131,0,0,0,114,132,0, @@ -2549,7 +2549,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,207,0,0,0,114,67,1,0,0,114,214,0,0,0,114, 73,1,0,0,114,36,1,0,0,114,7,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,59,1, - 0,0,127,5,0,0,115,26,0,0,0,8,0,4,2,8, + 0,0,128,5,0,0,115,26,0,0,0,8,0,4,2,8, 7,8,14,4,4,8,2,8,12,10,5,8,48,2,31,10, 1,12,17,255,128,114,59,1,0,0,99,4,0,0,0,0, 0,0,0,0,0,0,0,6,0,0,0,8,0,0,0,67, @@ -2572,7 +2572,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,116,104,110,97,109,101,90,9,99,112,97,116,104,110,97, 109,101,114,144,0,0,0,114,191,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,14,95,102,105, - 120,95,117,112,95,109,111,100,117,108,101,20,6,0,0,115, + 120,95,117,112,95,109,111,100,117,108,101,21,6,0,0,115, 42,0,0,0,10,2,10,1,4,1,4,1,8,1,8,1, 12,1,10,2,4,1,14,1,2,1,8,1,8,1,8,1, 10,1,4,128,12,1,2,2,4,128,2,0,255,128,114,78, @@ -2593,7 +2593,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 3,90,10,101,120,116,101,110,115,105,111,110,115,90,6,115, 111,117,114,99,101,90,8,98,121,116,101,99,111,100,101,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,188, - 0,0,0,43,6,0,0,115,10,0,0,0,12,5,8,1, + 0,0,0,44,6,0,0,115,10,0,0,0,12,5,8,1, 8,1,10,1,255,128,114,188,0,0,0,99,1,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0, 67,0,0,0,115,8,0,0,0,124,0,97,0,100,0,83, @@ -2601,7 +2601,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 17,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, 108,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0, 0,218,21,95,115,101,116,95,98,111,111,116,115,116,114,97, - 112,95,109,111,100,117,108,101,54,6,0,0,115,6,0,0, + 112,95,109,111,100,117,108,101,55,6,0,0,115,6,0,0, 0,4,2,4,128,255,128,114,81,1,0,0,99,1,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, 0,67,0,0,0,115,50,0,0,0,116,0,124,0,131,1, @@ -2617,7 +2617,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 42,1,0,0,41,2,114,80,1,0,0,90,17,115,117,112, 112,111,114,116,101,100,95,108,111,97,100,101,114,115,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,95, - 105,110,115,116,97,108,108,59,6,0,0,115,12,0,0,0, + 105,110,115,116,97,108,108,60,6,0,0,115,12,0,0,0, 8,2,6,1,20,1,12,1,4,128,255,128,114,83,1,0, 0,41,1,114,68,0,0,0,41,1,78,41,3,78,78,78, 41,2,114,0,0,0,0,114,0,0,0,0,41,1,84,41, @@ -2660,7 +2660,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,6,2,22,2,8,1,10,1,14,1,4,4,4,1,2, 1,2,1,4,255,8,4,6,16,8,3,8,5,8,5,8, 6,8,6,8,12,8,10,8,9,8,5,8,7,10,9,10, - 22,0,127,16,22,12,1,4,2,4,1,6,2,6,1,10, + 22,0,127,16,23,12,1,4,2,4,1,6,2,6,1,10, 1,8,2,6,2,8,2,16,2,8,71,8,40,8,19,8, 12,8,12,8,31,8,17,8,33,8,28,10,24,10,13,10, 10,8,11,6,14,4,3,2,1,12,255,14,68,14,64,16, From 52eb4cb19feef4c2e418e284b5ea0785c370ff53 Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Wed, 25 Nov 2020 13:50:44 +0200 Subject: [PATCH 0650/1261] bpo-42392: Improve removal of *loop* parameter in asyncio primitives (GH-23499) * Update code after merge review from 1st1 * Use a sentinel approach for loop parameter Remove unnecessary _get_running_loop patching * Use more clear function name (_verify_parameter_is_marker -> _verify_no_loop) * Add init method to _LoopBoundMixin to check that loop param wasn't used --- Lib/asyncio/locks.py | 24 ++++++++++++++---------- Lib/asyncio/mixins.py | 14 ++++++++++++-- Lib/asyncio/queues.py | 5 +++-- Lib/test/test_asyncio/test_locks.py | 17 +++++++++++++++++ Lib/test/test_asyncio/utils.py | 21 --------------------- 5 files changed, 46 insertions(+), 35 deletions(-) diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index 6f322c258cfe4f..a7453fb1c77287 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -19,7 +19,7 @@ async def __aexit__(self, exc_type, exc, tb): self.release() -class Lock(_ContextManagerMixin, mixins._LoopBoundedMixin): +class Lock(_ContextManagerMixin, mixins._LoopBoundMixin): """Primitive lock objects. A primitive lock is a synchronization primitive that is not owned @@ -73,7 +73,8 @@ class Lock(_ContextManagerMixin, mixins._LoopBoundedMixin): """ - def __init__(self): + def __init__(self, *, loop=mixins._marker): + super().__init__(loop=loop) self._waiters = None self._locked = False @@ -153,7 +154,7 @@ def _wake_up_first(self): fut.set_result(True) -class Event(mixins._LoopBoundedMixin): +class Event(mixins._LoopBoundMixin): """Asynchronous equivalent to threading.Event. Class implementing event objects. An event manages a flag that can be set @@ -162,7 +163,8 @@ class Event(mixins._LoopBoundedMixin): false. """ - def __init__(self): + def __init__(self, *, loop=mixins._marker): + super().__init__(loop=loop) self._waiters = collections.deque() self._value = False @@ -214,7 +216,7 @@ async def wait(self): self._waiters.remove(fut) -class Condition(_ContextManagerMixin, mixins._LoopBoundedMixin): +class Condition(_ContextManagerMixin, mixins._LoopBoundMixin): """Asynchronous equivalent to threading.Condition. This class implements condition variable objects. A condition variable @@ -224,7 +226,8 @@ class Condition(_ContextManagerMixin, mixins._LoopBoundedMixin): A new Lock object is created and used as the underlying lock. """ - def __init__(self, lock=None): + def __init__(self, lock=None, *, loop=mixins._marker): + super().__init__(loop=loop) if lock is None: lock = Lock() elif lock._loop is not self._get_loop(): @@ -328,7 +331,7 @@ def notify_all(self): self.notify(len(self._waiters)) -class Semaphore(_ContextManagerMixin, mixins._LoopBoundedMixin): +class Semaphore(_ContextManagerMixin, mixins._LoopBoundMixin): """A Semaphore implementation. A semaphore manages an internal counter which is decremented by each @@ -343,7 +346,8 @@ class Semaphore(_ContextManagerMixin, mixins._LoopBoundedMixin): ValueError is raised. """ - def __init__(self, value=1): + def __init__(self, value=1, *, loop=mixins._marker): + super().__init__(loop=loop) if value < 0: raise ValueError("Semaphore initial value must be >= 0") self._value = value @@ -406,9 +410,9 @@ class BoundedSemaphore(Semaphore): above the initial value. """ - def __init__(self, value=1): + def __init__(self, value=1, *, loop=mixins._marker): self._bound_value = value - super().__init__(value) + super().__init__(value, loop=loop) def release(self): if self._value >= self._bound_value: diff --git a/Lib/asyncio/mixins.py b/Lib/asyncio/mixins.py index dbc4b5faccb019..650df05ccc93ea 100644 --- a/Lib/asyncio/mixins.py +++ b/Lib/asyncio/mixins.py @@ -5,10 +5,20 @@ _global_lock = threading.Lock() +# Used as a sentinel for loop parameter +_marker = object() -class _LoopBoundedMixin: + +class _LoopBoundMixin: _loop = None + def __init__(self, *, loop=_marker): + if loop is not _marker: + raise TypeError( + f'As of 3.10, the *loop* parameter was removed from ' + f'{type(self).__name__}() since it is no longer necessary' + ) + def _get_loop(self): loop = events._get_running_loop() @@ -17,5 +27,5 @@ def _get_loop(self): if self._loop is None: self._loop = loop if loop is not self._loop: - raise RuntimeError(f'{type(self).__name__} have already bounded to another loop') + raise RuntimeError(f'{self!r} is bound to a different event loop') return loop diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py index 78ae9e99ccf0e9..a87ec8b2158767 100644 --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -17,7 +17,7 @@ class QueueFull(Exception): pass -class Queue(mixins._LoopBoundedMixin): +class Queue(mixins._LoopBoundMixin): """A queue, useful for coordinating producer and consumer coroutines. If maxsize is less than or equal to zero, the queue size is infinite. If it @@ -29,7 +29,8 @@ class Queue(mixins._LoopBoundedMixin): interrupted between calling qsize() and doing an operation on the Queue. """ - def __init__(self, maxsize=0): + def __init__(self, maxsize=0, *, loop=mixins._marker): + super().__init__(loop=loop) self._maxsize = maxsize # Futures. diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py index 6c34ef60e30b51..6194cd06176dac 100644 --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -51,6 +51,23 @@ def acquire_lock(): self.assertFalse(lock.locked()) + def test_lock_doesnt_accept_loop_parameter(self): + primitives_cls = [ + asyncio.Lock, + asyncio.Condition, + asyncio.Event, + asyncio.Semaphore, + asyncio.BoundedSemaphore, + ] + + for cls in primitives_cls: + with self.assertRaisesRegex( + TypeError, + rf'As of 3.10, the \*loop\* parameter was removed from ' + rf'{cls.__name__}\(\) since it is no longer necessary' + ): + cls(loop=self.loop) + def test_lock_by_with_statement(self): loop = asyncio.new_event_loop() # don't use TestLoop quirks self.set_event_loop(loop) diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py index aba90c970a8e24..67180f7eb3955a 100644 --- a/Lib/test/test_asyncio/utils.py +++ b/Lib/test/test_asyncio/utils.py @@ -541,31 +541,10 @@ def new_test_loop(self, gen=None): self.set_event_loop(loop) return loop - def unpatch_get_running_loop(self): - events._get_running_loop = self._get_running_loop - def setUp(self): - self._get_running_loop = events._get_running_loop - - def _get_running_loop(): - frame = sys._getframe(1) - - if frame.f_globals['__name__'] == 'asyncio.mixins': - # When we called from LoopBoundedMixin we should - # fallback to default implementation of get_running_loop - try: - return events.get_running_loop() - except RuntimeError: - return None - - return None - - events._get_running_loop = _get_running_loop self._thread_cleanup = threading_helper.threading_setup() def tearDown(self): - self.unpatch_get_running_loop() - events.set_event_loop(None) # Detect CPython bug #23353: ensure that yield/yield-from is not used From 0e355567efb6835a56a36367ba1459bf09e3c6c9 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 25 Nov 2020 22:17:30 +0900 Subject: [PATCH 0651/1261] bpo-42299: Remove formatter module (GH-23476) --- Doc/library/formatter.rst | 351 -------------- Doc/library/index.rst | 1 - Doc/library/misc.rst | 13 - Doc/whatsnew/3.10.rst | 6 + Lib/formatter.py | 452 ------------------ Lib/test/test_sundry.py | 2 +- .../2020-11-23-23-42-08.bpo-42299.Fdn4Wf.rst | 5 + 7 files changed, 12 insertions(+), 818 deletions(-) delete mode 100644 Doc/library/formatter.rst delete mode 100644 Doc/library/misc.rst delete mode 100644 Lib/formatter.py create mode 100644 Misc/NEWS.d/next/Library/2020-11-23-23-42-08.bpo-42299.Fdn4Wf.rst diff --git a/Doc/library/formatter.rst b/Doc/library/formatter.rst deleted file mode 100644 index 6c10ac6fab50e4..00000000000000 --- a/Doc/library/formatter.rst +++ /dev/null @@ -1,351 +0,0 @@ -:mod:`formatter` --- Generic output formatting -============================================== - -.. module:: formatter - :synopsis: Generic output formatter and device interface. - :deprecated: - -.. deprecated:: 3.4 - Due to lack of usage, the formatter module has been deprecated. - --------------- - -This module supports two interface definitions, each with multiple -implementations: The *formatter* interface, and the *writer* interface which is -required by the formatter interface. - -Formatter objects transform an abstract flow of formatting events into specific -output events on writer objects. Formatters manage several stack structures to -allow various properties of a writer object to be changed and restored; writers -need not be able to handle relative changes nor any sort of "change back" -operation. Specific writer properties which may be controlled via formatter -objects are horizontal alignment, font, and left margin indentations. A -mechanism is provided which supports providing arbitrary, non-exclusive style -settings to a writer as well. Additional interfaces facilitate formatting -events which are not reversible, such as paragraph separation. - -Writer objects encapsulate device interfaces. Abstract devices, such as file -formats, are supported as well as physical devices. The provided -implementations all work with abstract devices. The interface makes available -mechanisms for setting the properties which formatter objects manage and -inserting data into the output. - - -.. _formatter-interface: - -The Formatter Interface ------------------------ - -Interfaces to create formatters are dependent on the specific formatter class -being instantiated. The interfaces described below are the required interfaces -which all formatters must support once initialized. - -One data element is defined at the module level: - - -.. data:: AS_IS - - Value which can be used in the font specification passed to the ``push_font()`` - method described below, or as the new value to any other ``push_property()`` - method. Pushing the ``AS_IS`` value allows the corresponding ``pop_property()`` - method to be called without having to track whether the property was changed. - -The following attributes are defined for formatter instance objects: - - -.. attribute:: formatter.writer - - The writer instance with which the formatter interacts. - - -.. method:: formatter.end_paragraph(blanklines) - - Close any open paragraphs and insert at least *blanklines* before the next - paragraph. - - -.. method:: formatter.add_line_break() - - Add a hard line break if one does not already exist. This does not break the - logical paragraph. - - -.. method:: formatter.add_hor_rule(*args, **kw) - - Insert a horizontal rule in the output. A hard break is inserted if there is - data in the current paragraph, but the logical paragraph is not broken. The - arguments and keywords are passed on to the writer's :meth:`send_line_break` - method. - - -.. method:: formatter.add_flowing_data(data) - - Provide data which should be formatted with collapsed whitespace. Whitespace - from preceding and successive calls to :meth:`add_flowing_data` is considered as - well when the whitespace collapse is performed. The data which is passed to - this method is expected to be word-wrapped by the output device. Note that any - word-wrapping still must be performed by the writer object due to the need to - rely on device and font information. - - -.. method:: formatter.add_literal_data(data) - - Provide data which should be passed to the writer unchanged. Whitespace, - including newline and tab characters, are considered legal in the value of - *data*. - - -.. method:: formatter.add_label_data(format, counter) - - Insert a label which should be placed to the left of the current left margin. - This should be used for constructing bulleted or numbered lists. If the - *format* value is a string, it is interpreted as a format specification for - *counter*, which should be an integer. The result of this formatting becomes the - value of the label; if *format* is not a string it is used as the label value - directly. The label value is passed as the only argument to the writer's - :meth:`send_label_data` method. Interpretation of non-string label values is - dependent on the associated writer. - - Format specifications are strings which, in combination with a counter value, - are used to compute label values. Each character in the format string is copied - to the label value, with some characters recognized to indicate a transform on - the counter value. Specifically, the character ``'1'`` represents the counter - value formatter as an Arabic number, the characters ``'A'`` and ``'a'`` - represent alphabetic representations of the counter value in upper and lower - case, respectively, and ``'I'`` and ``'i'`` represent the counter value in Roman - numerals, in upper and lower case. Note that the alphabetic and roman - transforms require that the counter value be greater than zero. - - -.. method:: formatter.flush_softspace() - - Send any pending whitespace buffered from a previous call to - :meth:`add_flowing_data` to the associated writer object. This should be called - before any direct manipulation of the writer object. - - -.. method:: formatter.push_alignment(align) - - Push a new alignment setting onto the alignment stack. This may be - :const:`AS_IS` if no change is desired. If the alignment value is changed from - the previous setting, the writer's :meth:`new_alignment` method is called with - the *align* value. - - -.. method:: formatter.pop_alignment() - - Restore the previous alignment. - - -.. method:: formatter.push_font((size, italic, bold, teletype)) - - Change some or all font properties of the writer object. Properties which are - not set to :const:`AS_IS` are set to the values passed in while others are - maintained at their current settings. The writer's :meth:`new_font` method is - called with the fully resolved font specification. - - -.. method:: formatter.pop_font() - - Restore the previous font. - - -.. method:: formatter.push_margin(margin) - - Increase the number of left margin indentations by one, associating the logical - tag *margin* with the new indentation. The initial margin level is ``0``. - Changed values of the logical tag must be true values; false values other than - :const:`AS_IS` are not sufficient to change the margin. - - -.. method:: formatter.pop_margin() - - Restore the previous margin. - - -.. method:: formatter.push_style(*styles) - - Push any number of arbitrary style specifications. All styles are pushed onto - the styles stack in order. A tuple representing the entire stack, including - :const:`AS_IS` values, is passed to the writer's :meth:`new_styles` method. - - -.. method:: formatter.pop_style(n=1) - - Pop the last *n* style specifications passed to :meth:`push_style`. A tuple - representing the revised stack, including :const:`AS_IS` values, is passed to - the writer's :meth:`new_styles` method. - - -.. method:: formatter.set_spacing(spacing) - - Set the spacing style for the writer. - - -.. method:: formatter.assert_line_data(flag=1) - - Inform the formatter that data has been added to the current paragraph - out-of-band. This should be used when the writer has been manipulated - directly. The optional *flag* argument can be set to false if the writer - manipulations produced a hard line break at the end of the output. - - -.. _formatter-impls: - -Formatter Implementations -------------------------- - -Two implementations of formatter objects are provided by this module. Most -applications may use one of these classes without modification or subclassing. - - -.. class:: NullFormatter(writer=None) - - A formatter which does nothing. If *writer* is omitted, a :class:`NullWriter` - instance is created. No methods of the writer are called by - :class:`NullFormatter` instances. Implementations should inherit from this - class if implementing a writer interface but don't need to inherit any - implementation. - - -.. class:: AbstractFormatter(writer) - - The standard formatter. This implementation has demonstrated wide applicability - to many writers, and may be used directly in most circumstances. It has been - used to implement a full-featured World Wide Web browser. - - -.. _writer-interface: - -The Writer Interface --------------------- - -Interfaces to create writers are dependent on the specific writer class being -instantiated. The interfaces described below are the required interfaces which -all writers must support once initialized. Note that while most applications can -use the :class:`AbstractFormatter` class as a formatter, the writer must -typically be provided by the application. - - -.. method:: writer.flush() - - Flush any buffered output or device control events. - - -.. method:: writer.new_alignment(align) - - Set the alignment style. The *align* value can be any object, but by convention - is a string or ``None``, where ``None`` indicates that the writer's "preferred" - alignment should be used. Conventional *align* values are ``'left'``, - ``'center'``, ``'right'``, and ``'justify'``. - - -.. method:: writer.new_font(font) - - Set the font style. The value of *font* will be ``None``, indicating that the - device's default font should be used, or a tuple of the form ``(size, - italic, bold, teletype)``. Size will be a string indicating the size of - font that should be used; specific strings and their interpretation must be - defined by the application. The *italic*, *bold*, and *teletype* values are - Boolean values specifying which of those font attributes should be used. - - -.. method:: writer.new_margin(margin, level) - - Set the margin level to the integer *level* and the logical tag to *margin*. - Interpretation of the logical tag is at the writer's discretion; the only - restriction on the value of the logical tag is that it not be a false value for - non-zero values of *level*. - - -.. method:: writer.new_spacing(spacing) - - Set the spacing style to *spacing*. - - -.. method:: writer.new_styles(styles) - - Set additional styles. The *styles* value is a tuple of arbitrary values; the - value :const:`AS_IS` should be ignored. The *styles* tuple may be interpreted - either as a set or as a stack depending on the requirements of the application - and writer implementation. - - -.. method:: writer.send_line_break() - - Break the current line. - - -.. method:: writer.send_paragraph(blankline) - - Produce a paragraph separation of at least *blankline* blank lines, or the - equivalent. The *blankline* value will be an integer. Note that the - implementation will receive a call to :meth:`send_line_break` before this call - if a line break is needed; this method should not include ending the last line - of the paragraph. It is only responsible for vertical spacing between - paragraphs. - - -.. method:: writer.send_hor_rule(*args, **kw) - - Display a horizontal rule on the output device. The arguments to this method - are entirely application- and writer-specific, and should be interpreted with - care. The method implementation may assume that a line break has already been - issued via :meth:`send_line_break`. - - -.. method:: writer.send_flowing_data(data) - - Output character data which may be word-wrapped and re-flowed as needed. Within - any sequence of calls to this method, the writer may assume that spans of - multiple whitespace characters have been collapsed to single space characters. - - -.. method:: writer.send_literal_data(data) - - Output character data which has already been formatted for display. Generally, - this should be interpreted to mean that line breaks indicated by newline - characters should be preserved and no new line breaks should be introduced. The - data may contain embedded newline and tab characters, unlike data provided to - the :meth:`send_formatted_data` interface. - - -.. method:: writer.send_label_data(data) - - Set *data* to the left of the current left margin, if possible. The value of - *data* is not restricted; treatment of non-string values is entirely - application- and writer-dependent. This method will only be called at the - beginning of a line. - - -.. _writer-impls: - -Writer Implementations ----------------------- - -Three implementations of the writer object interface are provided as examples by -this module. Most applications will need to derive new writer classes from the -:class:`NullWriter` class. - - -.. class:: NullWriter() - - A writer which only provides the interface definition; no actions are taken on - any methods. This should be the base class for all writers which do not need to - inherit any implementation methods. - - -.. class:: AbstractWriter() - - A writer which can be used in debugging formatters, but not much else. Each - method simply announces itself by printing its name and arguments on standard - output. - - -.. class:: DumbWriter(file=None, maxcol=72) - - Simple writer class which writes output on the :term:`file object` passed - in as *file* or, if *file* is omitted, on standard output. The output is - simply word-wrapped to the number of columns specified by *maxcol*. This - class is suitable for reflowing a sequence of paragraphs. - diff --git a/Doc/library/index.rst b/Doc/library/index.rst index bebf7429b0e63e..42f994f8b87d14 100644 --- a/Doc/library/index.rst +++ b/Doc/library/index.rst @@ -72,7 +72,6 @@ the `Python Package Index `_. custominterp.rst modules.rst language.rst - misc.rst windows.rst unix.rst superseded.rst diff --git a/Doc/library/misc.rst b/Doc/library/misc.rst deleted file mode 100644 index 0943235246a91b..00000000000000 --- a/Doc/library/misc.rst +++ /dev/null @@ -1,13 +0,0 @@ -.. _misc: - -********************** -Miscellaneous Services -********************** - -The modules described in this chapter provide miscellaneous services that are -available in all Python versions. Here's an overview: - - -.. toctree:: - - formatter.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 704de8156f312d..f96a3bcbca95f3 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -449,6 +449,12 @@ Removed :c:func:`PyParser_SimpleParseFileFlags` and :c:func:`PyNode_Compile` that were deprecated in 3.9 due to the switch to the new PEG parser. +* Removed the ``formatter`` module, which was deprecated in Python 3.4. + It is somewhat obsolete, little used, and not tested. It was originally + scheduled to be removed in Python 3.6, but such removals were delayed until + after Python 2.7 EOL. Existing users should copy whatever classes they use + into their code. + (Contributed by Dong-hee Na and Terry J. Reedy in :issue:`42299`.) Porting to Python 3.10 ====================== diff --git a/Lib/formatter.py b/Lib/formatter.py deleted file mode 100644 index e2394de8c29195..00000000000000 --- a/Lib/formatter.py +++ /dev/null @@ -1,452 +0,0 @@ -"""Generic output formatting. - -Formatter objects transform an abstract flow of formatting events into -specific output events on writer objects. Formatters manage several stack -structures to allow various properties of a writer object to be changed and -restored; writers need not be able to handle relative changes nor any sort -of ``change back'' operation. Specific writer properties which may be -controlled via formatter objects are horizontal alignment, font, and left -margin indentations. A mechanism is provided which supports providing -arbitrary, non-exclusive style settings to a writer as well. Additional -interfaces facilitate formatting events which are not reversible, such as -paragraph separation. - -Writer objects encapsulate device interfaces. Abstract devices, such as -file formats, are supported as well as physical devices. The provided -implementations all work with abstract devices. The interface makes -available mechanisms for setting the properties which formatter objects -manage and inserting data into the output. -""" - -import sys -import warnings -warnings.warn('the formatter module is deprecated', DeprecationWarning, - stacklevel=2) - - -AS_IS = None - - -class NullFormatter: - """A formatter which does nothing. - - If the writer parameter is omitted, a NullWriter instance is created. - No methods of the writer are called by NullFormatter instances. - - Implementations should inherit from this class if implementing a writer - interface but don't need to inherit any implementation. - - """ - - def __init__(self, writer=None): - if writer is None: - writer = NullWriter() - self.writer = writer - def end_paragraph(self, blankline): pass - def add_line_break(self): pass - def add_hor_rule(self, *args, **kw): pass - def add_label_data(self, format, counter, blankline=None): pass - def add_flowing_data(self, data): pass - def add_literal_data(self, data): pass - def flush_softspace(self): pass - def push_alignment(self, align): pass - def pop_alignment(self): pass - def push_font(self, x): pass - def pop_font(self): pass - def push_margin(self, margin): pass - def pop_margin(self): pass - def set_spacing(self, spacing): pass - def push_style(self, *styles): pass - def pop_style(self, n=1): pass - def assert_line_data(self, flag=1): pass - - -class AbstractFormatter: - """The standard formatter. - - This implementation has demonstrated wide applicability to many writers, - and may be used directly in most circumstances. It has been used to - implement a full-featured World Wide Web browser. - - """ - - # Space handling policy: blank spaces at the boundary between elements - # are handled by the outermost context. "Literal" data is not checked - # to determine context, so spaces in literal data are handled directly - # in all circumstances. - - def __init__(self, writer): - self.writer = writer # Output device - self.align = None # Current alignment - self.align_stack = [] # Alignment stack - self.font_stack = [] # Font state - self.margin_stack = [] # Margin state - self.spacing = None # Vertical spacing state - self.style_stack = [] # Other state, e.g. color - self.nospace = 1 # Should leading space be suppressed - self.softspace = 0 # Should a space be inserted - self.para_end = 1 # Just ended a paragraph - self.parskip = 0 # Skipped space between paragraphs? - self.hard_break = 1 # Have a hard break - self.have_label = 0 - - def end_paragraph(self, blankline): - if not self.hard_break: - self.writer.send_line_break() - self.have_label = 0 - if self.parskip < blankline and not self.have_label: - self.writer.send_paragraph(blankline - self.parskip) - self.parskip = blankline - self.have_label = 0 - self.hard_break = self.nospace = self.para_end = 1 - self.softspace = 0 - - def add_line_break(self): - if not (self.hard_break or self.para_end): - self.writer.send_line_break() - self.have_label = self.parskip = 0 - self.hard_break = self.nospace = 1 - self.softspace = 0 - - def add_hor_rule(self, *args, **kw): - if not self.hard_break: - self.writer.send_line_break() - self.writer.send_hor_rule(*args, **kw) - self.hard_break = self.nospace = 1 - self.have_label = self.para_end = self.softspace = self.parskip = 0 - - def add_label_data(self, format, counter, blankline = None): - if self.have_label or not self.hard_break: - self.writer.send_line_break() - if not self.para_end: - self.writer.send_paragraph((blankline and 1) or 0) - if isinstance(format, str): - self.writer.send_label_data(self.format_counter(format, counter)) - else: - self.writer.send_label_data(format) - self.nospace = self.have_label = self.hard_break = self.para_end = 1 - self.softspace = self.parskip = 0 - - def format_counter(self, format, counter): - label = '' - for c in format: - if c == '1': - label = label + ('%d' % counter) - elif c in 'aA': - if counter > 0: - label = label + self.format_letter(c, counter) - elif c in 'iI': - if counter > 0: - label = label + self.format_roman(c, counter) - else: - label = label + c - return label - - def format_letter(self, case, counter): - label = '' - while counter > 0: - counter, x = divmod(counter-1, 26) - # This makes a strong assumption that lowercase letters - # and uppercase letters form two contiguous blocks, with - # letters in order! - s = chr(ord(case) + x) - label = s + label - return label - - def format_roman(self, case, counter): - ones = ['i', 'x', 'c', 'm'] - fives = ['v', 'l', 'd'] - label, index = '', 0 - # This will die of IndexError when counter is too big - while counter > 0: - counter, x = divmod(counter, 10) - if x == 9: - label = ones[index] + ones[index+1] + label - elif x == 4: - label = ones[index] + fives[index] + label - else: - if x >= 5: - s = fives[index] - x = x-5 - else: - s = '' - s = s + ones[index]*x - label = s + label - index = index + 1 - if case == 'I': - return label.upper() - return label - - def add_flowing_data(self, data): - if not data: return - prespace = data[:1].isspace() - postspace = data[-1:].isspace() - data = " ".join(data.split()) - if self.nospace and not data: - return - elif prespace or self.softspace: - if not data: - if not self.nospace: - self.softspace = 1 - self.parskip = 0 - return - if not self.nospace: - data = ' ' + data - self.hard_break = self.nospace = self.para_end = \ - self.parskip = self.have_label = 0 - self.softspace = postspace - self.writer.send_flowing_data(data) - - def add_literal_data(self, data): - if not data: return - if self.softspace: - self.writer.send_flowing_data(" ") - self.hard_break = data[-1:] == '\n' - self.nospace = self.para_end = self.softspace = \ - self.parskip = self.have_label = 0 - self.writer.send_literal_data(data) - - def flush_softspace(self): - if self.softspace: - self.hard_break = self.para_end = self.parskip = \ - self.have_label = self.softspace = 0 - self.nospace = 1 - self.writer.send_flowing_data(' ') - - def push_alignment(self, align): - if align and align != self.align: - self.writer.new_alignment(align) - self.align = align - self.align_stack.append(align) - else: - self.align_stack.append(self.align) - - def pop_alignment(self): - if self.align_stack: - del self.align_stack[-1] - if self.align_stack: - self.align = align = self.align_stack[-1] - self.writer.new_alignment(align) - else: - self.align = None - self.writer.new_alignment(None) - - def push_font(self, font): - size, i, b, tt = font - if self.softspace: - self.hard_break = self.para_end = self.softspace = 0 - self.nospace = 1 - self.writer.send_flowing_data(' ') - if self.font_stack: - csize, ci, cb, ctt = self.font_stack[-1] - if size is AS_IS: size = csize - if i is AS_IS: i = ci - if b is AS_IS: b = cb - if tt is AS_IS: tt = ctt - font = (size, i, b, tt) - self.font_stack.append(font) - self.writer.new_font(font) - - def pop_font(self): - if self.font_stack: - del self.font_stack[-1] - if self.font_stack: - font = self.font_stack[-1] - else: - font = None - self.writer.new_font(font) - - def push_margin(self, margin): - self.margin_stack.append(margin) - fstack = [m for m in self.margin_stack if m] - if not margin and fstack: - margin = fstack[-1] - self.writer.new_margin(margin, len(fstack)) - - def pop_margin(self): - if self.margin_stack: - del self.margin_stack[-1] - fstack = [m for m in self.margin_stack if m] - if fstack: - margin = fstack[-1] - else: - margin = None - self.writer.new_margin(margin, len(fstack)) - - def set_spacing(self, spacing): - self.spacing = spacing - self.writer.new_spacing(spacing) - - def push_style(self, *styles): - if self.softspace: - self.hard_break = self.para_end = self.softspace = 0 - self.nospace = 1 - self.writer.send_flowing_data(' ') - for style in styles: - self.style_stack.append(style) - self.writer.new_styles(tuple(self.style_stack)) - - def pop_style(self, n=1): - del self.style_stack[-n:] - self.writer.new_styles(tuple(self.style_stack)) - - def assert_line_data(self, flag=1): - self.nospace = self.hard_break = not flag - self.para_end = self.parskip = self.have_label = 0 - - -class NullWriter: - """Minimal writer interface to use in testing & inheritance. - - A writer which only provides the interface definition; no actions are - taken on any methods. This should be the base class for all writers - which do not need to inherit any implementation methods. - - """ - def __init__(self): pass - def flush(self): pass - def new_alignment(self, align): pass - def new_font(self, font): pass - def new_margin(self, margin, level): pass - def new_spacing(self, spacing): pass - def new_styles(self, styles): pass - def send_paragraph(self, blankline): pass - def send_line_break(self): pass - def send_hor_rule(self, *args, **kw): pass - def send_label_data(self, data): pass - def send_flowing_data(self, data): pass - def send_literal_data(self, data): pass - - -class AbstractWriter(NullWriter): - """A writer which can be used in debugging formatters, but not much else. - - Each method simply announces itself by printing its name and - arguments on standard output. - - """ - - def new_alignment(self, align): - print("new_alignment(%r)" % (align,)) - - def new_font(self, font): - print("new_font(%r)" % (font,)) - - def new_margin(self, margin, level): - print("new_margin(%r, %d)" % (margin, level)) - - def new_spacing(self, spacing): - print("new_spacing(%r)" % (spacing,)) - - def new_styles(self, styles): - print("new_styles(%r)" % (styles,)) - - def send_paragraph(self, blankline): - print("send_paragraph(%r)" % (blankline,)) - - def send_line_break(self): - print("send_line_break()") - - def send_hor_rule(self, *args, **kw): - print("send_hor_rule()") - - def send_label_data(self, data): - print("send_label_data(%r)" % (data,)) - - def send_flowing_data(self, data): - print("send_flowing_data(%r)" % (data,)) - - def send_literal_data(self, data): - print("send_literal_data(%r)" % (data,)) - - -class DumbWriter(NullWriter): - """Simple writer class which writes output on the file object passed in - as the file parameter or, if file is omitted, on standard output. The - output is simply word-wrapped to the number of columns specified by - the maxcol parameter. This class is suitable for reflowing a sequence - of paragraphs. - - """ - - def __init__(self, file=None, maxcol=72): - self.file = file or sys.stdout - self.maxcol = maxcol - NullWriter.__init__(self) - self.reset() - - def reset(self): - self.col = 0 - self.atbreak = 0 - - def send_paragraph(self, blankline): - self.file.write('\n'*blankline) - self.col = 0 - self.atbreak = 0 - - def send_line_break(self): - self.file.write('\n') - self.col = 0 - self.atbreak = 0 - - def send_hor_rule(self, *args, **kw): - self.file.write('\n') - self.file.write('-'*self.maxcol) - self.file.write('\n') - self.col = 0 - self.atbreak = 0 - - def send_literal_data(self, data): - self.file.write(data) - i = data.rfind('\n') - if i >= 0: - self.col = 0 - data = data[i+1:] - data = data.expandtabs() - self.col = self.col + len(data) - self.atbreak = 0 - - def send_flowing_data(self, data): - if not data: return - atbreak = self.atbreak or data[0].isspace() - col = self.col - maxcol = self.maxcol - write = self.file.write - for word in data.split(): - if atbreak: - if col + len(word) >= maxcol: - write('\n') - col = 0 - else: - write(' ') - col = col + 1 - write(word) - col = col + len(word) - atbreak = 1 - self.col = col - self.atbreak = data[-1].isspace() - - -def test(file = None): - w = DumbWriter() - f = AbstractFormatter(w) - if file is not None: - fp = open(file) - elif sys.argv[1:]: - fp = open(sys.argv[1]) - else: - fp = sys.stdin - try: - for line in fp: - if line == '\n': - f.end_paragraph(1) - else: - f.add_flowing_data(line) - finally: - if fp is not sys.stdin: - fp.close() - f.end_paragraph(0) - - -if __name__ == '__main__': - test() diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py index 04e572c00a1969..aab074b8a9b277 100644 --- a/Lib/test/test_sundry.py +++ b/Lib/test/test_sundry.py @@ -9,7 +9,7 @@ class TestUntestedModules(unittest.TestCase): def test_untested_modules_can_be_imported(self): - untested = ('encodings', 'formatter') + untested = ('encodings',) with warnings_helper.check_warnings(quiet=True): for name in untested: try: diff --git a/Misc/NEWS.d/next/Library/2020-11-23-23-42-08.bpo-42299.Fdn4Wf.rst b/Misc/NEWS.d/next/Library/2020-11-23-23-42-08.bpo-42299.Fdn4Wf.rst new file mode 100644 index 00000000000000..a8e156c1003792 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-23-23-42-08.bpo-42299.Fdn4Wf.rst @@ -0,0 +1,5 @@ +Removed the ``formatter`` module, which was deprecated in Python 3.4. +It is somewhat obsolete, little used, and not tested. It was originally +scheduled to be removed in Python 3.6, but such removals were delayed until +after Python 2.7 EOL. Existing users should copy whatever classes they use +into their code. Patch by Dong-hee Na and and Terry J. Reedy. From 267725ebcef045f507b2ade86444db6ea9bdb15d Mon Sep 17 00:00:00 2001 From: Soumendra Ganguly <67527439+8vasu@users.noreply.github.com> Date: Wed, 25 Nov 2020 07:41:25 -0600 Subject: [PATCH 0652/1261] bpo-41818: Updated tests for the standard pty library (GH-22962) --- Lib/test/test_pty.py | 122 ++++++++++++++++-- .../2020-11-20-14-44-07.bpo-41818.33soAw.rst | 1 + 2 files changed, 112 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-20-14-44-07.bpo-41818.33soAw.rst diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index 7ca0557800b6d8..7de568806ed7d8 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -14,9 +14,22 @@ import io # readline import unittest +import struct +import tty +import fcntl +import platform +import warnings + TEST_STRING_1 = b"I wish to buy a fish license.\n" TEST_STRING_2 = b"For my pet fish, Eric.\n" +try: + _TIOCGWINSZ = tty.TIOCGWINSZ + _TIOCSWINSZ = tty.TIOCSWINSZ + _HAVE_WINSZ = True +except AttributeError: + _HAVE_WINSZ = False + if verbose: def debug(msg): print(msg) @@ -60,6 +73,27 @@ def _readline(fd): reader = io.FileIO(fd, mode='rb', closefd=False) return reader.readline() +def expectedFailureIfStdinIsTTY(fun): + # avoid isatty() for now + try: + tty.tcgetattr(pty.STDIN_FILENO) + return unittest.expectedFailure(fun) + except tty.error: + pass + return fun + +def expectedFailureOnBSD(fun): + PLATFORM = platform.system() + if PLATFORM.endswith("BSD") or PLATFORM == "Darwin": + return unittest.expectedFailure(fun) + return fun + +def _get_term_winsz(fd): + s = struct.pack("HHHH", 0, 0, 0, 0) + return fcntl.ioctl(fd, _TIOCGWINSZ, s) + +def _set_term_winsz(fd, winsz): + fcntl.ioctl(fd, _TIOCSWINSZ, winsz) # Marginal testing of pty suite. Cannot do extensive 'do or fail' testing @@ -78,6 +112,20 @@ def setUp(self): self.addCleanup(signal.alarm, 0) signal.alarm(10) + # Save original stdin window size + self.stdin_rows = None + self.stdin_cols = None + if _HAVE_WINSZ: + try: + stdin_dim = os.get_terminal_size(pty.STDIN_FILENO) + self.stdin_rows = stdin_dim.lines + self.stdin_cols = stdin_dim.columns + old_stdin_winsz = struct.pack("HHHH", self.stdin_rows, + self.stdin_cols, 0, 0) + self.addCleanup(_set_term_winsz, pty.STDIN_FILENO, old_stdin_winsz) + except OSError: + pass + def handle_sig(self, sig, frame): self.fail("isatty hung") @@ -86,26 +134,65 @@ def handle_sighup(signum, frame): # bpo-38547: if the process is the session leader, os.close(master_fd) # of "master_fd, slave_name = pty.master_open()" raises SIGHUP # signal: just ignore the signal. + # + # NOTE: the above comment is from an older version of the test; + # master_open() is not being used anymore. pass - def test_basic(self): + @expectedFailureIfStdinIsTTY + def test_openpty(self): try: - debug("Calling master_open()") - master_fd, slave_name = pty.master_open() - debug("Got master_fd '%d', slave_name '%s'" % - (master_fd, slave_name)) - debug("Calling slave_open(%r)" % (slave_name,)) - slave_fd = pty.slave_open(slave_name) - debug("Got slave_fd '%d'" % slave_fd) + mode = tty.tcgetattr(pty.STDIN_FILENO) + except tty.error: + # not a tty or bad/closed fd + debug("tty.tcgetattr(pty.STDIN_FILENO) failed") + mode = None + + new_stdin_winsz = None + if self.stdin_rows != None and self.stdin_cols != None: + try: + debug("Setting pty.STDIN_FILENO window size") + # Set number of columns and rows to be the + # floors of 1/5 of respective original values + target_stdin_winsz = struct.pack("HHHH", self.stdin_rows//5, + self.stdin_cols//5, 0, 0) + _set_term_winsz(pty.STDIN_FILENO, target_stdin_winsz) + + # Were we able to set the window size + # of pty.STDIN_FILENO successfully? + new_stdin_winsz = _get_term_winsz(pty.STDIN_FILENO) + self.assertEqual(new_stdin_winsz, target_stdin_winsz, + "pty.STDIN_FILENO window size unchanged") + except OSError: + warnings.warn("Failed to set pty.STDIN_FILENO window size") + pass + + try: + debug("Calling pty.openpty()") + try: + master_fd, slave_fd = pty.openpty(mode, new_stdin_winsz) + except TypeError: + master_fd, slave_fd = pty.openpty() + debug(f"Got master_fd '{master_fd}', slave_fd '{slave_fd}'") except OSError: # " An optional feature could not be imported " ... ? raise unittest.SkipTest("Pseudo-terminals (seemingly) not functional.") - self.assertTrue(os.isatty(slave_fd), 'slave_fd is not a tty') + self.assertTrue(os.isatty(slave_fd), "slave_fd is not a tty") + + if mode: + self.assertEqual(tty.tcgetattr(slave_fd), mode, + "openpty() failed to set slave termios") + if new_stdin_winsz: + self.assertEqual(_get_term_winsz(slave_fd), new_stdin_winsz, + "openpty() failed to set slave window size") # Solaris requires reading the fd before anything is returned. # My guess is that since we open and close the slave fd # in master_open(), we need to read the EOF. + # + # NOTE: the above comment is from an older version of the test; + # master_open() is not being used anymore. # Ensure the fd is non-blocking in case there's nothing to read. blocking = os.get_blocking(master_fd) @@ -222,8 +309,20 @@ def test_fork(self): os.close(master_fd) - # pty.fork() passed. + @expectedFailureOnBSD + def test_master_read(self): + debug("Calling pty.openpty()") + master_fd, slave_fd = pty.openpty() + debug(f"Got master_fd '{master_fd}', slave_fd '{slave_fd}'") + + debug("Closing slave_fd") + os.close(slave_fd) + debug("Reading from master_fd") + with self.assertRaises(OSError): + os.read(master_fd, 1) + + os.close(master_fd) class SmallPtyTests(unittest.TestCase): """These tests don't spawn children or hang.""" @@ -262,8 +361,9 @@ def _socketpair(self): self.files.extend(socketpair) return socketpair - def _mock_select(self, rfds, wfds, xfds): + def _mock_select(self, rfds, wfds, xfds, timeout=0): # This will raise IndexError when no more expected calls exist. + # This ignores the timeout self.assertEqual(self.select_rfds_lengths.pop(0), len(rfds)) return self.select_rfds_results.pop(0), [], [] diff --git a/Misc/NEWS.d/next/Library/2020-11-20-14-44-07.bpo-41818.33soAw.rst b/Misc/NEWS.d/next/Library/2020-11-20-14-44-07.bpo-41818.33soAw.rst new file mode 100644 index 00000000000000..005bf7e2af910e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-20-14-44-07.bpo-41818.33soAw.rst @@ -0,0 +1 @@ +Updated tests for the pty library. test_basic() has been changed to test_openpty(); this additionally checks if slave termios and slave winsize are being set properly by pty.openpty(). In order to add support for FreeBSD, NetBSD, OpenBSD, and Darwin, this also adds test_master_read(), which demonstrates that pty.spawn() should not depend on an OSError to exit from its copy loop. \ No newline at end of file From 385d66b6695385e66b33ebbcc1d2cdde3799e064 Mon Sep 17 00:00:00 2001 From: basak Date: Wed, 25 Nov 2020 14:12:17 +0000 Subject: [PATCH 0653/1261] Typo: fix inverted sense of statement (GH-23288) Looks like a "not" was inadvertently omitted in commit e6a7ea4. Classmethods are useful when data stored in specific instances are *not* needed. Automerge-Triggered-By: GH:JulienPalard --- Doc/howto/descriptor.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index bc741c738b98da..ab5a573c6a06d1 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -1225,7 +1225,7 @@ for whether the caller is an object or a class: ('F', 3) This behavior is useful whenever the method only needs to have a class -reference and does rely on data stored in a specific instance. One use for +reference and does not rely on data stored in a specific instance. One use for class methods is to create alternate class constructors. For example, the classmethod :func:`dict.fromkeys` creates a new dictionary from a list of keys. The pure Python equivalent is: From 1cbbdb51f13cb165f82399819d47f29bb850b00c Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Wed, 25 Nov 2020 19:06:12 +0200 Subject: [PATCH 0654/1261] bpo-41818: test_openpty succeed on Gentoo, don't expect to fail on this platform (GH-23514) --- Lib/test/test_pty.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index 7de568806ed7d8..138560e0309ab0 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -5,6 +5,7 @@ import_module('termios') import errno +import pathlib import pty import os import sys @@ -75,6 +76,19 @@ def _readline(fd): def expectedFailureIfStdinIsTTY(fun): # avoid isatty() for now + PLATFORM = platform.system() + if PLATFORM == "Linux": + os_release = pathlib.Path("/etc/os-release") + if os_release.exists(): + # Actually the file has complex multi-line structure, + # these is no need to parse it for Gentoo check + if 'gentoo' in os_release.read_text().lower(): + # bpo-41818: + # Gentoo passes the test, + # all other tested Linux distributions fail. + # Should not apply @unittest.expectedFailure() on Gentoo + # to keep the buildbot fleet happy. + return fun try: tty.tcgetattr(pty.STDIN_FILENO) return unittest.expectedFailure(fun) From bf6187ff339c9a10cf77bc9c1c91d093a1873eca Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Thu, 26 Nov 2020 09:36:37 +0200 Subject: [PATCH 0655/1261] bpo-42392: Remove loop parameter from asyncio.streams (GH-23517) --- Lib/asyncio/streams.py | 37 +++------ Lib/test/test_asyncio/test_base_events.py | 4 +- Lib/test/test_asyncio/test_server.py | 10 +-- Lib/test/test_asyncio/test_sslproto.py | 34 ++++---- Lib/test/test_asyncio/test_streams.py | 78 +++++++------------ .../2020-11-25-22-44-59.bpo-42392.T_DAEl.rst | 2 + 6 files changed, 56 insertions(+), 109 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-25-22-44-59.bpo-42392.T_DAEl.rst diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index 3c80bb88925905..96a9f97200d0d9 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -23,7 +23,7 @@ async def open_connection(host=None, port=None, *, - loop=None, limit=_DEFAULT_LIMIT, **kwds): + limit=_DEFAULT_LIMIT, **kwds): """A wrapper for create_connection() returning a (reader, writer) pair. The reader returned is a StreamReader instance; the writer is a @@ -41,12 +41,7 @@ async def open_connection(host=None, port=None, *, StreamReaderProtocol classes, just copy the code -- there's really nothing special here except some convenience.) """ - if loop is None: - loop = events.get_event_loop() - else: - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) + loop = events.get_running_loop() reader = StreamReader(limit=limit, loop=loop) protocol = StreamReaderProtocol(reader, loop=loop) transport, _ = await loop.create_connection( @@ -56,7 +51,7 @@ async def open_connection(host=None, port=None, *, async def start_server(client_connected_cb, host=None, port=None, *, - loop=None, limit=_DEFAULT_LIMIT, **kwds): + limit=_DEFAULT_LIMIT, **kwds): """Start a socket server, call back for each client connected. The first parameter, `client_connected_cb`, takes two parameters: @@ -78,12 +73,7 @@ async def start_server(client_connected_cb, host=None, port=None, *, The return value is the same as loop.create_server(), i.e. a Server object which can be used to stop the service. """ - if loop is None: - loop = events.get_event_loop() - else: - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) + loop = events.get_running_loop() def factory(): reader = StreamReader(limit=limit, loop=loop) @@ -98,14 +88,10 @@ def factory(): # UNIX Domain Sockets are supported on this platform async def open_unix_connection(path=None, *, - loop=None, limit=_DEFAULT_LIMIT, **kwds): + limit=_DEFAULT_LIMIT, **kwds): """Similar to `open_connection` but works with UNIX Domain Sockets.""" - if loop is None: - loop = events.get_event_loop() - else: - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) + loop = events.get_running_loop() + reader = StreamReader(limit=limit, loop=loop) protocol = StreamReaderProtocol(reader, loop=loop) transport, _ = await loop.create_unix_connection( @@ -114,14 +100,9 @@ async def open_unix_connection(path=None, *, return reader, writer async def start_unix_server(client_connected_cb, path=None, *, - loop=None, limit=_DEFAULT_LIMIT, **kwds): + limit=_DEFAULT_LIMIT, **kwds): """Similar to `start_server` but works with UNIX Domain Sockets.""" - if loop is None: - loop = events.get_event_loop() - else: - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) + loop = events.get_running_loop() def factory(): reader = StreamReader(limit=limit, loop=loop) diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index f74dabc2db9458..8d048c87d00507 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1160,9 +1160,7 @@ def test_create_server_stream_bittype(self): @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'no IPv6 support') def test_create_server_ipv6(self): async def main(): - with self.assertWarns(DeprecationWarning): - srv = await asyncio.start_server( - lambda: None, '::1', 0, loop=self.loop) + srv = await asyncio.start_server(lambda: None, '::1', 0) try: self.assertGreater(len(srv.sockets), 0) finally: diff --git a/Lib/test/test_asyncio/test_server.py b/Lib/test/test_asyncio/test_server.py index 2de4dcad17c8ed..860d62d52ef1ea 100644 --- a/Lib/test/test_asyncio/test_server.py +++ b/Lib/test/test_asyncio/test_server.py @@ -45,9 +45,8 @@ async def main(srv): async with srv: await srv.serve_forever() - with self.assertWarns(DeprecationWarning): - srv = self.loop.run_until_complete(asyncio.start_server( - serve, socket_helper.HOSTv4, 0, loop=self.loop, start_serving=False)) + srv = self.loop.run_until_complete(asyncio.start_server( + serve, socket_helper.HOSTv4, 0, start_serving=False)) self.assertFalse(srv.is_serving()) @@ -102,9 +101,8 @@ async def main(srv): await srv.serve_forever() with test_utils.unix_socket_path() as addr: - with self.assertWarns(DeprecationWarning): - srv = self.loop.run_until_complete(asyncio.start_unix_server( - serve, addr, loop=self.loop, start_serving=False)) + srv = self.loop.run_until_complete(asyncio.start_unix_server( + serve, addr, start_serving=False)) main_task = self.loop.create_task(main(srv)) diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 948820c82f3bfb..e87863eb712373 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -657,13 +657,11 @@ def server(sock): sock.close() async def client(addr): - with self.assertWarns(DeprecationWarning): - reader, writer = await asyncio.open_connection( - *addr, - ssl=client_sslctx, - server_hostname='', - loop=self.loop, - ssl_handshake_timeout=1.0) + reader, writer = await asyncio.open_connection( + *addr, + ssl=client_sslctx, + server_hostname='', + ssl_handshake_timeout=1.0) with self.tcp_server(server, max_clients=1, @@ -697,13 +695,11 @@ def server(sock): sock.close() async def client(addr): - with self.assertWarns(DeprecationWarning): - reader, writer = await asyncio.open_connection( - *addr, - ssl=client_sslctx, - server_hostname='', - loop=self.loop, - ssl_handshake_timeout=support.LOOPBACK_TIMEOUT) + reader, writer = await asyncio.open_connection( + *addr, + ssl=client_sslctx, + server_hostname='', + ssl_handshake_timeout=support.LOOPBACK_TIMEOUT) with self.tcp_server(server, max_clients=1, @@ -734,12 +730,10 @@ def server(sock): sock.close() async def client(addr): - with self.assertWarns(DeprecationWarning): - reader, writer = await asyncio.open_connection( - *addr, - ssl=client_sslctx, - server_hostname='', - loop=self.loop) + reader, writer = await asyncio.open_connection( + *addr, + ssl=client_sslctx, + server_hostname='') self.assertEqual(await reader.readline(), b'A\n') writer.write(b'B') diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 1e9d115661d087..a6cfcbfb57b361 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -48,8 +48,7 @@ def test_ctor_global_loop(self, m_events): def _basetest_open_connection(self, open_connection_fut): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - with self.assertWarns(DeprecationWarning): - reader, writer = self.loop.run_until_complete(open_connection_fut) + reader, writer = self.loop.run_until_complete(open_connection_fut) writer.write(b'GET / HTTP/1.0\r\n\r\n') f = reader.readline() data = self.loop.run_until_complete(f) @@ -62,23 +61,20 @@ def _basetest_open_connection(self, open_connection_fut): def test_open_connection(self): with test_utils.run_test_server() as httpd: - conn_fut = asyncio.open_connection(*httpd.address, - loop=self.loop) + conn_fut = asyncio.open_connection(*httpd.address) self._basetest_open_connection(conn_fut) @socket_helper.skip_unless_bind_unix_socket def test_open_unix_connection(self): with test_utils.run_test_unix_server() as httpd: - conn_fut = asyncio.open_unix_connection(httpd.address, - loop=self.loop) + conn_fut = asyncio.open_unix_connection(httpd.address) self._basetest_open_connection(conn_fut) def _basetest_open_connection_no_loop_ssl(self, open_connection_fut): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) try: - with self.assertWarns(DeprecationWarning): - reader, writer = self.loop.run_until_complete(open_connection_fut) + reader, writer = self.loop.run_until_complete(open_connection_fut) finally: asyncio.set_event_loop(None) writer.write(b'GET / HTTP/1.0\r\n\r\n') @@ -94,8 +90,7 @@ def test_open_connection_no_loop_ssl(self): with test_utils.run_test_server(use_ssl=True) as httpd: conn_fut = asyncio.open_connection( *httpd.address, - ssl=test_utils.dummy_ssl_context(), - loop=self.loop) + ssl=test_utils.dummy_ssl_context()) self._basetest_open_connection_no_loop_ssl(conn_fut) @@ -107,15 +102,14 @@ def test_open_unix_connection_no_loop_ssl(self): httpd.address, ssl=test_utils.dummy_ssl_context(), server_hostname='', - loop=self.loop) + ) self._basetest_open_connection_no_loop_ssl(conn_fut) def _basetest_open_connection_error(self, open_connection_fut): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - with self.assertWarns(DeprecationWarning): - reader, writer = self.loop.run_until_complete(open_connection_fut) + reader, writer = self.loop.run_until_complete(open_connection_fut) writer._protocol.connection_lost(ZeroDivisionError()) f = reader.read() with self.assertRaises(ZeroDivisionError): @@ -126,15 +120,13 @@ def _basetest_open_connection_error(self, open_connection_fut): def test_open_connection_error(self): with test_utils.run_test_server() as httpd: - conn_fut = asyncio.open_connection(*httpd.address, - loop=self.loop) + conn_fut = asyncio.open_connection(*httpd.address) self._basetest_open_connection_error(conn_fut) @socket_helper.skip_unless_bind_unix_socket def test_open_unix_connection_error(self): with test_utils.run_test_unix_server() as httpd: - conn_fut = asyncio.open_unix_connection(httpd.address, - loop=self.loop) + conn_fut = asyncio.open_unix_connection(httpd.address) self._basetest_open_connection_error(conn_fut) def test_feed_empty_data(self): @@ -596,8 +588,7 @@ def start(self): sock = socket.create_server(('127.0.0.1', 0)) self.server = self.loop.run_until_complete( asyncio.start_server(self.handle_client, - sock=sock, - loop=self.loop)) + sock=sock)) return sock.getsockname() def handle_client_callback(self, client_reader, client_writer): @@ -610,8 +601,7 @@ def start_callback(self): sock.close() self.server = self.loop.run_until_complete( asyncio.start_server(self.handle_client_callback, - host=addr[0], port=addr[1], - loop=self.loop)) + host=addr[0], port=addr[1])) return addr def stop(self): @@ -621,9 +611,7 @@ def stop(self): self.server = None async def client(addr): - with self.assertWarns(DeprecationWarning): - reader, writer = await asyncio.open_connection( - *addr, loop=self.loop) + reader, writer = await asyncio.open_connection(*addr) # send a line writer.write(b"hello world!\n") # read it back @@ -637,16 +625,14 @@ async def client(addr): # test the server variant with a coroutine as client handler server = MyServer(self.loop) - with self.assertWarns(DeprecationWarning): - addr = server.start() + addr = server.start() msg = self.loop.run_until_complete(self.loop.create_task(client(addr))) server.stop() self.assertEqual(msg, b"hello world!\n") # test the server variant with a callback as client handler server = MyServer(self.loop) - with self.assertWarns(DeprecationWarning): - addr = server.start_callback() + addr = server.start_callback() msg = self.loop.run_until_complete(self.loop.create_task(client(addr))) server.stop() self.assertEqual(msg, b"hello world!\n") @@ -673,8 +659,7 @@ async def handle_client(self, client_reader, client_writer): def start(self): self.server = self.loop.run_until_complete( asyncio.start_unix_server(self.handle_client, - path=self.path, - loop=self.loop)) + path=self.path)) def handle_client_callback(self, client_reader, client_writer): self.loop.create_task(self.handle_client(client_reader, @@ -682,8 +667,7 @@ def handle_client_callback(self, client_reader, client_writer): def start_callback(self): start = asyncio.start_unix_server(self.handle_client_callback, - path=self.path, - loop=self.loop) + path=self.path) self.server = self.loop.run_until_complete(start) def stop(self): @@ -693,9 +677,7 @@ def stop(self): self.server = None async def client(path): - with self.assertWarns(DeprecationWarning): - reader, writer = await asyncio.open_unix_connection( - path, loop=self.loop) + reader, writer = await asyncio.open_unix_connection(path) # send a line writer.write(b"hello world!\n") # read it back @@ -710,8 +692,7 @@ async def client(path): # test the server variant with a coroutine as client handler with test_utils.unix_socket_path() as path: server = MyServer(self.loop, path) - with self.assertWarns(DeprecationWarning): - server.start() + server.start() msg = self.loop.run_until_complete( self.loop.create_task(client(path))) server.stop() @@ -720,8 +701,7 @@ async def client(path): # test the server variant with a callback as client handler with test_utils.unix_socket_path() as path: server = MyServer(self.loop, path) - with self.assertWarns(DeprecationWarning): - server.start_callback() + server.start_callback() msg = self.loop.run_until_complete( self.loop.create_task(client(path))) server.stop() @@ -809,9 +789,7 @@ def server(): clt.close() async def client(host, port): - with self.assertWarns(DeprecationWarning): - reader, writer = await asyncio.open_connection( - host, port, loop=self.loop) + reader, writer = await asyncio.open_connection(host, port) while True: writer.write(b"foo\n") @@ -895,9 +873,8 @@ def test_LimitOverrunError_pickleable(self): def test_wait_closed_on_close(self): with test_utils.run_test_server() as httpd: - with self.assertWarns(DeprecationWarning): - rd, wr = self.loop.run_until_complete( - asyncio.open_connection(*httpd.address, loop=self.loop)) + rd, wr = self.loop.run_until_complete( + asyncio.open_connection(*httpd.address)) wr.write(b'GET / HTTP/1.0\r\n\r\n') f = rd.readline() @@ -913,9 +890,8 @@ def test_wait_closed_on_close(self): def test_wait_closed_on_close_with_unread_data(self): with test_utils.run_test_server() as httpd: - with self.assertWarns(DeprecationWarning): - rd, wr = self.loop.run_until_complete( - asyncio.open_connection(*httpd.address, loop=self.loop)) + rd, wr = self.loop.run_until_complete( + asyncio.open_connection(*httpd.address)) wr.write(b'GET / HTTP/1.0\r\n\r\n') f = rd.readline() @@ -972,10 +948,8 @@ def test_eof_feed_when_closing_writer(self): self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: - with self.assertWarns(DeprecationWarning): - rd, wr = self.loop.run_until_complete( - asyncio.open_connection(*httpd.address, - loop=self.loop)) + rd, wr = self.loop.run_until_complete( + asyncio.open_connection(*httpd.address)) wr.close() f = wr.wait_closed() diff --git a/Misc/NEWS.d/next/Library/2020-11-25-22-44-59.bpo-42392.T_DAEl.rst b/Misc/NEWS.d/next/Library/2020-11-25-22-44-59.bpo-42392.T_DAEl.rst new file mode 100644 index 00000000000000..35a08dd91e69fd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-25-22-44-59.bpo-42392.T_DAEl.rst @@ -0,0 +1,2 @@ +Remove loop parameter from ``asyncio.open_connection`` and +``asyncio.start_server`` functions. Patch provided by Yurii Karabas. From a581e7a5215780636f2fdec1b8d1610c99bb763f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Gr=C3=B6nholm?= Date: Thu, 26 Nov 2020 12:09:12 +0200 Subject: [PATCH 0656/1261] bpo-41332: Added missing connect_accepted_socket() to AbstractEventLoop (GH-21533) Co-authored-by: Andrew Svetlov Co-authored-by: Kyle Stanley --- Lib/asyncio/base_events.py | 8 -------- Lib/asyncio/events.py | 14 ++++++++++++++ .../2020-07-18-17-39-28.bpo-41332.QRGmA5.rst | 2 ++ 3 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-07-18-17-39-28.bpo-41332.QRGmA5.rst diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index b2d446a51fedb5..d71d6f72bf3c91 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -1525,14 +1525,6 @@ async def connect_accepted_socket( self, protocol_factory, sock, *, ssl=None, ssl_handshake_timeout=None): - """Handle an accepted connection. - - This is used by servers that accept connections outside of - asyncio but that use asyncio to handle connections. - - This method is a coroutine. When completed, the coroutine - returns a (transport, protocol) pair. - """ if sock.type != socket.SOCK_STREAM: raise ValueError(f'A Stream Socket was expected, got {sock!r}') diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 0dce87b8ecc586..1a20f362ec3869 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -418,6 +418,20 @@ async def create_unix_server( """ raise NotImplementedError + async def connect_accepted_socket( + self, protocol_factory, sock, + *, ssl=None, + ssl_handshake_timeout=None): + """Handle an accepted connection. + + This is used by servers that accept connections outside of + asyncio, but use asyncio to handle connections. + + This method is a coroutine. When completed, the coroutine + returns a (transport, protocol) pair. + """ + raise NotImplementedError + async def create_datagram_endpoint(self, protocol_factory, local_addr=None, remote_addr=None, *, family=0, proto=0, flags=0, diff --git a/Misc/NEWS.d/next/Library/2020-07-18-17-39-28.bpo-41332.QRGmA5.rst b/Misc/NEWS.d/next/Library/2020-07-18-17-39-28.bpo-41332.QRGmA5.rst new file mode 100644 index 00000000000000..fa3fb83b9f5e4c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-07-18-17-39-28.bpo-41332.QRGmA5.rst @@ -0,0 +1,2 @@ +Added missing connect_accepted_socket() method to +``asyncio.AbstractEventLoop``. From c99163e3eab3a15d2b77d3fc4fd9125edc3aaec7 Mon Sep 17 00:00:00 2001 From: Shane Harvey Date: Thu, 26 Nov 2020 05:24:48 -0800 Subject: [PATCH 0657/1261] Document optional 'task'/'asyncgen' fields in call_exception_handler (#21735) --- Doc/library/asyncio-eventloop.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index b1e73189a7a4cf..15b5b3fe822ce8 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -1184,10 +1184,13 @@ Allows customizing how exceptions are handled in the event loop. * 'message': Error message; * 'exception' (optional): Exception object; * 'future' (optional): :class:`asyncio.Future` instance; + * 'task' (optional): :class:`asyncio.Task` instance; * 'handle' (optional): :class:`asyncio.Handle` instance; * 'protocol' (optional): :ref:`Protocol ` instance; * 'transport' (optional): :ref:`Transport ` instance; - * 'socket' (optional): :class:`socket.socket` instance. + * 'socket' (optional): :class:`socket.socket` instance; + * 'asyncgen' (optional): Asynchronous generator that caused + the exception. .. note:: From f6e0a106f76938070d8fa05e36df28aed9095c1b Mon Sep 17 00:00:00 2001 From: Volker-Weissmann <39418860+Volker-Weissmann@users.noreply.github.com> Date: Fri, 27 Nov 2020 01:41:32 +0100 Subject: [PATCH 0658/1261] bpo-17852: Doc: Fix the tutorial about closing files (GH-23135) Co-authored-by: Inada Naoki --- Doc/tutorial/inputoutput.rst | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index 366a532e817afa..4e27cff83ce59f 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -329,11 +329,16 @@ equivalent :keyword:`try`\ -\ :keyword:`finally` blocks:: If you're not using the :keyword:`with` keyword, then you should call ``f.close()`` to close the file and immediately free up any system -resources used by it. If you don't explicitly close a file, Python's -garbage collector will eventually destroy the object and close the -open file for you, but the file may stay open for a while. Another -risk is that different Python implementations will do this clean-up at -different times. +resources used by it. + +.. warning:: + Calling ``f.write()`` without using the :keyword:`!with` keyword or calling + ``f.close()`` **might** result in the arguments + of ``f.write()`` not being completely written to the disk, even if the + program exits successfully. + +.. + See also https://bugs.python.org/issue17852 After a file object is closed, either by a :keyword:`with` statement or by calling ``f.close()``, attempts to use the file object will From a571483006c7314ee4f2818b78893260ce2a4c5f Mon Sep 17 00:00:00 2001 From: Soumendra Ganguly <67527439+8vasu@users.noreply.github.com> Date: Fri, 27 Nov 2020 04:16:41 -0600 Subject: [PATCH 0659/1261] bpo-41818: Make test_openpty() avoid unexpected success due to number of rows and/or number of columns being == 0. (GH-23526) --- Lib/test/test_pty.py | 29 +++++++------------ .../2020-11-27-09-19-43.bpo-41818.KWYUbL.rst | 1 + 2 files changed, 11 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-27-09-19-43.bpo-41818.KWYUbL.rst diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index 138560e0309ab0..a45be284a95440 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -5,7 +5,6 @@ import_module('termios') import errno -import pathlib import pty import os import sys @@ -75,20 +74,7 @@ def _readline(fd): return reader.readline() def expectedFailureIfStdinIsTTY(fun): - # avoid isatty() for now - PLATFORM = platform.system() - if PLATFORM == "Linux": - os_release = pathlib.Path("/etc/os-release") - if os_release.exists(): - # Actually the file has complex multi-line structure, - # these is no need to parse it for Gentoo check - if 'gentoo' in os_release.read_text().lower(): - # bpo-41818: - # Gentoo passes the test, - # all other tested Linux distributions fail. - # Should not apply @unittest.expectedFailure() on Gentoo - # to keep the buildbot fleet happy. - return fun + # avoid isatty() try: tty.tcgetattr(pty.STDIN_FILENO) return unittest.expectedFailure(fun) @@ -165,11 +151,16 @@ def test_openpty(self): new_stdin_winsz = None if self.stdin_rows != None and self.stdin_cols != None: try: + # Modify pty.STDIN_FILENO window size; we need to + # check if pty.openpty() is able to set pty slave + # window size accordingly. debug("Setting pty.STDIN_FILENO window size") - # Set number of columns and rows to be the - # floors of 1/5 of respective original values - target_stdin_winsz = struct.pack("HHHH", self.stdin_rows//5, - self.stdin_cols//5, 0, 0) + debug(f"original size: (rows={self.stdin_rows}, cols={self.stdin_cols})") + target_stdin_rows = self.stdin_rows + 1 + target_stdin_cols = self.stdin_cols + 1 + debug(f"target size: (rows={target_stdin_rows}, cols={target_stdin_cols})") + target_stdin_winsz = struct.pack("HHHH", target_stdin_rows, + target_stdin_cols, 0, 0) _set_term_winsz(pty.STDIN_FILENO, target_stdin_winsz) # Were we able to set the window size diff --git a/Misc/NEWS.d/next/Library/2020-11-27-09-19-43.bpo-41818.KWYUbL.rst b/Misc/NEWS.d/next/Library/2020-11-27-09-19-43.bpo-41818.KWYUbL.rst new file mode 100644 index 00000000000000..56cdc9a7dab548 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-27-09-19-43.bpo-41818.KWYUbL.rst @@ -0,0 +1 @@ +Make test_openpty() avoid unexpected success due to number of rows and/or number of columns being == 0. \ No newline at end of file From d337115472a878f57b8b86a2d47709313916f83d Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Fri, 27 Nov 2020 16:38:54 +0000 Subject: [PATCH 0660/1261] bpo-42474: test TracebackException comparison to non-equal instances (GH-23522) Closes bpo-42474 --- Lib/test/test_traceback.py | 41 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 91688ff72bbea1..f86afc673d86e7 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -1123,7 +1123,7 @@ def test_context(self): self.assertEqual(exc_info[0], exc.exc_type) self.assertEqual(str(exc_info[1]), str(exc)) - def test_comparison(self): + def test_comparison_basic(self): try: 1/0 except Exception: @@ -1135,6 +1135,43 @@ def test_comparison(self): self.assertNotEqual(exc, object()) self.assertEqual(exc, ALWAYS_EQ) + def test_comparison_params_variations(self): + def raise_exc(): + try: + raise ValueError('bad value') + except: + raise + + def raise_with_locals(): + x, y = 1, 2 + raise_exc() + + try: + raise_with_locals() + except Exception: + exc_info = sys.exc_info() + + exc = traceback.TracebackException(*exc_info) + exc1 = traceback.TracebackException(*exc_info, limit=10) + exc2 = traceback.TracebackException(*exc_info, limit=2) + + self.assertEqual(exc, exc1) # limit=10 gets all frames + self.assertNotEqual(exc, exc2) # limit=2 truncates the output + + # locals change the output + exc3 = traceback.TracebackException(*exc_info, capture_locals=True) + self.assertNotEqual(exc, exc3) + + # there are no locals in the innermost frame + exc4 = traceback.TracebackException(*exc_info, limit=-1) + exc5 = traceback.TracebackException(*exc_info, limit=-1, capture_locals=True) + self.assertEqual(exc4, exc5) + + # there are locals in the next-to-innermost frame + exc6 = traceback.TracebackException(*exc_info, limit=-2) + exc7 = traceback.TracebackException(*exc_info, limit=-2, capture_locals=True) + self.assertNotEqual(exc6, exc7) + def test_unhashable(self): class UnhashableException(Exception): def __eq__(self, other): @@ -1176,7 +1213,7 @@ def test_lookup_lines(self): f = test_frame(c, None, None) tb = test_tb(f, 6, None) exc = traceback.TracebackException(Exception, e, tb, lookup_lines=False) - self.assertEqual({}, linecache.cache) + self.assertEqual(linecache.cache, {}) linecache.updatecache('/foo.py', globals()) self.assertEqual(exc.stack[0].line, "import sys") From ba5ebee579fc06e2ff72ada9b067e74611a5d716 Mon Sep 17 00:00:00 2001 From: Julien Jerphanion Date: Sat, 28 Nov 2020 07:11:19 +0000 Subject: [PATCH 0661/1261] bpo-42452: Improve colorsys.rgb_to_hls code (GH-23306) Cache repeated sum and difference to make code slightly faster and easier to read. --- Lib/colorsys.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Lib/colorsys.py b/Lib/colorsys.py index b93e3844067e4e..0f52512a67d87c 100644 --- a/Lib/colorsys.py +++ b/Lib/colorsys.py @@ -75,17 +75,18 @@ def yiq_to_rgb(y, i, q): def rgb_to_hls(r, g, b): maxc = max(r, g, b) minc = min(r, g, b) - # XXX Can optimize (maxc+minc) and (maxc-minc) - l = (minc+maxc)/2.0 + sumc = (maxc+minc) + rangec = (maxc-minc) + l = sumc/2.0 if minc == maxc: return 0.0, l, 0.0 if l <= 0.5: - s = (maxc-minc) / (maxc+minc) + s = rangec / sumc else: - s = (maxc-minc) / (2.0-maxc-minc) - rc = (maxc-r) / (maxc-minc) - gc = (maxc-g) / (maxc-minc) - bc = (maxc-b) / (maxc-minc) + s = rangec / (2.0-sumc) + rc = (maxc-r) / rangec + gc = (maxc-g) / rangec + bc = (maxc-b) / rangec if r == maxc: h = bc-gc elif g == maxc: From 92c9af68b9ce4a09d79bd46b59f488aa0020b7b3 Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Sat, 28 Nov 2020 10:21:17 +0200 Subject: [PATCH 0662/1261] bpo-42392: Remove loop parameter from asyncio.tasks and asyncio.subprocess (GH-23521) --- Lib/asyncio/base_events.py | 9 +- Lib/asyncio/runners.py | 3 +- Lib/asyncio/subprocess.py | 30 ++---- Lib/asyncio/tasks.py | 55 +++-------- Lib/asyncio/unix_events.py | 2 +- Lib/test/test_asyncio/test_queues.py | 8 +- Lib/test/test_asyncio/test_subprocess.py | 20 ---- Lib/test/test_asyncio/test_tasks.py | 95 +++++++------------ .../2020-11-26-12-40-16.bpo-42392.GbmdHE.rst | 2 + 9 files changed, 66 insertions(+), 158 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-26-12-40-16.bpo-42392.GbmdHE.rst diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index d71d6f72bf3c91..f789635e0f893a 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -350,7 +350,7 @@ async def start_serving(self): self._start_serving() # Skip one loop iteration so that all 'loop.add_reader' # go through. - await tasks.sleep(0, loop=self._loop) + await tasks.sleep(0) async def serve_forever(self): if self._serving_forever_fut is not None: @@ -541,8 +541,7 @@ async def shutdown_asyncgens(self): results = await tasks.gather( *[ag.aclose() for ag in closing_agens], - return_exceptions=True, - loop=self) + return_exceptions=True) for result, agen in zip(results, closing_agens): if isinstance(result, Exception): @@ -1457,7 +1456,7 @@ async def create_server( fs = [self._create_server_getaddrinfo(host, port, family=family, flags=flags) for host in hosts] - infos = await tasks.gather(*fs, loop=self) + infos = await tasks.gather(*fs) infos = set(itertools.chain.from_iterable(infos)) completed = False @@ -1515,7 +1514,7 @@ async def create_server( server._start_serving() # Skip one loop iteration so that all 'loop.add_reader' # go through. - await tasks.sleep(0, loop=self) + await tasks.sleep(0) if self._debug: logger.info("%r is serving", server) diff --git a/Lib/asyncio/runners.py b/Lib/asyncio/runners.py index 268635d68fb0c0..9a5e9a48479ef7 100644 --- a/Lib/asyncio/runners.py +++ b/Lib/asyncio/runners.py @@ -60,8 +60,7 @@ def _cancel_all_tasks(loop): for task in to_cancel: task.cancel() - loop.run_until_complete( - tasks.gather(*to_cancel, loop=loop, return_exceptions=True)) + loop.run_until_complete(tasks.gather(*to_cancel, return_exceptions=True)) for task in to_cancel: if task.cancelled(): diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index c9506b158302b5..cd10231f710f11 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -1,7 +1,6 @@ __all__ = 'create_subprocess_exec', 'create_subprocess_shell' import subprocess -import warnings from . import events from . import protocols @@ -193,24 +192,14 @@ async def communicate(self, input=None): stderr = self._read_stream(2) else: stderr = self._noop() - stdin, stdout, stderr = await tasks.gather(stdin, stdout, stderr, - loop=self._loop) + stdin, stdout, stderr = await tasks.gather(stdin, stdout, stderr) await self.wait() return (stdout, stderr) async def create_subprocess_shell(cmd, stdin=None, stdout=None, stderr=None, - loop=None, limit=streams._DEFAULT_LIMIT, - **kwds): - if loop is None: - loop = events.get_event_loop() - else: - warnings.warn("The loop argument is deprecated since Python 3.8 " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, - stacklevel=2 - ) - + limit=streams._DEFAULT_LIMIT, **kwds): + loop = events.get_running_loop() protocol_factory = lambda: SubprocessStreamProtocol(limit=limit, loop=loop) transport, protocol = await loop.subprocess_shell( @@ -221,16 +210,9 @@ async def create_subprocess_shell(cmd, stdin=None, stdout=None, stderr=None, async def create_subprocess_exec(program, *args, stdin=None, stdout=None, - stderr=None, loop=None, - limit=streams._DEFAULT_LIMIT, **kwds): - if loop is None: - loop = events.get_event_loop() - else: - warnings.warn("The loop argument is deprecated since Python 3.8 " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, - stacklevel=2 - ) + stderr=None, limit=streams._DEFAULT_LIMIT, + **kwds): + loop = events.get_running_loop() protocol_factory = lambda: SubprocessStreamProtocol(limit=limit, loop=loop) transport, protocol = await loop.subprocess_exec( diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 03d8451fa1744a..eef7f8808eb06f 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -370,7 +370,7 @@ def create_task(coro, *, name=None): ALL_COMPLETED = concurrent.futures.ALL_COMPLETED -async def wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED): +async def wait(fs, *, timeout=None, return_when=ALL_COMPLETED): """Wait for the Futures and coroutines given by fs to complete. The fs iterable must not be empty. @@ -393,12 +393,7 @@ async def wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED): if return_when not in (FIRST_COMPLETED, FIRST_EXCEPTION, ALL_COMPLETED): raise ValueError(f'Invalid return_when value: {return_when}') - if loop is None: - loop = events.get_running_loop() - else: - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) + loop = events.get_running_loop() fs = set(fs) @@ -418,7 +413,7 @@ def _release_waiter(waiter, *args): waiter.set_result(None) -async def wait_for(fut, timeout, *, loop=None): +async def wait_for(fut, timeout): """Wait for the single Future or coroutine to complete, with timeout. Coroutine will be wrapped in Task. @@ -431,12 +426,7 @@ async def wait_for(fut, timeout, *, loop=None): This function is a coroutine. """ - if loop is None: - loop = events.get_running_loop() - else: - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) + loop = events.get_running_loop() if timeout is None: return await fut @@ -556,7 +546,7 @@ async def _cancel_and_wait(fut, loop): # This is *not* a @coroutine! It is just an iterator (yielding Futures). -def as_completed(fs, *, loop=None, timeout=None): +def as_completed(fs, *, timeout=None): """Return an iterator whose values are coroutines. When waiting for the yielded coroutines you'll get the results (or @@ -580,12 +570,7 @@ def as_completed(fs, *, loop=None, timeout=None): from .queues import Queue # Import here to avoid circular import problem. done = Queue() - if loop is None: - loop = events.get_event_loop() - else: - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) + loop = events.get_event_loop() todo = {ensure_future(f, loop=loop) for f in set(fs)} timeout_handle = None @@ -630,19 +615,13 @@ def __sleep0(): yield -async def sleep(delay, result=None, *, loop=None): +async def sleep(delay, result=None): """Coroutine that completes after a given time (in seconds).""" if delay <= 0: await __sleep0() return result - if loop is None: - loop = events.get_running_loop() - else: - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) - + loop = events.get_running_loop() future = loop.create_future() h = loop.call_later(delay, futures._set_result_unless_cancelled, @@ -717,7 +696,7 @@ def cancel(self, msg=None): return ret -def gather(*coros_or_futures, loop=None, return_exceptions=False): +def gather(*coros_or_futures, return_exceptions=False): """Return a future aggregating results from the given coroutines/futures. Coroutines will be wrapped in a future and scheduled in the event @@ -748,12 +727,7 @@ def gather(*coros_or_futures, loop=None, return_exceptions=False): gather won't cancel any other awaitables. """ if not coros_or_futures: - if loop is None: - loop = events.get_event_loop() - else: - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) + loop = events.get_event_loop() outer = loop.create_future() outer.set_result([]) return outer @@ -817,6 +791,7 @@ def _done_callback(fut): children = [] nfuts = 0 nfinished = 0 + loop = None for arg in coros_or_futures: if arg not in arg_to_fut: fut = ensure_future(arg, loop=loop) @@ -843,7 +818,7 @@ def _done_callback(fut): return outer -def shield(arg, *, loop=None): +def shield(arg): """Wait for a future, shielding it from cancellation. The statement @@ -869,11 +844,7 @@ def shield(arg, *, loop=None): except CancelledError: res = None """ - if loop is not None: - warnings.warn("The loop argument is deprecated since Python 3.8, " - "and scheduled for removal in Python 3.10.", - DeprecationWarning, stacklevel=2) - inner = ensure_future(arg, loop=loop) + inner = ensure_future(arg) if inner.done(): # Shortcut. return inner diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index f34a5b4b443736..1b57e34563eea9 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -323,7 +323,7 @@ async def create_unix_server( server._start_serving() # Skip one loop iteration so that all 'loop.add_reader' # go through. - await tasks.sleep(0, loop=self) + await tasks.sleep(0) return server diff --git a/Lib/test/test_asyncio/test_queues.py b/Lib/test/test_asyncio/test_queues.py index dc97673b6f1945..0a0b529f621b26 100644 --- a/Lib/test/test_asyncio/test_queues.py +++ b/Lib/test/test_asyncio/test_queues.py @@ -255,6 +255,7 @@ def test_get_with_waiting_putters(self): def test_why_are_getters_waiting(self): # From issue #268. + asyncio.set_event_loop(self.loop) async def consumer(queue, num_expected): for _ in range(num_expected): @@ -276,8 +277,7 @@ async def create_queue(): self.loop.run_until_complete( asyncio.gather(producer(q, producer_num_items), - consumer(q, producer_num_items), - loop=self.loop), + consumer(q, producer_num_items)), ) def test_cancelled_getters_not_being_held_in_self_getters(self): @@ -498,6 +498,7 @@ def test_put_with_waiting_getters(self): def test_why_are_putters_waiting(self): # From issue #265. + asyncio.set_event_loop(self.loop) async def create_queue(): q = asyncio.Queue(2) @@ -519,8 +520,7 @@ async def getter(): t1 = putter(1) t2 = putter(2) t3 = putter(3) - self.loop.run_until_complete( - asyncio.gather(getter(), t0, t1, t2, t3, loop=self.loop)) + self.loop.run_until_complete(asyncio.gather(getter(), t0, t1, t2, t3)) def test_cancelled_puts_not_being_held_in_self_putters(self): def a_generator(): diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index 177a02cdcc1744..225a3babc844b8 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -635,26 +635,6 @@ async def execute(): self.assertIsNone(self.loop.run_until_complete(execute())) - def test_exec_loop_deprecated(self): - async def go(): - with self.assertWarns(DeprecationWarning): - proc = await asyncio.create_subprocess_exec( - sys.executable, '-c', 'pass', - loop=self.loop, - ) - await proc.wait() - self.loop.run_until_complete(go()) - - def test_shell_loop_deprecated(self): - async def go(): - with self.assertWarns(DeprecationWarning): - proc = await asyncio.create_subprocess_shell( - "exit 0", - loop=self.loop, - ) - await proc.wait() - self.loop.run_until_complete(go()) - if sys.platform != 'win32': # Unix diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 01f62b7f408726..7c2e85ceefde13 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -155,7 +155,7 @@ async def run(): self.loop.run_until_complete( asyncio.gather(*[ self.new_task(self.loop, run()) for _ in range(100) - ], loop=self.loop)) + ])) def test_other_loop_future(self): other_loop = asyncio.new_event_loop() @@ -1603,19 +1603,18 @@ def sleeper(dt, x): async def foo(): values = [] - for f in asyncio.as_completed([b, c, a], loop=loop): + for f in asyncio.as_completed([b, c, a]): values.append(await f) return values - with self.assertWarns(DeprecationWarning): - res = loop.run_until_complete(self.new_task(loop, foo())) + + res = loop.run_until_complete(self.new_task(loop, foo())) self.assertAlmostEqual(0.15, loop.time()) self.assertTrue('a' in res[:2]) self.assertTrue('b' in res[:2]) self.assertEqual(res[2], 'c') # Doing it again should take no time and exercise a different path. - with self.assertWarns(DeprecationWarning): - res = loop.run_until_complete(self.new_task(loop, foo())) + res = loop.run_until_complete(self.new_task(loop, foo())) self.assertAlmostEqual(0.15, loop.time()) def test_as_completed_with_timeout(self): @@ -1633,7 +1632,7 @@ def gen(): async def foo(): values = [] - for f in asyncio.as_completed([a, b], timeout=0.12, loop=loop): + for f in asyncio.as_completed([a, b], timeout=0.12): if values: loop.advance_time(0.02) try: @@ -1643,8 +1642,7 @@ async def foo(): values.append((2, exc)) return values - with self.assertWarns(DeprecationWarning): - res = loop.run_until_complete(self.new_task(loop, foo())) + res = loop.run_until_complete(self.new_task(loop, foo())) self.assertEqual(len(res), 2, res) self.assertEqual(res[0], (1, 'a')) self.assertEqual(res[1][0], 2) @@ -1667,12 +1665,11 @@ def gen(): a = asyncio.sleep(0.01, 'a') async def foo(): - for f in asyncio.as_completed([a], timeout=1, loop=loop): + for f in asyncio.as_completed([a], timeout=1): v = await f self.assertEqual(v, 'a') - with self.assertWarns(DeprecationWarning): - loop.run_until_complete(self.new_task(loop, foo())) + loop.run_until_complete(self.new_task(loop, foo())) def test_as_completed_reverse_wait(self): @@ -1682,13 +1679,13 @@ def gen(): yield 0 loop = self.new_test_loop(gen) + asyncio.set_event_loop(loop) a = asyncio.sleep(0.05, 'a') b = asyncio.sleep(0.10, 'b') fs = {a, b} - with self.assertWarns(DeprecationWarning): - futs = list(asyncio.as_completed(fs, loop=loop)) + futs = list(asyncio.as_completed(fs)) self.assertEqual(len(futs), 2) x = loop.run_until_complete(futs[1]) @@ -1709,12 +1706,13 @@ def gen(): yield 0.05 loop = self.new_test_loop(gen) + asyncio.set_event_loop(loop) a = asyncio.sleep(0.05, 'a') b = asyncio.sleep(0.05, 'b') fs = {a, b} - with self.assertWarns(DeprecationWarning): - futs = list(asyncio.as_completed(fs, loop=loop)) + + futs = list(asyncio.as_completed(fs)) self.assertEqual(len(futs), 2) waiter = asyncio.wait(futs) # Deprecation from passing coros in futs to asyncio.wait() @@ -1734,14 +1732,12 @@ def coro(s): def runner(): result = [] c = coro('ham') - for f in asyncio.as_completed([c, c, coro('spam')], - loop=self.loop): + for f in asyncio.as_completed([c, c, coro('spam')]): result.append((yield from f)) return result - with self.assertWarns(DeprecationWarning): - fut = self.new_task(self.loop, runner()) - self.loop.run_until_complete(fut) + fut = self.new_task(self.loop, runner()) + self.loop.run_until_complete(fut) result = fut.result() self.assertEqual(set(result), {'ham', 'spam'}) self.assertEqual(len(result), 2) @@ -2018,7 +2014,7 @@ def test_current_task(self): self.assertIsNone(asyncio.current_task(loop=self.loop)) async def coro(loop): - self.assertIs(asyncio.current_task(loop=loop), task) + self.assertIs(asyncio.current_task(), task) self.assertIs(asyncio.current_task(None), task) self.assertIs(asyncio.current_task(), task) @@ -2034,16 +2030,16 @@ def test_current_task_with_interleaving_tasks(self): fut2 = self.new_future(self.loop) async def coro1(loop): - self.assertTrue(asyncio.current_task(loop=loop) is task1) + self.assertTrue(asyncio.current_task() is task1) await fut1 - self.assertTrue(asyncio.current_task(loop=loop) is task1) + self.assertTrue(asyncio.current_task() is task1) fut2.set_result(True) async def coro2(loop): - self.assertTrue(asyncio.current_task(loop=loop) is task2) + self.assertTrue(asyncio.current_task() is task2) fut1.set_result(True) await fut2 - self.assertTrue(asyncio.current_task(loop=loop) is task2) + self.assertTrue(asyncio.current_task() is task2) task1 = self.new_task(self.loop, coro1(self.loop)) task2 = self.new_task(self.loop, coro2(self.loop)) @@ -2210,10 +2206,10 @@ def test_as_completed_invalid_args(self): # as_completed() expects a list of futures, not a future instance self.assertRaises(TypeError, self.loop.run_until_complete, - asyncio.as_completed(fut, loop=self.loop)) + asyncio.as_completed(fut)) coro = coroutine_function() self.assertRaises(TypeError, self.loop.run_until_complete, - asyncio.as_completed(coro, loop=self.loop)) + asyncio.as_completed(coro)) coro.close() def test_wait_invalid_args(self): @@ -2511,6 +2507,7 @@ def test_cancel_gather_1(self): """Ensure that a gathering future refuses to be cancelled once all children are done""" loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) self.addCleanup(loop.close) fut = self.new_future(loop) @@ -2518,7 +2515,7 @@ def test_cancel_gather_1(self): # gathering task is done at the same time as the child future def child_coro(): return (yield from fut) - gather_future = asyncio.gather(child_coro(), loop=loop) + gather_future = asyncio.gather(child_coro()) gather_task = asyncio.ensure_future(gather_future, loop=loop) cancel_result = None @@ -2555,8 +2552,7 @@ async def test(): while True: time += 0.05 await asyncio.gather(asyncio.sleep(0.05), - return_exceptions=True, - loop=loop) + return_exceptions=True) if time > 1: return @@ -2771,7 +2767,7 @@ async def main(): task = loop.create_task(sub(random.randint(0, 10))) tasks.append(task) - await asyncio.gather(*tasks, loop=loop) + await asyncio.gather(*tasks) loop = asyncio.new_event_loop() try: @@ -3328,9 +3324,6 @@ def _check_empty_sequence(self, seq_or_iter): self._run_loop(self.one_loop) self.assertTrue(fut.done()) self.assertEqual(fut.result(), []) - with self.assertWarns(DeprecationWarning): - fut = asyncio.gather(*seq_or_iter, loop=self.other_loop) - self.assertIs(fut._loop, self.other_loop) def test_constructor_empty_sequence(self): self._check_empty_sequence([]) @@ -3343,8 +3336,6 @@ def test_constructor_heterogenous_futures(self): fut2 = self.other_loop.create_future() with self.assertRaises(ValueError): asyncio.gather(fut1, fut2) - with self.assertRaises(ValueError): - asyncio.gather(fut1, loop=self.other_loop) def test_constructor_homogenous_futures(self): children = [self.other_loop.create_future() for i in range(3)] @@ -3352,7 +3343,7 @@ def test_constructor_homogenous_futures(self): self.assertIs(fut._loop, self.other_loop) self._run_loop(self.other_loop) self.assertFalse(fut.done()) - fut = asyncio.gather(*children, loop=self.other_loop) + fut = asyncio.gather(*children) self.assertIs(fut._loop, self.other_loop) self._run_loop(self.other_loop) self.assertFalse(fut.done()) @@ -3423,9 +3414,10 @@ async def coro(): self.one_loop.run_until_complete(fut) self.set_event_loop(self.other_loop, cleanup=False) + asyncio.set_event_loop(self.other_loop) gen3 = coro() gen4 = coro() - fut2 = asyncio.gather(gen3, gen4, loop=self.other_loop) + fut2 = asyncio.gather(gen3, gen4) self.assertIs(fut2._loop, self.other_loop) self.other_loop.run_until_complete(fut2) @@ -3435,7 +3427,7 @@ def test_duplicate_coroutines(self): def coro(s): return s c = coro('abc') - fut = asyncio.gather(c, c, coro('def'), c, loop=self.one_loop) + fut = asyncio.gather(c, c, coro('def'), c) self._run_loop(self.one_loop) self.assertEqual(fut.result(), ['abc', 'abc', 'def', 'abc']) @@ -3455,7 +3447,7 @@ async def inner(): async def outer(): nonlocal proof, gatherer - gatherer = asyncio.gather(child1, child2, loop=self.one_loop) + gatherer = asyncio.gather(child1, child2) await gatherer proof += 100 @@ -3482,7 +3474,7 @@ async def inner(f): b = self.one_loop.create_future() async def outer(): - await asyncio.gather(inner(a), inner(b), loop=self.one_loop) + await asyncio.gather(inner(a), inner(b)) f = asyncio.ensure_future(outer(), loop=self.one_loop) test_utils.run_briefly(self.one_loop) @@ -3621,11 +3613,6 @@ async def coro(): self.loop.run_until_complete(coro()) self.assertEqual(result, 11) - def test_loop_argument_is_deprecated(self): - # Remove test when loop argument is removed in Python 3.10 - with self.assertWarns(DeprecationWarning): - self.loop.run_until_complete(asyncio.sleep(0.01, loop=self.loop)) - class WaitTests(test_utils.TestCase): def setUp(self): @@ -3638,18 +3625,6 @@ def tearDown(self): self.loop = None super().tearDown() - def test_loop_argument_is_deprecated_in_wait(self): - # Remove test when loop argument is removed in Python 3.10 - with self.assertWarns(DeprecationWarning): - self.loop.run_until_complete( - asyncio.wait([coroutine_function()], loop=self.loop)) - - def test_loop_argument_is_deprecated_in_wait_for(self): - # Remove test when loop argument is removed in Python 3.10 - with self.assertWarns(DeprecationWarning): - self.loop.run_until_complete( - asyncio.wait_for(coroutine_function(), 0.01, loop=self.loop)) - def test_coro_is_deprecated_in_wait(self): # Remove test when passing coros to asyncio.wait() is removed in 3.11 with self.assertWarns(DeprecationWarning): @@ -3701,7 +3676,7 @@ def coro2(): return 'ok2' async def inner(): - return await asyncio.gather(coro1(), coro2(), loop=self.loop) + return await asyncio.gather(coro1(), coro2()) result = self.loop.run_until_complete(inner()) self.assertEqual(['ok1', 'ok2'], result) diff --git a/Misc/NEWS.d/next/Library/2020-11-26-12-40-16.bpo-42392.GbmdHE.rst b/Misc/NEWS.d/next/Library/2020-11-26-12-40-16.bpo-42392.GbmdHE.rst new file mode 100644 index 00000000000000..660e6dddc7e8af --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-26-12-40-16.bpo-42392.GbmdHE.rst @@ -0,0 +1,2 @@ +Remove loop parameter from ``asyncio.subprocess`` and ``asyncio.tasks`` +functions. Patch provided by Yurii Karabas. From 8b9bf0e4d7ef54060061dc3bc12a910a4d24c53b Mon Sep 17 00:00:00 2001 From: Wansoo Kim Date: Sat, 28 Nov 2020 20:37:08 +0900 Subject: [PATCH 0663/1261] bpo-41241: Unnecessary Type casting in 'if condition' (GH-21396) This is my first issue! So, if there's anything wrong, please tell me! Also, thank you always for all the contributors! Automerge-Triggered-By: GH:asvetlov --- Lib/asyncio/futures.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index bed4da52fd4d98..2d22ef66c9c426 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -115,7 +115,7 @@ def _log_traceback(self): @_log_traceback.setter def _log_traceback(self, val): - if bool(val): + if val: raise ValueError('_log_traceback can only be set to False') self.__log_traceback = False From d6e2fcd102a13fe22e4d68a4be59df245b7079bc Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sat, 28 Nov 2020 07:27:28 -0700 Subject: [PATCH 0664/1261] bpo-34215: Clarify IncompleteReadError message when "expected" is None (GH-21925) Co-Authored-By: Tyler Bell --- Lib/asyncio/exceptions.py | 3 ++- Lib/test/test_asyncio/test_streams.py | 8 +++++--- .../next/Library/2020-08-19-20-17-51.bpo-34215._Cv8c-.rst | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-08-19-20-17-51.bpo-34215._Cv8c-.rst diff --git a/Lib/asyncio/exceptions.py b/Lib/asyncio/exceptions.py index e03602ef576234..f07e4486577381 100644 --- a/Lib/asyncio/exceptions.py +++ b/Lib/asyncio/exceptions.py @@ -34,8 +34,9 @@ class IncompleteReadError(EOFError): - expected: total number of expected bytes (or None if unknown) """ def __init__(self, partial, expected): + r_expected = 'undefined' if expected is None else repr(expected) super().__init__(f'{len(partial)} bytes read on a total of ' - f'{expected!r} expected bytes') + f'{r_expected} expected bytes') self.partial = partial self.expected = expected diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index a6cfcbfb57b361..aa3977977588e7 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -444,12 +444,14 @@ def test_readuntil_multi_chunks_1(self): def test_readuntil_eof(self): stream = asyncio.StreamReader(loop=self.loop) - stream.feed_data(b'some dataAA') + data = b'some dataAA' + stream.feed_data(data) stream.feed_eof() - with self.assertRaises(asyncio.IncompleteReadError) as cm: + with self.assertRaisesRegex(asyncio.IncompleteReadError, + 'undefined expected bytes') as cm: self.loop.run_until_complete(stream.readuntil(b'AAA')) - self.assertEqual(cm.exception.partial, b'some dataAA') + self.assertEqual(cm.exception.partial, data) self.assertIsNone(cm.exception.expected) self.assertEqual(b'', stream._buffer) diff --git a/Misc/NEWS.d/next/Library/2020-08-19-20-17-51.bpo-34215._Cv8c-.rst b/Misc/NEWS.d/next/Library/2020-08-19-20-17-51.bpo-34215._Cv8c-.rst new file mode 100644 index 00000000000000..4d91678948f40a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-19-20-17-51.bpo-34215._Cv8c-.rst @@ -0,0 +1,2 @@ +Clarify the error message for :exc:`asyncio.IncompleteReadError` when +``expected`` is ``None``. From 7fc4e17378e8dbb3dadb4cdefd0178bcf76d7066 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sat, 28 Nov 2020 07:53:39 -0700 Subject: [PATCH 0665/1261] bpo-42489: Fix the signature for list.sort() in the tutorial (GH-23538) --- Doc/tutorial/datastructures.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index ff4c797f66cd63..5c6b65f05e1e5f 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -78,7 +78,7 @@ objects: Return the number of times *x* appears in the list. -.. method:: list.sort(key=None, reverse=False) +.. method:: list.sort(*, key=None, reverse=False) :noindex: Sort the items of the list in place (the arguments can be used for sort From c485fbeb5c88e7f1d6c51dc45fd04e6d4d4ae700 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Sun, 29 Nov 2020 04:21:30 +0800 Subject: [PATCH 0666/1261] bpo-31904: Fix test_os.test_getcwd_long_path() failure for VxWorks (GH-20256) --- Lib/test/test_os.py | 4 ++++ .../next/Tests/2020-05-20-17-28-46.bpo-31904.yt83Ge.rst | 1 + 2 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2020-05-20-17-28-46.bpo-31904.yt83Ge.rst diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index f127cb199bbb5c..dbb2975c0eee49 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -116,6 +116,10 @@ def test_getcwd_long_path(self): # than MAX_PATH if long paths support is disabled: # see RtlAreLongPathsEnabled(). min_len = 2000 # characters + # On VxWorks, PATH_MAX is defined as 1024 bytes. Creating a path + # longer than PATH_MAX will fail. + if sys.platform == 'vxworks': + min_len = 1000 dirlen = 200 # characters dirname = 'python_test_dir_' dirname = dirname + ('a' * (dirlen - len(dirname))) diff --git a/Misc/NEWS.d/next/Tests/2020-05-20-17-28-46.bpo-31904.yt83Ge.rst b/Misc/NEWS.d/next/Tests/2020-05-20-17-28-46.bpo-31904.yt83Ge.rst new file mode 100644 index 00000000000000..1679801a111066 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-05-20-17-28-46.bpo-31904.yt83Ge.rst @@ -0,0 +1 @@ +Fix os module failures for VxWorks RTOS. From 1779aa34a2397a559e1733799b7e44384e1132ce Mon Sep 17 00:00:00 2001 From: Soumendra Ganguly <67527439+8vasu@users.noreply.github.com> Date: Sat, 28 Nov 2020 15:04:20 -0600 Subject: [PATCH 0667/1261] bpo-41818: Fix test_master_read() so that it succeeds on all platforms that either raise OSError or return b"" upon reading from master (GH-23536) Signed-off-by: Soumendra Ganguly --- Lib/test/test_pty.py | 15 +++++---------- .../2020-11-28-06-34-53.bpo-41818.mFSMc2.rst | 1 + 2 files changed, 6 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-28-06-34-53.bpo-41818.mFSMc2.rst diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index a45be284a95440..190d8d787a2cc9 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -17,7 +17,6 @@ import struct import tty import fcntl -import platform import warnings TEST_STRING_1 = b"I wish to buy a fish license.\n" @@ -82,12 +81,6 @@ def expectedFailureIfStdinIsTTY(fun): pass return fun -def expectedFailureOnBSD(fun): - PLATFORM = platform.system() - if PLATFORM.endswith("BSD") or PLATFORM == "Darwin": - return unittest.expectedFailure(fun) - return fun - def _get_term_winsz(fd): s = struct.pack("HHHH", 0, 0, 0, 0) return fcntl.ioctl(fd, _TIOCGWINSZ, s) @@ -314,7 +307,6 @@ def test_fork(self): os.close(master_fd) - @expectedFailureOnBSD def test_master_read(self): debug("Calling pty.openpty()") master_fd, slave_fd = pty.openpty() @@ -324,10 +316,13 @@ def test_master_read(self): os.close(slave_fd) debug("Reading from master_fd") - with self.assertRaises(OSError): - os.read(master_fd, 1) + try: + data = os.read(master_fd, 1) + except OSError: # Linux + data = b"" os.close(master_fd) + self.assertEqual(data, b"") class SmallPtyTests(unittest.TestCase): """These tests don't spawn children or hang.""" diff --git a/Misc/NEWS.d/next/Library/2020-11-28-06-34-53.bpo-41818.mFSMc2.rst b/Misc/NEWS.d/next/Library/2020-11-28-06-34-53.bpo-41818.mFSMc2.rst new file mode 100644 index 00000000000000..b783f8cec1c941 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-28-06-34-53.bpo-41818.mFSMc2.rst @@ -0,0 +1 @@ +Fix test_master_read() so that it succeeds on all platforms that either raise OSError or return b"" upon reading from master. \ No newline at end of file From f93ebe77164942815d77bf19f7d8c7b3b7c14796 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Sat, 28 Nov 2020 18:42:23 -0300 Subject: [PATCH 0668/1261] Fix multiprocessing markup (GH-23525) --- Doc/library/multiprocessing.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 20cd99d8ce2c87..128aa43b8b76f4 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -2569,9 +2569,9 @@ Address Formats filesystem. * An ``'AF_PIPE'`` address is a string of the form - :samp:`r'\\\\.\\pipe\\{PipeName}'`. To use :func:`Client` to connect to a named - pipe on a remote computer called *ServerName* one should use an address of the - form :samp:`r'\\\\{ServerName}\\pipe\\{PipeName}'` instead. + :samp:`r'\\\\.\\pipe\\{PipeName}'`. To use :func:`Client` to connect to a named + pipe on a remote computer called *ServerName* one should use an address of the + form :samp:`r'\\\\{ServerName}\\pipe\\{PipeName}'` instead. Note that any string beginning with two backslashes is assumed by default to be an ``'AF_PIPE'`` address rather than an ``'AF_UNIX'`` address. From 186107130028ad95c072680b594d0cc56ea3c0e7 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Sat, 28 Nov 2020 18:43:22 -0300 Subject: [PATCH 0669/1261] Fix dis markup (GH-23524) --- Doc/library/dis.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 8347c50ce3e0db..ec64d3daf003a9 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -861,7 +861,7 @@ All of the following opcodes use their arguments. .. opcode:: LIST_TO_TUPLE - Pops a list from the stack and pushes a tuple containing the same values. + Pops a list from the stack and pushes a tuple containing the same values. .. versionadded:: 3.9 @@ -889,7 +889,7 @@ All of the following opcodes use their arguments. .. opcode:: DICT_MERGE - Like :opcode:`DICT_UPDATE` but raises an exception for duplicate keys. + Like :opcode:`DICT_UPDATE` but raises an exception for duplicate keys. .. versionadded:: 3.9 @@ -907,14 +907,14 @@ All of the following opcodes use their arguments. .. opcode:: IS_OP (invert) - Performs ``is`` comparison, or ``is not`` if ``invert`` is 1. + Performs ``is`` comparison, or ``is not`` if ``invert`` is 1. .. versionadded:: 3.9 .. opcode:: CONTAINS_OP (invert) - Performs ``in`` comparison, or ``not in`` if ``invert`` is 1. + Performs ``in`` comparison, or ``not in`` if ``invert`` is 1. .. versionadded:: 3.9 @@ -955,8 +955,8 @@ All of the following opcodes use their arguments. .. opcode:: JUMP_IF_NOT_EXC_MATCH (target) - Tests whether the second value on the stack is an exception matching TOS, - and jumps if it is not. Pops two values from the stack. + Tests whether the second value on the stack is an exception matching TOS, + and jumps if it is not. Pops two values from the stack. .. versionadded:: 3.9 From e54631f74b62673492ade5364fb1803622865d63 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sat, 28 Nov 2020 14:46:30 -0700 Subject: [PATCH 0670/1261] Fix an error in the news entry for _posixsubprocess multiphase init (GH-23516) Commit 035deee265c7fb227ddc87222fa48761231d8bd7 converted the _posixsubprocess module to multiphase initialization, but the news entry mentions the _posixshmem module. --- .../next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst b/Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst index cdaabfcc0910b8..d5a10695b4b417 100644 --- a/Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst +++ b/Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst @@ -1 +1,2 @@ -Port _posixshmem extension module to multiphase initialization (:pep:`489`). +Port _posixsubprocess extension module to multiphase initialization +(:pep:`489`). From eb6fa068aed92b6a01ab9a368fd806be0738b5d9 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Sun, 29 Nov 2020 05:48:38 +0800 Subject: [PATCH 0671/1261] skip test_getaddrinfo_ipv6_scopeid_symbolic and test_getnameinfo_ipv6_scopeid_symbolic on VxWorks (GH-23518) --- Lib/test/test_socket.py | 2 ++ Misc/NEWS.d/next/Tests/2020-11-26-11-13-13.bpo-31904.ay4g89.rst | 1 + 2 files changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2020-11-26-11-13-13.bpo-31904.ay4g89.rst diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 5f57ab2f89d8d3..e4af713b4c5bf7 100755 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -1738,6 +1738,7 @@ def test_getaddrinfo_ipv6_basic(self): @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows') @unittest.skipIf(AIX, 'Symbolic scope id does not work') + @unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()") def test_getaddrinfo_ipv6_scopeid_symbolic(self): # Just pick up any network interface (Linux, Mac OS X) (ifindex, test_interface) = socket.if_nameindex()[0] @@ -1770,6 +1771,7 @@ def test_getaddrinfo_ipv6_scopeid_numeric(self): @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows') @unittest.skipIf(AIX, 'Symbolic scope id does not work') + @unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()") def test_getnameinfo_ipv6_scopeid_symbolic(self): # Just pick up any network interface. (ifindex, test_interface) = socket.if_nameindex()[0] diff --git a/Misc/NEWS.d/next/Tests/2020-11-26-11-13-13.bpo-31904.ay4g89.rst b/Misc/NEWS.d/next/Tests/2020-11-26-11-13-13.bpo-31904.ay4g89.rst new file mode 100644 index 00000000000000..6d95d527e6eeed --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-11-26-11-13-13.bpo-31904.ay4g89.rst @@ -0,0 +1 @@ +skip test_getaddrinfo_ipv6_scopeid_symbolic and test_getnameinfo_ipv6_scopeid_symbolic on VxWorks From b67e6cc3c0c85045f6923c91c2f85d9126b75d95 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Sun, 29 Nov 2020 05:49:47 +0800 Subject: [PATCH 0672/1261] skip test_test of test_mailcap on VxWorks (GH-23507) --- Lib/test/test_mailcap.py | 2 ++ Misc/NEWS.d/next/Tests/2020-11-25-17-00-53.bpo-31904.ue4hd9.rst | 1 + 2 files changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2020-11-25-17-00-53.bpo-31904.ue4hd9.rst diff --git a/Lib/test/test_mailcap.py b/Lib/test/test_mailcap.py index 51a0c7da8bb6bd..ef9cad498a75c2 100644 --- a/Lib/test/test_mailcap.py +++ b/Lib/test/test_mailcap.py @@ -4,6 +4,7 @@ import test.support from test.support import os_helper import unittest +import sys # Location of mailcap file MAILCAPFILE = test.support.findfile("mailcap.txt") @@ -214,6 +215,7 @@ def test_findmatch(self): self._run_cases(cases) @unittest.skipUnless(os.name == "posix", "Requires 'test' command on system") + @unittest.skipIf(sys.platform == "vxworks", "'test' command is not supported on VxWorks") def test_test(self): # findmatch() will automatically check any "test" conditions and skip # the entry if the check fails. diff --git a/Misc/NEWS.d/next/Tests/2020-11-25-17-00-53.bpo-31904.ue4hd9.rst b/Misc/NEWS.d/next/Tests/2020-11-25-17-00-53.bpo-31904.ue4hd9.rst new file mode 100644 index 00000000000000..910505440b8d60 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-11-25-17-00-53.bpo-31904.ue4hd9.rst @@ -0,0 +1 @@ +skip test_test of test_mailcap on VxWorks From 9c9eb634a2e0884bfdbca674b3f0903ca06c5b2e Mon Sep 17 00:00:00 2001 From: pxinwr Date: Sun, 29 Nov 2020 06:04:50 +0800 Subject: [PATCH 0673/1261] bpo-31904: add shell requirement for test_pipes (GH-23489) VxWorks has no user space shell provided so it can't support pipes module. Also add shell requirement for running test_pipes. --- Doc/library/pipes.rst | 2 ++ Lib/test/support/__init__.py | 2 +- Lib/test/test_pipes.py | 5 ++++- .../next/Tests/2020-11-24-17-26-41.bpo-31904.eug834.rst | 1 + 4 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-11-24-17-26-41.bpo-31904.eug834.rst diff --git a/Doc/library/pipes.rst b/Doc/library/pipes.rst index 0a22da1f555bc2..57e27a6acf4b66 100644 --- a/Doc/library/pipes.rst +++ b/Doc/library/pipes.rst @@ -17,6 +17,8 @@ The :mod:`pipes` module defines a class to abstract the concept of a *pipeline* Because the module uses :program:`/bin/sh` command lines, a POSIX or compatible shell for :func:`os.system` and :func:`os.popen` is required. +.. availability:: Unix. Not available on VxWorks. + The :mod:`pipes` module defines the following class: diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 4ba749454c1873..5a45d78be91663 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -421,7 +421,7 @@ def requires_lzma(reason='requires lzma'): is_android = hasattr(sys, 'getandroidapilevel') -if sys.platform != 'win32': +if sys.platform not in ('win32', 'vxworks'): unix_shell = '/system/bin/sh' if is_android else '/bin/sh' else: unix_shell = None diff --git a/Lib/test/test_pipes.py b/Lib/test/test_pipes.py index 7d8cd54ba0e5b3..6a13b36d1cb70e 100644 --- a/Lib/test/test_pipes.py +++ b/Lib/test/test_pipes.py @@ -3,13 +3,16 @@ import string import unittest import shutil -from test.support import run_unittest, reap_children +from test.support import run_unittest, reap_children, unix_shell from test.support.os_helper import TESTFN, unlink if os.name != 'posix': raise unittest.SkipTest('pipes module only works on posix') +if not (unix_shell and os.path.exists(unix_shell)): + raise unittest.SkipTest('pipes module requires a shell') + TESTFN2 = TESTFN + "2" # tr a-z A-Z is not portable, so make the ranges explicit diff --git a/Misc/NEWS.d/next/Tests/2020-11-24-17-26-41.bpo-31904.eug834.rst b/Misc/NEWS.d/next/Tests/2020-11-24-17-26-41.bpo-31904.eug834.rst new file mode 100644 index 00000000000000..3e3942857b8f16 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-11-24-17-26-41.bpo-31904.eug834.rst @@ -0,0 +1 @@ +add shell requirement for test_pipes From 3c2354c36280beef842e9a93a2bcdb6fc479553f Mon Sep 17 00:00:00 2001 From: pxinwr Date: Sun, 29 Nov 2020 06:06:36 +0800 Subject: [PATCH 0674/1261] bpo-31904: skip some tests related to fifo on VxWorks (GH-23473) On VxWork RTOS, FIFO must be created under directory "/fifos/". Some test cases related to fifo is invalid on VxWorks. So skip them. --- Lib/test/test_pathlib.py | 2 ++ Lib/test/test_shutil.py | 4 ++++ .../next/Tests/2020-11-23-11-11-29.bpo-31904.V3sUZk.rst | 1 + 3 files changed, 7 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2020-11-23-11-11-29.bpo-31904.V3sUZk.rst diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 5e5e065b988aaf..7f7f72c625806f 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -2219,6 +2219,8 @@ def test_is_fifo_false(self): self.assertIs((P / 'fileA\x00').is_fifo(), False) @unittest.skipUnless(hasattr(os, "mkfifo"), "os.mkfifo() required") + @unittest.skipIf(sys.platform == "vxworks", + "fifo requires special path on VxWorks") def test_is_fifo_true(self): P = self.cls(BASE, 'myfifo') try: diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 890f2c7d406c24..df7fbedf24a7c2 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -683,6 +683,8 @@ def custom_cpfun(a, b): # Issue #3002: copyfile and copytree block indefinitely on named pipes @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()') @os_helper.skip_unless_symlink + @unittest.skipIf(sys.platform == "vxworks", + "fifo requires special path on VxWorks") def test_copytree_named_pipe(self): os.mkdir(TESTFN) try: @@ -1206,6 +1208,8 @@ def test_dont_copy_file_onto_symlink_to_itself(self): # Issue #3002: copyfile and copytree block indefinitely on named pipes @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()') + @unittest.skipIf(sys.platform == "vxworks", + "fifo requires special path on VxWorks") def test_copyfile_named_pipe(self): try: os.mkfifo(TESTFN) diff --git a/Misc/NEWS.d/next/Tests/2020-11-23-11-11-29.bpo-31904.V3sUZk.rst b/Misc/NEWS.d/next/Tests/2020-11-23-11-11-29.bpo-31904.V3sUZk.rst new file mode 100644 index 00000000000000..7202cfa3f3f4c5 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-11-23-11-11-29.bpo-31904.V3sUZk.rst @@ -0,0 +1 @@ +skip some tests related to fifo on VxWorks From cbc769b5558eaeffd3b28c5bc05ad151e2101f7a Mon Sep 17 00:00:00 2001 From: pxinwr Date: Sun, 29 Nov 2020 06:14:16 +0800 Subject: [PATCH 0675/1261] bpo-31904: remove libnet dependency from detect_socket() for VxWorks (GH-23394) Previously on VxWorks compiling socket extension module needs the libnet to link. Now VxWorks has moved the replied functions to libc. So removing libnet from setup.py. --- .../next/Build/2020-11-19-17-01-50.bpo-31904.894dk2.rst | 1 + setup.py | 6 +----- 2 files changed, 2 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-11-19-17-01-50.bpo-31904.894dk2.rst diff --git a/Misc/NEWS.d/next/Build/2020-11-19-17-01-50.bpo-31904.894dk2.rst b/Misc/NEWS.d/next/Build/2020-11-19-17-01-50.bpo-31904.894dk2.rst new file mode 100644 index 00000000000000..d1ec647ed343ef --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-11-19-17-01-50.bpo-31904.894dk2.rst @@ -0,0 +1 @@ +remove libnet dependency from detect_socket() for VxWorks diff --git a/setup.py b/setup.py index 398d9251a6c410..b7a7d26c5325bc 100644 --- a/setup.py +++ b/setup.py @@ -1132,11 +1132,7 @@ def detect_crypt(self): def detect_socket(self): # socket(2) kwargs = {'depends': ['socketmodule.h']} - if VXWORKS: - if not self.compiler.find_library_file(self.lib_dirs, 'net'): - return - kwargs['libraries'] = ['net'] - elif MACOS: + if MACOS: # Issue #35569: Expose RFC 3542 socket options. kwargs['extra_compile_args'] = ['-D__APPLE_USE_RFC_3542'] From 9a7e1ac7a9db8c503d0b80b58e440a8b1cb6cb82 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Sun, 29 Nov 2020 09:34:36 +0000 Subject: [PATCH 0676/1261] bpo-39096: Improve description of 'e', 'f' and 'g' presentation types (#23537) * Improve description of 'e', 'f' and 'g' presentation types * Drop the 'E' from Scientific 'E' notation; remove >= 0 qualifications * Fix false statement that the alternate form is valid for Decimal * Nitpick: remove the Harvard/Oxford comma * Add note that the decimal point is also removed if no digits follow it, except in alternate form --- Doc/library/string.rst | 43 ++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 91f43e9353d915..5542e9b727a6b8 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -384,10 +384,10 @@ following: The ``'#'`` option causes the "alternate form" to be used for the conversion. The alternate form is defined differently for different -types. This option is only valid for integer, float, complex and -Decimal types. For integers, when binary, octal, or hexadecimal output +types. This option is only valid for integer, float and complex +types. For integers, when binary, octal, or hexadecimal output is used, this option adds the prefix respective ``'0b'``, ``'0o'``, or -``'0x'`` to the output value. For floats, complex and Decimal the +``'0x'`` to the output value. For float and complex the alternate form causes the result of the conversion to always contain a decimal-point character, even if no digits follow it. Normally, a decimal-point character appears in the result of these conversions @@ -476,20 +476,36 @@ with the floating point presentation types listed below (except ``'n'`` and ``None``). When doing so, :func:`float` is used to convert the integer to a floating point number before formatting. -The available presentation types for floating point and decimal values are: +The available presentation types for :class:`float` and +:class:`~decimal.Decimal` values are: +---------+----------------------------------------------------------+ | Type | Meaning | +=========+==========================================================+ - | ``'e'`` | Exponent notation. Prints the number in scientific | - | | notation using the letter 'e' to indicate the exponent. | - | | The default precision is ``6``. | + | ``'e'`` | Scientific notation. For a given precision ``p``, | + | | formats the number in scientific notation with the | + | | letter 'e' separating the coefficient from the exponent. | + | | The coefficient has one digit before and ``p`` digits | + | | after the decimal point, for a total of ``p + 1`` | + | | significant digits. With no precision given, uses a | + | | precision of ``6`` digits after the decimal point for | + | | :class:`float`, and shows all coefficient digits | + | | for :class:`~decimal.Decimal`. If no digits follow the | + | | decimal point, the decimal point is also removed unless | + | | the ``#`` option is used. | +---------+----------------------------------------------------------+ - | ``'E'`` | Exponent notation. Same as ``'e'`` except it uses an | - | | upper case 'E' as the separator character. | + | ``'E'`` | Scientific notation. Same as ``'e'`` except it uses | + | | an upper case 'E' as the separator character. | +---------+----------------------------------------------------------+ - | ``'f'`` | Fixed-point notation. Displays the number as a | - | | fixed-point number. The default precision is ``6``. | + | ``'f'`` | Fixed-point notation. For a given precision ``p``, | + | | formats the number as a decimal number with exactly | + | | ``p`` digits following the decimal point. With no | + | | precision given, uses a precision of ``6`` digits after | + | | the decimal point for :class:`float`, and uses a | + | | precision large enough to show all coefficient digits | + | | for :class:`~decimal.Decimal`. If no digits follow the | + | | decimal point, the decimal point is also removed unless | + | | the ``#`` option is used. | +---------+----------------------------------------------------------+ | ``'F'`` | Fixed-point notation. Same as ``'f'``, but converts | | | ``nan`` to ``NAN`` and ``inf`` to ``INF``. | @@ -518,7 +534,10 @@ The available presentation types for floating point and decimal values are: | | the precision. | | | | | | A precision of ``0`` is treated as equivalent to a | - | | precision of ``1``. The default precision is ``6``. | + | | precision of ``1``. With no precision given, uses a | + | | precision of ``6`` significant digits for | + | | :class:`float`, and shows all coefficient digits | + | | for :class:`~decimal.Decimal`. | +---------+----------------------------------------------------------+ | ``'G'`` | General format. Same as ``'g'`` except switches to | | | ``'E'`` if the number gets too large. The | From 01b894c429540895507ce2e16d26cf4220e10fa0 Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Sun, 29 Nov 2020 14:50:57 +0200 Subject: [PATCH 0677/1261] bpo-42392: Remove deprecated loop parameter from docs (GH-23552) --- Doc/library/asyncio-queue.rst | 5 +---- Doc/library/asyncio-stream.rst | 23 ++++++++------------- Doc/library/asyncio-subprocess.rst | 13 ++---------- Doc/library/asyncio-sync.rst | 29 +++++---------------------- Doc/library/asyncio-task.rst | 32 ++++++------------------------ 5 files changed, 22 insertions(+), 80 deletions(-) diff --git a/Doc/library/asyncio-queue.rst b/Doc/library/asyncio-queue.rst index 524560b691d720..289ad1b014c356 100644 --- a/Doc/library/asyncio-queue.rst +++ b/Doc/library/asyncio-queue.rst @@ -23,7 +23,7 @@ See also the `Examples`_ section below. Queue ===== -.. class:: Queue(maxsize=0, \*, loop=None) +.. class:: Queue(maxsize=0) A first in, first out (FIFO) queue. @@ -36,9 +36,6 @@ Queue the queue is always known and can be returned by calling the :meth:`qsize` method. - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - This class is :ref:`not thread safe `. diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index b76ed379c7f4c8..bee47bcdcbf21a 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -49,8 +49,8 @@ and work with streams: .. coroutinefunction:: open_connection(host=None, port=None, \*, \ - loop=None, limit=None, ssl=None, family=0, \ - proto=0, flags=0, sock=None, local_addr=None, \ + limit=None, ssl=None, family=0, proto=0, \ + flags=0, sock=None, local_addr=None, \ server_hostname=None, ssl_handshake_timeout=None) Establish a network connection and return a pair of @@ -59,9 +59,6 @@ and work with streams: The returned *reader* and *writer* objects are instances of :class:`StreamReader` and :class:`StreamWriter` classes. - The *loop* argument is optional and can always be determined - automatically when this function is awaited from a coroutine. - *limit* determines the buffer size limit used by the returned :class:`StreamReader` instance. By default the *limit* is set to 64 KiB. @@ -74,7 +71,7 @@ and work with streams: The *ssl_handshake_timeout* parameter. .. coroutinefunction:: start_server(client_connected_cb, host=None, \ - port=None, \*, loop=None, limit=None, \ + port=None, \*, limit=None, \ family=socket.AF_UNSPEC, \ flags=socket.AI_PASSIVE, sock=None, \ backlog=100, ssl=None, reuse_address=None, \ @@ -92,9 +89,6 @@ and work with streams: :ref:`coroutine function `; if it is a coroutine function, it will be automatically scheduled as a :class:`Task`. - The *loop* argument is optional and can always be determined - automatically when this method is awaited from a coroutine. - *limit* determines the buffer size limit used by the returned :class:`StreamReader` instance. By default the *limit* is set to 64 KiB. @@ -109,9 +103,9 @@ and work with streams: .. rubric:: Unix Sockets -.. coroutinefunction:: open_unix_connection(path=None, \*, loop=None, \ - limit=None, ssl=None, sock=None, \ - server_hostname=None, ssl_handshake_timeout=None) +.. coroutinefunction:: open_unix_connection(path=None, \*, limit=None, \ + ssl=None, sock=None, server_hostname=None, \ + ssl_handshake_timeout=None) Establish a Unix socket connection and return a pair of ``(reader, writer)``. @@ -132,9 +126,8 @@ and work with streams: .. coroutinefunction:: start_unix_server(client_connected_cb, path=None, \ - \*, loop=None, limit=None, sock=None, \ - backlog=100, ssl=None, ssl_handshake_timeout=None, \ - start_serving=True) + \*, limit=None, sock=None, backlog=100, ssl=None, \ + ssl_handshake_timeout=None, start_serving=True) Start a Unix socket server. diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index b0330349dfb651..ea674302bd9d6a 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -62,8 +62,7 @@ Creating Subprocesses ===================== .. coroutinefunction:: create_subprocess_exec(program, \*args, stdin=None, \ - stdout=None, stderr=None, loop=None, \ - limit=None, \*\*kwds) + stdout=None, stderr=None, limit=None, \*\*kwds) Create a subprocess. @@ -76,13 +75,9 @@ Creating Subprocesses See the documentation of :meth:`loop.subprocess_exec` for other parameters. - .. deprecated-removed:: 3.8 3.10 - - The *loop* parameter. .. coroutinefunction:: create_subprocess_shell(cmd, stdin=None, \ - stdout=None, stderr=None, loop=None, \ - limit=None, \*\*kwds) + stdout=None, stderr=None, limit=None, \*\*kwds) Run the *cmd* shell command. @@ -104,10 +99,6 @@ Creating Subprocesses escape whitespace and special shell characters in strings that are going to be used to construct shell commands. - .. deprecated-removed:: 3.8 3.10 - - The *loop* parameter. - .. note:: Subprocesses are available for Windows if a :class:`ProactorEventLoop` is diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst index 84a52cb2d57571..a7688d5120efda 100644 --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -36,7 +36,7 @@ asyncio has the following basic synchronization primitives: Lock ==== -.. class:: Lock(\*, loop=None) +.. class:: Lock() Implements a mutex lock for asyncio tasks. Not thread-safe. @@ -63,9 +63,6 @@ Lock finally: lock.release() - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - .. coroutinemethod:: acquire() Acquire the lock. @@ -96,7 +93,7 @@ Lock Event ===== -.. class:: Event(\*, loop=None) +.. class:: Event() An event object. Not thread-safe. @@ -108,10 +105,6 @@ Event :meth:`clear` method. The :meth:`wait` method blocks until the flag is set to *true*. The flag is set to *false* initially. - - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - .. _asyncio_example_sync_event: Example:: @@ -166,7 +159,7 @@ Event Condition ========= -.. class:: Condition(lock=None, \*, loop=None) +.. class:: Condition(lock=None) A Condition object. Not thread-safe. @@ -184,10 +177,6 @@ Condition ``None``. In the latter case a new Lock object is created automatically. - - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - The preferred way to use a Condition is an :keyword:`async with` statement:: @@ -270,7 +259,7 @@ Condition Semaphore ========= -.. class:: Semaphore(value=1, \*, loop=None) +.. class:: Semaphore(value=1) A Semaphore object. Not thread-safe. @@ -284,10 +273,6 @@ Semaphore internal counter (``1`` by default). If the given value is less than ``0`` a :exc:`ValueError` is raised. - - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - The preferred way to use a Semaphore is an :keyword:`async with` statement:: @@ -332,7 +317,7 @@ Semaphore BoundedSemaphore ================ -.. class:: BoundedSemaphore(value=1, \*, loop=None) +.. class:: BoundedSemaphore(value=1) A bounded semaphore object. Not thread-safe. @@ -340,10 +325,6 @@ BoundedSemaphore a :exc:`ValueError` in :meth:`~Semaphore.release` if it increases the internal counter above the initial *value*. - - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - --------- diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index c638f1263fdaa1..73ada0e2f006cd 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -283,7 +283,7 @@ Creating Tasks Sleeping ======== -.. coroutinefunction:: sleep(delay, result=None, \*, loop=None) +.. coroutinefunction:: sleep(delay, result=None) Block for *delay* seconds. @@ -293,9 +293,6 @@ Sleeping ``sleep()`` always suspends the current task, allowing other tasks to run. - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - .. _asyncio_example_sleep: Example of coroutine displaying the current date every second @@ -319,7 +316,7 @@ Sleeping Running Tasks Concurrently ========================== -.. awaitablefunction:: gather(\*aws, loop=None, return_exceptions=False) +.. awaitablefunction:: gather(\*aws, return_exceptions=False) Run :ref:`awaitable objects ` in the *aws* sequence *concurrently*. @@ -348,9 +345,6 @@ Running Tasks Concurrently cancellation of one submitted Task/Future to cause other Tasks/Futures to be cancelled. - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - .. _asyncio_example_gather: Example:: @@ -403,7 +397,7 @@ Running Tasks Concurrently Shielding From Cancellation =========================== -.. awaitablefunction:: shield(aw, \*, loop=None) +.. awaitablefunction:: shield(aw) Protect an :ref:`awaitable object ` from being :meth:`cancelled `. @@ -436,14 +430,11 @@ Shielding From Cancellation except CancelledError: res = None - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - Timeouts ======== -.. coroutinefunction:: wait_for(aw, timeout, \*, loop=None) +.. coroutinefunction:: wait_for(aw, timeout) Wait for the *aw* :ref:`awaitable ` to complete with a timeout. @@ -466,9 +457,6 @@ Timeouts If the wait is cancelled, the future *aw* is also cancelled. - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - .. _asyncio_example_waitfor: Example:: @@ -500,8 +488,7 @@ Timeouts Waiting Primitives ================== -.. coroutinefunction:: wait(aws, \*, loop=None, timeout=None,\ - return_when=ALL_COMPLETED) +.. coroutinefunction:: wait(aws, \*, timeout=None, return_when=ALL_COMPLETED) Run :ref:`awaitable objects ` in the *aws* iterable concurrently and block until the condition specified @@ -553,10 +540,6 @@ Waiting Primitives ``wait()`` directly is deprecated as it leads to :ref:`confusing behavior `. - .. deprecated-removed:: 3.8 3.10 - - The *loop* parameter. - .. _asyncio_example_wait_coroutine: .. note:: @@ -590,7 +573,7 @@ Waiting Primitives deprecated. -.. function:: as_completed(aws, \*, loop=None, timeout=None) +.. function:: as_completed(aws, \*, timeout=None) Run :ref:`awaitable objects ` in the *aws* iterable concurrently. Return an iterator of coroutines. @@ -600,9 +583,6 @@ Waiting Primitives Raises :exc:`asyncio.TimeoutError` if the timeout occurs before all Futures are done. - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - Example:: for coro in as_completed(aws): From cf664cbd4d46f61569c24a6f6ca90c7fa440a1fa Mon Sep 17 00:00:00 2001 From: Renato Cunha Date: Sun, 29 Nov 2020 15:23:15 -0300 Subject: [PATCH 0678/1261] bpo-42406: Fix whichmodule() with multiprocessing (GH-23403) * bpo-42406: Fix whichmodule() with multiprocessing Signed-off-by: Renato L. de F. Cunha Co-authored-by: Gregory P. Smith --- Lib/pickle.py | 4 +++- .../next/Library/2020-11-19-10-44-41.bpo-42406.r9rNCj.rst | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-19-10-44-41.bpo-42406.r9rNCj.rst diff --git a/Lib/pickle.py b/Lib/pickle.py index cbac5f168b45eb..e63a8b6e4dbb70 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -340,7 +340,9 @@ def whichmodule(obj, name): # Protect the iteration by using a list copy of sys.modules against dynamic # modules that trigger imports of other modules upon calls to getattr. for module_name, module in sys.modules.copy().items(): - if module_name == '__main__' or module is None: + if (module_name == '__main__' + or module_name == '__mp_main__' # bpo-42406 + or module is None): continue try: if _getattribute(module, name)[0] is obj: diff --git a/Misc/NEWS.d/next/Library/2020-11-19-10-44-41.bpo-42406.r9rNCj.rst b/Misc/NEWS.d/next/Library/2020-11-19-10-44-41.bpo-42406.r9rNCj.rst new file mode 100644 index 00000000000000..c157df138a5ea0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-19-10-44-41.bpo-42406.r9rNCj.rst @@ -0,0 +1,3 @@ +We fixed an issue in `pickle.whichmodule` in which importing +`multiprocessing` could change the how pickle identifies which module an +object belongs to, potentially breaking the unpickling of those objects. From 7f20005e550e9faca8ebaceb50d6814ed68b5fa2 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 29 Nov 2020 10:47:22 -0800 Subject: [PATCH 0679/1261] bpo-42450: Minor updates to the itertools recipes (GH-23555) --- Doc/library/itertools.rst | 10 +++++----- Lib/test/test_itertools.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 107bc515a67785..3de66c93492815 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -755,7 +755,7 @@ which incur interpreter overhead. "Count how many times the predicate is true" return sum(map(pred, iterable)) - def padnone(iterable): + def pad_none(iterable): """Returns the sequence elements and then returns None indefinitely. Useful for emulating the behavior of the built-in map() function. @@ -809,7 +809,7 @@ which incur interpreter overhead. nexts = cycle(islice(nexts, num_active)) def partition(pred, iterable): - 'Use a predicate to partition entries into false entries and true entries' + "Use a predicate to partition entries into false entries and true entries" # partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 t1, t2 = tee(iterable) return filterfalse(pred, t1), filter(pred, t2) @@ -881,7 +881,7 @@ which incur interpreter overhead. def random_product(*args, repeat=1): "Random selection from itertools.product(*args, **kwds)" pools = [tuple(pool) for pool in args] * repeat - return tuple(random.choice(pool) for pool in pools) + return tuple(map(random.choice, pools)) def random_permutation(iterable, r=None): "Random selection from itertools.permutations(iterable, r)" @@ -900,11 +900,11 @@ which incur interpreter overhead. "Random selection from itertools.combinations_with_replacement(iterable, r)" pool = tuple(iterable) n = len(pool) - indices = sorted(random.randrange(n) for i in range(r)) + indices = sorted(random.choices(range(n), k=r)) return tuple(pool[i] for i in indices) def nth_combination(iterable, r, index): - 'Equivalent to list(combinations(iterable, r))[index]' + "Equivalent to list(combinations(iterable, r))[index]" pool = tuple(iterable) n = len(pool) if r < 0 or r > n: diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index eaa6197bec395c..702cf0820316b1 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -2290,7 +2290,7 @@ def test_permutations_sizeof(self): ... "Count how many times the predicate is true" ... return sum(map(pred, iterable)) ->>> def padnone(iterable): +>>> def pad_none(iterable): ... "Returns the sequence elements and then returns None indefinitely" ... return chain(iterable, repeat(None)) @@ -2460,7 +2460,7 @@ def test_permutations_sizeof(self): >>> list(pairwise('a')) [] ->>> list(islice(padnone('abc'), 0, 6)) +>>> list(islice(pad_none('abc'), 0, 6)) ['a', 'b', 'c', None, None, None] >>> list(ncycles('abc', 3)) From f814b59c75ace2c9830edfda1c32ff54c3da2cea Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 30 Nov 2020 10:24:07 +0200 Subject: [PATCH 0680/1261] bpo-42142: Try to fix timeouts in ttk tests (GH-23474) Instead of using wait_visibility() which waits event in dead loop use update() which should proceed all queued events. --- Lib/tkinter/test/test_ttk/test_extensions.py | 6 ------ Lib/tkinter/test/test_ttk/test_widgets.py | 20 +++++++------------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/Lib/tkinter/test/test_ttk/test_extensions.py b/Lib/tkinter/test/test_ttk/test_extensions.py index a45f882bb00d48..6937ba1ca9be41 100644 --- a/Lib/tkinter/test/test_ttk/test_extensions.py +++ b/Lib/tkinter/test/test_ttk/test_extensions.py @@ -114,7 +114,6 @@ def check_positions(scale, scale_pos, label, label_pos): def test_horizontal_range(self): lscale = ttk.LabeledScale(self.root, from_=0, to=10) lscale.pack() - lscale.wait_visibility() lscale.update() linfo_1 = lscale.label.place_info() @@ -144,7 +143,6 @@ def test_horizontal_range(self): def test_variable_change(self): x = ttk.LabeledScale(self.root) x.pack() - x.wait_visibility() x.update() curr_xcoord = x.scale.coords()[0] @@ -187,7 +185,6 @@ def test_variable_change(self): def test_resize(self): x = ttk.LabeledScale(self.root) x.pack(expand=True, fill='both') - x.wait_visibility() x.update() width, height = x.master.winfo_width(), x.master.winfo_height() @@ -268,7 +265,6 @@ def test_menu(self): # check that variable is updated correctly optmenu.pack() - optmenu.wait_visibility() optmenu['menu'].invoke(0) self.assertEqual(optmenu._variable.get(), items[0]) @@ -299,9 +295,7 @@ def test_unique_radiobuttons(self): textvar2 = tkinter.StringVar(self.root) optmenu2 = ttk.OptionMenu(self.root, textvar2, default, *items) optmenu.pack() - optmenu.wait_visibility() optmenu2.pack() - optmenu2.wait_visibility() optmenu['menu'].invoke(1) optmenu2['menu'].invoke(2) optmenu_stringvar_name = optmenu['menu'].entrycget(0, 'variable') diff --git a/Lib/tkinter/test/test_ttk/test_widgets.py b/Lib/tkinter/test/test_ttk/test_widgets.py index e20ec390710856..157ef0e8f87bb5 100644 --- a/Lib/tkinter/test/test_ttk/test_widgets.py +++ b/Lib/tkinter/test/test_ttk/test_widgets.py @@ -60,11 +60,10 @@ def setUp(self): super().setUp() self.widget = ttk.Button(self.root, width=0, text="Text") self.widget.pack() - self.widget.wait_visibility() def test_identify(self): - self.widget.update_idletasks() + self.widget.update() self.assertEqual(self.widget.identify( int(self.widget.winfo_width() / 2), int(self.widget.winfo_height() / 2) @@ -326,8 +325,7 @@ def test_bbox(self): def test_identify(self): self.entry.pack() - self.entry.wait_visibility() - self.entry.update_idletasks() + self.entry.update() # bpo-27313: macOS Cocoa widget differs from X, allow either if sys.platform == 'darwin': @@ -450,7 +448,7 @@ def test_virtual_event(self): self.combo.bind('<>', lambda evt: success.append(True)) self.combo.pack() - self.combo.wait_visibility() + self.combo.update() height = self.combo.winfo_height() self._show_drop_down_listbox() @@ -466,7 +464,7 @@ def test_postcommand(self): self.combo['postcommand'] = lambda: success.append(True) self.combo.pack() - self.combo.wait_visibility() + self.combo.update() self._show_drop_down_listbox() self.assertTrue(success) @@ -666,7 +664,6 @@ def test_sashpos(self): self.assertRaises(tkinter.TclError, self.paned.sashpos, 1) self.paned.pack(expand=True, fill='both') - self.paned.wait_visibility() curr_pos = self.paned.sashpos(0) self.paned.sashpos(0, 1000) @@ -934,7 +931,7 @@ def test_tab_identifiers(self): self.nb.add(self.child1, text='a') self.nb.pack() - self.nb.wait_visibility() + self.nb.update() if sys.platform == 'darwin': tb_idx = "@20,5" else: @@ -1042,7 +1039,7 @@ def test_insert(self): def test_select(self): self.nb.pack() - self.nb.wait_visibility() + self.nb.update() success = [] tab_changed = [] @@ -1085,7 +1082,7 @@ def test_tabs(self): def test_traversal(self): self.nb.pack() - self.nb.wait_visibility() + self.nb.update() self.nb.select(0) @@ -1347,7 +1344,6 @@ def test_show(self): def test_bbox(self): self.tv.pack() self.assertEqual(self.tv.bbox(''), '') - self.tv.wait_visibility() self.tv.update() item_id = self.tv.insert('', 'end') @@ -1544,7 +1540,6 @@ def simulate_heading_click(x, y): success = [] # no success for now self.tv.pack() - self.tv.wait_visibility() self.tv.heading('#0', command=lambda: success.append(True)) self.tv.column('#0', width=100) self.tv.update() @@ -1792,7 +1787,6 @@ def test_tag_bind(self): lambda evt: events.append(2)) self.tv.pack() - self.tv.wait_visibility() self.tv.update() pos_y = set() From 0d0d603fcdb149a700e97c3be85adb66027bd588 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Mon, 30 Nov 2020 01:39:12 -0700 Subject: [PATCH 0681/1261] bpo-42506: Fix unexpected output in test_format (GH-23564) --- Lib/test/test_format.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py index 9653e46ecc52d8..6679bd3d8899cd 100644 --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -275,9 +275,9 @@ def test_common_format(self): test_exc_common('% %s', 1, ValueError, "unsupported format character '%' (0x25) at index 2") test_exc_common('%d', '1', TypeError, - "%d format: a number is required, not str") + "%d format: a real number is required, not str") test_exc_common('%d', b'1', TypeError, - "%d format: a number is required, not bytes") + "%d format: a real number is required, not bytes") test_exc_common('%x', '1', TypeError, "%x format: an integer is required, not str") test_exc_common('%x', 3.14, TypeError, From 1d6249485ebc9f9f3646edfae32f67d1117570d4 Mon Sep 17 00:00:00 2001 From: Yasser A Date: Mon, 30 Nov 2020 01:53:11 -0800 Subject: [PATCH 0682/1261] bpo-42451: Indicate that PyTuple_GetItem does not support negative indices (GH-23529) --- Doc/c-api/tuple.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst index bf751e44acde09..c0c14f480d39b8 100644 --- a/Doc/c-api/tuple.rst +++ b/Doc/c-api/tuple.rst @@ -57,7 +57,7 @@ Tuple Objects .. c:function:: PyObject* PyTuple_GetItem(PyObject *p, Py_ssize_t pos) Return the object at position *pos* in the tuple pointed to by *p*. If *pos* is - out of bounds, return ``NULL`` and set an :exc:`IndexError` exception. + negative or out of bounds, return ``NULL`` and set an :exc:`IndexError` exception. .. c:function:: PyObject* PyTuple_GET_ITEM(PyObject *p, Py_ssize_t pos) From b18ade51442a568569341ab63ff451f34ef3861e Mon Sep 17 00:00:00 2001 From: Andreas Poehlmann Date: Mon, 30 Nov 2020 17:34:15 +0100 Subject: [PATCH 0683/1261] bpo-42487: don't call __getitem__ of underlying maps in ChainMap.__iter__ (GH-23534) --- Lib/collections/__init__.py | 2 +- Lib/test/test_collections.py | 16 ++++++++++++++++ .../2020-11-28-04-31-20.bpo-42487.iqtC4L.rst | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-28-04-31-20.bpo-42487.iqtC4L.rst diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 5d75501645fc4a..9c25a2d2784b8f 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -1001,7 +1001,7 @@ def __len__(self): def __iter__(self): d = {} for mapping in reversed(self.maps): - d.update(mapping) # reuses stored hash values if possible + d.update(dict.fromkeys(mapping)) # reuses stored hash values if possible return iter(d) def __contains__(self, key): diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 150c2a1c0e3498..a1ca958257adf6 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -196,6 +196,22 @@ def test_order_preservation(self): ('e', 55), ('f', 666), ('g', 777), ('h', 88888), ('i', 9999), ('j', 0)]) + def test_iter_not_calling_getitem_on_maps(self): + class DictWithGetItem(UserDict): + def __init__(self, *args, **kwds): + self.called = False + UserDict.__init__(self, *args, **kwds) + def __getitem__(self, item): + self.called = True + UserDict.__getitem__(self, item) + + d = DictWithGetItem(a=1) + c = ChainMap(d) + d.called = False + + set(c) # iterate over chain map + self.assertFalse(d.called, '__getitem__ was called') + def test_dict_coercion(self): d = ChainMap(dict(a=1, b=2), dict(b=20, c=30)) self.assertEqual(dict(d), dict(a=1, b=2, c=30)) diff --git a/Misc/NEWS.d/next/Library/2020-11-28-04-31-20.bpo-42487.iqtC4L.rst b/Misc/NEWS.d/next/Library/2020-11-28-04-31-20.bpo-42487.iqtC4L.rst new file mode 100644 index 00000000000000..8c67d747b614ee --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-28-04-31-20.bpo-42487.iqtC4L.rst @@ -0,0 +1 @@ +ChainMap.__iter__ no longer calls __getitem__ on underlying maps From 457e182aaa8d9c55639bde4b5c849562288b04ba Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Mon, 30 Nov 2020 12:09:43 -0500 Subject: [PATCH 0684/1261] bpo-42508: Remove bogus idlelib.pyshell.ModifiedInterpreter attribute (GH-23570) restart_subprocess is a method of self, the pyshell.InteractiveInterpreter instance. The latter does not have an interp attribute redundantly referring to itself. (The PyShell instance does have an interp attribute, referring to the InteractiveInterpreter instance.) --- Lib/idlelib/pyshell.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 343d2ef32d7a76..c3ecdc7b1b077c 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -757,7 +757,7 @@ def runcommand(self, code): def runcode(self, code): "Override base class method" if self.tkconsole.executing: - self.interp.restart_subprocess() + self.restart_subprocess() self.checklinecache() debugger = self.debugger try: From 811ed488fe4b0f38e0c4d8448cf73d74b040b581 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Mon, 30 Nov 2020 09:55:13 -0800 Subject: [PATCH 0685/1261] bpo-42501: Revise the usage note for Enums with the choices (GH-23563) --- Doc/library/argparse.rst | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 7a7a4cf94979a1..a32b99901a7b4e 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1133,20 +1133,9 @@ container should match the type_ specified:: Any container can be passed as the *choices* value, so :class:`list` objects, :class:`set` objects, and custom containers are all supported. -This includes :class:`enum.Enum`, which could be used to restrain -argument's choices; if we reuse previous rock/paper/scissors game example, -this could be as follows:: - - >>> from enum import Enum - >>> class GameMove(Enum): - ... ROCK = 'rock' - ... PAPER = 'paper' - ... SCISSORS = 'scissors' - ... - >>> parser = argparse.ArgumentParser(prog='game.py') - >>> parser.add_argument('move', type=GameMove, choices=GameMove) - >>> parser.parse_args(['rock']) - Namespace(move=) + +Use of :class:`enum.Enum` is not recommended because it is difficult to +control its appearance in usage, help, and error messages. required From b46bdeb030531ca7e4ee8a3638a4c453d67ad9f2 Mon Sep 17 00:00:00 2001 From: James Gerity Date: Mon, 30 Nov 2020 14:08:26 -0500 Subject: [PATCH 0686/1261] bpo-42485: [Doc] Link to PEP 617 from full grammar specification (GH-23532) Co-authored-by: Lysandros Nikolaou --- Doc/reference/grammar.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/reference/grammar.rst b/Doc/reference/grammar.rst index acf83765b5796c..59b45005836a76 100644 --- a/Doc/reference/grammar.rst +++ b/Doc/reference/grammar.rst @@ -13,7 +13,8 @@ In particular, ``&`` followed by a symbol, token or parenthesized group indicates a positive lookahead (i.e., is required to match but not consumed), while ``!`` indicates a negative lookahead (i.e., is required _not_ to match). We use the ``|`` separator to mean PEG's -"ordered choice" (written as ``/`` in traditional PEG grammars). +"ordered choice" (written as ``/`` in traditional PEG grammars). See +:pep:`617` for more details on the grammar's syntax. .. literalinclude:: ../../Grammar/python.gram :language: peg From 4c6802f07fa92925f75e1713d410239c49966ab2 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 30 Nov 2020 19:42:38 +0000 Subject: [PATCH 0687/1261] Refactor the grammar to match the language specification docs (GH-23574) --- Grammar/python.gram | 14 ++-- Parser/parser.c | 188 ++++++++++++++++++++++---------------------- 2 files changed, 101 insertions(+), 101 deletions(-) diff --git a/Grammar/python.gram b/Grammar/python.gram index 9e915acf5dbaf6..9f4709491469d8 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -52,18 +52,18 @@ type_expressions[asdl_expr_seq*]: | a[asdl_expr_seq*]=','.expression+ {a} statements[asdl_stmt_seq*]: a=statement+ { (asdl_stmt_seq*)_PyPegen_seq_flatten(p, a) } -statement[asdl_stmt_seq*]: a=compound_stmt { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } | a[asdl_stmt_seq*]=simple_stmt { a } +statement[asdl_stmt_seq*]: a=compound_stmt { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } | a[asdl_stmt_seq*]=simple_stmts { a } statement_newline[asdl_stmt_seq*]: | a=compound_stmt NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } - | simple_stmt + | simple_stmts | NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, CHECK(stmt_ty, _Py_Pass(EXTRA))) } | ENDMARKER { _PyPegen_interactive_exit(p) } -simple_stmt[asdl_stmt_seq*]: - | a=small_stmt !';' NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } # Not needed, there for speedup - | a[asdl_stmt_seq*]=';'.small_stmt+ [';'] NEWLINE { a } +simple_stmts[asdl_stmt_seq*]: + | a=simple_stmt !';' NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } # Not needed, there for speedup + | a[asdl_stmt_seq*]=';'.simple_stmt+ [';'] NEWLINE { a } # NOTE: assignment MUST precede expression, else parsing a simple assignment # will throw a SyntaxError. -small_stmt[stmt_ty] (memo): +simple_stmt[stmt_ty] (memo): | assignment | e=star_expressions { _Py_Expr(e, EXTRA) } | &'return' return_stmt @@ -308,7 +308,7 @@ class_def_raw[stmt_ty]: block[asdl_stmt_seq*] (memo): | NEWLINE INDENT a=statements DEDENT { a } - | simple_stmt + | simple_stmts | invalid_block star_expressions[expr_ty]: diff --git a/Parser/parser.c b/Parser/parser.c index f469c8f0e49a8a..b6c04953c899e0 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -75,8 +75,8 @@ static KeywordToken *reserved_keywords[] = { #define statements_type 1006 #define statement_type 1007 #define statement_newline_type 1008 -#define simple_stmt_type 1009 -#define small_stmt_type 1010 +#define simple_stmts_type 1009 +#define simple_stmt_type 1010 #define compound_stmt_type 1011 #define assignment_type 1012 #define augassign_type 1013 @@ -391,8 +391,8 @@ static asdl_expr_seq* type_expressions_rule(Parser *p); static asdl_stmt_seq* statements_rule(Parser *p); static asdl_stmt_seq* statement_rule(Parser *p); static asdl_stmt_seq* statement_newline_rule(Parser *p); -static asdl_stmt_seq* simple_stmt_rule(Parser *p); -static stmt_ty small_stmt_rule(Parser *p); +static asdl_stmt_seq* simple_stmts_rule(Parser *p); +static stmt_ty simple_stmt_rule(Parser *p); static stmt_ty compound_stmt_rule(Parser *p); static stmt_ty assignment_rule(Parser *p); static AugOperator* augassign_rule(Parser *p); @@ -1213,7 +1213,7 @@ statements_rule(Parser *p) return _res; } -// statement: compound_stmt | simple_stmt +// statement: compound_stmt | simple_stmts static asdl_stmt_seq* statement_rule(Parser *p) { @@ -1248,18 +1248,18 @@ statement_rule(Parser *p) D(fprintf(stderr, "%*c%s statement[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compound_stmt")); } - { // simple_stmt + { // simple_stmts if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> statement[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + D(fprintf(stderr, "%*c> statement[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmts")); asdl_stmt_seq* a; if ( - (a = (asdl_stmt_seq*)simple_stmt_rule(p)) // simple_stmt + (a = (asdl_stmt_seq*)simple_stmts_rule(p)) // simple_stmts ) { - D(fprintf(stderr, "%*c+ statement[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + D(fprintf(stderr, "%*c+ statement[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmts")); _res = a; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -1270,7 +1270,7 @@ statement_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s statement[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmts")); } _res = NULL; done: @@ -1278,7 +1278,7 @@ statement_rule(Parser *p) return _res; } -// statement_newline: compound_stmt NEWLINE | simple_stmt | NEWLINE | $ +// statement_newline: compound_stmt NEWLINE | simple_stmts | NEWLINE | $ static asdl_stmt_seq* statement_newline_rule(Parser *p) { @@ -1325,24 +1325,24 @@ statement_newline_rule(Parser *p) D(fprintf(stderr, "%*c%s statement_newline[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compound_stmt NEWLINE")); } - { // simple_stmt + { // simple_stmts if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> statement_newline[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); - asdl_stmt_seq* simple_stmt_var; + D(fprintf(stderr, "%*c> statement_newline[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmts")); + asdl_stmt_seq* simple_stmts_var; if ( - (simple_stmt_var = simple_stmt_rule(p)) // simple_stmt + (simple_stmts_var = simple_stmts_rule(p)) // simple_stmts ) { - D(fprintf(stderr, "%*c+ statement_newline[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt")); - _res = simple_stmt_var; + D(fprintf(stderr, "%*c+ statement_newline[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmts")); + _res = simple_stmts_var; goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s statement_newline[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmts")); } { // NEWLINE if (p->error_indicator) { @@ -1407,9 +1407,9 @@ statement_newline_rule(Parser *p) return _res; } -// simple_stmt: small_stmt !';' NEWLINE | ';'.small_stmt+ ';'? NEWLINE +// simple_stmts: simple_stmt !';' NEWLINE | ';'.simple_stmt+ ';'? NEWLINE static asdl_stmt_seq* -simple_stmt_rule(Parser *p) +simple_stmts_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -1418,23 +1418,23 @@ simple_stmt_rule(Parser *p) } asdl_stmt_seq* _res = NULL; int _mark = p->mark; - { // small_stmt !';' NEWLINE + { // simple_stmt !';' NEWLINE if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "small_stmt !';' NEWLINE")); + D(fprintf(stderr, "%*c> simple_stmts[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt !';' NEWLINE")); stmt_ty a; Token * newline_var; if ( - (a = small_stmt_rule(p)) // small_stmt + (a = simple_stmt_rule(p)) // simple_stmt && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 13) // token=';' && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "small_stmt !';' NEWLINE")); + D(fprintf(stderr, "%*c+ simple_stmts[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt !';' NEWLINE")); _res = ( asdl_stmt_seq * ) _PyPegen_singleton_seq ( p , a ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -1444,28 +1444,28 @@ simple_stmt_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "small_stmt !';' NEWLINE")); + D(fprintf(stderr, "%*c%s simple_stmts[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt !';' NEWLINE")); } - { // ';'.small_stmt+ ';'? NEWLINE + { // ';'.simple_stmt+ ';'? NEWLINE if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'.small_stmt+ ';'? NEWLINE")); + D(fprintf(stderr, "%*c> simple_stmts[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'.simple_stmt+ ';'? NEWLINE")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings asdl_stmt_seq* a; Token * newline_var; if ( - (a = (asdl_stmt_seq*)_gather_12_rule(p)) // ';'.small_stmt+ + (a = (asdl_stmt_seq*)_gather_12_rule(p)) // ';'.simple_stmt+ && (_opt_var = _PyPegen_expect_token(p, 13), 1) // ';'? && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'.small_stmt+ ';'? NEWLINE")); + D(fprintf(stderr, "%*c+ simple_stmts[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'.simple_stmt+ ';'? NEWLINE")); _res = a; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -1475,8 +1475,8 @@ simple_stmt_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';'.small_stmt+ ';'? NEWLINE")); + D(fprintf(stderr, "%*c%s simple_stmts[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';'.simple_stmt+ ';'? NEWLINE")); } _res = NULL; done: @@ -1484,7 +1484,7 @@ simple_stmt_rule(Parser *p) return _res; } -// small_stmt: +// simple_stmt: // | assignment // | star_expressions // | &'return' return_stmt @@ -1499,7 +1499,7 @@ simple_stmt_rule(Parser *p) // | &'global' global_stmt // | &'nonlocal' nonlocal_stmt static stmt_ty -small_stmt_rule(Parser *p) +simple_stmt_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -1507,7 +1507,7 @@ small_stmt_rule(Parser *p) return NULL; } stmt_ty _res = NULL; - if (_PyPegen_is_memoized(p, small_stmt_type, &_res)) { + if (_PyPegen_is_memoized(p, simple_stmt_type, &_res)) { D(p->level--); return _res; } @@ -1526,18 +1526,18 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment")); stmt_ty assignment_var; if ( (assignment_var = assignment_rule(p)) // assignment ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment")); _res = assignment_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment")); } { // star_expressions @@ -1545,13 +1545,13 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty e; if ( (e = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -1570,7 +1570,7 @@ small_stmt_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } { // &'return' return_stmt @@ -1578,7 +1578,7 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'return' return_stmt")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'return' return_stmt")); stmt_ty return_stmt_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 500) // token='return' @@ -1586,12 +1586,12 @@ small_stmt_rule(Parser *p) (return_stmt_var = return_stmt_rule(p)) // return_stmt ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'return' return_stmt")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'return' return_stmt")); _res = return_stmt_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'return' return_stmt")); } { // &('import' | 'from') import_stmt @@ -1599,7 +1599,7 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('import' | 'from') import_stmt")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('import' | 'from') import_stmt")); stmt_ty import_stmt_var; if ( _PyPegen_lookahead(1, _tmp_14_rule, p) @@ -1607,12 +1607,12 @@ small_stmt_rule(Parser *p) (import_stmt_var = import_stmt_rule(p)) // import_stmt ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('import' | 'from') import_stmt")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('import' | 'from') import_stmt")); _res = import_stmt_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&('import' | 'from') import_stmt")); } { // &'raise' raise_stmt @@ -1620,7 +1620,7 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'raise' raise_stmt")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'raise' raise_stmt")); stmt_ty raise_stmt_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 501) // token='raise' @@ -1628,12 +1628,12 @@ small_stmt_rule(Parser *p) (raise_stmt_var = raise_stmt_rule(p)) // raise_stmt ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'raise' raise_stmt")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'raise' raise_stmt")); _res = raise_stmt_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'raise' raise_stmt")); } { // 'pass' @@ -1641,13 +1641,13 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'pass'")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'pass'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 502)) // token='pass' ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'pass'")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'pass'")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -1666,7 +1666,7 @@ small_stmt_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'pass'")); } { // &'del' del_stmt @@ -1674,7 +1674,7 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'del' del_stmt")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'del' del_stmt")); stmt_ty del_stmt_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 503) // token='del' @@ -1682,12 +1682,12 @@ small_stmt_rule(Parser *p) (del_stmt_var = del_stmt_rule(p)) // del_stmt ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'del' del_stmt")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'del' del_stmt")); _res = del_stmt_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'del' del_stmt")); } { // &'yield' yield_stmt @@ -1695,7 +1695,7 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'yield' yield_stmt")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'yield' yield_stmt")); stmt_ty yield_stmt_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 504) // token='yield' @@ -1703,12 +1703,12 @@ small_stmt_rule(Parser *p) (yield_stmt_var = yield_stmt_rule(p)) // yield_stmt ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'yield' yield_stmt")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'yield' yield_stmt")); _res = yield_stmt_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'yield' yield_stmt")); } { // &'assert' assert_stmt @@ -1716,7 +1716,7 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'assert' assert_stmt")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'assert' assert_stmt")); stmt_ty assert_stmt_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 505) // token='assert' @@ -1724,12 +1724,12 @@ small_stmt_rule(Parser *p) (assert_stmt_var = assert_stmt_rule(p)) // assert_stmt ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'assert' assert_stmt")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'assert' assert_stmt")); _res = assert_stmt_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'assert' assert_stmt")); } { // 'break' @@ -1737,13 +1737,13 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'break'")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'break'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 506)) // token='break' ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'break'")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'break'")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -1762,7 +1762,7 @@ small_stmt_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'break'")); } { // 'continue' @@ -1770,13 +1770,13 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'continue'")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'continue'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 507)) // token='continue' ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'continue'")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'continue'")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -1795,7 +1795,7 @@ small_stmt_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'continue'")); } { // &'global' global_stmt @@ -1803,7 +1803,7 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'global' global_stmt")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'global' global_stmt")); stmt_ty global_stmt_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 508) // token='global' @@ -1811,12 +1811,12 @@ small_stmt_rule(Parser *p) (global_stmt_var = global_stmt_rule(p)) // global_stmt ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'global' global_stmt")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'global' global_stmt")); _res = global_stmt_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'global' global_stmt")); } { // &'nonlocal' nonlocal_stmt @@ -1824,7 +1824,7 @@ small_stmt_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'nonlocal' nonlocal_stmt")); + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'nonlocal' nonlocal_stmt")); stmt_ty nonlocal_stmt_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 509) // token='nonlocal' @@ -1832,17 +1832,17 @@ small_stmt_rule(Parser *p) (nonlocal_stmt_var = nonlocal_stmt_rule(p)) // nonlocal_stmt ) { - D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'nonlocal' nonlocal_stmt")); + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'nonlocal' nonlocal_stmt")); _res = nonlocal_stmt_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'nonlocal' nonlocal_stmt")); } _res = NULL; done: - _PyPegen_insert_memo(p, _mark, small_stmt_type, _res); + _PyPegen_insert_memo(p, _mark, simple_stmt_type, _res); D(p->level--); return _res; } @@ -6235,7 +6235,7 @@ class_def_raw_rule(Parser *p) return _res; } -// block: NEWLINE INDENT statements DEDENT | simple_stmt | invalid_block +// block: NEWLINE INDENT statements DEDENT | simple_stmts | invalid_block static asdl_stmt_seq* block_rule(Parser *p) { @@ -6283,24 +6283,24 @@ block_rule(Parser *p) D(fprintf(stderr, "%*c%s block[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE INDENT statements DEDENT")); } - { // simple_stmt + { // simple_stmts if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); - asdl_stmt_seq* simple_stmt_var; + D(fprintf(stderr, "%*c> block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmts")); + asdl_stmt_seq* simple_stmts_var; if ( - (simple_stmt_var = simple_stmt_rule(p)) // simple_stmt + (simple_stmts_var = simple_stmts_rule(p)) // simple_stmts ) { - D(fprintf(stderr, "%*c+ block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt")); - _res = simple_stmt_var; + D(fprintf(stderr, "%*c+ block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmts")); + _res = simple_stmts_var; goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s block[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmts")); } if (p->call_invalid_rules) { // invalid_block if (p->error_indicator) { @@ -16274,7 +16274,7 @@ _loop1_11_rule(Parser *p) return _seq; } -// _loop0_13: ';' small_stmt +// _loop0_13: ';' simple_stmt static asdl_seq * _loop0_13_rule(Parser *p) { @@ -16295,18 +16295,18 @@ _loop0_13_rule(Parser *p) } ssize_t _children_capacity = 1; ssize_t _n = 0; - { // ';' small_stmt + { // ';' simple_stmt if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';' small_stmt")); + D(fprintf(stderr, "%*c> _loop0_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';' simple_stmt")); Token * _literal; stmt_ty elem; while ( (_literal = _PyPegen_expect_token(p, 13)) // token=';' && - (elem = small_stmt_rule(p)) // small_stmt + (elem = simple_stmt_rule(p)) // simple_stmt ) { _res = elem; @@ -16332,7 +16332,7 @@ _loop0_13_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_13[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';' small_stmt")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';' simple_stmt")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -16349,7 +16349,7 @@ _loop0_13_rule(Parser *p) return _seq; } -// _gather_12: small_stmt _loop0_13 +// _gather_12: simple_stmt _loop0_13 static asdl_seq * _gather_12_rule(Parser *p) { @@ -16360,27 +16360,27 @@ _gather_12_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // small_stmt _loop0_13 + { // simple_stmt _loop0_13 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "small_stmt _loop0_13")); + D(fprintf(stderr, "%*c> _gather_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_13")); stmt_ty elem; asdl_seq * seq; if ( - (elem = small_stmt_rule(p)) // small_stmt + (elem = simple_stmt_rule(p)) // simple_stmt && (seq = _loop0_13_rule(p)) // _loop0_13 ) { - D(fprintf(stderr, "%*c+ _gather_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "small_stmt _loop0_13")); + D(fprintf(stderr, "%*c+ _gather_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_13")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s _gather_12[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "small_stmt _loop0_13")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt _loop0_13")); } _res = NULL; done: From 92ce98e258bb0f83f762238aed5536fae31101f5 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Mon, 30 Nov 2020 22:34:45 +0100 Subject: [PATCH 0688/1261] bpo-28468: Add platform.freedesktop_os_release() (GH-23492) Add platform.freedesktop_os_release() function to parse freedesktop.org os-release files. Signed-off-by: Christian Heimes Co-authored-by: Victor Stinner --- Doc/library/platform.rst | 38 +++++++ Doc/whatsnew/3.10.rst | 8 ++ Lib/platform.py | 57 ++++++++++ Lib/test/test_platform.py | 106 ++++++++++++++++++ .../2020-11-24-13-18-05.bpo-28468.8Gh2d4.rst | 2 + 5 files changed, 211 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-11-24-13-18-05.bpo-28468.8Gh2d4.rst diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index b293adf48e6e33..fc51b5de881cc4 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -253,3 +253,41 @@ Unix Platforms using :program:`gcc`. The file is read and scanned in chunks of *chunksize* bytes. + + +Linux Platforms +--------------- + +.. function:: freedesktop_os_release() + + Get operating system identification from ``os-release`` file and return + it as a dict. The ``os-release`` file is a `freedesktop.org standard + `_ and + is available in most Linux distributions. A noticeable exception is + Android and Android-based distributions. + + Raises :exc:`OSError` or subclass when neither ``/etc/os-release`` nor + ``/usr/lib/os-release`` can be read. + + On success, the function returns a dictionary where keys and values are + strings. Values have their special characters like ``"`` and ``$`` + unquoted. The fields ``NAME``, ``ID``, and ``PRETTY_NAME`` are always + defined according to the standard. All other fields are optional. Vendors + may include additional fields. + + Note that fields like ``NAME``, ``VERSION``, and ``VARIANT`` are strings + suitable for presentation to users. Programs should use fields like + ``ID``, ``ID_LIKE``, ``VERSION_ID``, or ``VARIANT_ID`` to identify + Linux distributions. + + Example:: + + def get_like_distro(): + info = platform.freedesktop_os_release() + ids = [info["ID"]] + if "ID_LIKE" in info: + # ids are space separated and ordered by precedence + ids.extend(info["ID_LIKE"].split()) + return ids + + .. versionadded:: 3.10 diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index f96a3bcbca95f3..a8f1080a504c70 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -254,6 +254,14 @@ Added negative indexing support to :attr:`PurePath.parents `. (Contributed by Yaroslav Pankovych in :issue:`21041`) +platform +-------- + +Added :func:`platform.freedesktop_os_release()` to retrieve operation system +identification from `freedesktop.org os-release +`_ standard file. +(Contributed by Christian Heimes in :issue:`28468`) + py_compile ---------- diff --git a/Lib/platform.py b/Lib/platform.py index 0eb5167d584f79..138a974f02bb6d 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -1230,6 +1230,63 @@ def platform(aliased=0, terse=0): _platform_cache[(aliased, terse)] = platform return platform +### freedesktop.org os-release standard +# https://www.freedesktop.org/software/systemd/man/os-release.html + +# NAME=value with optional quotes (' or "). The regular expression is less +# strict than shell lexer, but that's ok. +_os_release_line = re.compile( + "^(?P[a-zA-Z0-9_]+)=(?P[\"\']?)(?P.*)(?P=quote)$" +) +# unescape five special characters mentioned in the standard +_os_release_unescape = re.compile(r"\\([\\\$\"\'`])") +# /etc takes precedence over /usr/lib +_os_release_candidates = ("/etc/os-release", "/usr/lib/os-relesase") +_os_release_cache = None + + +def _parse_os_release(lines): + # These fields are mandatory fields with well-known defaults + # in pratice all Linux distributions override NAME, ID, and PRETTY_NAME. + info = { + "NAME": "Linux", + "ID": "linux", + "PRETTY_NAME": "Linux", + } + + for line in lines: + mo = _os_release_line.match(line) + if mo is not None: + info[mo.group('name')] = _os_release_unescape.sub( + r"\1", mo.group('value') + ) + + return info + + +def freedesktop_os_release(): + """Return operation system identification from freedesktop.org os-release + """ + global _os_release_cache + + if _os_release_cache is None: + errno = None + for candidate in _os_release_candidates: + try: + with open(candidate, encoding="utf-8") as f: + _os_release_cache = _parse_os_release(f) + break + except OSError as e: + errno = e.errno + else: + raise OSError( + errno, + f"Unable to read files {', '.join(_os_release_candidates)}" + ) + + return _os_release_cache.copy() + + ### Command line interface if __name__ == '__main__': diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 1590cd509b95c5..2c6fbee8b6ffb5 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -8,12 +8,70 @@ from test import support from test.support import os_helper +FEDORA_OS_RELEASE = """\ +NAME=Fedora +VERSION="32 (Thirty Two)" +ID=fedora +VERSION_ID=32 +VERSION_CODENAME="" +PLATFORM_ID="platform:f32" +PRETTY_NAME="Fedora 32 (Thirty Two)" +ANSI_COLOR="0;34" +LOGO=fedora-logo-icon +CPE_NAME="cpe:/o:fedoraproject:fedora:32" +HOME_URL="https://fedoraproject.org/" +DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f32/system-administrators-guide/" +SUPPORT_URL="https://fedoraproject.org/wiki/Communicating_and_getting_help" +BUG_REPORT_URL="https://bugzilla.redhat.com/" +REDHAT_BUGZILLA_PRODUCT="Fedora" +REDHAT_BUGZILLA_PRODUCT_VERSION=32 +REDHAT_SUPPORT_PRODUCT="Fedora" +REDHAT_SUPPORT_PRODUCT_VERSION=32 +PRIVACY_POLICY_URL="https://fedoraproject.org/wiki/Legal:PrivacyPolicy" +""" + +UBUNTU_OS_RELEASE = """\ +NAME="Ubuntu" +VERSION="20.04.1 LTS (Focal Fossa)" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu 20.04.1 LTS" +VERSION_ID="20.04" +HOME_URL="https://www.ubuntu.com/" +SUPPORT_URL="https://help.ubuntu.com/" +BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" +PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" +VERSION_CODENAME=focal +UBUNTU_CODENAME=focal +""" + +TEST_OS_RELEASE = r""" +# test data +ID_LIKE="egg spam viking" +EMPTY= +# comments and empty lines are ignored + +SINGLE_QUOTE='single' +EMPTY_SINGLE='' +DOUBLE_QUOTE="double" +EMPTY_DOUBLE="" +QUOTES="double\'s" +SPECIALS="\$\`\\\'\"" +# invalid lines +=invalid += +INVALID +IN-VALID=value +IN VALID=value +""" + class PlatformTest(unittest.TestCase): def clear_caches(self): platform._platform_cache.clear() platform._sys_version_cache.clear() platform._uname_cache = None + platform._os_release_cache = None def test_architecture(self): res = platform.architecture() @@ -382,6 +440,54 @@ def test_macos(self): self.assertEqual(platform.platform(terse=1), expected_terse) self.assertEqual(platform.platform(), expected) + def test_freedesktop_os_release(self): + self.addCleanup(self.clear_caches) + self.clear_caches() + + if any(os.path.isfile(fn) for fn in platform._os_release_candidates): + info = platform.freedesktop_os_release() + self.assertIn("NAME", info) + self.assertIn("ID", info) + + info["CPYTHON_TEST"] = "test" + self.assertNotIn( + "CPYTHON_TEST", + platform.freedesktop_os_release() + ) + else: + with self.assertRaises(OSError): + platform.freedesktop_os_release() + + def test_parse_os_release(self): + info = platform._parse_os_release(FEDORA_OS_RELEASE.splitlines()) + self.assertEqual(info["NAME"], "Fedora") + self.assertEqual(info["ID"], "fedora") + self.assertNotIn("ID_LIKE", info) + self.assertEqual(info["VERSION_CODENAME"], "") + + info = platform._parse_os_release(UBUNTU_OS_RELEASE.splitlines()) + self.assertEqual(info["NAME"], "Ubuntu") + self.assertEqual(info["ID"], "ubuntu") + self.assertEqual(info["ID_LIKE"], "debian") + self.assertEqual(info["VERSION_CODENAME"], "focal") + + info = platform._parse_os_release(TEST_OS_RELEASE.splitlines()) + expected = { + "ID": "linux", + "NAME": "Linux", + "PRETTY_NAME": "Linux", + "ID_LIKE": "egg spam viking", + "EMPTY": "", + "DOUBLE_QUOTE": "double", + "EMPTY_DOUBLE": "", + "SINGLE_QUOTE": "single", + "EMPTY_SINGLE": "", + "QUOTES": "double's", + "SPECIALS": "$`\\'\"", + } + self.assertEqual(info, expected) + self.assertEqual(len(info["SPECIALS"]), 5) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-11-24-13-18-05.bpo-28468.8Gh2d4.rst b/Misc/NEWS.d/next/Library/2020-11-24-13-18-05.bpo-28468.8Gh2d4.rst new file mode 100644 index 00000000000000..b1834065cf047e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-24-13-18-05.bpo-28468.8Gh2d4.rst @@ -0,0 +1,2 @@ +Add :func:`platform.freedesktop_os_release` function to parse freedesktop.org +``os-release`` files. From 43d8e53e5c28a2dbf60f86a9631a21c5aa2288b3 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Tue, 1 Dec 2020 05:48:33 +0800 Subject: [PATCH 0689/1261] bpo-31904: Support signal module on VxWorks (GH-23391) --- Lib/test/test_signal.py | 13 ++++++++++--- .../2020-11-19-16-14-36.bpo-31904.83kf9d.rst | 1 + Modules/signalmodule.c | 4 ++++ 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-19-16-14-36.bpo-31904.83kf9d.rst diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 5a8ff361f9656b..6a43fe70372c55 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -519,10 +519,14 @@ def handler(signum, frame): else: write.setblocking(False) - # Start with large chunk size to reduce the - # number of send needed to fill the buffer. written = 0 - for chunk_size in (2 ** 16, 2 ** 8, 1): + if sys.platform == "vxworks": + CHUNK_SIZES = (1,) + else: + # Start with large chunk size to reduce the + # number of send needed to fill the buffer. + CHUNK_SIZES = (2 ** 16, 2 ** 8, 1) + for chunk_size in CHUNK_SIZES: chunk = b"x" * chunk_size try: while True: @@ -595,6 +599,7 @@ def handler(signum, frame): @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") +@unittest.skipUnless(hasattr(signal, 'siginterrupt'), "needs signal.siginterrupt()") class SiginterruptTest(unittest.TestCase): def readpipe_interrupted(self, interrupt): @@ -680,6 +685,8 @@ def test_siginterrupt_off(self): @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") +@unittest.skipUnless(hasattr(signal, 'getitimer') and hasattr(signal, 'setitimer'), + "needs signal.getitimer() and signal.setitimer()") class ItimerTest(unittest.TestCase): def setUp(self): self.hndl_called = False diff --git a/Misc/NEWS.d/next/Library/2020-11-19-16-14-36.bpo-31904.83kf9d.rst b/Misc/NEWS.d/next/Library/2020-11-19-16-14-36.bpo-31904.83kf9d.rst new file mode 100644 index 00000000000000..e0ea23aefae7f5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-19-16-14-36.bpo-31904.83kf9d.rst @@ -0,0 +1 @@ +Support signal module on VxWorks. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index fcc8f1cbda227e..7ac797a3aa3f87 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -120,7 +120,11 @@ static volatile struct { #else #define INVALID_FD (-1) static volatile struct { +#ifdef __VXWORKS__ + int fd; +#else sig_atomic_t fd; +#endif int warn_on_full_buffer; } wakeup = {.fd = INVALID_FD, .warn_on_full_buffer = 1}; #endif From 027e6d891593bf345a34943637c80b45cc1ddb34 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Tue, 1 Dec 2020 01:35:25 +0000 Subject: [PATCH 0690/1261] bpo-42482: remove reference to exc_traceback from TracebackException (GH-23531) --- Lib/test/test_traceback.py | 22 +++++++++++++++++++ Lib/traceback.py | 5 ++--- .../2020-11-27-16-46-58.bpo-42482.EJC3sd.rst | 1 + 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-27-16-46-58.bpo-42482.EJC3sd.rst diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index f86afc673d86e7..5df701caf0f01e 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -1123,6 +1123,18 @@ def test_context(self): self.assertEqual(exc_info[0], exc.exc_type) self.assertEqual(str(exc_info[1]), str(exc)) + def test_no_refs_to_exception_and_traceback_objects(self): + try: + 1/0 + except Exception: + exc_info = sys.exc_info() + + refcnt1 = sys.getrefcount(exc_info[1]) + refcnt2 = sys.getrefcount(exc_info[2]) + exc = traceback.TracebackException(*exc_info) + self.assertEqual(sys.getrefcount(exc_info[1]), refcnt1) + self.assertEqual(sys.getrefcount(exc_info[2]), refcnt2) + def test_comparison_basic(self): try: 1/0 @@ -1172,6 +1184,16 @@ def raise_with_locals(): exc7 = traceback.TracebackException(*exc_info, limit=-2, capture_locals=True) self.assertNotEqual(exc6, exc7) + def test_comparison_equivalent_exceptions_are_equal(self): + excs = [] + for _ in range(2): + try: + 1/0 + except: + excs.append(traceback.TracebackException(*sys.exc_info())) + self.assertEqual(excs[0], excs[1]) + self.assertEqual(list(excs[0].format()), list(excs[1].format())) + def test_unhashable(self): class UnhashableException(Exception): def __eq__(self, other): diff --git a/Lib/traceback.py b/Lib/traceback.py index d2d93c8a32ac29..457d92511af051 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -510,7 +510,6 @@ def __init__(self, exc_type, exc_value, exc_traceback, *, limit=None, _seen=_seen) else: context = None - self.exc_traceback = exc_traceback self.__cause__ = cause self.__context__ = context self.__suppress_context__ = \ @@ -627,7 +626,7 @@ def format(self, *, chain=True): not self.__suppress_context__): yield from self.__context__.format(chain=chain) yield _context_message - if self.exc_traceback is not None: + if self.stack: yield 'Traceback (most recent call last):\n' - yield from self.stack.format() + yield from self.stack.format() yield from self.format_exception_only() diff --git a/Misc/NEWS.d/next/Library/2020-11-27-16-46-58.bpo-42482.EJC3sd.rst b/Misc/NEWS.d/next/Library/2020-11-27-16-46-58.bpo-42482.EJC3sd.rst new file mode 100644 index 00000000000000..79afa654f352e9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-27-16-46-58.bpo-42482.EJC3sd.rst @@ -0,0 +1 @@ +:class:`~traceback.TracebackException` no longer holds a reference to the exception's traceback object. Consequently, instances of TracebackException for equivalent but non-equal exceptions now compare as equal. \ No newline at end of file From 4adaccfc31a493802d9bc60a76969080ddf335c6 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Mon, 30 Nov 2020 20:42:54 -0800 Subject: [PATCH 0691/1261] bpo-38200: Add itertools.pairwise() (GH-23549) --- Doc/library/itertools.rst | 23 ++- Lib/test/test_itertools.py | 52 ++++--- .../2020-11-28-22-52-57.bpo-38200.DuWGlW.rst | 1 + Modules/clinic/itertoolsmodule.c.h | 33 ++++- Modules/itertoolsmodule.c | 137 +++++++++++++++++- 5 files changed, 220 insertions(+), 26 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-28-22-52-57.bpo-38200.DuWGlW.rst diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 3de66c93492815..44728b42287bce 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -55,6 +55,7 @@ Iterator Arguments Results :func:`filterfalse` pred, seq elements of seq where pred(elem) is false ``filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8`` :func:`groupby` iterable[, key] sub-iterators grouped by value of key(v) :func:`islice` seq, [start,] stop [, step] elements from seq[start:stop:step] ``islice('ABCDEFG', 2, None) --> C D E F G`` +:func:`pairwise` iterable (p[0], p[1]), (p[1], p[2]) ``pairwise('ABCDEFG') --> AB BC CD DE EF FG`` :func:`starmap` func, seq func(\*seq[0]), func(\*seq[1]), ... ``starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000`` :func:`takewhile` pred, seq seq[0], seq[1], until pred fails ``takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4`` :func:`tee` it, n it1, it2, ... itn splits one iterator into n @@ -475,6 +476,22 @@ loops that truncate the stream. If *start* is ``None``, then iteration starts at zero. If *step* is ``None``, then the step defaults to one. +.. function:: pairwise(iterable) + + Return successive overlapping pairs taken from the input *iterable*. + + The number of 2-tuples in the output iterator will be one fewer than the + number of inputs. It will be empty if the input iterable has fewer than + two values. + + Roughly equivalent to:: + + def pairwise(iterable): + # pairwise('ABCDEFG') --> AB BC CD DE EF FG + a, b = tee(iterable) + next(b, None) + return zip(a, b) + .. function:: permutations(iterable, r=None) @@ -782,12 +799,6 @@ which incur interpreter overhead. return starmap(func, repeat(args)) return starmap(func, repeat(args, times)) - def pairwise(iterable): - "s -> (s0,s1), (s1,s2), (s2, s3), ..." - a, b = tee(iterable) - next(b, None) - return zip(a, b) - def grouper(iterable, n, fillvalue=None): "Collect data into fixed-length chunks or blocks" # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index 702cf0820316b1..df2997e87d494c 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -1024,6 +1024,25 @@ def run(r1, r2): self.assertEqual(next(it), (1, 2)) self.assertRaises(RuntimeError, next, it) + def test_pairwise(self): + self.assertEqual(list(pairwise('')), []) + self.assertEqual(list(pairwise('a')), []) + self.assertEqual(list(pairwise('ab')), + [('a', 'b')]), + self.assertEqual(list(pairwise('abcde')), + [('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e')]) + self.assertEqual(list(pairwise(range(10_000))), + list(zip(range(10_000), range(1, 10_000)))) + + with self.assertRaises(TypeError): + pairwise() # too few arguments + with self.assertRaises(TypeError): + pairwise('abc', 10) # too many arguments + with self.assertRaises(TypeError): + pairwise(iterable='abc') # keyword arguments + with self.assertRaises(TypeError): + pairwise(None) # non-iterable argument + def test_product(self): for args, result in [ ([], [()]), # zero iterables @@ -1787,6 +1806,10 @@ def test_islice(self): a = [] self.makecycle(islice([a]*2, None), a) + def test_pairwise(self): + a = [] + self.makecycle(pairwise([a]*5), a) + def test_permutations(self): a = [] self.makecycle(permutations([1,2,a,3], 3), a) @@ -1995,6 +2018,17 @@ def test_islice(self): self.assertRaises(TypeError, islice, N(s), 10) self.assertRaises(ZeroDivisionError, list, islice(E(s), 10)) + def test_pairwise(self): + for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)): + for g in (G, I, Ig, S, L, R): + seq = list(g(s)) + expected = list(zip(seq, seq[1:])) + actual = list(pairwise(g(s))) + self.assertEqual(actual, expected) + self.assertRaises(TypeError, pairwise, X(s)) + self.assertRaises(TypeError, pairwise, N(s)) + self.assertRaises(ZeroDivisionError, list, pairwise(E(s))) + def test_starmap(self): for s in (range(10), range(0), range(100), (7,11), range(20,50,5)): for g in (G, I, Ig, S, L, R): @@ -2312,15 +2346,6 @@ def test_permutations_sizeof(self): ... else: ... return starmap(func, repeat(args, times)) ->>> def pairwise(iterable): -... "s -> (s0,s1), (s1,s2), (s2, s3), ..." -... a, b = tee(iterable) -... try: -... next(b) -... except StopIteration: -... pass -... return zip(a, b) - >>> def grouper(n, iterable, fillvalue=None): ... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" ... args = [iter(iterable)] * n @@ -2451,15 +2476,6 @@ def test_permutations_sizeof(self): >>> take(5, map(int, repeatfunc(random.random))) [0, 0, 0, 0, 0] ->>> list(pairwise('abcd')) -[('a', 'b'), ('b', 'c'), ('c', 'd')] - ->>> list(pairwise([])) -[] - ->>> list(pairwise('a')) -[] - >>> list(islice(pad_none('abc'), 0, 6)) ['a', 'b', 'c', None, None, None] diff --git a/Misc/NEWS.d/next/Library/2020-11-28-22-52-57.bpo-38200.DuWGlW.rst b/Misc/NEWS.d/next/Library/2020-11-28-22-52-57.bpo-38200.DuWGlW.rst new file mode 100644 index 00000000000000..b4bc5551b2532e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-28-22-52-57.bpo-38200.DuWGlW.rst @@ -0,0 +1 @@ +Added itertools.pairwise() diff --git a/Modules/clinic/itertoolsmodule.c.h b/Modules/clinic/itertoolsmodule.c.h index c1192bbcb0d797..82729eeb56bce9 100644 --- a/Modules/clinic/itertoolsmodule.c.h +++ b/Modules/clinic/itertoolsmodule.c.h @@ -2,6 +2,37 @@ preserve [clinic start generated code]*/ +PyDoc_STRVAR(pairwise_new__doc__, +"pairwise(iterable, /)\n" +"--\n" +"\n" +"Return an iterator of overlapping pairs taken from the input iterator.\n" +"\n" +" s -> (s0,s1), (s1,s2), (s2, s3), ..."); + +static PyObject * +pairwise_new_impl(PyTypeObject *type, PyObject *iterable); + +static PyObject * +pairwise_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyObject *return_value = NULL; + PyObject *iterable; + + if ((type == &pairwise_type) && + !_PyArg_NoKeywords("pairwise", kwargs)) { + goto exit; + } + if (!_PyArg_CheckPositional("pairwise", PyTuple_GET_SIZE(args), 1, 1)) { + goto exit; + } + iterable = PyTuple_GET_ITEM(args, 0); + return_value = pairwise_new_impl(type, iterable); + +exit: + return return_value; +} + PyDoc_STRVAR(itertools_groupby__doc__, "groupby(iterable, key=None)\n" "--\n" @@ -627,4 +658,4 @@ itertools_count(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=d7f58dc477814b45 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=889c4afc3b13574f input=a9049054013a1b77]*/ diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index ce8b4347ef220b..7144856c352f81 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -1,4 +1,5 @@ + #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_long.h" // _PyLong_GetZero() @@ -27,8 +28,9 @@ class itertools.accumulate "accumulateobject *" "&accumulate_type" class itertools.compress "compressobject *" "&compress_type" class itertools.filterfalse "filterfalseobject *" "&filterfalse_type" class itertools.count "countobject *" "&count_type" +class itertools.pairwise "pairwiseobject *" "&pairwise_type" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ea05c93c6d94726a]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=6498ed21fbe1bf94]*/ static PyTypeObject groupby_type; static PyTypeObject _grouper_type; @@ -45,9 +47,140 @@ static PyTypeObject accumulate_type; static PyTypeObject compress_type; static PyTypeObject filterfalse_type; static PyTypeObject count_type; +static PyTypeObject pairwise_type; #include "clinic/itertoolsmodule.c.h" +/* pairwise object ***********************************************************/ + +typedef struct { + PyObject_HEAD + PyObject *it; + PyObject *old; +} pairwiseobject; + +/*[clinic input] +@classmethod +itertools.pairwise.__new__ as pairwise_new + iterable: object + / +Return an iterator of overlapping pairs taken from the input iterator. + + s -> (s0,s1), (s1,s2), (s2, s3), ... + +[clinic start generated code]*/ + +static PyObject * +pairwise_new_impl(PyTypeObject *type, PyObject *iterable) +/*[clinic end generated code: output=9f0267062d384456 input=6e7c3cddb431a8d6]*/ +{ + PyObject *it; + pairwiseobject *po; + + it = PyObject_GetIter(iterable); + if (it == NULL) { + return NULL; + } + po = (pairwiseobject *)type->tp_alloc(type, 0); + if (po == NULL) { + Py_DECREF(it); + return NULL; + } + po->it = it; + po->old = NULL; + return (PyObject *)po; +} + +static void +pairwise_dealloc(pairwiseobject *po) +{ + PyObject_GC_UnTrack(po); + Py_XDECREF(po->it); + Py_XDECREF(po->old); + Py_TYPE(po)->tp_free(po); +} + +static int +pairwise_traverse(pairwiseobject *po, visitproc visit, void *arg) +{ + Py_VISIT(po->it); + Py_VISIT(po->old); + return 0; +} + +static PyObject * +pairwise_next(pairwiseobject *po) +{ + PyObject *it = po->it; + PyObject *old = po->old; + PyObject *new, *result; + + if (it == NULL) { + return NULL; + } + if (old == NULL) { + po->old = old = (*Py_TYPE(it)->tp_iternext)(it); + if (old == NULL) { + Py_CLEAR(po->it); + return NULL; + } + } + new = (*Py_TYPE(it)->tp_iternext)(it); + if (new == NULL) { + Py_CLEAR(po->it); + Py_CLEAR(po->old); + return NULL; + } + /* Future optimization: Reuse the result tuple as we do in enumerate() */ + result = PyTuple_Pack(2, old, new); + Py_SETREF(po->old, new); + return result; +} + +static PyTypeObject pairwise_type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "itertools.pairwise", /* tp_name */ + sizeof(pairwiseobject), /* tp_basicsize */ + 0, /* tp_itemsize */ + /* methods */ + (destructor)pairwise_dealloc, /* tp_dealloc */ + 0, /* tp_vectorcall_offset */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_as_async */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_BASETYPE, /* tp_flags */ + pairwise_new__doc__, /* tp_doc */ + (traverseproc)pairwise_traverse, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + PyObject_SelfIter, /* tp_iter */ + (iternextfunc)pairwise_next, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + PyType_GenericAlloc, /* tp_alloc */ + pairwise_new, /* tp_new */ + PyObject_GC_Del, /* tp_free */ +}; + /* groupby object ************************************************************/ @@ -4666,6 +4799,7 @@ groupby(iterable[, keyfunc]) --> sub-iterators grouped by value of keyfunc(v)\n\ filterfalse(pred, seq) --> elements of seq where pred(elem) is False\n\ islice(seq, [start,] stop [, step]) --> elements from\n\ seq[start:stop:step]\n\ +pairwise(s) --> (s[0],s[1]), (s[1],s[2]), (s[2], s[3]), ...\n\ starmap(fun, seq) --> fun(*seq[0]), fun(*seq[1]), ...\n\ tee(it, n=2) --> (it1, it2 , ... itn) splits one iterator into n\n\ takewhile(pred, seq) --> seq[0], seq[1], until pred fails\n\ @@ -4695,6 +4829,7 @@ itertoolsmodule_exec(PyObject *m) &filterfalse_type, &count_type, &ziplongest_type, + &pairwise_type, &permutations_type, &product_type, &repeat_type, From 56d84c97172a0307e81eab6046c33453cc2764fb Mon Sep 17 00:00:00 2001 From: pxinwr Date: Tue, 1 Dec 2020 16:20:50 +0800 Subject: [PATCH 0692/1261] bpo-31904: Fix fifo test cases for VxWorks (GH-20254) --- Lib/test/test_posix.py | 13 +++++++++---- Lib/test/test_stat.py | 10 ++++++++-- .../Tests/2020-05-20-14-28-48.bpo-31904.yJik6k.rst | 1 + 3 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-05-20-14-28-48.bpo-31904.yJik6k.rst diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index a522717751ac17..18afbef082bffc 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -642,12 +642,17 @@ def test_stat(self): @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()") def test_mkfifo(self): - os_helper.unlink(os_helper.TESTFN) + if sys.platform == "vxworks": + fifo_path = os.path.join("/fifos/", os_helper.TESTFN) + else: + fifo_path = os_helper.TESTFN + os_helper.unlink(fifo_path) + self.addCleanup(os_helper.unlink, fifo_path) try: - posix.mkfifo(os_helper.TESTFN, stat.S_IRUSR | stat.S_IWUSR) + posix.mkfifo(fifo_path, stat.S_IRUSR | stat.S_IWUSR) except PermissionError as e: self.skipTest('posix.mkfifo(): %s' % e) - self.assertTrue(stat.S_ISFIFO(posix.stat(os_helper.TESTFN).st_mode)) + self.assertTrue(stat.S_ISFIFO(posix.stat(fifo_path).st_mode)) @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'), "don't have mknod()/S_IFIFO") @@ -1929,7 +1934,7 @@ def test_posix_spawnp(self): class TestPosixWeaklinking(unittest.TestCase): # These test cases verify that weak linking support on macOS works # as expected. These cases only test new behaviour introduced by weak linking, - # regular behaviour is tested by the normal test cases. + # regular behaviour is tested by the normal test cases. # # See the section on Weak Linking in Mac/README.txt for more information. def setUp(self): diff --git a/Lib/test/test_stat.py b/Lib/test/test_stat.py index 83d09e17f93c56..2e1e2c349c8d09 100644 --- a/Lib/test/test_stat.py +++ b/Lib/test/test_stat.py @@ -2,6 +2,7 @@ import os import socket import sys +from test.support import os_helper from test.support import socket_helper from test.support.import_helper import import_fresh_module from test.support.os_helper import TESTFN @@ -173,11 +174,16 @@ def test_link(self): @unittest.skipUnless(hasattr(os, 'mkfifo'), 'os.mkfifo not available') def test_fifo(self): + if sys.platform == "vxworks": + fifo_path = os.path.join("/fifos/", TESTFN) + else: + fifo_path = TESTFN + self.addCleanup(os_helper.unlink, fifo_path) try: - os.mkfifo(TESTFN, 0o700) + os.mkfifo(fifo_path, 0o700) except PermissionError as e: self.skipTest('os.mkfifo(): %s' % e) - st_mode, modestr = self.get_mode() + st_mode, modestr = self.get_mode(fifo_path) self.assertEqual(modestr, 'prwx------') self.assertS_IS("FIFO", st_mode) diff --git a/Misc/NEWS.d/next/Tests/2020-05-20-14-28-48.bpo-31904.yJik6k.rst b/Misc/NEWS.d/next/Tests/2020-05-20-14-28-48.bpo-31904.yJik6k.rst new file mode 100644 index 00000000000000..40caa88d689a22 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-05-20-14-28-48.bpo-31904.yJik6k.rst @@ -0,0 +1 @@ +Fix fifo test cases for VxWorks RTOS. From 10565f1b5ce5340d95830bf69267c4bcbcffacfb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 1 Dec 2020 09:56:42 +0100 Subject: [PATCH 0693/1261] bpo-42519: Replace PyMem_MALLOC() with PyMem_Malloc() (GH-23586) No longer use deprecated aliases to functions: * Replace PyMem_MALLOC() with PyMem_Malloc() * Replace PyMem_REALLOC() with PyMem_Realloc() * Replace PyMem_FREE() with PyMem_Free() * Replace PyMem_Del() with PyMem_Free() * Replace PyMem_DEL() with PyMem_Free() Modify also the PyMem_DEL() macro to use directly PyMem_Free(). --- Include/objimpl.h | 6 +-- Include/pymem.h | 32 +++++----------- Modules/_localemodule.c | 4 +- Modules/_pickle.c | 24 ++++++------ Modules/_sre.c | 8 ++-- Modules/_ssl.c | 6 +-- Modules/_struct.c | 6 +-- Modules/_testcapimodule.c | 4 +- Modules/_threadmodule.c | 6 +-- Modules/_tkinter.c | 8 ++-- Modules/arraymodule.c | 4 +- Modules/cjkcodecs/multibytecodec.c | 4 +- Modules/posixmodule.c | 31 +++++++-------- Modules/selectmodule.c | 18 ++++----- Objects/capsule.c | 4 +- Objects/codeobject.c | 16 ++++---- Objects/dictobject.c | 2 +- Objects/listobject.c | 24 ++++++------ Objects/moduleobject.c | 6 +-- Objects/odictobject.c | 10 ++--- Objects/setobject.c | 6 +-- Objects/stringlib/join.h | 2 +- Objects/structseq.c | 6 +-- Objects/typeobject.c | 6 +-- Objects/unicodeobject.c | 24 ++++++------ PC/winreg.c | 2 +- Parser/string_parser.c | 2 +- Parser/tokenizer.c | 60 +++++++++++++++--------------- Python/bltinmodule.c | 2 +- Python/getargs.c | 4 +- Python/marshal.c | 18 ++++----- Python/pystrtod.c | 4 +- Python/traceback.c | 4 +- 33 files changed, 175 insertions(+), 188 deletions(-) diff --git a/Include/objimpl.h b/Include/objimpl.h index af537175bfed85..464b1bf93ba2c9 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -102,7 +102,7 @@ PyAPI_FUNC(void *) PyObject_Realloc(void *ptr, size_t new_size); PyAPI_FUNC(void) PyObject_Free(void *ptr); -/* Macros */ +// Deprecated aliases only kept for backward compatibility. #define PyObject_MALLOC PyObject_Malloc #define PyObject_REALLOC PyObject_Realloc #define PyObject_FREE PyObject_Free @@ -138,8 +138,8 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); #define PyObject_NewVar(type, typeobj, n) \ ( (type *) _PyObject_NewVar((typeobj), (n)) ) -// Alias to PyObject_New(). In Python 3.8, PyObject_NEW() called directly -// PyObject_MALLOC() with _PyObject_VAR_SIZE(). +// Alias to PyObject_NewVar(). In Python 3.8, PyObject_NEW_VAR() called +// directly PyObject_MALLOC() with _PyObject_VAR_SIZE(). #define PyObject_NEW_VAR(type, typeobj, n) PyObject_NewVar(type, typeobj, n) diff --git a/Include/pymem.h b/Include/pymem.h index 607feb9484f24f..5b9dd4219948ab 100644 --- a/Include/pymem.h +++ b/Include/pymem.h @@ -53,18 +53,6 @@ PyAPI_FUNC(void *) PyMem_Malloc(size_t size); PyAPI_FUNC(void *) PyMem_Realloc(void *ptr, size_t new_size); PyAPI_FUNC(void) PyMem_Free(void *ptr); -/* Macros. */ - -/* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL - for malloc(0), which would be treated as an error. Some platforms - would return a pointer with no memory behind it, which would break - pymalloc. To solve these problems, allocate an extra byte. */ -/* Returns NULL to indicate error if a negative size or size larger than - Py_ssize_t can represent is supplied. Helps prevents security holes. */ -#define PyMem_MALLOC(n) PyMem_Malloc(n) -#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n) -#define PyMem_FREE(p) PyMem_Free(p) - /* * Type-oriented memory interface * ============================== @@ -78,9 +66,6 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr); #define PyMem_New(type, n) \ ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ ( (type *) PyMem_Malloc((n) * sizeof(type)) ) ) -#define PyMem_NEW(type, n) \ - ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ - ( (type *) PyMem_MALLOC((n) * sizeof(type)) ) ) /* * The value of (p) is always clobbered by this macro regardless of success. @@ -91,15 +76,16 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr); #define PyMem_Resize(p, type, n) \ ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) -#define PyMem_RESIZE(p, type, n) \ - ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ - (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) -/* PyMem{Del,DEL} are left over from ancient days, and shouldn't be used - * anymore. They're just confusing aliases for PyMem_{Free,FREE} now. - */ -#define PyMem_Del PyMem_Free -#define PyMem_DEL PyMem_FREE + +// Deprecated aliases only kept for backward compatibility. +#define PyMem_MALLOC(n) PyMem_Malloc(n) +#define PyMem_NEW(type, n) PyMem_New(type, n) +#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n) +#define PyMem_RESIZE(p, type, n) PyMem_Resize(p, type, n) +#define PyMem_FREE(p) PyMem_Free(p) +#define PyMem_Del(p) PyMem_Free(p) +#define PyMem_DEL(p) PyMem_Free(p) #ifndef Py_LIMITED_API diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 869e3f80f3f9e6..564f5598edcc66 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -370,8 +370,8 @@ _locale_strcoll_impl(PyObject *module, PyObject *os1, PyObject *os2) result = PyLong_FromLong(wcscoll(ws1, ws2)); done: /* Deallocate everything. */ - if (ws1) PyMem_FREE(ws1); - if (ws2) PyMem_FREE(ws2); + if (ws1) PyMem_Free(ws1); + if (ws2) PyMem_Free(ws2); return result; } #endif diff --git a/Modules/_pickle.c b/Modules/_pickle.c index ed8afefe4c74c8..7ecaeea18c611a 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -442,7 +442,7 @@ Pdata_dealloc(Pdata *self) while (--i >= 0) { Py_DECREF(self->data[i]); } - PyMem_FREE(self->data); + PyMem_Free(self->data); PyObject_Del(self); } @@ -465,7 +465,7 @@ Pdata_New(void) self->mark_set = 0; self->fence = 0; self->allocated = 8; - self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *)); + self->data = PyMem_Malloc(self->allocated * sizeof(PyObject *)); if (self->data) return (PyObject *)self; Py_DECREF(self); @@ -726,7 +726,7 @@ static PyTypeObject Unpickler_Type; static PyMemoTable * PyMemoTable_New(void) { - PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable)); + PyMemoTable *memo = PyMem_Malloc(sizeof(PyMemoTable)); if (memo == NULL) { PyErr_NoMemory(); return NULL; @@ -735,9 +735,9 @@ PyMemoTable_New(void) memo->mt_used = 0; memo->mt_allocated = MT_MINSIZE; memo->mt_mask = MT_MINSIZE - 1; - memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry)); + memo->mt_table = PyMem_Malloc(MT_MINSIZE * sizeof(PyMemoEntry)); if (memo->mt_table == NULL) { - PyMem_FREE(memo); + PyMem_Free(memo); PyErr_NoMemory(); return NULL; } @@ -758,10 +758,10 @@ PyMemoTable_Copy(PyMemoTable *self) new->mt_mask = self->mt_mask; /* The table we get from _New() is probably smaller than we wanted. Free it and allocate one that's the right size. */ - PyMem_FREE(new->mt_table); + PyMem_Free(new->mt_table); new->mt_table = PyMem_NEW(PyMemoEntry, self->mt_allocated); if (new->mt_table == NULL) { - PyMem_FREE(new); + PyMem_Free(new); PyErr_NoMemory(); return NULL; } @@ -800,8 +800,8 @@ PyMemoTable_Del(PyMemoTable *self) return; PyMemoTable_Clear(self); - PyMem_FREE(self->mt_table); - PyMem_FREE(self); + PyMem_Free(self->mt_table); + PyMem_Free(self); } /* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup() @@ -880,7 +880,7 @@ _PyMemoTable_ResizeTable(PyMemoTable *self, size_t min_size) } /* Deallocate the old table. */ - PyMem_FREE(oldtable); + PyMem_Free(oldtable); return 0; } @@ -1582,7 +1582,7 @@ _Unpickler_MemoCleanup(UnpicklerObject *self) while (--i >= 0) { Py_XDECREF(memo[i]); } - PyMem_FREE(memo); + PyMem_Free(memo); } static UnpicklerObject * @@ -7544,7 +7544,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored for (size_t i = new_memo_size - 1; i != SIZE_MAX; i--) { Py_XDECREF(new_memo[i]); } - PyMem_FREE(new_memo); + PyMem_Free(new_memo); } return -1; } diff --git a/Modules/_sre.c b/Modules/_sre.c index 0a5ca60097af36..c67f38d75b8091 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -197,7 +197,7 @@ static void data_stack_dealloc(SRE_STATE* state) { if (state->data_stack) { - PyMem_FREE(state->data_stack); + PyMem_Free(state->data_stack); state->data_stack = NULL; } state->data_stack_size = state->data_stack_base = 0; @@ -213,7 +213,7 @@ data_stack_grow(SRE_STATE* state, Py_ssize_t size) void* stack; cursize = minsize+minsize/4+1024; TRACE(("allocate/grow stack %zd\n", cursize)); - stack = PyMem_REALLOC(state->data_stack, cursize); + stack = PyMem_Realloc(state->data_stack, cursize); if (!stack) { data_stack_dealloc(state); return SRE_ERROR_MEMORY; @@ -472,7 +472,7 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string, /* We add an explicit cast here because MSVC has a bug when compiling C code where it believes that `const void**` cannot be safely casted to `void*`, see bpo-39943 for details. */ - PyMem_Del((void*) state->mark); + PyMem_Free((void*) state->mark); state->mark = NULL; if (state->buffer.buf) PyBuffer_Release(&state->buffer); @@ -487,7 +487,7 @@ state_fini(SRE_STATE* state) Py_XDECREF(state->string); data_stack_dealloc(state); /* See above PyMem_Del for why we explicitly cast here. */ - PyMem_Del((void*) state->mark); + PyMem_Free((void*) state->mark); state->mark = NULL; } diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 6f799ee6618520..87fe3a16078fab 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -3306,10 +3306,10 @@ context_dealloc(PySSLContext *self) context_clear(self); SSL_CTX_free(self->ctx); #if HAVE_NPN - PyMem_FREE(self->npn_protocols); + PyMem_Free(self->npn_protocols); #endif #if HAVE_ALPN - PyMem_FREE(self->alpn_protocols); + PyMem_Free(self->alpn_protocols); #endif Py_TYPE(self)->tp_free(self); Py_DECREF(tp); @@ -3510,7 +3510,7 @@ _ssl__SSLContext__set_alpn_protocols_impl(PySSLContext *self, return NULL; } - PyMem_FREE(self->alpn_protocols); + PyMem_Free(self->alpn_protocols); self->alpn_protocols = PyMem_Malloc(protos->len); if (!self->alpn_protocols) return PyErr_NoMemory(); diff --git a/Modules/_struct.c b/Modules/_struct.c index eeccc17965468c..c95c76f8ae039e 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -1373,14 +1373,14 @@ prepare_s(PyStructObject *self) self->s_size = size; self->s_len = len; - codes = PyMem_MALLOC((ncodes + 1) * sizeof(formatcode)); + codes = PyMem_Malloc((ncodes + 1) * sizeof(formatcode)); if (codes == NULL) { PyErr_NoMemory(); return -1; } /* Free any s_codes value left over from a previous initialization. */ if (self->s_codes != NULL) - PyMem_FREE(self->s_codes); + PyMem_Free(self->s_codes); self->s_codes = codes; s = fmt; @@ -1502,7 +1502,7 @@ s_dealloc(PyStructObject *s) if (s->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *)s); if (s->s_codes != NULL) { - PyMem_FREE(s->s_codes); + PyMem_Free(s->s_codes); } Py_XDECREF(s->s_format); freefunc free_func = PyType_GetSlot(Py_TYPE(s), Py_tp_free); diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index a1d4c929b02058..916d10a1e413ba 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -1988,12 +1988,12 @@ unicode_asucs4(PyObject *self, PyObject *args) buffer[str_len] = 0xffffU; if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) { - PyMem_FREE(buffer); + PyMem_Free(buffer); return NULL; } result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len); - PyMem_FREE(buffer); + PyMem_Free(buffer); return result; } diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 56ed8a2e2d3f14..dcefa8dbaa91b2 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1056,7 +1056,7 @@ t_bootstrap(void *boot_raw) Py_DECREF(boot->func); Py_DECREF(boot->args); Py_XDECREF(boot->keyw); - PyMem_DEL(boot_raw); + PyMem_Free(boot_raw); tstate->interp->num_threads--; PyThreadState_Clear(tstate); _PyThreadState_DeleteCurrent(tstate); @@ -1107,7 +1107,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) boot->tstate = _PyThreadState_Prealloc(boot->interp); boot->runtime = runtime; if (boot->tstate == NULL) { - PyMem_DEL(boot); + PyMem_Free(boot); return PyErr_NoMemory(); } Py_INCREF(func); @@ -1121,7 +1121,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) Py_DECREF(args); Py_XDECREF(keyw); PyThreadState_Clear(boot->tstate); - PyMem_DEL(boot); + PyMem_Free(boot); return NULL; } return PyLong_FromUnsignedLong(ident); diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index b30141d4497bda..24aeb3da94c70b 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -2472,7 +2472,7 @@ PythonCmdDelete(ClientData clientData) ENTER_PYTHON Py_XDECREF(data->self); Py_XDECREF(data->func); - PyMem_DEL(data); + PyMem_Free(data); LEAVE_PYTHON } @@ -2545,7 +2545,7 @@ _tkinter_tkapp_createcommand_impl(TkappObject *self, const char *name, CommandEvent *ev = (CommandEvent*)attemptckalloc(sizeof(CommandEvent)); if (ev == NULL) { PyErr_NoMemory(); - PyMem_DEL(data); + PyMem_Free(data); return NULL; } ev->ev.proc = (Tcl_EventProc*)Tkapp_CommandProc; @@ -2568,7 +2568,7 @@ _tkinter_tkapp_createcommand_impl(TkappObject *self, const char *name, } if (err) { PyErr_SetString(Tkinter_TclError, "can't create Tcl command"); - PyMem_DEL(data); + PyMem_Free(data); return NULL; } @@ -2666,7 +2666,7 @@ DeleteFHCD(int id) *pp = p->next; Py_XDECREF(p->func); Py_XDECREF(p->file); - PyMem_DEL(p); + PyMem_Free(p); } else pp = &p->next; diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 2ba2ff43aa8b8a..6583e666119590 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -133,7 +133,7 @@ array_resize(arrayobject *self, Py_ssize_t newsize) } if (newsize == 0) { - PyMem_FREE(self->ob_item); + PyMem_Free(self->ob_item); self->ob_item = NULL; Py_SET_SIZE(self, 0); self->allocated = 0; @@ -652,7 +652,7 @@ array_dealloc(arrayobject *op) if (op->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) op); if (op->ob_item != NULL) - PyMem_DEL(op->ob_item); + PyMem_Free(op->ob_item); Py_TYPE(op)->tp_free((PyObject *)op); } diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 86402768b6ee67..37a80a781da6fb 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -1191,13 +1191,13 @@ _multibytecodec_MultibyteIncrementalDecoder_decode_impl(MultibyteIncrementalDeco goto errorexit; if (wdata != data) - PyMem_Del(wdata); + PyMem_Free(wdata); Py_XDECREF(buf.excobj); return res; errorexit: if (wdata != NULL && wdata != data) - PyMem_Del(wdata); + PyMem_Free(wdata); Py_XDECREF(buf.excobj); _PyUnicodeWriter_Dealloc(&buf.writer); return NULL; diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index efa96531d49c1c..3e6e6585b880c0 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -5480,7 +5480,7 @@ free_string_array(EXECV_CHAR **array, Py_ssize_t count) Py_ssize_t i; for (i = 0; i < count; i++) PyMem_Free(array[i]); - PyMem_DEL(array); + PyMem_Free(array); } static int @@ -6510,9 +6510,10 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv, res = Py_BuildValue(_Py_PARSE_INTPTR, spawnval); fail_2: - while (--envc >= 0) - PyMem_DEL(envlist[envc]); - PyMem_DEL(envlist); + while (--envc >= 0) { + PyMem_Free(envlist[envc]); + } + PyMem_Free(envlist); fail_1: free_string_array(argvlist, lastarg); fail_0: @@ -7444,7 +7445,7 @@ os_getgrouplist_impl(PyObject *module, const char *user, gid_t basegid) list = PyList_New(ngroups); if (list == NULL) { - PyMem_Del(groups); + PyMem_Free(groups); return NULL; } @@ -7456,13 +7457,13 @@ os_getgrouplist_impl(PyObject *module, const char *user, gid_t basegid) #endif if (o == NULL) { Py_DECREF(list); - PyMem_Del(groups); + PyMem_Free(groups); return NULL; } PyList_SET_ITEM(list, i, o); } - PyMem_Del(groups); + PyMem_Free(groups); return list; } @@ -9407,7 +9408,7 @@ iov_setup(struct iovec **iov, Py_buffer **buf, PyObject *seq, Py_ssize_t cnt, in *buf = PyMem_New(Py_buffer, cnt); if (*buf == NULL) { - PyMem_Del(*iov); + PyMem_Free(*iov); PyErr_NoMemory(); return -1; } @@ -9427,11 +9428,11 @@ iov_setup(struct iovec **iov, Py_buffer **buf, PyObject *seq, Py_ssize_t cnt, in return 0; fail: - PyMem_Del(*iov); + PyMem_Free(*iov); for (j = 0; j < i; j++) { PyBuffer_Release(&(*buf)[j]); } - PyMem_Del(*buf); + PyMem_Free(*buf); return -1; } @@ -9439,11 +9440,11 @@ static void iov_cleanup(struct iovec *iov, Py_buffer *buf, int cnt) { int i; - PyMem_Del(iov); + PyMem_Free(iov); for (i = 0; i < cnt; i++) { PyBuffer_Release(&buf[i]); } - PyMem_Del(buf); + PyMem_Free(buf); } #endif @@ -12815,7 +12816,7 @@ os_listxattr_impl(PyObject *module, path_t *path, int follow_symlinks) path_error(path); break; } - buffer = PyMem_MALLOC(buffer_size); + buffer = PyMem_Malloc(buffer_size); if (!buffer) { PyErr_NoMemory(); break; @@ -12832,7 +12833,7 @@ os_listxattr_impl(PyObject *module, path_t *path, int follow_symlinks) if (length < 0) { if (errno == ERANGE) { - PyMem_FREE(buffer); + PyMem_Free(buffer); buffer = NULL; continue; } @@ -12870,7 +12871,7 @@ os_listxattr_impl(PyObject *module, path_t *path, int follow_symlinks) } exit: if (buffer) - PyMem_FREE(buffer); + PyMem_Free(buffer); return result; } #endif /* USE_XATTRS */ diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 693a833caea77b..0b9f20d6bbd9da 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -294,9 +294,9 @@ select_select_impl(PyObject *module, PyObject *rlist, PyObject *wlist, wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1); efd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1); if (rfd2obj == NULL || wfd2obj == NULL || efd2obj == NULL) { - if (rfd2obj) PyMem_DEL(rfd2obj); - if (wfd2obj) PyMem_DEL(wfd2obj); - if (efd2obj) PyMem_DEL(efd2obj); + if (rfd2obj) PyMem_Free(rfd2obj); + if (wfd2obj) PyMem_Free(wfd2obj); + if (efd2obj) PyMem_Free(efd2obj); return PyErr_NoMemory(); } #endif /* SELECT_USES_HEAP */ @@ -381,9 +381,9 @@ select_select_impl(PyObject *module, PyObject *rlist, PyObject *wlist, reap_obj(wfd2obj); reap_obj(efd2obj); #ifdef SELECT_USES_HEAP - PyMem_DEL(rfd2obj); - PyMem_DEL(wfd2obj); - PyMem_DEL(efd2obj); + PyMem_Free(rfd2obj); + PyMem_Free(wfd2obj); + PyMem_Free(efd2obj); #endif /* SELECT_USES_HEAP */ return ret; } @@ -740,7 +740,7 @@ poll_dealloc(pollObject *self) { PyObject* type = (PyObject *)Py_TYPE(self); if (self->ufds != NULL) - PyMem_DEL(self->ufds); + PyMem_Free(self->ufds); Py_XDECREF(self->dict); PyObject_Del(self); Py_DECREF(type); @@ -1106,7 +1106,7 @@ newDevPollObject(PyObject *module) self = PyObject_New(devpollObject, get_select_state(module)->devpoll_Type); if (self == NULL) { close(fd_devpoll); - PyMem_DEL(fds); + PyMem_Free(fds); return NULL; } self->fd_devpoll = fd_devpoll; @@ -1129,7 +1129,7 @@ devpoll_dealloc(devpollObject *self) { PyObject *type = (PyObject *)Py_TYPE(self); (void)devpoll_internal_close(self); - PyMem_DEL(self->fds); + PyMem_Free(self->fds); PyObject_Del(self); Py_DECREF(type); } diff --git a/Objects/capsule.c b/Objects/capsule.c index ed24cc1d6a2eb2..a2ff642526cd05 100644 --- a/Objects/capsule.c +++ b/Objects/capsule.c @@ -198,7 +198,7 @@ PyCapsule_Import(const char *name, int no_block) void *return_value = NULL; char *trace; size_t name_length = (strlen(name) + 1) * sizeof(char); - char *name_dup = (char *)PyMem_MALLOC(name_length); + char *name_dup = (char *)PyMem_Malloc(name_length); if (!name_dup) { return PyErr_NoMemory(); @@ -247,7 +247,7 @@ PyCapsule_Import(const char *name, int no_block) EXIT: Py_XDECREF(object); if (name_dup) { - PyMem_FREE(name_dup); + PyMem_Free(name_dup); } return return_value; } diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 7b224cc145e47f..0257295f1e996c 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -213,7 +213,7 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, PyObject *arg = PyTuple_GET_ITEM(varnames, j); int cmp = PyUnicode_Compare(cell, arg); if (cmp == -1 && PyErr_Occurred()) { - PyMem_FREE(cell2arg); + PyMem_Free(cell2arg); return NULL; } if (cmp == 0) { @@ -224,14 +224,14 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, } } if (!used_cell2arg) { - PyMem_FREE(cell2arg); + PyMem_Free(cell2arg); cell2arg = NULL; } } co = PyObject_New(PyCodeObject, &PyCode_Type); if (co == NULL) { if (cell2arg) - PyMem_FREE(cell2arg); + PyMem_Free(cell2arg); return NULL; } co->co_argcount = argcount; @@ -314,12 +314,12 @@ _PyCode_InitOpcache(PyCodeObject *co) if (opts) { co->co_opcache = (_PyOpcache *)PyMem_Calloc(opts, sizeof(_PyOpcache)); if (co->co_opcache == NULL) { - PyMem_FREE(co->co_opcache_map); + PyMem_Free(co->co_opcache_map); return -1; } } else { - PyMem_FREE(co->co_opcache_map); + PyMem_Free(co->co_opcache_map); co->co_opcache_map = NULL; co->co_opcache = NULL; } @@ -631,10 +631,10 @@ static void code_dealloc(PyCodeObject *co) { if (co->co_opcache != NULL) { - PyMem_FREE(co->co_opcache); + PyMem_Free(co->co_opcache); } if (co->co_opcache_map != NULL) { - PyMem_FREE(co->co_opcache_map); + PyMem_Free(co->co_opcache_map); } co->co_opcache_flag = 0; co->co_opcache_size = 0; @@ -664,7 +664,7 @@ code_dealloc(PyCodeObject *co) Py_XDECREF(co->co_name); Py_XDECREF(co->co_linetable); if (co->co_cell2arg != NULL) - PyMem_FREE(co->co_cell2arg); + PyMem_Free(co->co_cell2arg); if (co->co_zombieframe != NULL) PyObject_GC_Del(co->co_zombieframe); if (co->co_weakreflist != NULL) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index faa8696153cb8d..ee1a9d1d7e71ee 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -640,7 +640,7 @@ free_keys_object(PyDictKeysObject *keys) } #define new_values(size) PyMem_NEW(PyObject *, size) -#define free_values(values) PyMem_FREE(values) +#define free_values(values) PyMem_Free(values) /* Consumes a reference to the keys object */ static PyObject * diff --git a/Objects/listobject.c b/Objects/listobject.c index aac87ea1b61c93..ca9df599a0bd44 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -341,7 +341,7 @@ list_dealloc(PyListObject *op) while (--i >= 0) { Py_XDECREF(op->ob_item[i]); } - PyMem_FREE(op->ob_item); + PyMem_Free(op->ob_item); } struct _Py_list_state *state = get_list_state(); #ifdef Py_DEBUG @@ -592,7 +592,7 @@ _list_clear(PyListObject *a) while (--i >= 0) { Py_XDECREF(item[i]); } - PyMem_FREE(item); + PyMem_Free(item); } /* Never fails; the return value can be ignored. Note that there is no guarantee that the list is actually empty @@ -668,7 +668,7 @@ list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) /* If norig == 0, item might be NULL, in which case we may not memcpy from it. */ if (s) { if (s > sizeof(recycle_on_stack)) { - recycle = (PyObject **)PyMem_MALLOC(s); + recycle = (PyObject **)PyMem_Malloc(s); if (recycle == NULL) { PyErr_NoMemory(); goto Error; @@ -706,7 +706,7 @@ list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) result = 0; Error: if (recycle != recycle_on_stack) - PyMem_FREE(recycle); + PyMem_Free(recycle); Py_XDECREF(v_as_SF); return result; #undef b @@ -2230,7 +2230,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) /* Leverage stack space we allocated but won't otherwise use */ keys = &ms.temparray[saved_ob_size+1]; else { - keys = PyMem_MALLOC(sizeof(PyObject *) * saved_ob_size); + keys = PyMem_Malloc(sizeof(PyObject *) * saved_ob_size); if (keys == NULL) { PyErr_NoMemory(); goto keyfunc_fail; @@ -2243,7 +2243,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) for (i=i-1 ; i>=0 ; i--) Py_DECREF(keys[i]); if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2) - PyMem_FREE(keys); + PyMem_Free(keys); goto keyfunc_fail; } } @@ -2414,7 +2414,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) for (i = 0; i < saved_ob_size; i++) Py_DECREF(keys[i]); if (saved_ob_size >= MERGESTATE_TEMP_SIZE/2) - PyMem_FREE(keys); + PyMem_Free(keys); } if (self->allocated != -1 && result != NULL) { @@ -2442,7 +2442,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) while (--i >= 0) { Py_XDECREF(final_ob_item[i]); } - PyMem_FREE(final_ob_item); + PyMem_Free(final_ob_item); } Py_XINCREF(result); return result; @@ -2908,7 +2908,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) } garbage = (PyObject**) - PyMem_MALLOC(slicelength*sizeof(PyObject*)); + PyMem_Malloc(slicelength*sizeof(PyObject*)); if (!garbage) { PyErr_NoMemory(); return -1; @@ -2949,7 +2949,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) for (i = 0; i < slicelength; i++) { Py_DECREF(garbage[i]); } - PyMem_FREE(garbage); + PyMem_Free(garbage); return res; } @@ -2990,7 +2990,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) } garbage = (PyObject**) - PyMem_MALLOC(slicelength*sizeof(PyObject*)); + PyMem_Malloc(slicelength*sizeof(PyObject*)); if (!garbage) { Py_DECREF(seq); PyErr_NoMemory(); @@ -3011,7 +3011,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) Py_DECREF(garbage[i]); } - PyMem_FREE(garbage); + PyMem_Free(garbage); Py_DECREF(seq); return 0; diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index c3ceb788e8e690..6590387dac531b 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -211,7 +211,7 @@ _PyModule_CreateInitialized(struct PyModuleDef* module, int module_api_version) return NULL; if (module->m_size > 0) { - m->md_state = PyMem_MALLOC(module->m_size); + m->md_state = PyMem_Malloc(module->m_size); if (!m->md_state) { PyErr_NoMemory(); Py_DECREF(m); @@ -377,7 +377,7 @@ PyModule_ExecDef(PyObject *module, PyModuleDef *def) if (md->md_state == NULL) { /* Always set a state pointer; this serves as a marker to skip * multiple initialization (importlib.reload() is no-op) */ - md->md_state = PyMem_MALLOC(def->m_size); + md->md_state = PyMem_Malloc(def->m_size); if (!md->md_state) { PyErr_NoMemory(); return -1; @@ -681,7 +681,7 @@ module_dealloc(PyModuleObject *m) Py_XDECREF(m->md_dict); Py_XDECREF(m->md_name); if (m->md_state != NULL) - PyMem_FREE(m->md_state); + PyMem_Free(m->md_state); Py_TYPE(m)->tp_free((PyObject *)m); } diff --git a/Objects/odictobject.c b/Objects/odictobject.c index b4ac560d235815..83b326b2067a86 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -567,14 +567,14 @@ _odict_resize(PyODictObject *od) i = _odict_get_index_raw(od, _odictnode_KEY(node), _odictnode_HASH(node)); if (i < 0) { - PyMem_FREE(fast_nodes); + PyMem_Free(fast_nodes); return -1; } fast_nodes[i] = node; } /* Replace the old fast nodes table. */ - PyMem_FREE(od->od_fast_nodes); + PyMem_Free(od->od_fast_nodes); od->od_fast_nodes = fast_nodes; od->od_fast_nodes_size = size; od->od_resize_sentinel = ((PyDictObject *)od)->ma_keys; @@ -683,7 +683,7 @@ _odict_add_new_node(PyODictObject *od, PyObject *key, Py_hash_t hash) } /* must not be added yet */ - node = (_ODictNode *)PyMem_MALLOC(sizeof(_ODictNode)); + node = (_ODictNode *)PyMem_Malloc(sizeof(_ODictNode)); if (node == NULL) { Py_DECREF(key); PyErr_NoMemory(); @@ -701,7 +701,7 @@ _odict_add_new_node(PyODictObject *od, PyObject *key, Py_hash_t hash) #define _odictnode_DEALLOC(node) \ do { \ Py_DECREF(_odictnode_KEY(node)); \ - PyMem_FREE((void *)node); \ + PyMem_Free((void *)node); \ } while (0) /* Repeated calls on the same node are no-ops. */ @@ -776,7 +776,7 @@ _odict_clear_nodes(PyODictObject *od) { _ODictNode *node, *next; - PyMem_FREE(od->od_fast_nodes); + PyMem_Free(od->od_fast_nodes); od->od_fast_nodes = NULL; od->od_fast_nodes_size = 0; od->od_resize_sentinel = NULL; diff --git a/Objects/setobject.c b/Objects/setobject.c index af8ee03d831d61..79e84511926e15 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -289,7 +289,7 @@ set_table_resize(PySetObject *so, Py_ssize_t minused) } if (is_oldtable_malloced) - PyMem_DEL(oldtable); + PyMem_Free(oldtable); return 0; } @@ -424,7 +424,7 @@ set_clear_internal(PySetObject *so) } if (table_is_malloced) - PyMem_DEL(table); + PyMem_Free(table); return 0; } @@ -484,7 +484,7 @@ set_dealloc(PySetObject *so) } } if (so->table != so->smalltable) - PyMem_DEL(so->table); + PyMem_Free(so->table); Py_TYPE(so)->tp_free(so); Py_TRASHCAN_END } diff --git a/Objects/stringlib/join.h b/Objects/stringlib/join.h index 53bcbdea7ade9d..62e4c98de7f250 100644 --- a/Objects/stringlib/join.h +++ b/Objects/stringlib/join.h @@ -155,7 +155,7 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) for (i = 0; i < nbufs; i++) PyBuffer_Release(&buffers[i]); if (buffers != static_buffers) - PyMem_FREE(buffers); + PyMem_Free(buffers); return res; } diff --git a/Objects/structseq.c b/Objects/structseq.c index bb28e113978b39..5d71fcff3461a0 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -467,14 +467,14 @@ PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc) type->tp_members = members; if (PyType_Ready(type) < 0) { - PyMem_FREE(members); + PyMem_Free(members); return -1; } Py_INCREF(type); if (initialize_structseq_dict( desc, type->tp_dict, n_members, n_unnamed_members) < 0) { - PyMem_FREE(members); + PyMem_Free(members); Py_DECREF(type); return -1; } @@ -526,7 +526,7 @@ PyStructSequence_NewType(PyStructSequence_Desc *desc) spec.slots = slots; type = (PyTypeObject *)PyType_FromSpecWithBases(&spec, (PyObject *)&PyTuple_Type); - PyMem_FREE(members); + PyMem_Free(members); if (type == NULL) { return NULL; } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 3a6143a8ad6135..fbadd31f1a46c3 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1779,7 +1779,7 @@ pmerge(PyObject *acc, PyObject **to_merge, Py_ssize_t to_merge_size) } out: - PyMem_Del(remain); + PyMem_Free(remain); return res; } @@ -1859,7 +1859,7 @@ mro_implementation(PyTypeObject *type) result = PyList_New(1); if (result == NULL) { - PyMem_Del(to_merge); + PyMem_Free(to_merge); return NULL; } @@ -1869,7 +1869,7 @@ mro_implementation(PyTypeObject *type) Py_CLEAR(result); } - PyMem_Del(to_merge); + PyMem_Free(to_merge); return result; } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 70688c8c013816..ba6d07a67d2da2 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3298,7 +3298,7 @@ PyUnicode_AsWideCharString(PyObject *unicode, *size = buflen; } else if (wcslen(buffer) != (size_t)buflen) { - PyMem_FREE(buffer); + PyMem_Free(buffer); PyErr_SetString(PyExc_ValueError, "embedded null character"); return NULL; @@ -10211,7 +10211,7 @@ case_operation(PyObject *self, PyErr_SetString(PyExc_OverflowError, "string is too long"); return NULL; } - tmp = PyMem_MALLOC(sizeof(Py_UCS4) * 3 * length); + tmp = PyMem_Malloc(sizeof(Py_UCS4) * 3 * length); if (tmp == NULL) return PyErr_NoMemory(); newlength = perform(kind, data, length, tmp, &maxchar); @@ -10235,7 +10235,7 @@ case_operation(PyObject *self, Py_UNREACHABLE(); } leave: - PyMem_FREE(tmp); + PyMem_Free(tmp); return res; } @@ -11050,11 +11050,11 @@ replace(PyObject *self, PyObject *str1, assert(release1 == (buf1 != PyUnicode_DATA(str1))); assert(release2 == (buf2 != PyUnicode_DATA(str2))); if (srelease) - PyMem_FREE((void *)sbuf); + PyMem_Free((void *)sbuf); if (release1) - PyMem_FREE((void *)buf1); + PyMem_Free((void *)buf1); if (release2) - PyMem_FREE((void *)buf2); + PyMem_Free((void *)buf2); assert(_PyUnicode_CheckConsistency(u, 1)); return u; @@ -11064,11 +11064,11 @@ replace(PyObject *self, PyObject *str1, assert(release1 == (buf1 != PyUnicode_DATA(str1))); assert(release2 == (buf2 != PyUnicode_DATA(str2))); if (srelease) - PyMem_FREE((void *)sbuf); + PyMem_Free((void *)sbuf); if (release1) - PyMem_FREE((void *)buf1); + PyMem_Free((void *)buf1); if (release2) - PyMem_FREE((void *)buf2); + PyMem_Free((void *)buf2); return unicode_result_unchanged(self); error: @@ -11076,11 +11076,11 @@ replace(PyObject *self, PyObject *str1, assert(release1 == (buf1 != PyUnicode_DATA(str1))); assert(release2 == (buf2 != PyUnicode_DATA(str2))); if (srelease) - PyMem_FREE((void *)sbuf); + PyMem_Free((void *)sbuf); if (release1) - PyMem_FREE((void *)buf1); + PyMem_Free((void *)buf1); if (release2) - PyMem_FREE((void *)buf2); + PyMem_Free((void *)buf2); return NULL; } diff --git a/PC/winreg.c b/PC/winreg.c index 78c08693a8ace3..fee51ac1bbe0a5 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -1818,7 +1818,7 @@ winreg_SetValueEx_impl(PyObject *module, HKEY key, Py_BEGIN_ALLOW_THREADS rc = RegSetValueExW(key, value_name, 0, type, data, len); Py_END_ALLOW_THREADS - PyMem_DEL(data); + PyMem_Free(data); if (rc != ERROR_SUCCESS) return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValueEx"); diff --git a/Parser/string_parser.c b/Parser/string_parser.c index 8f6433dbcec131..09b8c35106e76a 100644 --- a/Parser/string_parser.c +++ b/Parser/string_parser.c @@ -384,7 +384,7 @@ fstring_compile_expr(Parser *p, const char *expr_start, const char *expr_end, int lines, cols; if (!fstring_find_expr_location(t, str, &lines, &cols)) { - PyMem_FREE(str); + PyMem_Free(str); return NULL; } diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index f3c1d9b20ade11..96539bd556529a 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -51,7 +51,7 @@ static const char* type_comment_prefix = "# type: "; static struct tok_state * tok_new(void) { - struct tok_state *tok = (struct tok_state *)PyMem_MALLOC( + struct tok_state *tok = (struct tok_state *)PyMem_Malloc( sizeof(struct tok_state)); if (tok == NULL) return NULL; @@ -93,7 +93,7 @@ tok_new(void) static char * new_string(const char *s, Py_ssize_t len, struct tok_state *tok) { - char* result = (char *)PyMem_MALLOC(len + 1); + char* result = (char *)PyMem_Malloc(len + 1); if (!result) { tok->done = E_NOMEM; return NULL; @@ -108,7 +108,7 @@ error_ret(struct tok_state *tok) /* XXX */ { tok->decoding_erred = 1; if (tok->fp != NULL && tok->buf != NULL) /* see PyTokenizer_Free */ - PyMem_FREE(tok->buf); + PyMem_Free(tok->buf); tok->buf = tok->cur = tok->inp = NULL; tok->start = NULL; tok->end = NULL; @@ -184,7 +184,7 @@ get_coding_spec(const char *s, char **spec, Py_ssize_t size, struct tok_state *t return 0; q = get_normal_name(r); if (r != q) { - PyMem_FREE(r); + PyMem_Free(r); r = new_string(q, strlen(q), tok); if (!r) return 0; @@ -244,7 +244,7 @@ check_coding_spec(const char* line, Py_ssize_t size, struct tok_state *tok, else { PyErr_Format(PyExc_SyntaxError, "encoding problem: %s", cs); - PyMem_FREE(cs); + PyMem_Free(cs); } } } else { /* then, compare cs with BOM */ @@ -252,7 +252,7 @@ check_coding_spec(const char* line, Py_ssize_t size, struct tok_state *tok, if (!r) PyErr_Format(PyExc_SyntaxError, "encoding problem: %s with BOM", cs); - PyMem_FREE(cs); + PyMem_Free(cs); } return r; } @@ -315,7 +315,7 @@ check_bom(int get_char(struct tok_state *), return 1; } if (tok->encoding != NULL) - PyMem_FREE(tok->encoding); + PyMem_Free(tok->encoding); tok->encoding = new_string("utf-8", 5, tok); if (!tok->encoding) return 0; @@ -620,7 +620,7 @@ translate_newlines(const char *s, int exec_input, struct tok_state *tok) { size_t needed_length = strlen(s) + 2, final_length; char *buf, *current; char c = '\0'; - buf = PyMem_MALLOC(needed_length); + buf = PyMem_Malloc(needed_length); if (buf == NULL) { tok->done = E_NOMEM; return NULL; @@ -651,9 +651,9 @@ translate_newlines(const char *s, int exec_input, struct tok_state *tok) { final_length = current - buf + 1; if (final_length < needed_length && final_length) { /* should never fail */ - char* result = PyMem_REALLOC(buf, final_length); + char* result = PyMem_Realloc(buf, final_length); if (result == NULL) { - PyMem_FREE(buf); + PyMem_Free(buf); } buf = result; } @@ -757,7 +757,7 @@ PyTokenizer_FromUTF8(const char *str, int exec_input) tok->read_coding_spec = 1; tok->enc = NULL; tok->str = translated; - tok->encoding = (char *)PyMem_MALLOC(6); + tok->encoding = (char *)PyMem_Malloc(6); if (!tok->encoding) { PyTokenizer_Free(tok); return NULL; @@ -778,7 +778,7 @@ PyTokenizer_FromFile(FILE *fp, const char* enc, struct tok_state *tok = tok_new(); if (tok == NULL) return NULL; - if ((tok->buf = (char *)PyMem_MALLOC(BUFSIZ)) == NULL) { + if ((tok->buf = (char *)PyMem_Malloc(BUFSIZ)) == NULL) { PyTokenizer_Free(tok); return NULL; } @@ -790,7 +790,7 @@ PyTokenizer_FromFile(FILE *fp, const char* enc, if (enc != NULL) { /* Must copy encoding declaration since it gets copied into the parse tree. */ - tok->encoding = PyMem_MALLOC(strlen(enc)+1); + tok->encoding = PyMem_Malloc(strlen(enc)+1); if (!tok->encoding) { PyTokenizer_Free(tok); return NULL; @@ -808,15 +808,15 @@ void PyTokenizer_Free(struct tok_state *tok) { if (tok->encoding != NULL) - PyMem_FREE(tok->encoding); + PyMem_Free(tok->encoding); Py_XDECREF(tok->decoding_readline); Py_XDECREF(tok->decoding_buffer); Py_XDECREF(tok->filename); if (tok->fp != NULL && tok->buf != NULL) - PyMem_FREE(tok->buf); + PyMem_Free(tok->buf); if (tok->input) - PyMem_FREE(tok->input); - PyMem_FREE(tok); + PyMem_Free(tok->input); + PyMem_Free(tok); } /* Get next char, updating state; error code goes into tok->done */ @@ -852,7 +852,7 @@ tok_nextc(struct tok_state *tok) char *newtok = PyOS_Readline(stdin, stdout, tok->prompt); if (newtok != NULL) { char *translated = translate_newlines(newtok, 0, tok); - PyMem_FREE(newtok); + PyMem_Free(newtok); if (translated == NULL) return EOF; newtok = translated; @@ -862,14 +862,14 @@ tok_nextc(struct tok_state *tok) Py_ssize_t buflen; const char* buf; PyObject *u = translate_into_utf8(newtok, tok->encoding); - PyMem_FREE(newtok); + PyMem_Free(newtok); if (!u) { tok->done = E_DECODE; return EOF; } buflen = PyBytes_GET_SIZE(u); buf = PyBytes_AS_STRING(u); - newtok = PyMem_MALLOC(buflen+1); + newtok = PyMem_Malloc(buflen+1); if (newtok == NULL) { Py_DECREF(u); tok->done = E_NOMEM; @@ -883,7 +883,7 @@ tok_nextc(struct tok_state *tok) if (newtok == NULL) tok->done = E_INTR; else if (*newtok == '\0') { - PyMem_FREE(newtok); + PyMem_Free(newtok); tok->done = E_EOF; } else if (tok->start != NULL) { @@ -892,12 +892,12 @@ tok_nextc(struct tok_state *tok) size_t newlen = oldlen + strlen(newtok); Py_ssize_t cur_multi_line_start = tok->multi_line_start - tok->buf; char *buf = tok->buf; - buf = (char *)PyMem_REALLOC(buf, newlen+1); + buf = (char *)PyMem_Realloc(buf, newlen+1); tok->lineno++; if (buf == NULL) { - PyMem_FREE(tok->buf); + PyMem_Free(tok->buf); tok->buf = NULL; - PyMem_FREE(newtok); + PyMem_Free(newtok); tok->done = E_NOMEM; return EOF; } @@ -906,7 +906,7 @@ tok_nextc(struct tok_state *tok) tok->multi_line_start = tok->buf + cur_multi_line_start; tok->line_start = tok->cur; strcpy(tok->buf + oldlen, newtok); - PyMem_FREE(newtok); + PyMem_Free(newtok); tok->inp = tok->buf + newlen; tok->end = tok->inp + 1; tok->start = tok->buf + start; @@ -914,7 +914,7 @@ tok_nextc(struct tok_state *tok) else { tok->lineno++; if (tok->buf != NULL) - PyMem_FREE(tok->buf); + PyMem_Free(tok->buf); tok->buf = newtok; tok->cur = tok->buf; tok->line_start = tok->buf; @@ -929,7 +929,7 @@ tok_nextc(struct tok_state *tok) if (tok->start == NULL) { if (tok->buf == NULL) { tok->buf = (char *) - PyMem_MALLOC(BUFSIZ); + PyMem_Malloc(BUFSIZ); if (tok->buf == NULL) { tok->done = E_NOMEM; return EOF; @@ -966,7 +966,7 @@ tok_nextc(struct tok_state *tok) Py_ssize_t curvalid = tok->inp - tok->buf; Py_ssize_t newsize = curvalid + BUFSIZ; char *newbuf = tok->buf; - newbuf = (char *)PyMem_REALLOC(newbuf, + newbuf = (char *)PyMem_Realloc(newbuf, newsize); if (newbuf == NULL) { tok->done = E_NOMEM; @@ -1851,7 +1851,7 @@ PyTokenizer_Get(struct tok_state *tok, const char **p_start, const char **p_end) encoding in the first or second line of the file (in which case the encoding should be assumed to be UTF-8). - The char* returned is malloc'ed via PyMem_MALLOC() and thus must be freed + The char* returned is malloc'ed via PyMem_Malloc() and thus must be freed by the caller. */ char * @@ -1894,7 +1894,7 @@ PyTokenizer_FindEncodingFilename(int fd, PyObject *filename) } fclose(fp); if (tok->encoding) { - encoding = (char *)PyMem_MALLOC(strlen(tok->encoding) + 1); + encoding = (char *)PyMem_Malloc(strlen(tok->encoding) + 1); if (encoding) strcpy(encoding, tok->encoding); } diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 1ce55b6ec5a1ce..a73b8cb320e975 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2089,7 +2089,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) Py_DECREF(stdin_encoding); Py_DECREF(stdin_errors); Py_XDECREF(po); - PyMem_FREE(s); + PyMem_Free(s); if (result != NULL) { if (PySys_Audit("builtins.input/result", "O", result) < 0) { diff --git a/Python/getargs.c b/Python/getargs.c index c85ff6d4777d2c..8839492e5ef41a 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -202,7 +202,7 @@ static int cleanup_ptr(PyObject *self, void *ptr) { if (ptr) { - PyMem_FREE(ptr); + PyMem_Free(ptr); } return 0; } @@ -246,7 +246,7 @@ cleanreturn(int retval, freelist_t *freelist) } } if (freelist->entries_malloced) - PyMem_FREE(freelist->entries); + PyMem_Free(freelist->entries); return retval; } diff --git a/Python/marshal.c b/Python/marshal.c index d292987ce05f42..fa4ec9eb605f05 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -638,7 +638,7 @@ r_string(Py_ssize_t n, RFILE *p) return res; } if (p->buf == NULL) { - p->buf = PyMem_MALLOC(n); + p->buf = PyMem_Malloc(n); if (p->buf == NULL) { PyErr_NoMemory(); return NULL; @@ -646,7 +646,7 @@ r_string(Py_ssize_t n, RFILE *p) p->buf_size = n; } else if (p->buf_size < n) { - char *tmp = PyMem_REALLOC(p->buf, n); + char *tmp = PyMem_Realloc(p->buf, n); if (tmp == NULL) { PyErr_NoMemory(); return NULL; @@ -1453,7 +1453,7 @@ PyMarshal_ReadShortFromFile(FILE *fp) rf.buf = NULL; res = r_short(&rf); if (rf.buf != NULL) - PyMem_FREE(rf.buf); + PyMem_Free(rf.buf); return res; } @@ -1468,7 +1468,7 @@ PyMarshal_ReadLongFromFile(FILE *fp) rf.buf = NULL; res = r_long(&rf); if (rf.buf != NULL) - PyMem_FREE(rf.buf); + PyMem_Free(rf.buf); return res; } @@ -1501,11 +1501,11 @@ PyMarshal_ReadLastObjectFromFile(FILE *fp) off_t filesize; filesize = getfilesize(fp); if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) { - char* pBuf = (char *)PyMem_MALLOC(filesize); + char* pBuf = (char *)PyMem_Malloc(filesize); if (pBuf != NULL) { size_t n = fread(pBuf, 1, (size_t)filesize, fp); PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n); - PyMem_FREE(pBuf); + PyMem_Free(pBuf); return v; } @@ -1534,7 +1534,7 @@ PyMarshal_ReadObjectFromFile(FILE *fp) result = r_object(&rf); Py_DECREF(rf.refs); if (rf.buf != NULL) - PyMem_FREE(rf.buf); + PyMem_Free(rf.buf); return result; } @@ -1555,7 +1555,7 @@ PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len) result = r_object(&rf); Py_DECREF(rf.refs); if (rf.buf != NULL) - PyMem_FREE(rf.buf); + PyMem_Free(rf.buf); return result; } @@ -1684,7 +1684,7 @@ marshal_load(PyObject *module, PyObject *file) result = read_object(&rf); Py_DECREF(rf.refs); if (rf.buf != NULL) - PyMem_FREE(rf.buf); + PyMem_Free(rf.buf); } else result = NULL; } diff --git a/Python/pystrtod.c b/Python/pystrtod.c index 1c8202c7761884..9145d4eba121e1 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -255,7 +255,7 @@ _PyOS_ascii_strtod(const char *nptr, char **endptr) char *copy, *c; /* Create a copy of the input, with the '.' converted to the locale-specific decimal point */ - copy = (char *)PyMem_MALLOC(end - digits_pos + + copy = (char *)PyMem_Malloc(end - digits_pos + 1 + decimal_point_len); if (copy == NULL) { *endptr = (char *)nptr; @@ -286,7 +286,7 @@ _PyOS_ascii_strtod(const char *nptr, char **endptr) (fail_pos - copy); } - PyMem_FREE(copy); + PyMem_Free(copy); } else { diff --git a/Python/traceback.c b/Python/traceback.c index 99b63af11f8bee..708678facf7c31 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -419,12 +419,12 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) if (lseek(fd, 0, SEEK_SET) == (off_t)-1) { Py_DECREF(io); Py_DECREF(binary); - PyMem_FREE(found_encoding); + PyMem_Free(found_encoding); return 0; } fob = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "Os", binary, encoding); Py_DECREF(io); - PyMem_FREE(found_encoding); + PyMem_Free(found_encoding); if (fob == NULL) { PyErr_Clear(); From d1bef1ddb9742fe314a546e8d3c06df24f9a4190 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 1 Dec 2020 10:37:39 +0100 Subject: [PATCH 0694/1261] bpo-42519: Replace PyObject_MALLOC() with PyObject_Malloc() (GH-23587) No longer use deprecated aliases to functions: * Replace PyObject_MALLOC() with PyObject_Malloc() * Replace PyObject_REALLOC() with PyObject_Realloc() * Replace PyObject_FREE() with PyObject_Free() * Replace PyObject_Del() with PyObject_Free() * Replace PyObject_DEL() with PyObject_Free() --- Include/objimpl.h | 4 ++- Include/pymem.h | 6 ++-- Modules/_blake2/blake2b_impl.c | 2 +- Modules/_blake2/blake2s_impl.c | 2 +- Modules/_ctypes/callproc.c | 2 +- Modules/_curses_panel.c | 2 +- Modules/_cursesmodule.c | 2 +- Modules/_decimal/_decimal.c | 2 +- Modules/_functoolsmodule.c | 4 +-- Modules/_hashopenssl.c | 6 ++-- Modules/_multiprocessing/semaphore.c | 2 +- Modules/_pickle.c | 2 +- Modules/_sha3/sha3module.c | 2 +- Modules/_sre.c | 6 ++-- Modules/_ssl.c | 2 +- Modules/_testbuffer.c | 4 +-- Modules/_testcapimodule.c | 10 +++---- Modules/_threadmodule.c | 2 +- Modules/_tkinter.c | 6 ++-- Modules/cjkcodecs/multibytecodec.c | 2 +- Modules/gcmodule.c | 4 +-- Modules/md5module.c | 2 +- Modules/ossaudiodev.c | 4 +-- Modules/overlapped.c | 2 +- Modules/selectmodule.c | 4 +-- Modules/sha1module.c | 2 +- Modules/sha256module.c | 2 +- Modules/sha512module.c | 2 +- Modules/sre_lib.h | 4 +-- Modules/unicodedata.c | 2 +- Modules/xxmodule.c | 2 +- Modules/zlibmodule.c | 2 +- Objects/bytesobject.c | 8 +++--- Objects/capsule.c | 2 +- Objects/codeobject.c | 2 +- Objects/complexobject.c | 2 +- Objects/dictobject.c | 8 +++--- Objects/floatobject.c | 4 +-- Objects/longobject.c | 2 +- Objects/object.c | 4 +-- Objects/odictobject.c | 2 +- Objects/rangeobject.c | 4 +-- Objects/stringlib/unicode_format.h | 4 +-- Objects/typeobject.c | 6 ++-- Objects/unicodeobject.c | 42 ++++++++++++++-------------- PC/_msi.c | 2 +- PC/winreg.c | 4 +-- Python/symtable.c | 2 +- 48 files changed, 102 insertions(+), 98 deletions(-) diff --git a/Include/objimpl.h b/Include/objimpl.h index 464b1bf93ba2c9..1408d051ba7efe 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -38,7 +38,7 @@ Functions and macros for modules that implement new object types. object with room for n items. In addition to the refcount and type pointer fields, this also fills in the ob_size field. - - PyObject_Del(op) releases the memory allocated for an object. It does not + - PyObject_Free(op) releases the memory allocated for an object. It does not run a destructor -- it only frees the memory. PyObject_Free is identical. - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) don't @@ -103,6 +103,8 @@ PyAPI_FUNC(void) PyObject_Free(void *ptr); // Deprecated aliases only kept for backward compatibility. +// PyObject_Del and PyObject_DEL are defined with no parameter to be able to +// use them as function pointers (ex: tp_free = PyObject_Del). #define PyObject_MALLOC PyObject_Malloc #define PyObject_REALLOC PyObject_Realloc #define PyObject_FREE PyObject_Free diff --git a/Include/pymem.h b/Include/pymem.h index 5b9dd4219948ab..92cd5369589edb 100644 --- a/Include/pymem.h +++ b/Include/pymem.h @@ -79,13 +79,15 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr); // Deprecated aliases only kept for backward compatibility. +// PyMem_Del and PyMem_DEL are defined with no parameter to be able to use +// them as function pointers (ex: dealloc = PyMem_Del). #define PyMem_MALLOC(n) PyMem_Malloc(n) #define PyMem_NEW(type, n) PyMem_New(type, n) #define PyMem_REALLOC(p, n) PyMem_Realloc(p, n) #define PyMem_RESIZE(p, type, n) PyMem_Resize(p, type, n) #define PyMem_FREE(p) PyMem_Free(p) -#define PyMem_Del(p) PyMem_Free(p) -#define PyMem_DEL(p) PyMem_Free(p) +#define PyMem_Del PyMem_Free +#define PyMem_DEL PyMem_Free #ifndef Py_LIMITED_API diff --git a/Modules/_blake2/blake2b_impl.c b/Modules/_blake2/blake2b_impl.c index 8e1acce56b1d29..5d108ed008a8a1 100644 --- a/Modules/_blake2/blake2b_impl.c +++ b/Modules/_blake2/blake2b_impl.c @@ -393,7 +393,7 @@ py_blake2b_dealloc(PyObject *self) } PyTypeObject *type = Py_TYPE(self); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(type); } diff --git a/Modules/_blake2/blake2s_impl.c b/Modules/_blake2/blake2s_impl.c index e1de5df37d0988..85c2d4edad7eee 100644 --- a/Modules/_blake2/blake2s_impl.c +++ b/Modules/_blake2/blake2s_impl.c @@ -392,7 +392,7 @@ py_blake2s_dealloc(PyObject *self) } PyTypeObject *type = Py_TYPE(self); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(type); } diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 9b629877a8a53a..40a05a44edd4c1 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -475,7 +475,7 @@ static void PyCArg_dealloc(PyCArgObject *self) { Py_XDECREF(self->obj); - PyObject_Del(self); + PyObject_Free(self); } static int diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c index 1a8f0b636821ff..7d252244e24054 100644 --- a/Modules/_curses_panel.c +++ b/Modules/_curses_panel.c @@ -282,7 +282,7 @@ PyCursesPanel_Dealloc(PyCursesPanelObject *po) Py_DECREF(po->wo); remove_lop(po); } - PyObject_DEL(po); + PyObject_Free(po); Py_DECREF(tp); } diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index a59858632e76f2..1f4789baf7a68e 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -689,7 +689,7 @@ PyCursesWindow_Dealloc(PyCursesWindowObject *wo) if (wo->win != stdscr) delwin(wo->win); if (wo->encoding != NULL) PyMem_Free(wo->encoding); - PyObject_DEL(wo); + PyObject_Free(wo); } /* Addch, Addstr, Addnstr */ diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index ea16c5a6cd9cdc..9c85d76c6b5b8a 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -1765,7 +1765,7 @@ ctxmanager_dealloc(PyDecContextManagerObject *self) { Py_XDECREF(self->local); Py_XDECREF(self->global); - PyObject_Del(self); + PyObject_Free(self); } static PyObject * diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 9fad21fc33213c..ff03c334766b89 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -478,7 +478,7 @@ keyobject_dealloc(keyobject *ko) { Py_DECREF(ko->cmp); Py_XDECREF(ko->object); - PyObject_FREE(ko); + PyObject_Free(ko); } static int @@ -742,7 +742,7 @@ lru_list_elem_dealloc(lru_list_elem *link) { Py_XDECREF(link->key); Py_XDECREF(link->result); - PyObject_Del(link); + PyObject_Free(link); } static PyTypeObject lru_list_elem_type = { diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index 7e176cf21d6297..d4295d7c3638d6 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -341,7 +341,7 @@ EVP_dealloc(EVPobject *self) if (self->lock != NULL) PyThread_free_lock(self->lock); EVP_MD_CTX_free(self->ctx); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(tp); } @@ -1453,7 +1453,7 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj, error: if (ctx) HMAC_CTX_free(ctx); - if (self) PyObject_Del(self); + if (self) PyObject_Free(self); return NULL; } @@ -1546,7 +1546,7 @@ _hmac_dealloc(HMACobject *self) PyThread_free_lock(self->lock); } HMAC_CTX_free(self->ctx); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(tp); } diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c index 8732750e11be8c..9a2d1f85c92fa2 100644 --- a/Modules/_multiprocessing/semaphore.c +++ b/Modules/_multiprocessing/semaphore.c @@ -571,7 +571,7 @@ semlock_dealloc(SemLockObject* self) if (self->handle != SEM_FAILED) SEM_CLOSE(self->handle); PyMem_Free(self->name); - PyObject_Del(self); + PyObject_Free(self); } /*[clinic input] diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 7ecaeea18c611a..5a8aad9de7679d 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -443,7 +443,7 @@ Pdata_dealloc(Pdata *self) Py_DECREF(self->data[i]); } PyMem_Free(self->data); - PyObject_Del(self); + PyObject_Free(self); } static PyTypeObject Pdata_Type = { diff --git a/Modules/_sha3/sha3module.c b/Modules/_sha3/sha3module.c index da6dde6812f264..cae10f99d5b8df 100644 --- a/Modules/_sha3/sha3module.c +++ b/Modules/_sha3/sha3module.c @@ -274,7 +274,7 @@ SHA3_dealloc(SHA3object *self) } PyTypeObject *tp = Py_TYPE(self); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(tp); } diff --git a/Modules/_sre.c b/Modules/_sre.c index c67f38d75b8091..57faf7bdaae4e6 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -571,7 +571,7 @@ pattern_dealloc(PatternObject* self) Py_XDECREF(self->pattern); Py_XDECREF(self->groupindex); Py_XDECREF(self->indexgroup); - PyObject_DEL(self); + PyObject_Free(self); Py_DECREF(tp); } @@ -1944,7 +1944,7 @@ match_dealloc(MatchObject* self) Py_XDECREF(self->regs); Py_XDECREF(self->string); Py_DECREF(self->pattern); - PyObject_DEL(self); + PyObject_Free(self); Py_DECREF(tp); } @@ -2450,7 +2450,7 @@ scanner_dealloc(ScannerObject* self) state_fini(&self->state); Py_XDECREF(self->pattern); - PyObject_DEL(self); + PyObject_Free(self); Py_DECREF(tp); } diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 87fe3a16078fab..edb850ee461037 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2295,7 +2295,7 @@ PySSL_dealloc(PySSLSocket *self) Py_XDECREF(self->ctx); Py_XDECREF(self->server_hostname); Py_XDECREF(self->owner); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(tp); } diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c index d8321768bc9729..1b4fb09fb8fbca 100644 --- a/Modules/_testbuffer.c +++ b/Modules/_testbuffer.c @@ -236,7 +236,7 @@ ndarray_dealloc(NDArrayObject *self) ndbuf_pop(self); } } - PyObject_Del(self); + PyObject_Free(self); } static int @@ -2734,7 +2734,7 @@ staticarray_init(PyObject *self, PyObject *args, PyObject *kwds) static void staticarray_dealloc(StaticArrayObject *self) { - PyObject_Del(self); + PyObject_Free(self); } /* Return a buffer for a PyBUF_FULL_RO request. Flags are not checked, diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 916d10a1e413ba..d2104423c5890c 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -6010,7 +6010,7 @@ test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) static void test_structmembers_free(PyObject *ob) { - PyObject_FREE(ob); + PyObject_Free(ob); } static PyTypeObject test_structmembersType = { @@ -6664,7 +6664,7 @@ static void heapctype_dealloc(HeapCTypeObject *self) { PyTypeObject *tp = Py_TYPE(self); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(tp); } @@ -6854,7 +6854,7 @@ heapctypewithdict_dealloc(HeapCTypeWithDictObject* self) PyTypeObject *tp = Py_TYPE(self); Py_XDECREF(self->dict); - PyObject_DEL(self); + PyObject_Free(self); Py_DECREF(tp); } @@ -6925,7 +6925,7 @@ heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self) if (self->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) self); Py_XDECREF(self->weakreflist); - PyObject_DEL(self); + PyObject_Free(self); Py_DECREF(tp); } @@ -6968,7 +6968,7 @@ static void heapctypesetattr_dealloc(HeapCTypeSetattrObject *self) { PyTypeObject *tp = Py_TYPE(self); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(tp); } diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index dcefa8dbaa91b2..86d5f544fcf0fa 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -34,7 +34,7 @@ lock_dealloc(lockobject *self) PyThread_release_lock(self->lock_lock); PyThread_free_lock(self->lock_lock); } - PyObject_Del(self); + PyObject_Free(self); } /* Helper to acquire an interruptible lock with a timeout. If the lock acquire diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 24aeb3da94c70b..46d6a6e0954f51 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -904,7 +904,7 @@ PyTclObject_dealloc(PyTclObject *self) PyObject *tp = (PyObject *) Py_TYPE(self); Tcl_DecrRefCount(self->value); Py_XDECREF(self->string); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(tp); } @@ -2823,7 +2823,7 @@ Tktt_Dealloc(PyObject *self) Py_XDECREF(func); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(tp); } @@ -3096,7 +3096,7 @@ Tkapp_Dealloc(PyObject *self) ENTER_TCL Tcl_DeleteInterp(Tkapp_Interp(self)); LEAVE_TCL - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(tp); DisableEventHook(); } diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 37a80a781da6fb..9208b86b0c9055 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -691,7 +691,7 @@ static struct PyMethodDef multibytecodec_methods[] = { static void multibytecodec_dealloc(MultibyteCodecObject *self) { - PyObject_Del(self); + PyObject_Free(self); } static PyTypeObject MultibyteCodec_Type = { diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 45201435f24605..fdbba6a7afc29d 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -2290,7 +2290,7 @@ _PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems) } PyGC_Head *g = AS_GC(op); - g = (PyGC_Head *)PyObject_REALLOC(g, sizeof(PyGC_Head) + basicsize); + g = (PyGC_Head *)PyObject_Realloc(g, sizeof(PyGC_Head) + basicsize); if (g == NULL) return (PyVarObject *)PyErr_NoMemory(); op = (PyVarObject *) FROM_GC(g); @@ -2309,7 +2309,7 @@ PyObject_GC_Del(void *op) if (gcstate->generations[0].count > 0) { gcstate->generations[0].count--; } - PyObject_FREE(g); + PyObject_Free(g); } int diff --git a/Modules/md5module.c b/Modules/md5module.c index 9bd2bd17e4fbf1..1c401e884389f3 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -342,7 +342,7 @@ static void MD5_dealloc(PyObject *ptr) { PyTypeObject *tp = Py_TYPE(ptr); - PyObject_Del(ptr); + PyObject_Free(ptr); Py_DECREF(tp); } diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c index 2a1ac10814a698..4f2d9cb8b7c9c7 100644 --- a/Modules/ossaudiodev.c +++ b/Modules/ossaudiodev.c @@ -154,7 +154,7 @@ oss_dealloc(oss_audio_t *self) /* if already closed, don't reclose it */ if (self->fd != -1) close(self->fd); - PyObject_Del(self); + PyObject_Free(self); } @@ -199,7 +199,7 @@ oss_mixer_dealloc(oss_mixer_t *self) /* if already closed, don't reclose it */ if (self->fd != -1) close(self->fd); - PyObject_Del(self); + PyObject_Free(self); } diff --git a/Modules/overlapped.c b/Modules/overlapped.c index 3829932070a961..38dd98f084849e 100644 --- a/Modules/overlapped.c +++ b/Modules/overlapped.c @@ -722,7 +722,7 @@ Overlapped_dealloc(OverlappedObject *self) SetLastError(olderr); PyTypeObject *tp = Py_TYPE(self); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(tp); } diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 0b9f20d6bbd9da..f80da5895401fe 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -742,7 +742,7 @@ poll_dealloc(pollObject *self) if (self->ufds != NULL) PyMem_Free(self->ufds); Py_XDECREF(self->dict); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(type); } @@ -1130,7 +1130,7 @@ devpoll_dealloc(devpollObject *self) PyObject *type = (PyObject *)Py_TYPE(self); (void)devpoll_internal_close(self); PyMem_Free(self->fds); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(type); } diff --git a/Modules/sha1module.c b/Modules/sha1module.c index c22437de256b66..5209857041d908 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -320,7 +320,7 @@ static void SHA1_dealloc(PyObject *ptr) { PyTypeObject *tp = Py_TYPE(ptr); - PyObject_Del(ptr); + PyObject_Free(ptr); Py_DECREF(tp); } diff --git a/Modules/sha256module.c b/Modules/sha256module.c index edd4d010928f38..6b8bd8f1d27fb1 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -397,7 +397,7 @@ static void SHA_dealloc(PyObject *ptr) { PyTypeObject *tp = Py_TYPE(ptr); - PyObject_Del(ptr); + PyObject_Free(ptr); Py_DECREF(tp); } diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 725098def4d062..3fd9fa4c8d16f8 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -453,7 +453,7 @@ static void SHA512_dealloc(PyObject *ptr) { PyTypeObject *tp = Py_TYPE(ptr); - PyObject_Del(ptr); + PyObject_Free(ptr); Py_DECREF(tp); } diff --git a/Modules/sre_lib.h b/Modules/sre_lib.h index cfe0a4af2c4839..322f66fb4da6c7 100644 --- a/Modules/sre_lib.h +++ b/Modules/sre_lib.h @@ -986,7 +986,7 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) ctx->pattern[1], ctx->pattern[2])); /* install new repeat context */ - ctx->u.rep = (SRE_REPEAT*) PyObject_MALLOC(sizeof(*ctx->u.rep)); + ctx->u.rep = (SRE_REPEAT*) PyObject_Malloc(sizeof(*ctx->u.rep)); if (!ctx->u.rep) { PyErr_NoMemory(); RETURN_FAILURE; @@ -1000,7 +1000,7 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) state->ptr = ctx->ptr; DO_JUMP(JUMP_REPEAT, jump_repeat, ctx->pattern+ctx->pattern[0]); state->repeat = ctx->u.rep->prev; - PyObject_FREE(ctx->u.rep); + PyObject_Free(ctx->u.rep); if (ret) { RETURN_ON_ERROR(ret); diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index fcf801dc9e4adc..4b8c46c7797665 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1418,7 +1418,7 @@ static void ucd_dealloc(PreviousDBVersion *self) { PyTypeObject *tp = Py_TYPE(self); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(tp); } diff --git a/Modules/xxmodule.c b/Modules/xxmodule.c index 17b049c4b9a375..edcd62157c02f3 100644 --- a/Modules/xxmodule.c +++ b/Modules/xxmodule.c @@ -44,7 +44,7 @@ static void Xxo_dealloc(XxoObject *self) { Py_XDECREF(self->x_attr); - PyObject_Del(self); + PyObject_Free(self); } static PyObject * diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index def617671f18fd..a537087d19d835 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -591,7 +591,7 @@ Dealloc(compobject *self) Py_XDECREF(self->unused_data); Py_XDECREF(self->unconsumed_tail); Py_XDECREF(self->zdict); - PyObject_Del(self); + PyObject_Free(self); Py_DECREF(type); } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index bb844090b8622f..13216b9bb21a59 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -198,7 +198,7 @@ PyBytes_FromString(const char *str) } /* Inline PyObject_NewVar */ - op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + size); + op = (PyBytesObject *)PyObject_Malloc(PyBytesObject_SIZE + size); if (op == NULL) { return PyErr_NoMemory(); } @@ -1475,7 +1475,7 @@ bytes_repeat(PyBytesObject *a, Py_ssize_t n) "repeated bytes are too long"); return NULL; } - op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + nbytes); + op = (PyBytesObject *)PyObject_Malloc(PyBytesObject_SIZE + nbytes); if (op == NULL) { return PyErr_NoMemory(); } @@ -3054,9 +3054,9 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) _Py_ForgetReference(v); #endif *pv = (PyObject *) - PyObject_REALLOC(v, PyBytesObject_SIZE + newsize); + PyObject_Realloc(v, PyBytesObject_SIZE + newsize); if (*pv == NULL) { - PyObject_Del(v); + PyObject_Free(v); PyErr_NoMemory(); return -1; } diff --git a/Objects/capsule.c b/Objects/capsule.c index a2ff642526cd05..800a6c4b25c6df 100644 --- a/Objects/capsule.c +++ b/Objects/capsule.c @@ -260,7 +260,7 @@ capsule_dealloc(PyObject *o) if (capsule->destructor) { capsule->destructor(o); } - PyObject_DEL(o); + PyObject_Free(o); } diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 0257295f1e996c..0b0b8f98ae4f32 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -669,7 +669,7 @@ code_dealloc(PyCodeObject *co) PyObject_GC_Del(co->co_zombieframe); if (co->co_weakreflist != NULL) PyObject_ClearWeakRefs((PyObject*)co); - PyObject_DEL(co); + PyObject_Free(co); } static PyObject * diff --git a/Objects/complexobject.c b/Objects/complexobject.c index a481d9ad8bbaaf..a65ebdfa6cdf93 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -233,7 +233,7 @@ PyObject * PyComplex_FromCComplex(Py_complex cval) { /* Inline PyObject_New */ - PyComplexObject *op = PyObject_MALLOC(sizeof(PyComplexObject)); + PyComplexObject *op = PyObject_Malloc(sizeof(PyComplexObject)); if (op == NULL) { return PyErr_NoMemory(); } diff --git a/Objects/dictobject.c b/Objects/dictobject.c index ee1a9d1d7e71ee..7a37313df8a6b1 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -269,7 +269,7 @@ _PyDict_ClearFreeList(PyThreadState *tstate) PyObject_GC_Del(op); } while (state->keys_numfree) { - PyObject_FREE(state->keys_free_list[--state->keys_numfree]); + PyObject_Free(state->keys_free_list[--state->keys_numfree]); } } @@ -597,7 +597,7 @@ new_keys_object(Py_ssize_t size) } else { - dk = PyObject_MALLOC(sizeof(PyDictKeysObject) + dk = PyObject_Malloc(sizeof(PyDictKeysObject) + es * size + sizeof(PyDictKeyEntry) * usable); if (dk == NULL) { @@ -636,7 +636,7 @@ free_keys_object(PyDictKeysObject *keys) state->keys_free_list[state->keys_numfree++] = keys; return; } - PyObject_FREE(keys); + PyObject_Free(keys); } #define new_values(size) PyMem_NEW(PyObject *, size) @@ -1303,7 +1303,7 @@ dictresize(PyDictObject *mp, Py_ssize_t newsize) state->keys_free_list[state->keys_numfree++] = oldkeys; } else { - PyObject_FREE(oldkeys); + PyObject_Free(oldkeys); } } diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 1550b2eedc862c..34fb57a946afa5 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -237,7 +237,7 @@ float_dealloc(PyFloatObject *op) assert(state->numfree != -1); #endif if (state->numfree >= PyFloat_MAXFREELIST) { - PyObject_FREE(op); + PyObject_Free(op); return; } state->numfree++; @@ -2032,7 +2032,7 @@ _PyFloat_ClearFreeList(PyThreadState *tstate) PyFloatObject *f = state->free_list; while (f != NULL) { PyFloatObject *next = (PyFloatObject*) Py_TYPE(f); - PyObject_FREE(f); + PyObject_Free(f); f = next; } state->free_list = NULL; diff --git a/Objects/longobject.c b/Objects/longobject.c index e0d6410fe6818a..240e92a41e0ec0 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -131,7 +131,7 @@ _PyLong_New(Py_ssize_t size) "too many digits in integer"); return NULL; } - result = PyObject_MALLOC(offsetof(PyLongObject, ob_digit) + + result = PyObject_Malloc(offsetof(PyLongObject, ob_digit) + size*sizeof(digit)); if (!result) { PyErr_NoMemory(); diff --git a/Objects/object.c b/Objects/object.c index 2e8717f506ca0e..0a8621b3503b31 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -161,7 +161,7 @@ PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size) PyObject * _PyObject_New(PyTypeObject *tp) { - PyObject *op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp)); + PyObject *op = (PyObject *) PyObject_Malloc(_PyObject_SIZE(tp)); if (op == NULL) { return PyErr_NoMemory(); } @@ -174,7 +174,7 @@ _PyObject_NewVar(PyTypeObject *tp, Py_ssize_t nitems) { PyVarObject *op; const size_t size = _PyObject_VAR_SIZE(tp, nitems); - op = (PyVarObject *) PyObject_MALLOC(size); + op = (PyVarObject *) PyObject_Malloc(size); if (op == NULL) { return (PyVarObject *)PyErr_NoMemory(); } diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 83b326b2067a86..4eb15f999bd1e4 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -459,7 +459,7 @@ Potential Optimizations - implement a fuller MutableMapping API in C? - move the MutableMapping implementation to abstract.c? - optimize mutablemapping_update -- use PyObject_MALLOC (small object allocator) for odict nodes? +- use PyObject_Malloc (small object allocator) for odict nodes? - support subclasses better (e.g. in odict_richcompare) */ diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 787d1138009a0c..530426c8ac9044 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -171,7 +171,7 @@ range_dealloc(rangeobject *r) Py_DECREF(r->stop); Py_DECREF(r->step); Py_DECREF(r->length); - PyObject_Del(r); + PyObject_Free(r); } /* Return number of items in range (lo, hi, step) as a PyLong object, @@ -1021,7 +1021,7 @@ longrangeiter_dealloc(longrangeiterobject *r) Py_XDECREF(r->start); Py_XDECREF(r->step); Py_XDECREF(r->len); - PyObject_Del(r); + PyObject_Free(r); } static PyObject * diff --git a/Objects/stringlib/unicode_format.h b/Objects/stringlib/unicode_format.h index b526ad21b8205d..7152ec6ebe7128 100644 --- a/Objects/stringlib/unicode_format.h +++ b/Objects/stringlib/unicode_format.h @@ -983,7 +983,7 @@ static void formatteriter_dealloc(formatteriterobject *it) { Py_XDECREF(it->str); - PyObject_FREE(it); + PyObject_Free(it); } /* returns a tuple: @@ -1147,7 +1147,7 @@ static void fieldnameiter_dealloc(fieldnameiterobject *it) { Py_XDECREF(it->str); - PyObject_FREE(it); + PyObject_Free(it); } /* returns a tuple: diff --git a/Objects/typeobject.c b/Objects/typeobject.c index fbadd31f1a46c3..83bc877eb7d05c 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1059,7 +1059,7 @@ PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems) obj = _PyObject_GC_Malloc(size); } else { - obj = (PyObject *)PyObject_MALLOC(size); + obj = (PyObject *)PyObject_Malloc(size); } if (obj == NULL) { @@ -2707,7 +2707,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) goto error; /* Silently truncate the docstring if it contains null bytes. */ len = strlen(doc_str); - tp_doc = (char *)PyObject_MALLOC(len + 1); + tp_doc = (char *)PyObject_Malloc(len + 1); if (tp_doc == NULL) { PyErr_NoMemory(); goto error; @@ -3047,7 +3047,7 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) continue; } size_t len = strlen(slot->pfunc)+1; - char *tp_doc = PyObject_MALLOC(len); + char *tp_doc = PyObject_Malloc(len); if (tp_doc == NULL) { type->tp_doc = NULL; PyErr_NoMemory(); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index ba6d07a67d2da2..f6473c02d30fd6 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1061,7 +1061,7 @@ resize_compact(PyObject *unicode, Py_ssize_t length) new_size = (struct_size + (length + 1) * char_size); if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { - PyObject_DEL(_PyUnicode_UTF8(unicode)); + PyObject_Free(_PyUnicode_UTF8(unicode)); _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; } @@ -1072,7 +1072,7 @@ resize_compact(PyObject *unicode, Py_ssize_t length) _Py_ForgetReference(unicode); #endif - new_unicode = (PyObject *)PyObject_REALLOC(unicode, new_size); + new_unicode = (PyObject *)PyObject_Realloc(unicode, new_size); if (new_unicode == NULL) { _Py_NewReference(unicode); PyErr_NoMemory(); @@ -1088,7 +1088,7 @@ resize_compact(PyObject *unicode, Py_ssize_t length) _PyUnicode_WSTR_LENGTH(unicode) = length; } else if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) { - PyObject_DEL(_PyUnicode_WSTR(unicode)); + PyObject_Free(_PyUnicode_WSTR(unicode)); _PyUnicode_WSTR(unicode) = NULL; if (!PyUnicode_IS_ASCII(unicode)) _PyUnicode_WSTR_LENGTH(unicode) = 0; @@ -1131,12 +1131,12 @@ resize_inplace(PyObject *unicode, Py_ssize_t length) if (!share_utf8 && _PyUnicode_HAS_UTF8_MEMORY(unicode)) { - PyObject_DEL(_PyUnicode_UTF8(unicode)); + PyObject_Free(_PyUnicode_UTF8(unicode)); _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; } - data = (PyObject *)PyObject_REALLOC(data, new_size); + data = (PyObject *)PyObject_Realloc(data, new_size); if (data == NULL) { PyErr_NoMemory(); return -1; @@ -1169,7 +1169,7 @@ resize_inplace(PyObject *unicode, Py_ssize_t length) } new_size = sizeof(wchar_t) * (length + 1); wstr = _PyUnicode_WSTR(unicode); - wstr = PyObject_REALLOC(wstr, new_size); + wstr = PyObject_Realloc(wstr, new_size); if (!wstr) { PyErr_NoMemory(); return -1; @@ -1259,7 +1259,7 @@ _PyUnicode_New(Py_ssize_t length) _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; - _PyUnicode_WSTR(unicode) = (Py_UNICODE*) PyObject_MALLOC(new_size); + _PyUnicode_WSTR(unicode) = (Py_UNICODE*) PyObject_Malloc(new_size); if (!_PyUnicode_WSTR(unicode)) { Py_DECREF(unicode); PyErr_NoMemory(); @@ -1456,7 +1456,7 @@ PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar) * PyObject_New() so we are able to allocate space for the object and * it's data buffer. */ - obj = (PyObject *) PyObject_MALLOC(struct_size + (size + 1) * char_size); + obj = (PyObject *) PyObject_Malloc(struct_size + (size + 1) * char_size); if (obj == NULL) { return PyErr_NoMemory(); } @@ -1838,7 +1838,7 @@ _PyUnicode_Ready(PyObject *unicode) return -1; if (maxchar < 256) { - _PyUnicode_DATA_ANY(unicode) = PyObject_MALLOC(_PyUnicode_WSTR_LENGTH(unicode) + 1); + _PyUnicode_DATA_ANY(unicode) = PyObject_Malloc(_PyUnicode_WSTR_LENGTH(unicode) + 1); if (!_PyUnicode_DATA_ANY(unicode)) { PyErr_NoMemory(); return -1; @@ -1859,7 +1859,7 @@ _PyUnicode_Ready(PyObject *unicode) _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; } - PyObject_FREE(_PyUnicode_WSTR(unicode)); + PyObject_Free(_PyUnicode_WSTR(unicode)); _PyUnicode_WSTR(unicode) = NULL; _PyUnicode_WSTR_LENGTH(unicode) = 0; } @@ -1879,7 +1879,7 @@ _PyUnicode_Ready(PyObject *unicode) _PyUnicode_UTF8_LENGTH(unicode) = 0; #else /* sizeof(wchar_t) == 4 */ - _PyUnicode_DATA_ANY(unicode) = PyObject_MALLOC( + _PyUnicode_DATA_ANY(unicode) = PyObject_Malloc( 2 * (_PyUnicode_WSTR_LENGTH(unicode) + 1)); if (!_PyUnicode_DATA_ANY(unicode)) { PyErr_NoMemory(); @@ -1893,7 +1893,7 @@ _PyUnicode_Ready(PyObject *unicode) _PyUnicode_STATE(unicode).kind = PyUnicode_2BYTE_KIND; _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; - PyObject_FREE(_PyUnicode_WSTR(unicode)); + PyObject_Free(_PyUnicode_WSTR(unicode)); _PyUnicode_WSTR(unicode) = NULL; _PyUnicode_WSTR_LENGTH(unicode) = 0; #endif @@ -1908,7 +1908,7 @@ _PyUnicode_Ready(PyObject *unicode) PyErr_NoMemory(); return -1; } - _PyUnicode_DATA_ANY(unicode) = PyObject_MALLOC(4 * (length_wo_surrogates + 1)); + _PyUnicode_DATA_ANY(unicode) = PyObject_Malloc(4 * (length_wo_surrogates + 1)); if (!_PyUnicode_DATA_ANY(unicode)) { PyErr_NoMemory(); return -1; @@ -1920,7 +1920,7 @@ _PyUnicode_Ready(PyObject *unicode) /* unicode_convert_wchar_to_ucs4() requires a ready string */ _PyUnicode_STATE(unicode).ready = 1; unicode_convert_wchar_to_ucs4(_PyUnicode_WSTR(unicode), end, unicode); - PyObject_FREE(_PyUnicode_WSTR(unicode)); + PyObject_Free(_PyUnicode_WSTR(unicode)); _PyUnicode_WSTR(unicode) = NULL; _PyUnicode_WSTR_LENGTH(unicode) = 0; #else @@ -1973,13 +1973,13 @@ unicode_dealloc(PyObject *unicode) } if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) { - PyObject_DEL(_PyUnicode_WSTR(unicode)); + PyObject_Free(_PyUnicode_WSTR(unicode)); } if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { - PyObject_DEL(_PyUnicode_UTF8(unicode)); + PyObject_Free(_PyUnicode_UTF8(unicode)); } if (!PyUnicode_IS_COMPACT(unicode) && _PyUnicode_DATA_ANY(unicode)) { - PyObject_DEL(_PyUnicode_DATA_ANY(unicode)); + PyObject_Free(_PyUnicode_DATA_ANY(unicode)); } Py_TYPE(unicode)->tp_free(unicode); @@ -4199,7 +4199,7 @@ PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size) PyErr_NoMemory(); return NULL; } - w = (wchar_t *) PyObject_MALLOC(sizeof(wchar_t) * (wlen + 1)); + w = (wchar_t *) PyObject_Malloc(sizeof(wchar_t) * (wlen + 1)); if (w == NULL) { PyErr_NoMemory(); return NULL; @@ -5627,7 +5627,7 @@ unicode_fill_utf8(PyObject *unicode) PyBytes_AS_STRING(writer.buffer); Py_ssize_t len = end - start; - char *cache = PyObject_MALLOC(len + 1); + char *cache = PyObject_Malloc(len + 1); if (cache == NULL) { _PyBytesWriter_Dealloc(&writer); PyErr_NoMemory(); @@ -8544,7 +8544,7 @@ PyUnicode_BuildEncodingMap(PyObject* string) } /* Create a three-level trie */ - result = PyObject_MALLOC(sizeof(struct encoding_map) + + result = PyObject_Malloc(sizeof(struct encoding_map) + 16*count2 + 128*count3 - 1); if (!result) { return PyErr_NoMemory(); @@ -15567,7 +15567,7 @@ unicode_subtype_new(PyTypeObject *type, PyObject *unicode) PyErr_NoMemory(); goto onError; } - data = PyObject_MALLOC((length + 1) * char_size); + data = PyObject_Malloc((length + 1) * char_size); if (data == NULL) { PyErr_NoMemory(); goto onError; diff --git a/PC/_msi.c b/PC/_msi.c index 504899d0757b78..01516e85ccff30 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -351,7 +351,7 @@ msiobj_dealloc(msiobj* msidb) { MsiCloseHandle(msidb->h); msidb->h = 0; - PyObject_Del(msidb); + PyObject_Free(msidb); } static PyObject* diff --git a/PC/winreg.c b/PC/winreg.c index fee51ac1bbe0a5..d62a7be28d3fab 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -145,7 +145,7 @@ PyHKEY_deallocFunc(PyObject *ob) PyHKEYObject *obkey = (PyHKEYObject *)ob; if (obkey->hkey) RegCloseKey((HKEY)obkey->hkey); - PyObject_DEL(ob); + PyObject_Free(ob); } static int @@ -459,7 +459,7 @@ PyObject * PyHKEY_FromHKEY(HKEY h) { /* Inline PyObject_New */ - PyHKEYObject *op = (PyHKEYObject *) PyObject_MALLOC(sizeof(PyHKEYObject)); + PyHKEYObject *op = (PyHKEYObject *) PyObject_Malloc(sizeof(PyHKEYObject)); if (op == NULL) { return PyErr_NoMemory(); } diff --git a/Python/symtable.c b/Python/symtable.c index 0464cd898b27fb..cce1b1b5f3226a 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -128,7 +128,7 @@ ste_dealloc(PySTEntryObject *ste) Py_XDECREF(ste->ste_varnames); Py_XDECREF(ste->ste_children); Py_XDECREF(ste->ste_directives); - PyObject_Del(ste); + PyObject_Free(ste); } #define OFF(x) offsetof(PySTEntryObject, x) From 681b835a8e8c41f82332b83371cb9720507d17a5 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Tue, 1 Dec 2020 06:41:12 -0300 Subject: [PATCH 0695/1261] Fix bz2 examples markup (#23580) --- Doc/library/bz2.rst | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst index 85cdc16a7d78d4..637baf49da1fc0 100644 --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -266,7 +266,6 @@ Below are some examples of typical usage of the :mod:`bz2` module. Using :func:`compress` and :func:`decompress` to demonstrate round-trip compression: >>> import bz2 - >>> data = b"""\ ... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue ... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem, @@ -275,11 +274,9 @@ Using :func:`compress` and :func:`decompress` to demonstrate round-trip compress ... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo ... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum ... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum.""" - >>> c = bz2.compress(data) >>> len(data) / len(c) # Data compression ratio 1.513595166163142 - >>> d = bz2.decompress(c) >>> data == d # Check equality to original object after round-trip True @@ -287,7 +284,6 @@ Using :func:`compress` and :func:`decompress` to demonstrate round-trip compress Using :class:`BZ2Compressor` for incremental compression: >>> import bz2 - >>> def gen_data(chunks=10, chunksize=1000): ... """Yield incremental blocks of chunksize bytes.""" ... for _ in range(chunks): @@ -310,7 +306,6 @@ while ordered, repetitive data usually yields a high compression ratio. Writing and reading a bzip2-compressed file in binary mode: >>> import bz2 - >>> data = b"""\ ... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue ... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem, @@ -319,14 +314,11 @@ Writing and reading a bzip2-compressed file in binary mode: ... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo ... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum ... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum.""" - >>> with bz2.open("myfile.bz2", "wb") as f: ... # Write compressed data to file ... unused = f.write(data) - >>> with bz2.open("myfile.bz2", "rb") as f: ... # Decompress data from file ... content = f.read() - >>> content == data # Check equality to original object after round-trip True From a625d278e532bce137ef23a54a79ff01539b56a9 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Tue, 1 Dec 2020 06:45:11 -0300 Subject: [PATCH 0696/1261] [doc] Fix abc.update_abstractmethods markup (GH-23576) Add link to ABCMeta while at it. --- Doc/library/abc.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst index 3a7414d7358e7a..1a6ed474ff21da 100644 --- a/Doc/library/abc.rst +++ b/Doc/library/abc.rst @@ -336,6 +336,7 @@ The :mod:`abc` module also provides the following functions: .. versionadded:: 3.4 .. function:: update_abstractmethods(cls) + A function to recalculate an abstract class's abstraction status. This function should be called if a class's abstract methods have been implemented or changed after it was created. Usually, this function should @@ -343,7 +344,7 @@ The :mod:`abc` module also provides the following functions: Returns *cls*, to allow usage as a class decorator. - If *cls* is not an instance of ABCMeta, does nothing. + If *cls* is not an instance of :class:`ABCMeta`, does nothing. .. note:: From 69a19ef4765a2dbbe6b459f235be9f47de81d7b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Dec 2020 08:59:12 -0600 Subject: [PATCH 0697/1261] build(deps): bump actions/cache from v2.1.2 to v2.1.3 (23582) Bumps [actions/cache](https://github.com/actions/cache) from v2.1.2 to v2.1.3. - [Release notes](https://github.com/actions/cache/releases) - [Commits](https://github.com/actions/cache/compare/v2.1.2...0781355a23dac32fd3bac414512f4b903437991a) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- .github/workflows/coverage.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f543a94af363b8..12c591e41362ef 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -135,7 +135,7 @@ jobs: run: sudo ./.github/workflows/posix-deps-apt.sh - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache@v2.1.2 + uses: actions/cache@v2.1.3 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index ed71a012395d4f..11748f0e449812 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -32,7 +32,7 @@ jobs: run: sudo ./.github/workflows/posix-deps-apt.sh - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache@v2.1.2 + uses: actions/cache@v2.1.3 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} From a8ac7720e6cf77de05d9c7c0f9d04ffc1720ae84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Dec 2020 09:00:11 -0600 Subject: [PATCH 0698/1261] build(deps): bump actions/upload-artifact from v2.2.0 to v2.2.1 (GH-23583) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from v2.2.0 to v2.2.1. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v2.2.0...726a6dcd0199f578459862705eed35cda05af50b) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/doc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index f0dbfcd9d3b49e..82e9645b5b3377 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -38,7 +38,7 @@ jobs: - name: 'Build documentation' run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" doctest html - name: 'Upload' - uses: actions/upload-artifact@v2.2.0 + uses: actions/upload-artifact@v2.2.1 with: name: doc-html path: Doc/build/html From 74b10faf6549e83c3c8df16513cdf7f2beaad033 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 1 Dec 2020 16:22:25 +0100 Subject: [PATCH 0699/1261] bpo-37221: PyCode_New() didn't change in Python 3.8 (GH-23595) --- Doc/whatsnew/3.8.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 6a9fa341569465..0b4820f3333e13 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -2113,9 +2113,6 @@ Changes in the C API (Contributed by Antoine Pitrou in :issue:`32388`.) -* The :c:func:`PyCode_New` has a new parameter in the second position (*posonlyargcount*) - to support :pep:`570`, indicating the number of positional-only arguments. - * The functions :c:func:`PyNode_AddChild` and :c:func:`PyParser_AddToken` now accept two additional ``int`` arguments *end_lineno* and *end_col_offset*. From fc6898bdcbc5573dce462fa0b50084a83ff555a5 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Wed, 2 Dec 2020 04:34:42 +0800 Subject: [PATCH 0700/1261] bpo-31904: Fix test_netrc for VxWorks RTOS (GH-21675) Fix test_netrc on VxWorks: create temporary directories using temp_cwd(). --- Lib/test/test_netrc.py | 90 +++++++++---------- .../2020-12-01-15-51-19.bpo-31904.iwetj4.rst | 1 + 2 files changed, 43 insertions(+), 48 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-12-01-15-51-19.bpo-31904.iwetj4.rst diff --git a/Lib/test/test_netrc.py b/Lib/test/test_netrc.py index 2bd46aa745ff23..90ef5cd363b3fb 100644 --- a/Lib/test/test_netrc.py +++ b/Lib/test/test_netrc.py @@ -109,62 +109,56 @@ def test_comment_at_end_of_machine_line_pass_has_hash(self): def test_security(self): # This test is incomplete since we are normally not run as root and # therefore can't test the file ownership being wrong. - d = os_helper.TESTFN - os.mkdir(d) - self.addCleanup(os_helper.rmtree, d) - fn = os.path.join(d, '.netrc') - with open(fn, 'wt') as f: - f.write("""\ - machine foo.domain.com login bar password pass - default login foo password pass - """) - with os_helper.EnvironmentVarGuard() as environ: - environ.set('HOME', d) - os.chmod(fn, 0o600) - nrc = netrc.netrc() - self.assertEqual(nrc.hosts['foo.domain.com'], - ('bar', None, 'pass')) - os.chmod(fn, 0o622) - self.assertRaises(netrc.NetrcParseError, netrc.netrc) + with os_helper.temp_cwd(None) as d: + fn = os.path.join(d, '.netrc') + with open(fn, 'wt') as f: + f.write("""\ + machine foo.domain.com login bar password pass + default login foo password pass + """) + with os_helper.EnvironmentVarGuard() as environ: + environ.set('HOME', d) + os.chmod(fn, 0o600) + nrc = netrc.netrc() + self.assertEqual(nrc.hosts['foo.domain.com'], + ('bar', None, 'pass')) + os.chmod(fn, 0o622) + self.assertRaises(netrc.NetrcParseError, netrc.netrc) def test_file_not_found_in_home(self): - d = os_helper.TESTFN - os.mkdir(d) - self.addCleanup(os_helper.rmtree, d) - with os_helper.EnvironmentVarGuard() as environ: - environ.set('HOME', d) - self.assertRaises(FileNotFoundError, netrc.netrc) + with os_helper.temp_cwd(None) as d: + with os_helper.EnvironmentVarGuard() as environ: + environ.set('HOME', d) + self.assertRaises(FileNotFoundError, netrc.netrc) def test_file_not_found_explicit(self): self.assertRaises(FileNotFoundError, netrc.netrc, file='unlikely_netrc') def test_home_not_set(self): - fake_home = os_helper.TESTFN - os.mkdir(fake_home) - self.addCleanup(os_helper.rmtree, fake_home) - fake_netrc_path = os.path.join(fake_home, '.netrc') - with open(fake_netrc_path, 'w') as f: - f.write('machine foo.domain.com login bar password pass') - os.chmod(fake_netrc_path, 0o600) - - orig_expanduser = os.path.expanduser - called = [] - - def fake_expanduser(s): - called.append(s) - with os_helper.EnvironmentVarGuard() as environ: - environ.set('HOME', fake_home) - environ.set('USERPROFILE', fake_home) - result = orig_expanduser(s) - return result - - with support.swap_attr(os.path, 'expanduser', fake_expanduser): - nrc = netrc.netrc() - login, account, password = nrc.authenticators('foo.domain.com') - self.assertEqual(login, 'bar') - - self.assertTrue(called) + with os_helper.temp_cwd(None) as fake_home: + fake_netrc_path = os.path.join(fake_home, '.netrc') + with open(fake_netrc_path, 'w') as f: + f.write('machine foo.domain.com login bar password pass') + os.chmod(fake_netrc_path, 0o600) + + orig_expanduser = os.path.expanduser + called = [] + + def fake_expanduser(s): + called.append(s) + with os_helper.EnvironmentVarGuard() as environ: + environ.set('HOME', fake_home) + environ.set('USERPROFILE', fake_home) + result = orig_expanduser(s) + return result + + with support.swap_attr(os.path, 'expanduser', fake_expanduser): + nrc = netrc.netrc() + login, account, password = nrc.authenticators('foo.domain.com') + self.assertEqual(login, 'bar') + + self.assertTrue(called) if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/Tests/2020-12-01-15-51-19.bpo-31904.iwetj4.rst b/Misc/NEWS.d/next/Tests/2020-12-01-15-51-19.bpo-31904.iwetj4.rst new file mode 100644 index 00000000000000..49e9892e9ed7c0 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-12-01-15-51-19.bpo-31904.iwetj4.rst @@ -0,0 +1 @@ +Fix test_netrc on VxWorks: create temporary directories using temp_cwd(). From 2bc30b3baaf6f09a67ec556c70b08e7f648aaa03 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 2 Dec 2020 05:16:31 +0000 Subject: [PATCH 0701/1261] bpo-40939: Restore some stable API functions incorrectly deleted (GH-23606) --- Python/pythonrun.c | 111 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 103 insertions(+), 8 deletions(-) diff --git a/Python/pythonrun.c b/Python/pythonrun.c index bd49c40e9786c3..6181a38defcc0d 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1235,14 +1235,6 @@ Py_CompileStringExFlags(const char *str, const char *filename_str, int start, return co; } -/* For use in Py_LIMITED_API */ -#undef Py_CompileString -PyObject * -PyCompileString(const char *str, const char *filename, int start) -{ - return Py_CompileStringFlags(str, filename, start, NULL); -} - const char * _Py_SourceAsString(PyObject *cmd, const char *funcname, const char *what, PyCompilerFlags *cf, PyObject **cmd_copy) { @@ -1371,6 +1363,109 @@ PyOS_CheckStack(void) #endif /* USE_STACKCHECK */ +/* Deprecated C API functions still provided for binary compatibility */ + +#undef PyRun_AnyFile +PyAPI_FUNC(int) +PyRun_AnyFile(FILE *fp, const char *name) +{ + return PyRun_AnyFileExFlags(fp, name, 0, NULL); +} + +#undef PyRun_AnyFileEx +PyAPI_FUNC(int) +PyRun_AnyFileEx(FILE *fp, const char *name, int closeit) +{ + return PyRun_AnyFileExFlags(fp, name, closeit, NULL); +} + +#undef PyRun_AnyFileFlags +PyAPI_FUNC(int) +PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags) +{ + return PyRun_AnyFileExFlags(fp, name, 0, flags); +} + +#undef PyRun_File +PyAPI_FUNC(PyObject *) +PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l) +{ + return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL); +} + +#undef PyRun_FileEx +PyAPI_FUNC(PyObject *) +PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c) +{ + return PyRun_FileExFlags(fp, p, s, g, l, c, NULL); +} + +#undef PyRun_FileFlags +PyAPI_FUNC(PyObject *) +PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, + PyCompilerFlags *flags) +{ + return PyRun_FileExFlags(fp, p, s, g, l, 0, flags); +} + +#undef PyRun_SimpleFile +PyAPI_FUNC(int) +PyRun_SimpleFile(FILE *f, const char *p) +{ + return PyRun_SimpleFileExFlags(f, p, 0, NULL); +} + +#undef PyRun_SimpleFileEx +PyAPI_FUNC(int) +PyRun_SimpleFileEx(FILE *f, const char *p, int c) +{ + return PyRun_SimpleFileExFlags(f, p, c, NULL); +} + + +#undef PyRun_String +PyAPI_FUNC(PyObject *) +PyRun_String(const char *str, int s, PyObject *g, PyObject *l) +{ + return PyRun_StringFlags(str, s, g, l, NULL); +} + +#undef PyRun_SimpleString +PyAPI_FUNC(int) +PyRun_SimpleString(const char *s) +{ + return PyRun_SimpleStringFlags(s, NULL); +} + +#undef Py_CompileString +PyAPI_FUNC(PyObject *) +Py_CompileString(const char *str, const char *p, int s) +{ + return Py_CompileStringExFlags(str, p, s, NULL, -1); +} + +#undef Py_CompileStringFlags +PyAPI_FUNC(PyObject *) +Py_CompileStringFlags(const char *str, const char *p, int s, + PyCompilerFlags *flags) +{ + return Py_CompileStringExFlags(str, p, s, flags, -1); +} + +#undef PyRun_InteractiveOne +PyAPI_FUNC(int) +PyRun_InteractiveOne(FILE *f, const char *p) +{ + return PyRun_InteractiveOneFlags(f, p, NULL); +} + +#undef PyRun_InteractiveLoop +PyAPI_FUNC(int) +PyRun_InteractiveLoop(FILE *f, const char *p) +{ + return PyRun_InteractiveLoopFlags(f, p, NULL); +} + #ifdef __cplusplus } #endif From eea3ee2b68add2db53271ca08af237605d414449 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 2 Dec 2020 06:07:56 +0000 Subject: [PATCH 0702/1261] Correct return type in Modules/_ssl.c::sslmodule_legacy (GH-23609) --- Modules/_ssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index edb850ee461037..96d2796fcfad48 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -6416,7 +6416,7 @@ sslmodule_legacy(PyObject *module) #ifdef HAVE_OPENSSL_CRYPTO_LOCK /* note that this will start threading if not already started */ if (!_setup_ssl_threads()) { - return NULL; + return 0; } #elif OPENSSL_VERSION_1_1 /* OpenSSL 1.1.0 builtin thread support is enabled */ From ee41b10e5ac48348c847ac69605155c73053e02b Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Wed, 2 Dec 2020 13:30:55 +0000 Subject: [PATCH 0703/1261] bpo-42500: Fix recursion in or after except (GH-23568) * Use counter, rather boolean state when handling soft overflows. --- Include/cpython/pystate.h | 3 +- Include/internal/pycore_ceval.h | 16 ------ Lib/test/test_exceptions.py | 52 ++++++++++++++++++- Lib/test/test_sys.py | 46 +++------------- .../2020-11-30-14-27-29.bpo-42500.excVKU.rst | 2 + Python/ceval.c | 20 +++---- Python/errors.c | 3 ++ Python/pystate.c | 2 +- Python/sysmodule.c | 4 +- 9 files changed, 76 insertions(+), 72 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-30-14-27-29.bpo-42500.excVKU.rst diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 0e6cc290912366..cfaee890f97151 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -54,8 +54,7 @@ struct _ts { /* Borrowed reference to the current frame (it can be NULL) */ PyFrameObject *frame; int recursion_depth; - char overflowed; /* The stack has overflowed. Allow 50 more calls - to handle the runtime error. */ + int recursion_headroom; /* Allow 50 more calls to handle any errors. */ int stackcheck_counter; /* 'tracing' keeps track of the execution depth when tracing/profiling. diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index bbb667ea32d27e..38fd681f20c459 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -92,24 +92,8 @@ static inline int _Py_EnterRecursiveCall_inline(const char *where) { #define Py_EnterRecursiveCall(where) _Py_EnterRecursiveCall_inline(where) -/* Compute the "lower-water mark" for a recursion limit. When - * Py_LeaveRecursiveCall() is called with a recursion depth below this mark, - * the overflowed flag is reset to 0. */ -static inline int _Py_RecursionLimitLowerWaterMark(int limit) { - if (limit > 200) { - return (limit - 50); - } - else { - return (3 * (limit >> 2)); - } -} - static inline void _Py_LeaveRecursiveCall(PyThreadState *tstate) { tstate->recursion_depth--; - int limit = tstate->interp->ceval.recursion_limit; - if (tstate->recursion_depth < _Py_RecursionLimitLowerWaterMark(limit)) { - tstate->overflowed = 0; - } } static inline void _Py_LeaveRecursiveCall_inline(void) { diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 4dbf5fe5d5bc3a..1bdd3f2ce59934 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1046,7 +1046,7 @@ def gen(): # tstate->recursion_depth is equal to (recursion_limit - 1) # and is equal to recursion_limit when _gen_throw() calls # PyErr_NormalizeException(). - recurse(setrecursionlimit(depth + 2) - depth - 1) + recurse(setrecursionlimit(depth + 2) - depth) finally: sys.setrecursionlimit(recursionlimit) print('Done.') @@ -1076,6 +1076,54 @@ def test_recursion_normalizing_infinite_exception(self): b'while normalizing an exception', err) self.assertIn(b'Done.', out) + + def test_recursion_in_except_handler(self): + + def set_relative_recursion_limit(n): + depth = 1 + while True: + try: + sys.setrecursionlimit(depth) + except RecursionError: + depth += 1 + else: + break + sys.setrecursionlimit(depth+n) + + def recurse_in_except(): + try: + 1/0 + except: + recurse_in_except() + + def recurse_after_except(): + try: + 1/0 + except: + pass + recurse_after_except() + + def recurse_in_body_and_except(): + try: + recurse_in_body_and_except() + except: + recurse_in_body_and_except() + + recursionlimit = sys.getrecursionlimit() + try: + set_relative_recursion_limit(10) + for func in (recurse_in_except, recurse_after_except, recurse_in_body_and_except): + with self.subTest(func=func): + try: + func() + except RecursionError: + pass + else: + self.fail("Should have raised a RecursionError") + finally: + sys.setrecursionlimit(recursionlimit) + + @cpython_only def test_recursion_normalizing_with_no_memory(self): # Issue #30697. Test that in the abort that occurs when there is no @@ -1112,7 +1160,7 @@ def raiseMemError(): except MemoryError as e: tb = e.__traceback__ else: - self.fail("Should have raises a MemoryError") + self.fail("Should have raised a MemoryError") return traceback.format_tb(tb) tb1 = raiseMemError() diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 173ef9ebb4c195..3860656c181c2b 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -221,7 +221,7 @@ def test_recursionlimit_recovery(self): def f(): f() try: - for depth in (10, 25, 50, 75, 100, 250, 1000): + for depth in (50, 75, 100, 250, 1000): try: sys.setrecursionlimit(depth) except RecursionError: @@ -231,17 +231,17 @@ def f(): # Issue #5392: test stack overflow after hitting recursion # limit twice - self.assertRaises(RecursionError, f) - self.assertRaises(RecursionError, f) + with self.assertRaises(RecursionError): + f() + with self.assertRaises(RecursionError): + f() finally: sys.setrecursionlimit(oldlimit) @test.support.cpython_only def test_setrecursionlimit_recursion_depth(self): # Issue #25274: Setting a low recursion limit must be blocked if the - # current recursion depth is already higher than the "lower-water - # mark". Otherwise, it may not be possible anymore to - # reset the overflowed flag to 0. + # current recursion depth is already higher than limit. from _testinternalcapi import get_recursion_depth @@ -262,42 +262,10 @@ def set_recursion_limit_at_depth(depth, limit): sys.setrecursionlimit(1000) for limit in (10, 25, 50, 75, 100, 150, 200): - # formula extracted from _Py_RecursionLimitLowerWaterMark() - if limit > 200: - depth = limit - 50 - else: - depth = limit * 3 // 4 - set_recursion_limit_at_depth(depth, limit) + set_recursion_limit_at_depth(limit, limit) finally: sys.setrecursionlimit(oldlimit) - # The error message is specific to CPython - @test.support.cpython_only - def test_recursionlimit_fatalerror(self): - # A fatal error occurs if a second recursion limit is hit when recovering - # from a first one. - code = textwrap.dedent(""" - import sys - - def f(): - try: - f() - except RecursionError: - f() - - sys.setrecursionlimit(%d) - f()""") - with test.support.SuppressCrashReport(): - for i in (50, 1000): - sub = subprocess.Popen([sys.executable, '-c', code % i], - stderr=subprocess.PIPE) - err = sub.communicate()[1] - self.assertTrue(sub.returncode, sub.returncode) - self.assertIn( - b"Fatal Python error: _Py_CheckRecursiveCall: " - b"Cannot recover from stack overflow", - err) - def test_getwindowsversion(self): # Raise SkipTest if sys doesn't have getwindowsversion attribute test.support.get_attribute(sys, "getwindowsversion") diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-30-14-27-29.bpo-42500.excVKU.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-30-14-27-29.bpo-42500.excVKU.rst new file mode 100644 index 00000000000000..2462a8e1fabefc --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-30-14-27-29.bpo-42500.excVKU.rst @@ -0,0 +1,2 @@ +Improve handling of exceptions near recursion limit. Converts a number of +Fatal Errors in RecursionErrors. diff --git a/Python/ceval.c b/Python/ceval.c index 693852e15b7c35..9de925780e4072 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -857,20 +857,22 @@ _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where) return -1; } #endif - if (tstate->overflowed) { + if (tstate->recursion_headroom) { if (tstate->recursion_depth > recursion_limit + 50) { /* Overflowing while handling an overflow. Give up. */ Py_FatalError("Cannot recover from stack overflow."); } - return 0; } - if (tstate->recursion_depth > recursion_limit) { - --tstate->recursion_depth; - tstate->overflowed = 1; - _PyErr_Format(tstate, PyExc_RecursionError, - "maximum recursion depth exceeded%s", - where); - return -1; + else { + if (tstate->recursion_depth > recursion_limit) { + tstate->recursion_headroom++; + _PyErr_Format(tstate, PyExc_RecursionError, + "maximum recursion depth exceeded%s", + where); + tstate->recursion_headroom--; + --tstate->recursion_depth; + return -1; + } } return 0; } diff --git a/Python/errors.c b/Python/errors.c index f80ae21fdde7ce..8242ac69785d4f 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -290,12 +290,14 @@ _PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc, PyObject **val, PyObject **tb) { int recursion_depth = 0; + tstate->recursion_headroom++; PyObject *type, *value, *initial_tb; restart: type = *exc; if (type == NULL) { /* There was no exception, so nothing to do. */ + tstate->recursion_headroom--; return; } @@ -347,6 +349,7 @@ _PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc, } *exc = type; *val = value; + tstate->recursion_headroom--; return; error: diff --git a/Python/pystate.c b/Python/pystate.c index 600cc5e03a1cf0..8da583f8e06bc0 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -605,7 +605,7 @@ new_threadstate(PyInterpreterState *interp, int init) tstate->frame = NULL; tstate->recursion_depth = 0; - tstate->overflowed = 0; + tstate->recursion_headroom = 0; tstate->stackcheck_counter = 0; tstate->tracing = 0; tstate->use_tracing = 0; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index f05b33a9aacf1d..b80d37df42c808 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1181,7 +1181,6 @@ static PyObject * sys_setrecursionlimit_impl(PyObject *module, int new_limit) /*[clinic end generated code: output=35e1c64754800ace input=b0f7a23393924af3]*/ { - int mark; PyThreadState *tstate = _PyThreadState_GET(); if (new_limit < 1) { @@ -1199,8 +1198,7 @@ sys_setrecursionlimit_impl(PyObject *module, int new_limit) Reject too low new limit if the current recursion depth is higher than the new low-water mark. Otherwise it may not be possible anymore to reset the overflowed flag to 0. */ - mark = _Py_RecursionLimitLowerWaterMark(new_limit); - if (tstate->recursion_depth >= mark) { + if (tstate->recursion_depth >= new_limit) { _PyErr_Format(tstate, PyExc_RecursionError, "cannot set the recursion limit to %i at " "the recursion depth %i: the limit is too low", From e3843b935d730f48851dd1fc9d789da5eaca4a7d Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Wed, 2 Dec 2020 13:31:40 +0000 Subject: [PATCH 0704/1261] bpo-42246: Make sure that line number is correct after a return, as required by PEP 626 (GH-23495) Make sure that line number is correct after a return, as defined by PEP 626. --- Lib/test/test_compile.py | 35 +- Lib/test/test_dis.py | 12 +- .../2020-11-24-14-01-43.bpo-42246.c9k9hj.rst | 2 + Python/compile.c | 137 +- Python/importlib.h | 2875 +++++----- Python/importlib_external.h | 5002 ++++++++--------- Python/importlib_zipimport.h | 1722 +++--- 7 files changed, 4967 insertions(+), 4818 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-24-14-01-43.bpo-42246.c9k9hj.rst diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 190e1a66610305..1e61f41c25b789 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -156,7 +156,7 @@ def test_leading_newlines(self): s256 = "".join(["\n"] * 256 + ["spam"]) co = compile(s256, 'fn', 'exec') self.assertEqual(co.co_firstlineno, 1) - self.assertEqual(list(co.co_lines()), [(0, 4, 257), (4, 8, None)]) + self.assertEqual(list(co.co_lines()), [(0, 8, 257)]) def test_literals_with_leading_zeroes(self): for arg in ["077787", "0xj", "0x.", "0e", "090000000000000", @@ -775,6 +775,39 @@ def or_false(x): self.assertIn('LOAD_', opcodes[0].opname) self.assertEqual('RETURN_VALUE', opcodes[1].opname) + def test_lineno_after_implicit_return(self): + TRUE = True + # Don't use constant True or False, as compiler will remove test + def if1(x): + x() + if TRUE: + pass + def if2(x): + x() + if TRUE: + pass + else: + pass + def if3(x): + x() + if TRUE: + pass + else: + return None + def if4(x): + x() + if not TRUE: + pass + funcs = [ if1, if2, if3, if4] + lastlines = [ 3, 3, 3, 2] + frame = None + def save_caller_frame(): + nonlocal frame + frame = sys._getframe(1) + for func, lastline in zip(funcs, lastlines, strict=True): + with self.subTest(func=func): + func(save_caller_frame) + self.assertEqual(frame.f_lineno-frame.f_code.co_firstlineno, lastline) def test_big_dict_literal(self): # The compiler has a flushing point in "compiler_dict" that calls compiles diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 9cd11d3118b604..d0743d62e3d794 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -131,12 +131,14 @@ def bug708901(): 12 STORE_FAST 0 (res) %3d 14 JUMP_ABSOLUTE 10 - >> 16 LOAD_CONST 0 (None) + +%3d >> 16 LOAD_CONST 0 (None) 18 RETURN_VALUE """ % (bug708901.__code__.co_firstlineno + 1, bug708901.__code__.co_firstlineno + 2, bug708901.__code__.co_firstlineno + 1, - bug708901.__code__.co_firstlineno + 3) + bug708901.__code__.co_firstlineno + 3, + bug708901.__code__.co_firstlineno + 1) def bug1333982(x=[]): @@ -295,13 +297,15 @@ def bug1333982(x=[]): 52 STORE_FAST 0 (e) 54 DELETE_FAST 0 (e) 56 RERAISE - >> 58 RERAISE + +%3d >> 58 RERAISE """ % (TRACEBACK_CODE.co_firstlineno + 1, TRACEBACK_CODE.co_firstlineno + 2, TRACEBACK_CODE.co_firstlineno + 5, TRACEBACK_CODE.co_firstlineno + 3, TRACEBACK_CODE.co_firstlineno + 4, - TRACEBACK_CODE.co_firstlineno + 5) + TRACEBACK_CODE.co_firstlineno + 5, + TRACEBACK_CODE.co_firstlineno + 3) def _fstring(a, b, c, d): return f'{a} {b:4} {c!r} {d!r:4}' diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-24-14-01-43.bpo-42246.c9k9hj.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-24-14-01-43.bpo-42246.c9k9hj.rst new file mode 100644 index 00000000000000..ff200475e63685 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-24-14-01-43.bpo-42246.c9k9hj.rst @@ -0,0 +1,2 @@ +PEP 626: After a return, the f_lineno attribute of a frame is always the +last line executed. diff --git a/Python/compile.c b/Python/compile.c index 57aa43476becd5..c67e8e885e4e6c 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -812,6 +812,28 @@ compiler_use_next_block(struct compiler *c, basicblock *block) return block; } +static basicblock * +compiler_copy_block(struct compiler *c, basicblock *block) +{ + /* Cannot copy a block if it has a fallthrough, since + * a block can only have one fallthrough predecessor. + */ + assert(block->b_nofallthrough); + basicblock *result = compiler_next_block(c); + if (result == NULL) { + return NULL; + } + for (int i = 0; i < block->b_iused; i++) { + int n = compiler_next_instr(result); + if (n < 0) { + return NULL; + } + result->b_instr[n] = block->b_instr[i]; + } + result->b_exit = block->b_exit; + return result; +} + /* Returns the offset of the next instruction in the current block's b_instr array. Resizes the b_instr as necessary. Returns -1 on failure. @@ -2732,12 +2754,13 @@ compiler_if(struct compiler *c, stmt_ty s) static int compiler_for(struct compiler *c, stmt_ty s) { - basicblock *start, *cleanup, *end; + basicblock *start, *body, *cleanup, *end; start = compiler_new_block(c); + body = compiler_new_block(c); cleanup = compiler_new_block(c); end = compiler_new_block(c); - if (start == NULL || end == NULL || cleanup == NULL) { + if (start == NULL || body == NULL || end == NULL || cleanup == NULL) { return 0; } if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) { @@ -2747,6 +2770,7 @@ compiler_for(struct compiler *c, stmt_ty s) ADDOP(c, GET_ITER); compiler_use_next_block(c, start); ADDOP_JUMP(c, FOR_ITER, cleanup); + compiler_use_next_block(c, body); VISIT(c, expr, s->v.For.target); VISIT_SEQ(c, stmt, s->v.For.body); ADDOP_JUMP(c, JUMP_ABSOLUTE, start); @@ -5929,9 +5953,16 @@ dump_basicblock(const basicblock *b) } #endif + +static int +normalize_basic_block(basicblock *bb); + static int optimize_cfg(struct assembler *a, PyObject *consts); +static int +ensure_exits_have_lineno(struct compiler *c); + static PyCodeObject * assemble(struct compiler *c, int addNone) { @@ -5952,6 +5983,16 @@ assemble(struct compiler *c, int addNone) ADDOP(c, RETURN_VALUE); } + for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) { + if (normalize_basic_block(b)) { + goto error; + } + } + + if (ensure_exits_have_lineno(c)) { + goto error; + } + nblocks = 0; entryblock = NULL; for (b = c->u->u_blocks; b != NULL; b = b->b_list) { @@ -5966,6 +6007,7 @@ assemble(struct compiler *c, int addNone) else c->u->u_firstlineno = 1; } + if (!assemble_init(&a, nblocks, c->u->u_firstlineno)) goto error; a.a_entry = entryblock; @@ -6338,7 +6380,6 @@ clean_basic_block(basicblock *bb) { bb->b_iused = dest; } - static int normalize_basic_block(basicblock *bb) { /* Mark blocks as exit and/or nofallthrough. @@ -6349,7 +6390,8 @@ normalize_basic_block(basicblock *bb) { case RAISE_VARARGS: case RERAISE: bb->b_exit = 1; - /* fall through */ + bb->b_nofallthrough = 1; + break; case JUMP_ABSOLUTE: case JUMP_FORWARD: bb->b_nofallthrough = 1; @@ -6358,16 +6400,21 @@ normalize_basic_block(basicblock *bb) { case POP_JUMP_IF_TRUE: case JUMP_IF_FALSE_OR_POP: case JUMP_IF_TRUE_OR_POP: + case FOR_ITER: if (i != bb->b_iused-1) { PyErr_SetString(PyExc_SystemError, "malformed control flow graph."); return -1; } + /* Skip over empty basic blocks. */ + while (bb->b_instr[i].i_target->b_iused == 0) { + bb->b_instr[i].i_target = bb->b_instr[i].i_target->b_next; + } + } } return 0; } - static int mark_reachable(struct assembler *a) { basicblock **stack, **sp; @@ -6398,8 +6445,27 @@ mark_reachable(struct assembler *a) { return 0; } +/* If an instruction has no line number, but it's predecessor in the BB does, + * then copy the line number. This reduces the size of the line number table, + * but has no impact on the generated line number events. + */ +static void +minimize_lineno_table(struct assembler *a) { + for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { + int prev_lineno = -1; + for (int i = 0; i < b->b_iused; i++) { + if (b->b_instr[i].i_lineno < 0) { + b->b_instr[i].i_lineno = prev_lineno; + } + else { + prev_lineno = b->b_instr[i].i_lineno; + } + } + + } +} -/* Perform basic peephole optimizations on a control flow graph. +/* Perform optimizations on a control flow graph. The consts object should still be in list form to allow new constants to be appended. @@ -6411,11 +6477,6 @@ mark_reachable(struct assembler *a) { static int optimize_cfg(struct assembler *a, PyObject *consts) { - for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { - if (normalize_basic_block(b)) { - return -1; - } - } for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { if (optimize_basic_block(b, consts)) { return -1; @@ -6432,9 +6493,63 @@ optimize_cfg(struct assembler *a, PyObject *consts) b->b_iused = 0; } } + minimize_lineno_table(a); + return 0; +} + +static inline int +is_exit_without_lineno(basicblock *b) { + return b->b_exit && b->b_instr[0].i_lineno < 0; +} + +/* PEP 626 mandates that the f_lineno of a frame is correct + * after a frame terminates. It would be prohibitively expensive + * to continuously update the f_lineno field at runtime, + * so we make sure that all exiting instruction (raises and returns) + * have a valid line number, allowing us to compute f_lineno lazily. + * We can do this by duplicating the exit blocks without line number + * so that none have more than one predecessor. We can then safely + * copy the line number from the sole predecessor block. + */ +static int +ensure_exits_have_lineno(struct compiler *c) +{ + /* Copy all exit blocks without line number that are targets of a jump. + */ + for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) { + if (b->b_iused > 0 && is_jump(&b->b_instr[b->b_iused-1])) { + switch (b->b_instr[b->b_iused-1].i_opcode) { + /* Note: Only actual jumps, not exception handlers */ + case SETUP_ASYNC_WITH: + case SETUP_WITH: + case SETUP_FINALLY: + continue; + } + basicblock *target = b->b_instr[b->b_iused-1].i_target; + if (is_exit_without_lineno(target)) { + basicblock *new_target = compiler_copy_block(c, target); + if (new_target == NULL) { + return -1; + } + new_target->b_instr[0].i_lineno = b->b_instr[b->b_iused-1].i_lineno; + b->b_instr[b->b_iused-1].i_target = new_target; + } + } + } + /* Any remaining reachable exit blocks without line number can only be reached by + * fall through, and thus can only have a single predecessor */ + for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) { + if (!b->b_nofallthrough && b->b_next && b->b_iused > 0) { + if (is_exit_without_lineno(b->b_next)) { + assert(b->b_next->b_iused > 0); + b->b_next->b_instr[0].i_lineno = b->b_instr[b->b_iused-1].i_lineno; + } + } + } return 0; } + /* Retained for API compatibility. * Optimization is now done in optimize_cfg */ diff --git a/Python/importlib.h b/Python/importlib.h index c76ee3c5592921..c5ff9ece081ee6 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -71,217 +71,216 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 108,97,99,101,169,0,114,10,0,0,0,250,29,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,218,5,95,119,114,97, - 112,34,0,0,0,115,12,0,0,0,8,2,10,1,20,1, - 14,1,4,128,255,128,114,12,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0, - 67,0,0,0,115,12,0,0,0,116,0,116,1,131,1,124, - 0,131,1,83,0,169,1,78,41,2,218,4,116,121,112,101, - 218,3,115,121,115,169,1,218,4,110,97,109,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,11,95,110, - 101,119,95,109,111,100,117,108,101,42,0,0,0,115,4,0, - 0,0,12,1,255,128,114,18,0,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 64,0,0,0,115,12,0,0,0,101,0,90,1,100,0,90, - 2,100,1,83,0,41,2,218,14,95,68,101,97,100,108,111, - 99,107,69,114,114,111,114,78,41,3,114,1,0,0,0,114, - 0,0,0,0,114,2,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,19,0, - 0,0,55,0,0,0,115,6,0,0,0,8,0,4,1,255, - 128,114,19,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, - 56,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, - 100,10,100,11,132,0,90,8,100,12,83,0,41,13,218,11, - 95,77,111,100,117,108,101,76,111,99,107,122,169,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,0, - 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, - 48,0,0,0,116,0,160,1,161,0,124,0,95,2,116,0, - 160,1,161,0,124,0,95,3,124,1,124,0,95,4,100,0, - 124,0,95,5,100,1,124,0,95,6,100,1,124,0,95,7, - 100,0,83,0,169,2,78,233,0,0,0,0,41,8,218,7, - 95,116,104,114,101,97,100,90,13,97,108,108,111,99,97,116, - 101,95,108,111,99,107,218,4,108,111,99,107,218,6,119,97, - 107,101,117,112,114,17,0,0,0,218,5,111,119,110,101,114, - 218,5,99,111,117,110,116,218,7,119,97,105,116,101,114,115, - 169,2,218,4,115,101,108,102,114,17,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,8,95,95, - 105,110,105,116,95,95,65,0,0,0,115,16,0,0,0,10, - 1,10,1,6,1,6,1,6,1,6,1,4,128,255,128,122, - 20,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,0,0, - 0,0,5,0,0,0,3,0,0,0,67,0,0,0,115,84, - 0,0,0,116,0,160,1,161,0,125,1,124,0,106,2,125, - 2,116,3,131,0,125,3,116,4,160,5,124,2,161,1,125, - 4,124,4,100,0,117,0,114,42,100,1,83,0,124,4,106, - 2,125,2,124,2,124,1,107,2,114,60,100,2,83,0,124, - 2,124,3,118,0,114,72,100,1,83,0,124,3,160,6,124, - 2,161,1,1,0,113,20,41,3,78,70,84,41,7,114,23, - 0,0,0,218,9,103,101,116,95,105,100,101,110,116,114,26, - 0,0,0,218,3,115,101,116,218,12,95,98,108,111,99,107, - 105,110,103,95,111,110,218,3,103,101,116,218,3,97,100,100, - 41,5,114,30,0,0,0,90,2,109,101,218,3,116,105,100, - 90,4,115,101,101,110,114,24,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,12,104,97,115,95, - 100,101,97,100,108,111,99,107,73,0,0,0,115,26,0,0, - 0,8,2,6,1,6,1,10,2,8,1,4,1,6,1,8, - 1,4,1,8,1,4,6,12,1,255,128,122,24,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,0,0, - 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,196, - 0,0,0,116,0,160,1,161,0,125,1,124,0,116,2,124, - 1,60,0,122,170,124,0,106,3,143,126,1,0,124,0,106, - 4,100,1,107,2,115,46,124,0,106,5,124,1,107,2,114, - 90,124,1,124,0,95,5,124,0,4,0,106,4,100,2,55, - 0,2,0,95,4,87,0,100,3,4,0,4,0,131,3,1, - 0,87,0,116,2,124,1,61,0,100,4,83,0,124,0,160, - 6,161,0,114,110,116,7,100,5,124,0,22,0,131,1,130, - 1,124,0,106,8,160,9,100,6,161,1,114,136,124,0,4, - 0,106,10,100,2,55,0,2,0,95,10,87,0,100,3,4, - 0,4,0,131,3,1,0,110,16,49,0,115,156,48,0,1, - 0,1,0,1,0,89,0,1,0,124,0,106,8,160,9,161, - 0,1,0,124,0,106,8,160,11,161,0,1,0,113,18,116, - 2,124,1,61,0,48,0,41,7,122,185,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,114,22,0,0,0,233,1,0,0,0,78,84, - 122,23,100,101,97,100,108,111,99,107,32,100,101,116,101,99, - 116,101,100,32,98,121,32,37,114,70,41,12,114,23,0,0, - 0,114,32,0,0,0,114,34,0,0,0,114,24,0,0,0, - 114,27,0,0,0,114,26,0,0,0,114,38,0,0,0,114, - 19,0,0,0,114,25,0,0,0,218,7,97,99,113,117,105, - 114,101,114,28,0,0,0,218,7,114,101,108,101,97,115,101, - 169,2,114,30,0,0,0,114,37,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,40,0,0,0, - 94,0,0,0,115,36,0,0,0,8,6,8,1,2,1,8, - 2,20,1,6,1,14,1,14,1,6,9,4,247,8,1,12, - 1,12,1,44,1,10,2,12,1,8,2,255,128,122,19,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,0,0,0,0,2, - 0,0,0,8,0,0,0,67,0,0,0,115,144,0,0,0, - 116,0,160,1,161,0,125,1,124,0,106,2,143,110,1,0, - 124,0,106,3,124,1,107,3,114,34,116,4,100,1,131,1, - 130,1,124,0,106,5,100,2,107,4,115,48,74,0,130,1, - 124,0,4,0,106,5,100,3,56,0,2,0,95,5,124,0, - 106,5,100,2,107,2,114,108,100,0,124,0,95,3,124,0, - 106,6,114,108,124,0,4,0,106,6,100,3,56,0,2,0, - 95,6,124,0,106,7,160,8,161,0,1,0,87,0,100,0, - 4,0,4,0,131,3,1,0,100,0,83,0,49,0,115,130, - 48,0,1,0,1,0,1,0,89,0,1,0,100,0,83,0, - 41,4,78,250,31,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,114,22,0,0,0,114,39,0,0,0,41,9, - 114,23,0,0,0,114,32,0,0,0,114,24,0,0,0,114, - 26,0,0,0,218,12,82,117,110,116,105,109,101,69,114,114, - 111,114,114,27,0,0,0,114,28,0,0,0,114,25,0,0, - 0,114,41,0,0,0,114,42,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,41,0,0,0,119, - 0,0,0,115,30,0,0,0,8,1,8,1,10,1,8,1, - 14,1,14,1,10,1,6,1,6,1,14,1,22,1,4,128, - 16,0,4,128,255,128,122,19,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,0,0,0,0,1,0,0,0,5,0,0,0, - 67,0,0,0,115,18,0,0,0,100,1,160,0,124,0,106, - 1,116,2,124,0,131,1,161,2,83,0,41,2,78,122,23, - 95,77,111,100,117,108,101,76,111,99,107,40,123,33,114,125, - 41,32,97,116,32,123,125,169,3,218,6,102,111,114,109,97, - 116,114,17,0,0,0,218,2,105,100,169,1,114,30,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,8,95,95,114,101,112,114,95,95,132,0,0,0,115,4, - 0,0,0,18,1,255,128,122,20,95,77,111,100,117,108,101, - 76,111,99,107,46,95,95,114,101,112,114,95,95,78,41,9, - 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, - 3,0,0,0,114,31,0,0,0,114,38,0,0,0,114,40, - 0,0,0,114,41,0,0,0,114,49,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,20,0,0,0,59,0,0,0,115,16,0,0,0,8, - 0,4,1,8,5,8,8,8,21,8,25,12,13,255,128,114, - 20,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,64,0,0,0,115,48,0, + 112,34,0,0,0,115,10,0,0,0,8,2,10,1,20,1, + 18,1,255,128,114,12,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0, + 0,0,115,12,0,0,0,116,0,116,1,131,1,124,0,131, + 1,83,0,169,1,78,41,2,218,4,116,121,112,101,218,3, + 115,121,115,169,1,218,4,110,97,109,101,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,11,95,110,101,119, + 95,109,111,100,117,108,101,42,0,0,0,115,4,0,0,0, + 12,1,255,128,114,18,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,64,0, + 0,0,115,12,0,0,0,101,0,90,1,100,0,90,2,100, + 1,83,0,41,2,218,14,95,68,101,97,100,108,111,99,107, + 69,114,114,111,114,78,41,3,114,1,0,0,0,114,0,0, + 0,0,114,2,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,19,0,0,0, + 55,0,0,0,115,6,0,0,0,8,0,4,1,255,128,114, + 19,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,64,0,0,0,115,56,0, 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, - 83,0,41,11,218,16,95,68,117,109,109,121,77,111,100,117, - 108,101,76,111,99,107,122,86,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,0,0,0,0,2,0,0,0,2, - 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0, - 95,0,100,1,124,0,95,1,100,0,83,0,114,21,0,0, - 0,41,2,114,17,0,0,0,114,27,0,0,0,114,29,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,31,0,0,0,140,0,0,0,115,8,0,0,0,6, - 1,6,1,4,128,255,128,122,25,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,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,18,0,0,0, - 124,0,4,0,106,0,100,1,55,0,2,0,95,0,100,2, - 83,0,41,3,78,114,39,0,0,0,84,41,1,114,27,0, + 100,11,132,0,90,8,100,12,83,0,41,13,218,11,95,77, + 111,100,117,108,101,76,111,99,107,122,169,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,0,0,0, + 0,2,0,0,0,2,0,0,0,67,0,0,0,115,48,0, + 0,0,116,0,160,1,161,0,124,0,95,2,116,0,160,1, + 161,0,124,0,95,3,124,1,124,0,95,4,100,0,124,0, + 95,5,100,1,124,0,95,6,100,1,124,0,95,7,100,0, + 83,0,169,2,78,233,0,0,0,0,41,8,218,7,95,116, + 104,114,101,97,100,90,13,97,108,108,111,99,97,116,101,95, + 108,111,99,107,218,4,108,111,99,107,218,6,119,97,107,101, + 117,112,114,17,0,0,0,218,5,111,119,110,101,114,218,5, + 99,111,117,110,116,218,7,119,97,105,116,101,114,115,169,2, + 218,4,115,101,108,102,114,17,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,8,95,95,105,110, + 105,116,95,95,65,0,0,0,115,14,0,0,0,10,1,10, + 1,6,1,6,1,6,1,10,1,255,128,122,20,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,0,0,0,0,5,0, + 0,0,3,0,0,0,67,0,0,0,115,84,0,0,0,116, + 0,160,1,161,0,125,1,124,0,106,2,125,2,116,3,131, + 0,125,3,116,4,160,5,124,2,161,1,125,4,124,4,100, + 0,117,0,114,42,100,1,83,0,124,4,106,2,125,2,124, + 2,124,1,107,2,114,60,100,2,83,0,124,2,124,3,118, + 0,114,72,100,1,83,0,124,3,160,6,124,2,161,1,1, + 0,113,20,41,3,78,70,84,41,7,114,23,0,0,0,218, + 9,103,101,116,95,105,100,101,110,116,114,26,0,0,0,218, + 3,115,101,116,218,12,95,98,108,111,99,107,105,110,103,95, + 111,110,218,3,103,101,116,218,3,97,100,100,41,5,114,30, + 0,0,0,90,2,109,101,218,3,116,105,100,90,4,115,101, + 101,110,114,24,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,12,104,97,115,95,100,101,97,100, + 108,111,99,107,73,0,0,0,115,26,0,0,0,8,2,6, + 1,6,1,10,2,8,1,4,1,6,1,8,1,4,1,8, + 1,4,6,12,1,255,128,122,24,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,0,0,0,0,2,0, + 0,0,8,0,0,0,67,0,0,0,115,196,0,0,0,116, + 0,160,1,161,0,125,1,124,0,116,2,124,1,60,0,122, + 170,124,0,106,3,143,126,1,0,124,0,106,4,100,1,107, + 2,115,46,124,0,106,5,124,1,107,2,114,90,124,1,124, + 0,95,5,124,0,4,0,106,4,100,2,55,0,2,0,95, + 4,87,0,100,3,4,0,4,0,131,3,1,0,87,0,116, + 2,124,1,61,0,100,4,83,0,124,0,160,6,161,0,114, + 110,116,7,100,5,124,0,22,0,131,1,130,1,124,0,106, + 8,160,9,100,6,161,1,114,136,124,0,4,0,106,10,100, + 2,55,0,2,0,95,10,87,0,100,3,4,0,4,0,131, + 3,1,0,110,16,49,0,115,156,48,0,1,0,1,0,1, + 0,89,0,1,0,124,0,106,8,160,9,161,0,1,0,124, + 0,106,8,160,11,161,0,1,0,113,18,116,2,124,1,61, + 0,48,0,41,7,122,185,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, + 114,22,0,0,0,233,1,0,0,0,78,84,122,23,100,101, + 97,100,108,111,99,107,32,100,101,116,101,99,116,101,100,32, + 98,121,32,37,114,70,41,12,114,23,0,0,0,114,32,0, + 0,0,114,34,0,0,0,114,24,0,0,0,114,27,0,0, + 0,114,26,0,0,0,114,38,0,0,0,114,19,0,0,0, + 114,25,0,0,0,218,7,97,99,113,117,105,114,101,114,28, + 0,0,0,218,7,114,101,108,101,97,115,101,169,2,114,30, + 0,0,0,114,37,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,40,0,0,0,94,0,0,0, + 115,36,0,0,0,8,6,8,1,2,1,8,2,20,1,6, + 1,14,1,14,1,6,9,4,247,8,1,12,1,12,1,44, + 1,10,2,12,1,8,2,255,128,122,19,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,0,0,0,0,2,0,0,0,8, + 0,0,0,67,0,0,0,115,144,0,0,0,116,0,160,1, + 161,0,125,1,124,0,106,2,143,110,1,0,124,0,106,3, + 124,1,107,3,114,34,116,4,100,1,131,1,130,1,124,0, + 106,5,100,2,107,4,115,48,74,0,130,1,124,0,4,0, + 106,5,100,3,56,0,2,0,95,5,124,0,106,5,100,2, + 107,2,114,108,100,0,124,0,95,3,124,0,106,6,114,108, + 124,0,4,0,106,6,100,3,56,0,2,0,95,6,124,0, + 106,7,160,8,161,0,1,0,87,0,100,0,4,0,4,0, + 131,3,1,0,100,0,83,0,49,0,115,130,48,0,1,0, + 1,0,1,0,89,0,1,0,100,0,83,0,41,4,78,250, + 31,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, + 114,22,0,0,0,114,39,0,0,0,41,9,114,23,0,0, + 0,114,32,0,0,0,114,24,0,0,0,114,26,0,0,0, + 218,12,82,117,110,116,105,109,101,69,114,114,111,114,114,27, + 0,0,0,114,28,0,0,0,114,25,0,0,0,114,41,0, + 0,0,114,42,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,41,0,0,0,119,0,0,0,115, + 24,0,0,0,8,1,8,1,10,1,8,1,14,1,14,1, + 10,1,6,1,6,1,14,1,46,1,255,128,122,19,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,0,0,0,0,1,0, + 0,0,5,0,0,0,67,0,0,0,115,18,0,0,0,100, + 1,160,0,124,0,106,1,116,2,124,0,131,1,161,2,83, + 0,41,2,78,122,23,95,77,111,100,117,108,101,76,111,99, + 107,40,123,33,114,125,41,32,97,116,32,123,125,169,3,218, + 6,102,111,114,109,97,116,114,17,0,0,0,218,2,105,100, + 169,1,114,30,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,8,95,95,114,101,112,114,95,95, + 132,0,0,0,115,4,0,0,0,18,1,255,128,122,20,95, + 77,111,100,117,108,101,76,111,99,107,46,95,95,114,101,112, + 114,95,95,78,41,9,114,1,0,0,0,114,0,0,0,0, + 114,2,0,0,0,114,3,0,0,0,114,31,0,0,0,114, + 38,0,0,0,114,40,0,0,0,114,41,0,0,0,114,49, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,20,0,0,0,59,0,0,0, + 115,16,0,0,0,8,0,4,1,8,5,8,8,8,21,8, + 25,12,13,255,128,114,20,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,48,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,100,6,100,7,132,0,90,6,100,8,100,9, + 132,0,90,7,100,10,83,0,41,11,218,16,95,68,117,109, + 109,121,77,111,100,117,108,101,76,111,99,107,122,86,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,0,0,0, + 0,2,0,0,0,2,0,0,0,67,0,0,0,115,16,0, + 0,0,124,1,124,0,95,0,100,1,124,0,95,1,100,0, + 83,0,114,21,0,0,0,41,2,114,17,0,0,0,114,27, + 0,0,0,114,29,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,31,0,0,0,140,0,0,0, + 115,6,0,0,0,6,1,10,1,255,128,122,25,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,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 18,0,0,0,124,0,4,0,106,0,100,1,55,0,2,0, + 95,0,100,2,83,0,41,3,78,114,39,0,0,0,84,41, + 1,114,27,0,0,0,114,48,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,40,0,0,0,144, + 0,0,0,115,6,0,0,0,14,1,4,1,255,128,122,24, + 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,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,36,0,0,0,124,0,106,0,100,1,107,2,114,18, + 116,1,100,2,131,1,130,1,124,0,4,0,106,0,100,3, + 56,0,2,0,95,0,100,0,83,0,41,4,78,114,22,0, + 0,0,114,43,0,0,0,114,39,0,0,0,41,2,114,27, + 0,0,0,114,44,0,0,0,114,48,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,41,0,0, + 0,148,0,0,0,115,8,0,0,0,10,1,8,1,18,1, + 255,128,122,24,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,0,0,0,0,1,0,0,0,5,0,0, + 0,67,0,0,0,115,18,0,0,0,100,1,160,0,124,0, + 106,1,116,2,124,0,131,1,161,2,83,0,41,2,78,122, + 28,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,114,45,0, 0,0,114,48,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,40,0,0,0,144,0,0,0,115, - 6,0,0,0,14,1,4,1,255,128,122,24,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,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,36,0, - 0,0,124,0,106,0,100,1,107,2,114,18,116,1,100,2, - 131,1,130,1,124,0,4,0,106,0,100,3,56,0,2,0, - 95,0,100,0,83,0,41,4,78,114,22,0,0,0,114,43, - 0,0,0,114,39,0,0,0,41,2,114,27,0,0,0,114, - 44,0,0,0,114,48,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,41,0,0,0,148,0,0, - 0,115,10,0,0,0,10,1,8,1,14,1,4,128,255,128, - 122,24,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,0,0,0,0,1,0,0,0,5,0,0,0,67, - 0,0,0,115,18,0,0,0,100,1,160,0,124,0,106,1, - 116,2,124,0,131,1,161,2,83,0,41,2,78,122,28,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,114,45,0,0,0, - 114,48,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,49,0,0,0,153,0,0,0,115,4,0, - 0,0,18,1,255,128,122,25,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,41,8,114,1,0,0,0,114,0,0,0,0,114,2, - 0,0,0,114,3,0,0,0,114,31,0,0,0,114,40,0, - 0,0,114,41,0,0,0,114,49,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,50,0,0,0,136,0,0,0,115,14,0,0,0,8,0, - 4,1,8,3,8,4,8,4,12,5,255,128,114,50,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,64,0,0,0,115,36,0,0,0,101, - 0,90,1,100,0,90,2,100,1,100,2,132,0,90,3,100, - 3,100,4,132,0,90,4,100,5,100,6,132,0,90,5,100, - 7,83,0,41,8,218,18,95,77,111,100,117,108,101,76,111, - 99,107,77,97,110,97,103,101,114,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, - 0,0,115,16,0,0,0,124,1,124,0,95,0,100,0,124, - 0,95,1,100,0,83,0,114,13,0,0,0,41,2,218,5, - 95,110,97,109,101,218,5,95,108,111,99,107,114,29,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,31,0,0,0,159,0,0,0,115,8,0,0,0,6,1, - 6,1,4,128,255,128,122,27,95,77,111,100,117,108,101,76, + 0,114,11,0,0,0,114,49,0,0,0,153,0,0,0,115, + 4,0,0,0,18,1,255,128,122,25,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,41,8,114,1,0,0,0,114,0,0,0,0, + 114,2,0,0,0,114,3,0,0,0,114,31,0,0,0,114, + 40,0,0,0,114,41,0,0,0,114,49,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,50,0,0,0,136,0,0,0,115,14,0,0,0, + 8,0,4,1,8,3,8,4,8,4,12,5,255,128,114,50, + 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,64,0,0,0,115,36,0,0, + 0,101,0,90,1,100,0,90,2,100,1,100,2,132,0,90, + 3,100,3,100,4,132,0,90,4,100,5,100,6,132,0,90, + 5,100,7,83,0,41,8,218,18,95,77,111,100,117,108,101, + 76,111,99,107,77,97,110,97,103,101,114,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, + 67,0,0,0,115,16,0,0,0,124,1,124,0,95,0,100, + 0,124,0,95,1,100,0,83,0,114,13,0,0,0,41,2, + 218,5,95,110,97,109,101,218,5,95,108,111,99,107,114,29, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,31,0,0,0,159,0,0,0,115,6,0,0,0, + 6,1,10,1,255,128,122,27,95,77,111,100,117,108,101,76, 111,99,107,77,97,110,97,103,101,114,46,95,95,105,110,105, 116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,2,0,0,0,67,0,0,0,115,26,0,0, @@ -291,462 +290,461 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 108,111,99,107,114,52,0,0,0,114,53,0,0,0,114,40, 0,0,0,114,48,0,0,0,114,10,0,0,0,114,10,0, 0,0,114,11,0,0,0,218,9,95,95,101,110,116,101,114, - 95,95,163,0,0,0,115,8,0,0,0,12,1,10,1,4, - 128,255,128,122,28,95,77,111,100,117,108,101,76,111,99,107, - 77,97,110,97,103,101,114,46,95,95,101,110,116,101,114,95, - 95,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,2,0,0,0,79,0,0,0,115,14,0,0,0,124, - 0,106,0,160,1,161,0,1,0,100,0,83,0,114,13,0, - 0,0,41,2,114,53,0,0,0,114,41,0,0,0,41,3, - 114,30,0,0,0,218,4,97,114,103,115,90,6,107,119,97, - 114,103,115,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,8,95,95,101,120,105,116,95,95,167,0,0,0, - 115,6,0,0,0,10,1,4,128,255,128,122,27,95,77,111, - 100,117,108,101,76,111,99,107,77,97,110,97,103,101,114,46, - 95,95,101,120,105,116,95,95,78,41,6,114,1,0,0,0, - 114,0,0,0,0,114,2,0,0,0,114,31,0,0,0,114, - 55,0,0,0,114,57,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,51,0, - 0,0,157,0,0,0,115,10,0,0,0,8,0,8,2,8, - 4,12,4,255,128,114,51,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,67, - 0,0,0,115,134,0,0,0,116,0,160,1,161,0,1,0, - 122,114,122,14,116,2,124,0,25,0,131,0,125,1,87,0, - 110,22,4,0,116,3,121,46,1,0,1,0,1,0,100,1, - 125,1,89,0,110,2,48,0,124,1,100,1,117,0,114,110, - 116,4,100,1,117,0,114,74,116,5,124,0,131,1,125,1, - 110,8,116,6,124,0,131,1,125,1,124,0,102,1,100,2, - 100,3,132,1,125,2,116,7,160,8,124,1,124,2,161,2, - 116,2,124,0,60,0,87,0,116,0,160,9,161,0,1,0, - 124,1,83,0,116,0,160,9,161,0,1,0,48,0,41,4, - 122,139,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,65,99, - 113,117,105,114,101,47,114,101,108,101,97,115,101,32,105,110, - 116,101,114,110,97,108,108,121,32,116,104,101,32,103,108,111, - 98,97,108,32,105,109,112,111,114,116,32,108,111,99,107,32, - 116,111,32,112,114,111,116,101,99,116,10,32,32,32,32,95, - 109,111,100,117,108,101,95,108,111,99,107,115,46,78,99,2, + 95,95,163,0,0,0,115,6,0,0,0,12,1,14,1,255, + 128,122,28,95,77,111,100,117,108,101,76,111,99,107,77,97, + 110,97,103,101,114,46,95,95,101,110,116,101,114,95,95,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 2,0,0,0,79,0,0,0,115,14,0,0,0,124,0,106, + 0,160,1,161,0,1,0,100,0,83,0,114,13,0,0,0, + 41,2,114,53,0,0,0,114,41,0,0,0,41,3,114,30, + 0,0,0,218,4,97,114,103,115,90,6,107,119,97,114,103, + 115,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,8,95,95,101,120,105,116,95,95,167,0,0,0,115,4, + 0,0,0,14,1,255,128,122,27,95,77,111,100,117,108,101, + 76,111,99,107,77,97,110,97,103,101,114,46,95,95,101,120, + 105,116,95,95,78,41,6,114,1,0,0,0,114,0,0,0, + 0,114,2,0,0,0,114,31,0,0,0,114,55,0,0,0, + 114,57,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,51,0,0,0,157,0, + 0,0,115,10,0,0,0,8,0,8,2,8,4,12,4,255, + 128,114,51,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,115, + 134,0,0,0,116,0,160,1,161,0,1,0,122,114,122,14, + 116,2,124,0,25,0,131,0,125,1,87,0,110,22,4,0, + 116,3,121,46,1,0,1,0,1,0,100,1,125,1,89,0, + 110,2,48,0,124,1,100,1,117,0,114,110,116,4,100,1, + 117,0,114,74,116,5,124,0,131,1,125,1,110,8,116,6, + 124,0,131,1,125,1,124,0,102,1,100,2,100,3,132,1, + 125,2,116,7,160,8,124,1,124,2,161,2,116,2,124,0, + 60,0,87,0,116,0,160,9,161,0,1,0,124,1,83,0, + 116,0,160,9,161,0,1,0,48,0,41,4,122,139,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,65,99,113,117,105,114, + 101,47,114,101,108,101,97,115,101,32,105,110,116,101,114,110, + 97,108,108,121,32,116,104,101,32,103,108,111,98,97,108,32, + 105,109,112,111,114,116,32,108,111,99,107,32,116,111,32,112, + 114,111,116,101,99,116,10,32,32,32,32,95,109,111,100,117, + 108,101,95,108,111,99,107,115,46,78,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,83, + 0,0,0,115,54,0,0,0,116,0,160,1,161,0,1,0, + 122,34,116,2,160,3,124,1,161,1,124,0,117,0,114,30, + 116,2,124,1,61,0,87,0,116,0,160,4,161,0,1,0, + 100,0,83,0,116,0,160,4,161,0,1,0,48,0,114,13, + 0,0,0,41,5,218,4,95,105,109,112,218,12,97,99,113, + 117,105,114,101,95,108,111,99,107,218,13,95,109,111,100,117, + 108,101,95,108,111,99,107,115,114,35,0,0,0,218,12,114, + 101,108,101,97,115,101,95,108,111,99,107,41,2,218,3,114, + 101,102,114,17,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,2,99,98,192,0,0,0,115,12, + 0,0,0,8,1,2,1,14,4,8,1,22,2,255,128,122, + 28,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,41,10,114, + 58,0,0,0,114,59,0,0,0,114,60,0,0,0,218,8, + 75,101,121,69,114,114,111,114,114,23,0,0,0,114,50,0, + 0,0,114,20,0,0,0,218,8,95,119,101,97,107,114,101, + 102,114,62,0,0,0,114,61,0,0,0,41,3,114,17,0, + 0,0,114,24,0,0,0,114,63,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,54,0,0,0, + 173,0,0,0,115,32,0,0,0,8,6,2,1,2,1,14, + 1,12,1,10,1,8,2,8,1,10,1,8,2,12,2,18, + 11,8,2,4,2,10,254,255,128,114,54,0,0,0,99,1, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,8, - 0,0,0,83,0,0,0,115,54,0,0,0,116,0,160,1, - 161,0,1,0,122,34,116,2,160,3,124,1,161,1,124,0, - 117,0,114,30,116,2,124,1,61,0,87,0,116,0,160,4, - 161,0,1,0,100,0,83,0,116,0,160,4,161,0,1,0, - 48,0,114,13,0,0,0,41,5,218,4,95,105,109,112,218, - 12,97,99,113,117,105,114,101,95,108,111,99,107,218,13,95, - 109,111,100,117,108,101,95,108,111,99,107,115,114,35,0,0, - 0,218,12,114,101,108,101,97,115,101,95,108,111,99,107,41, - 2,218,3,114,101,102,114,17,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,2,99,98,192,0, - 0,0,115,16,0,0,0,8,1,2,1,14,4,8,1,8, - 2,4,128,10,0,255,128,122,28,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,41,10,114,58,0,0,0,114,59,0,0, - 0,114,60,0,0,0,218,8,75,101,121,69,114,114,111,114, - 114,23,0,0,0,114,50,0,0,0,114,20,0,0,0,218, - 8,95,119,101,97,107,114,101,102,114,62,0,0,0,114,61, - 0,0,0,41,3,114,17,0,0,0,114,24,0,0,0,114, - 63,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,54,0,0,0,173,0,0,0,115,32,0,0, - 0,8,6,2,1,2,1,14,1,12,1,10,1,8,2,8, - 1,10,1,8,2,12,2,18,11,8,2,4,2,10,254,255, - 128,114,54,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, - 54,0,0,0,116,0,124,0,131,1,125,1,122,12,124,1, - 160,1,161,0,1,0,87,0,110,20,4,0,116,2,121,40, - 1,0,1,0,1,0,89,0,100,1,83,0,48,0,124,1, - 160,3,161,0,1,0,100,1,83,0,41,2,122,189,65,99, - 113,117,105,114,101,115,32,116,104,101,110,32,114,101,108,101, - 97,115,101,115,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,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,32,32,32,32,78,41,4,114,54, - 0,0,0,114,40,0,0,0,114,19,0,0,0,114,41,0, - 0,0,41,2,114,17,0,0,0,114,24,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,19,95, - 108,111,99,107,95,117,110,108,111,99,107,95,109,111,100,117, - 108,101,210,0,0,0,115,20,0,0,0,8,6,2,1,12, - 1,12,1,2,3,4,128,2,0,8,2,4,128,255,128,114, - 66,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,4,0,0,0,79,0,0,0,115,14,0, - 0,0,124,0,124,1,105,0,124,2,164,1,142,1,83,0, - 41,2,97,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,78,114,10,0,0,0,41,3,218,1,102, - 114,56,0,0,0,90,4,107,119,100,115,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,25,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,227,0,0,0,115,4,0,0,0,14,8, - 255,128,114,68,0,0,0,114,39,0,0,0,41,1,218,9, - 118,101,114,98,111,115,105,116,121,99,1,0,0,0,0,0, - 0,0,1,0,0,0,3,0,0,0,4,0,0,0,71,0, - 0,0,115,54,0,0,0,116,0,106,1,106,2,124,1,107, - 5,114,50,124,0,160,3,100,1,161,1,115,30,100,2,124, - 0,23,0,125,0,116,4,124,0,106,5,124,2,142,0,116, - 0,106,6,100,3,141,2,1,0,100,4,83,0,41,5,122, - 61,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,41,2, - 250,1,35,122,7,105,109,112,111,114,116,32,122,2,35,32, - 41,1,90,4,102,105,108,101,78,41,7,114,15,0,0,0, - 218,5,102,108,97,103,115,218,7,118,101,114,98,111,115,101, - 218,10,115,116,97,114,116,115,119,105,116,104,218,5,112,114, - 105,110,116,114,46,0,0,0,218,6,115,116,100,101,114,114, - 41,3,218,7,109,101,115,115,97,103,101,114,69,0,0,0, - 114,56,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,16,95,118,101,114,98,111,115,101,95,109, - 101,115,115,97,103,101,238,0,0,0,115,12,0,0,0,12, - 2,10,1,8,1,20,1,4,128,255,128,114,77,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,3,0,0,0,115,26,0,0,0,135,0, - 102,1,100,1,100,2,132,8,125,1,116,0,124,1,136,0, - 131,2,1,0,124,1,83,0,41,4,122,49,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,0,0,0,0,2,0,0,0,4,0, - 0,0,19,0,0,0,115,38,0,0,0,124,1,116,0,106, - 1,118,1,114,28,116,2,100,1,160,3,124,1,161,1,124, - 1,100,2,141,2,130,1,136,0,124,0,124,1,131,2,83, - 0,41,3,78,250,29,123,33,114,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,114,16,0,0,0,41,4,114,15,0,0,0,218, - 20,98,117,105,108,116,105,110,95,109,111,100,117,108,101,95, - 110,97,109,101,115,218,11,73,109,112,111,114,116,69,114,114, - 111,114,114,46,0,0,0,169,2,114,30,0,0,0,218,8, - 102,117,108,108,110,97,109,101,169,1,218,3,102,120,110,114, - 10,0,0,0,114,11,0,0,0,218,25,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,248,0,0,0,115,12,0,0,0,10,1,10, - 1,2,1,6,255,10,2,255,128,122,52,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,78, - 169,1,114,12,0,0,0,41,2,114,84,0,0,0,114,85, - 0,0,0,114,10,0,0,0,114,83,0,0,0,114,11,0, - 0,0,218,17,95,114,101,113,117,105,114,101,115,95,98,117, - 105,108,116,105,110,246,0,0,0,115,8,0,0,0,12,2, - 10,5,4,1,255,128,114,87,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 3,0,0,0,115,26,0,0,0,135,0,102,1,100,1,100, - 2,132,8,125,1,116,0,124,1,136,0,131,2,1,0,124, - 1,83,0,41,4,122,47,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,0, - 0,0,0,2,0,0,0,4,0,0,0,19,0,0,0,115, - 38,0,0,0,116,0,160,1,124,1,161,1,115,28,116,2, - 100,1,160,3,124,1,161,1,124,1,100,2,141,2,130,1, - 136,0,124,0,124,1,131,2,83,0,169,3,78,122,27,123, - 33,114,125,32,105,115,32,110,111,116,32,97,32,102,114,111, - 122,101,110,32,109,111,100,117,108,101,114,16,0,0,0,41, - 4,114,58,0,0,0,218,9,105,115,95,102,114,111,122,101, - 110,114,80,0,0,0,114,46,0,0,0,114,81,0,0,0, - 114,83,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 24,95,114,101,113,117,105,114,101,115,95,102,114,111,122,101, - 110,95,119,114,97,112,112,101,114,3,1,0,0,115,12,0, - 0,0,10,1,10,1,2,1,6,255,10,2,255,128,122,50, + 0,0,0,67,0,0,0,115,54,0,0,0,116,0,124,0, + 131,1,125,1,122,12,124,1,160,1,161,0,1,0,87,0, + 110,20,4,0,116,2,121,40,1,0,1,0,1,0,89,0, + 100,1,83,0,48,0,124,1,160,3,161,0,1,0,100,1, + 83,0,41,2,122,189,65,99,113,117,105,114,101,115,32,116, + 104,101,110,32,114,101,108,101,97,115,101,115,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,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,32, + 32,32,32,78,41,4,114,54,0,0,0,114,40,0,0,0, + 114,19,0,0,0,114,41,0,0,0,41,2,114,17,0,0, + 0,114,24,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,19,95,108,111,99,107,95,117,110,108, + 111,99,107,95,109,111,100,117,108,101,210,0,0,0,115,14, + 0,0,0,8,6,2,1,12,1,12,1,8,3,12,2,255, + 128,114,66,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,4,0,0,0,79,0,0,0,115, + 14,0,0,0,124,0,124,1,105,0,124,2,164,1,142,1, + 83,0,41,2,97,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,78,114,10,0,0,0,41,3,218, + 1,102,114,56,0,0,0,90,4,107,119,100,115,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,25,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,227,0,0,0,115,4,0,0,0, + 14,8,255,128,114,68,0,0,0,114,39,0,0,0,41,1, + 218,9,118,101,114,98,111,115,105,116,121,99,1,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,4,0,0,0, + 71,0,0,0,115,58,0,0,0,116,0,106,1,106,2,124, + 1,107,5,114,54,124,0,160,3,100,1,161,1,115,30,100, + 2,124,0,23,0,125,0,116,4,124,0,106,5,124,2,142, + 0,116,0,106,6,100,3,141,2,1,0,100,4,83,0,100, + 4,83,0,41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111,114, + 116,32,122,2,35,32,41,1,90,4,102,105,108,101,78,41, + 7,114,15,0,0,0,218,5,102,108,97,103,115,218,7,118, + 101,114,98,111,115,101,218,10,115,116,97,114,116,115,119,105, + 116,104,218,5,112,114,105,110,116,114,46,0,0,0,218,6, + 115,116,100,101,114,114,41,3,218,7,109,101,115,115,97,103, + 101,114,69,0,0,0,114,56,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,16,95,118,101,114, + 98,111,115,101,95,109,101,115,115,97,103,101,238,0,0,0, + 115,12,0,0,0,12,2,10,1,8,1,24,1,4,253,255, + 128,114,77,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,115, + 26,0,0,0,135,0,102,1,100,1,100,2,132,8,125,1, + 116,0,124,1,136,0,131,2,1,0,124,1,83,0,41,4, + 122,49,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,0,0,0,0, + 2,0,0,0,4,0,0,0,19,0,0,0,115,38,0,0, + 0,124,1,116,0,106,1,118,1,114,28,116,2,100,1,160, + 3,124,1,161,1,124,1,100,2,141,2,130,1,136,0,124, + 0,124,1,131,2,83,0,41,3,78,250,29,123,33,114,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,114,16,0,0,0,41,4, + 114,15,0,0,0,218,20,98,117,105,108,116,105,110,95,109, + 111,100,117,108,101,95,110,97,109,101,115,218,11,73,109,112, + 111,114,116,69,114,114,111,114,114,46,0,0,0,169,2,114, + 30,0,0,0,218,8,102,117,108,108,110,97,109,101,169,1, + 218,3,102,120,110,114,10,0,0,0,114,11,0,0,0,218, + 25,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,248,0,0,0,115,12, + 0,0,0,10,1,10,1,2,1,6,255,10,2,255,128,122, + 52,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,78,169,1,114,12,0,0,0,41,2,114, + 84,0,0,0,114,85,0,0,0,114,10,0,0,0,114,83, + 0,0,0,114,11,0,0,0,218,17,95,114,101,113,117,105, + 114,101,115,95,98,117,105,108,116,105,110,246,0,0,0,115, + 8,0,0,0,12,2,10,5,4,1,255,128,114,87,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,3,0,0,0,115,26,0,0,0,135, + 0,102,1,100,1,100,2,132,8,125,1,116,0,124,1,136, + 0,131,2,1,0,124,1,83,0,41,4,122,47,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,0,0,0,0,2,0,0,0,4,0,0, + 0,19,0,0,0,115,38,0,0,0,116,0,160,1,124,1, + 161,1,115,28,116,2,100,1,160,3,124,1,161,1,124,1, + 100,2,141,2,130,1,136,0,124,0,124,1,131,2,83,0, + 169,3,78,122,27,123,33,114,125,32,105,115,32,110,111,116, + 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101, + 114,16,0,0,0,41,4,114,58,0,0,0,218,9,105,115, + 95,102,114,111,122,101,110,114,80,0,0,0,114,46,0,0, + 0,114,81,0,0,0,114,83,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,24,95,114,101,113,117,105,114,101,115, + 95,102,114,111,122,101,110,95,119,114,97,112,112,101,114,3, + 1,0,0,115,12,0,0,0,10,1,10,1,2,1,6,255, + 10,2,255,128,122,50,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, - 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,78,114,86,0,0,0,41,2,114,84,0,0,0,114, - 90,0,0,0,114,10,0,0,0,114,83,0,0,0,114,11, - 0,0,0,218,16,95,114,101,113,117,105,114,101,115,95,102, - 114,111,122,101,110,1,1,0,0,115,8,0,0,0,12,2, - 10,5,4,1,255,128,114,91,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0, - 67,0,0,0,115,58,0,0,0,116,0,124,1,124,0,131, - 2,125,2,124,1,116,1,106,2,118,0,114,50,116,1,106, - 2,124,1,25,0,125,3,116,3,124,2,124,3,131,2,1, - 0,116,1,106,2,124,1,25,0,83,0,116,4,124,2,131, - 1,83,0,41,2,122,128,76,111,97,100,32,116,104,101,32, - 115,112,101,99,105,102,105,101,100,32,109,111,100,117,108,101, - 32,105,110,116,111,32,115,121,115,46,109,111,100,117,108,101, - 115,32,97,110,100,32,114,101,116,117,114,110,32,105,116,46, - 10,10,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,108,111,97,100,101,114,46,101,120,101, - 99,95,109,111,100,117,108,101,32,105,110,115,116,101,97,100, - 46,10,10,32,32,32,32,78,41,5,218,16,115,112,101,99, - 95,102,114,111,109,95,108,111,97,100,101,114,114,15,0,0, - 0,218,7,109,111,100,117,108,101,115,218,5,95,101,120,101, - 99,218,5,95,108,111,97,100,41,4,114,30,0,0,0,114, - 82,0,0,0,218,4,115,112,101,99,218,6,109,111,100,117, - 108,101,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,17,95,108,111,97,100,95,109,111,100,117,108,101,95, - 115,104,105,109,13,1,0,0,115,14,0,0,0,10,6,10, - 1,10,1,10,1,10,1,8,2,255,128,114,98,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,8,0,0,0,67,0,0,0,115,210,0,0,0,116,0, - 124,0,100,1,100,0,131,3,125,1,116,1,124,1,100,2, - 131,2,114,54,122,12,124,1,160,2,124,0,161,1,87,0, - 83,0,4,0,116,3,121,52,1,0,1,0,1,0,89,0, - 110,2,48,0,122,10,124,0,106,4,125,2,87,0,110,18, - 4,0,116,5,121,82,1,0,1,0,1,0,89,0,110,18, - 48,0,124,2,100,0,117,1,114,100,116,6,124,2,131,1, - 83,0,122,10,124,0,106,7,125,3,87,0,110,22,4,0, - 116,5,121,132,1,0,1,0,1,0,100,3,125,3,89,0, - 110,2,48,0,122,10,124,0,106,8,125,4,87,0,110,52, - 4,0,116,5,121,196,1,0,1,0,1,0,124,1,100,0, - 117,0,114,180,100,4,160,9,124,3,161,1,6,0,89,0, - 83,0,100,5,160,9,124,3,124,1,161,2,6,0,89,0, - 83,0,48,0,100,6,160,9,124,3,124,4,161,2,83,0, - 41,7,78,218,10,95,95,108,111,97,100,101,114,95,95,218, - 11,109,111,100,117,108,101,95,114,101,112,114,250,1,63,250, - 13,60,109,111,100,117,108,101,32,123,33,114,125,62,250,20, - 60,109,111,100,117,108,101,32,123,33,114,125,32,40,123,33, - 114,125,41,62,250,23,60,109,111,100,117,108,101,32,123,33, - 114,125,32,102,114,111,109,32,123,33,114,125,62,41,10,114, - 6,0,0,0,114,4,0,0,0,114,100,0,0,0,218,9, - 69,120,99,101,112,116,105,111,110,218,8,95,95,115,112,101, - 99,95,95,218,14,65,116,116,114,105,98,117,116,101,69,114, - 114,111,114,218,22,95,109,111,100,117,108,101,95,114,101,112, - 114,95,102,114,111,109,95,115,112,101,99,114,1,0,0,0, - 218,8,95,95,102,105,108,101,95,95,114,46,0,0,0,41, - 5,114,97,0,0,0,218,6,108,111,97,100,101,114,114,96, - 0,0,0,114,17,0,0,0,218,8,102,105,108,101,110,97, - 109,101,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,12,95,109,111,100,117,108,101,95,114,101,112,114,29, - 1,0,0,115,48,0,0,0,12,2,10,1,2,4,12,1, - 12,1,6,1,2,1,10,1,12,1,6,1,8,2,8,1, - 2,4,10,1,12,1,10,1,2,1,10,1,12,1,8,1, - 14,1,18,2,12,2,255,128,114,112,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,64,0,0,0,115,114,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,2,100,2,100,3,156, - 3,100,4,100,5,132,2,90,4,100,6,100,7,132,0,90, - 5,100,8,100,9,132,0,90,6,101,7,100,10,100,11,132, - 0,131,1,90,8,101,8,106,9,100,12,100,11,132,0,131, - 1,90,8,101,7,100,13,100,14,132,0,131,1,90,10,101, - 7,100,15,100,16,132,0,131,1,90,11,101,11,106,9,100, - 17,100,16,132,0,131,1,90,11,100,2,83,0,41,18,218, - 10,77,111,100,117,108,101,83,112,101,99,97,208,5,0,0, - 84,104,101,32,115,112,101,99,105,102,105,99,97,116,105,111, - 110,32,102,111,114,32,97,32,109,111,100,117,108,101,44,32, - 117,115,101,100,32,102,111,114,32,108,111,97,100,105,110,103, - 46,10,10,32,32,32,32,65,32,109,111,100,117,108,101,39, - 115,32,115,112,101,99,32,105,115,32,116,104,101,32,115,111, - 117,114,99,101,32,102,111,114,32,105,110,102,111,114,109,97, - 116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,109, - 111,100,117,108,101,46,32,32,70,111,114,10,32,32,32,32, - 100,97,116,97,32,97,115,115,111,99,105,97,116,101,100,32, - 119,105,116,104,32,116,104,101,32,109,111,100,117,108,101,44, - 32,105,110,99,108,117,100,105,110,103,32,115,111,117,114,99, - 101,44,32,117,115,101,32,116,104,101,32,115,112,101,99,39, - 115,10,32,32,32,32,108,111,97,100,101,114,46,10,10,32, - 32,32,32,96,110,97,109,101,96,32,105,115,32,116,104,101, - 32,97,98,115,111,108,117,116,101,32,110,97,109,101,32,111, - 102,32,116,104,101,32,109,111,100,117,108,101,46,32,32,96, - 108,111,97,100,101,114,96,32,105,115,32,116,104,101,32,108, - 111,97,100,101,114,10,32,32,32,32,116,111,32,117,115,101, - 32,119,104,101,110,32,108,111,97,100,105,110,103,32,116,104, - 101,32,109,111,100,117,108,101,46,32,32,96,112,97,114,101, - 110,116,96,32,105,115,32,116,104,101,32,110,97,109,101,32, - 111,102,32,116,104,101,10,32,32,32,32,112,97,99,107,97, - 103,101,32,116,104,101,32,109,111,100,117,108,101,32,105,115, - 32,105,110,46,32,32,84,104,101,32,112,97,114,101,110,116, - 32,105,115,32,100,101,114,105,118,101,100,32,102,114,111,109, - 32,116,104,101,32,110,97,109,101,46,10,10,32,32,32,32, - 96,105,115,95,112,97,99,107,97,103,101,96,32,100,101,116, - 101,114,109,105,110,101,115,32,105,102,32,116,104,101,32,109, - 111,100,117,108,101,32,105,115,32,99,111,110,115,105,100,101, - 114,101,100,32,97,32,112,97,99,107,97,103,101,32,111,114, - 10,32,32,32,32,110,111,116,46,32,32,79,110,32,109,111, - 100,117,108,101,115,32,116,104,105,115,32,105,115,32,114,101, - 102,108,101,99,116,101,100,32,98,121,32,116,104,101,32,96, - 95,95,112,97,116,104,95,95,96,32,97,116,116,114,105,98, - 117,116,101,46,10,10,32,32,32,32,96,111,114,105,103,105, - 110,96,32,105,115,32,116,104,101,32,115,112,101,99,105,102, - 105,99,32,108,111,99,97,116,105,111,110,32,117,115,101,100, - 32,98,121,32,116,104,101,32,108,111,97,100,101,114,32,102, - 114,111,109,32,119,104,105,99,104,32,116,111,10,32,32,32, - 32,108,111,97,100,32,116,104,101,32,109,111,100,117,108,101, - 44,32,105,102,32,116,104,97,116,32,105,110,102,111,114,109, - 97,116,105,111,110,32,105,115,32,97,118,97,105,108,97,98, - 108,101,46,32,32,87,104,101,110,32,102,105,108,101,110,97, - 109,101,32,105,115,10,32,32,32,32,115,101,116,44,32,111, - 114,105,103,105,110,32,119,105,108,108,32,109,97,116,99,104, - 46,10,10,32,32,32,32,96,104,97,115,95,108,111,99,97, - 116,105,111,110,96,32,105,110,100,105,99,97,116,101,115,32, - 116,104,97,116,32,97,32,115,112,101,99,39,115,32,34,111, - 114,105,103,105,110,34,32,114,101,102,108,101,99,116,115,32, - 97,32,108,111,99,97,116,105,111,110,46,10,32,32,32,32, - 87,104,101,110,32,116,104,105,115,32,105,115,32,84,114,117, - 101,44,32,96,95,95,102,105,108,101,95,95,96,32,97,116, - 116,114,105,98,117,116,101,32,111,102,32,116,104,101,32,109, - 111,100,117,108,101,32,105,115,32,115,101,116,46,10,10,32, - 32,32,32,96,99,97,99,104,101,100,96,32,105,115,32,116, - 104,101,32,108,111,99,97,116,105,111,110,32,111,102,32,116, - 104,101,32,99,97,99,104,101,100,32,98,121,116,101,99,111, - 100,101,32,102,105,108,101,44,32,105,102,32,97,110,121,46, - 32,32,73,116,10,32,32,32,32,99,111,114,114,101,115,112, - 111,110,100,115,32,116,111,32,116,104,101,32,96,95,95,99, - 97,99,104,101,100,95,95,96,32,97,116,116,114,105,98,117, - 116,101,46,10,10,32,32,32,32,96,115,117,98,109,111,100, - 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, - 105,111,110,115,96,32,105,115,32,116,104,101,32,115,101,113, - 117,101,110,99,101,32,111,102,32,112,97,116,104,32,101,110, - 116,114,105,101,115,32,116,111,10,32,32,32,32,115,101,97, - 114,99,104,32,119,104,101,110,32,105,109,112,111,114,116,105, - 110,103,32,115,117,98,109,111,100,117,108,101,115,46,32,32, - 73,102,32,115,101,116,44,32,105,115,95,112,97,99,107,97, - 103,101,32,115,104,111,117,108,100,32,98,101,10,32,32,32, - 32,84,114,117,101,45,45,97,110,100,32,70,97,108,115,101, - 32,111,116,104,101,114,119,105,115,101,46,10,10,32,32,32, - 32,80,97,99,107,97,103,101,115,32,97,114,101,32,115,105, - 109,112,108,121,32,109,111,100,117,108,101,115,32,116,104,97, - 116,32,40,109,97,121,41,32,104,97,118,101,32,115,117,98, - 109,111,100,117,108,101,115,46,32,32,73,102,32,97,32,115, - 112,101,99,10,32,32,32,32,104,97,115,32,97,32,110,111, - 110,45,78,111,110,101,32,118,97,108,117,101,32,105,110,32, - 96,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, - 104,95,108,111,99,97,116,105,111,110,115,96,44,32,116,104, - 101,32,105,109,112,111,114,116,10,32,32,32,32,115,121,115, - 116,101,109,32,119,105,108,108,32,99,111,110,115,105,100,101, - 114,32,109,111,100,117,108,101,115,32,108,111,97,100,101,100, - 32,102,114,111,109,32,116,104,101,32,115,112,101,99,32,97, - 115,32,112,97,99,107,97,103,101,115,46,10,10,32,32,32, - 32,79,110,108,121,32,102,105,110,100,101,114,115,32,40,115, - 101,101,32,105,109,112,111,114,116,108,105,98,46,97,98,99, - 46,77,101,116,97,80,97,116,104,70,105,110,100,101,114,32, - 97,110,100,10,32,32,32,32,105,109,112,111,114,116,108,105, - 98,46,97,98,99,46,80,97,116,104,69,110,116,114,121,70, - 105,110,100,101,114,41,32,115,104,111,117,108,100,32,109,111, - 100,105,102,121,32,77,111,100,117,108,101,83,112,101,99,32, - 105,110,115,116,97,110,99,101,115,46,10,10,32,32,32,32, - 78,41,3,218,6,111,114,105,103,105,110,218,12,108,111,97, - 100,101,114,95,115,116,97,116,101,218,10,105,115,95,112,97, - 99,107,97,103,101,99,3,0,0,0,0,0,0,0,3,0, - 0,0,6,0,0,0,2,0,0,0,67,0,0,0,115,54, - 0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,124, - 3,124,0,95,2,124,4,124,0,95,3,124,5,114,32,103, - 0,110,2,100,0,124,0,95,4,100,1,124,0,95,5,100, - 0,124,0,95,6,100,0,83,0,41,2,78,70,41,7,114, - 17,0,0,0,114,110,0,0,0,114,114,0,0,0,114,115, - 0,0,0,218,26,115,117,98,109,111,100,117,108,101,95,115, - 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,218, - 13,95,115,101,116,95,102,105,108,101,97,116,116,114,218,7, - 95,99,97,99,104,101,100,41,6,114,30,0,0,0,114,17, - 0,0,0,114,110,0,0,0,114,114,0,0,0,114,115,0, - 0,0,114,116,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,31,0,0,0,102,1,0,0,115, - 18,0,0,0,6,2,6,1,6,1,6,1,14,1,6,3, - 6,1,4,128,255,128,122,19,77,111,100,117,108,101,83,112, - 101,99,46,95,95,105,110,105,116,95,95,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,6,0,0,0, - 67,0,0,0,115,102,0,0,0,100,1,160,0,124,0,106, - 1,161,1,100,2,160,0,124,0,106,2,161,1,103,2,125, - 1,124,0,106,3,100,0,117,1,114,52,124,1,160,4,100, - 3,160,0,124,0,106,3,161,1,161,1,1,0,124,0,106, - 5,100,0,117,1,114,80,124,1,160,4,100,4,160,0,124, - 0,106,5,161,1,161,1,1,0,100,5,160,0,124,0,106, - 6,106,7,100,6,160,8,124,1,161,1,161,2,83,0,41, - 7,78,122,9,110,97,109,101,61,123,33,114,125,122,11,108, - 111,97,100,101,114,61,123,33,114,125,122,11,111,114,105,103, - 105,110,61,123,33,114,125,122,29,115,117,98,109,111,100,117, - 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, - 111,110,115,61,123,125,122,6,123,125,40,123,125,41,122,2, - 44,32,41,9,114,46,0,0,0,114,17,0,0,0,114,110, - 0,0,0,114,114,0,0,0,218,6,97,112,112,101,110,100, - 114,117,0,0,0,218,9,95,95,99,108,97,115,115,95,95, - 114,1,0,0,0,218,4,106,111,105,110,41,2,114,30,0, - 0,0,114,56,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,49,0,0,0,114,1,0,0,115, - 22,0,0,0,10,1,10,1,4,255,10,2,18,1,10,1, - 8,1,4,1,6,255,22,2,255,128,122,19,77,111,100,117, - 108,101,83,112,101,99,46,95,95,114,101,112,114,95,95,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 8,0,0,0,67,0,0,0,115,102,0,0,0,124,0,106, - 0,125,2,122,72,124,0,106,1,124,1,106,1,107,2,111, - 76,124,0,106,2,124,1,106,2,107,2,111,76,124,0,106, - 3,124,1,106,3,107,2,111,76,124,2,124,1,106,0,107, - 2,111,76,124,0,106,4,124,1,106,4,107,2,111,76,124, - 0,106,5,124,1,106,5,107,2,87,0,83,0,4,0,116, - 6,121,100,1,0,1,0,1,0,116,7,6,0,89,0,83, - 0,48,0,114,13,0,0,0,41,8,114,117,0,0,0,114, - 17,0,0,0,114,110,0,0,0,114,114,0,0,0,218,6, - 99,97,99,104,101,100,218,12,104,97,115,95,108,111,99,97, - 116,105,111,110,114,107,0,0,0,218,14,78,111,116,73,109, - 112,108,101,109,101,110,116,101,100,41,3,114,30,0,0,0, - 90,5,111,116,104,101,114,90,4,115,109,115,108,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,6,95,95, - 101,113,95,95,124,1,0,0,115,32,0,0,0,6,1,2, - 1,12,1,10,1,2,255,10,2,2,254,8,3,2,253,10, - 4,2,252,10,5,4,251,12,6,10,1,255,128,122,17,77, - 111,100,117,108,101,83,112,101,99,46,95,95,101,113,95,95, + 95,119,114,97,112,112,101,114,78,114,86,0,0,0,41,2, + 114,84,0,0,0,114,90,0,0,0,114,10,0,0,0,114, + 83,0,0,0,114,11,0,0,0,218,16,95,114,101,113,117, + 105,114,101,115,95,102,114,111,122,101,110,1,1,0,0,115, + 8,0,0,0,12,2,10,5,4,1,255,128,114,91,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,3,0,0,0,67,0,0,0,115,58,0,0,0,116, + 0,124,1,124,0,131,2,125,2,124,1,116,1,106,2,118, + 0,114,50,116,1,106,2,124,1,25,0,125,3,116,3,124, + 2,124,3,131,2,1,0,116,1,106,2,124,1,25,0,83, + 0,116,4,124,2,131,1,83,0,41,2,122,128,76,111,97, + 100,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, + 109,111,100,117,108,101,32,105,110,116,111,32,115,121,115,46, + 109,111,100,117,108,101,115,32,97,110,100,32,114,101,116,117, + 114,110,32,105,116,46,10,10,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,108,111,97,100, + 101,114,46,101,120,101,99,95,109,111,100,117,108,101,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,78,41,5, + 218,16,115,112,101,99,95,102,114,111,109,95,108,111,97,100, + 101,114,114,15,0,0,0,218,7,109,111,100,117,108,101,115, + 218,5,95,101,120,101,99,218,5,95,108,111,97,100,41,4, + 114,30,0,0,0,114,82,0,0,0,218,4,115,112,101,99, + 218,6,109,111,100,117,108,101,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,17,95,108,111,97,100,95,109, + 111,100,117,108,101,95,115,104,105,109,13,1,0,0,115,14, + 0,0,0,10,6,10,1,10,1,10,1,10,1,8,2,255, + 128,114,98,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,8,0,0,0,67,0,0,0,115, + 210,0,0,0,116,0,124,0,100,1,100,0,131,3,125,1, + 116,1,124,1,100,2,131,2,114,54,122,12,124,1,160,2, + 124,0,161,1,87,0,83,0,4,0,116,3,121,52,1,0, + 1,0,1,0,89,0,110,2,48,0,122,10,124,0,106,4, + 125,2,87,0,110,18,4,0,116,5,121,82,1,0,1,0, + 1,0,89,0,110,18,48,0,124,2,100,0,117,1,114,100, + 116,6,124,2,131,1,83,0,122,10,124,0,106,7,125,3, + 87,0,110,22,4,0,116,5,121,132,1,0,1,0,1,0, + 100,3,125,3,89,0,110,2,48,0,122,10,124,0,106,8, + 125,4,87,0,110,52,4,0,116,5,121,196,1,0,1,0, + 1,0,124,1,100,0,117,0,114,180,100,4,160,9,124,3, + 161,1,6,0,89,0,83,0,100,5,160,9,124,3,124,1, + 161,2,6,0,89,0,83,0,48,0,100,6,160,9,124,3, + 124,4,161,2,83,0,41,7,78,218,10,95,95,108,111,97, + 100,101,114,95,95,218,11,109,111,100,117,108,101,95,114,101, + 112,114,250,1,63,250,13,60,109,111,100,117,108,101,32,123, + 33,114,125,62,250,20,60,109,111,100,117,108,101,32,123,33, + 114,125,32,40,123,33,114,125,41,62,250,23,60,109,111,100, + 117,108,101,32,123,33,114,125,32,102,114,111,109,32,123,33, + 114,125,62,41,10,114,6,0,0,0,114,4,0,0,0,114, + 100,0,0,0,218,9,69,120,99,101,112,116,105,111,110,218, + 8,95,95,115,112,101,99,95,95,218,14,65,116,116,114,105, + 98,117,116,101,69,114,114,111,114,218,22,95,109,111,100,117, + 108,101,95,114,101,112,114,95,102,114,111,109,95,115,112,101, + 99,114,1,0,0,0,218,8,95,95,102,105,108,101,95,95, + 114,46,0,0,0,41,5,114,97,0,0,0,218,6,108,111, + 97,100,101,114,114,96,0,0,0,114,17,0,0,0,218,8, + 102,105,108,101,110,97,109,101,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,12,95,109,111,100,117,108,101, + 95,114,101,112,114,29,1,0,0,115,48,0,0,0,12,2, + 10,1,2,4,12,1,12,1,6,1,2,1,10,1,12,1, + 6,1,8,2,8,1,2,4,10,1,12,1,10,1,2,1, + 10,1,12,1,8,1,14,1,18,2,12,2,255,128,114,112, + 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,64,0,0,0,115,114,0,0, + 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, + 2,100,2,100,3,156,3,100,4,100,5,132,2,90,4,100, + 6,100,7,132,0,90,5,100,8,100,9,132,0,90,6,101, + 7,100,10,100,11,132,0,131,1,90,8,101,8,106,9,100, + 12,100,11,132,0,131,1,90,8,101,7,100,13,100,14,132, + 0,131,1,90,10,101,7,100,15,100,16,132,0,131,1,90, + 11,101,11,106,9,100,17,100,16,132,0,131,1,90,11,100, + 2,83,0,41,18,218,10,77,111,100,117,108,101,83,112,101, + 99,97,208,5,0,0,84,104,101,32,115,112,101,99,105,102, + 105,99,97,116,105,111,110,32,102,111,114,32,97,32,109,111, + 100,117,108,101,44,32,117,115,101,100,32,102,111,114,32,108, + 111,97,100,105,110,103,46,10,10,32,32,32,32,65,32,109, + 111,100,117,108,101,39,115,32,115,112,101,99,32,105,115,32, + 116,104,101,32,115,111,117,114,99,101,32,102,111,114,32,105, + 110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116, + 32,116,104,101,32,109,111,100,117,108,101,46,32,32,70,111, + 114,10,32,32,32,32,100,97,116,97,32,97,115,115,111,99, + 105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,109, + 111,100,117,108,101,44,32,105,110,99,108,117,100,105,110,103, + 32,115,111,117,114,99,101,44,32,117,115,101,32,116,104,101, + 32,115,112,101,99,39,115,10,32,32,32,32,108,111,97,100, + 101,114,46,10,10,32,32,32,32,96,110,97,109,101,96,32, + 105,115,32,116,104,101,32,97,98,115,111,108,117,116,101,32, + 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, + 108,101,46,32,32,96,108,111,97,100,101,114,96,32,105,115, + 32,116,104,101,32,108,111,97,100,101,114,10,32,32,32,32, + 116,111,32,117,115,101,32,119,104,101,110,32,108,111,97,100, + 105,110,103,32,116,104,101,32,109,111,100,117,108,101,46,32, + 32,96,112,97,114,101,110,116,96,32,105,115,32,116,104,101, + 32,110,97,109,101,32,111,102,32,116,104,101,10,32,32,32, + 32,112,97,99,107,97,103,101,32,116,104,101,32,109,111,100, + 117,108,101,32,105,115,32,105,110,46,32,32,84,104,101,32, + 112,97,114,101,110,116,32,105,115,32,100,101,114,105,118,101, + 100,32,102,114,111,109,32,116,104,101,32,110,97,109,101,46, + 10,10,32,32,32,32,96,105,115,95,112,97,99,107,97,103, + 101,96,32,100,101,116,101,114,109,105,110,101,115,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,99, + 111,110,115,105,100,101,114,101,100,32,97,32,112,97,99,107, + 97,103,101,32,111,114,10,32,32,32,32,110,111,116,46,32, + 32,79,110,32,109,111,100,117,108,101,115,32,116,104,105,115, + 32,105,115,32,114,101,102,108,101,99,116,101,100,32,98,121, + 32,116,104,101,32,96,95,95,112,97,116,104,95,95,96,32, + 97,116,116,114,105,98,117,116,101,46,10,10,32,32,32,32, + 96,111,114,105,103,105,110,96,32,105,115,32,116,104,101,32, + 115,112,101,99,105,102,105,99,32,108,111,99,97,116,105,111, + 110,32,117,115,101,100,32,98,121,32,116,104,101,32,108,111, + 97,100,101,114,32,102,114,111,109,32,119,104,105,99,104,32, + 116,111,10,32,32,32,32,108,111,97,100,32,116,104,101,32, + 109,111,100,117,108,101,44,32,105,102,32,116,104,97,116,32, + 105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,97, + 118,97,105,108,97,98,108,101,46,32,32,87,104,101,110,32, + 102,105,108,101,110,97,109,101,32,105,115,10,32,32,32,32, + 115,101,116,44,32,111,114,105,103,105,110,32,119,105,108,108, + 32,109,97,116,99,104,46,10,10,32,32,32,32,96,104,97, + 115,95,108,111,99,97,116,105,111,110,96,32,105,110,100,105, + 99,97,116,101,115,32,116,104,97,116,32,97,32,115,112,101, + 99,39,115,32,34,111,114,105,103,105,110,34,32,114,101,102, + 108,101,99,116,115,32,97,32,108,111,99,97,116,105,111,110, + 46,10,32,32,32,32,87,104,101,110,32,116,104,105,115,32, + 105,115,32,84,114,117,101,44,32,96,95,95,102,105,108,101, + 95,95,96,32,97,116,116,114,105,98,117,116,101,32,111,102, + 32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,115, + 101,116,46,10,10,32,32,32,32,96,99,97,99,104,101,100, + 96,32,105,115,32,116,104,101,32,108,111,99,97,116,105,111, + 110,32,111,102,32,116,104,101,32,99,97,99,104,101,100,32, + 98,121,116,101,99,111,100,101,32,102,105,108,101,44,32,105, + 102,32,97,110,121,46,32,32,73,116,10,32,32,32,32,99, + 111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104, + 101,32,96,95,95,99,97,99,104,101,100,95,95,96,32,97, + 116,116,114,105,98,117,116,101,46,10,10,32,32,32,32,96, + 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, + 95,108,111,99,97,116,105,111,110,115,96,32,105,115,32,116, + 104,101,32,115,101,113,117,101,110,99,101,32,111,102,32,112, + 97,116,104,32,101,110,116,114,105,101,115,32,116,111,10,32, + 32,32,32,115,101,97,114,99,104,32,119,104,101,110,32,105, + 109,112,111,114,116,105,110,103,32,115,117,98,109,111,100,117, + 108,101,115,46,32,32,73,102,32,115,101,116,44,32,105,115, + 95,112,97,99,107,97,103,101,32,115,104,111,117,108,100,32, + 98,101,10,32,32,32,32,84,114,117,101,45,45,97,110,100, + 32,70,97,108,115,101,32,111,116,104,101,114,119,105,115,101, + 46,10,10,32,32,32,32,80,97,99,107,97,103,101,115,32, + 97,114,101,32,115,105,109,112,108,121,32,109,111,100,117,108, + 101,115,32,116,104,97,116,32,40,109,97,121,41,32,104,97, + 118,101,32,115,117,98,109,111,100,117,108,101,115,46,32,32, + 73,102,32,97,32,115,112,101,99,10,32,32,32,32,104,97, + 115,32,97,32,110,111,110,45,78,111,110,101,32,118,97,108, + 117,101,32,105,110,32,96,115,117,98,109,111,100,117,108,101, + 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, + 115,96,44,32,116,104,101,32,105,109,112,111,114,116,10,32, + 32,32,32,115,121,115,116,101,109,32,119,105,108,108,32,99, + 111,110,115,105,100,101,114,32,109,111,100,117,108,101,115,32, + 108,111,97,100,101,100,32,102,114,111,109,32,116,104,101,32, + 115,112,101,99,32,97,115,32,112,97,99,107,97,103,101,115, + 46,10,10,32,32,32,32,79,110,108,121,32,102,105,110,100, + 101,114,115,32,40,115,101,101,32,105,109,112,111,114,116,108, + 105,98,46,97,98,99,46,77,101,116,97,80,97,116,104,70, + 105,110,100,101,114,32,97,110,100,10,32,32,32,32,105,109, + 112,111,114,116,108,105,98,46,97,98,99,46,80,97,116,104, + 69,110,116,114,121,70,105,110,100,101,114,41,32,115,104,111, + 117,108,100,32,109,111,100,105,102,121,32,77,111,100,117,108, + 101,83,112,101,99,32,105,110,115,116,97,110,99,101,115,46, + 10,10,32,32,32,32,78,41,3,218,6,111,114,105,103,105, + 110,218,12,108,111,97,100,101,114,95,115,116,97,116,101,218, + 10,105,115,95,112,97,99,107,97,103,101,99,3,0,0,0, + 0,0,0,0,3,0,0,0,6,0,0,0,2,0,0,0, + 67,0,0,0,115,54,0,0,0,124,1,124,0,95,0,124, + 2,124,0,95,1,124,3,124,0,95,2,124,4,124,0,95, + 3,124,5,114,32,103,0,110,2,100,0,124,0,95,4,100, + 1,124,0,95,5,100,0,124,0,95,6,100,0,83,0,41, + 2,78,70,41,7,114,17,0,0,0,114,110,0,0,0,114, + 114,0,0,0,114,115,0,0,0,218,26,115,117,98,109,111, + 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, + 116,105,111,110,115,218,13,95,115,101,116,95,102,105,108,101, + 97,116,116,114,218,7,95,99,97,99,104,101,100,41,6,114, + 30,0,0,0,114,17,0,0,0,114,110,0,0,0,114,114, + 0,0,0,114,115,0,0,0,114,116,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,31,0,0, + 0,102,1,0,0,115,16,0,0,0,6,2,6,1,6,1, + 6,1,14,1,6,3,10,1,255,128,122,19,77,111,100,117, + 108,101,83,112,101,99,46,95,95,105,110,105,116,95,95,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 6,0,0,0,67,0,0,0,115,102,0,0,0,100,1,160, + 0,124,0,106,1,161,1,100,2,160,0,124,0,106,2,161, + 1,103,2,125,1,124,0,106,3,100,0,117,1,114,52,124, + 1,160,4,100,3,160,0,124,0,106,3,161,1,161,1,1, + 0,124,0,106,5,100,0,117,1,114,80,124,1,160,4,100, + 4,160,0,124,0,106,5,161,1,161,1,1,0,100,5,160, + 0,124,0,106,6,106,7,100,6,160,8,124,1,161,1,161, + 2,83,0,41,7,78,122,9,110,97,109,101,61,123,33,114, + 125,122,11,108,111,97,100,101,114,61,123,33,114,125,122,11, + 111,114,105,103,105,110,61,123,33,114,125,122,29,115,117,98, + 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, + 99,97,116,105,111,110,115,61,123,125,122,6,123,125,40,123, + 125,41,122,2,44,32,41,9,114,46,0,0,0,114,17,0, + 0,0,114,110,0,0,0,114,114,0,0,0,218,6,97,112, + 112,101,110,100,114,117,0,0,0,218,9,95,95,99,108,97, + 115,115,95,95,114,1,0,0,0,218,4,106,111,105,110,41, + 2,114,30,0,0,0,114,56,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,49,0,0,0,114, + 1,0,0,115,22,0,0,0,10,1,10,1,4,255,10,2, + 18,1,10,1,8,1,4,1,6,255,22,2,255,128,122,19, + 77,111,100,117,108,101,83,112,101,99,46,95,95,114,101,112, + 114,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,8,0,0,0,67,0,0,0,115,102,0,0, + 0,124,0,106,0,125,2,122,72,124,0,106,1,124,1,106, + 1,107,2,111,76,124,0,106,2,124,1,106,2,107,2,111, + 76,124,0,106,3,124,1,106,3,107,2,111,76,124,2,124, + 1,106,0,107,2,111,76,124,0,106,4,124,1,106,4,107, + 2,111,76,124,0,106,5,124,1,106,5,107,2,87,0,83, + 0,4,0,116,6,121,100,1,0,1,0,1,0,116,7,6, + 0,89,0,83,0,48,0,114,13,0,0,0,41,8,114,117, + 0,0,0,114,17,0,0,0,114,110,0,0,0,114,114,0, + 0,0,218,6,99,97,99,104,101,100,218,12,104,97,115,95, + 108,111,99,97,116,105,111,110,114,107,0,0,0,218,14,78, + 111,116,73,109,112,108,101,109,101,110,116,101,100,41,3,114, + 30,0,0,0,90,5,111,116,104,101,114,90,4,115,109,115, + 108,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,6,95,95,101,113,95,95,124,1,0,0,115,32,0,0, + 0,6,1,2,1,12,1,10,1,2,255,10,2,2,254,8, + 3,2,253,10,4,2,252,10,5,4,251,12,6,10,1,255, + 128,122,17,77,111,100,117,108,101,83,112,101,99,46,95,95, + 101,113,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,58,0, + 0,0,124,0,106,0,100,0,117,0,114,52,124,0,106,1, + 100,0,117,1,114,52,124,0,106,2,114,52,116,3,100,0, + 117,0,114,38,116,4,130,1,116,3,160,5,124,0,106,1, + 161,1,124,0,95,0,124,0,106,0,83,0,114,13,0,0, + 0,41,6,114,119,0,0,0,114,114,0,0,0,114,118,0, + 0,0,218,19,95,98,111,111,116,115,116,114,97,112,95,101, + 120,116,101,114,110,97,108,218,19,78,111,116,73,109,112,108, + 101,109,101,110,116,101,100,69,114,114,111,114,90,11,95,103, + 101,116,95,99,97,99,104,101,100,114,48,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,123,0, + 0,0,136,1,0,0,115,14,0,0,0,10,2,16,1,8, + 1,4,1,14,1,6,1,255,128,122,17,77,111,100,117,108, + 101,83,112,101,99,46,99,97,99,104,101,100,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, + 0,67,0,0,0,115,10,0,0,0,124,1,124,0,95,0, + 100,0,83,0,114,13,0,0,0,41,1,114,119,0,0,0, + 41,2,114,30,0,0,0,114,123,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,123,0,0,0, + 145,1,0,0,115,4,0,0,0,10,2,255,128,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,32,0,0,0,124,0,106,0,100, + 1,117,0,114,26,124,0,106,1,160,2,100,2,161,1,100, + 3,25,0,83,0,124,0,106,1,83,0,41,4,122,32,84, + 104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109, + 111,100,117,108,101,39,115,32,112,97,114,101,110,116,46,78, + 218,1,46,114,22,0,0,0,41,3,114,117,0,0,0,114, + 17,0,0,0,218,10,114,112,97,114,116,105,116,105,111,110, + 114,48,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,6,112,97,114,101,110,116,149,1,0,0, + 115,8,0,0,0,10,3,16,1,6,2,255,128,122,17,77, + 111,100,117,108,101,83,112,101,99,46,112,97,114,101,110,116, 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,58,0,0,0,124,0, - 106,0,100,0,117,0,114,52,124,0,106,1,100,0,117,1, - 114,52,124,0,106,2,114,52,116,3,100,0,117,0,114,38, - 116,4,130,1,116,3,160,5,124,0,106,1,161,1,124,0, - 95,0,124,0,106,0,83,0,114,13,0,0,0,41,6,114, - 119,0,0,0,114,114,0,0,0,114,118,0,0,0,218,19, - 95,98,111,111,116,115,116,114,97,112,95,101,120,116,101,114, - 110,97,108,218,19,78,111,116,73,109,112,108,101,109,101,110, - 116,101,100,69,114,114,111,114,90,11,95,103,101,116,95,99, - 97,99,104,101,100,114,48,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,123,0,0,0,136,1, - 0,0,115,14,0,0,0,10,2,16,1,8,1,4,1,14, - 1,6,1,255,128,122,17,77,111,100,117,108,101,83,112,101, - 99,46,99,97,99,104,101,100,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, - 0,115,10,0,0,0,124,1,124,0,95,0,100,0,83,0, - 114,13,0,0,0,41,1,114,119,0,0,0,41,2,114,30, - 0,0,0,114,123,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,123,0,0,0,145,1,0,0, - 115,6,0,0,0,6,2,4,128,255,128,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,32,0,0,0,124,0,106,0,100,1,117, - 0,114,26,124,0,106,1,160,2,100,2,161,1,100,3,25, - 0,83,0,124,0,106,1,83,0,41,4,122,32,84,104,101, - 32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,100, - 117,108,101,39,115,32,112,97,114,101,110,116,46,78,218,1, - 46,114,22,0,0,0,41,3,114,117,0,0,0,114,17,0, - 0,0,218,10,114,112,97,114,116,105,116,105,111,110,114,48, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,6,112,97,114,101,110,116,149,1,0,0,115,8, - 0,0,0,10,3,16,1,6,2,255,128,122,17,77,111,100, - 117,108,101,83,112,101,99,46,112,97,114,101,110,116,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1, - 0,0,0,67,0,0,0,115,6,0,0,0,124,0,106,0, - 83,0,114,13,0,0,0,41,1,114,118,0,0,0,114,48, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,124,0,0,0,157,1,0,0,115,4,0,0,0, - 6,2,255,128,122,23,77,111,100,117,108,101,83,112,101,99, - 46,104,97,115,95,108,111,99,97,116,105,111,110,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0, - 0,0,67,0,0,0,115,14,0,0,0,116,0,124,1,131, - 1,124,0,95,1,100,0,83,0,114,13,0,0,0,41,2, - 218,4,98,111,111,108,114,118,0,0,0,41,2,114,30,0, - 0,0,218,5,118,97,108,117,101,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,124,0,0,0,161,1,0, - 0,115,6,0,0,0,10,2,4,128,255,128,41,12,114,1, + 0,1,0,0,0,67,0,0,0,115,6,0,0,0,124,0, + 106,0,83,0,114,13,0,0,0,41,1,114,118,0,0,0, + 114,48,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,124,0,0,0,157,1,0,0,115,4,0, + 0,0,6,2,255,128,122,23,77,111,100,117,108,101,83,112, + 101,99,46,104,97,115,95,108,111,99,97,116,105,111,110,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 2,0,0,0,67,0,0,0,115,14,0,0,0,116,0,124, + 1,131,1,124,0,95,1,100,0,83,0,114,13,0,0,0, + 41,2,218,4,98,111,111,108,114,118,0,0,0,41,2,114, + 30,0,0,0,218,5,118,97,108,117,101,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,124,0,0,0,161, + 1,0,0,115,4,0,0,0,14,2,255,128,41,12,114,1, 0,0,0,114,0,0,0,0,114,2,0,0,0,114,3,0, 0,0,114,31,0,0,0,114,49,0,0,0,114,126,0,0, 0,218,8,112,114,111,112,101,114,116,121,114,123,0,0,0, @@ -1038,788 +1036,787 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 3,114,51,0,0,0,114,17,0,0,0,114,160,0,0,0, 169,1,114,96,0,0,0,114,10,0,0,0,114,10,0,0, 0,114,11,0,0,0,114,95,0,0,0,196,2,0,0,115, - 8,0,0,0,12,9,38,1,4,128,255,128,114,95,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,64,0,0,0,115,140,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,101, - 5,100,3,100,4,132,0,131,1,90,6,101,7,100,20,100, - 6,100,7,132,1,131,1,90,8,101,7,100,21,100,8,100, - 9,132,1,131,1,90,9,101,5,100,10,100,11,132,0,131, - 1,90,10,101,5,100,12,100,13,132,0,131,1,90,11,101, - 7,101,12,100,14,100,15,132,0,131,1,131,1,90,13,101, - 7,101,12,100,16,100,17,132,0,131,1,131,1,90,14,101, - 7,101,12,100,18,100,19,132,0,131,1,131,1,90,15,101, - 7,101,16,131,1,90,17,100,5,83,0,41,22,218,15,66, - 117,105,108,116,105,110,73,109,112,111,114,116,101,114,122,144, - 77,101,116,97,32,112,97,116,104,32,105,109,112,111,114,116, - 32,102,111,114,32,98,117,105,108,116,45,105,110,32,109,111, - 100,117,108,101,115,46,10,10,32,32,32,32,65,108,108,32, - 109,101,116,104,111,100,115,32,97,114,101,32,101,105,116,104, - 101,114,32,99,108,97,115,115,32,111,114,32,115,116,97,116, - 105,99,32,109,101,116,104,111,100,115,32,116,111,32,97,118, - 111,105,100,32,116,104,101,32,110,101,101,100,32,116,111,10, - 32,32,32,32,105,110,115,116,97,110,116,105,97,116,101,32, - 116,104,101,32,99,108,97,115,115,46,10,10,32,32,32,32, - 122,8,98,117,105,108,116,45,105,110,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,67, - 0,0,0,115,22,0,0,0,100,1,124,0,106,0,155,2, - 100,2,116,1,106,2,155,0,100,3,157,5,83,0,41,5, - 250,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111, - 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99, - 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32, - 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32, - 32,32,32,32,32,122,8,60,109,111,100,117,108,101,32,122, - 2,32,40,122,2,41,62,78,41,3,114,1,0,0,0,114, - 162,0,0,0,114,139,0,0,0,169,1,114,97,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 100,0,0,0,222,2,0,0,115,4,0,0,0,22,7,255, - 128,122,27,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, - 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 5,0,0,0,67,0,0,0,115,42,0,0,0,124,2,100, - 0,117,1,114,12,100,0,83,0,116,0,160,1,124,1,161, - 1,114,38,116,2,124,1,124,0,124,0,106,3,100,1,141, - 3,83,0,100,0,83,0,169,2,78,114,138,0,0,0,41, - 4,114,58,0,0,0,90,10,105,115,95,98,117,105,108,116, - 105,110,114,92,0,0,0,114,139,0,0,0,169,4,218,3, - 99,108,115,114,82,0,0,0,218,4,112,97,116,104,218,6, - 116,97,114,103,101,116,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,9,102,105,110,100,95,115,112,101,99, - 231,2,0,0,115,12,0,0,0,8,2,4,1,10,1,16, - 1,4,2,255,128,122,25,66,117,105,108,116,105,110,73,109, - 112,111,114,116,101,114,46,102,105,110,100,95,115,112,101,99, - 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,30,0,0,0,124,0, - 160,0,124,1,124,2,161,2,125,3,124,3,100,1,117,1, - 114,26,124,3,106,1,83,0,100,1,83,0,41,2,122,175, - 70,105,110,100,32,116,104,101,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, - 32,32,32,73,102,32,39,112,97,116,104,39,32,105,115,32, - 101,118,101,114,32,115,112,101,99,105,102,105,101,100,32,116, - 104,101,110,32,116,104,101,32,115,101,97,114,99,104,32,105, - 115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,102, - 97,105,108,117,114,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, - 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, - 41,2,114,170,0,0,0,114,110,0,0,0,41,4,114,167, - 0,0,0,114,82,0,0,0,114,168,0,0,0,114,96,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,11,102,105,110,100,95,109,111,100,117,108,101,240,2, - 0,0,115,6,0,0,0,12,9,18,1,255,128,122,27,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,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,67, - 0,0,0,115,46,0,0,0,124,0,106,0,116,1,106,2, - 118,1,114,34,116,3,100,1,160,4,124,0,106,0,161,1, - 124,0,106,0,100,2,141,2,130,1,116,5,116,6,106,7, - 124,0,131,2,83,0,41,4,122,24,67,114,101,97,116,101, - 32,97,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,114,78,0,0,0,114,16,0,0,0,78,41,8,114, - 17,0,0,0,114,15,0,0,0,114,79,0,0,0,114,80, - 0,0,0,114,46,0,0,0,114,68,0,0,0,114,58,0, - 0,0,90,14,99,114,101,97,116,101,95,98,117,105,108,116, - 105,110,114,161,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,150,0,0,0,252,2,0,0,115, - 12,0,0,0,12,3,12,1,4,1,6,255,12,2,255,128, - 122,29,66,117,105,108,116,105,110,73,109,112,111,114,116,101, - 114,46,99,114,101,97,116,101,95,109,111,100,117,108,101,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,16,0,0,0,116,0,116, - 1,106,2,124,0,131,2,1,0,100,1,83,0,41,2,122, - 22,69,120,101,99,32,97,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,78,41,3,114,68,0,0,0,114, - 58,0,0,0,90,12,101,120,101,99,95,98,117,105,108,116, - 105,110,114,164,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,151,0,0,0,4,3,0,0,115, - 6,0,0,0,12,3,4,128,255,128,122,27,66,117,105,108, - 116,105,110,73,109,112,111,114,116,101,114,46,101,120,101,99, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,122,57,82,101,116, - 117,114,110,32,78,111,110,101,32,97,115,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,115,32,100,111,32, - 110,111,116,32,104,97,118,101,32,99,111,100,101,32,111,98, - 106,101,99,116,115,46,78,114,10,0,0,0,169,2,114,167, - 0,0,0,114,82,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,8,103,101,116,95,99,111,100, - 101,9,3,0,0,115,4,0,0,0,4,4,255,128,122,24, + 6,0,0,0,12,9,42,1,255,128,114,95,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,64,0,0,0,115,140,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,100,2,90,4,101,5,100, + 3,100,4,132,0,131,1,90,6,101,7,100,20,100,6,100, + 7,132,1,131,1,90,8,101,7,100,21,100,8,100,9,132, + 1,131,1,90,9,101,5,100,10,100,11,132,0,131,1,90, + 10,101,5,100,12,100,13,132,0,131,1,90,11,101,7,101, + 12,100,14,100,15,132,0,131,1,131,1,90,13,101,7,101, + 12,100,16,100,17,132,0,131,1,131,1,90,14,101,7,101, + 12,100,18,100,19,132,0,131,1,131,1,90,15,101,7,101, + 16,131,1,90,17,100,5,83,0,41,22,218,15,66,117,105, + 108,116,105,110,73,109,112,111,114,116,101,114,122,144,77,101, + 116,97,32,112,97,116,104,32,105,109,112,111,114,116,32,102, + 111,114,32,98,117,105,108,116,45,105,110,32,109,111,100,117, + 108,101,115,46,10,10,32,32,32,32,65,108,108,32,109,101, + 116,104,111,100,115,32,97,114,101,32,101,105,116,104,101,114, + 32,99,108,97,115,115,32,111,114,32,115,116,97,116,105,99, + 32,109,101,116,104,111,100,115,32,116,111,32,97,118,111,105, + 100,32,116,104,101,32,110,101,101,100,32,116,111,10,32,32, + 32,32,105,110,115,116,97,110,116,105,97,116,101,32,116,104, + 101,32,99,108,97,115,115,46,10,10,32,32,32,32,122,8, + 98,117,105,108,116,45,105,110,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,5,0,0,0,67,0,0, + 0,115,22,0,0,0,100,1,124,0,106,0,155,2,100,2, + 116,1,106,2,155,0,100,3,157,5,83,0,41,5,250,115, + 82,101,116,117,114,110,32,114,101,112,114,32,102,111,114,32, + 116,104,101,32,109,111,100,117,108,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,101,32,109,101,116,104,111,100,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, + 84,104,101,32,105,109,112,111,114,116,32,109,97,99,104,105, + 110,101,114,121,32,100,111,101,115,32,116,104,101,32,106,111, + 98,32,105,116,115,101,108,102,46,10,10,32,32,32,32,32, + 32,32,32,122,8,60,109,111,100,117,108,101,32,122,2,32, + 40,122,2,41,62,78,41,3,114,1,0,0,0,114,162,0, + 0,0,114,139,0,0,0,169,1,114,97,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,100,0, + 0,0,222,2,0,0,115,4,0,0,0,22,7,255,128,122, + 27,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,4,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, + 0,0,67,0,0,0,115,42,0,0,0,124,2,100,0,117, + 1,114,12,100,0,83,0,116,0,160,1,124,1,161,1,114, + 38,116,2,124,1,124,0,124,0,106,3,100,1,141,3,83, + 0,100,0,83,0,169,2,78,114,138,0,0,0,41,4,114, + 58,0,0,0,90,10,105,115,95,98,117,105,108,116,105,110, + 114,92,0,0,0,114,139,0,0,0,169,4,218,3,99,108, + 115,114,82,0,0,0,218,4,112,97,116,104,218,6,116,97, + 114,103,101,116,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,9,102,105,110,100,95,115,112,101,99,231,2, + 0,0,115,12,0,0,0,8,2,4,1,10,1,16,1,4, + 2,255,128,122,25,66,117,105,108,116,105,110,73,109,112,111, + 114,116,101,114,46,102,105,110,100,95,115,112,101,99,99,3, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4, + 0,0,0,67,0,0,0,115,30,0,0,0,124,0,160,0, + 124,1,124,2,161,2,125,3,124,3,100,1,117,1,114,26, + 124,3,106,1,83,0,100,1,83,0,41,2,122,175,70,105, + 110,100,32,116,104,101,32,98,117,105,108,116,45,105,110,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,73,102,32,39,112,97,116,104,39,32,105,115,32,101,118, + 101,114,32,115,112,101,99,105,102,105,101,100,32,116,104,101, + 110,32,116,104,101,32,115,101,97,114,99,104,32,105,115,32, + 99,111,110,115,105,100,101,114,101,100,32,97,32,102,97,105, + 108,117,114,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, + 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, + 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,2, + 114,170,0,0,0,114,110,0,0,0,41,4,114,167,0,0, + 0,114,82,0,0,0,114,168,0,0,0,114,96,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 11,102,105,110,100,95,109,111,100,117,108,101,240,2,0,0, + 115,6,0,0,0,12,9,18,1,255,128,122,27,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,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, + 0,115,46,0,0,0,124,0,106,0,116,1,106,2,118,1, + 114,34,116,3,100,1,160,4,124,0,106,0,161,1,124,0, + 106,0,100,2,141,2,130,1,116,5,116,6,106,7,124,0, + 131,2,83,0,41,4,122,24,67,114,101,97,116,101,32,97, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 114,78,0,0,0,114,16,0,0,0,78,41,8,114,17,0, + 0,0,114,15,0,0,0,114,79,0,0,0,114,80,0,0, + 0,114,46,0,0,0,114,68,0,0,0,114,58,0,0,0, + 90,14,99,114,101,97,116,101,95,98,117,105,108,116,105,110, + 114,161,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,150,0,0,0,252,2,0,0,115,12,0, + 0,0,12,3,12,1,4,1,6,255,12,2,255,128,122,29, 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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,56,82,101, - 116,117,114,110,32,78,111,110,101,32,97,115,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,115,32,100,111, - 32,110,111,116,32,104,97,118,101,32,115,111,117,114,99,101, - 32,99,111,100,101,46,78,114,10,0,0,0,114,172,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,10,103,101,116,95,115,111,117,114,99,101,15,3,0,0, - 115,4,0,0,0,4,4,255,128,122,26,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,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,3,122,52,82,101,116,117,114, - 110,32,70,97,108,115,101,32,97,115,32,98,117,105,108,116, - 45,105,110,32,109,111,100,117,108,101,115,32,97,114,101,32, - 110,101,118,101,114,32,112,97,99,107,97,103,101,115,46,70, - 78,114,10,0,0,0,114,172,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,116,0,0,0,21, - 3,0,0,115,4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41, - 18,114,1,0,0,0,114,0,0,0,0,114,2,0,0,0, - 114,3,0,0,0,114,139,0,0,0,218,12,115,116,97,116, - 105,99,109,101,116,104,111,100,114,100,0,0,0,218,11,99, - 108,97,115,115,109,101,116,104,111,100,114,170,0,0,0,114, - 171,0,0,0,114,150,0,0,0,114,151,0,0,0,114,87, - 0,0,0,114,173,0,0,0,114,174,0,0,0,114,116,0, - 0,0,114,98,0,0,0,114,156,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,162,0,0,0,211,2,0,0,115,48,0,0,0,8,0, - 4,2,4,7,2,2,10,1,2,8,12,1,2,8,12,1, - 2,11,10,1,2,7,10,1,2,4,2,1,12,1,2,4, - 2,1,12,1,2,4,2,1,12,1,12,4,255,128,114,162, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,64,0,0,0,115,144,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,90, - 4,101,5,100,3,100,4,132,0,131,1,90,6,101,7,100, - 22,100,6,100,7,132,1,131,1,90,8,101,7,100,23,100, - 8,100,9,132,1,131,1,90,9,101,5,100,10,100,11,132, - 0,131,1,90,10,101,5,100,12,100,13,132,0,131,1,90, - 11,101,7,100,14,100,15,132,0,131,1,90,12,101,7,101, - 13,100,16,100,17,132,0,131,1,131,1,90,14,101,7,101, - 13,100,18,100,19,132,0,131,1,131,1,90,15,101,7,101, - 13,100,20,100,21,132,0,131,1,131,1,90,16,100,5,83, - 0,41,24,218,14,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,122,142,77,101,116,97,32,112,97,116,104,32,105, - 109,112,111,114,116,32,102,111,114,32,102,114,111,122,101,110, - 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,65, - 108,108,32,109,101,116,104,111,100,115,32,97,114,101,32,101, - 105,116,104,101,114,32,99,108,97,115,115,32,111,114,32,115, - 116,97,116,105,99,32,109,101,116,104,111,100,115,32,116,111, - 32,97,118,111,105,100,32,116,104,101,32,110,101,101,100,32, - 116,111,10,32,32,32,32,105,110,115,116,97,110,116,105,97, - 116,101,32,116,104,101,32,99,108,97,115,115,46,10,10,32, - 32,32,32,90,6,102,114,111,122,101,110,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, - 67,0,0,0,115,16,0,0,0,100,1,160,0,124,0,106, - 1,116,2,106,3,161,2,83,0,41,3,114,163,0,0,0, - 114,154,0,0,0,78,41,4,114,46,0,0,0,114,1,0, - 0,0,114,177,0,0,0,114,139,0,0,0,41,1,218,1, - 109,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,100,0,0,0,41,3,0,0,115,4,0,0,0,16,7, - 255,128,122,26,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, - 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 5,0,0,0,67,0,0,0,115,30,0,0,0,116,0,160, - 1,124,1,161,1,114,26,116,2,124,1,124,0,124,0,106, - 3,100,1,141,3,83,0,100,0,83,0,114,165,0,0,0, - 41,4,114,58,0,0,0,114,89,0,0,0,114,92,0,0, - 0,114,139,0,0,0,114,166,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,170,0,0,0,50, - 3,0,0,115,8,0,0,0,10,2,16,1,4,2,255,128, - 122,24,70,114,111,122,101,110,73,109,112,111,114,116,101,114, - 46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, - 0,0,0,115,18,0,0,0,116,0,160,1,124,1,161,1, - 114,14,124,0,83,0,100,1,83,0,41,2,122,93,70,105, - 110,100,32,97,32,102,114,111,122,101,110,32,109,111,100,117, - 108,101,46,10,10,32,32,32,32,32,32,32,32,84,104,105, - 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,32,32,85,115,101,32,102,105,110, - 100,95,115,112,101,99,40,41,32,105,110,115,116,101,97,100, - 46,10,10,32,32,32,32,32,32,32,32,78,41,2,114,58, - 0,0,0,114,89,0,0,0,41,3,114,167,0,0,0,114, - 82,0,0,0,114,168,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,171,0,0,0,57,3,0, - 0,115,4,0,0,0,18,7,255,128,122,26,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,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,2,122,42,85,115,101,32, - 100,101,102,97,117,108,116,32,115,101,109,97,110,116,105,99, - 115,32,102,111,114,32,109,111,100,117,108,101,32,99,114,101, - 97,116,105,111,110,46,78,114,10,0,0,0,114,161,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,150,0,0,0,66,3,0,0,115,4,0,0,0,4,128, - 255,128,122,28,70,114,111,122,101,110,73,109,112,111,114,116, - 101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,101, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,4,0,0,0,67,0,0,0,115,64,0,0,0,124,0, - 106,0,106,1,125,1,116,2,160,3,124,1,161,1,115,36, - 116,4,100,1,160,5,124,1,161,1,124,1,100,2,141,2, - 130,1,116,6,116,2,106,7,124,1,131,2,125,2,116,8, - 124,2,124,0,106,9,131,2,1,0,100,0,83,0,114,88, - 0,0,0,41,10,114,106,0,0,0,114,17,0,0,0,114, - 58,0,0,0,114,89,0,0,0,114,80,0,0,0,114,46, - 0,0,0,114,68,0,0,0,218,17,103,101,116,95,102,114, - 111,122,101,110,95,111,98,106,101,99,116,218,4,101,120,101, - 99,114,7,0,0,0,41,3,114,97,0,0,0,114,17,0, - 0,0,218,4,99,111,100,101,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,151,0,0,0,70,3,0,0, - 115,18,0,0,0,8,2,10,1,10,1,2,1,6,255,12, - 2,12,1,4,128,255,128,122,26,70,114,111,122,101,110,73, + 99,114,101,97,116,101,95,109,111,100,117,108,101,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,16,0,0,0,116,0,116,1,106, + 2,124,0,131,2,1,0,100,1,83,0,41,2,122,22,69, + 120,101,99,32,97,32,98,117,105,108,116,45,105,110,32,109, + 111,100,117,108,101,78,41,3,114,68,0,0,0,114,58,0, + 0,0,90,12,101,120,101,99,95,98,117,105,108,116,105,110, + 114,164,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,151,0,0,0,4,3,0,0,115,4,0, + 0,0,16,3,255,128,122,27,66,117,105,108,116,105,110,73, 109,112,111,114,116,101,114,46,101,120,101,99,95,109,111,100, 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,10,0,0, - 0,116,0,124,0,124,1,131,2,83,0,41,2,122,95,76, - 111,97,100,32,97,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, - 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,46,32,32,85,115,101,32,101,120, - 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, - 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,41, - 1,114,98,0,0,0,114,172,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,156,0,0,0,79, - 3,0,0,115,4,0,0,0,10,7,255,128,122,26,70,114, - 111,122,101,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, - 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, - 0,115,10,0,0,0,116,0,160,1,124,1,161,1,83,0, - 41,2,122,45,82,101,116,117,114,110,32,116,104,101,32,99, - 111,100,101,32,111,98,106,101,99,116,32,102,111,114,32,116, - 104,101,32,102,114,111,122,101,110,32,109,111,100,117,108,101, - 46,78,41,2,114,58,0,0,0,114,179,0,0,0,114,172, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,173,0,0,0,88,3,0,0,115,4,0,0,0, - 10,4,255,128,122,23,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,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,122,54,82,101,116,117,114,110,32,78,111,110,101,32,97, - 115,32,102,114,111,122,101,110,32,109,111,100,117,108,101,115, - 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, - 114,99,101,32,99,111,100,101,46,78,114,10,0,0,0,114, + 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,122,57,82,101,116,117,114,110,32, + 78,111,110,101,32,97,115,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,115,32,100,111,32,110,111,116,32, + 104,97,118,101,32,99,111,100,101,32,111,98,106,101,99,116, + 115,46,78,114,10,0,0,0,169,2,114,167,0,0,0,114, + 82,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,8,103,101,116,95,99,111,100,101,9,3,0, + 0,115,4,0,0,0,4,4,255,128,122,24,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,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,41,2,122,56,82,101,116,117,114,110, + 32,78,111,110,101,32,97,115,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,115,32,100,111,32,110,111,116, + 32,104,97,118,101,32,115,111,117,114,99,101,32,99,111,100, + 101,46,78,114,10,0,0,0,114,172,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,10,103,101, + 116,95,115,111,117,114,99,101,15,3,0,0,115,4,0,0, + 0,4,4,255,128,122,26,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,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,3,122,52,82,101,116,117,114,110,32,70,97, + 108,115,101,32,97,115,32,98,117,105,108,116,45,105,110,32, + 109,111,100,117,108,101,115,32,97,114,101,32,110,101,118,101, + 114,32,112,97,99,107,97,103,101,115,46,70,78,114,10,0, + 0,0,114,172,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,116,0,0,0,21,3,0,0,115, + 4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41,18,114,1,0, + 0,0,114,0,0,0,0,114,2,0,0,0,114,3,0,0, + 0,114,139,0,0,0,218,12,115,116,97,116,105,99,109,101, + 116,104,111,100,114,100,0,0,0,218,11,99,108,97,115,115, + 109,101,116,104,111,100,114,170,0,0,0,114,171,0,0,0, + 114,150,0,0,0,114,151,0,0,0,114,87,0,0,0,114, + 173,0,0,0,114,174,0,0,0,114,116,0,0,0,114,98, + 0,0,0,114,156,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,162,0,0, + 0,211,2,0,0,115,48,0,0,0,8,0,4,2,4,7, + 2,2,10,1,2,8,12,1,2,8,12,1,2,11,10,1, + 2,7,10,1,2,4,2,1,12,1,2,4,2,1,12,1, + 2,4,2,1,12,1,12,4,255,128,114,162,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,64,0,0,0,115,144,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,100,2,90,4,101,5,100, + 3,100,4,132,0,131,1,90,6,101,7,100,22,100,6,100, + 7,132,1,131,1,90,8,101,7,100,23,100,8,100,9,132, + 1,131,1,90,9,101,5,100,10,100,11,132,0,131,1,90, + 10,101,5,100,12,100,13,132,0,131,1,90,11,101,7,100, + 14,100,15,132,0,131,1,90,12,101,7,101,13,100,16,100, + 17,132,0,131,1,131,1,90,14,101,7,101,13,100,18,100, + 19,132,0,131,1,131,1,90,15,101,7,101,13,100,20,100, + 21,132,0,131,1,131,1,90,16,100,5,83,0,41,24,218, + 14,70,114,111,122,101,110,73,109,112,111,114,116,101,114,122, + 142,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, + 116,32,102,111,114,32,102,114,111,122,101,110,32,109,111,100, + 117,108,101,115,46,10,10,32,32,32,32,65,108,108,32,109, + 101,116,104,111,100,115,32,97,114,101,32,101,105,116,104,101, + 114,32,99,108,97,115,115,32,111,114,32,115,116,97,116,105, + 99,32,109,101,116,104,111,100,115,32,116,111,32,97,118,111, + 105,100,32,116,104,101,32,110,101,101,100,32,116,111,10,32, + 32,32,32,105,110,115,116,97,110,116,105,97,116,101,32,116, + 104,101,32,99,108,97,115,115,46,10,10,32,32,32,32,90, + 6,102,114,111,122,101,110,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, + 115,16,0,0,0,100,1,160,0,124,0,106,1,116,2,106, + 3,161,2,83,0,41,3,114,163,0,0,0,114,154,0,0, + 0,78,41,4,114,46,0,0,0,114,1,0,0,0,114,177, + 0,0,0,114,139,0,0,0,41,1,218,1,109,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,100,0,0, + 0,41,3,0,0,115,4,0,0,0,16,7,255,128,122,26, + 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,4,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0, + 67,0,0,0,115,30,0,0,0,116,0,160,1,124,1,161, + 1,114,26,116,2,124,1,124,0,124,0,106,3,100,1,141, + 3,83,0,100,0,83,0,114,165,0,0,0,41,4,114,58, + 0,0,0,114,89,0,0,0,114,92,0,0,0,114,139,0, + 0,0,114,166,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,170,0,0,0,50,3,0,0,115, + 8,0,0,0,10,2,16,1,4,2,255,128,122,24,70,114, + 111,122,101,110,73,109,112,111,114,116,101,114,46,102,105,110, + 100,95,115,112,101,99,99,3,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, + 18,0,0,0,116,0,160,1,124,1,161,1,114,14,124,0, + 83,0,100,1,83,0,41,2,122,93,70,105,110,100,32,97, + 32,102,114,111,122,101,110,32,109,111,100,117,108,101,46,10, + 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,32,32,85,115,101,32,102,105,110,100,95,115,112, + 101,99,40,41,32,105,110,115,116,101,97,100,46,10,10,32, + 32,32,32,32,32,32,32,78,41,2,114,58,0,0,0,114, + 89,0,0,0,41,3,114,167,0,0,0,114,82,0,0,0, + 114,168,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,171,0,0,0,57,3,0,0,115,4,0, + 0,0,18,7,255,128,122,26,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,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,41,2,122,42,85,115,101,32,100,101,102,97, + 117,108,116,32,115,101,109,97,110,116,105,99,115,32,102,111, + 114,32,109,111,100,117,108,101,32,99,114,101,97,116,105,111, + 110,46,78,114,10,0,0,0,114,161,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,150,0,0, + 0,66,3,0,0,115,4,0,0,0,4,128,255,128,122,28, + 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,99, + 114,101,97,116,101,95,109,111,100,117,108,101,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, + 0,67,0,0,0,115,64,0,0,0,124,0,106,0,106,1, + 125,1,116,2,160,3,124,1,161,1,115,36,116,4,100,1, + 160,5,124,1,161,1,124,1,100,2,141,2,130,1,116,6, + 116,2,106,7,124,1,131,2,125,2,116,8,124,2,124,0, + 106,9,131,2,1,0,100,0,83,0,114,88,0,0,0,41, + 10,114,106,0,0,0,114,17,0,0,0,114,58,0,0,0, + 114,89,0,0,0,114,80,0,0,0,114,46,0,0,0,114, + 68,0,0,0,218,17,103,101,116,95,102,114,111,122,101,110, + 95,111,98,106,101,99,116,218,4,101,120,101,99,114,7,0, + 0,0,41,3,114,97,0,0,0,114,17,0,0,0,218,4, + 99,111,100,101,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,151,0,0,0,70,3,0,0,115,16,0,0, + 0,8,2,10,1,10,1,2,1,6,255,12,2,16,1,255, + 128,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,46,101,120,101,99,95,109,111,100,117,108,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,124, + 1,131,2,83,0,41,2,122,95,76,111,97,100,32,97,32, + 102,114,111,122,101,110,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,78,41,1,114,98,0,0,0, + 114,172,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,156,0,0,0,79,3,0,0,115,4,0, + 0,0,10,7,255,128,122,26,70,114,111,122,101,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,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0, + 116,0,160,1,124,1,161,1,83,0,41,2,122,45,82,101, + 116,117,114,110,32,116,104,101,32,99,111,100,101,32,111,98, + 106,101,99,116,32,102,111,114,32,116,104,101,32,102,114,111, + 122,101,110,32,109,111,100,117,108,101,46,78,41,2,114,58, + 0,0,0,114,179,0,0,0,114,172,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,173,0,0, + 0,88,3,0,0,115,4,0,0,0,10,4,255,128,122,23, + 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, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,54,82,101,116, + 117,114,110,32,78,111,110,101,32,97,115,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,115,32,100,111,32,110,111, + 116,32,104,97,118,101,32,115,111,117,114,99,101,32,99,111, + 100,101,46,78,114,10,0,0,0,114,172,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,174,0, + 0,0,94,3,0,0,115,4,0,0,0,4,4,255,128,122, + 25,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,0,0,0,0,2,0,0,0,3,0,0,0,67, + 0,0,0,115,10,0,0,0,116,0,160,1,124,1,161,1, + 83,0,41,2,122,46,82,101,116,117,114,110,32,84,114,117, + 101,32,105,102,32,116,104,101,32,102,114,111,122,101,110,32, + 109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,107, + 97,103,101,46,78,41,2,114,58,0,0,0,90,17,105,115, + 95,102,114,111,122,101,110,95,112,97,99,107,97,103,101,114, 172,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,174,0,0,0,94,3,0,0,115,4,0,0, - 0,4,4,255,128,122,25,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,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, - 160,1,124,1,161,1,83,0,41,2,122,46,82,101,116,117, - 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,102, - 114,111,122,101,110,32,109,111,100,117,108,101,32,105,115,32, - 97,32,112,97,99,107,97,103,101,46,78,41,2,114,58,0, - 0,0,90,17,105,115,95,102,114,111,122,101,110,95,112,97, - 99,107,97,103,101,114,172,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,116,0,0,0,100,3, - 0,0,115,4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17,114, - 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, - 0,0,0,114,139,0,0,0,114,175,0,0,0,114,100,0, - 0,0,114,176,0,0,0,114,170,0,0,0,114,171,0,0, - 0,114,150,0,0,0,114,151,0,0,0,114,156,0,0,0, - 114,91,0,0,0,114,173,0,0,0,114,174,0,0,0,114, - 116,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,177,0,0,0,30,3,0, - 0,115,50,0,0,0,8,0,4,2,4,7,2,2,10,1, - 2,8,12,1,2,6,12,1,2,8,10,1,2,3,10,1, - 2,8,10,1,2,8,2,1,12,1,2,4,2,1,12,1, - 2,4,2,1,16,1,255,128,114,177,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,64,0,0,0,115,32,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,100,6,83,0,41,7,218,18,95, - 73,109,112,111,114,116,76,111,99,107,67,111,110,116,101,120, - 116,122,36,67,111,110,116,101,120,116,32,109,97,110,97,103, - 101,114,32,102,111,114,32,116,104,101,32,105,109,112,111,114, - 116,32,108,111,99,107,46,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,2,0,0,0,67,0,0,0, - 115,12,0,0,0,116,0,160,1,161,0,1,0,100,1,83, - 0,41,2,122,24,65,99,113,117,105,114,101,32,116,104,101, - 32,105,109,112,111,114,116,32,108,111,99,107,46,78,41,2, - 114,58,0,0,0,114,59,0,0,0,114,48,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,55, - 0,0,0,113,3,0,0,115,6,0,0,0,8,2,4,128, - 255,128,122,28,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,0,0,0,0,4,0,0, - 0,2,0,0,0,67,0,0,0,115,12,0,0,0,116,0, - 160,1,161,0,1,0,100,1,83,0,41,2,122,60,82,101, - 108,101,97,115,101,32,116,104,101,32,105,109,112,111,114,116, - 32,108,111,99,107,32,114,101,103,97,114,100,108,101,115,115, - 32,111,102,32,97,110,121,32,114,97,105,115,101,100,32,101, - 120,99,101,112,116,105,111,110,115,46,78,41,2,114,58,0, - 0,0,114,61,0,0,0,41,4,114,30,0,0,0,218,8, - 101,120,99,95,116,121,112,101,218,9,101,120,99,95,118,97, - 108,117,101,218,13,101,120,99,95,116,114,97,99,101,98,97, - 99,107,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,57,0,0,0,117,3,0,0,115,6,0,0,0,8, - 2,4,128,255,128,122,27,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,41,6,114,1,0,0,0,114,0,0,0,0,114, - 2,0,0,0,114,3,0,0,0,114,55,0,0,0,114,57, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,182,0,0,0,109,3,0,0, - 115,10,0,0,0,8,0,4,2,8,2,12,4,255,128,114, - 182,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,5,0,0,0,67,0,0,0,115,64,0, - 0,0,124,1,160,0,100,1,124,2,100,2,24,0,161,2, - 125,3,116,1,124,3,131,1,124,2,107,0,114,36,116,2, - 100,3,131,1,130,1,124,3,100,4,25,0,125,4,124,0, - 114,60,100,5,160,3,124,4,124,0,161,2,83,0,124,4, - 83,0,41,7,122,50,82,101,115,111,108,118,101,32,97,32, - 114,101,108,97,116,105,118,101,32,109,111,100,117,108,101,32, - 110,97,109,101,32,116,111,32,97,110,32,97,98,115,111,108, - 117,116,101,32,111,110,101,46,114,129,0,0,0,114,39,0, - 0,0,122,50,97,116,116,101,109,112,116,101,100,32,114,101, - 108,97,116,105,118,101,32,105,109,112,111,114,116,32,98,101, - 121,111,110,100,32,116,111,112,45,108,101,118,101,108,32,112, - 97,99,107,97,103,101,114,22,0,0,0,250,5,123,125,46, - 123,125,78,41,4,218,6,114,115,112,108,105,116,218,3,108, - 101,110,114,80,0,0,0,114,46,0,0,0,41,5,114,17, - 0,0,0,218,7,112,97,99,107,97,103,101,218,5,108,101, - 118,101,108,90,4,98,105,116,115,90,4,98,97,115,101,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,13, - 95,114,101,115,111,108,118,101,95,110,97,109,101,122,3,0, - 0,115,12,0,0,0,16,2,12,1,8,1,8,1,20,1, - 255,128,114,191,0,0,0,99,3,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, - 115,34,0,0,0,124,0,160,0,124,1,124,2,161,2,125, - 3,124,3,100,0,117,0,114,24,100,0,83,0,116,1,124, - 1,124,3,131,2,83,0,114,13,0,0,0,41,2,114,171, - 0,0,0,114,92,0,0,0,41,4,218,6,102,105,110,100, - 101,114,114,17,0,0,0,114,168,0,0,0,114,110,0,0, + 0,0,0,114,116,0,0,0,100,3,0,0,115,4,0,0, + 0,10,4,255,128,122,25,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, + 41,2,78,78,41,1,78,41,17,114,1,0,0,0,114,0, + 0,0,0,114,2,0,0,0,114,3,0,0,0,114,139,0, + 0,0,114,175,0,0,0,114,100,0,0,0,114,176,0,0, + 0,114,170,0,0,0,114,171,0,0,0,114,150,0,0,0, + 114,151,0,0,0,114,156,0,0,0,114,91,0,0,0,114, + 173,0,0,0,114,174,0,0,0,114,116,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,177,0,0,0,30,3,0,0,115,50,0,0,0, + 8,0,4,2,4,7,2,2,10,1,2,8,12,1,2,6, + 12,1,2,8,10,1,2,3,10,1,2,8,10,1,2,8, + 2,1,12,1,2,4,2,1,12,1,2,4,2,1,16,1, + 255,128,114,177,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,64,0,0,0, + 115,32,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, + 5,100,6,83,0,41,7,218,18,95,73,109,112,111,114,116, + 76,111,99,107,67,111,110,116,101,120,116,122,36,67,111,110, + 116,101,120,116,32,109,97,110,97,103,101,114,32,102,111,114, + 32,116,104,101,32,105,109,112,111,114,116,32,108,111,99,107, + 46,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,160,1,161,0,1,0,100,1,83,0,41,2,122,24,65, + 99,113,117,105,114,101,32,116,104,101,32,105,109,112,111,114, + 116,32,108,111,99,107,46,78,41,2,114,58,0,0,0,114, + 59,0,0,0,114,48,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,55,0,0,0,113,3,0, + 0,115,4,0,0,0,12,2,255,128,122,28,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,0,0,0,0,4,0,0,0,2,0,0,0,67,0,0, + 0,115,12,0,0,0,116,0,160,1,161,0,1,0,100,1, + 83,0,41,2,122,60,82,101,108,101,97,115,101,32,116,104, + 101,32,105,109,112,111,114,116,32,108,111,99,107,32,114,101, + 103,97,114,100,108,101,115,115,32,111,102,32,97,110,121,32, + 114,97,105,115,101,100,32,101,120,99,101,112,116,105,111,110, + 115,46,78,41,2,114,58,0,0,0,114,61,0,0,0,41, + 4,114,30,0,0,0,218,8,101,120,99,95,116,121,112,101, + 218,9,101,120,99,95,118,97,108,117,101,218,13,101,120,99, + 95,116,114,97,99,101,98,97,99,107,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,57,0,0,0,117,3, + 0,0,115,4,0,0,0,12,2,255,128,122,27,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,41,6,114,1,0,0,0, + 114,0,0,0,0,114,2,0,0,0,114,3,0,0,0,114, + 55,0,0,0,114,57,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,182,0, + 0,0,109,3,0,0,115,10,0,0,0,8,0,4,2,8, + 2,12,4,255,128,114,182,0,0,0,99,3,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, + 0,0,0,115,64,0,0,0,124,1,160,0,100,1,124,2, + 100,2,24,0,161,2,125,3,116,1,124,3,131,1,124,2, + 107,0,114,36,116,2,100,3,131,1,130,1,124,3,100,4, + 25,0,125,4,124,0,114,60,100,5,160,3,124,4,124,0, + 161,2,83,0,124,4,83,0,41,7,122,50,82,101,115,111, + 108,118,101,32,97,32,114,101,108,97,116,105,118,101,32,109, + 111,100,117,108,101,32,110,97,109,101,32,116,111,32,97,110, + 32,97,98,115,111,108,117,116,101,32,111,110,101,46,114,129, + 0,0,0,114,39,0,0,0,122,50,97,116,116,101,109,112, + 116,101,100,32,114,101,108,97,116,105,118,101,32,105,109,112, + 111,114,116,32,98,101,121,111,110,100,32,116,111,112,45,108, + 101,118,101,108,32,112,97,99,107,97,103,101,114,22,0,0, + 0,250,5,123,125,46,123,125,78,41,4,218,6,114,115,112, + 108,105,116,218,3,108,101,110,114,80,0,0,0,114,46,0, + 0,0,41,5,114,17,0,0,0,218,7,112,97,99,107,97, + 103,101,218,5,108,101,118,101,108,90,4,98,105,116,115,90, + 4,98,97,115,101,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,13,95,114,101,115,111,108,118,101,95,110, + 97,109,101,122,3,0,0,115,12,0,0,0,16,2,12,1, + 8,1,8,1,20,1,255,128,114,191,0,0,0,99,3,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, + 0,0,67,0,0,0,115,34,0,0,0,124,0,160,0,124, + 1,124,2,161,2,125,3,124,3,100,0,117,0,114,24,100, + 0,83,0,116,1,124,1,124,3,131,2,83,0,114,13,0, + 0,0,41,2,114,171,0,0,0,114,92,0,0,0,41,4, + 218,6,102,105,110,100,101,114,114,17,0,0,0,114,168,0, + 0,0,114,110,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,17,95,102,105,110,100,95,115,112, + 101,99,95,108,101,103,97,99,121,131,3,0,0,115,10,0, + 0,0,12,3,8,1,4,1,10,1,255,128,114,193,0,0, + 0,99,3,0,0,0,0,0,0,0,0,0,0,0,10,0, + 0,0,10,0,0,0,67,0,0,0,115,28,1,0,0,116, + 0,106,1,125,3,124,3,100,1,117,0,114,22,116,2,100, + 2,131,1,130,1,124,3,115,38,116,3,160,4,100,3,116, + 5,161,2,1,0,124,0,116,0,106,6,118,0,125,4,124, + 3,68,0,93,226,125,5,116,7,131,0,143,94,1,0,122, + 10,124,5,106,8,125,6,87,0,110,54,4,0,116,9,121, + 128,1,0,1,0,1,0,116,10,124,5,124,0,124,1,131, + 3,125,7,124,7,100,1,117,0,114,124,89,0,87,0,100, + 1,4,0,4,0,131,3,1,0,113,52,89,0,110,14,48, + 0,124,6,124,0,124,1,124,2,131,3,125,7,87,0,100, + 1,4,0,4,0,131,3,1,0,110,16,49,0,115,162,48, + 0,1,0,1,0,1,0,89,0,1,0,124,7,100,1,117, + 1,114,52,124,4,144,1,115,16,124,0,116,0,106,6,118, + 0,144,1,114,16,116,0,106,6,124,0,25,0,125,8,122, + 10,124,8,106,11,125,9,87,0,110,26,4,0,116,9,121, + 244,1,0,1,0,1,0,124,7,6,0,89,0,2,0,1, + 0,83,0,48,0,124,9,100,1,117,0,144,1,114,8,124, + 7,2,0,1,0,83,0,124,9,2,0,1,0,83,0,124, + 7,2,0,1,0,83,0,100,1,83,0,41,4,122,21,70, + 105,110,100,32,97,32,109,111,100,117,108,101,39,115,32,115, + 112,101,99,46,78,122,53,115,121,115,46,109,101,116,97,95, + 112,97,116,104,32,105,115,32,78,111,110,101,44,32,80,121, + 116,104,111,110,32,105,115,32,108,105,107,101,108,121,32,115, + 104,117,116,116,105,110,103,32,100,111,119,110,122,22,115,121, + 115,46,109,101,116,97,95,112,97,116,104,32,105,115,32,101, + 109,112,116,121,41,12,114,15,0,0,0,218,9,109,101,116, + 97,95,112,97,116,104,114,80,0,0,0,218,9,95,119,97, + 114,110,105,110,103,115,218,4,119,97,114,110,218,13,73,109, + 112,111,114,116,87,97,114,110,105,110,103,114,93,0,0,0, + 114,182,0,0,0,114,170,0,0,0,114,107,0,0,0,114, + 193,0,0,0,114,106,0,0,0,41,10,114,17,0,0,0, + 114,168,0,0,0,114,169,0,0,0,114,194,0,0,0,90, + 9,105,115,95,114,101,108,111,97,100,114,192,0,0,0,114, + 170,0,0,0,114,96,0,0,0,114,97,0,0,0,114,106, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,10,95,102,105,110,100,95,115,112,101,99,140,3, + 0,0,115,56,0,0,0,6,2,8,1,8,2,4,3,12, + 1,10,5,8,1,8,1,2,1,10,1,12,1,12,1,8, + 1,22,1,42,2,8,1,18,2,10,1,2,1,10,1,12, + 1,14,4,10,2,8,1,8,2,8,2,4,2,255,128,114, + 198,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,5,0,0,0,67,0,0,0,115,110,0, + 0,0,116,0,124,0,116,1,131,2,115,28,116,2,100,1, + 160,3,116,4,124,0,131,1,161,1,131,1,130,1,124,2, + 100,2,107,0,114,44,116,5,100,3,131,1,130,1,124,2, + 100,2,107,4,114,82,116,0,124,1,116,1,131,2,115,70, + 116,2,100,4,131,1,130,1,124,1,115,82,116,6,100,5, + 131,1,130,1,124,0,115,106,124,2,100,2,107,2,114,102, + 116,5,100,6,131,1,130,1,100,7,83,0,100,7,83,0, + 41,8,122,28,86,101,114,105,102,121,32,97,114,103,117,109, + 101,110,116,115,32,97,114,101,32,34,115,97,110,101,34,46, + 122,31,109,111,100,117,108,101,32,110,97,109,101,32,109,117, + 115,116,32,98,101,32,115,116,114,44,32,110,111,116,32,123, + 125,114,22,0,0,0,122,18,108,101,118,101,108,32,109,117, + 115,116,32,98,101,32,62,61,32,48,122,31,95,95,112,97, + 99,107,97,103,101,95,95,32,110,111,116,32,115,101,116,32, + 116,111,32,97,32,115,116,114,105,110,103,122,54,97,116,116, + 101,109,112,116,101,100,32,114,101,108,97,116,105,118,101,32, + 105,109,112,111,114,116,32,119,105,116,104,32,110,111,32,107, + 110,111,119,110,32,112,97,114,101,110,116,32,112,97,99,107, + 97,103,101,122,17,69,109,112,116,121,32,109,111,100,117,108, + 101,32,110,97,109,101,78,41,7,218,10,105,115,105,110,115, + 116,97,110,99,101,218,3,115,116,114,218,9,84,121,112,101, + 69,114,114,111,114,114,46,0,0,0,114,14,0,0,0,218, + 10,86,97,108,117,101,69,114,114,111,114,114,80,0,0,0, + 169,3,114,17,0,0,0,114,189,0,0,0,114,190,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,17,95,102,105,110,100,95,115,112,101,99,95,108,101,103, - 97,99,121,131,3,0,0,115,10,0,0,0,12,3,8,1, - 4,1,10,1,255,128,114,193,0,0,0,99,3,0,0,0, - 0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,0, - 67,0,0,0,115,28,1,0,0,116,0,106,1,125,3,124, - 3,100,1,117,0,114,22,116,2,100,2,131,1,130,1,124, - 3,115,38,116,3,160,4,100,3,116,5,161,2,1,0,124, - 0,116,0,106,6,118,0,125,4,124,3,68,0,93,226,125, - 5,116,7,131,0,143,94,1,0,122,10,124,5,106,8,125, - 6,87,0,110,54,4,0,116,9,121,128,1,0,1,0,1, - 0,116,10,124,5,124,0,124,1,131,3,125,7,124,7,100, - 1,117,0,114,124,89,0,87,0,100,1,4,0,4,0,131, - 3,1,0,113,52,89,0,110,14,48,0,124,6,124,0,124, - 1,124,2,131,3,125,7,87,0,100,1,4,0,4,0,131, - 3,1,0,110,16,49,0,115,162,48,0,1,0,1,0,1, - 0,89,0,1,0,124,7,100,1,117,1,114,52,124,4,144, - 1,115,16,124,0,116,0,106,6,118,0,144,1,114,16,116, - 0,106,6,124,0,25,0,125,8,122,10,124,8,106,11,125, - 9,87,0,110,26,4,0,116,9,121,244,1,0,1,0,1, - 0,124,7,6,0,89,0,2,0,1,0,83,0,48,0,124, - 9,100,1,117,0,144,1,114,8,124,7,2,0,1,0,83, - 0,124,9,2,0,1,0,83,0,124,7,2,0,1,0,83, - 0,100,1,83,0,41,4,122,21,70,105,110,100,32,97,32, - 109,111,100,117,108,101,39,115,32,115,112,101,99,46,78,122, - 53,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, - 115,32,78,111,110,101,44,32,80,121,116,104,111,110,32,105, - 115,32,108,105,107,101,108,121,32,115,104,117,116,116,105,110, - 103,32,100,111,119,110,122,22,115,121,115,46,109,101,116,97, - 95,112,97,116,104,32,105,115,32,101,109,112,116,121,41,12, - 114,15,0,0,0,218,9,109,101,116,97,95,112,97,116,104, - 114,80,0,0,0,218,9,95,119,97,114,110,105,110,103,115, - 218,4,119,97,114,110,218,13,73,109,112,111,114,116,87,97, - 114,110,105,110,103,114,93,0,0,0,114,182,0,0,0,114, - 170,0,0,0,114,107,0,0,0,114,193,0,0,0,114,106, - 0,0,0,41,10,114,17,0,0,0,114,168,0,0,0,114, - 169,0,0,0,114,194,0,0,0,90,9,105,115,95,114,101, - 108,111,97,100,114,192,0,0,0,114,170,0,0,0,114,96, - 0,0,0,114,97,0,0,0,114,106,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,10,95,102, - 105,110,100,95,115,112,101,99,140,3,0,0,115,56,0,0, - 0,6,2,8,1,8,2,4,3,12,1,10,5,8,1,8, - 1,2,1,10,1,12,1,12,1,8,1,22,1,42,2,8, - 1,18,2,10,1,2,1,10,1,12,1,14,4,10,2,8, - 1,8,2,8,2,4,2,255,128,114,198,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, - 0,0,0,67,0,0,0,115,106,0,0,0,116,0,124,0, - 116,1,131,2,115,28,116,2,100,1,160,3,116,4,124,0, - 131,1,161,1,131,1,130,1,124,2,100,2,107,0,114,44, - 116,5,100,3,131,1,130,1,124,2,100,2,107,4,114,82, - 116,0,124,1,116,1,131,2,115,70,116,2,100,4,131,1, - 130,1,124,1,115,82,116,6,100,5,131,1,130,1,124,0, - 115,102,124,2,100,2,107,2,114,102,116,5,100,6,131,1, - 130,1,100,7,83,0,41,8,122,28,86,101,114,105,102,121, - 32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,34, - 115,97,110,101,34,46,122,31,109,111,100,117,108,101,32,110, - 97,109,101,32,109,117,115,116,32,98,101,32,115,116,114,44, - 32,110,111,116,32,123,125,114,22,0,0,0,122,18,108,101, - 118,101,108,32,109,117,115,116,32,98,101,32,62,61,32,48, - 122,31,95,95,112,97,99,107,97,103,101,95,95,32,110,111, - 116,32,115,101,116,32,116,111,32,97,32,115,116,114,105,110, - 103,122,54,97,116,116,101,109,112,116,101,100,32,114,101,108, - 97,116,105,118,101,32,105,109,112,111,114,116,32,119,105,116, - 104,32,110,111,32,107,110,111,119,110,32,112,97,114,101,110, - 116,32,112,97,99,107,97,103,101,122,17,69,109,112,116,121, - 32,109,111,100,117,108,101,32,110,97,109,101,78,41,7,218, - 10,105,115,105,110,115,116,97,110,99,101,218,3,115,116,114, - 218,9,84,121,112,101,69,114,114,111,114,114,46,0,0,0, - 114,14,0,0,0,218,10,86,97,108,117,101,69,114,114,111, - 114,114,80,0,0,0,169,3,114,17,0,0,0,114,189,0, - 0,0,114,190,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,13,95,115,97,110,105,116,121,95, - 99,104,101,99,107,187,3,0,0,115,26,0,0,0,10,2, - 18,1,8,1,8,1,8,1,10,1,8,1,4,1,8,1, - 12,2,8,1,4,128,255,128,114,204,0,0,0,122,16,78, - 111,32,109,111,100,117,108,101,32,110,97,109,101,100,32,122, - 4,123,33,114,125,99,2,0,0,0,0,0,0,0,0,0, - 0,0,9,0,0,0,8,0,0,0,67,0,0,0,115,20, - 1,0,0,100,0,125,2,124,0,160,0,100,1,161,1,100, - 2,25,0,125,3,124,3,114,128,124,3,116,1,106,2,118, - 1,114,42,116,3,124,1,124,3,131,2,1,0,124,0,116, - 1,106,2,118,0,114,62,116,1,106,2,124,0,25,0,83, - 0,116,1,106,2,124,3,25,0,125,4,122,10,124,4,106, - 4,125,2,87,0,110,44,4,0,116,5,121,126,1,0,1, - 0,1,0,116,6,100,3,23,0,160,7,124,0,124,3,161, - 2,125,5,116,8,124,5,124,0,100,4,141,2,100,0,130, - 2,48,0,116,9,124,0,124,2,131,2,125,6,124,6,100, - 0,117,0,114,164,116,8,116,6,160,7,124,0,161,1,124, - 0,100,4,141,2,130,1,116,10,124,6,131,1,125,7,124, - 3,144,1,114,16,116,1,106,2,124,3,25,0,125,4,124, - 0,160,0,100,1,161,1,100,5,25,0,125,8,122,18,116, - 11,124,4,124,8,124,7,131,3,1,0,87,0,124,7,83, - 0,4,0,116,5,144,1,121,14,1,0,1,0,1,0,100, - 6,124,3,155,2,100,7,124,8,155,2,157,4,125,5,116, - 12,160,13,124,5,116,14,161,2,1,0,89,0,124,7,83, - 0,48,0,124,7,83,0,41,8,78,114,129,0,0,0,114, - 22,0,0,0,122,23,59,32,123,33,114,125,32,105,115,32, - 110,111,116,32,97,32,112,97,99,107,97,103,101,114,16,0, - 0,0,233,2,0,0,0,122,27,67,97,110,110,111,116,32, - 115,101,116,32,97,110,32,97,116,116,114,105,98,117,116,101, - 32,111,110,32,122,18,32,102,111,114,32,99,104,105,108,100, - 32,109,111,100,117,108,101,32,41,15,114,130,0,0,0,114, - 15,0,0,0,114,93,0,0,0,114,68,0,0,0,114,142, - 0,0,0,114,107,0,0,0,218,8,95,69,82,82,95,77, - 83,71,114,46,0,0,0,218,19,77,111,100,117,108,101,78, - 111,116,70,111,117,110,100,69,114,114,111,114,114,198,0,0, - 0,114,160,0,0,0,114,5,0,0,0,114,195,0,0,0, - 114,196,0,0,0,114,197,0,0,0,41,9,114,17,0,0, - 0,218,7,105,109,112,111,114,116,95,114,168,0,0,0,114, - 131,0,0,0,90,13,112,97,114,101,110,116,95,109,111,100, - 117,108,101,114,158,0,0,0,114,96,0,0,0,114,97,0, - 0,0,90,5,99,104,105,108,100,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,23,95,102,105,110,100,95, - 97,110,100,95,108,111,97,100,95,117,110,108,111,99,107,101, - 100,206,3,0,0,115,60,0,0,0,4,1,14,1,4,1, - 10,1,10,1,10,2,10,1,10,1,2,1,10,1,12,1, - 16,1,16,1,10,1,8,1,18,1,8,2,6,1,10,2, - 14,1,2,1,14,1,4,4,14,253,16,1,14,1,4,1, - 2,255,4,1,255,128,114,209,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,8,0,0,0, - 67,0,0,0,115,128,0,0,0,116,0,124,0,131,1,143, - 62,1,0,116,1,106,2,160,3,124,0,116,4,161,2,125, - 2,124,2,116,4,117,0,114,56,116,5,124,0,124,1,131, - 2,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, - 0,87,0,100,1,4,0,4,0,131,3,1,0,110,16,49, - 0,115,76,48,0,1,0,1,0,1,0,89,0,1,0,124, - 2,100,1,117,0,114,116,100,2,160,6,124,0,161,1,125, - 3,116,7,124,3,124,0,100,3,141,2,130,1,116,8,124, - 0,131,1,1,0,124,2,83,0,41,4,122,25,70,105,110, - 100,32,97,110,100,32,108,111,97,100,32,116,104,101,32,109, - 111,100,117,108,101,46,78,122,40,105,109,112,111,114,116,32, - 111,102,32,123,125,32,104,97,108,116,101,100,59,32,78,111, - 110,101,32,105,110,32,115,121,115,46,109,111,100,117,108,101, - 115,114,16,0,0,0,41,9,114,51,0,0,0,114,15,0, - 0,0,114,93,0,0,0,114,35,0,0,0,218,14,95,78, - 69,69,68,83,95,76,79,65,68,73,78,71,114,209,0,0, - 0,114,46,0,0,0,114,207,0,0,0,114,66,0,0,0, - 41,4,114,17,0,0,0,114,208,0,0,0,114,97,0,0, - 0,114,76,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,14,95,102,105,110,100,95,97,110,100, - 95,108,111,97,100,241,3,0,0,115,24,0,0,0,10,2, - 14,1,8,1,54,1,8,2,4,1,2,1,4,255,12,2, - 8,2,4,1,255,128,114,211,0,0,0,114,22,0,0,0, - 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,4,0,0,0,67,0,0,0,115,42,0,0,0,116,0, - 124,0,124,1,124,2,131,3,1,0,124,2,100,1,107,4, - 114,32,116,1,124,0,124,1,124,2,131,3,125,0,116,2, - 124,0,116,3,131,2,83,0,41,3,97,50,1,0,0,73, - 109,112,111,114,116,32,97,110,100,32,114,101,116,117,114,110, - 32,116,104,101,32,109,111,100,117,108,101,32,98,97,115,101, - 100,32,111,110,32,105,116,115,32,110,97,109,101,44,32,116, - 104,101,32,112,97,99,107,97,103,101,32,116,104,101,32,99, - 97,108,108,32,105,115,10,32,32,32,32,98,101,105,110,103, - 32,109,97,100,101,32,102,114,111,109,44,32,97,110,100,32, - 116,104,101,32,108,101,118,101,108,32,97,100,106,117,115,116, - 109,101,110,116,46,10,10,32,32,32,32,84,104,105,115,32, - 102,117,110,99,116,105,111,110,32,114,101,112,114,101,115,101, - 110,116,115,32,116,104,101,32,103,114,101,97,116,101,115,116, - 32,99,111,109,109,111,110,32,100,101,110,111,109,105,110,97, - 116,111,114,32,111,102,32,102,117,110,99,116,105,111,110,97, - 108,105,116,121,10,32,32,32,32,98,101,116,119,101,101,110, - 32,105,109,112,111,114,116,95,109,111,100,117,108,101,32,97, - 110,100,32,95,95,105,109,112,111,114,116,95,95,46,32,84, - 104,105,115,32,105,110,99,108,117,100,101,115,32,115,101,116, - 116,105,110,103,32,95,95,112,97,99,107,97,103,101,95,95, - 32,105,102,10,32,32,32,32,116,104,101,32,108,111,97,100, - 101,114,32,100,105,100,32,110,111,116,46,10,10,32,32,32, - 32,114,22,0,0,0,78,41,4,114,204,0,0,0,114,191, - 0,0,0,114,211,0,0,0,218,11,95,103,99,100,95,105, - 109,112,111,114,116,114,203,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,212,0,0,0,1,4, - 0,0,115,10,0,0,0,12,9,8,1,12,1,10,1,255, - 128,114,212,0,0,0,169,1,218,9,114,101,99,117,114,115, - 105,118,101,99,3,0,0,0,0,0,0,0,1,0,0,0, - 8,0,0,0,11,0,0,0,67,0,0,0,115,216,0,0, - 0,124,1,68,0,93,206,125,4,116,0,124,4,116,1,131, - 2,115,64,124,3,114,34,124,0,106,2,100,1,23,0,125, - 5,110,4,100,2,125,5,116,3,100,3,124,5,155,0,100, - 4,116,4,124,4,131,1,106,2,155,0,157,4,131,1,130, - 1,124,4,100,5,107,2,114,106,124,3,115,4,116,5,124, - 0,100,6,131,2,114,4,116,6,124,0,124,0,106,7,124, - 2,100,7,100,8,141,4,1,0,113,4,116,5,124,0,124, - 4,131,2,115,4,100,9,160,8,124,0,106,2,124,4,161, - 2,125,6,122,14,116,9,124,2,124,6,131,2,1,0,87, - 0,113,4,4,0,116,10,121,210,1,0,125,7,1,0,122, - 42,124,7,106,11,124,6,107,2,114,200,116,12,106,13,160, - 14,124,6,116,15,161,2,100,10,117,1,114,200,87,0,89, - 0,100,10,125,7,126,7,113,4,130,0,100,10,125,7,126, - 7,48,0,48,0,124,0,83,0,41,11,122,238,70,105,103, - 117,114,101,32,111,117,116,32,119,104,97,116,32,95,95,105, - 109,112,111,114,116,95,95,32,115,104,111,117,108,100,32,114, - 101,116,117,114,110,46,10,10,32,32,32,32,84,104,101,32, - 105,109,112,111,114,116,95,32,112,97,114,97,109,101,116,101, - 114,32,105,115,32,97,32,99,97,108,108,97,98,108,101,32, - 119,104,105,99,104,32,116,97,107,101,115,32,116,104,101,32, - 110,97,109,101,32,111,102,32,109,111,100,117,108,101,32,116, - 111,10,32,32,32,32,105,109,112,111,114,116,46,32,73,116, - 32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32, - 100,101,99,111,117,112,108,101,32,116,104,101,32,102,117,110, - 99,116,105,111,110,32,102,114,111,109,32,97,115,115,117,109, - 105,110,103,32,105,109,112,111,114,116,108,105,98,39,115,10, - 32,32,32,32,105,109,112,111,114,116,32,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,32,105,115,32,100,101,115, - 105,114,101,100,46,10,10,32,32,32,32,122,8,46,95,95, - 97,108,108,95,95,122,13,96,96,102,114,111,109,32,108,105, - 115,116,39,39,122,8,73,116,101,109,32,105,110,32,122,18, - 32,109,117,115,116,32,98,101,32,115,116,114,44,32,110,111, - 116,32,250,1,42,218,7,95,95,97,108,108,95,95,84,114, - 213,0,0,0,114,186,0,0,0,78,41,16,114,199,0,0, - 0,114,200,0,0,0,114,1,0,0,0,114,201,0,0,0, - 114,14,0,0,0,114,4,0,0,0,218,16,95,104,97,110, - 100,108,101,95,102,114,111,109,108,105,115,116,114,216,0,0, - 0,114,46,0,0,0,114,68,0,0,0,114,207,0,0,0, - 114,17,0,0,0,114,15,0,0,0,114,93,0,0,0,114, - 35,0,0,0,114,210,0,0,0,41,8,114,97,0,0,0, - 218,8,102,114,111,109,108,105,115,116,114,208,0,0,0,114, - 214,0,0,0,218,1,120,90,5,119,104,101,114,101,90,9, - 102,114,111,109,95,110,97,109,101,90,3,101,120,99,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,217,0, - 0,0,16,4,0,0,115,52,0,0,0,8,10,10,1,4, - 1,12,1,4,2,10,1,8,1,8,255,8,2,14,1,10, - 1,2,1,8,255,10,2,14,1,2,1,14,1,14,1,10, - 4,16,1,2,255,12,2,2,1,10,128,4,1,255,128,114, - 217,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,6,0,0,0,67,0,0,0,115,146,0, - 0,0,124,0,160,0,100,1,161,1,125,1,124,0,160,0, - 100,2,161,1,125,2,124,1,100,3,117,1,114,82,124,2, - 100,3,117,1,114,78,124,1,124,2,106,1,107,3,114,78, - 116,2,106,3,100,4,124,1,155,2,100,5,124,2,106,1, - 155,2,100,6,157,5,116,4,100,7,100,8,141,3,1,0, - 124,1,83,0,124,2,100,3,117,1,114,96,124,2,106,1, - 83,0,116,2,106,3,100,9,116,4,100,7,100,8,141,3, - 1,0,124,0,100,10,25,0,125,1,100,11,124,0,118,1, - 114,142,124,1,160,5,100,12,161,1,100,13,25,0,125,1, - 124,1,83,0,41,14,122,167,67,97,108,99,117,108,97,116, - 101,32,119,104,97,116,32,95,95,112,97,99,107,97,103,101, - 95,95,32,115,104,111,117,108,100,32,98,101,46,10,10,32, - 32,32,32,95,95,112,97,99,107,97,103,101,95,95,32,105, - 115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100, - 32,116,111,32,98,101,32,100,101,102,105,110,101,100,32,111, - 114,32,99,111,117,108,100,32,98,101,32,115,101,116,32,116, - 111,32,78,111,110,101,10,32,32,32,32,116,111,32,114,101, - 112,114,101,115,101,110,116,32,116,104,97,116,32,105,116,115, - 32,112,114,111,112,101,114,32,118,97,108,117,101,32,105,115, - 32,117,110,107,110,111,119,110,46,10,10,32,32,32,32,114, - 146,0,0,0,114,106,0,0,0,78,122,32,95,95,112,97, - 99,107,97,103,101,95,95,32,33,61,32,95,95,115,112,101, - 99,95,95,46,112,97,114,101,110,116,32,40,122,4,32,33, - 61,32,250,1,41,233,3,0,0,0,41,1,90,10,115,116, - 97,99,107,108,101,118,101,108,122,89,99,97,110,39,116,32, - 114,101,115,111,108,118,101,32,112,97,99,107,97,103,101,32, - 102,114,111,109,32,95,95,115,112,101,99,95,95,32,111,114, - 32,95,95,112,97,99,107,97,103,101,95,95,44,32,102,97, - 108,108,105,110,103,32,98,97,99,107,32,111,110,32,95,95, - 110,97,109,101,95,95,32,97,110,100,32,95,95,112,97,116, - 104,95,95,114,1,0,0,0,114,142,0,0,0,114,129,0, - 0,0,114,22,0,0,0,41,6,114,35,0,0,0,114,131, - 0,0,0,114,195,0,0,0,114,196,0,0,0,114,197,0, - 0,0,114,130,0,0,0,41,3,218,7,103,108,111,98,97, - 108,115,114,189,0,0,0,114,96,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,17,95,99,97, - 108,99,95,95,95,112,97,99,107,97,103,101,95,95,53,4, - 0,0,115,44,0,0,0,10,7,10,1,8,1,18,1,6, - 1,2,1,4,255,4,1,6,255,4,2,6,254,4,3,8, - 1,6,1,6,2,4,2,6,254,8,3,8,1,14,1,4, - 1,255,128,114,223,0,0,0,114,10,0,0,0,99,5,0, - 0,0,0,0,0,0,0,0,0,0,9,0,0,0,5,0, - 0,0,67,0,0,0,115,174,0,0,0,124,4,100,1,107, - 2,114,18,116,0,124,0,131,1,125,5,110,36,124,1,100, - 2,117,1,114,30,124,1,110,2,105,0,125,6,116,1,124, - 6,131,1,125,7,116,0,124,0,124,7,124,4,131,3,125, - 5,124,3,115,148,124,4,100,1,107,2,114,84,116,0,124, - 0,160,2,100,3,161,1,100,1,25,0,131,1,83,0,124, - 0,115,92,124,5,83,0,116,3,124,0,131,1,116,3,124, - 0,160,2,100,3,161,1,100,1,25,0,131,1,24,0,125, - 8,116,4,106,5,124,5,106,6,100,2,116,3,124,5,106, - 6,131,1,124,8,24,0,133,2,25,0,25,0,83,0,116, - 7,124,5,100,4,131,2,114,170,116,8,124,5,124,3,116, - 0,131,3,83,0,124,5,83,0,41,5,97,215,1,0,0, - 73,109,112,111,114,116,32,97,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,84,104,101,32,39,103,108,111,98,97, - 108,115,39,32,97,114,103,117,109,101,110,116,32,105,115,32, - 117,115,101,100,32,116,111,32,105,110,102,101,114,32,119,104, - 101,114,101,32,116,104,101,32,105,109,112,111,114,116,32,105, - 115,32,111,99,99,117,114,114,105,110,103,32,102,114,111,109, - 10,32,32,32,32,116,111,32,104,97,110,100,108,101,32,114, - 101,108,97,116,105,118,101,32,105,109,112,111,114,116,115,46, - 32,84,104,101,32,39,108,111,99,97,108,115,39,32,97,114, - 103,117,109,101,110,116,32,105,115,32,105,103,110,111,114,101, - 100,46,32,84,104,101,10,32,32,32,32,39,102,114,111,109, - 108,105,115,116,39,32,97,114,103,117,109,101,110,116,32,115, - 112,101,99,105,102,105,101,115,32,119,104,97,116,32,115,104, - 111,117,108,100,32,101,120,105,115,116,32,97,115,32,97,116, - 116,114,105,98,117,116,101,115,32,111,110,32,116,104,101,32, - 109,111,100,117,108,101,10,32,32,32,32,98,101,105,110,103, - 32,105,109,112,111,114,116,101,100,32,40,101,46,103,46,32, - 96,96,102,114,111,109,32,109,111,100,117,108,101,32,105,109, - 112,111,114,116,32,60,102,114,111,109,108,105,115,116,62,96, - 96,41,46,32,32,84,104,101,32,39,108,101,118,101,108,39, - 10,32,32,32,32,97,114,103,117,109,101,110,116,32,114,101, - 112,114,101,115,101,110,116,115,32,116,104,101,32,112,97,99, - 107,97,103,101,32,108,111,99,97,116,105,111,110,32,116,111, - 32,105,109,112,111,114,116,32,102,114,111,109,32,105,110,32, - 97,32,114,101,108,97,116,105,118,101,10,32,32,32,32,105, - 109,112,111,114,116,32,40,101,46,103,46,32,96,96,102,114, - 111,109,32,46,46,112,107,103,32,105,109,112,111,114,116,32, - 109,111,100,96,96,32,119,111,117,108,100,32,104,97,118,101, - 32,97,32,39,108,101,118,101,108,39,32,111,102,32,50,41, - 46,10,10,32,32,32,32,114,22,0,0,0,78,114,129,0, - 0,0,114,142,0,0,0,41,9,114,212,0,0,0,114,223, - 0,0,0,218,9,112,97,114,116,105,116,105,111,110,114,188, - 0,0,0,114,15,0,0,0,114,93,0,0,0,114,1,0, - 0,0,114,4,0,0,0,114,217,0,0,0,41,9,114,17, - 0,0,0,114,222,0,0,0,218,6,108,111,99,97,108,115, - 114,218,0,0,0,114,190,0,0,0,114,97,0,0,0,90, - 8,103,108,111,98,97,108,115,95,114,189,0,0,0,90,7, - 99,117,116,95,111,102,102,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,10,95,95,105,109,112,111,114,116, - 95,95,80,4,0,0,115,32,0,0,0,8,11,10,1,16, - 2,8,1,12,1,4,1,8,3,18,1,4,1,4,1,26, - 4,30,3,10,1,12,1,4,2,255,128,114,226,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, - 160,1,124,0,161,1,125,1,124,1,100,0,117,0,114,30, - 116,2,100,1,124,0,23,0,131,1,130,1,116,3,124,1, - 131,1,83,0,41,2,78,122,25,110,111,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,32,110,97,109,101, - 100,32,41,4,114,162,0,0,0,114,170,0,0,0,114,80, - 0,0,0,114,160,0,0,0,41,2,114,17,0,0,0,114, - 96,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,18,95,98,117,105,108,116,105,110,95,102,114, - 111,109,95,110,97,109,101,117,4,0,0,115,10,0,0,0, - 10,1,8,1,12,1,8,1,255,128,114,227,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, - 5,0,0,0,67,0,0,0,115,164,0,0,0,124,1,97, - 0,124,0,97,1,116,2,116,1,131,1,125,2,116,1,106, - 3,160,4,161,0,68,0,93,70,92,2,125,3,125,4,116, - 5,124,4,124,2,131,2,114,26,124,3,116,1,106,6,118, - 0,114,60,116,7,125,5,110,16,116,0,160,8,124,3,161, - 1,114,26,116,9,125,5,110,0,116,10,124,4,124,5,131, - 2,125,6,116,11,124,6,124,4,131,2,1,0,113,26,116, - 1,106,3,116,12,25,0,125,7,100,1,68,0,93,46,125, - 8,124,8,116,1,106,3,118,1,114,136,116,13,124,8,131, - 1,125,9,110,10,116,1,106,3,124,8,25,0,125,9,116, - 14,124,7,124,8,124,9,131,3,1,0,113,112,100,2,83, - 0,41,3,122,250,83,101,116,117,112,32,105,109,112,111,114, - 116,108,105,98,32,98,121,32,105,109,112,111,114,116,105,110, - 103,32,110,101,101,100,101,100,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,115,32,97,110,100,32,105,110, - 106,101,99,116,105,110,103,32,116,104,101,109,10,32,32,32, - 32,105,110,116,111,32,116,104,101,32,103,108,111,98,97,108, - 32,110,97,109,101,115,112,97,99,101,46,10,10,32,32,32, - 32,65,115,32,115,121,115,32,105,115,32,110,101,101,100,101, - 100,32,102,111,114,32,115,121,115,46,109,111,100,117,108,101, - 115,32,97,99,99,101,115,115,32,97,110,100,32,95,105,109, - 112,32,105,115,32,110,101,101,100,101,100,32,116,111,32,108, - 111,97,100,32,98,117,105,108,116,45,105,110,10,32,32,32, - 32,109,111,100,117,108,101,115,44,32,116,104,111,115,101,32, - 116,119,111,32,109,111,100,117,108,101,115,32,109,117,115,116, - 32,98,101,32,101,120,112,108,105,99,105,116,108,121,32,112, - 97,115,115,101,100,32,105,110,46,10,10,32,32,32,32,41, - 3,114,23,0,0,0,114,195,0,0,0,114,65,0,0,0, - 78,41,15,114,58,0,0,0,114,15,0,0,0,114,14,0, - 0,0,114,93,0,0,0,218,5,105,116,101,109,115,114,199, - 0,0,0,114,79,0,0,0,114,162,0,0,0,114,89,0, - 0,0,114,177,0,0,0,114,143,0,0,0,114,149,0,0, - 0,114,1,0,0,0,114,227,0,0,0,114,5,0,0,0, - 41,10,218,10,115,121,115,95,109,111,100,117,108,101,218,11, - 95,105,109,112,95,109,111,100,117,108,101,90,11,109,111,100, - 117,108,101,95,116,121,112,101,114,17,0,0,0,114,97,0, - 0,0,114,110,0,0,0,114,96,0,0,0,90,11,115,101, - 108,102,95,109,111,100,117,108,101,90,12,98,117,105,108,116, - 105,110,95,110,97,109,101,90,14,98,117,105,108,116,105,110, - 95,109,111,100,117,108,101,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,6,95,115,101,116,117,112,124,4, - 0,0,115,38,0,0,0,4,9,4,1,8,3,18,1,10, - 1,10,1,6,1,10,1,6,1,10,3,12,1,10,3,8, - 1,10,1,10,1,10,2,14,1,4,128,255,128,114,231,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 116,0,124,0,124,1,131,2,1,0,116,1,106,2,160,3, - 116,4,161,1,1,0,116,1,106,2,160,3,116,5,161,1, - 1,0,100,1,83,0,41,2,122,48,73,110,115,116,97,108, - 108,32,105,109,112,111,114,116,101,114,115,32,102,111,114,32, - 98,117,105,108,116,105,110,32,97,110,100,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,115,78,41,6,114,231,0, - 0,0,114,15,0,0,0,114,194,0,0,0,114,120,0,0, - 0,114,162,0,0,0,114,177,0,0,0,41,2,114,229,0, - 0,0,114,230,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,95,105,110,115,116,97,108,108, - 159,4,0,0,115,10,0,0,0,10,2,12,2,12,1,4, - 128,255,128,114,232,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, - 0,115,32,0,0,0,100,1,100,2,108,0,125,0,124,0, - 97,1,124,0,160,2,116,3,106,4,116,5,25,0,161,1, - 1,0,100,2,83,0,41,3,122,57,73,110,115,116,97,108, - 108,32,105,109,112,111,114,116,101,114,115,32,116,104,97,116, - 32,114,101,113,117,105,114,101,32,101,120,116,101,114,110,97, - 108,32,102,105,108,101,115,121,115,116,101,109,32,97,99,99, - 101,115,115,114,22,0,0,0,78,41,6,218,26,95,102,114, - 111,122,101,110,95,105,109,112,111,114,116,108,105,98,95,101, - 120,116,101,114,110,97,108,114,127,0,0,0,114,232,0,0, - 0,114,15,0,0,0,114,93,0,0,0,114,1,0,0,0, - 41,1,114,233,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,27,95,105,110,115,116,97,108,108, - 95,101,120,116,101,114,110,97,108,95,105,109,112,111,114,116, - 101,114,115,167,4,0,0,115,10,0,0,0,8,3,4,1, - 16,1,4,128,255,128,114,234,0,0,0,41,2,78,78,41, - 1,78,41,2,78,114,22,0,0,0,41,4,78,78,114,10, - 0,0,0,114,22,0,0,0,41,53,114,3,0,0,0,114, - 23,0,0,0,114,195,0,0,0,114,65,0,0,0,114,127, - 0,0,0,114,12,0,0,0,114,18,0,0,0,114,60,0, - 0,0,114,34,0,0,0,114,44,0,0,0,114,19,0,0, - 0,114,20,0,0,0,114,50,0,0,0,114,51,0,0,0, - 114,54,0,0,0,114,66,0,0,0,114,68,0,0,0,114, - 77,0,0,0,114,87,0,0,0,114,91,0,0,0,114,98, - 0,0,0,114,112,0,0,0,114,113,0,0,0,114,92,0, - 0,0,114,143,0,0,0,114,149,0,0,0,114,153,0,0, - 0,114,108,0,0,0,114,94,0,0,0,114,159,0,0,0, - 114,160,0,0,0,114,95,0,0,0,114,162,0,0,0,114, - 177,0,0,0,114,182,0,0,0,114,191,0,0,0,114,193, - 0,0,0,114,198,0,0,0,114,204,0,0,0,90,15,95, - 69,82,82,95,77,83,71,95,80,82,69,70,73,88,114,206, - 0,0,0,114,209,0,0,0,218,6,111,98,106,101,99,116, - 114,210,0,0,0,114,211,0,0,0,114,212,0,0,0,114, - 217,0,0,0,114,223,0,0,0,114,226,0,0,0,114,227, - 0,0,0,114,231,0,0,0,114,232,0,0,0,114,234,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,60,109,111,100,117,108,101,62, - 1,0,0,0,115,106,0,0,0,4,0,4,25,4,1,4, - 1,4,3,8,3,8,8,4,8,4,2,16,3,14,4,14, - 77,14,21,8,16,8,37,8,17,14,11,8,8,8,11,8, - 12,8,16,14,36,16,101,10,26,14,45,8,72,8,17,8, - 17,8,30,8,37,8,42,14,15,14,75,14,79,8,13,8, - 9,10,9,8,47,4,16,8,1,8,2,6,32,8,3,10, - 16,14,15,8,37,10,27,8,37,8,7,8,35,8,8,4, - 128,255,128, + 218,13,95,115,97,110,105,116,121,95,99,104,101,99,107,187, + 3,0,0,115,26,0,0,0,10,2,18,1,8,1,8,1, + 8,1,10,1,8,1,4,1,8,1,12,2,8,1,8,255, + 255,128,114,204,0,0,0,122,16,78,111,32,109,111,100,117, + 108,101,32,110,97,109,101,100,32,122,4,123,33,114,125,99, + 2,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, + 8,0,0,0,67,0,0,0,115,20,1,0,0,100,0,125, + 2,124,0,160,0,100,1,161,1,100,2,25,0,125,3,124, + 3,114,128,124,3,116,1,106,2,118,1,114,42,116,3,124, + 1,124,3,131,2,1,0,124,0,116,1,106,2,118,0,114, + 62,116,1,106,2,124,0,25,0,83,0,116,1,106,2,124, + 3,25,0,125,4,122,10,124,4,106,4,125,2,87,0,110, + 44,4,0,116,5,121,126,1,0,1,0,1,0,116,6,100, + 3,23,0,160,7,124,0,124,3,161,2,125,5,116,8,124, + 5,124,0,100,4,141,2,100,0,130,2,48,0,116,9,124, + 0,124,2,131,2,125,6,124,6,100,0,117,0,114,164,116, + 8,116,6,160,7,124,0,161,1,124,0,100,4,141,2,130, + 1,116,10,124,6,131,1,125,7,124,3,144,1,114,16,116, + 1,106,2,124,3,25,0,125,4,124,0,160,0,100,1,161, + 1,100,5,25,0,125,8,122,18,116,11,124,4,124,8,124, + 7,131,3,1,0,87,0,124,7,83,0,4,0,116,5,144, + 1,121,14,1,0,1,0,1,0,100,6,124,3,155,2,100, + 7,124,8,155,2,157,4,125,5,116,12,160,13,124,5,116, + 14,161,2,1,0,89,0,124,7,83,0,48,0,124,7,83, + 0,41,8,78,114,129,0,0,0,114,22,0,0,0,122,23, + 59,32,123,33,114,125,32,105,115,32,110,111,116,32,97,32, + 112,97,99,107,97,103,101,114,16,0,0,0,233,2,0,0, + 0,122,27,67,97,110,110,111,116,32,115,101,116,32,97,110, + 32,97,116,116,114,105,98,117,116,101,32,111,110,32,122,18, + 32,102,111,114,32,99,104,105,108,100,32,109,111,100,117,108, + 101,32,41,15,114,130,0,0,0,114,15,0,0,0,114,93, + 0,0,0,114,68,0,0,0,114,142,0,0,0,114,107,0, + 0,0,218,8,95,69,82,82,95,77,83,71,114,46,0,0, + 0,218,19,77,111,100,117,108,101,78,111,116,70,111,117,110, + 100,69,114,114,111,114,114,198,0,0,0,114,160,0,0,0, + 114,5,0,0,0,114,195,0,0,0,114,196,0,0,0,114, + 197,0,0,0,41,9,114,17,0,0,0,218,7,105,109,112, + 111,114,116,95,114,168,0,0,0,114,131,0,0,0,90,13, + 112,97,114,101,110,116,95,109,111,100,117,108,101,114,158,0, + 0,0,114,96,0,0,0,114,97,0,0,0,90,5,99,104, + 105,108,100,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,23,95,102,105,110,100,95,97,110,100,95,108,111, + 97,100,95,117,110,108,111,99,107,101,100,206,3,0,0,115, + 60,0,0,0,4,1,14,1,4,1,10,1,10,1,10,2, + 10,1,10,1,2,1,10,1,12,1,16,1,16,1,10,1, + 8,1,18,1,8,2,6,1,10,2,14,1,2,1,14,1, + 4,4,14,253,16,1,14,1,4,1,2,255,4,1,255,128, + 114,209,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,8,0,0,0,67,0,0,0,115,128, + 0,0,0,116,0,124,0,131,1,143,62,1,0,116,1,106, + 2,160,3,124,0,116,4,161,2,125,2,124,2,116,4,117, + 0,114,56,116,5,124,0,124,1,131,2,87,0,2,0,100, + 1,4,0,4,0,131,3,1,0,83,0,87,0,100,1,4, + 0,4,0,131,3,1,0,110,16,49,0,115,76,48,0,1, + 0,1,0,1,0,89,0,1,0,124,2,100,1,117,0,114, + 116,100,2,160,6,124,0,161,1,125,3,116,7,124,3,124, + 0,100,3,141,2,130,1,116,8,124,0,131,1,1,0,124, + 2,83,0,41,4,122,25,70,105,110,100,32,97,110,100,32, + 108,111,97,100,32,116,104,101,32,109,111,100,117,108,101,46, + 78,122,40,105,109,112,111,114,116,32,111,102,32,123,125,32, + 104,97,108,116,101,100,59,32,78,111,110,101,32,105,110,32, + 115,121,115,46,109,111,100,117,108,101,115,114,16,0,0,0, + 41,9,114,51,0,0,0,114,15,0,0,0,114,93,0,0, + 0,114,35,0,0,0,218,14,95,78,69,69,68,83,95,76, + 79,65,68,73,78,71,114,209,0,0,0,114,46,0,0,0, + 114,207,0,0,0,114,66,0,0,0,41,4,114,17,0,0, + 0,114,208,0,0,0,114,97,0,0,0,114,76,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 14,95,102,105,110,100,95,97,110,100,95,108,111,97,100,241, + 3,0,0,115,24,0,0,0,10,2,14,1,8,1,54,1, + 8,2,4,1,2,1,4,255,12,2,8,2,4,1,255,128, + 114,211,0,0,0,114,22,0,0,0,99,3,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,67, + 0,0,0,115,42,0,0,0,116,0,124,0,124,1,124,2, + 131,3,1,0,124,2,100,1,107,4,114,32,116,1,124,0, + 124,1,124,2,131,3,125,0,116,2,124,0,116,3,131,2, + 83,0,41,3,97,50,1,0,0,73,109,112,111,114,116,32, + 97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,109, + 111,100,117,108,101,32,98,97,115,101,100,32,111,110,32,105, + 116,115,32,110,97,109,101,44,32,116,104,101,32,112,97,99, + 107,97,103,101,32,116,104,101,32,99,97,108,108,32,105,115, + 10,32,32,32,32,98,101,105,110,103,32,109,97,100,101,32, + 102,114,111,109,44,32,97,110,100,32,116,104,101,32,108,101, + 118,101,108,32,97,100,106,117,115,116,109,101,110,116,46,10, + 10,32,32,32,32,84,104,105,115,32,102,117,110,99,116,105, + 111,110,32,114,101,112,114,101,115,101,110,116,115,32,116,104, + 101,32,103,114,101,97,116,101,115,116,32,99,111,109,109,111, + 110,32,100,101,110,111,109,105,110,97,116,111,114,32,111,102, + 32,102,117,110,99,116,105,111,110,97,108,105,116,121,10,32, + 32,32,32,98,101,116,119,101,101,110,32,105,109,112,111,114, + 116,95,109,111,100,117,108,101,32,97,110,100,32,95,95,105, + 109,112,111,114,116,95,95,46,32,84,104,105,115,32,105,110, + 99,108,117,100,101,115,32,115,101,116,116,105,110,103,32,95, + 95,112,97,99,107,97,103,101,95,95,32,105,102,10,32,32, + 32,32,116,104,101,32,108,111,97,100,101,114,32,100,105,100, + 32,110,111,116,46,10,10,32,32,32,32,114,22,0,0,0, + 78,41,4,114,204,0,0,0,114,191,0,0,0,114,211,0, + 0,0,218,11,95,103,99,100,95,105,109,112,111,114,116,114, + 203,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,212,0,0,0,1,4,0,0,115,10,0,0, + 0,12,9,8,1,12,1,10,1,255,128,114,212,0,0,0, + 169,1,218,9,114,101,99,117,114,115,105,118,101,99,3,0, + 0,0,0,0,0,0,1,0,0,0,8,0,0,0,11,0, + 0,0,67,0,0,0,115,216,0,0,0,124,1,68,0,93, + 204,125,4,116,0,124,4,116,1,131,2,115,64,124,3,114, + 34,124,0,106,2,100,1,23,0,125,5,110,4,100,2,125, + 5,116,3,100,3,124,5,155,0,100,4,116,4,124,4,131, + 1,106,2,155,0,157,4,131,1,130,1,124,4,100,5,107, + 2,114,106,124,3,115,4,116,5,124,0,100,6,131,2,114, + 4,116,6,124,0,124,0,106,7,124,2,100,7,100,8,141, + 4,1,0,113,4,116,5,124,0,124,4,131,2,115,4,100, + 9,160,8,124,0,106,2,124,4,161,2,125,6,122,14,116, + 9,124,2,124,6,131,2,1,0,87,0,113,4,4,0,116, + 10,121,214,1,0,125,7,1,0,122,42,124,7,106,11,124, + 6,107,2,114,200,116,12,106,13,160,14,124,6,116,15,161, + 2,100,10,117,1,114,200,87,0,89,0,100,10,125,7,126, + 7,113,4,130,0,100,10,125,7,126,7,48,0,124,0,83, + 0,48,0,41,11,122,238,70,105,103,117,114,101,32,111,117, + 116,32,119,104,97,116,32,95,95,105,109,112,111,114,116,95, + 95,32,115,104,111,117,108,100,32,114,101,116,117,114,110,46, + 10,10,32,32,32,32,84,104,101,32,105,109,112,111,114,116, + 95,32,112,97,114,97,109,101,116,101,114,32,105,115,32,97, + 32,99,97,108,108,97,98,108,101,32,119,104,105,99,104,32, + 116,97,107,101,115,32,116,104,101,32,110,97,109,101,32,111, + 102,32,109,111,100,117,108,101,32,116,111,10,32,32,32,32, + 105,109,112,111,114,116,46,32,73,116,32,105,115,32,114,101, + 113,117,105,114,101,100,32,116,111,32,100,101,99,111,117,112, + 108,101,32,116,104,101,32,102,117,110,99,116,105,111,110,32, + 102,114,111,109,32,97,115,115,117,109,105,110,103,32,105,109, + 112,111,114,116,108,105,98,39,115,10,32,32,32,32,105,109, + 112,111,114,116,32,105,109,112,108,101,109,101,110,116,97,116, + 105,111,110,32,105,115,32,100,101,115,105,114,101,100,46,10, + 10,32,32,32,32,122,8,46,95,95,97,108,108,95,95,122, + 13,96,96,102,114,111,109,32,108,105,115,116,39,39,122,8, + 73,116,101,109,32,105,110,32,122,18,32,109,117,115,116,32, + 98,101,32,115,116,114,44,32,110,111,116,32,250,1,42,218, + 7,95,95,97,108,108,95,95,84,114,213,0,0,0,114,186, + 0,0,0,78,41,16,114,199,0,0,0,114,200,0,0,0, + 114,1,0,0,0,114,201,0,0,0,114,14,0,0,0,114, + 4,0,0,0,218,16,95,104,97,110,100,108,101,95,102,114, + 111,109,108,105,115,116,114,216,0,0,0,114,46,0,0,0, + 114,68,0,0,0,114,207,0,0,0,114,17,0,0,0,114, + 15,0,0,0,114,93,0,0,0,114,35,0,0,0,114,210, + 0,0,0,41,8,114,97,0,0,0,218,8,102,114,111,109, + 108,105,115,116,114,208,0,0,0,114,214,0,0,0,218,1, + 120,90,5,119,104,101,114,101,90,9,102,114,111,109,95,110, + 97,109,101,90,3,101,120,99,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,217,0,0,0,16,4,0,0, + 115,54,0,0,0,8,10,10,1,4,1,12,1,4,2,10, + 1,8,1,8,255,8,2,14,1,10,1,2,1,8,255,10, + 2,14,1,2,1,14,1,14,1,10,4,16,1,2,255,12, + 2,2,1,8,128,4,1,2,248,255,128,114,217,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,6,0,0,0,67,0,0,0,115,146,0,0,0,124,0, + 160,0,100,1,161,1,125,1,124,0,160,0,100,2,161,1, + 125,2,124,1,100,3,117,1,114,82,124,2,100,3,117,1, + 114,78,124,1,124,2,106,1,107,3,114,78,116,2,106,3, + 100,4,124,1,155,2,100,5,124,2,106,1,155,2,100,6, + 157,5,116,4,100,7,100,8,141,3,1,0,124,1,83,0, + 124,2,100,3,117,1,114,96,124,2,106,1,83,0,116,2, + 106,3,100,9,116,4,100,7,100,8,141,3,1,0,124,0, + 100,10,25,0,125,1,100,11,124,0,118,1,114,142,124,1, + 160,5,100,12,161,1,100,13,25,0,125,1,124,1,83,0, + 41,14,122,167,67,97,108,99,117,108,97,116,101,32,119,104, + 97,116,32,95,95,112,97,99,107,97,103,101,95,95,32,115, + 104,111,117,108,100,32,98,101,46,10,10,32,32,32,32,95, + 95,112,97,99,107,97,103,101,95,95,32,105,115,32,110,111, + 116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32, + 98,101,32,100,101,102,105,110,101,100,32,111,114,32,99,111, + 117,108,100,32,98,101,32,115,101,116,32,116,111,32,78,111, + 110,101,10,32,32,32,32,116,111,32,114,101,112,114,101,115, + 101,110,116,32,116,104,97,116,32,105,116,115,32,112,114,111, + 112,101,114,32,118,97,108,117,101,32,105,115,32,117,110,107, + 110,111,119,110,46,10,10,32,32,32,32,114,146,0,0,0, + 114,106,0,0,0,78,122,32,95,95,112,97,99,107,97,103, + 101,95,95,32,33,61,32,95,95,115,112,101,99,95,95,46, + 112,97,114,101,110,116,32,40,122,4,32,33,61,32,250,1, + 41,233,3,0,0,0,41,1,90,10,115,116,97,99,107,108, + 101,118,101,108,122,89,99,97,110,39,116,32,114,101,115,111, + 108,118,101,32,112,97,99,107,97,103,101,32,102,114,111,109, + 32,95,95,115,112,101,99,95,95,32,111,114,32,95,95,112, + 97,99,107,97,103,101,95,95,44,32,102,97,108,108,105,110, + 103,32,98,97,99,107,32,111,110,32,95,95,110,97,109,101, + 95,95,32,97,110,100,32,95,95,112,97,116,104,95,95,114, + 1,0,0,0,114,142,0,0,0,114,129,0,0,0,114,22, + 0,0,0,41,6,114,35,0,0,0,114,131,0,0,0,114, + 195,0,0,0,114,196,0,0,0,114,197,0,0,0,114,130, + 0,0,0,41,3,218,7,103,108,111,98,97,108,115,114,189, + 0,0,0,114,96,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,17,95,99,97,108,99,95,95, + 95,112,97,99,107,97,103,101,95,95,53,4,0,0,115,44, + 0,0,0,10,7,10,1,8,1,18,1,6,1,2,1,4, + 255,4,1,6,255,4,2,6,254,4,3,8,1,6,1,6, + 2,4,2,6,254,8,3,8,1,14,1,4,1,255,128,114, + 223,0,0,0,114,10,0,0,0,99,5,0,0,0,0,0, + 0,0,0,0,0,0,9,0,0,0,5,0,0,0,67,0, + 0,0,115,174,0,0,0,124,4,100,1,107,2,114,18,116, + 0,124,0,131,1,125,5,110,36,124,1,100,2,117,1,114, + 30,124,1,110,2,105,0,125,6,116,1,124,6,131,1,125, + 7,116,0,124,0,124,7,124,4,131,3,125,5,124,3,115, + 148,124,4,100,1,107,2,114,84,116,0,124,0,160,2,100, + 3,161,1,100,1,25,0,131,1,83,0,124,0,115,92,124, + 5,83,0,116,3,124,0,131,1,116,3,124,0,160,2,100, + 3,161,1,100,1,25,0,131,1,24,0,125,8,116,4,106, + 5,124,5,106,6,100,2,116,3,124,5,106,6,131,1,124, + 8,24,0,133,2,25,0,25,0,83,0,116,7,124,5,100, + 4,131,2,114,170,116,8,124,5,124,3,116,0,131,3,83, + 0,124,5,83,0,41,5,97,215,1,0,0,73,109,112,111, + 114,116,32,97,32,109,111,100,117,108,101,46,10,10,32,32, + 32,32,84,104,101,32,39,103,108,111,98,97,108,115,39,32, + 97,114,103,117,109,101,110,116,32,105,115,32,117,115,101,100, + 32,116,111,32,105,110,102,101,114,32,119,104,101,114,101,32, + 116,104,101,32,105,109,112,111,114,116,32,105,115,32,111,99, + 99,117,114,114,105,110,103,32,102,114,111,109,10,32,32,32, + 32,116,111,32,104,97,110,100,108,101,32,114,101,108,97,116, + 105,118,101,32,105,109,112,111,114,116,115,46,32,84,104,101, + 32,39,108,111,99,97,108,115,39,32,97,114,103,117,109,101, + 110,116,32,105,115,32,105,103,110,111,114,101,100,46,32,84, + 104,101,10,32,32,32,32,39,102,114,111,109,108,105,115,116, + 39,32,97,114,103,117,109,101,110,116,32,115,112,101,99,105, + 102,105,101,115,32,119,104,97,116,32,115,104,111,117,108,100, + 32,101,120,105,115,116,32,97,115,32,97,116,116,114,105,98, + 117,116,101,115,32,111,110,32,116,104,101,32,109,111,100,117, + 108,101,10,32,32,32,32,98,101,105,110,103,32,105,109,112, + 111,114,116,101,100,32,40,101,46,103,46,32,96,96,102,114, + 111,109,32,109,111,100,117,108,101,32,105,109,112,111,114,116, + 32,60,102,114,111,109,108,105,115,116,62,96,96,41,46,32, + 32,84,104,101,32,39,108,101,118,101,108,39,10,32,32,32, + 32,97,114,103,117,109,101,110,116,32,114,101,112,114,101,115, + 101,110,116,115,32,116,104,101,32,112,97,99,107,97,103,101, + 32,108,111,99,97,116,105,111,110,32,116,111,32,105,109,112, + 111,114,116,32,102,114,111,109,32,105,110,32,97,32,114,101, + 108,97,116,105,118,101,10,32,32,32,32,105,109,112,111,114, + 116,32,40,101,46,103,46,32,96,96,102,114,111,109,32,46, + 46,112,107,103,32,105,109,112,111,114,116,32,109,111,100,96, + 96,32,119,111,117,108,100,32,104,97,118,101,32,97,32,39, + 108,101,118,101,108,39,32,111,102,32,50,41,46,10,10,32, + 32,32,32,114,22,0,0,0,78,114,129,0,0,0,114,142, + 0,0,0,41,9,114,212,0,0,0,114,223,0,0,0,218, + 9,112,97,114,116,105,116,105,111,110,114,188,0,0,0,114, + 15,0,0,0,114,93,0,0,0,114,1,0,0,0,114,4, + 0,0,0,114,217,0,0,0,41,9,114,17,0,0,0,114, + 222,0,0,0,218,6,108,111,99,97,108,115,114,218,0,0, + 0,114,190,0,0,0,114,97,0,0,0,90,8,103,108,111, + 98,97,108,115,95,114,189,0,0,0,90,7,99,117,116,95, + 111,102,102,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,10,95,95,105,109,112,111,114,116,95,95,80,4, + 0,0,115,32,0,0,0,8,11,10,1,16,2,8,1,12, + 1,4,1,8,3,18,1,4,1,4,1,26,4,30,3,10, + 1,12,1,4,2,255,128,114,226,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,67,0,0,0,115,38,0,0,0,116,0,160,1,124,0, + 161,1,125,1,124,1,100,0,117,0,114,30,116,2,100,1, + 124,0,23,0,131,1,130,1,116,3,124,1,131,1,83,0, + 41,2,78,122,25,110,111,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,32,110,97,109,101,100,32,41,4, + 114,162,0,0,0,114,170,0,0,0,114,80,0,0,0,114, + 160,0,0,0,41,2,114,17,0,0,0,114,96,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 18,95,98,117,105,108,116,105,110,95,102,114,111,109,95,110, + 97,109,101,117,4,0,0,115,10,0,0,0,10,1,8,1, + 12,1,8,1,255,128,114,227,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,10,0,0,0,5,0,0,0, + 67,0,0,0,115,164,0,0,0,124,1,97,0,124,0,97, + 1,116,2,116,1,131,1,125,2,116,1,106,3,160,4,161, + 0,68,0,93,70,92,2,125,3,125,4,116,5,124,4,124, + 2,131,2,114,26,124,3,116,1,106,6,118,0,114,60,116, + 7,125,5,110,16,116,0,160,8,124,3,161,1,114,26,116, + 9,125,5,110,0,116,10,124,4,124,5,131,2,125,6,116, + 11,124,6,124,4,131,2,1,0,113,26,116,1,106,3,116, + 12,25,0,125,7,100,1,68,0,93,46,125,8,124,8,116, + 1,106,3,118,1,114,136,116,13,124,8,131,1,125,9,110, + 10,116,1,106,3,124,8,25,0,125,9,116,14,124,7,124, + 8,124,9,131,3,1,0,113,112,100,2,83,0,41,3,122, + 250,83,101,116,117,112,32,105,109,112,111,114,116,108,105,98, + 32,98,121,32,105,109,112,111,114,116,105,110,103,32,110,101, + 101,100,101,100,32,98,117,105,108,116,45,105,110,32,109,111, + 100,117,108,101,115,32,97,110,100,32,105,110,106,101,99,116, + 105,110,103,32,116,104,101,109,10,32,32,32,32,105,110,116, + 111,32,116,104,101,32,103,108,111,98,97,108,32,110,97,109, + 101,115,112,97,99,101,46,10,10,32,32,32,32,65,115,32, + 115,121,115,32,105,115,32,110,101,101,100,101,100,32,102,111, + 114,32,115,121,115,46,109,111,100,117,108,101,115,32,97,99, + 99,101,115,115,32,97,110,100,32,95,105,109,112,32,105,115, + 32,110,101,101,100,101,100,32,116,111,32,108,111,97,100,32, + 98,117,105,108,116,45,105,110,10,32,32,32,32,109,111,100, + 117,108,101,115,44,32,116,104,111,115,101,32,116,119,111,32, + 109,111,100,117,108,101,115,32,109,117,115,116,32,98,101,32, + 101,120,112,108,105,99,105,116,108,121,32,112,97,115,115,101, + 100,32,105,110,46,10,10,32,32,32,32,41,3,114,23,0, + 0,0,114,195,0,0,0,114,65,0,0,0,78,41,15,114, + 58,0,0,0,114,15,0,0,0,114,14,0,0,0,114,93, + 0,0,0,218,5,105,116,101,109,115,114,199,0,0,0,114, + 79,0,0,0,114,162,0,0,0,114,89,0,0,0,114,177, + 0,0,0,114,143,0,0,0,114,149,0,0,0,114,1,0, + 0,0,114,227,0,0,0,114,5,0,0,0,41,10,218,10, + 115,121,115,95,109,111,100,117,108,101,218,11,95,105,109,112, + 95,109,111,100,117,108,101,90,11,109,111,100,117,108,101,95, + 116,121,112,101,114,17,0,0,0,114,97,0,0,0,114,110, + 0,0,0,114,96,0,0,0,90,11,115,101,108,102,95,109, + 111,100,117,108,101,90,12,98,117,105,108,116,105,110,95,110, + 97,109,101,90,14,98,117,105,108,116,105,110,95,109,111,100, + 117,108,101,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,6,95,115,101,116,117,112,124,4,0,0,115,38, + 0,0,0,4,9,4,1,8,3,18,1,10,1,10,1,6, + 1,10,1,6,1,10,3,12,1,10,3,8,1,10,1,10, + 1,10,2,14,1,4,251,255,128,114,231,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,67,0,0,0,115,38,0,0,0,116,0,124,0, + 124,1,131,2,1,0,116,1,106,2,160,3,116,4,161,1, + 1,0,116,1,106,2,160,3,116,5,161,1,1,0,100,1, + 83,0,41,2,122,48,73,110,115,116,97,108,108,32,105,109, + 112,111,114,116,101,114,115,32,102,111,114,32,98,117,105,108, + 116,105,110,32,97,110,100,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,115,78,41,6,114,231,0,0,0,114,15, + 0,0,0,114,194,0,0,0,114,120,0,0,0,114,162,0, + 0,0,114,177,0,0,0,41,2,114,229,0,0,0,114,230, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,8,95,105,110,115,116,97,108,108,159,4,0,0, + 115,8,0,0,0,10,2,12,2,16,1,255,128,114,232,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,4,0,0,0,67,0,0,0,115,32,0,0,0, + 100,1,100,2,108,0,125,0,124,0,97,1,124,0,160,2, + 116,3,106,4,116,5,25,0,161,1,1,0,100,2,83,0, + 41,3,122,57,73,110,115,116,97,108,108,32,105,109,112,111, + 114,116,101,114,115,32,116,104,97,116,32,114,101,113,117,105, + 114,101,32,101,120,116,101,114,110,97,108,32,102,105,108,101, + 115,121,115,116,101,109,32,97,99,99,101,115,115,114,22,0, + 0,0,78,41,6,218,26,95,102,114,111,122,101,110,95,105, + 109,112,111,114,116,108,105,98,95,101,120,116,101,114,110,97, + 108,114,127,0,0,0,114,232,0,0,0,114,15,0,0,0, + 114,93,0,0,0,114,1,0,0,0,41,1,114,233,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,27,95,105,110,115,116,97,108,108,95,101,120,116,101,114, + 110,97,108,95,105,109,112,111,114,116,101,114,115,167,4,0, + 0,115,8,0,0,0,8,3,4,1,20,1,255,128,114,234, + 0,0,0,41,2,78,78,41,1,78,41,2,78,114,22,0, + 0,0,41,4,78,78,114,10,0,0,0,114,22,0,0,0, + 41,53,114,3,0,0,0,114,23,0,0,0,114,195,0,0, + 0,114,65,0,0,0,114,127,0,0,0,114,12,0,0,0, + 114,18,0,0,0,114,60,0,0,0,114,34,0,0,0,114, + 44,0,0,0,114,19,0,0,0,114,20,0,0,0,114,50, + 0,0,0,114,51,0,0,0,114,54,0,0,0,114,66,0, + 0,0,114,68,0,0,0,114,77,0,0,0,114,87,0,0, + 0,114,91,0,0,0,114,98,0,0,0,114,112,0,0,0, + 114,113,0,0,0,114,92,0,0,0,114,143,0,0,0,114, + 149,0,0,0,114,153,0,0,0,114,108,0,0,0,114,94, + 0,0,0,114,159,0,0,0,114,160,0,0,0,114,95,0, + 0,0,114,162,0,0,0,114,177,0,0,0,114,182,0,0, + 0,114,191,0,0,0,114,193,0,0,0,114,198,0,0,0, + 114,204,0,0,0,90,15,95,69,82,82,95,77,83,71,95, + 80,82,69,70,73,88,114,206,0,0,0,114,209,0,0,0, + 218,6,111,98,106,101,99,116,114,210,0,0,0,114,211,0, + 0,0,114,212,0,0,0,114,217,0,0,0,114,223,0,0, + 0,114,226,0,0,0,114,227,0,0,0,114,231,0,0,0, + 114,232,0,0,0,114,234,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, + 60,109,111,100,117,108,101,62,1,0,0,0,115,104,0,0, + 0,4,0,4,25,4,1,4,1,4,3,8,3,8,8,4, + 8,4,2,16,3,14,4,14,77,14,21,8,16,8,37,8, + 17,14,11,8,8,8,11,8,12,8,16,14,36,16,101,10, + 26,14,45,8,72,8,17,8,17,8,30,8,37,8,42,14, + 15,14,75,14,79,8,13,8,9,10,9,8,47,4,16,8, + 1,8,2,6,32,8,3,10,16,14,15,8,37,10,27,8, + 37,8,7,8,35,12,8,255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index de4db360b06064..c459bcf2e90c44 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -79,1900 +79,1899 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 169,0,114,7,0,0,0,250,38,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,95,101,120,116,101,114,110,97,108,62,218, - 9,60,103,101,110,101,120,112,114,62,46,0,0,0,115,6, - 0,0,0,22,0,4,128,255,128,114,9,0,0,0,218,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,4,0,0,0,67,0,0,0,115,22,0,0,0,104,0, - 124,0,93,14,125,1,100,0,124,1,155,0,157,2,146,2, - 113,4,83,0,41,1,250,1,58,114,7,0,0,0,41,2, - 114,5,0,0,0,218,1,115,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,9,60,115,101,116,99,111,109, - 112,62,49,0,0,0,115,4,0,0,0,22,0,255,128,114, - 13,0,0,0,41,1,218,3,119,105,110,41,2,90,6,99, - 121,103,119,105,110,90,6,100,97,114,119,105,110,99,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, - 0,0,3,0,0,0,115,62,0,0,0,116,0,106,1,160, - 2,116,3,161,1,114,50,116,0,106,1,160,2,116,4,161, - 1,114,30,100,1,137,0,110,4,100,2,137,0,135,0,102, - 1,100,3,100,4,132,8,125,0,124,0,83,0,100,5,100, - 4,132,0,125,0,124,0,83,0,41,6,78,90,12,80,89, - 84,72,79,78,67,65,83,69,79,75,115,12,0,0,0,80, - 89,84,72,79,78,67,65,83,69,79,75,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 19,0,0,0,115,20,0,0,0,116,0,106,1,106,2,12, - 0,111,18,136,0,116,3,106,4,118,0,83,0,41,2,122, - 94,84,114,117,101,32,105,102,32,102,105,108,101,110,97,109, - 101,115,32,109,117,115,116,32,98,101,32,99,104,101,99,107, - 101,100,32,99,97,115,101,45,105,110,115,101,110,115,105,116, - 105,118,101,108,121,32,97,110,100,32,105,103,110,111,114,101, - 32,101,110,118,105,114,111,110,109,101,110,116,32,102,108,97, - 103,115,32,97,114,101,32,110,111,116,32,115,101,116,46,78, - 41,5,218,3,115,121,115,218,5,102,108,97,103,115,218,18, - 105,103,110,111,114,101,95,101,110,118,105,114,111,110,109,101, - 110,116,218,3,95,111,115,90,7,101,110,118,105,114,111,110, - 114,7,0,0,0,169,1,218,3,107,101,121,114,7,0,0, - 0,114,8,0,0,0,218,11,95,114,101,108,97,120,95,99, - 97,115,101,66,0,0,0,115,4,0,0,0,20,2,255,128, - 122,37,95,109,97,107,101,95,114,101,108,97,120,95,99,97, - 115,101,46,60,108,111,99,97,108,115,62,46,95,114,101,108, - 97,120,95,99,97,115,101,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,83,0,0,0, - 115,4,0,0,0,100,1,83,0,41,3,122,53,84,114,117, - 101,32,105,102,32,102,105,108,101,110,97,109,101,115,32,109, - 117,115,116,32,98,101,32,99,104,101,99,107,101,100,32,99, - 97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,108, - 121,46,70,78,114,7,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,21,0, - 0,0,70,0,0,0,115,4,0,0,0,4,2,255,128,41, - 5,114,15,0,0,0,218,8,112,108,97,116,102,111,114,109, - 218,10,115,116,97,114,116,115,119,105,116,104,218,27,95,67, - 65,83,69,95,73,78,83,69,78,83,73,84,73,86,69,95, - 80,76,65,84,70,79,82,77,83,218,35,95,67,65,83,69, - 95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,65, - 84,70,79,82,77,83,95,83,84,82,95,75,69,89,41,1, - 114,21,0,0,0,114,7,0,0,0,114,19,0,0,0,114, - 8,0,0,0,218,16,95,109,97,107,101,95,114,101,108,97, - 120,95,99,97,115,101,59,0,0,0,115,18,0,0,0,12, - 1,12,1,6,1,4,2,12,2,4,7,8,253,4,3,255, - 128,114,26,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, - 20,0,0,0,116,0,124,0,131,1,100,1,64,0,160,1, - 100,2,100,3,161,2,83,0,41,5,122,42,67,111,110,118, - 101,114,116,32,97,32,51,50,45,98,105,116,32,105,110,116, - 101,103,101,114,32,116,111,32,108,105,116,116,108,101,45,101, - 110,100,105,97,110,46,236,3,0,0,0,255,127,255,127,3, - 0,233,4,0,0,0,218,6,108,105,116,116,108,101,78,41, - 2,218,3,105,110,116,218,8,116,111,95,98,121,116,101,115, - 41,1,218,1,120,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,12,95,112,97,99,107,95,117,105,110,116, - 51,50,78,0,0,0,115,4,0,0,0,20,2,255,128,114, - 33,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,4,0,0,0,67,0,0,0,115,28,0, - 0,0,116,0,124,0,131,1,100,1,107,2,115,16,74,0, - 130,1,116,1,160,2,124,0,100,2,161,2,83,0,41,4, - 122,47,67,111,110,118,101,114,116,32,52,32,98,121,116,101, - 115,32,105,110,32,108,105,116,116,108,101,45,101,110,100,105, - 97,110,32,116,111,32,97,110,32,105,110,116,101,103,101,114, - 46,114,28,0,0,0,114,29,0,0,0,78,169,3,114,4, - 0,0,0,114,30,0,0,0,218,10,102,114,111,109,95,98, - 121,116,101,115,169,1,218,4,100,97,116,97,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,14,95,117,110, - 112,97,99,107,95,117,105,110,116,51,50,83,0,0,0,115, - 6,0,0,0,16,2,12,1,255,128,114,38,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 4,0,0,0,67,0,0,0,115,28,0,0,0,116,0,124, - 0,131,1,100,1,107,2,115,16,74,0,130,1,116,1,160, - 2,124,0,100,2,161,2,83,0,41,4,122,47,67,111,110, - 118,101,114,116,32,50,32,98,121,116,101,115,32,105,110,32, - 108,105,116,116,108,101,45,101,110,100,105,97,110,32,116,111, - 32,97,110,32,105,110,116,101,103,101,114,46,233,2,0,0, - 0,114,29,0,0,0,78,114,34,0,0,0,114,36,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,14,95,117,110,112,97,99,107,95,117,105,110,116,49,54, - 88,0,0,0,115,6,0,0,0,16,2,12,1,255,128,114, - 40,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,4,0,0,0,71,0,0,0,115,20,0, - 0,0,116,0,160,1,100,1,100,2,132,0,124,0,68,0, - 131,1,161,1,83,0,41,4,122,31,82,101,112,108,97,99, - 101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,116, - 104,46,106,111,105,110,40,41,46,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,5,0,0,0,83,0, - 0,0,115,26,0,0,0,103,0,124,0,93,18,125,1,124, - 1,114,4,124,1,160,0,116,1,161,1,145,2,113,4,83, - 0,114,7,0,0,0,41,2,218,6,114,115,116,114,105,112, - 218,15,112,97,116,104,95,115,101,112,97,114,97,116,111,114, - 115,41,2,114,5,0,0,0,218,4,112,97,114,116,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,10,60, - 108,105,115,116,99,111,109,112,62,96,0,0,0,115,8,0, - 0,0,6,0,6,1,14,255,255,128,122,30,95,112,97,116, - 104,95,106,111,105,110,46,60,108,111,99,97,108,115,62,46, - 60,108,105,115,116,99,111,109,112,62,78,41,2,218,8,112, - 97,116,104,95,115,101,112,218,4,106,111,105,110,41,1,218, - 10,112,97,116,104,95,112,97,114,116,115,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,10,95,112,97,116, - 104,95,106,111,105,110,94,0,0,0,115,8,0,0,0,10, - 2,2,1,8,255,255,128,114,48,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0, - 0,67,0,0,0,115,94,0,0,0,116,0,116,1,131,1, - 100,1,107,2,114,36,124,0,160,2,116,3,161,1,92,3, - 125,1,125,2,125,3,124,1,124,3,102,2,83,0,116,4, - 124,0,131,1,68,0,93,40,125,4,124,4,116,1,118,0, - 114,44,124,0,106,5,124,4,100,1,100,2,141,2,92,2, - 125,1,125,3,124,1,124,3,102,2,2,0,1,0,83,0, - 100,3,124,0,102,2,83,0,41,5,122,32,82,101,112,108, - 97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,112, - 97,116,104,46,115,112,108,105,116,40,41,46,114,3,0,0, - 0,41,1,90,8,109,97,120,115,112,108,105,116,114,10,0, - 0,0,78,41,6,114,4,0,0,0,114,42,0,0,0,218, - 10,114,112,97,114,116,105,116,105,111,110,114,45,0,0,0, - 218,8,114,101,118,101,114,115,101,100,218,6,114,115,112,108, - 105,116,41,5,218,4,112,97,116,104,90,5,102,114,111,110, - 116,218,1,95,218,4,116,97,105,108,114,32,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11, - 95,112,97,116,104,95,115,112,108,105,116,100,0,0,0,115, - 18,0,0,0,12,2,16,1,8,1,12,1,8,1,18,1, - 12,1,8,1,255,128,114,55,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,10,0,0,0,116,0,160,1,124,0,161, - 1,83,0,41,2,122,126,83,116,97,116,32,116,104,101,32, - 112,97,116,104,46,10,10,32,32,32,32,77,97,100,101,32, - 97,32,115,101,112,97,114,97,116,101,32,102,117,110,99,116, - 105,111,110,32,116,111,32,109,97,107,101,32,105,116,32,101, - 97,115,105,101,114,32,116,111,32,111,118,101,114,114,105,100, - 101,32,105,110,32,101,120,112,101,114,105,109,101,110,116,115, - 10,32,32,32,32,40,101,46,103,46,32,99,97,99,104,101, - 32,115,116,97,116,32,114,101,115,117,108,116,115,41,46,10, - 10,32,32,32,32,78,41,2,114,18,0,0,0,90,4,115, - 116,97,116,169,1,114,52,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,10,95,112,97,116,104, - 95,115,116,97,116,112,0,0,0,115,4,0,0,0,10,7, - 255,128,114,57,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,0, - 115,48,0,0,0,122,12,116,0,124,0,131,1,125,2,87, - 0,110,20,4,0,116,1,121,32,1,0,1,0,1,0,89, - 0,100,1,83,0,48,0,124,2,106,2,100,2,64,0,124, - 1,107,2,83,0,41,4,122,49,84,101,115,116,32,119,104, - 101,116,104,101,114,32,116,104,101,32,112,97,116,104,32,105, - 115,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, - 109,111,100,101,32,116,121,112,101,46,70,105,0,240,0,0, - 78,41,3,114,57,0,0,0,218,7,79,83,69,114,114,111, - 114,218,7,115,116,95,109,111,100,101,41,3,114,52,0,0, - 0,218,4,109,111,100,101,90,9,115,116,97,116,95,105,110, - 102,111,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,18,95,112,97,116,104,95,105,115,95,109,111,100,101, - 95,116,121,112,101,122,0,0,0,115,12,0,0,0,2,2, - 12,1,12,1,8,1,14,1,255,128,114,61,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,124, - 0,100,1,131,2,83,0,41,3,122,31,82,101,112,108,97, - 99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,97, - 116,104,46,105,115,102,105,108,101,46,105,0,128,0,0,78, - 41,1,114,61,0,0,0,114,56,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,12,95,112,97, - 116,104,95,105,115,102,105,108,101,131,0,0,0,115,4,0, - 0,0,10,2,255,128,114,62,0,0,0,99,1,0,0,0, + 9,60,103,101,110,101,120,112,114,62,46,0,0,0,115,4, + 0,0,0,26,0,255,128,114,9,0,0,0,218,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, + 0,0,0,67,0,0,0,115,22,0,0,0,104,0,124,0, + 93,14,125,1,100,0,124,1,155,0,157,2,146,2,113,4, + 83,0,41,1,250,1,58,114,7,0,0,0,41,2,114,5, + 0,0,0,218,1,115,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,9,60,115,101,116,99,111,109,112,62, + 49,0,0,0,115,4,0,0,0,22,0,255,128,114,13,0, + 0,0,41,1,218,3,119,105,110,41,2,90,6,99,121,103, + 119,105,110,90,6,100,97,114,119,105,110,99,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,22,0,0,0,124,0,115,12,116,0,160, - 1,161,0,125,0,116,2,124,0,100,1,131,2,83,0,41, - 3,122,30,82,101,112,108,97,99,101,109,101,110,116,32,102, - 111,114,32,111,115,46,112,97,116,104,46,105,115,100,105,114, - 46,105,0,64,0,0,78,41,3,114,18,0,0,0,218,6, - 103,101,116,99,119,100,114,61,0,0,0,114,56,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,95,112,97,116,104,95,105,115,100,105,114,136,0,0,0, - 115,8,0,0,0,4,2,8,1,10,1,255,128,114,64,0, + 3,0,0,0,115,62,0,0,0,116,0,106,1,160,2,116, + 3,161,1,114,50,116,0,106,1,160,2,116,4,161,1,114, + 30,100,1,137,0,110,4,100,2,137,0,135,0,102,1,100, + 3,100,4,132,8,125,0,124,0,83,0,100,5,100,4,132, + 0,125,0,124,0,83,0,41,6,78,90,12,80,89,84,72, + 79,78,67,65,83,69,79,75,115,12,0,0,0,80,89,84, + 72,79,78,67,65,83,69,79,75,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,19,0, + 0,0,115,20,0,0,0,116,0,106,1,106,2,12,0,111, + 18,136,0,116,3,106,4,118,0,83,0,41,2,122,94,84, + 114,117,101,32,105,102,32,102,105,108,101,110,97,109,101,115, + 32,109,117,115,116,32,98,101,32,99,104,101,99,107,101,100, + 32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118, + 101,108,121,32,97,110,100,32,105,103,110,111,114,101,32,101, + 110,118,105,114,111,110,109,101,110,116,32,102,108,97,103,115, + 32,97,114,101,32,110,111,116,32,115,101,116,46,78,41,5, + 218,3,115,121,115,218,5,102,108,97,103,115,218,18,105,103, + 110,111,114,101,95,101,110,118,105,114,111,110,109,101,110,116, + 218,3,95,111,115,90,7,101,110,118,105,114,111,110,114,7, + 0,0,0,169,1,218,3,107,101,121,114,7,0,0,0,114, + 8,0,0,0,218,11,95,114,101,108,97,120,95,99,97,115, + 101,66,0,0,0,115,4,0,0,0,20,2,255,128,122,37, + 95,109,97,107,101,95,114,101,108,97,120,95,99,97,115,101, + 46,60,108,111,99,97,108,115,62,46,95,114,101,108,97,120, + 95,99,97,115,101,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,83,0,0,0,115,4, + 0,0,0,100,1,83,0,41,3,122,53,84,114,117,101,32, + 105,102,32,102,105,108,101,110,97,109,101,115,32,109,117,115, + 116,32,98,101,32,99,104,101,99,107,101,100,32,99,97,115, + 101,45,105,110,115,101,110,115,105,116,105,118,101,108,121,46, + 70,78,114,7,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,21,0,0,0, + 70,0,0,0,115,4,0,0,0,4,2,255,128,41,5,114, + 15,0,0,0,218,8,112,108,97,116,102,111,114,109,218,10, + 115,116,97,114,116,115,119,105,116,104,218,27,95,67,65,83, + 69,95,73,78,83,69,78,83,73,84,73,86,69,95,80,76, + 65,84,70,79,82,77,83,218,35,95,67,65,83,69,95,73, + 78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70, + 79,82,77,83,95,83,84,82,95,75,69,89,41,1,114,21, + 0,0,0,114,7,0,0,0,114,19,0,0,0,114,8,0, + 0,0,218,16,95,109,97,107,101,95,114,101,108,97,120,95, + 99,97,115,101,59,0,0,0,115,18,0,0,0,12,1,12, + 1,6,1,4,2,12,2,4,7,8,253,4,3,255,128,114, + 26,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,67,0,0,0,115,20,0, + 0,0,116,0,124,0,131,1,100,1,64,0,160,1,100,2, + 100,3,161,2,83,0,41,5,122,42,67,111,110,118,101,114, + 116,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103, + 101,114,32,116,111,32,108,105,116,116,108,101,45,101,110,100, + 105,97,110,46,236,3,0,0,0,255,127,255,127,3,0,233, + 4,0,0,0,218,6,108,105,116,116,108,101,78,41,2,218, + 3,105,110,116,218,8,116,111,95,98,121,116,101,115,41,1, + 218,1,120,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,12,95,112,97,99,107,95,117,105,110,116,51,50, + 78,0,0,0,115,4,0,0,0,20,2,255,128,114,33,0, 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,26,0,0,0, - 124,0,160,0,116,1,161,1,112,24,124,0,100,1,100,2, - 133,2,25,0,116,2,118,0,83,0,41,4,122,142,82,101, - 112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,115, - 46,112,97,116,104,46,105,115,97,98,115,46,10,10,32,32, - 32,32,67,111,110,115,105,100,101,114,115,32,97,32,87,105, - 110,100,111,119,115,32,100,114,105,118,101,45,114,101,108,97, - 116,105,118,101,32,112,97,116,104,32,40,110,111,32,100,114, - 105,118,101,44,32,98,117,116,32,115,116,97,114,116,115,32, - 119,105,116,104,32,115,108,97,115,104,41,32,116,111,10,32, - 32,32,32,115,116,105,108,108,32,98,101,32,34,97,98,115, - 111,108,117,116,101,34,46,10,32,32,32,32,114,3,0,0, - 0,233,3,0,0,0,78,41,3,114,23,0,0,0,114,42, - 0,0,0,218,20,95,112,97,116,104,115,101,112,115,95,119, - 105,116,104,95,99,111,108,111,110,114,56,0,0,0,114,7, + 0,0,0,4,0,0,0,67,0,0,0,115,28,0,0,0, + 116,0,124,0,131,1,100,1,107,2,115,16,74,0,130,1, + 116,1,160,2,124,0,100,2,161,2,83,0,41,4,122,47, + 67,111,110,118,101,114,116,32,52,32,98,121,116,101,115,32, + 105,110,32,108,105,116,116,108,101,45,101,110,100,105,97,110, + 32,116,111,32,97,110,32,105,110,116,101,103,101,114,46,114, + 28,0,0,0,114,29,0,0,0,78,169,3,114,4,0,0, + 0,114,30,0,0,0,218,10,102,114,111,109,95,98,121,116, + 101,115,169,1,218,4,100,97,116,97,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,14,95,117,110,112,97, + 99,107,95,117,105,110,116,51,50,83,0,0,0,115,6,0, + 0,0,16,2,12,1,255,128,114,38,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, + 0,0,67,0,0,0,115,28,0,0,0,116,0,124,0,131, + 1,100,1,107,2,115,16,74,0,130,1,116,1,160,2,124, + 0,100,2,161,2,83,0,41,4,122,47,67,111,110,118,101, + 114,116,32,50,32,98,121,116,101,115,32,105,110,32,108,105, + 116,116,108,101,45,101,110,100,105,97,110,32,116,111,32,97, + 110,32,105,110,116,101,103,101,114,46,233,2,0,0,0,114, + 29,0,0,0,78,114,34,0,0,0,114,36,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,14, + 95,117,110,112,97,99,107,95,117,105,110,116,49,54,88,0, + 0,0,115,6,0,0,0,16,2,12,1,255,128,114,40,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,4,0,0,0,71,0,0,0,115,20,0,0,0, + 116,0,160,1,100,1,100,2,132,0,124,0,68,0,131,1, + 161,1,83,0,41,4,122,31,82,101,112,108,97,99,101,109, + 101,110,116,32,102,111,114,32,111,115,46,112,97,116,104,46, + 106,111,105,110,40,41,46,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,5,0,0,0,83,0,0,0, + 115,26,0,0,0,103,0,124,0,93,18,125,1,124,1,114, + 4,124,1,160,0,116,1,161,1,145,2,113,4,83,0,114, + 7,0,0,0,41,2,218,6,114,115,116,114,105,112,218,15, + 112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,41, + 2,114,5,0,0,0,218,4,112,97,114,116,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,10,60,108,105, + 115,116,99,111,109,112,62,96,0,0,0,115,8,0,0,0, + 6,0,6,1,14,255,255,128,122,30,95,112,97,116,104,95, + 106,111,105,110,46,60,108,111,99,97,108,115,62,46,60,108, + 105,115,116,99,111,109,112,62,78,41,2,218,8,112,97,116, + 104,95,115,101,112,218,4,106,111,105,110,41,1,218,10,112, + 97,116,104,95,112,97,114,116,115,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,10,95,112,97,116,104,95, + 106,111,105,110,94,0,0,0,115,8,0,0,0,10,2,2, + 1,8,255,255,128,114,48,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, + 0,0,0,115,94,0,0,0,116,0,116,1,131,1,100,1, + 107,2,114,36,124,0,160,2,116,3,161,1,92,3,125,1, + 125,2,125,3,124,1,124,3,102,2,83,0,116,4,124,0, + 131,1,68,0,93,40,125,4,124,4,116,1,118,0,114,44, + 124,0,106,5,124,4,100,1,100,2,141,2,92,2,125,1, + 125,3,124,1,124,3,102,2,2,0,1,0,83,0,100,3, + 124,0,102,2,83,0,41,5,122,32,82,101,112,108,97,99, + 101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,116, + 104,46,115,112,108,105,116,40,41,46,114,3,0,0,0,41, + 1,90,8,109,97,120,115,112,108,105,116,114,10,0,0,0, + 78,41,6,114,4,0,0,0,114,42,0,0,0,218,10,114, + 112,97,114,116,105,116,105,111,110,114,45,0,0,0,218,8, + 114,101,118,101,114,115,101,100,218,6,114,115,112,108,105,116, + 41,5,218,4,112,97,116,104,90,5,102,114,111,110,116,218, + 1,95,218,4,116,97,105,108,114,32,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,11,95,112, + 97,116,104,95,115,112,108,105,116,100,0,0,0,115,18,0, + 0,0,12,2,16,1,8,1,12,1,8,1,18,1,12,1, + 8,1,255,128,114,55,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,10,0,0,0,116,0,160,1,124,0,161,1,83, + 0,41,2,122,126,83,116,97,116,32,116,104,101,32,112,97, + 116,104,46,10,10,32,32,32,32,77,97,100,101,32,97,32, + 115,101,112,97,114,97,116,101,32,102,117,110,99,116,105,111, + 110,32,116,111,32,109,97,107,101,32,105,116,32,101,97,115, + 105,101,114,32,116,111,32,111,118,101,114,114,105,100,101,32, + 105,110,32,101,120,112,101,114,105,109,101,110,116,115,10,32, + 32,32,32,40,101,46,103,46,32,99,97,99,104,101,32,115, + 116,97,116,32,114,101,115,117,108,116,115,41,46,10,10,32, + 32,32,32,78,41,2,114,18,0,0,0,90,4,115,116,97, + 116,169,1,114,52,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,10,95,112,97,116,104,95,115, + 116,97,116,112,0,0,0,115,4,0,0,0,10,7,255,128, + 114,57,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,8,0,0,0,67,0,0,0,115,48, + 0,0,0,122,12,116,0,124,0,131,1,125,2,87,0,110, + 20,4,0,116,1,121,32,1,0,1,0,1,0,89,0,100, + 1,83,0,48,0,124,2,106,2,100,2,64,0,124,1,107, + 2,83,0,41,4,122,49,84,101,115,116,32,119,104,101,116, + 104,101,114,32,116,104,101,32,112,97,116,104,32,105,115,32, + 116,104,101,32,115,112,101,99,105,102,105,101,100,32,109,111, + 100,101,32,116,121,112,101,46,70,105,0,240,0,0,78,41, + 3,114,57,0,0,0,218,7,79,83,69,114,114,111,114,218, + 7,115,116,95,109,111,100,101,41,3,114,52,0,0,0,218, + 4,109,111,100,101,90,9,115,116,97,116,95,105,110,102,111, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 18,95,112,97,116,104,95,105,115,95,109,111,100,101,95,116, + 121,112,101,122,0,0,0,115,12,0,0,0,2,2,12,1, + 12,1,8,1,14,1,255,128,114,61,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,100, + 1,131,2,83,0,41,3,122,31,82,101,112,108,97,99,101, + 109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,104, + 46,105,115,102,105,108,101,46,105,0,128,0,0,78,41,1, + 114,61,0,0,0,114,56,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,12,95,112,97,116,104, + 95,105,115,102,105,108,101,131,0,0,0,115,4,0,0,0, + 10,2,255,128,114,62,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,22,0,0,0,124,0,115,12,116,0,160,1,161, + 0,125,0,116,2,124,0,100,1,131,2,83,0,41,3,122, + 30,82,101,112,108,97,99,101,109,101,110,116,32,102,111,114, + 32,111,115,46,112,97,116,104,46,105,115,100,105,114,46,105, + 0,64,0,0,78,41,3,114,18,0,0,0,218,6,103,101, + 116,99,119,100,114,61,0,0,0,114,56,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, - 112,97,116,104,95,105,115,97,98,115,143,0,0,0,115,4, - 0,0,0,26,6,255,128,114,67,0,0,0,233,182,1,0, - 0,99,3,0,0,0,0,0,0,0,0,0,0,0,6,0, - 0,0,11,0,0,0,67,0,0,0,115,170,0,0,0,100, - 1,160,0,124,0,116,1,124,0,131,1,161,2,125,3,116, - 2,160,3,124,3,116,2,106,4,116,2,106,5,66,0,116, - 2,106,6,66,0,124,2,100,2,64,0,161,3,125,4,122, - 72,116,7,160,8,124,4,100,3,161,2,143,26,125,5,124, - 5,160,9,124,1,161,1,1,0,87,0,100,4,4,0,4, - 0,131,3,1,0,110,16,49,0,115,94,48,0,1,0,1, - 0,1,0,89,0,1,0,116,2,160,10,124,3,124,0,161, - 2,1,0,87,0,100,4,83,0,4,0,116,11,121,168,1, - 0,1,0,1,0,122,14,116,2,160,12,124,3,161,1,1, - 0,87,0,130,0,4,0,116,11,121,166,1,0,1,0,1, - 0,89,0,130,0,48,0,48,0,41,5,122,162,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,250, - 5,123,125,46,123,125,114,68,0,0,0,90,2,119,98,78, - 41,13,218,6,102,111,114,109,97,116,218,2,105,100,114,18, - 0,0,0,90,4,111,112,101,110,90,6,79,95,69,88,67, - 76,90,7,79,95,67,82,69,65,84,90,8,79,95,87,82, - 79,78,76,89,218,3,95,105,111,218,6,70,105,108,101,73, - 79,218,5,119,114,105,116,101,218,7,114,101,112,108,97,99, - 101,114,58,0,0,0,90,6,117,110,108,105,110,107,41,6, - 114,52,0,0,0,114,37,0,0,0,114,60,0,0,0,90, - 8,112,97,116,104,95,116,109,112,90,2,102,100,218,4,102, - 105,108,101,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,13,95,119,114,105,116,101,95,97,116,111,109,105, - 99,152,0,0,0,115,38,0,0,0,16,5,6,1,22,1, - 4,255,2,2,14,3,40,1,14,1,4,128,12,1,2,1, - 12,1,2,3,12,254,2,1,2,1,2,255,2,1,255,128, - 114,77,0,0,0,105,104,13,0,0,114,39,0,0,0,114, - 29,0,0,0,115,2,0,0,0,13,10,90,11,95,95,112, - 121,99,97,99,104,101,95,95,122,4,111,112,116,45,122,3, - 46,112,121,122,4,46,112,121,119,122,4,46,112,121,99,41, - 1,218,12,111,112,116,105,109,105,122,97,116,105,111,110,99, - 2,0,0,0,0,0,0,0,1,0,0,0,12,0,0,0, - 5,0,0,0,67,0,0,0,115,88,1,0,0,124,1,100, - 1,117,1,114,52,116,0,160,1,100,2,116,2,161,2,1, - 0,124,2,100,1,117,1,114,40,100,3,125,3,116,3,124, - 3,131,1,130,1,124,1,114,48,100,4,110,2,100,5,125, - 2,116,4,160,5,124,0,161,1,125,0,116,6,124,0,131, - 1,92,2,125,4,125,5,124,5,160,7,100,6,161,1,92, - 3,125,6,125,7,125,8,116,8,106,9,106,10,125,9,124, - 9,100,1,117,0,114,114,116,11,100,7,131,1,130,1,100, - 4,160,12,124,6,114,126,124,6,110,2,124,8,124,7,124, - 9,103,3,161,1,125,10,124,2,100,1,117,0,114,172,116, - 8,106,13,106,14,100,8,107,2,114,164,100,4,125,2,110, - 8,116,8,106,13,106,14,125,2,116,15,124,2,131,1,125, - 2,124,2,100,4,107,3,114,224,124,2,160,16,161,0,115, - 210,116,17,100,9,160,18,124,2,161,1,131,1,130,1,100, - 10,160,18,124,10,116,19,124,2,161,3,125,10,124,10,116, - 20,100,8,25,0,23,0,125,11,116,8,106,21,100,1,117, - 1,144,1,114,76,116,22,124,4,131,1,144,1,115,16,116, - 23,116,4,160,24,161,0,124,4,131,2,125,4,124,4,100, - 5,25,0,100,11,107,2,144,1,114,56,124,4,100,8,25, - 0,116,25,118,1,144,1,114,56,124,4,100,12,100,1,133, - 2,25,0,125,4,116,23,116,8,106,21,124,4,160,26,116, - 25,161,1,124,11,131,3,83,0,116,23,124,4,116,27,124, - 11,131,3,83,0,41,13,97,254,2,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,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,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,10,10,32,32,32,32,84,104,101,32,39,111, - 112,116,105,109,105,122,97,116,105,111,110,39,32,112,97,114, - 97,109,101,116,101,114,32,99,111,110,116,114,111,108,115,32, - 116,104,101,32,112,114,101,115,117,109,101,100,32,111,112,116, - 105,109,105,122,97,116,105,111,110,32,108,101,118,101,108,32, - 111,102,10,32,32,32,32,116,104,101,32,98,121,116,101,99, - 111,100,101,32,102,105,108,101,46,32,73,102,32,39,111,112, - 116,105,109,105,122,97,116,105,111,110,39,32,105,115,32,110, - 111,116,32,78,111,110,101,44,32,116,104,101,32,115,116,114, - 105,110,103,32,114,101,112,114,101,115,101,110,116,97,116,105, - 111,110,10,32,32,32,32,111,102,32,116,104,101,32,97,114, - 103,117,109,101,110,116,32,105,115,32,116,97,107,101,110,32, - 97,110,100,32,118,101,114,105,102,105,101,100,32,116,111,32, - 98,101,32,97,108,112,104,97,110,117,109,101,114,105,99,32, - 40,101,108,115,101,32,86,97,108,117,101,69,114,114,111,114, - 10,32,32,32,32,105,115,32,114,97,105,115,101,100,41,46, - 10,10,32,32,32,32,84,104,101,32,100,101,98,117,103,95, - 111,118,101,114,114,105,100,101,32,112,97,114,97,109,101,116, - 101,114,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,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, - 10,32,32,32,32,97,32,84,114,117,101,32,118,97,108,117, - 101,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115, - 32,115,101,116,116,105,110,103,32,39,111,112,116,105,109,105, - 122,97,116,105,111,110,39,32,116,111,32,116,104,101,32,101, - 109,112,116,121,32,115,116,114,105,110,103,10,32,32,32,32, - 119,104,105,108,101,32,97,32,70,97,108,115,101,32,118,97, - 108,117,101,32,105,115,32,101,113,117,105,118,97,108,101,110, - 116,32,116,111,32,115,101,116,116,105,110,103,32,39,111,112, - 116,105,109,105,122,97,116,105,111,110,39,32,116,111,32,39, - 49,39,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,122,70,116,104,101, + 112,97,116,104,95,105,115,100,105,114,136,0,0,0,115,8, + 0,0,0,4,2,8,1,10,1,255,128,114,64,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,3,0,0,0,67,0,0,0,115,26,0,0,0,124,0, + 160,0,116,1,161,1,112,24,124,0,100,1,100,2,133,2, + 25,0,116,2,118,0,83,0,41,4,122,142,82,101,112,108, + 97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,112, + 97,116,104,46,105,115,97,98,115,46,10,10,32,32,32,32, + 67,111,110,115,105,100,101,114,115,32,97,32,87,105,110,100, + 111,119,115,32,100,114,105,118,101,45,114,101,108,97,116,105, + 118,101,32,112,97,116,104,32,40,110,111,32,100,114,105,118, + 101,44,32,98,117,116,32,115,116,97,114,116,115,32,119,105, + 116,104,32,115,108,97,115,104,41,32,116,111,10,32,32,32, + 32,115,116,105,108,108,32,98,101,32,34,97,98,115,111,108, + 117,116,101,34,46,10,32,32,32,32,114,3,0,0,0,233, + 3,0,0,0,78,41,3,114,23,0,0,0,114,42,0,0, + 0,218,20,95,112,97,116,104,115,101,112,115,95,119,105,116, + 104,95,99,111,108,111,110,114,56,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,11,95,112,97, + 116,104,95,105,115,97,98,115,143,0,0,0,115,4,0,0, + 0,26,6,255,128,114,67,0,0,0,233,182,1,0,0,99, + 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, + 11,0,0,0,67,0,0,0,115,170,0,0,0,100,1,160, + 0,124,0,116,1,124,0,131,1,161,2,125,3,116,2,160, + 3,124,3,116,2,106,4,116,2,106,5,66,0,116,2,106, + 6,66,0,124,2,100,2,64,0,161,3,125,4,122,72,116, + 7,160,8,124,4,100,3,161,2,143,26,125,5,124,5,160, + 9,124,1,161,1,1,0,87,0,100,4,4,0,4,0,131, + 3,1,0,110,16,49,0,115,94,48,0,1,0,1,0,1, + 0,89,0,1,0,116,2,160,10,124,3,124,0,161,2,1, + 0,87,0,100,4,83,0,4,0,116,11,121,168,1,0,1, + 0,1,0,122,14,116,2,160,12,124,3,161,1,1,0,87, + 0,130,0,4,0,116,11,121,166,1,0,1,0,1,0,89, + 0,130,0,48,0,48,0,41,5,122,162,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,250,5,123, + 125,46,123,125,114,68,0,0,0,90,2,119,98,78,41,13, + 218,6,102,111,114,109,97,116,218,2,105,100,114,18,0,0, + 0,90,4,111,112,101,110,90,6,79,95,69,88,67,76,90, + 7,79,95,67,82,69,65,84,90,8,79,95,87,82,79,78, + 76,89,218,3,95,105,111,218,6,70,105,108,101,73,79,218, + 5,119,114,105,116,101,218,7,114,101,112,108,97,99,101,114, + 58,0,0,0,90,6,117,110,108,105,110,107,41,6,114,52, + 0,0,0,114,37,0,0,0,114,60,0,0,0,90,8,112, + 97,116,104,95,116,109,112,90,2,102,100,218,4,102,105,108, + 101,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,13,95,119,114,105,116,101,95,97,116,111,109,105,99,152, + 0,0,0,115,36,0,0,0,16,5,6,1,22,1,4,255, + 2,2,14,3,40,1,18,1,12,1,2,1,12,1,2,3, + 12,254,2,1,2,1,2,255,2,1,255,128,114,77,0,0, + 0,105,104,13,0,0,114,39,0,0,0,114,29,0,0,0, + 115,2,0,0,0,13,10,90,11,95,95,112,121,99,97,99, + 104,101,95,95,122,4,111,112,116,45,122,3,46,112,121,122, + 4,46,112,121,119,122,4,46,112,121,99,41,1,218,12,111, + 112,116,105,109,105,122,97,116,105,111,110,99,2,0,0,0, + 0,0,0,0,1,0,0,0,12,0,0,0,5,0,0,0, + 67,0,0,0,115,88,1,0,0,124,1,100,1,117,1,114, + 52,116,0,160,1,100,2,116,2,161,2,1,0,124,2,100, + 1,117,1,114,40,100,3,125,3,116,3,124,3,131,1,130, + 1,124,1,114,48,100,4,110,2,100,5,125,2,116,4,160, + 5,124,0,161,1,125,0,116,6,124,0,131,1,92,2,125, + 4,125,5,124,5,160,7,100,6,161,1,92,3,125,6,125, + 7,125,8,116,8,106,9,106,10,125,9,124,9,100,1,117, + 0,114,114,116,11,100,7,131,1,130,1,100,4,160,12,124, + 6,114,126,124,6,110,2,124,8,124,7,124,9,103,3,161, + 1,125,10,124,2,100,1,117,0,114,172,116,8,106,13,106, + 14,100,8,107,2,114,164,100,4,125,2,110,8,116,8,106, + 13,106,14,125,2,116,15,124,2,131,1,125,2,124,2,100, + 4,107,3,114,224,124,2,160,16,161,0,115,210,116,17,100, + 9,160,18,124,2,161,1,131,1,130,1,100,10,160,18,124, + 10,116,19,124,2,161,3,125,10,124,10,116,20,100,8,25, + 0,23,0,125,11,116,8,106,21,100,1,117,1,144,1,114, + 76,116,22,124,4,131,1,144,1,115,16,116,23,116,4,160, + 24,161,0,124,4,131,2,125,4,124,4,100,5,25,0,100, + 11,107,2,144,1,114,56,124,4,100,8,25,0,116,25,118, + 1,144,1,114,56,124,4,100,12,100,1,133,2,25,0,125, + 4,116,23,116,8,106,21,124,4,160,26,116,25,161,1,124, + 11,131,3,83,0,116,23,124,4,116,27,124,11,131,3,83, + 0,41,13,97,254,2,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,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,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, + 10,10,32,32,32,32,84,104,101,32,39,111,112,116,105,109, + 105,122,97,116,105,111,110,39,32,112,97,114,97,109,101,116, + 101,114,32,99,111,110,116,114,111,108,115,32,116,104,101,32, + 112,114,101,115,117,109,101,100,32,111,112,116,105,109,105,122, + 97,116,105,111,110,32,108,101,118,101,108,32,111,102,10,32, + 32,32,32,116,104,101,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,46,32,73,102,32,39,111,112,116,105,109,105, + 122,97,116,105,111,110,39,32,105,115,32,110,111,116,32,78, + 111,110,101,44,32,116,104,101,32,115,116,114,105,110,103,32, + 114,101,112,114,101,115,101,110,116,97,116,105,111,110,10,32, + 32,32,32,111,102,32,116,104,101,32,97,114,103,117,109,101, + 110,116,32,105,115,32,116,97,107,101,110,32,97,110,100,32, + 118,101,114,105,102,105,101,100,32,116,111,32,98,101,32,97, + 108,112,104,97,110,117,109,101,114,105,99,32,40,101,108,115, + 101,32,86,97,108,117,101,69,114,114,111,114,10,32,32,32, + 32,105,115,32,114,97,105,115,101,100,41,46,10,10,32,32, + 32,32,84,104,101,32,100,101,98,117,103,95,111,118,101,114, + 114,105,100,101,32,112,97,114,97,109,101,116,101,114,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,73,102, 32,100,101,98,117,103,95,111,118,101,114,114,105,100,101,32, - 112,97,114,97,109,101,116,101,114,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,59,32,117,115,101,32,39,111,112, - 116,105,109,105,122,97,116,105,111,110,39,32,105,110,115,116, - 101,97,100,122,50,100,101,98,117,103,95,111,118,101,114,114, - 105,100,101,32,111,114,32,111,112,116,105,109,105,122,97,116, - 105,111,110,32,109,117,115,116,32,98,101,32,115,101,116,32, - 116,111,32,78,111,110,101,114,10,0,0,0,114,3,0,0, - 0,218,1,46,250,36,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,114,0,0,0,0,122, - 24,123,33,114,125,32,105,115,32,110,111,116,32,97,108,112, - 104,97,110,117,109,101,114,105,99,122,7,123,125,46,123,125, - 123,125,114,11,0,0,0,114,39,0,0,0,41,28,218,9, - 95,119,97,114,110,105,110,103,115,218,4,119,97,114,110,218, - 18,68,101,112,114,101,99,97,116,105,111,110,87,97,114,110, - 105,110,103,218,9,84,121,112,101,69,114,114,111,114,114,18, - 0,0,0,218,6,102,115,112,97,116,104,114,55,0,0,0, - 114,49,0,0,0,114,15,0,0,0,218,14,105,109,112,108, - 101,109,101,110,116,97,116,105,111,110,218,9,99,97,99,104, - 101,95,116,97,103,218,19,78,111,116,73,109,112,108,101,109, - 101,110,116,101,100,69,114,114,111,114,114,46,0,0,0,114, - 16,0,0,0,218,8,111,112,116,105,109,105,122,101,218,3, - 115,116,114,218,7,105,115,97,108,110,117,109,218,10,86,97, - 108,117,101,69,114,114,111,114,114,70,0,0,0,218,4,95, - 79,80,84,218,17,66,89,84,69,67,79,68,69,95,83,85, - 70,70,73,88,69,83,218,14,112,121,99,97,99,104,101,95, - 112,114,101,102,105,120,114,67,0,0,0,114,48,0,0,0, - 114,63,0,0,0,114,42,0,0,0,218,6,108,115,116,114, - 105,112,218,8,95,80,89,67,65,67,72,69,41,12,114,52, - 0,0,0,90,14,100,101,98,117,103,95,111,118,101,114,114, - 105,100,101,114,78,0,0,0,218,7,109,101,115,115,97,103, - 101,218,4,104,101,97,100,114,54,0,0,0,90,4,98,97, - 115,101,114,6,0,0,0,218,4,114,101,115,116,90,3,116, - 97,103,90,15,97,108,109,111,115,116,95,102,105,108,101,110, - 97,109,101,218,8,102,105,108,101,110,97,109,101,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,17,99,97, - 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,84, - 1,0,0,115,74,0,0,0,8,18,6,1,2,1,4,255, - 8,2,4,1,8,1,12,1,10,1,12,1,16,1,8,1, - 8,1,8,1,24,1,8,1,12,1,6,1,8,2,8,1, - 8,1,8,1,14,1,14,1,12,1,12,1,10,9,14,1, - 28,5,12,1,2,4,4,1,8,1,2,1,4,253,12,5, - 255,128,114,102,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0, - 115,44,1,0,0,116,0,106,1,106,2,100,1,117,0,114, - 20,116,3,100,2,131,1,130,1,116,4,160,5,124,0,161, - 1,125,0,116,6,124,0,131,1,92,2,125,1,125,2,100, - 3,125,3,116,0,106,7,100,1,117,1,114,102,116,0,106, - 7,160,8,116,9,161,1,125,4,124,1,160,10,124,4,116, - 11,23,0,161,1,114,102,124,1,116,12,124,4,131,1,100, - 1,133,2,25,0,125,1,100,4,125,3,124,3,115,144,116, - 6,124,1,131,1,92,2,125,1,125,5,124,5,116,13,107, - 3,114,144,116,14,116,13,155,0,100,5,124,0,155,2,157, - 3,131,1,130,1,124,2,160,15,100,6,161,1,125,6,124, - 6,100,7,118,1,114,176,116,14,100,8,124,2,155,2,157, - 2,131,1,130,1,124,6,100,9,107,2,144,1,114,12,124, - 2,160,16,100,6,100,10,161,2,100,11,25,0,125,7,124, - 7,160,10,116,17,161,1,115,226,116,14,100,12,116,17,155, - 2,157,2,131,1,130,1,124,7,116,12,116,17,131,1,100, - 1,133,2,25,0,125,8,124,8,160,18,161,0,144,1,115, - 12,116,14,100,13,124,7,155,2,100,14,157,3,131,1,130, - 1,124,2,160,19,100,6,161,1,100,15,25,0,125,9,116, - 20,124,1,124,9,116,21,100,15,25,0,23,0,131,2,83, - 0,41,16,97,110,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,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,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,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,47,52,56,56,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, + 105,115,32,110,111,116,32,78,111,110,101,44,10,32,32,32, + 32,97,32,84,114,117,101,32,118,97,108,117,101,32,105,115, + 32,116,104,101,32,115,97,109,101,32,97,115,32,115,101,116, + 116,105,110,103,32,39,111,112,116,105,109,105,122,97,116,105, + 111,110,39,32,116,111,32,116,104,101,32,101,109,112,116,121, + 32,115,116,114,105,110,103,10,32,32,32,32,119,104,105,108, + 101,32,97,32,70,97,108,115,101,32,118,97,108,117,101,32, + 105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111, + 32,115,101,116,116,105,110,103,32,39,111,112,116,105,109,105, + 122,97,116,105,111,110,39,32,116,111,32,39,49,39,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,114,80,0,0,0,70,84,122,31, - 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,114, - 79,0,0,0,62,2,0,0,0,114,39,0,0,0,114,65, - 0,0,0,122,29,101,120,112,101,99,116,101,100,32,111,110, - 108,121,32,50,32,111,114,32,51,32,100,111,116,115,32,105, - 110,32,114,65,0,0,0,114,39,0,0,0,233,254,255,255, - 255,122,53,111,112,116,105,109,105,122,97,116,105,111,110,32, - 112,111,114,116,105,111,110,32,111,102,32,102,105,108,101,110, - 97,109,101,32,100,111,101,115,32,110,111,116,32,115,116,97, - 114,116,32,119,105,116,104,32,122,19,111,112,116,105,109,105, - 122,97,116,105,111,110,32,108,101,118,101,108,32,122,29,32, - 105,115,32,110,111,116,32,97,110,32,97,108,112,104,97,110, - 117,109,101,114,105,99,32,118,97,108,117,101,114,0,0,0, - 0,41,22,114,15,0,0,0,114,86,0,0,0,114,87,0, - 0,0,114,88,0,0,0,114,18,0,0,0,114,85,0,0, - 0,114,55,0,0,0,114,95,0,0,0,114,41,0,0,0, - 114,42,0,0,0,114,23,0,0,0,114,45,0,0,0,114, - 4,0,0,0,114,97,0,0,0,114,92,0,0,0,218,5, - 99,111,117,110,116,114,51,0,0,0,114,93,0,0,0,114, - 91,0,0,0,218,9,112,97,114,116,105,116,105,111,110,114, - 48,0,0,0,218,15,83,79,85,82,67,69,95,83,85,70, - 70,73,88,69,83,41,10,114,52,0,0,0,114,99,0,0, - 0,90,16,112,121,99,97,99,104,101,95,102,105,108,101,110, - 97,109,101,90,23,102,111,117,110,100,95,105,110,95,112,121, - 99,97,99,104,101,95,112,114,101,102,105,120,90,13,115,116, - 114,105,112,112,101,100,95,112,97,116,104,90,7,112,121,99, - 97,99,104,101,90,9,100,111,116,95,99,111,117,110,116,114, - 78,0,0,0,90,9,111,112,116,95,108,101,118,101,108,90, - 13,98,97,115,101,95,102,105,108,101,110,97,109,101,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,17,115, - 111,117,114,99,101,95,102,114,111,109,95,99,97,99,104,101, - 155,1,0,0,115,62,0,0,0,12,9,8,1,10,1,12, - 1,4,1,10,1,12,1,14,1,16,1,4,1,4,1,12, - 1,8,1,8,1,2,1,8,255,10,2,8,1,14,1,10, - 1,16,1,10,1,4,1,2,1,8,255,16,2,10,1,16, - 1,14,2,18,1,255,128,114,107,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,5,0,0,0,9,0,0, - 0,67,0,0,0,115,124,0,0,0,116,0,124,0,131,1, - 100,1,107,2,114,16,100,2,83,0,124,0,160,1,100,3, - 161,1,92,3,125,1,125,2,125,3,124,1,114,56,124,3, - 160,2,161,0,100,4,100,5,133,2,25,0,100,6,107,3, - 114,60,124,0,83,0,122,12,116,3,124,0,131,1,125,4, - 87,0,110,34,4,0,116,4,116,5,102,2,121,106,1,0, - 1,0,1,0,124,0,100,2,100,5,133,2,25,0,125,4, - 89,0,110,2,48,0,116,6,124,4,131,1,114,120,124,4, - 83,0,124,0,83,0,41,7,122,188,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,114,0,0,0,0,78,114,79,0,0, - 0,233,253,255,255,255,233,255,255,255,255,90,2,112,121,41, - 7,114,4,0,0,0,114,49,0,0,0,218,5,108,111,119, - 101,114,114,107,0,0,0,114,88,0,0,0,114,92,0,0, - 0,114,62,0,0,0,41,5,218,13,98,121,116,101,99,111, - 100,101,95,112,97,116,104,114,100,0,0,0,114,53,0,0, - 0,90,9,101,120,116,101,110,115,105,111,110,218,11,115,111, - 117,114,99,101,95,112,97,116,104,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,15,95,103,101,116,95,115, - 111,117,114,99,101,102,105,108,101,195,1,0,0,115,22,0, - 0,0,12,7,4,1,16,1,24,1,4,1,2,1,12,1, - 16,1,18,1,16,1,255,128,114,113,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0, - 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,116, - 1,116,2,131,1,161,1,114,46,122,10,116,3,124,0,131, - 1,87,0,83,0,4,0,116,4,121,44,1,0,1,0,1, - 0,89,0,100,0,83,0,48,0,124,0,160,0,116,1,116, - 5,131,1,161,1,114,64,124,0,83,0,100,0,83,0,169, - 1,78,41,6,218,8,101,110,100,115,119,105,116,104,218,5, - 116,117,112,108,101,114,106,0,0,0,114,102,0,0,0,114, - 88,0,0,0,114,94,0,0,0,41,1,114,101,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,95,103,101,116,95,99,97,99,104,101,100,214,1,0,0, - 115,22,0,0,0,14,1,2,1,10,1,12,1,2,1,4, - 128,2,0,14,1,4,1,4,2,255,128,114,117,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,8,0,0,0,67,0,0,0,115,50,0,0,0,122,14, - 116,0,124,0,131,1,106,1,125,1,87,0,110,22,4,0, - 116,2,121,36,1,0,1,0,1,0,100,1,125,1,89,0, - 110,2,48,0,124,1,100,2,79,0,125,1,124,1,83,0, - 41,4,122,51,67,97,108,99,117,108,97,116,101,32,116,104, - 101,32,109,111,100,101,32,112,101,114,109,105,115,115,105,111, - 110,115,32,102,111,114,32,97,32,98,121,116,101,99,111,100, - 101,32,102,105,108,101,46,114,68,0,0,0,233,128,0,0, - 0,78,41,3,114,57,0,0,0,114,59,0,0,0,114,58, - 0,0,0,41,2,114,52,0,0,0,114,60,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, - 95,99,97,108,99,95,109,111,100,101,226,1,0,0,115,14, - 0,0,0,2,2,14,1,12,1,10,1,8,3,4,1,255, - 128,114,119,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,115, - 52,0,0,0,100,6,135,0,102,1,100,2,100,3,132,9, - 125,1,116,0,100,1,117,1,114,30,116,0,106,1,125,2, - 110,8,100,4,100,5,132,0,125,2,124,2,124,1,136,0, - 131,2,1,0,124,1,83,0,41,7,122,252,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,0,0,0,0,4,0,0,0,4,0,0,0,31,0, - 0,0,115,72,0,0,0,124,1,100,0,117,0,114,16,124, - 0,106,0,125,1,110,32,124,0,106,0,124,1,107,3,114, - 48,116,1,100,1,124,0,106,0,124,1,102,2,22,0,124, - 1,100,2,141,2,130,1,136,0,124,0,124,1,103,2,124, - 2,162,1,82,0,105,0,124,3,164,1,142,1,83,0,41, - 3,78,122,30,108,111,97,100,101,114,32,102,111,114,32,37, - 115,32,99,97,110,110,111,116,32,104,97,110,100,108,101,32, - 37,115,169,1,218,4,110,97,109,101,41,2,114,121,0,0, - 0,218,11,73,109,112,111,114,116,69,114,114,111,114,41,4, - 218,4,115,101,108,102,114,121,0,0,0,218,4,97,114,103, - 115,218,6,107,119,97,114,103,115,169,1,218,6,109,101,116, - 104,111,100,114,7,0,0,0,114,8,0,0,0,218,19,95, - 99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,112, - 101,114,246,1,0,0,115,20,0,0,0,8,1,8,1,10, - 1,4,1,8,1,2,255,2,1,6,255,24,2,255,128,122, - 40,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,99,2,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,7,0,0,0,83,0, - 0,0,115,56,0,0,0,100,1,68,0,93,32,125,2,116, - 0,124,1,124,2,131,2,114,4,116,1,124,0,124,2,116, - 2,124,1,124,2,131,2,131,3,1,0,113,4,124,0,106, - 3,160,4,124,1,106,3,161,1,1,0,100,0,83,0,41, - 2,78,41,4,218,10,95,95,109,111,100,117,108,101,95,95, - 218,8,95,95,110,97,109,101,95,95,218,12,95,95,113,117, - 97,108,110,97,109,101,95,95,218,7,95,95,100,111,99,95, - 95,41,5,218,7,104,97,115,97,116,116,114,218,7,115,101, - 116,97,116,116,114,218,7,103,101,116,97,116,116,114,218,8, - 95,95,100,105,99,116,95,95,218,6,117,112,100,97,116,101, - 41,3,90,3,110,101,119,90,3,111,108,100,114,75,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,5,95,119,114,97,112,3,2,0,0,115,12,0,0,0, - 8,1,10,1,20,1,14,1,4,128,255,128,122,26,95,99, - 104,101,99,107,95,110,97,109,101,46,60,108,111,99,97,108, - 115,62,46,95,119,114,97,112,41,1,78,41,2,218,10,95, - 98,111,111,116,115,116,114,97,112,114,138,0,0,0,41,3, - 114,127,0,0,0,114,128,0,0,0,114,138,0,0,0,114, - 7,0,0,0,114,126,0,0,0,114,8,0,0,0,218,11, - 95,99,104,101,99,107,95,110,97,109,101,238,1,0,0,115, - 14,0,0,0,14,8,8,10,8,1,8,2,10,6,4,1, - 255,128,114,140,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,6,0,0,0,67,0,0,0, - 115,60,0,0,0,124,0,160,0,124,1,161,1,92,2,125, - 2,125,3,124,2,100,1,117,0,114,56,116,1,124,3,131, - 1,114,56,100,2,125,4,116,2,160,3,124,4,160,4,124, - 3,100,3,25,0,161,1,116,5,161,2,1,0,124,2,83, - 0,41,4,122,155,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,10,10,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,32,105,110,32,102,97, - 118,111,114,32,111,102,32,102,105,110,100,101,114,46,102,105, - 110,100,95,115,112,101,99,40,41,46,10,10,32,32,32,32, - 78,122,44,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,114, - 0,0,0,0,41,6,218,11,102,105,110,100,95,108,111,97, - 100,101,114,114,4,0,0,0,114,81,0,0,0,114,82,0, - 0,0,114,70,0,0,0,218,13,73,109,112,111,114,116,87, - 97,114,110,105,110,103,41,5,114,123,0,0,0,218,8,102, - 117,108,108,110,97,109,101,218,6,108,111,97,100,101,114,218, - 8,112,111,114,116,105,111,110,115,218,3,109,115,103,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,17,95, - 102,105,110,100,95,109,111,100,117,108,101,95,115,104,105,109, - 13,2,0,0,115,12,0,0,0,14,10,16,1,4,1,22, - 1,4,1,255,128,114,147,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67, - 0,0,0,115,166,0,0,0,124,0,100,1,100,2,133,2, - 25,0,125,3,124,3,116,0,107,3,114,64,100,3,124,1, - 155,2,100,4,124,3,155,2,157,4,125,4,116,1,160,2, - 100,5,124,4,161,2,1,0,116,3,124,4,102,1,105,0, - 124,2,164,1,142,1,130,1,116,4,124,0,131,1,100,6, - 107,0,114,106,100,7,124,1,155,2,157,2,125,4,116,1, - 160,2,100,5,124,4,161,2,1,0,116,5,124,4,131,1, - 130,1,116,6,124,0,100,2,100,8,133,2,25,0,131,1, - 125,5,124,5,100,9,64,0,114,162,100,10,124,5,155,2, - 100,11,124,1,155,2,157,4,125,4,116,3,124,4,102,1, - 105,0,124,2,164,1,142,1,130,1,124,5,83,0,41,12, - 97,84,2,0,0,80,101,114,102,111,114,109,32,98,97,115, - 105,99,32,118,97,108,105,100,105,116,121,32,99,104,101,99, - 107,105,110,103,32,111,102,32,97,32,112,121,99,32,104,101, - 97,100,101,114,32,97,110,100,32,114,101,116,117,114,110,32, - 116,104,101,32,102,108,97,103,115,32,102,105,101,108,100,44, - 10,32,32,32,32,119,104,105,99,104,32,100,101,116,101,114, - 109,105,110,101,115,32,104,111,119,32,116,104,101,32,112,121, - 99,32,115,104,111,117,108,100,32,98,101,32,102,117,114,116, - 104,101,114,32,118,97,108,105,100,97,116,101,100,32,97,103, - 97,105,110,115,116,32,116,104,101,32,115,111,117,114,99,101, + 10,10,32,32,32,32,78,122,70,116,104,101,32,100,101,98, + 117,103,95,111,118,101,114,114,105,100,101,32,112,97,114,97, + 109,101,116,101,114,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,59,32,117,115,101,32,39,111,112,116,105,109,105, + 122,97,116,105,111,110,39,32,105,110,115,116,101,97,100,122, + 50,100,101,98,117,103,95,111,118,101,114,114,105,100,101,32, + 111,114,32,111,112,116,105,109,105,122,97,116,105,111,110,32, + 109,117,115,116,32,98,101,32,115,101,116,32,116,111,32,78, + 111,110,101,114,10,0,0,0,114,3,0,0,0,218,1,46, + 250,36,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,114,0,0,0,0,122,24,123,33,114, + 125,32,105,115,32,110,111,116,32,97,108,112,104,97,110,117, + 109,101,114,105,99,122,7,123,125,46,123,125,123,125,114,11, + 0,0,0,114,39,0,0,0,41,28,218,9,95,119,97,114, + 110,105,110,103,115,218,4,119,97,114,110,218,18,68,101,112, + 114,101,99,97,116,105,111,110,87,97,114,110,105,110,103,218, + 9,84,121,112,101,69,114,114,111,114,114,18,0,0,0,218, + 6,102,115,112,97,116,104,114,55,0,0,0,114,49,0,0, + 0,114,15,0,0,0,218,14,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,218,9,99,97,99,104,101,95,116,97, + 103,218,19,78,111,116,73,109,112,108,101,109,101,110,116,101, + 100,69,114,114,111,114,114,46,0,0,0,114,16,0,0,0, + 218,8,111,112,116,105,109,105,122,101,218,3,115,116,114,218, + 7,105,115,97,108,110,117,109,218,10,86,97,108,117,101,69, + 114,114,111,114,114,70,0,0,0,218,4,95,79,80,84,218, + 17,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88, + 69,83,218,14,112,121,99,97,99,104,101,95,112,114,101,102, + 105,120,114,67,0,0,0,114,48,0,0,0,114,63,0,0, + 0,114,42,0,0,0,218,6,108,115,116,114,105,112,218,8, + 95,80,89,67,65,67,72,69,41,12,114,52,0,0,0,90, + 14,100,101,98,117,103,95,111,118,101,114,114,105,100,101,114, + 78,0,0,0,218,7,109,101,115,115,97,103,101,218,4,104, + 101,97,100,114,54,0,0,0,90,4,98,97,115,101,114,6, + 0,0,0,218,4,114,101,115,116,90,3,116,97,103,90,15, + 97,108,109,111,115,116,95,102,105,108,101,110,97,109,101,218, + 8,102,105,108,101,110,97,109,101,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,17,99,97,99,104,101,95, + 102,114,111,109,95,115,111,117,114,99,101,84,1,0,0,115, + 74,0,0,0,8,18,6,1,2,1,4,255,8,2,4,1, + 8,1,12,1,10,1,12,1,16,1,8,1,8,1,8,1, + 24,1,8,1,12,1,6,1,8,2,8,1,8,1,8,1, + 14,1,14,1,12,1,12,1,10,9,14,1,28,5,12,1, + 2,4,4,1,8,1,2,1,4,253,12,5,255,128,114,102, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 10,0,0,0,5,0,0,0,67,0,0,0,115,44,1,0, + 0,116,0,106,1,106,2,100,1,117,0,114,20,116,3,100, + 2,131,1,130,1,116,4,160,5,124,0,161,1,125,0,116, + 6,124,0,131,1,92,2,125,1,125,2,100,3,125,3,116, + 0,106,7,100,1,117,1,114,102,116,0,106,7,160,8,116, + 9,161,1,125,4,124,1,160,10,124,4,116,11,23,0,161, + 1,114,102,124,1,116,12,124,4,131,1,100,1,133,2,25, + 0,125,1,100,4,125,3,124,3,115,144,116,6,124,1,131, + 1,92,2,125,1,125,5,124,5,116,13,107,3,114,144,116, + 14,116,13,155,0,100,5,124,0,155,2,157,3,131,1,130, + 1,124,2,160,15,100,6,161,1,125,6,124,6,100,7,118, + 1,114,176,116,14,100,8,124,2,155,2,157,2,131,1,130, + 1,124,6,100,9,107,2,144,1,114,12,124,2,160,16,100, + 6,100,10,161,2,100,11,25,0,125,7,124,7,160,10,116, + 17,161,1,115,226,116,14,100,12,116,17,155,2,157,2,131, + 1,130,1,124,7,116,12,116,17,131,1,100,1,133,2,25, + 0,125,8,124,8,160,18,161,0,144,1,115,12,116,14,100, + 13,124,7,155,2,100,14,157,3,131,1,130,1,124,2,160, + 19,100,6,161,1,100,15,25,0,125,9,116,20,124,1,124, + 9,116,21,100,15,25,0,23,0,131,2,83,0,41,16,97, + 110,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,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,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,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,47,52,56,56,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,114,80,0,0,0,70,84,122,31,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,114,79,0,0,0, + 62,2,0,0,0,114,39,0,0,0,114,65,0,0,0,122, + 29,101,120,112,101,99,116,101,100,32,111,110,108,121,32,50, + 32,111,114,32,51,32,100,111,116,115,32,105,110,32,114,65, + 0,0,0,114,39,0,0,0,233,254,255,255,255,122,53,111, + 112,116,105,109,105,122,97,116,105,111,110,32,112,111,114,116, + 105,111,110,32,111,102,32,102,105,108,101,110,97,109,101,32, + 100,111,101,115,32,110,111,116,32,115,116,97,114,116,32,119, + 105,116,104,32,122,19,111,112,116,105,109,105,122,97,116,105, + 111,110,32,108,101,118,101,108,32,122,29,32,105,115,32,110, + 111,116,32,97,110,32,97,108,112,104,97,110,117,109,101,114, + 105,99,32,118,97,108,117,101,114,0,0,0,0,41,22,114, + 15,0,0,0,114,86,0,0,0,114,87,0,0,0,114,88, + 0,0,0,114,18,0,0,0,114,85,0,0,0,114,55,0, + 0,0,114,95,0,0,0,114,41,0,0,0,114,42,0,0, + 0,114,23,0,0,0,114,45,0,0,0,114,4,0,0,0, + 114,97,0,0,0,114,92,0,0,0,218,5,99,111,117,110, + 116,114,51,0,0,0,114,93,0,0,0,114,91,0,0,0, + 218,9,112,97,114,116,105,116,105,111,110,114,48,0,0,0, + 218,15,83,79,85,82,67,69,95,83,85,70,70,73,88,69, + 83,41,10,114,52,0,0,0,114,99,0,0,0,90,16,112, + 121,99,97,99,104,101,95,102,105,108,101,110,97,109,101,90, + 23,102,111,117,110,100,95,105,110,95,112,121,99,97,99,104, + 101,95,112,114,101,102,105,120,90,13,115,116,114,105,112,112, + 101,100,95,112,97,116,104,90,7,112,121,99,97,99,104,101, + 90,9,100,111,116,95,99,111,117,110,116,114,78,0,0,0, + 90,9,111,112,116,95,108,101,118,101,108,90,13,98,97,115, + 101,95,102,105,108,101,110,97,109,101,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,17,115,111,117,114,99, + 101,95,102,114,111,109,95,99,97,99,104,101,155,1,0,0, + 115,62,0,0,0,12,9,8,1,10,1,12,1,4,1,10, + 1,12,1,14,1,16,1,4,1,4,1,12,1,8,1,8, + 1,2,1,8,255,10,2,8,1,14,1,10,1,16,1,10, + 1,4,1,2,1,8,255,16,2,10,1,16,1,14,2,18, + 1,255,128,114,107,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,5,0,0,0,9,0,0,0,67,0,0, + 0,115,124,0,0,0,116,0,124,0,131,1,100,1,107,2, + 114,16,100,2,83,0,124,0,160,1,100,3,161,1,92,3, + 125,1,125,2,125,3,124,1,114,56,124,3,160,2,161,0, + 100,4,100,5,133,2,25,0,100,6,107,3,114,60,124,0, + 83,0,122,12,116,3,124,0,131,1,125,4,87,0,110,34, + 4,0,116,4,116,5,102,2,121,106,1,0,1,0,1,0, + 124,0,100,2,100,5,133,2,25,0,125,4,89,0,110,2, + 48,0,116,6,124,4,131,1,114,120,124,4,83,0,124,0, + 83,0,41,7,122,188,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,114,0,0,0,0,78,114,79,0,0,0,233,253,255, + 255,255,233,255,255,255,255,90,2,112,121,41,7,114,4,0, + 0,0,114,49,0,0,0,218,5,108,111,119,101,114,114,107, + 0,0,0,114,88,0,0,0,114,92,0,0,0,114,62,0, + 0,0,41,5,218,13,98,121,116,101,99,111,100,101,95,112, + 97,116,104,114,100,0,0,0,114,53,0,0,0,90,9,101, + 120,116,101,110,115,105,111,110,218,11,115,111,117,114,99,101, + 95,112,97,116,104,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,15,95,103,101,116,95,115,111,117,114,99, + 101,102,105,108,101,195,1,0,0,115,22,0,0,0,12,7, + 4,1,16,1,24,1,4,1,2,1,12,1,16,1,18,1, + 16,1,255,128,114,113,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,8,0,0,0,67,0, + 0,0,115,68,0,0,0,124,0,160,0,116,1,116,2,131, + 1,161,1,114,46,122,10,116,3,124,0,131,1,87,0,83, + 0,4,0,116,4,121,44,1,0,1,0,1,0,89,0,100, + 0,83,0,48,0,124,0,160,0,116,1,116,5,131,1,161, + 1,114,64,124,0,83,0,100,0,83,0,169,1,78,41,6, + 218,8,101,110,100,115,119,105,116,104,218,5,116,117,112,108, + 101,114,106,0,0,0,114,102,0,0,0,114,88,0,0,0, + 114,94,0,0,0,41,1,114,101,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,11,95,103,101, + 116,95,99,97,99,104,101,100,214,1,0,0,115,18,0,0, + 0,14,1,2,1,10,1,12,1,8,1,14,1,4,1,4, + 2,255,128,114,117,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,8,0,0,0,67,0,0, + 0,115,50,0,0,0,122,14,116,0,124,0,131,1,106,1, + 125,1,87,0,110,22,4,0,116,2,121,36,1,0,1,0, + 1,0,100,1,125,1,89,0,110,2,48,0,124,1,100,2, + 79,0,125,1,124,1,83,0,41,4,122,51,67,97,108,99, + 117,108,97,116,101,32,116,104,101,32,109,111,100,101,32,112, + 101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,97, + 32,98,121,116,101,99,111,100,101,32,102,105,108,101,46,114, + 68,0,0,0,233,128,0,0,0,78,41,3,114,57,0,0, + 0,114,59,0,0,0,114,58,0,0,0,41,2,114,52,0, + 0,0,114,60,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,10,95,99,97,108,99,95,109,111, + 100,101,226,1,0,0,115,14,0,0,0,2,2,14,1,12, + 1,10,1,8,3,4,1,255,128,114,119,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, + 0,0,0,3,0,0,0,115,52,0,0,0,100,6,135,0, + 102,1,100,2,100,3,132,9,125,1,116,0,100,1,117,1, + 114,30,116,0,106,1,125,2,110,8,100,4,100,5,132,0, + 125,2,124,2,124,1,136,0,131,2,1,0,124,1,83,0, + 41,7,122,252,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,0,0,0,0,4,0, + 0,0,4,0,0,0,31,0,0,0,115,72,0,0,0,124, + 1,100,0,117,0,114,16,124,0,106,0,125,1,110,32,124, + 0,106,0,124,1,107,3,114,48,116,1,100,1,124,0,106, + 0,124,1,102,2,22,0,124,1,100,2,141,2,130,1,136, + 0,124,0,124,1,103,2,124,2,162,1,82,0,105,0,124, + 3,164,1,142,1,83,0,41,3,78,122,30,108,111,97,100, + 101,114,32,102,111,114,32,37,115,32,99,97,110,110,111,116, + 32,104,97,110,100,108,101,32,37,115,169,1,218,4,110,97, + 109,101,41,2,114,121,0,0,0,218,11,73,109,112,111,114, + 116,69,114,114,111,114,41,4,218,4,115,101,108,102,114,121, + 0,0,0,218,4,97,114,103,115,218,6,107,119,97,114,103, + 115,169,1,218,6,109,101,116,104,111,100,114,7,0,0,0, + 114,8,0,0,0,218,19,95,99,104,101,99,107,95,110,97, + 109,101,95,119,114,97,112,112,101,114,246,1,0,0,115,20, + 0,0,0,8,1,8,1,10,1,4,1,8,1,2,255,2, + 1,6,255,24,2,255,128,122,40,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,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,7,0,0,0,83,0,0,0,115,56,0,0,0,100, + 1,68,0,93,32,125,2,116,0,124,1,124,2,131,2,114, + 4,116,1,124,0,124,2,116,2,124,1,124,2,131,2,131, + 3,1,0,113,4,124,0,106,3,160,4,124,1,106,3,161, + 1,1,0,100,0,83,0,41,2,78,41,4,218,10,95,95, + 109,111,100,117,108,101,95,95,218,8,95,95,110,97,109,101, + 95,95,218,12,95,95,113,117,97,108,110,97,109,101,95,95, + 218,7,95,95,100,111,99,95,95,41,5,218,7,104,97,115, + 97,116,116,114,218,7,115,101,116,97,116,116,114,218,7,103, + 101,116,97,116,116,114,218,8,95,95,100,105,99,116,95,95, + 218,6,117,112,100,97,116,101,41,3,90,3,110,101,119,90, + 3,111,108,100,114,75,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,5,95,119,114,97,112,3, + 2,0,0,115,10,0,0,0,8,1,10,1,20,1,18,1, + 255,128,122,26,95,99,104,101,99,107,95,110,97,109,101,46, + 60,108,111,99,97,108,115,62,46,95,119,114,97,112,41,1, + 78,41,2,218,10,95,98,111,111,116,115,116,114,97,112,114, + 138,0,0,0,41,3,114,127,0,0,0,114,128,0,0,0, + 114,138,0,0,0,114,7,0,0,0,114,126,0,0,0,114, + 8,0,0,0,218,11,95,99,104,101,99,107,95,110,97,109, + 101,238,1,0,0,115,14,0,0,0,14,8,8,10,8,1, + 8,2,10,6,4,1,255,128,114,140,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0, + 0,0,67,0,0,0,115,60,0,0,0,124,0,160,0,124, + 1,161,1,92,2,125,2,125,3,124,2,100,1,117,0,114, + 56,116,1,124,3,131,1,114,56,100,2,125,4,116,2,160, + 3,124,4,160,4,124,3,100,3,25,0,161,1,116,5,161, + 2,1,0,124,2,83,0,41,4,122,155,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,10,10,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 32,105,110,32,102,97,118,111,114,32,111,102,32,102,105,110, + 100,101,114,46,102,105,110,100,95,115,112,101,99,40,41,46, + 10,10,32,32,32,32,78,122,44,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,114,0,0,0,0,41,6,218,11,102,105, + 110,100,95,108,111,97,100,101,114,114,4,0,0,0,114,81, + 0,0,0,114,82,0,0,0,114,70,0,0,0,218,13,73, + 109,112,111,114,116,87,97,114,110,105,110,103,41,5,114,123, + 0,0,0,218,8,102,117,108,108,110,97,109,101,218,6,108, + 111,97,100,101,114,218,8,112,111,114,116,105,111,110,115,218, + 3,109,115,103,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,17,95,102,105,110,100,95,109,111,100,117,108, + 101,95,115,104,105,109,13,2,0,0,115,12,0,0,0,14, + 10,16,1,4,1,22,1,4,1,255,128,114,147,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,4,0,0,0,67,0,0,0,115,166,0,0,0,124,0, + 100,1,100,2,133,2,25,0,125,3,124,3,116,0,107,3, + 114,64,100,3,124,1,155,2,100,4,124,3,155,2,157,4, + 125,4,116,1,160,2,100,5,124,4,161,2,1,0,116,3, + 124,4,102,1,105,0,124,2,164,1,142,1,130,1,116,4, + 124,0,131,1,100,6,107,0,114,106,100,7,124,1,155,2, + 157,2,125,4,116,1,160,2,100,5,124,4,161,2,1,0, + 116,5,124,4,131,1,130,1,116,6,124,0,100,2,100,8, + 133,2,25,0,131,1,125,5,124,5,100,9,64,0,114,162, + 100,10,124,5,155,2,100,11,124,1,155,2,157,4,125,4, + 116,3,124,4,102,1,105,0,124,2,164,1,142,1,130,1, + 124,5,83,0,41,12,97,84,2,0,0,80,101,114,102,111, + 114,109,32,98,97,115,105,99,32,118,97,108,105,100,105,116, + 121,32,99,104,101,99,107,105,110,103,32,111,102,32,97,32, + 112,121,99,32,104,101,97,100,101,114,32,97,110,100,32,114, + 101,116,117,114,110,32,116,104,101,32,102,108,97,103,115,32, + 102,105,101,108,100,44,10,32,32,32,32,119,104,105,99,104, + 32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32, + 116,104,101,32,112,121,99,32,115,104,111,117,108,100,32,98, + 101,32,102,117,114,116,104,101,114,32,118,97,108,105,100,97, + 116,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32, + 115,111,117,114,99,101,46,10,10,32,32,32,32,42,100,97, + 116,97,42,32,105,115,32,116,104,101,32,99,111,110,116,101, + 110,116,115,32,111,102,32,116,104,101,32,112,121,99,32,102, + 105,108,101,46,32,40,79,110,108,121,32,116,104,101,32,102, + 105,114,115,116,32,49,54,32,98,121,116,101,115,32,97,114, + 101,10,32,32,32,32,114,101,113,117,105,114,101,100,44,32, + 116,104,111,117,103,104,46,41,10,10,32,32,32,32,42,110, + 97,109,101,42,32,105,115,32,116,104,101,32,110,97,109,101, + 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,98, + 101,105,110,103,32,105,109,112,111,114,116,101,100,46,32,73, + 116,32,105,115,32,117,115,101,100,32,102,111,114,32,108,111, + 103,103,105,110,103,46,10,10,32,32,32,32,42,101,120,99, + 95,100,101,116,97,105,108,115,42,32,105,115,32,97,32,100, + 105,99,116,105,111,110,97,114,121,32,112,97,115,115,101,100, + 32,116,111,32,73,109,112,111,114,116,69,114,114,111,114,32, + 105,102,32,105,116,32,114,97,105,115,101,100,32,102,111,114, + 10,32,32,32,32,105,109,112,114,111,118,101,100,32,100,101, + 98,117,103,103,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,119,104,101,110,32,116, + 104,101,32,102,108,97,103,115,10,32,32,32,32,102,105,101, + 108,100,32,105,115,32,105,110,118,97,108,105,100,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,32,116, + 114,117,110,99,97,116,101,100,46,10,10,32,32,32,32,78, + 114,28,0,0,0,122,20,98,97,100,32,109,97,103,105,99, + 32,110,117,109,98,101,114,32,105,110,32,122,2,58,32,250, + 2,123,125,233,16,0,0,0,122,40,114,101,97,99,104,101, + 100,32,69,79,70,32,119,104,105,108,101,32,114,101,97,100, + 105,110,103,32,112,121,99,32,104,101,97,100,101,114,32,111, + 102,32,233,8,0,0,0,233,252,255,255,255,122,14,105,110, + 118,97,108,105,100,32,102,108,97,103,115,32,122,4,32,105, + 110,32,41,7,218,12,77,65,71,73,67,95,78,85,77,66, + 69,82,114,139,0,0,0,218,16,95,118,101,114,98,111,115, + 101,95,109,101,115,115,97,103,101,114,122,0,0,0,114,4, + 0,0,0,218,8,69,79,70,69,114,114,111,114,114,38,0, + 0,0,41,6,114,37,0,0,0,114,121,0,0,0,218,11, + 101,120,99,95,100,101,116,97,105,108,115,90,5,109,97,103, + 105,99,114,98,0,0,0,114,16,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,13,95,99,108, + 97,115,115,105,102,121,95,112,121,99,30,2,0,0,115,30, + 0,0,0,12,16,8,1,16,1,12,1,16,1,12,1,10, + 1,12,1,8,1,16,1,8,2,16,1,16,1,4,1,255, + 128,114,156,0,0,0,99,5,0,0,0,0,0,0,0,0, + 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, + 124,0,0,0,116,0,124,0,100,1,100,2,133,2,25,0, + 131,1,124,1,100,3,64,0,107,3,114,62,100,4,124,3, + 155,2,157,2,125,5,116,1,160,2,100,5,124,5,161,2, + 1,0,116,3,124,5,102,1,105,0,124,4,164,1,142,1, + 130,1,124,2,100,6,117,1,114,120,116,0,124,0,100,2, + 100,7,133,2,25,0,131,1,124,2,100,3,64,0,107,3, + 114,116,116,3,100,4,124,3,155,2,157,2,102,1,105,0, + 124,4,164,1,142,1,130,1,100,6,83,0,100,6,83,0, + 41,8,97,7,2,0,0,86,97,108,105,100,97,116,101,32, + 97,32,112,121,99,32,97,103,97,105,110,115,116,32,116,104, + 101,32,115,111,117,114,99,101,32,108,97,115,116,45,109,111, + 100,105,102,105,101,100,32,116,105,109,101,46,10,10,32,32, + 32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,32, + 99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32, + 112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,32, + 116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,116, + 101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,105, + 114,101,100,46,41,10,10,32,32,32,32,42,115,111,117,114, + 99,101,95,109,116,105,109,101,42,32,105,115,32,116,104,101, + 32,108,97,115,116,32,109,111,100,105,102,105,101,100,32,116, + 105,109,101,115,116,97,109,112,32,111,102,32,116,104,101,32, + 115,111,117,114,99,101,32,102,105,108,101,46,10,10,32,32, + 32,32,42,115,111,117,114,99,101,95,115,105,122,101,42,32, + 105,115,32,78,111,110,101,32,111,114,32,116,104,101,32,115, + 105,122,101,32,111,102,32,116,104,101,32,115,111,117,114,99, + 101,32,102,105,108,101,32,105,110,32,98,121,116,101,115,46, + 10,10,32,32,32,32,42,110,97,109,101,42,32,105,115,32, + 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32, + 109,111,100,117,108,101,32,98,101,105,110,103,32,105,109,112, + 111,114,116,101,100,46,32,73,116,32,105,115,32,117,115,101, + 100,32,102,111,114,32,108,111,103,103,105,110,103,46,10,10, + 32,32,32,32,42,101,120,99,95,100,101,116,97,105,108,115, + 42,32,105,115,32,97,32,100,105,99,116,105,111,110,97,114, + 121,32,112,97,115,115,101,100,32,116,111,32,73,109,112,111, + 114,116,69,114,114,111,114,32,105,102,32,105,116,32,114,97, + 105,115,101,100,32,102,111,114,10,32,32,32,32,105,109,112, + 114,111,118,101,100,32,100,101,98,117,103,103,105,110,103,46, + 10,10,32,32,32,32,65,110,32,73,109,112,111,114,116,69, + 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,105, + 102,32,116,104,101,32,98,121,116,101,99,111,100,101,32,105, + 115,32,115,116,97,108,101,46,10,10,32,32,32,32,114,150, + 0,0,0,233,12,0,0,0,114,27,0,0,0,122,22,98, + 121,116,101,99,111,100,101,32,105,115,32,115,116,97,108,101, + 32,102,111,114,32,114,148,0,0,0,78,114,149,0,0,0, + 41,4,114,38,0,0,0,114,139,0,0,0,114,153,0,0, + 0,114,122,0,0,0,41,6,114,37,0,0,0,218,12,115, + 111,117,114,99,101,95,109,116,105,109,101,218,11,115,111,117, + 114,99,101,95,115,105,122,101,114,121,0,0,0,114,155,0, + 0,0,114,98,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,23,95,118,97,108,105,100,97,116, + 101,95,116,105,109,101,115,116,97,109,112,95,112,121,99,63, + 2,0,0,115,20,0,0,0,24,19,10,1,12,1,16,1, + 8,1,22,1,2,255,22,2,8,254,255,128,114,160,0,0, + 0,99,4,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,4,0,0,0,67,0,0,0,115,42,0,0,0,124, + 0,100,1,100,2,133,2,25,0,124,1,107,3,114,38,116, + 0,100,3,124,2,155,2,157,2,102,1,105,0,124,3,164, + 1,142,1,130,1,100,4,83,0,41,5,97,243,1,0,0, + 86,97,108,105,100,97,116,101,32,97,32,104,97,115,104,45, + 98,97,115,101,100,32,112,121,99,32,98,121,32,99,104,101, + 99,107,105,110,103,32,116,104,101,32,114,101,97,108,32,115, + 111,117,114,99,101,32,104,97,115,104,32,97,103,97,105,110, + 115,116,32,116,104,101,32,111,110,101,32,105,110,10,32,32, + 32,32,116,104,101,32,112,121,99,32,104,101,97,100,101,114, 46,10,10,32,32,32,32,42,100,97,116,97,42,32,105,115, 32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102, 32,116,104,101,32,112,121,99,32,102,105,108,101,46,32,40, 79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,49, 54,32,98,121,116,101,115,32,97,114,101,10,32,32,32,32, - 114,101,113,117,105,114,101,100,44,32,116,104,111,117,103,104, - 46,41,10,10,32,32,32,32,42,110,97,109,101,42,32,105, - 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, - 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105, - 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117, - 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46, - 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105, - 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110, - 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109, - 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32, - 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105, - 109,112,114,111,118,101,100,32,100,101,98,117,103,103,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,119,104,101,110,32,116,104,101,32,102,108,97, - 103,115,10,32,32,32,32,102,105,101,108,100,32,105,115,32, - 105,110,118,97,108,105,100,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,32,116,114,117,110,99,97,116, - 101,100,46,10,10,32,32,32,32,78,114,28,0,0,0,122, - 20,98,97,100,32,109,97,103,105,99,32,110,117,109,98,101, - 114,32,105,110,32,122,2,58,32,250,2,123,125,233,16,0, - 0,0,122,40,114,101,97,99,104,101,100,32,69,79,70,32, - 119,104,105,108,101,32,114,101,97,100,105,110,103,32,112,121, - 99,32,104,101,97,100,101,114,32,111,102,32,233,8,0,0, - 0,233,252,255,255,255,122,14,105,110,118,97,108,105,100,32, - 102,108,97,103,115,32,122,4,32,105,110,32,41,7,218,12, - 77,65,71,73,67,95,78,85,77,66,69,82,114,139,0,0, - 0,218,16,95,118,101,114,98,111,115,101,95,109,101,115,115, - 97,103,101,114,122,0,0,0,114,4,0,0,0,218,8,69, - 79,70,69,114,114,111,114,114,38,0,0,0,41,6,114,37, - 0,0,0,114,121,0,0,0,218,11,101,120,99,95,100,101, - 116,97,105,108,115,90,5,109,97,103,105,99,114,98,0,0, - 0,114,16,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,13,95,99,108,97,115,115,105,102,121, - 95,112,121,99,30,2,0,0,115,30,0,0,0,12,16,8, - 1,16,1,12,1,16,1,12,1,10,1,12,1,8,1,16, - 1,8,2,16,1,16,1,4,1,255,128,114,156,0,0,0, - 99,5,0,0,0,0,0,0,0,0,0,0,0,6,0,0, - 0,4,0,0,0,67,0,0,0,115,120,0,0,0,116,0, - 124,0,100,1,100,2,133,2,25,0,131,1,124,1,100,3, - 64,0,107,3,114,62,100,4,124,3,155,2,157,2,125,5, - 116,1,160,2,100,5,124,5,161,2,1,0,116,3,124,5, - 102,1,105,0,124,4,164,1,142,1,130,1,124,2,100,6, - 117,1,114,116,116,0,124,0,100,2,100,7,133,2,25,0, - 131,1,124,2,100,3,64,0,107,3,114,116,116,3,100,4, - 124,3,155,2,157,2,102,1,105,0,124,4,164,1,142,1, - 130,1,100,6,83,0,41,8,97,7,2,0,0,86,97,108, - 105,100,97,116,101,32,97,32,112,121,99,32,97,103,97,105, - 110,115,116,32,116,104,101,32,115,111,117,114,99,101,32,108, - 97,115,116,45,109,111,100,105,102,105,101,100,32,116,105,109, - 101,46,10,10,32,32,32,32,42,100,97,116,97,42,32,105, - 115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111, - 102,32,116,104,101,32,112,121,99,32,102,105,108,101,46,32, - 40,79,110,108,121,32,116,104,101,32,102,105,114,115,116,32, - 49,54,32,98,121,116,101,115,32,97,114,101,10,32,32,32, - 32,114,101,113,117,105,114,101,100,46,41,10,10,32,32,32, - 32,42,115,111,117,114,99,101,95,109,116,105,109,101,42,32, - 105,115,32,116,104,101,32,108,97,115,116,32,109,111,100,105, - 102,105,101,100,32,116,105,109,101,115,116,97,109,112,32,111, - 102,32,116,104,101,32,115,111,117,114,99,101,32,102,105,108, - 101,46,10,10,32,32,32,32,42,115,111,117,114,99,101,95, - 115,105,122,101,42,32,105,115,32,78,111,110,101,32,111,114, - 32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101, - 32,115,111,117,114,99,101,32,102,105,108,101,32,105,110,32, - 98,121,116,101,115,46,10,10,32,32,32,32,42,110,97,109, - 101,42,32,105,115,32,116,104,101,32,110,97,109,101,32,111, - 102,32,116,104,101,32,109,111,100,117,108,101,32,98,101,105, - 110,103,32,105,109,112,111,114,116,101,100,46,32,73,116,32, - 105,115,32,117,115,101,100,32,102,111,114,32,108,111,103,103, - 105,110,103,46,10,10,32,32,32,32,42,101,120,99,95,100, - 101,116,97,105,108,115,42,32,105,115,32,97,32,100,105,99, - 116,105,111,110,97,114,121,32,112,97,115,115,101,100,32,116, - 111,32,73,109,112,111,114,116,69,114,114,111,114,32,105,102, - 32,105,116,32,114,97,105,115,101,100,32,102,111,114,10,32, - 32,32,32,105,109,112,114,111,118,101,100,32,100,101,98,117, - 103,103,105,110,103,46,10,10,32,32,32,32,65,110,32,73, - 109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,97, - 105,115,101,100,32,105,102,32,116,104,101,32,98,121,116,101, - 99,111,100,101,32,105,115,32,115,116,97,108,101,46,10,10, - 32,32,32,32,114,150,0,0,0,233,12,0,0,0,114,27, - 0,0,0,122,22,98,121,116,101,99,111,100,101,32,105,115, - 32,115,116,97,108,101,32,102,111,114,32,114,148,0,0,0, - 78,114,149,0,0,0,41,4,114,38,0,0,0,114,139,0, - 0,0,114,153,0,0,0,114,122,0,0,0,41,6,114,37, - 0,0,0,218,12,115,111,117,114,99,101,95,109,116,105,109, - 101,218,11,115,111,117,114,99,101,95,115,105,122,101,114,121, - 0,0,0,114,155,0,0,0,114,98,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,23,95,118, - 97,108,105,100,97,116,101,95,116,105,109,101,115,116,97,109, - 112,95,112,121,99,63,2,0,0,115,20,0,0,0,24,19, - 10,1,12,1,16,1,8,1,22,1,2,255,22,2,4,128, - 255,128,114,160,0,0,0,99,4,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, - 115,42,0,0,0,124,0,100,1,100,2,133,2,25,0,124, - 1,107,3,114,38,116,0,100,3,124,2,155,2,157,2,102, - 1,105,0,124,3,164,1,142,1,130,1,100,4,83,0,41, - 5,97,243,1,0,0,86,97,108,105,100,97,116,101,32,97, - 32,104,97,115,104,45,98,97,115,101,100,32,112,121,99,32, - 98,121,32,99,104,101,99,107,105,110,103,32,116,104,101,32, - 114,101,97,108,32,115,111,117,114,99,101,32,104,97,115,104, - 32,97,103,97,105,110,115,116,32,116,104,101,32,111,110,101, - 32,105,110,10,32,32,32,32,116,104,101,32,112,121,99,32, - 104,101,97,100,101,114,46,10,10,32,32,32,32,42,100,97, - 116,97,42,32,105,115,32,116,104,101,32,99,111,110,116,101, - 110,116,115,32,111,102,32,116,104,101,32,112,121,99,32,102, - 105,108,101,46,32,40,79,110,108,121,32,116,104,101,32,102, - 105,114,115,116,32,49,54,32,98,121,116,101,115,32,97,114, - 101,10,32,32,32,32,114,101,113,117,105,114,101,100,46,41, - 10,10,32,32,32,32,42,115,111,117,114,99,101,95,104,97, - 115,104,42,32,105,115,32,116,104,101,32,105,109,112,111,114, - 116,108,105,98,46,117,116,105,108,46,115,111,117,114,99,101, - 95,104,97,115,104,40,41,32,111,102,32,116,104,101,32,115, - 111,117,114,99,101,32,102,105,108,101,46,10,10,32,32,32, - 32,42,110,97,109,101,42,32,105,115,32,116,104,101,32,110, - 97,109,101,32,111,102,32,116,104,101,32,109,111,100,117,108, - 101,32,98,101,105,110,103,32,105,109,112,111,114,116,101,100, - 46,32,73,116,32,105,115,32,117,115,101,100,32,102,111,114, - 32,108,111,103,103,105,110,103,46,10,10,32,32,32,32,42, - 101,120,99,95,100,101,116,97,105,108,115,42,32,105,115,32, - 97,32,100,105,99,116,105,111,110,97,114,121,32,112,97,115, - 115,101,100,32,116,111,32,73,109,112,111,114,116,69,114,114, - 111,114,32,105,102,32,105,116,32,114,97,105,115,101,100,32, - 102,111,114,10,32,32,32,32,105,109,112,114,111,118,101,100, - 32,100,101,98,117,103,103,105,110,103,46,10,10,32,32,32, - 32,65,110,32,73,109,112,111,114,116,69,114,114,111,114,32, - 105,115,32,114,97,105,115,101,100,32,105,102,32,116,104,101, - 32,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97, - 108,101,46,10,10,32,32,32,32,114,150,0,0,0,114,149, - 0,0,0,122,46,104,97,115,104,32,105,110,32,98,121,116, - 101,99,111,100,101,32,100,111,101,115,110,39,116,32,109,97, - 116,99,104,32,104,97,115,104,32,111,102,32,115,111,117,114, - 99,101,32,78,41,1,114,122,0,0,0,41,4,114,37,0, - 0,0,218,11,115,111,117,114,99,101,95,104,97,115,104,114, - 121,0,0,0,114,155,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,18,95,118,97,108,105,100, - 97,116,101,95,104,97,115,104,95,112,121,99,91,2,0,0, - 115,16,0,0,0,16,17,2,1,8,1,4,255,2,2,6, - 254,4,128,255,128,114,162,0,0,0,99,4,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, - 0,0,0,115,76,0,0,0,116,0,160,1,124,0,161,1, - 125,4,116,2,124,4,116,3,131,2,114,56,116,4,160,5, - 100,1,124,2,161,2,1,0,124,3,100,2,117,1,114,52, - 116,6,160,7,124,4,124,3,161,2,1,0,124,4,83,0, - 116,8,100,3,160,9,124,2,161,1,124,1,124,2,100,4, - 141,3,130,1,41,5,122,35,67,111,109,112,105,108,101,32, - 98,121,116,101,99,111,100,101,32,97,115,32,102,111,117,110, - 100,32,105,110,32,97,32,112,121,99,46,122,21,99,111,100, - 101,32,111,98,106,101,99,116,32,102,114,111,109,32,123,33, - 114,125,78,122,23,78,111,110,45,99,111,100,101,32,111,98, - 106,101,99,116,32,105,110,32,123,33,114,125,169,2,114,121, - 0,0,0,114,52,0,0,0,41,10,218,7,109,97,114,115, - 104,97,108,90,5,108,111,97,100,115,218,10,105,115,105,110, - 115,116,97,110,99,101,218,10,95,99,111,100,101,95,116,121, - 112,101,114,139,0,0,0,114,153,0,0,0,218,4,95,105, - 109,112,90,16,95,102,105,120,95,99,111,95,102,105,108,101, - 110,97,109,101,114,122,0,0,0,114,70,0,0,0,41,5, - 114,37,0,0,0,114,121,0,0,0,114,111,0,0,0,114, - 112,0,0,0,218,4,99,111,100,101,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,17,95,99,111,109,112, - 105,108,101,95,98,121,116,101,99,111,100,101,115,2,0,0, - 115,20,0,0,0,10,2,10,1,12,1,8,1,12,1,4, - 1,10,2,4,1,6,255,255,128,114,169,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5, - 0,0,0,67,0,0,0,115,70,0,0,0,116,0,116,1, - 131,1,125,3,124,3,160,2,116,3,100,1,131,1,161,1, - 1,0,124,3,160,2,116,3,124,1,131,1,161,1,1,0, - 124,3,160,2,116,3,124,2,131,1,161,1,1,0,124,3, - 160,2,116,4,160,5,124,0,161,1,161,1,1,0,124,3, - 83,0,41,3,122,43,80,114,111,100,117,99,101,32,116,104, - 101,32,100,97,116,97,32,102,111,114,32,97,32,116,105,109, - 101,115,116,97,109,112,45,98,97,115,101,100,32,112,121,99, - 46,114,0,0,0,0,78,41,6,218,9,98,121,116,101,97, - 114,114,97,121,114,152,0,0,0,218,6,101,120,116,101,110, - 100,114,33,0,0,0,114,164,0,0,0,218,5,100,117,109, - 112,115,41,4,114,168,0,0,0,218,5,109,116,105,109,101, - 114,159,0,0,0,114,37,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,22,95,99,111,100,101, - 95,116,111,95,116,105,109,101,115,116,97,109,112,95,112,121, - 99,128,2,0,0,115,14,0,0,0,8,2,14,1,14,1, - 14,1,16,1,4,1,255,128,114,174,0,0,0,84,99,3, - 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5, - 0,0,0,67,0,0,0,115,80,0,0,0,116,0,116,1, - 131,1,125,3,100,1,124,2,100,1,62,0,66,0,125,4, - 124,3,160,2,116,3,124,4,131,1,161,1,1,0,116,4, - 124,1,131,1,100,2,107,2,115,50,74,0,130,1,124,3, - 160,2,124,1,161,1,1,0,124,3,160,2,116,5,160,6, - 124,0,161,1,161,1,1,0,124,3,83,0,41,4,122,38, - 80,114,111,100,117,99,101,32,116,104,101,32,100,97,116,97, - 32,102,111,114,32,97,32,104,97,115,104,45,98,97,115,101, - 100,32,112,121,99,46,114,3,0,0,0,114,150,0,0,0, - 78,41,7,114,170,0,0,0,114,152,0,0,0,114,171,0, - 0,0,114,33,0,0,0,114,4,0,0,0,114,164,0,0, - 0,114,172,0,0,0,41,5,114,168,0,0,0,114,161,0, - 0,0,90,7,99,104,101,99,107,101,100,114,37,0,0,0, - 114,16,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,17,95,99,111,100,101,95,116,111,95,104, - 97,115,104,95,112,121,99,138,2,0,0,115,16,0,0,0, - 8,2,12,1,14,1,16,1,10,1,16,1,4,1,255,128, - 114,175,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,6,0,0,0,67,0,0,0,115,62, - 0,0,0,100,1,100,2,108,0,125,1,116,1,160,2,124, - 0,161,1,106,3,125,2,124,1,160,4,124,2,161,1,125, - 3,116,1,160,5,100,2,100,3,161,2,125,4,124,4,160, - 6,124,0,160,6,124,3,100,1,25,0,161,1,161,1,83, - 0,41,4,122,121,68,101,99,111,100,101,32,98,121,116,101, - 115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,115, - 111,117,114,99,101,32,99,111,100,101,32,97,110,100,32,114, - 101,116,117,114,110,32,116,104,101,32,115,116,114,105,110,103, - 46,10,10,32,32,32,32,85,110,105,118,101,114,115,97,108, - 32,110,101,119,108,105,110,101,32,115,117,112,112,111,114,116, - 32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32, - 100,101,99,111,100,105,110,103,46,10,32,32,32,32,114,0, - 0,0,0,78,84,41,7,218,8,116,111,107,101,110,105,122, - 101,114,72,0,0,0,90,7,66,121,116,101,115,73,79,90, - 8,114,101,97,100,108,105,110,101,90,15,100,101,116,101,99, - 116,95,101,110,99,111,100,105,110,103,90,25,73,110,99,114, - 101,109,101,110,116,97,108,78,101,119,108,105,110,101,68,101, - 99,111,100,101,114,218,6,100,101,99,111,100,101,41,5,218, - 12,115,111,117,114,99,101,95,98,121,116,101,115,114,176,0, - 0,0,90,21,115,111,117,114,99,101,95,98,121,116,101,115, - 95,114,101,97,100,108,105,110,101,218,8,101,110,99,111,100, - 105,110,103,90,15,110,101,119,108,105,110,101,95,100,101,99, - 111,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,13,100,101,99,111,100,101,95,115,111,117,114, - 99,101,149,2,0,0,115,12,0,0,0,8,5,12,1,10, - 1,12,1,20,1,255,128,114,180,0,0,0,169,2,114,144, - 0,0,0,218,26,115,117,98,109,111,100,117,108,101,95,115, - 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,99, - 2,0,0,0,0,0,0,0,2,0,0,0,9,0,0,0, - 8,0,0,0,67,0,0,0,115,8,1,0,0,124,1,100, - 1,117,0,114,56,100,2,125,1,116,0,124,2,100,3,131, - 2,114,66,122,14,124,2,160,1,124,0,161,1,125,1,87, - 0,110,28,4,0,116,2,121,54,1,0,1,0,1,0,89, - 0,110,12,48,0,116,3,160,4,124,1,161,1,125,1,116, - 5,106,6,124,0,124,2,124,1,100,4,141,3,125,4,100, - 5,124,4,95,7,124,2,100,1,117,0,114,148,116,8,131, - 0,68,0,93,40,92,2,125,5,125,6,124,1,160,9,116, - 10,124,6,131,1,161,1,114,102,124,5,124,0,124,1,131, - 2,125,2,124,2,124,4,95,11,1,0,113,148,100,1,83, - 0,124,3,116,12,117,0,114,212,116,0,124,2,100,6,131, - 2,114,218,122,14,124,2,160,13,124,0,161,1,125,7,87, - 0,110,18,4,0,116,2,121,198,1,0,1,0,1,0,89, - 0,110,20,48,0,124,7,114,218,103,0,124,4,95,14,110, - 6,124,3,124,4,95,14,124,4,106,14,103,0,107,2,144, - 1,114,4,124,1,144,1,114,4,116,15,124,1,131,1,100, - 7,25,0,125,8,124,4,106,14,160,16,124,8,161,1,1, - 0,124,4,83,0,41,8,97,61,1,0,0,82,101,116,117, - 114,110,32,97,32,109,111,100,117,108,101,32,115,112,101,99, - 32,98,97,115,101,100,32,111,110,32,97,32,102,105,108,101, - 32,108,111,99,97,116,105,111,110,46,10,10,32,32,32,32, - 84,111,32,105,110,100,105,99,97,116,101,32,116,104,97,116, - 32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,97, - 32,112,97,99,107,97,103,101,44,32,115,101,116,10,32,32, - 32,32,115,117,98,109,111,100,117,108,101,95,115,101,97,114, - 99,104,95,108,111,99,97,116,105,111,110,115,32,116,111,32, - 97,32,108,105,115,116,32,111,102,32,100,105,114,101,99,116, - 111,114,121,32,112,97,116,104,115,46,32,32,65,110,10,32, - 32,32,32,101,109,112,116,121,32,108,105,115,116,32,105,115, - 32,115,117,102,102,105,99,105,101,110,116,44,32,116,104,111, - 117,103,104,32,105,116,115,32,110,111,116,32,111,116,104,101, - 114,119,105,115,101,32,117,115,101,102,117,108,32,116,111,32, - 116,104,101,10,32,32,32,32,105,109,112,111,114,116,32,115, - 121,115,116,101,109,46,10,10,32,32,32,32,84,104,101,32, - 108,111,97,100,101,114,32,109,117,115,116,32,116,97,107,101, - 32,97,32,115,112,101,99,32,97,115,32,105,116,115,32,111, - 110,108,121,32,95,95,105,110,105,116,95,95,40,41,32,97, - 114,103,46,10,10,32,32,32,32,78,122,9,60,117,110,107, - 110,111,119,110,62,218,12,103,101,116,95,102,105,108,101,110, - 97,109,101,169,1,218,6,111,114,105,103,105,110,84,218,10, - 105,115,95,112,97,99,107,97,103,101,114,0,0,0,0,41, - 17,114,133,0,0,0,114,183,0,0,0,114,122,0,0,0, - 114,18,0,0,0,114,85,0,0,0,114,139,0,0,0,218, - 10,77,111,100,117,108,101,83,112,101,99,90,13,95,115,101, - 116,95,102,105,108,101,97,116,116,114,218,27,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,114,115,0,0,0,114,116,0,0, - 0,114,144,0,0,0,218,9,95,80,79,80,85,76,65,84, - 69,114,186,0,0,0,114,182,0,0,0,114,55,0,0,0, - 218,6,97,112,112,101,110,100,41,9,114,121,0,0,0,90, - 8,108,111,99,97,116,105,111,110,114,144,0,0,0,114,182, - 0,0,0,218,4,115,112,101,99,218,12,108,111,97,100,101, - 114,95,99,108,97,115,115,218,8,115,117,102,102,105,120,101, - 115,114,186,0,0,0,90,7,100,105,114,110,97,109,101,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,23, - 115,112,101,99,95,102,114,111,109,95,102,105,108,101,95,108, - 111,99,97,116,105,111,110,166,2,0,0,115,64,0,0,0, - 8,12,4,4,10,1,2,2,14,1,12,1,6,1,10,2, - 16,8,6,1,8,3,14,1,14,1,10,1,6,1,4,1, - 4,2,8,3,10,2,2,1,14,1,12,1,6,1,4,2, - 8,1,6,2,12,1,6,1,12,1,12,1,4,2,255,128, - 114,194,0,0,0,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,64,0,0,0,115,88, - 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, - 2,90,4,100,3,90,5,101,6,111,30,100,4,101,7,118, - 0,90,8,101,9,100,5,100,6,132,0,131,1,90,10,101, - 11,100,7,100,8,132,0,131,1,90,12,101,11,100,14,100, - 10,100,11,132,1,131,1,90,13,101,11,100,15,100,12,100, - 13,132,1,131,1,90,14,100,9,83,0,41,16,218,21,87, - 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, - 110,100,101,114,122,62,77,101,116,97,32,112,97,116,104,32, - 102,105,110,100,101,114,32,102,111,114,32,109,111,100,117,108, - 101,115,32,100,101,99,108,97,114,101,100,32,105,110,32,116, - 104,101,32,87,105,110,100,111,119,115,32,114,101,103,105,115, - 116,114,121,46,122,59,83,111,102,116,119,97,114,101,92,80, - 121,116,104,111,110,92,80,121,116,104,111,110,67,111,114,101, - 92,123,115,121,115,95,118,101,114,115,105,111,110,125,92,77, - 111,100,117,108,101,115,92,123,102,117,108,108,110,97,109,101, - 125,122,65,83,111,102,116,119,97,114,101,92,80,121,116,104, - 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, - 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, - 108,101,115,92,123,102,117,108,108,110,97,109,101,125,92,68, - 101,98,117,103,122,6,95,100,46,112,121,100,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,67,0,0,0,115,50,0,0,0,122,16,116,0,160,1, - 116,0,106,2,124,0,161,2,87,0,83,0,4,0,116,3, - 121,48,1,0,1,0,1,0,116,0,160,1,116,0,106,4, - 124,0,161,2,6,0,89,0,83,0,48,0,114,114,0,0, - 0,41,5,218,6,119,105,110,114,101,103,90,7,79,112,101, - 110,75,101,121,90,17,72,75,69,89,95,67,85,82,82,69, - 78,84,95,85,83,69,82,114,58,0,0,0,90,18,72,75, - 69,89,95,76,79,67,65,76,95,77,65,67,72,73,78,69, - 114,19,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,14,95,111,112,101,110,95,114,101,103,105, - 115,116,114,121,246,2,0,0,115,10,0,0,0,2,2,16, - 1,12,1,20,1,255,128,122,36,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,2,0, - 0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0, - 0,0,67,0,0,0,115,130,0,0,0,124,0,106,0,114, - 14,124,0,106,1,125,2,110,6,124,0,106,2,125,2,124, - 2,106,3,124,1,100,1,116,4,106,5,100,0,100,2,133, - 2,25,0,22,0,100,3,141,2,125,3,122,60,124,0,160, - 6,124,3,161,1,143,28,125,4,116,7,160,8,124,4,100, - 4,161,2,125,5,87,0,100,0,4,0,4,0,131,3,1, - 0,110,16,49,0,115,94,48,0,1,0,1,0,1,0,89, - 0,1,0,87,0,124,5,83,0,4,0,116,9,121,128,1, - 0,1,0,1,0,89,0,100,0,83,0,48,0,41,5,78, - 122,5,37,100,46,37,100,114,39,0,0,0,41,2,114,143, - 0,0,0,90,11,115,121,115,95,118,101,114,115,105,111,110, - 114,10,0,0,0,41,10,218,11,68,69,66,85,71,95,66, - 85,73,76,68,218,18,82,69,71,73,83,84,82,89,95,75, - 69,89,95,68,69,66,85,71,218,12,82,69,71,73,83,84, - 82,89,95,75,69,89,114,70,0,0,0,114,15,0,0,0, - 218,12,118,101,114,115,105,111,110,95,105,110,102,111,114,197, - 0,0,0,114,196,0,0,0,90,10,81,117,101,114,121,86, - 97,108,117,101,114,58,0,0,0,41,6,218,3,99,108,115, - 114,143,0,0,0,90,12,114,101,103,105,115,116,114,121,95, - 107,101,121,114,20,0,0,0,90,4,104,107,101,121,218,8, - 102,105,108,101,112,97,116,104,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,16,95,115,101,97,114,99,104, - 95,114,101,103,105,115,116,114,121,253,2,0,0,115,26,0, - 0,0,6,2,8,1,6,2,6,1,16,1,6,255,2,2, - 12,1,44,1,4,3,12,254,8,1,255,128,122,38,87,105, - 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, - 100,101,114,46,95,115,101,97,114,99,104,95,114,101,103,105, - 115,116,114,121,78,99,4,0,0,0,0,0,0,0,0,0, - 0,0,8,0,0,0,8,0,0,0,67,0,0,0,115,118, - 0,0,0,124,0,160,0,124,1,161,1,125,4,124,4,100, - 0,117,0,114,22,100,0,83,0,122,12,116,1,124,4,131, - 1,1,0,87,0,110,20,4,0,116,2,121,54,1,0,1, - 0,1,0,89,0,100,0,83,0,48,0,116,3,131,0,68, - 0,93,50,92,2,125,5,125,6,124,4,160,4,116,5,124, - 6,131,1,161,1,114,62,116,6,106,7,124,1,124,5,124, - 1,124,4,131,2,124,4,100,1,141,3,125,7,124,7,2, - 0,1,0,83,0,100,0,83,0,41,2,78,114,184,0,0, - 0,41,8,114,204,0,0,0,114,57,0,0,0,114,58,0, - 0,0,114,188,0,0,0,114,115,0,0,0,114,116,0,0, - 0,114,139,0,0,0,218,16,115,112,101,99,95,102,114,111, - 109,95,108,111,97,100,101,114,41,8,114,202,0,0,0,114, - 143,0,0,0,114,52,0,0,0,218,6,116,97,114,103,101, - 116,114,203,0,0,0,114,144,0,0,0,114,193,0,0,0, - 114,191,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,9,102,105,110,100,95,115,112,101,99,12, - 3,0,0,115,32,0,0,0,10,2,8,1,4,1,2,1, - 12,1,12,1,8,1,14,1,14,1,6,1,8,1,2,1, - 6,254,8,3,4,128,255,128,122,31,87,105,110,100,111,119, - 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, - 102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, - 0,0,115,30,0,0,0,124,0,160,0,124,1,124,2,161, - 2,125,3,124,3,100,1,117,1,114,26,124,3,106,1,83, - 0,100,1,83,0,41,2,122,108,70,105,110,100,32,109,111, - 100,117,108,101,32,110,97,109,101,100,32,105,110,32,116,104, - 101,32,114,101,103,105,115,116,114,121,46,10,10,32,32,32, - 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, - 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, - 32,85,115,101,32,101,120,101,99,95,109,111,100,117,108,101, - 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, - 32,32,32,32,32,78,169,2,114,207,0,0,0,114,144,0, - 0,0,169,4,114,202,0,0,0,114,143,0,0,0,114,52, - 0,0,0,114,191,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,11,102,105,110,100,95,109,111, - 100,117,108,101,28,3,0,0,115,10,0,0,0,12,7,8, - 1,6,1,4,2,255,128,122,33,87,105,110,100,111,119,115, - 82,101,103,105,115,116,114,121,70,105,110,100,101,114,46,102, - 105,110,100,95,109,111,100,117,108,101,41,2,78,78,41,1, - 78,41,15,114,130,0,0,0,114,129,0,0,0,114,131,0, - 0,0,114,132,0,0,0,114,200,0,0,0,114,199,0,0, - 0,218,11,95,77,83,95,87,73,78,68,79,87,83,218,18, - 69,88,84,69,78,83,73,79,78,95,83,85,70,70,73,88, - 69,83,114,198,0,0,0,218,12,115,116,97,116,105,99,109, - 101,116,104,111,100,114,197,0,0,0,218,11,99,108,97,115, - 115,109,101,116,104,111,100,114,204,0,0,0,114,207,0,0, - 0,114,210,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,195,0,0,0,234, - 2,0,0,115,32,0,0,0,8,0,4,2,2,3,2,255, - 2,4,2,255,12,3,2,2,10,1,2,6,10,1,2,14, - 12,1,2,15,16,1,255,128,114,195,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,64,0,0,0,115,48,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,100, - 8,100,9,132,0,90,7,100,10,83,0,41,11,218,13,95, - 76,111,97,100,101,114,66,97,115,105,99,115,122,83,66,97, - 115,101,32,99,108,97,115,115,32,111,102,32,99,111,109,109, - 111,110,32,99,111,100,101,32,110,101,101,100,101,100,32,98, - 121,32,98,111,116,104,32,83,111,117,114,99,101,76,111,97, - 100,101,114,32,97,110,100,10,32,32,32,32,83,111,117,114, - 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, - 46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116, - 0,124,0,160,1,124,1,161,1,131,1,100,1,25,0,125, - 2,124,2,160,2,100,2,100,1,161,2,100,3,25,0,125, - 3,124,1,160,3,100,2,161,1,100,4,25,0,125,4,124, - 3,100,5,107,2,111,62,124,4,100,5,107,3,83,0,41, - 7,122,141,67,111,110,99,114,101,116,101,32,105,109,112,108, - 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110, - 115,112,101,99,116,76,111,97,100,101,114,46,105,115,95,112, - 97,99,107,97,103,101,32,98,121,32,99,104,101,99,107,105, - 110,103,32,105,102,10,32,32,32,32,32,32,32,32,116,104, - 101,32,112,97,116,104,32,114,101,116,117,114,110,101,100,32, - 98,121,32,103,101,116,95,102,105,108,101,110,97,109,101,32, - 104,97,115,32,97,32,102,105,108,101,110,97,109,101,32,111, - 102,32,39,95,95,105,110,105,116,95,95,46,112,121,39,46, - 114,3,0,0,0,114,79,0,0,0,114,0,0,0,0,114, - 39,0,0,0,218,8,95,95,105,110,105,116,95,95,78,41, - 4,114,55,0,0,0,114,183,0,0,0,114,51,0,0,0, - 114,49,0,0,0,41,5,114,123,0,0,0,114,143,0,0, - 0,114,101,0,0,0,90,13,102,105,108,101,110,97,109,101, - 95,98,97,115,101,90,9,116,97,105,108,95,110,97,109,101, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 186,0,0,0,47,3,0,0,115,10,0,0,0,18,3,16, - 1,14,1,16,1,255,128,122,24,95,76,111,97,100,101,114, - 66,97,115,105,99,115,46,105,115,95,112,97,99,107,97,103, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,169,2,122,42,85,115,101,32,100,101,102,97,117, - 108,116,32,115,101,109,97,110,116,105,99,115,32,102,111,114, - 32,109,111,100,117,108,101,32,99,114,101,97,116,105,111,110, - 46,78,114,7,0,0,0,169,2,114,123,0,0,0,114,191, + 114,101,113,117,105,114,101,100,46,41,10,10,32,32,32,32, + 42,115,111,117,114,99,101,95,104,97,115,104,42,32,105,115, + 32,116,104,101,32,105,109,112,111,114,116,108,105,98,46,117, + 116,105,108,46,115,111,117,114,99,101,95,104,97,115,104,40, + 41,32,111,102,32,116,104,101,32,115,111,117,114,99,101,32, + 102,105,108,101,46,10,10,32,32,32,32,42,110,97,109,101, + 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, + 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, + 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, + 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, + 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, + 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, + 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, + 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, + 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, + 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, + 103,105,110,103,46,10,10,32,32,32,32,65,110,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, + 115,101,100,32,105,102,32,116,104,101,32,98,121,116,101,99, + 111,100,101,32,105,115,32,115,116,97,108,101,46,10,10,32, + 32,32,32,114,150,0,0,0,114,149,0,0,0,122,46,104, + 97,115,104,32,105,110,32,98,121,116,101,99,111,100,101,32, + 100,111,101,115,110,39,116,32,109,97,116,99,104,32,104,97, + 115,104,32,111,102,32,115,111,117,114,99,101,32,78,41,1, + 114,122,0,0,0,41,4,114,37,0,0,0,218,11,115,111, + 117,114,99,101,95,104,97,115,104,114,121,0,0,0,114,155, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,13,99,114,101,97,116,101,95,109,111,100,117,108, - 101,55,3,0,0,115,4,0,0,0,4,128,255,128,122,27, - 95,76,111,97,100,101,114,66,97,115,105,99,115,46,99,114, - 101,97,116,101,95,109,111,100,117,108,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,5,0,0,0, - 67,0,0,0,115,56,0,0,0,124,0,160,0,124,1,106, - 1,161,1,125,2,124,2,100,1,117,0,114,36,116,2,100, - 2,160,3,124,1,106,1,161,1,131,1,130,1,116,4,160, - 5,116,6,124,2,124,1,106,7,161,3,1,0,100,1,83, - 0,41,3,122,19,69,120,101,99,117,116,101,32,116,104,101, - 32,109,111,100,117,108,101,46,78,122,52,99,97,110,110,111, - 116,32,108,111,97,100,32,109,111,100,117,108,101,32,123,33, - 114,125,32,119,104,101,110,32,103,101,116,95,99,111,100,101, - 40,41,32,114,101,116,117,114,110,115,32,78,111,110,101,41, - 8,218,8,103,101,116,95,99,111,100,101,114,130,0,0,0, - 114,122,0,0,0,114,70,0,0,0,114,139,0,0,0,218, - 25,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,218,4,101,120,101,99, - 114,136,0,0,0,41,3,114,123,0,0,0,218,6,109,111, - 100,117,108,101,114,168,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,11,101,120,101,99,95,109, - 111,100,117,108,101,58,3,0,0,115,16,0,0,0,12,2, - 8,1,6,1,4,1,6,255,16,2,4,128,255,128,122,25, - 95,76,111,97,100,101,114,66,97,115,105,99,115,46,101,120, - 101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0, - 0,0,115,12,0,0,0,116,0,160,1,124,0,124,1,161, - 2,83,0,41,2,122,26,84,104,105,115,32,109,111,100,117, - 108,101,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,78,41,2,114,139,0,0,0,218,17,95,108,111,97,100, - 95,109,111,100,117,108,101,95,115,104,105,109,169,2,114,123, - 0,0,0,114,143,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,11,108,111,97,100,95,109,111, - 100,117,108,101,66,3,0,0,115,4,0,0,0,12,2,255, - 128,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, - 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114, - 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, - 0,0,0,114,186,0,0,0,114,219,0,0,0,114,224,0, - 0,0,114,227,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,215,0,0,0, - 42,3,0,0,115,14,0,0,0,8,0,4,2,8,3,8, - 8,8,3,12,8,255,128,114,215,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,64,0,0,0,115,74,0,0,0,101,0,90,1,100,0, - 90,2,100,1,100,2,132,0,90,3,100,3,100,4,132,0, - 90,4,100,5,100,6,132,0,90,5,100,7,100,8,132,0, - 90,6,100,9,100,10,132,0,90,7,100,11,100,12,156,1, - 100,13,100,14,132,2,90,8,100,15,100,16,132,0,90,9, - 100,17,83,0,41,18,218,12,83,111,117,114,99,101,76,111, - 97,100,101,114,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,116,0,130,1,41,2,122,165,79,112,116,105,111,110, - 97,108,32,109,101,116,104,111,100,32,116,104,97,116,32,114, - 101,116,117,114,110,115,32,116,104,101,32,109,111,100,105,102, - 105,99,97,116,105,111,110,32,116,105,109,101,32,40,97,110, - 32,105,110,116,41,32,102,111,114,32,116,104,101,10,32,32, - 32,32,32,32,32,32,115,112,101,99,105,102,105,101,100,32, - 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, - 32,32,32,32,32,32,32,82,97,105,115,101,115,32,79,83, - 69,114,114,111,114,32,119,104,101,110,32,116,104,101,32,112, - 97,116,104,32,99,97,110,110,111,116,32,98,101,32,104,97, - 110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,78, - 41,1,114,58,0,0,0,169,2,114,123,0,0,0,114,52, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,10,112,97,116,104,95,109,116,105,109,101,73,3, - 0,0,115,4,0,0,0,4,6,255,128,122,23,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,0,0,0, - 0,2,0,0,0,4,0,0,0,67,0,0,0,115,14,0, - 0,0,100,1,124,0,160,0,124,1,161,1,105,1,83,0, - 41,3,97,158,1,0,0,79,112,116,105,111,110,97,108,32, - 109,101,116,104,111,100,32,114,101,116,117,114,110,105,110,103, - 32,97,32,109,101,116,97,100,97,116,97,32,100,105,99,116, - 32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105, - 101,100,10,32,32,32,32,32,32,32,32,112,97,116,104,32, - 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, - 32,32,80,111,115,115,105,98,108,101,32,107,101,121,115,58, - 10,32,32,32,32,32,32,32,32,45,32,39,109,116,105,109, - 101,39,32,40,109,97,110,100,97,116,111,114,121,41,32,105, - 115,32,116,104,101,32,110,117,109,101,114,105,99,32,116,105, - 109,101,115,116,97,109,112,32,111,102,32,108,97,115,116,32, - 115,111,117,114,99,101,10,32,32,32,32,32,32,32,32,32, - 32,99,111,100,101,32,109,111,100,105,102,105,99,97,116,105, - 111,110,59,10,32,32,32,32,32,32,32,32,45,32,39,115, - 105,122,101,39,32,40,111,112,116,105,111,110,97,108,41,32, - 105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98, - 121,116,101,115,32,111,102,32,116,104,101,32,115,111,117,114, - 99,101,32,99,111,100,101,46,10,10,32,32,32,32,32,32, - 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, - 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, - 115,32,116,104,101,32,108,111,97,100,101,114,32,116,111,32, - 114,101,97,100,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,115,46,10,32,32,32,32,32,32,32,32,82,97,105, - 115,101,115,32,79,83,69,114,114,111,114,32,119,104,101,110, - 32,116,104,101,32,112,97,116,104,32,99,97,110,110,111,116, - 32,98,101,32,104,97,110,100,108,101,100,46,10,32,32,32, - 32,32,32,32,32,114,173,0,0,0,78,41,1,114,230,0, - 0,0,114,229,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,10,112,97,116,104,95,115,116,97, - 116,115,81,3,0,0,115,4,0,0,0,14,12,255,128,122, - 23,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,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, - 0,115,12,0,0,0,124,0,160,0,124,2,124,3,161,2, - 83,0,41,2,122,228,79,112,116,105,111,110,97,108,32,109, - 101,116,104,111,100,32,119,104,105,99,104,32,119,114,105,116, - 101,115,32,100,97,116,97,32,40,98,121,116,101,115,41,32, - 116,111,32,97,32,102,105,108,101,32,112,97,116,104,32,40, - 97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,32, - 32,73,109,112,108,101,109,101,110,116,105,110,103,32,116,104, - 105,115,32,109,101,116,104,111,100,32,97,108,108,111,119,115, - 32,102,111,114,32,116,104,101,32,119,114,105,116,105,110,103, - 32,111,102,32,98,121,116,101,99,111,100,101,32,102,105,108, - 101,115,46,10,10,32,32,32,32,32,32,32,32,84,104,101, - 32,115,111,117,114,99,101,32,112,97,116,104,32,105,115,32, - 110,101,101,100,101,100,32,105,110,32,111,114,100,101,114,32, - 116,111,32,99,111,114,114,101,99,116,108,121,32,116,114,97, - 110,115,102,101,114,32,112,101,114,109,105,115,115,105,111,110, - 115,10,32,32,32,32,32,32,32,32,78,41,1,218,8,115, - 101,116,95,100,97,116,97,41,4,114,123,0,0,0,114,112, - 0,0,0,90,10,99,97,99,104,101,95,112,97,116,104,114, + 0,0,218,18,95,118,97,108,105,100,97,116,101,95,104,97, + 115,104,95,112,121,99,91,2,0,0,115,16,0,0,0,16, + 17,2,1,8,1,4,255,2,2,6,254,4,255,255,128,114, + 162,0,0,0,99,4,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,5,0,0,0,67,0,0,0,115,76,0, + 0,0,116,0,160,1,124,0,161,1,125,4,116,2,124,4, + 116,3,131,2,114,56,116,4,160,5,100,1,124,2,161,2, + 1,0,124,3,100,2,117,1,114,52,116,6,160,7,124,4, + 124,3,161,2,1,0,124,4,83,0,116,8,100,3,160,9, + 124,2,161,1,124,1,124,2,100,4,141,3,130,1,41,5, + 122,35,67,111,109,112,105,108,101,32,98,121,116,101,99,111, + 100,101,32,97,115,32,102,111,117,110,100,32,105,110,32,97, + 32,112,121,99,46,122,21,99,111,100,101,32,111,98,106,101, + 99,116,32,102,114,111,109,32,123,33,114,125,78,122,23,78, + 111,110,45,99,111,100,101,32,111,98,106,101,99,116,32,105, + 110,32,123,33,114,125,169,2,114,121,0,0,0,114,52,0, + 0,0,41,10,218,7,109,97,114,115,104,97,108,90,5,108, + 111,97,100,115,218,10,105,115,105,110,115,116,97,110,99,101, + 218,10,95,99,111,100,101,95,116,121,112,101,114,139,0,0, + 0,114,153,0,0,0,218,4,95,105,109,112,90,16,95,102, + 105,120,95,99,111,95,102,105,108,101,110,97,109,101,114,122, + 0,0,0,114,70,0,0,0,41,5,114,37,0,0,0,114, + 121,0,0,0,114,111,0,0,0,114,112,0,0,0,218,4, + 99,111,100,101,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,17,95,99,111,109,112,105,108,101,95,98,121, + 116,101,99,111,100,101,115,2,0,0,115,20,0,0,0,10, + 2,10,1,12,1,8,1,12,1,4,1,10,2,4,1,6, + 255,255,128,114,169,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, + 0,115,70,0,0,0,116,0,116,1,131,1,125,3,124,3, + 160,2,116,3,100,1,131,1,161,1,1,0,124,3,160,2, + 116,3,124,1,131,1,161,1,1,0,124,3,160,2,116,3, + 124,2,131,1,161,1,1,0,124,3,160,2,116,4,160,5, + 124,0,161,1,161,1,1,0,124,3,83,0,41,3,122,43, + 80,114,111,100,117,99,101,32,116,104,101,32,100,97,116,97, + 32,102,111,114,32,97,32,116,105,109,101,115,116,97,109,112, + 45,98,97,115,101,100,32,112,121,99,46,114,0,0,0,0, + 78,41,6,218,9,98,121,116,101,97,114,114,97,121,114,152, + 0,0,0,218,6,101,120,116,101,110,100,114,33,0,0,0, + 114,164,0,0,0,218,5,100,117,109,112,115,41,4,114,168, + 0,0,0,218,5,109,116,105,109,101,114,159,0,0,0,114, 37,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,15,95,99,97,99,104,101,95,98,121,116,101, - 99,111,100,101,95,3,0,0,115,4,0,0,0,12,8,255, - 128,122,28,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,0,0,0,0,3,0,0,0, - 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,122,150,79,112,116,105,111,110,97,108,32,109,101, - 116,104,111,100,32,119,104,105,99,104,32,119,114,105,116,101, - 115,32,100,97,116,97,32,40,98,121,116,101,115,41,32,116, - 111,32,97,32,102,105,108,101,32,112,97,116,104,32,40,97, - 32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,32, - 73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,105, - 115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,32, - 102,111,114,32,116,104,101,32,119,114,105,116,105,110,103,32, - 111,102,32,98,121,116,101,99,111,100,101,32,102,105,108,101, - 115,46,10,32,32,32,32,32,32,32,32,78,114,7,0,0, - 0,41,3,114,123,0,0,0,114,52,0,0,0,114,37,0, + 0,0,0,218,22,95,99,111,100,101,95,116,111,95,116,105, + 109,101,115,116,97,109,112,95,112,121,99,128,2,0,0,115, + 14,0,0,0,8,2,14,1,14,1,14,1,16,1,4,1, + 255,128,114,174,0,0,0,84,99,3,0,0,0,0,0,0, + 0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,0, + 0,115,80,0,0,0,116,0,116,1,131,1,125,3,100,1, + 124,2,100,1,62,0,66,0,125,4,124,3,160,2,116,3, + 124,4,131,1,161,1,1,0,116,4,124,1,131,1,100,2, + 107,2,115,50,74,0,130,1,124,3,160,2,124,1,161,1, + 1,0,124,3,160,2,116,5,160,6,124,0,161,1,161,1, + 1,0,124,3,83,0,41,4,122,38,80,114,111,100,117,99, + 101,32,116,104,101,32,100,97,116,97,32,102,111,114,32,97, + 32,104,97,115,104,45,98,97,115,101,100,32,112,121,99,46, + 114,3,0,0,0,114,150,0,0,0,78,41,7,114,170,0, + 0,0,114,152,0,0,0,114,171,0,0,0,114,33,0,0, + 0,114,4,0,0,0,114,164,0,0,0,114,172,0,0,0, + 41,5,114,168,0,0,0,114,161,0,0,0,90,7,99,104, + 101,99,107,101,100,114,37,0,0,0,114,16,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,17, + 95,99,111,100,101,95,116,111,95,104,97,115,104,95,112,121, + 99,138,2,0,0,115,16,0,0,0,8,2,12,1,14,1, + 16,1,10,1,16,1,4,1,255,128,114,175,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 6,0,0,0,67,0,0,0,115,62,0,0,0,100,1,100, + 2,108,0,125,1,116,1,160,2,124,0,161,1,106,3,125, + 2,124,1,160,4,124,2,161,1,125,3,116,1,160,5,100, + 2,100,3,161,2,125,4,124,4,160,6,124,0,160,6,124, + 3,100,1,25,0,161,1,161,1,83,0,41,4,122,121,68, + 101,99,111,100,101,32,98,121,116,101,115,32,114,101,112,114, + 101,115,101,110,116,105,110,103,32,115,111,117,114,99,101,32, + 99,111,100,101,32,97,110,100,32,114,101,116,117,114,110,32, + 116,104,101,32,115,116,114,105,110,103,46,10,10,32,32,32, + 32,85,110,105,118,101,114,115,97,108,32,110,101,119,108,105, + 110,101,32,115,117,112,112,111,114,116,32,105,115,32,117,115, + 101,100,32,105,110,32,116,104,101,32,100,101,99,111,100,105, + 110,103,46,10,32,32,32,32,114,0,0,0,0,78,84,41, + 7,218,8,116,111,107,101,110,105,122,101,114,72,0,0,0, + 90,7,66,121,116,101,115,73,79,90,8,114,101,97,100,108, + 105,110,101,90,15,100,101,116,101,99,116,95,101,110,99,111, + 100,105,110,103,90,25,73,110,99,114,101,109,101,110,116,97, + 108,78,101,119,108,105,110,101,68,101,99,111,100,101,114,218, + 6,100,101,99,111,100,101,41,5,218,12,115,111,117,114,99, + 101,95,98,121,116,101,115,114,176,0,0,0,90,21,115,111, + 117,114,99,101,95,98,121,116,101,115,95,114,101,97,100,108, + 105,110,101,218,8,101,110,99,111,100,105,110,103,90,15,110, + 101,119,108,105,110,101,95,100,101,99,111,100,101,114,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,13,100, + 101,99,111,100,101,95,115,111,117,114,99,101,149,2,0,0, + 115,12,0,0,0,8,5,12,1,10,1,12,1,20,1,255, + 128,114,180,0,0,0,169,2,114,144,0,0,0,218,26,115, + 117,98,109,111,100,117,108,101,95,115,101,97,114,99,104,95, + 108,111,99,97,116,105,111,110,115,99,2,0,0,0,0,0, + 0,0,2,0,0,0,9,0,0,0,8,0,0,0,67,0, + 0,0,115,8,1,0,0,124,1,100,1,117,0,114,56,100, + 2,125,1,116,0,124,2,100,3,131,2,114,66,122,14,124, + 2,160,1,124,0,161,1,125,1,87,0,110,28,4,0,116, + 2,121,54,1,0,1,0,1,0,89,0,110,12,48,0,116, + 3,160,4,124,1,161,1,125,1,116,5,106,6,124,0,124, + 2,124,1,100,4,141,3,125,4,100,5,124,4,95,7,124, + 2,100,1,117,0,114,148,116,8,131,0,68,0,93,40,92, + 2,125,5,125,6,124,1,160,9,116,10,124,6,131,1,161, + 1,114,102,124,5,124,0,124,1,131,2,125,2,124,2,124, + 4,95,11,1,0,113,148,100,1,83,0,124,3,116,12,117, + 0,114,212,116,0,124,2,100,6,131,2,114,218,122,14,124, + 2,160,13,124,0,161,1,125,7,87,0,110,18,4,0,116, + 2,121,198,1,0,1,0,1,0,89,0,110,20,48,0,124, + 7,114,218,103,0,124,4,95,14,110,6,124,3,124,4,95, + 14,124,4,106,14,103,0,107,2,144,1,114,4,124,1,144, + 1,114,4,116,15,124,1,131,1,100,7,25,0,125,8,124, + 4,106,14,160,16,124,8,161,1,1,0,124,4,83,0,41, + 8,97,61,1,0,0,82,101,116,117,114,110,32,97,32,109, + 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, + 32,111,110,32,97,32,102,105,108,101,32,108,111,99,97,116, + 105,111,110,46,10,10,32,32,32,32,84,111,32,105,110,100, + 105,99,97,116,101,32,116,104,97,116,32,116,104,101,32,109, + 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, + 103,101,44,32,115,101,116,10,32,32,32,32,115,117,98,109, + 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, + 97,116,105,111,110,115,32,116,111,32,97,32,108,105,115,116, + 32,111,102,32,100,105,114,101,99,116,111,114,121,32,112,97, + 116,104,115,46,32,32,65,110,10,32,32,32,32,101,109,112, + 116,121,32,108,105,115,116,32,105,115,32,115,117,102,102,105, + 99,105,101,110,116,44,32,116,104,111,117,103,104,32,105,116, + 115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32, + 117,115,101,102,117,108,32,116,111,32,116,104,101,10,32,32, + 32,32,105,109,112,111,114,116,32,115,121,115,116,101,109,46, + 10,10,32,32,32,32,84,104,101,32,108,111,97,100,101,114, + 32,109,117,115,116,32,116,97,107,101,32,97,32,115,112,101, + 99,32,97,115,32,105,116,115,32,111,110,108,121,32,95,95, + 105,110,105,116,95,95,40,41,32,97,114,103,46,10,10,32, + 32,32,32,78,122,9,60,117,110,107,110,111,119,110,62,218, + 12,103,101,116,95,102,105,108,101,110,97,109,101,169,1,218, + 6,111,114,105,103,105,110,84,218,10,105,115,95,112,97,99, + 107,97,103,101,114,0,0,0,0,41,17,114,133,0,0,0, + 114,183,0,0,0,114,122,0,0,0,114,18,0,0,0,114, + 85,0,0,0,114,139,0,0,0,218,10,77,111,100,117,108, + 101,83,112,101,99,90,13,95,115,101,116,95,102,105,108,101, + 97,116,116,114,218,27,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,114,115,0,0,0,114,116,0,0,0,114,144,0,0,0, + 218,9,95,80,79,80,85,76,65,84,69,114,186,0,0,0, + 114,182,0,0,0,114,55,0,0,0,218,6,97,112,112,101, + 110,100,41,9,114,121,0,0,0,90,8,108,111,99,97,116, + 105,111,110,114,144,0,0,0,114,182,0,0,0,218,4,115, + 112,101,99,218,12,108,111,97,100,101,114,95,99,108,97,115, + 115,218,8,115,117,102,102,105,120,101,115,114,186,0,0,0, + 90,7,100,105,114,110,97,109,101,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,23,115,112,101,99,95,102, + 114,111,109,95,102,105,108,101,95,108,111,99,97,116,105,111, + 110,166,2,0,0,115,64,0,0,0,8,12,4,4,10,1, + 2,2,14,1,12,1,6,1,10,2,16,8,6,1,8,3, + 14,1,14,1,10,1,6,1,4,1,4,2,8,3,10,2, + 2,1,14,1,12,1,6,1,4,2,8,1,6,2,12,1, + 6,1,12,1,12,1,4,2,255,128,114,194,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,64,0,0,0,115,88,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,100,2,90,4,100,3,90, + 5,101,6,111,30,100,4,101,7,118,0,90,8,101,9,100, + 5,100,6,132,0,131,1,90,10,101,11,100,7,100,8,132, + 0,131,1,90,12,101,11,100,14,100,10,100,11,132,1,131, + 1,90,13,101,11,100,15,100,12,100,13,132,1,131,1,90, + 14,100,9,83,0,41,16,218,21,87,105,110,100,111,119,115, + 82,101,103,105,115,116,114,121,70,105,110,100,101,114,122,62, + 77,101,116,97,32,112,97,116,104,32,102,105,110,100,101,114, + 32,102,111,114,32,109,111,100,117,108,101,115,32,100,101,99, + 108,97,114,101,100,32,105,110,32,116,104,101,32,87,105,110, + 100,111,119,115,32,114,101,103,105,115,116,114,121,46,122,59, + 83,111,102,116,119,97,114,101,92,80,121,116,104,111,110,92, + 80,121,116,104,111,110,67,111,114,101,92,123,115,121,115,95, + 118,101,114,115,105,111,110,125,92,77,111,100,117,108,101,115, + 92,123,102,117,108,108,110,97,109,101,125,122,65,83,111,102, + 116,119,97,114,101,92,80,121,116,104,111,110,92,80,121,116, + 104,111,110,67,111,114,101,92,123,115,121,115,95,118,101,114, + 115,105,111,110,125,92,77,111,100,117,108,101,115,92,123,102, + 117,108,108,110,97,109,101,125,92,68,101,98,117,103,122,6, + 95,100,46,112,121,100,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,8,0,0,0,67,0,0,0,115, + 50,0,0,0,122,16,116,0,160,1,116,0,106,2,124,0, + 161,2,87,0,83,0,4,0,116,3,121,48,1,0,1,0, + 1,0,116,0,160,1,116,0,106,4,124,0,161,2,6,0, + 89,0,83,0,48,0,114,114,0,0,0,41,5,218,6,119, + 105,110,114,101,103,90,7,79,112,101,110,75,101,121,90,17, + 72,75,69,89,95,67,85,82,82,69,78,84,95,85,83,69, + 82,114,58,0,0,0,90,18,72,75,69,89,95,76,79,67, + 65,76,95,77,65,67,72,73,78,69,114,19,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,14, + 95,111,112,101,110,95,114,101,103,105,115,116,114,121,246,2, + 0,0,115,10,0,0,0,2,2,16,1,12,1,20,1,255, + 128,122,36,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,2,0,0,0,0,0,0,0, + 0,0,0,0,6,0,0,0,8,0,0,0,67,0,0,0, + 115,130,0,0,0,124,0,106,0,114,14,124,0,106,1,125, + 2,110,6,124,0,106,2,125,2,124,2,106,3,124,1,100, + 1,116,4,106,5,100,0,100,2,133,2,25,0,22,0,100, + 3,141,2,125,3,122,60,124,0,160,6,124,3,161,1,143, + 28,125,4,116,7,160,8,124,4,100,4,161,2,125,5,87, + 0,100,0,4,0,4,0,131,3,1,0,110,16,49,0,115, + 94,48,0,1,0,1,0,1,0,89,0,1,0,87,0,124, + 5,83,0,4,0,116,9,121,128,1,0,1,0,1,0,89, + 0,100,0,83,0,48,0,41,5,78,122,5,37,100,46,37, + 100,114,39,0,0,0,41,2,114,143,0,0,0,90,11,115, + 121,115,95,118,101,114,115,105,111,110,114,10,0,0,0,41, + 10,218,11,68,69,66,85,71,95,66,85,73,76,68,218,18, + 82,69,71,73,83,84,82,89,95,75,69,89,95,68,69,66, + 85,71,218,12,82,69,71,73,83,84,82,89,95,75,69,89, + 114,70,0,0,0,114,15,0,0,0,218,12,118,101,114,115, + 105,111,110,95,105,110,102,111,114,197,0,0,0,114,196,0, + 0,0,90,10,81,117,101,114,121,86,97,108,117,101,114,58, + 0,0,0,41,6,218,3,99,108,115,114,143,0,0,0,90, + 12,114,101,103,105,115,116,114,121,95,107,101,121,114,20,0, + 0,0,90,4,104,107,101,121,218,8,102,105,108,101,112,97, + 116,104,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,16,95,115,101,97,114,99,104,95,114,101,103,105,115, + 116,114,121,253,2,0,0,115,26,0,0,0,6,2,8,1, + 6,2,6,1,16,1,6,255,2,2,12,1,44,1,4,3, + 12,254,8,1,255,128,122,38,87,105,110,100,111,119,115,82, + 101,103,105,115,116,114,121,70,105,110,100,101,114,46,95,115, + 101,97,114,99,104,95,114,101,103,105,115,116,114,121,78,99, + 4,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0, + 8,0,0,0,67,0,0,0,115,118,0,0,0,124,0,160, + 0,124,1,161,1,125,4,124,4,100,0,117,0,114,22,100, + 0,83,0,122,12,116,1,124,4,131,1,1,0,87,0,110, + 20,4,0,116,2,121,54,1,0,1,0,1,0,89,0,100, + 0,83,0,48,0,116,3,131,0,68,0,93,50,92,2,125, + 5,125,6,124,4,160,4,116,5,124,6,131,1,161,1,114, + 62,116,6,106,7,124,1,124,5,124,1,124,4,131,2,124, + 4,100,1,141,3,125,7,124,7,2,0,1,0,83,0,100, + 0,83,0,41,2,78,114,184,0,0,0,41,8,114,204,0, + 0,0,114,57,0,0,0,114,58,0,0,0,114,188,0,0, + 0,114,115,0,0,0,114,116,0,0,0,114,139,0,0,0, + 218,16,115,112,101,99,95,102,114,111,109,95,108,111,97,100, + 101,114,41,8,114,202,0,0,0,114,143,0,0,0,114,52, + 0,0,0,218,6,116,97,114,103,101,116,114,203,0,0,0, + 114,144,0,0,0,114,193,0,0,0,114,191,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,9, + 102,105,110,100,95,115,112,101,99,12,3,0,0,115,32,0, + 0,0,10,2,8,1,4,1,2,1,12,1,12,1,8,1, + 14,1,14,1,6,1,8,1,2,1,6,254,8,3,4,251, + 255,128,122,31,87,105,110,100,111,119,115,82,101,103,105,115, + 116,114,121,70,105,110,100,101,114,46,102,105,110,100,95,115, + 112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,4,0,0,0,67,0,0,0,115,30,0,0, + 0,124,0,160,0,124,1,124,2,161,2,125,3,124,3,100, + 1,117,1,114,26,124,3,106,1,83,0,100,1,83,0,41, + 2,122,108,70,105,110,100,32,109,111,100,117,108,101,32,110, + 97,109,101,100,32,105,110,32,116,104,101,32,114,101,103,105, + 115,116,114,121,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101, + 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, + 169,2,114,207,0,0,0,114,144,0,0,0,169,4,114,202, + 0,0,0,114,143,0,0,0,114,52,0,0,0,114,191,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,232,0,0,0,105,3,0,0,115,4,0,0,0,4, - 128,255,128,122,21,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,0,0,0,0,5,0,0,0,10,0,0,0,67, - 0,0,0,115,70,0,0,0,124,0,160,0,124,1,161,1, - 125,2,122,20,124,0,160,1,124,2,161,1,125,3,87,0, - 116,4,124,3,131,1,83,0,4,0,116,2,121,68,1,0, - 125,4,1,0,122,14,116,3,100,1,124,1,100,2,141,2, - 124,4,130,2,100,3,125,4,126,4,48,0,48,0,41,4, - 122,52,67,111,110,99,114,101,116,101,32,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,115, - 112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,115, - 111,117,114,99,101,46,122,39,115,111,117,114,99,101,32,110, - 111,116,32,97,118,97,105,108,97,98,108,101,32,116,104,114, - 111,117,103,104,32,103,101,116,95,100,97,116,97,40,41,114, - 120,0,0,0,78,41,5,114,183,0,0,0,218,8,103,101, - 116,95,100,97,116,97,114,58,0,0,0,114,122,0,0,0, - 114,180,0,0,0,41,5,114,123,0,0,0,114,143,0,0, - 0,114,52,0,0,0,114,178,0,0,0,218,3,101,120,99, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 10,103,101,116,95,115,111,117,114,99,101,112,3,0,0,115, - 24,0,0,0,10,2,2,1,12,1,8,4,14,253,4,1, - 2,1,4,255,2,1,2,255,10,128,255,128,122,23,83,111, - 117,114,99,101,76,111,97,100,101,114,46,103,101,116,95,115, - 111,117,114,99,101,114,109,0,0,0,41,1,218,9,95,111, - 112,116,105,109,105,122,101,99,3,0,0,0,0,0,0,0, - 1,0,0,0,4,0,0,0,8,0,0,0,67,0,0,0, - 115,22,0,0,0,116,0,106,1,116,2,124,1,124,2,100, - 1,100,2,124,3,100,3,141,6,83,0,41,5,122,130,82, - 101,116,117,114,110,32,116,104,101,32,99,111,100,101,32,111, - 98,106,101,99,116,32,99,111,109,112,105,108,101,100,32,102, - 114,111,109,32,115,111,117,114,99,101,46,10,10,32,32,32, - 32,32,32,32,32,84,104,101,32,39,100,97,116,97,39,32, - 97,114,103,117,109,101,110,116,32,99,97,110,32,98,101,32, - 97,110,121,32,111,98,106,101,99,116,32,116,121,112,101,32, - 116,104,97,116,32,99,111,109,112,105,108,101,40,41,32,115, - 117,112,112,111,114,116,115,46,10,32,32,32,32,32,32,32, - 32,114,222,0,0,0,84,41,2,218,12,100,111,110,116,95, - 105,110,104,101,114,105,116,114,89,0,0,0,78,41,3,114, - 139,0,0,0,114,221,0,0,0,218,7,99,111,109,112,105, - 108,101,41,4,114,123,0,0,0,114,37,0,0,0,114,52, - 0,0,0,114,237,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,14,115,111,117,114,99,101,95, - 116,111,95,99,111,100,101,122,3,0,0,115,8,0,0,0, - 12,5,4,1,6,255,255,128,122,27,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,0,0, - 0,0,15,0,0,0,9,0,0,0,67,0,0,0,115,28, - 2,0,0,124,0,160,0,124,1,161,1,125,2,100,1,125, - 3,100,1,125,4,100,1,125,5,100,2,125,6,100,3,125, - 7,122,12,116,1,124,2,131,1,125,8,87,0,110,24,4, - 0,116,2,121,66,1,0,1,0,1,0,100,1,125,8,89, - 0,144,1,110,42,48,0,122,14,124,0,160,3,124,2,161, - 1,125,9,87,0,110,20,4,0,116,4,121,102,1,0,1, - 0,1,0,89,0,144,1,110,6,48,0,116,5,124,9,100, - 4,25,0,131,1,125,3,122,14,124,0,160,6,124,8,161, - 1,125,10,87,0,110,18,4,0,116,4,121,148,1,0,1, - 0,1,0,89,0,110,216,48,0,124,1,124,8,100,5,156, - 2,125,11,122,148,116,7,124,10,124,1,124,11,131,3,125, - 12,116,8,124,10,131,1,100,6,100,1,133,2,25,0,125, - 13,124,12,100,7,64,0,100,8,107,3,125,6,124,6,144, - 1,114,30,124,12,100,9,64,0,100,8,107,3,125,7,116, - 9,106,10,100,10,107,3,144,1,114,50,124,7,115,248,116, - 9,106,10,100,11,107,2,144,1,114,50,124,0,160,6,124, - 2,161,1,125,4,116,9,160,11,116,12,124,4,161,2,125, - 5,116,13,124,10,124,5,124,1,124,11,131,4,1,0,110, - 20,116,14,124,10,124,3,124,9,100,12,25,0,124,1,124, - 11,131,5,1,0,87,0,110,24,4,0,116,15,116,16,102, - 2,144,1,121,76,1,0,1,0,1,0,89,0,110,32,48, - 0,116,17,160,18,100,13,124,8,124,2,161,3,1,0,116, - 19,124,13,124,1,124,8,124,2,100,14,141,4,83,0,124, - 4,100,1,117,0,144,1,114,128,124,0,160,6,124,2,161, - 1,125,4,124,0,160,20,124,4,124,2,161,2,125,14,116, - 17,160,18,100,15,124,2,161,2,1,0,116,21,106,22,144, - 2,115,24,124,8,100,1,117,1,144,2,114,24,124,3,100, - 1,117,1,144,2,114,24,124,6,144,1,114,220,124,5,100, - 1,117,0,144,1,114,206,116,9,160,11,124,4,161,1,125, - 5,116,23,124,14,124,5,124,7,131,3,125,10,110,16,116, - 24,124,14,124,3,116,25,124,4,131,1,131,3,125,10,122, - 20,124,0,160,26,124,2,124,8,124,10,161,3,1,0,87, - 0,124,14,83,0,4,0,116,2,144,2,121,22,1,0,1, - 0,1,0,89,0,124,14,83,0,48,0,124,14,83,0,41, - 16,122,190,67,111,110,99,114,101,116,101,32,105,109,112,108, - 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110, - 115,112,101,99,116,76,111,97,100,101,114,46,103,101,116,95, - 99,111,100,101,46,10,10,32,32,32,32,32,32,32,32,82, - 101,97,100,105,110,103,32,111,102,32,98,121,116,101,99,111, - 100,101,32,114,101,113,117,105,114,101,115,32,112,97,116,104, - 95,115,116,97,116,115,32,116,111,32,98,101,32,105,109,112, - 108,101,109,101,110,116,101,100,46,32,84,111,32,119,114,105, - 116,101,10,32,32,32,32,32,32,32,32,98,121,116,101,99, - 111,100,101,44,32,115,101,116,95,100,97,116,97,32,109,117, - 115,116,32,97,108,115,111,32,98,101,32,105,109,112,108,101, - 109,101,110,116,101,100,46,10,10,32,32,32,32,32,32,32, - 32,78,70,84,114,173,0,0,0,114,163,0,0,0,114,149, - 0,0,0,114,3,0,0,0,114,0,0,0,0,114,39,0, - 0,0,90,5,110,101,118,101,114,90,6,97,108,119,97,121, - 115,218,4,115,105,122,101,122,13,123,125,32,109,97,116,99, - 104,101,115,32,123,125,41,3,114,121,0,0,0,114,111,0, - 0,0,114,112,0,0,0,122,19,99,111,100,101,32,111,98, - 106,101,99,116,32,102,114,111,109,32,123,125,41,27,114,183, - 0,0,0,114,102,0,0,0,114,88,0,0,0,114,231,0, - 0,0,114,58,0,0,0,114,30,0,0,0,114,234,0,0, - 0,114,156,0,0,0,218,10,109,101,109,111,114,121,118,105, - 101,119,114,167,0,0,0,90,21,99,104,101,99,107,95,104, - 97,115,104,95,98,97,115,101,100,95,112,121,99,115,114,161, - 0,0,0,218,17,95,82,65,87,95,77,65,71,73,67,95, - 78,85,77,66,69,82,114,162,0,0,0,114,160,0,0,0, - 114,122,0,0,0,114,154,0,0,0,114,139,0,0,0,114, - 153,0,0,0,114,169,0,0,0,114,240,0,0,0,114,15, - 0,0,0,218,19,100,111,110,116,95,119,114,105,116,101,95, - 98,121,116,101,99,111,100,101,114,175,0,0,0,114,174,0, - 0,0,114,4,0,0,0,114,233,0,0,0,41,15,114,123, - 0,0,0,114,143,0,0,0,114,112,0,0,0,114,158,0, - 0,0,114,178,0,0,0,114,161,0,0,0,90,10,104,97, - 115,104,95,98,97,115,101,100,90,12,99,104,101,99,107,95, - 115,111,117,114,99,101,114,111,0,0,0,218,2,115,116,114, - 37,0,0,0,114,155,0,0,0,114,16,0,0,0,90,10, - 98,121,116,101,115,95,100,97,116,97,90,11,99,111,100,101, - 95,111,98,106,101,99,116,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,220,0,0,0,130,3,0,0,115, - 160,0,0,0,10,7,4,1,4,1,4,1,4,1,4,1, - 2,1,12,1,12,1,12,1,2,2,14,1,12,1,8,1, - 12,2,2,1,14,1,12,1,6,1,2,3,2,1,6,254, - 2,4,12,1,16,1,12,1,6,1,12,1,12,1,2,1, - 2,255,8,2,4,254,10,3,4,1,2,1,2,1,4,254, - 8,4,2,1,6,255,2,3,2,1,2,1,6,1,2,1, - 2,1,8,251,18,7,6,1,8,2,2,1,4,255,6,2, - 2,1,2,1,6,254,10,3,10,1,12,1,12,1,18,1, - 6,1,4,255,6,2,10,1,10,1,14,1,6,2,6,1, - 4,255,2,2,16,1,4,3,14,254,2,1,4,1,2,255, - 4,1,255,128,122,21,83,111,117,114,99,101,76,111,97,100, - 101,114,46,103,101,116,95,99,111,100,101,78,41,10,114,130, - 0,0,0,114,129,0,0,0,114,131,0,0,0,114,230,0, - 0,0,114,231,0,0,0,114,233,0,0,0,114,232,0,0, - 0,114,236,0,0,0,114,240,0,0,0,114,220,0,0,0, + 0,218,11,102,105,110,100,95,109,111,100,117,108,101,28,3, + 0,0,115,10,0,0,0,12,7,8,1,6,1,4,2,255, + 128,122,33,87,105,110,100,111,119,115,82,101,103,105,115,116, + 114,121,70,105,110,100,101,114,46,102,105,110,100,95,109,111, + 100,117,108,101,41,2,78,78,41,1,78,41,15,114,130,0, + 0,0,114,129,0,0,0,114,131,0,0,0,114,132,0,0, + 0,114,200,0,0,0,114,199,0,0,0,218,11,95,77,83, + 95,87,73,78,68,79,87,83,218,18,69,88,84,69,78,83, + 73,79,78,95,83,85,70,70,73,88,69,83,114,198,0,0, + 0,218,12,115,116,97,116,105,99,109,101,116,104,111,100,114, + 197,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111, + 100,114,204,0,0,0,114,207,0,0,0,114,210,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,228,0,0,0,71,3,0,0,115,18,0, - 0,0,8,0,8,2,8,8,8,14,8,10,8,7,14,10, - 12,8,255,128,114,228,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, - 0,0,115,92,0,0,0,101,0,90,1,100,0,90,2,100, - 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, - 0,90,5,100,6,100,7,132,0,90,6,101,7,135,0,102, - 1,100,8,100,9,132,8,131,1,90,8,101,7,100,10,100, - 11,132,0,131,1,90,9,100,12,100,13,132,0,90,10,101, - 7,100,14,100,15,132,0,131,1,90,11,135,0,4,0,90, - 12,83,0,41,16,218,10,70,105,108,101,76,111,97,100,101, - 114,122,103,66,97,115,101,32,102,105,108,101,32,108,111,97, - 100,101,114,32,99,108,97,115,115,32,119,104,105,99,104,32, - 105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,108, - 111,97,100,101,114,32,112,114,111,116,111,99,111,108,32,109, - 101,116,104,111,100,115,32,116,104,97,116,10,32,32,32,32, - 114,101,113,117,105,114,101,32,102,105,108,101,32,115,121,115, - 116,101,109,32,117,115,97,103,101,46,99,3,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,67, - 0,0,0,115,16,0,0,0,124,1,124,0,95,0,124,2, - 124,0,95,1,100,1,83,0,41,2,122,75,67,97,99,104, - 101,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109, - 101,32,97,110,100,32,116,104,101,32,112,97,116,104,32,116, - 111,32,116,104,101,32,102,105,108,101,32,102,111,117,110,100, - 32,98,121,32,116,104,101,10,32,32,32,32,32,32,32,32, - 102,105,110,100,101,114,46,78,114,163,0,0,0,41,3,114, - 123,0,0,0,114,143,0,0,0,114,52,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, - 0,0,220,3,0,0,115,8,0,0,0,6,3,6,1,4, - 128,255,128,122,19,70,105,108,101,76,111,97,100,101,114,46, + 8,0,0,0,114,195,0,0,0,234,2,0,0,115,32,0, + 0,0,8,0,4,2,2,3,2,255,2,4,2,255,12,3, + 2,2,10,1,2,6,10,1,2,14,12,1,2,15,16,1, + 255,128,114,195,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,64,0,0,0, + 115,48,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, + 5,100,6,100,7,132,0,90,6,100,8,100,9,132,0,90, + 7,100,10,83,0,41,11,218,13,95,76,111,97,100,101,114, + 66,97,115,105,99,115,122,83,66,97,115,101,32,99,108,97, + 115,115,32,111,102,32,99,111,109,109,111,110,32,99,111,100, + 101,32,110,101,101,100,101,100,32,98,121,32,98,111,116,104, + 32,83,111,117,114,99,101,76,111,97,100,101,114,32,97,110, + 100,10,32,32,32,32,83,111,117,114,99,101,108,101,115,115, + 70,105,108,101,76,111,97,100,101,114,46,99,2,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0, + 67,0,0,0,115,64,0,0,0,116,0,124,0,160,1,124, + 1,161,1,131,1,100,1,25,0,125,2,124,2,160,2,100, + 2,100,1,161,2,100,3,25,0,125,3,124,1,160,3,100, + 2,161,1,100,4,25,0,125,4,124,3,100,5,107,2,111, + 62,124,4,100,5,107,3,83,0,41,7,122,141,67,111,110, + 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, + 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76, + 111,97,100,101,114,46,105,115,95,112,97,99,107,97,103,101, + 32,98,121,32,99,104,101,99,107,105,110,103,32,105,102,10, + 32,32,32,32,32,32,32,32,116,104,101,32,112,97,116,104, + 32,114,101,116,117,114,110,101,100,32,98,121,32,103,101,116, + 95,102,105,108,101,110,97,109,101,32,104,97,115,32,97,32, + 102,105,108,101,110,97,109,101,32,111,102,32,39,95,95,105, + 110,105,116,95,95,46,112,121,39,46,114,3,0,0,0,114, + 79,0,0,0,114,0,0,0,0,114,39,0,0,0,218,8, + 95,95,105,110,105,116,95,95,78,41,4,114,55,0,0,0, + 114,183,0,0,0,114,51,0,0,0,114,49,0,0,0,41, + 5,114,123,0,0,0,114,143,0,0,0,114,101,0,0,0, + 90,13,102,105,108,101,110,97,109,101,95,98,97,115,101,90, + 9,116,97,105,108,95,110,97,109,101,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,186,0,0,0,47,3, + 0,0,115,10,0,0,0,18,3,16,1,14,1,16,1,255, + 128,122,24,95,76,111,97,100,101,114,66,97,115,105,99,115, + 46,105,115,95,112,97,99,107,97,103,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,115,4,0,0,0,100,1,83,0,169,2,122, + 42,85,115,101,32,100,101,102,97,117,108,116,32,115,101,109, + 97,110,116,105,99,115,32,102,111,114,32,109,111,100,117,108, + 101,32,99,114,101,97,116,105,111,110,46,78,114,7,0,0, + 0,169,2,114,123,0,0,0,114,191,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,13,99,114, + 101,97,116,101,95,109,111,100,117,108,101,55,3,0,0,115, + 4,0,0,0,4,128,255,128,122,27,95,76,111,97,100,101, + 114,66,97,115,105,99,115,46,99,114,101,97,116,101,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,56, + 0,0,0,124,0,160,0,124,1,106,1,161,1,125,2,124, + 2,100,1,117,0,114,36,116,2,100,2,160,3,124,1,106, + 1,161,1,131,1,130,1,116,4,160,5,116,6,124,2,124, + 1,106,7,161,3,1,0,100,1,83,0,41,3,122,19,69, + 120,101,99,117,116,101,32,116,104,101,32,109,111,100,117,108, + 101,46,78,122,52,99,97,110,110,111,116,32,108,111,97,100, + 32,109,111,100,117,108,101,32,123,33,114,125,32,119,104,101, + 110,32,103,101,116,95,99,111,100,101,40,41,32,114,101,116, + 117,114,110,115,32,78,111,110,101,41,8,218,8,103,101,116, + 95,99,111,100,101,114,130,0,0,0,114,122,0,0,0,114, + 70,0,0,0,114,139,0,0,0,218,25,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,218,4,101,120,101,99,114,136,0,0,0,41, + 3,114,123,0,0,0,218,6,109,111,100,117,108,101,114,168, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,11,101,120,101,99,95,109,111,100,117,108,101,58, + 3,0,0,115,14,0,0,0,12,2,8,1,6,1,4,1, + 6,255,20,2,255,128,122,25,95,76,111,97,100,101,114,66, + 97,115,105,99,115,46,101,120,101,99,95,109,111,100,117,108, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,4,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,160,1,124,0,124,1,161,2,83,0,41,2,122,26,84, + 104,105,115,32,109,111,100,117,108,101,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,78,41,2,114,139,0,0, + 0,218,17,95,108,111,97,100,95,109,111,100,117,108,101,95, + 115,104,105,109,169,2,114,123,0,0,0,114,143,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 11,108,111,97,100,95,109,111,100,117,108,101,66,3,0,0, + 115,4,0,0,0,12,2,255,128,122,25,95,76,111,97,100, + 101,114,66,97,115,105,99,115,46,108,111,97,100,95,109,111, + 100,117,108,101,78,41,8,114,130,0,0,0,114,129,0,0, + 0,114,131,0,0,0,114,132,0,0,0,114,186,0,0,0, + 114,219,0,0,0,114,224,0,0,0,114,227,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,215,0,0,0,42,3,0,0,115,14,0,0, + 0,8,0,4,2,8,3,8,8,8,3,12,8,255,128,114, + 215,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,64,0,0,0,115,74,0, + 0,0,101,0,90,1,100,0,90,2,100,1,100,2,132,0, + 90,3,100,3,100,4,132,0,90,4,100,5,100,6,132,0, + 90,5,100,7,100,8,132,0,90,6,100,9,100,10,132,0, + 90,7,100,11,100,12,156,1,100,13,100,14,132,2,90,8, + 100,15,100,16,132,0,90,9,100,17,83,0,41,18,218,12, + 83,111,117,114,99,101,76,111,97,100,101,114,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,116,0,130,1,41,2, + 122,165,79,112,116,105,111,110,97,108,32,109,101,116,104,111, + 100,32,116,104,97,116,32,114,101,116,117,114,110,115,32,116, + 104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32, + 116,105,109,101,32,40,97,110,32,105,110,116,41,32,102,111, + 114,32,116,104,101,10,32,32,32,32,32,32,32,32,115,112, + 101,99,105,102,105,101,100,32,112,97,116,104,32,40,97,32, + 115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,82, + 97,105,115,101,115,32,79,83,69,114,114,111,114,32,119,104, + 101,110,32,116,104,101,32,112,97,116,104,32,99,97,110,110, + 111,116,32,98,101,32,104,97,110,100,108,101,100,46,10,32, + 32,32,32,32,32,32,32,78,41,1,114,58,0,0,0,169, + 2,114,123,0,0,0,114,52,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,10,112,97,116,104, + 95,109,116,105,109,101,73,3,0,0,115,4,0,0,0,4, + 6,255,128,122,23,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,0,0,0,0,2,0,0,0,4,0,0, + 0,67,0,0,0,115,14,0,0,0,100,1,124,0,160,0, + 124,1,161,1,105,1,83,0,41,3,97,158,1,0,0,79, + 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,114, + 101,116,117,114,110,105,110,103,32,97,32,109,101,116,97,100, + 97,116,97,32,100,105,99,116,32,102,111,114,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,10,32,32,32,32,32, + 32,32,32,112,97,116,104,32,40,97,32,115,116,114,41,46, + 10,10,32,32,32,32,32,32,32,32,80,111,115,115,105,98, + 108,101,32,107,101,121,115,58,10,32,32,32,32,32,32,32, + 32,45,32,39,109,116,105,109,101,39,32,40,109,97,110,100, + 97,116,111,114,121,41,32,105,115,32,116,104,101,32,110,117, + 109,101,114,105,99,32,116,105,109,101,115,116,97,109,112,32, + 111,102,32,108,97,115,116,32,115,111,117,114,99,101,10,32, + 32,32,32,32,32,32,32,32,32,99,111,100,101,32,109,111, + 100,105,102,105,99,97,116,105,111,110,59,10,32,32,32,32, + 32,32,32,32,45,32,39,115,105,122,101,39,32,40,111,112, + 116,105,111,110,97,108,41,32,105,115,32,116,104,101,32,115, + 105,122,101,32,105,110,32,98,121,116,101,115,32,111,102,32, + 116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,46, + 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, + 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, + 111,100,32,97,108,108,111,119,115,32,116,104,101,32,108,111, + 97,100,101,114,32,116,111,32,114,101,97,100,32,98,121,116, + 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, + 32,32,32,32,32,82,97,105,115,101,115,32,79,83,69,114, + 114,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116, + 104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100, + 108,101,100,46,10,32,32,32,32,32,32,32,32,114,173,0, + 0,0,78,41,1,114,230,0,0,0,114,229,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, + 112,97,116,104,95,115,116,97,116,115,81,3,0,0,115,4, + 0,0,0,14,12,255,128,122,23,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,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,12,0,0,0,124,0, + 160,0,124,2,124,3,161,2,83,0,41,2,122,228,79,112, + 116,105,111,110,97,108,32,109,101,116,104,111,100,32,119,104, + 105,99,104,32,119,114,105,116,101,115,32,100,97,116,97,32, + 40,98,121,116,101,115,41,32,116,111,32,97,32,102,105,108, + 101,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, + 10,32,32,32,32,32,32,32,32,73,109,112,108,101,109,101, + 110,116,105,110,103,32,116,104,105,115,32,109,101,116,104,111, + 100,32,97,108,108,111,119,115,32,102,111,114,32,116,104,101, + 32,119,114,105,116,105,110,103,32,111,102,32,98,121,116,101, + 99,111,100,101,32,102,105,108,101,115,46,10,10,32,32,32, + 32,32,32,32,32,84,104,101,32,115,111,117,114,99,101,32, + 112,97,116,104,32,105,115,32,110,101,101,100,101,100,32,105, + 110,32,111,114,100,101,114,32,116,111,32,99,111,114,114,101, + 99,116,108,121,32,116,114,97,110,115,102,101,114,32,112,101, + 114,109,105,115,115,105,111,110,115,10,32,32,32,32,32,32, + 32,32,78,41,1,218,8,115,101,116,95,100,97,116,97,41, + 4,114,123,0,0,0,114,112,0,0,0,90,10,99,97,99, + 104,101,95,112,97,116,104,114,37,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,15,95,99,97, + 99,104,101,95,98,121,116,101,99,111,100,101,95,3,0,0, + 115,4,0,0,0,12,8,255,128,122,28,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, + 0,0,0,0,3,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,150,79,112,116, + 105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,105, + 99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,40, + 98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,101, + 32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,10, + 32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,110, + 116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,100, + 32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,32, + 119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,99, + 111,100,101,32,102,105,108,101,115,46,10,32,32,32,32,32, + 32,32,32,78,114,7,0,0,0,41,3,114,123,0,0,0, + 114,52,0,0,0,114,37,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,232,0,0,0,105,3, + 0,0,115,4,0,0,0,4,128,255,128,122,21,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,0,0,0,0,5, + 0,0,0,10,0,0,0,67,0,0,0,115,70,0,0,0, + 124,0,160,0,124,1,161,1,125,2,122,20,124,0,160,1, + 124,2,161,1,125,3,87,0,116,4,124,3,131,1,83,0, + 4,0,116,2,121,68,1,0,125,4,1,0,122,14,116,3, + 100,1,124,1,100,2,141,2,124,4,130,2,100,3,125,4, + 126,4,48,0,48,0,41,4,122,52,67,111,110,99,114,101, + 116,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,32,111,102,32,73,110,115,112,101,99,116,76,111,97,100, + 101,114,46,103,101,116,95,115,111,117,114,99,101,46,122,39, + 115,111,117,114,99,101,32,110,111,116,32,97,118,97,105,108, + 97,98,108,101,32,116,104,114,111,117,103,104,32,103,101,116, + 95,100,97,116,97,40,41,114,120,0,0,0,78,41,5,114, + 183,0,0,0,218,8,103,101,116,95,100,97,116,97,114,58, + 0,0,0,114,122,0,0,0,114,180,0,0,0,41,5,114, + 123,0,0,0,114,143,0,0,0,114,52,0,0,0,114,178, + 0,0,0,218,3,101,120,99,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,10,103,101,116,95,115,111,117, + 114,99,101,112,3,0,0,115,26,0,0,0,10,2,2,1, + 12,1,8,4,14,253,4,1,2,1,4,255,2,1,2,255, + 8,128,2,255,255,128,122,23,83,111,117,114,99,101,76,111, + 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,114, + 109,0,0,0,41,1,218,9,95,111,112,116,105,109,105,122, + 101,99,3,0,0,0,0,0,0,0,1,0,0,0,4,0, + 0,0,8,0,0,0,67,0,0,0,115,22,0,0,0,116, + 0,106,1,116,2,124,1,124,2,100,1,100,2,124,3,100, + 3,141,6,83,0,41,5,122,130,82,101,116,117,114,110,32, + 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, + 99,111,109,112,105,108,101,100,32,102,114,111,109,32,115,111, + 117,114,99,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,101,32,39,100,97,116,97,39,32,97,114,103,117,109,101, + 110,116,32,99,97,110,32,98,101,32,97,110,121,32,111,98, + 106,101,99,116,32,116,121,112,101,32,116,104,97,116,32,99, + 111,109,112,105,108,101,40,41,32,115,117,112,112,111,114,116, + 115,46,10,32,32,32,32,32,32,32,32,114,222,0,0,0, + 84,41,2,218,12,100,111,110,116,95,105,110,104,101,114,105, + 116,114,89,0,0,0,78,41,3,114,139,0,0,0,114,221, + 0,0,0,218,7,99,111,109,112,105,108,101,41,4,114,123, + 0,0,0,114,37,0,0,0,114,52,0,0,0,114,237,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,14,115,111,117,114,99,101,95,116,111,95,99,111,100, + 101,122,3,0,0,115,8,0,0,0,12,5,4,1,6,255, + 255,128,122,27,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,0,0,0,0,15,0,0,0, + 9,0,0,0,67,0,0,0,115,28,2,0,0,124,0,160, + 0,124,1,161,1,125,2,100,1,125,3,100,1,125,4,100, + 1,125,5,100,2,125,6,100,3,125,7,122,12,116,1,124, + 2,131,1,125,8,87,0,110,24,4,0,116,2,121,66,1, + 0,1,0,1,0,100,1,125,8,89,0,144,1,110,42,48, + 0,122,14,124,0,160,3,124,2,161,1,125,9,87,0,110, + 20,4,0,116,4,121,102,1,0,1,0,1,0,89,0,144, + 1,110,6,48,0,116,5,124,9,100,4,25,0,131,1,125, + 3,122,14,124,0,160,6,124,8,161,1,125,10,87,0,110, + 18,4,0,116,4,121,148,1,0,1,0,1,0,89,0,110, + 216,48,0,124,1,124,8,100,5,156,2,125,11,122,148,116, + 7,124,10,124,1,124,11,131,3,125,12,116,8,124,10,131, + 1,100,6,100,1,133,2,25,0,125,13,124,12,100,7,64, + 0,100,8,107,3,125,6,124,6,144,1,114,30,124,12,100, + 9,64,0,100,8,107,3,125,7,116,9,106,10,100,10,107, + 3,144,1,114,50,124,7,115,248,116,9,106,10,100,11,107, + 2,144,1,114,50,124,0,160,6,124,2,161,1,125,4,116, + 9,160,11,116,12,124,4,161,2,125,5,116,13,124,10,124, + 5,124,1,124,11,131,4,1,0,110,20,116,14,124,10,124, + 3,124,9,100,12,25,0,124,1,124,11,131,5,1,0,87, + 0,110,24,4,0,116,15,116,16,102,2,144,1,121,76,1, + 0,1,0,1,0,89,0,110,32,48,0,116,17,160,18,100, + 13,124,8,124,2,161,3,1,0,116,19,124,13,124,1,124, + 8,124,2,100,14,141,4,83,0,124,4,100,1,117,0,144, + 1,114,128,124,0,160,6,124,2,161,1,125,4,124,0,160, + 20,124,4,124,2,161,2,125,14,116,17,160,18,100,15,124, + 2,161,2,1,0,116,21,106,22,144,2,115,24,124,8,100, + 1,117,1,144,2,114,24,124,3,100,1,117,1,144,2,114, + 24,124,6,144,1,114,220,124,5,100,1,117,0,144,1,114, + 206,116,9,160,11,124,4,161,1,125,5,116,23,124,14,124, + 5,124,7,131,3,125,10,110,16,116,24,124,14,124,3,116, + 25,124,4,131,1,131,3,125,10,122,20,124,0,160,26,124, + 2,124,8,124,10,161,3,1,0,87,0,124,14,83,0,4, + 0,116,2,144,2,121,22,1,0,1,0,1,0,89,0,124, + 14,83,0,48,0,124,14,83,0,41,16,122,190,67,111,110, + 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, + 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76, + 111,97,100,101,114,46,103,101,116,95,99,111,100,101,46,10, + 10,32,32,32,32,32,32,32,32,82,101,97,100,105,110,103, + 32,111,102,32,98,121,116,101,99,111,100,101,32,114,101,113, + 117,105,114,101,115,32,112,97,116,104,95,115,116,97,116,115, + 32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116, + 101,100,46,32,84,111,32,119,114,105,116,101,10,32,32,32, + 32,32,32,32,32,98,121,116,101,99,111,100,101,44,32,115, + 101,116,95,100,97,116,97,32,109,117,115,116,32,97,108,115, + 111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100, + 46,10,10,32,32,32,32,32,32,32,32,78,70,84,114,173, + 0,0,0,114,163,0,0,0,114,149,0,0,0,114,3,0, + 0,0,114,0,0,0,0,114,39,0,0,0,90,5,110,101, + 118,101,114,90,6,97,108,119,97,121,115,218,4,115,105,122, + 101,122,13,123,125,32,109,97,116,99,104,101,115,32,123,125, + 41,3,114,121,0,0,0,114,111,0,0,0,114,112,0,0, + 0,122,19,99,111,100,101,32,111,98,106,101,99,116,32,102, + 114,111,109,32,123,125,41,27,114,183,0,0,0,114,102,0, + 0,0,114,88,0,0,0,114,231,0,0,0,114,58,0,0, + 0,114,30,0,0,0,114,234,0,0,0,114,156,0,0,0, + 218,10,109,101,109,111,114,121,118,105,101,119,114,167,0,0, + 0,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, + 115,101,100,95,112,121,99,115,114,161,0,0,0,218,17,95, + 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, + 114,162,0,0,0,114,160,0,0,0,114,122,0,0,0,114, + 154,0,0,0,114,139,0,0,0,114,153,0,0,0,114,169, + 0,0,0,114,240,0,0,0,114,15,0,0,0,218,19,100, + 111,110,116,95,119,114,105,116,101,95,98,121,116,101,99,111, + 100,101,114,175,0,0,0,114,174,0,0,0,114,4,0,0, + 0,114,233,0,0,0,41,15,114,123,0,0,0,114,143,0, + 0,0,114,112,0,0,0,114,158,0,0,0,114,178,0,0, + 0,114,161,0,0,0,90,10,104,97,115,104,95,98,97,115, + 101,100,90,12,99,104,101,99,107,95,115,111,117,114,99,101, + 114,111,0,0,0,218,2,115,116,114,37,0,0,0,114,155, + 0,0,0,114,16,0,0,0,90,10,98,121,116,101,115,95, + 100,97,116,97,90,11,99,111,100,101,95,111,98,106,101,99, + 116,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,220,0,0,0,130,3,0,0,115,160,0,0,0,10,7, + 4,1,4,1,4,1,4,1,4,1,2,1,12,1,12,1, + 12,1,2,2,14,1,12,1,8,1,12,2,2,1,14,1, + 12,1,6,1,2,3,2,1,6,254,2,4,12,1,16,1, + 12,1,6,1,12,1,12,1,2,1,2,255,8,2,4,254, + 10,3,4,1,2,1,2,1,4,254,8,4,2,1,6,255, + 2,3,2,1,2,1,6,1,2,1,2,1,8,251,18,7, + 6,1,8,2,2,1,4,255,6,2,2,1,2,1,6,254, + 10,3,10,1,12,1,12,1,18,1,6,1,4,255,6,2, + 10,1,10,1,14,1,6,2,6,1,4,255,2,2,16,1, + 4,3,14,254,2,1,4,1,2,255,4,1,255,128,122,21, + 83,111,117,114,99,101,76,111,97,100,101,114,46,103,101,116, + 95,99,111,100,101,78,41,10,114,130,0,0,0,114,129,0, + 0,0,114,131,0,0,0,114,230,0,0,0,114,231,0,0, + 0,114,233,0,0,0,114,232,0,0,0,114,236,0,0,0, + 114,240,0,0,0,114,220,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,228, + 0,0,0,71,3,0,0,115,18,0,0,0,8,0,8,2, + 8,8,8,14,8,10,8,7,14,10,12,8,255,128,114,228, + 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,0,0,0,0,115,92,0,0, + 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, + 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100, + 7,132,0,90,6,101,7,135,0,102,1,100,8,100,9,132, + 8,131,1,90,8,101,7,100,10,100,11,132,0,131,1,90, + 9,100,12,100,13,132,0,90,10,101,7,100,14,100,15,132, + 0,131,1,90,11,135,0,4,0,90,12,83,0,41,16,218, + 10,70,105,108,101,76,111,97,100,101,114,122,103,66,97,115, + 101,32,102,105,108,101,32,108,111,97,100,101,114,32,99,108, + 97,115,115,32,119,104,105,99,104,32,105,109,112,108,101,109, + 101,110,116,115,32,116,104,101,32,108,111,97,100,101,114,32, + 112,114,111,116,111,99,111,108,32,109,101,116,104,111,100,115, + 32,116,104,97,116,10,32,32,32,32,114,101,113,117,105,114, + 101,32,102,105,108,101,32,115,121,115,116,101,109,32,117,115, + 97,103,101,46,99,3,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,2,0,0,0,67,0,0,0,115,16,0, + 0,0,124,1,124,0,95,0,124,2,124,0,95,1,100,1, + 83,0,41,2,122,75,67,97,99,104,101,32,116,104,101,32, + 109,111,100,117,108,101,32,110,97,109,101,32,97,110,100,32, + 116,104,101,32,112,97,116,104,32,116,111,32,116,104,101,32, + 102,105,108,101,32,102,111,117,110,100,32,98,121,32,116,104, + 101,10,32,32,32,32,32,32,32,32,102,105,110,100,101,114, + 46,78,114,163,0,0,0,41,3,114,123,0,0,0,114,143, + 0,0,0,114,52,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,216,0,0,0,220,3,0,0, + 115,6,0,0,0,6,3,10,1,255,128,122,19,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,0,0,0,0,2,0,0, + 0,2,0,0,0,67,0,0,0,115,24,0,0,0,124,0, + 106,0,124,1,106,0,107,2,111,22,124,0,106,1,124,1, + 106,1,107,2,83,0,114,114,0,0,0,169,2,218,9,95, + 95,99,108,97,115,115,95,95,114,136,0,0,0,169,2,114, + 123,0,0,0,90,5,111,116,104,101,114,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,6,95,95,101,113, + 95,95,226,3,0,0,115,8,0,0,0,12,1,10,1,2, + 255,255,128,122,17,70,105,108,101,76,111,97,100,101,114,46, + 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 20,0,0,0,116,0,124,0,106,1,131,1,116,0,124,0, + 106,2,131,1,65,0,83,0,114,114,0,0,0,169,3,218, + 4,104,97,115,104,114,121,0,0,0,114,52,0,0,0,169, + 1,114,123,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,8,95,95,104,97,115,104,95,95,230, + 3,0,0,115,4,0,0,0,20,1,255,128,122,19,70,105, + 108,101,76,111,97,100,101,114,46,95,95,104,97,115,104,95, + 95,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,3,0,0,0,115,16,0,0,0,116, + 0,116,1,124,0,131,2,160,2,124,1,161,1,83,0,41, + 2,122,100,76,111,97,100,32,97,32,109,111,100,117,108,101, + 32,102,114,111,109,32,97,32,102,105,108,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,85,115,101,32,101,120,101,99,95,109,111,100,117, + 108,101,40,41,32,105,110,115,116,101,97,100,46,10,10,32, + 32,32,32,32,32,32,32,78,41,3,218,5,115,117,112,101, + 114,114,246,0,0,0,114,227,0,0,0,114,226,0,0,0, + 169,1,114,248,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,227,0,0,0,233,3,0,0,115,4,0,0,0,16, + 10,255,128,122,22,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,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,169, + 2,122,58,82,101,116,117,114,110,32,116,104,101,32,112,97, + 116,104,32,116,111,32,116,104,101,32,115,111,117,114,99,101, + 32,102,105,108,101,32,97,115,32,102,111,117,110,100,32,98, + 121,32,116,104,101,32,102,105,110,100,101,114,46,78,114,56, + 0,0,0,114,226,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,183,0,0,0,245,3,0,0, + 115,4,0,0,0,6,3,255,128,122,23,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,0,0,0,0,3, + 0,0,0,8,0,0,0,67,0,0,0,115,128,0,0,0, + 116,0,124,0,116,1,116,2,102,2,131,2,114,72,116,3, + 160,4,116,5,124,1,131,1,161,1,143,24,125,2,124,2, + 160,6,161,0,87,0,2,0,100,1,4,0,4,0,131,3, + 1,0,83,0,49,0,115,58,48,0,1,0,1,0,1,0, + 89,0,1,0,100,1,83,0,116,3,160,7,124,1,100,2, + 161,2,143,24,125,2,124,2,160,6,161,0,87,0,2,0, + 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,114, + 48,0,1,0,1,0,1,0,89,0,1,0,100,1,83,0, + 41,3,122,39,82,101,116,117,114,110,32,116,104,101,32,100, + 97,116,97,32,102,114,111,109,32,112,97,116,104,32,97,115, + 32,114,97,119,32,98,121,116,101,115,46,78,218,1,114,41, + 8,114,165,0,0,0,114,228,0,0,0,218,19,69,120,116, + 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, + 114,72,0,0,0,90,9,111,112,101,110,95,99,111,100,101, + 114,90,0,0,0,90,4,114,101,97,100,114,73,0,0,0, + 41,3,114,123,0,0,0,114,52,0,0,0,114,76,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,234,0,0,0,250,3,0,0,115,14,0,0,0,14,2, + 16,1,42,1,14,2,38,1,4,128,255,128,122,19,70,105, + 108,101,76,111,97,100,101,114,46,103,101,116,95,100,97,116, + 97,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,2,0,0,0,67,0,0,0,115,20,0,0,0,100, + 1,100,2,108,0,109,1,125,2,1,0,124,2,124,0,131, + 1,83,0,41,3,78,114,0,0,0,0,41,1,218,10,70, + 105,108,101,82,101,97,100,101,114,41,2,90,17,105,109,112, + 111,114,116,108,105,98,46,114,101,97,100,101,114,115,114,4, + 1,0,0,41,3,114,123,0,0,0,114,223,0,0,0,114, + 4,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,19,103,101,116,95,114,101,115,111,117,114,99, + 101,95,114,101,97,100,101,114,3,4,0,0,115,6,0,0, + 0,12,2,8,1,255,128,122,30,70,105,108,101,76,111,97, + 100,101,114,46,103,101,116,95,114,101,115,111,117,114,99,101, + 95,114,101,97,100,101,114,41,13,114,130,0,0,0,114,129, + 0,0,0,114,131,0,0,0,114,132,0,0,0,114,216,0, + 0,0,114,250,0,0,0,114,254,0,0,0,114,140,0,0, + 0,114,227,0,0,0,114,183,0,0,0,114,234,0,0,0, + 114,5,1,0,0,90,13,95,95,99,108,97,115,115,99,101, + 108,108,95,95,114,7,0,0,0,114,7,0,0,0,114,0, + 1,0,0,114,8,0,0,0,114,246,0,0,0,215,3,0, + 0,115,26,0,0,0,8,0,4,2,8,3,8,6,8,4, + 2,3,14,1,2,11,10,1,8,4,2,9,18,1,255,128, + 114,246,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,46, + 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, + 2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,100, + 6,100,7,156,1,100,8,100,9,132,2,90,6,100,10,83, + 0,41,11,218,16,83,111,117,114,99,101,70,105,108,101,76, + 111,97,100,101,114,122,62,67,111,110,99,114,101,116,101,32, + 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111, + 102,32,83,111,117,114,99,101,76,111,97,100,101,114,32,117, + 115,105,110,103,32,116,104,101,32,102,105,108,101,32,115,121, + 115,116,101,109,46,99,2,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,22, + 0,0,0,116,0,124,1,131,1,125,2,124,2,106,1,124, + 2,106,2,100,1,156,2,83,0,41,3,122,33,82,101,116, + 117,114,110,32,116,104,101,32,109,101,116,97,100,97,116,97, + 32,102,111,114,32,116,104,101,32,112,97,116,104,46,41,2, + 114,173,0,0,0,114,241,0,0,0,78,41,3,114,57,0, + 0,0,218,8,115,116,95,109,116,105,109,101,90,7,115,116, + 95,115,105,122,101,41,3,114,123,0,0,0,114,52,0,0, + 0,114,245,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,231,0,0,0,13,4,0,0,115,6, + 0,0,0,8,2,14,1,255,128,122,27,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,0,0, + 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, + 24,0,0,0,116,0,124,1,131,1,125,4,124,0,106,1, + 124,2,124,3,124,4,100,1,141,3,83,0,41,2,78,169, + 1,218,5,95,109,111,100,101,41,2,114,119,0,0,0,114, + 232,0,0,0,41,5,114,123,0,0,0,114,112,0,0,0, + 114,111,0,0,0,114,37,0,0,0,114,60,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,233, + 0,0,0,18,4,0,0,115,6,0,0,0,8,2,16,1, + 255,128,122,32,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, + 99,111,100,101,114,68,0,0,0,114,8,1,0,0,99,3, + 0,0,0,0,0,0,0,1,0,0,0,9,0,0,0,11, + 0,0,0,67,0,0,0,115,248,0,0,0,116,0,124,1, + 131,1,92,2,125,4,125,5,103,0,125,6,124,4,114,52, + 116,1,124,4,131,1,115,52,116,0,124,4,131,1,92,2, + 125,4,125,7,124,6,160,2,124,7,161,1,1,0,113,16, + 116,3,124,6,131,1,68,0,93,96,125,7,116,4,124,4, + 124,7,131,2,125,4,122,14,116,5,160,6,124,4,161,1, + 1,0,87,0,113,60,4,0,116,7,121,106,1,0,1,0, + 1,0,89,0,113,60,4,0,116,8,121,246,1,0,125,8, + 1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,3, + 1,0,87,0,89,0,100,2,125,8,126,8,1,0,100,2, + 83,0,100,2,125,8,126,8,48,0,122,30,116,11,124,1, + 124,2,124,3,131,3,1,0,116,9,160,10,100,3,124,1, + 161,2,1,0,87,0,100,2,83,0,4,0,116,8,121,240, + 1,0,125,8,1,0,122,28,116,9,160,10,100,1,124,1, + 124,8,161,3,1,0,87,0,89,0,100,2,125,8,126,8, + 100,2,83,0,100,2,125,8,126,8,48,0,48,0,100,2, + 83,0,48,0,41,4,122,27,87,114,105,116,101,32,98,121, + 116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,105, + 108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,99, + 114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,125, + 78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,41, + 12,114,55,0,0,0,114,64,0,0,0,114,190,0,0,0, + 114,50,0,0,0,114,48,0,0,0,114,18,0,0,0,90, + 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115, + 116,115,69,114,114,111,114,114,58,0,0,0,114,139,0,0, + 0,114,153,0,0,0,114,77,0,0,0,41,9,114,123,0, + 0,0,114,52,0,0,0,114,37,0,0,0,114,9,1,0, + 0,218,6,112,97,114,101,110,116,114,101,0,0,0,114,47, + 0,0,0,114,43,0,0,0,114,235,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,232,0,0, + 0,23,4,0,0,115,58,0,0,0,12,2,4,1,12,2, + 12,1,12,1,12,2,10,1,2,1,14,1,12,1,4,2, + 14,1,6,3,4,1,4,255,16,2,8,128,2,1,12,1, + 18,1,14,1,8,2,2,1,18,255,8,128,2,254,4,255, + 2,248,255,128,122,25,83,111,117,114,99,101,70,105,108,101, + 76,111,97,100,101,114,46,115,101,116,95,100,97,116,97,78, + 41,7,114,130,0,0,0,114,129,0,0,0,114,131,0,0, + 0,114,132,0,0,0,114,231,0,0,0,114,233,0,0,0, + 114,232,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,6,1,0,0,9,4, + 0,0,115,12,0,0,0,8,0,4,2,8,2,8,5,18, + 5,255,128,114,6,1,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, + 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, + 90,5,100,6,83,0,41,7,218,20,83,111,117,114,99,101, + 108,101,115,115,70,105,108,101,76,111,97,100,101,114,122,45, + 76,111,97,100,101,114,32,119,104,105,99,104,32,104,97,110, + 100,108,101,115,32,115,111,117,114,99,101,108,101,115,115,32, + 102,105,108,101,32,105,109,112,111,114,116,115,46,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, + 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,124, + 1,161,1,125,2,124,0,160,1,124,2,161,1,125,3,124, + 1,124,2,100,1,156,2,125,4,116,2,124,3,124,1,124, + 4,131,3,1,0,116,3,116,4,124,3,131,1,100,2,100, + 0,133,2,25,0,124,1,124,2,100,3,141,3,83,0,41, + 4,78,114,163,0,0,0,114,149,0,0,0,41,2,114,121, + 0,0,0,114,111,0,0,0,41,5,114,183,0,0,0,114, + 234,0,0,0,114,156,0,0,0,114,169,0,0,0,114,242, + 0,0,0,41,5,114,123,0,0,0,114,143,0,0,0,114, + 52,0,0,0,114,37,0,0,0,114,155,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,220,0, + 0,0,58,4,0,0,115,24,0,0,0,10,1,10,1,2, + 4,2,1,6,254,12,4,2,1,14,1,2,1,2,1,6, + 253,255,128,122,29,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,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,78, + 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, + 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, + 114,7,0,0,0,114,226,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,236,0,0,0,74,4, + 0,0,115,4,0,0,0,4,2,255,128,122,31,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,41,6,114, + 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, + 0,0,0,114,220,0,0,0,114,236,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,12,1,0,0,54,4,0,0,115,10,0,0,0,8, + 0,4,2,8,2,12,16,255,128,114,12,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,64,0,0,0,115,92,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6, + 100,8,100,9,132,0,90,7,100,10,100,11,132,0,90,8, + 100,12,100,13,132,0,90,9,100,14,100,15,132,0,90,10, + 100,16,100,17,132,0,90,11,101,12,100,18,100,19,132,0, + 131,1,90,13,100,20,83,0,41,21,114,3,1,0,0,122, + 93,76,111,97,100,101,114,32,102,111,114,32,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,115,46,10,10, + 32,32,32,32,84,104,101,32,99,111,110,115,116,114,117,99, + 116,111,114,32,105,115,32,100,101,115,105,103,110,101,100,32, + 116,111,32,119,111,114,107,32,119,105,116,104,32,70,105,108, + 101,70,105,110,100,101,114,46,10,10,32,32,32,32,99,3, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2, + 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0, + 95,0,124,2,124,0,95,1,100,0,83,0,114,114,0,0, + 0,114,163,0,0,0,41,3,114,123,0,0,0,114,121,0, + 0,0,114,52,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,216,0,0,0,87,4,0,0,115, + 6,0,0,0,6,1,10,1,255,128,122,28,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, 0,115,24,0,0,0,124,0,106,0,124,1,106,0,107,2, 111,22,124,0,106,1,124,1,106,1,107,2,83,0,114,114, - 0,0,0,169,2,218,9,95,95,99,108,97,115,115,95,95, - 114,136,0,0,0,169,2,114,123,0,0,0,90,5,111,116, - 104,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,6,95,95,101,113,95,95,226,3,0,0,115,8, - 0,0,0,12,1,10,1,2,255,255,128,122,17,70,105,108, + 0,0,0,114,247,0,0,0,114,249,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,250,0,0, + 0,91,4,0,0,115,8,0,0,0,12,1,10,1,2,255, + 255,128,122,26,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,95,95,101,113,95,95,99,1, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, 0,0,0,67,0,0,0,115,20,0,0,0,116,0,124,0, 106,1,131,1,116,0,124,0,106,2,131,1,65,0,83,0, - 114,114,0,0,0,169,3,218,4,104,97,115,104,114,121,0, - 0,0,114,52,0,0,0,169,1,114,123,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,95, - 95,104,97,115,104,95,95,230,3,0,0,115,4,0,0,0, - 20,1,255,128,122,19,70,105,108,101,76,111,97,100,101,114, - 46,95,95,104,97,115,104,95,95,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,3,0,0,0,3,0, - 0,0,115,16,0,0,0,116,0,116,1,124,0,131,2,160, - 2,124,1,161,1,83,0,41,2,122,100,76,111,97,100,32, - 97,32,109,111,100,117,108,101,32,102,114,111,109,32,97,32, - 102,105,108,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101, - 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, - 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, - 41,3,218,5,115,117,112,101,114,114,246,0,0,0,114,227, - 0,0,0,114,226,0,0,0,169,1,114,248,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,227,0,0,0,233,3, - 0,0,115,4,0,0,0,16,10,255,128,122,22,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,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,6,0,0, - 0,124,0,106,0,83,0,169,2,122,58,82,101,116,117,114, - 110,32,116,104,101,32,112,97,116,104,32,116,111,32,116,104, - 101,32,115,111,117,114,99,101,32,102,105,108,101,32,97,115, - 32,102,111,117,110,100,32,98,121,32,116,104,101,32,102,105, - 110,100,101,114,46,78,114,56,0,0,0,114,226,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 183,0,0,0,245,3,0,0,115,4,0,0,0,6,3,255, - 128,122,23,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,0,0,0,0,3,0,0,0,8,0,0,0,67, - 0,0,0,115,128,0,0,0,116,0,124,0,116,1,116,2, - 102,2,131,2,114,72,116,3,160,4,116,5,124,1,131,1, - 161,1,143,24,125,2,124,2,160,6,161,0,87,0,2,0, - 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,58, - 48,0,1,0,1,0,1,0,89,0,1,0,100,1,83,0, - 116,3,160,7,124,1,100,2,161,2,143,24,125,2,124,2, - 160,6,161,0,87,0,2,0,100,1,4,0,4,0,131,3, - 1,0,83,0,49,0,115,114,48,0,1,0,1,0,1,0, - 89,0,1,0,100,1,83,0,41,3,122,39,82,101,116,117, - 114,110,32,116,104,101,32,100,97,116,97,32,102,114,111,109, - 32,112,97,116,104,32,97,115,32,114,97,119,32,98,121,116, - 101,115,46,78,218,1,114,41,8,114,165,0,0,0,114,228, - 0,0,0,218,19,69,120,116,101,110,115,105,111,110,70,105, - 108,101,76,111,97,100,101,114,114,72,0,0,0,90,9,111, - 112,101,110,95,99,111,100,101,114,90,0,0,0,90,4,114, - 101,97,100,114,73,0,0,0,41,3,114,123,0,0,0,114, - 52,0,0,0,114,76,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,234,0,0,0,250,3,0, - 0,115,16,0,0,0,14,2,16,1,38,1,4,128,14,2, - 38,1,4,128,255,128,122,19,70,105,108,101,76,111,97,100, - 101,114,46,103,101,116,95,100,97,116,97,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0, - 67,0,0,0,115,20,0,0,0,100,1,100,2,108,0,109, - 1,125,2,1,0,124,2,124,0,131,1,83,0,41,3,78, - 114,0,0,0,0,41,1,218,10,70,105,108,101,82,101,97, - 100,101,114,41,2,90,17,105,109,112,111,114,116,108,105,98, - 46,114,101,97,100,101,114,115,114,4,1,0,0,41,3,114, - 123,0,0,0,114,223,0,0,0,114,4,1,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,19,103, - 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, - 101,114,3,4,0,0,115,6,0,0,0,12,2,8,1,255, - 128,122,30,70,105,108,101,76,111,97,100,101,114,46,103,101, - 116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,101, - 114,41,13,114,130,0,0,0,114,129,0,0,0,114,131,0, - 0,0,114,132,0,0,0,114,216,0,0,0,114,250,0,0, - 0,114,254,0,0,0,114,140,0,0,0,114,227,0,0,0, - 114,183,0,0,0,114,234,0,0,0,114,5,1,0,0,90, - 13,95,95,99,108,97,115,115,99,101,108,108,95,95,114,7, - 0,0,0,114,7,0,0,0,114,0,1,0,0,114,8,0, - 0,0,114,246,0,0,0,215,3,0,0,115,26,0,0,0, - 8,0,4,2,8,3,8,6,8,4,2,3,14,1,2,11, - 10,1,8,4,2,9,18,1,255,128,114,246,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,64,0,0,0,115,46,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, - 4,100,4,100,5,132,0,90,5,100,6,100,7,156,1,100, - 8,100,9,132,2,90,6,100,10,83,0,41,11,218,16,83, - 111,117,114,99,101,70,105,108,101,76,111,97,100,101,114,122, - 62,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109, - 101,110,116,97,116,105,111,110,32,111,102,32,83,111,117,114, - 99,101,76,111,97,100,101,114,32,117,115,105,110,103,32,116, - 104,101,32,102,105,108,101,32,115,121,115,116,101,109,46,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,22,0,0,0,116,0,124, - 1,131,1,125,2,124,2,106,1,124,2,106,2,100,1,156, - 2,83,0,41,3,122,33,82,101,116,117,114,110,32,116,104, - 101,32,109,101,116,97,100,97,116,97,32,102,111,114,32,116, - 104,101,32,112,97,116,104,46,41,2,114,173,0,0,0,114, - 241,0,0,0,78,41,3,114,57,0,0,0,218,8,115,116, - 95,109,116,105,109,101,90,7,115,116,95,115,105,122,101,41, - 3,114,123,0,0,0,114,52,0,0,0,114,245,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 231,0,0,0,13,4,0,0,115,6,0,0,0,8,2,14, - 1,255,128,122,27,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,0,0,0,0,0,5,0,0, - 0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,0, - 124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,4, - 100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,111, - 100,101,41,2,114,119,0,0,0,114,232,0,0,0,41,5, - 114,123,0,0,0,114,112,0,0,0,114,111,0,0,0,114, - 37,0,0,0,114,60,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,233,0,0,0,18,4,0, - 0,115,6,0,0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,68, - 0,0,0,114,8,1,0,0,99,3,0,0,0,0,0,0, - 0,1,0,0,0,9,0,0,0,11,0,0,0,67,0,0, - 0,115,244,0,0,0,116,0,124,1,131,1,92,2,125,4, - 125,5,103,0,125,6,124,4,114,52,116,1,124,4,131,1, - 115,52,116,0,124,4,131,1,92,2,125,4,125,7,124,6, - 160,2,124,7,161,1,1,0,113,16,116,3,124,6,131,1, - 68,0,93,98,125,7,116,4,124,4,124,7,131,2,125,4, - 122,14,116,5,160,6,124,4,161,1,1,0,87,0,113,60, - 4,0,116,7,121,106,1,0,1,0,1,0,89,0,113,60, - 4,0,116,8,121,158,1,0,125,8,1,0,122,30,116,9, - 160,10,100,1,124,4,124,8,161,3,1,0,87,0,89,0, - 100,2,125,8,126,8,1,0,100,2,83,0,100,2,125,8, - 126,8,48,0,48,0,122,30,116,11,124,1,124,2,124,3, - 131,3,1,0,116,9,160,10,100,3,124,1,161,2,1,0, - 87,0,100,2,83,0,4,0,116,8,121,242,1,0,125,8, - 1,0,122,28,116,9,160,10,100,1,124,1,124,8,161,3, - 1,0,87,0,89,0,100,2,125,8,126,8,100,2,83,0, - 100,2,125,8,126,8,48,0,48,0,41,4,122,27,87,114, - 105,116,101,32,98,121,116,101,115,32,100,97,116,97,32,116, - 111,32,97,32,102,105,108,101,46,122,27,99,111,117,108,100, - 32,110,111,116,32,99,114,101,97,116,101,32,123,33,114,125, - 58,32,123,33,114,125,78,122,12,99,114,101,97,116,101,100, - 32,123,33,114,125,41,12,114,55,0,0,0,114,64,0,0, - 0,114,190,0,0,0,114,50,0,0,0,114,48,0,0,0, - 114,18,0,0,0,90,5,109,107,100,105,114,218,15,70,105, - 108,101,69,120,105,115,116,115,69,114,114,111,114,114,58,0, - 0,0,114,139,0,0,0,114,153,0,0,0,114,77,0,0, - 0,41,9,114,123,0,0,0,114,52,0,0,0,114,37,0, - 0,0,114,9,1,0,0,218,6,112,97,114,101,110,116,114, - 101,0,0,0,114,47,0,0,0,114,43,0,0,0,114,235, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,232,0,0,0,23,4,0,0,115,54,0,0,0, - 12,2,4,1,12,2,12,1,12,1,12,2,10,1,2,1, - 14,1,12,1,4,2,14,1,6,3,4,1,4,255,16,2, - 10,128,2,1,12,1,14,1,4,128,14,1,8,2,2,1, - 8,255,20,128,255,128,122,25,83,111,117,114,99,101,70,105, - 108,101,76,111,97,100,101,114,46,115,101,116,95,100,97,116, - 97,78,41,7,114,130,0,0,0,114,129,0,0,0,114,131, - 0,0,0,114,132,0,0,0,114,231,0,0,0,114,233,0, - 0,0,114,232,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,6,1,0,0, - 9,4,0,0,115,12,0,0,0,8,0,4,2,8,2,8, - 5,18,5,255,128,114,6,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114, - 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, - 122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104, - 97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115, - 115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160, - 0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125, - 3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124, - 1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100, - 2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83, - 0,41,4,78,114,163,0,0,0,114,149,0,0,0,41,2, - 114,121,0,0,0,114,111,0,0,0,41,5,114,183,0,0, - 0,114,234,0,0,0,114,156,0,0,0,114,169,0,0,0, - 114,242,0,0,0,41,5,114,123,0,0,0,114,143,0,0, - 0,114,52,0,0,0,114,37,0,0,0,114,155,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 220,0,0,0,58,4,0,0,115,24,0,0,0,10,1,10, - 1,2,4,2,1,6,254,12,4,2,1,14,1,2,1,2, - 1,6,253,255,128,122,29,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,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,41,2,122,39,82,101,116,117,114,110, - 32,78,111,110,101,32,97,115,32,116,104,101,114,101,32,105, - 115,32,110,111,32,115,111,117,114,99,101,32,99,111,100,101, - 46,78,114,7,0,0,0,114,226,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,236,0,0,0, - 74,4,0,0,115,4,0,0,0,4,2,255,128,122,31,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,41, - 6,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, - 114,132,0,0,0,114,220,0,0,0,114,236,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,12,1,0,0,54,4,0,0,115,10,0,0, - 0,8,0,4,2,8,2,12,16,255,128,114,12,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,64,0,0,0,115,92,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, - 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, - 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, - 90,10,100,16,100,17,132,0,90,11,101,12,100,18,100,19, - 132,0,131,1,90,13,100,20,83,0,41,21,114,3,1,0, - 0,122,93,76,111,97,100,101,114,32,102,111,114,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,46, - 10,10,32,32,32,32,84,104,101,32,99,111,110,115,116,114, - 117,99,116,111,114,32,105,115,32,100,101,115,105,103,110,101, - 100,32,116,111,32,119,111,114,107,32,119,105,116,104,32,70, - 105,108,101,70,105,110,100,101,114,46,10,10,32,32,32,32, - 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,2,0,0,0,67,0,0,0,115,16,0,0,0,124,1, - 124,0,95,0,124,2,124,0,95,1,100,0,83,0,114,114, - 0,0,0,114,163,0,0,0,41,3,114,123,0,0,0,114, - 121,0,0,0,114,52,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,216,0,0,0,87,4,0, - 0,115,8,0,0,0,6,1,6,1,4,128,255,128,122,28, - 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,0,0,0,0,2,0,0,0,2,0,0, - 0,67,0,0,0,115,24,0,0,0,124,0,106,0,124,1, - 106,0,107,2,111,22,124,0,106,1,124,1,106,1,107,2, - 83,0,114,114,0,0,0,114,247,0,0,0,114,249,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,250,0,0,0,91,4,0,0,115,8,0,0,0,12,1, - 10,1,2,255,255,128,122,26,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,95,95,101,113, - 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,20,0,0,0, - 116,0,124,0,106,1,131,1,116,0,124,0,106,2,131,1, - 65,0,83,0,114,114,0,0,0,114,251,0,0,0,114,253, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,254,0,0,0,95,4,0,0,115,4,0,0,0, - 20,1,255,128,122,28,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,95,95,104,97,115,104, - 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,5,0,0,0,67,0,0,0,115,36,0,0,0, - 116,0,160,1,116,2,106,3,124,1,161,2,125,2,116,0, - 160,4,100,1,124,1,106,5,124,0,106,6,161,3,1,0, - 124,2,83,0,41,3,122,38,67,114,101,97,116,101,32,97, - 110,32,117,110,105,116,105,97,108,105,122,101,100,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,122,38, + 114,114,0,0,0,114,251,0,0,0,114,253,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,254, + 0,0,0,95,4,0,0,115,4,0,0,0,20,1,255,128, + 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76, + 111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, + 0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1, + 116,2,106,3,124,1,161,2,125,2,116,0,160,4,100,1, + 124,1,106,5,124,0,106,6,161,3,1,0,124,2,83,0, + 41,3,122,38,67,114,101,97,116,101,32,97,110,32,117,110, + 105,116,105,97,108,105,122,101,100,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,122,38,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,32,123,33,114, + 125,32,108,111,97,100,101,100,32,102,114,111,109,32,123,33, + 114,125,78,41,7,114,139,0,0,0,114,221,0,0,0,114, + 167,0,0,0,90,14,99,114,101,97,116,101,95,100,121,110, + 97,109,105,99,114,153,0,0,0,114,121,0,0,0,114,52, + 0,0,0,41,3,114,123,0,0,0,114,191,0,0,0,114, + 223,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,219,0,0,0,98,4,0,0,115,16,0,0, + 0,4,2,6,1,4,255,6,2,8,1,4,255,4,2,255, + 128,122,33,69,120,116,101,110,115,105,111,110,70,105,108,101, + 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,5,0,0,0,67,0,0,0,115,36,0, + 0,0,116,0,160,1,116,2,106,3,124,1,161,2,1,0, + 116,0,160,4,100,1,124,0,106,5,124,0,106,6,161,3, + 1,0,100,2,83,0,41,3,122,30,73,110,105,116,105,97, + 108,105,122,101,32,97,110,32,101,120,116,101,110,115,105,111, + 110,32,109,111,100,117,108,101,122,40,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,32,123,33,114,125,32, + 101,120,101,99,117,116,101,100,32,102,114,111,109,32,123,33, + 114,125,78,41,7,114,139,0,0,0,114,221,0,0,0,114, + 167,0,0,0,90,12,101,120,101,99,95,100,121,110,97,109, + 105,99,114,153,0,0,0,114,121,0,0,0,114,52,0,0, + 0,169,2,114,123,0,0,0,114,223,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,224,0,0, + 0,106,4,0,0,115,10,0,0,0,14,2,6,1,8,1, + 8,255,255,128,122,31,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,36, + 0,0,0,116,0,124,0,106,1,131,1,100,1,25,0,137, + 0,116,2,135,0,102,1,100,2,100,3,132,8,116,3,68, + 0,131,1,131,1,83,0,41,5,122,49,82,101,116,117,114, + 110,32,84,114,117,101,32,105,102,32,116,104,101,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,105, + 115,32,97,32,112,97,99,107,97,103,101,46,114,3,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,4,0,0,0,51,0,0,0,115,26,0,0,0,124, + 0,93,18,125,1,136,0,100,0,124,1,23,0,107,2,86, + 0,1,0,113,2,100,1,83,0,41,2,114,216,0,0,0, + 78,114,7,0,0,0,169,2,114,5,0,0,0,218,6,115, + 117,102,102,105,120,169,1,90,9,102,105,108,101,95,110,97, + 109,101,114,7,0,0,0,114,8,0,0,0,114,9,0,0, + 0,115,4,0,0,115,8,0,0,0,4,0,2,1,20,255, + 255,128,122,49,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,111,99,97,108,115,62,46,60,103,101,110, + 101,120,112,114,62,78,41,4,114,55,0,0,0,114,52,0, + 0,0,218,3,97,110,121,114,212,0,0,0,114,226,0,0, + 0,114,7,0,0,0,114,16,1,0,0,114,8,0,0,0, + 114,186,0,0,0,112,4,0,0,115,10,0,0,0,14,2, + 12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,101, + 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32, 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,123,33,114,125,32,108,111,97,100,101,100,32,102,114,111, - 109,32,123,33,114,125,78,41,7,114,139,0,0,0,114,221, - 0,0,0,114,167,0,0,0,90,14,99,114,101,97,116,101, - 95,100,121,110,97,109,105,99,114,153,0,0,0,114,121,0, - 0,0,114,52,0,0,0,41,3,114,123,0,0,0,114,191, - 0,0,0,114,223,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,219,0,0,0,98,4,0,0, - 115,16,0,0,0,4,2,6,1,4,255,6,2,8,1,4, - 255,4,2,255,128,122,33,69,120,116,101,110,115,105,111,110, - 70,105,108,101,76,111,97,100,101,114,46,99,114,101,97,116, - 101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,5,0,0,0,67,0,0, - 0,115,36,0,0,0,116,0,160,1,116,2,106,3,124,1, - 161,2,1,0,116,0,160,4,100,1,124,0,106,5,124,0, - 106,6,161,3,1,0,100,2,83,0,41,3,122,30,73,110, - 105,116,105,97,108,105,122,101,32,97,110,32,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,122,40,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,123, - 33,114,125,32,101,120,101,99,117,116,101,100,32,102,114,111, - 109,32,123,33,114,125,78,41,7,114,139,0,0,0,114,221, - 0,0,0,114,167,0,0,0,90,12,101,120,101,99,95,100, - 121,110,97,109,105,99,114,153,0,0,0,114,121,0,0,0, - 114,52,0,0,0,169,2,114,123,0,0,0,114,223,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,224,0,0,0,106,4,0,0,115,12,0,0,0,14,2, - 6,1,8,1,4,255,4,128,255,128,122,31,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 3,0,0,0,115,36,0,0,0,116,0,124,0,106,1,131, - 1,100,1,25,0,137,0,116,2,135,0,102,1,100,2,100, - 3,132,8,116,3,68,0,131,1,131,1,83,0,41,5,122, - 49,82,101,116,117,114,110,32,84,114,117,101,32,105,102,32, - 116,104,101,32,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,32,105,115,32,97,32,112,97,99,107,97,103, - 101,46,114,3,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,51,0,0,0, - 115,26,0,0,0,124,0,93,18,125,1,136,0,100,0,124, - 1,23,0,107,2,86,0,1,0,113,2,100,1,83,0,41, - 2,114,216,0,0,0,78,114,7,0,0,0,169,2,114,5, - 0,0,0,218,6,115,117,102,102,105,120,169,1,90,9,102, - 105,108,101,95,110,97,109,101,114,7,0,0,0,114,8,0, - 0,0,114,9,0,0,0,115,4,0,0,115,10,0,0,0, - 4,0,2,1,16,255,4,128,255,128,122,49,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,111,99,97, - 108,115,62,46,60,103,101,110,101,120,112,114,62,78,41,4, - 114,55,0,0,0,114,52,0,0,0,218,3,97,110,121,114, - 212,0,0,0,114,226,0,0,0,114,7,0,0,0,114,16, - 1,0,0,114,8,0,0,0,114,186,0,0,0,112,4,0, - 0,115,10,0,0,0,14,2,12,1,2,1,8,255,255,128, - 122,30,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,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, - 83,0,41,2,122,63,82,101,116,117,114,110,32,78,111,110, - 101,32,97,115,32,97,110,32,101,120,116,101,110,115,105,111, - 110,32,109,111,100,117,108,101,32,99,97,110,110,111,116,32, - 99,114,101,97,116,101,32,97,32,99,111,100,101,32,111,98, - 106,101,99,116,46,78,114,7,0,0,0,114,226,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 220,0,0,0,118,4,0,0,115,4,0,0,0,4,2,255, - 128,122,28,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,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,122,53,82,101,116,117,114,110,32,78,111,110,101, - 32,97,115,32,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,115,32,104,97,118,101,32,110,111,32,115,111, - 117,114,99,101,32,99,111,100,101,46,78,114,7,0,0,0, - 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,236,0,0,0,122,4,0,0,115,4,0, - 0,0,4,2,255,128,122,30,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,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 6,0,0,0,124,0,106,0,83,0,114,1,1,0,0,114, - 56,0,0,0,114,226,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,183,0,0,0,126,4,0, - 0,115,4,0,0,0,6,3,255,128,122,32,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,102,105,108,101,110,97,109,101,78,41,14,114, - 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, - 0,0,0,114,216,0,0,0,114,250,0,0,0,114,254,0, - 0,0,114,219,0,0,0,114,224,0,0,0,114,186,0,0, - 0,114,220,0,0,0,114,236,0,0,0,114,140,0,0,0, - 114,183,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,3,1,0,0,79,4, - 0,0,115,26,0,0,0,8,0,4,2,8,6,8,4,8, - 4,8,3,8,8,8,6,8,6,8,4,2,4,14,1,255, - 128,114,3,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, - 104,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, - 100,10,100,11,132,0,90,8,100,12,100,13,132,0,90,9, - 100,14,100,15,132,0,90,10,100,16,100,17,132,0,90,11, - 100,18,100,19,132,0,90,12,100,20,100,21,132,0,90,13, - 100,22,100,23,132,0,90,14,100,24,83,0,41,25,218,14, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,97,38, - 1,0,0,82,101,112,114,101,115,101,110,116,115,32,97,32, - 110,97,109,101,115,112,97,99,101,32,112,97,99,107,97,103, - 101,39,115,32,112,97,116,104,46,32,32,73,116,32,117,115, - 101,115,32,116,104,101,32,109,111,100,117,108,101,32,110,97, - 109,101,10,32,32,32,32,116,111,32,102,105,110,100,32,105, - 116,115,32,112,97,114,101,110,116,32,109,111,100,117,108,101, - 44,32,97,110,100,32,102,114,111,109,32,116,104,101,114,101, - 32,105,116,32,108,111,111,107,115,32,117,112,32,116,104,101, - 32,112,97,114,101,110,116,39,115,10,32,32,32,32,95,95, - 112,97,116,104,95,95,46,32,32,87,104,101,110,32,116,104, - 105,115,32,99,104,97,110,103,101,115,44,32,116,104,101,32, - 109,111,100,117,108,101,39,115,32,111,119,110,32,112,97,116, - 104,32,105,115,32,114,101,99,111,109,112,117,116,101,100,44, - 10,32,32,32,32,117,115,105,110,103,32,112,97,116,104,95, - 102,105,110,100,101,114,46,32,32,70,111,114,32,116,111,112, - 45,108,101,118,101,108,32,109,111,100,117,108,101,115,44,32, - 116,104,101,32,112,97,114,101,110,116,32,109,111,100,117,108, - 101,39,115,32,112,97,116,104,10,32,32,32,32,105,115,32, - 115,121,115,46,112,97,116,104,46,99,4,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,3,0,0,0,67,0, - 0,0,115,36,0,0,0,124,1,124,0,95,0,124,2,124, - 0,95,1,116,2,124,0,160,3,161,0,131,1,124,0,95, - 4,124,3,124,0,95,5,100,0,83,0,114,114,0,0,0, - 41,6,218,5,95,110,97,109,101,218,5,95,112,97,116,104, - 114,116,0,0,0,218,16,95,103,101,116,95,112,97,114,101, - 110,116,95,112,97,116,104,218,17,95,108,97,115,116,95,112, - 97,114,101,110,116,95,112,97,116,104,218,12,95,112,97,116, - 104,95,102,105,110,100,101,114,169,4,114,123,0,0,0,114, - 121,0,0,0,114,52,0,0,0,90,11,112,97,116,104,95, - 102,105,110,100,101,114,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,216,0,0,0,139,4,0,0,115,12, - 0,0,0,6,1,6,1,14,1,6,1,4,128,255,128,122, - 23,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,0,0,0,0,4,0,0,0,3,0,0,0,67,0,0, - 0,115,38,0,0,0,124,0,106,0,160,1,100,1,161,1, - 92,3,125,1,125,2,125,3,124,2,100,2,107,2,114,30, - 100,3,83,0,124,1,100,4,102,2,83,0,41,6,122,62, - 82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32, - 111,102,32,40,112,97,114,101,110,116,45,109,111,100,117,108, - 101,45,110,97,109,101,44,32,112,97,114,101,110,116,45,112, - 97,116,104,45,97,116,116,114,45,110,97,109,101,41,114,79, - 0,0,0,114,10,0,0,0,41,2,114,15,0,0,0,114, - 52,0,0,0,90,8,95,95,112,97,116,104,95,95,78,41, - 2,114,19,1,0,0,114,49,0,0,0,41,4,114,123,0, - 0,0,114,11,1,0,0,218,3,100,111,116,90,2,109,101, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 23,95,102,105,110,100,95,112,97,114,101,110,116,95,112,97, - 116,104,95,110,97,109,101,115,145,4,0,0,115,10,0,0, - 0,18,2,8,1,4,2,8,3,255,128,122,38,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,101,115,99,1,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,3,0,0,0,67,0,0,0,115,28,0,0, - 0,124,0,160,0,161,0,92,2,125,1,125,2,116,1,116, - 2,106,3,124,1,25,0,124,2,131,2,83,0,114,114,0, - 0,0,41,4,114,26,1,0,0,114,135,0,0,0,114,15, - 0,0,0,218,7,109,111,100,117,108,101,115,41,3,114,123, - 0,0,0,90,18,112,97,114,101,110,116,95,109,111,100,117, - 108,101,95,110,97,109,101,90,14,112,97,116,104,95,97,116, - 116,114,95,110,97,109,101,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,21,1,0,0,155,4,0,0,115, - 6,0,0,0,12,1,16,1,255,128,122,31,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,0,0,0,0,3,0,0,0,4,0,0,0, - 67,0,0,0,115,80,0,0,0,116,0,124,0,160,1,161, - 0,131,1,125,1,124,1,124,0,106,2,107,3,114,74,124, - 0,160,3,124,0,106,4,124,1,161,2,125,2,124,2,100, - 0,117,1,114,68,124,2,106,5,100,0,117,0,114,68,124, - 2,106,6,114,68,124,2,106,6,124,0,95,7,124,1,124, - 0,95,2,124,0,106,7,83,0,114,114,0,0,0,41,8, - 114,116,0,0,0,114,21,1,0,0,114,22,1,0,0,114, - 23,1,0,0,114,19,1,0,0,114,144,0,0,0,114,182, - 0,0,0,114,20,1,0,0,41,3,114,123,0,0,0,90, - 11,112,97,114,101,110,116,95,112,97,116,104,114,191,0,0, + 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, + 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,7, + 0,0,0,114,226,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,220,0,0,0,118,4,0,0, + 115,4,0,0,0,4,2,255,128,122,28,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, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,53,82,101,116, + 117,114,110,32,78,111,110,101,32,97,115,32,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,115,32,104,97, + 118,101,32,110,111,32,115,111,117,114,99,101,32,99,111,100, + 101,46,78,114,7,0,0,0,114,226,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,236,0,0, + 0,122,4,0,0,115,4,0,0,0,4,2,255,128,122,30, + 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,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, + 0,0,0,67,0,0,0,115,6,0,0,0,124,0,106,0, + 83,0,114,1,1,0,0,114,56,0,0,0,114,226,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,12,95,114,101,99,97,108,99,117,108,97,116,101,159,4, - 0,0,115,18,0,0,0,12,2,10,1,14,1,18,3,6, - 1,8,1,6,1,6,1,255,128,122,27,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,46,95,114,101,99,97,108, - 99,117,108,97,116,101,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 12,0,0,0,116,0,124,0,160,1,161,0,131,1,83,0, - 114,114,0,0,0,41,2,218,4,105,116,101,114,114,28,1, - 0,0,114,253,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,8,95,95,105,116,101,114,95,95, - 172,4,0,0,115,4,0,0,0,12,1,255,128,122,23,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, - 105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, - 12,0,0,0,124,0,160,0,161,0,124,1,25,0,83,0, - 114,114,0,0,0,169,1,114,28,1,0,0,41,2,114,123, - 0,0,0,218,5,105,110,100,101,120,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,11,95,95,103,101,116, - 105,116,101,109,95,95,175,4,0,0,115,4,0,0,0,12, - 1,255,128,122,26,95,78,97,109,101,115,112,97,99,101,80, - 97,116,104,46,95,95,103,101,116,105,116,101,109,95,95,99, - 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,14,0,0,0,124,2,124, - 0,106,0,124,1,60,0,100,0,83,0,114,114,0,0,0, - 41,1,114,20,1,0,0,41,3,114,123,0,0,0,114,32, - 1,0,0,114,52,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,11,95,95,115,101,116,105,116, - 101,109,95,95,178,4,0,0,115,6,0,0,0,10,1,4, - 128,255,128,122,26,95,78,97,109,101,115,112,97,99,101,80, - 97,116,104,46,95,95,115,101,116,105,116,101,109,95,95,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,12,0,0,0,116,0,124, - 0,160,1,161,0,131,1,83,0,114,114,0,0,0,41,2, - 114,4,0,0,0,114,28,1,0,0,114,253,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,7, - 95,95,108,101,110,95,95,181,4,0,0,115,4,0,0,0, - 12,1,255,128,122,22,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, + 114,183,0,0,0,126,4,0,0,115,4,0,0,0,6,3, + 255,128,122,32,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,101, + 110,97,109,101,78,41,14,114,130,0,0,0,114,129,0,0, + 0,114,131,0,0,0,114,132,0,0,0,114,216,0,0,0, + 114,250,0,0,0,114,254,0,0,0,114,219,0,0,0,114, + 224,0,0,0,114,186,0,0,0,114,220,0,0,0,114,236, + 0,0,0,114,140,0,0,0,114,183,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,3,1,0,0,79,4,0,0,115,26,0,0,0,8, + 0,4,2,8,6,8,4,8,4,8,3,8,8,8,6,8, + 6,8,4,2,4,14,1,255,128,114,3,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,64,0,0,0,115,104,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6, + 100,8,100,9,132,0,90,7,100,10,100,11,132,0,90,8, + 100,12,100,13,132,0,90,9,100,14,100,15,132,0,90,10, + 100,16,100,17,132,0,90,11,100,18,100,19,132,0,90,12, + 100,20,100,21,132,0,90,13,100,22,100,23,132,0,90,14, + 100,24,83,0,41,25,218,14,95,78,97,109,101,115,112,97, + 99,101,80,97,116,104,97,38,1,0,0,82,101,112,114,101, + 115,101,110,116,115,32,97,32,110,97,109,101,115,112,97,99, + 101,32,112,97,99,107,97,103,101,39,115,32,112,97,116,104, + 46,32,32,73,116,32,117,115,101,115,32,116,104,101,32,109, + 111,100,117,108,101,32,110,97,109,101,10,32,32,32,32,116, + 111,32,102,105,110,100,32,105,116,115,32,112,97,114,101,110, + 116,32,109,111,100,117,108,101,44,32,97,110,100,32,102,114, + 111,109,32,116,104,101,114,101,32,105,116,32,108,111,111,107, + 115,32,117,112,32,116,104,101,32,112,97,114,101,110,116,39, + 115,10,32,32,32,32,95,95,112,97,116,104,95,95,46,32, + 32,87,104,101,110,32,116,104,105,115,32,99,104,97,110,103, + 101,115,44,32,116,104,101,32,109,111,100,117,108,101,39,115, + 32,111,119,110,32,112,97,116,104,32,105,115,32,114,101,99, + 111,109,112,117,116,101,100,44,10,32,32,32,32,117,115,105, + 110,103,32,112,97,116,104,95,102,105,110,100,101,114,46,32, + 32,70,111,114,32,116,111,112,45,108,101,118,101,108,32,109, + 111,100,117,108,101,115,44,32,116,104,101,32,112,97,114,101, + 110,116,32,109,111,100,117,108,101,39,115,32,112,97,116,104, + 10,32,32,32,32,105,115,32,115,121,115,46,112,97,116,104, + 46,99,4,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,3,0,0,0,67,0,0,0,115,36,0,0,0,124, + 1,124,0,95,0,124,2,124,0,95,1,116,2,124,0,160, + 3,161,0,131,1,124,0,95,4,124,3,124,0,95,5,100, + 0,83,0,114,114,0,0,0,41,6,218,5,95,110,97,109, + 101,218,5,95,112,97,116,104,114,116,0,0,0,218,16,95, + 103,101,116,95,112,97,114,101,110,116,95,112,97,116,104,218, + 17,95,108,97,115,116,95,112,97,114,101,110,116,95,112,97, + 116,104,218,12,95,112,97,116,104,95,102,105,110,100,101,114, + 169,4,114,123,0,0,0,114,121,0,0,0,114,52,0,0, + 0,90,11,112,97,116,104,95,102,105,110,100,101,114,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, + 0,0,139,4,0,0,115,10,0,0,0,6,1,6,1,14, + 1,10,1,255,128,122,23,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,0,0,0,0,4,0,0,0,3, + 0,0,0,67,0,0,0,115,38,0,0,0,124,0,106,0, + 160,1,100,1,161,1,92,3,125,1,125,2,125,3,124,2, + 100,2,107,2,114,30,100,3,83,0,124,1,100,4,102,2, + 83,0,41,6,122,62,82,101,116,117,114,110,115,32,97,32, + 116,117,112,108,101,32,111,102,32,40,112,97,114,101,110,116, + 45,109,111,100,117,108,101,45,110,97,109,101,44,32,112,97, + 114,101,110,116,45,112,97,116,104,45,97,116,116,114,45,110, + 97,109,101,41,114,79,0,0,0,114,10,0,0,0,41,2, + 114,15,0,0,0,114,52,0,0,0,90,8,95,95,112,97, + 116,104,95,95,78,41,2,114,19,1,0,0,114,49,0,0, + 0,41,4,114,123,0,0,0,114,11,1,0,0,218,3,100, + 111,116,90,2,109,101,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,23,95,102,105,110,100,95,112,97,114, + 101,110,116,95,112,97,116,104,95,110,97,109,101,115,145,4, + 0,0,115,10,0,0,0,18,2,8,1,4,2,8,3,255, + 128,122,38,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,101,115,99,1,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, + 0,0,115,28,0,0,0,124,0,160,0,161,0,92,2,125, + 1,125,2,116,1,116,2,106,3,124,1,25,0,124,2,131, + 2,83,0,114,114,0,0,0,41,4,114,26,1,0,0,114, + 135,0,0,0,114,15,0,0,0,218,7,109,111,100,117,108, + 101,115,41,3,114,123,0,0,0,90,18,112,97,114,101,110, + 116,95,109,111,100,117,108,101,95,110,97,109,101,90,14,112, + 97,116,104,95,97,116,116,114,95,110,97,109,101,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,21,1,0, + 0,155,4,0,0,115,6,0,0,0,12,1,16,1,255,128, + 122,31,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,0,0,0,0,3,0, + 0,0,4,0,0,0,67,0,0,0,115,80,0,0,0,116, + 0,124,0,160,1,161,0,131,1,125,1,124,1,124,0,106, + 2,107,3,114,74,124,0,160,3,124,0,106,4,124,1,161, + 2,125,2,124,2,100,0,117,1,114,68,124,2,106,5,100, + 0,117,0,114,68,124,2,106,6,114,68,124,2,106,6,124, + 0,95,7,124,1,124,0,95,2,124,0,106,7,83,0,114, + 114,0,0,0,41,8,114,116,0,0,0,114,21,1,0,0, + 114,22,1,0,0,114,23,1,0,0,114,19,1,0,0,114, + 144,0,0,0,114,182,0,0,0,114,20,1,0,0,41,3, + 114,123,0,0,0,90,11,112,97,114,101,110,116,95,112,97, + 116,104,114,191,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,12,95,114,101,99,97,108,99,117, + 108,97,116,101,159,4,0,0,115,18,0,0,0,12,2,10, + 1,14,1,18,3,6,1,8,1,6,1,6,1,255,128,122, + 27,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,114,101,99,97,108,99,117,108,97,116,101,99,1,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, - 106,1,161,1,83,0,41,2,78,122,20,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,40,123,33,114,125,41,41, - 2,114,70,0,0,0,114,20,1,0,0,114,253,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 8,95,95,114,101,112,114,95,95,184,4,0,0,115,4,0, - 0,0,12,1,255,128,122,23,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,0,0,0,0,2,0,0,0, - 3,0,0,0,67,0,0,0,115,12,0,0,0,124,1,124, - 0,160,0,161,0,118,0,83,0,114,114,0,0,0,114,31, - 1,0,0,169,2,114,123,0,0,0,218,4,105,116,101,109, + 0,67,0,0,0,115,12,0,0,0,116,0,124,0,160,1, + 161,0,131,1,83,0,114,114,0,0,0,41,2,218,4,105, + 116,101,114,114,28,1,0,0,114,253,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,8,95,95, + 105,116,101,114,95,95,172,4,0,0,115,4,0,0,0,12, + 1,255,128,122,23,95,78,97,109,101,115,112,97,99,101,80, + 97,116,104,46,95,95,105,116,101,114,95,95,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, + 0,67,0,0,0,115,12,0,0,0,124,0,160,0,161,0, + 124,1,25,0,83,0,114,114,0,0,0,169,1,114,28,1, + 0,0,41,2,114,123,0,0,0,218,5,105,110,100,101,120, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 12,95,95,99,111,110,116,97,105,110,115,95,95,187,4,0, - 0,115,4,0,0,0,12,1,255,128,122,27,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, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,16,0,0,0,124,0,106,0,160,1,124,1,161,1,1, - 0,100,0,83,0,114,114,0,0,0,41,2,114,20,1,0, - 0,114,190,0,0,0,114,37,1,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,190,0,0,0,190, - 4,0,0,115,6,0,0,0,12,1,4,128,255,128,122,21, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,97, - 112,112,101,110,100,78,41,15,114,130,0,0,0,114,129,0, - 0,0,114,131,0,0,0,114,132,0,0,0,114,216,0,0, - 0,114,26,1,0,0,114,21,1,0,0,114,28,1,0,0, - 114,30,1,0,0,114,33,1,0,0,114,34,1,0,0,114, - 35,1,0,0,114,36,1,0,0,114,39,1,0,0,114,190, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,18,1,0,0,132,4,0,0, - 115,28,0,0,0,8,0,4,1,8,6,8,6,8,10,8, - 4,8,13,8,3,8,3,8,3,8,3,8,3,12,3,255, - 128,114,18,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, - 80,0,0,0,101,0,90,1,100,0,90,2,100,1,100,2, - 132,0,90,3,101,4,100,3,100,4,132,0,131,1,90,5, - 100,5,100,6,132,0,90,6,100,7,100,8,132,0,90,7, - 100,9,100,10,132,0,90,8,100,11,100,12,132,0,90,9, - 100,13,100,14,132,0,90,10,100,15,100,16,132,0,90,11, - 100,17,83,0,41,18,218,16,95,78,97,109,101,115,112,97, - 99,101,76,111,97,100,101,114,99,4,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, - 0,115,18,0,0,0,116,0,124,1,124,2,124,3,131,3, - 124,0,95,1,100,0,83,0,114,114,0,0,0,41,2,114, - 18,1,0,0,114,20,1,0,0,114,24,1,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, - 0,0,196,4,0,0,115,6,0,0,0,14,1,4,128,255, + 11,95,95,103,101,116,105,116,101,109,95,95,175,4,0,0, + 115,4,0,0,0,12,1,255,128,122,26,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,103,101,116,105, + 116,101,109,95,95,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,14, + 0,0,0,124,2,124,0,106,0,124,1,60,0,100,0,83, + 0,114,114,0,0,0,41,1,114,20,1,0,0,41,3,114, + 123,0,0,0,114,32,1,0,0,114,52,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, + 95,115,101,116,105,116,101,109,95,95,178,4,0,0,115,4, + 0,0,0,14,1,255,128,122,26,95,78,97,109,101,115,112, + 97,99,101,80,97,116,104,46,95,95,115,101,116,105,116,101, + 109,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, + 0,116,0,124,0,160,1,161,0,131,1,83,0,114,114,0, + 0,0,41,2,114,4,0,0,0,114,28,1,0,0,114,253, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,7,95,95,108,101,110,95,95,181,4,0,0,115, + 4,0,0,0,12,1,255,128,122,22,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,0,0,0,0,1,0,0, + 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, + 160,0,124,0,106,1,161,1,83,0,41,2,78,122,20,95, + 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, + 114,125,41,41,2,114,70,0,0,0,114,20,1,0,0,114, + 253,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,8,95,95,114,101,112,114,95,95,184,4,0, + 0,115,4,0,0,0,12,1,255,128,122,23,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,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, + 0,124,1,124,0,160,0,161,0,118,0,83,0,114,114,0, + 0,0,114,31,1,0,0,169,2,114,123,0,0,0,218,4, + 105,116,101,109,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, + 95,187,4,0,0,115,4,0,0,0,12,1,255,128,122,27, + 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,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124, + 1,161,1,1,0,100,0,83,0,114,114,0,0,0,41,2, + 114,20,1,0,0,114,190,0,0,0,114,37,1,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,190, + 0,0,0,190,4,0,0,115,4,0,0,0,16,1,255,128, + 122,21,95,78,97,109,101,115,112,97,99,101,80,97,116,104, + 46,97,112,112,101,110,100,78,41,15,114,130,0,0,0,114, + 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,216, + 0,0,0,114,26,1,0,0,114,21,1,0,0,114,28,1, + 0,0,114,30,1,0,0,114,33,1,0,0,114,34,1,0, + 0,114,35,1,0,0,114,36,1,0,0,114,39,1,0,0, + 114,190,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,18,1,0,0,132,4, + 0,0,115,28,0,0,0,8,0,4,1,8,6,8,6,8, + 10,8,4,8,13,8,3,8,3,8,3,8,3,8,3,12, + 3,255,128,114,18,1,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, + 0,115,80,0,0,0,101,0,90,1,100,0,90,2,100,1, + 100,2,132,0,90,3,101,4,100,3,100,4,132,0,131,1, + 90,5,100,5,100,6,132,0,90,6,100,7,100,8,132,0, + 90,7,100,9,100,10,132,0,90,8,100,11,100,12,132,0, + 90,9,100,13,100,14,132,0,90,10,100,15,100,16,132,0, + 90,11,100,17,83,0,41,18,218,16,95,78,97,109,101,115, + 112,97,99,101,76,111,97,100,101,114,99,4,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, + 0,0,0,115,18,0,0,0,116,0,124,1,124,2,124,3, + 131,3,124,0,95,1,100,0,83,0,114,114,0,0,0,41, + 2,114,18,1,0,0,114,20,1,0,0,114,24,1,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 216,0,0,0,196,4,0,0,115,4,0,0,0,18,1,255, 128,122,25,95,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,1,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, @@ -2027,644 +2026,643 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,115,4,0,0,0,100,0,83,0,114,114,0,0, 0,114,7,0,0,0,114,13,1,0,0,114,7,0,0,0, 114,7,0,0,0,114,8,0,0,0,114,224,0,0,0,220, - 4,0,0,115,6,0,0,0,2,1,2,128,255,128,122,28, - 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, - 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,26,0,0,0,116,0,160,1,100,1, - 124,0,106,2,161,2,1,0,116,0,160,3,124,0,124,1, - 161,2,83,0,41,3,122,98,76,111,97,100,32,97,32,110, - 97,109,101,115,112,97,99,101,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, - 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,109, - 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,46, - 10,10,32,32,32,32,32,32,32,32,122,38,110,97,109,101, - 115,112,97,99,101,32,109,111,100,117,108,101,32,108,111,97, - 100,101,100,32,119,105,116,104,32,112,97,116,104,32,123,33, - 114,125,78,41,4,114,139,0,0,0,114,153,0,0,0,114, - 20,1,0,0,114,225,0,0,0,114,226,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,227,0, - 0,0,223,4,0,0,115,10,0,0,0,6,7,4,1,4, - 255,12,2,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0, - 114,131,0,0,0,114,216,0,0,0,114,213,0,0,0,114, - 41,1,0,0,114,186,0,0,0,114,236,0,0,0,114,220, - 0,0,0,114,219,0,0,0,114,224,0,0,0,114,227,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,40,1,0,0,195,4,0,0,115, - 22,0,0,0,8,0,8,1,2,3,10,1,8,8,8,3, - 8,3,8,3,8,3,12,3,255,128,114,40,1,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,64,0,0,0,115,118,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,101,4,100,2,100,3,132, - 0,131,1,90,5,101,4,100,4,100,5,132,0,131,1,90, - 6,101,7,100,6,100,7,132,0,131,1,90,8,101,7,100, - 8,100,9,132,0,131,1,90,9,101,7,100,19,100,11,100, - 12,132,1,131,1,90,10,101,7,100,20,100,13,100,14,132, - 1,131,1,90,11,101,7,100,21,100,15,100,16,132,1,131, - 1,90,12,101,4,100,17,100,18,132,0,131,1,90,13,100, - 10,83,0,41,22,218,10,80,97,116,104,70,105,110,100,101, - 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, - 100,101,114,32,102,111,114,32,115,121,115,46,112,97,116,104, - 32,97,110,100,32,112,97,99,107,97,103,101,32,95,95,112, - 97,116,104,95,95,32,97,116,116,114,105,98,117,116,101,115, - 46,99,0,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116, - 0,116,1,106,2,160,3,161,0,131,1,68,0,93,44,92, - 2,125,0,125,1,124,1,100,1,117,0,114,40,116,1,106, - 2,124,0,61,0,113,14,116,4,124,1,100,2,131,2,114, - 14,124,1,160,5,161,0,1,0,113,14,100,1,83,0,41, - 3,122,125,67,97,108,108,32,116,104,101,32,105,110,118,97, - 108,105,100,97,116,101,95,99,97,99,104,101,115,40,41,32, - 109,101,116,104,111,100,32,111,110,32,97,108,108,32,112,97, - 116,104,32,101,110,116,114,121,32,102,105,110,100,101,114,115, - 10,32,32,32,32,32,32,32,32,115,116,111,114,101,100,32, - 105,110,32,115,121,115,46,112,97,116,104,95,105,109,112,111, - 114,116,101,114,95,99,97,99,104,101,115,32,40,119,104,101, - 114,101,32,105,109,112,108,101,109,101,110,116,101,100,41,46, - 78,218,17,105,110,118,97,108,105,100,97,116,101,95,99,97, - 99,104,101,115,41,6,218,4,108,105,115,116,114,15,0,0, - 0,218,19,112,97,116,104,95,105,109,112,111,114,116,101,114, - 95,99,97,99,104,101,218,5,105,116,101,109,115,114,133,0, - 0,0,114,43,1,0,0,41,2,114,121,0,0,0,218,6, - 102,105,110,100,101,114,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,43,1,0,0,241,4,0,0,115,14, - 0,0,0,22,4,8,1,10,1,10,1,10,1,4,128,255, - 128,122,28,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, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 9,0,0,0,67,0,0,0,115,76,0,0,0,116,0,106, - 1,100,1,117,1,114,28,116,0,106,1,115,28,116,2,160, - 3,100,2,116,4,161,2,1,0,116,0,106,1,68,0,93, - 36,125,1,122,14,124,1,124,0,131,1,87,0,2,0,1, - 0,83,0,4,0,116,5,121,70,1,0,1,0,1,0,89, - 0,113,34,48,0,100,1,83,0,41,3,122,46,83,101,97, - 114,99,104,32,115,121,115,46,112,97,116,104,95,104,111,111, - 107,115,32,102,111,114,32,97,32,102,105,110,100,101,114,32, - 102,111,114,32,39,112,97,116,104,39,46,78,122,23,115,121, - 115,46,112,97,116,104,95,104,111,111,107,115,32,105,115,32, - 101,109,112,116,121,41,6,114,15,0,0,0,218,10,112,97, - 116,104,95,104,111,111,107,115,114,81,0,0,0,114,82,0, - 0,0,114,142,0,0,0,114,122,0,0,0,41,2,114,52, - 0,0,0,90,4,104,111,111,107,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, - 104,111,111,107,115,251,4,0,0,115,18,0,0,0,16,3, - 12,1,10,1,2,1,14,1,12,1,6,1,4,2,255,128, - 122,22,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,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, - 0,115,100,0,0,0,124,1,100,1,107,2,114,42,122,12, - 116,0,160,1,161,0,125,1,87,0,110,20,4,0,116,2, - 121,40,1,0,1,0,1,0,89,0,100,2,83,0,48,0, - 122,16,116,3,106,4,124,1,25,0,125,2,87,0,124,2, - 83,0,4,0,116,5,121,98,1,0,1,0,1,0,124,0, - 160,6,124,1,161,1,125,2,124,2,116,3,106,4,124,1, - 60,0,89,0,124,2,83,0,48,0,41,3,122,210,71,101, - 116,32,116,104,101,32,102,105,110,100,101,114,32,102,111,114, - 32,116,104,101,32,112,97,116,104,32,101,110,116,114,121,32, - 102,114,111,109,32,115,121,115,46,112,97,116,104,95,105,109, - 112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,32, - 32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,97, - 116,104,32,101,110,116,114,121,32,105,115,32,110,111,116,32, - 105,110,32,116,104,101,32,99,97,99,104,101,44,32,102,105, - 110,100,32,116,104,101,32,97,112,112,114,111,112,114,105,97, - 116,101,32,102,105,110,100,101,114,10,32,32,32,32,32,32, - 32,32,97,110,100,32,99,97,99,104,101,32,105,116,46,32, - 73,102,32,110,111,32,102,105,110,100,101,114,32,105,115,32, - 97,118,97,105,108,97,98,108,101,44,32,115,116,111,114,101, - 32,78,111,110,101,46,10,10,32,32,32,32,32,32,32,32, - 114,10,0,0,0,78,41,7,114,18,0,0,0,114,63,0, - 0,0,218,17,70,105,108,101,78,111,116,70,111,117,110,100, - 69,114,114,111,114,114,15,0,0,0,114,45,1,0,0,218, - 8,75,101,121,69,114,114,111,114,114,49,1,0,0,41,3, - 114,202,0,0,0,114,52,0,0,0,114,47,1,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,20, - 95,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,8,5,0,0,115,28,0,0,0,8,8,2, - 1,12,1,12,1,8,3,2,1,12,1,4,4,12,253,10, - 1,12,1,4,1,2,255,255,128,122,31,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,99,97,99,104,101,99,3,0,0,0,0, - 0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67, - 0,0,0,115,82,0,0,0,116,0,124,2,100,1,131,2, - 114,26,124,2,160,1,124,1,161,1,92,2,125,3,125,4, - 110,14,124,2,160,2,124,1,161,1,125,3,103,0,125,4, - 124,3,100,0,117,1,114,60,116,3,160,4,124,1,124,3, - 161,2,83,0,116,3,160,5,124,1,100,0,161,2,125,5, - 124,4,124,5,95,6,124,5,83,0,41,2,78,114,141,0, - 0,0,41,7,114,133,0,0,0,114,141,0,0,0,114,210, - 0,0,0,114,139,0,0,0,114,205,0,0,0,114,187,0, - 0,0,114,182,0,0,0,41,6,114,202,0,0,0,114,143, - 0,0,0,114,47,1,0,0,114,144,0,0,0,114,145,0, - 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,16,95,108,101,103,97,99,121,95, - 103,101,116,95,115,112,101,99,30,5,0,0,115,20,0,0, - 0,10,4,16,1,10,2,4,1,8,1,12,1,12,1,6, - 1,4,1,255,128,122,27,80,97,116,104,70,105,110,100,101, - 114,46,95,108,101,103,97,99,121,95,103,101,116,95,115,112, - 101,99,78,99,4,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,5,0,0,0,67,0,0,0,115,166,0,0, - 0,103,0,125,4,124,2,68,0,93,134,125,5,116,0,124, - 5,116,1,116,2,102,2,131,2,115,28,113,8,124,0,160, - 3,124,5,161,1,125,6,124,6,100,1,117,1,114,8,116, - 4,124,6,100,2,131,2,114,70,124,6,160,5,124,1,124, - 3,161,2,125,7,110,12,124,0,160,6,124,1,124,6,161, - 2,125,7,124,7,100,1,117,0,114,92,113,8,124,7,106, - 7,100,1,117,1,114,110,124,7,2,0,1,0,83,0,124, - 7,106,8,125,8,124,8,100,1,117,0,114,132,116,9,100, - 3,131,1,130,1,124,4,160,10,124,8,161,1,1,0,113, - 8,116,11,160,12,124,1,100,1,161,2,125,7,124,4,124, - 7,95,8,124,7,83,0,41,4,122,63,70,105,110,100,32, - 116,104,101,32,108,111,97,100,101,114,32,111,114,32,110,97, - 109,101,115,112,97,99,101,95,112,97,116,104,32,102,111,114, - 32,116,104,105,115,32,109,111,100,117,108,101,47,112,97,99, - 107,97,103,101,32,110,97,109,101,46,78,114,207,0,0,0, - 122,19,115,112,101,99,32,109,105,115,115,105,110,103,32,108, - 111,97,100,101,114,41,13,114,165,0,0,0,114,90,0,0, - 0,218,5,98,121,116,101,115,114,52,1,0,0,114,133,0, - 0,0,114,207,0,0,0,114,53,1,0,0,114,144,0,0, - 0,114,182,0,0,0,114,122,0,0,0,114,171,0,0,0, - 114,139,0,0,0,114,187,0,0,0,41,9,114,202,0,0, - 0,114,143,0,0,0,114,52,0,0,0,114,206,0,0,0, - 218,14,110,97,109,101,115,112,97,99,101,95,112,97,116,104, - 90,5,101,110,116,114,121,114,47,1,0,0,114,191,0,0, - 0,114,145,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,9,95,103,101,116,95,115,112,101,99, - 45,5,0,0,115,42,0,0,0,4,5,8,1,14,1,2, - 1,10,1,8,1,10,1,14,1,12,2,8,1,2,1,10, - 1,8,1,6,1,8,1,8,1,12,5,12,2,6,1,4, - 1,255,128,122,20,80,97,116,104,70,105,110,100,101,114,46, - 95,103,101,116,95,115,112,101,99,99,4,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,5,0,0,0,67,0, - 0,0,115,94,0,0,0,124,2,100,1,117,0,114,14,116, - 0,106,1,125,2,124,0,160,2,124,1,124,2,124,3,161, - 3,125,4,124,4,100,1,117,0,114,40,100,1,83,0,124, - 4,106,3,100,1,117,0,114,90,124,4,106,4,125,5,124, - 5,114,86,100,1,124,4,95,5,116,6,124,1,124,5,124, - 0,106,2,131,3,124,4,95,4,124,4,83,0,100,1,83, - 0,124,4,83,0,41,2,122,141,84,114,121,32,116,111,32, - 102,105,110,100,32,97,32,115,112,101,99,32,102,111,114,32, - 39,102,117,108,108,110,97,109,101,39,32,111,110,32,115,121, - 115,46,112,97,116,104,32,111,114,32,39,112,97,116,104,39, - 46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,115, - 101,97,114,99,104,32,105,115,32,98,97,115,101,100,32,111, - 110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,115, - 32,97,110,100,32,115,121,115,46,112,97,116,104,95,105,109, - 112,111,114,116,101,114,95,99,97,99,104,101,46,10,32,32, - 32,32,32,32,32,32,78,41,7,114,15,0,0,0,114,52, - 0,0,0,114,56,1,0,0,114,144,0,0,0,114,182,0, - 0,0,114,185,0,0,0,114,18,1,0,0,41,6,114,202, - 0,0,0,114,143,0,0,0,114,52,0,0,0,114,206,0, - 0,0,114,191,0,0,0,114,55,1,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,207,0,0,0, - 77,5,0,0,115,28,0,0,0,8,6,6,1,14,1,8, - 1,4,1,10,1,6,1,4,1,6,3,16,1,4,1,4, - 2,4,2,255,128,122,20,80,97,116,104,70,105,110,100,101, - 114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, - 67,0,0,0,115,30,0,0,0,124,0,160,0,124,1,124, - 2,161,2,125,3,124,3,100,1,117,0,114,24,100,1,83, - 0,124,3,106,1,83,0,41,2,122,170,102,105,110,100,32, - 116,104,101,32,109,111,100,117,108,101,32,111,110,32,115,121, - 115,46,112,97,116,104,32,111,114,32,39,112,97,116,104,39, - 32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,97, - 116,104,95,104,111,111,107,115,32,97,110,100,10,32,32,32, - 32,32,32,32,32,115,121,115,46,112,97,116,104,95,105,109, - 112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99, - 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, - 32,32,32,32,32,78,114,208,0,0,0,114,209,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 210,0,0,0,101,5,0,0,115,10,0,0,0,12,8,8, - 1,4,1,6,1,255,128,122,22,80,97,116,104,70,105,110, - 100,101,114,46,102,105,110,100,95,109,111,100,117,108,101,99, - 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 4,0,0,0,79,0,0,0,115,28,0,0,0,100,1,100, - 2,108,0,109,1,125,2,1,0,124,2,106,2,124,0,105, - 0,124,1,164,1,142,1,83,0,41,4,97,32,1,0,0, - 10,32,32,32,32,32,32,32,32,70,105,110,100,32,100,105, - 115,116,114,105,98,117,116,105,111,110,115,46,10,10,32,32, - 32,32,32,32,32,32,82,101,116,117,114,110,32,97,110,32, - 105,116,101,114,97,98,108,101,32,111,102,32,97,108,108,32, - 68,105,115,116,114,105,98,117,116,105,111,110,32,105,110,115, - 116,97,110,99,101,115,32,99,97,112,97,98,108,101,32,111, - 102,10,32,32,32,32,32,32,32,32,108,111,97,100,105,110, - 103,32,116,104,101,32,109,101,116,97,100,97,116,97,32,102, - 111,114,32,112,97,99,107,97,103,101,115,32,109,97,116,99, - 104,105,110,103,32,96,96,99,111,110,116,101,120,116,46,110, - 97,109,101,96,96,10,32,32,32,32,32,32,32,32,40,111, - 114,32,97,108,108,32,110,97,109,101,115,32,105,102,32,96, - 96,78,111,110,101,96,96,32,105,110,100,105,99,97,116,101, - 100,41,32,97,108,111,110,103,32,116,104,101,32,112,97,116, - 104,115,32,105,110,32,116,104,101,32,108,105,115,116,10,32, - 32,32,32,32,32,32,32,111,102,32,100,105,114,101,99,116, - 111,114,105,101,115,32,96,96,99,111,110,116,101,120,116,46, - 112,97,116,104,96,96,46,10,32,32,32,32,32,32,32,32, - 114,0,0,0,0,41,1,218,18,77,101,116,97,100,97,116, - 97,80,97,116,104,70,105,110,100,101,114,78,41,3,90,18, - 105,109,112,111,114,116,108,105,98,46,109,101,116,97,100,97, - 116,97,114,57,1,0,0,218,18,102,105,110,100,95,100,105, - 115,116,114,105,98,117,116,105,111,110,115,41,3,114,124,0, - 0,0,114,125,0,0,0,114,57,1,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,58,1,0,0, - 114,5,0,0,115,6,0,0,0,12,10,16,1,255,128,122, - 29,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, - 95,100,105,115,116,114,105,98,117,116,105,111,110,115,41,1, - 78,41,2,78,78,41,1,78,41,14,114,130,0,0,0,114, - 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,213, - 0,0,0,114,43,1,0,0,114,49,1,0,0,114,214,0, - 0,0,114,52,1,0,0,114,53,1,0,0,114,56,1,0, - 0,114,207,0,0,0,114,210,0,0,0,114,58,1,0,0, + 4,0,0,115,4,0,0,0,4,1,255,128,122,28,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, + 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, + 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, + 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, + 83,0,41,3,122,98,76,111,97,100,32,97,32,110,97,109, + 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, + 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, + 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, + 78,41,4,114,139,0,0,0,114,153,0,0,0,114,20,1, + 0,0,114,225,0,0,0,114,226,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,227,0,0,0, + 223,4,0,0,115,10,0,0,0,6,7,4,1,4,255,12, + 2,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0,114,131, + 0,0,0,114,216,0,0,0,114,213,0,0,0,114,41,1, + 0,0,114,186,0,0,0,114,236,0,0,0,114,220,0,0, + 0,114,219,0,0,0,114,224,0,0,0,114,227,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,42,1,0,0,237,4,0,0,115,38,0, - 0,0,8,0,4,2,2,2,10,1,2,9,10,1,2,12, - 10,1,2,21,10,1,2,14,12,1,2,31,12,1,2,23, - 12,1,2,12,14,1,255,128,114,42,1,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,64,0,0,0,115,90,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,101,6,90,7,100,6,100,7,132, - 0,90,8,100,8,100,9,132,0,90,9,100,19,100,11,100, - 12,132,1,90,10,100,13,100,14,132,0,90,11,101,12,100, - 15,100,16,132,0,131,1,90,13,100,17,100,18,132,0,90, - 14,100,10,83,0,41,20,218,10,70,105,108,101,70,105,110, - 100,101,114,122,172,70,105,108,101,45,98,97,115,101,100,32, - 102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,116, - 101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,116, - 104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,97, - 114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,101, - 114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,103, - 10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,119, - 104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,114, - 121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,32, - 104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,101, - 110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,32, - 32,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,6,0,0,0,7,0,0,0,115,84,0,0,0,103, - 0,125,3,124,2,68,0,93,32,92,2,137,0,125,4,124, - 3,160,0,135,0,102,1,100,1,100,2,132,8,124,4,68, - 0,131,1,161,1,1,0,113,8,124,3,124,0,95,1,124, - 1,112,54,100,3,124,0,95,2,100,4,124,0,95,3,116, - 4,131,0,124,0,95,5,116,4,131,0,124,0,95,6,100, - 5,83,0,41,6,122,154,73,110,105,116,105,97,108,105,122, - 101,32,119,105,116,104,32,116,104,101,32,112,97,116,104,32, - 116,111,32,115,101,97,114,99,104,32,111,110,32,97,110,100, - 32,97,32,118,97,114,105,97,98,108,101,32,110,117,109,98, - 101,114,32,111,102,10,32,32,32,32,32,32,32,32,50,45, - 116,117,112,108,101,115,32,99,111,110,116,97,105,110,105,110, - 103,32,116,104,101,32,108,111,97,100,101,114,32,97,110,100, - 32,116,104,101,32,102,105,108,101,32,115,117,102,102,105,120, - 101,115,32,116,104,101,32,108,111,97,100,101,114,10,32,32, - 32,32,32,32,32,32,114,101,99,111,103,110,105,122,101,115, - 46,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,51,0,0,0,115,22,0,0,0,124, - 0,93,14,125,1,124,1,136,0,102,2,86,0,1,0,113, - 2,100,0,83,0,114,114,0,0,0,114,7,0,0,0,114, - 14,1,0,0,169,1,114,144,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,9,0,0,0,143,5,0,0,115,6, - 0,0,0,18,0,4,128,255,128,122,38,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,114,79,0,0,0,114,109,0,0,0,78,41,7,114,171, - 0,0,0,218,8,95,108,111,97,100,101,114,115,114,52,0, - 0,0,218,11,95,112,97,116,104,95,109,116,105,109,101,218, - 3,115,101,116,218,11,95,112,97,116,104,95,99,97,99,104, - 101,218,19,95,114,101,108,97,120,101,100,95,112,97,116,104, - 95,99,97,99,104,101,41,5,114,123,0,0,0,114,52,0, - 0,0,218,14,108,111,97,100,101,114,95,100,101,116,97,105, - 108,115,90,7,108,111,97,100,101,114,115,114,193,0,0,0, - 114,7,0,0,0,114,60,1,0,0,114,8,0,0,0,114, - 216,0,0,0,137,5,0,0,115,20,0,0,0,4,4,12, - 1,26,1,6,1,10,2,6,1,8,1,8,1,4,128,255, - 128,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, - 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, - 10,0,0,0,100,1,124,0,95,0,100,2,83,0,41,3, - 122,31,73,110,118,97,108,105,100,97,116,101,32,116,104,101, - 32,100,105,114,101,99,116,111,114,121,32,109,116,105,109,101, - 46,114,109,0,0,0,78,41,1,114,62,1,0,0,114,253, + 8,0,0,0,114,40,1,0,0,195,4,0,0,115,22,0, + 0,0,8,0,8,1,2,3,10,1,8,8,8,3,8,3, + 8,3,8,3,12,3,255,128,114,40,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,64,0,0,0,115,118,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,101,4,100,2,100,3,132,0,131, + 1,90,5,101,4,100,4,100,5,132,0,131,1,90,6,101, + 7,100,6,100,7,132,0,131,1,90,8,101,7,100,8,100, + 9,132,0,131,1,90,9,101,7,100,19,100,11,100,12,132, + 1,131,1,90,10,101,7,100,20,100,13,100,14,132,1,131, + 1,90,11,101,7,100,21,100,15,100,16,132,1,131,1,90, + 12,101,4,100,17,100,18,132,0,131,1,90,13,100,10,83, + 0,41,22,218,10,80,97,116,104,70,105,110,100,101,114,122, + 62,77,101,116,97,32,112,97,116,104,32,102,105,110,100,101, + 114,32,102,111,114,32,115,121,115,46,112,97,116,104,32,97, + 110,100,32,112,97,99,107,97,103,101,32,95,95,112,97,116, + 104,95,95,32,97,116,116,114,105,98,117,116,101,115,46,99, + 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,116, + 1,106,2,160,3,161,0,131,1,68,0,93,44,92,2,125, + 0,125,1,124,1,100,1,117,0,114,40,116,1,106,2,124, + 0,61,0,113,14,116,4,124,1,100,2,131,2,114,14,124, + 1,160,5,161,0,1,0,113,14,100,1,83,0,41,3,122, + 125,67,97,108,108,32,116,104,101,32,105,110,118,97,108,105, + 100,97,116,101,95,99,97,99,104,101,115,40,41,32,109,101, + 116,104,111,100,32,111,110,32,97,108,108,32,112,97,116,104, + 32,101,110,116,114,121,32,102,105,110,100,101,114,115,10,32, + 32,32,32,32,32,32,32,115,116,111,114,101,100,32,105,110, + 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, + 101,114,95,99,97,99,104,101,115,32,40,119,104,101,114,101, + 32,105,109,112,108,101,109,101,110,116,101,100,41,46,78,218, + 17,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104, + 101,115,41,6,218,4,108,105,115,116,114,15,0,0,0,218, + 19,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, + 97,99,104,101,218,5,105,116,101,109,115,114,133,0,0,0, + 114,43,1,0,0,41,2,114,121,0,0,0,218,6,102,105, + 110,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,43,1,0,0,241,4,0,0,115,14,0,0, + 0,22,4,8,1,10,1,10,1,10,1,4,252,255,128,122, + 28,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,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,9,0, + 0,0,67,0,0,0,115,76,0,0,0,116,0,106,1,100, + 1,117,1,114,28,116,0,106,1,115,28,116,2,160,3,100, + 2,116,4,161,2,1,0,116,0,106,1,68,0,93,36,125, + 1,122,14,124,1,124,0,131,1,87,0,2,0,1,0,83, + 0,4,0,116,5,121,70,1,0,1,0,1,0,89,0,113, + 34,48,0,100,1,83,0,41,3,122,46,83,101,97,114,99, + 104,32,115,121,115,46,112,97,116,104,95,104,111,111,107,115, + 32,102,111,114,32,97,32,102,105,110,100,101,114,32,102,111, + 114,32,39,112,97,116,104,39,46,78,122,23,115,121,115,46, + 112,97,116,104,95,104,111,111,107,115,32,105,115,32,101,109, + 112,116,121,41,6,114,15,0,0,0,218,10,112,97,116,104, + 95,104,111,111,107,115,114,81,0,0,0,114,82,0,0,0, + 114,142,0,0,0,114,122,0,0,0,41,2,114,52,0,0, + 0,90,4,104,111,111,107,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,11,95,112,97,116,104,95,104,111, + 111,107,115,251,4,0,0,115,18,0,0,0,16,3,12,1, + 10,1,2,1,14,1,12,1,6,1,4,2,255,128,122,22, + 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,0, + 0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,115, + 100,0,0,0,124,1,100,1,107,2,114,42,122,12,116,0, + 160,1,161,0,125,1,87,0,110,20,4,0,116,2,121,40, + 1,0,1,0,1,0,89,0,100,2,83,0,48,0,122,16, + 116,3,106,4,124,1,25,0,125,2,87,0,124,2,83,0, + 4,0,116,5,121,98,1,0,1,0,1,0,124,0,160,6, + 124,1,161,1,125,2,124,2,116,3,106,4,124,1,60,0, + 89,0,124,2,83,0,48,0,41,3,122,210,71,101,116,32, + 116,104,101,32,102,105,110,100,101,114,32,102,111,114,32,116, + 104,101,32,112,97,116,104,32,101,110,116,114,121,32,102,114, + 111,109,32,115,121,115,46,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,46,10,10,32,32,32, + 32,32,32,32,32,73,102,32,116,104,101,32,112,97,116,104, + 32,101,110,116,114,121,32,105,115,32,110,111,116,32,105,110, + 32,116,104,101,32,99,97,99,104,101,44,32,102,105,110,100, + 32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101, + 32,102,105,110,100,101,114,10,32,32,32,32,32,32,32,32, + 97,110,100,32,99,97,99,104,101,32,105,116,46,32,73,102, + 32,110,111,32,102,105,110,100,101,114,32,105,115,32,97,118, + 97,105,108,97,98,108,101,44,32,115,116,111,114,101,32,78, + 111,110,101,46,10,10,32,32,32,32,32,32,32,32,114,10, + 0,0,0,78,41,7,114,18,0,0,0,114,63,0,0,0, + 218,17,70,105,108,101,78,111,116,70,111,117,110,100,69,114, + 114,111,114,114,15,0,0,0,114,45,1,0,0,218,8,75, + 101,121,69,114,114,111,114,114,49,1,0,0,41,3,114,202, + 0,0,0,114,52,0,0,0,114,47,1,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,20,95,112, + 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, + 104,101,8,5,0,0,115,28,0,0,0,8,8,2,1,12, + 1,12,1,8,3,2,1,12,1,4,4,12,253,10,1,12, + 1,4,1,2,255,255,128,122,31,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,99,97,99,104,101,99,3,0,0,0,0,0,0, + 0,0,0,0,0,6,0,0,0,4,0,0,0,67,0,0, + 0,115,82,0,0,0,116,0,124,2,100,1,131,2,114,26, + 124,2,160,1,124,1,161,1,92,2,125,3,125,4,110,14, + 124,2,160,2,124,1,161,1,125,3,103,0,125,4,124,3, + 100,0,117,1,114,60,116,3,160,4,124,1,124,3,161,2, + 83,0,116,3,160,5,124,1,100,0,161,2,125,5,124,4, + 124,5,95,6,124,5,83,0,41,2,78,114,141,0,0,0, + 41,7,114,133,0,0,0,114,141,0,0,0,114,210,0,0, + 0,114,139,0,0,0,114,205,0,0,0,114,187,0,0,0, + 114,182,0,0,0,41,6,114,202,0,0,0,114,143,0,0, + 0,114,47,1,0,0,114,144,0,0,0,114,145,0,0,0, + 114,191,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,16,95,108,101,103,97,99,121,95,103,101, + 116,95,115,112,101,99,30,5,0,0,115,20,0,0,0,10, + 4,16,1,10,2,4,1,8,1,12,1,12,1,6,1,4, + 1,255,128,122,27,80,97,116,104,70,105,110,100,101,114,46, + 95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99, + 78,99,4,0,0,0,0,0,0,0,0,0,0,0,9,0, + 0,0,5,0,0,0,67,0,0,0,115,166,0,0,0,103, + 0,125,4,124,2,68,0,93,134,125,5,116,0,124,5,116, + 1,116,2,102,2,131,2,115,28,113,8,124,0,160,3,124, + 5,161,1,125,6,124,6,100,1,117,1,114,8,116,4,124, + 6,100,2,131,2,114,70,124,6,160,5,124,1,124,3,161, + 2,125,7,110,12,124,0,160,6,124,1,124,6,161,2,125, + 7,124,7,100,1,117,0,114,92,113,8,124,7,106,7,100, + 1,117,1,114,110,124,7,2,0,1,0,83,0,124,7,106, + 8,125,8,124,8,100,1,117,0,114,132,116,9,100,3,131, + 1,130,1,124,4,160,10,124,8,161,1,1,0,113,8,116, + 11,160,12,124,1,100,1,161,2,125,7,124,4,124,7,95, + 8,124,7,83,0,41,4,122,63,70,105,110,100,32,116,104, + 101,32,108,111,97,100,101,114,32,111,114,32,110,97,109,101, + 115,112,97,99,101,95,112,97,116,104,32,102,111,114,32,116, + 104,105,115,32,109,111,100,117,108,101,47,112,97,99,107,97, + 103,101,32,110,97,109,101,46,78,114,207,0,0,0,122,19, + 115,112,101,99,32,109,105,115,115,105,110,103,32,108,111,97, + 100,101,114,41,13,114,165,0,0,0,114,90,0,0,0,218, + 5,98,121,116,101,115,114,52,1,0,0,114,133,0,0,0, + 114,207,0,0,0,114,53,1,0,0,114,144,0,0,0,114, + 182,0,0,0,114,122,0,0,0,114,171,0,0,0,114,139, + 0,0,0,114,187,0,0,0,41,9,114,202,0,0,0,114, + 143,0,0,0,114,52,0,0,0,114,206,0,0,0,218,14, + 110,97,109,101,115,112,97,99,101,95,112,97,116,104,90,5, + 101,110,116,114,121,114,47,1,0,0,114,191,0,0,0,114, + 145,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,9,95,103,101,116,95,115,112,101,99,45,5, + 0,0,115,42,0,0,0,4,5,8,1,14,1,2,1,10, + 1,8,1,10,1,14,1,12,2,8,1,2,1,10,1,8, + 1,6,1,8,1,8,1,12,5,12,2,6,1,4,1,255, + 128,122,20,80,97,116,104,70,105,110,100,101,114,46,95,103, + 101,116,95,115,112,101,99,99,4,0,0,0,0,0,0,0, + 0,0,0,0,6,0,0,0,5,0,0,0,67,0,0,0, + 115,94,0,0,0,124,2,100,1,117,0,114,14,116,0,106, + 1,125,2,124,0,160,2,124,1,124,2,124,3,161,3,125, + 4,124,4,100,1,117,0,114,40,100,1,83,0,124,4,106, + 3,100,1,117,0,114,90,124,4,106,4,125,5,124,5,114, + 86,100,1,124,4,95,5,116,6,124,1,124,5,124,0,106, + 2,131,3,124,4,95,4,124,4,83,0,100,1,83,0,124, + 4,83,0,41,2,122,141,84,114,121,32,116,111,32,102,105, + 110,100,32,97,32,115,112,101,99,32,102,111,114,32,39,102, + 117,108,108,110,97,109,101,39,32,111,110,32,115,121,115,46, + 112,97,116,104,32,111,114,32,39,112,97,116,104,39,46,10, + 10,32,32,32,32,32,32,32,32,84,104,101,32,115,101,97, + 114,99,104,32,105,115,32,98,97,115,101,100,32,111,110,32, + 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,97, + 110,100,32,115,121,115,46,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,46,10,32,32,32,32, + 32,32,32,32,78,41,7,114,15,0,0,0,114,52,0,0, + 0,114,56,1,0,0,114,144,0,0,0,114,182,0,0,0, + 114,185,0,0,0,114,18,1,0,0,41,6,114,202,0,0, + 0,114,143,0,0,0,114,52,0,0,0,114,206,0,0,0, + 114,191,0,0,0,114,55,1,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,207,0,0,0,77,5, + 0,0,115,28,0,0,0,8,6,6,1,14,1,8,1,4, + 1,10,1,6,1,4,1,6,3,16,1,4,1,4,2,4, + 2,255,128,122,20,80,97,116,104,70,105,110,100,101,114,46, + 102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, + 0,0,115,30,0,0,0,124,0,160,0,124,1,124,2,161, + 2,125,3,124,3,100,1,117,0,114,24,100,1,83,0,124, + 3,106,1,83,0,41,2,122,170,102,105,110,100,32,116,104, + 101,32,109,111,100,117,108,101,32,111,110,32,115,121,115,46, + 112,97,116,104,32,111,114,32,39,112,97,116,104,39,32,98, + 97,115,101,100,32,111,110,32,115,121,115,46,112,97,116,104, + 95,104,111,111,107,115,32,97,110,100,10,32,32,32,32,32, + 32,32,32,115,121,115,46,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, + 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, + 32,32,32,78,114,208,0,0,0,114,209,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,210,0, + 0,0,101,5,0,0,115,10,0,0,0,12,8,8,1,4, + 1,6,1,255,128,122,22,80,97,116,104,70,105,110,100,101, + 114,46,102,105,110,100,95,109,111,100,117,108,101,99,0,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, + 0,0,79,0,0,0,115,28,0,0,0,100,1,100,2,108, + 0,109,1,125,2,1,0,124,2,106,2,124,0,105,0,124, + 1,164,1,142,1,83,0,41,4,97,32,1,0,0,10,32, + 32,32,32,32,32,32,32,70,105,110,100,32,100,105,115,116, + 114,105,98,117,116,105,111,110,115,46,10,10,32,32,32,32, + 32,32,32,32,82,101,116,117,114,110,32,97,110,32,105,116, + 101,114,97,98,108,101,32,111,102,32,97,108,108,32,68,105, + 115,116,114,105,98,117,116,105,111,110,32,105,110,115,116,97, + 110,99,101,115,32,99,97,112,97,98,108,101,32,111,102,10, + 32,32,32,32,32,32,32,32,108,111,97,100,105,110,103,32, + 116,104,101,32,109,101,116,97,100,97,116,97,32,102,111,114, + 32,112,97,99,107,97,103,101,115,32,109,97,116,99,104,105, + 110,103,32,96,96,99,111,110,116,101,120,116,46,110,97,109, + 101,96,96,10,32,32,32,32,32,32,32,32,40,111,114,32, + 97,108,108,32,110,97,109,101,115,32,105,102,32,96,96,78, + 111,110,101,96,96,32,105,110,100,105,99,97,116,101,100,41, + 32,97,108,111,110,103,32,116,104,101,32,112,97,116,104,115, + 32,105,110,32,116,104,101,32,108,105,115,116,10,32,32,32, + 32,32,32,32,32,111,102,32,100,105,114,101,99,116,111,114, + 105,101,115,32,96,96,99,111,110,116,101,120,116,46,112,97, + 116,104,96,96,46,10,32,32,32,32,32,32,32,32,114,0, + 0,0,0,41,1,218,18,77,101,116,97,100,97,116,97,80, + 97,116,104,70,105,110,100,101,114,78,41,3,90,18,105,109, + 112,111,114,116,108,105,98,46,109,101,116,97,100,97,116,97, + 114,57,1,0,0,218,18,102,105,110,100,95,100,105,115,116, + 114,105,98,117,116,105,111,110,115,41,3,114,124,0,0,0, + 114,125,0,0,0,114,57,1,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,58,1,0,0,114,5, + 0,0,115,6,0,0,0,12,10,16,1,255,128,122,29,80, + 97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,100, + 105,115,116,114,105,98,117,116,105,111,110,115,41,1,78,41, + 2,78,78,41,1,78,41,14,114,130,0,0,0,114,129,0, + 0,0,114,131,0,0,0,114,132,0,0,0,114,213,0,0, + 0,114,43,1,0,0,114,49,1,0,0,114,214,0,0,0, + 114,52,1,0,0,114,53,1,0,0,114,56,1,0,0,114, + 207,0,0,0,114,210,0,0,0,114,58,1,0,0,114,7, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,43,1,0,0,151,5,0,0,115,6,0,0,0, - 6,2,4,128,255,128,122,28,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,0,0,0,0,0,0,0, - 0,3,0,0,0,3,0,0,0,67,0,0,0,115,42,0, - 0,0,124,0,160,0,124,1,161,1,125,2,124,2,100,1, - 117,0,114,26,100,1,103,0,102,2,83,0,124,2,106,1, - 124,2,106,2,112,38,103,0,102,2,83,0,41,2,122,197, - 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,44,32,111, - 114,32,116,104,101,32,110,97,109,101,115,112,97,99,101,10, - 32,32,32,32,32,32,32,32,112,97,99,107,97,103,101,32, - 112,111,114,116,105,111,110,115,46,32,82,101,116,117,114,110, - 115,32,40,108,111,97,100,101,114,44,32,108,105,115,116,45, - 111,102,45,112,111,114,116,105,111,110,115,41,46,10,10,32, - 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99, - 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, - 32,32,32,32,32,78,41,3,114,207,0,0,0,114,144,0, - 0,0,114,182,0,0,0,41,3,114,123,0,0,0,114,143, + 0,0,114,42,1,0,0,237,4,0,0,115,38,0,0,0, + 8,0,4,2,2,2,10,1,2,9,10,1,2,12,10,1, + 2,21,10,1,2,14,12,1,2,31,12,1,2,23,12,1, + 2,12,14,1,255,128,114,42,1,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 64,0,0,0,115,90,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, + 5,132,0,90,5,101,6,90,7,100,6,100,7,132,0,90, + 8,100,8,100,9,132,0,90,9,100,19,100,11,100,12,132, + 1,90,10,100,13,100,14,132,0,90,11,101,12,100,15,100, + 16,132,0,131,1,90,13,100,17,100,18,132,0,90,14,100, + 10,83,0,41,20,218,10,70,105,108,101,70,105,110,100,101, + 114,122,172,70,105,108,101,45,98,97,115,101,100,32,102,105, + 110,100,101,114,46,10,10,32,32,32,32,73,110,116,101,114, + 97,99,116,105,111,110,115,32,119,105,116,104,32,116,104,101, + 32,102,105,108,101,32,115,121,115,116,101,109,32,97,114,101, + 32,99,97,99,104,101,100,32,102,111,114,32,112,101,114,102, + 111,114,109,97,110,99,101,44,32,98,101,105,110,103,10,32, + 32,32,32,114,101,102,114,101,115,104,101,100,32,119,104,101, + 110,32,116,104,101,32,100,105,114,101,99,116,111,114,121,32, + 116,104,101,32,102,105,110,100,101,114,32,105,115,32,104,97, + 110,100,108,105,110,103,32,104,97,115,32,98,101,101,110,32, + 109,111,100,105,102,105,101,100,46,10,10,32,32,32,32,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 6,0,0,0,7,0,0,0,115,84,0,0,0,103,0,125, + 3,124,2,68,0,93,32,92,2,137,0,125,4,124,3,160, + 0,135,0,102,1,100,1,100,2,132,8,124,4,68,0,131, + 1,161,1,1,0,113,8,124,3,124,0,95,1,124,1,112, + 54,100,3,124,0,95,2,100,4,124,0,95,3,116,4,131, + 0,124,0,95,5,116,4,131,0,124,0,95,6,100,5,83, + 0,41,6,122,154,73,110,105,116,105,97,108,105,122,101,32, + 119,105,116,104,32,116,104,101,32,112,97,116,104,32,116,111, + 32,115,101,97,114,99,104,32,111,110,32,97,110,100,32,97, + 32,118,97,114,105,97,98,108,101,32,110,117,109,98,101,114, + 32,111,102,10,32,32,32,32,32,32,32,32,50,45,116,117, + 112,108,101,115,32,99,111,110,116,97,105,110,105,110,103,32, + 116,104,101,32,108,111,97,100,101,114,32,97,110,100,32,116, + 104,101,32,102,105,108,101,32,115,117,102,102,105,120,101,115, + 32,116,104,101,32,108,111,97,100,101,114,10,32,32,32,32, + 32,32,32,32,114,101,99,111,103,110,105,122,101,115,46,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,51,0,0,0,115,22,0,0,0,124,0,93, + 14,125,1,124,1,136,0,102,2,86,0,1,0,113,2,100, + 0,83,0,114,114,0,0,0,114,7,0,0,0,114,14,1, + 0,0,169,1,114,144,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,9,0,0,0,143,5,0,0,115,4,0,0, + 0,22,0,255,128,122,38,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,114,79,0, + 0,0,114,109,0,0,0,78,41,7,114,171,0,0,0,218, + 8,95,108,111,97,100,101,114,115,114,52,0,0,0,218,11, + 95,112,97,116,104,95,109,116,105,109,101,218,3,115,101,116, + 218,11,95,112,97,116,104,95,99,97,99,104,101,218,19,95, + 114,101,108,97,120,101,100,95,112,97,116,104,95,99,97,99, + 104,101,41,5,114,123,0,0,0,114,52,0,0,0,218,14, + 108,111,97,100,101,114,95,100,101,116,97,105,108,115,90,7, + 108,111,97,100,101,114,115,114,193,0,0,0,114,7,0,0, + 0,114,60,1,0,0,114,8,0,0,0,114,216,0,0,0, + 137,5,0,0,115,18,0,0,0,4,4,12,1,26,1,6, + 1,10,2,6,1,8,1,12,1,255,128,122,19,70,105,108, + 101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,2,0,0,0,67,0,0,0,115,10,0,0,0,100,1, + 124,0,95,0,100,2,83,0,41,3,122,31,73,110,118,97, + 108,105,100,97,116,101,32,116,104,101,32,100,105,114,101,99, + 116,111,114,121,32,109,116,105,109,101,46,114,109,0,0,0, + 78,41,1,114,62,1,0,0,114,253,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,43,1,0, + 0,151,5,0,0,115,4,0,0,0,10,2,255,128,122,28, + 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,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, + 0,67,0,0,0,115,42,0,0,0,124,0,160,0,124,1, + 161,1,125,2,124,2,100,1,117,0,114,26,100,1,103,0, + 102,2,83,0,124,2,106,1,124,2,106,2,112,38,103,0, + 102,2,83,0,41,2,122,197,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,44,32,111,114,32,116,104,101,32,110,97, + 109,101,115,112,97,99,101,10,32,32,32,32,32,32,32,32, + 112,97,99,107,97,103,101,32,112,111,114,116,105,111,110,115, + 46,32,82,101,116,117,114,110,115,32,40,108,111,97,100,101, + 114,44,32,108,105,115,116,45,111,102,45,112,111,114,116,105, + 111,110,115,41,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, + 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, + 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,3, + 114,207,0,0,0,114,144,0,0,0,114,182,0,0,0,41, + 3,114,123,0,0,0,114,143,0,0,0,114,191,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 141,0,0,0,157,5,0,0,115,10,0,0,0,10,7,8, + 1,8,1,16,1,255,128,122,22,70,105,108,101,70,105,110, + 100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99, + 6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0, + 6,0,0,0,67,0,0,0,115,26,0,0,0,124,1,124, + 2,124,3,131,2,125,6,116,0,124,2,124,3,124,6,124, + 4,100,1,141,4,83,0,41,2,78,114,181,0,0,0,41, + 1,114,194,0,0,0,41,7,114,123,0,0,0,114,192,0, + 0,0,114,143,0,0,0,114,52,0,0,0,90,4,115,109, + 115,108,114,206,0,0,0,114,144,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,56,1,0,0, + 169,5,0,0,115,10,0,0,0,10,1,8,1,2,1,6, + 255,255,128,122,20,70,105,108,101,70,105,110,100,101,114,46, + 95,103,101,116,95,115,112,101,99,78,99,3,0,0,0,0, + 0,0,0,0,0,0,0,14,0,0,0,8,0,0,0,67, + 0,0,0,115,92,1,0,0,100,1,125,3,124,1,160,0, + 100,2,161,1,100,3,25,0,125,4,122,24,116,1,124,0, + 106,2,112,34,116,3,160,4,161,0,131,1,106,5,125,5, + 87,0,110,22,4,0,116,6,121,64,1,0,1,0,1,0, + 100,4,125,5,89,0,110,2,48,0,124,5,124,0,106,7, + 107,3,114,90,124,0,160,8,161,0,1,0,124,5,124,0, + 95,7,116,9,131,0,114,112,124,0,106,10,125,6,124,4, + 160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,4, + 125,7,124,7,124,6,118,0,114,214,116,13,124,0,106,2, + 124,4,131,2,125,8,124,0,106,14,68,0,93,56,92,2, + 125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,8, + 124,11,131,2,125,12,116,15,124,12,131,1,114,148,124,0, + 160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,5, + 2,0,1,0,83,0,116,17,124,8,131,1,125,3,124,0, + 106,14,68,0,93,80,92,2,125,9,125,10,116,13,124,0, + 106,2,124,4,124,9,23,0,131,2,125,12,116,18,106,19, + 100,6,124,12,100,3,100,7,141,3,1,0,124,7,124,9, + 23,0,124,6,118,0,114,220,116,15,124,12,131,1,114,220, + 124,0,160,16,124,10,124,1,124,12,100,8,124,2,161,5, + 2,0,1,0,83,0,124,3,144,1,114,88,116,18,160,19, + 100,9,124,8,161,2,1,0,116,18,160,20,124,1,100,8, + 161,2,125,13,124,8,103,1,124,13,95,21,124,13,83,0, + 100,8,83,0,41,10,122,111,84,114,121,32,116,111,32,102, + 105,110,100,32,97,32,115,112,101,99,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,46,10,10,32,32,32,32,32,32,32,32,82,101, + 116,117,114,110,115,32,116,104,101,32,109,97,116,99,104,105, + 110,103,32,115,112,101,99,44,32,111,114,32,78,111,110,101, + 32,105,102,32,110,111,116,32,102,111,117,110,100,46,10,32, + 32,32,32,32,32,32,32,70,114,79,0,0,0,114,39,0, + 0,0,114,109,0,0,0,114,216,0,0,0,122,9,116,114, + 121,105,110,103,32,123,125,41,1,90,9,118,101,114,98,111, + 115,105,116,121,78,122,25,112,111,115,115,105,98,108,101,32, + 110,97,109,101,115,112,97,99,101,32,102,111,114,32,123,125, + 41,22,114,49,0,0,0,114,57,0,0,0,114,52,0,0, + 0,114,18,0,0,0,114,63,0,0,0,114,7,1,0,0, + 114,58,0,0,0,114,62,1,0,0,218,11,95,102,105,108, + 108,95,99,97,99,104,101,114,21,0,0,0,114,65,1,0, + 0,114,110,0,0,0,114,64,1,0,0,114,48,0,0,0, + 114,61,1,0,0,114,62,0,0,0,114,56,1,0,0,114, + 64,0,0,0,114,139,0,0,0,114,153,0,0,0,114,187, + 0,0,0,114,182,0,0,0,41,14,114,123,0,0,0,114, + 143,0,0,0,114,206,0,0,0,90,12,105,115,95,110,97, + 109,101,115,112,97,99,101,90,11,116,97,105,108,95,109,111, + 100,117,108,101,114,173,0,0,0,90,5,99,97,99,104,101, + 90,12,99,97,99,104,101,95,109,111,100,117,108,101,90,9, + 98,97,115,101,95,112,97,116,104,114,15,1,0,0,114,192, + 0,0,0,90,13,105,110,105,116,95,102,105,108,101,110,97, + 109,101,90,9,102,117,108,108,95,112,97,116,104,114,191,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,207,0,0,0,174,5,0,0,115,74,0,0,0,4, + 5,14,1,2,1,24,1,12,1,10,1,10,1,8,1,6, + 1,6,2,6,1,10,1,6,2,4,1,8,2,12,1,14, + 1,8,1,10,1,8,1,24,1,8,4,14,2,16,1,16, + 1,12,1,8,1,10,1,4,1,8,255,6,2,12,1,12, + 1,8,1,4,1,4,1,255,128,122,20,70,105,108,101,70, + 105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,99, + 1,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, + 10,0,0,0,67,0,0,0,115,192,0,0,0,124,0,106, + 0,125,1,122,22,116,1,160,2,124,1,112,22,116,1,160, + 3,161,0,161,1,125,2,87,0,110,28,4,0,116,4,116, + 5,116,6,102,3,121,56,1,0,1,0,1,0,103,0,125, + 2,89,0,110,2,48,0,116,7,106,8,160,9,100,1,161, + 1,115,82,116,10,124,2,131,1,124,0,95,11,110,74,116, + 10,131,0,125,3,124,2,68,0,93,56,125,4,124,4,160, + 12,100,2,161,1,92,3,125,5,125,6,125,7,124,6,114, + 134,100,3,160,13,124,5,124,7,160,14,161,0,161,2,125, + 8,110,4,124,5,125,8,124,3,160,15,124,8,161,1,1, + 0,113,92,124,3,124,0,95,11,116,7,106,8,160,9,116, + 16,161,1,114,188,100,4,100,5,132,0,124,2,68,0,131, + 1,124,0,95,17,100,6,83,0,100,6,83,0,41,7,122, + 68,70,105,108,108,32,116,104,101,32,99,97,99,104,101,32, + 111,102,32,112,111,116,101,110,116,105,97,108,32,109,111,100, + 117,108,101,115,32,97,110,100,32,112,97,99,107,97,103,101, + 115,32,102,111,114,32,116,104,105,115,32,100,105,114,101,99, + 116,111,114,121,46,114,14,0,0,0,114,79,0,0,0,114, + 69,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,4,0,0,0,83,0,0,0,115,20,0, + 0,0,104,0,124,0,93,12,125,1,124,1,160,0,161,0, + 146,2,113,4,83,0,114,7,0,0,0,41,1,114,110,0, + 0,0,41,2,114,5,0,0,0,90,2,102,110,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,13,0,0, + 0,251,5,0,0,115,4,0,0,0,20,0,255,128,122,41, + 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,115,101,116,99,111,109,112,62,78,41,18,114,52,0,0, + 0,114,18,0,0,0,90,7,108,105,115,116,100,105,114,114, + 63,0,0,0,114,50,1,0,0,218,15,80,101,114,109,105, + 115,115,105,111,110,69,114,114,111,114,218,18,78,111,116,65, + 68,105,114,101,99,116,111,114,121,69,114,114,111,114,114,15, + 0,0,0,114,22,0,0,0,114,23,0,0,0,114,63,1, + 0,0,114,64,1,0,0,114,105,0,0,0,114,70,0,0, + 0,114,110,0,0,0,218,3,97,100,100,114,24,0,0,0, + 114,65,1,0,0,41,9,114,123,0,0,0,114,52,0,0, + 0,90,8,99,111,110,116,101,110,116,115,90,21,108,111,119, + 101,114,95,115,117,102,102,105,120,95,99,111,110,116,101,110, + 116,115,114,38,1,0,0,114,121,0,0,0,114,25,1,0, + 0,114,15,1,0,0,90,8,110,101,119,95,110,97,109,101, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 67,1,0,0,222,5,0,0,115,38,0,0,0,6,2,2, + 1,22,1,18,1,10,3,12,3,12,1,6,7,8,1,16, + 1,4,1,18,1,4,2,12,1,6,1,12,1,20,1,4, + 255,255,128,122,22,70,105,108,101,70,105,110,100,101,114,46, + 95,102,105,108,108,95,99,97,99,104,101,99,1,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 7,0,0,0,115,18,0,0,0,135,0,135,1,102,2,100, + 1,100,2,132,8,125,2,124,2,83,0,41,4,97,20,1, + 0,0,65,32,99,108,97,115,115,32,109,101,116,104,111,100, + 32,119,104,105,99,104,32,114,101,116,117,114,110,115,32,97, + 32,99,108,111,115,117,114,101,32,116,111,32,117,115,101,32, + 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107, + 10,32,32,32,32,32,32,32,32,119,104,105,99,104,32,119, + 105,108,108,32,114,101,116,117,114,110,32,97,110,32,105,110, + 115,116,97,110,99,101,32,117,115,105,110,103,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,32,108,111,97,100,101, + 114,115,32,97,110,100,32,116,104,101,32,112,97,116,104,10, + 32,32,32,32,32,32,32,32,99,97,108,108,101,100,32,111, + 110,32,116,104,101,32,99,108,111,115,117,114,101,46,10,10, + 32,32,32,32,32,32,32,32,73,102,32,116,104,101,32,112, + 97,116,104,32,99,97,108,108,101,100,32,111,110,32,116,104, + 101,32,99,108,111,115,117,114,101,32,105,115,32,110,111,116, + 32,97,32,100,105,114,101,99,116,111,114,121,44,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,115,10,32,32,32, + 32,32,32,32,32,114,97,105,115,101,100,46,10,10,32,32, + 32,32,32,32,32,32,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,4,0,0,0,19,0,0,0,115, + 36,0,0,0,116,0,124,0,131,1,115,20,116,1,100,1, + 124,0,100,2,141,2,130,1,136,0,124,0,103,1,136,1, + 162,1,82,0,142,0,83,0,41,4,122,45,80,97,116,104, + 32,104,111,111,107,32,102,111,114,32,105,109,112,111,114,116, + 108,105,98,46,109,97,99,104,105,110,101,114,121,46,70,105, + 108,101,70,105,110,100,101,114,46,122,30,111,110,108,121,32, + 100,105,114,101,99,116,111,114,105,101,115,32,97,114,101,32, + 115,117,112,112,111,114,116,101,100,114,56,0,0,0,78,41, + 2,114,64,0,0,0,114,122,0,0,0,114,56,0,0,0, + 169,2,114,202,0,0,0,114,66,1,0,0,114,7,0,0, + 0,114,8,0,0,0,218,24,112,97,116,104,95,104,111,111, + 107,95,102,111,114,95,70,105,108,101,70,105,110,100,101,114, + 7,6,0,0,115,8,0,0,0,8,2,12,1,16,1,255, + 128,122,54,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,107,95,102,111,114,95,70, + 105,108,101,70,105,110,100,101,114,78,114,7,0,0,0,41, + 3,114,202,0,0,0,114,66,1,0,0,114,72,1,0,0, + 114,7,0,0,0,114,71,1,0,0,114,8,0,0,0,218, + 9,112,97,116,104,95,104,111,111,107,253,5,0,0,115,6, + 0,0,0,14,10,4,6,255,128,122,20,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,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,12,0,0,0,100,1,160, + 0,124,0,106,1,161,1,83,0,41,2,78,122,16,70,105, + 108,101,70,105,110,100,101,114,40,123,33,114,125,41,41,2, + 114,70,0,0,0,114,52,0,0,0,114,253,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,36, + 1,0,0,15,6,0,0,115,4,0,0,0,12,1,255,128, + 122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,114, + 101,112,114,95,95,41,1,78,41,15,114,130,0,0,0,114, + 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,216, + 0,0,0,114,43,1,0,0,114,147,0,0,0,114,210,0, + 0,0,114,141,0,0,0,114,56,1,0,0,114,207,0,0, + 0,114,67,1,0,0,114,214,0,0,0,114,73,1,0,0, + 114,36,1,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,59,1,0,0,128,5, + 0,0,115,26,0,0,0,8,0,4,2,8,7,8,14,4, + 4,8,2,8,12,10,5,8,48,2,31,10,1,12,17,255, + 128,114,59,1,0,0,99,4,0,0,0,0,0,0,0,0, + 0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,115, + 144,0,0,0,124,0,160,0,100,1,161,1,125,4,124,0, + 160,0,100,2,161,1,125,5,124,4,115,66,124,5,114,36, + 124,5,106,1,125,4,110,30,124,2,124,3,107,2,114,56, + 116,2,124,1,124,2,131,2,125,4,110,10,116,3,124,1, + 124,2,131,2,125,4,124,5,115,84,116,4,124,1,124,2, + 124,4,100,3,141,3,125,5,122,38,124,5,124,0,100,2, + 60,0,124,4,124,0,100,1,60,0,124,2,124,0,100,4, + 60,0,124,3,124,0,100,5,60,0,87,0,100,0,83,0, + 4,0,116,5,121,142,1,0,1,0,1,0,89,0,100,0, + 83,0,48,0,41,6,78,218,10,95,95,108,111,97,100,101, + 114,95,95,218,8,95,95,115,112,101,99,95,95,114,60,1, + 0,0,90,8,95,95,102,105,108,101,95,95,90,10,95,95, + 99,97,99,104,101,100,95,95,41,6,218,3,103,101,116,114, + 144,0,0,0,114,12,1,0,0,114,6,1,0,0,114,194, + 0,0,0,218,9,69,120,99,101,112,116,105,111,110,41,6, + 90,2,110,115,114,121,0,0,0,90,8,112,97,116,104,110, + 97,109,101,90,9,99,112,97,116,104,110,97,109,101,114,144, 0,0,0,114,191,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,141,0,0,0,157,5,0,0, - 115,10,0,0,0,10,7,8,1,8,1,16,1,255,128,122, - 22,70,105,108,101,70,105,110,100,101,114,46,102,105,110,100, - 95,108,111,97,100,101,114,99,6,0,0,0,0,0,0,0, - 0,0,0,0,7,0,0,0,6,0,0,0,67,0,0,0, - 115,26,0,0,0,124,1,124,2,124,3,131,2,125,6,116, - 0,124,2,124,3,124,6,124,4,100,1,141,4,83,0,41, - 2,78,114,181,0,0,0,41,1,114,194,0,0,0,41,7, - 114,123,0,0,0,114,192,0,0,0,114,143,0,0,0,114, - 52,0,0,0,90,4,115,109,115,108,114,206,0,0,0,114, - 144,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,56,1,0,0,169,5,0,0,115,10,0,0, - 0,10,1,8,1,2,1,6,255,255,128,122,20,70,105,108, - 101,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, - 99,78,99,3,0,0,0,0,0,0,0,0,0,0,0,14, - 0,0,0,8,0,0,0,67,0,0,0,115,92,1,0,0, - 100,1,125,3,124,1,160,0,100,2,161,1,100,3,25,0, - 125,4,122,24,116,1,124,0,106,2,112,34,116,3,160,4, - 161,0,131,1,106,5,125,5,87,0,110,22,4,0,116,6, - 121,64,1,0,1,0,1,0,100,4,125,5,89,0,110,2, - 48,0,124,5,124,0,106,7,107,3,114,90,124,0,160,8, - 161,0,1,0,124,5,124,0,95,7,116,9,131,0,114,112, - 124,0,106,10,125,6,124,4,160,11,161,0,125,7,110,10, - 124,0,106,12,125,6,124,4,125,7,124,7,124,6,118,0, - 114,214,116,13,124,0,106,2,124,4,131,2,125,8,124,0, - 106,14,68,0,93,56,92,2,125,9,125,10,100,5,124,9, - 23,0,125,11,116,13,124,8,124,11,131,2,125,12,116,15, - 124,12,131,1,114,148,124,0,160,16,124,10,124,1,124,12, - 124,8,103,1,124,2,161,5,2,0,1,0,83,0,116,17, - 124,8,131,1,125,3,124,0,106,14,68,0,93,80,92,2, - 125,9,125,10,116,13,124,0,106,2,124,4,124,9,23,0, - 131,2,125,12,116,18,106,19,100,6,124,12,100,3,100,7, - 141,3,1,0,124,7,124,9,23,0,124,6,118,0,114,220, - 116,15,124,12,131,1,114,220,124,0,160,16,124,10,124,1, - 124,12,100,8,124,2,161,5,2,0,1,0,83,0,124,3, - 144,1,114,88,116,18,160,19,100,9,124,8,161,2,1,0, - 116,18,160,20,124,1,100,8,161,2,125,13,124,8,103,1, - 124,13,95,21,124,13,83,0,100,8,83,0,41,10,122,111, - 84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,112, - 101,99,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,46,10,10,32,32, - 32,32,32,32,32,32,82,101,116,117,114,110,115,32,116,104, - 101,32,109,97,116,99,104,105,110,103,32,115,112,101,99,44, - 32,111,114,32,78,111,110,101,32,105,102,32,110,111,116,32, - 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,70, - 114,79,0,0,0,114,39,0,0,0,114,109,0,0,0,114, - 216,0,0,0,122,9,116,114,121,105,110,103,32,123,125,41, - 1,90,9,118,101,114,98,111,115,105,116,121,78,122,25,112, - 111,115,115,105,98,108,101,32,110,97,109,101,115,112,97,99, - 101,32,102,111,114,32,123,125,41,22,114,49,0,0,0,114, - 57,0,0,0,114,52,0,0,0,114,18,0,0,0,114,63, - 0,0,0,114,7,1,0,0,114,58,0,0,0,114,62,1, - 0,0,218,11,95,102,105,108,108,95,99,97,99,104,101,114, - 21,0,0,0,114,65,1,0,0,114,110,0,0,0,114,64, - 1,0,0,114,48,0,0,0,114,61,1,0,0,114,62,0, - 0,0,114,56,1,0,0,114,64,0,0,0,114,139,0,0, - 0,114,153,0,0,0,114,187,0,0,0,114,182,0,0,0, - 41,14,114,123,0,0,0,114,143,0,0,0,114,206,0,0, - 0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,90, - 11,116,97,105,108,95,109,111,100,117,108,101,114,173,0,0, - 0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,95, - 109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,116, - 104,114,15,1,0,0,114,192,0,0,0,90,13,105,110,105, - 116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,108, - 95,112,97,116,104,114,191,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,207,0,0,0,174,5, - 0,0,115,74,0,0,0,4,5,14,1,2,1,24,1,12, - 1,10,1,10,1,8,1,6,1,6,2,6,1,10,1,6, - 2,4,1,8,2,12,1,14,1,8,1,10,1,8,1,24, - 1,8,4,14,2,16,1,16,1,12,1,8,1,10,1,4, - 1,8,255,6,2,12,1,12,1,8,1,4,1,4,1,255, - 128,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105, - 110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0, - 0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0, - 115,188,0,0,0,124,0,106,0,125,1,122,22,116,1,160, - 2,124,1,112,22,116,1,160,3,161,0,161,1,125,2,87, - 0,110,28,4,0,116,4,116,5,116,6,102,3,121,56,1, - 0,1,0,1,0,103,0,125,2,89,0,110,2,48,0,116, - 7,106,8,160,9,100,1,161,1,115,82,116,10,124,2,131, - 1,124,0,95,11,110,74,116,10,131,0,125,3,124,2,68, - 0,93,56,125,4,124,4,160,12,100,2,161,1,92,3,125, - 5,125,6,125,7,124,6,114,134,100,3,160,13,124,5,124, - 7,160,14,161,0,161,2,125,8,110,4,124,5,125,8,124, - 3,160,15,124,8,161,1,1,0,113,92,124,3,124,0,95, - 11,116,7,106,8,160,9,116,16,161,1,114,184,100,4,100, - 5,132,0,124,2,68,0,131,1,124,0,95,17,100,6,83, - 0,41,7,122,68,70,105,108,108,32,116,104,101,32,99,97, - 99,104,101,32,111,102,32,112,111,116,101,110,116,105,97,108, - 32,109,111,100,117,108,101,115,32,97,110,100,32,112,97,99, - 107,97,103,101,115,32,102,111,114,32,116,104,105,115,32,100, - 105,114,101,99,116,111,114,121,46,114,14,0,0,0,114,79, - 0,0,0,114,69,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,83,0,0, - 0,115,20,0,0,0,104,0,124,0,93,12,125,1,124,1, - 160,0,161,0,146,2,113,4,83,0,114,7,0,0,0,41, - 1,114,110,0,0,0,41,2,114,5,0,0,0,90,2,102, - 110,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,13,0,0,0,251,5,0,0,115,4,0,0,0,20,0, - 255,128,122,41,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,115,101,116,99,111,109,112,62,78,41,18, - 114,52,0,0,0,114,18,0,0,0,90,7,108,105,115,116, - 100,105,114,114,63,0,0,0,114,50,1,0,0,218,15,80, - 101,114,109,105,115,115,105,111,110,69,114,114,111,114,218,18, - 78,111,116,65,68,105,114,101,99,116,111,114,121,69,114,114, - 111,114,114,15,0,0,0,114,22,0,0,0,114,23,0,0, - 0,114,63,1,0,0,114,64,1,0,0,114,105,0,0,0, - 114,70,0,0,0,114,110,0,0,0,218,3,97,100,100,114, - 24,0,0,0,114,65,1,0,0,41,9,114,123,0,0,0, - 114,52,0,0,0,90,8,99,111,110,116,101,110,116,115,90, - 21,108,111,119,101,114,95,115,117,102,102,105,120,95,99,111, - 110,116,101,110,116,115,114,38,1,0,0,114,121,0,0,0, - 114,25,1,0,0,114,15,1,0,0,90,8,110,101,119,95, - 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,67,1,0,0,222,5,0,0,115,38,0,0, - 0,6,2,2,1,22,1,18,1,10,3,12,3,12,1,6, - 7,8,1,16,1,4,1,18,1,4,2,12,1,6,1,12, - 1,16,1,4,128,255,128,122,22,70,105,108,101,70,105,110, - 100,101,114,46,95,102,105,108,108,95,99,97,99,104,101,99, - 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,7,0,0,0,115,18,0,0,0,135,0,135, - 1,102,2,100,1,100,2,132,8,125,2,124,2,83,0,41, - 4,97,20,1,0,0,65,32,99,108,97,115,115,32,109,101, - 116,104,111,100,32,119,104,105,99,104,32,114,101,116,117,114, - 110,115,32,97,32,99,108,111,115,117,114,101,32,116,111,32, - 117,115,101,32,111,110,32,115,121,115,46,112,97,116,104,95, - 104,111,111,107,10,32,32,32,32,32,32,32,32,119,104,105, - 99,104,32,119,105,108,108,32,114,101,116,117,114,110,32,97, - 110,32,105,110,115,116,97,110,99,101,32,117,115,105,110,103, - 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,108, - 111,97,100,101,114,115,32,97,110,100,32,116,104,101,32,112, - 97,116,104,10,32,32,32,32,32,32,32,32,99,97,108,108, - 101,100,32,111,110,32,116,104,101,32,99,108,111,115,117,114, - 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,116, - 104,101,32,112,97,116,104,32,99,97,108,108,101,100,32,111, - 110,32,116,104,101,32,99,108,111,115,117,114,101,32,105,115, - 32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121, - 44,32,73,109,112,111,114,116,69,114,114,111,114,32,105,115, - 10,32,32,32,32,32,32,32,32,114,97,105,115,101,100,46, - 10,10,32,32,32,32,32,32,32,32,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,19, - 0,0,0,115,36,0,0,0,116,0,124,0,131,1,115,20, - 116,1,100,1,124,0,100,2,141,2,130,1,136,0,124,0, - 103,1,136,1,162,1,82,0,142,0,83,0,41,4,122,45, - 80,97,116,104,32,104,111,111,107,32,102,111,114,32,105,109, - 112,111,114,116,108,105,98,46,109,97,99,104,105,110,101,114, - 121,46,70,105,108,101,70,105,110,100,101,114,46,122,30,111, - 110,108,121,32,100,105,114,101,99,116,111,114,105,101,115,32, - 97,114,101,32,115,117,112,112,111,114,116,101,100,114,56,0, - 0,0,78,41,2,114,64,0,0,0,114,122,0,0,0,114, - 56,0,0,0,169,2,114,202,0,0,0,114,66,1,0,0, - 114,7,0,0,0,114,8,0,0,0,218,24,112,97,116,104, - 95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,105, - 110,100,101,114,7,6,0,0,115,8,0,0,0,8,2,12, - 1,16,1,255,128,122,54,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,107,95,102, - 111,114,95,70,105,108,101,70,105,110,100,101,114,78,114,7, - 0,0,0,41,3,114,202,0,0,0,114,66,1,0,0,114, - 72,1,0,0,114,7,0,0,0,114,71,1,0,0,114,8, - 0,0,0,218,9,112,97,116,104,95,104,111,111,107,253,5, - 0,0,115,6,0,0,0,14,10,4,6,255,128,122,20,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,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, - 0,100,1,160,0,124,0,106,1,161,1,83,0,41,2,78, - 122,16,70,105,108,101,70,105,110,100,101,114,40,123,33,114, - 125,41,41,2,114,70,0,0,0,114,52,0,0,0,114,253, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,36,1,0,0,15,6,0,0,115,4,0,0,0, - 12,1,255,128,122,19,70,105,108,101,70,105,110,100,101,114, - 46,95,95,114,101,112,114,95,95,41,1,78,41,15,114,130, - 0,0,0,114,129,0,0,0,114,131,0,0,0,114,132,0, - 0,0,114,216,0,0,0,114,43,1,0,0,114,147,0,0, - 0,114,210,0,0,0,114,141,0,0,0,114,56,1,0,0, - 114,207,0,0,0,114,67,1,0,0,114,214,0,0,0,114, - 73,1,0,0,114,36,1,0,0,114,7,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,59,1, - 0,0,128,5,0,0,115,26,0,0,0,8,0,4,2,8, - 7,8,14,4,4,8,2,8,12,10,5,8,48,2,31,10, - 1,12,17,255,128,114,59,1,0,0,99,4,0,0,0,0, - 0,0,0,0,0,0,0,6,0,0,0,8,0,0,0,67, - 0,0,0,115,144,0,0,0,124,0,160,0,100,1,161,1, - 125,4,124,0,160,0,100,2,161,1,125,5,124,4,115,66, - 124,5,114,36,124,5,106,1,125,4,110,30,124,2,124,3, - 107,2,114,56,116,2,124,1,124,2,131,2,125,4,110,10, - 116,3,124,1,124,2,131,2,125,4,124,5,115,84,116,4, - 124,1,124,2,124,4,100,3,141,3,125,5,122,38,124,5, - 124,0,100,2,60,0,124,4,124,0,100,1,60,0,124,2, - 124,0,100,4,60,0,124,3,124,0,100,5,60,0,87,0, - 100,0,83,0,4,0,116,5,121,142,1,0,1,0,1,0, - 89,0,100,0,83,0,48,0,41,6,78,218,10,95,95,108, - 111,97,100,101,114,95,95,218,8,95,95,115,112,101,99,95, - 95,114,60,1,0,0,90,8,95,95,102,105,108,101,95,95, - 90,10,95,95,99,97,99,104,101,100,95,95,41,6,218,3, - 103,101,116,114,144,0,0,0,114,12,1,0,0,114,6,1, - 0,0,114,194,0,0,0,218,9,69,120,99,101,112,116,105, - 111,110,41,6,90,2,110,115,114,121,0,0,0,90,8,112, - 97,116,104,110,97,109,101,90,9,99,112,97,116,104,110,97, - 109,101,114,144,0,0,0,114,191,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,14,95,102,105, - 120,95,117,112,95,109,111,100,117,108,101,21,6,0,0,115, - 42,0,0,0,10,2,10,1,4,1,4,1,8,1,8,1, - 12,1,10,2,4,1,14,1,2,1,8,1,8,1,8,1, - 10,1,4,128,12,1,2,2,4,128,2,0,255,128,114,78, - 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, - 0,116,0,116,1,160,2,161,0,102,2,125,0,116,3,116, - 4,102,2,125,1,116,5,116,6,102,2,125,2,124,0,124, - 1,124,2,103,3,83,0,41,2,122,95,82,101,116,117,114, - 110,115,32,97,32,108,105,115,116,32,111,102,32,102,105,108, - 101,45,98,97,115,101,100,32,109,111,100,117,108,101,32,108, - 111,97,100,101,114,115,46,10,10,32,32,32,32,69,97,99, - 104,32,105,116,101,109,32,105,115,32,97,32,116,117,112,108, - 101,32,40,108,111,97,100,101,114,44,32,115,117,102,102,105, - 120,101,115,41,46,10,32,32,32,32,78,41,7,114,3,1, - 0,0,114,167,0,0,0,218,18,101,120,116,101,110,115,105, - 111,110,95,115,117,102,102,105,120,101,115,114,6,1,0,0, - 114,106,0,0,0,114,12,1,0,0,114,94,0,0,0,41, - 3,90,10,101,120,116,101,110,115,105,111,110,115,90,6,115, - 111,117,114,99,101,90,8,98,121,116,101,99,111,100,101,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,188, - 0,0,0,44,6,0,0,115,10,0,0,0,12,5,8,1, - 8,1,10,1,255,128,114,188,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0, - 67,0,0,0,115,8,0,0,0,124,0,97,0,100,0,83, - 0,114,114,0,0,0,41,1,114,139,0,0,0,41,1,218, - 17,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, - 108,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,21,95,115,101,116,95,98,111,111,116,115,116,114,97, - 112,95,109,111,100,117,108,101,55,6,0,0,115,6,0,0, - 0,4,2,4,128,255,128,114,81,1,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,50,0,0,0,116,0,124,0,131,1, - 1,0,116,1,131,0,125,1,116,2,106,3,160,4,116,5, - 106,6,124,1,142,0,103,1,161,1,1,0,116,2,106,7, - 160,8,116,9,161,1,1,0,100,1,83,0,41,2,122,41, - 73,110,115,116,97,108,108,32,116,104,101,32,112,97,116,104, - 45,98,97,115,101,100,32,105,109,112,111,114,116,32,99,111, - 109,112,111,110,101,110,116,115,46,78,41,10,114,81,1,0, - 0,114,188,0,0,0,114,15,0,0,0,114,48,1,0,0, - 114,171,0,0,0,114,59,1,0,0,114,73,1,0,0,218, - 9,109,101,116,97,95,112,97,116,104,114,190,0,0,0,114, - 42,1,0,0,41,2,114,80,1,0,0,90,17,115,117,112, - 112,111,114,116,101,100,95,108,111,97,100,101,114,115,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,95, - 105,110,115,116,97,108,108,60,6,0,0,115,12,0,0,0, - 8,2,6,1,20,1,12,1,4,128,255,128,114,83,1,0, - 0,41,1,114,68,0,0,0,41,1,78,41,3,78,78,78, - 41,2,114,0,0,0,0,114,0,0,0,0,41,1,84,41, - 1,78,41,1,78,41,83,114,132,0,0,0,114,139,0,0, - 0,114,167,0,0,0,114,72,0,0,0,114,15,0,0,0, - 114,81,0,0,0,114,164,0,0,0,114,22,0,0,0,114, - 211,0,0,0,90,2,110,116,114,18,0,0,0,114,196,0, - 0,0,90,5,112,111,115,105,120,114,42,0,0,0,218,3, - 97,108,108,114,45,0,0,0,114,46,0,0,0,114,66,0, - 0,0,114,25,0,0,0,90,37,95,67,65,83,69,95,73, - 78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70, - 79,82,77,83,95,66,89,84,69,83,95,75,69,89,114,24, - 0,0,0,114,26,0,0,0,114,21,0,0,0,114,33,0, - 0,0,114,38,0,0,0,114,40,0,0,0,114,48,0,0, - 0,114,55,0,0,0,114,57,0,0,0,114,61,0,0,0, - 114,62,0,0,0,114,64,0,0,0,114,67,0,0,0,114, - 77,0,0,0,218,4,116,121,112,101,218,8,95,95,99,111, - 100,101,95,95,114,166,0,0,0,114,31,0,0,0,114,152, - 0,0,0,114,30,0,0,0,114,35,0,0,0,114,243,0, - 0,0,114,97,0,0,0,114,93,0,0,0,114,106,0,0, - 0,114,190,0,0,0,114,79,1,0,0,114,212,0,0,0, - 114,94,0,0,0,90,23,68,69,66,85,71,95,66,89,84, - 69,67,79,68,69,95,83,85,70,70,73,88,69,83,90,27, - 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,114,102,0,0,0, - 114,107,0,0,0,114,113,0,0,0,114,117,0,0,0,114, - 119,0,0,0,114,140,0,0,0,114,147,0,0,0,114,156, - 0,0,0,114,160,0,0,0,114,162,0,0,0,114,169,0, - 0,0,114,174,0,0,0,114,175,0,0,0,114,180,0,0, - 0,218,6,111,98,106,101,99,116,114,189,0,0,0,114,194, - 0,0,0,114,195,0,0,0,114,215,0,0,0,114,228,0, - 0,0,114,246,0,0,0,114,6,1,0,0,114,12,1,0, - 0,114,3,1,0,0,114,18,1,0,0,114,40,1,0,0, - 114,42,1,0,0,114,59,1,0,0,114,78,1,0,0,114, - 188,0,0,0,114,81,1,0,0,114,83,1,0,0,114,7, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,8,60,109,111,100,117,108,101,62,1,0,0,0, - 115,174,0,0,0,4,0,4,22,8,3,8,1,8,1,8, - 1,8,1,10,3,4,1,8,1,10,1,8,2,4,3,10, - 1,6,2,22,2,8,1,10,1,14,1,4,4,4,1,2, - 1,2,1,4,255,8,4,6,16,8,3,8,5,8,5,8, - 6,8,6,8,12,8,10,8,9,8,5,8,7,10,9,10, - 22,0,127,16,23,12,1,4,2,4,1,6,2,6,1,10, - 1,8,2,6,2,8,2,16,2,8,71,8,40,8,19,8, - 12,8,12,8,31,8,17,8,33,8,28,10,24,10,13,10, - 10,8,11,6,14,4,3,2,1,12,255,14,68,14,64,16, - 29,0,127,14,17,18,50,18,45,18,25,14,53,14,63,14, - 42,0,127,14,20,0,127,10,22,8,23,8,11,8,5,4, - 128,255,128, + 0,0,114,8,0,0,0,218,14,95,102,105,120,95,117,112, + 95,109,111,100,117,108,101,21,6,0,0,115,36,0,0,0, + 10,2,10,1,4,1,4,1,8,1,8,1,12,1,10,2, + 4,1,14,1,2,1,8,1,8,1,8,1,14,1,12,1, + 8,2,255,128,114,78,1,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, + 0,0,115,38,0,0,0,116,0,116,1,160,2,161,0,102, + 2,125,0,116,3,116,4,102,2,125,1,116,5,116,6,102, + 2,125,2,124,0,124,1,124,2,103,3,83,0,41,2,122, + 95,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32, + 111,102,32,102,105,108,101,45,98,97,115,101,100,32,109,111, + 100,117,108,101,32,108,111,97,100,101,114,115,46,10,10,32, + 32,32,32,69,97,99,104,32,105,116,101,109,32,105,115,32, + 97,32,116,117,112,108,101,32,40,108,111,97,100,101,114,44, + 32,115,117,102,102,105,120,101,115,41,46,10,32,32,32,32, + 78,41,7,114,3,1,0,0,114,167,0,0,0,218,18,101, + 120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,101, + 115,114,6,1,0,0,114,106,0,0,0,114,12,1,0,0, + 114,94,0,0,0,41,3,90,10,101,120,116,101,110,115,105, + 111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,116, + 101,99,111,100,101,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,188,0,0,0,44,6,0,0,115,10,0, + 0,0,12,5,8,1,8,1,10,1,255,128,114,188,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,1,0,0,0,67,0,0,0,115,8,0,0,0,124, + 0,97,0,100,0,83,0,114,114,0,0,0,41,1,114,139, + 0,0,0,41,1,218,17,95,98,111,111,116,115,116,114,97, + 112,95,109,111,100,117,108,101,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,21,95,115,101,116,95,98,111, + 111,116,115,116,114,97,112,95,109,111,100,117,108,101,55,6, + 0,0,115,4,0,0,0,8,2,255,128,114,81,1,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,67,0,0,0,115,50,0,0,0,116,0, + 124,0,131,1,1,0,116,1,131,0,125,1,116,2,106,3, + 160,4,116,5,106,6,124,1,142,0,103,1,161,1,1,0, + 116,2,106,7,160,8,116,9,161,1,1,0,100,1,83,0, + 41,2,122,41,73,110,115,116,97,108,108,32,116,104,101,32, + 112,97,116,104,45,98,97,115,101,100,32,105,109,112,111,114, + 116,32,99,111,109,112,111,110,101,110,116,115,46,78,41,10, + 114,81,1,0,0,114,188,0,0,0,114,15,0,0,0,114, + 48,1,0,0,114,171,0,0,0,114,59,1,0,0,114,73, + 1,0,0,218,9,109,101,116,97,95,112,97,116,104,114,190, + 0,0,0,114,42,1,0,0,41,2,114,80,1,0,0,90, + 17,115,117,112,112,111,114,116,101,100,95,108,111,97,100,101, + 114,115,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,8,95,105,110,115,116,97,108,108,60,6,0,0,115, + 10,0,0,0,8,2,6,1,20,1,16,1,255,128,114,83, + 1,0,0,41,1,114,68,0,0,0,41,1,78,41,3,78, + 78,78,41,2,114,0,0,0,0,114,0,0,0,0,41,1, + 84,41,1,78,41,1,78,41,83,114,132,0,0,0,114,139, + 0,0,0,114,167,0,0,0,114,72,0,0,0,114,15,0, + 0,0,114,81,0,0,0,114,164,0,0,0,114,22,0,0, + 0,114,211,0,0,0,90,2,110,116,114,18,0,0,0,114, + 196,0,0,0,90,5,112,111,115,105,120,114,42,0,0,0, + 218,3,97,108,108,114,45,0,0,0,114,46,0,0,0,114, + 66,0,0,0,114,25,0,0,0,90,37,95,67,65,83,69, + 95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,65, + 84,70,79,82,77,83,95,66,89,84,69,83,95,75,69,89, + 114,24,0,0,0,114,26,0,0,0,114,21,0,0,0,114, + 33,0,0,0,114,38,0,0,0,114,40,0,0,0,114,48, + 0,0,0,114,55,0,0,0,114,57,0,0,0,114,61,0, + 0,0,114,62,0,0,0,114,64,0,0,0,114,67,0,0, + 0,114,77,0,0,0,218,4,116,121,112,101,218,8,95,95, + 99,111,100,101,95,95,114,166,0,0,0,114,31,0,0,0, + 114,152,0,0,0,114,30,0,0,0,114,35,0,0,0,114, + 243,0,0,0,114,97,0,0,0,114,93,0,0,0,114,106, + 0,0,0,114,190,0,0,0,114,79,1,0,0,114,212,0, + 0,0,114,94,0,0,0,90,23,68,69,66,85,71,95,66, + 89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83, + 90,27,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,114,102,0, + 0,0,114,107,0,0,0,114,113,0,0,0,114,117,0,0, + 0,114,119,0,0,0,114,140,0,0,0,114,147,0,0,0, + 114,156,0,0,0,114,160,0,0,0,114,162,0,0,0,114, + 169,0,0,0,114,174,0,0,0,114,175,0,0,0,114,180, + 0,0,0,218,6,111,98,106,101,99,116,114,189,0,0,0, + 114,194,0,0,0,114,195,0,0,0,114,215,0,0,0,114, + 228,0,0,0,114,246,0,0,0,114,6,1,0,0,114,12, + 1,0,0,114,3,1,0,0,114,18,1,0,0,114,40,1, + 0,0,114,42,1,0,0,114,59,1,0,0,114,78,1,0, + 0,114,188,0,0,0,114,81,1,0,0,114,83,1,0,0, + 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,8,60,109,111,100,117,108,101,62,1,0, + 0,0,115,172,0,0,0,4,0,4,22,8,3,8,1,8, + 1,8,1,8,1,10,3,4,1,8,1,10,1,8,2,4, + 3,10,1,6,2,22,2,8,1,10,1,14,1,4,4,4, + 1,2,1,2,1,4,255,8,4,6,16,8,3,8,5,8, + 5,8,6,8,6,8,12,8,10,8,9,8,5,8,7,10, + 9,10,22,0,127,16,23,12,1,4,2,4,1,6,2,6, + 1,10,1,8,2,6,2,8,2,16,2,8,71,8,40,8, + 19,8,12,8,12,8,31,8,17,8,33,8,28,10,24,10, + 13,10,10,8,11,6,14,4,3,2,1,12,255,14,68,14, + 64,16,29,0,127,14,17,18,50,18,45,18,25,14,53,14, + 63,14,42,0,127,14,20,0,127,10,22,8,23,8,11,12, + 5,255,128, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index 87f787c84a4049..79f9741b770fc6 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -117,7 +117,7 @@ const unsigned char _Py_M__zipimport[] = { 97,109,101,32,111,102,32,116,104,101,10,32,32,32,32,122, 105,112,102,105,108,101,32,116,97,114,103,101,116,101,100,46, 10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0, - 0,0,8,0,0,0,9,0,0,0,67,0,0,0,115,28, + 0,0,8,0,0,0,9,0,0,0,67,0,0,0,115,32, 1,0,0,116,0,124,1,116,1,131,2,115,28,100,1,100, 0,108,2,125,2,124,2,160,3,124,1,161,1,125,1,124, 1,115,44,116,4,100,2,124,1,100,3,141,2,130,1,116, @@ -134,874 +134,874 @@ const unsigned char _Py_M__zipimport[] = { 1,131,1,125,7,124,7,116,15,124,1,60,0,89,0,110, 2,48,0,124,7,124,0,95,18,124,1,124,0,95,19,116, 8,106,20,124,3,100,0,100,0,100,7,133,3,25,0,142, - 0,124,0,95,21,124,0,106,21,144,1,114,24,124,0,4, - 0,106,21,116,7,55,0,2,0,95,21,100,0,83,0,41, - 8,78,114,0,0,0,0,122,21,97,114,99,104,105,118,101, - 32,112,97,116,104,32,105,115,32,101,109,112,116,121,169,1, - 218,4,112,97,116,104,122,14,110,111,116,32,97,32,90,105, - 112,32,102,105,108,101,105,0,240,0,0,105,0,128,0,0, - 233,255,255,255,255,41,22,218,10,105,115,105,110,115,116,97, - 110,99,101,218,3,115,116,114,218,2,111,115,90,8,102,115, - 100,101,99,111,100,101,114,3,0,0,0,218,12,97,108,116, - 95,112,97,116,104,95,115,101,112,218,7,114,101,112,108,97, - 99,101,218,8,112,97,116,104,95,115,101,112,218,19,95,98, - 111,111,116,115,116,114,97,112,95,101,120,116,101,114,110,97, - 108,90,10,95,112,97,116,104,95,115,116,97,116,218,7,79, - 83,69,114,114,111,114,218,10,86,97,108,117,101,69,114,114, - 111,114,90,11,95,112,97,116,104,95,115,112,108,105,116,218, - 6,97,112,112,101,110,100,90,7,115,116,95,109,111,100,101, - 218,20,95,122,105,112,95,100,105,114,101,99,116,111,114,121, - 95,99,97,99,104,101,218,8,75,101,121,69,114,114,111,114, - 218,15,95,114,101,97,100,95,100,105,114,101,99,116,111,114, - 121,218,6,95,102,105,108,101,115,218,7,97,114,99,104,105, - 118,101,218,10,95,112,97,116,104,95,106,111,105,110,218,6, - 112,114,101,102,105,120,41,8,218,4,115,101,108,102,114,13, - 0,0,0,114,17,0,0,0,114,31,0,0,0,90,2,115, - 116,90,7,100,105,114,110,97,109,101,90,8,98,97,115,101, - 110,97,109,101,218,5,102,105,108,101,115,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,8,95,95,105,110, - 105,116,95,95,63,0,0,0,115,60,0,0,0,10,1,8, - 1,10,1,4,1,12,1,4,1,12,1,4,2,2,2,14, - 1,16,1,14,3,8,1,12,1,4,1,16,1,14,3,12, - 2,2,3,12,1,12,1,8,1,14,1,6,1,6,1,22, - 2,8,1,14,1,4,128,255,128,122,20,122,105,112,105,109, - 112,111,114,116,101,114,46,95,95,105,110,105,116,95,95,78, - 99,3,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,4,0,0,0,67,0,0,0,115,78,0,0,0,116,0, - 124,0,124,1,131,2,125,3,124,3,100,1,117,1,114,26, - 124,0,103,0,102,2,83,0,116,1,124,0,124,1,131,2, - 125,4,116,2,124,0,124,4,131,2,114,70,100,1,124,0, - 106,3,155,0,116,4,155,0,124,4,155,0,157,3,103,1, - 102,2,83,0,100,1,103,0,102,2,83,0,41,2,97,47, - 2,0,0,102,105,110,100,95,108,111,97,100,101,114,40,102, - 117,108,108,110,97,109,101,44,32,112,97,116,104,61,78,111, - 110,101,41,32,45,62,32,115,101,108,102,44,32,115,116,114, - 32,111,114,32,78,111,110,101,46,10,10,32,32,32,32,32, - 32,32,32,83,101,97,114,99,104,32,102,111,114,32,97,32, - 109,111,100,117,108,101,32,115,112,101,99,105,102,105,101,100, - 32,98,121,32,39,102,117,108,108,110,97,109,101,39,46,32, - 39,102,117,108,108,110,97,109,101,39,32,109,117,115,116,32, - 98,101,32,116,104,101,10,32,32,32,32,32,32,32,32,102, - 117,108,108,121,32,113,117,97,108,105,102,105,101,100,32,40, - 100,111,116,116,101,100,41,32,109,111,100,117,108,101,32,110, - 97,109,101,46,32,73,116,32,114,101,116,117,114,110,115,32, - 116,104,101,32,122,105,112,105,109,112,111,114,116,101,114,10, - 32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101, - 32,105,116,115,101,108,102,32,105,102,32,116,104,101,32,109, - 111,100,117,108,101,32,119,97,115,32,102,111,117,110,100,44, - 32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105, - 110,105,110,103,32,116,104,101,10,32,32,32,32,32,32,32, - 32,102,117,108,108,32,112,97,116,104,32,110,97,109,101,32, - 105,102,32,105,116,39,115,32,112,111,115,115,105,98,108,121, - 32,97,32,112,111,114,116,105,111,110,32,111,102,32,97,32, - 110,97,109,101,115,112,97,99,101,32,112,97,99,107,97,103, - 101,44,10,32,32,32,32,32,32,32,32,111,114,32,78,111, - 110,101,32,111,116,104,101,114,119,105,115,101,46,32,84,104, - 101,32,111,112,116,105,111,110,97,108,32,39,112,97,116,104, - 39,32,97,114,103,117,109,101,110,116,32,105,115,32,105,103, - 110,111,114,101,100,32,45,45,32,105,116,39,115,10,32,32, - 32,32,32,32,32,32,116,104,101,114,101,32,102,111,114,32, - 99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105, - 116,104,32,116,104,101,32,105,109,112,111,114,116,101,114,32, - 112,114,111,116,111,99,111,108,46,10,10,32,32,32,32,32, - 32,32,32,68,101,112,114,101,99,97,116,101,100,32,115,105, - 110,99,101,32,80,121,116,104,111,110,32,51,46,49,48,46, - 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, - 32,105,110,115,116,101,97,100,46,10,32,32,32,32,32,32, - 32,32,78,41,5,218,16,95,103,101,116,95,109,111,100,117, - 108,101,95,105,110,102,111,218,16,95,103,101,116,95,109,111, - 100,117,108,101,95,112,97,116,104,218,7,95,105,115,95,100, - 105,114,114,29,0,0,0,114,20,0,0,0,41,5,114,32, - 0,0,0,218,8,102,117,108,108,110,97,109,101,114,13,0, - 0,0,218,2,109,105,218,7,109,111,100,112,97,116,104,114, + 0,124,0,95,21,124,0,106,21,144,1,114,28,124,0,4, + 0,106,21,116,7,55,0,2,0,95,21,100,0,83,0,100, + 0,83,0,41,8,78,114,0,0,0,0,122,21,97,114,99, + 104,105,118,101,32,112,97,116,104,32,105,115,32,101,109,112, + 116,121,169,1,218,4,112,97,116,104,122,14,110,111,116,32, + 97,32,90,105,112,32,102,105,108,101,105,0,240,0,0,105, + 0,128,0,0,233,255,255,255,255,41,22,218,10,105,115,105, + 110,115,116,97,110,99,101,218,3,115,116,114,218,2,111,115, + 90,8,102,115,100,101,99,111,100,101,114,3,0,0,0,218, + 12,97,108,116,95,112,97,116,104,95,115,101,112,218,7,114, + 101,112,108,97,99,101,218,8,112,97,116,104,95,115,101,112, + 218,19,95,98,111,111,116,115,116,114,97,112,95,101,120,116, + 101,114,110,97,108,90,10,95,112,97,116,104,95,115,116,97, + 116,218,7,79,83,69,114,114,111,114,218,10,86,97,108,117, + 101,69,114,114,111,114,90,11,95,112,97,116,104,95,115,112, + 108,105,116,218,6,97,112,112,101,110,100,90,7,115,116,95, + 109,111,100,101,218,20,95,122,105,112,95,100,105,114,101,99, + 116,111,114,121,95,99,97,99,104,101,218,8,75,101,121,69, + 114,114,111,114,218,15,95,114,101,97,100,95,100,105,114,101, + 99,116,111,114,121,218,6,95,102,105,108,101,115,218,7,97, + 114,99,104,105,118,101,218,10,95,112,97,116,104,95,106,111, + 105,110,218,6,112,114,101,102,105,120,41,8,218,4,115,101, + 108,102,114,13,0,0,0,114,17,0,0,0,114,31,0,0, + 0,90,2,115,116,90,7,100,105,114,110,97,109,101,90,8, + 98,97,115,101,110,97,109,101,218,5,102,105,108,101,115,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, + 95,95,105,110,105,116,95,95,63,0,0,0,115,60,0,0, + 0,10,1,8,1,10,1,4,1,12,1,4,1,12,1,4, + 2,2,2,14,1,16,1,14,3,8,1,12,1,4,1,16, + 1,14,3,12,2,2,3,12,1,12,1,8,1,14,1,6, + 1,6,1,22,2,8,1,18,1,4,255,255,128,122,20,122, + 105,112,105,109,112,111,114,116,101,114,46,95,95,105,110,105, + 116,95,95,78,99,3,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,4,0,0,0,67,0,0,0,115,78,0, + 0,0,116,0,124,0,124,1,131,2,125,3,124,3,100,1, + 117,1,114,26,124,0,103,0,102,2,83,0,116,1,124,0, + 124,1,131,2,125,4,116,2,124,0,124,4,131,2,114,70, + 100,1,124,0,106,3,155,0,116,4,155,0,124,4,155,0, + 157,3,103,1,102,2,83,0,100,1,103,0,102,2,83,0, + 41,2,97,47,2,0,0,102,105,110,100,95,108,111,97,100, + 101,114,40,102,117,108,108,110,97,109,101,44,32,112,97,116, + 104,61,78,111,110,101,41,32,45,62,32,115,101,108,102,44, + 32,115,116,114,32,111,114,32,78,111,110,101,46,10,10,32, + 32,32,32,32,32,32,32,83,101,97,114,99,104,32,102,111, + 114,32,97,32,109,111,100,117,108,101,32,115,112,101,99,105, + 102,105,101,100,32,98,121,32,39,102,117,108,108,110,97,109, + 101,39,46,32,39,102,117,108,108,110,97,109,101,39,32,109, + 117,115,116,32,98,101,32,116,104,101,10,32,32,32,32,32, + 32,32,32,102,117,108,108,121,32,113,117,97,108,105,102,105, + 101,100,32,40,100,111,116,116,101,100,41,32,109,111,100,117, + 108,101,32,110,97,109,101,46,32,73,116,32,114,101,116,117, + 114,110,115,32,116,104,101,32,122,105,112,105,109,112,111,114, + 116,101,114,10,32,32,32,32,32,32,32,32,105,110,115,116, + 97,110,99,101,32,105,116,115,101,108,102,32,105,102,32,116, + 104,101,32,109,111,100,117,108,101,32,119,97,115,32,102,111, + 117,110,100,44,32,97,32,115,116,114,105,110,103,32,99,111, + 110,116,97,105,110,105,110,103,32,116,104,101,10,32,32,32, + 32,32,32,32,32,102,117,108,108,32,112,97,116,104,32,110, + 97,109,101,32,105,102,32,105,116,39,115,32,112,111,115,115, + 105,98,108,121,32,97,32,112,111,114,116,105,111,110,32,111, + 102,32,97,32,110,97,109,101,115,112,97,99,101,32,112,97, + 99,107,97,103,101,44,10,32,32,32,32,32,32,32,32,111, + 114,32,78,111,110,101,32,111,116,104,101,114,119,105,115,101, + 46,32,84,104,101,32,111,112,116,105,111,110,97,108,32,39, + 112,97,116,104,39,32,97,114,103,117,109,101,110,116,32,105, + 115,32,105,103,110,111,114,101,100,32,45,45,32,105,116,39, + 115,10,32,32,32,32,32,32,32,32,116,104,101,114,101,32, + 102,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116, + 121,32,119,105,116,104,32,116,104,101,32,105,109,112,111,114, + 116,101,114,32,112,114,111,116,111,99,111,108,46,10,10,32, + 32,32,32,32,32,32,32,68,101,112,114,101,99,97,116,101, + 100,32,115,105,110,99,101,32,80,121,116,104,111,110,32,51, + 46,49,48,46,32,85,115,101,32,102,105,110,100,95,115,112, + 101,99,40,41,32,105,110,115,116,101,97,100,46,10,32,32, + 32,32,32,32,32,32,78,41,5,218,16,95,103,101,116,95, + 109,111,100,117,108,101,95,105,110,102,111,218,16,95,103,101, + 116,95,109,111,100,117,108,101,95,112,97,116,104,218,7,95, + 105,115,95,100,105,114,114,29,0,0,0,114,20,0,0,0, + 41,5,114,32,0,0,0,218,8,102,117,108,108,110,97,109, + 101,114,13,0,0,0,218,2,109,105,218,7,109,111,100,112, + 97,116,104,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,11,102,105,110,100,95,108,111,97,100,101,114,109, + 0,0,0,115,16,0,0,0,10,12,8,1,8,2,10,7, + 10,1,24,4,8,2,255,128,122,23,122,105,112,105,109,112, + 111,114,116,101,114,46,102,105,110,100,95,108,111,97,100,101, + 114,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,4,0,0,0,67,0,0,0,115,16,0,0,0,124, + 0,160,0,124,1,124,2,161,2,100,1,25,0,83,0,41, + 3,97,203,1,0,0,102,105,110,100,95,109,111,100,117,108, + 101,40,102,117,108,108,110,97,109,101,44,32,112,97,116,104, + 61,78,111,110,101,41,32,45,62,32,115,101,108,102,32,111, + 114,32,78,111,110,101,46,10,10,32,32,32,32,32,32,32, + 32,83,101,97,114,99,104,32,102,111,114,32,97,32,109,111, + 100,117,108,101,32,115,112,101,99,105,102,105,101,100,32,98, + 121,32,39,102,117,108,108,110,97,109,101,39,46,32,39,102, + 117,108,108,110,97,109,101,39,32,109,117,115,116,32,98,101, + 32,116,104,101,10,32,32,32,32,32,32,32,32,102,117,108, + 108,121,32,113,117,97,108,105,102,105,101,100,32,40,100,111, + 116,116,101,100,41,32,109,111,100,117,108,101,32,110,97,109, + 101,46,32,73,116,32,114,101,116,117,114,110,115,32,116,104, + 101,32,122,105,112,105,109,112,111,114,116,101,114,10,32,32, + 32,32,32,32,32,32,105,110,115,116,97,110,99,101,32,105, + 116,115,101,108,102,32,105,102,32,116,104,101,32,109,111,100, + 117,108,101,32,119,97,115,32,102,111,117,110,100,44,32,111, + 114,32,78,111,110,101,32,105,102,32,105,116,32,119,97,115, + 110,39,116,46,10,32,32,32,32,32,32,32,32,84,104,101, + 32,111,112,116,105,111,110,97,108,32,39,112,97,116,104,39, + 32,97,114,103,117,109,101,110,116,32,105,115,32,105,103,110, + 111,114,101,100,32,45,45,32,105,116,39,115,32,116,104,101, + 114,101,32,102,111,114,32,99,111,109,112,97,116,105,98,105, + 108,105,116,121,10,32,32,32,32,32,32,32,32,119,105,116, + 104,32,116,104,101,32,105,109,112,111,114,116,101,114,32,112, + 114,111,116,111,99,111,108,46,10,10,32,32,32,32,32,32, + 32,32,68,101,112,114,101,99,97,116,101,100,32,115,105,110, + 99,101,32,80,121,116,104,111,110,32,51,46,49,48,46,32, + 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, + 105,110,115,116,101,97,100,46,10,32,32,32,32,32,32,32, + 32,114,0,0,0,0,78,41,1,114,41,0,0,0,41,3, + 114,32,0,0,0,114,38,0,0,0,114,13,0,0,0,114, 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,11, - 102,105,110,100,95,108,111,97,100,101,114,109,0,0,0,115, - 16,0,0,0,10,12,8,1,8,2,10,7,10,1,24,4, - 8,2,255,128,122,23,122,105,112,105,109,112,111,114,116,101, - 114,46,102,105,110,100,95,108,111,97,100,101,114,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,67,0,0,0,115,16,0,0,0,124,0,160,0,124, - 1,124,2,161,2,100,1,25,0,83,0,41,3,97,203,1, - 0,0,102,105,110,100,95,109,111,100,117,108,101,40,102,117, - 108,108,110,97,109,101,44,32,112,97,116,104,61,78,111,110, - 101,41,32,45,62,32,115,101,108,102,32,111,114,32,78,111, - 110,101,46,10,10,32,32,32,32,32,32,32,32,83,101,97, - 114,99,104,32,102,111,114,32,97,32,109,111,100,117,108,101, + 102,105,110,100,95,109,111,100,117,108,101,143,0,0,0,115, + 4,0,0,0,16,11,255,128,122,23,122,105,112,105,109,112, + 111,114,116,101,114,46,102,105,110,100,95,109,111,100,117,108, + 101,99,3,0,0,0,0,0,0,0,0,0,0,0,7,0, + 0,0,5,0,0,0,67,0,0,0,115,108,0,0,0,116, + 0,124,0,124,1,131,2,125,3,124,3,100,1,117,1,114, + 34,116,1,106,2,124,1,124,0,124,3,100,2,141,3,83, + 0,116,3,124,0,124,1,131,2,125,4,116,4,124,0,124, + 4,131,2,114,104,124,0,106,5,155,0,116,6,155,0,124, + 4,155,0,157,3,125,5,116,1,106,7,124,1,100,1,100, + 3,100,4,141,3,125,6,124,6,106,8,160,9,124,5,161, + 1,1,0,124,6,83,0,100,1,83,0,41,5,122,107,67, + 114,101,97,116,101,32,97,32,77,111,100,117,108,101,83,112, + 101,99,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,46,10,10,32,32, + 32,32,32,32,32,32,82,101,116,117,114,110,115,32,78,111, + 110,101,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,99,97,110,110,111,116,32,98,101,32,102,111,117,110,100, + 46,10,32,32,32,32,32,32,32,32,78,41,1,218,10,105, + 115,95,112,97,99,107,97,103,101,84,41,3,218,4,110,97, + 109,101,90,6,108,111,97,100,101,114,114,43,0,0,0,41, + 10,114,35,0,0,0,218,10,95,98,111,111,116,115,116,114, + 97,112,90,16,115,112,101,99,95,102,114,111,109,95,108,111, + 97,100,101,114,114,36,0,0,0,114,37,0,0,0,114,29, + 0,0,0,114,20,0,0,0,90,10,77,111,100,117,108,101, + 83,112,101,99,90,26,115,117,98,109,111,100,117,108,101,95, + 115,101,97,114,99,104,95,108,111,99,97,116,105,111,110,115, + 114,24,0,0,0,41,7,114,32,0,0,0,114,38,0,0, + 0,90,6,116,97,114,103,101,116,90,11,109,111,100,117,108, + 101,95,105,110,102,111,114,40,0,0,0,114,13,0,0,0, + 90,4,115,112,101,99,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,9,102,105,110,100,95,115,112,101,99, + 156,0,0,0,115,26,0,0,0,10,5,8,1,16,1,10, + 7,10,1,18,4,8,1,2,1,6,255,12,2,4,1,4, + 2,255,128,122,21,122,105,112,105,109,112,111,114,116,101,114, + 46,102,105,110,100,95,115,112,101,99,99,2,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,67, + 0,0,0,115,20,0,0,0,116,0,124,0,124,1,131,2, + 92,3,125,2,125,3,125,4,124,2,83,0,41,2,122,163, + 103,101,116,95,99,111,100,101,40,102,117,108,108,110,97,109, + 101,41,32,45,62,32,99,111,100,101,32,111,98,106,101,99, + 116,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, + 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101, + 99,116,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,46,32,82,97,105, + 115,101,32,90,105,112,73,109,112,111,114,116,69,114,114,111, + 114,10,32,32,32,32,32,32,32,32,105,102,32,116,104,101, + 32,109,111,100,117,108,101,32,99,111,117,108,100,110,39,116, + 32,98,101,32,102,111,117,110,100,46,10,32,32,32,32,32, + 32,32,32,78,169,1,218,16,95,103,101,116,95,109,111,100, + 117,108,101,95,99,111,100,101,169,5,114,32,0,0,0,114, + 38,0,0,0,218,4,99,111,100,101,218,9,105,115,112,97, + 99,107,97,103,101,114,40,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,8,103,101,116,95,99, + 111,100,101,183,0,0,0,115,6,0,0,0,16,6,4,1, + 255,128,122,20,122,105,112,105,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,0,0,0,0,4,0,0,0,8,0,0,0,67,0,0, + 0,115,112,0,0,0,116,0,114,16,124,1,160,1,116,0, + 116,2,161,2,125,1,124,1,125,2,124,1,160,3,124,0, + 106,4,116,2,23,0,161,1,114,58,124,1,116,5,124,0, + 106,4,116,2,23,0,131,1,100,1,133,2,25,0,125,2, + 122,14,124,0,106,6,124,2,25,0,125,3,87,0,110,26, + 4,0,116,7,121,98,1,0,1,0,1,0,116,8,100,2, + 100,3,124,2,131,3,130,1,48,0,116,9,124,0,106,4, + 124,3,131,2,83,0,41,4,122,154,103,101,116,95,100,97, + 116,97,40,112,97,116,104,110,97,109,101,41,32,45,62,32, + 115,116,114,105,110,103,32,119,105,116,104,32,102,105,108,101, + 32,100,97,116,97,46,10,10,32,32,32,32,32,32,32,32, + 82,101,116,117,114,110,32,116,104,101,32,100,97,116,97,32, + 97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32, + 39,112,97,116,104,110,97,109,101,39,46,32,82,97,105,115, + 101,32,79,83,69,114,114,111,114,32,105,102,10,32,32,32, + 32,32,32,32,32,116,104,101,32,102,105,108,101,32,119,97, + 115,110,39,116,32,102,111,117,110,100,46,10,32,32,32,32, + 32,32,32,32,78,114,0,0,0,0,218,0,41,10,114,18, + 0,0,0,114,19,0,0,0,114,20,0,0,0,218,10,115, + 116,97,114,116,115,119,105,116,104,114,29,0,0,0,218,3, + 108,101,110,114,28,0,0,0,114,26,0,0,0,114,22,0, + 0,0,218,9,95,103,101,116,95,100,97,116,97,41,4,114, + 32,0,0,0,218,8,112,97,116,104,110,97,109,101,90,3, + 107,101,121,218,9,116,111,99,95,101,110,116,114,121,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,8,103, + 101,116,95,100,97,116,97,193,0,0,0,115,22,0,0,0, + 4,6,12,1,4,2,16,1,22,1,2,2,14,1,12,1, + 14,1,12,1,255,128,122,20,122,105,112,105,109,112,111,114, + 116,101,114,46,103,101,116,95,100,97,116,97,99,2,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,3,0,0, + 0,67,0,0,0,115,20,0,0,0,116,0,124,0,124,1, + 131,2,92,3,125,2,125,3,125,4,124,4,83,0,41,2, + 122,106,103,101,116,95,102,105,108,101,110,97,109,101,40,102, + 117,108,108,110,97,109,101,41,32,45,62,32,102,105,108,101, + 110,97,109,101,32,115,116,114,105,110,103,46,10,10,32,32, + 32,32,32,32,32,32,82,101,116,117,114,110,32,116,104,101, + 32,102,105,108,101,110,97,109,101,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,46,10,32,32,32,32,32,32,32,32,78,114,47,0, + 0,0,114,49,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,12,103,101,116,95,102,105,108,101, + 110,97,109,101,214,0,0,0,115,6,0,0,0,16,7,4, + 1,255,128,122,24,122,105,112,105,109,112,111,114,116,101,114, + 46,103,101,116,95,102,105,108,101,110,97,109,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0, + 0,0,67,0,0,0,115,126,0,0,0,116,0,124,0,124, + 1,131,2,125,2,124,2,100,1,117,0,114,36,116,1,100, + 2,124,1,155,2,157,2,124,1,100,3,141,2,130,1,116, + 2,124,0,124,1,131,2,125,3,124,2,114,64,116,3,160, + 4,124,3,100,4,161,2,125,4,110,10,124,3,155,0,100, + 5,157,2,125,4,122,14,124,0,106,5,124,4,25,0,125, + 5,87,0,110,20,4,0,116,6,121,108,1,0,1,0,1, + 0,89,0,100,1,83,0,48,0,116,7,124,0,106,8,124, + 5,131,2,160,9,161,0,83,0,41,6,122,253,103,101,116, + 95,115,111,117,114,99,101,40,102,117,108,108,110,97,109,101, + 41,32,45,62,32,115,111,117,114,99,101,32,115,116,114,105, + 110,103,46,10,10,32,32,32,32,32,32,32,32,82,101,116, + 117,114,110,32,116,104,101,32,115,111,117,114,99,101,32,99, + 111,100,101,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,46,32,82,97, + 105,115,101,32,90,105,112,73,109,112,111,114,116,69,114,114, + 111,114,10,32,32,32,32,32,32,32,32,105,102,32,116,104, + 101,32,109,111,100,117,108,101,32,99,111,117,108,100,110,39, + 116,32,98,101,32,102,111,117,110,100,44,32,114,101,116,117, + 114,110,32,78,111,110,101,32,105,102,32,116,104,101,32,97, + 114,99,104,105,118,101,32,100,111,101,115,10,32,32,32,32, + 32,32,32,32,99,111,110,116,97,105,110,32,116,104,101,32, + 109,111,100,117,108,101,44,32,98,117,116,32,104,97,115,32, + 110,111,32,115,111,117,114,99,101,32,102,111,114,32,105,116, + 46,10,32,32,32,32,32,32,32,32,78,250,18,99,97,110, + 39,116,32,102,105,110,100,32,109,111,100,117,108,101,32,169, + 1,114,44,0,0,0,250,11,95,95,105,110,105,116,95,95, + 46,112,121,250,3,46,112,121,41,10,114,35,0,0,0,114, + 3,0,0,0,114,36,0,0,0,114,21,0,0,0,114,30, + 0,0,0,114,28,0,0,0,114,26,0,0,0,114,56,0, + 0,0,114,29,0,0,0,218,6,100,101,99,111,100,101,41, + 6,114,32,0,0,0,114,38,0,0,0,114,39,0,0,0, + 114,13,0,0,0,218,8,102,117,108,108,112,97,116,104,114, + 58,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,225, + 0,0,0,115,26,0,0,0,10,7,8,1,18,1,10,2, + 4,1,14,1,10,2,2,2,14,1,12,1,8,2,16,1, + 255,128,122,22,122,105,112,105,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,0,0,0,0,3,0,0,0,4,0,0,0,67, + 0,0,0,115,40,0,0,0,116,0,124,0,124,1,131,2, + 125,2,124,2,100,1,117,0,114,36,116,1,100,2,124,1, + 155,2,157,2,124,1,100,3,141,2,130,1,124,2,83,0, + 41,4,122,171,105,115,95,112,97,99,107,97,103,101,40,102, + 117,108,108,110,97,109,101,41,32,45,62,32,98,111,111,108, + 46,10,10,32,32,32,32,32,32,32,32,82,101,116,117,114, + 110,32,84,114,117,101,32,105,102,32,116,104,101,32,109,111, + 100,117,108,101,32,115,112,101,99,105,102,105,101,100,32,98, + 121,32,102,117,108,108,110,97,109,101,32,105,115,32,97,32, + 112,97,99,107,97,103,101,46,10,32,32,32,32,32,32,32, + 32,82,97,105,115,101,32,90,105,112,73,109,112,111,114,116, + 69,114,114,111,114,32,105,102,32,116,104,101,32,109,111,100, + 117,108,101,32,99,111,117,108,100,110,39,116,32,98,101,32, + 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,78, + 114,61,0,0,0,114,62,0,0,0,41,2,114,35,0,0, + 0,114,3,0,0,0,41,3,114,32,0,0,0,114,38,0, + 0,0,114,39,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,114,43,0,0,0,251,0,0,0,115, + 10,0,0,0,10,6,8,1,18,1,4,1,255,128,122,22, + 122,105,112,105,109,112,111,114,116,101,114,46,105,115,95,112, + 97,99,107,97,103,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,8,0,0,0,8,0,0,0,67,0,0,0,115, + 236,0,0,0,116,0,124,0,124,1,131,2,92,3,125,2, + 125,3,125,4,116,1,106,2,160,3,124,1,161,1,125,5, + 124,5,100,1,117,0,115,46,116,4,124,5,116,5,131,2, + 115,64,116,5,124,1,131,1,125,5,124,5,116,1,106,2, + 124,1,60,0,124,0,124,5,95,6,122,84,124,3,114,108, + 116,7,124,0,124,1,131,2,125,6,116,8,160,9,124,0, + 106,10,124,6,161,2,125,7,124,7,103,1,124,5,95,11, + 116,12,124,5,100,2,131,2,115,124,116,13,124,5,95,13, + 116,8,160,14,124,5,106,15,124,1,124,4,161,3,1,0, + 116,16,124,2,124,5,106,15,131,2,1,0,87,0,110,16, + 1,0,1,0,1,0,116,1,106,2,124,1,61,0,130,0, + 122,14,116,1,106,2,124,1,25,0,125,5,87,0,110,30, + 4,0,116,17,121,216,1,0,1,0,1,0,116,18,100,3, + 124,1,155,2,100,4,157,3,131,1,130,1,48,0,116,19, + 160,20,100,5,124,1,124,4,161,3,1,0,124,5,83,0, + 41,6,97,55,1,0,0,108,111,97,100,95,109,111,100,117, + 108,101,40,102,117,108,108,110,97,109,101,41,32,45,62,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,76,111,97,100,32,116,104,101,32,109,111,100,117,108,101, 32,115,112,101,99,105,102,105,101,100,32,98,121,32,39,102, 117,108,108,110,97,109,101,39,46,32,39,102,117,108,108,110, 97,109,101,39,32,109,117,115,116,32,98,101,32,116,104,101, 10,32,32,32,32,32,32,32,32,102,117,108,108,121,32,113, 117,97,108,105,102,105,101,100,32,40,100,111,116,116,101,100, 41,32,109,111,100,117,108,101,32,110,97,109,101,46,32,73, - 116,32,114,101,116,117,114,110,115,32,116,104,101,32,122,105, - 112,105,109,112,111,114,116,101,114,10,32,32,32,32,32,32, - 32,32,105,110,115,116,97,110,99,101,32,105,116,115,101,108, - 102,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32, - 119,97,115,32,102,111,117,110,100,44,32,111,114,32,78,111, - 110,101,32,105,102,32,105,116,32,119,97,115,110,39,116,46, - 10,32,32,32,32,32,32,32,32,84,104,101,32,111,112,116, - 105,111,110,97,108,32,39,112,97,116,104,39,32,97,114,103, - 117,109,101,110,116,32,105,115,32,105,103,110,111,114,101,100, - 32,45,45,32,105,116,39,115,32,116,104,101,114,101,32,102, - 111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121, - 10,32,32,32,32,32,32,32,32,119,105,116,104,32,116,104, - 101,32,105,109,112,111,114,116,101,114,32,112,114,111,116,111, - 99,111,108,46,10,10,32,32,32,32,32,32,32,32,68,101, - 112,114,101,99,97,116,101,100,32,115,105,110,99,101,32,80, - 121,116,104,111,110,32,51,46,49,48,46,32,85,115,101,32, - 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, - 101,97,100,46,10,32,32,32,32,32,32,32,32,114,0,0, - 0,0,78,41,1,114,41,0,0,0,41,3,114,32,0,0, - 0,114,38,0,0,0,114,13,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,11,102,105,110,100, - 95,109,111,100,117,108,101,143,0,0,0,115,4,0,0,0, - 16,11,255,128,122,23,122,105,112,105,109,112,111,114,116,101, - 114,46,102,105,110,100,95,109,111,100,117,108,101,99,3,0, - 0,0,0,0,0,0,0,0,0,0,7,0,0,0,5,0, - 0,0,67,0,0,0,115,108,0,0,0,116,0,124,0,124, - 1,131,2,125,3,124,3,100,1,117,1,114,34,116,1,106, - 2,124,1,124,0,124,3,100,2,141,3,83,0,116,3,124, - 0,124,1,131,2,125,4,116,4,124,0,124,4,131,2,114, - 104,124,0,106,5,155,0,116,6,155,0,124,4,155,0,157, - 3,125,5,116,1,106,7,124,1,100,1,100,3,100,4,141, - 3,125,6,124,6,106,8,160,9,124,5,161,1,1,0,124, - 6,83,0,100,1,83,0,41,5,122,107,67,114,101,97,116, - 101,32,97,32,77,111,100,117,108,101,83,112,101,99,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,46,10,10,32,32,32,32,32,32, - 32,32,82,101,116,117,114,110,115,32,78,111,110,101,32,105, - 102,32,116,104,101,32,109,111,100,117,108,101,32,99,97,110, - 110,111,116,32,98,101,32,102,111,117,110,100,46,10,32,32, - 32,32,32,32,32,32,78,41,1,218,10,105,115,95,112,97, - 99,107,97,103,101,84,41,3,218,4,110,97,109,101,90,6, - 108,111,97,100,101,114,114,43,0,0,0,41,10,114,35,0, - 0,0,218,10,95,98,111,111,116,115,116,114,97,112,90,16, - 115,112,101,99,95,102,114,111,109,95,108,111,97,100,101,114, - 114,36,0,0,0,114,37,0,0,0,114,29,0,0,0,114, - 20,0,0,0,90,10,77,111,100,117,108,101,83,112,101,99, - 90,26,115,117,98,109,111,100,117,108,101,95,115,101,97,114, - 99,104,95,108,111,99,97,116,105,111,110,115,114,24,0,0, - 0,41,7,114,32,0,0,0,114,38,0,0,0,90,6,116, - 97,114,103,101,116,90,11,109,111,100,117,108,101,95,105,110, - 102,111,114,40,0,0,0,114,13,0,0,0,90,4,115,112, - 101,99,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,9,102,105,110,100,95,115,112,101,99,156,0,0,0, - 115,26,0,0,0,10,5,8,1,16,1,10,7,10,1,18, - 4,8,1,2,1,6,255,12,2,4,1,4,2,255,128,122, - 21,122,105,112,105,109,112,111,114,116,101,114,46,102,105,110, - 100,95,115,112,101,99,99,2,0,0,0,0,0,0,0,0, - 0,0,0,5,0,0,0,3,0,0,0,67,0,0,0,115, - 20,0,0,0,116,0,124,0,124,1,131,2,92,3,125,2, - 125,3,125,4,124,2,83,0,41,2,122,163,103,101,116,95, - 99,111,100,101,40,102,117,108,108,110,97,109,101,41,32,45, - 62,32,99,111,100,101,32,111,98,106,101,99,116,46,10,10, - 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,116, - 104,101,32,99,111,100,101,32,111,98,106,101,99,116,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,46,32,82,97,105,115,101,32,90, - 105,112,73,109,112,111,114,116,69,114,114,111,114,10,32,32, - 32,32,32,32,32,32,105,102,32,116,104,101,32,109,111,100, - 117,108,101,32,99,111,117,108,100,110,39,116,32,98,101,32, - 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,78, - 169,1,218,16,95,103,101,116,95,109,111,100,117,108,101,95, - 99,111,100,101,169,5,114,32,0,0,0,114,38,0,0,0, - 218,4,99,111,100,101,218,9,105,115,112,97,99,107,97,103, - 101,114,40,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,8,103,101,116,95,99,111,100,101,183, - 0,0,0,115,6,0,0,0,16,6,4,1,255,128,122,20, - 122,105,112,105,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,0,0,0, - 0,4,0,0,0,8,0,0,0,67,0,0,0,115,112,0, - 0,0,116,0,114,16,124,1,160,1,116,0,116,2,161,2, - 125,1,124,1,125,2,124,1,160,3,124,0,106,4,116,2, - 23,0,161,1,114,58,124,1,116,5,124,0,106,4,116,2, - 23,0,131,1,100,1,133,2,25,0,125,2,122,14,124,0, - 106,6,124,2,25,0,125,3,87,0,110,26,4,0,116,7, - 121,98,1,0,1,0,1,0,116,8,100,2,100,3,124,2, - 131,3,130,1,48,0,116,9,124,0,106,4,124,3,131,2, - 83,0,41,4,122,154,103,101,116,95,100,97,116,97,40,112, - 97,116,104,110,97,109,101,41,32,45,62,32,115,116,114,105, - 110,103,32,119,105,116,104,32,102,105,108,101,32,100,97,116, - 97,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, - 114,110,32,116,104,101,32,100,97,116,97,32,97,115,115,111, - 99,105,97,116,101,100,32,119,105,116,104,32,39,112,97,116, - 104,110,97,109,101,39,46,32,82,97,105,115,101,32,79,83, - 69,114,114,111,114,32,105,102,10,32,32,32,32,32,32,32, - 32,116,104,101,32,102,105,108,101,32,119,97,115,110,39,116, - 32,102,111,117,110,100,46,10,32,32,32,32,32,32,32,32, - 78,114,0,0,0,0,218,0,41,10,114,18,0,0,0,114, - 19,0,0,0,114,20,0,0,0,218,10,115,116,97,114,116, - 115,119,105,116,104,114,29,0,0,0,218,3,108,101,110,114, - 28,0,0,0,114,26,0,0,0,114,22,0,0,0,218,9, - 95,103,101,116,95,100,97,116,97,41,4,114,32,0,0,0, - 218,8,112,97,116,104,110,97,109,101,90,3,107,101,121,218, - 9,116,111,99,95,101,110,116,114,121,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,8,103,101,116,95,100, - 97,116,97,193,0,0,0,115,22,0,0,0,4,6,12,1, - 4,2,16,1,22,1,2,2,14,1,12,1,14,1,12,1, - 255,128,122,20,122,105,112,105,109,112,111,114,116,101,114,46, - 103,101,116,95,100,97,116,97,99,2,0,0,0,0,0,0, - 0,0,0,0,0,5,0,0,0,3,0,0,0,67,0,0, - 0,115,20,0,0,0,116,0,124,0,124,1,131,2,92,3, - 125,2,125,3,125,4,124,4,83,0,41,2,122,106,103,101, - 116,95,102,105,108,101,110,97,109,101,40,102,117,108,108,110, - 97,109,101,41,32,45,62,32,102,105,108,101,110,97,109,101, - 32,115,116,114,105,110,103,46,10,10,32,32,32,32,32,32, - 32,32,82,101,116,117,114,110,32,116,104,101,32,102,105,108, - 101,110,97,109,101,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,46,10, - 32,32,32,32,32,32,32,32,78,114,47,0,0,0,114,49, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,12,103,101,116,95,102,105,108,101,110,97,109,101, - 214,0,0,0,115,6,0,0,0,16,7,4,1,255,128,122, - 24,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, - 95,102,105,108,101,110,97,109,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,8,0,0,0,67,0, - 0,0,115,126,0,0,0,116,0,124,0,124,1,131,2,125, - 2,124,2,100,1,117,0,114,36,116,1,100,2,124,1,155, - 2,157,2,124,1,100,3,141,2,130,1,116,2,124,0,124, - 1,131,2,125,3,124,2,114,64,116,3,160,4,124,3,100, - 4,161,2,125,4,110,10,124,3,155,0,100,5,157,2,125, - 4,122,14,124,0,106,5,124,4,25,0,125,5,87,0,110, - 20,4,0,116,6,121,108,1,0,1,0,1,0,89,0,100, - 1,83,0,48,0,116,7,124,0,106,8,124,5,131,2,160, - 9,161,0,83,0,41,6,122,253,103,101,116,95,115,111,117, - 114,99,101,40,102,117,108,108,110,97,109,101,41,32,45,62, - 32,115,111,117,114,99,101,32,115,116,114,105,110,103,46,10, - 10,32,32,32,32,32,32,32,32,82,101,116,117,114,110,32, - 116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32, - 90,105,112,73,109,112,111,114,116,69,114,114,111,114,10,32, - 32,32,32,32,32,32,32,105,102,32,116,104,101,32,109,111, - 100,117,108,101,32,99,111,117,108,100,110,39,116,32,98,101, - 32,102,111,117,110,100,44,32,114,101,116,117,114,110,32,78, - 111,110,101,32,105,102,32,116,104,101,32,97,114,99,104,105, - 118,101,32,100,111,101,115,10,32,32,32,32,32,32,32,32, - 99,111,110,116,97,105,110,32,116,104,101,32,109,111,100,117, - 108,101,44,32,98,117,116,32,104,97,115,32,110,111,32,115, - 111,117,114,99,101,32,102,111,114,32,105,116,46,10,32,32, - 32,32,32,32,32,32,78,250,18,99,97,110,39,116,32,102, - 105,110,100,32,109,111,100,117,108,101,32,169,1,114,44,0, - 0,0,250,11,95,95,105,110,105,116,95,95,46,112,121,250, - 3,46,112,121,41,10,114,35,0,0,0,114,3,0,0,0, - 114,36,0,0,0,114,21,0,0,0,114,30,0,0,0,114, - 28,0,0,0,114,26,0,0,0,114,56,0,0,0,114,29, - 0,0,0,218,6,100,101,99,111,100,101,41,6,114,32,0, - 0,0,114,38,0,0,0,114,39,0,0,0,114,13,0,0, - 0,218,8,102,117,108,108,112,97,116,104,114,58,0,0,0, + 116,32,114,101,116,117,114,110,115,32,116,104,101,32,105,109, + 112,111,114,116,101,100,10,32,32,32,32,32,32,32,32,109, + 111,100,117,108,101,44,32,111,114,32,114,97,105,115,101,115, + 32,90,105,112,73,109,112,111,114,116,69,114,114,111,114,32, + 105,102,32,105,116,32,119,97,115,110,39,116,32,102,111,117, + 110,100,46,10,10,32,32,32,32,32,32,32,32,68,101,112, + 114,101,99,97,116,101,100,32,115,105,110,99,101,32,80,121, + 116,104,111,110,32,51,46,49,48,46,32,117,115,101,32,101, + 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, + 116,101,97,100,46,10,32,32,32,32,32,32,32,32,78,218, + 12,95,95,98,117,105,108,116,105,110,115,95,95,122,14,76, + 111,97,100,101,100,32,109,111,100,117,108,101,32,122,25,32, + 110,111,116,32,102,111,117,110,100,32,105,110,32,115,121,115, + 46,109,111,100,117,108,101,115,122,30,105,109,112,111,114,116, + 32,123,125,32,35,32,108,111,97,100,101,100,32,102,114,111, + 109,32,90,105,112,32,123,125,41,21,114,48,0,0,0,218, + 3,115,121,115,218,7,109,111,100,117,108,101,115,218,3,103, + 101,116,114,15,0,0,0,218,12,95,109,111,100,117,108,101, + 95,116,121,112,101,218,10,95,95,108,111,97,100,101,114,95, + 95,114,36,0,0,0,114,21,0,0,0,114,30,0,0,0, + 114,29,0,0,0,90,8,95,95,112,97,116,104,95,95,218, + 7,104,97,115,97,116,116,114,114,68,0,0,0,90,14,95, + 102,105,120,95,117,112,95,109,111,100,117,108,101,218,8,95, + 95,100,105,99,116,95,95,218,4,101,120,101,99,114,26,0, + 0,0,218,11,73,109,112,111,114,116,69,114,114,111,114,114, + 45,0,0,0,218,16,95,118,101,114,98,111,115,101,95,109, + 101,115,115,97,103,101,41,8,114,32,0,0,0,114,38,0, + 0,0,114,50,0,0,0,114,51,0,0,0,114,40,0,0, + 0,90,3,109,111,100,114,13,0,0,0,114,66,0,0,0, 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 10,103,101,116,95,115,111,117,114,99,101,225,0,0,0,115, - 26,0,0,0,10,7,8,1,18,1,10,2,4,1,14,1, - 10,2,2,2,14,1,12,1,8,2,16,1,255,128,122,22, - 122,105,112,105,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,0, - 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115, - 40,0,0,0,116,0,124,0,124,1,131,2,125,2,124,2, - 100,1,117,0,114,36,116,1,100,2,124,1,155,2,157,2, - 124,1,100,3,141,2,130,1,124,2,83,0,41,4,122,171, - 105,115,95,112,97,99,107,97,103,101,40,102,117,108,108,110, - 97,109,101,41,32,45,62,32,98,111,111,108,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,32,84,114, - 117,101,32,105,102,32,116,104,101,32,109,111,100,117,108,101, - 32,115,112,101,99,105,102,105,101,100,32,98,121,32,102,117, - 108,108,110,97,109,101,32,105,115,32,97,32,112,97,99,107, - 97,103,101,46,10,32,32,32,32,32,32,32,32,82,97,105, - 115,101,32,90,105,112,73,109,112,111,114,116,69,114,114,111, - 114,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32, - 99,111,117,108,100,110,39,116,32,98,101,32,102,111,117,110, - 100,46,10,32,32,32,32,32,32,32,32,78,114,61,0,0, - 0,114,62,0,0,0,41,2,114,35,0,0,0,114,3,0, - 0,0,41,3,114,32,0,0,0,114,38,0,0,0,114,39, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,43,0,0,0,251,0,0,0,115,10,0,0,0, - 10,6,8,1,18,1,4,1,255,128,122,22,122,105,112,105, - 109,112,111,114,116,101,114,46,105,115,95,112,97,99,107,97, - 103,101,99,2,0,0,0,0,0,0,0,0,0,0,0,8, - 0,0,0,8,0,0,0,67,0,0,0,115,236,0,0,0, - 116,0,124,0,124,1,131,2,92,3,125,2,125,3,125,4, - 116,1,106,2,160,3,124,1,161,1,125,5,124,5,100,1, - 117,0,115,46,116,4,124,5,116,5,131,2,115,64,116,5, - 124,1,131,1,125,5,124,5,116,1,106,2,124,1,60,0, - 124,0,124,5,95,6,122,84,124,3,114,108,116,7,124,0, - 124,1,131,2,125,6,116,8,160,9,124,0,106,10,124,6, - 161,2,125,7,124,7,103,1,124,5,95,11,116,12,124,5, - 100,2,131,2,115,124,116,13,124,5,95,13,116,8,160,14, - 124,5,106,15,124,1,124,4,161,3,1,0,116,16,124,2, - 124,5,106,15,131,2,1,0,87,0,110,16,1,0,1,0, - 1,0,116,1,106,2,124,1,61,0,130,0,122,14,116,1, - 106,2,124,1,25,0,125,5,87,0,110,30,4,0,116,17, - 121,216,1,0,1,0,1,0,116,18,100,3,124,1,155,2, - 100,4,157,3,131,1,130,1,48,0,116,19,160,20,100,5, - 124,1,124,4,161,3,1,0,124,5,83,0,41,6,97,55, - 1,0,0,108,111,97,100,95,109,111,100,117,108,101,40,102, - 117,108,108,110,97,109,101,41,32,45,62,32,109,111,100,117, - 108,101,46,10,10,32,32,32,32,32,32,32,32,76,111,97, - 100,32,116,104,101,32,109,111,100,117,108,101,32,115,112,101, - 99,105,102,105,101,100,32,98,121,32,39,102,117,108,108,110, - 97,109,101,39,46,32,39,102,117,108,108,110,97,109,101,39, - 32,109,117,115,116,32,98,101,32,116,104,101,10,32,32,32, - 32,32,32,32,32,102,117,108,108,121,32,113,117,97,108,105, - 102,105,101,100,32,40,100,111,116,116,101,100,41,32,109,111, - 100,117,108,101,32,110,97,109,101,46,32,73,116,32,114,101, - 116,117,114,110,115,32,116,104,101,32,105,109,112,111,114,116, - 101,100,10,32,32,32,32,32,32,32,32,109,111,100,117,108, - 101,44,32,111,114,32,114,97,105,115,101,115,32,90,105,112, - 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105, - 116,32,119,97,115,110,39,116,32,102,111,117,110,100,46,10, - 10,32,32,32,32,32,32,32,32,68,101,112,114,101,99,97, - 116,101,100,32,115,105,110,99,101,32,80,121,116,104,111,110, - 32,51,46,49,48,46,32,117,115,101,32,101,120,101,99,95, - 109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,100, - 46,10,32,32,32,32,32,32,32,32,78,218,12,95,95,98, - 117,105,108,116,105,110,115,95,95,122,14,76,111,97,100,101, - 100,32,109,111,100,117,108,101,32,122,25,32,110,111,116,32, - 102,111,117,110,100,32,105,110,32,115,121,115,46,109,111,100, - 117,108,101,115,122,30,105,109,112,111,114,116,32,123,125,32, - 35,32,108,111,97,100,101,100,32,102,114,111,109,32,90,105, - 112,32,123,125,41,21,114,48,0,0,0,218,3,115,121,115, - 218,7,109,111,100,117,108,101,115,218,3,103,101,116,114,15, - 0,0,0,218,12,95,109,111,100,117,108,101,95,116,121,112, - 101,218,10,95,95,108,111,97,100,101,114,95,95,114,36,0, - 0,0,114,21,0,0,0,114,30,0,0,0,114,29,0,0, - 0,90,8,95,95,112,97,116,104,95,95,218,7,104,97,115, - 97,116,116,114,114,68,0,0,0,90,14,95,102,105,120,95, - 117,112,95,109,111,100,117,108,101,218,8,95,95,100,105,99, - 116,95,95,218,4,101,120,101,99,114,26,0,0,0,218,11, - 73,109,112,111,114,116,69,114,114,111,114,114,45,0,0,0, - 218,16,95,118,101,114,98,111,115,101,95,109,101,115,115,97, - 103,101,41,8,114,32,0,0,0,114,38,0,0,0,114,50, - 0,0,0,114,51,0,0,0,114,40,0,0,0,90,3,109, - 111,100,114,13,0,0,0,114,66,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,11,108,111,97, - 100,95,109,111,100,117,108,101,8,1,0,0,115,50,0,0, - 0,16,9,12,1,18,1,8,1,10,1,6,1,2,2,4, - 1,10,3,14,1,8,1,10,2,6,1,16,1,16,1,6, - 1,8,1,2,1,2,2,14,1,12,1,18,1,14,1,4, - 1,255,128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0,0,8,0,0, - 0,67,0,0,0,115,64,0,0,0,122,20,124,0,160,0, - 124,1,161,1,115,18,87,0,100,1,83,0,87,0,110,20, - 4,0,116,1,121,40,1,0,1,0,1,0,89,0,100,1, - 83,0,48,0,100,2,100,3,108,2,109,3,125,2,1,0, - 124,2,124,0,124,1,131,2,83,0,41,4,122,204,82,101, - 116,117,114,110,32,116,104,101,32,82,101,115,111,117,114,99, - 101,82,101,97,100,101,114,32,102,111,114,32,97,32,112,97, - 99,107,97,103,101,32,105,110,32,97,32,122,105,112,32,102, - 105,108,101,46,10,10,32,32,32,32,32,32,32,32,73,102, - 32,39,102,117,108,108,110,97,109,101,39,32,105,115,32,97, - 32,112,97,99,107,97,103,101,32,119,105,116,104,105,110,32, - 116,104,101,32,122,105,112,32,102,105,108,101,44,32,114,101, - 116,117,114,110,32,116,104,101,10,32,32,32,32,32,32,32, - 32,39,82,101,115,111,117,114,99,101,82,101,97,100,101,114, - 39,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101, - 32,112,97,99,107,97,103,101,46,32,32,79,116,104,101,114, - 119,105,115,101,32,114,101,116,117,114,110,32,78,111,110,101, - 46,10,32,32,32,32,32,32,32,32,78,114,0,0,0,0, - 41,1,218,9,90,105,112,82,101,97,100,101,114,41,4,114, - 43,0,0,0,114,3,0,0,0,90,17,105,109,112,111,114, - 116,108,105,98,46,114,101,97,100,101,114,115,114,80,0,0, - 0,41,3,114,32,0,0,0,114,38,0,0,0,114,80,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95, - 114,101,97,100,101,114,48,1,0,0,115,16,0,0,0,2, - 6,10,1,10,1,12,1,8,1,12,1,10,1,255,128,122, - 31,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, - 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,5,0,0,0,67,0,0,0,115,24,0,0,0,100,1, - 124,0,106,0,155,0,116,1,155,0,124,0,106,2,155,0, - 100,2,157,5,83,0,41,3,78,122,21,60,122,105,112,105, - 109,112,111,114,116,101,114,32,111,98,106,101,99,116,32,34, - 122,2,34,62,41,3,114,29,0,0,0,114,20,0,0,0, - 114,31,0,0,0,41,1,114,32,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,8,95,95,114, - 101,112,114,95,95,63,1,0,0,115,4,0,0,0,24,1, - 255,128,122,20,122,105,112,105,109,112,111,114,116,101,114,46, - 95,95,114,101,112,114,95,95,41,1,78,41,1,78,41,1, - 78,41,16,114,6,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,7,95,95,100,111,99,95,95,114,34,0,0,0, - 114,41,0,0,0,114,42,0,0,0,114,46,0,0,0,114, - 52,0,0,0,114,59,0,0,0,114,60,0,0,0,114,67, - 0,0,0,114,43,0,0,0,114,79,0,0,0,114,81,0, - 0,0,114,82,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,114,4,0,0,0, - 45,0,0,0,115,30,0,0,0,8,0,4,1,8,17,10, - 46,10,34,10,13,8,27,8,10,8,21,8,11,8,26,8, - 13,8,40,12,15,255,128,122,12,95,95,105,110,105,116,95, - 95,46,112,121,99,84,114,63,0,0,0,70,41,3,122,4, - 46,112,121,99,84,70,41,3,114,64,0,0,0,70,70,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,67,0,0,0,115,20,0,0,0,124,0,106, - 0,124,1,160,1,100,1,161,1,100,2,25,0,23,0,83, - 0,41,3,78,218,1,46,233,2,0,0,0,41,2,114,31, - 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,41, - 2,114,32,0,0,0,114,38,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,114,36,0,0,0,81, - 1,0,0,115,4,0,0,0,20,1,255,128,114,36,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,2,0,0,0,67,0,0,0,115,18,0,0,0,124, - 1,116,0,23,0,125,2,124,2,124,0,106,1,118,0,83, - 0,169,1,78,41,2,114,20,0,0,0,114,28,0,0,0, - 41,3,114,32,0,0,0,114,13,0,0,0,90,7,100,105, - 114,112,97,116,104,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,37,0,0,0,85,1,0,0,115,6,0, - 0,0,8,4,10,2,255,128,114,37,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,7,0,0,0,4,0, - 0,0,67,0,0,0,115,54,0,0,0,116,0,124,0,124, - 1,131,2,125,2,116,1,68,0,93,34,92,3,125,3,125, - 4,125,5,124,2,124,3,23,0,125,6,124,6,124,0,106, - 2,118,0,114,14,124,5,2,0,1,0,83,0,100,0,83, - 0,114,87,0,0,0,41,3,114,36,0,0,0,218,16,95, - 122,105,112,95,115,101,97,114,99,104,111,114,100,101,114,114, - 28,0,0,0,41,7,114,32,0,0,0,114,38,0,0,0, - 114,13,0,0,0,218,6,115,117,102,102,105,120,218,10,105, - 115,98,121,116,101,99,111,100,101,114,51,0,0,0,114,66, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,35,0,0,0,94,1,0,0,115,14,0,0,0, - 10,1,14,1,8,1,10,1,8,1,4,1,255,128,114,35, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 26,0,0,0,9,0,0,0,67,0,0,0,115,230,4,0, - 0,122,14,116,0,160,1,124,0,161,1,125,1,87,0,110, - 32,4,0,116,2,121,46,1,0,1,0,1,0,116,3,100, - 1,124,0,155,2,157,2,124,0,100,2,141,2,130,1,48, - 0,124,1,144,4,143,140,1,0,122,36,124,1,160,4,116, - 5,11,0,100,3,161,2,1,0,124,1,160,6,161,0,125, - 2,124,1,160,7,116,5,161,1,125,3,87,0,110,32,4, - 0,116,2,121,124,1,0,1,0,1,0,116,3,100,4,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,48,0,116, - 8,124,3,131,1,116,5,107,3,114,156,116,3,100,4,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,124,3,100, - 0,100,5,133,2,25,0,116,9,107,3,144,1,114,154,122, - 24,124,1,160,4,100,6,100,3,161,2,1,0,124,1,160, - 6,161,0,125,4,87,0,110,32,4,0,116,2,121,230,1, - 0,1,0,1,0,116,3,100,4,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,48,0,116,10,124,4,116,11,24, - 0,116,5,24,0,100,6,131,2,125,5,122,22,124,1,160, - 4,124,5,161,1,1,0,124,1,160,7,161,0,125,6,87, - 0,110,34,4,0,116,2,144,1,121,50,1,0,1,0,1, - 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,48,0,124,6,160,12,116,9,161,1,125,7,124, - 7,100,6,107,0,144,1,114,90,116,3,100,7,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,124,6,124,7,124, - 7,116,5,23,0,133,2,25,0,125,3,116,8,124,3,131, - 1,116,5,107,3,144,1,114,138,116,3,100,8,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,124,4,116,8,124, - 6,131,1,24,0,124,7,23,0,125,2,116,13,124,3,100, - 9,100,10,133,2,25,0,131,1,125,8,116,13,124,3,100, - 10,100,11,133,2,25,0,131,1,125,9,124,2,124,8,107, - 0,144,1,114,214,116,3,100,12,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,124,2,124,9,107,0,144,1,114, - 242,116,3,100,13,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,124,2,124,8,56,0,125,2,124,2,124,9,24, - 0,125,10,124,10,100,6,107,0,144,2,114,30,116,3,100, - 14,124,0,155,2,157,2,124,0,100,2,141,2,130,1,105, - 0,125,11,100,6,125,12,122,14,124,1,160,4,124,2,161, - 1,1,0,87,0,110,34,4,0,116,2,144,2,121,86,1, + 11,108,111,97,100,95,109,111,100,117,108,101,8,1,0,0, + 115,50,0,0,0,16,9,12,1,18,1,8,1,10,1,6, + 1,2,2,4,1,10,3,14,1,8,1,10,2,6,1,16, + 1,16,1,6,1,8,1,2,1,2,2,14,1,12,1,18, + 1,14,1,4,1,255,128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0, + 0,8,0,0,0,67,0,0,0,115,64,0,0,0,122,20, + 124,0,160,0,124,1,161,1,115,18,87,0,100,1,83,0, + 87,0,110,20,4,0,116,1,121,40,1,0,1,0,1,0, + 89,0,100,1,83,0,48,0,100,2,100,3,108,2,109,3, + 125,2,1,0,124,2,124,0,124,1,131,2,83,0,41,4, + 122,204,82,101,116,117,114,110,32,116,104,101,32,82,101,115, + 111,117,114,99,101,82,101,97,100,101,114,32,102,111,114,32, + 97,32,112,97,99,107,97,103,101,32,105,110,32,97,32,122, + 105,112,32,102,105,108,101,46,10,10,32,32,32,32,32,32, + 32,32,73,102,32,39,102,117,108,108,110,97,109,101,39,32, + 105,115,32,97,32,112,97,99,107,97,103,101,32,119,105,116, + 104,105,110,32,116,104,101,32,122,105,112,32,102,105,108,101, + 44,32,114,101,116,117,114,110,32,116,104,101,10,32,32,32, + 32,32,32,32,32,39,82,101,115,111,117,114,99,101,82,101, + 97,100,101,114,39,32,111,98,106,101,99,116,32,102,111,114, + 32,116,104,101,32,112,97,99,107,97,103,101,46,32,32,79, + 116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,32, + 78,111,110,101,46,10,32,32,32,32,32,32,32,32,78,114, + 0,0,0,0,41,1,218,9,90,105,112,82,101,97,100,101, + 114,41,4,114,43,0,0,0,114,3,0,0,0,90,17,105, + 109,112,111,114,116,108,105,98,46,114,101,97,100,101,114,115, + 114,80,0,0,0,41,3,114,32,0,0,0,114,38,0,0, + 0,114,80,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,19,103,101,116,95,114,101,115,111,117, + 114,99,101,95,114,101,97,100,101,114,48,1,0,0,115,16, + 0,0,0,2,6,10,1,10,1,12,1,8,1,12,1,10, + 1,255,128,122,31,122,105,112,105,109,112,111,114,116,101,114, + 46,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, + 97,100,101,114,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,5,0,0,0,67,0,0,0,115,24,0, + 0,0,100,1,124,0,106,0,155,0,116,1,155,0,124,0, + 106,2,155,0,100,2,157,5,83,0,41,3,78,122,21,60, + 122,105,112,105,109,112,111,114,116,101,114,32,111,98,106,101, + 99,116,32,34,122,2,34,62,41,3,114,29,0,0,0,114, + 20,0,0,0,114,31,0,0,0,41,1,114,32,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 8,95,95,114,101,112,114,95,95,63,1,0,0,115,4,0, + 0,0,24,1,255,128,122,20,122,105,112,105,109,112,111,114, + 116,101,114,46,95,95,114,101,112,114,95,95,41,1,78,41, + 1,78,41,1,78,41,16,114,6,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,7,95,95,100,111,99,95,95,114, + 34,0,0,0,114,41,0,0,0,114,42,0,0,0,114,46, + 0,0,0,114,52,0,0,0,114,59,0,0,0,114,60,0, + 0,0,114,67,0,0,0,114,43,0,0,0,114,79,0,0, + 0,114,81,0,0,0,114,82,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, + 4,0,0,0,45,0,0,0,115,30,0,0,0,8,0,4, + 1,8,17,10,46,10,34,10,13,8,27,8,10,8,21,8, + 11,8,26,8,13,8,40,12,15,255,128,122,12,95,95,105, + 110,105,116,95,95,46,112,121,99,84,114,63,0,0,0,70, + 41,3,122,4,46,112,121,99,84,70,41,3,114,64,0,0, + 0,70,70,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,67,0,0,0,115,20,0,0, + 0,124,0,106,0,124,1,160,1,100,1,161,1,100,2,25, + 0,23,0,83,0,41,3,78,218,1,46,233,2,0,0,0, + 41,2,114,31,0,0,0,218,10,114,112,97,114,116,105,116, + 105,111,110,41,2,114,32,0,0,0,114,38,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,36, + 0,0,0,81,1,0,0,115,4,0,0,0,20,1,255,128, + 114,36,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,2,0,0,0,67,0,0,0,115,18, + 0,0,0,124,1,116,0,23,0,125,2,124,2,124,0,106, + 1,118,0,83,0,169,1,78,41,2,114,20,0,0,0,114, + 28,0,0,0,41,3,114,32,0,0,0,114,13,0,0,0, + 90,7,100,105,114,112,97,116,104,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,37,0,0,0,85,1,0, + 0,115,6,0,0,0,8,4,10,2,255,128,114,37,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,7,0, + 0,0,4,0,0,0,67,0,0,0,115,54,0,0,0,116, + 0,124,0,124,1,131,2,125,2,116,1,68,0,93,34,92, + 3,125,3,125,4,125,5,124,2,124,3,23,0,125,6,124, + 6,124,0,106,2,118,0,114,14,124,5,2,0,1,0,83, + 0,100,0,83,0,114,87,0,0,0,41,3,114,36,0,0, + 0,218,16,95,122,105,112,95,115,101,97,114,99,104,111,114, + 100,101,114,114,28,0,0,0,41,7,114,32,0,0,0,114, + 38,0,0,0,114,13,0,0,0,218,6,115,117,102,102,105, + 120,218,10,105,115,98,121,116,101,99,111,100,101,114,51,0, + 0,0,114,66,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,114,35,0,0,0,94,1,0,0,115, + 14,0,0,0,10,1,14,1,8,1,10,1,8,1,4,1, + 255,128,114,35,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,26,0,0,0,9,0,0,0,67,0,0,0, + 115,230,4,0,0,122,14,116,0,160,1,124,0,161,1,125, + 1,87,0,110,32,4,0,116,2,121,46,1,0,1,0,1, + 0,116,3,100,1,124,0,155,2,157,2,124,0,100,2,141, + 2,130,1,48,0,124,1,144,4,143,140,1,0,122,36,124, + 1,160,4,116,5,11,0,100,3,161,2,1,0,124,1,160, + 6,161,0,125,2,124,1,160,7,116,5,161,1,125,3,87, + 0,110,32,4,0,116,2,121,124,1,0,1,0,1,0,116, + 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,48,0,116,8,124,3,131,1,116,5,107,3,114,156,116, + 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,124,3,100,0,100,5,133,2,25,0,116,9,107,3,144, + 1,114,154,122,24,124,1,160,4,100,6,100,3,161,2,1, + 0,124,1,160,6,161,0,125,4,87,0,110,32,4,0,116, + 2,121,230,1,0,1,0,1,0,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,48,0,116,10,124, + 4,116,11,24,0,116,5,24,0,100,6,131,2,125,5,122, + 22,124,1,160,4,124,5,161,1,1,0,124,1,160,7,161, + 0,125,6,87,0,110,34,4,0,116,2,144,1,121,50,1, 0,1,0,1,0,116,3,100,4,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,48,0,124,1,160,7,100,15,161, - 1,125,3,116,8,124,3,131,1,100,5,107,0,144,2,114, - 120,116,14,100,16,131,1,130,1,124,3,100,0,100,5,133, - 2,25,0,100,17,107,3,144,2,114,142,144,4,113,180,116, - 8,124,3,131,1,100,15,107,3,144,2,114,164,116,14,100, - 16,131,1,130,1,116,15,124,3,100,18,100,19,133,2,25, - 0,131,1,125,13,116,15,124,3,100,19,100,9,133,2,25, - 0,131,1,125,14,116,15,124,3,100,9,100,20,133,2,25, - 0,131,1,125,15,116,15,124,3,100,20,100,10,133,2,25, - 0,131,1,125,16,116,13,124,3,100,10,100,11,133,2,25, - 0,131,1,125,17,116,13,124,3,100,11,100,21,133,2,25, - 0,131,1,125,18,116,13,124,3,100,21,100,22,133,2,25, - 0,131,1,125,4,116,15,124,3,100,22,100,23,133,2,25, - 0,131,1,125,19,116,15,124,3,100,23,100,24,133,2,25, - 0,131,1,125,20,116,15,124,3,100,24,100,25,133,2,25, - 0,131,1,125,21,116,13,124,3,100,26,100,15,133,2,25, - 0,131,1,125,22,124,19,124,20,23,0,124,21,23,0,125, - 8,124,22,124,9,107,4,144,3,114,124,116,3,100,27,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,124,22,124, - 10,55,0,125,22,122,14,124,1,160,7,124,19,161,1,125, - 23,87,0,110,34,4,0,116,2,144,3,121,180,1,0,1, - 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,48,0,116,8,124,23,131,1,124,19,107, - 3,144,3,114,214,116,3,100,4,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,122,50,116,8,124,1,160,7,124, - 8,124,19,24,0,161,1,131,1,124,8,124,19,24,0,107, - 3,144,4,114,6,116,3,100,4,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,87,0,110,34,4,0,116,2,144, - 4,121,42,1,0,1,0,1,0,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,48,0,124,13,100, - 28,64,0,144,4,114,64,124,23,160,16,161,0,125,23,110, - 52,122,14,124,23,160,16,100,29,161,1,125,23,87,0,110, - 36,4,0,116,17,144,4,121,114,1,0,1,0,1,0,124, - 23,160,16,100,30,161,1,160,18,116,19,161,1,125,23,89, - 0,110,2,48,0,124,23,160,20,100,31,116,21,161,2,125, - 23,116,22,160,23,124,0,124,23,161,2,125,24,124,24,124, - 14,124,18,124,4,124,22,124,15,124,16,124,17,102,8,125, - 25,124,25,124,11,124,23,60,0,124,12,100,32,55,0,125, - 12,144,2,113,88,87,0,100,0,4,0,4,0,131,3,1, - 0,110,18,49,0,144,4,115,202,48,0,1,0,1,0,1, - 0,89,0,1,0,116,24,160,25,100,33,124,12,124,0,161, - 3,1,0,124,11,83,0,41,34,78,122,21,99,97,110,39, - 116,32,111,112,101,110,32,90,105,112,32,102,105,108,101,58, - 32,114,12,0,0,0,114,85,0,0,0,250,21,99,97,110, - 39,116,32,114,101,97,100,32,90,105,112,32,102,105,108,101, - 58,32,233,4,0,0,0,114,0,0,0,0,122,16,110,111, - 116,32,97,32,90,105,112,32,102,105,108,101,58,32,122,18, - 99,111,114,114,117,112,116,32,90,105,112,32,102,105,108,101, - 58,32,233,12,0,0,0,233,16,0,0,0,233,20,0,0, - 0,122,28,98,97,100,32,99,101,110,116,114,97,108,32,100, - 105,114,101,99,116,111,114,121,32,115,105,122,101,58,32,122, - 30,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, - 101,99,116,111,114,121,32,111,102,102,115,101,116,58,32,122, - 38,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, - 101,99,116,111,114,121,32,115,105,122,101,32,111,114,32,111, - 102,102,115,101,116,58,32,233,46,0,0,0,250,27,69,79, - 70,32,114,101,97,100,32,119,104,101,114,101,32,110,111,116, - 32,101,120,112,101,99,116,101,100,115,4,0,0,0,80,75, - 1,2,233,8,0,0,0,233,10,0,0,0,233,14,0,0, - 0,233,24,0,0,0,233,28,0,0,0,233,30,0,0,0, - 233,32,0,0,0,233,34,0,0,0,233,42,0,0,0,122, - 25,98,97,100,32,108,111,99,97,108,32,104,101,97,100,101, - 114,32,111,102,102,115,101,116,58,32,105,0,8,0,0,218, - 5,97,115,99,105,105,90,6,108,97,116,105,110,49,250,1, - 47,114,5,0,0,0,122,33,122,105,112,105,109,112,111,114, - 116,58,32,102,111,117,110,100,32,123,125,32,110,97,109,101, - 115,32,105,110,32,123,33,114,125,41,26,218,3,95,105,111, - 218,9,111,112,101,110,95,99,111,100,101,114,22,0,0,0, - 114,3,0,0,0,218,4,115,101,101,107,218,20,69,78,68, - 95,67,69,78,84,82,65,76,95,68,73,82,95,83,73,90, - 69,90,4,116,101,108,108,218,4,114,101,97,100,114,55,0, - 0,0,218,18,83,84,82,73,78,71,95,69,78,68,95,65, - 82,67,72,73,86,69,218,3,109,97,120,218,15,77,65,88, - 95,67,79,77,77,69,78,84,95,76,69,78,218,5,114,102, - 105,110,100,114,2,0,0,0,218,8,69,79,70,69,114,114, - 111,114,114,1,0,0,0,114,65,0,0,0,218,18,85,110, - 105,99,111,100,101,68,101,99,111,100,101,69,114,114,111,114, - 218,9,116,114,97,110,115,108,97,116,101,218,11,99,112,52, - 51,55,95,116,97,98,108,101,114,19,0,0,0,114,20,0, - 0,0,114,21,0,0,0,114,30,0,0,0,114,45,0,0, - 0,114,78,0,0,0,41,26,114,29,0,0,0,218,2,102, - 112,90,15,104,101,97,100,101,114,95,112,111,115,105,116,105, - 111,110,218,6,98,117,102,102,101,114,218,9,102,105,108,101, - 95,115,105,122,101,90,17,109,97,120,95,99,111,109,109,101, - 110,116,95,115,116,97,114,116,218,4,100,97,116,97,90,3, - 112,111,115,218,11,104,101,97,100,101,114,95,115,105,122,101, - 90,13,104,101,97,100,101,114,95,111,102,102,115,101,116,90, - 10,97,114,99,95,111,102,102,115,101,116,114,33,0,0,0, - 218,5,99,111,117,110,116,218,5,102,108,97,103,115,218,8, - 99,111,109,112,114,101,115,115,218,4,116,105,109,101,218,4, - 100,97,116,101,218,3,99,114,99,218,9,100,97,116,97,95, - 115,105,122,101,218,9,110,97,109,101,95,115,105,122,101,218, - 10,101,120,116,114,97,95,115,105,122,101,90,12,99,111,109, - 109,101,110,116,95,115,105,122,101,218,11,102,105,108,101,95, - 111,102,102,115,101,116,114,44,0,0,0,114,13,0,0,0, - 218,1,116,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,27,0,0,0,125,1,0,0,115,214,0,0,0, - 2,1,14,1,12,1,20,1,8,2,2,1,14,1,8,1, - 14,1,12,1,20,1,12,1,18,1,18,1,2,3,12,1, - 12,1,12,1,10,1,2,1,8,255,8,2,2,1,2,255, - 2,1,4,255,2,2,10,1,12,1,14,1,10,1,2,1, - 8,255,10,2,10,1,10,1,2,1,6,255,16,2,14,1, - 10,1,2,1,6,255,16,2,16,2,16,1,10,1,18,1, - 10,1,18,1,8,1,8,1,10,1,18,1,4,2,4,2, - 2,1,14,1,14,1,20,1,10,2,14,1,8,1,18,2, - 4,1,14,1,8,1,16,1,16,1,16,1,16,1,16,1, - 16,1,16,1,16,1,16,1,16,1,16,1,12,1,10,1, - 18,1,8,1,2,2,14,1,14,1,20,1,14,1,18,1, - 2,4,28,1,22,1,14,1,20,1,10,2,10,2,2,3, - 14,1,14,1,22,1,12,2,12,1,20,1,8,1,44,1, - 14,1,4,1,255,128,114,27,0,0,0,117,190,1,0,0, - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, - 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, - 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, - 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, - 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, - 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, - 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, - 195,135,195,188,195,169,195,162,195,164,195,160,195,165,195,167, - 195,170,195,171,195,168,195,175,195,174,195,172,195,132,195,133, - 195,137,195,166,195,134,195,180,195,182,195,178,195,187,195,185, - 195,191,195,150,195,156,194,162,194,163,194,165,226,130,167,198, - 146,195,161,195,173,195,179,195,186,195,177,195,145,194,170,194, - 186,194,191,226,140,144,194,172,194,189,194,188,194,161,194,171, - 194,187,226,150,145,226,150,146,226,150,147,226,148,130,226,148, - 164,226,149,161,226,149,162,226,149,150,226,149,149,226,149,163, - 226,149,145,226,149,151,226,149,157,226,149,156,226,149,155,226, - 148,144,226,148,148,226,148,180,226,148,172,226,148,156,226,148, - 128,226,148,188,226,149,158,226,149,159,226,149,154,226,149,148, - 226,149,169,226,149,166,226,149,160,226,149,144,226,149,172,226, - 149,167,226,149,168,226,149,164,226,149,165,226,149,153,226,149, - 152,226,149,146,226,149,147,226,149,171,226,149,170,226,148,152, - 226,148,140,226,150,136,226,150,132,226,150,140,226,150,144,226, - 150,128,206,177,195,159,206,147,207,128,206,163,207,131,194,181, - 207,132,206,166,206,152,206,169,206,180,226,136,158,207,134,206, - 181,226,136,169,226,137,161,194,177,226,137,165,226,137,164,226, - 140,160,226,140,161,195,183,226,137,136,194,176,226,136,153,194, - 183,226,136,154,226,129,191,194,178,226,150,160,194,160,99,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8, - 0,0,0,67,0,0,0,115,106,0,0,0,116,0,114,22, - 116,1,160,2,100,1,161,1,1,0,116,3,100,2,131,1, - 130,1,100,3,97,0,122,58,122,16,100,4,100,5,108,4, - 109,5,125,0,1,0,87,0,110,32,4,0,116,6,121,76, - 1,0,1,0,1,0,116,1,160,2,100,1,161,1,1,0, - 116,3,100,2,131,1,130,1,48,0,87,0,100,6,97,0, - 110,6,100,6,97,0,48,0,116,1,160,2,100,7,161,1, - 1,0,124,0,83,0,41,8,78,122,27,122,105,112,105,109, - 112,111,114,116,58,32,122,108,105,98,32,85,78,65,86,65, - 73,76,65,66,76,69,250,41,99,97,110,39,116,32,100,101, - 99,111,109,112,114,101,115,115,32,100,97,116,97,59,32,122, - 108,105,98,32,110,111,116,32,97,118,97,105,108,97,98,108, - 101,84,114,0,0,0,0,169,1,218,10,100,101,99,111,109, - 112,114,101,115,115,70,122,25,122,105,112,105,109,112,111,114, - 116,58,32,122,108,105,98,32,97,118,97,105,108,97,98,108, - 101,41,7,218,15,95,105,109,112,111,114,116,105,110,103,95, - 122,108,105,98,114,45,0,0,0,114,78,0,0,0,114,3, - 0,0,0,90,4,122,108,105,98,114,140,0,0,0,218,9, - 69,120,99,101,112,116,105,111,110,114,139,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,20,95, - 103,101,116,95,100,101,99,111,109,112,114,101,115,115,95,102, - 117,110,99,27,2,0,0,115,26,0,0,0,4,2,10,3, - 8,1,4,2,4,1,16,1,12,1,10,1,12,1,12,2, - 10,2,4,1,255,128,114,143,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,17,0,0,0,9,0,0,0, - 67,0,0,0,115,132,1,0,0,124,1,92,8,125,2,125, - 3,125,4,125,5,125,6,125,7,125,8,125,9,124,4,100, - 1,107,0,114,36,116,0,100,2,131,1,130,1,116,1,160, - 2,124,0,161,1,144,1,143,6,125,10,122,14,124,10,160, - 3,124,6,161,1,1,0,87,0,110,32,4,0,116,4,121, - 96,1,0,1,0,1,0,116,0,100,3,124,0,155,2,157, - 2,124,0,100,4,141,2,130,1,48,0,124,10,160,5,100, - 5,161,1,125,11,116,6,124,11,131,1,100,5,107,3,114, - 128,116,7,100,6,131,1,130,1,124,11,100,0,100,7,133, - 2,25,0,100,8,107,3,114,162,116,0,100,9,124,0,155, - 2,157,2,124,0,100,4,141,2,130,1,116,8,124,11,100, - 10,100,11,133,2,25,0,131,1,125,12,116,8,124,11,100, - 11,100,5,133,2,25,0,131,1,125,13,100,5,124,12,23, - 0,124,13,23,0,125,14,124,6,124,14,55,0,125,6,122, - 14,124,10,160,3,124,6,161,1,1,0,87,0,110,34,4, - 0,116,4,144,1,121,6,1,0,1,0,1,0,116,0,100, - 3,124,0,155,2,157,2,124,0,100,4,141,2,130,1,48, - 0,124,10,160,5,124,4,161,1,125,15,116,6,124,15,131, - 1,124,4,107,3,144,1,114,40,116,4,100,12,131,1,130, - 1,87,0,100,0,4,0,4,0,131,3,1,0,110,18,49, - 0,144,1,115,62,48,0,1,0,1,0,1,0,89,0,1, - 0,124,3,100,1,107,2,144,1,114,86,124,15,83,0,122, - 10,116,9,131,0,125,16,87,0,110,24,4,0,116,10,144, - 1,121,120,1,0,1,0,1,0,116,0,100,13,131,1,130, - 1,48,0,124,16,124,15,100,14,131,2,83,0,41,15,78, - 114,0,0,0,0,122,18,110,101,103,97,116,105,118,101,32, - 100,97,116,97,32,115,105,122,101,114,91,0,0,0,114,12, - 0,0,0,114,103,0,0,0,114,97,0,0,0,114,92,0, - 0,0,115,4,0,0,0,80,75,3,4,122,23,98,97,100, - 32,108,111,99,97,108,32,102,105,108,101,32,104,101,97,100, - 101,114,58,32,233,26,0,0,0,114,102,0,0,0,122,26, - 122,105,112,105,109,112,111,114,116,58,32,99,97,110,39,116, - 32,114,101,97,100,32,100,97,116,97,114,138,0,0,0,105, - 241,255,255,255,41,11,114,3,0,0,0,114,109,0,0,0, - 114,110,0,0,0,114,111,0,0,0,114,22,0,0,0,114, - 113,0,0,0,114,55,0,0,0,114,118,0,0,0,114,1, - 0,0,0,114,143,0,0,0,114,142,0,0,0,41,17,114, - 29,0,0,0,114,58,0,0,0,90,8,100,97,116,97,112, - 97,116,104,114,129,0,0,0,114,133,0,0,0,114,124,0, - 0,0,114,136,0,0,0,114,130,0,0,0,114,131,0,0, - 0,114,132,0,0,0,114,122,0,0,0,114,123,0,0,0, - 114,134,0,0,0,114,135,0,0,0,114,126,0,0,0,90, - 8,114,97,119,95,100,97,116,97,114,140,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,114,56,0, - 0,0,48,2,0,0,115,64,0,0,0,20,1,8,1,8, - 1,14,2,2,2,14,1,12,1,20,1,10,1,12,1,8, - 1,16,2,18,2,16,2,16,1,12,1,8,1,2,1,14, - 1,14,1,20,1,10,1,14,1,40,1,10,2,4,2,2, - 3,10,1,14,1,10,1,10,1,255,128,114,56,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,16,0,0,0,116,0, - 124,0,124,1,24,0,131,1,100,1,107,1,83,0,41,2, - 78,114,5,0,0,0,41,1,218,3,97,98,115,41,2,90, - 2,116,49,90,2,116,50,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,9,95,101,113,95,109,116,105,109, - 101,94,2,0,0,115,4,0,0,0,16,2,255,128,114,146, - 0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,0, - 14,0,0,0,8,0,0,0,67,0,0,0,115,60,1,0, - 0,124,3,124,2,100,1,156,2,125,5,122,18,116,0,160, - 1,124,4,124,3,124,5,161,3,125,6,87,0,110,20,4, - 0,116,2,121,48,1,0,1,0,1,0,89,0,100,0,83, - 0,48,0,124,6,100,2,64,0,100,3,107,3,125,7,124, - 7,114,182,124,6,100,4,64,0,100,3,107,3,125,8,116, - 3,106,4,100,5,107,3,144,1,114,10,124,8,115,106,116, - 3,106,4,100,6,107,2,144,1,114,10,116,5,124,0,124, - 2,131,2,125,9,124,9,100,0,117,1,144,1,114,10,116, - 3,160,6,116,0,106,7,124,9,161,2,125,10,122,20,116, - 0,160,8,124,4,124,10,124,3,124,5,161,4,1,0,87, - 0,110,104,4,0,116,2,121,180,1,0,1,0,1,0,89, - 0,100,0,83,0,48,0,116,9,124,0,124,2,131,2,92, - 2,125,11,125,12,124,11,144,1,114,10,116,10,116,11,124, - 4,100,7,100,8,133,2,25,0,131,1,124,11,131,2,114, - 246,116,11,124,4,100,8,100,9,133,2,25,0,131,1,124, - 12,107,3,144,1,114,10,116,12,160,13,100,10,124,3,155, - 2,157,2,161,1,1,0,100,0,83,0,116,14,160,15,124, - 4,100,9,100,0,133,2,25,0,161,1,125,13,116,16,124, - 13,116,17,131,2,144,1,115,56,116,18,100,11,124,1,155, - 2,100,12,157,3,131,1,130,1,124,13,83,0,41,13,78, - 41,2,114,44,0,0,0,114,13,0,0,0,114,5,0,0, - 0,114,0,0,0,0,114,85,0,0,0,90,5,110,101,118, - 101,114,90,6,97,108,119,97,121,115,114,98,0,0,0,114, - 93,0,0,0,114,94,0,0,0,122,22,98,121,116,101,99, - 111,100,101,32,105,115,32,115,116,97,108,101,32,102,111,114, - 32,122,16,99,111,109,112,105,108,101,100,32,109,111,100,117, - 108,101,32,122,21,32,105,115,32,110,111,116,32,97,32,99, - 111,100,101,32,111,98,106,101,99,116,41,19,114,21,0,0, - 0,90,13,95,99,108,97,115,115,105,102,121,95,112,121,99, - 114,77,0,0,0,218,4,95,105,109,112,90,21,99,104,101, - 99,107,95,104,97,115,104,95,98,97,115,101,100,95,112,121, - 99,115,218,15,95,103,101,116,95,112,121,99,95,115,111,117, - 114,99,101,218,11,115,111,117,114,99,101,95,104,97,115,104, - 90,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, - 66,69,82,90,18,95,118,97,108,105,100,97,116,101,95,104, - 97,115,104,95,112,121,99,218,29,95,103,101,116,95,109,116, - 105,109,101,95,97,110,100,95,115,105,122,101,95,111,102,95, - 115,111,117,114,99,101,114,146,0,0,0,114,2,0,0,0, - 114,45,0,0,0,114,78,0,0,0,218,7,109,97,114,115, - 104,97,108,90,5,108,111,97,100,115,114,15,0,0,0,218, - 10,95,99,111,100,101,95,116,121,112,101,218,9,84,121,112, - 101,69,114,114,111,114,41,14,114,32,0,0,0,114,57,0, - 0,0,114,66,0,0,0,114,38,0,0,0,114,125,0,0, - 0,90,11,101,120,99,95,100,101,116,97,105,108,115,114,128, - 0,0,0,90,10,104,97,115,104,95,98,97,115,101,100,90, - 12,99,104,101,99,107,95,115,111,117,114,99,101,90,12,115, - 111,117,114,99,101,95,98,121,116,101,115,114,149,0,0,0, - 90,12,115,111,117,114,99,101,95,109,116,105,109,101,90,11, - 115,111,117,114,99,101,95,115,105,122,101,114,50,0,0,0, + 0,100,2,141,2,130,1,48,0,124,6,160,12,116,9,161, + 1,125,7,124,7,100,6,107,0,144,1,114,90,116,3,100, + 7,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124, + 6,124,7,124,7,116,5,23,0,133,2,25,0,125,3,116, + 8,124,3,131,1,116,5,107,3,144,1,114,138,116,3,100, + 8,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124, + 4,116,8,124,6,131,1,24,0,124,7,23,0,125,2,116, + 13,124,3,100,9,100,10,133,2,25,0,131,1,125,8,116, + 13,124,3,100,10,100,11,133,2,25,0,131,1,125,9,124, + 2,124,8,107,0,144,1,114,214,116,3,100,12,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,124,2,124,9,107, + 0,144,1,114,242,116,3,100,13,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,124,2,124,8,56,0,125,2,124, + 2,124,9,24,0,125,10,124,10,100,6,107,0,144,2,114, + 30,116,3,100,14,124,0,155,2,157,2,124,0,100,2,141, + 2,130,1,105,0,125,11,100,6,125,12,122,14,124,1,160, + 4,124,2,161,1,1,0,87,0,110,34,4,0,116,2,144, + 2,121,86,1,0,1,0,1,0,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,48,0,124,1,160, + 7,100,15,161,1,125,3,116,8,124,3,131,1,100,5,107, + 0,144,2,114,120,116,14,100,16,131,1,130,1,124,3,100, + 0,100,5,133,2,25,0,100,17,107,3,144,2,114,142,144, + 4,113,180,116,8,124,3,131,1,100,15,107,3,144,2,114, + 164,116,14,100,16,131,1,130,1,116,15,124,3,100,18,100, + 19,133,2,25,0,131,1,125,13,116,15,124,3,100,19,100, + 9,133,2,25,0,131,1,125,14,116,15,124,3,100,9,100, + 20,133,2,25,0,131,1,125,15,116,15,124,3,100,20,100, + 10,133,2,25,0,131,1,125,16,116,13,124,3,100,10,100, + 11,133,2,25,0,131,1,125,17,116,13,124,3,100,11,100, + 21,133,2,25,0,131,1,125,18,116,13,124,3,100,21,100, + 22,133,2,25,0,131,1,125,4,116,15,124,3,100,22,100, + 23,133,2,25,0,131,1,125,19,116,15,124,3,100,23,100, + 24,133,2,25,0,131,1,125,20,116,15,124,3,100,24,100, + 25,133,2,25,0,131,1,125,21,116,13,124,3,100,26,100, + 15,133,2,25,0,131,1,125,22,124,19,124,20,23,0,124, + 21,23,0,125,8,124,22,124,9,107,4,144,3,114,124,116, + 3,100,27,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,124,22,124,10,55,0,125,22,122,14,124,1,160,7,124, + 19,161,1,125,23,87,0,110,34,4,0,116,2,144,3,121, + 180,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,48,0,116,8,124,23,131, + 1,124,19,107,3,144,3,114,214,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,122,50,116,8,124, + 1,160,7,124,8,124,19,24,0,161,1,131,1,124,8,124, + 19,24,0,107,3,144,4,114,6,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,87,0,110,34,4, + 0,116,2,144,4,121,42,1,0,1,0,1,0,116,3,100, + 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,48, + 0,124,13,100,28,64,0,144,4,114,64,124,23,160,16,161, + 0,125,23,110,52,122,14,124,23,160,16,100,29,161,1,125, + 23,87,0,110,36,4,0,116,17,144,4,121,114,1,0,1, + 0,1,0,124,23,160,16,100,30,161,1,160,18,116,19,161, + 1,125,23,89,0,110,2,48,0,124,23,160,20,100,31,116, + 21,161,2,125,23,116,22,160,23,124,0,124,23,161,2,125, + 24,124,24,124,14,124,18,124,4,124,22,124,15,124,16,124, + 17,102,8,125,25,124,25,124,11,124,23,60,0,124,12,100, + 32,55,0,125,12,144,2,113,88,87,0,100,0,4,0,4, + 0,131,3,1,0,110,18,49,0,144,4,115,202,48,0,1, + 0,1,0,1,0,89,0,1,0,116,24,160,25,100,33,124, + 12,124,0,161,3,1,0,124,11,83,0,41,34,78,122,21, + 99,97,110,39,116,32,111,112,101,110,32,90,105,112,32,102, + 105,108,101,58,32,114,12,0,0,0,114,85,0,0,0,250, + 21,99,97,110,39,116,32,114,101,97,100,32,90,105,112,32, + 102,105,108,101,58,32,233,4,0,0,0,114,0,0,0,0, + 122,16,110,111,116,32,97,32,90,105,112,32,102,105,108,101, + 58,32,122,18,99,111,114,114,117,112,116,32,90,105,112,32, + 102,105,108,101,58,32,233,12,0,0,0,233,16,0,0,0, + 233,20,0,0,0,122,28,98,97,100,32,99,101,110,116,114, + 97,108,32,100,105,114,101,99,116,111,114,121,32,115,105,122, + 101,58,32,122,30,98,97,100,32,99,101,110,116,114,97,108, + 32,100,105,114,101,99,116,111,114,121,32,111,102,102,115,101, + 116,58,32,122,38,98,97,100,32,99,101,110,116,114,97,108, + 32,100,105,114,101,99,116,111,114,121,32,115,105,122,101,32, + 111,114,32,111,102,102,115,101,116,58,32,233,46,0,0,0, + 250,27,69,79,70,32,114,101,97,100,32,119,104,101,114,101, + 32,110,111,116,32,101,120,112,101,99,116,101,100,115,4,0, + 0,0,80,75,1,2,233,8,0,0,0,233,10,0,0,0, + 233,14,0,0,0,233,24,0,0,0,233,28,0,0,0,233, + 30,0,0,0,233,32,0,0,0,233,34,0,0,0,233,42, + 0,0,0,122,25,98,97,100,32,108,111,99,97,108,32,104, + 101,97,100,101,114,32,111,102,102,115,101,116,58,32,105,0, + 8,0,0,218,5,97,115,99,105,105,90,6,108,97,116,105, + 110,49,250,1,47,114,5,0,0,0,122,33,122,105,112,105, + 109,112,111,114,116,58,32,102,111,117,110,100,32,123,125,32, + 110,97,109,101,115,32,105,110,32,123,33,114,125,41,26,218, + 3,95,105,111,218,9,111,112,101,110,95,99,111,100,101,114, + 22,0,0,0,114,3,0,0,0,218,4,115,101,101,107,218, + 20,69,78,68,95,67,69,78,84,82,65,76,95,68,73,82, + 95,83,73,90,69,90,4,116,101,108,108,218,4,114,101,97, + 100,114,55,0,0,0,218,18,83,84,82,73,78,71,95,69, + 78,68,95,65,82,67,72,73,86,69,218,3,109,97,120,218, + 15,77,65,88,95,67,79,77,77,69,78,84,95,76,69,78, + 218,5,114,102,105,110,100,114,2,0,0,0,218,8,69,79, + 70,69,114,114,111,114,114,1,0,0,0,114,65,0,0,0, + 218,18,85,110,105,99,111,100,101,68,101,99,111,100,101,69, + 114,114,111,114,218,9,116,114,97,110,115,108,97,116,101,218, + 11,99,112,52,51,55,95,116,97,98,108,101,114,19,0,0, + 0,114,20,0,0,0,114,21,0,0,0,114,30,0,0,0, + 114,45,0,0,0,114,78,0,0,0,41,26,114,29,0,0, + 0,218,2,102,112,90,15,104,101,97,100,101,114,95,112,111, + 115,105,116,105,111,110,218,6,98,117,102,102,101,114,218,9, + 102,105,108,101,95,115,105,122,101,90,17,109,97,120,95,99, + 111,109,109,101,110,116,95,115,116,97,114,116,218,4,100,97, + 116,97,90,3,112,111,115,218,11,104,101,97,100,101,114,95, + 115,105,122,101,90,13,104,101,97,100,101,114,95,111,102,102, + 115,101,116,90,10,97,114,99,95,111,102,102,115,101,116,114, + 33,0,0,0,218,5,99,111,117,110,116,218,5,102,108,97, + 103,115,218,8,99,111,109,112,114,101,115,115,218,4,116,105, + 109,101,218,4,100,97,116,101,218,3,99,114,99,218,9,100, + 97,116,97,95,115,105,122,101,218,9,110,97,109,101,95,115, + 105,122,101,218,10,101,120,116,114,97,95,115,105,122,101,90, + 12,99,111,109,109,101,110,116,95,115,105,122,101,218,11,102, + 105,108,101,95,111,102,102,115,101,116,114,44,0,0,0,114, + 13,0,0,0,218,1,116,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,114,27,0,0,0,125,1,0,0,115, + 214,0,0,0,2,1,14,1,12,1,20,1,8,2,2,1, + 14,1,8,1,14,1,12,1,20,1,12,1,18,1,18,1, + 2,3,12,1,12,1,12,1,10,1,2,1,8,255,8,2, + 2,1,2,255,2,1,4,255,2,2,10,1,12,1,14,1, + 10,1,2,1,8,255,10,2,10,1,10,1,2,1,6,255, + 16,2,14,1,10,1,2,1,6,255,16,2,16,2,16,1, + 10,1,18,1,10,1,18,1,8,1,8,1,10,1,18,1, + 4,2,4,2,2,1,14,1,14,1,20,1,10,2,14,1, + 8,1,18,2,4,1,14,1,8,1,16,1,16,1,16,1, + 16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1, + 12,1,10,1,18,1,8,1,2,2,14,1,14,1,20,1, + 14,1,18,1,2,4,28,1,22,1,14,1,20,1,10,2, + 10,2,2,3,14,1,14,1,22,1,12,2,12,1,20,1, + 8,1,44,1,14,1,4,1,255,128,114,27,0,0,0,117, + 190,1,0,0,0,1,2,3,4,5,6,7,8,9,10,11, + 12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27, + 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43, + 44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59, + 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75, + 76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91, + 92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107, + 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123, + 124,125,126,127,195,135,195,188,195,169,195,162,195,164,195,160, + 195,165,195,167,195,170,195,171,195,168,195,175,195,174,195,172, + 195,132,195,133,195,137,195,166,195,134,195,180,195,182,195,178, + 195,187,195,185,195,191,195,150,195,156,194,162,194,163,194,165, + 226,130,167,198,146,195,161,195,173,195,179,195,186,195,177,195, + 145,194,170,194,186,194,191,226,140,144,194,172,194,189,194,188, + 194,161,194,171,194,187,226,150,145,226,150,146,226,150,147,226, + 148,130,226,148,164,226,149,161,226,149,162,226,149,150,226,149, + 149,226,149,163,226,149,145,226,149,151,226,149,157,226,149,156, + 226,149,155,226,148,144,226,148,148,226,148,180,226,148,172,226, + 148,156,226,148,128,226,148,188,226,149,158,226,149,159,226,149, + 154,226,149,148,226,149,169,226,149,166,226,149,160,226,149,144, + 226,149,172,226,149,167,226,149,168,226,149,164,226,149,165,226, + 149,153,226,149,152,226,149,146,226,149,147,226,149,171,226,149, + 170,226,148,152,226,148,140,226,150,136,226,150,132,226,150,140, + 226,150,144,226,150,128,206,177,195,159,206,147,207,128,206,163, + 207,131,194,181,207,132,206,166,206,152,206,169,206,180,226,136, + 158,207,134,206,181,226,136,169,226,137,161,194,177,226,137,165, + 226,137,164,226,140,160,226,140,161,195,183,226,137,136,194,176, + 226,136,153,194,183,226,136,154,226,129,191,194,178,226,150,160, + 194,160,99,0,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,8,0,0,0,67,0,0,0,115,106,0,0,0, + 116,0,114,22,116,1,160,2,100,1,161,1,1,0,116,3, + 100,2,131,1,130,1,100,3,97,0,122,58,122,16,100,4, + 100,5,108,4,109,5,125,0,1,0,87,0,110,32,4,0, + 116,6,121,76,1,0,1,0,1,0,116,1,160,2,100,1, + 161,1,1,0,116,3,100,2,131,1,130,1,48,0,87,0, + 100,6,97,0,110,6,100,6,97,0,48,0,116,1,160,2, + 100,7,161,1,1,0,124,0,83,0,41,8,78,122,27,122, + 105,112,105,109,112,111,114,116,58,32,122,108,105,98,32,85, + 78,65,86,65,73,76,65,66,76,69,250,41,99,97,110,39, + 116,32,100,101,99,111,109,112,114,101,115,115,32,100,97,116, + 97,59,32,122,108,105,98,32,110,111,116,32,97,118,97,105, + 108,97,98,108,101,84,114,0,0,0,0,169,1,218,10,100, + 101,99,111,109,112,114,101,115,115,70,122,25,122,105,112,105, + 109,112,111,114,116,58,32,122,108,105,98,32,97,118,97,105, + 108,97,98,108,101,41,7,218,15,95,105,109,112,111,114,116, + 105,110,103,95,122,108,105,98,114,45,0,0,0,114,78,0, + 0,0,114,3,0,0,0,90,4,122,108,105,98,114,140,0, + 0,0,218,9,69,120,99,101,112,116,105,111,110,114,139,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,20,95,103,101,116,95,100,101,99,111,109,112,114,101, + 115,115,95,102,117,110,99,27,2,0,0,115,26,0,0,0, + 4,2,10,3,8,1,4,2,4,1,16,1,12,1,10,1, + 12,1,12,2,10,2,4,1,255,128,114,143,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0, + 9,0,0,0,67,0,0,0,115,132,1,0,0,124,1,92, + 8,125,2,125,3,125,4,125,5,125,6,125,7,125,8,125, + 9,124,4,100,1,107,0,114,36,116,0,100,2,131,1,130, + 1,116,1,160,2,124,0,161,1,144,1,143,6,125,10,122, + 14,124,10,160,3,124,6,161,1,1,0,87,0,110,32,4, + 0,116,4,121,96,1,0,1,0,1,0,116,0,100,3,124, + 0,155,2,157,2,124,0,100,4,141,2,130,1,48,0,124, + 10,160,5,100,5,161,1,125,11,116,6,124,11,131,1,100, + 5,107,3,114,128,116,7,100,6,131,1,130,1,124,11,100, + 0,100,7,133,2,25,0,100,8,107,3,114,162,116,0,100, + 9,124,0,155,2,157,2,124,0,100,4,141,2,130,1,116, + 8,124,11,100,10,100,11,133,2,25,0,131,1,125,12,116, + 8,124,11,100,11,100,5,133,2,25,0,131,1,125,13,100, + 5,124,12,23,0,124,13,23,0,125,14,124,6,124,14,55, + 0,125,6,122,14,124,10,160,3,124,6,161,1,1,0,87, + 0,110,34,4,0,116,4,144,1,121,6,1,0,1,0,1, + 0,116,0,100,3,124,0,155,2,157,2,124,0,100,4,141, + 2,130,1,48,0,124,10,160,5,124,4,161,1,125,15,116, + 6,124,15,131,1,124,4,107,3,144,1,114,40,116,4,100, + 12,131,1,130,1,87,0,100,0,4,0,4,0,131,3,1, + 0,110,18,49,0,144,1,115,62,48,0,1,0,1,0,1, + 0,89,0,1,0,124,3,100,1,107,2,144,1,114,86,124, + 15,83,0,122,10,116,9,131,0,125,16,87,0,110,24,4, + 0,116,10,144,1,121,120,1,0,1,0,1,0,116,0,100, + 13,131,1,130,1,48,0,124,16,124,15,100,14,131,2,83, + 0,41,15,78,114,0,0,0,0,122,18,110,101,103,97,116, + 105,118,101,32,100,97,116,97,32,115,105,122,101,114,91,0, + 0,0,114,12,0,0,0,114,103,0,0,0,114,97,0,0, + 0,114,92,0,0,0,115,4,0,0,0,80,75,3,4,122, + 23,98,97,100,32,108,111,99,97,108,32,102,105,108,101,32, + 104,101,97,100,101,114,58,32,233,26,0,0,0,114,102,0, + 0,0,122,26,122,105,112,105,109,112,111,114,116,58,32,99, + 97,110,39,116,32,114,101,97,100,32,100,97,116,97,114,138, + 0,0,0,105,241,255,255,255,41,11,114,3,0,0,0,114, + 109,0,0,0,114,110,0,0,0,114,111,0,0,0,114,22, + 0,0,0,114,113,0,0,0,114,55,0,0,0,114,118,0, + 0,0,114,1,0,0,0,114,143,0,0,0,114,142,0,0, + 0,41,17,114,29,0,0,0,114,58,0,0,0,90,8,100, + 97,116,97,112,97,116,104,114,129,0,0,0,114,133,0,0, + 0,114,124,0,0,0,114,136,0,0,0,114,130,0,0,0, + 114,131,0,0,0,114,132,0,0,0,114,122,0,0,0,114, + 123,0,0,0,114,134,0,0,0,114,135,0,0,0,114,126, + 0,0,0,90,8,114,97,119,95,100,97,116,97,114,140,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,56,0,0,0,48,2,0,0,115,64,0,0,0,20, + 1,8,1,8,1,14,2,2,2,14,1,12,1,20,1,10, + 1,12,1,8,1,16,2,18,2,16,2,16,1,12,1,8, + 1,2,1,14,1,14,1,20,1,10,1,14,1,40,1,10, + 2,4,2,2,3,10,1,14,1,10,1,10,1,255,128,114, + 56,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,16,0, + 0,0,116,0,124,0,124,1,24,0,131,1,100,1,107,1, + 83,0,41,2,78,114,5,0,0,0,41,1,218,3,97,98, + 115,41,2,90,2,116,49,90,2,116,50,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,9,95,101,113,95, + 109,116,105,109,101,94,2,0,0,115,4,0,0,0,16,2, + 255,128,114,146,0,0,0,99,5,0,0,0,0,0,0,0, + 0,0,0,0,14,0,0,0,8,0,0,0,67,0,0,0, + 115,60,1,0,0,124,3,124,2,100,1,156,2,125,5,122, + 18,116,0,160,1,124,4,124,3,124,5,161,3,125,6,87, + 0,110,20,4,0,116,2,121,48,1,0,1,0,1,0,89, + 0,100,0,83,0,48,0,124,6,100,2,64,0,100,3,107, + 3,125,7,124,7,114,182,124,6,100,4,64,0,100,3,107, + 3,125,8,116,3,106,4,100,5,107,3,144,1,114,10,124, + 8,115,106,116,3,106,4,100,6,107,2,144,1,114,10,116, + 5,124,0,124,2,131,2,125,9,124,9,100,0,117,1,144, + 1,114,10,116,3,160,6,116,0,106,7,124,9,161,2,125, + 10,122,20,116,0,160,8,124,4,124,10,124,3,124,5,161, + 4,1,0,87,0,110,104,4,0,116,2,121,180,1,0,1, + 0,1,0,89,0,100,0,83,0,48,0,116,9,124,0,124, + 2,131,2,92,2,125,11,125,12,124,11,144,1,114,10,116, + 10,116,11,124,4,100,7,100,8,133,2,25,0,131,1,124, + 11,131,2,114,246,116,11,124,4,100,8,100,9,133,2,25, + 0,131,1,124,12,107,3,144,1,114,10,116,12,160,13,100, + 10,124,3,155,2,157,2,161,1,1,0,100,0,83,0,116, + 14,160,15,124,4,100,9,100,0,133,2,25,0,161,1,125, + 13,116,16,124,13,116,17,131,2,144,1,115,56,116,18,100, + 11,124,1,155,2,100,12,157,3,131,1,130,1,124,13,83, + 0,41,13,78,41,2,114,44,0,0,0,114,13,0,0,0, + 114,5,0,0,0,114,0,0,0,0,114,85,0,0,0,90, + 5,110,101,118,101,114,90,6,97,108,119,97,121,115,114,98, + 0,0,0,114,93,0,0,0,114,94,0,0,0,122,22,98, + 121,116,101,99,111,100,101,32,105,115,32,115,116,97,108,101, + 32,102,111,114,32,122,16,99,111,109,112,105,108,101,100,32, + 109,111,100,117,108,101,32,122,21,32,105,115,32,110,111,116, + 32,97,32,99,111,100,101,32,111,98,106,101,99,116,41,19, + 114,21,0,0,0,90,13,95,99,108,97,115,115,105,102,121, + 95,112,121,99,114,77,0,0,0,218,4,95,105,109,112,90, + 21,99,104,101,99,107,95,104,97,115,104,95,98,97,115,101, + 100,95,112,121,99,115,218,15,95,103,101,116,95,112,121,99, + 95,115,111,117,114,99,101,218,11,115,111,117,114,99,101,95, + 104,97,115,104,90,17,95,82,65,87,95,77,65,71,73,67, + 95,78,85,77,66,69,82,90,18,95,118,97,108,105,100,97, + 116,101,95,104,97,115,104,95,112,121,99,218,29,95,103,101, + 116,95,109,116,105,109,101,95,97,110,100,95,115,105,122,101, + 95,111,102,95,115,111,117,114,99,101,114,146,0,0,0,114, + 2,0,0,0,114,45,0,0,0,114,78,0,0,0,218,7, + 109,97,114,115,104,97,108,90,5,108,111,97,100,115,114,15, + 0,0,0,218,10,95,99,111,100,101,95,116,121,112,101,218, + 9,84,121,112,101,69,114,114,111,114,41,14,114,32,0,0, + 0,114,57,0,0,0,114,66,0,0,0,114,38,0,0,0, + 114,125,0,0,0,90,11,101,120,99,95,100,101,116,97,105, + 108,115,114,128,0,0,0,90,10,104,97,115,104,95,98,97, + 115,101,100,90,12,99,104,101,99,107,95,115,111,117,114,99, + 101,90,12,115,111,117,114,99,101,95,98,121,116,101,115,114, + 149,0,0,0,90,12,115,111,117,114,99,101,95,109,116,105, + 109,101,90,11,115,111,117,114,99,101,95,115,105,122,101,114, + 50,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,15,95,117,110,109,97,114,115,104,97,108,95, + 99,111,100,101,104,2,0,0,115,84,0,0,0,2,2,2, + 1,6,254,2,5,18,1,12,1,8,1,12,2,4,1,12, + 1,12,1,2,1,2,255,8,1,4,255,10,2,10,1,4, + 1,4,1,2,1,4,254,2,5,4,1,8,1,8,255,12, + 2,8,1,8,3,6,255,6,3,22,3,18,1,4,255,4, + 2,8,1,4,255,4,2,18,2,12,1,16,1,4,1,255, + 128,114,154,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, + 28,0,0,0,124,0,160,0,100,1,100,2,161,2,125,0, + 124,0,160,0,100,3,100,2,161,2,125,0,124,0,83,0, + 41,4,78,115,2,0,0,0,13,10,243,1,0,0,0,10, + 243,1,0,0,0,13,41,1,114,19,0,0,0,41,1,218, + 6,115,111,117,114,99,101,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,23,95,110,111,114,109,97,108,105, + 122,101,95,108,105,110,101,95,101,110,100,105,110,103,115,155, + 2,0,0,115,8,0,0,0,12,1,12,1,4,1,255,128, + 114,158,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,6,0,0,0,67,0,0,0,115,24, + 0,0,0,116,0,124,1,131,1,125,1,116,1,124,1,124, + 0,100,1,100,2,100,3,141,4,83,0,41,4,78,114,76, + 0,0,0,84,41,1,90,12,100,111,110,116,95,105,110,104, + 101,114,105,116,41,2,114,158,0,0,0,218,7,99,111,109, + 112,105,108,101,41,2,114,57,0,0,0,114,157,0,0,0, 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 15,95,117,110,109,97,114,115,104,97,108,95,99,111,100,101, - 104,2,0,0,115,84,0,0,0,2,2,2,1,6,254,2, - 5,18,1,12,1,8,1,12,2,4,1,12,1,12,1,2, - 1,2,255,8,1,4,255,10,2,10,1,4,1,4,1,2, - 1,4,254,2,5,4,1,8,1,8,255,12,2,8,1,8, - 3,6,255,6,3,22,3,18,1,4,255,4,2,8,1,4, - 255,4,2,18,2,12,1,16,1,4,1,255,128,114,154,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,4,0,0,0,67,0,0,0,115,28,0,0,0, - 124,0,160,0,100,1,100,2,161,2,125,0,124,0,160,0, - 100,3,100,2,161,2,125,0,124,0,83,0,41,4,78,115, - 2,0,0,0,13,10,243,1,0,0,0,10,243,1,0,0, - 0,13,41,1,114,19,0,0,0,41,1,218,6,115,111,117, - 114,99,101,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,23,95,110,111,114,109,97,108,105,122,101,95,108, - 105,110,101,95,101,110,100,105,110,103,115,155,2,0,0,115, - 8,0,0,0,12,1,12,1,4,1,255,128,114,158,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,6,0,0,0,67,0,0,0,115,24,0,0,0,116, - 0,124,1,131,1,125,1,116,1,124,1,124,0,100,1,100, - 2,100,3,141,4,83,0,41,4,78,114,76,0,0,0,84, - 41,1,90,12,100,111,110,116,95,105,110,104,101,114,105,116, - 41,2,114,158,0,0,0,218,7,99,111,109,112,105,108,101, - 41,2,114,57,0,0,0,114,157,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,15,95,99,111, - 109,112,105,108,101,95,115,111,117,114,99,101,162,2,0,0, - 115,6,0,0,0,8,1,16,1,255,128,114,160,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,11,0,0,0,67,0,0,0,115,68,0,0,0,116,0, - 160,1,124,0,100,1,63,0,100,2,23,0,124,0,100,3, - 63,0,100,4,64,0,124,0,100,5,64,0,124,1,100,6, - 63,0,124,1,100,3,63,0,100,7,64,0,124,1,100,5, - 64,0,100,8,20,0,100,9,100,9,100,9,102,9,161,1, - 83,0,41,10,78,233,9,0,0,0,105,188,7,0,0,233, - 5,0,0,0,233,15,0,0,0,233,31,0,0,0,233,11, - 0,0,0,233,63,0,0,0,114,85,0,0,0,114,14,0, - 0,0,41,2,114,130,0,0,0,90,6,109,107,116,105,109, - 101,41,2,218,1,100,114,137,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,14,95,112,97,114, - 115,101,95,100,111,115,116,105,109,101,168,2,0,0,115,20, - 0,0,0,4,1,10,1,10,1,6,1,6,1,10,1,10, - 1,6,1,6,249,255,128,114,168,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,10,0,0, - 0,67,0,0,0,115,110,0,0,0,122,82,124,1,100,1, - 100,0,133,2,25,0,100,2,118,0,115,22,74,0,130,1, - 124,1,100,0,100,1,133,2,25,0,125,1,124,0,106,0, - 124,1,25,0,125,2,124,2,100,3,25,0,125,3,124,2, - 100,4,25,0,125,4,124,2,100,5,25,0,125,5,116,1, - 124,4,124,3,131,2,124,5,102,2,87,0,83,0,4,0, - 116,2,116,3,116,4,102,3,121,108,1,0,1,0,1,0, - 89,0,100,6,83,0,48,0,41,7,78,114,14,0,0,0, - 169,2,218,1,99,218,1,111,114,162,0,0,0,233,6,0, - 0,0,233,3,0,0,0,41,2,114,0,0,0,0,114,0, - 0,0,0,41,5,114,28,0,0,0,114,168,0,0,0,114, - 26,0,0,0,218,10,73,110,100,101,120,69,114,114,111,114, - 114,153,0,0,0,41,6,114,32,0,0,0,114,13,0,0, - 0,114,58,0,0,0,114,130,0,0,0,114,131,0,0,0, - 90,17,117,110,99,111,109,112,114,101,115,115,101,100,95,115, - 105,122,101,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,150,0,0,0,181,2,0,0,115,22,0,0,0, - 2,1,20,2,12,1,10,1,8,3,8,1,8,1,16,1, - 18,1,8,1,255,128,114,150,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0, - 67,0,0,0,115,80,0,0,0,124,1,100,1,100,0,133, - 2,25,0,100,2,118,0,115,20,74,0,130,1,124,1,100, - 0,100,1,133,2,25,0,125,1,122,14,124,0,106,0,124, - 1,25,0,125,2,87,0,110,20,4,0,116,1,121,66,1, - 0,1,0,1,0,89,0,100,0,83,0,48,0,116,2,124, - 0,106,3,124,2,131,2,83,0,41,3,78,114,14,0,0, - 0,114,169,0,0,0,41,4,114,28,0,0,0,114,26,0, - 0,0,114,56,0,0,0,114,29,0,0,0,41,3,114,32, - 0,0,0,114,13,0,0,0,114,58,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,114,148,0,0, - 0,200,2,0,0,115,16,0,0,0,20,2,12,1,2,2, - 14,1,12,1,8,1,12,2,255,128,114,148,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0, - 9,0,0,0,67,0,0,0,115,190,0,0,0,116,0,124, - 0,124,1,131,2,125,2,116,1,68,0,93,156,92,3,125, - 3,125,4,125,5,124,2,124,3,23,0,125,6,116,2,106, - 3,100,1,124,0,106,4,116,5,124,6,100,2,100,3,141, - 5,1,0,122,14,124,0,106,6,124,6,25,0,125,7,87, - 0,110,18,4,0,116,7,121,86,1,0,1,0,1,0,89, - 0,113,14,48,0,124,7,100,4,25,0,125,8,116,8,124, - 0,106,4,124,7,131,2,125,9,124,4,114,130,116,9,124, - 0,124,8,124,6,124,1,124,9,131,5,125,10,110,10,116, - 10,124,8,124,9,131,2,125,10,124,10,100,0,117,0,114, - 150,113,14,124,7,100,4,25,0,125,8,124,10,124,5,124, - 8,102,3,2,0,1,0,83,0,116,11,100,5,124,1,155, - 2,157,2,124,1,100,6,141,2,130,1,41,7,78,122,13, - 116,114,121,105,110,103,32,123,125,123,125,123,125,114,85,0, - 0,0,41,1,90,9,118,101,114,98,111,115,105,116,121,114, - 0,0,0,0,114,61,0,0,0,114,62,0,0,0,41,12, - 114,36,0,0,0,114,88,0,0,0,114,45,0,0,0,114, - 78,0,0,0,114,29,0,0,0,114,20,0,0,0,114,28, - 0,0,0,114,26,0,0,0,114,56,0,0,0,114,154,0, - 0,0,114,160,0,0,0,114,3,0,0,0,41,11,114,32, - 0,0,0,114,38,0,0,0,114,13,0,0,0,114,89,0, - 0,0,114,90,0,0,0,114,51,0,0,0,114,66,0,0, - 0,114,58,0,0,0,114,40,0,0,0,114,125,0,0,0, - 114,50,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,48,0,0,0,215,2,0,0,115,38,0, - 0,0,10,1,14,1,8,1,22,1,2,1,14,1,12,1, - 6,1,8,2,12,1,4,1,18,1,10,2,8,1,2,3, - 8,1,14,1,18,2,255,128,114,48,0,0,0,41,45,114, - 83,0,0,0,90,26,95,102,114,111,122,101,110,95,105,109, - 112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108, - 114,21,0,0,0,114,1,0,0,0,114,2,0,0,0,90, - 17,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, - 105,98,114,45,0,0,0,114,147,0,0,0,114,109,0,0, - 0,114,151,0,0,0,114,69,0,0,0,114,130,0,0,0, - 90,7,95,95,97,108,108,95,95,114,20,0,0,0,90,15, - 112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,114, - 18,0,0,0,114,77,0,0,0,114,3,0,0,0,114,25, - 0,0,0,218,4,116,121,112,101,114,72,0,0,0,114,112, - 0,0,0,114,114,0,0,0,114,116,0,0,0,90,13,95, - 76,111,97,100,101,114,66,97,115,105,99,115,114,4,0,0, - 0,114,88,0,0,0,114,36,0,0,0,114,37,0,0,0, - 114,35,0,0,0,114,27,0,0,0,114,121,0,0,0,114, - 141,0,0,0,114,143,0,0,0,114,56,0,0,0,114,146, - 0,0,0,114,154,0,0,0,218,8,95,95,99,111,100,101, - 95,95,114,152,0,0,0,114,158,0,0,0,114,160,0,0, - 0,114,168,0,0,0,114,150,0,0,0,114,148,0,0,0, - 114,48,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,8,60,109,111,100,117, - 108,101,62,1,0,0,0,115,92,0,0,0,4,0,8,16, - 16,1,8,1,8,1,8,1,8,1,8,1,8,1,8,2, - 6,3,14,1,16,3,4,4,8,2,4,2,4,1,4,1, - 18,2,0,127,0,127,12,30,12,1,2,1,2,1,4,252, - 8,9,8,4,8,9,8,31,2,126,2,254,4,29,8,5, - 8,21,8,46,8,10,10,46,8,5,8,7,8,6,8,13, - 8,19,8,15,4,128,255,128, + 15,95,99,111,109,112,105,108,101,95,115,111,117,114,99,101, + 162,2,0,0,115,6,0,0,0,8,1,16,1,255,128,114, + 160,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,11,0,0,0,67,0,0,0,115,68,0, + 0,0,116,0,160,1,124,0,100,1,63,0,100,2,23,0, + 124,0,100,3,63,0,100,4,64,0,124,0,100,5,64,0, + 124,1,100,6,63,0,124,1,100,3,63,0,100,7,64,0, + 124,1,100,5,64,0,100,8,20,0,100,9,100,9,100,9, + 102,9,161,1,83,0,41,10,78,233,9,0,0,0,105,188, + 7,0,0,233,5,0,0,0,233,15,0,0,0,233,31,0, + 0,0,233,11,0,0,0,233,63,0,0,0,114,85,0,0, + 0,114,14,0,0,0,41,2,114,130,0,0,0,90,6,109, + 107,116,105,109,101,41,2,218,1,100,114,137,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,14, + 95,112,97,114,115,101,95,100,111,115,116,105,109,101,168,2, + 0,0,115,20,0,0,0,4,1,10,1,10,1,6,1,6, + 1,10,1,10,1,6,1,6,249,255,128,114,168,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,10,0,0,0,67,0,0,0,115,110,0,0,0,122,82, + 124,1,100,1,100,0,133,2,25,0,100,2,118,0,115,22, + 74,0,130,1,124,1,100,0,100,1,133,2,25,0,125,1, + 124,0,106,0,124,1,25,0,125,2,124,2,100,3,25,0, + 125,3,124,2,100,4,25,0,125,4,124,2,100,5,25,0, + 125,5,116,1,124,4,124,3,131,2,124,5,102,2,87,0, + 83,0,4,0,116,2,116,3,116,4,102,3,121,108,1,0, + 1,0,1,0,89,0,100,6,83,0,48,0,41,7,78,114, + 14,0,0,0,169,2,218,1,99,218,1,111,114,162,0,0, + 0,233,6,0,0,0,233,3,0,0,0,41,2,114,0,0, + 0,0,114,0,0,0,0,41,5,114,28,0,0,0,114,168, + 0,0,0,114,26,0,0,0,218,10,73,110,100,101,120,69, + 114,114,111,114,114,153,0,0,0,41,6,114,32,0,0,0, + 114,13,0,0,0,114,58,0,0,0,114,130,0,0,0,114, + 131,0,0,0,90,17,117,110,99,111,109,112,114,101,115,115, + 101,100,95,115,105,122,101,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,114,150,0,0,0,181,2,0,0,115, + 22,0,0,0,2,1,20,2,12,1,10,1,8,3,8,1, + 8,1,16,1,18,1,8,1,255,128,114,150,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 8,0,0,0,67,0,0,0,115,80,0,0,0,124,1,100, + 1,100,0,133,2,25,0,100,2,118,0,115,20,74,0,130, + 1,124,1,100,0,100,1,133,2,25,0,125,1,122,14,124, + 0,106,0,124,1,25,0,125,2,87,0,110,20,4,0,116, + 1,121,66,1,0,1,0,1,0,89,0,100,0,83,0,48, + 0,116,2,124,0,106,3,124,2,131,2,83,0,41,3,78, + 114,14,0,0,0,114,169,0,0,0,41,4,114,28,0,0, + 0,114,26,0,0,0,114,56,0,0,0,114,29,0,0,0, + 41,3,114,32,0,0,0,114,13,0,0,0,114,58,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,148,0,0,0,200,2,0,0,115,16,0,0,0,20,2, + 12,1,2,2,14,1,12,1,8,1,12,2,255,128,114,148, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 11,0,0,0,9,0,0,0,67,0,0,0,115,190,0,0, + 0,116,0,124,0,124,1,131,2,125,2,116,1,68,0,93, + 156,92,3,125,3,125,4,125,5,124,2,124,3,23,0,125, + 6,116,2,106,3,100,1,124,0,106,4,116,5,124,6,100, + 2,100,3,141,5,1,0,122,14,124,0,106,6,124,6,25, + 0,125,7,87,0,110,18,4,0,116,7,121,86,1,0,1, + 0,1,0,89,0,113,14,48,0,124,7,100,4,25,0,125, + 8,116,8,124,0,106,4,124,7,131,2,125,9,124,4,114, + 130,116,9,124,0,124,8,124,6,124,1,124,9,131,5,125, + 10,110,10,116,10,124,8,124,9,131,2,125,10,124,10,100, + 0,117,0,114,150,113,14,124,7,100,4,25,0,125,8,124, + 10,124,5,124,8,102,3,2,0,1,0,83,0,116,11,100, + 5,124,1,155,2,157,2,124,1,100,6,141,2,130,1,41, + 7,78,122,13,116,114,121,105,110,103,32,123,125,123,125,123, + 125,114,85,0,0,0,41,1,90,9,118,101,114,98,111,115, + 105,116,121,114,0,0,0,0,114,61,0,0,0,114,62,0, + 0,0,41,12,114,36,0,0,0,114,88,0,0,0,114,45, + 0,0,0,114,78,0,0,0,114,29,0,0,0,114,20,0, + 0,0,114,28,0,0,0,114,26,0,0,0,114,56,0,0, + 0,114,154,0,0,0,114,160,0,0,0,114,3,0,0,0, + 41,11,114,32,0,0,0,114,38,0,0,0,114,13,0,0, + 0,114,89,0,0,0,114,90,0,0,0,114,51,0,0,0, + 114,66,0,0,0,114,58,0,0,0,114,40,0,0,0,114, + 125,0,0,0,114,50,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,48,0,0,0,215,2,0, + 0,115,38,0,0,0,10,1,14,1,8,1,22,1,2,1, + 14,1,12,1,6,1,8,2,12,1,4,1,18,1,10,2, + 8,1,2,3,8,1,14,1,18,2,255,128,114,48,0,0, + 0,41,45,114,83,0,0,0,90,26,95,102,114,111,122,101, + 110,95,105,109,112,111,114,116,108,105,98,95,101,120,116,101, + 114,110,97,108,114,21,0,0,0,114,1,0,0,0,114,2, + 0,0,0,90,17,95,102,114,111,122,101,110,95,105,109,112, + 111,114,116,108,105,98,114,45,0,0,0,114,147,0,0,0, + 114,109,0,0,0,114,151,0,0,0,114,69,0,0,0,114, + 130,0,0,0,90,7,95,95,97,108,108,95,95,114,20,0, + 0,0,90,15,112,97,116,104,95,115,101,112,97,114,97,116, + 111,114,115,114,18,0,0,0,114,77,0,0,0,114,3,0, + 0,0,114,25,0,0,0,218,4,116,121,112,101,114,72,0, + 0,0,114,112,0,0,0,114,114,0,0,0,114,116,0,0, + 0,90,13,95,76,111,97,100,101,114,66,97,115,105,99,115, + 114,4,0,0,0,114,88,0,0,0,114,36,0,0,0,114, + 37,0,0,0,114,35,0,0,0,114,27,0,0,0,114,121, + 0,0,0,114,141,0,0,0,114,143,0,0,0,114,56,0, + 0,0,114,146,0,0,0,114,154,0,0,0,218,8,95,95, + 99,111,100,101,95,95,114,152,0,0,0,114,158,0,0,0, + 114,160,0,0,0,114,168,0,0,0,114,150,0,0,0,114, + 148,0,0,0,114,48,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,8,60, + 109,111,100,117,108,101,62,1,0,0,0,115,90,0,0,0, + 4,0,8,16,16,1,8,1,8,1,8,1,8,1,8,1, + 8,1,8,2,6,3,14,1,16,3,4,4,8,2,4,2, + 4,1,4,1,18,2,0,127,0,127,12,30,12,1,2,1, + 2,1,4,252,8,9,8,4,8,9,8,31,2,126,2,254, + 4,29,8,5,8,21,8,46,8,10,10,46,8,5,8,7, + 8,6,8,13,8,19,12,15,255,128, }; From e76585f895d2d2bc612275cd97b363cfcfb61420 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 2 Dec 2020 17:56:17 +0000 Subject: [PATCH 0705/1261] bpo-42521: Add note about 'Python -d' only working on debug builds (GH-23607) --- Python/initconfig.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Python/initconfig.c b/Python/initconfig.c index 4d95ac5d8859b1..62087fb4208dd4 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -38,7 +38,8 @@ Options and arguments (and corresponding environment variables):\n\ and comparing bytes/bytearray with str. (-bb: issue errors)\n\ -B : don't write .pyc 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\ +-d : turn on parser debugging output (for experts only, only works on\n\ + debug builds); also PYTHONDEBUG=x\n\ -E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ -h : print this help message and exit (also --help)\n\ "; From 3a0619a3ce92b5e407a2ef85895bff4ed1f51705 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 2 Dec 2020 17:57:18 +0000 Subject: [PATCH 0706/1261] bpo-41625: Do not add os.splice on AIX due to compatibility issues (GH-23608) --- Modules/clinic/posixmodule.c.h | 6 +++--- Modules/posixmodule.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index ee4ee8ceac5580..4a72ea0dd56f43 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -5674,7 +5674,7 @@ os_copy_file_range(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py #endif /* defined(HAVE_COPY_FILE_RANGE) */ -#if defined(HAVE_SPLICE) +#if ((defined(HAVE_SPLICE) && !defined(_AIX))) PyDoc_STRVAR(os_splice__doc__, "splice($module, /, src, dst, count, offset_src=None, offset_dst=None,\n" @@ -5772,7 +5772,7 @@ os_splice(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k return return_value; } -#endif /* defined(HAVE_SPLICE) */ +#endif /* ((defined(HAVE_SPLICE) && !defined(_AIX))) */ #if defined(HAVE_MKFIFO) @@ -9163,4 +9163,4 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=8a59e91178897267 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=f3ec08afcd6cd8f8 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 3e6e6585b880c0..d9eb62f20e65bd 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -10370,7 +10370,7 @@ os_copy_file_range_impl(PyObject *module, int src, int dst, Py_ssize_t count, } #endif /* HAVE_COPY_FILE_RANGE*/ -#ifdef HAVE_SPLICE +#if (defined(HAVE_SPLICE) && !defined(_AIX)) /*[clinic input] os.splice From 5332fa019255c935819cdc4bc784b245a4289f76 Mon Sep 17 00:00:00 2001 From: FX Coudert Date: Thu, 3 Dec 2020 04:20:18 +0100 Subject: [PATCH 0707/1261] bpo-42504: fix for MACOSX_DEPLOYMENT_TARGET=11 (GH-23556) macOS releases numbering has changed as of macOS 11 Big Sur. Previously, major releases were of the form 10.x, 10.x+1, 10.x+2, etc; as of Big Sur, they are now x, x+1, etc, so, for example, 10.15, 10.15.1, ..., 10.15.7, 11, 11.0.1, 11.1, ..., 12, 12.1, etc. Allow Python to build with single-digit deployment target values. Patch provided by FX Coudert. --- Lib/distutils/spawn.py | 4 ++-- Lib/distutils/tests/test_build_ext.py | 10 +++++++--- Lib/test/test_posix.py | 2 +- .../macOS/2020-12-02-15-48-40.bpo-42504.RQmMOR.rst | 1 + setup.py | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2020-12-02-15-48-40.bpo-42504.RQmMOR.rst diff --git a/Lib/distutils/spawn.py b/Lib/distutils/spawn.py index 0d1bd0391e6f11..f50edd2da97100 100644 --- a/Lib/distutils/spawn.py +++ b/Lib/distutils/spawn.py @@ -54,8 +54,8 @@ def spawn(cmd, search_path=1, verbose=0, dry_run=0): global _cfg_target, _cfg_target_split if _cfg_target is None: from distutils import sysconfig - _cfg_target = sysconfig.get_config_var( - 'MACOSX_DEPLOYMENT_TARGET') or '' + _cfg_target = str(sysconfig.get_config_var( + 'MACOSX_DEPLOYMENT_TARGET') or '') if _cfg_target: _cfg_target_split = [int(x) for x in _cfg_target.split('.')] if _cfg_target: diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py index 6bb009a86f41eb..a3055c19840326 100644 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -456,7 +456,7 @@ def test_deployment_target_higher_ok(self): deptarget = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') if deptarget: # increment the minor version number (i.e. 10.6 -> 10.7) - deptarget = [int(x) for x in deptarget.split('.')] + deptarget = [int(x) for x in str(deptarget).split('.')] deptarget[-1] += 1 deptarget = '.'.join(str(i) for i in deptarget) self._try_compile_deployment_target('<', deptarget) @@ -489,7 +489,7 @@ def _try_compile_deployment_target(self, operator, target): # get the deployment target that the interpreter was built with target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') - target = tuple(map(int, target.split('.')[0:2])) + target = tuple(map(int, str(target).split('.')[0:2])) # format the target value as defined in the Apple # Availability Macros. We can't use the macro names since # at least one value we test with will not exist yet. @@ -498,7 +498,11 @@ def _try_compile_deployment_target(self, operator, target): target = '%02d%01d0' % target else: # for 10.10 and beyond -> "10nn00" - target = '%02d%02d00' % target + if len(target) >= 2: + target = '%02d%02d00' % target + else: + # 11 and later can have no minor version (11 instead of 11.0) + target = '%02d0000' % target deptarget_ext = Extension( 'deptarget', [deptarget_c], diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 18afbef082bffc..d4d348cdc02d09 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1061,7 +1061,7 @@ def test_getgroups(self): if sys.platform == 'darwin': import sysconfig dt = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') or '10.0' - if tuple(int(n) for n in dt.split('.')[0:2]) < (10, 6): + if tuple(int(n) for n in str(dt).split('.')[0:2]) < (10, 6): raise unittest.SkipTest("getgroups(2) is broken prior to 10.6") # 'id -G' and 'os.getgroups()' should return the same diff --git a/Misc/NEWS.d/next/macOS/2020-12-02-15-48-40.bpo-42504.RQmMOR.rst b/Misc/NEWS.d/next/macOS/2020-12-02-15-48-40.bpo-42504.RQmMOR.rst new file mode 100644 index 00000000000000..c83bc2b9eeec5f --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2020-12-02-15-48-40.bpo-42504.RQmMOR.rst @@ -0,0 +1 @@ +Fix build on macOS Big Sur when MACOSX_DEPLOYMENT_TARGET=11 \ No newline at end of file diff --git a/setup.py b/setup.py index b7a7d26c5325bc..0c9a4250168692 100644 --- a/setup.py +++ b/setup.py @@ -1014,7 +1014,7 @@ def detect_readline_curses(self): os_release = int(os.uname()[2].split('.')[0]) dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') if (dep_target and - (tuple(int(n) for n in dep_target.split('.')[0:2]) + (tuple(int(n) for n in str(dep_target).split('.')[0:2]) < (10, 5) ) ): os_release = 8 if os_release < 9: From c56fadcd50d2ad5597b966b84a5f9efbf3c9ddbd Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Wed, 2 Dec 2020 19:48:14 -0800 Subject: [PATCH 0708/1261] Remove the conditional for setting query. (#23604) --- Lib/http/server.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Lib/http/server.py b/Lib/http/server.py index ee991821099135..c611381177d43a 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1092,8 +1092,7 @@ def run_cgi(self): env['PATH_INFO'] = uqrest env['PATH_TRANSLATED'] = self.translate_path(uqrest) env['SCRIPT_NAME'] = scriptname - if query: - env['QUERY_STRING'] = query + env['QUERY_STRING'] = query env['REMOTE_ADDR'] = self.client_address[0] authorization = self.headers.get("authorization") if authorization: From fe44b68ee03bc7a69f3dac8866ef4b93c8b40950 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 3 Dec 2020 10:48:26 +0200 Subject: [PATCH 0709/1261] bpo-42328: Skip some tests with themes vista and xpnative on Windows 7 (GH-23612) --- Lib/tkinter/test/test_ttk/test_style.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Lib/tkinter/test/test_ttk/test_style.py b/Lib/tkinter/test/test_ttk/test_style.py index 54e913311766f1..38d70d7a89077d 100644 --- a/Lib/tkinter/test/test_ttk/test_style.py +++ b/Lib/tkinter/test/test_ttk/test_style.py @@ -1,4 +1,5 @@ import unittest +import sys import tkinter from tkinter import ttk from test import support @@ -136,6 +137,10 @@ def test_configure_custom_copy(self): with self.subTest(theme=theme, name=name): if support.verbose >= 2: print('configure', theme, name, default) + if (theme in ('vista', 'xpnative') + and sys.getwindowsversion()[:2] == (6, 1)): + # Fails on the Windows 7 buildbot + continue newname = f'C.{name}' self.assertEqual(style.configure(newname), None) style.configure(newname, **default) @@ -158,6 +163,10 @@ def test_map_custom_copy(self): with self.subTest(theme=theme, name=name): if support.verbose >= 2: print('map', theme, name, default) + if (theme in ('vista', 'xpnative') + and sys.getwindowsversion()[:2] == (6, 1)): + # Fails on the Windows 7 buildbot + continue newname = f'C.{name}' self.assertEqual(style.map(newname), {}) style.map(newname, **default) From 49d0fb43e5531b587f3fe785162701a507995c6e Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 3 Dec 2020 12:46:16 +0200 Subject: [PATCH 0710/1261] bpo-42431: Fix outdated bytes comments (GH-23458) Also move definitions of internal macros F_LJUST etc to private header. --- Include/bytesobject.h | 35 ++++++++++-------------------- Include/cpython/bytesobject.h | 2 +- Include/internal/pycore_format.h | 27 +++++++++++++++++++++++ Makefile.pre.in | 1 + Objects/bytearrayobject.c | 17 ++++++--------- Objects/bytesobject.c | 30 ++++++++----------------- Objects/clinic/bytearrayobject.c.h | 4 ++-- Objects/clinic/bytesobject.c.h | 4 ++-- Objects/unicodeobject.c | 1 + PCbuild/pythoncore.vcxproj | 1 + PCbuild/pythoncore.vcxproj.filters | 3 +++ 11 files changed, 65 insertions(+), 60 deletions(-) create mode 100644 Include/internal/pycore_format.h diff --git a/Include/bytesobject.h b/Include/bytesobject.h index 5062d8d123ad3e..39c241a2dcf5f7 100644 --- a/Include/bytesobject.h +++ b/Include/bytesobject.h @@ -1,5 +1,5 @@ -/* Bytes (String) object interface */ +/* Bytes object interface */ #ifndef Py_BYTESOBJECT_H #define Py_BYTESOBJECT_H @@ -10,23 +10,20 @@ extern "C" { #include /* -Type PyBytesObject represents a character string. An extra zero byte is +Type PyBytesObject represents a byte string. An extra zero byte is reserved at the end to ensure it is zero-terminated, but a size is present so strings with null bytes in them can be represented. This is an immutable object type. -There are functions to create new string objects, to test -an object for string-ness, and to get the -string value. The latter function returns a null pointer +There are functions to create new bytes objects, to test +an object for bytes-ness, and to get the +byte string value. The latter function returns a null pointer if the object is not of the proper type. There is a variant that takes an explicit size as well as a variant that assumes a zero-terminated string. Note that none of the -functions should be applied to nil objects. +functions should be applied to NULL pointer. */ -/* Caching the hash (ob_shash) saves recalculation of a string's hash value. - This significantly speeds up dict lookups. */ - PyAPI_DATA(PyTypeObject) PyBytes_Type; PyAPI_DATA(PyTypeObject) PyBytesIter_Type; @@ -50,26 +47,16 @@ PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t, const char *, Py_ssize_t, const char *); -/* Provides access to the internal data buffer and size of a string - object or the default encoded version of a Unicode object. Passing - NULL as *len parameter will force the string buffer to be - 0-terminated (passing a string with embedded NULL characters will +/* Provides access to the internal data buffer and size of a bytes object. + Passing NULL as len parameter will force the string buffer to be + 0-terminated (passing a string with embedded NUL characters will cause an exception). */ PyAPI_FUNC(int) PyBytes_AsStringAndSize( - PyObject *obj, /* string or Unicode object */ + PyObject *obj, /* bytes object */ char **s, /* pointer to buffer variable */ - Py_ssize_t *len /* pointer to length variable or NULL - (only possible for 0-terminated - strings) */ + Py_ssize_t *len /* pointer to length variable or NULL */ ); -/* Flags used by string formatting */ -#define F_LJUST (1<<0) -#define F_SIGN (1<<1) -#define F_BLANK (1<<2) -#define F_ALT (1<<3) -#define F_ZERO (1<<4) - #ifndef Py_LIMITED_API # define Py_CPYTHON_BYTESOBJECT_H # include "cpython/bytesobject.h" diff --git a/Include/cpython/bytesobject.h b/Include/cpython/bytesobject.h index f284c5835df099..6b3f55224fc553 100644 --- a/Include/cpython/bytesobject.h +++ b/Include/cpython/bytesobject.h @@ -10,7 +10,7 @@ typedef struct { /* Invariants: * ob_sval contains space for 'ob_size+1' elements. * ob_sval[ob_size] == 0. - * ob_shash is the hash of the string or -1 if not computed yet. + * ob_shash is the hash of the byte string or -1 if not computed yet. */ } PyBytesObject; diff --git a/Include/internal/pycore_format.h b/Include/internal/pycore_format.h new file mode 100644 index 00000000000000..1b8d57539ca505 --- /dev/null +++ b/Include/internal/pycore_format.h @@ -0,0 +1,27 @@ +#ifndef Py_INTERNAL_FORMAT_H +#define Py_INTERNAL_FORMAT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +/* Format codes + * F_LJUST '-' + * F_SIGN '+' + * F_BLANK ' ' + * F_ALT '#' + * F_ZERO '0' + */ +#define F_LJUST (1<<0) +#define F_SIGN (1<<1) +#define F_BLANK (1<<2) +#define F_ALT (1<<3) +#define F_ZERO (1<<4) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_FORMAT_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index ee801ec46df73e..082945f58a7779 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1112,6 +1112,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_context.h \ $(srcdir)/Include/internal/pycore_dtoa.h \ $(srcdir)/Include/internal/pycore_fileutils.h \ + $(srcdir)/Include/internal/pycore_format.h \ $(srcdir)/Include/internal/pycore_getopt.h \ $(srcdir)/Include/internal/pycore_gil.h \ $(srcdir)/Include/internal/pycore_hamt.h \ diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 805707a4529c62..7cb2b1478cf9c1 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -13,10 +13,9 @@ class bytearray "PyByteArrayObject *" "&PyByteArray_Type" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=5535b77c37a119e0]*/ +/* For PyByteArray_AS_STRING(). */ char _PyByteArray_empty_string[] = ""; -/* end nullbytes support */ - /* Helpers */ static int @@ -266,7 +265,7 @@ PyByteArray_Concat(PyObject *a, PyObject *b) result = (PyByteArrayObject *) \ PyByteArray_FromStringAndSize(NULL, va.len + vb.len); - // result->ob_bytes is NULL if result is an empty string: + // result->ob_bytes is NULL if result is an empty bytearray: // if va.len + vb.len equals zero. if (result != NULL && result->ob_bytes != NULL) { memcpy(result->ob_bytes, va.buf, va.len); @@ -1007,9 +1006,6 @@ bytearray_richcompare(PyObject *self, PyObject *other, int op) Py_buffer self_bytes, other_bytes; int cmp; - /* Bytes can be compared to anything that supports the (binary) - buffer API. Except that a comparison with Unicode is always an - error, even if the comparison is for equality. */ if (!PyObject_CheckBuffer(self) || !PyObject_CheckBuffer(other)) { if (PyUnicode_Check(self) || PyUnicode_Check(other)) { if (_Py_GetConfig()->bytes_warning && (op == Py_EQ || op == Py_NE)) { @@ -1021,6 +1017,7 @@ bytearray_richcompare(PyObject *self, PyObject *other, int op) Py_RETURN_NOTIMPLEMENTED; } + /* Bytearrays can be compared to anything that supports the buffer API. */ if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) { PyErr_Clear(); Py_RETURN_NOTIMPLEMENTED; @@ -1328,7 +1325,7 @@ bytearray_translate_impl(PyByteArrayObject *self, PyObject *table, if (trans_table[c] != -1) *output++ = (char)trans_table[c]; } - /* Fix the size of the resulting string */ + /* Fix the size of the resulting bytearray */ if (inlen > 0) if (PyByteArray_Resize(result, output - output_start) < 0) { Py_CLEAR(result); @@ -2083,7 +2080,7 @@ bytearray.hex How many bytes between separators. Positive values count from the right, negative values count from the left. -Create a str of hexadecimal numbers from a bytearray object. +Create a string of hexadecimal numbers from a bytearray object. Example: >>> value = bytearray([0xb9, 0x01, 0xef]) @@ -2099,7 +2096,7 @@ Create a str of hexadecimal numbers from a bytearray object. static PyObject * bytearray_hex_impl(PyByteArrayObject *self, PyObject *sep, int bytes_per_sep) -/*[clinic end generated code: output=29c4e5ef72c565a0 input=814c15830ac8c4b5]*/ +/*[clinic end generated code: output=29c4e5ef72c565a0 input=808667e49bcccb54]*/ { char* argbuf = PyByteArray_AS_STRING(self); Py_ssize_t arglen = PyByteArray_GET_SIZE(self); @@ -2358,7 +2355,7 @@ PyTypeObject PyByteArray_Type = { PyObject_Del, /* tp_free */ }; -/*********************** Bytes Iterator ****************************/ +/*********************** Bytearray Iterator ****************************/ typedef struct { PyObject_HEAD diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 13216b9bb21a59..ccabbdca1d5624 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -5,6 +5,7 @@ #include "Python.h" #include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_bytes_methods.h" // _Py_bytes_startswith() +#include "pycore_format.h" // F_LJUST #include "pycore_initconfig.h" // _PyStatus_OK() #include "pycore_object.h" // _PyObject_GC_TRACK #include "pycore_pymem.h" // PYMEM_CLEANBYTE @@ -21,11 +22,11 @@ class bytes "PyBytesObject *" "&PyBytes_Type" _Py_IDENTIFIER(__bytes__); -/* PyBytesObject_SIZE gives the basic size of a string; any memory allocation - for a string of length n should request PyBytesObject_SIZE + n bytes. +/* PyBytesObject_SIZE gives the basic size of a bytes object; any memory allocation + for a bytes object of length n should request PyBytesObject_SIZE + n bytes. Using PyBytesObject_SIZE instead of sizeof(PyBytesObject) saves - 3 bytes per string allocation on a typical system. + 3 or 7 bytes per bytes object allocation on a typical system. */ #define PyBytesObject_SIZE (offsetof(PyBytesObject, ob_sval) + 1) @@ -439,19 +440,6 @@ getnextarg(PyObject *args, Py_ssize_t arglen, Py_ssize_t *p_argidx) return NULL; } -/* Format codes - * F_LJUST '-' - * F_SIGN '+' - * F_BLANK ' ' - * F_ALT '#' - * F_ZERO '0' - */ -#define F_LJUST (1<<0) -#define F_SIGN (1<<1) -#define F_BLANK (1<<2) -#define F_ALT (1<<3) -#define F_ZERO (1<<4) - /* Returns a new reference to a PyBytes object, or NULL on failure. */ static char* @@ -1560,7 +1548,7 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op) case Py_EQ: case Py_LE: case Py_GE: - /* a string is equal to itself */ + /* a byte string is equal to itself */ Py_RETURN_TRUE; case Py_NE: case Py_LT: @@ -2149,7 +2137,7 @@ bytes_translate_impl(PyBytesObject *self, PyObject *table, Py_INCREF(input_obj); return input_obj; } - /* Fix the size of the resulting string */ + /* Fix the size of the resulting byte string */ if (inlen > 0) _PyBytes_Resize(&result, output - output_start); return result; @@ -2453,7 +2441,7 @@ bytes.hex How many bytes between separators. Positive values count from the right, negative values count from the left. -Create a str of hexadecimal numbers from a bytes object. +Create a string of hexadecimal numbers from a bytes object. Example: >>> value = b'\xb9\x01\xef' @@ -2469,7 +2457,7 @@ Create a str of hexadecimal numbers from a bytes object. static PyObject * bytes_hex_impl(PyBytesObject *self, PyObject *sep, int bytes_per_sep) -/*[clinic end generated code: output=1f134da504064139 input=f1238d3455990218]*/ +/*[clinic end generated code: output=1f134da504064139 input=1a21282b1f1ae595]*/ { const char *argbuf = PyBytes_AS_STRING(self); Py_ssize_t arglen = PyBytes_GET_SIZE(self); @@ -2771,7 +2759,7 @@ _PyBytes_FromIterator(PyObject *it, PyObject *x) Py_ssize_t i, size; _PyBytesWriter writer; - /* For iterator version, create a string object and resize as needed */ + /* For iterator version, create a bytes object and resize as needed */ size = PyObject_LengthHint(x, 64); if (size == -1 && PyErr_Occurred()) return NULL; diff --git a/Objects/clinic/bytearrayobject.c.h b/Objects/clinic/bytearrayobject.c.h index 3452b241740345..1e3f197561523f 100644 --- a/Objects/clinic/bytearrayobject.c.h +++ b/Objects/clinic/bytearrayobject.c.h @@ -990,7 +990,7 @@ PyDoc_STRVAR(bytearray_hex__doc__, "hex($self, /, sep=, bytes_per_sep=1)\n" "--\n" "\n" -"Create a str of hexadecimal numbers from a bytearray object.\n" +"Create a string of hexadecimal numbers from a bytearray object.\n" "\n" " sep\n" " An optional single character or byte to separate hex bytes.\n" @@ -1120,4 +1120,4 @@ bytearray_sizeof(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) { return bytearray_sizeof_impl(self); } -/*[clinic end generated code: output=47cd9ad3fdc3ac0c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a82659f581e55629 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/bytesobject.c.h b/Objects/clinic/bytesobject.c.h index 27ac6b106748ab..9e365ce1a088ba 100644 --- a/Objects/clinic/bytesobject.c.h +++ b/Objects/clinic/bytesobject.c.h @@ -750,7 +750,7 @@ PyDoc_STRVAR(bytes_hex__doc__, "hex($self, /, sep=, bytes_per_sep=1)\n" "--\n" "\n" -"Create a str of hexadecimal numbers from a bytes object.\n" +"Create a string of hexadecimal numbers from a bytes object.\n" "\n" " sep\n" " An optional single character or byte to separate hex bytes.\n" @@ -878,4 +878,4 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=6101b417d6a6a717 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b3f0ec2753246b9c input=a9049054013a1b77]*/ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index f6473c02d30fd6..409355534a2ce1 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -42,6 +42,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "Python.h" #include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_bytes_methods.h" // _Py_bytes_lower() +#include "pycore_format.h" // F_LJUST #include "pycore_initconfig.h" // _PyStatus_OK() #include "pycore_interp.h" // PyInterpreterState.fs_codec #include "pycore_object.h" // _PyObject_GC_TRACK() diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 18edba855d6161..cf78714920b054 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -176,6 +176,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 281bce1c5f4986..ba84ab902b6877 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -510,6 +510,9 @@ Include\internal + + Include\internal + Include\internal From 14e486e836d9abf2d3e3b9b9160921ba56d8dcb3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 3 Dec 2020 13:56:41 +0100 Subject: [PATCH 0711/1261] bpo-42553: Fix test_asyncio.test_call_later() (GH-23627) Fix test_asyncio.test_call_later() race condition: don't measure asyncio performance in the call_later() unit test. The test failed randomly on the CI. --- Lib/test/test_asyncio/test_events.py | 3 --- .../NEWS.d/next/Tests/2020-12-03-13-32-44.bpo-42553.2TRE2N.rst | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-12-03-13-32-44.bpo-42553.2TRE2N.rst diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 7f76011d2b92dc..ce615606db7e3d 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -294,11 +294,8 @@ def callback(arg): self.loop.stop() self.loop.call_later(0.1, callback, 'hello world') - t0 = time.monotonic() self.loop.run_forever() - t1 = time.monotonic() self.assertEqual(results, ['hello world']) - self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0) def test_call_soon(self): results = [] diff --git a/Misc/NEWS.d/next/Tests/2020-12-03-13-32-44.bpo-42553.2TRE2N.rst b/Misc/NEWS.d/next/Tests/2020-12-03-13-32-44.bpo-42553.2TRE2N.rst new file mode 100644 index 00000000000000..872214284728bc --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-12-03-13-32-44.bpo-42553.2TRE2N.rst @@ -0,0 +1,3 @@ +Fix ``test_asyncio.test_call_later()`` race condition: don't measure asyncio +performance in the ``call_later()`` unit test. The test failed randomly on +the CI. From 2bf2fd3e8fb8d9669d200e74e7c56b5d8bb00254 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 3 Dec 2020 14:01:10 +0100 Subject: [PATCH 0712/1261] bpo-42262: Py_NewRef() casts its argument to PyObject* (GH-23626) Write also unit tests on Py_NewRef() and Py_XNewRef(). --- Include/object.h | 6 ++---- Modules/_testcapimodule.c | 32 +++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Include/object.h b/Include/object.h index f68423a09c4e4b..8d0039428e73af 100644 --- a/Include/object.h +++ b/Include/object.h @@ -426,7 +426,6 @@ static inline void _Py_INCREF(PyObject *op) #endif op->ob_refcnt++; } - #define Py_INCREF(op) _Py_INCREF(_PyObject_CAST(op)) static inline void _Py_DECREF( @@ -449,7 +448,6 @@ static inline void _Py_DECREF( _Py_Dealloc(op); } } - #ifdef Py_REF_DEBUG # define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) #else @@ -548,8 +546,8 @@ static inline PyObject* _Py_XNewRef(PyObject *obj) // Py_NewRef() and Py_XNewRef() are exported as functions for the stable ABI. // Names overriden with macros by static inline functions for best // performances. -#define Py_NewRef(obj) _Py_NewRef(obj) -#define Py_XNewRef(obj) _Py_XNewRef(obj) +#define Py_NewRef(obj) _Py_NewRef(_PyObject_CAST(obj)) +#define Py_XNewRef(obj) _Py_XNewRef(_PyObject_CAST(obj)) /* diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index d2104423c5890c..4f97927fa23229 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5614,7 +5614,7 @@ static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *); static PyObject* -test_set_type_size(PyObject* self, PyObject* ignored) +test_set_type_size(PyObject *self, PyObject *Py_UNUSED(ignored)) { PyObject *obj = PyList_New(0); if (obj == NULL) { @@ -5636,6 +5636,35 @@ test_set_type_size(PyObject* self, PyObject* ignored) } +// Test Py_NewRef() and Py_XNewRef() functions +static PyObject* +test_refcount(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *obj = PyList_New(0); + if (obj == NULL) { + return NULL; + } + assert(Py_REFCNT(obj) == 1); + + // Test Py_NewRef() + PyObject *ref = Py_NewRef(obj); + assert(ref == obj); + assert(Py_REFCNT(obj) == 2); + Py_DECREF(ref); + + // Test Py_XNewRef() + PyObject *xref = Py_XNewRef(obj); + assert(xref == obj); + assert(Py_REFCNT(obj) == 2); + Py_DECREF(xref); + + assert(Py_XNewRef(NULL) == NULL); + + Py_DECREF(obj); + Py_RETURN_NONE; +} + + static PyMethodDef TestMethods[] = { {"raise_exception", raise_exception, METH_VARARGS}, {"raise_memoryerror", raise_memoryerror, METH_NOARGS}, @@ -5908,6 +5937,7 @@ static PyMethodDef TestMethods[] = { {"pynumber_tobase", pynumber_tobase, METH_VARARGS}, {"without_gc", without_gc, METH_O}, {"test_set_type_size", test_set_type_size, METH_NOARGS}, + {"test_refcount", test_refcount, METH_NOARGS}, {NULL, NULL} /* sentinel */ }; From 6797641c17194a2c2c6cb77930a3d23cdb18b8de Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Thu, 3 Dec 2020 10:22:04 -0700 Subject: [PATCH 0713/1261] bpo-42523: Fix supported versions in "Using Python on Windows" (GH-23603) --- Doc/using/windows.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 78c1e03f7462c9..265c07c7099f35 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -23,8 +23,8 @@ available for application-local distributions. As specified in :pep:`11`, a Python release only supports a Windows platform while Microsoft considers the platform under extended support. This means that -Python |version| supports Windows Vista and newer. If you require Windows XP -support then please install Python 3.4. +Python |version| supports Windows 8.1 and newer. If you require Windows 7 +support, please install Python 3.8. There are a number of different installers available for Windows, each with certain benefits and downsides. From 631e69b2af59ce4c734a68bbe3663d053b9d31f3 Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Fri, 4 Dec 2020 17:20:53 +0200 Subject: [PATCH 0714/1261] bpo-42562: Fix issue when dis failed to parse function that has no line numbers (GH-23632) Fix issue when dis failed to parse function that has only annotations --- Lib/dis.py | 2 +- Lib/test/test_dis.py | 17 +++++++++++++++++ .../2020-12-03-22-42-03.bpo-42562.2hPmhi.rst | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-03-22-42-03.bpo-42562.2hPmhi.rst diff --git a/Lib/dis.py b/Lib/dis.py index ea50f564c87dc7..ccbd65be73255a 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -384,7 +384,7 @@ def _disassemble_bytes(code, lasti=-1, varnames=None, names=None, constants=None, cells=None, linestarts=None, *, file=None, line_offset=0): # Omit the line number column entirely if we have no line number info - show_lineno = linestarts is not None + show_lineno = bool(linestarts) if show_lineno: maxlineno = max(linestarts.values()) + line_offset if maxlineno >= 1000: diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index d0743d62e3d794..56d877151838f0 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -166,6 +166,20 @@ def bug1333982(x=[]): bug1333982.__code__.co_firstlineno + 2, bug1333982.__code__.co_firstlineno + 1) + +def bug42562(): + pass + + +# Set line number for 'pass' to None +bug42562.__code__ = bug42562.__code__.replace(co_linetable=b'\x04\x80\xff\x80') + + +dis_bug42562 = """\ + 0 LOAD_CONST 0 (None) + 2 RETURN_VALUE +""" + _BIG_LINENO_FORMAT = """\ %3d 0 LOAD_GLOBAL 0 (spam) 2 POP_TOP @@ -520,6 +534,9 @@ def test_bug_1333982(self): self.do_disassembly_test(bug1333982, dis_bug1333982) + def test_bug_42562(self): + self.do_disassembly_test(bug42562, dis_bug42562) + def test_big_linenos(self): def func(count): namespace = {} diff --git a/Misc/NEWS.d/next/Library/2020-12-03-22-42-03.bpo-42562.2hPmhi.rst b/Misc/NEWS.d/next/Library/2020-12-03-22-42-03.bpo-42562.2hPmhi.rst new file mode 100644 index 00000000000000..4999da509c2913 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-03-22-42-03.bpo-42562.2hPmhi.rst @@ -0,0 +1,2 @@ +Fix issue when dis failed to parse function that has no line numbers. Patch +provided by Yurii Karabas. From 02060b2d5677fd788c821c3bb82e712b6df11cc1 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Fri, 4 Dec 2020 15:22:12 +0000 Subject: [PATCH 0715/1261] bpo-42246: Don't forget the entry block when ensuring that all exits have a line number (GH-23636) Don't forget the entry block when ensuring that all exits have a line number. --- Lib/test/test_compile.py | 18 ++++++++++++++++++ Python/compile.c | 6 ++++++ Python/importlib.h | 2 +- Python/importlib_external.h | 6 +++--- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 1e61f41c25b789..0d11ce940f81ae 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -809,6 +809,24 @@ def save_caller_frame(): func(save_caller_frame) self.assertEqual(frame.f_lineno-frame.f_code.co_firstlineno, lastline) + def test_lineno_after_no_code(self): + def no_code1(): + "doc string" + + def no_code2(): + a: int + + for func in (no_code1, no_code2): + with self.subTest(func=func): + code = func.__code__ + lines = list(code.co_lines()) + self.assertEqual(len(lines), 1) + start, end, line = lines[0] + self.assertEqual(start, 0) + self.assertEqual(end, len(code.co_code)) + self.assertEqual(line, code.co_firstlineno) + + def test_big_dict_literal(self): # The compiler has a flushing point in "compiler_dict" that calls compiles # a portion of the dictionary literal when the loop that iterates over the items diff --git a/Python/compile.c b/Python/compile.c index c67e8e885e4e6c..ea9d6781b9c156 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -6514,6 +6514,7 @@ is_exit_without_lineno(basicblock *b) { static int ensure_exits_have_lineno(struct compiler *c) { + basicblock *entry = NULL; /* Copy all exit blocks without line number that are targets of a jump. */ for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) { @@ -6535,6 +6536,11 @@ ensure_exits_have_lineno(struct compiler *c) b->b_instr[b->b_iused-1].i_target = new_target; } } + entry = b; + } + assert(entry != NULL); + if (is_exit_without_lineno(entry)) { + entry->b_instr[0].i_lineno = c->u->u_firstlineno; } /* Any remaining reachable exit blocks without line number can only be reached by * fall through, and thus can only have a single predecessor */ diff --git a/Python/importlib.h b/Python/importlib.h index c5ff9ece081ee6..179f8df77a0a05 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -1243,7 +1243,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 114,32,109,111,100,117,108,101,32,99,114,101,97,116,105,111, 110,46,78,114,10,0,0,0,114,161,0,0,0,114,10,0, 0,0,114,10,0,0,0,114,11,0,0,0,114,150,0,0, - 0,66,3,0,0,115,4,0,0,0,4,128,255,128,122,28, + 0,66,3,0,0,115,4,0,0,0,4,0,255,128,122,28, 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,99, 114,101,97,116,101,95,109,111,100,117,108,101,99,1,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, diff --git a/Python/importlib_external.h b/Python/importlib_external.h index c459bcf2e90c44..8f18d208d2ec01 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -1153,7 +1153,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,169,2,114,123,0,0,0,114,191,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,13,99,114, 101,97,116,101,95,109,111,100,117,108,101,55,3,0,0,115, - 4,0,0,0,4,128,255,128,122,27,95,76,111,97,100,101, + 4,0,0,0,4,0,255,128,122,27,95,76,111,97,100,101, 114,66,97,115,105,99,115,46,99,114,101,97,116,101,95,109, 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,56, @@ -1292,7 +1292,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,78,114,7,0,0,0,41,3,114,123,0,0,0, 114,52,0,0,0,114,37,0,0,0,114,7,0,0,0,114, 7,0,0,0,114,8,0,0,0,114,232,0,0,0,105,3, - 0,0,115,4,0,0,0,4,128,255,128,122,21,83,111,117, + 0,0,115,4,0,0,0,4,0,255,128,122,21,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,0,0,0,0,5, 0,0,0,10,0,0,0,67,0,0,0,115,70,0,0,0, @@ -2019,7 +2019,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,115,4,0,0,0,100,1,83,0,114,217,0,0,0,114, 7,0,0,0,114,218,0,0,0,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,114,219,0,0,0,217,4,0, - 0,115,4,0,0,0,4,128,255,128,122,30,95,78,97,109, + 0,115,4,0,0,0,4,0,255,128,122,30,95,78,97,109, 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, From 9d562c194e2c1d6a6c8667af80ea1ee59bebf9b3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 4 Dec 2020 16:23:56 +0100 Subject: [PATCH 0716/1261] bpo-41473: Reenable test_gdb on gdb 9.2 and newer (GH-23637) https://bugzilla.redhat.com/show_bug.cgi?id=1866884 is fixed in gdb 10.1 (failed to reproduce on gdb-10.1-1.fc34.aarch64). --- Lib/test/test_gdb.py | 5 ----- .../next/Tests/2020-12-04-11-47-09.bpo-41473.W_updK.rst | 3 +++ 2 files changed, 3 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-12-04-11-47-09.bpo-41473.W_updK.rst diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index 44cb9a0f07b75d..22c75bae987219 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -51,11 +51,6 @@ def get_gdb_version(): "embedding. Saw %s.%s:\n%s" % (gdb_major_version, gdb_minor_version, gdb_version)) -if (gdb_major_version, gdb_minor_version) >= (9, 2): - # gdb 9.2 on Fedora Rawhide is not reliable, see: - # * https://bugs.python.org/issue41473 - # * https://bugzilla.redhat.com/show_bug.cgi?id=1866884 - raise unittest.SkipTest("https://bugzilla.redhat.com/show_bug.cgi?id=1866884") if not sysconfig.is_python_build(): raise unittest.SkipTest("test_gdb only works on source builds at the moment.") diff --git a/Misc/NEWS.d/next/Tests/2020-12-04-11-47-09.bpo-41473.W_updK.rst b/Misc/NEWS.d/next/Tests/2020-12-04-11-47-09.bpo-41473.W_updK.rst new file mode 100644 index 00000000000000..9e0a375a9b7f25 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-12-04-11-47-09.bpo-41473.W_updK.rst @@ -0,0 +1,3 @@ +Reenable test_gdb on gdb 9.2 and newer: +https://bugzilla.redhat.com/show_bug.cgi?id=1866884 bug is fixed in gdb +10.1. From aa223810ae8ae661e6172fa9524f23de2e0a4edb Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Fri, 4 Dec 2020 16:45:38 +0000 Subject: [PATCH 0717/1261] bpo-42116: Fix inspect.getsource handling of trailing comments (GH-23630) --- Lib/inspect.py | 7 ++++++ Lib/test/inspect_fodder.py | 22 ++++++++++++++++++ Lib/test/test_inspect.py | 23 +++++++++++++++---- .../2020-12-03-15-42-32.bpo-42116.yIwroP.rst | 1 + 4 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst diff --git a/Lib/inspect.py b/Lib/inspect.py index 7412d0e837cf14..073a79d97acd2d 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -930,6 +930,7 @@ def __init__(self): self.indecorator = False self.decoratorhasargs = False self.last = 1 + self.body_col0 = None def tokeneater(self, type, token, srowcol, erowcol, line): if not self.started and not self.indecorator: @@ -961,6 +962,8 @@ def tokeneater(self, type, token, srowcol, erowcol, line): elif self.passline: pass elif type == tokenize.INDENT: + if self.body_col0 is None and self.started: + self.body_col0 = erowcol[1] self.indent = self.indent + 1 self.passline = True elif type == tokenize.DEDENT: @@ -970,6 +973,10 @@ def tokeneater(self, type, token, srowcol, erowcol, line): # not e.g. for "if: else:" or "try: finally:" blocks) if self.indent <= 0: raise EndOfBlock + elif type == tokenize.COMMENT: + if self.body_col0 is not None and srowcol[1] >= self.body_col0: + # Include comments if indented at least as much as the block + self.last = srowcol[0] elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL): # any other token on the same indentation level end the previous # block as well, except the pseudo-tokens COMMENT and NL. diff --git a/Lib/test/inspect_fodder.py b/Lib/test/inspect_fodder.py index 96a0257bfdf03e..e1287a315901cf 100644 --- a/Lib/test/inspect_fodder.py +++ b/Lib/test/inspect_fodder.py @@ -91,3 +91,25 @@ def as_method_of(self, obj): custom_method = Callable().as_method_of(42) del Callable + +# line 95 +class WhichComments: + # line 97 + # before f + def f(self): + # line 100 + # start f + return 1 + # line 103 + # end f + # line 105 + # after f + + # before asyncf - line 108 + async def asyncf(self): + # start asyncf + return 2 + # end asyncf + # after asyncf - line 113 + # end of WhichComments - line 114 + # after WhichComments - line 115 diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 71c4f27d27b982..172e6bf6cd8a63 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -390,6 +390,7 @@ def test_getclasses(self): ('ParrotDroppings', mod.ParrotDroppings), ('StupidGit', mod.StupidGit), ('Tit', mod.MalodorousPervert), + ('WhichComments', mod.WhichComments), ]) tree = inspect.getclasstree([cls[1] for cls in classes]) self.assertEqual(tree, @@ -403,7 +404,8 @@ def test_getclasses(self): [(mod.FesteringGob, (mod.MalodorousPervert, mod.ParrotDroppings)) ] - ] + ], + (mod.WhichComments, (object,),) ] ]) tree = inspect.getclasstree([cls[1] for cls in classes], True) @@ -415,7 +417,8 @@ def test_getclasses(self): [(mod.FesteringGob, (mod.MalodorousPervert, mod.ParrotDroppings)) ] - ] + ], + (mod.WhichComments, (object,),) ] ]) @@ -646,6 +649,18 @@ def test_anonymous(self): # as argument to another function. self.assertSourceEqual(mod2.anonymous, 55, 55) +class TestBlockComments(GetSourceBase): + fodderModule = mod + + def test_toplevel_class(self): + self.assertSourceEqual(mod.WhichComments, 96, 114) + + def test_class_method(self): + self.assertSourceEqual(mod.WhichComments.f, 99, 104) + + def test_class_async_method(self): + self.assertSourceEqual(mod.WhichComments.asyncf, 109, 112) + class TestBuggyCases(GetSourceBase): fodderModule = mod2 @@ -4014,8 +4029,8 @@ def test_getsource_reload(self): def test_main(): run_unittest( - TestDecorators, TestRetrievingSourceCode, TestOneliners, TestBuggyCases, - TestInterpreterStack, TestClassesAndFunctions, TestPredicates, + TestDecorators, TestRetrievingSourceCode, TestOneliners, TestBlockComments, + TestBuggyCases, TestInterpreterStack, TestClassesAndFunctions, TestPredicates, TestGetcallargsFunctions, TestGetcallargsMethods, TestGetcallargsUnboundMethods, TestGetattrStatic, TestGetGeneratorState, TestNoEOL, TestSignatureObject, TestSignatureBind, TestParameterObject, diff --git a/Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst b/Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst new file mode 100644 index 00000000000000..febda89338ddc7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst @@ -0,0 +1 @@ +Fix handling of trailing comments by :func:`inspect.getsource`. \ No newline at end of file From 1b8d000e9c9402731cd6acd0de0bbeb1f594466e Mon Sep 17 00:00:00 2001 From: pxinwr Date: Sat, 5 Dec 2020 04:19:32 +0800 Subject: [PATCH 0718/1261] bpo-31904: fix test_doctest.py failures for VxWorks (GH-23419) Fix test_doctest.py failures for VxWorks by avoiding exact error message checks. (better for everyone all around) --- Lib/test/test_doctest.py | 3 ++- .../NEWS.d/next/Tests/2020-11-20-15-07-18.bpo-31904.EBJXjJ.rst | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-11-20-15-07-18.bpo-31904.EBJXjJ.rst diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index bff20f9cac9c98..6a5013f5b8afc3 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -3039,10 +3039,11 @@ def test_CLI(): r""" ... '-m', 'doctest', 'nosuchfile') >>> rc, out (1, b'') + >>> # The exact error message changes depending on the platform. >>> print(normalize(err)) # doctest: +ELLIPSIS Traceback (most recent call last): ... - FileNotFoundError: [Errno ...] No such file or directory: 'nosuchfile' + FileNotFoundError: [Errno ...] ...nosuchfile... Invalid doctest option: diff --git a/Misc/NEWS.d/next/Tests/2020-11-20-15-07-18.bpo-31904.EBJXjJ.rst b/Misc/NEWS.d/next/Tests/2020-11-20-15-07-18.bpo-31904.EBJXjJ.rst new file mode 100644 index 00000000000000..e5e66ceea44021 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-11-20-15-07-18.bpo-31904.EBJXjJ.rst @@ -0,0 +1 @@ +Fix test_doctest.py failures for VxWorks. From 764ad549bcd35b30cc16fd91eff037011b4dc11b Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Fri, 4 Dec 2020 21:22:03 +0000 Subject: [PATCH 0719/1261] bpo-17735: inspect.findsource now raises OSError when co_lineno is out of range (GH-23633) This can happen when a file was edited after it was imported. --- Lib/inspect.py | 7 ++++++- Lib/test/test_inspect.py | 11 +++++++++++ .../Library/2020-12-03-22-22-24.bpo-17735.Qsaaue.rst | 4 ++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-03-22-22-24.bpo-17735.Qsaaue.rst diff --git a/Lib/inspect.py b/Lib/inspect.py index 073a79d97acd2d..9150ac104dcb73 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -868,7 +868,12 @@ def findsource(object): lnum = object.co_firstlineno - 1 pat = re.compile(r'^(\s*def\s)|(\s*async\s+def\s)|(.*(? 0: - if pat.match(lines[lnum]): break + try: + line = lines[lnum] + except IndexError: + raise OSError('lineno is out of bounds') + if pat.match(line): + break lnum = lnum - 1 return lines, lnum raise OSError('could not find code object') diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 172e6bf6cd8a63..c81d828b57ece9 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -712,6 +712,17 @@ def test_findsource_without_filename(self): self.assertRaises(IOError, inspect.findsource, co) self.assertRaises(IOError, inspect.getsource, co) + def test_findsource_with_out_of_bounds_lineno(self): + mod_len = len(inspect.getsource(mod)) + src = '\n' * 2* mod_len + "def f(): pass" + co = compile(src, mod.__file__, "exec") + g, l = {}, {} + eval(co, g, l) + func = l['f'] + self.assertEqual(func.__code__.co_firstlineno, 1+2*mod_len) + with self.assertRaisesRegex(IOError, "lineno is out of bounds"): + inspect.findsource(func) + def test_getsource_on_method(self): self.assertSourceEqual(mod2.ClassWithMethod.method, 118, 119) diff --git a/Misc/NEWS.d/next/Library/2020-12-03-22-22-24.bpo-17735.Qsaaue.rst b/Misc/NEWS.d/next/Library/2020-12-03-22-22-24.bpo-17735.Qsaaue.rst new file mode 100644 index 00000000000000..655781e3d2eddb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-03-22-22-24.bpo-17735.Qsaaue.rst @@ -0,0 +1,4 @@ +:func:`inspect.findsource` now raises :exc:`OSError` instead of +:exc:`IndexError` when :attr:`co_lineno` of a code object is greater than the +file length. This can happen, for example, when a file is edited after it was +imported. PR by Irit Katriel. From de97a6432926bf2ee0faa4022d9463732025530f Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Fri, 4 Dec 2020 22:05:58 +0000 Subject: [PATCH 0720/1261] bpo-42545: Check that all symbols in the limited ABI are exported (GH-23616) --- .github/workflows/build.yml | 2 + .travis.yml | 2 + Doc/data/stable_abi.dat | 779 ++++++++++++++++++++++++++++++++++++ Makefile.pre.in | 10 + Tools/scripts/stable_abi.py | 234 +++++++++++ 5 files changed, 1027 insertions(+) create mode 100644 Doc/data/stable_abi.dat create mode 100755 Tools/scripts/stable_abi.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 12c591e41362ef..71c307b6c62a35 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -75,6 +75,8 @@ jobs: fi - name: Check exported libpython symbols run: make smelly + - name: Check limited ABI symbols + run: make check-limited-abi build_win32: name: 'Windows (x86)' diff --git a/.travis.yml b/.travis.yml index dfdf670bff5f9b..547d919974957c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -192,6 +192,8 @@ script: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./python Tools/scripts/patchcheck.py --travis $TRAVIS_PULL_REQUEST; fi # Check that all symbols exported by libpython start with "Py" or "_Py" - make smelly + # Check that all symbols in the limited abi are present + - make check-limited-abi # `-r -w` implicitly provided through `make buildbottest`. - | if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat new file mode 100644 index 00000000000000..28cb50b12301ba --- /dev/null +++ b/Doc/data/stable_abi.dat @@ -0,0 +1,779 @@ +# File generated by 'make regen-limited-abi' +# This is NOT an authoritative list of stable ABI symbols +PyArg_Parse +PyArg_ParseTuple +PyArg_ParseTupleAndKeywords +PyArg_UnpackTuple +PyArg_VaParse +PyArg_VaParseTupleAndKeywords +PyArg_ValidateKeywordArguments +PyBaseObject_Type +PyBool_FromLong +PyBool_Type +PyByteArrayIter_Type +PyByteArray_AsString +PyByteArray_Concat +PyByteArray_FromObject +PyByteArray_FromStringAndSize +PyByteArray_Resize +PyByteArray_Size +PyByteArray_Type +PyBytesIter_Type +PyBytes_AsString +PyBytes_AsStringAndSize +PyBytes_Concat +PyBytes_ConcatAndDel +PyBytes_DecodeEscape +PyBytes_FromFormat +PyBytes_FromFormatV +PyBytes_FromObject +PyBytes_FromString +PyBytes_FromStringAndSize +PyBytes_Repr +PyBytes_Size +PyBytes_Type +PyCFunction_Call +PyCFunction_GetFlags +PyCFunction_GetFunction +PyCFunction_GetSelf +PyCFunction_NewEx +PyCFunction_Type +PyCMethod_New +PyCallIter_New +PyCallIter_Type +PyCallable_Check +PyCapsule_GetContext +PyCapsule_GetDestructor +PyCapsule_GetName +PyCapsule_GetPointer +PyCapsule_Import +PyCapsule_IsValid +PyCapsule_New +PyCapsule_SetContext +PyCapsule_SetDestructor +PyCapsule_SetName +PyCapsule_SetPointer +PyCapsule_Type +PyClassMethodDescr_Type +PyCodec_BackslashReplaceErrors +PyCodec_Decode +PyCodec_Decoder +PyCodec_Encode +PyCodec_Encoder +PyCodec_IgnoreErrors +PyCodec_IncrementalDecoder +PyCodec_IncrementalEncoder +PyCodec_KnownEncoding +PyCodec_LookupError +PyCodec_NameReplaceErrors +PyCodec_Register +PyCodec_RegisterError +PyCodec_ReplaceErrors +PyCodec_StreamReader +PyCodec_StreamWriter +PyCodec_StrictErrors +PyCodec_Unregister +PyCodec_XMLCharRefReplaceErrors +PyComplex_FromDoubles +PyComplex_ImagAsDouble +PyComplex_RealAsDouble +PyComplex_Type +PyDescr_NewClassMethod +PyDescr_NewGetSet +PyDescr_NewMember +PyDescr_NewMethod +PyDictItems_Type +PyDictIterItem_Type +PyDictIterKey_Type +PyDictIterValue_Type +PyDictKeys_Type +PyDictProxy_New +PyDictProxy_Type +PyDictRevIterItem_Type +PyDictRevIterKey_Type +PyDictRevIterValue_Type +PyDictValues_Type +PyDict_Clear +PyDict_Contains +PyDict_Copy +PyDict_DelItem +PyDict_DelItemString +PyDict_GetItem +PyDict_GetItemString +PyDict_GetItemWithError +PyDict_Items +PyDict_Keys +PyDict_Merge +PyDict_MergeFromSeq2 +PyDict_New +PyDict_Next +PyDict_SetItem +PyDict_SetItemString +PyDict_Size +PyDict_Type +PyDict_Update +PyDict_Values +PyEllipsis_Type +PyEnum_Type +PyErr_BadArgument +PyErr_BadInternalCall +PyErr_CheckSignals +PyErr_Clear +PyErr_Display +PyErr_ExceptionMatches +PyErr_Fetch +PyErr_Format +PyErr_FormatV +PyErr_GetExcInfo +PyErr_GivenExceptionMatches +PyErr_NewException +PyErr_NewExceptionWithDoc +PyErr_NoMemory +PyErr_NormalizeException +PyErr_Occurred +PyErr_Print +PyErr_PrintEx +PyErr_ProgramText +PyErr_ResourceWarning +PyErr_Restore +PyErr_SetExcInfo +PyErr_SetFromErrno +PyErr_SetFromErrnoWithFilename +PyErr_SetFromErrnoWithFilenameObject +PyErr_SetFromErrnoWithFilenameObjects +PyErr_SetImportError +PyErr_SetImportErrorSubclass +PyErr_SetInterrupt +PyErr_SetNone +PyErr_SetObject +PyErr_SetString +PyErr_SyntaxLocation +PyErr_SyntaxLocationEx +PyErr_WarnEx +PyErr_WarnExplicit +PyErr_WarnFormat +PyErr_WriteUnraisable +PyEval_AcquireLock +PyEval_AcquireThread +PyEval_CallFunction +PyEval_CallMethod +PyEval_CallObjectWithKeywords +PyEval_EvalCode +PyEval_EvalCodeEx +PyEval_EvalFrame +PyEval_EvalFrameEx +PyEval_GetBuiltins +PyEval_GetFrame +PyEval_GetFuncDesc +PyEval_GetFuncName +PyEval_GetGlobals +PyEval_GetLocals +PyEval_InitThreads +PyEval_ReleaseLock +PyEval_ReleaseThread +PyEval_RestoreThread +PyEval_SaveThread +PyEval_ThreadsInitialized +PyExc_ArithmeticError +PyExc_AssertionError +PyExc_AttributeError +PyExc_BaseException +PyExc_BlockingIOError +PyExc_BrokenPipeError +PyExc_BufferError +PyExc_BytesWarning +PyExc_ChildProcessError +PyExc_ConnectionAbortedError +PyExc_ConnectionError +PyExc_ConnectionRefusedError +PyExc_ConnectionResetError +PyExc_DeprecationWarning +PyExc_EOFError +PyExc_EnvironmentError +PyExc_Exception +PyExc_FileExistsError +PyExc_FileNotFoundError +PyExc_FloatingPointError +PyExc_FutureWarning +PyExc_GeneratorExit +PyExc_IOError +PyExc_ImportError +PyExc_ImportWarning +PyExc_IndentationError +PyExc_IndexError +PyExc_InterruptedError +PyExc_IsADirectoryError +PyExc_KeyError +PyExc_KeyboardInterrupt +PyExc_LookupError +PyExc_MemoryError +PyExc_ModuleNotFoundError +PyExc_NameError +PyExc_NotADirectoryError +PyExc_NotImplementedError +PyExc_OSError +PyExc_OverflowError +PyExc_PendingDeprecationWarning +PyExc_PermissionError +PyExc_ProcessLookupError +PyExc_RecursionError +PyExc_ReferenceError +PyExc_ResourceWarning +PyExc_RuntimeError +PyExc_RuntimeWarning +PyExc_StopAsyncIteration +PyExc_StopIteration +PyExc_SyntaxError +PyExc_SyntaxWarning +PyExc_SystemError +PyExc_SystemExit +PyExc_TabError +PyExc_TimeoutError +PyExc_TypeError +PyExc_UnboundLocalError +PyExc_UnicodeDecodeError +PyExc_UnicodeEncodeError +PyExc_UnicodeError +PyExc_UnicodeTranslateError +PyExc_UnicodeWarning +PyExc_UserWarning +PyExc_ValueError +PyExc_Warning +PyExc_ZeroDivisionError +PyExceptionClass_Name +PyException_GetCause +PyException_GetContext +PyException_GetTraceback +PyException_SetCause +PyException_SetContext +PyException_SetTraceback +PyFile_FromFd +PyFile_GetLine +PyFile_WriteObject +PyFile_WriteString +PyFilter_Type +PyFloat_AsDouble +PyFloat_FromDouble +PyFloat_FromString +PyFloat_GetInfo +PyFloat_GetMax +PyFloat_GetMin +PyFloat_Type +PyFrame_GetCode +PyFrame_GetLineNumber +PyFrozenSet_New +PyFrozenSet_Type +PyGC_Collect +PyGILState_Ensure +PyGILState_GetThisThreadState +PyGILState_Release +PyGetSetDescr_Type +PyImport_AddModule +PyImport_AddModuleObject +PyImport_AppendInittab +PyImport_ExecCodeModule +PyImport_ExecCodeModuleEx +PyImport_ExecCodeModuleObject +PyImport_ExecCodeModuleWithPathnames +PyImport_GetImporter +PyImport_GetMagicNumber +PyImport_GetMagicTag +PyImport_GetModule +PyImport_GetModuleDict +PyImport_Import +PyImport_ImportFrozenModule +PyImport_ImportFrozenModuleObject +PyImport_ImportModule +PyImport_ImportModuleLevel +PyImport_ImportModuleLevelObject +PyImport_ImportModuleNoBlock +PyImport_ReloadModule +PyIndex_Check +PyInterpreterState_Clear +PyInterpreterState_Delete +PyInterpreterState_Get +PyInterpreterState_GetDict +PyInterpreterState_GetID +PyInterpreterState_New +PyIter_Check +PyIter_Next +PyIter_Send +PyListIter_Type +PyListRevIter_Type +PyList_Append +PyList_AsTuple +PyList_GetItem +PyList_GetSlice +PyList_Insert +PyList_New +PyList_Reverse +PyList_SetItem +PyList_SetSlice +PyList_Size +PyList_Sort +PyList_Type +PyLongRangeIter_Type +PyLong_AsDouble +PyLong_AsLong +PyLong_AsLongAndOverflow +PyLong_AsLongLong +PyLong_AsLongLongAndOverflow +PyLong_AsSize_t +PyLong_AsSsize_t +PyLong_AsUnsignedLong +PyLong_AsUnsignedLongLong +PyLong_AsUnsignedLongLongMask +PyLong_AsUnsignedLongMask +PyLong_AsVoidPtr +PyLong_FromDouble +PyLong_FromLong +PyLong_FromLongLong +PyLong_FromSize_t +PyLong_FromSsize_t +PyLong_FromString +PyLong_FromUnsignedLong +PyLong_FromUnsignedLongLong +PyLong_FromVoidPtr +PyLong_GetInfo +PyLong_Type +PyMap_Type +PyMapping_Check +PyMapping_GetItemString +PyMapping_HasKey +PyMapping_HasKeyString +PyMapping_Items +PyMapping_Keys +PyMapping_Length +PyMapping_SetItemString +PyMapping_Size +PyMapping_Values +PyMarshal_ReadObjectFromString +PyMarshal_WriteLongToFile +PyMarshal_WriteObjectToFile +PyMarshal_WriteObjectToString +PyMem_Free +PyMem_Malloc +PyMem_Realloc +PyMemberDescr_Type +PyMember_GetOne +PyMember_SetOne +PyMemoryView_FromMemory +PyMemoryView_FromObject +PyMemoryView_GetContiguous +PyMemoryView_Type +PyMethodDescr_Type +PyModuleDef_Init +PyModuleDef_Type +PyModule_AddFunctions +PyModule_AddIntConstant +PyModule_AddObject +PyModule_AddObjectRef +PyModule_AddStringConstant +PyModule_AddType +PyModule_Create2 +PyModule_ExecDef +PyModule_FromDefAndSpec2 +PyModule_GetDef +PyModule_GetDict +PyModule_GetFilename +PyModule_GetFilenameObject +PyModule_GetName +PyModule_GetNameObject +PyModule_GetState +PyModule_New +PyModule_NewObject +PyModule_SetDocString +PyModule_Type +PyNumber_Absolute +PyNumber_Add +PyNumber_And +PyNumber_AsSsize_t +PyNumber_Check +PyNumber_Divmod +PyNumber_Float +PyNumber_FloorDivide +PyNumber_InPlaceAdd +PyNumber_InPlaceAnd +PyNumber_InPlaceFloorDivide +PyNumber_InPlaceLshift +PyNumber_InPlaceMatrixMultiply +PyNumber_InPlaceMultiply +PyNumber_InPlaceOr +PyNumber_InPlacePower +PyNumber_InPlaceRemainder +PyNumber_InPlaceRshift +PyNumber_InPlaceSubtract +PyNumber_InPlaceTrueDivide +PyNumber_InPlaceXor +PyNumber_Index +PyNumber_Invert +PyNumber_Long +PyNumber_Lshift +PyNumber_MatrixMultiply +PyNumber_Multiply +PyNumber_Negative +PyNumber_Or +PyNumber_Positive +PyNumber_Power +PyNumber_Remainder +PyNumber_Rshift +PyNumber_Subtract +PyNumber_ToBase +PyNumber_TrueDivide +PyNumber_Xor +PyOS_AfterFork +PyOS_AfterFork_Child +PyOS_AfterFork_Parent +PyOS_BeforeFork +PyOS_FSPath +PyOS_InterruptOccurred +PyOS_double_to_string +PyOS_getsig +PyOS_mystricmp +PyOS_mystrnicmp +PyOS_setsig +PyOS_snprintf +PyOS_string_to_double +PyOS_strtol +PyOS_strtoul +PyOS_vsnprintf +PyObject_ASCII +PyObject_AsFileDescriptor +PyObject_Bytes +PyObject_Call +PyObject_CallFunction +PyObject_CallFunctionObjArgs +PyObject_CallMethod +PyObject_CallMethodObjArgs +PyObject_CallNoArgs +PyObject_CallObject +PyObject_Calloc +PyObject_ClearWeakRefs +PyObject_DelItem +PyObject_DelItemString +PyObject_Dir +PyObject_Format +PyObject_Free +PyObject_GC_Del +PyObject_GC_IsFinalized +PyObject_GC_IsTracked +PyObject_GC_Track +PyObject_GC_UnTrack +PyObject_GenericGetAttr +PyObject_GenericGetDict +PyObject_GenericSetAttr +PyObject_GenericSetDict +PyObject_GetAttr +PyObject_GetAttrString +PyObject_GetItem +PyObject_GetIter +PyObject_HasAttr +PyObject_HasAttrString +PyObject_Hash +PyObject_HashNotImplemented +PyObject_Init +PyObject_InitVar +PyObject_IsInstance +PyObject_IsSubclass +PyObject_IsTrue +PyObject_Length +PyObject_Malloc +PyObject_Not +PyObject_Realloc +PyObject_Repr +PyObject_RichCompare +PyObject_RichCompareBool +PyObject_SelfIter +PyObject_SetAttr +PyObject_SetAttrString +PyObject_SetItem +PyObject_Size +PyObject_Str +PyObject_Type +PyProperty_Type +PyRangeIter_Type +PyRange_Type +PyReversed_Type +PySeqIter_New +PySeqIter_Type +PySequence_Check +PySequence_Concat +PySequence_Contains +PySequence_Count +PySequence_DelItem +PySequence_DelSlice +PySequence_Fast +PySequence_GetItem +PySequence_GetSlice +PySequence_In +PySequence_InPlaceConcat +PySequence_InPlaceRepeat +PySequence_Index +PySequence_Length +PySequence_List +PySequence_Repeat +PySequence_SetItem +PySequence_SetSlice +PySequence_Size +PySequence_Tuple +PySetIter_Type +PySet_Add +PySet_Clear +PySet_Contains +PySet_Discard +PySet_New +PySet_Pop +PySet_Size +PySet_Type +PySlice_AdjustIndices +PySlice_GetIndices +PySlice_GetIndicesEx +PySlice_New +PySlice_Type +PySlice_Unpack +PyState_AddModule +PyState_FindModule +PyState_RemoveModule +PyStructSequence_GetItem +PyStructSequence_New +PyStructSequence_NewType +PyStructSequence_SetItem +PySuper_Type +PySys_AddWarnOption +PySys_AddWarnOptionUnicode +PySys_AddXOption +PySys_FormatStderr +PySys_FormatStdout +PySys_GetObject +PySys_GetXOptions +PySys_HasWarnOptions +PySys_ResetWarnOptions +PySys_SetArgv +PySys_SetArgvEx +PySys_SetObject +PySys_SetPath +PySys_WriteStderr +PySys_WriteStdout +PyThreadState_Clear +PyThreadState_Delete +PyThreadState_Get +PyThreadState_GetDict +PyThreadState_GetFrame +PyThreadState_GetID +PyThreadState_GetInterpreter +PyThreadState_New +PyThreadState_SetAsyncExc +PyThreadState_Swap +PyThread_GetInfo +PyThread_ReInitTLS +PyThread_acquire_lock +PyThread_acquire_lock_timed +PyThread_allocate_lock +PyThread_create_key +PyThread_delete_key +PyThread_delete_key_value +PyThread_exit_thread +PyThread_free_lock +PyThread_get_key_value +PyThread_get_stacksize +PyThread_get_thread_ident +PyThread_get_thread_native_id +PyThread_init_thread +PyThread_release_lock +PyThread_set_key_value +PyThread_set_stacksize +PyThread_start_new_thread +PyThread_tss_alloc +PyThread_tss_create +PyThread_tss_delete +PyThread_tss_free +PyThread_tss_get +PyThread_tss_is_created +PyThread_tss_set +PyTraceBack_Here +PyTraceBack_Print +PyTraceBack_Type +PyTupleIter_Type +PyTuple_GetItem +PyTuple_GetSlice +PyTuple_New +PyTuple_Pack +PyTuple_SetItem +PyTuple_Size +PyTuple_Type +PyType_ClearCache +PyType_FromModuleAndSpec +PyType_FromSpec +PyType_FromSpecWithBases +PyType_GenericAlloc +PyType_GenericNew +PyType_GetFlags +PyType_GetModule +PyType_GetModuleState +PyType_GetSlot +PyType_IsSubtype +PyType_Modified +PyType_Ready +PyType_Type +PyUnicodeDecodeError_Create +PyUnicodeDecodeError_GetEncoding +PyUnicodeDecodeError_GetEnd +PyUnicodeDecodeError_GetObject +PyUnicodeDecodeError_GetReason +PyUnicodeDecodeError_GetStart +PyUnicodeDecodeError_SetEnd +PyUnicodeDecodeError_SetReason +PyUnicodeDecodeError_SetStart +PyUnicodeEncodeError_GetEncoding +PyUnicodeEncodeError_GetEnd +PyUnicodeEncodeError_GetObject +PyUnicodeEncodeError_GetReason +PyUnicodeEncodeError_GetStart +PyUnicodeEncodeError_SetEnd +PyUnicodeEncodeError_SetReason +PyUnicodeEncodeError_SetStart +PyUnicodeIter_Type +PyUnicodeTranslateError_GetEnd +PyUnicodeTranslateError_GetObject +PyUnicodeTranslateError_GetReason +PyUnicodeTranslateError_GetStart +PyUnicodeTranslateError_SetEnd +PyUnicodeTranslateError_SetReason +PyUnicodeTranslateError_SetStart +PyUnicode_Append +PyUnicode_AppendAndDel +PyUnicode_AsASCIIString +PyUnicode_AsCharmapString +PyUnicode_AsDecodedObject +PyUnicode_AsDecodedUnicode +PyUnicode_AsEncodedObject +PyUnicode_AsEncodedString +PyUnicode_AsEncodedUnicode +PyUnicode_AsLatin1String +PyUnicode_AsRawUnicodeEscapeString +PyUnicode_AsUCS4 +PyUnicode_AsUCS4Copy +PyUnicode_AsUTF16String +PyUnicode_AsUTF32String +PyUnicode_AsUTF8AndSize +PyUnicode_AsUTF8String +PyUnicode_AsUnicodeEscapeString +PyUnicode_AsWideChar +PyUnicode_AsWideCharString +PyUnicode_BuildEncodingMap +PyUnicode_Compare +PyUnicode_CompareWithASCIIString +PyUnicode_Concat +PyUnicode_Contains +PyUnicode_Count +PyUnicode_Decode +PyUnicode_DecodeASCII +PyUnicode_DecodeCharmap +PyUnicode_DecodeFSDefault +PyUnicode_DecodeFSDefaultAndSize +PyUnicode_DecodeLatin1 +PyUnicode_DecodeLocale +PyUnicode_DecodeLocaleAndSize +PyUnicode_DecodeRawUnicodeEscape +PyUnicode_DecodeUTF16 +PyUnicode_DecodeUTF16Stateful +PyUnicode_DecodeUTF32 +PyUnicode_DecodeUTF32Stateful +PyUnicode_DecodeUTF7 +PyUnicode_DecodeUTF7Stateful +PyUnicode_DecodeUTF8 +PyUnicode_DecodeUTF8Stateful +PyUnicode_DecodeUnicodeEscape +PyUnicode_EncodeFSDefault +PyUnicode_EncodeLocale +PyUnicode_FSConverter +PyUnicode_FSDecoder +PyUnicode_Find +PyUnicode_FindChar +PyUnicode_Format +PyUnicode_FromEncodedObject +PyUnicode_FromFormat +PyUnicode_FromFormatV +PyUnicode_FromObject +PyUnicode_FromOrdinal +PyUnicode_FromString +PyUnicode_FromStringAndSize +PyUnicode_FromWideChar +PyUnicode_GetDefaultEncoding +PyUnicode_GetLength +PyUnicode_GetSize +PyUnicode_InternFromString +PyUnicode_InternImmortal +PyUnicode_InternInPlace +PyUnicode_IsIdentifier +PyUnicode_Join +PyUnicode_Partition +PyUnicode_RPartition +PyUnicode_RSplit +PyUnicode_ReadChar +PyUnicode_Replace +PyUnicode_Resize +PyUnicode_RichCompare +PyUnicode_Split +PyUnicode_Splitlines +PyUnicode_Substring +PyUnicode_Tailmatch +PyUnicode_Translate +PyUnicode_Type +PyUnicode_WriteChar +PyWeakref_GetObject +PyWeakref_NewProxy +PyWeakref_NewRef +PyWrapperDescr_Type +PyWrapper_New +PyZip_Type +Py_AddPendingCall +Py_AtExit +Py_BuildValue +Py_BytesMain +Py_CompileString +Py_DecRef +Py_DecodeLocale +Py_EncodeLocale +Py_EndInterpreter +Py_EnterRecursiveCall +Py_Exit +Py_FatalError +Py_FileSystemDefaultEncodeErrors +Py_FileSystemDefaultEncoding +Py_Finalize +Py_FinalizeEx +Py_GenericAlias +Py_GenericAliasType +Py_GetBuildInfo +Py_GetCompiler +Py_GetCopyright +Py_GetExecPrefix +Py_GetPath +Py_GetPlatform +Py_GetPrefix +Py_GetProgramFullPath +Py_GetProgramName +Py_GetPythonHome +Py_GetRecursionLimit +Py_GetVersion +Py_HasFileSystemDefaultEncoding +Py_IncRef +Py_Initialize +Py_InitializeEx +Py_IsInitialized +Py_LeaveRecursiveCall +Py_Main +Py_MakePendingCalls +Py_NewInterpreter +Py_NewRef +Py_ReprEnter +Py_ReprLeave +Py_SetPath +Py_SetProgramName +Py_SetPythonHome +Py_SetRecursionLimit +Py_SymtableString +Py_UTF8Mode +Py_VaBuildValue +Py_XNewRef diff --git a/Makefile.pre.in b/Makefile.pre.in index 082945f58a7779..f52a0f3cdf0d61 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -744,6 +744,13 @@ regen-importlib: Programs/_freeze_importlib $(UPDATE_FILE) $(srcdir)/Python/importlib_zipimport.h $(srcdir)/Python/importlib_zipimport.h.new +regen-limited-abi: all + @$(MKDIR_P) $(srcdir)/Doc/data/ + $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/stable_abi.py generate $(srcdir)/Doc/data/stable_abi.dat.new + $(UPDATE_FILE) $(srcdir)/Doc/data/stable_abi.dat \ + $(srcdir)/Doc/data/stable_abi.dat.new + + ############################################################################ # Regenerate all generated files @@ -1900,6 +1907,9 @@ funny: patchcheck: @DEF_MAKE_RULE@ $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py +check-limited-abi: all + $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/stable_abi.py check $(srcdir)/Doc/data/stable_abi.dat + # Dependencies Python/thread.o: @THREADHEADERS@ $(srcdir)/Python/condvar.h diff --git a/Tools/scripts/stable_abi.py b/Tools/scripts/stable_abi.py new file mode 100755 index 00000000000000..aa953b2dfde877 --- /dev/null +++ b/Tools/scripts/stable_abi.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python + +import argparse +import glob +import re +import pathlib +import subprocess +import sys +import sysconfig + +EXCLUDED_HEADERS = { + "bytes_methods.h", + "cellobject.h", + "classobject.h", + "code.h", + "compile.h", + "datetime.h", + "dtoa.h", + "frameobject.h", + "funcobject.h", + "genobject.h", + "longintrepr.h", + "parsetok.h", + "pyarena.h", + "pyatomic.h", + "pyctype.h", + "pydebug.h", + "pytime.h", + "symtable.h", + "token.h", + "ucnhash.h", +} + + +def get_exported_symbols(library, dynamic=False): + # Only look at dynamic symbols + args = ["nm", "--no-sort"] + if dynamic: + args.append("--dynamic") + args.append(library) + proc = subprocess.run(args, stdout=subprocess.PIPE, universal_newlines=True) + if proc.returncode: + sys.stdout.write(proc.stdout) + sys.exit(proc.returncode) + + stdout = proc.stdout.rstrip() + if not stdout: + raise Exception("command output is empty") + + for line in stdout.splitlines(): + # Split line '0000000000001b80 D PyTextIOWrapper_Type' + if not line: + continue + + parts = line.split(maxsplit=2) + if len(parts) < 3: + continue + + symbol = parts[-1] + yield symbol + + +def check_library(library, abi_funcs, dynamic=False): + available_symbols = set(get_exported_symbols(library, dynamic)) + missing_symbols = abi_funcs - available_symbols + if missing_symbols: + print( + f"Some symbols from the stable ABI are missing: {', '.join(missing_symbols)}" + ) + return 1 + return 0 + + +def generate_limited_api_symbols(args): + if hasattr(sys, "gettotalrefcount"): + print( + "Stable ABI symbols cannot be generated from a debug build", file=sys.stderr + ) + sys.exit(1) + library = sysconfig.get_config_var("LIBRARY") + ldlibrary = sysconfig.get_config_var("LDLIBRARY") + if ldlibrary != library: + raise Exception("Limited ABI symbols can only be generated from a static build") + available_symbols = { + symbol for symbol in get_exported_symbols(library) if symbol.startswith("Py") + } + + headers = [ + file + for file in pathlib.Path("Include").glob("*.h") + if file.name not in EXCLUDED_HEADERS + ] + stable_data, stable_exported_data, stable_functions = get_limited_api_definitions( + headers + ) + macros = get_limited_api_macros(headers) + + stable_symbols = { + symbol + for symbol in (stable_functions | stable_exported_data | stable_data | macros) + if symbol.startswith("Py") and symbol in available_symbols + } + with open(args.output_file, "w") as output_file: + output_file.write(f"# File generated by 'make regen-limited-abi'\n") + output_file.write( + f"# This is NOT an authoritative list of stable ABI symbols\n" + ) + for symbol in sorted(stable_symbols): + output_file.write(f"{symbol}\n") + sys.exit(0) + + +def get_limited_api_macros(headers): + """Run the preprocesor over all the header files in "Include" setting + "-DPy_LIMITED_API" to the correct value for the running version of the interpreter + and extracting all macro definitions (via adding -dM to the compiler arguments). + """ + + preprocesor_output_with_macros = subprocess.check_output( + sysconfig.get_config_var("CC").split() + + [ + # Prevent the expansion of the exported macros so we can capture them later + "-DSIZEOF_WCHAR_T=4", # The actual value is not important + f"-DPy_LIMITED_API={sys.version_info.major << 24 | sys.version_info.minor << 16}", + "-I.", + "-I./Include", + "-dM", + "-E", + ] + + [str(file) for file in headers], + text=True, + stderr=subprocess.DEVNULL, + ) + + return { + target + for _, target in re.findall( + r"#define (\w+)\s*(?:\(.*?\))?\s+(\w+)", preprocesor_output_with_macros + ) + } + + +def get_limited_api_definitions(headers): + """Run the preprocesor over all the header files in "Include" setting + "-DPy_LIMITED_API" to the correct value for the running version of the interpreter. + + The limited API symbols will be extracted from the output of this command as it includes + the prototypes and definitions of all the exported symbols that are in the limited api. + + This function does *NOT* extract the macros defined on the limited API + """ + preprocesor_output = subprocess.check_output( + sysconfig.get_config_var("CC").split() + + [ + # Prevent the expansion of the exported macros so we can capture them later + "-DPyAPI_FUNC=__PyAPI_FUNC", + "-DPyAPI_DATA=__PyAPI_DATA", + "-DEXPORT_DATA=__EXPORT_DATA", + "-D_Py_NO_RETURN=", + "-DSIZEOF_WCHAR_T=4", # The actual value is not important + f"-DPy_LIMITED_API={sys.version_info.major << 24 | sys.version_info.minor << 16}", + "-I.", + "-I./Include", + "-E", + ] + + [str(file) for file in headers], + text=True, + stderr=subprocess.DEVNULL, + ) + stable_functions = set( + re.findall(r"__PyAPI_FUNC\(.*?\)\s*(.*?)\s*\(", preprocesor_output) + ) + stable_exported_data = set( + re.findall(r"__EXPORT_DATA\((.*?)\)", preprocesor_output) + ) + stable_data = set( + re.findall(r"__PyAPI_DATA\(.*?\)\s*\(?(.*?)\)?\s*;", preprocesor_output) + ) + return stable_data, stable_exported_data, stable_functions + + +def check_symbols(parser_args): + with open(parser_args.stable_abi_file, "r") as filename: + abi_funcs = { + symbol + for symbol in filename.read().splitlines() + if symbol and not symbol.startswith("#") + } + + ret = 0 + # static library + LIBRARY = sysconfig.get_config_var("LIBRARY") + if not LIBRARY: + raise Exception("failed to get LIBRARY variable from sysconfig") + ret = check_library(LIBRARY, abi_funcs) + + # dynamic library + LDLIBRARY = sysconfig.get_config_var("LDLIBRARY") + if not LDLIBRARY: + raise Exception("failed to get LDLIBRARY variable from sysconfig") + if LDLIBRARY != LIBRARY: + ret |= check_library(LDLIBRARY, abi_funcs, dynamic=True) + + sys.exit(ret) + + +def main(): + parser = argparse.ArgumentParser(description="Process some integers.") + subparsers = parser.add_subparsers() + check_parser = subparsers.add_parser( + "check", help="Check the exported symbols against a given ABI file" + ) + check_parser.add_argument( + "stable_abi_file", type=str, help="File with the stable abi functions" + ) + check_parser.set_defaults(func=check_symbols) + generate_parser = subparsers.add_parser( + "generate", + help="Generate symbols from the header files and the exported symbols", + ) + generate_parser.add_argument( + "output_file", type=str, help="File to dump the symbols to" + ) + generate_parser.set_defaults(func=generate_limited_api_symbols) + args = parser.parse_args() + if "func" not in args: + parser.error("Either 'check' or 'generate' must be used") + sys.exit(1) + + args.func(args) + + +if __name__ == "__main__": + main() From aa6c9ad83050798d05316cf691f4ad2e5437b15b Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Fri, 4 Dec 2020 23:19:21 +0000 Subject: [PATCH 0721/1261] bpo-42545: Improve the error message in the stable API script (GH-23648) --- Tools/scripts/stable_abi.py | 62 ++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/Tools/scripts/stable_abi.py b/Tools/scripts/stable_abi.py index aa953b2dfde877..b3a46f985e0a2d 100755 --- a/Tools/scripts/stable_abi.py +++ b/Tools/scripts/stable_abi.py @@ -60,15 +60,33 @@ def get_exported_symbols(library, dynamic=False): yield symbol -def check_library(library, abi_funcs, dynamic=False): +def check_library(stable_abi_file, library, abi_funcs, dynamic=False): available_symbols = set(get_exported_symbols(library, dynamic)) missing_symbols = abi_funcs - available_symbols if missing_symbols: - print( - f"Some symbols from the stable ABI are missing: {', '.join(missing_symbols)}" + raise Exception( + f"""\ +Some symbols from the limited API are missing: {', '.join(missing_symbols)} + +This error means that there are some missing symbols among the ones exported +in the Python library ("libpythonx.x.a" or "libpythonx.x.so"). This normally +means that some symbol, function implementation or a prototype, belonging to +a symbol in the limited API has been deleted or is missing. + +Check if this was a mistake and if not, update the file containing the limited +API symbols. This file is located at: + +{stable_abi_file} + +You can read more about the limited API and its contracts at: + +https://docs.python.org/3/c-api/stable.html + +And in PEP 384: + +https://www.python.org/dev/peps/pep-0384/ +""" ) - return 1 - return 0 def generate_limited_api_symbols(args): @@ -107,7 +125,6 @@ def generate_limited_api_symbols(args): ) for symbol in sorted(stable_symbols): output_file.write(f"{symbol}\n") - sys.exit(0) def get_limited_api_macros(headers): @@ -187,21 +204,24 @@ def check_symbols(parser_args): if symbol and not symbol.startswith("#") } - ret = 0 - # static library - LIBRARY = sysconfig.get_config_var("LIBRARY") - if not LIBRARY: - raise Exception("failed to get LIBRARY variable from sysconfig") - ret = check_library(LIBRARY, abi_funcs) - - # dynamic library - LDLIBRARY = sysconfig.get_config_var("LDLIBRARY") - if not LDLIBRARY: - raise Exception("failed to get LDLIBRARY variable from sysconfig") - if LDLIBRARY != LIBRARY: - ret |= check_library(LDLIBRARY, abi_funcs, dynamic=True) - - sys.exit(ret) + try: + # static library + LIBRARY = sysconfig.get_config_var("LIBRARY") + if not LIBRARY: + raise Exception("failed to get LIBRARY variable from sysconfig") + check_library(parser_args.stable_abi_file, LIBRARY, abi_funcs) + + # dynamic library + LDLIBRARY = sysconfig.get_config_var("LDLIBRARY") + if not LDLIBRARY: + raise Exception("failed to get LDLIBRARY variable from sysconfig") + if LDLIBRARY != LIBRARY: + check_library( + parser_args.stable_abi_file, LDLIBRARY, abi_funcs, dynamic=True + ) + except Exception as e: + print(e, file=sys.stderr) + sys.exit(1) def main(): From 827db094ca012e301664ca1dbc43ff3664660569 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 4 Dec 2020 15:39:21 -0800 Subject: [PATCH 0722/1261] bpo-26131: Deprecate usage of load_module() (GH-23469) Raise an ImportWarning when the import system falls back on load_module(). As for implementations of load_module(), raise a DeprecationWarning. --- Doc/whatsnew/3.10.rst | 18 +- Lib/importlib/_abc.py | 1 + Lib/importlib/_bootstrap.py | 24 +- Lib/importlib/_bootstrap_external.py | 6 +- .../test_importlib/builtin/test_loader.py | 5 +- .../test_importlib/extension/test_loader.py | 44 +- Lib/test/test_importlib/frozen/test_loader.py | 20 +- .../test_importlib/import_/test___loader__.py | 39 +- .../import_/test___package__.py | 25 + Lib/test/test_importlib/import_/test_api.py | 31 + .../test_importlib/import_/test_caching.py | 39 +- .../test_importlib/import_/test_fromlist.py | 26 +- .../test_importlib/import_/test_meta_path.py | 14 +- Lib/test/test_importlib/test_abc.py | 84 +- Lib/test/test_importlib/test_api.py | 16 +- Lib/test/test_importlib/test_spec.py | 54 +- Lib/test/test_venv.py | 11 +- Lib/test/test_zipimport.py | 51 +- Lib/zipimport.py | 6 +- .../2020-10-22-17-27-08.bpo-26131.B-Veg7.rst | 2 + .../2020-10-22-17-26-35.bpo-26131.CAsI3O.rst | 2 + .../2020-11-22-12-30-26.bpo-26131.-HsFPG.rst | 1 + Python/importlib.h | 3590 +++++++++-------- Python/importlib_external.h | 170 +- Python/importlib_zipimport.h | 1998 ++++----- 25 files changed, 3244 insertions(+), 3033 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-22-17-27-08.bpo-26131.B-Veg7.rst create mode 100644 Misc/NEWS.d/next/Library/2020-10-22-17-26-35.bpo-26131.CAsI3O.rst create mode 100644 Misc/NEWS.d/next/Library/2020-11-22-12-30-26.bpo-26131.-HsFPG.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index a8f1080a504c70..019dd1817d2b63 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -394,7 +394,8 @@ Optimizations with ``gcc`` by up to 30%. See `this article `_ for more details. (Contributed by Victor Stinner and Pablo Galindo in - :issue:`38980`) + :issue:`38980`.) + * Function parameters and their annotations are no longer computed at runtime, but rather at compilation time. They are stored as a tuple of strings at the @@ -421,6 +422,21 @@ Deprecated as appropriate to help identify code which needs updating during this transition. +* The various ``load_module()`` methods of :mod:`importlib` have been + documented as deprecated since Python 3.6, but will now also trigger + a :exc:`DeprecationWarning`. Use + :meth:`~importlib.abc.Loader.exec_module` instead. + (Contributed by Brett Cannon in :issue:`26131`.) + +* :meth:`zimport.zipimporter.load_module` has been deprecated in + preference for :meth:`~zipimport.zipimporter.exec_module`. + (Contributed by Brett Cannon in :issue:`26131`.) + +* The use of :meth:`~importlib.abc.Loader.load_module` by the import + system now triggers an :exc:`ImportWarning` as + :meth:`~importlib.abc.Loader.exec_module` is preferred. + (Contributed by Brett Cannon in :issue:`26131`.) + * ``sqlite3.OptimizedUnicode`` has been undocumented and obsolete since Python 3.3, when it was made an alias to :class:`str`. It is now deprecated, scheduled for removal in Python 3.12. diff --git a/Lib/importlib/_abc.py b/Lib/importlib/_abc.py index fb5ec727cea6e4..7591946a4e76d3 100644 --- a/Lib/importlib/_abc.py +++ b/Lib/importlib/_abc.py @@ -35,6 +35,7 @@ def load_module(self, fullname): """ if not hasattr(self, 'exec_module'): raise ImportError + # Warning implemented in _load_module_shim(). return _bootstrap._load_module_shim(self, fullname) def module_repr(self, module): diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 9b7335b7b9c704..e4f893c38c1aad 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -20,6 +20,12 @@ # reference any injected objects! This includes not only global code but also # anything specified at the class level. +def _object_name(obj): + try: + return obj.__qualname__ + except AttributeError: + return type(obj).__qualname__ + # Bootstrap-related code ###################################################### # Modules injected manually by _setup() @@ -272,6 +278,9 @@ def _load_module_shim(self, fullname): This method is deprecated. Use loader.exec_module instead. """ + msg = ("the load_module() method is deprecated and slated for removal in " + "Python 3.12; use exec_module() instead") + _warnings.warn(msg, DeprecationWarning) spec = spec_from_loader(fullname, self) if fullname in sys.modules: module = sys.modules[fullname] @@ -612,9 +621,9 @@ def _exec(spec, module): else: _init_module_attrs(spec, module, override=True) if not hasattr(spec.loader, 'exec_module'): - # (issue19713) Once BuiltinImporter and ExtensionFileLoader - # have exec_module() implemented, we can add a deprecation - # warning here. + msg = (f"{_object_name(spec.loader)}.exec_module() not found; " + "falling back to load_module()") + _warnings.warn(msg, ImportWarning) spec.loader.load_module(name) else: spec.loader.exec_module(module) @@ -627,9 +636,8 @@ def _exec(spec, module): def _load_backward_compatible(spec): - # (issue19713) Once BuiltinImporter and ExtensionFileLoader - # have exec_module() implemented, we can add a deprecation - # warning here. + # It is assumed that all callers have been warned about using load_module() + # appropriately before calling this function. try: spec.loader.load_module(spec.name) except: @@ -668,6 +676,9 @@ def _load_unlocked(spec): if spec.loader is not None: # Not a namespace package. if not hasattr(spec.loader, 'exec_module'): + msg = (f"{_object_name(spec.loader)}.exec_module() not found; " + "falling back to load_module()") + _warnings.warn(msg, ImportWarning) return _load_backward_compatible(spec) module = module_from_spec(spec) @@ -851,6 +862,7 @@ def load_module(cls, fullname): This method is deprecated. Use exec_module() instead. """ + # Warning about deprecation implemented in _load_module_shim(). return _load_module_shim(cls, fullname) @classmethod diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index b8dd128238f033..d9e44df409062c 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -832,7 +832,8 @@ def exec_module(self, module): _bootstrap._call_with_frames_removed(exec, code, module.__dict__) def load_module(self, fullname): - """This module is deprecated.""" + """This method is deprecated.""" + # Warning implemented in _load_module_shim(). return _bootstrap._load_module_shim(self, fullname) @@ -1007,7 +1008,7 @@ def load_module(self, fullname): """ # The only reason for this method is for the name check. # Issue #14857: Avoid the zero-argument form of super so the implementation - # of that form can be updated without breaking the frozen module + # of that form can be updated without breaking the frozen module. return super(FileLoader, self).load_module(fullname) @_check_name @@ -1253,6 +1254,7 @@ def load_module(self, fullname): # The import system never calls this method. _bootstrap._verbose_message('namespace module loaded with path {!r}', self._path) + # Warning implemented in _load_module_shim(). return _bootstrap._load_module_shim(self, fullname) diff --git a/Lib/test/test_importlib/builtin/test_loader.py b/Lib/test/test_importlib/builtin/test_loader.py index b1349ec5da4678..f6b6d97cd5bcea 100644 --- a/Lib/test/test_importlib/builtin/test_loader.py +++ b/Lib/test/test_importlib/builtin/test_loader.py @@ -6,6 +6,7 @@ import sys import types import unittest +import warnings @unittest.skipIf(util.BUILTINS.good_name is None, 'no reasonable builtin module') class LoaderTests(abc.LoaderTests): @@ -24,7 +25,9 @@ def verify(self, module): self.assertIn(module.__name__, sys.modules) def load_module(self, name): - return self.machinery.BuiltinImporter.load_module(name) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + return self.machinery.BuiltinImporter.load_module(name) def test_module(self): # Common case. diff --git a/Lib/test/test_importlib/extension/test_loader.py b/Lib/test/test_importlib/extension/test_loader.py index abd612fcd9bec1..22cf2dac5f8685 100644 --- a/Lib/test/test_importlib/extension/test_loader.py +++ b/Lib/test/test_importlib/extension/test_loader.py @@ -1,3 +1,4 @@ +from warnings import catch_warnings from .. import abc from .. import util @@ -7,6 +8,7 @@ import sys import types import unittest +import warnings import importlib.util import importlib from test.support.script_helper import assert_python_failure @@ -20,14 +22,18 @@ def setUp(self): util.EXTENSIONS.file_path) def load_module(self, fullname): - return self.loader.load_module(fullname) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + return self.loader.load_module(fullname) def test_load_module_API(self): # Test the default argument for load_module(). - self.loader.load_module() - self.loader.load_module(None) - with self.assertRaises(ImportError): - self.load_module('XXX') + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + self.loader.load_module() + self.loader.load_module(None) + with self.assertRaises(ImportError): + self.load_module('XXX') def test_equality(self): other = self.machinery.ExtensionFileLoader(util.EXTENSIONS.name, @@ -94,6 +100,21 @@ def setUp(self): self.loader = self.machinery.ExtensionFileLoader( self.name, self.spec.origin) + def load_module(self): + '''Load the module from the test extension''' + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + return self.loader.load_module(self.name) + + def load_module_by_name(self, fullname): + '''Load a module from the test extension by name''' + origin = self.spec.origin + loader = self.machinery.ExtensionFileLoader(fullname, origin) + spec = importlib.util.spec_from_loader(fullname, loader) + module = importlib.util.module_from_spec(spec) + loader.exec_module(module) + return module + # No extension module as __init__ available for testing. test_package = None @@ -157,19 +178,6 @@ def test_try_registration(self): with self.assertRaises(SystemError): module.call_state_registration_func(2) - def load_module(self): - '''Load the module from the test extension''' - return self.loader.load_module(self.name) - - def load_module_by_name(self, fullname): - '''Load a module from the test extension by name''' - origin = self.spec.origin - loader = self.machinery.ExtensionFileLoader(fullname, origin) - spec = importlib.util.spec_from_loader(fullname, loader) - module = importlib.util.module_from_spec(spec) - loader.exec_module(module) - return module - def test_load_submodule(self): '''Test loading a simulated submodule''' module = self.load_module_by_name('pkg.' + self.name) diff --git a/Lib/test/test_importlib/frozen/test_loader.py b/Lib/test/test_importlib/frozen/test_loader.py index 29ecff17740210..8eaffa798a5b7a 100644 --- a/Lib/test/test_importlib/frozen/test_loader.py +++ b/Lib/test/test_importlib/frozen/test_loader.py @@ -161,19 +161,23 @@ def test_module_repr(self): "") def test_module_repr_indirect(self): - with util.uncache('__hello__'), captured_stdout(): - module = self.machinery.FrozenImporter.load_module('__hello__') - self.assertEqual(repr(module), - "") + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + with util.uncache('__hello__'), captured_stdout(): + module = self.machinery.FrozenImporter.load_module('__hello__') + self.assertEqual(repr(module), + "") # No way to trigger an error in a frozen module. test_state_after_failure = None def test_unloadable(self): - assert self.machinery.FrozenImporter.find_module('_not_real') is None - with self.assertRaises(ImportError) as cm: - self.machinery.FrozenImporter.load_module('_not_real') - self.assertEqual(cm.exception.name, '_not_real') + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + assert self.machinery.FrozenImporter.find_module('_not_real') is None + with self.assertRaises(ImportError) as cm: + self.machinery.FrozenImporter.load_module('_not_real') + self.assertEqual(cm.exception.name, '_not_real') (Frozen_LoaderTests, diff --git a/Lib/test/test_importlib/import_/test___loader__.py b/Lib/test/test_importlib/import_/test___loader__.py index 4b18093cf903fa..ecd83c6567e709 100644 --- a/Lib/test/test_importlib/import_/test___loader__.py +++ b/Lib/test/test_importlib/import_/test___loader__.py @@ -2,6 +2,7 @@ import sys import types import unittest +import warnings from .. import util @@ -45,25 +46,29 @@ def load_module(self, fullname): class LoaderAttributeTests: def test___loader___missing(self): - module = types.ModuleType('blah') - try: - del module.__loader__ - except AttributeError: - pass - loader = LoaderMock() - loader.module = module - with util.uncache('blah'), util.import_state(meta_path=[loader]): - module = self.__import__('blah') - self.assertEqual(loader, module.__loader__) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + module = types.ModuleType('blah') + try: + del module.__loader__ + except AttributeError: + pass + loader = LoaderMock() + loader.module = module + with util.uncache('blah'), util.import_state(meta_path=[loader]): + module = self.__import__('blah') + self.assertEqual(loader, module.__loader__) def test___loader___is_None(self): - module = types.ModuleType('blah') - module.__loader__ = None - loader = LoaderMock() - loader.module = module - with util.uncache('blah'), util.import_state(meta_path=[loader]): - returned_module = self.__import__('blah') - self.assertEqual(loader, module.__loader__) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + module = types.ModuleType('blah') + module.__loader__ = None + loader = LoaderMock() + loader.module = module + with util.uncache('blah'), util.import_state(meta_path=[loader]): + returned_module = self.__import__('blah') + self.assertEqual(loader, module.__loader__) (Frozen_Tests, diff --git a/Lib/test/test_importlib/import_/test___package__.py b/Lib/test/test_importlib/import_/test___package__.py index 761b256b387885..4a2b34e5f67f2c 100644 --- a/Lib/test/test_importlib/import_/test___package__.py +++ b/Lib/test/test_importlib/import_/test___package__.py @@ -98,6 +98,16 @@ def __init__(self, parent): class Using__package__PEP302(Using__package__): mock_modules = util.mock_modules + def test_using___package__(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_using___package__() + + def test_spec_fallback(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_spec_fallback() + (Frozen_UsingPackagePEP302, Source_UsingPackagePEP302 @@ -155,6 +165,21 @@ def test_submodule(self): class Setting__package__PEP302(Setting__package__, unittest.TestCase): mock_modules = util.mock_modules + def test_top_level(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_top_level() + + def test_package(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_package() + + def test_submodule(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_submodule() + class Setting__package__PEP451(Setting__package__, unittest.TestCase): mock_modules = util.mock_spec diff --git a/Lib/test/test_importlib/import_/test_api.py b/Lib/test/test_importlib/import_/test_api.py index 0cd9de4daff752..35c26977ea3156 100644 --- a/Lib/test/test_importlib/import_/test_api.py +++ b/Lib/test/test_importlib/import_/test_api.py @@ -4,6 +4,7 @@ import sys import types import unittest +import warnings PKG_NAME = 'fine' SUBMOD_NAME = 'fine.bogus' @@ -100,6 +101,36 @@ def test_blocked_fromlist(self): class OldAPITests(APITest): bad_finder_loader = BadLoaderFinder + def test_raises_ModuleNotFoundError(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_raises_ModuleNotFoundError() + + def test_name_requires_rparition(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_name_requires_rparition() + + def test_negative_level(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_negative_level() + + def test_nonexistent_fromlist_entry(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_nonexistent_fromlist_entry() + + def test_fromlist_load_error_propagates(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_fromlist_load_error_propagates + + def test_blocked_fromlist(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_blocked_fromlist() + (Frozen_OldAPITests, Source_OldAPITests diff --git a/Lib/test/test_importlib/import_/test_caching.py b/Lib/test/test_importlib/import_/test_caching.py index 8079add5b2147d..0f987b22100c91 100644 --- a/Lib/test/test_importlib/import_/test_caching.py +++ b/Lib/test/test_importlib/import_/test_caching.py @@ -3,6 +3,7 @@ import sys from types import MethodType import unittest +import warnings class UseCache: @@ -63,30 +64,36 @@ def load_module(self, fullname): # to when to use the module in sys.modules and when not to. def test_using_cache_after_loader(self): # [from cache on return] - with self.create_mock('module') as mock: - with util.import_state(meta_path=[mock]): - module = self.__import__('module') - self.assertEqual(id(module), id(sys.modules['module'])) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + with self.create_mock('module') as mock: + with util.import_state(meta_path=[mock]): + module = self.__import__('module') + self.assertEqual(id(module), id(sys.modules['module'])) # See test_using_cache_after_loader() for reasoning. def test_using_cache_for_assigning_to_attribute(self): # [from cache to attribute] - with self.create_mock('pkg.__init__', 'pkg.module') as importer: - with util.import_state(meta_path=[importer]): - module = self.__import__('pkg.module') - self.assertTrue(hasattr(module, 'module')) - self.assertEqual(id(module.module), - id(sys.modules['pkg.module'])) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + with self.create_mock('pkg.__init__', 'pkg.module') as importer: + with util.import_state(meta_path=[importer]): + module = self.__import__('pkg.module') + self.assertTrue(hasattr(module, 'module')) + self.assertEqual(id(module.module), + id(sys.modules['pkg.module'])) # See test_using_cache_after_loader() for reasoning. def test_using_cache_for_fromlist(self): # [from cache for fromlist] - with self.create_mock('pkg.__init__', 'pkg.module') as importer: - with util.import_state(meta_path=[importer]): - module = self.__import__('pkg', fromlist=['module']) - self.assertTrue(hasattr(module, 'module')) - self.assertEqual(id(module.module), - id(sys.modules['pkg.module'])) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + with self.create_mock('pkg.__init__', 'pkg.module') as importer: + with util.import_state(meta_path=[importer]): + module = self.__import__('pkg', fromlist=['module']) + self.assertTrue(hasattr(module, 'module')) + self.assertEqual(id(module.module), + id(sys.modules['pkg.module'])) if __name__ == '__main__': diff --git a/Lib/test/test_importlib/import_/test_fromlist.py b/Lib/test/test_importlib/import_/test_fromlist.py index 018c1721761904..deb21710a61fae 100644 --- a/Lib/test/test_importlib/import_/test_fromlist.py +++ b/Lib/test/test_importlib/import_/test_fromlist.py @@ -24,7 +24,7 @@ def test_return_from_import(self): def test_return_from_from_import(self): # [from return] - with util.mock_modules('pkg.__init__', 'pkg.module')as importer: + with util.mock_spec('pkg.__init__', 'pkg.module')as importer: with util.import_state(meta_path=[importer]): module = self.__import__('pkg.module', fromlist=['attr']) self.assertEqual(module.__name__, 'pkg.module') @@ -52,14 +52,14 @@ class HandlingFromlist: def test_object(self): # [object case] - with util.mock_modules('module') as importer: + with util.mock_spec('module') as importer: with util.import_state(meta_path=[importer]): module = self.__import__('module', fromlist=['attr']) self.assertEqual(module.__name__, 'module') def test_nonexistent_object(self): # [bad object] - with util.mock_modules('module') as importer: + with util.mock_spec('module') as importer: with util.import_state(meta_path=[importer]): module = self.__import__('module', fromlist=['non_existent']) self.assertEqual(module.__name__, 'module') @@ -67,7 +67,7 @@ def test_nonexistent_object(self): def test_module_from_package(self): # [module] - with util.mock_modules('pkg.__init__', 'pkg.module') as importer: + with util.mock_spec('pkg.__init__', 'pkg.module') as importer: with util.import_state(meta_path=[importer]): module = self.__import__('pkg', fromlist=['module']) self.assertEqual(module.__name__, 'pkg') @@ -75,7 +75,7 @@ def test_module_from_package(self): self.assertEqual(module.module.__name__, 'pkg.module') def test_nonexistent_from_package(self): - with util.mock_modules('pkg.__init__') as importer: + with util.mock_spec('pkg.__init__') as importer: with util.import_state(meta_path=[importer]): module = self.__import__('pkg', fromlist=['non_existent']) self.assertEqual(module.__name__, 'pkg') @@ -87,7 +87,7 @@ def test_module_from_package_triggers_ModuleNotFoundError(self): # ModuleNotFoundError propagate. def module_code(): import i_do_not_exist - with util.mock_modules('pkg.__init__', 'pkg.mod', + with util.mock_spec('pkg.__init__', 'pkg.mod', module_code={'pkg.mod': module_code}) as importer: with util.import_state(meta_path=[importer]): with self.assertRaises(ModuleNotFoundError) as exc: @@ -95,14 +95,14 @@ def module_code(): self.assertEqual('i_do_not_exist', exc.exception.name) def test_empty_string(self): - with util.mock_modules('pkg.__init__', 'pkg.mod') as importer: + with util.mock_spec('pkg.__init__', 'pkg.mod') as importer: with util.import_state(meta_path=[importer]): module = self.__import__('pkg.mod', fromlist=['']) self.assertEqual(module.__name__, 'pkg.mod') def basic_star_test(self, fromlist=['*']): # [using *] - with util.mock_modules('pkg.__init__', 'pkg.module') as mock: + with util.mock_spec('pkg.__init__', 'pkg.module') as mock: with util.import_state(meta_path=[mock]): mock['pkg'].__all__ = ['module'] module = self.__import__('pkg', fromlist=fromlist) @@ -119,7 +119,7 @@ def test_fromlist_as_tuple(self): def test_star_with_others(self): # [using * with others] - context = util.mock_modules('pkg.__init__', 'pkg.module1', 'pkg.module2') + context = util.mock_spec('pkg.__init__', 'pkg.module1', 'pkg.module2') with context as mock: with util.import_state(meta_path=[mock]): mock['pkg'].__all__ = ['module1'] @@ -131,7 +131,7 @@ def test_star_with_others(self): self.assertEqual(module.module2.__name__, 'pkg.module2') def test_nonexistent_in_all(self): - with util.mock_modules('pkg.__init__') as importer: + with util.mock_spec('pkg.__init__') as importer: with util.import_state(meta_path=[importer]): importer['pkg'].__all__ = ['non_existent'] module = self.__import__('pkg', fromlist=['*']) @@ -139,7 +139,7 @@ def test_nonexistent_in_all(self): self.assertFalse(hasattr(module, 'non_existent')) def test_star_in_all(self): - with util.mock_modules('pkg.__init__') as importer: + with util.mock_spec('pkg.__init__') as importer: with util.import_state(meta_path=[importer]): importer['pkg'].__all__ = ['*'] module = self.__import__('pkg', fromlist=['*']) @@ -147,7 +147,7 @@ def test_star_in_all(self): self.assertFalse(hasattr(module, '*')) def test_invalid_type(self): - with util.mock_modules('pkg.__init__') as importer: + with util.mock_spec('pkg.__init__') as importer: with util.import_state(meta_path=[importer]), \ warnings.catch_warnings(): warnings.simplefilter('error', BytesWarning) @@ -157,7 +157,7 @@ def test_invalid_type(self): self.__import__('pkg', fromlist=iter([b'attr'])) def test_invalid_type_in_all(self): - with util.mock_modules('pkg.__init__') as importer: + with util.mock_spec('pkg.__init__') as importer: with util.import_state(meta_path=[importer]), \ warnings.catch_warnings(): warnings.simplefilter('error', BytesWarning) diff --git a/Lib/test/test_importlib/import_/test_meta_path.py b/Lib/test/test_importlib/import_/test_meta_path.py index 5a41e8968a21fc..5730119fe9933b 100644 --- a/Lib/test/test_importlib/import_/test_meta_path.py +++ b/Lib/test/test_importlib/import_/test_meta_path.py @@ -100,8 +100,20 @@ def test_with_path(self): self.assertEqual(args[0], mod_name) self.assertIs(args[1], path) +class CallSignoreSuppressImportWarning(CallSignature): -class CallSignaturePEP302(CallSignature): + def test_no_path(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_no_path() + + def test_with_path(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + super().test_no_path() + + +class CallSignaturePEP302(CallSignoreSuppressImportWarning): mock_modules = util.mock_modules finder_name = 'find_module' diff --git a/Lib/test/test_importlib/test_abc.py b/Lib/test/test_importlib/test_abc.py index 605738fae2e378..d8b9fc89f29aa6 100644 --- a/Lib/test/test_importlib/test_abc.py +++ b/Lib/test/test_importlib/test_abc.py @@ -458,32 +458,36 @@ def is_package(self, fullname): return SpecLoader() def test_fresh(self): - loader = self.loader() - name = 'blah' - with test_util.uncache(name): - loader.load_module(name) - module = loader.found - self.assertIs(sys.modules[name], module) - self.assertEqual(loader, module.__loader__) - self.assertEqual(loader, module.__spec__.loader) - self.assertEqual(name, module.__name__) - self.assertEqual(name, module.__spec__.name) - self.assertIsNotNone(module.__path__) - self.assertIsNotNone(module.__path__, - module.__spec__.submodule_search_locations) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + loader = self.loader() + name = 'blah' + with test_util.uncache(name): + loader.load_module(name) + module = loader.found + self.assertIs(sys.modules[name], module) + self.assertEqual(loader, module.__loader__) + self.assertEqual(loader, module.__spec__.loader) + self.assertEqual(name, module.__name__) + self.assertEqual(name, module.__spec__.name) + self.assertIsNotNone(module.__path__) + self.assertIsNotNone(module.__path__, + module.__spec__.submodule_search_locations) def test_reload(self): - name = 'blah' - loader = self.loader() - module = types.ModuleType(name) - module.__spec__ = self.util.spec_from_loader(name, loader) - module.__loader__ = loader - with test_util.uncache(name): - sys.modules[name] = module - loader.load_module(name) - found = loader.found - self.assertIs(found, sys.modules[name]) - self.assertIs(module, sys.modules[name]) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + name = 'blah' + loader = self.loader() + module = types.ModuleType(name) + module.__spec__ = self.util.spec_from_loader(name, loader) + module.__loader__ = loader + with test_util.uncache(name): + sys.modules[name] = module + loader.load_module(name) + found = loader.found + self.assertIs(found, sys.modules[name]) + self.assertIs(module, sys.modules[name]) (Frozen_LoaderLoadModuleTests, @@ -837,25 +841,29 @@ def test_load_module(self): # Loading a module should set __name__, __loader__, __package__, # __path__ (for packages), __file__, and __cached__. # The module should also be put into sys.modules. - with test_util.uncache(self.name): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - module = self.loader.load_module(self.name) - self.verify_module(module) - self.assertEqual(module.__path__, [os.path.dirname(self.path)]) - self.assertIn(self.name, sys.modules) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + with test_util.uncache(self.name): + with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) + module = self.loader.load_module(self.name) + self.verify_module(module) + self.assertEqual(module.__path__, [os.path.dirname(self.path)]) + self.assertIn(self.name, sys.modules) def test_package_settings(self): # __package__ needs to be set, while __path__ is set on if the module # is a package. # Testing the values for a package are covered by test_load_module. - self.setUp(is_package=False) - with test_util.uncache(self.name): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - module = self.loader.load_module(self.name) - self.verify_module(module) - self.assertFalse(hasattr(module, '__path__')) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + self.setUp(is_package=False) + with test_util.uncache(self.name): + with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) + module = self.loader.load_module(self.name) + self.verify_module(module) + self.assertFalse(hasattr(module, '__path__')) def test_get_source_encoding(self): # Source is considered encoded in UTF-8 by default unless otherwise diff --git a/Lib/test/test_importlib/test_api.py b/Lib/test/test_importlib/test_api.py index fd60634e093339..3f06a10ba9c5ed 100644 --- a/Lib/test/test_importlib/test_api.py +++ b/Lib/test/test_importlib/test_api.py @@ -20,7 +20,7 @@ class ImportModuleTests: def test_module_import(self): # Test importing a top-level module. - with test_util.mock_modules('top_level') as mock: + with test_util.mock_spec('top_level') as mock: with test_util.import_state(meta_path=[mock]): module = self.init.import_module('top_level') self.assertEqual(module.__name__, 'top_level') @@ -30,7 +30,7 @@ def test_absolute_package_import(self): pkg_name = 'pkg' pkg_long_name = '{0}.__init__'.format(pkg_name) name = '{0}.mod'.format(pkg_name) - with test_util.mock_modules(pkg_long_name, name) as mock: + with test_util.mock_spec(pkg_long_name, name) as mock: with test_util.import_state(meta_path=[mock]): module = self.init.import_module(name) self.assertEqual(module.__name__, name) @@ -42,7 +42,7 @@ def test_shallow_relative_package_import(self): module_name = 'mod' absolute_name = '{0}.{1}'.format(pkg_name, module_name) relative_name = '.{0}'.format(module_name) - with test_util.mock_modules(pkg_long_name, absolute_name) as mock: + with test_util.mock_spec(pkg_long_name, absolute_name) as mock: with test_util.import_state(meta_path=[mock]): self.init.import_module(pkg_name) module = self.init.import_module(relative_name, pkg_name) @@ -50,7 +50,7 @@ def test_shallow_relative_package_import(self): def test_deep_relative_package_import(self): modules = ['a.__init__', 'a.b.__init__', 'a.c'] - with test_util.mock_modules(*modules) as mock: + with test_util.mock_spec(*modules) as mock: with test_util.import_state(meta_path=[mock]): self.init.import_module('a') self.init.import_module('a.b') @@ -63,7 +63,7 @@ def test_absolute_import_with_package(self): pkg_name = 'pkg' pkg_long_name = '{0}.__init__'.format(pkg_name) name = '{0}.mod'.format(pkg_name) - with test_util.mock_modules(pkg_long_name, name) as mock: + with test_util.mock_spec(pkg_long_name, name) as mock: with test_util.import_state(meta_path=[mock]): self.init.import_module(pkg_name) module = self.init.import_module(name, pkg_name) @@ -88,7 +88,7 @@ def load_b(): b_load_count += 1 code = {'a': load_a, 'a.b': load_b} modules = ['a.__init__', 'a.b'] - with test_util.mock_modules(*modules, module_code=code) as mock: + with test_util.mock_spec(*modules, module_code=code) as mock: with test_util.import_state(meta_path=[mock]): self.init.import_module('a.b') self.assertEqual(b_load_count, 1) @@ -212,8 +212,8 @@ def code(): module = type(sys)('top_level') module.spam = 3 sys.modules['top_level'] = module - mock = test_util.mock_modules('top_level', - module_code={'top_level': code}) + mock = test_util.mock_spec('top_level', + module_code={'top_level': code}) with mock: with test_util.import_state(meta_path=[mock]): module = self.init.import_module('top_level') diff --git a/Lib/test/test_importlib/test_spec.py b/Lib/test/test_importlib/test_spec.py index eed90f29f9286c..b57eb6c0ff3974 100644 --- a/Lib/test/test_importlib/test_spec.py +++ b/Lib/test/test_importlib/test_spec.py @@ -303,32 +303,38 @@ def exec_module(self, module): self.assertNotIn(self.spec.name, sys.modules) def test_load_legacy(self): - self.spec.loader = LegacyLoader() - with CleanImport(self.spec.name): - loaded = self.bootstrap._load(self.spec) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + self.spec.loader = LegacyLoader() + with CleanImport(self.spec.name): + loaded = self.bootstrap._load(self.spec) - self.assertEqual(loaded.ham, -1) + self.assertEqual(loaded.ham, -1) def test_load_legacy_attributes(self): - self.spec.loader = LegacyLoader() - with CleanImport(self.spec.name): - loaded = self.bootstrap._load(self.spec) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + self.spec.loader = LegacyLoader() + with CleanImport(self.spec.name): + loaded = self.bootstrap._load(self.spec) - self.assertIs(loaded.__loader__, self.spec.loader) - self.assertEqual(loaded.__package__, self.spec.parent) - self.assertIs(loaded.__spec__, self.spec) + self.assertIs(loaded.__loader__, self.spec.loader) + self.assertEqual(loaded.__package__, self.spec.parent) + self.assertIs(loaded.__spec__, self.spec) def test_load_legacy_attributes_immutable(self): module = object() - class ImmutableLoader(TestLoader): - def load_module(self, name): - sys.modules[name] = module - return module - self.spec.loader = ImmutableLoader() - with CleanImport(self.spec.name): - loaded = self.bootstrap._load(self.spec) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + class ImmutableLoader(TestLoader): + def load_module(self, name): + sys.modules[name] = module + return module + self.spec.loader = ImmutableLoader() + with CleanImport(self.spec.name): + loaded = self.bootstrap._load(self.spec) - self.assertIs(sys.modules[self.spec.name], module) + self.assertIs(sys.modules[self.spec.name], module) # reload() @@ -382,11 +388,13 @@ def test_reload_init_module_attrs(self): self.assertFalse(hasattr(loaded, '__cached__')) def test_reload_legacy(self): - self.spec.loader = LegacyLoader() - with CleanImport(self.spec.name): - loaded = self.bootstrap._load(self.spec) - reloaded = self.bootstrap._exec(self.spec, loaded) - installed = sys.modules[self.spec.name] + with warnings.catch_warnings(): + warnings.simplefilter("ignore", ImportWarning) + self.spec.loader = LegacyLoader() + with CleanImport(self.spec.name): + loaded = self.bootstrap._load(self.spec) + reloaded = self.bootstrap._exec(self.spec, loaded) + installed = sys.modules[self.spec.name] self.assertEqual(loaded.ham, -1) self.assertIs(reloaded, loaded) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 5bb62cdb374024..098ba17af59758 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -446,7 +446,7 @@ def do_test_with_pip(self, system_site_packages): # pip's cross-version compatibility may trigger deprecation # warnings in current versions of Python. Ensure related # environment settings don't cause venv to fail. - envvars["PYTHONWARNINGS"] = "e" + envvars["PYTHONWARNINGS"] = "ignore" # ensurepip is different enough from a normal pip invocation # that we want to ensure it ignores the normal pip environment # variable settings. We set PIP_NO_INSTALL here specifically @@ -485,7 +485,8 @@ def do_test_with_pip(self, system_site_packages): # Ensure pip is available in the virtual environment envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe) # Ignore DeprecationWarning since pip code is not part of Python - out, err = check_output([envpy, '-W', 'ignore::DeprecationWarning', '-I', + out, err = check_output([envpy, '-W', 'ignore::DeprecationWarning', + '-W', 'ignore::ImportWarning', '-I', '-m', 'pip', '--version']) # We force everything to text, so unittest gives the detailed diff # if we get unexpected results @@ -501,8 +502,12 @@ def do_test_with_pip(self, system_site_packages): # Check the private uninstall command provided for the Windows # installers works (at least in a virtual environment) with EnvironmentVarGuard() as envvars: + # It seems ensurepip._uninstall calls subprocesses which do not + # inherit the interpreter settings. + envvars["PYTHONWARNINGS"] = "ignore" out, err = check_output([envpy, - '-W', 'ignore::DeprecationWarning', '-I', + '-W', 'ignore::DeprecationWarning', + '-W', 'ignore::ImportWarning', '-I', '-m', 'ensurepip._uninstall']) # We force everything to text, so unittest gives the detailed diff # if we get unexpected results diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index be0a198010cec1..6dea2b16287ad4 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -7,6 +7,7 @@ import time import unittest import unittest.mock +import warnings from test import support from test.support import import_helper @@ -453,15 +454,17 @@ def testZipImporterMethods(self): self.assertTrue(zi.is_package(TESTPACK)) # PEP 302 - find_mod = zi.find_module('spam') - self.assertIsNotNone(find_mod) - self.assertIsInstance(find_mod, zipimport.zipimporter) - self.assertFalse(find_mod.is_package('spam')) - load_mod = find_mod.load_module('spam') - self.assertEqual(find_mod.get_filename('spam'), load_mod.__file__) - - mod = zi.load_module(TESTPACK) - self.assertEqual(zi.get_filename(TESTPACK), mod.__file__) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + find_mod = zi.find_module('spam') + self.assertIsNotNone(find_mod) + self.assertIsInstance(find_mod, zipimport.zipimporter) + self.assertFalse(find_mod.is_package('spam')) + load_mod = find_mod.load_module('spam') + self.assertEqual(find_mod.get_filename('spam'), load_mod.__file__) + + mod = zi.load_module(TESTPACK) + self.assertEqual(zi.get_filename(TESTPACK), mod.__file__) # PEP 451 spec = zi.find_spec('spam') @@ -522,8 +525,10 @@ def testZipImporterMethodsInSubDirectory(self): self.assertEqual(zi.prefix, packdir) self.assertTrue(zi.is_package(TESTPACK2)) # PEP 302 - mod = zi.load_module(TESTPACK2) - self.assertEqual(zi.get_filename(TESTPACK2), mod.__file__) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + mod = zi.load_module(TESTPACK2) + self.assertEqual(zi.get_filename(TESTPACK2), mod.__file__) # PEP 451 spec = zi.find_spec(TESTPACK2) mod = importlib.util.module_from_spec(spec) @@ -536,13 +541,15 @@ def testZipImporterMethodsInSubDirectory(self): pkg_path = TEMP_ZIP + os.sep + packdir + TESTPACK2 zi2 = zipimport.zipimporter(pkg_path) # PEP 302 - find_mod_dotted = zi2.find_module(TESTMOD) - self.assertIsNotNone(find_mod_dotted) - self.assertIsInstance(find_mod_dotted, zipimport.zipimporter) - self.assertFalse(zi2.is_package(TESTMOD)) - load_mod = find_mod_dotted.load_module(TESTMOD) - self.assertEqual( - find_mod_dotted.get_filename(TESTMOD), load_mod.__file__) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + find_mod_dotted = zi2.find_module(TESTMOD) + self.assertIsNotNone(find_mod_dotted) + self.assertIsInstance(find_mod_dotted, zipimport.zipimporter) + self.assertFalse(zi2.is_package(TESTMOD)) + load_mod = find_mod_dotted.load_module(TESTMOD) + self.assertEqual( + find_mod_dotted.get_filename(TESTMOD), load_mod.__file__) # PEP 451 spec = zi2.find_spec(TESTMOD) @@ -778,10 +785,12 @@ def _testBogusZipFile(self): z = zipimport.zipimporter(TESTMOD) try: + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + self.assertRaises(TypeError, z.load_module, None) self.assertRaises(TypeError, z.find_module, None) self.assertRaises(TypeError, z.find_spec, None) self.assertRaises(TypeError, z.exec_module, None) - self.assertRaises(TypeError, z.load_module, None) self.assertRaises(TypeError, z.is_package, None) self.assertRaises(TypeError, z.get_code, None) self.assertRaises(TypeError, z.get_data, None) @@ -791,7 +800,9 @@ def _testBogusZipFile(self): self.assertIsNone(z.find_module('abc')) self.assertIsNone(z.find_spec('abc')) - self.assertRaises(error, z.load_module, 'abc') + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + self.assertRaises(error, z.load_module, 'abc') self.assertRaises(error, z.get_code, 'abc') self.assertRaises(OSError, z.get_data, 'abc') self.assertRaises(error, z.get_source, 'abc') diff --git a/Lib/zipimport.py b/Lib/zipimport.py index 2e5188a4a0aa54..02e4fd38d0e2a2 100644 --- a/Lib/zipimport.py +++ b/Lib/zipimport.py @@ -22,6 +22,7 @@ import marshal # for loads import sys # for modules import time # for mktime +import _warnings # For warn() __all__ = ['ZipImportError', 'zipimporter'] @@ -268,8 +269,11 @@ def load_module(self, fullname): fully qualified (dotted) module name. It returns the imported module, or raises ZipImportError if it wasn't found. - Deprecated since Python 3.10. use exec_module() instead. + Deprecated since Python 3.10. Use exec_module() instead. """ + msg = ("zipimport.zipimporter.load_module() is deprecated and slated for " + "removal in Python 3.12; use exec_module() instead") + _warnings.warn(msg, DeprecationWarning) code, ispackage, modpath = _get_module_code(self, fullname) mod = sys.modules.get(fullname) if mod is None or not isinstance(mod, _module_type): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-22-17-27-08.bpo-26131.B-Veg7.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-22-17-27-08.bpo-26131.B-Veg7.rst new file mode 100644 index 00000000000000..e9f44c7c3aa9f7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-22-17-27-08.bpo-26131.B-Veg7.rst @@ -0,0 +1,2 @@ +The import system triggers a `ImportWarning` when it falls back to using +`load_module()`. diff --git a/Misc/NEWS.d/next/Library/2020-10-22-17-26-35.bpo-26131.CAsI3O.rst b/Misc/NEWS.d/next/Library/2020-10-22-17-26-35.bpo-26131.CAsI3O.rst new file mode 100644 index 00000000000000..bead284bde4eb5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-22-17-26-35.bpo-26131.CAsI3O.rst @@ -0,0 +1,2 @@ +The `load_module()` methods found in importlib now trigger a +DeprecationWarning. diff --git a/Misc/NEWS.d/next/Library/2020-11-22-12-30-26.bpo-26131.-HsFPG.rst b/Misc/NEWS.d/next/Library/2020-11-22-12-30-26.bpo-26131.-HsFPG.rst new file mode 100644 index 00000000000000..33062a3f93bef8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-22-12-30-26.bpo-26131.-HsFPG.rst @@ -0,0 +1 @@ +Deprecate zipimport.zipimporter.load_module() in favour of exec_module(). diff --git a/Python/importlib.h b/Python/importlib.h index 179f8df77a0a05..6c77d775e38a7b 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -1,506 +1,527 @@ /* Auto-generated by Programs/_freeze_importlib.c */ const unsigned char _Py_M__importlib_bootstrap[] = { 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,64,0,0,0,115,206,1,0,0,100,0, - 90,0,100,1,90,1,100,1,90,2,100,1,90,3,100,1, - 97,4,100,2,100,3,132,0,90,5,100,4,100,5,132,0, - 90,6,105,0,90,7,105,0,90,8,71,0,100,6,100,7, - 132,0,100,7,101,9,131,3,90,10,71,0,100,8,100,9, - 132,0,100,9,131,2,90,11,71,0,100,10,100,11,132,0, - 100,11,131,2,90,12,71,0,100,12,100,13,132,0,100,13, - 131,2,90,13,100,14,100,15,132,0,90,14,100,16,100,17, + 0,4,0,0,0,64,0,0,0,115,214,1,0,0,100,0, + 90,0,100,1,100,2,132,0,90,1,100,3,90,2,100,3, + 90,3,100,3,90,4,100,3,97,5,100,4,100,5,132,0, + 90,6,100,6,100,7,132,0,90,7,105,0,90,8,105,0, + 90,9,71,0,100,8,100,9,132,0,100,9,101,10,131,3, + 90,11,71,0,100,10,100,11,132,0,100,11,131,2,90,12, + 71,0,100,12,100,13,132,0,100,13,131,2,90,13,71,0, + 100,14,100,15,132,0,100,15,131,2,90,14,100,16,100,17, 132,0,90,15,100,18,100,19,132,0,90,16,100,20,100,21, - 156,1,100,22,100,23,132,2,90,17,100,24,100,25,132,0, + 132,0,90,17,100,22,100,23,156,1,100,24,100,25,132,2, 90,18,100,26,100,27,132,0,90,19,100,28,100,29,132,0, - 90,20,100,30,100,31,132,0,90,21,71,0,100,32,100,33, - 132,0,100,33,131,2,90,22,100,1,100,1,100,34,156,2, - 100,35,100,36,132,2,90,23,100,94,100,37,100,38,132,1, - 90,24,100,39,100,40,156,1,100,41,100,42,132,2,90,25, - 100,43,100,44,132,0,90,26,100,45,100,46,132,0,90,27, + 90,20,100,30,100,31,132,0,90,21,100,32,100,33,132,0, + 90,22,71,0,100,34,100,35,132,0,100,35,131,2,90,23, + 100,3,100,3,100,36,156,2,100,37,100,38,132,2,90,24, + 100,96,100,39,100,40,132,1,90,25,100,41,100,42,156,1, + 100,43,100,44,132,2,90,26,100,45,100,46,132,0,90,27, 100,47,100,48,132,0,90,28,100,49,100,50,132,0,90,29, 100,51,100,52,132,0,90,30,100,53,100,54,132,0,90,31, - 71,0,100,55,100,56,132,0,100,56,131,2,90,32,71,0, - 100,57,100,58,132,0,100,58,131,2,90,33,71,0,100,59, - 100,60,132,0,100,60,131,2,90,34,100,61,100,62,132,0, - 90,35,100,63,100,64,132,0,90,36,100,95,100,65,100,66, - 132,1,90,37,100,67,100,68,132,0,90,38,100,69,90,39, - 101,39,100,70,23,0,90,40,100,71,100,72,132,0,90,41, - 101,42,131,0,90,43,100,73,100,74,132,0,90,44,100,96, - 100,76,100,77,132,1,90,45,100,39,100,78,156,1,100,79, - 100,80,132,2,90,46,100,81,100,82,132,0,90,47,100,97, - 100,84,100,85,132,1,90,48,100,86,100,87,132,0,90,49, + 100,55,100,56,132,0,90,32,71,0,100,57,100,58,132,0, + 100,58,131,2,90,33,71,0,100,59,100,60,132,0,100,60, + 131,2,90,34,71,0,100,61,100,62,132,0,100,62,131,2, + 90,35,100,63,100,64,132,0,90,36,100,65,100,66,132,0, + 90,37,100,97,100,67,100,68,132,1,90,38,100,69,100,70, + 132,0,90,39,100,71,90,40,101,40,100,72,23,0,90,41, + 100,73,100,74,132,0,90,42,101,43,131,0,90,44,100,75, + 100,76,132,0,90,45,100,98,100,78,100,79,132,1,90,46, + 100,41,100,80,156,1,100,81,100,82,132,2,90,47,100,83, + 100,84,132,0,90,48,100,99,100,86,100,87,132,1,90,49, 100,88,100,89,132,0,90,50,100,90,100,91,132,0,90,51, - 100,92,100,93,132,0,90,52,100,1,83,0,41,98,97,83, - 1,0,0,67,111,114,101,32,105,109,112,108,101,109,101,110, - 116,97,116,105,111,110,32,111,102,32,105,109,112,111,114,116, - 46,10,10,84,104,105,115,32,109,111,100,117,108,101,32,105, - 115,32,78,79,84,32,109,101,97,110,116,32,116,111,32,98, - 101,32,100,105,114,101,99,116,108,121,32,105,109,112,111,114, - 116,101,100,33,32,73,116,32,104,97,115,32,98,101,101,110, - 32,100,101,115,105,103,110,101,100,32,115,117,99,104,10,116, - 104,97,116,32,105,116,32,99,97,110,32,98,101,32,98,111, - 111,116,115,116,114,97,112,112,101,100,32,105,110,116,111,32, - 80,121,116,104,111,110,32,97,115,32,116,104,101,32,105,109, - 112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32, - 105,109,112,111,114,116,46,32,65,115,10,115,117,99,104,32, - 105,116,32,114,101,113,117,105,114,101,115,32,116,104,101,32, - 105,110,106,101,99,116,105,111,110,32,111,102,32,115,112,101, - 99,105,102,105,99,32,109,111,100,117,108,101,115,32,97,110, - 100,32,97,116,116,114,105,98,117,116,101,115,32,105,110,32, - 111,114,100,101,114,32,116,111,10,119,111,114,107,46,32,79, - 110,101,32,115,104,111,117,108,100,32,117,115,101,32,105,109, - 112,111,114,116,108,105,98,32,97,115,32,116,104,101,32,112, - 117,98,108,105,99,45,102,97,99,105,110,103,32,118,101,114, - 115,105,111,110,32,111,102,32,116,104,105,115,32,109,111,100, - 117,108,101,46,10,10,78,99,2,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,7,0,0,0,67,0,0,0, - 115,56,0,0,0,100,1,68,0,93,32,125,2,116,0,124, - 1,124,2,131,2,114,4,116,1,124,0,124,2,116,2,124, - 1,124,2,131,2,131,3,1,0,113,4,124,0,106,3,160, - 4,124,1,106,3,161,1,1,0,100,2,83,0,41,3,122, - 47,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, - 41,4,218,10,95,95,109,111,100,117,108,101,95,95,218,8, - 95,95,110,97,109,101,95,95,218,12,95,95,113,117,97,108, - 110,97,109,101,95,95,218,7,95,95,100,111,99,95,95,78, - 41,5,218,7,104,97,115,97,116,116,114,218,7,115,101,116, - 97,116,116,114,218,7,103,101,116,97,116,116,114,218,8,95, - 95,100,105,99,116,95,95,218,6,117,112,100,97,116,101,41, - 3,90,3,110,101,119,90,3,111,108,100,218,7,114,101,112, - 108,97,99,101,169,0,114,10,0,0,0,250,29,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,218,5,95,119,114,97, - 112,34,0,0,0,115,10,0,0,0,8,2,10,1,20,1, - 18,1,255,128,114,12,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0, - 0,0,115,12,0,0,0,116,0,116,1,131,1,124,0,131, - 1,83,0,169,1,78,41,2,218,4,116,121,112,101,218,3, - 115,121,115,169,1,218,4,110,97,109,101,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,11,95,110,101,119, - 95,109,111,100,117,108,101,42,0,0,0,115,4,0,0,0, - 12,1,255,128,114,18,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,64,0, - 0,0,115,12,0,0,0,101,0,90,1,100,0,90,2,100, - 1,83,0,41,2,218,14,95,68,101,97,100,108,111,99,107, - 69,114,114,111,114,78,41,3,114,1,0,0,0,114,0,0, - 0,0,114,2,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,19,0,0,0, - 55,0,0,0,115,6,0,0,0,8,0,4,1,255,128,114, - 19,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,64,0,0,0,115,56,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, - 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, - 100,11,132,0,90,8,100,12,83,0,41,13,218,11,95,77, - 111,100,117,108,101,76,111,99,107,122,169,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,0,0,0, - 0,2,0,0,0,2,0,0,0,67,0,0,0,115,48,0, - 0,0,116,0,160,1,161,0,124,0,95,2,116,0,160,1, - 161,0,124,0,95,3,124,1,124,0,95,4,100,0,124,0, - 95,5,100,1,124,0,95,6,100,1,124,0,95,7,100,0, - 83,0,169,2,78,233,0,0,0,0,41,8,218,7,95,116, - 104,114,101,97,100,90,13,97,108,108,111,99,97,116,101,95, - 108,111,99,107,218,4,108,111,99,107,218,6,119,97,107,101, - 117,112,114,17,0,0,0,218,5,111,119,110,101,114,218,5, - 99,111,117,110,116,218,7,119,97,105,116,101,114,115,169,2, - 218,4,115,101,108,102,114,17,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,8,95,95,105,110, - 105,116,95,95,65,0,0,0,115,14,0,0,0,10,1,10, - 1,6,1,6,1,6,1,10,1,255,128,122,20,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,0,0,0,0,5,0, - 0,0,3,0,0,0,67,0,0,0,115,84,0,0,0,116, - 0,160,1,161,0,125,1,124,0,106,2,125,2,116,3,131, - 0,125,3,116,4,160,5,124,2,161,1,125,4,124,4,100, - 0,117,0,114,42,100,1,83,0,124,4,106,2,125,2,124, - 2,124,1,107,2,114,60,100,2,83,0,124,2,124,3,118, - 0,114,72,100,1,83,0,124,3,160,6,124,2,161,1,1, - 0,113,20,41,3,78,70,84,41,7,114,23,0,0,0,218, - 9,103,101,116,95,105,100,101,110,116,114,26,0,0,0,218, - 3,115,101,116,218,12,95,98,108,111,99,107,105,110,103,95, - 111,110,218,3,103,101,116,218,3,97,100,100,41,5,114,30, - 0,0,0,90,2,109,101,218,3,116,105,100,90,4,115,101, - 101,110,114,24,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,12,104,97,115,95,100,101,97,100, - 108,111,99,107,73,0,0,0,115,26,0,0,0,8,2,6, - 1,6,1,10,2,8,1,4,1,6,1,8,1,4,1,8, - 1,4,6,12,1,255,128,122,24,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,0,0,0,0,2,0, - 0,0,8,0,0,0,67,0,0,0,115,196,0,0,0,116, - 0,160,1,161,0,125,1,124,0,116,2,124,1,60,0,122, - 170,124,0,106,3,143,126,1,0,124,0,106,4,100,1,107, - 2,115,46,124,0,106,5,124,1,107,2,114,90,124,1,124, - 0,95,5,124,0,4,0,106,4,100,2,55,0,2,0,95, - 4,87,0,100,3,4,0,4,0,131,3,1,0,87,0,116, - 2,124,1,61,0,100,4,83,0,124,0,160,6,161,0,114, - 110,116,7,100,5,124,0,22,0,131,1,130,1,124,0,106, - 8,160,9,100,6,161,1,114,136,124,0,4,0,106,10,100, - 2,55,0,2,0,95,10,87,0,100,3,4,0,4,0,131, - 3,1,0,110,16,49,0,115,156,48,0,1,0,1,0,1, - 0,89,0,1,0,124,0,106,8,160,9,161,0,1,0,124, - 0,106,8,160,11,161,0,1,0,113,18,116,2,124,1,61, - 0,48,0,41,7,122,185,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, - 114,22,0,0,0,233,1,0,0,0,78,84,122,23,100,101, - 97,100,108,111,99,107,32,100,101,116,101,99,116,101,100,32, - 98,121,32,37,114,70,41,12,114,23,0,0,0,114,32,0, - 0,0,114,34,0,0,0,114,24,0,0,0,114,27,0,0, - 0,114,26,0,0,0,114,38,0,0,0,114,19,0,0,0, - 114,25,0,0,0,218,7,97,99,113,117,105,114,101,114,28, - 0,0,0,218,7,114,101,108,101,97,115,101,169,2,114,30, - 0,0,0,114,37,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,40,0,0,0,94,0,0,0, - 115,36,0,0,0,8,6,8,1,2,1,8,2,20,1,6, - 1,14,1,14,1,6,9,4,247,8,1,12,1,12,1,44, - 1,10,2,12,1,8,2,255,128,122,19,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,0,0,0,0,2,0,0,0,8, - 0,0,0,67,0,0,0,115,144,0,0,0,116,0,160,1, - 161,0,125,1,124,0,106,2,143,110,1,0,124,0,106,3, - 124,1,107,3,114,34,116,4,100,1,131,1,130,1,124,0, - 106,5,100,2,107,4,115,48,74,0,130,1,124,0,4,0, - 106,5,100,3,56,0,2,0,95,5,124,0,106,5,100,2, - 107,2,114,108,100,0,124,0,95,3,124,0,106,6,114,108, - 124,0,4,0,106,6,100,3,56,0,2,0,95,6,124,0, - 106,7,160,8,161,0,1,0,87,0,100,0,4,0,4,0, - 131,3,1,0,100,0,83,0,49,0,115,130,48,0,1,0, - 1,0,1,0,89,0,1,0,100,0,83,0,41,4,78,250, - 31,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, - 114,22,0,0,0,114,39,0,0,0,41,9,114,23,0,0, - 0,114,32,0,0,0,114,24,0,0,0,114,26,0,0,0, - 218,12,82,117,110,116,105,109,101,69,114,114,111,114,114,27, - 0,0,0,114,28,0,0,0,114,25,0,0,0,114,41,0, - 0,0,114,42,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,41,0,0,0,119,0,0,0,115, - 24,0,0,0,8,1,8,1,10,1,8,1,14,1,14,1, - 10,1,6,1,6,1,14,1,46,1,255,128,122,19,95,77, - 111,100,117,108,101,76,111,99,107,46,114,101,108,101,97,115, + 100,92,100,93,132,0,90,52,100,94,100,95,132,0,90,53, + 100,3,83,0,41,100,97,83,1,0,0,67,111,114,101,32, + 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111, + 102,32,105,109,112,111,114,116,46,10,10,84,104,105,115,32, + 109,111,100,117,108,101,32,105,115,32,78,79,84,32,109,101, + 97,110,116,32,116,111,32,98,101,32,100,105,114,101,99,116, + 108,121,32,105,109,112,111,114,116,101,100,33,32,73,116,32, + 104,97,115,32,98,101,101,110,32,100,101,115,105,103,110,101, + 100,32,115,117,99,104,10,116,104,97,116,32,105,116,32,99, + 97,110,32,98,101,32,98,111,111,116,115,116,114,97,112,112, + 101,100,32,105,110,116,111,32,80,121,116,104,111,110,32,97, + 115,32,116,104,101,32,105,109,112,108,101,109,101,110,116,97, + 116,105,111,110,32,111,102,32,105,109,112,111,114,116,46,32, + 65,115,10,115,117,99,104,32,105,116,32,114,101,113,117,105, + 114,101,115,32,116,104,101,32,105,110,106,101,99,116,105,111, + 110,32,111,102,32,115,112,101,99,105,102,105,99,32,109,111, + 100,117,108,101,115,32,97,110,100,32,97,116,116,114,105,98, + 117,116,101,115,32,105,110,32,111,114,100,101,114,32,116,111, + 10,119,111,114,107,46,32,79,110,101,32,115,104,111,117,108, + 100,32,117,115,101,32,105,109,112,111,114,116,108,105,98,32, + 97,115,32,116,104,101,32,112,117,98,108,105,99,45,102,97, + 99,105,110,103,32,118,101,114,115,105,111,110,32,111,102,32, + 116,104,105,115,32,109,111,100,117,108,101,46,10,10,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8, + 0,0,0,67,0,0,0,115,38,0,0,0,122,8,124,0, + 106,0,87,0,83,0,4,0,116,1,121,36,1,0,1,0, + 1,0,116,2,124,0,131,1,106,0,6,0,89,0,83,0, + 48,0,169,1,78,41,3,218,12,95,95,113,117,97,108,110, + 97,109,101,95,95,218,14,65,116,116,114,105,98,117,116,101, + 69,114,114,111,114,218,4,116,121,112,101,41,1,218,3,111, + 98,106,169,0,114,5,0,0,0,250,29,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,218,12,95,111,98,106,101,99, + 116,95,110,97,109,101,23,0,0,0,115,10,0,0,0,2, + 1,8,1,12,1,16,1,255,128,114,7,0,0,0,78,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 7,0,0,0,67,0,0,0,115,56,0,0,0,100,1,68, + 0,93,32,125,2,116,0,124,1,124,2,131,2,114,4,116, + 1,124,0,124,2,116,2,124,1,124,2,131,2,131,3,1, + 0,113,4,124,0,106,3,160,4,124,1,106,3,161,1,1, + 0,100,2,83,0,41,3,122,47,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,41,4,218,10,95,95,109,111, + 100,117,108,101,95,95,218,8,95,95,110,97,109,101,95,95, + 114,1,0,0,0,218,7,95,95,100,111,99,95,95,78,41, + 5,218,7,104,97,115,97,116,116,114,218,7,115,101,116,97, + 116,116,114,218,7,103,101,116,97,116,116,114,218,8,95,95, + 100,105,99,116,95,95,218,6,117,112,100,97,116,101,41,3, + 90,3,110,101,119,90,3,111,108,100,218,7,114,101,112,108, + 97,99,101,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,5,95,119,114,97,112,40,0,0,0,115,10,0, + 0,0,8,2,10,1,20,1,18,1,255,128,114,17,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,116,1,131,1,124,0,131,1,83,0,114,0,0,0,0, + 41,2,114,3,0,0,0,218,3,115,121,115,169,1,218,4, + 110,97,109,101,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,11,95,110,101,119,95,109,111,100,117,108,101, + 48,0,0,0,115,4,0,0,0,12,1,255,128,114,21,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,64,0,0,0,115,12,0,0,0, + 101,0,90,1,100,0,90,2,100,1,83,0,41,2,218,14, + 95,68,101,97,100,108,111,99,107,69,114,114,111,114,78,41, + 3,114,9,0,0,0,114,8,0,0,0,114,1,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,22,0,0,0,61,0,0,0,115,6,0, + 0,0,8,0,4,1,255,128,114,22,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,64,0,0,0,115,56,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,100, + 8,100,9,132,0,90,7,100,10,100,11,132,0,90,8,100, + 12,83,0,41,13,218,11,95,77,111,100,117,108,101,76,111, + 99,107,122,169,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,0,0,0,0,2,0,0,0,2,0, + 0,0,67,0,0,0,115,48,0,0,0,116,0,160,1,161, + 0,124,0,95,2,116,0,160,1,161,0,124,0,95,3,124, + 1,124,0,95,4,100,0,124,0,95,5,100,1,124,0,95, + 6,100,1,124,0,95,7,100,0,83,0,169,2,78,233,0, + 0,0,0,41,8,218,7,95,116,104,114,101,97,100,90,13, + 97,108,108,111,99,97,116,101,95,108,111,99,107,218,4,108, + 111,99,107,218,6,119,97,107,101,117,112,114,20,0,0,0, + 218,5,111,119,110,101,114,218,5,99,111,117,110,116,218,7, + 119,97,105,116,101,114,115,169,2,218,4,115,101,108,102,114, + 20,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,8,95,95,105,110,105,116,95,95,71,0,0, + 0,115,14,0,0,0,10,1,10,1,6,1,6,1,6,1, + 10,1,255,128,122,20,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,0,0,0,0,5,0,0,0,3,0,0,0,67, + 0,0,0,115,84,0,0,0,116,0,160,1,161,0,125,1, + 124,0,106,2,125,2,116,3,131,0,125,3,116,4,160,5, + 124,2,161,1,125,4,124,4,100,0,117,0,114,42,100,1, + 83,0,124,4,106,2,125,2,124,2,124,1,107,2,114,60, + 100,2,83,0,124,2,124,3,118,0,114,72,100,1,83,0, + 124,3,160,6,124,2,161,1,1,0,113,20,41,3,78,70, + 84,41,7,114,26,0,0,0,218,9,103,101,116,95,105,100, + 101,110,116,114,29,0,0,0,218,3,115,101,116,218,12,95, + 98,108,111,99,107,105,110,103,95,111,110,218,3,103,101,116, + 218,3,97,100,100,41,5,114,33,0,0,0,90,2,109,101, + 218,3,116,105,100,90,4,115,101,101,110,114,27,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 12,104,97,115,95,100,101,97,100,108,111,99,107,79,0,0, + 0,115,26,0,0,0,8,2,6,1,6,1,10,2,8,1, + 4,1,6,1,8,1,4,1,8,1,4,6,12,1,255,128, + 122,24,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,0,0,0,0,2,0,0,0,8,0,0,0,67, + 0,0,0,115,196,0,0,0,116,0,160,1,161,0,125,1, + 124,0,116,2,124,1,60,0,122,170,124,0,106,3,143,126, + 1,0,124,0,106,4,100,1,107,2,115,46,124,0,106,5, + 124,1,107,2,114,90,124,1,124,0,95,5,124,0,4,0, + 106,4,100,2,55,0,2,0,95,4,87,0,100,3,4,0, + 4,0,131,3,1,0,87,0,116,2,124,1,61,0,100,4, + 83,0,124,0,160,6,161,0,114,110,116,7,100,5,124,0, + 22,0,131,1,130,1,124,0,106,8,160,9,100,6,161,1, + 114,136,124,0,4,0,106,10,100,2,55,0,2,0,95,10, + 87,0,100,3,4,0,4,0,131,3,1,0,110,16,49,0, + 115,156,48,0,1,0,1,0,1,0,89,0,1,0,124,0, + 106,8,160,9,161,0,1,0,124,0,106,8,160,11,161,0, + 1,0,113,18,116,2,124,1,61,0,48,0,41,7,122,185, + 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,114,25,0,0,0,233,1, + 0,0,0,78,84,122,23,100,101,97,100,108,111,99,107,32, + 100,101,116,101,99,116,101,100,32,98,121,32,37,114,70,41, + 12,114,26,0,0,0,114,35,0,0,0,114,37,0,0,0, + 114,27,0,0,0,114,30,0,0,0,114,29,0,0,0,114, + 41,0,0,0,114,22,0,0,0,114,28,0,0,0,218,7, + 97,99,113,117,105,114,101,114,31,0,0,0,218,7,114,101, + 108,101,97,115,101,169,2,114,33,0,0,0,114,40,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 114,43,0,0,0,100,0,0,0,115,36,0,0,0,8,6, + 8,1,2,1,8,2,20,1,6,1,14,1,14,1,6,9, + 4,247,8,1,12,1,12,1,44,1,10,2,12,1,8,2, + 255,128,122,19,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, + 0,0,0,0,2,0,0,0,8,0,0,0,67,0,0,0, + 115,144,0,0,0,116,0,160,1,161,0,125,1,124,0,106, + 2,143,110,1,0,124,0,106,3,124,1,107,3,114,34,116, + 4,100,1,131,1,130,1,124,0,106,5,100,2,107,4,115, + 48,74,0,130,1,124,0,4,0,106,5,100,3,56,0,2, + 0,95,5,124,0,106,5,100,2,107,2,114,108,100,0,124, + 0,95,3,124,0,106,6,114,108,124,0,4,0,106,6,100, + 3,56,0,2,0,95,6,124,0,106,7,160,8,161,0,1, + 0,87,0,100,0,4,0,4,0,131,3,1,0,100,0,83, + 0,49,0,115,130,48,0,1,0,1,0,1,0,89,0,1, + 0,100,0,83,0,41,4,78,250,31,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,114,25,0,0,0,114,42, + 0,0,0,41,9,114,26,0,0,0,114,35,0,0,0,114, + 27,0,0,0,114,29,0,0,0,218,12,82,117,110,116,105, + 109,101,69,114,114,111,114,114,30,0,0,0,114,31,0,0, + 0,114,28,0,0,0,114,44,0,0,0,114,45,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 44,0,0,0,125,0,0,0,115,24,0,0,0,8,1,8, + 1,10,1,8,1,14,1,14,1,10,1,6,1,6,1,14, + 1,46,1,255,128,122,19,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,0,0,0,0,1,0,0,0,5,0,0,0,67, + 0,0,0,115,18,0,0,0,100,1,160,0,124,0,106,1, + 116,2,124,0,131,1,161,2,83,0,41,2,78,122,23,95, + 77,111,100,117,108,101,76,111,99,107,40,123,33,114,125,41, + 32,97,116,32,123,125,169,3,218,6,102,111,114,109,97,116, + 114,20,0,0,0,218,2,105,100,169,1,114,33,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 8,95,95,114,101,112,114,95,95,138,0,0,0,115,4,0, + 0,0,18,1,255,128,122,20,95,77,111,100,117,108,101,76, + 111,99,107,46,95,95,114,101,112,114,95,95,78,41,9,114, + 9,0,0,0,114,8,0,0,0,114,1,0,0,0,114,10, + 0,0,0,114,34,0,0,0,114,41,0,0,0,114,43,0, + 0,0,114,44,0,0,0,114,52,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 114,23,0,0,0,65,0,0,0,115,16,0,0,0,8,0, + 4,1,8,5,8,8,8,21,8,25,12,13,255,128,114,23, + 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,64,0,0,0,115,48,0,0, + 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, + 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100, + 7,132,0,90,6,100,8,100,9,132,0,90,7,100,10,83, + 0,41,11,218,16,95,68,117,109,109,121,77,111,100,117,108, + 101,76,111,99,107,122,86,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,0,0,0,0,2,0,0,0,2,0, + 0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,95, + 0,100,1,124,0,95,1,100,0,83,0,114,24,0,0,0, + 41,2,114,20,0,0,0,114,30,0,0,0,114,32,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 114,34,0,0,0,146,0,0,0,115,6,0,0,0,6,1, + 10,1,255,128,122,25,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,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,18,0,0,0,124,0,4, + 0,106,0,100,1,55,0,2,0,95,0,100,2,83,0,41, + 3,78,114,42,0,0,0,84,41,1,114,30,0,0,0,114, + 51,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,43,0,0,0,150,0,0,0,115,6,0,0, + 0,14,1,4,1,255,128,122,24,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,0,0,0,0,1,0, - 0,0,5,0,0,0,67,0,0,0,115,18,0,0,0,100, - 1,160,0,124,0,106,1,116,2,124,0,131,1,161,2,83, - 0,41,2,78,122,23,95,77,111,100,117,108,101,76,111,99, - 107,40,123,33,114,125,41,32,97,116,32,123,125,169,3,218, - 6,102,111,114,109,97,116,114,17,0,0,0,218,2,105,100, - 169,1,114,30,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,95,95,114,101,112,114,95,95, - 132,0,0,0,115,4,0,0,0,18,1,255,128,122,20,95, - 77,111,100,117,108,101,76,111,99,107,46,95,95,114,101,112, - 114,95,95,78,41,9,114,1,0,0,0,114,0,0,0,0, - 114,2,0,0,0,114,3,0,0,0,114,31,0,0,0,114, - 38,0,0,0,114,40,0,0,0,114,41,0,0,0,114,49, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,20,0,0,0,59,0,0,0, - 115,16,0,0,0,8,0,4,1,8,5,8,8,8,21,8, - 25,12,13,255,128,114,20,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,48,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,100,7,132,0,90,6,100,8,100,9, - 132,0,90,7,100,10,83,0,41,11,218,16,95,68,117,109, - 109,121,77,111,100,117,108,101,76,111,99,107,122,86,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,0,0,0, + 0,0,3,0,0,0,67,0,0,0,115,36,0,0,0,124, + 0,106,0,100,1,107,2,114,18,116,1,100,2,131,1,130, + 1,124,0,4,0,106,0,100,3,56,0,2,0,95,0,100, + 0,83,0,41,4,78,114,25,0,0,0,114,46,0,0,0, + 114,42,0,0,0,41,2,114,30,0,0,0,114,47,0,0, + 0,114,51,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,44,0,0,0,154,0,0,0,115,8, + 0,0,0,10,1,8,1,18,1,255,128,122,24,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,0,0, + 0,0,1,0,0,0,5,0,0,0,67,0,0,0,115,18, + 0,0,0,100,1,160,0,124,0,106,1,116,2,124,0,131, + 1,161,2,83,0,41,2,78,122,28,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,114,48,0,0,0,114,51,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 52,0,0,0,159,0,0,0,115,4,0,0,0,18,1,255, + 128,122,25,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,41,8,114, + 9,0,0,0,114,8,0,0,0,114,1,0,0,0,114,10, + 0,0,0,114,34,0,0,0,114,43,0,0,0,114,44,0, + 0,0,114,52,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,53,0,0,0, + 142,0,0,0,115,14,0,0,0,8,0,4,1,8,3,8, + 4,8,4,12,5,255,128,114,53,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,64,0,0,0,115,36,0,0,0,101,0,90,1,100,0, + 90,2,100,1,100,2,132,0,90,3,100,3,100,4,132,0, + 90,4,100,5,100,6,132,0,90,5,100,7,83,0,41,8, + 218,18,95,77,111,100,117,108,101,76,111,99,107,77,97,110, + 97,103,101,114,99,2,0,0,0,0,0,0,0,0,0,0, 0,2,0,0,0,2,0,0,0,67,0,0,0,115,16,0, - 0,0,124,1,124,0,95,0,100,1,124,0,95,1,100,0, - 83,0,114,21,0,0,0,41,2,114,17,0,0,0,114,27, - 0,0,0,114,29,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,31,0,0,0,140,0,0,0, - 115,6,0,0,0,6,1,10,1,255,128,122,25,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,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 18,0,0,0,124,0,4,0,106,0,100,1,55,0,2,0, - 95,0,100,2,83,0,41,3,78,114,39,0,0,0,84,41, - 1,114,27,0,0,0,114,48,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,40,0,0,0,144, - 0,0,0,115,6,0,0,0,14,1,4,1,255,128,122,24, - 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,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,36,0,0,0,124,0,106,0,100,1,107,2,114,18, - 116,1,100,2,131,1,130,1,124,0,4,0,106,0,100,3, - 56,0,2,0,95,0,100,0,83,0,41,4,78,114,22,0, - 0,0,114,43,0,0,0,114,39,0,0,0,41,2,114,27, - 0,0,0,114,44,0,0,0,114,48,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,41,0,0, - 0,148,0,0,0,115,8,0,0,0,10,1,8,1,18,1, - 255,128,122,24,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,0,0,0,0,1,0,0,0,5,0,0, - 0,67,0,0,0,115,18,0,0,0,100,1,160,0,124,0, - 106,1,116,2,124,0,131,1,161,2,83,0,41,2,78,122, - 28,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,114,45,0, - 0,0,114,48,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,49,0,0,0,153,0,0,0,115, - 4,0,0,0,18,1,255,128,122,25,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,41,8,114,1,0,0,0,114,0,0,0,0, - 114,2,0,0,0,114,3,0,0,0,114,31,0,0,0,114, - 40,0,0,0,114,41,0,0,0,114,49,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,50,0,0,0,136,0,0,0,115,14,0,0,0, - 8,0,4,1,8,3,8,4,8,4,12,5,255,128,114,50, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,64,0,0,0,115,36,0,0, - 0,101,0,90,1,100,0,90,2,100,1,100,2,132,0,90, - 3,100,3,100,4,132,0,90,4,100,5,100,6,132,0,90, - 5,100,7,83,0,41,8,218,18,95,77,111,100,117,108,101, - 76,111,99,107,77,97,110,97,103,101,114,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, - 67,0,0,0,115,16,0,0,0,124,1,124,0,95,0,100, - 0,124,0,95,1,100,0,83,0,114,13,0,0,0,41,2, - 218,5,95,110,97,109,101,218,5,95,108,111,99,107,114,29, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,31,0,0,0,159,0,0,0,115,6,0,0,0, - 6,1,10,1,255,128,122,27,95,77,111,100,117,108,101,76, - 111,99,107,77,97,110,97,103,101,114,46,95,95,105,110,105, - 116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,2,0,0,0,67,0,0,0,115,26,0,0, - 0,116,0,124,0,106,1,131,1,124,0,95,2,124,0,106, - 2,160,3,161,0,1,0,100,0,83,0,114,13,0,0,0, - 41,4,218,16,95,103,101,116,95,109,111,100,117,108,101,95, - 108,111,99,107,114,52,0,0,0,114,53,0,0,0,114,40, - 0,0,0,114,48,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,9,95,95,101,110,116,101,114, - 95,95,163,0,0,0,115,6,0,0,0,12,1,14,1,255, - 128,122,28,95,77,111,100,117,108,101,76,111,99,107,77,97, - 110,97,103,101,114,46,95,95,101,110,116,101,114,95,95,99, + 0,0,124,1,124,0,95,0,100,0,124,0,95,1,100,0, + 83,0,114,0,0,0,0,41,2,218,5,95,110,97,109,101, + 218,5,95,108,111,99,107,114,32,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,34,0,0,0, + 165,0,0,0,115,6,0,0,0,6,1,10,1,255,128,122, + 27,95,77,111,100,117,108,101,76,111,99,107,77,97,110,97, + 103,101,114,46,95,95,105,110,105,116,95,95,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, + 0,67,0,0,0,115,26,0,0,0,116,0,124,0,106,1, + 131,1,124,0,95,2,124,0,106,2,160,3,161,0,1,0, + 100,0,83,0,114,0,0,0,0,41,4,218,16,95,103,101, + 116,95,109,111,100,117,108,101,95,108,111,99,107,114,55,0, + 0,0,114,56,0,0,0,114,43,0,0,0,114,51,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,9,95,95,101,110,116,101,114,95,95,169,0,0,0,115, + 6,0,0,0,12,1,14,1,255,128,122,28,95,77,111,100, + 117,108,101,76,111,99,107,77,97,110,97,103,101,114,46,95, + 95,101,110,116,101,114,95,95,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,2,0,0,0,79,0,0, + 0,115,14,0,0,0,124,0,106,0,160,1,161,0,1,0, + 100,0,83,0,114,0,0,0,0,41,2,114,56,0,0,0, + 114,44,0,0,0,41,3,114,33,0,0,0,218,4,97,114, + 103,115,90,6,107,119,97,114,103,115,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,8,95,95,101,120,105, + 116,95,95,173,0,0,0,115,4,0,0,0,14,1,255,128, + 122,27,95,77,111,100,117,108,101,76,111,99,107,77,97,110, + 97,103,101,114,46,95,95,101,120,105,116,95,95,78,41,6, + 114,9,0,0,0,114,8,0,0,0,114,1,0,0,0,114, + 34,0,0,0,114,58,0,0,0,114,60,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,114,54,0,0,0,163,0,0,0,115,10,0,0,0, + 8,0,8,2,8,4,12,4,255,128,114,54,0,0,0,99, 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 2,0,0,0,79,0,0,0,115,14,0,0,0,124,0,106, - 0,160,1,161,0,1,0,100,0,83,0,114,13,0,0,0, - 41,2,114,53,0,0,0,114,41,0,0,0,41,3,114,30, - 0,0,0,218,4,97,114,103,115,90,6,107,119,97,114,103, - 115,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,8,95,95,101,120,105,116,95,95,167,0,0,0,115,4, - 0,0,0,14,1,255,128,122,27,95,77,111,100,117,108,101, - 76,111,99,107,77,97,110,97,103,101,114,46,95,95,101,120, - 105,116,95,95,78,41,6,114,1,0,0,0,114,0,0,0, - 0,114,2,0,0,0,114,31,0,0,0,114,55,0,0,0, - 114,57,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,51,0,0,0,157,0, - 0,0,115,10,0,0,0,8,0,8,2,8,4,12,4,255, - 128,114,51,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,115, - 134,0,0,0,116,0,160,1,161,0,1,0,122,114,122,14, - 116,2,124,0,25,0,131,0,125,1,87,0,110,22,4,0, - 116,3,121,46,1,0,1,0,1,0,100,1,125,1,89,0, - 110,2,48,0,124,1,100,1,117,0,114,110,116,4,100,1, - 117,0,114,74,116,5,124,0,131,1,125,1,110,8,116,6, - 124,0,131,1,125,1,124,0,102,1,100,2,100,3,132,1, - 125,2,116,7,160,8,124,1,124,2,161,2,116,2,124,0, - 60,0,87,0,116,0,160,9,161,0,1,0,124,1,83,0, - 116,0,160,9,161,0,1,0,48,0,41,4,122,139,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,65,99,113,117,105,114, - 101,47,114,101,108,101,97,115,101,32,105,110,116,101,114,110, - 97,108,108,121,32,116,104,101,32,103,108,111,98,97,108,32, - 105,109,112,111,114,116,32,108,111,99,107,32,116,111,32,112, - 114,111,116,101,99,116,10,32,32,32,32,95,109,111,100,117, - 108,101,95,108,111,99,107,115,46,78,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,83, - 0,0,0,115,54,0,0,0,116,0,160,1,161,0,1,0, - 122,34,116,2,160,3,124,1,161,1,124,0,117,0,114,30, - 116,2,124,1,61,0,87,0,116,0,160,4,161,0,1,0, - 100,0,83,0,116,0,160,4,161,0,1,0,48,0,114,13, - 0,0,0,41,5,218,4,95,105,109,112,218,12,97,99,113, - 117,105,114,101,95,108,111,99,107,218,13,95,109,111,100,117, - 108,101,95,108,111,99,107,115,114,35,0,0,0,218,12,114, - 101,108,101,97,115,101,95,108,111,99,107,41,2,218,3,114, - 101,102,114,17,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,2,99,98,192,0,0,0,115,12, - 0,0,0,8,1,2,1,14,4,8,1,22,2,255,128,122, - 28,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,41,10,114, - 58,0,0,0,114,59,0,0,0,114,60,0,0,0,218,8, - 75,101,121,69,114,114,111,114,114,23,0,0,0,114,50,0, - 0,0,114,20,0,0,0,218,8,95,119,101,97,107,114,101, - 102,114,62,0,0,0,114,61,0,0,0,41,3,114,17,0, - 0,0,114,24,0,0,0,114,63,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,54,0,0,0, - 173,0,0,0,115,32,0,0,0,8,6,2,1,2,1,14, - 1,12,1,10,1,8,2,8,1,10,1,8,2,12,2,18, - 11,8,2,4,2,10,254,255,128,114,54,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,8, - 0,0,0,67,0,0,0,115,54,0,0,0,116,0,124,0, - 131,1,125,1,122,12,124,1,160,1,161,0,1,0,87,0, - 110,20,4,0,116,2,121,40,1,0,1,0,1,0,89,0, - 100,1,83,0,48,0,124,1,160,3,161,0,1,0,100,1, - 83,0,41,2,122,189,65,99,113,117,105,114,101,115,32,116, - 104,101,110,32,114,101,108,101,97,115,101,115,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,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,32, - 32,32,32,78,41,4,114,54,0,0,0,114,40,0,0,0, - 114,19,0,0,0,114,41,0,0,0,41,2,114,17,0,0, - 0,114,24,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,19,95,108,111,99,107,95,117,110,108, - 111,99,107,95,109,111,100,117,108,101,210,0,0,0,115,14, - 0,0,0,8,6,2,1,12,1,12,1,8,3,12,2,255, - 128,114,66,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,4,0,0,0,79,0,0,0,115, - 14,0,0,0,124,0,124,1,105,0,124,2,164,1,142,1, - 83,0,41,2,97,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,78,114,10,0,0,0,41,3,218, - 1,102,114,56,0,0,0,90,4,107,119,100,115,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,25,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,227,0,0,0,115,4,0,0,0, - 14,8,255,128,114,68,0,0,0,114,39,0,0,0,41,1, - 218,9,118,101,114,98,111,115,105,116,121,99,1,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,4,0,0,0, - 71,0,0,0,115,58,0,0,0,116,0,106,1,106,2,124, - 1,107,5,114,54,124,0,160,3,100,1,161,1,115,30,100, - 2,124,0,23,0,125,0,116,4,124,0,106,5,124,2,142, - 0,116,0,106,6,100,3,141,2,1,0,100,4,83,0,100, - 4,83,0,41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111,114, - 116,32,122,2,35,32,41,1,90,4,102,105,108,101,78,41, - 7,114,15,0,0,0,218,5,102,108,97,103,115,218,7,118, - 101,114,98,111,115,101,218,10,115,116,97,114,116,115,119,105, - 116,104,218,5,112,114,105,110,116,114,46,0,0,0,218,6, - 115,116,100,101,114,114,41,3,218,7,109,101,115,115,97,103, - 101,114,69,0,0,0,114,56,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,16,95,118,101,114, - 98,111,115,101,95,109,101,115,115,97,103,101,238,0,0,0, - 115,12,0,0,0,12,2,10,1,8,1,24,1,4,253,255, - 128,114,77,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,115, - 26,0,0,0,135,0,102,1,100,1,100,2,132,8,125,1, - 116,0,124,1,136,0,131,2,1,0,124,1,83,0,41,4, - 122,49,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,0,0,0,0, - 2,0,0,0,4,0,0,0,19,0,0,0,115,38,0,0, - 0,124,1,116,0,106,1,118,1,114,28,116,2,100,1,160, - 3,124,1,161,1,124,1,100,2,141,2,130,1,136,0,124, - 0,124,1,131,2,83,0,41,3,78,250,29,123,33,114,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,114,16,0,0,0,41,4, - 114,15,0,0,0,218,20,98,117,105,108,116,105,110,95,109, - 111,100,117,108,101,95,110,97,109,101,115,218,11,73,109,112, - 111,114,116,69,114,114,111,114,114,46,0,0,0,169,2,114, - 30,0,0,0,218,8,102,117,108,108,110,97,109,101,169,1, - 218,3,102,120,110,114,10,0,0,0,114,11,0,0,0,218, - 25,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,248,0,0,0,115,12, - 0,0,0,10,1,10,1,2,1,6,255,10,2,255,128,122, - 52,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,78,169,1,114,12,0,0,0,41,2,114, - 84,0,0,0,114,85,0,0,0,114,10,0,0,0,114,83, - 0,0,0,114,11,0,0,0,218,17,95,114,101,113,117,105, - 114,101,115,95,98,117,105,108,116,105,110,246,0,0,0,115, - 8,0,0,0,12,2,10,5,4,1,255,128,114,87,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,3,0,0,0,115,26,0,0,0,135, - 0,102,1,100,1,100,2,132,8,125,1,116,0,124,1,136, - 0,131,2,1,0,124,1,83,0,41,4,122,47,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, + 8,0,0,0,67,0,0,0,115,134,0,0,0,116,0,160, + 1,161,0,1,0,122,114,122,14,116,2,124,0,25,0,131, + 0,125,1,87,0,110,22,4,0,116,3,121,46,1,0,1, + 0,1,0,100,1,125,1,89,0,110,2,48,0,124,1,100, + 1,117,0,114,110,116,4,100,1,117,0,114,74,116,5,124, + 0,131,1,125,1,110,8,116,6,124,0,131,1,125,1,124, + 0,102,1,100,2,100,3,132,1,125,2,116,7,160,8,124, + 1,124,2,161,2,116,2,124,0,60,0,87,0,116,0,160, + 9,161,0,1,0,124,1,83,0,116,0,160,9,161,0,1, + 0,48,0,41,4,122,139,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,65,99,113,117,105,114,101,47,114,101,108,101,97, + 115,101,32,105,110,116,101,114,110,97,108,108,121,32,116,104, + 101,32,103,108,111,98,97,108,32,105,109,112,111,114,116,32, + 108,111,99,107,32,116,111,32,112,114,111,116,101,99,116,10, + 32,32,32,32,95,109,111,100,117,108,101,95,108,111,99,107, + 115,46,78,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,8,0,0,0,83,0,0,0,115,54,0,0, + 0,116,0,160,1,161,0,1,0,122,34,116,2,160,3,124, + 1,161,1,124,0,117,0,114,30,116,2,124,1,61,0,87, + 0,116,0,160,4,161,0,1,0,100,0,83,0,116,0,160, + 4,161,0,1,0,48,0,114,0,0,0,0,41,5,218,4, + 95,105,109,112,218,12,97,99,113,117,105,114,101,95,108,111, + 99,107,218,13,95,109,111,100,117,108,101,95,108,111,99,107, + 115,114,38,0,0,0,218,12,114,101,108,101,97,115,101,95, + 108,111,99,107,41,2,218,3,114,101,102,114,20,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 2,99,98,198,0,0,0,115,12,0,0,0,8,1,2,1, + 14,4,8,1,22,2,255,128,122,28,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,41,10,114,61,0,0,0,114,62,0, + 0,0,114,63,0,0,0,218,8,75,101,121,69,114,114,111, + 114,114,26,0,0,0,114,53,0,0,0,114,23,0,0,0, + 218,8,95,119,101,97,107,114,101,102,114,65,0,0,0,114, + 64,0,0,0,41,3,114,20,0,0,0,114,27,0,0,0, + 114,66,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,57,0,0,0,179,0,0,0,115,32,0, + 0,0,8,6,2,1,2,1,14,1,12,1,10,1,8,2, + 8,1,10,1,8,2,12,2,18,11,8,2,4,2,10,254, + 255,128,114,57,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,8,0,0,0,67,0,0,0, + 115,54,0,0,0,116,0,124,0,131,1,125,1,122,12,124, + 1,160,1,161,0,1,0,87,0,110,20,4,0,116,2,121, + 40,1,0,1,0,1,0,89,0,100,1,83,0,48,0,124, + 1,160,3,161,0,1,0,100,1,83,0,41,2,122,189,65, + 99,113,117,105,114,101,115,32,116,104,101,110,32,114,101,108, + 101,97,115,101,115,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,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,32,32,32,32,78,41,4,114, + 57,0,0,0,114,43,0,0,0,114,22,0,0,0,114,44, + 0,0,0,41,2,114,20,0,0,0,114,27,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,19, + 95,108,111,99,107,95,117,110,108,111,99,107,95,109,111,100, + 117,108,101,216,0,0,0,115,14,0,0,0,8,6,2,1, + 12,1,12,1,8,3,12,2,255,128,114,69,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 4,0,0,0,79,0,0,0,115,14,0,0,0,124,0,124, + 1,105,0,124,2,164,1,142,1,83,0,41,2,97,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, + 78,114,5,0,0,0,41,3,218,1,102,114,59,0,0,0, + 90,4,107,119,100,115,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,25,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, + 233,0,0,0,115,4,0,0,0,14,8,255,128,114,71,0, + 0,0,114,42,0,0,0,41,1,218,9,118,101,114,98,111, + 115,105,116,121,99,1,0,0,0,0,0,0,0,1,0,0, + 0,3,0,0,0,4,0,0,0,71,0,0,0,115,58,0, + 0,0,116,0,106,1,106,2,124,1,107,5,114,54,124,0, + 160,3,100,1,161,1,115,30,100,2,124,0,23,0,125,0, + 116,4,124,0,106,5,124,2,142,0,116,0,106,6,100,3, + 141,2,1,0,100,4,83,0,100,4,83,0,41,5,122,61, + 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,41,2,250, + 1,35,122,7,105,109,112,111,114,116,32,122,2,35,32,41, + 1,90,4,102,105,108,101,78,41,7,114,18,0,0,0,218, + 5,102,108,97,103,115,218,7,118,101,114,98,111,115,101,218, + 10,115,116,97,114,116,115,119,105,116,104,218,5,112,114,105, + 110,116,114,49,0,0,0,218,6,115,116,100,101,114,114,41, + 3,218,7,109,101,115,115,97,103,101,114,72,0,0,0,114, + 59,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, + 115,115,97,103,101,244,0,0,0,115,12,0,0,0,12,2, + 10,1,8,1,24,1,4,253,255,128,114,80,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,3,0,0,0,115,26,0,0,0,135,0,102, + 1,100,1,100,2,132,8,125,1,116,0,124,1,136,0,131, + 2,1,0,124,1,83,0,41,4,122,49,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,0,0,0,0,2,0,0,0,4,0,0, - 0,19,0,0,0,115,38,0,0,0,116,0,160,1,124,1, - 161,1,115,28,116,2,100,1,160,3,124,1,161,1,124,1, + 0,19,0,0,0,115,38,0,0,0,124,1,116,0,106,1, + 118,1,114,28,116,2,100,1,160,3,124,1,161,1,124,1, 100,2,141,2,130,1,136,0,124,0,124,1,131,2,83,0, - 169,3,78,122,27,123,33,114,125,32,105,115,32,110,111,116, - 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101, - 114,16,0,0,0,41,4,114,58,0,0,0,218,9,105,115, - 95,102,114,111,122,101,110,114,80,0,0,0,114,46,0,0, - 0,114,81,0,0,0,114,83,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,24,95,114,101,113,117,105,114,101,115, - 95,102,114,111,122,101,110,95,119,114,97,112,112,101,114,3, - 1,0,0,115,12,0,0,0,10,1,10,1,2,1,6,255, - 10,2,255,128,122,50,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, + 41,3,78,250,29,123,33,114,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,114,19,0,0,0,41,4,114,18,0,0,0,218,20, + 98,117,105,108,116,105,110,95,109,111,100,117,108,101,95,110, + 97,109,101,115,218,11,73,109,112,111,114,116,69,114,114,111, + 114,114,49,0,0,0,169,2,114,33,0,0,0,218,8,102, + 117,108,108,110,97,109,101,169,1,218,3,102,120,110,114,5, + 0,0,0,114,6,0,0,0,218,25,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,254,0,0,0,115,12,0,0,0,10,1,10,1, + 2,1,6,255,10,2,255,128,122,52,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,78,169, + 1,114,17,0,0,0,41,2,114,87,0,0,0,114,88,0, + 0,0,114,5,0,0,0,114,86,0,0,0,114,6,0,0, + 0,218,17,95,114,101,113,117,105,114,101,115,95,98,117,105, + 108,116,105,110,252,0,0,0,115,8,0,0,0,12,2,10, + 5,4,1,255,128,114,90,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,3, + 0,0,0,115,26,0,0,0,135,0,102,1,100,1,100,2, + 132,8,125,1,116,0,124,1,136,0,131,2,1,0,124,1, + 83,0,41,4,122,47,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,0,0, + 0,0,2,0,0,0,4,0,0,0,19,0,0,0,115,38, + 0,0,0,116,0,160,1,124,1,161,1,115,28,116,2,100, + 1,160,3,124,1,161,1,124,1,100,2,141,2,130,1,136, + 0,124,0,124,1,131,2,83,0,169,3,78,122,27,123,33, + 114,125,32,105,115,32,110,111,116,32,97,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,114,19,0,0,0,41,4, + 114,61,0,0,0,218,9,105,115,95,102,114,111,122,101,110, + 114,83,0,0,0,114,49,0,0,0,114,84,0,0,0,114, + 86,0,0,0,114,5,0,0,0,114,6,0,0,0,218,24, 95,114,101,113,117,105,114,101,115,95,102,114,111,122,101,110, - 95,119,114,97,112,112,101,114,78,114,86,0,0,0,41,2, - 114,84,0,0,0,114,90,0,0,0,114,10,0,0,0,114, - 83,0,0,0,114,11,0,0,0,218,16,95,114,101,113,117, - 105,114,101,115,95,102,114,111,122,101,110,1,1,0,0,115, - 8,0,0,0,12,2,10,5,4,1,255,128,114,91,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,3,0,0,0,67,0,0,0,115,58,0,0,0,116, - 0,124,1,124,0,131,2,125,2,124,1,116,1,106,2,118, - 0,114,50,116,1,106,2,124,1,25,0,125,3,116,3,124, - 2,124,3,131,2,1,0,116,1,106,2,124,1,25,0,83, - 0,116,4,124,2,131,1,83,0,41,2,122,128,76,111,97, - 100,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, - 109,111,100,117,108,101,32,105,110,116,111,32,115,121,115,46, - 109,111,100,117,108,101,115,32,97,110,100,32,114,101,116,117, - 114,110,32,105,116,46,10,10,32,32,32,32,84,104,105,115, - 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, - 99,97,116,101,100,46,32,32,85,115,101,32,108,111,97,100, - 101,114,46,101,120,101,99,95,109,111,100,117,108,101,32,105, - 110,115,116,101,97,100,46,10,10,32,32,32,32,78,41,5, - 218,16,115,112,101,99,95,102,114,111,109,95,108,111,97,100, - 101,114,114,15,0,0,0,218,7,109,111,100,117,108,101,115, - 218,5,95,101,120,101,99,218,5,95,108,111,97,100,41,4, - 114,30,0,0,0,114,82,0,0,0,218,4,115,112,101,99, - 218,6,109,111,100,117,108,101,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,17,95,108,111,97,100,95,109, - 111,100,117,108,101,95,115,104,105,109,13,1,0,0,115,14, - 0,0,0,10,6,10,1,10,1,10,1,10,1,8,2,255, - 128,114,98,0,0,0,99,1,0,0,0,0,0,0,0,0, + 95,119,114,97,112,112,101,114,9,1,0,0,115,12,0,0, + 0,10,1,10,1,2,1,6,255,10,2,255,128,122,50,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,78,114,89,0,0,0,41,2,114,87,0,0,0,114,93, + 0,0,0,114,5,0,0,0,114,86,0,0,0,114,6,0, + 0,0,218,16,95,114,101,113,117,105,114,101,115,95,102,114, + 111,122,101,110,7,1,0,0,115,8,0,0,0,12,2,10, + 5,4,1,255,128,114,94,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,67, + 0,0,0,115,74,0,0,0,100,1,125,2,116,0,160,1, + 124,2,116,2,161,2,1,0,116,3,124,1,124,0,131,2, + 125,3,124,1,116,4,106,5,118,0,114,66,116,4,106,5, + 124,1,25,0,125,4,116,6,124,3,124,4,131,2,1,0, + 116,4,106,5,124,1,25,0,83,0,116,7,124,3,131,1, + 83,0,41,3,122,128,76,111,97,100,32,116,104,101,32,115, + 112,101,99,105,102,105,101,100,32,109,111,100,117,108,101,32, + 105,110,116,111,32,115,121,115,46,109,111,100,117,108,101,115, + 32,97,110,100,32,114,101,116,117,114,110,32,105,116,46,10, + 10,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,108,111,97,100,101,114,46,101,120,101,99, + 95,109,111,100,117,108,101,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,122,103,116,104,101,32,108,111,97,100, + 95,109,111,100,117,108,101,40,41,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97, + 110,100,32,115,108,97,116,101,100,32,102,111,114,32,114,101, + 109,111,118,97,108,32,105,110,32,80,121,116,104,111,110,32, + 51,46,49,50,59,32,117,115,101,32,101,120,101,99,95,109, + 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,78, + 41,8,218,9,95,119,97,114,110,105,110,103,115,218,4,119, + 97,114,110,218,18,68,101,112,114,101,99,97,116,105,111,110, + 87,97,114,110,105,110,103,218,16,115,112,101,99,95,102,114, + 111,109,95,108,111,97,100,101,114,114,18,0,0,0,218,7, + 109,111,100,117,108,101,115,218,5,95,101,120,101,99,218,5, + 95,108,111,97,100,41,5,114,33,0,0,0,114,85,0,0, + 0,218,3,109,115,103,218,4,115,112,101,99,218,6,109,111, + 100,117,108,101,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,17,95,108,111,97,100,95,109,111,100,117,108, + 101,95,115,104,105,109,19,1,0,0,115,18,0,0,0,4, + 6,12,2,10,1,10,1,10,1,10,1,10,1,8,2,255, + 128,114,105,0,0,0,99,1,0,0,0,0,0,0,0,0, 0,0,0,5,0,0,0,8,0,0,0,67,0,0,0,115, 210,0,0,0,116,0,124,0,100,1,100,0,131,3,125,1, 116,1,124,1,100,2,131,2,114,54,122,12,124,1,160,2, @@ -521,1302 +542,1313 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 33,114,125,62,250,20,60,109,111,100,117,108,101,32,123,33, 114,125,32,40,123,33,114,125,41,62,250,23,60,109,111,100, 117,108,101,32,123,33,114,125,32,102,114,111,109,32,123,33, - 114,125,62,41,10,114,6,0,0,0,114,4,0,0,0,114, - 100,0,0,0,218,9,69,120,99,101,112,116,105,111,110,218, - 8,95,95,115,112,101,99,95,95,218,14,65,116,116,114,105, - 98,117,116,101,69,114,114,111,114,218,22,95,109,111,100,117, - 108,101,95,114,101,112,114,95,102,114,111,109,95,115,112,101, - 99,114,1,0,0,0,218,8,95,95,102,105,108,101,95,95, - 114,46,0,0,0,41,5,114,97,0,0,0,218,6,108,111, - 97,100,101,114,114,96,0,0,0,114,17,0,0,0,218,8, - 102,105,108,101,110,97,109,101,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,12,95,109,111,100,117,108,101, - 95,114,101,112,114,29,1,0,0,115,48,0,0,0,12,2, - 10,1,2,4,12,1,12,1,6,1,2,1,10,1,12,1, - 6,1,8,2,8,1,2,4,10,1,12,1,10,1,2,1, - 10,1,12,1,8,1,14,1,18,2,12,2,255,128,114,112, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,64,0,0,0,115,114,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, - 2,100,2,100,3,156,3,100,4,100,5,132,2,90,4,100, - 6,100,7,132,0,90,5,100,8,100,9,132,0,90,6,101, - 7,100,10,100,11,132,0,131,1,90,8,101,8,106,9,100, - 12,100,11,132,0,131,1,90,8,101,7,100,13,100,14,132, - 0,131,1,90,10,101,7,100,15,100,16,132,0,131,1,90, - 11,101,11,106,9,100,17,100,16,132,0,131,1,90,11,100, - 2,83,0,41,18,218,10,77,111,100,117,108,101,83,112,101, - 99,97,208,5,0,0,84,104,101,32,115,112,101,99,105,102, - 105,99,97,116,105,111,110,32,102,111,114,32,97,32,109,111, - 100,117,108,101,44,32,117,115,101,100,32,102,111,114,32,108, - 111,97,100,105,110,103,46,10,10,32,32,32,32,65,32,109, - 111,100,117,108,101,39,115,32,115,112,101,99,32,105,115,32, - 116,104,101,32,115,111,117,114,99,101,32,102,111,114,32,105, - 110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116, - 32,116,104,101,32,109,111,100,117,108,101,46,32,32,70,111, - 114,10,32,32,32,32,100,97,116,97,32,97,115,115,111,99, - 105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,109, - 111,100,117,108,101,44,32,105,110,99,108,117,100,105,110,103, - 32,115,111,117,114,99,101,44,32,117,115,101,32,116,104,101, - 32,115,112,101,99,39,115,10,32,32,32,32,108,111,97,100, - 101,114,46,10,10,32,32,32,32,96,110,97,109,101,96,32, - 105,115,32,116,104,101,32,97,98,115,111,108,117,116,101,32, - 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, - 108,101,46,32,32,96,108,111,97,100,101,114,96,32,105,115, - 32,116,104,101,32,108,111,97,100,101,114,10,32,32,32,32, - 116,111,32,117,115,101,32,119,104,101,110,32,108,111,97,100, - 105,110,103,32,116,104,101,32,109,111,100,117,108,101,46,32, - 32,96,112,97,114,101,110,116,96,32,105,115,32,116,104,101, - 32,110,97,109,101,32,111,102,32,116,104,101,10,32,32,32, - 32,112,97,99,107,97,103,101,32,116,104,101,32,109,111,100, - 117,108,101,32,105,115,32,105,110,46,32,32,84,104,101,32, - 112,97,114,101,110,116,32,105,115,32,100,101,114,105,118,101, - 100,32,102,114,111,109,32,116,104,101,32,110,97,109,101,46, - 10,10,32,32,32,32,96,105,115,95,112,97,99,107,97,103, - 101,96,32,100,101,116,101,114,109,105,110,101,115,32,105,102, - 32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,99, - 111,110,115,105,100,101,114,101,100,32,97,32,112,97,99,107, - 97,103,101,32,111,114,10,32,32,32,32,110,111,116,46,32, - 32,79,110,32,109,111,100,117,108,101,115,32,116,104,105,115, - 32,105,115,32,114,101,102,108,101,99,116,101,100,32,98,121, - 32,116,104,101,32,96,95,95,112,97,116,104,95,95,96,32, - 97,116,116,114,105,98,117,116,101,46,10,10,32,32,32,32, - 96,111,114,105,103,105,110,96,32,105,115,32,116,104,101,32, - 115,112,101,99,105,102,105,99,32,108,111,99,97,116,105,111, - 110,32,117,115,101,100,32,98,121,32,116,104,101,32,108,111, - 97,100,101,114,32,102,114,111,109,32,119,104,105,99,104,32, - 116,111,10,32,32,32,32,108,111,97,100,32,116,104,101,32, - 109,111,100,117,108,101,44,32,105,102,32,116,104,97,116,32, - 105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,97, - 118,97,105,108,97,98,108,101,46,32,32,87,104,101,110,32, - 102,105,108,101,110,97,109,101,32,105,115,10,32,32,32,32, - 115,101,116,44,32,111,114,105,103,105,110,32,119,105,108,108, - 32,109,97,116,99,104,46,10,10,32,32,32,32,96,104,97, - 115,95,108,111,99,97,116,105,111,110,96,32,105,110,100,105, - 99,97,116,101,115,32,116,104,97,116,32,97,32,115,112,101, - 99,39,115,32,34,111,114,105,103,105,110,34,32,114,101,102, - 108,101,99,116,115,32,97,32,108,111,99,97,116,105,111,110, - 46,10,32,32,32,32,87,104,101,110,32,116,104,105,115,32, - 105,115,32,84,114,117,101,44,32,96,95,95,102,105,108,101, - 95,95,96,32,97,116,116,114,105,98,117,116,101,32,111,102, - 32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,115, - 101,116,46,10,10,32,32,32,32,96,99,97,99,104,101,100, - 96,32,105,115,32,116,104,101,32,108,111,99,97,116,105,111, - 110,32,111,102,32,116,104,101,32,99,97,99,104,101,100,32, - 98,121,116,101,99,111,100,101,32,102,105,108,101,44,32,105, - 102,32,97,110,121,46,32,32,73,116,10,32,32,32,32,99, - 111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104, - 101,32,96,95,95,99,97,99,104,101,100,95,95,96,32,97, - 116,116,114,105,98,117,116,101,46,10,10,32,32,32,32,96, + 114,125,62,41,10,114,13,0,0,0,114,11,0,0,0,114, + 107,0,0,0,218,9,69,120,99,101,112,116,105,111,110,218, + 8,95,95,115,112,101,99,95,95,114,2,0,0,0,218,22, + 95,109,111,100,117,108,101,95,114,101,112,114,95,102,114,111, + 109,95,115,112,101,99,114,9,0,0,0,218,8,95,95,102, + 105,108,101,95,95,114,49,0,0,0,41,5,114,104,0,0, + 0,218,6,108,111,97,100,101,114,114,103,0,0,0,114,20, + 0,0,0,218,8,102,105,108,101,110,97,109,101,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,12,95,109, + 111,100,117,108,101,95,114,101,112,114,38,1,0,0,115,48, + 0,0,0,12,2,10,1,2,4,12,1,12,1,6,1,2, + 1,10,1,12,1,6,1,8,2,8,1,2,4,10,1,12, + 1,10,1,2,1,10,1,12,1,8,1,14,1,18,2,12, + 2,255,128,114,118,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, + 0,115,114,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,2,100,2,100,3,156,3,100,4,100,5, + 132,2,90,4,100,6,100,7,132,0,90,5,100,8,100,9, + 132,0,90,6,101,7,100,10,100,11,132,0,131,1,90,8, + 101,8,106,9,100,12,100,11,132,0,131,1,90,8,101,7, + 100,13,100,14,132,0,131,1,90,10,101,7,100,15,100,16, + 132,0,131,1,90,11,101,11,106,9,100,17,100,16,132,0, + 131,1,90,11,100,2,83,0,41,18,218,10,77,111,100,117, + 108,101,83,112,101,99,97,208,5,0,0,84,104,101,32,115, + 112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114, + 32,97,32,109,111,100,117,108,101,44,32,117,115,101,100,32, + 102,111,114,32,108,111,97,100,105,110,103,46,10,10,32,32, + 32,32,65,32,109,111,100,117,108,101,39,115,32,115,112,101, + 99,32,105,115,32,116,104,101,32,115,111,117,114,99,101,32, + 102,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32, + 97,98,111,117,116,32,116,104,101,32,109,111,100,117,108,101, + 46,32,32,70,111,114,10,32,32,32,32,100,97,116,97,32, + 97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32, + 116,104,101,32,109,111,100,117,108,101,44,32,105,110,99,108, + 117,100,105,110,103,32,115,111,117,114,99,101,44,32,117,115, + 101,32,116,104,101,32,115,112,101,99,39,115,10,32,32,32, + 32,108,111,97,100,101,114,46,10,10,32,32,32,32,96,110, + 97,109,101,96,32,105,115,32,116,104,101,32,97,98,115,111, + 108,117,116,101,32,110,97,109,101,32,111,102,32,116,104,101, + 32,109,111,100,117,108,101,46,32,32,96,108,111,97,100,101, + 114,96,32,105,115,32,116,104,101,32,108,111,97,100,101,114, + 10,32,32,32,32,116,111,32,117,115,101,32,119,104,101,110, + 32,108,111,97,100,105,110,103,32,116,104,101,32,109,111,100, + 117,108,101,46,32,32,96,112,97,114,101,110,116,96,32,105, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,10,32,32,32,32,112,97,99,107,97,103,101,32,116,104, + 101,32,109,111,100,117,108,101,32,105,115,32,105,110,46,32, + 32,84,104,101,32,112,97,114,101,110,116,32,105,115,32,100, + 101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32, + 110,97,109,101,46,10,10,32,32,32,32,96,105,115,95,112, + 97,99,107,97,103,101,96,32,100,101,116,101,114,109,105,110, + 101,115,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, + 32,112,97,99,107,97,103,101,32,111,114,10,32,32,32,32, + 110,111,116,46,32,32,79,110,32,109,111,100,117,108,101,115, + 32,116,104,105,115,32,105,115,32,114,101,102,108,101,99,116, + 101,100,32,98,121,32,116,104,101,32,96,95,95,112,97,116, + 104,95,95,96,32,97,116,116,114,105,98,117,116,101,46,10, + 10,32,32,32,32,96,111,114,105,103,105,110,96,32,105,115, + 32,116,104,101,32,115,112,101,99,105,102,105,99,32,108,111, + 99,97,116,105,111,110,32,117,115,101,100,32,98,121,32,116, + 104,101,32,108,111,97,100,101,114,32,102,114,111,109,32,119, + 104,105,99,104,32,116,111,10,32,32,32,32,108,111,97,100, + 32,116,104,101,32,109,111,100,117,108,101,44,32,105,102,32, + 116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110, + 32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,32, + 87,104,101,110,32,102,105,108,101,110,97,109,101,32,105,115, + 10,32,32,32,32,115,101,116,44,32,111,114,105,103,105,110, + 32,119,105,108,108,32,109,97,116,99,104,46,10,10,32,32, + 32,32,96,104,97,115,95,108,111,99,97,116,105,111,110,96, + 32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32, + 97,32,115,112,101,99,39,115,32,34,111,114,105,103,105,110, + 34,32,114,101,102,108,101,99,116,115,32,97,32,108,111,99, + 97,116,105,111,110,46,10,32,32,32,32,87,104,101,110,32, + 116,104,105,115,32,105,115,32,84,114,117,101,44,32,96,95, + 95,102,105,108,101,95,95,96,32,97,116,116,114,105,98,117, + 116,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,115,101,116,46,10,10,32,32,32,32,96,99, + 97,99,104,101,100,96,32,105,115,32,116,104,101,32,108,111, + 99,97,116,105,111,110,32,111,102,32,116,104,101,32,99,97, + 99,104,101,100,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,44,32,105,102,32,97,110,121,46,32,32,73,116,10, + 32,32,32,32,99,111,114,114,101,115,112,111,110,100,115,32, + 116,111,32,116,104,101,32,96,95,95,99,97,99,104,101,100, + 95,95,96,32,97,116,116,114,105,98,117,116,101,46,10,10, + 32,32,32,32,96,115,117,98,109,111,100,117,108,101,95,115, + 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,96, + 32,105,115,32,116,104,101,32,115,101,113,117,101,110,99,101, + 32,111,102,32,112,97,116,104,32,101,110,116,114,105,101,115, + 32,116,111,10,32,32,32,32,115,101,97,114,99,104,32,119, + 104,101,110,32,105,109,112,111,114,116,105,110,103,32,115,117, + 98,109,111,100,117,108,101,115,46,32,32,73,102,32,115,101, + 116,44,32,105,115,95,112,97,99,107,97,103,101,32,115,104, + 111,117,108,100,32,98,101,10,32,32,32,32,84,114,117,101, + 45,45,97,110,100,32,70,97,108,115,101,32,111,116,104,101, + 114,119,105,115,101,46,10,10,32,32,32,32,80,97,99,107, + 97,103,101,115,32,97,114,101,32,115,105,109,112,108,121,32, + 109,111,100,117,108,101,115,32,116,104,97,116,32,40,109,97, + 121,41,32,104,97,118,101,32,115,117,98,109,111,100,117,108, + 101,115,46,32,32,73,102,32,97,32,115,112,101,99,10,32, + 32,32,32,104,97,115,32,97,32,110,111,110,45,78,111,110, + 101,32,118,97,108,117,101,32,105,110,32,96,115,117,98,109, + 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, + 97,116,105,111,110,115,96,44,32,116,104,101,32,105,109,112, + 111,114,116,10,32,32,32,32,115,121,115,116,101,109,32,119, + 105,108,108,32,99,111,110,115,105,100,101,114,32,109,111,100, + 117,108,101,115,32,108,111,97,100,101,100,32,102,114,111,109, + 32,116,104,101,32,115,112,101,99,32,97,115,32,112,97,99, + 107,97,103,101,115,46,10,10,32,32,32,32,79,110,108,121, + 32,102,105,110,100,101,114,115,32,40,115,101,101,32,105,109, + 112,111,114,116,108,105,98,46,97,98,99,46,77,101,116,97, + 80,97,116,104,70,105,110,100,101,114,32,97,110,100,10,32, + 32,32,32,105,109,112,111,114,116,108,105,98,46,97,98,99, + 46,80,97,116,104,69,110,116,114,121,70,105,110,100,101,114, + 41,32,115,104,111,117,108,100,32,109,111,100,105,102,121,32, + 77,111,100,117,108,101,83,112,101,99,32,105,110,115,116,97, + 110,99,101,115,46,10,10,32,32,32,32,78,41,3,218,6, + 111,114,105,103,105,110,218,12,108,111,97,100,101,114,95,115, + 116,97,116,101,218,10,105,115,95,112,97,99,107,97,103,101, + 99,3,0,0,0,0,0,0,0,3,0,0,0,6,0,0, + 0,2,0,0,0,67,0,0,0,115,54,0,0,0,124,1, + 124,0,95,0,124,2,124,0,95,1,124,3,124,0,95,2, + 124,4,124,0,95,3,124,5,114,32,103,0,110,2,100,0, + 124,0,95,4,100,1,124,0,95,5,100,0,124,0,95,6, + 100,0,83,0,41,2,78,70,41,7,114,20,0,0,0,114, + 116,0,0,0,114,120,0,0,0,114,121,0,0,0,218,26, 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, - 95,108,111,99,97,116,105,111,110,115,96,32,105,115,32,116, - 104,101,32,115,101,113,117,101,110,99,101,32,111,102,32,112, - 97,116,104,32,101,110,116,114,105,101,115,32,116,111,10,32, - 32,32,32,115,101,97,114,99,104,32,119,104,101,110,32,105, - 109,112,111,114,116,105,110,103,32,115,117,98,109,111,100,117, - 108,101,115,46,32,32,73,102,32,115,101,116,44,32,105,115, - 95,112,97,99,107,97,103,101,32,115,104,111,117,108,100,32, - 98,101,10,32,32,32,32,84,114,117,101,45,45,97,110,100, - 32,70,97,108,115,101,32,111,116,104,101,114,119,105,115,101, - 46,10,10,32,32,32,32,80,97,99,107,97,103,101,115,32, - 97,114,101,32,115,105,109,112,108,121,32,109,111,100,117,108, - 101,115,32,116,104,97,116,32,40,109,97,121,41,32,104,97, - 118,101,32,115,117,98,109,111,100,117,108,101,115,46,32,32, - 73,102,32,97,32,115,112,101,99,10,32,32,32,32,104,97, - 115,32,97,32,110,111,110,45,78,111,110,101,32,118,97,108, - 117,101,32,105,110,32,96,115,117,98,109,111,100,117,108,101, - 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, - 115,96,44,32,116,104,101,32,105,109,112,111,114,116,10,32, - 32,32,32,115,121,115,116,101,109,32,119,105,108,108,32,99, - 111,110,115,105,100,101,114,32,109,111,100,117,108,101,115,32, - 108,111,97,100,101,100,32,102,114,111,109,32,116,104,101,32, - 115,112,101,99,32,97,115,32,112,97,99,107,97,103,101,115, - 46,10,10,32,32,32,32,79,110,108,121,32,102,105,110,100, - 101,114,115,32,40,115,101,101,32,105,109,112,111,114,116,108, - 105,98,46,97,98,99,46,77,101,116,97,80,97,116,104,70, - 105,110,100,101,114,32,97,110,100,10,32,32,32,32,105,109, - 112,111,114,116,108,105,98,46,97,98,99,46,80,97,116,104, - 69,110,116,114,121,70,105,110,100,101,114,41,32,115,104,111, - 117,108,100,32,109,111,100,105,102,121,32,77,111,100,117,108, - 101,83,112,101,99,32,105,110,115,116,97,110,99,101,115,46, - 10,10,32,32,32,32,78,41,3,218,6,111,114,105,103,105, - 110,218,12,108,111,97,100,101,114,95,115,116,97,116,101,218, - 10,105,115,95,112,97,99,107,97,103,101,99,3,0,0,0, - 0,0,0,0,3,0,0,0,6,0,0,0,2,0,0,0, - 67,0,0,0,115,54,0,0,0,124,1,124,0,95,0,124, - 2,124,0,95,1,124,3,124,0,95,2,124,4,124,0,95, - 3,124,5,114,32,103,0,110,2,100,0,124,0,95,4,100, - 1,124,0,95,5,100,0,124,0,95,6,100,0,83,0,41, - 2,78,70,41,7,114,17,0,0,0,114,110,0,0,0,114, - 114,0,0,0,114,115,0,0,0,218,26,115,117,98,109,111, - 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, - 116,105,111,110,115,218,13,95,115,101,116,95,102,105,108,101, - 97,116,116,114,218,7,95,99,97,99,104,101,100,41,6,114, - 30,0,0,0,114,17,0,0,0,114,110,0,0,0,114,114, - 0,0,0,114,115,0,0,0,114,116,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,31,0,0, - 0,102,1,0,0,115,16,0,0,0,6,2,6,1,6,1, - 6,1,14,1,6,3,10,1,255,128,122,19,77,111,100,117, - 108,101,83,112,101,99,46,95,95,105,110,105,116,95,95,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 6,0,0,0,67,0,0,0,115,102,0,0,0,100,1,160, - 0,124,0,106,1,161,1,100,2,160,0,124,0,106,2,161, - 1,103,2,125,1,124,0,106,3,100,0,117,1,114,52,124, - 1,160,4,100,3,160,0,124,0,106,3,161,1,161,1,1, - 0,124,0,106,5,100,0,117,1,114,80,124,1,160,4,100, - 4,160,0,124,0,106,5,161,1,161,1,1,0,100,5,160, - 0,124,0,106,6,106,7,100,6,160,8,124,1,161,1,161, - 2,83,0,41,7,78,122,9,110,97,109,101,61,123,33,114, - 125,122,11,108,111,97,100,101,114,61,123,33,114,125,122,11, - 111,114,105,103,105,110,61,123,33,114,125,122,29,115,117,98, - 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, - 99,97,116,105,111,110,115,61,123,125,122,6,123,125,40,123, - 125,41,122,2,44,32,41,9,114,46,0,0,0,114,17,0, - 0,0,114,110,0,0,0,114,114,0,0,0,218,6,97,112, - 112,101,110,100,114,117,0,0,0,218,9,95,95,99,108,97, - 115,115,95,95,114,1,0,0,0,218,4,106,111,105,110,41, - 2,114,30,0,0,0,114,56,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,49,0,0,0,114, - 1,0,0,115,22,0,0,0,10,1,10,1,4,255,10,2, - 18,1,10,1,8,1,4,1,6,255,22,2,255,128,122,19, - 77,111,100,117,108,101,83,112,101,99,46,95,95,114,101,112, - 114,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,8,0,0,0,67,0,0,0,115,102,0,0, - 0,124,0,106,0,125,2,122,72,124,0,106,1,124,1,106, - 1,107,2,111,76,124,0,106,2,124,1,106,2,107,2,111, - 76,124,0,106,3,124,1,106,3,107,2,111,76,124,2,124, - 1,106,0,107,2,111,76,124,0,106,4,124,1,106,4,107, - 2,111,76,124,0,106,5,124,1,106,5,107,2,87,0,83, - 0,4,0,116,6,121,100,1,0,1,0,1,0,116,7,6, - 0,89,0,83,0,48,0,114,13,0,0,0,41,8,114,117, - 0,0,0,114,17,0,0,0,114,110,0,0,0,114,114,0, - 0,0,218,6,99,97,99,104,101,100,218,12,104,97,115,95, - 108,111,99,97,116,105,111,110,114,107,0,0,0,218,14,78, - 111,116,73,109,112,108,101,109,101,110,116,101,100,41,3,114, - 30,0,0,0,90,5,111,116,104,101,114,90,4,115,109,115, - 108,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,6,95,95,101,113,95,95,124,1,0,0,115,32,0,0, - 0,6,1,2,1,12,1,10,1,2,255,10,2,2,254,8, - 3,2,253,10,4,2,252,10,5,4,251,12,6,10,1,255, - 128,122,17,77,111,100,117,108,101,83,112,101,99,46,95,95, - 101,113,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,58,0, - 0,0,124,0,106,0,100,0,117,0,114,52,124,0,106,1, - 100,0,117,1,114,52,124,0,106,2,114,52,116,3,100,0, - 117,0,114,38,116,4,130,1,116,3,160,5,124,0,106,1, - 161,1,124,0,95,0,124,0,106,0,83,0,114,13,0,0, - 0,41,6,114,119,0,0,0,114,114,0,0,0,114,118,0, - 0,0,218,19,95,98,111,111,116,115,116,114,97,112,95,101, - 120,116,101,114,110,97,108,218,19,78,111,116,73,109,112,108, - 101,109,101,110,116,101,100,69,114,114,111,114,90,11,95,103, - 101,116,95,99,97,99,104,101,100,114,48,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,123,0, - 0,0,136,1,0,0,115,14,0,0,0,10,2,16,1,8, - 1,4,1,14,1,6,1,255,128,122,17,77,111,100,117,108, - 101,83,112,101,99,46,99,97,99,104,101,100,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, - 0,67,0,0,0,115,10,0,0,0,124,1,124,0,95,0, - 100,0,83,0,114,13,0,0,0,41,1,114,119,0,0,0, - 41,2,114,30,0,0,0,114,123,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,123,0,0,0, - 145,1,0,0,115,4,0,0,0,10,2,255,128,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,32,0,0,0,124,0,106,0,100, - 1,117,0,114,26,124,0,106,1,160,2,100,2,161,1,100, - 3,25,0,83,0,124,0,106,1,83,0,41,4,122,32,84, - 104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109, - 111,100,117,108,101,39,115,32,112,97,114,101,110,116,46,78, - 218,1,46,114,22,0,0,0,41,3,114,117,0,0,0,114, - 17,0,0,0,218,10,114,112,97,114,116,105,116,105,111,110, - 114,48,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,6,112,97,114,101,110,116,149,1,0,0, - 115,8,0,0,0,10,3,16,1,6,2,255,128,122,17,77, - 111,100,117,108,101,83,112,101,99,46,112,97,114,101,110,116, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,1,0,0,0,67,0,0,0,115,6,0,0,0,124,0, - 106,0,83,0,114,13,0,0,0,41,1,114,118,0,0,0, - 114,48,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,124,0,0,0,157,1,0,0,115,4,0, - 0,0,6,2,255,128,122,23,77,111,100,117,108,101,83,112, - 101,99,46,104,97,115,95,108,111,99,97,116,105,111,110,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 2,0,0,0,67,0,0,0,115,14,0,0,0,116,0,124, - 1,131,1,124,0,95,1,100,0,83,0,114,13,0,0,0, - 41,2,218,4,98,111,111,108,114,118,0,0,0,41,2,114, - 30,0,0,0,218,5,118,97,108,117,101,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,124,0,0,0,161, - 1,0,0,115,4,0,0,0,14,2,255,128,41,12,114,1, - 0,0,0,114,0,0,0,0,114,2,0,0,0,114,3,0, - 0,0,114,31,0,0,0,114,49,0,0,0,114,126,0,0, - 0,218,8,112,114,111,112,101,114,116,121,114,123,0,0,0, - 218,6,115,101,116,116,101,114,114,131,0,0,0,114,124,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,113,0,0,0,65,1,0,0,115, - 36,0,0,0,8,0,4,1,4,36,2,1,12,255,8,12, - 8,10,2,12,10,1,4,8,10,1,2,3,10,1,2,7, - 10,1,4,3,14,1,255,128,114,113,0,0,0,169,2,114, - 114,0,0,0,114,116,0,0,0,99,2,0,0,0,0,0, - 0,0,2,0,0,0,6,0,0,0,8,0,0,0,67,0, - 0,0,115,150,0,0,0,116,0,124,1,100,1,131,2,114, - 74,116,1,100,2,117,0,114,22,116,2,130,1,116,1,106, - 3,125,4,124,3,100,2,117,0,114,48,124,4,124,0,124, - 1,100,3,141,2,83,0,124,3,114,56,103,0,110,2,100, - 2,125,5,124,4,124,0,124,1,124,5,100,4,141,3,83, - 0,124,3,100,2,117,0,114,134,116,0,124,1,100,5,131, - 2,114,130,122,14,124,1,160,4,124,0,161,1,125,3,87, - 0,110,26,4,0,116,5,121,128,1,0,1,0,1,0,100, - 2,125,3,89,0,110,6,48,0,100,6,125,3,116,6,124, - 0,124,1,124,2,124,3,100,7,141,4,83,0,41,8,122, - 53,82,101,116,117,114,110,32,97,32,109,111,100,117,108,101, - 32,115,112,101,99,32,98,97,115,101,100,32,111,110,32,118, - 97,114,105,111,117,115,32,108,111,97,100,101,114,32,109,101, - 116,104,111,100,115,46,90,12,103,101,116,95,102,105,108,101, - 110,97,109,101,78,41,1,114,110,0,0,0,41,2,114,110, - 0,0,0,114,117,0,0,0,114,116,0,0,0,70,114,136, - 0,0,0,41,7,114,4,0,0,0,114,127,0,0,0,114, - 128,0,0,0,218,23,115,112,101,99,95,102,114,111,109,95, - 102,105,108,101,95,108,111,99,97,116,105,111,110,114,116,0, - 0,0,114,80,0,0,0,114,113,0,0,0,41,6,114,17, - 0,0,0,114,110,0,0,0,114,114,0,0,0,114,116,0, - 0,0,114,137,0,0,0,90,6,115,101,97,114,99,104,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,92, - 0,0,0,166,1,0,0,115,38,0,0,0,10,2,8,1, - 4,1,6,1,8,2,12,1,12,1,6,1,2,1,6,255, - 8,3,10,1,2,1,14,1,12,1,10,1,4,3,16,2, - 255,128,114,92,0,0,0,99,3,0,0,0,0,0,0,0, - 0,0,0,0,8,0,0,0,8,0,0,0,67,0,0,0, - 115,40,1,0,0,122,10,124,0,106,0,125,3,87,0,110, - 18,4,0,116,1,121,28,1,0,1,0,1,0,89,0,110, - 14,48,0,124,3,100,0,117,1,114,42,124,3,83,0,124, - 0,106,2,125,4,124,1,100,0,117,0,114,86,122,10,124, - 0,106,3,125,1,87,0,110,18,4,0,116,1,121,84,1, - 0,1,0,1,0,89,0,110,2,48,0,122,10,124,0,106, - 4,125,5,87,0,110,22,4,0,116,1,121,118,1,0,1, - 0,1,0,100,0,125,5,89,0,110,2,48,0,124,2,100, - 0,117,0,114,174,124,5,100,0,117,0,114,170,122,10,124, - 1,106,5,125,2,87,0,110,26,4,0,116,1,121,168,1, - 0,1,0,1,0,100,0,125,2,89,0,110,6,48,0,124, - 5,125,2,122,10,124,0,106,6,125,6,87,0,110,22,4, - 0,116,1,121,206,1,0,1,0,1,0,100,0,125,6,89, - 0,110,2,48,0,122,14,116,7,124,0,106,8,131,1,125, - 7,87,0,110,22,4,0,116,1,121,244,1,0,1,0,1, - 0,100,0,125,7,89,0,110,2,48,0,116,9,124,4,124, - 1,124,2,100,1,141,3,125,3,124,5,100,0,117,0,144, - 1,114,18,100,2,110,2,100,3,124,3,95,10,124,6,124, - 3,95,11,124,7,124,3,95,12,124,3,83,0,41,4,78, - 169,1,114,114,0,0,0,70,84,41,13,114,106,0,0,0, - 114,107,0,0,0,114,1,0,0,0,114,99,0,0,0,114, - 109,0,0,0,218,7,95,79,82,73,71,73,78,218,10,95, - 95,99,97,99,104,101,100,95,95,218,4,108,105,115,116,218, - 8,95,95,112,97,116,104,95,95,114,113,0,0,0,114,118, - 0,0,0,114,123,0,0,0,114,117,0,0,0,41,8,114, - 97,0,0,0,114,110,0,0,0,114,114,0,0,0,114,96, - 0,0,0,114,17,0,0,0,90,8,108,111,99,97,116,105, - 111,110,114,123,0,0,0,114,117,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,17,95,115,112, - 101,99,95,102,114,111,109,95,109,111,100,117,108,101,192,1, - 0,0,115,74,0,0,0,2,2,10,1,12,1,6,1,8, - 2,4,1,6,2,8,1,2,1,10,1,12,1,6,2,2, - 1,10,1,12,1,10,1,8,1,8,1,2,1,10,1,12, - 1,10,1,4,2,2,1,10,1,12,1,10,1,2,1,14, - 1,12,1,10,1,14,2,20,1,6,1,6,1,4,1,255, - 128,114,143,0,0,0,70,169,1,218,8,111,118,101,114,114, - 105,100,101,99,2,0,0,0,0,0,0,0,1,0,0,0, - 5,0,0,0,8,0,0,0,67,0,0,0,115,214,1,0, - 0,124,2,115,20,116,0,124,1,100,1,100,0,131,3,100, - 0,117,0,114,52,122,12,124,0,106,1,124,1,95,2,87, - 0,110,18,4,0,116,3,121,50,1,0,1,0,1,0,89, - 0,110,2,48,0,124,2,115,72,116,0,124,1,100,2,100, - 0,131,3,100,0,117,0,114,174,124,0,106,4,125,3,124, - 3,100,0,117,0,114,144,124,0,106,5,100,0,117,1,114, - 144,116,6,100,0,117,0,114,108,116,7,130,1,116,6,106, - 8,125,4,124,4,160,9,124,4,161,1,125,3,124,0,106, - 5,124,3,95,10,124,3,124,0,95,4,100,0,124,1,95, - 11,122,10,124,3,124,1,95,12,87,0,110,18,4,0,116, - 3,121,172,1,0,1,0,1,0,89,0,110,2,48,0,124, - 2,115,194,116,0,124,1,100,3,100,0,131,3,100,0,117, - 0,114,226,122,12,124,0,106,13,124,1,95,14,87,0,110, - 18,4,0,116,3,121,224,1,0,1,0,1,0,89,0,110, - 2,48,0,122,10,124,0,124,1,95,15,87,0,110,18,4, - 0,116,3,121,254,1,0,1,0,1,0,89,0,110,2,48, - 0,124,2,144,1,115,24,116,0,124,1,100,4,100,0,131, - 3,100,0,117,0,144,1,114,70,124,0,106,5,100,0,117, - 1,144,1,114,70,122,12,124,0,106,5,124,1,95,16,87, - 0,110,20,4,0,116,3,144,1,121,68,1,0,1,0,1, - 0,89,0,110,2,48,0,124,0,106,17,144,1,114,210,124, - 2,144,1,115,102,116,0,124,1,100,5,100,0,131,3,100, - 0,117,0,144,1,114,136,122,12,124,0,106,18,124,1,95, - 11,87,0,110,20,4,0,116,3,144,1,121,134,1,0,1, - 0,1,0,89,0,110,2,48,0,124,2,144,1,115,160,116, - 0,124,1,100,6,100,0,131,3,100,0,117,0,144,1,114, - 210,124,0,106,19,100,0,117,1,144,1,114,210,122,14,124, - 0,106,19,124,1,95,20,87,0,124,1,83,0,4,0,116, - 3,144,1,121,208,1,0,1,0,1,0,89,0,124,1,83, - 0,48,0,124,1,83,0,41,7,78,114,1,0,0,0,114, - 99,0,0,0,218,11,95,95,112,97,99,107,97,103,101,95, - 95,114,142,0,0,0,114,109,0,0,0,114,140,0,0,0, - 41,21,114,6,0,0,0,114,17,0,0,0,114,1,0,0, - 0,114,107,0,0,0,114,110,0,0,0,114,117,0,0,0, - 114,127,0,0,0,114,128,0,0,0,218,16,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,218,7,95,95, - 110,101,119,95,95,90,5,95,112,97,116,104,114,109,0,0, - 0,114,99,0,0,0,114,131,0,0,0,114,146,0,0,0, - 114,106,0,0,0,114,142,0,0,0,114,124,0,0,0,114, - 114,0,0,0,114,123,0,0,0,114,140,0,0,0,41,5, - 114,96,0,0,0,114,97,0,0,0,114,145,0,0,0,114, - 110,0,0,0,114,147,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,18,95,105,110,105,116,95, - 109,111,100,117,108,101,95,97,116,116,114,115,237,1,0,0, - 115,104,0,0,0,20,4,2,1,12,1,12,1,6,1,20, - 2,6,1,8,1,10,2,8,1,4,1,6,1,10,2,8, - 1,6,1,6,11,2,1,10,1,12,1,6,1,20,2,2, - 1,12,1,12,1,6,1,2,2,10,1,12,1,6,1,24, - 2,12,1,2,1,12,1,14,1,6,1,8,2,24,1,2, - 1,12,1,14,1,6,1,24,2,12,1,2,1,10,1,4, - 3,14,254,2,1,4,1,2,255,4,1,255,128,114,149,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,82,0,0,0, - 100,1,125,1,116,0,124,0,106,1,100,2,131,2,114,30, - 124,0,106,1,160,2,124,0,161,1,125,1,110,20,116,0, - 124,0,106,1,100,3,131,2,114,50,116,3,100,4,131,1, - 130,1,124,1,100,1,117,0,114,68,116,4,124,0,106,5, - 131,1,125,1,116,6,124,0,124,1,131,2,1,0,124,1, - 83,0,41,5,122,43,67,114,101,97,116,101,32,97,32,109, - 111,100,117,108,101,32,98,97,115,101,100,32,111,110,32,116, - 104,101,32,112,114,111,118,105,100,101,100,32,115,112,101,99, - 46,78,218,13,99,114,101,97,116,101,95,109,111,100,117,108, - 101,218,11,101,120,101,99,95,109,111,100,117,108,101,122,66, - 108,111,97,100,101,114,115,32,116,104,97,116,32,100,101,102, - 105,110,101,32,101,120,101,99,95,109,111,100,117,108,101,40, - 41,32,109,117,115,116,32,97,108,115,111,32,100,101,102,105, - 110,101,32,99,114,101,97,116,101,95,109,111,100,117,108,101, - 40,41,41,7,114,4,0,0,0,114,110,0,0,0,114,150, - 0,0,0,114,80,0,0,0,114,18,0,0,0,114,17,0, - 0,0,114,149,0,0,0,169,2,114,96,0,0,0,114,97, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,16,109,111,100,117,108,101,95,102,114,111,109,95, - 115,112,101,99,53,2,0,0,115,20,0,0,0,4,3,12, - 1,14,3,12,1,8,1,8,2,10,1,10,1,4,1,255, - 128,114,153,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, - 100,0,0,0,124,0,106,0,100,1,117,0,114,14,100,2, - 110,4,124,0,106,0,125,1,124,0,106,1,100,1,117,0, - 114,64,124,0,106,2,100,1,117,0,114,50,100,3,160,3, - 124,1,161,1,83,0,100,4,160,3,124,1,124,0,106,2, - 161,2,83,0,124,0,106,4,114,84,100,5,160,3,124,1, - 124,0,106,1,161,2,83,0,100,6,160,3,124,0,106,0, - 124,0,106,1,161,2,83,0,41,7,122,38,82,101,116,117, - 114,110,32,116,104,101,32,114,101,112,114,32,116,111,32,117, - 115,101,32,102,111,114,32,116,104,101,32,109,111,100,117,108, - 101,46,78,114,101,0,0,0,114,102,0,0,0,114,103,0, - 0,0,114,104,0,0,0,250,18,60,109,111,100,117,108,101, - 32,123,33,114,125,32,40,123,125,41,62,41,5,114,17,0, - 0,0,114,114,0,0,0,114,110,0,0,0,114,46,0,0, - 0,114,124,0,0,0,41,2,114,96,0,0,0,114,17,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,108,0,0,0,70,2,0,0,115,18,0,0,0,20, - 3,10,1,10,1,10,1,14,2,6,2,14,1,16,2,255, - 128,114,108,0,0,0,99,2,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,10,0,0,0,67,0,0,0,115, - 252,0,0,0,124,0,106,0,125,2,116,1,124,2,131,1, - 143,218,1,0,116,2,106,3,160,4,124,2,161,1,124,1, - 117,1,114,54,100,1,160,5,124,2,161,1,125,3,116,6, - 124,3,124,2,100,2,141,2,130,1,122,132,124,0,106,7, - 100,3,117,0,114,106,124,0,106,8,100,3,117,0,114,90, - 116,6,100,4,124,0,106,0,100,2,141,2,130,1,116,9, - 124,0,124,1,100,5,100,6,141,3,1,0,110,52,116,9, - 124,0,124,1,100,5,100,6,141,3,1,0,116,10,124,0, - 106,7,100,7,131,2,115,146,124,0,106,7,160,11,124,2, - 161,1,1,0,110,12,124,0,106,7,160,12,124,1,161,1, - 1,0,87,0,116,2,106,3,160,13,124,0,106,0,161,1, - 125,1,124,1,116,2,106,3,124,0,106,0,60,0,110,28, - 116,2,106,3,160,13,124,0,106,0,161,1,125,1,124,1, - 116,2,106,3,124,0,106,0,60,0,48,0,87,0,100,3, - 4,0,4,0,131,3,1,0,124,1,83,0,49,0,115,238, - 48,0,1,0,1,0,1,0,89,0,1,0,124,1,83,0, - 41,8,122,70,69,120,101,99,117,116,101,32,116,104,101,32, - 115,112,101,99,39,115,32,115,112,101,99,105,102,105,101,100, - 32,109,111,100,117,108,101,32,105,110,32,97,110,32,101,120, - 105,115,116,105,110,103,32,109,111,100,117,108,101,39,115,32, - 110,97,109,101,115,112,97,99,101,46,122,30,109,111,100,117, - 108,101,32,123,33,114,125,32,110,111,116,32,105,110,32,115, - 121,115,46,109,111,100,117,108,101,115,114,16,0,0,0,78, - 250,14,109,105,115,115,105,110,103,32,108,111,97,100,101,114, - 84,114,144,0,0,0,114,151,0,0,0,41,14,114,17,0, - 0,0,114,51,0,0,0,114,15,0,0,0,114,93,0,0, - 0,114,35,0,0,0,114,46,0,0,0,114,80,0,0,0, - 114,110,0,0,0,114,117,0,0,0,114,149,0,0,0,114, - 4,0,0,0,218,11,108,111,97,100,95,109,111,100,117,108, - 101,114,151,0,0,0,218,3,112,111,112,41,4,114,96,0, - 0,0,114,97,0,0,0,114,17,0,0,0,218,3,109,115, - 103,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,94,0,0,0,87,2,0,0,115,44,0,0,0,6,2, - 10,1,16,1,10,1,12,1,2,1,10,1,10,1,14,1, - 16,2,14,2,12,1,14,4,14,2,14,4,14,1,14,255, - 26,1,4,1,16,255,4,1,255,128,114,94,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 8,0,0,0,67,0,0,0,115,18,1,0,0,122,18,124, - 0,106,0,160,1,124,0,106,2,161,1,1,0,87,0,110, - 46,1,0,1,0,1,0,124,0,106,2,116,3,106,4,118, - 0,114,64,116,3,106,4,160,5,124,0,106,2,161,1,125, - 1,124,1,116,3,106,4,124,0,106,2,60,0,130,0,116, - 3,106,4,160,5,124,0,106,2,161,1,125,1,124,1,116, - 3,106,4,124,0,106,2,60,0,116,6,124,1,100,1,100, - 0,131,3,100,0,117,0,114,140,122,12,124,0,106,0,124, - 1,95,7,87,0,110,18,4,0,116,8,121,138,1,0,1, - 0,1,0,89,0,110,2,48,0,116,6,124,1,100,2,100, - 0,131,3,100,0,117,0,114,216,122,40,124,1,106,9,124, - 1,95,10,116,11,124,1,100,3,131,2,115,194,124,0,106, - 2,160,12,100,4,161,1,100,5,25,0,124,1,95,10,87, - 0,110,18,4,0,116,8,121,214,1,0,1,0,1,0,89, - 0,110,2,48,0,116,6,124,1,100,6,100,0,131,3,100, - 0,117,0,144,1,114,14,122,12,124,0,124,1,95,13,87, - 0,124,1,83,0,4,0,116,8,144,1,121,12,1,0,1, - 0,1,0,89,0,124,1,83,0,48,0,124,1,83,0,41, - 7,78,114,99,0,0,0,114,146,0,0,0,114,142,0,0, - 0,114,129,0,0,0,114,22,0,0,0,114,106,0,0,0, - 41,14,114,110,0,0,0,114,156,0,0,0,114,17,0,0, - 0,114,15,0,0,0,114,93,0,0,0,114,157,0,0,0, - 114,6,0,0,0,114,99,0,0,0,114,107,0,0,0,114, - 1,0,0,0,114,146,0,0,0,114,4,0,0,0,114,130, - 0,0,0,114,106,0,0,0,114,152,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,25,95,108, - 111,97,100,95,98,97,99,107,119,97,114,100,95,99,111,109, - 112,97,116,105,98,108,101,117,2,0,0,115,62,0,0,0, - 2,4,18,1,6,1,12,1,14,1,12,1,2,1,14,3, - 12,1,16,1,2,1,12,1,12,1,6,1,16,1,2,1, - 8,4,10,1,22,1,12,1,6,1,18,1,2,1,8,1, - 4,3,14,254,2,1,4,1,2,255,4,1,255,128,114,159, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,11,0,0,0,67,0,0,0,115,212,0,0, - 0,124,0,106,0,100,0,117,1,114,30,116,1,124,0,106, - 0,100,1,131,2,115,30,116,2,124,0,131,1,83,0,116, - 3,124,0,131,1,125,1,100,2,124,0,95,4,122,158,124, - 1,116,5,106,6,124,0,106,7,60,0,122,50,124,0,106, - 0,100,0,117,0,114,94,124,0,106,8,100,0,117,0,114, - 106,116,9,100,3,124,0,106,7,100,4,141,2,130,1,124, - 0,106,0,160,10,124,1,161,1,1,0,87,0,110,40,1, - 0,1,0,1,0,122,14,116,5,106,6,124,0,106,7,61, - 0,87,0,130,0,4,0,116,11,121,148,1,0,1,0,1, - 0,89,0,130,0,48,0,116,5,106,6,160,12,124,0,106, - 7,161,1,125,1,124,1,116,5,106,6,124,0,106,7,60, - 0,116,13,100,5,124,0,106,7,124,0,106,0,131,3,1, - 0,87,0,100,6,124,0,95,4,124,1,83,0,100,6,124, - 0,95,4,48,0,41,7,78,114,151,0,0,0,84,114,155, - 0,0,0,114,16,0,0,0,122,18,105,109,112,111,114,116, - 32,123,33,114,125,32,35,32,123,33,114,125,70,41,14,114, - 110,0,0,0,114,4,0,0,0,114,159,0,0,0,114,153, - 0,0,0,90,13,95,105,110,105,116,105,97,108,105,122,105, - 110,103,114,15,0,0,0,114,93,0,0,0,114,17,0,0, - 0,114,117,0,0,0,114,80,0,0,0,114,151,0,0,0, - 114,64,0,0,0,114,157,0,0,0,114,77,0,0,0,114, - 152,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,14,95,108,111,97,100,95,117,110,108,111,99, - 107,101,100,154,2,0,0,115,54,0,0,0,10,2,12,2, - 8,1,8,2,6,5,2,1,12,1,2,1,10,1,10,1, - 14,1,16,3,6,1,2,1,12,1,2,3,12,254,2,1, - 2,1,2,255,14,6,12,1,18,1,6,2,4,2,8,254, - 255,128,114,160,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,8,0,0,0,67,0,0,0, - 115,54,0,0,0,116,0,124,0,106,1,131,1,143,24,1, - 0,116,2,124,0,131,1,87,0,2,0,100,1,4,0,4, - 0,131,3,1,0,83,0,49,0,115,40,48,0,1,0,1, - 0,1,0,89,0,1,0,100,1,83,0,41,2,122,191,82, - 101,116,117,114,110,32,97,32,110,101,119,32,109,111,100,117, - 108,101,32,111,98,106,101,99,116,44,32,108,111,97,100,101, - 100,32,98,121,32,116,104,101,32,115,112,101,99,39,115,32, - 108,111,97,100,101,114,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,97, - 100,100,101,100,32,116,111,32,105,116,115,32,112,97,114,101, - 110,116,46,10,10,32,32,32,32,73,102,32,97,32,109,111, - 100,117,108,101,32,105,115,32,97,108,114,101,97,100,121,32, - 105,110,32,115,121,115,46,109,111,100,117,108,101,115,44,32, - 116,104,97,116,32,101,120,105,115,116,105,110,103,32,109,111, - 100,117,108,101,32,103,101,116,115,10,32,32,32,32,99,108, - 111,98,98,101,114,101,100,46,10,10,32,32,32,32,78,41, - 3,114,51,0,0,0,114,17,0,0,0,114,160,0,0,0, - 169,1,114,96,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,95,0,0,0,196,2,0,0,115, - 6,0,0,0,12,9,42,1,255,128,114,95,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,64,0,0,0,115,140,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,90,4,101,5,100, - 3,100,4,132,0,131,1,90,6,101,7,100,20,100,6,100, - 7,132,1,131,1,90,8,101,7,100,21,100,8,100,9,132, - 1,131,1,90,9,101,5,100,10,100,11,132,0,131,1,90, - 10,101,5,100,12,100,13,132,0,131,1,90,11,101,7,101, - 12,100,14,100,15,132,0,131,1,131,1,90,13,101,7,101, - 12,100,16,100,17,132,0,131,1,131,1,90,14,101,7,101, - 12,100,18,100,19,132,0,131,1,131,1,90,15,101,7,101, - 16,131,1,90,17,100,5,83,0,41,22,218,15,66,117,105, - 108,116,105,110,73,109,112,111,114,116,101,114,122,144,77,101, - 116,97,32,112,97,116,104,32,105,109,112,111,114,116,32,102, - 111,114,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,115,46,10,10,32,32,32,32,65,108,108,32,109,101, - 116,104,111,100,115,32,97,114,101,32,101,105,116,104,101,114, - 32,99,108,97,115,115,32,111,114,32,115,116,97,116,105,99, - 32,109,101,116,104,111,100,115,32,116,111,32,97,118,111,105, - 100,32,116,104,101,32,110,101,101,100,32,116,111,10,32,32, - 32,32,105,110,115,116,97,110,116,105,97,116,101,32,116,104, - 101,32,99,108,97,115,115,46,10,10,32,32,32,32,122,8, - 98,117,105,108,116,45,105,110,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,5,0,0,0,67,0,0, - 0,115,22,0,0,0,100,1,124,0,106,0,155,2,100,2, - 116,1,106,2,155,0,100,3,157,5,83,0,41,5,250,115, - 82,101,116,117,114,110,32,114,101,112,114,32,102,111,114,32, - 116,104,101,32,109,111,100,117,108,101,46,10,10,32,32,32, - 32,32,32,32,32,84,104,101,32,109,101,116,104,111,100,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, - 84,104,101,32,105,109,112,111,114,116,32,109,97,99,104,105, - 110,101,114,121,32,100,111,101,115,32,116,104,101,32,106,111, - 98,32,105,116,115,101,108,102,46,10,10,32,32,32,32,32, - 32,32,32,122,8,60,109,111,100,117,108,101,32,122,2,32, - 40,122,2,41,62,78,41,3,114,1,0,0,0,114,162,0, - 0,0,114,139,0,0,0,169,1,114,97,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,100,0, - 0,0,222,2,0,0,115,4,0,0,0,22,7,255,128,122, - 27,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,4,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, - 0,0,67,0,0,0,115,42,0,0,0,124,2,100,0,117, - 1,114,12,100,0,83,0,116,0,160,1,124,1,161,1,114, - 38,116,2,124,1,124,0,124,0,106,3,100,1,141,3,83, - 0,100,0,83,0,169,2,78,114,138,0,0,0,41,4,114, - 58,0,0,0,90,10,105,115,95,98,117,105,108,116,105,110, - 114,92,0,0,0,114,139,0,0,0,169,4,218,3,99,108, - 115,114,82,0,0,0,218,4,112,97,116,104,218,6,116,97, - 114,103,101,116,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,9,102,105,110,100,95,115,112,101,99,231,2, - 0,0,115,12,0,0,0,8,2,4,1,10,1,16,1,4, - 2,255,128,122,25,66,117,105,108,116,105,110,73,109,112,111, - 114,116,101,114,46,102,105,110,100,95,115,112,101,99,99,3, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4, - 0,0,0,67,0,0,0,115,30,0,0,0,124,0,160,0, - 124,1,124,2,161,2,125,3,124,3,100,1,117,1,114,26, - 124,3,106,1,83,0,100,1,83,0,41,2,122,175,70,105, - 110,100,32,116,104,101,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, - 32,73,102,32,39,112,97,116,104,39,32,105,115,32,101,118, - 101,114,32,115,112,101,99,105,102,105,101,100,32,116,104,101, - 110,32,116,104,101,32,115,101,97,114,99,104,32,105,115,32, - 99,111,110,115,105,100,101,114,101,100,32,97,32,102,97,105, - 108,117,114,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, - 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,2, - 114,170,0,0,0,114,110,0,0,0,41,4,114,167,0,0, - 0,114,82,0,0,0,114,168,0,0,0,114,96,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 11,102,105,110,100,95,109,111,100,117,108,101,240,2,0,0, - 115,6,0,0,0,12,9,18,1,255,128,122,27,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,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, - 0,115,46,0,0,0,124,0,106,0,116,1,106,2,118,1, - 114,34,116,3,100,1,160,4,124,0,106,0,161,1,124,0, - 106,0,100,2,141,2,130,1,116,5,116,6,106,7,124,0, - 131,2,83,0,41,4,122,24,67,114,101,97,116,101,32,97, - 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, - 114,78,0,0,0,114,16,0,0,0,78,41,8,114,17,0, - 0,0,114,15,0,0,0,114,79,0,0,0,114,80,0,0, - 0,114,46,0,0,0,114,68,0,0,0,114,58,0,0,0, - 90,14,99,114,101,97,116,101,95,98,117,105,108,116,105,110, - 114,161,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,150,0,0,0,252,2,0,0,115,12,0, - 0,0,12,3,12,1,4,1,6,255,12,2,255,128,122,29, + 95,108,111,99,97,116,105,111,110,115,218,13,95,115,101,116, + 95,102,105,108,101,97,116,116,114,218,7,95,99,97,99,104, + 101,100,41,6,114,33,0,0,0,114,20,0,0,0,114,116, + 0,0,0,114,120,0,0,0,114,121,0,0,0,114,122,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,34,0,0,0,111,1,0,0,115,16,0,0,0,6, + 2,6,1,6,1,6,1,14,1,6,3,10,1,255,128,122, + 19,77,111,100,117,108,101,83,112,101,99,46,95,95,105,110, + 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,6,0,0,0,67,0,0,0,115,102,0, + 0,0,100,1,160,0,124,0,106,1,161,1,100,2,160,0, + 124,0,106,2,161,1,103,2,125,1,124,0,106,3,100,0, + 117,1,114,52,124,1,160,4,100,3,160,0,124,0,106,3, + 161,1,161,1,1,0,124,0,106,5,100,0,117,1,114,80, + 124,1,160,4,100,4,160,0,124,0,106,5,161,1,161,1, + 1,0,100,5,160,0,124,0,106,6,106,7,100,6,160,8, + 124,1,161,1,161,2,83,0,41,7,78,122,9,110,97,109, + 101,61,123,33,114,125,122,11,108,111,97,100,101,114,61,123, + 33,114,125,122,11,111,114,105,103,105,110,61,123,33,114,125, + 122,29,115,117,98,109,111,100,117,108,101,95,115,101,97,114, + 99,104,95,108,111,99,97,116,105,111,110,115,61,123,125,122, + 6,123,125,40,123,125,41,122,2,44,32,41,9,114,49,0, + 0,0,114,20,0,0,0,114,116,0,0,0,114,120,0,0, + 0,218,6,97,112,112,101,110,100,114,123,0,0,0,218,9, + 95,95,99,108,97,115,115,95,95,114,9,0,0,0,218,4, + 106,111,105,110,41,2,114,33,0,0,0,114,59,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 52,0,0,0,123,1,0,0,115,22,0,0,0,10,1,10, + 1,4,255,10,2,18,1,10,1,8,1,4,1,6,255,22, + 2,255,128,122,19,77,111,100,117,108,101,83,112,101,99,46, + 95,95,114,101,112,114,95,95,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, + 0,115,102,0,0,0,124,0,106,0,125,2,122,72,124,0, + 106,1,124,1,106,1,107,2,111,76,124,0,106,2,124,1, + 106,2,107,2,111,76,124,0,106,3,124,1,106,3,107,2, + 111,76,124,2,124,1,106,0,107,2,111,76,124,0,106,4, + 124,1,106,4,107,2,111,76,124,0,106,5,124,1,106,5, + 107,2,87,0,83,0,4,0,116,6,121,100,1,0,1,0, + 1,0,116,7,6,0,89,0,83,0,48,0,114,0,0,0, + 0,41,8,114,123,0,0,0,114,20,0,0,0,114,116,0, + 0,0,114,120,0,0,0,218,6,99,97,99,104,101,100,218, + 12,104,97,115,95,108,111,99,97,116,105,111,110,114,2,0, + 0,0,218,14,78,111,116,73,109,112,108,101,109,101,110,116, + 101,100,41,3,114,33,0,0,0,90,5,111,116,104,101,114, + 90,4,115,109,115,108,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,6,95,95,101,113,95,95,133,1,0, + 0,115,32,0,0,0,6,1,2,1,12,1,10,1,2,255, + 10,2,2,254,8,3,2,253,10,4,2,252,10,5,4,251, + 12,6,10,1,255,128,122,17,77,111,100,117,108,101,83,112, + 101,99,46,95,95,101,113,95,95,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,58,0,0,0,124,0,106,0,100,0,117,0,114, + 52,124,0,106,1,100,0,117,1,114,52,124,0,106,2,114, + 52,116,3,100,0,117,0,114,38,116,4,130,1,116,3,160, + 5,124,0,106,1,161,1,124,0,95,0,124,0,106,0,83, + 0,114,0,0,0,0,41,6,114,125,0,0,0,114,120,0, + 0,0,114,124,0,0,0,218,19,95,98,111,111,116,115,116, + 114,97,112,95,101,120,116,101,114,110,97,108,218,19,78,111, + 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, + 114,90,11,95,103,101,116,95,99,97,99,104,101,100,114,51, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,114,129,0,0,0,145,1,0,0,115,14,0,0,0, + 10,2,16,1,8,1,4,1,14,1,6,1,255,128,122,17, + 77,111,100,117,108,101,83,112,101,99,46,99,97,99,104,101, + 100,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,2,0,0,0,67,0,0,0,115,10,0,0,0,124, + 1,124,0,95,0,100,0,83,0,114,0,0,0,0,41,1, + 114,125,0,0,0,41,2,114,33,0,0,0,114,129,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 114,129,0,0,0,154,1,0,0,115,4,0,0,0,10,2, + 255,128,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,32,0,0,0, + 124,0,106,0,100,1,117,0,114,26,124,0,106,1,160,2, + 100,2,161,1,100,3,25,0,83,0,124,0,106,1,83,0, + 41,4,122,32,84,104,101,32,110,97,109,101,32,111,102,32, + 116,104,101,32,109,111,100,117,108,101,39,115,32,112,97,114, + 101,110,116,46,78,218,1,46,114,25,0,0,0,41,3,114, + 123,0,0,0,114,20,0,0,0,218,10,114,112,97,114,116, + 105,116,105,111,110,114,51,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,6,112,97,114,101,110, + 116,158,1,0,0,115,8,0,0,0,10,3,16,1,6,2, + 255,128,122,17,77,111,100,117,108,101,83,112,101,99,46,112, + 97,114,101,110,116,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,6, + 0,0,0,124,0,106,0,83,0,114,0,0,0,0,41,1, + 114,124,0,0,0,114,51,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,130,0,0,0,166,1, + 0,0,115,4,0,0,0,6,2,255,128,122,23,77,111,100, + 117,108,101,83,112,101,99,46,104,97,115,95,108,111,99,97, + 116,105,111,110,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,2,0,0,0,67,0,0,0,115,14,0, + 0,0,116,0,124,1,131,1,124,0,95,1,100,0,83,0, + 114,0,0,0,0,41,2,218,4,98,111,111,108,114,124,0, + 0,0,41,2,114,33,0,0,0,218,5,118,97,108,117,101, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 130,0,0,0,170,1,0,0,115,4,0,0,0,14,2,255, + 128,41,12,114,9,0,0,0,114,8,0,0,0,114,1,0, + 0,0,114,10,0,0,0,114,34,0,0,0,114,52,0,0, + 0,114,132,0,0,0,218,8,112,114,111,112,101,114,116,121, + 114,129,0,0,0,218,6,115,101,116,116,101,114,114,137,0, + 0,0,114,130,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,119,0,0,0, + 74,1,0,0,115,36,0,0,0,8,0,4,1,4,36,2, + 1,12,255,8,12,8,10,2,12,10,1,4,8,10,1,2, + 3,10,1,2,7,10,1,4,3,14,1,255,128,114,119,0, + 0,0,169,2,114,120,0,0,0,114,122,0,0,0,99,2, + 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,8, + 0,0,0,67,0,0,0,115,150,0,0,0,116,0,124,1, + 100,1,131,2,114,74,116,1,100,2,117,0,114,22,116,2, + 130,1,116,1,106,3,125,4,124,3,100,2,117,0,114,48, + 124,4,124,0,124,1,100,3,141,2,83,0,124,3,114,56, + 103,0,110,2,100,2,125,5,124,4,124,0,124,1,124,5, + 100,4,141,3,83,0,124,3,100,2,117,0,114,134,116,0, + 124,1,100,5,131,2,114,130,122,14,124,1,160,4,124,0, + 161,1,125,3,87,0,110,26,4,0,116,5,121,128,1,0, + 1,0,1,0,100,2,125,3,89,0,110,6,48,0,100,6, + 125,3,116,6,124,0,124,1,124,2,124,3,100,7,141,4, + 83,0,41,8,122,53,82,101,116,117,114,110,32,97,32,109, + 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, + 32,111,110,32,118,97,114,105,111,117,115,32,108,111,97,100, + 101,114,32,109,101,116,104,111,100,115,46,90,12,103,101,116, + 95,102,105,108,101,110,97,109,101,78,41,1,114,116,0,0, + 0,41,2,114,116,0,0,0,114,123,0,0,0,114,122,0, + 0,0,70,114,142,0,0,0,41,7,114,11,0,0,0,114, + 133,0,0,0,114,134,0,0,0,218,23,115,112,101,99,95, + 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, + 111,110,114,122,0,0,0,114,83,0,0,0,114,119,0,0, + 0,41,6,114,20,0,0,0,114,116,0,0,0,114,120,0, + 0,0,114,122,0,0,0,114,143,0,0,0,90,6,115,101, + 97,114,99,104,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,98,0,0,0,175,1,0,0,115,38,0,0, + 0,10,2,8,1,4,1,6,1,8,2,12,1,12,1,6, + 1,2,1,6,255,8,3,10,1,2,1,14,1,12,1,10, + 1,4,3,16,2,255,128,114,98,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0, + 0,67,0,0,0,115,40,1,0,0,122,10,124,0,106,0, + 125,3,87,0,110,18,4,0,116,1,121,28,1,0,1,0, + 1,0,89,0,110,14,48,0,124,3,100,0,117,1,114,42, + 124,3,83,0,124,0,106,2,125,4,124,1,100,0,117,0, + 114,86,122,10,124,0,106,3,125,1,87,0,110,18,4,0, + 116,1,121,84,1,0,1,0,1,0,89,0,110,2,48,0, + 122,10,124,0,106,4,125,5,87,0,110,22,4,0,116,1, + 121,118,1,0,1,0,1,0,100,0,125,5,89,0,110,2, + 48,0,124,2,100,0,117,0,114,174,124,5,100,0,117,0, + 114,170,122,10,124,1,106,5,125,2,87,0,110,26,4,0, + 116,1,121,168,1,0,1,0,1,0,100,0,125,2,89,0, + 110,6,48,0,124,5,125,2,122,10,124,0,106,6,125,6, + 87,0,110,22,4,0,116,1,121,206,1,0,1,0,1,0, + 100,0,125,6,89,0,110,2,48,0,122,14,116,7,124,0, + 106,8,131,1,125,7,87,0,110,22,4,0,116,1,121,244, + 1,0,1,0,1,0,100,0,125,7,89,0,110,2,48,0, + 116,9,124,4,124,1,124,2,100,1,141,3,125,3,124,5, + 100,0,117,0,144,1,114,18,100,2,110,2,100,3,124,3, + 95,10,124,6,124,3,95,11,124,7,124,3,95,12,124,3, + 83,0,41,4,78,169,1,114,120,0,0,0,70,84,41,13, + 114,113,0,0,0,114,2,0,0,0,114,9,0,0,0,114, + 106,0,0,0,114,115,0,0,0,218,7,95,79,82,73,71, + 73,78,218,10,95,95,99,97,99,104,101,100,95,95,218,4, + 108,105,115,116,218,8,95,95,112,97,116,104,95,95,114,119, + 0,0,0,114,124,0,0,0,114,129,0,0,0,114,123,0, + 0,0,41,8,114,104,0,0,0,114,116,0,0,0,114,120, + 0,0,0,114,103,0,0,0,114,20,0,0,0,90,8,108, + 111,99,97,116,105,111,110,114,129,0,0,0,114,123,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,17,95,115,112,101,99,95,102,114,111,109,95,109,111,100, + 117,108,101,201,1,0,0,115,74,0,0,0,2,2,10,1, + 12,1,6,1,8,2,4,1,6,2,8,1,2,1,10,1, + 12,1,6,2,2,1,10,1,12,1,10,1,8,1,8,1, + 2,1,10,1,12,1,10,1,4,2,2,1,10,1,12,1, + 10,1,2,1,14,1,12,1,10,1,14,2,20,1,6,1, + 6,1,4,1,255,128,114,149,0,0,0,70,169,1,218,8, + 111,118,101,114,114,105,100,101,99,2,0,0,0,0,0,0, + 0,1,0,0,0,5,0,0,0,8,0,0,0,67,0,0, + 0,115,214,1,0,0,124,2,115,20,116,0,124,1,100,1, + 100,0,131,3,100,0,117,0,114,52,122,12,124,0,106,1, + 124,1,95,2,87,0,110,18,4,0,116,3,121,50,1,0, + 1,0,1,0,89,0,110,2,48,0,124,2,115,72,116,0, + 124,1,100,2,100,0,131,3,100,0,117,0,114,174,124,0, + 106,4,125,3,124,3,100,0,117,0,114,144,124,0,106,5, + 100,0,117,1,114,144,116,6,100,0,117,0,114,108,116,7, + 130,1,116,6,106,8,125,4,124,4,160,9,124,4,161,1, + 125,3,124,0,106,5,124,3,95,10,124,3,124,0,95,4, + 100,0,124,1,95,11,122,10,124,3,124,1,95,12,87,0, + 110,18,4,0,116,3,121,172,1,0,1,0,1,0,89,0, + 110,2,48,0,124,2,115,194,116,0,124,1,100,3,100,0, + 131,3,100,0,117,0,114,226,122,12,124,0,106,13,124,1, + 95,14,87,0,110,18,4,0,116,3,121,224,1,0,1,0, + 1,0,89,0,110,2,48,0,122,10,124,0,124,1,95,15, + 87,0,110,18,4,0,116,3,121,254,1,0,1,0,1,0, + 89,0,110,2,48,0,124,2,144,1,115,24,116,0,124,1, + 100,4,100,0,131,3,100,0,117,0,144,1,114,70,124,0, + 106,5,100,0,117,1,144,1,114,70,122,12,124,0,106,5, + 124,1,95,16,87,0,110,20,4,0,116,3,144,1,121,68, + 1,0,1,0,1,0,89,0,110,2,48,0,124,0,106,17, + 144,1,114,210,124,2,144,1,115,102,116,0,124,1,100,5, + 100,0,131,3,100,0,117,0,144,1,114,136,122,12,124,0, + 106,18,124,1,95,11,87,0,110,20,4,0,116,3,144,1, + 121,134,1,0,1,0,1,0,89,0,110,2,48,0,124,2, + 144,1,115,160,116,0,124,1,100,6,100,0,131,3,100,0, + 117,0,144,1,114,210,124,0,106,19,100,0,117,1,144,1, + 114,210,122,14,124,0,106,19,124,1,95,20,87,0,124,1, + 83,0,4,0,116,3,144,1,121,208,1,0,1,0,1,0, + 89,0,124,1,83,0,48,0,124,1,83,0,41,7,78,114, + 9,0,0,0,114,106,0,0,0,218,11,95,95,112,97,99, + 107,97,103,101,95,95,114,148,0,0,0,114,115,0,0,0, + 114,146,0,0,0,41,21,114,13,0,0,0,114,20,0,0, + 0,114,9,0,0,0,114,2,0,0,0,114,116,0,0,0, + 114,123,0,0,0,114,133,0,0,0,114,134,0,0,0,218, + 16,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,218,7,95,95,110,101,119,95,95,90,5,95,112,97,116, + 104,114,115,0,0,0,114,106,0,0,0,114,137,0,0,0, + 114,152,0,0,0,114,113,0,0,0,114,148,0,0,0,114, + 130,0,0,0,114,120,0,0,0,114,129,0,0,0,114,146, + 0,0,0,41,5,114,103,0,0,0,114,104,0,0,0,114, + 151,0,0,0,114,116,0,0,0,114,153,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,18,95, + 105,110,105,116,95,109,111,100,117,108,101,95,97,116,116,114, + 115,246,1,0,0,115,104,0,0,0,20,4,2,1,12,1, + 12,1,6,1,20,2,6,1,8,1,10,2,8,1,4,1, + 6,1,10,2,8,1,6,1,6,11,2,1,10,1,12,1, + 6,1,20,2,2,1,12,1,12,1,6,1,2,2,10,1, + 12,1,6,1,24,2,12,1,2,1,12,1,14,1,6,1, + 8,2,24,1,2,1,12,1,14,1,6,1,24,2,12,1, + 2,1,10,1,4,3,14,254,2,1,4,1,2,255,4,1, + 255,128,114,155,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,82,0,0,0,100,1,125,1,116,0,124,0,106,1,100, + 2,131,2,114,30,124,0,106,1,160,2,124,0,161,1,125, + 1,110,20,116,0,124,0,106,1,100,3,131,2,114,50,116, + 3,100,4,131,1,130,1,124,1,100,1,117,0,114,68,116, + 4,124,0,106,5,131,1,125,1,116,6,124,0,124,1,131, + 2,1,0,124,1,83,0,41,5,122,43,67,114,101,97,116, + 101,32,97,32,109,111,100,117,108,101,32,98,97,115,101,100, + 32,111,110,32,116,104,101,32,112,114,111,118,105,100,101,100, + 32,115,112,101,99,46,78,218,13,99,114,101,97,116,101,95, + 109,111,100,117,108,101,218,11,101,120,101,99,95,109,111,100, + 117,108,101,122,66,108,111,97,100,101,114,115,32,116,104,97, + 116,32,100,101,102,105,110,101,32,101,120,101,99,95,109,111, + 100,117,108,101,40,41,32,109,117,115,116,32,97,108,115,111, + 32,100,101,102,105,110,101,32,99,114,101,97,116,101,95,109, + 111,100,117,108,101,40,41,41,7,114,11,0,0,0,114,116, + 0,0,0,114,156,0,0,0,114,83,0,0,0,114,21,0, + 0,0,114,20,0,0,0,114,155,0,0,0,169,2,114,103, + 0,0,0,114,104,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,16,109,111,100,117,108,101,95, + 102,114,111,109,95,115,112,101,99,62,2,0,0,115,20,0, + 0,0,4,3,12,1,14,3,12,1,8,1,8,2,10,1, + 10,1,4,1,255,128,114,159,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, + 67,0,0,0,115,100,0,0,0,124,0,106,0,100,1,117, + 0,114,14,100,2,110,4,124,0,106,0,125,1,124,0,106, + 1,100,1,117,0,114,64,124,0,106,2,100,1,117,0,114, + 50,100,3,160,3,124,1,161,1,83,0,100,4,160,3,124, + 1,124,0,106,2,161,2,83,0,124,0,106,4,114,84,100, + 5,160,3,124,1,124,0,106,1,161,2,83,0,100,6,160, + 3,124,0,106,0,124,0,106,1,161,2,83,0,41,7,122, + 38,82,101,116,117,114,110,32,116,104,101,32,114,101,112,114, + 32,116,111,32,117,115,101,32,102,111,114,32,116,104,101,32, + 109,111,100,117,108,101,46,78,114,108,0,0,0,114,109,0, + 0,0,114,110,0,0,0,114,111,0,0,0,250,18,60,109, + 111,100,117,108,101,32,123,33,114,125,32,40,123,125,41,62, + 41,5,114,20,0,0,0,114,120,0,0,0,114,116,0,0, + 0,114,49,0,0,0,114,130,0,0,0,41,2,114,103,0, + 0,0,114,20,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,114,0,0,0,79,2,0,0,115, + 18,0,0,0,20,3,10,1,10,1,10,1,14,2,6,2, + 14,1,16,2,255,128,114,114,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,10,0,0,0, + 67,0,0,0,115,26,1,0,0,124,0,106,0,125,2,116, + 1,124,2,131,1,143,246,1,0,116,2,106,3,160,4,124, + 2,161,1,124,1,117,1,114,54,100,1,160,5,124,2,161, + 1,125,3,116,6,124,3,124,2,100,2,141,2,130,1,122, + 160,124,0,106,7,100,3,117,0,114,106,124,0,106,8,100, + 3,117,0,114,90,116,6,100,4,124,0,106,0,100,2,141, + 2,130,1,116,9,124,0,124,1,100,5,100,6,141,3,1, + 0,110,80,116,9,124,0,124,1,100,5,100,6,141,3,1, + 0,116,10,124,0,106,7,100,7,131,2,115,174,116,11,124, + 0,106,7,131,1,155,0,100,8,157,2,125,3,116,12,160, + 13,124,3,116,14,161,2,1,0,124,0,106,7,160,15,124, + 2,161,1,1,0,110,12,124,0,106,7,160,16,124,1,161, + 1,1,0,87,0,116,2,106,3,160,17,124,0,106,0,161, + 1,125,1,124,1,116,2,106,3,124,0,106,0,60,0,110, + 28,116,2,106,3,160,17,124,0,106,0,161,1,125,1,124, + 1,116,2,106,3,124,0,106,0,60,0,48,0,87,0,100, + 3,4,0,4,0,131,3,1,0,124,1,83,0,49,0,144, + 1,115,12,48,0,1,0,1,0,1,0,89,0,1,0,124, + 1,83,0,41,9,122,70,69,120,101,99,117,116,101,32,116, + 104,101,32,115,112,101,99,39,115,32,115,112,101,99,105,102, + 105,101,100,32,109,111,100,117,108,101,32,105,110,32,97,110, + 32,101,120,105,115,116,105,110,103,32,109,111,100,117,108,101, + 39,115,32,110,97,109,101,115,112,97,99,101,46,122,30,109, + 111,100,117,108,101,32,123,33,114,125,32,110,111,116,32,105, + 110,32,115,121,115,46,109,111,100,117,108,101,115,114,19,0, + 0,0,78,250,14,109,105,115,115,105,110,103,32,108,111,97, + 100,101,114,84,114,150,0,0,0,114,157,0,0,0,250,55, + 46,101,120,101,99,95,109,111,100,117,108,101,40,41,32,110, + 111,116,32,102,111,117,110,100,59,32,102,97,108,108,105,110, + 103,32,98,97,99,107,32,116,111,32,108,111,97,100,95,109, + 111,100,117,108,101,40,41,41,18,114,20,0,0,0,114,54, + 0,0,0,114,18,0,0,0,114,99,0,0,0,114,38,0, + 0,0,114,49,0,0,0,114,83,0,0,0,114,116,0,0, + 0,114,123,0,0,0,114,155,0,0,0,114,11,0,0,0, + 114,7,0,0,0,114,95,0,0,0,114,96,0,0,0,218, + 13,73,109,112,111,114,116,87,97,114,110,105,110,103,218,11, + 108,111,97,100,95,109,111,100,117,108,101,114,157,0,0,0, + 218,3,112,111,112,41,4,114,103,0,0,0,114,104,0,0, + 0,114,20,0,0,0,114,102,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,100,0,0,0,96, + 2,0,0,115,48,0,0,0,6,2,10,1,16,1,10,1, + 12,1,2,1,10,1,10,1,14,1,16,2,14,2,12,1, + 16,1,12,2,14,1,14,2,14,4,14,1,14,255,26,1, + 4,1,18,255,4,1,255,128,114,100,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0, + 0,0,67,0,0,0,115,18,1,0,0,122,18,124,0,106, + 0,160,1,124,0,106,2,161,1,1,0,87,0,110,46,1, + 0,1,0,1,0,124,0,106,2,116,3,106,4,118,0,114, + 64,116,3,106,4,160,5,124,0,106,2,161,1,125,1,124, + 1,116,3,106,4,124,0,106,2,60,0,130,0,116,3,106, + 4,160,5,124,0,106,2,161,1,125,1,124,1,116,3,106, + 4,124,0,106,2,60,0,116,6,124,1,100,1,100,0,131, + 3,100,0,117,0,114,140,122,12,124,0,106,0,124,1,95, + 7,87,0,110,18,4,0,116,8,121,138,1,0,1,0,1, + 0,89,0,110,2,48,0,116,6,124,1,100,2,100,0,131, + 3,100,0,117,0,114,216,122,40,124,1,106,9,124,1,95, + 10,116,11,124,1,100,3,131,2,115,194,124,0,106,2,160, + 12,100,4,161,1,100,5,25,0,124,1,95,10,87,0,110, + 18,4,0,116,8,121,214,1,0,1,0,1,0,89,0,110, + 2,48,0,116,6,124,1,100,6,100,0,131,3,100,0,117, + 0,144,1,114,14,122,12,124,0,124,1,95,13,87,0,124, + 1,83,0,4,0,116,8,144,1,121,12,1,0,1,0,1, + 0,89,0,124,1,83,0,48,0,124,1,83,0,41,7,78, + 114,106,0,0,0,114,152,0,0,0,114,148,0,0,0,114, + 135,0,0,0,114,25,0,0,0,114,113,0,0,0,41,14, + 114,116,0,0,0,114,164,0,0,0,114,20,0,0,0,114, + 18,0,0,0,114,99,0,0,0,114,165,0,0,0,114,13, + 0,0,0,114,106,0,0,0,114,2,0,0,0,114,9,0, + 0,0,114,152,0,0,0,114,11,0,0,0,114,136,0,0, + 0,114,113,0,0,0,114,158,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,25,95,108,111,97, + 100,95,98,97,99,107,119,97,114,100,95,99,111,109,112,97, + 116,105,98,108,101,126,2,0,0,115,62,0,0,0,2,3, + 18,1,6,1,12,1,14,1,12,1,2,1,14,3,12,1, + 16,1,2,1,12,1,12,1,6,1,16,1,2,1,8,4, + 10,1,22,1,12,1,6,1,18,1,2,1,8,1,4,3, + 14,254,2,1,4,1,2,255,4,1,255,128,114,166,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,11,0,0,0,67,0,0,0,115,240,0,0,0,124, + 0,106,0,100,0,117,1,114,58,116,1,124,0,106,0,100, + 1,131,2,115,58,116,2,124,0,106,0,131,1,155,0,100, + 2,157,2,125,1,116,3,160,4,124,1,116,5,161,2,1, + 0,116,6,124,0,131,1,83,0,116,7,124,0,131,1,125, + 2,100,3,124,0,95,8,122,158,124,2,116,9,106,10,124, + 0,106,11,60,0,122,50,124,0,106,0,100,0,117,0,114, + 122,124,0,106,12,100,0,117,0,114,134,116,13,100,4,124, + 0,106,11,100,5,141,2,130,1,124,0,106,0,160,14,124, + 2,161,1,1,0,87,0,110,40,1,0,1,0,1,0,122, + 14,116,9,106,10,124,0,106,11,61,0,87,0,130,0,4, + 0,116,15,121,176,1,0,1,0,1,0,89,0,130,0,48, + 0,116,9,106,10,160,16,124,0,106,11,161,1,125,2,124, + 2,116,9,106,10,124,0,106,11,60,0,116,17,100,6,124, + 0,106,11,124,0,106,0,131,3,1,0,87,0,100,7,124, + 0,95,8,124,2,83,0,100,7,124,0,95,8,48,0,41, + 8,78,114,157,0,0,0,114,162,0,0,0,84,114,161,0, + 0,0,114,19,0,0,0,122,18,105,109,112,111,114,116,32, + 123,33,114,125,32,35,32,123,33,114,125,70,41,18,114,116, + 0,0,0,114,11,0,0,0,114,7,0,0,0,114,95,0, + 0,0,114,96,0,0,0,114,163,0,0,0,114,166,0,0, + 0,114,159,0,0,0,90,13,95,105,110,105,116,105,97,108, + 105,122,105,110,103,114,18,0,0,0,114,99,0,0,0,114, + 20,0,0,0,114,123,0,0,0,114,83,0,0,0,114,157, + 0,0,0,114,67,0,0,0,114,165,0,0,0,114,80,0, + 0,0,41,3,114,103,0,0,0,114,102,0,0,0,114,104, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,14,95,108,111,97,100,95,117,110,108,111,99,107, + 101,100,162,2,0,0,115,58,0,0,0,10,2,12,2,16, + 1,12,2,8,1,8,2,6,5,2,1,12,1,2,1,10, + 1,10,1,14,1,16,3,6,1,2,1,12,1,2,3,12, + 254,2,1,2,1,2,255,14,6,12,1,18,1,6,2,4, + 2,8,254,255,128,114,167,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,67, + 0,0,0,115,54,0,0,0,116,0,124,0,106,1,131,1, + 143,24,1,0,116,2,124,0,131,1,87,0,2,0,100,1, + 4,0,4,0,131,3,1,0,83,0,49,0,115,40,48,0, + 1,0,1,0,1,0,89,0,1,0,100,1,83,0,41,2, + 122,191,82,101,116,117,114,110,32,97,32,110,101,119,32,109, + 111,100,117,108,101,32,111,98,106,101,99,116,44,32,108,111, + 97,100,101,100,32,98,121,32,116,104,101,32,115,112,101,99, + 39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111,32,105,116,115,32,112, + 97,114,101,110,116,46,10,10,32,32,32,32,73,102,32,97, + 32,109,111,100,117,108,101,32,105,115,32,97,108,114,101,97, + 100,121,32,105,110,32,115,121,115,46,109,111,100,117,108,101, + 115,44,32,116,104,97,116,32,101,120,105,115,116,105,110,103, + 32,109,111,100,117,108,101,32,103,101,116,115,10,32,32,32, + 32,99,108,111,98,98,101,114,101,100,46,10,10,32,32,32, + 32,78,41,3,114,54,0,0,0,114,20,0,0,0,114,167, + 0,0,0,169,1,114,103,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,101,0,0,0,207,2, + 0,0,115,6,0,0,0,12,9,42,1,255,128,114,101,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,64,0,0,0,115,140,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, + 101,5,100,3,100,4,132,0,131,1,90,6,101,7,100,20, + 100,6,100,7,132,1,131,1,90,8,101,7,100,21,100,8, + 100,9,132,1,131,1,90,9,101,5,100,10,100,11,132,0, + 131,1,90,10,101,5,100,12,100,13,132,0,131,1,90,11, + 101,7,101,12,100,14,100,15,132,0,131,1,131,1,90,13, + 101,7,101,12,100,16,100,17,132,0,131,1,131,1,90,14, + 101,7,101,12,100,18,100,19,132,0,131,1,131,1,90,15, + 101,7,101,16,131,1,90,17,100,5,83,0,41,22,218,15, + 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,122, + 144,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, + 116,32,102,111,114,32,98,117,105,108,116,45,105,110,32,109, + 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, + 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, + 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, + 116,105,99,32,109,101,116,104,111,100,115,32,116,111,32,97, + 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, + 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, + 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, + 32,122,8,98,117,105,108,116,45,105,110,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0, + 67,0,0,0,115,22,0,0,0,100,1,124,0,106,0,155, + 2,100,2,116,1,106,2,155,0,100,3,157,5,83,0,41, + 5,250,115,82,101,116,117,114,110,32,114,101,112,114,32,102, + 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, + 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, + 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, + 32,32,32,32,32,32,122,8,60,109,111,100,117,108,101,32, + 122,2,32,40,122,2,41,62,78,41,3,114,9,0,0,0, + 114,169,0,0,0,114,145,0,0,0,169,1,114,104,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 114,107,0,0,0,233,2,0,0,115,4,0,0,0,22,7, + 255,128,122,27,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,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,5,0,0,0,67,0,0,0,115,42,0,0,0,124,2, + 100,0,117,1,114,12,100,0,83,0,116,0,160,1,124,1, + 161,1,114,38,116,2,124,1,124,0,124,0,106,3,100,1, + 141,3,83,0,100,0,83,0,169,2,78,114,144,0,0,0, + 41,4,114,61,0,0,0,90,10,105,115,95,98,117,105,108, + 116,105,110,114,98,0,0,0,114,145,0,0,0,169,4,218, + 3,99,108,115,114,85,0,0,0,218,4,112,97,116,104,218, + 6,116,97,114,103,101,116,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,9,102,105,110,100,95,115,112,101, + 99,242,2,0,0,115,12,0,0,0,8,2,4,1,10,1, + 16,1,4,2,255,128,122,25,66,117,105,108,116,105,110,73, + 109,112,111,114,116,101,114,46,102,105,110,100,95,115,112,101, + 99,99,3,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,4,0,0,0,67,0,0,0,115,30,0,0,0,124, + 0,160,0,124,1,124,2,161,2,125,3,124,3,100,1,117, + 1,114,26,124,3,106,1,83,0,100,1,83,0,41,2,122, + 175,70,105,110,100,32,116,104,101,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,46,10,10,32,32,32,32, + 32,32,32,32,73,102,32,39,112,97,116,104,39,32,105,115, + 32,101,118,101,114,32,115,112,101,99,105,102,105,101,100,32, + 116,104,101,110,32,116,104,101,32,115,101,97,114,99,104,32, + 105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,32, + 102,97,105,108,117,114,101,46,10,10,32,32,32,32,32,32, + 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, + 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110, + 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, + 78,41,2,114,177,0,0,0,114,116,0,0,0,41,4,114, + 174,0,0,0,114,85,0,0,0,114,175,0,0,0,114,103, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,11,102,105,110,100,95,109,111,100,117,108,101,251, + 2,0,0,115,6,0,0,0,12,9,18,1,255,128,122,27, 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46, - 99,114,101,97,116,101,95,109,111,100,117,108,101,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,16,0,0,0,116,0,116,1,106, - 2,124,0,131,2,1,0,100,1,83,0,41,2,122,22,69, - 120,101,99,32,97,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,78,41,3,114,68,0,0,0,114,58,0, - 0,0,90,12,101,120,101,99,95,98,117,105,108,116,105,110, - 114,164,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,151,0,0,0,4,3,0,0,115,4,0, - 0,0,16,3,255,128,122,27,66,117,105,108,116,105,110,73, - 109,112,111,114,116,101,114,46,101,120,101,99,95,109,111,100, - 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,122,57,82,101,116,117,114,110,32, - 78,111,110,101,32,97,115,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,115,32,100,111,32,110,111,116,32, - 104,97,118,101,32,99,111,100,101,32,111,98,106,101,99,116, - 115,46,78,114,10,0,0,0,169,2,114,167,0,0,0,114, - 82,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,8,103,101,116,95,99,111,100,101,9,3,0, - 0,115,4,0,0,0,4,4,255,128,122,24,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,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,41,2,122,56,82,101,116,117,114,110, - 32,78,111,110,101,32,97,115,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,115,32,100,111,32,110,111,116, - 32,104,97,118,101,32,115,111,117,114,99,101,32,99,111,100, - 101,46,78,114,10,0,0,0,114,172,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,10,103,101, - 116,95,115,111,117,114,99,101,15,3,0,0,115,4,0,0, - 0,4,4,255,128,122,26,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,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,3,122,52,82,101,116,117,114,110,32,70,97, - 108,115,101,32,97,115,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,115,32,97,114,101,32,110,101,118,101, - 114,32,112,97,99,107,97,103,101,115,46,70,78,114,10,0, - 0,0,114,172,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,116,0,0,0,21,3,0,0,115, + 102,105,110,100,95,109,111,100,117,108,101,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, + 67,0,0,0,115,46,0,0,0,124,0,106,0,116,1,106, + 2,118,1,114,34,116,3,100,1,160,4,124,0,106,0,161, + 1,124,0,106,0,100,2,141,2,130,1,116,5,116,6,106, + 7,124,0,131,2,83,0,41,4,122,24,67,114,101,97,116, + 101,32,97,32,98,117,105,108,116,45,105,110,32,109,111,100, + 117,108,101,114,81,0,0,0,114,19,0,0,0,78,41,8, + 114,20,0,0,0,114,18,0,0,0,114,82,0,0,0,114, + 83,0,0,0,114,49,0,0,0,114,71,0,0,0,114,61, + 0,0,0,90,14,99,114,101,97,116,101,95,98,117,105,108, + 116,105,110,114,168,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,156,0,0,0,7,3,0,0, + 115,12,0,0,0,12,3,12,1,4,1,6,255,12,2,255, + 128,122,29,66,117,105,108,116,105,110,73,109,112,111,114,116, + 101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,101, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,3,0,0,0,67,0,0,0,115,16,0,0,0,116,0, + 116,1,106,2,124,0,131,2,1,0,100,1,83,0,41,2, + 122,22,69,120,101,99,32,97,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,78,41,3,114,71,0,0,0, + 114,61,0,0,0,90,12,101,120,101,99,95,98,117,105,108, + 116,105,110,114,171,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,157,0,0,0,15,3,0,0, + 115,4,0,0,0,16,3,255,128,122,27,66,117,105,108,116, + 105,110,73,109,112,111,114,116,101,114,46,101,120,101,99,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,1,83,0,41,2,122,57,82,101,116,117, + 114,110,32,78,111,110,101,32,97,115,32,98,117,105,108,116, + 45,105,110,32,109,111,100,117,108,101,115,32,100,111,32,110, + 111,116,32,104,97,118,101,32,99,111,100,101,32,111,98,106, + 101,99,116,115,46,78,114,5,0,0,0,169,2,114,174,0, + 0,0,114,85,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,8,103,101,116,95,99,111,100,101, + 20,3,0,0,115,4,0,0,0,4,4,255,128,122,24,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, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,56,82,101,116, + 117,114,110,32,78,111,110,101,32,97,115,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,115,32,100,111,32, + 110,111,116,32,104,97,118,101,32,115,111,117,114,99,101,32, + 99,111,100,101,46,78,114,5,0,0,0,114,179,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 10,103,101,116,95,115,111,117,114,99,101,26,3,0,0,115, 4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41,18,114,1,0, - 0,0,114,0,0,0,0,114,2,0,0,0,114,3,0,0, - 0,114,139,0,0,0,218,12,115,116,97,116,105,99,109,101, - 116,104,111,100,114,100,0,0,0,218,11,99,108,97,115,115, - 109,101,116,104,111,100,114,170,0,0,0,114,171,0,0,0, - 114,150,0,0,0,114,151,0,0,0,114,87,0,0,0,114, - 173,0,0,0,114,174,0,0,0,114,116,0,0,0,114,98, - 0,0,0,114,156,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,162,0,0, - 0,211,2,0,0,115,48,0,0,0,8,0,4,2,4,7, - 2,2,10,1,2,8,12,1,2,8,12,1,2,11,10,1, - 2,7,10,1,2,4,2,1,12,1,2,4,2,1,12,1, - 2,4,2,1,12,1,12,4,255,128,114,162,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,64,0,0,0,115,144,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,90,4,101,5,100, - 3,100,4,132,0,131,1,90,6,101,7,100,22,100,6,100, - 7,132,1,131,1,90,8,101,7,100,23,100,8,100,9,132, - 1,131,1,90,9,101,5,100,10,100,11,132,0,131,1,90, - 10,101,5,100,12,100,13,132,0,131,1,90,11,101,7,100, - 14,100,15,132,0,131,1,90,12,101,7,101,13,100,16,100, - 17,132,0,131,1,131,1,90,14,101,7,101,13,100,18,100, - 19,132,0,131,1,131,1,90,15,101,7,101,13,100,20,100, - 21,132,0,131,1,131,1,90,16,100,5,83,0,41,24,218, - 14,70,114,111,122,101,110,73,109,112,111,114,116,101,114,122, - 142,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, - 116,32,102,111,114,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,115,46,10,10,32,32,32,32,65,108,108,32,109, - 101,116,104,111,100,115,32,97,114,101,32,101,105,116,104,101, - 114,32,99,108,97,115,115,32,111,114,32,115,116,97,116,105, - 99,32,109,101,116,104,111,100,115,32,116,111,32,97,118,111, - 105,100,32,116,104,101,32,110,101,101,100,32,116,111,10,32, - 32,32,32,105,110,115,116,97,110,116,105,97,116,101,32,116, - 104,101,32,99,108,97,115,115,46,10,10,32,32,32,32,90, - 6,102,114,111,122,101,110,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, - 115,16,0,0,0,100,1,160,0,124,0,106,1,116,2,106, - 3,161,2,83,0,41,3,114,163,0,0,0,114,154,0,0, - 0,78,41,4,114,46,0,0,0,114,1,0,0,0,114,177, - 0,0,0,114,139,0,0,0,41,1,218,1,109,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,100,0,0, - 0,41,3,0,0,115,4,0,0,0,16,7,255,128,122,26, - 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,4,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0, - 67,0,0,0,115,30,0,0,0,116,0,160,1,124,1,161, - 1,114,26,116,2,124,1,124,0,124,0,106,3,100,1,141, - 3,83,0,100,0,83,0,114,165,0,0,0,41,4,114,58, - 0,0,0,114,89,0,0,0,114,92,0,0,0,114,139,0, - 0,0,114,166,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,170,0,0,0,50,3,0,0,115, - 8,0,0,0,10,2,16,1,4,2,255,128,122,24,70,114, - 111,122,101,110,73,109,112,111,114,116,101,114,46,102,105,110, - 100,95,115,112,101,99,99,3,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, - 18,0,0,0,116,0,160,1,124,1,161,1,114,14,124,0, - 83,0,100,1,83,0,41,2,122,93,70,105,110,100,32,97, - 32,102,114,111,122,101,110,32,109,111,100,117,108,101,46,10, - 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,85,115,101,32,102,105,110,100,95,115,112, - 101,99,40,41,32,105,110,115,116,101,97,100,46,10,10,32, - 32,32,32,32,32,32,32,78,41,2,114,58,0,0,0,114, - 89,0,0,0,41,3,114,167,0,0,0,114,82,0,0,0, - 114,168,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,171,0,0,0,57,3,0,0,115,4,0, - 0,0,18,7,255,128,122,26,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,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,42,85,115,101,32,100,101,102,97, - 117,108,116,32,115,101,109,97,110,116,105,99,115,32,102,111, - 114,32,109,111,100,117,108,101,32,99,114,101,97,116,105,111, - 110,46,78,114,10,0,0,0,114,161,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,150,0,0, - 0,66,3,0,0,115,4,0,0,0,4,0,255,128,122,28, - 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,99, - 114,101,97,116,101,95,109,111,100,117,108,101,99,1,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, - 0,67,0,0,0,115,64,0,0,0,124,0,106,0,106,1, - 125,1,116,2,160,3,124,1,161,1,115,36,116,4,100,1, - 160,5,124,1,161,1,124,1,100,2,141,2,130,1,116,6, - 116,2,106,7,124,1,131,2,125,2,116,8,124,2,124,0, - 106,9,131,2,1,0,100,0,83,0,114,88,0,0,0,41, - 10,114,106,0,0,0,114,17,0,0,0,114,58,0,0,0, - 114,89,0,0,0,114,80,0,0,0,114,46,0,0,0,114, - 68,0,0,0,218,17,103,101,116,95,102,114,111,122,101,110, - 95,111,98,106,101,99,116,218,4,101,120,101,99,114,7,0, - 0,0,41,3,114,97,0,0,0,114,17,0,0,0,218,4, - 99,111,100,101,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,151,0,0,0,70,3,0,0,115,16,0,0, - 0,8,2,10,1,10,1,2,1,6,255,12,2,16,1,255, + 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,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,41,3,122,52,82,101,116,117,114,110, + 32,70,97,108,115,101,32,97,115,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,115,32,97,114,101,32,110, + 101,118,101,114,32,112,97,99,107,97,103,101,115,46,70,78, + 114,5,0,0,0,114,179,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,122,0,0,0,32,3, + 0,0,115,4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41,18, + 114,9,0,0,0,114,8,0,0,0,114,1,0,0,0,114, + 10,0,0,0,114,145,0,0,0,218,12,115,116,97,116,105, + 99,109,101,116,104,111,100,114,107,0,0,0,218,11,99,108, + 97,115,115,109,101,116,104,111,100,114,177,0,0,0,114,178, + 0,0,0,114,156,0,0,0,114,157,0,0,0,114,90,0, + 0,0,114,180,0,0,0,114,181,0,0,0,114,122,0,0, + 0,114,105,0,0,0,114,164,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 169,0,0,0,222,2,0,0,115,48,0,0,0,8,0,4, + 2,4,7,2,2,10,1,2,8,12,1,2,8,12,1,2, + 11,10,1,2,7,10,1,2,4,2,1,12,1,2,4,2, + 1,12,1,2,4,2,1,12,1,12,4,255,128,114,169,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,64,0,0,0,115,144,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, + 101,5,100,3,100,4,132,0,131,1,90,6,101,7,100,22, + 100,6,100,7,132,1,131,1,90,8,101,7,100,23,100,8, + 100,9,132,1,131,1,90,9,101,5,100,10,100,11,132,0, + 131,1,90,10,101,5,100,12,100,13,132,0,131,1,90,11, + 101,7,100,14,100,15,132,0,131,1,90,12,101,7,101,13, + 100,16,100,17,132,0,131,1,131,1,90,14,101,7,101,13, + 100,18,100,19,132,0,131,1,131,1,90,15,101,7,101,13, + 100,20,100,21,132,0,131,1,131,1,90,16,100,5,83,0, + 41,24,218,14,70,114,111,122,101,110,73,109,112,111,114,116, + 101,114,122,142,77,101,116,97,32,112,97,116,104,32,105,109, + 112,111,114,116,32,102,111,114,32,102,114,111,122,101,110,32, + 109,111,100,117,108,101,115,46,10,10,32,32,32,32,65,108, + 108,32,109,101,116,104,111,100,115,32,97,114,101,32,101,105, + 116,104,101,114,32,99,108,97,115,115,32,111,114,32,115,116, + 97,116,105,99,32,109,101,116,104,111,100,115,32,116,111,32, + 97,118,111,105,100,32,116,104,101,32,110,101,101,100,32,116, + 111,10,32,32,32,32,105,110,115,116,97,110,116,105,97,116, + 101,32,116,104,101,32,99,108,97,115,115,46,10,10,32,32, + 32,32,90,6,102,114,111,122,101,110,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,67, + 0,0,0,115,16,0,0,0,100,1,160,0,124,0,106,1, + 116,2,106,3,161,2,83,0,41,3,114,170,0,0,0,114, + 160,0,0,0,78,41,4,114,49,0,0,0,114,9,0,0, + 0,114,184,0,0,0,114,145,0,0,0,41,1,218,1,109, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 107,0,0,0,52,3,0,0,115,4,0,0,0,16,7,255, 128,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, - 114,46,101,120,101,99,95,109,111,100,117,108,101,99,2,0, + 114,46,109,111,100,117,108,101,95,114,101,112,114,78,99,4, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5, + 0,0,0,67,0,0,0,115,30,0,0,0,116,0,160,1, + 124,1,161,1,114,26,116,2,124,1,124,0,124,0,106,3, + 100,1,141,3,83,0,100,0,83,0,114,172,0,0,0,41, + 4,114,61,0,0,0,114,92,0,0,0,114,98,0,0,0, + 114,145,0,0,0,114,173,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,177,0,0,0,61,3, + 0,0,115,8,0,0,0,10,2,16,1,4,2,255,128,122, + 24,70,114,111,122,101,110,73,109,112,111,114,116,101,114,46, + 102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, + 0,0,115,18,0,0,0,116,0,160,1,124,1,161,1,114, + 14,124,0,83,0,100,1,83,0,41,2,122,93,70,105,110, + 100,32,97,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,102,105,110,100, + 95,115,112,101,99,40,41,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,32,32,32,32,78,41,2,114,61,0, + 0,0,114,92,0,0,0,41,3,114,174,0,0,0,114,85, + 0,0,0,114,175,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,178,0,0,0,68,3,0,0, + 115,4,0,0,0,18,7,255,128,122,26,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,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,122,42,85,115,101,32,100, + 101,102,97,117,108,116,32,115,101,109,97,110,116,105,99,115, + 32,102,111,114,32,109,111,100,117,108,101,32,99,114,101,97, + 116,105,111,110,46,78,114,5,0,0,0,114,168,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 156,0,0,0,77,3,0,0,115,4,0,0,0,4,0,255, + 128,122,28,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,46,99,114,101,97,116,101,95,109,111,100,117,108,101,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 4,0,0,0,67,0,0,0,115,64,0,0,0,124,0,106, + 0,106,1,125,1,116,2,160,3,124,1,161,1,115,36,116, + 4,100,1,160,5,124,1,161,1,124,1,100,2,141,2,130, + 1,116,6,116,2,106,7,124,1,131,2,125,2,116,8,124, + 2,124,0,106,9,131,2,1,0,100,0,83,0,114,91,0, + 0,0,41,10,114,113,0,0,0,114,20,0,0,0,114,61, + 0,0,0,114,92,0,0,0,114,83,0,0,0,114,49,0, + 0,0,114,71,0,0,0,218,17,103,101,116,95,102,114,111, + 122,101,110,95,111,98,106,101,99,116,218,4,101,120,101,99, + 114,14,0,0,0,41,3,114,104,0,0,0,114,20,0,0, + 0,218,4,99,111,100,101,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,157,0,0,0,81,3,0,0,115, + 16,0,0,0,8,2,10,1,10,1,2,1,6,255,12,2, + 16,1,255,128,122,26,70,114,111,122,101,110,73,109,112,111, + 114,116,101,114,46,101,120,101,99,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, + 124,0,124,1,131,2,83,0,41,2,122,95,76,111,97,100, + 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101, + 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,95, + 109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,100, + 46,10,10,32,32,32,32,32,32,32,32,78,41,1,114,105, + 0,0,0,114,179,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,164,0,0,0,90,3,0,0, + 115,4,0,0,0,10,8,255,128,122,26,70,114,111,122,101, + 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,0,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, + 0,0,0,116,0,160,1,124,1,161,1,83,0,41,2,122, + 45,82,101,116,117,114,110,32,116,104,101,32,99,111,100,101, + 32,111,98,106,101,99,116,32,102,111,114,32,116,104,101,32, + 102,114,111,122,101,110,32,109,111,100,117,108,101,46,78,41, + 2,114,61,0,0,0,114,186,0,0,0,114,179,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 180,0,0,0,100,3,0,0,115,4,0,0,0,10,4,255, + 128,122,23,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,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,54, + 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,102, + 114,111,122,101,110,32,109,111,100,117,108,101,115,32,100,111, + 32,110,111,116,32,104,97,118,101,32,115,111,117,114,99,101, + 32,99,111,100,101,46,78,114,5,0,0,0,114,179,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 114,181,0,0,0,106,3,0,0,115,4,0,0,0,4,4, + 255,128,122,25,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,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,124, - 1,131,2,83,0,41,2,122,95,76,111,97,100,32,97,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,78,41,1,114,98,0,0,0, - 114,172,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,156,0,0,0,79,3,0,0,115,4,0, - 0,0,10,7,255,128,122,26,70,114,111,122,101,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,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0, - 116,0,160,1,124,1,161,1,83,0,41,2,122,45,82,101, - 116,117,114,110,32,116,104,101,32,99,111,100,101,32,111,98, - 106,101,99,116,32,102,111,114,32,116,104,101,32,102,114,111, - 122,101,110,32,109,111,100,117,108,101,46,78,41,2,114,58, - 0,0,0,114,179,0,0,0,114,172,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,173,0,0, - 0,88,3,0,0,115,4,0,0,0,10,4,255,128,122,23, - 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, - 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,122,54,82,101,116, - 117,114,110,32,78,111,110,101,32,97,115,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,115,32,100,111,32,110,111, - 116,32,104,97,118,101,32,115,111,117,114,99,101,32,99,111, - 100,101,46,78,114,10,0,0,0,114,172,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,174,0, - 0,0,94,3,0,0,115,4,0,0,0,4,4,255,128,122, - 25,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,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,10,0,0,0,116,0,160,1,124,1,161,1, - 83,0,41,2,122,46,82,101,116,117,114,110,32,84,114,117, - 101,32,105,102,32,116,104,101,32,102,114,111,122,101,110,32, - 109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,107, - 97,103,101,46,78,41,2,114,58,0,0,0,90,17,105,115, - 95,102,114,111,122,101,110,95,112,97,99,107,97,103,101,114, - 172,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,116,0,0,0,100,3,0,0,115,4,0,0, - 0,10,4,255,128,122,25,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, - 41,2,78,78,41,1,78,41,17,114,1,0,0,0,114,0, - 0,0,0,114,2,0,0,0,114,3,0,0,0,114,139,0, - 0,0,114,175,0,0,0,114,100,0,0,0,114,176,0,0, - 0,114,170,0,0,0,114,171,0,0,0,114,150,0,0,0, - 114,151,0,0,0,114,156,0,0,0,114,91,0,0,0,114, - 173,0,0,0,114,174,0,0,0,114,116,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,177,0,0,0,30,3,0,0,115,50,0,0,0, - 8,0,4,2,4,7,2,2,10,1,2,8,12,1,2,6, - 12,1,2,8,10,1,2,3,10,1,2,8,10,1,2,8, - 2,1,12,1,2,4,2,1,12,1,2,4,2,1,16,1, - 255,128,114,177,0,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,64,0,0,0, - 115,32,0,0,0,101,0,90,1,100,0,90,2,100,1,90, - 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, - 5,100,6,83,0,41,7,218,18,95,73,109,112,111,114,116, - 76,111,99,107,67,111,110,116,101,120,116,122,36,67,111,110, - 116,101,120,116,32,109,97,110,97,103,101,114,32,102,111,114, + 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, + 1,161,1,83,0,41,2,122,46,82,101,116,117,114,110,32, + 84,114,117,101,32,105,102,32,116,104,101,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,32,105,115,32,97,32,112, + 97,99,107,97,103,101,46,78,41,2,114,61,0,0,0,90, + 17,105,115,95,102,114,111,122,101,110,95,112,97,99,107,97, + 103,101,114,179,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,122,0,0,0,112,3,0,0,115, + 4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17,114,9,0,0, + 0,114,8,0,0,0,114,1,0,0,0,114,10,0,0,0, + 114,145,0,0,0,114,182,0,0,0,114,107,0,0,0,114, + 183,0,0,0,114,177,0,0,0,114,178,0,0,0,114,156, + 0,0,0,114,157,0,0,0,114,164,0,0,0,114,94,0, + 0,0,114,180,0,0,0,114,181,0,0,0,114,122,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,184,0,0,0,41,3,0,0,115,50, + 0,0,0,8,0,4,2,4,7,2,2,10,1,2,8,12, + 1,2,6,12,1,2,8,10,1,2,3,10,1,2,8,10, + 1,2,9,2,1,12,1,2,4,2,1,12,1,2,4,2, + 1,16,1,255,128,114,184,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,100,6,83,0,41,7,218,18,95,73,109,112, + 111,114,116,76,111,99,107,67,111,110,116,101,120,116,122,36, + 67,111,110,116,101,120,116,32,109,97,110,97,103,101,114,32, + 102,111,114,32,116,104,101,32,105,109,112,111,114,116,32,108, + 111,99,107,46,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,2,0,0,0,67,0,0,0,115,12,0, + 0,0,116,0,160,1,161,0,1,0,100,1,83,0,41,2, + 122,24,65,99,113,117,105,114,101,32,116,104,101,32,105,109, + 112,111,114,116,32,108,111,99,107,46,78,41,2,114,61,0, + 0,0,114,62,0,0,0,114,51,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,58,0,0,0, + 125,3,0,0,115,4,0,0,0,12,2,255,128,122,28,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,0,0,0,0,4,0,0,0,2,0,0,0, + 67,0,0,0,115,12,0,0,0,116,0,160,1,161,0,1, + 0,100,1,83,0,41,2,122,60,82,101,108,101,97,115,101, 32,116,104,101,32,105,109,112,111,114,116,32,108,111,99,107, - 46,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,116, - 0,160,1,161,0,1,0,100,1,83,0,41,2,122,24,65, - 99,113,117,105,114,101,32,116,104,101,32,105,109,112,111,114, - 116,32,108,111,99,107,46,78,41,2,114,58,0,0,0,114, - 59,0,0,0,114,48,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,55,0,0,0,113,3,0, - 0,115,4,0,0,0,12,2,255,128,122,28,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,0,0,0,0,4,0,0,0,2,0,0,0,67,0,0, - 0,115,12,0,0,0,116,0,160,1,161,0,1,0,100,1, - 83,0,41,2,122,60,82,101,108,101,97,115,101,32,116,104, - 101,32,105,109,112,111,114,116,32,108,111,99,107,32,114,101, - 103,97,114,100,108,101,115,115,32,111,102,32,97,110,121,32, - 114,97,105,115,101,100,32,101,120,99,101,112,116,105,111,110, - 115,46,78,41,2,114,58,0,0,0,114,61,0,0,0,41, - 4,114,30,0,0,0,218,8,101,120,99,95,116,121,112,101, - 218,9,101,120,99,95,118,97,108,117,101,218,13,101,120,99, - 95,116,114,97,99,101,98,97,99,107,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,57,0,0,0,117,3, - 0,0,115,4,0,0,0,12,2,255,128,122,27,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,41,6,114,1,0,0,0, - 114,0,0,0,0,114,2,0,0,0,114,3,0,0,0,114, - 55,0,0,0,114,57,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,182,0, - 0,0,109,3,0,0,115,10,0,0,0,8,0,4,2,8, - 2,12,4,255,128,114,182,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, - 0,0,0,115,64,0,0,0,124,1,160,0,100,1,124,2, - 100,2,24,0,161,2,125,3,116,1,124,3,131,1,124,2, - 107,0,114,36,116,2,100,3,131,1,130,1,124,3,100,4, - 25,0,125,4,124,0,114,60,100,5,160,3,124,4,124,0, - 161,2,83,0,124,4,83,0,41,7,122,50,82,101,115,111, - 108,118,101,32,97,32,114,101,108,97,116,105,118,101,32,109, - 111,100,117,108,101,32,110,97,109,101,32,116,111,32,97,110, - 32,97,98,115,111,108,117,116,101,32,111,110,101,46,114,129, - 0,0,0,114,39,0,0,0,122,50,97,116,116,101,109,112, - 116,101,100,32,114,101,108,97,116,105,118,101,32,105,109,112, - 111,114,116,32,98,101,121,111,110,100,32,116,111,112,45,108, - 101,118,101,108,32,112,97,99,107,97,103,101,114,22,0,0, - 0,250,5,123,125,46,123,125,78,41,4,218,6,114,115,112, - 108,105,116,218,3,108,101,110,114,80,0,0,0,114,46,0, - 0,0,41,5,114,17,0,0,0,218,7,112,97,99,107,97, - 103,101,218,5,108,101,118,101,108,90,4,98,105,116,115,90, - 4,98,97,115,101,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,13,95,114,101,115,111,108,118,101,95,110, - 97,109,101,122,3,0,0,115,12,0,0,0,16,2,12,1, - 8,1,8,1,20,1,255,128,114,191,0,0,0,99,3,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, - 0,0,67,0,0,0,115,34,0,0,0,124,0,160,0,124, - 1,124,2,161,2,125,3,124,3,100,0,117,0,114,24,100, - 0,83,0,116,1,124,1,124,3,131,2,83,0,114,13,0, - 0,0,41,2,114,171,0,0,0,114,92,0,0,0,41,4, - 218,6,102,105,110,100,101,114,114,17,0,0,0,114,168,0, - 0,0,114,110,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,17,95,102,105,110,100,95,115,112, - 101,99,95,108,101,103,97,99,121,131,3,0,0,115,10,0, - 0,0,12,3,8,1,4,1,10,1,255,128,114,193,0,0, - 0,99,3,0,0,0,0,0,0,0,0,0,0,0,10,0, - 0,0,10,0,0,0,67,0,0,0,115,28,1,0,0,116, - 0,106,1,125,3,124,3,100,1,117,0,114,22,116,2,100, - 2,131,1,130,1,124,3,115,38,116,3,160,4,100,3,116, - 5,161,2,1,0,124,0,116,0,106,6,118,0,125,4,124, - 3,68,0,93,226,125,5,116,7,131,0,143,94,1,0,122, - 10,124,5,106,8,125,6,87,0,110,54,4,0,116,9,121, - 128,1,0,1,0,1,0,116,10,124,5,124,0,124,1,131, - 3,125,7,124,7,100,1,117,0,114,124,89,0,87,0,100, - 1,4,0,4,0,131,3,1,0,113,52,89,0,110,14,48, - 0,124,6,124,0,124,1,124,2,131,3,125,7,87,0,100, - 1,4,0,4,0,131,3,1,0,110,16,49,0,115,162,48, - 0,1,0,1,0,1,0,89,0,1,0,124,7,100,1,117, - 1,114,52,124,4,144,1,115,16,124,0,116,0,106,6,118, - 0,144,1,114,16,116,0,106,6,124,0,25,0,125,8,122, - 10,124,8,106,11,125,9,87,0,110,26,4,0,116,9,121, - 244,1,0,1,0,1,0,124,7,6,0,89,0,2,0,1, - 0,83,0,48,0,124,9,100,1,117,0,144,1,114,8,124, - 7,2,0,1,0,83,0,124,9,2,0,1,0,83,0,124, - 7,2,0,1,0,83,0,100,1,83,0,41,4,122,21,70, - 105,110,100,32,97,32,109,111,100,117,108,101,39,115,32,115, - 112,101,99,46,78,122,53,115,121,115,46,109,101,116,97,95, - 112,97,116,104,32,105,115,32,78,111,110,101,44,32,80,121, - 116,104,111,110,32,105,115,32,108,105,107,101,108,121,32,115, - 104,117,116,116,105,110,103,32,100,111,119,110,122,22,115,121, - 115,46,109,101,116,97,95,112,97,116,104,32,105,115,32,101, - 109,112,116,121,41,12,114,15,0,0,0,218,9,109,101,116, - 97,95,112,97,116,104,114,80,0,0,0,218,9,95,119,97, - 114,110,105,110,103,115,218,4,119,97,114,110,218,13,73,109, - 112,111,114,116,87,97,114,110,105,110,103,114,93,0,0,0, - 114,182,0,0,0,114,170,0,0,0,114,107,0,0,0,114, - 193,0,0,0,114,106,0,0,0,41,10,114,17,0,0,0, - 114,168,0,0,0,114,169,0,0,0,114,194,0,0,0,90, - 9,105,115,95,114,101,108,111,97,100,114,192,0,0,0,114, - 170,0,0,0,114,96,0,0,0,114,97,0,0,0,114,106, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,10,95,102,105,110,100,95,115,112,101,99,140,3, - 0,0,115,56,0,0,0,6,2,8,1,8,2,4,3,12, - 1,10,5,8,1,8,1,2,1,10,1,12,1,12,1,8, - 1,22,1,42,2,8,1,18,2,10,1,2,1,10,1,12, - 1,14,4,10,2,8,1,8,2,8,2,4,2,255,128,114, - 198,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,5,0,0,0,67,0,0,0,115,110,0, - 0,0,116,0,124,0,116,1,131,2,115,28,116,2,100,1, - 160,3,116,4,124,0,131,1,161,1,131,1,130,1,124,2, - 100,2,107,0,114,44,116,5,100,3,131,1,130,1,124,2, - 100,2,107,4,114,82,116,0,124,1,116,1,131,2,115,70, - 116,2,100,4,131,1,130,1,124,1,115,82,116,6,100,5, - 131,1,130,1,124,0,115,106,124,2,100,2,107,2,114,102, - 116,5,100,6,131,1,130,1,100,7,83,0,100,7,83,0, - 41,8,122,28,86,101,114,105,102,121,32,97,114,103,117,109, - 101,110,116,115,32,97,114,101,32,34,115,97,110,101,34,46, - 122,31,109,111,100,117,108,101,32,110,97,109,101,32,109,117, - 115,116,32,98,101,32,115,116,114,44,32,110,111,116,32,123, - 125,114,22,0,0,0,122,18,108,101,118,101,108,32,109,117, - 115,116,32,98,101,32,62,61,32,48,122,31,95,95,112,97, - 99,107,97,103,101,95,95,32,110,111,116,32,115,101,116,32, - 116,111,32,97,32,115,116,114,105,110,103,122,54,97,116,116, + 32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,97, + 110,121,32,114,97,105,115,101,100,32,101,120,99,101,112,116, + 105,111,110,115,46,78,41,2,114,61,0,0,0,114,64,0, + 0,0,41,4,114,33,0,0,0,218,8,101,120,99,95,116, + 121,112,101,218,9,101,120,99,95,118,97,108,117,101,218,13, + 101,120,99,95,116,114,97,99,101,98,97,99,107,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,60,0,0, + 0,129,3,0,0,115,4,0,0,0,12,2,255,128,122,27, + 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,41,6,114,9, + 0,0,0,114,8,0,0,0,114,1,0,0,0,114,10,0, + 0,0,114,58,0,0,0,114,60,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 114,189,0,0,0,121,3,0,0,115,10,0,0,0,8,0, + 4,2,8,2,12,4,255,128,114,189,0,0,0,99,3,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, + 0,0,67,0,0,0,115,64,0,0,0,124,1,160,0,100, + 1,124,2,100,2,24,0,161,2,125,3,116,1,124,3,131, + 1,124,2,107,0,114,36,116,2,100,3,131,1,130,1,124, + 3,100,4,25,0,125,4,124,0,114,60,100,5,160,3,124, + 4,124,0,161,2,83,0,124,4,83,0,41,7,122,50,82, + 101,115,111,108,118,101,32,97,32,114,101,108,97,116,105,118, + 101,32,109,111,100,117,108,101,32,110,97,109,101,32,116,111, + 32,97,110,32,97,98,115,111,108,117,116,101,32,111,110,101, + 46,114,135,0,0,0,114,42,0,0,0,122,50,97,116,116, 101,109,112,116,101,100,32,114,101,108,97,116,105,118,101,32, - 105,109,112,111,114,116,32,119,105,116,104,32,110,111,32,107, - 110,111,119,110,32,112,97,114,101,110,116,32,112,97,99,107, - 97,103,101,122,17,69,109,112,116,121,32,109,111,100,117,108, - 101,32,110,97,109,101,78,41,7,218,10,105,115,105,110,115, - 116,97,110,99,101,218,3,115,116,114,218,9,84,121,112,101, - 69,114,114,111,114,114,46,0,0,0,114,14,0,0,0,218, - 10,86,97,108,117,101,69,114,114,111,114,114,80,0,0,0, - 169,3,114,17,0,0,0,114,189,0,0,0,114,190,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,13,95,115,97,110,105,116,121,95,99,104,101,99,107,187, - 3,0,0,115,26,0,0,0,10,2,18,1,8,1,8,1, - 8,1,10,1,8,1,4,1,8,1,12,2,8,1,8,255, - 255,128,114,204,0,0,0,122,16,78,111,32,109,111,100,117, - 108,101,32,110,97,109,101,100,32,122,4,123,33,114,125,99, - 2,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, - 8,0,0,0,67,0,0,0,115,20,1,0,0,100,0,125, - 2,124,0,160,0,100,1,161,1,100,2,25,0,125,3,124, - 3,114,128,124,3,116,1,106,2,118,1,114,42,116,3,124, - 1,124,3,131,2,1,0,124,0,116,1,106,2,118,0,114, - 62,116,1,106,2,124,0,25,0,83,0,116,1,106,2,124, - 3,25,0,125,4,122,10,124,4,106,4,125,2,87,0,110, - 44,4,0,116,5,121,126,1,0,1,0,1,0,116,6,100, - 3,23,0,160,7,124,0,124,3,161,2,125,5,116,8,124, - 5,124,0,100,4,141,2,100,0,130,2,48,0,116,9,124, - 0,124,2,131,2,125,6,124,6,100,0,117,0,114,164,116, - 8,116,6,160,7,124,0,161,1,124,0,100,4,141,2,130, - 1,116,10,124,6,131,1,125,7,124,3,144,1,114,16,116, - 1,106,2,124,3,25,0,125,4,124,0,160,0,100,1,161, - 1,100,5,25,0,125,8,122,18,116,11,124,4,124,8,124, - 7,131,3,1,0,87,0,124,7,83,0,4,0,116,5,144, - 1,121,14,1,0,1,0,1,0,100,6,124,3,155,2,100, - 7,124,8,155,2,157,4,125,5,116,12,160,13,124,5,116, - 14,161,2,1,0,89,0,124,7,83,0,48,0,124,7,83, - 0,41,8,78,114,129,0,0,0,114,22,0,0,0,122,23, - 59,32,123,33,114,125,32,105,115,32,110,111,116,32,97,32, - 112,97,99,107,97,103,101,114,16,0,0,0,233,2,0,0, - 0,122,27,67,97,110,110,111,116,32,115,101,116,32,97,110, - 32,97,116,116,114,105,98,117,116,101,32,111,110,32,122,18, - 32,102,111,114,32,99,104,105,108,100,32,109,111,100,117,108, - 101,32,41,15,114,130,0,0,0,114,15,0,0,0,114,93, - 0,0,0,114,68,0,0,0,114,142,0,0,0,114,107,0, - 0,0,218,8,95,69,82,82,95,77,83,71,114,46,0,0, - 0,218,19,77,111,100,117,108,101,78,111,116,70,111,117,110, - 100,69,114,114,111,114,114,198,0,0,0,114,160,0,0,0, - 114,5,0,0,0,114,195,0,0,0,114,196,0,0,0,114, - 197,0,0,0,41,9,114,17,0,0,0,218,7,105,109,112, - 111,114,116,95,114,168,0,0,0,114,131,0,0,0,90,13, - 112,97,114,101,110,116,95,109,111,100,117,108,101,114,158,0, - 0,0,114,96,0,0,0,114,97,0,0,0,90,5,99,104, - 105,108,100,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,23,95,102,105,110,100,95,97,110,100,95,108,111, - 97,100,95,117,110,108,111,99,107,101,100,206,3,0,0,115, - 60,0,0,0,4,1,14,1,4,1,10,1,10,1,10,2, - 10,1,10,1,2,1,10,1,12,1,16,1,16,1,10,1, - 8,1,18,1,8,2,6,1,10,2,14,1,2,1,14,1, - 4,4,14,253,16,1,14,1,4,1,2,255,4,1,255,128, - 114,209,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,8,0,0,0,67,0,0,0,115,128, - 0,0,0,116,0,124,0,131,1,143,62,1,0,116,1,106, - 2,160,3,124,0,116,4,161,2,125,2,124,2,116,4,117, - 0,114,56,116,5,124,0,124,1,131,2,87,0,2,0,100, - 1,4,0,4,0,131,3,1,0,83,0,87,0,100,1,4, - 0,4,0,131,3,1,0,110,16,49,0,115,76,48,0,1, - 0,1,0,1,0,89,0,1,0,124,2,100,1,117,0,114, - 116,100,2,160,6,124,0,161,1,125,3,116,7,124,3,124, - 0,100,3,141,2,130,1,116,8,124,0,131,1,1,0,124, - 2,83,0,41,4,122,25,70,105,110,100,32,97,110,100,32, - 108,111,97,100,32,116,104,101,32,109,111,100,117,108,101,46, - 78,122,40,105,109,112,111,114,116,32,111,102,32,123,125,32, - 104,97,108,116,101,100,59,32,78,111,110,101,32,105,110,32, - 115,121,115,46,109,111,100,117,108,101,115,114,16,0,0,0, - 41,9,114,51,0,0,0,114,15,0,0,0,114,93,0,0, - 0,114,35,0,0,0,218,14,95,78,69,69,68,83,95,76, - 79,65,68,73,78,71,114,209,0,0,0,114,46,0,0,0, - 114,207,0,0,0,114,66,0,0,0,41,4,114,17,0,0, - 0,114,208,0,0,0,114,97,0,0,0,114,76,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 14,95,102,105,110,100,95,97,110,100,95,108,111,97,100,241, - 3,0,0,115,24,0,0,0,10,2,14,1,8,1,54,1, - 8,2,4,1,2,1,4,255,12,2,8,2,4,1,255,128, - 114,211,0,0,0,114,22,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,67, - 0,0,0,115,42,0,0,0,116,0,124,0,124,1,124,2, - 131,3,1,0,124,2,100,1,107,4,114,32,116,1,124,0, - 124,1,124,2,131,3,125,0,116,2,124,0,116,3,131,2, - 83,0,41,3,97,50,1,0,0,73,109,112,111,114,116,32, - 97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,109, - 111,100,117,108,101,32,98,97,115,101,100,32,111,110,32,105, - 116,115,32,110,97,109,101,44,32,116,104,101,32,112,97,99, - 107,97,103,101,32,116,104,101,32,99,97,108,108,32,105,115, - 10,32,32,32,32,98,101,105,110,103,32,109,97,100,101,32, - 102,114,111,109,44,32,97,110,100,32,116,104,101,32,108,101, - 118,101,108,32,97,100,106,117,115,116,109,101,110,116,46,10, - 10,32,32,32,32,84,104,105,115,32,102,117,110,99,116,105, - 111,110,32,114,101,112,114,101,115,101,110,116,115,32,116,104, - 101,32,103,114,101,97,116,101,115,116,32,99,111,109,109,111, - 110,32,100,101,110,111,109,105,110,97,116,111,114,32,111,102, - 32,102,117,110,99,116,105,111,110,97,108,105,116,121,10,32, - 32,32,32,98,101,116,119,101,101,110,32,105,109,112,111,114, - 116,95,109,111,100,117,108,101,32,97,110,100,32,95,95,105, - 109,112,111,114,116,95,95,46,32,84,104,105,115,32,105,110, - 99,108,117,100,101,115,32,115,101,116,116,105,110,103,32,95, - 95,112,97,99,107,97,103,101,95,95,32,105,102,10,32,32, - 32,32,116,104,101,32,108,111,97,100,101,114,32,100,105,100, - 32,110,111,116,46,10,10,32,32,32,32,114,22,0,0,0, - 78,41,4,114,204,0,0,0,114,191,0,0,0,114,211,0, - 0,0,218,11,95,103,99,100,95,105,109,112,111,114,116,114, - 203,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,212,0,0,0,1,4,0,0,115,10,0,0, - 0,12,9,8,1,12,1,10,1,255,128,114,212,0,0,0, - 169,1,218,9,114,101,99,117,114,115,105,118,101,99,3,0, - 0,0,0,0,0,0,1,0,0,0,8,0,0,0,11,0, - 0,0,67,0,0,0,115,216,0,0,0,124,1,68,0,93, - 204,125,4,116,0,124,4,116,1,131,2,115,64,124,3,114, - 34,124,0,106,2,100,1,23,0,125,5,110,4,100,2,125, - 5,116,3,100,3,124,5,155,0,100,4,116,4,124,4,131, - 1,106,2,155,0,157,4,131,1,130,1,124,4,100,5,107, - 2,114,106,124,3,115,4,116,5,124,0,100,6,131,2,114, - 4,116,6,124,0,124,0,106,7,124,2,100,7,100,8,141, - 4,1,0,113,4,116,5,124,0,124,4,131,2,115,4,100, - 9,160,8,124,0,106,2,124,4,161,2,125,6,122,14,116, - 9,124,2,124,6,131,2,1,0,87,0,113,4,4,0,116, - 10,121,214,1,0,125,7,1,0,122,42,124,7,106,11,124, - 6,107,2,114,200,116,12,106,13,160,14,124,6,116,15,161, - 2,100,10,117,1,114,200,87,0,89,0,100,10,125,7,126, - 7,113,4,130,0,100,10,125,7,126,7,48,0,124,0,83, - 0,48,0,41,11,122,238,70,105,103,117,114,101,32,111,117, - 116,32,119,104,97,116,32,95,95,105,109,112,111,114,116,95, - 95,32,115,104,111,117,108,100,32,114,101,116,117,114,110,46, - 10,10,32,32,32,32,84,104,101,32,105,109,112,111,114,116, - 95,32,112,97,114,97,109,101,116,101,114,32,105,115,32,97, - 32,99,97,108,108,97,98,108,101,32,119,104,105,99,104,32, - 116,97,107,101,115,32,116,104,101,32,110,97,109,101,32,111, - 102,32,109,111,100,117,108,101,32,116,111,10,32,32,32,32, - 105,109,112,111,114,116,46,32,73,116,32,105,115,32,114,101, - 113,117,105,114,101,100,32,116,111,32,100,101,99,111,117,112, - 108,101,32,116,104,101,32,102,117,110,99,116,105,111,110,32, - 102,114,111,109,32,97,115,115,117,109,105,110,103,32,105,109, - 112,111,114,116,108,105,98,39,115,10,32,32,32,32,105,109, - 112,111,114,116,32,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,32,105,115,32,100,101,115,105,114,101,100,46,10, - 10,32,32,32,32,122,8,46,95,95,97,108,108,95,95,122, - 13,96,96,102,114,111,109,32,108,105,115,116,39,39,122,8, - 73,116,101,109,32,105,110,32,122,18,32,109,117,115,116,32, - 98,101,32,115,116,114,44,32,110,111,116,32,250,1,42,218, - 7,95,95,97,108,108,95,95,84,114,213,0,0,0,114,186, - 0,0,0,78,41,16,114,199,0,0,0,114,200,0,0,0, - 114,1,0,0,0,114,201,0,0,0,114,14,0,0,0,114, - 4,0,0,0,218,16,95,104,97,110,100,108,101,95,102,114, - 111,109,108,105,115,116,114,216,0,0,0,114,46,0,0,0, - 114,68,0,0,0,114,207,0,0,0,114,17,0,0,0,114, - 15,0,0,0,114,93,0,0,0,114,35,0,0,0,114,210, - 0,0,0,41,8,114,97,0,0,0,218,8,102,114,111,109, - 108,105,115,116,114,208,0,0,0,114,214,0,0,0,218,1, - 120,90,5,119,104,101,114,101,90,9,102,114,111,109,95,110, - 97,109,101,90,3,101,120,99,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,217,0,0,0,16,4,0,0, - 115,54,0,0,0,8,10,10,1,4,1,12,1,4,2,10, - 1,8,1,8,255,8,2,14,1,10,1,2,1,8,255,10, - 2,14,1,2,1,14,1,14,1,10,4,16,1,2,255,12, - 2,2,1,8,128,4,1,2,248,255,128,114,217,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,6,0,0,0,67,0,0,0,115,146,0,0,0,124,0, - 160,0,100,1,161,1,125,1,124,0,160,0,100,2,161,1, - 125,2,124,1,100,3,117,1,114,82,124,2,100,3,117,1, - 114,78,124,1,124,2,106,1,107,3,114,78,116,2,106,3, - 100,4,124,1,155,2,100,5,124,2,106,1,155,2,100,6, - 157,5,116,4,100,7,100,8,141,3,1,0,124,1,83,0, - 124,2,100,3,117,1,114,96,124,2,106,1,83,0,116,2, - 106,3,100,9,116,4,100,7,100,8,141,3,1,0,124,0, - 100,10,25,0,125,1,100,11,124,0,118,1,114,142,124,1, - 160,5,100,12,161,1,100,13,25,0,125,1,124,1,83,0, - 41,14,122,167,67,97,108,99,117,108,97,116,101,32,119,104, - 97,116,32,95,95,112,97,99,107,97,103,101,95,95,32,115, - 104,111,117,108,100,32,98,101,46,10,10,32,32,32,32,95, - 95,112,97,99,107,97,103,101,95,95,32,105,115,32,110,111, - 116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32, - 98,101,32,100,101,102,105,110,101,100,32,111,114,32,99,111, - 117,108,100,32,98,101,32,115,101,116,32,116,111,32,78,111, - 110,101,10,32,32,32,32,116,111,32,114,101,112,114,101,115, - 101,110,116,32,116,104,97,116,32,105,116,115,32,112,114,111, - 112,101,114,32,118,97,108,117,101,32,105,115,32,117,110,107, - 110,111,119,110,46,10,10,32,32,32,32,114,146,0,0,0, - 114,106,0,0,0,78,122,32,95,95,112,97,99,107,97,103, - 101,95,95,32,33,61,32,95,95,115,112,101,99,95,95,46, - 112,97,114,101,110,116,32,40,122,4,32,33,61,32,250,1, - 41,233,3,0,0,0,41,1,90,10,115,116,97,99,107,108, - 101,118,101,108,122,89,99,97,110,39,116,32,114,101,115,111, - 108,118,101,32,112,97,99,107,97,103,101,32,102,114,111,109, - 32,95,95,115,112,101,99,95,95,32,111,114,32,95,95,112, - 97,99,107,97,103,101,95,95,44,32,102,97,108,108,105,110, - 103,32,98,97,99,107,32,111,110,32,95,95,110,97,109,101, - 95,95,32,97,110,100,32,95,95,112,97,116,104,95,95,114, - 1,0,0,0,114,142,0,0,0,114,129,0,0,0,114,22, - 0,0,0,41,6,114,35,0,0,0,114,131,0,0,0,114, - 195,0,0,0,114,196,0,0,0,114,197,0,0,0,114,130, - 0,0,0,41,3,218,7,103,108,111,98,97,108,115,114,189, - 0,0,0,114,96,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,17,95,99,97,108,99,95,95, - 95,112,97,99,107,97,103,101,95,95,53,4,0,0,115,44, - 0,0,0,10,7,10,1,8,1,18,1,6,1,2,1,4, - 255,4,1,6,255,4,2,6,254,4,3,8,1,6,1,6, - 2,4,2,6,254,8,3,8,1,14,1,4,1,255,128,114, - 223,0,0,0,114,10,0,0,0,99,5,0,0,0,0,0, - 0,0,0,0,0,0,9,0,0,0,5,0,0,0,67,0, - 0,0,115,174,0,0,0,124,4,100,1,107,2,114,18,116, - 0,124,0,131,1,125,5,110,36,124,1,100,2,117,1,114, - 30,124,1,110,2,105,0,125,6,116,1,124,6,131,1,125, - 7,116,0,124,0,124,7,124,4,131,3,125,5,124,3,115, - 148,124,4,100,1,107,2,114,84,116,0,124,0,160,2,100, - 3,161,1,100,1,25,0,131,1,83,0,124,0,115,92,124, - 5,83,0,116,3,124,0,131,1,116,3,124,0,160,2,100, - 3,161,1,100,1,25,0,131,1,24,0,125,8,116,4,106, - 5,124,5,106,6,100,2,116,3,124,5,106,6,131,1,124, - 8,24,0,133,2,25,0,25,0,83,0,116,7,124,5,100, - 4,131,2,114,170,116,8,124,5,124,3,116,0,131,3,83, - 0,124,5,83,0,41,5,97,215,1,0,0,73,109,112,111, - 114,116,32,97,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,84,104,101,32,39,103,108,111,98,97,108,115,39,32, - 97,114,103,117,109,101,110,116,32,105,115,32,117,115,101,100, - 32,116,111,32,105,110,102,101,114,32,119,104,101,114,101,32, - 116,104,101,32,105,109,112,111,114,116,32,105,115,32,111,99, - 99,117,114,114,105,110,103,32,102,114,111,109,10,32,32,32, - 32,116,111,32,104,97,110,100,108,101,32,114,101,108,97,116, - 105,118,101,32,105,109,112,111,114,116,115,46,32,84,104,101, - 32,39,108,111,99,97,108,115,39,32,97,114,103,117,109,101, - 110,116,32,105,115,32,105,103,110,111,114,101,100,46,32,84, - 104,101,10,32,32,32,32,39,102,114,111,109,108,105,115,116, - 39,32,97,114,103,117,109,101,110,116,32,115,112,101,99,105, - 102,105,101,115,32,119,104,97,116,32,115,104,111,117,108,100, - 32,101,120,105,115,116,32,97,115,32,97,116,116,114,105,98, - 117,116,101,115,32,111,110,32,116,104,101,32,109,111,100,117, - 108,101,10,32,32,32,32,98,101,105,110,103,32,105,109,112, - 111,114,116,101,100,32,40,101,46,103,46,32,96,96,102,114, - 111,109,32,109,111,100,117,108,101,32,105,109,112,111,114,116, - 32,60,102,114,111,109,108,105,115,116,62,96,96,41,46,32, - 32,84,104,101,32,39,108,101,118,101,108,39,10,32,32,32, - 32,97,114,103,117,109,101,110,116,32,114,101,112,114,101,115, - 101,110,116,115,32,116,104,101,32,112,97,99,107,97,103,101, - 32,108,111,99,97,116,105,111,110,32,116,111,32,105,109,112, - 111,114,116,32,102,114,111,109,32,105,110,32,97,32,114,101, - 108,97,116,105,118,101,10,32,32,32,32,105,109,112,111,114, - 116,32,40,101,46,103,46,32,96,96,102,114,111,109,32,46, - 46,112,107,103,32,105,109,112,111,114,116,32,109,111,100,96, - 96,32,119,111,117,108,100,32,104,97,118,101,32,97,32,39, - 108,101,118,101,108,39,32,111,102,32,50,41,46,10,10,32, - 32,32,32,114,22,0,0,0,78,114,129,0,0,0,114,142, - 0,0,0,41,9,114,212,0,0,0,114,223,0,0,0,218, - 9,112,97,114,116,105,116,105,111,110,114,188,0,0,0,114, - 15,0,0,0,114,93,0,0,0,114,1,0,0,0,114,4, - 0,0,0,114,217,0,0,0,41,9,114,17,0,0,0,114, - 222,0,0,0,218,6,108,111,99,97,108,115,114,218,0,0, - 0,114,190,0,0,0,114,97,0,0,0,90,8,103,108,111, - 98,97,108,115,95,114,189,0,0,0,90,7,99,117,116,95, - 111,102,102,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,10,95,95,105,109,112,111,114,116,95,95,80,4, - 0,0,115,32,0,0,0,8,11,10,1,16,2,8,1,12, - 1,4,1,8,3,18,1,4,1,4,1,26,4,30,3,10, - 1,12,1,4,2,255,128,114,226,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, - 0,67,0,0,0,115,38,0,0,0,116,0,160,1,124,0, - 161,1,125,1,124,1,100,0,117,0,114,30,116,2,100,1, - 124,0,23,0,131,1,130,1,116,3,124,1,131,1,83,0, - 41,2,78,122,25,110,111,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,32,110,97,109,101,100,32,41,4, - 114,162,0,0,0,114,170,0,0,0,114,80,0,0,0,114, - 160,0,0,0,41,2,114,17,0,0,0,114,96,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 18,95,98,117,105,108,116,105,110,95,102,114,111,109,95,110, - 97,109,101,117,4,0,0,115,10,0,0,0,10,1,8,1, - 12,1,8,1,255,128,114,227,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,10,0,0,0,5,0,0,0, - 67,0,0,0,115,164,0,0,0,124,1,97,0,124,0,97, - 1,116,2,116,1,131,1,125,2,116,1,106,3,160,4,161, - 0,68,0,93,70,92,2,125,3,125,4,116,5,124,4,124, - 2,131,2,114,26,124,3,116,1,106,6,118,0,114,60,116, - 7,125,5,110,16,116,0,160,8,124,3,161,1,114,26,116, - 9,125,5,110,0,116,10,124,4,124,5,131,2,125,6,116, - 11,124,6,124,4,131,2,1,0,113,26,116,1,106,3,116, - 12,25,0,125,7,100,1,68,0,93,46,125,8,124,8,116, - 1,106,3,118,1,114,136,116,13,124,8,131,1,125,9,110, - 10,116,1,106,3,124,8,25,0,125,9,116,14,124,7,124, - 8,124,9,131,3,1,0,113,112,100,2,83,0,41,3,122, - 250,83,101,116,117,112,32,105,109,112,111,114,116,108,105,98, - 32,98,121,32,105,109,112,111,114,116,105,110,103,32,110,101, - 101,100,101,100,32,98,117,105,108,116,45,105,110,32,109,111, - 100,117,108,101,115,32,97,110,100,32,105,110,106,101,99,116, - 105,110,103,32,116,104,101,109,10,32,32,32,32,105,110,116, - 111,32,116,104,101,32,103,108,111,98,97,108,32,110,97,109, - 101,115,112,97,99,101,46,10,10,32,32,32,32,65,115,32, - 115,121,115,32,105,115,32,110,101,101,100,101,100,32,102,111, - 114,32,115,121,115,46,109,111,100,117,108,101,115,32,97,99, - 99,101,115,115,32,97,110,100,32,95,105,109,112,32,105,115, - 32,110,101,101,100,101,100,32,116,111,32,108,111,97,100,32, - 98,117,105,108,116,45,105,110,10,32,32,32,32,109,111,100, - 117,108,101,115,44,32,116,104,111,115,101,32,116,119,111,32, - 109,111,100,117,108,101,115,32,109,117,115,116,32,98,101,32, - 101,120,112,108,105,99,105,116,108,121,32,112,97,115,115,101, - 100,32,105,110,46,10,10,32,32,32,32,41,3,114,23,0, - 0,0,114,195,0,0,0,114,65,0,0,0,78,41,15,114, - 58,0,0,0,114,15,0,0,0,114,14,0,0,0,114,93, - 0,0,0,218,5,105,116,101,109,115,114,199,0,0,0,114, - 79,0,0,0,114,162,0,0,0,114,89,0,0,0,114,177, - 0,0,0,114,143,0,0,0,114,149,0,0,0,114,1,0, - 0,0,114,227,0,0,0,114,5,0,0,0,41,10,218,10, - 115,121,115,95,109,111,100,117,108,101,218,11,95,105,109,112, - 95,109,111,100,117,108,101,90,11,109,111,100,117,108,101,95, - 116,121,112,101,114,17,0,0,0,114,97,0,0,0,114,110, - 0,0,0,114,96,0,0,0,90,11,115,101,108,102,95,109, - 111,100,117,108,101,90,12,98,117,105,108,116,105,110,95,110, - 97,109,101,90,14,98,117,105,108,116,105,110,95,109,111,100, - 117,108,101,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,6,95,115,101,116,117,112,124,4,0,0,115,38, - 0,0,0,4,9,4,1,8,3,18,1,10,1,10,1,6, - 1,10,1,6,1,10,3,12,1,10,3,8,1,10,1,10, - 1,10,2,14,1,4,251,255,128,114,231,0,0,0,99,2, + 105,109,112,111,114,116,32,98,101,121,111,110,100,32,116,111, + 112,45,108,101,118,101,108,32,112,97,99,107,97,103,101,114, + 25,0,0,0,250,5,123,125,46,123,125,78,41,4,218,6, + 114,115,112,108,105,116,218,3,108,101,110,114,83,0,0,0, + 114,49,0,0,0,41,5,114,20,0,0,0,218,7,112,97, + 99,107,97,103,101,218,5,108,101,118,101,108,90,4,98,105, + 116,115,90,4,98,97,115,101,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,13,95,114,101,115,111,108,118, + 101,95,110,97,109,101,134,3,0,0,115,12,0,0,0,16, + 2,12,1,8,1,8,1,20,1,255,128,114,198,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,34,0,0,0,124,0, + 160,0,124,1,124,2,161,2,125,3,124,3,100,0,117,0, + 114,24,100,0,83,0,116,1,124,1,124,3,131,2,83,0, + 114,0,0,0,0,41,2,114,178,0,0,0,114,98,0,0, + 0,41,4,218,6,102,105,110,100,101,114,114,20,0,0,0, + 114,175,0,0,0,114,116,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,17,95,102,105,110,100, + 95,115,112,101,99,95,108,101,103,97,99,121,143,3,0,0, + 115,10,0,0,0,12,3,8,1,4,1,10,1,255,128,114, + 200,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,10,0,0,0,10,0,0,0,67,0,0,0,115,28,1, + 0,0,116,0,106,1,125,3,124,3,100,1,117,0,114,22, + 116,2,100,2,131,1,130,1,124,3,115,38,116,3,160,4, + 100,3,116,5,161,2,1,0,124,0,116,0,106,6,118,0, + 125,4,124,3,68,0,93,226,125,5,116,7,131,0,143,94, + 1,0,122,10,124,5,106,8,125,6,87,0,110,54,4,0, + 116,9,121,128,1,0,1,0,1,0,116,10,124,5,124,0, + 124,1,131,3,125,7,124,7,100,1,117,0,114,124,89,0, + 87,0,100,1,4,0,4,0,131,3,1,0,113,52,89,0, + 110,14,48,0,124,6,124,0,124,1,124,2,131,3,125,7, + 87,0,100,1,4,0,4,0,131,3,1,0,110,16,49,0, + 115,162,48,0,1,0,1,0,1,0,89,0,1,0,124,7, + 100,1,117,1,114,52,124,4,144,1,115,16,124,0,116,0, + 106,6,118,0,144,1,114,16,116,0,106,6,124,0,25,0, + 125,8,122,10,124,8,106,11,125,9,87,0,110,26,4,0, + 116,9,121,244,1,0,1,0,1,0,124,7,6,0,89,0, + 2,0,1,0,83,0,48,0,124,9,100,1,117,0,144,1, + 114,8,124,7,2,0,1,0,83,0,124,9,2,0,1,0, + 83,0,124,7,2,0,1,0,83,0,100,1,83,0,41,4, + 122,21,70,105,110,100,32,97,32,109,111,100,117,108,101,39, + 115,32,115,112,101,99,46,78,122,53,115,121,115,46,109,101, + 116,97,95,112,97,116,104,32,105,115,32,78,111,110,101,44, + 32,80,121,116,104,111,110,32,105,115,32,108,105,107,101,108, + 121,32,115,104,117,116,116,105,110,103,32,100,111,119,110,122, + 22,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, + 115,32,101,109,112,116,121,41,12,114,18,0,0,0,218,9, + 109,101,116,97,95,112,97,116,104,114,83,0,0,0,114,95, + 0,0,0,114,96,0,0,0,114,163,0,0,0,114,99,0, + 0,0,114,189,0,0,0,114,177,0,0,0,114,2,0,0, + 0,114,200,0,0,0,114,113,0,0,0,41,10,114,20,0, + 0,0,114,175,0,0,0,114,176,0,0,0,114,201,0,0, + 0,90,9,105,115,95,114,101,108,111,97,100,114,199,0,0, + 0,114,177,0,0,0,114,103,0,0,0,114,104,0,0,0, + 114,113,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,10,95,102,105,110,100,95,115,112,101,99, + 152,3,0,0,115,56,0,0,0,6,2,8,1,8,2,4, + 3,12,1,10,5,8,1,8,1,2,1,10,1,12,1,12, + 1,8,1,22,1,42,2,8,1,18,2,10,1,2,1,10, + 1,12,1,14,4,10,2,8,1,8,2,8,2,4,2,255, + 128,114,202,0,0,0,99,3,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, + 110,0,0,0,116,0,124,0,116,1,131,2,115,28,116,2, + 100,1,160,3,116,4,124,0,131,1,161,1,131,1,130,1, + 124,2,100,2,107,0,114,44,116,5,100,3,131,1,130,1, + 124,2,100,2,107,4,114,82,116,0,124,1,116,1,131,2, + 115,70,116,2,100,4,131,1,130,1,124,1,115,82,116,6, + 100,5,131,1,130,1,124,0,115,106,124,2,100,2,107,2, + 114,102,116,5,100,6,131,1,130,1,100,7,83,0,100,7, + 83,0,41,8,122,28,86,101,114,105,102,121,32,97,114,103, + 117,109,101,110,116,115,32,97,114,101,32,34,115,97,110,101, + 34,46,122,31,109,111,100,117,108,101,32,110,97,109,101,32, + 109,117,115,116,32,98,101,32,115,116,114,44,32,110,111,116, + 32,123,125,114,25,0,0,0,122,18,108,101,118,101,108,32, + 109,117,115,116,32,98,101,32,62,61,32,48,122,31,95,95, + 112,97,99,107,97,103,101,95,95,32,110,111,116,32,115,101, + 116,32,116,111,32,97,32,115,116,114,105,110,103,122,54,97, + 116,116,101,109,112,116,101,100,32,114,101,108,97,116,105,118, + 101,32,105,109,112,111,114,116,32,119,105,116,104,32,110,111, + 32,107,110,111,119,110,32,112,97,114,101,110,116,32,112,97, + 99,107,97,103,101,122,17,69,109,112,116,121,32,109,111,100, + 117,108,101,32,110,97,109,101,78,41,7,218,10,105,115,105, + 110,115,116,97,110,99,101,218,3,115,116,114,218,9,84,121, + 112,101,69,114,114,111,114,114,49,0,0,0,114,3,0,0, + 0,218,10,86,97,108,117,101,69,114,114,111,114,114,83,0, + 0,0,169,3,114,20,0,0,0,114,196,0,0,0,114,197, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,13,95,115,97,110,105,116,121,95,99,104,101,99, + 107,199,3,0,0,115,26,0,0,0,10,2,18,1,8,1, + 8,1,8,1,10,1,8,1,4,1,8,1,12,2,8,1, + 8,255,255,128,114,208,0,0,0,122,16,78,111,32,109,111, + 100,117,108,101,32,110,97,109,101,100,32,122,4,123,33,114, + 125,99,2,0,0,0,0,0,0,0,0,0,0,0,9,0, + 0,0,8,0,0,0,67,0,0,0,115,20,1,0,0,100, + 0,125,2,124,0,160,0,100,1,161,1,100,2,25,0,125, + 3,124,3,114,128,124,3,116,1,106,2,118,1,114,42,116, + 3,124,1,124,3,131,2,1,0,124,0,116,1,106,2,118, + 0,114,62,116,1,106,2,124,0,25,0,83,0,116,1,106, + 2,124,3,25,0,125,4,122,10,124,4,106,4,125,2,87, + 0,110,44,4,0,116,5,121,126,1,0,1,0,1,0,116, + 6,100,3,23,0,160,7,124,0,124,3,161,2,125,5,116, + 8,124,5,124,0,100,4,141,2,100,0,130,2,48,0,116, + 9,124,0,124,2,131,2,125,6,124,6,100,0,117,0,114, + 164,116,8,116,6,160,7,124,0,161,1,124,0,100,4,141, + 2,130,1,116,10,124,6,131,1,125,7,124,3,144,1,114, + 16,116,1,106,2,124,3,25,0,125,4,124,0,160,0,100, + 1,161,1,100,5,25,0,125,8,122,18,116,11,124,4,124, + 8,124,7,131,3,1,0,87,0,124,7,83,0,4,0,116, + 5,144,1,121,14,1,0,1,0,1,0,100,6,124,3,155, + 2,100,7,124,8,155,2,157,4,125,5,116,12,160,13,124, + 5,116,14,161,2,1,0,89,0,124,7,83,0,48,0,124, + 7,83,0,41,8,78,114,135,0,0,0,114,25,0,0,0, + 122,23,59,32,123,33,114,125,32,105,115,32,110,111,116,32, + 97,32,112,97,99,107,97,103,101,114,19,0,0,0,233,2, + 0,0,0,122,27,67,97,110,110,111,116,32,115,101,116,32, + 97,110,32,97,116,116,114,105,98,117,116,101,32,111,110,32, + 122,18,32,102,111,114,32,99,104,105,108,100,32,109,111,100, + 117,108,101,32,41,15,114,136,0,0,0,114,18,0,0,0, + 114,99,0,0,0,114,71,0,0,0,114,148,0,0,0,114, + 2,0,0,0,218,8,95,69,82,82,95,77,83,71,114,49, + 0,0,0,218,19,77,111,100,117,108,101,78,111,116,70,111, + 117,110,100,69,114,114,111,114,114,202,0,0,0,114,167,0, + 0,0,114,12,0,0,0,114,95,0,0,0,114,96,0,0, + 0,114,163,0,0,0,41,9,114,20,0,0,0,218,7,105, + 109,112,111,114,116,95,114,175,0,0,0,114,137,0,0,0, + 90,13,112,97,114,101,110,116,95,109,111,100,117,108,101,114, + 102,0,0,0,114,103,0,0,0,114,104,0,0,0,90,5, + 99,104,105,108,100,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,23,95,102,105,110,100,95,97,110,100,95, + 108,111,97,100,95,117,110,108,111,99,107,101,100,218,3,0, + 0,115,60,0,0,0,4,1,14,1,4,1,10,1,10,1, + 10,2,10,1,10,1,2,1,10,1,12,1,16,1,16,1, + 10,1,8,1,18,1,8,2,6,1,10,2,14,1,2,1, + 14,1,4,4,14,253,16,1,14,1,4,1,2,255,4,1, + 255,128,114,213,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,8,0,0,0,67,0,0,0, + 115,128,0,0,0,116,0,124,0,131,1,143,62,1,0,116, + 1,106,2,160,3,124,0,116,4,161,2,125,2,124,2,116, + 4,117,0,114,56,116,5,124,0,124,1,131,2,87,0,2, + 0,100,1,4,0,4,0,131,3,1,0,83,0,87,0,100, + 1,4,0,4,0,131,3,1,0,110,16,49,0,115,76,48, + 0,1,0,1,0,1,0,89,0,1,0,124,2,100,1,117, + 0,114,116,100,2,160,6,124,0,161,1,125,3,116,7,124, + 3,124,0,100,3,141,2,130,1,116,8,124,0,131,1,1, + 0,124,2,83,0,41,4,122,25,70,105,110,100,32,97,110, + 100,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108, + 101,46,78,122,40,105,109,112,111,114,116,32,111,102,32,123, + 125,32,104,97,108,116,101,100,59,32,78,111,110,101,32,105, + 110,32,115,121,115,46,109,111,100,117,108,101,115,114,19,0, + 0,0,41,9,114,54,0,0,0,114,18,0,0,0,114,99, + 0,0,0,114,38,0,0,0,218,14,95,78,69,69,68,83, + 95,76,79,65,68,73,78,71,114,213,0,0,0,114,49,0, + 0,0,114,211,0,0,0,114,69,0,0,0,41,4,114,20, + 0,0,0,114,212,0,0,0,114,104,0,0,0,114,79,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,14,95,102,105,110,100,95,97,110,100,95,108,111,97, + 100,253,3,0,0,115,24,0,0,0,10,2,14,1,8,1, + 54,1,8,2,4,1,2,1,4,255,12,2,8,2,4,1, + 255,128,114,215,0,0,0,114,25,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, + 0,67,0,0,0,115,42,0,0,0,116,0,124,0,124,1, + 124,2,131,3,1,0,124,2,100,1,107,4,114,32,116,1, + 124,0,124,1,124,2,131,3,125,0,116,2,124,0,116,3, + 131,2,83,0,41,3,97,50,1,0,0,73,109,112,111,114, + 116,32,97,110,100,32,114,101,116,117,114,110,32,116,104,101, + 32,109,111,100,117,108,101,32,98,97,115,101,100,32,111,110, + 32,105,116,115,32,110,97,109,101,44,32,116,104,101,32,112, + 97,99,107,97,103,101,32,116,104,101,32,99,97,108,108,32, + 105,115,10,32,32,32,32,98,101,105,110,103,32,109,97,100, + 101,32,102,114,111,109,44,32,97,110,100,32,116,104,101,32, + 108,101,118,101,108,32,97,100,106,117,115,116,109,101,110,116, + 46,10,10,32,32,32,32,84,104,105,115,32,102,117,110,99, + 116,105,111,110,32,114,101,112,114,101,115,101,110,116,115,32, + 116,104,101,32,103,114,101,97,116,101,115,116,32,99,111,109, + 109,111,110,32,100,101,110,111,109,105,110,97,116,111,114,32, + 111,102,32,102,117,110,99,116,105,111,110,97,108,105,116,121, + 10,32,32,32,32,98,101,116,119,101,101,110,32,105,109,112, + 111,114,116,95,109,111,100,117,108,101,32,97,110,100,32,95, + 95,105,109,112,111,114,116,95,95,46,32,84,104,105,115,32, + 105,110,99,108,117,100,101,115,32,115,101,116,116,105,110,103, + 32,95,95,112,97,99,107,97,103,101,95,95,32,105,102,10, + 32,32,32,32,116,104,101,32,108,111,97,100,101,114,32,100, + 105,100,32,110,111,116,46,10,10,32,32,32,32,114,25,0, + 0,0,78,41,4,114,208,0,0,0,114,198,0,0,0,114, + 215,0,0,0,218,11,95,103,99,100,95,105,109,112,111,114, + 116,114,207,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,216,0,0,0,13,4,0,0,115,10, + 0,0,0,12,9,8,1,12,1,10,1,255,128,114,216,0, + 0,0,169,1,218,9,114,101,99,117,114,115,105,118,101,99, + 3,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0, + 11,0,0,0,67,0,0,0,115,216,0,0,0,124,1,68, + 0,93,204,125,4,116,0,124,4,116,1,131,2,115,64,124, + 3,114,34,124,0,106,2,100,1,23,0,125,5,110,4,100, + 2,125,5,116,3,100,3,124,5,155,0,100,4,116,4,124, + 4,131,1,106,2,155,0,157,4,131,1,130,1,124,4,100, + 5,107,2,114,106,124,3,115,4,116,5,124,0,100,6,131, + 2,114,4,116,6,124,0,124,0,106,7,124,2,100,7,100, + 8,141,4,1,0,113,4,116,5,124,0,124,4,131,2,115, + 4,100,9,160,8,124,0,106,2,124,4,161,2,125,6,122, + 14,116,9,124,2,124,6,131,2,1,0,87,0,113,4,4, + 0,116,10,121,214,1,0,125,7,1,0,122,42,124,7,106, + 11,124,6,107,2,114,200,116,12,106,13,160,14,124,6,116, + 15,161,2,100,10,117,1,114,200,87,0,89,0,100,10,125, + 7,126,7,113,4,130,0,100,10,125,7,126,7,48,0,124, + 0,83,0,48,0,41,11,122,238,70,105,103,117,114,101,32, + 111,117,116,32,119,104,97,116,32,95,95,105,109,112,111,114, + 116,95,95,32,115,104,111,117,108,100,32,114,101,116,117,114, + 110,46,10,10,32,32,32,32,84,104,101,32,105,109,112,111, + 114,116,95,32,112,97,114,97,109,101,116,101,114,32,105,115, + 32,97,32,99,97,108,108,97,98,108,101,32,119,104,105,99, + 104,32,116,97,107,101,115,32,116,104,101,32,110,97,109,101, + 32,111,102,32,109,111,100,117,108,101,32,116,111,10,32,32, + 32,32,105,109,112,111,114,116,46,32,73,116,32,105,115,32, + 114,101,113,117,105,114,101,100,32,116,111,32,100,101,99,111, + 117,112,108,101,32,116,104,101,32,102,117,110,99,116,105,111, + 110,32,102,114,111,109,32,97,115,115,117,109,105,110,103,32, + 105,109,112,111,114,116,108,105,98,39,115,10,32,32,32,32, + 105,109,112,111,114,116,32,105,109,112,108,101,109,101,110,116, + 97,116,105,111,110,32,105,115,32,100,101,115,105,114,101,100, + 46,10,10,32,32,32,32,122,8,46,95,95,97,108,108,95, + 95,122,13,96,96,102,114,111,109,32,108,105,115,116,39,39, + 122,8,73,116,101,109,32,105,110,32,122,18,32,109,117,115, + 116,32,98,101,32,115,116,114,44,32,110,111,116,32,250,1, + 42,218,7,95,95,97,108,108,95,95,84,114,217,0,0,0, + 114,193,0,0,0,78,41,16,114,203,0,0,0,114,204,0, + 0,0,114,9,0,0,0,114,205,0,0,0,114,3,0,0, + 0,114,11,0,0,0,218,16,95,104,97,110,100,108,101,95, + 102,114,111,109,108,105,115,116,114,220,0,0,0,114,49,0, + 0,0,114,71,0,0,0,114,211,0,0,0,114,20,0,0, + 0,114,18,0,0,0,114,99,0,0,0,114,38,0,0,0, + 114,214,0,0,0,41,8,114,104,0,0,0,218,8,102,114, + 111,109,108,105,115,116,114,212,0,0,0,114,218,0,0,0, + 218,1,120,90,5,119,104,101,114,101,90,9,102,114,111,109, + 95,110,97,109,101,90,3,101,120,99,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,221,0,0,0,28,4, + 0,0,115,54,0,0,0,8,10,10,1,4,1,12,1,4, + 2,10,1,8,1,8,255,8,2,14,1,10,1,2,1,8, + 255,10,2,14,1,2,1,14,1,14,1,10,4,16,1,2, + 255,12,2,2,1,8,128,4,1,2,248,255,128,114,221,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,6,0,0,0,67,0,0,0,115,146,0,0,0, + 124,0,160,0,100,1,161,1,125,1,124,0,160,0,100,2, + 161,1,125,2,124,1,100,3,117,1,114,82,124,2,100,3, + 117,1,114,78,124,1,124,2,106,1,107,3,114,78,116,2, + 106,3,100,4,124,1,155,2,100,5,124,2,106,1,155,2, + 100,6,157,5,116,4,100,7,100,8,141,3,1,0,124,1, + 83,0,124,2,100,3,117,1,114,96,124,2,106,1,83,0, + 116,2,106,3,100,9,116,4,100,7,100,8,141,3,1,0, + 124,0,100,10,25,0,125,1,100,11,124,0,118,1,114,142, + 124,1,160,5,100,12,161,1,100,13,25,0,125,1,124,1, + 83,0,41,14,122,167,67,97,108,99,117,108,97,116,101,32, + 119,104,97,116,32,95,95,112,97,99,107,97,103,101,95,95, + 32,115,104,111,117,108,100,32,98,101,46,10,10,32,32,32, + 32,95,95,112,97,99,107,97,103,101,95,95,32,105,115,32, + 110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116, + 111,32,98,101,32,100,101,102,105,110,101,100,32,111,114,32, + 99,111,117,108,100,32,98,101,32,115,101,116,32,116,111,32, + 78,111,110,101,10,32,32,32,32,116,111,32,114,101,112,114, + 101,115,101,110,116,32,116,104,97,116,32,105,116,115,32,112, + 114,111,112,101,114,32,118,97,108,117,101,32,105,115,32,117, + 110,107,110,111,119,110,46,10,10,32,32,32,32,114,152,0, + 0,0,114,113,0,0,0,78,122,32,95,95,112,97,99,107, + 97,103,101,95,95,32,33,61,32,95,95,115,112,101,99,95, + 95,46,112,97,114,101,110,116,32,40,122,4,32,33,61,32, + 250,1,41,233,3,0,0,0,41,1,90,10,115,116,97,99, + 107,108,101,118,101,108,122,89,99,97,110,39,116,32,114,101, + 115,111,108,118,101,32,112,97,99,107,97,103,101,32,102,114, + 111,109,32,95,95,115,112,101,99,95,95,32,111,114,32,95, + 95,112,97,99,107,97,103,101,95,95,44,32,102,97,108,108, + 105,110,103,32,98,97,99,107,32,111,110,32,95,95,110,97, + 109,101,95,95,32,97,110,100,32,95,95,112,97,116,104,95, + 95,114,9,0,0,0,114,148,0,0,0,114,135,0,0,0, + 114,25,0,0,0,41,6,114,38,0,0,0,114,137,0,0, + 0,114,95,0,0,0,114,96,0,0,0,114,163,0,0,0, + 114,136,0,0,0,41,3,218,7,103,108,111,98,97,108,115, + 114,196,0,0,0,114,103,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,17,95,99,97,108,99, + 95,95,95,112,97,99,107,97,103,101,95,95,65,4,0,0, + 115,44,0,0,0,10,7,10,1,8,1,18,1,6,1,2, + 1,4,255,4,1,6,255,4,2,6,254,4,3,8,1,6, + 1,6,2,4,2,6,254,8,3,8,1,14,1,4,1,255, + 128,114,227,0,0,0,114,5,0,0,0,99,5,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, + 67,0,0,0,115,174,0,0,0,124,4,100,1,107,2,114, + 18,116,0,124,0,131,1,125,5,110,36,124,1,100,2,117, + 1,114,30,124,1,110,2,105,0,125,6,116,1,124,6,131, + 1,125,7,116,0,124,0,124,7,124,4,131,3,125,5,124, + 3,115,148,124,4,100,1,107,2,114,84,116,0,124,0,160, + 2,100,3,161,1,100,1,25,0,131,1,83,0,124,0,115, + 92,124,5,83,0,116,3,124,0,131,1,116,3,124,0,160, + 2,100,3,161,1,100,1,25,0,131,1,24,0,125,8,116, + 4,106,5,124,5,106,6,100,2,116,3,124,5,106,6,131, + 1,124,8,24,0,133,2,25,0,25,0,83,0,116,7,124, + 5,100,4,131,2,114,170,116,8,124,5,124,3,116,0,131, + 3,83,0,124,5,83,0,41,5,97,215,1,0,0,73,109, + 112,111,114,116,32,97,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,84,104,101,32,39,103,108,111,98,97,108,115, + 39,32,97,114,103,117,109,101,110,116,32,105,115,32,117,115, + 101,100,32,116,111,32,105,110,102,101,114,32,119,104,101,114, + 101,32,116,104,101,32,105,109,112,111,114,116,32,105,115,32, + 111,99,99,117,114,114,105,110,103,32,102,114,111,109,10,32, + 32,32,32,116,111,32,104,97,110,100,108,101,32,114,101,108, + 97,116,105,118,101,32,105,109,112,111,114,116,115,46,32,84, + 104,101,32,39,108,111,99,97,108,115,39,32,97,114,103,117, + 109,101,110,116,32,105,115,32,105,103,110,111,114,101,100,46, + 32,84,104,101,10,32,32,32,32,39,102,114,111,109,108,105, + 115,116,39,32,97,114,103,117,109,101,110,116,32,115,112,101, + 99,105,102,105,101,115,32,119,104,97,116,32,115,104,111,117, + 108,100,32,101,120,105,115,116,32,97,115,32,97,116,116,114, + 105,98,117,116,101,115,32,111,110,32,116,104,101,32,109,111, + 100,117,108,101,10,32,32,32,32,98,101,105,110,103,32,105, + 109,112,111,114,116,101,100,32,40,101,46,103,46,32,96,96, + 102,114,111,109,32,109,111,100,117,108,101,32,105,109,112,111, + 114,116,32,60,102,114,111,109,108,105,115,116,62,96,96,41, + 46,32,32,84,104,101,32,39,108,101,118,101,108,39,10,32, + 32,32,32,97,114,103,117,109,101,110,116,32,114,101,112,114, + 101,115,101,110,116,115,32,116,104,101,32,112,97,99,107,97, + 103,101,32,108,111,99,97,116,105,111,110,32,116,111,32,105, + 109,112,111,114,116,32,102,114,111,109,32,105,110,32,97,32, + 114,101,108,97,116,105,118,101,10,32,32,32,32,105,109,112, + 111,114,116,32,40,101,46,103,46,32,96,96,102,114,111,109, + 32,46,46,112,107,103,32,105,109,112,111,114,116,32,109,111, + 100,96,96,32,119,111,117,108,100,32,104,97,118,101,32,97, + 32,39,108,101,118,101,108,39,32,111,102,32,50,41,46,10, + 10,32,32,32,32,114,25,0,0,0,78,114,135,0,0,0, + 114,148,0,0,0,41,9,114,216,0,0,0,114,227,0,0, + 0,218,9,112,97,114,116,105,116,105,111,110,114,195,0,0, + 0,114,18,0,0,0,114,99,0,0,0,114,9,0,0,0, + 114,11,0,0,0,114,221,0,0,0,41,9,114,20,0,0, + 0,114,226,0,0,0,218,6,108,111,99,97,108,115,114,222, + 0,0,0,114,197,0,0,0,114,104,0,0,0,90,8,103, + 108,111,98,97,108,115,95,114,196,0,0,0,90,7,99,117, + 116,95,111,102,102,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,10,95,95,105,109,112,111,114,116,95,95, + 92,4,0,0,115,32,0,0,0,8,11,10,1,16,2,8, + 1,12,1,4,1,8,3,18,1,4,1,4,1,26,4,30, + 3,10,1,12,1,4,2,255,128,114,230,0,0,0,99,1, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, - 0,0,0,67,0,0,0,115,38,0,0,0,116,0,124,0, - 124,1,131,2,1,0,116,1,106,2,160,3,116,4,161,1, - 1,0,116,1,106,2,160,3,116,5,161,1,1,0,100,1, - 83,0,41,2,122,48,73,110,115,116,97,108,108,32,105,109, - 112,111,114,116,101,114,115,32,102,111,114,32,98,117,105,108, - 116,105,110,32,97,110,100,32,102,114,111,122,101,110,32,109, - 111,100,117,108,101,115,78,41,6,114,231,0,0,0,114,15, - 0,0,0,114,194,0,0,0,114,120,0,0,0,114,162,0, - 0,0,114,177,0,0,0,41,2,114,229,0,0,0,114,230, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,8,95,105,110,115,116,97,108,108,159,4,0,0, - 115,8,0,0,0,10,2,12,2,16,1,255,128,114,232,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,4,0,0,0,67,0,0,0,115,32,0,0,0, - 100,1,100,2,108,0,125,0,124,0,97,1,124,0,160,2, - 116,3,106,4,116,5,25,0,161,1,1,0,100,2,83,0, - 41,3,122,57,73,110,115,116,97,108,108,32,105,109,112,111, - 114,116,101,114,115,32,116,104,97,116,32,114,101,113,117,105, - 114,101,32,101,120,116,101,114,110,97,108,32,102,105,108,101, - 115,121,115,116,101,109,32,97,99,99,101,115,115,114,22,0, - 0,0,78,41,6,218,26,95,102,114,111,122,101,110,95,105, - 109,112,111,114,116,108,105,98,95,101,120,116,101,114,110,97, - 108,114,127,0,0,0,114,232,0,0,0,114,15,0,0,0, - 114,93,0,0,0,114,1,0,0,0,41,1,114,233,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,27,95,105,110,115,116,97,108,108,95,101,120,116,101,114, - 110,97,108,95,105,109,112,111,114,116,101,114,115,167,4,0, - 0,115,8,0,0,0,8,3,4,1,20,1,255,128,114,234, - 0,0,0,41,2,78,78,41,1,78,41,2,78,114,22,0, - 0,0,41,4,78,78,114,10,0,0,0,114,22,0,0,0, - 41,53,114,3,0,0,0,114,23,0,0,0,114,195,0,0, - 0,114,65,0,0,0,114,127,0,0,0,114,12,0,0,0, - 114,18,0,0,0,114,60,0,0,0,114,34,0,0,0,114, - 44,0,0,0,114,19,0,0,0,114,20,0,0,0,114,50, - 0,0,0,114,51,0,0,0,114,54,0,0,0,114,66,0, - 0,0,114,68,0,0,0,114,77,0,0,0,114,87,0,0, - 0,114,91,0,0,0,114,98,0,0,0,114,112,0,0,0, - 114,113,0,0,0,114,92,0,0,0,114,143,0,0,0,114, - 149,0,0,0,114,153,0,0,0,114,108,0,0,0,114,94, - 0,0,0,114,159,0,0,0,114,160,0,0,0,114,95,0, - 0,0,114,162,0,0,0,114,177,0,0,0,114,182,0,0, - 0,114,191,0,0,0,114,193,0,0,0,114,198,0,0,0, - 114,204,0,0,0,90,15,95,69,82,82,95,77,83,71,95, - 80,82,69,70,73,88,114,206,0,0,0,114,209,0,0,0, - 218,6,111,98,106,101,99,116,114,210,0,0,0,114,211,0, - 0,0,114,212,0,0,0,114,217,0,0,0,114,223,0,0, - 0,114,226,0,0,0,114,227,0,0,0,114,231,0,0,0, - 114,232,0,0,0,114,234,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, - 60,109,111,100,117,108,101,62,1,0,0,0,115,104,0,0, - 0,4,0,4,25,4,1,4,1,4,3,8,3,8,8,4, - 8,4,2,16,3,14,4,14,77,14,21,8,16,8,37,8, - 17,14,11,8,8,8,11,8,12,8,16,14,36,16,101,10, - 26,14,45,8,72,8,17,8,17,8,30,8,37,8,42,14, - 15,14,75,14,79,8,13,8,9,10,9,8,47,4,16,8, - 1,8,2,6,32,8,3,10,16,14,15,8,37,10,27,8, - 37,8,7,8,35,12,8,255,128, + 0,0,0,67,0,0,0,115,38,0,0,0,116,0,160,1, + 124,0,161,1,125,1,124,1,100,0,117,0,114,30,116,2, + 100,1,124,0,23,0,131,1,130,1,116,3,124,1,131,1, + 83,0,41,2,78,122,25,110,111,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,32,110,97,109,101,100,32, + 41,4,114,169,0,0,0,114,177,0,0,0,114,83,0,0, + 0,114,167,0,0,0,41,2,114,20,0,0,0,114,103,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,18,95,98,117,105,108,116,105,110,95,102,114,111,109, + 95,110,97,109,101,129,4,0,0,115,10,0,0,0,10,1, + 8,1,12,1,8,1,255,128,114,231,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,10,0,0,0,5,0, + 0,0,67,0,0,0,115,164,0,0,0,124,1,97,0,124, + 0,97,1,116,2,116,1,131,1,125,2,116,1,106,3,160, + 4,161,0,68,0,93,70,92,2,125,3,125,4,116,5,124, + 4,124,2,131,2,114,26,124,3,116,1,106,6,118,0,114, + 60,116,7,125,5,110,16,116,0,160,8,124,3,161,1,114, + 26,116,9,125,5,110,0,116,10,124,4,124,5,131,2,125, + 6,116,11,124,6,124,4,131,2,1,0,113,26,116,1,106, + 3,116,12,25,0,125,7,100,1,68,0,93,46,125,8,124, + 8,116,1,106,3,118,1,114,136,116,13,124,8,131,1,125, + 9,110,10,116,1,106,3,124,8,25,0,125,9,116,14,124, + 7,124,8,124,9,131,3,1,0,113,112,100,2,83,0,41, + 3,122,250,83,101,116,117,112,32,105,109,112,111,114,116,108, + 105,98,32,98,121,32,105,109,112,111,114,116,105,110,103,32, + 110,101,101,100,101,100,32,98,117,105,108,116,45,105,110,32, + 109,111,100,117,108,101,115,32,97,110,100,32,105,110,106,101, + 99,116,105,110,103,32,116,104,101,109,10,32,32,32,32,105, + 110,116,111,32,116,104,101,32,103,108,111,98,97,108,32,110, + 97,109,101,115,112,97,99,101,46,10,10,32,32,32,32,65, + 115,32,115,121,115,32,105,115,32,110,101,101,100,101,100,32, + 102,111,114,32,115,121,115,46,109,111,100,117,108,101,115,32, + 97,99,99,101,115,115,32,97,110,100,32,95,105,109,112,32, + 105,115,32,110,101,101,100,101,100,32,116,111,32,108,111,97, + 100,32,98,117,105,108,116,45,105,110,10,32,32,32,32,109, + 111,100,117,108,101,115,44,32,116,104,111,115,101,32,116,119, + 111,32,109,111,100,117,108,101,115,32,109,117,115,116,32,98, + 101,32,101,120,112,108,105,99,105,116,108,121,32,112,97,115, + 115,101,100,32,105,110,46,10,10,32,32,32,32,41,3,114, + 26,0,0,0,114,95,0,0,0,114,68,0,0,0,78,41, + 15,114,61,0,0,0,114,18,0,0,0,114,3,0,0,0, + 114,99,0,0,0,218,5,105,116,101,109,115,114,203,0,0, + 0,114,82,0,0,0,114,169,0,0,0,114,92,0,0,0, + 114,184,0,0,0,114,149,0,0,0,114,155,0,0,0,114, + 9,0,0,0,114,231,0,0,0,114,12,0,0,0,41,10, + 218,10,115,121,115,95,109,111,100,117,108,101,218,11,95,105, + 109,112,95,109,111,100,117,108,101,90,11,109,111,100,117,108, + 101,95,116,121,112,101,114,20,0,0,0,114,104,0,0,0, + 114,116,0,0,0,114,103,0,0,0,90,11,115,101,108,102, + 95,109,111,100,117,108,101,90,12,98,117,105,108,116,105,110, + 95,110,97,109,101,90,14,98,117,105,108,116,105,110,95,109, + 111,100,117,108,101,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,6,95,115,101,116,117,112,136,4,0,0, + 115,38,0,0,0,4,9,4,1,8,3,18,1,10,1,10, + 1,6,1,10,1,6,1,10,3,12,1,10,3,8,1,10, + 1,10,1,10,2,14,1,4,251,255,128,114,235,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, + 124,0,124,1,131,2,1,0,116,1,106,2,160,3,116,4, + 161,1,1,0,116,1,106,2,160,3,116,5,161,1,1,0, + 100,1,83,0,41,2,122,48,73,110,115,116,97,108,108,32, + 105,109,112,111,114,116,101,114,115,32,102,111,114,32,98,117, + 105,108,116,105,110,32,97,110,100,32,102,114,111,122,101,110, + 32,109,111,100,117,108,101,115,78,41,6,114,235,0,0,0, + 114,18,0,0,0,114,201,0,0,0,114,126,0,0,0,114, + 169,0,0,0,114,184,0,0,0,41,2,114,233,0,0,0, + 114,234,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,8,95,105,110,115,116,97,108,108,171,4, + 0,0,115,8,0,0,0,10,2,12,2,16,1,255,128,114, + 236,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,67,0,0,0,115,32,0, + 0,0,100,1,100,2,108,0,125,0,124,0,97,1,124,0, + 160,2,116,3,106,4,116,5,25,0,161,1,1,0,100,2, + 83,0,41,3,122,57,73,110,115,116,97,108,108,32,105,109, + 112,111,114,116,101,114,115,32,116,104,97,116,32,114,101,113, + 117,105,114,101,32,101,120,116,101,114,110,97,108,32,102,105, + 108,101,115,121,115,116,101,109,32,97,99,99,101,115,115,114, + 25,0,0,0,78,41,6,218,26,95,102,114,111,122,101,110, + 95,105,109,112,111,114,116,108,105,98,95,101,120,116,101,114, + 110,97,108,114,133,0,0,0,114,236,0,0,0,114,18,0, + 0,0,114,99,0,0,0,114,9,0,0,0,41,1,114,237, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,27,95,105,110,115,116,97,108,108,95,101,120,116, + 101,114,110,97,108,95,105,109,112,111,114,116,101,114,115,179, + 4,0,0,115,8,0,0,0,8,3,4,1,20,1,255,128, + 114,238,0,0,0,41,2,78,78,41,1,78,41,2,78,114, + 25,0,0,0,41,4,78,78,114,5,0,0,0,114,25,0, + 0,0,41,54,114,10,0,0,0,114,7,0,0,0,114,26, + 0,0,0,114,95,0,0,0,114,68,0,0,0,114,133,0, + 0,0,114,17,0,0,0,114,21,0,0,0,114,63,0,0, + 0,114,37,0,0,0,114,47,0,0,0,114,22,0,0,0, + 114,23,0,0,0,114,53,0,0,0,114,54,0,0,0,114, + 57,0,0,0,114,69,0,0,0,114,71,0,0,0,114,80, + 0,0,0,114,90,0,0,0,114,94,0,0,0,114,105,0, + 0,0,114,118,0,0,0,114,119,0,0,0,114,98,0,0, + 0,114,149,0,0,0,114,155,0,0,0,114,159,0,0,0, + 114,114,0,0,0,114,100,0,0,0,114,166,0,0,0,114, + 167,0,0,0,114,101,0,0,0,114,169,0,0,0,114,184, + 0,0,0,114,189,0,0,0,114,198,0,0,0,114,200,0, + 0,0,114,202,0,0,0,114,208,0,0,0,90,15,95,69, + 82,82,95,77,83,71,95,80,82,69,70,73,88,114,210,0, + 0,0,114,213,0,0,0,218,6,111,98,106,101,99,116,114, + 214,0,0,0,114,215,0,0,0,114,216,0,0,0,114,221, + 0,0,0,114,227,0,0,0,114,230,0,0,0,114,231,0, + 0,0,114,235,0,0,0,114,236,0,0,0,114,238,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,8,60,109,111,100,117,108,101,62,1, + 0,0,0,115,106,0,0,0,4,0,8,22,4,9,4,1, + 4,1,4,3,8,3,8,8,4,8,4,2,16,3,14,4, + 14,77,14,21,8,16,8,37,8,17,14,11,8,8,8,11, + 8,12,8,19,14,36,16,101,10,26,14,45,8,72,8,17, + 8,17,8,30,8,36,8,45,14,15,14,75,14,80,8,13, + 8,9,10,9,8,47,4,16,8,1,8,2,6,32,8,3, + 10,16,14,15,8,37,10,27,8,37,8,7,8,35,12,8, + 255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 8f18d208d2ec01..58dc10b6f35bcd 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -1179,13 +1179,13 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, 0,0,4,0,0,0,67,0,0,0,115,12,0,0,0,116, 0,160,1,124,0,124,1,161,2,83,0,41,2,122,26,84, - 104,105,115,32,109,111,100,117,108,101,32,105,115,32,100,101, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, 112,114,101,99,97,116,101,100,46,78,41,2,114,139,0,0, 0,218,17,95,108,111,97,100,95,109,111,100,117,108,101,95, 115,104,105,109,169,2,114,123,0,0,0,114,143,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, 11,108,111,97,100,95,109,111,100,117,108,101,66,3,0,0, - 115,4,0,0,0,12,2,255,128,122,25,95,76,111,97,100, + 115,4,0,0,0,12,3,255,128,122,25,95,76,111,97,100, 101,114,66,97,115,105,99,115,46,108,111,97,100,95,109,111, 100,117,108,101,78,41,8,114,130,0,0,0,114,129,0,0, 0,114,131,0,0,0,114,132,0,0,0,114,186,0,0,0, @@ -1216,7 +1216,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,32,32,78,41,1,114,58,0,0,0,169, 2,114,123,0,0,0,114,52,0,0,0,114,7,0,0,0, 114,7,0,0,0,114,8,0,0,0,218,10,112,97,116,104, - 95,109,116,105,109,101,73,3,0,0,115,4,0,0,0,4, + 95,109,116,105,109,101,74,3,0,0,115,4,0,0,0,4, 6,255,128,122,23,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,0,0,0,0,2,0,0,0,4,0,0, @@ -1250,7 +1250,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,101,100,46,10,32,32,32,32,32,32,32,32,114,173,0, 0,0,78,41,1,114,230,0,0,0,114,229,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, - 112,97,116,104,95,115,116,97,116,115,81,3,0,0,115,4, + 112,97,116,104,95,115,116,97,116,115,82,3,0,0,115,4, 0,0,0,14,12,255,128,122,23,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,0,0,0,0,4,0,0, @@ -1274,7 +1274,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 4,114,123,0,0,0,114,112,0,0,0,90,10,99,97,99, 104,101,95,112,97,116,104,114,37,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,15,95,99,97, - 99,104,101,95,98,121,116,101,99,111,100,101,95,3,0,0, + 99,104,101,95,98,121,116,101,99,111,100,101,96,3,0,0, 115,4,0,0,0,12,8,255,128,122,28,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, @@ -1291,7 +1291,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,100,101,32,102,105,108,101,115,46,10,32,32,32,32,32, 32,32,32,78,114,7,0,0,0,41,3,114,123,0,0,0, 114,52,0,0,0,114,37,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,232,0,0,0,105,3, + 7,0,0,0,114,8,0,0,0,114,232,0,0,0,106,3, 0,0,115,4,0,0,0,4,0,255,128,122,21,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,0,0,0,0,5, @@ -1312,7 +1312,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 123,0,0,0,114,143,0,0,0,114,52,0,0,0,114,178, 0,0,0,218,3,101,120,99,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,10,103,101,116,95,115,111,117, - 114,99,101,112,3,0,0,115,26,0,0,0,10,2,2,1, + 114,99,101,113,3,0,0,115,26,0,0,0,10,2,2,1, 12,1,8,4,14,253,4,1,2,1,4,255,2,1,2,255, 8,128,2,255,255,128,122,23,83,111,117,114,99,101,76,111, 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,114, @@ -1335,7 +1335,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,37,0,0,0,114,52,0,0,0,114,237,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, 0,218,14,115,111,117,114,99,101,95,116,111,95,99,111,100, - 101,122,3,0,0,115,8,0,0,0,12,5,4,1,6,255, + 101,123,3,0,0,115,8,0,0,0,12,5,4,1,6,255, 255,128,122,27,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,0,0,0,0,15,0,0,0, @@ -1412,7 +1412,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,16,0,0,0,90,10,98,121,116,101,115,95, 100,97,116,97,90,11,99,111,100,101,95,111,98,106,101,99, 116,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,220,0,0,0,130,3,0,0,115,160,0,0,0,10,7, + 114,220,0,0,0,131,3,0,0,115,160,0,0,0,10,7, 4,1,4,1,4,1,4,1,4,1,2,1,12,1,12,1, 12,1,2,2,14,1,12,1,8,1,12,2,2,1,14,1, 12,1,6,1,2,3,2,1,6,254,2,4,12,1,16,1, @@ -1429,7 +1429,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,233,0,0,0,114,232,0,0,0,114,236,0,0,0, 114,240,0,0,0,114,220,0,0,0,114,7,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,228, - 0,0,0,71,3,0,0,115,18,0,0,0,8,0,8,2, + 0,0,0,72,3,0,0,115,18,0,0,0,8,0,8,2, 8,8,8,14,8,10,8,7,14,10,12,8,255,128,114,228, 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,4,0,0,0,0,0,0,0,115,92,0,0, @@ -1456,7 +1456,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,10,32,32,32,32,32,32,32,32,102,105,110,100,101,114, 46,78,114,163,0,0,0,41,3,114,123,0,0,0,114,143, 0,0,0,114,52,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,216,0,0,0,220,3,0,0, + 0,0,114,8,0,0,0,114,216,0,0,0,221,3,0,0, 115,6,0,0,0,6,3,10,1,255,128,122,19,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,0,0,0,0,2,0,0, @@ -1466,7 +1466,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,99,108,97,115,115,95,95,114,136,0,0,0,169,2,114, 123,0,0,0,90,5,111,116,104,101,114,114,7,0,0,0, 114,7,0,0,0,114,8,0,0,0,218,6,95,95,101,113, - 95,95,226,3,0,0,115,8,0,0,0,12,1,10,1,2, + 95,95,227,3,0,0,115,8,0,0,0,12,1,10,1,2, 255,255,128,122,17,70,105,108,101,76,111,97,100,101,114,46, 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, @@ -1474,7 +1474,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 106,2,131,1,65,0,83,0,114,114,0,0,0,169,3,218, 4,104,97,115,104,114,121,0,0,0,114,52,0,0,0,169, 1,114,123,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,8,95,95,104,97,115,104,95,95,230, + 114,8,0,0,0,218,8,95,95,104,97,115,104,95,95,231, 3,0,0,115,4,0,0,0,20,1,255,128,122,19,70,105, 108,101,76,111,97,100,101,114,46,95,95,104,97,115,104,95, 95,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, @@ -1489,7 +1489,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,32,32,78,41,3,218,5,115,117,112,101, 114,114,246,0,0,0,114,227,0,0,0,114,226,0,0,0, 169,1,114,248,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,227,0,0,0,233,3,0,0,115,4,0,0,0,16, + 0,114,227,0,0,0,234,3,0,0,115,4,0,0,0,16, 10,255,128,122,22,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,0,0,0,0,2,0,0,0,1,0,0,0, @@ -1499,7 +1499,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,102,105,108,101,32,97,115,32,102,111,117,110,100,32,98, 121,32,116,104,101,32,102,105,110,100,101,114,46,78,114,56, 0,0,0,114,226,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,183,0,0,0,245,3,0,0, + 0,0,114,8,0,0,0,114,183,0,0,0,246,3,0,0, 115,4,0,0,0,6,3,255,128,122,23,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,0,0,0,0,3, @@ -1521,7 +1521,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,90,0,0,0,90,4,114,101,97,100,114,73,0,0,0, 41,3,114,123,0,0,0,114,52,0,0,0,114,76,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,234,0,0,0,250,3,0,0,115,14,0,0,0,14,2, + 114,234,0,0,0,251,3,0,0,115,14,0,0,0,14,2, 16,1,42,1,14,2,38,1,4,128,255,128,122,19,70,105, 108,101,76,111,97,100,101,114,46,103,101,116,95,100,97,116, 97,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, @@ -1533,7 +1533,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,0,0,41,3,114,123,0,0,0,114,223,0,0,0,114, 4,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, 0,0,0,218,19,103,101,116,95,114,101,115,111,117,114,99, - 101,95,114,101,97,100,101,114,3,4,0,0,115,6,0,0, + 101,95,114,101,97,100,101,114,4,4,0,0,115,6,0,0, 0,12,2,8,1,255,128,122,30,70,105,108,101,76,111,97, 100,101,114,46,103,101,116,95,114,101,115,111,117,114,99,101, 95,114,101,97,100,101,114,41,13,114,130,0,0,0,114,129, @@ -1542,7 +1542,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,227,0,0,0,114,183,0,0,0,114,234,0,0,0, 114,5,1,0,0,90,13,95,95,99,108,97,115,115,99,101, 108,108,95,95,114,7,0,0,0,114,7,0,0,0,114,0, - 1,0,0,114,8,0,0,0,114,246,0,0,0,215,3,0, + 1,0,0,114,8,0,0,0,114,246,0,0,0,216,3,0, 0,115,26,0,0,0,8,0,4,2,8,3,8,6,8,4, 2,3,14,1,2,11,10,1,8,4,2,9,18,1,255,128, 114,246,0,0,0,99,0,0,0,0,0,0,0,0,0,0, @@ -1565,7 +1565,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,218,8,115,116,95,109,116,105,109,101,90,7,115,116, 95,115,105,122,101,41,3,114,123,0,0,0,114,52,0,0, 0,114,245,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,231,0,0,0,13,4,0,0,115,6, + 114,8,0,0,0,114,231,0,0,0,14,4,0,0,115,6, 0,0,0,8,2,14,1,255,128,122,27,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,0,0, @@ -1576,7 +1576,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 232,0,0,0,41,5,114,123,0,0,0,114,112,0,0,0, 114,111,0,0,0,114,37,0,0,0,114,60,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,233, - 0,0,0,18,4,0,0,115,6,0,0,0,8,2,16,1, + 0,0,0,19,4,0,0,115,6,0,0,0,8,2,16,1, 255,128,122,32,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, 99,111,100,101,114,68,0,0,0,114,8,1,0,0,99,3, @@ -1611,7 +1611,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,218,6,112,97,114,101,110,116,114,101,0,0,0,114,47, 0,0,0,114,43,0,0,0,114,235,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,232,0,0, - 0,23,4,0,0,115,58,0,0,0,12,2,4,1,12,2, + 0,24,4,0,0,115,58,0,0,0,12,2,4,1,12,2, 12,1,12,1,12,2,10,1,2,1,14,1,12,1,4,2, 14,1,6,3,4,1,4,255,16,2,8,128,2,1,12,1, 18,1,14,1,8,2,2,1,18,255,8,128,2,254,4,255, @@ -1620,7 +1620,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 41,7,114,130,0,0,0,114,129,0,0,0,114,131,0,0, 0,114,132,0,0,0,114,231,0,0,0,114,233,0,0,0, 114,232,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,6,1,0,0,9,4, + 7,0,0,0,114,8,0,0,0,114,6,1,0,0,10,4, 0,0,115,12,0,0,0,8,0,4,2,8,2,8,5,18, 5,255,128,114,6,1,0,0,99,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, @@ -1643,7 +1643,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,41,5,114,123,0,0,0,114,143,0,0,0,114, 52,0,0,0,114,37,0,0,0,114,155,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,220,0, - 0,0,58,4,0,0,115,24,0,0,0,10,1,10,1,2, + 0,0,59,4,0,0,115,24,0,0,0,10,1,10,1,2, 4,2,1,6,254,12,4,2,1,14,1,2,1,2,1,6, 253,255,128,122,29,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, @@ -1653,14 +1653,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, 114,7,0,0,0,114,226,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,236,0,0,0,74,4, + 7,0,0,0,114,8,0,0,0,114,236,0,0,0,75,4, 0,0,115,4,0,0,0,4,2,255,128,122,31,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,41,6,114, 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, 0,0,0,114,220,0,0,0,114,236,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,12,1,0,0,54,4,0,0,115,10,0,0,0,8, + 0,114,12,1,0,0,55,4,0,0,115,10,0,0,0,8, 0,4,2,8,2,12,16,255,128,114,12,1,0,0,99,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, 0,0,0,64,0,0,0,115,92,0,0,0,101,0,90,1, @@ -1681,7 +1681,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,0,124,2,124,0,95,1,100,0,83,0,114,114,0,0, 0,114,163,0,0,0,41,3,114,123,0,0,0,114,121,0, 0,0,114,52,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,216,0,0,0,87,4,0,0,115, + 0,114,8,0,0,0,114,216,0,0,0,88,4,0,0,115, 6,0,0,0,6,1,10,1,255,128,122,28,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, @@ -1690,7 +1690,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,22,124,0,106,1,124,1,106,1,107,2,83,0,114,114, 0,0,0,114,247,0,0,0,114,249,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,250,0,0, - 0,91,4,0,0,115,8,0,0,0,12,1,10,1,2,255, + 0,92,4,0,0,115,8,0,0,0,12,1,10,1,2,255, 255,128,122,26,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,95,95,101,113,95,95,99,1, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, @@ -1698,7 +1698,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 106,1,131,1,116,0,124,0,106,2,131,1,65,0,83,0, 114,114,0,0,0,114,251,0,0,0,114,253,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,254, - 0,0,0,95,4,0,0,115,4,0,0,0,20,1,255,128, + 0,0,0,96,4,0,0,115,4,0,0,0,20,1,255,128, 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76, 111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,2, 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, @@ -1715,7 +1715,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,109,105,99,114,153,0,0,0,114,121,0,0,0,114,52, 0,0,0,41,3,114,123,0,0,0,114,191,0,0,0,114, 223,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,219,0,0,0,98,4,0,0,115,16,0,0, + 0,0,0,114,219,0,0,0,99,4,0,0,115,16,0,0, 0,4,2,6,1,4,255,6,2,8,1,4,255,4,2,255, 128,122,33,69,120,116,101,110,115,105,111,110,70,105,108,101, 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111, @@ -1733,7 +1733,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 105,99,114,153,0,0,0,114,121,0,0,0,114,52,0,0, 0,169,2,114,123,0,0,0,114,223,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,224,0,0, - 0,106,4,0,0,115,10,0,0,0,14,2,6,1,8,1, + 0,107,4,0,0,115,10,0,0,0,14,2,6,1,8,1, 8,255,255,128,122,31,69,120,116,101,110,115,105,111,110,70, 105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,109, 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, @@ -1751,14 +1751,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,114,7,0,0,0,169,2,114,5,0,0,0,218,6,115, 117,102,102,105,120,169,1,90,9,102,105,108,101,95,110,97, 109,101,114,7,0,0,0,114,8,0,0,0,114,9,0,0, - 0,115,4,0,0,115,8,0,0,0,4,0,2,1,20,255, + 0,116,4,0,0,115,8,0,0,0,4,0,2,1,20,255, 255,128,122,49,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,111,99,97,108,115,62,46,60,103,101,110, 101,120,112,114,62,78,41,4,114,55,0,0,0,114,52,0, 0,0,218,3,97,110,121,114,212,0,0,0,114,226,0,0, 0,114,7,0,0,0,114,16,1,0,0,114,8,0,0,0, - 114,186,0,0,0,112,4,0,0,115,10,0,0,0,14,2, + 114,186,0,0,0,113,4,0,0,115,10,0,0,0,14,2, 12,1,2,1,8,255,255,128,122,30,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, @@ -1769,7 +1769,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,7, 0,0,0,114,226,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,220,0,0,0,118,4,0,0, + 0,0,114,8,0,0,0,114,220,0,0,0,119,4,0,0, 115,4,0,0,0,4,2,255,128,122,28,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, @@ -1780,14 +1780,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 118,101,32,110,111,32,115,111,117,114,99,101,32,99,111,100, 101,46,78,114,7,0,0,0,114,226,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,236,0,0, - 0,122,4,0,0,115,4,0,0,0,4,2,255,128,122,30, + 0,123,4,0,0,115,4,0,0,0,4,2,255,128,122,30, 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,99,2, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, 0,0,0,67,0,0,0,115,6,0,0,0,124,0,106,0, 83,0,114,1,1,0,0,114,56,0,0,0,114,226,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,183,0,0,0,126,4,0,0,115,4,0,0,0,6,3, + 114,183,0,0,0,127,4,0,0,115,4,0,0,0,6,3, 255,128,122,32,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,101, 110,97,109,101,78,41,14,114,130,0,0,0,114,129,0,0, @@ -1796,7 +1796,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 224,0,0,0,114,186,0,0,0,114,220,0,0,0,114,236, 0,0,0,114,140,0,0,0,114,183,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,3,1,0,0,79,4,0,0,115,26,0,0,0,8, + 0,114,3,1,0,0,80,4,0,0,115,26,0,0,0,8, 0,4,2,8,6,8,4,8,4,8,3,8,8,8,6,8, 6,8,4,2,4,14,1,255,128,114,3,1,0,0,99,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, @@ -1839,7 +1839,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 169,4,114,123,0,0,0,114,121,0,0,0,114,52,0,0, 0,90,11,112,97,116,104,95,102,105,110,100,101,114,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, - 0,0,139,4,0,0,115,10,0,0,0,6,1,6,1,14, + 0,0,140,4,0,0,115,10,0,0,0,6,1,6,1,14, 1,10,1,255,128,122,23,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,0,0,0,0,4,0,0,0,3, @@ -1856,7 +1856,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,41,4,114,123,0,0,0,114,11,1,0,0,218,3,100, 111,116,90,2,109,101,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,23,95,102,105,110,100,95,112,97,114, - 101,110,116,95,112,97,116,104,95,110,97,109,101,115,145,4, + 101,110,116,95,112,97,116,104,95,110,97,109,101,115,146,4, 0,0,115,10,0,0,0,18,2,8,1,4,2,8,3,255, 128,122,38,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, @@ -1870,7 +1870,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,95,109,111,100,117,108,101,95,110,97,109,101,90,14,112, 97,116,104,95,97,116,116,114,95,110,97,109,101,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,21,1,0, - 0,155,4,0,0,115,6,0,0,0,12,1,16,1,255,128, + 0,156,4,0,0,115,6,0,0,0,12,1,16,1,255,128, 122,31,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,0,0,0,0,3,0, @@ -1886,7 +1886,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,123,0,0,0,90,11,112,97,114,101,110,116,95,112,97, 116,104,114,191,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,12,95,114,101,99,97,108,99,117, - 108,97,116,101,159,4,0,0,115,18,0,0,0,12,2,10, + 108,97,116,101,160,4,0,0,115,18,0,0,0,12,2,10, 1,14,1,18,3,6,1,8,1,6,1,6,1,255,128,122, 27,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, 95,114,101,99,97,108,99,117,108,97,116,101,99,1,0,0, @@ -1895,7 +1895,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 161,0,131,1,83,0,114,114,0,0,0,41,2,218,4,105, 116,101,114,114,28,1,0,0,114,253,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,8,95,95, - 105,116,101,114,95,95,172,4,0,0,115,4,0,0,0,12, + 105,116,101,114,95,95,173,4,0,0,115,4,0,0,0,12, 1,255,128,122,23,95,78,97,109,101,115,112,97,99,101,80, 97,116,104,46,95,95,105,116,101,114,95,95,99,2,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, @@ -1903,7 +1903,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,1,25,0,83,0,114,114,0,0,0,169,1,114,28,1, 0,0,41,2,114,123,0,0,0,218,5,105,110,100,101,120, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,95,95,103,101,116,105,116,101,109,95,95,175,4,0,0, + 11,95,95,103,101,116,105,116,101,109,95,95,176,4,0,0, 115,4,0,0,0,12,1,255,128,122,26,95,78,97,109,101, 115,112,97,99,101,80,97,116,104,46,95,95,103,101,116,105, 116,101,109,95,95,99,3,0,0,0,0,0,0,0,0,0, @@ -1912,7 +1912,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,114,0,0,0,41,1,114,20,1,0,0,41,3,114, 123,0,0,0,114,32,1,0,0,114,52,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, - 95,115,101,116,105,116,101,109,95,95,178,4,0,0,115,4, + 95,115,101,116,105,116,101,109,95,95,179,4,0,0,115,4, 0,0,0,14,1,255,128,122,26,95,78,97,109,101,115,112, 97,99,101,80,97,116,104,46,95,95,115,101,116,105,116,101, 109,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, @@ -1920,7 +1920,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,116,0,124,0,160,1,161,0,131,1,83,0,114,114,0, 0,0,41,2,114,4,0,0,0,114,28,1,0,0,114,253, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,7,95,95,108,101,110,95,95,181,4,0,0,115, + 0,0,218,7,95,95,108,101,110,95,95,182,4,0,0,115, 4,0,0,0,12,1,255,128,122,22,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,0,0,0,0,1,0,0, @@ -1929,7 +1929,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, 114,125,41,41,2,114,70,0,0,0,114,20,1,0,0,114, 253,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,8,95,95,114,101,112,114,95,95,184,4,0, + 0,0,0,218,8,95,95,114,101,112,114,95,95,185,4,0, 0,115,4,0,0,0,12,1,255,128,122,23,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,0,0,0,0, @@ -1938,7 +1938,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,31,1,0,0,169,2,114,123,0,0,0,218,4, 105,116,101,109,114,7,0,0,0,114,7,0,0,0,114,8, 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, - 95,187,4,0,0,115,4,0,0,0,12,1,255,128,122,27, + 95,188,4,0,0,115,4,0,0,0,12,1,255,128,122,27, 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,0,0,0,0,2,0,0,0,3,0,0,0, @@ -1946,7 +1946,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,161,1,1,0,100,0,83,0,114,114,0,0,0,41,2, 114,20,1,0,0,114,190,0,0,0,114,37,1,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,190, - 0,0,0,190,4,0,0,115,4,0,0,0,16,1,255,128, + 0,0,0,191,4,0,0,115,4,0,0,0,16,1,255,128, 122,21,95,78,97,109,101,115,112,97,99,101,80,97,116,104, 46,97,112,112,101,110,100,78,41,15,114,130,0,0,0,114, 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,216, @@ -1954,7 +1954,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,30,1,0,0,114,33,1,0,0,114,34,1,0, 0,114,35,1,0,0,114,36,1,0,0,114,39,1,0,0, 114,190,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,18,1,0,0,132,4, + 7,0,0,0,114,8,0,0,0,114,18,1,0,0,133,4, 0,0,115,28,0,0,0,8,0,4,1,8,6,8,6,8, 10,8,4,8,13,8,3,8,3,8,3,8,3,8,3,12, 3,255,128,114,18,1,0,0,99,0,0,0,0,0,0,0, @@ -1971,7 +1971,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 131,3,124,0,95,1,100,0,83,0,114,114,0,0,0,41, 2,114,18,1,0,0,114,20,1,0,0,114,24,1,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 216,0,0,0,196,4,0,0,115,4,0,0,0,18,1,255, + 216,0,0,0,197,4,0,0,115,4,0,0,0,18,1,255, 128,122,25,95,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,1,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, @@ -1988,21 +1988,21 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,115,112,97,99,101,41,62,78,41,2,114,70,0,0,0, 114,130,0,0,0,41,1,114,223,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,11,109,111,100, - 117,108,101,95,114,101,112,114,199,4,0,0,115,4,0,0, + 117,108,101,95,114,101,112,114,200,4,0,0,115,4,0,0, 0,12,7,255,128,122,28,95,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,0,0,0,0, 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, 0,100,1,83,0,41,2,78,84,114,7,0,0,0,114,226, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,186,0,0,0,208,4,0,0,115,4,0,0,0, + 0,0,114,186,0,0,0,209,4,0,0,115,4,0,0,0, 4,1,255,128,122,27,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0, 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, 1,83,0,41,2,78,114,10,0,0,0,114,7,0,0,0, 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,236,0,0,0,211,4,0,0,115,4,0, + 8,0,0,0,114,236,0,0,0,212,4,0,0,115,4,0, 0,0,4,1,255,128,122,27,95,78,97,109,101,115,112,97, 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117, 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0, @@ -2012,20 +2012,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,103,62,114,222,0,0,0,84,41,1,114,238,0,0,0, 41,1,114,239,0,0,0,114,226,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,220,0,0,0, - 214,4,0,0,115,4,0,0,0,16,1,255,128,122,25,95, + 215,4,0,0,115,4,0,0,0,16,1,255,128,122,25,95, 78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, 0,115,4,0,0,0,100,1,83,0,114,217,0,0,0,114, 7,0,0,0,114,218,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,219,0,0,0,217,4,0, + 0,0,0,114,8,0,0,0,114,219,0,0,0,218,4,0, 0,115,4,0,0,0,4,0,255,128,122,30,95,78,97,109, 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, 0,0,0,115,4,0,0,0,100,0,83,0,114,114,0,0, 0,114,7,0,0,0,114,13,1,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,224,0,0,0,220, + 114,7,0,0,0,114,8,0,0,0,114,224,0,0,0,221, 4,0,0,115,4,0,0,0,4,1,255,128,122,28,95,78, 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, @@ -2044,15 +2044,15 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,41,4,114,139,0,0,0,114,153,0,0,0,114,20,1, 0,0,114,225,0,0,0,114,226,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,227,0,0,0, - 223,4,0,0,115,10,0,0,0,6,7,4,1,4,255,12, - 2,255,128,122,28,95,78,97,109,101,115,112,97,99,101,76, + 224,4,0,0,115,10,0,0,0,6,7,4,1,4,255,12, + 3,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0,114,131, 0,0,0,114,216,0,0,0,114,213,0,0,0,114,41,1, 0,0,114,186,0,0,0,114,236,0,0,0,114,220,0,0, 0,114,219,0,0,0,114,224,0,0,0,114,227,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,40,1,0,0,195,4,0,0,115,22,0, + 8,0,0,0,114,40,1,0,0,196,4,0,0,115,22,0, 0,0,8,0,8,1,2,3,10,1,8,8,8,3,8,3, 8,3,8,3,12,3,255,128,114,40,1,0,0,99,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, @@ -2089,7 +2089,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,99,104,101,218,5,105,116,101,109,115,114,133,0,0,0, 114,43,1,0,0,41,2,114,121,0,0,0,218,6,102,105, 110,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,43,1,0,0,241,4,0,0,115,14,0,0, + 0,0,0,114,43,1,0,0,243,4,0,0,115,14,0,0, 0,22,4,8,1,10,1,10,1,10,1,4,252,255,128,122, 28,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,1,0, @@ -2109,7 +2109,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,142,0,0,0,114,122,0,0,0,41,2,114,52,0,0, 0,90,4,104,111,111,107,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,11,95,112,97,116,104,95,104,111, - 111,107,115,251,4,0,0,115,18,0,0,0,16,3,12,1, + 111,107,115,253,4,0,0,115,18,0,0,0,16,3,12,1, 10,1,2,1,14,1,12,1,6,1,4,2,255,128,122,22, 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,0, @@ -2141,7 +2141,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,52,0,0,0,114,47,1,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,20,95,112, 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, - 104,101,8,5,0,0,115,28,0,0,0,8,8,2,1,12, + 104,101,10,5,0,0,115,28,0,0,0,8,8,2,1,12, 1,12,1,8,3,2,1,12,1,4,4,12,253,10,1,12, 1,4,1,2,255,255,128,122,31,80,97,116,104,70,105,110, 100,101,114,46,95,112,97,116,104,95,105,109,112,111,114,116, @@ -2159,7 +2159,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,47,1,0,0,114,144,0,0,0,114,145,0,0,0, 114,191,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,16,95,108,101,103,97,99,121,95,103,101, - 116,95,115,112,101,99,30,5,0,0,115,20,0,0,0,10, + 116,95,115,112,101,99,32,5,0,0,115,20,0,0,0,10, 4,16,1,10,2,4,1,8,1,12,1,12,1,6,1,4, 1,255,128,122,27,80,97,116,104,70,105,110,100,101,114,46, 95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99, @@ -2190,7 +2190,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,97,109,101,115,112,97,99,101,95,112,97,116,104,90,5, 101,110,116,114,121,114,47,1,0,0,114,191,0,0,0,114, 145,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,9,95,103,101,116,95,115,112,101,99,45,5, + 0,0,0,218,9,95,103,101,116,95,115,112,101,99,47,5, 0,0,115,42,0,0,0,4,5,8,1,14,1,2,1,10, 1,8,1,10,1,14,1,12,2,8,1,2,1,10,1,8, 1,6,1,8,1,8,1,12,5,12,2,6,1,4,1,255, @@ -2217,7 +2217,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,185,0,0,0,114,18,1,0,0,41,6,114,202,0,0, 0,114,143,0,0,0,114,52,0,0,0,114,206,0,0,0, 114,191,0,0,0,114,55,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,207,0,0,0,77,5, + 7,0,0,0,114,8,0,0,0,114,207,0,0,0,79,5, 0,0,115,28,0,0,0,8,6,6,1,14,1,8,1,4, 1,10,1,6,1,4,1,6,3,16,1,4,1,4,2,4, 2,255,128,122,20,80,97,116,104,70,105,110,100,101,114,46, @@ -2238,7 +2238,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, 32,32,32,78,114,208,0,0,0,114,209,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,210,0, - 0,0,101,5,0,0,115,10,0,0,0,12,8,8,1,4, + 0,0,103,5,0,0,115,10,0,0,0,12,8,8,1,4, 1,6,1,255,128,122,22,80,97,116,104,70,105,110,100,101, 114,46,102,105,110,100,95,109,111,100,117,108,101,99,0,0, 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, @@ -2269,7 +2269,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,57,1,0,0,218,18,102,105,110,100,95,100,105,115,116, 114,105,98,117,116,105,111,110,115,41,3,114,124,0,0,0, 114,125,0,0,0,114,57,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,58,1,0,0,114,5, + 7,0,0,0,114,8,0,0,0,114,58,1,0,0,116,5, 0,0,115,6,0,0,0,12,10,16,1,255,128,122,29,80, 97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,100, 105,115,116,114,105,98,117,116,105,111,110,115,41,1,78,41, @@ -2279,7 +2279,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,52,1,0,0,114,53,1,0,0,114,56,1,0,0,114, 207,0,0,0,114,210,0,0,0,114,58,1,0,0,114,7, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,42,1,0,0,237,4,0,0,115,38,0,0,0, + 0,0,114,42,1,0,0,239,4,0,0,115,38,0,0,0, 8,0,4,2,2,2,10,1,2,9,10,1,2,12,10,1, 2,21,10,1,2,14,12,1,2,31,12,1,2,23,12,1, 2,12,14,1,255,128,114,42,1,0,0,99,0,0,0,0, @@ -2324,7 +2324,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 14,125,1,124,1,136,0,102,2,86,0,1,0,113,2,100, 0,83,0,114,114,0,0,0,114,7,0,0,0,114,14,1, 0,0,169,1,114,144,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,9,0,0,0,143,5,0,0,115,4,0,0, + 0,0,0,114,9,0,0,0,145,5,0,0,115,4,0,0, 0,22,0,255,128,122,38,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,114,79,0, @@ -2337,7 +2337,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,111,97,100,101,114,95,100,101,116,97,105,108,115,90,7, 108,111,97,100,101,114,115,114,193,0,0,0,114,7,0,0, 0,114,60,1,0,0,114,8,0,0,0,114,216,0,0,0, - 137,5,0,0,115,18,0,0,0,4,4,12,1,26,1,6, + 139,5,0,0,115,18,0,0,0,4,4,12,1,26,1,6, 1,10,2,6,1,8,1,12,1,255,128,122,19,70,105,108, 101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95, 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, @@ -2347,7 +2347,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,111,114,121,32,109,116,105,109,101,46,114,109,0,0,0, 78,41,1,114,62,1,0,0,114,253,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,43,1,0, - 0,151,5,0,0,115,4,0,0,0,10,2,255,128,122,28, + 0,153,5,0,0,115,4,0,0,0,10,2,255,128,122,28, 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,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, @@ -2370,7 +2370,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,207,0,0,0,114,144,0,0,0,114,182,0,0,0,41, 3,114,123,0,0,0,114,143,0,0,0,114,191,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 141,0,0,0,157,5,0,0,115,10,0,0,0,10,7,8, + 141,0,0,0,159,5,0,0,115,10,0,0,0,10,7,8, 1,8,1,16,1,255,128,122,22,70,105,108,101,70,105,110, 100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99, 6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0, @@ -2381,7 +2381,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,143,0,0,0,114,52,0,0,0,90,4,115,109, 115,108,114,206,0,0,0,114,144,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,56,1,0,0, - 169,5,0,0,115,10,0,0,0,10,1,8,1,2,1,6, + 171,5,0,0,115,10,0,0,0,10,1,8,1,2,1,6, 255,255,128,122,20,70,105,108,101,70,105,110,100,101,114,46, 95,103,101,116,95,115,112,101,99,78,99,3,0,0,0,0, 0,0,0,0,0,0,0,14,0,0,0,8,0,0,0,67, @@ -2435,7 +2435,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,90,13,105,110,105,116,95,102,105,108,101,110,97, 109,101,90,9,102,117,108,108,95,112,97,116,104,114,191,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,207,0,0,0,174,5,0,0,115,74,0,0,0,4, + 0,114,207,0,0,0,176,5,0,0,115,74,0,0,0,4, 5,14,1,2,1,24,1,12,1,10,1,10,1,8,1,6, 1,6,2,6,1,10,1,6,2,4,1,8,2,12,1,14, 1,8,1,10,1,8,1,24,1,8,4,14,2,16,1,16, @@ -2467,7 +2467,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 146,2,113,4,83,0,114,7,0,0,0,41,1,114,110,0, 0,0,41,2,114,5,0,0,0,90,2,102,110,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,13,0,0, - 0,251,5,0,0,115,4,0,0,0,20,0,255,128,122,41, + 0,253,5,0,0,115,4,0,0,0,20,0,255,128,122,41, 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,115,101,116,99,111,109,112,62,78,41,18,114,52,0,0, @@ -2484,7 +2484,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,115,114,38,1,0,0,114,121,0,0,0,114,25,1,0, 0,114,15,1,0,0,90,8,110,101,119,95,110,97,109,101, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 67,1,0,0,222,5,0,0,115,38,0,0,0,6,2,2, + 67,1,0,0,224,5,0,0,115,38,0,0,0,6,2,2, 1,22,1,18,1,10,3,12,3,12,1,6,7,8,1,16, 1,4,1,18,1,4,2,12,1,6,1,12,1,20,1,4, 255,255,128,122,22,70,105,108,101,70,105,110,100,101,114,46, @@ -2523,14 +2523,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 169,2,114,202,0,0,0,114,66,1,0,0,114,7,0,0, 0,114,8,0,0,0,218,24,112,97,116,104,95,104,111,111, 107,95,102,111,114,95,70,105,108,101,70,105,110,100,101,114, - 7,6,0,0,115,8,0,0,0,8,2,12,1,16,1,255, + 9,6,0,0,115,8,0,0,0,8,2,12,1,16,1,255, 128,122,54,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,107,95,102,111,114,95,70, 105,108,101,70,105,110,100,101,114,78,114,7,0,0,0,41, 3,114,202,0,0,0,114,66,1,0,0,114,72,1,0,0, 114,7,0,0,0,114,71,1,0,0,114,8,0,0,0,218, - 9,112,97,116,104,95,104,111,111,107,253,5,0,0,115,6, + 9,112,97,116,104,95,104,111,111,107,255,5,0,0,115,6, 0,0,0,14,10,4,6,255,128,122,20,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,0,0,0,0,1,0,0,0, @@ -2539,7 +2539,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,101,70,105,110,100,101,114,40,123,33,114,125,41,41,2, 114,70,0,0,0,114,52,0,0,0,114,253,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,36, - 1,0,0,15,6,0,0,115,4,0,0,0,12,1,255,128, + 1,0,0,17,6,0,0,115,4,0,0,0,12,1,255,128, 122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,114, 101,112,114,95,95,41,1,78,41,15,114,130,0,0,0,114, 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,216, @@ -2547,7 +2547,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,141,0,0,0,114,56,1,0,0,114,207,0,0, 0,114,67,1,0,0,114,214,0,0,0,114,73,1,0,0, 114,36,1,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,59,1,0,0,128,5, + 7,0,0,0,114,8,0,0,0,114,59,1,0,0,130,5, 0,0,115,26,0,0,0,8,0,4,2,8,7,8,14,4, 4,8,2,8,12,10,5,8,48,2,31,10,1,12,17,255, 128,114,59,1,0,0,99,4,0,0,0,0,0,0,0,0, @@ -2571,7 +2571,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,109,101,90,9,99,112,97,116,104,110,97,109,101,114,144, 0,0,0,114,191,0,0,0,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,14,95,102,105,120,95,117,112, - 95,109,111,100,117,108,101,21,6,0,0,115,36,0,0,0, + 95,109,111,100,117,108,101,23,6,0,0,115,36,0,0,0, 10,2,10,1,4,1,4,1,8,1,8,1,12,1,10,2, 4,1,14,1,2,1,8,1,8,1,8,1,14,1,12,1, 8,2,255,128,114,78,1,0,0,99,0,0,0,0,0,0, @@ -2591,7 +2591,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,94,0,0,0,41,3,90,10,101,120,116,101,110,115,105, 111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,116, 101,99,111,100,101,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,188,0,0,0,44,6,0,0,115,10,0, + 8,0,0,0,114,188,0,0,0,46,6,0,0,115,10,0, 0,0,12,5,8,1,8,1,10,1,255,128,114,188,0,0, 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, 0,0,1,0,0,0,67,0,0,0,115,8,0,0,0,124, @@ -2599,7 +2599,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,41,1,218,17,95,98,111,111,116,115,116,114,97, 112,95,109,111,100,117,108,101,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,21,95,115,101,116,95,98,111, - 111,116,115,116,114,97,112,95,109,111,100,117,108,101,55,6, + 111,116,115,116,114,97,112,95,109,111,100,117,108,101,57,6, 0,0,115,4,0,0,0,8,2,255,128,114,81,1,0,0, 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, 0,4,0,0,0,67,0,0,0,115,50,0,0,0,116,0, @@ -2615,7 +2615,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,42,1,0,0,41,2,114,80,1,0,0,90, 17,115,117,112,112,111,114,116,101,100,95,108,111,97,100,101, 114,115,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,8,95,105,110,115,116,97,108,108,60,6,0,0,115, + 0,218,8,95,105,110,115,116,97,108,108,62,6,0,0,115, 10,0,0,0,8,2,6,1,20,1,16,1,255,128,114,83, 1,0,0,41,1,114,68,0,0,0,41,1,78,41,3,78, 78,78,41,2,114,0,0,0,0,114,0,0,0,0,41,1, @@ -2662,7 +2662,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,10,1,8,2,6,2,8,2,16,2,8,71,8,40,8, 19,8,12,8,12,8,31,8,17,8,33,8,28,10,24,10, 13,10,10,8,11,6,14,4,3,2,1,12,255,14,68,14, - 64,16,29,0,127,14,17,18,50,18,45,18,25,14,53,14, - 63,14,42,0,127,14,20,0,127,10,22,8,23,8,11,12, + 64,16,30,0,127,14,17,18,50,18,45,18,25,14,53,14, + 63,14,43,0,127,14,20,0,127,10,22,8,23,8,11,12, 5,255,128, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index 79f9741b770fc6..cf6e8902ddcfd2 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -1,1007 +1,1019 @@ /* Auto-generated by Programs/_freeze_importlib.c */ const unsigned char _Py_M__zipimport[] = { 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,64,0,0,0,115,72,1,0,0,100,0, + 0,4,0,0,0,64,0,0,0,115,80,1,0,0,100,0, 90,0,100,1,100,2,108,1,90,2,100,1,100,3,108,1, 109,3,90,3,109,4,90,4,1,0,100,1,100,2,108,5, 90,6,100,1,100,2,108,7,90,7,100,1,100,2,108,8, 90,8,100,1,100,2,108,9,90,9,100,1,100,2,108,10, - 90,10,100,1,100,2,108,11,90,11,100,4,100,5,103,2, - 90,12,101,2,106,13,90,13,101,2,106,14,100,6,100,2, - 133,2,25,0,90,15,71,0,100,7,100,4,132,0,100,4, - 101,16,131,3,90,17,105,0,90,18,101,19,101,10,131,1, - 90,20,100,8,90,21,100,9,90,22,100,10,90,23,71,0, - 100,11,100,5,132,0,100,5,101,2,106,24,131,3,90,25, - 101,13,100,12,23,0,100,13,100,13,102,3,101,13,100,14, - 23,0,100,15,100,13,102,3,100,16,100,17,102,4,90,26, - 100,18,100,19,132,0,90,27,100,20,100,21,132,0,90,28, - 100,22,100,23,132,0,90,29,100,24,100,25,132,0,90,30, - 100,26,90,31,100,15,97,32,100,27,100,28,132,0,90,33, - 100,29,100,30,132,0,90,34,100,31,100,32,132,0,90,35, - 100,33,100,34,132,0,90,36,101,19,101,36,106,37,131,1, - 90,38,100,35,100,36,132,0,90,39,100,37,100,38,132,0, - 90,40,100,39,100,40,132,0,90,41,100,41,100,42,132,0, - 90,42,100,43,100,44,132,0,90,43,100,45,100,46,132,0, - 90,44,100,2,83,0,41,47,97,80,2,0,0,122,105,112, - 105,109,112,111,114,116,32,112,114,111,118,105,100,101,115,32, - 115,117,112,112,111,114,116,32,102,111,114,32,105,109,112,111, - 114,116,105,110,103,32,80,121,116,104,111,110,32,109,111,100, - 117,108,101,115,32,102,114,111,109,32,90,105,112,32,97,114, - 99,104,105,118,101,115,46,10,10,84,104,105,115,32,109,111, - 100,117,108,101,32,101,120,112,111,114,116,115,32,116,104,114, - 101,101,32,111,98,106,101,99,116,115,58,10,45,32,122,105, - 112,105,109,112,111,114,116,101,114,58,32,97,32,99,108,97, - 115,115,59,32,105,116,115,32,99,111,110,115,116,114,117,99, - 116,111,114,32,116,97,107,101,115,32,97,32,112,97,116,104, - 32,116,111,32,97,32,90,105,112,32,97,114,99,104,105,118, - 101,46,10,45,32,90,105,112,73,109,112,111,114,116,69,114, - 114,111,114,58,32,101,120,99,101,112,116,105,111,110,32,114, - 97,105,115,101,100,32,98,121,32,122,105,112,105,109,112,111, - 114,116,101,114,32,111,98,106,101,99,116,115,46,32,73,116, - 39,115,32,97,10,32,32,115,117,98,99,108,97,115,115,32, - 111,102,32,73,109,112,111,114,116,69,114,114,111,114,44,32, - 115,111,32,105,116,32,99,97,110,32,98,101,32,99,97,117, - 103,104,116,32,97,115,32,73,109,112,111,114,116,69,114,114, - 111,114,44,32,116,111,111,46,10,45,32,95,122,105,112,95, - 100,105,114,101,99,116,111,114,121,95,99,97,99,104,101,58, - 32,97,32,100,105,99,116,44,32,109,97,112,112,105,110,103, - 32,97,114,99,104,105,118,101,32,112,97,116,104,115,32,116, - 111,32,122,105,112,32,100,105,114,101,99,116,111,114,121,10, - 32,32,105,110,102,111,32,100,105,99,116,115,44,32,97,115, - 32,117,115,101,100,32,105,110,32,122,105,112,105,109,112,111, - 114,116,101,114,46,95,102,105,108,101,115,46,10,10,73,116, - 32,105,115,32,117,115,117,97,108,108,121,32,110,111,116,32, - 110,101,101,100,101,100,32,116,111,32,117,115,101,32,116,104, - 101,32,122,105,112,105,109,112,111,114,116,32,109,111,100,117, - 108,101,32,101,120,112,108,105,99,105,116,108,121,59,32,105, - 116,32,105,115,10,117,115,101,100,32,98,121,32,116,104,101, - 32,98,117,105,108,116,105,110,32,105,109,112,111,114,116,32, - 109,101,99,104,97,110,105,115,109,32,102,111,114,32,115,121, - 115,46,112,97,116,104,32,105,116,101,109,115,32,116,104,97, - 116,32,97,114,101,32,112,97,116,104,115,10,116,111,32,90, - 105,112,32,97,114,99,104,105,118,101,115,46,10,233,0,0, - 0,0,78,41,2,218,14,95,117,110,112,97,99,107,95,117, - 105,110,116,49,54,218,14,95,117,110,112,97,99,107,95,117, - 105,110,116,51,50,218,14,90,105,112,73,109,112,111,114,116, - 69,114,114,111,114,218,11,122,105,112,105,109,112,111,114,116, - 101,114,233,1,0,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,64,0,0,0, - 115,12,0,0,0,101,0,90,1,100,0,90,2,100,1,83, - 0,41,2,114,3,0,0,0,78,41,3,218,8,95,95,110, - 97,109,101,95,95,218,10,95,95,109,111,100,117,108,101,95, - 95,218,12,95,95,113,117,97,108,110,97,109,101,95,95,169, - 0,114,9,0,0,0,114,9,0,0,0,250,18,60,102,114, - 111,122,101,110,32,122,105,112,105,109,112,111,114,116,62,114, - 3,0,0,0,33,0,0,0,115,6,0,0,0,8,0,4, - 1,255,128,233,22,0,0,0,115,4,0,0,0,80,75,5, - 6,105,255,255,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, - 118,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,27,100,5,100,6,132,1, - 90,5,100,28,100,7,100,8,132,1,90,6,100,29,100,9, - 100,10,132,1,90,7,100,11,100,12,132,0,90,8,100,13, - 100,14,132,0,90,9,100,15,100,16,132,0,90,10,100,17, - 100,18,132,0,90,11,100,19,100,20,132,0,90,12,100,21, - 100,22,132,0,90,13,100,23,100,24,132,0,90,14,100,25, - 100,26,132,0,90,15,100,4,83,0,41,30,114,4,0,0, - 0,97,255,1,0,0,122,105,112,105,109,112,111,114,116,101, - 114,40,97,114,99,104,105,118,101,112,97,116,104,41,32,45, - 62,32,122,105,112,105,109,112,111,114,116,101,114,32,111,98, - 106,101,99,116,10,10,32,32,32,32,67,114,101,97,116,101, - 32,97,32,110,101,119,32,122,105,112,105,109,112,111,114,116, - 101,114,32,105,110,115,116,97,110,99,101,46,32,39,97,114, - 99,104,105,118,101,112,97,116,104,39,32,109,117,115,116,32, - 98,101,32,97,32,112,97,116,104,32,116,111,10,32,32,32, - 32,97,32,122,105,112,102,105,108,101,44,32,111,114,32,116, - 111,32,97,32,115,112,101,99,105,102,105,99,32,112,97,116, - 104,32,105,110,115,105,100,101,32,97,32,122,105,112,102,105, - 108,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44, - 32,105,116,32,99,97,110,32,98,101,10,32,32,32,32,39, + 90,10,100,1,100,2,108,11,90,11,100,1,100,2,108,12, + 90,12,100,4,100,5,103,2,90,13,101,2,106,14,90,14, + 101,2,106,15,100,6,100,2,133,2,25,0,90,16,71,0, + 100,7,100,4,132,0,100,4,101,17,131,3,90,18,105,0, + 90,19,101,20,101,10,131,1,90,21,100,8,90,22,100,9, + 90,23,100,10,90,24,71,0,100,11,100,5,132,0,100,5, + 101,2,106,25,131,3,90,26,101,14,100,12,23,0,100,13, + 100,13,102,3,101,14,100,14,23,0,100,15,100,13,102,3, + 100,16,100,17,102,4,90,27,100,18,100,19,132,0,90,28, + 100,20,100,21,132,0,90,29,100,22,100,23,132,0,90,30, + 100,24,100,25,132,0,90,31,100,26,90,32,100,15,97,33, + 100,27,100,28,132,0,90,34,100,29,100,30,132,0,90,35, + 100,31,100,32,132,0,90,36,100,33,100,34,132,0,90,37, + 101,20,101,37,106,38,131,1,90,39,100,35,100,36,132,0, + 90,40,100,37,100,38,132,0,90,41,100,39,100,40,132,0, + 90,42,100,41,100,42,132,0,90,43,100,43,100,44,132,0, + 90,44,100,45,100,46,132,0,90,45,100,2,83,0,41,47, + 97,80,2,0,0,122,105,112,105,109,112,111,114,116,32,112, + 114,111,118,105,100,101,115,32,115,117,112,112,111,114,116,32, + 102,111,114,32,105,109,112,111,114,116,105,110,103,32,80,121, + 116,104,111,110,32,109,111,100,117,108,101,115,32,102,114,111, + 109,32,90,105,112,32,97,114,99,104,105,118,101,115,46,10, + 10,84,104,105,115,32,109,111,100,117,108,101,32,101,120,112, + 111,114,116,115,32,116,104,114,101,101,32,111,98,106,101,99, + 116,115,58,10,45,32,122,105,112,105,109,112,111,114,116,101, + 114,58,32,97,32,99,108,97,115,115,59,32,105,116,115,32, + 99,111,110,115,116,114,117,99,116,111,114,32,116,97,107,101, + 115,32,97,32,112,97,116,104,32,116,111,32,97,32,90,105, + 112,32,97,114,99,104,105,118,101,46,10,45,32,90,105,112, + 73,109,112,111,114,116,69,114,114,111,114,58,32,101,120,99, + 101,112,116,105,111,110,32,114,97,105,115,101,100,32,98,121, + 32,122,105,112,105,109,112,111,114,116,101,114,32,111,98,106, + 101,99,116,115,46,32,73,116,39,115,32,97,10,32,32,115, + 117,98,99,108,97,115,115,32,111,102,32,73,109,112,111,114, + 116,69,114,114,111,114,44,32,115,111,32,105,116,32,99,97, + 110,32,98,101,32,99,97,117,103,104,116,32,97,115,32,73, + 109,112,111,114,116,69,114,114,111,114,44,32,116,111,111,46, + 10,45,32,95,122,105,112,95,100,105,114,101,99,116,111,114, + 121,95,99,97,99,104,101,58,32,97,32,100,105,99,116,44, + 32,109,97,112,112,105,110,103,32,97,114,99,104,105,118,101, + 32,112,97,116,104,115,32,116,111,32,122,105,112,32,100,105, + 114,101,99,116,111,114,121,10,32,32,105,110,102,111,32,100, + 105,99,116,115,44,32,97,115,32,117,115,101,100,32,105,110, + 32,122,105,112,105,109,112,111,114,116,101,114,46,95,102,105, + 108,101,115,46,10,10,73,116,32,105,115,32,117,115,117,97, + 108,108,121,32,110,111,116,32,110,101,101,100,101,100,32,116, + 111,32,117,115,101,32,116,104,101,32,122,105,112,105,109,112, + 111,114,116,32,109,111,100,117,108,101,32,101,120,112,108,105, + 99,105,116,108,121,59,32,105,116,32,105,115,10,117,115,101, + 100,32,98,121,32,116,104,101,32,98,117,105,108,116,105,110, + 32,105,109,112,111,114,116,32,109,101,99,104,97,110,105,115, + 109,32,102,111,114,32,115,121,115,46,112,97,116,104,32,105, + 116,101,109,115,32,116,104,97,116,32,97,114,101,32,112,97, + 116,104,115,10,116,111,32,90,105,112,32,97,114,99,104,105, + 118,101,115,46,10,233,0,0,0,0,78,41,2,218,14,95, + 117,110,112,97,99,107,95,117,105,110,116,49,54,218,14,95, + 117,110,112,97,99,107,95,117,105,110,116,51,50,218,14,90, + 105,112,73,109,112,111,114,116,69,114,114,111,114,218,11,122, + 105,112,105,109,112,111,114,116,101,114,233,1,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,64,0,0,0,115,12,0,0,0,101,0,90, + 1,100,0,90,2,100,1,83,0,41,2,114,3,0,0,0, + 78,41,3,218,8,95,95,110,97,109,101,95,95,218,10,95, + 95,109,111,100,117,108,101,95,95,218,12,95,95,113,117,97, + 108,110,97,109,101,95,95,169,0,114,9,0,0,0,114,9, + 0,0,0,250,18,60,102,114,111,122,101,110,32,122,105,112, + 105,109,112,111,114,116,62,114,3,0,0,0,34,0,0,0, + 115,6,0,0,0,8,0,4,1,255,128,233,22,0,0,0, + 115,4,0,0,0,80,75,5,6,105,255,255,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,64,0,0,0,115,118,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,27,100,5,100,6,132,1,90,5,100,28,100,7,100,8, + 132,1,90,6,100,29,100,9,100,10,132,1,90,7,100,11, + 100,12,132,0,90,8,100,13,100,14,132,0,90,9,100,15, + 100,16,132,0,90,10,100,17,100,18,132,0,90,11,100,19, + 100,20,132,0,90,12,100,21,100,22,132,0,90,13,100,23, + 100,24,132,0,90,14,100,25,100,26,132,0,90,15,100,4, + 83,0,41,30,114,4,0,0,0,97,255,1,0,0,122,105, + 112,105,109,112,111,114,116,101,114,40,97,114,99,104,105,118, + 101,112,97,116,104,41,32,45,62,32,122,105,112,105,109,112, + 111,114,116,101,114,32,111,98,106,101,99,116,10,10,32,32, + 32,32,67,114,101,97,116,101,32,97,32,110,101,119,32,122, + 105,112,105,109,112,111,114,116,101,114,32,105,110,115,116,97, + 110,99,101,46,32,39,97,114,99,104,105,118,101,112,97,116, + 104,39,32,109,117,115,116,32,98,101,32,97,32,112,97,116, + 104,32,116,111,10,32,32,32,32,97,32,122,105,112,102,105, + 108,101,44,32,111,114,32,116,111,32,97,32,115,112,101,99, + 105,102,105,99,32,112,97,116,104,32,105,110,115,105,100,101, + 32,97,32,122,105,112,102,105,108,101,46,32,70,111,114,32, + 101,120,97,109,112,108,101,44,32,105,116,32,99,97,110,32, + 98,101,10,32,32,32,32,39,47,116,109,112,47,109,121,105, + 109,112,111,114,116,46,122,105,112,39,44,32,111,114,32,39, 47,116,109,112,47,109,121,105,109,112,111,114,116,46,122,105, - 112,39,44,32,111,114,32,39,47,116,109,112,47,109,121,105, - 109,112,111,114,116,46,122,105,112,47,109,121,100,105,114,101, - 99,116,111,114,121,39,44,32,105,102,32,109,121,100,105,114, - 101,99,116,111,114,121,32,105,115,32,97,10,32,32,32,32, - 118,97,108,105,100,32,100,105,114,101,99,116,111,114,121,32, - 105,110,115,105,100,101,32,116,104,101,32,97,114,99,104,105, - 118,101,46,10,10,32,32,32,32,39,90,105,112,73,109,112, - 111,114,116,69,114,114,111,114,32,105,115,32,114,97,105,115, - 101,100,32,105,102,32,39,97,114,99,104,105,118,101,112,97, - 116,104,39,32,100,111,101,115,110,39,116,32,112,111,105,110, - 116,32,116,111,32,97,32,118,97,108,105,100,32,90,105,112, - 10,32,32,32,32,97,114,99,104,105,118,101,46,10,10,32, - 32,32,32,84,104,101,32,39,97,114,99,104,105,118,101,39, - 32,97,116,116,114,105,98,117,116,101,32,111,102,32,122,105, - 112,105,109,112,111,114,116,101,114,32,111,98,106,101,99,116, - 115,32,99,111,110,116,97,105,110,115,32,116,104,101,32,110, - 97,109,101,32,111,102,32,116,104,101,10,32,32,32,32,122, - 105,112,102,105,108,101,32,116,97,114,103,101,116,101,100,46, - 10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0, - 0,0,8,0,0,0,9,0,0,0,67,0,0,0,115,32, - 1,0,0,116,0,124,1,116,1,131,2,115,28,100,1,100, - 0,108,2,125,2,124,2,160,3,124,1,161,1,125,1,124, - 1,115,44,116,4,100,2,124,1,100,3,141,2,130,1,116, - 5,114,60,124,1,160,6,116,5,116,7,161,2,125,1,103, - 0,125,3,122,14,116,8,160,9,124,1,161,1,125,4,87, - 0,110,70,4,0,116,10,116,11,102,2,121,148,1,0,1, - 0,1,0,116,8,160,12,124,1,161,1,92,2,125,5,125, - 6,124,5,124,1,107,2,114,130,116,4,100,4,124,1,100, - 3,141,2,130,1,124,5,125,1,124,3,160,13,124,6,161, - 1,1,0,89,0,113,64,48,0,124,4,106,14,100,5,64, - 0,100,6,107,3,114,176,116,4,100,4,124,1,100,3,141, - 2,130,1,122,12,116,15,124,1,25,0,125,7,87,0,110, - 34,4,0,116,16,121,222,1,0,1,0,1,0,116,17,124, - 1,131,1,125,7,124,7,116,15,124,1,60,0,89,0,110, - 2,48,0,124,7,124,0,95,18,124,1,124,0,95,19,116, - 8,106,20,124,3,100,0,100,0,100,7,133,3,25,0,142, - 0,124,0,95,21,124,0,106,21,144,1,114,28,124,0,4, - 0,106,21,116,7,55,0,2,0,95,21,100,0,83,0,100, - 0,83,0,41,8,78,114,0,0,0,0,122,21,97,114,99, - 104,105,118,101,32,112,97,116,104,32,105,115,32,101,109,112, - 116,121,169,1,218,4,112,97,116,104,122,14,110,111,116,32, - 97,32,90,105,112,32,102,105,108,101,105,0,240,0,0,105, - 0,128,0,0,233,255,255,255,255,41,22,218,10,105,115,105, - 110,115,116,97,110,99,101,218,3,115,116,114,218,2,111,115, - 90,8,102,115,100,101,99,111,100,101,114,3,0,0,0,218, - 12,97,108,116,95,112,97,116,104,95,115,101,112,218,7,114, - 101,112,108,97,99,101,218,8,112,97,116,104,95,115,101,112, - 218,19,95,98,111,111,116,115,116,114,97,112,95,101,120,116, - 101,114,110,97,108,90,10,95,112,97,116,104,95,115,116,97, - 116,218,7,79,83,69,114,114,111,114,218,10,86,97,108,117, - 101,69,114,114,111,114,90,11,95,112,97,116,104,95,115,112, - 108,105,116,218,6,97,112,112,101,110,100,90,7,115,116,95, - 109,111,100,101,218,20,95,122,105,112,95,100,105,114,101,99, - 116,111,114,121,95,99,97,99,104,101,218,8,75,101,121,69, - 114,114,111,114,218,15,95,114,101,97,100,95,100,105,114,101, - 99,116,111,114,121,218,6,95,102,105,108,101,115,218,7,97, - 114,99,104,105,118,101,218,10,95,112,97,116,104,95,106,111, - 105,110,218,6,112,114,101,102,105,120,41,8,218,4,115,101, - 108,102,114,13,0,0,0,114,17,0,0,0,114,31,0,0, - 0,90,2,115,116,90,7,100,105,114,110,97,109,101,90,8, - 98,97,115,101,110,97,109,101,218,5,102,105,108,101,115,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, - 95,95,105,110,105,116,95,95,63,0,0,0,115,60,0,0, - 0,10,1,8,1,10,1,4,1,12,1,4,1,12,1,4, - 2,2,2,14,1,16,1,14,3,8,1,12,1,4,1,16, - 1,14,3,12,2,2,3,12,1,12,1,8,1,14,1,6, - 1,6,1,22,2,8,1,18,1,4,255,255,128,122,20,122, - 105,112,105,109,112,111,114,116,101,114,46,95,95,105,110,105, - 116,95,95,78,99,3,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,4,0,0,0,67,0,0,0,115,78,0, - 0,0,116,0,124,0,124,1,131,2,125,3,124,3,100,1, - 117,1,114,26,124,0,103,0,102,2,83,0,116,1,124,0, - 124,1,131,2,125,4,116,2,124,0,124,4,131,2,114,70, - 100,1,124,0,106,3,155,0,116,4,155,0,124,4,155,0, - 157,3,103,1,102,2,83,0,100,1,103,0,102,2,83,0, - 41,2,97,47,2,0,0,102,105,110,100,95,108,111,97,100, - 101,114,40,102,117,108,108,110,97,109,101,44,32,112,97,116, - 104,61,78,111,110,101,41,32,45,62,32,115,101,108,102,44, - 32,115,116,114,32,111,114,32,78,111,110,101,46,10,10,32, - 32,32,32,32,32,32,32,83,101,97,114,99,104,32,102,111, - 114,32,97,32,109,111,100,117,108,101,32,115,112,101,99,105, - 102,105,101,100,32,98,121,32,39,102,117,108,108,110,97,109, - 101,39,46,32,39,102,117,108,108,110,97,109,101,39,32,109, - 117,115,116,32,98,101,32,116,104,101,10,32,32,32,32,32, - 32,32,32,102,117,108,108,121,32,113,117,97,108,105,102,105, - 101,100,32,40,100,111,116,116,101,100,41,32,109,111,100,117, - 108,101,32,110,97,109,101,46,32,73,116,32,114,101,116,117, - 114,110,115,32,116,104,101,32,122,105,112,105,109,112,111,114, - 116,101,114,10,32,32,32,32,32,32,32,32,105,110,115,116, - 97,110,99,101,32,105,116,115,101,108,102,32,105,102,32,116, - 104,101,32,109,111,100,117,108,101,32,119,97,115,32,102,111, - 117,110,100,44,32,97,32,115,116,114,105,110,103,32,99,111, - 110,116,97,105,110,105,110,103,32,116,104,101,10,32,32,32, - 32,32,32,32,32,102,117,108,108,32,112,97,116,104,32,110, - 97,109,101,32,105,102,32,105,116,39,115,32,112,111,115,115, - 105,98,108,121,32,97,32,112,111,114,116,105,111,110,32,111, - 102,32,97,32,110,97,109,101,115,112,97,99,101,32,112,97, - 99,107,97,103,101,44,10,32,32,32,32,32,32,32,32,111, - 114,32,78,111,110,101,32,111,116,104,101,114,119,105,115,101, - 46,32,84,104,101,32,111,112,116,105,111,110,97,108,32,39, - 112,97,116,104,39,32,97,114,103,117,109,101,110,116,32,105, - 115,32,105,103,110,111,114,101,100,32,45,45,32,105,116,39, - 115,10,32,32,32,32,32,32,32,32,116,104,101,114,101,32, - 102,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116, - 121,32,119,105,116,104,32,116,104,101,32,105,109,112,111,114, - 116,101,114,32,112,114,111,116,111,99,111,108,46,10,10,32, - 32,32,32,32,32,32,32,68,101,112,114,101,99,97,116,101, - 100,32,115,105,110,99,101,32,80,121,116,104,111,110,32,51, - 46,49,48,46,32,85,115,101,32,102,105,110,100,95,115,112, - 101,99,40,41,32,105,110,115,116,101,97,100,46,10,32,32, - 32,32,32,32,32,32,78,41,5,218,16,95,103,101,116,95, - 109,111,100,117,108,101,95,105,110,102,111,218,16,95,103,101, - 116,95,109,111,100,117,108,101,95,112,97,116,104,218,7,95, - 105,115,95,100,105,114,114,29,0,0,0,114,20,0,0,0, - 41,5,114,32,0,0,0,218,8,102,117,108,108,110,97,109, - 101,114,13,0,0,0,218,2,109,105,218,7,109,111,100,112, - 97,116,104,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,11,102,105,110,100,95,108,111,97,100,101,114,109, - 0,0,0,115,16,0,0,0,10,12,8,1,8,2,10,7, - 10,1,24,4,8,2,255,128,122,23,122,105,112,105,109,112, - 111,114,116,101,114,46,102,105,110,100,95,108,111,97,100,101, - 114,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,4,0,0,0,67,0,0,0,115,16,0,0,0,124, - 0,160,0,124,1,124,2,161,2,100,1,25,0,83,0,41, - 3,97,203,1,0,0,102,105,110,100,95,109,111,100,117,108, - 101,40,102,117,108,108,110,97,109,101,44,32,112,97,116,104, - 61,78,111,110,101,41,32,45,62,32,115,101,108,102,32,111, - 114,32,78,111,110,101,46,10,10,32,32,32,32,32,32,32, - 32,83,101,97,114,99,104,32,102,111,114,32,97,32,109,111, - 100,117,108,101,32,115,112,101,99,105,102,105,101,100,32,98, - 121,32,39,102,117,108,108,110,97,109,101,39,46,32,39,102, - 117,108,108,110,97,109,101,39,32,109,117,115,116,32,98,101, + 112,47,109,121,100,105,114,101,99,116,111,114,121,39,44,32, + 105,102,32,109,121,100,105,114,101,99,116,111,114,121,32,105, + 115,32,97,10,32,32,32,32,118,97,108,105,100,32,100,105, + 114,101,99,116,111,114,121,32,105,110,115,105,100,101,32,116, + 104,101,32,97,114,99,104,105,118,101,46,10,10,32,32,32, + 32,39,90,105,112,73,109,112,111,114,116,69,114,114,111,114, + 32,105,115,32,114,97,105,115,101,100,32,105,102,32,39,97, + 114,99,104,105,118,101,112,97,116,104,39,32,100,111,101,115, + 110,39,116,32,112,111,105,110,116,32,116,111,32,97,32,118, + 97,108,105,100,32,90,105,112,10,32,32,32,32,97,114,99, + 104,105,118,101,46,10,10,32,32,32,32,84,104,101,32,39, + 97,114,99,104,105,118,101,39,32,97,116,116,114,105,98,117, + 116,101,32,111,102,32,122,105,112,105,109,112,111,114,116,101, + 114,32,111,98,106,101,99,116,115,32,99,111,110,116,97,105, + 110,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116, + 104,101,10,32,32,32,32,122,105,112,102,105,108,101,32,116, + 97,114,103,101,116,101,100,46,10,32,32,32,32,99,2,0, + 0,0,0,0,0,0,0,0,0,0,8,0,0,0,9,0, + 0,0,67,0,0,0,115,32,1,0,0,116,0,124,1,116, + 1,131,2,115,28,100,1,100,0,108,2,125,2,124,2,160, + 3,124,1,161,1,125,1,124,1,115,44,116,4,100,2,124, + 1,100,3,141,2,130,1,116,5,114,60,124,1,160,6,116, + 5,116,7,161,2,125,1,103,0,125,3,122,14,116,8,160, + 9,124,1,161,1,125,4,87,0,110,70,4,0,116,10,116, + 11,102,2,121,148,1,0,1,0,1,0,116,8,160,12,124, + 1,161,1,92,2,125,5,125,6,124,5,124,1,107,2,114, + 130,116,4,100,4,124,1,100,3,141,2,130,1,124,5,125, + 1,124,3,160,13,124,6,161,1,1,0,89,0,113,64,48, + 0,124,4,106,14,100,5,64,0,100,6,107,3,114,176,116, + 4,100,4,124,1,100,3,141,2,130,1,122,12,116,15,124, + 1,25,0,125,7,87,0,110,34,4,0,116,16,121,222,1, + 0,1,0,1,0,116,17,124,1,131,1,125,7,124,7,116, + 15,124,1,60,0,89,0,110,2,48,0,124,7,124,0,95, + 18,124,1,124,0,95,19,116,8,106,20,124,3,100,0,100, + 0,100,7,133,3,25,0,142,0,124,0,95,21,124,0,106, + 21,144,1,114,28,124,0,4,0,106,21,116,7,55,0,2, + 0,95,21,100,0,83,0,100,0,83,0,41,8,78,114,0, + 0,0,0,122,21,97,114,99,104,105,118,101,32,112,97,116, + 104,32,105,115,32,101,109,112,116,121,169,1,218,4,112,97, + 116,104,122,14,110,111,116,32,97,32,90,105,112,32,102,105, + 108,101,105,0,240,0,0,105,0,128,0,0,233,255,255,255, + 255,41,22,218,10,105,115,105,110,115,116,97,110,99,101,218, + 3,115,116,114,218,2,111,115,90,8,102,115,100,101,99,111, + 100,101,114,3,0,0,0,218,12,97,108,116,95,112,97,116, + 104,95,115,101,112,218,7,114,101,112,108,97,99,101,218,8, + 112,97,116,104,95,115,101,112,218,19,95,98,111,111,116,115, + 116,114,97,112,95,101,120,116,101,114,110,97,108,90,10,95, + 112,97,116,104,95,115,116,97,116,218,7,79,83,69,114,114, + 111,114,218,10,86,97,108,117,101,69,114,114,111,114,90,11, + 95,112,97,116,104,95,115,112,108,105,116,218,6,97,112,112, + 101,110,100,90,7,115,116,95,109,111,100,101,218,20,95,122, + 105,112,95,100,105,114,101,99,116,111,114,121,95,99,97,99, + 104,101,218,8,75,101,121,69,114,114,111,114,218,15,95,114, + 101,97,100,95,100,105,114,101,99,116,111,114,121,218,6,95, + 102,105,108,101,115,218,7,97,114,99,104,105,118,101,218,10, + 95,112,97,116,104,95,106,111,105,110,218,6,112,114,101,102, + 105,120,41,8,218,4,115,101,108,102,114,13,0,0,0,114, + 17,0,0,0,114,31,0,0,0,90,2,115,116,90,7,100, + 105,114,110,97,109,101,90,8,98,97,115,101,110,97,109,101, + 218,5,102,105,108,101,115,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,8,95,95,105,110,105,116,95,95, + 64,0,0,0,115,60,0,0,0,10,1,8,1,10,1,4, + 1,12,1,4,1,12,1,4,2,2,2,14,1,16,1,14, + 3,8,1,12,1,4,1,16,1,14,3,12,2,2,3,12, + 1,12,1,8,1,14,1,6,1,6,1,22,2,8,1,18, + 1,4,255,255,128,122,20,122,105,112,105,109,112,111,114,116, + 101,114,46,95,95,105,110,105,116,95,95,78,99,3,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,4,0,0, + 0,67,0,0,0,115,78,0,0,0,116,0,124,0,124,1, + 131,2,125,3,124,3,100,1,117,1,114,26,124,0,103,0, + 102,2,83,0,116,1,124,0,124,1,131,2,125,4,116,2, + 124,0,124,4,131,2,114,70,100,1,124,0,106,3,155,0, + 116,4,155,0,124,4,155,0,157,3,103,1,102,2,83,0, + 100,1,103,0,102,2,83,0,41,2,97,47,2,0,0,102, + 105,110,100,95,108,111,97,100,101,114,40,102,117,108,108,110, + 97,109,101,44,32,112,97,116,104,61,78,111,110,101,41,32, + 45,62,32,115,101,108,102,44,32,115,116,114,32,111,114,32, + 78,111,110,101,46,10,10,32,32,32,32,32,32,32,32,83, + 101,97,114,99,104,32,102,111,114,32,97,32,109,111,100,117, + 108,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32, + 39,102,117,108,108,110,97,109,101,39,46,32,39,102,117,108, + 108,110,97,109,101,39,32,109,117,115,116,32,98,101,32,116, + 104,101,10,32,32,32,32,32,32,32,32,102,117,108,108,121, + 32,113,117,97,108,105,102,105,101,100,32,40,100,111,116,116, + 101,100,41,32,109,111,100,117,108,101,32,110,97,109,101,46, + 32,73,116,32,114,101,116,117,114,110,115,32,116,104,101,32, + 122,105,112,105,109,112,111,114,116,101,114,10,32,32,32,32, + 32,32,32,32,105,110,115,116,97,110,99,101,32,105,116,115, + 101,108,102,32,105,102,32,116,104,101,32,109,111,100,117,108, + 101,32,119,97,115,32,102,111,117,110,100,44,32,97,32,115, + 116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103, 32,116,104,101,10,32,32,32,32,32,32,32,32,102,117,108, - 108,121,32,113,117,97,108,105,102,105,101,100,32,40,100,111, - 116,116,101,100,41,32,109,111,100,117,108,101,32,110,97,109, - 101,46,32,73,116,32,114,101,116,117,114,110,115,32,116,104, - 101,32,122,105,112,105,109,112,111,114,116,101,114,10,32,32, - 32,32,32,32,32,32,105,110,115,116,97,110,99,101,32,105, - 116,115,101,108,102,32,105,102,32,116,104,101,32,109,111,100, - 117,108,101,32,119,97,115,32,102,111,117,110,100,44,32,111, - 114,32,78,111,110,101,32,105,102,32,105,116,32,119,97,115, - 110,39,116,46,10,32,32,32,32,32,32,32,32,84,104,101, - 32,111,112,116,105,111,110,97,108,32,39,112,97,116,104,39, - 32,97,114,103,117,109,101,110,116,32,105,115,32,105,103,110, - 111,114,101,100,32,45,45,32,105,116,39,115,32,116,104,101, - 114,101,32,102,111,114,32,99,111,109,112,97,116,105,98,105, - 108,105,116,121,10,32,32,32,32,32,32,32,32,119,105,116, - 104,32,116,104,101,32,105,109,112,111,114,116,101,114,32,112, - 114,111,116,111,99,111,108,46,10,10,32,32,32,32,32,32, - 32,32,68,101,112,114,101,99,97,116,101,100,32,115,105,110, - 99,101,32,80,121,116,104,111,110,32,51,46,49,48,46,32, - 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, - 105,110,115,116,101,97,100,46,10,32,32,32,32,32,32,32, - 32,114,0,0,0,0,78,41,1,114,41,0,0,0,41,3, - 114,32,0,0,0,114,38,0,0,0,114,13,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,11, - 102,105,110,100,95,109,111,100,117,108,101,143,0,0,0,115, - 4,0,0,0,16,11,255,128,122,23,122,105,112,105,109,112, - 111,114,116,101,114,46,102,105,110,100,95,109,111,100,117,108, - 101,99,3,0,0,0,0,0,0,0,0,0,0,0,7,0, - 0,0,5,0,0,0,67,0,0,0,115,108,0,0,0,116, - 0,124,0,124,1,131,2,125,3,124,3,100,1,117,1,114, - 34,116,1,106,2,124,1,124,0,124,3,100,2,141,3,83, - 0,116,3,124,0,124,1,131,2,125,4,116,4,124,0,124, - 4,131,2,114,104,124,0,106,5,155,0,116,6,155,0,124, - 4,155,0,157,3,125,5,116,1,106,7,124,1,100,1,100, - 3,100,4,141,3,125,6,124,6,106,8,160,9,124,5,161, - 1,1,0,124,6,83,0,100,1,83,0,41,5,122,107,67, - 114,101,97,116,101,32,97,32,77,111,100,117,108,101,83,112, - 101,99,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,46,10,10,32,32, - 32,32,32,32,32,32,82,101,116,117,114,110,115,32,78,111, - 110,101,32,105,102,32,116,104,101,32,109,111,100,117,108,101, - 32,99,97,110,110,111,116,32,98,101,32,102,111,117,110,100, - 46,10,32,32,32,32,32,32,32,32,78,41,1,218,10,105, - 115,95,112,97,99,107,97,103,101,84,41,3,218,4,110,97, - 109,101,90,6,108,111,97,100,101,114,114,43,0,0,0,41, - 10,114,35,0,0,0,218,10,95,98,111,111,116,115,116,114, - 97,112,90,16,115,112,101,99,95,102,114,111,109,95,108,111, - 97,100,101,114,114,36,0,0,0,114,37,0,0,0,114,29, - 0,0,0,114,20,0,0,0,90,10,77,111,100,117,108,101, - 83,112,101,99,90,26,115,117,98,109,111,100,117,108,101,95, - 115,101,97,114,99,104,95,108,111,99,97,116,105,111,110,115, - 114,24,0,0,0,41,7,114,32,0,0,0,114,38,0,0, - 0,90,6,116,97,114,103,101,116,90,11,109,111,100,117,108, - 101,95,105,110,102,111,114,40,0,0,0,114,13,0,0,0, - 90,4,115,112,101,99,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,9,102,105,110,100,95,115,112,101,99, - 156,0,0,0,115,26,0,0,0,10,5,8,1,16,1,10, - 7,10,1,18,4,8,1,2,1,6,255,12,2,4,1,4, - 2,255,128,122,21,122,105,112,105,109,112,111,114,116,101,114, - 46,102,105,110,100,95,115,112,101,99,99,2,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,67, - 0,0,0,115,20,0,0,0,116,0,124,0,124,1,131,2, - 92,3,125,2,125,3,125,4,124,2,83,0,41,2,122,163, - 103,101,116,95,99,111,100,101,40,102,117,108,108,110,97,109, - 101,41,32,45,62,32,99,111,100,101,32,111,98,106,101,99, - 116,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, - 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101, - 99,116,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,46,32,82,97,105, - 115,101,32,90,105,112,73,109,112,111,114,116,69,114,114,111, - 114,10,32,32,32,32,32,32,32,32,105,102,32,116,104,101, - 32,109,111,100,117,108,101,32,99,111,117,108,100,110,39,116, - 32,98,101,32,102,111,117,110,100,46,10,32,32,32,32,32, - 32,32,32,78,169,1,218,16,95,103,101,116,95,109,111,100, - 117,108,101,95,99,111,100,101,169,5,114,32,0,0,0,114, - 38,0,0,0,218,4,99,111,100,101,218,9,105,115,112,97, - 99,107,97,103,101,114,40,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,8,103,101,116,95,99, - 111,100,101,183,0,0,0,115,6,0,0,0,16,6,4,1, - 255,128,122,20,122,105,112,105,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,0,0,0,0,4,0,0,0,8,0,0,0,67,0,0, - 0,115,112,0,0,0,116,0,114,16,124,1,160,1,116,0, - 116,2,161,2,125,1,124,1,125,2,124,1,160,3,124,0, - 106,4,116,2,23,0,161,1,114,58,124,1,116,5,124,0, - 106,4,116,2,23,0,131,1,100,1,133,2,25,0,125,2, - 122,14,124,0,106,6,124,2,25,0,125,3,87,0,110,26, - 4,0,116,7,121,98,1,0,1,0,1,0,116,8,100,2, - 100,3,124,2,131,3,130,1,48,0,116,9,124,0,106,4, - 124,3,131,2,83,0,41,4,122,154,103,101,116,95,100,97, - 116,97,40,112,97,116,104,110,97,109,101,41,32,45,62,32, - 115,116,114,105,110,103,32,119,105,116,104,32,102,105,108,101, - 32,100,97,116,97,46,10,10,32,32,32,32,32,32,32,32, - 82,101,116,117,114,110,32,116,104,101,32,100,97,116,97,32, - 97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32, - 39,112,97,116,104,110,97,109,101,39,46,32,82,97,105,115, - 101,32,79,83,69,114,114,111,114,32,105,102,10,32,32,32, - 32,32,32,32,32,116,104,101,32,102,105,108,101,32,119,97, - 115,110,39,116,32,102,111,117,110,100,46,10,32,32,32,32, - 32,32,32,32,78,114,0,0,0,0,218,0,41,10,114,18, - 0,0,0,114,19,0,0,0,114,20,0,0,0,218,10,115, - 116,97,114,116,115,119,105,116,104,114,29,0,0,0,218,3, - 108,101,110,114,28,0,0,0,114,26,0,0,0,114,22,0, - 0,0,218,9,95,103,101,116,95,100,97,116,97,41,4,114, - 32,0,0,0,218,8,112,97,116,104,110,97,109,101,90,3, - 107,101,121,218,9,116,111,99,95,101,110,116,114,121,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,8,103, - 101,116,95,100,97,116,97,193,0,0,0,115,22,0,0,0, - 4,6,12,1,4,2,16,1,22,1,2,2,14,1,12,1, - 14,1,12,1,255,128,122,20,122,105,112,105,109,112,111,114, - 116,101,114,46,103,101,116,95,100,97,116,97,99,2,0,0, - 0,0,0,0,0,0,0,0,0,5,0,0,0,3,0,0, - 0,67,0,0,0,115,20,0,0,0,116,0,124,0,124,1, - 131,2,92,3,125,2,125,3,125,4,124,4,83,0,41,2, - 122,106,103,101,116,95,102,105,108,101,110,97,109,101,40,102, - 117,108,108,110,97,109,101,41,32,45,62,32,102,105,108,101, - 110,97,109,101,32,115,116,114,105,110,103,46,10,10,32,32, - 32,32,32,32,32,32,82,101,116,117,114,110,32,116,104,101, - 32,102,105,108,101,110,97,109,101,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,46,10,32,32,32,32,32,32,32,32,78,114,47,0, - 0,0,114,49,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,12,103,101,116,95,102,105,108,101, - 110,97,109,101,214,0,0,0,115,6,0,0,0,16,7,4, - 1,255,128,122,24,122,105,112,105,109,112,111,114,116,101,114, - 46,103,101,116,95,102,105,108,101,110,97,109,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0, - 0,0,67,0,0,0,115,126,0,0,0,116,0,124,0,124, - 1,131,2,125,2,124,2,100,1,117,0,114,36,116,1,100, - 2,124,1,155,2,157,2,124,1,100,3,141,2,130,1,116, - 2,124,0,124,1,131,2,125,3,124,2,114,64,116,3,160, - 4,124,3,100,4,161,2,125,4,110,10,124,3,155,0,100, - 5,157,2,125,4,122,14,124,0,106,5,124,4,25,0,125, - 5,87,0,110,20,4,0,116,6,121,108,1,0,1,0,1, - 0,89,0,100,1,83,0,48,0,116,7,124,0,106,8,124, - 5,131,2,160,9,161,0,83,0,41,6,122,253,103,101,116, - 95,115,111,117,114,99,101,40,102,117,108,108,110,97,109,101, - 41,32,45,62,32,115,111,117,114,99,101,32,115,116,114,105, - 110,103,46,10,10,32,32,32,32,32,32,32,32,82,101,116, - 117,114,110,32,116,104,101,32,115,111,117,114,99,101,32,99, - 111,100,101,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,46,32,82,97, - 105,115,101,32,90,105,112,73,109,112,111,114,116,69,114,114, - 111,114,10,32,32,32,32,32,32,32,32,105,102,32,116,104, - 101,32,109,111,100,117,108,101,32,99,111,117,108,100,110,39, - 116,32,98,101,32,102,111,117,110,100,44,32,114,101,116,117, - 114,110,32,78,111,110,101,32,105,102,32,116,104,101,32,97, - 114,99,104,105,118,101,32,100,111,101,115,10,32,32,32,32, - 32,32,32,32,99,111,110,116,97,105,110,32,116,104,101,32, - 109,111,100,117,108,101,44,32,98,117,116,32,104,97,115,32, - 110,111,32,115,111,117,114,99,101,32,102,111,114,32,105,116, - 46,10,32,32,32,32,32,32,32,32,78,250,18,99,97,110, - 39,116,32,102,105,110,100,32,109,111,100,117,108,101,32,169, - 1,114,44,0,0,0,250,11,95,95,105,110,105,116,95,95, - 46,112,121,250,3,46,112,121,41,10,114,35,0,0,0,114, - 3,0,0,0,114,36,0,0,0,114,21,0,0,0,114,30, - 0,0,0,114,28,0,0,0,114,26,0,0,0,114,56,0, - 0,0,114,29,0,0,0,218,6,100,101,99,111,100,101,41, - 6,114,32,0,0,0,114,38,0,0,0,114,39,0,0,0, - 114,13,0,0,0,218,8,102,117,108,108,112,97,116,104,114, - 58,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,225, - 0,0,0,115,26,0,0,0,10,7,8,1,18,1,10,2, - 4,1,14,1,10,2,2,2,14,1,12,1,8,2,16,1, - 255,128,122,22,122,105,112,105,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,0,0,0,0,3,0,0,0,4,0,0,0,67, - 0,0,0,115,40,0,0,0,116,0,124,0,124,1,131,2, - 125,2,124,2,100,1,117,0,114,36,116,1,100,2,124,1, - 155,2,157,2,124,1,100,3,141,2,130,1,124,2,83,0, - 41,4,122,171,105,115,95,112,97,99,107,97,103,101,40,102, - 117,108,108,110,97,109,101,41,32,45,62,32,98,111,111,108, - 46,10,10,32,32,32,32,32,32,32,32,82,101,116,117,114, - 110,32,84,114,117,101,32,105,102,32,116,104,101,32,109,111, - 100,117,108,101,32,115,112,101,99,105,102,105,101,100,32,98, - 121,32,102,117,108,108,110,97,109,101,32,105,115,32,97,32, - 112,97,99,107,97,103,101,46,10,32,32,32,32,32,32,32, - 32,82,97,105,115,101,32,90,105,112,73,109,112,111,114,116, - 69,114,114,111,114,32,105,102,32,116,104,101,32,109,111,100, - 117,108,101,32,99,111,117,108,100,110,39,116,32,98,101,32, - 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,78, - 114,61,0,0,0,114,62,0,0,0,41,2,114,35,0,0, - 0,114,3,0,0,0,41,3,114,32,0,0,0,114,38,0, - 0,0,114,39,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,114,43,0,0,0,251,0,0,0,115, - 10,0,0,0,10,6,8,1,18,1,4,1,255,128,122,22, - 122,105,112,105,109,112,111,114,116,101,114,46,105,115,95,112, - 97,99,107,97,103,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,8,0,0,0,8,0,0,0,67,0,0,0,115, - 236,0,0,0,116,0,124,0,124,1,131,2,92,3,125,2, - 125,3,125,4,116,1,106,2,160,3,124,1,161,1,125,5, - 124,5,100,1,117,0,115,46,116,4,124,5,116,5,131,2, - 115,64,116,5,124,1,131,1,125,5,124,5,116,1,106,2, - 124,1,60,0,124,0,124,5,95,6,122,84,124,3,114,108, - 116,7,124,0,124,1,131,2,125,6,116,8,160,9,124,0, - 106,10,124,6,161,2,125,7,124,7,103,1,124,5,95,11, - 116,12,124,5,100,2,131,2,115,124,116,13,124,5,95,13, - 116,8,160,14,124,5,106,15,124,1,124,4,161,3,1,0, - 116,16,124,2,124,5,106,15,131,2,1,0,87,0,110,16, - 1,0,1,0,1,0,116,1,106,2,124,1,61,0,130,0, - 122,14,116,1,106,2,124,1,25,0,125,5,87,0,110,30, - 4,0,116,17,121,216,1,0,1,0,1,0,116,18,100,3, - 124,1,155,2,100,4,157,3,131,1,130,1,48,0,116,19, - 160,20,100,5,124,1,124,4,161,3,1,0,124,5,83,0, - 41,6,97,55,1,0,0,108,111,97,100,95,109,111,100,117, - 108,101,40,102,117,108,108,110,97,109,101,41,32,45,62,32, - 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, - 32,76,111,97,100,32,116,104,101,32,109,111,100,117,108,101, - 32,115,112,101,99,105,102,105,101,100,32,98,121,32,39,102, - 117,108,108,110,97,109,101,39,46,32,39,102,117,108,108,110, - 97,109,101,39,32,109,117,115,116,32,98,101,32,116,104,101, - 10,32,32,32,32,32,32,32,32,102,117,108,108,121,32,113, - 117,97,108,105,102,105,101,100,32,40,100,111,116,116,101,100, - 41,32,109,111,100,117,108,101,32,110,97,109,101,46,32,73, - 116,32,114,101,116,117,114,110,115,32,116,104,101,32,105,109, - 112,111,114,116,101,100,10,32,32,32,32,32,32,32,32,109, - 111,100,117,108,101,44,32,111,114,32,114,97,105,115,101,115, - 32,90,105,112,73,109,112,111,114,116,69,114,114,111,114,32, - 105,102,32,105,116,32,119,97,115,110,39,116,32,102,111,117, - 110,100,46,10,10,32,32,32,32,32,32,32,32,68,101,112, - 114,101,99,97,116,101,100,32,115,105,110,99,101,32,80,121, - 116,104,111,110,32,51,46,49,48,46,32,117,115,101,32,101, - 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, - 116,101,97,100,46,10,32,32,32,32,32,32,32,32,78,218, - 12,95,95,98,117,105,108,116,105,110,115,95,95,122,14,76, - 111,97,100,101,100,32,109,111,100,117,108,101,32,122,25,32, - 110,111,116,32,102,111,117,110,100,32,105,110,32,115,121,115, - 46,109,111,100,117,108,101,115,122,30,105,109,112,111,114,116, - 32,123,125,32,35,32,108,111,97,100,101,100,32,102,114,111, - 109,32,90,105,112,32,123,125,41,21,114,48,0,0,0,218, - 3,115,121,115,218,7,109,111,100,117,108,101,115,218,3,103, - 101,116,114,15,0,0,0,218,12,95,109,111,100,117,108,101, - 95,116,121,112,101,218,10,95,95,108,111,97,100,101,114,95, - 95,114,36,0,0,0,114,21,0,0,0,114,30,0,0,0, - 114,29,0,0,0,90,8,95,95,112,97,116,104,95,95,218, - 7,104,97,115,97,116,116,114,114,68,0,0,0,90,14,95, - 102,105,120,95,117,112,95,109,111,100,117,108,101,218,8,95, - 95,100,105,99,116,95,95,218,4,101,120,101,99,114,26,0, - 0,0,218,11,73,109,112,111,114,116,69,114,114,111,114,114, - 45,0,0,0,218,16,95,118,101,114,98,111,115,101,95,109, - 101,115,115,97,103,101,41,8,114,32,0,0,0,114,38,0, - 0,0,114,50,0,0,0,114,51,0,0,0,114,40,0,0, - 0,90,3,109,111,100,114,13,0,0,0,114,66,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 11,108,111,97,100,95,109,111,100,117,108,101,8,1,0,0, - 115,50,0,0,0,16,9,12,1,18,1,8,1,10,1,6, - 1,2,2,4,1,10,3,14,1,8,1,10,2,6,1,16, - 1,16,1,6,1,8,1,2,1,2,2,14,1,12,1,18, - 1,14,1,4,1,255,128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,64,0,0,0,122,20, - 124,0,160,0,124,1,161,1,115,18,87,0,100,1,83,0, - 87,0,110,20,4,0,116,1,121,40,1,0,1,0,1,0, - 89,0,100,1,83,0,48,0,100,2,100,3,108,2,109,3, - 125,2,1,0,124,2,124,0,124,1,131,2,83,0,41,4, - 122,204,82,101,116,117,114,110,32,116,104,101,32,82,101,115, - 111,117,114,99,101,82,101,97,100,101,114,32,102,111,114,32, - 97,32,112,97,99,107,97,103,101,32,105,110,32,97,32,122, - 105,112,32,102,105,108,101,46,10,10,32,32,32,32,32,32, - 32,32,73,102,32,39,102,117,108,108,110,97,109,101,39,32, - 105,115,32,97,32,112,97,99,107,97,103,101,32,119,105,116, - 104,105,110,32,116,104,101,32,122,105,112,32,102,105,108,101, - 44,32,114,101,116,117,114,110,32,116,104,101,10,32,32,32, - 32,32,32,32,32,39,82,101,115,111,117,114,99,101,82,101, - 97,100,101,114,39,32,111,98,106,101,99,116,32,102,111,114, - 32,116,104,101,32,112,97,99,107,97,103,101,46,32,32,79, - 116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,32, - 78,111,110,101,46,10,32,32,32,32,32,32,32,32,78,114, - 0,0,0,0,41,1,218,9,90,105,112,82,101,97,100,101, - 114,41,4,114,43,0,0,0,114,3,0,0,0,90,17,105, - 109,112,111,114,116,108,105,98,46,114,101,97,100,101,114,115, - 114,80,0,0,0,41,3,114,32,0,0,0,114,38,0,0, - 0,114,80,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,19,103,101,116,95,114,101,115,111,117, - 114,99,101,95,114,101,97,100,101,114,48,1,0,0,115,16, - 0,0,0,2,6,10,1,10,1,12,1,8,1,12,1,10, - 1,255,128,122,31,122,105,112,105,109,112,111,114,116,101,114, - 46,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, - 97,100,101,114,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,5,0,0,0,67,0,0,0,115,24,0, - 0,0,100,1,124,0,106,0,155,0,116,1,155,0,124,0, - 106,2,155,0,100,2,157,5,83,0,41,3,78,122,21,60, - 122,105,112,105,109,112,111,114,116,101,114,32,111,98,106,101, - 99,116,32,34,122,2,34,62,41,3,114,29,0,0,0,114, - 20,0,0,0,114,31,0,0,0,41,1,114,32,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 8,95,95,114,101,112,114,95,95,63,1,0,0,115,4,0, - 0,0,24,1,255,128,122,20,122,105,112,105,109,112,111,114, - 116,101,114,46,95,95,114,101,112,114,95,95,41,1,78,41, - 1,78,41,1,78,41,16,114,6,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,7,95,95,100,111,99,95,95,114, - 34,0,0,0,114,41,0,0,0,114,42,0,0,0,114,46, - 0,0,0,114,52,0,0,0,114,59,0,0,0,114,60,0, - 0,0,114,67,0,0,0,114,43,0,0,0,114,79,0,0, - 0,114,81,0,0,0,114,82,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, - 4,0,0,0,45,0,0,0,115,30,0,0,0,8,0,4, - 1,8,17,10,46,10,34,10,13,8,27,8,10,8,21,8, - 11,8,26,8,13,8,40,12,15,255,128,122,12,95,95,105, - 110,105,116,95,95,46,112,121,99,84,114,63,0,0,0,70, - 41,3,122,4,46,112,121,99,84,70,41,3,114,64,0,0, - 0,70,70,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,4,0,0,0,67,0,0,0,115,20,0,0, - 0,124,0,106,0,124,1,160,1,100,1,161,1,100,2,25, - 0,23,0,83,0,41,3,78,218,1,46,233,2,0,0,0, - 41,2,114,31,0,0,0,218,10,114,112,97,114,116,105,116, - 105,111,110,41,2,114,32,0,0,0,114,38,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,36, - 0,0,0,81,1,0,0,115,4,0,0,0,20,1,255,128, - 114,36,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,2,0,0,0,67,0,0,0,115,18, - 0,0,0,124,1,116,0,23,0,125,2,124,2,124,0,106, - 1,118,0,83,0,169,1,78,41,2,114,20,0,0,0,114, - 28,0,0,0,41,3,114,32,0,0,0,114,13,0,0,0, - 90,7,100,105,114,112,97,116,104,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,37,0,0,0,85,1,0, - 0,115,6,0,0,0,8,4,10,2,255,128,114,37,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,7,0, - 0,0,4,0,0,0,67,0,0,0,115,54,0,0,0,116, - 0,124,0,124,1,131,2,125,2,116,1,68,0,93,34,92, - 3,125,3,125,4,125,5,124,2,124,3,23,0,125,6,124, - 6,124,0,106,2,118,0,114,14,124,5,2,0,1,0,83, - 0,100,0,83,0,114,87,0,0,0,41,3,114,36,0,0, - 0,218,16,95,122,105,112,95,115,101,97,114,99,104,111,114, - 100,101,114,114,28,0,0,0,41,7,114,32,0,0,0,114, - 38,0,0,0,114,13,0,0,0,218,6,115,117,102,102,105, - 120,218,10,105,115,98,121,116,101,99,111,100,101,114,51,0, - 0,0,114,66,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,114,35,0,0,0,94,1,0,0,115, - 14,0,0,0,10,1,14,1,8,1,10,1,8,1,4,1, - 255,128,114,35,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,26,0,0,0,9,0,0,0,67,0,0,0, - 115,230,4,0,0,122,14,116,0,160,1,124,0,161,1,125, - 1,87,0,110,32,4,0,116,2,121,46,1,0,1,0,1, - 0,116,3,100,1,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,48,0,124,1,144,4,143,140,1,0,122,36,124, - 1,160,4,116,5,11,0,100,3,161,2,1,0,124,1,160, - 6,161,0,125,2,124,1,160,7,116,5,161,1,125,3,87, - 0,110,32,4,0,116,2,121,124,1,0,1,0,1,0,116, - 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,48,0,116,8,124,3,131,1,116,5,107,3,114,156,116, - 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,124,3,100,0,100,5,133,2,25,0,116,9,107,3,144, - 1,114,154,122,24,124,1,160,4,100,6,100,3,161,2,1, - 0,124,1,160,6,161,0,125,4,87,0,110,32,4,0,116, - 2,121,230,1,0,1,0,1,0,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,48,0,116,10,124, - 4,116,11,24,0,116,5,24,0,100,6,131,2,125,5,122, - 22,124,1,160,4,124,5,161,1,1,0,124,1,160,7,161, - 0,125,6,87,0,110,34,4,0,116,2,144,1,121,50,1, - 0,1,0,1,0,116,3,100,4,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,48,0,124,6,160,12,116,9,161, - 1,125,7,124,7,100,6,107,0,144,1,114,90,116,3,100, - 7,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124, - 6,124,7,124,7,116,5,23,0,133,2,25,0,125,3,116, - 8,124,3,131,1,116,5,107,3,144,1,114,138,116,3,100, - 8,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124, - 4,116,8,124,6,131,1,24,0,124,7,23,0,125,2,116, - 13,124,3,100,9,100,10,133,2,25,0,131,1,125,8,116, - 13,124,3,100,10,100,11,133,2,25,0,131,1,125,9,124, - 2,124,8,107,0,144,1,114,214,116,3,100,12,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,124,2,124,9,107, - 0,144,1,114,242,116,3,100,13,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,124,2,124,8,56,0,125,2,124, - 2,124,9,24,0,125,10,124,10,100,6,107,0,144,2,114, - 30,116,3,100,14,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,105,0,125,11,100,6,125,12,122,14,124,1,160, - 4,124,2,161,1,1,0,87,0,110,34,4,0,116,2,144, - 2,121,86,1,0,1,0,1,0,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,48,0,124,1,160, - 7,100,15,161,1,125,3,116,8,124,3,131,1,100,5,107, - 0,144,2,114,120,116,14,100,16,131,1,130,1,124,3,100, - 0,100,5,133,2,25,0,100,17,107,3,144,2,114,142,144, - 4,113,180,116,8,124,3,131,1,100,15,107,3,144,2,114, - 164,116,14,100,16,131,1,130,1,116,15,124,3,100,18,100, - 19,133,2,25,0,131,1,125,13,116,15,124,3,100,19,100, - 9,133,2,25,0,131,1,125,14,116,15,124,3,100,9,100, - 20,133,2,25,0,131,1,125,15,116,15,124,3,100,20,100, - 10,133,2,25,0,131,1,125,16,116,13,124,3,100,10,100, - 11,133,2,25,0,131,1,125,17,116,13,124,3,100,11,100, - 21,133,2,25,0,131,1,125,18,116,13,124,3,100,21,100, - 22,133,2,25,0,131,1,125,4,116,15,124,3,100,22,100, - 23,133,2,25,0,131,1,125,19,116,15,124,3,100,23,100, - 24,133,2,25,0,131,1,125,20,116,15,124,3,100,24,100, - 25,133,2,25,0,131,1,125,21,116,13,124,3,100,26,100, - 15,133,2,25,0,131,1,125,22,124,19,124,20,23,0,124, - 21,23,0,125,8,124,22,124,9,107,4,144,3,114,124,116, - 3,100,27,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,124,22,124,10,55,0,125,22,122,14,124,1,160,7,124, - 19,161,1,125,23,87,0,110,34,4,0,116,2,144,3,121, - 180,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,48,0,116,8,124,23,131, - 1,124,19,107,3,144,3,114,214,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,122,50,116,8,124, - 1,160,7,124,8,124,19,24,0,161,1,131,1,124,8,124, - 19,24,0,107,3,144,4,114,6,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,87,0,110,34,4, - 0,116,2,144,4,121,42,1,0,1,0,1,0,116,3,100, - 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,48, - 0,124,13,100,28,64,0,144,4,114,64,124,23,160,16,161, - 0,125,23,110,52,122,14,124,23,160,16,100,29,161,1,125, - 23,87,0,110,36,4,0,116,17,144,4,121,114,1,0,1, - 0,1,0,124,23,160,16,100,30,161,1,160,18,116,19,161, - 1,125,23,89,0,110,2,48,0,124,23,160,20,100,31,116, - 21,161,2,125,23,116,22,160,23,124,0,124,23,161,2,125, - 24,124,24,124,14,124,18,124,4,124,22,124,15,124,16,124, - 17,102,8,125,25,124,25,124,11,124,23,60,0,124,12,100, - 32,55,0,125,12,144,2,113,88,87,0,100,0,4,0,4, - 0,131,3,1,0,110,18,49,0,144,4,115,202,48,0,1, - 0,1,0,1,0,89,0,1,0,116,24,160,25,100,33,124, - 12,124,0,161,3,1,0,124,11,83,0,41,34,78,122,21, - 99,97,110,39,116,32,111,112,101,110,32,90,105,112,32,102, - 105,108,101,58,32,114,12,0,0,0,114,85,0,0,0,250, - 21,99,97,110,39,116,32,114,101,97,100,32,90,105,112,32, - 102,105,108,101,58,32,233,4,0,0,0,114,0,0,0,0, - 122,16,110,111,116,32,97,32,90,105,112,32,102,105,108,101, - 58,32,122,18,99,111,114,114,117,112,116,32,90,105,112,32, - 102,105,108,101,58,32,233,12,0,0,0,233,16,0,0,0, - 233,20,0,0,0,122,28,98,97,100,32,99,101,110,116,114, - 97,108,32,100,105,114,101,99,116,111,114,121,32,115,105,122, - 101,58,32,122,30,98,97,100,32,99,101,110,116,114,97,108, - 32,100,105,114,101,99,116,111,114,121,32,111,102,102,115,101, - 116,58,32,122,38,98,97,100,32,99,101,110,116,114,97,108, - 32,100,105,114,101,99,116,111,114,121,32,115,105,122,101,32, - 111,114,32,111,102,102,115,101,116,58,32,233,46,0,0,0, - 250,27,69,79,70,32,114,101,97,100,32,119,104,101,114,101, - 32,110,111,116,32,101,120,112,101,99,116,101,100,115,4,0, - 0,0,80,75,1,2,233,8,0,0,0,233,10,0,0,0, - 233,14,0,0,0,233,24,0,0,0,233,28,0,0,0,233, - 30,0,0,0,233,32,0,0,0,233,34,0,0,0,233,42, - 0,0,0,122,25,98,97,100,32,108,111,99,97,108,32,104, - 101,97,100,101,114,32,111,102,102,115,101,116,58,32,105,0, - 8,0,0,218,5,97,115,99,105,105,90,6,108,97,116,105, - 110,49,250,1,47,114,5,0,0,0,122,33,122,105,112,105, - 109,112,111,114,116,58,32,102,111,117,110,100,32,123,125,32, - 110,97,109,101,115,32,105,110,32,123,33,114,125,41,26,218, - 3,95,105,111,218,9,111,112,101,110,95,99,111,100,101,114, - 22,0,0,0,114,3,0,0,0,218,4,115,101,101,107,218, - 20,69,78,68,95,67,69,78,84,82,65,76,95,68,73,82, - 95,83,73,90,69,90,4,116,101,108,108,218,4,114,101,97, - 100,114,55,0,0,0,218,18,83,84,82,73,78,71,95,69, - 78,68,95,65,82,67,72,73,86,69,218,3,109,97,120,218, - 15,77,65,88,95,67,79,77,77,69,78,84,95,76,69,78, - 218,5,114,102,105,110,100,114,2,0,0,0,218,8,69,79, - 70,69,114,114,111,114,114,1,0,0,0,114,65,0,0,0, - 218,18,85,110,105,99,111,100,101,68,101,99,111,100,101,69, - 114,114,111,114,218,9,116,114,97,110,115,108,97,116,101,218, - 11,99,112,52,51,55,95,116,97,98,108,101,114,19,0,0, - 0,114,20,0,0,0,114,21,0,0,0,114,30,0,0,0, - 114,45,0,0,0,114,78,0,0,0,41,26,114,29,0,0, - 0,218,2,102,112,90,15,104,101,97,100,101,114,95,112,111, - 115,105,116,105,111,110,218,6,98,117,102,102,101,114,218,9, - 102,105,108,101,95,115,105,122,101,90,17,109,97,120,95,99, - 111,109,109,101,110,116,95,115,116,97,114,116,218,4,100,97, - 116,97,90,3,112,111,115,218,11,104,101,97,100,101,114,95, - 115,105,122,101,90,13,104,101,97,100,101,114,95,111,102,102, - 115,101,116,90,10,97,114,99,95,111,102,102,115,101,116,114, - 33,0,0,0,218,5,99,111,117,110,116,218,5,102,108,97, - 103,115,218,8,99,111,109,112,114,101,115,115,218,4,116,105, - 109,101,218,4,100,97,116,101,218,3,99,114,99,218,9,100, - 97,116,97,95,115,105,122,101,218,9,110,97,109,101,95,115, - 105,122,101,218,10,101,120,116,114,97,95,115,105,122,101,90, - 12,99,111,109,109,101,110,116,95,115,105,122,101,218,11,102, - 105,108,101,95,111,102,102,115,101,116,114,44,0,0,0,114, - 13,0,0,0,218,1,116,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,114,27,0,0,0,125,1,0,0,115, - 214,0,0,0,2,1,14,1,12,1,20,1,8,2,2,1, - 14,1,8,1,14,1,12,1,20,1,12,1,18,1,18,1, - 2,3,12,1,12,1,12,1,10,1,2,1,8,255,8,2, - 2,1,2,255,2,1,4,255,2,2,10,1,12,1,14,1, - 10,1,2,1,8,255,10,2,10,1,10,1,2,1,6,255, - 16,2,14,1,10,1,2,1,6,255,16,2,16,2,16,1, - 10,1,18,1,10,1,18,1,8,1,8,1,10,1,18,1, - 4,2,4,2,2,1,14,1,14,1,20,1,10,2,14,1, - 8,1,18,2,4,1,14,1,8,1,16,1,16,1,16,1, - 16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1, - 12,1,10,1,18,1,8,1,2,2,14,1,14,1,20,1, - 14,1,18,1,2,4,28,1,22,1,14,1,20,1,10,2, - 10,2,2,3,14,1,14,1,22,1,12,2,12,1,20,1, - 8,1,44,1,14,1,4,1,255,128,114,27,0,0,0,117, - 190,1,0,0,0,1,2,3,4,5,6,7,8,9,10,11, - 12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27, - 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43, - 44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59, - 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75, - 76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91, - 92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107, - 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123, - 124,125,126,127,195,135,195,188,195,169,195,162,195,164,195,160, - 195,165,195,167,195,170,195,171,195,168,195,175,195,174,195,172, - 195,132,195,133,195,137,195,166,195,134,195,180,195,182,195,178, - 195,187,195,185,195,191,195,150,195,156,194,162,194,163,194,165, - 226,130,167,198,146,195,161,195,173,195,179,195,186,195,177,195, - 145,194,170,194,186,194,191,226,140,144,194,172,194,189,194,188, - 194,161,194,171,194,187,226,150,145,226,150,146,226,150,147,226, - 148,130,226,148,164,226,149,161,226,149,162,226,149,150,226,149, - 149,226,149,163,226,149,145,226,149,151,226,149,157,226,149,156, - 226,149,155,226,148,144,226,148,148,226,148,180,226,148,172,226, - 148,156,226,148,128,226,148,188,226,149,158,226,149,159,226,149, - 154,226,149,148,226,149,169,226,149,166,226,149,160,226,149,144, - 226,149,172,226,149,167,226,149,168,226,149,164,226,149,165,226, - 149,153,226,149,152,226,149,146,226,149,147,226,149,171,226,149, - 170,226,148,152,226,148,140,226,150,136,226,150,132,226,150,140, - 226,150,144,226,150,128,206,177,195,159,206,147,207,128,206,163, - 207,131,194,181,207,132,206,166,206,152,206,169,206,180,226,136, - 158,207,134,206,181,226,136,169,226,137,161,194,177,226,137,165, - 226,137,164,226,140,160,226,140,161,195,183,226,137,136,194,176, - 226,136,153,194,183,226,136,154,226,129,191,194,178,226,150,160, - 194,160,99,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,8,0,0,0,67,0,0,0,115,106,0,0,0, - 116,0,114,22,116,1,160,2,100,1,161,1,1,0,116,3, - 100,2,131,1,130,1,100,3,97,0,122,58,122,16,100,4, - 100,5,108,4,109,5,125,0,1,0,87,0,110,32,4,0, - 116,6,121,76,1,0,1,0,1,0,116,1,160,2,100,1, - 161,1,1,0,116,3,100,2,131,1,130,1,48,0,87,0, - 100,6,97,0,110,6,100,6,97,0,48,0,116,1,160,2, - 100,7,161,1,1,0,124,0,83,0,41,8,78,122,27,122, - 105,112,105,109,112,111,114,116,58,32,122,108,105,98,32,85, - 78,65,86,65,73,76,65,66,76,69,250,41,99,97,110,39, - 116,32,100,101,99,111,109,112,114,101,115,115,32,100,97,116, - 97,59,32,122,108,105,98,32,110,111,116,32,97,118,97,105, - 108,97,98,108,101,84,114,0,0,0,0,169,1,218,10,100, - 101,99,111,109,112,114,101,115,115,70,122,25,122,105,112,105, - 109,112,111,114,116,58,32,122,108,105,98,32,97,118,97,105, - 108,97,98,108,101,41,7,218,15,95,105,109,112,111,114,116, - 105,110,103,95,122,108,105,98,114,45,0,0,0,114,78,0, - 0,0,114,3,0,0,0,90,4,122,108,105,98,114,140,0, - 0,0,218,9,69,120,99,101,112,116,105,111,110,114,139,0, + 108,32,112,97,116,104,32,110,97,109,101,32,105,102,32,105, + 116,39,115,32,112,111,115,115,105,98,108,121,32,97,32,112, + 111,114,116,105,111,110,32,111,102,32,97,32,110,97,109,101, + 115,112,97,99,101,32,112,97,99,107,97,103,101,44,10,32, + 32,32,32,32,32,32,32,111,114,32,78,111,110,101,32,111, + 116,104,101,114,119,105,115,101,46,32,84,104,101,32,111,112, + 116,105,111,110,97,108,32,39,112,97,116,104,39,32,97,114, + 103,117,109,101,110,116,32,105,115,32,105,103,110,111,114,101, + 100,32,45,45,32,105,116,39,115,10,32,32,32,32,32,32, + 32,32,116,104,101,114,101,32,102,111,114,32,99,111,109,112, + 97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,116, + 104,101,32,105,109,112,111,114,116,101,114,32,112,114,111,116, + 111,99,111,108,46,10,10,32,32,32,32,32,32,32,32,68, + 101,112,114,101,99,97,116,101,100,32,115,105,110,99,101,32, + 80,121,116,104,111,110,32,51,46,49,48,46,32,85,115,101, + 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, + 116,101,97,100,46,10,32,32,32,32,32,32,32,32,78,41, + 5,218,16,95,103,101,116,95,109,111,100,117,108,101,95,105, + 110,102,111,218,16,95,103,101,116,95,109,111,100,117,108,101, + 95,112,97,116,104,218,7,95,105,115,95,100,105,114,114,29, + 0,0,0,114,20,0,0,0,41,5,114,32,0,0,0,218, + 8,102,117,108,108,110,97,109,101,114,13,0,0,0,218,2, + 109,105,218,7,109,111,100,112,97,116,104,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,11,102,105,110,100, + 95,108,111,97,100,101,114,110,0,0,0,115,16,0,0,0, + 10,12,8,1,8,2,10,7,10,1,24,4,8,2,255,128, + 122,23,122,105,112,105,109,112,111,114,116,101,114,46,102,105, + 110,100,95,108,111,97,100,101,114,99,3,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, + 0,0,115,16,0,0,0,124,0,160,0,124,1,124,2,161, + 2,100,1,25,0,83,0,41,3,97,203,1,0,0,102,105, + 110,100,95,109,111,100,117,108,101,40,102,117,108,108,110,97, + 109,101,44,32,112,97,116,104,61,78,111,110,101,41,32,45, + 62,32,115,101,108,102,32,111,114,32,78,111,110,101,46,10, + 10,32,32,32,32,32,32,32,32,83,101,97,114,99,104,32, + 102,111,114,32,97,32,109,111,100,117,108,101,32,115,112,101, + 99,105,102,105,101,100,32,98,121,32,39,102,117,108,108,110, + 97,109,101,39,46,32,39,102,117,108,108,110,97,109,101,39, + 32,109,117,115,116,32,98,101,32,116,104,101,10,32,32,32, + 32,32,32,32,32,102,117,108,108,121,32,113,117,97,108,105, + 102,105,101,100,32,40,100,111,116,116,101,100,41,32,109,111, + 100,117,108,101,32,110,97,109,101,46,32,73,116,32,114,101, + 116,117,114,110,115,32,116,104,101,32,122,105,112,105,109,112, + 111,114,116,101,114,10,32,32,32,32,32,32,32,32,105,110, + 115,116,97,110,99,101,32,105,116,115,101,108,102,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,119,97,115,32, + 102,111,117,110,100,44,32,111,114,32,78,111,110,101,32,105, + 102,32,105,116,32,119,97,115,110,39,116,46,10,32,32,32, + 32,32,32,32,32,84,104,101,32,111,112,116,105,111,110,97, + 108,32,39,112,97,116,104,39,32,97,114,103,117,109,101,110, + 116,32,105,115,32,105,103,110,111,114,101,100,32,45,45,32, + 105,116,39,115,32,116,104,101,114,101,32,102,111,114,32,99, + 111,109,112,97,116,105,98,105,108,105,116,121,10,32,32,32, + 32,32,32,32,32,119,105,116,104,32,116,104,101,32,105,109, + 112,111,114,116,101,114,32,112,114,111,116,111,99,111,108,46, + 10,10,32,32,32,32,32,32,32,32,68,101,112,114,101,99, + 97,116,101,100,32,115,105,110,99,101,32,80,121,116,104,111, + 110,32,51,46,49,48,46,32,85,115,101,32,102,105,110,100, + 95,115,112,101,99,40,41,32,105,110,115,116,101,97,100,46, + 10,32,32,32,32,32,32,32,32,114,0,0,0,0,78,41, + 1,114,41,0,0,0,41,3,114,32,0,0,0,114,38,0, + 0,0,114,13,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,11,102,105,110,100,95,109,111,100, + 117,108,101,144,0,0,0,115,4,0,0,0,16,11,255,128, + 122,23,122,105,112,105,109,112,111,114,116,101,114,46,102,105, + 110,100,95,109,111,100,117,108,101,99,3,0,0,0,0,0, + 0,0,0,0,0,0,7,0,0,0,5,0,0,0,67,0, + 0,0,115,108,0,0,0,116,0,124,0,124,1,131,2,125, + 3,124,3,100,1,117,1,114,34,116,1,106,2,124,1,124, + 0,124,3,100,2,141,3,83,0,116,3,124,0,124,1,131, + 2,125,4,116,4,124,0,124,4,131,2,114,104,124,0,106, + 5,155,0,116,6,155,0,124,4,155,0,157,3,125,5,116, + 1,106,7,124,1,100,1,100,3,100,4,141,3,125,6,124, + 6,106,8,160,9,124,5,161,1,1,0,124,6,83,0,100, + 1,83,0,41,5,122,107,67,114,101,97,116,101,32,97,32, + 77,111,100,117,108,101,83,112,101,99,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,46,10,10,32,32,32,32,32,32,32,32,82,101, + 116,117,114,110,115,32,78,111,110,101,32,105,102,32,116,104, + 101,32,109,111,100,117,108,101,32,99,97,110,110,111,116,32, + 98,101,32,102,111,117,110,100,46,10,32,32,32,32,32,32, + 32,32,78,41,1,218,10,105,115,95,112,97,99,107,97,103, + 101,84,41,3,218,4,110,97,109,101,90,6,108,111,97,100, + 101,114,114,43,0,0,0,41,10,114,35,0,0,0,218,10, + 95,98,111,111,116,115,116,114,97,112,90,16,115,112,101,99, + 95,102,114,111,109,95,108,111,97,100,101,114,114,36,0,0, + 0,114,37,0,0,0,114,29,0,0,0,114,20,0,0,0, + 90,10,77,111,100,117,108,101,83,112,101,99,90,26,115,117, + 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, + 111,99,97,116,105,111,110,115,114,24,0,0,0,41,7,114, + 32,0,0,0,114,38,0,0,0,90,6,116,97,114,103,101, + 116,90,11,109,111,100,117,108,101,95,105,110,102,111,114,40, + 0,0,0,114,13,0,0,0,90,4,115,112,101,99,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,9,102, + 105,110,100,95,115,112,101,99,157,0,0,0,115,26,0,0, + 0,10,5,8,1,16,1,10,7,10,1,18,4,8,1,2, + 1,6,255,12,2,4,1,4,2,255,128,122,21,122,105,112, + 105,109,112,111,114,116,101,114,46,102,105,110,100,95,115,112, + 101,99,99,2,0,0,0,0,0,0,0,0,0,0,0,5, + 0,0,0,3,0,0,0,67,0,0,0,115,20,0,0,0, + 116,0,124,0,124,1,131,2,92,3,125,2,125,3,125,4, + 124,2,83,0,41,2,122,163,103,101,116,95,99,111,100,101, + 40,102,117,108,108,110,97,109,101,41,32,45,62,32,99,111, + 100,101,32,111,98,106,101,99,116,46,10,10,32,32,32,32, + 32,32,32,32,82,101,116,117,114,110,32,116,104,101,32,99, + 111,100,101,32,111,98,106,101,99,116,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,46,32,82,97,105,115,101,32,90,105,112,73,109, + 112,111,114,116,69,114,114,111,114,10,32,32,32,32,32,32, + 32,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32, + 99,111,117,108,100,110,39,116,32,98,101,32,102,111,117,110, + 100,46,10,32,32,32,32,32,32,32,32,78,169,1,218,16, + 95,103,101,116,95,109,111,100,117,108,101,95,99,111,100,101, + 169,5,114,32,0,0,0,114,38,0,0,0,218,4,99,111, + 100,101,218,9,105,115,112,97,99,107,97,103,101,114,40,0, 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,20,95,103,101,116,95,100,101,99,111,109,112,114,101, - 115,115,95,102,117,110,99,27,2,0,0,115,26,0,0,0, - 4,2,10,3,8,1,4,2,4,1,16,1,12,1,10,1, - 12,1,12,2,10,2,4,1,255,128,114,143,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0, - 9,0,0,0,67,0,0,0,115,132,1,0,0,124,1,92, - 8,125,2,125,3,125,4,125,5,125,6,125,7,125,8,125, - 9,124,4,100,1,107,0,114,36,116,0,100,2,131,1,130, - 1,116,1,160,2,124,0,161,1,144,1,143,6,125,10,122, - 14,124,10,160,3,124,6,161,1,1,0,87,0,110,32,4, - 0,116,4,121,96,1,0,1,0,1,0,116,0,100,3,124, - 0,155,2,157,2,124,0,100,4,141,2,130,1,48,0,124, - 10,160,5,100,5,161,1,125,11,116,6,124,11,131,1,100, - 5,107,3,114,128,116,7,100,6,131,1,130,1,124,11,100, - 0,100,7,133,2,25,0,100,8,107,3,114,162,116,0,100, - 9,124,0,155,2,157,2,124,0,100,4,141,2,130,1,116, - 8,124,11,100,10,100,11,133,2,25,0,131,1,125,12,116, - 8,124,11,100,11,100,5,133,2,25,0,131,1,125,13,100, - 5,124,12,23,0,124,13,23,0,125,14,124,6,124,14,55, - 0,125,6,122,14,124,10,160,3,124,6,161,1,1,0,87, - 0,110,34,4,0,116,4,144,1,121,6,1,0,1,0,1, - 0,116,0,100,3,124,0,155,2,157,2,124,0,100,4,141, - 2,130,1,48,0,124,10,160,5,124,4,161,1,125,15,116, - 6,124,15,131,1,124,4,107,3,144,1,114,40,116,4,100, - 12,131,1,130,1,87,0,100,0,4,0,4,0,131,3,1, - 0,110,18,49,0,144,1,115,62,48,0,1,0,1,0,1, - 0,89,0,1,0,124,3,100,1,107,2,144,1,114,86,124, - 15,83,0,122,10,116,9,131,0,125,16,87,0,110,24,4, - 0,116,10,144,1,121,120,1,0,1,0,1,0,116,0,100, - 13,131,1,130,1,48,0,124,16,124,15,100,14,131,2,83, - 0,41,15,78,114,0,0,0,0,122,18,110,101,103,97,116, - 105,118,101,32,100,97,116,97,32,115,105,122,101,114,91,0, - 0,0,114,12,0,0,0,114,103,0,0,0,114,97,0,0, - 0,114,92,0,0,0,115,4,0,0,0,80,75,3,4,122, - 23,98,97,100,32,108,111,99,97,108,32,102,105,108,101,32, - 104,101,97,100,101,114,58,32,233,26,0,0,0,114,102,0, - 0,0,122,26,122,105,112,105,109,112,111,114,116,58,32,99, - 97,110,39,116,32,114,101,97,100,32,100,97,116,97,114,138, - 0,0,0,105,241,255,255,255,41,11,114,3,0,0,0,114, - 109,0,0,0,114,110,0,0,0,114,111,0,0,0,114,22, - 0,0,0,114,113,0,0,0,114,55,0,0,0,114,118,0, - 0,0,114,1,0,0,0,114,143,0,0,0,114,142,0,0, - 0,41,17,114,29,0,0,0,114,58,0,0,0,90,8,100, - 97,116,97,112,97,116,104,114,129,0,0,0,114,133,0,0, - 0,114,124,0,0,0,114,136,0,0,0,114,130,0,0,0, - 114,131,0,0,0,114,132,0,0,0,114,122,0,0,0,114, - 123,0,0,0,114,134,0,0,0,114,135,0,0,0,114,126, - 0,0,0,90,8,114,97,119,95,100,97,116,97,114,140,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,56,0,0,0,48,2,0,0,115,64,0,0,0,20, - 1,8,1,8,1,14,2,2,2,14,1,12,1,20,1,10, - 1,12,1,8,1,16,2,18,2,16,2,16,1,12,1,8, - 1,2,1,14,1,14,1,20,1,10,1,14,1,40,1,10, - 2,4,2,2,3,10,1,14,1,10,1,10,1,255,128,114, - 56,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,16,0, - 0,0,116,0,124,0,124,1,24,0,131,1,100,1,107,1, - 83,0,41,2,78,114,5,0,0,0,41,1,218,3,97,98, - 115,41,2,90,2,116,49,90,2,116,50,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,9,95,101,113,95, - 109,116,105,109,101,94,2,0,0,115,4,0,0,0,16,2, - 255,128,114,146,0,0,0,99,5,0,0,0,0,0,0,0, - 0,0,0,0,14,0,0,0,8,0,0,0,67,0,0,0, - 115,60,1,0,0,124,3,124,2,100,1,156,2,125,5,122, - 18,116,0,160,1,124,4,124,3,124,5,161,3,125,6,87, - 0,110,20,4,0,116,2,121,48,1,0,1,0,1,0,89, - 0,100,0,83,0,48,0,124,6,100,2,64,0,100,3,107, - 3,125,7,124,7,114,182,124,6,100,4,64,0,100,3,107, - 3,125,8,116,3,106,4,100,5,107,3,144,1,114,10,124, - 8,115,106,116,3,106,4,100,6,107,2,144,1,114,10,116, - 5,124,0,124,2,131,2,125,9,124,9,100,0,117,1,144, - 1,114,10,116,3,160,6,116,0,106,7,124,9,161,2,125, - 10,122,20,116,0,160,8,124,4,124,10,124,3,124,5,161, - 4,1,0,87,0,110,104,4,0,116,2,121,180,1,0,1, - 0,1,0,89,0,100,0,83,0,48,0,116,9,124,0,124, - 2,131,2,92,2,125,11,125,12,124,11,144,1,114,10,116, - 10,116,11,124,4,100,7,100,8,133,2,25,0,131,1,124, - 11,131,2,114,246,116,11,124,4,100,8,100,9,133,2,25, - 0,131,1,124,12,107,3,144,1,114,10,116,12,160,13,100, - 10,124,3,155,2,157,2,161,1,1,0,100,0,83,0,116, - 14,160,15,124,4,100,9,100,0,133,2,25,0,161,1,125, - 13,116,16,124,13,116,17,131,2,144,1,115,56,116,18,100, - 11,124,1,155,2,100,12,157,3,131,1,130,1,124,13,83, - 0,41,13,78,41,2,114,44,0,0,0,114,13,0,0,0, - 114,5,0,0,0,114,0,0,0,0,114,85,0,0,0,90, - 5,110,101,118,101,114,90,6,97,108,119,97,121,115,114,98, - 0,0,0,114,93,0,0,0,114,94,0,0,0,122,22,98, - 121,116,101,99,111,100,101,32,105,115,32,115,116,97,108,101, - 32,102,111,114,32,122,16,99,111,109,112,105,108,101,100,32, - 109,111,100,117,108,101,32,122,21,32,105,115,32,110,111,116, - 32,97,32,99,111,100,101,32,111,98,106,101,99,116,41,19, - 114,21,0,0,0,90,13,95,99,108,97,115,115,105,102,121, - 95,112,121,99,114,77,0,0,0,218,4,95,105,109,112,90, - 21,99,104,101,99,107,95,104,97,115,104,95,98,97,115,101, - 100,95,112,121,99,115,218,15,95,103,101,116,95,112,121,99, - 95,115,111,117,114,99,101,218,11,115,111,117,114,99,101,95, - 104,97,115,104,90,17,95,82,65,87,95,77,65,71,73,67, - 95,78,85,77,66,69,82,90,18,95,118,97,108,105,100,97, - 116,101,95,104,97,115,104,95,112,121,99,218,29,95,103,101, - 116,95,109,116,105,109,101,95,97,110,100,95,115,105,122,101, - 95,111,102,95,115,111,117,114,99,101,114,146,0,0,0,114, - 2,0,0,0,114,45,0,0,0,114,78,0,0,0,218,7, - 109,97,114,115,104,97,108,90,5,108,111,97,100,115,114,15, - 0,0,0,218,10,95,99,111,100,101,95,116,121,112,101,218, - 9,84,121,112,101,69,114,114,111,114,41,14,114,32,0,0, - 0,114,57,0,0,0,114,66,0,0,0,114,38,0,0,0, - 114,125,0,0,0,90,11,101,120,99,95,100,101,116,97,105, - 108,115,114,128,0,0,0,90,10,104,97,115,104,95,98,97, - 115,101,100,90,12,99,104,101,99,107,95,115,111,117,114,99, - 101,90,12,115,111,117,114,99,101,95,98,121,116,101,115,114, - 149,0,0,0,90,12,115,111,117,114,99,101,95,109,116,105, - 109,101,90,11,115,111,117,114,99,101,95,115,105,122,101,114, - 50,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,15,95,117,110,109,97,114,115,104,97,108,95, - 99,111,100,101,104,2,0,0,115,84,0,0,0,2,2,2, - 1,6,254,2,5,18,1,12,1,8,1,12,2,4,1,12, - 1,12,1,2,1,2,255,8,1,4,255,10,2,10,1,4, - 1,4,1,2,1,4,254,2,5,4,1,8,1,8,255,12, - 2,8,1,8,3,6,255,6,3,22,3,18,1,4,255,4, - 2,8,1,4,255,4,2,18,2,12,1,16,1,4,1,255, - 128,114,154,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, - 28,0,0,0,124,0,160,0,100,1,100,2,161,2,125,0, - 124,0,160,0,100,3,100,2,161,2,125,0,124,0,83,0, - 41,4,78,115,2,0,0,0,13,10,243,1,0,0,0,10, - 243,1,0,0,0,13,41,1,114,19,0,0,0,41,1,218, - 6,115,111,117,114,99,101,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,23,95,110,111,114,109,97,108,105, - 122,101,95,108,105,110,101,95,101,110,100,105,110,103,115,155, - 2,0,0,115,8,0,0,0,12,1,12,1,4,1,255,128, - 114,158,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,6,0,0,0,67,0,0,0,115,24, - 0,0,0,116,0,124,1,131,1,125,1,116,1,124,1,124, - 0,100,1,100,2,100,3,141,4,83,0,41,4,78,114,76, - 0,0,0,84,41,1,90,12,100,111,110,116,95,105,110,104, - 101,114,105,116,41,2,114,158,0,0,0,218,7,99,111,109, - 112,105,108,101,41,2,114,57,0,0,0,114,157,0,0,0, + 0,218,8,103,101,116,95,99,111,100,101,184,0,0,0,115, + 6,0,0,0,16,6,4,1,255,128,122,20,122,105,112,105, + 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,0,0,0,0,4,0,0, + 0,8,0,0,0,67,0,0,0,115,112,0,0,0,116,0, + 114,16,124,1,160,1,116,0,116,2,161,2,125,1,124,1, + 125,2,124,1,160,3,124,0,106,4,116,2,23,0,161,1, + 114,58,124,1,116,5,124,0,106,4,116,2,23,0,131,1, + 100,1,133,2,25,0,125,2,122,14,124,0,106,6,124,2, + 25,0,125,3,87,0,110,26,4,0,116,7,121,98,1,0, + 1,0,1,0,116,8,100,2,100,3,124,2,131,3,130,1, + 48,0,116,9,124,0,106,4,124,3,131,2,83,0,41,4, + 122,154,103,101,116,95,100,97,116,97,40,112,97,116,104,110, + 97,109,101,41,32,45,62,32,115,116,114,105,110,103,32,119, + 105,116,104,32,102,105,108,101,32,100,97,116,97,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,116, + 104,101,32,100,97,116,97,32,97,115,115,111,99,105,97,116, + 101,100,32,119,105,116,104,32,39,112,97,116,104,110,97,109, + 101,39,46,32,82,97,105,115,101,32,79,83,69,114,114,111, + 114,32,105,102,10,32,32,32,32,32,32,32,32,116,104,101, + 32,102,105,108,101,32,119,97,115,110,39,116,32,102,111,117, + 110,100,46,10,32,32,32,32,32,32,32,32,78,114,0,0, + 0,0,218,0,41,10,114,18,0,0,0,114,19,0,0,0, + 114,20,0,0,0,218,10,115,116,97,114,116,115,119,105,116, + 104,114,29,0,0,0,218,3,108,101,110,114,28,0,0,0, + 114,26,0,0,0,114,22,0,0,0,218,9,95,103,101,116, + 95,100,97,116,97,41,4,114,32,0,0,0,218,8,112,97, + 116,104,110,97,109,101,90,3,107,101,121,218,9,116,111,99, + 95,101,110,116,114,121,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,8,103,101,116,95,100,97,116,97,194, + 0,0,0,115,22,0,0,0,4,6,12,1,4,2,16,1, + 22,1,2,2,14,1,12,1,14,1,12,1,255,128,122,20, + 122,105,112,105,109,112,111,114,116,101,114,46,103,101,116,95, + 100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,3,0,0,0,67,0,0,0,115,20,0, + 0,0,116,0,124,0,124,1,131,2,92,3,125,2,125,3, + 125,4,124,4,83,0,41,2,122,106,103,101,116,95,102,105, + 108,101,110,97,109,101,40,102,117,108,108,110,97,109,101,41, + 32,45,62,32,102,105,108,101,110,97,109,101,32,115,116,114, + 105,110,103,46,10,10,32,32,32,32,32,32,32,32,82,101, + 116,117,114,110,32,116,104,101,32,102,105,108,101,110,97,109, + 101,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,46,10,32,32,32,32, + 32,32,32,32,78,114,47,0,0,0,114,49,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,12, + 103,101,116,95,102,105,108,101,110,97,109,101,215,0,0,0, + 115,6,0,0,0,16,7,4,1,255,128,122,24,122,105,112, + 105,109,112,111,114,116,101,114,46,103,101,116,95,102,105,108, + 101,110,97,109,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,6,0,0,0,8,0,0,0,67,0,0,0,115,126, + 0,0,0,116,0,124,0,124,1,131,2,125,2,124,2,100, + 1,117,0,114,36,116,1,100,2,124,1,155,2,157,2,124, + 1,100,3,141,2,130,1,116,2,124,0,124,1,131,2,125, + 3,124,2,114,64,116,3,160,4,124,3,100,4,161,2,125, + 4,110,10,124,3,155,0,100,5,157,2,125,4,122,14,124, + 0,106,5,124,4,25,0,125,5,87,0,110,20,4,0,116, + 6,121,108,1,0,1,0,1,0,89,0,100,1,83,0,48, + 0,116,7,124,0,106,8,124,5,131,2,160,9,161,0,83, + 0,41,6,122,253,103,101,116,95,115,111,117,114,99,101,40, + 102,117,108,108,110,97,109,101,41,32,45,62,32,115,111,117, + 114,99,101,32,115,116,114,105,110,103,46,10,10,32,32,32, + 32,32,32,32,32,82,101,116,117,114,110,32,116,104,101,32, + 115,111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32,90,105,112,73, + 109,112,111,114,116,69,114,114,111,114,10,32,32,32,32,32, + 32,32,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,99,111,117,108,100,110,39,116,32,98,101,32,102,111,117, + 110,100,44,32,114,101,116,117,114,110,32,78,111,110,101,32, + 105,102,32,116,104,101,32,97,114,99,104,105,118,101,32,100, + 111,101,115,10,32,32,32,32,32,32,32,32,99,111,110,116, + 97,105,110,32,116,104,101,32,109,111,100,117,108,101,44,32, + 98,117,116,32,104,97,115,32,110,111,32,115,111,117,114,99, + 101,32,102,111,114,32,105,116,46,10,32,32,32,32,32,32, + 32,32,78,250,18,99,97,110,39,116,32,102,105,110,100,32, + 109,111,100,117,108,101,32,169,1,114,44,0,0,0,250,11, + 95,95,105,110,105,116,95,95,46,112,121,250,3,46,112,121, + 41,10,114,35,0,0,0,114,3,0,0,0,114,36,0,0, + 0,114,21,0,0,0,114,30,0,0,0,114,28,0,0,0, + 114,26,0,0,0,114,56,0,0,0,114,29,0,0,0,218, + 6,100,101,99,111,100,101,41,6,114,32,0,0,0,114,38, + 0,0,0,114,39,0,0,0,114,13,0,0,0,218,8,102, + 117,108,108,112,97,116,104,114,58,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,10,103,101,116, + 95,115,111,117,114,99,101,226,0,0,0,115,26,0,0,0, + 10,7,8,1,18,1,10,2,4,1,14,1,10,2,2,2, + 14,1,12,1,8,2,16,1,255,128,122,22,122,105,112,105, + 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,0,0,0,0,3, + 0,0,0,4,0,0,0,67,0,0,0,115,40,0,0,0, + 116,0,124,0,124,1,131,2,125,2,124,2,100,1,117,0, + 114,36,116,1,100,2,124,1,155,2,157,2,124,1,100,3, + 141,2,130,1,124,2,83,0,41,4,122,171,105,115,95,112, + 97,99,107,97,103,101,40,102,117,108,108,110,97,109,101,41, + 32,45,62,32,98,111,111,108,46,10,10,32,32,32,32,32, + 32,32,32,82,101,116,117,114,110,32,84,114,117,101,32,105, + 102,32,116,104,101,32,109,111,100,117,108,101,32,115,112,101, + 99,105,102,105,101,100,32,98,121,32,102,117,108,108,110,97, + 109,101,32,105,115,32,97,32,112,97,99,107,97,103,101,46, + 10,32,32,32,32,32,32,32,32,82,97,105,115,101,32,90, + 105,112,73,109,112,111,114,116,69,114,114,111,114,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,99,111,117,108, + 100,110,39,116,32,98,101,32,102,111,117,110,100,46,10,32, + 32,32,32,32,32,32,32,78,114,61,0,0,0,114,62,0, + 0,0,41,2,114,35,0,0,0,114,3,0,0,0,41,3, + 114,32,0,0,0,114,38,0,0,0,114,39,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,43, + 0,0,0,252,0,0,0,115,10,0,0,0,10,6,8,1, + 18,1,4,1,255,128,122,22,122,105,112,105,109,112,111,114, + 116,101,114,46,105,115,95,112,97,99,107,97,103,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,8, + 0,0,0,67,0,0,0,115,252,0,0,0,100,1,125,2, + 116,0,160,1,124,2,116,2,161,2,1,0,116,3,124,0, + 124,1,131,2,92,3,125,3,125,4,125,5,116,4,106,5, + 160,6,124,1,161,1,125,6,124,6,100,2,117,0,115,62, + 116,7,124,6,116,8,131,2,115,80,116,8,124,1,131,1, + 125,6,124,6,116,4,106,5,124,1,60,0,124,0,124,6, + 95,9,122,84,124,4,114,124,116,10,124,0,124,1,131,2, + 125,7,116,11,160,12,124,0,106,13,124,7,161,2,125,8, + 124,8,103,1,124,6,95,14,116,15,124,6,100,3,131,2, + 115,140,116,16,124,6,95,16,116,11,160,17,124,6,106,18, + 124,1,124,5,161,3,1,0,116,19,124,3,124,6,106,18, + 131,2,1,0,87,0,110,16,1,0,1,0,1,0,116,4, + 106,5,124,1,61,0,130,0,122,14,116,4,106,5,124,1, + 25,0,125,6,87,0,110,30,4,0,116,20,121,232,1,0, + 1,0,1,0,116,21,100,4,124,1,155,2,100,5,157,3, + 131,1,130,1,48,0,116,22,160,23,100,6,124,1,124,5, + 161,3,1,0,124,6,83,0,41,7,97,55,1,0,0,108, + 111,97,100,95,109,111,100,117,108,101,40,102,117,108,108,110, + 97,109,101,41,32,45,62,32,109,111,100,117,108,101,46,10, + 10,32,32,32,32,32,32,32,32,76,111,97,100,32,116,104, + 101,32,109,111,100,117,108,101,32,115,112,101,99,105,102,105, + 101,100,32,98,121,32,39,102,117,108,108,110,97,109,101,39, + 46,32,39,102,117,108,108,110,97,109,101,39,32,109,117,115, + 116,32,98,101,32,116,104,101,10,32,32,32,32,32,32,32, + 32,102,117,108,108,121,32,113,117,97,108,105,102,105,101,100, + 32,40,100,111,116,116,101,100,41,32,109,111,100,117,108,101, + 32,110,97,109,101,46,32,73,116,32,114,101,116,117,114,110, + 115,32,116,104,101,32,105,109,112,111,114,116,101,100,10,32, + 32,32,32,32,32,32,32,109,111,100,117,108,101,44,32,111, + 114,32,114,97,105,115,101,115,32,90,105,112,73,109,112,111, + 114,116,69,114,114,111,114,32,105,102,32,105,116,32,119,97, + 115,110,39,116,32,102,111,117,110,100,46,10,10,32,32,32, + 32,32,32,32,32,68,101,112,114,101,99,97,116,101,100,32, + 115,105,110,99,101,32,80,121,116,104,111,110,32,51,46,49, + 48,46,32,85,115,101,32,101,120,101,99,95,109,111,100,117, + 108,101,40,41,32,105,110,115,116,101,97,100,46,10,32,32, + 32,32,32,32,32,32,122,114,122,105,112,105,109,112,111,114, + 116,46,122,105,112,105,109,112,111,114,116,101,114,46,108,111, + 97,100,95,109,111,100,117,108,101,40,41,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,32,97,110,100,32,115,108, + 97,116,101,100,32,102,111,114,32,114,101,109,111,118,97,108, + 32,105,110,32,80,121,116,104,111,110,32,51,46,49,50,59, + 32,117,115,101,32,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,105,110,115,116,101,97,100,78,218,12,95,95,98, + 117,105,108,116,105,110,115,95,95,122,14,76,111,97,100,101, + 100,32,109,111,100,117,108,101,32,122,25,32,110,111,116,32, + 102,111,117,110,100,32,105,110,32,115,121,115,46,109,111,100, + 117,108,101,115,122,30,105,109,112,111,114,116,32,123,125,32, + 35,32,108,111,97,100,101,100,32,102,114,111,109,32,90,105, + 112,32,123,125,41,24,218,9,95,119,97,114,110,105,110,103, + 115,90,4,119,97,114,110,218,18,68,101,112,114,101,99,97, + 116,105,111,110,87,97,114,110,105,110,103,114,48,0,0,0, + 218,3,115,121,115,218,7,109,111,100,117,108,101,115,218,3, + 103,101,116,114,15,0,0,0,218,12,95,109,111,100,117,108, + 101,95,116,121,112,101,218,10,95,95,108,111,97,100,101,114, + 95,95,114,36,0,0,0,114,21,0,0,0,114,30,0,0, + 0,114,29,0,0,0,90,8,95,95,112,97,116,104,95,95, + 218,7,104,97,115,97,116,116,114,114,68,0,0,0,90,14, + 95,102,105,120,95,117,112,95,109,111,100,117,108,101,218,8, + 95,95,100,105,99,116,95,95,218,4,101,120,101,99,114,26, + 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, + 114,45,0,0,0,218,16,95,118,101,114,98,111,115,101,95, + 109,101,115,115,97,103,101,41,9,114,32,0,0,0,114,38, + 0,0,0,218,3,109,115,103,114,50,0,0,0,114,51,0, + 0,0,114,40,0,0,0,90,3,109,111,100,114,13,0,0, + 0,114,66,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,11,108,111,97,100,95,109,111,100,117, + 108,101,9,1,0,0,115,54,0,0,0,4,9,12,2,16, + 1,12,1,18,1,8,1,10,1,6,1,2,2,4,1,10, + 3,14,1,8,1,10,2,6,1,16,1,16,1,6,1,8, + 1,2,1,2,2,14,1,12,1,18,1,14,1,4,1,255, + 128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,64,0,0,0,122,20,124,0,160,0,124,1, + 161,1,115,18,87,0,100,1,83,0,87,0,110,20,4,0, + 116,1,121,40,1,0,1,0,1,0,89,0,100,1,83,0, + 48,0,100,2,100,3,108,2,109,3,125,2,1,0,124,2, + 124,0,124,1,131,2,83,0,41,4,122,204,82,101,116,117, + 114,110,32,116,104,101,32,82,101,115,111,117,114,99,101,82, + 101,97,100,101,114,32,102,111,114,32,97,32,112,97,99,107, + 97,103,101,32,105,110,32,97,32,122,105,112,32,102,105,108, + 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,39, + 102,117,108,108,110,97,109,101,39,32,105,115,32,97,32,112, + 97,99,107,97,103,101,32,119,105,116,104,105,110,32,116,104, + 101,32,122,105,112,32,102,105,108,101,44,32,114,101,116,117, + 114,110,32,116,104,101,10,32,32,32,32,32,32,32,32,39, + 82,101,115,111,117,114,99,101,82,101,97,100,101,114,39,32, + 111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,112, + 97,99,107,97,103,101,46,32,32,79,116,104,101,114,119,105, + 115,101,32,114,101,116,117,114,110,32,78,111,110,101,46,10, + 32,32,32,32,32,32,32,32,78,114,0,0,0,0,41,1, + 218,9,90,105,112,82,101,97,100,101,114,41,4,114,43,0, + 0,0,114,3,0,0,0,90,17,105,109,112,111,114,116,108, + 105,98,46,114,101,97,100,101,114,115,114,83,0,0,0,41, + 3,114,32,0,0,0,114,38,0,0,0,114,83,0,0,0, 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 15,95,99,111,109,112,105,108,101,95,115,111,117,114,99,101, - 162,2,0,0,115,6,0,0,0,8,1,16,1,255,128,114, - 160,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,11,0,0,0,67,0,0,0,115,68,0, - 0,0,116,0,160,1,124,0,100,1,63,0,100,2,23,0, - 124,0,100,3,63,0,100,4,64,0,124,0,100,5,64,0, - 124,1,100,6,63,0,124,1,100,3,63,0,100,7,64,0, - 124,1,100,5,64,0,100,8,20,0,100,9,100,9,100,9, - 102,9,161,1,83,0,41,10,78,233,9,0,0,0,105,188, - 7,0,0,233,5,0,0,0,233,15,0,0,0,233,31,0, - 0,0,233,11,0,0,0,233,63,0,0,0,114,85,0,0, - 0,114,14,0,0,0,41,2,114,130,0,0,0,90,6,109, - 107,116,105,109,101,41,2,218,1,100,114,137,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,14, - 95,112,97,114,115,101,95,100,111,115,116,105,109,101,168,2, - 0,0,115,20,0,0,0,4,1,10,1,10,1,6,1,6, - 1,10,1,10,1,6,1,6,249,255,128,114,168,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,6,0,0, - 0,10,0,0,0,67,0,0,0,115,110,0,0,0,122,82, - 124,1,100,1,100,0,133,2,25,0,100,2,118,0,115,22, - 74,0,130,1,124,1,100,0,100,1,133,2,25,0,125,1, - 124,0,106,0,124,1,25,0,125,2,124,2,100,3,25,0, - 125,3,124,2,100,4,25,0,125,4,124,2,100,5,25,0, - 125,5,116,1,124,4,124,3,131,2,124,5,102,2,87,0, - 83,0,4,0,116,2,116,3,116,4,102,3,121,108,1,0, - 1,0,1,0,89,0,100,6,83,0,48,0,41,7,78,114, - 14,0,0,0,169,2,218,1,99,218,1,111,114,162,0,0, - 0,233,6,0,0,0,233,3,0,0,0,41,2,114,0,0, - 0,0,114,0,0,0,0,41,5,114,28,0,0,0,114,168, - 0,0,0,114,26,0,0,0,218,10,73,110,100,101,120,69, - 114,114,111,114,114,153,0,0,0,41,6,114,32,0,0,0, - 114,13,0,0,0,114,58,0,0,0,114,130,0,0,0,114, - 131,0,0,0,90,17,117,110,99,111,109,112,114,101,115,115, - 101,100,95,115,105,122,101,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,114,150,0,0,0,181,2,0,0,115, - 22,0,0,0,2,1,20,2,12,1,10,1,8,3,8,1, - 8,1,16,1,18,1,8,1,255,128,114,150,0,0,0,99, + 19,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, + 97,100,101,114,52,1,0,0,115,16,0,0,0,2,6,10, + 1,10,1,12,1,8,1,12,1,10,1,255,128,122,31,122, + 105,112,105,109,112,111,114,116,101,114,46,103,101,116,95,114, + 101,115,111,117,114,99,101,95,114,101,97,100,101,114,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5, + 0,0,0,67,0,0,0,115,24,0,0,0,100,1,124,0, + 106,0,155,0,116,1,155,0,124,0,106,2,155,0,100,2, + 157,5,83,0,41,3,78,122,21,60,122,105,112,105,109,112, + 111,114,116,101,114,32,111,98,106,101,99,116,32,34,122,2, + 34,62,41,3,114,29,0,0,0,114,20,0,0,0,114,31, + 0,0,0,41,1,114,32,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,8,95,95,114,101,112, + 114,95,95,67,1,0,0,115,4,0,0,0,24,1,255,128, + 122,20,122,105,112,105,109,112,111,114,116,101,114,46,95,95, + 114,101,112,114,95,95,41,1,78,41,1,78,41,1,78,41, + 16,114,6,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,7,95,95,100,111,99,95,95,114,34,0,0,0,114,41, + 0,0,0,114,42,0,0,0,114,46,0,0,0,114,52,0, + 0,0,114,59,0,0,0,114,60,0,0,0,114,67,0,0, + 0,114,43,0,0,0,114,82,0,0,0,114,84,0,0,0, + 114,85,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,4,0,0,0,46,0, + 0,0,115,30,0,0,0,8,0,4,1,8,17,10,46,10, + 34,10,13,8,27,8,10,8,21,8,11,8,26,8,13,8, + 43,12,15,255,128,122,12,95,95,105,110,105,116,95,95,46, + 112,121,99,84,114,63,0,0,0,70,41,3,122,4,46,112, + 121,99,84,70,41,3,114,64,0,0,0,70,70,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,67,0,0,0,115,20,0,0,0,124,0,106,0,124, + 1,160,1,100,1,161,1,100,2,25,0,23,0,83,0,41, + 3,78,218,1,46,233,2,0,0,0,41,2,114,31,0,0, + 0,218,10,114,112,97,114,116,105,116,105,111,110,41,2,114, + 32,0,0,0,114,38,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,36,0,0,0,85,1,0, + 0,115,4,0,0,0,20,1,255,128,114,36,0,0,0,99, 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 8,0,0,0,67,0,0,0,115,80,0,0,0,124,1,100, - 1,100,0,133,2,25,0,100,2,118,0,115,20,74,0,130, - 1,124,1,100,0,100,1,133,2,25,0,125,1,122,14,124, - 0,106,0,124,1,25,0,125,2,87,0,110,20,4,0,116, - 1,121,66,1,0,1,0,1,0,89,0,100,0,83,0,48, - 0,116,2,124,0,106,3,124,2,131,2,83,0,41,3,78, - 114,14,0,0,0,114,169,0,0,0,41,4,114,28,0,0, - 0,114,26,0,0,0,114,56,0,0,0,114,29,0,0,0, - 41,3,114,32,0,0,0,114,13,0,0,0,114,58,0,0, + 2,0,0,0,67,0,0,0,115,18,0,0,0,124,1,116, + 0,23,0,125,2,124,2,124,0,106,1,118,0,83,0,169, + 1,78,41,2,114,20,0,0,0,114,28,0,0,0,41,3, + 114,32,0,0,0,114,13,0,0,0,90,7,100,105,114,112, + 97,116,104,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,37,0,0,0,89,1,0,0,115,6,0,0,0, + 8,4,10,2,255,128,114,37,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,7,0,0,0,4,0,0,0, + 67,0,0,0,115,54,0,0,0,116,0,124,0,124,1,131, + 2,125,2,116,1,68,0,93,34,92,3,125,3,125,4,125, + 5,124,2,124,3,23,0,125,6,124,6,124,0,106,2,118, + 0,114,14,124,5,2,0,1,0,83,0,100,0,83,0,114, + 90,0,0,0,41,3,114,36,0,0,0,218,16,95,122,105, + 112,95,115,101,97,114,99,104,111,114,100,101,114,114,28,0, + 0,0,41,7,114,32,0,0,0,114,38,0,0,0,114,13, + 0,0,0,218,6,115,117,102,102,105,120,218,10,105,115,98, + 121,116,101,99,111,100,101,114,51,0,0,0,114,66,0,0, 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 114,148,0,0,0,200,2,0,0,115,16,0,0,0,20,2, - 12,1,2,2,14,1,12,1,8,1,12,2,255,128,114,148, - 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 11,0,0,0,9,0,0,0,67,0,0,0,115,190,0,0, - 0,116,0,124,0,124,1,131,2,125,2,116,1,68,0,93, - 156,92,3,125,3,125,4,125,5,124,2,124,3,23,0,125, - 6,116,2,106,3,100,1,124,0,106,4,116,5,124,6,100, - 2,100,3,141,5,1,0,122,14,124,0,106,6,124,6,25, - 0,125,7,87,0,110,18,4,0,116,7,121,86,1,0,1, - 0,1,0,89,0,113,14,48,0,124,7,100,4,25,0,125, - 8,116,8,124,0,106,4,124,7,131,2,125,9,124,4,114, - 130,116,9,124,0,124,8,124,6,124,1,124,9,131,5,125, - 10,110,10,116,10,124,8,124,9,131,2,125,10,124,10,100, - 0,117,0,114,150,113,14,124,7,100,4,25,0,125,8,124, - 10,124,5,124,8,102,3,2,0,1,0,83,0,116,11,100, - 5,124,1,155,2,157,2,124,1,100,6,141,2,130,1,41, - 7,78,122,13,116,114,121,105,110,103,32,123,125,123,125,123, - 125,114,85,0,0,0,41,1,90,9,118,101,114,98,111,115, - 105,116,121,114,0,0,0,0,114,61,0,0,0,114,62,0, - 0,0,41,12,114,36,0,0,0,114,88,0,0,0,114,45, - 0,0,0,114,78,0,0,0,114,29,0,0,0,114,20,0, - 0,0,114,28,0,0,0,114,26,0,0,0,114,56,0,0, - 0,114,154,0,0,0,114,160,0,0,0,114,3,0,0,0, - 41,11,114,32,0,0,0,114,38,0,0,0,114,13,0,0, - 0,114,89,0,0,0,114,90,0,0,0,114,51,0,0,0, - 114,66,0,0,0,114,58,0,0,0,114,40,0,0,0,114, - 125,0,0,0,114,50,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,48,0,0,0,215,2,0, - 0,115,38,0,0,0,10,1,14,1,8,1,22,1,2,1, - 14,1,12,1,6,1,8,2,12,1,4,1,18,1,10,2, - 8,1,2,3,8,1,14,1,18,2,255,128,114,48,0,0, - 0,41,45,114,83,0,0,0,90,26,95,102,114,111,122,101, - 110,95,105,109,112,111,114,116,108,105,98,95,101,120,116,101, - 114,110,97,108,114,21,0,0,0,114,1,0,0,0,114,2, - 0,0,0,90,17,95,102,114,111,122,101,110,95,105,109,112, - 111,114,116,108,105,98,114,45,0,0,0,114,147,0,0,0, - 114,109,0,0,0,114,151,0,0,0,114,69,0,0,0,114, - 130,0,0,0,90,7,95,95,97,108,108,95,95,114,20,0, - 0,0,90,15,112,97,116,104,95,115,101,112,97,114,97,116, - 111,114,115,114,18,0,0,0,114,77,0,0,0,114,3,0, - 0,0,114,25,0,0,0,218,4,116,121,112,101,114,72,0, - 0,0,114,112,0,0,0,114,114,0,0,0,114,116,0,0, - 0,90,13,95,76,111,97,100,101,114,66,97,115,105,99,115, - 114,4,0,0,0,114,88,0,0,0,114,36,0,0,0,114, - 37,0,0,0,114,35,0,0,0,114,27,0,0,0,114,121, - 0,0,0,114,141,0,0,0,114,143,0,0,0,114,56,0, - 0,0,114,146,0,0,0,114,154,0,0,0,218,8,95,95, - 99,111,100,101,95,95,114,152,0,0,0,114,158,0,0,0, - 114,160,0,0,0,114,168,0,0,0,114,150,0,0,0,114, - 148,0,0,0,114,48,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,8,60, - 109,111,100,117,108,101,62,1,0,0,0,115,90,0,0,0, - 4,0,8,16,16,1,8,1,8,1,8,1,8,1,8,1, - 8,1,8,2,6,3,14,1,16,3,4,4,8,2,4,2, - 4,1,4,1,18,2,0,127,0,127,12,30,12,1,2,1, - 2,1,4,252,8,9,8,4,8,9,8,31,2,126,2,254, - 4,29,8,5,8,21,8,46,8,10,10,46,8,5,8,7, - 8,6,8,13,8,19,12,15,255,128, + 114,35,0,0,0,98,1,0,0,115,14,0,0,0,10,1, + 14,1,8,1,10,1,8,1,4,1,255,128,114,35,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,26,0, + 0,0,9,0,0,0,67,0,0,0,115,230,4,0,0,122, + 14,116,0,160,1,124,0,161,1,125,1,87,0,110,32,4, + 0,116,2,121,46,1,0,1,0,1,0,116,3,100,1,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,48,0,124, + 1,144,4,143,140,1,0,122,36,124,1,160,4,116,5,11, + 0,100,3,161,2,1,0,124,1,160,6,161,0,125,2,124, + 1,160,7,116,5,161,1,125,3,87,0,110,32,4,0,116, + 2,121,124,1,0,1,0,1,0,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,48,0,116,8,124, + 3,131,1,116,5,107,3,114,156,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,124,3,100,0,100, + 5,133,2,25,0,116,9,107,3,144,1,114,154,122,24,124, + 1,160,4,100,6,100,3,161,2,1,0,124,1,160,6,161, + 0,125,4,87,0,110,32,4,0,116,2,121,230,1,0,1, + 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,48,0,116,10,124,4,116,11,24,0,116, + 5,24,0,100,6,131,2,125,5,122,22,124,1,160,4,124, + 5,161,1,1,0,124,1,160,7,161,0,125,6,87,0,110, + 34,4,0,116,2,144,1,121,50,1,0,1,0,1,0,116, + 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,48,0,124,6,160,12,116,9,161,1,125,7,124,7,100, + 6,107,0,144,1,114,90,116,3,100,7,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,124,6,124,7,124,7,116, + 5,23,0,133,2,25,0,125,3,116,8,124,3,131,1,116, + 5,107,3,144,1,114,138,116,3,100,8,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,124,4,116,8,124,6,131, + 1,24,0,124,7,23,0,125,2,116,13,124,3,100,9,100, + 10,133,2,25,0,131,1,125,8,116,13,124,3,100,10,100, + 11,133,2,25,0,131,1,125,9,124,2,124,8,107,0,144, + 1,114,214,116,3,100,12,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,124,2,124,9,107,0,144,1,114,242,116, + 3,100,13,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,124,2,124,8,56,0,125,2,124,2,124,9,24,0,125, + 10,124,10,100,6,107,0,144,2,114,30,116,3,100,14,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,105,0,125, + 11,100,6,125,12,122,14,124,1,160,4,124,2,161,1,1, + 0,87,0,110,34,4,0,116,2,144,2,121,86,1,0,1, + 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,48,0,124,1,160,7,100,15,161,1,125, + 3,116,8,124,3,131,1,100,5,107,0,144,2,114,120,116, + 14,100,16,131,1,130,1,124,3,100,0,100,5,133,2,25, + 0,100,17,107,3,144,2,114,142,144,4,113,180,116,8,124, + 3,131,1,100,15,107,3,144,2,114,164,116,14,100,16,131, + 1,130,1,116,15,124,3,100,18,100,19,133,2,25,0,131, + 1,125,13,116,15,124,3,100,19,100,9,133,2,25,0,131, + 1,125,14,116,15,124,3,100,9,100,20,133,2,25,0,131, + 1,125,15,116,15,124,3,100,20,100,10,133,2,25,0,131, + 1,125,16,116,13,124,3,100,10,100,11,133,2,25,0,131, + 1,125,17,116,13,124,3,100,11,100,21,133,2,25,0,131, + 1,125,18,116,13,124,3,100,21,100,22,133,2,25,0,131, + 1,125,4,116,15,124,3,100,22,100,23,133,2,25,0,131, + 1,125,19,116,15,124,3,100,23,100,24,133,2,25,0,131, + 1,125,20,116,15,124,3,100,24,100,25,133,2,25,0,131, + 1,125,21,116,13,124,3,100,26,100,15,133,2,25,0,131, + 1,125,22,124,19,124,20,23,0,124,21,23,0,125,8,124, + 22,124,9,107,4,144,3,114,124,116,3,100,27,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,124,22,124,10,55, + 0,125,22,122,14,124,1,160,7,124,19,161,1,125,23,87, + 0,110,34,4,0,116,2,144,3,121,180,1,0,1,0,1, + 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, + 2,130,1,48,0,116,8,124,23,131,1,124,19,107,3,144, + 3,114,214,116,3,100,4,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,122,50,116,8,124,1,160,7,124,8,124, + 19,24,0,161,1,131,1,124,8,124,19,24,0,107,3,144, + 4,114,6,116,3,100,4,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,87,0,110,34,4,0,116,2,144,4,121, + 42,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,48,0,124,13,100,28,64, + 0,144,4,114,64,124,23,160,16,161,0,125,23,110,52,122, + 14,124,23,160,16,100,29,161,1,125,23,87,0,110,36,4, + 0,116,17,144,4,121,114,1,0,1,0,1,0,124,23,160, + 16,100,30,161,1,160,18,116,19,161,1,125,23,89,0,110, + 2,48,0,124,23,160,20,100,31,116,21,161,2,125,23,116, + 22,160,23,124,0,124,23,161,2,125,24,124,24,124,14,124, + 18,124,4,124,22,124,15,124,16,124,17,102,8,125,25,124, + 25,124,11,124,23,60,0,124,12,100,32,55,0,125,12,144, + 2,113,88,87,0,100,0,4,0,4,0,131,3,1,0,110, + 18,49,0,144,4,115,202,48,0,1,0,1,0,1,0,89, + 0,1,0,116,24,160,25,100,33,124,12,124,0,161,3,1, + 0,124,11,83,0,41,34,78,122,21,99,97,110,39,116,32, + 111,112,101,110,32,90,105,112,32,102,105,108,101,58,32,114, + 12,0,0,0,114,88,0,0,0,250,21,99,97,110,39,116, + 32,114,101,97,100,32,90,105,112,32,102,105,108,101,58,32, + 233,4,0,0,0,114,0,0,0,0,122,16,110,111,116,32, + 97,32,90,105,112,32,102,105,108,101,58,32,122,18,99,111, + 114,114,117,112,116,32,90,105,112,32,102,105,108,101,58,32, + 233,12,0,0,0,233,16,0,0,0,233,20,0,0,0,122, + 28,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, + 101,99,116,111,114,121,32,115,105,122,101,58,32,122,30,98, + 97,100,32,99,101,110,116,114,97,108,32,100,105,114,101,99, + 116,111,114,121,32,111,102,102,115,101,116,58,32,122,38,98, + 97,100,32,99,101,110,116,114,97,108,32,100,105,114,101,99, + 116,111,114,121,32,115,105,122,101,32,111,114,32,111,102,102, + 115,101,116,58,32,233,46,0,0,0,250,27,69,79,70,32, + 114,101,97,100,32,119,104,101,114,101,32,110,111,116,32,101, + 120,112,101,99,116,101,100,115,4,0,0,0,80,75,1,2, + 233,8,0,0,0,233,10,0,0,0,233,14,0,0,0,233, + 24,0,0,0,233,28,0,0,0,233,30,0,0,0,233,32, + 0,0,0,233,34,0,0,0,233,42,0,0,0,122,25,98, + 97,100,32,108,111,99,97,108,32,104,101,97,100,101,114,32, + 111,102,102,115,101,116,58,32,105,0,8,0,0,218,5,97, + 115,99,105,105,90,6,108,97,116,105,110,49,250,1,47,114, + 5,0,0,0,122,33,122,105,112,105,109,112,111,114,116,58, + 32,102,111,117,110,100,32,123,125,32,110,97,109,101,115,32, + 105,110,32,123,33,114,125,41,26,218,3,95,105,111,218,9, + 111,112,101,110,95,99,111,100,101,114,22,0,0,0,114,3, + 0,0,0,218,4,115,101,101,107,218,20,69,78,68,95,67, + 69,78,84,82,65,76,95,68,73,82,95,83,73,90,69,90, + 4,116,101,108,108,218,4,114,101,97,100,114,55,0,0,0, + 218,18,83,84,82,73,78,71,95,69,78,68,95,65,82,67, + 72,73,86,69,218,3,109,97,120,218,15,77,65,88,95,67, + 79,77,77,69,78,84,95,76,69,78,218,5,114,102,105,110, + 100,114,2,0,0,0,218,8,69,79,70,69,114,114,111,114, + 114,1,0,0,0,114,65,0,0,0,218,18,85,110,105,99, + 111,100,101,68,101,99,111,100,101,69,114,114,111,114,218,9, + 116,114,97,110,115,108,97,116,101,218,11,99,112,52,51,55, + 95,116,97,98,108,101,114,19,0,0,0,114,20,0,0,0, + 114,21,0,0,0,114,30,0,0,0,114,45,0,0,0,114, + 80,0,0,0,41,26,114,29,0,0,0,218,2,102,112,90, + 15,104,101,97,100,101,114,95,112,111,115,105,116,105,111,110, + 218,6,98,117,102,102,101,114,218,9,102,105,108,101,95,115, + 105,122,101,90,17,109,97,120,95,99,111,109,109,101,110,116, + 95,115,116,97,114,116,218,4,100,97,116,97,90,3,112,111, + 115,218,11,104,101,97,100,101,114,95,115,105,122,101,90,13, + 104,101,97,100,101,114,95,111,102,102,115,101,116,90,10,97, + 114,99,95,111,102,102,115,101,116,114,33,0,0,0,218,5, + 99,111,117,110,116,218,5,102,108,97,103,115,218,8,99,111, + 109,112,114,101,115,115,218,4,116,105,109,101,218,4,100,97, + 116,101,218,3,99,114,99,218,9,100,97,116,97,95,115,105, + 122,101,218,9,110,97,109,101,95,115,105,122,101,218,10,101, + 120,116,114,97,95,115,105,122,101,90,12,99,111,109,109,101, + 110,116,95,115,105,122,101,218,11,102,105,108,101,95,111,102, + 102,115,101,116,114,44,0,0,0,114,13,0,0,0,218,1, + 116,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,27,0,0,0,129,1,0,0,115,214,0,0,0,2,1, + 14,1,12,1,20,1,8,2,2,1,14,1,8,1,14,1, + 12,1,20,1,12,1,18,1,18,1,2,3,12,1,12,1, + 12,1,10,1,2,1,8,255,8,2,2,1,2,255,2,1, + 4,255,2,2,10,1,12,1,14,1,10,1,2,1,8,255, + 10,2,10,1,10,1,2,1,6,255,16,2,14,1,10,1, + 2,1,6,255,16,2,16,2,16,1,10,1,18,1,10,1, + 18,1,8,1,8,1,10,1,18,1,4,2,4,2,2,1, + 14,1,14,1,20,1,10,2,14,1,8,1,18,2,4,1, + 14,1,8,1,16,1,16,1,16,1,16,1,16,1,16,1, + 16,1,16,1,16,1,16,1,16,1,12,1,10,1,18,1, + 8,1,2,2,14,1,14,1,20,1,14,1,18,1,2,4, + 28,1,22,1,14,1,20,1,10,2,10,2,2,3,14,1, + 14,1,22,1,12,2,12,1,20,1,8,1,44,1,14,1, + 4,1,255,128,114,27,0,0,0,117,190,1,0,0,0,1, + 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, + 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33, + 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49, + 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65, + 66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81, + 82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97, + 98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113, + 114,115,116,117,118,119,120,121,122,123,124,125,126,127,195,135, + 195,188,195,169,195,162,195,164,195,160,195,165,195,167,195,170, + 195,171,195,168,195,175,195,174,195,172,195,132,195,133,195,137, + 195,166,195,134,195,180,195,182,195,178,195,187,195,185,195,191, + 195,150,195,156,194,162,194,163,194,165,226,130,167,198,146,195, + 161,195,173,195,179,195,186,195,177,195,145,194,170,194,186,194, + 191,226,140,144,194,172,194,189,194,188,194,161,194,171,194,187, + 226,150,145,226,150,146,226,150,147,226,148,130,226,148,164,226, + 149,161,226,149,162,226,149,150,226,149,149,226,149,163,226,149, + 145,226,149,151,226,149,157,226,149,156,226,149,155,226,148,144, + 226,148,148,226,148,180,226,148,172,226,148,156,226,148,128,226, + 148,188,226,149,158,226,149,159,226,149,154,226,149,148,226,149, + 169,226,149,166,226,149,160,226,149,144,226,149,172,226,149,167, + 226,149,168,226,149,164,226,149,165,226,149,153,226,149,152,226, + 149,146,226,149,147,226,149,171,226,149,170,226,148,152,226,148, + 140,226,150,136,226,150,132,226,150,140,226,150,144,226,150,128, + 206,177,195,159,206,147,207,128,206,163,207,131,194,181,207,132, + 206,166,206,152,206,169,206,180,226,136,158,207,134,206,181,226, + 136,169,226,137,161,194,177,226,137,165,226,137,164,226,140,160, + 226,140,161,195,183,226,137,136,194,176,226,136,153,194,183,226, + 136,154,226,129,191,194,178,226,150,160,194,160,99,0,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, + 0,67,0,0,0,115,106,0,0,0,116,0,114,22,116,1, + 160,2,100,1,161,1,1,0,116,3,100,2,131,1,130,1, + 100,3,97,0,122,58,122,16,100,4,100,5,108,4,109,5, + 125,0,1,0,87,0,110,32,4,0,116,6,121,76,1,0, + 1,0,1,0,116,1,160,2,100,1,161,1,1,0,116,3, + 100,2,131,1,130,1,48,0,87,0,100,6,97,0,110,6, + 100,6,97,0,48,0,116,1,160,2,100,7,161,1,1,0, + 124,0,83,0,41,8,78,122,27,122,105,112,105,109,112,111, + 114,116,58,32,122,108,105,98,32,85,78,65,86,65,73,76, + 65,66,76,69,250,41,99,97,110,39,116,32,100,101,99,111, + 109,112,114,101,115,115,32,100,97,116,97,59,32,122,108,105, + 98,32,110,111,116,32,97,118,97,105,108,97,98,108,101,84, + 114,0,0,0,0,169,1,218,10,100,101,99,111,109,112,114, + 101,115,115,70,122,25,122,105,112,105,109,112,111,114,116,58, + 32,122,108,105,98,32,97,118,97,105,108,97,98,108,101,41, + 7,218,15,95,105,109,112,111,114,116,105,110,103,95,122,108, + 105,98,114,45,0,0,0,114,80,0,0,0,114,3,0,0, + 0,90,4,122,108,105,98,114,143,0,0,0,218,9,69,120, + 99,101,112,116,105,111,110,114,142,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,20,95,103,101, + 116,95,100,101,99,111,109,112,114,101,115,115,95,102,117,110, + 99,31,2,0,0,115,26,0,0,0,4,2,10,3,8,1, + 4,2,4,1,16,1,12,1,10,1,12,1,12,2,10,2, + 4,1,255,128,114,146,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,17,0,0,0,9,0,0,0,67,0, + 0,0,115,132,1,0,0,124,1,92,8,125,2,125,3,125, + 4,125,5,125,6,125,7,125,8,125,9,124,4,100,1,107, + 0,114,36,116,0,100,2,131,1,130,1,116,1,160,2,124, + 0,161,1,144,1,143,6,125,10,122,14,124,10,160,3,124, + 6,161,1,1,0,87,0,110,32,4,0,116,4,121,96,1, + 0,1,0,1,0,116,0,100,3,124,0,155,2,157,2,124, + 0,100,4,141,2,130,1,48,0,124,10,160,5,100,5,161, + 1,125,11,116,6,124,11,131,1,100,5,107,3,114,128,116, + 7,100,6,131,1,130,1,124,11,100,0,100,7,133,2,25, + 0,100,8,107,3,114,162,116,0,100,9,124,0,155,2,157, + 2,124,0,100,4,141,2,130,1,116,8,124,11,100,10,100, + 11,133,2,25,0,131,1,125,12,116,8,124,11,100,11,100, + 5,133,2,25,0,131,1,125,13,100,5,124,12,23,0,124, + 13,23,0,125,14,124,6,124,14,55,0,125,6,122,14,124, + 10,160,3,124,6,161,1,1,0,87,0,110,34,4,0,116, + 4,144,1,121,6,1,0,1,0,1,0,116,0,100,3,124, + 0,155,2,157,2,124,0,100,4,141,2,130,1,48,0,124, + 10,160,5,124,4,161,1,125,15,116,6,124,15,131,1,124, + 4,107,3,144,1,114,40,116,4,100,12,131,1,130,1,87, + 0,100,0,4,0,4,0,131,3,1,0,110,18,49,0,144, + 1,115,62,48,0,1,0,1,0,1,0,89,0,1,0,124, + 3,100,1,107,2,144,1,114,86,124,15,83,0,122,10,116, + 9,131,0,125,16,87,0,110,24,4,0,116,10,144,1,121, + 120,1,0,1,0,1,0,116,0,100,13,131,1,130,1,48, + 0,124,16,124,15,100,14,131,2,83,0,41,15,78,114,0, + 0,0,0,122,18,110,101,103,97,116,105,118,101,32,100,97, + 116,97,32,115,105,122,101,114,94,0,0,0,114,12,0,0, + 0,114,106,0,0,0,114,100,0,0,0,114,95,0,0,0, + 115,4,0,0,0,80,75,3,4,122,23,98,97,100,32,108, + 111,99,97,108,32,102,105,108,101,32,104,101,97,100,101,114, + 58,32,233,26,0,0,0,114,105,0,0,0,122,26,122,105, + 112,105,109,112,111,114,116,58,32,99,97,110,39,116,32,114, + 101,97,100,32,100,97,116,97,114,141,0,0,0,105,241,255, + 255,255,41,11,114,3,0,0,0,114,112,0,0,0,114,113, + 0,0,0,114,114,0,0,0,114,22,0,0,0,114,116,0, + 0,0,114,55,0,0,0,114,121,0,0,0,114,1,0,0, + 0,114,146,0,0,0,114,145,0,0,0,41,17,114,29,0, + 0,0,114,58,0,0,0,90,8,100,97,116,97,112,97,116, + 104,114,132,0,0,0,114,136,0,0,0,114,127,0,0,0, + 114,139,0,0,0,114,133,0,0,0,114,134,0,0,0,114, + 135,0,0,0,114,125,0,0,0,114,126,0,0,0,114,137, + 0,0,0,114,138,0,0,0,114,129,0,0,0,90,8,114, + 97,119,95,100,97,116,97,114,143,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,114,56,0,0,0, + 52,2,0,0,115,64,0,0,0,20,1,8,1,8,1,14, + 2,2,2,14,1,12,1,20,1,10,1,12,1,8,1,16, + 2,18,2,16,2,16,1,12,1,8,1,2,1,14,1,14, + 1,20,1,10,1,14,1,40,1,10,2,4,2,2,3,10, + 1,14,1,10,1,10,1,255,128,114,56,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,67,0,0,0,115,16,0,0,0,116,0,124,0, + 124,1,24,0,131,1,100,1,107,1,83,0,41,2,78,114, + 5,0,0,0,41,1,218,3,97,98,115,41,2,90,2,116, + 49,90,2,116,50,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,9,95,101,113,95,109,116,105,109,101,98, + 2,0,0,115,4,0,0,0,16,2,255,128,114,149,0,0, + 0,99,5,0,0,0,0,0,0,0,0,0,0,0,14,0, + 0,0,8,0,0,0,67,0,0,0,115,60,1,0,0,124, + 3,124,2,100,1,156,2,125,5,122,18,116,0,160,1,124, + 4,124,3,124,5,161,3,125,6,87,0,110,20,4,0,116, + 2,121,48,1,0,1,0,1,0,89,0,100,0,83,0,48, + 0,124,6,100,2,64,0,100,3,107,3,125,7,124,7,114, + 182,124,6,100,4,64,0,100,3,107,3,125,8,116,3,106, + 4,100,5,107,3,144,1,114,10,124,8,115,106,116,3,106, + 4,100,6,107,2,144,1,114,10,116,5,124,0,124,2,131, + 2,125,9,124,9,100,0,117,1,144,1,114,10,116,3,160, + 6,116,0,106,7,124,9,161,2,125,10,122,20,116,0,160, + 8,124,4,124,10,124,3,124,5,161,4,1,0,87,0,110, + 104,4,0,116,2,121,180,1,0,1,0,1,0,89,0,100, + 0,83,0,48,0,116,9,124,0,124,2,131,2,92,2,125, + 11,125,12,124,11,144,1,114,10,116,10,116,11,124,4,100, + 7,100,8,133,2,25,0,131,1,124,11,131,2,114,246,116, + 11,124,4,100,8,100,9,133,2,25,0,131,1,124,12,107, + 3,144,1,114,10,116,12,160,13,100,10,124,3,155,2,157, + 2,161,1,1,0,100,0,83,0,116,14,160,15,124,4,100, + 9,100,0,133,2,25,0,161,1,125,13,116,16,124,13,116, + 17,131,2,144,1,115,56,116,18,100,11,124,1,155,2,100, + 12,157,3,131,1,130,1,124,13,83,0,41,13,78,41,2, + 114,44,0,0,0,114,13,0,0,0,114,5,0,0,0,114, + 0,0,0,0,114,88,0,0,0,90,5,110,101,118,101,114, + 90,6,97,108,119,97,121,115,114,101,0,0,0,114,96,0, + 0,0,114,97,0,0,0,122,22,98,121,116,101,99,111,100, + 101,32,105,115,32,115,116,97,108,101,32,102,111,114,32,122, + 16,99,111,109,112,105,108,101,100,32,109,111,100,117,108,101, + 32,122,21,32,105,115,32,110,111,116,32,97,32,99,111,100, + 101,32,111,98,106,101,99,116,41,19,114,21,0,0,0,90, + 13,95,99,108,97,115,115,105,102,121,95,112,121,99,114,79, + 0,0,0,218,4,95,105,109,112,90,21,99,104,101,99,107, + 95,104,97,115,104,95,98,97,115,101,100,95,112,121,99,115, + 218,15,95,103,101,116,95,112,121,99,95,115,111,117,114,99, + 101,218,11,115,111,117,114,99,101,95,104,97,115,104,90,17, + 95,82,65,87,95,77,65,71,73,67,95,78,85,77,66,69, + 82,90,18,95,118,97,108,105,100,97,116,101,95,104,97,115, + 104,95,112,121,99,218,29,95,103,101,116,95,109,116,105,109, + 101,95,97,110,100,95,115,105,122,101,95,111,102,95,115,111, + 117,114,99,101,114,149,0,0,0,114,2,0,0,0,114,45, + 0,0,0,114,80,0,0,0,218,7,109,97,114,115,104,97, + 108,90,5,108,111,97,100,115,114,15,0,0,0,218,10,95, + 99,111,100,101,95,116,121,112,101,218,9,84,121,112,101,69, + 114,114,111,114,41,14,114,32,0,0,0,114,57,0,0,0, + 114,66,0,0,0,114,38,0,0,0,114,128,0,0,0,90, + 11,101,120,99,95,100,101,116,97,105,108,115,114,131,0,0, + 0,90,10,104,97,115,104,95,98,97,115,101,100,90,12,99, + 104,101,99,107,95,115,111,117,114,99,101,90,12,115,111,117, + 114,99,101,95,98,121,116,101,115,114,152,0,0,0,90,12, + 115,111,117,114,99,101,95,109,116,105,109,101,90,11,115,111, + 117,114,99,101,95,115,105,122,101,114,50,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,15,95, + 117,110,109,97,114,115,104,97,108,95,99,111,100,101,108,2, + 0,0,115,84,0,0,0,2,2,2,1,6,254,2,5,18, + 1,12,1,8,1,12,2,4,1,12,1,12,1,2,1,2, + 255,8,1,4,255,10,2,10,1,4,1,4,1,2,1,4, + 254,2,5,4,1,8,1,8,255,12,2,8,1,8,3,6, + 255,6,3,22,3,18,1,4,255,4,2,8,1,4,255,4, + 2,18,2,12,1,16,1,4,1,255,128,114,157,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,4,0,0,0,67,0,0,0,115,28,0,0,0,124,0, + 160,0,100,1,100,2,161,2,125,0,124,0,160,0,100,3, + 100,2,161,2,125,0,124,0,83,0,41,4,78,115,2,0, + 0,0,13,10,243,1,0,0,0,10,243,1,0,0,0,13, + 41,1,114,19,0,0,0,41,1,218,6,115,111,117,114,99, + 101,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,23,95,110,111,114,109,97,108,105,122,101,95,108,105,110, + 101,95,101,110,100,105,110,103,115,159,2,0,0,115,8,0, + 0,0,12,1,12,1,4,1,255,128,114,161,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 6,0,0,0,67,0,0,0,115,24,0,0,0,116,0,124, + 1,131,1,125,1,116,1,124,1,124,0,100,1,100,2,100, + 3,141,4,83,0,41,4,78,114,78,0,0,0,84,41,1, + 90,12,100,111,110,116,95,105,110,104,101,114,105,116,41,2, + 114,161,0,0,0,218,7,99,111,109,112,105,108,101,41,2, + 114,57,0,0,0,114,160,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,15,95,99,111,109,112, + 105,108,101,95,115,111,117,114,99,101,166,2,0,0,115,6, + 0,0,0,8,1,16,1,255,128,114,163,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,11, + 0,0,0,67,0,0,0,115,68,0,0,0,116,0,160,1, + 124,0,100,1,63,0,100,2,23,0,124,0,100,3,63,0, + 100,4,64,0,124,0,100,5,64,0,124,1,100,6,63,0, + 124,1,100,3,63,0,100,7,64,0,124,1,100,5,64,0, + 100,8,20,0,100,9,100,9,100,9,102,9,161,1,83,0, + 41,10,78,233,9,0,0,0,105,188,7,0,0,233,5,0, + 0,0,233,15,0,0,0,233,31,0,0,0,233,11,0,0, + 0,233,63,0,0,0,114,88,0,0,0,114,14,0,0,0, + 41,2,114,133,0,0,0,90,6,109,107,116,105,109,101,41, + 2,218,1,100,114,140,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,14,95,112,97,114,115,101, + 95,100,111,115,116,105,109,101,172,2,0,0,115,20,0,0, + 0,4,1,10,1,10,1,6,1,6,1,10,1,10,1,6, + 1,6,249,255,128,114,171,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,10,0,0,0,67, + 0,0,0,115,110,0,0,0,122,82,124,1,100,1,100,0, + 133,2,25,0,100,2,118,0,115,22,74,0,130,1,124,1, + 100,0,100,1,133,2,25,0,125,1,124,0,106,0,124,1, + 25,0,125,2,124,2,100,3,25,0,125,3,124,2,100,4, + 25,0,125,4,124,2,100,5,25,0,125,5,116,1,124,4, + 124,3,131,2,124,5,102,2,87,0,83,0,4,0,116,2, + 116,3,116,4,102,3,121,108,1,0,1,0,1,0,89,0, + 100,6,83,0,48,0,41,7,78,114,14,0,0,0,169,2, + 218,1,99,218,1,111,114,165,0,0,0,233,6,0,0,0, + 233,3,0,0,0,41,2,114,0,0,0,0,114,0,0,0, + 0,41,5,114,28,0,0,0,114,171,0,0,0,114,26,0, + 0,0,218,10,73,110,100,101,120,69,114,114,111,114,114,156, + 0,0,0,41,6,114,32,0,0,0,114,13,0,0,0,114, + 58,0,0,0,114,133,0,0,0,114,134,0,0,0,90,17, + 117,110,99,111,109,112,114,101,115,115,101,100,95,115,105,122, + 101,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,153,0,0,0,185,2,0,0,115,22,0,0,0,2,1, + 20,2,12,1,10,1,8,3,8,1,8,1,16,1,18,1, + 8,1,255,128,114,153,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0, + 0,0,115,80,0,0,0,124,1,100,1,100,0,133,2,25, + 0,100,2,118,0,115,20,74,0,130,1,124,1,100,0,100, + 1,133,2,25,0,125,1,122,14,124,0,106,0,124,1,25, + 0,125,2,87,0,110,20,4,0,116,1,121,66,1,0,1, + 0,1,0,89,0,100,0,83,0,48,0,116,2,124,0,106, + 3,124,2,131,2,83,0,41,3,78,114,14,0,0,0,114, + 172,0,0,0,41,4,114,28,0,0,0,114,26,0,0,0, + 114,56,0,0,0,114,29,0,0,0,41,3,114,32,0,0, + 0,114,13,0,0,0,114,58,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,151,0,0,0,204, + 2,0,0,115,16,0,0,0,20,2,12,1,2,2,14,1, + 12,1,8,1,12,2,255,128,114,151,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,11,0,0,0,9,0, + 0,0,67,0,0,0,115,190,0,0,0,116,0,124,0,124, + 1,131,2,125,2,116,1,68,0,93,156,92,3,125,3,125, + 4,125,5,124,2,124,3,23,0,125,6,116,2,106,3,100, + 1,124,0,106,4,116,5,124,6,100,2,100,3,141,5,1, + 0,122,14,124,0,106,6,124,6,25,0,125,7,87,0,110, + 18,4,0,116,7,121,86,1,0,1,0,1,0,89,0,113, + 14,48,0,124,7,100,4,25,0,125,8,116,8,124,0,106, + 4,124,7,131,2,125,9,124,4,114,130,116,9,124,0,124, + 8,124,6,124,1,124,9,131,5,125,10,110,10,116,10,124, + 8,124,9,131,2,125,10,124,10,100,0,117,0,114,150,113, + 14,124,7,100,4,25,0,125,8,124,10,124,5,124,8,102, + 3,2,0,1,0,83,0,116,11,100,5,124,1,155,2,157, + 2,124,1,100,6,141,2,130,1,41,7,78,122,13,116,114, + 121,105,110,103,32,123,125,123,125,123,125,114,88,0,0,0, + 41,1,90,9,118,101,114,98,111,115,105,116,121,114,0,0, + 0,0,114,61,0,0,0,114,62,0,0,0,41,12,114,36, + 0,0,0,114,91,0,0,0,114,45,0,0,0,114,80,0, + 0,0,114,29,0,0,0,114,20,0,0,0,114,28,0,0, + 0,114,26,0,0,0,114,56,0,0,0,114,157,0,0,0, + 114,163,0,0,0,114,3,0,0,0,41,11,114,32,0,0, + 0,114,38,0,0,0,114,13,0,0,0,114,92,0,0,0, + 114,93,0,0,0,114,51,0,0,0,114,66,0,0,0,114, + 58,0,0,0,114,40,0,0,0,114,128,0,0,0,114,50, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,48,0,0,0,219,2,0,0,115,38,0,0,0, + 10,1,14,1,8,1,22,1,2,1,14,1,12,1,6,1, + 8,2,12,1,4,1,18,1,10,2,8,1,2,3,8,1, + 14,1,18,2,255,128,114,48,0,0,0,41,46,114,86,0, + 0,0,90,26,95,102,114,111,122,101,110,95,105,109,112,111, + 114,116,108,105,98,95,101,120,116,101,114,110,97,108,114,21, + 0,0,0,114,1,0,0,0,114,2,0,0,0,90,17,95, + 102,114,111,122,101,110,95,105,109,112,111,114,116,108,105,98, + 114,45,0,0,0,114,150,0,0,0,114,112,0,0,0,114, + 154,0,0,0,114,71,0,0,0,114,133,0,0,0,114,69, + 0,0,0,90,7,95,95,97,108,108,95,95,114,20,0,0, + 0,90,15,112,97,116,104,95,115,101,112,97,114,97,116,111, + 114,115,114,18,0,0,0,114,79,0,0,0,114,3,0,0, + 0,114,25,0,0,0,218,4,116,121,112,101,114,74,0,0, + 0,114,115,0,0,0,114,117,0,0,0,114,119,0,0,0, + 90,13,95,76,111,97,100,101,114,66,97,115,105,99,115,114, + 4,0,0,0,114,91,0,0,0,114,36,0,0,0,114,37, + 0,0,0,114,35,0,0,0,114,27,0,0,0,114,124,0, + 0,0,114,144,0,0,0,114,146,0,0,0,114,56,0,0, + 0,114,149,0,0,0,114,157,0,0,0,218,8,95,95,99, + 111,100,101,95,95,114,155,0,0,0,114,161,0,0,0,114, + 163,0,0,0,114,171,0,0,0,114,153,0,0,0,114,151, + 0,0,0,114,48,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,8,60,109, + 111,100,117,108,101,62,1,0,0,0,115,92,0,0,0,4, + 0,8,16,16,1,8,1,8,1,8,1,8,1,8,1,8, + 1,8,1,8,2,6,3,14,1,16,3,4,4,8,2,4, + 2,4,1,4,1,18,2,0,127,0,127,12,33,12,1,2, + 1,2,1,4,252,8,9,8,4,8,9,8,31,2,126,2, + 254,4,29,8,5,8,21,8,46,8,10,10,46,8,5,8, + 7,8,6,8,13,8,19,12,15,255,128, }; From 3c0e72e276b8ed375881642d86e68ca9a0d511e0 Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Fri, 4 Dec 2020 19:45:57 -0800 Subject: [PATCH 0723/1261] bpo-42536: GC track recycled tuples (GH-23623) Several built-in and standard library types now ensure that their internal result tuples are always tracked by the garbage collector: - collections.OrderedDict.items - dict.items - enumerate - functools.reduce - itertools.combinations - itertools.combinations_with_replacement - itertools.permutations - itertools.product - itertools.zip_longest - zip Previously, they could have become untracked by a prior garbage collection. --- Lib/test/test_builtin.py | 13 +++++ Lib/test/test_dict.py | 19 ++++++++ Lib/test/test_enumerate.py | 13 +++++ Lib/test/test_itertools.py | 47 +++++++++++++++++++ Lib/test/test_ordered_dict.py | 11 +++++ .../2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst | 26 ++++++++++ Modules/_functoolsmodule.c | 6 +++ Modules/itertoolsmodule.c | 26 ++++++++++ Objects/dictobject.c | 10 ++++ Objects/enumobject.c | 11 +++++ Objects/odictobject.c | 5 ++ Python/bltinmodule.c | 5 ++ 12 files changed, 192 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index edb4ec092e3586..8c9573731ae2ed 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -6,6 +6,7 @@ import collections import decimal import fractions +import gc import io import locale import os @@ -1756,6 +1757,18 @@ def __next__(self): l8 = self.iter_error(zip(Iter(3), "AB", strict=True), ValueError) self.assertEqual(l8, [(2, "A"), (1, "B")]) + @support.cpython_only + def test_zip_result_gc(self): + # bpo-42536: zip's tuple-reuse speed trick breaks the GC's assumptions + # about what can be untracked. Make sure we re-track result tuples + # whenever we reuse them. + it = zip([[]]) + gc.collect() + # That GC collection probably untracked the recycled internal result + # tuple, which is initialized to (None,). Make sure it's re-tracked when + # it's mutated and returned from __next__: + self.assertTrue(gc.is_tracked(next(it))) + def test_format(self): # Test the basic machinery of the format() builtin. Don't test # the specifics of the various formatters diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 9ff8b7d501aad6..4b31cdc79415ff 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -1452,6 +1452,25 @@ def items(self): d = CustomReversedDict(pairs) self.assertEqual(pairs[::-1], list(dict(d).items())) + @support.cpython_only + def test_dict_items_result_gc(self): + # bpo-42536: dict.items's tuple-reuse speed trick breaks the GC's + # assumptions about what can be untracked. Make sure we re-track result + # tuples whenever we reuse them. + it = iter({None: []}.items()) + gc.collect() + # That GC collection probably untracked the recycled internal result + # tuple, which is initialized to (None, None). Make sure it's re-tracked + # when it's mutated and returned from __next__: + self.assertTrue(gc.is_tracked(next(it))) + + @support.cpython_only + def test_dict_items_result_gc(self): + # Same as test_dict_items_result_gc above, but reversed. + it = reversed({None: []}.items()) + gc.collect() + self.assertTrue(gc.is_tracked(next(it))) + class CAPITest(unittest.TestCase): diff --git a/Lib/test/test_enumerate.py b/Lib/test/test_enumerate.py index 5785cb46492ef7..906bfc21a26aed 100644 --- a/Lib/test/test_enumerate.py +++ b/Lib/test/test_enumerate.py @@ -2,6 +2,7 @@ import operator import sys import pickle +import gc from test import support @@ -134,6 +135,18 @@ def test_tuple_reuse(self): self.assertEqual(len(set(map(id, list(enumerate(self.seq))))), len(self.seq)) self.assertEqual(len(set(map(id, enumerate(self.seq)))), min(1,len(self.seq))) + @support.cpython_only + def test_enumerate_result_gc(self): + # bpo-42536: enumerate's tuple-reuse speed trick breaks the GC's + # assumptions about what can be untracked. Make sure we re-track result + # tuples whenever we reuse them. + it = self.enum([[]]) + gc.collect() + # That GC collection probably untracked the recycled internal result + # tuple, which is initialized to (None, None). Make sure it's re-tracked + # when it's mutated and returned from __next__: + self.assertTrue(gc.is_tracked(next(it))) + class MyEnum(enumerate): pass diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index df2997e87d494c..a99b5e2bb71db9 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -12,6 +12,8 @@ import sys import struct import threading +import gc + maxsize = support.MAX_Py_ssize_t minsize = -maxsize-1 @@ -1573,6 +1575,51 @@ def test_StopIteration(self): self.assertRaises(StopIteration, next, f(lambda x:x, [])) self.assertRaises(StopIteration, next, f(lambda x:x, StopNow())) + @support.cpython_only + def test_combinations_result_gc(self): + # bpo-42536: combinations's tuple-reuse speed trick breaks the GC's + # assumptions about what can be untracked. Make sure we re-track result + # tuples whenever we reuse them. + it = combinations([None, []], 1) + next(it) + gc.collect() + # That GC collection probably untracked the recycled internal result + # tuple, which has the value (None,). Make sure it's re-tracked when + # it's mutated and returned from __next__: + self.assertTrue(gc.is_tracked(next(it))) + + @support.cpython_only + def test_combinations_with_replacement_result_gc(self): + # Ditto for combinations_with_replacement. + it = combinations_with_replacement([None, []], 1) + next(it) + gc.collect() + self.assertTrue(gc.is_tracked(next(it))) + + @support.cpython_only + def test_permutations_result_gc(self): + # Ditto for permutations. + it = permutations([None, []], 1) + next(it) + gc.collect() + self.assertTrue(gc.is_tracked(next(it))) + + @support.cpython_only + def test_product_result_gc(self): + # Ditto for product. + it = product([None, []]) + next(it) + gc.collect() + self.assertTrue(gc.is_tracked(next(it))) + + @support.cpython_only + def test_zip_longest_result_gc(self): + # Ditto for zip_longest. + it = zip_longest([[]]) + gc.collect() + self.assertTrue(gc.is_tracked(next(it))) + + class TestExamples(unittest.TestCase): def test_accumulate(self): diff --git a/Lib/test/test_ordered_dict.py b/Lib/test/test_ordered_dict.py index 31759f20d28349..eb404463e92550 100644 --- a/Lib/test/test_ordered_dict.py +++ b/Lib/test/test_ordered_dict.py @@ -700,6 +700,17 @@ def test_merge_operator(self): with self.assertRaises(ValueError): a |= "BAD" + @support.cpython_only + def test_ordered_dict_items_result_gc(self): + # bpo-42536: OrderedDict.items's tuple-reuse speed trick breaks the GC's + # assumptions about what can be untracked. Make sure we re-track result + # tuples whenever we reuse them. + it = iter(self.OrderedDict({None: []}).items()) + gc.collect() + # That GC collection probably untracked the recycled internal result + # tuple, which is initialized to (None, None). Make sure it's re-tracked + # when it's mutated and returned from __next__: + self.assertTrue(gc.is_tracked(next(it))) class PurePythonOrderedDictTests(OrderedDictTests, unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst new file mode 100644 index 00000000000000..6ccacab1f64f68 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst @@ -0,0 +1,26 @@ +Several built-in and standard library types now ensure that their internal +result tuples are always tracked by the :term:`garbage collector +`: + +- :meth:`collections.OrderedDict.items() ` + +- :meth:`dict.items` + +- :func:`enumerate` + +- :func:`functools.reduce` + +- :func:`itertools.combinations` + +- :func:`itertools.combinations_with_replacement` + +- :func:`itertools.permutations` + +- :func:`itertools.product` + +- :func:`itertools.zip_longest` + +- :func:`zip` + +Previously, they could have become untracked by a prior garbage collection. +Patch by Brandt Bucher. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index ff03c334766b89..621b721d011df7 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -1,5 +1,6 @@ #include "Python.h" #include "pycore_long.h" // _PyLong_GetZero() +#include "pycore_object.h" // _PyObject_GC_TRACK #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tuple.h" // _PyTuple_ITEMS() #include "structmember.h" // PyMemberDef @@ -673,6 +674,11 @@ functools_reduce(PyObject *self, PyObject *args) if ((result = PyObject_Call(func, args, NULL)) == NULL) { goto Fail; } + // bpo-42536: The GC may have untracked this args tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(args)) { + _PyObject_GC_TRACK(args); + } } } diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 7144856c352f81..293735a886428b 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -3,6 +3,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_long.h" // _PyLong_GetZero() +#include "pycore_object.h" // _PyObject_GC_TRACK() #include "pycore_tuple.h" // _PyTuple_ITEMS() #include // offsetof() @@ -2378,6 +2379,11 @@ product_next(productobject *lz) lz->result = result; Py_DECREF(old_result); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + else if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } /* Now, we've got the only copy so we can update it in-place */ assert (npools==0 || Py_REFCNT(result) == 1); @@ -2701,6 +2707,11 @@ combinations_next(combinationsobject *co) co->result = result; Py_DECREF(old_result); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + else if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } /* Now, we've got the only copy so we can update it in-place * CPython's empty tuple is a singleton and cached in * PyTuple's freelist. @@ -3035,6 +3046,11 @@ cwr_next(cwrobject *co) co->result = result; Py_DECREF(old_result); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + else if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } /* Now, we've got the only copy so we can update it in-place CPython's empty tuple is a singleton and cached in PyTuple's freelist. */ assert(r == 0 || Py_REFCNT(result) == 1); @@ -3379,6 +3395,11 @@ permutations_next(permutationsobject *po) po->result = result; Py_DECREF(old_result); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + else if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } /* Now, we've got the only copy so we can update it in-place */ assert(r == 0 || Py_REFCNT(result) == 1); @@ -4649,6 +4670,11 @@ zip_longest_next(ziplongestobject *lz) PyTuple_SET_ITEM(result, i, item); Py_DECREF(olditem); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } } else { result = PyTuple_New(tuplesize); if (result == NULL) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 7a37313df8a6b1..35e881fe272308 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -3989,6 +3989,11 @@ dictiter_iternextitem(dictiterobject *di) Py_INCREF(result); Py_DECREF(oldkey); Py_DECREF(oldvalue); + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } } else { result = PyTuple_New(2); @@ -4104,6 +4109,11 @@ dictreviter_iternext(dictiterobject *di) Py_INCREF(result); Py_DECREF(oldkey); Py_DECREF(oldvalue); + // bpo-42536: The GC may have untracked this result tuple. Since + // we're recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } } else { result = PyTuple_New(2); diff --git a/Objects/enumobject.c b/Objects/enumobject.c index 8b5e7d3a3c6dd5..98ece3f13fc6fb 100644 --- a/Objects/enumobject.c +++ b/Objects/enumobject.c @@ -2,6 +2,7 @@ #include "Python.h" #include "pycore_long.h" // _PyLong_GetOne() +#include "pycore_object.h" // _PyObject_GC_TRACK() #include "clinic/enumobject.c.h" @@ -131,6 +132,11 @@ enum_next_long(enumobject *en, PyObject* next_item) PyTuple_SET_ITEM(result, 1, next_item); Py_DECREF(old_index); Py_DECREF(old_item); + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } return result; } result = PyTuple_New(2); @@ -176,6 +182,11 @@ enum_next(enumobject *en) PyTuple_SET_ITEM(result, 1, next_item); Py_DECREF(old_index); Py_DECREF(old_item); + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } return result; } result = PyTuple_New(2); diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 4eb15f999bd1e4..6c7f1175cd652c 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1814,6 +1814,11 @@ odictiter_iternext(odictiterobject *di) Py_INCREF(result); Py_DECREF(PyTuple_GET_ITEM(result, 0)); /* borrowed */ Py_DECREF(PyTuple_GET_ITEM(result, 1)); /* borrowed */ + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } } else { result = PyTuple_New(2); diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index a73b8cb320e975..352fb83d55e053 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2636,6 +2636,11 @@ zip_next(zipobject *lz) PyTuple_SET_ITEM(result, i, item); Py_DECREF(olditem); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } } else { result = PyTuple_New(tuplesize); if (result == NULL) From 3219db9059d1aaa13a8f4ffece6f19380e89c3dd Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Fri, 4 Dec 2020 23:02:09 -0500 Subject: [PATCH 0724/1261] bpo-41116: Fix setup.py test for macOS Tcl/Tk frameworks (GH-23649) If no explicit macOS SDK was specified, setup.py should check for Tcl and TK frameworks in /Library/Frameworks; the previous commit inadvertently broke that test. --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0c9a4250168692..90588e8b1d1fca 100644 --- a/setup.py +++ b/setup.py @@ -177,10 +177,11 @@ def macosx_sdk_root(): m = re.search(r'-isysroot\s*(\S+)', cflags) if m is not None: MACOS_SDK_ROOT = m.group(1) + MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' else: MACOS_SDK_ROOT = _osx_support._default_sysroot( sysconfig.get_config_var('CC')) - MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' + MACOS_SDK_SPECIFIED = False return MACOS_SDK_ROOT From 57a734ebf7ad85a5e4f4e86305e0a36bcb4eb220 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sat, 5 Dec 2020 03:34:51 -0700 Subject: [PATCH 0725/1261] bpo-30459: Cast the result of PyList_SET_ITEM() to void (GH-19975) Do the same for PyTuple_SET_ITEM(). --- Include/cpython/listobject.h | 2 +- Include/cpython/tupleobject.h | 2 +- Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h index e1b9462d5b3612..e3239152c497c2 100644 --- a/Include/cpython/listobject.h +++ b/Include/cpython/listobject.h @@ -30,5 +30,5 @@ PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); #define _PyList_CAST(op) (assert(PyList_Check(op)), (PyListObject *)(op)) #define PyList_GET_ITEM(op, i) (_PyList_CAST(op)->ob_item[i]) -#define PyList_SET_ITEM(op, i, v) (_PyList_CAST(op)->ob_item[i] = (v)) +#define PyList_SET_ITEM(op, i, v) ((void)(_PyList_CAST(op)->ob_item[i] = (v))) #define PyList_GET_SIZE(op) Py_SIZE(_PyList_CAST(op)) diff --git a/Include/cpython/tupleobject.h b/Include/cpython/tupleobject.h index 51dcd4237be18c..7cada8848c49fc 100644 --- a/Include/cpython/tupleobject.h +++ b/Include/cpython/tupleobject.h @@ -23,6 +23,6 @@ PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); #define PyTuple_GET_ITEM(op, i) (_PyTuple_CAST(op)->ob_item[i]) /* Macro, *only* to be used to fill in brand new tuples */ -#define PyTuple_SET_ITEM(op, i, v) (_PyTuple_CAST(op)->ob_item[i] = v) +#define PyTuple_SET_ITEM(op, i, v) ((void)(_PyTuple_CAST(op)->ob_item[i] = v)) PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); diff --git a/Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst b/Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst new file mode 100644 index 00000000000000..e3ee6dccdaa760 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst @@ -0,0 +1,2 @@ +Cast the result of :c:func:`PyList_SET_ITEM` and :c:func:`PyTuple_SET_ITEM` +to void. From fedf9afef63bf844328e76c84b6bc06b5ec13ebb Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sat, 5 Dec 2020 05:26:24 -0800 Subject: [PATCH 0726/1261] GH-5054: CGIHTTPRequestHandler.run_cgi() HTTP_ACCEPT improperly parsed (#23638) --- Lib/http/server.py | 7 +--- Lib/test/test_httpservers.py | 37 ++++++++++++++++++- .../2020-12-04-03-51-12.bpo-5054.53StYZ.rst | 5 +++ 3 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-04-03-51-12.bpo-5054.53StYZ.rst diff --git a/Lib/http/server.py b/Lib/http/server.py index c611381177d43a..94f730ed3445be 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1122,12 +1122,7 @@ def run_cgi(self): referer = self.headers.get('referer') if referer: env['HTTP_REFERER'] = referer - accept = [] - for line in self.headers.getallmatchingheaders('accept'): - if line[:1] in "\t\n\r ": - accept.append(line.strip()) - else: - accept = accept + line[7:].split(',') + accept = self.headers.get_all('accept', ()) env['HTTP_ACCEPT'] = ','.join(accept) ua = self.headers.get('user-agent') if ua: diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 2859abb21fc9f5..c3d7c8feb1ec0d 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -3,7 +3,7 @@ Written by Cody A.W. Somerville , Josip Dzolonga, and Michael Otteneder for the 2007/08 GHOP contest. """ - +from collections import OrderedDict from http.server import BaseHTTPRequestHandler, HTTPServer, \ SimpleHTTPRequestHandler, CGIHTTPRequestHandler from http import server, HTTPStatus @@ -19,7 +19,7 @@ import email.message import email.utils import html -import http.client +import http, http.client import urllib.parse import tempfile import time @@ -588,6 +588,15 @@ def test_html_escape_filename(self): print(os.environ["%s"]) """ +cgi_file6 = """\ +#!%s +import os + +print("Content-type: text/plain") +print() +print(repr(os.environ)) +""" + @unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0, "This test can't be run reliably as root (issue #13308).") @@ -666,6 +675,11 @@ def setUp(self): file5.write(cgi_file1 % self.pythonexe) os.chmod(self.file5_path, 0o777) + self.file6_path = os.path.join(self.cgi_dir, 'file6.py') + with open(self.file6_path, 'w', encoding='utf-8') as file6: + file6.write(cgi_file6 % self.pythonexe) + os.chmod(self.file6_path, 0o777) + os.chdir(self.parent_dir) def tearDown(self): @@ -685,6 +699,8 @@ def tearDown(self): os.remove(self.file4_path) if self.file5_path: os.remove(self.file5_path) + if self.file6_path: + os.remove(self.file6_path) os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) os.rmdir(self.cgi_dir_in_sub_dir) @@ -818,6 +834,23 @@ def test_cgi_path_in_sub_directories(self): finally: CGIHTTPRequestHandler.cgi_directories.remove('/sub/dir/cgi-bin') + def test_accept(self): + browser_accept = \ + 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + tests = ( + ((('Accept', browser_accept),), browser_accept), + ((), ''), + # Hack case to get two values for the one header + ((('Accept', 'text/html'), ('ACCEPT', 'text/plain')), + 'text/html,text/plain'), + ) + for headers, expected in tests: + headers = OrderedDict(headers) + with self.subTest(headers): + res = self.request('/cgi-bin/file6.py', 'GET', headers=headers) + self.assertEqual(http.HTTPStatus.OK, res.status) + expected = f"'HTTP_ACCEPT': {expected!r}" + self.assertIn(expected.encode('ascii'), res.read()) class SocketlessRequestHandler(SimpleHTTPRequestHandler): diff --git a/Misc/NEWS.d/next/Library/2020-12-04-03-51-12.bpo-5054.53StYZ.rst b/Misc/NEWS.d/next/Library/2020-12-04-03-51-12.bpo-5054.53StYZ.rst new file mode 100644 index 00000000000000..ad8163c7c1d206 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-04-03-51-12.bpo-5054.53StYZ.rst @@ -0,0 +1,5 @@ +CGIHTTPRequestHandler.run_cgi() HTTP_ACCEPT improperly parsed. Replace the +special purpose getallmatchingheaders with generic get_all method and add +relevant tests. + +Original Patch by Martin Panter. Modified by Senthil Kumaran. From 5bc25203d7e7e2e82c4cbed59447e497562304c7 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Sat, 5 Dec 2020 23:02:14 +0700 Subject: [PATCH 0727/1261] bpo-42576: Raise TypeError when passing in keyword arguments to GenericAlias (GH-23656) Use `_PyArg_NoKeywords` instead of `_PyArg_NoKwnames` when checking the `kwds` tuple when creating `GenericAlias`. This fixes an interpreter crash when passing in keyword arguments to `GenericAlias`'s constructor. Needs backport to 3.9. Automerge-Triggered-By: GH:gvanrossum --- Lib/test/test_genericalias.py | 5 +++++ .../2020-12-05-22-34-47.bpo-42576.lEeEl7.rst | 3 +++ Objects/genericaliasobject.c | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 912fb33af1a21b..c113e538248e9c 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -302,6 +302,11 @@ def test_weakref(self): alias = t[int] self.assertEqual(ref(alias)(), alias) + def test_no_kwargs(self): + # bpo-42576 + with self.assertRaises(TypeError): + GenericAlias(bad=float) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst new file mode 100644 index 00000000000000..7290b47dcc15ca --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst @@ -0,0 +1,3 @@ +``types.GenericAlias`` will now raise a ``TypeError`` when attempting to +initialize with a keyword argument. Previously, this would cause the +interpreter to crash. Patch by Ken Jin. diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 6102e05c165c5d..51a12377b7e308 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -567,7 +567,7 @@ static PyGetSetDef ga_properties[] = { static PyObject * ga_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - if (!_PyArg_NoKwnames("GenericAlias", kwds)) { + if (!_PyArg_NoKeywords("GenericAlias", kwds)) { return NULL; } if (!_PyArg_CheckPositional("GenericAlias", PyTuple_GET_SIZE(args), 2, 2)) { From 3225258f31e7b857e00d1f835a7e2cfde7d17b0b Mon Sep 17 00:00:00 2001 From: idanw206 <31290383+idanw206@users.noreply.github.com> Date: Sun, 6 Dec 2020 11:59:36 +0200 Subject: [PATCH 0728/1261] bpo-42532: Check if NonCallableMock's spec_arg is not None instead of call its __bool__ function (GH23613) Check if NonCallableMock's spec_arg is not None instead of call its __bool__ function --- Lib/unittest/mock.py | 2 +- Lib/unittest/test/testmock/testmock.py | 10 ++++++++++ .../Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index f5f502f257244c..4db1bacf4b10cf 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -406,7 +406,7 @@ def __new__(cls, /, *args, **kw): # Check if spec is an async object or function bound_args = _MOCK_SIG.bind_partial(cls, *args, **kw).arguments spec_arg = bound_args.get('spec_set', bound_args.get('spec')) - if spec_arg and _is_async_obj(spec_arg): + if spec_arg is not None and _is_async_obj(spec_arg): bases = (AsyncMockMixin, cls) new = type(cls.__name__, bases, {'__doc__': cls.__doc__}) instance = _safe_super(NonCallableMock, cls).__new__(new) diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 194ce3f61bbfdd..dfcf1ef2ee0302 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -2165,6 +2165,16 @@ def trace(frame, event, arg): # pragma: no cover obj = mock(spec=Something) self.assertIsInstance(obj, Something) + def test_bool_not_called_when_passing_spec_arg(self): + class Something: + def __init__(self): + self.obj_with_bool_func = unittest.mock.MagicMock() + + obj = Something() + with unittest.mock.patch.object(obj, 'obj_with_bool_func', autospec=True): pass + + self.assertEqual(obj.obj_with_bool_func.__bool__.call_count, 0) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst b/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst new file mode 100644 index 00000000000000..7465cb8e2e3d7b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst @@ -0,0 +1 @@ +Remove unexpected call of ``__bool__`` when passing a ``spec_arg`` argument to a Mock. From 8ceb9640d6c69fc97bf2fcfcdde21ef4c32692e1 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Sun, 6 Dec 2020 23:37:59 +0700 Subject: [PATCH 0729/1261] bpo-42576: Clarify only debug builds are affected in news (GH-23663) --- .../Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst index 7290b47dcc15ca..154c9d8a915de1 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst @@ -1,3 +1,4 @@ ``types.GenericAlias`` will now raise a ``TypeError`` when attempting to initialize with a keyword argument. Previously, this would cause the -interpreter to crash. Patch by Ken Jin. +interpreter to crash if the interpreter was compiled with debug symbols. +This does not affect interpreters compiled for release. Patch by Ken Jin. From 839437050e3c09807399393ddf1ceb052ba2fbb7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 6 Dec 2020 18:54:33 +0200 Subject: [PATCH 0730/1261] bpo-42582: Remove asyncio._all_tasks_compat(). (GH-23664) It was used to implement now removed asyncio.Task.all_tasks(). --- Lib/asyncio/__init__.py | 4 ---- Lib/asyncio/tasks.py | 24 ------------------------ 2 files changed, 28 deletions(-) diff --git a/Lib/asyncio/__init__.py b/Lib/asyncio/__init__.py index eb84bfb189ccf3..200b14c2a3f21e 100644 --- a/Lib/asyncio/__init__.py +++ b/Lib/asyncio/__init__.py @@ -20,10 +20,6 @@ from .threads import * from .transports import * -# Exposed for _asynciomodule.c to implement now deprecated -# Task.all_tasks() method. This function will be removed in 3.9. -from .tasks import _all_tasks_compat # NoQA - __all__ = (base_events.__all__ + coroutines.__all__ + events.__all__ + diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index eef7f8808eb06f..0d3a24b7853f57 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -61,30 +61,6 @@ def all_tasks(loop=None): if futures._get_loop(t) is loop and not t.done()} -def _all_tasks_compat(loop=None): - # Different from "all_task()" by returning *all* Tasks, including - # the completed ones. Used to implement deprecated "Tasks.all_task()" - # method. - if loop is None: - loop = events.get_event_loop() - # Looping over a WeakSet (_all_tasks) isn't safe as it can be updated from another - # thread while we do so. Therefore we cast it to list prior to filtering. The list - # cast itself requires iteration, so we repeat it several times ignoring - # RuntimeErrors (which are not very likely to occur). See issues 34970 and 36607 for - # details. - i = 0 - while True: - try: - tasks = list(_all_tasks) - except RuntimeError: - i += 1 - if i >= 1000: - raise - else: - break - return {t for t in tasks if futures._get_loop(t) is loop} - - def _set_task_name(task, name): if name is not None: try: From ef50a4b43770f3b27edc944845a730ae07dea7ba Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 6 Dec 2020 18:29:08 -0800 Subject: [PATCH 0731/1261] bpo-38843: Document behavior of default when the attribute is already set (GH-23653) --- Doc/library/argparse.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index a32b99901a7b4e..02cd70f4f71cd6 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -696,7 +696,7 @@ The add_argument() method * const_ - A constant value required by some action_ and nargs_ selections. * default_ - The value produced if the argument is absent from the - command line. + command line and if it is absent from the namespace object. * type_ - The type to which the command-line argument should be converted. @@ -1006,6 +1006,14 @@ was not present at the command line:: >>> parser.parse_args([]) Namespace(foo=42) +If the target namespace already has an attribute set, the action *default* +will not over write it:: + + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo', default=42) + >>> parser.parse_args([], namespace=argparse.Namespace(foo=101)) + Namespace(foo=101) + If the ``default`` value is a string, the parser parses the value as if it were a command-line argument. In particular, the parser applies any type_ conversion argument, if provided, before setting the attribute on the From 2c88dda78ac9fa8cc73b5410e48ea9ee88e3f4c9 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sun, 6 Dec 2020 22:22:33 -0500 Subject: [PATCH 0732/1261] bpo-42508: Keep IDLE running on macOS (GH-23577) Remove obsolete workaround that prevented running files with shortcuts when using new universal2 installers built on macOS 11. Ignore buggy 2nd run_module_event call. --- Lib/idlelib/NEWS.txt | 4 +++ Lib/idlelib/runscript.py | 26 +++++-------------- .../2020-11-30-19-46-05.bpo-42508.fE7w4M.rst | 3 +++ 3 files changed, 14 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 34f28d6084f7a4..7167314ca7e598 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,10 @@ Released on 2021-10-04? ====================================== +bpo-42508: Keep IDLE running on macOS. Remove obsolete workaround +that prevented running files with shortcuts when using new universal2 +installers built on macOS 11. + bpo-42426: Fix reporting offset of the RE error in searchengine. bpo-42416: Get docstrings for IDLE calltips more often diff --git a/Lib/idlelib/runscript.py b/Lib/idlelib/runscript.py index a54108794ab595..028b0dbd21dfe6 100644 --- a/Lib/idlelib/runscript.py +++ b/Lib/idlelib/runscript.py @@ -11,6 +11,7 @@ """ import os import tabnanny +import time import tokenize import tkinter.messagebox as tkMessageBox @@ -42,9 +43,7 @@ def __init__(self, editwin): self.root = self.editwin.root # cli_args is list of strings that extends sys.argv self.cli_args = [] - - if macosx.isCocoaTk(): - self.editwin.text_frame.bind('<>', self._run_module_event) + self.perf = 0.0 # Workaround for macOS 11 Uni2; see bpo-42508. def check_module_event(self, event): if isinstance(self.editwin, outwin.OutputWindow): @@ -107,24 +106,10 @@ def checksyntax(self, filename): finally: shell.set_warning_stream(saved_stream) - def run_module_event(self, event): - if macosx.isCocoaTk(): - # Tk-Cocoa in MacOSX is broken until at least - # Tk 8.5.9, and without this rather - # crude workaround IDLE would hang when a user - # tries to run a module using the keyboard shortcut - # (the menu item works fine). - self.editwin.text_frame.after(200, - lambda: self.editwin.text_frame.event_generate( - '<>')) - return 'break' - else: - return self._run_module_event(event) - def run_custom_event(self, event): - return self._run_module_event(event, customize=True) + return self.run_module_event(event, customize=True) - def _run_module_event(self, event, *, customize=False): + def run_module_event(self, event, *, customize=False): """Run the module after setting up the environment. First check the syntax. Next get customization. If OK, make @@ -133,6 +118,8 @@ def _run_module_event(self, event, *, customize=False): module being executed and also add that directory to its sys.path if not already included. """ + if macosx.isCocoaTk() and (time.perf_counter() - self.perf < .05): + return 'break' if isinstance(self.editwin, outwin.OutputWindow): self.editwin.text.bell() return 'break' @@ -218,6 +205,7 @@ def errorbox(self, title, message): # XXX This should really be a function of EditorWindow... tkMessageBox.showerror(title, message, parent=self.editwin.text) self.editwin.text.focus_set() + self.perf = time.perf_counter() if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst b/Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst new file mode 100644 index 00000000000000..b449351f7f458e --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst @@ -0,0 +1,3 @@ +Keep IDLE running on macOS. Remove obsolete workaround that prevented +running files with shortcuts when using new universal2 installers built +on macOS 11. From 9e78a90d3dc3ef6c94737596c461a75e8255a03b Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sun, 6 Dec 2020 22:55:12 -0500 Subject: [PATCH 0733/1261] Update macos installer ReadMe for 3.10.0a3 (GH-23671) --- Mac/BuildScript/resources/ReadMe.rtf | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Mac/BuildScript/resources/ReadMe.rtf b/Mac/BuildScript/resources/ReadMe.rtf index a4dd8b5ee41029..c82e4b6303a52b 100644 --- a/Mac/BuildScript/resources/ReadMe.rtf +++ b/Mac/BuildScript/resources/ReadMe.rtf @@ -3,7 +3,7 @@ \f3\fmodern\fcharset0 CourierNewPSMT;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} -\margl1440\margr1440\vieww13380\viewh14600\viewkind0 +\margl1440\margr1440\vieww13380\viewh14580\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \f0\fs24 \cf0 This package will install Python $FULL_VERSION for macOS $MACOSX_DEPLOYMENT_TARGET for the following architecture(s): $ARCHITECTURES.\ @@ -56,7 +56,15 @@ Due to new security checks on macOS 10.15 Catalina, when launching IDLE macOS ma \f0\b0 button to proceed.\ \ -\f1\b \ul Other changes\ +\f1\b \ul macOS 11.0 (Big Sur) and Apple Silicon Mac support [new in 3.10.0a3]\ + +\f0\b0 \ulnone \ +As of 2020-11, macOS 11.0 (Big Sur) is the latest release of macOS and one of its major features is the support of new Apple Silicon Macs that are based on the ARM64 CPU architecture specification rather than the Intel 64 (x86_64) architecture used previously. There are other changes in Big Sur that affect Python operation regardless of CPU architecture.\ +\ +Beginning with 3.10.0a3, we provide a new "universal2" installer variant that provides universal binaries for both ARM64 and Intel 64 architectures and is also supported on all Macs that support macOS 10.9 or later. Some of the advantages of the new installer variant: native ARM64 code on Apple Silicon Macs should run significantly faster than Rosetta2-emulated code; some operating system functions and options introduced in macOS releases since 10.9 are now exposed when available (primarily in the os module); the new installer variant includes Tcl/Tk 8.6.10 rather than 8.6.8.\ + +\f1\b \ul \ +Other changes\ \f0\b0 \ulnone \ For other changes in this release, see the From a6c752c31b2e546f410878c4fe461aec492cdb39 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Mon, 7 Dec 2020 00:17:31 -0800 Subject: [PATCH 0734/1261] bpo-41889: [Enum] fix multiple-inheritance regression (GH-22487) --- Lib/enum.py | 11 +++++--- Lib/test/test_enum.py | 26 +++++++++++++++++++ .../2020-10-01-16-17-11.bpo-41889.qLkNh8.rst | 1 + 3 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst diff --git a/Lib/enum.py b/Lib/enum.py index 40ff25b9cdad37..d670ad7d86196f 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -146,8 +146,9 @@ def __new__(metacls, cls, bases, classdict): for key in ignore: classdict.pop(key, None) member_type, first_enum = metacls._get_mixins_(cls, bases) - __new__, save_new, use_args = metacls._find_new_(classdict, member_type, - first_enum) + __new__, save_new, use_args = metacls._find_new_( + classdict, member_type, first_enum, + ) # save enum items into separate mapping so they don't get baked into # the new class @@ -501,12 +502,16 @@ def _find_data_type(bases): for base in chain.__mro__: if base is object: continue + elif issubclass(base, Enum): + if base._member_type_ is not object: + data_types.append(base._member_type_) + break elif '__new__' in base.__dict__: if issubclass(base, Enum): continue data_types.append(candidate or base) break - elif not issubclass(base, Enum): + else: candidate = base if len(data_types) > 1: raise TypeError('%r: too many data types: %r' % (class_name, data_types)) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 3431040f98a726..d1dd2e78d455f0 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2021,6 +2021,32 @@ class Decision2(MyEnum): REVERT_ALL = "REVERT_ALL" RETRY = "RETRY" + def test_multiple_mixin_inherited(self): + class MyInt(int): + def __new__(cls, value): + return super().__new__(cls, value) + + class HexMixin: + def __repr__(self): + return hex(self) + + class MyIntEnum(HexMixin, MyInt, enum.Enum): + pass + + class Foo(MyIntEnum): + TEST = 1 + self.assertTrue(isinstance(Foo.TEST, MyInt)) + self.assertEqual(repr(Foo.TEST), "0x1") + + class Fee(MyIntEnum): + TEST = 1 + def __new__(cls, value): + value += 1 + member = int.__new__(cls, value) + member._value_ = value + return member + self.assertEqual(Fee.TEST, 2) + def test_empty_globals(self): # bpo-35717: sys._getframe(2).f_globals['__name__'] fails with KeyError # when using compile and exec because f_globals is empty diff --git a/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst b/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst new file mode 100644 index 00000000000000..768865ae62116d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst @@ -0,0 +1 @@ +Enum: fix regression involving inheriting a multiply-inherited enum From 278699c09c2af0be106e31ee11a536a495e05466 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 7 Dec 2020 11:56:20 +0100 Subject: [PATCH 0735/1261] bpo-30459: Cast the result of PyCell_SET to void (GH-23654) --- Doc/whatsnew/3.10.rst | 7 +++++++ Include/cellobject.h | 2 +- .../next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst | 8 ++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 019dd1817d2b63..a5cb4e30616cd0 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -611,6 +611,13 @@ Porting to Python 3.10 :ref:`Python Path Configuration. `. (Contributed by Victor Stinner in :issue:`42260`.) +* :c:func:`PyList_SET_ITEM`, :c:func:`PyTuple_SET_ITEM` and + :c:func:`PyCell_SET` macros can no longer be used as l-value or r-value. + For example, ``x = PyList_SET_ITEM(a, b, c)`` and + ``PyList_SET_ITEM(a, b, c) = x`` now fail with a compiler error. It prevents + bugs like ``if (PyList_SET_ITEM (a, b, c) < 0) ...`` test. + (Contributed by Zackery Spytz and Victor Stinner in :issue:`30459`.) + Deprecated ---------- diff --git a/Include/cellobject.h b/Include/cellobject.h index f12aa90a42a8fe..81bc784d36f3e0 100644 --- a/Include/cellobject.h +++ b/Include/cellobject.h @@ -20,7 +20,7 @@ PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *); #define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref) -#define PyCell_SET(op, v) (((PyCellObject *)(op))->ob_ref = v) +#define PyCell_SET(op, v) ((void)(((PyCellObject *)(op))->ob_ref = v)) #ifdef __cplusplus } diff --git a/Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst b/Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst index e3ee6dccdaa760..092d457855a41b 100644 --- a/Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst +++ b/Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst @@ -1,2 +1,6 @@ -Cast the result of :c:func:`PyList_SET_ITEM` and :c:func:`PyTuple_SET_ITEM` -to void. +:c:func:`PyList_SET_ITEM`, :c:func:`PyTuple_SET_ITEM` and :c:func:`PyCell_SET` +macros can no longer be used as l-value or r-value. For example, +``x = PyList_SET_ITEM(a, b, c)`` and ``PyList_SET_ITEM(a, b, c) = x`` now fail +with a compiler error. It prevents bugs like +``if (PyList_SET_ITEM (a, b, c) < 0) ...`` test. +Patch by Zackery Spytz and Victor Stinner. From bd2593fdfbf7b66fa052de135d191b5889dc3a8c Mon Sep 17 00:00:00 2001 From: Matti Picus Date: Mon, 7 Dec 2020 19:33:20 +0200 Subject: [PATCH 0736/1261] bpo-39825: Fixes sysconfig.get_config_var('EXT_SUFFIX') on Windows to match distutils (GH-22088) --- Lib/sysconfig.py | 3 ++- Lib/test/test_sysconfig.py | 4 +++- .../next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst | 5 +++++ 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 6c87b06634c457..e1b2f93f876d78 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -424,10 +424,11 @@ def _init_posix(vars): def _init_non_posix(vars): """Initialize the module as appropriate for NT""" # set basic install directories + import _imp vars['LIBDEST'] = get_path('stdlib') vars['BINLIBDEST'] = get_path('platstdlib') vars['INCLUDEPY'] = get_path('include') - vars['EXT_SUFFIX'] = '.pyd' + vars['EXT_SUFFIX'] = _imp.extension_suffixes()[0] vars['EXE'] = '.exe' vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py index d07d28df607ce7..352dbdea817e63 100644 --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -360,10 +360,12 @@ def test_SO_value(self): @unittest.skipIf(sysconfig.get_config_var('EXT_SUFFIX') is None, 'EXT_SUFFIX required for this test') - def test_SO_in_vars(self): + def test_EXT_SUFFIX_in_vars(self): + import _imp vars = sysconfig.get_config_vars() self.assertIsNotNone(vars['SO']) self.assertEqual(vars['SO'], vars['EXT_SUFFIX']) + self.assertEqual(vars['EXT_SUFFIX'], _imp.extension_suffixes()[0]) @unittest.skipUnless(sys.platform == 'linux' and hasattr(sys.implementation, '_multiarch'), diff --git a/Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst b/Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst new file mode 100644 index 00000000000000..c337731f435843 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst @@ -0,0 +1,5 @@ +Windows: Change ``sysconfig.get_config_var('EXT_SUFFIX')`` to the expected +full ``platform_tag.extension`` format. Previously it was hard-coded to +``.pyd``, now it is compatible with ``distutils.sysconfig`` and will result +in something like ``.cp38-win_amd64.pyd``. This brings windows into +conformance with the other platforms. From bb50231195029e6a8c341f26737c6eb4f3132533 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 7 Dec 2020 19:33:00 +0000 Subject: [PATCH 0737/1261] Python 3.10.0a3 --- Include/patchlevel.h | 4 +- Lib/pydoc_data/topics.py | 103 +- Misc/NEWS.d/3.10.0a3.rst | 1504 +++++++++++++++++ .../2020-06-17-09-05-02.bpo-40998.sgqmg9.rst | 2 - .../2020-10-19-15-41-05.bpo-42087.2AhRFP.rst | 1 - .../2020-11-12-13-45-15.bpo-38823.C0z_Fe.rst | 3 - .../2020-11-13-15-04-53.bpo-41617.98_oaE.rst | 3 - .../2020-11-18-11-58-44.bpo-42398.Yt5wO8.rst | 4 - .../2020-11-19-17-01-50.bpo-31904.894dk2.rst | 1 - .../2020-05-06-23-54-57.bpo-30459.N9_Jai.rst | 6 - .../2020-07-08-21-01-49.bpo-41073.VqQZON.rst | 1 - .../2020-10-19-15-58-16.bpo-42085.NhEf3W.rst | 1 - .../2020-10-27-21-10-14.bpo-42171.S3FWTP.rst | 4 - ...2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst | 3 - .../2020-11-03-19-47-06.bpo-41832.dL1VJJ.rst | 2 - .../2020-11-04-16-31-55.bpo-42260.CmgHtF.rst | 3 - .../2020-11-04-17-22-36.bpo-42262.fCWzBb.rst | 2 - .../2020-11-05-18-02-07.bpo-42260.pAeaNR.rst | 5 - .../2020-11-10-14-27-39.bpo-42260.-Br3Co.rst | 7 - .../2020-11-13-01-40-28.bpo-40170.uh8lEf.rst | 3 - .../2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst | 3 - ...2020-11-18-08-45-36.bpo-1635741.VLZfiY.rst | 1 - ...2020-11-18-09-16-23.bpo-1635741.gkoI7Y.rst | 1 - ...2020-11-18-09-46-35.bpo-1635741.SH8OIT.rst | 2 - ...2020-11-18-10-52-38.bpo-1635741.FrWAwJ.rst | 2 - .../2020-11-18-15-21-59.bpo-39573.VB3G2y.rst | 4 - ...2020-11-18-20-11-13.bpo-1635741.fe3iRb.rst | 1 - ...2020-11-18-20-33-35.bpo-1635741.B4ztSk.rst | 1 - ...2020-11-19-09-17-01.bpo-1635741.6F9o6L.rst | 1 - ...2020-11-19-12-06-43.bpo-1635741.KEfZpn.rst | 1 - ...2020-11-19-15-33-42.bpo-1635741.9tVsZt.rst | 1 - ...2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst | 2 - ...2020-11-19-17-44-36.bpo-1635741.qBZc3o.rst | 2 - .../2020-11-21-12-27-19.bpo-42423.ByJHhY.rst | 3 - .../2020-10-22-17-27-08.bpo-26131.B-Veg7.rst | 2 - .../2020-11-01-23-34-56.bpo-42233.zOSzja.rst | 5 - .../2020-11-02-14-39-48.bpo-40077.grY9TG.rst | 1 - .../2020-11-02-15-48-17.bpo-42246.3CNQEX.rst | 2 - .../2020-11-03-21-58-27.bpo-40077.a9qM1j.rst | 1 - .../2020-11-04-23-03-25.bpo-42266.G4hGDe.rst | 3 - .../2020-11-07-21-02-05.bpo-42282.M1W4Wj.rst | 3 - .../2020-11-12-23-16-14.bpo-42332.fEQIdk.rst | 1 - .../2020-11-13-13-53-11.bpo-42296.DuGrLJ.rst | 4 - .../2020-11-13-17-25-44.bpo-42349.JdWxez.rst | 1 - .../2020-11-16-17-30-03.bpo-42316._DdmpQ.rst | 1 - .../2020-11-16-17-57-09.bpo-42374.t7np1E.rst | 2 - .../2020-11-16-18-13-07.bpo-42202.ZxenYD.rst | 2 - .../2020-11-16-23-45-56.bpo-42381.G4AWxL.rst | 2 - .../2020-11-17-16-25-50.bpo-41686.hX77kL.rst | 4 - ...2020-11-18-23-46-31.bpo-1635741.GVOQ-m.rst | 2 - .../2020-11-22-14-34-55.bpo-42435.uwlB2W.rst | 2 - .../2020-11-24-14-01-43.bpo-42246.c9k9hj.rst | 2 - .../2020-11-30-14-27-29.bpo-42500.excVKU.rst | 2 - .../2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst | 26 - .../2020-12-05-22-34-47.bpo-42576.lEeEl7.rst | 4 - .../2020-06-18-23-37-03.bpo-41028.vM8bC8.rst | 2 - .../2020-11-15-13-46-31.bpo-42153.KjBhx3.rst | 1 - .../2020-11-24-22-54-49.bpo-42238.62EOTu.rst | 2 - .../2020-11-20-01-30-27.bpo-42415.CyD-va.rst | 1 - .../2020-11-21-17-21-21.bpo-42426.kNnPoC.rst | 1 - .../2020-11-30-19-46-05.bpo-42508.fE7w4M.rst | 3 - .../2018-12-14-13-29-17.bpo-35498.LEJHl7.rst | 1 - .../2020-01-21-16-38-25.bpo-39411.9uHFqT.rst | 2 - .../2020-05-08-21-30-54.bpo-40550.i7GWkb.rst | 1 - .../2020-05-29-15-25-41.bpo-40816.w61Pob.rst | 1 - .../2020-06-17-12-24-26.bpo-41001.5mi7b0.rst | 2 - .../2020-06-18-11-35-16.bpo-40968.R8Edbv.rst | 2 - .../2020-07-09-11-32-28.bpo-12800.fNgWwx.rst | 4 - .../2020-07-18-17-39-28.bpo-41332.QRGmA5.rst | 2 - .../2020-08-10-15-06-55.bpo-21041.cYz1eL.rst | 1 - .../2020-08-14-00-39-04.bpo-41543.RpcRjb.rst | 1 - .../2020-08-19-20-17-51.bpo-34215._Cv8c-.rst | 2 - .../2020-08-24-16-59-04.bpo-41625.Cc967V.rst | 2 - .../2020-09-06-21-55-44.bpo-28850.HJNggD.rst | 1 - .../2020-09-08-03-19-04.bpo-40624.0-gYfx.rst | 1 - .../2020-10-01-15-44-52.bpo-41861.YTqJ7z.rst | 2 - .../2020-10-01-16-17-11.bpo-41889.qLkNh8.rst | 1 - .../2020-10-08-23-51-55.bpo-26389.uga44e.rst | 4 - .../2020-10-20-08-28-26.bpo-39825.n6KnG0.rst | 5 - .../2020-10-22-17-26-35.bpo-26131.CAsI3O.rst | 2 - .../2020-10-23-15-47-47.bpo-42133.BzizYV.rst | 2 - .../2020-10-24-04-02-36.bpo-42140.miLqvb.rst | 1 - .../2020-10-29-11-17-35.bpo-42183.50ZcIi.rst | 4 - .../2020-11-01-15-07-20.bpo-41754.DraSZh.rst | 1 - .../2020-11-02-23-05-17.bpo-42236.aJ6ZBR.rst | 3 - .../2020-11-03-09-22-56.bpo-42249.vfNO2u.rst | 1 - .../2020-11-03-14-15-35.bpo-42251.6TC32V.rst | 3 - .../2020-11-05-13-32-41.bpo-42264.r4KYUU.rst | 3 - .../2020-11-05-16-00-03.bpo-41877.FHbngM.rst | 2 - .../2020-11-06-18-20-47.bpo-42131.l2rjjG.rst | 5 - .../2020-11-10-12-09-13.bpo-42308.yaJHH9.rst | 3 - .../2020-11-10-14-27-49.bpo-42237.F363jO.rst | 1 - .../2020-11-10-15-40-56.bpo-42014.ShM37l.rst | 1 - .../2020-11-12-18-21-15.bpo-42333.J9vFmV.rst | 1 - .../2020-11-13-18-53-50.bpo-42350.rsql7V.rst | 3 - .../2020-11-14-13-46-27.bpo-42318.wYAcBD.rst | 1 - .../2020-11-14-14-34-32.bpo-37205.iDbHrw.rst | 5 - .../2020-11-15-15-23-34.bpo-42345.hiIR7x.rst | 2 - .../2020-11-15-17-02-00.bpo-42328.bqpPlR.rst | 4 - .../2020-11-16-15-08-12.bpo-37205.Wh5svI.rst | 3 - .../2020-11-17-23-00-27.bpo-41713.-Us0tf.rst | 2 - .../2020-11-19-04-13-53.bpo-42375.U8bp4s.rst | 1 - ...2020-11-19-09-59-07.bpo-1635741.7cMypH.rst | 2 - .../2020-11-19-10-12-39.bpo-42403.t7q5AX.rst | 5 - .../2020-11-19-10-44-41.bpo-42406.r9rNCj.rst | 3 - .../2020-11-19-16-14-36.bpo-31904.83kf9d.rst | 1 - .../2020-11-19-20-27-51.bpo-42413.fjHrHx.rst | 1 - .../2020-11-20-10-38-34.bpo-15450.E-y9PA.rst | 2 - .../2020-11-20-14-01-29.bpo-42392.-OUzvl.rst | 2 - .../2020-11-20-14-44-07.bpo-41818.33soAw.rst | 1 - .../2020-11-22-12-30-26.bpo-26131.-HsFPG.rst | 1 - .../2020-11-23-23-42-08.bpo-42299.Fdn4Wf.rst | 5 - .../2020-11-24-13-18-05.bpo-28468.8Gh2d4.rst | 2 - .../2020-11-25-22-44-59.bpo-42392.T_DAEl.rst | 2 - .../2020-11-26-12-40-16.bpo-42392.GbmdHE.rst | 2 - .../2020-11-27-09-19-43.bpo-41818.KWYUbL.rst | 1 - .../2020-11-27-16-46-58.bpo-42482.EJC3sd.rst | 1 - .../2020-11-28-04-31-20.bpo-42487.iqtC4L.rst | 1 - .../2020-11-28-06-34-53.bpo-41818.mFSMc2.rst | 1 - .../2020-11-28-22-52-57.bpo-38200.DuWGlW.rst | 1 - .../2020-12-02-07-37-59.bpo-42532.ObNep_.rst | 1 - .../2020-12-03-15-42-32.bpo-42116.yIwroP.rst | 1 - .../2020-12-03-22-22-24.bpo-17735.Qsaaue.rst | 4 - .../2020-12-03-22-42-03.bpo-42562.2hPmhi.rst | 2 - .../2020-12-04-03-51-12.bpo-5054.53StYZ.rst | 5 - .../2020-05-28-06-06-47.bpo-40791.QGZClX.rst | 1 - .../2020-05-20-14-28-48.bpo-31904.yJik6k.rst | 1 - .../2020-05-20-17-28-46.bpo-31904.yt83Ge.rst | 1 - .../2020-09-18-16-14-03.bpo-41561.uPnwrW.rst | 1 - .../2020-11-13-21-51-34.bpo-40754.Ekoxkg.rst | 1 - .../2020-11-20-15-07-18.bpo-31904.EBJXjJ.rst | 1 - .../2020-11-23-11-11-29.bpo-31904.V3sUZk.rst | 1 - .../2020-11-24-17-26-41.bpo-31904.eug834.rst | 1 - .../2020-11-25-17-00-53.bpo-31904.ue4hd9.rst | 1 - .../2020-11-26-11-13-13.bpo-31904.ay4g89.rst | 1 - .../2020-12-01-15-51-19.bpo-31904.iwetj4.rst | 1 - .../2020-12-03-13-32-44.bpo-42553.2TRE2N.rst | 3 - .../2020-12-04-11-47-09.bpo-41473.W_updK.rst | 3 - .../2020-05-03-01-30-46.bpo-36310.xDxxwY.rst | 2 - .../2020-11-20-15-11-05.bpo-42212.sjzgOf.rst | 3 - .../2020-11-15-23-01-14.bpo-38506.hhdnuP.rst | 2 - .../2020-11-16-22-41-02.bpo-42120.9scgko.rst | 1 - .../2020-10-23-10-26-53.bpo-38443.vu64tl.rst | 2 - .../2020-11-01-15-10-28.bpo-42232.2zI1GN.rst | 1 - .../2020-11-01-16-40-23.bpo-41100.BApztP.rst | 8 - .../2020-11-15-16-43-45.bpo-41116.oCkbrF.rst | 1 - .../2020-12-02-15-48-40.bpo-42504.RQmMOR.rst | 1 - README.rst | 2 +- 148 files changed, 1573 insertions(+), 372 deletions(-) create mode 100644 Misc/NEWS.d/3.10.0a3.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-06-17-09-05-02.bpo-40998.sgqmg9.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-10-19-15-41-05.bpo-42087.2AhRFP.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-11-12-13-45-15.bpo-38823.C0z_Fe.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-11-13-15-04-53.bpo-41617.98_oaE.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-11-18-11-58-44.bpo-42398.Yt5wO8.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-11-19-17-01-50.bpo-31904.894dk2.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-07-08-21-01-49.bpo-41073.VqQZON.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-10-19-15-58-16.bpo-42085.NhEf3W.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-10-27-21-10-14.bpo-42171.S3FWTP.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-03-19-47-06.bpo-41832.dL1VJJ.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-04-16-31-55.bpo-42260.CmgHtF.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-04-17-22-36.bpo-42262.fCWzBb.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-05-18-02-07.bpo-42260.pAeaNR.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-10-14-27-39.bpo-42260.-Br3Co.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-13-01-40-28.bpo-40170.uh8lEf.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-18-08-45-36.bpo-1635741.VLZfiY.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-18-09-16-23.bpo-1635741.gkoI7Y.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-18-09-46-35.bpo-1635741.SH8OIT.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-18-10-52-38.bpo-1635741.FrWAwJ.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-18-15-21-59.bpo-39573.VB3G2y.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-18-20-11-13.bpo-1635741.fe3iRb.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-18-20-33-35.bpo-1635741.B4ztSk.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-19-09-17-01.bpo-1635741.6F9o6L.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-19-12-06-43.bpo-1635741.KEfZpn.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-19-15-33-42.bpo-1635741.9tVsZt.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-19-17-44-36.bpo-1635741.qBZc3o.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-11-21-12-27-19.bpo-42423.ByJHhY.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-22-17-27-08.bpo-26131.B-Veg7.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-01-23-34-56.bpo-42233.zOSzja.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-02-14-39-48.bpo-40077.grY9TG.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-02-15-48-17.bpo-42246.3CNQEX.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-03-21-58-27.bpo-40077.a9qM1j.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-04-23-03-25.bpo-42266.G4hGDe.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-07-21-02-05.bpo-42282.M1W4Wj.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-12-23-16-14.bpo-42332.fEQIdk.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-13-13-53-11.bpo-42296.DuGrLJ.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-13-17-25-44.bpo-42349.JdWxez.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-30-03.bpo-42316._DdmpQ.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-57-09.bpo-42374.t7np1E.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-16-18-13-07.bpo-42202.ZxenYD.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-16-23-45-56.bpo-42381.G4AWxL.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-17-16-25-50.bpo-41686.hX77kL.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-18-23-46-31.bpo-1635741.GVOQ-m.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-22-14-34-55.bpo-42435.uwlB2W.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-24-14-01-43.bpo-42246.c9k9hj.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-30-14-27-29.bpo-42500.excVKU.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-06-18-23-37-03.bpo-41028.vM8bC8.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-11-15-13-46-31.bpo-42153.KjBhx3.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-11-24-22-54-49.bpo-42238.62EOTu.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-11-20-01-30-27.bpo-42415.CyD-va.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-11-21-17-21-21.bpo-42426.kNnPoC.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-21-16-38-25.bpo-39411.9uHFqT.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-08-21-30-54.bpo-40550.i7GWkb.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-29-15-25-41.bpo-40816.w61Pob.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-17-12-24-26.bpo-41001.5mi7b0.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-18-11-35-16.bpo-40968.R8Edbv.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-18-17-39-28.bpo-41332.QRGmA5.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-14-00-39-04.bpo-41543.RpcRjb.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-19-20-17-51.bpo-34215._Cv8c-.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-24-16-59-04.bpo-41625.Cc967V.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-06-21-55-44.bpo-28850.HJNggD.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-08-03-19-04.bpo-40624.0-gYfx.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-01-15-44-52.bpo-41861.YTqJ7z.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-08-23-51-55.bpo-26389.uga44e.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-22-17-26-35.bpo-26131.CAsI3O.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-23-15-47-47.bpo-42133.BzizYV.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-24-04-02-36.bpo-42140.miLqvb.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-29-11-17-35.bpo-42183.50ZcIi.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-01-15-07-20.bpo-41754.DraSZh.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-02-23-05-17.bpo-42236.aJ6ZBR.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-03-09-22-56.bpo-42249.vfNO2u.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-06-18-20-47.bpo-42131.l2rjjG.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-10-12-09-13.bpo-42308.yaJHH9.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-10-14-27-49.bpo-42237.F363jO.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-10-15-40-56.bpo-42014.ShM37l.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-12-18-21-15.bpo-42333.J9vFmV.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-13-18-53-50.bpo-42350.rsql7V.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-14-14-34-32.bpo-37205.iDbHrw.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-15-15-23-34.bpo-42345.hiIR7x.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-15-17-02-00.bpo-42328.bqpPlR.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-16-15-08-12.bpo-37205.Wh5svI.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-17-23-00-27.bpo-41713.-Us0tf.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-19-09-59-07.bpo-1635741.7cMypH.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-19-10-12-39.bpo-42403.t7q5AX.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-19-10-44-41.bpo-42406.r9rNCj.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-19-16-14-36.bpo-31904.83kf9d.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-19-20-27-51.bpo-42413.fjHrHx.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-20-10-38-34.bpo-15450.E-y9PA.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-20-14-01-29.bpo-42392.-OUzvl.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-20-14-44-07.bpo-41818.33soAw.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-22-12-30-26.bpo-26131.-HsFPG.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-23-23-42-08.bpo-42299.Fdn4Wf.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-24-13-18-05.bpo-28468.8Gh2d4.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-25-22-44-59.bpo-42392.T_DAEl.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-26-12-40-16.bpo-42392.GbmdHE.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-27-09-19-43.bpo-41818.KWYUbL.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-27-16-46-58.bpo-42482.EJC3sd.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-28-04-31-20.bpo-42487.iqtC4L.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-28-06-34-53.bpo-41818.mFSMc2.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-28-22-52-57.bpo-38200.DuWGlW.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-12-03-22-22-24.bpo-17735.Qsaaue.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-12-03-22-42-03.bpo-42562.2hPmhi.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-12-04-03-51-12.bpo-5054.53StYZ.rst delete mode 100644 Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-05-20-14-28-48.bpo-31904.yJik6k.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-05-20-17-28-46.bpo-31904.yt83Ge.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-09-18-16-14-03.bpo-41561.uPnwrW.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-11-13-21-51-34.bpo-40754.Ekoxkg.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-11-20-15-07-18.bpo-31904.EBJXjJ.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-11-23-11-11-29.bpo-31904.V3sUZk.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-11-24-17-26-41.bpo-31904.eug834.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-11-25-17-00-53.bpo-31904.ue4hd9.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-11-26-11-13-13.bpo-31904.ay4g89.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-12-01-15-51-19.bpo-31904.iwetj4.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-12-03-13-32-44.bpo-42553.2TRE2N.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-12-04-11-47-09.bpo-41473.W_updK.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2020-05-03-01-30-46.bpo-36310.xDxxwY.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2020-11-20-15-11-05.bpo-42212.sjzgOf.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-11-15-23-01-14.bpo-38506.hhdnuP.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-11-16-22-41-02.bpo-42120.9scgko.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-10-23-10-26-53.bpo-38443.vu64tl.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-11-01-15-10-28.bpo-42232.2zI1GN.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-11-01-16-40-23.bpo-41100.BApztP.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-11-15-16-43-45.bpo-41116.oCkbrF.rst delete mode 100644 Misc/NEWS.d/next/macOS/2020-12-02-15-48-40.bpo-42504.RQmMOR.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index b7d2a9aa2e1b93..6174cb6d5f8a30 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 10 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 2 +#define PY_RELEASE_SERIAL 3 /* Version as a string */ -#define PY_VERSION "3.10.0a2+" +#define PY_VERSION "3.10.0a3" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index b424b1d0f9b224..49630bb4b81d7d 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Tue Nov 3 00:01:01 2020 +# Autogenerated by Sphinx on Mon Dec 7 19:34:00 2020 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -5301,24 +5301,23 @@ 'for the\n' 'conversion. The alternate form is defined differently for ' 'different\n' - 'types. This option is only valid for integer, float, ' - 'complex and\n' - 'Decimal types. For integers, when binary, octal, or ' - 'hexadecimal output\n' - 'is used, this option adds the prefix respective "\'0b\'", ' - '"\'0o\'", or\n' - '"\'0x\'" to the output value. For floats, complex and ' - 'Decimal the\n' - 'alternate form causes the result of the conversion to ' - 'always contain a\n' - 'decimal-point character, even if no digits follow it. ' - 'Normally, a\n' - 'decimal-point character appears in the result of these ' - 'conversions\n' - 'only if a digit follows it. In addition, for "\'g\'" and ' - '"\'G\'"\n' - 'conversions, trailing zeros are not removed from the ' - 'result.\n' + 'types. This option is only valid for integer, float and ' + 'complex\n' + 'types. For integers, when binary, octal, or hexadecimal ' + 'output is\n' + 'used, this option adds the prefix respective "\'0b\'", ' + '"\'0o\'", or "\'0x\'"\n' + 'to the output value. For float and complex the alternate ' + 'form causes\n' + 'the result of the conversion to always contain a ' + 'decimal-point\n' + 'character, even if no digits follow it. Normally, a ' + 'decimal-point\n' + 'character appears in the result of these conversions only ' + 'if a digit\n' + 'follows it. In addition, for "\'g\'" and "\'G\'" ' + 'conversions, trailing\n' + 'zeros are not removed from the result.\n' '\n' 'The "\',\'" option signals the use of a comma for a ' 'thousands separator.\n' @@ -5456,9 +5455,8 @@ 'the integer\n' 'to a floating point number before formatting.\n' '\n' - 'The available presentation types for floating point and ' - 'decimal values\n' - 'are:\n' + 'The available presentation types for "float" and "Decimal" ' + 'values are:\n' '\n' ' ' '+-----------+------------------------------------------------------------+\n' @@ -5467,24 +5465,50 @@ '|\n' ' ' '|===========|============================================================|\n' - ' | "\'e\'" | Exponent notation. Prints the number in ' - 'scientific |\n' - ' | | notation using the letter ‘e’ to indicate ' - 'the exponent. |\n' - ' | | The default precision is ' - '"6". |\n' + ' | "\'e\'" | Scientific notation. For a given ' + 'precision "p", formats |\n' + ' | | the number in scientific notation with the ' + 'letter ‘e’ |\n' + ' | | separating the coefficient from the ' + 'exponent. The |\n' + ' | | coefficient has one digit before and "p" ' + 'digits after the |\n' + ' | | decimal point, for a total of "p + 1" ' + 'significant digits. |\n' + ' | | With no precision given, uses a precision ' + 'of "6" digits |\n' + ' | | after the decimal point for "float", and ' + 'shows all |\n' + ' | | coefficient digits for "Decimal". If no ' + 'digits follow the |\n' + ' | | decimal point, the decimal point is also ' + 'removed unless |\n' + ' | | the "#" option is ' + 'used. |\n' ' ' '+-----------+------------------------------------------------------------+\n' - ' | "\'E\'" | Exponent notation. Same as "\'e\'" ' - 'except it uses an upper |\n' + ' | "\'E\'" | Scientific notation. Same as "\'e\'" ' + 'except it uses an upper |\n' ' | | case ‘E’ as the separator ' 'character. |\n' ' ' '+-----------+------------------------------------------------------------+\n' - ' | "\'f\'" | Fixed-point notation. Displays the ' - 'number as a fixed-point |\n' - ' | | number. The default precision is ' - '"6". |\n' + ' | "\'f\'" | Fixed-point notation. For a given ' + 'precision "p", formats |\n' + ' | | the number as a decimal number with ' + 'exactly "p" digits |\n' + ' | | following the decimal point. With no ' + 'precision given, uses |\n' + ' | | a precision of "6" digits after the ' + 'decimal point for |\n' + ' | | "float", and uses a precision large enough ' + 'to show all |\n' + ' | | coefficient digits for "Decimal". If no ' + 'digits follow the |\n' + ' | | decimal point, the decimal point is also ' + 'removed unless |\n' + ' | | the "#" option is ' + 'used. |\n' ' ' '+-----------+------------------------------------------------------------+\n' ' | "\'F\'" | Fixed-point notation. Same as "\'f\'", ' @@ -5530,9 +5554,14 @@ ' | | regardless of the precision. A precision ' 'of "0" is |\n' ' | | treated as equivalent to a precision of ' - '"1". The default |\n' - ' | | precision is ' - '"6". |\n' + '"1". With no |\n' + ' | | precision given, uses a precision of "6" ' + 'significant |\n' + ' | | digits for "float", and shows all ' + 'coefficient digits for |\n' + ' | | ' + '"Decimal". ' + '|\n' ' ' '+-----------+------------------------------------------------------------+\n' ' | "\'G\'" | General format. Same as "\'g\'" except ' diff --git a/Misc/NEWS.d/3.10.0a3.rst b/Misc/NEWS.d/3.10.0a3.rst new file mode 100644 index 00000000000000..0b76367f944451 --- /dev/null +++ b/Misc/NEWS.d/3.10.0a3.rst @@ -0,0 +1,1504 @@ +.. bpo: 40791 +.. date: 2020-05-28-06-06-47 +.. nonce: QGZClX +.. release date: 2020-12-07 +.. section: Security + +Add ``volatile`` to the accumulator variable in ``hmac.compare_digest``, +making constant-time-defeating optimizations less likely. + +.. + +.. bpo: 42576 +.. date: 2020-12-05-22-34-47 +.. nonce: lEeEl7 +.. section: Core and Builtins + +``types.GenericAlias`` will now raise a ``TypeError`` when attempting to +initialize with a keyword argument. Previously, this would cause the +interpreter to crash if the interpreter was compiled with debug symbols. +This does not affect interpreters compiled for release. Patch by Ken Jin. + +.. + +.. bpo: 42536 +.. date: 2020-12-02-20-23-31 +.. nonce: Kx3ZOu +.. section: Core and Builtins + +Several built-in and standard library types now ensure that their internal +result tuples are always tracked by the :term:`garbage collector `: + +- :meth:`collections.OrderedDict.items() ` + +- :meth:`dict.items` + +- :func:`enumerate` + +- :func:`functools.reduce` + +- :func:`itertools.combinations` + +- :func:`itertools.combinations_with_replacement` + +- :func:`itertools.permutations` + +- :func:`itertools.product` + +- :func:`itertools.zip_longest` + +- :func:`zip` + +Previously, they could have become untracked by a prior garbage collection. +Patch by Brandt Bucher. + +.. + +.. bpo: 42500 +.. date: 2020-11-30-14-27-29 +.. nonce: excVKU +.. section: Core and Builtins + +Improve handling of exceptions near recursion limit. Converts a number of +Fatal Errors in RecursionErrors. + +.. + +.. bpo: 42246 +.. date: 2020-11-24-14-01-43 +.. nonce: c9k9hj +.. section: Core and Builtins + +PEP 626: After a return, the f_lineno attribute of a frame is always the +last line executed. + +.. + +.. bpo: 42435 +.. date: 2020-11-22-14-34-55 +.. nonce: uwlB2W +.. section: Core and Builtins + +Speed up comparison of bytes objects with non-bytes objects when option +:option:`-b` is specified. Speed up comparison of bytarray objects with +non-buffer object. + +.. + +.. bpo: 1635741 +.. date: 2020-11-18-23-46-31 +.. nonce: GVOQ-m +.. section: Core and Builtins + +Port the ``_warnings`` extension module to the multi-phase initialization +API (:pep:`489`). Patch by Victor Stinner. + +.. + +.. bpo: 41686 +.. date: 2020-11-17-16-25-50 +.. nonce: hX77kL +.. section: Core and Builtins + +On Windows, the ``SIGINT`` event, ``_PyOS_SigintEvent()``, is now created +even if Python is configured to not install signal handlers (if +:c:member:`PyConfig.install_signal_handlers` equals to 0, or +``Py_InitializeEx(0)``). + +.. + +.. bpo: 42381 +.. date: 2020-11-16-23-45-56 +.. nonce: G4AWxL +.. section: Core and Builtins + +Allow assignment expressions in set literals and set comprehensions as per +PEP 572. Patch by Pablo Galindo. + +.. + +.. bpo: 42202 +.. date: 2020-11-16-18-13-07 +.. nonce: ZxenYD +.. section: Core and Builtins + +Change function parameters annotations internal representation to tuple of +strings. Patch provided by Yurii Karabas. + +.. + +.. bpo: 42374 +.. date: 2020-11-16-17-57-09 +.. nonce: t7np1E +.. section: Core and Builtins + +Fix a regression introduced by the new parser, where an unparenthesized +walrus operator was not allowed within generator expressions. + +.. + +.. bpo: 42316 +.. date: 2020-11-16-17-30-03 +.. nonce: _DdmpQ +.. section: Core and Builtins + +Allow an unparenthesized walrus in subscript indexes. + +.. + +.. bpo: 42349 +.. date: 2020-11-13-17-25-44 +.. nonce: JdWxez +.. section: Core and Builtins + +Make sure that the compiler front-end produces a well-formed control flow +graph. Be be more aggressive in the compiler back-end, as it is now safe to +do so. + +.. + +.. bpo: 42296 +.. date: 2020-11-13-13-53-11 +.. nonce: DuGrLJ +.. section: Core and Builtins + +On Windows, fix a regression in signal handling which prevented to interrupt +a program using CTRL+C. The signal handler can be run in a thread different +than the Python thread, in which case the test deciding if the thread can +handle signals is wrong. + +.. + +.. bpo: 42332 +.. date: 2020-11-12-23-16-14 +.. nonce: fEQIdk +.. section: Core and Builtins + +:class:`types.GenericAlias` objects can now be the targets of weakrefs. + +.. + +.. bpo: 42282 +.. date: 2020-11-07-21-02-05 +.. nonce: M1W4Wj +.. section: Core and Builtins + +Optimise constant subexpressions that appear as part of named expressions +(previously the AST optimiser did not descend into named expressions). Patch +by Nick Coghlan. + +.. + +.. bpo: 42266 +.. date: 2020-11-04-23-03-25 +.. nonce: G4hGDe +.. section: Core and Builtins + +Fixed a bug with the LOAD_ATTR opcode cache that was not respecting +monkey-patching a class-level attribute to make it a descriptor. Patch by +Pablo Galindo. + +.. + +.. bpo: 40077 +.. date: 2020-11-03-21-58-27 +.. nonce: a9qM1j +.. section: Core and Builtins + +Convert :mod:`queue` to use heap types. + +.. + +.. bpo: 42246 +.. date: 2020-11-02-15-48-17 +.. nonce: 3CNQEX +.. section: Core and Builtins + +Improved accuracy of line tracing events and f_lineno attribute of Frame +objects. See PEP 626 for details. + +.. + +.. bpo: 40077 +.. date: 2020-11-02-14-39-48 +.. nonce: grY9TG +.. section: Core and Builtins + +Convert :mod:`mmap` to use heap types. + +.. + +.. bpo: 42233 +.. date: 2020-11-01-23-34-56 +.. nonce: zOSzja +.. section: Core and Builtins + +Allow ``GenericAlias`` objects to use :ref:`union type expressions +`. This allows expressions like ``list[int] | dict[float, +str]`` where previously a ``TypeError`` would have been thrown. This also +fixes union type expressions not de-duplicating ``GenericAlias`` objects. +(Contributed by Ken Jin in :issue:`42233`.) + +.. + +.. bpo: 26131 +.. date: 2020-10-22-17-27-08 +.. nonce: B-Veg7 +.. section: Core and Builtins + +The import system triggers a `ImportWarning` when it falls back to using +`load_module()`. + +.. + +.. bpo: 5054 +.. date: 2020-12-04-03-51-12 +.. nonce: 53StYZ +.. section: Library + +CGIHTTPRequestHandler.run_cgi() HTTP_ACCEPT improperly parsed. Replace the +special purpose getallmatchingheaders with generic get_all method and add +relevant tests. + +Original Patch by Martin Panter. Modified by Senthil Kumaran. + +.. + +.. bpo: 42562 +.. date: 2020-12-03-22-42-03 +.. nonce: 2hPmhi +.. section: Library + +Fix issue when dis failed to parse function that has no line numbers. Patch +provided by Yurii Karabas. + +.. + +.. bpo: 17735 +.. date: 2020-12-03-22-22-24 +.. nonce: Qsaaue +.. section: Library + +:func:`inspect.findsource` now raises :exc:`OSError` instead of +:exc:`IndexError` when :attr:`co_lineno` of a code object is greater than +the file length. This can happen, for example, when a file is edited after +it was imported. PR by Irit Katriel. + +.. + +.. bpo: 42116 +.. date: 2020-12-03-15-42-32 +.. nonce: yIwroP +.. section: Library + +Fix handling of trailing comments by :func:`inspect.getsource`. + +.. + +.. bpo: 42532 +.. date: 2020-12-02-07-37-59 +.. nonce: ObNep_ +.. section: Library + +Remove unexpected call of ``__bool__`` when passing a ``spec_arg`` argument +to a Mock. + +.. + +.. bpo: 38200 +.. date: 2020-11-28-22-52-57 +.. nonce: DuWGlW +.. section: Library + +Added itertools.pairwise() + +.. + +.. bpo: 41818 +.. date: 2020-11-28-06-34-53 +.. nonce: mFSMc2 +.. section: Library + +Fix test_master_read() so that it succeeds on all platforms that either +raise OSError or return b"" upon reading from master. + +.. + +.. bpo: 42487 +.. date: 2020-11-28-04-31-20 +.. nonce: iqtC4L +.. section: Library + +ChainMap.__iter__ no longer calls __getitem__ on underlying maps + +.. + +.. bpo: 42482 +.. date: 2020-11-27-16-46-58 +.. nonce: EJC3sd +.. section: Library + +:class:`~traceback.TracebackException` no longer holds a reference to the +exception's traceback object. Consequently, instances of TracebackException +for equivalent but non-equal exceptions now compare as equal. + +.. + +.. bpo: 41818 +.. date: 2020-11-27-09-19-43 +.. nonce: KWYUbL +.. section: Library + +Make test_openpty() avoid unexpected success due to number of rows and/or +number of columns being == 0. + +.. + +.. bpo: 42392 +.. date: 2020-11-26-12-40-16 +.. nonce: GbmdHE +.. section: Library + +Remove loop parameter from ``asyncio.subprocess`` and ``asyncio.tasks`` +functions. Patch provided by Yurii Karabas. + +.. + +.. bpo: 42392 +.. date: 2020-11-25-22-44-59 +.. nonce: T_DAEl +.. section: Library + +Remove loop parameter from ``asyncio.open_connection`` and +``asyncio.start_server`` functions. Patch provided by Yurii Karabas. + +.. + +.. bpo: 28468 +.. date: 2020-11-24-13-18-05 +.. nonce: 8Gh2d4 +.. section: Library + +Add :func:`platform.freedesktop_os_release` function to parse +freedesktop.org ``os-release`` files. + +.. + +.. bpo: 42299 +.. date: 2020-11-23-23-42-08 +.. nonce: Fdn4Wf +.. section: Library + +Removed the ``formatter`` module, which was deprecated in Python 3.4. It is +somewhat obsolete, little used, and not tested. It was originally scheduled +to be removed in Python 3.6, but such removals were delayed until after +Python 2.7 EOL. Existing users should copy whatever classes they use into +their code. Patch by Dong-hee Na and and Terry J. Reedy. + +.. + +.. bpo: 26131 +.. date: 2020-11-22-12-30-26 +.. nonce: -HsFPG +.. section: Library + +Deprecate zipimport.zipimporter.load_module() in favour of exec_module(). + +.. + +.. bpo: 41818 +.. date: 2020-11-20-14-44-07 +.. nonce: 33soAw +.. section: Library + +Updated tests for the pty library. test_basic() has been changed to +test_openpty(); this additionally checks if slave termios and slave winsize +are being set properly by pty.openpty(). In order to add support for +FreeBSD, NetBSD, OpenBSD, and Darwin, this also adds test_master_read(), +which demonstrates that pty.spawn() should not depend on an OSError to exit +from its copy loop. + +.. + +.. bpo: 42392 +.. date: 2020-11-20-14-01-29 +.. nonce: -OUzvl +.. section: Library + +Remove loop parameter from ``__init__`` in all ``asyncio.locks`` and +``asyncio.Queue`` classes. Patch provided by Yurii Karabas. + +.. + +.. bpo: 15450 +.. date: 2020-11-20-10-38-34 +.. nonce: E-y9PA +.. section: Library + +Make :class:`filecmp.dircmp` respect subclassing. Now the +:attr:`filecmp.dircmp.subdirs` behaves as expected when subclassing dircmp. + +.. + +.. bpo: 42413 +.. date: 2020-11-19-20-27-51 +.. nonce: fjHrHx +.. section: Library + +The exception :exc:`socket.timeout` is now an alias of :exc:`TimeoutError`. + +.. + +.. bpo: 31904 +.. date: 2020-11-19-16-14-36 +.. nonce: 83kf9d +.. section: Library + +Support signal module on VxWorks. + +.. + +.. bpo: 42406 +.. date: 2020-11-19-10-44-41 +.. nonce: r9rNCj +.. section: Library + +We fixed an issue in `pickle.whichmodule` in which importing +`multiprocessing` could change the how pickle identifies which module an +object belongs to, potentially breaking the unpickling of those objects. + +.. + +.. bpo: 42403 +.. date: 2020-11-19-10-12-39 +.. nonce: t7q5AX +.. section: Library + +Simplify the :mod:`importlib` external bootstrap code: +``importlib._bootstrap_external`` now uses regular imports to import builtin +modules. When it is imported, the builtin :func:`__import__()` function is +already fully working and so can be used to import builtin modules like +:mod:`sys`. Patch by Victor Stinner. + +.. + +.. bpo: 1635741 +.. date: 2020-11-19-09-59-07 +.. nonce: 7cMypH +.. section: Library + +Convert _sre module types to heap types (PEP 384). Patch by Erlend E. +Aasland. + +.. + +.. bpo: 42375 +.. date: 2020-11-19-04-13-53 +.. nonce: U8bp4s +.. section: Library + +subprocess module update for DragonFlyBSD support. + +.. + +.. bpo: 41713 +.. date: 2020-11-17-23-00-27 +.. nonce: -Us0tf +.. section: Library + +Port the ``_signal`` extension module to the multi-phase initialization API +(:pep:`489`). Patch by Victor Stinner and Mohamed Koubaa. + +.. + +.. bpo: 37205 +.. date: 2020-11-16-15-08-12 +.. nonce: Wh5svI +.. section: Library + +:func:`time.time()`, :func:`time.perf_counter()` and +:func:`time.monotonic()` functions can no longer fail with a Python fatal +error, instead raise a regular Python exception on failure. + +.. + +.. bpo: 42328 +.. date: 2020-11-15-17-02-00 +.. nonce: bqpPlR +.. section: Library + +Fixed :meth:`tkinter.ttk.Style.map`. The function accepts now the +representation of the default state as empty sequence (as returned by +``Style.map()``). The structure of the result is now the same on all +platform and does not depend on the value of ``wantobjects``. + +.. + +.. bpo: 42345 +.. date: 2020-11-15-15-23-34 +.. nonce: hiIR7x +.. section: Library + +Fix various issues with ``typing.Literal`` parameter handling (flatten, +deduplicate, use type to cache key). Patch provided by Yurii Karabas. + +.. + +.. bpo: 37205 +.. date: 2020-11-14-14-34-32 +.. nonce: iDbHrw +.. section: Library + +:func:`time.perf_counter()` on Windows and :func:`time.monotonic()` on macOS +are now system-wide. Previously, they used an offset computed at startup to +reduce the precision loss caused by the float type. Use +:func:`time.perf_counter_ns()` and :func:`time.monotonic_ns()` added in +Python 3.7 to avoid this precision loss. + +.. + +.. bpo: 42318 +.. date: 2020-11-14-13-46-27 +.. nonce: wYAcBD +.. section: Library + +Fixed support of non-BMP characters in :mod:`tkinter` on macOS. + +.. + +.. bpo: 42350 +.. date: 2020-11-13-18-53-50 +.. nonce: rsql7V +.. section: Library + +Fix the :class:`threading.Thread` class at fork: do nothing if the thread is +already stopped (ex: fork called at Python exit). Previously, an error was +logged in the child process. + +.. + +.. bpo: 42333 +.. date: 2020-11-12-18-21-15 +.. nonce: J9vFmV +.. section: Library + +Port _ssl extension module to heap types. + +.. + +.. bpo: 42014 +.. date: 2020-11-10-15-40-56 +.. nonce: ShM37l +.. section: Library + +The ``onerror`` callback from ``shutil.rmtree`` now receives correct +function when ``os.open`` fails. + +.. + +.. bpo: 42237 +.. date: 2020-11-10-14-27-49 +.. nonce: F363jO +.. section: Library + +Fix `os.sendfile()` on illumos. + +.. + +.. bpo: 42308 +.. date: 2020-11-10-12-09-13 +.. nonce: yaJHH9 +.. section: Library + +Add :data:`threading.__excepthook__` to allow retrieving the original value +of :func:`threading.excepthook` in case it is set to a broken or a different +value. Patch by Mario Corchero. + +.. + +.. bpo: 42131 +.. date: 2020-11-06-18-20-47 +.. nonce: l2rjjG +.. section: Library + +Implement PEP 451/spec methods on zipimport.zipimporter: find_spec(), +create_module(), and exec_module(). + +This also allows for the documented deprecation of find_loader(), +find_module(), and load_module(). + +.. + +.. bpo: 41877 +.. date: 2020-11-05-16-00-03 +.. nonce: FHbngM +.. section: Library + +Mock objects which are not unsafe will now raise an AttributeError if an +attribute with the prefix asert, aseert, or assrt is accessed, in addition +to this already happening for the prefixes assert or assret. + +.. + +.. bpo: 42264 +.. date: 2020-11-05-13-32-41 +.. nonce: r4KYUU +.. section: Library + +``sqlite3.OptimizedUnicode`` has been undocumented and obsolete since Python +3.3, when it was made an alias to :class:`str`. It is now deprecated, +scheduled for removal in Python 3.12. + +.. + +.. bpo: 42251 +.. date: 2020-11-03-14-15-35 +.. nonce: 6TC32V +.. section: Library + +Added :func:`threading.gettrace` and :func:`threading.getprofile` to +retrieve the functions set by :func:`threading.settrace` and +:func:`threading.setprofile` respectively. Patch by Mario Corchero. + +.. + +.. bpo: 42249 +.. date: 2020-11-03-09-22-56 +.. nonce: vfNO2u +.. section: Library + +Fixed writing binary Plist files larger than 4 GiB. + +.. + +.. bpo: 42236 +.. date: 2020-11-02-23-05-17 +.. nonce: aJ6ZBR +.. section: Library + +On Unix, the :func:`os.device_encoding` function now returns ``'UTF-8'`` +rather than the device encoding if the :ref:`Python UTF-8 Mode ` +is enabled. + +.. + +.. bpo: 41754 +.. date: 2020-11-01-15-07-20 +.. nonce: DraSZh +.. section: Library + +webbrowser: Ignore *NotADirectoryError* when calling ``xdg-settings``. + +.. + +.. bpo: 42183 +.. date: 2020-10-29-11-17-35 +.. nonce: 50ZcIi +.. section: Library + +Fix a stack overflow error for asyncio Task or Future repr(). + +The overflow occurs under some circumstances when a Task or Future +recursively returns itself. + +.. + +.. bpo: 42140 +.. date: 2020-10-24-04-02-36 +.. nonce: miLqvb +.. section: Library + +Improve asyncio.wait function to create the futures set just one time. + +.. + +.. bpo: 42133 +.. date: 2020-10-23-15-47-47 +.. nonce: BzizYV +.. section: Library + +Update various modules in the stdlib to fall back on `__spec__.loader` when +`__loader__` isn't defined on a module. + +.. + +.. bpo: 26131 +.. date: 2020-10-22-17-26-35 +.. nonce: CAsI3O +.. section: Library + +The `load_module()` methods found in importlib now trigger a +DeprecationWarning. + +.. + +.. bpo: 39825 +.. date: 2020-10-20-08-28-26 +.. nonce: n6KnG0 +.. section: Library + +Windows: Change ``sysconfig.get_config_var('EXT_SUFFIX')`` to the expected +full ``platform_tag.extension`` format. Previously it was hard-coded to +``.pyd``, now it is compatible with ``distutils.sysconfig`` and will result +in something like ``.cp38-win_amd64.pyd``. This brings windows into +conformance with the other platforms. + +.. + +.. bpo: 26389 +.. date: 2020-10-08-23-51-55 +.. nonce: uga44e +.. section: Library + +The :func:`traceback.format_exception`, +:func:`traceback.format_exception_only`, and +:func:`traceback.print_exception` functions can now take an exception object +as a positional-only argument. + +.. + +.. bpo: 41889 +.. date: 2020-10-01-16-17-11 +.. nonce: qLkNh8 +.. section: Library + +Enum: fix regression involving inheriting a multiply-inherited enum + +.. + +.. bpo: 41861 +.. date: 2020-10-01-15-44-52 +.. nonce: YTqJ7z +.. section: Library + +Convert :mod:`sqlite3` to use heap types (PEP 384). Patch by Erlend E. +Aasland. + +.. + +.. bpo: 40624 +.. date: 2020-09-08-03-19-04 +.. nonce: 0-gYfx +.. section: Library + +Added support for the XPath ``!=`` operator in xml.etree + +.. + +.. bpo: 28850 +.. date: 2020-09-06-21-55-44 +.. nonce: HJNggD +.. section: Library + +Fix :meth:`pprint.PrettyPrinter.format` overrides being ignored for contents +of small containers. The :func:`pprint._safe_repr` function was removed. + +.. + +.. bpo: 41625 +.. date: 2020-08-24-16-59-04 +.. nonce: Cc967V +.. section: Library + +Expose the :c:func:`splice` as :func:`os.splice` in the :mod:`os` module. +Patch by Pablo Galindo + +.. + +.. bpo: 34215 +.. date: 2020-08-19-20-17-51 +.. nonce: _Cv8c- +.. section: Library + +Clarify the error message for :exc:`asyncio.IncompleteReadError` when +``expected`` is ``None``. + +.. + +.. bpo: 41543 +.. date: 2020-08-14-00-39-04 +.. nonce: RpcRjb +.. section: Library + +Add async context manager support for contextlib.nullcontext. + +.. + +.. bpo: 21041 +.. date: 2020-08-10-15-06-55 +.. nonce: cYz1eL +.. section: Library + +:attr:`pathlib.PurePath.parents` now supports negative indexing. Patch +contributed by Yaroslav Pankovych. + +.. + +.. bpo: 41332 +.. date: 2020-07-18-17-39-28 +.. nonce: QRGmA5 +.. section: Library + +Added missing connect_accepted_socket() method to +``asyncio.AbstractEventLoop``. + +.. + +.. bpo: 12800 +.. date: 2020-07-09-11-32-28 +.. nonce: fNgWwx +.. section: Library + +Extracting a symlink from a tarball should succeed and overwrite the symlink +if it already exists. The fix is to remove the existing file or symlink +before extraction. Based on patch by Chris AtLee, Jeffrey Kintscher, and +Senthil Kumaran. + +.. + +.. bpo: 40968 +.. date: 2020-06-18-11-35-16 +.. nonce: R8Edbv +.. section: Library + +:mod:`urllib.request` and :mod:`http.client` now send ``http/1.1`` ALPN +extension during TLS handshake when no custom context is supplied. + +.. + +.. bpo: 41001 +.. date: 2020-06-17-12-24-26 +.. nonce: 5mi7b0 +.. section: Library + +Add func:`os.eventfd` to provide a low level interface for Linux's event +notification file descriptor. + +.. + +.. bpo: 40816 +.. date: 2020-05-29-15-25-41 +.. nonce: w61Pob +.. section: Library + +Add AsyncContextDecorator to contextlib to support async context manager as +a decorator. + +.. + +.. bpo: 40550 +.. date: 2020-05-08-21-30-54 +.. nonce: i7GWkb +.. section: Library + +Fix time-of-check/time-of-action issue in subprocess.Popen.send_signal. + +.. + +.. bpo: 39411 +.. date: 2020-01-21-16-38-25 +.. nonce: 9uHFqT +.. section: Library + +Add an ``is_async`` identifier to :mod:`pyclbr`'s ``Function`` objects. +Patch by Batuhan Taskaya + +.. + +.. bpo: 35498 +.. date: 2018-12-14-13-29-17 +.. nonce: LEJHl7 +.. section: Library + +Add slice support to :attr:`pathlib.PurePath.parents`. + +.. + +.. bpo: 42238 +.. date: 2020-11-24-22-54-49 +.. nonce: 62EOTu +.. section: Documentation + +Tentative to deprecate ``make suspicious`` by first removing it from the CI +and documentation builds, but keeping it around for manual uses. + +.. + +.. bpo: 42153 +.. date: 2020-11-15-13-46-31 +.. nonce: KjBhx3 +.. section: Documentation + +Fix the URL for the IMAP protocol documents. + +.. + +.. bpo: 41028 +.. date: 2020-06-18-23-37-03 +.. nonce: vM8bC8 +.. section: Documentation + +Language and version switchers, previously maintained in every cpython +branches, are now handled by docsbuild-script. + +.. + +.. bpo: 41473 +.. date: 2020-12-04-11-47-09 +.. nonce: W_updK +.. section: Tests + +Reenable test_gdb on gdb 9.2 and newer: +https://bugzilla.redhat.com/show_bug.cgi?id=1866884 bug is fixed in gdb +10.1. + +.. + +.. bpo: 42553 +.. date: 2020-12-03-13-32-44 +.. nonce: 2TRE2N +.. section: Tests + +Fix ``test_asyncio.test_call_later()`` race condition: don't measure asyncio +performance in the ``call_later()`` unit test. The test failed randomly on +the CI. + +.. + +.. bpo: 31904 +.. date: 2020-12-01-15-51-19 +.. nonce: iwetj4 +.. section: Tests + +Fix test_netrc on VxWorks: create temporary directories using temp_cwd(). + +.. + +.. bpo: 31904 +.. date: 2020-11-26-11-13-13 +.. nonce: ay4g89 +.. section: Tests + +skip test_getaddrinfo_ipv6_scopeid_symbolic and +test_getnameinfo_ipv6_scopeid_symbolic on VxWorks + +.. + +.. bpo: 31904 +.. date: 2020-11-25-17-00-53 +.. nonce: ue4hd9 +.. section: Tests + +skip test_test of test_mailcap on VxWorks + +.. + +.. bpo: 31904 +.. date: 2020-11-24-17-26-41 +.. nonce: eug834 +.. section: Tests + +add shell requirement for test_pipes + +.. + +.. bpo: 31904 +.. date: 2020-11-23-11-11-29 +.. nonce: V3sUZk +.. section: Tests + +skip some tests related to fifo on VxWorks + +.. + +.. bpo: 31904 +.. date: 2020-11-20-15-07-18 +.. nonce: EBJXjJ +.. section: Tests + +Fix test_doctest.py failures for VxWorks. + +.. + +.. bpo: 40754 +.. date: 2020-11-13-21-51-34 +.. nonce: Ekoxkg +.. section: Tests + +Include ``_testinternalcapi`` module in Windows installer for test suite + +.. + +.. bpo: 41561 +.. date: 2020-09-18-16-14-03 +.. nonce: uPnwrW +.. section: Tests + +test_ssl: skip test_min_max_version_mismatch when TLS 1.0 is not available + +.. + +.. bpo: 31904 +.. date: 2020-05-20-17-28-46 +.. nonce: yt83Ge +.. section: Tests + +Fix os module failures for VxWorks RTOS. + +.. + +.. bpo: 31904 +.. date: 2020-05-20-14-28-48 +.. nonce: yJik6k +.. section: Tests + +Fix fifo test cases for VxWorks RTOS. + +.. + +.. bpo: 31904 +.. date: 2020-11-19-17-01-50 +.. nonce: 894dk2 +.. section: Build + +remove libnet dependency from detect_socket() for VxWorks + +.. + +.. bpo: 42398 +.. date: 2020-11-18-11-58-44 +.. nonce: Yt5wO8 +.. section: Build + +Fix a race condition in "make regen-all" when make -jN option is used to run +jobs in parallel. The clinic.py script now only use atomic write to write +files. Moveover, generated files are now left unchanged if the content does +not change, to not change the file modification time. + +.. + +.. bpo: 41617 +.. date: 2020-11-13-15-04-53 +.. nonce: 98_oaE +.. section: Build + +Fix building ``pycore_bitutils.h`` internal header on old clang version +without ``__builtin_bswap16()`` (ex: Xcode 4.6.3 on Mac OS X 10.7). Patch by +Joshua Root and Victor Stinner. + +.. + +.. bpo: 38823 +.. date: 2020-11-12-13-45-15 +.. nonce: C0z_Fe +.. section: Build + +It is no longer possible to build the ``_ctypes`` extension module without +:c:type:`wchar_t` type: remove ``CTYPES_UNICODE`` macro. Anyway, the +:c:type:`wchar_t` type is required to build Python. Patch by Victor Stinner. + +.. + +.. bpo: 42087 +.. date: 2020-10-19-15-41-05 +.. nonce: 2AhRFP +.. section: Build + +Support was removed for AIX 5.3 and below. See :issue:`40680`. + +.. + +.. bpo: 40998 +.. date: 2020-06-17-09-05-02 +.. nonce: sgqmg9 +.. section: Build + +Addressed three compiler warnings found by undefined behavior sanitizer +(ubsan). + +.. + +.. bpo: 42120 +.. date: 2020-11-16-22-41-02 +.. nonce: 9scgko +.. section: Windows + +Remove macro definition of ``copysign`` (to ``_copysign``) in headers. + +.. + +.. bpo: 38506 +.. date: 2020-11-15-23-01-14 +.. nonce: hhdnuP +.. section: Windows + +The Windows launcher now properly handles Python 3.10 when listing installed +Python versions. + +.. + +.. bpo: 42504 +.. date: 2020-12-02-15-48-40 +.. nonce: RQmMOR +.. section: macOS + +Fix build on macOS Big Sur when MACOSX_DEPLOYMENT_TARGET=11 + +.. + +.. bpo: 41116 +.. date: 2020-11-15-16-43-45 +.. nonce: oCkbrF +.. section: macOS + +Ensure distutils.unixxcompiler.find_library_file can find system provided +libraries on macOS 11. + +.. + +.. bpo: 41100 +.. date: 2020-11-01-16-40-23 +.. nonce: BApztP +.. section: macOS + +Add support for macOS 11 and Apple Silicon systems. + +It is now possible to build "Universal 2" binaries using +"--enable-universalsdk --with-universal-archs=universal2". + +Binaries build on later macOS versions can be deployed back to older +versions (tested up to macOS 10.9), when using the correct deployment +target. This is tested using Xcode 11 and later. + +.. + +.. bpo: 42232 +.. date: 2020-11-01-15-10-28 +.. nonce: 2zI1GN +.. section: macOS + +Added Darwin specific madvise options to mmap module. + +.. + +.. bpo: 38443 +.. date: 2020-10-23-10-26-53 +.. nonce: vu64tl +.. section: macOS + +The ``--enable-universalsdk`` and ``--with-universal-archs`` options for the +configure script now check that the specified architectures can be used. + +.. + +.. bpo: 42508 +.. date: 2020-11-30-19-46-05 +.. nonce: fE7w4M +.. section: IDLE + +Keep IDLE running on macOS. Remove obsolete workaround that prevented +running files with shortcuts when using new universal2 installers built on +macOS 11. + +.. + +.. bpo: 42426 +.. date: 2020-11-21-17-21-21 +.. nonce: kNnPoC +.. section: IDLE + +Fix reporting offset of the RE error in searchengine. + +.. + +.. bpo: 42415 +.. date: 2020-11-20-01-30-27 +.. nonce: CyD-va +.. section: IDLE + +Get docstrings for IDLE calltips more often by using inspect.getdoc. + +.. + +.. bpo: 42212 +.. date: 2020-11-20-15-11-05 +.. nonce: sjzgOf +.. section: Tools/Demos + +The smelly.py script now also checks the Python dynamic library and +extension modules, not only the Python static library. Make also the script +more verbose: explain what it does. + +.. + +.. bpo: 36310 +.. date: 2020-05-03-01-30-46 +.. nonce: xDxxwY +.. section: Tools/Demos + +Allow :file:`Tools/i18n/pygettext.py` to detect calls to ``gettext`` in +f-strings. + +.. + +.. bpo: 42423 +.. date: 2020-11-21-12-27-19 +.. nonce: ByJHhY +.. section: C API + +The :c:func:`PyType_FromSpecWithBases` and +:c:func:`PyType_FromModuleAndSpec` functions now accept a single class as +the *bases* argument. + +.. + +.. bpo: 1635741 +.. date: 2020-11-19-17-44-36 +.. nonce: qBZc3o +.. section: C API + +Port :mod:`select` extension module to multiphase initialization +(:pep:`489`). + +.. + +.. bpo: 1635741 +.. date: 2020-11-19-16-54-16 +.. nonce: 9tVsZt +.. section: C API + +Port _posixsubprocess extension module to multiphase initialization +(:pep:`489`). + +.. + +.. bpo: 1635741 +.. date: 2020-11-19-15-33-42 +.. nonce: 9tVsZt +.. section: C API + +Port _posixshmem extension module to multiphase initialization (:pep:`489`) + +.. + +.. bpo: 1635741 +.. date: 2020-11-19-12-06-43 +.. nonce: KEfZpn +.. section: C API + +Port _struct extension module to multiphase initialization (:pep:`489`) + +.. + +.. bpo: 1635741 +.. date: 2020-11-19-09-17-01 +.. nonce: 6F9o6L +.. section: C API + +Port :mod:`spwd` extension module to multiphase initialization (:pep:`489`) + +.. + +.. bpo: 1635741 +.. date: 2020-11-18-20-33-35 +.. nonce: B4ztSk +.. section: C API + +Port :mod:`gc` extension module to multiphase initialization (:pep:`489`) + +.. + +.. bpo: 1635741 +.. date: 2020-11-18-20-11-13 +.. nonce: fe3iRb +.. section: C API + +Port _queue extension module to multiphase initialization (:pep:`489`) + +.. + +.. bpo: 39573 +.. date: 2020-11-18-15-21-59 +.. nonce: VB3G2y +.. section: C API + +Convert :c:func:`Py_TYPE` and :c:func:`Py_SIZE` back to macros to allow +using them as an l-value. Many third party C extension modules rely on the +ability of using Py_TYPE() and Py_SIZE() to set an object type and size: +``Py_TYPE(obj) = type;`` and ``Py_SIZE(obj) = size;``. + +.. + +.. bpo: 1635741 +.. date: 2020-11-18-10-52-38 +.. nonce: FrWAwJ +.. section: C API + +Port :mod:`symtable` extension module to multiphase initialization +(:pep:`489`) + +.. + +.. bpo: 1635741 +.. date: 2020-11-18-09-46-35 +.. nonce: SH8OIT +.. section: C API + +Port :mod:`grp` and :mod:`pwd` extension modules to multiphase +initialization (:pep:`489`) + +.. + +.. bpo: 1635741 +.. date: 2020-11-18-09-16-23 +.. nonce: gkoI7Y +.. section: C API + +Port _random extension module to multiphase initialization (:pep:`489`) + +.. + +.. bpo: 1635741 +.. date: 2020-11-18-08-45-36 +.. nonce: VLZfiY +.. section: C API + +Port _hashlib extension module to multiphase initialization (:pep:`489`) + +.. + +.. bpo: 41713 +.. date: 2020-11-17-15-39-10 +.. nonce: Rq99Vc +.. section: C API + +Removed the undocumented ``PyOS_InitInterrupts()`` function. Initializing +Python already implicitly installs signal handlers: see +:c:member:`PyConfig.install_signal_handlers`. Patch by Victor Stinner. + +.. + +.. bpo: 40170 +.. date: 2020-11-13-01-40-28 +.. nonce: uh8lEf +.. section: C API + +The ``Py_TRASHCAN_BEGIN`` macro no longer accesses PyTypeObject attributes, +but now can get the condition by calling the new private +:c:func:`_PyTrash_cond()` function which hides implementation details. + +.. + +.. bpo: 42260 +.. date: 2020-11-10-14-27-39 +.. nonce: -Br3Co +.. section: C API + +:c:func:`Py_GetPath`, :c:func:`Py_GetPrefix`, :c:func:`Py_GetExecPrefix`, +:c:func:`Py_GetProgramFullPath`, :c:func:`Py_GetPythonHome` and +:c:func:`Py_GetProgramName` functions now return ``NULL`` if called before +:c:func:`Py_Initialize` (before Python is initialized). Use the new +:ref:`Python Initialization Configuration API ` to get the +:ref:`Python Path Configuration. `. Patch by Victor +Stinner. + +.. + +.. bpo: 42260 +.. date: 2020-11-05-18-02-07 +.. nonce: pAeaNR +.. section: C API + +The :c:func:`PyConfig_Read` function now only parses +:c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv` is +set to ``2`` after arguments are parsed. Since Python arguments are +strippped from :c:member:`PyConfig.argv`, parsing arguments twice would +parse the application options as Python options. + +.. + +.. bpo: 42262 +.. date: 2020-11-04-17-22-36 +.. nonce: fCWzBb +.. section: C API + +Added :c:func:`Py_NewRef` and :c:func:`Py_XNewRef` functions to increment +the reference count of an object and return the object. Patch by Victor +Stinner. + +.. + +.. bpo: 42260 +.. date: 2020-11-04-16-31-55 +.. nonce: CmgHtF +.. section: C API + +When :c:func:`Py_Initialize` is called twice, the second call now updates +more :mod:`sys` attributes for the configuration, rather than only +:data:`sys.argv`. Patch by Victor Stinner. + +.. + +.. bpo: 41832 +.. date: 2020-11-03-19-47-06 +.. nonce: dL1VJJ +.. section: C API + +The :c:func:`PyType_FromModuleAndSpec` function now accepts NULL ``tp_doc`` +slot. + +.. + +.. bpo: 1635741 +.. date: 2020-11-03-11-52-27 +.. nonce: aDYJKB +.. section: C API + +Added :c:func:`PyModule_AddObjectRef` function: similar to +:c:func:`PyModule_AddObject` but don't steal a reference to the value on +success. Patch by Victor Stinner. + +.. + +.. bpo: 42171 +.. date: 2020-10-27-21-10-14 +.. nonce: S3FWTP +.. section: C API + +The :c:data:`METH_FASTCALL` calling convention is added to the limited API. +The functions :c:func:`PyModule_AddType`, +:c:func:`PyType_FromModuleAndSpec`, :c:func:`PyType_GetModule` and +:c:func:`PyType_GetModuleState` are added to the limited API on Windows. + +.. + +.. bpo: 42085 +.. date: 2020-10-19-15-58-16 +.. nonce: NhEf3W +.. section: C API + +Add dedicated entry to PyAsyncMethods for sending values + +.. + +.. bpo: 41073 +.. date: 2020-07-08-21-01-49 +.. nonce: VqQZON +.. section: C API + +:c:func:`PyType_GetSlot()` can now accept static types. + +.. + +.. bpo: 30459 +.. date: 2020-05-06-23-54-57 +.. nonce: N9_Jai +.. section: C API + +:c:func:`PyList_SET_ITEM`, :c:func:`PyTuple_SET_ITEM` and +:c:func:`PyCell_SET` macros can no longer be used as l-value or r-value. For +example, ``x = PyList_SET_ITEM(a, b, c)`` and ``PyList_SET_ITEM(a, b, c) = +x`` now fail with a compiler error. It prevents bugs like ``if +(PyList_SET_ITEM (a, b, c) < 0) ...`` test. Patch by Zackery Spytz and +Victor Stinner. diff --git a/Misc/NEWS.d/next/Build/2020-06-17-09-05-02.bpo-40998.sgqmg9.rst b/Misc/NEWS.d/next/Build/2020-06-17-09-05-02.bpo-40998.sgqmg9.rst deleted file mode 100644 index c268e4fd0d9cbf..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-06-17-09-05-02.bpo-40998.sgqmg9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Addressed three compiler warnings found by undefined behavior sanitizer -(ubsan). diff --git a/Misc/NEWS.d/next/Build/2020-10-19-15-41-05.bpo-42087.2AhRFP.rst b/Misc/NEWS.d/next/Build/2020-10-19-15-41-05.bpo-42087.2AhRFP.rst deleted file mode 100644 index 1a830bfe9f5ecf..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-10-19-15-41-05.bpo-42087.2AhRFP.rst +++ /dev/null @@ -1 +0,0 @@ -Support was removed for AIX 5.3 and below. See :issue:`40680`. diff --git a/Misc/NEWS.d/next/Build/2020-11-12-13-45-15.bpo-38823.C0z_Fe.rst b/Misc/NEWS.d/next/Build/2020-11-12-13-45-15.bpo-38823.C0z_Fe.rst deleted file mode 100644 index 4a0f11de5e420d..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-11-12-13-45-15.bpo-38823.C0z_Fe.rst +++ /dev/null @@ -1,3 +0,0 @@ -It is no longer possible to build the ``_ctypes`` extension module without -:c:type:`wchar_t` type: remove ``CTYPES_UNICODE`` macro. Anyway, the -:c:type:`wchar_t` type is required to build Python. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Build/2020-11-13-15-04-53.bpo-41617.98_oaE.rst b/Misc/NEWS.d/next/Build/2020-11-13-15-04-53.bpo-41617.98_oaE.rst deleted file mode 100644 index a5f35b25e8bf6a..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-11-13-15-04-53.bpo-41617.98_oaE.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix building ``pycore_bitutils.h`` internal header on old clang version -without ``__builtin_bswap16()`` (ex: Xcode 4.6.3 on Mac OS X 10.7). Patch by -Joshua Root and Victor Stinner. diff --git a/Misc/NEWS.d/next/Build/2020-11-18-11-58-44.bpo-42398.Yt5wO8.rst b/Misc/NEWS.d/next/Build/2020-11-18-11-58-44.bpo-42398.Yt5wO8.rst deleted file mode 100644 index 9ab99d0e69dd1d..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-11-18-11-58-44.bpo-42398.Yt5wO8.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix a race condition in "make regen-all" when make -jN option is used to run -jobs in parallel. The clinic.py script now only use atomic write to write -files. Moveover, generated files are now left unchanged if the content does not -change, to not change the file modification time. diff --git a/Misc/NEWS.d/next/Build/2020-11-19-17-01-50.bpo-31904.894dk2.rst b/Misc/NEWS.d/next/Build/2020-11-19-17-01-50.bpo-31904.894dk2.rst deleted file mode 100644 index d1ec647ed343ef..00000000000000 --- a/Misc/NEWS.d/next/Build/2020-11-19-17-01-50.bpo-31904.894dk2.rst +++ /dev/null @@ -1 +0,0 @@ -remove libnet dependency from detect_socket() for VxWorks diff --git a/Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst b/Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst deleted file mode 100644 index 092d457855a41b..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-05-06-23-54-57.bpo-30459.N9_Jai.rst +++ /dev/null @@ -1,6 +0,0 @@ -:c:func:`PyList_SET_ITEM`, :c:func:`PyTuple_SET_ITEM` and :c:func:`PyCell_SET` -macros can no longer be used as l-value or r-value. For example, -``x = PyList_SET_ITEM(a, b, c)`` and ``PyList_SET_ITEM(a, b, c) = x`` now fail -with a compiler error. It prevents bugs like -``if (PyList_SET_ITEM (a, b, c) < 0) ...`` test. -Patch by Zackery Spytz and Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2020-07-08-21-01-49.bpo-41073.VqQZON.rst b/Misc/NEWS.d/next/C API/2020-07-08-21-01-49.bpo-41073.VqQZON.rst deleted file mode 100644 index 1bec2f1a197e1a..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-07-08-21-01-49.bpo-41073.VqQZON.rst +++ /dev/null @@ -1 +0,0 @@ -:c:func:`PyType_GetSlot()` can now accept static types. diff --git a/Misc/NEWS.d/next/C API/2020-10-19-15-58-16.bpo-42085.NhEf3W.rst b/Misc/NEWS.d/next/C API/2020-10-19-15-58-16.bpo-42085.NhEf3W.rst deleted file mode 100644 index 53338fb4f446e1..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-10-19-15-58-16.bpo-42085.NhEf3W.rst +++ /dev/null @@ -1 +0,0 @@ -Add dedicated entry to PyAsyncMethods for sending values diff --git a/Misc/NEWS.d/next/C API/2020-10-27-21-10-14.bpo-42171.S3FWTP.rst b/Misc/NEWS.d/next/C API/2020-10-27-21-10-14.bpo-42171.S3FWTP.rst deleted file mode 100644 index 5dfbb23a6a39a4..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-10-27-21-10-14.bpo-42171.S3FWTP.rst +++ /dev/null @@ -1,4 +0,0 @@ -The :c:data:`METH_FASTCALL` calling convention is added to the limited API. -The functions :c:func:`PyModule_AddType`, :c:func:`PyType_FromModuleAndSpec`, -:c:func:`PyType_GetModule` and :c:func:`PyType_GetModuleState` are added to -the limited API on Windows. diff --git a/Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst b/Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst deleted file mode 100644 index 2c118129dbf104..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-03-11-52-27.bpo-1635741.aDYJKB.rst +++ /dev/null @@ -1,3 +0,0 @@ -Added :c:func:`PyModule_AddObjectRef` function: similar to -:c:func:`PyModule_AddObject` but don't steal a reference to the value on -success. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2020-11-03-19-47-06.bpo-41832.dL1VJJ.rst b/Misc/NEWS.d/next/C API/2020-11-03-19-47-06.bpo-41832.dL1VJJ.rst deleted file mode 100644 index e0bce54eb93648..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-03-19-47-06.bpo-41832.dL1VJJ.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :c:func:`PyType_FromModuleAndSpec` function now accepts NULL ``tp_doc`` -slot. diff --git a/Misc/NEWS.d/next/C API/2020-11-04-16-31-55.bpo-42260.CmgHtF.rst b/Misc/NEWS.d/next/C API/2020-11-04-16-31-55.bpo-42260.CmgHtF.rst deleted file mode 100644 index 694dd550a8e18d..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-04-16-31-55.bpo-42260.CmgHtF.rst +++ /dev/null @@ -1,3 +0,0 @@ -When :c:func:`Py_Initialize` is called twice, the second call now updates -more :mod:`sys` attributes for the configuration, rather than only -:data:`sys.argv`. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2020-11-04-17-22-36.bpo-42262.fCWzBb.rst b/Misc/NEWS.d/next/C API/2020-11-04-17-22-36.bpo-42262.fCWzBb.rst deleted file mode 100644 index 8c1e4f418443be..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-04-17-22-36.bpo-42262.fCWzBb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added :c:func:`Py_NewRef` and :c:func:`Py_XNewRef` functions to increment the -reference count of an object and return the object. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2020-11-05-18-02-07.bpo-42260.pAeaNR.rst b/Misc/NEWS.d/next/C API/2020-11-05-18-02-07.bpo-42260.pAeaNR.rst deleted file mode 100644 index 0d6a277db88d45..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-05-18-02-07.bpo-42260.pAeaNR.rst +++ /dev/null @@ -1,5 +0,0 @@ -The :c:func:`PyConfig_Read` function now only parses :c:member:`PyConfig.argv` -arguments once: :c:member:`PyConfig.parse_argv` is set to ``2`` after arguments -are parsed. Since Python arguments are strippped from -:c:member:`PyConfig.argv`, parsing arguments twice would parse the application -options as Python options. diff --git a/Misc/NEWS.d/next/C API/2020-11-10-14-27-39.bpo-42260.-Br3Co.rst b/Misc/NEWS.d/next/C API/2020-11-10-14-27-39.bpo-42260.-Br3Co.rst deleted file mode 100644 index e7b5a558fd4c58..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-10-14-27-39.bpo-42260.-Br3Co.rst +++ /dev/null @@ -1,7 +0,0 @@ -:c:func:`Py_GetPath`, :c:func:`Py_GetPrefix`, :c:func:`Py_GetExecPrefix`, -:c:func:`Py_GetProgramFullPath`, :c:func:`Py_GetPythonHome` and -:c:func:`Py_GetProgramName` functions now return ``NULL`` if called before -:c:func:`Py_Initialize` (before Python is initialized). Use the new -:ref:`Python Initialization Configuration API ` to get the -:ref:`Python Path Configuration. `. Patch by Victor -Stinner. diff --git a/Misc/NEWS.d/next/C API/2020-11-13-01-40-28.bpo-40170.uh8lEf.rst b/Misc/NEWS.d/next/C API/2020-11-13-01-40-28.bpo-40170.uh8lEf.rst deleted file mode 100644 index 741f9520686f31..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-13-01-40-28.bpo-40170.uh8lEf.rst +++ /dev/null @@ -1,3 +0,0 @@ -The ``Py_TRASHCAN_BEGIN`` macro no longer accesses PyTypeObject attributes, -but now can get the condition by calling the new private -:c:func:`_PyTrash_cond()` function which hides implementation details. diff --git a/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst b/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst deleted file mode 100644 index 5373595aa08b97..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst +++ /dev/null @@ -1,3 +0,0 @@ -Removed the undocumented ``PyOS_InitInterrupts()`` function. Initializing -Python already implicitly installs signal handlers: see -:c:member:`PyConfig.install_signal_handlers`. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2020-11-18-08-45-36.bpo-1635741.VLZfiY.rst b/Misc/NEWS.d/next/C API/2020-11-18-08-45-36.bpo-1635741.VLZfiY.rst deleted file mode 100644 index 2300170587d7e0..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-18-08-45-36.bpo-1635741.VLZfiY.rst +++ /dev/null @@ -1 +0,0 @@ -Port _hashlib extension module to multiphase initialization (:pep:`489`) diff --git a/Misc/NEWS.d/next/C API/2020-11-18-09-16-23.bpo-1635741.gkoI7Y.rst b/Misc/NEWS.d/next/C API/2020-11-18-09-16-23.bpo-1635741.gkoI7Y.rst deleted file mode 100644 index 1f300dca554851..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-18-09-16-23.bpo-1635741.gkoI7Y.rst +++ /dev/null @@ -1 +0,0 @@ -Port _random extension module to multiphase initialization (:pep:`489`) diff --git a/Misc/NEWS.d/next/C API/2020-11-18-09-46-35.bpo-1635741.SH8OIT.rst b/Misc/NEWS.d/next/C API/2020-11-18-09-46-35.bpo-1635741.SH8OIT.rst deleted file mode 100644 index 34802cd9d3af32..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-18-09-46-35.bpo-1635741.SH8OIT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port :mod:`grp` and :mod:`pwd` extension modules to multiphase -initialization (:pep:`489`) diff --git a/Misc/NEWS.d/next/C API/2020-11-18-10-52-38.bpo-1635741.FrWAwJ.rst b/Misc/NEWS.d/next/C API/2020-11-18-10-52-38.bpo-1635741.FrWAwJ.rst deleted file mode 100644 index 9eda94140dd66e..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-18-10-52-38.bpo-1635741.FrWAwJ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port :mod:`symtable` extension module to multiphase initialization -(:pep:`489`) diff --git a/Misc/NEWS.d/next/C API/2020-11-18-15-21-59.bpo-39573.VB3G2y.rst b/Misc/NEWS.d/next/C API/2020-11-18-15-21-59.bpo-39573.VB3G2y.rst deleted file mode 100644 index b4fade6e202eda..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-18-15-21-59.bpo-39573.VB3G2y.rst +++ /dev/null @@ -1,4 +0,0 @@ -Convert :c:func:`Py_TYPE` and :c:func:`Py_SIZE` back to macros to allow -using them as an l-value. Many third party C extension modules rely on the -ability of using Py_TYPE() and Py_SIZE() to set an object type and size: -``Py_TYPE(obj) = type;`` and ``Py_SIZE(obj) = size;``. diff --git a/Misc/NEWS.d/next/C API/2020-11-18-20-11-13.bpo-1635741.fe3iRb.rst b/Misc/NEWS.d/next/C API/2020-11-18-20-11-13.bpo-1635741.fe3iRb.rst deleted file mode 100644 index 78df4fe0432266..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-18-20-11-13.bpo-1635741.fe3iRb.rst +++ /dev/null @@ -1 +0,0 @@ -Port _queue extension module to multiphase initialization (:pep:`489`) diff --git a/Misc/NEWS.d/next/C API/2020-11-18-20-33-35.bpo-1635741.B4ztSk.rst b/Misc/NEWS.d/next/C API/2020-11-18-20-33-35.bpo-1635741.B4ztSk.rst deleted file mode 100644 index bce80c86de5019..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-18-20-33-35.bpo-1635741.B4ztSk.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`gc` extension module to multiphase initialization (:pep:`489`) diff --git a/Misc/NEWS.d/next/C API/2020-11-19-09-17-01.bpo-1635741.6F9o6L.rst b/Misc/NEWS.d/next/C API/2020-11-19-09-17-01.bpo-1635741.6F9o6L.rst deleted file mode 100644 index d925a24da1ed7e..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-19-09-17-01.bpo-1635741.6F9o6L.rst +++ /dev/null @@ -1 +0,0 @@ -Port :mod:`spwd` extension module to multiphase initialization (:pep:`489`) diff --git a/Misc/NEWS.d/next/C API/2020-11-19-12-06-43.bpo-1635741.KEfZpn.rst b/Misc/NEWS.d/next/C API/2020-11-19-12-06-43.bpo-1635741.KEfZpn.rst deleted file mode 100644 index fc64757e00b3ac..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-19-12-06-43.bpo-1635741.KEfZpn.rst +++ /dev/null @@ -1 +0,0 @@ -Port _struct extension module to multiphase initialization (:pep:`489`) diff --git a/Misc/NEWS.d/next/C API/2020-11-19-15-33-42.bpo-1635741.9tVsZt.rst b/Misc/NEWS.d/next/C API/2020-11-19-15-33-42.bpo-1635741.9tVsZt.rst deleted file mode 100644 index 201b7aed56cc5d..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-19-15-33-42.bpo-1635741.9tVsZt.rst +++ /dev/null @@ -1 +0,0 @@ -Port _posixshmem extension module to multiphase initialization (:pep:`489`) diff --git a/Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst b/Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst deleted file mode 100644 index d5a10695b4b417..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-19-16-54-16.bpo-1635741.9tVsZt.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port _posixsubprocess extension module to multiphase initialization -(:pep:`489`). diff --git a/Misc/NEWS.d/next/C API/2020-11-19-17-44-36.bpo-1635741.qBZc3o.rst b/Misc/NEWS.d/next/C API/2020-11-19-17-44-36.bpo-1635741.qBZc3o.rst deleted file mode 100644 index e66e8d7e406265..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-19-17-44-36.bpo-1635741.qBZc3o.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port :mod:`select` extension module to multiphase initialization -(:pep:`489`). diff --git a/Misc/NEWS.d/next/C API/2020-11-21-12-27-19.bpo-42423.ByJHhY.rst b/Misc/NEWS.d/next/C API/2020-11-21-12-27-19.bpo-42423.ByJHhY.rst deleted file mode 100644 index 046a89d7eb8392..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-11-21-12-27-19.bpo-42423.ByJHhY.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :c:func:`PyType_FromSpecWithBases` and -:c:func:`PyType_FromModuleAndSpec` functions now accept a single class as -the *bases* argument. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-22-17-27-08.bpo-26131.B-Veg7.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-22-17-27-08.bpo-26131.B-Veg7.rst deleted file mode 100644 index e9f44c7c3aa9f7..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-22-17-27-08.bpo-26131.B-Veg7.rst +++ /dev/null @@ -1,2 +0,0 @@ -The import system triggers a `ImportWarning` when it falls back to using -`load_module()`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-01-23-34-56.bpo-42233.zOSzja.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-01-23-34-56.bpo-42233.zOSzja.rst deleted file mode 100644 index 499bb324fb935e..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-01-23-34-56.bpo-42233.zOSzja.rst +++ /dev/null @@ -1,5 +0,0 @@ -Allow ``GenericAlias`` objects to use :ref:`union type expressions `. -This allows expressions like ``list[int] | dict[float, str]`` where previously a -``TypeError`` would have been thrown. This also fixes union type expressions -not de-duplicating ``GenericAlias`` objects. (Contributed by Ken Jin in -:issue:`42233`.) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-02-14-39-48.bpo-40077.grY9TG.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-02-14-39-48.bpo-40077.grY9TG.rst deleted file mode 100644 index 48565a5a0daefe..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-02-14-39-48.bpo-40077.grY9TG.rst +++ /dev/null @@ -1 +0,0 @@ -Convert :mod:`mmap` to use heap types. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-02-15-48-17.bpo-42246.3CNQEX.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-02-15-48-17.bpo-42246.3CNQEX.rst deleted file mode 100644 index 358454ce40a7f1..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-02-15-48-17.bpo-42246.3CNQEX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improved accuracy of line tracing events and f_lineno attribute of Frame -objects. See PEP 626 for details. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-03-21-58-27.bpo-40077.a9qM1j.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-03-21-58-27.bpo-40077.a9qM1j.rst deleted file mode 100644 index 369ba6b63ce2b9..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-03-21-58-27.bpo-40077.a9qM1j.rst +++ /dev/null @@ -1 +0,0 @@ -Convert :mod:`queue` to use heap types. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-04-23-03-25.bpo-42266.G4hGDe.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-04-23-03-25.bpo-42266.G4hGDe.rst deleted file mode 100644 index a8598cfde04205..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-04-23-03-25.bpo-42266.G4hGDe.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed a bug with the LOAD_ATTR opcode cache that was not respecting -monkey-patching a class-level attribute to make it a descriptor. Patch by -Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-07-21-02-05.bpo-42282.M1W4Wj.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-07-21-02-05.bpo-42282.M1W4Wj.rst deleted file mode 100644 index 74f5c3362385c9..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-07-21-02-05.bpo-42282.M1W4Wj.rst +++ /dev/null @@ -1,3 +0,0 @@ -Optimise constant subexpressions that appear as part of named expressions -(previously the AST optimiser did not descend into named expressions). -Patch by Nick Coghlan. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-12-23-16-14.bpo-42332.fEQIdk.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-12-23-16-14.bpo-42332.fEQIdk.rst deleted file mode 100644 index 8a2cb87cc0bd29..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-12-23-16-14.bpo-42332.fEQIdk.rst +++ /dev/null @@ -1 +0,0 @@ -:class:`types.GenericAlias` objects can now be the targets of weakrefs. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-13-13-53-11.bpo-42296.DuGrLJ.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-13-13-53-11.bpo-42296.DuGrLJ.rst deleted file mode 100644 index 841a26e791ea08..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-13-13-53-11.bpo-42296.DuGrLJ.rst +++ /dev/null @@ -1,4 +0,0 @@ -On Windows, fix a regression in signal handling which prevented to interrupt -a program using CTRL+C. The signal handler can be run in a thread different -than the Python thread, in which case the test deciding if the thread can -handle signals is wrong. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-13-17-25-44.bpo-42349.JdWxez.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-13-17-25-44.bpo-42349.JdWxez.rst deleted file mode 100644 index 3db695673a00ae..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-13-17-25-44.bpo-42349.JdWxez.rst +++ /dev/null @@ -1 +0,0 @@ -Make sure that the compiler front-end produces a well-formed control flow graph. Be be more aggressive in the compiler back-end, as it is now safe to do so. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-30-03.bpo-42316._DdmpQ.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-30-03.bpo-42316._DdmpQ.rst deleted file mode 100644 index 77eb6662ba827e..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-30-03.bpo-42316._DdmpQ.rst +++ /dev/null @@ -1 +0,0 @@ -Allow an unparenthesized walrus in subscript indexes. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-57-09.bpo-42374.t7np1E.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-57-09.bpo-42374.t7np1E.rst deleted file mode 100644 index d86d038c8425c5..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-17-57-09.bpo-42374.t7np1E.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a regression introduced by the new parser, where an unparenthesized walrus operator -was not allowed within generator expressions. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-18-13-07.bpo-42202.ZxenYD.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-18-13-07.bpo-42202.ZxenYD.rst deleted file mode 100644 index aba8ce6686fa29..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-18-13-07.bpo-42202.ZxenYD.rst +++ /dev/null @@ -1,2 +0,0 @@ -Change function parameters annotations internal representation to tuple -of strings. Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-23-45-56.bpo-42381.G4AWxL.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-16-23-45-56.bpo-42381.G4AWxL.rst deleted file mode 100644 index 5bee5141f6cbcd..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-16-23-45-56.bpo-42381.G4AWxL.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow assignment expressions in set literals and set comprehensions as per -PEP 572. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-17-16-25-50.bpo-41686.hX77kL.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-17-16-25-50.bpo-41686.hX77kL.rst deleted file mode 100644 index 0265d48660a3c6..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-17-16-25-50.bpo-41686.hX77kL.rst +++ /dev/null @@ -1,4 +0,0 @@ -On Windows, the ``SIGINT`` event, ``_PyOS_SigintEvent()``, is now created -even if Python is configured to not install signal handlers (if -:c:member:`PyConfig.install_signal_handlers` equals to 0, or -``Py_InitializeEx(0)``). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-18-23-46-31.bpo-1635741.GVOQ-m.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-18-23-46-31.bpo-1635741.GVOQ-m.rst deleted file mode 100644 index ae9cc0bc5dd188..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-18-23-46-31.bpo-1635741.GVOQ-m.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the ``_warnings`` extension module to the multi-phase initialization -API (:pep:`489`). Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-22-14-34-55.bpo-42435.uwlB2W.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-22-14-34-55.bpo-42435.uwlB2W.rst deleted file mode 100644 index 46a8486b78a68a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-22-14-34-55.bpo-42435.uwlB2W.rst +++ /dev/null @@ -1,2 +0,0 @@ -Speed up comparison of bytes objects with non-bytes objects when option :option:`-b` -is specified. Speed up comparison of bytarray objects with non-buffer object. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-24-14-01-43.bpo-42246.c9k9hj.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-24-14-01-43.bpo-42246.c9k9hj.rst deleted file mode 100644 index ff200475e63685..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-24-14-01-43.bpo-42246.c9k9hj.rst +++ /dev/null @@ -1,2 +0,0 @@ -PEP 626: After a return, the f_lineno attribute of a frame is always the -last line executed. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-30-14-27-29.bpo-42500.excVKU.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-30-14-27-29.bpo-42500.excVKU.rst deleted file mode 100644 index 2462a8e1fabefc..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-30-14-27-29.bpo-42500.excVKU.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve handling of exceptions near recursion limit. Converts a number of -Fatal Errors in RecursionErrors. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst deleted file mode 100644 index 6ccacab1f64f68..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst +++ /dev/null @@ -1,26 +0,0 @@ -Several built-in and standard library types now ensure that their internal -result tuples are always tracked by the :term:`garbage collector -`: - -- :meth:`collections.OrderedDict.items() ` - -- :meth:`dict.items` - -- :func:`enumerate` - -- :func:`functools.reduce` - -- :func:`itertools.combinations` - -- :func:`itertools.combinations_with_replacement` - -- :func:`itertools.permutations` - -- :func:`itertools.product` - -- :func:`itertools.zip_longest` - -- :func:`zip` - -Previously, they could have become untracked by a prior garbage collection. -Patch by Brandt Bucher. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst deleted file mode 100644 index 154c9d8a915de1..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-12-05-22-34-47.bpo-42576.lEeEl7.rst +++ /dev/null @@ -1,4 +0,0 @@ -``types.GenericAlias`` will now raise a ``TypeError`` when attempting to -initialize with a keyword argument. Previously, this would cause the -interpreter to crash if the interpreter was compiled with debug symbols. -This does not affect interpreters compiled for release. Patch by Ken Jin. diff --git a/Misc/NEWS.d/next/Documentation/2020-06-18-23-37-03.bpo-41028.vM8bC8.rst b/Misc/NEWS.d/next/Documentation/2020-06-18-23-37-03.bpo-41028.vM8bC8.rst deleted file mode 100644 index 5fc4155b55346b..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-06-18-23-37-03.bpo-41028.vM8bC8.rst +++ /dev/null @@ -1,2 +0,0 @@ -Language and version switchers, previously maintained in every cpython -branches, are now handled by docsbuild-script. diff --git a/Misc/NEWS.d/next/Documentation/2020-11-15-13-46-31.bpo-42153.KjBhx3.rst b/Misc/NEWS.d/next/Documentation/2020-11-15-13-46-31.bpo-42153.KjBhx3.rst deleted file mode 100644 index 0a9451a63fb4f8..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-11-15-13-46-31.bpo-42153.KjBhx3.rst +++ /dev/null @@ -1 +0,0 @@ -Fix the URL for the IMAP protocol documents. diff --git a/Misc/NEWS.d/next/Documentation/2020-11-24-22-54-49.bpo-42238.62EOTu.rst b/Misc/NEWS.d/next/Documentation/2020-11-24-22-54-49.bpo-42238.62EOTu.rst deleted file mode 100644 index d9edf9cdf79b3d..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-11-24-22-54-49.bpo-42238.62EOTu.rst +++ /dev/null @@ -1,2 +0,0 @@ -Tentative to deprecate ``make suspicious`` by first removing it from the CI -and documentation builds, but keeping it around for manual uses. diff --git a/Misc/NEWS.d/next/IDLE/2020-11-20-01-30-27.bpo-42415.CyD-va.rst b/Misc/NEWS.d/next/IDLE/2020-11-20-01-30-27.bpo-42415.CyD-va.rst deleted file mode 100644 index b61032c1e48e2a..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-11-20-01-30-27.bpo-42415.CyD-va.rst +++ /dev/null @@ -1 +0,0 @@ -Get docstrings for IDLE calltips more often by using inspect.getdoc. diff --git a/Misc/NEWS.d/next/IDLE/2020-11-21-17-21-21.bpo-42426.kNnPoC.rst b/Misc/NEWS.d/next/IDLE/2020-11-21-17-21-21.bpo-42426.kNnPoC.rst deleted file mode 100644 index 0ab7972aad982e..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-11-21-17-21-21.bpo-42426.kNnPoC.rst +++ /dev/null @@ -1 +0,0 @@ -Fix reporting offset of the RE error in searchengine. diff --git a/Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst b/Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst deleted file mode 100644 index b449351f7f458e..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst +++ /dev/null @@ -1,3 +0,0 @@ -Keep IDLE running on macOS. Remove obsolete workaround that prevented -running files with shortcuts when using new universal2 installers built -on macOS 11. diff --git a/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst b/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst deleted file mode 100644 index 1ab0093fcde041..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst +++ /dev/null @@ -1 +0,0 @@ -Add slice support to :attr:`pathlib.PurePath.parents`. diff --git a/Misc/NEWS.d/next/Library/2020-01-21-16-38-25.bpo-39411.9uHFqT.rst b/Misc/NEWS.d/next/Library/2020-01-21-16-38-25.bpo-39411.9uHFqT.rst deleted file mode 100644 index 2377eef4b9f717..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-21-16-38-25.bpo-39411.9uHFqT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add an ``is_async`` identifier to :mod:`pyclbr`'s ``Function`` objects. -Patch by Batuhan Taskaya diff --git a/Misc/NEWS.d/next/Library/2020-05-08-21-30-54.bpo-40550.i7GWkb.rst b/Misc/NEWS.d/next/Library/2020-05-08-21-30-54.bpo-40550.i7GWkb.rst deleted file mode 100644 index b0f3f03c34bbc5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-08-21-30-54.bpo-40550.i7GWkb.rst +++ /dev/null @@ -1 +0,0 @@ -Fix time-of-check/time-of-action issue in subprocess.Popen.send_signal. diff --git a/Misc/NEWS.d/next/Library/2020-05-29-15-25-41.bpo-40816.w61Pob.rst b/Misc/NEWS.d/next/Library/2020-05-29-15-25-41.bpo-40816.w61Pob.rst deleted file mode 100644 index 66b75779784655..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-29-15-25-41.bpo-40816.w61Pob.rst +++ /dev/null @@ -1 +0,0 @@ -Add AsyncContextDecorator to contextlib to support async context manager as a decorator. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-06-17-12-24-26.bpo-41001.5mi7b0.rst b/Misc/NEWS.d/next/Library/2020-06-17-12-24-26.bpo-41001.5mi7b0.rst deleted file mode 100644 index 34ecfbf5e6692b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-17-12-24-26.bpo-41001.5mi7b0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add func:`os.eventfd` to provide a low level interface for Linux's event -notification file descriptor. diff --git a/Misc/NEWS.d/next/Library/2020-06-18-11-35-16.bpo-40968.R8Edbv.rst b/Misc/NEWS.d/next/Library/2020-06-18-11-35-16.bpo-40968.R8Edbv.rst deleted file mode 100644 index 6bcbaaa9ab9291..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-18-11-35-16.bpo-40968.R8Edbv.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`urllib.request` and :mod:`http.client` now send ``http/1.1`` ALPN -extension during TLS handshake when no custom context is supplied. diff --git a/Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst b/Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst deleted file mode 100644 index fdd7c5e74f33a3..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst +++ /dev/null @@ -1,4 +0,0 @@ -Extracting a symlink from a tarball should succeed and overwrite the symlink -if it already exists. The fix is to remove the existing file or symlink -before extraction. Based on patch by Chris AtLee, Jeffrey Kintscher, and -Senthil Kumaran. diff --git a/Misc/NEWS.d/next/Library/2020-07-18-17-39-28.bpo-41332.QRGmA5.rst b/Misc/NEWS.d/next/Library/2020-07-18-17-39-28.bpo-41332.QRGmA5.rst deleted file mode 100644 index fa3fb83b9f5e4c..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-18-17-39-28.bpo-41332.QRGmA5.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added missing connect_accepted_socket() method to -``asyncio.AbstractEventLoop``. diff --git a/Misc/NEWS.d/next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst b/Misc/NEWS.d/next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst deleted file mode 100644 index 4f14fd39d8827f..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-10-15-06-55.bpo-21041.cYz1eL.rst +++ /dev/null @@ -1 +0,0 @@ -:attr:`pathlib.PurePath.parents` now supports negative indexing. Patch contributed by Yaroslav Pankovych. diff --git a/Misc/NEWS.d/next/Library/2020-08-14-00-39-04.bpo-41543.RpcRjb.rst b/Misc/NEWS.d/next/Library/2020-08-14-00-39-04.bpo-41543.RpcRjb.rst deleted file mode 100644 index 753dc763f217c4..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-14-00-39-04.bpo-41543.RpcRjb.rst +++ /dev/null @@ -1 +0,0 @@ -Add async context manager support for contextlib.nullcontext. diff --git a/Misc/NEWS.d/next/Library/2020-08-19-20-17-51.bpo-34215._Cv8c-.rst b/Misc/NEWS.d/next/Library/2020-08-19-20-17-51.bpo-34215._Cv8c-.rst deleted file mode 100644 index 4d91678948f40a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-19-20-17-51.bpo-34215._Cv8c-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Clarify the error message for :exc:`asyncio.IncompleteReadError` when -``expected`` is ``None``. diff --git a/Misc/NEWS.d/next/Library/2020-08-24-16-59-04.bpo-41625.Cc967V.rst b/Misc/NEWS.d/next/Library/2020-08-24-16-59-04.bpo-41625.Cc967V.rst deleted file mode 100644 index 086788a7b0130f..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-24-16-59-04.bpo-41625.Cc967V.rst +++ /dev/null @@ -1,2 +0,0 @@ -Expose the :c:func:`splice` as :func:`os.splice` in the :mod:`os` module. -Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Library/2020-09-06-21-55-44.bpo-28850.HJNggD.rst b/Misc/NEWS.d/next/Library/2020-09-06-21-55-44.bpo-28850.HJNggD.rst deleted file mode 100644 index fc6bd1d57e2ae7..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-06-21-55-44.bpo-28850.HJNggD.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :meth:`pprint.PrettyPrinter.format` overrides being ignored for contents of small containers. The :func:`pprint._safe_repr` function was removed. diff --git a/Misc/NEWS.d/next/Library/2020-09-08-03-19-04.bpo-40624.0-gYfx.rst b/Misc/NEWS.d/next/Library/2020-09-08-03-19-04.bpo-40624.0-gYfx.rst deleted file mode 100644 index 78bad6e4686bee..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-08-03-19-04.bpo-40624.0-gYfx.rst +++ /dev/null @@ -1 +0,0 @@ -Added support for the XPath ``!=`` operator in xml.etree diff --git a/Misc/NEWS.d/next/Library/2020-10-01-15-44-52.bpo-41861.YTqJ7z.rst b/Misc/NEWS.d/next/Library/2020-10-01-15-44-52.bpo-41861.YTqJ7z.rst deleted file mode 100644 index d34658a254e059..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-01-15-44-52.bpo-41861.YTqJ7z.rst +++ /dev/null @@ -1,2 +0,0 @@ -Convert :mod:`sqlite3` to use heap types (PEP 384). -Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst b/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst deleted file mode 100644 index 768865ae62116d..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst +++ /dev/null @@ -1 +0,0 @@ -Enum: fix regression involving inheriting a multiply-inherited enum diff --git a/Misc/NEWS.d/next/Library/2020-10-08-23-51-55.bpo-26389.uga44e.rst b/Misc/NEWS.d/next/Library/2020-10-08-23-51-55.bpo-26389.uga44e.rst deleted file mode 100644 index a721a0d7cd0e80..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-08-23-51-55.bpo-26389.uga44e.rst +++ /dev/null @@ -1,4 +0,0 @@ -The :func:`traceback.format_exception`, -:func:`traceback.format_exception_only`, and -:func:`traceback.print_exception` functions can now take an exception object -as a positional-only argument. diff --git a/Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst b/Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst deleted file mode 100644 index c337731f435843..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst +++ /dev/null @@ -1,5 +0,0 @@ -Windows: Change ``sysconfig.get_config_var('EXT_SUFFIX')`` to the expected -full ``platform_tag.extension`` format. Previously it was hard-coded to -``.pyd``, now it is compatible with ``distutils.sysconfig`` and will result -in something like ``.cp38-win_amd64.pyd``. This brings windows into -conformance with the other platforms. diff --git a/Misc/NEWS.d/next/Library/2020-10-22-17-26-35.bpo-26131.CAsI3O.rst b/Misc/NEWS.d/next/Library/2020-10-22-17-26-35.bpo-26131.CAsI3O.rst deleted file mode 100644 index bead284bde4eb5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-22-17-26-35.bpo-26131.CAsI3O.rst +++ /dev/null @@ -1,2 +0,0 @@ -The `load_module()` methods found in importlib now trigger a -DeprecationWarning. diff --git a/Misc/NEWS.d/next/Library/2020-10-23-15-47-47.bpo-42133.BzizYV.rst b/Misc/NEWS.d/next/Library/2020-10-23-15-47-47.bpo-42133.BzizYV.rst deleted file mode 100644 index f3cfa1a8dce338..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-23-15-47-47.bpo-42133.BzizYV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update various modules in the stdlib to fall back on `__spec__.loader` when -`__loader__` isn't defined on a module. diff --git a/Misc/NEWS.d/next/Library/2020-10-24-04-02-36.bpo-42140.miLqvb.rst b/Misc/NEWS.d/next/Library/2020-10-24-04-02-36.bpo-42140.miLqvb.rst deleted file mode 100644 index 4160234b5ec685..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-24-04-02-36.bpo-42140.miLqvb.rst +++ /dev/null @@ -1 +0,0 @@ -Improve asyncio.wait function to create the futures set just one time. diff --git a/Misc/NEWS.d/next/Library/2020-10-29-11-17-35.bpo-42183.50ZcIi.rst b/Misc/NEWS.d/next/Library/2020-10-29-11-17-35.bpo-42183.50ZcIi.rst deleted file mode 100644 index f6d7653f2cf09f..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-29-11-17-35.bpo-42183.50ZcIi.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix a stack overflow error for asyncio Task or Future repr(). - -The overflow occurs under some circumstances when a Task or Future -recursively returns itself. diff --git a/Misc/NEWS.d/next/Library/2020-11-01-15-07-20.bpo-41754.DraSZh.rst b/Misc/NEWS.d/next/Library/2020-11-01-15-07-20.bpo-41754.DraSZh.rst deleted file mode 100644 index 181c2d9650a14c..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-01-15-07-20.bpo-41754.DraSZh.rst +++ /dev/null @@ -1 +0,0 @@ -webbrowser: Ignore *NotADirectoryError* when calling ``xdg-settings``. diff --git a/Misc/NEWS.d/next/Library/2020-11-02-23-05-17.bpo-42236.aJ6ZBR.rst b/Misc/NEWS.d/next/Library/2020-11-02-23-05-17.bpo-42236.aJ6ZBR.rst deleted file mode 100644 index 15e2620366556b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-02-23-05-17.bpo-42236.aJ6ZBR.rst +++ /dev/null @@ -1,3 +0,0 @@ -On Unix, the :func:`os.device_encoding` function now returns ``'UTF-8'`` rather -than the device encoding if the :ref:`Python UTF-8 Mode ` is -enabled. diff --git a/Misc/NEWS.d/next/Library/2020-11-03-09-22-56.bpo-42249.vfNO2u.rst b/Misc/NEWS.d/next/Library/2020-11-03-09-22-56.bpo-42249.vfNO2u.rst deleted file mode 100644 index 071a0fdda1ff80..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-03-09-22-56.bpo-42249.vfNO2u.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed writing binary Plist files larger than 4 GiB. diff --git a/Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst b/Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst deleted file mode 100644 index 7435c837a2cbe1..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst +++ /dev/null @@ -1,3 +0,0 @@ -Added :func:`threading.gettrace` and :func:`threading.getprofile` to -retrieve the functions set by :func:`threading.settrace` and -:func:`threading.setprofile` respectively. Patch by Mario Corchero. diff --git a/Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst b/Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst deleted file mode 100644 index dd8e6871eb8cd3..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-05-13-32-41.bpo-42264.r4KYUU.rst +++ /dev/null @@ -1,3 +0,0 @@ -``sqlite3.OptimizedUnicode`` has been undocumented and obsolete since Python -3.3, when it was made an alias to :class:`str`. It is now deprecated, -scheduled for removal in Python 3.12. diff --git a/Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst b/Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst deleted file mode 100644 index 6f6fccb1d4cd18..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst +++ /dev/null @@ -1,2 +0,0 @@ -Mock objects which are not unsafe will now raise an AttributeError if an attribute with the prefix asert, aseert, -or assrt is accessed, in addition to this already happening for the prefixes assert or assret. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-11-06-18-20-47.bpo-42131.l2rjjG.rst b/Misc/NEWS.d/next/Library/2020-11-06-18-20-47.bpo-42131.l2rjjG.rst deleted file mode 100644 index 4381f5e9754c21..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-06-18-20-47.bpo-42131.l2rjjG.rst +++ /dev/null @@ -1,5 +0,0 @@ -Implement PEP 451/spec methods on zipimport.zipimporter: find_spec(), -create_module(), and exec_module(). - -This also allows for the documented deprecation of find_loader(), -find_module(), and load_module(). diff --git a/Misc/NEWS.d/next/Library/2020-11-10-12-09-13.bpo-42308.yaJHH9.rst b/Misc/NEWS.d/next/Library/2020-11-10-12-09-13.bpo-42308.yaJHH9.rst deleted file mode 100644 index 3460b0c92b1504..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-10-12-09-13.bpo-42308.yaJHH9.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add :data:`threading.__excepthook__` to allow retrieving the original value -of :func:`threading.excepthook` in case it is set to a broken or a different -value. Patch by Mario Corchero. diff --git a/Misc/NEWS.d/next/Library/2020-11-10-14-27-49.bpo-42237.F363jO.rst b/Misc/NEWS.d/next/Library/2020-11-10-14-27-49.bpo-42237.F363jO.rst deleted file mode 100644 index 50cab6e1f11f84..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-10-14-27-49.bpo-42237.F363jO.rst +++ /dev/null @@ -1 +0,0 @@ -Fix `os.sendfile()` on illumos. diff --git a/Misc/NEWS.d/next/Library/2020-11-10-15-40-56.bpo-42014.ShM37l.rst b/Misc/NEWS.d/next/Library/2020-11-10-15-40-56.bpo-42014.ShM37l.rst deleted file mode 100644 index d3e1abcd84c1e8..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-10-15-40-56.bpo-42014.ShM37l.rst +++ /dev/null @@ -1 +0,0 @@ -The ``onerror`` callback from ``shutil.rmtree`` now receives correct function when ``os.open`` fails. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-11-12-18-21-15.bpo-42333.J9vFmV.rst b/Misc/NEWS.d/next/Library/2020-11-12-18-21-15.bpo-42333.J9vFmV.rst deleted file mode 100644 index f8755c7685642a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-12-18-21-15.bpo-42333.J9vFmV.rst +++ /dev/null @@ -1 +0,0 @@ -Port _ssl extension module to heap types. diff --git a/Misc/NEWS.d/next/Library/2020-11-13-18-53-50.bpo-42350.rsql7V.rst b/Misc/NEWS.d/next/Library/2020-11-13-18-53-50.bpo-42350.rsql7V.rst deleted file mode 100644 index 090ea2266633e6..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-13-18-53-50.bpo-42350.rsql7V.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix the :class:`threading.Thread` class at fork: do nothing if the thread is -already stopped (ex: fork called at Python exit). Previously, an error was -logged in the child process. diff --git a/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst b/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst deleted file mode 100644 index e72daebb2f152a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed support of non-BMP characters in :mod:`tkinter` on macOS. diff --git a/Misc/NEWS.d/next/Library/2020-11-14-14-34-32.bpo-37205.iDbHrw.rst b/Misc/NEWS.d/next/Library/2020-11-14-14-34-32.bpo-37205.iDbHrw.rst deleted file mode 100644 index 5cf325ec0c19d2..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-14-14-34-32.bpo-37205.iDbHrw.rst +++ /dev/null @@ -1,5 +0,0 @@ -:func:`time.perf_counter()` on Windows and :func:`time.monotonic()` on macOS -are now system-wide. Previously, they used an offset computed at startup to -reduce the precision loss caused by the float type. Use -:func:`time.perf_counter_ns()` and :func:`time.monotonic_ns()` added in Python -3.7 to avoid this precision loss. diff --git a/Misc/NEWS.d/next/Library/2020-11-15-15-23-34.bpo-42345.hiIR7x.rst b/Misc/NEWS.d/next/Library/2020-11-15-15-23-34.bpo-42345.hiIR7x.rst deleted file mode 100644 index 6339182c3ae727..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-15-15-23-34.bpo-42345.hiIR7x.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix various issues with ``typing.Literal`` parameter handling (flatten, -deduplicate, use type to cache key). Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2020-11-15-17-02-00.bpo-42328.bqpPlR.rst b/Misc/NEWS.d/next/Library/2020-11-15-17-02-00.bpo-42328.bqpPlR.rst deleted file mode 100644 index 7e6a176c889412..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-15-17-02-00.bpo-42328.bqpPlR.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fixed :meth:`tkinter.ttk.Style.map`. The function accepts now the -representation of the default state as empty sequence (as returned by -``Style.map()``). The structure of the result is now the same on all platform -and does not depend on the value of ``wantobjects``. diff --git a/Misc/NEWS.d/next/Library/2020-11-16-15-08-12.bpo-37205.Wh5svI.rst b/Misc/NEWS.d/next/Library/2020-11-16-15-08-12.bpo-37205.Wh5svI.rst deleted file mode 100644 index 9268f2d77f72f4..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-16-15-08-12.bpo-37205.Wh5svI.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`time.time()`, :func:`time.perf_counter()` and -:func:`time.monotonic()` functions can no longer fail with a Python fatal -error, instead raise a regular Python exception on failure. diff --git a/Misc/NEWS.d/next/Library/2020-11-17-23-00-27.bpo-41713.-Us0tf.rst b/Misc/NEWS.d/next/Library/2020-11-17-23-00-27.bpo-41713.-Us0tf.rst deleted file mode 100644 index 4b297d9d7435ae..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-17-23-00-27.bpo-41713.-Us0tf.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port the ``_signal`` extension module to the multi-phase initialization API -(:pep:`489`). Patch by Victor Stinner and Mohamed Koubaa. diff --git a/Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst b/Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst deleted file mode 100644 index 6d8c80c2f2c0ae..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst +++ /dev/null @@ -1 +0,0 @@ -subprocess module update for DragonFlyBSD support. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-11-19-09-59-07.bpo-1635741.7cMypH.rst b/Misc/NEWS.d/next/Library/2020-11-19-09-59-07.bpo-1635741.7cMypH.rst deleted file mode 100644 index 1e7d412680a1b2..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-19-09-59-07.bpo-1635741.7cMypH.rst +++ /dev/null @@ -1,2 +0,0 @@ -Convert _sre module types to heap types (PEP 384). Patch by Erlend E. -Aasland. diff --git a/Misc/NEWS.d/next/Library/2020-11-19-10-12-39.bpo-42403.t7q5AX.rst b/Misc/NEWS.d/next/Library/2020-11-19-10-12-39.bpo-42403.t7q5AX.rst deleted file mode 100644 index a90459a23ebf7a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-19-10-12-39.bpo-42403.t7q5AX.rst +++ /dev/null @@ -1,5 +0,0 @@ -Simplify the :mod:`importlib` external bootstrap code: -``importlib._bootstrap_external`` now uses regular imports to import builtin -modules. When it is imported, the builtin :func:`__import__()` function is -already fully working and so can be used to import builtin modules like -:mod:`sys`. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2020-11-19-10-44-41.bpo-42406.r9rNCj.rst b/Misc/NEWS.d/next/Library/2020-11-19-10-44-41.bpo-42406.r9rNCj.rst deleted file mode 100644 index c157df138a5ea0..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-19-10-44-41.bpo-42406.r9rNCj.rst +++ /dev/null @@ -1,3 +0,0 @@ -We fixed an issue in `pickle.whichmodule` in which importing -`multiprocessing` could change the how pickle identifies which module an -object belongs to, potentially breaking the unpickling of those objects. diff --git a/Misc/NEWS.d/next/Library/2020-11-19-16-14-36.bpo-31904.83kf9d.rst b/Misc/NEWS.d/next/Library/2020-11-19-16-14-36.bpo-31904.83kf9d.rst deleted file mode 100644 index e0ea23aefae7f5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-19-16-14-36.bpo-31904.83kf9d.rst +++ /dev/null @@ -1 +0,0 @@ -Support signal module on VxWorks. diff --git a/Misc/NEWS.d/next/Library/2020-11-19-20-27-51.bpo-42413.fjHrHx.rst b/Misc/NEWS.d/next/Library/2020-11-19-20-27-51.bpo-42413.fjHrHx.rst deleted file mode 100644 index ef1bf0fe9d3c0b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-19-20-27-51.bpo-42413.fjHrHx.rst +++ /dev/null @@ -1 +0,0 @@ -The exception :exc:`socket.timeout` is now an alias of :exc:`TimeoutError`. diff --git a/Misc/NEWS.d/next/Library/2020-11-20-10-38-34.bpo-15450.E-y9PA.rst b/Misc/NEWS.d/next/Library/2020-11-20-10-38-34.bpo-15450.E-y9PA.rst deleted file mode 100644 index dc3740669280b0..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-20-10-38-34.bpo-15450.E-y9PA.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make :class:`filecmp.dircmp` respect subclassing. Now the -:attr:`filecmp.dircmp.subdirs` behaves as expected when subclassing dircmp. diff --git a/Misc/NEWS.d/next/Library/2020-11-20-14-01-29.bpo-42392.-OUzvl.rst b/Misc/NEWS.d/next/Library/2020-11-20-14-01-29.bpo-42392.-OUzvl.rst deleted file mode 100644 index 964bef1893e3ac..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-20-14-01-29.bpo-42392.-OUzvl.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove loop parameter from ``__init__`` in all ``asyncio.locks`` and -``asyncio.Queue`` classes. Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2020-11-20-14-44-07.bpo-41818.33soAw.rst b/Misc/NEWS.d/next/Library/2020-11-20-14-44-07.bpo-41818.33soAw.rst deleted file mode 100644 index 005bf7e2af910e..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-20-14-44-07.bpo-41818.33soAw.rst +++ /dev/null @@ -1 +0,0 @@ -Updated tests for the pty library. test_basic() has been changed to test_openpty(); this additionally checks if slave termios and slave winsize are being set properly by pty.openpty(). In order to add support for FreeBSD, NetBSD, OpenBSD, and Darwin, this also adds test_master_read(), which demonstrates that pty.spawn() should not depend on an OSError to exit from its copy loop. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-11-22-12-30-26.bpo-26131.-HsFPG.rst b/Misc/NEWS.d/next/Library/2020-11-22-12-30-26.bpo-26131.-HsFPG.rst deleted file mode 100644 index 33062a3f93bef8..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-22-12-30-26.bpo-26131.-HsFPG.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate zipimport.zipimporter.load_module() in favour of exec_module(). diff --git a/Misc/NEWS.d/next/Library/2020-11-23-23-42-08.bpo-42299.Fdn4Wf.rst b/Misc/NEWS.d/next/Library/2020-11-23-23-42-08.bpo-42299.Fdn4Wf.rst deleted file mode 100644 index a8e156c1003792..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-23-23-42-08.bpo-42299.Fdn4Wf.rst +++ /dev/null @@ -1,5 +0,0 @@ -Removed the ``formatter`` module, which was deprecated in Python 3.4. -It is somewhat obsolete, little used, and not tested. It was originally -scheduled to be removed in Python 3.6, but such removals were delayed until -after Python 2.7 EOL. Existing users should copy whatever classes they use -into their code. Patch by Dong-hee Na and and Terry J. Reedy. diff --git a/Misc/NEWS.d/next/Library/2020-11-24-13-18-05.bpo-28468.8Gh2d4.rst b/Misc/NEWS.d/next/Library/2020-11-24-13-18-05.bpo-28468.8Gh2d4.rst deleted file mode 100644 index b1834065cf047e..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-24-13-18-05.bpo-28468.8Gh2d4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :func:`platform.freedesktop_os_release` function to parse freedesktop.org -``os-release`` files. diff --git a/Misc/NEWS.d/next/Library/2020-11-25-22-44-59.bpo-42392.T_DAEl.rst b/Misc/NEWS.d/next/Library/2020-11-25-22-44-59.bpo-42392.T_DAEl.rst deleted file mode 100644 index 35a08dd91e69fd..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-25-22-44-59.bpo-42392.T_DAEl.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove loop parameter from ``asyncio.open_connection`` and -``asyncio.start_server`` functions. Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2020-11-26-12-40-16.bpo-42392.GbmdHE.rst b/Misc/NEWS.d/next/Library/2020-11-26-12-40-16.bpo-42392.GbmdHE.rst deleted file mode 100644 index 660e6dddc7e8af..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-26-12-40-16.bpo-42392.GbmdHE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove loop parameter from ``asyncio.subprocess`` and ``asyncio.tasks`` -functions. Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2020-11-27-09-19-43.bpo-41818.KWYUbL.rst b/Misc/NEWS.d/next/Library/2020-11-27-09-19-43.bpo-41818.KWYUbL.rst deleted file mode 100644 index 56cdc9a7dab548..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-27-09-19-43.bpo-41818.KWYUbL.rst +++ /dev/null @@ -1 +0,0 @@ -Make test_openpty() avoid unexpected success due to number of rows and/or number of columns being == 0. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-11-27-16-46-58.bpo-42482.EJC3sd.rst b/Misc/NEWS.d/next/Library/2020-11-27-16-46-58.bpo-42482.EJC3sd.rst deleted file mode 100644 index 79afa654f352e9..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-27-16-46-58.bpo-42482.EJC3sd.rst +++ /dev/null @@ -1 +0,0 @@ -:class:`~traceback.TracebackException` no longer holds a reference to the exception's traceback object. Consequently, instances of TracebackException for equivalent but non-equal exceptions now compare as equal. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-11-28-04-31-20.bpo-42487.iqtC4L.rst b/Misc/NEWS.d/next/Library/2020-11-28-04-31-20.bpo-42487.iqtC4L.rst deleted file mode 100644 index 8c67d747b614ee..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-28-04-31-20.bpo-42487.iqtC4L.rst +++ /dev/null @@ -1 +0,0 @@ -ChainMap.__iter__ no longer calls __getitem__ on underlying maps diff --git a/Misc/NEWS.d/next/Library/2020-11-28-06-34-53.bpo-41818.mFSMc2.rst b/Misc/NEWS.d/next/Library/2020-11-28-06-34-53.bpo-41818.mFSMc2.rst deleted file mode 100644 index b783f8cec1c941..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-28-06-34-53.bpo-41818.mFSMc2.rst +++ /dev/null @@ -1 +0,0 @@ -Fix test_master_read() so that it succeeds on all platforms that either raise OSError or return b"" upon reading from master. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-11-28-22-52-57.bpo-38200.DuWGlW.rst b/Misc/NEWS.d/next/Library/2020-11-28-22-52-57.bpo-38200.DuWGlW.rst deleted file mode 100644 index b4bc5551b2532e..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-28-22-52-57.bpo-38200.DuWGlW.rst +++ /dev/null @@ -1 +0,0 @@ -Added itertools.pairwise() diff --git a/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst b/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst deleted file mode 100644 index 7465cb8e2e3d7b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst +++ /dev/null @@ -1 +0,0 @@ -Remove unexpected call of ``__bool__`` when passing a ``spec_arg`` argument to a Mock. diff --git a/Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst b/Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst deleted file mode 100644 index febda89338ddc7..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst +++ /dev/null @@ -1 +0,0 @@ -Fix handling of trailing comments by :func:`inspect.getsource`. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-12-03-22-22-24.bpo-17735.Qsaaue.rst b/Misc/NEWS.d/next/Library/2020-12-03-22-22-24.bpo-17735.Qsaaue.rst deleted file mode 100644 index 655781e3d2eddb..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-03-22-22-24.bpo-17735.Qsaaue.rst +++ /dev/null @@ -1,4 +0,0 @@ -:func:`inspect.findsource` now raises :exc:`OSError` instead of -:exc:`IndexError` when :attr:`co_lineno` of a code object is greater than the -file length. This can happen, for example, when a file is edited after it was -imported. PR by Irit Katriel. diff --git a/Misc/NEWS.d/next/Library/2020-12-03-22-42-03.bpo-42562.2hPmhi.rst b/Misc/NEWS.d/next/Library/2020-12-03-22-42-03.bpo-42562.2hPmhi.rst deleted file mode 100644 index 4999da509c2913..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-03-22-42-03.bpo-42562.2hPmhi.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix issue when dis failed to parse function that has no line numbers. Patch -provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2020-12-04-03-51-12.bpo-5054.53StYZ.rst b/Misc/NEWS.d/next/Library/2020-12-04-03-51-12.bpo-5054.53StYZ.rst deleted file mode 100644 index ad8163c7c1d206..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-04-03-51-12.bpo-5054.53StYZ.rst +++ /dev/null @@ -1,5 +0,0 @@ -CGIHTTPRequestHandler.run_cgi() HTTP_ACCEPT improperly parsed. Replace the -special purpose getallmatchingheaders with generic get_all method and add -relevant tests. - -Original Patch by Martin Panter. Modified by Senthil Kumaran. diff --git a/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst b/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst deleted file mode 100644 index 69b9de1beae0d1..00000000000000 --- a/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst +++ /dev/null @@ -1 +0,0 @@ -Add ``volatile`` to the accumulator variable in ``hmac.compare_digest``, making constant-time-defeating optimizations less likely. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Tests/2020-05-20-14-28-48.bpo-31904.yJik6k.rst b/Misc/NEWS.d/next/Tests/2020-05-20-14-28-48.bpo-31904.yJik6k.rst deleted file mode 100644 index 40caa88d689a22..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-05-20-14-28-48.bpo-31904.yJik6k.rst +++ /dev/null @@ -1 +0,0 @@ -Fix fifo test cases for VxWorks RTOS. diff --git a/Misc/NEWS.d/next/Tests/2020-05-20-17-28-46.bpo-31904.yt83Ge.rst b/Misc/NEWS.d/next/Tests/2020-05-20-17-28-46.bpo-31904.yt83Ge.rst deleted file mode 100644 index 1679801a111066..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-05-20-17-28-46.bpo-31904.yt83Ge.rst +++ /dev/null @@ -1 +0,0 @@ -Fix os module failures for VxWorks RTOS. diff --git a/Misc/NEWS.d/next/Tests/2020-09-18-16-14-03.bpo-41561.uPnwrW.rst b/Misc/NEWS.d/next/Tests/2020-09-18-16-14-03.bpo-41561.uPnwrW.rst deleted file mode 100644 index 10bce825961c3c..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-09-18-16-14-03.bpo-41561.uPnwrW.rst +++ /dev/null @@ -1 +0,0 @@ -test_ssl: skip test_min_max_version_mismatch when TLS 1.0 is not available diff --git a/Misc/NEWS.d/next/Tests/2020-11-13-21-51-34.bpo-40754.Ekoxkg.rst b/Misc/NEWS.d/next/Tests/2020-11-13-21-51-34.bpo-40754.Ekoxkg.rst deleted file mode 100644 index 4bd423b54a4499..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-11-13-21-51-34.bpo-40754.Ekoxkg.rst +++ /dev/null @@ -1 +0,0 @@ -Include ``_testinternalcapi`` module in Windows installer for test suite diff --git a/Misc/NEWS.d/next/Tests/2020-11-20-15-07-18.bpo-31904.EBJXjJ.rst b/Misc/NEWS.d/next/Tests/2020-11-20-15-07-18.bpo-31904.EBJXjJ.rst deleted file mode 100644 index e5e66ceea44021..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-11-20-15-07-18.bpo-31904.EBJXjJ.rst +++ /dev/null @@ -1 +0,0 @@ -Fix test_doctest.py failures for VxWorks. diff --git a/Misc/NEWS.d/next/Tests/2020-11-23-11-11-29.bpo-31904.V3sUZk.rst b/Misc/NEWS.d/next/Tests/2020-11-23-11-11-29.bpo-31904.V3sUZk.rst deleted file mode 100644 index 7202cfa3f3f4c5..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-11-23-11-11-29.bpo-31904.V3sUZk.rst +++ /dev/null @@ -1 +0,0 @@ -skip some tests related to fifo on VxWorks diff --git a/Misc/NEWS.d/next/Tests/2020-11-24-17-26-41.bpo-31904.eug834.rst b/Misc/NEWS.d/next/Tests/2020-11-24-17-26-41.bpo-31904.eug834.rst deleted file mode 100644 index 3e3942857b8f16..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-11-24-17-26-41.bpo-31904.eug834.rst +++ /dev/null @@ -1 +0,0 @@ -add shell requirement for test_pipes diff --git a/Misc/NEWS.d/next/Tests/2020-11-25-17-00-53.bpo-31904.ue4hd9.rst b/Misc/NEWS.d/next/Tests/2020-11-25-17-00-53.bpo-31904.ue4hd9.rst deleted file mode 100644 index 910505440b8d60..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-11-25-17-00-53.bpo-31904.ue4hd9.rst +++ /dev/null @@ -1 +0,0 @@ -skip test_test of test_mailcap on VxWorks diff --git a/Misc/NEWS.d/next/Tests/2020-11-26-11-13-13.bpo-31904.ay4g89.rst b/Misc/NEWS.d/next/Tests/2020-11-26-11-13-13.bpo-31904.ay4g89.rst deleted file mode 100644 index 6d95d527e6eeed..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-11-26-11-13-13.bpo-31904.ay4g89.rst +++ /dev/null @@ -1 +0,0 @@ -skip test_getaddrinfo_ipv6_scopeid_symbolic and test_getnameinfo_ipv6_scopeid_symbolic on VxWorks diff --git a/Misc/NEWS.d/next/Tests/2020-12-01-15-51-19.bpo-31904.iwetj4.rst b/Misc/NEWS.d/next/Tests/2020-12-01-15-51-19.bpo-31904.iwetj4.rst deleted file mode 100644 index 49e9892e9ed7c0..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-12-01-15-51-19.bpo-31904.iwetj4.rst +++ /dev/null @@ -1 +0,0 @@ -Fix test_netrc on VxWorks: create temporary directories using temp_cwd(). diff --git a/Misc/NEWS.d/next/Tests/2020-12-03-13-32-44.bpo-42553.2TRE2N.rst b/Misc/NEWS.d/next/Tests/2020-12-03-13-32-44.bpo-42553.2TRE2N.rst deleted file mode 100644 index 872214284728bc..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-12-03-13-32-44.bpo-42553.2TRE2N.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix ``test_asyncio.test_call_later()`` race condition: don't measure asyncio -performance in the ``call_later()`` unit test. The test failed randomly on -the CI. diff --git a/Misc/NEWS.d/next/Tests/2020-12-04-11-47-09.bpo-41473.W_updK.rst b/Misc/NEWS.d/next/Tests/2020-12-04-11-47-09.bpo-41473.W_updK.rst deleted file mode 100644 index 9e0a375a9b7f25..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-12-04-11-47-09.bpo-41473.W_updK.rst +++ /dev/null @@ -1,3 +0,0 @@ -Reenable test_gdb on gdb 9.2 and newer: -https://bugzilla.redhat.com/show_bug.cgi?id=1866884 bug is fixed in gdb -10.1. diff --git a/Misc/NEWS.d/next/Tools-Demos/2020-05-03-01-30-46.bpo-36310.xDxxwY.rst b/Misc/NEWS.d/next/Tools-Demos/2020-05-03-01-30-46.bpo-36310.xDxxwY.rst deleted file mode 100644 index 16749a8fc9665b..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2020-05-03-01-30-46.bpo-36310.xDxxwY.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow :file:`Tools/i18n/pygettext.py` to detect calls to ``gettext`` in -f-strings. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Tools-Demos/2020-11-20-15-11-05.bpo-42212.sjzgOf.rst b/Misc/NEWS.d/next/Tools-Demos/2020-11-20-15-11-05.bpo-42212.sjzgOf.rst deleted file mode 100644 index d2cbe3de6fe92e..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2020-11-20-15-11-05.bpo-42212.sjzgOf.rst +++ /dev/null @@ -1,3 +0,0 @@ -The smelly.py script now also checks the Python dynamic library and extension -modules, not only the Python static library. Make also the script more verbose: -explain what it does. diff --git a/Misc/NEWS.d/next/Windows/2020-11-15-23-01-14.bpo-38506.hhdnuP.rst b/Misc/NEWS.d/next/Windows/2020-11-15-23-01-14.bpo-38506.hhdnuP.rst deleted file mode 100644 index 8ad75ef5ea093a..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-11-15-23-01-14.bpo-38506.hhdnuP.rst +++ /dev/null @@ -1,2 +0,0 @@ -The Windows launcher now properly handles Python 3.10 when listing installed -Python versions. diff --git a/Misc/NEWS.d/next/Windows/2020-11-16-22-41-02.bpo-42120.9scgko.rst b/Misc/NEWS.d/next/Windows/2020-11-16-22-41-02.bpo-42120.9scgko.rst deleted file mode 100644 index c574956d11d932..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-11-16-22-41-02.bpo-42120.9scgko.rst +++ /dev/null @@ -1 +0,0 @@ -Remove macro definition of ``copysign`` (to ``_copysign``) in headers. diff --git a/Misc/NEWS.d/next/macOS/2020-10-23-10-26-53.bpo-38443.vu64tl.rst b/Misc/NEWS.d/next/macOS/2020-10-23-10-26-53.bpo-38443.vu64tl.rst deleted file mode 100644 index 008c972e5c6ab0..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-10-23-10-26-53.bpo-38443.vu64tl.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``--enable-universalsdk`` and ``--with-universal-archs`` options for the -configure script now check that the specified architectures can be used. diff --git a/Misc/NEWS.d/next/macOS/2020-11-01-15-10-28.bpo-42232.2zI1GN.rst b/Misc/NEWS.d/next/macOS/2020-11-01-15-10-28.bpo-42232.2zI1GN.rst deleted file mode 100644 index d431a9d1e32288..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-11-01-15-10-28.bpo-42232.2zI1GN.rst +++ /dev/null @@ -1 +0,0 @@ -Added Darwin specific madvise options to mmap module. \ No newline at end of file diff --git a/Misc/NEWS.d/next/macOS/2020-11-01-16-40-23.bpo-41100.BApztP.rst b/Misc/NEWS.d/next/macOS/2020-11-01-16-40-23.bpo-41100.BApztP.rst deleted file mode 100644 index 6cbb279e7625ea..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-11-01-16-40-23.bpo-41100.BApztP.rst +++ /dev/null @@ -1,8 +0,0 @@ -Add support for macOS 11 and Apple Silicon systems. - -It is now possible to build "Universal 2" binaries using -"--enable-universalsdk --with-universal-archs=universal2". - -Binaries build on later macOS versions can be deployed back to older -versions (tested up to macOS 10.9), when using the correct deployment -target. This is tested using Xcode 11 and later. diff --git a/Misc/NEWS.d/next/macOS/2020-11-15-16-43-45.bpo-41116.oCkbrF.rst b/Misc/NEWS.d/next/macOS/2020-11-15-16-43-45.bpo-41116.oCkbrF.rst deleted file mode 100644 index c982224e92d719..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-11-15-16-43-45.bpo-41116.oCkbrF.rst +++ /dev/null @@ -1 +0,0 @@ -Ensure distutils.unixxcompiler.find_library_file can find system provided libraries on macOS 11. \ No newline at end of file diff --git a/Misc/NEWS.d/next/macOS/2020-12-02-15-48-40.bpo-42504.RQmMOR.rst b/Misc/NEWS.d/next/macOS/2020-12-02-15-48-40.bpo-42504.RQmMOR.rst deleted file mode 100644 index c83bc2b9eeec5f..00000000000000 --- a/Misc/NEWS.d/next/macOS/2020-12-02-15-48-40.bpo-42504.RQmMOR.rst +++ /dev/null @@ -1 +0,0 @@ -Fix build on macOS Big Sur when MACOSX_DEPLOYMENT_TARGET=11 \ No newline at end of file diff --git a/README.rst b/README.rst index b27854d9178637..51d60d5da62092 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.10.0 alpha 2 +This is Python version 3.10.0 alpha 3 ===================================== .. image:: https://travis-ci.com/python/cpython.svg?branch=master From 40a3299ea4e01f20031eadf34d4e4e59a99c675f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= Date: Mon, 7 Dec 2020 21:05:13 +0100 Subject: [PATCH 0738/1261] bpo-42579: Make workaround for various versions of Sphinx more robust (GH-23662) The solution in gh#python/cpython#13236 is too strict because it effectively requires the use of Sphinx >= 2.0. It is not too difficult to make the same solution more robust so it works with all normal versions of Sphinx. --- Doc/tools/extensions/pyspecific.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 80fbd96d56fdc0..28994399e25cf9 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -394,7 +394,12 @@ def run(self): translatable=False) node.append(para) env = self.state.document.settings.env - env.get_domain('changeset').note_changeset(node) + # deprecated pre-Sphinx-2 method + if hasattr(env, 'note_versionchange'): + env.note_versionchange('deprecated', version[0], node, self.lineno) + # new method + else: + env.get_domain('changeset').note_changeset(node) return [node] + messages From 113a91fa82b813522e31add9cf9282897306acfb Mon Sep 17 00:00:00 2001 From: pxinwr Date: Tue, 8 Dec 2020 04:41:12 +0800 Subject: [PATCH 0739/1261] bpo-41462: Add os.set_blocking() support for VxWorks RTOS (GH-21713) --- .../next/Library/2020-08-03-17-54-32.bpo-41462.ek38d_.rst | 1 + Python/fileutils.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-08-03-17-54-32.bpo-41462.ek38d_.rst diff --git a/Misc/NEWS.d/next/Library/2020-08-03-17-54-32.bpo-41462.ek38d_.rst b/Misc/NEWS.d/next/Library/2020-08-03-17-54-32.bpo-41462.ek38d_.rst new file mode 100644 index 00000000000000..ca5da1b17b4363 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-03-17-54-32.bpo-41462.ek38d_.rst @@ -0,0 +1 @@ +Add :func:`os.set_blocking()` support for VxWorks RTOS. diff --git a/Python/fileutils.c b/Python/fileutils.c index b589d7390d46dc..ac382821174211 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -2070,7 +2070,9 @@ _Py_get_blocking(int fd) int _Py_set_blocking(int fd, int blocking) { -#if defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO) +/* bpo-41462: On VxWorks, ioctl(FIONBIO) only works on sockets. + Use fcntl() instead. */ +#if defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO) && !defined(__VXWORKS__) int arg = !blocking; if (ioctl(fd, FIONBIO, &arg) < 0) goto error; From 4c2b8bab5bbe8666958b4ec2a6e7e1676b76ec55 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 8 Dec 2020 02:31:04 +0000 Subject: [PATCH 0740/1261] Post 3.10.0a3 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 6174cb6d5f8a30..1af225ca0936b5 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 3 /* Version as a string */ -#define PY_VERSION "3.10.0a3" +#define PY_VERSION "3.10.0a3+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. From 05a8d8b9fddce9e311af639deb3b3c4391ab1894 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 8 Dec 2020 14:38:08 +0100 Subject: [PATCH 0741/1261] bpo-32381: Fix PyRun_SimpleFileExFlags() encoding (GH-23642) Fix encoding name when running a ".pyc" file on Windows: PyRun_SimpleFileExFlags() now uses the correct encoding to decode the filename. * Add pyrun_file() subfunction. * Add pyrun_simple_file() subfunction. * PyRun_SimpleFileExFlags() now calls _Py_fopen_obj() rather than _Py_fopen(). --- .../2020-12-04-17-17-44.bpo-32381.NY5t2S.rst | 3 + Python/pythonrun.c | 224 +++++++++++------- 2 files changed, 135 insertions(+), 92 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-04-17-17-44.bpo-32381.NY5t2S.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-04-17-17-44.bpo-32381.NY5t2S.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-04-17-17-44.bpo-32381.NY5t2S.rst new file mode 100644 index 00000000000000..f4d84f9d848d4f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-12-04-17-17-44.bpo-32381.NY5t2S.rst @@ -0,0 +1,3 @@ +Fix encoding name when running a ``.pyc`` file on Windows: +:c:func:`PyRun_SimpleFileExFlags()` now uses the correct encoding to decode +the filename. diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 6181a38defcc0d..330b822d707c65 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -59,9 +59,13 @@ extern "C" { static void flush_io(void); static PyObject *run_mod(mod_ty, PyObject *, PyObject *, PyObject *, PyCompilerFlags *, PyArena *); -static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *, +static PyObject *run_pyc_file(FILE *, PyObject *, PyObject *, PyCompilerFlags *); static int PyRun_InteractiveOneObjectEx(FILE *, PyObject *, PyCompilerFlags *); +static PyObject* pyrun_file(FILE *fp, PyObject *filename, int start, + PyObject *globals, PyObject *locals, int closeit, + PyCompilerFlags *flags); + /* Parse input from a file and execute it */ int @@ -269,82 +273,89 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename_str, PyCompilerFlags *f the file type, and, if we may close it, at the first few bytes. */ static int -maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit) +maybe_pyc_file(FILE *fp, PyObject *filename, int closeit) { - if (strcmp(ext, ".pyc") == 0) + PyObject *ext = PyUnicode_FromString(".pyc"); + if (ext == NULL) { + return -1; + } + Py_ssize_t endswith = PyUnicode_Tailmatch(filename, ext, 0, PY_SSIZE_T_MAX, +1); + Py_DECREF(ext); + if (endswith) { return 1; + } /* Only look into the file if we are allowed to close it, since it then should also be seekable. */ - if (closeit) { - /* Read only two bytes of the magic. If the file was opened in - text mode, the bytes 3 and 4 of the magic (\r\n) might not - be read as they are on disk. */ - unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF; - unsigned char buf[2]; - /* Mess: In case of -x, the stream is NOT at its start now, - and ungetc() was used to push back the first newline, - which makes the current stream position formally undefined, - and a x-platform nightmare. - Unfortunately, we have no direct way to know whether -x - was specified. So we use a terrible hack: if the current - stream position is not 0, we assume -x was specified, and - give up. Bug 132850 on SourceForge spells out the - hopelessness of trying anything else (fseek and ftell - don't work predictably x-platform for text-mode files). - */ - int ispyc = 0; - if (ftell(fp) == 0) { - if (fread(buf, 1, 2, fp) == 2 && - ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic) - ispyc = 1; - rewind(fp); - } - return ispyc; + if (!closeit) { + return 0; } - return 0; + + /* Read only two bytes of the magic. If the file was opened in + text mode, the bytes 3 and 4 of the magic (\r\n) might not + be read as they are on disk. */ + unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF; + unsigned char buf[2]; + /* Mess: In case of -x, the stream is NOT at its start now, + and ungetc() was used to push back the first newline, + which makes the current stream position formally undefined, + and a x-platform nightmare. + Unfortunately, we have no direct way to know whether -x + was specified. So we use a terrible hack: if the current + stream position is not 0, we assume -x was specified, and + give up. Bug 132850 on SourceForge spells out the + hopelessness of trying anything else (fseek and ftell + don't work predictably x-platform for text-mode files). + */ + int ispyc = 0; + if (ftell(fp) == 0) { + if (fread(buf, 1, 2, fp) == 2 && + ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic) + ispyc = 1; + rewind(fp); + } + return ispyc; } + static int -set_main_loader(PyObject *d, const char *filename, const char *loader_name) +set_main_loader(PyObject *d, PyObject *filename, const char *loader_name) { - PyObject *filename_obj, *bootstrap, *loader_type = NULL, *loader; - int result = 0; - - filename_obj = PyUnicode_DecodeFSDefault(filename); - if (filename_obj == NULL) - return -1; PyInterpreterState *interp = _PyInterpreterState_GET(); - bootstrap = PyObject_GetAttrString(interp->importlib, - "_bootstrap_external"); - if (bootstrap != NULL) { - loader_type = PyObject_GetAttrString(bootstrap, loader_name); - Py_DECREF(bootstrap); + PyObject *bootstrap = PyObject_GetAttrString(interp->importlib, + "_bootstrap_external"); + if (bootstrap == NULL) { + return -1; } + + PyObject *loader_type = PyObject_GetAttrString(bootstrap, loader_name); + Py_DECREF(bootstrap); if (loader_type == NULL) { - Py_DECREF(filename_obj); return -1; } - loader = PyObject_CallFunction(loader_type, "sN", "__main__", filename_obj); + + PyObject *loader = PyObject_CallFunction(loader_type, + "sO", "__main__", filename); Py_DECREF(loader_type); if (loader == NULL) { return -1; } + if (PyDict_SetItemString(d, "__loader__", loader) < 0) { - result = -1; + Py_DECREF(loader); + return -1; } Py_DECREF(loader); - return result; + return 0; } -int -PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, - PyCompilerFlags *flags) + +static int +pyrun_simple_file(FILE *fp, PyObject *filename, int closeit, + PyCompilerFlags *flags) { PyObject *m, *d, *v; - const char *ext; int set_file_name = 0, ret = -1; - size_t len; m = PyImport_AddModule("__main__"); if (m == NULL) @@ -355,29 +366,29 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, if (PyErr_Occurred()) { goto done; } - PyObject *f; - f = PyUnicode_DecodeFSDefault(filename); - if (f == NULL) - goto done; - if (PyDict_SetItemString(d, "__file__", f) < 0) { - Py_DECREF(f); + if (PyDict_SetItemString(d, "__file__", filename) < 0) { goto done; } if (PyDict_SetItemString(d, "__cached__", Py_None) < 0) { - Py_DECREF(f); goto done; } set_file_name = 1; - Py_DECREF(f); } - len = strlen(filename); - ext = filename + len - (len > 4 ? 4 : 0); - if (maybe_pyc_file(fp, filename, ext, closeit)) { + + int pyc = maybe_pyc_file(fp, filename, closeit); + if (pyc < 0) { + goto done; + } + + if (pyc) { FILE *pyc_fp; /* Try to run a pyc file. First, re-open in binary */ - if (closeit) + if (closeit) { fclose(fp); - if ((pyc_fp = _Py_fopen(filename, "rb")) == NULL) { + } + + pyc_fp = _Py_fopen_obj(filename, "rb"); + if (pyc_fp == NULL) { fprintf(stderr, "python: Can't reopen .pyc file\n"); goto done; } @@ -388,17 +399,17 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, fclose(pyc_fp); goto done; } - v = run_pyc_file(pyc_fp, filename, d, d, flags); + v = run_pyc_file(pyc_fp, d, d, flags); } else { /* When running from stdin, leave __main__.__loader__ alone */ - if (strcmp(filename, "") != 0 && + if (PyUnicode_CompareWithASCIIString(filename, "") != 0 && set_main_loader(d, filename, "SourceFileLoader") < 0) { fprintf(stderr, "python: failed to set __main__.__loader__\n"); ret = -1; goto done; } - v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d, - closeit, flags); + v = pyrun_file(fp, filename, Py_file_input, d, d, + closeit, flags); } flush_io(); if (v == NULL) { @@ -421,6 +432,21 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, return ret; } + +int +PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, + PyCompilerFlags *flags) +{ + PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename); + if (filename_obj == NULL) { + return -1; + } + int res = pyrun_simple_file(fp, filename_obj, closeit, flags); + Py_DECREF(filename_obj); + return res; +} + + int PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags) { @@ -1039,40 +1065,54 @@ PyRun_StringFlags(const char *str, int start, PyObject *globals, return ret; } -PyObject * -PyRun_FileExFlags(FILE *fp, const char *filename_str, int start, PyObject *globals, - PyObject *locals, int closeit, PyCompilerFlags *flags) -{ - PyObject *ret = NULL; - mod_ty mod; - PyArena *arena = NULL; - PyObject *filename; - - filename = PyUnicode_DecodeFSDefault(filename_str); - if (filename == NULL) - goto exit; - arena = PyArena_New(); - if (arena == NULL) - goto exit; +static PyObject * +pyrun_file(FILE *fp, PyObject *filename, int start, PyObject *globals, + PyObject *locals, int closeit, PyCompilerFlags *flags) +{ + PyArena *arena = PyArena_New(); + if (arena == NULL) { + return NULL; + } + mod_ty mod; mod = PyParser_ASTFromFileObject(fp, filename, NULL, start, NULL, NULL, flags, NULL, arena); - if (closeit) + if (closeit) { fclose(fp); - if (mod == NULL) { - goto exit; } - ret = run_mod(mod, filename, globals, locals, flags, arena); -exit: - Py_XDECREF(filename); - if (arena != NULL) - PyArena_Free(arena); + PyObject *ret; + if (mod != NULL) { + ret = run_mod(mod, filename, globals, locals, flags, arena); + } + else { + ret = NULL; + } + PyArena_Free(arena); + return ret; } + +PyObject * +PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, + PyObject *locals, int closeit, PyCompilerFlags *flags) +{ + PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename); + if (filename_obj == NULL) { + return NULL; + } + + PyObject *res = pyrun_file(fp, filename_obj, start, globals, + locals, closeit, flags); + Py_DECREF(filename_obj); + return res; + +} + + static void flush_io(void) { @@ -1155,8 +1195,8 @@ run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals, } static PyObject * -run_pyc_file(FILE *fp, const char *filename, PyObject *globals, - PyObject *locals, PyCompilerFlags *flags) +run_pyc_file(FILE *fp, PyObject *globals, PyObject *locals, + PyCompilerFlags *flags) { PyThreadState *tstate = _PyThreadState_GET(); PyCodeObject *co; From 46adc09d9f795a7cbed6fe1b94e906d8f763d8ae Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Tue, 8 Dec 2020 22:42:42 +0800 Subject: [PATCH 0742/1261] bpo-42599: Remove useless PyModule_GetWarningsModule() (GH-23691) Removed PyModule_GetWarningsModule() which is useless due to the _warnings module was converted to a builtin module in 2.6. --- Doc/whatsnew/3.10.rst | 5 +++++ Python/errors.c | 3 --- Python/pylifecycle.c | 8 -------- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index a5cb4e30616cd0..23e28aa4fd8fc2 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -480,6 +480,11 @@ Removed into their code. (Contributed by Dong-hee Na and Terry J. Reedy in :issue:`42299`.) +* Removed the :c:func:`PyModule_GetWarningsModule` function that was useless + now due to the _warnings module was converted to a builtin module in 2.6. + (Contributed by Hai Shi in :issue:`42599`.) + + Porting to Python 3.10 ====================== diff --git a/Python/errors.c b/Python/errors.c index 8242ac69785d4f..213108f681bb79 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1534,9 +1534,6 @@ PyErr_WriteUnraisable(PyObject *obj) } -extern PyObject *PyModule_GetWarningsModule(void); - - void PyErr_SyntaxLocation(const char *filename, int lineno) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 428c887ef41c50..70824ff674129a 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -97,14 +97,6 @@ _Py_IsFinalizing(void) int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) = \ PyOS_mystrnicmp; /* Python/pystrcmp.o */ -/* PyModule_GetWarningsModule is no longer necessary as of 2.6 -since _warnings is builtin. This API should not be used. */ -PyObject * -PyModule_GetWarningsModule(void) -{ - return PyImport_ImportModule("warnings"); -} - /* APIs to access the initialization flags * From b81bda39f25e79a0b5990b0175d219e886c6ccc8 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 8 Dec 2020 10:29:49 -0500 Subject: [PATCH 0743/1261] bpo-41910: move news entry (GH-23695) --- Misc/NEWS.d/3.10.0a2.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Misc/NEWS.d/3.10.0a2.rst b/Misc/NEWS.d/3.10.0a2.rst index a3c909df866dba..b7ed61986adfec 100644 --- a/Misc/NEWS.d/3.10.0a2.rst +++ b/Misc/NEWS.d/3.10.0a2.rst @@ -116,15 +116,6 @@ failure, run the parser a second time with those enabled. .. -.. bpo: 41910 -.. date: 2020-10-21-14-40-54 -.. nonce: CzBMit -.. section: Core and Builtins - -Document the default implementation of `object.__eq__`. - -.. - .. bpo: 42093 .. date: 2020-10-20-04-24-07 .. nonce: ooZZNh @@ -653,6 +644,15 @@ Document __format__ functionality for IP addresses. .. +.. bpo: 41910 +.. date: 2020-10-21-14-40-54 +.. nonce: CzBMit +.. section: Documentation + +Document the default implementation of `object.__eq__`. + +.. + .. bpo: 42010 .. date: 2020-10-21-02-21-14 .. nonce: 76vJ0u From f70e2cdc2a2eed0621ce855ce529c59dca9a7671 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 8 Dec 2020 17:36:53 +0100 Subject: [PATCH 0744/1261] bpo-42111: Make the xxlimited module an example of best extension module practices (GH-23226) - Copy existing xxlimited to xxlimited53 (named for the limited API version it uses) - Build both modules, both in debug and release - Test both modules --- Lib/test/test_xxlimited.py | 79 ++++ .../2020-10-21-18-43-06.bpo-42111.9pvtrc.rst | 2 + Modules/xxlimited.c | 379 +++++++++++------- Modules/xxlimited_35.c | 301 ++++++++++++++ PC/layout/main.py | 2 +- PCbuild/pcbuild.proj | 1 + PCbuild/readme.txt | 3 + PCbuild/xxlimited.vcxproj | 4 +- PCbuild/xxlimited_35.vcxproj | 114 ++++++ PCbuild/xxlimited_35.vcxproj.filters | 13 + setup.py | 8 + 11 files changed, 748 insertions(+), 158 deletions(-) create mode 100644 Lib/test/test_xxlimited.py create mode 100644 Misc/NEWS.d/next/C API/2020-10-21-18-43-06.bpo-42111.9pvtrc.rst create mode 100644 Modules/xxlimited_35.c create mode 100644 PCbuild/xxlimited_35.vcxproj create mode 100644 PCbuild/xxlimited_35.vcxproj.filters diff --git a/Lib/test/test_xxlimited.py b/Lib/test/test_xxlimited.py new file mode 100644 index 00000000000000..e3f521d9b040dc --- /dev/null +++ b/Lib/test/test_xxlimited.py @@ -0,0 +1,79 @@ +import unittest +from test.support import import_helper +import types + +xxlimited = import_helper.import_module('xxlimited') +xxlimited_35 = import_helper.import_module('xxlimited_35') + + +class CommonTests: + module: types.ModuleType + + def test_xxo_new(self): + xxo = self.module.Xxo() + + def test_xxo_attributes(self): + xxo = self.module.Xxo() + with self.assertRaises(AttributeError): + xxo.foo + with self.assertRaises(AttributeError): + del xxo.foo + + xxo.foo = 1234 + self.assertEqual(xxo.foo, 1234) + + del xxo.foo + with self.assertRaises(AttributeError): + xxo.foo + + def test_foo(self): + # the foo function adds 2 numbers + self.assertEqual(self.module.foo(1, 2), 3) + + def test_str(self): + self.assertTrue(issubclass(self.module.Str, str)) + self.assertIsNot(self.module.Str, str) + + custom_string = self.module.Str("abcd") + self.assertEqual(custom_string, "abcd") + self.assertEqual(custom_string.upper(), "ABCD") + + def test_new(self): + xxo = self.module.new() + self.assertEqual(xxo.demo("abc"), "abc") + + +class TestXXLimited(CommonTests, unittest.TestCase): + module = xxlimited + + def test_xxo_demo(self): + xxo = self.module.Xxo() + other = self.module.Xxo() + self.assertEqual(xxo.demo("abc"), "abc") + self.assertEqual(xxo.demo(xxo), xxo) + self.assertEqual(xxo.demo(other), other) + self.assertEqual(xxo.demo(0), None) + + def test_error(self): + with self.assertRaises(self.module.Error): + raise self.module.Error + + +class TestXXLimited35(CommonTests, unittest.TestCase): + module = xxlimited_35 + + def test_xxo_demo(self): + xxo = self.module.Xxo() + other = self.module.Xxo() + self.assertEqual(xxo.demo("abc"), "abc") + self.assertEqual(xxo.demo(0), None) + + def test_roj(self): + # the roj function always fails + with self.assertRaises(SystemError): + self.module.roj(0) + + def test_null(self): + null1 = self.module.Null() + null2 = self.module.Null() + self.assertNotEqual(null1, null2) diff --git a/Misc/NEWS.d/next/C API/2020-10-21-18-43-06.bpo-42111.9pvtrc.rst b/Misc/NEWS.d/next/C API/2020-10-21-18-43-06.bpo-42111.9pvtrc.rst new file mode 100644 index 00000000000000..3fb718cc45d42c --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-10-21-18-43-06.bpo-42111.9pvtrc.rst @@ -0,0 +1,2 @@ +Update the ``xxlimited`` module to be a better example of how to use the +limited C API. diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c index 5b05a9454a05da..883c8a9b5e1833 100644 --- a/Modules/xxlimited.c +++ b/Modules/xxlimited.c @@ -3,47 +3,103 @@ also declares object types. All occurrences of 'Xxo' should be changed to something reasonable for your objects. After that, all other occurrences of 'xx' should be changed to something reasonable for your - module. If your module is named foo your sourcefile should be named - foomodule.c. + module. If your module is named foo your source file should be named + foo.c or foomodule.c. You will probably want to delete all references to 'x_attr' and add your own types of attributes instead. Maybe you want to name your local variables other than 'self'. If your object type is needed in other files, you'll have to create a file "foobarobject.h"; see - floatobject.h for an example. */ + floatobject.h for an example. -/* Xxo objects */ + This module roughly corresponds to:: + + class Xxo: + """A class that explicitly stores attributes in an internal dict""" + + def __init__(self): + # In the C class, "_x_attr" is not accessible from Python code + self._x_attr = {} + + def __getattr__(self, name): + return self._x_attr[name] + + def __setattr__(self, name, value): + self._x_attr[name] = value + + def __delattr__(self, name): + del self._x_attr[name] + + def demo(o, /): + if isinstance(o, str): + return o + elif isinstance(o, Xxo): + return o + else: + raise Error('argument must be str or Xxo') + + class Error(Exception): + """Exception raised by the xxlimited module""" + + def foo(i: int, j: int, /): + """Return the sum of i and j.""" + # Unlike this pseudocode, the C function will *only* work with + # integers and perform C long int arithmetic + return i + j + + def new(): + return Xxo() + + def Str(str): + # A trivial subclass of a built-in type + pass + */ #include "Python.h" -static PyObject *ErrorObject; +// Module state +typedef struct { + PyObject *Xxo_Type; // Xxo class + PyObject *Error_Type; // Error class +} xx_state; + + +/* Xxo objects */ +// Instance state typedef struct { PyObject_HEAD PyObject *x_attr; /* Attributes dictionary */ } XxoObject; -static PyObject *Xxo_Type; - -#define XxoObject_Check(v) Py_IS_TYPE(v, Xxo_Type) +// XXX: no good way to do this yet +// #define XxoObject_Check(v) Py_IS_TYPE(v, Xxo_Type) static XxoObject * -newXxoObject(PyObject *arg) +newXxoObject(PyObject *module) { + xx_state *state = PyModule_GetState(module); + if (state == NULL) { + return NULL; + } XxoObject *self; - self = PyObject_GC_New(XxoObject, (PyTypeObject*)Xxo_Type); - if (self == NULL) + self = PyObject_GC_New(XxoObject, (PyTypeObject*)state->Xxo_Type); + if (self == NULL) { return NULL; + } self->x_attr = NULL; return self; } -/* Xxo methods */ +/* Xxo finalization */ static int Xxo_traverse(XxoObject *self, visitproc visit, void *arg) { + // Visit the type Py_VISIT(Py_TYPE(self)); + + // Visit the attribute dict Py_VISIT(self->x_attr); return 0; } @@ -54,26 +110,18 @@ Xxo_finalize(XxoObject *self) Py_CLEAR(self->x_attr); } -static PyObject * -Xxo_demo(XxoObject *self, PyObject *args) +static void +Xxo_dealloc(XxoObject *self) { - PyObject *o = NULL; - if (!PyArg_ParseTuple(args, "|O:demo", &o)) - return NULL; - /* Test availability of fast type checks */ - if (o != NULL && PyUnicode_Check(o)) { - Py_INCREF(o); - return o; - } - Py_INCREF(Py_None); - return Py_None; + Xxo_finalize(self); + PyTypeObject *tp = Py_TYPE(self); + freefunc free = PyType_GetSlot(tp, Py_tp_free); + free(self); + Py_DECREF(tp); } -static PyMethodDef Xxo_methods[] = { - {"demo", (PyCFunction)Xxo_demo, METH_VARARGS, - PyDoc_STR("demo() -> None")}, - {NULL, NULL} /* sentinel */ -}; + +/* Xxo attribute handling */ static PyObject * Xxo_getattro(XxoObject *self, PyObject *name) @@ -92,45 +140,109 @@ Xxo_getattro(XxoObject *self, PyObject *name) } static int -Xxo_setattr(XxoObject *self, const char *name, PyObject *v) +Xxo_setattro(XxoObject *self, PyObject *name, PyObject *v) { if (self->x_attr == NULL) { + // prepare the attribute dict self->x_attr = PyDict_New(); - if (self->x_attr == NULL) + if (self->x_attr == NULL) { return -1; + } } if (v == NULL) { - int rv = PyDict_DelItemString(self->x_attr, name); - if (rv < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) + // delete an attribute + int rv = PyDict_DelItem(self->x_attr, name); + if (rv < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) { PyErr_SetString(PyExc_AttributeError, "delete non-existing Xxo attribute"); + return -1; + } return rv; } - else - return PyDict_SetItemString(self->x_attr, name, v); + else { + // set an attribute + return PyDict_SetItem(self->x_attr, name, v); + } +} + +/* Xxo methods */ + +static PyObject * +Xxo_demo(XxoObject *self, PyTypeObject *defining_class, + PyObject **args, Py_ssize_t nargs, PyObject *kwnames) +{ + if (kwnames != NULL && PyObject_Length(kwnames)) { + PyErr_SetString(PyExc_TypeError, "demo() takes no keyword arguments"); + return NULL; + } + if (nargs != 1) { + PyErr_SetString(PyExc_TypeError, "demo() takes exactly 1 argument"); + return NULL; + } + + PyObject *o = args[0]; + + /* Test if the argument is "str" */ + if (PyUnicode_Check(o)) { + Py_INCREF(o); + return o; + } + + /* test if the argument is of the Xxo class */ + if (PyObject_TypeCheck(o, defining_class)) { + Py_INCREF(o); + return o; + } + + Py_INCREF(Py_None); + return Py_None; } +static PyMethodDef Xxo_methods[] = { + {"demo", (PyCFunction)(void(*)(void))Xxo_demo, + METH_METHOD | METH_FASTCALL | METH_KEYWORDS, PyDoc_STR("demo(o) -> o")}, + {NULL, NULL} /* sentinel */ +}; + +/* Xxo type definition */ + +PyDoc_STRVAR(Xxo_doc, + "A class that explicitly stores attributes in an internal dict"); + static PyType_Slot Xxo_Type_slots[] = { - {Py_tp_doc, "The Xxo type"}, + {Py_tp_doc, (char *)Xxo_doc}, {Py_tp_traverse, Xxo_traverse}, {Py_tp_finalize, Xxo_finalize}, + {Py_tp_dealloc, Xxo_dealloc}, {Py_tp_getattro, Xxo_getattro}, - {Py_tp_setattr, Xxo_setattr}, + {Py_tp_setattro, Xxo_setattro}, {Py_tp_methods, Xxo_methods}, - {0, 0}, + {0, 0}, /* sentinel */ }; static PyType_Spec Xxo_Type_spec = { - "xxlimited.Xxo", - sizeof(XxoObject), - 0, - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, - Xxo_Type_slots + .name = "xxlimited.Xxo", + .basicsize = sizeof(XxoObject), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .slots = Xxo_Type_slots, }; -/* --------------------------------------------------------------------- */ -/* Function of two integers returning integer */ +/* Str type definition*/ + +static PyType_Slot Str_Type_slots[] = { + {0, 0}, /* sentinel */ +}; + +static PyType_Spec Str_Type_spec = { + .name = "xxlimited.Str", + .basicsize = 0, + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .slots = Str_Type_slots, +}; + + +/* Function of two integers returning integer (with C "long int" arithmetic) */ PyDoc_STRVAR(xx_foo_doc, "foo(i,j)\n\ @@ -138,7 +250,7 @@ PyDoc_STRVAR(xx_foo_doc, Return the sum of i and j."); static PyObject * -xx_foo(PyObject *self, PyObject *args) +xx_foo(PyObject *module, PyObject *args) { long i, j; long res; @@ -152,153 +264,110 @@ xx_foo(PyObject *self, PyObject *args) /* Function of no arguments returning new Xxo object */ static PyObject * -xx_new(PyObject *self, PyObject *args) +xx_new(PyObject *module, PyObject *Py_UNUSED(unused)) { XxoObject *rv; - if (!PyArg_ParseTuple(args, ":new")) - return NULL; - rv = newXxoObject(args); + rv = newXxoObject(module); if (rv == NULL) return NULL; return (PyObject *)rv; } -/* Test bad format character */ - -static PyObject * -xx_roj(PyObject *self, PyObject *args) -{ - PyObject *a; - long b; - if (!PyArg_ParseTuple(args, "O#:roj", &a, &b)) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - - -/* ---------- */ - -static PyType_Slot Str_Type_slots[] = { - {Py_tp_base, NULL}, /* filled out in module init function */ - {0, 0}, -}; - -static PyType_Spec Str_Type_spec = { - "xxlimited.Str", - 0, - 0, - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - Str_Type_slots -}; - -/* ---------- */ - -static PyObject * -null_richcompare(PyObject *self, PyObject *other, int op) -{ - Py_RETURN_NOTIMPLEMENTED; -} - -static PyType_Slot Null_Type_slots[] = { - {Py_tp_base, NULL}, /* filled out in module init */ - {Py_tp_new, NULL}, - {Py_tp_richcompare, null_richcompare}, - {0, 0} -}; - -static PyType_Spec Null_Type_spec = { - "xxlimited.Null", - 0, /* basicsize */ - 0, /* itemsize */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - Null_Type_slots -}; -/* ---------- */ /* List of functions defined in the module */ static PyMethodDef xx_methods[] = { - {"roj", xx_roj, METH_VARARGS, - PyDoc_STR("roj(a,b) -> None")}, {"foo", xx_foo, METH_VARARGS, xx_foo_doc}, - {"new", xx_new, METH_VARARGS, + {"new", xx_new, METH_NOARGS, PyDoc_STR("new() -> new Xx object")}, {NULL, NULL} /* sentinel */ }; + +/* The module itself */ + PyDoc_STRVAR(module_doc, "This is a template module just for instruction."); static int xx_modexec(PyObject *m) { - PyObject *o; - - /* Due to cross platform compiler issues the slots must be filled - * here. It's required for portability to Windows without requiring - * C++. */ - Null_Type_slots[0].pfunc = &PyBaseObject_Type; - Null_Type_slots[1].pfunc = PyType_GenericNew; - Str_Type_slots[0].pfunc = &PyUnicode_Type; - - Xxo_Type = PyType_FromSpec(&Xxo_Type_spec); - if (Xxo_Type == NULL) - goto fail; - - /* Add some symbolic constants to the module */ - if (ErrorObject == NULL) { - ErrorObject = PyErr_NewException("xxlimited.error", NULL, NULL); - if (ErrorObject == NULL) - goto fail; + xx_state *state = PyModule_GetState(m); + + state->Error_Type = PyErr_NewException("xxlimited.Error", NULL, NULL); + if (state->Error_Type == NULL) { + return -1; + } + if (PyModule_AddType(m, (PyTypeObject*)state->Error_Type) < 0) { + return -1; + } + + state->Xxo_Type = PyType_FromModuleAndSpec(m, &Xxo_Type_spec, NULL); + if (state->Xxo_Type == NULL) { + return -1; + } + if (PyModule_AddType(m, (PyTypeObject*)state->Xxo_Type) < 0) { + return -1; + } + + // Add the Str type. It is not needed from C code, so it is only + // added to the module dict. + // It does not inherit from "object" (PyObject_Type), but from "str" + // (PyUnincode_Type). + PyObject *Str_Type = PyType_FromModuleAndSpec( + m, &Str_Type_spec, (PyObject *)&PyUnicode_Type); + if (Str_Type == NULL) { + return -1; + } + if (PyModule_AddType(m, (PyTypeObject*)Str_Type) < 0) { + return -1; } - Py_INCREF(ErrorObject); - PyModule_AddObject(m, "error", ErrorObject); - - /* Add Xxo */ - o = PyType_FromSpec(&Xxo_Type_spec); - if (o == NULL) - goto fail; - PyModule_AddObject(m, "Xxo", o); - - /* Add Str */ - o = PyType_FromSpec(&Str_Type_spec); - if (o == NULL) - goto fail; - PyModule_AddObject(m, "Str", o); - - /* Add Null */ - o = PyType_FromSpec(&Null_Type_spec); - if (o == NULL) - goto fail; - PyModule_AddObject(m, "Null", o); + Py_DECREF(Str_Type); + return 0; - fail: - Py_XDECREF(m); - return -1; } - static PyModuleDef_Slot xx_slots[] = { {Py_mod_exec, xx_modexec}, {0, NULL} }; +static int +xx_traverse(PyObject *module, visitproc visit, void *arg) +{ + xx_state *state = PyModule_GetState(module); + Py_VISIT(state->Xxo_Type); + Py_VISIT(state->Error_Type); + return 0; +} + +static int +xx_clear(PyObject *module) +{ + xx_state *state = PyModule_GetState(module); + Py_CLEAR(state->Xxo_Type); + Py_CLEAR(state->Error_Type); + return 0; +} + static struct PyModuleDef xxmodule = { PyModuleDef_HEAD_INIT, - "xxlimited", - module_doc, - 0, - xx_methods, - xx_slots, - NULL, - NULL, - NULL + .m_name = "xxlimited", + .m_doc = module_doc, + .m_size = sizeof(xx_state), + .m_methods = xx_methods, + .m_slots = xx_slots, + .m_traverse = xx_traverse, + .m_clear = xx_clear, + /* m_free is not necessary here: xx_clear clears all references, + * and the module state is deallocated along with the module. + */ }; + /* Export function for the module (*must* be called PyInit_xx) */ PyMODINIT_FUNC diff --git a/Modules/xxlimited_35.c b/Modules/xxlimited_35.c new file mode 100644 index 00000000000000..ce96e8c90efd47 --- /dev/null +++ b/Modules/xxlimited_35.c @@ -0,0 +1,301 @@ + +/* This module is compiled using limited API from Python 3.5, + * making sure that it works as expected. + * + * See the xxlimited module for an extension module template. + */ + +/* Xxo objects */ + +#include "Python.h" + +static PyObject *ErrorObject; + +typedef struct { + PyObject_HEAD + PyObject *x_attr; /* Attributes dictionary */ +} XxoObject; + +static PyObject *Xxo_Type; + +#define XxoObject_Check(v) Py_IS_TYPE(v, Xxo_Type) + +static XxoObject * +newXxoObject(PyObject *arg) +{ + XxoObject *self; + self = PyObject_GC_New(XxoObject, (PyTypeObject*)Xxo_Type); + if (self == NULL) + return NULL; + self->x_attr = NULL; + return self; +} + +/* Xxo methods */ + +static int +Xxo_traverse(XxoObject *self, visitproc visit, void *arg) +{ + Py_VISIT(Py_TYPE(self)); + Py_VISIT(self->x_attr); + return 0; +} + +static void +Xxo_finalize(XxoObject *self) +{ + Py_CLEAR(self->x_attr); +} + +static PyObject * +Xxo_demo(XxoObject *self, PyObject *args) +{ + PyObject *o = NULL; + if (!PyArg_ParseTuple(args, "|O:demo", &o)) + return NULL; + /* Test availability of fast type checks */ + if (o != NULL && PyUnicode_Check(o)) { + Py_INCREF(o); + return o; + } + Py_INCREF(Py_None); + return Py_None; +} + +static PyMethodDef Xxo_methods[] = { + {"demo", (PyCFunction)Xxo_demo, METH_VARARGS, + PyDoc_STR("demo() -> None")}, + {NULL, NULL} /* sentinel */ +}; + +static PyObject * +Xxo_getattro(XxoObject *self, PyObject *name) +{ + if (self->x_attr != NULL) { + PyObject *v = PyDict_GetItemWithError(self->x_attr, name); + if (v != NULL) { + Py_INCREF(v); + return v; + } + else if (PyErr_Occurred()) { + return NULL; + } + } + return PyObject_GenericGetAttr((PyObject *)self, name); +} + +static int +Xxo_setattr(XxoObject *self, const char *name, PyObject *v) +{ + if (self->x_attr == NULL) { + self->x_attr = PyDict_New(); + if (self->x_attr == NULL) + return -1; + } + if (v == NULL) { + int rv = PyDict_DelItemString(self->x_attr, name); + if (rv < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) + PyErr_SetString(PyExc_AttributeError, + "delete non-existing Xxo attribute"); + return rv; + } + else + return PyDict_SetItemString(self->x_attr, name, v); +} + +static PyType_Slot Xxo_Type_slots[] = { + {Py_tp_doc, "The Xxo type"}, + {Py_tp_traverse, Xxo_traverse}, + {Py_tp_finalize, Xxo_finalize}, + {Py_tp_getattro, Xxo_getattro}, + {Py_tp_setattr, Xxo_setattr}, + {Py_tp_methods, Xxo_methods}, + {0, 0}, +}; + +static PyType_Spec Xxo_Type_spec = { + "xxlimited.Xxo", + sizeof(XxoObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + Xxo_Type_slots +}; + +/* --------------------------------------------------------------------- */ + +/* Function of two integers returning integer */ + +PyDoc_STRVAR(xx_foo_doc, +"foo(i,j)\n\ +\n\ +Return the sum of i and j."); + +static PyObject * +xx_foo(PyObject *self, PyObject *args) +{ + long i, j; + long res; + if (!PyArg_ParseTuple(args, "ll:foo", &i, &j)) + return NULL; + res = i+j; /* XXX Do something here */ + return PyLong_FromLong(res); +} + + +/* Function of no arguments returning new Xxo object */ + +static PyObject * +xx_new(PyObject *self, PyObject *args) +{ + XxoObject *rv; + + if (!PyArg_ParseTuple(args, ":new")) + return NULL; + rv = newXxoObject(args); + if (rv == NULL) + return NULL; + return (PyObject *)rv; +} + +/* Test bad format character */ + +static PyObject * +xx_roj(PyObject *self, PyObject *args) +{ + PyObject *a; + long b; + if (!PyArg_ParseTuple(args, "O#:roj", &a, &b)) + return NULL; + Py_INCREF(Py_None); + return Py_None; +} + + +/* ---------- */ + +static PyType_Slot Str_Type_slots[] = { + {Py_tp_base, NULL}, /* filled out in module init function */ + {0, 0}, +}; + +static PyType_Spec Str_Type_spec = { + "xxlimited.Str", + 0, + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + Str_Type_slots +}; + +/* ---------- */ + +static PyObject * +null_richcompare(PyObject *self, PyObject *other, int op) +{ + Py_RETURN_NOTIMPLEMENTED; +} + +static PyType_Slot Null_Type_slots[] = { + {Py_tp_base, NULL}, /* filled out in module init */ + {Py_tp_new, NULL}, + {Py_tp_richcompare, null_richcompare}, + {0, 0} +}; + +static PyType_Spec Null_Type_spec = { + "xxlimited.Null", + 0, /* basicsize */ + 0, /* itemsize */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + Null_Type_slots +}; + +/* ---------- */ + +/* List of functions defined in the module */ + +static PyMethodDef xx_methods[] = { + {"roj", xx_roj, METH_VARARGS, + PyDoc_STR("roj(a,b) -> None")}, + {"foo", xx_foo, METH_VARARGS, + xx_foo_doc}, + {"new", xx_new, METH_VARARGS, + PyDoc_STR("new() -> new Xx object")}, + {NULL, NULL} /* sentinel */ +}; + +PyDoc_STRVAR(module_doc, +"This is a module for testing limited API from Python 3.5."); + +static int +xx_modexec(PyObject *m) +{ + PyObject *o; + + /* Due to cross platform compiler issues the slots must be filled + * here. It's required for portability to Windows without requiring + * C++. */ + Null_Type_slots[0].pfunc = &PyBaseObject_Type; + Null_Type_slots[1].pfunc = PyType_GenericNew; + Str_Type_slots[0].pfunc = &PyUnicode_Type; + + Xxo_Type = PyType_FromSpec(&Xxo_Type_spec); + if (Xxo_Type == NULL) + goto fail; + + /* Add some symbolic constants to the module */ + if (ErrorObject == NULL) { + ErrorObject = PyErr_NewException("xxlimited.error", NULL, NULL); + if (ErrorObject == NULL) + goto fail; + } + Py_INCREF(ErrorObject); + PyModule_AddObject(m, "error", ErrorObject); + + /* Add Xxo */ + o = PyType_FromSpec(&Xxo_Type_spec); + if (o == NULL) + goto fail; + PyModule_AddObject(m, "Xxo", o); + + /* Add Str */ + o = PyType_FromSpec(&Str_Type_spec); + if (o == NULL) + goto fail; + PyModule_AddObject(m, "Str", o); + + /* Add Null */ + o = PyType_FromSpec(&Null_Type_spec); + if (o == NULL) + goto fail; + PyModule_AddObject(m, "Null", o); + return 0; + fail: + Py_XDECREF(m); + return -1; +} + + +static PyModuleDef_Slot xx_slots[] = { + {Py_mod_exec, xx_modexec}, + {0, NULL} +}; + +static struct PyModuleDef xxmodule = { + PyModuleDef_HEAD_INIT, + "xxlimited_35", + module_doc, + 0, + xx_methods, + xx_slots, + NULL, + NULL, + NULL +}; + +/* Export function for the module (*must* be called PyInit_xx) */ + +PyMODINIT_FUNC +PyInit_xxlimited_35(void) +{ + return PyModuleDef_Init(&xxmodule); +} diff --git a/PC/layout/main.py b/PC/layout/main.py index 3eef7556299cf2..8c69c91542d246 100644 --- a/PC/layout/main.py +++ b/PC/layout/main.py @@ -36,7 +36,7 @@ BDIST_WININST_FILES_ONLY = FileNameSet("wininst-*", "bdist_wininst.py") BDIST_WININST_STUB = "PC/layout/support/distutils.command.bdist_wininst.py" -TEST_PYDS_ONLY = FileStemSet("xxlimited", "_ctypes_test", "_test*") +TEST_PYDS_ONLY = FileStemSet("xxlimited", "xxlimited_35", "_ctypes_test", "_test*") TEST_DIRS_ONLY = FileNameSet("test", "tests") IDLE_DIRS_ONLY = FileNameSet("idlelib") diff --git a/PCbuild/pcbuild.proj b/PCbuild/pcbuild.proj index 4d416c589e4c47..8e7088d47d2aed 100644 --- a/PCbuild/pcbuild.proj +++ b/PCbuild/pcbuild.proj @@ -66,6 +66,7 @@ + false diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 73833d54637d5f..4335c9f71d0d26 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -125,6 +125,9 @@ python3dll xxlimited builds an example module that makes use of the PEP 384 Stable ABI, see Modules\xxlimited.c +xxlimited_35 + ditto for testing the Python 3.5 stable ABI, see + Modules\xxlimited_35.c The following sub-projects are for individual modules of the standard library which are implemented in C; each one builds a DLL (renamed to diff --git a/PCbuild/xxlimited.vcxproj b/PCbuild/xxlimited.vcxproj index 776335a15cb0c4..ece169127a2860 100644 --- a/PCbuild/xxlimited.vcxproj +++ b/PCbuild/xxlimited.vcxproj @@ -94,7 +94,7 @@ - %(PreprocessorDefinitions);Py_LIMITED_API=0x03060000 + %(PreprocessorDefinitions);Py_LIMITED_API=0x03100000 wsock32.lib;%(AdditionalDependencies) @@ -111,4 +111,4 @@ - \ No newline at end of file + diff --git a/PCbuild/xxlimited_35.vcxproj b/PCbuild/xxlimited_35.vcxproj new file mode 100644 index 00000000000000..7e49eadf9037da --- /dev/null +++ b/PCbuild/xxlimited_35.vcxproj @@ -0,0 +1,114 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + PGInstrument + ARM + + + PGInstrument + ARM64 + + + PGInstrument + Win32 + + + PGInstrument + x64 + + + PGUpdate + ARM + + + PGUpdate + ARM64 + + + PGUpdate + Win32 + + + PGUpdate + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {fb868ea7-f93a-4d9b-be78-ca4e9ba14fff} + xxlimited_35 + Win32Proj + + + + + DynamicLibrary + NotSet + false + + + + .pyd + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + + + + %(PreprocessorDefinitions);Py_LIMITED_API=0x03060000 + + + wsock32.lib;%(AdditionalDependencies) + + + + + + + + {885d4898-d08d-4091-9c40-c700cfe3fc5a} + + + + + + diff --git a/PCbuild/xxlimited_35.vcxproj.filters b/PCbuild/xxlimited_35.vcxproj.filters new file mode 100644 index 00000000000000..35bfb05c239c35 --- /dev/null +++ b/PCbuild/xxlimited_35.vcxproj.filters @@ -0,0 +1,13 @@ + + + + + {5be27194-6530-452d-8d86-3767b991fa83} + + + + + Source Files + + + diff --git a/setup.py b/setup.py index 90588e8b1d1fca..ca5a04d2ae0d7f 100644 --- a/setup.py +++ b/setup.py @@ -1803,8 +1803,16 @@ def detect_modules(self): ## self.add(Extension('xx', ['xxmodule.c'])) if 'd' not in sysconfig.get_config_var('ABIFLAGS'): + # Non-debug mode: Build xxlimited with limited API self.add(Extension('xxlimited', ['xxlimited.c'], + define_macros=[('Py_LIMITED_API', '0x03100000')])) + self.add(Extension('xxlimited_35', ['xxlimited_35.c'], define_macros=[('Py_LIMITED_API', '0x03050000')])) + else: + # Debug mode: Build xxlimited with the full API + # (which is compatible with the limited one) + self.add(Extension('xxlimited', ['xxlimited.c'])) + self.add(Extension('xxlimited_35', ['xxlimited_35.c'])) def detect_tkinter_explicitly(self): # Build _tkinter using explicit locations for Tcl/Tk. From e6219b89090a7984896907b26c05c96e1703482b Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Tue, 8 Dec 2020 11:14:10 -0800 Subject: [PATCH 0745/1261] bpo-41907: [Enum] fix format() behavior for IntFlag (GH-22497) --- Lib/enum.py | 2 +- Lib/test/test_enum.py | 14 ++++++++++++++ .../2020-10-02-10-19-49.bpo-41907.wiIEsz.rst | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst diff --git a/Lib/enum.py b/Lib/enum.py index d670ad7d86196f..484db2cd7d2466 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -658,7 +658,7 @@ def __format__(self, format_spec): # the value # pure Enum branch, or branch with __str__ explicitly overridden - str_overridden = type(self).__str__ != Enum.__str__ + str_overridden = type(self).__str__ not in (Enum.__str__, Flag.__str__) if self._member_type_ is object or str_overridden: cls = str val = str(self) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index d1dd2e78d455f0..f2171b53946b99 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -585,12 +585,15 @@ def hello(self): class Test1Enum(MyMethodEnum, int, MyStrEnum): One = 1 Two = 2 + self.assertTrue(Test1Enum._member_type_ is int) self.assertEqual(str(Test1Enum.One), 'MyStr') + self.assertEqual(format(Test1Enum.One, ''), 'MyStr') # class Test2Enum(MyStrEnum, MyMethodEnum): One = 1 Two = 2 self.assertEqual(str(Test2Enum.One), 'MyStr') + self.assertEqual(format(Test1Enum.One, ''), 'MyStr') def test_inherited_data_type(self): class HexInt(int): @@ -2251,6 +2254,11 @@ def test_repr(self): self.assertEqual(repr(~(Open.RO | Open.CE)), '') self.assertEqual(repr(~(Open.WO | Open.CE)), '') + def test_format(self): + Perm = self.Perm + self.assertEqual(format(Perm.R, ''), 'Perm.R') + self.assertEqual(format(Perm.R | Perm.X, ''), 'Perm.R|X') + def test_or(self): Perm = self.Perm for i in Perm: @@ -2590,6 +2598,7 @@ class Color(IntFlag): def test_type(self): Perm = self.Perm + self.assertTrue(Perm._member_type_ is int) Open = self.Open for f in Perm: self.assertTrue(isinstance(f, Perm)) @@ -2669,6 +2678,11 @@ def test_repr(self): self.assertEqual(repr(~(Open.WO | Open.CE)), '') self.assertEqual(repr(Open(~4)), '') + def test_format(self): + Perm = self.Perm + self.assertEqual(format(Perm.R, ''), '4') + self.assertEqual(format(Perm.R | Perm.X, ''), '5') + def test_or(self): Perm = self.Perm for i in Perm: diff --git a/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst b/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst new file mode 100644 index 00000000000000..aa337b38046e61 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst @@ -0,0 +1 @@ +fix `format()` behavior for `IntFlag` From b2ade639ffb144ace2185a5839d3c1f4eb0adc86 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Tue, 8 Dec 2020 12:26:56 -0800 Subject: [PATCH 0746/1261] [Enum] reformat and add doc strings (GH-23705) --- Lib/enum.py | 187 ++++++++++++++++++++++++++++++------------ Lib/test/test_enum.py | 2 +- 2 files changed, 135 insertions(+), 54 deletions(-) diff --git a/Lib/enum.py b/Lib/enum.py index 484db2cd7d2466..f6c7e8b2334139 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -10,31 +10,41 @@ def _is_descriptor(obj): - """Returns True if obj is a descriptor, False otherwise.""" + """ + Returns True if obj is a descriptor, False otherwise. + """ return ( hasattr(obj, '__get__') or hasattr(obj, '__set__') or - hasattr(obj, '__delete__')) - + hasattr(obj, '__delete__') + ) def _is_dunder(name): - """Returns True if a __dunder__ name, False otherwise.""" - return (len(name) > 4 and + """ + Returns True if a __dunder__ name, False otherwise. + """ + return ( + len(name) > 4 and name[:2] == name[-2:] == '__' and name[2] != '_' and - name[-3] != '_') - + name[-3] != '_' + ) def _is_sunder(name): - """Returns True if a _sunder_ name, False otherwise.""" - return (len(name) > 2 and + """ + Returns True if a _sunder_ name, False otherwise. + """ + return ( + len(name) > 2 and name[0] == name[-1] == '_' and name[1:2] != '_' and - name[-2:-1] != '_') - + name[-2:-1] != '_' + ) def _make_class_unpicklable(cls): - """Make the given class un-picklable.""" + """ + Make the given class un-picklable. + """ def _break_on_call_reduce(self, proto): raise TypeError('%r cannot be pickled' % self) cls.__reduce_ex__ = _break_on_call_reduce @@ -49,11 +59,11 @@ class auto: class _EnumDict(dict): - """Track enum member order and ensure member names are not reused. + """ + Track enum member order and ensure member names are not reused. EnumMeta will use the names found in self._member_names as the enumeration member names. - """ def __init__(self): super().__init__() @@ -63,21 +73,23 @@ def __init__(self): self._auto_called = False def __setitem__(self, key, value): - """Changes anything not dundered or not a descriptor. + """ + Changes anything not dundered or not a descriptor. If an enum member name is used twice, an error is raised; duplicate values are not checked for. Single underscore (sunder) names are reserved. - """ if _is_sunder(key): if key not in ( '_order_', '_create_pseudo_member_', '_generate_next_value_', '_missing_', '_ignore_', ): - raise ValueError(f'_sunder_ names, such as "{key}", are ' - 'reserved for future Enum use') + raise ValueError( + '_sunder_ names, such as %r, are reserved for future Enum use' + % (key, ) + ) if key == '_generate_next_value_': # check if members already defined as auto() if self._auto_called: @@ -91,7 +103,10 @@ def __setitem__(self, key, value): self._ignore = value already = set(value) & set(self._member_names) if already: - raise ValueError('_ignore_ cannot specify already set names: %r' % (already, )) + raise ValueError( + '_ignore_ cannot specify already set names: %r' + % (already, ) + ) elif _is_dunder(key): if key == '__order__': key = '_order_' @@ -106,7 +121,12 @@ def __setitem__(self, key, value): raise TypeError('%r already defined as: %r' % (key, self[key])) if isinstance(value, auto): if value.value == _auto_null: - value.value = self._generate_next_value(key, 1, len(self._member_names), self._last_values[:]) + value.value = self._generate_next_value( + key, + 1, + len(self._member_names), + self._last_values[:], + ) self._auto_called = True value = value.value self._member_names.append(key) @@ -119,9 +139,10 @@ def __setitem__(self, key, value): # This is also why there are checks in EnumMeta like `if Enum is not None` Enum = None - class EnumMeta(type): - """Metaclass for Enum""" + """ + Metaclass for Enum + """ @classmethod def __prepare__(metacls, cls, bases): # check that previous enum members do not exist @@ -131,7 +152,9 @@ def __prepare__(metacls, cls, bases): # inherit previous flags and _generate_next_value_ function member_type, first_enum = metacls._get_mixins_(cls, bases) if first_enum is not None: - enum_dict['_generate_next_value_'] = getattr(first_enum, '_generate_next_value_', None) + enum_dict['_generate_next_value_'] = getattr( + first_enum, '_generate_next_value_', None, + ) return enum_dict def __new__(metacls, cls, bases, classdict): @@ -177,9 +200,11 @@ def __new__(metacls, cls, bases, classdict): # save DynamicClassAttribute attributes from super classes so we know # if we can take the shortcut of storing members in the class dict - dynamic_attributes = {k for c in enum_class.mro() - for k, v in c.__dict__.items() - if isinstance(v, DynamicClassAttribute)} + dynamic_attributes = { + k for c in enum_class.mro() + for k, v in c.__dict__.items() + if isinstance(v, DynamicClassAttribute) + } # Reverse value->name map for hashable values. enum_class._value2member_map_ = {} @@ -289,7 +314,8 @@ def __bool__(self): return True def __call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1): - """Either returns an existing member, or creates a new enum class. + """ + Either returns an existing member, or creates a new enum class. This method is used both when an enum class is given a value to match to an enumeration member (i.e. Color(3)) and for the functional API @@ -311,12 +337,18 @@ def __call__(cls, value, names=None, *, module=None, qualname=None, type=None, s not correct, unpickling will fail in some circumstances. `type`, if set, will be mixed in as the first base class. - """ if names is None: # simple value lookup return cls.__new__(cls, value) # otherwise, functional API: we're creating a new Enum type - return cls._create_(value, names, module=module, qualname=qualname, type=type, start=start) + return cls._create_( + value, + names, + module=module, + qualname=qualname, + type=type, + start=start, + ) def __contains__(cls, member): if not isinstance(member, Enum): @@ -329,22 +361,23 @@ def __delattr__(cls, attr): # nicer error message when someone tries to delete an attribute # (see issue19025). if attr in cls._member_map_: - raise AttributeError( - "%s: cannot delete Enum member." % cls.__name__) + raise AttributeError("%s: cannot delete Enum member %r." % (cls.__name__, attr)) super().__delattr__(attr) def __dir__(self): - return (['__class__', '__doc__', '__members__', '__module__'] + - self._member_names_) + return ( + ['__class__', '__doc__', '__members__', '__module__'] + + self._member_names_ + ) def __getattr__(cls, name): - """Return the enum member matching `name` + """ + Return the enum member matching `name` We use __getattr__ instead of descriptors or inserting into the enum class' __dict__ in order to support `name` and `value` being both properties for enum members (which live in the class' __dict__) and enum members themselves. - """ if _is_dunder(name): raise AttributeError(name) @@ -357,6 +390,9 @@ def __getitem__(cls, name): return cls._member_map_[name] def __iter__(cls): + """ + Returns members in definition order. + """ return (cls._member_map_[name] for name in cls._member_names_) def __len__(cls): @@ -364,11 +400,11 @@ def __len__(cls): @property def __members__(cls): - """Returns a mapping of member name->value. + """ + Returns a mapping of member name->value. This mapping lists all enum members, including aliases. Note that this is a read-only view of the internal mapping. - """ return MappingProxyType(cls._member_map_) @@ -376,15 +412,18 @@ def __repr__(cls): return "" % cls.__name__ def __reversed__(cls): + """ + Returns members in reverse definition order. + """ return (cls._member_map_[name] for name in reversed(cls._member_names_)) def __setattr__(cls, name, value): - """Block attempts to reassign Enum members. + """ + Block attempts to reassign Enum members. A simple assignment to the class namespace only changes one of the several possible ways to get an Enum member from the Enum class, resulting in an inconsistent Enumeration. - """ member_map = cls.__dict__.get('_member_map_', {}) if name in member_map: @@ -392,7 +431,8 @@ def __setattr__(cls, name, value): super().__setattr__(name, value) def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, start=1): - """Convenience method to create a new Enum class. + """ + Convenience method to create a new Enum class. `names` can be: @@ -401,7 +441,6 @@ def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, s * An iterable of member names. Values are incremented by 1 from `start`. * An iterable of (member name, value) pairs. * A mapping of member name -> value pairs. - """ metacls = cls.__class__ bases = (cls, ) if type is None else (type, cls) @@ -482,15 +521,18 @@ def _check_for_existing_members(class_name, bases): for chain in bases: for base in chain.__mro__: if issubclass(base, Enum) and base._member_names_: - raise TypeError("%s: cannot extend enumeration %r" % (class_name, base.__name__)) + raise TypeError( + "%s: cannot extend enumeration %r" + % (class_name, base.__name__) + ) @staticmethod def _get_mixins_(class_name, bases): - """Returns the type for creating enum members, and the first inherited + """ + Returns the type for creating enum members, and the first inherited enum class. bases: the tuple of bases that was given to __new__ - """ if not bases: return object, Enum @@ -533,12 +575,12 @@ def _find_data_type(bases): @staticmethod def _find_new_(classdict, member_type, first_enum): - """Returns the __new__ to be used for creating the enum members. + """ + Returns the __new__ to be used for creating the enum members. classdict: the class dictionary given to __new__ member_type: the data type whose __new__ will be used by default first_enum: enumeration to check for an overriding __new__ - """ # now find the correct __new__, checking to see of one was defined # by the user; also check earlier enum classes in case a __new__ was @@ -578,10 +620,10 @@ def _find_new_(classdict, member_type, first_enum): class Enum(metaclass=EnumMeta): - """Generic enumeration. + """ + Generic enumeration. Derive from this class to define new enumerations. - """ def __new__(cls, value): # all enum instances are actually created during class construction @@ -624,6 +666,14 @@ def __new__(cls, value): raise exc def _generate_next_value_(name, start, count, last_values): + """ + Generate the next value when not given. + + name: the name of the member + start: the initial start value or None + count: the number of existing members + last_value: the last value assigned or None + """ for last_value in reversed(last_values): try: return last_value + 1 @@ -644,6 +694,9 @@ def __str__(self): return "%s.%s" % (self.__class__.__name__, self._name_) def __dir__(self): + """ + Returns all members and all public methods + """ added_behavior = [ m for cls in self.__class__.mro() @@ -653,6 +706,9 @@ def __dir__(self): return (['__class__', '__doc__', '__module__'] + added_behavior) def __format__(self, format_spec): + """ + Returns format using actual value type unless __str__ has been overridden. + """ # mixed-in Enums should use the mixed-in type's __format__, otherwise # we can get strange results with the Enum name showing up instead of # the value @@ -730,7 +786,9 @@ def _reduce_ex_by_name(self, proto): return self.name class Flag(Enum): - """Support for flags""" + """ + Support for flags + """ def _generate_next_value_(name, start, count, last_values): """ @@ -753,6 +811,9 @@ def _generate_next_value_(name, start, count, last_values): @classmethod def _missing_(cls, value): + """ + Returns member (possibly creating it) if one can be found for value. + """ original_value = value if value < 0: value = ~value @@ -782,6 +843,9 @@ def _create_pseudo_member_(cls, value): return pseudo_member def __contains__(self, other): + """ + Returns True if self has at least the same flags set as other. + """ if not isinstance(other, self.__class__): raise TypeError( "unsupported operand type(s) for 'in': '%s' and '%s'" % ( @@ -789,6 +853,9 @@ def __contains__(self, other): return other._value_ & self._value_ == other._value_ def __iter__(self): + """ + Returns flags in decreasing value order. + """ members, extra_flags = _decompose(self.__class__, self.value) return (m for m in members if m._value_ != 0) @@ -844,10 +911,15 @@ def __invert__(self): class IntFlag(int, Flag): - """Support for integer-based Flags""" + """ + Support for integer-based Flags + """ @classmethod def _missing_(cls, value): + """ + Returns member (possibly creating it) if one can be found for value. + """ if not isinstance(value, int): raise ValueError("%r is not a valid %s" % (value, cls.__qualname__)) new_member = cls._create_pseudo_member_(value) @@ -855,6 +927,9 @@ def _missing_(cls, value): @classmethod def _create_pseudo_member_(cls, value): + """ + Create a composite member iff value contains only members. + """ pseudo_member = cls._value2member_map_.get(value, None) if pseudo_member is None: need_to_create = [value] @@ -909,11 +984,15 @@ def __invert__(self): def _high_bit(value): - """returns index of highest bit, or -1 if value is zero or negative""" + """ + returns index of highest bit, or -1 if value is zero or negative + """ return value.bit_length() - 1 def unique(enumeration): - """Class decorator for enumerations ensuring unique member values.""" + """ + Class decorator for enumerations ensuring unique member values. + """ duplicates = [] for name, member in enumeration.__members__.items(): if name != member.name: @@ -926,7 +1005,9 @@ def unique(enumeration): return enumeration def _decompose(flag, value): - """Extract all members from the value.""" + """ + Extract all members from the value. + """ # _decompose is only called if the value is not named not_covered = value negative = value < 0 diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index f2171b53946b99..ab4b52f7852730 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -429,7 +429,7 @@ def red(self): def test_reserved__sunder_(self): with self.assertRaisesRegex( ValueError, - '_sunder_ names, such as "_bad_", are reserved', + "_sunder_ names, such as '_bad_', are reserved", ): class Bad(Enum): _bad_ = 1 From 02b4533d50d076a340e4d9c73b95cb97be25e7fd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 8 Dec 2020 23:51:26 +0100 Subject: [PATCH 0747/1261] bpo-32381: Rewrite PyErr_ProgramText() (GH-23700) PyErr_ProgramText() now calls PyErr_ProgramTextObject(). --- Python/errors.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Python/errors.c b/Python/errors.c index 213108f681bb79..9bac7ba70f5d5e 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1697,13 +1697,18 @@ err_programtext(PyThreadState *tstate, FILE *fp, int lineno) PyObject * PyErr_ProgramText(const char *filename, int lineno) { - FILE *fp; - if (filename == NULL || *filename == '\0' || lineno <= 0) { + if (filename == NULL) { return NULL; } - PyThreadState *tstate = _PyThreadState_GET(); - fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE); - return err_programtext(tstate, fp, lineno); + + PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename); + if (filename_obj == NULL) { + PyErr_Clear(); + return NULL; + } + PyObject *res = PyErr_ProgramTextObject(filename_obj, lineno); + Py_DECREF(filename_obj); + return res; } PyObject * From b31094d6df12b67dae183305057fc99d9bdd79d6 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 8 Dec 2020 23:51:54 +0100 Subject: [PATCH 0748/1261] bpo-35134: Add Include/cpython/pythonrun.h file (GH-23701) Py_CompileString() is now always declared as a function by Include/pythonrun.h. It is overriden with a macro in Include/cpython/pythonrun.h. --- Include/cpython/pythonrun.h | 117 +++++++++++++++++++++++++++ Include/pythonrun.h | 124 ++--------------------------- Makefile.pre.in | 1 + PCbuild/pythoncore.vcxproj | 1 + PCbuild/pythoncore.vcxproj.filters | 3 + 5 files changed, 129 insertions(+), 117 deletions(-) create mode 100644 Include/cpython/pythonrun.h diff --git a/Include/cpython/pythonrun.h b/Include/cpython/pythonrun.h new file mode 100644 index 00000000000000..4945d924558cf2 --- /dev/null +++ b/Include/cpython/pythonrun.h @@ -0,0 +1,117 @@ +#ifndef Py_CPYTHON_PYTHONRUN_H +# error "this header file must not be included directly" +#endif + +PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_AnyFileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_SimpleFileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveOneFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveOneObject( + FILE *fp, + PyObject *filename, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveLoopFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags); + + +PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, + PyObject *, PyCompilerFlags *); + +PyAPI_FUNC(PyObject *) PyRun_FileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyObject *globals, + PyObject *locals, + int closeit, + PyCompilerFlags *flags); + + +PyAPI_FUNC(PyObject *) Py_CompileStringExFlags( + const char *str, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyCompilerFlags *flags, + int optimize); +PyAPI_FUNC(PyObject *) Py_CompileStringObject( + const char *str, + PyObject *filename, int start, + PyCompilerFlags *flags, + int optimize); + +#define Py_CompileString(str, p, s) Py_CompileStringExFlags(str, p, s, NULL, -1) +#define Py_CompileStringFlags(str, p, s, f) Py_CompileStringExFlags(str, p, s, f, -1) + + +PyAPI_FUNC(const char *) _Py_SourceAsString( + PyObject *cmd, + const char *funcname, + const char *what, + PyCompilerFlags *cf, + PyObject **cmd_copy); + +PyAPI_FUNC(struct symtable *) Py_SymtableStringObject( + const char *str, + PyObject *filename, + int start); + +PyAPI_FUNC(struct symtable *) _Py_SymtableStringObjectFlags( + const char *str, + PyObject *filename, + int start, + PyCompilerFlags *flags); + + +/* A function flavor is also exported by libpython. It is required when + libpython is accessed directly rather than using header files which defines + macros below. On Windows, for example, PyAPI_FUNC() uses dllexport to + export functions in pythonXX.dll. */ +PyAPI_FUNC(PyObject *) PyRun_String(const char *str, int s, PyObject *g, PyObject *l); +PyAPI_FUNC(int) PyRun_AnyFile(FILE *fp, const char *name); +PyAPI_FUNC(int) PyRun_AnyFileEx(FILE *fp, const char *name, int closeit); +PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_SimpleString(const char *s); +PyAPI_FUNC(int) PyRun_SimpleFile(FILE *f, const char *p); +PyAPI_FUNC(int) PyRun_SimpleFileEx(FILE *f, const char *p, int c); +PyAPI_FUNC(int) PyRun_InteractiveOne(FILE *f, const char *p); +PyAPI_FUNC(int) PyRun_InteractiveLoop(FILE *f, const char *p); +PyAPI_FUNC(PyObject *) PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l); +PyAPI_FUNC(PyObject *) PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c); +PyAPI_FUNC(PyObject *) PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, PyCompilerFlags *flags); + +/* Use macros for a bunch of old variants */ +#define PyRun_String(str, s, g, l) PyRun_StringFlags(str, s, g, l, NULL) +#define PyRun_AnyFile(fp, name) PyRun_AnyFileExFlags(fp, name, 0, NULL) +#define PyRun_AnyFileEx(fp, name, closeit) \ + PyRun_AnyFileExFlags(fp, name, closeit, NULL) +#define PyRun_AnyFileFlags(fp, name, flags) \ + PyRun_AnyFileExFlags(fp, name, 0, flags) +#define PyRun_SimpleString(s) PyRun_SimpleStringFlags(s, NULL) +#define PyRun_SimpleFile(f, p) PyRun_SimpleFileExFlags(f, p, 0, NULL) +#define PyRun_SimpleFileEx(f, p, c) PyRun_SimpleFileExFlags(f, p, c, NULL) +#define PyRun_InteractiveOne(f, p) PyRun_InteractiveOneFlags(f, p, NULL) +#define PyRun_InteractiveLoop(f, p) PyRun_InteractiveLoopFlags(f, p, NULL) +#define PyRun_File(fp, p, s, g, l) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, NULL) +#define PyRun_FileEx(fp, p, s, g, l, c) \ + PyRun_FileExFlags(fp, p, s, g, l, c, NULL) +#define PyRun_FileFlags(fp, p, s, g, l, flags) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, flags) + + +/* Stuff with no proper home (yet) */ +PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, const char *); +PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; diff --git a/Include/pythonrun.h b/Include/pythonrun.h index d43734b5a12ff0..cc6c745a4d33d8 100644 --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -7,137 +7,21 @@ extern "C" { #endif -#ifndef Py_LIMITED_API -PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); -PyAPI_FUNC(int) PyRun_AnyFileExFlags( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - int closeit, - PyCompilerFlags *flags); -PyAPI_FUNC(int) PyRun_SimpleFileExFlags( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - int closeit, - PyCompilerFlags *flags); -PyAPI_FUNC(int) PyRun_InteractiveOneFlags( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - PyCompilerFlags *flags); -PyAPI_FUNC(int) PyRun_InteractiveOneObject( - FILE *fp, - PyObject *filename, - PyCompilerFlags *flags); -PyAPI_FUNC(int) PyRun_InteractiveLoopFlags( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - PyCompilerFlags *flags); - - -PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, - PyObject *, PyCompilerFlags *); - -PyAPI_FUNC(PyObject *) PyRun_FileExFlags( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - int start, - PyObject *globals, - PyObject *locals, - int closeit, - PyCompilerFlags *flags); -#endif - -#ifdef Py_LIMITED_API PyAPI_FUNC(PyObject *) Py_CompileString(const char *, const char *, int); -#else -#define Py_CompileString(str, p, s) Py_CompileStringExFlags(str, p, s, NULL, -1) -#define Py_CompileStringFlags(str, p, s, f) Py_CompileStringExFlags(str, p, s, f, -1) -PyAPI_FUNC(PyObject *) Py_CompileStringExFlags( - const char *str, - const char *filename, /* decoded from the filesystem encoding */ - int start, - PyCompilerFlags *flags, - int optimize); -PyAPI_FUNC(PyObject *) Py_CompileStringObject( - const char *str, - PyObject *filename, int start, - PyCompilerFlags *flags, - int optimize); -#endif + PyAPI_FUNC(struct symtable *) Py_SymtableString( const char *str, const char *filename, /* decoded from the filesystem encoding */ int start); -#ifndef Py_LIMITED_API -PyAPI_FUNC(const char *) _Py_SourceAsString( - PyObject *cmd, - const char *funcname, - const char *what, - PyCompilerFlags *cf, - PyObject **cmd_copy); - -PyAPI_FUNC(struct symtable *) Py_SymtableStringObject( - const char *str, - PyObject *filename, - int start); - -PyAPI_FUNC(struct symtable *) _Py_SymtableStringObjectFlags( - const char *str, - PyObject *filename, - int start, - PyCompilerFlags *flags); -#endif PyAPI_FUNC(void) PyErr_Print(void); PyAPI_FUNC(void) PyErr_PrintEx(int); PyAPI_FUNC(void) PyErr_Display(PyObject *, PyObject *, PyObject *); -#ifndef Py_LIMITED_API -/* A function flavor is also exported by libpython. It is required when - libpython is accessed directly rather than using header files which defines - macros below. On Windows, for example, PyAPI_FUNC() uses dllexport to - export functions in pythonXX.dll. */ -PyAPI_FUNC(PyObject *) PyRun_String(const char *str, int s, PyObject *g, PyObject *l); -PyAPI_FUNC(int) PyRun_AnyFile(FILE *fp, const char *name); -PyAPI_FUNC(int) PyRun_AnyFileEx(FILE *fp, const char *name, int closeit); -PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); -PyAPI_FUNC(int) PyRun_SimpleString(const char *s); -PyAPI_FUNC(int) PyRun_SimpleFile(FILE *f, const char *p); -PyAPI_FUNC(int) PyRun_SimpleFileEx(FILE *f, const char *p, int c); -PyAPI_FUNC(int) PyRun_InteractiveOne(FILE *f, const char *p); -PyAPI_FUNC(int) PyRun_InteractiveLoop(FILE *f, const char *p); -PyAPI_FUNC(PyObject *) PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l); -PyAPI_FUNC(PyObject *) PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c); -PyAPI_FUNC(PyObject *) PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, PyCompilerFlags *flags); - -/* Use macros for a bunch of old variants */ -#define PyRun_String(str, s, g, l) PyRun_StringFlags(str, s, g, l, NULL) -#define PyRun_AnyFile(fp, name) PyRun_AnyFileExFlags(fp, name, 0, NULL) -#define PyRun_AnyFileEx(fp, name, closeit) \ - PyRun_AnyFileExFlags(fp, name, closeit, NULL) -#define PyRun_AnyFileFlags(fp, name, flags) \ - PyRun_AnyFileExFlags(fp, name, 0, flags) -#define PyRun_SimpleString(s) PyRun_SimpleStringFlags(s, NULL) -#define PyRun_SimpleFile(f, p) PyRun_SimpleFileExFlags(f, p, 0, NULL) -#define PyRun_SimpleFileEx(f, p, c) PyRun_SimpleFileExFlags(f, p, c, NULL) -#define PyRun_InteractiveOne(f, p) PyRun_InteractiveOneFlags(f, p, NULL) -#define PyRun_InteractiveLoop(f, p) PyRun_InteractiveLoopFlags(f, p, NULL) -#define PyRun_File(fp, p, s, g, l) \ - PyRun_FileExFlags(fp, p, s, g, l, 0, NULL) -#define PyRun_FileEx(fp, p, s, g, l, c) \ - PyRun_FileExFlags(fp, p, s, g, l, c, NULL) -#define PyRun_FileFlags(fp, p, s, g, l, flags) \ - PyRun_FileExFlags(fp, p, s, g, l, 0, flags) -#endif /* Stuff with no proper home (yet) */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, const char *); -#endif PyAPI_DATA(int) (*PyOS_InputHook)(void); PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *); -#ifndef Py_LIMITED_API -PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; -#endif /* Stack size, in "pointers" (so we get extra safety margins on 64-bit platforms). On a 32-bit platform, this translates @@ -154,6 +38,12 @@ PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; PyAPI_FUNC(int) PyOS_CheckStack(void); #endif +#ifndef Py_LIMITED_API +# define Py_CPYTHON_PYTHONRUN_H +# include "cpython/pythonrun.h" +# undef Py_CPYTHON_PYTHONRUN_H +#endif + #ifdef __cplusplus } #endif diff --git a/Makefile.pre.in b/Makefile.pre.in index f52a0f3cdf0d61..69ed251936a605 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1102,6 +1102,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/pylifecycle.h \ $(srcdir)/Include/cpython/pymem.h \ $(srcdir)/Include/cpython/pystate.h \ + $(srcdir)/Include/cpython/pythonrun.h \ $(srcdir)/Include/cpython/sysmodule.h \ $(srcdir)/Include/cpython/traceback.h \ $(srcdir)/Include/cpython/tupleobject.h \ diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index cf78714920b054..bbceb025c0c22e 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -146,6 +146,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index ba84ab902b6877..ee1aa90bf76886 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -459,6 +459,9 @@ Include\cpython + + Include\cpython + Include\cpython From 19805b2023de20f2e23e567d371448ade0a2f4e8 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Wed, 9 Dec 2020 07:18:37 +0800 Subject: [PATCH 0749/1261] bpo-41443: Add more attribute checking in test_posix (GH-21688) --- Lib/test/test_posix.py | 10 +++++++--- .../Tests/2020-07-30-18-43-05.bpo-41443.834gyg.rst | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-07-30-18-43-05.bpo-41443.834gyg.rst diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index d4d348cdc02d09..185b293b070469 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1094,7 +1094,8 @@ def test_chmod_dir_fd(self): finally: posix.close(f) - @unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()") + @unittest.skipUnless(hasattr(os, 'chown') and (os.chown in os.supports_dir_fd), + "test needs dir_fd support in os.chown()") def test_chown_dir_fd(self): os_helper.unlink(os_helper.TESTFN) os_helper.create_empty_file(os_helper.TESTFN) @@ -1189,7 +1190,9 @@ def test_mkdir_dir_fd(self): posix.close(f) os_helper.rmtree(os_helper.TESTFN + 'dir') - @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'), + @unittest.skipUnless(hasattr(os, 'mknod') + and (os.mknod in os.supports_dir_fd) + and hasattr(stat, 'S_IFIFO'), "test requires both stat.S_IFIFO and dir_fd support for os.mknod()") def test_mknod_dir_fd(self): # Test using mknodat() to create a FIFO (the only use specified @@ -1222,7 +1225,8 @@ def test_open_dir_fd(self): posix.close(a) posix.close(b) - @unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()") + @unittest.skipUnless(hasattr(os, 'readlink') and (os.readlink in os.supports_dir_fd), + "test needs dir_fd support in os.readlink()") def test_readlink_dir_fd(self): os.symlink(os_helper.TESTFN, os_helper.TESTFN + 'link') f = posix.open(posix.getcwd(), posix.O_RDONLY) diff --git a/Misc/NEWS.d/next/Tests/2020-07-30-18-43-05.bpo-41443.834gyg.rst b/Misc/NEWS.d/next/Tests/2020-07-30-18-43-05.bpo-41443.834gyg.rst new file mode 100644 index 00000000000000..439f3e36470150 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-07-30-18-43-05.bpo-41443.834gyg.rst @@ -0,0 +1 @@ +Add more attribute checking in test_posix.py From 7b8edf5205ef129ff0ea7af33ec9b3608e55b8ef Mon Sep 17 00:00:00 2001 From: pxinwr Date: Wed, 9 Dec 2020 07:20:19 +0800 Subject: [PATCH 0750/1261] bpo-41439: Skip test_ssl and test_uuid tests if fork() is not supported (GH-21684) --- Lib/test/test_ssl.py | 2 +- Lib/test/test_uuid.py | 2 +- Misc/NEWS.d/next/Tests/2020-07-30-14-08-58.bpo-41439.yhteoi.rst | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) mode change 100644 => 100755 Lib/test/test_uuid.py create mode 100644 Misc/NEWS.d/next/Tests/2020-07-30-14-08-58.bpo-41439.yhteoi.rst diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index e5cd962e84710e..67850c34e00c20 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -391,7 +391,7 @@ def test_random(self): ssl.RAND_add(b"this is a random bytes object", 75.0) ssl.RAND_add(bytearray(b"this is a random bytearray object"), 75.0) - @unittest.skipUnless(os.name == 'posix', 'requires posix') + @unittest.skipUnless(hasattr(os, 'fork'), 'need os.fork') def test_random_fork(self): status = ssl.RAND_status() if not status: diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py old mode 100644 new mode 100755 index 718113d6e1bb2d..d6a8333427a4a2 --- a/Lib/test/test_uuid.py +++ b/Lib/test/test_uuid.py @@ -639,7 +639,7 @@ def test_uuid5(self): equal(u, self.uuid.UUID(v)) equal(str(u), v) - @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(hasattr(os, 'fork'), 'need os.fork') def testIssue8621(self): # On at least some versions of OSX self.uuid.uuid4 generates # the same sequence of UUIDs in the parent and any diff --git a/Misc/NEWS.d/next/Tests/2020-07-30-14-08-58.bpo-41439.yhteoi.rst b/Misc/NEWS.d/next/Tests/2020-07-30-14-08-58.bpo-41439.yhteoi.rst new file mode 100644 index 00000000000000..0451503a52e93a --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-07-30-14-08-58.bpo-41439.yhteoi.rst @@ -0,0 +1 @@ +Port test_ssl and test_uuid to VxWorks RTOS. From 30c27156dbe439d73310d553ee6140f85832c171 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 9 Dec 2020 00:32:54 +0100 Subject: [PATCH 0751/1261] bpo-32381: Add _PyRun_SimpleFileObject() (GH-23709) pymain_run_startup() now pass the filename as a Python object to _PyRun_SimpleFileObject(). --- Include/cpython/pythonrun.h | 5 +++++ Modules/main.c | 41 +++++++++++++------------------------ Python/pythonrun.c | 8 ++++---- 3 files changed, 23 insertions(+), 31 deletions(-) diff --git a/Include/cpython/pythonrun.h b/Include/cpython/pythonrun.h index 4945d924558cf2..febda73f3ec6c0 100644 --- a/Include/cpython/pythonrun.h +++ b/Include/cpython/pythonrun.h @@ -3,6 +3,11 @@ #endif PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); +PyAPI_FUNC(int) _PyRun_SimpleFileObject( + FILE *fp, + PyObject *filename, + int closeit, + PyCompilerFlags *flags); PyAPI_FUNC(int) PyRun_AnyFileExFlags( FILE *fp, const char *filename, /* decoded from the filesystem encoding */ diff --git a/Modules/main.c b/Modules/main.c index 2cc891f61aadd1..3aa4d91c9a3cdc 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -380,64 +380,51 @@ static int pymain_run_startup(PyConfig *config, PyCompilerFlags *cf, int *exitcode) { int ret; - PyObject *startup_obj = NULL; if (!config->use_environment) { return 0; } + PyObject *startup = NULL; #ifdef MS_WINDOWS - const wchar_t *wstartup = _wgetenv(L"PYTHONSTARTUP"); - if (wstartup == NULL || wstartup[0] == L'\0') { + const wchar_t *env = _wgetenv(L"PYTHONSTARTUP"); + if (env == NULL || env[0] == L'\0') { return 0; } - PyObject *startup_bytes = NULL; - startup_obj = PyUnicode_FromWideChar(wstartup, wcslen(wstartup)); - if (startup_obj == NULL) { - goto error; - } - startup_bytes = PyUnicode_EncodeFSDefault(startup_obj); - if (startup_bytes == NULL) { + startup = PyUnicode_FromWideChar(env, wcslen(env)); + if (startup == NULL) { goto error; } - const char *startup = PyBytes_AS_STRING(startup_bytes); #else - const char *startup = _Py_GetEnv(config->use_environment, "PYTHONSTARTUP"); - if (startup == NULL) { + const char *env = _Py_GetEnv(config->use_environment, "PYTHONSTARTUP"); + if (env == NULL) { return 0; } - startup_obj = PyUnicode_DecodeFSDefault(startup); - if (startup_obj == NULL) { + startup = PyUnicode_DecodeFSDefault(env); + if (startup == NULL) { goto error; } #endif - if (PySys_Audit("cpython.run_startup", "O", startup_obj) < 0) { + if (PySys_Audit("cpython.run_startup", "O", startup) < 0) { goto error; } -#ifdef MS_WINDOWS - FILE *fp = _Py_wfopen(wstartup, L"r"); -#else - FILE *fp = _Py_fopen(startup, "r"); -#endif + FILE *fp = _Py_fopen_obj(startup, "r"); if (fp == NULL) { int save_errno = errno; PyErr_Clear(); PySys_WriteStderr("Could not open PYTHONSTARTUP\n"); errno = save_errno; - PyErr_SetFromErrnoWithFilenameObjects(PyExc_OSError, startup_obj, NULL); + PyErr_SetFromErrnoWithFilenameObjects(PyExc_OSError, startup, NULL); goto error; } - (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf); + (void) _PyRun_SimpleFileObject(fp, startup, 0, cf); PyErr_Clear(); fclose(fp); ret = 0; done: -#ifdef MS_WINDOWS - Py_XDECREF(startup_bytes); -#endif - Py_XDECREF(startup_obj); + Py_XDECREF(startup); return ret; error: diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 330b822d707c65..15e407d9195c0c 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -350,9 +350,9 @@ set_main_loader(PyObject *d, PyObject *filename, const char *loader_name) } -static int -pyrun_simple_file(FILE *fp, PyObject *filename, int closeit, - PyCompilerFlags *flags) +int +_PyRun_SimpleFileObject(FILE *fp, PyObject *filename, int closeit, + PyCompilerFlags *flags) { PyObject *m, *d, *v; int set_file_name = 0, ret = -1; @@ -441,7 +441,7 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, if (filename_obj == NULL) { return -1; } - int res = pyrun_simple_file(fp, filename_obj, closeit, flags); + int res = _PyRun_SimpleFileObject(fp, filename_obj, closeit, flags); Py_DECREF(filename_obj); return res; } From 960c42145c8dcb20d04fd58a919ebe1241a25638 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 9 Dec 2020 20:54:31 +0100 Subject: [PATCH 0752/1261] bpo-32381: Remove unused _Py_fopen() function (GH-23711) Remove the private _Py_fopen() function which is no longer needed. Use _Py_wfopen() or _Py_fopen_obj() instead. --- Include/cpython/fileutils.h | 4 --- .../2020-12-09-00-35-25.bpo-32381.Je08Ny.rst | 3 +++ Python/fileutils.c | 27 ------------------- 3 files changed, 3 insertions(+), 31 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-12-09-00-35-25.bpo-32381.Je08Ny.rst diff --git a/Include/cpython/fileutils.h b/Include/cpython/fileutils.h index e79d03e24f5771..312fd958284788 100644 --- a/Include/cpython/fileutils.h +++ b/Include/cpython/fileutils.h @@ -95,10 +95,6 @@ PyAPI_FUNC(FILE *) _Py_wfopen( const wchar_t *path, const wchar_t *mode); -PyAPI_FUNC(FILE*) _Py_fopen( - const char *pathname, - const char *mode); - PyAPI_FUNC(FILE*) _Py_fopen_obj( PyObject *path, const char *mode); diff --git a/Misc/NEWS.d/next/C API/2020-12-09-00-35-25.bpo-32381.Je08Ny.rst b/Misc/NEWS.d/next/C API/2020-12-09-00-35-25.bpo-32381.Je08Ny.rst new file mode 100644 index 00000000000000..ded75fa54a42ff --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-12-09-00-35-25.bpo-32381.Je08Ny.rst @@ -0,0 +1,3 @@ +Remove the private :c:func:`_Py_fopen` function which is no longer needed. +Use :c:func:`_Py_wfopen` or :c:func:`_Py_fopen_obj` instead. Patch by Victor +Stinner. diff --git a/Python/fileutils.c b/Python/fileutils.c index ac382821174211..8dc90fbe2b2e71 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1455,33 +1455,6 @@ _Py_wfopen(const wchar_t *path, const wchar_t *mode) return f; } -/* Wrapper to fopen(). - - The file descriptor is created non-inheritable. - - If interrupted by a signal, fail with EINTR. */ -FILE* -_Py_fopen(const char *pathname, const char *mode) -{ - PyObject *pathname_obj = PyUnicode_DecodeFSDefault(pathname); - if (pathname_obj == NULL) { - return NULL; - } - if (PySys_Audit("open", "Osi", pathname_obj, mode, 0) < 0) { - Py_DECREF(pathname_obj); - return NULL; - } - Py_DECREF(pathname_obj); - - FILE *f = fopen(pathname, mode); - if (f == NULL) - return NULL; - if (make_non_inheritable(fileno(f)) < 0) { - fclose(f); - return NULL; - } - return f; -} /* Open a file. Call _wfopen() on Windows, or encode the path to the filesystem encoding and call fopen() otherwise. From d2fd82f2301f55d861f646241d0a395172bf4e99 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 9 Dec 2020 22:37:27 +0100 Subject: [PATCH 0753/1261] bpo-32381: Add _PyRun_AnyFileObject() (GH-23723) pymain_run_file() no longer encodes the filename: pass the filename as an object to the new _PyRun_AnyFileObject() function. Add new private functions: * _PyRun_AnyFileObject() * _PyRun_InteractiveLoopObject() * _Py_FdIsInteractive() --- Include/cpython/pylifecycle.h | 1 + Include/cpython/pythonrun.h | 9 ++++ Modules/main.c | 35 +++---------- Python/pylifecycle.c | 15 ++++++ Python/pythonrun.c | 99 ++++++++++++++++++++++++++--------- 5 files changed, 106 insertions(+), 53 deletions(-) diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index f38ec5a4ae3990..b4e2c8a8427c8a 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -44,6 +44,7 @@ PyAPI_FUNC(void) _Py_PyAtExit(void (*func)(PyObject *), PyObject *); PyAPI_FUNC(void) _Py_RestoreSignals(void); PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *); +PyAPI_FUNC(int) _Py_FdIsInteractive(FILE *fp, PyObject *filename); PyAPI_FUNC(void) _Py_SetProgramFullPath(const wchar_t *); diff --git a/Include/cpython/pythonrun.h b/Include/cpython/pythonrun.h index febda73f3ec6c0..e396a674bc4684 100644 --- a/Include/cpython/pythonrun.h +++ b/Include/cpython/pythonrun.h @@ -13,6 +13,11 @@ PyAPI_FUNC(int) PyRun_AnyFileExFlags( const char *filename, /* decoded from the filesystem encoding */ int closeit, PyCompilerFlags *flags); +PyAPI_FUNC(int) _PyRun_AnyFileObject( + FILE *fp, + PyObject *filename, + int closeit, + PyCompilerFlags *flags); PyAPI_FUNC(int) PyRun_SimpleFileExFlags( FILE *fp, const char *filename, /* decoded from the filesystem encoding */ @@ -30,6 +35,10 @@ PyAPI_FUNC(int) PyRun_InteractiveLoopFlags( FILE *fp, const char *filename, /* decoded from the filesystem encoding */ PyCompilerFlags *flags); +PyAPI_FUNC(int) _PyRun_InteractiveLoopObject( + FILE *fp, + PyObject *filename, + PyCompilerFlags *flags); PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, diff --git a/Modules/main.c b/Modules/main.c index 3aa4d91c9a3cdc..7ffcb07a7fd4b6 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -313,17 +313,8 @@ pymain_run_file(const PyConfig *config, PyCompilerFlags *cf) } FILE *fp = _Py_wfopen(filename, L"rb"); if (fp == NULL) { - char *cfilename_buffer; - const char *cfilename; - int err = errno; - cfilename_buffer = _Py_EncodeLocaleRaw(filename, NULL); - if (cfilename_buffer != NULL) - cfilename = cfilename_buffer; - else - cfilename = ""; - fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n", - config->program_name, cfilename, err, strerror(err)); - PyMem_RawFree(cfilename_buffer); + fprintf(stderr, "%ls: can't open file '%ls': [Errno %d] %s\n", + config->program_name, filename, errno, strerror(errno)); return 2; } @@ -353,25 +344,15 @@ pymain_run_file(const PyConfig *config, PyCompilerFlags *cf) return pymain_exit_err_print(); } - PyObject *unicode, *bytes = NULL; - const char *filename_str; - - unicode = PyUnicode_FromWideChar(filename, wcslen(filename)); - if (unicode != NULL) { - bytes = PyUnicode_EncodeFSDefault(unicode); - Py_DECREF(unicode); - } - if (bytes != NULL) { - filename_str = PyBytes_AsString(bytes); - } - else { - PyErr_Clear(); - filename_str = ""; + PyObject *filename_obj = PyUnicode_FromWideChar(filename, -1); + if (filename_obj == NULL) { + PyErr_Print(); + return -1; } /* PyRun_AnyFileExFlags(closeit=1) calls fclose(fp) before running code */ - int run = PyRun_AnyFileExFlags(fp, filename_str, 1, cf); - Py_XDECREF(bytes); + int run = _PyRun_AnyFileObject(fp, filename_obj, 1, cf); + Py_XDECREF(filename_obj); return (run != 0); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 70824ff674129a..6a705b4d2b4b9e 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2739,6 +2739,21 @@ Py_FdIsInteractive(FILE *fp, const char *filename) } +int +_Py_FdIsInteractive(FILE *fp, PyObject *filename) +{ + if (isatty((int)fileno(fp))) { + return 1; + } + if (!Py_InteractiveFlag) { + return 0; + } + return (filename == NULL) || + (PyUnicode_CompareWithASCIIString(filename, "") == 0) || + (PyUnicode_CompareWithASCIIString(filename, "???") == 0); +} + + /* Wrappers around sigaction() or signal(). */ PyOS_sighandler_t diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 15e407d9195c0c..dacf1a647106fb 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -67,44 +67,69 @@ static PyObject* pyrun_file(FILE *fp, PyObject *filename, int start, PyCompilerFlags *flags); -/* Parse input from a file and execute it */ int -PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, +_PyRun_AnyFileObject(FILE *fp, PyObject *filename, int closeit, PyCompilerFlags *flags) { - if (filename == NULL) - filename = "???"; - if (Py_FdIsInteractive(fp, filename)) { - int err = PyRun_InteractiveLoopFlags(fp, filename, flags); - if (closeit) + int decref_filename = 0; + if (filename == NULL) { + filename = PyUnicode_FromString("???"); + if (filename == NULL) { + PyErr_Print(); + return -1; + } + decref_filename = 1; + } + + int res; + if (_Py_FdIsInteractive(fp, filename)) { + res = _PyRun_InteractiveLoopObject(fp, filename, flags); + if (closeit) { fclose(fp); - return err; + } + } + else { + res = _PyRun_SimpleFileObject(fp, filename, closeit, flags); + } + + if (decref_filename) { + Py_DECREF(filename); } - else - return PyRun_SimpleFileExFlags(fp, filename, closeit, flags); + return res; } + +/* Parse input from a file and execute it */ int -PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags) +PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, + PyCompilerFlags *flags) { - PyObject *filename, *v; - int ret, err; - PyCompilerFlags local_flags = _PyCompilerFlags_INIT; - int nomem_count = 0; -#ifdef Py_REF_DEBUG - int show_ref_count = _Py_GetConfig()->show_ref_count; -#endif - - filename = PyUnicode_DecodeFSDefault(filename_str); - if (filename == NULL) { - PyErr_Print(); - return -1; + PyObject *filename_obj; + if (filename != NULL) { + filename_obj = PyUnicode_DecodeFSDefault(filename); + if (filename_obj == NULL) { + PyErr_Print(); + return -1; + } } + else { + filename_obj = NULL; + } + int res = _PyRun_AnyFileObject(fp, filename_obj, closeit, flags); + Py_XDECREF(filename_obj); + return res; +} + +int +_PyRun_InteractiveLoopObject(FILE *fp, PyObject *filename, PyCompilerFlags *flags) +{ + PyCompilerFlags local_flags = _PyCompilerFlags_INIT; if (flags == NULL) { flags = &local_flags; } - v = _PySys_GetObjectId(&PyId_ps1); + + PyObject *v = _PySys_GetObjectId(&PyId_ps1); if (v == NULL) { _PySys_SetObjectId(&PyId_ps1, v = PyUnicode_FromString(">>> ")); Py_XDECREF(v); @@ -114,7 +139,13 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags * _PySys_SetObjectId(&PyId_ps2, v = PyUnicode_FromString("... ")); Py_XDECREF(v); } - err = 0; + +#ifdef Py_REF_DEBUG + int show_ref_count = _Py_GetConfig()->show_ref_count; +#endif + int err = 0; + int ret; + int nomem_count = 0; do { ret = PyRun_InteractiveOneObjectEx(fp, filename, flags); if (ret == -1 && PyErr_Occurred()) { @@ -141,10 +172,26 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags * } #endif } while (ret != E_EOF); - Py_DECREF(filename); return err; } + +int +PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) +{ + PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename); + if (filename_obj == NULL) { + PyErr_Print(); + return -1; + } + + int err = _PyRun_InteractiveLoopObject(fp, filename_obj, flags); + Py_DECREF(filename_obj); + return err; + +} + + /* A PyRun_InteractiveOneObject() auxiliary function that does not print the * error on failure. */ static int From 0165a46483314405bcf7c002ded811875aecbbce Mon Sep 17 00:00:00 2001 From: pxinwr Date: Thu, 10 Dec 2020 05:47:28 +0800 Subject: [PATCH 0754/1261] bpo-31904: Define THREAD_STACK_SIZE for VxWorks (GH-23718) --- .../next/Library/2020-12-09-15-23-28.bpo-31904.g3k5k3.rst | 1 + Python/thread_pthread.h | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-12-09-15-23-28.bpo-31904.g3k5k3.rst diff --git a/Misc/NEWS.d/next/Library/2020-12-09-15-23-28.bpo-31904.g3k5k3.rst b/Misc/NEWS.d/next/Library/2020-12-09-15-23-28.bpo-31904.g3k5k3.rst new file mode 100644 index 00000000000000..7bca3ed845b02c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-09-15-23-28.bpo-31904.g3k5k3.rst @@ -0,0 +1 @@ +Define THREAD_STACK_SIZE for VxWorks. diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index e6910b3083a892..ec7d737518b68c 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -62,6 +62,10 @@ # define THREAD_STACK_SIZE 0x800000 # endif #endif +#if defined(__VXWORKS__) && defined(THREAD_STACK_SIZE) && THREAD_STACK_SIZE == 0 +#undef THREAD_STACK_SIZE +#define THREAD_STACK_SIZE 0x100000 +#endif /* for safety, ensure a viable minimum stacksize */ #define THREAD_STACK_MIN 0x8000 /* 32 KiB */ #else /* !_POSIX_THREAD_ATTR_STACKSIZE */ From 5857dbe6dfbb6d6e212a3a04b1bd009c30efc6dc Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 9 Dec 2020 18:56:17 -0300 Subject: [PATCH 0755/1261] [doc] Document logging.basicConfig default format (GH-23710) Automerge-Triggered-By: GH:vsajip --- Doc/library/logging.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index fb8ea705b0469f..b69431fe2cf37a 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1174,7 +1174,9 @@ functions. | | to ``'a'``. | +--------------+---------------------------------------------+ | *format* | Use the specified format string for the | - | | handler. | + | | handler. Defaults to attributes | + | | ``levelname``, ``name`` and ``message`` | + | | separated by colons. | +--------------+---------------------------------------------+ | *datefmt* | Use the specified date/time format, as | | | accepted by :func:`time.strftime`. | From 8f10bcb6ae438706fb62445d2c636aaf8fb4a991 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 9 Dec 2020 20:37:39 -0300 Subject: [PATCH 0756/1261] [doc] Link to issue regarding logging.disable level param default value (GH-23726) --- Doc/library/logging.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index b69431fe2cf37a..431a5849fa9bff 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1096,8 +1096,8 @@ functions. suitable value. .. versionchanged:: 3.7 - The *level* parameter was defaulted to level ``CRITICAL``. See Issue - #28524 for more information about this change. + The *level* parameter was defaulted to level ``CRITICAL``. See + :issue:`28524` for more information about this change. .. function:: addLevelName(level, levelName) From 7c7e7b0c2fcd0b1b549152d048878f2abcdc8eb6 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Wed, 9 Dec 2020 16:41:22 -0800 Subject: [PATCH 0757/1261] bpo-42567: [Enum] call __init_subclass__ after members are added (GH-23714) When creating an Enum, type.__new__ calls __init_subclass__, but at that point the members have not been added. This patch suppresses the initial call, then manually calls the ancestor __init_subclass__ before returning the new Enum class. --- Lib/enum.py | 32 +++++++- Lib/test/test_enum.py | 73 +++++++++++++++++++ .../2020-12-08-22-43-35.bpo-42678.ba9ktU.rst | 1 + 3 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst diff --git a/Lib/enum.py b/Lib/enum.py index f6c7e8b2334139..83e050e1e41cde 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -9,6 +9,14 @@ ] +class _NoInitSubclass: + """ + temporary base class to suppress calling __init_subclass__ + """ + @classmethod + def __init_subclass__(cls, **kwds): + pass + def _is_descriptor(obj): """ Returns True if obj is a descriptor, False otherwise. @@ -157,7 +165,7 @@ def __prepare__(metacls, cls, bases): ) return enum_dict - def __new__(metacls, cls, bases, classdict): + def __new__(metacls, cls, bases, classdict, **kwds): # an Enum class is final once enumeration items have been defined; it # cannot be mixed with other types (int, float, etc.) if it has an # inherited __new__ unless a new __new__ is defined (or the resulting @@ -192,8 +200,22 @@ def __new__(metacls, cls, bases, classdict): if '__doc__' not in classdict: classdict['__doc__'] = 'An enumeration.' + # postpone calling __init_subclass__ + if '__init_subclass__' in classdict and classdict['__init_subclass__'] is None: + raise TypeError('%s.__init_subclass__ cannot be None') + # remove current __init_subclass__ so previous one can be found with getattr + new_init_subclass = classdict.pop('__init_subclass__', None) # create our new Enum type - enum_class = super().__new__(metacls, cls, bases, classdict) + if bases: + bases = (_NoInitSubclass, ) + bases + enum_class = type.__new__(metacls, cls, bases, classdict) + enum_class.__bases__ = enum_class.__bases__[1:] #or (object, ) + else: + enum_class = type.__new__(metacls, cls, bases, classdict) + old_init_subclass = getattr(enum_class, '__init_subclass__', None) + # and restore the new one (if there was one) + if new_init_subclass is not None: + enum_class.__init_subclass__ = classmethod(new_init_subclass) enum_class._member_names_ = [] # names in definition order enum_class._member_map_ = {} # name->value map enum_class._member_type_ = member_type @@ -305,6 +327,9 @@ def __new__(metacls, cls, bases, classdict): if _order_ != enum_class._member_names_: raise TypeError('member order does not match _order_') + # finally, call parents' __init_subclass__ + if Enum is not None and old_init_subclass is not None: + old_init_subclass(**kwds) return enum_class def __bool__(self): @@ -682,6 +707,9 @@ def _generate_next_value_(name, start, count, last_values): else: return start + def __init_subclass__(cls, **kwds): + super().__init_subclass__(**kwds) + @classmethod def _missing_(cls, value): return None diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index ab4b52f7852730..20bc5b3c750d61 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2117,6 +2117,43 @@ class ThirdFailedStrEnum(StrEnum): class ThirdFailedStrEnum(StrEnum): one = '1' two = b'2', 'ascii', 9 + + def test_init_subclass(self): + class MyEnum(Enum): + def __init_subclass__(cls, **kwds): + super(MyEnum, cls).__init_subclass__(**kwds) + self.assertFalse(cls.__dict__.get('_test', False)) + cls._test1 = 'MyEnum' + # + class TheirEnum(MyEnum): + def __init_subclass__(cls, **kwds): + super().__init_subclass__(**kwds) + cls._test2 = 'TheirEnum' + class WhoseEnum(TheirEnum): + def __init_subclass__(cls, **kwds): + pass + class NoEnum(WhoseEnum): + ONE = 1 + self.assertEqual(TheirEnum.__dict__['_test1'], 'MyEnum') + self.assertEqual(WhoseEnum.__dict__['_test1'], 'MyEnum') + self.assertEqual(WhoseEnum.__dict__['_test2'], 'TheirEnum') + self.assertFalse(NoEnum.__dict__.get('_test1', False)) + self.assertFalse(NoEnum.__dict__.get('_test2', False)) + # + class OurEnum(MyEnum): + def __init_subclass__(cls, **kwds): + cls._test2 = 'OurEnum' + class WhereEnum(OurEnum): + def __init_subclass__(cls, **kwds): + pass + class NeverEnum(WhereEnum): + ONE = 'one' + self.assertEqual(OurEnum.__dict__['_test1'], 'MyEnum') + self.assertFalse(WhereEnum.__dict__.get('_test1', False)) + self.assertEqual(WhereEnum.__dict__['_test2'], 'OurEnum') + self.assertFalse(NeverEnum.__dict__.get('_test1', False)) + self.assertFalse(NeverEnum.__dict__.get('_test2', False)) + class TestOrder(unittest.TestCase): @@ -2573,6 +2610,42 @@ def cycle_enum(): 'at least one thread failed while creating composite members') self.assertEqual(256, len(seen), 'too many composite members created') + def test_init_subclass(self): + class MyEnum(Flag): + def __init_subclass__(cls, **kwds): + super().__init_subclass__(**kwds) + self.assertFalse(cls.__dict__.get('_test', False)) + cls._test1 = 'MyEnum' + # + class TheirEnum(MyEnum): + def __init_subclass__(cls, **kwds): + super(TheirEnum, cls).__init_subclass__(**kwds) + cls._test2 = 'TheirEnum' + class WhoseEnum(TheirEnum): + def __init_subclass__(cls, **kwds): + pass + class NoEnum(WhoseEnum): + ONE = 1 + self.assertEqual(TheirEnum.__dict__['_test1'], 'MyEnum') + self.assertEqual(WhoseEnum.__dict__['_test1'], 'MyEnum') + self.assertEqual(WhoseEnum.__dict__['_test2'], 'TheirEnum') + self.assertFalse(NoEnum.__dict__.get('_test1', False)) + self.assertFalse(NoEnum.__dict__.get('_test2', False)) + # + class OurEnum(MyEnum): + def __init_subclass__(cls, **kwds): + cls._test2 = 'OurEnum' + class WhereEnum(OurEnum): + def __init_subclass__(cls, **kwds): + pass + class NeverEnum(WhereEnum): + ONE = 1 + self.assertEqual(OurEnum.__dict__['_test1'], 'MyEnum') + self.assertFalse(WhereEnum.__dict__.get('_test1', False)) + self.assertEqual(WhereEnum.__dict__['_test2'], 'OurEnum') + self.assertFalse(NeverEnum.__dict__.get('_test1', False)) + self.assertFalse(NeverEnum.__dict__.get('_test2', False)) + class TestIntFlag(unittest.TestCase): """Tests of the IntFlags.""" diff --git a/Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst b/Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst new file mode 100644 index 00000000000000..7c94cdf40dd4cc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst @@ -0,0 +1 @@ +`Enum`: call `__init_subclass__` after members have been added From f2aa92d54febb690ee58ba8d2a596193764bbec2 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Wed, 9 Dec 2020 17:12:11 -0800 Subject: [PATCH 0758/1261] bpo-42517: [Enum] do not convert private names into members (GH-23722) private names, such as `_Color__hue` and `_Color__hue_` are now normal attributes, and do not become members nor raise exceptions --- Doc/library/enum.rst | 9 +++++++ Lib/enum.py | 19 +++++++++++++- Lib/test/test_enum.py | 25 +++++++++++++++++++ .../2020-12-09-10-59-16.bpo-42517.FKEVcZ.rst | 2 ++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-09-10-59-16.bpo-42517.FKEVcZ.rst diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 118002bef19f85..a9584b9c91083c 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -1164,6 +1164,15 @@ and raise an error if the two do not match:: In Python 2 code the :attr:`_order_` attribute is necessary as definition order is lost before it can be recorded. + +_Private__names +""""""""""""""" + +Private names are not converted to Enum members, but remain normal attributes. + +.. versionchanged:: 3.10 + + ``Enum`` member type """""""""""""""""""" diff --git a/Lib/enum.py b/Lib/enum.py index 83e050e1e41cde..74318c3b71deb4 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -49,6 +49,19 @@ def _is_sunder(name): name[-2:-1] != '_' ) +def _is_private(cls_name, name): + # do not use `re` as `re` imports `enum` + pattern = '_%s__' % (cls_name, ) + if ( + len(name) >= 5 + and name.startswith(pattern) + and name[len(pattern)] != '_' + and (name[-1] != '_' or name[-2] != '_') + ): + return True + else: + return False + def _make_class_unpicklable(cls): """ Make the given class un-picklable. @@ -89,7 +102,10 @@ def __setitem__(self, key, value): Single underscore (sunder) names are reserved. """ - if _is_sunder(key): + if _is_private(self._cls_name, key): + # do nothing, name will be a normal attribute + pass + elif _is_sunder(key): if key not in ( '_order_', '_create_pseudo_member_', '_generate_next_value_', '_missing_', '_ignore_', @@ -157,6 +173,7 @@ def __prepare__(metacls, cls, bases): metacls._check_for_existing_members(cls, bases) # create the namespace dict enum_dict = _EnumDict() + enum_dict._cls_name = cls # inherit previous flags and _generate_next_value_ function member_type, first_enum = metacls._get_mixins_(cls, bases) if first_enum is not None: diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 20bc5b3c750d61..7ca54e9a649ca8 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1149,6 +1149,7 @@ def test_multiple_mixin_mro(self): class auto_enum(type(Enum)): def __new__(metacls, cls, bases, classdict): temp = type(classdict)() + temp._cls_name = cls names = set(classdict._member_names) i = 0 for k in classdict._member_names: @@ -2155,6 +2156,30 @@ class NeverEnum(WhereEnum): self.assertFalse(NeverEnum.__dict__.get('_test2', False)) + @unittest.skipUnless( + sys.version_info[:2] == (3, 9), + 'private variables are now normal attributes', + ) + def test_warning_for_private_variables(self): + with self.assertWarns(DeprecationWarning): + class Private(Enum): + __corporal = 'Radar' + self.assertEqual(Private._Private__corporal.value, 'Radar') + try: + with self.assertWarns(DeprecationWarning): + class Private(Enum): + __major_ = 'Hoolihan' + except ValueError: + pass + + def test_private_variable_is_normal_attribute(self): + class Private(Enum): + __corporal = 'Radar' + __major_ = 'Hoolihan' + self.assertEqual(Private._Private__corporal, 'Radar') + self.assertEqual(Private._Private__major_, 'Hoolihan') + + class TestOrder(unittest.TestCase): def test_same_members(self): diff --git a/Misc/NEWS.d/next/Library/2020-12-09-10-59-16.bpo-42517.FKEVcZ.rst b/Misc/NEWS.d/next/Library/2020-12-09-10-59-16.bpo-42517.FKEVcZ.rst new file mode 100644 index 00000000000000..813139dfe5d005 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-09-10-59-16.bpo-42517.FKEVcZ.rst @@ -0,0 +1,2 @@ +Enum: private names do not become members / do not generate errors -- they +remain normal attributes From d55a1e599ecb05c3cfb1b1fbd8c5ae511b5c6ae4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 10 Dec 2020 18:39:17 +0100 Subject: [PATCH 0759/1261] bpo-42591: Export missing Py_FrozenMain() symbol (GH-23730) Export the Py_FrozenMain() function: fix a Python 3.9.0 regression. Python 3.9 uses -fvisibility=hidden and the function was not exported explicitly and so not exported. Add also Py_FrozenMain to the stable ABI on Windows. --- Include/pylifecycle.h | 2 ++ .../NEWS.d/next/C API/2020-12-10-10-43-03.bpo-42591.CXNY8G.rst | 3 +++ PC/python3dll.c | 1 + 3 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/C API/2020-12-10-10-43-03.bpo-42591.CXNY8G.rst diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index c5368b3c5edaa0..783fcb455eb528 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -32,6 +32,8 @@ PyAPI_FUNC(void) _Py_NO_RETURN Py_Exit(int); /* Bootstrap __main__ (defined in Modules/main.c) */ PyAPI_FUNC(int) Py_Main(int argc, wchar_t **argv); +PyAPI_FUNC(int) Py_FrozenMain(int argc, char **argv); + PyAPI_FUNC(int) Py_BytesMain(int argc, char **argv); /* In pathconfig.c */ diff --git a/Misc/NEWS.d/next/C API/2020-12-10-10-43-03.bpo-42591.CXNY8G.rst b/Misc/NEWS.d/next/C API/2020-12-10-10-43-03.bpo-42591.CXNY8G.rst new file mode 100644 index 00000000000000..3519859f7be89d --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-12-10-10-43-03.bpo-42591.CXNY8G.rst @@ -0,0 +1,3 @@ +Export the :c:func:`Py_FrozenMain` function: fix a Python 3.9.0 regression. +Python 3.9 uses ``-fvisibility=hidden`` and the function was not exported +explicitly and so not exported. diff --git a/PC/python3dll.c b/PC/python3dll.c index 27cc315de2dd19..9eb81e36af0013 100644 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -49,6 +49,7 @@ EXPORT_FUNC(Py_Exit) EXPORT_FUNC(Py_FatalError) EXPORT_FUNC(Py_Finalize) EXPORT_FUNC(Py_FinalizeEx) +EXPORT_FUNC(Py_FrozenMain) EXPORT_FUNC(Py_GenericAlias) EXPORT_FUNC(Py_GenericAliasType) EXPORT_FUNC(Py_GetArgcArgv) From e87bfa06519d75ca970d343b2b688c35f6710ddf Mon Sep 17 00:00:00 2001 From: vabr-g Date: Thu, 10 Dec 2020 19:35:28 +0100 Subject: [PATCH 0760/1261] bpo-41877: Improve docs for assert misspellings check in mock (GH-23729) This is a follow-up to https://github.com/python/cpython/commit/4662fa9bfe4a849fe87bfb321d8ef0956c89a772. That original commit expanded guards against misspelling assertions on mocks. This follow-up updates the documentation and improves the error message by pointing out the potential cause and solution. Automerge-Triggered-By: GH:gpshead --- Doc/library/unittest.mock.rst | 7 ++++--- Lib/unittest/mock.py | 5 +++-- Lib/unittest/test/testmock/testmock.py | 2 +- .../next/Library/2020-12-10-09-24-44.bpo-41877.iJSCvM.rst | 1 + 4 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-10-09-24-44.bpo-41877.iJSCvM.rst diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index c5360f91f518d6..f795a2e8c1aebf 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -262,9 +262,10 @@ the *new_callable* argument to :func:`patch`. this is a new Mock (created on first access). See the :attr:`return_value` attribute. - * *unsafe*: By default if any attribute starts with *assert* or - *assret* will raise an :exc:`AttributeError`. Passing ``unsafe=True`` - will allow access to these attributes. + * *unsafe*: By default, accessing any attribute with name starting with + *assert*, *assret*, *asert*, *aseert* or *assrt* will raise an + :exc:`AttributeError`. Passing ``unsafe=True`` will allow access to + these attributes. .. versionadded:: 3.5 diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 4db1bacf4b10cf..d43ea9e23c899c 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -632,8 +632,9 @@ def __getattr__(self, name): raise AttributeError(name) if not self._mock_unsafe: if name.startswith(('assert', 'assret', 'asert', 'aseert', 'assrt')): - raise AttributeError("Attributes cannot start with 'assert' " - "or its misspellings") + raise AttributeError( + f"{name} is not a valid assertion. Use a spec " + f"for the mock if {name} is meant to be an attribute.") result = self._mock_children.get(name) if result is _deleted: diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index dfcf1ef2ee0302..016905c3b90e5c 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1598,7 +1598,7 @@ def static_method(): pass #Issue21238 def test_mock_unsafe(self): m = Mock() - msg = "Attributes cannot start with 'assert' or its misspellings" + msg = "is not a valid assertion. Use a spec for the mock" with self.assertRaisesRegex(AttributeError, msg): m.assert_foo_call() with self.assertRaisesRegex(AttributeError, msg): diff --git a/Misc/NEWS.d/next/Library/2020-12-10-09-24-44.bpo-41877.iJSCvM.rst b/Misc/NEWS.d/next/Library/2020-12-10-09-24-44.bpo-41877.iJSCvM.rst new file mode 100644 index 00000000000000..df43cc5d0c9fa1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-10-09-24-44.bpo-41877.iJSCvM.rst @@ -0,0 +1 @@ +AttributeError for suspected misspellings of assertions on mocks are now pointing out that the cause are misspelled assertions and also what to do if the misspelling is actually an intended attribute name. The unittest.mock document is also updated to reflect the current set of recognised misspellings. \ No newline at end of file From f4e5ffa37365def11f4360d9cee70c65a49eefe2 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Thu, 10 Dec 2020 12:20:06 -0800 Subject: [PATCH 0761/1261] bpo-42385: [Enum] add `_generate_next_value_` to StrEnum (GH-23735) The default for auto() is to return an integer, which doesn't work for `StrEnum`. The new `_generate_next_value_` for `StrEnum` returns the member name, lower cased. --- Doc/library/enum.rst | 6 ++++-- Lib/enum.py | 6 ++++++ Lib/test/test_enum.py | 6 ++++++ .../next/Library/2020-12-09-19-45-32.bpo-42385.boGbjo.rst | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-09-19-45-32.bpo-42385.boGbjo.rst diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index a9584b9c91083c..a0b078c971706b 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -67,10 +67,12 @@ helper, :class:`auto`. .. class:: auto - Instances are replaced with an appropriate value for Enum members. By default, the initial value starts at 1. + Instances are replaced with an appropriate value for Enum members. + :class:`StrEnum` defaults to the lower-cased version of the member name, + while other Enums default to 1 and increase from there. .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` - +.. versionadded:: 3.10 ``StrEnum`` Creating an Enum ---------------- diff --git a/Lib/enum.py b/Lib/enum.py index 74318c3b71deb4..ed0c9ce72d01c4 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -826,6 +826,12 @@ def __new__(cls, *values): __str__ = str.__str__ + def _generate_next_value_(name, start, count, last_values): + """ + Return the lower-cased version of the member name. + """ + return name.lower() + def _reduce_ex_by_name(self, proto): return self.name diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 7ca54e9a649ca8..f245eb6ccaeeeb 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2179,6 +2179,12 @@ class Private(Enum): self.assertEqual(Private._Private__corporal, 'Radar') self.assertEqual(Private._Private__major_, 'Hoolihan') + def test_strenum_auto(self): + class Strings(StrEnum): + ONE = auto() + TWO = auto() + self.assertEqual([Strings.ONE, Strings.TWO], ['one', 'two']) + class TestOrder(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2020-12-09-19-45-32.bpo-42385.boGbjo.rst b/Misc/NEWS.d/next/Library/2020-12-09-19-45-32.bpo-42385.boGbjo.rst new file mode 100644 index 00000000000000..f95da859b03881 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-09-19-45-32.bpo-42385.boGbjo.rst @@ -0,0 +1 @@ +StrEnum: fix _generate_next_value_ to return a str From f1f2c70e4fb674c87c4f77f8ff26f19642ca4cab Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Thu, 10 Dec 2020 13:07:00 -0800 Subject: [PATCH 0762/1261] bpo-34750: [Enum] add `_EnumDict.update()` support (GH-23725) This allows easier Enum construction in unusual cases, such as including dynamic member definitions into a class definition: # created dynamically foo_defines = {'FOO_CAT': 'aloof', 'BAR_DOG': 'friendly', 'FOO_HORSE': 'big'} class Foo(Enum): vars().update({ k: v for k, v in foo_defines.items() if k.startswith('FOO_') }) def upper(self): # example method return self.value.upper() --- Lib/enum.py | 12 +++++++- Lib/test/test_enum.py | 28 +++++++++++++++++++ .../2020-12-09-14-15-48.bpo-34750.x8TASR.rst | 1 + 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-09-14-15-48.bpo-34750.x8TASR.rst diff --git a/Lib/enum.py b/Lib/enum.py index ed0c9ce72d01c4..0070ebe136353a 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -136,7 +136,7 @@ def __setitem__(self, key, value): key = '_order_' elif key in self._member_names: # descriptor overwriting an enum? - raise TypeError('Attempted to reuse key: %r' % key) + raise TypeError('%r already defined as: %r' % (key, self[key])) elif key in self._ignore: pass elif not _is_descriptor(value): @@ -157,6 +157,16 @@ def __setitem__(self, key, value): self._last_values.append(value) super().__setitem__(key, value) + def update(self, members, **more_members): + try: + for name in members.keys(): + self[name] = members[name] + except AttributeError: + for name, value in members: + self[name] = value + for name, value in more_members.items(): + self[name] = value + # Dummy value for Enum as EnumMeta explicitly checks for it, but of course # until EnumMeta finishes running the first time the Enum class doesn't exist. diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index f245eb6ccaeeeb..a83241cbb577a4 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2186,6 +2186,34 @@ class Strings(StrEnum): self.assertEqual([Strings.ONE, Strings.TWO], ['one', 'two']) + def test_dynamic_members_with_static_methods(self): + # + foo_defines = {'FOO_CAT': 'aloof', 'BAR_DOG': 'friendly', 'FOO_HORSE': 'big'} + class Foo(Enum): + vars().update({ + k: v + for k, v in foo_defines.items() + if k.startswith('FOO_') + }) + def upper(self): + return self.value.upper() + self.assertEqual(list(Foo), [Foo.FOO_CAT, Foo.FOO_HORSE]) + self.assertEqual(Foo.FOO_CAT.value, 'aloof') + self.assertEqual(Foo.FOO_HORSE.upper(), 'BIG') + # + with self.assertRaisesRegex(TypeError, "'FOO_CAT' already defined as: 'aloof'"): + class FooBar(Enum): + vars().update({ + k: v + for k, v in foo_defines.items() + if k.startswith('FOO_') + }, + **{'FOO_CAT': 'small'}, + ) + def upper(self): + return self.value.upper() + + class TestOrder(unittest.TestCase): def test_same_members(self): diff --git a/Misc/NEWS.d/next/Library/2020-12-09-14-15-48.bpo-34750.x8TASR.rst b/Misc/NEWS.d/next/Library/2020-12-09-14-15-48.bpo-34750.x8TASR.rst new file mode 100644 index 00000000000000..c98ba14797af95 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-09-14-15-48.bpo-34750.x8TASR.rst @@ -0,0 +1 @@ +[Enum] `_EnumDict.update()` is now supported From f6fe04f5d51ff5cfe13345edef02ce1fa6797eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Gr=C3=B6nholm?= Date: Thu, 10 Dec 2020 23:49:05 +0200 Subject: [PATCH 0763/1261] bpo-42059: Fix required/optional keys for TypedDict(..., total=False) (GH-22736) --- Lib/test/test_typing.py | 4 ++++ Lib/typing.py | 4 ++-- .../next/Library/2020-10-17-12-42-08.bpo-42059.ZGMZ3D.rst | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-17-12-42-08.bpo-42059.ZGMZ3D.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 8ffc7f40cebdd2..f3e38b6f47d1e1 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3895,10 +3895,14 @@ def test_total(self): self.assertEqual(D(), {}) self.assertEqual(D(x=1), {'x': 1}) self.assertEqual(D.__total__, False) + self.assertEqual(D.__required_keys__, frozenset()) + self.assertEqual(D.__optional_keys__, {'x'}) self.assertEqual(Options(), {}) self.assertEqual(Options(log_level=2), {'log_level': 2}) self.assertEqual(Options.__total__, False) + self.assertEqual(Options.__required_keys__, frozenset()) + self.assertEqual(Options.__optional_keys__, {'log_level', 'log_path'}) def test_optional_keys(self): class Point2Dor3D(Point2D, total=False): diff --git a/Lib/typing.py b/Lib/typing.py index 46c54c406992f7..148a505dad176a 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -2043,14 +2043,14 @@ class body be required. raise TypeError("TypedDict takes either a dict or keyword arguments," " but not both") - ns = {'__annotations__': dict(fields), '__total__': total} + ns = {'__annotations__': dict(fields)} try: # Setting correct module is necessary to make typed dict classes pickleable. ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') except (AttributeError, ValueError): pass - return _TypedDictMeta(typename, (), ns) + return _TypedDictMeta(typename, (), ns, total=total) _TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {}) TypedDict.__mro_entries__ = lambda bases: (_TypedDict,) diff --git a/Misc/NEWS.d/next/Library/2020-10-17-12-42-08.bpo-42059.ZGMZ3D.rst b/Misc/NEWS.d/next/Library/2020-10-17-12-42-08.bpo-42059.ZGMZ3D.rst new file mode 100644 index 00000000000000..3f18824fe65987 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-17-12-42-08.bpo-42059.ZGMZ3D.rst @@ -0,0 +1 @@ +:class:`typing.TypedDict` types created using the alternative call-style syntax now correctly respect the ``total`` keyword argument when setting their ``__required_keys__`` and ``__optional_keys__`` class attributes. From 70e3781bd2c2940b5c4d6a0c524ed0b630f025a7 Mon Sep 17 00:00:00 2001 From: Nick Gaya Date: Fri, 11 Dec 2020 00:27:35 -0800 Subject: [PATCH 0764/1261] bpo-41879: Doc: Fix description of async for statement (GH-23548) Fix the wording in the documentation of `async for` to correctly describe asynchronous iterables. This fix is relevant for version 3.7 onward. --- Doc/reference/compound_stmts.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 62986cb151964a..a55aacccc16dfe 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -796,12 +796,12 @@ The :keyword:`!async for` statement .. productionlist:: python-grammar async_for_stmt: "async" `for_stmt` -An :term:`asynchronous iterable` is able to call asynchronous code in its -*iter* implementation, and :term:`asynchronous iterator` can call asynchronous -code in its *next* method. +An :term:`asynchronous iterable` provides an ``__aiter__`` method that directly +returns an :term:`asynchronous iterator`, which can call asynchronous code in +its ``__anext__`` method. The ``async for`` statement allows convenient iteration over asynchronous -iterators. +iterables. The following code:: From f5d485f2cdbe585aaec63753ec7fbdb3cf34708f Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Sat, 12 Dec 2020 13:26:44 -0800 Subject: [PATCH 0765/1261] bpo-39717: [tarfile] update nested exception raising (GH-23739) - `from None` if the new exception uses, or doesn't need, the previous one - `from e` if the previous exception is still relevant --- Lib/tarfile.py | 65 ++++++++++--------- .../2020-12-10-18-36-52.bpo-39717.sK2u0w.rst | 1 + 2 files changed, 34 insertions(+), 32 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-10-18-36-52.bpo-39717.sK2u0w.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 1d15612616f1d8..395c0f1d30040d 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -200,6 +200,7 @@ def itn(n, digits=8, format=DEFAULT_FORMAT): # base-256 representation. This allows values up to (256**(digits-1))-1. # A 0o200 byte indicates a positive number, a 0o377 byte a negative # number. + original_n = n n = int(n) if 0 <= n < 8 ** (digits - 1): s = bytes("%0*o" % (digits - 1, n), "ascii") + NUL @@ -363,7 +364,7 @@ def __init__(self, name, mode, comptype, fileobj, bufsize): try: import zlib except ImportError: - raise CompressionError("zlib module is not available") + raise CompressionError("zlib module is not available") from None self.zlib = zlib self.crc = zlib.crc32(b"") if mode == "r": @@ -376,7 +377,7 @@ def __init__(self, name, mode, comptype, fileobj, bufsize): try: import bz2 except ImportError: - raise CompressionError("bz2 module is not available") + raise CompressionError("bz2 module is not available") from None if mode == "r": self.dbuf = b"" self.cmp = bz2.BZ2Decompressor() @@ -388,7 +389,7 @@ def __init__(self, name, mode, comptype, fileobj, bufsize): try: import lzma except ImportError: - raise CompressionError("lzma module is not available") + raise CompressionError("lzma module is not available") from None if mode == "r": self.dbuf = b"" self.cmp = lzma.LZMADecompressor() @@ -541,8 +542,8 @@ def _read(self, size): break try: buf = self.cmp.decompress(buf) - except self.exception: - raise ReadError("invalid compressed data") + except self.exception as e: + raise ReadError("invalid compressed data") from e t.append(buf) c += len(buf) t = b"".join(t) @@ -1164,8 +1165,8 @@ def _proc_gnulong(self, tarfile): # Fetch the next header and process it. try: next = self.fromtarfile(tarfile) - except HeaderError: - raise SubsequentHeaderError("missing or bad subsequent header") + except HeaderError as e: + raise SubsequentHeaderError(str(e)) from None # Patch the TarInfo object from the next header with # the longname information. @@ -1277,8 +1278,8 @@ def _proc_pax(self, tarfile): # Fetch the next header. try: next = self.fromtarfile(tarfile) - except HeaderError: - raise SubsequentHeaderError("missing or bad subsequent header") + except HeaderError as e: + raise SubsequentHeaderError(str(e)) from None # Process GNU sparse information. if "GNU.sparse.map" in pax_headers: @@ -1533,7 +1534,7 @@ def __init__(self, name=None, mode="r", fileobj=None, format=None, self.fileobj.seek(self.offset) break except HeaderError as e: - raise ReadError(str(e)) + raise ReadError(str(e)) from None if self.mode in ("a", "w", "x"): self._loaded = True @@ -1669,21 +1670,21 @@ def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): try: from gzip import GzipFile except ImportError: - raise CompressionError("gzip module is not available") + raise CompressionError("gzip module is not available") from None try: fileobj = GzipFile(name, mode + "b", compresslevel, fileobj) - except OSError: + except OSError as e: if fileobj is not None and mode == 'r': - raise ReadError("not a gzip file") + raise ReadError("not a gzip file") from e raise try: t = cls.taropen(name, mode, fileobj, **kwargs) - except OSError: + except OSError as e: fileobj.close() if mode == 'r': - raise ReadError("not a gzip file") + raise ReadError("not a gzip file") from e raise except: fileobj.close() @@ -1702,16 +1703,16 @@ def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): try: from bz2 import BZ2File except ImportError: - raise CompressionError("bz2 module is not available") + raise CompressionError("bz2 module is not available") from None fileobj = BZ2File(fileobj or name, mode, compresslevel=compresslevel) try: t = cls.taropen(name, mode, fileobj, **kwargs) - except (OSError, EOFError): + except (OSError, EOFError) as e: fileobj.close() if mode == 'r': - raise ReadError("not a bzip2 file") + raise ReadError("not a bzip2 file") from e raise except: fileobj.close() @@ -1730,16 +1731,16 @@ def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs): try: from lzma import LZMAFile, LZMAError except ImportError: - raise CompressionError("lzma module is not available") + raise CompressionError("lzma module is not available") from None fileobj = LZMAFile(fileobj or name, mode, preset=preset) try: t = cls.taropen(name, mode, fileobj, **kwargs) - except (LZMAError, EOFError): + except (LZMAError, EOFError) as e: fileobj.close() if mode == 'r': - raise ReadError("not an lzma file") + raise ReadError("not an lzma file") from e raise except: fileobj.close() @@ -2253,7 +2254,7 @@ def makelink(self, tarinfo, targetpath): self._extract_member(self._find_link_target(tarinfo), targetpath) except KeyError: - raise ExtractError("unable to resolve link inside archive") + raise ExtractError("unable to resolve link inside archive") from None def chown(self, tarinfo, targetpath, numeric_owner): """Set owner of targetpath according to tarinfo. If numeric_owner @@ -2281,16 +2282,16 @@ def chown(self, tarinfo, targetpath, numeric_owner): os.lchown(targetpath, u, g) else: os.chown(targetpath, u, g) - except OSError: - raise ExtractError("could not change owner") + except OSError as e: + raise ExtractError("could not change owner") from e def chmod(self, tarinfo, targetpath): """Set file permissions of targetpath according to tarinfo. """ try: os.chmod(targetpath, tarinfo.mode) - except OSError: - raise ExtractError("could not change mode") + except OSError as e: + raise ExtractError("could not change mode") from e def utime(self, tarinfo, targetpath): """Set modification time of targetpath according to tarinfo. @@ -2299,8 +2300,8 @@ def utime(self, tarinfo, targetpath): return try: os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) - except OSError: - raise ExtractError("could not change modification time") + except OSError as e: + raise ExtractError("could not change modification time") from e #-------------------------------------------------------------------------- def next(self): @@ -2336,15 +2337,15 @@ def next(self): self.offset += BLOCKSIZE continue elif self.offset == 0: - raise ReadError(str(e)) + raise ReadError(str(e)) from None except EmptyHeaderError: if self.offset == 0: - raise ReadError("empty file") + raise ReadError("empty file") from None except TruncatedHeaderError as e: if self.offset == 0: - raise ReadError(str(e)) + raise ReadError(str(e)) from None except SubsequentHeaderError as e: - raise ReadError(str(e)) + raise ReadError(str(e)) from None break if tarinfo is not None: diff --git a/Misc/NEWS.d/next/Library/2020-12-10-18-36-52.bpo-39717.sK2u0w.rst b/Misc/NEWS.d/next/Library/2020-12-10-18-36-52.bpo-39717.sK2u0w.rst new file mode 100644 index 00000000000000..fcbf99925208b0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-10-18-36-52.bpo-39717.sK2u0w.rst @@ -0,0 +1 @@ +[tarfile] update nested exception raising to use `from None` or `from e` From 24a568ab73c8106a6f6c1d8f28ad8a858dae2a24 Mon Sep 17 00:00:00 2001 From: sblondon Date: Sun, 13 Dec 2020 06:27:22 +0100 Subject: [PATCH 0766/1261] Add two spaces around equal sign (#23719) Fit to PEP8 coding style --- Doc/library/subprocess.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 292f8be20aa987..7f947efcb6766b 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -1281,7 +1281,7 @@ be used directly: becomes:: - output=check_output("dmesg | grep hda", shell=True) + output = check_output("dmesg | grep hda", shell=True) Replacing :func:`os.system` From b3d8cd6a15a0041ad3598fc29f0ee7746486a484 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 13 Dec 2020 16:46:48 +0000 Subject: [PATCH 0767/1261] bpo-30858: Improve error location for expressions with assignments (GH-23753) Co-authored-by: Lysandros Nikolaou --- Grammar/python.gram | 2 +- Lib/test/test_exceptions.py | 2 +- Lib/test/test_syntax.py | 7 +++++++ .../2020-12-13-15-23-09.bpo-30858.-f9G4z.rst | 2 ++ Parser/parser.c | 8 ++++---- 5 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-13-15-23-09.bpo-30858.-f9G4z.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index 9f4709491469d8..4915cc43e84adc 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -646,7 +646,7 @@ invalid_arguments: RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "Generator expression must be parenthesized") } | a=args ',' args { _PyPegen_arguments_parsing_error(p, a) } invalid_kwarg: - | a=expression '=' { + | expression a='=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION( a, "expression cannot contain assignment, perhaps you meant \"==\"?") } invalid_named_expression: diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 1bdd3f2ce59934..e752ab72ccff33 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -252,7 +252,7 @@ def baz(): check('from __future__ import doesnt_exist', 1, 1) check('from __future__ import braces', 1, 1) check('x=1\nfrom __future__ import division', 2, 1) - check('foo(1=2)', 1, 5) + check('foo(1=2)', 1, 6) check('def f():\n x, y: int', 2, 3) check('[*x for x in xs]', 1, 2) check('foo(x for x in range(10), 100)', 1, 5) diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 91ca1db43a74f2..d8255607dcfd5c 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -802,6 +802,13 @@ def _check_error(self, code, errtext, else: self.fail("compile() did not raise SyntaxError") + def test_expression_with_assignment(self): + self._check_error( + "print(end1 + end2 = ' ')", + 'expression cannot contain assignment, perhaps you meant "=="?', + offset=19 + ) + def test_curly_brace_after_primary_raises_immediately(self): self._check_error("f{", "invalid syntax", mode="single") diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-13-15-23-09.bpo-30858.-f9G4z.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-13-15-23-09.bpo-30858.-f9G4z.rst new file mode 100644 index 00000000000000..f2d06c3009ca5d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-12-13-15-23-09.bpo-30858.-f9G4z.rst @@ -0,0 +1,2 @@ +Improve error location in expressions that contain assignments. Patch by +Pablo Galindo and Lysandros Nikolaou. diff --git a/Parser/parser.c b/Parser/parser.c index b6c04953c899e0..2559969f86e516 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -14562,12 +14562,12 @@ invalid_kwarg_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_kwarg[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression '='")); - Token * _literal; - expr_ty a; + Token * a; + expr_ty expression_var; if ( - (a = expression_rule(p)) // expression + (expression_var = expression_rule(p)) // expression && - (_literal = _PyPegen_expect_token(p, 22)) // token='=' + (a = _PyPegen_expect_token(p, 22)) // token='=' ) { D(fprintf(stderr, "%*c+ invalid_kwarg[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression '='")); From 0db4bb84767e47aaa06514fb3fcc7397a663c919 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Mon, 14 Dec 2020 02:38:24 +0800 Subject: [PATCH 0768/1261] bpo-42195: Ensure consistency of Callable's __args__ in collections.abc and typing (GH-23060) --- Lib/_collections_abc.py | 69 ++++++++++++++++++- Lib/collections/abc.py | 1 + Lib/test/test_genericalias.py | 58 +++++++++++++++- Lib/test/test_types.py | 12 ++-- Lib/test/test_typing.py | 26 ++----- Lib/typing.py | 32 +++++---- .../2020-11-20-00-57-47.bpo-42195.HeqcpS.rst | 11 +++ Objects/genericaliasobject.c | 60 ++++++++++------ Objects/unionobject.c | 6 +- 9 files changed, 212 insertions(+), 63 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index 28690f8c0bdc5c..7c3faa64ea7f98 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -10,6 +10,10 @@ import sys GenericAlias = type(list[int]) +EllipsisType = type(...) +def _f(): pass +FunctionType = type(_f) +del _f __all__ = ["Awaitable", "Coroutine", "AsyncIterable", "AsyncIterator", "AsyncGenerator", @@ -409,6 +413,69 @@ def __subclasshook__(cls, C): return NotImplemented +class _CallableGenericAlias(GenericAlias): + """ Represent `Callable[argtypes, resulttype]`. + + This sets ``__args__`` to a tuple containing the flattened``argtypes`` + followed by ``resulttype``. + + Example: ``Callable[[int, str], float]`` sets ``__args__`` to + ``(int, str, float)``. + """ + + __slots__ = () + + def __new__(cls, origin, args): + return cls.__create_ga(origin, args) + + @classmethod + def __create_ga(cls, origin, args): + if not isinstance(args, tuple) or len(args) != 2: + raise TypeError( + "Callable must be used as Callable[[arg, ...], result].") + t_args, t_result = args + if isinstance(t_args, list): + ga_args = tuple(t_args) + (t_result,) + # This relaxes what t_args can be on purpose to allow things like + # PEP 612 ParamSpec. Responsibility for whether a user is using + # Callable[...] properly is deferred to static type checkers. + else: + ga_args = args + return super().__new__(cls, origin, ga_args) + + def __repr__(self): + if len(self.__args__) == 2 and self.__args__[0] is Ellipsis: + return super().__repr__() + return (f'collections.abc.Callable' + f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], ' + f'{_type_repr(self.__args__[-1])}]') + + def __reduce__(self): + args = self.__args__ + if not (len(args) == 2 and args[0] is Ellipsis): + args = list(args[:-1]), args[-1] + return _CallableGenericAlias, (Callable, args) + + +def _type_repr(obj): + """Return the repr() of an object, special-casing types (internal helper). + + Copied from :mod:`typing` since collections.abc + shouldn't depend on that module. + """ + if isinstance(obj, GenericAlias): + return repr(obj) + if isinstance(obj, type): + if obj.__module__ == 'builtins': + return obj.__qualname__ + return f'{obj.__module__}.{obj.__qualname__}' + if obj is Ellipsis: + return '...' + if isinstance(obj, FunctionType): + return obj.__name__ + return repr(obj) + + class Callable(metaclass=ABCMeta): __slots__ = () @@ -423,7 +490,7 @@ def __subclasshook__(cls, C): return _check_methods(C, "__call__") return NotImplemented - __class_getitem__ = classmethod(GenericAlias) + __class_getitem__ = classmethod(_CallableGenericAlias) ### SETS ### diff --git a/Lib/collections/abc.py b/Lib/collections/abc.py index 891600d16bee9e..86ca8b8a8414b3 100644 --- a/Lib/collections/abc.py +++ b/Lib/collections/abc.py @@ -1,2 +1,3 @@ from _collections_abc import * from _collections_abc import __all__ +from _collections_abc import _CallableGenericAlias diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index c113e538248e9c..5de13fe6d2f68c 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -62,7 +62,6 @@ class BaseTest(unittest.TestCase): Iterable, Iterator, Reversible, Container, Collection, - Callable, Mailbox, _PartialFile, ContextVar, Token, Field, @@ -307,6 +306,63 @@ def test_no_kwargs(self): with self.assertRaises(TypeError): GenericAlias(bad=float) + def test_subclassing_types_genericalias(self): + class SubClass(GenericAlias): ... + alias = SubClass(list, int) + class Bad(GenericAlias): + def __new__(cls, *args, **kwargs): + super().__new__(cls, *args, **kwargs) + + self.assertEqual(alias, list[int]) + with self.assertRaises(TypeError): + Bad(list, int, bad=int) + + def test_abc_callable(self): + # A separate test is needed for Callable since it uses a subclass of + # GenericAlias. + alias = Callable[[int, str], float] + with self.subTest("Testing subscription"): + self.assertIs(alias.__origin__, Callable) + self.assertEqual(alias.__args__, (int, str, float)) + self.assertEqual(alias.__parameters__, ()) + + with self.subTest("Testing instance checks"): + self.assertIsInstance(alias, GenericAlias) + + with self.subTest("Testing weakref"): + self.assertEqual(ref(alias)(), alias) + + with self.subTest("Testing pickling"): + s = pickle.dumps(alias) + loaded = pickle.loads(s) + self.assertEqual(alias.__origin__, loaded.__origin__) + self.assertEqual(alias.__args__, loaded.__args__) + self.assertEqual(alias.__parameters__, loaded.__parameters__) + + with self.subTest("Testing TypeVar substitution"): + C1 = Callable[[int, T], T] + C2 = Callable[[K, T], V] + C3 = Callable[..., T] + self.assertEqual(C1[str], Callable[[int, str], str]) + self.assertEqual(C2[int, float, str], Callable[[int, float], str]) + self.assertEqual(C3[int], Callable[..., int]) + + with self.subTest("Testing type erasure"): + class C1(Callable): + def __call__(self): + return None + a = C1[[int], T] + self.assertIs(a().__class__, C1) + self.assertEqual(a().__orig_class__, C1[[int], T]) + + # bpo-42195 + with self.subTest("Testing collections.abc.Callable's consistency " + "with typing.Callable"): + c1 = typing.Callable[[int, str], dict] + c2 = Callable[[int, str], dict] + self.assertEqual(c1.__args__, c2.__args__) + self.assertEqual(hash(c1.__args__), hash(c2.__args__)) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 3058a02d6eeb4a..83196ad3c17436 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -717,14 +717,16 @@ def test_or_type_operator_with_genericalias(self): a = list[int] b = list[str] c = dict[float, str] + class SubClass(types.GenericAlias): ... + d = SubClass(list, float) # equivalence with typing.Union - self.assertEqual(a | b | c, typing.Union[a, b, c]) + self.assertEqual(a | b | c | d, typing.Union[a, b, c, d]) # de-duplicate - self.assertEqual(a | c | b | b | a | c, a | b | c) + self.assertEqual(a | c | b | b | a | c | d | d, a | b | c | d) # order shouldn't matter - self.assertEqual(a | b, b | a) - self.assertEqual(repr(a | b | c), - "list[int] | list[str] | dict[float, str]") + self.assertEqual(a | b | d, b | a | d) + self.assertEqual(repr(a | b | c | d), + "list[int] | list[str] | dict[float, str] | list[float]") class BadType(type): def __eq__(self, other): diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index f3e38b6f47d1e1..8e86e769a0d833 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -446,14 +446,6 @@ def test_cannot_instantiate(self): type(c)() def test_callable_wrong_forms(self): - with self.assertRaises(TypeError): - Callable[[...], int] - with self.assertRaises(TypeError): - Callable[(), int] - with self.assertRaises(TypeError): - Callable[[()], int] - with self.assertRaises(TypeError): - Callable[[int, 1], 2] with self.assertRaises(TypeError): Callable[int] @@ -1807,10 +1799,9 @@ def barfoo2(x: CT): ... def test_extended_generic_rules_subclassing(self): class T1(Tuple[T, KT]): ... class T2(Tuple[T, ...]): ... - class C1(Callable[[T], T]): ... - class C2(Callable[..., int]): - def __call__(self): - return None + class C1(typing.Container[T]): + def __contains__(self, item): + return False self.assertEqual(T1.__parameters__, (T, KT)) self.assertEqual(T1[int, str].__args__, (int, str)) @@ -1824,10 +1815,9 @@ def __call__(self): ## T2[int, str] self.assertEqual(repr(C1[int]).split('.')[-1], 'C1[int]') - self.assertEqual(C2.__parameters__, ()) - self.assertIsInstance(C2(), collections.abc.Callable) - self.assertIsSubclass(C2, collections.abc.Callable) - self.assertIsSubclass(C1, collections.abc.Callable) + self.assertEqual(C1.__parameters__, (T,)) + self.assertIsInstance(C1(), collections.abc.Container) + self.assertIsSubclass(C1, collections.abc.Container) self.assertIsInstance(T1(), tuple) self.assertIsSubclass(T2, tuple) with self.assertRaises(TypeError): @@ -1861,10 +1851,6 @@ def test_type_erasure_special(self): class MyTup(Tuple[T, T]): ... self.assertIs(MyTup[int]().__class__, MyTup) self.assertEqual(MyTup[int]().__orig_class__, MyTup[int]) - class MyCall(Callable[..., T]): - def __call__(self): return None - self.assertIs(MyCall[T]().__class__, MyCall) - self.assertEqual(MyCall[T]().__orig_class__, MyCall[T]) class MyDict(typing.Dict[T, T]): ... self.assertIs(MyDict[int]().__class__, MyDict) self.assertEqual(MyDict[int]().__orig_class__, MyDict[int]) diff --git a/Lib/typing.py b/Lib/typing.py index 148a505dad176a..7f07321cda82a7 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -120,6 +120,16 @@ # namespace, but excluded from __all__ because they might stomp on # legitimate imports of those modules. + +def _type_convert(arg): + """For converting None to type(None), and strings to ForwardRef.""" + if arg is None: + return type(None) + if isinstance(arg, str): + return ForwardRef(arg) + return arg + + def _type_check(arg, msg, is_argument=True): """Check that the argument is a type, and return it (internal helper). @@ -136,10 +146,7 @@ def _type_check(arg, msg, is_argument=True): if is_argument: invalid_generic_forms = invalid_generic_forms + (ClassVar, Final) - if arg is None: - return type(None) - if isinstance(arg, str): - return ForwardRef(arg) + arg = _type_convert(arg) if (isinstance(arg, _GenericAlias) and arg.__origin__ in invalid_generic_forms): raise TypeError(f"{arg} is not valid as type argument") @@ -900,13 +907,13 @@ def __getitem__(self, params): raise TypeError("Callable must be used as " "Callable[[arg, ...], result].") args, result = params - if args is Ellipsis: - params = (Ellipsis, result) - else: - if not isinstance(args, list): - raise TypeError(f"Callable[args, result]: args must be a list." - f" Got {args}") + # This relaxes what args can be on purpose to allow things like + # PEP 612 ParamSpec. Responsibility for whether a user is using + # Callable[...] properly is deferred to static type checkers. + if isinstance(args, list): params = (tuple(args), result) + else: + params = (args, result) return self.__getitem_inner__(params) @_tp_cache @@ -916,8 +923,9 @@ def __getitem_inner__(self, params): result = _type_check(result, msg) if args is Ellipsis: return self.copy_with((_TypingEllipsis, result)) - msg = "Callable[[arg, ...], result]: each arg must be a type." - args = tuple(_type_check(arg, msg) for arg in args) + if not isinstance(args, tuple): + args = (args,) + args = tuple(_type_convert(arg) for arg in args) params = args + (result,) return self.copy_with(params) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst new file mode 100644 index 00000000000000..ac52a008e352f5 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst @@ -0,0 +1,11 @@ +The ``__args__`` of the parameterized generics for :data:`typing.Callable` +and :class:`collections.abc.Callable` are now consistent. The ``__args__`` +for :class:`collections.abc.Callable` are now flattened while +:data:`typing.Callable`'s have not changed. To allow this change, +:class:`types.GenericAlias` can now be subclassed and +``collections.abc.Callable``'s ``__class_getitem__`` will now return a subclass +of ``types.GenericAlias``. Tests for typing were also updated to not subclass +things like ``Callable[..., T]`` as that is not a valid base class. Finally, +both ``Callable``s no longer validate their ``argtypes``, in +``Callable[[argtypes], resulttype]`` to prepare for :pep:`612`. Patch by Ken Jin. + diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 51a12377b7e308..756a7ce474aee9 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -429,8 +429,8 @@ ga_getattro(PyObject *self, PyObject *name) static PyObject * ga_richcompare(PyObject *a, PyObject *b, int op) { - if (!Py_IS_TYPE(a, &Py_GenericAliasType) || - !Py_IS_TYPE(b, &Py_GenericAliasType) || + if (!PyObject_TypeCheck(a, &Py_GenericAliasType) || + !PyObject_TypeCheck(b, &Py_GenericAliasType) || (op != Py_EQ && op != Py_NE)) { Py_RETURN_NOTIMPLEMENTED; @@ -564,6 +564,29 @@ static PyGetSetDef ga_properties[] = { {0} }; +/* A helper function to create GenericAlias' args tuple and set its attributes. + * Returns 1 on success, 0 on failure. + */ +static inline int +setup_ga(gaobject *alias, PyObject *origin, PyObject *args) { + if (!PyTuple_Check(args)) { + args = PyTuple_Pack(1, args); + if (args == NULL) { + return 0; + } + } + else { + Py_INCREF(args); + } + + Py_INCREF(origin); + alias->origin = origin; + alias->args = args; + alias->parameters = NULL; + alias->weakreflist = NULL; + return 1; +} + static PyObject * ga_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { @@ -575,7 +598,15 @@ ga_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } PyObject *origin = PyTuple_GET_ITEM(args, 0); PyObject *arguments = PyTuple_GET_ITEM(args, 1); - return Py_GenericAlias(origin, arguments); + gaobject *self = (gaobject *)type->tp_alloc(type, 0); + if (self == NULL) { + return NULL; + } + if (!setup_ga(self, origin, arguments)) { + type->tp_free((PyObject *)self); + return NULL; + } + return (PyObject *)self; } static PyNumberMethods ga_as_number = { @@ -600,7 +631,7 @@ PyTypeObject Py_GenericAliasType = { .tp_hash = ga_hash, .tp_call = ga_call, .tp_getattro = ga_getattro, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, .tp_traverse = ga_traverse, .tp_richcompare = ga_richcompare, .tp_weaklistoffset = offsetof(gaobject, weakreflist), @@ -615,27 +646,14 @@ PyTypeObject Py_GenericAliasType = { PyObject * Py_GenericAlias(PyObject *origin, PyObject *args) { - if (!PyTuple_Check(args)) { - args = PyTuple_Pack(1, args); - if (args == NULL) { - return NULL; - } - } - else { - Py_INCREF(args); - } - gaobject *alias = PyObject_GC_New(gaobject, &Py_GenericAliasType); if (alias == NULL) { - Py_DECREF(args); return NULL; } - - Py_INCREF(origin); - alias->origin = origin; - alias->args = args; - alias->parameters = NULL; - alias->weakreflist = NULL; + if (!setup_ga(alias, origin, args)) { + PyObject_GC_Del((PyObject *)alias); + return NULL; + } _PyObject_GC_TRACK(alias); return (PyObject *)alias; } diff --git a/Objects/unionobject.c b/Objects/unionobject.c index 2308bfc9f2a278..32aa5078afcef4 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -237,8 +237,8 @@ dedup_and_flatten_args(PyObject* args) PyObject* i_element = PyTuple_GET_ITEM(args, i); for (Py_ssize_t j = i + 1; j < arg_length; j++) { PyObject* j_element = PyTuple_GET_ITEM(args, j); - int is_ga = Py_TYPE(i_element) == &Py_GenericAliasType && - Py_TYPE(j_element) == &Py_GenericAliasType; + int is_ga = PyObject_TypeCheck(i_element, &Py_GenericAliasType) && + PyObject_TypeCheck(j_element, &Py_GenericAliasType); // RichCompare to also deduplicate GenericAlias types (slower) is_duplicate = is_ga ? PyObject_RichCompareBool(i_element, j_element, Py_EQ) : i_element == j_element; @@ -296,7 +296,7 @@ is_unionable(PyObject *obj) is_new_type(obj) || is_special_form(obj) || PyType_Check(obj) || - type == &Py_GenericAliasType || + PyObject_TypeCheck(obj, &Py_GenericAliasType) || type == &_Py_UnionType); } From 0bc60b8e573940c12b70ed441f631bd54c4f8623 Mon Sep 17 00:00:00 2001 From: Joshua Root Date: Mon, 14 Dec 2020 07:56:34 +1100 Subject: [PATCH 0769/1261] bpo-42598: Fix implicit function declarations in configure (GH-23690) This is invalid in C99 and later and is an error with some compilers (e.g. clang in Xcode 12), and can thus cause configure checks to produce incorrect results. --- .../Build/2020-12-13-14-43-10.bpo-42598.7ipr5H.rst | 2 ++ configure | 13 +++++++------ configure.ac | 13 +++++++------ 3 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-12-13-14-43-10.bpo-42598.7ipr5H.rst diff --git a/Misc/NEWS.d/next/Build/2020-12-13-14-43-10.bpo-42598.7ipr5H.rst b/Misc/NEWS.d/next/Build/2020-12-13-14-43-10.bpo-42598.7ipr5H.rst new file mode 100644 index 00000000000000..7dafc105c45ea9 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-12-13-14-43-10.bpo-42598.7ipr5H.rst @@ -0,0 +1,2 @@ +Fix implicit function declarations in configure which could have resulted in +incorrect configuration checks. Patch contributed by Joshua Root. diff --git a/configure b/configure index 9ee750b70f4a19..0c0aee96d507d2 100755 --- a/configure +++ b/configure @@ -11108,10 +11108,10 @@ else main() { pthread_attr_t attr; pthread_t id; - if (pthread_attr_init(&attr)) exit(-1); - if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)) exit(-1); - if (pthread_create(&id, &attr, foo, NULL)) exit(-1); - exit(0); + if (pthread_attr_init(&attr)) return (-1); + if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)) return (-1); + if (pthread_create(&id, &attr, foo, NULL)) return (-1); + return (0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : @@ -15130,7 +15130,7 @@ else int main() { /* Success: exit code 0 */ - exit((((wchar_t) -1) < ((wchar_t) 0)) ? 0 : 1); + return ((((wchar_t) -1) < ((wchar_t) 0)) ? 0 : 1); } _ACEOF @@ -15511,7 +15511,7 @@ else int main() { - exit(((-1)>>3 == -1) ? 0 : 1); + return (((-1)>>3 == -1) ? 0 : 1); } _ACEOF @@ -15981,6 +15981,7 @@ else /* end confdefs.h. */ #include +#include int main() { diff --git a/configure.ac b/configure.ac index 7f7dfa588a8144..31e39ec4f7d4c7 100644 --- a/configure.ac +++ b/configure.ac @@ -3311,10 +3311,10 @@ if test "$posix_threads" = "yes"; then main() { pthread_attr_t attr; pthread_t id; - if (pthread_attr_init(&attr)) exit(-1); - if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)) exit(-1); - if (pthread_create(&id, &attr, foo, NULL)) exit(-1); - exit(0); + if (pthread_attr_init(&attr)) return (-1); + if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)) return (-1); + if (pthread_create(&id, &attr, foo, NULL)) return (-1); + return (0); }]])], [ac_cv_pthread_system_supported=yes], [ac_cv_pthread_system_supported=no], @@ -4728,7 +4728,7 @@ then int main() { /* Success: exit code 0 */ - exit((((wchar_t) -1) < ((wchar_t) 0)) ? 0 : 1); + return ((((wchar_t) -1) < ((wchar_t) 0)) ? 0 : 1); } ]])], [ac_cv_wchar_t_signed=yes], @@ -4850,7 +4850,7 @@ AC_CACHE_VAL(ac_cv_rshift_extends_sign, [ AC_RUN_IFELSE([AC_LANG_SOURCE([[ int main() { - exit(((-1)>>3 == -1) ? 0 : 1); + return (((-1)>>3 == -1) ? 0 : 1); } ]])], [ac_cv_rshift_extends_sign=yes], @@ -4997,6 +4997,7 @@ AC_MSG_CHECKING(for broken poll()) AC_CACHE_VAL(ac_cv_broken_poll, AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include +#include int main() { From b4d99e2b79152bb0826f4754c22466c5376d2129 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Mon, 14 Dec 2020 10:19:10 +0000 Subject: [PATCH 0770/1261] Don't generate spurious line number in try-except-finally. (#23760) --- Lib/test/test_sys_settrace.py | 17 + Python/compile.c | 2 + Python/importlib.h | 2978 ++++++++++++++++----------------- Python/importlib_zipimport.h | 486 +++--- 4 files changed, 1751 insertions(+), 1732 deletions(-) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index ccdb5c2c51a0fe..f257809021fcf4 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -629,6 +629,23 @@ def func(): (3, 'line'), (3, 'return')]) + def test_try_except_no_exception(self): + + def func(): + try: + 2 + except: + 4 + finally: + 6 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (6, 'line'), + (6, 'return')]) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Python/compile.c b/Python/compile.c index ea9d6781b9c156..241e8ffd123764 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3007,6 +3007,8 @@ compiler_try_finally(struct compiler *c, stmt_ty s) else { VISIT_SEQ(c, stmt, s->v.Try.body); } + /* Mark code as artificial */ + c->u->u_lineno = -1; ADDOP(c, POP_BLOCK); compiler_pop_fblock(c, FINALLY_TRY, body); VISIT_SEQ(c, stmt, s->v.Try.finalbody); diff --git a/Python/importlib.h b/Python/importlib.h index 6c77d775e38a7b..3d076c757fe6dc 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -348,1507 +348,1507 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 115,114,38,0,0,0,218,12,114,101,108,101,97,115,101,95, 108,111,99,107,41,2,218,3,114,101,102,114,20,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 2,99,98,198,0,0,0,115,12,0,0,0,8,1,2,1, - 14,4,8,1,22,2,255,128,122,28,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,41,10,114,61,0,0,0,114,62,0, - 0,0,114,63,0,0,0,218,8,75,101,121,69,114,114,111, - 114,114,26,0,0,0,114,53,0,0,0,114,23,0,0,0, - 218,8,95,119,101,97,107,114,101,102,114,65,0,0,0,114, - 64,0,0,0,41,3,114,20,0,0,0,114,27,0,0,0, - 114,66,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,57,0,0,0,179,0,0,0,115,32,0, - 0,0,8,6,2,1,2,1,14,1,12,1,10,1,8,2, - 8,1,10,1,8,2,12,2,18,11,8,2,4,2,10,254, - 255,128,114,57,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,8,0,0,0,67,0,0,0, - 115,54,0,0,0,116,0,124,0,131,1,125,1,122,12,124, - 1,160,1,161,0,1,0,87,0,110,20,4,0,116,2,121, - 40,1,0,1,0,1,0,89,0,100,1,83,0,48,0,124, - 1,160,3,161,0,1,0,100,1,83,0,41,2,122,189,65, - 99,113,117,105,114,101,115,32,116,104,101,110,32,114,101,108, - 101,97,115,101,115,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,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,32,32,32,32,78,41,4,114, - 57,0,0,0,114,43,0,0,0,114,22,0,0,0,114,44, - 0,0,0,41,2,114,20,0,0,0,114,27,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,19, - 95,108,111,99,107,95,117,110,108,111,99,107,95,109,111,100, - 117,108,101,216,0,0,0,115,14,0,0,0,8,6,2,1, - 12,1,12,1,8,3,12,2,255,128,114,69,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 4,0,0,0,79,0,0,0,115,14,0,0,0,124,0,124, - 1,105,0,124,2,164,1,142,1,83,0,41,2,97,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, - 78,114,5,0,0,0,41,3,218,1,102,114,59,0,0,0, - 90,4,107,119,100,115,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,25,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, - 233,0,0,0,115,4,0,0,0,14,8,255,128,114,71,0, - 0,0,114,42,0,0,0,41,1,218,9,118,101,114,98,111, - 115,105,116,121,99,1,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,4,0,0,0,71,0,0,0,115,58,0, - 0,0,116,0,106,1,106,2,124,1,107,5,114,54,124,0, - 160,3,100,1,161,1,115,30,100,2,124,0,23,0,125,0, - 116,4,124,0,106,5,124,2,142,0,116,0,106,6,100,3, - 141,2,1,0,100,4,83,0,100,4,83,0,41,5,122,61, - 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,41,2,250, - 1,35,122,7,105,109,112,111,114,116,32,122,2,35,32,41, - 1,90,4,102,105,108,101,78,41,7,114,18,0,0,0,218, - 5,102,108,97,103,115,218,7,118,101,114,98,111,115,101,218, - 10,115,116,97,114,116,115,119,105,116,104,218,5,112,114,105, - 110,116,114,49,0,0,0,218,6,115,116,100,101,114,114,41, - 3,218,7,109,101,115,115,97,103,101,114,72,0,0,0,114, - 59,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, - 115,115,97,103,101,244,0,0,0,115,12,0,0,0,12,2, - 10,1,8,1,24,1,4,253,255,128,114,80,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,3,0,0,0,115,26,0,0,0,135,0,102, - 1,100,1,100,2,132,8,125,1,116,0,124,1,136,0,131, - 2,1,0,124,1,83,0,41,4,122,49,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,0,0,0,0,2,0,0,0,4,0,0, - 0,19,0,0,0,115,38,0,0,0,124,1,116,0,106,1, - 118,1,114,28,116,2,100,1,160,3,124,1,161,1,124,1, - 100,2,141,2,130,1,136,0,124,0,124,1,131,2,83,0, - 41,3,78,250,29,123,33,114,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,114,19,0,0,0,41,4,114,18,0,0,0,218,20, - 98,117,105,108,116,105,110,95,109,111,100,117,108,101,95,110, - 97,109,101,115,218,11,73,109,112,111,114,116,69,114,114,111, - 114,114,49,0,0,0,169,2,114,33,0,0,0,218,8,102, - 117,108,108,110,97,109,101,169,1,218,3,102,120,110,114,5, - 0,0,0,114,6,0,0,0,218,25,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,254,0,0,0,115,12,0,0,0,10,1,10,1, - 2,1,6,255,10,2,255,128,122,52,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,78,169, - 1,114,17,0,0,0,41,2,114,87,0,0,0,114,88,0, - 0,0,114,5,0,0,0,114,86,0,0,0,114,6,0,0, - 0,218,17,95,114,101,113,117,105,114,101,115,95,98,117,105, - 108,116,105,110,252,0,0,0,115,8,0,0,0,12,2,10, - 5,4,1,255,128,114,90,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,3, - 0,0,0,115,26,0,0,0,135,0,102,1,100,1,100,2, - 132,8,125,1,116,0,124,1,136,0,131,2,1,0,124,1, - 83,0,41,4,122,47,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,0,0, - 0,0,2,0,0,0,4,0,0,0,19,0,0,0,115,38, - 0,0,0,116,0,160,1,124,1,161,1,115,28,116,2,100, - 1,160,3,124,1,161,1,124,1,100,2,141,2,130,1,136, - 0,124,0,124,1,131,2,83,0,169,3,78,122,27,123,33, - 114,125,32,105,115,32,110,111,116,32,97,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,114,19,0,0,0,41,4, - 114,61,0,0,0,218,9,105,115,95,102,114,111,122,101,110, - 114,83,0,0,0,114,49,0,0,0,114,84,0,0,0,114, - 86,0,0,0,114,5,0,0,0,114,6,0,0,0,218,24, - 95,114,101,113,117,105,114,101,115,95,102,114,111,122,101,110, - 95,119,114,97,112,112,101,114,9,1,0,0,115,12,0,0, - 0,10,1,10,1,2,1,6,255,10,2,255,128,122,50,95, - 114,101,113,117,105,114,101,115,95,102,114,111,122,101,110,46, + 2,99,98,198,0,0,0,115,14,0,0,0,8,1,2,1, + 14,4,6,1,2,128,22,2,255,128,122,28,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,41,10,114,61,0,0,0,114, + 62,0,0,0,114,63,0,0,0,218,8,75,101,121,69,114, + 114,111,114,114,26,0,0,0,114,53,0,0,0,114,23,0, + 0,0,218,8,95,119,101,97,107,114,101,102,114,65,0,0, + 0,114,64,0,0,0,41,3,114,20,0,0,0,114,27,0, + 0,0,114,66,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,57,0,0,0,179,0,0,0,115, + 34,0,0,0,8,6,2,1,2,1,14,1,12,1,10,1, + 8,2,8,1,10,1,8,2,12,2,16,11,2,128,8,2, + 4,2,10,254,255,128,114,57,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,8,0,0,0, + 67,0,0,0,115,54,0,0,0,116,0,124,0,131,1,125, + 1,122,12,124,1,160,1,161,0,1,0,87,0,110,20,4, + 0,116,2,121,40,1,0,1,0,1,0,89,0,100,1,83, + 0,48,0,124,1,160,3,161,0,1,0,100,1,83,0,41, + 2,122,189,65,99,113,117,105,114,101,115,32,116,104,101,110, + 32,114,101,108,101,97,115,101,115,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,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,32,32,32,32, + 78,41,4,114,57,0,0,0,114,43,0,0,0,114,22,0, + 0,0,114,44,0,0,0,41,2,114,20,0,0,0,114,27, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,19,95,108,111,99,107,95,117,110,108,111,99,107, + 95,109,111,100,117,108,101,216,0,0,0,115,14,0,0,0, + 8,6,2,1,12,1,12,1,8,3,12,2,255,128,114,69, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,4,0,0,0,79,0,0,0,115,14,0,0, + 0,124,0,124,1,105,0,124,2,164,1,142,1,83,0,41, + 2,97,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,78,114,5,0,0,0,41,3,218,1,102,114, + 59,0,0,0,90,4,107,119,100,115,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,25,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,233,0,0,0,115,4,0,0,0,14,8,255, + 128,114,71,0,0,0,114,42,0,0,0,41,1,218,9,118, + 101,114,98,111,115,105,116,121,99,1,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,4,0,0,0,71,0,0, + 0,115,58,0,0,0,116,0,106,1,106,2,124,1,107,5, + 114,54,124,0,160,3,100,1,161,1,115,30,100,2,124,0, + 23,0,125,0,116,4,124,0,106,5,124,2,142,0,116,0, + 106,6,100,3,141,2,1,0,100,4,83,0,100,4,83,0, + 41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111,114,116,32,122, + 2,35,32,41,1,90,4,102,105,108,101,78,41,7,114,18, + 0,0,0,218,5,102,108,97,103,115,218,7,118,101,114,98, + 111,115,101,218,10,115,116,97,114,116,115,119,105,116,104,218, + 5,112,114,105,110,116,114,49,0,0,0,218,6,115,116,100, + 101,114,114,41,3,218,7,109,101,115,115,97,103,101,114,72, + 0,0,0,114,59,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,16,95,118,101,114,98,111,115, + 101,95,109,101,115,115,97,103,101,244,0,0,0,115,12,0, + 0,0,12,2,10,1,8,1,24,1,4,253,255,128,114,80, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,3,0,0,0,115,26,0,0, + 0,135,0,102,1,100,1,100,2,132,8,125,1,116,0,124, + 1,136,0,131,2,1,0,124,1,83,0,41,4,122,49,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,0,0,0,0,2,0,0, + 0,4,0,0,0,19,0,0,0,115,38,0,0,0,124,1, + 116,0,106,1,118,1,114,28,116,2,100,1,160,3,124,1, + 161,1,124,1,100,2,141,2,130,1,136,0,124,0,124,1, + 131,2,83,0,41,3,78,250,29,123,33,114,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,114,19,0,0,0,41,4,114,18,0, + 0,0,218,20,98,117,105,108,116,105,110,95,109,111,100,117, + 108,101,95,110,97,109,101,115,218,11,73,109,112,111,114,116, + 69,114,114,111,114,114,49,0,0,0,169,2,114,33,0,0, + 0,218,8,102,117,108,108,110,97,109,101,169,1,218,3,102, + 120,110,114,5,0,0,0,114,6,0,0,0,218,25,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,254,0,0,0,115,12,0,0,0, + 10,1,10,1,2,1,6,255,10,2,255,128,122,52,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,102,114,111,122,101,110,95,119,114,97,112,112,101, - 114,78,114,89,0,0,0,41,2,114,87,0,0,0,114,93, - 0,0,0,114,5,0,0,0,114,86,0,0,0,114,6,0, - 0,0,218,16,95,114,101,113,117,105,114,101,115,95,102,114, - 111,122,101,110,7,1,0,0,115,8,0,0,0,12,2,10, - 5,4,1,255,128,114,94,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,67, - 0,0,0,115,74,0,0,0,100,1,125,2,116,0,160,1, - 124,2,116,2,161,2,1,0,116,3,124,1,124,0,131,2, - 125,3,124,1,116,4,106,5,118,0,114,66,116,4,106,5, - 124,1,25,0,125,4,116,6,124,3,124,4,131,2,1,0, - 116,4,106,5,124,1,25,0,83,0,116,7,124,3,131,1, - 83,0,41,3,122,128,76,111,97,100,32,116,104,101,32,115, - 112,101,99,105,102,105,101,100,32,109,111,100,117,108,101,32, - 105,110,116,111,32,115,121,115,46,109,111,100,117,108,101,115, - 32,97,110,100,32,114,101,116,117,114,110,32,105,116,46,10, - 10,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, - 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, - 32,85,115,101,32,108,111,97,100,101,114,46,101,120,101,99, - 95,109,111,100,117,108,101,32,105,110,115,116,101,97,100,46, - 10,10,32,32,32,32,122,103,116,104,101,32,108,111,97,100, - 95,109,111,100,117,108,101,40,41,32,109,101,116,104,111,100, - 32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97, - 110,100,32,115,108,97,116,101,100,32,102,111,114,32,114,101, - 109,111,118,97,108,32,105,110,32,80,121,116,104,111,110,32, - 51,46,49,50,59,32,117,115,101,32,101,120,101,99,95,109, - 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,78, - 41,8,218,9,95,119,97,114,110,105,110,103,115,218,4,119, - 97,114,110,218,18,68,101,112,114,101,99,97,116,105,111,110, - 87,97,114,110,105,110,103,218,16,115,112,101,99,95,102,114, - 111,109,95,108,111,97,100,101,114,114,18,0,0,0,218,7, - 109,111,100,117,108,101,115,218,5,95,101,120,101,99,218,5, - 95,108,111,97,100,41,5,114,33,0,0,0,114,85,0,0, - 0,218,3,109,115,103,218,4,115,112,101,99,218,6,109,111, - 100,117,108,101,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,17,95,108,111,97,100,95,109,111,100,117,108, - 101,95,115,104,105,109,19,1,0,0,115,18,0,0,0,4, - 6,12,2,10,1,10,1,10,1,10,1,10,1,8,2,255, - 128,114,105,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,5,0,0,0,8,0,0,0,67,0,0,0,115, - 210,0,0,0,116,0,124,0,100,1,100,0,131,3,125,1, - 116,1,124,1,100,2,131,2,114,54,122,12,124,1,160,2, - 124,0,161,1,87,0,83,0,4,0,116,3,121,52,1,0, - 1,0,1,0,89,0,110,2,48,0,122,10,124,0,106,4, - 125,2,87,0,110,18,4,0,116,5,121,82,1,0,1,0, - 1,0,89,0,110,18,48,0,124,2,100,0,117,1,114,100, - 116,6,124,2,131,1,83,0,122,10,124,0,106,7,125,3, - 87,0,110,22,4,0,116,5,121,132,1,0,1,0,1,0, - 100,3,125,3,89,0,110,2,48,0,122,10,124,0,106,8, - 125,4,87,0,110,52,4,0,116,5,121,196,1,0,1,0, - 1,0,124,1,100,0,117,0,114,180,100,4,160,9,124,3, - 161,1,6,0,89,0,83,0,100,5,160,9,124,3,124,1, - 161,2,6,0,89,0,83,0,48,0,100,6,160,9,124,3, - 124,4,161,2,83,0,41,7,78,218,10,95,95,108,111,97, - 100,101,114,95,95,218,11,109,111,100,117,108,101,95,114,101, - 112,114,250,1,63,250,13,60,109,111,100,117,108,101,32,123, - 33,114,125,62,250,20,60,109,111,100,117,108,101,32,123,33, - 114,125,32,40,123,33,114,125,41,62,250,23,60,109,111,100, - 117,108,101,32,123,33,114,125,32,102,114,111,109,32,123,33, - 114,125,62,41,10,114,13,0,0,0,114,11,0,0,0,114, - 107,0,0,0,218,9,69,120,99,101,112,116,105,111,110,218, - 8,95,95,115,112,101,99,95,95,114,2,0,0,0,218,22, - 95,109,111,100,117,108,101,95,114,101,112,114,95,102,114,111, - 109,95,115,112,101,99,114,9,0,0,0,218,8,95,95,102, - 105,108,101,95,95,114,49,0,0,0,41,5,114,104,0,0, - 0,218,6,108,111,97,100,101,114,114,103,0,0,0,114,20, - 0,0,0,218,8,102,105,108,101,110,97,109,101,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,12,95,109, - 111,100,117,108,101,95,114,101,112,114,38,1,0,0,115,48, - 0,0,0,12,2,10,1,2,4,12,1,12,1,6,1,2, - 1,10,1,12,1,6,1,8,2,8,1,2,4,10,1,12, - 1,10,1,2,1,10,1,12,1,8,1,14,1,18,2,12, - 2,255,128,114,118,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, - 0,115,114,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,2,100,2,100,3,156,3,100,4,100,5, - 132,2,90,4,100,6,100,7,132,0,90,5,100,8,100,9, - 132,0,90,6,101,7,100,10,100,11,132,0,131,1,90,8, - 101,8,106,9,100,12,100,11,132,0,131,1,90,8,101,7, - 100,13,100,14,132,0,131,1,90,10,101,7,100,15,100,16, - 132,0,131,1,90,11,101,11,106,9,100,17,100,16,132,0, - 131,1,90,11,100,2,83,0,41,18,218,10,77,111,100,117, - 108,101,83,112,101,99,97,208,5,0,0,84,104,101,32,115, - 112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114, - 32,97,32,109,111,100,117,108,101,44,32,117,115,101,100,32, - 102,111,114,32,108,111,97,100,105,110,103,46,10,10,32,32, - 32,32,65,32,109,111,100,117,108,101,39,115,32,115,112,101, - 99,32,105,115,32,116,104,101,32,115,111,117,114,99,101,32, - 102,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32, - 97,98,111,117,116,32,116,104,101,32,109,111,100,117,108,101, - 46,32,32,70,111,114,10,32,32,32,32,100,97,116,97,32, - 97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32, - 116,104,101,32,109,111,100,117,108,101,44,32,105,110,99,108, - 117,100,105,110,103,32,115,111,117,114,99,101,44,32,117,115, - 101,32,116,104,101,32,115,112,101,99,39,115,10,32,32,32, - 32,108,111,97,100,101,114,46,10,10,32,32,32,32,96,110, - 97,109,101,96,32,105,115,32,116,104,101,32,97,98,115,111, - 108,117,116,101,32,110,97,109,101,32,111,102,32,116,104,101, - 32,109,111,100,117,108,101,46,32,32,96,108,111,97,100,101, - 114,96,32,105,115,32,116,104,101,32,108,111,97,100,101,114, - 10,32,32,32,32,116,111,32,117,115,101,32,119,104,101,110, - 32,108,111,97,100,105,110,103,32,116,104,101,32,109,111,100, - 117,108,101,46,32,32,96,112,97,114,101,110,116,96,32,105, - 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, - 101,10,32,32,32,32,112,97,99,107,97,103,101,32,116,104, - 101,32,109,111,100,117,108,101,32,105,115,32,105,110,46,32, - 32,84,104,101,32,112,97,114,101,110,116,32,105,115,32,100, - 101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32, - 110,97,109,101,46,10,10,32,32,32,32,96,105,115,95,112, - 97,99,107,97,103,101,96,32,100,101,116,101,114,109,105,110, - 101,115,32,105,102,32,116,104,101,32,109,111,100,117,108,101, - 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, - 32,112,97,99,107,97,103,101,32,111,114,10,32,32,32,32, - 110,111,116,46,32,32,79,110,32,109,111,100,117,108,101,115, - 32,116,104,105,115,32,105,115,32,114,101,102,108,101,99,116, - 101,100,32,98,121,32,116,104,101,32,96,95,95,112,97,116, - 104,95,95,96,32,97,116,116,114,105,98,117,116,101,46,10, - 10,32,32,32,32,96,111,114,105,103,105,110,96,32,105,115, - 32,116,104,101,32,115,112,101,99,105,102,105,99,32,108,111, - 99,97,116,105,111,110,32,117,115,101,100,32,98,121,32,116, - 104,101,32,108,111,97,100,101,114,32,102,114,111,109,32,119, - 104,105,99,104,32,116,111,10,32,32,32,32,108,111,97,100, - 32,116,104,101,32,109,111,100,117,108,101,44,32,105,102,32, - 116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110, - 32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,32, - 87,104,101,110,32,102,105,108,101,110,97,109,101,32,105,115, - 10,32,32,32,32,115,101,116,44,32,111,114,105,103,105,110, - 32,119,105,108,108,32,109,97,116,99,104,46,10,10,32,32, - 32,32,96,104,97,115,95,108,111,99,97,116,105,111,110,96, - 32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32, - 97,32,115,112,101,99,39,115,32,34,111,114,105,103,105,110, - 34,32,114,101,102,108,101,99,116,115,32,97,32,108,111,99, - 97,116,105,111,110,46,10,32,32,32,32,87,104,101,110,32, - 116,104,105,115,32,105,115,32,84,114,117,101,44,32,96,95, - 95,102,105,108,101,95,95,96,32,97,116,116,114,105,98,117, - 116,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, - 32,105,115,32,115,101,116,46,10,10,32,32,32,32,96,99, - 97,99,104,101,100,96,32,105,115,32,116,104,101,32,108,111, - 99,97,116,105,111,110,32,111,102,32,116,104,101,32,99,97, - 99,104,101,100,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,44,32,105,102,32,97,110,121,46,32,32,73,116,10, - 32,32,32,32,99,111,114,114,101,115,112,111,110,100,115,32, - 116,111,32,116,104,101,32,96,95,95,99,97,99,104,101,100, - 95,95,96,32,97,116,116,114,105,98,117,116,101,46,10,10, - 32,32,32,32,96,115,117,98,109,111,100,117,108,101,95,115, - 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,96, - 32,105,115,32,116,104,101,32,115,101,113,117,101,110,99,101, - 32,111,102,32,112,97,116,104,32,101,110,116,114,105,101,115, - 32,116,111,10,32,32,32,32,115,101,97,114,99,104,32,119, - 104,101,110,32,105,109,112,111,114,116,105,110,103,32,115,117, - 98,109,111,100,117,108,101,115,46,32,32,73,102,32,115,101, - 116,44,32,105,115,95,112,97,99,107,97,103,101,32,115,104, - 111,117,108,100,32,98,101,10,32,32,32,32,84,114,117,101, - 45,45,97,110,100,32,70,97,108,115,101,32,111,116,104,101, - 114,119,105,115,101,46,10,10,32,32,32,32,80,97,99,107, - 97,103,101,115,32,97,114,101,32,115,105,109,112,108,121,32, - 109,111,100,117,108,101,115,32,116,104,97,116,32,40,109,97, - 121,41,32,104,97,118,101,32,115,117,98,109,111,100,117,108, - 101,115,46,32,32,73,102,32,97,32,115,112,101,99,10,32, - 32,32,32,104,97,115,32,97,32,110,111,110,45,78,111,110, - 101,32,118,97,108,117,101,32,105,110,32,96,115,117,98,109, - 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,96,44,32,116,104,101,32,105,109,112, - 111,114,116,10,32,32,32,32,115,121,115,116,101,109,32,119, - 105,108,108,32,99,111,110,115,105,100,101,114,32,109,111,100, - 117,108,101,115,32,108,111,97,100,101,100,32,102,114,111,109, - 32,116,104,101,32,115,112,101,99,32,97,115,32,112,97,99, - 107,97,103,101,115,46,10,10,32,32,32,32,79,110,108,121, - 32,102,105,110,100,101,114,115,32,40,115,101,101,32,105,109, - 112,111,114,116,108,105,98,46,97,98,99,46,77,101,116,97, - 80,97,116,104,70,105,110,100,101,114,32,97,110,100,10,32, - 32,32,32,105,109,112,111,114,116,108,105,98,46,97,98,99, - 46,80,97,116,104,69,110,116,114,121,70,105,110,100,101,114, - 41,32,115,104,111,117,108,100,32,109,111,100,105,102,121,32, - 77,111,100,117,108,101,83,112,101,99,32,105,110,115,116,97, - 110,99,101,115,46,10,10,32,32,32,32,78,41,3,218,6, - 111,114,105,103,105,110,218,12,108,111,97,100,101,114,95,115, - 116,97,116,101,218,10,105,115,95,112,97,99,107,97,103,101, - 99,3,0,0,0,0,0,0,0,3,0,0,0,6,0,0, - 0,2,0,0,0,67,0,0,0,115,54,0,0,0,124,1, - 124,0,95,0,124,2,124,0,95,1,124,3,124,0,95,2, - 124,4,124,0,95,3,124,5,114,32,103,0,110,2,100,0, - 124,0,95,4,100,1,124,0,95,5,100,0,124,0,95,6, - 100,0,83,0,41,2,78,70,41,7,114,20,0,0,0,114, - 116,0,0,0,114,120,0,0,0,114,121,0,0,0,218,26, + 101,115,95,98,117,105,108,116,105,110,95,119,114,97,112,112, + 101,114,78,169,1,114,17,0,0,0,41,2,114,87,0,0, + 0,114,88,0,0,0,114,5,0,0,0,114,86,0,0,0, + 114,6,0,0,0,218,17,95,114,101,113,117,105,114,101,115, + 95,98,117,105,108,116,105,110,252,0,0,0,115,8,0,0, + 0,12,2,10,5,4,1,255,128,114,90,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,3,0,0,0,115,26,0,0,0,135,0,102,1, + 100,1,100,2,132,8,125,1,116,0,124,1,136,0,131,2, + 1,0,124,1,83,0,41,4,122,47,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,0,0,0,0,2,0,0,0,4,0,0,0,19,0, + 0,0,115,38,0,0,0,116,0,160,1,124,1,161,1,115, + 28,116,2,100,1,160,3,124,1,161,1,124,1,100,2,141, + 2,130,1,136,0,124,0,124,1,131,2,83,0,169,3,78, + 122,27,123,33,114,125,32,105,115,32,110,111,116,32,97,32, + 102,114,111,122,101,110,32,109,111,100,117,108,101,114,19,0, + 0,0,41,4,114,61,0,0,0,218,9,105,115,95,102,114, + 111,122,101,110,114,83,0,0,0,114,49,0,0,0,114,84, + 0,0,0,114,86,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,24,95,114,101,113,117,105,114,101,115,95,102,114, + 111,122,101,110,95,119,114,97,112,112,101,114,9,1,0,0, + 115,12,0,0,0,10,1,10,1,2,1,6,255,10,2,255, + 128,122,50,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,78,114,89,0,0,0,41,2,114,87,0, + 0,0,114,93,0,0,0,114,5,0,0,0,114,86,0,0, + 0,114,6,0,0,0,218,16,95,114,101,113,117,105,114,101, + 115,95,102,114,111,122,101,110,7,1,0,0,115,8,0,0, + 0,12,2,10,5,4,1,255,128,114,94,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4, + 0,0,0,67,0,0,0,115,74,0,0,0,100,1,125,2, + 116,0,160,1,124,2,116,2,161,2,1,0,116,3,124,1, + 124,0,131,2,125,3,124,1,116,4,106,5,118,0,114,66, + 116,4,106,5,124,1,25,0,125,4,116,6,124,3,124,4, + 131,2,1,0,116,4,106,5,124,1,25,0,83,0,116,7, + 124,3,131,1,83,0,41,3,122,128,76,111,97,100,32,116, + 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, + 117,108,101,32,105,110,116,111,32,115,121,115,46,109,111,100, + 117,108,101,115,32,97,110,100,32,114,101,116,117,114,110,32, + 105,116,46,10,10,32,32,32,32,84,104,105,115,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,32,32,85,115,101,32,108,111,97,100,101,114,46, + 101,120,101,99,95,109,111,100,117,108,101,32,105,110,115,116, + 101,97,100,46,10,10,32,32,32,32,122,103,116,104,101,32, + 108,111,97,100,95,109,111,100,117,108,101,40,41,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,32,97,110,100,32,115,108,97,116,101,100,32,102,111, + 114,32,114,101,109,111,118,97,108,32,105,110,32,80,121,116, + 104,111,110,32,51,46,49,50,59,32,117,115,101,32,101,120, + 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, + 101,97,100,78,41,8,218,9,95,119,97,114,110,105,110,103, + 115,218,4,119,97,114,110,218,18,68,101,112,114,101,99,97, + 116,105,111,110,87,97,114,110,105,110,103,218,16,115,112,101, + 99,95,102,114,111,109,95,108,111,97,100,101,114,114,18,0, + 0,0,218,7,109,111,100,117,108,101,115,218,5,95,101,120, + 101,99,218,5,95,108,111,97,100,41,5,114,33,0,0,0, + 114,85,0,0,0,218,3,109,115,103,218,4,115,112,101,99, + 218,6,109,111,100,117,108,101,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,17,95,108,111,97,100,95,109, + 111,100,117,108,101,95,115,104,105,109,19,1,0,0,115,18, + 0,0,0,4,6,12,2,10,1,10,1,10,1,10,1,10, + 1,8,2,255,128,114,105,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,8,0,0,0,67, + 0,0,0,115,210,0,0,0,116,0,124,0,100,1,100,0, + 131,3,125,1,116,1,124,1,100,2,131,2,114,54,122,12, + 124,1,160,2,124,0,161,1,87,0,83,0,4,0,116,3, + 121,52,1,0,1,0,1,0,89,0,110,2,48,0,122,10, + 124,0,106,4,125,2,87,0,110,18,4,0,116,5,121,82, + 1,0,1,0,1,0,89,0,110,18,48,0,124,2,100,0, + 117,1,114,100,116,6,124,2,131,1,83,0,122,10,124,0, + 106,7,125,3,87,0,110,22,4,0,116,5,121,132,1,0, + 1,0,1,0,100,3,125,3,89,0,110,2,48,0,122,10, + 124,0,106,8,125,4,87,0,110,52,4,0,116,5,121,196, + 1,0,1,0,1,0,124,1,100,0,117,0,114,180,100,4, + 160,9,124,3,161,1,6,0,89,0,83,0,100,5,160,9, + 124,3,124,1,161,2,6,0,89,0,83,0,48,0,100,6, + 160,9,124,3,124,4,161,2,83,0,41,7,78,218,10,95, + 95,108,111,97,100,101,114,95,95,218,11,109,111,100,117,108, + 101,95,114,101,112,114,250,1,63,250,13,60,109,111,100,117, + 108,101,32,123,33,114,125,62,250,20,60,109,111,100,117,108, + 101,32,123,33,114,125,32,40,123,33,114,125,41,62,250,23, + 60,109,111,100,117,108,101,32,123,33,114,125,32,102,114,111, + 109,32,123,33,114,125,62,41,10,114,13,0,0,0,114,11, + 0,0,0,114,107,0,0,0,218,9,69,120,99,101,112,116, + 105,111,110,218,8,95,95,115,112,101,99,95,95,114,2,0, + 0,0,218,22,95,109,111,100,117,108,101,95,114,101,112,114, + 95,102,114,111,109,95,115,112,101,99,114,9,0,0,0,218, + 8,95,95,102,105,108,101,95,95,114,49,0,0,0,41,5, + 114,104,0,0,0,218,6,108,111,97,100,101,114,114,103,0, + 0,0,114,20,0,0,0,218,8,102,105,108,101,110,97,109, + 101,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,12,95,109,111,100,117,108,101,95,114,101,112,114,38,1, + 0,0,115,48,0,0,0,12,2,10,1,2,4,12,1,12, + 1,6,1,2,1,10,1,12,1,6,1,8,2,8,1,2, + 4,10,1,12,1,10,1,2,1,10,1,12,1,8,1,14, + 1,18,2,12,2,255,128,114,118,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,64,0,0,0,115,114,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,100,2,100,2,100,3,156,3, + 100,4,100,5,132,2,90,4,100,6,100,7,132,0,90,5, + 100,8,100,9,132,0,90,6,101,7,100,10,100,11,132,0, + 131,1,90,8,101,8,106,9,100,12,100,11,132,0,131,1, + 90,8,101,7,100,13,100,14,132,0,131,1,90,10,101,7, + 100,15,100,16,132,0,131,1,90,11,101,11,106,9,100,17, + 100,16,132,0,131,1,90,11,100,2,83,0,41,18,218,10, + 77,111,100,117,108,101,83,112,101,99,97,208,5,0,0,84, + 104,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110, + 32,102,111,114,32,97,32,109,111,100,117,108,101,44,32,117, + 115,101,100,32,102,111,114,32,108,111,97,100,105,110,103,46, + 10,10,32,32,32,32,65,32,109,111,100,117,108,101,39,115, + 32,115,112,101,99,32,105,115,32,116,104,101,32,115,111,117, + 114,99,101,32,102,111,114,32,105,110,102,111,114,109,97,116, + 105,111,110,32,97,98,111,117,116,32,116,104,101,32,109,111, + 100,117,108,101,46,32,32,70,111,114,10,32,32,32,32,100, + 97,116,97,32,97,115,115,111,99,105,97,116,101,100,32,119, + 105,116,104,32,116,104,101,32,109,111,100,117,108,101,44,32, + 105,110,99,108,117,100,105,110,103,32,115,111,117,114,99,101, + 44,32,117,115,101,32,116,104,101,32,115,112,101,99,39,115, + 10,32,32,32,32,108,111,97,100,101,114,46,10,10,32,32, + 32,32,96,110,97,109,101,96,32,105,115,32,116,104,101,32, + 97,98,115,111,108,117,116,101,32,110,97,109,101,32,111,102, + 32,116,104,101,32,109,111,100,117,108,101,46,32,32,96,108, + 111,97,100,101,114,96,32,105,115,32,116,104,101,32,108,111, + 97,100,101,114,10,32,32,32,32,116,111,32,117,115,101,32, + 119,104,101,110,32,108,111,97,100,105,110,103,32,116,104,101, + 32,109,111,100,117,108,101,46,32,32,96,112,97,114,101,110, + 116,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111, + 102,32,116,104,101,10,32,32,32,32,112,97,99,107,97,103, + 101,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32, + 105,110,46,32,32,84,104,101,32,112,97,114,101,110,116,32, + 105,115,32,100,101,114,105,118,101,100,32,102,114,111,109,32, + 116,104,101,32,110,97,109,101,46,10,10,32,32,32,32,96, + 105,115,95,112,97,99,107,97,103,101,96,32,100,101,116,101, + 114,109,105,110,101,115,32,105,102,32,116,104,101,32,109,111, + 100,117,108,101,32,105,115,32,99,111,110,115,105,100,101,114, + 101,100,32,97,32,112,97,99,107,97,103,101,32,111,114,10, + 32,32,32,32,110,111,116,46,32,32,79,110,32,109,111,100, + 117,108,101,115,32,116,104,105,115,32,105,115,32,114,101,102, + 108,101,99,116,101,100,32,98,121,32,116,104,101,32,96,95, + 95,112,97,116,104,95,95,96,32,97,116,116,114,105,98,117, + 116,101,46,10,10,32,32,32,32,96,111,114,105,103,105,110, + 96,32,105,115,32,116,104,101,32,115,112,101,99,105,102,105, + 99,32,108,111,99,97,116,105,111,110,32,117,115,101,100,32, + 98,121,32,116,104,101,32,108,111,97,100,101,114,32,102,114, + 111,109,32,119,104,105,99,104,32,116,111,10,32,32,32,32, + 108,111,97,100,32,116,104,101,32,109,111,100,117,108,101,44, + 32,105,102,32,116,104,97,116,32,105,110,102,111,114,109,97, + 116,105,111,110,32,105,115,32,97,118,97,105,108,97,98,108, + 101,46,32,32,87,104,101,110,32,102,105,108,101,110,97,109, + 101,32,105,115,10,32,32,32,32,115,101,116,44,32,111,114, + 105,103,105,110,32,119,105,108,108,32,109,97,116,99,104,46, + 10,10,32,32,32,32,96,104,97,115,95,108,111,99,97,116, + 105,111,110,96,32,105,110,100,105,99,97,116,101,115,32,116, + 104,97,116,32,97,32,115,112,101,99,39,115,32,34,111,114, + 105,103,105,110,34,32,114,101,102,108,101,99,116,115,32,97, + 32,108,111,99,97,116,105,111,110,46,10,32,32,32,32,87, + 104,101,110,32,116,104,105,115,32,105,115,32,84,114,117,101, + 44,32,96,95,95,102,105,108,101,95,95,96,32,97,116,116, + 114,105,98,117,116,101,32,111,102,32,116,104,101,32,109,111, + 100,117,108,101,32,105,115,32,115,101,116,46,10,10,32,32, + 32,32,96,99,97,99,104,101,100,96,32,105,115,32,116,104, + 101,32,108,111,99,97,116,105,111,110,32,111,102,32,116,104, + 101,32,99,97,99,104,101,100,32,98,121,116,101,99,111,100, + 101,32,102,105,108,101,44,32,105,102,32,97,110,121,46,32, + 32,73,116,10,32,32,32,32,99,111,114,114,101,115,112,111, + 110,100,115,32,116,111,32,116,104,101,32,96,95,95,99,97, + 99,104,101,100,95,95,96,32,97,116,116,114,105,98,117,116, + 101,46,10,10,32,32,32,32,96,115,117,98,109,111,100,117, + 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, + 111,110,115,96,32,105,115,32,116,104,101,32,115,101,113,117, + 101,110,99,101,32,111,102,32,112,97,116,104,32,101,110,116, + 114,105,101,115,32,116,111,10,32,32,32,32,115,101,97,114, + 99,104,32,119,104,101,110,32,105,109,112,111,114,116,105,110, + 103,32,115,117,98,109,111,100,117,108,101,115,46,32,32,73, + 102,32,115,101,116,44,32,105,115,95,112,97,99,107,97,103, + 101,32,115,104,111,117,108,100,32,98,101,10,32,32,32,32, + 84,114,117,101,45,45,97,110,100,32,70,97,108,115,101,32, + 111,116,104,101,114,119,105,115,101,46,10,10,32,32,32,32, + 80,97,99,107,97,103,101,115,32,97,114,101,32,115,105,109, + 112,108,121,32,109,111,100,117,108,101,115,32,116,104,97,116, + 32,40,109,97,121,41,32,104,97,118,101,32,115,117,98,109, + 111,100,117,108,101,115,46,32,32,73,102,32,97,32,115,112, + 101,99,10,32,32,32,32,104,97,115,32,97,32,110,111,110, + 45,78,111,110,101,32,118,97,108,117,101,32,105,110,32,96, 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, - 95,108,111,99,97,116,105,111,110,115,218,13,95,115,101,116, - 95,102,105,108,101,97,116,116,114,218,7,95,99,97,99,104, - 101,100,41,6,114,33,0,0,0,114,20,0,0,0,114,116, - 0,0,0,114,120,0,0,0,114,121,0,0,0,114,122,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,34,0,0,0,111,1,0,0,115,16,0,0,0,6, - 2,6,1,6,1,6,1,14,1,6,3,10,1,255,128,122, - 19,77,111,100,117,108,101,83,112,101,99,46,95,95,105,110, - 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,6,0,0,0,67,0,0,0,115,102,0, - 0,0,100,1,160,0,124,0,106,1,161,1,100,2,160,0, - 124,0,106,2,161,1,103,2,125,1,124,0,106,3,100,0, - 117,1,114,52,124,1,160,4,100,3,160,0,124,0,106,3, - 161,1,161,1,1,0,124,0,106,5,100,0,117,1,114,80, - 124,1,160,4,100,4,160,0,124,0,106,5,161,1,161,1, - 1,0,100,5,160,0,124,0,106,6,106,7,100,6,160,8, - 124,1,161,1,161,2,83,0,41,7,78,122,9,110,97,109, - 101,61,123,33,114,125,122,11,108,111,97,100,101,114,61,123, - 33,114,125,122,11,111,114,105,103,105,110,61,123,33,114,125, - 122,29,115,117,98,109,111,100,117,108,101,95,115,101,97,114, - 99,104,95,108,111,99,97,116,105,111,110,115,61,123,125,122, - 6,123,125,40,123,125,41,122,2,44,32,41,9,114,49,0, - 0,0,114,20,0,0,0,114,116,0,0,0,114,120,0,0, - 0,218,6,97,112,112,101,110,100,114,123,0,0,0,218,9, - 95,95,99,108,97,115,115,95,95,114,9,0,0,0,218,4, - 106,111,105,110,41,2,114,33,0,0,0,114,59,0,0,0, + 95,108,111,99,97,116,105,111,110,115,96,44,32,116,104,101, + 32,105,109,112,111,114,116,10,32,32,32,32,115,121,115,116, + 101,109,32,119,105,108,108,32,99,111,110,115,105,100,101,114, + 32,109,111,100,117,108,101,115,32,108,111,97,100,101,100,32, + 102,114,111,109,32,116,104,101,32,115,112,101,99,32,97,115, + 32,112,97,99,107,97,103,101,115,46,10,10,32,32,32,32, + 79,110,108,121,32,102,105,110,100,101,114,115,32,40,115,101, + 101,32,105,109,112,111,114,116,108,105,98,46,97,98,99,46, + 77,101,116,97,80,97,116,104,70,105,110,100,101,114,32,97, + 110,100,10,32,32,32,32,105,109,112,111,114,116,108,105,98, + 46,97,98,99,46,80,97,116,104,69,110,116,114,121,70,105, + 110,100,101,114,41,32,115,104,111,117,108,100,32,109,111,100, + 105,102,121,32,77,111,100,117,108,101,83,112,101,99,32,105, + 110,115,116,97,110,99,101,115,46,10,10,32,32,32,32,78, + 41,3,218,6,111,114,105,103,105,110,218,12,108,111,97,100, + 101,114,95,115,116,97,116,101,218,10,105,115,95,112,97,99, + 107,97,103,101,99,3,0,0,0,0,0,0,0,3,0,0, + 0,6,0,0,0,2,0,0,0,67,0,0,0,115,54,0, + 0,0,124,1,124,0,95,0,124,2,124,0,95,1,124,3, + 124,0,95,2,124,4,124,0,95,3,124,5,114,32,103,0, + 110,2,100,0,124,0,95,4,100,1,124,0,95,5,100,0, + 124,0,95,6,100,0,83,0,41,2,78,70,41,7,114,20, + 0,0,0,114,116,0,0,0,114,120,0,0,0,114,121,0, + 0,0,218,26,115,117,98,109,111,100,117,108,101,95,115,101, + 97,114,99,104,95,108,111,99,97,116,105,111,110,115,218,13, + 95,115,101,116,95,102,105,108,101,97,116,116,114,218,7,95, + 99,97,99,104,101,100,41,6,114,33,0,0,0,114,20,0, + 0,0,114,116,0,0,0,114,120,0,0,0,114,121,0,0, + 0,114,122,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,34,0,0,0,111,1,0,0,115,16, + 0,0,0,6,2,6,1,6,1,6,1,14,1,6,3,10, + 1,255,128,122,19,77,111,100,117,108,101,83,112,101,99,46, + 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,6,0,0,0,67,0,0, + 0,115,102,0,0,0,100,1,160,0,124,0,106,1,161,1, + 100,2,160,0,124,0,106,2,161,1,103,2,125,1,124,0, + 106,3,100,0,117,1,114,52,124,1,160,4,100,3,160,0, + 124,0,106,3,161,1,161,1,1,0,124,0,106,5,100,0, + 117,1,114,80,124,1,160,4,100,4,160,0,124,0,106,5, + 161,1,161,1,1,0,100,5,160,0,124,0,106,6,106,7, + 100,6,160,8,124,1,161,1,161,2,83,0,41,7,78,122, + 9,110,97,109,101,61,123,33,114,125,122,11,108,111,97,100, + 101,114,61,123,33,114,125,122,11,111,114,105,103,105,110,61, + 123,33,114,125,122,29,115,117,98,109,111,100,117,108,101,95, + 115,101,97,114,99,104,95,108,111,99,97,116,105,111,110,115, + 61,123,125,122,6,123,125,40,123,125,41,122,2,44,32,41, + 9,114,49,0,0,0,114,20,0,0,0,114,116,0,0,0, + 114,120,0,0,0,218,6,97,112,112,101,110,100,114,123,0, + 0,0,218,9,95,95,99,108,97,115,115,95,95,114,9,0, + 0,0,218,4,106,111,105,110,41,2,114,33,0,0,0,114, + 59,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,52,0,0,0,123,1,0,0,115,22,0,0, + 0,10,1,10,1,4,255,10,2,18,1,10,1,8,1,4, + 1,6,255,22,2,255,128,122,19,77,111,100,117,108,101,83, + 112,101,99,46,95,95,114,101,112,114,95,95,99,2,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0, + 0,67,0,0,0,115,102,0,0,0,124,0,106,0,125,2, + 122,72,124,0,106,1,124,1,106,1,107,2,111,76,124,0, + 106,2,124,1,106,2,107,2,111,76,124,0,106,3,124,1, + 106,3,107,2,111,76,124,2,124,1,106,0,107,2,111,76, + 124,0,106,4,124,1,106,4,107,2,111,76,124,0,106,5, + 124,1,106,5,107,2,87,0,83,0,4,0,116,6,121,100, + 1,0,1,0,1,0,116,7,6,0,89,0,83,0,48,0, + 114,0,0,0,0,41,8,114,123,0,0,0,114,20,0,0, + 0,114,116,0,0,0,114,120,0,0,0,218,6,99,97,99, + 104,101,100,218,12,104,97,115,95,108,111,99,97,116,105,111, + 110,114,2,0,0,0,218,14,78,111,116,73,109,112,108,101, + 109,101,110,116,101,100,41,3,114,33,0,0,0,90,5,111, + 116,104,101,114,90,4,115,109,115,108,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,6,95,95,101,113,95, + 95,133,1,0,0,115,32,0,0,0,6,1,2,1,12,1, + 10,1,2,255,10,2,2,254,8,3,2,253,10,4,2,252, + 10,5,4,251,12,6,10,1,255,128,122,17,77,111,100,117, + 108,101,83,112,101,99,46,95,95,101,113,95,95,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,58,0,0,0,124,0,106,0,100, + 0,117,0,114,52,124,0,106,1,100,0,117,1,114,52,124, + 0,106,2,114,52,116,3,100,0,117,0,114,38,116,4,130, + 1,116,3,160,5,124,0,106,1,161,1,124,0,95,0,124, + 0,106,0,83,0,114,0,0,0,0,41,6,114,125,0,0, + 0,114,120,0,0,0,114,124,0,0,0,218,19,95,98,111, + 111,116,115,116,114,97,112,95,101,120,116,101,114,110,97,108, + 218,19,78,111,116,73,109,112,108,101,109,101,110,116,101,100, + 69,114,114,111,114,90,11,95,103,101,116,95,99,97,99,104, + 101,100,114,51,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,129,0,0,0,145,1,0,0,115, + 14,0,0,0,10,2,16,1,8,1,4,1,14,1,6,1, + 255,128,122,17,77,111,100,117,108,101,83,112,101,99,46,99, + 97,99,104,101,100,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,10, + 0,0,0,124,1,124,0,95,0,100,0,83,0,114,0,0, + 0,0,41,1,114,125,0,0,0,41,2,114,33,0,0,0, + 114,129,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,129,0,0,0,154,1,0,0,115,4,0, + 0,0,10,2,255,128,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 32,0,0,0,124,0,106,0,100,1,117,0,114,26,124,0, + 106,1,160,2,100,2,161,1,100,3,25,0,83,0,124,0, + 106,1,83,0,41,4,122,32,84,104,101,32,110,97,109,101, + 32,111,102,32,116,104,101,32,109,111,100,117,108,101,39,115, + 32,112,97,114,101,110,116,46,78,218,1,46,114,25,0,0, + 0,41,3,114,123,0,0,0,114,20,0,0,0,218,10,114, + 112,97,114,116,105,116,105,111,110,114,51,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,6,112, + 97,114,101,110,116,158,1,0,0,115,8,0,0,0,10,3, + 16,1,6,2,255,128,122,17,77,111,100,117,108,101,83,112, + 101,99,46,112,97,114,101,110,116,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,1,0,0,0,67,0, + 0,0,115,6,0,0,0,124,0,106,0,83,0,114,0,0, + 0,0,41,1,114,124,0,0,0,114,51,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,130,0, + 0,0,166,1,0,0,115,4,0,0,0,6,2,255,128,122, + 23,77,111,100,117,108,101,83,112,101,99,46,104,97,115,95, + 108,111,99,97,116,105,111,110,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,115,14,0,0,0,116,0,124,1,131,1,124,0,95,1, + 100,0,83,0,114,0,0,0,0,41,2,218,4,98,111,111, + 108,114,124,0,0,0,41,2,114,33,0,0,0,218,5,118, + 97,108,117,101,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,130,0,0,0,170,1,0,0,115,4,0,0, + 0,14,2,255,128,41,12,114,9,0,0,0,114,8,0,0, + 0,114,1,0,0,0,114,10,0,0,0,114,34,0,0,0, + 114,52,0,0,0,114,132,0,0,0,218,8,112,114,111,112, + 101,114,116,121,114,129,0,0,0,218,6,115,101,116,116,101, + 114,114,137,0,0,0,114,130,0,0,0,114,5,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 52,0,0,0,123,1,0,0,115,22,0,0,0,10,1,10, - 1,4,255,10,2,18,1,10,1,8,1,4,1,6,255,22, - 2,255,128,122,19,77,111,100,117,108,101,83,112,101,99,46, - 95,95,114,101,112,114,95,95,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, - 0,115,102,0,0,0,124,0,106,0,125,2,122,72,124,0, - 106,1,124,1,106,1,107,2,111,76,124,0,106,2,124,1, - 106,2,107,2,111,76,124,0,106,3,124,1,106,3,107,2, - 111,76,124,2,124,1,106,0,107,2,111,76,124,0,106,4, - 124,1,106,4,107,2,111,76,124,0,106,5,124,1,106,5, - 107,2,87,0,83,0,4,0,116,6,121,100,1,0,1,0, - 1,0,116,7,6,0,89,0,83,0,48,0,114,0,0,0, - 0,41,8,114,123,0,0,0,114,20,0,0,0,114,116,0, - 0,0,114,120,0,0,0,218,6,99,97,99,104,101,100,218, - 12,104,97,115,95,108,111,99,97,116,105,111,110,114,2,0, - 0,0,218,14,78,111,116,73,109,112,108,101,109,101,110,116, - 101,100,41,3,114,33,0,0,0,90,5,111,116,104,101,114, - 90,4,115,109,115,108,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,6,95,95,101,113,95,95,133,1,0, - 0,115,32,0,0,0,6,1,2,1,12,1,10,1,2,255, - 10,2,2,254,8,3,2,253,10,4,2,252,10,5,4,251, - 12,6,10,1,255,128,122,17,77,111,100,117,108,101,83,112, - 101,99,46,95,95,101,113,95,95,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,58,0,0,0,124,0,106,0,100,0,117,0,114, - 52,124,0,106,1,100,0,117,1,114,52,124,0,106,2,114, - 52,116,3,100,0,117,0,114,38,116,4,130,1,116,3,160, - 5,124,0,106,1,161,1,124,0,95,0,124,0,106,0,83, - 0,114,0,0,0,0,41,6,114,125,0,0,0,114,120,0, - 0,0,114,124,0,0,0,218,19,95,98,111,111,116,115,116, - 114,97,112,95,101,120,116,101,114,110,97,108,218,19,78,111, - 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, - 114,90,11,95,103,101,116,95,99,97,99,104,101,100,114,51, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,129,0,0,0,145,1,0,0,115,14,0,0,0, - 10,2,16,1,8,1,4,1,14,1,6,1,255,128,122,17, - 77,111,100,117,108,101,83,112,101,99,46,99,97,99,104,101, - 100,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,2,0,0,0,67,0,0,0,115,10,0,0,0,124, - 1,124,0,95,0,100,0,83,0,114,0,0,0,0,41,1, - 114,125,0,0,0,41,2,114,33,0,0,0,114,129,0,0, + 119,0,0,0,74,1,0,0,115,36,0,0,0,8,0,4, + 1,4,36,2,1,12,255,8,12,8,10,2,12,10,1,4, + 8,10,1,2,3,10,1,2,7,10,1,4,3,14,1,255, + 128,114,119,0,0,0,169,2,114,120,0,0,0,114,122,0, + 0,0,99,2,0,0,0,0,0,0,0,2,0,0,0,6, + 0,0,0,8,0,0,0,67,0,0,0,115,150,0,0,0, + 116,0,124,1,100,1,131,2,114,74,116,1,100,2,117,0, + 114,22,116,2,130,1,116,1,106,3,125,4,124,3,100,2, + 117,0,114,48,124,4,124,0,124,1,100,3,141,2,83,0, + 124,3,114,56,103,0,110,2,100,2,125,5,124,4,124,0, + 124,1,124,5,100,4,141,3,83,0,124,3,100,2,117,0, + 114,134,116,0,124,1,100,5,131,2,114,130,122,14,124,1, + 160,4,124,0,161,1,125,3,87,0,110,26,4,0,116,5, + 121,128,1,0,1,0,1,0,100,2,125,3,89,0,110,6, + 48,0,100,6,125,3,116,6,124,0,124,1,124,2,124,3, + 100,7,141,4,83,0,41,8,122,53,82,101,116,117,114,110, + 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, + 97,115,101,100,32,111,110,32,118,97,114,105,111,117,115,32, + 108,111,97,100,101,114,32,109,101,116,104,111,100,115,46,90, + 12,103,101,116,95,102,105,108,101,110,97,109,101,78,41,1, + 114,116,0,0,0,41,2,114,116,0,0,0,114,123,0,0, + 0,114,122,0,0,0,70,114,142,0,0,0,41,7,114,11, + 0,0,0,114,133,0,0,0,114,134,0,0,0,218,23,115, + 112,101,99,95,102,114,111,109,95,102,105,108,101,95,108,111, + 99,97,116,105,111,110,114,122,0,0,0,114,83,0,0,0, + 114,119,0,0,0,41,6,114,20,0,0,0,114,116,0,0, + 0,114,120,0,0,0,114,122,0,0,0,114,143,0,0,0, + 90,6,115,101,97,114,99,104,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,98,0,0,0,175,1,0,0, + 115,38,0,0,0,10,2,8,1,4,1,6,1,8,2,12, + 1,12,1,6,1,2,1,6,255,8,3,10,1,2,1,14, + 1,12,1,10,1,4,3,16,2,255,128,114,98,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,8,0,0, + 0,8,0,0,0,67,0,0,0,115,40,1,0,0,122,10, + 124,0,106,0,125,3,87,0,110,18,4,0,116,1,121,28, + 1,0,1,0,1,0,89,0,110,14,48,0,124,3,100,0, + 117,1,114,42,124,3,83,0,124,0,106,2,125,4,124,1, + 100,0,117,0,114,86,122,10,124,0,106,3,125,1,87,0, + 110,18,4,0,116,1,121,84,1,0,1,0,1,0,89,0, + 110,2,48,0,122,10,124,0,106,4,125,5,87,0,110,22, + 4,0,116,1,121,118,1,0,1,0,1,0,100,0,125,5, + 89,0,110,2,48,0,124,2,100,0,117,0,114,174,124,5, + 100,0,117,0,114,170,122,10,124,1,106,5,125,2,87,0, + 110,26,4,0,116,1,121,168,1,0,1,0,1,0,100,0, + 125,2,89,0,110,6,48,0,124,5,125,2,122,10,124,0, + 106,6,125,6,87,0,110,22,4,0,116,1,121,206,1,0, + 1,0,1,0,100,0,125,6,89,0,110,2,48,0,122,14, + 116,7,124,0,106,8,131,1,125,7,87,0,110,22,4,0, + 116,1,121,244,1,0,1,0,1,0,100,0,125,7,89,0, + 110,2,48,0,116,9,124,4,124,1,124,2,100,1,141,3, + 125,3,124,5,100,0,117,0,144,1,114,18,100,2,110,2, + 100,3,124,3,95,10,124,6,124,3,95,11,124,7,124,3, + 95,12,124,3,83,0,41,4,78,169,1,114,120,0,0,0, + 70,84,41,13,114,113,0,0,0,114,2,0,0,0,114,9, + 0,0,0,114,106,0,0,0,114,115,0,0,0,218,7,95, + 79,82,73,71,73,78,218,10,95,95,99,97,99,104,101,100, + 95,95,218,4,108,105,115,116,218,8,95,95,112,97,116,104, + 95,95,114,119,0,0,0,114,124,0,0,0,114,129,0,0, + 0,114,123,0,0,0,41,8,114,104,0,0,0,114,116,0, + 0,0,114,120,0,0,0,114,103,0,0,0,114,20,0,0, + 0,90,8,108,111,99,97,116,105,111,110,114,129,0,0,0, + 114,123,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,17,95,115,112,101,99,95,102,114,111,109, + 95,109,111,100,117,108,101,201,1,0,0,115,74,0,0,0, + 2,2,10,1,12,1,6,1,8,2,4,1,6,2,8,1, + 2,1,10,1,12,1,6,2,2,1,10,1,12,1,10,1, + 8,1,8,1,2,1,10,1,12,1,10,1,4,2,2,1, + 10,1,12,1,10,1,2,1,14,1,12,1,10,1,14,2, + 20,1,6,1,6,1,4,1,255,128,114,149,0,0,0,70, + 169,1,218,8,111,118,101,114,114,105,100,101,99,2,0,0, + 0,0,0,0,0,1,0,0,0,5,0,0,0,8,0,0, + 0,67,0,0,0,115,214,1,0,0,124,2,115,20,116,0, + 124,1,100,1,100,0,131,3,100,0,117,0,114,52,122,12, + 124,0,106,1,124,1,95,2,87,0,110,18,4,0,116,3, + 121,50,1,0,1,0,1,0,89,0,110,2,48,0,124,2, + 115,72,116,0,124,1,100,2,100,0,131,3,100,0,117,0, + 114,174,124,0,106,4,125,3,124,3,100,0,117,0,114,144, + 124,0,106,5,100,0,117,1,114,144,116,6,100,0,117,0, + 114,108,116,7,130,1,116,6,106,8,125,4,124,4,160,9, + 124,4,161,1,125,3,124,0,106,5,124,3,95,10,124,3, + 124,0,95,4,100,0,124,1,95,11,122,10,124,3,124,1, + 95,12,87,0,110,18,4,0,116,3,121,172,1,0,1,0, + 1,0,89,0,110,2,48,0,124,2,115,194,116,0,124,1, + 100,3,100,0,131,3,100,0,117,0,114,226,122,12,124,0, + 106,13,124,1,95,14,87,0,110,18,4,0,116,3,121,224, + 1,0,1,0,1,0,89,0,110,2,48,0,122,10,124,0, + 124,1,95,15,87,0,110,18,4,0,116,3,121,254,1,0, + 1,0,1,0,89,0,110,2,48,0,124,2,144,1,115,24, + 116,0,124,1,100,4,100,0,131,3,100,0,117,0,144,1, + 114,70,124,0,106,5,100,0,117,1,144,1,114,70,122,12, + 124,0,106,5,124,1,95,16,87,0,110,20,4,0,116,3, + 144,1,121,68,1,0,1,0,1,0,89,0,110,2,48,0, + 124,0,106,17,144,1,114,210,124,2,144,1,115,102,116,0, + 124,1,100,5,100,0,131,3,100,0,117,0,144,1,114,136, + 122,12,124,0,106,18,124,1,95,11,87,0,110,20,4,0, + 116,3,144,1,121,134,1,0,1,0,1,0,89,0,110,2, + 48,0,124,2,144,1,115,160,116,0,124,1,100,6,100,0, + 131,3,100,0,117,0,144,1,114,210,124,0,106,19,100,0, + 117,1,144,1,114,210,122,14,124,0,106,19,124,1,95,20, + 87,0,124,1,83,0,4,0,116,3,144,1,121,208,1,0, + 1,0,1,0,89,0,124,1,83,0,48,0,124,1,83,0, + 41,7,78,114,9,0,0,0,114,106,0,0,0,218,11,95, + 95,112,97,99,107,97,103,101,95,95,114,148,0,0,0,114, + 115,0,0,0,114,146,0,0,0,41,21,114,13,0,0,0, + 114,20,0,0,0,114,9,0,0,0,114,2,0,0,0,114, + 116,0,0,0,114,123,0,0,0,114,133,0,0,0,114,134, + 0,0,0,218,16,95,78,97,109,101,115,112,97,99,101,76, + 111,97,100,101,114,218,7,95,95,110,101,119,95,95,90,5, + 95,112,97,116,104,114,115,0,0,0,114,106,0,0,0,114, + 137,0,0,0,114,152,0,0,0,114,113,0,0,0,114,148, + 0,0,0,114,130,0,0,0,114,120,0,0,0,114,129,0, + 0,0,114,146,0,0,0,41,5,114,103,0,0,0,114,104, + 0,0,0,114,151,0,0,0,114,116,0,0,0,114,153,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,18,95,105,110,105,116,95,109,111,100,117,108,101,95, + 97,116,116,114,115,246,1,0,0,115,104,0,0,0,20,4, + 2,1,12,1,12,1,6,1,20,2,6,1,8,1,10,2, + 8,1,4,1,6,1,10,2,8,1,6,1,6,11,2,1, + 10,1,12,1,6,1,20,2,2,1,12,1,12,1,6,1, + 2,2,10,1,12,1,6,1,24,2,12,1,2,1,12,1, + 14,1,6,1,8,2,24,1,2,1,12,1,14,1,6,1, + 24,2,12,1,2,1,10,1,4,3,14,254,2,1,4,1, + 2,255,4,1,255,128,114,155,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,82,0,0,0,100,1,125,1,116,0,124, + 0,106,1,100,2,131,2,114,30,124,0,106,1,160,2,124, + 0,161,1,125,1,110,20,116,0,124,0,106,1,100,3,131, + 2,114,50,116,3,100,4,131,1,130,1,124,1,100,1,117, + 0,114,68,116,4,124,0,106,5,131,1,125,1,116,6,124, + 0,124,1,131,2,1,0,124,1,83,0,41,5,122,43,67, + 114,101,97,116,101,32,97,32,109,111,100,117,108,101,32,98, + 97,115,101,100,32,111,110,32,116,104,101,32,112,114,111,118, + 105,100,101,100,32,115,112,101,99,46,78,218,13,99,114,101, + 97,116,101,95,109,111,100,117,108,101,218,11,101,120,101,99, + 95,109,111,100,117,108,101,122,66,108,111,97,100,101,114,115, + 32,116,104,97,116,32,100,101,102,105,110,101,32,101,120,101, + 99,95,109,111,100,117,108,101,40,41,32,109,117,115,116,32, + 97,108,115,111,32,100,101,102,105,110,101,32,99,114,101,97, + 116,101,95,109,111,100,117,108,101,40,41,41,7,114,11,0, + 0,0,114,116,0,0,0,114,156,0,0,0,114,83,0,0, + 0,114,21,0,0,0,114,20,0,0,0,114,155,0,0,0, + 169,2,114,103,0,0,0,114,104,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,16,109,111,100, + 117,108,101,95,102,114,111,109,95,115,112,101,99,62,2,0, + 0,115,20,0,0,0,4,3,12,1,14,3,12,1,8,1, + 8,2,10,1,10,1,4,1,255,128,114,159,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,67,0,0,0,115,100,0,0,0,124,0,106, + 0,100,1,117,0,114,14,100,2,110,4,124,0,106,0,125, + 1,124,0,106,1,100,1,117,0,114,64,124,0,106,2,100, + 1,117,0,114,50,100,3,160,3,124,1,161,1,83,0,100, + 4,160,3,124,1,124,0,106,2,161,2,83,0,124,0,106, + 4,114,84,100,5,160,3,124,1,124,0,106,1,161,2,83, + 0,100,6,160,3,124,0,106,0,124,0,106,1,161,2,83, + 0,41,7,122,38,82,101,116,117,114,110,32,116,104,101,32, + 114,101,112,114,32,116,111,32,117,115,101,32,102,111,114,32, + 116,104,101,32,109,111,100,117,108,101,46,78,114,108,0,0, + 0,114,109,0,0,0,114,110,0,0,0,114,111,0,0,0, + 250,18,60,109,111,100,117,108,101,32,123,33,114,125,32,40, + 123,125,41,62,41,5,114,20,0,0,0,114,120,0,0,0, + 114,116,0,0,0,114,49,0,0,0,114,130,0,0,0,41, + 2,114,103,0,0,0,114,20,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,114,0,0,0,79, + 2,0,0,115,18,0,0,0,20,3,10,1,10,1,10,1, + 14,2,6,2,14,1,16,2,255,128,114,114,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 10,0,0,0,67,0,0,0,115,26,1,0,0,124,0,106, + 0,125,2,116,1,124,2,131,1,143,246,1,0,116,2,106, + 3,160,4,124,2,161,1,124,1,117,1,114,54,100,1,160, + 5,124,2,161,1,125,3,116,6,124,3,124,2,100,2,141, + 2,130,1,122,160,124,0,106,7,100,3,117,0,114,106,124, + 0,106,8,100,3,117,0,114,90,116,6,100,4,124,0,106, + 0,100,2,141,2,130,1,116,9,124,0,124,1,100,5,100, + 6,141,3,1,0,110,80,116,9,124,0,124,1,100,5,100, + 6,141,3,1,0,116,10,124,0,106,7,100,7,131,2,115, + 174,116,11,124,0,106,7,131,1,155,0,100,8,157,2,125, + 3,116,12,160,13,124,3,116,14,161,2,1,0,124,0,106, + 7,160,15,124,2,161,1,1,0,110,12,124,0,106,7,160, + 16,124,1,161,1,1,0,87,0,116,2,106,3,160,17,124, + 0,106,0,161,1,125,1,124,1,116,2,106,3,124,0,106, + 0,60,0,110,28,116,2,106,3,160,17,124,0,106,0,161, + 1,125,1,124,1,116,2,106,3,124,0,106,0,60,0,48, + 0,87,0,100,3,4,0,4,0,131,3,1,0,124,1,83, + 0,49,0,144,1,115,12,48,0,1,0,1,0,1,0,89, + 0,1,0,124,1,83,0,41,9,122,70,69,120,101,99,117, + 116,101,32,116,104,101,32,115,112,101,99,39,115,32,115,112, + 101,99,105,102,105,101,100,32,109,111,100,117,108,101,32,105, + 110,32,97,110,32,101,120,105,115,116,105,110,103,32,109,111, + 100,117,108,101,39,115,32,110,97,109,101,115,112,97,99,101, + 46,122,30,109,111,100,117,108,101,32,123,33,114,125,32,110, + 111,116,32,105,110,32,115,121,115,46,109,111,100,117,108,101, + 115,114,19,0,0,0,78,250,14,109,105,115,115,105,110,103, + 32,108,111,97,100,101,114,84,114,150,0,0,0,114,157,0, + 0,0,250,55,46,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,110,111,116,32,102,111,117,110,100,59,32,102,97, + 108,108,105,110,103,32,98,97,99,107,32,116,111,32,108,111, + 97,100,95,109,111,100,117,108,101,40,41,41,18,114,20,0, + 0,0,114,54,0,0,0,114,18,0,0,0,114,99,0,0, + 0,114,38,0,0,0,114,49,0,0,0,114,83,0,0,0, + 114,116,0,0,0,114,123,0,0,0,114,155,0,0,0,114, + 11,0,0,0,114,7,0,0,0,114,95,0,0,0,114,96, + 0,0,0,218,13,73,109,112,111,114,116,87,97,114,110,105, + 110,103,218,11,108,111,97,100,95,109,111,100,117,108,101,114, + 157,0,0,0,218,3,112,111,112,41,4,114,103,0,0,0, + 114,104,0,0,0,114,20,0,0,0,114,102,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,100, + 0,0,0,96,2,0,0,115,50,0,0,0,6,2,10,1, + 16,1,10,1,12,1,2,1,10,1,10,1,14,1,16,2, + 14,2,12,1,16,1,12,2,14,1,12,2,2,128,14,4, + 14,1,14,255,26,1,4,1,18,255,4,1,255,128,114,100, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,8,0,0,0,67,0,0,0,115,18,1,0, + 0,122,18,124,0,106,0,160,1,124,0,106,2,161,1,1, + 0,87,0,110,46,1,0,1,0,1,0,124,0,106,2,116, + 3,106,4,118,0,114,64,116,3,106,4,160,5,124,0,106, + 2,161,1,125,1,124,1,116,3,106,4,124,0,106,2,60, + 0,130,0,116,3,106,4,160,5,124,0,106,2,161,1,125, + 1,124,1,116,3,106,4,124,0,106,2,60,0,116,6,124, + 1,100,1,100,0,131,3,100,0,117,0,114,140,122,12,124, + 0,106,0,124,1,95,7,87,0,110,18,4,0,116,8,121, + 138,1,0,1,0,1,0,89,0,110,2,48,0,116,6,124, + 1,100,2,100,0,131,3,100,0,117,0,114,216,122,40,124, + 1,106,9,124,1,95,10,116,11,124,1,100,3,131,2,115, + 194,124,0,106,2,160,12,100,4,161,1,100,5,25,0,124, + 1,95,10,87,0,110,18,4,0,116,8,121,214,1,0,1, + 0,1,0,89,0,110,2,48,0,116,6,124,1,100,6,100, + 0,131,3,100,0,117,0,144,1,114,14,122,12,124,0,124, + 1,95,13,87,0,124,1,83,0,4,0,116,8,144,1,121, + 12,1,0,1,0,1,0,89,0,124,1,83,0,48,0,124, + 1,83,0,41,7,78,114,106,0,0,0,114,152,0,0,0, + 114,148,0,0,0,114,135,0,0,0,114,25,0,0,0,114, + 113,0,0,0,41,14,114,116,0,0,0,114,164,0,0,0, + 114,20,0,0,0,114,18,0,0,0,114,99,0,0,0,114, + 165,0,0,0,114,13,0,0,0,114,106,0,0,0,114,2, + 0,0,0,114,9,0,0,0,114,152,0,0,0,114,11,0, + 0,0,114,136,0,0,0,114,113,0,0,0,114,158,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,129,0,0,0,154,1,0,0,115,4,0,0,0,10,2, - 255,128,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,32,0,0,0, - 124,0,106,0,100,1,117,0,114,26,124,0,106,1,160,2, - 100,2,161,1,100,3,25,0,83,0,124,0,106,1,83,0, - 41,4,122,32,84,104,101,32,110,97,109,101,32,111,102,32, - 116,104,101,32,109,111,100,117,108,101,39,115,32,112,97,114, - 101,110,116,46,78,218,1,46,114,25,0,0,0,41,3,114, - 123,0,0,0,114,20,0,0,0,218,10,114,112,97,114,116, - 105,116,105,111,110,114,51,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,6,112,97,114,101,110, - 116,158,1,0,0,115,8,0,0,0,10,3,16,1,6,2, - 255,128,122,17,77,111,100,117,108,101,83,112,101,99,46,112, - 97,114,101,110,116,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,6, - 0,0,0,124,0,106,0,83,0,114,0,0,0,0,41,1, - 114,124,0,0,0,114,51,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,130,0,0,0,166,1, - 0,0,115,4,0,0,0,6,2,255,128,122,23,77,111,100, - 117,108,101,83,112,101,99,46,104,97,115,95,108,111,99,97, - 116,105,111,110,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,2,0,0,0,67,0,0,0,115,14,0, - 0,0,116,0,124,1,131,1,124,0,95,1,100,0,83,0, - 114,0,0,0,0,41,2,218,4,98,111,111,108,114,124,0, - 0,0,41,2,114,33,0,0,0,218,5,118,97,108,117,101, + 218,25,95,108,111,97,100,95,98,97,99,107,119,97,114,100, + 95,99,111,109,112,97,116,105,98,108,101,126,2,0,0,115, + 62,0,0,0,2,3,18,1,6,1,12,1,14,1,12,1, + 2,1,14,3,12,1,16,1,2,1,12,1,12,1,6,1, + 16,1,2,1,8,4,10,1,22,1,12,1,6,1,18,1, + 2,1,8,1,4,3,14,254,2,1,4,1,2,255,4,1, + 255,128,114,166,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,11,0,0,0,67,0,0,0, + 115,240,0,0,0,124,0,106,0,100,0,117,1,114,58,116, + 1,124,0,106,0,100,1,131,2,115,58,116,2,124,0,106, + 0,131,1,155,0,100,2,157,2,125,1,116,3,160,4,124, + 1,116,5,161,2,1,0,116,6,124,0,131,1,83,0,116, + 7,124,0,131,1,125,2,100,3,124,0,95,8,122,158,124, + 2,116,9,106,10,124,0,106,11,60,0,122,50,124,0,106, + 0,100,0,117,0,114,122,124,0,106,12,100,0,117,0,114, + 134,116,13,100,4,124,0,106,11,100,5,141,2,130,1,124, + 0,106,0,160,14,124,2,161,1,1,0,87,0,110,40,1, + 0,1,0,1,0,122,14,116,9,106,10,124,0,106,11,61, + 0,87,0,130,0,4,0,116,15,121,176,1,0,1,0,1, + 0,89,0,130,0,48,0,116,9,106,10,160,16,124,0,106, + 11,161,1,125,2,124,2,116,9,106,10,124,0,106,11,60, + 0,116,17,100,6,124,0,106,11,124,0,106,0,131,3,1, + 0,87,0,100,7,124,0,95,8,124,2,83,0,100,7,124, + 0,95,8,48,0,41,8,78,114,157,0,0,0,114,162,0, + 0,0,84,114,161,0,0,0,114,19,0,0,0,122,18,105, + 109,112,111,114,116,32,123,33,114,125,32,35,32,123,33,114, + 125,70,41,18,114,116,0,0,0,114,11,0,0,0,114,7, + 0,0,0,114,95,0,0,0,114,96,0,0,0,114,163,0, + 0,0,114,166,0,0,0,114,159,0,0,0,90,13,95,105, + 110,105,116,105,97,108,105,122,105,110,103,114,18,0,0,0, + 114,99,0,0,0,114,20,0,0,0,114,123,0,0,0,114, + 83,0,0,0,114,157,0,0,0,114,67,0,0,0,114,165, + 0,0,0,114,80,0,0,0,41,3,114,103,0,0,0,114, + 102,0,0,0,114,104,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,14,95,108,111,97,100,95, + 117,110,108,111,99,107,101,100,162,2,0,0,115,58,0,0, + 0,10,2,12,2,16,1,12,2,8,1,8,2,6,5,2, + 1,12,1,2,1,10,1,10,1,14,1,16,3,6,1,2, + 1,12,1,2,3,12,254,2,1,2,1,2,255,14,6,12, + 1,18,1,6,2,4,2,8,254,255,128,114,167,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,8,0,0,0,67,0,0,0,115,54,0,0,0,116,0, + 124,0,106,1,131,1,143,24,1,0,116,2,124,0,131,1, + 87,0,2,0,100,1,4,0,4,0,131,3,1,0,83,0, + 49,0,115,40,48,0,1,0,1,0,1,0,89,0,1,0, + 100,1,83,0,41,2,122,191,82,101,116,117,114,110,32,97, + 32,110,101,119,32,109,111,100,117,108,101,32,111,98,106,101, + 99,116,44,32,108,111,97,100,101,100,32,98,121,32,116,104, + 101,32,115,112,101,99,39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111, + 32,105,116,115,32,112,97,114,101,110,116,46,10,10,32,32, + 32,32,73,102,32,97,32,109,111,100,117,108,101,32,105,115, + 32,97,108,114,101,97,100,121,32,105,110,32,115,121,115,46, + 109,111,100,117,108,101,115,44,32,116,104,97,116,32,101,120, + 105,115,116,105,110,103,32,109,111,100,117,108,101,32,103,101, + 116,115,10,32,32,32,32,99,108,111,98,98,101,114,101,100, + 46,10,10,32,32,32,32,78,41,3,114,54,0,0,0,114, + 20,0,0,0,114,167,0,0,0,169,1,114,103,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 130,0,0,0,170,1,0,0,115,4,0,0,0,14,2,255, - 128,41,12,114,9,0,0,0,114,8,0,0,0,114,1,0, - 0,0,114,10,0,0,0,114,34,0,0,0,114,52,0,0, - 0,114,132,0,0,0,218,8,112,114,111,112,101,114,116,121, - 114,129,0,0,0,218,6,115,101,116,116,101,114,114,137,0, - 0,0,114,130,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,119,0,0,0, - 74,1,0,0,115,36,0,0,0,8,0,4,1,4,36,2, - 1,12,255,8,12,8,10,2,12,10,1,4,8,10,1,2, - 3,10,1,2,7,10,1,4,3,14,1,255,128,114,119,0, - 0,0,169,2,114,120,0,0,0,114,122,0,0,0,99,2, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,150,0,0,0,116,0,124,1, - 100,1,131,2,114,74,116,1,100,2,117,0,114,22,116,2, - 130,1,116,1,106,3,125,4,124,3,100,2,117,0,114,48, - 124,4,124,0,124,1,100,3,141,2,83,0,124,3,114,56, - 103,0,110,2,100,2,125,5,124,4,124,0,124,1,124,5, - 100,4,141,3,83,0,124,3,100,2,117,0,114,134,116,0, - 124,1,100,5,131,2,114,130,122,14,124,1,160,4,124,0, - 161,1,125,3,87,0,110,26,4,0,116,5,121,128,1,0, - 1,0,1,0,100,2,125,3,89,0,110,6,48,0,100,6, - 125,3,116,6,124,0,124,1,124,2,124,3,100,7,141,4, - 83,0,41,8,122,53,82,101,116,117,114,110,32,97,32,109, - 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, - 32,111,110,32,118,97,114,105,111,117,115,32,108,111,97,100, - 101,114,32,109,101,116,104,111,100,115,46,90,12,103,101,116, - 95,102,105,108,101,110,97,109,101,78,41,1,114,116,0,0, - 0,41,2,114,116,0,0,0,114,123,0,0,0,114,122,0, - 0,0,70,114,142,0,0,0,41,7,114,11,0,0,0,114, - 133,0,0,0,114,134,0,0,0,218,23,115,112,101,99,95, - 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, - 111,110,114,122,0,0,0,114,83,0,0,0,114,119,0,0, - 0,41,6,114,20,0,0,0,114,116,0,0,0,114,120,0, - 0,0,114,122,0,0,0,114,143,0,0,0,90,6,115,101, - 97,114,99,104,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,98,0,0,0,175,1,0,0,115,38,0,0, - 0,10,2,8,1,4,1,6,1,8,2,12,1,12,1,6, - 1,2,1,6,255,8,3,10,1,2,1,14,1,12,1,10, - 1,4,3,16,2,255,128,114,98,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0, - 0,67,0,0,0,115,40,1,0,0,122,10,124,0,106,0, - 125,3,87,0,110,18,4,0,116,1,121,28,1,0,1,0, - 1,0,89,0,110,14,48,0,124,3,100,0,117,1,114,42, - 124,3,83,0,124,0,106,2,125,4,124,1,100,0,117,0, - 114,86,122,10,124,0,106,3,125,1,87,0,110,18,4,0, - 116,1,121,84,1,0,1,0,1,0,89,0,110,2,48,0, - 122,10,124,0,106,4,125,5,87,0,110,22,4,0,116,1, - 121,118,1,0,1,0,1,0,100,0,125,5,89,0,110,2, - 48,0,124,2,100,0,117,0,114,174,124,5,100,0,117,0, - 114,170,122,10,124,1,106,5,125,2,87,0,110,26,4,0, - 116,1,121,168,1,0,1,0,1,0,100,0,125,2,89,0, - 110,6,48,0,124,5,125,2,122,10,124,0,106,6,125,6, - 87,0,110,22,4,0,116,1,121,206,1,0,1,0,1,0, - 100,0,125,6,89,0,110,2,48,0,122,14,116,7,124,0, - 106,8,131,1,125,7,87,0,110,22,4,0,116,1,121,244, - 1,0,1,0,1,0,100,0,125,7,89,0,110,2,48,0, - 116,9,124,4,124,1,124,2,100,1,141,3,125,3,124,5, - 100,0,117,0,144,1,114,18,100,2,110,2,100,3,124,3, - 95,10,124,6,124,3,95,11,124,7,124,3,95,12,124,3, - 83,0,41,4,78,169,1,114,120,0,0,0,70,84,41,13, - 114,113,0,0,0,114,2,0,0,0,114,9,0,0,0,114, - 106,0,0,0,114,115,0,0,0,218,7,95,79,82,73,71, - 73,78,218,10,95,95,99,97,99,104,101,100,95,95,218,4, - 108,105,115,116,218,8,95,95,112,97,116,104,95,95,114,119, - 0,0,0,114,124,0,0,0,114,129,0,0,0,114,123,0, - 0,0,41,8,114,104,0,0,0,114,116,0,0,0,114,120, - 0,0,0,114,103,0,0,0,114,20,0,0,0,90,8,108, - 111,99,97,116,105,111,110,114,129,0,0,0,114,123,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,17,95,115,112,101,99,95,102,114,111,109,95,109,111,100, - 117,108,101,201,1,0,0,115,74,0,0,0,2,2,10,1, - 12,1,6,1,8,2,4,1,6,2,8,1,2,1,10,1, - 12,1,6,2,2,1,10,1,12,1,10,1,8,1,8,1, - 2,1,10,1,12,1,10,1,4,2,2,1,10,1,12,1, - 10,1,2,1,14,1,12,1,10,1,14,2,20,1,6,1, - 6,1,4,1,255,128,114,149,0,0,0,70,169,1,218,8, - 111,118,101,114,114,105,100,101,99,2,0,0,0,0,0,0, - 0,1,0,0,0,5,0,0,0,8,0,0,0,67,0,0, - 0,115,214,1,0,0,124,2,115,20,116,0,124,1,100,1, - 100,0,131,3,100,0,117,0,114,52,122,12,124,0,106,1, - 124,1,95,2,87,0,110,18,4,0,116,3,121,50,1,0, - 1,0,1,0,89,0,110,2,48,0,124,2,115,72,116,0, - 124,1,100,2,100,0,131,3,100,0,117,0,114,174,124,0, - 106,4,125,3,124,3,100,0,117,0,114,144,124,0,106,5, - 100,0,117,1,114,144,116,6,100,0,117,0,114,108,116,7, - 130,1,116,6,106,8,125,4,124,4,160,9,124,4,161,1, - 125,3,124,0,106,5,124,3,95,10,124,3,124,0,95,4, - 100,0,124,1,95,11,122,10,124,3,124,1,95,12,87,0, - 110,18,4,0,116,3,121,172,1,0,1,0,1,0,89,0, - 110,2,48,0,124,2,115,194,116,0,124,1,100,3,100,0, - 131,3,100,0,117,0,114,226,122,12,124,0,106,13,124,1, - 95,14,87,0,110,18,4,0,116,3,121,224,1,0,1,0, - 1,0,89,0,110,2,48,0,122,10,124,0,124,1,95,15, - 87,0,110,18,4,0,116,3,121,254,1,0,1,0,1,0, - 89,0,110,2,48,0,124,2,144,1,115,24,116,0,124,1, - 100,4,100,0,131,3,100,0,117,0,144,1,114,70,124,0, - 106,5,100,0,117,1,144,1,114,70,122,12,124,0,106,5, - 124,1,95,16,87,0,110,20,4,0,116,3,144,1,121,68, - 1,0,1,0,1,0,89,0,110,2,48,0,124,0,106,17, - 144,1,114,210,124,2,144,1,115,102,116,0,124,1,100,5, - 100,0,131,3,100,0,117,0,144,1,114,136,122,12,124,0, - 106,18,124,1,95,11,87,0,110,20,4,0,116,3,144,1, - 121,134,1,0,1,0,1,0,89,0,110,2,48,0,124,2, - 144,1,115,160,116,0,124,1,100,6,100,0,131,3,100,0, - 117,0,144,1,114,210,124,0,106,19,100,0,117,1,144,1, - 114,210,122,14,124,0,106,19,124,1,95,20,87,0,124,1, - 83,0,4,0,116,3,144,1,121,208,1,0,1,0,1,0, - 89,0,124,1,83,0,48,0,124,1,83,0,41,7,78,114, - 9,0,0,0,114,106,0,0,0,218,11,95,95,112,97,99, - 107,97,103,101,95,95,114,148,0,0,0,114,115,0,0,0, - 114,146,0,0,0,41,21,114,13,0,0,0,114,20,0,0, - 0,114,9,0,0,0,114,2,0,0,0,114,116,0,0,0, - 114,123,0,0,0,114,133,0,0,0,114,134,0,0,0,218, - 16,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, - 114,218,7,95,95,110,101,119,95,95,90,5,95,112,97,116, - 104,114,115,0,0,0,114,106,0,0,0,114,137,0,0,0, - 114,152,0,0,0,114,113,0,0,0,114,148,0,0,0,114, - 130,0,0,0,114,120,0,0,0,114,129,0,0,0,114,146, - 0,0,0,41,5,114,103,0,0,0,114,104,0,0,0,114, - 151,0,0,0,114,116,0,0,0,114,153,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,18,95, - 105,110,105,116,95,109,111,100,117,108,101,95,97,116,116,114, - 115,246,1,0,0,115,104,0,0,0,20,4,2,1,12,1, - 12,1,6,1,20,2,6,1,8,1,10,2,8,1,4,1, - 6,1,10,2,8,1,6,1,6,11,2,1,10,1,12,1, - 6,1,20,2,2,1,12,1,12,1,6,1,2,2,10,1, - 12,1,6,1,24,2,12,1,2,1,12,1,14,1,6,1, - 8,2,24,1,2,1,12,1,14,1,6,1,24,2,12,1, - 2,1,10,1,4,3,14,254,2,1,4,1,2,255,4,1, - 255,128,114,155,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,82,0,0,0,100,1,125,1,116,0,124,0,106,1,100, - 2,131,2,114,30,124,0,106,1,160,2,124,0,161,1,125, - 1,110,20,116,0,124,0,106,1,100,3,131,2,114,50,116, - 3,100,4,131,1,130,1,124,1,100,1,117,0,114,68,116, - 4,124,0,106,5,131,1,125,1,116,6,124,0,124,1,131, - 2,1,0,124,1,83,0,41,5,122,43,67,114,101,97,116, - 101,32,97,32,109,111,100,117,108,101,32,98,97,115,101,100, - 32,111,110,32,116,104,101,32,112,114,111,118,105,100,101,100, - 32,115,112,101,99,46,78,218,13,99,114,101,97,116,101,95, - 109,111,100,117,108,101,218,11,101,120,101,99,95,109,111,100, - 117,108,101,122,66,108,111,97,100,101,114,115,32,116,104,97, - 116,32,100,101,102,105,110,101,32,101,120,101,99,95,109,111, - 100,117,108,101,40,41,32,109,117,115,116,32,97,108,115,111, - 32,100,101,102,105,110,101,32,99,114,101,97,116,101,95,109, - 111,100,117,108,101,40,41,41,7,114,11,0,0,0,114,116, - 0,0,0,114,156,0,0,0,114,83,0,0,0,114,21,0, - 0,0,114,20,0,0,0,114,155,0,0,0,169,2,114,103, - 0,0,0,114,104,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,16,109,111,100,117,108,101,95, - 102,114,111,109,95,115,112,101,99,62,2,0,0,115,20,0, - 0,0,4,3,12,1,14,3,12,1,8,1,8,2,10,1, - 10,1,4,1,255,128,114,159,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 67,0,0,0,115,100,0,0,0,124,0,106,0,100,1,117, - 0,114,14,100,2,110,4,124,0,106,0,125,1,124,0,106, - 1,100,1,117,0,114,64,124,0,106,2,100,1,117,0,114, - 50,100,3,160,3,124,1,161,1,83,0,100,4,160,3,124, - 1,124,0,106,2,161,2,83,0,124,0,106,4,114,84,100, - 5,160,3,124,1,124,0,106,1,161,2,83,0,100,6,160, - 3,124,0,106,0,124,0,106,1,161,2,83,0,41,7,122, - 38,82,101,116,117,114,110,32,116,104,101,32,114,101,112,114, - 32,116,111,32,117,115,101,32,102,111,114,32,116,104,101,32, - 109,111,100,117,108,101,46,78,114,108,0,0,0,114,109,0, - 0,0,114,110,0,0,0,114,111,0,0,0,250,18,60,109, - 111,100,117,108,101,32,123,33,114,125,32,40,123,125,41,62, - 41,5,114,20,0,0,0,114,120,0,0,0,114,116,0,0, - 0,114,49,0,0,0,114,130,0,0,0,41,2,114,103,0, - 0,0,114,20,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,114,0,0,0,79,2,0,0,115, - 18,0,0,0,20,3,10,1,10,1,10,1,14,2,6,2, - 14,1,16,2,255,128,114,114,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,10,0,0,0, - 67,0,0,0,115,26,1,0,0,124,0,106,0,125,2,116, - 1,124,2,131,1,143,246,1,0,116,2,106,3,160,4,124, - 2,161,1,124,1,117,1,114,54,100,1,160,5,124,2,161, - 1,125,3,116,6,124,3,124,2,100,2,141,2,130,1,122, - 160,124,0,106,7,100,3,117,0,114,106,124,0,106,8,100, - 3,117,0,114,90,116,6,100,4,124,0,106,0,100,2,141, - 2,130,1,116,9,124,0,124,1,100,5,100,6,141,3,1, - 0,110,80,116,9,124,0,124,1,100,5,100,6,141,3,1, - 0,116,10,124,0,106,7,100,7,131,2,115,174,116,11,124, - 0,106,7,131,1,155,0,100,8,157,2,125,3,116,12,160, - 13,124,3,116,14,161,2,1,0,124,0,106,7,160,15,124, - 2,161,1,1,0,110,12,124,0,106,7,160,16,124,1,161, - 1,1,0,87,0,116,2,106,3,160,17,124,0,106,0,161, - 1,125,1,124,1,116,2,106,3,124,0,106,0,60,0,110, - 28,116,2,106,3,160,17,124,0,106,0,161,1,125,1,124, - 1,116,2,106,3,124,0,106,0,60,0,48,0,87,0,100, - 3,4,0,4,0,131,3,1,0,124,1,83,0,49,0,144, - 1,115,12,48,0,1,0,1,0,1,0,89,0,1,0,124, - 1,83,0,41,9,122,70,69,120,101,99,117,116,101,32,116, - 104,101,32,115,112,101,99,39,115,32,115,112,101,99,105,102, - 105,101,100,32,109,111,100,117,108,101,32,105,110,32,97,110, - 32,101,120,105,115,116,105,110,103,32,109,111,100,117,108,101, - 39,115,32,110,97,109,101,115,112,97,99,101,46,122,30,109, - 111,100,117,108,101,32,123,33,114,125,32,110,111,116,32,105, - 110,32,115,121,115,46,109,111,100,117,108,101,115,114,19,0, - 0,0,78,250,14,109,105,115,115,105,110,103,32,108,111,97, - 100,101,114,84,114,150,0,0,0,114,157,0,0,0,250,55, - 46,101,120,101,99,95,109,111,100,117,108,101,40,41,32,110, - 111,116,32,102,111,117,110,100,59,32,102,97,108,108,105,110, - 103,32,98,97,99,107,32,116,111,32,108,111,97,100,95,109, - 111,100,117,108,101,40,41,41,18,114,20,0,0,0,114,54, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,38,0, - 0,0,114,49,0,0,0,114,83,0,0,0,114,116,0,0, - 0,114,123,0,0,0,114,155,0,0,0,114,11,0,0,0, - 114,7,0,0,0,114,95,0,0,0,114,96,0,0,0,218, - 13,73,109,112,111,114,116,87,97,114,110,105,110,103,218,11, - 108,111,97,100,95,109,111,100,117,108,101,114,157,0,0,0, - 218,3,112,111,112,41,4,114,103,0,0,0,114,104,0,0, - 0,114,20,0,0,0,114,102,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,114,100,0,0,0,96, - 2,0,0,115,48,0,0,0,6,2,10,1,16,1,10,1, - 12,1,2,1,10,1,10,1,14,1,16,2,14,2,12,1, - 16,1,12,2,14,1,14,2,14,4,14,1,14,255,26,1, - 4,1,18,255,4,1,255,128,114,100,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0, - 0,0,67,0,0,0,115,18,1,0,0,122,18,124,0,106, - 0,160,1,124,0,106,2,161,1,1,0,87,0,110,46,1, - 0,1,0,1,0,124,0,106,2,116,3,106,4,118,0,114, - 64,116,3,106,4,160,5,124,0,106,2,161,1,125,1,124, - 1,116,3,106,4,124,0,106,2,60,0,130,0,116,3,106, - 4,160,5,124,0,106,2,161,1,125,1,124,1,116,3,106, - 4,124,0,106,2,60,0,116,6,124,1,100,1,100,0,131, - 3,100,0,117,0,114,140,122,12,124,0,106,0,124,1,95, - 7,87,0,110,18,4,0,116,8,121,138,1,0,1,0,1, - 0,89,0,110,2,48,0,116,6,124,1,100,2,100,0,131, - 3,100,0,117,0,114,216,122,40,124,1,106,9,124,1,95, - 10,116,11,124,1,100,3,131,2,115,194,124,0,106,2,160, - 12,100,4,161,1,100,5,25,0,124,1,95,10,87,0,110, - 18,4,0,116,8,121,214,1,0,1,0,1,0,89,0,110, - 2,48,0,116,6,124,1,100,6,100,0,131,3,100,0,117, - 0,144,1,114,14,122,12,124,0,124,1,95,13,87,0,124, - 1,83,0,4,0,116,8,144,1,121,12,1,0,1,0,1, - 0,89,0,124,1,83,0,48,0,124,1,83,0,41,7,78, - 114,106,0,0,0,114,152,0,0,0,114,148,0,0,0,114, - 135,0,0,0,114,25,0,0,0,114,113,0,0,0,41,14, - 114,116,0,0,0,114,164,0,0,0,114,20,0,0,0,114, - 18,0,0,0,114,99,0,0,0,114,165,0,0,0,114,13, - 0,0,0,114,106,0,0,0,114,2,0,0,0,114,9,0, - 0,0,114,152,0,0,0,114,11,0,0,0,114,136,0,0, - 0,114,113,0,0,0,114,158,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,25,95,108,111,97, - 100,95,98,97,99,107,119,97,114,100,95,99,111,109,112,97, - 116,105,98,108,101,126,2,0,0,115,62,0,0,0,2,3, - 18,1,6,1,12,1,14,1,12,1,2,1,14,3,12,1, - 16,1,2,1,12,1,12,1,6,1,16,1,2,1,8,4, - 10,1,22,1,12,1,6,1,18,1,2,1,8,1,4,3, - 14,254,2,1,4,1,2,255,4,1,255,128,114,166,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,11,0,0,0,67,0,0,0,115,240,0,0,0,124, - 0,106,0,100,0,117,1,114,58,116,1,124,0,106,0,100, - 1,131,2,115,58,116,2,124,0,106,0,131,1,155,0,100, - 2,157,2,125,1,116,3,160,4,124,1,116,5,161,2,1, - 0,116,6,124,0,131,1,83,0,116,7,124,0,131,1,125, - 2,100,3,124,0,95,8,122,158,124,2,116,9,106,10,124, - 0,106,11,60,0,122,50,124,0,106,0,100,0,117,0,114, - 122,124,0,106,12,100,0,117,0,114,134,116,13,100,4,124, - 0,106,11,100,5,141,2,130,1,124,0,106,0,160,14,124, - 2,161,1,1,0,87,0,110,40,1,0,1,0,1,0,122, - 14,116,9,106,10,124,0,106,11,61,0,87,0,130,0,4, - 0,116,15,121,176,1,0,1,0,1,0,89,0,130,0,48, - 0,116,9,106,10,160,16,124,0,106,11,161,1,125,2,124, - 2,116,9,106,10,124,0,106,11,60,0,116,17,100,6,124, - 0,106,11,124,0,106,0,131,3,1,0,87,0,100,7,124, - 0,95,8,124,2,83,0,100,7,124,0,95,8,48,0,41, - 8,78,114,157,0,0,0,114,162,0,0,0,84,114,161,0, - 0,0,114,19,0,0,0,122,18,105,109,112,111,114,116,32, - 123,33,114,125,32,35,32,123,33,114,125,70,41,18,114,116, - 0,0,0,114,11,0,0,0,114,7,0,0,0,114,95,0, - 0,0,114,96,0,0,0,114,163,0,0,0,114,166,0,0, - 0,114,159,0,0,0,90,13,95,105,110,105,116,105,97,108, - 105,122,105,110,103,114,18,0,0,0,114,99,0,0,0,114, - 20,0,0,0,114,123,0,0,0,114,83,0,0,0,114,157, - 0,0,0,114,67,0,0,0,114,165,0,0,0,114,80,0, - 0,0,41,3,114,103,0,0,0,114,102,0,0,0,114,104, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,14,95,108,111,97,100,95,117,110,108,111,99,107, - 101,100,162,2,0,0,115,58,0,0,0,10,2,12,2,16, - 1,12,2,8,1,8,2,6,5,2,1,12,1,2,1,10, - 1,10,1,14,1,16,3,6,1,2,1,12,1,2,3,12, - 254,2,1,2,1,2,255,14,6,12,1,18,1,6,2,4, - 2,8,254,255,128,114,167,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,67, - 0,0,0,115,54,0,0,0,116,0,124,0,106,1,131,1, - 143,24,1,0,116,2,124,0,131,1,87,0,2,0,100,1, - 4,0,4,0,131,3,1,0,83,0,49,0,115,40,48,0, - 1,0,1,0,1,0,89,0,1,0,100,1,83,0,41,2, - 122,191,82,101,116,117,114,110,32,97,32,110,101,119,32,109, - 111,100,117,108,101,32,111,98,106,101,99,116,44,32,108,111, - 97,100,101,100,32,98,121,32,116,104,101,32,115,112,101,99, - 39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111,32,105,116,115,32,112, - 97,114,101,110,116,46,10,10,32,32,32,32,73,102,32,97, - 32,109,111,100,117,108,101,32,105,115,32,97,108,114,101,97, - 100,121,32,105,110,32,115,121,115,46,109,111,100,117,108,101, - 115,44,32,116,104,97,116,32,101,120,105,115,116,105,110,103, - 32,109,111,100,117,108,101,32,103,101,116,115,10,32,32,32, - 32,99,108,111,98,98,101,114,101,100,46,10,10,32,32,32, - 32,78,41,3,114,54,0,0,0,114,20,0,0,0,114,167, - 0,0,0,169,1,114,103,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,101,0,0,0,207,2, - 0,0,115,6,0,0,0,12,9,42,1,255,128,114,101,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,64,0,0,0,115,140,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, - 101,5,100,3,100,4,132,0,131,1,90,6,101,7,100,20, - 100,6,100,7,132,1,131,1,90,8,101,7,100,21,100,8, - 100,9,132,1,131,1,90,9,101,5,100,10,100,11,132,0, - 131,1,90,10,101,5,100,12,100,13,132,0,131,1,90,11, - 101,7,101,12,100,14,100,15,132,0,131,1,131,1,90,13, - 101,7,101,12,100,16,100,17,132,0,131,1,131,1,90,14, - 101,7,101,12,100,18,100,19,132,0,131,1,131,1,90,15, - 101,7,101,16,131,1,90,17,100,5,83,0,41,22,218,15, - 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,122, - 144,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, - 116,32,102,111,114,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, - 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, - 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, - 116,105,99,32,109,101,116,104,111,100,115,32,116,111,32,97, - 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, - 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, - 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, - 32,122,8,98,117,105,108,116,45,105,110,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0, - 67,0,0,0,115,22,0,0,0,100,1,124,0,106,0,155, - 2,100,2,116,1,106,2,155,0,100,3,157,5,83,0,41, - 5,250,115,82,101,116,117,114,110,32,114,101,112,114,32,102, - 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, - 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, - 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, - 32,32,32,32,32,32,122,8,60,109,111,100,117,108,101,32, - 122,2,32,40,122,2,41,62,78,41,3,114,9,0,0,0, - 114,169,0,0,0,114,145,0,0,0,169,1,114,104,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,107,0,0,0,233,2,0,0,115,4,0,0,0,22,7, - 255,128,122,27,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,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,5,0,0,0,67,0,0,0,115,42,0,0,0,124,2, - 100,0,117,1,114,12,100,0,83,0,116,0,160,1,124,1, - 161,1,114,38,116,2,124,1,124,0,124,0,106,3,100,1, - 141,3,83,0,100,0,83,0,169,2,78,114,144,0,0,0, - 41,4,114,61,0,0,0,90,10,105,115,95,98,117,105,108, - 116,105,110,114,98,0,0,0,114,145,0,0,0,169,4,218, - 3,99,108,115,114,85,0,0,0,218,4,112,97,116,104,218, - 6,116,97,114,103,101,116,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,9,102,105,110,100,95,115,112,101, - 99,242,2,0,0,115,12,0,0,0,8,2,4,1,10,1, - 16,1,4,2,255,128,122,25,66,117,105,108,116,105,110,73, - 109,112,111,114,116,101,114,46,102,105,110,100,95,115,112,101, - 99,99,3,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,4,0,0,0,67,0,0,0,115,30,0,0,0,124, - 0,160,0,124,1,124,2,161,2,125,3,124,3,100,1,117, - 1,114,26,124,3,106,1,83,0,100,1,83,0,41,2,122, - 175,70,105,110,100,32,116,104,101,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,46,10,10,32,32,32,32, - 32,32,32,32,73,102,32,39,112,97,116,104,39,32,105,115, - 32,101,118,101,114,32,115,112,101,99,105,102,105,101,100,32, - 116,104,101,110,32,116,104,101,32,115,101,97,114,99,104,32, - 105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,32, - 102,97,105,108,117,114,101,46,10,10,32,32,32,32,32,32, + 101,0,0,0,207,2,0,0,115,6,0,0,0,12,9,42, + 1,255,128,114,101,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, + 0,115,140,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,90,4,101,5,100,3,100,4,132,0,131,1, + 90,6,101,7,100,20,100,6,100,7,132,1,131,1,90,8, + 101,7,100,21,100,8,100,9,132,1,131,1,90,9,101,5, + 100,10,100,11,132,0,131,1,90,10,101,5,100,12,100,13, + 132,0,131,1,90,11,101,7,101,12,100,14,100,15,132,0, + 131,1,131,1,90,13,101,7,101,12,100,16,100,17,132,0, + 131,1,131,1,90,14,101,7,101,12,100,18,100,19,132,0, + 131,1,131,1,90,15,101,7,101,16,131,1,90,17,100,5, + 83,0,41,22,218,15,66,117,105,108,116,105,110,73,109,112, + 111,114,116,101,114,122,144,77,101,116,97,32,112,97,116,104, + 32,105,109,112,111,114,116,32,102,111,114,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,115,46,10,10,32, + 32,32,32,65,108,108,32,109,101,116,104,111,100,115,32,97, + 114,101,32,101,105,116,104,101,114,32,99,108,97,115,115,32, + 111,114,32,115,116,97,116,105,99,32,109,101,116,104,111,100, + 115,32,116,111,32,97,118,111,105,100,32,116,104,101,32,110, + 101,101,100,32,116,111,10,32,32,32,32,105,110,115,116,97, + 110,116,105,97,116,101,32,116,104,101,32,99,108,97,115,115, + 46,10,10,32,32,32,32,122,8,98,117,105,108,116,45,105, + 110,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,5,0,0,0,67,0,0,0,115,22,0,0,0,100, + 1,124,0,106,0,155,2,100,2,116,1,106,2,155,0,100, + 3,157,5,83,0,41,5,250,115,82,101,116,117,114,110,32, + 114,101,112,114,32,102,111,114,32,116,104,101,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, + 101,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, + 101,99,97,116,101,100,46,32,32,84,104,101,32,105,109,112, + 111,114,116,32,109,97,99,104,105,110,101,114,121,32,100,111, + 101,115,32,116,104,101,32,106,111,98,32,105,116,115,101,108, + 102,46,10,10,32,32,32,32,32,32,32,32,122,8,60,109, + 111,100,117,108,101,32,122,2,32,40,122,2,41,62,78,41, + 3,114,9,0,0,0,114,169,0,0,0,114,145,0,0,0, + 169,1,114,104,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,107,0,0,0,233,2,0,0,115, + 4,0,0,0,22,7,255,128,122,27,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,4,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, + 42,0,0,0,124,2,100,0,117,1,114,12,100,0,83,0, + 116,0,160,1,124,1,161,1,114,38,116,2,124,1,124,0, + 124,0,106,3,100,1,141,3,83,0,100,0,83,0,169,2, + 78,114,144,0,0,0,41,4,114,61,0,0,0,90,10,105, + 115,95,98,117,105,108,116,105,110,114,98,0,0,0,114,145, + 0,0,0,169,4,218,3,99,108,115,114,85,0,0,0,218, + 4,112,97,116,104,218,6,116,97,114,103,101,116,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,9,102,105, + 110,100,95,115,112,101,99,242,2,0,0,115,12,0,0,0, + 8,2,4,1,10,1,16,1,4,2,255,128,122,25,66,117, + 105,108,116,105,110,73,109,112,111,114,116,101,114,46,102,105, + 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,30,0,0,0,124,0,160,0,124,1,124,2,161,2,125, + 3,124,3,100,1,117,1,114,26,124,3,106,1,83,0,100, + 1,83,0,41,2,122,175,70,105,110,100,32,116,104,101,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,73,102,32,39,112,97, + 116,104,39,32,105,115,32,101,118,101,114,32,115,112,101,99, + 105,102,105,101,100,32,116,104,101,110,32,116,104,101,32,115, + 101,97,114,99,104,32,105,115,32,99,111,110,115,105,100,101, + 114,101,100,32,97,32,102,97,105,108,117,114,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, + 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,32,32,32,32,78,41,2,114,177,0,0,0,114,116, + 0,0,0,41,4,114,174,0,0,0,114,85,0,0,0,114, + 175,0,0,0,114,103,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,11,102,105,110,100,95,109, + 111,100,117,108,101,251,2,0,0,115,6,0,0,0,12,9, + 18,1,255,128,122,27,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,4,0,0,0,67,0,0,0,115,46,0,0,0,124, + 0,106,0,116,1,106,2,118,1,114,34,116,3,100,1,160, + 4,124,0,106,0,161,1,124,0,106,0,100,2,141,2,130, + 1,116,5,116,6,106,7,124,0,131,2,83,0,41,4,122, + 24,67,114,101,97,116,101,32,97,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,114,81,0,0,0,114,19, + 0,0,0,78,41,8,114,20,0,0,0,114,18,0,0,0, + 114,82,0,0,0,114,83,0,0,0,114,49,0,0,0,114, + 71,0,0,0,114,61,0,0,0,90,14,99,114,101,97,116, + 101,95,98,117,105,108,116,105,110,114,168,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,156,0, + 0,0,7,3,0,0,115,12,0,0,0,12,3,12,1,4, + 1,6,255,12,2,255,128,122,29,66,117,105,108,116,105,110, + 73,109,112,111,114,116,101,114,46,99,114,101,97,116,101,95, + 109,111,100,117,108,101,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 16,0,0,0,116,0,116,1,106,2,124,0,131,2,1,0, + 100,1,83,0,41,2,122,22,69,120,101,99,32,97,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,78,41, + 3,114,71,0,0,0,114,61,0,0,0,90,12,101,120,101, + 99,95,98,117,105,108,116,105,110,114,171,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,157,0, + 0,0,15,3,0,0,115,4,0,0,0,16,3,255,128,122, + 27,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, + 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, + 122,57,82,101,116,117,114,110,32,78,111,110,101,32,97,115, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 115,32,100,111,32,110,111,116,32,104,97,118,101,32,99,111, + 100,101,32,111,98,106,101,99,116,115,46,78,114,5,0,0, + 0,169,2,114,174,0,0,0,114,85,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,8,103,101, + 116,95,99,111,100,101,20,3,0,0,115,4,0,0,0,4, + 4,255,128,122,24,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,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,122,56,82,101,116,117,114,110,32,78,111,110,101,32,97, + 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, + 111,117,114,99,101,32,99,111,100,101,46,78,114,5,0,0, + 0,114,179,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,10,103,101,116,95,115,111,117,114,99, + 101,26,3,0,0,115,4,0,0,0,4,4,255,128,122,26, + 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,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,3,122,52, + 82,101,116,117,114,110,32,70,97,108,115,101,32,97,115,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, + 32,97,114,101,32,110,101,118,101,114,32,112,97,99,107,97, + 103,101,115,46,70,78,114,5,0,0,0,114,179,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 122,0,0,0,32,3,0,0,115,4,0,0,0,4,4,255, + 128,122,26,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,41,2,78, + 78,41,1,78,41,18,114,9,0,0,0,114,8,0,0,0, + 114,1,0,0,0,114,10,0,0,0,114,145,0,0,0,218, + 12,115,116,97,116,105,99,109,101,116,104,111,100,114,107,0, + 0,0,218,11,99,108,97,115,115,109,101,116,104,111,100,114, + 177,0,0,0,114,178,0,0,0,114,156,0,0,0,114,157, + 0,0,0,114,90,0,0,0,114,180,0,0,0,114,181,0, + 0,0,114,122,0,0,0,114,105,0,0,0,114,164,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,169,0,0,0,222,2,0,0,115,48, + 0,0,0,8,0,4,2,4,7,2,2,10,1,2,8,12, + 1,2,8,12,1,2,11,10,1,2,7,10,1,2,4,2, + 1,12,1,2,4,2,1,12,1,2,4,2,1,12,1,12, + 4,255,128,114,169,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, + 0,115,144,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,90,4,101,5,100,3,100,4,132,0,131,1, + 90,6,101,7,100,22,100,6,100,7,132,1,131,1,90,8, + 101,7,100,23,100,8,100,9,132,1,131,1,90,9,101,5, + 100,10,100,11,132,0,131,1,90,10,101,5,100,12,100,13, + 132,0,131,1,90,11,101,7,100,14,100,15,132,0,131,1, + 90,12,101,7,101,13,100,16,100,17,132,0,131,1,131,1, + 90,14,101,7,101,13,100,18,100,19,132,0,131,1,131,1, + 90,15,101,7,101,13,100,20,100,21,132,0,131,1,131,1, + 90,16,100,5,83,0,41,24,218,14,70,114,111,122,101,110, + 73,109,112,111,114,116,101,114,122,142,77,101,116,97,32,112, + 97,116,104,32,105,109,112,111,114,116,32,102,111,114,32,102, + 114,111,122,101,110,32,109,111,100,117,108,101,115,46,10,10, + 32,32,32,32,65,108,108,32,109,101,116,104,111,100,115,32, + 97,114,101,32,101,105,116,104,101,114,32,99,108,97,115,115, + 32,111,114,32,115,116,97,116,105,99,32,109,101,116,104,111, + 100,115,32,116,111,32,97,118,111,105,100,32,116,104,101,32, + 110,101,101,100,32,116,111,10,32,32,32,32,105,110,115,116, + 97,110,116,105,97,116,101,32,116,104,101,32,99,108,97,115, + 115,46,10,10,32,32,32,32,90,6,102,114,111,122,101,110, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,4,0,0,0,67,0,0,0,115,16,0,0,0,100,1, + 160,0,124,0,106,1,116,2,106,3,161,2,83,0,41,3, + 114,170,0,0,0,114,160,0,0,0,78,41,4,114,49,0, + 0,0,114,9,0,0,0,114,184,0,0,0,114,145,0,0, + 0,41,1,218,1,109,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,107,0,0,0,52,3,0,0,115,4, + 0,0,0,16,7,255,128,122,26,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,4,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,5,0,0,0,67,0,0,0,115,30,0, + 0,0,116,0,160,1,124,1,161,1,114,26,116,2,124,1, + 124,0,124,0,106,3,100,1,141,3,83,0,100,0,83,0, + 114,172,0,0,0,41,4,114,61,0,0,0,114,92,0,0, + 0,114,98,0,0,0,114,145,0,0,0,114,173,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 177,0,0,0,61,3,0,0,115,8,0,0,0,10,2,16, + 1,4,2,255,128,122,24,70,114,111,122,101,110,73,109,112, + 111,114,116,101,114,46,102,105,110,100,95,115,112,101,99,99, + 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,18,0,0,0,116,0,160, + 1,124,1,161,1,114,14,124,0,83,0,100,1,83,0,41, + 2,122,93,70,105,110,100,32,97,32,102,114,111,122,101,110, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110, 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, - 78,41,2,114,177,0,0,0,114,116,0,0,0,41,4,114, - 174,0,0,0,114,85,0,0,0,114,175,0,0,0,114,103, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,11,102,105,110,100,95,109,111,100,117,108,101,251, - 2,0,0,115,6,0,0,0,12,9,18,1,255,128,122,27, - 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46, + 78,41,2,114,61,0,0,0,114,92,0,0,0,41,3,114, + 174,0,0,0,114,85,0,0,0,114,175,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,178,0, + 0,0,68,3,0,0,115,4,0,0,0,18,7,255,128,122, + 26,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,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, - 67,0,0,0,115,46,0,0,0,124,0,106,0,116,1,106, - 2,118,1,114,34,116,3,100,1,160,4,124,0,106,0,161, - 1,124,0,106,0,100,2,141,2,130,1,116,5,116,6,106, - 7,124,0,131,2,83,0,41,4,122,24,67,114,101,97,116, - 101,32,97,32,98,117,105,108,116,45,105,110,32,109,111,100, - 117,108,101,114,81,0,0,0,114,19,0,0,0,78,41,8, - 114,20,0,0,0,114,18,0,0,0,114,82,0,0,0,114, - 83,0,0,0,114,49,0,0,0,114,71,0,0,0,114,61, - 0,0,0,90,14,99,114,101,97,116,101,95,98,117,105,108, - 116,105,110,114,168,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,156,0,0,0,7,3,0,0, - 115,12,0,0,0,12,3,12,1,4,1,6,255,12,2,255, - 128,122,29,66,117,105,108,116,105,110,73,109,112,111,114,116, - 101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,101, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,16,0,0,0,116,0, - 116,1,106,2,124,0,131,2,1,0,100,1,83,0,41,2, - 122,22,69,120,101,99,32,97,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,78,41,3,114,71,0,0,0, - 114,61,0,0,0,90,12,101,120,101,99,95,98,117,105,108, - 116,105,110,114,171,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,157,0,0,0,15,3,0,0, - 115,4,0,0,0,16,3,255,128,122,27,66,117,105,108,116, - 105,110,73,109,112,111,114,116,101,114,46,101,120,101,99,95, + 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0, + 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, + 42,85,115,101,32,100,101,102,97,117,108,116,32,115,101,109, + 97,110,116,105,99,115,32,102,111,114,32,109,111,100,117,108, + 101,32,99,114,101,97,116,105,111,110,46,78,114,5,0,0, + 0,114,168,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,156,0,0,0,77,3,0,0,115,4, + 0,0,0,4,0,255,128,122,28,70,114,111,122,101,110,73, + 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, + 111,100,117,108,101,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,64, + 0,0,0,124,0,106,0,106,1,125,1,116,2,160,3,124, + 1,161,1,115,36,116,4,100,1,160,5,124,1,161,1,124, + 1,100,2,141,2,130,1,116,6,116,2,106,7,124,1,131, + 2,125,2,116,8,124,2,124,0,106,9,131,2,1,0,100, + 0,83,0,114,91,0,0,0,41,10,114,113,0,0,0,114, + 20,0,0,0,114,61,0,0,0,114,92,0,0,0,114,83, + 0,0,0,114,49,0,0,0,114,71,0,0,0,218,17,103, + 101,116,95,102,114,111,122,101,110,95,111,98,106,101,99,116, + 218,4,101,120,101,99,114,14,0,0,0,41,3,114,104,0, + 0,0,114,20,0,0,0,218,4,99,111,100,101,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,157,0,0, + 0,81,3,0,0,115,16,0,0,0,8,2,10,1,10,1, + 2,1,6,255,12,2,16,1,255,128,122,26,70,114,111,122, + 101,110,73,109,112,111,114,116,101,114,46,101,120,101,99,95, 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,2,122,57,82,101,116,117, - 114,110,32,78,111,110,101,32,97,115,32,98,117,105,108,116, - 45,105,110,32,109,111,100,117,108,101,115,32,100,111,32,110, - 111,116,32,104,97,118,101,32,99,111,100,101,32,111,98,106, - 101,99,116,115,46,78,114,5,0,0,0,169,2,114,174,0, - 0,0,114,85,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,8,103,101,116,95,99,111,100,101, - 20,3,0,0,115,4,0,0,0,4,4,255,128,122,24,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, - 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,122,56,82,101,116, - 117,114,110,32,78,111,110,101,32,97,115,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,115,32,100,111,32, - 110,111,116,32,104,97,118,101,32,115,111,117,114,99,101,32, - 99,111,100,101,46,78,114,5,0,0,0,114,179,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 10,0,0,0,116,0,124,0,124,1,131,2,83,0,41,2, + 122,95,76,111,97,100,32,97,32,102,114,111,122,101,110,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,78,41,1,114,105,0,0,0,114,179,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,164,0, + 0,0,90,3,0,0,115,4,0,0,0,10,8,255,128,122, + 26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,10,0,0,0,116,0,160,1,124,1,161, + 1,83,0,41,2,122,45,82,101,116,117,114,110,32,116,104, + 101,32,99,111,100,101,32,111,98,106,101,99,116,32,102,111, + 114,32,116,104,101,32,102,114,111,122,101,110,32,109,111,100, + 117,108,101,46,78,41,2,114,61,0,0,0,114,186,0,0, + 0,114,179,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,180,0,0,0,100,3,0,0,115,4, + 0,0,0,10,4,255,128,122,23,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,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 83,0,41,2,122,54,82,101,116,117,114,110,32,78,111,110, + 101,32,97,115,32,102,114,111,122,101,110,32,109,111,100,117, + 108,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32, + 115,111,117,114,99,101,32,99,111,100,101,46,78,114,5,0, + 0,0,114,179,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,181,0,0,0,106,3,0,0,115, + 4,0,0,0,4,4,255,128,122,25,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,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,10,0,0, + 0,116,0,160,1,124,1,161,1,83,0,41,2,122,46,82, + 101,116,117,114,110,32,84,114,117,101,32,105,102,32,116,104, + 101,32,102,114,111,122,101,110,32,109,111,100,117,108,101,32, + 105,115,32,97,32,112,97,99,107,97,103,101,46,78,41,2, + 114,61,0,0,0,90,17,105,115,95,102,114,111,122,101,110, + 95,112,97,99,107,97,103,101,114,179,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,122,0,0, + 0,112,3,0,0,115,4,0,0,0,10,4,255,128,122,25, + 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,41,2,78,78,41,1,78, + 41,17,114,9,0,0,0,114,8,0,0,0,114,1,0,0, + 0,114,10,0,0,0,114,145,0,0,0,114,182,0,0,0, + 114,107,0,0,0,114,183,0,0,0,114,177,0,0,0,114, + 178,0,0,0,114,156,0,0,0,114,157,0,0,0,114,164, + 0,0,0,114,94,0,0,0,114,180,0,0,0,114,181,0, + 0,0,114,122,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,184,0,0,0, + 41,3,0,0,115,50,0,0,0,8,0,4,2,4,7,2, + 2,10,1,2,8,12,1,2,6,12,1,2,8,10,1,2, + 3,10,1,2,8,10,1,2,9,2,1,12,1,2,4,2, + 1,12,1,2,4,2,1,16,1,255,128,114,184,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,64,0,0,0,115,32,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,100,6,83,0,41,7, + 218,18,95,73,109,112,111,114,116,76,111,99,107,67,111,110, + 116,101,120,116,122,36,67,111,110,116,101,120,116,32,109,97, + 110,97,103,101,114,32,102,111,114,32,116,104,101,32,105,109, + 112,111,114,116,32,108,111,99,107,46,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, + 0,0,0,115,12,0,0,0,116,0,160,1,161,0,1,0, + 100,1,83,0,41,2,122,24,65,99,113,117,105,114,101,32, + 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, + 78,41,2,114,61,0,0,0,114,62,0,0,0,114,51,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,58,0,0,0,125,3,0,0,115,4,0,0,0,12, + 2,255,128,122,28,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,0,0,0,0,4,0, + 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,160,1,161,0,1,0,100,1,83,0,41,2,122,60,82, + 101,108,101,97,115,101,32,116,104,101,32,105,109,112,111,114, + 116,32,108,111,99,107,32,114,101,103,97,114,100,108,101,115, + 115,32,111,102,32,97,110,121,32,114,97,105,115,101,100,32, + 101,120,99,101,112,116,105,111,110,115,46,78,41,2,114,61, + 0,0,0,114,64,0,0,0,41,4,114,33,0,0,0,218, + 8,101,120,99,95,116,121,112,101,218,9,101,120,99,95,118, + 97,108,117,101,218,13,101,120,99,95,116,114,97,99,101,98, + 97,99,107,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,114,60,0,0,0,129,3,0,0,115,4,0,0,0, + 12,2,255,128,122,27,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,41,6,114,9,0,0,0,114,8,0,0,0,114,1, + 0,0,0,114,10,0,0,0,114,58,0,0,0,114,60,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,189,0,0,0,121,3,0,0,115, + 10,0,0,0,8,0,4,2,8,2,12,4,255,128,114,189, + 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, + 5,0,0,0,5,0,0,0,67,0,0,0,115,64,0,0, + 0,124,1,160,0,100,1,124,2,100,2,24,0,161,2,125, + 3,116,1,124,3,131,1,124,2,107,0,114,36,116,2,100, + 3,131,1,130,1,124,3,100,4,25,0,125,4,124,0,114, + 60,100,5,160,3,124,4,124,0,161,2,83,0,124,4,83, + 0,41,7,122,50,82,101,115,111,108,118,101,32,97,32,114, + 101,108,97,116,105,118,101,32,109,111,100,117,108,101,32,110, + 97,109,101,32,116,111,32,97,110,32,97,98,115,111,108,117, + 116,101,32,111,110,101,46,114,135,0,0,0,114,42,0,0, + 0,122,50,97,116,116,101,109,112,116,101,100,32,114,101,108, + 97,116,105,118,101,32,105,109,112,111,114,116,32,98,101,121, + 111,110,100,32,116,111,112,45,108,101,118,101,108,32,112,97, + 99,107,97,103,101,114,25,0,0,0,250,5,123,125,46,123, + 125,78,41,4,218,6,114,115,112,108,105,116,218,3,108,101, + 110,114,83,0,0,0,114,49,0,0,0,41,5,114,20,0, + 0,0,218,7,112,97,99,107,97,103,101,218,5,108,101,118, + 101,108,90,4,98,105,116,115,90,4,98,97,115,101,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,13,95, + 114,101,115,111,108,118,101,95,110,97,109,101,134,3,0,0, + 115,12,0,0,0,16,2,12,1,8,1,8,1,20,1,255, + 128,114,198,0,0,0,99,3,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, + 34,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, + 124,3,100,0,117,0,114,24,100,0,83,0,116,1,124,1, + 124,3,131,2,83,0,114,0,0,0,0,41,2,114,178,0, + 0,0,114,98,0,0,0,41,4,218,6,102,105,110,100,101, + 114,114,20,0,0,0,114,175,0,0,0,114,116,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 10,103,101,116,95,115,111,117,114,99,101,26,3,0,0,115, - 4,0,0,0,4,4,255,128,122,26,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,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,41,3,122,52,82,101,116,117,114,110, - 32,70,97,108,115,101,32,97,115,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,32,97,114,101,32,110, - 101,118,101,114,32,112,97,99,107,97,103,101,115,46,70,78, - 114,5,0,0,0,114,179,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,122,0,0,0,32,3, - 0,0,115,4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78,41,18, - 114,9,0,0,0,114,8,0,0,0,114,1,0,0,0,114, - 10,0,0,0,114,145,0,0,0,218,12,115,116,97,116,105, - 99,109,101,116,104,111,100,114,107,0,0,0,218,11,99,108, - 97,115,115,109,101,116,104,111,100,114,177,0,0,0,114,178, - 0,0,0,114,156,0,0,0,114,157,0,0,0,114,90,0, - 0,0,114,180,0,0,0,114,181,0,0,0,114,122,0,0, - 0,114,105,0,0,0,114,164,0,0,0,114,5,0,0,0, + 17,95,102,105,110,100,95,115,112,101,99,95,108,101,103,97, + 99,121,143,3,0,0,115,10,0,0,0,12,3,8,1,4, + 1,10,1,255,128,114,200,0,0,0,99,3,0,0,0,0, + 0,0,0,0,0,0,0,10,0,0,0,10,0,0,0,67, + 0,0,0,115,28,1,0,0,116,0,106,1,125,3,124,3, + 100,1,117,0,114,22,116,2,100,2,131,1,130,1,124,3, + 115,38,116,3,160,4,100,3,116,5,161,2,1,0,124,0, + 116,0,106,6,118,0,125,4,124,3,68,0,93,226,125,5, + 116,7,131,0,143,94,1,0,122,10,124,5,106,8,125,6, + 87,0,110,54,4,0,116,9,121,128,1,0,1,0,1,0, + 116,10,124,5,124,0,124,1,131,3,125,7,124,7,100,1, + 117,0,114,124,89,0,87,0,100,1,4,0,4,0,131,3, + 1,0,113,52,89,0,110,14,48,0,124,6,124,0,124,1, + 124,2,131,3,125,7,87,0,100,1,4,0,4,0,131,3, + 1,0,110,16,49,0,115,162,48,0,1,0,1,0,1,0, + 89,0,1,0,124,7,100,1,117,1,114,52,124,4,144,1, + 115,16,124,0,116,0,106,6,118,0,144,1,114,16,116,0, + 106,6,124,0,25,0,125,8,122,10,124,8,106,11,125,9, + 87,0,110,26,4,0,116,9,121,244,1,0,1,0,1,0, + 124,7,6,0,89,0,2,0,1,0,83,0,48,0,124,9, + 100,1,117,0,144,1,114,8,124,7,2,0,1,0,83,0, + 124,9,2,0,1,0,83,0,124,7,2,0,1,0,83,0, + 100,1,83,0,41,4,122,21,70,105,110,100,32,97,32,109, + 111,100,117,108,101,39,115,32,115,112,101,99,46,78,122,53, + 115,121,115,46,109,101,116,97,95,112,97,116,104,32,105,115, + 32,78,111,110,101,44,32,80,121,116,104,111,110,32,105,115, + 32,108,105,107,101,108,121,32,115,104,117,116,116,105,110,103, + 32,100,111,119,110,122,22,115,121,115,46,109,101,116,97,95, + 112,97,116,104,32,105,115,32,101,109,112,116,121,41,12,114, + 18,0,0,0,218,9,109,101,116,97,95,112,97,116,104,114, + 83,0,0,0,114,95,0,0,0,114,96,0,0,0,114,163, + 0,0,0,114,99,0,0,0,114,189,0,0,0,114,177,0, + 0,0,114,2,0,0,0,114,200,0,0,0,114,113,0,0, + 0,41,10,114,20,0,0,0,114,175,0,0,0,114,176,0, + 0,0,114,201,0,0,0,90,9,105,115,95,114,101,108,111, + 97,100,114,199,0,0,0,114,177,0,0,0,114,103,0,0, + 0,114,104,0,0,0,114,113,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,10,95,102,105,110, + 100,95,115,112,101,99,152,3,0,0,115,56,0,0,0,6, + 2,8,1,8,2,4,3,12,1,10,5,8,1,8,1,2, + 1,10,1,12,1,12,1,8,1,22,1,42,2,8,1,18, + 2,10,1,2,1,10,1,12,1,14,4,10,2,8,1,8, + 2,8,2,4,2,255,128,114,202,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, + 0,67,0,0,0,115,110,0,0,0,116,0,124,0,116,1, + 131,2,115,28,116,2,100,1,160,3,116,4,124,0,131,1, + 161,1,131,1,130,1,124,2,100,2,107,0,114,44,116,5, + 100,3,131,1,130,1,124,2,100,2,107,4,114,82,116,0, + 124,1,116,1,131,2,115,70,116,2,100,4,131,1,130,1, + 124,1,115,82,116,6,100,5,131,1,130,1,124,0,115,106, + 124,2,100,2,107,2,114,102,116,5,100,6,131,1,130,1, + 100,7,83,0,100,7,83,0,41,8,122,28,86,101,114,105, + 102,121,32,97,114,103,117,109,101,110,116,115,32,97,114,101, + 32,34,115,97,110,101,34,46,122,31,109,111,100,117,108,101, + 32,110,97,109,101,32,109,117,115,116,32,98,101,32,115,116, + 114,44,32,110,111,116,32,123,125,114,25,0,0,0,122,18, + 108,101,118,101,108,32,109,117,115,116,32,98,101,32,62,61, + 32,48,122,31,95,95,112,97,99,107,97,103,101,95,95,32, + 110,111,116,32,115,101,116,32,116,111,32,97,32,115,116,114, + 105,110,103,122,54,97,116,116,101,109,112,116,101,100,32,114, + 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,119, + 105,116,104,32,110,111,32,107,110,111,119,110,32,112,97,114, + 101,110,116,32,112,97,99,107,97,103,101,122,17,69,109,112, + 116,121,32,109,111,100,117,108,101,32,110,97,109,101,78,41, + 7,218,10,105,115,105,110,115,116,97,110,99,101,218,3,115, + 116,114,218,9,84,121,112,101,69,114,114,111,114,114,49,0, + 0,0,114,3,0,0,0,218,10,86,97,108,117,101,69,114, + 114,111,114,114,83,0,0,0,169,3,114,20,0,0,0,114, + 196,0,0,0,114,197,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,13,95,115,97,110,105,116, + 121,95,99,104,101,99,107,199,3,0,0,115,26,0,0,0, + 10,2,18,1,8,1,8,1,8,1,10,1,8,1,4,1, + 8,1,12,2,8,1,8,255,255,128,114,208,0,0,0,122, + 16,78,111,32,109,111,100,117,108,101,32,110,97,109,101,100, + 32,122,4,123,33,114,125,99,2,0,0,0,0,0,0,0, + 0,0,0,0,9,0,0,0,8,0,0,0,67,0,0,0, + 115,20,1,0,0,100,0,125,2,124,0,160,0,100,1,161, + 1,100,2,25,0,125,3,124,3,114,128,124,3,116,1,106, + 2,118,1,114,42,116,3,124,1,124,3,131,2,1,0,124, + 0,116,1,106,2,118,0,114,62,116,1,106,2,124,0,25, + 0,83,0,116,1,106,2,124,3,25,0,125,4,122,10,124, + 4,106,4,125,2,87,0,110,44,4,0,116,5,121,126,1, + 0,1,0,1,0,116,6,100,3,23,0,160,7,124,0,124, + 3,161,2,125,5,116,8,124,5,124,0,100,4,141,2,100, + 0,130,2,48,0,116,9,124,0,124,2,131,2,125,6,124, + 6,100,0,117,0,114,164,116,8,116,6,160,7,124,0,161, + 1,124,0,100,4,141,2,130,1,116,10,124,6,131,1,125, + 7,124,3,144,1,114,16,116,1,106,2,124,3,25,0,125, + 4,124,0,160,0,100,1,161,1,100,5,25,0,125,8,122, + 18,116,11,124,4,124,8,124,7,131,3,1,0,87,0,124, + 7,83,0,4,0,116,5,144,1,121,14,1,0,1,0,1, + 0,100,6,124,3,155,2,100,7,124,8,155,2,157,4,125, + 5,116,12,160,13,124,5,116,14,161,2,1,0,89,0,124, + 7,83,0,48,0,124,7,83,0,41,8,78,114,135,0,0, + 0,114,25,0,0,0,122,23,59,32,123,33,114,125,32,105, + 115,32,110,111,116,32,97,32,112,97,99,107,97,103,101,114, + 19,0,0,0,233,2,0,0,0,122,27,67,97,110,110,111, + 116,32,115,101,116,32,97,110,32,97,116,116,114,105,98,117, + 116,101,32,111,110,32,122,18,32,102,111,114,32,99,104,105, + 108,100,32,109,111,100,117,108,101,32,41,15,114,136,0,0, + 0,114,18,0,0,0,114,99,0,0,0,114,71,0,0,0, + 114,148,0,0,0,114,2,0,0,0,218,8,95,69,82,82, + 95,77,83,71,114,49,0,0,0,218,19,77,111,100,117,108, + 101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,202, + 0,0,0,114,167,0,0,0,114,12,0,0,0,114,95,0, + 0,0,114,96,0,0,0,114,163,0,0,0,41,9,114,20, + 0,0,0,218,7,105,109,112,111,114,116,95,114,175,0,0, + 0,114,137,0,0,0,90,13,112,97,114,101,110,116,95,109, + 111,100,117,108,101,114,102,0,0,0,114,103,0,0,0,114, + 104,0,0,0,90,5,99,104,105,108,100,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,23,95,102,105,110, + 100,95,97,110,100,95,108,111,97,100,95,117,110,108,111,99, + 107,101,100,218,3,0,0,115,60,0,0,0,4,1,14,1, + 4,1,10,1,10,1,10,2,10,1,10,1,2,1,10,1, + 12,1,16,1,16,1,10,1,8,1,18,1,8,2,6,1, + 10,2,14,1,2,1,14,1,4,4,14,253,16,1,14,1, + 4,1,2,255,4,1,255,128,114,213,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0, + 0,0,67,0,0,0,115,128,0,0,0,116,0,124,0,131, + 1,143,62,1,0,116,1,106,2,160,3,124,0,116,4,161, + 2,125,2,124,2,116,4,117,0,114,56,116,5,124,0,124, + 1,131,2,87,0,2,0,100,1,4,0,4,0,131,3,1, + 0,83,0,87,0,100,1,4,0,4,0,131,3,1,0,110, + 16,49,0,115,76,48,0,1,0,1,0,1,0,89,0,1, + 0,124,2,100,1,117,0,114,116,100,2,160,6,124,0,161, + 1,125,3,116,7,124,3,124,0,100,3,141,2,130,1,116, + 8,124,0,131,1,1,0,124,2,83,0,41,4,122,25,70, + 105,110,100,32,97,110,100,32,108,111,97,100,32,116,104,101, + 32,109,111,100,117,108,101,46,78,122,40,105,109,112,111,114, + 116,32,111,102,32,123,125,32,104,97,108,116,101,100,59,32, + 78,111,110,101,32,105,110,32,115,121,115,46,109,111,100,117, + 108,101,115,114,19,0,0,0,41,9,114,54,0,0,0,114, + 18,0,0,0,114,99,0,0,0,114,38,0,0,0,218,14, + 95,78,69,69,68,83,95,76,79,65,68,73,78,71,114,213, + 0,0,0,114,49,0,0,0,114,211,0,0,0,114,69,0, + 0,0,41,4,114,20,0,0,0,114,212,0,0,0,114,104, + 0,0,0,114,79,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,14,95,102,105,110,100,95,97, + 110,100,95,108,111,97,100,253,3,0,0,115,24,0,0,0, + 10,2,14,1,8,1,54,1,8,2,4,1,2,1,4,255, + 12,2,8,2,4,1,255,128,114,215,0,0,0,114,25,0, + 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,4,0,0,0,67,0,0,0,115,42,0,0,0, + 116,0,124,0,124,1,124,2,131,3,1,0,124,2,100,1, + 107,4,114,32,116,1,124,0,124,1,124,2,131,3,125,0, + 116,2,124,0,116,3,131,2,83,0,41,3,97,50,1,0, + 0,73,109,112,111,114,116,32,97,110,100,32,114,101,116,117, + 114,110,32,116,104,101,32,109,111,100,117,108,101,32,98,97, + 115,101,100,32,111,110,32,105,116,115,32,110,97,109,101,44, + 32,116,104,101,32,112,97,99,107,97,103,101,32,116,104,101, + 32,99,97,108,108,32,105,115,10,32,32,32,32,98,101,105, + 110,103,32,109,97,100,101,32,102,114,111,109,44,32,97,110, + 100,32,116,104,101,32,108,101,118,101,108,32,97,100,106,117, + 115,116,109,101,110,116,46,10,10,32,32,32,32,84,104,105, + 115,32,102,117,110,99,116,105,111,110,32,114,101,112,114,101, + 115,101,110,116,115,32,116,104,101,32,103,114,101,97,116,101, + 115,116,32,99,111,109,109,111,110,32,100,101,110,111,109,105, + 110,97,116,111,114,32,111,102,32,102,117,110,99,116,105,111, + 110,97,108,105,116,121,10,32,32,32,32,98,101,116,119,101, + 101,110,32,105,109,112,111,114,116,95,109,111,100,117,108,101, + 32,97,110,100,32,95,95,105,109,112,111,114,116,95,95,46, + 32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,115, + 101,116,116,105,110,103,32,95,95,112,97,99,107,97,103,101, + 95,95,32,105,102,10,32,32,32,32,116,104,101,32,108,111, + 97,100,101,114,32,100,105,100,32,110,111,116,46,10,10,32, + 32,32,32,114,25,0,0,0,78,41,4,114,208,0,0,0, + 114,198,0,0,0,114,215,0,0,0,218,11,95,103,99,100, + 95,105,109,112,111,114,116,114,207,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,216,0,0,0, + 13,4,0,0,115,10,0,0,0,12,9,8,1,12,1,10, + 1,255,128,114,216,0,0,0,169,1,218,9,114,101,99,117, + 114,115,105,118,101,99,3,0,0,0,0,0,0,0,1,0, + 0,0,8,0,0,0,11,0,0,0,67,0,0,0,115,216, + 0,0,0,124,1,68,0,93,204,125,4,116,0,124,4,116, + 1,131,2,115,64,124,3,114,34,124,0,106,2,100,1,23, + 0,125,5,110,4,100,2,125,5,116,3,100,3,124,5,155, + 0,100,4,116,4,124,4,131,1,106,2,155,0,157,4,131, + 1,130,1,124,4,100,5,107,2,114,106,124,3,115,4,116, + 5,124,0,100,6,131,2,114,4,116,6,124,0,124,0,106, + 7,124,2,100,7,100,8,141,4,1,0,113,4,116,5,124, + 0,124,4,131,2,115,4,100,9,160,8,124,0,106,2,124, + 4,161,2,125,6,122,14,116,9,124,2,124,6,131,2,1, + 0,87,0,113,4,4,0,116,10,121,214,1,0,125,7,1, + 0,122,42,124,7,106,11,124,6,107,2,114,200,116,12,106, + 13,160,14,124,6,116,15,161,2,100,10,117,1,114,200,87, + 0,89,0,100,10,125,7,126,7,113,4,130,0,100,10,125, + 7,126,7,48,0,124,0,83,0,48,0,41,11,122,238,70, + 105,103,117,114,101,32,111,117,116,32,119,104,97,116,32,95, + 95,105,109,112,111,114,116,95,95,32,115,104,111,117,108,100, + 32,114,101,116,117,114,110,46,10,10,32,32,32,32,84,104, + 101,32,105,109,112,111,114,116,95,32,112,97,114,97,109,101, + 116,101,114,32,105,115,32,97,32,99,97,108,108,97,98,108, + 101,32,119,104,105,99,104,32,116,97,107,101,115,32,116,104, + 101,32,110,97,109,101,32,111,102,32,109,111,100,117,108,101, + 32,116,111,10,32,32,32,32,105,109,112,111,114,116,46,32, + 73,116,32,105,115,32,114,101,113,117,105,114,101,100,32,116, + 111,32,100,101,99,111,117,112,108,101,32,116,104,101,32,102, + 117,110,99,116,105,111,110,32,102,114,111,109,32,97,115,115, + 117,109,105,110,103,32,105,109,112,111,114,116,108,105,98,39, + 115,10,32,32,32,32,105,109,112,111,114,116,32,105,109,112, + 108,101,109,101,110,116,97,116,105,111,110,32,105,115,32,100, + 101,115,105,114,101,100,46,10,10,32,32,32,32,122,8,46, + 95,95,97,108,108,95,95,122,13,96,96,102,114,111,109,32, + 108,105,115,116,39,39,122,8,73,116,101,109,32,105,110,32, + 122,18,32,109,117,115,116,32,98,101,32,115,116,114,44,32, + 110,111,116,32,250,1,42,218,7,95,95,97,108,108,95,95, + 84,114,217,0,0,0,114,193,0,0,0,78,41,16,114,203, + 0,0,0,114,204,0,0,0,114,9,0,0,0,114,205,0, + 0,0,114,3,0,0,0,114,11,0,0,0,218,16,95,104, + 97,110,100,108,101,95,102,114,111,109,108,105,115,116,114,220, + 0,0,0,114,49,0,0,0,114,71,0,0,0,114,211,0, + 0,0,114,20,0,0,0,114,18,0,0,0,114,99,0,0, + 0,114,38,0,0,0,114,214,0,0,0,41,8,114,104,0, + 0,0,218,8,102,114,111,109,108,105,115,116,114,212,0,0, + 0,114,218,0,0,0,218,1,120,90,5,119,104,101,114,101, + 90,9,102,114,111,109,95,110,97,109,101,90,3,101,120,99, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 169,0,0,0,222,2,0,0,115,48,0,0,0,8,0,4, - 2,4,7,2,2,10,1,2,8,12,1,2,8,12,1,2, - 11,10,1,2,7,10,1,2,4,2,1,12,1,2,4,2, - 1,12,1,2,4,2,1,12,1,12,4,255,128,114,169,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,64,0,0,0,115,144,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, - 101,5,100,3,100,4,132,0,131,1,90,6,101,7,100,22, - 100,6,100,7,132,1,131,1,90,8,101,7,100,23,100,8, - 100,9,132,1,131,1,90,9,101,5,100,10,100,11,132,0, - 131,1,90,10,101,5,100,12,100,13,132,0,131,1,90,11, - 101,7,100,14,100,15,132,0,131,1,90,12,101,7,101,13, - 100,16,100,17,132,0,131,1,131,1,90,14,101,7,101,13, - 100,18,100,19,132,0,131,1,131,1,90,15,101,7,101,13, - 100,20,100,21,132,0,131,1,131,1,90,16,100,5,83,0, - 41,24,218,14,70,114,111,122,101,110,73,109,112,111,114,116, - 101,114,122,142,77,101,116,97,32,112,97,116,104,32,105,109, - 112,111,114,116,32,102,111,114,32,102,114,111,122,101,110,32, - 109,111,100,117,108,101,115,46,10,10,32,32,32,32,65,108, - 108,32,109,101,116,104,111,100,115,32,97,114,101,32,101,105, - 116,104,101,114,32,99,108,97,115,115,32,111,114,32,115,116, - 97,116,105,99,32,109,101,116,104,111,100,115,32,116,111,32, - 97,118,111,105,100,32,116,104,101,32,110,101,101,100,32,116, - 111,10,32,32,32,32,105,110,115,116,97,110,116,105,97,116, - 101,32,116,104,101,32,99,108,97,115,115,46,10,10,32,32, - 32,32,90,6,102,114,111,122,101,110,99,1,0,0,0,0, + 221,0,0,0,28,4,0,0,115,54,0,0,0,8,10,10, + 1,4,1,12,1,4,2,10,1,8,1,8,255,8,2,14, + 1,10,1,2,1,8,255,10,2,14,1,2,1,14,1,14, + 1,10,4,16,1,2,255,12,2,2,1,8,128,4,1,2, + 248,255,128,114,221,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,6,0,0,0,67,0,0, + 0,115,146,0,0,0,124,0,160,0,100,1,161,1,125,1, + 124,0,160,0,100,2,161,1,125,2,124,1,100,3,117,1, + 114,82,124,2,100,3,117,1,114,78,124,1,124,2,106,1, + 107,3,114,78,116,2,106,3,100,4,124,1,155,2,100,5, + 124,2,106,1,155,2,100,6,157,5,116,4,100,7,100,8, + 141,3,1,0,124,1,83,0,124,2,100,3,117,1,114,96, + 124,2,106,1,83,0,116,2,106,3,100,9,116,4,100,7, + 100,8,141,3,1,0,124,0,100,10,25,0,125,1,100,11, + 124,0,118,1,114,142,124,1,160,5,100,12,161,1,100,13, + 25,0,125,1,124,1,83,0,41,14,122,167,67,97,108,99, + 117,108,97,116,101,32,119,104,97,116,32,95,95,112,97,99, + 107,97,103,101,95,95,32,115,104,111,117,108,100,32,98,101, + 46,10,10,32,32,32,32,95,95,112,97,99,107,97,103,101, + 95,95,32,105,115,32,110,111,116,32,103,117,97,114,97,110, + 116,101,101,100,32,116,111,32,98,101,32,100,101,102,105,110, + 101,100,32,111,114,32,99,111,117,108,100,32,98,101,32,115, + 101,116,32,116,111,32,78,111,110,101,10,32,32,32,32,116, + 111,32,114,101,112,114,101,115,101,110,116,32,116,104,97,116, + 32,105,116,115,32,112,114,111,112,101,114,32,118,97,108,117, + 101,32,105,115,32,117,110,107,110,111,119,110,46,10,10,32, + 32,32,32,114,152,0,0,0,114,113,0,0,0,78,122,32, + 95,95,112,97,99,107,97,103,101,95,95,32,33,61,32,95, + 95,115,112,101,99,95,95,46,112,97,114,101,110,116,32,40, + 122,4,32,33,61,32,250,1,41,233,3,0,0,0,41,1, + 90,10,115,116,97,99,107,108,101,118,101,108,122,89,99,97, + 110,39,116,32,114,101,115,111,108,118,101,32,112,97,99,107, + 97,103,101,32,102,114,111,109,32,95,95,115,112,101,99,95, + 95,32,111,114,32,95,95,112,97,99,107,97,103,101,95,95, + 44,32,102,97,108,108,105,110,103,32,98,97,99,107,32,111, + 110,32,95,95,110,97,109,101,95,95,32,97,110,100,32,95, + 95,112,97,116,104,95,95,114,9,0,0,0,114,148,0,0, + 0,114,135,0,0,0,114,25,0,0,0,41,6,114,38,0, + 0,0,114,137,0,0,0,114,95,0,0,0,114,96,0,0, + 0,114,163,0,0,0,114,136,0,0,0,41,3,218,7,103, + 108,111,98,97,108,115,114,196,0,0,0,114,103,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 17,95,99,97,108,99,95,95,95,112,97,99,107,97,103,101, + 95,95,65,4,0,0,115,44,0,0,0,10,7,10,1,8, + 1,18,1,6,1,2,1,4,255,4,1,6,255,4,2,6, + 254,4,3,8,1,6,1,6,2,4,2,6,254,8,3,8, + 1,14,1,4,1,255,128,114,227,0,0,0,114,5,0,0, + 0,99,5,0,0,0,0,0,0,0,0,0,0,0,9,0, + 0,0,5,0,0,0,67,0,0,0,115,174,0,0,0,124, + 4,100,1,107,2,114,18,116,0,124,0,131,1,125,5,110, + 36,124,1,100,2,117,1,114,30,124,1,110,2,105,0,125, + 6,116,1,124,6,131,1,125,7,116,0,124,0,124,7,124, + 4,131,3,125,5,124,3,115,148,124,4,100,1,107,2,114, + 84,116,0,124,0,160,2,100,3,161,1,100,1,25,0,131, + 1,83,0,124,0,115,92,124,5,83,0,116,3,124,0,131, + 1,116,3,124,0,160,2,100,3,161,1,100,1,25,0,131, + 1,24,0,125,8,116,4,106,5,124,5,106,6,100,2,116, + 3,124,5,106,6,131,1,124,8,24,0,133,2,25,0,25, + 0,83,0,116,7,124,5,100,4,131,2,114,170,116,8,124, + 5,124,3,116,0,131,3,83,0,124,5,83,0,41,5,97, + 215,1,0,0,73,109,112,111,114,116,32,97,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,84,104,101,32,39,103, + 108,111,98,97,108,115,39,32,97,114,103,117,109,101,110,116, + 32,105,115,32,117,115,101,100,32,116,111,32,105,110,102,101, + 114,32,119,104,101,114,101,32,116,104,101,32,105,109,112,111, + 114,116,32,105,115,32,111,99,99,117,114,114,105,110,103,32, + 102,114,111,109,10,32,32,32,32,116,111,32,104,97,110,100, + 108,101,32,114,101,108,97,116,105,118,101,32,105,109,112,111, + 114,116,115,46,32,84,104,101,32,39,108,111,99,97,108,115, + 39,32,97,114,103,117,109,101,110,116,32,105,115,32,105,103, + 110,111,114,101,100,46,32,84,104,101,10,32,32,32,32,39, + 102,114,111,109,108,105,115,116,39,32,97,114,103,117,109,101, + 110,116,32,115,112,101,99,105,102,105,101,115,32,119,104,97, + 116,32,115,104,111,117,108,100,32,101,120,105,115,116,32,97, + 115,32,97,116,116,114,105,98,117,116,101,115,32,111,110,32, + 116,104,101,32,109,111,100,117,108,101,10,32,32,32,32,98, + 101,105,110,103,32,105,109,112,111,114,116,101,100,32,40,101, + 46,103,46,32,96,96,102,114,111,109,32,109,111,100,117,108, + 101,32,105,109,112,111,114,116,32,60,102,114,111,109,108,105, + 115,116,62,96,96,41,46,32,32,84,104,101,32,39,108,101, + 118,101,108,39,10,32,32,32,32,97,114,103,117,109,101,110, + 116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101, + 32,112,97,99,107,97,103,101,32,108,111,99,97,116,105,111, + 110,32,116,111,32,105,109,112,111,114,116,32,102,114,111,109, + 32,105,110,32,97,32,114,101,108,97,116,105,118,101,10,32, + 32,32,32,105,109,112,111,114,116,32,40,101,46,103,46,32, + 96,96,102,114,111,109,32,46,46,112,107,103,32,105,109,112, + 111,114,116,32,109,111,100,96,96,32,119,111,117,108,100,32, + 104,97,118,101,32,97,32,39,108,101,118,101,108,39,32,111, + 102,32,50,41,46,10,10,32,32,32,32,114,25,0,0,0, + 78,114,135,0,0,0,114,148,0,0,0,41,9,114,216,0, + 0,0,114,227,0,0,0,218,9,112,97,114,116,105,116,105, + 111,110,114,195,0,0,0,114,18,0,0,0,114,99,0,0, + 0,114,9,0,0,0,114,11,0,0,0,114,221,0,0,0, + 41,9,114,20,0,0,0,114,226,0,0,0,218,6,108,111, + 99,97,108,115,114,222,0,0,0,114,197,0,0,0,114,104, + 0,0,0,90,8,103,108,111,98,97,108,115,95,114,196,0, + 0,0,90,7,99,117,116,95,111,102,102,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,10,95,95,105,109, + 112,111,114,116,95,95,92,4,0,0,115,32,0,0,0,8, + 11,10,1,16,2,8,1,12,1,4,1,8,3,18,1,4, + 1,4,1,26,4,30,3,10,1,12,1,4,2,255,128,114, + 230,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,38,0, + 0,0,116,0,160,1,124,0,161,1,125,1,124,1,100,0, + 117,0,114,30,116,2,100,1,124,0,23,0,131,1,130,1, + 116,3,124,1,131,1,83,0,41,2,78,122,25,110,111,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,32, + 110,97,109,101,100,32,41,4,114,169,0,0,0,114,177,0, + 0,0,114,83,0,0,0,114,167,0,0,0,41,2,114,20, + 0,0,0,114,103,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,18,95,98,117,105,108,116,105, + 110,95,102,114,111,109,95,110,97,109,101,129,4,0,0,115, + 10,0,0,0,10,1,8,1,12,1,8,1,255,128,114,231, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 10,0,0,0,5,0,0,0,67,0,0,0,115,164,0,0, + 0,124,1,97,0,124,0,97,1,116,2,116,1,131,1,125, + 2,116,1,106,3,160,4,161,0,68,0,93,70,92,2,125, + 3,125,4,116,5,124,4,124,2,131,2,114,26,124,3,116, + 1,106,6,118,0,114,60,116,7,125,5,110,16,116,0,160, + 8,124,3,161,1,114,26,116,9,125,5,110,0,116,10,124, + 4,124,5,131,2,125,6,116,11,124,6,124,4,131,2,1, + 0,113,26,116,1,106,3,116,12,25,0,125,7,100,1,68, + 0,93,46,125,8,124,8,116,1,106,3,118,1,114,136,116, + 13,124,8,131,1,125,9,110,10,116,1,106,3,124,8,25, + 0,125,9,116,14,124,7,124,8,124,9,131,3,1,0,113, + 112,100,2,83,0,41,3,122,250,83,101,116,117,112,32,105, + 109,112,111,114,116,108,105,98,32,98,121,32,105,109,112,111, + 114,116,105,110,103,32,110,101,101,100,101,100,32,98,117,105, + 108,116,45,105,110,32,109,111,100,117,108,101,115,32,97,110, + 100,32,105,110,106,101,99,116,105,110,103,32,116,104,101,109, + 10,32,32,32,32,105,110,116,111,32,116,104,101,32,103,108, + 111,98,97,108,32,110,97,109,101,115,112,97,99,101,46,10, + 10,32,32,32,32,65,115,32,115,121,115,32,105,115,32,110, + 101,101,100,101,100,32,102,111,114,32,115,121,115,46,109,111, + 100,117,108,101,115,32,97,99,99,101,115,115,32,97,110,100, + 32,95,105,109,112,32,105,115,32,110,101,101,100,101,100,32, + 116,111,32,108,111,97,100,32,98,117,105,108,116,45,105,110, + 10,32,32,32,32,109,111,100,117,108,101,115,44,32,116,104, + 111,115,101,32,116,119,111,32,109,111,100,117,108,101,115,32, + 109,117,115,116,32,98,101,32,101,120,112,108,105,99,105,116, + 108,121,32,112,97,115,115,101,100,32,105,110,46,10,10,32, + 32,32,32,41,3,114,26,0,0,0,114,95,0,0,0,114, + 68,0,0,0,78,41,15,114,61,0,0,0,114,18,0,0, + 0,114,3,0,0,0,114,99,0,0,0,218,5,105,116,101, + 109,115,114,203,0,0,0,114,82,0,0,0,114,169,0,0, + 0,114,92,0,0,0,114,184,0,0,0,114,149,0,0,0, + 114,155,0,0,0,114,9,0,0,0,114,231,0,0,0,114, + 12,0,0,0,41,10,218,10,115,121,115,95,109,111,100,117, + 108,101,218,11,95,105,109,112,95,109,111,100,117,108,101,90, + 11,109,111,100,117,108,101,95,116,121,112,101,114,20,0,0, + 0,114,104,0,0,0,114,116,0,0,0,114,103,0,0,0, + 90,11,115,101,108,102,95,109,111,100,117,108,101,90,12,98, + 117,105,108,116,105,110,95,110,97,109,101,90,14,98,117,105, + 108,116,105,110,95,109,111,100,117,108,101,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,6,95,115,101,116, + 117,112,136,4,0,0,115,38,0,0,0,4,9,4,1,8, + 3,18,1,10,1,10,1,6,1,10,1,6,1,10,3,12, + 1,10,3,8,1,10,1,10,1,10,2,14,1,4,251,255, + 128,114,235,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 38,0,0,0,116,0,124,0,124,1,131,2,1,0,116,1, + 106,2,160,3,116,4,161,1,1,0,116,1,106,2,160,3, + 116,5,161,1,1,0,100,1,83,0,41,2,122,48,73,110, + 115,116,97,108,108,32,105,109,112,111,114,116,101,114,115,32, + 102,111,114,32,98,117,105,108,116,105,110,32,97,110,100,32, + 102,114,111,122,101,110,32,109,111,100,117,108,101,115,78,41, + 6,114,235,0,0,0,114,18,0,0,0,114,201,0,0,0, + 114,126,0,0,0,114,169,0,0,0,114,184,0,0,0,41, + 2,114,233,0,0,0,114,234,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,8,95,105,110,115, + 116,97,108,108,171,4,0,0,115,8,0,0,0,10,2,12, + 2,16,1,255,128,114,236,0,0,0,99,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,67, - 0,0,0,115,16,0,0,0,100,1,160,0,124,0,106,1, - 116,2,106,3,161,2,83,0,41,3,114,170,0,0,0,114, - 160,0,0,0,78,41,4,114,49,0,0,0,114,9,0,0, - 0,114,184,0,0,0,114,145,0,0,0,41,1,218,1,109, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 107,0,0,0,52,3,0,0,115,4,0,0,0,16,7,255, - 128,122,26,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,4, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5, - 0,0,0,67,0,0,0,115,30,0,0,0,116,0,160,1, - 124,1,161,1,114,26,116,2,124,1,124,0,124,0,106,3, - 100,1,141,3,83,0,100,0,83,0,114,172,0,0,0,41, - 4,114,61,0,0,0,114,92,0,0,0,114,98,0,0,0, - 114,145,0,0,0,114,173,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,177,0,0,0,61,3, - 0,0,115,8,0,0,0,10,2,16,1,4,2,255,128,122, - 24,70,114,111,122,101,110,73,109,112,111,114,116,101,114,46, - 102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, - 0,0,115,18,0,0,0,116,0,160,1,124,1,161,1,114, - 14,124,0,83,0,100,1,83,0,41,2,122,93,70,105,110, - 100,32,97,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, - 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, - 99,97,116,101,100,46,32,32,85,115,101,32,102,105,110,100, - 95,115,112,101,99,40,41,32,105,110,115,116,101,97,100,46, - 10,10,32,32,32,32,32,32,32,32,78,41,2,114,61,0, - 0,0,114,92,0,0,0,41,3,114,174,0,0,0,114,85, - 0,0,0,114,175,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,178,0,0,0,68,3,0,0, - 115,4,0,0,0,18,7,255,128,122,26,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,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,122,42,85,115,101,32,100, - 101,102,97,117,108,116,32,115,101,109,97,110,116,105,99,115, - 32,102,111,114,32,109,111,100,117,108,101,32,99,114,101,97, - 116,105,111,110,46,78,114,5,0,0,0,114,168,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 156,0,0,0,77,3,0,0,115,4,0,0,0,4,0,255, - 128,122,28,70,114,111,122,101,110,73,109,112,111,114,116,101, - 114,46,99,114,101,97,116,101,95,109,111,100,117,108,101,99, - 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 4,0,0,0,67,0,0,0,115,64,0,0,0,124,0,106, - 0,106,1,125,1,116,2,160,3,124,1,161,1,115,36,116, - 4,100,1,160,5,124,1,161,1,124,1,100,2,141,2,130, - 1,116,6,116,2,106,7,124,1,131,2,125,2,116,8,124, - 2,124,0,106,9,131,2,1,0,100,0,83,0,114,91,0, - 0,0,41,10,114,113,0,0,0,114,20,0,0,0,114,61, - 0,0,0,114,92,0,0,0,114,83,0,0,0,114,49,0, - 0,0,114,71,0,0,0,218,17,103,101,116,95,102,114,111, - 122,101,110,95,111,98,106,101,99,116,218,4,101,120,101,99, - 114,14,0,0,0,41,3,114,104,0,0,0,114,20,0,0, - 0,218,4,99,111,100,101,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,157,0,0,0,81,3,0,0,115, - 16,0,0,0,8,2,10,1,10,1,2,1,6,255,12,2, - 16,1,255,128,122,26,70,114,111,122,101,110,73,109,112,111, - 114,116,101,114,46,101,120,101,99,95,109,111,100,117,108,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, - 124,0,124,1,131,2,83,0,41,2,122,95,76,111,97,100, - 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101, - 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,95, - 109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,100, - 46,10,10,32,32,32,32,32,32,32,32,78,41,1,114,105, - 0,0,0,114,179,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,164,0,0,0,90,3,0,0, - 115,4,0,0,0,10,8,255,128,122,26,70,114,111,122,101, - 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,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, - 0,0,0,116,0,160,1,124,1,161,1,83,0,41,2,122, - 45,82,101,116,117,114,110,32,116,104,101,32,99,111,100,101, - 32,111,98,106,101,99,116,32,102,111,114,32,116,104,101,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,46,78,41, - 2,114,61,0,0,0,114,186,0,0,0,114,179,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 180,0,0,0,100,3,0,0,115,4,0,0,0,10,4,255, - 128,122,23,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,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,54, - 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,102, - 114,111,122,101,110,32,109,111,100,117,108,101,115,32,100,111, - 32,110,111,116,32,104,97,118,101,32,115,111,117,114,99,101, - 32,99,111,100,101,46,78,114,5,0,0,0,114,179,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,181,0,0,0,106,3,0,0,115,4,0,0,0,4,4, - 255,128,122,25,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,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, - 1,161,1,83,0,41,2,122,46,82,101,116,117,114,110,32, - 84,114,117,101,32,105,102,32,116,104,101,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,32,105,115,32,97,32,112, - 97,99,107,97,103,101,46,78,41,2,114,61,0,0,0,90, - 17,105,115,95,102,114,111,122,101,110,95,112,97,99,107,97, - 103,101,114,179,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,122,0,0,0,112,3,0,0,115, - 4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17,114,9,0,0, - 0,114,8,0,0,0,114,1,0,0,0,114,10,0,0,0, - 114,145,0,0,0,114,182,0,0,0,114,107,0,0,0,114, - 183,0,0,0,114,177,0,0,0,114,178,0,0,0,114,156, - 0,0,0,114,157,0,0,0,114,164,0,0,0,114,94,0, - 0,0,114,180,0,0,0,114,181,0,0,0,114,122,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,184,0,0,0,41,3,0,0,115,50, - 0,0,0,8,0,4,2,4,7,2,2,10,1,2,8,12, - 1,2,6,12,1,2,8,10,1,2,3,10,1,2,8,10, - 1,2,9,2,1,12,1,2,4,2,1,12,1,2,4,2, - 1,16,1,255,128,114,184,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,83,0,41,7,218,18,95,73,109,112, - 111,114,116,76,111,99,107,67,111,110,116,101,120,116,122,36, - 67,111,110,116,101,120,116,32,109,97,110,97,103,101,114,32, - 102,111,114,32,116,104,101,32,105,109,112,111,114,116,32,108, - 111,99,107,46,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,2,0,0,0,67,0,0,0,115,12,0, - 0,0,116,0,160,1,161,0,1,0,100,1,83,0,41,2, - 122,24,65,99,113,117,105,114,101,32,116,104,101,32,105,109, - 112,111,114,116,32,108,111,99,107,46,78,41,2,114,61,0, - 0,0,114,62,0,0,0,114,51,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,58,0,0,0, - 125,3,0,0,115,4,0,0,0,12,2,255,128,122,28,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,0,0,0,0,4,0,0,0,2,0,0,0, - 67,0,0,0,115,12,0,0,0,116,0,160,1,161,0,1, - 0,100,1,83,0,41,2,122,60,82,101,108,101,97,115,101, - 32,116,104,101,32,105,109,112,111,114,116,32,108,111,99,107, - 32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,97, - 110,121,32,114,97,105,115,101,100,32,101,120,99,101,112,116, - 105,111,110,115,46,78,41,2,114,61,0,0,0,114,64,0, - 0,0,41,4,114,33,0,0,0,218,8,101,120,99,95,116, - 121,112,101,218,9,101,120,99,95,118,97,108,117,101,218,13, - 101,120,99,95,116,114,97,99,101,98,97,99,107,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,60,0,0, - 0,129,3,0,0,115,4,0,0,0,12,2,255,128,122,27, - 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,41,6,114,9, - 0,0,0,114,8,0,0,0,114,1,0,0,0,114,10,0, - 0,0,114,58,0,0,0,114,60,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,189,0,0,0,121,3,0,0,115,10,0,0,0,8,0, - 4,2,8,2,12,4,255,128,114,189,0,0,0,99,3,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, - 0,0,67,0,0,0,115,64,0,0,0,124,1,160,0,100, - 1,124,2,100,2,24,0,161,2,125,3,116,1,124,3,131, - 1,124,2,107,0,114,36,116,2,100,3,131,1,130,1,124, - 3,100,4,25,0,125,4,124,0,114,60,100,5,160,3,124, - 4,124,0,161,2,83,0,124,4,83,0,41,7,122,50,82, - 101,115,111,108,118,101,32,97,32,114,101,108,97,116,105,118, - 101,32,109,111,100,117,108,101,32,110,97,109,101,32,116,111, - 32,97,110,32,97,98,115,111,108,117,116,101,32,111,110,101, - 46,114,135,0,0,0,114,42,0,0,0,122,50,97,116,116, - 101,109,112,116,101,100,32,114,101,108,97,116,105,118,101,32, - 105,109,112,111,114,116,32,98,101,121,111,110,100,32,116,111, - 112,45,108,101,118,101,108,32,112,97,99,107,97,103,101,114, - 25,0,0,0,250,5,123,125,46,123,125,78,41,4,218,6, - 114,115,112,108,105,116,218,3,108,101,110,114,83,0,0,0, - 114,49,0,0,0,41,5,114,20,0,0,0,218,7,112,97, - 99,107,97,103,101,218,5,108,101,118,101,108,90,4,98,105, - 116,115,90,4,98,97,115,101,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,13,95,114,101,115,111,108,118, - 101,95,110,97,109,101,134,3,0,0,115,12,0,0,0,16, - 2,12,1,8,1,8,1,20,1,255,128,114,198,0,0,0, - 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,34,0,0,0,124,0, - 160,0,124,1,124,2,161,2,125,3,124,3,100,0,117,0, - 114,24,100,0,83,0,116,1,124,1,124,3,131,2,83,0, - 114,0,0,0,0,41,2,114,178,0,0,0,114,98,0,0, - 0,41,4,218,6,102,105,110,100,101,114,114,20,0,0,0, - 114,175,0,0,0,114,116,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,17,95,102,105,110,100, - 95,115,112,101,99,95,108,101,103,97,99,121,143,3,0,0, - 115,10,0,0,0,12,3,8,1,4,1,10,1,255,128,114, - 200,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,10,0,0,0,10,0,0,0,67,0,0,0,115,28,1, - 0,0,116,0,106,1,125,3,124,3,100,1,117,0,114,22, - 116,2,100,2,131,1,130,1,124,3,115,38,116,3,160,4, - 100,3,116,5,161,2,1,0,124,0,116,0,106,6,118,0, - 125,4,124,3,68,0,93,226,125,5,116,7,131,0,143,94, - 1,0,122,10,124,5,106,8,125,6,87,0,110,54,4,0, - 116,9,121,128,1,0,1,0,1,0,116,10,124,5,124,0, - 124,1,131,3,125,7,124,7,100,1,117,0,114,124,89,0, - 87,0,100,1,4,0,4,0,131,3,1,0,113,52,89,0, - 110,14,48,0,124,6,124,0,124,1,124,2,131,3,125,7, - 87,0,100,1,4,0,4,0,131,3,1,0,110,16,49,0, - 115,162,48,0,1,0,1,0,1,0,89,0,1,0,124,7, - 100,1,117,1,114,52,124,4,144,1,115,16,124,0,116,0, - 106,6,118,0,144,1,114,16,116,0,106,6,124,0,25,0, - 125,8,122,10,124,8,106,11,125,9,87,0,110,26,4,0, - 116,9,121,244,1,0,1,0,1,0,124,7,6,0,89,0, - 2,0,1,0,83,0,48,0,124,9,100,1,117,0,144,1, - 114,8,124,7,2,0,1,0,83,0,124,9,2,0,1,0, - 83,0,124,7,2,0,1,0,83,0,100,1,83,0,41,4, - 122,21,70,105,110,100,32,97,32,109,111,100,117,108,101,39, - 115,32,115,112,101,99,46,78,122,53,115,121,115,46,109,101, - 116,97,95,112,97,116,104,32,105,115,32,78,111,110,101,44, - 32,80,121,116,104,111,110,32,105,115,32,108,105,107,101,108, - 121,32,115,104,117,116,116,105,110,103,32,100,111,119,110,122, - 22,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, - 115,32,101,109,112,116,121,41,12,114,18,0,0,0,218,9, - 109,101,116,97,95,112,97,116,104,114,83,0,0,0,114,95, - 0,0,0,114,96,0,0,0,114,163,0,0,0,114,99,0, - 0,0,114,189,0,0,0,114,177,0,0,0,114,2,0,0, - 0,114,200,0,0,0,114,113,0,0,0,41,10,114,20,0, - 0,0,114,175,0,0,0,114,176,0,0,0,114,201,0,0, - 0,90,9,105,115,95,114,101,108,111,97,100,114,199,0,0, - 0,114,177,0,0,0,114,103,0,0,0,114,104,0,0,0, - 114,113,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,10,95,102,105,110,100,95,115,112,101,99, - 152,3,0,0,115,56,0,0,0,6,2,8,1,8,2,4, - 3,12,1,10,5,8,1,8,1,2,1,10,1,12,1,12, - 1,8,1,22,1,42,2,8,1,18,2,10,1,2,1,10, - 1,12,1,14,4,10,2,8,1,8,2,8,2,4,2,255, - 128,114,202,0,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, - 110,0,0,0,116,0,124,0,116,1,131,2,115,28,116,2, - 100,1,160,3,116,4,124,0,131,1,161,1,131,1,130,1, - 124,2,100,2,107,0,114,44,116,5,100,3,131,1,130,1, - 124,2,100,2,107,4,114,82,116,0,124,1,116,1,131,2, - 115,70,116,2,100,4,131,1,130,1,124,1,115,82,116,6, - 100,5,131,1,130,1,124,0,115,106,124,2,100,2,107,2, - 114,102,116,5,100,6,131,1,130,1,100,7,83,0,100,7, - 83,0,41,8,122,28,86,101,114,105,102,121,32,97,114,103, - 117,109,101,110,116,115,32,97,114,101,32,34,115,97,110,101, - 34,46,122,31,109,111,100,117,108,101,32,110,97,109,101,32, - 109,117,115,116,32,98,101,32,115,116,114,44,32,110,111,116, - 32,123,125,114,25,0,0,0,122,18,108,101,118,101,108,32, - 109,117,115,116,32,98,101,32,62,61,32,48,122,31,95,95, - 112,97,99,107,97,103,101,95,95,32,110,111,116,32,115,101, - 116,32,116,111,32,97,32,115,116,114,105,110,103,122,54,97, - 116,116,101,109,112,116,101,100,32,114,101,108,97,116,105,118, - 101,32,105,109,112,111,114,116,32,119,105,116,104,32,110,111, - 32,107,110,111,119,110,32,112,97,114,101,110,116,32,112,97, - 99,107,97,103,101,122,17,69,109,112,116,121,32,109,111,100, - 117,108,101,32,110,97,109,101,78,41,7,218,10,105,115,105, - 110,115,116,97,110,99,101,218,3,115,116,114,218,9,84,121, - 112,101,69,114,114,111,114,114,49,0,0,0,114,3,0,0, - 0,218,10,86,97,108,117,101,69,114,114,111,114,114,83,0, - 0,0,169,3,114,20,0,0,0,114,196,0,0,0,114,197, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,13,95,115,97,110,105,116,121,95,99,104,101,99, - 107,199,3,0,0,115,26,0,0,0,10,2,18,1,8,1, - 8,1,8,1,10,1,8,1,4,1,8,1,12,2,8,1, - 8,255,255,128,114,208,0,0,0,122,16,78,111,32,109,111, - 100,117,108,101,32,110,97,109,101,100,32,122,4,123,33,114, - 125,99,2,0,0,0,0,0,0,0,0,0,0,0,9,0, - 0,0,8,0,0,0,67,0,0,0,115,20,1,0,0,100, - 0,125,2,124,0,160,0,100,1,161,1,100,2,25,0,125, - 3,124,3,114,128,124,3,116,1,106,2,118,1,114,42,116, - 3,124,1,124,3,131,2,1,0,124,0,116,1,106,2,118, - 0,114,62,116,1,106,2,124,0,25,0,83,0,116,1,106, - 2,124,3,25,0,125,4,122,10,124,4,106,4,125,2,87, - 0,110,44,4,0,116,5,121,126,1,0,1,0,1,0,116, - 6,100,3,23,0,160,7,124,0,124,3,161,2,125,5,116, - 8,124,5,124,0,100,4,141,2,100,0,130,2,48,0,116, - 9,124,0,124,2,131,2,125,6,124,6,100,0,117,0,114, - 164,116,8,116,6,160,7,124,0,161,1,124,0,100,4,141, - 2,130,1,116,10,124,6,131,1,125,7,124,3,144,1,114, - 16,116,1,106,2,124,3,25,0,125,4,124,0,160,0,100, - 1,161,1,100,5,25,0,125,8,122,18,116,11,124,4,124, - 8,124,7,131,3,1,0,87,0,124,7,83,0,4,0,116, - 5,144,1,121,14,1,0,1,0,1,0,100,6,124,3,155, - 2,100,7,124,8,155,2,157,4,125,5,116,12,160,13,124, - 5,116,14,161,2,1,0,89,0,124,7,83,0,48,0,124, - 7,83,0,41,8,78,114,135,0,0,0,114,25,0,0,0, - 122,23,59,32,123,33,114,125,32,105,115,32,110,111,116,32, - 97,32,112,97,99,107,97,103,101,114,19,0,0,0,233,2, - 0,0,0,122,27,67,97,110,110,111,116,32,115,101,116,32, - 97,110,32,97,116,116,114,105,98,117,116,101,32,111,110,32, - 122,18,32,102,111,114,32,99,104,105,108,100,32,109,111,100, - 117,108,101,32,41,15,114,136,0,0,0,114,18,0,0,0, - 114,99,0,0,0,114,71,0,0,0,114,148,0,0,0,114, - 2,0,0,0,218,8,95,69,82,82,95,77,83,71,114,49, - 0,0,0,218,19,77,111,100,117,108,101,78,111,116,70,111, - 117,110,100,69,114,114,111,114,114,202,0,0,0,114,167,0, - 0,0,114,12,0,0,0,114,95,0,0,0,114,96,0,0, - 0,114,163,0,0,0,41,9,114,20,0,0,0,218,7,105, - 109,112,111,114,116,95,114,175,0,0,0,114,137,0,0,0, - 90,13,112,97,114,101,110,116,95,109,111,100,117,108,101,114, - 102,0,0,0,114,103,0,0,0,114,104,0,0,0,90,5, - 99,104,105,108,100,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,23,95,102,105,110,100,95,97,110,100,95, - 108,111,97,100,95,117,110,108,111,99,107,101,100,218,3,0, - 0,115,60,0,0,0,4,1,14,1,4,1,10,1,10,1, - 10,2,10,1,10,1,2,1,10,1,12,1,16,1,16,1, - 10,1,8,1,18,1,8,2,6,1,10,2,14,1,2,1, - 14,1,4,4,14,253,16,1,14,1,4,1,2,255,4,1, - 255,128,114,213,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,8,0,0,0,67,0,0,0, - 115,128,0,0,0,116,0,124,0,131,1,143,62,1,0,116, - 1,106,2,160,3,124,0,116,4,161,2,125,2,124,2,116, - 4,117,0,114,56,116,5,124,0,124,1,131,2,87,0,2, - 0,100,1,4,0,4,0,131,3,1,0,83,0,87,0,100, - 1,4,0,4,0,131,3,1,0,110,16,49,0,115,76,48, - 0,1,0,1,0,1,0,89,0,1,0,124,2,100,1,117, - 0,114,116,100,2,160,6,124,0,161,1,125,3,116,7,124, - 3,124,0,100,3,141,2,130,1,116,8,124,0,131,1,1, - 0,124,2,83,0,41,4,122,25,70,105,110,100,32,97,110, - 100,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108, - 101,46,78,122,40,105,109,112,111,114,116,32,111,102,32,123, - 125,32,104,97,108,116,101,100,59,32,78,111,110,101,32,105, - 110,32,115,121,115,46,109,111,100,117,108,101,115,114,19,0, - 0,0,41,9,114,54,0,0,0,114,18,0,0,0,114,99, - 0,0,0,114,38,0,0,0,218,14,95,78,69,69,68,83, - 95,76,79,65,68,73,78,71,114,213,0,0,0,114,49,0, - 0,0,114,211,0,0,0,114,69,0,0,0,41,4,114,20, - 0,0,0,114,212,0,0,0,114,104,0,0,0,114,79,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,14,95,102,105,110,100,95,97,110,100,95,108,111,97, - 100,253,3,0,0,115,24,0,0,0,10,2,14,1,8,1, - 54,1,8,2,4,1,2,1,4,255,12,2,8,2,4,1, - 255,128,114,215,0,0,0,114,25,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, - 0,67,0,0,0,115,42,0,0,0,116,0,124,0,124,1, - 124,2,131,3,1,0,124,2,100,1,107,4,114,32,116,1, - 124,0,124,1,124,2,131,3,125,0,116,2,124,0,116,3, - 131,2,83,0,41,3,97,50,1,0,0,73,109,112,111,114, - 116,32,97,110,100,32,114,101,116,117,114,110,32,116,104,101, - 32,109,111,100,117,108,101,32,98,97,115,101,100,32,111,110, - 32,105,116,115,32,110,97,109,101,44,32,116,104,101,32,112, - 97,99,107,97,103,101,32,116,104,101,32,99,97,108,108,32, - 105,115,10,32,32,32,32,98,101,105,110,103,32,109,97,100, - 101,32,102,114,111,109,44,32,97,110,100,32,116,104,101,32, - 108,101,118,101,108,32,97,100,106,117,115,116,109,101,110,116, - 46,10,10,32,32,32,32,84,104,105,115,32,102,117,110,99, - 116,105,111,110,32,114,101,112,114,101,115,101,110,116,115,32, - 116,104,101,32,103,114,101,97,116,101,115,116,32,99,111,109, - 109,111,110,32,100,101,110,111,109,105,110,97,116,111,114,32, - 111,102,32,102,117,110,99,116,105,111,110,97,108,105,116,121, - 10,32,32,32,32,98,101,116,119,101,101,110,32,105,109,112, - 111,114,116,95,109,111,100,117,108,101,32,97,110,100,32,95, - 95,105,109,112,111,114,116,95,95,46,32,84,104,105,115,32, - 105,110,99,108,117,100,101,115,32,115,101,116,116,105,110,103, - 32,95,95,112,97,99,107,97,103,101,95,95,32,105,102,10, - 32,32,32,32,116,104,101,32,108,111,97,100,101,114,32,100, - 105,100,32,110,111,116,46,10,10,32,32,32,32,114,25,0, - 0,0,78,41,4,114,208,0,0,0,114,198,0,0,0,114, - 215,0,0,0,218,11,95,103,99,100,95,105,109,112,111,114, - 116,114,207,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,216,0,0,0,13,4,0,0,115,10, - 0,0,0,12,9,8,1,12,1,10,1,255,128,114,216,0, - 0,0,169,1,218,9,114,101,99,117,114,115,105,118,101,99, - 3,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0, - 11,0,0,0,67,0,0,0,115,216,0,0,0,124,1,68, - 0,93,204,125,4,116,0,124,4,116,1,131,2,115,64,124, - 3,114,34,124,0,106,2,100,1,23,0,125,5,110,4,100, - 2,125,5,116,3,100,3,124,5,155,0,100,4,116,4,124, - 4,131,1,106,2,155,0,157,4,131,1,130,1,124,4,100, - 5,107,2,114,106,124,3,115,4,116,5,124,0,100,6,131, - 2,114,4,116,6,124,0,124,0,106,7,124,2,100,7,100, - 8,141,4,1,0,113,4,116,5,124,0,124,4,131,2,115, - 4,100,9,160,8,124,0,106,2,124,4,161,2,125,6,122, - 14,116,9,124,2,124,6,131,2,1,0,87,0,113,4,4, - 0,116,10,121,214,1,0,125,7,1,0,122,42,124,7,106, - 11,124,6,107,2,114,200,116,12,106,13,160,14,124,6,116, - 15,161,2,100,10,117,1,114,200,87,0,89,0,100,10,125, - 7,126,7,113,4,130,0,100,10,125,7,126,7,48,0,124, - 0,83,0,48,0,41,11,122,238,70,105,103,117,114,101,32, - 111,117,116,32,119,104,97,116,32,95,95,105,109,112,111,114, - 116,95,95,32,115,104,111,117,108,100,32,114,101,116,117,114, - 110,46,10,10,32,32,32,32,84,104,101,32,105,109,112,111, - 114,116,95,32,112,97,114,97,109,101,116,101,114,32,105,115, - 32,97,32,99,97,108,108,97,98,108,101,32,119,104,105,99, - 104,32,116,97,107,101,115,32,116,104,101,32,110,97,109,101, - 32,111,102,32,109,111,100,117,108,101,32,116,111,10,32,32, - 32,32,105,109,112,111,114,116,46,32,73,116,32,105,115,32, - 114,101,113,117,105,114,101,100,32,116,111,32,100,101,99,111, - 117,112,108,101,32,116,104,101,32,102,117,110,99,116,105,111, - 110,32,102,114,111,109,32,97,115,115,117,109,105,110,103,32, - 105,109,112,111,114,116,108,105,98,39,115,10,32,32,32,32, - 105,109,112,111,114,116,32,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,32,105,115,32,100,101,115,105,114,101,100, - 46,10,10,32,32,32,32,122,8,46,95,95,97,108,108,95, - 95,122,13,96,96,102,114,111,109,32,108,105,115,116,39,39, - 122,8,73,116,101,109,32,105,110,32,122,18,32,109,117,115, - 116,32,98,101,32,115,116,114,44,32,110,111,116,32,250,1, - 42,218,7,95,95,97,108,108,95,95,84,114,217,0,0,0, - 114,193,0,0,0,78,41,16,114,203,0,0,0,114,204,0, - 0,0,114,9,0,0,0,114,205,0,0,0,114,3,0,0, - 0,114,11,0,0,0,218,16,95,104,97,110,100,108,101,95, - 102,114,111,109,108,105,115,116,114,220,0,0,0,114,49,0, - 0,0,114,71,0,0,0,114,211,0,0,0,114,20,0,0, - 0,114,18,0,0,0,114,99,0,0,0,114,38,0,0,0, - 114,214,0,0,0,41,8,114,104,0,0,0,218,8,102,114, - 111,109,108,105,115,116,114,212,0,0,0,114,218,0,0,0, - 218,1,120,90,5,119,104,101,114,101,90,9,102,114,111,109, - 95,110,97,109,101,90,3,101,120,99,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,221,0,0,0,28,4, - 0,0,115,54,0,0,0,8,10,10,1,4,1,12,1,4, - 2,10,1,8,1,8,255,8,2,14,1,10,1,2,1,8, - 255,10,2,14,1,2,1,14,1,14,1,10,4,16,1,2, - 255,12,2,2,1,8,128,4,1,2,248,255,128,114,221,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,6,0,0,0,67,0,0,0,115,146,0,0,0, - 124,0,160,0,100,1,161,1,125,1,124,0,160,0,100,2, - 161,1,125,2,124,1,100,3,117,1,114,82,124,2,100,3, - 117,1,114,78,124,1,124,2,106,1,107,3,114,78,116,2, - 106,3,100,4,124,1,155,2,100,5,124,2,106,1,155,2, - 100,6,157,5,116,4,100,7,100,8,141,3,1,0,124,1, - 83,0,124,2,100,3,117,1,114,96,124,2,106,1,83,0, - 116,2,106,3,100,9,116,4,100,7,100,8,141,3,1,0, - 124,0,100,10,25,0,125,1,100,11,124,0,118,1,114,142, - 124,1,160,5,100,12,161,1,100,13,25,0,125,1,124,1, - 83,0,41,14,122,167,67,97,108,99,117,108,97,116,101,32, - 119,104,97,116,32,95,95,112,97,99,107,97,103,101,95,95, - 32,115,104,111,117,108,100,32,98,101,46,10,10,32,32,32, - 32,95,95,112,97,99,107,97,103,101,95,95,32,105,115,32, - 110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116, - 111,32,98,101,32,100,101,102,105,110,101,100,32,111,114,32, - 99,111,117,108,100,32,98,101,32,115,101,116,32,116,111,32, - 78,111,110,101,10,32,32,32,32,116,111,32,114,101,112,114, - 101,115,101,110,116,32,116,104,97,116,32,105,116,115,32,112, - 114,111,112,101,114,32,118,97,108,117,101,32,105,115,32,117, - 110,107,110,111,119,110,46,10,10,32,32,32,32,114,152,0, - 0,0,114,113,0,0,0,78,122,32,95,95,112,97,99,107, - 97,103,101,95,95,32,33,61,32,95,95,115,112,101,99,95, - 95,46,112,97,114,101,110,116,32,40,122,4,32,33,61,32, - 250,1,41,233,3,0,0,0,41,1,90,10,115,116,97,99, - 107,108,101,118,101,108,122,89,99,97,110,39,116,32,114,101, - 115,111,108,118,101,32,112,97,99,107,97,103,101,32,102,114, - 111,109,32,95,95,115,112,101,99,95,95,32,111,114,32,95, - 95,112,97,99,107,97,103,101,95,95,44,32,102,97,108,108, - 105,110,103,32,98,97,99,107,32,111,110,32,95,95,110,97, - 109,101,95,95,32,97,110,100,32,95,95,112,97,116,104,95, - 95,114,9,0,0,0,114,148,0,0,0,114,135,0,0,0, - 114,25,0,0,0,41,6,114,38,0,0,0,114,137,0,0, - 0,114,95,0,0,0,114,96,0,0,0,114,163,0,0,0, - 114,136,0,0,0,41,3,218,7,103,108,111,98,97,108,115, - 114,196,0,0,0,114,103,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,17,95,99,97,108,99, - 95,95,95,112,97,99,107,97,103,101,95,95,65,4,0,0, - 115,44,0,0,0,10,7,10,1,8,1,18,1,6,1,2, - 1,4,255,4,1,6,255,4,2,6,254,4,3,8,1,6, - 1,6,2,4,2,6,254,8,3,8,1,14,1,4,1,255, - 128,114,227,0,0,0,114,5,0,0,0,99,5,0,0,0, - 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, - 67,0,0,0,115,174,0,0,0,124,4,100,1,107,2,114, - 18,116,0,124,0,131,1,125,5,110,36,124,1,100,2,117, - 1,114,30,124,1,110,2,105,0,125,6,116,1,124,6,131, - 1,125,7,116,0,124,0,124,7,124,4,131,3,125,5,124, - 3,115,148,124,4,100,1,107,2,114,84,116,0,124,0,160, - 2,100,3,161,1,100,1,25,0,131,1,83,0,124,0,115, - 92,124,5,83,0,116,3,124,0,131,1,116,3,124,0,160, - 2,100,3,161,1,100,1,25,0,131,1,24,0,125,8,116, - 4,106,5,124,5,106,6,100,2,116,3,124,5,106,6,131, - 1,124,8,24,0,133,2,25,0,25,0,83,0,116,7,124, - 5,100,4,131,2,114,170,116,8,124,5,124,3,116,0,131, - 3,83,0,124,5,83,0,41,5,97,215,1,0,0,73,109, - 112,111,114,116,32,97,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,84,104,101,32,39,103,108,111,98,97,108,115, - 39,32,97,114,103,117,109,101,110,116,32,105,115,32,117,115, - 101,100,32,116,111,32,105,110,102,101,114,32,119,104,101,114, - 101,32,116,104,101,32,105,109,112,111,114,116,32,105,115,32, - 111,99,99,117,114,114,105,110,103,32,102,114,111,109,10,32, - 32,32,32,116,111,32,104,97,110,100,108,101,32,114,101,108, - 97,116,105,118,101,32,105,109,112,111,114,116,115,46,32,84, - 104,101,32,39,108,111,99,97,108,115,39,32,97,114,103,117, - 109,101,110,116,32,105,115,32,105,103,110,111,114,101,100,46, - 32,84,104,101,10,32,32,32,32,39,102,114,111,109,108,105, - 115,116,39,32,97,114,103,117,109,101,110,116,32,115,112,101, - 99,105,102,105,101,115,32,119,104,97,116,32,115,104,111,117, - 108,100,32,101,120,105,115,116,32,97,115,32,97,116,116,114, - 105,98,117,116,101,115,32,111,110,32,116,104,101,32,109,111, - 100,117,108,101,10,32,32,32,32,98,101,105,110,103,32,105, - 109,112,111,114,116,101,100,32,40,101,46,103,46,32,96,96, - 102,114,111,109,32,109,111,100,117,108,101,32,105,109,112,111, - 114,116,32,60,102,114,111,109,108,105,115,116,62,96,96,41, - 46,32,32,84,104,101,32,39,108,101,118,101,108,39,10,32, - 32,32,32,97,114,103,117,109,101,110,116,32,114,101,112,114, - 101,115,101,110,116,115,32,116,104,101,32,112,97,99,107,97, - 103,101,32,108,111,99,97,116,105,111,110,32,116,111,32,105, - 109,112,111,114,116,32,102,114,111,109,32,105,110,32,97,32, - 114,101,108,97,116,105,118,101,10,32,32,32,32,105,109,112, - 111,114,116,32,40,101,46,103,46,32,96,96,102,114,111,109, - 32,46,46,112,107,103,32,105,109,112,111,114,116,32,109,111, - 100,96,96,32,119,111,117,108,100,32,104,97,118,101,32,97, - 32,39,108,101,118,101,108,39,32,111,102,32,50,41,46,10, - 10,32,32,32,32,114,25,0,0,0,78,114,135,0,0,0, - 114,148,0,0,0,41,9,114,216,0,0,0,114,227,0,0, - 0,218,9,112,97,114,116,105,116,105,111,110,114,195,0,0, - 0,114,18,0,0,0,114,99,0,0,0,114,9,0,0,0, - 114,11,0,0,0,114,221,0,0,0,41,9,114,20,0,0, - 0,114,226,0,0,0,218,6,108,111,99,97,108,115,114,222, - 0,0,0,114,197,0,0,0,114,104,0,0,0,90,8,103, - 108,111,98,97,108,115,95,114,196,0,0,0,90,7,99,117, - 116,95,111,102,102,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,10,95,95,105,109,112,111,114,116,95,95, - 92,4,0,0,115,32,0,0,0,8,11,10,1,16,2,8, - 1,12,1,4,1,8,3,18,1,4,1,4,1,26,4,30, - 3,10,1,12,1,4,2,255,128,114,230,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, - 0,0,0,67,0,0,0,115,38,0,0,0,116,0,160,1, - 124,0,161,1,125,1,124,1,100,0,117,0,114,30,116,2, - 100,1,124,0,23,0,131,1,130,1,116,3,124,1,131,1, - 83,0,41,2,78,122,25,110,111,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,32,110,97,109,101,100,32, - 41,4,114,169,0,0,0,114,177,0,0,0,114,83,0,0, - 0,114,167,0,0,0,41,2,114,20,0,0,0,114,103,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,18,95,98,117,105,108,116,105,110,95,102,114,111,109, - 95,110,97,109,101,129,4,0,0,115,10,0,0,0,10,1, - 8,1,12,1,8,1,255,128,114,231,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,10,0,0,0,5,0, - 0,0,67,0,0,0,115,164,0,0,0,124,1,97,0,124, - 0,97,1,116,2,116,1,131,1,125,2,116,1,106,3,160, - 4,161,0,68,0,93,70,92,2,125,3,125,4,116,5,124, - 4,124,2,131,2,114,26,124,3,116,1,106,6,118,0,114, - 60,116,7,125,5,110,16,116,0,160,8,124,3,161,1,114, - 26,116,9,125,5,110,0,116,10,124,4,124,5,131,2,125, - 6,116,11,124,6,124,4,131,2,1,0,113,26,116,1,106, - 3,116,12,25,0,125,7,100,1,68,0,93,46,125,8,124, - 8,116,1,106,3,118,1,114,136,116,13,124,8,131,1,125, - 9,110,10,116,1,106,3,124,8,25,0,125,9,116,14,124, - 7,124,8,124,9,131,3,1,0,113,112,100,2,83,0,41, - 3,122,250,83,101,116,117,112,32,105,109,112,111,114,116,108, - 105,98,32,98,121,32,105,109,112,111,114,116,105,110,103,32, - 110,101,101,100,101,100,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,115,32,97,110,100,32,105,110,106,101, - 99,116,105,110,103,32,116,104,101,109,10,32,32,32,32,105, - 110,116,111,32,116,104,101,32,103,108,111,98,97,108,32,110, - 97,109,101,115,112,97,99,101,46,10,10,32,32,32,32,65, - 115,32,115,121,115,32,105,115,32,110,101,101,100,101,100,32, - 102,111,114,32,115,121,115,46,109,111,100,117,108,101,115,32, - 97,99,99,101,115,115,32,97,110,100,32,95,105,109,112,32, - 105,115,32,110,101,101,100,101,100,32,116,111,32,108,111,97, - 100,32,98,117,105,108,116,45,105,110,10,32,32,32,32,109, - 111,100,117,108,101,115,44,32,116,104,111,115,101,32,116,119, - 111,32,109,111,100,117,108,101,115,32,109,117,115,116,32,98, - 101,32,101,120,112,108,105,99,105,116,108,121,32,112,97,115, - 115,101,100,32,105,110,46,10,10,32,32,32,32,41,3,114, - 26,0,0,0,114,95,0,0,0,114,68,0,0,0,78,41, - 15,114,61,0,0,0,114,18,0,0,0,114,3,0,0,0, - 114,99,0,0,0,218,5,105,116,101,109,115,114,203,0,0, - 0,114,82,0,0,0,114,169,0,0,0,114,92,0,0,0, - 114,184,0,0,0,114,149,0,0,0,114,155,0,0,0,114, - 9,0,0,0,114,231,0,0,0,114,12,0,0,0,41,10, - 218,10,115,121,115,95,109,111,100,117,108,101,218,11,95,105, - 109,112,95,109,111,100,117,108,101,90,11,109,111,100,117,108, - 101,95,116,121,112,101,114,20,0,0,0,114,104,0,0,0, - 114,116,0,0,0,114,103,0,0,0,90,11,115,101,108,102, - 95,109,111,100,117,108,101,90,12,98,117,105,108,116,105,110, - 95,110,97,109,101,90,14,98,117,105,108,116,105,110,95,109, - 111,100,117,108,101,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,6,95,115,101,116,117,112,136,4,0,0, - 115,38,0,0,0,4,9,4,1,8,3,18,1,10,1,10, - 1,6,1,10,1,6,1,10,3,12,1,10,3,8,1,10, - 1,10,1,10,2,14,1,4,251,255,128,114,235,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, - 124,0,124,1,131,2,1,0,116,1,106,2,160,3,116,4, - 161,1,1,0,116,1,106,2,160,3,116,5,161,1,1,0, - 100,1,83,0,41,2,122,48,73,110,115,116,97,108,108,32, - 105,109,112,111,114,116,101,114,115,32,102,111,114,32,98,117, - 105,108,116,105,110,32,97,110,100,32,102,114,111,122,101,110, - 32,109,111,100,117,108,101,115,78,41,6,114,235,0,0,0, - 114,18,0,0,0,114,201,0,0,0,114,126,0,0,0,114, - 169,0,0,0,114,184,0,0,0,41,2,114,233,0,0,0, - 114,234,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,8,95,105,110,115,116,97,108,108,171,4, - 0,0,115,8,0,0,0,10,2,12,2,16,1,255,128,114, - 236,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,4,0,0,0,67,0,0,0,115,32,0, - 0,0,100,1,100,2,108,0,125,0,124,0,97,1,124,0, - 160,2,116,3,106,4,116,5,25,0,161,1,1,0,100,2, - 83,0,41,3,122,57,73,110,115,116,97,108,108,32,105,109, - 112,111,114,116,101,114,115,32,116,104,97,116,32,114,101,113, - 117,105,114,101,32,101,120,116,101,114,110,97,108,32,102,105, - 108,101,115,121,115,116,101,109,32,97,99,99,101,115,115,114, - 25,0,0,0,78,41,6,218,26,95,102,114,111,122,101,110, - 95,105,109,112,111,114,116,108,105,98,95,101,120,116,101,114, - 110,97,108,114,133,0,0,0,114,236,0,0,0,114,18,0, - 0,0,114,99,0,0,0,114,9,0,0,0,41,1,114,237, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,27,95,105,110,115,116,97,108,108,95,101,120,116, - 101,114,110,97,108,95,105,109,112,111,114,116,101,114,115,179, - 4,0,0,115,8,0,0,0,8,3,4,1,20,1,255,128, - 114,238,0,0,0,41,2,78,78,41,1,78,41,2,78,114, - 25,0,0,0,41,4,78,78,114,5,0,0,0,114,25,0, - 0,0,41,54,114,10,0,0,0,114,7,0,0,0,114,26, - 0,0,0,114,95,0,0,0,114,68,0,0,0,114,133,0, - 0,0,114,17,0,0,0,114,21,0,0,0,114,63,0,0, - 0,114,37,0,0,0,114,47,0,0,0,114,22,0,0,0, - 114,23,0,0,0,114,53,0,0,0,114,54,0,0,0,114, - 57,0,0,0,114,69,0,0,0,114,71,0,0,0,114,80, - 0,0,0,114,90,0,0,0,114,94,0,0,0,114,105,0, - 0,0,114,118,0,0,0,114,119,0,0,0,114,98,0,0, - 0,114,149,0,0,0,114,155,0,0,0,114,159,0,0,0, - 114,114,0,0,0,114,100,0,0,0,114,166,0,0,0,114, - 167,0,0,0,114,101,0,0,0,114,169,0,0,0,114,184, - 0,0,0,114,189,0,0,0,114,198,0,0,0,114,200,0, - 0,0,114,202,0,0,0,114,208,0,0,0,90,15,95,69, - 82,82,95,77,83,71,95,80,82,69,70,73,88,114,210,0, - 0,0,114,213,0,0,0,218,6,111,98,106,101,99,116,114, - 214,0,0,0,114,215,0,0,0,114,216,0,0,0,114,221, - 0,0,0,114,227,0,0,0,114,230,0,0,0,114,231,0, - 0,0,114,235,0,0,0,114,236,0,0,0,114,238,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,8,60,109,111,100,117,108,101,62,1, - 0,0,0,115,106,0,0,0,4,0,8,22,4,9,4,1, - 4,1,4,3,8,3,8,8,4,8,4,2,16,3,14,4, - 14,77,14,21,8,16,8,37,8,17,14,11,8,8,8,11, - 8,12,8,19,14,36,16,101,10,26,14,45,8,72,8,17, - 8,17,8,30,8,36,8,45,14,15,14,75,14,80,8,13, - 8,9,10,9,8,47,4,16,8,1,8,2,6,32,8,3, - 10,16,14,15,8,37,10,27,8,37,8,7,8,35,12,8, - 255,128, + 0,0,0,115,32,0,0,0,100,1,100,2,108,0,125,0, + 124,0,97,1,124,0,160,2,116,3,106,4,116,5,25,0, + 161,1,1,0,100,2,83,0,41,3,122,57,73,110,115,116, + 97,108,108,32,105,109,112,111,114,116,101,114,115,32,116,104, + 97,116,32,114,101,113,117,105,114,101,32,101,120,116,101,114, + 110,97,108,32,102,105,108,101,115,121,115,116,101,109,32,97, + 99,99,101,115,115,114,25,0,0,0,78,41,6,218,26,95, + 102,114,111,122,101,110,95,105,109,112,111,114,116,108,105,98, + 95,101,120,116,101,114,110,97,108,114,133,0,0,0,114,236, + 0,0,0,114,18,0,0,0,114,99,0,0,0,114,9,0, + 0,0,41,1,114,237,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,27,95,105,110,115,116,97, + 108,108,95,101,120,116,101,114,110,97,108,95,105,109,112,111, + 114,116,101,114,115,179,4,0,0,115,8,0,0,0,8,3, + 4,1,20,1,255,128,114,238,0,0,0,41,2,78,78,41, + 1,78,41,2,78,114,25,0,0,0,41,4,78,78,114,5, + 0,0,0,114,25,0,0,0,41,54,114,10,0,0,0,114, + 7,0,0,0,114,26,0,0,0,114,95,0,0,0,114,68, + 0,0,0,114,133,0,0,0,114,17,0,0,0,114,21,0, + 0,0,114,63,0,0,0,114,37,0,0,0,114,47,0,0, + 0,114,22,0,0,0,114,23,0,0,0,114,53,0,0,0, + 114,54,0,0,0,114,57,0,0,0,114,69,0,0,0,114, + 71,0,0,0,114,80,0,0,0,114,90,0,0,0,114,94, + 0,0,0,114,105,0,0,0,114,118,0,0,0,114,119,0, + 0,0,114,98,0,0,0,114,149,0,0,0,114,155,0,0, + 0,114,159,0,0,0,114,114,0,0,0,114,100,0,0,0, + 114,166,0,0,0,114,167,0,0,0,114,101,0,0,0,114, + 169,0,0,0,114,184,0,0,0,114,189,0,0,0,114,198, + 0,0,0,114,200,0,0,0,114,202,0,0,0,114,208,0, + 0,0,90,15,95,69,82,82,95,77,83,71,95,80,82,69, + 70,73,88,114,210,0,0,0,114,213,0,0,0,218,6,111, + 98,106,101,99,116,114,214,0,0,0,114,215,0,0,0,114, + 216,0,0,0,114,221,0,0,0,114,227,0,0,0,114,230, + 0,0,0,114,231,0,0,0,114,235,0,0,0,114,236,0, + 0,0,114,238,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,8,60,109,111, + 100,117,108,101,62,1,0,0,0,115,106,0,0,0,4,0, + 8,22,4,9,4,1,4,1,4,3,8,3,8,8,4,8, + 4,2,16,3,14,4,14,77,14,21,8,16,8,37,8,17, + 14,11,8,8,8,11,8,12,8,19,14,36,16,101,10,26, + 14,45,8,72,8,17,8,17,8,30,8,36,8,45,14,15, + 14,75,14,80,8,13,8,9,10,9,8,47,4,16,8,1, + 8,2,6,32,8,3,10,16,14,15,8,37,10,27,8,37, + 8,7,8,35,12,8,255,128, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index cf6e8902ddcfd2..59a2fe2502921a 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -773,247 +773,247 @@ const unsigned char _Py_M__zipimport[] = { 99,101,112,116,105,111,110,114,142,0,0,0,114,9,0,0, 0,114,9,0,0,0,114,10,0,0,0,218,20,95,103,101, 116,95,100,101,99,111,109,112,114,101,115,115,95,102,117,110, - 99,31,2,0,0,115,26,0,0,0,4,2,10,3,8,1, - 4,2,4,1,16,1,12,1,10,1,12,1,12,2,10,2, - 4,1,255,128,114,146,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,17,0,0,0,9,0,0,0,67,0, - 0,0,115,132,1,0,0,124,1,92,8,125,2,125,3,125, - 4,125,5,125,6,125,7,125,8,125,9,124,4,100,1,107, - 0,114,36,116,0,100,2,131,1,130,1,116,1,160,2,124, - 0,161,1,144,1,143,6,125,10,122,14,124,10,160,3,124, - 6,161,1,1,0,87,0,110,32,4,0,116,4,121,96,1, - 0,1,0,1,0,116,0,100,3,124,0,155,2,157,2,124, - 0,100,4,141,2,130,1,48,0,124,10,160,5,100,5,161, - 1,125,11,116,6,124,11,131,1,100,5,107,3,114,128,116, - 7,100,6,131,1,130,1,124,11,100,0,100,7,133,2,25, - 0,100,8,107,3,114,162,116,0,100,9,124,0,155,2,157, - 2,124,0,100,4,141,2,130,1,116,8,124,11,100,10,100, - 11,133,2,25,0,131,1,125,12,116,8,124,11,100,11,100, - 5,133,2,25,0,131,1,125,13,100,5,124,12,23,0,124, - 13,23,0,125,14,124,6,124,14,55,0,125,6,122,14,124, - 10,160,3,124,6,161,1,1,0,87,0,110,34,4,0,116, - 4,144,1,121,6,1,0,1,0,1,0,116,0,100,3,124, - 0,155,2,157,2,124,0,100,4,141,2,130,1,48,0,124, - 10,160,5,124,4,161,1,125,15,116,6,124,15,131,1,124, - 4,107,3,144,1,114,40,116,4,100,12,131,1,130,1,87, - 0,100,0,4,0,4,0,131,3,1,0,110,18,49,0,144, - 1,115,62,48,0,1,0,1,0,1,0,89,0,1,0,124, - 3,100,1,107,2,144,1,114,86,124,15,83,0,122,10,116, - 9,131,0,125,16,87,0,110,24,4,0,116,10,144,1,121, - 120,1,0,1,0,1,0,116,0,100,13,131,1,130,1,48, - 0,124,16,124,15,100,14,131,2,83,0,41,15,78,114,0, - 0,0,0,122,18,110,101,103,97,116,105,118,101,32,100,97, - 116,97,32,115,105,122,101,114,94,0,0,0,114,12,0,0, - 0,114,106,0,0,0,114,100,0,0,0,114,95,0,0,0, - 115,4,0,0,0,80,75,3,4,122,23,98,97,100,32,108, - 111,99,97,108,32,102,105,108,101,32,104,101,97,100,101,114, - 58,32,233,26,0,0,0,114,105,0,0,0,122,26,122,105, - 112,105,109,112,111,114,116,58,32,99,97,110,39,116,32,114, - 101,97,100,32,100,97,116,97,114,141,0,0,0,105,241,255, - 255,255,41,11,114,3,0,0,0,114,112,0,0,0,114,113, - 0,0,0,114,114,0,0,0,114,22,0,0,0,114,116,0, - 0,0,114,55,0,0,0,114,121,0,0,0,114,1,0,0, - 0,114,146,0,0,0,114,145,0,0,0,41,17,114,29,0, - 0,0,114,58,0,0,0,90,8,100,97,116,97,112,97,116, - 104,114,132,0,0,0,114,136,0,0,0,114,127,0,0,0, - 114,139,0,0,0,114,133,0,0,0,114,134,0,0,0,114, - 135,0,0,0,114,125,0,0,0,114,126,0,0,0,114,137, - 0,0,0,114,138,0,0,0,114,129,0,0,0,90,8,114, - 97,119,95,100,97,116,97,114,143,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,114,56,0,0,0, - 52,2,0,0,115,64,0,0,0,20,1,8,1,8,1,14, - 2,2,2,14,1,12,1,20,1,10,1,12,1,8,1,16, - 2,18,2,16,2,16,1,12,1,8,1,2,1,14,1,14, - 1,20,1,10,1,14,1,40,1,10,2,4,2,2,3,10, - 1,14,1,10,1,10,1,255,128,114,56,0,0,0,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, - 0,0,0,67,0,0,0,115,16,0,0,0,116,0,124,0, - 124,1,24,0,131,1,100,1,107,1,83,0,41,2,78,114, - 5,0,0,0,41,1,218,3,97,98,115,41,2,90,2,116, - 49,90,2,116,50,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,218,9,95,101,113,95,109,116,105,109,101,98, - 2,0,0,115,4,0,0,0,16,2,255,128,114,149,0,0, - 0,99,5,0,0,0,0,0,0,0,0,0,0,0,14,0, - 0,0,8,0,0,0,67,0,0,0,115,60,1,0,0,124, - 3,124,2,100,1,156,2,125,5,122,18,116,0,160,1,124, - 4,124,3,124,5,161,3,125,6,87,0,110,20,4,0,116, - 2,121,48,1,0,1,0,1,0,89,0,100,0,83,0,48, - 0,124,6,100,2,64,0,100,3,107,3,125,7,124,7,114, - 182,124,6,100,4,64,0,100,3,107,3,125,8,116,3,106, - 4,100,5,107,3,144,1,114,10,124,8,115,106,116,3,106, - 4,100,6,107,2,144,1,114,10,116,5,124,0,124,2,131, - 2,125,9,124,9,100,0,117,1,144,1,114,10,116,3,160, - 6,116,0,106,7,124,9,161,2,125,10,122,20,116,0,160, - 8,124,4,124,10,124,3,124,5,161,4,1,0,87,0,110, - 104,4,0,116,2,121,180,1,0,1,0,1,0,89,0,100, - 0,83,0,48,0,116,9,124,0,124,2,131,2,92,2,125, - 11,125,12,124,11,144,1,114,10,116,10,116,11,124,4,100, - 7,100,8,133,2,25,0,131,1,124,11,131,2,114,246,116, - 11,124,4,100,8,100,9,133,2,25,0,131,1,124,12,107, - 3,144,1,114,10,116,12,160,13,100,10,124,3,155,2,157, - 2,161,1,1,0,100,0,83,0,116,14,160,15,124,4,100, - 9,100,0,133,2,25,0,161,1,125,13,116,16,124,13,116, - 17,131,2,144,1,115,56,116,18,100,11,124,1,155,2,100, - 12,157,3,131,1,130,1,124,13,83,0,41,13,78,41,2, - 114,44,0,0,0,114,13,0,0,0,114,5,0,0,0,114, - 0,0,0,0,114,88,0,0,0,90,5,110,101,118,101,114, - 90,6,97,108,119,97,121,115,114,101,0,0,0,114,96,0, - 0,0,114,97,0,0,0,122,22,98,121,116,101,99,111,100, - 101,32,105,115,32,115,116,97,108,101,32,102,111,114,32,122, - 16,99,111,109,112,105,108,101,100,32,109,111,100,117,108,101, - 32,122,21,32,105,115,32,110,111,116,32,97,32,99,111,100, - 101,32,111,98,106,101,99,116,41,19,114,21,0,0,0,90, - 13,95,99,108,97,115,115,105,102,121,95,112,121,99,114,79, - 0,0,0,218,4,95,105,109,112,90,21,99,104,101,99,107, - 95,104,97,115,104,95,98,97,115,101,100,95,112,121,99,115, - 218,15,95,103,101,116,95,112,121,99,95,115,111,117,114,99, - 101,218,11,115,111,117,114,99,101,95,104,97,115,104,90,17, - 95,82,65,87,95,77,65,71,73,67,95,78,85,77,66,69, - 82,90,18,95,118,97,108,105,100,97,116,101,95,104,97,115, - 104,95,112,121,99,218,29,95,103,101,116,95,109,116,105,109, - 101,95,97,110,100,95,115,105,122,101,95,111,102,95,115,111, - 117,114,99,101,114,149,0,0,0,114,2,0,0,0,114,45, - 0,0,0,114,80,0,0,0,218,7,109,97,114,115,104,97, - 108,90,5,108,111,97,100,115,114,15,0,0,0,218,10,95, - 99,111,100,101,95,116,121,112,101,218,9,84,121,112,101,69, - 114,114,111,114,41,14,114,32,0,0,0,114,57,0,0,0, - 114,66,0,0,0,114,38,0,0,0,114,128,0,0,0,90, - 11,101,120,99,95,100,101,116,97,105,108,115,114,131,0,0, - 0,90,10,104,97,115,104,95,98,97,115,101,100,90,12,99, - 104,101,99,107,95,115,111,117,114,99,101,90,12,115,111,117, - 114,99,101,95,98,121,116,101,115,114,152,0,0,0,90,12, - 115,111,117,114,99,101,95,109,116,105,109,101,90,11,115,111, - 117,114,99,101,95,115,105,122,101,114,50,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,15,95, - 117,110,109,97,114,115,104,97,108,95,99,111,100,101,108,2, - 0,0,115,84,0,0,0,2,2,2,1,6,254,2,5,18, - 1,12,1,8,1,12,2,4,1,12,1,12,1,2,1,2, - 255,8,1,4,255,10,2,10,1,4,1,4,1,2,1,4, - 254,2,5,4,1,8,1,8,255,12,2,8,1,8,3,6, - 255,6,3,22,3,18,1,4,255,4,2,8,1,4,255,4, - 2,18,2,12,1,16,1,4,1,255,128,114,157,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,4,0,0,0,67,0,0,0,115,28,0,0,0,124,0, - 160,0,100,1,100,2,161,2,125,0,124,0,160,0,100,3, - 100,2,161,2,125,0,124,0,83,0,41,4,78,115,2,0, - 0,0,13,10,243,1,0,0,0,10,243,1,0,0,0,13, - 41,1,114,19,0,0,0,41,1,218,6,115,111,117,114,99, - 101,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,23,95,110,111,114,109,97,108,105,122,101,95,108,105,110, - 101,95,101,110,100,105,110,103,115,159,2,0,0,115,8,0, - 0,0,12,1,12,1,4,1,255,128,114,161,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 6,0,0,0,67,0,0,0,115,24,0,0,0,116,0,124, - 1,131,1,125,1,116,1,124,1,124,0,100,1,100,2,100, - 3,141,4,83,0,41,4,78,114,78,0,0,0,84,41,1, - 90,12,100,111,110,116,95,105,110,104,101,114,105,116,41,2, - 114,161,0,0,0,218,7,99,111,109,112,105,108,101,41,2, - 114,57,0,0,0,114,160,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,15,95,99,111,109,112, - 105,108,101,95,115,111,117,114,99,101,166,2,0,0,115,6, - 0,0,0,8,1,16,1,255,128,114,163,0,0,0,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,11, - 0,0,0,67,0,0,0,115,68,0,0,0,116,0,160,1, - 124,0,100,1,63,0,100,2,23,0,124,0,100,3,63,0, - 100,4,64,0,124,0,100,5,64,0,124,1,100,6,63,0, - 124,1,100,3,63,0,100,7,64,0,124,1,100,5,64,0, - 100,8,20,0,100,9,100,9,100,9,102,9,161,1,83,0, - 41,10,78,233,9,0,0,0,105,188,7,0,0,233,5,0, - 0,0,233,15,0,0,0,233,31,0,0,0,233,11,0,0, - 0,233,63,0,0,0,114,88,0,0,0,114,14,0,0,0, - 41,2,114,133,0,0,0,90,6,109,107,116,105,109,101,41, - 2,218,1,100,114,140,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,14,95,112,97,114,115,101, - 95,100,111,115,116,105,109,101,172,2,0,0,115,20,0,0, - 0,4,1,10,1,10,1,6,1,6,1,10,1,10,1,6, - 1,6,249,255,128,114,171,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,6,0,0,0,10,0,0,0,67, - 0,0,0,115,110,0,0,0,122,82,124,1,100,1,100,0, - 133,2,25,0,100,2,118,0,115,22,74,0,130,1,124,1, - 100,0,100,1,133,2,25,0,125,1,124,0,106,0,124,1, - 25,0,125,2,124,2,100,3,25,0,125,3,124,2,100,4, - 25,0,125,4,124,2,100,5,25,0,125,5,116,1,124,4, - 124,3,131,2,124,5,102,2,87,0,83,0,4,0,116,2, - 116,3,116,4,102,3,121,108,1,0,1,0,1,0,89,0, - 100,6,83,0,48,0,41,7,78,114,14,0,0,0,169,2, - 218,1,99,218,1,111,114,165,0,0,0,233,6,0,0,0, - 233,3,0,0,0,41,2,114,0,0,0,0,114,0,0,0, - 0,41,5,114,28,0,0,0,114,171,0,0,0,114,26,0, - 0,0,218,10,73,110,100,101,120,69,114,114,111,114,114,156, - 0,0,0,41,6,114,32,0,0,0,114,13,0,0,0,114, - 58,0,0,0,114,133,0,0,0,114,134,0,0,0,90,17, - 117,110,99,111,109,112,114,101,115,115,101,100,95,115,105,122, - 101,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 114,153,0,0,0,185,2,0,0,115,22,0,0,0,2,1, - 20,2,12,1,10,1,8,3,8,1,8,1,16,1,18,1, - 8,1,255,128,114,153,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0, - 0,0,115,80,0,0,0,124,1,100,1,100,0,133,2,25, - 0,100,2,118,0,115,20,74,0,130,1,124,1,100,0,100, - 1,133,2,25,0,125,1,122,14,124,0,106,0,124,1,25, - 0,125,2,87,0,110,20,4,0,116,1,121,66,1,0,1, - 0,1,0,89,0,100,0,83,0,48,0,116,2,124,0,106, - 3,124,2,131,2,83,0,41,3,78,114,14,0,0,0,114, - 172,0,0,0,41,4,114,28,0,0,0,114,26,0,0,0, - 114,56,0,0,0,114,29,0,0,0,41,3,114,32,0,0, - 0,114,13,0,0,0,114,58,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,114,151,0,0,0,204, - 2,0,0,115,16,0,0,0,20,2,12,1,2,2,14,1, - 12,1,8,1,12,2,255,128,114,151,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,11,0,0,0,9,0, - 0,0,67,0,0,0,115,190,0,0,0,116,0,124,0,124, - 1,131,2,125,2,116,1,68,0,93,156,92,3,125,3,125, - 4,125,5,124,2,124,3,23,0,125,6,116,2,106,3,100, - 1,124,0,106,4,116,5,124,6,100,2,100,3,141,5,1, - 0,122,14,124,0,106,6,124,6,25,0,125,7,87,0,110, - 18,4,0,116,7,121,86,1,0,1,0,1,0,89,0,113, - 14,48,0,124,7,100,4,25,0,125,8,116,8,124,0,106, - 4,124,7,131,2,125,9,124,4,114,130,116,9,124,0,124, - 8,124,6,124,1,124,9,131,5,125,10,110,10,116,10,124, - 8,124,9,131,2,125,10,124,10,100,0,117,0,114,150,113, - 14,124,7,100,4,25,0,125,8,124,10,124,5,124,8,102, - 3,2,0,1,0,83,0,116,11,100,5,124,1,155,2,157, - 2,124,1,100,6,141,2,130,1,41,7,78,122,13,116,114, - 121,105,110,103,32,123,125,123,125,123,125,114,88,0,0,0, - 41,1,90,9,118,101,114,98,111,115,105,116,121,114,0,0, - 0,0,114,61,0,0,0,114,62,0,0,0,41,12,114,36, - 0,0,0,114,91,0,0,0,114,45,0,0,0,114,80,0, - 0,0,114,29,0,0,0,114,20,0,0,0,114,28,0,0, - 0,114,26,0,0,0,114,56,0,0,0,114,157,0,0,0, - 114,163,0,0,0,114,3,0,0,0,41,11,114,32,0,0, - 0,114,38,0,0,0,114,13,0,0,0,114,92,0,0,0, - 114,93,0,0,0,114,51,0,0,0,114,66,0,0,0,114, - 58,0,0,0,114,40,0,0,0,114,128,0,0,0,114,50, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,48,0,0,0,219,2,0,0,115,38,0,0,0, - 10,1,14,1,8,1,22,1,2,1,14,1,12,1,6,1, - 8,2,12,1,4,1,18,1,10,2,8,1,2,3,8,1, - 14,1,18,2,255,128,114,48,0,0,0,41,46,114,86,0, - 0,0,90,26,95,102,114,111,122,101,110,95,105,109,112,111, - 114,116,108,105,98,95,101,120,116,101,114,110,97,108,114,21, - 0,0,0,114,1,0,0,0,114,2,0,0,0,90,17,95, - 102,114,111,122,101,110,95,105,109,112,111,114,116,108,105,98, - 114,45,0,0,0,114,150,0,0,0,114,112,0,0,0,114, - 154,0,0,0,114,71,0,0,0,114,133,0,0,0,114,69, - 0,0,0,90,7,95,95,97,108,108,95,95,114,20,0,0, - 0,90,15,112,97,116,104,95,115,101,112,97,114,97,116,111, - 114,115,114,18,0,0,0,114,79,0,0,0,114,3,0,0, - 0,114,25,0,0,0,218,4,116,121,112,101,114,74,0,0, - 0,114,115,0,0,0,114,117,0,0,0,114,119,0,0,0, - 90,13,95,76,111,97,100,101,114,66,97,115,105,99,115,114, - 4,0,0,0,114,91,0,0,0,114,36,0,0,0,114,37, - 0,0,0,114,35,0,0,0,114,27,0,0,0,114,124,0, - 0,0,114,144,0,0,0,114,146,0,0,0,114,56,0,0, - 0,114,149,0,0,0,114,157,0,0,0,218,8,95,95,99, - 111,100,101,95,95,114,155,0,0,0,114,161,0,0,0,114, - 163,0,0,0,114,171,0,0,0,114,153,0,0,0,114,151, - 0,0,0,114,48,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,8,60,109, - 111,100,117,108,101,62,1,0,0,0,115,92,0,0,0,4, - 0,8,16,16,1,8,1,8,1,8,1,8,1,8,1,8, - 1,8,1,8,2,6,3,14,1,16,3,4,4,8,2,4, - 2,4,1,4,1,18,2,0,127,0,127,12,33,12,1,2, - 1,2,1,4,252,8,9,8,4,8,9,8,31,2,126,2, - 254,4,29,8,5,8,21,8,46,8,10,10,46,8,5,8, - 7,8,6,8,13,8,19,12,15,255,128, + 99,31,2,0,0,115,28,0,0,0,4,2,10,3,8,1, + 4,2,4,1,16,1,12,1,10,1,10,1,2,128,12,2, + 10,2,4,1,255,128,114,146,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,17,0,0,0,9,0,0,0, + 67,0,0,0,115,132,1,0,0,124,1,92,8,125,2,125, + 3,125,4,125,5,125,6,125,7,125,8,125,9,124,4,100, + 1,107,0,114,36,116,0,100,2,131,1,130,1,116,1,160, + 2,124,0,161,1,144,1,143,6,125,10,122,14,124,10,160, + 3,124,6,161,1,1,0,87,0,110,32,4,0,116,4,121, + 96,1,0,1,0,1,0,116,0,100,3,124,0,155,2,157, + 2,124,0,100,4,141,2,130,1,48,0,124,10,160,5,100, + 5,161,1,125,11,116,6,124,11,131,1,100,5,107,3,114, + 128,116,7,100,6,131,1,130,1,124,11,100,0,100,7,133, + 2,25,0,100,8,107,3,114,162,116,0,100,9,124,0,155, + 2,157,2,124,0,100,4,141,2,130,1,116,8,124,11,100, + 10,100,11,133,2,25,0,131,1,125,12,116,8,124,11,100, + 11,100,5,133,2,25,0,131,1,125,13,100,5,124,12,23, + 0,124,13,23,0,125,14,124,6,124,14,55,0,125,6,122, + 14,124,10,160,3,124,6,161,1,1,0,87,0,110,34,4, + 0,116,4,144,1,121,6,1,0,1,0,1,0,116,0,100, + 3,124,0,155,2,157,2,124,0,100,4,141,2,130,1,48, + 0,124,10,160,5,124,4,161,1,125,15,116,6,124,15,131, + 1,124,4,107,3,144,1,114,40,116,4,100,12,131,1,130, + 1,87,0,100,0,4,0,4,0,131,3,1,0,110,18,49, + 0,144,1,115,62,48,0,1,0,1,0,1,0,89,0,1, + 0,124,3,100,1,107,2,144,1,114,86,124,15,83,0,122, + 10,116,9,131,0,125,16,87,0,110,24,4,0,116,10,144, + 1,121,120,1,0,1,0,1,0,116,0,100,13,131,1,130, + 1,48,0,124,16,124,15,100,14,131,2,83,0,41,15,78, + 114,0,0,0,0,122,18,110,101,103,97,116,105,118,101,32, + 100,97,116,97,32,115,105,122,101,114,94,0,0,0,114,12, + 0,0,0,114,106,0,0,0,114,100,0,0,0,114,95,0, + 0,0,115,4,0,0,0,80,75,3,4,122,23,98,97,100, + 32,108,111,99,97,108,32,102,105,108,101,32,104,101,97,100, + 101,114,58,32,233,26,0,0,0,114,105,0,0,0,122,26, + 122,105,112,105,109,112,111,114,116,58,32,99,97,110,39,116, + 32,114,101,97,100,32,100,97,116,97,114,141,0,0,0,105, + 241,255,255,255,41,11,114,3,0,0,0,114,112,0,0,0, + 114,113,0,0,0,114,114,0,0,0,114,22,0,0,0,114, + 116,0,0,0,114,55,0,0,0,114,121,0,0,0,114,1, + 0,0,0,114,146,0,0,0,114,145,0,0,0,41,17,114, + 29,0,0,0,114,58,0,0,0,90,8,100,97,116,97,112, + 97,116,104,114,132,0,0,0,114,136,0,0,0,114,127,0, + 0,0,114,139,0,0,0,114,133,0,0,0,114,134,0,0, + 0,114,135,0,0,0,114,125,0,0,0,114,126,0,0,0, + 114,137,0,0,0,114,138,0,0,0,114,129,0,0,0,90, + 8,114,97,119,95,100,97,116,97,114,143,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,56,0, + 0,0,52,2,0,0,115,64,0,0,0,20,1,8,1,8, + 1,14,2,2,2,14,1,12,1,20,1,10,1,12,1,8, + 1,16,2,18,2,16,2,16,1,12,1,8,1,2,1,14, + 1,14,1,20,1,10,1,14,1,40,1,10,2,4,2,2, + 3,10,1,14,1,10,1,10,1,255,128,114,56,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,3,0,0,0,67,0,0,0,115,16,0,0,0,116,0, + 124,0,124,1,24,0,131,1,100,1,107,1,83,0,41,2, + 78,114,5,0,0,0,41,1,218,3,97,98,115,41,2,90, + 2,116,49,90,2,116,50,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,9,95,101,113,95,109,116,105,109, + 101,98,2,0,0,115,4,0,0,0,16,2,255,128,114,149, + 0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,0, + 14,0,0,0,8,0,0,0,67,0,0,0,115,60,1,0, + 0,124,3,124,2,100,1,156,2,125,5,122,18,116,0,160, + 1,124,4,124,3,124,5,161,3,125,6,87,0,110,20,4, + 0,116,2,121,48,1,0,1,0,1,0,89,0,100,0,83, + 0,48,0,124,6,100,2,64,0,100,3,107,3,125,7,124, + 7,114,182,124,6,100,4,64,0,100,3,107,3,125,8,116, + 3,106,4,100,5,107,3,144,1,114,10,124,8,115,106,116, + 3,106,4,100,6,107,2,144,1,114,10,116,5,124,0,124, + 2,131,2,125,9,124,9,100,0,117,1,144,1,114,10,116, + 3,160,6,116,0,106,7,124,9,161,2,125,10,122,20,116, + 0,160,8,124,4,124,10,124,3,124,5,161,4,1,0,87, + 0,110,104,4,0,116,2,121,180,1,0,1,0,1,0,89, + 0,100,0,83,0,48,0,116,9,124,0,124,2,131,2,92, + 2,125,11,125,12,124,11,144,1,114,10,116,10,116,11,124, + 4,100,7,100,8,133,2,25,0,131,1,124,11,131,2,114, + 246,116,11,124,4,100,8,100,9,133,2,25,0,131,1,124, + 12,107,3,144,1,114,10,116,12,160,13,100,10,124,3,155, + 2,157,2,161,1,1,0,100,0,83,0,116,14,160,15,124, + 4,100,9,100,0,133,2,25,0,161,1,125,13,116,16,124, + 13,116,17,131,2,144,1,115,56,116,18,100,11,124,1,155, + 2,100,12,157,3,131,1,130,1,124,13,83,0,41,13,78, + 41,2,114,44,0,0,0,114,13,0,0,0,114,5,0,0, + 0,114,0,0,0,0,114,88,0,0,0,90,5,110,101,118, + 101,114,90,6,97,108,119,97,121,115,114,101,0,0,0,114, + 96,0,0,0,114,97,0,0,0,122,22,98,121,116,101,99, + 111,100,101,32,105,115,32,115,116,97,108,101,32,102,111,114, + 32,122,16,99,111,109,112,105,108,101,100,32,109,111,100,117, + 108,101,32,122,21,32,105,115,32,110,111,116,32,97,32,99, + 111,100,101,32,111,98,106,101,99,116,41,19,114,21,0,0, + 0,90,13,95,99,108,97,115,115,105,102,121,95,112,121,99, + 114,79,0,0,0,218,4,95,105,109,112,90,21,99,104,101, + 99,107,95,104,97,115,104,95,98,97,115,101,100,95,112,121, + 99,115,218,15,95,103,101,116,95,112,121,99,95,115,111,117, + 114,99,101,218,11,115,111,117,114,99,101,95,104,97,115,104, + 90,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, + 66,69,82,90,18,95,118,97,108,105,100,97,116,101,95,104, + 97,115,104,95,112,121,99,218,29,95,103,101,116,95,109,116, + 105,109,101,95,97,110,100,95,115,105,122,101,95,111,102,95, + 115,111,117,114,99,101,114,149,0,0,0,114,2,0,0,0, + 114,45,0,0,0,114,80,0,0,0,218,7,109,97,114,115, + 104,97,108,90,5,108,111,97,100,115,114,15,0,0,0,218, + 10,95,99,111,100,101,95,116,121,112,101,218,9,84,121,112, + 101,69,114,114,111,114,41,14,114,32,0,0,0,114,57,0, + 0,0,114,66,0,0,0,114,38,0,0,0,114,128,0,0, + 0,90,11,101,120,99,95,100,101,116,97,105,108,115,114,131, + 0,0,0,90,10,104,97,115,104,95,98,97,115,101,100,90, + 12,99,104,101,99,107,95,115,111,117,114,99,101,90,12,115, + 111,117,114,99,101,95,98,121,116,101,115,114,152,0,0,0, + 90,12,115,111,117,114,99,101,95,109,116,105,109,101,90,11, + 115,111,117,114,99,101,95,115,105,122,101,114,50,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 15,95,117,110,109,97,114,115,104,97,108,95,99,111,100,101, + 108,2,0,0,115,84,0,0,0,2,2,2,1,6,254,2, + 5,18,1,12,1,8,1,12,2,4,1,12,1,12,1,2, + 1,2,255,8,1,4,255,10,2,10,1,4,1,4,1,2, + 1,4,254,2,5,4,1,8,1,8,255,12,2,8,1,8, + 3,6,255,6,3,22,3,18,1,4,255,4,2,8,1,4, + 255,4,2,18,2,12,1,16,1,4,1,255,128,114,157,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,4,0,0,0,67,0,0,0,115,28,0,0,0, + 124,0,160,0,100,1,100,2,161,2,125,0,124,0,160,0, + 100,3,100,2,161,2,125,0,124,0,83,0,41,4,78,115, + 2,0,0,0,13,10,243,1,0,0,0,10,243,1,0,0, + 0,13,41,1,114,19,0,0,0,41,1,218,6,115,111,117, + 114,99,101,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,23,95,110,111,114,109,97,108,105,122,101,95,108, + 105,110,101,95,101,110,100,105,110,103,115,159,2,0,0,115, + 8,0,0,0,12,1,12,1,4,1,255,128,114,161,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,6,0,0,0,67,0,0,0,115,24,0,0,0,116, + 0,124,1,131,1,125,1,116,1,124,1,124,0,100,1,100, + 2,100,3,141,4,83,0,41,4,78,114,78,0,0,0,84, + 41,1,90,12,100,111,110,116,95,105,110,104,101,114,105,116, + 41,2,114,161,0,0,0,218,7,99,111,109,112,105,108,101, + 41,2,114,57,0,0,0,114,160,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,15,95,99,111, + 109,112,105,108,101,95,115,111,117,114,99,101,166,2,0,0, + 115,6,0,0,0,8,1,16,1,255,128,114,163,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,11,0,0,0,67,0,0,0,115,68,0,0,0,116,0, + 160,1,124,0,100,1,63,0,100,2,23,0,124,0,100,3, + 63,0,100,4,64,0,124,0,100,5,64,0,124,1,100,6, + 63,0,124,1,100,3,63,0,100,7,64,0,124,1,100,5, + 64,0,100,8,20,0,100,9,100,9,100,9,102,9,161,1, + 83,0,41,10,78,233,9,0,0,0,105,188,7,0,0,233, + 5,0,0,0,233,15,0,0,0,233,31,0,0,0,233,11, + 0,0,0,233,63,0,0,0,114,88,0,0,0,114,14,0, + 0,0,41,2,114,133,0,0,0,90,6,109,107,116,105,109, + 101,41,2,218,1,100,114,140,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,14,95,112,97,114, + 115,101,95,100,111,115,116,105,109,101,172,2,0,0,115,20, + 0,0,0,4,1,10,1,10,1,6,1,6,1,10,1,10, + 1,6,1,6,249,255,128,114,171,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,10,0,0, + 0,67,0,0,0,115,110,0,0,0,122,82,124,1,100,1, + 100,0,133,2,25,0,100,2,118,0,115,22,74,0,130,1, + 124,1,100,0,100,1,133,2,25,0,125,1,124,0,106,0, + 124,1,25,0,125,2,124,2,100,3,25,0,125,3,124,2, + 100,4,25,0,125,4,124,2,100,5,25,0,125,5,116,1, + 124,4,124,3,131,2,124,5,102,2,87,0,83,0,4,0, + 116,2,116,3,116,4,102,3,121,108,1,0,1,0,1,0, + 89,0,100,6,83,0,48,0,41,7,78,114,14,0,0,0, + 169,2,218,1,99,218,1,111,114,165,0,0,0,233,6,0, + 0,0,233,3,0,0,0,41,2,114,0,0,0,0,114,0, + 0,0,0,41,5,114,28,0,0,0,114,171,0,0,0,114, + 26,0,0,0,218,10,73,110,100,101,120,69,114,114,111,114, + 114,156,0,0,0,41,6,114,32,0,0,0,114,13,0,0, + 0,114,58,0,0,0,114,133,0,0,0,114,134,0,0,0, + 90,17,117,110,99,111,109,112,114,101,115,115,101,100,95,115, + 105,122,101,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,153,0,0,0,185,2,0,0,115,22,0,0,0, + 2,1,20,2,12,1,10,1,8,3,8,1,8,1,16,1, + 18,1,8,1,255,128,114,153,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0, + 67,0,0,0,115,80,0,0,0,124,1,100,1,100,0,133, + 2,25,0,100,2,118,0,115,20,74,0,130,1,124,1,100, + 0,100,1,133,2,25,0,125,1,122,14,124,0,106,0,124, + 1,25,0,125,2,87,0,110,20,4,0,116,1,121,66,1, + 0,1,0,1,0,89,0,100,0,83,0,48,0,116,2,124, + 0,106,3,124,2,131,2,83,0,41,3,78,114,14,0,0, + 0,114,172,0,0,0,41,4,114,28,0,0,0,114,26,0, + 0,0,114,56,0,0,0,114,29,0,0,0,41,3,114,32, + 0,0,0,114,13,0,0,0,114,58,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,151,0,0, + 0,204,2,0,0,115,16,0,0,0,20,2,12,1,2,2, + 14,1,12,1,8,1,12,2,255,128,114,151,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0, + 9,0,0,0,67,0,0,0,115,190,0,0,0,116,0,124, + 0,124,1,131,2,125,2,116,1,68,0,93,156,92,3,125, + 3,125,4,125,5,124,2,124,3,23,0,125,6,116,2,106, + 3,100,1,124,0,106,4,116,5,124,6,100,2,100,3,141, + 5,1,0,122,14,124,0,106,6,124,6,25,0,125,7,87, + 0,110,18,4,0,116,7,121,86,1,0,1,0,1,0,89, + 0,113,14,48,0,124,7,100,4,25,0,125,8,116,8,124, + 0,106,4,124,7,131,2,125,9,124,4,114,130,116,9,124, + 0,124,8,124,6,124,1,124,9,131,5,125,10,110,10,116, + 10,124,8,124,9,131,2,125,10,124,10,100,0,117,0,114, + 150,113,14,124,7,100,4,25,0,125,8,124,10,124,5,124, + 8,102,3,2,0,1,0,83,0,116,11,100,5,124,1,155, + 2,157,2,124,1,100,6,141,2,130,1,41,7,78,122,13, + 116,114,121,105,110,103,32,123,125,123,125,123,125,114,88,0, + 0,0,41,1,90,9,118,101,114,98,111,115,105,116,121,114, + 0,0,0,0,114,61,0,0,0,114,62,0,0,0,41,12, + 114,36,0,0,0,114,91,0,0,0,114,45,0,0,0,114, + 80,0,0,0,114,29,0,0,0,114,20,0,0,0,114,28, + 0,0,0,114,26,0,0,0,114,56,0,0,0,114,157,0, + 0,0,114,163,0,0,0,114,3,0,0,0,41,11,114,32, + 0,0,0,114,38,0,0,0,114,13,0,0,0,114,92,0, + 0,0,114,93,0,0,0,114,51,0,0,0,114,66,0,0, + 0,114,58,0,0,0,114,40,0,0,0,114,128,0,0,0, + 114,50,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,48,0,0,0,219,2,0,0,115,38,0, + 0,0,10,1,14,1,8,1,22,1,2,1,14,1,12,1, + 6,1,8,2,12,1,4,1,18,1,10,2,8,1,2,3, + 8,1,14,1,18,2,255,128,114,48,0,0,0,41,46,114, + 86,0,0,0,90,26,95,102,114,111,122,101,110,95,105,109, + 112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108, + 114,21,0,0,0,114,1,0,0,0,114,2,0,0,0,90, + 17,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, + 105,98,114,45,0,0,0,114,150,0,0,0,114,112,0,0, + 0,114,154,0,0,0,114,71,0,0,0,114,133,0,0,0, + 114,69,0,0,0,90,7,95,95,97,108,108,95,95,114,20, + 0,0,0,90,15,112,97,116,104,95,115,101,112,97,114,97, + 116,111,114,115,114,18,0,0,0,114,79,0,0,0,114,3, + 0,0,0,114,25,0,0,0,218,4,116,121,112,101,114,74, + 0,0,0,114,115,0,0,0,114,117,0,0,0,114,119,0, + 0,0,90,13,95,76,111,97,100,101,114,66,97,115,105,99, + 115,114,4,0,0,0,114,91,0,0,0,114,36,0,0,0, + 114,37,0,0,0,114,35,0,0,0,114,27,0,0,0,114, + 124,0,0,0,114,144,0,0,0,114,146,0,0,0,114,56, + 0,0,0,114,149,0,0,0,114,157,0,0,0,218,8,95, + 95,99,111,100,101,95,95,114,155,0,0,0,114,161,0,0, + 0,114,163,0,0,0,114,171,0,0,0,114,153,0,0,0, + 114,151,0,0,0,114,48,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, + 60,109,111,100,117,108,101,62,1,0,0,0,115,92,0,0, + 0,4,0,8,16,16,1,8,1,8,1,8,1,8,1,8, + 1,8,1,8,1,8,2,6,3,14,1,16,3,4,4,8, + 2,4,2,4,1,4,1,18,2,0,127,0,127,12,33,12, + 1,2,1,2,1,4,252,8,9,8,4,8,9,8,31,2, + 126,2,254,4,29,8,5,8,21,8,46,8,10,10,46,8, + 5,8,7,8,6,8,13,8,19,12,15,255,128, }; From cf95c04b66e62218fb769f6096f6dbf2a7673ca1 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Mon, 14 Dec 2020 11:28:39 +0000 Subject: [PATCH 0771/1261] bpo-42635: Mark JUMP_ABSOLUTE at end of 'for' loop as artificial to avoid spurious line events. (GH-23761) --- Lib/test/test_sys_settrace.py | 26 + Python/compile.c | 2 + Python/importlib.h | 3512 ++++++++++++++-------------- Python/importlib_external.h | 4022 ++++++++++++++++----------------- 4 files changed, 3795 insertions(+), 3767 deletions(-) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index f257809021fcf4..37013e51c94b11 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -646,6 +646,32 @@ def func(): (6, 'line'), (6, 'return')]) + def test_nested_loops(self): + + def func(): + for i in range(2): + for j in range(2): + a = i + j + return a == 1 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (2, 'line'), + (3, 'line'), + (2, 'line'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (2, 'line'), + (3, 'line'), + (2, 'line'), + (1, 'line'), + (4, 'line'), + (4, 'return')]) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Python/compile.c b/Python/compile.c index 241e8ffd123764..c7a0ae402bf234 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2773,6 +2773,8 @@ compiler_for(struct compiler *c, stmt_ty s) compiler_use_next_block(c, body); VISIT(c, expr, s->v.For.target); VISIT_SEQ(c, stmt, s->v.For.body); + /* Mark jump as artificial */ + c->u->u_lineno = -1; ADDOP_JUMP(c, JUMP_ABSOLUTE, start); compiler_use_next_block(c, cleanup); diff --git a/Python/importlib.h b/Python/importlib.h index 3d076c757fe6dc..fce7d863db7b73 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -81,1774 +81,1774 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 100,105,99,116,95,95,218,6,117,112,100,97,116,101,41,3, 90,3,110,101,119,90,3,111,108,100,218,7,114,101,112,108, 97,99,101,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,5,95,119,114,97,112,40,0,0,0,115,10,0, - 0,0,8,2,10,1,20,1,18,1,255,128,114,17,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,116, - 0,116,1,131,1,124,0,131,1,83,0,114,0,0,0,0, - 41,2,114,3,0,0,0,218,3,115,121,115,169,1,218,4, - 110,97,109,101,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,11,95,110,101,119,95,109,111,100,117,108,101, - 48,0,0,0,115,4,0,0,0,12,1,255,128,114,21,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,64,0,0,0,115,12,0,0,0, - 101,0,90,1,100,0,90,2,100,1,83,0,41,2,218,14, - 95,68,101,97,100,108,111,99,107,69,114,114,111,114,78,41, - 3,114,9,0,0,0,114,8,0,0,0,114,1,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,22,0,0,0,61,0,0,0,115,6,0, - 0,0,8,0,4,1,255,128,114,22,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,64,0,0,0,115,56,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,100, - 8,100,9,132,0,90,7,100,10,100,11,132,0,90,8,100, - 12,83,0,41,13,218,11,95,77,111,100,117,108,101,76,111, - 99,107,122,169,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,0,0,0,0,2,0,0,0,2,0, - 0,0,67,0,0,0,115,48,0,0,0,116,0,160,1,161, - 0,124,0,95,2,116,0,160,1,161,0,124,0,95,3,124, - 1,124,0,95,4,100,0,124,0,95,5,100,1,124,0,95, - 6,100,1,124,0,95,7,100,0,83,0,169,2,78,233,0, - 0,0,0,41,8,218,7,95,116,104,114,101,97,100,90,13, - 97,108,108,111,99,97,116,101,95,108,111,99,107,218,4,108, - 111,99,107,218,6,119,97,107,101,117,112,114,20,0,0,0, - 218,5,111,119,110,101,114,218,5,99,111,117,110,116,218,7, - 119,97,105,116,101,114,115,169,2,218,4,115,101,108,102,114, - 20,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,8,95,95,105,110,105,116,95,95,71,0,0, - 0,115,14,0,0,0,10,1,10,1,6,1,6,1,6,1, - 10,1,255,128,122,20,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,0,0,0,0,5,0,0,0,3,0,0,0,67, - 0,0,0,115,84,0,0,0,116,0,160,1,161,0,125,1, - 124,0,106,2,125,2,116,3,131,0,125,3,116,4,160,5, - 124,2,161,1,125,4,124,4,100,0,117,0,114,42,100,1, - 83,0,124,4,106,2,125,2,124,2,124,1,107,2,114,60, - 100,2,83,0,124,2,124,3,118,0,114,72,100,1,83,0, - 124,3,160,6,124,2,161,1,1,0,113,20,41,3,78,70, - 84,41,7,114,26,0,0,0,218,9,103,101,116,95,105,100, - 101,110,116,114,29,0,0,0,218,3,115,101,116,218,12,95, - 98,108,111,99,107,105,110,103,95,111,110,218,3,103,101,116, - 218,3,97,100,100,41,5,114,33,0,0,0,90,2,109,101, - 218,3,116,105,100,90,4,115,101,101,110,114,27,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 12,104,97,115,95,100,101,97,100,108,111,99,107,79,0,0, - 0,115,26,0,0,0,8,2,6,1,6,1,10,2,8,1, - 4,1,6,1,8,1,4,1,8,1,4,6,12,1,255,128, - 122,24,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,0,0,0,0,2,0,0,0,8,0,0,0,67, - 0,0,0,115,196,0,0,0,116,0,160,1,161,0,125,1, - 124,0,116,2,124,1,60,0,122,170,124,0,106,3,143,126, - 1,0,124,0,106,4,100,1,107,2,115,46,124,0,106,5, - 124,1,107,2,114,90,124,1,124,0,95,5,124,0,4,0, - 106,4,100,2,55,0,2,0,95,4,87,0,100,3,4,0, - 4,0,131,3,1,0,87,0,116,2,124,1,61,0,100,4, - 83,0,124,0,160,6,161,0,114,110,116,7,100,5,124,0, - 22,0,131,1,130,1,124,0,106,8,160,9,100,6,161,1, - 114,136,124,0,4,0,106,10,100,2,55,0,2,0,95,10, - 87,0,100,3,4,0,4,0,131,3,1,0,110,16,49,0, - 115,156,48,0,1,0,1,0,1,0,89,0,1,0,124,0, - 106,8,160,9,161,0,1,0,124,0,106,8,160,11,161,0, - 1,0,113,18,116,2,124,1,61,0,48,0,41,7,122,185, - 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,114,25,0,0,0,233,1, - 0,0,0,78,84,122,23,100,101,97,100,108,111,99,107,32, - 100,101,116,101,99,116,101,100,32,98,121,32,37,114,70,41, - 12,114,26,0,0,0,114,35,0,0,0,114,37,0,0,0, - 114,27,0,0,0,114,30,0,0,0,114,29,0,0,0,114, - 41,0,0,0,114,22,0,0,0,114,28,0,0,0,218,7, - 97,99,113,117,105,114,101,114,31,0,0,0,218,7,114,101, - 108,101,97,115,101,169,2,114,33,0,0,0,114,40,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,43,0,0,0,100,0,0,0,115,36,0,0,0,8,6, - 8,1,2,1,8,2,20,1,6,1,14,1,14,1,6,9, - 4,247,8,1,12,1,12,1,44,1,10,2,12,1,8,2, - 255,128,122,19,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, - 0,0,0,0,2,0,0,0,8,0,0,0,67,0,0,0, - 115,144,0,0,0,116,0,160,1,161,0,125,1,124,0,106, - 2,143,110,1,0,124,0,106,3,124,1,107,3,114,34,116, - 4,100,1,131,1,130,1,124,0,106,5,100,2,107,4,115, - 48,74,0,130,1,124,0,4,0,106,5,100,3,56,0,2, - 0,95,5,124,0,106,5,100,2,107,2,114,108,100,0,124, - 0,95,3,124,0,106,6,114,108,124,0,4,0,106,6,100, - 3,56,0,2,0,95,6,124,0,106,7,160,8,161,0,1, - 0,87,0,100,0,4,0,4,0,131,3,1,0,100,0,83, - 0,49,0,115,130,48,0,1,0,1,0,1,0,89,0,1, - 0,100,0,83,0,41,4,78,250,31,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,114,25,0,0,0,114,42, - 0,0,0,41,9,114,26,0,0,0,114,35,0,0,0,114, - 27,0,0,0,114,29,0,0,0,218,12,82,117,110,116,105, - 109,101,69,114,114,111,114,114,30,0,0,0,114,31,0,0, - 0,114,28,0,0,0,114,44,0,0,0,114,45,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 44,0,0,0,125,0,0,0,115,24,0,0,0,8,1,8, - 1,10,1,8,1,14,1,14,1,10,1,6,1,6,1,14, - 1,46,1,255,128,122,19,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,0,0,0,0,1,0,0,0,5,0,0,0,67, - 0,0,0,115,18,0,0,0,100,1,160,0,124,0,106,1, - 116,2,124,0,131,1,161,2,83,0,41,2,78,122,23,95, - 77,111,100,117,108,101,76,111,99,107,40,123,33,114,125,41, - 32,97,116,32,123,125,169,3,218,6,102,111,114,109,97,116, - 114,20,0,0,0,218,2,105,100,169,1,114,33,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 8,95,95,114,101,112,114,95,95,138,0,0,0,115,4,0, - 0,0,18,1,255,128,122,20,95,77,111,100,117,108,101,76, - 111,99,107,46,95,95,114,101,112,114,95,95,78,41,9,114, - 9,0,0,0,114,8,0,0,0,114,1,0,0,0,114,10, - 0,0,0,114,34,0,0,0,114,41,0,0,0,114,43,0, - 0,0,114,44,0,0,0,114,52,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,23,0,0,0,65,0,0,0,115,16,0,0,0,8,0, - 4,1,8,5,8,8,8,21,8,25,12,13,255,128,114,23, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,64,0,0,0,115,48,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, - 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100, - 7,132,0,90,6,100,8,100,9,132,0,90,7,100,10,83, - 0,41,11,218,16,95,68,117,109,109,121,77,111,100,117,108, - 101,76,111,99,107,122,86,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,0,0,0,0,2,0,0,0,2,0, - 0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,95, - 0,100,1,124,0,95,1,100,0,83,0,114,24,0,0,0, - 41,2,114,20,0,0,0,114,30,0,0,0,114,32,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,34,0,0,0,146,0,0,0,115,6,0,0,0,6,1, - 10,1,255,128,122,25,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,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,18,0,0,0,124,0,4, - 0,106,0,100,1,55,0,2,0,95,0,100,2,83,0,41, - 3,78,114,42,0,0,0,84,41,1,114,30,0,0,0,114, - 51,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,43,0,0,0,150,0,0,0,115,6,0,0, - 0,14,1,4,1,255,128,122,24,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,0,0,0,0,1,0, - 0,0,3,0,0,0,67,0,0,0,115,36,0,0,0,124, - 0,106,0,100,1,107,2,114,18,116,1,100,2,131,1,130, - 1,124,0,4,0,106,0,100,3,56,0,2,0,95,0,100, - 0,83,0,41,4,78,114,25,0,0,0,114,46,0,0,0, - 114,42,0,0,0,41,2,114,30,0,0,0,114,47,0,0, - 0,114,51,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,44,0,0,0,154,0,0,0,115,8, - 0,0,0,10,1,8,1,18,1,255,128,122,24,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,0,0, - 0,0,1,0,0,0,5,0,0,0,67,0,0,0,115,18, - 0,0,0,100,1,160,0,124,0,106,1,116,2,124,0,131, - 1,161,2,83,0,41,2,78,122,28,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,114,48,0,0,0,114,51,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 52,0,0,0,159,0,0,0,115,4,0,0,0,18,1,255, - 128,122,25,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,41,8,114, - 9,0,0,0,114,8,0,0,0,114,1,0,0,0,114,10, - 0,0,0,114,34,0,0,0,114,43,0,0,0,114,44,0, - 0,0,114,52,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,53,0,0,0, - 142,0,0,0,115,14,0,0,0,8,0,4,1,8,3,8, - 4,8,4,12,5,255,128,114,53,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,64,0,0,0,115,36,0,0,0,101,0,90,1,100,0, - 90,2,100,1,100,2,132,0,90,3,100,3,100,4,132,0, - 90,4,100,5,100,6,132,0,90,5,100,7,83,0,41,8, - 218,18,95,77,111,100,117,108,101,76,111,99,107,77,97,110, - 97,103,101,114,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,2,0,0,0,67,0,0,0,115,16,0, - 0,0,124,1,124,0,95,0,100,0,124,0,95,1,100,0, - 83,0,114,0,0,0,0,41,2,218,5,95,110,97,109,101, - 218,5,95,108,111,99,107,114,32,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,34,0,0,0, - 165,0,0,0,115,6,0,0,0,6,1,10,1,255,128,122, - 27,95,77,111,100,117,108,101,76,111,99,107,77,97,110,97, - 103,101,114,46,95,95,105,110,105,116,95,95,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, - 0,67,0,0,0,115,26,0,0,0,116,0,124,0,106,1, - 131,1,124,0,95,2,124,0,106,2,160,3,161,0,1,0, - 100,0,83,0,114,0,0,0,0,41,4,218,16,95,103,101, - 116,95,109,111,100,117,108,101,95,108,111,99,107,114,55,0, - 0,0,114,56,0,0,0,114,43,0,0,0,114,51,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,9,95,95,101,110,116,101,114,95,95,169,0,0,0,115, - 6,0,0,0,12,1,14,1,255,128,122,28,95,77,111,100, - 117,108,101,76,111,99,107,77,97,110,97,103,101,114,46,95, - 95,101,110,116,101,114,95,95,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,2,0,0,0,79,0,0, - 0,115,14,0,0,0,124,0,106,0,160,1,161,0,1,0, - 100,0,83,0,114,0,0,0,0,41,2,114,56,0,0,0, - 114,44,0,0,0,41,3,114,33,0,0,0,218,4,97,114, - 103,115,90,6,107,119,97,114,103,115,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,8,95,95,101,120,105, - 116,95,95,173,0,0,0,115,4,0,0,0,14,1,255,128, - 122,27,95,77,111,100,117,108,101,76,111,99,107,77,97,110, - 97,103,101,114,46,95,95,101,120,105,116,95,95,78,41,6, - 114,9,0,0,0,114,8,0,0,0,114,1,0,0,0,114, - 34,0,0,0,114,58,0,0,0,114,60,0,0,0,114,5, + 0,0,218,5,95,119,114,97,112,40,0,0,0,115,12,0, + 0,0,8,2,10,1,18,1,2,128,18,1,255,128,114,17, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,2,0,0,0,67,0,0,0,115,12,0,0, + 0,116,0,116,1,131,1,124,0,131,1,83,0,114,0,0, + 0,0,41,2,114,3,0,0,0,218,3,115,121,115,169,1, + 218,4,110,97,109,101,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,11,95,110,101,119,95,109,111,100,117, + 108,101,48,0,0,0,115,4,0,0,0,12,1,255,128,114, + 21,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,64,0,0,0,115,12,0, + 0,0,101,0,90,1,100,0,90,2,100,1,83,0,41,2, + 218,14,95,68,101,97,100,108,111,99,107,69,114,114,111,114, + 78,41,3,114,9,0,0,0,114,8,0,0,0,114,1,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,22,0,0,0,61,0,0,0,115, + 6,0,0,0,8,0,4,1,255,128,114,22,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,64,0,0,0,115,56,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, + 4,100,4,100,5,132,0,90,5,100,6,100,7,132,0,90, + 6,100,8,100,9,132,0,90,7,100,10,100,11,132,0,90, + 8,100,12,83,0,41,13,218,11,95,77,111,100,117,108,101, + 76,111,99,107,122,169,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,0,0,0,0,2,0,0,0, + 2,0,0,0,67,0,0,0,115,48,0,0,0,116,0,160, + 1,161,0,124,0,95,2,116,0,160,1,161,0,124,0,95, + 3,124,1,124,0,95,4,100,0,124,0,95,5,100,1,124, + 0,95,6,100,1,124,0,95,7,100,0,83,0,169,2,78, + 233,0,0,0,0,41,8,218,7,95,116,104,114,101,97,100, + 90,13,97,108,108,111,99,97,116,101,95,108,111,99,107,218, + 4,108,111,99,107,218,6,119,97,107,101,117,112,114,20,0, + 0,0,218,5,111,119,110,101,114,218,5,99,111,117,110,116, + 218,7,119,97,105,116,101,114,115,169,2,218,4,115,101,108, + 102,114,20,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,8,95,95,105,110,105,116,95,95,71, + 0,0,0,115,14,0,0,0,10,1,10,1,6,1,6,1, + 6,1,10,1,255,128,122,20,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,0,0,0,0,5,0,0,0,3,0,0, + 0,67,0,0,0,115,84,0,0,0,116,0,160,1,161,0, + 125,1,124,0,106,2,125,2,116,3,131,0,125,3,116,4, + 160,5,124,2,161,1,125,4,124,4,100,0,117,0,114,42, + 100,1,83,0,124,4,106,2,125,2,124,2,124,1,107,2, + 114,60,100,2,83,0,124,2,124,3,118,0,114,72,100,1, + 83,0,124,3,160,6,124,2,161,1,1,0,113,20,41,3, + 78,70,84,41,7,114,26,0,0,0,218,9,103,101,116,95, + 105,100,101,110,116,114,29,0,0,0,218,3,115,101,116,218, + 12,95,98,108,111,99,107,105,110,103,95,111,110,218,3,103, + 101,116,218,3,97,100,100,41,5,114,33,0,0,0,90,2, + 109,101,218,3,116,105,100,90,4,115,101,101,110,114,27,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,12,104,97,115,95,100,101,97,100,108,111,99,107,79, + 0,0,0,115,26,0,0,0,8,2,6,1,6,1,10,2, + 8,1,4,1,6,1,8,1,4,1,8,1,4,6,12,1, + 255,128,122,24,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,0,0,0,0,2,0,0,0,8,0,0, + 0,67,0,0,0,115,196,0,0,0,116,0,160,1,161,0, + 125,1,124,0,116,2,124,1,60,0,122,170,124,0,106,3, + 143,126,1,0,124,0,106,4,100,1,107,2,115,46,124,0, + 106,5,124,1,107,2,114,90,124,1,124,0,95,5,124,0, + 4,0,106,4,100,2,55,0,2,0,95,4,87,0,100,3, + 4,0,4,0,131,3,1,0,87,0,116,2,124,1,61,0, + 100,4,83,0,124,0,160,6,161,0,114,110,116,7,100,5, + 124,0,22,0,131,1,130,1,124,0,106,8,160,9,100,6, + 161,1,114,136,124,0,4,0,106,10,100,2,55,0,2,0, + 95,10,87,0,100,3,4,0,4,0,131,3,1,0,110,16, + 49,0,115,156,48,0,1,0,1,0,1,0,89,0,1,0, + 124,0,106,8,160,9,161,0,1,0,124,0,106,8,160,11, + 161,0,1,0,113,18,116,2,124,1,61,0,48,0,41,7, + 122,185,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,114,25,0,0,0, + 233,1,0,0,0,78,84,122,23,100,101,97,100,108,111,99, + 107,32,100,101,116,101,99,116,101,100,32,98,121,32,37,114, + 70,41,12,114,26,0,0,0,114,35,0,0,0,114,37,0, + 0,0,114,27,0,0,0,114,30,0,0,0,114,29,0,0, + 0,114,41,0,0,0,114,22,0,0,0,114,28,0,0,0, + 218,7,97,99,113,117,105,114,101,114,31,0,0,0,218,7, + 114,101,108,101,97,115,101,169,2,114,33,0,0,0,114,40, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,54,0,0,0,163,0,0,0,115,10,0,0,0, - 8,0,8,2,8,4,12,4,255,128,114,54,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 8,0,0,0,67,0,0,0,115,134,0,0,0,116,0,160, - 1,161,0,1,0,122,114,122,14,116,2,124,0,25,0,131, - 0,125,1,87,0,110,22,4,0,116,3,121,46,1,0,1, - 0,1,0,100,1,125,1,89,0,110,2,48,0,124,1,100, - 1,117,0,114,110,116,4,100,1,117,0,114,74,116,5,124, - 0,131,1,125,1,110,8,116,6,124,0,131,1,125,1,124, - 0,102,1,100,2,100,3,132,1,125,2,116,7,160,8,124, - 1,124,2,161,2,116,2,124,0,60,0,87,0,116,0,160, - 9,161,0,1,0,124,1,83,0,116,0,160,9,161,0,1, - 0,48,0,41,4,122,139,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,65,99,113,117,105,114,101,47,114,101,108,101,97, - 115,101,32,105,110,116,101,114,110,97,108,108,121,32,116,104, - 101,32,103,108,111,98,97,108,32,105,109,112,111,114,116,32, - 108,111,99,107,32,116,111,32,112,114,111,116,101,99,116,10, - 32,32,32,32,95,109,111,100,117,108,101,95,108,111,99,107, - 115,46,78,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,8,0,0,0,83,0,0,0,115,54,0,0, - 0,116,0,160,1,161,0,1,0,122,34,116,2,160,3,124, - 1,161,1,124,0,117,0,114,30,116,2,124,1,61,0,87, - 0,116,0,160,4,161,0,1,0,100,0,83,0,116,0,160, - 4,161,0,1,0,48,0,114,0,0,0,0,41,5,218,4, - 95,105,109,112,218,12,97,99,113,117,105,114,101,95,108,111, - 99,107,218,13,95,109,111,100,117,108,101,95,108,111,99,107, - 115,114,38,0,0,0,218,12,114,101,108,101,97,115,101,95, - 108,111,99,107,41,2,218,3,114,101,102,114,20,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 2,99,98,198,0,0,0,115,14,0,0,0,8,1,2,1, - 14,4,6,1,2,128,22,2,255,128,122,28,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,41,10,114,61,0,0,0,114, - 62,0,0,0,114,63,0,0,0,218,8,75,101,121,69,114, - 114,111,114,114,26,0,0,0,114,53,0,0,0,114,23,0, - 0,0,218,8,95,119,101,97,107,114,101,102,114,65,0,0, - 0,114,64,0,0,0,41,3,114,20,0,0,0,114,27,0, - 0,0,114,66,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,57,0,0,0,179,0,0,0,115, - 34,0,0,0,8,6,2,1,2,1,14,1,12,1,10,1, - 8,2,8,1,10,1,8,2,12,2,16,11,2,128,8,2, - 4,2,10,254,255,128,114,57,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,8,0,0,0, - 67,0,0,0,115,54,0,0,0,116,0,124,0,131,1,125, - 1,122,12,124,1,160,1,161,0,1,0,87,0,110,20,4, - 0,116,2,121,40,1,0,1,0,1,0,89,0,100,1,83, - 0,48,0,124,1,160,3,161,0,1,0,100,1,83,0,41, - 2,122,189,65,99,113,117,105,114,101,115,32,116,104,101,110, - 32,114,101,108,101,97,115,101,115,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,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,32,32,32,32, - 78,41,4,114,57,0,0,0,114,43,0,0,0,114,22,0, - 0,0,114,44,0,0,0,41,2,114,20,0,0,0,114,27, + 0,0,114,43,0,0,0,100,0,0,0,115,36,0,0,0, + 8,6,8,1,2,1,8,2,20,1,6,1,14,1,14,1, + 6,9,4,247,8,1,12,1,12,1,44,1,10,2,12,1, + 8,2,255,128,122,19,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,0,0,0,0,2,0,0,0,8,0,0,0,67,0, + 0,0,115,144,0,0,0,116,0,160,1,161,0,125,1,124, + 0,106,2,143,110,1,0,124,0,106,3,124,1,107,3,114, + 34,116,4,100,1,131,1,130,1,124,0,106,5,100,2,107, + 4,115,48,74,0,130,1,124,0,4,0,106,5,100,3,56, + 0,2,0,95,5,124,0,106,5,100,2,107,2,114,108,100, + 0,124,0,95,3,124,0,106,6,114,108,124,0,4,0,106, + 6,100,3,56,0,2,0,95,6,124,0,106,7,160,8,161, + 0,1,0,87,0,100,0,4,0,4,0,131,3,1,0,100, + 0,83,0,49,0,115,130,48,0,1,0,1,0,1,0,89, + 0,1,0,100,0,83,0,41,4,78,250,31,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,114,25,0,0,0, + 114,42,0,0,0,41,9,114,26,0,0,0,114,35,0,0, + 0,114,27,0,0,0,114,29,0,0,0,218,12,82,117,110, + 116,105,109,101,69,114,114,111,114,114,30,0,0,0,114,31, + 0,0,0,114,28,0,0,0,114,44,0,0,0,114,45,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,44,0,0,0,125,0,0,0,115,24,0,0,0,8, + 1,8,1,10,1,8,1,14,1,14,1,10,1,6,1,6, + 1,14,1,46,1,255,128,122,19,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,0,0,0,0,1,0,0,0,5,0,0, + 0,67,0,0,0,115,18,0,0,0,100,1,160,0,124,0, + 106,1,116,2,124,0,131,1,161,2,83,0,41,2,78,122, + 23,95,77,111,100,117,108,101,76,111,99,107,40,123,33,114, + 125,41,32,97,116,32,123,125,169,3,218,6,102,111,114,109, + 97,116,114,20,0,0,0,218,2,105,100,169,1,114,33,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,8,95,95,114,101,112,114,95,95,138,0,0,0,115, + 4,0,0,0,18,1,255,128,122,20,95,77,111,100,117,108, + 101,76,111,99,107,46,95,95,114,101,112,114,95,95,78,41, + 9,114,9,0,0,0,114,8,0,0,0,114,1,0,0,0, + 114,10,0,0,0,114,34,0,0,0,114,41,0,0,0,114, + 43,0,0,0,114,44,0,0,0,114,52,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,19,95,108,111,99,107,95,117,110,108,111,99,107, - 95,109,111,100,117,108,101,216,0,0,0,115,14,0,0,0, - 8,6,2,1,12,1,12,1,8,3,12,2,255,128,114,69, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,4,0,0,0,79,0,0,0,115,14,0,0, - 0,124,0,124,1,105,0,124,2,164,1,142,1,83,0,41, - 2,97,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,78,114,5,0,0,0,41,3,218,1,102,114, - 59,0,0,0,90,4,107,119,100,115,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,25,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,233,0,0,0,115,4,0,0,0,14,8,255, - 128,114,71,0,0,0,114,42,0,0,0,41,1,218,9,118, - 101,114,98,111,115,105,116,121,99,1,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,4,0,0,0,71,0,0, - 0,115,58,0,0,0,116,0,106,1,106,2,124,1,107,5, - 114,54,124,0,160,3,100,1,161,1,115,30,100,2,124,0, - 23,0,125,0,116,4,124,0,106,5,124,2,142,0,116,0, - 106,6,100,3,141,2,1,0,100,4,83,0,100,4,83,0, - 41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111,114,116,32,122, - 2,35,32,41,1,90,4,102,105,108,101,78,41,7,114,18, - 0,0,0,218,5,102,108,97,103,115,218,7,118,101,114,98, - 111,115,101,218,10,115,116,97,114,116,115,119,105,116,104,218, - 5,112,114,105,110,116,114,49,0,0,0,218,6,115,116,100, - 101,114,114,41,3,218,7,109,101,115,115,97,103,101,114,72, - 0,0,0,114,59,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,16,95,118,101,114,98,111,115, - 101,95,109,101,115,115,97,103,101,244,0,0,0,115,12,0, - 0,0,12,2,10,1,8,1,24,1,4,253,255,128,114,80, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,3,0,0,0,115,26,0,0, - 0,135,0,102,1,100,1,100,2,132,8,125,1,116,0,124, - 1,136,0,131,2,1,0,124,1,83,0,41,4,122,49,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,0,0,0,0,2,0,0, - 0,4,0,0,0,19,0,0,0,115,38,0,0,0,124,1, - 116,0,106,1,118,1,114,28,116,2,100,1,160,3,124,1, - 161,1,124,1,100,2,141,2,130,1,136,0,124,0,124,1, - 131,2,83,0,41,3,78,250,29,123,33,114,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,114,19,0,0,0,41,4,114,18,0, - 0,0,218,20,98,117,105,108,116,105,110,95,109,111,100,117, - 108,101,95,110,97,109,101,115,218,11,73,109,112,111,114,116, - 69,114,114,111,114,114,49,0,0,0,169,2,114,33,0,0, - 0,218,8,102,117,108,108,110,97,109,101,169,1,218,3,102, - 120,110,114,5,0,0,0,114,6,0,0,0,218,25,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,254,0,0,0,115,12,0,0,0, - 10,1,10,1,2,1,6,255,10,2,255,128,122,52,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,78,169,1,114,17,0,0,0,41,2,114,87,0,0, - 0,114,88,0,0,0,114,5,0,0,0,114,86,0,0,0, - 114,6,0,0,0,218,17,95,114,101,113,117,105,114,101,115, - 95,98,117,105,108,116,105,110,252,0,0,0,115,8,0,0, - 0,12,2,10,5,4,1,255,128,114,90,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, - 0,0,0,3,0,0,0,115,26,0,0,0,135,0,102,1, - 100,1,100,2,132,8,125,1,116,0,124,1,136,0,131,2, - 1,0,124,1,83,0,41,4,122,47,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,0,0,0,0,2,0,0,0,4,0,0,0,19,0, - 0,0,115,38,0,0,0,116,0,160,1,124,1,161,1,115, - 28,116,2,100,1,160,3,124,1,161,1,124,1,100,2,141, - 2,130,1,136,0,124,0,124,1,131,2,83,0,169,3,78, - 122,27,123,33,114,125,32,105,115,32,110,111,116,32,97,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,114,19,0, - 0,0,41,4,114,61,0,0,0,218,9,105,115,95,102,114, - 111,122,101,110,114,83,0,0,0,114,49,0,0,0,114,84, - 0,0,0,114,86,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,24,95,114,101,113,117,105,114,101,115,95,102,114, - 111,122,101,110,95,119,114,97,112,112,101,114,9,1,0,0, - 115,12,0,0,0,10,1,10,1,2,1,6,255,10,2,255, - 128,122,50,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,78,114,89,0,0,0,41,2,114,87,0, - 0,0,114,93,0,0,0,114,5,0,0,0,114,86,0,0, - 0,114,6,0,0,0,218,16,95,114,101,113,117,105,114,101, - 115,95,102,114,111,122,101,110,7,1,0,0,115,8,0,0, - 0,12,2,10,5,4,1,255,128,114,94,0,0,0,99,2, - 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4, - 0,0,0,67,0,0,0,115,74,0,0,0,100,1,125,2, - 116,0,160,1,124,2,116,2,161,2,1,0,116,3,124,1, - 124,0,131,2,125,3,124,1,116,4,106,5,118,0,114,66, - 116,4,106,5,124,1,25,0,125,4,116,6,124,3,124,4, - 131,2,1,0,116,4,106,5,124,1,25,0,83,0,116,7, - 124,3,131,1,83,0,41,3,122,128,76,111,97,100,32,116, - 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, - 117,108,101,32,105,110,116,111,32,115,121,115,46,109,111,100, - 117,108,101,115,32,97,110,100,32,114,101,116,117,114,110,32, - 105,116,46,10,10,32,32,32,32,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,85,115,101,32,108,111,97,100,101,114,46, - 101,120,101,99,95,109,111,100,117,108,101,32,105,110,115,116, - 101,97,100,46,10,10,32,32,32,32,122,103,116,104,101,32, - 108,111,97,100,95,109,111,100,117,108,101,40,41,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,32,97,110,100,32,115,108,97,116,101,100,32,102,111, - 114,32,114,101,109,111,118,97,108,32,105,110,32,80,121,116, - 104,111,110,32,51,46,49,50,59,32,117,115,101,32,101,120, - 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, - 101,97,100,78,41,8,218,9,95,119,97,114,110,105,110,103, - 115,218,4,119,97,114,110,218,18,68,101,112,114,101,99,97, - 116,105,111,110,87,97,114,110,105,110,103,218,16,115,112,101, - 99,95,102,114,111,109,95,108,111,97,100,101,114,114,18,0, - 0,0,218,7,109,111,100,117,108,101,115,218,5,95,101,120, - 101,99,218,5,95,108,111,97,100,41,5,114,33,0,0,0, - 114,85,0,0,0,218,3,109,115,103,218,4,115,112,101,99, - 218,6,109,111,100,117,108,101,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,17,95,108,111,97,100,95,109, - 111,100,117,108,101,95,115,104,105,109,19,1,0,0,115,18, - 0,0,0,4,6,12,2,10,1,10,1,10,1,10,1,10, - 1,8,2,255,128,114,105,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,8,0,0,0,67, - 0,0,0,115,210,0,0,0,116,0,124,0,100,1,100,0, - 131,3,125,1,116,1,124,1,100,2,131,2,114,54,122,12, - 124,1,160,2,124,0,161,1,87,0,83,0,4,0,116,3, - 121,52,1,0,1,0,1,0,89,0,110,2,48,0,122,10, - 124,0,106,4,125,2,87,0,110,18,4,0,116,5,121,82, - 1,0,1,0,1,0,89,0,110,18,48,0,124,2,100,0, - 117,1,114,100,116,6,124,2,131,1,83,0,122,10,124,0, - 106,7,125,3,87,0,110,22,4,0,116,5,121,132,1,0, - 1,0,1,0,100,3,125,3,89,0,110,2,48,0,122,10, - 124,0,106,8,125,4,87,0,110,52,4,0,116,5,121,196, - 1,0,1,0,1,0,124,1,100,0,117,0,114,180,100,4, - 160,9,124,3,161,1,6,0,89,0,83,0,100,5,160,9, - 124,3,124,1,161,2,6,0,89,0,83,0,48,0,100,6, - 160,9,124,3,124,4,161,2,83,0,41,7,78,218,10,95, - 95,108,111,97,100,101,114,95,95,218,11,109,111,100,117,108, - 101,95,114,101,112,114,250,1,63,250,13,60,109,111,100,117, - 108,101,32,123,33,114,125,62,250,20,60,109,111,100,117,108, - 101,32,123,33,114,125,32,40,123,33,114,125,41,62,250,23, - 60,109,111,100,117,108,101,32,123,33,114,125,32,102,114,111, - 109,32,123,33,114,125,62,41,10,114,13,0,0,0,114,11, - 0,0,0,114,107,0,0,0,218,9,69,120,99,101,112,116, - 105,111,110,218,8,95,95,115,112,101,99,95,95,114,2,0, - 0,0,218,22,95,109,111,100,117,108,101,95,114,101,112,114, - 95,102,114,111,109,95,115,112,101,99,114,9,0,0,0,218, - 8,95,95,102,105,108,101,95,95,114,49,0,0,0,41,5, - 114,104,0,0,0,218,6,108,111,97,100,101,114,114,103,0, - 0,0,114,20,0,0,0,218,8,102,105,108,101,110,97,109, - 101,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,12,95,109,111,100,117,108,101,95,114,101,112,114,38,1, - 0,0,115,48,0,0,0,12,2,10,1,2,4,12,1,12, - 1,6,1,2,1,10,1,12,1,6,1,8,2,8,1,2, - 4,10,1,12,1,10,1,2,1,10,1,12,1,8,1,14, - 1,18,2,12,2,255,128,114,118,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,64,0,0,0,115,114,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,100,2,100,2,100,3,156,3, - 100,4,100,5,132,2,90,4,100,6,100,7,132,0,90,5, - 100,8,100,9,132,0,90,6,101,7,100,10,100,11,132,0, - 131,1,90,8,101,8,106,9,100,12,100,11,132,0,131,1, - 90,8,101,7,100,13,100,14,132,0,131,1,90,10,101,7, - 100,15,100,16,132,0,131,1,90,11,101,11,106,9,100,17, - 100,16,132,0,131,1,90,11,100,2,83,0,41,18,218,10, - 77,111,100,117,108,101,83,112,101,99,97,208,5,0,0,84, - 104,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110, - 32,102,111,114,32,97,32,109,111,100,117,108,101,44,32,117, - 115,101,100,32,102,111,114,32,108,111,97,100,105,110,103,46, - 10,10,32,32,32,32,65,32,109,111,100,117,108,101,39,115, - 32,115,112,101,99,32,105,115,32,116,104,101,32,115,111,117, - 114,99,101,32,102,111,114,32,105,110,102,111,114,109,97,116, - 105,111,110,32,97,98,111,117,116,32,116,104,101,32,109,111, - 100,117,108,101,46,32,32,70,111,114,10,32,32,32,32,100, - 97,116,97,32,97,115,115,111,99,105,97,116,101,100,32,119, - 105,116,104,32,116,104,101,32,109,111,100,117,108,101,44,32, - 105,110,99,108,117,100,105,110,103,32,115,111,117,114,99,101, - 44,32,117,115,101,32,116,104,101,32,115,112,101,99,39,115, - 10,32,32,32,32,108,111,97,100,101,114,46,10,10,32,32, - 32,32,96,110,97,109,101,96,32,105,115,32,116,104,101,32, - 97,98,115,111,108,117,116,101,32,110,97,109,101,32,111,102, - 32,116,104,101,32,109,111,100,117,108,101,46,32,32,96,108, - 111,97,100,101,114,96,32,105,115,32,116,104,101,32,108,111, - 97,100,101,114,10,32,32,32,32,116,111,32,117,115,101,32, - 119,104,101,110,32,108,111,97,100,105,110,103,32,116,104,101, - 32,109,111,100,117,108,101,46,32,32,96,112,97,114,101,110, - 116,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111, - 102,32,116,104,101,10,32,32,32,32,112,97,99,107,97,103, - 101,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32, - 105,110,46,32,32,84,104,101,32,112,97,114,101,110,116,32, - 105,115,32,100,101,114,105,118,101,100,32,102,114,111,109,32, - 116,104,101,32,110,97,109,101,46,10,10,32,32,32,32,96, - 105,115,95,112,97,99,107,97,103,101,96,32,100,101,116,101, - 114,109,105,110,101,115,32,105,102,32,116,104,101,32,109,111, - 100,117,108,101,32,105,115,32,99,111,110,115,105,100,101,114, - 101,100,32,97,32,112,97,99,107,97,103,101,32,111,114,10, - 32,32,32,32,110,111,116,46,32,32,79,110,32,109,111,100, - 117,108,101,115,32,116,104,105,115,32,105,115,32,114,101,102, - 108,101,99,116,101,100,32,98,121,32,116,104,101,32,96,95, - 95,112,97,116,104,95,95,96,32,97,116,116,114,105,98,117, - 116,101,46,10,10,32,32,32,32,96,111,114,105,103,105,110, - 96,32,105,115,32,116,104,101,32,115,112,101,99,105,102,105, - 99,32,108,111,99,97,116,105,111,110,32,117,115,101,100,32, - 98,121,32,116,104,101,32,108,111,97,100,101,114,32,102,114, - 111,109,32,119,104,105,99,104,32,116,111,10,32,32,32,32, - 108,111,97,100,32,116,104,101,32,109,111,100,117,108,101,44, - 32,105,102,32,116,104,97,116,32,105,110,102,111,114,109,97, - 116,105,111,110,32,105,115,32,97,118,97,105,108,97,98,108, - 101,46,32,32,87,104,101,110,32,102,105,108,101,110,97,109, - 101,32,105,115,10,32,32,32,32,115,101,116,44,32,111,114, - 105,103,105,110,32,119,105,108,108,32,109,97,116,99,104,46, - 10,10,32,32,32,32,96,104,97,115,95,108,111,99,97,116, - 105,111,110,96,32,105,110,100,105,99,97,116,101,115,32,116, - 104,97,116,32,97,32,115,112,101,99,39,115,32,34,111,114, - 105,103,105,110,34,32,114,101,102,108,101,99,116,115,32,97, - 32,108,111,99,97,116,105,111,110,46,10,32,32,32,32,87, - 104,101,110,32,116,104,105,115,32,105,115,32,84,114,117,101, - 44,32,96,95,95,102,105,108,101,95,95,96,32,97,116,116, - 114,105,98,117,116,101,32,111,102,32,116,104,101,32,109,111, - 100,117,108,101,32,105,115,32,115,101,116,46,10,10,32,32, - 32,32,96,99,97,99,104,101,100,96,32,105,115,32,116,104, - 101,32,108,111,99,97,116,105,111,110,32,111,102,32,116,104, - 101,32,99,97,99,104,101,100,32,98,121,116,101,99,111,100, - 101,32,102,105,108,101,44,32,105,102,32,97,110,121,46,32, - 32,73,116,10,32,32,32,32,99,111,114,114,101,115,112,111, - 110,100,115,32,116,111,32,116,104,101,32,96,95,95,99,97, - 99,104,101,100,95,95,96,32,97,116,116,114,105,98,117,116, - 101,46,10,10,32,32,32,32,96,115,117,98,109,111,100,117, - 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, - 111,110,115,96,32,105,115,32,116,104,101,32,115,101,113,117, - 101,110,99,101,32,111,102,32,112,97,116,104,32,101,110,116, - 114,105,101,115,32,116,111,10,32,32,32,32,115,101,97,114, - 99,104,32,119,104,101,110,32,105,109,112,111,114,116,105,110, - 103,32,115,117,98,109,111,100,117,108,101,115,46,32,32,73, - 102,32,115,101,116,44,32,105,115,95,112,97,99,107,97,103, - 101,32,115,104,111,117,108,100,32,98,101,10,32,32,32,32, - 84,114,117,101,45,45,97,110,100,32,70,97,108,115,101,32, - 111,116,104,101,114,119,105,115,101,46,10,10,32,32,32,32, - 80,97,99,107,97,103,101,115,32,97,114,101,32,115,105,109, - 112,108,121,32,109,111,100,117,108,101,115,32,116,104,97,116, - 32,40,109,97,121,41,32,104,97,118,101,32,115,117,98,109, - 111,100,117,108,101,115,46,32,32,73,102,32,97,32,115,112, - 101,99,10,32,32,32,32,104,97,115,32,97,32,110,111,110, - 45,78,111,110,101,32,118,97,108,117,101,32,105,110,32,96, - 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, - 95,108,111,99,97,116,105,111,110,115,96,44,32,116,104,101, - 32,105,109,112,111,114,116,10,32,32,32,32,115,121,115,116, - 101,109,32,119,105,108,108,32,99,111,110,115,105,100,101,114, - 32,109,111,100,117,108,101,115,32,108,111,97,100,101,100,32, - 102,114,111,109,32,116,104,101,32,115,112,101,99,32,97,115, - 32,112,97,99,107,97,103,101,115,46,10,10,32,32,32,32, - 79,110,108,121,32,102,105,110,100,101,114,115,32,40,115,101, - 101,32,105,109,112,111,114,116,108,105,98,46,97,98,99,46, - 77,101,116,97,80,97,116,104,70,105,110,100,101,114,32,97, - 110,100,10,32,32,32,32,105,109,112,111,114,116,108,105,98, - 46,97,98,99,46,80,97,116,104,69,110,116,114,121,70,105, - 110,100,101,114,41,32,115,104,111,117,108,100,32,109,111,100, - 105,102,121,32,77,111,100,117,108,101,83,112,101,99,32,105, - 110,115,116,97,110,99,101,115,46,10,10,32,32,32,32,78, - 41,3,218,6,111,114,105,103,105,110,218,12,108,111,97,100, - 101,114,95,115,116,97,116,101,218,10,105,115,95,112,97,99, - 107,97,103,101,99,3,0,0,0,0,0,0,0,3,0,0, - 0,6,0,0,0,2,0,0,0,67,0,0,0,115,54,0, - 0,0,124,1,124,0,95,0,124,2,124,0,95,1,124,3, - 124,0,95,2,124,4,124,0,95,3,124,5,114,32,103,0, - 110,2,100,0,124,0,95,4,100,1,124,0,95,5,100,0, - 124,0,95,6,100,0,83,0,41,2,78,70,41,7,114,20, - 0,0,0,114,116,0,0,0,114,120,0,0,0,114,121,0, - 0,0,218,26,115,117,98,109,111,100,117,108,101,95,115,101, - 97,114,99,104,95,108,111,99,97,116,105,111,110,115,218,13, - 95,115,101,116,95,102,105,108,101,97,116,116,114,218,7,95, - 99,97,99,104,101,100,41,6,114,33,0,0,0,114,20,0, - 0,0,114,116,0,0,0,114,120,0,0,0,114,121,0,0, - 0,114,122,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,34,0,0,0,111,1,0,0,115,16, - 0,0,0,6,2,6,1,6,1,6,1,14,1,6,3,10, - 1,255,128,122,19,77,111,100,117,108,101,83,112,101,99,46, - 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,6,0,0,0,67,0,0, - 0,115,102,0,0,0,100,1,160,0,124,0,106,1,161,1, - 100,2,160,0,124,0,106,2,161,1,103,2,125,1,124,0, - 106,3,100,0,117,1,114,52,124,1,160,4,100,3,160,0, - 124,0,106,3,161,1,161,1,1,0,124,0,106,5,100,0, - 117,1,114,80,124,1,160,4,100,4,160,0,124,0,106,5, - 161,1,161,1,1,0,100,5,160,0,124,0,106,6,106,7, - 100,6,160,8,124,1,161,1,161,2,83,0,41,7,78,122, - 9,110,97,109,101,61,123,33,114,125,122,11,108,111,97,100, - 101,114,61,123,33,114,125,122,11,111,114,105,103,105,110,61, - 123,33,114,125,122,29,115,117,98,109,111,100,117,108,101,95, + 0,0,114,23,0,0,0,65,0,0,0,115,16,0,0,0, + 8,0,4,1,8,5,8,8,8,21,8,25,12,13,255,128, + 114,23,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,48, + 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, + 2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,100, + 6,100,7,132,0,90,6,100,8,100,9,132,0,90,7,100, + 10,83,0,41,11,218,16,95,68,117,109,109,121,77,111,100, + 117,108,101,76,111,99,107,122,86,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,0,0,0,0,2,0,0,0, + 2,0,0,0,67,0,0,0,115,16,0,0,0,124,1,124, + 0,95,0,100,1,124,0,95,1,100,0,83,0,114,24,0, + 0,0,41,2,114,20,0,0,0,114,30,0,0,0,114,32, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,114,34,0,0,0,146,0,0,0,115,6,0,0,0, + 6,1,10,1,255,128,122,25,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,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,18,0,0,0,124, + 0,4,0,106,0,100,1,55,0,2,0,95,0,100,2,83, + 0,41,3,78,114,42,0,0,0,84,41,1,114,30,0,0, + 0,114,51,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,43,0,0,0,150,0,0,0,115,6, + 0,0,0,14,1,4,1,255,128,122,24,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,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,36,0,0, + 0,124,0,106,0,100,1,107,2,114,18,116,1,100,2,131, + 1,130,1,124,0,4,0,106,0,100,3,56,0,2,0,95, + 0,100,0,83,0,41,4,78,114,25,0,0,0,114,46,0, + 0,0,114,42,0,0,0,41,2,114,30,0,0,0,114,47, + 0,0,0,114,51,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,44,0,0,0,154,0,0,0, + 115,8,0,0,0,10,1,8,1,18,1,255,128,122,24,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, + 0,0,0,0,1,0,0,0,5,0,0,0,67,0,0,0, + 115,18,0,0,0,100,1,160,0,124,0,106,1,116,2,124, + 0,131,1,161,2,83,0,41,2,78,122,28,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,114,48,0,0,0,114,51,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,52,0,0,0,159,0,0,0,115,4,0,0,0,18, + 1,255,128,122,25,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,41, + 8,114,9,0,0,0,114,8,0,0,0,114,1,0,0,0, + 114,10,0,0,0,114,34,0,0,0,114,43,0,0,0,114, + 44,0,0,0,114,52,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,53,0, + 0,0,142,0,0,0,115,14,0,0,0,8,0,4,1,8, + 3,8,4,8,4,12,5,255,128,114,53,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,64,0,0,0,115,36,0,0,0,101,0,90,1, + 100,0,90,2,100,1,100,2,132,0,90,3,100,3,100,4, + 132,0,90,4,100,5,100,6,132,0,90,5,100,7,83,0, + 41,8,218,18,95,77,111,100,117,108,101,76,111,99,107,77, + 97,110,97,103,101,114,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, + 16,0,0,0,124,1,124,0,95,0,100,0,124,0,95,1, + 100,0,83,0,114,0,0,0,0,41,2,218,5,95,110,97, + 109,101,218,5,95,108,111,99,107,114,32,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,34,0, + 0,0,165,0,0,0,115,6,0,0,0,6,1,10,1,255, + 128,122,27,95,77,111,100,117,108,101,76,111,99,107,77,97, + 110,97,103,101,114,46,95,95,105,110,105,116,95,95,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, + 0,0,0,67,0,0,0,115,26,0,0,0,116,0,124,0, + 106,1,131,1,124,0,95,2,124,0,106,2,160,3,161,0, + 1,0,100,0,83,0,114,0,0,0,0,41,4,218,16,95, + 103,101,116,95,109,111,100,117,108,101,95,108,111,99,107,114, + 55,0,0,0,114,56,0,0,0,114,43,0,0,0,114,51, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,9,95,95,101,110,116,101,114,95,95,169,0,0, + 0,115,6,0,0,0,12,1,14,1,255,128,122,28,95,77, + 111,100,117,108,101,76,111,99,107,77,97,110,97,103,101,114, + 46,95,95,101,110,116,101,114,95,95,99,1,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,79, + 0,0,0,115,14,0,0,0,124,0,106,0,160,1,161,0, + 1,0,100,0,83,0,114,0,0,0,0,41,2,114,56,0, + 0,0,114,44,0,0,0,41,3,114,33,0,0,0,218,4, + 97,114,103,115,90,6,107,119,97,114,103,115,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,8,95,95,101, + 120,105,116,95,95,173,0,0,0,115,4,0,0,0,14,1, + 255,128,122,27,95,77,111,100,117,108,101,76,111,99,107,77, + 97,110,97,103,101,114,46,95,95,101,120,105,116,95,95,78, + 41,6,114,9,0,0,0,114,8,0,0,0,114,1,0,0, + 0,114,34,0,0,0,114,58,0,0,0,114,60,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,54,0,0,0,163,0,0,0,115,10,0, + 0,0,8,0,8,2,8,4,12,4,255,128,114,54,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,8,0,0,0,67,0,0,0,115,134,0,0,0,116, + 0,160,1,161,0,1,0,122,114,122,14,116,2,124,0,25, + 0,131,0,125,1,87,0,110,22,4,0,116,3,121,46,1, + 0,1,0,1,0,100,1,125,1,89,0,110,2,48,0,124, + 1,100,1,117,0,114,110,116,4,100,1,117,0,114,74,116, + 5,124,0,131,1,125,1,110,8,116,6,124,0,131,1,125, + 1,124,0,102,1,100,2,100,3,132,1,125,2,116,7,160, + 8,124,1,124,2,161,2,116,2,124,0,60,0,87,0,116, + 0,160,9,161,0,1,0,124,1,83,0,116,0,160,9,161, + 0,1,0,48,0,41,4,122,139,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,65,99,113,117,105,114,101,47,114,101,108, + 101,97,115,101,32,105,110,116,101,114,110,97,108,108,121,32, + 116,104,101,32,103,108,111,98,97,108,32,105,109,112,111,114, + 116,32,108,111,99,107,32,116,111,32,112,114,111,116,101,99, + 116,10,32,32,32,32,95,109,111,100,117,108,101,95,108,111, + 99,107,115,46,78,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,8,0,0,0,83,0,0,0,115,54, + 0,0,0,116,0,160,1,161,0,1,0,122,34,116,2,160, + 3,124,1,161,1,124,0,117,0,114,30,116,2,124,1,61, + 0,87,0,116,0,160,4,161,0,1,0,100,0,83,0,116, + 0,160,4,161,0,1,0,48,0,114,0,0,0,0,41,5, + 218,4,95,105,109,112,218,12,97,99,113,117,105,114,101,95, + 108,111,99,107,218,13,95,109,111,100,117,108,101,95,108,111, + 99,107,115,114,38,0,0,0,218,12,114,101,108,101,97,115, + 101,95,108,111,99,107,41,2,218,3,114,101,102,114,20,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,2,99,98,198,0,0,0,115,14,0,0,0,8,1, + 2,1,14,4,6,1,2,128,22,2,255,128,122,28,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,41,10,114,61,0,0, + 0,114,62,0,0,0,114,63,0,0,0,218,8,75,101,121, + 69,114,114,111,114,114,26,0,0,0,114,53,0,0,0,114, + 23,0,0,0,218,8,95,119,101,97,107,114,101,102,114,65, + 0,0,0,114,64,0,0,0,41,3,114,20,0,0,0,114, + 27,0,0,0,114,66,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,57,0,0,0,179,0,0, + 0,115,34,0,0,0,8,6,2,1,2,1,14,1,12,1, + 10,1,8,2,8,1,10,1,8,2,12,2,16,11,2,128, + 8,2,4,2,10,254,255,128,114,57,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0, + 0,0,67,0,0,0,115,54,0,0,0,116,0,124,0,131, + 1,125,1,122,12,124,1,160,1,161,0,1,0,87,0,110, + 20,4,0,116,2,121,40,1,0,1,0,1,0,89,0,100, + 1,83,0,48,0,124,1,160,3,161,0,1,0,100,1,83, + 0,41,2,122,189,65,99,113,117,105,114,101,115,32,116,104, + 101,110,32,114,101,108,101,97,115,101,115,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,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,32,32, + 32,32,78,41,4,114,57,0,0,0,114,43,0,0,0,114, + 22,0,0,0,114,44,0,0,0,41,2,114,20,0,0,0, + 114,27,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,19,95,108,111,99,107,95,117,110,108,111, + 99,107,95,109,111,100,117,108,101,216,0,0,0,115,14,0, + 0,0,8,6,2,1,12,1,12,1,8,3,12,2,255,128, + 114,69,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,4,0,0,0,79,0,0,0,115,14, + 0,0,0,124,0,124,1,105,0,124,2,164,1,142,1,83, + 0,41,2,97,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,78,114,5,0,0,0,41,3,218,1, + 102,114,59,0,0,0,90,4,107,119,100,115,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,25,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,233,0,0,0,115,4,0,0,0,14, + 8,255,128,114,71,0,0,0,114,42,0,0,0,41,1,218, + 9,118,101,114,98,111,115,105,116,121,99,1,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,4,0,0,0,71, + 0,0,0,115,58,0,0,0,116,0,106,1,106,2,124,1, + 107,5,114,54,124,0,160,3,100,1,161,1,115,30,100,2, + 124,0,23,0,125,0,116,4,124,0,106,5,124,2,142,0, + 116,0,106,6,100,3,141,2,1,0,100,4,83,0,100,4, + 83,0,41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111,114,116, + 32,122,2,35,32,41,1,90,4,102,105,108,101,78,41,7, + 114,18,0,0,0,218,5,102,108,97,103,115,218,7,118,101, + 114,98,111,115,101,218,10,115,116,97,114,116,115,119,105,116, + 104,218,5,112,114,105,110,116,114,49,0,0,0,218,6,115, + 116,100,101,114,114,41,3,218,7,109,101,115,115,97,103,101, + 114,72,0,0,0,114,59,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,16,95,118,101,114,98, + 111,115,101,95,109,101,115,115,97,103,101,244,0,0,0,115, + 12,0,0,0,12,2,10,1,8,1,24,1,4,253,255,128, + 114,80,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,26, + 0,0,0,135,0,102,1,100,1,100,2,132,8,125,1,116, + 0,124,1,136,0,131,2,1,0,124,1,83,0,41,4,122, + 49,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,0,0,0,0,2, + 0,0,0,4,0,0,0,19,0,0,0,115,38,0,0,0, + 124,1,116,0,106,1,118,1,114,28,116,2,100,1,160,3, + 124,1,161,1,124,1,100,2,141,2,130,1,136,0,124,0, + 124,1,131,2,83,0,41,3,78,250,29,123,33,114,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,114,19,0,0,0,41,4,114, + 18,0,0,0,218,20,98,117,105,108,116,105,110,95,109,111, + 100,117,108,101,95,110,97,109,101,115,218,11,73,109,112,111, + 114,116,69,114,114,111,114,114,49,0,0,0,169,2,114,33, + 0,0,0,218,8,102,117,108,108,110,97,109,101,169,1,218, + 3,102,120,110,114,5,0,0,0,114,6,0,0,0,218,25, + 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,254,0,0,0,115,12,0, + 0,0,10,1,10,1,2,1,6,255,10,2,255,128,122,52, + 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,78,169,1,114,17,0,0,0,41,2,114,87, + 0,0,0,114,88,0,0,0,114,5,0,0,0,114,86,0, + 0,0,114,6,0,0,0,218,17,95,114,101,113,117,105,114, + 101,115,95,98,117,105,108,116,105,110,252,0,0,0,115,8, + 0,0,0,12,2,10,5,4,1,255,128,114,90,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,3,0,0,0,3,0,0,0,115,26,0,0,0,135,0, + 102,1,100,1,100,2,132,8,125,1,116,0,124,1,136,0, + 131,2,1,0,124,1,83,0,41,4,122,47,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,0,0,0,0,2,0,0,0,4,0,0,0, + 19,0,0,0,115,38,0,0,0,116,0,160,1,124,1,161, + 1,115,28,116,2,100,1,160,3,124,1,161,1,124,1,100, + 2,141,2,130,1,136,0,124,0,124,1,131,2,83,0,169, + 3,78,122,27,123,33,114,125,32,105,115,32,110,111,116,32, + 97,32,102,114,111,122,101,110,32,109,111,100,117,108,101,114, + 19,0,0,0,41,4,114,61,0,0,0,218,9,105,115,95, + 102,114,111,122,101,110,114,83,0,0,0,114,49,0,0,0, + 114,84,0,0,0,114,86,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,24,95,114,101,113,117,105,114,101,115,95, + 102,114,111,122,101,110,95,119,114,97,112,112,101,114,9,1, + 0,0,115,12,0,0,0,10,1,10,1,2,1,6,255,10, + 2,255,128,122,50,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,78,114,89,0,0,0,41,2,114, + 87,0,0,0,114,93,0,0,0,114,5,0,0,0,114,86, + 0,0,0,114,6,0,0,0,218,16,95,114,101,113,117,105, + 114,101,115,95,102,114,111,122,101,110,7,1,0,0,115,8, + 0,0,0,12,2,10,5,4,1,255,128,114,94,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,4,0,0,0,67,0,0,0,115,74,0,0,0,100,1, + 125,2,116,0,160,1,124,2,116,2,161,2,1,0,116,3, + 124,1,124,0,131,2,125,3,124,1,116,4,106,5,118,0, + 114,66,116,4,106,5,124,1,25,0,125,4,116,6,124,3, + 124,4,131,2,1,0,116,4,106,5,124,1,25,0,83,0, + 116,7,124,3,131,1,83,0,41,3,122,128,76,111,97,100, + 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,109, + 111,100,117,108,101,32,105,110,116,111,32,115,121,115,46,109, + 111,100,117,108,101,115,32,97,110,100,32,114,101,116,117,114, + 110,32,105,116,46,10,10,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,108,111,97,100,101, + 114,46,101,120,101,99,95,109,111,100,117,108,101,32,105,110, + 115,116,101,97,100,46,10,10,32,32,32,32,122,103,116,104, + 101,32,108,111,97,100,95,109,111,100,117,108,101,40,41,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,32,97,110,100,32,115,108,97,116,101,100,32, + 102,111,114,32,114,101,109,111,118,97,108,32,105,110,32,80, + 121,116,104,111,110,32,51,46,49,50,59,32,117,115,101,32, + 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, + 115,116,101,97,100,78,41,8,218,9,95,119,97,114,110,105, + 110,103,115,218,4,119,97,114,110,218,18,68,101,112,114,101, + 99,97,116,105,111,110,87,97,114,110,105,110,103,218,16,115, + 112,101,99,95,102,114,111,109,95,108,111,97,100,101,114,114, + 18,0,0,0,218,7,109,111,100,117,108,101,115,218,5,95, + 101,120,101,99,218,5,95,108,111,97,100,41,5,114,33,0, + 0,0,114,85,0,0,0,218,3,109,115,103,218,4,115,112, + 101,99,218,6,109,111,100,117,108,101,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,17,95,108,111,97,100, + 95,109,111,100,117,108,101,95,115,104,105,109,19,1,0,0, + 115,18,0,0,0,4,6,12,2,10,1,10,1,10,1,10, + 1,10,1,8,2,255,128,114,105,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,8,0,0, + 0,67,0,0,0,115,210,0,0,0,116,0,124,0,100,1, + 100,0,131,3,125,1,116,1,124,1,100,2,131,2,114,54, + 122,12,124,1,160,2,124,0,161,1,87,0,83,0,4,0, + 116,3,121,52,1,0,1,0,1,0,89,0,110,2,48,0, + 122,10,124,0,106,4,125,2,87,0,110,18,4,0,116,5, + 121,82,1,0,1,0,1,0,89,0,110,18,48,0,124,2, + 100,0,117,1,114,100,116,6,124,2,131,1,83,0,122,10, + 124,0,106,7,125,3,87,0,110,22,4,0,116,5,121,132, + 1,0,1,0,1,0,100,3,125,3,89,0,110,2,48,0, + 122,10,124,0,106,8,125,4,87,0,110,52,4,0,116,5, + 121,196,1,0,1,0,1,0,124,1,100,0,117,0,114,180, + 100,4,160,9,124,3,161,1,6,0,89,0,83,0,100,5, + 160,9,124,3,124,1,161,2,6,0,89,0,83,0,48,0, + 100,6,160,9,124,3,124,4,161,2,83,0,41,7,78,218, + 10,95,95,108,111,97,100,101,114,95,95,218,11,109,111,100, + 117,108,101,95,114,101,112,114,250,1,63,250,13,60,109,111, + 100,117,108,101,32,123,33,114,125,62,250,20,60,109,111,100, + 117,108,101,32,123,33,114,125,32,40,123,33,114,125,41,62, + 250,23,60,109,111,100,117,108,101,32,123,33,114,125,32,102, + 114,111,109,32,123,33,114,125,62,41,10,114,13,0,0,0, + 114,11,0,0,0,114,107,0,0,0,218,9,69,120,99,101, + 112,116,105,111,110,218,8,95,95,115,112,101,99,95,95,114, + 2,0,0,0,218,22,95,109,111,100,117,108,101,95,114,101, + 112,114,95,102,114,111,109,95,115,112,101,99,114,9,0,0, + 0,218,8,95,95,102,105,108,101,95,95,114,49,0,0,0, + 41,5,114,104,0,0,0,218,6,108,111,97,100,101,114,114, + 103,0,0,0,114,20,0,0,0,218,8,102,105,108,101,110, + 97,109,101,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,12,95,109,111,100,117,108,101,95,114,101,112,114, + 38,1,0,0,115,48,0,0,0,12,2,10,1,2,4,12, + 1,12,1,6,1,2,1,10,1,12,1,6,1,8,2,8, + 1,2,4,10,1,12,1,10,1,2,1,10,1,12,1,8, + 1,14,1,18,2,12,2,255,128,114,118,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,64,0,0,0,115,114,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,2,100,2,100,3, + 156,3,100,4,100,5,132,2,90,4,100,6,100,7,132,0, + 90,5,100,8,100,9,132,0,90,6,101,7,100,10,100,11, + 132,0,131,1,90,8,101,8,106,9,100,12,100,11,132,0, + 131,1,90,8,101,7,100,13,100,14,132,0,131,1,90,10, + 101,7,100,15,100,16,132,0,131,1,90,11,101,11,106,9, + 100,17,100,16,132,0,131,1,90,11,100,2,83,0,41,18, + 218,10,77,111,100,117,108,101,83,112,101,99,97,208,5,0, + 0,84,104,101,32,115,112,101,99,105,102,105,99,97,116,105, + 111,110,32,102,111,114,32,97,32,109,111,100,117,108,101,44, + 32,117,115,101,100,32,102,111,114,32,108,111,97,100,105,110, + 103,46,10,10,32,32,32,32,65,32,109,111,100,117,108,101, + 39,115,32,115,112,101,99,32,105,115,32,116,104,101,32,115, + 111,117,114,99,101,32,102,111,114,32,105,110,102,111,114,109, + 97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32, + 109,111,100,117,108,101,46,32,32,70,111,114,10,32,32,32, + 32,100,97,116,97,32,97,115,115,111,99,105,97,116,101,100, + 32,119,105,116,104,32,116,104,101,32,109,111,100,117,108,101, + 44,32,105,110,99,108,117,100,105,110,103,32,115,111,117,114, + 99,101,44,32,117,115,101,32,116,104,101,32,115,112,101,99, + 39,115,10,32,32,32,32,108,111,97,100,101,114,46,10,10, + 32,32,32,32,96,110,97,109,101,96,32,105,115,32,116,104, + 101,32,97,98,115,111,108,117,116,101,32,110,97,109,101,32, + 111,102,32,116,104,101,32,109,111,100,117,108,101,46,32,32, + 96,108,111,97,100,101,114,96,32,105,115,32,116,104,101,32, + 108,111,97,100,101,114,10,32,32,32,32,116,111,32,117,115, + 101,32,119,104,101,110,32,108,111,97,100,105,110,103,32,116, + 104,101,32,109,111,100,117,108,101,46,32,32,96,112,97,114, + 101,110,116,96,32,105,115,32,116,104,101,32,110,97,109,101, + 32,111,102,32,116,104,101,10,32,32,32,32,112,97,99,107, + 97,103,101,32,116,104,101,32,109,111,100,117,108,101,32,105, + 115,32,105,110,46,32,32,84,104,101,32,112,97,114,101,110, + 116,32,105,115,32,100,101,114,105,118,101,100,32,102,114,111, + 109,32,116,104,101,32,110,97,109,101,46,10,10,32,32,32, + 32,96,105,115,95,112,97,99,107,97,103,101,96,32,100,101, + 116,101,114,109,105,110,101,115,32,105,102,32,116,104,101,32, + 109,111,100,117,108,101,32,105,115,32,99,111,110,115,105,100, + 101,114,101,100,32,97,32,112,97,99,107,97,103,101,32,111, + 114,10,32,32,32,32,110,111,116,46,32,32,79,110,32,109, + 111,100,117,108,101,115,32,116,104,105,115,32,105,115,32,114, + 101,102,108,101,99,116,101,100,32,98,121,32,116,104,101,32, + 96,95,95,112,97,116,104,95,95,96,32,97,116,116,114,105, + 98,117,116,101,46,10,10,32,32,32,32,96,111,114,105,103, + 105,110,96,32,105,115,32,116,104,101,32,115,112,101,99,105, + 102,105,99,32,108,111,99,97,116,105,111,110,32,117,115,101, + 100,32,98,121,32,116,104,101,32,108,111,97,100,101,114,32, + 102,114,111,109,32,119,104,105,99,104,32,116,111,10,32,32, + 32,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108, + 101,44,32,105,102,32,116,104,97,116,32,105,110,102,111,114, + 109,97,116,105,111,110,32,105,115,32,97,118,97,105,108,97, + 98,108,101,46,32,32,87,104,101,110,32,102,105,108,101,110, + 97,109,101,32,105,115,10,32,32,32,32,115,101,116,44,32, + 111,114,105,103,105,110,32,119,105,108,108,32,109,97,116,99, + 104,46,10,10,32,32,32,32,96,104,97,115,95,108,111,99, + 97,116,105,111,110,96,32,105,110,100,105,99,97,116,101,115, + 32,116,104,97,116,32,97,32,115,112,101,99,39,115,32,34, + 111,114,105,103,105,110,34,32,114,101,102,108,101,99,116,115, + 32,97,32,108,111,99,97,116,105,111,110,46,10,32,32,32, + 32,87,104,101,110,32,116,104,105,115,32,105,115,32,84,114, + 117,101,44,32,96,95,95,102,105,108,101,95,95,96,32,97, + 116,116,114,105,98,117,116,101,32,111,102,32,116,104,101,32, + 109,111,100,117,108,101,32,105,115,32,115,101,116,46,10,10, + 32,32,32,32,96,99,97,99,104,101,100,96,32,105,115,32, + 116,104,101,32,108,111,99,97,116,105,111,110,32,111,102,32, + 116,104,101,32,99,97,99,104,101,100,32,98,121,116,101,99, + 111,100,101,32,102,105,108,101,44,32,105,102,32,97,110,121, + 46,32,32,73,116,10,32,32,32,32,99,111,114,114,101,115, + 112,111,110,100,115,32,116,111,32,116,104,101,32,96,95,95, + 99,97,99,104,101,100,95,95,96,32,97,116,116,114,105,98, + 117,116,101,46,10,10,32,32,32,32,96,115,117,98,109,111, + 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, + 116,105,111,110,115,96,32,105,115,32,116,104,101,32,115,101, + 113,117,101,110,99,101,32,111,102,32,112,97,116,104,32,101, + 110,116,114,105,101,115,32,116,111,10,32,32,32,32,115,101, + 97,114,99,104,32,119,104,101,110,32,105,109,112,111,114,116, + 105,110,103,32,115,117,98,109,111,100,117,108,101,115,46,32, + 32,73,102,32,115,101,116,44,32,105,115,95,112,97,99,107, + 97,103,101,32,115,104,111,117,108,100,32,98,101,10,32,32, + 32,32,84,114,117,101,45,45,97,110,100,32,70,97,108,115, + 101,32,111,116,104,101,114,119,105,115,101,46,10,10,32,32, + 32,32,80,97,99,107,97,103,101,115,32,97,114,101,32,115, + 105,109,112,108,121,32,109,111,100,117,108,101,115,32,116,104, + 97,116,32,40,109,97,121,41,32,104,97,118,101,32,115,117, + 98,109,111,100,117,108,101,115,46,32,32,73,102,32,97,32, + 115,112,101,99,10,32,32,32,32,104,97,115,32,97,32,110, + 111,110,45,78,111,110,101,32,118,97,108,117,101,32,105,110, + 32,96,115,117,98,109,111,100,117,108,101,95,115,101,97,114, + 99,104,95,108,111,99,97,116,105,111,110,115,96,44,32,116, + 104,101,32,105,109,112,111,114,116,10,32,32,32,32,115,121, + 115,116,101,109,32,119,105,108,108,32,99,111,110,115,105,100, + 101,114,32,109,111,100,117,108,101,115,32,108,111,97,100,101, + 100,32,102,114,111,109,32,116,104,101,32,115,112,101,99,32, + 97,115,32,112,97,99,107,97,103,101,115,46,10,10,32,32, + 32,32,79,110,108,121,32,102,105,110,100,101,114,115,32,40, + 115,101,101,32,105,109,112,111,114,116,108,105,98,46,97,98, + 99,46,77,101,116,97,80,97,116,104,70,105,110,100,101,114, + 32,97,110,100,10,32,32,32,32,105,109,112,111,114,116,108, + 105,98,46,97,98,99,46,80,97,116,104,69,110,116,114,121, + 70,105,110,100,101,114,41,32,115,104,111,117,108,100,32,109, + 111,100,105,102,121,32,77,111,100,117,108,101,83,112,101,99, + 32,105,110,115,116,97,110,99,101,115,46,10,10,32,32,32, + 32,78,41,3,218,6,111,114,105,103,105,110,218,12,108,111, + 97,100,101,114,95,115,116,97,116,101,218,10,105,115,95,112, + 97,99,107,97,103,101,99,3,0,0,0,0,0,0,0,3, + 0,0,0,6,0,0,0,2,0,0,0,67,0,0,0,115, + 54,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, + 124,3,124,0,95,2,124,4,124,0,95,3,124,5,114,32, + 103,0,110,2,100,0,124,0,95,4,100,1,124,0,95,5, + 100,0,124,0,95,6,100,0,83,0,41,2,78,70,41,7, + 114,20,0,0,0,114,116,0,0,0,114,120,0,0,0,114, + 121,0,0,0,218,26,115,117,98,109,111,100,117,108,101,95, 115,101,97,114,99,104,95,108,111,99,97,116,105,111,110,115, - 61,123,125,122,6,123,125,40,123,125,41,122,2,44,32,41, - 9,114,49,0,0,0,114,20,0,0,0,114,116,0,0,0, - 114,120,0,0,0,218,6,97,112,112,101,110,100,114,123,0, - 0,0,218,9,95,95,99,108,97,115,115,95,95,114,9,0, - 0,0,218,4,106,111,105,110,41,2,114,33,0,0,0,114, - 59,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,52,0,0,0,123,1,0,0,115,22,0,0, - 0,10,1,10,1,4,255,10,2,18,1,10,1,8,1,4, - 1,6,255,22,2,255,128,122,19,77,111,100,117,108,101,83, - 112,101,99,46,95,95,114,101,112,114,95,95,99,2,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0, - 0,67,0,0,0,115,102,0,0,0,124,0,106,0,125,2, - 122,72,124,0,106,1,124,1,106,1,107,2,111,76,124,0, - 106,2,124,1,106,2,107,2,111,76,124,0,106,3,124,1, - 106,3,107,2,111,76,124,2,124,1,106,0,107,2,111,76, - 124,0,106,4,124,1,106,4,107,2,111,76,124,0,106,5, - 124,1,106,5,107,2,87,0,83,0,4,0,116,6,121,100, - 1,0,1,0,1,0,116,7,6,0,89,0,83,0,48,0, - 114,0,0,0,0,41,8,114,123,0,0,0,114,20,0,0, - 0,114,116,0,0,0,114,120,0,0,0,218,6,99,97,99, - 104,101,100,218,12,104,97,115,95,108,111,99,97,116,105,111, - 110,114,2,0,0,0,218,14,78,111,116,73,109,112,108,101, - 109,101,110,116,101,100,41,3,114,33,0,0,0,90,5,111, - 116,104,101,114,90,4,115,109,115,108,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,6,95,95,101,113,95, - 95,133,1,0,0,115,32,0,0,0,6,1,2,1,12,1, - 10,1,2,255,10,2,2,254,8,3,2,253,10,4,2,252, - 10,5,4,251,12,6,10,1,255,128,122,17,77,111,100,117, - 108,101,83,112,101,99,46,95,95,101,113,95,95,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,58,0,0,0,124,0,106,0,100, - 0,117,0,114,52,124,0,106,1,100,0,117,1,114,52,124, - 0,106,2,114,52,116,3,100,0,117,0,114,38,116,4,130, - 1,116,3,160,5,124,0,106,1,161,1,124,0,95,0,124, - 0,106,0,83,0,114,0,0,0,0,41,6,114,125,0,0, - 0,114,120,0,0,0,114,124,0,0,0,218,19,95,98,111, - 111,116,115,116,114,97,112,95,101,120,116,101,114,110,97,108, - 218,19,78,111,116,73,109,112,108,101,109,101,110,116,101,100, - 69,114,114,111,114,90,11,95,103,101,116,95,99,97,99,104, - 101,100,114,51,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,129,0,0,0,145,1,0,0,115, - 14,0,0,0,10,2,16,1,8,1,4,1,14,1,6,1, - 255,128,122,17,77,111,100,117,108,101,83,112,101,99,46,99, - 97,99,104,101,100,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,10, - 0,0,0,124,1,124,0,95,0,100,0,83,0,114,0,0, - 0,0,41,1,114,125,0,0,0,41,2,114,33,0,0,0, - 114,129,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,129,0,0,0,154,1,0,0,115,4,0, - 0,0,10,2,255,128,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 32,0,0,0,124,0,106,0,100,1,117,0,114,26,124,0, - 106,1,160,2,100,2,161,1,100,3,25,0,83,0,124,0, - 106,1,83,0,41,4,122,32,84,104,101,32,110,97,109,101, - 32,111,102,32,116,104,101,32,109,111,100,117,108,101,39,115, - 32,112,97,114,101,110,116,46,78,218,1,46,114,25,0,0, - 0,41,3,114,123,0,0,0,114,20,0,0,0,218,10,114, - 112,97,114,116,105,116,105,111,110,114,51,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,6,112, - 97,114,101,110,116,158,1,0,0,115,8,0,0,0,10,3, - 16,1,6,2,255,128,122,17,77,111,100,117,108,101,83,112, - 101,99,46,112,97,114,101,110,116,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,1,0,0,0,67,0, - 0,0,115,6,0,0,0,124,0,106,0,83,0,114,0,0, - 0,0,41,1,114,124,0,0,0,114,51,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,130,0, - 0,0,166,1,0,0,115,4,0,0,0,6,2,255,128,122, - 23,77,111,100,117,108,101,83,112,101,99,46,104,97,115,95, - 108,111,99,97,116,105,111,110,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, - 0,115,14,0,0,0,116,0,124,1,131,1,124,0,95,1, - 100,0,83,0,114,0,0,0,0,41,2,218,4,98,111,111, - 108,114,124,0,0,0,41,2,114,33,0,0,0,218,5,118, - 97,108,117,101,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,130,0,0,0,170,1,0,0,115,4,0,0, - 0,14,2,255,128,41,12,114,9,0,0,0,114,8,0,0, - 0,114,1,0,0,0,114,10,0,0,0,114,34,0,0,0, - 114,52,0,0,0,114,132,0,0,0,218,8,112,114,111,112, - 101,114,116,121,114,129,0,0,0,218,6,115,101,116,116,101, - 114,114,137,0,0,0,114,130,0,0,0,114,5,0,0,0, + 218,13,95,115,101,116,95,102,105,108,101,97,116,116,114,218, + 7,95,99,97,99,104,101,100,41,6,114,33,0,0,0,114, + 20,0,0,0,114,116,0,0,0,114,120,0,0,0,114,121, + 0,0,0,114,122,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,34,0,0,0,111,1,0,0, + 115,16,0,0,0,6,2,6,1,6,1,6,1,14,1,6, + 3,10,1,255,128,122,19,77,111,100,117,108,101,83,112,101, + 99,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67, + 0,0,0,115,102,0,0,0,100,1,160,0,124,0,106,1, + 161,1,100,2,160,0,124,0,106,2,161,1,103,2,125,1, + 124,0,106,3,100,0,117,1,114,52,124,1,160,4,100,3, + 160,0,124,0,106,3,161,1,161,1,1,0,124,0,106,5, + 100,0,117,1,114,80,124,1,160,4,100,4,160,0,124,0, + 106,5,161,1,161,1,1,0,100,5,160,0,124,0,106,6, + 106,7,100,6,160,8,124,1,161,1,161,2,83,0,41,7, + 78,122,9,110,97,109,101,61,123,33,114,125,122,11,108,111, + 97,100,101,114,61,123,33,114,125,122,11,111,114,105,103,105, + 110,61,123,33,114,125,122,29,115,117,98,109,111,100,117,108, + 101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111, + 110,115,61,123,125,122,6,123,125,40,123,125,41,122,2,44, + 32,41,9,114,49,0,0,0,114,20,0,0,0,114,116,0, + 0,0,114,120,0,0,0,218,6,97,112,112,101,110,100,114, + 123,0,0,0,218,9,95,95,99,108,97,115,115,95,95,114, + 9,0,0,0,218,4,106,111,105,110,41,2,114,33,0,0, + 0,114,59,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,52,0,0,0,123,1,0,0,115,22, + 0,0,0,10,1,10,1,4,255,10,2,18,1,10,1,8, + 1,4,1,6,255,22,2,255,128,122,19,77,111,100,117,108, + 101,83,112,101,99,46,95,95,114,101,112,114,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8, + 0,0,0,67,0,0,0,115,102,0,0,0,124,0,106,0, + 125,2,122,72,124,0,106,1,124,1,106,1,107,2,111,76, + 124,0,106,2,124,1,106,2,107,2,111,76,124,0,106,3, + 124,1,106,3,107,2,111,76,124,2,124,1,106,0,107,2, + 111,76,124,0,106,4,124,1,106,4,107,2,111,76,124,0, + 106,5,124,1,106,5,107,2,87,0,83,0,4,0,116,6, + 121,100,1,0,1,0,1,0,116,7,6,0,89,0,83,0, + 48,0,114,0,0,0,0,41,8,114,123,0,0,0,114,20, + 0,0,0,114,116,0,0,0,114,120,0,0,0,218,6,99, + 97,99,104,101,100,218,12,104,97,115,95,108,111,99,97,116, + 105,111,110,114,2,0,0,0,218,14,78,111,116,73,109,112, + 108,101,109,101,110,116,101,100,41,3,114,33,0,0,0,90, + 5,111,116,104,101,114,90,4,115,109,115,108,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,6,95,95,101, + 113,95,95,133,1,0,0,115,32,0,0,0,6,1,2,1, + 12,1,10,1,2,255,10,2,2,254,8,3,2,253,10,4, + 2,252,10,5,4,251,12,6,10,1,255,128,122,17,77,111, + 100,117,108,101,83,112,101,99,46,95,95,101,113,95,95,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,58,0,0,0,124,0,106, + 0,100,0,117,0,114,52,124,0,106,1,100,0,117,1,114, + 52,124,0,106,2,114,52,116,3,100,0,117,0,114,38,116, + 4,130,1,116,3,160,5,124,0,106,1,161,1,124,0,95, + 0,124,0,106,0,83,0,114,0,0,0,0,41,6,114,125, + 0,0,0,114,120,0,0,0,114,124,0,0,0,218,19,95, + 98,111,111,116,115,116,114,97,112,95,101,120,116,101,114,110, + 97,108,218,19,78,111,116,73,109,112,108,101,109,101,110,116, + 101,100,69,114,114,111,114,90,11,95,103,101,116,95,99,97, + 99,104,101,100,114,51,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,129,0,0,0,145,1,0, + 0,115,14,0,0,0,10,2,16,1,8,1,4,1,14,1, + 6,1,255,128,122,17,77,111,100,117,108,101,83,112,101,99, + 46,99,97,99,104,101,100,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, + 115,10,0,0,0,124,1,124,0,95,0,100,0,83,0,114, + 0,0,0,0,41,1,114,125,0,0,0,41,2,114,33,0, + 0,0,114,129,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,129,0,0,0,154,1,0,0,115, + 4,0,0,0,10,2,255,128,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,32,0,0,0,124,0,106,0,100,1,117,0,114,26, + 124,0,106,1,160,2,100,2,161,1,100,3,25,0,83,0, + 124,0,106,1,83,0,41,4,122,32,84,104,101,32,110,97, + 109,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, + 39,115,32,112,97,114,101,110,116,46,78,218,1,46,114,25, + 0,0,0,41,3,114,123,0,0,0,114,20,0,0,0,218, + 10,114,112,97,114,116,105,116,105,111,110,114,51,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 6,112,97,114,101,110,116,158,1,0,0,115,8,0,0,0, + 10,3,16,1,6,2,255,128,122,17,77,111,100,117,108,101, + 83,112,101,99,46,112,97,114,101,110,116,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0, + 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,114, + 0,0,0,0,41,1,114,124,0,0,0,114,51,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 119,0,0,0,74,1,0,0,115,36,0,0,0,8,0,4, - 1,4,36,2,1,12,255,8,12,8,10,2,12,10,1,4, - 8,10,1,2,3,10,1,2,7,10,1,4,3,14,1,255, - 128,114,119,0,0,0,169,2,114,120,0,0,0,114,122,0, - 0,0,99,2,0,0,0,0,0,0,0,2,0,0,0,6, - 0,0,0,8,0,0,0,67,0,0,0,115,150,0,0,0, - 116,0,124,1,100,1,131,2,114,74,116,1,100,2,117,0, - 114,22,116,2,130,1,116,1,106,3,125,4,124,3,100,2, - 117,0,114,48,124,4,124,0,124,1,100,3,141,2,83,0, - 124,3,114,56,103,0,110,2,100,2,125,5,124,4,124,0, - 124,1,124,5,100,4,141,3,83,0,124,3,100,2,117,0, - 114,134,116,0,124,1,100,5,131,2,114,130,122,14,124,1, - 160,4,124,0,161,1,125,3,87,0,110,26,4,0,116,5, - 121,128,1,0,1,0,1,0,100,2,125,3,89,0,110,6, - 48,0,100,6,125,3,116,6,124,0,124,1,124,2,124,3, - 100,7,141,4,83,0,41,8,122,53,82,101,116,117,114,110, - 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, - 97,115,101,100,32,111,110,32,118,97,114,105,111,117,115,32, - 108,111,97,100,101,114,32,109,101,116,104,111,100,115,46,90, - 12,103,101,116,95,102,105,108,101,110,97,109,101,78,41,1, - 114,116,0,0,0,41,2,114,116,0,0,0,114,123,0,0, - 0,114,122,0,0,0,70,114,142,0,0,0,41,7,114,11, - 0,0,0,114,133,0,0,0,114,134,0,0,0,218,23,115, - 112,101,99,95,102,114,111,109,95,102,105,108,101,95,108,111, - 99,97,116,105,111,110,114,122,0,0,0,114,83,0,0,0, - 114,119,0,0,0,41,6,114,20,0,0,0,114,116,0,0, - 0,114,120,0,0,0,114,122,0,0,0,114,143,0,0,0, - 90,6,115,101,97,114,99,104,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,98,0,0,0,175,1,0,0, - 115,38,0,0,0,10,2,8,1,4,1,6,1,8,2,12, - 1,12,1,6,1,2,1,6,255,8,3,10,1,2,1,14, - 1,12,1,10,1,4,3,16,2,255,128,114,98,0,0,0, - 99,3,0,0,0,0,0,0,0,0,0,0,0,8,0,0, - 0,8,0,0,0,67,0,0,0,115,40,1,0,0,122,10, - 124,0,106,0,125,3,87,0,110,18,4,0,116,1,121,28, - 1,0,1,0,1,0,89,0,110,14,48,0,124,3,100,0, - 117,1,114,42,124,3,83,0,124,0,106,2,125,4,124,1, - 100,0,117,0,114,86,122,10,124,0,106,3,125,1,87,0, - 110,18,4,0,116,1,121,84,1,0,1,0,1,0,89,0, - 110,2,48,0,122,10,124,0,106,4,125,5,87,0,110,22, - 4,0,116,1,121,118,1,0,1,0,1,0,100,0,125,5, - 89,0,110,2,48,0,124,2,100,0,117,0,114,174,124,5, - 100,0,117,0,114,170,122,10,124,1,106,5,125,2,87,0, - 110,26,4,0,116,1,121,168,1,0,1,0,1,0,100,0, - 125,2,89,0,110,6,48,0,124,5,125,2,122,10,124,0, - 106,6,125,6,87,0,110,22,4,0,116,1,121,206,1,0, - 1,0,1,0,100,0,125,6,89,0,110,2,48,0,122,14, - 116,7,124,0,106,8,131,1,125,7,87,0,110,22,4,0, - 116,1,121,244,1,0,1,0,1,0,100,0,125,7,89,0, - 110,2,48,0,116,9,124,4,124,1,124,2,100,1,141,3, - 125,3,124,5,100,0,117,0,144,1,114,18,100,2,110,2, - 100,3,124,3,95,10,124,6,124,3,95,11,124,7,124,3, - 95,12,124,3,83,0,41,4,78,169,1,114,120,0,0,0, - 70,84,41,13,114,113,0,0,0,114,2,0,0,0,114,9, - 0,0,0,114,106,0,0,0,114,115,0,0,0,218,7,95, - 79,82,73,71,73,78,218,10,95,95,99,97,99,104,101,100, - 95,95,218,4,108,105,115,116,218,8,95,95,112,97,116,104, - 95,95,114,119,0,0,0,114,124,0,0,0,114,129,0,0, - 0,114,123,0,0,0,41,8,114,104,0,0,0,114,116,0, - 0,0,114,120,0,0,0,114,103,0,0,0,114,20,0,0, - 0,90,8,108,111,99,97,116,105,111,110,114,129,0,0,0, - 114,123,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,17,95,115,112,101,99,95,102,114,111,109, - 95,109,111,100,117,108,101,201,1,0,0,115,74,0,0,0, - 2,2,10,1,12,1,6,1,8,2,4,1,6,2,8,1, - 2,1,10,1,12,1,6,2,2,1,10,1,12,1,10,1, - 8,1,8,1,2,1,10,1,12,1,10,1,4,2,2,1, - 10,1,12,1,10,1,2,1,14,1,12,1,10,1,14,2, - 20,1,6,1,6,1,4,1,255,128,114,149,0,0,0,70, - 169,1,218,8,111,118,101,114,114,105,100,101,99,2,0,0, - 0,0,0,0,0,1,0,0,0,5,0,0,0,8,0,0, - 0,67,0,0,0,115,214,1,0,0,124,2,115,20,116,0, - 124,1,100,1,100,0,131,3,100,0,117,0,114,52,122,12, - 124,0,106,1,124,1,95,2,87,0,110,18,4,0,116,3, - 121,50,1,0,1,0,1,0,89,0,110,2,48,0,124,2, - 115,72,116,0,124,1,100,2,100,0,131,3,100,0,117,0, - 114,174,124,0,106,4,125,3,124,3,100,0,117,0,114,144, - 124,0,106,5,100,0,117,1,114,144,116,6,100,0,117,0, - 114,108,116,7,130,1,116,6,106,8,125,4,124,4,160,9, - 124,4,161,1,125,3,124,0,106,5,124,3,95,10,124,3, - 124,0,95,4,100,0,124,1,95,11,122,10,124,3,124,1, - 95,12,87,0,110,18,4,0,116,3,121,172,1,0,1,0, - 1,0,89,0,110,2,48,0,124,2,115,194,116,0,124,1, - 100,3,100,0,131,3,100,0,117,0,114,226,122,12,124,0, - 106,13,124,1,95,14,87,0,110,18,4,0,116,3,121,224, - 1,0,1,0,1,0,89,0,110,2,48,0,122,10,124,0, - 124,1,95,15,87,0,110,18,4,0,116,3,121,254,1,0, - 1,0,1,0,89,0,110,2,48,0,124,2,144,1,115,24, - 116,0,124,1,100,4,100,0,131,3,100,0,117,0,144,1, - 114,70,124,0,106,5,100,0,117,1,144,1,114,70,122,12, - 124,0,106,5,124,1,95,16,87,0,110,20,4,0,116,3, - 144,1,121,68,1,0,1,0,1,0,89,0,110,2,48,0, - 124,0,106,17,144,1,114,210,124,2,144,1,115,102,116,0, - 124,1,100,5,100,0,131,3,100,0,117,0,144,1,114,136, - 122,12,124,0,106,18,124,1,95,11,87,0,110,20,4,0, - 116,3,144,1,121,134,1,0,1,0,1,0,89,0,110,2, - 48,0,124,2,144,1,115,160,116,0,124,1,100,6,100,0, - 131,3,100,0,117,0,144,1,114,210,124,0,106,19,100,0, - 117,1,144,1,114,210,122,14,124,0,106,19,124,1,95,20, - 87,0,124,1,83,0,4,0,116,3,144,1,121,208,1,0, - 1,0,1,0,89,0,124,1,83,0,48,0,124,1,83,0, - 41,7,78,114,9,0,0,0,114,106,0,0,0,218,11,95, - 95,112,97,99,107,97,103,101,95,95,114,148,0,0,0,114, - 115,0,0,0,114,146,0,0,0,41,21,114,13,0,0,0, - 114,20,0,0,0,114,9,0,0,0,114,2,0,0,0,114, - 116,0,0,0,114,123,0,0,0,114,133,0,0,0,114,134, - 0,0,0,218,16,95,78,97,109,101,115,112,97,99,101,76, - 111,97,100,101,114,218,7,95,95,110,101,119,95,95,90,5, - 95,112,97,116,104,114,115,0,0,0,114,106,0,0,0,114, - 137,0,0,0,114,152,0,0,0,114,113,0,0,0,114,148, - 0,0,0,114,130,0,0,0,114,120,0,0,0,114,129,0, - 0,0,114,146,0,0,0,41,5,114,103,0,0,0,114,104, - 0,0,0,114,151,0,0,0,114,116,0,0,0,114,153,0, + 130,0,0,0,166,1,0,0,115,4,0,0,0,6,2,255, + 128,122,23,77,111,100,117,108,101,83,112,101,99,46,104,97, + 115,95,108,111,99,97,116,105,111,110,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67, + 0,0,0,115,14,0,0,0,116,0,124,1,131,1,124,0, + 95,1,100,0,83,0,114,0,0,0,0,41,2,218,4,98, + 111,111,108,114,124,0,0,0,41,2,114,33,0,0,0,218, + 5,118,97,108,117,101,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,130,0,0,0,170,1,0,0,115,4, + 0,0,0,14,2,255,128,41,12,114,9,0,0,0,114,8, + 0,0,0,114,1,0,0,0,114,10,0,0,0,114,34,0, + 0,0,114,52,0,0,0,114,132,0,0,0,218,8,112,114, + 111,112,101,114,116,121,114,129,0,0,0,218,6,115,101,116, + 116,101,114,114,137,0,0,0,114,130,0,0,0,114,5,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,18,95,105,110,105,116,95,109,111,100,117,108,101,95, - 97,116,116,114,115,246,1,0,0,115,104,0,0,0,20,4, - 2,1,12,1,12,1,6,1,20,2,6,1,8,1,10,2, - 8,1,4,1,6,1,10,2,8,1,6,1,6,11,2,1, - 10,1,12,1,6,1,20,2,2,1,12,1,12,1,6,1, - 2,2,10,1,12,1,6,1,24,2,12,1,2,1,12,1, - 14,1,6,1,8,2,24,1,2,1,12,1,14,1,6,1, - 24,2,12,1,2,1,10,1,4,3,14,254,2,1,4,1, - 2,255,4,1,255,128,114,155,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,82,0,0,0,100,1,125,1,116,0,124, - 0,106,1,100,2,131,2,114,30,124,0,106,1,160,2,124, - 0,161,1,125,1,110,20,116,0,124,0,106,1,100,3,131, - 2,114,50,116,3,100,4,131,1,130,1,124,1,100,1,117, - 0,114,68,116,4,124,0,106,5,131,1,125,1,116,6,124, - 0,124,1,131,2,1,0,124,1,83,0,41,5,122,43,67, - 114,101,97,116,101,32,97,32,109,111,100,117,108,101,32,98, - 97,115,101,100,32,111,110,32,116,104,101,32,112,114,111,118, - 105,100,101,100,32,115,112,101,99,46,78,218,13,99,114,101, - 97,116,101,95,109,111,100,117,108,101,218,11,101,120,101,99, - 95,109,111,100,117,108,101,122,66,108,111,97,100,101,114,115, - 32,116,104,97,116,32,100,101,102,105,110,101,32,101,120,101, - 99,95,109,111,100,117,108,101,40,41,32,109,117,115,116,32, - 97,108,115,111,32,100,101,102,105,110,101,32,99,114,101,97, - 116,101,95,109,111,100,117,108,101,40,41,41,7,114,11,0, - 0,0,114,116,0,0,0,114,156,0,0,0,114,83,0,0, - 0,114,21,0,0,0,114,20,0,0,0,114,155,0,0,0, - 169,2,114,103,0,0,0,114,104,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,16,109,111,100, - 117,108,101,95,102,114,111,109,95,115,112,101,99,62,2,0, - 0,115,20,0,0,0,4,3,12,1,14,3,12,1,8,1, - 8,2,10,1,10,1,4,1,255,128,114,159,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,67,0,0,0,115,100,0,0,0,124,0,106, - 0,100,1,117,0,114,14,100,2,110,4,124,0,106,0,125, - 1,124,0,106,1,100,1,117,0,114,64,124,0,106,2,100, - 1,117,0,114,50,100,3,160,3,124,1,161,1,83,0,100, - 4,160,3,124,1,124,0,106,2,161,2,83,0,124,0,106, - 4,114,84,100,5,160,3,124,1,124,0,106,1,161,2,83, - 0,100,6,160,3,124,0,106,0,124,0,106,1,161,2,83, - 0,41,7,122,38,82,101,116,117,114,110,32,116,104,101,32, - 114,101,112,114,32,116,111,32,117,115,101,32,102,111,114,32, - 116,104,101,32,109,111,100,117,108,101,46,78,114,108,0,0, - 0,114,109,0,0,0,114,110,0,0,0,114,111,0,0,0, - 250,18,60,109,111,100,117,108,101,32,123,33,114,125,32,40, - 123,125,41,62,41,5,114,20,0,0,0,114,120,0,0,0, - 114,116,0,0,0,114,49,0,0,0,114,130,0,0,0,41, - 2,114,103,0,0,0,114,20,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,114,114,0,0,0,79, - 2,0,0,115,18,0,0,0,20,3,10,1,10,1,10,1, - 14,2,6,2,14,1,16,2,255,128,114,114,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 10,0,0,0,67,0,0,0,115,26,1,0,0,124,0,106, - 0,125,2,116,1,124,2,131,1,143,246,1,0,116,2,106, - 3,160,4,124,2,161,1,124,1,117,1,114,54,100,1,160, - 5,124,2,161,1,125,3,116,6,124,3,124,2,100,2,141, - 2,130,1,122,160,124,0,106,7,100,3,117,0,114,106,124, - 0,106,8,100,3,117,0,114,90,116,6,100,4,124,0,106, - 0,100,2,141,2,130,1,116,9,124,0,124,1,100,5,100, - 6,141,3,1,0,110,80,116,9,124,0,124,1,100,5,100, - 6,141,3,1,0,116,10,124,0,106,7,100,7,131,2,115, - 174,116,11,124,0,106,7,131,1,155,0,100,8,157,2,125, - 3,116,12,160,13,124,3,116,14,161,2,1,0,124,0,106, - 7,160,15,124,2,161,1,1,0,110,12,124,0,106,7,160, - 16,124,1,161,1,1,0,87,0,116,2,106,3,160,17,124, - 0,106,0,161,1,125,1,124,1,116,2,106,3,124,0,106, - 0,60,0,110,28,116,2,106,3,160,17,124,0,106,0,161, - 1,125,1,124,1,116,2,106,3,124,0,106,0,60,0,48, - 0,87,0,100,3,4,0,4,0,131,3,1,0,124,1,83, - 0,49,0,144,1,115,12,48,0,1,0,1,0,1,0,89, - 0,1,0,124,1,83,0,41,9,122,70,69,120,101,99,117, - 116,101,32,116,104,101,32,115,112,101,99,39,115,32,115,112, - 101,99,105,102,105,101,100,32,109,111,100,117,108,101,32,105, - 110,32,97,110,32,101,120,105,115,116,105,110,103,32,109,111, - 100,117,108,101,39,115,32,110,97,109,101,115,112,97,99,101, - 46,122,30,109,111,100,117,108,101,32,123,33,114,125,32,110, - 111,116,32,105,110,32,115,121,115,46,109,111,100,117,108,101, - 115,114,19,0,0,0,78,250,14,109,105,115,115,105,110,103, - 32,108,111,97,100,101,114,84,114,150,0,0,0,114,157,0, - 0,0,250,55,46,101,120,101,99,95,109,111,100,117,108,101, - 40,41,32,110,111,116,32,102,111,117,110,100,59,32,102,97, - 108,108,105,110,103,32,98,97,99,107,32,116,111,32,108,111, - 97,100,95,109,111,100,117,108,101,40,41,41,18,114,20,0, - 0,0,114,54,0,0,0,114,18,0,0,0,114,99,0,0, - 0,114,38,0,0,0,114,49,0,0,0,114,83,0,0,0, - 114,116,0,0,0,114,123,0,0,0,114,155,0,0,0,114, - 11,0,0,0,114,7,0,0,0,114,95,0,0,0,114,96, - 0,0,0,218,13,73,109,112,111,114,116,87,97,114,110,105, - 110,103,218,11,108,111,97,100,95,109,111,100,117,108,101,114, - 157,0,0,0,218,3,112,111,112,41,4,114,103,0,0,0, - 114,104,0,0,0,114,20,0,0,0,114,102,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,100, - 0,0,0,96,2,0,0,115,50,0,0,0,6,2,10,1, - 16,1,10,1,12,1,2,1,10,1,10,1,14,1,16,2, - 14,2,12,1,16,1,12,2,14,1,12,2,2,128,14,4, - 14,1,14,255,26,1,4,1,18,255,4,1,255,128,114,100, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,8,0,0,0,67,0,0,0,115,18,1,0, - 0,122,18,124,0,106,0,160,1,124,0,106,2,161,1,1, - 0,87,0,110,46,1,0,1,0,1,0,124,0,106,2,116, - 3,106,4,118,0,114,64,116,3,106,4,160,5,124,0,106, - 2,161,1,125,1,124,1,116,3,106,4,124,0,106,2,60, - 0,130,0,116,3,106,4,160,5,124,0,106,2,161,1,125, - 1,124,1,116,3,106,4,124,0,106,2,60,0,116,6,124, - 1,100,1,100,0,131,3,100,0,117,0,114,140,122,12,124, - 0,106,0,124,1,95,7,87,0,110,18,4,0,116,8,121, - 138,1,0,1,0,1,0,89,0,110,2,48,0,116,6,124, - 1,100,2,100,0,131,3,100,0,117,0,114,216,122,40,124, - 1,106,9,124,1,95,10,116,11,124,1,100,3,131,2,115, - 194,124,0,106,2,160,12,100,4,161,1,100,5,25,0,124, - 1,95,10,87,0,110,18,4,0,116,8,121,214,1,0,1, - 0,1,0,89,0,110,2,48,0,116,6,124,1,100,6,100, - 0,131,3,100,0,117,0,144,1,114,14,122,12,124,0,124, - 1,95,13,87,0,124,1,83,0,4,0,116,8,144,1,121, - 12,1,0,1,0,1,0,89,0,124,1,83,0,48,0,124, - 1,83,0,41,7,78,114,106,0,0,0,114,152,0,0,0, - 114,148,0,0,0,114,135,0,0,0,114,25,0,0,0,114, - 113,0,0,0,41,14,114,116,0,0,0,114,164,0,0,0, - 114,20,0,0,0,114,18,0,0,0,114,99,0,0,0,114, - 165,0,0,0,114,13,0,0,0,114,106,0,0,0,114,2, - 0,0,0,114,9,0,0,0,114,152,0,0,0,114,11,0, - 0,0,114,136,0,0,0,114,113,0,0,0,114,158,0,0, + 0,114,119,0,0,0,74,1,0,0,115,36,0,0,0,8, + 0,4,1,4,36,2,1,12,255,8,12,8,10,2,12,10, + 1,4,8,10,1,2,3,10,1,2,7,10,1,4,3,14, + 1,255,128,114,119,0,0,0,169,2,114,120,0,0,0,114, + 122,0,0,0,99,2,0,0,0,0,0,0,0,2,0,0, + 0,6,0,0,0,8,0,0,0,67,0,0,0,115,150,0, + 0,0,116,0,124,1,100,1,131,2,114,74,116,1,100,2, + 117,0,114,22,116,2,130,1,116,1,106,3,125,4,124,3, + 100,2,117,0,114,48,124,4,124,0,124,1,100,3,141,2, + 83,0,124,3,114,56,103,0,110,2,100,2,125,5,124,4, + 124,0,124,1,124,5,100,4,141,3,83,0,124,3,100,2, + 117,0,114,134,116,0,124,1,100,5,131,2,114,130,122,14, + 124,1,160,4,124,0,161,1,125,3,87,0,110,26,4,0, + 116,5,121,128,1,0,1,0,1,0,100,2,125,3,89,0, + 110,6,48,0,100,6,125,3,116,6,124,0,124,1,124,2, + 124,3,100,7,141,4,83,0,41,8,122,53,82,101,116,117, + 114,110,32,97,32,109,111,100,117,108,101,32,115,112,101,99, + 32,98,97,115,101,100,32,111,110,32,118,97,114,105,111,117, + 115,32,108,111,97,100,101,114,32,109,101,116,104,111,100,115, + 46,90,12,103,101,116,95,102,105,108,101,110,97,109,101,78, + 41,1,114,116,0,0,0,41,2,114,116,0,0,0,114,123, + 0,0,0,114,122,0,0,0,70,114,142,0,0,0,41,7, + 114,11,0,0,0,114,133,0,0,0,114,134,0,0,0,218, + 23,115,112,101,99,95,102,114,111,109,95,102,105,108,101,95, + 108,111,99,97,116,105,111,110,114,122,0,0,0,114,83,0, + 0,0,114,119,0,0,0,41,6,114,20,0,0,0,114,116, + 0,0,0,114,120,0,0,0,114,122,0,0,0,114,143,0, + 0,0,90,6,115,101,97,114,99,104,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,98,0,0,0,175,1, + 0,0,115,38,0,0,0,10,2,8,1,4,1,6,1,8, + 2,12,1,12,1,6,1,2,1,6,255,8,3,10,1,2, + 1,14,1,12,1,10,1,4,3,16,2,255,128,114,98,0, + 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,8, + 0,0,0,8,0,0,0,67,0,0,0,115,40,1,0,0, + 122,10,124,0,106,0,125,3,87,0,110,18,4,0,116,1, + 121,28,1,0,1,0,1,0,89,0,110,14,48,0,124,3, + 100,0,117,1,114,42,124,3,83,0,124,0,106,2,125,4, + 124,1,100,0,117,0,114,86,122,10,124,0,106,3,125,1, + 87,0,110,18,4,0,116,1,121,84,1,0,1,0,1,0, + 89,0,110,2,48,0,122,10,124,0,106,4,125,5,87,0, + 110,22,4,0,116,1,121,118,1,0,1,0,1,0,100,0, + 125,5,89,0,110,2,48,0,124,2,100,0,117,0,114,174, + 124,5,100,0,117,0,114,170,122,10,124,1,106,5,125,2, + 87,0,110,26,4,0,116,1,121,168,1,0,1,0,1,0, + 100,0,125,2,89,0,110,6,48,0,124,5,125,2,122,10, + 124,0,106,6,125,6,87,0,110,22,4,0,116,1,121,206, + 1,0,1,0,1,0,100,0,125,6,89,0,110,2,48,0, + 122,14,116,7,124,0,106,8,131,1,125,7,87,0,110,22, + 4,0,116,1,121,244,1,0,1,0,1,0,100,0,125,7, + 89,0,110,2,48,0,116,9,124,4,124,1,124,2,100,1, + 141,3,125,3,124,5,100,0,117,0,144,1,114,18,100,2, + 110,2,100,3,124,3,95,10,124,6,124,3,95,11,124,7, + 124,3,95,12,124,3,83,0,41,4,78,169,1,114,120,0, + 0,0,70,84,41,13,114,113,0,0,0,114,2,0,0,0, + 114,9,0,0,0,114,106,0,0,0,114,115,0,0,0,218, + 7,95,79,82,73,71,73,78,218,10,95,95,99,97,99,104, + 101,100,95,95,218,4,108,105,115,116,218,8,95,95,112,97, + 116,104,95,95,114,119,0,0,0,114,124,0,0,0,114,129, + 0,0,0,114,123,0,0,0,41,8,114,104,0,0,0,114, + 116,0,0,0,114,120,0,0,0,114,103,0,0,0,114,20, + 0,0,0,90,8,108,111,99,97,116,105,111,110,114,129,0, + 0,0,114,123,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,17,95,115,112,101,99,95,102,114, + 111,109,95,109,111,100,117,108,101,201,1,0,0,115,74,0, + 0,0,2,2,10,1,12,1,6,1,8,2,4,1,6,2, + 8,1,2,1,10,1,12,1,6,2,2,1,10,1,12,1, + 10,1,8,1,8,1,2,1,10,1,12,1,10,1,4,2, + 2,1,10,1,12,1,10,1,2,1,14,1,12,1,10,1, + 14,2,20,1,6,1,6,1,4,1,255,128,114,149,0,0, + 0,70,169,1,218,8,111,118,101,114,114,105,100,101,99,2, + 0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,8, + 0,0,0,67,0,0,0,115,214,1,0,0,124,2,115,20, + 116,0,124,1,100,1,100,0,131,3,100,0,117,0,114,52, + 122,12,124,0,106,1,124,1,95,2,87,0,110,18,4,0, + 116,3,121,50,1,0,1,0,1,0,89,0,110,2,48,0, + 124,2,115,72,116,0,124,1,100,2,100,0,131,3,100,0, + 117,0,114,174,124,0,106,4,125,3,124,3,100,0,117,0, + 114,144,124,0,106,5,100,0,117,1,114,144,116,6,100,0, + 117,0,114,108,116,7,130,1,116,6,106,8,125,4,124,4, + 160,9,124,4,161,1,125,3,124,0,106,5,124,3,95,10, + 124,3,124,0,95,4,100,0,124,1,95,11,122,10,124,3, + 124,1,95,12,87,0,110,18,4,0,116,3,121,172,1,0, + 1,0,1,0,89,0,110,2,48,0,124,2,115,194,116,0, + 124,1,100,3,100,0,131,3,100,0,117,0,114,226,122,12, + 124,0,106,13,124,1,95,14,87,0,110,18,4,0,116,3, + 121,224,1,0,1,0,1,0,89,0,110,2,48,0,122,10, + 124,0,124,1,95,15,87,0,110,18,4,0,116,3,121,254, + 1,0,1,0,1,0,89,0,110,2,48,0,124,2,144,1, + 115,24,116,0,124,1,100,4,100,0,131,3,100,0,117,0, + 144,1,114,70,124,0,106,5,100,0,117,1,144,1,114,70, + 122,12,124,0,106,5,124,1,95,16,87,0,110,20,4,0, + 116,3,144,1,121,68,1,0,1,0,1,0,89,0,110,2, + 48,0,124,0,106,17,144,1,114,210,124,2,144,1,115,102, + 116,0,124,1,100,5,100,0,131,3,100,0,117,0,144,1, + 114,136,122,12,124,0,106,18,124,1,95,11,87,0,110,20, + 4,0,116,3,144,1,121,134,1,0,1,0,1,0,89,0, + 110,2,48,0,124,2,144,1,115,160,116,0,124,1,100,6, + 100,0,131,3,100,0,117,0,144,1,114,210,124,0,106,19, + 100,0,117,1,144,1,114,210,122,14,124,0,106,19,124,1, + 95,20,87,0,124,1,83,0,4,0,116,3,144,1,121,208, + 1,0,1,0,1,0,89,0,124,1,83,0,48,0,124,1, + 83,0,41,7,78,114,9,0,0,0,114,106,0,0,0,218, + 11,95,95,112,97,99,107,97,103,101,95,95,114,148,0,0, + 0,114,115,0,0,0,114,146,0,0,0,41,21,114,13,0, + 0,0,114,20,0,0,0,114,9,0,0,0,114,2,0,0, + 0,114,116,0,0,0,114,123,0,0,0,114,133,0,0,0, + 114,134,0,0,0,218,16,95,78,97,109,101,115,112,97,99, + 101,76,111,97,100,101,114,218,7,95,95,110,101,119,95,95, + 90,5,95,112,97,116,104,114,115,0,0,0,114,106,0,0, + 0,114,137,0,0,0,114,152,0,0,0,114,113,0,0,0, + 114,148,0,0,0,114,130,0,0,0,114,120,0,0,0,114, + 129,0,0,0,114,146,0,0,0,41,5,114,103,0,0,0, + 114,104,0,0,0,114,151,0,0,0,114,116,0,0,0,114, + 153,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,18,95,105,110,105,116,95,109,111,100,117,108, + 101,95,97,116,116,114,115,246,1,0,0,115,104,0,0,0, + 20,4,2,1,12,1,12,1,6,1,20,2,6,1,8,1, + 10,2,8,1,4,1,6,1,10,2,8,1,6,1,6,11, + 2,1,10,1,12,1,6,1,20,2,2,1,12,1,12,1, + 6,1,2,2,10,1,12,1,6,1,24,2,12,1,2,1, + 12,1,14,1,6,1,8,2,24,1,2,1,12,1,14,1, + 6,1,24,2,12,1,2,1,10,1,4,3,14,254,2,1, + 4,1,2,255,4,1,255,128,114,155,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,82,0,0,0,100,1,125,1,116, + 0,124,0,106,1,100,2,131,2,114,30,124,0,106,1,160, + 2,124,0,161,1,125,1,110,20,116,0,124,0,106,1,100, + 3,131,2,114,50,116,3,100,4,131,1,130,1,124,1,100, + 1,117,0,114,68,116,4,124,0,106,5,131,1,125,1,116, + 6,124,0,124,1,131,2,1,0,124,1,83,0,41,5,122, + 43,67,114,101,97,116,101,32,97,32,109,111,100,117,108,101, + 32,98,97,115,101,100,32,111,110,32,116,104,101,32,112,114, + 111,118,105,100,101,100,32,115,112,101,99,46,78,218,13,99, + 114,101,97,116,101,95,109,111,100,117,108,101,218,11,101,120, + 101,99,95,109,111,100,117,108,101,122,66,108,111,97,100,101, + 114,115,32,116,104,97,116,32,100,101,102,105,110,101,32,101, + 120,101,99,95,109,111,100,117,108,101,40,41,32,109,117,115, + 116,32,97,108,115,111,32,100,101,102,105,110,101,32,99,114, + 101,97,116,101,95,109,111,100,117,108,101,40,41,41,7,114, + 11,0,0,0,114,116,0,0,0,114,156,0,0,0,114,83, + 0,0,0,114,21,0,0,0,114,20,0,0,0,114,155,0, + 0,0,169,2,114,103,0,0,0,114,104,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,16,109, + 111,100,117,108,101,95,102,114,111,109,95,115,112,101,99,62, + 2,0,0,115,20,0,0,0,4,3,12,1,14,3,12,1, + 8,1,8,2,10,1,10,1,4,1,255,128,114,159,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,4,0,0,0,67,0,0,0,115,100,0,0,0,124, + 0,106,0,100,1,117,0,114,14,100,2,110,4,124,0,106, + 0,125,1,124,0,106,1,100,1,117,0,114,64,124,0,106, + 2,100,1,117,0,114,50,100,3,160,3,124,1,161,1,83, + 0,100,4,160,3,124,1,124,0,106,2,161,2,83,0,124, + 0,106,4,114,84,100,5,160,3,124,1,124,0,106,1,161, + 2,83,0,100,6,160,3,124,0,106,0,124,0,106,1,161, + 2,83,0,41,7,122,38,82,101,116,117,114,110,32,116,104, + 101,32,114,101,112,114,32,116,111,32,117,115,101,32,102,111, + 114,32,116,104,101,32,109,111,100,117,108,101,46,78,114,108, + 0,0,0,114,109,0,0,0,114,110,0,0,0,114,111,0, + 0,0,250,18,60,109,111,100,117,108,101,32,123,33,114,125, + 32,40,123,125,41,62,41,5,114,20,0,0,0,114,120,0, + 0,0,114,116,0,0,0,114,49,0,0,0,114,130,0,0, + 0,41,2,114,103,0,0,0,114,20,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,114,0,0, + 0,79,2,0,0,115,18,0,0,0,20,3,10,1,10,1, + 10,1,14,2,6,2,14,1,16,2,255,128,114,114,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,10,0,0,0,67,0,0,0,115,26,1,0,0,124, + 0,106,0,125,2,116,1,124,2,131,1,143,246,1,0,116, + 2,106,3,160,4,124,2,161,1,124,1,117,1,114,54,100, + 1,160,5,124,2,161,1,125,3,116,6,124,3,124,2,100, + 2,141,2,130,1,122,160,124,0,106,7,100,3,117,0,114, + 106,124,0,106,8,100,3,117,0,114,90,116,6,100,4,124, + 0,106,0,100,2,141,2,130,1,116,9,124,0,124,1,100, + 5,100,6,141,3,1,0,110,80,116,9,124,0,124,1,100, + 5,100,6,141,3,1,0,116,10,124,0,106,7,100,7,131, + 2,115,174,116,11,124,0,106,7,131,1,155,0,100,8,157, + 2,125,3,116,12,160,13,124,3,116,14,161,2,1,0,124, + 0,106,7,160,15,124,2,161,1,1,0,110,12,124,0,106, + 7,160,16,124,1,161,1,1,0,87,0,116,2,106,3,160, + 17,124,0,106,0,161,1,125,1,124,1,116,2,106,3,124, + 0,106,0,60,0,110,28,116,2,106,3,160,17,124,0,106, + 0,161,1,125,1,124,1,116,2,106,3,124,0,106,0,60, + 0,48,0,87,0,100,3,4,0,4,0,131,3,1,0,124, + 1,83,0,49,0,144,1,115,12,48,0,1,0,1,0,1, + 0,89,0,1,0,124,1,83,0,41,9,122,70,69,120,101, + 99,117,116,101,32,116,104,101,32,115,112,101,99,39,115,32, + 115,112,101,99,105,102,105,101,100,32,109,111,100,117,108,101, + 32,105,110,32,97,110,32,101,120,105,115,116,105,110,103,32, + 109,111,100,117,108,101,39,115,32,110,97,109,101,115,112,97, + 99,101,46,122,30,109,111,100,117,108,101,32,123,33,114,125, + 32,110,111,116,32,105,110,32,115,121,115,46,109,111,100,117, + 108,101,115,114,19,0,0,0,78,250,14,109,105,115,115,105, + 110,103,32,108,111,97,100,101,114,84,114,150,0,0,0,114, + 157,0,0,0,250,55,46,101,120,101,99,95,109,111,100,117, + 108,101,40,41,32,110,111,116,32,102,111,117,110,100,59,32, + 102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32, + 108,111,97,100,95,109,111,100,117,108,101,40,41,41,18,114, + 20,0,0,0,114,54,0,0,0,114,18,0,0,0,114,99, + 0,0,0,114,38,0,0,0,114,49,0,0,0,114,83,0, + 0,0,114,116,0,0,0,114,123,0,0,0,114,155,0,0, + 0,114,11,0,0,0,114,7,0,0,0,114,95,0,0,0, + 114,96,0,0,0,218,13,73,109,112,111,114,116,87,97,114, + 110,105,110,103,218,11,108,111,97,100,95,109,111,100,117,108, + 101,114,157,0,0,0,218,3,112,111,112,41,4,114,103,0, + 0,0,114,104,0,0,0,114,20,0,0,0,114,102,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,25,95,108,111,97,100,95,98,97,99,107,119,97,114,100, - 95,99,111,109,112,97,116,105,98,108,101,126,2,0,0,115, - 62,0,0,0,2,3,18,1,6,1,12,1,14,1,12,1, - 2,1,14,3,12,1,16,1,2,1,12,1,12,1,6,1, - 16,1,2,1,8,4,10,1,22,1,12,1,6,1,18,1, - 2,1,8,1,4,3,14,254,2,1,4,1,2,255,4,1, - 255,128,114,166,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,11,0,0,0,67,0,0,0, - 115,240,0,0,0,124,0,106,0,100,0,117,1,114,58,116, - 1,124,0,106,0,100,1,131,2,115,58,116,2,124,0,106, - 0,131,1,155,0,100,2,157,2,125,1,116,3,160,4,124, - 1,116,5,161,2,1,0,116,6,124,0,131,1,83,0,116, - 7,124,0,131,1,125,2,100,3,124,0,95,8,122,158,124, - 2,116,9,106,10,124,0,106,11,60,0,122,50,124,0,106, - 0,100,0,117,0,114,122,124,0,106,12,100,0,117,0,114, - 134,116,13,100,4,124,0,106,11,100,5,141,2,130,1,124, - 0,106,0,160,14,124,2,161,1,1,0,87,0,110,40,1, - 0,1,0,1,0,122,14,116,9,106,10,124,0,106,11,61, - 0,87,0,130,0,4,0,116,15,121,176,1,0,1,0,1, - 0,89,0,130,0,48,0,116,9,106,10,160,16,124,0,106, - 11,161,1,125,2,124,2,116,9,106,10,124,0,106,11,60, - 0,116,17,100,6,124,0,106,11,124,0,106,0,131,3,1, - 0,87,0,100,7,124,0,95,8,124,2,83,0,100,7,124, - 0,95,8,48,0,41,8,78,114,157,0,0,0,114,162,0, - 0,0,84,114,161,0,0,0,114,19,0,0,0,122,18,105, - 109,112,111,114,116,32,123,33,114,125,32,35,32,123,33,114, - 125,70,41,18,114,116,0,0,0,114,11,0,0,0,114,7, - 0,0,0,114,95,0,0,0,114,96,0,0,0,114,163,0, - 0,0,114,166,0,0,0,114,159,0,0,0,90,13,95,105, - 110,105,116,105,97,108,105,122,105,110,103,114,18,0,0,0, - 114,99,0,0,0,114,20,0,0,0,114,123,0,0,0,114, - 83,0,0,0,114,157,0,0,0,114,67,0,0,0,114,165, - 0,0,0,114,80,0,0,0,41,3,114,103,0,0,0,114, - 102,0,0,0,114,104,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,14,95,108,111,97,100,95, - 117,110,108,111,99,107,101,100,162,2,0,0,115,58,0,0, - 0,10,2,12,2,16,1,12,2,8,1,8,2,6,5,2, - 1,12,1,2,1,10,1,10,1,14,1,16,3,6,1,2, - 1,12,1,2,3,12,254,2,1,2,1,2,255,14,6,12, - 1,18,1,6,2,4,2,8,254,255,128,114,167,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,8,0,0,0,67,0,0,0,115,54,0,0,0,116,0, - 124,0,106,1,131,1,143,24,1,0,116,2,124,0,131,1, - 87,0,2,0,100,1,4,0,4,0,131,3,1,0,83,0, - 49,0,115,40,48,0,1,0,1,0,1,0,89,0,1,0, - 100,1,83,0,41,2,122,191,82,101,116,117,114,110,32,97, - 32,110,101,119,32,109,111,100,117,108,101,32,111,98,106,101, - 99,116,44,32,108,111,97,100,101,100,32,98,121,32,116,104, - 101,32,115,112,101,99,39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111, - 32,105,116,115,32,112,97,114,101,110,116,46,10,10,32,32, - 32,32,73,102,32,97,32,109,111,100,117,108,101,32,105,115, - 32,97,108,114,101,97,100,121,32,105,110,32,115,121,115,46, - 109,111,100,117,108,101,115,44,32,116,104,97,116,32,101,120, - 105,115,116,105,110,103,32,109,111,100,117,108,101,32,103,101, - 116,115,10,32,32,32,32,99,108,111,98,98,101,114,101,100, - 46,10,10,32,32,32,32,78,41,3,114,54,0,0,0,114, - 20,0,0,0,114,167,0,0,0,169,1,114,103,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 101,0,0,0,207,2,0,0,115,6,0,0,0,12,9,42, - 1,255,128,114,101,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, - 0,115,140,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,90,4,101,5,100,3,100,4,132,0,131,1, - 90,6,101,7,100,20,100,6,100,7,132,1,131,1,90,8, - 101,7,100,21,100,8,100,9,132,1,131,1,90,9,101,5, - 100,10,100,11,132,0,131,1,90,10,101,5,100,12,100,13, - 132,0,131,1,90,11,101,7,101,12,100,14,100,15,132,0, - 131,1,131,1,90,13,101,7,101,12,100,16,100,17,132,0, - 131,1,131,1,90,14,101,7,101,12,100,18,100,19,132,0, - 131,1,131,1,90,15,101,7,101,16,131,1,90,17,100,5, - 83,0,41,22,218,15,66,117,105,108,116,105,110,73,109,112, - 111,114,116,101,114,122,144,77,101,116,97,32,112,97,116,104, - 32,105,109,112,111,114,116,32,102,111,114,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,115,46,10,10,32, - 32,32,32,65,108,108,32,109,101,116,104,111,100,115,32,97, - 114,101,32,101,105,116,104,101,114,32,99,108,97,115,115,32, - 111,114,32,115,116,97,116,105,99,32,109,101,116,104,111,100, - 115,32,116,111,32,97,118,111,105,100,32,116,104,101,32,110, - 101,101,100,32,116,111,10,32,32,32,32,105,110,115,116,97, - 110,116,105,97,116,101,32,116,104,101,32,99,108,97,115,115, - 46,10,10,32,32,32,32,122,8,98,117,105,108,116,45,105, - 110,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,5,0,0,0,67,0,0,0,115,22,0,0,0,100, - 1,124,0,106,0,155,2,100,2,116,1,106,2,155,0,100, - 3,157,5,83,0,41,5,250,115,82,101,116,117,114,110,32, - 114,101,112,114,32,102,111,114,32,116,104,101,32,109,111,100, - 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, - 101,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,32,32,84,104,101,32,105,109,112, - 111,114,116,32,109,97,99,104,105,110,101,114,121,32,100,111, - 101,115,32,116,104,101,32,106,111,98,32,105,116,115,101,108, - 102,46,10,10,32,32,32,32,32,32,32,32,122,8,60,109, - 111,100,117,108,101,32,122,2,32,40,122,2,41,62,78,41, - 3,114,9,0,0,0,114,169,0,0,0,114,145,0,0,0, - 169,1,114,104,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,107,0,0,0,233,2,0,0,115, - 4,0,0,0,22,7,255,128,122,27,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,4,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, - 42,0,0,0,124,2,100,0,117,1,114,12,100,0,83,0, - 116,0,160,1,124,1,161,1,114,38,116,2,124,1,124,0, - 124,0,106,3,100,1,141,3,83,0,100,0,83,0,169,2, - 78,114,144,0,0,0,41,4,114,61,0,0,0,90,10,105, - 115,95,98,117,105,108,116,105,110,114,98,0,0,0,114,145, - 0,0,0,169,4,218,3,99,108,115,114,85,0,0,0,218, - 4,112,97,116,104,218,6,116,97,114,103,101,116,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,9,102,105, - 110,100,95,115,112,101,99,242,2,0,0,115,12,0,0,0, - 8,2,4,1,10,1,16,1,4,2,255,128,122,25,66,117, - 105,108,116,105,110,73,109,112,111,114,116,101,114,46,102,105, - 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, - 115,30,0,0,0,124,0,160,0,124,1,124,2,161,2,125, - 3,124,3,100,1,117,1,114,26,124,3,106,1,83,0,100, - 1,83,0,41,2,122,175,70,105,110,100,32,116,104,101,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,73,102,32,39,112,97, - 116,104,39,32,105,115,32,101,118,101,114,32,115,112,101,99, - 105,102,105,101,100,32,116,104,101,110,32,116,104,101,32,115, - 101,97,114,99,104,32,105,115,32,99,111,110,115,105,100,101, - 114,101,100,32,97,32,102,97,105,108,117,114,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, - 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,41,2,114,177,0,0,0,114,116, - 0,0,0,41,4,114,174,0,0,0,114,85,0,0,0,114, - 175,0,0,0,114,103,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,11,102,105,110,100,95,109, - 111,100,117,108,101,251,2,0,0,115,6,0,0,0,12,9, - 18,1,255,128,122,27,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,4,0,0,0,67,0,0,0,115,46,0,0,0,124, - 0,106,0,116,1,106,2,118,1,114,34,116,3,100,1,160, - 4,124,0,106,0,161,1,124,0,106,0,100,2,141,2,130, - 1,116,5,116,6,106,7,124,0,131,2,83,0,41,4,122, - 24,67,114,101,97,116,101,32,97,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,114,81,0,0,0,114,19, - 0,0,0,78,41,8,114,20,0,0,0,114,18,0,0,0, - 114,82,0,0,0,114,83,0,0,0,114,49,0,0,0,114, - 71,0,0,0,114,61,0,0,0,90,14,99,114,101,97,116, - 101,95,98,117,105,108,116,105,110,114,168,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,156,0, - 0,0,7,3,0,0,115,12,0,0,0,12,3,12,1,4, - 1,6,255,12,2,255,128,122,29,66,117,105,108,116,105,110, - 73,109,112,111,114,116,101,114,46,99,114,101,97,116,101,95, - 109,111,100,117,108,101,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 16,0,0,0,116,0,116,1,106,2,124,0,131,2,1,0, - 100,1,83,0,41,2,122,22,69,120,101,99,32,97,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,78,41, - 3,114,71,0,0,0,114,61,0,0,0,90,12,101,120,101, - 99,95,98,117,105,108,116,105,110,114,171,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,157,0, - 0,0,15,3,0,0,115,4,0,0,0,16,3,255,128,122, - 27,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, - 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, - 122,57,82,101,116,117,114,110,32,78,111,110,101,32,97,115, - 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, - 115,32,100,111,32,110,111,116,32,104,97,118,101,32,99,111, - 100,101,32,111,98,106,101,99,116,115,46,78,114,5,0,0, - 0,169,2,114,174,0,0,0,114,85,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,8,103,101, - 116,95,99,111,100,101,20,3,0,0,115,4,0,0,0,4, - 4,255,128,122,24,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,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,122,56,82,101,116,117,114,110,32,78,111,110,101,32,97, - 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, - 111,117,114,99,101,32,99,111,100,101,46,78,114,5,0,0, - 0,114,179,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,10,103,101,116,95,115,111,117,114,99, - 101,26,3,0,0,115,4,0,0,0,4,4,255,128,122,26, + 114,100,0,0,0,96,2,0,0,115,50,0,0,0,6,2, + 10,1,16,1,10,1,12,1,2,1,10,1,10,1,14,1, + 16,2,14,2,12,1,16,1,12,2,14,1,12,2,2,128, + 14,4,14,1,14,255,26,1,4,1,18,255,4,1,255,128, + 114,100,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,18, + 1,0,0,122,18,124,0,106,0,160,1,124,0,106,2,161, + 1,1,0,87,0,110,46,1,0,1,0,1,0,124,0,106, + 2,116,3,106,4,118,0,114,64,116,3,106,4,160,5,124, + 0,106,2,161,1,125,1,124,1,116,3,106,4,124,0,106, + 2,60,0,130,0,116,3,106,4,160,5,124,0,106,2,161, + 1,125,1,124,1,116,3,106,4,124,0,106,2,60,0,116, + 6,124,1,100,1,100,0,131,3,100,0,117,0,114,140,122, + 12,124,0,106,0,124,1,95,7,87,0,110,18,4,0,116, + 8,121,138,1,0,1,0,1,0,89,0,110,2,48,0,116, + 6,124,1,100,2,100,0,131,3,100,0,117,0,114,216,122, + 40,124,1,106,9,124,1,95,10,116,11,124,1,100,3,131, + 2,115,194,124,0,106,2,160,12,100,4,161,1,100,5,25, + 0,124,1,95,10,87,0,110,18,4,0,116,8,121,214,1, + 0,1,0,1,0,89,0,110,2,48,0,116,6,124,1,100, + 6,100,0,131,3,100,0,117,0,144,1,114,14,122,12,124, + 0,124,1,95,13,87,0,124,1,83,0,4,0,116,8,144, + 1,121,12,1,0,1,0,1,0,89,0,124,1,83,0,48, + 0,124,1,83,0,41,7,78,114,106,0,0,0,114,152,0, + 0,0,114,148,0,0,0,114,135,0,0,0,114,25,0,0, + 0,114,113,0,0,0,41,14,114,116,0,0,0,114,164,0, + 0,0,114,20,0,0,0,114,18,0,0,0,114,99,0,0, + 0,114,165,0,0,0,114,13,0,0,0,114,106,0,0,0, + 114,2,0,0,0,114,9,0,0,0,114,152,0,0,0,114, + 11,0,0,0,114,136,0,0,0,114,113,0,0,0,114,158, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,25,95,108,111,97,100,95,98,97,99,107,119,97, + 114,100,95,99,111,109,112,97,116,105,98,108,101,126,2,0, + 0,115,62,0,0,0,2,3,18,1,6,1,12,1,14,1, + 12,1,2,1,14,3,12,1,16,1,2,1,12,1,12,1, + 6,1,16,1,2,1,8,4,10,1,22,1,12,1,6,1, + 18,1,2,1,8,1,4,3,14,254,2,1,4,1,2,255, + 4,1,255,128,114,166,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,11,0,0,0,67,0, + 0,0,115,240,0,0,0,124,0,106,0,100,0,117,1,114, + 58,116,1,124,0,106,0,100,1,131,2,115,58,116,2,124, + 0,106,0,131,1,155,0,100,2,157,2,125,1,116,3,160, + 4,124,1,116,5,161,2,1,0,116,6,124,0,131,1,83, + 0,116,7,124,0,131,1,125,2,100,3,124,0,95,8,122, + 158,124,2,116,9,106,10,124,0,106,11,60,0,122,50,124, + 0,106,0,100,0,117,0,114,122,124,0,106,12,100,0,117, + 0,114,134,116,13,100,4,124,0,106,11,100,5,141,2,130, + 1,124,0,106,0,160,14,124,2,161,1,1,0,87,0,110, + 40,1,0,1,0,1,0,122,14,116,9,106,10,124,0,106, + 11,61,0,87,0,130,0,4,0,116,15,121,176,1,0,1, + 0,1,0,89,0,130,0,48,0,116,9,106,10,160,16,124, + 0,106,11,161,1,125,2,124,2,116,9,106,10,124,0,106, + 11,60,0,116,17,100,6,124,0,106,11,124,0,106,0,131, + 3,1,0,87,0,100,7,124,0,95,8,124,2,83,0,100, + 7,124,0,95,8,48,0,41,8,78,114,157,0,0,0,114, + 162,0,0,0,84,114,161,0,0,0,114,19,0,0,0,122, + 18,105,109,112,111,114,116,32,123,33,114,125,32,35,32,123, + 33,114,125,70,41,18,114,116,0,0,0,114,11,0,0,0, + 114,7,0,0,0,114,95,0,0,0,114,96,0,0,0,114, + 163,0,0,0,114,166,0,0,0,114,159,0,0,0,90,13, + 95,105,110,105,116,105,97,108,105,122,105,110,103,114,18,0, + 0,0,114,99,0,0,0,114,20,0,0,0,114,123,0,0, + 0,114,83,0,0,0,114,157,0,0,0,114,67,0,0,0, + 114,165,0,0,0,114,80,0,0,0,41,3,114,103,0,0, + 0,114,102,0,0,0,114,104,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,14,95,108,111,97, + 100,95,117,110,108,111,99,107,101,100,162,2,0,0,115,58, + 0,0,0,10,2,12,2,16,1,12,2,8,1,8,2,6, + 5,2,1,12,1,2,1,10,1,10,1,14,1,16,3,6, + 1,2,1,12,1,2,3,12,254,2,1,2,1,2,255,14, + 6,12,1,18,1,6,2,4,2,8,254,255,128,114,167,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,8,0,0,0,67,0,0,0,115,54,0,0,0, + 116,0,124,0,106,1,131,1,143,24,1,0,116,2,124,0, + 131,1,87,0,2,0,100,1,4,0,4,0,131,3,1,0, + 83,0,49,0,115,40,48,0,1,0,1,0,1,0,89,0, + 1,0,100,1,83,0,41,2,122,191,82,101,116,117,114,110, + 32,97,32,110,101,119,32,109,111,100,117,108,101,32,111,98, + 106,101,99,116,44,32,108,111,97,100,101,100,32,98,121,32, + 116,104,101,32,115,112,101,99,39,115,32,108,111,97,100,101, + 114,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,97,100,100,101,100,32, + 116,111,32,105,116,115,32,112,97,114,101,110,116,46,10,10, + 32,32,32,32,73,102,32,97,32,109,111,100,117,108,101,32, + 105,115,32,97,108,114,101,97,100,121,32,105,110,32,115,121, + 115,46,109,111,100,117,108,101,115,44,32,116,104,97,116,32, + 101,120,105,115,116,105,110,103,32,109,111,100,117,108,101,32, + 103,101,116,115,10,32,32,32,32,99,108,111,98,98,101,114, + 101,100,46,10,10,32,32,32,32,78,41,3,114,54,0,0, + 0,114,20,0,0,0,114,167,0,0,0,169,1,114,103,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,101,0,0,0,207,2,0,0,115,6,0,0,0,12, + 9,42,1,255,128,114,101,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, + 0,0,0,115,140,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,90,4,101,5,100,3,100,4,132,0, + 131,1,90,6,101,7,100,20,100,6,100,7,132,1,131,1, + 90,8,101,7,100,21,100,8,100,9,132,1,131,1,90,9, + 101,5,100,10,100,11,132,0,131,1,90,10,101,5,100,12, + 100,13,132,0,131,1,90,11,101,7,101,12,100,14,100,15, + 132,0,131,1,131,1,90,13,101,7,101,12,100,16,100,17, + 132,0,131,1,131,1,90,14,101,7,101,12,100,18,100,19, + 132,0,131,1,131,1,90,15,101,7,101,16,131,1,90,17, + 100,5,83,0,41,22,218,15,66,117,105,108,116,105,110,73, + 109,112,111,114,116,101,114,122,144,77,101,116,97,32,112,97, + 116,104,32,105,109,112,111,114,116,32,102,111,114,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,115,46,10, + 10,32,32,32,32,65,108,108,32,109,101,116,104,111,100,115, + 32,97,114,101,32,101,105,116,104,101,114,32,99,108,97,115, + 115,32,111,114,32,115,116,97,116,105,99,32,109,101,116,104, + 111,100,115,32,116,111,32,97,118,111,105,100,32,116,104,101, + 32,110,101,101,100,32,116,111,10,32,32,32,32,105,110,115, + 116,97,110,116,105,97,116,101,32,116,104,101,32,99,108,97, + 115,115,46,10,10,32,32,32,32,122,8,98,117,105,108,116, + 45,105,110,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,5,0,0,0,67,0,0,0,115,22,0,0, + 0,100,1,124,0,106,0,155,2,100,2,116,1,106,2,155, + 0,100,3,157,5,83,0,41,5,250,115,82,101,116,117,114, + 110,32,114,101,112,114,32,102,111,114,32,116,104,101,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,101,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,84,104,101,32,105, + 109,112,111,114,116,32,109,97,99,104,105,110,101,114,121,32, + 100,111,101,115,32,116,104,101,32,106,111,98,32,105,116,115, + 101,108,102,46,10,10,32,32,32,32,32,32,32,32,122,8, + 60,109,111,100,117,108,101,32,122,2,32,40,122,2,41,62, + 78,41,3,114,9,0,0,0,114,169,0,0,0,114,145,0, + 0,0,169,1,114,104,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,107,0,0,0,233,2,0, + 0,115,4,0,0,0,22,7,255,128,122,27,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,4,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, + 0,115,42,0,0,0,124,2,100,0,117,1,114,12,100,0, + 83,0,116,0,160,1,124,1,161,1,114,38,116,2,124,1, + 124,0,124,0,106,3,100,1,141,3,83,0,100,0,83,0, + 169,2,78,114,144,0,0,0,41,4,114,61,0,0,0,90, + 10,105,115,95,98,117,105,108,116,105,110,114,98,0,0,0, + 114,145,0,0,0,169,4,218,3,99,108,115,114,85,0,0, + 0,218,4,112,97,116,104,218,6,116,97,114,103,101,116,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,9, + 102,105,110,100,95,115,112,101,99,242,2,0,0,115,12,0, + 0,0,8,2,4,1,10,1,16,1,4,2,255,128,122,25, 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,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,3,122,52, - 82,101,116,117,114,110,32,70,97,108,115,101,32,97,115,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, - 32,97,114,101,32,110,101,118,101,114,32,112,97,99,107,97, - 103,101,115,46,70,78,114,5,0,0,0,114,179,0,0,0, + 102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, + 0,0,115,30,0,0,0,124,0,160,0,124,1,124,2,161, + 2,125,3,124,3,100,1,117,1,114,26,124,3,106,1,83, + 0,100,1,83,0,41,2,122,175,70,105,110,100,32,116,104, + 101,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,39, + 112,97,116,104,39,32,105,115,32,101,118,101,114,32,115,112, + 101,99,105,102,105,101,100,32,116,104,101,110,32,116,104,101, + 32,115,101,97,114,99,104,32,105,115,32,99,111,110,115,105, + 100,101,114,101,100,32,97,32,102,97,105,108,117,114,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,102,105,110,100,95,115, + 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,78,41,2,114,177,0,0,0, + 114,116,0,0,0,41,4,114,174,0,0,0,114,85,0,0, + 0,114,175,0,0,0,114,103,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,11,102,105,110,100, + 95,109,111,100,117,108,101,251,2,0,0,115,6,0,0,0, + 12,9,18,1,255,128,122,27,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,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,4,0,0,0,67,0,0,0,115,46,0,0, + 0,124,0,106,0,116,1,106,2,118,1,114,34,116,3,100, + 1,160,4,124,0,106,0,161,1,124,0,106,0,100,2,141, + 2,130,1,116,5,116,6,106,7,124,0,131,2,83,0,41, + 4,122,24,67,114,101,97,116,101,32,97,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,114,81,0,0,0, + 114,19,0,0,0,78,41,8,114,20,0,0,0,114,18,0, + 0,0,114,82,0,0,0,114,83,0,0,0,114,49,0,0, + 0,114,71,0,0,0,114,61,0,0,0,90,14,99,114,101, + 97,116,101,95,98,117,105,108,116,105,110,114,168,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 122,0,0,0,32,3,0,0,115,4,0,0,0,4,4,255, - 128,122,26,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,41,2,78, - 78,41,1,78,41,18,114,9,0,0,0,114,8,0,0,0, - 114,1,0,0,0,114,10,0,0,0,114,145,0,0,0,218, - 12,115,116,97,116,105,99,109,101,116,104,111,100,114,107,0, - 0,0,218,11,99,108,97,115,115,109,101,116,104,111,100,114, - 177,0,0,0,114,178,0,0,0,114,156,0,0,0,114,157, - 0,0,0,114,90,0,0,0,114,180,0,0,0,114,181,0, - 0,0,114,122,0,0,0,114,105,0,0,0,114,164,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,169,0,0,0,222,2,0,0,115,48, - 0,0,0,8,0,4,2,4,7,2,2,10,1,2,8,12, - 1,2,8,12,1,2,11,10,1,2,7,10,1,2,4,2, - 1,12,1,2,4,2,1,12,1,2,4,2,1,12,1,12, - 4,255,128,114,169,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, - 0,115,144,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,90,4,101,5,100,3,100,4,132,0,131,1, - 90,6,101,7,100,22,100,6,100,7,132,1,131,1,90,8, - 101,7,100,23,100,8,100,9,132,1,131,1,90,9,101,5, - 100,10,100,11,132,0,131,1,90,10,101,5,100,12,100,13, - 132,0,131,1,90,11,101,7,100,14,100,15,132,0,131,1, - 90,12,101,7,101,13,100,16,100,17,132,0,131,1,131,1, - 90,14,101,7,101,13,100,18,100,19,132,0,131,1,131,1, - 90,15,101,7,101,13,100,20,100,21,132,0,131,1,131,1, - 90,16,100,5,83,0,41,24,218,14,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,122,142,77,101,116,97,32,112, - 97,116,104,32,105,109,112,111,114,116,32,102,111,114,32,102, - 114,111,122,101,110,32,109,111,100,117,108,101,115,46,10,10, - 32,32,32,32,65,108,108,32,109,101,116,104,111,100,115,32, - 97,114,101,32,101,105,116,104,101,114,32,99,108,97,115,115, - 32,111,114,32,115,116,97,116,105,99,32,109,101,116,104,111, - 100,115,32,116,111,32,97,118,111,105,100,32,116,104,101,32, - 110,101,101,100,32,116,111,10,32,32,32,32,105,110,115,116, - 97,110,116,105,97,116,101,32,116,104,101,32,99,108,97,115, - 115,46,10,10,32,32,32,32,90,6,102,114,111,122,101,110, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,4,0,0,0,67,0,0,0,115,16,0,0,0,100,1, - 160,0,124,0,106,1,116,2,106,3,161,2,83,0,41,3, - 114,170,0,0,0,114,160,0,0,0,78,41,4,114,49,0, - 0,0,114,9,0,0,0,114,184,0,0,0,114,145,0,0, - 0,41,1,218,1,109,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,107,0,0,0,52,3,0,0,115,4, - 0,0,0,16,7,255,128,122,26,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,4,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,5,0,0,0,67,0,0,0,115,30,0, - 0,0,116,0,160,1,124,1,161,1,114,26,116,2,124,1, - 124,0,124,0,106,3,100,1,141,3,83,0,100,0,83,0, - 114,172,0,0,0,41,4,114,61,0,0,0,114,92,0,0, - 0,114,98,0,0,0,114,145,0,0,0,114,173,0,0,0, + 156,0,0,0,7,3,0,0,115,12,0,0,0,12,3,12, + 1,4,1,6,255,12,2,255,128,122,29,66,117,105,108,116, + 105,110,73,109,112,111,114,116,101,114,46,99,114,101,97,116, + 101,95,109,111,100,117,108,101,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,16,0,0,0,116,0,116,1,106,2,124,0,131,2, + 1,0,100,1,83,0,41,2,122,22,69,120,101,99,32,97, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 78,41,3,114,71,0,0,0,114,61,0,0,0,90,12,101, + 120,101,99,95,98,117,105,108,116,105,110,114,171,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 177,0,0,0,61,3,0,0,115,8,0,0,0,10,2,16, - 1,4,2,255,128,122,24,70,114,111,122,101,110,73,109,112, - 111,114,116,101,114,46,102,105,110,100,95,115,112,101,99,99, - 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,18,0,0,0,116,0,160, - 1,124,1,161,1,114,14,124,0,83,0,100,1,83,0,41, - 2,122,93,70,105,110,100,32,97,32,102,114,111,122,101,110, - 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, - 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, - 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110, - 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, - 78,41,2,114,61,0,0,0,114,92,0,0,0,41,3,114, - 174,0,0,0,114,85,0,0,0,114,175,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,178,0, - 0,0,68,3,0,0,115,4,0,0,0,18,7,255,128,122, - 26,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,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, - 42,85,115,101,32,100,101,102,97,117,108,116,32,115,101,109, - 97,110,116,105,99,115,32,102,111,114,32,109,111,100,117,108, - 101,32,99,114,101,97,116,105,111,110,46,78,114,5,0,0, - 0,114,168,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,156,0,0,0,77,3,0,0,115,4, - 0,0,0,4,0,255,128,122,28,70,114,111,122,101,110,73, - 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, - 111,100,117,108,101,99,1,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,64, - 0,0,0,124,0,106,0,106,1,125,1,116,2,160,3,124, - 1,161,1,115,36,116,4,100,1,160,5,124,1,161,1,124, - 1,100,2,141,2,130,1,116,6,116,2,106,7,124,1,131, - 2,125,2,116,8,124,2,124,0,106,9,131,2,1,0,100, - 0,83,0,114,91,0,0,0,41,10,114,113,0,0,0,114, - 20,0,0,0,114,61,0,0,0,114,92,0,0,0,114,83, - 0,0,0,114,49,0,0,0,114,71,0,0,0,218,17,103, - 101,116,95,102,114,111,122,101,110,95,111,98,106,101,99,116, - 218,4,101,120,101,99,114,14,0,0,0,41,3,114,104,0, - 0,0,114,20,0,0,0,218,4,99,111,100,101,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,157,0,0, - 0,81,3,0,0,115,16,0,0,0,8,2,10,1,10,1, - 2,1,6,255,12,2,16,1,255,128,122,26,70,114,111,122, - 101,110,73,109,112,111,114,116,101,114,46,101,120,101,99,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 10,0,0,0,116,0,124,0,124,1,131,2,83,0,41,2, - 122,95,76,111,97,100,32,97,32,102,114,111,122,101,110,32, - 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, - 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, - 32,78,41,1,114,105,0,0,0,114,179,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,164,0, - 0,0,90,3,0,0,115,4,0,0,0,10,8,255,128,122, - 26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,10,0,0,0,116,0,160,1,124,1,161, - 1,83,0,41,2,122,45,82,101,116,117,114,110,32,116,104, - 101,32,99,111,100,101,32,111,98,106,101,99,116,32,102,111, - 114,32,116,104,101,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,46,78,41,2,114,61,0,0,0,114,186,0,0, - 0,114,179,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,180,0,0,0,100,3,0,0,115,4, - 0,0,0,10,4,255,128,122,23,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,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, - 83,0,41,2,122,54,82,101,116,117,114,110,32,78,111,110, - 101,32,97,115,32,102,114,111,122,101,110,32,109,111,100,117, + 157,0,0,0,15,3,0,0,115,4,0,0,0,16,3,255, + 128,122,27,66,117,105,108,116,105,110,73,109,112,111,114,116, + 101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, + 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, + 41,2,122,57,82,101,116,117,114,110,32,78,111,110,101,32, + 97,115,32,98,117,105,108,116,45,105,110,32,109,111,100,117, 108,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32, - 115,111,117,114,99,101,32,99,111,100,101,46,78,114,5,0, - 0,0,114,179,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,181,0,0,0,106,3,0,0,115, - 4,0,0,0,4,4,255,128,122,25,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,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,10,0,0, - 0,116,0,160,1,124,1,161,1,83,0,41,2,122,46,82, - 101,116,117,114,110,32,84,114,117,101,32,105,102,32,116,104, - 101,32,102,114,111,122,101,110,32,109,111,100,117,108,101,32, - 105,115,32,97,32,112,97,99,107,97,103,101,46,78,41,2, - 114,61,0,0,0,90,17,105,115,95,102,114,111,122,101,110, - 95,112,97,99,107,97,103,101,114,179,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,122,0,0, - 0,112,3,0,0,115,4,0,0,0,10,4,255,128,122,25, - 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,41,2,78,78,41,1,78, - 41,17,114,9,0,0,0,114,8,0,0,0,114,1,0,0, - 0,114,10,0,0,0,114,145,0,0,0,114,182,0,0,0, - 114,107,0,0,0,114,183,0,0,0,114,177,0,0,0,114, - 178,0,0,0,114,156,0,0,0,114,157,0,0,0,114,164, - 0,0,0,114,94,0,0,0,114,180,0,0,0,114,181,0, - 0,0,114,122,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,184,0,0,0, - 41,3,0,0,115,50,0,0,0,8,0,4,2,4,7,2, - 2,10,1,2,8,12,1,2,6,12,1,2,8,10,1,2, - 3,10,1,2,8,10,1,2,9,2,1,12,1,2,4,2, - 1,12,1,2,4,2,1,16,1,255,128,114,184,0,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,64,0,0,0,115,32,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,83,0,41,7, - 218,18,95,73,109,112,111,114,116,76,111,99,107,67,111,110, - 116,101,120,116,122,36,67,111,110,116,101,120,116,32,109,97, - 110,97,103,101,114,32,102,111,114,32,116,104,101,32,105,109, - 112,111,114,116,32,108,111,99,107,46,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, - 0,0,0,115,12,0,0,0,116,0,160,1,161,0,1,0, - 100,1,83,0,41,2,122,24,65,99,113,117,105,114,101,32, - 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, - 78,41,2,114,61,0,0,0,114,62,0,0,0,114,51,0, + 99,111,100,101,32,111,98,106,101,99,116,115,46,78,114,5, + 0,0,0,169,2,114,174,0,0,0,114,85,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,8, + 103,101,116,95,99,111,100,101,20,3,0,0,115,4,0,0, + 0,4,4,255,128,122,24,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,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, + 0,41,2,122,56,82,101,116,117,114,110,32,78,111,110,101, + 32,97,115,32,98,117,105,108,116,45,105,110,32,109,111,100, + 117,108,101,115,32,100,111,32,110,111,116,32,104,97,118,101, + 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,5, + 0,0,0,114,179,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,10,103,101,116,95,115,111,117, + 114,99,101,26,3,0,0,115,4,0,0,0,4,4,255,128, + 122,26,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,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,3, + 122,52,82,101,116,117,114,110,32,70,97,108,115,101,32,97, + 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,115,32,97,114,101,32,110,101,118,101,114,32,112,97,99, + 107,97,103,101,115,46,70,78,114,5,0,0,0,114,179,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,58,0,0,0,125,3,0,0,115,4,0,0,0,12, - 2,255,128,122,28,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,0,0,0,0,4,0, - 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,116, - 0,160,1,161,0,1,0,100,1,83,0,41,2,122,60,82, - 101,108,101,97,115,101,32,116,104,101,32,105,109,112,111,114, - 116,32,108,111,99,107,32,114,101,103,97,114,100,108,101,115, - 115,32,111,102,32,97,110,121,32,114,97,105,115,101,100,32, - 101,120,99,101,112,116,105,111,110,115,46,78,41,2,114,61, - 0,0,0,114,64,0,0,0,41,4,114,33,0,0,0,218, - 8,101,120,99,95,116,121,112,101,218,9,101,120,99,95,118, - 97,108,117,101,218,13,101,120,99,95,116,114,97,99,101,98, - 97,99,107,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,60,0,0,0,129,3,0,0,115,4,0,0,0, - 12,2,255,128,122,27,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,41,6,114,9,0,0,0,114,8,0,0,0,114,1, - 0,0,0,114,10,0,0,0,114,58,0,0,0,114,60,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,189,0,0,0,121,3,0,0,115, - 10,0,0,0,8,0,4,2,8,2,12,4,255,128,114,189, - 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,5,0,0,0,67,0,0,0,115,64,0,0, - 0,124,1,160,0,100,1,124,2,100,2,24,0,161,2,125, - 3,116,1,124,3,131,1,124,2,107,0,114,36,116,2,100, - 3,131,1,130,1,124,3,100,4,25,0,125,4,124,0,114, - 60,100,5,160,3,124,4,124,0,161,2,83,0,124,4,83, - 0,41,7,122,50,82,101,115,111,108,118,101,32,97,32,114, - 101,108,97,116,105,118,101,32,109,111,100,117,108,101,32,110, - 97,109,101,32,116,111,32,97,110,32,97,98,115,111,108,117, - 116,101,32,111,110,101,46,114,135,0,0,0,114,42,0,0, - 0,122,50,97,116,116,101,109,112,116,101,100,32,114,101,108, - 97,116,105,118,101,32,105,109,112,111,114,116,32,98,101,121, - 111,110,100,32,116,111,112,45,108,101,118,101,108,32,112,97, - 99,107,97,103,101,114,25,0,0,0,250,5,123,125,46,123, - 125,78,41,4,218,6,114,115,112,108,105,116,218,3,108,101, - 110,114,83,0,0,0,114,49,0,0,0,41,5,114,20,0, - 0,0,218,7,112,97,99,107,97,103,101,218,5,108,101,118, - 101,108,90,4,98,105,116,115,90,4,98,97,115,101,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,13,95, - 114,101,115,111,108,118,101,95,110,97,109,101,134,3,0,0, - 115,12,0,0,0,16,2,12,1,8,1,8,1,20,1,255, - 128,114,198,0,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, - 34,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, - 124,3,100,0,117,0,114,24,100,0,83,0,116,1,124,1, - 124,3,131,2,83,0,114,0,0,0,0,41,2,114,178,0, - 0,0,114,98,0,0,0,41,4,218,6,102,105,110,100,101, - 114,114,20,0,0,0,114,175,0,0,0,114,116,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 17,95,102,105,110,100,95,115,112,101,99,95,108,101,103,97, - 99,121,143,3,0,0,115,10,0,0,0,12,3,8,1,4, - 1,10,1,255,128,114,200,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,10,0,0,0,10,0,0,0,67, - 0,0,0,115,28,1,0,0,116,0,106,1,125,3,124,3, - 100,1,117,0,114,22,116,2,100,2,131,1,130,1,124,3, - 115,38,116,3,160,4,100,3,116,5,161,2,1,0,124,0, - 116,0,106,6,118,0,125,4,124,3,68,0,93,226,125,5, - 116,7,131,0,143,94,1,0,122,10,124,5,106,8,125,6, - 87,0,110,54,4,0,116,9,121,128,1,0,1,0,1,0, - 116,10,124,5,124,0,124,1,131,3,125,7,124,7,100,1, - 117,0,114,124,89,0,87,0,100,1,4,0,4,0,131,3, - 1,0,113,52,89,0,110,14,48,0,124,6,124,0,124,1, - 124,2,131,3,125,7,87,0,100,1,4,0,4,0,131,3, - 1,0,110,16,49,0,115,162,48,0,1,0,1,0,1,0, - 89,0,1,0,124,7,100,1,117,1,114,52,124,4,144,1, - 115,16,124,0,116,0,106,6,118,0,144,1,114,16,116,0, - 106,6,124,0,25,0,125,8,122,10,124,8,106,11,125,9, - 87,0,110,26,4,0,116,9,121,244,1,0,1,0,1,0, - 124,7,6,0,89,0,2,0,1,0,83,0,48,0,124,9, - 100,1,117,0,144,1,114,8,124,7,2,0,1,0,83,0, - 124,9,2,0,1,0,83,0,124,7,2,0,1,0,83,0, - 100,1,83,0,41,4,122,21,70,105,110,100,32,97,32,109, - 111,100,117,108,101,39,115,32,115,112,101,99,46,78,122,53, - 115,121,115,46,109,101,116,97,95,112,97,116,104,32,105,115, - 32,78,111,110,101,44,32,80,121,116,104,111,110,32,105,115, - 32,108,105,107,101,108,121,32,115,104,117,116,116,105,110,103, - 32,100,111,119,110,122,22,115,121,115,46,109,101,116,97,95, - 112,97,116,104,32,105,115,32,101,109,112,116,121,41,12,114, - 18,0,0,0,218,9,109,101,116,97,95,112,97,116,104,114, - 83,0,0,0,114,95,0,0,0,114,96,0,0,0,114,163, - 0,0,0,114,99,0,0,0,114,189,0,0,0,114,177,0, - 0,0,114,2,0,0,0,114,200,0,0,0,114,113,0,0, - 0,41,10,114,20,0,0,0,114,175,0,0,0,114,176,0, - 0,0,114,201,0,0,0,90,9,105,115,95,114,101,108,111, - 97,100,114,199,0,0,0,114,177,0,0,0,114,103,0,0, - 0,114,104,0,0,0,114,113,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,10,95,102,105,110, - 100,95,115,112,101,99,152,3,0,0,115,56,0,0,0,6, - 2,8,1,8,2,4,3,12,1,10,5,8,1,8,1,2, - 1,10,1,12,1,12,1,8,1,22,1,42,2,8,1,18, - 2,10,1,2,1,10,1,12,1,14,4,10,2,8,1,8, - 2,8,2,4,2,255,128,114,202,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, - 0,67,0,0,0,115,110,0,0,0,116,0,124,0,116,1, - 131,2,115,28,116,2,100,1,160,3,116,4,124,0,131,1, - 161,1,131,1,130,1,124,2,100,2,107,0,114,44,116,5, - 100,3,131,1,130,1,124,2,100,2,107,4,114,82,116,0, - 124,1,116,1,131,2,115,70,116,2,100,4,131,1,130,1, - 124,1,115,82,116,6,100,5,131,1,130,1,124,0,115,106, - 124,2,100,2,107,2,114,102,116,5,100,6,131,1,130,1, - 100,7,83,0,100,7,83,0,41,8,122,28,86,101,114,105, - 102,121,32,97,114,103,117,109,101,110,116,115,32,97,114,101, - 32,34,115,97,110,101,34,46,122,31,109,111,100,117,108,101, - 32,110,97,109,101,32,109,117,115,116,32,98,101,32,115,116, - 114,44,32,110,111,116,32,123,125,114,25,0,0,0,122,18, - 108,101,118,101,108,32,109,117,115,116,32,98,101,32,62,61, - 32,48,122,31,95,95,112,97,99,107,97,103,101,95,95,32, - 110,111,116,32,115,101,116,32,116,111,32,97,32,115,116,114, - 105,110,103,122,54,97,116,116,101,109,112,116,101,100,32,114, - 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,119, - 105,116,104,32,110,111,32,107,110,111,119,110,32,112,97,114, - 101,110,116,32,112,97,99,107,97,103,101,122,17,69,109,112, - 116,121,32,109,111,100,117,108,101,32,110,97,109,101,78,41, - 7,218,10,105,115,105,110,115,116,97,110,99,101,218,3,115, - 116,114,218,9,84,121,112,101,69,114,114,111,114,114,49,0, - 0,0,114,3,0,0,0,218,10,86,97,108,117,101,69,114, - 114,111,114,114,83,0,0,0,169,3,114,20,0,0,0,114, - 196,0,0,0,114,197,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,13,95,115,97,110,105,116, - 121,95,99,104,101,99,107,199,3,0,0,115,26,0,0,0, - 10,2,18,1,8,1,8,1,8,1,10,1,8,1,4,1, - 8,1,12,2,8,1,8,255,255,128,114,208,0,0,0,122, - 16,78,111,32,109,111,100,117,108,101,32,110,97,109,101,100, - 32,122,4,123,33,114,125,99,2,0,0,0,0,0,0,0, - 0,0,0,0,9,0,0,0,8,0,0,0,67,0,0,0, - 115,20,1,0,0,100,0,125,2,124,0,160,0,100,1,161, - 1,100,2,25,0,125,3,124,3,114,128,124,3,116,1,106, - 2,118,1,114,42,116,3,124,1,124,3,131,2,1,0,124, - 0,116,1,106,2,118,0,114,62,116,1,106,2,124,0,25, - 0,83,0,116,1,106,2,124,3,25,0,125,4,122,10,124, - 4,106,4,125,2,87,0,110,44,4,0,116,5,121,126,1, - 0,1,0,1,0,116,6,100,3,23,0,160,7,124,0,124, - 3,161,2,125,5,116,8,124,5,124,0,100,4,141,2,100, - 0,130,2,48,0,116,9,124,0,124,2,131,2,125,6,124, - 6,100,0,117,0,114,164,116,8,116,6,160,7,124,0,161, - 1,124,0,100,4,141,2,130,1,116,10,124,6,131,1,125, - 7,124,3,144,1,114,16,116,1,106,2,124,3,25,0,125, - 4,124,0,160,0,100,1,161,1,100,5,25,0,125,8,122, - 18,116,11,124,4,124,8,124,7,131,3,1,0,87,0,124, - 7,83,0,4,0,116,5,144,1,121,14,1,0,1,0,1, - 0,100,6,124,3,155,2,100,7,124,8,155,2,157,4,125, - 5,116,12,160,13,124,5,116,14,161,2,1,0,89,0,124, - 7,83,0,48,0,124,7,83,0,41,8,78,114,135,0,0, - 0,114,25,0,0,0,122,23,59,32,123,33,114,125,32,105, - 115,32,110,111,116,32,97,32,112,97,99,107,97,103,101,114, - 19,0,0,0,233,2,0,0,0,122,27,67,97,110,110,111, - 116,32,115,101,116,32,97,110,32,97,116,116,114,105,98,117, - 116,101,32,111,110,32,122,18,32,102,111,114,32,99,104,105, - 108,100,32,109,111,100,117,108,101,32,41,15,114,136,0,0, - 0,114,18,0,0,0,114,99,0,0,0,114,71,0,0,0, - 114,148,0,0,0,114,2,0,0,0,218,8,95,69,82,82, - 95,77,83,71,114,49,0,0,0,218,19,77,111,100,117,108, - 101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,202, - 0,0,0,114,167,0,0,0,114,12,0,0,0,114,95,0, - 0,0,114,96,0,0,0,114,163,0,0,0,41,9,114,20, - 0,0,0,218,7,105,109,112,111,114,116,95,114,175,0,0, - 0,114,137,0,0,0,90,13,112,97,114,101,110,116,95,109, - 111,100,117,108,101,114,102,0,0,0,114,103,0,0,0,114, - 104,0,0,0,90,5,99,104,105,108,100,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,23,95,102,105,110, - 100,95,97,110,100,95,108,111,97,100,95,117,110,108,111,99, - 107,101,100,218,3,0,0,115,60,0,0,0,4,1,14,1, - 4,1,10,1,10,1,10,2,10,1,10,1,2,1,10,1, - 12,1,16,1,16,1,10,1,8,1,18,1,8,2,6,1, - 10,2,14,1,2,1,14,1,4,4,14,253,16,1,14,1, - 4,1,2,255,4,1,255,128,114,213,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0, - 0,0,67,0,0,0,115,128,0,0,0,116,0,124,0,131, - 1,143,62,1,0,116,1,106,2,160,3,124,0,116,4,161, - 2,125,2,124,2,116,4,117,0,114,56,116,5,124,0,124, - 1,131,2,87,0,2,0,100,1,4,0,4,0,131,3,1, - 0,83,0,87,0,100,1,4,0,4,0,131,3,1,0,110, - 16,49,0,115,76,48,0,1,0,1,0,1,0,89,0,1, - 0,124,2,100,1,117,0,114,116,100,2,160,6,124,0,161, - 1,125,3,116,7,124,3,124,0,100,3,141,2,130,1,116, - 8,124,0,131,1,1,0,124,2,83,0,41,4,122,25,70, - 105,110,100,32,97,110,100,32,108,111,97,100,32,116,104,101, - 32,109,111,100,117,108,101,46,78,122,40,105,109,112,111,114, - 116,32,111,102,32,123,125,32,104,97,108,116,101,100,59,32, - 78,111,110,101,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,114,19,0,0,0,41,9,114,54,0,0,0,114, - 18,0,0,0,114,99,0,0,0,114,38,0,0,0,218,14, - 95,78,69,69,68,83,95,76,79,65,68,73,78,71,114,213, - 0,0,0,114,49,0,0,0,114,211,0,0,0,114,69,0, - 0,0,41,4,114,20,0,0,0,114,212,0,0,0,114,104, - 0,0,0,114,79,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,14,95,102,105,110,100,95,97, - 110,100,95,108,111,97,100,253,3,0,0,115,24,0,0,0, - 10,2,14,1,8,1,54,1,8,2,4,1,2,1,4,255, - 12,2,8,2,4,1,255,128,114,215,0,0,0,114,25,0, - 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,4,0,0,0,67,0,0,0,115,42,0,0,0, - 116,0,124,0,124,1,124,2,131,3,1,0,124,2,100,1, - 107,4,114,32,116,1,124,0,124,1,124,2,131,3,125,0, - 116,2,124,0,116,3,131,2,83,0,41,3,97,50,1,0, - 0,73,109,112,111,114,116,32,97,110,100,32,114,101,116,117, - 114,110,32,116,104,101,32,109,111,100,117,108,101,32,98,97, - 115,101,100,32,111,110,32,105,116,115,32,110,97,109,101,44, - 32,116,104,101,32,112,97,99,107,97,103,101,32,116,104,101, - 32,99,97,108,108,32,105,115,10,32,32,32,32,98,101,105, - 110,103,32,109,97,100,101,32,102,114,111,109,44,32,97,110, - 100,32,116,104,101,32,108,101,118,101,108,32,97,100,106,117, - 115,116,109,101,110,116,46,10,10,32,32,32,32,84,104,105, - 115,32,102,117,110,99,116,105,111,110,32,114,101,112,114,101, - 115,101,110,116,115,32,116,104,101,32,103,114,101,97,116,101, - 115,116,32,99,111,109,109,111,110,32,100,101,110,111,109,105, - 110,97,116,111,114,32,111,102,32,102,117,110,99,116,105,111, - 110,97,108,105,116,121,10,32,32,32,32,98,101,116,119,101, - 101,110,32,105,109,112,111,114,116,95,109,111,100,117,108,101, - 32,97,110,100,32,95,95,105,109,112,111,114,116,95,95,46, - 32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,115, - 101,116,116,105,110,103,32,95,95,112,97,99,107,97,103,101, - 95,95,32,105,102,10,32,32,32,32,116,104,101,32,108,111, - 97,100,101,114,32,100,105,100,32,110,111,116,46,10,10,32, - 32,32,32,114,25,0,0,0,78,41,4,114,208,0,0,0, - 114,198,0,0,0,114,215,0,0,0,218,11,95,103,99,100, - 95,105,109,112,111,114,116,114,207,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,216,0,0,0, - 13,4,0,0,115,10,0,0,0,12,9,8,1,12,1,10, - 1,255,128,114,216,0,0,0,169,1,218,9,114,101,99,117, - 114,115,105,118,101,99,3,0,0,0,0,0,0,0,1,0, - 0,0,8,0,0,0,11,0,0,0,67,0,0,0,115,216, - 0,0,0,124,1,68,0,93,204,125,4,116,0,124,4,116, - 1,131,2,115,64,124,3,114,34,124,0,106,2,100,1,23, - 0,125,5,110,4,100,2,125,5,116,3,100,3,124,5,155, - 0,100,4,116,4,124,4,131,1,106,2,155,0,157,4,131, - 1,130,1,124,4,100,5,107,2,114,106,124,3,115,4,116, - 5,124,0,100,6,131,2,114,4,116,6,124,0,124,0,106, - 7,124,2,100,7,100,8,141,4,1,0,113,4,116,5,124, - 0,124,4,131,2,115,4,100,9,160,8,124,0,106,2,124, - 4,161,2,125,6,122,14,116,9,124,2,124,6,131,2,1, - 0,87,0,113,4,4,0,116,10,121,214,1,0,125,7,1, - 0,122,42,124,7,106,11,124,6,107,2,114,200,116,12,106, - 13,160,14,124,6,116,15,161,2,100,10,117,1,114,200,87, - 0,89,0,100,10,125,7,126,7,113,4,130,0,100,10,125, - 7,126,7,48,0,124,0,83,0,48,0,41,11,122,238,70, - 105,103,117,114,101,32,111,117,116,32,119,104,97,116,32,95, - 95,105,109,112,111,114,116,95,95,32,115,104,111,117,108,100, - 32,114,101,116,117,114,110,46,10,10,32,32,32,32,84,104, - 101,32,105,109,112,111,114,116,95,32,112,97,114,97,109,101, - 116,101,114,32,105,115,32,97,32,99,97,108,108,97,98,108, - 101,32,119,104,105,99,104,32,116,97,107,101,115,32,116,104, - 101,32,110,97,109,101,32,111,102,32,109,111,100,117,108,101, - 32,116,111,10,32,32,32,32,105,109,112,111,114,116,46,32, - 73,116,32,105,115,32,114,101,113,117,105,114,101,100,32,116, - 111,32,100,101,99,111,117,112,108,101,32,116,104,101,32,102, - 117,110,99,116,105,111,110,32,102,114,111,109,32,97,115,115, - 117,109,105,110,103,32,105,109,112,111,114,116,108,105,98,39, - 115,10,32,32,32,32,105,109,112,111,114,116,32,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,32,105,115,32,100, - 101,115,105,114,101,100,46,10,10,32,32,32,32,122,8,46, - 95,95,97,108,108,95,95,122,13,96,96,102,114,111,109,32, - 108,105,115,116,39,39,122,8,73,116,101,109,32,105,110,32, - 122,18,32,109,117,115,116,32,98,101,32,115,116,114,44,32, - 110,111,116,32,250,1,42,218,7,95,95,97,108,108,95,95, - 84,114,217,0,0,0,114,193,0,0,0,78,41,16,114,203, - 0,0,0,114,204,0,0,0,114,9,0,0,0,114,205,0, - 0,0,114,3,0,0,0,114,11,0,0,0,218,16,95,104, - 97,110,100,108,101,95,102,114,111,109,108,105,115,116,114,220, - 0,0,0,114,49,0,0,0,114,71,0,0,0,114,211,0, - 0,0,114,20,0,0,0,114,18,0,0,0,114,99,0,0, - 0,114,38,0,0,0,114,214,0,0,0,41,8,114,104,0, - 0,0,218,8,102,114,111,109,108,105,115,116,114,212,0,0, - 0,114,218,0,0,0,218,1,120,90,5,119,104,101,114,101, - 90,9,102,114,111,109,95,110,97,109,101,90,3,101,120,99, + 0,114,122,0,0,0,32,3,0,0,115,4,0,0,0,4, + 4,255,128,122,26,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,41, + 2,78,78,41,1,78,41,18,114,9,0,0,0,114,8,0, + 0,0,114,1,0,0,0,114,10,0,0,0,114,145,0,0, + 0,218,12,115,116,97,116,105,99,109,101,116,104,111,100,114, + 107,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111, + 100,114,177,0,0,0,114,178,0,0,0,114,156,0,0,0, + 114,157,0,0,0,114,90,0,0,0,114,180,0,0,0,114, + 181,0,0,0,114,122,0,0,0,114,105,0,0,0,114,164, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,169,0,0,0,222,2,0,0, + 115,48,0,0,0,8,0,4,2,4,7,2,2,10,1,2, + 8,12,1,2,8,12,1,2,11,10,1,2,7,10,1,2, + 4,2,1,12,1,2,4,2,1,12,1,2,4,2,1,12, + 1,12,4,255,128,114,169,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, + 0,0,0,115,144,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,90,4,101,5,100,3,100,4,132,0, + 131,1,90,6,101,7,100,22,100,6,100,7,132,1,131,1, + 90,8,101,7,100,23,100,8,100,9,132,1,131,1,90,9, + 101,5,100,10,100,11,132,0,131,1,90,10,101,5,100,12, + 100,13,132,0,131,1,90,11,101,7,100,14,100,15,132,0, + 131,1,90,12,101,7,101,13,100,16,100,17,132,0,131,1, + 131,1,90,14,101,7,101,13,100,18,100,19,132,0,131,1, + 131,1,90,15,101,7,101,13,100,20,100,21,132,0,131,1, + 131,1,90,16,100,5,83,0,41,24,218,14,70,114,111,122, + 101,110,73,109,112,111,114,116,101,114,122,142,77,101,116,97, + 32,112,97,116,104,32,105,109,112,111,114,116,32,102,111,114, + 32,102,114,111,122,101,110,32,109,111,100,117,108,101,115,46, + 10,10,32,32,32,32,65,108,108,32,109,101,116,104,111,100, + 115,32,97,114,101,32,101,105,116,104,101,114,32,99,108,97, + 115,115,32,111,114,32,115,116,97,116,105,99,32,109,101,116, + 104,111,100,115,32,116,111,32,97,118,111,105,100,32,116,104, + 101,32,110,101,101,100,32,116,111,10,32,32,32,32,105,110, + 115,116,97,110,116,105,97,116,101,32,116,104,101,32,99,108, + 97,115,115,46,10,10,32,32,32,32,90,6,102,114,111,122, + 101,110,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,4,0,0,0,67,0,0,0,115,16,0,0,0, + 100,1,160,0,124,0,106,1,116,2,106,3,161,2,83,0, + 41,3,114,170,0,0,0,114,160,0,0,0,78,41,4,114, + 49,0,0,0,114,9,0,0,0,114,184,0,0,0,114,145, + 0,0,0,41,1,218,1,109,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,107,0,0,0,52,3,0,0, + 115,4,0,0,0,16,7,255,128,122,26,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,4,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, + 30,0,0,0,116,0,160,1,124,1,161,1,114,26,116,2, + 124,1,124,0,124,0,106,3,100,1,141,3,83,0,100,0, + 83,0,114,172,0,0,0,41,4,114,61,0,0,0,114,92, + 0,0,0,114,98,0,0,0,114,145,0,0,0,114,173,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,177,0,0,0,61,3,0,0,115,8,0,0,0,10, + 2,16,1,4,2,255,128,122,24,70,114,111,122,101,110,73, + 109,112,111,114,116,101,114,46,102,105,110,100,95,115,112,101, + 99,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,3,0,0,0,67,0,0,0,115,18,0,0,0,116, + 0,160,1,124,1,161,1,114,14,124,0,83,0,100,1,83, + 0,41,2,122,93,70,105,110,100,32,97,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,46,10,10,32,32,32,32, + 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, + 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, + 32,32,78,41,2,114,61,0,0,0,114,92,0,0,0,41, + 3,114,174,0,0,0,114,85,0,0,0,114,175,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 221,0,0,0,28,4,0,0,115,54,0,0,0,8,10,10, - 1,4,1,12,1,4,2,10,1,8,1,8,255,8,2,14, - 1,10,1,2,1,8,255,10,2,14,1,2,1,14,1,14, - 1,10,4,16,1,2,255,12,2,2,1,8,128,4,1,2, - 248,255,128,114,221,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,6,0,0,0,67,0,0, - 0,115,146,0,0,0,124,0,160,0,100,1,161,1,125,1, - 124,0,160,0,100,2,161,1,125,2,124,1,100,3,117,1, - 114,82,124,2,100,3,117,1,114,78,124,1,124,2,106,1, - 107,3,114,78,116,2,106,3,100,4,124,1,155,2,100,5, - 124,2,106,1,155,2,100,6,157,5,116,4,100,7,100,8, - 141,3,1,0,124,1,83,0,124,2,100,3,117,1,114,96, - 124,2,106,1,83,0,116,2,106,3,100,9,116,4,100,7, - 100,8,141,3,1,0,124,0,100,10,25,0,125,1,100,11, - 124,0,118,1,114,142,124,1,160,5,100,12,161,1,100,13, - 25,0,125,1,124,1,83,0,41,14,122,167,67,97,108,99, - 117,108,97,116,101,32,119,104,97,116,32,95,95,112,97,99, - 107,97,103,101,95,95,32,115,104,111,117,108,100,32,98,101, - 46,10,10,32,32,32,32,95,95,112,97,99,107,97,103,101, - 95,95,32,105,115,32,110,111,116,32,103,117,97,114,97,110, - 116,101,101,100,32,116,111,32,98,101,32,100,101,102,105,110, - 101,100,32,111,114,32,99,111,117,108,100,32,98,101,32,115, - 101,116,32,116,111,32,78,111,110,101,10,32,32,32,32,116, - 111,32,114,101,112,114,101,115,101,110,116,32,116,104,97,116, - 32,105,116,115,32,112,114,111,112,101,114,32,118,97,108,117, - 101,32,105,115,32,117,110,107,110,111,119,110,46,10,10,32, - 32,32,32,114,152,0,0,0,114,113,0,0,0,78,122,32, - 95,95,112,97,99,107,97,103,101,95,95,32,33,61,32,95, - 95,115,112,101,99,95,95,46,112,97,114,101,110,116,32,40, - 122,4,32,33,61,32,250,1,41,233,3,0,0,0,41,1, - 90,10,115,116,97,99,107,108,101,118,101,108,122,89,99,97, - 110,39,116,32,114,101,115,111,108,118,101,32,112,97,99,107, - 97,103,101,32,102,114,111,109,32,95,95,115,112,101,99,95, - 95,32,111,114,32,95,95,112,97,99,107,97,103,101,95,95, - 44,32,102,97,108,108,105,110,103,32,98,97,99,107,32,111, - 110,32,95,95,110,97,109,101,95,95,32,97,110,100,32,95, - 95,112,97,116,104,95,95,114,9,0,0,0,114,148,0,0, - 0,114,135,0,0,0,114,25,0,0,0,41,6,114,38,0, - 0,0,114,137,0,0,0,114,95,0,0,0,114,96,0,0, - 0,114,163,0,0,0,114,136,0,0,0,41,3,218,7,103, - 108,111,98,97,108,115,114,196,0,0,0,114,103,0,0,0, + 178,0,0,0,68,3,0,0,115,4,0,0,0,18,7,255, + 128,122,26,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,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,115, + 101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,100, + 117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,5, + 0,0,0,114,168,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,156,0,0,0,77,3,0,0, + 115,4,0,0,0,4,0,255,128,122,28,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,99,114,101,97,116,101, + 95,109,111,100,117,108,101,99,1,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,4,0,0,0,67,0,0,0, + 115,64,0,0,0,124,0,106,0,106,1,125,1,116,2,160, + 3,124,1,161,1,115,36,116,4,100,1,160,5,124,1,161, + 1,124,1,100,2,141,2,130,1,116,6,116,2,106,7,124, + 1,131,2,125,2,116,8,124,2,124,0,106,9,131,2,1, + 0,100,0,83,0,114,91,0,0,0,41,10,114,113,0,0, + 0,114,20,0,0,0,114,61,0,0,0,114,92,0,0,0, + 114,83,0,0,0,114,49,0,0,0,114,71,0,0,0,218, + 17,103,101,116,95,102,114,111,122,101,110,95,111,98,106,101, + 99,116,218,4,101,120,101,99,114,14,0,0,0,41,3,114, + 104,0,0,0,114,20,0,0,0,218,4,99,111,100,101,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,157, + 0,0,0,81,3,0,0,115,16,0,0,0,8,2,10,1, + 10,1,2,1,6,255,12,2,16,1,255,128,122,26,70,114, + 111,122,101,110,73,109,112,111,114,116,101,114,46,101,120,101, + 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,10,0,0,0,116,0,124,0,124,1,131,2,83,0, + 41,2,122,95,76,111,97,100,32,97,32,102,114,111,122,101, + 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,101,120,101,99,95,109,111,100,117,108,101,40,41, + 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, + 32,32,32,78,41,1,114,105,0,0,0,114,179,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 164,0,0,0,90,3,0,0,115,4,0,0,0,10,8,255, + 128,122,26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, + 1,161,1,83,0,41,2,122,45,82,101,116,117,114,110,32, + 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, + 102,111,114,32,116,104,101,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,46,78,41,2,114,61,0,0,0,114,186, + 0,0,0,114,179,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,180,0,0,0,100,3,0,0, + 115,4,0,0,0,10,4,255,128,122,23,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,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,41,2,122,54,82,101,116,117,114,110,32,78, + 111,110,101,32,97,115,32,102,114,111,122,101,110,32,109,111, + 100,117,108,101,115,32,100,111,32,110,111,116,32,104,97,118, + 101,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114, + 5,0,0,0,114,179,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,181,0,0,0,106,3,0, + 0,115,4,0,0,0,4,4,255,128,122,25,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,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, + 0,0,0,116,0,160,1,124,1,161,1,83,0,41,2,122, + 46,82,101,116,117,114,110,32,84,114,117,101,32,105,102,32, + 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,78, + 41,2,114,61,0,0,0,90,17,105,115,95,102,114,111,122, + 101,110,95,112,97,99,107,97,103,101,114,179,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,122, + 0,0,0,112,3,0,0,115,4,0,0,0,10,4,255,128, + 122,25,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,41,2,78,78,41, + 1,78,41,17,114,9,0,0,0,114,8,0,0,0,114,1, + 0,0,0,114,10,0,0,0,114,145,0,0,0,114,182,0, + 0,0,114,107,0,0,0,114,183,0,0,0,114,177,0,0, + 0,114,178,0,0,0,114,156,0,0,0,114,157,0,0,0, + 114,164,0,0,0,114,94,0,0,0,114,180,0,0,0,114, + 181,0,0,0,114,122,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,184,0, + 0,0,41,3,0,0,115,50,0,0,0,8,0,4,2,4, + 7,2,2,10,1,2,8,12,1,2,6,12,1,2,8,10, + 1,2,3,10,1,2,8,10,1,2,9,2,1,12,1,2, + 4,2,1,12,1,2,4,2,1,16,1,255,128,114,184,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,64,0,0,0,115,32,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, + 132,0,90,4,100,4,100,5,132,0,90,5,100,6,83,0, + 41,7,218,18,95,73,109,112,111,114,116,76,111,99,107,67, + 111,110,116,101,120,116,122,36,67,111,110,116,101,120,116,32, + 109,97,110,97,103,101,114,32,102,111,114,32,116,104,101,32, + 105,109,112,111,114,116,32,108,111,99,107,46,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, + 0,67,0,0,0,115,12,0,0,0,116,0,160,1,161,0, + 1,0,100,1,83,0,41,2,122,24,65,99,113,117,105,114, + 101,32,116,104,101,32,105,109,112,111,114,116,32,108,111,99, + 107,46,78,41,2,114,61,0,0,0,114,62,0,0,0,114, + 51,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,58,0,0,0,125,3,0,0,115,4,0,0, + 0,12,2,255,128,122,28,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,0,0,0,0, + 4,0,0,0,2,0,0,0,67,0,0,0,115,12,0,0, + 0,116,0,160,1,161,0,1,0,100,1,83,0,41,2,122, + 60,82,101,108,101,97,115,101,32,116,104,101,32,105,109,112, + 111,114,116,32,108,111,99,107,32,114,101,103,97,114,100,108, + 101,115,115,32,111,102,32,97,110,121,32,114,97,105,115,101, + 100,32,101,120,99,101,112,116,105,111,110,115,46,78,41,2, + 114,61,0,0,0,114,64,0,0,0,41,4,114,33,0,0, + 0,218,8,101,120,99,95,116,121,112,101,218,9,101,120,99, + 95,118,97,108,117,101,218,13,101,120,99,95,116,114,97,99, + 101,98,97,99,107,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,60,0,0,0,129,3,0,0,115,4,0, + 0,0,12,2,255,128,122,27,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,41,6,114,9,0,0,0,114,8,0,0,0, + 114,1,0,0,0,114,10,0,0,0,114,58,0,0,0,114, + 60,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,189,0,0,0,121,3,0, + 0,115,10,0,0,0,8,0,4,2,8,2,12,4,255,128, + 114,189,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,64, + 0,0,0,124,1,160,0,100,1,124,2,100,2,24,0,161, + 2,125,3,116,1,124,3,131,1,124,2,107,0,114,36,116, + 2,100,3,131,1,130,1,124,3,100,4,25,0,125,4,124, + 0,114,60,100,5,160,3,124,4,124,0,161,2,83,0,124, + 4,83,0,41,7,122,50,82,101,115,111,108,118,101,32,97, + 32,114,101,108,97,116,105,118,101,32,109,111,100,117,108,101, + 32,110,97,109,101,32,116,111,32,97,110,32,97,98,115,111, + 108,117,116,101,32,111,110,101,46,114,135,0,0,0,114,42, + 0,0,0,122,50,97,116,116,101,109,112,116,101,100,32,114, + 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,98, + 101,121,111,110,100,32,116,111,112,45,108,101,118,101,108,32, + 112,97,99,107,97,103,101,114,25,0,0,0,250,5,123,125, + 46,123,125,78,41,4,218,6,114,115,112,108,105,116,218,3, + 108,101,110,114,83,0,0,0,114,49,0,0,0,41,5,114, + 20,0,0,0,218,7,112,97,99,107,97,103,101,218,5,108, + 101,118,101,108,90,4,98,105,116,115,90,4,98,97,115,101, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 17,95,99,97,108,99,95,95,95,112,97,99,107,97,103,101, - 95,95,65,4,0,0,115,44,0,0,0,10,7,10,1,8, - 1,18,1,6,1,2,1,4,255,4,1,6,255,4,2,6, - 254,4,3,8,1,6,1,6,2,4,2,6,254,8,3,8, - 1,14,1,4,1,255,128,114,227,0,0,0,114,5,0,0, - 0,99,5,0,0,0,0,0,0,0,0,0,0,0,9,0, - 0,0,5,0,0,0,67,0,0,0,115,174,0,0,0,124, - 4,100,1,107,2,114,18,116,0,124,0,131,1,125,5,110, - 36,124,1,100,2,117,1,114,30,124,1,110,2,105,0,125, - 6,116,1,124,6,131,1,125,7,116,0,124,0,124,7,124, - 4,131,3,125,5,124,3,115,148,124,4,100,1,107,2,114, - 84,116,0,124,0,160,2,100,3,161,1,100,1,25,0,131, - 1,83,0,124,0,115,92,124,5,83,0,116,3,124,0,131, - 1,116,3,124,0,160,2,100,3,161,1,100,1,25,0,131, - 1,24,0,125,8,116,4,106,5,124,5,106,6,100,2,116, - 3,124,5,106,6,131,1,124,8,24,0,133,2,25,0,25, - 0,83,0,116,7,124,5,100,4,131,2,114,170,116,8,124, - 5,124,3,116,0,131,3,83,0,124,5,83,0,41,5,97, - 215,1,0,0,73,109,112,111,114,116,32,97,32,109,111,100, - 117,108,101,46,10,10,32,32,32,32,84,104,101,32,39,103, - 108,111,98,97,108,115,39,32,97,114,103,117,109,101,110,116, - 32,105,115,32,117,115,101,100,32,116,111,32,105,110,102,101, - 114,32,119,104,101,114,101,32,116,104,101,32,105,109,112,111, - 114,116,32,105,115,32,111,99,99,117,114,114,105,110,103,32, - 102,114,111,109,10,32,32,32,32,116,111,32,104,97,110,100, - 108,101,32,114,101,108,97,116,105,118,101,32,105,109,112,111, - 114,116,115,46,32,84,104,101,32,39,108,111,99,97,108,115, - 39,32,97,114,103,117,109,101,110,116,32,105,115,32,105,103, - 110,111,114,101,100,46,32,84,104,101,10,32,32,32,32,39, - 102,114,111,109,108,105,115,116,39,32,97,114,103,117,109,101, - 110,116,32,115,112,101,99,105,102,105,101,115,32,119,104,97, - 116,32,115,104,111,117,108,100,32,101,120,105,115,116,32,97, - 115,32,97,116,116,114,105,98,117,116,101,115,32,111,110,32, - 116,104,101,32,109,111,100,117,108,101,10,32,32,32,32,98, - 101,105,110,103,32,105,109,112,111,114,116,101,100,32,40,101, - 46,103,46,32,96,96,102,114,111,109,32,109,111,100,117,108, - 101,32,105,109,112,111,114,116,32,60,102,114,111,109,108,105, - 115,116,62,96,96,41,46,32,32,84,104,101,32,39,108,101, - 118,101,108,39,10,32,32,32,32,97,114,103,117,109,101,110, - 116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101, - 32,112,97,99,107,97,103,101,32,108,111,99,97,116,105,111, - 110,32,116,111,32,105,109,112,111,114,116,32,102,114,111,109, - 32,105,110,32,97,32,114,101,108,97,116,105,118,101,10,32, - 32,32,32,105,109,112,111,114,116,32,40,101,46,103,46,32, - 96,96,102,114,111,109,32,46,46,112,107,103,32,105,109,112, - 111,114,116,32,109,111,100,96,96,32,119,111,117,108,100,32, - 104,97,118,101,32,97,32,39,108,101,118,101,108,39,32,111, - 102,32,50,41,46,10,10,32,32,32,32,114,25,0,0,0, - 78,114,135,0,0,0,114,148,0,0,0,41,9,114,216,0, - 0,0,114,227,0,0,0,218,9,112,97,114,116,105,116,105, - 111,110,114,195,0,0,0,114,18,0,0,0,114,99,0,0, - 0,114,9,0,0,0,114,11,0,0,0,114,221,0,0,0, - 41,9,114,20,0,0,0,114,226,0,0,0,218,6,108,111, - 99,97,108,115,114,222,0,0,0,114,197,0,0,0,114,104, - 0,0,0,90,8,103,108,111,98,97,108,115,95,114,196,0, - 0,0,90,7,99,117,116,95,111,102,102,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,10,95,95,105,109, - 112,111,114,116,95,95,92,4,0,0,115,32,0,0,0,8, - 11,10,1,16,2,8,1,12,1,4,1,8,3,18,1,4, - 1,4,1,26,4,30,3,10,1,12,1,4,2,255,128,114, - 230,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,38,0, - 0,0,116,0,160,1,124,0,161,1,125,1,124,1,100,0, - 117,0,114,30,116,2,100,1,124,0,23,0,131,1,130,1, - 116,3,124,1,131,1,83,0,41,2,78,122,25,110,111,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,32, - 110,97,109,101,100,32,41,4,114,169,0,0,0,114,177,0, - 0,0,114,83,0,0,0,114,167,0,0,0,41,2,114,20, - 0,0,0,114,103,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,18,95,98,117,105,108,116,105, - 110,95,102,114,111,109,95,110,97,109,101,129,4,0,0,115, - 10,0,0,0,10,1,8,1,12,1,8,1,255,128,114,231, - 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 10,0,0,0,5,0,0,0,67,0,0,0,115,164,0,0, - 0,124,1,97,0,124,0,97,1,116,2,116,1,131,1,125, - 2,116,1,106,3,160,4,161,0,68,0,93,70,92,2,125, - 3,125,4,116,5,124,4,124,2,131,2,114,26,124,3,116, - 1,106,6,118,0,114,60,116,7,125,5,110,16,116,0,160, - 8,124,3,161,1,114,26,116,9,125,5,110,0,116,10,124, - 4,124,5,131,2,125,6,116,11,124,6,124,4,131,2,1, - 0,113,26,116,1,106,3,116,12,25,0,125,7,100,1,68, - 0,93,46,125,8,124,8,116,1,106,3,118,1,114,136,116, - 13,124,8,131,1,125,9,110,10,116,1,106,3,124,8,25, - 0,125,9,116,14,124,7,124,8,124,9,131,3,1,0,113, - 112,100,2,83,0,41,3,122,250,83,101,116,117,112,32,105, - 109,112,111,114,116,108,105,98,32,98,121,32,105,109,112,111, - 114,116,105,110,103,32,110,101,101,100,101,100,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,115,32,97,110, - 100,32,105,110,106,101,99,116,105,110,103,32,116,104,101,109, - 10,32,32,32,32,105,110,116,111,32,116,104,101,32,103,108, - 111,98,97,108,32,110,97,109,101,115,112,97,99,101,46,10, - 10,32,32,32,32,65,115,32,115,121,115,32,105,115,32,110, - 101,101,100,101,100,32,102,111,114,32,115,121,115,46,109,111, - 100,117,108,101,115,32,97,99,99,101,115,115,32,97,110,100, - 32,95,105,109,112,32,105,115,32,110,101,101,100,101,100,32, - 116,111,32,108,111,97,100,32,98,117,105,108,116,45,105,110, - 10,32,32,32,32,109,111,100,117,108,101,115,44,32,116,104, - 111,115,101,32,116,119,111,32,109,111,100,117,108,101,115,32, - 109,117,115,116,32,98,101,32,101,120,112,108,105,99,105,116, - 108,121,32,112,97,115,115,101,100,32,105,110,46,10,10,32, - 32,32,32,41,3,114,26,0,0,0,114,95,0,0,0,114, - 68,0,0,0,78,41,15,114,61,0,0,0,114,18,0,0, - 0,114,3,0,0,0,114,99,0,0,0,218,5,105,116,101, - 109,115,114,203,0,0,0,114,82,0,0,0,114,169,0,0, - 0,114,92,0,0,0,114,184,0,0,0,114,149,0,0,0, - 114,155,0,0,0,114,9,0,0,0,114,231,0,0,0,114, - 12,0,0,0,41,10,218,10,115,121,115,95,109,111,100,117, - 108,101,218,11,95,105,109,112,95,109,111,100,117,108,101,90, - 11,109,111,100,117,108,101,95,116,121,112,101,114,20,0,0, - 0,114,104,0,0,0,114,116,0,0,0,114,103,0,0,0, - 90,11,115,101,108,102,95,109,111,100,117,108,101,90,12,98, - 117,105,108,116,105,110,95,110,97,109,101,90,14,98,117,105, - 108,116,105,110,95,109,111,100,117,108,101,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,6,95,115,101,116, - 117,112,136,4,0,0,115,38,0,0,0,4,9,4,1,8, - 3,18,1,10,1,10,1,6,1,10,1,6,1,10,3,12, - 1,10,3,8,1,10,1,10,1,10,2,14,1,4,251,255, - 128,114,235,0,0,0,99,2,0,0,0,0,0,0,0,0, + 13,95,114,101,115,111,108,118,101,95,110,97,109,101,134,3, + 0,0,115,12,0,0,0,16,2,12,1,8,1,8,1,20, + 1,255,128,114,198,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, + 0,115,34,0,0,0,124,0,160,0,124,1,124,2,161,2, + 125,3,124,3,100,0,117,0,114,24,100,0,83,0,116,1, + 124,1,124,3,131,2,83,0,114,0,0,0,0,41,2,114, + 178,0,0,0,114,98,0,0,0,41,4,218,6,102,105,110, + 100,101,114,114,20,0,0,0,114,175,0,0,0,114,116,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,17,95,102,105,110,100,95,115,112,101,99,95,108,101, + 103,97,99,121,143,3,0,0,115,10,0,0,0,12,3,8, + 1,4,1,10,1,255,128,114,200,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0, + 0,67,0,0,0,115,28,1,0,0,116,0,106,1,125,3, + 124,3,100,1,117,0,114,22,116,2,100,2,131,1,130,1, + 124,3,115,38,116,3,160,4,100,3,116,5,161,2,1,0, + 124,0,116,0,106,6,118,0,125,4,124,3,68,0,93,226, + 125,5,116,7,131,0,143,94,1,0,122,10,124,5,106,8, + 125,6,87,0,110,54,4,0,116,9,121,128,1,0,1,0, + 1,0,116,10,124,5,124,0,124,1,131,3,125,7,124,7, + 100,1,117,0,114,124,89,0,87,0,100,1,4,0,4,0, + 131,3,1,0,113,52,89,0,110,14,48,0,124,6,124,0, + 124,1,124,2,131,3,125,7,87,0,100,1,4,0,4,0, + 131,3,1,0,110,16,49,0,115,162,48,0,1,0,1,0, + 1,0,89,0,1,0,124,7,100,1,117,1,114,52,124,4, + 144,1,115,16,124,0,116,0,106,6,118,0,144,1,114,16, + 116,0,106,6,124,0,25,0,125,8,122,10,124,8,106,11, + 125,9,87,0,110,26,4,0,116,9,121,244,1,0,1,0, + 1,0,124,7,6,0,89,0,2,0,1,0,83,0,48,0, + 124,9,100,1,117,0,144,1,114,8,124,7,2,0,1,0, + 83,0,124,9,2,0,1,0,83,0,124,7,2,0,1,0, + 83,0,100,1,83,0,41,4,122,21,70,105,110,100,32,97, + 32,109,111,100,117,108,101,39,115,32,115,112,101,99,46,78, + 122,53,115,121,115,46,109,101,116,97,95,112,97,116,104,32, + 105,115,32,78,111,110,101,44,32,80,121,116,104,111,110,32, + 105,115,32,108,105,107,101,108,121,32,115,104,117,116,116,105, + 110,103,32,100,111,119,110,122,22,115,121,115,46,109,101,116, + 97,95,112,97,116,104,32,105,115,32,101,109,112,116,121,41, + 12,114,18,0,0,0,218,9,109,101,116,97,95,112,97,116, + 104,114,83,0,0,0,114,95,0,0,0,114,96,0,0,0, + 114,163,0,0,0,114,99,0,0,0,114,189,0,0,0,114, + 177,0,0,0,114,2,0,0,0,114,200,0,0,0,114,113, + 0,0,0,41,10,114,20,0,0,0,114,175,0,0,0,114, + 176,0,0,0,114,201,0,0,0,90,9,105,115,95,114,101, + 108,111,97,100,114,199,0,0,0,114,177,0,0,0,114,103, + 0,0,0,114,104,0,0,0,114,113,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,10,95,102, + 105,110,100,95,115,112,101,99,152,3,0,0,115,56,0,0, + 0,6,2,8,1,8,2,4,3,12,1,10,5,8,1,8, + 1,2,1,10,1,12,1,12,1,8,1,22,1,42,2,8, + 1,18,2,10,1,2,1,10,1,12,1,14,4,10,2,8, + 1,8,2,8,2,4,2,255,128,114,202,0,0,0,99,3, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, + 0,0,0,67,0,0,0,115,110,0,0,0,116,0,124,0, + 116,1,131,2,115,28,116,2,100,1,160,3,116,4,124,0, + 131,1,161,1,131,1,130,1,124,2,100,2,107,0,114,44, + 116,5,100,3,131,1,130,1,124,2,100,2,107,4,114,82, + 116,0,124,1,116,1,131,2,115,70,116,2,100,4,131,1, + 130,1,124,1,115,82,116,6,100,5,131,1,130,1,124,0, + 115,106,124,2,100,2,107,2,114,102,116,5,100,6,131,1, + 130,1,100,7,83,0,100,7,83,0,41,8,122,28,86,101, + 114,105,102,121,32,97,114,103,117,109,101,110,116,115,32,97, + 114,101,32,34,115,97,110,101,34,46,122,31,109,111,100,117, + 108,101,32,110,97,109,101,32,109,117,115,116,32,98,101,32, + 115,116,114,44,32,110,111,116,32,123,125,114,25,0,0,0, + 122,18,108,101,118,101,108,32,109,117,115,116,32,98,101,32, + 62,61,32,48,122,31,95,95,112,97,99,107,97,103,101,95, + 95,32,110,111,116,32,115,101,116,32,116,111,32,97,32,115, + 116,114,105,110,103,122,54,97,116,116,101,109,112,116,101,100, + 32,114,101,108,97,116,105,118,101,32,105,109,112,111,114,116, + 32,119,105,116,104,32,110,111,32,107,110,111,119,110,32,112, + 97,114,101,110,116,32,112,97,99,107,97,103,101,122,17,69, + 109,112,116,121,32,109,111,100,117,108,101,32,110,97,109,101, + 78,41,7,218,10,105,115,105,110,115,116,97,110,99,101,218, + 3,115,116,114,218,9,84,121,112,101,69,114,114,111,114,114, + 49,0,0,0,114,3,0,0,0,218,10,86,97,108,117,101, + 69,114,114,111,114,114,83,0,0,0,169,3,114,20,0,0, + 0,114,196,0,0,0,114,197,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,13,95,115,97,110, + 105,116,121,95,99,104,101,99,107,199,3,0,0,115,26,0, + 0,0,10,2,18,1,8,1,8,1,8,1,10,1,8,1, + 4,1,8,1,12,2,8,1,8,255,255,128,114,208,0,0, + 0,122,16,78,111,32,109,111,100,117,108,101,32,110,97,109, + 101,100,32,122,4,123,33,114,125,99,2,0,0,0,0,0, + 0,0,0,0,0,0,9,0,0,0,8,0,0,0,67,0, + 0,0,115,20,1,0,0,100,0,125,2,124,0,160,0,100, + 1,161,1,100,2,25,0,125,3,124,3,114,128,124,3,116, + 1,106,2,118,1,114,42,116,3,124,1,124,3,131,2,1, + 0,124,0,116,1,106,2,118,0,114,62,116,1,106,2,124, + 0,25,0,83,0,116,1,106,2,124,3,25,0,125,4,122, + 10,124,4,106,4,125,2,87,0,110,44,4,0,116,5,121, + 126,1,0,1,0,1,0,116,6,100,3,23,0,160,7,124, + 0,124,3,161,2,125,5,116,8,124,5,124,0,100,4,141, + 2,100,0,130,2,48,0,116,9,124,0,124,2,131,2,125, + 6,124,6,100,0,117,0,114,164,116,8,116,6,160,7,124, + 0,161,1,124,0,100,4,141,2,130,1,116,10,124,6,131, + 1,125,7,124,3,144,1,114,16,116,1,106,2,124,3,25, + 0,125,4,124,0,160,0,100,1,161,1,100,5,25,0,125, + 8,122,18,116,11,124,4,124,8,124,7,131,3,1,0,87, + 0,124,7,83,0,4,0,116,5,144,1,121,14,1,0,1, + 0,1,0,100,6,124,3,155,2,100,7,124,8,155,2,157, + 4,125,5,116,12,160,13,124,5,116,14,161,2,1,0,89, + 0,124,7,83,0,48,0,124,7,83,0,41,8,78,114,135, + 0,0,0,114,25,0,0,0,122,23,59,32,123,33,114,125, + 32,105,115,32,110,111,116,32,97,32,112,97,99,107,97,103, + 101,114,19,0,0,0,233,2,0,0,0,122,27,67,97,110, + 110,111,116,32,115,101,116,32,97,110,32,97,116,116,114,105, + 98,117,116,101,32,111,110,32,122,18,32,102,111,114,32,99, + 104,105,108,100,32,109,111,100,117,108,101,32,41,15,114,136, + 0,0,0,114,18,0,0,0,114,99,0,0,0,114,71,0, + 0,0,114,148,0,0,0,114,2,0,0,0,218,8,95,69, + 82,82,95,77,83,71,114,49,0,0,0,218,19,77,111,100, + 117,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, + 114,202,0,0,0,114,167,0,0,0,114,12,0,0,0,114, + 95,0,0,0,114,96,0,0,0,114,163,0,0,0,41,9, + 114,20,0,0,0,218,7,105,109,112,111,114,116,95,114,175, + 0,0,0,114,137,0,0,0,90,13,112,97,114,101,110,116, + 95,109,111,100,117,108,101,114,102,0,0,0,114,103,0,0, + 0,114,104,0,0,0,90,5,99,104,105,108,100,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,23,95,102, + 105,110,100,95,97,110,100,95,108,111,97,100,95,117,110,108, + 111,99,107,101,100,218,3,0,0,115,60,0,0,0,4,1, + 14,1,4,1,10,1,10,1,10,2,10,1,10,1,2,1, + 10,1,12,1,16,1,16,1,10,1,8,1,18,1,8,2, + 6,1,10,2,14,1,2,1,14,1,4,4,14,253,16,1, + 14,1,4,1,2,255,4,1,255,128,114,213,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 8,0,0,0,67,0,0,0,115,128,0,0,0,116,0,124, + 0,131,1,143,62,1,0,116,1,106,2,160,3,124,0,116, + 4,161,2,125,2,124,2,116,4,117,0,114,56,116,5,124, + 0,124,1,131,2,87,0,2,0,100,1,4,0,4,0,131, + 3,1,0,83,0,87,0,100,1,4,0,4,0,131,3,1, + 0,110,16,49,0,115,76,48,0,1,0,1,0,1,0,89, + 0,1,0,124,2,100,1,117,0,114,116,100,2,160,6,124, + 0,161,1,125,3,116,7,124,3,124,0,100,3,141,2,130, + 1,116,8,124,0,131,1,1,0,124,2,83,0,41,4,122, + 25,70,105,110,100,32,97,110,100,32,108,111,97,100,32,116, + 104,101,32,109,111,100,117,108,101,46,78,122,40,105,109,112, + 111,114,116,32,111,102,32,123,125,32,104,97,108,116,101,100, + 59,32,78,111,110,101,32,105,110,32,115,121,115,46,109,111, + 100,117,108,101,115,114,19,0,0,0,41,9,114,54,0,0, + 0,114,18,0,0,0,114,99,0,0,0,114,38,0,0,0, + 218,14,95,78,69,69,68,83,95,76,79,65,68,73,78,71, + 114,213,0,0,0,114,49,0,0,0,114,211,0,0,0,114, + 69,0,0,0,41,4,114,20,0,0,0,114,212,0,0,0, + 114,104,0,0,0,114,79,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,14,95,102,105,110,100, + 95,97,110,100,95,108,111,97,100,253,3,0,0,115,24,0, + 0,0,10,2,14,1,8,1,54,1,8,2,4,1,2,1, + 4,255,12,2,8,2,4,1,255,128,114,215,0,0,0,114, + 25,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,4,0,0,0,67,0,0,0,115,42,0, + 0,0,116,0,124,0,124,1,124,2,131,3,1,0,124,2, + 100,1,107,4,114,32,116,1,124,0,124,1,124,2,131,3, + 125,0,116,2,124,0,116,3,131,2,83,0,41,3,97,50, + 1,0,0,73,109,112,111,114,116,32,97,110,100,32,114,101, + 116,117,114,110,32,116,104,101,32,109,111,100,117,108,101,32, + 98,97,115,101,100,32,111,110,32,105,116,115,32,110,97,109, + 101,44,32,116,104,101,32,112,97,99,107,97,103,101,32,116, + 104,101,32,99,97,108,108,32,105,115,10,32,32,32,32,98, + 101,105,110,103,32,109,97,100,101,32,102,114,111,109,44,32, + 97,110,100,32,116,104,101,32,108,101,118,101,108,32,97,100, + 106,117,115,116,109,101,110,116,46,10,10,32,32,32,32,84, + 104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,112, + 114,101,115,101,110,116,115,32,116,104,101,32,103,114,101,97, + 116,101,115,116,32,99,111,109,109,111,110,32,100,101,110,111, + 109,105,110,97,116,111,114,32,111,102,32,102,117,110,99,116, + 105,111,110,97,108,105,116,121,10,32,32,32,32,98,101,116, + 119,101,101,110,32,105,109,112,111,114,116,95,109,111,100,117, + 108,101,32,97,110,100,32,95,95,105,109,112,111,114,116,95, + 95,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115, + 32,115,101,116,116,105,110,103,32,95,95,112,97,99,107,97, + 103,101,95,95,32,105,102,10,32,32,32,32,116,104,101,32, + 108,111,97,100,101,114,32,100,105,100,32,110,111,116,46,10, + 10,32,32,32,32,114,25,0,0,0,78,41,4,114,208,0, + 0,0,114,198,0,0,0,114,215,0,0,0,218,11,95,103, + 99,100,95,105,109,112,111,114,116,114,207,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,216,0, + 0,0,13,4,0,0,115,10,0,0,0,12,9,8,1,12, + 1,10,1,255,128,114,216,0,0,0,169,1,218,9,114,101, + 99,117,114,115,105,118,101,99,3,0,0,0,0,0,0,0, + 1,0,0,0,8,0,0,0,11,0,0,0,67,0,0,0, + 115,216,0,0,0,124,1,68,0,93,204,125,4,116,0,124, + 4,116,1,131,2,115,64,124,3,114,34,124,0,106,2,100, + 1,23,0,125,5,110,4,100,2,125,5,116,3,100,3,124, + 5,155,0,100,4,116,4,124,4,131,1,106,2,155,0,157, + 4,131,1,130,1,124,4,100,5,107,2,114,106,124,3,115, + 4,116,5,124,0,100,6,131,2,114,4,116,6,124,0,124, + 0,106,7,124,2,100,7,100,8,141,4,1,0,113,4,116, + 5,124,0,124,4,131,2,115,4,100,9,160,8,124,0,106, + 2,124,4,161,2,125,6,122,14,116,9,124,2,124,6,131, + 2,1,0,87,0,113,4,4,0,116,10,121,214,1,0,125, + 7,1,0,122,42,124,7,106,11,124,6,107,2,114,200,116, + 12,106,13,160,14,124,6,116,15,161,2,100,10,117,1,114, + 200,87,0,89,0,100,10,125,7,126,7,113,4,130,0,100, + 10,125,7,126,7,48,0,124,0,83,0,48,0,41,11,122, + 238,70,105,103,117,114,101,32,111,117,116,32,119,104,97,116, + 32,95,95,105,109,112,111,114,116,95,95,32,115,104,111,117, + 108,100,32,114,101,116,117,114,110,46,10,10,32,32,32,32, + 84,104,101,32,105,109,112,111,114,116,95,32,112,97,114,97, + 109,101,116,101,114,32,105,115,32,97,32,99,97,108,108,97, + 98,108,101,32,119,104,105,99,104,32,116,97,107,101,115,32, + 116,104,101,32,110,97,109,101,32,111,102,32,109,111,100,117, + 108,101,32,116,111,10,32,32,32,32,105,109,112,111,114,116, + 46,32,73,116,32,105,115,32,114,101,113,117,105,114,101,100, + 32,116,111,32,100,101,99,111,117,112,108,101,32,116,104,101, + 32,102,117,110,99,116,105,111,110,32,102,114,111,109,32,97, + 115,115,117,109,105,110,103,32,105,109,112,111,114,116,108,105, + 98,39,115,10,32,32,32,32,105,109,112,111,114,116,32,105, + 109,112,108,101,109,101,110,116,97,116,105,111,110,32,105,115, + 32,100,101,115,105,114,101,100,46,10,10,32,32,32,32,122, + 8,46,95,95,97,108,108,95,95,122,13,96,96,102,114,111, + 109,32,108,105,115,116,39,39,122,8,73,116,101,109,32,105, + 110,32,122,18,32,109,117,115,116,32,98,101,32,115,116,114, + 44,32,110,111,116,32,250,1,42,218,7,95,95,97,108,108, + 95,95,84,114,217,0,0,0,114,193,0,0,0,78,41,16, + 114,203,0,0,0,114,204,0,0,0,114,9,0,0,0,114, + 205,0,0,0,114,3,0,0,0,114,11,0,0,0,218,16, + 95,104,97,110,100,108,101,95,102,114,111,109,108,105,115,116, + 114,220,0,0,0,114,49,0,0,0,114,71,0,0,0,114, + 211,0,0,0,114,20,0,0,0,114,18,0,0,0,114,99, + 0,0,0,114,38,0,0,0,114,214,0,0,0,41,8,114, + 104,0,0,0,218,8,102,114,111,109,108,105,115,116,114,212, + 0,0,0,114,218,0,0,0,218,1,120,90,5,119,104,101, + 114,101,90,9,102,114,111,109,95,110,97,109,101,90,3,101, + 120,99,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,221,0,0,0,28,4,0,0,115,54,0,0,0,8, + 10,10,1,4,1,12,1,4,2,10,1,8,1,8,255,8, + 2,14,1,10,1,2,1,8,255,10,2,14,1,2,1,14, + 1,14,1,10,4,16,1,2,255,12,2,2,1,8,128,4, + 1,2,248,255,128,114,221,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,6,0,0,0,67, + 0,0,0,115,146,0,0,0,124,0,160,0,100,1,161,1, + 125,1,124,0,160,0,100,2,161,1,125,2,124,1,100,3, + 117,1,114,82,124,2,100,3,117,1,114,78,124,1,124,2, + 106,1,107,3,114,78,116,2,106,3,100,4,124,1,155,2, + 100,5,124,2,106,1,155,2,100,6,157,5,116,4,100,7, + 100,8,141,3,1,0,124,1,83,0,124,2,100,3,117,1, + 114,96,124,2,106,1,83,0,116,2,106,3,100,9,116,4, + 100,7,100,8,141,3,1,0,124,0,100,10,25,0,125,1, + 100,11,124,0,118,1,114,142,124,1,160,5,100,12,161,1, + 100,13,25,0,125,1,124,1,83,0,41,14,122,167,67,97, + 108,99,117,108,97,116,101,32,119,104,97,116,32,95,95,112, + 97,99,107,97,103,101,95,95,32,115,104,111,117,108,100,32, + 98,101,46,10,10,32,32,32,32,95,95,112,97,99,107,97, + 103,101,95,95,32,105,115,32,110,111,116,32,103,117,97,114, + 97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,102, + 105,110,101,100,32,111,114,32,99,111,117,108,100,32,98,101, + 32,115,101,116,32,116,111,32,78,111,110,101,10,32,32,32, + 32,116,111,32,114,101,112,114,101,115,101,110,116,32,116,104, + 97,116,32,105,116,115,32,112,114,111,112,101,114,32,118,97, + 108,117,101,32,105,115,32,117,110,107,110,111,119,110,46,10, + 10,32,32,32,32,114,152,0,0,0,114,113,0,0,0,78, + 122,32,95,95,112,97,99,107,97,103,101,95,95,32,33,61, + 32,95,95,115,112,101,99,95,95,46,112,97,114,101,110,116, + 32,40,122,4,32,33,61,32,250,1,41,233,3,0,0,0, + 41,1,90,10,115,116,97,99,107,108,101,118,101,108,122,89, + 99,97,110,39,116,32,114,101,115,111,108,118,101,32,112,97, + 99,107,97,103,101,32,102,114,111,109,32,95,95,115,112,101, + 99,95,95,32,111,114,32,95,95,112,97,99,107,97,103,101, + 95,95,44,32,102,97,108,108,105,110,103,32,98,97,99,107, + 32,111,110,32,95,95,110,97,109,101,95,95,32,97,110,100, + 32,95,95,112,97,116,104,95,95,114,9,0,0,0,114,148, + 0,0,0,114,135,0,0,0,114,25,0,0,0,41,6,114, + 38,0,0,0,114,137,0,0,0,114,95,0,0,0,114,96, + 0,0,0,114,163,0,0,0,114,136,0,0,0,41,3,218, + 7,103,108,111,98,97,108,115,114,196,0,0,0,114,103,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,17,95,99,97,108,99,95,95,95,112,97,99,107,97, + 103,101,95,95,65,4,0,0,115,44,0,0,0,10,7,10, + 1,8,1,18,1,6,1,2,1,4,255,4,1,6,255,4, + 2,6,254,4,3,8,1,6,1,6,2,4,2,6,254,8, + 3,8,1,14,1,4,1,255,128,114,227,0,0,0,114,5, + 0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,0, + 9,0,0,0,5,0,0,0,67,0,0,0,115,174,0,0, + 0,124,4,100,1,107,2,114,18,116,0,124,0,131,1,125, + 5,110,36,124,1,100,2,117,1,114,30,124,1,110,2,105, + 0,125,6,116,1,124,6,131,1,125,7,116,0,124,0,124, + 7,124,4,131,3,125,5,124,3,115,148,124,4,100,1,107, + 2,114,84,116,0,124,0,160,2,100,3,161,1,100,1,25, + 0,131,1,83,0,124,0,115,92,124,5,83,0,116,3,124, + 0,131,1,116,3,124,0,160,2,100,3,161,1,100,1,25, + 0,131,1,24,0,125,8,116,4,106,5,124,5,106,6,100, + 2,116,3,124,5,106,6,131,1,124,8,24,0,133,2,25, + 0,25,0,83,0,116,7,124,5,100,4,131,2,114,170,116, + 8,124,5,124,3,116,0,131,3,83,0,124,5,83,0,41, + 5,97,215,1,0,0,73,109,112,111,114,116,32,97,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,84,104,101,32, + 39,103,108,111,98,97,108,115,39,32,97,114,103,117,109,101, + 110,116,32,105,115,32,117,115,101,100,32,116,111,32,105,110, + 102,101,114,32,119,104,101,114,101,32,116,104,101,32,105,109, + 112,111,114,116,32,105,115,32,111,99,99,117,114,114,105,110, + 103,32,102,114,111,109,10,32,32,32,32,116,111,32,104,97, + 110,100,108,101,32,114,101,108,97,116,105,118,101,32,105,109, + 112,111,114,116,115,46,32,84,104,101,32,39,108,111,99,97, + 108,115,39,32,97,114,103,117,109,101,110,116,32,105,115,32, + 105,103,110,111,114,101,100,46,32,84,104,101,10,32,32,32, + 32,39,102,114,111,109,108,105,115,116,39,32,97,114,103,117, + 109,101,110,116,32,115,112,101,99,105,102,105,101,115,32,119, + 104,97,116,32,115,104,111,117,108,100,32,101,120,105,115,116, + 32,97,115,32,97,116,116,114,105,98,117,116,101,115,32,111, + 110,32,116,104,101,32,109,111,100,117,108,101,10,32,32,32, + 32,98,101,105,110,103,32,105,109,112,111,114,116,101,100,32, + 40,101,46,103,46,32,96,96,102,114,111,109,32,109,111,100, + 117,108,101,32,105,109,112,111,114,116,32,60,102,114,111,109, + 108,105,115,116,62,96,96,41,46,32,32,84,104,101,32,39, + 108,101,118,101,108,39,10,32,32,32,32,97,114,103,117,109, + 101,110,116,32,114,101,112,114,101,115,101,110,116,115,32,116, + 104,101,32,112,97,99,107,97,103,101,32,108,111,99,97,116, + 105,111,110,32,116,111,32,105,109,112,111,114,116,32,102,114, + 111,109,32,105,110,32,97,32,114,101,108,97,116,105,118,101, + 10,32,32,32,32,105,109,112,111,114,116,32,40,101,46,103, + 46,32,96,96,102,114,111,109,32,46,46,112,107,103,32,105, + 109,112,111,114,116,32,109,111,100,96,96,32,119,111,117,108, + 100,32,104,97,118,101,32,97,32,39,108,101,118,101,108,39, + 32,111,102,32,50,41,46,10,10,32,32,32,32,114,25,0, + 0,0,78,114,135,0,0,0,114,148,0,0,0,41,9,114, + 216,0,0,0,114,227,0,0,0,218,9,112,97,114,116,105, + 116,105,111,110,114,195,0,0,0,114,18,0,0,0,114,99, + 0,0,0,114,9,0,0,0,114,11,0,0,0,114,221,0, + 0,0,41,9,114,20,0,0,0,114,226,0,0,0,218,6, + 108,111,99,97,108,115,114,222,0,0,0,114,197,0,0,0, + 114,104,0,0,0,90,8,103,108,111,98,97,108,115,95,114, + 196,0,0,0,90,7,99,117,116,95,111,102,102,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,10,95,95, + 105,109,112,111,114,116,95,95,92,4,0,0,115,32,0,0, + 0,8,11,10,1,16,2,8,1,12,1,4,1,8,3,18, + 1,4,1,4,1,26,4,30,3,10,1,12,1,4,2,255, + 128,114,230,0,0,0,99,1,0,0,0,0,0,0,0,0, 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 38,0,0,0,116,0,124,0,124,1,131,2,1,0,116,1, - 106,2,160,3,116,4,161,1,1,0,116,1,106,2,160,3, - 116,5,161,1,1,0,100,1,83,0,41,2,122,48,73,110, - 115,116,97,108,108,32,105,109,112,111,114,116,101,114,115,32, - 102,111,114,32,98,117,105,108,116,105,110,32,97,110,100,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,115,78,41, - 6,114,235,0,0,0,114,18,0,0,0,114,201,0,0,0, - 114,126,0,0,0,114,169,0,0,0,114,184,0,0,0,41, - 2,114,233,0,0,0,114,234,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,8,95,105,110,115, - 116,97,108,108,171,4,0,0,115,8,0,0,0,10,2,12, - 2,16,1,255,128,114,236,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,67, - 0,0,0,115,32,0,0,0,100,1,100,2,108,0,125,0, - 124,0,97,1,124,0,160,2,116,3,106,4,116,5,25,0, - 161,1,1,0,100,2,83,0,41,3,122,57,73,110,115,116, - 97,108,108,32,105,109,112,111,114,116,101,114,115,32,116,104, - 97,116,32,114,101,113,117,105,114,101,32,101,120,116,101,114, - 110,97,108,32,102,105,108,101,115,121,115,116,101,109,32,97, - 99,99,101,115,115,114,25,0,0,0,78,41,6,218,26,95, - 102,114,111,122,101,110,95,105,109,112,111,114,116,108,105,98, - 95,101,120,116,101,114,110,97,108,114,133,0,0,0,114,236, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,9,0, - 0,0,41,1,114,237,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,27,95,105,110,115,116,97, - 108,108,95,101,120,116,101,114,110,97,108,95,105,109,112,111, - 114,116,101,114,115,179,4,0,0,115,8,0,0,0,8,3, - 4,1,20,1,255,128,114,238,0,0,0,41,2,78,78,41, - 1,78,41,2,78,114,25,0,0,0,41,4,78,78,114,5, - 0,0,0,114,25,0,0,0,41,54,114,10,0,0,0,114, - 7,0,0,0,114,26,0,0,0,114,95,0,0,0,114,68, - 0,0,0,114,133,0,0,0,114,17,0,0,0,114,21,0, - 0,0,114,63,0,0,0,114,37,0,0,0,114,47,0,0, - 0,114,22,0,0,0,114,23,0,0,0,114,53,0,0,0, - 114,54,0,0,0,114,57,0,0,0,114,69,0,0,0,114, - 71,0,0,0,114,80,0,0,0,114,90,0,0,0,114,94, - 0,0,0,114,105,0,0,0,114,118,0,0,0,114,119,0, - 0,0,114,98,0,0,0,114,149,0,0,0,114,155,0,0, - 0,114,159,0,0,0,114,114,0,0,0,114,100,0,0,0, - 114,166,0,0,0,114,167,0,0,0,114,101,0,0,0,114, - 169,0,0,0,114,184,0,0,0,114,189,0,0,0,114,198, - 0,0,0,114,200,0,0,0,114,202,0,0,0,114,208,0, - 0,0,90,15,95,69,82,82,95,77,83,71,95,80,82,69, - 70,73,88,114,210,0,0,0,114,213,0,0,0,218,6,111, - 98,106,101,99,116,114,214,0,0,0,114,215,0,0,0,114, - 216,0,0,0,114,221,0,0,0,114,227,0,0,0,114,230, - 0,0,0,114,231,0,0,0,114,235,0,0,0,114,236,0, - 0,0,114,238,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,8,60,109,111, - 100,117,108,101,62,1,0,0,0,115,106,0,0,0,4,0, - 8,22,4,9,4,1,4,1,4,3,8,3,8,8,4,8, - 4,2,16,3,14,4,14,77,14,21,8,16,8,37,8,17, - 14,11,8,8,8,11,8,12,8,19,14,36,16,101,10,26, - 14,45,8,72,8,17,8,17,8,30,8,36,8,45,14,15, - 14,75,14,80,8,13,8,9,10,9,8,47,4,16,8,1, - 8,2,6,32,8,3,10,16,14,15,8,37,10,27,8,37, - 8,7,8,35,12,8,255,128, + 38,0,0,0,116,0,160,1,124,0,161,1,125,1,124,1, + 100,0,117,0,114,30,116,2,100,1,124,0,23,0,131,1, + 130,1,116,3,124,1,131,1,83,0,41,2,78,122,25,110, + 111,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,32,110,97,109,101,100,32,41,4,114,169,0,0,0,114, + 177,0,0,0,114,83,0,0,0,114,167,0,0,0,41,2, + 114,20,0,0,0,114,103,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,18,95,98,117,105,108, + 116,105,110,95,102,114,111,109,95,110,97,109,101,129,4,0, + 0,115,10,0,0,0,10,1,8,1,12,1,8,1,255,128, + 114,231,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,10,0,0,0,5,0,0,0,67,0,0,0,115,164, + 0,0,0,124,1,97,0,124,0,97,1,116,2,116,1,131, + 1,125,2,116,1,106,3,160,4,161,0,68,0,93,70,92, + 2,125,3,125,4,116,5,124,4,124,2,131,2,114,26,124, + 3,116,1,106,6,118,0,114,60,116,7,125,5,110,16,116, + 0,160,8,124,3,161,1,114,26,116,9,125,5,110,0,116, + 10,124,4,124,5,131,2,125,6,116,11,124,6,124,4,131, + 2,1,0,113,26,116,1,106,3,116,12,25,0,125,7,100, + 1,68,0,93,46,125,8,124,8,116,1,106,3,118,1,114, + 136,116,13,124,8,131,1,125,9,110,10,116,1,106,3,124, + 8,25,0,125,9,116,14,124,7,124,8,124,9,131,3,1, + 0,113,112,100,2,83,0,41,3,122,250,83,101,116,117,112, + 32,105,109,112,111,114,116,108,105,98,32,98,121,32,105,109, + 112,111,114,116,105,110,103,32,110,101,101,100,101,100,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, + 97,110,100,32,105,110,106,101,99,116,105,110,103,32,116,104, + 101,109,10,32,32,32,32,105,110,116,111,32,116,104,101,32, + 103,108,111,98,97,108,32,110,97,109,101,115,112,97,99,101, + 46,10,10,32,32,32,32,65,115,32,115,121,115,32,105,115, + 32,110,101,101,100,101,100,32,102,111,114,32,115,121,115,46, + 109,111,100,117,108,101,115,32,97,99,99,101,115,115,32,97, + 110,100,32,95,105,109,112,32,105,115,32,110,101,101,100,101, + 100,32,116,111,32,108,111,97,100,32,98,117,105,108,116,45, + 105,110,10,32,32,32,32,109,111,100,117,108,101,115,44,32, + 116,104,111,115,101,32,116,119,111,32,109,111,100,117,108,101, + 115,32,109,117,115,116,32,98,101,32,101,120,112,108,105,99, + 105,116,108,121,32,112,97,115,115,101,100,32,105,110,46,10, + 10,32,32,32,32,41,3,114,26,0,0,0,114,95,0,0, + 0,114,68,0,0,0,78,41,15,114,61,0,0,0,114,18, + 0,0,0,114,3,0,0,0,114,99,0,0,0,218,5,105, + 116,101,109,115,114,203,0,0,0,114,82,0,0,0,114,169, + 0,0,0,114,92,0,0,0,114,184,0,0,0,114,149,0, + 0,0,114,155,0,0,0,114,9,0,0,0,114,231,0,0, + 0,114,12,0,0,0,41,10,218,10,115,121,115,95,109,111, + 100,117,108,101,218,11,95,105,109,112,95,109,111,100,117,108, + 101,90,11,109,111,100,117,108,101,95,116,121,112,101,114,20, + 0,0,0,114,104,0,0,0,114,116,0,0,0,114,103,0, + 0,0,90,11,115,101,108,102,95,109,111,100,117,108,101,90, + 12,98,117,105,108,116,105,110,95,110,97,109,101,90,14,98, + 117,105,108,116,105,110,95,109,111,100,117,108,101,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,6,95,115, + 101,116,117,112,136,4,0,0,115,40,0,0,0,4,9,4, + 1,8,3,18,1,10,1,10,1,6,1,10,1,6,1,10, + 3,10,1,2,128,10,3,8,1,10,1,10,1,10,2,14, + 1,4,251,255,128,114,235,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, + 0,0,0,115,38,0,0,0,116,0,124,0,124,1,131,2, + 1,0,116,1,106,2,160,3,116,4,161,1,1,0,116,1, + 106,2,160,3,116,5,161,1,1,0,100,1,83,0,41,2, + 122,48,73,110,115,116,97,108,108,32,105,109,112,111,114,116, + 101,114,115,32,102,111,114,32,98,117,105,108,116,105,110,32, + 97,110,100,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,115,78,41,6,114,235,0,0,0,114,18,0,0,0,114, + 201,0,0,0,114,126,0,0,0,114,169,0,0,0,114,184, + 0,0,0,41,2,114,233,0,0,0,114,234,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,8, + 95,105,110,115,116,97,108,108,171,4,0,0,115,8,0,0, + 0,10,2,12,2,16,1,255,128,114,236,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, + 0,0,0,67,0,0,0,115,32,0,0,0,100,1,100,2, + 108,0,125,0,124,0,97,1,124,0,160,2,116,3,106,4, + 116,5,25,0,161,1,1,0,100,2,83,0,41,3,122,57, + 73,110,115,116,97,108,108,32,105,109,112,111,114,116,101,114, + 115,32,116,104,97,116,32,114,101,113,117,105,114,101,32,101, + 120,116,101,114,110,97,108,32,102,105,108,101,115,121,115,116, + 101,109,32,97,99,99,101,115,115,114,25,0,0,0,78,41, + 6,218,26,95,102,114,111,122,101,110,95,105,109,112,111,114, + 116,108,105,98,95,101,120,116,101,114,110,97,108,114,133,0, + 0,0,114,236,0,0,0,114,18,0,0,0,114,99,0,0, + 0,114,9,0,0,0,41,1,114,237,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,27,95,105, + 110,115,116,97,108,108,95,101,120,116,101,114,110,97,108,95, + 105,109,112,111,114,116,101,114,115,179,4,0,0,115,8,0, + 0,0,8,3,4,1,20,1,255,128,114,238,0,0,0,41, + 2,78,78,41,1,78,41,2,78,114,25,0,0,0,41,4, + 78,78,114,5,0,0,0,114,25,0,0,0,41,54,114,10, + 0,0,0,114,7,0,0,0,114,26,0,0,0,114,95,0, + 0,0,114,68,0,0,0,114,133,0,0,0,114,17,0,0, + 0,114,21,0,0,0,114,63,0,0,0,114,37,0,0,0, + 114,47,0,0,0,114,22,0,0,0,114,23,0,0,0,114, + 53,0,0,0,114,54,0,0,0,114,57,0,0,0,114,69, + 0,0,0,114,71,0,0,0,114,80,0,0,0,114,90,0, + 0,0,114,94,0,0,0,114,105,0,0,0,114,118,0,0, + 0,114,119,0,0,0,114,98,0,0,0,114,149,0,0,0, + 114,155,0,0,0,114,159,0,0,0,114,114,0,0,0,114, + 100,0,0,0,114,166,0,0,0,114,167,0,0,0,114,101, + 0,0,0,114,169,0,0,0,114,184,0,0,0,114,189,0, + 0,0,114,198,0,0,0,114,200,0,0,0,114,202,0,0, + 0,114,208,0,0,0,90,15,95,69,82,82,95,77,83,71, + 95,80,82,69,70,73,88,114,210,0,0,0,114,213,0,0, + 0,218,6,111,98,106,101,99,116,114,214,0,0,0,114,215, + 0,0,0,114,216,0,0,0,114,221,0,0,0,114,227,0, + 0,0,114,230,0,0,0,114,231,0,0,0,114,235,0,0, + 0,114,236,0,0,0,114,238,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 8,60,109,111,100,117,108,101,62,1,0,0,0,115,106,0, + 0,0,4,0,8,22,4,9,4,1,4,1,4,3,8,3, + 8,8,4,8,4,2,16,3,14,4,14,77,14,21,8,16, + 8,37,8,17,14,11,8,8,8,11,8,12,8,19,14,36, + 16,101,10,26,14,45,8,72,8,17,8,17,8,30,8,36, + 8,45,14,15,14,75,14,80,8,13,8,9,10,9,8,47, + 4,16,8,1,8,2,6,32,8,3,10,16,14,15,8,37, + 10,27,8,37,8,7,8,35,12,8,255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 58dc10b6f35bcd..a5da2a92df4747 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -632,2037 +632,2037 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 218,6,117,112,100,97,116,101,41,3,90,3,110,101,119,90, 3,111,108,100,114,75,0,0,0,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,5,95,119,114,97,112,3, - 2,0,0,115,10,0,0,0,8,1,10,1,20,1,18,1, - 255,128,122,26,95,99,104,101,99,107,95,110,97,109,101,46, - 60,108,111,99,97,108,115,62,46,95,119,114,97,112,41,1, - 78,41,2,218,10,95,98,111,111,116,115,116,114,97,112,114, - 138,0,0,0,41,3,114,127,0,0,0,114,128,0,0,0, - 114,138,0,0,0,114,7,0,0,0,114,126,0,0,0,114, - 8,0,0,0,218,11,95,99,104,101,99,107,95,110,97,109, - 101,238,1,0,0,115,14,0,0,0,14,8,8,10,8,1, - 8,2,10,6,4,1,255,128,114,140,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0, - 0,0,67,0,0,0,115,60,0,0,0,124,0,160,0,124, - 1,161,1,92,2,125,2,125,3,124,2,100,1,117,0,114, - 56,116,1,124,3,131,1,114,56,100,2,125,4,116,2,160, - 3,124,4,160,4,124,3,100,3,25,0,161,1,116,5,161, - 2,1,0,124,2,83,0,41,4,122,155,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,10,10,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 32,105,110,32,102,97,118,111,114,32,111,102,32,102,105,110, - 100,101,114,46,102,105,110,100,95,115,112,101,99,40,41,46, - 10,10,32,32,32,32,78,122,44,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,114,0,0,0,0,41,6,218,11,102,105, - 110,100,95,108,111,97,100,101,114,114,4,0,0,0,114,81, - 0,0,0,114,82,0,0,0,114,70,0,0,0,218,13,73, - 109,112,111,114,116,87,97,114,110,105,110,103,41,5,114,123, - 0,0,0,218,8,102,117,108,108,110,97,109,101,218,6,108, - 111,97,100,101,114,218,8,112,111,114,116,105,111,110,115,218, - 3,109,115,103,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,17,95,102,105,110,100,95,109,111,100,117,108, - 101,95,115,104,105,109,13,2,0,0,115,12,0,0,0,14, - 10,16,1,4,1,22,1,4,1,255,128,114,147,0,0,0, - 99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0, - 0,4,0,0,0,67,0,0,0,115,166,0,0,0,124,0, - 100,1,100,2,133,2,25,0,125,3,124,3,116,0,107,3, - 114,64,100,3,124,1,155,2,100,4,124,3,155,2,157,4, - 125,4,116,1,160,2,100,5,124,4,161,2,1,0,116,3, - 124,4,102,1,105,0,124,2,164,1,142,1,130,1,116,4, - 124,0,131,1,100,6,107,0,114,106,100,7,124,1,155,2, - 157,2,125,4,116,1,160,2,100,5,124,4,161,2,1,0, - 116,5,124,4,131,1,130,1,116,6,124,0,100,2,100,8, - 133,2,25,0,131,1,125,5,124,5,100,9,64,0,114,162, - 100,10,124,5,155,2,100,11,124,1,155,2,157,4,125,4, + 2,0,0,115,12,0,0,0,8,1,10,1,18,1,2,128, + 18,1,255,128,122,26,95,99,104,101,99,107,95,110,97,109, + 101,46,60,108,111,99,97,108,115,62,46,95,119,114,97,112, + 41,1,78,41,2,218,10,95,98,111,111,116,115,116,114,97, + 112,114,138,0,0,0,41,3,114,127,0,0,0,114,128,0, + 0,0,114,138,0,0,0,114,7,0,0,0,114,126,0,0, + 0,114,8,0,0,0,218,11,95,99,104,101,99,107,95,110, + 97,109,101,238,1,0,0,115,14,0,0,0,14,8,8,10, + 8,1,8,2,10,6,4,1,255,128,114,140,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 6,0,0,0,67,0,0,0,115,60,0,0,0,124,0,160, + 0,124,1,161,1,92,2,125,2,125,3,124,2,100,1,117, + 0,114,56,116,1,124,3,131,1,114,56,100,2,125,4,116, + 2,160,3,124,4,160,4,124,3,100,3,25,0,161,1,116, + 5,161,2,1,0,124,2,83,0,41,4,122,155,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,10,10,32,32,32,32,84,104,105,115,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,32,105,110,32,102,97,118,111,114,32,111,102,32,102, + 105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,40, + 41,46,10,10,32,32,32,32,78,122,44,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,114,0,0,0,0,41,6,218,11, + 102,105,110,100,95,108,111,97,100,101,114,114,4,0,0,0, + 114,81,0,0,0,114,82,0,0,0,114,70,0,0,0,218, + 13,73,109,112,111,114,116,87,97,114,110,105,110,103,41,5, + 114,123,0,0,0,218,8,102,117,108,108,110,97,109,101,218, + 6,108,111,97,100,101,114,218,8,112,111,114,116,105,111,110, + 115,218,3,109,115,103,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,17,95,102,105,110,100,95,109,111,100, + 117,108,101,95,115,104,105,109,13,2,0,0,115,12,0,0, + 0,14,10,16,1,4,1,22,1,4,1,255,128,114,147,0, + 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,4,0,0,0,67,0,0,0,115,166,0,0,0, + 124,0,100,1,100,2,133,2,25,0,125,3,124,3,116,0, + 107,3,114,64,100,3,124,1,155,2,100,4,124,3,155,2, + 157,4,125,4,116,1,160,2,100,5,124,4,161,2,1,0, 116,3,124,4,102,1,105,0,124,2,164,1,142,1,130,1, - 124,5,83,0,41,12,97,84,2,0,0,80,101,114,102,111, - 114,109,32,98,97,115,105,99,32,118,97,108,105,100,105,116, - 121,32,99,104,101,99,107,105,110,103,32,111,102,32,97,32, - 112,121,99,32,104,101,97,100,101,114,32,97,110,100,32,114, - 101,116,117,114,110,32,116,104,101,32,102,108,97,103,115,32, - 102,105,101,108,100,44,10,32,32,32,32,119,104,105,99,104, - 32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32, - 116,104,101,32,112,121,99,32,115,104,111,117,108,100,32,98, - 101,32,102,117,114,116,104,101,114,32,118,97,108,105,100,97, - 116,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32, - 115,111,117,114,99,101,46,10,10,32,32,32,32,42,100,97, - 116,97,42,32,105,115,32,116,104,101,32,99,111,110,116,101, - 110,116,115,32,111,102,32,116,104,101,32,112,121,99,32,102, - 105,108,101,46,32,40,79,110,108,121,32,116,104,101,32,102, - 105,114,115,116,32,49,54,32,98,121,116,101,115,32,97,114, - 101,10,32,32,32,32,114,101,113,117,105,114,101,100,44,32, - 116,104,111,117,103,104,46,41,10,10,32,32,32,32,42,110, - 97,109,101,42,32,105,115,32,116,104,101,32,110,97,109,101, - 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,98, - 101,105,110,103,32,105,109,112,111,114,116,101,100,46,32,73, - 116,32,105,115,32,117,115,101,100,32,102,111,114,32,108,111, - 103,103,105,110,103,46,10,10,32,32,32,32,42,101,120,99, - 95,100,101,116,97,105,108,115,42,32,105,115,32,97,32,100, - 105,99,116,105,111,110,97,114,121,32,112,97,115,115,101,100, - 32,116,111,32,73,109,112,111,114,116,69,114,114,111,114,32, - 105,102,32,105,116,32,114,97,105,115,101,100,32,102,111,114, - 10,32,32,32,32,105,109,112,114,111,118,101,100,32,100,101, - 98,117,103,103,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,119,104,101,110,32,116, - 104,101,32,102,108,97,103,115,10,32,32,32,32,102,105,101, - 108,100,32,105,115,32,105,110,118,97,108,105,100,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,32,116, - 114,117,110,99,97,116,101,100,46,10,10,32,32,32,32,78, - 114,28,0,0,0,122,20,98,97,100,32,109,97,103,105,99, - 32,110,117,109,98,101,114,32,105,110,32,122,2,58,32,250, - 2,123,125,233,16,0,0,0,122,40,114,101,97,99,104,101, - 100,32,69,79,70,32,119,104,105,108,101,32,114,101,97,100, - 105,110,103,32,112,121,99,32,104,101,97,100,101,114,32,111, - 102,32,233,8,0,0,0,233,252,255,255,255,122,14,105,110, - 118,97,108,105,100,32,102,108,97,103,115,32,122,4,32,105, - 110,32,41,7,218,12,77,65,71,73,67,95,78,85,77,66, - 69,82,114,139,0,0,0,218,16,95,118,101,114,98,111,115, - 101,95,109,101,115,115,97,103,101,114,122,0,0,0,114,4, - 0,0,0,218,8,69,79,70,69,114,114,111,114,114,38,0, - 0,0,41,6,114,37,0,0,0,114,121,0,0,0,218,11, - 101,120,99,95,100,101,116,97,105,108,115,90,5,109,97,103, - 105,99,114,98,0,0,0,114,16,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,13,95,99,108, - 97,115,115,105,102,121,95,112,121,99,30,2,0,0,115,30, - 0,0,0,12,16,8,1,16,1,12,1,16,1,12,1,10, - 1,12,1,8,1,16,1,8,2,16,1,16,1,4,1,255, - 128,114,156,0,0,0,99,5,0,0,0,0,0,0,0,0, - 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, - 124,0,0,0,116,0,124,0,100,1,100,2,133,2,25,0, - 131,1,124,1,100,3,64,0,107,3,114,62,100,4,124,3, - 155,2,157,2,125,5,116,1,160,2,100,5,124,5,161,2, - 1,0,116,3,124,5,102,1,105,0,124,4,164,1,142,1, - 130,1,124,2,100,6,117,1,114,120,116,0,124,0,100,2, - 100,7,133,2,25,0,131,1,124,2,100,3,64,0,107,3, - 114,116,116,3,100,4,124,3,155,2,157,2,102,1,105,0, - 124,4,164,1,142,1,130,1,100,6,83,0,100,6,83,0, - 41,8,97,7,2,0,0,86,97,108,105,100,97,116,101,32, - 97,32,112,121,99,32,97,103,97,105,110,115,116,32,116,104, - 101,32,115,111,117,114,99,101,32,108,97,115,116,45,109,111, - 100,105,102,105,101,100,32,116,105,109,101,46,10,10,32,32, - 32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,32, - 99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32, - 112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,32, - 116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,116, - 101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,105, - 114,101,100,46,41,10,10,32,32,32,32,42,115,111,117,114, - 99,101,95,109,116,105,109,101,42,32,105,115,32,116,104,101, - 32,108,97,115,116,32,109,111,100,105,102,105,101,100,32,116, - 105,109,101,115,116,97,109,112,32,111,102,32,116,104,101,32, - 115,111,117,114,99,101,32,102,105,108,101,46,10,10,32,32, - 32,32,42,115,111,117,114,99,101,95,115,105,122,101,42,32, - 105,115,32,78,111,110,101,32,111,114,32,116,104,101,32,115, - 105,122,101,32,111,102,32,116,104,101,32,115,111,117,114,99, - 101,32,102,105,108,101,32,105,110,32,98,121,116,101,115,46, - 10,10,32,32,32,32,42,110,97,109,101,42,32,105,115,32, - 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32, - 109,111,100,117,108,101,32,98,101,105,110,103,32,105,109,112, - 111,114,116,101,100,46,32,73,116,32,105,115,32,117,115,101, - 100,32,102,111,114,32,108,111,103,103,105,110,103,46,10,10, - 32,32,32,32,42,101,120,99,95,100,101,116,97,105,108,115, - 42,32,105,115,32,97,32,100,105,99,116,105,111,110,97,114, - 121,32,112,97,115,115,101,100,32,116,111,32,73,109,112,111, - 114,116,69,114,114,111,114,32,105,102,32,105,116,32,114,97, - 105,115,101,100,32,102,111,114,10,32,32,32,32,105,109,112, - 114,111,118,101,100,32,100,101,98,117,103,103,105,110,103,46, - 10,10,32,32,32,32,65,110,32,73,109,112,111,114,116,69, - 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,105, - 102,32,116,104,101,32,98,121,116,101,99,111,100,101,32,105, - 115,32,115,116,97,108,101,46,10,10,32,32,32,32,114,150, - 0,0,0,233,12,0,0,0,114,27,0,0,0,122,22,98, - 121,116,101,99,111,100,101,32,105,115,32,115,116,97,108,101, - 32,102,111,114,32,114,148,0,0,0,78,114,149,0,0,0, - 41,4,114,38,0,0,0,114,139,0,0,0,114,153,0,0, - 0,114,122,0,0,0,41,6,114,37,0,0,0,218,12,115, - 111,117,114,99,101,95,109,116,105,109,101,218,11,115,111,117, - 114,99,101,95,115,105,122,101,114,121,0,0,0,114,155,0, - 0,0,114,98,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,23,95,118,97,108,105,100,97,116, - 101,95,116,105,109,101,115,116,97,109,112,95,112,121,99,63, - 2,0,0,115,20,0,0,0,24,19,10,1,12,1,16,1, - 8,1,22,1,2,255,22,2,8,254,255,128,114,160,0,0, - 0,99,4,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,4,0,0,0,67,0,0,0,115,42,0,0,0,124, - 0,100,1,100,2,133,2,25,0,124,1,107,3,114,38,116, - 0,100,3,124,2,155,2,157,2,102,1,105,0,124,3,164, - 1,142,1,130,1,100,4,83,0,41,5,97,243,1,0,0, - 86,97,108,105,100,97,116,101,32,97,32,104,97,115,104,45, - 98,97,115,101,100,32,112,121,99,32,98,121,32,99,104,101, - 99,107,105,110,103,32,116,104,101,32,114,101,97,108,32,115, - 111,117,114,99,101,32,104,97,115,104,32,97,103,97,105,110, - 115,116,32,116,104,101,32,111,110,101,32,105,110,10,32,32, - 32,32,116,104,101,32,112,121,99,32,104,101,97,100,101,114, - 46,10,10,32,32,32,32,42,100,97,116,97,42,32,105,115, - 32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102, - 32,116,104,101,32,112,121,99,32,102,105,108,101,46,32,40, - 79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,49, - 54,32,98,121,116,101,115,32,97,114,101,10,32,32,32,32, - 114,101,113,117,105,114,101,100,46,41,10,10,32,32,32,32, - 42,115,111,117,114,99,101,95,104,97,115,104,42,32,105,115, - 32,116,104,101,32,105,109,112,111,114,116,108,105,98,46,117, - 116,105,108,46,115,111,117,114,99,101,95,104,97,115,104,40, - 41,32,111,102,32,116,104,101,32,115,111,117,114,99,101,32, - 102,105,108,101,46,10,10,32,32,32,32,42,110,97,109,101, - 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, - 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, - 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, - 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, - 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, - 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, - 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, - 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, - 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, - 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, - 103,105,110,103,46,10,10,32,32,32,32,65,110,32,73,109, - 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, - 115,101,100,32,105,102,32,116,104,101,32,98,121,116,101,99, - 111,100,101,32,105,115,32,115,116,97,108,101,46,10,10,32, - 32,32,32,114,150,0,0,0,114,149,0,0,0,122,46,104, - 97,115,104,32,105,110,32,98,121,116,101,99,111,100,101,32, - 100,111,101,115,110,39,116,32,109,97,116,99,104,32,104,97, - 115,104,32,111,102,32,115,111,117,114,99,101,32,78,41,1, - 114,122,0,0,0,41,4,114,37,0,0,0,218,11,115,111, - 117,114,99,101,95,104,97,115,104,114,121,0,0,0,114,155, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,18,95,118,97,108,105,100,97,116,101,95,104,97, - 115,104,95,112,121,99,91,2,0,0,115,16,0,0,0,16, - 17,2,1,8,1,4,255,2,2,6,254,4,255,255,128,114, - 162,0,0,0,99,4,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,5,0,0,0,67,0,0,0,115,76,0, - 0,0,116,0,160,1,124,0,161,1,125,4,116,2,124,4, - 116,3,131,2,114,56,116,4,160,5,100,1,124,2,161,2, - 1,0,124,3,100,2,117,1,114,52,116,6,160,7,124,4, - 124,3,161,2,1,0,124,4,83,0,116,8,100,3,160,9, - 124,2,161,1,124,1,124,2,100,4,141,3,130,1,41,5, - 122,35,67,111,109,112,105,108,101,32,98,121,116,101,99,111, - 100,101,32,97,115,32,102,111,117,110,100,32,105,110,32,97, - 32,112,121,99,46,122,21,99,111,100,101,32,111,98,106,101, - 99,116,32,102,114,111,109,32,123,33,114,125,78,122,23,78, - 111,110,45,99,111,100,101,32,111,98,106,101,99,116,32,105, - 110,32,123,33,114,125,169,2,114,121,0,0,0,114,52,0, - 0,0,41,10,218,7,109,97,114,115,104,97,108,90,5,108, - 111,97,100,115,218,10,105,115,105,110,115,116,97,110,99,101, - 218,10,95,99,111,100,101,95,116,121,112,101,114,139,0,0, - 0,114,153,0,0,0,218,4,95,105,109,112,90,16,95,102, - 105,120,95,99,111,95,102,105,108,101,110,97,109,101,114,122, - 0,0,0,114,70,0,0,0,41,5,114,37,0,0,0,114, - 121,0,0,0,114,111,0,0,0,114,112,0,0,0,218,4, - 99,111,100,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,17,95,99,111,109,112,105,108,101,95,98,121, - 116,101,99,111,100,101,115,2,0,0,115,20,0,0,0,10, - 2,10,1,12,1,8,1,12,1,4,1,10,2,4,1,6, - 255,255,128,114,169,0,0,0,99,3,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, - 0,115,70,0,0,0,116,0,116,1,131,1,125,3,124,3, - 160,2,116,3,100,1,131,1,161,1,1,0,124,3,160,2, - 116,3,124,1,131,1,161,1,1,0,124,3,160,2,116,3, - 124,2,131,1,161,1,1,0,124,3,160,2,116,4,160,5, - 124,0,161,1,161,1,1,0,124,3,83,0,41,3,122,43, - 80,114,111,100,117,99,101,32,116,104,101,32,100,97,116,97, - 32,102,111,114,32,97,32,116,105,109,101,115,116,97,109,112, - 45,98,97,115,101,100,32,112,121,99,46,114,0,0,0,0, - 78,41,6,218,9,98,121,116,101,97,114,114,97,121,114,152, - 0,0,0,218,6,101,120,116,101,110,100,114,33,0,0,0, - 114,164,0,0,0,218,5,100,117,109,112,115,41,4,114,168, - 0,0,0,218,5,109,116,105,109,101,114,159,0,0,0,114, - 37,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,22,95,99,111,100,101,95,116,111,95,116,105, - 109,101,115,116,97,109,112,95,112,121,99,128,2,0,0,115, - 14,0,0,0,8,2,14,1,14,1,14,1,16,1,4,1, - 255,128,114,174,0,0,0,84,99,3,0,0,0,0,0,0, - 0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,0, - 0,115,80,0,0,0,116,0,116,1,131,1,125,3,100,1, - 124,2,100,1,62,0,66,0,125,4,124,3,160,2,116,3, - 124,4,131,1,161,1,1,0,116,4,124,1,131,1,100,2, - 107,2,115,50,74,0,130,1,124,3,160,2,124,1,161,1, - 1,0,124,3,160,2,116,5,160,6,124,0,161,1,161,1, - 1,0,124,3,83,0,41,4,122,38,80,114,111,100,117,99, - 101,32,116,104,101,32,100,97,116,97,32,102,111,114,32,97, - 32,104,97,115,104,45,98,97,115,101,100,32,112,121,99,46, - 114,3,0,0,0,114,150,0,0,0,78,41,7,114,170,0, - 0,0,114,152,0,0,0,114,171,0,0,0,114,33,0,0, - 0,114,4,0,0,0,114,164,0,0,0,114,172,0,0,0, - 41,5,114,168,0,0,0,114,161,0,0,0,90,7,99,104, - 101,99,107,101,100,114,37,0,0,0,114,16,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,17, - 95,99,111,100,101,95,116,111,95,104,97,115,104,95,112,121, - 99,138,2,0,0,115,16,0,0,0,8,2,12,1,14,1, - 16,1,10,1,16,1,4,1,255,128,114,175,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 6,0,0,0,67,0,0,0,115,62,0,0,0,100,1,100, - 2,108,0,125,1,116,1,160,2,124,0,161,1,106,3,125, - 2,124,1,160,4,124,2,161,1,125,3,116,1,160,5,100, - 2,100,3,161,2,125,4,124,4,160,6,124,0,160,6,124, - 3,100,1,25,0,161,1,161,1,83,0,41,4,122,121,68, - 101,99,111,100,101,32,98,121,116,101,115,32,114,101,112,114, - 101,115,101,110,116,105,110,103,32,115,111,117,114,99,101,32, - 99,111,100,101,32,97,110,100,32,114,101,116,117,114,110,32, - 116,104,101,32,115,116,114,105,110,103,46,10,10,32,32,32, - 32,85,110,105,118,101,114,115,97,108,32,110,101,119,108,105, - 110,101,32,115,117,112,112,111,114,116,32,105,115,32,117,115, - 101,100,32,105,110,32,116,104,101,32,100,101,99,111,100,105, - 110,103,46,10,32,32,32,32,114,0,0,0,0,78,84,41, - 7,218,8,116,111,107,101,110,105,122,101,114,72,0,0,0, - 90,7,66,121,116,101,115,73,79,90,8,114,101,97,100,108, - 105,110,101,90,15,100,101,116,101,99,116,95,101,110,99,111, - 100,105,110,103,90,25,73,110,99,114,101,109,101,110,116,97, - 108,78,101,119,108,105,110,101,68,101,99,111,100,101,114,218, - 6,100,101,99,111,100,101,41,5,218,12,115,111,117,114,99, - 101,95,98,121,116,101,115,114,176,0,0,0,90,21,115,111, - 117,114,99,101,95,98,121,116,101,115,95,114,101,97,100,108, - 105,110,101,218,8,101,110,99,111,100,105,110,103,90,15,110, - 101,119,108,105,110,101,95,100,101,99,111,100,101,114,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,13,100, - 101,99,111,100,101,95,115,111,117,114,99,101,149,2,0,0, - 115,12,0,0,0,8,5,12,1,10,1,12,1,20,1,255, - 128,114,180,0,0,0,169,2,114,144,0,0,0,218,26,115, - 117,98,109,111,100,117,108,101,95,115,101,97,114,99,104,95, - 108,111,99,97,116,105,111,110,115,99,2,0,0,0,0,0, - 0,0,2,0,0,0,9,0,0,0,8,0,0,0,67,0, - 0,0,115,8,1,0,0,124,1,100,1,117,0,114,56,100, - 2,125,1,116,0,124,2,100,3,131,2,114,66,122,14,124, - 2,160,1,124,0,161,1,125,1,87,0,110,28,4,0,116, - 2,121,54,1,0,1,0,1,0,89,0,110,12,48,0,116, - 3,160,4,124,1,161,1,125,1,116,5,106,6,124,0,124, - 2,124,1,100,4,141,3,125,4,100,5,124,4,95,7,124, - 2,100,1,117,0,114,148,116,8,131,0,68,0,93,40,92, - 2,125,5,125,6,124,1,160,9,116,10,124,6,131,1,161, - 1,114,102,124,5,124,0,124,1,131,2,125,2,124,2,124, - 4,95,11,1,0,113,148,100,1,83,0,124,3,116,12,117, - 0,114,212,116,0,124,2,100,6,131,2,114,218,122,14,124, - 2,160,13,124,0,161,1,125,7,87,0,110,18,4,0,116, - 2,121,198,1,0,1,0,1,0,89,0,110,20,48,0,124, - 7,114,218,103,0,124,4,95,14,110,6,124,3,124,4,95, - 14,124,4,106,14,103,0,107,2,144,1,114,4,124,1,144, - 1,114,4,116,15,124,1,131,1,100,7,25,0,125,8,124, - 4,106,14,160,16,124,8,161,1,1,0,124,4,83,0,41, - 8,97,61,1,0,0,82,101,116,117,114,110,32,97,32,109, - 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, - 32,111,110,32,97,32,102,105,108,101,32,108,111,99,97,116, - 105,111,110,46,10,10,32,32,32,32,84,111,32,105,110,100, - 105,99,97,116,101,32,116,104,97,116,32,116,104,101,32,109, - 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, - 103,101,44,32,115,101,116,10,32,32,32,32,115,117,98,109, - 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,32,116,111,32,97,32,108,105,115,116, - 32,111,102,32,100,105,114,101,99,116,111,114,121,32,112,97, - 116,104,115,46,32,32,65,110,10,32,32,32,32,101,109,112, - 116,121,32,108,105,115,116,32,105,115,32,115,117,102,102,105, - 99,105,101,110,116,44,32,116,104,111,117,103,104,32,105,116, - 115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32, - 117,115,101,102,117,108,32,116,111,32,116,104,101,10,32,32, - 32,32,105,109,112,111,114,116,32,115,121,115,116,101,109,46, - 10,10,32,32,32,32,84,104,101,32,108,111,97,100,101,114, - 32,109,117,115,116,32,116,97,107,101,32,97,32,115,112,101, - 99,32,97,115,32,105,116,115,32,111,110,108,121,32,95,95, - 105,110,105,116,95,95,40,41,32,97,114,103,46,10,10,32, - 32,32,32,78,122,9,60,117,110,107,110,111,119,110,62,218, - 12,103,101,116,95,102,105,108,101,110,97,109,101,169,1,218, - 6,111,114,105,103,105,110,84,218,10,105,115,95,112,97,99, - 107,97,103,101,114,0,0,0,0,41,17,114,133,0,0,0, - 114,183,0,0,0,114,122,0,0,0,114,18,0,0,0,114, - 85,0,0,0,114,139,0,0,0,218,10,77,111,100,117,108, - 101,83,112,101,99,90,13,95,115,101,116,95,102,105,108,101, - 97,116,116,114,218,27,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,114,115,0,0,0,114,116,0,0,0,114,144,0,0,0, - 218,9,95,80,79,80,85,76,65,84,69,114,186,0,0,0, - 114,182,0,0,0,114,55,0,0,0,218,6,97,112,112,101, - 110,100,41,9,114,121,0,0,0,90,8,108,111,99,97,116, - 105,111,110,114,144,0,0,0,114,182,0,0,0,218,4,115, - 112,101,99,218,12,108,111,97,100,101,114,95,99,108,97,115, - 115,218,8,115,117,102,102,105,120,101,115,114,186,0,0,0, - 90,7,100,105,114,110,97,109,101,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,23,115,112,101,99,95,102, - 114,111,109,95,102,105,108,101,95,108,111,99,97,116,105,111, - 110,166,2,0,0,115,64,0,0,0,8,12,4,4,10,1, - 2,2,14,1,12,1,6,1,10,2,16,8,6,1,8,3, - 14,1,14,1,10,1,6,1,4,1,4,2,8,3,10,2, - 2,1,14,1,12,1,6,1,4,2,8,1,6,2,12,1, - 6,1,12,1,12,1,4,2,255,128,114,194,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,64,0,0,0,115,88,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,90,4,100,3,90, - 5,101,6,111,30,100,4,101,7,118,0,90,8,101,9,100, - 5,100,6,132,0,131,1,90,10,101,11,100,7,100,8,132, - 0,131,1,90,12,101,11,100,14,100,10,100,11,132,1,131, - 1,90,13,101,11,100,15,100,12,100,13,132,1,131,1,90, - 14,100,9,83,0,41,16,218,21,87,105,110,100,111,119,115, - 82,101,103,105,115,116,114,121,70,105,110,100,101,114,122,62, - 77,101,116,97,32,112,97,116,104,32,102,105,110,100,101,114, - 32,102,111,114,32,109,111,100,117,108,101,115,32,100,101,99, - 108,97,114,101,100,32,105,110,32,116,104,101,32,87,105,110, - 100,111,119,115,32,114,101,103,105,115,116,114,121,46,122,59, - 83,111,102,116,119,97,114,101,92,80,121,116,104,111,110,92, - 80,121,116,104,111,110,67,111,114,101,92,123,115,121,115,95, - 118,101,114,115,105,111,110,125,92,77,111,100,117,108,101,115, - 92,123,102,117,108,108,110,97,109,101,125,122,65,83,111,102, - 116,119,97,114,101,92,80,121,116,104,111,110,92,80,121,116, - 104,111,110,67,111,114,101,92,123,115,121,115,95,118,101,114, - 115,105,111,110,125,92,77,111,100,117,108,101,115,92,123,102, - 117,108,108,110,97,109,101,125,92,68,101,98,117,103,122,6, - 95,100,46,112,121,100,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,8,0,0,0,67,0,0,0,115, - 50,0,0,0,122,16,116,0,160,1,116,0,106,2,124,0, - 161,2,87,0,83,0,4,0,116,3,121,48,1,0,1,0, - 1,0,116,0,160,1,116,0,106,4,124,0,161,2,6,0, - 89,0,83,0,48,0,114,114,0,0,0,41,5,218,6,119, - 105,110,114,101,103,90,7,79,112,101,110,75,101,121,90,17, - 72,75,69,89,95,67,85,82,82,69,78,84,95,85,83,69, - 82,114,58,0,0,0,90,18,72,75,69,89,95,76,79,67, - 65,76,95,77,65,67,72,73,78,69,114,19,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,14, - 95,111,112,101,110,95,114,101,103,105,115,116,114,121,246,2, - 0,0,115,10,0,0,0,2,2,16,1,12,1,20,1,255, - 128,122,36,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,2,0,0,0,0,0,0,0, - 0,0,0,0,6,0,0,0,8,0,0,0,67,0,0,0, - 115,130,0,0,0,124,0,106,0,114,14,124,0,106,1,125, - 2,110,6,124,0,106,2,125,2,124,2,106,3,124,1,100, - 1,116,4,106,5,100,0,100,2,133,2,25,0,22,0,100, - 3,141,2,125,3,122,60,124,0,160,6,124,3,161,1,143, - 28,125,4,116,7,160,8,124,4,100,4,161,2,125,5,87, - 0,100,0,4,0,4,0,131,3,1,0,110,16,49,0,115, - 94,48,0,1,0,1,0,1,0,89,0,1,0,87,0,124, - 5,83,0,4,0,116,9,121,128,1,0,1,0,1,0,89, - 0,100,0,83,0,48,0,41,5,78,122,5,37,100,46,37, - 100,114,39,0,0,0,41,2,114,143,0,0,0,90,11,115, - 121,115,95,118,101,114,115,105,111,110,114,10,0,0,0,41, - 10,218,11,68,69,66,85,71,95,66,85,73,76,68,218,18, - 82,69,71,73,83,84,82,89,95,75,69,89,95,68,69,66, - 85,71,218,12,82,69,71,73,83,84,82,89,95,75,69,89, - 114,70,0,0,0,114,15,0,0,0,218,12,118,101,114,115, - 105,111,110,95,105,110,102,111,114,197,0,0,0,114,196,0, - 0,0,90,10,81,117,101,114,121,86,97,108,117,101,114,58, - 0,0,0,41,6,218,3,99,108,115,114,143,0,0,0,90, - 12,114,101,103,105,115,116,114,121,95,107,101,121,114,20,0, - 0,0,90,4,104,107,101,121,218,8,102,105,108,101,112,97, - 116,104,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,16,95,115,101,97,114,99,104,95,114,101,103,105,115, - 116,114,121,253,2,0,0,115,26,0,0,0,6,2,8,1, - 6,2,6,1,16,1,6,255,2,2,12,1,44,1,4,3, - 12,254,8,1,255,128,122,38,87,105,110,100,111,119,115,82, - 101,103,105,115,116,114,121,70,105,110,100,101,114,46,95,115, - 101,97,114,99,104,95,114,101,103,105,115,116,114,121,78,99, - 4,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0, - 8,0,0,0,67,0,0,0,115,118,0,0,0,124,0,160, - 0,124,1,161,1,125,4,124,4,100,0,117,0,114,22,100, - 0,83,0,122,12,116,1,124,4,131,1,1,0,87,0,110, - 20,4,0,116,2,121,54,1,0,1,0,1,0,89,0,100, - 0,83,0,48,0,116,3,131,0,68,0,93,50,92,2,125, - 5,125,6,124,4,160,4,116,5,124,6,131,1,161,1,114, - 62,116,6,106,7,124,1,124,5,124,1,124,4,131,2,124, - 4,100,1,141,3,125,7,124,7,2,0,1,0,83,0,100, - 0,83,0,41,2,78,114,184,0,0,0,41,8,114,204,0, - 0,0,114,57,0,0,0,114,58,0,0,0,114,188,0,0, - 0,114,115,0,0,0,114,116,0,0,0,114,139,0,0,0, - 218,16,115,112,101,99,95,102,114,111,109,95,108,111,97,100, - 101,114,41,8,114,202,0,0,0,114,143,0,0,0,114,52, - 0,0,0,218,6,116,97,114,103,101,116,114,203,0,0,0, - 114,144,0,0,0,114,193,0,0,0,114,191,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,9, - 102,105,110,100,95,115,112,101,99,12,3,0,0,115,32,0, - 0,0,10,2,8,1,4,1,2,1,12,1,12,1,8,1, - 14,1,14,1,6,1,8,1,2,1,6,254,8,3,4,251, - 255,128,122,31,87,105,110,100,111,119,115,82,101,103,105,115, - 116,114,121,70,105,110,100,101,114,46,102,105,110,100,95,115, - 112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,30,0,0, - 0,124,0,160,0,124,1,124,2,161,2,125,3,124,3,100, - 1,117,1,114,26,124,3,106,1,83,0,100,1,83,0,41, - 2,122,108,70,105,110,100,32,109,111,100,117,108,101,32,110, - 97,109,101,100,32,105,110,32,116,104,101,32,114,101,103,105, - 115,116,114,121,46,10,10,32,32,32,32,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101, - 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, - 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, - 169,2,114,207,0,0,0,114,144,0,0,0,169,4,114,202, - 0,0,0,114,143,0,0,0,114,52,0,0,0,114,191,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,102,105,110,100,95,109,111,100,117,108,101,28,3, - 0,0,115,10,0,0,0,12,7,8,1,6,1,4,2,255, - 128,122,33,87,105,110,100,111,119,115,82,101,103,105,115,116, - 114,121,70,105,110,100,101,114,46,102,105,110,100,95,109,111, - 100,117,108,101,41,2,78,78,41,1,78,41,15,114,130,0, - 0,0,114,129,0,0,0,114,131,0,0,0,114,132,0,0, - 0,114,200,0,0,0,114,199,0,0,0,218,11,95,77,83, - 95,87,73,78,68,79,87,83,218,18,69,88,84,69,78,83, - 73,79,78,95,83,85,70,70,73,88,69,83,114,198,0,0, - 0,218,12,115,116,97,116,105,99,109,101,116,104,111,100,114, - 197,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111, - 100,114,204,0,0,0,114,207,0,0,0,114,210,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,195,0,0,0,234,2,0,0,115,32,0, - 0,0,8,0,4,2,2,3,2,255,2,4,2,255,12,3, - 2,2,10,1,2,6,10,1,2,14,12,1,2,15,16,1, - 255,128,114,195,0,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,64,0,0,0, - 115,48,0,0,0,101,0,90,1,100,0,90,2,100,1,90, - 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, - 5,100,6,100,7,132,0,90,6,100,8,100,9,132,0,90, - 7,100,10,83,0,41,11,218,13,95,76,111,97,100,101,114, - 66,97,115,105,99,115,122,83,66,97,115,101,32,99,108,97, - 115,115,32,111,102,32,99,111,109,109,111,110,32,99,111,100, - 101,32,110,101,101,100,101,100,32,98,121,32,98,111,116,104, - 32,83,111,117,114,99,101,76,111,97,100,101,114,32,97,110, - 100,10,32,32,32,32,83,111,117,114,99,101,108,101,115,115, - 70,105,108,101,76,111,97,100,101,114,46,99,2,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0, - 67,0,0,0,115,64,0,0,0,116,0,124,0,160,1,124, - 1,161,1,131,1,100,1,25,0,125,2,124,2,160,2,100, - 2,100,1,161,2,100,3,25,0,125,3,124,1,160,3,100, - 2,161,1,100,4,25,0,125,4,124,3,100,5,107,2,111, - 62,124,4,100,5,107,3,83,0,41,7,122,141,67,111,110, - 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, - 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76, - 111,97,100,101,114,46,105,115,95,112,97,99,107,97,103,101, - 32,98,121,32,99,104,101,99,107,105,110,103,32,105,102,10, - 32,32,32,32,32,32,32,32,116,104,101,32,112,97,116,104, - 32,114,101,116,117,114,110,101,100,32,98,121,32,103,101,116, - 95,102,105,108,101,110,97,109,101,32,104,97,115,32,97,32, - 102,105,108,101,110,97,109,101,32,111,102,32,39,95,95,105, - 110,105,116,95,95,46,112,121,39,46,114,3,0,0,0,114, - 79,0,0,0,114,0,0,0,0,114,39,0,0,0,218,8, - 95,95,105,110,105,116,95,95,78,41,4,114,55,0,0,0, - 114,183,0,0,0,114,51,0,0,0,114,49,0,0,0,41, - 5,114,123,0,0,0,114,143,0,0,0,114,101,0,0,0, - 90,13,102,105,108,101,110,97,109,101,95,98,97,115,101,90, - 9,116,97,105,108,95,110,97,109,101,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,186,0,0,0,47,3, - 0,0,115,10,0,0,0,18,3,16,1,14,1,16,1,255, - 128,122,24,95,76,111,97,100,101,114,66,97,115,105,99,115, - 46,105,115,95,112,97,99,107,97,103,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,169,2,122, - 42,85,115,101,32,100,101,102,97,117,108,116,32,115,101,109, - 97,110,116,105,99,115,32,102,111,114,32,109,111,100,117,108, - 101,32,99,114,101,97,116,105,111,110,46,78,114,7,0,0, - 0,169,2,114,123,0,0,0,114,191,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,13,99,114, - 101,97,116,101,95,109,111,100,117,108,101,55,3,0,0,115, - 4,0,0,0,4,0,255,128,122,27,95,76,111,97,100,101, - 114,66,97,115,105,99,115,46,99,114,101,97,116,101,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,56, - 0,0,0,124,0,160,0,124,1,106,1,161,1,125,2,124, - 2,100,1,117,0,114,36,116,2,100,2,160,3,124,1,106, - 1,161,1,131,1,130,1,116,4,160,5,116,6,124,2,124, - 1,106,7,161,3,1,0,100,1,83,0,41,3,122,19,69, - 120,101,99,117,116,101,32,116,104,101,32,109,111,100,117,108, - 101,46,78,122,52,99,97,110,110,111,116,32,108,111,97,100, - 32,109,111,100,117,108,101,32,123,33,114,125,32,119,104,101, - 110,32,103,101,116,95,99,111,100,101,40,41,32,114,101,116, - 117,114,110,115,32,78,111,110,101,41,8,218,8,103,101,116, - 95,99,111,100,101,114,130,0,0,0,114,122,0,0,0,114, - 70,0,0,0,114,139,0,0,0,218,25,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,218,4,101,120,101,99,114,136,0,0,0,41, - 3,114,123,0,0,0,218,6,109,111,100,117,108,101,114,168, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,11,101,120,101,99,95,109,111,100,117,108,101,58, - 3,0,0,115,14,0,0,0,12,2,8,1,6,1,4,1, - 6,255,20,2,255,128,122,25,95,76,111,97,100,101,114,66, - 97,115,105,99,115,46,101,120,101,99,95,109,111,100,117,108, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,4,0,0,0,67,0,0,0,115,12,0,0,0,116, - 0,160,1,124,0,124,1,161,2,83,0,41,2,122,26,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,78,41,2,114,139,0,0, - 0,218,17,95,108,111,97,100,95,109,111,100,117,108,101,95, - 115,104,105,109,169,2,114,123,0,0,0,114,143,0,0,0, + 116,4,124,0,131,1,100,6,107,0,114,106,100,7,124,1, + 155,2,157,2,125,4,116,1,160,2,100,5,124,4,161,2, + 1,0,116,5,124,4,131,1,130,1,116,6,124,0,100,2, + 100,8,133,2,25,0,131,1,125,5,124,5,100,9,64,0, + 114,162,100,10,124,5,155,2,100,11,124,1,155,2,157,4, + 125,4,116,3,124,4,102,1,105,0,124,2,164,1,142,1, + 130,1,124,5,83,0,41,12,97,84,2,0,0,80,101,114, + 102,111,114,109,32,98,97,115,105,99,32,118,97,108,105,100, + 105,116,121,32,99,104,101,99,107,105,110,103,32,111,102,32, + 97,32,112,121,99,32,104,101,97,100,101,114,32,97,110,100, + 32,114,101,116,117,114,110,32,116,104,101,32,102,108,97,103, + 115,32,102,105,101,108,100,44,10,32,32,32,32,119,104,105, + 99,104,32,100,101,116,101,114,109,105,110,101,115,32,104,111, + 119,32,116,104,101,32,112,121,99,32,115,104,111,117,108,100, + 32,98,101,32,102,117,114,116,104,101,114,32,118,97,108,105, + 100,97,116,101,100,32,97,103,97,105,110,115,116,32,116,104, + 101,32,115,111,117,114,99,101,46,10,10,32,32,32,32,42, + 100,97,116,97,42,32,105,115,32,116,104,101,32,99,111,110, + 116,101,110,116,115,32,111,102,32,116,104,101,32,112,121,99, + 32,102,105,108,101,46,32,40,79,110,108,121,32,116,104,101, + 32,102,105,114,115,116,32,49,54,32,98,121,116,101,115,32, + 97,114,101,10,32,32,32,32,114,101,113,117,105,114,101,100, + 44,32,116,104,111,117,103,104,46,41,10,10,32,32,32,32, + 42,110,97,109,101,42,32,105,115,32,116,104,101,32,110,97, + 109,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, + 32,98,101,105,110,103,32,105,109,112,111,114,116,101,100,46, + 32,73,116,32,105,115,32,117,115,101,100,32,102,111,114,32, + 108,111,103,103,105,110,103,46,10,10,32,32,32,32,42,101, + 120,99,95,100,101,116,97,105,108,115,42,32,105,115,32,97, + 32,100,105,99,116,105,111,110,97,114,121,32,112,97,115,115, + 101,100,32,116,111,32,73,109,112,111,114,116,69,114,114,111, + 114,32,105,102,32,105,116,32,114,97,105,115,101,100,32,102, + 111,114,10,32,32,32,32,105,109,112,114,111,118,101,100,32, + 100,101,98,117,103,103,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,119,104,101,110, + 32,116,104,101,32,102,108,97,103,115,10,32,32,32,32,102, + 105,101,108,100,32,105,115,32,105,110,118,97,108,105,100,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, + 32,116,114,117,110,99,97,116,101,100,46,10,10,32,32,32, + 32,78,114,28,0,0,0,122,20,98,97,100,32,109,97,103, + 105,99,32,110,117,109,98,101,114,32,105,110,32,122,2,58, + 32,250,2,123,125,233,16,0,0,0,122,40,114,101,97,99, + 104,101,100,32,69,79,70,32,119,104,105,108,101,32,114,101, + 97,100,105,110,103,32,112,121,99,32,104,101,97,100,101,114, + 32,111,102,32,233,8,0,0,0,233,252,255,255,255,122,14, + 105,110,118,97,108,105,100,32,102,108,97,103,115,32,122,4, + 32,105,110,32,41,7,218,12,77,65,71,73,67,95,78,85, + 77,66,69,82,114,139,0,0,0,218,16,95,118,101,114,98, + 111,115,101,95,109,101,115,115,97,103,101,114,122,0,0,0, + 114,4,0,0,0,218,8,69,79,70,69,114,114,111,114,114, + 38,0,0,0,41,6,114,37,0,0,0,114,121,0,0,0, + 218,11,101,120,99,95,100,101,116,97,105,108,115,90,5,109, + 97,103,105,99,114,98,0,0,0,114,16,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,13,95, + 99,108,97,115,115,105,102,121,95,112,121,99,30,2,0,0, + 115,30,0,0,0,12,16,8,1,16,1,12,1,16,1,12, + 1,10,1,12,1,8,1,16,1,8,2,16,1,16,1,4, + 1,255,128,114,156,0,0,0,99,5,0,0,0,0,0,0, + 0,0,0,0,0,6,0,0,0,4,0,0,0,67,0,0, + 0,115,124,0,0,0,116,0,124,0,100,1,100,2,133,2, + 25,0,131,1,124,1,100,3,64,0,107,3,114,62,100,4, + 124,3,155,2,157,2,125,5,116,1,160,2,100,5,124,5, + 161,2,1,0,116,3,124,5,102,1,105,0,124,4,164,1, + 142,1,130,1,124,2,100,6,117,1,114,120,116,0,124,0, + 100,2,100,7,133,2,25,0,131,1,124,2,100,3,64,0, + 107,3,114,116,116,3,100,4,124,3,155,2,157,2,102,1, + 105,0,124,4,164,1,142,1,130,1,100,6,83,0,100,6, + 83,0,41,8,97,7,2,0,0,86,97,108,105,100,97,116, + 101,32,97,32,112,121,99,32,97,103,97,105,110,115,116,32, + 116,104,101,32,115,111,117,114,99,101,32,108,97,115,116,45, + 109,111,100,105,102,105,101,100,32,116,105,109,101,46,10,10, + 32,32,32,32,42,100,97,116,97,42,32,105,115,32,116,104, + 101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104, + 101,32,112,121,99,32,102,105,108,101,46,32,40,79,110,108, + 121,32,116,104,101,32,102,105,114,115,116,32,49,54,32,98, + 121,116,101,115,32,97,114,101,10,32,32,32,32,114,101,113, + 117,105,114,101,100,46,41,10,10,32,32,32,32,42,115,111, + 117,114,99,101,95,109,116,105,109,101,42,32,105,115,32,116, + 104,101,32,108,97,115,116,32,109,111,100,105,102,105,101,100, + 32,116,105,109,101,115,116,97,109,112,32,111,102,32,116,104, + 101,32,115,111,117,114,99,101,32,102,105,108,101,46,10,10, + 32,32,32,32,42,115,111,117,114,99,101,95,115,105,122,101, + 42,32,105,115,32,78,111,110,101,32,111,114,32,116,104,101, + 32,115,105,122,101,32,111,102,32,116,104,101,32,115,111,117, + 114,99,101,32,102,105,108,101,32,105,110,32,98,121,116,101, + 115,46,10,10,32,32,32,32,42,110,97,109,101,42,32,105, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105, + 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117, + 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46, + 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105, + 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110, + 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32, + 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105, + 109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,110, + 103,46,10,10,32,32,32,32,65,110,32,73,109,112,111,114, + 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, + 32,105,102,32,116,104,101,32,98,121,116,101,99,111,100,101, + 32,105,115,32,115,116,97,108,101,46,10,10,32,32,32,32, + 114,150,0,0,0,233,12,0,0,0,114,27,0,0,0,122, + 22,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97, + 108,101,32,102,111,114,32,114,148,0,0,0,78,114,149,0, + 0,0,41,4,114,38,0,0,0,114,139,0,0,0,114,153, + 0,0,0,114,122,0,0,0,41,6,114,37,0,0,0,218, + 12,115,111,117,114,99,101,95,109,116,105,109,101,218,11,115, + 111,117,114,99,101,95,115,105,122,101,114,121,0,0,0,114, + 155,0,0,0,114,98,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,23,95,118,97,108,105,100, + 97,116,101,95,116,105,109,101,115,116,97,109,112,95,112,121, + 99,63,2,0,0,115,20,0,0,0,24,19,10,1,12,1, + 16,1,8,1,22,1,2,255,22,2,8,254,255,128,114,160, + 0,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,4,0,0,0,67,0,0,0,115,42,0,0, + 0,124,0,100,1,100,2,133,2,25,0,124,1,107,3,114, + 38,116,0,100,3,124,2,155,2,157,2,102,1,105,0,124, + 3,164,1,142,1,130,1,100,4,83,0,41,5,97,243,1, + 0,0,86,97,108,105,100,97,116,101,32,97,32,104,97,115, + 104,45,98,97,115,101,100,32,112,121,99,32,98,121,32,99, + 104,101,99,107,105,110,103,32,116,104,101,32,114,101,97,108, + 32,115,111,117,114,99,101,32,104,97,115,104,32,97,103,97, + 105,110,115,116,32,116,104,101,32,111,110,101,32,105,110,10, + 32,32,32,32,116,104,101,32,112,121,99,32,104,101,97,100, + 101,114,46,10,10,32,32,32,32,42,100,97,116,97,42,32, + 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32, + 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46, + 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116, + 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32, + 32,32,114,101,113,117,105,114,101,100,46,41,10,10,32,32, + 32,32,42,115,111,117,114,99,101,95,104,97,115,104,42,32, + 105,115,32,116,104,101,32,105,109,112,111,114,116,108,105,98, + 46,117,116,105,108,46,115,111,117,114,99,101,95,104,97,115, + 104,40,41,32,111,102,32,116,104,101,32,115,111,117,114,99, + 101,32,102,105,108,101,46,10,10,32,32,32,32,42,110,97, + 109,101,42,32,105,115,32,116,104,101,32,110,97,109,101,32, + 111,102,32,116,104,101,32,109,111,100,117,108,101,32,98,101, + 105,110,103,32,105,109,112,111,114,116,101,100,46,32,73,116, + 32,105,115,32,117,115,101,100,32,102,111,114,32,108,111,103, + 103,105,110,103,46,10,10,32,32,32,32,42,101,120,99,95, + 100,101,116,97,105,108,115,42,32,105,115,32,97,32,100,105, + 99,116,105,111,110,97,114,121,32,112,97,115,115,101,100,32, + 116,111,32,73,109,112,111,114,116,69,114,114,111,114,32,105, + 102,32,105,116,32,114,97,105,115,101,100,32,102,111,114,10, + 32,32,32,32,105,109,112,114,111,118,101,100,32,100,101,98, + 117,103,103,105,110,103,46,10,10,32,32,32,32,65,110,32, + 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114, + 97,105,115,101,100,32,105,102,32,116,104,101,32,98,121,116, + 101,99,111,100,101,32,105,115,32,115,116,97,108,101,46,10, + 10,32,32,32,32,114,150,0,0,0,114,149,0,0,0,122, + 46,104,97,115,104,32,105,110,32,98,121,116,101,99,111,100, + 101,32,100,111,101,115,110,39,116,32,109,97,116,99,104,32, + 104,97,115,104,32,111,102,32,115,111,117,114,99,101,32,78, + 41,1,114,122,0,0,0,41,4,114,37,0,0,0,218,11, + 115,111,117,114,99,101,95,104,97,115,104,114,121,0,0,0, + 114,155,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,18,95,118,97,108,105,100,97,116,101,95, + 104,97,115,104,95,112,121,99,91,2,0,0,115,16,0,0, + 0,16,17,2,1,8,1,4,255,2,2,6,254,4,255,255, + 128,114,162,0,0,0,99,4,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, + 76,0,0,0,116,0,160,1,124,0,161,1,125,4,116,2, + 124,4,116,3,131,2,114,56,116,4,160,5,100,1,124,2, + 161,2,1,0,124,3,100,2,117,1,114,52,116,6,160,7, + 124,4,124,3,161,2,1,0,124,4,83,0,116,8,100,3, + 160,9,124,2,161,1,124,1,124,2,100,4,141,3,130,1, + 41,5,122,35,67,111,109,112,105,108,101,32,98,121,116,101, + 99,111,100,101,32,97,115,32,102,111,117,110,100,32,105,110, + 32,97,32,112,121,99,46,122,21,99,111,100,101,32,111,98, + 106,101,99,116,32,102,114,111,109,32,123,33,114,125,78,122, + 23,78,111,110,45,99,111,100,101,32,111,98,106,101,99,116, + 32,105,110,32,123,33,114,125,169,2,114,121,0,0,0,114, + 52,0,0,0,41,10,218,7,109,97,114,115,104,97,108,90, + 5,108,111,97,100,115,218,10,105,115,105,110,115,116,97,110, + 99,101,218,10,95,99,111,100,101,95,116,121,112,101,114,139, + 0,0,0,114,153,0,0,0,218,4,95,105,109,112,90,16, + 95,102,105,120,95,99,111,95,102,105,108,101,110,97,109,101, + 114,122,0,0,0,114,70,0,0,0,41,5,114,37,0,0, + 0,114,121,0,0,0,114,111,0,0,0,114,112,0,0,0, + 218,4,99,111,100,101,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,17,95,99,111,109,112,105,108,101,95, + 98,121,116,101,99,111,100,101,115,2,0,0,115,20,0,0, + 0,10,2,10,1,12,1,8,1,12,1,4,1,10,2,4, + 1,6,255,255,128,114,169,0,0,0,99,3,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, + 0,0,0,115,70,0,0,0,116,0,116,1,131,1,125,3, + 124,3,160,2,116,3,100,1,131,1,161,1,1,0,124,3, + 160,2,116,3,124,1,131,1,161,1,1,0,124,3,160,2, + 116,3,124,2,131,1,161,1,1,0,124,3,160,2,116,4, + 160,5,124,0,161,1,161,1,1,0,124,3,83,0,41,3, + 122,43,80,114,111,100,117,99,101,32,116,104,101,32,100,97, + 116,97,32,102,111,114,32,97,32,116,105,109,101,115,116,97, + 109,112,45,98,97,115,101,100,32,112,121,99,46,114,0,0, + 0,0,78,41,6,218,9,98,121,116,101,97,114,114,97,121, + 114,152,0,0,0,218,6,101,120,116,101,110,100,114,33,0, + 0,0,114,164,0,0,0,218,5,100,117,109,112,115,41,4, + 114,168,0,0,0,218,5,109,116,105,109,101,114,159,0,0, + 0,114,37,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,22,95,99,111,100,101,95,116,111,95, + 116,105,109,101,115,116,97,109,112,95,112,121,99,128,2,0, + 0,115,14,0,0,0,8,2,14,1,14,1,14,1,16,1, + 4,1,255,128,114,174,0,0,0,84,99,3,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, + 0,0,0,115,80,0,0,0,116,0,116,1,131,1,125,3, + 100,1,124,2,100,1,62,0,66,0,125,4,124,3,160,2, + 116,3,124,4,131,1,161,1,1,0,116,4,124,1,131,1, + 100,2,107,2,115,50,74,0,130,1,124,3,160,2,124,1, + 161,1,1,0,124,3,160,2,116,5,160,6,124,0,161,1, + 161,1,1,0,124,3,83,0,41,4,122,38,80,114,111,100, + 117,99,101,32,116,104,101,32,100,97,116,97,32,102,111,114, + 32,97,32,104,97,115,104,45,98,97,115,101,100,32,112,121, + 99,46,114,3,0,0,0,114,150,0,0,0,78,41,7,114, + 170,0,0,0,114,152,0,0,0,114,171,0,0,0,114,33, + 0,0,0,114,4,0,0,0,114,164,0,0,0,114,172,0, + 0,0,41,5,114,168,0,0,0,114,161,0,0,0,90,7, + 99,104,101,99,107,101,100,114,37,0,0,0,114,16,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,17,95,99,111,100,101,95,116,111,95,104,97,115,104,95, + 112,121,99,138,2,0,0,115,16,0,0,0,8,2,12,1, + 14,1,16,1,10,1,16,1,4,1,255,128,114,175,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,6,0,0,0,67,0,0,0,115,62,0,0,0,100, + 1,100,2,108,0,125,1,116,1,160,2,124,0,161,1,106, + 3,125,2,124,1,160,4,124,2,161,1,125,3,116,1,160, + 5,100,2,100,3,161,2,125,4,124,4,160,6,124,0,160, + 6,124,3,100,1,25,0,161,1,161,1,83,0,41,4,122, + 121,68,101,99,111,100,101,32,98,121,116,101,115,32,114,101, + 112,114,101,115,101,110,116,105,110,103,32,115,111,117,114,99, + 101,32,99,111,100,101,32,97,110,100,32,114,101,116,117,114, + 110,32,116,104,101,32,115,116,114,105,110,103,46,10,10,32, + 32,32,32,85,110,105,118,101,114,115,97,108,32,110,101,119, + 108,105,110,101,32,115,117,112,112,111,114,116,32,105,115,32, + 117,115,101,100,32,105,110,32,116,104,101,32,100,101,99,111, + 100,105,110,103,46,10,32,32,32,32,114,0,0,0,0,78, + 84,41,7,218,8,116,111,107,101,110,105,122,101,114,72,0, + 0,0,90,7,66,121,116,101,115,73,79,90,8,114,101,97, + 100,108,105,110,101,90,15,100,101,116,101,99,116,95,101,110, + 99,111,100,105,110,103,90,25,73,110,99,114,101,109,101,110, + 116,97,108,78,101,119,108,105,110,101,68,101,99,111,100,101, + 114,218,6,100,101,99,111,100,101,41,5,218,12,115,111,117, + 114,99,101,95,98,121,116,101,115,114,176,0,0,0,90,21, + 115,111,117,114,99,101,95,98,121,116,101,115,95,114,101,97, + 100,108,105,110,101,218,8,101,110,99,111,100,105,110,103,90, + 15,110,101,119,108,105,110,101,95,100,101,99,111,100,101,114, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,108,111,97,100,95,109,111,100,117,108,101,66,3,0,0, - 115,4,0,0,0,12,3,255,128,122,25,95,76,111,97,100, - 101,114,66,97,115,105,99,115,46,108,111,97,100,95,109,111, - 100,117,108,101,78,41,8,114,130,0,0,0,114,129,0,0, - 0,114,131,0,0,0,114,132,0,0,0,114,186,0,0,0, - 114,219,0,0,0,114,224,0,0,0,114,227,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,215,0,0,0,42,3,0,0,115,14,0,0, - 0,8,0,4,2,8,3,8,8,8,3,12,8,255,128,114, - 215,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,64,0,0,0,115,74,0, - 0,0,101,0,90,1,100,0,90,2,100,1,100,2,132,0, - 90,3,100,3,100,4,132,0,90,4,100,5,100,6,132,0, - 90,5,100,7,100,8,132,0,90,6,100,9,100,10,132,0, - 90,7,100,11,100,12,156,1,100,13,100,14,132,2,90,8, - 100,15,100,16,132,0,90,9,100,17,83,0,41,18,218,12, - 83,111,117,114,99,101,76,111,97,100,101,114,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,116,0,130,1,41,2, - 122,165,79,112,116,105,111,110,97,108,32,109,101,116,104,111, - 100,32,116,104,97,116,32,114,101,116,117,114,110,115,32,116, - 104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32, - 116,105,109,101,32,40,97,110,32,105,110,116,41,32,102,111, - 114,32,116,104,101,10,32,32,32,32,32,32,32,32,115,112, - 101,99,105,102,105,101,100,32,112,97,116,104,32,40,97,32, - 115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,82, - 97,105,115,101,115,32,79,83,69,114,114,111,114,32,119,104, - 101,110,32,116,104,101,32,112,97,116,104,32,99,97,110,110, - 111,116,32,98,101,32,104,97,110,100,108,101,100,46,10,32, - 32,32,32,32,32,32,32,78,41,1,114,58,0,0,0,169, - 2,114,123,0,0,0,114,52,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,10,112,97,116,104, - 95,109,116,105,109,101,74,3,0,0,115,4,0,0,0,4, - 6,255,128,122,23,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,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,14,0,0,0,100,1,124,0,160,0, - 124,1,161,1,105,1,83,0,41,3,97,158,1,0,0,79, - 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,114, - 101,116,117,114,110,105,110,103,32,97,32,109,101,116,97,100, - 97,116,97,32,100,105,99,116,32,102,111,114,32,116,104,101, - 32,115,112,101,99,105,102,105,101,100,10,32,32,32,32,32, - 32,32,32,112,97,116,104,32,40,97,32,115,116,114,41,46, - 10,10,32,32,32,32,32,32,32,32,80,111,115,115,105,98, - 108,101,32,107,101,121,115,58,10,32,32,32,32,32,32,32, - 32,45,32,39,109,116,105,109,101,39,32,40,109,97,110,100, - 97,116,111,114,121,41,32,105,115,32,116,104,101,32,110,117, - 109,101,114,105,99,32,116,105,109,101,115,116,97,109,112,32, - 111,102,32,108,97,115,116,32,115,111,117,114,99,101,10,32, - 32,32,32,32,32,32,32,32,32,99,111,100,101,32,109,111, - 100,105,102,105,99,97,116,105,111,110,59,10,32,32,32,32, - 32,32,32,32,45,32,39,115,105,122,101,39,32,40,111,112, - 116,105,111,110,97,108,41,32,105,115,32,116,104,101,32,115, - 105,122,101,32,105,110,32,98,121,116,101,115,32,111,102,32, - 116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,46, + 13,100,101,99,111,100,101,95,115,111,117,114,99,101,149,2, + 0,0,115,12,0,0,0,8,5,12,1,10,1,12,1,20, + 1,255,128,114,180,0,0,0,169,2,114,144,0,0,0,218, + 26,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, + 104,95,108,111,99,97,116,105,111,110,115,99,2,0,0,0, + 0,0,0,0,2,0,0,0,9,0,0,0,8,0,0,0, + 67,0,0,0,115,8,1,0,0,124,1,100,1,117,0,114, + 56,100,2,125,1,116,0,124,2,100,3,131,2,114,66,122, + 14,124,2,160,1,124,0,161,1,125,1,87,0,110,28,4, + 0,116,2,121,54,1,0,1,0,1,0,89,0,110,12,48, + 0,116,3,160,4,124,1,161,1,125,1,116,5,106,6,124, + 0,124,2,124,1,100,4,141,3,125,4,100,5,124,4,95, + 7,124,2,100,1,117,0,114,148,116,8,131,0,68,0,93, + 40,92,2,125,5,125,6,124,1,160,9,116,10,124,6,131, + 1,161,1,114,102,124,5,124,0,124,1,131,2,125,2,124, + 2,124,4,95,11,1,0,113,148,100,1,83,0,124,3,116, + 12,117,0,114,212,116,0,124,2,100,6,131,2,114,218,122, + 14,124,2,160,13,124,0,161,1,125,7,87,0,110,18,4, + 0,116,2,121,198,1,0,1,0,1,0,89,0,110,20,48, + 0,124,7,114,218,103,0,124,4,95,14,110,6,124,3,124, + 4,95,14,124,4,106,14,103,0,107,2,144,1,114,4,124, + 1,144,1,114,4,116,15,124,1,131,1,100,7,25,0,125, + 8,124,4,106,14,160,16,124,8,161,1,1,0,124,4,83, + 0,41,8,97,61,1,0,0,82,101,116,117,114,110,32,97, + 32,109,111,100,117,108,101,32,115,112,101,99,32,98,97,115, + 101,100,32,111,110,32,97,32,102,105,108,101,32,108,111,99, + 97,116,105,111,110,46,10,10,32,32,32,32,84,111,32,105, + 110,100,105,99,97,116,101,32,116,104,97,116,32,116,104,101, + 32,109,111,100,117,108,101,32,105,115,32,97,32,112,97,99, + 107,97,103,101,44,32,115,101,116,10,32,32,32,32,115,117, + 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, + 111,99,97,116,105,111,110,115,32,116,111,32,97,32,108,105, + 115,116,32,111,102,32,100,105,114,101,99,116,111,114,121,32, + 112,97,116,104,115,46,32,32,65,110,10,32,32,32,32,101, + 109,112,116,121,32,108,105,115,116,32,105,115,32,115,117,102, + 102,105,99,105,101,110,116,44,32,116,104,111,117,103,104,32, + 105,116,115,32,110,111,116,32,111,116,104,101,114,119,105,115, + 101,32,117,115,101,102,117,108,32,116,111,32,116,104,101,10, + 32,32,32,32,105,109,112,111,114,116,32,115,121,115,116,101, + 109,46,10,10,32,32,32,32,84,104,101,32,108,111,97,100, + 101,114,32,109,117,115,116,32,116,97,107,101,32,97,32,115, + 112,101,99,32,97,115,32,105,116,115,32,111,110,108,121,32, + 95,95,105,110,105,116,95,95,40,41,32,97,114,103,46,10, + 10,32,32,32,32,78,122,9,60,117,110,107,110,111,119,110, + 62,218,12,103,101,116,95,102,105,108,101,110,97,109,101,169, + 1,218,6,111,114,105,103,105,110,84,218,10,105,115,95,112, + 97,99,107,97,103,101,114,0,0,0,0,41,17,114,133,0, + 0,0,114,183,0,0,0,114,122,0,0,0,114,18,0,0, + 0,114,85,0,0,0,114,139,0,0,0,218,10,77,111,100, + 117,108,101,83,112,101,99,90,13,95,115,101,116,95,102,105, + 108,101,97,116,116,114,218,27,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,114,115,0,0,0,114,116,0,0,0,114,144,0, + 0,0,218,9,95,80,79,80,85,76,65,84,69,114,186,0, + 0,0,114,182,0,0,0,114,55,0,0,0,218,6,97,112, + 112,101,110,100,41,9,114,121,0,0,0,90,8,108,111,99, + 97,116,105,111,110,114,144,0,0,0,114,182,0,0,0,218, + 4,115,112,101,99,218,12,108,111,97,100,101,114,95,99,108, + 97,115,115,218,8,115,117,102,102,105,120,101,115,114,186,0, + 0,0,90,7,100,105,114,110,97,109,101,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,23,115,112,101,99, + 95,102,114,111,109,95,102,105,108,101,95,108,111,99,97,116, + 105,111,110,166,2,0,0,115,64,0,0,0,8,12,4,4, + 10,1,2,2,14,1,12,1,6,1,10,2,16,8,6,1, + 8,3,14,1,14,1,10,1,6,1,4,1,4,2,8,3, + 10,2,2,1,14,1,12,1,6,1,4,2,8,1,6,2, + 12,1,6,1,12,1,12,1,4,2,255,128,114,194,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,64,0,0,0,115,88,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,100, + 3,90,5,101,6,111,30,100,4,101,7,118,0,90,8,101, + 9,100,5,100,6,132,0,131,1,90,10,101,11,100,7,100, + 8,132,0,131,1,90,12,101,11,100,14,100,10,100,11,132, + 1,131,1,90,13,101,11,100,15,100,12,100,13,132,1,131, + 1,90,14,100,9,83,0,41,16,218,21,87,105,110,100,111, + 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, + 122,62,77,101,116,97,32,112,97,116,104,32,102,105,110,100, + 101,114,32,102,111,114,32,109,111,100,117,108,101,115,32,100, + 101,99,108,97,114,101,100,32,105,110,32,116,104,101,32,87, + 105,110,100,111,119,115,32,114,101,103,105,115,116,114,121,46, + 122,59,83,111,102,116,119,97,114,101,92,80,121,116,104,111, + 110,92,80,121,116,104,111,110,67,111,114,101,92,123,115,121, + 115,95,118,101,114,115,105,111,110,125,92,77,111,100,117,108, + 101,115,92,123,102,117,108,108,110,97,109,101,125,122,65,83, + 111,102,116,119,97,114,101,92,80,121,116,104,111,110,92,80, + 121,116,104,111,110,67,111,114,101,92,123,115,121,115,95,118, + 101,114,115,105,111,110,125,92,77,111,100,117,108,101,115,92, + 123,102,117,108,108,110,97,109,101,125,92,68,101,98,117,103, + 122,6,95,100,46,112,121,100,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,8,0,0,0,67,0,0, + 0,115,50,0,0,0,122,16,116,0,160,1,116,0,106,2, + 124,0,161,2,87,0,83,0,4,0,116,3,121,48,1,0, + 1,0,1,0,116,0,160,1,116,0,106,4,124,0,161,2, + 6,0,89,0,83,0,48,0,114,114,0,0,0,41,5,218, + 6,119,105,110,114,101,103,90,7,79,112,101,110,75,101,121, + 90,17,72,75,69,89,95,67,85,82,82,69,78,84,95,85, + 83,69,82,114,58,0,0,0,90,18,72,75,69,89,95,76, + 79,67,65,76,95,77,65,67,72,73,78,69,114,19,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,14,95,111,112,101,110,95,114,101,103,105,115,116,114,121, + 246,2,0,0,115,10,0,0,0,2,2,16,1,12,1,20, + 1,255,128,122,36,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,2,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,8,0,0,0,67,0, + 0,0,115,130,0,0,0,124,0,106,0,114,14,124,0,106, + 1,125,2,110,6,124,0,106,2,125,2,124,2,106,3,124, + 1,100,1,116,4,106,5,100,0,100,2,133,2,25,0,22, + 0,100,3,141,2,125,3,122,60,124,0,160,6,124,3,161, + 1,143,28,125,4,116,7,160,8,124,4,100,4,161,2,125, + 5,87,0,100,0,4,0,4,0,131,3,1,0,110,16,49, + 0,115,94,48,0,1,0,1,0,1,0,89,0,1,0,87, + 0,124,5,83,0,4,0,116,9,121,128,1,0,1,0,1, + 0,89,0,100,0,83,0,48,0,41,5,78,122,5,37,100, + 46,37,100,114,39,0,0,0,41,2,114,143,0,0,0,90, + 11,115,121,115,95,118,101,114,115,105,111,110,114,10,0,0, + 0,41,10,218,11,68,69,66,85,71,95,66,85,73,76,68, + 218,18,82,69,71,73,83,84,82,89,95,75,69,89,95,68, + 69,66,85,71,218,12,82,69,71,73,83,84,82,89,95,75, + 69,89,114,70,0,0,0,114,15,0,0,0,218,12,118,101, + 114,115,105,111,110,95,105,110,102,111,114,197,0,0,0,114, + 196,0,0,0,90,10,81,117,101,114,121,86,97,108,117,101, + 114,58,0,0,0,41,6,218,3,99,108,115,114,143,0,0, + 0,90,12,114,101,103,105,115,116,114,121,95,107,101,121,114, + 20,0,0,0,90,4,104,107,101,121,218,8,102,105,108,101, + 112,97,116,104,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,16,95,115,101,97,114,99,104,95,114,101,103, + 105,115,116,114,121,253,2,0,0,115,26,0,0,0,6,2, + 8,1,6,2,6,1,16,1,6,255,2,2,12,1,44,1, + 4,3,12,254,8,1,255,128,122,38,87,105,110,100,111,119, + 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, + 95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,121, + 78,99,4,0,0,0,0,0,0,0,0,0,0,0,8,0, + 0,0,8,0,0,0,67,0,0,0,115,118,0,0,0,124, + 0,160,0,124,1,161,1,125,4,124,4,100,0,117,0,114, + 22,100,0,83,0,122,12,116,1,124,4,131,1,1,0,87, + 0,110,20,4,0,116,2,121,54,1,0,1,0,1,0,89, + 0,100,0,83,0,48,0,116,3,131,0,68,0,93,50,92, + 2,125,5,125,6,124,4,160,4,116,5,124,6,131,1,161, + 1,114,62,116,6,106,7,124,1,124,5,124,1,124,4,131, + 2,124,4,100,1,141,3,125,7,124,7,2,0,1,0,83, + 0,100,0,83,0,41,2,78,114,184,0,0,0,41,8,114, + 204,0,0,0,114,57,0,0,0,114,58,0,0,0,114,188, + 0,0,0,114,115,0,0,0,114,116,0,0,0,114,139,0, + 0,0,218,16,115,112,101,99,95,102,114,111,109,95,108,111, + 97,100,101,114,41,8,114,202,0,0,0,114,143,0,0,0, + 114,52,0,0,0,218,6,116,97,114,103,101,116,114,203,0, + 0,0,114,144,0,0,0,114,193,0,0,0,114,191,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,9,102,105,110,100,95,115,112,101,99,12,3,0,0,115, + 32,0,0,0,10,2,8,1,4,1,2,1,12,1,12,1, + 8,1,14,1,14,1,6,1,8,1,2,1,6,254,8,3, + 4,251,255,128,122,31,87,105,110,100,111,119,115,82,101,103, + 105,115,116,114,121,70,105,110,100,101,114,46,102,105,110,100, + 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,30, + 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, + 3,100,1,117,1,114,26,124,3,106,1,83,0,100,1,83, + 0,41,2,122,108,70,105,110,100,32,109,111,100,117,108,101, + 32,110,97,109,101,100,32,105,110,32,116,104,101,32,114,101, + 103,105,115,116,114,121,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,78,169,2,114,207,0,0,0,114,144,0,0,0,169,4, + 114,202,0,0,0,114,143,0,0,0,114,52,0,0,0,114, + 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101, + 28,3,0,0,115,10,0,0,0,12,7,8,1,6,1,4, + 2,255,128,122,33,87,105,110,100,111,119,115,82,101,103,105, + 115,116,114,121,70,105,110,100,101,114,46,102,105,110,100,95, + 109,111,100,117,108,101,41,2,78,78,41,1,78,41,15,114, + 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, + 0,0,0,114,200,0,0,0,114,199,0,0,0,218,11,95, + 77,83,95,87,73,78,68,79,87,83,218,18,69,88,84,69, + 78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,198, + 0,0,0,218,12,115,116,97,116,105,99,109,101,116,104,111, + 100,114,197,0,0,0,218,11,99,108,97,115,115,109,101,116, + 104,111,100,114,204,0,0,0,114,207,0,0,0,114,210,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,195,0,0,0,234,2,0,0,115, + 32,0,0,0,8,0,4,2,2,3,2,255,2,4,2,255, + 12,3,2,2,10,1,2,6,10,1,2,14,12,1,2,15, + 16,1,255,128,114,195,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,0, + 0,0,115,48,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, + 0,90,5,100,6,100,7,132,0,90,6,100,8,100,9,132, + 0,90,7,100,10,83,0,41,11,218,13,95,76,111,97,100, + 101,114,66,97,115,105,99,115,122,83,66,97,115,101,32,99, + 108,97,115,115,32,111,102,32,99,111,109,109,111,110,32,99, + 111,100,101,32,110,101,101,100,101,100,32,98,121,32,98,111, + 116,104,32,83,111,117,114,99,101,76,111,97,100,101,114,32, + 97,110,100,10,32,32,32,32,83,111,117,114,99,101,108,101, + 115,115,70,105,108,101,76,111,97,100,101,114,46,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0, + 0,0,67,0,0,0,115,64,0,0,0,116,0,124,0,160, + 1,124,1,161,1,131,1,100,1,25,0,125,2,124,2,160, + 2,100,2,100,1,161,2,100,3,25,0,125,3,124,1,160, + 3,100,2,161,1,100,4,25,0,125,4,124,3,100,5,107, + 2,111,62,124,4,100,5,107,3,83,0,41,7,122,141,67, + 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99, + 116,76,111,97,100,101,114,46,105,115,95,112,97,99,107,97, + 103,101,32,98,121,32,99,104,101,99,107,105,110,103,32,105, + 102,10,32,32,32,32,32,32,32,32,116,104,101,32,112,97, + 116,104,32,114,101,116,117,114,110,101,100,32,98,121,32,103, + 101,116,95,102,105,108,101,110,97,109,101,32,104,97,115,32, + 97,32,102,105,108,101,110,97,109,101,32,111,102,32,39,95, + 95,105,110,105,116,95,95,46,112,121,39,46,114,3,0,0, + 0,114,79,0,0,0,114,0,0,0,0,114,39,0,0,0, + 218,8,95,95,105,110,105,116,95,95,78,41,4,114,55,0, + 0,0,114,183,0,0,0,114,51,0,0,0,114,49,0,0, + 0,41,5,114,123,0,0,0,114,143,0,0,0,114,101,0, + 0,0,90,13,102,105,108,101,110,97,109,101,95,98,97,115, + 101,90,9,116,97,105,108,95,110,97,109,101,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,186,0,0,0, + 47,3,0,0,115,10,0,0,0,18,3,16,1,14,1,16, + 1,255,128,122,24,95,76,111,97,100,101,114,66,97,115,105, + 99,115,46,105,115,95,112,97,99,107,97,103,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,169, + 2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,115, + 101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,100, + 117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,7, + 0,0,0,169,2,114,123,0,0,0,114,191,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,13, + 99,114,101,97,116,101,95,109,111,100,117,108,101,55,3,0, + 0,115,4,0,0,0,4,0,255,128,122,27,95,76,111,97, + 100,101,114,66,97,115,105,99,115,46,99,114,101,97,116,101, + 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,5,0,0,0,67,0,0,0, + 115,56,0,0,0,124,0,160,0,124,1,106,1,161,1,125, + 2,124,2,100,1,117,0,114,36,116,2,100,2,160,3,124, + 1,106,1,161,1,131,1,130,1,116,4,160,5,116,6,124, + 2,124,1,106,7,161,3,1,0,100,1,83,0,41,3,122, + 19,69,120,101,99,117,116,101,32,116,104,101,32,109,111,100, + 117,108,101,46,78,122,52,99,97,110,110,111,116,32,108,111, + 97,100,32,109,111,100,117,108,101,32,123,33,114,125,32,119, + 104,101,110,32,103,101,116,95,99,111,100,101,40,41,32,114, + 101,116,117,114,110,115,32,78,111,110,101,41,8,218,8,103, + 101,116,95,99,111,100,101,114,130,0,0,0,114,122,0,0, + 0,114,70,0,0,0,114,139,0,0,0,218,25,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,218,4,101,120,101,99,114,136,0,0, + 0,41,3,114,123,0,0,0,218,6,109,111,100,117,108,101, + 114,168,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,11,101,120,101,99,95,109,111,100,117,108, + 101,58,3,0,0,115,14,0,0,0,12,2,8,1,6,1, + 4,1,6,255,20,2,255,128,122,25,95,76,111,97,100,101, + 114,66,97,115,105,99,115,46,101,120,101,99,95,109,111,100, + 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,67,0,0,0,115,12,0,0, + 0,116,0,160,1,124,0,124,1,161,2,83,0,41,2,122, + 26,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,78,41,2,114,139, + 0,0,0,218,17,95,108,111,97,100,95,109,111,100,117,108, + 101,95,115,104,105,109,169,2,114,123,0,0,0,114,143,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,11,108,111,97,100,95,109,111,100,117,108,101,66,3, + 0,0,115,4,0,0,0,12,3,255,128,122,25,95,76,111, + 97,100,101,114,66,97,115,105,99,115,46,108,111,97,100,95, + 109,111,100,117,108,101,78,41,8,114,130,0,0,0,114,129, + 0,0,0,114,131,0,0,0,114,132,0,0,0,114,186,0, + 0,0,114,219,0,0,0,114,224,0,0,0,114,227,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,215,0,0,0,42,3,0,0,115,14, + 0,0,0,8,0,4,2,8,3,8,8,8,3,12,8,255, + 128,114,215,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, + 74,0,0,0,101,0,90,1,100,0,90,2,100,1,100,2, + 132,0,90,3,100,3,100,4,132,0,90,4,100,5,100,6, + 132,0,90,5,100,7,100,8,132,0,90,6,100,9,100,10, + 132,0,90,7,100,11,100,12,156,1,100,13,100,14,132,2, + 90,8,100,15,100,16,132,0,90,9,100,17,83,0,41,18, + 218,12,83,111,117,114,99,101,76,111,97,100,101,114,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, + 0,0,0,67,0,0,0,115,4,0,0,0,116,0,130,1, + 41,2,122,165,79,112,116,105,111,110,97,108,32,109,101,116, + 104,111,100,32,116,104,97,116,32,114,101,116,117,114,110,115, + 32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111, + 110,32,116,105,109,101,32,40,97,110,32,105,110,116,41,32, + 102,111,114,32,116,104,101,10,32,32,32,32,32,32,32,32, + 115,112,101,99,105,102,105,101,100,32,112,97,116,104,32,40, + 97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,32, + 32,82,97,105,115,101,115,32,79,83,69,114,114,111,114,32, + 119,104,101,110,32,116,104,101,32,112,97,116,104,32,99,97, + 110,110,111,116,32,98,101,32,104,97,110,100,108,101,100,46, + 10,32,32,32,32,32,32,32,32,78,41,1,114,58,0,0, + 0,169,2,114,123,0,0,0,114,52,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,10,112,97, + 116,104,95,109,116,105,109,101,74,3,0,0,115,4,0,0, + 0,4,6,255,128,122,23,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,0,0,0,0,2,0,0,0,4, + 0,0,0,67,0,0,0,115,14,0,0,0,100,1,124,0, + 160,0,124,1,161,1,105,1,83,0,41,3,97,158,1,0, + 0,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, + 32,114,101,116,117,114,110,105,110,103,32,97,32,109,101,116, + 97,100,97,116,97,32,100,105,99,116,32,102,111,114,32,116, + 104,101,32,115,112,101,99,105,102,105,101,100,10,32,32,32, + 32,32,32,32,32,112,97,116,104,32,40,97,32,115,116,114, + 41,46,10,10,32,32,32,32,32,32,32,32,80,111,115,115, + 105,98,108,101,32,107,101,121,115,58,10,32,32,32,32,32, + 32,32,32,45,32,39,109,116,105,109,101,39,32,40,109,97, + 110,100,97,116,111,114,121,41,32,105,115,32,116,104,101,32, + 110,117,109,101,114,105,99,32,116,105,109,101,115,116,97,109, + 112,32,111,102,32,108,97,115,116,32,115,111,117,114,99,101, + 10,32,32,32,32,32,32,32,32,32,32,99,111,100,101,32, + 109,111,100,105,102,105,99,97,116,105,111,110,59,10,32,32, + 32,32,32,32,32,32,45,32,39,115,105,122,101,39,32,40, + 111,112,116,105,111,110,97,108,41,32,105,115,32,116,104,101, + 32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,111, + 102,32,116,104,101,32,115,111,117,114,99,101,32,99,111,100, + 101,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, + 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, + 116,104,111,100,32,97,108,108,111,119,115,32,116,104,101,32, + 108,111,97,100,101,114,32,116,111,32,114,101,97,100,32,98, + 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,32, + 32,32,32,32,32,32,32,82,97,105,115,101,115,32,79,83, + 69,114,114,111,114,32,119,104,101,110,32,116,104,101,32,112, + 97,116,104,32,99,97,110,110,111,116,32,98,101,32,104,97, + 110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,114, + 173,0,0,0,78,41,1,114,230,0,0,0,114,229,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,10,112,97,116,104,95,115,116,97,116,115,82,3,0,0, + 115,4,0,0,0,14,12,255,128,122,23,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,0,0,0,0,4, + 0,0,0,4,0,0,0,67,0,0,0,115,12,0,0,0, + 124,0,160,0,124,2,124,3,161,2,83,0,41,2,122,228, + 79,112,116,105,111,110,97,108,32,109,101,116,104,111,100,32, + 119,104,105,99,104,32,119,114,105,116,101,115,32,100,97,116, + 97,32,40,98,121,116,101,115,41,32,116,111,32,97,32,102, + 105,108,101,32,112,97,116,104,32,40,97,32,115,116,114,41, + 46,10,10,32,32,32,32,32,32,32,32,73,109,112,108,101, + 109,101,110,116,105,110,103,32,116,104,105,115,32,109,101,116, + 104,111,100,32,97,108,108,111,119,115,32,102,111,114,32,116, + 104,101,32,119,114,105,116,105,110,103,32,111,102,32,98,121, + 116,101,99,111,100,101,32,102,105,108,101,115,46,10,10,32, + 32,32,32,32,32,32,32,84,104,101,32,115,111,117,114,99, + 101,32,112,97,116,104,32,105,115,32,110,101,101,100,101,100, + 32,105,110,32,111,114,100,101,114,32,116,111,32,99,111,114, + 114,101,99,116,108,121,32,116,114,97,110,115,102,101,114,32, + 112,101,114,109,105,115,115,105,111,110,115,10,32,32,32,32, + 32,32,32,32,78,41,1,218,8,115,101,116,95,100,97,116, + 97,41,4,114,123,0,0,0,114,112,0,0,0,90,10,99, + 97,99,104,101,95,112,97,116,104,114,37,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,15,95, + 99,97,99,104,101,95,98,121,116,101,99,111,100,101,96,3, + 0,0,115,4,0,0,0,12,8,255,128,122,28,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,0,0,0,0,3,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,150,79, + 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,119, + 104,105,99,104,32,119,114,105,116,101,115,32,100,97,116,97, + 32,40,98,121,116,101,115,41,32,116,111,32,97,32,102,105, + 108,101,32,112,97,116,104,32,40,97,32,115,116,114,41,46, 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, - 111,100,32,97,108,108,111,119,115,32,116,104,101,32,108,111, - 97,100,101,114,32,116,111,32,114,101,97,100,32,98,121,116, + 111,100,32,97,108,108,111,119,115,32,102,111,114,32,116,104, + 101,32,119,114,105,116,105,110,103,32,111,102,32,98,121,116, 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, - 32,32,32,32,32,82,97,105,115,101,115,32,79,83,69,114, - 114,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116, - 104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100, - 108,101,100,46,10,32,32,32,32,32,32,32,32,114,173,0, - 0,0,78,41,1,114,230,0,0,0,114,229,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, - 112,97,116,104,95,115,116,97,116,115,82,3,0,0,115,4, - 0,0,0,14,12,255,128,122,23,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,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,12,0,0,0,124,0, - 160,0,124,2,124,3,161,2,83,0,41,2,122,228,79,112, - 116,105,111,110,97,108,32,109,101,116,104,111,100,32,119,104, - 105,99,104,32,119,114,105,116,101,115,32,100,97,116,97,32, - 40,98,121,116,101,115,41,32,116,111,32,97,32,102,105,108, - 101,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, - 10,32,32,32,32,32,32,32,32,73,109,112,108,101,109,101, - 110,116,105,110,103,32,116,104,105,115,32,109,101,116,104,111, - 100,32,97,108,108,111,119,115,32,102,111,114,32,116,104,101, - 32,119,114,105,116,105,110,103,32,111,102,32,98,121,116,101, - 99,111,100,101,32,102,105,108,101,115,46,10,10,32,32,32, - 32,32,32,32,32,84,104,101,32,115,111,117,114,99,101,32, - 112,97,116,104,32,105,115,32,110,101,101,100,101,100,32,105, - 110,32,111,114,100,101,114,32,116,111,32,99,111,114,114,101, - 99,116,108,121,32,116,114,97,110,115,102,101,114,32,112,101, - 114,109,105,115,115,105,111,110,115,10,32,32,32,32,32,32, - 32,32,78,41,1,218,8,115,101,116,95,100,97,116,97,41, - 4,114,123,0,0,0,114,112,0,0,0,90,10,99,97,99, - 104,101,95,112,97,116,104,114,37,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,15,95,99,97, - 99,104,101,95,98,121,116,101,99,111,100,101,96,3,0,0, - 115,4,0,0,0,12,8,255,128,122,28,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, - 0,0,0,0,3,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,122,150,79,112,116, - 105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,105, - 99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,40, - 98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,101, - 32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,10, - 32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,110, - 116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,100, - 32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,32, - 119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,99, - 111,100,101,32,102,105,108,101,115,46,10,32,32,32,32,32, - 32,32,32,78,114,7,0,0,0,41,3,114,123,0,0,0, - 114,52,0,0,0,114,37,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,232,0,0,0,106,3, - 0,0,115,4,0,0,0,4,0,255,128,122,21,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,0,0,0,0,5, - 0,0,0,10,0,0,0,67,0,0,0,115,70,0,0,0, - 124,0,160,0,124,1,161,1,125,2,122,20,124,0,160,1, - 124,2,161,1,125,3,87,0,116,4,124,3,131,1,83,0, - 4,0,116,2,121,68,1,0,125,4,1,0,122,14,116,3, - 100,1,124,1,100,2,141,2,124,4,130,2,100,3,125,4, - 126,4,48,0,48,0,41,4,122,52,67,111,110,99,114,101, - 116,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111, - 110,32,111,102,32,73,110,115,112,101,99,116,76,111,97,100, - 101,114,46,103,101,116,95,115,111,117,114,99,101,46,122,39, - 115,111,117,114,99,101,32,110,111,116,32,97,118,97,105,108, - 97,98,108,101,32,116,104,114,111,117,103,104,32,103,101,116, - 95,100,97,116,97,40,41,114,120,0,0,0,78,41,5,114, - 183,0,0,0,218,8,103,101,116,95,100,97,116,97,114,58, - 0,0,0,114,122,0,0,0,114,180,0,0,0,41,5,114, - 123,0,0,0,114,143,0,0,0,114,52,0,0,0,114,178, - 0,0,0,218,3,101,120,99,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,10,103,101,116,95,115,111,117, - 114,99,101,113,3,0,0,115,26,0,0,0,10,2,2,1, - 12,1,8,4,14,253,4,1,2,1,4,255,2,1,2,255, - 8,128,2,255,255,128,122,23,83,111,117,114,99,101,76,111, - 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,114, - 109,0,0,0,41,1,218,9,95,111,112,116,105,109,105,122, - 101,99,3,0,0,0,0,0,0,0,1,0,0,0,4,0, - 0,0,8,0,0,0,67,0,0,0,115,22,0,0,0,116, - 0,106,1,116,2,124,1,124,2,100,1,100,2,124,3,100, - 3,141,6,83,0,41,5,122,130,82,101,116,117,114,110,32, - 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, - 99,111,109,112,105,108,101,100,32,102,114,111,109,32,115,111, - 117,114,99,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,39,100,97,116,97,39,32,97,114,103,117,109,101, - 110,116,32,99,97,110,32,98,101,32,97,110,121,32,111,98, - 106,101,99,116,32,116,121,112,101,32,116,104,97,116,32,99, - 111,109,112,105,108,101,40,41,32,115,117,112,112,111,114,116, - 115,46,10,32,32,32,32,32,32,32,32,114,222,0,0,0, - 84,41,2,218,12,100,111,110,116,95,105,110,104,101,114,105, - 116,114,89,0,0,0,78,41,3,114,139,0,0,0,114,221, - 0,0,0,218,7,99,111,109,112,105,108,101,41,4,114,123, - 0,0,0,114,37,0,0,0,114,52,0,0,0,114,237,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,14,115,111,117,114,99,101,95,116,111,95,99,111,100, - 101,123,3,0,0,115,8,0,0,0,12,5,4,1,6,255, - 255,128,122,27,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,0,0,0,0,15,0,0,0, - 9,0,0,0,67,0,0,0,115,28,2,0,0,124,0,160, - 0,124,1,161,1,125,2,100,1,125,3,100,1,125,4,100, - 1,125,5,100,2,125,6,100,3,125,7,122,12,116,1,124, - 2,131,1,125,8,87,0,110,24,4,0,116,2,121,66,1, - 0,1,0,1,0,100,1,125,8,89,0,144,1,110,42,48, - 0,122,14,124,0,160,3,124,2,161,1,125,9,87,0,110, - 20,4,0,116,4,121,102,1,0,1,0,1,0,89,0,144, - 1,110,6,48,0,116,5,124,9,100,4,25,0,131,1,125, - 3,122,14,124,0,160,6,124,8,161,1,125,10,87,0,110, - 18,4,0,116,4,121,148,1,0,1,0,1,0,89,0,110, - 216,48,0,124,1,124,8,100,5,156,2,125,11,122,148,116, - 7,124,10,124,1,124,11,131,3,125,12,116,8,124,10,131, - 1,100,6,100,1,133,2,25,0,125,13,124,12,100,7,64, - 0,100,8,107,3,125,6,124,6,144,1,114,30,124,12,100, - 9,64,0,100,8,107,3,125,7,116,9,106,10,100,10,107, - 3,144,1,114,50,124,7,115,248,116,9,106,10,100,11,107, - 2,144,1,114,50,124,0,160,6,124,2,161,1,125,4,116, - 9,160,11,116,12,124,4,161,2,125,5,116,13,124,10,124, - 5,124,1,124,11,131,4,1,0,110,20,116,14,124,10,124, - 3,124,9,100,12,25,0,124,1,124,11,131,5,1,0,87, - 0,110,24,4,0,116,15,116,16,102,2,144,1,121,76,1, - 0,1,0,1,0,89,0,110,32,48,0,116,17,160,18,100, - 13,124,8,124,2,161,3,1,0,116,19,124,13,124,1,124, - 8,124,2,100,14,141,4,83,0,124,4,100,1,117,0,144, - 1,114,128,124,0,160,6,124,2,161,1,125,4,124,0,160, - 20,124,4,124,2,161,2,125,14,116,17,160,18,100,15,124, - 2,161,2,1,0,116,21,106,22,144,2,115,24,124,8,100, - 1,117,1,144,2,114,24,124,3,100,1,117,1,144,2,114, - 24,124,6,144,1,114,220,124,5,100,1,117,0,144,1,114, - 206,116,9,160,11,124,4,161,1,125,5,116,23,124,14,124, - 5,124,7,131,3,125,10,110,16,116,24,124,14,124,3,116, - 25,124,4,131,1,131,3,125,10,122,20,124,0,160,26,124, - 2,124,8,124,10,161,3,1,0,87,0,124,14,83,0,4, - 0,116,2,144,2,121,22,1,0,1,0,1,0,89,0,124, - 14,83,0,48,0,124,14,83,0,41,16,122,190,67,111,110, - 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, - 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76, - 111,97,100,101,114,46,103,101,116,95,99,111,100,101,46,10, - 10,32,32,32,32,32,32,32,32,82,101,97,100,105,110,103, - 32,111,102,32,98,121,116,101,99,111,100,101,32,114,101,113, - 117,105,114,101,115,32,112,97,116,104,95,115,116,97,116,115, - 32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116, - 101,100,46,32,84,111,32,119,114,105,116,101,10,32,32,32, - 32,32,32,32,32,98,121,116,101,99,111,100,101,44,32,115, - 101,116,95,100,97,116,97,32,109,117,115,116,32,97,108,115, - 111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100, - 46,10,10,32,32,32,32,32,32,32,32,78,70,84,114,173, - 0,0,0,114,163,0,0,0,114,149,0,0,0,114,3,0, - 0,0,114,0,0,0,0,114,39,0,0,0,90,5,110,101, - 118,101,114,90,6,97,108,119,97,121,115,218,4,115,105,122, - 101,122,13,123,125,32,109,97,116,99,104,101,115,32,123,125, - 41,3,114,121,0,0,0,114,111,0,0,0,114,112,0,0, - 0,122,19,99,111,100,101,32,111,98,106,101,99,116,32,102, - 114,111,109,32,123,125,41,27,114,183,0,0,0,114,102,0, - 0,0,114,88,0,0,0,114,231,0,0,0,114,58,0,0, - 0,114,30,0,0,0,114,234,0,0,0,114,156,0,0,0, - 218,10,109,101,109,111,114,121,118,105,101,119,114,167,0,0, - 0,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, - 115,101,100,95,112,121,99,115,114,161,0,0,0,218,17,95, - 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, - 114,162,0,0,0,114,160,0,0,0,114,122,0,0,0,114, - 154,0,0,0,114,139,0,0,0,114,153,0,0,0,114,169, - 0,0,0,114,240,0,0,0,114,15,0,0,0,218,19,100, - 111,110,116,95,119,114,105,116,101,95,98,121,116,101,99,111, - 100,101,114,175,0,0,0,114,174,0,0,0,114,4,0,0, - 0,114,233,0,0,0,41,15,114,123,0,0,0,114,143,0, - 0,0,114,112,0,0,0,114,158,0,0,0,114,178,0,0, - 0,114,161,0,0,0,90,10,104,97,115,104,95,98,97,115, - 101,100,90,12,99,104,101,99,107,95,115,111,117,114,99,101, - 114,111,0,0,0,218,2,115,116,114,37,0,0,0,114,155, - 0,0,0,114,16,0,0,0,90,10,98,121,116,101,115,95, - 100,97,116,97,90,11,99,111,100,101,95,111,98,106,101,99, - 116,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,220,0,0,0,131,3,0,0,115,160,0,0,0,10,7, - 4,1,4,1,4,1,4,1,4,1,2,1,12,1,12,1, - 12,1,2,2,14,1,12,1,8,1,12,2,2,1,14,1, - 12,1,6,1,2,3,2,1,6,254,2,4,12,1,16,1, - 12,1,6,1,12,1,12,1,2,1,2,255,8,2,4,254, - 10,3,4,1,2,1,2,1,4,254,8,4,2,1,6,255, - 2,3,2,1,2,1,6,1,2,1,2,1,8,251,18,7, - 6,1,8,2,2,1,4,255,6,2,2,1,2,1,6,254, - 10,3,10,1,12,1,12,1,18,1,6,1,4,255,6,2, - 10,1,10,1,14,1,6,2,6,1,4,255,2,2,16,1, - 4,3,14,254,2,1,4,1,2,255,4,1,255,128,122,21, - 83,111,117,114,99,101,76,111,97,100,101,114,46,103,101,116, - 95,99,111,100,101,78,41,10,114,130,0,0,0,114,129,0, - 0,0,114,131,0,0,0,114,230,0,0,0,114,231,0,0, - 0,114,233,0,0,0,114,232,0,0,0,114,236,0,0,0, - 114,240,0,0,0,114,220,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,228, - 0,0,0,72,3,0,0,115,18,0,0,0,8,0,8,2, - 8,8,8,14,8,10,8,7,14,10,12,8,255,128,114,228, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,0,0,0,0,115,92,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, - 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100, - 7,132,0,90,6,101,7,135,0,102,1,100,8,100,9,132, - 8,131,1,90,8,101,7,100,10,100,11,132,0,131,1,90, - 9,100,12,100,13,132,0,90,10,101,7,100,14,100,15,132, - 0,131,1,90,11,135,0,4,0,90,12,83,0,41,16,218, - 10,70,105,108,101,76,111,97,100,101,114,122,103,66,97,115, - 101,32,102,105,108,101,32,108,111,97,100,101,114,32,99,108, - 97,115,115,32,119,104,105,99,104,32,105,109,112,108,101,109, - 101,110,116,115,32,116,104,101,32,108,111,97,100,101,114,32, - 112,114,111,116,111,99,111,108,32,109,101,116,104,111,100,115, - 32,116,104,97,116,10,32,32,32,32,114,101,113,117,105,114, - 101,32,102,105,108,101,32,115,121,115,116,101,109,32,117,115, - 97,103,101,46,99,3,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,2,0,0,0,67,0,0,0,115,16,0, - 0,0,124,1,124,0,95,0,124,2,124,0,95,1,100,1, - 83,0,41,2,122,75,67,97,99,104,101,32,116,104,101,32, - 109,111,100,117,108,101,32,110,97,109,101,32,97,110,100,32, - 116,104,101,32,112,97,116,104,32,116,111,32,116,104,101,32, - 102,105,108,101,32,102,111,117,110,100,32,98,121,32,116,104, - 101,10,32,32,32,32,32,32,32,32,102,105,110,100,101,114, - 46,78,114,163,0,0,0,41,3,114,123,0,0,0,114,143, - 0,0,0,114,52,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,216,0,0,0,221,3,0,0, - 115,6,0,0,0,6,3,10,1,255,128,122,19,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,0,0,0,0,2,0,0, - 0,2,0,0,0,67,0,0,0,115,24,0,0,0,124,0, - 106,0,124,1,106,0,107,2,111,22,124,0,106,1,124,1, - 106,1,107,2,83,0,114,114,0,0,0,169,2,218,9,95, - 95,99,108,97,115,115,95,95,114,136,0,0,0,169,2,114, - 123,0,0,0,90,5,111,116,104,101,114,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,6,95,95,101,113, - 95,95,227,3,0,0,115,8,0,0,0,12,1,10,1,2, - 255,255,128,122,17,70,105,108,101,76,111,97,100,101,114,46, - 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 20,0,0,0,116,0,124,0,106,1,131,1,116,0,124,0, - 106,2,131,1,65,0,83,0,114,114,0,0,0,169,3,218, - 4,104,97,115,104,114,121,0,0,0,114,52,0,0,0,169, - 1,114,123,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,8,95,95,104,97,115,104,95,95,231, - 3,0,0,115,4,0,0,0,20,1,255,128,122,19,70,105, - 108,101,76,111,97,100,101,114,46,95,95,104,97,115,104,95, - 95,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,3,0,0,0,115,16,0,0,0,116, - 0,116,1,124,0,131,2,160,2,124,1,161,1,83,0,41, - 2,122,100,76,111,97,100,32,97,32,109,111,100,117,108,101, - 32,102,114,111,109,32,97,32,102,105,108,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,85,115,101,32,101,120,101,99,95,109,111,100,117, - 108,101,40,41,32,105,110,115,116,101,97,100,46,10,10,32, - 32,32,32,32,32,32,32,78,41,3,218,5,115,117,112,101, - 114,114,246,0,0,0,114,227,0,0,0,114,226,0,0,0, - 169,1,114,248,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,227,0,0,0,234,3,0,0,115,4,0,0,0,16, - 10,255,128,122,22,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,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,169, - 2,122,58,82,101,116,117,114,110,32,116,104,101,32,112,97, - 116,104,32,116,111,32,116,104,101,32,115,111,117,114,99,101, - 32,102,105,108,101,32,97,115,32,102,111,117,110,100,32,98, - 121,32,116,104,101,32,102,105,110,100,101,114,46,78,114,56, - 0,0,0,114,226,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,183,0,0,0,246,3,0,0, - 115,4,0,0,0,6,3,255,128,122,23,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,0,0,0,0,3, - 0,0,0,8,0,0,0,67,0,0,0,115,128,0,0,0, - 116,0,124,0,116,1,116,2,102,2,131,2,114,72,116,3, - 160,4,116,5,124,1,131,1,161,1,143,24,125,2,124,2, - 160,6,161,0,87,0,2,0,100,1,4,0,4,0,131,3, - 1,0,83,0,49,0,115,58,48,0,1,0,1,0,1,0, - 89,0,1,0,100,1,83,0,116,3,160,7,124,1,100,2, - 161,2,143,24,125,2,124,2,160,6,161,0,87,0,2,0, - 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,114, - 48,0,1,0,1,0,1,0,89,0,1,0,100,1,83,0, - 41,3,122,39,82,101,116,117,114,110,32,116,104,101,32,100, - 97,116,97,32,102,114,111,109,32,112,97,116,104,32,97,115, - 32,114,97,119,32,98,121,116,101,115,46,78,218,1,114,41, - 8,114,165,0,0,0,114,228,0,0,0,218,19,69,120,116, - 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, - 114,72,0,0,0,90,9,111,112,101,110,95,99,111,100,101, - 114,90,0,0,0,90,4,114,101,97,100,114,73,0,0,0, - 41,3,114,123,0,0,0,114,52,0,0,0,114,76,0,0, + 32,32,32,32,32,78,114,7,0,0,0,41,3,114,123,0, + 0,0,114,52,0,0,0,114,37,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,232,0,0,0, + 106,3,0,0,115,4,0,0,0,4,0,255,128,122,21,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,0,0,0, + 0,5,0,0,0,10,0,0,0,67,0,0,0,115,70,0, + 0,0,124,0,160,0,124,1,161,1,125,2,122,20,124,0, + 160,1,124,2,161,1,125,3,87,0,116,4,124,3,131,1, + 83,0,4,0,116,2,121,68,1,0,125,4,1,0,122,14, + 116,3,100,1,124,1,100,2,141,2,124,4,130,2,100,3, + 125,4,126,4,48,0,48,0,41,4,122,52,67,111,110,99, + 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, + 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, + 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,46, + 122,39,115,111,117,114,99,101,32,110,111,116,32,97,118,97, + 105,108,97,98,108,101,32,116,104,114,111,117,103,104,32,103, + 101,116,95,100,97,116,97,40,41,114,120,0,0,0,78,41, + 5,114,183,0,0,0,218,8,103,101,116,95,100,97,116,97, + 114,58,0,0,0,114,122,0,0,0,114,180,0,0,0,41, + 5,114,123,0,0,0,114,143,0,0,0,114,52,0,0,0, + 114,178,0,0,0,218,3,101,120,99,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,10,103,101,116,95,115, + 111,117,114,99,101,113,3,0,0,115,26,0,0,0,10,2, + 2,1,12,1,8,4,14,253,4,1,2,1,4,255,2,1, + 2,255,8,128,2,255,255,128,122,23,83,111,117,114,99,101, + 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, + 101,114,109,0,0,0,41,1,218,9,95,111,112,116,105,109, + 105,122,101,99,3,0,0,0,0,0,0,0,1,0,0,0, + 4,0,0,0,8,0,0,0,67,0,0,0,115,22,0,0, + 0,116,0,106,1,116,2,124,1,124,2,100,1,100,2,124, + 3,100,3,141,6,83,0,41,5,122,130,82,101,116,117,114, + 110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,99, + 116,32,99,111,109,112,105,108,101,100,32,102,114,111,109,32, + 115,111,117,114,99,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,101,32,39,100,97,116,97,39,32,97,114,103,117, + 109,101,110,116,32,99,97,110,32,98,101,32,97,110,121,32, + 111,98,106,101,99,116,32,116,121,112,101,32,116,104,97,116, + 32,99,111,109,112,105,108,101,40,41,32,115,117,112,112,111, + 114,116,115,46,10,32,32,32,32,32,32,32,32,114,222,0, + 0,0,84,41,2,218,12,100,111,110,116,95,105,110,104,101, + 114,105,116,114,89,0,0,0,78,41,3,114,139,0,0,0, + 114,221,0,0,0,218,7,99,111,109,112,105,108,101,41,4, + 114,123,0,0,0,114,37,0,0,0,114,52,0,0,0,114, + 237,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,14,115,111,117,114,99,101,95,116,111,95,99, + 111,100,101,123,3,0,0,115,8,0,0,0,12,5,4,1, + 6,255,255,128,122,27,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,0,0,0,0,15,0, + 0,0,9,0,0,0,67,0,0,0,115,28,2,0,0,124, + 0,160,0,124,1,161,1,125,2,100,1,125,3,100,1,125, + 4,100,1,125,5,100,2,125,6,100,3,125,7,122,12,116, + 1,124,2,131,1,125,8,87,0,110,24,4,0,116,2,121, + 66,1,0,1,0,1,0,100,1,125,8,89,0,144,1,110, + 42,48,0,122,14,124,0,160,3,124,2,161,1,125,9,87, + 0,110,20,4,0,116,4,121,102,1,0,1,0,1,0,89, + 0,144,1,110,6,48,0,116,5,124,9,100,4,25,0,131, + 1,125,3,122,14,124,0,160,6,124,8,161,1,125,10,87, + 0,110,18,4,0,116,4,121,148,1,0,1,0,1,0,89, + 0,110,216,48,0,124,1,124,8,100,5,156,2,125,11,122, + 148,116,7,124,10,124,1,124,11,131,3,125,12,116,8,124, + 10,131,1,100,6,100,1,133,2,25,0,125,13,124,12,100, + 7,64,0,100,8,107,3,125,6,124,6,144,1,114,30,124, + 12,100,9,64,0,100,8,107,3,125,7,116,9,106,10,100, + 10,107,3,144,1,114,50,124,7,115,248,116,9,106,10,100, + 11,107,2,144,1,114,50,124,0,160,6,124,2,161,1,125, + 4,116,9,160,11,116,12,124,4,161,2,125,5,116,13,124, + 10,124,5,124,1,124,11,131,4,1,0,110,20,116,14,124, + 10,124,3,124,9,100,12,25,0,124,1,124,11,131,5,1, + 0,87,0,110,24,4,0,116,15,116,16,102,2,144,1,121, + 76,1,0,1,0,1,0,89,0,110,32,48,0,116,17,160, + 18,100,13,124,8,124,2,161,3,1,0,116,19,124,13,124, + 1,124,8,124,2,100,14,141,4,83,0,124,4,100,1,117, + 0,144,1,114,128,124,0,160,6,124,2,161,1,125,4,124, + 0,160,20,124,4,124,2,161,2,125,14,116,17,160,18,100, + 15,124,2,161,2,1,0,116,21,106,22,144,2,115,24,124, + 8,100,1,117,1,144,2,114,24,124,3,100,1,117,1,144, + 2,114,24,124,6,144,1,114,220,124,5,100,1,117,0,144, + 1,114,206,116,9,160,11,124,4,161,1,125,5,116,23,124, + 14,124,5,124,7,131,3,125,10,110,16,116,24,124,14,124, + 3,116,25,124,4,131,1,131,3,125,10,122,20,124,0,160, + 26,124,2,124,8,124,10,161,3,1,0,87,0,124,14,83, + 0,4,0,116,2,144,2,121,22,1,0,1,0,1,0,89, + 0,124,14,83,0,48,0,124,14,83,0,41,16,122,190,67, + 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99, + 116,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101, + 46,10,10,32,32,32,32,32,32,32,32,82,101,97,100,105, + 110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,114, + 101,113,117,105,114,101,115,32,112,97,116,104,95,115,116,97, + 116,115,32,116,111,32,98,101,32,105,109,112,108,101,109,101, + 110,116,101,100,46,32,84,111,32,119,114,105,116,101,10,32, + 32,32,32,32,32,32,32,98,121,116,101,99,111,100,101,44, + 32,115,101,116,95,100,97,116,97,32,109,117,115,116,32,97, + 108,115,111,32,98,101,32,105,109,112,108,101,109,101,110,116, + 101,100,46,10,10,32,32,32,32,32,32,32,32,78,70,84, + 114,173,0,0,0,114,163,0,0,0,114,149,0,0,0,114, + 3,0,0,0,114,0,0,0,0,114,39,0,0,0,90,5, + 110,101,118,101,114,90,6,97,108,119,97,121,115,218,4,115, + 105,122,101,122,13,123,125,32,109,97,116,99,104,101,115,32, + 123,125,41,3,114,121,0,0,0,114,111,0,0,0,114,112, + 0,0,0,122,19,99,111,100,101,32,111,98,106,101,99,116, + 32,102,114,111,109,32,123,125,41,27,114,183,0,0,0,114, + 102,0,0,0,114,88,0,0,0,114,231,0,0,0,114,58, + 0,0,0,114,30,0,0,0,114,234,0,0,0,114,156,0, + 0,0,218,10,109,101,109,111,114,121,118,105,101,119,114,167, + 0,0,0,90,21,99,104,101,99,107,95,104,97,115,104,95, + 98,97,115,101,100,95,112,121,99,115,114,161,0,0,0,218, + 17,95,82,65,87,95,77,65,71,73,67,95,78,85,77,66, + 69,82,114,162,0,0,0,114,160,0,0,0,114,122,0,0, + 0,114,154,0,0,0,114,139,0,0,0,114,153,0,0,0, + 114,169,0,0,0,114,240,0,0,0,114,15,0,0,0,218, + 19,100,111,110,116,95,119,114,105,116,101,95,98,121,116,101, + 99,111,100,101,114,175,0,0,0,114,174,0,0,0,114,4, + 0,0,0,114,233,0,0,0,41,15,114,123,0,0,0,114, + 143,0,0,0,114,112,0,0,0,114,158,0,0,0,114,178, + 0,0,0,114,161,0,0,0,90,10,104,97,115,104,95,98, + 97,115,101,100,90,12,99,104,101,99,107,95,115,111,117,114, + 99,101,114,111,0,0,0,218,2,115,116,114,37,0,0,0, + 114,155,0,0,0,114,16,0,0,0,90,10,98,121,116,101, + 115,95,100,97,116,97,90,11,99,111,100,101,95,111,98,106, + 101,99,116,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,220,0,0,0,131,3,0,0,115,160,0,0,0, + 10,7,4,1,4,1,4,1,4,1,4,1,2,1,12,1, + 12,1,12,1,2,2,14,1,12,1,8,1,12,2,2,1, + 14,1,12,1,6,1,2,3,2,1,6,254,2,4,12,1, + 16,1,12,1,6,1,12,1,12,1,2,1,2,255,8,2, + 4,254,10,3,4,1,2,1,2,1,4,254,8,4,2,1, + 6,255,2,3,2,1,2,1,6,1,2,1,2,1,8,251, + 18,7,6,1,8,2,2,1,4,255,6,2,2,1,2,1, + 6,254,10,3,10,1,12,1,12,1,18,1,6,1,4,255, + 6,2,10,1,10,1,14,1,6,2,6,1,4,255,2,2, + 16,1,4,3,14,254,2,1,4,1,2,255,4,1,255,128, + 122,21,83,111,117,114,99,101,76,111,97,100,101,114,46,103, + 101,116,95,99,111,100,101,78,41,10,114,130,0,0,0,114, + 129,0,0,0,114,131,0,0,0,114,230,0,0,0,114,231, + 0,0,0,114,233,0,0,0,114,232,0,0,0,114,236,0, + 0,0,114,240,0,0,0,114,220,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,234,0,0,0,251,3,0,0,115,14,0,0,0,14,2, - 16,1,42,1,14,2,38,1,4,128,255,128,122,19,70,105, - 108,101,76,111,97,100,101,114,46,103,101,116,95,100,97,116, - 97,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,2,0,0,0,67,0,0,0,115,20,0,0,0,100, - 1,100,2,108,0,109,1,125,2,1,0,124,2,124,0,131, - 1,83,0,41,3,78,114,0,0,0,0,41,1,218,10,70, - 105,108,101,82,101,97,100,101,114,41,2,90,17,105,109,112, - 111,114,116,108,105,98,46,114,101,97,100,101,114,115,114,4, - 1,0,0,41,3,114,123,0,0,0,114,223,0,0,0,114, - 4,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,19,103,101,116,95,114,101,115,111,117,114,99, - 101,95,114,101,97,100,101,114,4,4,0,0,115,6,0,0, - 0,12,2,8,1,255,128,122,30,70,105,108,101,76,111,97, - 100,101,114,46,103,101,116,95,114,101,115,111,117,114,99,101, - 95,114,101,97,100,101,114,41,13,114,130,0,0,0,114,129, - 0,0,0,114,131,0,0,0,114,132,0,0,0,114,216,0, - 0,0,114,250,0,0,0,114,254,0,0,0,114,140,0,0, - 0,114,227,0,0,0,114,183,0,0,0,114,234,0,0,0, - 114,5,1,0,0,90,13,95,95,99,108,97,115,115,99,101, - 108,108,95,95,114,7,0,0,0,114,7,0,0,0,114,0, - 1,0,0,114,8,0,0,0,114,246,0,0,0,216,3,0, - 0,115,26,0,0,0,8,0,4,2,8,3,8,6,8,4, - 2,3,14,1,2,11,10,1,8,4,2,9,18,1,255,128, - 114,246,0,0,0,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,46, + 114,228,0,0,0,72,3,0,0,115,18,0,0,0,8,0, + 8,2,8,8,8,14,8,10,8,7,14,10,12,8,255,128, + 114,228,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,0,0,0,0,115,92, 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, 2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,100, - 6,100,7,156,1,100,8,100,9,132,2,90,6,100,10,83, - 0,41,11,218,16,83,111,117,114,99,101,70,105,108,101,76, - 111,97,100,101,114,122,62,67,111,110,99,114,101,116,101,32, - 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111, - 102,32,83,111,117,114,99,101,76,111,97,100,101,114,32,117, - 115,105,110,103,32,116,104,101,32,102,105,108,101,32,115,121, - 115,116,101,109,46,99,2,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,22, - 0,0,0,116,0,124,1,131,1,125,2,124,2,106,1,124, - 2,106,2,100,1,156,2,83,0,41,3,122,33,82,101,116, - 117,114,110,32,116,104,101,32,109,101,116,97,100,97,116,97, - 32,102,111,114,32,116,104,101,32,112,97,116,104,46,41,2, - 114,173,0,0,0,114,241,0,0,0,78,41,3,114,57,0, - 0,0,218,8,115,116,95,109,116,105,109,101,90,7,115,116, - 95,115,105,122,101,41,3,114,123,0,0,0,114,52,0,0, - 0,114,245,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,231,0,0,0,14,4,0,0,115,6, - 0,0,0,8,2,14,1,255,128,122,27,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,0,0, - 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, - 24,0,0,0,116,0,124,1,131,1,125,4,124,0,106,1, - 124,2,124,3,124,4,100,1,141,3,83,0,41,2,78,169, - 1,218,5,95,109,111,100,101,41,2,114,119,0,0,0,114, - 232,0,0,0,41,5,114,123,0,0,0,114,112,0,0,0, - 114,111,0,0,0,114,37,0,0,0,114,60,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,233, - 0,0,0,19,4,0,0,115,6,0,0,0,8,2,16,1, - 255,128,122,32,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, - 99,111,100,101,114,68,0,0,0,114,8,1,0,0,99,3, - 0,0,0,0,0,0,0,1,0,0,0,9,0,0,0,11, - 0,0,0,67,0,0,0,115,248,0,0,0,116,0,124,1, - 131,1,92,2,125,4,125,5,103,0,125,6,124,4,114,52, - 116,1,124,4,131,1,115,52,116,0,124,4,131,1,92,2, - 125,4,125,7,124,6,160,2,124,7,161,1,1,0,113,16, - 116,3,124,6,131,1,68,0,93,96,125,7,116,4,124,4, - 124,7,131,2,125,4,122,14,116,5,160,6,124,4,161,1, - 1,0,87,0,113,60,4,0,116,7,121,106,1,0,1,0, - 1,0,89,0,113,60,4,0,116,8,121,246,1,0,125,8, - 1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,3, - 1,0,87,0,89,0,100,2,125,8,126,8,1,0,100,2, - 83,0,100,2,125,8,126,8,48,0,122,30,116,11,124,1, - 124,2,124,3,131,3,1,0,116,9,160,10,100,3,124,1, - 161,2,1,0,87,0,100,2,83,0,4,0,116,8,121,240, - 1,0,125,8,1,0,122,28,116,9,160,10,100,1,124,1, - 124,8,161,3,1,0,87,0,89,0,100,2,125,8,126,8, - 100,2,83,0,100,2,125,8,126,8,48,0,48,0,100,2, - 83,0,48,0,41,4,122,27,87,114,105,116,101,32,98,121, - 116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,105, - 108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,99, - 114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,125, - 78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,41, - 12,114,55,0,0,0,114,64,0,0,0,114,190,0,0,0, - 114,50,0,0,0,114,48,0,0,0,114,18,0,0,0,90, - 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115, - 116,115,69,114,114,111,114,114,58,0,0,0,114,139,0,0, - 0,114,153,0,0,0,114,77,0,0,0,41,9,114,123,0, - 0,0,114,52,0,0,0,114,37,0,0,0,114,9,1,0, - 0,218,6,112,97,114,101,110,116,114,101,0,0,0,114,47, - 0,0,0,114,43,0,0,0,114,235,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,232,0,0, - 0,24,4,0,0,115,58,0,0,0,12,2,4,1,12,2, - 12,1,12,1,12,2,10,1,2,1,14,1,12,1,4,2, - 14,1,6,3,4,1,4,255,16,2,8,128,2,1,12,1, - 18,1,14,1,8,2,2,1,18,255,8,128,2,254,4,255, - 2,248,255,128,122,25,83,111,117,114,99,101,70,105,108,101, - 76,111,97,100,101,114,46,115,101,116,95,100,97,116,97,78, - 41,7,114,130,0,0,0,114,129,0,0,0,114,131,0,0, - 0,114,132,0,0,0,114,231,0,0,0,114,233,0,0,0, - 114,232,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,6,1,0,0,10,4, - 0,0,115,12,0,0,0,8,0,4,2,8,2,8,5,18, - 5,255,128,114,6,1,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,83,0,41,7,218,20,83,111,117,114,99,101, - 108,101,115,115,70,105,108,101,76,111,97,100,101,114,122,45, - 76,111,97,100,101,114,32,119,104,105,99,104,32,104,97,110, - 100,108,101,115,32,115,111,117,114,99,101,108,101,115,115,32, - 102,105,108,101,32,105,109,112,111,114,116,115,46,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, - 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,124, - 1,161,1,125,2,124,0,160,1,124,2,161,1,125,3,124, - 1,124,2,100,1,156,2,125,4,116,2,124,3,124,1,124, - 4,131,3,1,0,116,3,116,4,124,3,131,1,100,2,100, - 0,133,2,25,0,124,1,124,2,100,3,141,3,83,0,41, - 4,78,114,163,0,0,0,114,149,0,0,0,41,2,114,121, - 0,0,0,114,111,0,0,0,41,5,114,183,0,0,0,114, - 234,0,0,0,114,156,0,0,0,114,169,0,0,0,114,242, - 0,0,0,41,5,114,123,0,0,0,114,143,0,0,0,114, - 52,0,0,0,114,37,0,0,0,114,155,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,220,0, - 0,0,59,4,0,0,115,24,0,0,0,10,1,10,1,2, - 4,2,1,6,254,12,4,2,1,14,1,2,1,2,1,6, - 253,255,128,122,29,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,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,78, - 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, - 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, - 114,7,0,0,0,114,226,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,236,0,0,0,75,4, - 0,0,115,4,0,0,0,4,2,255,128,122,31,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,41,6,114, - 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, - 0,0,0,114,220,0,0,0,114,236,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,12,1,0,0,55,4,0,0,115,10,0,0,0,8, - 0,4,2,8,2,12,16,255,128,114,12,1,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,64,0,0,0,115,92,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, - 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6, - 100,8,100,9,132,0,90,7,100,10,100,11,132,0,90,8, - 100,12,100,13,132,0,90,9,100,14,100,15,132,0,90,10, - 100,16,100,17,132,0,90,11,101,12,100,18,100,19,132,0, - 131,1,90,13,100,20,83,0,41,21,114,3,1,0,0,122, - 93,76,111,97,100,101,114,32,102,111,114,32,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,115,46,10,10, - 32,32,32,32,84,104,101,32,99,111,110,115,116,114,117,99, - 116,111,114,32,105,115,32,100,101,115,105,103,110,101,100,32, - 116,111,32,119,111,114,107,32,119,105,116,104,32,70,105,108, - 101,70,105,110,100,101,114,46,10,10,32,32,32,32,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2, - 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0, - 95,0,124,2,124,0,95,1,100,0,83,0,114,114,0,0, - 0,114,163,0,0,0,41,3,114,123,0,0,0,114,121,0, - 0,0,114,52,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,216,0,0,0,88,4,0,0,115, - 6,0,0,0,6,1,10,1,255,128,122,28,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, - 0,115,24,0,0,0,124,0,106,0,124,1,106,0,107,2, - 111,22,124,0,106,1,124,1,106,1,107,2,83,0,114,114, - 0,0,0,114,247,0,0,0,114,249,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,250,0,0, - 0,92,4,0,0,115,8,0,0,0,12,1,10,1,2,255, - 255,128,122,26,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,46,95,95,101,113,95,95,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,20,0,0,0,116,0,124,0, - 106,1,131,1,116,0,124,0,106,2,131,1,65,0,83,0, - 114,114,0,0,0,114,251,0,0,0,114,253,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,254, - 0,0,0,96,4,0,0,115,4,0,0,0,20,1,255,128, - 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76, - 111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, - 0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1, - 116,2,106,3,124,1,161,2,125,2,116,0,160,4,100,1, - 124,1,106,5,124,0,106,6,161,3,1,0,124,2,83,0, - 41,3,122,38,67,114,101,97,116,101,32,97,110,32,117,110, - 105,116,105,97,108,105,122,101,100,32,101,120,116,101,110,115, - 105,111,110,32,109,111,100,117,108,101,122,38,101,120,116,101, + 6,100,7,132,0,90,6,101,7,135,0,102,1,100,8,100, + 9,132,8,131,1,90,8,101,7,100,10,100,11,132,0,131, + 1,90,9,100,12,100,13,132,0,90,10,101,7,100,14,100, + 15,132,0,131,1,90,11,135,0,4,0,90,12,83,0,41, + 16,218,10,70,105,108,101,76,111,97,100,101,114,122,103,66, + 97,115,101,32,102,105,108,101,32,108,111,97,100,101,114,32, + 99,108,97,115,115,32,119,104,105,99,104,32,105,109,112,108, + 101,109,101,110,116,115,32,116,104,101,32,108,111,97,100,101, + 114,32,112,114,111,116,111,99,111,108,32,109,101,116,104,111, + 100,115,32,116,104,97,116,10,32,32,32,32,114,101,113,117, + 105,114,101,32,102,105,108,101,32,115,121,115,116,101,109,32, + 117,115,97,103,101,46,99,3,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, + 16,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, + 100,1,83,0,41,2,122,75,67,97,99,104,101,32,116,104, + 101,32,109,111,100,117,108,101,32,110,97,109,101,32,97,110, + 100,32,116,104,101,32,112,97,116,104,32,116,111,32,116,104, + 101,32,102,105,108,101,32,102,111,117,110,100,32,98,121,32, + 116,104,101,10,32,32,32,32,32,32,32,32,102,105,110,100, + 101,114,46,78,114,163,0,0,0,41,3,114,123,0,0,0, + 114,143,0,0,0,114,52,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,216,0,0,0,221,3, + 0,0,115,6,0,0,0,6,3,10,1,255,128,122,19,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,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,24,0,0,0, + 124,0,106,0,124,1,106,0,107,2,111,22,124,0,106,1, + 124,1,106,1,107,2,83,0,114,114,0,0,0,169,2,218, + 9,95,95,99,108,97,115,115,95,95,114,136,0,0,0,169, + 2,114,123,0,0,0,90,5,111,116,104,101,114,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,6,95,95, + 101,113,95,95,227,3,0,0,115,8,0,0,0,12,1,10, + 1,2,255,255,128,122,17,70,105,108,101,76,111,97,100,101, + 114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,0, + 124,0,106,2,131,1,65,0,83,0,114,114,0,0,0,169, + 3,218,4,104,97,115,104,114,121,0,0,0,114,52,0,0, + 0,169,1,114,123,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,8,95,95,104,97,115,104,95, + 95,231,3,0,0,115,4,0,0,0,20,1,255,128,122,19, + 70,105,108,101,76,111,97,100,101,114,46,95,95,104,97,115, + 104,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,3,0,0,0,115,16,0,0, + 0,116,0,116,1,124,0,131,2,160,2,124,1,161,1,83, + 0,41,2,122,100,76,111,97,100,32,97,32,109,111,100,117, + 108,101,32,102,114,111,109,32,97,32,102,105,108,101,46,10, + 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,32,32,85,115,101,32,101,120,101,99,95,109,111, + 100,117,108,101,40,41,32,105,110,115,116,101,97,100,46,10, + 10,32,32,32,32,32,32,32,32,78,41,3,218,5,115,117, + 112,101,114,114,246,0,0,0,114,227,0,0,0,114,226,0, + 0,0,169,1,114,248,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,227,0,0,0,234,3,0,0,115,4,0,0, + 0,16,10,255,128,122,22,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,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, + 0,169,2,122,58,82,101,116,117,114,110,32,116,104,101,32, + 112,97,116,104,32,116,111,32,116,104,101,32,115,111,117,114, + 99,101,32,102,105,108,101,32,97,115,32,102,111,117,110,100, + 32,98,121,32,116,104,101,32,102,105,110,100,101,114,46,78, + 114,56,0,0,0,114,226,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,183,0,0,0,246,3, + 0,0,115,4,0,0,0,6,3,255,128,122,23,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,0,0,0, + 0,3,0,0,0,8,0,0,0,67,0,0,0,115,128,0, + 0,0,116,0,124,0,116,1,116,2,102,2,131,2,114,72, + 116,3,160,4,116,5,124,1,131,1,161,1,143,24,125,2, + 124,2,160,6,161,0,87,0,2,0,100,1,4,0,4,0, + 131,3,1,0,83,0,49,0,115,58,48,0,1,0,1,0, + 1,0,89,0,1,0,100,1,83,0,116,3,160,7,124,1, + 100,2,161,2,143,24,125,2,124,2,160,6,161,0,87,0, + 2,0,100,1,4,0,4,0,131,3,1,0,83,0,49,0, + 115,114,48,0,1,0,1,0,1,0,89,0,1,0,100,1, + 83,0,41,3,122,39,82,101,116,117,114,110,32,116,104,101, + 32,100,97,116,97,32,102,114,111,109,32,112,97,116,104,32, + 97,115,32,114,97,119,32,98,121,116,101,115,46,78,218,1, + 114,41,8,114,165,0,0,0,114,228,0,0,0,218,19,69, + 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, + 101,114,114,72,0,0,0,90,9,111,112,101,110,95,99,111, + 100,101,114,90,0,0,0,90,4,114,101,97,100,114,73,0, + 0,0,41,3,114,123,0,0,0,114,52,0,0,0,114,76, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,234,0,0,0,251,3,0,0,115,14,0,0,0, + 14,2,16,1,42,1,14,2,38,1,4,128,255,128,122,19, + 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,100, + 97,116,97,99,2,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,2,0,0,0,67,0,0,0,115,20,0,0, + 0,100,1,100,2,108,0,109,1,125,2,1,0,124,2,124, + 0,131,1,83,0,41,3,78,114,0,0,0,0,41,1,218, + 10,70,105,108,101,82,101,97,100,101,114,41,2,90,17,105, + 109,112,111,114,116,108,105,98,46,114,101,97,100,101,114,115, + 114,4,1,0,0,41,3,114,123,0,0,0,114,223,0,0, + 0,114,4,1,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,19,103,101,116,95,114,101,115,111,117, + 114,99,101,95,114,101,97,100,101,114,4,4,0,0,115,6, + 0,0,0,12,2,8,1,255,128,122,30,70,105,108,101,76, + 111,97,100,101,114,46,103,101,116,95,114,101,115,111,117,114, + 99,101,95,114,101,97,100,101,114,41,13,114,130,0,0,0, + 114,129,0,0,0,114,131,0,0,0,114,132,0,0,0,114, + 216,0,0,0,114,250,0,0,0,114,254,0,0,0,114,140, + 0,0,0,114,227,0,0,0,114,183,0,0,0,114,234,0, + 0,0,114,5,1,0,0,90,13,95,95,99,108,97,115,115, + 99,101,108,108,95,95,114,7,0,0,0,114,7,0,0,0, + 114,0,1,0,0,114,8,0,0,0,114,246,0,0,0,216, + 3,0,0,115,26,0,0,0,8,0,4,2,8,3,8,6, + 8,4,2,3,14,1,2,11,10,1,8,4,2,9,18,1, + 255,128,114,246,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,64,0,0,0, + 115,46,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, + 5,100,6,100,7,156,1,100,8,100,9,132,2,90,6,100, + 10,83,0,41,11,218,16,83,111,117,114,99,101,70,105,108, + 101,76,111,97,100,101,114,122,62,67,111,110,99,114,101,116, + 101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, + 32,111,102,32,83,111,117,114,99,101,76,111,97,100,101,114, + 32,117,115,105,110,103,32,116,104,101,32,102,105,108,101,32, + 115,121,115,116,101,109,46,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, + 115,22,0,0,0,116,0,124,1,131,1,125,2,124,2,106, + 1,124,2,106,2,100,1,156,2,83,0,41,3,122,33,82, + 101,116,117,114,110,32,116,104,101,32,109,101,116,97,100,97, + 116,97,32,102,111,114,32,116,104,101,32,112,97,116,104,46, + 41,2,114,173,0,0,0,114,241,0,0,0,78,41,3,114, + 57,0,0,0,218,8,115,116,95,109,116,105,109,101,90,7, + 115,116,95,115,105,122,101,41,3,114,123,0,0,0,114,52, + 0,0,0,114,245,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,231,0,0,0,14,4,0,0, + 115,6,0,0,0,8,2,14,1,255,128,122,27,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, + 0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,0, + 0,115,24,0,0,0,116,0,124,1,131,1,125,4,124,0, + 106,1,124,2,124,3,124,4,100,1,141,3,83,0,41,2, + 78,169,1,218,5,95,109,111,100,101,41,2,114,119,0,0, + 0,114,232,0,0,0,41,5,114,123,0,0,0,114,112,0, + 0,0,114,111,0,0,0,114,37,0,0,0,114,60,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,233,0,0,0,19,4,0,0,115,6,0,0,0,8,2, + 16,1,255,128,122,32,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,99,111,100,101,114,68,0,0,0,114,8,1,0,0, + 99,3,0,0,0,0,0,0,0,1,0,0,0,9,0,0, + 0,11,0,0,0,67,0,0,0,115,248,0,0,0,116,0, + 124,1,131,1,92,2,125,4,125,5,103,0,125,6,124,4, + 114,52,116,1,124,4,131,1,115,52,116,0,124,4,131,1, + 92,2,125,4,125,7,124,6,160,2,124,7,161,1,1,0, + 113,16,116,3,124,6,131,1,68,0,93,96,125,7,116,4, + 124,4,124,7,131,2,125,4,122,14,116,5,160,6,124,4, + 161,1,1,0,87,0,113,60,4,0,116,7,121,106,1,0, + 1,0,1,0,89,0,113,60,4,0,116,8,121,246,1,0, + 125,8,1,0,122,30,116,9,160,10,100,1,124,4,124,8, + 161,3,1,0,87,0,89,0,100,2,125,8,126,8,1,0, + 100,2,83,0,100,2,125,8,126,8,48,0,122,30,116,11, + 124,1,124,2,124,3,131,3,1,0,116,9,160,10,100,3, + 124,1,161,2,1,0,87,0,100,2,83,0,4,0,116,8, + 121,240,1,0,125,8,1,0,122,28,116,9,160,10,100,1, + 124,1,124,8,161,3,1,0,87,0,89,0,100,2,125,8, + 126,8,100,2,83,0,100,2,125,8,126,8,48,0,48,0, + 100,2,83,0,48,0,41,4,122,27,87,114,105,116,101,32, + 98,121,116,101,115,32,100,97,116,97,32,116,111,32,97,32, + 102,105,108,101,46,122,27,99,111,117,108,100,32,110,111,116, + 32,99,114,101,97,116,101,32,123,33,114,125,58,32,123,33, + 114,125,78,122,12,99,114,101,97,116,101,100,32,123,33,114, + 125,41,12,114,55,0,0,0,114,64,0,0,0,114,190,0, + 0,0,114,50,0,0,0,114,48,0,0,0,114,18,0,0, + 0,90,5,109,107,100,105,114,218,15,70,105,108,101,69,120, + 105,115,116,115,69,114,114,111,114,114,58,0,0,0,114,139, + 0,0,0,114,153,0,0,0,114,77,0,0,0,41,9,114, + 123,0,0,0,114,52,0,0,0,114,37,0,0,0,114,9, + 1,0,0,218,6,112,97,114,101,110,116,114,101,0,0,0, + 114,47,0,0,0,114,43,0,0,0,114,235,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,232, + 0,0,0,24,4,0,0,115,58,0,0,0,12,2,4,1, + 12,2,12,1,12,1,12,2,10,1,2,1,14,1,12,1, + 4,2,14,1,6,3,4,1,4,255,16,2,8,128,2,1, + 12,1,18,1,14,1,8,2,2,1,18,255,8,128,2,254, + 4,255,2,248,255,128,122,25,83,111,117,114,99,101,70,105, + 108,101,76,111,97,100,101,114,46,115,101,116,95,100,97,116, + 97,78,41,7,114,130,0,0,0,114,129,0,0,0,114,131, + 0,0,0,114,132,0,0,0,114,231,0,0,0,114,233,0, + 0,0,114,232,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,6,1,0,0, + 10,4,0,0,115,12,0,0,0,8,0,4,2,8,2,8, + 5,18,5,255,128,114,6,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114, + 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, + 122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104, + 97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115, + 115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160, + 0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125, + 3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124, + 1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100, + 2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83, + 0,41,4,78,114,163,0,0,0,114,149,0,0,0,41,2, + 114,121,0,0,0,114,111,0,0,0,41,5,114,183,0,0, + 0,114,234,0,0,0,114,156,0,0,0,114,169,0,0,0, + 114,242,0,0,0,41,5,114,123,0,0,0,114,143,0,0, + 0,114,52,0,0,0,114,37,0,0,0,114,155,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 220,0,0,0,59,4,0,0,115,24,0,0,0,10,1,10, + 1,2,4,2,1,6,254,12,4,2,1,14,1,2,1,2, + 1,6,253,255,128,122,29,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,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,41,2,122,39,82,101,116,117,114,110, + 32,78,111,110,101,32,97,115,32,116,104,101,114,101,32,105, + 115,32,110,111,32,115,111,117,114,99,101,32,99,111,100,101, + 46,78,114,7,0,0,0,114,226,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,236,0,0,0, + 75,4,0,0,115,4,0,0,0,4,2,255,128,122,31,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,41, + 6,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, + 114,132,0,0,0,114,220,0,0,0,114,236,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,12,1,0,0,55,4,0,0,115,10,0,0, + 0,8,0,4,2,8,2,12,16,255,128,114,12,1,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,92,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, + 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, + 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, + 90,10,100,16,100,17,132,0,90,11,101,12,100,18,100,19, + 132,0,131,1,90,13,100,20,83,0,41,21,114,3,1,0, + 0,122,93,76,111,97,100,101,114,32,102,111,114,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,46, + 10,10,32,32,32,32,84,104,101,32,99,111,110,115,116,114, + 117,99,116,111,114,32,105,115,32,100,101,115,105,103,110,101, + 100,32,116,111,32,119,111,114,107,32,119,105,116,104,32,70, + 105,108,101,70,105,110,100,101,114,46,10,10,32,32,32,32, + 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,2,0,0,0,67,0,0,0,115,16,0,0,0,124,1, + 124,0,95,0,124,2,124,0,95,1,100,0,83,0,114,114, + 0,0,0,114,163,0,0,0,41,3,114,123,0,0,0,114, + 121,0,0,0,114,52,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,216,0,0,0,88,4,0, + 0,115,6,0,0,0,6,1,10,1,255,128,122,28,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,0,0,0,0,2,0,0,0,2,0,0,0,67, + 0,0,0,115,24,0,0,0,124,0,106,0,124,1,106,0, + 107,2,111,22,124,0,106,1,124,1,106,1,107,2,83,0, + 114,114,0,0,0,114,247,0,0,0,114,249,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,250, + 0,0,0,92,4,0,0,115,8,0,0,0,12,1,10,1, + 2,255,255,128,122,26,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,95, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,3,0,0,0,67,0,0,0,115,20,0,0,0,116,0, + 124,0,106,1,131,1,116,0,124,0,106,2,131,1,65,0, + 83,0,114,114,0,0,0,114,251,0,0,0,114,253,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,254,0,0,0,96,4,0,0,115,4,0,0,0,20,1, + 255,128,122,28,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,95,95,104,97,115,104,95,95, + 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,5,0,0,0,67,0,0,0,115,36,0,0,0,116,0, + 160,1,116,2,106,3,124,1,161,2,125,2,116,0,160,4, + 100,1,124,1,106,5,124,0,106,6,161,3,1,0,124,2, + 83,0,41,3,122,38,67,114,101,97,116,101,32,97,110,32, + 117,110,105,116,105,97,108,105,122,101,100,32,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,122,38,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,123, + 33,114,125,32,108,111,97,100,101,100,32,102,114,111,109,32, + 123,33,114,125,78,41,7,114,139,0,0,0,114,221,0,0, + 0,114,167,0,0,0,90,14,99,114,101,97,116,101,95,100, + 121,110,97,109,105,99,114,153,0,0,0,114,121,0,0,0, + 114,52,0,0,0,41,3,114,123,0,0,0,114,191,0,0, + 0,114,223,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,219,0,0,0,99,4,0,0,115,16, + 0,0,0,4,2,6,1,4,255,6,2,8,1,4,255,4, + 2,255,128,122,33,69,120,116,101,110,115,105,111,110,70,105, + 108,101,76,111,97,100,101,114,46,99,114,101,97,116,101,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,5,0,0,0,67,0,0,0,115, + 36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,2, + 1,0,116,0,160,4,100,1,124,0,106,5,124,0,106,6, + 161,3,1,0,100,2,83,0,41,3,122,30,73,110,105,116, + 105,97,108,105,122,101,32,97,110,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,122,40,101,120,116,101, 110,115,105,111,110,32,109,111,100,117,108,101,32,123,33,114, - 125,32,108,111,97,100,101,100,32,102,114,111,109,32,123,33, - 114,125,78,41,7,114,139,0,0,0,114,221,0,0,0,114, - 167,0,0,0,90,14,99,114,101,97,116,101,95,100,121,110, + 125,32,101,120,101,99,117,116,101,100,32,102,114,111,109,32, + 123,33,114,125,78,41,7,114,139,0,0,0,114,221,0,0, + 0,114,167,0,0,0,90,12,101,120,101,99,95,100,121,110, 97,109,105,99,114,153,0,0,0,114,121,0,0,0,114,52, - 0,0,0,41,3,114,123,0,0,0,114,191,0,0,0,114, - 223,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,219,0,0,0,99,4,0,0,115,16,0,0, - 0,4,2,6,1,4,255,6,2,8,1,4,255,4,2,255, - 128,122,33,69,120,116,101,110,115,105,111,110,70,105,108,101, - 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111, - 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,5,0,0,0,67,0,0,0,115,36,0, - 0,0,116,0,160,1,116,2,106,3,124,1,161,2,1,0, - 116,0,160,4,100,1,124,0,106,5,124,0,106,6,161,3, - 1,0,100,2,83,0,41,3,122,30,73,110,105,116,105,97, - 108,105,122,101,32,97,110,32,101,120,116,101,110,115,105,111, - 110,32,109,111,100,117,108,101,122,40,101,120,116,101,110,115, - 105,111,110,32,109,111,100,117,108,101,32,123,33,114,125,32, - 101,120,101,99,117,116,101,100,32,102,114,111,109,32,123,33, - 114,125,78,41,7,114,139,0,0,0,114,221,0,0,0,114, - 167,0,0,0,90,12,101,120,101,99,95,100,121,110,97,109, - 105,99,114,153,0,0,0,114,121,0,0,0,114,52,0,0, - 0,169,2,114,123,0,0,0,114,223,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,224,0,0, - 0,107,4,0,0,115,10,0,0,0,14,2,6,1,8,1, - 8,255,255,128,122,31,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,36, - 0,0,0,116,0,124,0,106,1,131,1,100,1,25,0,137, - 0,116,2,135,0,102,1,100,2,100,3,132,8,116,3,68, - 0,131,1,131,1,83,0,41,5,122,49,82,101,116,117,114, - 110,32,84,114,117,101,32,105,102,32,116,104,101,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,105, - 115,32,97,32,112,97,99,107,97,103,101,46,114,3,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,4,0,0,0,51,0,0,0,115,26,0,0,0,124, - 0,93,18,125,1,136,0,100,0,124,1,23,0,107,2,86, - 0,1,0,113,2,100,1,83,0,41,2,114,216,0,0,0, - 78,114,7,0,0,0,169,2,114,5,0,0,0,218,6,115, - 117,102,102,105,120,169,1,90,9,102,105,108,101,95,110,97, - 109,101,114,7,0,0,0,114,8,0,0,0,114,9,0,0, - 0,116,4,0,0,115,8,0,0,0,4,0,2,1,20,255, - 255,128,122,49,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,111,99,97,108,115,62,46,60,103,101,110, - 101,120,112,114,62,78,41,4,114,55,0,0,0,114,52,0, - 0,0,218,3,97,110,121,114,212,0,0,0,114,226,0,0, - 0,114,7,0,0,0,114,16,1,0,0,114,8,0,0,0, - 114,186,0,0,0,113,4,0,0,115,10,0,0,0,14,2, - 12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,101, - 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32, + 0,0,0,169,2,114,123,0,0,0,114,223,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,224, + 0,0,0,107,4,0,0,115,10,0,0,0,14,2,6,1, + 8,1,8,255,255,128,122,31,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,99, + 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0, + 115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,25, + 0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,116, + 3,68,0,131,1,131,1,83,0,41,5,122,49,82,101,116, + 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, - 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,7, - 0,0,0,114,226,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,220,0,0,0,119,4,0,0, - 115,4,0,0,0,4,2,255,128,122,28,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, - 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,122,53,82,101,116, - 117,114,110,32,78,111,110,101,32,97,115,32,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,115,32,104,97, - 118,101,32,110,111,32,115,111,117,114,99,101,32,99,111,100, - 101,46,78,114,7,0,0,0,114,226,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,236,0,0, - 0,123,4,0,0,115,4,0,0,0,4,2,255,128,122,30, - 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,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,6,0,0,0,124,0,106,0, - 83,0,114,1,1,0,0,114,56,0,0,0,114,226,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,183,0,0,0,127,4,0,0,115,4,0,0,0,6,3, - 255,128,122,32,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,101, - 110,97,109,101,78,41,14,114,130,0,0,0,114,129,0,0, - 0,114,131,0,0,0,114,132,0,0,0,114,216,0,0,0, - 114,250,0,0,0,114,254,0,0,0,114,219,0,0,0,114, - 224,0,0,0,114,186,0,0,0,114,220,0,0,0,114,236, - 0,0,0,114,140,0,0,0,114,183,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,3,1,0,0,80,4,0,0,115,26,0,0,0,8, - 0,4,2,8,6,8,4,8,4,8,3,8,8,8,6,8, - 6,8,4,2,4,14,1,255,128,114,3,1,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,64,0,0,0,115,104,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, - 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6, - 100,8,100,9,132,0,90,7,100,10,100,11,132,0,90,8, - 100,12,100,13,132,0,90,9,100,14,100,15,132,0,90,10, - 100,16,100,17,132,0,90,11,100,18,100,19,132,0,90,12, - 100,20,100,21,132,0,90,13,100,22,100,23,132,0,90,14, - 100,24,83,0,41,25,218,14,95,78,97,109,101,115,112,97, - 99,101,80,97,116,104,97,38,1,0,0,82,101,112,114,101, - 115,101,110,116,115,32,97,32,110,97,109,101,115,112,97,99, - 101,32,112,97,99,107,97,103,101,39,115,32,112,97,116,104, - 46,32,32,73,116,32,117,115,101,115,32,116,104,101,32,109, - 111,100,117,108,101,32,110,97,109,101,10,32,32,32,32,116, - 111,32,102,105,110,100,32,105,116,115,32,112,97,114,101,110, - 116,32,109,111,100,117,108,101,44,32,97,110,100,32,102,114, - 111,109,32,116,104,101,114,101,32,105,116,32,108,111,111,107, - 115,32,117,112,32,116,104,101,32,112,97,114,101,110,116,39, - 115,10,32,32,32,32,95,95,112,97,116,104,95,95,46,32, - 32,87,104,101,110,32,116,104,105,115,32,99,104,97,110,103, - 101,115,44,32,116,104,101,32,109,111,100,117,108,101,39,115, - 32,111,119,110,32,112,97,116,104,32,105,115,32,114,101,99, - 111,109,112,117,116,101,100,44,10,32,32,32,32,117,115,105, - 110,103,32,112,97,116,104,95,102,105,110,100,101,114,46,32, - 32,70,111,114,32,116,111,112,45,108,101,118,101,108,32,109, - 111,100,117,108,101,115,44,32,116,104,101,32,112,97,114,101, - 110,116,32,109,111,100,117,108,101,39,115,32,112,97,116,104, - 10,32,32,32,32,105,115,32,115,121,115,46,112,97,116,104, - 46,99,4,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,3,0,0,0,67,0,0,0,115,36,0,0,0,124, - 1,124,0,95,0,124,2,124,0,95,1,116,2,124,0,160, - 3,161,0,131,1,124,0,95,4,124,3,124,0,95,5,100, - 0,83,0,114,114,0,0,0,41,6,218,5,95,110,97,109, - 101,218,5,95,112,97,116,104,114,116,0,0,0,218,16,95, - 103,101,116,95,112,97,114,101,110,116,95,112,97,116,104,218, - 17,95,108,97,115,116,95,112,97,114,101,110,116,95,112,97, - 116,104,218,12,95,112,97,116,104,95,102,105,110,100,101,114, - 169,4,114,123,0,0,0,114,121,0,0,0,114,52,0,0, - 0,90,11,112,97,116,104,95,102,105,110,100,101,114,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, - 0,0,140,4,0,0,115,10,0,0,0,6,1,6,1,14, - 1,10,1,255,128,122,23,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,0,0,0,0,4,0,0,0,3, - 0,0,0,67,0,0,0,115,38,0,0,0,124,0,106,0, - 160,1,100,1,161,1,92,3,125,1,125,2,125,3,124,2, - 100,2,107,2,114,30,100,3,83,0,124,1,100,4,102,2, - 83,0,41,6,122,62,82,101,116,117,114,110,115,32,97,32, - 116,117,112,108,101,32,111,102,32,40,112,97,114,101,110,116, - 45,109,111,100,117,108,101,45,110,97,109,101,44,32,112,97, - 114,101,110,116,45,112,97,116,104,45,97,116,116,114,45,110, - 97,109,101,41,114,79,0,0,0,114,10,0,0,0,41,2, - 114,15,0,0,0,114,52,0,0,0,90,8,95,95,112,97, - 116,104,95,95,78,41,2,114,19,1,0,0,114,49,0,0, - 0,41,4,114,123,0,0,0,114,11,1,0,0,218,3,100, - 111,116,90,2,109,101,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,23,95,102,105,110,100,95,112,97,114, - 101,110,116,95,112,97,116,104,95,110,97,109,101,115,146,4, - 0,0,115,10,0,0,0,18,2,8,1,4,2,8,3,255, - 128,122,38,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,101,115,99,1,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, - 0,0,115,28,0,0,0,124,0,160,0,161,0,92,2,125, - 1,125,2,116,1,116,2,106,3,124,1,25,0,124,2,131, - 2,83,0,114,114,0,0,0,41,4,114,26,1,0,0,114, - 135,0,0,0,114,15,0,0,0,218,7,109,111,100,117,108, - 101,115,41,3,114,123,0,0,0,90,18,112,97,114,101,110, - 116,95,109,111,100,117,108,101,95,110,97,109,101,90,14,112, - 97,116,104,95,97,116,116,114,95,110,97,109,101,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,21,1,0, - 0,156,4,0,0,115,6,0,0,0,12,1,16,1,255,128, - 122,31,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,0,0,0,0,3,0, - 0,0,4,0,0,0,67,0,0,0,115,80,0,0,0,116, - 0,124,0,160,1,161,0,131,1,125,1,124,1,124,0,106, - 2,107,3,114,74,124,0,160,3,124,0,106,4,124,1,161, - 2,125,2,124,2,100,0,117,1,114,68,124,2,106,5,100, - 0,117,0,114,68,124,2,106,6,114,68,124,2,106,6,124, - 0,95,7,124,1,124,0,95,2,124,0,106,7,83,0,114, - 114,0,0,0,41,8,114,116,0,0,0,114,21,1,0,0, - 114,22,1,0,0,114,23,1,0,0,114,19,1,0,0,114, - 144,0,0,0,114,182,0,0,0,114,20,1,0,0,41,3, - 114,123,0,0,0,90,11,112,97,114,101,110,116,95,112,97, - 116,104,114,191,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,12,95,114,101,99,97,108,99,117, - 108,97,116,101,160,4,0,0,115,18,0,0,0,12,2,10, - 1,14,1,18,3,6,1,8,1,6,1,6,1,255,128,122, - 27,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, - 95,114,101,99,97,108,99,117,108,97,116,101,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,115,12,0,0,0,116,0,124,0,160,1, - 161,0,131,1,83,0,114,114,0,0,0,41,2,218,4,105, - 116,101,114,114,28,1,0,0,114,253,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,8,95,95, - 105,116,101,114,95,95,173,4,0,0,115,4,0,0,0,12, - 1,255,128,122,23,95,78,97,109,101,115,112,97,99,101,80, - 97,116,104,46,95,95,105,116,101,114,95,95,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, - 0,67,0,0,0,115,12,0,0,0,124,0,160,0,161,0, - 124,1,25,0,83,0,114,114,0,0,0,169,1,114,28,1, - 0,0,41,2,114,123,0,0,0,218,5,105,110,100,101,120, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,95,95,103,101,116,105,116,101,109,95,95,176,4,0,0, - 115,4,0,0,0,12,1,255,128,122,26,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,46,95,95,103,101,116,105, - 116,101,109,95,95,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,14, - 0,0,0,124,2,124,0,106,0,124,1,60,0,100,0,83, - 0,114,114,0,0,0,41,1,114,20,1,0,0,41,3,114, - 123,0,0,0,114,32,1,0,0,114,52,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, - 95,115,101,116,105,116,101,109,95,95,179,4,0,0,115,4, - 0,0,0,14,1,255,128,122,26,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,46,95,95,115,101,116,105,116,101, - 109,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, - 0,116,0,124,0,160,1,161,0,131,1,83,0,114,114,0, - 0,0,41,2,114,4,0,0,0,114,28,1,0,0,114,253, + 32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,3, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,0, + 0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,107, + 2,86,0,1,0,113,2,100,1,83,0,41,2,114,216,0, + 0,0,78,114,7,0,0,0,169,2,114,5,0,0,0,218, + 6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,95, + 110,97,109,101,114,7,0,0,0,114,8,0,0,0,114,9, + 0,0,0,116,4,0,0,115,8,0,0,0,4,0,2,1, + 20,255,255,128,122,49,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,111,99,97,108,115,62,46,60,103, + 101,110,101,120,112,114,62,78,41,4,114,55,0,0,0,114, + 52,0,0,0,218,3,97,110,121,114,212,0,0,0,114,226, + 0,0,0,114,7,0,0,0,114,16,1,0,0,114,8,0, + 0,0,114,186,0,0,0,113,4,0,0,115,10,0,0,0, + 14,2,12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,63, + 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,97, + 110,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, + 108,101,32,99,97,110,110,111,116,32,99,114,101,97,116,101, + 32,97,32,99,111,100,101,32,111,98,106,101,99,116,46,78, + 114,7,0,0,0,114,226,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,220,0,0,0,119,4, + 0,0,115,4,0,0,0,4,2,255,128,122,28,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,53,82, + 101,116,117,114,110,32,78,111,110,101,32,97,115,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,32, + 104,97,118,101,32,110,111,32,115,111,117,114,99,101,32,99, + 111,100,101,46,78,114,7,0,0,0,114,226,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,236, + 0,0,0,123,4,0,0,115,4,0,0,0,4,2,255,128, + 122,30,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, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,6,0,0,0,124,0, + 106,0,83,0,114,1,1,0,0,114,56,0,0,0,114,226, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,7,95,95,108,101,110,95,95,182,4,0,0,115, - 4,0,0,0,12,1,255,128,122,22,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,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, - 160,0,124,0,106,1,161,1,83,0,41,2,78,122,20,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, - 114,125,41,41,2,114,70,0,0,0,114,20,1,0,0,114, - 253,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,8,95,95,114,101,112,114,95,95,185,4,0, - 0,115,4,0,0,0,12,1,255,128,122,23,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,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, - 0,124,1,124,0,160,0,161,0,118,0,83,0,114,114,0, - 0,0,114,31,1,0,0,169,2,114,123,0,0,0,218,4, - 105,116,101,109,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, - 95,188,4,0,0,115,4,0,0,0,12,1,255,128,122,27, - 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,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124, - 1,161,1,1,0,100,0,83,0,114,114,0,0,0,41,2, - 114,20,1,0,0,114,190,0,0,0,114,37,1,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,190, - 0,0,0,191,4,0,0,115,4,0,0,0,16,1,255,128, - 122,21,95,78,97,109,101,115,112,97,99,101,80,97,116,104, - 46,97,112,112,101,110,100,78,41,15,114,130,0,0,0,114, - 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,216, - 0,0,0,114,26,1,0,0,114,21,1,0,0,114,28,1, - 0,0,114,30,1,0,0,114,33,1,0,0,114,34,1,0, - 0,114,35,1,0,0,114,36,1,0,0,114,39,1,0,0, - 114,190,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,18,1,0,0,133,4, - 0,0,115,28,0,0,0,8,0,4,1,8,6,8,6,8, - 10,8,4,8,13,8,3,8,3,8,3,8,3,8,3,12, - 3,255,128,114,18,1,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,80,0,0,0,101,0,90,1,100,0,90,2,100,1, - 100,2,132,0,90,3,101,4,100,3,100,4,132,0,131,1, - 90,5,100,5,100,6,132,0,90,6,100,7,100,8,132,0, - 90,7,100,9,100,10,132,0,90,8,100,11,100,12,132,0, - 90,9,100,13,100,14,132,0,90,10,100,15,100,16,132,0, - 90,11,100,17,83,0,41,18,218,16,95,78,97,109,101,115, - 112,97,99,101,76,111,97,100,101,114,99,4,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, - 0,0,0,115,18,0,0,0,116,0,124,1,124,2,124,3, - 131,3,124,0,95,1,100,0,83,0,114,114,0,0,0,41, - 2,114,18,1,0,0,114,20,1,0,0,114,24,1,0,0, + 0,0,114,183,0,0,0,127,4,0,0,115,4,0,0,0, + 6,3,255,128,122,32,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,103,101,116,95,102,105, + 108,101,110,97,109,101,78,41,14,114,130,0,0,0,114,129, + 0,0,0,114,131,0,0,0,114,132,0,0,0,114,216,0, + 0,0,114,250,0,0,0,114,254,0,0,0,114,219,0,0, + 0,114,224,0,0,0,114,186,0,0,0,114,220,0,0,0, + 114,236,0,0,0,114,140,0,0,0,114,183,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,3,1,0,0,80,4,0,0,115,26,0,0, + 0,8,0,4,2,8,6,8,4,8,4,8,3,8,8,8, + 6,8,6,8,4,2,4,14,1,255,128,114,3,1,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,64,0,0,0,115,104,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, + 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, + 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, + 90,10,100,16,100,17,132,0,90,11,100,18,100,19,132,0, + 90,12,100,20,100,21,132,0,90,13,100,22,100,23,132,0, + 90,14,100,24,83,0,41,25,218,14,95,78,97,109,101,115, + 112,97,99,101,80,97,116,104,97,38,1,0,0,82,101,112, + 114,101,115,101,110,116,115,32,97,32,110,97,109,101,115,112, + 97,99,101,32,112,97,99,107,97,103,101,39,115,32,112,97, + 116,104,46,32,32,73,116,32,117,115,101,115,32,116,104,101, + 32,109,111,100,117,108,101,32,110,97,109,101,10,32,32,32, + 32,116,111,32,102,105,110,100,32,105,116,115,32,112,97,114, + 101,110,116,32,109,111,100,117,108,101,44,32,97,110,100,32, + 102,114,111,109,32,116,104,101,114,101,32,105,116,32,108,111, + 111,107,115,32,117,112,32,116,104,101,32,112,97,114,101,110, + 116,39,115,10,32,32,32,32,95,95,112,97,116,104,95,95, + 46,32,32,87,104,101,110,32,116,104,105,115,32,99,104,97, + 110,103,101,115,44,32,116,104,101,32,109,111,100,117,108,101, + 39,115,32,111,119,110,32,112,97,116,104,32,105,115,32,114, + 101,99,111,109,112,117,116,101,100,44,10,32,32,32,32,117, + 115,105,110,103,32,112,97,116,104,95,102,105,110,100,101,114, + 46,32,32,70,111,114,32,116,111,112,45,108,101,118,101,108, + 32,109,111,100,117,108,101,115,44,32,116,104,101,32,112,97, + 114,101,110,116,32,109,111,100,117,108,101,39,115,32,112,97, + 116,104,10,32,32,32,32,105,115,32,115,121,115,46,112,97, + 116,104,46,99,4,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,3,0,0,0,67,0,0,0,115,36,0,0, + 0,124,1,124,0,95,0,124,2,124,0,95,1,116,2,124, + 0,160,3,161,0,131,1,124,0,95,4,124,3,124,0,95, + 5,100,0,83,0,114,114,0,0,0,41,6,218,5,95,110, + 97,109,101,218,5,95,112,97,116,104,114,116,0,0,0,218, + 16,95,103,101,116,95,112,97,114,101,110,116,95,112,97,116, + 104,218,17,95,108,97,115,116,95,112,97,114,101,110,116,95, + 112,97,116,104,218,12,95,112,97,116,104,95,102,105,110,100, + 101,114,169,4,114,123,0,0,0,114,121,0,0,0,114,52, + 0,0,0,90,11,112,97,116,104,95,102,105,110,100,101,114, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 216,0,0,0,197,4,0,0,115,4,0,0,0,18,1,255, - 128,122,25,95,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,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, - 106,1,161,1,83,0,41,3,122,115,82,101,116,117,114,110, - 32,114,101,112,114,32,102,111,114,32,116,104,101,32,109,111, - 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,109,101,116,104,111,100,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,46,32,32,84,104,101,32,105,109, - 112,111,114,116,32,109,97,99,104,105,110,101,114,121,32,100, - 111,101,115,32,116,104,101,32,106,111,98,32,105,116,115,101, - 108,102,46,10,10,32,32,32,32,32,32,32,32,122,25,60, - 109,111,100,117,108,101,32,123,33,114,125,32,40,110,97,109, - 101,115,112,97,99,101,41,62,78,41,2,114,70,0,0,0, - 114,130,0,0,0,41,1,114,223,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,11,109,111,100, - 117,108,101,95,114,101,112,114,200,4,0,0,115,4,0,0, - 0,12,7,255,128,122,28,95,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,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,78,84,114,7,0,0,0,114,226, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,186,0,0,0,209,4,0,0,115,4,0,0,0, - 4,1,255,128,122,27,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,78,114,10,0,0,0,114,7,0,0,0, + 216,0,0,0,140,4,0,0,115,10,0,0,0,6,1,6, + 1,14,1,10,1,255,128,122,23,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,0,0,0,0,4,0,0, + 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, + 106,0,160,1,100,1,161,1,92,3,125,1,125,2,125,3, + 124,2,100,2,107,2,114,30,100,3,83,0,124,1,100,4, + 102,2,83,0,41,6,122,62,82,101,116,117,114,110,115,32, + 97,32,116,117,112,108,101,32,111,102,32,40,112,97,114,101, + 110,116,45,109,111,100,117,108,101,45,110,97,109,101,44,32, + 112,97,114,101,110,116,45,112,97,116,104,45,97,116,116,114, + 45,110,97,109,101,41,114,79,0,0,0,114,10,0,0,0, + 41,2,114,15,0,0,0,114,52,0,0,0,90,8,95,95, + 112,97,116,104,95,95,78,41,2,114,19,1,0,0,114,49, + 0,0,0,41,4,114,123,0,0,0,114,11,1,0,0,218, + 3,100,111,116,90,2,109,101,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,23,95,102,105,110,100,95,112, + 97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,115, + 146,4,0,0,115,10,0,0,0,18,2,8,1,4,2,8, + 3,255,128,122,38,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,101,115,99,1,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,28,0,0,0,124,0,160,0,161,0,92, + 2,125,1,125,2,116,1,116,2,106,3,124,1,25,0,124, + 2,131,2,83,0,114,114,0,0,0,41,4,114,26,1,0, + 0,114,135,0,0,0,114,15,0,0,0,218,7,109,111,100, + 117,108,101,115,41,3,114,123,0,0,0,90,18,112,97,114, + 101,110,116,95,109,111,100,117,108,101,95,110,97,109,101,90, + 14,112,97,116,104,95,97,116,116,114,95,110,97,109,101,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,21, + 1,0,0,156,4,0,0,115,6,0,0,0,12,1,16,1, + 255,128,122,31,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,0,0,0,0, + 3,0,0,0,4,0,0,0,67,0,0,0,115,80,0,0, + 0,116,0,124,0,160,1,161,0,131,1,125,1,124,1,124, + 0,106,2,107,3,114,74,124,0,160,3,124,0,106,4,124, + 1,161,2,125,2,124,2,100,0,117,1,114,68,124,2,106, + 5,100,0,117,0,114,68,124,2,106,6,114,68,124,2,106, + 6,124,0,95,7,124,1,124,0,95,2,124,0,106,7,83, + 0,114,114,0,0,0,41,8,114,116,0,0,0,114,21,1, + 0,0,114,22,1,0,0,114,23,1,0,0,114,19,1,0, + 0,114,144,0,0,0,114,182,0,0,0,114,20,1,0,0, + 41,3,114,123,0,0,0,90,11,112,97,114,101,110,116,95, + 112,97,116,104,114,191,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,12,95,114,101,99,97,108, + 99,117,108,97,116,101,160,4,0,0,115,18,0,0,0,12, + 2,10,1,14,1,18,3,6,1,8,1,6,1,6,1,255, + 128,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,46,95,114,101,99,97,108,99,117,108,97,116,101,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, + 0,0,0,67,0,0,0,115,12,0,0,0,116,0,124,0, + 160,1,161,0,131,1,83,0,114,114,0,0,0,41,2,218, + 4,105,116,101,114,114,28,1,0,0,114,253,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,8, + 95,95,105,116,101,114,95,95,173,4,0,0,115,4,0,0, + 0,12,1,255,128,122,23,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, + 0,0,0,67,0,0,0,115,12,0,0,0,124,0,160,0, + 161,0,124,1,25,0,83,0,114,114,0,0,0,169,1,114, + 28,1,0,0,41,2,114,123,0,0,0,218,5,105,110,100, + 101,120,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,11,95,95,103,101,116,105,116,101,109,95,95,176,4, + 0,0,115,4,0,0,0,12,1,255,128,122,26,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,95,95,103,101, + 116,105,116,101,109,95,95,99,3,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, + 115,14,0,0,0,124,2,124,0,106,0,124,1,60,0,100, + 0,83,0,114,114,0,0,0,41,1,114,20,1,0,0,41, + 3,114,123,0,0,0,114,32,1,0,0,114,52,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 11,95,95,115,101,116,105,116,101,109,95,95,179,4,0,0, + 115,4,0,0,0,14,1,255,128,122,26,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,115,101,116,105, + 116,101,109,95,95,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12, + 0,0,0,116,0,124,0,160,1,161,0,131,1,83,0,114, + 114,0,0,0,41,2,114,4,0,0,0,114,28,1,0,0, + 114,253,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,7,95,95,108,101,110,95,95,182,4,0, + 0,115,4,0,0,0,12,1,255,128,122,22,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,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, + 100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122, + 20,95,78,97,109,101,115,112,97,99,101,80,97,116,104,40, + 123,33,114,125,41,41,2,114,70,0,0,0,114,20,1,0, + 0,114,253,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,8,95,95,114,101,112,114,95,95,185, + 4,0,0,115,4,0,0,0,12,1,255,128,122,23,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,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12, + 0,0,0,124,1,124,0,160,0,161,0,118,0,83,0,114, + 114,0,0,0,114,31,1,0,0,169,2,114,123,0,0,0, + 218,4,105,116,101,109,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,12,95,95,99,111,110,116,97,105,110, + 115,95,95,188,4,0,0,115,4,0,0,0,12,1,255,128, + 122,27,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,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,16,0,0,0,124,0,106,0,160, + 1,124,1,161,1,1,0,100,0,83,0,114,114,0,0,0, + 41,2,114,20,1,0,0,114,190,0,0,0,114,37,1,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,190,0,0,0,191,4,0,0,115,4,0,0,0,16,1, + 255,128,122,21,95,78,97,109,101,115,112,97,99,101,80,97, + 116,104,46,97,112,112,101,110,100,78,41,15,114,130,0,0, + 0,114,129,0,0,0,114,131,0,0,0,114,132,0,0,0, + 114,216,0,0,0,114,26,1,0,0,114,21,1,0,0,114, + 28,1,0,0,114,30,1,0,0,114,33,1,0,0,114,34, + 1,0,0,114,35,1,0,0,114,36,1,0,0,114,39,1, + 0,0,114,190,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,18,1,0,0, + 133,4,0,0,115,28,0,0,0,8,0,4,1,8,6,8, + 6,8,10,8,4,8,13,8,3,8,3,8,3,8,3,8, + 3,12,3,255,128,114,18,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, + 0,0,0,115,80,0,0,0,101,0,90,1,100,0,90,2, + 100,1,100,2,132,0,90,3,101,4,100,3,100,4,132,0, + 131,1,90,5,100,5,100,6,132,0,90,6,100,7,100,8, + 132,0,90,7,100,9,100,10,132,0,90,8,100,11,100,12, + 132,0,90,9,100,13,100,14,132,0,90,10,100,15,100,16, + 132,0,90,11,100,17,83,0,41,18,218,16,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,99,4,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, + 0,67,0,0,0,115,18,0,0,0,116,0,124,1,124,2, + 124,3,131,3,124,0,95,1,100,0,83,0,114,114,0,0, + 0,41,2,114,18,1,0,0,114,20,1,0,0,114,24,1, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,216,0,0,0,197,4,0,0,115,4,0,0,0,18, + 1,255,128,122,25,95,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,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, + 0,0,0,67,0,0,0,115,12,0,0,0,100,1,160,0, + 124,0,106,1,161,1,83,0,41,3,122,115,82,101,116,117, + 114,110,32,114,101,112,114,32,102,111,114,32,116,104,101,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,101,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,84,104,101,32, + 105,109,112,111,114,116,32,109,97,99,104,105,110,101,114,121, + 32,100,111,101,115,32,116,104,101,32,106,111,98,32,105,116, + 115,101,108,102,46,10,10,32,32,32,32,32,32,32,32,122, + 25,60,109,111,100,117,108,101,32,123,33,114,125,32,40,110, + 97,109,101,115,112,97,99,101,41,62,78,41,2,114,70,0, + 0,0,114,130,0,0,0,41,1,114,223,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,109, + 111,100,117,108,101,95,114,101,112,114,200,4,0,0,115,4, + 0,0,0,12,7,255,128,122,28,95,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,0,0, + 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,78,84,114,7,0,0,0, 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,236,0,0,0,212,4,0,0,115,4,0, + 8,0,0,0,114,186,0,0,0,209,4,0,0,115,4,0, 0,0,4,1,255,128,122,27,95,78,97,109,101,115,112,97, - 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117, - 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,6,0,0,0,67,0,0,0,115,16,0,0, - 0,116,0,100,1,100,2,100,3,100,4,100,5,141,4,83, - 0,41,6,78,114,10,0,0,0,122,8,60,115,116,114,105, - 110,103,62,114,222,0,0,0,84,41,1,114,238,0,0,0, - 41,1,114,239,0,0,0,114,226,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,220,0,0,0, - 215,4,0,0,115,4,0,0,0,16,1,255,128,122,25,95, - 78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,114,217,0,0,0,114, - 7,0,0,0,114,218,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,219,0,0,0,218,4,0, - 0,115,4,0,0,0,4,0,255,128,122,30,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, - 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, + 99,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,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,78,114,10,0,0,0,114,7,0, + 0,0,114,226,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,236,0,0,0,212,4,0,0,115, + 4,0,0,0,4,1,255,128,122,27,95,78,97,109,101,115, + 112,97,99,101,76,111,97,100,101,114,46,103,101,116,95,115, + 111,117,114,99,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,6,0,0,0,67,0,0,0,115,16, + 0,0,0,116,0,100,1,100,2,100,3,100,4,100,5,141, + 4,83,0,41,6,78,114,10,0,0,0,122,8,60,115,116, + 114,105,110,103,62,114,222,0,0,0,84,41,1,114,238,0, + 0,0,41,1,114,239,0,0,0,114,226,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,220,0, + 0,0,215,4,0,0,115,4,0,0,0,16,1,255,128,122, + 25,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,0,83,0,114,114,0,0, - 0,114,7,0,0,0,114,13,1,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,224,0,0,0,221, - 4,0,0,115,4,0,0,0,4,1,255,128,122,28,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, - 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, - 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, - 83,0,41,3,122,98,76,111,97,100,32,97,32,110,97,109, - 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, - 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, - 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, - 78,41,4,114,139,0,0,0,114,153,0,0,0,114,20,1, - 0,0,114,225,0,0,0,114,226,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,227,0,0,0, - 224,4,0,0,115,10,0,0,0,6,7,4,1,4,255,12, - 3,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0,114,131, - 0,0,0,114,216,0,0,0,114,213,0,0,0,114,41,1, - 0,0,114,186,0,0,0,114,236,0,0,0,114,220,0,0, - 0,114,219,0,0,0,114,224,0,0,0,114,227,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,40,1,0,0,196,4,0,0,115,22,0, - 0,0,8,0,8,1,2,3,10,1,8,8,8,3,8,3, - 8,3,8,3,12,3,255,128,114,40,1,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,64,0,0,0,115,118,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,101,4,100,2,100,3,132,0,131, - 1,90,5,101,4,100,4,100,5,132,0,131,1,90,6,101, - 7,100,6,100,7,132,0,131,1,90,8,101,7,100,8,100, - 9,132,0,131,1,90,9,101,7,100,19,100,11,100,12,132, - 1,131,1,90,10,101,7,100,20,100,13,100,14,132,1,131, - 1,90,11,101,7,100,21,100,15,100,16,132,1,131,1,90, - 12,101,4,100,17,100,18,132,0,131,1,90,13,100,10,83, - 0,41,22,218,10,80,97,116,104,70,105,110,100,101,114,122, - 62,77,101,116,97,32,112,97,116,104,32,102,105,110,100,101, - 114,32,102,111,114,32,115,121,115,46,112,97,116,104,32,97, - 110,100,32,112,97,99,107,97,103,101,32,95,95,112,97,116, - 104,95,95,32,97,116,116,114,105,98,117,116,101,115,46,99, - 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,116, - 1,106,2,160,3,161,0,131,1,68,0,93,44,92,2,125, - 0,125,1,124,1,100,1,117,0,114,40,116,1,106,2,124, - 0,61,0,113,14,116,4,124,1,100,2,131,2,114,14,124, - 1,160,5,161,0,1,0,113,14,100,1,83,0,41,3,122, - 125,67,97,108,108,32,116,104,101,32,105,110,118,97,108,105, - 100,97,116,101,95,99,97,99,104,101,115,40,41,32,109,101, - 116,104,111,100,32,111,110,32,97,108,108,32,112,97,116,104, - 32,101,110,116,114,121,32,102,105,110,100,101,114,115,10,32, - 32,32,32,32,32,32,32,115,116,111,114,101,100,32,105,110, - 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, - 101,114,95,99,97,99,104,101,115,32,40,119,104,101,114,101, - 32,105,109,112,108,101,109,101,110,116,101,100,41,46,78,218, - 17,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104, - 101,115,41,6,218,4,108,105,115,116,114,15,0,0,0,218, - 19,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,218,5,105,116,101,109,115,114,133,0,0,0, - 114,43,1,0,0,41,2,114,121,0,0,0,218,6,102,105, - 110,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,43,1,0,0,243,4,0,0,115,14,0,0, - 0,22,4,8,1,10,1,10,1,10,1,4,252,255,128,122, - 28,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,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,9,0, - 0,0,67,0,0,0,115,76,0,0,0,116,0,106,1,100, - 1,117,1,114,28,116,0,106,1,115,28,116,2,160,3,100, - 2,116,4,161,2,1,0,116,0,106,1,68,0,93,36,125, - 1,122,14,124,1,124,0,131,1,87,0,2,0,1,0,83, - 0,4,0,116,5,121,70,1,0,1,0,1,0,89,0,113, - 34,48,0,100,1,83,0,41,3,122,46,83,101,97,114,99, - 104,32,115,121,115,46,112,97,116,104,95,104,111,111,107,115, - 32,102,111,114,32,97,32,102,105,110,100,101,114,32,102,111, - 114,32,39,112,97,116,104,39,46,78,122,23,115,121,115,46, - 112,97,116,104,95,104,111,111,107,115,32,105,115,32,101,109, - 112,116,121,41,6,114,15,0,0,0,218,10,112,97,116,104, - 95,104,111,111,107,115,114,81,0,0,0,114,82,0,0,0, - 114,142,0,0,0,114,122,0,0,0,41,2,114,52,0,0, - 0,90,4,104,111,111,107,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,11,95,112,97,116,104,95,104,111, - 111,107,115,253,4,0,0,115,18,0,0,0,16,3,12,1, - 10,1,2,1,14,1,12,1,6,1,4,2,255,128,122,22, - 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,0, - 0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,115, - 100,0,0,0,124,1,100,1,107,2,114,42,122,12,116,0, - 160,1,161,0,125,1,87,0,110,20,4,0,116,2,121,40, - 1,0,1,0,1,0,89,0,100,2,83,0,48,0,122,16, - 116,3,106,4,124,1,25,0,125,2,87,0,124,2,83,0, - 4,0,116,5,121,98,1,0,1,0,1,0,124,0,160,6, - 124,1,161,1,125,2,124,2,116,3,106,4,124,1,60,0, - 89,0,124,2,83,0,48,0,41,3,122,210,71,101,116,32, - 116,104,101,32,102,105,110,100,101,114,32,102,111,114,32,116, - 104,101,32,112,97,116,104,32,101,110,116,114,121,32,102,114, - 111,109,32,115,121,115,46,112,97,116,104,95,105,109,112,111, - 114,116,101,114,95,99,97,99,104,101,46,10,10,32,32,32, - 32,32,32,32,32,73,102,32,116,104,101,32,112,97,116,104, - 32,101,110,116,114,121,32,105,115,32,110,111,116,32,105,110, - 32,116,104,101,32,99,97,99,104,101,44,32,102,105,110,100, - 32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101, - 32,102,105,110,100,101,114,10,32,32,32,32,32,32,32,32, - 97,110,100,32,99,97,99,104,101,32,105,116,46,32,73,102, - 32,110,111,32,102,105,110,100,101,114,32,105,115,32,97,118, - 97,105,108,97,98,108,101,44,32,115,116,111,114,101,32,78, - 111,110,101,46,10,10,32,32,32,32,32,32,32,32,114,10, - 0,0,0,78,41,7,114,18,0,0,0,114,63,0,0,0, - 218,17,70,105,108,101,78,111,116,70,111,117,110,100,69,114, - 114,111,114,114,15,0,0,0,114,45,1,0,0,218,8,75, - 101,121,69,114,114,111,114,114,49,1,0,0,41,3,114,202, - 0,0,0,114,52,0,0,0,114,47,1,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,20,95,112, - 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, - 104,101,10,5,0,0,115,28,0,0,0,8,8,2,1,12, - 1,12,1,8,3,2,1,12,1,4,4,12,253,10,1,12, - 1,4,1,2,255,255,128,122,31,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,99,97,99,104,101,99,3,0,0,0,0,0,0, - 0,0,0,0,0,6,0,0,0,4,0,0,0,67,0,0, - 0,115,82,0,0,0,116,0,124,2,100,1,131,2,114,26, - 124,2,160,1,124,1,161,1,92,2,125,3,125,4,110,14, - 124,2,160,2,124,1,161,1,125,3,103,0,125,4,124,3, - 100,0,117,1,114,60,116,3,160,4,124,1,124,3,161,2, - 83,0,116,3,160,5,124,1,100,0,161,2,125,5,124,4, - 124,5,95,6,124,5,83,0,41,2,78,114,141,0,0,0, - 41,7,114,133,0,0,0,114,141,0,0,0,114,210,0,0, - 0,114,139,0,0,0,114,205,0,0,0,114,187,0,0,0, - 114,182,0,0,0,41,6,114,202,0,0,0,114,143,0,0, - 0,114,47,1,0,0,114,144,0,0,0,114,145,0,0,0, - 114,191,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,16,95,108,101,103,97,99,121,95,103,101, - 116,95,115,112,101,99,32,5,0,0,115,20,0,0,0,10, - 4,16,1,10,2,4,1,8,1,12,1,12,1,6,1,4, - 1,255,128,122,27,80,97,116,104,70,105,110,100,101,114,46, - 95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99, - 78,99,4,0,0,0,0,0,0,0,0,0,0,0,9,0, - 0,0,5,0,0,0,67,0,0,0,115,166,0,0,0,103, - 0,125,4,124,2,68,0,93,134,125,5,116,0,124,5,116, - 1,116,2,102,2,131,2,115,28,113,8,124,0,160,3,124, - 5,161,1,125,6,124,6,100,1,117,1,114,8,116,4,124, - 6,100,2,131,2,114,70,124,6,160,5,124,1,124,3,161, - 2,125,7,110,12,124,0,160,6,124,1,124,6,161,2,125, - 7,124,7,100,1,117,0,114,92,113,8,124,7,106,7,100, - 1,117,1,114,110,124,7,2,0,1,0,83,0,124,7,106, - 8,125,8,124,8,100,1,117,0,114,132,116,9,100,3,131, - 1,130,1,124,4,160,10,124,8,161,1,1,0,113,8,116, - 11,160,12,124,1,100,1,161,2,125,7,124,4,124,7,95, - 8,124,7,83,0,41,4,122,63,70,105,110,100,32,116,104, - 101,32,108,111,97,100,101,114,32,111,114,32,110,97,109,101, - 115,112,97,99,101,95,112,97,116,104,32,102,111,114,32,116, - 104,105,115,32,109,111,100,117,108,101,47,112,97,99,107,97, - 103,101,32,110,97,109,101,46,78,114,207,0,0,0,122,19, - 115,112,101,99,32,109,105,115,115,105,110,103,32,108,111,97, - 100,101,114,41,13,114,165,0,0,0,114,90,0,0,0,218, - 5,98,121,116,101,115,114,52,1,0,0,114,133,0,0,0, - 114,207,0,0,0,114,53,1,0,0,114,144,0,0,0,114, - 182,0,0,0,114,122,0,0,0,114,171,0,0,0,114,139, - 0,0,0,114,187,0,0,0,41,9,114,202,0,0,0,114, - 143,0,0,0,114,52,0,0,0,114,206,0,0,0,218,14, - 110,97,109,101,115,112,97,99,101,95,112,97,116,104,90,5, - 101,110,116,114,121,114,47,1,0,0,114,191,0,0,0,114, - 145,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,9,95,103,101,116,95,115,112,101,99,47,5, - 0,0,115,42,0,0,0,4,5,8,1,14,1,2,1,10, - 1,8,1,10,1,14,1,12,2,8,1,2,1,10,1,8, - 1,6,1,8,1,8,1,12,5,12,2,6,1,4,1,255, - 128,122,20,80,97,116,104,70,105,110,100,101,114,46,95,103, - 101,116,95,115,112,101,99,99,4,0,0,0,0,0,0,0, - 0,0,0,0,6,0,0,0,5,0,0,0,67,0,0,0, - 115,94,0,0,0,124,2,100,1,117,0,114,14,116,0,106, - 1,125,2,124,0,160,2,124,1,124,2,124,3,161,3,125, - 4,124,4,100,1,117,0,114,40,100,1,83,0,124,4,106, - 3,100,1,117,0,114,90,124,4,106,4,125,5,124,5,114, - 86,100,1,124,4,95,5,116,6,124,1,124,5,124,0,106, - 2,131,3,124,4,95,4,124,4,83,0,100,1,83,0,124, - 4,83,0,41,2,122,141,84,114,121,32,116,111,32,102,105, - 110,100,32,97,32,115,112,101,99,32,102,111,114,32,39,102, - 117,108,108,110,97,109,101,39,32,111,110,32,115,121,115,46, - 112,97,116,104,32,111,114,32,39,112,97,116,104,39,46,10, - 10,32,32,32,32,32,32,32,32,84,104,101,32,115,101,97, - 114,99,104,32,105,115,32,98,97,115,101,100,32,111,110,32, - 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,97, - 110,100,32,115,121,115,46,112,97,116,104,95,105,109,112,111, - 114,116,101,114,95,99,97,99,104,101,46,10,32,32,32,32, - 32,32,32,32,78,41,7,114,15,0,0,0,114,52,0,0, - 0,114,56,1,0,0,114,144,0,0,0,114,182,0,0,0, - 114,185,0,0,0,114,18,1,0,0,41,6,114,202,0,0, - 0,114,143,0,0,0,114,52,0,0,0,114,206,0,0,0, - 114,191,0,0,0,114,55,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,207,0,0,0,79,5, - 0,0,115,28,0,0,0,8,6,6,1,14,1,8,1,4, - 1,10,1,6,1,4,1,6,3,16,1,4,1,4,2,4, - 2,255,128,122,20,80,97,116,104,70,105,110,100,101,114,46, - 102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, - 0,0,115,30,0,0,0,124,0,160,0,124,1,124,2,161, - 2,125,3,124,3,100,1,117,0,114,24,100,1,83,0,124, - 3,106,1,83,0,41,2,122,170,102,105,110,100,32,116,104, - 101,32,109,111,100,117,108,101,32,111,110,32,115,121,115,46, - 112,97,116,104,32,111,114,32,39,112,97,116,104,39,32,98, - 97,115,101,100,32,111,110,32,115,121,115,46,112,97,116,104, - 95,104,111,111,107,115,32,97,110,100,10,32,32,32,32,32, - 32,32,32,115,121,115,46,112,97,116,104,95,105,109,112,111, - 114,116,101,114,95,99,97,99,104,101,46,10,10,32,32,32, + 0,0,0,115,4,0,0,0,100,1,83,0,114,217,0,0, + 0,114,7,0,0,0,114,218,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,219,0,0,0,218, + 4,0,0,115,4,0,0,0,4,0,255,128,122,30,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,99, + 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,114, + 0,0,0,114,7,0,0,0,114,13,1,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,224,0,0, + 0,221,4,0,0,115,4,0,0,0,4,1,255,128,122,28, + 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, + 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,67,0,0,0,115,26,0,0,0,116,0,160,1,100,1, + 124,0,106,2,161,2,1,0,116,0,160,3,124,0,124,1, + 161,2,83,0,41,3,122,98,76,111,97,100,32,97,32,110, + 97,109,101,115,112,97,99,101,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,109, + 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,32,32,32,32,122,38,110,97,109,101, + 115,112,97,99,101,32,109,111,100,117,108,101,32,108,111,97, + 100,101,100,32,119,105,116,104,32,112,97,116,104,32,123,33, + 114,125,78,41,4,114,139,0,0,0,114,153,0,0,0,114, + 20,1,0,0,114,225,0,0,0,114,226,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,227,0, + 0,0,224,4,0,0,115,10,0,0,0,6,7,4,1,4, + 255,12,3,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0, + 114,131,0,0,0,114,216,0,0,0,114,213,0,0,0,114, + 41,1,0,0,114,186,0,0,0,114,236,0,0,0,114,220, + 0,0,0,114,219,0,0,0,114,224,0,0,0,114,227,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,40,1,0,0,196,4,0,0,115, + 22,0,0,0,8,0,8,1,2,3,10,1,8,8,8,3, + 8,3,8,3,8,3,12,3,255,128,114,40,1,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,64,0,0,0,115,118,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,101,4,100,2,100,3,132, + 0,131,1,90,5,101,4,100,4,100,5,132,0,131,1,90, + 6,101,7,100,6,100,7,132,0,131,1,90,8,101,7,100, + 8,100,9,132,0,131,1,90,9,101,7,100,19,100,11,100, + 12,132,1,131,1,90,10,101,7,100,20,100,13,100,14,132, + 1,131,1,90,11,101,7,100,21,100,15,100,16,132,1,131, + 1,90,12,101,4,100,17,100,18,132,0,131,1,90,13,100, + 10,83,0,41,22,218,10,80,97,116,104,70,105,110,100,101, + 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, + 100,101,114,32,102,111,114,32,115,121,115,46,112,97,116,104, + 32,97,110,100,32,112,97,99,107,97,103,101,32,95,95,112, + 97,116,104,95,95,32,97,116,116,114,105,98,117,116,101,115, + 46,99,0,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116, + 0,116,1,106,2,160,3,161,0,131,1,68,0,93,44,92, + 2,125,0,125,1,124,1,100,1,117,0,114,40,116,1,106, + 2,124,0,61,0,113,14,116,4,124,1,100,2,131,2,114, + 14,124,1,160,5,161,0,1,0,113,14,100,1,83,0,41, + 3,122,125,67,97,108,108,32,116,104,101,32,105,110,118,97, + 108,105,100,97,116,101,95,99,97,99,104,101,115,40,41,32, + 109,101,116,104,111,100,32,111,110,32,97,108,108,32,112,97, + 116,104,32,101,110,116,114,121,32,102,105,110,100,101,114,115, + 10,32,32,32,32,32,32,32,32,115,116,111,114,101,100,32, + 105,110,32,115,121,115,46,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,115,32,40,119,104,101, + 114,101,32,105,109,112,108,101,109,101,110,116,101,100,41,46, + 78,218,17,105,110,118,97,108,105,100,97,116,101,95,99,97, + 99,104,101,115,41,6,218,4,108,105,115,116,114,15,0,0, + 0,218,19,112,97,116,104,95,105,109,112,111,114,116,101,114, + 95,99,97,99,104,101,218,5,105,116,101,109,115,114,133,0, + 0,0,114,43,1,0,0,41,2,114,121,0,0,0,218,6, + 102,105,110,100,101,114,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,43,1,0,0,243,4,0,0,115,16, + 0,0,0,22,4,8,1,10,1,10,1,8,1,2,128,4, + 252,255,128,122,28,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,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,9,0,0,0,67,0,0,0,115,76,0,0,0,116, + 0,106,1,100,1,117,1,114,28,116,0,106,1,115,28,116, + 2,160,3,100,2,116,4,161,2,1,0,116,0,106,1,68, + 0,93,36,125,1,122,14,124,1,124,0,131,1,87,0,2, + 0,1,0,83,0,4,0,116,5,121,70,1,0,1,0,1, + 0,89,0,113,34,48,0,100,1,83,0,41,3,122,46,83, + 101,97,114,99,104,32,115,121,115,46,112,97,116,104,95,104, + 111,111,107,115,32,102,111,114,32,97,32,102,105,110,100,101, + 114,32,102,111,114,32,39,112,97,116,104,39,46,78,122,23, + 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,105, + 115,32,101,109,112,116,121,41,6,114,15,0,0,0,218,10, + 112,97,116,104,95,104,111,111,107,115,114,81,0,0,0,114, + 82,0,0,0,114,142,0,0,0,114,122,0,0,0,41,2, + 114,52,0,0,0,90,4,104,111,111,107,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,11,95,112,97,116, + 104,95,104,111,111,107,115,253,4,0,0,115,18,0,0,0, + 16,3,12,1,10,1,2,1,14,1,12,1,6,1,4,2, + 255,128,122,22,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,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,100,0,0,0,124,1,100,1,107,2,114,42, + 122,12,116,0,160,1,161,0,125,1,87,0,110,20,4,0, + 116,2,121,40,1,0,1,0,1,0,89,0,100,2,83,0, + 48,0,122,16,116,3,106,4,124,1,25,0,125,2,87,0, + 124,2,83,0,4,0,116,5,121,98,1,0,1,0,1,0, + 124,0,160,6,124,1,161,1,125,2,124,2,116,3,106,4, + 124,1,60,0,89,0,124,2,83,0,48,0,41,3,122,210, + 71,101,116,32,116,104,101,32,102,105,110,100,101,114,32,102, + 111,114,32,116,104,101,32,112,97,116,104,32,101,110,116,114, + 121,32,102,114,111,109,32,115,121,115,46,112,97,116,104,95, + 105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,10, + 10,32,32,32,32,32,32,32,32,73,102,32,116,104,101,32, + 112,97,116,104,32,101,110,116,114,121,32,105,115,32,110,111, + 116,32,105,110,32,116,104,101,32,99,97,99,104,101,44,32, + 102,105,110,100,32,116,104,101,32,97,112,112,114,111,112,114, + 105,97,116,101,32,102,105,110,100,101,114,10,32,32,32,32, + 32,32,32,32,97,110,100,32,99,97,99,104,101,32,105,116, + 46,32,73,102,32,110,111,32,102,105,110,100,101,114,32,105, + 115,32,97,118,97,105,108,97,98,108,101,44,32,115,116,111, + 114,101,32,78,111,110,101,46,10,10,32,32,32,32,32,32, + 32,32,114,10,0,0,0,78,41,7,114,18,0,0,0,114, + 63,0,0,0,218,17,70,105,108,101,78,111,116,70,111,117, + 110,100,69,114,114,111,114,114,15,0,0,0,114,45,1,0, + 0,218,8,75,101,121,69,114,114,111,114,114,49,1,0,0, + 41,3,114,202,0,0,0,114,52,0,0,0,114,47,1,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,20,95,112,97,116,104,95,105,109,112,111,114,116,101,114, + 95,99,97,99,104,101,10,5,0,0,115,28,0,0,0,8, + 8,2,1,12,1,12,1,8,3,2,1,12,1,4,4,12, + 253,10,1,12,1,4,1,2,255,255,128,122,31,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,99,97,99,104,101,99,3,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, + 0,67,0,0,0,115,82,0,0,0,116,0,124,2,100,1, + 131,2,114,26,124,2,160,1,124,1,161,1,92,2,125,3, + 125,4,110,14,124,2,160,2,124,1,161,1,125,3,103,0, + 125,4,124,3,100,0,117,1,114,60,116,3,160,4,124,1, + 124,3,161,2,83,0,116,3,160,5,124,1,100,0,161,2, + 125,5,124,4,124,5,95,6,124,5,83,0,41,2,78,114, + 141,0,0,0,41,7,114,133,0,0,0,114,141,0,0,0, + 114,210,0,0,0,114,139,0,0,0,114,205,0,0,0,114, + 187,0,0,0,114,182,0,0,0,41,6,114,202,0,0,0, + 114,143,0,0,0,114,47,1,0,0,114,144,0,0,0,114, + 145,0,0,0,114,191,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,16,95,108,101,103,97,99, + 121,95,103,101,116,95,115,112,101,99,32,5,0,0,115,20, + 0,0,0,10,4,16,1,10,2,4,1,8,1,12,1,12, + 1,6,1,4,1,255,128,122,27,80,97,116,104,70,105,110, + 100,101,114,46,95,108,101,103,97,99,121,95,103,101,116,95, + 115,112,101,99,78,99,4,0,0,0,0,0,0,0,0,0, + 0,0,9,0,0,0,5,0,0,0,67,0,0,0,115,166, + 0,0,0,103,0,125,4,124,2,68,0,93,134,125,5,116, + 0,124,5,116,1,116,2,102,2,131,2,115,28,113,8,124, + 0,160,3,124,5,161,1,125,6,124,6,100,1,117,1,114, + 8,116,4,124,6,100,2,131,2,114,70,124,6,160,5,124, + 1,124,3,161,2,125,7,110,12,124,0,160,6,124,1,124, + 6,161,2,125,7,124,7,100,1,117,0,114,92,113,8,124, + 7,106,7,100,1,117,1,114,110,124,7,2,0,1,0,83, + 0,124,7,106,8,125,8,124,8,100,1,117,0,114,132,116, + 9,100,3,131,1,130,1,124,4,160,10,124,8,161,1,1, + 0,113,8,116,11,160,12,124,1,100,1,161,2,125,7,124, + 4,124,7,95,8,124,7,83,0,41,4,122,63,70,105,110, + 100,32,116,104,101,32,108,111,97,100,101,114,32,111,114,32, + 110,97,109,101,115,112,97,99,101,95,112,97,116,104,32,102, + 111,114,32,116,104,105,115,32,109,111,100,117,108,101,47,112, + 97,99,107,97,103,101,32,110,97,109,101,46,78,114,207,0, + 0,0,122,19,115,112,101,99,32,109,105,115,115,105,110,103, + 32,108,111,97,100,101,114,41,13,114,165,0,0,0,114,90, + 0,0,0,218,5,98,121,116,101,115,114,52,1,0,0,114, + 133,0,0,0,114,207,0,0,0,114,53,1,0,0,114,144, + 0,0,0,114,182,0,0,0,114,122,0,0,0,114,171,0, + 0,0,114,139,0,0,0,114,187,0,0,0,41,9,114,202, + 0,0,0,114,143,0,0,0,114,52,0,0,0,114,206,0, + 0,0,218,14,110,97,109,101,115,112,97,99,101,95,112,97, + 116,104,90,5,101,110,116,114,121,114,47,1,0,0,114,191, + 0,0,0,114,145,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,9,95,103,101,116,95,115,112, + 101,99,47,5,0,0,115,44,0,0,0,4,5,8,1,14, + 1,2,1,10,1,8,1,10,1,14,1,12,2,8,1,2, + 1,10,1,8,1,6,1,8,1,8,1,10,5,2,128,12, + 2,6,1,4,1,255,128,122,20,80,97,116,104,70,105,110, + 100,101,114,46,95,103,101,116,95,115,112,101,99,99,4,0, + 0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0, + 0,0,67,0,0,0,115,94,0,0,0,124,2,100,1,117, + 0,114,14,116,0,106,1,125,2,124,0,160,2,124,1,124, + 2,124,3,161,3,125,4,124,4,100,1,117,0,114,40,100, + 1,83,0,124,4,106,3,100,1,117,0,114,90,124,4,106, + 4,125,5,124,5,114,86,100,1,124,4,95,5,116,6,124, + 1,124,5,124,0,106,2,131,3,124,4,95,4,124,4,83, + 0,100,1,83,0,124,4,83,0,41,2,122,141,84,114,121, + 32,116,111,32,102,105,110,100,32,97,32,115,112,101,99,32, + 102,111,114,32,39,102,117,108,108,110,97,109,101,39,32,111, + 110,32,115,121,115,46,112,97,116,104,32,111,114,32,39,112, + 97,116,104,39,46,10,10,32,32,32,32,32,32,32,32,84, + 104,101,32,115,101,97,114,99,104,32,105,115,32,98,97,115, + 101,100,32,111,110,32,115,121,115,46,112,97,116,104,95,104, + 111,111,107,115,32,97,110,100,32,115,121,115,46,112,97,116, + 104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,101, + 46,10,32,32,32,32,32,32,32,32,78,41,7,114,15,0, + 0,0,114,52,0,0,0,114,56,1,0,0,114,144,0,0, + 0,114,182,0,0,0,114,185,0,0,0,114,18,1,0,0, + 41,6,114,202,0,0,0,114,143,0,0,0,114,52,0,0, + 0,114,206,0,0,0,114,191,0,0,0,114,55,1,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 207,0,0,0,79,5,0,0,115,28,0,0,0,8,6,6, + 1,14,1,8,1,4,1,10,1,6,1,4,1,6,3,16, + 1,4,1,4,2,4,2,255,128,122,20,80,97,116,104,70, + 105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,99, + 3,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 4,0,0,0,67,0,0,0,115,30,0,0,0,124,0,160, + 0,124,1,124,2,161,2,125,3,124,3,100,1,117,0,114, + 24,100,1,83,0,124,3,106,1,83,0,41,2,122,170,102, + 105,110,100,32,116,104,101,32,109,111,100,117,108,101,32,111, + 110,32,115,121,115,46,112,97,116,104,32,111,114,32,39,112, + 97,116,104,39,32,98,97,115,101,100,32,111,110,32,115,121, + 115,46,112,97,116,104,95,104,111,111,107,115,32,97,110,100, + 10,32,32,32,32,32,32,32,32,115,121,115,46,112,97,116, + 104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,101, + 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,102,105,110,100,95, + 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, + 10,32,32,32,32,32,32,32,32,78,114,208,0,0,0,114, + 209,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,210,0,0,0,103,5,0,0,115,10,0,0, + 0,12,8,8,1,4,1,6,1,255,128,122,22,80,97,116, + 104,70,105,110,100,101,114,46,102,105,110,100,95,109,111,100, + 117,108,101,99,0,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,4,0,0,0,79,0,0,0,115,28,0,0, + 0,100,1,100,2,108,0,109,1,125,2,1,0,124,2,106, + 2,124,0,105,0,124,1,164,1,142,1,83,0,41,4,97, + 32,1,0,0,10,32,32,32,32,32,32,32,32,70,105,110, + 100,32,100,105,115,116,114,105,98,117,116,105,111,110,115,46, + 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, + 32,97,110,32,105,116,101,114,97,98,108,101,32,111,102,32, + 97,108,108,32,68,105,115,116,114,105,98,117,116,105,111,110, + 32,105,110,115,116,97,110,99,101,115,32,99,97,112,97,98, + 108,101,32,111,102,10,32,32,32,32,32,32,32,32,108,111, + 97,100,105,110,103,32,116,104,101,32,109,101,116,97,100,97, + 116,97,32,102,111,114,32,112,97,99,107,97,103,101,115,32, + 109,97,116,99,104,105,110,103,32,96,96,99,111,110,116,101, + 120,116,46,110,97,109,101,96,96,10,32,32,32,32,32,32, + 32,32,40,111,114,32,97,108,108,32,110,97,109,101,115,32, + 105,102,32,96,96,78,111,110,101,96,96,32,105,110,100,105, + 99,97,116,101,100,41,32,97,108,111,110,103,32,116,104,101, + 32,112,97,116,104,115,32,105,110,32,116,104,101,32,108,105, + 115,116,10,32,32,32,32,32,32,32,32,111,102,32,100,105, + 114,101,99,116,111,114,105,101,115,32,96,96,99,111,110,116, + 101,120,116,46,112,97,116,104,96,96,46,10,32,32,32,32, + 32,32,32,32,114,0,0,0,0,41,1,218,18,77,101,116, + 97,100,97,116,97,80,97,116,104,70,105,110,100,101,114,78, + 41,3,90,18,105,109,112,111,114,116,108,105,98,46,109,101, + 116,97,100,97,116,97,114,57,1,0,0,218,18,102,105,110, + 100,95,100,105,115,116,114,105,98,117,116,105,111,110,115,41, + 3,114,124,0,0,0,114,125,0,0,0,114,57,1,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 58,1,0,0,116,5,0,0,115,6,0,0,0,12,10,16, + 1,255,128,122,29,80,97,116,104,70,105,110,100,101,114,46, + 102,105,110,100,95,100,105,115,116,114,105,98,117,116,105,111, + 110,115,41,1,78,41,2,78,78,41,1,78,41,14,114,130, + 0,0,0,114,129,0,0,0,114,131,0,0,0,114,132,0, + 0,0,114,213,0,0,0,114,43,1,0,0,114,49,1,0, + 0,114,214,0,0,0,114,52,1,0,0,114,53,1,0,0, + 114,56,1,0,0,114,207,0,0,0,114,210,0,0,0,114, + 58,1,0,0,114,7,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,42,1,0,0,239,4,0, + 0,115,38,0,0,0,8,0,4,2,2,2,10,1,2,9, + 10,1,2,12,10,1,2,21,10,1,2,14,12,1,2,31, + 12,1,2,23,12,1,2,12,14,1,255,128,114,42,1,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,64,0,0,0,115,90,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, + 0,90,4,100,4,100,5,132,0,90,5,101,6,90,7,100, + 6,100,7,132,0,90,8,100,8,100,9,132,0,90,9,100, + 19,100,11,100,12,132,1,90,10,100,13,100,14,132,0,90, + 11,101,12,100,15,100,16,132,0,131,1,90,13,100,17,100, + 18,132,0,90,14,100,10,83,0,41,20,218,10,70,105,108, + 101,70,105,110,100,101,114,122,172,70,105,108,101,45,98,97, + 115,101,100,32,102,105,110,100,101,114,46,10,10,32,32,32, + 32,73,110,116,101,114,97,99,116,105,111,110,115,32,119,105, + 116,104,32,116,104,101,32,102,105,108,101,32,115,121,115,116, + 101,109,32,97,114,101,32,99,97,99,104,101,100,32,102,111, + 114,32,112,101,114,102,111,114,109,97,110,99,101,44,32,98, + 101,105,110,103,10,32,32,32,32,114,101,102,114,101,115,104, + 101,100,32,119,104,101,110,32,116,104,101,32,100,105,114,101, + 99,116,111,114,121,32,116,104,101,32,102,105,110,100,101,114, + 32,105,115,32,104,97,110,100,108,105,110,103,32,104,97,115, + 32,98,101,101,110,32,109,111,100,105,102,105,101,100,46,10, + 10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,6,0,0,0,7,0,0,0,115,84, + 0,0,0,103,0,125,3,124,2,68,0,93,32,92,2,137, + 0,125,4,124,3,160,0,135,0,102,1,100,1,100,2,132, + 8,124,4,68,0,131,1,161,1,1,0,113,8,124,3,124, + 0,95,1,124,1,112,54,100,3,124,0,95,2,100,4,124, + 0,95,3,116,4,131,0,124,0,95,5,116,4,131,0,124, + 0,95,6,100,5,83,0,41,6,122,154,73,110,105,116,105, + 97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,112, + 97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,110, + 32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,32, + 110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,32, + 32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,97, + 105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,114, + 32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,117, + 102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,101, + 114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,110, + 105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,22, + 0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,86, + 0,1,0,113,2,100,0,83,0,114,114,0,0,0,114,7, + 0,0,0,114,14,1,0,0,169,1,114,144,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,9,0,0,0,145,5, + 0,0,115,4,0,0,0,22,0,255,128,122,38,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,114,79,0,0,0,114,109,0,0,0,78,41,7, + 114,171,0,0,0,218,8,95,108,111,97,100,101,114,115,114, + 52,0,0,0,218,11,95,112,97,116,104,95,109,116,105,109, + 101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,97, + 99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,97, + 116,104,95,99,97,99,104,101,41,5,114,123,0,0,0,114, + 52,0,0,0,218,14,108,111,97,100,101,114,95,100,101,116, + 97,105,108,115,90,7,108,111,97,100,101,114,115,114,193,0, + 0,0,114,7,0,0,0,114,60,1,0,0,114,8,0,0, + 0,114,216,0,0,0,139,5,0,0,115,18,0,0,0,4, + 4,12,1,26,1,6,1,10,2,6,1,8,1,12,1,255, + 128,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, + 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, + 10,0,0,0,100,1,124,0,95,0,100,2,83,0,41,3, + 122,31,73,110,118,97,108,105,100,97,116,101,32,116,104,101, + 32,100,105,114,101,99,116,111,114,121,32,109,116,105,109,101, + 46,114,109,0,0,0,78,41,1,114,62,1,0,0,114,253, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,43,1,0,0,153,5,0,0,115,4,0,0,0, + 10,2,255,128,122,28,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,0,0,0,0,0,0,0,0,3, + 0,0,0,3,0,0,0,67,0,0,0,115,42,0,0,0, + 124,0,160,0,124,1,161,1,125,2,124,2,100,1,117,0, + 114,26,100,1,103,0,102,2,83,0,124,2,106,1,124,2, + 106,2,112,38,103,0,102,2,83,0,41,2,122,197,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,44,32,111,114,32, + 116,104,101,32,110,97,109,101,115,112,97,99,101,10,32,32, + 32,32,32,32,32,32,112,97,99,107,97,103,101,32,112,111, + 114,116,105,111,110,115,46,32,82,101,116,117,114,110,115,32, + 40,108,111,97,100,101,114,44,32,108,105,115,116,45,111,102, + 45,112,111,114,116,105,111,110,115,41,46,10,10,32,32,32, 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, - 32,32,32,78,114,208,0,0,0,114,209,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,210,0, - 0,0,103,5,0,0,115,10,0,0,0,12,8,8,1,4, - 1,6,1,255,128,122,22,80,97,116,104,70,105,110,100,101, - 114,46,102,105,110,100,95,109,111,100,117,108,101,99,0,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,79,0,0,0,115,28,0,0,0,100,1,100,2,108, - 0,109,1,125,2,1,0,124,2,106,2,124,0,105,0,124, - 1,164,1,142,1,83,0,41,4,97,32,1,0,0,10,32, - 32,32,32,32,32,32,32,70,105,110,100,32,100,105,115,116, - 114,105,98,117,116,105,111,110,115,46,10,10,32,32,32,32, - 32,32,32,32,82,101,116,117,114,110,32,97,110,32,105,116, - 101,114,97,98,108,101,32,111,102,32,97,108,108,32,68,105, - 115,116,114,105,98,117,116,105,111,110,32,105,110,115,116,97, - 110,99,101,115,32,99,97,112,97,98,108,101,32,111,102,10, - 32,32,32,32,32,32,32,32,108,111,97,100,105,110,103,32, - 116,104,101,32,109,101,116,97,100,97,116,97,32,102,111,114, - 32,112,97,99,107,97,103,101,115,32,109,97,116,99,104,105, - 110,103,32,96,96,99,111,110,116,101,120,116,46,110,97,109, - 101,96,96,10,32,32,32,32,32,32,32,32,40,111,114,32, - 97,108,108,32,110,97,109,101,115,32,105,102,32,96,96,78, - 111,110,101,96,96,32,105,110,100,105,99,97,116,101,100,41, - 32,97,108,111,110,103,32,116,104,101,32,112,97,116,104,115, - 32,105,110,32,116,104,101,32,108,105,115,116,10,32,32,32, - 32,32,32,32,32,111,102,32,100,105,114,101,99,116,111,114, - 105,101,115,32,96,96,99,111,110,116,101,120,116,46,112,97, - 116,104,96,96,46,10,32,32,32,32,32,32,32,32,114,0, - 0,0,0,41,1,218,18,77,101,116,97,100,97,116,97,80, - 97,116,104,70,105,110,100,101,114,78,41,3,90,18,105,109, - 112,111,114,116,108,105,98,46,109,101,116,97,100,97,116,97, - 114,57,1,0,0,218,18,102,105,110,100,95,100,105,115,116, - 114,105,98,117,116,105,111,110,115,41,3,114,124,0,0,0, - 114,125,0,0,0,114,57,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,58,1,0,0,116,5, - 0,0,115,6,0,0,0,12,10,16,1,255,128,122,29,80, - 97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,100, - 105,115,116,114,105,98,117,116,105,111,110,115,41,1,78,41, - 2,78,78,41,1,78,41,14,114,130,0,0,0,114,129,0, - 0,0,114,131,0,0,0,114,132,0,0,0,114,213,0,0, - 0,114,43,1,0,0,114,49,1,0,0,114,214,0,0,0, - 114,52,1,0,0,114,53,1,0,0,114,56,1,0,0,114, - 207,0,0,0,114,210,0,0,0,114,58,1,0,0,114,7, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,42,1,0,0,239,4,0,0,115,38,0,0,0, - 8,0,4,2,2,2,10,1,2,9,10,1,2,12,10,1, - 2,21,10,1,2,14,12,1,2,31,12,1,2,23,12,1, - 2,12,14,1,255,128,114,42,1,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 64,0,0,0,115,90,0,0,0,101,0,90,1,100,0,90, - 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, - 5,132,0,90,5,101,6,90,7,100,6,100,7,132,0,90, - 8,100,8,100,9,132,0,90,9,100,19,100,11,100,12,132, - 1,90,10,100,13,100,14,132,0,90,11,101,12,100,15,100, - 16,132,0,131,1,90,13,100,17,100,18,132,0,90,14,100, - 10,83,0,41,20,218,10,70,105,108,101,70,105,110,100,101, - 114,122,172,70,105,108,101,45,98,97,115,101,100,32,102,105, - 110,100,101,114,46,10,10,32,32,32,32,73,110,116,101,114, - 97,99,116,105,111,110,115,32,119,105,116,104,32,116,104,101, - 32,102,105,108,101,32,115,121,115,116,101,109,32,97,114,101, - 32,99,97,99,104,101,100,32,102,111,114,32,112,101,114,102, - 111,114,109,97,110,99,101,44,32,98,101,105,110,103,10,32, - 32,32,32,114,101,102,114,101,115,104,101,100,32,119,104,101, - 110,32,116,104,101,32,100,105,114,101,99,116,111,114,121,32, - 116,104,101,32,102,105,110,100,101,114,32,105,115,32,104,97, - 110,100,108,105,110,103,32,104,97,115,32,98,101,101,110,32, - 109,111,100,105,102,105,101,100,46,10,10,32,32,32,32,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 6,0,0,0,7,0,0,0,115,84,0,0,0,103,0,125, - 3,124,2,68,0,93,32,92,2,137,0,125,4,124,3,160, - 0,135,0,102,1,100,1,100,2,132,8,124,4,68,0,131, - 1,161,1,1,0,113,8,124,3,124,0,95,1,124,1,112, - 54,100,3,124,0,95,2,100,4,124,0,95,3,116,4,131, - 0,124,0,95,5,116,4,131,0,124,0,95,6,100,5,83, - 0,41,6,122,154,73,110,105,116,105,97,108,105,122,101,32, - 119,105,116,104,32,116,104,101,32,112,97,116,104,32,116,111, - 32,115,101,97,114,99,104,32,111,110,32,97,110,100,32,97, - 32,118,97,114,105,97,98,108,101,32,110,117,109,98,101,114, - 32,111,102,10,32,32,32,32,32,32,32,32,50,45,116,117, - 112,108,101,115,32,99,111,110,116,97,105,110,105,110,103,32, - 116,104,101,32,108,111,97,100,101,114,32,97,110,100,32,116, - 104,101,32,102,105,108,101,32,115,117,102,102,105,120,101,115, - 32,116,104,101,32,108,111,97,100,101,114,10,32,32,32,32, - 32,32,32,32,114,101,99,111,103,110,105,122,101,115,46,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,51,0,0,0,115,22,0,0,0,124,0,93, - 14,125,1,124,1,136,0,102,2,86,0,1,0,113,2,100, - 0,83,0,114,114,0,0,0,114,7,0,0,0,114,14,1, - 0,0,169,1,114,144,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,9,0,0,0,145,5,0,0,115,4,0,0, - 0,22,0,255,128,122,38,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,114,79,0, - 0,0,114,109,0,0,0,78,41,7,114,171,0,0,0,218, - 8,95,108,111,97,100,101,114,115,114,52,0,0,0,218,11, - 95,112,97,116,104,95,109,116,105,109,101,218,3,115,101,116, - 218,11,95,112,97,116,104,95,99,97,99,104,101,218,19,95, - 114,101,108,97,120,101,100,95,112,97,116,104,95,99,97,99, - 104,101,41,5,114,123,0,0,0,114,52,0,0,0,218,14, - 108,111,97,100,101,114,95,100,101,116,97,105,108,115,90,7, - 108,111,97,100,101,114,115,114,193,0,0,0,114,7,0,0, - 0,114,60,1,0,0,114,8,0,0,0,114,216,0,0,0, - 139,5,0,0,115,18,0,0,0,4,4,12,1,26,1,6, - 1,10,2,6,1,8,1,12,1,255,128,122,19,70,105,108, - 101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,2,0,0,0,67,0,0,0,115,10,0,0,0,100,1, - 124,0,95,0,100,2,83,0,41,3,122,31,73,110,118,97, - 108,105,100,97,116,101,32,116,104,101,32,100,105,114,101,99, - 116,111,114,121,32,109,116,105,109,101,46,114,109,0,0,0, - 78,41,1,114,62,1,0,0,114,253,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,43,1,0, - 0,153,5,0,0,115,4,0,0,0,10,2,255,128,122,28, - 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,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, - 0,67,0,0,0,115,42,0,0,0,124,0,160,0,124,1, - 161,1,125,2,124,2,100,1,117,0,114,26,100,1,103,0, - 102,2,83,0,124,2,106,1,124,2,106,2,112,38,103,0, - 102,2,83,0,41,2,122,197,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,44,32,111,114,32,116,104,101,32,110,97, - 109,101,115,112,97,99,101,10,32,32,32,32,32,32,32,32, - 112,97,99,107,97,103,101,32,112,111,114,116,105,111,110,115, - 46,32,82,101,116,117,114,110,115,32,40,108,111,97,100,101, - 114,44,32,108,105,115,116,45,111,102,45,112,111,114,116,105, - 111,110,115,41,46,10,10,32,32,32,32,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, - 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,3, - 114,207,0,0,0,114,144,0,0,0,114,182,0,0,0,41, - 3,114,123,0,0,0,114,143,0,0,0,114,191,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 141,0,0,0,159,5,0,0,115,10,0,0,0,10,7,8, - 1,8,1,16,1,255,128,122,22,70,105,108,101,70,105,110, - 100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99, - 6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0, - 6,0,0,0,67,0,0,0,115,26,0,0,0,124,1,124, - 2,124,3,131,2,125,6,116,0,124,2,124,3,124,6,124, - 4,100,1,141,4,83,0,41,2,78,114,181,0,0,0,41, - 1,114,194,0,0,0,41,7,114,123,0,0,0,114,192,0, - 0,0,114,143,0,0,0,114,52,0,0,0,90,4,115,109, - 115,108,114,206,0,0,0,114,144,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,56,1,0,0, - 171,5,0,0,115,10,0,0,0,10,1,8,1,2,1,6, - 255,255,128,122,20,70,105,108,101,70,105,110,100,101,114,46, - 95,103,101,116,95,115,112,101,99,78,99,3,0,0,0,0, - 0,0,0,0,0,0,0,14,0,0,0,8,0,0,0,67, - 0,0,0,115,92,1,0,0,100,1,125,3,124,1,160,0, - 100,2,161,1,100,3,25,0,125,4,122,24,116,1,124,0, - 106,2,112,34,116,3,160,4,161,0,131,1,106,5,125,5, - 87,0,110,22,4,0,116,6,121,64,1,0,1,0,1,0, - 100,4,125,5,89,0,110,2,48,0,124,5,124,0,106,7, - 107,3,114,90,124,0,160,8,161,0,1,0,124,5,124,0, - 95,7,116,9,131,0,114,112,124,0,106,10,125,6,124,4, - 160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,4, - 125,7,124,7,124,6,118,0,114,214,116,13,124,0,106,2, - 124,4,131,2,125,8,124,0,106,14,68,0,93,56,92,2, - 125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,8, - 124,11,131,2,125,12,116,15,124,12,131,1,114,148,124,0, - 160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,5, - 2,0,1,0,83,0,116,17,124,8,131,1,125,3,124,0, - 106,14,68,0,93,80,92,2,125,9,125,10,116,13,124,0, - 106,2,124,4,124,9,23,0,131,2,125,12,116,18,106,19, - 100,6,124,12,100,3,100,7,141,3,1,0,124,7,124,9, - 23,0,124,6,118,0,114,220,116,15,124,12,131,1,114,220, - 124,0,160,16,124,10,124,1,124,12,100,8,124,2,161,5, - 2,0,1,0,83,0,124,3,144,1,114,88,116,18,160,19, - 100,9,124,8,161,2,1,0,116,18,160,20,124,1,100,8, - 161,2,125,13,124,8,103,1,124,13,95,21,124,13,83,0, - 100,8,83,0,41,10,122,111,84,114,121,32,116,111,32,102, - 105,110,100,32,97,32,115,112,101,99,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,46,10,10,32,32,32,32,32,32,32,32,82,101, - 116,117,114,110,115,32,116,104,101,32,109,97,116,99,104,105, - 110,103,32,115,112,101,99,44,32,111,114,32,78,111,110,101, - 32,105,102,32,110,111,116,32,102,111,117,110,100,46,10,32, - 32,32,32,32,32,32,32,70,114,79,0,0,0,114,39,0, - 0,0,114,109,0,0,0,114,216,0,0,0,122,9,116,114, - 121,105,110,103,32,123,125,41,1,90,9,118,101,114,98,111, - 115,105,116,121,78,122,25,112,111,115,115,105,98,108,101,32, - 110,97,109,101,115,112,97,99,101,32,102,111,114,32,123,125, - 41,22,114,49,0,0,0,114,57,0,0,0,114,52,0,0, - 0,114,18,0,0,0,114,63,0,0,0,114,7,1,0,0, - 114,58,0,0,0,114,62,1,0,0,218,11,95,102,105,108, - 108,95,99,97,99,104,101,114,21,0,0,0,114,65,1,0, - 0,114,110,0,0,0,114,64,1,0,0,114,48,0,0,0, - 114,61,1,0,0,114,62,0,0,0,114,56,1,0,0,114, - 64,0,0,0,114,139,0,0,0,114,153,0,0,0,114,187, - 0,0,0,114,182,0,0,0,41,14,114,123,0,0,0,114, - 143,0,0,0,114,206,0,0,0,90,12,105,115,95,110,97, - 109,101,115,112,97,99,101,90,11,116,97,105,108,95,109,111, - 100,117,108,101,114,173,0,0,0,90,5,99,97,99,104,101, - 90,12,99,97,99,104,101,95,109,111,100,117,108,101,90,9, - 98,97,115,101,95,112,97,116,104,114,15,1,0,0,114,192, - 0,0,0,90,13,105,110,105,116,95,102,105,108,101,110,97, - 109,101,90,9,102,117,108,108,95,112,97,116,104,114,191,0, + 32,32,32,78,41,3,114,207,0,0,0,114,144,0,0,0, + 114,182,0,0,0,41,3,114,123,0,0,0,114,143,0,0, + 0,114,191,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,141,0,0,0,159,5,0,0,115,10, + 0,0,0,10,7,8,1,8,1,16,1,255,128,122,22,70, + 105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,108, + 111,97,100,101,114,99,6,0,0,0,0,0,0,0,0,0, + 0,0,7,0,0,0,6,0,0,0,67,0,0,0,115,26, + 0,0,0,124,1,124,2,124,3,131,2,125,6,116,0,124, + 2,124,3,124,6,124,4,100,1,141,4,83,0,41,2,78, + 114,181,0,0,0,41,1,114,194,0,0,0,41,7,114,123, + 0,0,0,114,192,0,0,0,114,143,0,0,0,114,52,0, + 0,0,90,4,115,109,115,108,114,206,0,0,0,114,144,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,207,0,0,0,176,5,0,0,115,74,0,0,0,4, - 5,14,1,2,1,24,1,12,1,10,1,10,1,8,1,6, - 1,6,2,6,1,10,1,6,2,4,1,8,2,12,1,14, - 1,8,1,10,1,8,1,24,1,8,4,14,2,16,1,16, - 1,12,1,8,1,10,1,4,1,8,255,6,2,12,1,12, - 1,8,1,4,1,4,1,255,128,122,20,70,105,108,101,70, - 105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,99, - 1,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, - 10,0,0,0,67,0,0,0,115,192,0,0,0,124,0,106, - 0,125,1,122,22,116,1,160,2,124,1,112,22,116,1,160, - 3,161,0,161,1,125,2,87,0,110,28,4,0,116,4,116, - 5,116,6,102,3,121,56,1,0,1,0,1,0,103,0,125, - 2,89,0,110,2,48,0,116,7,106,8,160,9,100,1,161, - 1,115,82,116,10,124,2,131,1,124,0,95,11,110,74,116, - 10,131,0,125,3,124,2,68,0,93,56,125,4,124,4,160, - 12,100,2,161,1,92,3,125,5,125,6,125,7,124,6,114, - 134,100,3,160,13,124,5,124,7,160,14,161,0,161,2,125, - 8,110,4,124,5,125,8,124,3,160,15,124,8,161,1,1, - 0,113,92,124,3,124,0,95,11,116,7,106,8,160,9,116, - 16,161,1,114,188,100,4,100,5,132,0,124,2,68,0,131, - 1,124,0,95,17,100,6,83,0,100,6,83,0,41,7,122, - 68,70,105,108,108,32,116,104,101,32,99,97,99,104,101,32, - 111,102,32,112,111,116,101,110,116,105,97,108,32,109,111,100, - 117,108,101,115,32,97,110,100,32,112,97,99,107,97,103,101, - 115,32,102,111,114,32,116,104,105,115,32,100,105,114,101,99, - 116,111,114,121,46,114,14,0,0,0,114,79,0,0,0,114, - 69,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,4,0,0,0,83,0,0,0,115,20,0, - 0,0,104,0,124,0,93,12,125,1,124,1,160,0,161,0, - 146,2,113,4,83,0,114,7,0,0,0,41,1,114,110,0, - 0,0,41,2,114,5,0,0,0,90,2,102,110,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,13,0,0, - 0,253,5,0,0,115,4,0,0,0,20,0,255,128,122,41, - 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,115,101,116,99,111,109,112,62,78,41,18,114,52,0,0, - 0,114,18,0,0,0,90,7,108,105,115,116,100,105,114,114, - 63,0,0,0,114,50,1,0,0,218,15,80,101,114,109,105, - 115,115,105,111,110,69,114,114,111,114,218,18,78,111,116,65, - 68,105,114,101,99,116,111,114,121,69,114,114,111,114,114,15, - 0,0,0,114,22,0,0,0,114,23,0,0,0,114,63,1, - 0,0,114,64,1,0,0,114,105,0,0,0,114,70,0,0, - 0,114,110,0,0,0,218,3,97,100,100,114,24,0,0,0, - 114,65,1,0,0,41,9,114,123,0,0,0,114,52,0,0, - 0,90,8,99,111,110,116,101,110,116,115,90,21,108,111,119, - 101,114,95,115,117,102,102,105,120,95,99,111,110,116,101,110, - 116,115,114,38,1,0,0,114,121,0,0,0,114,25,1,0, - 0,114,15,1,0,0,90,8,110,101,119,95,110,97,109,101, + 0,114,56,1,0,0,171,5,0,0,115,10,0,0,0,10, + 1,8,1,2,1,6,255,255,128,122,20,70,105,108,101,70, + 105,110,100,101,114,46,95,103,101,116,95,115,112,101,99,78, + 99,3,0,0,0,0,0,0,0,0,0,0,0,14,0,0, + 0,8,0,0,0,67,0,0,0,115,92,1,0,0,100,1, + 125,3,124,1,160,0,100,2,161,1,100,3,25,0,125,4, + 122,24,116,1,124,0,106,2,112,34,116,3,160,4,161,0, + 131,1,106,5,125,5,87,0,110,22,4,0,116,6,121,64, + 1,0,1,0,1,0,100,4,125,5,89,0,110,2,48,0, + 124,5,124,0,106,7,107,3,114,90,124,0,160,8,161,0, + 1,0,124,5,124,0,95,7,116,9,131,0,114,112,124,0, + 106,10,125,6,124,4,160,11,161,0,125,7,110,10,124,0, + 106,12,125,6,124,4,125,7,124,7,124,6,118,0,114,214, + 116,13,124,0,106,2,124,4,131,2,125,8,124,0,106,14, + 68,0,93,56,92,2,125,9,125,10,100,5,124,9,23,0, + 125,11,116,13,124,8,124,11,131,2,125,12,116,15,124,12, + 131,1,114,148,124,0,160,16,124,10,124,1,124,12,124,8, + 103,1,124,2,161,5,2,0,1,0,83,0,116,17,124,8, + 131,1,125,3,124,0,106,14,68,0,93,80,92,2,125,9, + 125,10,116,13,124,0,106,2,124,4,124,9,23,0,131,2, + 125,12,116,18,106,19,100,6,124,12,100,3,100,7,141,3, + 1,0,124,7,124,9,23,0,124,6,118,0,114,220,116,15, + 124,12,131,1,114,220,124,0,160,16,124,10,124,1,124,12, + 100,8,124,2,161,5,2,0,1,0,83,0,124,3,144,1, + 114,88,116,18,160,19,100,9,124,8,161,2,1,0,116,18, + 160,20,124,1,100,8,161,2,125,13,124,8,103,1,124,13, + 95,21,124,13,83,0,100,8,83,0,41,10,122,111,84,114, + 121,32,116,111,32,102,105,110,100,32,97,32,115,112,101,99, + 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,46,10,10,32,32,32,32, + 32,32,32,32,82,101,116,117,114,110,115,32,116,104,101,32, + 109,97,116,99,104,105,110,103,32,115,112,101,99,44,32,111, + 114,32,78,111,110,101,32,105,102,32,110,111,116,32,102,111, + 117,110,100,46,10,32,32,32,32,32,32,32,32,70,114,79, + 0,0,0,114,39,0,0,0,114,109,0,0,0,114,216,0, + 0,0,122,9,116,114,121,105,110,103,32,123,125,41,1,90, + 9,118,101,114,98,111,115,105,116,121,78,122,25,112,111,115, + 115,105,98,108,101,32,110,97,109,101,115,112,97,99,101,32, + 102,111,114,32,123,125,41,22,114,49,0,0,0,114,57,0, + 0,0,114,52,0,0,0,114,18,0,0,0,114,63,0,0, + 0,114,7,1,0,0,114,58,0,0,0,114,62,1,0,0, + 218,11,95,102,105,108,108,95,99,97,99,104,101,114,21,0, + 0,0,114,65,1,0,0,114,110,0,0,0,114,64,1,0, + 0,114,48,0,0,0,114,61,1,0,0,114,62,0,0,0, + 114,56,1,0,0,114,64,0,0,0,114,139,0,0,0,114, + 153,0,0,0,114,187,0,0,0,114,182,0,0,0,41,14, + 114,123,0,0,0,114,143,0,0,0,114,206,0,0,0,90, + 12,105,115,95,110,97,109,101,115,112,97,99,101,90,11,116, + 97,105,108,95,109,111,100,117,108,101,114,173,0,0,0,90, + 5,99,97,99,104,101,90,12,99,97,99,104,101,95,109,111, + 100,117,108,101,90,9,98,97,115,101,95,112,97,116,104,114, + 15,1,0,0,114,192,0,0,0,90,13,105,110,105,116,95, + 102,105,108,101,110,97,109,101,90,9,102,117,108,108,95,112, + 97,116,104,114,191,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,207,0,0,0,176,5,0,0, + 115,74,0,0,0,4,5,14,1,2,1,24,1,12,1,10, + 1,10,1,8,1,6,1,6,2,6,1,10,1,6,2,4, + 1,8,2,12,1,14,1,8,1,10,1,8,1,24,1,8, + 4,14,2,16,1,16,1,12,1,8,1,10,1,4,1,8, + 255,6,2,12,1,12,1,8,1,4,1,4,1,255,128,122, + 20,70,105,108,101,70,105,110,100,101,114,46,102,105,110,100, + 95,115,112,101,99,99,1,0,0,0,0,0,0,0,0,0, + 0,0,9,0,0,0,10,0,0,0,67,0,0,0,115,192, + 0,0,0,124,0,106,0,125,1,122,22,116,1,160,2,124, + 1,112,22,116,1,160,3,161,0,161,1,125,2,87,0,110, + 28,4,0,116,4,116,5,116,6,102,3,121,56,1,0,1, + 0,1,0,103,0,125,2,89,0,110,2,48,0,116,7,106, + 8,160,9,100,1,161,1,115,82,116,10,124,2,131,1,124, + 0,95,11,110,74,116,10,131,0,125,3,124,2,68,0,93, + 56,125,4,124,4,160,12,100,2,161,1,92,3,125,5,125, + 6,125,7,124,6,114,134,100,3,160,13,124,5,124,7,160, + 14,161,0,161,2,125,8,110,4,124,5,125,8,124,3,160, + 15,124,8,161,1,1,0,113,92,124,3,124,0,95,11,116, + 7,106,8,160,9,116,16,161,1,114,188,100,4,100,5,132, + 0,124,2,68,0,131,1,124,0,95,17,100,6,83,0,100, + 6,83,0,41,7,122,68,70,105,108,108,32,116,104,101,32, + 99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,105, + 97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,112, + 97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,115, + 32,100,105,114,101,99,116,111,114,121,46,114,14,0,0,0, + 114,79,0,0,0,114,69,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,83, + 0,0,0,115,20,0,0,0,104,0,124,0,93,12,125,1, + 124,1,160,0,161,0,146,2,113,4,83,0,114,7,0,0, + 0,41,1,114,110,0,0,0,41,2,114,5,0,0,0,90, + 2,102,110,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,13,0,0,0,253,5,0,0,115,4,0,0,0, + 20,0,255,128,122,41,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,115,101,116,99,111,109,112,62,78, + 41,18,114,52,0,0,0,114,18,0,0,0,90,7,108,105, + 115,116,100,105,114,114,63,0,0,0,114,50,1,0,0,218, + 15,80,101,114,109,105,115,115,105,111,110,69,114,114,111,114, + 218,18,78,111,116,65,68,105,114,101,99,116,111,114,121,69, + 114,114,111,114,114,15,0,0,0,114,22,0,0,0,114,23, + 0,0,0,114,63,1,0,0,114,64,1,0,0,114,105,0, + 0,0,114,70,0,0,0,114,110,0,0,0,218,3,97,100, + 100,114,24,0,0,0,114,65,1,0,0,41,9,114,123,0, + 0,0,114,52,0,0,0,90,8,99,111,110,116,101,110,116, + 115,90,21,108,111,119,101,114,95,115,117,102,102,105,120,95, + 99,111,110,116,101,110,116,115,114,38,1,0,0,114,121,0, + 0,0,114,25,1,0,0,114,15,1,0,0,90,8,110,101, + 119,95,110,97,109,101,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,67,1,0,0,224,5,0,0,115,38, + 0,0,0,6,2,2,1,22,1,18,1,10,3,12,3,12, + 1,6,7,8,1,16,1,4,1,18,1,4,2,12,1,6, + 1,12,1,20,1,4,255,255,128,122,22,70,105,108,101,70, + 105,110,100,101,114,46,95,102,105,108,108,95,99,97,99,104, + 101,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,3,0,0,0,7,0,0,0,115,18,0,0,0,135, + 0,135,1,102,2,100,1,100,2,132,8,125,2,124,2,83, + 0,41,4,97,20,1,0,0,65,32,99,108,97,115,115,32, + 109,101,116,104,111,100,32,119,104,105,99,104,32,114,101,116, + 117,114,110,115,32,97,32,99,108,111,115,117,114,101,32,116, + 111,32,117,115,101,32,111,110,32,115,121,115,46,112,97,116, + 104,95,104,111,111,107,10,32,32,32,32,32,32,32,32,119, + 104,105,99,104,32,119,105,108,108,32,114,101,116,117,114,110, + 32,97,110,32,105,110,115,116,97,110,99,101,32,117,115,105, + 110,103,32,116,104,101,32,115,112,101,99,105,102,105,101,100, + 32,108,111,97,100,101,114,115,32,97,110,100,32,116,104,101, + 32,112,97,116,104,10,32,32,32,32,32,32,32,32,99,97, + 108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115, + 117,114,101,46,10,10,32,32,32,32,32,32,32,32,73,102, + 32,116,104,101,32,112,97,116,104,32,99,97,108,108,101,100, + 32,111,110,32,116,104,101,32,99,108,111,115,117,114,101,32, + 105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111, + 114,121,44,32,73,109,112,111,114,116,69,114,114,111,114,32, + 105,115,10,32,32,32,32,32,32,32,32,114,97,105,115,101, + 100,46,10,10,32,32,32,32,32,32,32,32,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, + 0,19,0,0,0,115,36,0,0,0,116,0,124,0,131,1, + 115,20,116,1,100,1,124,0,100,2,141,2,130,1,136,0, + 124,0,103,1,136,1,162,1,82,0,142,0,83,0,41,4, + 122,45,80,97,116,104,32,104,111,111,107,32,102,111,114,32, + 105,109,112,111,114,116,108,105,98,46,109,97,99,104,105,110, + 101,114,121,46,70,105,108,101,70,105,110,100,101,114,46,122, + 30,111,110,108,121,32,100,105,114,101,99,116,111,114,105,101, + 115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,114, + 56,0,0,0,78,41,2,114,64,0,0,0,114,122,0,0, + 0,114,56,0,0,0,169,2,114,202,0,0,0,114,66,1, + 0,0,114,7,0,0,0,114,8,0,0,0,218,24,112,97, + 116,104,95,104,111,111,107,95,102,111,114,95,70,105,108,101, + 70,105,110,100,101,114,9,6,0,0,115,8,0,0,0,8, + 2,12,1,16,1,255,128,122,54,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,107, + 95,102,111,114,95,70,105,108,101,70,105,110,100,101,114,78, + 114,7,0,0,0,41,3,114,202,0,0,0,114,66,1,0, + 0,114,72,1,0,0,114,7,0,0,0,114,71,1,0,0, + 114,8,0,0,0,218,9,112,97,116,104,95,104,111,111,107, + 255,5,0,0,115,6,0,0,0,14,10,4,6,255,128,122, + 20,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,0,0, + 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12, + 0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,41, + 2,78,122,16,70,105,108,101,70,105,110,100,101,114,40,123, + 33,114,125,41,41,2,114,70,0,0,0,114,52,0,0,0, + 114,253,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,36,1,0,0,17,6,0,0,115,4,0, + 0,0,12,1,255,128,122,19,70,105,108,101,70,105,110,100, + 101,114,46,95,95,114,101,112,114,95,95,41,1,78,41,15, + 114,130,0,0,0,114,129,0,0,0,114,131,0,0,0,114, + 132,0,0,0,114,216,0,0,0,114,43,1,0,0,114,147, + 0,0,0,114,210,0,0,0,114,141,0,0,0,114,56,1, + 0,0,114,207,0,0,0,114,67,1,0,0,114,214,0,0, + 0,114,73,1,0,0,114,36,1,0,0,114,7,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 67,1,0,0,224,5,0,0,115,38,0,0,0,6,2,2, - 1,22,1,18,1,10,3,12,3,12,1,6,7,8,1,16, - 1,4,1,18,1,4,2,12,1,6,1,12,1,20,1,4, - 255,255,128,122,22,70,105,108,101,70,105,110,100,101,114,46, - 95,102,105,108,108,95,99,97,99,104,101,99,1,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 7,0,0,0,115,18,0,0,0,135,0,135,1,102,2,100, - 1,100,2,132,8,125,2,124,2,83,0,41,4,97,20,1, - 0,0,65,32,99,108,97,115,115,32,109,101,116,104,111,100, - 32,119,104,105,99,104,32,114,101,116,117,114,110,115,32,97, - 32,99,108,111,115,117,114,101,32,116,111,32,117,115,101,32, - 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107, - 10,32,32,32,32,32,32,32,32,119,104,105,99,104,32,119, - 105,108,108,32,114,101,116,117,114,110,32,97,110,32,105,110, - 115,116,97,110,99,101,32,117,115,105,110,103,32,116,104,101, - 32,115,112,101,99,105,102,105,101,100,32,108,111,97,100,101, - 114,115,32,97,110,100,32,116,104,101,32,112,97,116,104,10, - 32,32,32,32,32,32,32,32,99,97,108,108,101,100,32,111, - 110,32,116,104,101,32,99,108,111,115,117,114,101,46,10,10, - 32,32,32,32,32,32,32,32,73,102,32,116,104,101,32,112, - 97,116,104,32,99,97,108,108,101,100,32,111,110,32,116,104, - 101,32,99,108,111,115,117,114,101,32,105,115,32,110,111,116, - 32,97,32,100,105,114,101,99,116,111,114,121,44,32,73,109, - 112,111,114,116,69,114,114,111,114,32,105,115,10,32,32,32, - 32,32,32,32,32,114,97,105,115,101,100,46,10,10,32,32, - 32,32,32,32,32,32,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,4,0,0,0,19,0,0,0,115, - 36,0,0,0,116,0,124,0,131,1,115,20,116,1,100,1, - 124,0,100,2,141,2,130,1,136,0,124,0,103,1,136,1, - 162,1,82,0,142,0,83,0,41,4,122,45,80,97,116,104, - 32,104,111,111,107,32,102,111,114,32,105,109,112,111,114,116, - 108,105,98,46,109,97,99,104,105,110,101,114,121,46,70,105, - 108,101,70,105,110,100,101,114,46,122,30,111,110,108,121,32, - 100,105,114,101,99,116,111,114,105,101,115,32,97,114,101,32, - 115,117,112,112,111,114,116,101,100,114,56,0,0,0,78,41, - 2,114,64,0,0,0,114,122,0,0,0,114,56,0,0,0, - 169,2,114,202,0,0,0,114,66,1,0,0,114,7,0,0, - 0,114,8,0,0,0,218,24,112,97,116,104,95,104,111,111, - 107,95,102,111,114,95,70,105,108,101,70,105,110,100,101,114, - 9,6,0,0,115,8,0,0,0,8,2,12,1,16,1,255, - 128,122,54,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,107,95,102,111,114,95,70, - 105,108,101,70,105,110,100,101,114,78,114,7,0,0,0,41, - 3,114,202,0,0,0,114,66,1,0,0,114,72,1,0,0, - 114,7,0,0,0,114,71,1,0,0,114,8,0,0,0,218, - 9,112,97,116,104,95,104,111,111,107,255,5,0,0,115,6, - 0,0,0,14,10,4,6,255,128,122,20,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,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,12,0,0,0,100,1,160, - 0,124,0,106,1,161,1,83,0,41,2,78,122,16,70,105, - 108,101,70,105,110,100,101,114,40,123,33,114,125,41,41,2, - 114,70,0,0,0,114,52,0,0,0,114,253,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,36, - 1,0,0,17,6,0,0,115,4,0,0,0,12,1,255,128, - 122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,114, - 101,112,114,95,95,41,1,78,41,15,114,130,0,0,0,114, - 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,216, - 0,0,0,114,43,1,0,0,114,147,0,0,0,114,210,0, - 0,0,114,141,0,0,0,114,56,1,0,0,114,207,0,0, - 0,114,67,1,0,0,114,214,0,0,0,114,73,1,0,0, - 114,36,1,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,59,1,0,0,130,5, - 0,0,115,26,0,0,0,8,0,4,2,8,7,8,14,4, - 4,8,2,8,12,10,5,8,48,2,31,10,1,12,17,255, - 128,114,59,1,0,0,99,4,0,0,0,0,0,0,0,0, - 0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,115, - 144,0,0,0,124,0,160,0,100,1,161,1,125,4,124,0, - 160,0,100,2,161,1,125,5,124,4,115,66,124,5,114,36, - 124,5,106,1,125,4,110,30,124,2,124,3,107,2,114,56, - 116,2,124,1,124,2,131,2,125,4,110,10,116,3,124,1, - 124,2,131,2,125,4,124,5,115,84,116,4,124,1,124,2, - 124,4,100,3,141,3,125,5,122,38,124,5,124,0,100,2, - 60,0,124,4,124,0,100,1,60,0,124,2,124,0,100,4, - 60,0,124,3,124,0,100,5,60,0,87,0,100,0,83,0, - 4,0,116,5,121,142,1,0,1,0,1,0,89,0,100,0, - 83,0,48,0,41,6,78,218,10,95,95,108,111,97,100,101, - 114,95,95,218,8,95,95,115,112,101,99,95,95,114,60,1, - 0,0,90,8,95,95,102,105,108,101,95,95,90,10,95,95, - 99,97,99,104,101,100,95,95,41,6,218,3,103,101,116,114, - 144,0,0,0,114,12,1,0,0,114,6,1,0,0,114,194, - 0,0,0,218,9,69,120,99,101,112,116,105,111,110,41,6, - 90,2,110,115,114,121,0,0,0,90,8,112,97,116,104,110, - 97,109,101,90,9,99,112,97,116,104,110,97,109,101,114,144, - 0,0,0,114,191,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,14,95,102,105,120,95,117,112, - 95,109,111,100,117,108,101,23,6,0,0,115,36,0,0,0, - 10,2,10,1,4,1,4,1,8,1,8,1,12,1,10,2, - 4,1,14,1,2,1,8,1,8,1,8,1,14,1,12,1, - 8,2,255,128,114,78,1,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, - 0,0,115,38,0,0,0,116,0,116,1,160,2,161,0,102, - 2,125,0,116,3,116,4,102,2,125,1,116,5,116,6,102, - 2,125,2,124,0,124,1,124,2,103,3,83,0,41,2,122, - 95,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32, - 111,102,32,102,105,108,101,45,98,97,115,101,100,32,109,111, - 100,117,108,101,32,108,111,97,100,101,114,115,46,10,10,32, - 32,32,32,69,97,99,104,32,105,116,101,109,32,105,115,32, - 97,32,116,117,112,108,101,32,40,108,111,97,100,101,114,44, - 32,115,117,102,102,105,120,101,115,41,46,10,32,32,32,32, - 78,41,7,114,3,1,0,0,114,167,0,0,0,218,18,101, - 120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,101, - 115,114,6,1,0,0,114,106,0,0,0,114,12,1,0,0, - 114,94,0,0,0,41,3,90,10,101,120,116,101,110,115,105, - 111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,116, - 101,99,111,100,101,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,188,0,0,0,46,6,0,0,115,10,0, - 0,0,12,5,8,1,8,1,10,1,255,128,114,188,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,1,0,0,0,67,0,0,0,115,8,0,0,0,124, - 0,97,0,100,0,83,0,114,114,0,0,0,41,1,114,139, - 0,0,0,41,1,218,17,95,98,111,111,116,115,116,114,97, - 112,95,109,111,100,117,108,101,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,21,95,115,101,116,95,98,111, - 111,116,115,116,114,97,112,95,109,111,100,117,108,101,57,6, - 0,0,115,4,0,0,0,8,2,255,128,114,81,1,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,4,0,0,0,67,0,0,0,115,50,0,0,0,116,0, - 124,0,131,1,1,0,116,1,131,0,125,1,116,2,106,3, - 160,4,116,5,106,6,124,1,142,0,103,1,161,1,1,0, - 116,2,106,7,160,8,116,9,161,1,1,0,100,1,83,0, - 41,2,122,41,73,110,115,116,97,108,108,32,116,104,101,32, - 112,97,116,104,45,98,97,115,101,100,32,105,109,112,111,114, - 116,32,99,111,109,112,111,110,101,110,116,115,46,78,41,10, - 114,81,1,0,0,114,188,0,0,0,114,15,0,0,0,114, - 48,1,0,0,114,171,0,0,0,114,59,1,0,0,114,73, - 1,0,0,218,9,109,101,116,97,95,112,97,116,104,114,190, - 0,0,0,114,42,1,0,0,41,2,114,80,1,0,0,90, - 17,115,117,112,112,111,114,116,101,100,95,108,111,97,100,101, - 114,115,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,8,95,105,110,115,116,97,108,108,62,6,0,0,115, - 10,0,0,0,8,2,6,1,20,1,16,1,255,128,114,83, - 1,0,0,41,1,114,68,0,0,0,41,1,78,41,3,78, - 78,78,41,2,114,0,0,0,0,114,0,0,0,0,41,1, - 84,41,1,78,41,1,78,41,83,114,132,0,0,0,114,139, - 0,0,0,114,167,0,0,0,114,72,0,0,0,114,15,0, - 0,0,114,81,0,0,0,114,164,0,0,0,114,22,0,0, - 0,114,211,0,0,0,90,2,110,116,114,18,0,0,0,114, - 196,0,0,0,90,5,112,111,115,105,120,114,42,0,0,0, - 218,3,97,108,108,114,45,0,0,0,114,46,0,0,0,114, - 66,0,0,0,114,25,0,0,0,90,37,95,67,65,83,69, - 95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,65, - 84,70,79,82,77,83,95,66,89,84,69,83,95,75,69,89, - 114,24,0,0,0,114,26,0,0,0,114,21,0,0,0,114, - 33,0,0,0,114,38,0,0,0,114,40,0,0,0,114,48, - 0,0,0,114,55,0,0,0,114,57,0,0,0,114,61,0, - 0,0,114,62,0,0,0,114,64,0,0,0,114,67,0,0, - 0,114,77,0,0,0,218,4,116,121,112,101,218,8,95,95, - 99,111,100,101,95,95,114,166,0,0,0,114,31,0,0,0, - 114,152,0,0,0,114,30,0,0,0,114,35,0,0,0,114, - 243,0,0,0,114,97,0,0,0,114,93,0,0,0,114,106, - 0,0,0,114,190,0,0,0,114,79,1,0,0,114,212,0, - 0,0,114,94,0,0,0,90,23,68,69,66,85,71,95,66, - 89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83, - 90,27,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,114,102,0, - 0,0,114,107,0,0,0,114,113,0,0,0,114,117,0,0, - 0,114,119,0,0,0,114,140,0,0,0,114,147,0,0,0, - 114,156,0,0,0,114,160,0,0,0,114,162,0,0,0,114, - 169,0,0,0,114,174,0,0,0,114,175,0,0,0,114,180, - 0,0,0,218,6,111,98,106,101,99,116,114,189,0,0,0, - 114,194,0,0,0,114,195,0,0,0,114,215,0,0,0,114, - 228,0,0,0,114,246,0,0,0,114,6,1,0,0,114,12, - 1,0,0,114,3,1,0,0,114,18,1,0,0,114,40,1, - 0,0,114,42,1,0,0,114,59,1,0,0,114,78,1,0, - 0,114,188,0,0,0,114,81,1,0,0,114,83,1,0,0, - 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,8,60,109,111,100,117,108,101,62,1,0, - 0,0,115,172,0,0,0,4,0,4,22,8,3,8,1,8, - 1,8,1,8,1,10,3,4,1,8,1,10,1,8,2,4, - 3,10,1,6,2,22,2,8,1,10,1,14,1,4,4,4, - 1,2,1,2,1,4,255,8,4,6,16,8,3,8,5,8, - 5,8,6,8,6,8,12,8,10,8,9,8,5,8,7,10, - 9,10,22,0,127,16,23,12,1,4,2,4,1,6,2,6, - 1,10,1,8,2,6,2,8,2,16,2,8,71,8,40,8, - 19,8,12,8,12,8,31,8,17,8,33,8,28,10,24,10, - 13,10,10,8,11,6,14,4,3,2,1,12,255,14,68,14, - 64,16,30,0,127,14,17,18,50,18,45,18,25,14,53,14, - 63,14,43,0,127,14,20,0,127,10,22,8,23,8,11,12, - 5,255,128, + 59,1,0,0,130,5,0,0,115,26,0,0,0,8,0,4, + 2,8,7,8,14,4,4,8,2,8,12,10,5,8,48,2, + 31,10,1,12,17,255,128,114,59,1,0,0,99,4,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,8,0,0, + 0,67,0,0,0,115,144,0,0,0,124,0,160,0,100,1, + 161,1,125,4,124,0,160,0,100,2,161,1,125,5,124,4, + 115,66,124,5,114,36,124,5,106,1,125,4,110,30,124,2, + 124,3,107,2,114,56,116,2,124,1,124,2,131,2,125,4, + 110,10,116,3,124,1,124,2,131,2,125,4,124,5,115,84, + 116,4,124,1,124,2,124,4,100,3,141,3,125,5,122,38, + 124,5,124,0,100,2,60,0,124,4,124,0,100,1,60,0, + 124,2,124,0,100,4,60,0,124,3,124,0,100,5,60,0, + 87,0,100,0,83,0,4,0,116,5,121,142,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,41,6,78,218,10,95, + 95,108,111,97,100,101,114,95,95,218,8,95,95,115,112,101, + 99,95,95,114,60,1,0,0,90,8,95,95,102,105,108,101, + 95,95,90,10,95,95,99,97,99,104,101,100,95,95,41,6, + 218,3,103,101,116,114,144,0,0,0,114,12,1,0,0,114, + 6,1,0,0,114,194,0,0,0,218,9,69,120,99,101,112, + 116,105,111,110,41,6,90,2,110,115,114,121,0,0,0,90, + 8,112,97,116,104,110,97,109,101,90,9,99,112,97,116,104, + 110,97,109,101,114,144,0,0,0,114,191,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,14,95, + 102,105,120,95,117,112,95,109,111,100,117,108,101,23,6,0, + 0,115,36,0,0,0,10,2,10,1,4,1,4,1,8,1, + 8,1,12,1,10,2,4,1,14,1,2,1,8,1,8,1, + 8,1,14,1,12,1,8,2,255,128,114,78,1,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,38,0,0,0,116,0,116, + 1,160,2,161,0,102,2,125,0,116,3,116,4,102,2,125, + 1,116,5,116,6,102,2,125,2,124,0,124,1,124,2,103, + 3,83,0,41,2,122,95,82,101,116,117,114,110,115,32,97, + 32,108,105,115,116,32,111,102,32,102,105,108,101,45,98,97, + 115,101,100,32,109,111,100,117,108,101,32,108,111,97,100,101, + 114,115,46,10,10,32,32,32,32,69,97,99,104,32,105,116, + 101,109,32,105,115,32,97,32,116,117,112,108,101,32,40,108, + 111,97,100,101,114,44,32,115,117,102,102,105,120,101,115,41, + 46,10,32,32,32,32,78,41,7,114,3,1,0,0,114,167, + 0,0,0,218,18,101,120,116,101,110,115,105,111,110,95,115, + 117,102,102,105,120,101,115,114,6,1,0,0,114,106,0,0, + 0,114,12,1,0,0,114,94,0,0,0,41,3,90,10,101, + 120,116,101,110,115,105,111,110,115,90,6,115,111,117,114,99, + 101,90,8,98,121,116,101,99,111,100,101,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,188,0,0,0,46, + 6,0,0,115,10,0,0,0,12,5,8,1,8,1,10,1, + 255,128,114,188,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,1,0,0,0,67,0,0,0, + 115,8,0,0,0,124,0,97,0,100,0,83,0,114,114,0, + 0,0,41,1,114,139,0,0,0,41,1,218,17,95,98,111, + 111,116,115,116,114,97,112,95,109,111,100,117,108,101,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,21,95, + 115,101,116,95,98,111,111,116,115,116,114,97,112,95,109,111, + 100,117,108,101,57,6,0,0,115,4,0,0,0,8,2,255, + 128,114,81,1,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 50,0,0,0,116,0,124,0,131,1,1,0,116,1,131,0, + 125,1,116,2,106,3,160,4,116,5,106,6,124,1,142,0, + 103,1,161,1,1,0,116,2,106,7,160,8,116,9,161,1, + 1,0,100,1,83,0,41,2,122,41,73,110,115,116,97,108, + 108,32,116,104,101,32,112,97,116,104,45,98,97,115,101,100, + 32,105,109,112,111,114,116,32,99,111,109,112,111,110,101,110, + 116,115,46,78,41,10,114,81,1,0,0,114,188,0,0,0, + 114,15,0,0,0,114,48,1,0,0,114,171,0,0,0,114, + 59,1,0,0,114,73,1,0,0,218,9,109,101,116,97,95, + 112,97,116,104,114,190,0,0,0,114,42,1,0,0,41,2, + 114,80,1,0,0,90,17,115,117,112,112,111,114,116,101,100, + 95,108,111,97,100,101,114,115,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,8,95,105,110,115,116,97,108, + 108,62,6,0,0,115,10,0,0,0,8,2,6,1,20,1, + 16,1,255,128,114,83,1,0,0,41,1,114,68,0,0,0, + 41,1,78,41,3,78,78,78,41,2,114,0,0,0,0,114, + 0,0,0,0,41,1,84,41,1,78,41,1,78,41,83,114, + 132,0,0,0,114,139,0,0,0,114,167,0,0,0,114,72, + 0,0,0,114,15,0,0,0,114,81,0,0,0,114,164,0, + 0,0,114,22,0,0,0,114,211,0,0,0,90,2,110,116, + 114,18,0,0,0,114,196,0,0,0,90,5,112,111,115,105, + 120,114,42,0,0,0,218,3,97,108,108,114,45,0,0,0, + 114,46,0,0,0,114,66,0,0,0,114,25,0,0,0,90, + 37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, + 86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,84, + 69,83,95,75,69,89,114,24,0,0,0,114,26,0,0,0, + 114,21,0,0,0,114,33,0,0,0,114,38,0,0,0,114, + 40,0,0,0,114,48,0,0,0,114,55,0,0,0,114,57, + 0,0,0,114,61,0,0,0,114,62,0,0,0,114,64,0, + 0,0,114,67,0,0,0,114,77,0,0,0,218,4,116,121, + 112,101,218,8,95,95,99,111,100,101,95,95,114,166,0,0, + 0,114,31,0,0,0,114,152,0,0,0,114,30,0,0,0, + 114,35,0,0,0,114,243,0,0,0,114,97,0,0,0,114, + 93,0,0,0,114,106,0,0,0,114,190,0,0,0,114,79, + 1,0,0,114,212,0,0,0,114,94,0,0,0,90,23,68, + 69,66,85,71,95,66,89,84,69,67,79,68,69,95,83,85, + 70,70,73,88,69,83,90,27,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,114,102,0,0,0,114,107,0,0,0,114,113,0, + 0,0,114,117,0,0,0,114,119,0,0,0,114,140,0,0, + 0,114,147,0,0,0,114,156,0,0,0,114,160,0,0,0, + 114,162,0,0,0,114,169,0,0,0,114,174,0,0,0,114, + 175,0,0,0,114,180,0,0,0,218,6,111,98,106,101,99, + 116,114,189,0,0,0,114,194,0,0,0,114,195,0,0,0, + 114,215,0,0,0,114,228,0,0,0,114,246,0,0,0,114, + 6,1,0,0,114,12,1,0,0,114,3,1,0,0,114,18, + 1,0,0,114,40,1,0,0,114,42,1,0,0,114,59,1, + 0,0,114,78,1,0,0,114,188,0,0,0,114,81,1,0, + 0,114,83,1,0,0,114,7,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,8,60,109,111,100, + 117,108,101,62,1,0,0,0,115,172,0,0,0,4,0,4, + 22,8,3,8,1,8,1,8,1,8,1,10,3,4,1,8, + 1,10,1,8,2,4,3,10,1,6,2,22,2,8,1,10, + 1,14,1,4,4,4,1,2,1,2,1,4,255,8,4,6, + 16,8,3,8,5,8,5,8,6,8,6,8,12,8,10,8, + 9,8,5,8,7,10,9,10,22,0,127,16,23,12,1,4, + 2,4,1,6,2,6,1,10,1,8,2,6,2,8,2,16, + 2,8,71,8,40,8,19,8,12,8,12,8,31,8,17,8, + 33,8,28,10,24,10,13,10,10,8,11,6,14,4,3,2, + 1,12,255,14,68,14,64,16,30,0,127,14,17,18,50,18, + 45,18,25,14,53,14,63,14,43,0,127,14,20,0,127,10, + 22,8,23,8,11,12,5,255,128, }; From a710f76d0c2ab63f595b03b3f50467f921bc8c7f Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Mon, 14 Dec 2020 09:10:10 -0800 Subject: [PATCH 0772/1261] bpo-36541: Add lib2to3 grammar PEP-570 pos-only arg parsing (GH-23759) Add positional only args support to lib2to3 pgen2. This adds 3.8's PEP-570 support to lib2to3's pgen2. lib2to3, while being deprecated is still used by things to parse all versions of Python code today. We need it to support parsing modern 3.8 and 3.9 constructs. Also add tests for complex *expr and **expr's. --- Lib/lib2to3/Grammar.txt | 52 ++++++++++++++++--- Lib/lib2to3/tests/test_parser.py | 31 +++++++++++ .../2020-12-14-08-23-57.bpo-36541.qdEtZv.rst | 2 + 3 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-14-08-23-57.bpo-36541.qdEtZv.rst diff --git a/Lib/lib2to3/Grammar.txt b/Lib/lib2to3/Grammar.txt index e007dc188af503..fa7b15061d941c 100644 --- a/Lib/lib2to3/Grammar.txt +++ b/Lib/lib2to3/Grammar.txt @@ -18,15 +18,55 @@ decorated: decorators (classdef | funcdef | async_funcdef) async_funcdef: ASYNC funcdef funcdef: 'def' NAME parameters ['->' test] ':' suite parameters: '(' [typedargslist] ')' -typedargslist: ((tfpdef ['=' test] ',')* - ('*' [tname] (',' tname ['=' test])* [',' ['**' tname [',']]] | '**' tname [',']) - | tfpdef ['=' test] (',' tfpdef ['=' test])* [',']) + +# The following definition for typedarglist is equivalent to this set of rules: +# +# arguments = argument (',' argument)* +# argument = tfpdef ['=' test] +# kwargs = '**' tname [','] +# args = '*' [tname] +# kwonly_kwargs = (',' argument)* [',' [kwargs]] +# args_kwonly_kwargs = args kwonly_kwargs | kwargs +# poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]] +# typedargslist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs +# typedarglist = arguments ',' '/' [',' [typedargslist_no_posonly]])|(typedargslist_no_posonly)" +# +# It needs to be fully expanded to allow our LL(1) parser to work on it. + +typedargslist: tfpdef ['=' test] (',' tfpdef ['=' test])* ',' '/' [ + ',' [((tfpdef ['=' test] ',')* ('*' [tname] (',' tname ['=' test])* + [',' ['**' tname [',']]] | '**' tname [',']) + | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])] + ] | ((tfpdef ['=' test] ',')* ('*' [tname] (',' tname ['=' test])* + [',' ['**' tname [',']]] | '**' tname [',']) + | tfpdef ['=' test] (',' tfpdef ['=' test])* [',']) + tname: NAME [':' test] tfpdef: tname | '(' tfplist ')' tfplist: tfpdef (',' tfpdef)* [','] -varargslist: ((vfpdef ['=' test] ',')* - ('*' [vname] (',' vname ['=' test])* [',' ['**' vname [',']]] | '**' vname [',']) - | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) + +# The following definition for varargslist is equivalent to this set of rules: +# +# arguments = argument (',' argument )* +# argument = vfpdef ['=' test] +# kwargs = '**' vname [','] +# args = '*' [vname] +# kwonly_kwargs = (',' argument )* [',' [kwargs]] +# args_kwonly_kwargs = args kwonly_kwargs | kwargs +# poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]] +# vararglist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs +# varargslist = arguments ',' '/' [','[(vararglist_no_posonly)]] | (vararglist_no_posonly) +# +# It needs to be fully expanded to allow our LL(1) parser to work on it. + +varargslist: vfpdef ['=' test ](',' vfpdef ['=' test])* ',' '/' [',' [ + ((vfpdef ['=' test] ',')* ('*' [vname] (',' vname ['=' test])* + [',' ['**' vname [',']]] | '**' vname [',']) + | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) + ]] | ((vfpdef ['=' test] ',')* + ('*' [vname] (',' vname ['=' test])* [',' ['**' vname [',']]]| '**' vname [',']) + | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) + vname: NAME vfpdef: vname | '(' vfplist ')' vfplist: vfpdef (',' vfpdef)* [','] diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py index ba2bb787332edd..d5db66b9b1e7b9 100644 --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -272,6 +272,12 @@ def test_dict_display_1(self): def test_dict_display_2(self): self.validate("""{**{}, 3:4, **{5:6, 7:8}}""") + def test_complex_star_expression(self): + self.validate("func(* [] or [1])") + + def test_complex_double_star_expression(self): + self.validate("func(**{1: 3} if False else {x: x for x in range(3)})") + def test_argument_unpacking_1(self): self.validate("""f(a, *b, *c, d)""") @@ -630,6 +636,7 @@ def test_multiline_str_literals(self): class TestNamedAssignments(GrammarTest): + """Also known as the walrus operator.""" def test_named_assignment_if(self): driver.parse_string("if f := x(): pass\n") @@ -644,6 +651,30 @@ def test_named_assignment_listcomp(self): driver.parse_string("[(lastNum := num) == 1 for num in [1, 2, 3]]\n") +class TestPositionalOnlyArgs(GrammarTest): + + def test_one_pos_only_arg(self): + driver.parse_string("def one_pos_only_arg(a, /): pass\n") + + def test_all_markers(self): + driver.parse_string( + "def all_markers(a, b=2, /, c, d=4, *, e=5, f): pass\n") + + def test_all_with_args_and_kwargs(self): + driver.parse_string( + """def all_markers_with_args_and_kwargs( + aa, b, /, _cc, d, *args, e, f_f, **kwargs, + ): + pass\n""") + + def test_lambda_soup(self): + driver.parse_string( + "lambda a, b, /, c, d, *args, e, f, **kw: kw\n") + + def test_only_positional_or_keyword(self): + driver.parse_string("def func(a,b,/,*,g,e=3): pass\n") + + class TestPickleableException(unittest.TestCase): def test_ParseError(self): err = ParseError('msg', 2, None, (1, 'context')) diff --git a/Misc/NEWS.d/next/Library/2020-12-14-08-23-57.bpo-36541.qdEtZv.rst b/Misc/NEWS.d/next/Library/2020-12-14-08-23-57.bpo-36541.qdEtZv.rst new file mode 100644 index 00000000000000..5678d8c595ca08 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-14-08-23-57.bpo-36541.qdEtZv.rst @@ -0,0 +1,2 @@ +Fixed lib2to3.pgen2 to be able to parse PEP-570 positional only argument +syntax. From d3b29400a954a79e8cdd7a264da094e1da729d8d Mon Sep 17 00:00:00 2001 From: vabr-g Date: Mon, 14 Dec 2020 19:30:09 +0100 Subject: [PATCH 0773/1261] bpo-41877: Check for misspelled speccing arguments (GH-23737) patch, patch.object and create_autospec silently ignore misspelled arguments such as autospect, auto_spec and set_spec. This can lead to tests failing to check what they are supposed to check. This change adds a check causing a RuntimeError if the above functions get any of the above misspellings as arguments. It also adds a new argument, "unsafe", which can be set to True to disable this check. Also add "!r" to format specifiers in added error messages. --- Lib/unittest/mock.py | 39 +++++++++++--- Lib/unittest/test/testmock/testmock.py | 52 +++++++++++++++++++ .../2020-12-10-19-49-52.bpo-41877.wiVlPc.rst | 1 + 3 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-10-19-49-52.bpo-41877.wiVlPc.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index d43ea9e23c899c..720f682efbb54c 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -633,8 +633,8 @@ def __getattr__(self, name): if not self._mock_unsafe: if name.startswith(('assert', 'assret', 'asert', 'aseert', 'assrt')): raise AttributeError( - f"{name} is not a valid assertion. Use a spec " - f"for the mock if {name} is meant to be an attribute.") + f"{name!r} is not a valid assertion. Use a spec " + f"for the mock if {name!r} is meant to be an attribute.") result = self._mock_children.get(name) if result is _deleted: @@ -1242,6 +1242,17 @@ def _importer(target): return thing +# _check_spec_arg_typos takes kwargs from commands like patch and checks that +# they don't contain common misspellings of arguments related to autospeccing. +def _check_spec_arg_typos(kwargs_to_check): + typos = ("autospect", "auto_spec", "set_spec") + for typo in typos: + if typo in kwargs_to_check: + raise RuntimeError( + f"{typo!r} might be a typo; use unsafe=True if this is intended" + ) + + class _patch(object): attribute_name = None @@ -1249,7 +1260,7 @@ class _patch(object): def __init__( self, getter, attribute, new, spec, create, - spec_set, autospec, new_callable, kwargs + spec_set, autospec, new_callable, kwargs, *, unsafe=False ): if new_callable is not None: if new is not DEFAULT: @@ -1260,6 +1271,8 @@ def __init__( raise ValueError( "Cannot use 'autospec' and 'new_callable' together" ) + if not unsafe: + _check_spec_arg_typos(kwargs) self.getter = getter self.attribute = attribute @@ -1569,7 +1582,7 @@ def _get_target(target): def _patch_object( target, attribute, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, - new_callable=None, **kwargs + new_callable=None, *, unsafe=False, **kwargs ): """ patch the named member (`attribute`) on an object (`target`) with a mock @@ -1591,7 +1604,7 @@ def _patch_object( getter = lambda: target return _patch( getter, attribute, new, spec, create, - spec_set, autospec, new_callable, kwargs + spec_set, autospec, new_callable, kwargs, unsafe=unsafe ) @@ -1646,7 +1659,7 @@ def _patch_multiple(target, spec=None, create=False, spec_set=None, def patch( target, new=DEFAULT, spec=None, create=False, - spec_set=None, autospec=None, new_callable=None, **kwargs + spec_set=None, autospec=None, new_callable=None, *, unsafe=False, **kwargs ): """ `patch` acts as a function decorator, class decorator or a context @@ -1708,6 +1721,10 @@ def patch( use "as" then the patched object will be bound to the name after the "as"; very useful if `patch` is creating a mock object for you. + Patch will raise a `RuntimeError` if passed some common misspellings of + the arguments autospec and spec_set. Pass the argument `unsafe` with the + value True to disable that check. + `patch` takes arbitrary keyword arguments. These will be passed to `AsyncMock` if the patched object is asynchronous, to `MagicMock` otherwise or to `new_callable` if specified. @@ -1718,7 +1735,7 @@ def patch( getter, attribute = _get_target(target) return _patch( getter, attribute, new, spec, create, - spec_set, autospec, new_callable, kwargs + spec_set, autospec, new_callable, kwargs, unsafe=unsafe ) @@ -2568,7 +2585,7 @@ def call_list(self): def create_autospec(spec, spec_set=False, instance=False, _parent=None, - _name=None, **kwargs): + _name=None, *, unsafe=False, **kwargs): """Create a mock object using another object as a spec. Attributes on the mock will use the corresponding attribute on the `spec` object as their spec. @@ -2584,6 +2601,10 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, spec for an instance object by passing `instance=True`. The returned mock will only be callable if instances of the mock are callable. + `create_autospec` will raise a `RuntimeError` if passed some common + misspellings of the arguments autospec and spec_set. Pass the argument + `unsafe` with the value True to disable that check. + `create_autospec` also takes arbitrary keyword arguments that are passed to the constructor of the created mock.""" if _is_list(spec): @@ -2601,6 +2622,8 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, _kwargs = {} if _kwargs and instance: _kwargs['_spec_as_instance'] = True + if not unsafe: + _check_spec_arg_typos(kwargs) _kwargs.update(kwargs) diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 016905c3b90e5c..e38f41e1d21528 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -38,6 +38,12 @@ def cmeth(cls, a, b, c, d=None): pass def smeth(a, b, c, d=None): pass +class Typos(): + autospect = None + auto_spec = None + set_spec = None + + def something(a): pass @@ -2175,6 +2181,52 @@ def __init__(self): self.assertEqual(obj.obj_with_bool_func.__bool__.call_count, 0) + def test_misspelled_arguments(self): + class Foo(): + one = 'one' + # patch, patch.object and create_autospec need to check for misspelled + # arguments explicitly and throw a RuntimError if found. + with self.assertRaises(RuntimeError): + with patch(f'{__name__}.Something.meth', autospect=True): pass + with self.assertRaises(RuntimeError): + with patch.object(Foo, 'one', autospect=True): pass + with self.assertRaises(RuntimeError): + with patch(f'{__name__}.Something.meth', auto_spec=True): pass + with self.assertRaises(RuntimeError): + with patch.object(Foo, 'one', auto_spec=True): pass + with self.assertRaises(RuntimeError): + with patch(f'{__name__}.Something.meth', set_spec=True): pass + with self.assertRaises(RuntimeError): + with patch.object(Foo, 'one', set_spec=True): pass + with self.assertRaises(RuntimeError): + m = create_autospec(Foo, set_spec=True) + # patch.multiple, on the other hand, should flag misspelled arguments + # through an AttributeError, when trying to find the keys from kwargs + # as attributes on the target. + with self.assertRaises(AttributeError): + with patch.multiple( + f'{__name__}.Something', meth=DEFAULT, autospect=True): pass + with self.assertRaises(AttributeError): + with patch.multiple( + f'{__name__}.Something', meth=DEFAULT, auto_spec=True): pass + with self.assertRaises(AttributeError): + with patch.multiple( + f'{__name__}.Something', meth=DEFAULT, set_spec=True): pass + + with patch(f'{__name__}.Something.meth', unsafe=True, autospect=True): + pass + with patch.object(Foo, 'one', unsafe=True, autospect=True): pass + with patch(f'{__name__}.Something.meth', unsafe=True, auto_spec=True): + pass + with patch.object(Foo, 'one', unsafe=True, auto_spec=True): pass + with patch(f'{__name__}.Something.meth', unsafe=True, set_spec=True): + pass + with patch.object(Foo, 'one', unsafe=True, set_spec=True): pass + m = create_autospec(Foo, set_spec=True, unsafe=True) + with patch.multiple( + f'{__name__}.Typos', autospect=True, set_spec=True, auto_spec=True): + pass + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-12-10-19-49-52.bpo-41877.wiVlPc.rst b/Misc/NEWS.d/next/Library/2020-12-10-19-49-52.bpo-41877.wiVlPc.rst new file mode 100644 index 00000000000000..d42200ecd03de0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-10-19-49-52.bpo-41877.wiVlPc.rst @@ -0,0 +1 @@ +A check is added against misspellings of autospect, auto_spec and set_spec being passed as arguments to patch, patch.object and create_autospec. \ No newline at end of file From 06a26e298e0e11003494e152b78e4e327da3a3cc Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 14 Dec 2020 22:40:40 +0100 Subject: [PATCH 0774/1261] bpo-42639: Cleanup atexitmodule.c (GH-23770) * Rename "atexitmodule_state" to "struct atexit_state". * Rename "modstate" to "state". * Rename "self" parameter to "module". * test_atexit uses textwrap.dedent(). * Remove _Py_PyAtExit() function: inline it into atexit_exec(). * PyInterpreterState: rename pyexitfunc to atexit_func, rename pyexitmodule to atexit_module. --- Include/cpython/pylifecycle.h | 5 - Include/internal/pycore_interp.h | 4 +- Lib/test/test_atexit.py | 23 +-- Modules/atexitmodule.c | 235 ++++++++++++++----------------- Python/pylifecycle.c | 16 +-- 5 files changed, 125 insertions(+), 158 deletions(-) diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index b4e2c8a8427c8a..13f7a26ba12d02 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -35,11 +35,6 @@ PyAPI_FUNC(int) Py_RunMain(void); PyAPI_FUNC(void) _Py_NO_RETURN Py_ExitStatusException(PyStatus err); -/* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level - * exit functions. - */ -PyAPI_FUNC(void) _Py_PyAtExit(void (*func)(PyObject *), PyObject *); - /* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. */ PyAPI_FUNC(void) _Py_RestoreSignals(void); diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 184878ce146032..2515234708b3fe 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -234,8 +234,8 @@ struct _is { PyObject *after_forkers_child; #endif /* AtExit module */ - void (*pyexitfunc)(PyObject *); - PyObject *pyexitmodule; + void (*atexit_func)(PyObject *); + PyObject *atexit_module; uint64_t tstate_next_unique_id; diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index 3105f6c378193e..906f96dc31af08 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -1,8 +1,9 @@ -import sys -import unittest -import io import atexit +import io import os +import sys +import textwrap +import unittest from test import support from test.support import script_helper @@ -156,7 +157,7 @@ def test_bound_methods(self): def test_shutdown(self): # Actually test the shutdown mechanism in a subprocess - code = """if 1: + code = textwrap.dedent(""" import atexit def f(msg): @@ -164,7 +165,7 @@ def f(msg): atexit.register(f, "one") atexit.register(f, "two") - """ + """) res = script_helper.assert_python_ok("-c", code) self.assertEqual(res.out.decode().splitlines(), ["two", "one"]) self.assertFalse(res.err) @@ -178,13 +179,13 @@ def test_callbacks_leak(self): # take care to free callbacks in its per-subinterpreter module # state. n = atexit._ncallbacks() - code = r"""if 1: + code = textwrap.dedent(r""" import atexit def f(): pass atexit.register(f) del atexit - """ + """) ret = support.run_in_subinterp(code) self.assertEqual(ret, 0) self.assertEqual(atexit._ncallbacks(), n) @@ -193,13 +194,13 @@ def test_callbacks_leak_refcycle(self): # Similar to the above, but with a refcycle through the atexit # module. n = atexit._ncallbacks() - code = r"""if 1: + code = textwrap.dedent(r""" import atexit def f(): pass atexit.register(f) atexit.__atexit = atexit - """ + """) ret = support.run_in_subinterp(code) self.assertEqual(ret, 0) self.assertEqual(atexit._ncallbacks(), n) @@ -210,13 +211,13 @@ def test_callback_on_subinterpreter_teardown(self): expected = b"The test has passed!" r, w = os.pipe() - code = r"""if 1: + code = textwrap.dedent(r""" import os import atexit def callback(): os.write({:d}, b"The test has passed!") atexit.register(callback) - """.format(w) + """.format(w)) ret = support.run_in_subinterp(code) os.close(w) self.assertEqual(os.read(r, len(expected)), expected) diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index fd47ddd7731c5d..f1fc871cf7fa96 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -7,11 +7,8 @@ */ #include "Python.h" - -/* Forward declaration (for atexit_cleanup) */ -static PyObject *atexit_clear(PyObject*, PyObject*); -/* Forward declaration of module object */ -static struct PyModuleDef atexitmodule; +#include "pycore_interp.h" // PyInterpreterState.atexit_func +#include "pycore_pystate.h" // _PyInterpreterState_GET /* ===================================================================== */ /* Callback machinery. */ @@ -22,48 +19,47 @@ typedef struct { PyObject *kwargs; } atexit_callback; -typedef struct { +struct atexit_state { atexit_callback **atexit_callbacks; int ncallbacks; int callback_len; -} atexitmodule_state; +}; -static inline atexitmodule_state* +static inline struct atexit_state* get_atexit_state(PyObject *module) { void *state = PyModule_GetState(module); assert(state != NULL); - return (atexitmodule_state *)state; + return (struct atexit_state *)state; } static void -atexit_delete_cb(atexitmodule_state *modstate, int i) +atexit_delete_cb(struct atexit_state *state, int i) { - atexit_callback *cb; + atexit_callback *cb = state->atexit_callbacks[i]; + state->atexit_callbacks[i] = NULL; - cb = modstate->atexit_callbacks[i]; - modstate->atexit_callbacks[i] = NULL; Py_DECREF(cb->func); Py_DECREF(cb->args); Py_XDECREF(cb->kwargs); PyMem_Free(cb); } + /* Clear all callbacks without calling them */ static void -atexit_cleanup(atexitmodule_state *modstate) +atexit_cleanup(struct atexit_state *state) { atexit_callback *cb; - int i; - for (i = 0; i < modstate->ncallbacks; i++) { - cb = modstate->atexit_callbacks[i]; + for (int i = 0; i < state->ncallbacks; i++) { + cb = state->atexit_callbacks[i]; if (cb == NULL) continue; - atexit_delete_cb(modstate, i); + atexit_delete_cb(state, i); } - modstate->ncallbacks = 0; + state->ncallbacks = 0; } /* Installed into pylifecycle.c's atexit mechanism */ @@ -71,28 +67,26 @@ atexit_cleanup(atexitmodule_state *modstate) static void atexit_callfuncs(PyObject *module) { - PyObject *exc_type = NULL, *exc_value, *exc_tb, *r; - atexit_callback *cb; - atexitmodule_state *modstate; - int i; + assert(!PyErr_Occurred()); - if (module == NULL) + if (module == NULL) { return; - modstate = get_atexit_state(module); + } - if (modstate->ncallbacks == 0) + struct atexit_state *state = get_atexit_state(module); + if (state->ncallbacks == 0) { return; + } - - for (i = modstate->ncallbacks - 1; i >= 0; i--) - { - cb = modstate->atexit_callbacks[i]; - if (cb == NULL) + PyObject *exc_type = NULL, *exc_value, *exc_tb; + for (int i = state->ncallbacks - 1; i >= 0; i--) { + atexit_callback *cb = state->atexit_callbacks[i]; + if (cb == NULL) { continue; + } - r = PyObject_Call(cb->func, cb->args, cb->kwargs); - Py_XDECREF(r); - if (r == NULL) { + PyObject *res = PyObject_Call(cb->func, cb->args, cb->kwargs); + if (res == NULL) { /* Maintain the last exception, but don't leak if there are multiple exceptions. */ if (exc_type) { @@ -107,12 +101,16 @@ atexit_callfuncs(PyObject *module) PyErr_Display(exc_type, exc_value, exc_tb); } } + else { + Py_DECREF(res); + } } - atexit_cleanup(modstate); + atexit_cleanup(state); - if (exc_type) + if (exc_type) { PyErr_Restore(exc_type, exc_value, exc_tb); + } } /* ===================================================================== */ @@ -130,55 +128,48 @@ Register a function to be executed upon normal program termination\n\ func is returned to facilitate usage as a decorator."); static PyObject * -atexit_register(PyObject *self, PyObject *args, PyObject *kwargs) +atexit_register(PyObject *module, PyObject *args, PyObject *kwargs) { - atexitmodule_state *modstate; - atexit_callback *new_callback; - PyObject *func = NULL; - - modstate = get_atexit_state(self); - - if (modstate->ncallbacks >= modstate->callback_len) { - atexit_callback **r; - modstate->callback_len += 16; - r = (atexit_callback**)PyMem_Realloc(modstate->atexit_callbacks, - sizeof(atexit_callback*) * modstate->callback_len); - if (r == NULL) - return PyErr_NoMemory(); - modstate->atexit_callbacks = r; - } - if (PyTuple_GET_SIZE(args) == 0) { PyErr_SetString(PyExc_TypeError, "register() takes at least 1 argument (0 given)"); return NULL; } - func = PyTuple_GET_ITEM(args, 0); + PyObject *func = PyTuple_GET_ITEM(args, 0); if (!PyCallable_Check(func)) { PyErr_SetString(PyExc_TypeError, "the first argument must be callable"); return NULL; } - new_callback = PyMem_Malloc(sizeof(atexit_callback)); - if (new_callback == NULL) + struct atexit_state *state = get_atexit_state(module); + if (state->ncallbacks >= state->callback_len) { + atexit_callback **r; + state->callback_len += 16; + r = (atexit_callback**)PyMem_Realloc(state->atexit_callbacks, + sizeof(atexit_callback*) * state->callback_len); + if (r == NULL) + return PyErr_NoMemory(); + state->atexit_callbacks = r; + } + + atexit_callback *callback = PyMem_Malloc(sizeof(atexit_callback)); + if (callback == NULL) { return PyErr_NoMemory(); + } - new_callback->args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args)); - if (new_callback->args == NULL) { - PyMem_Free(new_callback); + callback->args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args)); + if (callback->args == NULL) { + PyMem_Free(callback); return NULL; } - new_callback->func = func; - new_callback->kwargs = kwargs; - Py_INCREF(func); - Py_XINCREF(kwargs); + callback->func = Py_NewRef(func); + callback->kwargs = Py_XNewRef(kwargs); - modstate->atexit_callbacks[modstate->ncallbacks++] = new_callback; + state->atexit_callbacks[state->ncallbacks++] = callback; - Py_INCREF(func); - return func; + return Py_NewRef(func); } PyDoc_STRVAR(atexit_run_exitfuncs__doc__, @@ -187,11 +178,12 @@ PyDoc_STRVAR(atexit_run_exitfuncs__doc__, Run all registered exit functions."); static PyObject * -atexit_run_exitfuncs(PyObject *self, PyObject *unused) +atexit_run_exitfuncs(PyObject *module, PyObject *unused) { - atexit_callfuncs(self); - if (PyErr_Occurred()) + atexit_callfuncs(module); + if (PyErr_Occurred()) { return NULL; + } Py_RETURN_NONE; } @@ -201,9 +193,9 @@ PyDoc_STRVAR(atexit_clear__doc__, Clear the list of previously registered exit functions."); static PyObject * -atexit_clear(PyObject *self, PyObject *unused) +atexit_clear(PyObject *module, PyObject *unused) { - atexit_cleanup(get_atexit_state(self)); + atexit_cleanup(get_atexit_state(module)); Py_RETURN_NONE; } @@ -213,25 +205,18 @@ PyDoc_STRVAR(atexit_ncallbacks__doc__, Return the number of registered exit functions."); static PyObject * -atexit_ncallbacks(PyObject *self, PyObject *unused) +atexit_ncallbacks(PyObject *module, PyObject *unused) { - atexitmodule_state *modstate; - - modstate = get_atexit_state(self); - - return PyLong_FromSsize_t(modstate->ncallbacks); + struct atexit_state *state = get_atexit_state(module); + return PyLong_FromSsize_t(state->ncallbacks); } static int -atexit_m_traverse(PyObject *self, visitproc visit, void *arg) +atexit_m_traverse(PyObject *module, visitproc visit, void *arg) { - int i; - atexitmodule_state *modstate; - - modstate = (atexitmodule_state *)PyModule_GetState(self); - - for (i = 0; i < modstate->ncallbacks; i++) { - atexit_callback *cb = modstate->atexit_callbacks[i]; + struct atexit_state *state = (struct atexit_state *)PyModule_GetState(module); + for (int i = 0; i < state->ncallbacks; i++) { + atexit_callback *cb = state->atexit_callbacks[i]; if (cb == NULL) continue; Py_VISIT(cb->func); @@ -242,21 +227,19 @@ atexit_m_traverse(PyObject *self, visitproc visit, void *arg) } static int -atexit_m_clear(PyObject *self) +atexit_m_clear(PyObject *module) { - atexitmodule_state *modstate; - modstate = (atexitmodule_state *)PyModule_GetState(self); - atexit_cleanup(modstate); + struct atexit_state *state = (struct atexit_state *)PyModule_GetState(module); + atexit_cleanup(state); return 0; } static void -atexit_free(PyObject *m) +atexit_free(PyObject *module) { - atexitmodule_state *modstate; - modstate = (atexitmodule_state *)PyModule_GetState(m); - atexit_cleanup(modstate); - PyMem_Free(modstate->atexit_callbacks); + struct atexit_state *state = (struct atexit_state *)PyModule_GetState(module); + atexit_cleanup(state); + PyMem_Free(state->atexit_callbacks); } PyDoc_STRVAR(atexit_unregister__doc__, @@ -268,29 +251,28 @@ atexit.register\n\ func - function to be unregistered"); static PyObject * -atexit_unregister(PyObject *self, PyObject *func) +atexit_unregister(PyObject *module, PyObject *func) { - atexitmodule_state *modstate; - atexit_callback *cb; - int i, eq; - - modstate = get_atexit_state(self); - - for (i = 0; i < modstate->ncallbacks; i++) + struct atexit_state *state = get_atexit_state(module); + for (int i = 0; i < state->ncallbacks; i++) { - cb = modstate->atexit_callbacks[i]; - if (cb == NULL) + atexit_callback *cb = state->atexit_callbacks[i]; + if (cb == NULL) { continue; + } - eq = PyObject_RichCompareBool(cb->func, func, Py_EQ); - if (eq < 0) + int eq = PyObject_RichCompareBool(cb->func, func, Py_EQ); + if (eq < 0) { return NULL; - if (eq) - atexit_delete_cb(modstate, i); + } + if (eq) { + atexit_delete_cb(state, i); + } } Py_RETURN_NONE; } + static PyMethodDef atexit_methods[] = { {"register", (PyCFunction)(void(*)(void)) atexit_register, METH_VARARGS|METH_KEYWORDS, atexit_register__doc__}, @@ -316,18 +298,19 @@ Two public functions, register and unregister, are defined.\n\ "); static int -atexit_exec(PyObject *m) { - atexitmodule_state *modstate; - - modstate = get_atexit_state(m); - modstate->callback_len = 32; - modstate->ncallbacks = 0; - modstate->atexit_callbacks = PyMem_New(atexit_callback*, - modstate->callback_len); - if (modstate->atexit_callbacks == NULL) +atexit_exec(PyObject *module) +{ + struct atexit_state *state = get_atexit_state(module); + state->callback_len = 32; + state->ncallbacks = 0; + state->atexit_callbacks = PyMem_New(atexit_callback*, state->callback_len); + if (state->atexit_callbacks == NULL) { return -1; + } - _Py_PyAtExit(atexit_callfuncs, m); + PyInterpreterState *is = _PyInterpreterState_GET(); + is->atexit_func = atexit_callfuncs; + is->atexit_module = module; return 0; } @@ -338,14 +321,14 @@ static PyModuleDef_Slot atexit_slots[] = { static struct PyModuleDef atexitmodule = { PyModuleDef_HEAD_INIT, - "atexit", - atexit__doc__, - sizeof(atexitmodule_state), - atexit_methods, - atexit_slots, - atexit_m_traverse, - atexit_m_clear, - (freefunc)atexit_free + .m_name = "atexit", + .m_doc = atexit__doc__, + .m_size = sizeof(struct atexit_state), + .m_methods = atexit_methods, + .m_slots = atexit_slots, + .m_traverse = atexit_m_traverse, + .m_clear = atexit_m_clear, + .m_free = (freefunc)atexit_free }; PyMODINIT_FUNC diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 6a705b4d2b4b9e..54a35a27eccc27 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2634,26 +2634,14 @@ Py_ExitStatusException(PyStatus status) /* Clean up and exit */ -/* For the atexit module. */ -void _Py_PyAtExit(void (*func)(PyObject *), PyObject *module) -{ - PyInterpreterState *is = _PyInterpreterState_GET(); - - /* Guard against API misuse (see bpo-17852) */ - assert(is->pyexitfunc == NULL || is->pyexitfunc == func); - - is->pyexitfunc = func; - is->pyexitmodule = module; -} - static void call_py_exitfuncs(PyThreadState *tstate) { PyInterpreterState *interp = tstate->interp; - if (interp->pyexitfunc == NULL) + if (interp->atexit_func == NULL) return; - (*interp->pyexitfunc)(interp->pyexitmodule); + interp->atexit_func(interp->atexit_module); _PyErr_Clear(tstate); } From b8df1079e9aa8d0e4907e9261c365c38cee07e52 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 14 Dec 2020 23:07:54 +0100 Subject: [PATCH 0775/1261] bpo-42639: atexit now logs callbacks exceptions (GH-23771) At Python exit, if a callback registered with atexit.register() fails, its exception is now logged. Previously, only some exceptions were logged, and the last exception was always silently ignored. Add _PyAtExit_Call() function and remove PyInterpreterState.atexit_func member. call_py_exitfuncs() now calls directly _PyAtExit_Call(). The atexit module must now always be built as a built-in module. --- Doc/whatsnew/3.10.rst | 9 ++++ Include/internal/pycore_interp.h | 2 +- Include/internal/pycore_pylifecycle.h | 2 + Lib/test/test_threading.py | 1 - .../2020-12-14-22-31-22.bpo-42639.5Z3iWX.rst | 3 ++ Modules/atexitmodule.c | 53 ++++++++++++------- Python/pylifecycle.c | 9 ++-- setup.py | 2 - 8 files changed, 53 insertions(+), 28 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-14-22-31-22.bpo-42639.5Z3iWX.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 23e28aa4fd8fc2..b690f8d2d7cd7c 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -501,6 +501,13 @@ Changes in the Python API have been renamed to *exc*. (Contributed by Zackery Spytz and Matthias Bussonnier in :issue:`26389`.) +* :mod:`atexit`: At Python exit, if a callback registered with + :func:`atexit.register` fails, its exception is now logged. Previously, only + some exceptions were logged, and the last exception was always silently + ignored. + (Contributed by Victor Stinner in :issue:`42639`.) + + CPython bytecode changes ======================== @@ -519,6 +526,8 @@ Build Changes * :mod:`sqlite3` requires SQLite 3.7.3 or higher. (Contributed by Sergey Fedoseev and Erlend E. Aasland :issue:`40744`.) +* The :mod:`atexit` module must now always be built as a built-in module. + (Contributed by Victor Stinner in :issue:`42639`.) C API Changes diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 2515234708b3fe..12416c2e94d433 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -233,8 +233,8 @@ struct _is { PyObject *after_forkers_parent; PyObject *after_forkers_child; #endif + /* AtExit module */ - void (*atexit_func)(PyObject *); PyObject *atexit_module; uint64_t tstate_next_unique_id; diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index b691e6325780ed..e6e4187cd5ab0d 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -109,6 +109,8 @@ PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception, PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate); +extern void _PyAtExit_Call(PyObject *module); + #ifdef __cplusplus } #endif diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 864cea313aea52..0a4372ec2df39f 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -487,7 +487,6 @@ def exit_handler(): if not pid: print("child process ok", file=sys.stderr, flush=True) # child process - sys.exit() else: wait_process(pid, exitcode=0) diff --git a/Misc/NEWS.d/next/Library/2020-12-14-22-31-22.bpo-42639.5Z3iWX.rst b/Misc/NEWS.d/next/Library/2020-12-14-22-31-22.bpo-42639.5Z3iWX.rst new file mode 100644 index 00000000000000..bdb2edd7adc2fa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-14-22-31-22.bpo-42639.5Z3iWX.rst @@ -0,0 +1,3 @@ +At Python exit, if a callback registered with :func:`atexit.register` fails, +its exception is now logged. Previously, only some exceptions were logged, and +the last exception was always silently ignored. diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index f1fc871cf7fa96..90ed7d50cad492 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -65,7 +65,7 @@ atexit_cleanup(struct atexit_state *state) /* Installed into pylifecycle.c's atexit mechanism */ static void -atexit_callfuncs(PyObject *module) +atexit_callfuncs(PyObject *module, int ignore_exc) { assert(!PyErr_Occurred()); @@ -87,18 +87,23 @@ atexit_callfuncs(PyObject *module) PyObject *res = PyObject_Call(cb->func, cb->args, cb->kwargs); if (res == NULL) { - /* Maintain the last exception, but don't leak if there are - multiple exceptions. */ - if (exc_type) { - Py_DECREF(exc_type); - Py_XDECREF(exc_value); - Py_XDECREF(exc_tb); + if (ignore_exc) { + _PyErr_WriteUnraisableMsg("in atexit callback", cb->func); } - PyErr_Fetch(&exc_type, &exc_value, &exc_tb); - if (!PyErr_GivenExceptionMatches(exc_type, PyExc_SystemExit)) { - PySys_WriteStderr("Error in atexit._run_exitfuncs:\n"); - PyErr_NormalizeException(&exc_type, &exc_value, &exc_tb); - PyErr_Display(exc_type, exc_value, exc_tb); + else { + /* Maintain the last exception, but don't leak if there are + multiple exceptions. */ + if (exc_type) { + Py_DECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_tb); + if (!PyErr_GivenExceptionMatches(exc_type, PyExc_SystemExit)) { + PySys_WriteStderr("Error in atexit._run_exitfuncs:\n"); + PyErr_NormalizeException(&exc_type, &exc_value, &exc_tb); + PyErr_Display(exc_type, exc_value, exc_tb); + } } } else { @@ -108,11 +113,24 @@ atexit_callfuncs(PyObject *module) atexit_cleanup(state); - if (exc_type) { - PyErr_Restore(exc_type, exc_value, exc_tb); + if (ignore_exc) { + assert(!PyErr_Occurred()); + } + else { + if (exc_type) { + PyErr_Restore(exc_type, exc_value, exc_tb); + } } } + +void +_PyAtExit_Call(PyObject *module) +{ + atexit_callfuncs(module, 1); +} + + /* ===================================================================== */ /* Module methods. */ @@ -180,7 +198,7 @@ Run all registered exit functions."); static PyObject * atexit_run_exitfuncs(PyObject *module, PyObject *unused) { - atexit_callfuncs(module); + atexit_callfuncs(module, 0); if (PyErr_Occurred()) { return NULL; } @@ -308,9 +326,8 @@ atexit_exec(PyObject *module) return -1; } - PyInterpreterState *is = _PyInterpreterState_GET(); - is->atexit_func = atexit_callfuncs; - is->atexit_module = module; + PyInterpreterState *interp = _PyInterpreterState_GET(); + interp->atexit_module = module; return 0; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 54a35a27eccc27..7b80d01a375e5b 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2632,19 +2632,16 @@ Py_ExitStatusException(PyStatus status) } } + /* Clean up and exit */ static void call_py_exitfuncs(PyThreadState *tstate) { - PyInterpreterState *interp = tstate->interp; - if (interp->atexit_func == NULL) - return; - - interp->atexit_func(interp->atexit_module); - _PyErr_Clear(tstate); + _PyAtExit_Call(tstate->interp->atexit_module); } + /* Wait until threading._shutdown completes, provided the threading module was imported in the first place. The shutdown routine will wait until all non-daemon diff --git a/setup.py b/setup.py index ca5a04d2ae0d7f..e055e44b0f1750 100644 --- a/setup.py +++ b/setup.py @@ -854,8 +854,6 @@ def detect_simple_extensions(self): # C-optimized pickle replacement self.add(Extension("_pickle", ["_pickle.c"], extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) - # atexit - self.add(Extension("atexit", ["atexitmodule.c"])) # _json speedups self.add(Extension("_json", ["_json.c"], extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) From 4039fcd9ae34f60652cd52083a02d7b70773057b Mon Sep 17 00:00:00 2001 From: pxinwr Date: Tue, 15 Dec 2020 06:14:43 +0800 Subject: [PATCH 0776/1261] bpo-31904: Enable libpython3.so shared library for VxWorks (GH-23741) --- .../next/Build/2020-12-11-18-04-38.bpo-31904.j3j6d8.rst | 1 + configure | 4 ++-- configure.ac | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-12-11-18-04-38.bpo-31904.j3j6d8.rst diff --git a/Misc/NEWS.d/next/Build/2020-12-11-18-04-38.bpo-31904.j3j6d8.rst b/Misc/NEWS.d/next/Build/2020-12-11-18-04-38.bpo-31904.j3j6d8.rst new file mode 100644 index 00000000000000..d2da711448ada6 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-12-11-18-04-38.bpo-31904.j3j6d8.rst @@ -0,0 +1 @@ +Enable libpython3.so for VxWorks. diff --git a/configure b/configure index 0c0aee96d507d2..d9e610ea4d0cb7 100755 --- a/configure +++ b/configure @@ -5937,7 +5937,7 @@ $as_echo "#define Py_ENABLE_SHARED 1" >>confdefs.h PY3LIBRARY=libpython3.so fi ;; - Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*) + Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|VxWorks*) LDLIBRARY='libpython$(LDVERSION).so' BLDLIBRARY='-L. -lpython$(LDVERSION)' RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} @@ -9721,7 +9721,7 @@ then # when running test_compile.py. LINKFORSHARED='-Wl,-E -N 2048K';; VxWorks*) - LINKFORSHARED='--export-dynamic';; + LINKFORSHARED='-Wl,-export-dynamic';; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINKFORSHARED" >&5 diff --git a/configure.ac b/configure.ac index 31e39ec4f7d4c7..445dae13587486 100644 --- a/configure.ac +++ b/configure.ac @@ -1133,7 +1133,7 @@ if test $enable_shared = "yes"; then PY3LIBRARY=libpython3.so fi ;; - Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*) + Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|VxWorks*) LDLIBRARY='libpython$(LDVERSION).so' BLDLIBRARY='-L. -lpython$(LDVERSION)' RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} @@ -2798,7 +2798,7 @@ then # when running test_compile.py. LINKFORSHARED='-Wl,-E -N 2048K';; VxWorks*) - LINKFORSHARED='--export-dynamic';; + LINKFORSHARED='-Wl,-export-dynamic';; esac fi AC_MSG_RESULT($LINKFORSHARED) From 6a3d27b4d3b186c86abecfc7316f007755c0ac48 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 15 Dec 2020 00:24:01 -0500 Subject: [PATCH 0777/1261] bpo-33610: Edit idlelib.codecontext (GH-23773) Add sentence to module docstring and import tkinter items. --- Lib/idlelib/codecontext.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Lib/idlelib/codecontext.py b/Lib/idlelib/codecontext.py index 989b30e5994650..eb19773f56e34b 100644 --- a/Lib/idlelib/codecontext.py +++ b/Lib/idlelib/codecontext.py @@ -7,11 +7,14 @@ enclosing block. The number of hint lines is determined by the maxlines variable in the codecontext section of config-extensions.def. Lines which do not open blocks are not shown in the context hints pane. + +For EditorWindows, <> is bound to CodeContext(self). +toggle_code_context_event. """ import re from sys import maxsize as INFINITY -import tkinter +from tkinter import Frame, Text, TclError from tkinter.constants import NSEW, SUNKEN from idlelib.config import idleConf @@ -83,7 +86,7 @@ def __del__(self): if self.t1 is not None: try: self.text.after_cancel(self.t1) - except tkinter.TclError: # pragma: no cover + except TclError: # pragma: no cover pass self.t1 = None @@ -111,7 +114,7 @@ def toggle_code_context_event(self, event=None): padx += widget.tk.getint(info['padx']) padx += widget.tk.getint(widget.cget('padx')) border += widget.tk.getint(widget.cget('border')) - context = self.context = tkinter.Text( + context = self.context = Text( self.editwin.text_frame, height=1, width=1, # Don't request more than we get. @@ -127,7 +130,7 @@ def toggle_code_context_event(self, event=None): line_number_colors = idleConf.GetHighlight(idleConf.CurrentTheme(), 'linenumber') - self.cell00 = tkinter.Frame(self.editwin.text_frame, + self.cell00 = Frame(self.editwin.text_frame, bg=line_number_colors['background']) self.cell00.grid(row=0, column=0, sticky=NSEW) menu_status = 'Hide' @@ -221,7 +224,7 @@ def jumptoline(self, event=None): """ try: self.context.index("sel.first") - except tkinter.TclError: + except TclError: lines = len(self.info) if lines == 1: # No context lines are showing. newtop = 1 From d3ed8d2529bbd06d98fbe6733b02bb15e45c70d7 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Tue, 15 Dec 2020 11:07:50 +0000 Subject: [PATCH 0778/1261] bpo-42246: Remove DO_NOT_EMIT_BYTECODE macros, so that while loops and if statements conform to PEP 626. (GH-23743) --- Lib/test/test_compile.py | 8 +- Lib/test/test_dis.py | 137 +- Lib/test/test_peepholer.py | 15 - Lib/test/test_sys_settrace.py | 12 +- Python/compile.c | 112 +- Python/importlib.h | 3409 +++++++++++++++++---------------- Python/importlib_external.h | 2139 ++++++++++----------- Python/importlib_zipimport.h | 1199 ++++++------ 8 files changed, 3486 insertions(+), 3545 deletions(-) diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 0d11ce940f81ae..3a37b6cf30bfcc 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -728,10 +728,10 @@ def unused_block_while_else(): for func in funcs: opcodes = list(dis.get_instructions(func)) - self.assertEqual(2, len(opcodes)) - self.assertEqual('LOAD_CONST', opcodes[0].opname) - self.assertEqual(None, opcodes[0].argval) - self.assertEqual('RETURN_VALUE', opcodes[1].opname) + self.assertLessEqual(len(opcodes), 3) + self.assertEqual('LOAD_CONST', opcodes[-2].opname) + self.assertEqual(None, opcodes[-2].argval) + self.assertEqual('RETURN_VALUE', opcodes[-1].opname) def test_false_while_loop(self): def break_in_while(): diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 56d877151838f0..eb931703d51ed1 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -269,11 +269,14 @@ def bug42562(): 1 0 LOAD_CONST 0 (0) 2 STORE_NAME 0 (x) - 3 >> 4 LOAD_NAME 0 (x) - 6 LOAD_CONST 1 (1) - 8 INPLACE_ADD - 10 STORE_NAME 0 (x) - 12 JUMP_ABSOLUTE 4 + 2 4 NOP + + 3 >> 6 LOAD_NAME 0 (x) + 8 LOAD_CONST 1 (1) + 10 INPLACE_ADD + 12 STORE_NAME 0 (x) + + 2 14 JUMP_ABSOLUTE 6 """ dis_traceback = """\ @@ -1036,8 +1039,8 @@ def jumpy(): Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=46, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=48, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=50, starts_line=11, is_jump_target=True), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=90, argval=90, argrepr='', offset=52, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=54, starts_line=12, is_jump_target=False), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=94, argval=94, argrepr='', offset=52, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=54, starts_line=12, is_jump_target=True), Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=56, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=58, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False), @@ -1053,67 +1056,69 @@ def jumpy(): Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=80, starts_line=16, is_jump_target=True), Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=82, starts_line=None, is_jump_target=False), Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=84, starts_line=None, is_jump_target=False), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=50, argval=50, argrepr='', offset=86, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=98, argval=98, argrepr='', offset=88, starts_line=17, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=90, starts_line=19, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=92, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=94, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=96, starts_line=None, is_jump_target=False), - Instruction(opname='SETUP_FINALLY', opcode=122, arg=98, argval=198, argrepr='to 198', offset=98, starts_line=20, is_jump_target=True), - Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=114, argrepr='to 114', offset=100, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=102, starts_line=21, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=104, starts_line=None, is_jump_target=False), - Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=106, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=108, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=140, argrepr='to 140', offset=112, starts_line=None, is_jump_target=False), - Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=114, starts_line=22, is_jump_target=True), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=116, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_IF_NOT_EXC_MATCH', opcode=121, arg=138, argval=138, argrepr='', offset=118, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=120, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=122, starts_line=None, is_jump_target=False), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=90, argval=90, argrepr='', offset=86, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=102, argval=102, argrepr='', offset=88, starts_line=17, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=90, starts_line=11, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=54, argval=54, argrepr='', offset=92, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=94, starts_line=19, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=96, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=98, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=100, starts_line=None, is_jump_target=False), + Instruction(opname='SETUP_FINALLY', opcode=122, arg=98, argval=202, argrepr='to 202', offset=102, starts_line=20, is_jump_target=True), + Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=118, argrepr='to 118', offset=104, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=106, starts_line=21, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), + Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=144, argrepr='to 144', offset=116, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=118, starts_line=22, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=120, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_IF_NOT_EXC_MATCH', opcode=121, arg=142, argval=142, argrepr='', offset=122, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=124, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=126, starts_line=23, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=128, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=130, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=132, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=134, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=46, argval=184, argrepr='to 184', offset=136, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=140, starts_line=25, is_jump_target=True), - Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=168, argrepr='to 168', offset=142, starts_line=None, is_jump_target=False), - Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=144, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=146, starts_line=26, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=148, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=150, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=152, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=154, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=156, starts_line=None, is_jump_target=False), - Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), - Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=162, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=184, argrepr='to 184', offset=166, starts_line=None, is_jump_target=False), - Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=True), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=174, argval=174, argrepr='', offset=170, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=174, starts_line=None, is_jump_target=True), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=176, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=126, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=128, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=130, starts_line=23, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=132, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=134, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=136, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=46, argval=188, argrepr='to 188', offset=140, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=142, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, starts_line=25, is_jump_target=True), + Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=172, argrepr='to 172', offset=146, starts_line=None, is_jump_target=False), + Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=148, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=150, starts_line=26, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=152, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=154, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=156, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=160, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=162, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=166, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=188, argrepr='to 188', offset=170, starts_line=None, is_jump_target=False), + Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=178, argval=178, argrepr='', offset=174, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=176, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=True), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=186, starts_line=28, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=188, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=190, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=192, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=194, starts_line=None, is_jump_target=False), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=196, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=198, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=200, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=202, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=204, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=206, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=188, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=190, starts_line=28, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=192, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=194, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=196, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=198, starts_line=None, is_jump_target=False), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=200, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=202, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=204, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=206, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=208, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=210, starts_line=None, is_jump_target=False), ] # One last piece of inspect fodder to check the default line number handling diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 92a82cc54f2686..4034154e4dcfb5 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -409,21 +409,6 @@ def f(cond1, cond2): self.assertLessEqual(len(returns), 6) self.check_lnotab(f) - def test_elim_jump_after_return2(self): - # Eliminate dead code: jumps immediately after returns can't be reached - def f(cond1, cond2): - while 1: - if cond1: return 4 - self.assertNotInBytecode(f, 'JUMP_FORWARD') - # There should be one jump for the while loop. - jumps = [instr for instr in dis.get_instructions(f) - if 'JUMP' in instr.opname] - self.assertEqual(len(jumps), 1) - returns = [instr for instr in dis.get_instructions(f) - if instr.opname == 'RETURN_VALUE'] - self.assertLessEqual(len(returns), 2) - self.check_lnotab(f) - def test_make_function_doesnt_bail(self): def f(): def g()->1+1: diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 37013e51c94b11..a842139cd8e4ca 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -53,9 +53,8 @@ def basic(): # following that clause? -# Some constructs like "while 0:", "if 0:" or "if 1:...else:..." are optimized -# away. No code # exists for them, so the line numbers skip directly from -# "del x" to "x = 1". +# Some constructs like "while 0:", "if 0:" or "if 1:...else:..." could be optimized +# away. Make sure that those lines aren't skipped. def arigo_example0(): x = 1 del x @@ -66,6 +65,7 @@ def arigo_example0(): arigo_example0.events = [(0, 'call'), (1, 'line'), (2, 'line'), + (3, 'line'), (5, 'line'), (5, 'return')] @@ -79,6 +79,7 @@ def arigo_example1(): arigo_example1.events = [(0, 'call'), (1, 'line'), (2, 'line'), + (3, 'line'), (5, 'line'), (5, 'return')] @@ -94,6 +95,7 @@ def arigo_example2(): arigo_example2.events = [(0, 'call'), (1, 'line'), (2, 'line'), + (3, 'line'), (4, 'line'), (7, 'line'), (7, 'return')] @@ -236,9 +238,13 @@ def tightloop_example(): (1, 'line'), (2, 'line'), (3, 'line'), + (4, 'line'), (5, 'line'), + (4, 'line'), (5, 'line'), + (4, 'line'), (5, 'line'), + (4, 'line'), (5, 'line'), (5, 'exception'), (6, 'line'), diff --git a/Python/compile.c b/Python/compile.c index c7a0ae402bf234..ae92869fc9565b 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -228,7 +228,7 @@ static int compiler_slice(struct compiler *, expr_ty); static int inplace_binop(operator_ty); static int are_all_items_const(asdl_expr_seq *, Py_ssize_t, Py_ssize_t); -static int expr_constant(expr_ty); + static int compiler_with(struct compiler *, stmt_ty, int); static int compiler_async_with(struct compiler *, stmt_ty, int); @@ -1572,17 +1572,6 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b) } \ } -/* These macros allows to check only for errors and not emmit bytecode - * while visiting nodes. -*/ - -#define BEGIN_DO_NOT_EMIT_BYTECODE { \ - c->c_do_not_emit_bytecode++; - -#define END_DO_NOT_EMIT_BYTECODE \ - c->c_do_not_emit_bytecode--; \ -} - /* Search if variable annotations are present statically in a block. */ static int @@ -2704,48 +2693,28 @@ static int compiler_if(struct compiler *c, stmt_ty s) { basicblock *end, *next; - int constant; assert(s->kind == If_kind); end = compiler_new_block(c); - if (end == NULL) + if (end == NULL) { return 0; - - constant = expr_constant(s->v.If.test); - /* constant = 0: "if 0" - * constant = 1: "if 1", "if 2", ... - * constant = -1: rest */ - if (constant == 0) { - BEGIN_DO_NOT_EMIT_BYTECODE - VISIT_SEQ(c, stmt, s->v.If.body); - END_DO_NOT_EMIT_BYTECODE - if (s->v.If.orelse) { - VISIT_SEQ(c, stmt, s->v.If.orelse); - } - } else if (constant == 1) { - VISIT_SEQ(c, stmt, s->v.If.body); - if (s->v.If.orelse) { - BEGIN_DO_NOT_EMIT_BYTECODE - VISIT_SEQ(c, stmt, s->v.If.orelse); - END_DO_NOT_EMIT_BYTECODE - } - } else { - if (asdl_seq_LEN(s->v.If.orelse)) { - next = compiler_new_block(c); - if (next == NULL) - return 0; - } - else { - next = end; - } - if (!compiler_jump_if(c, s->v.If.test, next, 0)) { + } + if (asdl_seq_LEN(s->v.If.orelse)) { + next = compiler_new_block(c); + if (next == NULL) { return 0; } - VISIT_SEQ(c, stmt, s->v.If.body); - if (asdl_seq_LEN(s->v.If.orelse)) { - ADDOP_JUMP(c, JUMP_FORWARD, end); - compiler_use_next_block(c, next); - VISIT_SEQ(c, stmt, s->v.If.orelse); - } + } + else { + next = end; + } + if (!compiler_jump_if(c, s->v.If.test, next, 0)) { + return 0; + } + VISIT_SEQ(c, stmt, s->v.If.body); + if (asdl_seq_LEN(s->v.If.orelse)) { + ADDOP_JUMP(c, JUMP_FORWARD, end); + compiler_use_next_block(c, next); + VISIT_SEQ(c, stmt, s->v.If.orelse); } compiler_use_next_block(c, end); return 1; @@ -2842,25 +2811,6 @@ static int compiler_while(struct compiler *c, stmt_ty s) { basicblock *loop, *body, *end, *anchor = NULL; - int constant = expr_constant(s->v.While.test); - - if (constant == 0) { - BEGIN_DO_NOT_EMIT_BYTECODE - // Push a dummy block so the VISIT_SEQ knows that we are - // inside a while loop so it can correctly evaluate syntax - // errors. - if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL, NULL)) { - return 0; - } - VISIT_SEQ(c, stmt, s->v.While.body); - // Remove the dummy block now that is not needed. - compiler_pop_fblock(c, WHILE_LOOP, NULL); - END_DO_NOT_EMIT_BYTECODE - if (s->v.While.orelse) { - VISIT_SEQ(c, stmt, s->v.While.orelse); - } - return 1; - } loop = compiler_new_block(c); body = compiler_new_block(c); anchor = compiler_new_block(c); @@ -2872,15 +2822,16 @@ compiler_while(struct compiler *c, stmt_ty s) if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL)) { return 0; } - if (constant == -1) { - if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) { - return 0; - } + if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) { + return 0; } compiler_use_next_block(c, body); VISIT_SEQ(c, stmt, s->v.While.body); - ADDOP_JUMP(c, JUMP_ABSOLUTE, loop); + SET_LOC(c, s); + if (!compiler_jump_if(c, s->v.While.test, body, 1)) { + return 0; + } compiler_pop_fblock(c, WHILE_LOOP, loop); @@ -4791,15 +4742,6 @@ compiler_visit_keyword(struct compiler *c, keyword_ty k) Return values: 1 for true, 0 for false, -1 for non-constant. */ -static int -expr_constant(expr_ty e) -{ - if (e->kind == Constant_kind) { - return PyObject_IsTrue(e->v.Constant.value); - } - return -1; -} - static int compiler_with_except_finish(struct compiler *c) { basicblock *exit; @@ -6304,7 +6246,7 @@ optimize_basic_block(basicblock *bb, PyObject *consts) case JUMP_FORWARD: if (inst->i_target != target->i_target) { inst->i_target = target->i_target; - --i; +// --i; } break; case JUMP_ABSOLUTE: @@ -6317,8 +6259,8 @@ optimize_basic_block(basicblock *bb, PyObject *consts) } if (inst->i_target->b_exit && inst->i_target->b_iused <= MAX_COPY_SIZE) { basicblock *to_copy = inst->i_target; - *inst = to_copy->b_instr[0]; - for (i = 1; i < to_copy->b_iused; i++) { + inst->i_opcode = NOP; + for (i = 0; i < to_copy->b_iused; i++) { int index = compiler_next_instr(bb); if (index < 0) { return -1; diff --git a/Python/importlib.h b/Python/importlib.h index fce7d863db7b73..e05c8ea391474f 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -131,1724 +131,1725 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 6,1,10,1,255,128,122,20,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,0,0,0,0,5,0,0,0,3,0,0, - 0,67,0,0,0,115,84,0,0,0,116,0,160,1,161,0, - 125,1,124,0,106,2,125,2,116,3,131,0,125,3,116,4, - 160,5,124,2,161,1,125,4,124,4,100,0,117,0,114,42, - 100,1,83,0,124,4,106,2,125,2,124,2,124,1,107,2, - 114,60,100,2,83,0,124,2,124,3,118,0,114,72,100,1, - 83,0,124,3,160,6,124,2,161,1,1,0,113,20,41,3, - 78,70,84,41,7,114,26,0,0,0,218,9,103,101,116,95, - 105,100,101,110,116,114,29,0,0,0,218,3,115,101,116,218, - 12,95,98,108,111,99,107,105,110,103,95,111,110,218,3,103, - 101,116,218,3,97,100,100,41,5,114,33,0,0,0,90,2, - 109,101,218,3,116,105,100,90,4,115,101,101,110,114,27,0, + 0,67,0,0,0,115,86,0,0,0,116,0,160,1,161,0, + 125,1,124,0,106,2,125,2,116,3,131,0,125,3,9,0, + 116,4,160,5,124,2,161,1,125,4,124,4,100,0,117,0, + 114,44,100,2,83,0,124,4,106,2,125,2,124,2,124,1, + 107,2,114,62,100,1,83,0,124,2,124,3,118,0,114,74, + 100,2,83,0,124,3,160,6,124,2,161,1,1,0,113,22, + 41,3,78,84,70,41,7,114,26,0,0,0,218,9,103,101, + 116,95,105,100,101,110,116,114,29,0,0,0,218,3,115,101, + 116,218,12,95,98,108,111,99,107,105,110,103,95,111,110,218, + 3,103,101,116,218,3,97,100,100,41,5,114,33,0,0,0, + 90,2,109,101,218,3,116,105,100,90,4,115,101,101,110,114, + 27,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,12,104,97,115,95,100,101,97,100,108,111,99, + 107,79,0,0,0,115,30,0,0,0,8,2,6,1,6,1, + 2,1,10,1,8,1,4,1,6,1,8,1,4,1,8,1, + 4,6,10,1,2,242,255,128,122,24,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,0,0,0,0,2, + 0,0,0,8,0,0,0,67,0,0,0,115,198,0,0,0, + 116,0,160,1,161,0,125,1,124,0,116,2,124,1,60,0, + 122,172,9,0,124,0,106,3,143,126,1,0,124,0,106,4, + 100,2,107,2,115,48,124,0,106,5,124,1,107,2,114,92, + 124,1,124,0,95,5,124,0,4,0,106,4,100,3,55,0, + 2,0,95,4,87,0,100,4,4,0,4,0,131,3,1,0, + 87,0,116,2,124,1,61,0,100,1,83,0,124,0,160,6, + 161,0,114,112,116,7,100,5,124,0,22,0,131,1,130,1, + 124,0,106,8,160,9,100,6,161,1,114,138,124,0,4,0, + 106,10,100,3,55,0,2,0,95,10,87,0,100,4,4,0, + 4,0,131,3,1,0,110,16,49,0,115,158,48,0,1,0, + 1,0,1,0,89,0,1,0,124,0,106,8,160,9,161,0, + 1,0,124,0,106,8,160,11,161,0,1,0,113,20,116,2, + 124,1,61,0,48,0,41,7,122,185,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,84,114,25,0,0,0,233,1,0,0,0,78,122, + 23,100,101,97,100,108,111,99,107,32,100,101,116,101,99,116, + 101,100,32,98,121,32,37,114,70,41,12,114,26,0,0,0, + 114,35,0,0,0,114,37,0,0,0,114,27,0,0,0,114, + 30,0,0,0,114,29,0,0,0,114,41,0,0,0,114,22, + 0,0,0,114,28,0,0,0,218,7,97,99,113,117,105,114, + 101,114,31,0,0,0,218,7,114,101,108,101,97,115,101,169, + 2,114,33,0,0,0,114,40,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,43,0,0,0,100, + 0,0,0,115,40,0,0,0,8,6,8,1,2,1,2,1, + 8,1,20,1,6,1,14,1,14,1,6,9,4,247,8,1, + 12,1,12,1,44,1,10,2,10,1,2,244,8,14,255,128, + 122,19,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,0,0, + 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,144, + 0,0,0,116,0,160,1,161,0,125,1,124,0,106,2,143, + 110,1,0,124,0,106,3,124,1,107,3,114,34,116,4,100, + 1,131,1,130,1,124,0,106,5,100,2,107,4,115,48,74, + 0,130,1,124,0,4,0,106,5,100,3,56,0,2,0,95, + 5,124,0,106,5,100,2,107,2,114,108,100,0,124,0,95, + 3,124,0,106,6,114,108,124,0,4,0,106,6,100,3,56, + 0,2,0,95,6,124,0,106,7,160,8,161,0,1,0,87, + 0,100,0,4,0,4,0,131,3,1,0,100,0,83,0,49, + 0,115,130,48,0,1,0,1,0,1,0,89,0,1,0,100, + 0,83,0,41,4,78,250,31,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,114,25,0,0,0,114,42,0,0, + 0,41,9,114,26,0,0,0,114,35,0,0,0,114,27,0, + 0,0,114,29,0,0,0,218,12,82,117,110,116,105,109,101, + 69,114,114,111,114,114,30,0,0,0,114,31,0,0,0,114, + 28,0,0,0,114,44,0,0,0,114,45,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,44,0, + 0,0,125,0,0,0,115,24,0,0,0,8,1,8,1,10, + 1,8,1,14,1,14,1,10,1,6,1,6,1,14,1,46, + 1,255,128,122,19,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,0,0,0,0,1,0,0,0,5,0,0,0,67,0,0, + 0,115,18,0,0,0,100,1,160,0,124,0,106,1,116,2, + 124,0,131,1,161,2,83,0,41,2,78,122,23,95,77,111, + 100,117,108,101,76,111,99,107,40,123,33,114,125,41,32,97, + 116,32,123,125,169,3,218,6,102,111,114,109,97,116,114,20, + 0,0,0,218,2,105,100,169,1,114,33,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,8,95, + 95,114,101,112,114,95,95,138,0,0,0,115,4,0,0,0, + 18,1,255,128,122,20,95,77,111,100,117,108,101,76,111,99, + 107,46,95,95,114,101,112,114,95,95,78,41,9,114,9,0, + 0,0,114,8,0,0,0,114,1,0,0,0,114,10,0,0, + 0,114,34,0,0,0,114,41,0,0,0,114,43,0,0,0, + 114,44,0,0,0,114,52,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,23, + 0,0,0,65,0,0,0,115,16,0,0,0,8,0,4,1, + 8,5,8,8,8,21,8,25,12,13,255,128,114,23,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,64,0,0,0,115,48,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, + 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,132, + 0,90,6,100,8,100,9,132,0,90,7,100,10,83,0,41, + 11,218,16,95,68,117,109,109,121,77,111,100,117,108,101,76, + 111,99,107,122,86,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,0,0,0,0,2,0,0,0,2,0,0,0, + 67,0,0,0,115,16,0,0,0,124,1,124,0,95,0,100, + 1,124,0,95,1,100,0,83,0,114,24,0,0,0,41,2, + 114,20,0,0,0,114,30,0,0,0,114,32,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,34, + 0,0,0,146,0,0,0,115,6,0,0,0,6,1,10,1, + 255,128,122,25,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,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,18,0,0,0,124,0,4,0,106, + 0,100,1,55,0,2,0,95,0,100,2,83,0,41,3,78, + 114,42,0,0,0,84,41,1,114,30,0,0,0,114,51,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,12,104,97,115,95,100,101,97,100,108,111,99,107,79, - 0,0,0,115,26,0,0,0,8,2,6,1,6,1,10,2, - 8,1,4,1,6,1,8,1,4,1,8,1,4,6,12,1, - 255,128,122,24,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,0,0,0,0,2,0,0,0,8,0,0, - 0,67,0,0,0,115,196,0,0,0,116,0,160,1,161,0, - 125,1,124,0,116,2,124,1,60,0,122,170,124,0,106,3, - 143,126,1,0,124,0,106,4,100,1,107,2,115,46,124,0, - 106,5,124,1,107,2,114,90,124,1,124,0,95,5,124,0, - 4,0,106,4,100,2,55,0,2,0,95,4,87,0,100,3, - 4,0,4,0,131,3,1,0,87,0,116,2,124,1,61,0, - 100,4,83,0,124,0,160,6,161,0,114,110,116,7,100,5, - 124,0,22,0,131,1,130,1,124,0,106,8,160,9,100,6, - 161,1,114,136,124,0,4,0,106,10,100,2,55,0,2,0, - 95,10,87,0,100,3,4,0,4,0,131,3,1,0,110,16, - 49,0,115,156,48,0,1,0,1,0,1,0,89,0,1,0, - 124,0,106,8,160,9,161,0,1,0,124,0,106,8,160,11, - 161,0,1,0,113,18,116,2,124,1,61,0,48,0,41,7, - 122,185,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,114,25,0,0,0, - 233,1,0,0,0,78,84,122,23,100,101,97,100,108,111,99, - 107,32,100,101,116,101,99,116,101,100,32,98,121,32,37,114, - 70,41,12,114,26,0,0,0,114,35,0,0,0,114,37,0, - 0,0,114,27,0,0,0,114,30,0,0,0,114,29,0,0, - 0,114,41,0,0,0,114,22,0,0,0,114,28,0,0,0, - 218,7,97,99,113,117,105,114,101,114,31,0,0,0,218,7, - 114,101,108,101,97,115,101,169,2,114,33,0,0,0,114,40, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,43,0,0,0,100,0,0,0,115,36,0,0,0, - 8,6,8,1,2,1,8,2,20,1,6,1,14,1,14,1, - 6,9,4,247,8,1,12,1,12,1,44,1,10,2,12,1, - 8,2,255,128,122,19,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,114,43,0,0,0,150,0,0,0,115,6,0,0,0,14, + 1,4,1,255,128,122,24,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,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,36,0,0,0,124,0,106, + 0,100,1,107,2,114,18,116,1,100,2,131,1,130,1,124, + 0,4,0,106,0,100,3,56,0,2,0,95,0,100,0,83, + 0,41,4,78,114,25,0,0,0,114,46,0,0,0,114,42, + 0,0,0,41,2,114,30,0,0,0,114,47,0,0,0,114, + 51,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,44,0,0,0,154,0,0,0,115,8,0,0, + 0,10,1,8,1,18,1,255,128,122,24,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,0,0,0,0, + 1,0,0,0,5,0,0,0,67,0,0,0,115,18,0,0, + 0,100,1,160,0,124,0,106,1,116,2,124,0,131,1,161, + 2,83,0,41,2,78,122,28,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,114,48,0,0,0,114,51,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,52,0, + 0,0,159,0,0,0,115,4,0,0,0,18,1,255,128,122, + 25,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,41,8,114,9,0, + 0,0,114,8,0,0,0,114,1,0,0,0,114,10,0,0, + 0,114,34,0,0,0,114,43,0,0,0,114,44,0,0,0, + 114,52,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,53,0,0,0,142,0, + 0,0,115,14,0,0,0,8,0,4,1,8,3,8,4,8, + 4,12,5,255,128,114,53,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,36,0,0,0,101,0,90,1,100,0,90,2, + 100,1,100,2,132,0,90,3,100,3,100,4,132,0,90,4, + 100,5,100,6,132,0,90,5,100,7,83,0,41,8,218,18, + 95,77,111,100,117,108,101,76,111,99,107,77,97,110,97,103, + 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, + 124,1,124,0,95,0,100,0,124,0,95,1,100,0,83,0, + 114,0,0,0,0,41,2,218,5,95,110,97,109,101,218,5, + 95,108,111,99,107,114,32,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,34,0,0,0,165,0, + 0,0,115,6,0,0,0,6,1,10,1,255,128,122,27,95, + 77,111,100,117,108,101,76,111,99,107,77,97,110,97,103,101, + 114,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, + 0,0,0,115,26,0,0,0,116,0,124,0,106,1,131,1, + 124,0,95,2,124,0,106,2,160,3,161,0,1,0,100,0, + 83,0,114,0,0,0,0,41,4,218,16,95,103,101,116,95, + 109,111,100,117,108,101,95,108,111,99,107,114,55,0,0,0, + 114,56,0,0,0,114,43,0,0,0,114,51,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,9, + 95,95,101,110,116,101,114,95,95,169,0,0,0,115,6,0, + 0,0,12,1,14,1,255,128,122,28,95,77,111,100,117,108, + 101,76,111,99,107,77,97,110,97,103,101,114,46,95,95,101, + 110,116,101,114,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,2,0,0,0,79,0,0,0,115, + 14,0,0,0,124,0,106,0,160,1,161,0,1,0,100,0, + 83,0,114,0,0,0,0,41,2,114,56,0,0,0,114,44, + 0,0,0,41,3,114,33,0,0,0,218,4,97,114,103,115, + 90,6,107,119,97,114,103,115,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,8,95,95,101,120,105,116,95, + 95,173,0,0,0,115,4,0,0,0,14,1,255,128,122,27, + 95,77,111,100,117,108,101,76,111,99,107,77,97,110,97,103, + 101,114,46,95,95,101,120,105,116,95,95,78,41,6,114,9, + 0,0,0,114,8,0,0,0,114,1,0,0,0,114,34,0, + 0,0,114,58,0,0,0,114,60,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 114,54,0,0,0,163,0,0,0,115,10,0,0,0,8,0, + 8,2,8,4,12,4,255,128,114,54,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0, + 0,0,67,0,0,0,115,134,0,0,0,116,0,160,1,161, + 0,1,0,122,114,122,14,116,2,124,0,25,0,131,0,125, + 1,87,0,110,22,4,0,116,3,121,46,1,0,1,0,1, + 0,100,1,125,1,89,0,110,2,48,0,124,1,100,1,117, + 0,114,110,116,4,100,1,117,0,114,74,116,5,124,0,131, + 1,125,1,110,8,116,6,124,0,131,1,125,1,124,0,102, + 1,100,2,100,3,132,1,125,2,116,7,160,8,124,1,124, + 2,161,2,116,2,124,0,60,0,87,0,116,0,160,9,161, + 0,1,0,124,1,83,0,116,0,160,9,161,0,1,0,48, + 0,41,4,122,139,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,65,99,113,117,105,114,101,47,114,101,108,101,97,115,101, + 32,105,110,116,101,114,110,97,108,108,121,32,116,104,101,32, + 103,108,111,98,97,108,32,105,109,112,111,114,116,32,108,111, + 99,107,32,116,111,32,112,114,111,116,101,99,116,10,32,32, + 32,32,95,109,111,100,117,108,101,95,108,111,99,107,115,46, + 78,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,8,0,0,0,83,0,0,0,115,54,0,0,0,116, + 0,160,1,161,0,1,0,122,34,116,2,160,3,124,1,161, + 1,124,0,117,0,114,30,116,2,124,1,61,0,87,0,116, + 0,160,4,161,0,1,0,100,0,83,0,116,0,160,4,161, + 0,1,0,48,0,114,0,0,0,0,41,5,218,4,95,105, + 109,112,218,12,97,99,113,117,105,114,101,95,108,111,99,107, + 218,13,95,109,111,100,117,108,101,95,108,111,99,107,115,114, + 38,0,0,0,218,12,114,101,108,101,97,115,101,95,108,111, + 99,107,41,2,218,3,114,101,102,114,20,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,2,99, + 98,198,0,0,0,115,14,0,0,0,8,1,2,1,14,4, + 6,1,2,128,22,2,255,128,122,28,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,41,10,114,61,0,0,0,114,62,0, + 0,0,114,63,0,0,0,218,8,75,101,121,69,114,114,111, + 114,114,26,0,0,0,114,53,0,0,0,114,23,0,0,0, + 218,8,95,119,101,97,107,114,101,102,114,65,0,0,0,114, + 64,0,0,0,41,3,114,20,0,0,0,114,27,0,0,0, + 114,66,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,57,0,0,0,179,0,0,0,115,34,0, + 0,0,8,6,2,1,2,1,14,1,12,1,10,1,8,2, + 8,1,10,1,8,2,12,2,16,11,2,128,8,2,4,2, + 10,254,255,128,114,57,0,0,0,99,1,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,8,0,0,0,67,0, - 0,0,115,144,0,0,0,116,0,160,1,161,0,125,1,124, - 0,106,2,143,110,1,0,124,0,106,3,124,1,107,3,114, - 34,116,4,100,1,131,1,130,1,124,0,106,5,100,2,107, - 4,115,48,74,0,130,1,124,0,4,0,106,5,100,3,56, - 0,2,0,95,5,124,0,106,5,100,2,107,2,114,108,100, - 0,124,0,95,3,124,0,106,6,114,108,124,0,4,0,106, - 6,100,3,56,0,2,0,95,6,124,0,106,7,160,8,161, - 0,1,0,87,0,100,0,4,0,4,0,131,3,1,0,100, - 0,83,0,49,0,115,130,48,0,1,0,1,0,1,0,89, - 0,1,0,100,0,83,0,41,4,78,250,31,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,114,25,0,0,0, - 114,42,0,0,0,41,9,114,26,0,0,0,114,35,0,0, - 0,114,27,0,0,0,114,29,0,0,0,218,12,82,117,110, - 116,105,109,101,69,114,114,111,114,114,30,0,0,0,114,31, - 0,0,0,114,28,0,0,0,114,44,0,0,0,114,45,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,44,0,0,0,125,0,0,0,115,24,0,0,0,8, - 1,8,1,10,1,8,1,14,1,14,1,10,1,6,1,6, - 1,14,1,46,1,255,128,122,19,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,0,0,0,0,1,0,0,0,5,0,0, - 0,67,0,0,0,115,18,0,0,0,100,1,160,0,124,0, - 106,1,116,2,124,0,131,1,161,2,83,0,41,2,78,122, - 23,95,77,111,100,117,108,101,76,111,99,107,40,123,33,114, - 125,41,32,97,116,32,123,125,169,3,218,6,102,111,114,109, - 97,116,114,20,0,0,0,218,2,105,100,169,1,114,33,0, + 0,0,115,54,0,0,0,116,0,124,0,131,1,125,1,122, + 12,124,1,160,1,161,0,1,0,87,0,110,20,4,0,116, + 2,121,40,1,0,1,0,1,0,89,0,100,1,83,0,48, + 0,124,1,160,3,161,0,1,0,100,1,83,0,41,2,122, + 189,65,99,113,117,105,114,101,115,32,116,104,101,110,32,114, + 101,108,101,97,115,101,115,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,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,32,32,32,32,78,41, + 4,114,57,0,0,0,114,43,0,0,0,114,22,0,0,0, + 114,44,0,0,0,41,2,114,20,0,0,0,114,27,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,19,95,108,111,99,107,95,117,110,108,111,99,107,95,109, + 111,100,117,108,101,216,0,0,0,115,14,0,0,0,8,6, + 2,1,12,1,12,1,8,3,12,2,255,128,114,69,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,4,0,0,0,79,0,0,0,115,14,0,0,0,124, + 0,124,1,105,0,124,2,164,1,142,1,83,0,41,2,97, + 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,78,114,5,0,0,0,41,3,218,1,102,114,59,0, + 0,0,90,4,107,119,100,115,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,25,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,233,0,0,0,115,4,0,0,0,14,8,255,128,114, + 71,0,0,0,114,42,0,0,0,41,1,218,9,118,101,114, + 98,111,115,105,116,121,99,1,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,4,0,0,0,71,0,0,0,115, + 58,0,0,0,116,0,106,1,106,2,124,1,107,5,114,54, + 124,0,160,3,100,1,161,1,115,30,100,2,124,0,23,0, + 125,0,116,4,124,0,106,5,124,2,142,0,116,0,106,6, + 100,3,141,2,1,0,100,4,83,0,100,4,83,0,41,5, + 122,61,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,41, + 2,250,1,35,122,7,105,109,112,111,114,116,32,122,2,35, + 32,41,1,90,4,102,105,108,101,78,41,7,114,18,0,0, + 0,218,5,102,108,97,103,115,218,7,118,101,114,98,111,115, + 101,218,10,115,116,97,114,116,115,119,105,116,104,218,5,112, + 114,105,110,116,114,49,0,0,0,218,6,115,116,100,101,114, + 114,41,3,218,7,109,101,115,115,97,103,101,114,72,0,0, + 0,114,59,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,16,95,118,101,114,98,111,115,101,95, + 109,101,115,115,97,103,101,244,0,0,0,115,12,0,0,0, + 12,2,10,1,8,1,24,1,4,253,255,128,114,80,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,3,0,0,0,115,26,0,0,0,135, + 0,102,1,100,1,100,2,132,8,125,1,116,0,124,1,136, + 0,131,2,1,0,124,1,83,0,41,4,122,49,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,0,0,0,0,2,0,0,0,4, + 0,0,0,19,0,0,0,115,38,0,0,0,124,1,116,0, + 106,1,118,1,114,28,116,2,100,1,160,3,124,1,161,1, + 124,1,100,2,141,2,130,1,136,0,124,0,124,1,131,2, + 83,0,41,3,78,250,29,123,33,114,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,114,19,0,0,0,41,4,114,18,0,0,0, + 218,20,98,117,105,108,116,105,110,95,109,111,100,117,108,101, + 95,110,97,109,101,115,218,11,73,109,112,111,114,116,69,114, + 114,111,114,114,49,0,0,0,169,2,114,33,0,0,0,218, + 8,102,117,108,108,110,97,109,101,169,1,218,3,102,120,110, + 114,5,0,0,0,114,6,0,0,0,218,25,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,254,0,0,0,115,12,0,0,0,10,1, + 10,1,2,1,6,255,10,2,255,128,122,52,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, + 78,169,1,114,17,0,0,0,41,2,114,87,0,0,0,114, + 88,0,0,0,114,5,0,0,0,114,86,0,0,0,114,6, + 0,0,0,218,17,95,114,101,113,117,105,114,101,115,95,98, + 117,105,108,116,105,110,252,0,0,0,115,8,0,0,0,12, + 2,10,5,4,1,255,128,114,90,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,3,0,0,0,115,26,0,0,0,135,0,102,1,100,1, + 100,2,132,8,125,1,116,0,124,1,136,0,131,2,1,0, + 124,1,83,0,41,4,122,47,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, + 0,0,0,0,2,0,0,0,4,0,0,0,19,0,0,0, + 115,38,0,0,0,116,0,160,1,124,1,161,1,115,28,116, + 2,100,1,160,3,124,1,161,1,124,1,100,2,141,2,130, + 1,136,0,124,0,124,1,131,2,83,0,169,3,78,122,27, + 123,33,114,125,32,105,115,32,110,111,116,32,97,32,102,114, + 111,122,101,110,32,109,111,100,117,108,101,114,19,0,0,0, + 41,4,114,61,0,0,0,218,9,105,115,95,102,114,111,122, + 101,110,114,83,0,0,0,114,49,0,0,0,114,84,0,0, + 0,114,86,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,24,95,114,101,113,117,105,114,101,115,95,102,114,111,122, + 101,110,95,119,114,97,112,112,101,114,9,1,0,0,115,12, + 0,0,0,10,1,10,1,2,1,6,255,10,2,255,128,122, + 50,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,78,114,89,0,0,0,41,2,114,87,0,0,0, + 114,93,0,0,0,114,5,0,0,0,114,86,0,0,0,114, + 6,0,0,0,218,16,95,114,101,113,117,105,114,101,115,95, + 102,114,111,122,101,110,7,1,0,0,115,8,0,0,0,12, + 2,10,5,4,1,255,128,114,94,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,4,0,0, + 0,67,0,0,0,115,74,0,0,0,100,1,125,2,116,0, + 160,1,124,2,116,2,161,2,1,0,116,3,124,1,124,0, + 131,2,125,3,124,1,116,4,106,5,118,0,114,66,116,4, + 106,5,124,1,25,0,125,4,116,6,124,3,124,4,131,2, + 1,0,116,4,106,5,124,1,25,0,83,0,116,7,124,3, + 131,1,83,0,41,3,122,128,76,111,97,100,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,108, + 101,32,105,110,116,111,32,115,121,115,46,109,111,100,117,108, + 101,115,32,97,110,100,32,114,101,116,117,114,110,32,105,116, + 46,10,10,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,85,115,101,32,108,111,97,100,101,114,46,101,120, + 101,99,95,109,111,100,117,108,101,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,122,103,116,104,101,32,108,111, + 97,100,95,109,111,100,117,108,101,40,41,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 32,97,110,100,32,115,108,97,116,101,100,32,102,111,114,32, + 114,101,109,111,118,97,108,32,105,110,32,80,121,116,104,111, + 110,32,51,46,49,50,59,32,117,115,101,32,101,120,101,99, + 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, + 100,78,41,8,218,9,95,119,97,114,110,105,110,103,115,218, + 4,119,97,114,110,218,18,68,101,112,114,101,99,97,116,105, + 111,110,87,97,114,110,105,110,103,218,16,115,112,101,99,95, + 102,114,111,109,95,108,111,97,100,101,114,114,18,0,0,0, + 218,7,109,111,100,117,108,101,115,218,5,95,101,120,101,99, + 218,5,95,108,111,97,100,41,5,114,33,0,0,0,114,85, + 0,0,0,218,3,109,115,103,218,4,115,112,101,99,218,6, + 109,111,100,117,108,101,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,17,95,108,111,97,100,95,109,111,100, + 117,108,101,95,115,104,105,109,19,1,0,0,115,18,0,0, + 0,4,6,12,2,10,1,10,1,10,1,10,1,10,1,8, + 2,255,128,114,105,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,5,0,0,0,8,0,0,0,67,0,0, + 0,115,210,0,0,0,116,0,124,0,100,1,100,0,131,3, + 125,1,116,1,124,1,100,2,131,2,114,54,122,12,124,1, + 160,2,124,0,161,1,87,0,83,0,4,0,116,3,121,52, + 1,0,1,0,1,0,89,0,110,2,48,0,122,10,124,0, + 106,4,125,2,87,0,110,18,4,0,116,5,121,82,1,0, + 1,0,1,0,89,0,110,18,48,0,124,2,100,0,117,1, + 114,100,116,6,124,2,131,1,83,0,122,10,124,0,106,7, + 125,3,87,0,110,22,4,0,116,5,121,132,1,0,1,0, + 1,0,100,3,125,3,89,0,110,2,48,0,122,10,124,0, + 106,8,125,4,87,0,110,52,4,0,116,5,121,196,1,0, + 1,0,1,0,124,1,100,0,117,0,114,180,100,4,160,9, + 124,3,161,1,6,0,89,0,83,0,100,5,160,9,124,3, + 124,1,161,2,6,0,89,0,83,0,48,0,100,6,160,9, + 124,3,124,4,161,2,83,0,41,7,78,218,10,95,95,108, + 111,97,100,101,114,95,95,218,11,109,111,100,117,108,101,95, + 114,101,112,114,250,1,63,250,13,60,109,111,100,117,108,101, + 32,123,33,114,125,62,250,20,60,109,111,100,117,108,101,32, + 123,33,114,125,32,40,123,33,114,125,41,62,250,23,60,109, + 111,100,117,108,101,32,123,33,114,125,32,102,114,111,109,32, + 123,33,114,125,62,41,10,114,13,0,0,0,114,11,0,0, + 0,114,107,0,0,0,218,9,69,120,99,101,112,116,105,111, + 110,218,8,95,95,115,112,101,99,95,95,114,2,0,0,0, + 218,22,95,109,111,100,117,108,101,95,114,101,112,114,95,102, + 114,111,109,95,115,112,101,99,114,9,0,0,0,218,8,95, + 95,102,105,108,101,95,95,114,49,0,0,0,41,5,114,104, + 0,0,0,218,6,108,111,97,100,101,114,114,103,0,0,0, + 114,20,0,0,0,218,8,102,105,108,101,110,97,109,101,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,12, + 95,109,111,100,117,108,101,95,114,101,112,114,38,1,0,0, + 115,48,0,0,0,12,2,10,1,2,4,12,1,12,1,6, + 1,2,1,10,1,12,1,6,1,8,2,8,1,2,4,10, + 1,12,1,10,1,2,1,10,1,12,1,8,1,14,1,18, + 2,12,2,255,128,114,118,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, + 0,0,0,115,114,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,2,100,2,100,3,156,3,100,4, + 100,5,132,2,90,4,100,6,100,7,132,0,90,5,100,8, + 100,9,132,0,90,6,101,7,100,10,100,11,132,0,131,1, + 90,8,101,8,106,9,100,12,100,11,132,0,131,1,90,8, + 101,7,100,13,100,14,132,0,131,1,90,10,101,7,100,15, + 100,16,132,0,131,1,90,11,101,11,106,9,100,17,100,16, + 132,0,131,1,90,11,100,2,83,0,41,18,218,10,77,111, + 100,117,108,101,83,112,101,99,97,208,5,0,0,84,104,101, + 32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102, + 111,114,32,97,32,109,111,100,117,108,101,44,32,117,115,101, + 100,32,102,111,114,32,108,111,97,100,105,110,103,46,10,10, + 32,32,32,32,65,32,109,111,100,117,108,101,39,115,32,115, + 112,101,99,32,105,115,32,116,104,101,32,115,111,117,114,99, + 101,32,102,111,114,32,105,110,102,111,114,109,97,116,105,111, + 110,32,97,98,111,117,116,32,116,104,101,32,109,111,100,117, + 108,101,46,32,32,70,111,114,10,32,32,32,32,100,97,116, + 97,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116, + 104,32,116,104,101,32,109,111,100,117,108,101,44,32,105,110, + 99,108,117,100,105,110,103,32,115,111,117,114,99,101,44,32, + 117,115,101,32,116,104,101,32,115,112,101,99,39,115,10,32, + 32,32,32,108,111,97,100,101,114,46,10,10,32,32,32,32, + 96,110,97,109,101,96,32,105,115,32,116,104,101,32,97,98, + 115,111,108,117,116,101,32,110,97,109,101,32,111,102,32,116, + 104,101,32,109,111,100,117,108,101,46,32,32,96,108,111,97, + 100,101,114,96,32,105,115,32,116,104,101,32,108,111,97,100, + 101,114,10,32,32,32,32,116,111,32,117,115,101,32,119,104, + 101,110,32,108,111,97,100,105,110,103,32,116,104,101,32,109, + 111,100,117,108,101,46,32,32,96,112,97,114,101,110,116,96, + 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, + 116,104,101,10,32,32,32,32,112,97,99,107,97,103,101,32, + 116,104,101,32,109,111,100,117,108,101,32,105,115,32,105,110, + 46,32,32,84,104,101,32,112,97,114,101,110,116,32,105,115, + 32,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104, + 101,32,110,97,109,101,46,10,10,32,32,32,32,96,105,115, + 95,112,97,99,107,97,103,101,96,32,100,101,116,101,114,109, + 105,110,101,115,32,105,102,32,116,104,101,32,109,111,100,117, + 108,101,32,105,115,32,99,111,110,115,105,100,101,114,101,100, + 32,97,32,112,97,99,107,97,103,101,32,111,114,10,32,32, + 32,32,110,111,116,46,32,32,79,110,32,109,111,100,117,108, + 101,115,32,116,104,105,115,32,105,115,32,114,101,102,108,101, + 99,116,101,100,32,98,121,32,116,104,101,32,96,95,95,112, + 97,116,104,95,95,96,32,97,116,116,114,105,98,117,116,101, + 46,10,10,32,32,32,32,96,111,114,105,103,105,110,96,32, + 105,115,32,116,104,101,32,115,112,101,99,105,102,105,99,32, + 108,111,99,97,116,105,111,110,32,117,115,101,100,32,98,121, + 32,116,104,101,32,108,111,97,100,101,114,32,102,114,111,109, + 32,119,104,105,99,104,32,116,111,10,32,32,32,32,108,111, + 97,100,32,116,104,101,32,109,111,100,117,108,101,44,32,105, + 102,32,116,104,97,116,32,105,110,102,111,114,109,97,116,105, + 111,110,32,105,115,32,97,118,97,105,108,97,98,108,101,46, + 32,32,87,104,101,110,32,102,105,108,101,110,97,109,101,32, + 105,115,10,32,32,32,32,115,101,116,44,32,111,114,105,103, + 105,110,32,119,105,108,108,32,109,97,116,99,104,46,10,10, + 32,32,32,32,96,104,97,115,95,108,111,99,97,116,105,111, + 110,96,32,105,110,100,105,99,97,116,101,115,32,116,104,97, + 116,32,97,32,115,112,101,99,39,115,32,34,111,114,105,103, + 105,110,34,32,114,101,102,108,101,99,116,115,32,97,32,108, + 111,99,97,116,105,111,110,46,10,32,32,32,32,87,104,101, + 110,32,116,104,105,115,32,105,115,32,84,114,117,101,44,32, + 96,95,95,102,105,108,101,95,95,96,32,97,116,116,114,105, + 98,117,116,101,32,111,102,32,116,104,101,32,109,111,100,117, + 108,101,32,105,115,32,115,101,116,46,10,10,32,32,32,32, + 96,99,97,99,104,101,100,96,32,105,115,32,116,104,101,32, + 108,111,99,97,116,105,111,110,32,111,102,32,116,104,101,32, + 99,97,99,104,101,100,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,44,32,105,102,32,97,110,121,46,32,32,73, + 116,10,32,32,32,32,99,111,114,114,101,115,112,111,110,100, + 115,32,116,111,32,116,104,101,32,96,95,95,99,97,99,104, + 101,100,95,95,96,32,97,116,116,114,105,98,117,116,101,46, + 10,10,32,32,32,32,96,115,117,98,109,111,100,117,108,101, + 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, + 115,96,32,105,115,32,116,104,101,32,115,101,113,117,101,110, + 99,101,32,111,102,32,112,97,116,104,32,101,110,116,114,105, + 101,115,32,116,111,10,32,32,32,32,115,101,97,114,99,104, + 32,119,104,101,110,32,105,109,112,111,114,116,105,110,103,32, + 115,117,98,109,111,100,117,108,101,115,46,32,32,73,102,32, + 115,101,116,44,32,105,115,95,112,97,99,107,97,103,101,32, + 115,104,111,117,108,100,32,98,101,10,32,32,32,32,84,114, + 117,101,45,45,97,110,100,32,70,97,108,115,101,32,111,116, + 104,101,114,119,105,115,101,46,10,10,32,32,32,32,80,97, + 99,107,97,103,101,115,32,97,114,101,32,115,105,109,112,108, + 121,32,109,111,100,117,108,101,115,32,116,104,97,116,32,40, + 109,97,121,41,32,104,97,118,101,32,115,117,98,109,111,100, + 117,108,101,115,46,32,32,73,102,32,97,32,115,112,101,99, + 10,32,32,32,32,104,97,115,32,97,32,110,111,110,45,78, + 111,110,101,32,118,97,108,117,101,32,105,110,32,96,115,117, + 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, + 111,99,97,116,105,111,110,115,96,44,32,116,104,101,32,105, + 109,112,111,114,116,10,32,32,32,32,115,121,115,116,101,109, + 32,119,105,108,108,32,99,111,110,115,105,100,101,114,32,109, + 111,100,117,108,101,115,32,108,111,97,100,101,100,32,102,114, + 111,109,32,116,104,101,32,115,112,101,99,32,97,115,32,112, + 97,99,107,97,103,101,115,46,10,10,32,32,32,32,79,110, + 108,121,32,102,105,110,100,101,114,115,32,40,115,101,101,32, + 105,109,112,111,114,116,108,105,98,46,97,98,99,46,77,101, + 116,97,80,97,116,104,70,105,110,100,101,114,32,97,110,100, + 10,32,32,32,32,105,109,112,111,114,116,108,105,98,46,97, + 98,99,46,80,97,116,104,69,110,116,114,121,70,105,110,100, + 101,114,41,32,115,104,111,117,108,100,32,109,111,100,105,102, + 121,32,77,111,100,117,108,101,83,112,101,99,32,105,110,115, + 116,97,110,99,101,115,46,10,10,32,32,32,32,78,41,3, + 218,6,111,114,105,103,105,110,218,12,108,111,97,100,101,114, + 95,115,116,97,116,101,218,10,105,115,95,112,97,99,107,97, + 103,101,99,3,0,0,0,0,0,0,0,3,0,0,0,6, + 0,0,0,2,0,0,0,67,0,0,0,115,54,0,0,0, + 124,1,124,0,95,0,124,2,124,0,95,1,124,3,124,0, + 95,2,124,4,124,0,95,3,124,5,114,32,103,0,110,2, + 100,0,124,0,95,4,100,1,124,0,95,5,100,0,124,0, + 95,6,100,0,83,0,41,2,78,70,41,7,114,20,0,0, + 0,114,116,0,0,0,114,120,0,0,0,114,121,0,0,0, + 218,26,115,117,98,109,111,100,117,108,101,95,115,101,97,114, + 99,104,95,108,111,99,97,116,105,111,110,115,218,13,95,115, + 101,116,95,102,105,108,101,97,116,116,114,218,7,95,99,97, + 99,104,101,100,41,6,114,33,0,0,0,114,20,0,0,0, + 114,116,0,0,0,114,120,0,0,0,114,121,0,0,0,114, + 122,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,34,0,0,0,111,1,0,0,115,16,0,0, + 0,6,2,6,1,6,1,6,1,14,1,6,3,10,1,255, + 128,122,19,77,111,100,117,108,101,83,112,101,99,46,95,95, + 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,6,0,0,0,67,0,0,0,115, + 102,0,0,0,100,1,160,0,124,0,106,1,161,1,100,2, + 160,0,124,0,106,2,161,1,103,2,125,1,124,0,106,3, + 100,0,117,1,114,52,124,1,160,4,100,3,160,0,124,0, + 106,3,161,1,161,1,1,0,124,0,106,5,100,0,117,1, + 114,80,124,1,160,4,100,4,160,0,124,0,106,5,161,1, + 161,1,1,0,100,5,160,0,124,0,106,6,106,7,100,6, + 160,8,124,1,161,1,161,2,83,0,41,7,78,122,9,110, + 97,109,101,61,123,33,114,125,122,11,108,111,97,100,101,114, + 61,123,33,114,125,122,11,111,114,105,103,105,110,61,123,33, + 114,125,122,29,115,117,98,109,111,100,117,108,101,95,115,101, + 97,114,99,104,95,108,111,99,97,116,105,111,110,115,61,123, + 125,122,6,123,125,40,123,125,41,122,2,44,32,41,9,114, + 49,0,0,0,114,20,0,0,0,114,116,0,0,0,114,120, + 0,0,0,218,6,97,112,112,101,110,100,114,123,0,0,0, + 218,9,95,95,99,108,97,115,115,95,95,114,9,0,0,0, + 218,4,106,111,105,110,41,2,114,33,0,0,0,114,59,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,8,95,95,114,101,112,114,95,95,138,0,0,0,115, - 4,0,0,0,18,1,255,128,122,20,95,77,111,100,117,108, - 101,76,111,99,107,46,95,95,114,101,112,114,95,95,78,41, - 9,114,9,0,0,0,114,8,0,0,0,114,1,0,0,0, - 114,10,0,0,0,114,34,0,0,0,114,41,0,0,0,114, - 43,0,0,0,114,44,0,0,0,114,52,0,0,0,114,5, + 0,114,52,0,0,0,123,1,0,0,115,22,0,0,0,10, + 1,10,1,4,255,10,2,18,1,10,1,8,1,4,1,6, + 255,22,2,255,128,122,19,77,111,100,117,108,101,83,112,101, + 99,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,102,0,0,0,124,0,106,0,125,2,122,72, + 124,0,106,1,124,1,106,1,107,2,111,76,124,0,106,2, + 124,1,106,2,107,2,111,76,124,0,106,3,124,1,106,3, + 107,2,111,76,124,2,124,1,106,0,107,2,111,76,124,0, + 106,4,124,1,106,4,107,2,111,76,124,0,106,5,124,1, + 106,5,107,2,87,0,83,0,4,0,116,6,121,100,1,0, + 1,0,1,0,116,7,6,0,89,0,83,0,48,0,114,0, + 0,0,0,41,8,114,123,0,0,0,114,20,0,0,0,114, + 116,0,0,0,114,120,0,0,0,218,6,99,97,99,104,101, + 100,218,12,104,97,115,95,108,111,99,97,116,105,111,110,114, + 2,0,0,0,218,14,78,111,116,73,109,112,108,101,109,101, + 110,116,101,100,41,3,114,33,0,0,0,90,5,111,116,104, + 101,114,90,4,115,109,115,108,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,6,95,95,101,113,95,95,133, + 1,0,0,115,32,0,0,0,6,1,2,1,12,1,10,1, + 2,255,10,2,2,254,8,3,2,253,10,4,2,252,10,5, + 4,251,12,6,10,1,255,128,122,17,77,111,100,117,108,101, + 83,112,101,99,46,95,95,101,113,95,95,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,58,0,0,0,124,0,106,0,100,0,117, + 0,114,52,124,0,106,1,100,0,117,1,114,52,124,0,106, + 2,114,52,116,3,100,0,117,0,114,38,116,4,130,1,116, + 3,160,5,124,0,106,1,161,1,124,0,95,0,124,0,106, + 0,83,0,114,0,0,0,0,41,6,114,125,0,0,0,114, + 120,0,0,0,114,124,0,0,0,218,19,95,98,111,111,116, + 115,116,114,97,112,95,101,120,116,101,114,110,97,108,218,19, + 78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,114, + 114,111,114,90,11,95,103,101,116,95,99,97,99,104,101,100, + 114,51,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,129,0,0,0,145,1,0,0,115,14,0, + 0,0,10,2,16,1,8,1,4,1,14,1,6,1,255,128, + 122,17,77,111,100,117,108,101,83,112,101,99,46,99,97,99, + 104,101,100,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,2,0,0,0,67,0,0,0,115,10,0,0, + 0,124,1,124,0,95,0,100,0,83,0,114,0,0,0,0, + 41,1,114,125,0,0,0,41,2,114,33,0,0,0,114,129, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,23,0,0,0,65,0,0,0,115,16,0,0,0, - 8,0,4,1,8,5,8,8,8,21,8,25,12,13,255,128, - 114,23,0,0,0,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,48, - 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, - 2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,100, - 6,100,7,132,0,90,6,100,8,100,9,132,0,90,7,100, - 10,83,0,41,11,218,16,95,68,117,109,109,121,77,111,100, - 117,108,101,76,111,99,107,122,86,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,0,0,0,0,2,0,0,0, - 2,0,0,0,67,0,0,0,115,16,0,0,0,124,1,124, - 0,95,0,100,1,124,0,95,1,100,0,83,0,114,24,0, - 0,0,41,2,114,20,0,0,0,114,30,0,0,0,114,32, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,34,0,0,0,146,0,0,0,115,6,0,0,0, - 6,1,10,1,255,128,122,25,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,0,0,0,0,1,0, - 0,0,3,0,0,0,67,0,0,0,115,18,0,0,0,124, - 0,4,0,106,0,100,1,55,0,2,0,95,0,100,2,83, - 0,41,3,78,114,42,0,0,0,84,41,1,114,30,0,0, - 0,114,51,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,43,0,0,0,150,0,0,0,115,6, - 0,0,0,14,1,4,1,255,128,122,24,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,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,36,0,0, - 0,124,0,106,0,100,1,107,2,114,18,116,1,100,2,131, - 1,130,1,124,0,4,0,106,0,100,3,56,0,2,0,95, - 0,100,0,83,0,41,4,78,114,25,0,0,0,114,46,0, - 0,0,114,42,0,0,0,41,2,114,30,0,0,0,114,47, - 0,0,0,114,51,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,44,0,0,0,154,0,0,0, - 115,8,0,0,0,10,1,8,1,18,1,255,128,122,24,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, - 0,0,0,0,1,0,0,0,5,0,0,0,67,0,0,0, - 115,18,0,0,0,100,1,160,0,124,0,106,1,116,2,124, - 0,131,1,161,2,83,0,41,2,78,122,28,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,114,48,0,0,0,114,51,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,52,0,0,0,159,0,0,0,115,4,0,0,0,18, - 1,255,128,122,25,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,41, - 8,114,9,0,0,0,114,8,0,0,0,114,1,0,0,0, - 114,10,0,0,0,114,34,0,0,0,114,43,0,0,0,114, - 44,0,0,0,114,52,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,53,0, - 0,0,142,0,0,0,115,14,0,0,0,8,0,4,1,8, - 3,8,4,8,4,12,5,255,128,114,53,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,64,0,0,0,115,36,0,0,0,101,0,90,1, - 100,0,90,2,100,1,100,2,132,0,90,3,100,3,100,4, - 132,0,90,4,100,5,100,6,132,0,90,5,100,7,83,0, - 41,8,218,18,95,77,111,100,117,108,101,76,111,99,107,77, - 97,110,97,103,101,114,99,2,0,0,0,0,0,0,0,0, + 0,0,114,129,0,0,0,154,1,0,0,115,4,0,0,0, + 10,2,255,128,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,32,0, + 0,0,124,0,106,0,100,1,117,0,114,26,124,0,106,1, + 160,2,100,2,161,1,100,3,25,0,83,0,124,0,106,1, + 83,0,41,4,122,32,84,104,101,32,110,97,109,101,32,111, + 102,32,116,104,101,32,109,111,100,117,108,101,39,115,32,112, + 97,114,101,110,116,46,78,218,1,46,114,25,0,0,0,41, + 3,114,123,0,0,0,114,20,0,0,0,218,10,114,112,97, + 114,116,105,116,105,111,110,114,51,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,6,112,97,114, + 101,110,116,158,1,0,0,115,8,0,0,0,10,3,16,1, + 6,2,255,128,122,17,77,111,100,117,108,101,83,112,101,99, + 46,112,97,114,101,110,116,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,1,0,0,0,67,0,0,0, + 115,6,0,0,0,124,0,106,0,83,0,114,0,0,0,0, + 41,1,114,124,0,0,0,114,51,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,130,0,0,0, + 166,1,0,0,115,4,0,0,0,6,2,255,128,122,23,77, + 111,100,117,108,101,83,112,101,99,46,104,97,115,95,108,111, + 99,97,116,105,111,110,99,2,0,0,0,0,0,0,0,0, 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, - 16,0,0,0,124,1,124,0,95,0,100,0,124,0,95,1, - 100,0,83,0,114,0,0,0,0,41,2,218,5,95,110,97, - 109,101,218,5,95,108,111,99,107,114,32,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,34,0, - 0,0,165,0,0,0,115,6,0,0,0,6,1,10,1,255, - 128,122,27,95,77,111,100,117,108,101,76,111,99,107,77,97, - 110,97,103,101,114,46,95,95,105,110,105,116,95,95,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, - 0,0,0,67,0,0,0,115,26,0,0,0,116,0,124,0, - 106,1,131,1,124,0,95,2,124,0,106,2,160,3,161,0, - 1,0,100,0,83,0,114,0,0,0,0,41,4,218,16,95, - 103,101,116,95,109,111,100,117,108,101,95,108,111,99,107,114, - 55,0,0,0,114,56,0,0,0,114,43,0,0,0,114,51, + 14,0,0,0,116,0,124,1,131,1,124,0,95,1,100,0, + 83,0,114,0,0,0,0,41,2,218,4,98,111,111,108,114, + 124,0,0,0,41,2,114,33,0,0,0,218,5,118,97,108, + 117,101,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,130,0,0,0,170,1,0,0,115,4,0,0,0,14, + 2,255,128,41,12,114,9,0,0,0,114,8,0,0,0,114, + 1,0,0,0,114,10,0,0,0,114,34,0,0,0,114,52, + 0,0,0,114,132,0,0,0,218,8,112,114,111,112,101,114, + 116,121,114,129,0,0,0,218,6,115,101,116,116,101,114,114, + 137,0,0,0,114,130,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,119,0, + 0,0,74,1,0,0,115,36,0,0,0,8,0,4,1,4, + 36,2,1,12,255,8,12,8,10,2,12,10,1,4,8,10, + 1,2,3,10,1,2,7,10,1,4,3,14,1,255,128,114, + 119,0,0,0,169,2,114,120,0,0,0,114,122,0,0,0, + 99,2,0,0,0,0,0,0,0,2,0,0,0,6,0,0, + 0,8,0,0,0,67,0,0,0,115,150,0,0,0,116,0, + 124,1,100,1,131,2,114,74,116,1,100,2,117,0,114,22, + 116,2,130,1,116,1,106,3,125,4,124,3,100,2,117,0, + 114,48,124,4,124,0,124,1,100,3,141,2,83,0,124,3, + 114,56,103,0,110,2,100,2,125,5,124,4,124,0,124,1, + 124,5,100,4,141,3,83,0,124,3,100,2,117,0,114,134, + 116,0,124,1,100,5,131,2,114,130,122,14,124,1,160,4, + 124,0,161,1,125,3,87,0,110,26,4,0,116,5,121,128, + 1,0,1,0,1,0,100,2,125,3,89,0,110,6,48,0, + 100,6,125,3,116,6,124,0,124,1,124,2,124,3,100,7, + 141,4,83,0,41,8,122,53,82,101,116,117,114,110,32,97, + 32,109,111,100,117,108,101,32,115,112,101,99,32,98,97,115, + 101,100,32,111,110,32,118,97,114,105,111,117,115,32,108,111, + 97,100,101,114,32,109,101,116,104,111,100,115,46,90,12,103, + 101,116,95,102,105,108,101,110,97,109,101,78,41,1,114,116, + 0,0,0,41,2,114,116,0,0,0,114,123,0,0,0,114, + 122,0,0,0,70,114,142,0,0,0,41,7,114,11,0,0, + 0,114,133,0,0,0,114,134,0,0,0,218,23,115,112,101, + 99,95,102,114,111,109,95,102,105,108,101,95,108,111,99,97, + 116,105,111,110,114,122,0,0,0,114,83,0,0,0,114,119, + 0,0,0,41,6,114,20,0,0,0,114,116,0,0,0,114, + 120,0,0,0,114,122,0,0,0,114,143,0,0,0,90,6, + 115,101,97,114,99,104,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,98,0,0,0,175,1,0,0,115,38, + 0,0,0,10,2,8,1,4,1,6,1,8,2,12,1,12, + 1,6,1,2,1,6,255,8,3,10,1,2,1,14,1,12, + 1,10,1,4,3,16,2,255,128,114,98,0,0,0,99,3, + 0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8, + 0,0,0,67,0,0,0,115,40,1,0,0,122,10,124,0, + 106,0,125,3,87,0,110,18,4,0,116,1,121,28,1,0, + 1,0,1,0,89,0,110,14,48,0,124,3,100,0,117,1, + 114,42,124,3,83,0,124,0,106,2,125,4,124,1,100,0, + 117,0,114,86,122,10,124,0,106,3,125,1,87,0,110,18, + 4,0,116,1,121,84,1,0,1,0,1,0,89,0,110,2, + 48,0,122,10,124,0,106,4,125,5,87,0,110,22,4,0, + 116,1,121,118,1,0,1,0,1,0,100,0,125,5,89,0, + 110,2,48,0,124,2,100,0,117,0,114,174,124,5,100,0, + 117,0,114,170,122,10,124,1,106,5,125,2,87,0,110,26, + 4,0,116,1,121,168,1,0,1,0,1,0,100,0,125,2, + 89,0,110,6,48,0,124,5,125,2,122,10,124,0,106,6, + 125,6,87,0,110,22,4,0,116,1,121,206,1,0,1,0, + 1,0,100,0,125,6,89,0,110,2,48,0,122,14,116,7, + 124,0,106,8,131,1,125,7,87,0,110,22,4,0,116,1, + 121,244,1,0,1,0,1,0,100,0,125,7,89,0,110,2, + 48,0,116,9,124,4,124,1,124,2,100,1,141,3,125,3, + 124,5,100,0,117,0,144,1,114,18,100,2,110,2,100,3, + 124,3,95,10,124,6,124,3,95,11,124,7,124,3,95,12, + 124,3,83,0,41,4,78,169,1,114,120,0,0,0,70,84, + 41,13,114,113,0,0,0,114,2,0,0,0,114,9,0,0, + 0,114,106,0,0,0,114,115,0,0,0,218,7,95,79,82, + 73,71,73,78,218,10,95,95,99,97,99,104,101,100,95,95, + 218,4,108,105,115,116,218,8,95,95,112,97,116,104,95,95, + 114,119,0,0,0,114,124,0,0,0,114,129,0,0,0,114, + 123,0,0,0,41,8,114,104,0,0,0,114,116,0,0,0, + 114,120,0,0,0,114,103,0,0,0,114,20,0,0,0,90, + 8,108,111,99,97,116,105,111,110,114,129,0,0,0,114,123, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,9,95,95,101,110,116,101,114,95,95,169,0,0, - 0,115,6,0,0,0,12,1,14,1,255,128,122,28,95,77, - 111,100,117,108,101,76,111,99,107,77,97,110,97,103,101,114, - 46,95,95,101,110,116,101,114,95,95,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,79, - 0,0,0,115,14,0,0,0,124,0,106,0,160,1,161,0, - 1,0,100,0,83,0,114,0,0,0,0,41,2,114,56,0, - 0,0,114,44,0,0,0,41,3,114,33,0,0,0,218,4, - 97,114,103,115,90,6,107,119,97,114,103,115,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,8,95,95,101, - 120,105,116,95,95,173,0,0,0,115,4,0,0,0,14,1, - 255,128,122,27,95,77,111,100,117,108,101,76,111,99,107,77, - 97,110,97,103,101,114,46,95,95,101,120,105,116,95,95,78, - 41,6,114,9,0,0,0,114,8,0,0,0,114,1,0,0, - 0,114,34,0,0,0,114,58,0,0,0,114,60,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,54,0,0,0,163,0,0,0,115,10,0, - 0,0,8,0,8,2,8,4,12,4,255,128,114,54,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,8,0,0,0,67,0,0,0,115,134,0,0,0,116, - 0,160,1,161,0,1,0,122,114,122,14,116,2,124,0,25, - 0,131,0,125,1,87,0,110,22,4,0,116,3,121,46,1, - 0,1,0,1,0,100,1,125,1,89,0,110,2,48,0,124, - 1,100,1,117,0,114,110,116,4,100,1,117,0,114,74,116, - 5,124,0,131,1,125,1,110,8,116,6,124,0,131,1,125, - 1,124,0,102,1,100,2,100,3,132,1,125,2,116,7,160, - 8,124,1,124,2,161,2,116,2,124,0,60,0,87,0,116, - 0,160,9,161,0,1,0,124,1,83,0,116,0,160,9,161, - 0,1,0,48,0,41,4,122,139,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,65,99,113,117,105,114,101,47,114,101,108, - 101,97,115,101,32,105,110,116,101,114,110,97,108,108,121,32, - 116,104,101,32,103,108,111,98,97,108,32,105,109,112,111,114, - 116,32,108,111,99,107,32,116,111,32,112,114,111,116,101,99, - 116,10,32,32,32,32,95,109,111,100,117,108,101,95,108,111, - 99,107,115,46,78,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,8,0,0,0,83,0,0,0,115,54, - 0,0,0,116,0,160,1,161,0,1,0,122,34,116,2,160, - 3,124,1,161,1,124,0,117,0,114,30,116,2,124,1,61, - 0,87,0,116,0,160,4,161,0,1,0,100,0,83,0,116, - 0,160,4,161,0,1,0,48,0,114,0,0,0,0,41,5, - 218,4,95,105,109,112,218,12,97,99,113,117,105,114,101,95, - 108,111,99,107,218,13,95,109,111,100,117,108,101,95,108,111, - 99,107,115,114,38,0,0,0,218,12,114,101,108,101,97,115, - 101,95,108,111,99,107,41,2,218,3,114,101,102,114,20,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,2,99,98,198,0,0,0,115,14,0,0,0,8,1, - 2,1,14,4,6,1,2,128,22,2,255,128,122,28,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,41,10,114,61,0,0, - 0,114,62,0,0,0,114,63,0,0,0,218,8,75,101,121, - 69,114,114,111,114,114,26,0,0,0,114,53,0,0,0,114, - 23,0,0,0,218,8,95,119,101,97,107,114,101,102,114,65, - 0,0,0,114,64,0,0,0,41,3,114,20,0,0,0,114, - 27,0,0,0,114,66,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,114,57,0,0,0,179,0,0, - 0,115,34,0,0,0,8,6,2,1,2,1,14,1,12,1, - 10,1,8,2,8,1,10,1,8,2,12,2,16,11,2,128, - 8,2,4,2,10,254,255,128,114,57,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0, - 0,0,67,0,0,0,115,54,0,0,0,116,0,124,0,131, - 1,125,1,122,12,124,1,160,1,161,0,1,0,87,0,110, - 20,4,0,116,2,121,40,1,0,1,0,1,0,89,0,100, - 1,83,0,48,0,124,1,160,3,161,0,1,0,100,1,83, - 0,41,2,122,189,65,99,113,117,105,114,101,115,32,116,104, - 101,110,32,114,101,108,101,97,115,101,115,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,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,32,32, - 32,32,78,41,4,114,57,0,0,0,114,43,0,0,0,114, - 22,0,0,0,114,44,0,0,0,41,2,114,20,0,0,0, - 114,27,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,19,95,108,111,99,107,95,117,110,108,111, - 99,107,95,109,111,100,117,108,101,216,0,0,0,115,14,0, - 0,0,8,6,2,1,12,1,12,1,8,3,12,2,255,128, - 114,69,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,4,0,0,0,79,0,0,0,115,14, - 0,0,0,124,0,124,1,105,0,124,2,164,1,142,1,83, - 0,41,2,97,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,78,114,5,0,0,0,41,3,218,1, - 102,114,59,0,0,0,90,4,107,119,100,115,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,25,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,233,0,0,0,115,4,0,0,0,14, - 8,255,128,114,71,0,0,0,114,42,0,0,0,41,1,218, - 9,118,101,114,98,111,115,105,116,121,99,1,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,4,0,0,0,71, - 0,0,0,115,58,0,0,0,116,0,106,1,106,2,124,1, - 107,5,114,54,124,0,160,3,100,1,161,1,115,30,100,2, - 124,0,23,0,125,0,116,4,124,0,106,5,124,2,142,0, - 116,0,106,6,100,3,141,2,1,0,100,4,83,0,100,4, - 83,0,41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111,114,116, - 32,122,2,35,32,41,1,90,4,102,105,108,101,78,41,7, - 114,18,0,0,0,218,5,102,108,97,103,115,218,7,118,101, - 114,98,111,115,101,218,10,115,116,97,114,116,115,119,105,116, - 104,218,5,112,114,105,110,116,114,49,0,0,0,218,6,115, - 116,100,101,114,114,41,3,218,7,109,101,115,115,97,103,101, - 114,72,0,0,0,114,59,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,16,95,118,101,114,98, - 111,115,101,95,109,101,115,115,97,103,101,244,0,0,0,115, - 12,0,0,0,12,2,10,1,8,1,24,1,4,253,255,128, - 114,80,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,26, - 0,0,0,135,0,102,1,100,1,100,2,132,8,125,1,116, - 0,124,1,136,0,131,2,1,0,124,1,83,0,41,4,122, - 49,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,0,0,0,0,2, - 0,0,0,4,0,0,0,19,0,0,0,115,38,0,0,0, - 124,1,116,0,106,1,118,1,114,28,116,2,100,1,160,3, - 124,1,161,1,124,1,100,2,141,2,130,1,136,0,124,0, - 124,1,131,2,83,0,41,3,78,250,29,123,33,114,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,114,19,0,0,0,41,4,114, - 18,0,0,0,218,20,98,117,105,108,116,105,110,95,109,111, - 100,117,108,101,95,110,97,109,101,115,218,11,73,109,112,111, - 114,116,69,114,114,111,114,114,49,0,0,0,169,2,114,33, - 0,0,0,218,8,102,117,108,108,110,97,109,101,169,1,218, - 3,102,120,110,114,5,0,0,0,114,6,0,0,0,218,25, - 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,254,0,0,0,115,12,0, - 0,0,10,1,10,1,2,1,6,255,10,2,255,128,122,52, - 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,78,169,1,114,17,0,0,0,41,2,114,87, - 0,0,0,114,88,0,0,0,114,5,0,0,0,114,86,0, - 0,0,114,6,0,0,0,218,17,95,114,101,113,117,105,114, - 101,115,95,98,117,105,108,116,105,110,252,0,0,0,115,8, - 0,0,0,12,2,10,5,4,1,255,128,114,90,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,3,0,0,0,115,26,0,0,0,135,0, - 102,1,100,1,100,2,132,8,125,1,116,0,124,1,136,0, - 131,2,1,0,124,1,83,0,41,4,122,47,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,0,0,0,0,2,0,0,0,4,0,0,0, - 19,0,0,0,115,38,0,0,0,116,0,160,1,124,1,161, - 1,115,28,116,2,100,1,160,3,124,1,161,1,124,1,100, - 2,141,2,130,1,136,0,124,0,124,1,131,2,83,0,169, - 3,78,122,27,123,33,114,125,32,105,115,32,110,111,116,32, - 97,32,102,114,111,122,101,110,32,109,111,100,117,108,101,114, - 19,0,0,0,41,4,114,61,0,0,0,218,9,105,115,95, - 102,114,111,122,101,110,114,83,0,0,0,114,49,0,0,0, - 114,84,0,0,0,114,86,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,24,95,114,101,113,117,105,114,101,115,95, - 102,114,111,122,101,110,95,119,114,97,112,112,101,114,9,1, - 0,0,115,12,0,0,0,10,1,10,1,2,1,6,255,10, - 2,255,128,122,50,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,78,114,89,0,0,0,41,2,114, - 87,0,0,0,114,93,0,0,0,114,5,0,0,0,114,86, - 0,0,0,114,6,0,0,0,218,16,95,114,101,113,117,105, - 114,101,115,95,102,114,111,122,101,110,7,1,0,0,115,8, - 0,0,0,12,2,10,5,4,1,255,128,114,94,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,4,0,0,0,67,0,0,0,115,74,0,0,0,100,1, - 125,2,116,0,160,1,124,2,116,2,161,2,1,0,116,3, - 124,1,124,0,131,2,125,3,124,1,116,4,106,5,118,0, - 114,66,116,4,106,5,124,1,25,0,125,4,116,6,124,3, - 124,4,131,2,1,0,116,4,106,5,124,1,25,0,83,0, - 116,7,124,3,131,1,83,0,41,3,122,128,76,111,97,100, - 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,109, - 111,100,117,108,101,32,105,110,116,111,32,115,121,115,46,109, - 111,100,117,108,101,115,32,97,110,100,32,114,101,116,117,114, - 110,32,105,116,46,10,10,32,32,32,32,84,104,105,115,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,85,115,101,32,108,111,97,100,101, - 114,46,101,120,101,99,95,109,111,100,117,108,101,32,105,110, - 115,116,101,97,100,46,10,10,32,32,32,32,122,103,116,104, - 101,32,108,111,97,100,95,109,111,100,117,108,101,40,41,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,32,97,110,100,32,115,108,97,116,101,100,32, - 102,111,114,32,114,101,109,111,118,97,108,32,105,110,32,80, - 121,116,104,111,110,32,51,46,49,50,59,32,117,115,101,32, - 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, - 115,116,101,97,100,78,41,8,218,9,95,119,97,114,110,105, - 110,103,115,218,4,119,97,114,110,218,18,68,101,112,114,101, - 99,97,116,105,111,110,87,97,114,110,105,110,103,218,16,115, - 112,101,99,95,102,114,111,109,95,108,111,97,100,101,114,114, - 18,0,0,0,218,7,109,111,100,117,108,101,115,218,5,95, - 101,120,101,99,218,5,95,108,111,97,100,41,5,114,33,0, - 0,0,114,85,0,0,0,218,3,109,115,103,218,4,115,112, - 101,99,218,6,109,111,100,117,108,101,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,17,95,108,111,97,100, - 95,109,111,100,117,108,101,95,115,104,105,109,19,1,0,0, - 115,18,0,0,0,4,6,12,2,10,1,10,1,10,1,10, - 1,10,1,8,2,255,128,114,105,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,5,0,0,0,8,0,0, - 0,67,0,0,0,115,210,0,0,0,116,0,124,0,100,1, - 100,0,131,3,125,1,116,1,124,1,100,2,131,2,114,54, - 122,12,124,1,160,2,124,0,161,1,87,0,83,0,4,0, - 116,3,121,52,1,0,1,0,1,0,89,0,110,2,48,0, - 122,10,124,0,106,4,125,2,87,0,110,18,4,0,116,5, - 121,82,1,0,1,0,1,0,89,0,110,18,48,0,124,2, - 100,0,117,1,114,100,116,6,124,2,131,1,83,0,122,10, - 124,0,106,7,125,3,87,0,110,22,4,0,116,5,121,132, - 1,0,1,0,1,0,100,3,125,3,89,0,110,2,48,0, - 122,10,124,0,106,8,125,4,87,0,110,52,4,0,116,5, - 121,196,1,0,1,0,1,0,124,1,100,0,117,0,114,180, - 100,4,160,9,124,3,161,1,6,0,89,0,83,0,100,5, - 160,9,124,3,124,1,161,2,6,0,89,0,83,0,48,0, - 100,6,160,9,124,3,124,4,161,2,83,0,41,7,78,218, - 10,95,95,108,111,97,100,101,114,95,95,218,11,109,111,100, - 117,108,101,95,114,101,112,114,250,1,63,250,13,60,109,111, - 100,117,108,101,32,123,33,114,125,62,250,20,60,109,111,100, - 117,108,101,32,123,33,114,125,32,40,123,33,114,125,41,62, - 250,23,60,109,111,100,117,108,101,32,123,33,114,125,32,102, - 114,111,109,32,123,33,114,125,62,41,10,114,13,0,0,0, - 114,11,0,0,0,114,107,0,0,0,218,9,69,120,99,101, - 112,116,105,111,110,218,8,95,95,115,112,101,99,95,95,114, - 2,0,0,0,218,22,95,109,111,100,117,108,101,95,114,101, - 112,114,95,102,114,111,109,95,115,112,101,99,114,9,0,0, - 0,218,8,95,95,102,105,108,101,95,95,114,49,0,0,0, - 41,5,114,104,0,0,0,218,6,108,111,97,100,101,114,114, - 103,0,0,0,114,20,0,0,0,218,8,102,105,108,101,110, - 97,109,101,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,12,95,109,111,100,117,108,101,95,114,101,112,114, - 38,1,0,0,115,48,0,0,0,12,2,10,1,2,4,12, - 1,12,1,6,1,2,1,10,1,12,1,6,1,8,2,8, - 1,2,4,10,1,12,1,10,1,2,1,10,1,12,1,8, - 1,14,1,18,2,12,2,255,128,114,118,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,64,0,0,0,115,114,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,2,100,2,100,3, - 156,3,100,4,100,5,132,2,90,4,100,6,100,7,132,0, - 90,5,100,8,100,9,132,0,90,6,101,7,100,10,100,11, - 132,0,131,1,90,8,101,8,106,9,100,12,100,11,132,0, - 131,1,90,8,101,7,100,13,100,14,132,0,131,1,90,10, - 101,7,100,15,100,16,132,0,131,1,90,11,101,11,106,9, - 100,17,100,16,132,0,131,1,90,11,100,2,83,0,41,18, - 218,10,77,111,100,117,108,101,83,112,101,99,97,208,5,0, - 0,84,104,101,32,115,112,101,99,105,102,105,99,97,116,105, - 111,110,32,102,111,114,32,97,32,109,111,100,117,108,101,44, - 32,117,115,101,100,32,102,111,114,32,108,111,97,100,105,110, - 103,46,10,10,32,32,32,32,65,32,109,111,100,117,108,101, - 39,115,32,115,112,101,99,32,105,115,32,116,104,101,32,115, - 111,117,114,99,101,32,102,111,114,32,105,110,102,111,114,109, - 97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32, - 109,111,100,117,108,101,46,32,32,70,111,114,10,32,32,32, - 32,100,97,116,97,32,97,115,115,111,99,105,97,116,101,100, - 32,119,105,116,104,32,116,104,101,32,109,111,100,117,108,101, - 44,32,105,110,99,108,117,100,105,110,103,32,115,111,117,114, - 99,101,44,32,117,115,101,32,116,104,101,32,115,112,101,99, - 39,115,10,32,32,32,32,108,111,97,100,101,114,46,10,10, - 32,32,32,32,96,110,97,109,101,96,32,105,115,32,116,104, - 101,32,97,98,115,111,108,117,116,101,32,110,97,109,101,32, - 111,102,32,116,104,101,32,109,111,100,117,108,101,46,32,32, - 96,108,111,97,100,101,114,96,32,105,115,32,116,104,101,32, - 108,111,97,100,101,114,10,32,32,32,32,116,111,32,117,115, - 101,32,119,104,101,110,32,108,111,97,100,105,110,103,32,116, - 104,101,32,109,111,100,117,108,101,46,32,32,96,112,97,114, - 101,110,116,96,32,105,115,32,116,104,101,32,110,97,109,101, - 32,111,102,32,116,104,101,10,32,32,32,32,112,97,99,107, - 97,103,101,32,116,104,101,32,109,111,100,117,108,101,32,105, - 115,32,105,110,46,32,32,84,104,101,32,112,97,114,101,110, - 116,32,105,115,32,100,101,114,105,118,101,100,32,102,114,111, - 109,32,116,104,101,32,110,97,109,101,46,10,10,32,32,32, - 32,96,105,115,95,112,97,99,107,97,103,101,96,32,100,101, - 116,101,114,109,105,110,101,115,32,105,102,32,116,104,101,32, - 109,111,100,117,108,101,32,105,115,32,99,111,110,115,105,100, - 101,114,101,100,32,97,32,112,97,99,107,97,103,101,32,111, - 114,10,32,32,32,32,110,111,116,46,32,32,79,110,32,109, - 111,100,117,108,101,115,32,116,104,105,115,32,105,115,32,114, - 101,102,108,101,99,116,101,100,32,98,121,32,116,104,101,32, - 96,95,95,112,97,116,104,95,95,96,32,97,116,116,114,105, - 98,117,116,101,46,10,10,32,32,32,32,96,111,114,105,103, - 105,110,96,32,105,115,32,116,104,101,32,115,112,101,99,105, - 102,105,99,32,108,111,99,97,116,105,111,110,32,117,115,101, - 100,32,98,121,32,116,104,101,32,108,111,97,100,101,114,32, - 102,114,111,109,32,119,104,105,99,104,32,116,111,10,32,32, - 32,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108, - 101,44,32,105,102,32,116,104,97,116,32,105,110,102,111,114, - 109,97,116,105,111,110,32,105,115,32,97,118,97,105,108,97, - 98,108,101,46,32,32,87,104,101,110,32,102,105,108,101,110, - 97,109,101,32,105,115,10,32,32,32,32,115,101,116,44,32, - 111,114,105,103,105,110,32,119,105,108,108,32,109,97,116,99, - 104,46,10,10,32,32,32,32,96,104,97,115,95,108,111,99, - 97,116,105,111,110,96,32,105,110,100,105,99,97,116,101,115, - 32,116,104,97,116,32,97,32,115,112,101,99,39,115,32,34, - 111,114,105,103,105,110,34,32,114,101,102,108,101,99,116,115, - 32,97,32,108,111,99,97,116,105,111,110,46,10,32,32,32, - 32,87,104,101,110,32,116,104,105,115,32,105,115,32,84,114, - 117,101,44,32,96,95,95,102,105,108,101,95,95,96,32,97, - 116,116,114,105,98,117,116,101,32,111,102,32,116,104,101,32, - 109,111,100,117,108,101,32,105,115,32,115,101,116,46,10,10, - 32,32,32,32,96,99,97,99,104,101,100,96,32,105,115,32, - 116,104,101,32,108,111,99,97,116,105,111,110,32,111,102,32, - 116,104,101,32,99,97,99,104,101,100,32,98,121,116,101,99, - 111,100,101,32,102,105,108,101,44,32,105,102,32,97,110,121, - 46,32,32,73,116,10,32,32,32,32,99,111,114,114,101,115, - 112,111,110,100,115,32,116,111,32,116,104,101,32,96,95,95, - 99,97,99,104,101,100,95,95,96,32,97,116,116,114,105,98, - 117,116,101,46,10,10,32,32,32,32,96,115,117,98,109,111, - 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, - 116,105,111,110,115,96,32,105,115,32,116,104,101,32,115,101, - 113,117,101,110,99,101,32,111,102,32,112,97,116,104,32,101, - 110,116,114,105,101,115,32,116,111,10,32,32,32,32,115,101, - 97,114,99,104,32,119,104,101,110,32,105,109,112,111,114,116, - 105,110,103,32,115,117,98,109,111,100,117,108,101,115,46,32, - 32,73,102,32,115,101,116,44,32,105,115,95,112,97,99,107, - 97,103,101,32,115,104,111,117,108,100,32,98,101,10,32,32, - 32,32,84,114,117,101,45,45,97,110,100,32,70,97,108,115, - 101,32,111,116,104,101,114,119,105,115,101,46,10,10,32,32, - 32,32,80,97,99,107,97,103,101,115,32,97,114,101,32,115, - 105,109,112,108,121,32,109,111,100,117,108,101,115,32,116,104, - 97,116,32,40,109,97,121,41,32,104,97,118,101,32,115,117, - 98,109,111,100,117,108,101,115,46,32,32,73,102,32,97,32, - 115,112,101,99,10,32,32,32,32,104,97,115,32,97,32,110, - 111,110,45,78,111,110,101,32,118,97,108,117,101,32,105,110, - 32,96,115,117,98,109,111,100,117,108,101,95,115,101,97,114, - 99,104,95,108,111,99,97,116,105,111,110,115,96,44,32,116, - 104,101,32,105,109,112,111,114,116,10,32,32,32,32,115,121, - 115,116,101,109,32,119,105,108,108,32,99,111,110,115,105,100, - 101,114,32,109,111,100,117,108,101,115,32,108,111,97,100,101, - 100,32,102,114,111,109,32,116,104,101,32,115,112,101,99,32, - 97,115,32,112,97,99,107,97,103,101,115,46,10,10,32,32, - 32,32,79,110,108,121,32,102,105,110,100,101,114,115,32,40, - 115,101,101,32,105,109,112,111,114,116,108,105,98,46,97,98, - 99,46,77,101,116,97,80,97,116,104,70,105,110,100,101,114, - 32,97,110,100,10,32,32,32,32,105,109,112,111,114,116,108, - 105,98,46,97,98,99,46,80,97,116,104,69,110,116,114,121, - 70,105,110,100,101,114,41,32,115,104,111,117,108,100,32,109, - 111,100,105,102,121,32,77,111,100,117,108,101,83,112,101,99, - 32,105,110,115,116,97,110,99,101,115,46,10,10,32,32,32, - 32,78,41,3,218,6,111,114,105,103,105,110,218,12,108,111, - 97,100,101,114,95,115,116,97,116,101,218,10,105,115,95,112, - 97,99,107,97,103,101,99,3,0,0,0,0,0,0,0,3, - 0,0,0,6,0,0,0,2,0,0,0,67,0,0,0,115, - 54,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, - 124,3,124,0,95,2,124,4,124,0,95,3,124,5,114,32, - 103,0,110,2,100,0,124,0,95,4,100,1,124,0,95,5, - 100,0,124,0,95,6,100,0,83,0,41,2,78,70,41,7, - 114,20,0,0,0,114,116,0,0,0,114,120,0,0,0,114, - 121,0,0,0,218,26,115,117,98,109,111,100,117,108,101,95, - 115,101,97,114,99,104,95,108,111,99,97,116,105,111,110,115, - 218,13,95,115,101,116,95,102,105,108,101,97,116,116,114,218, - 7,95,99,97,99,104,101,100,41,6,114,33,0,0,0,114, - 20,0,0,0,114,116,0,0,0,114,120,0,0,0,114,121, - 0,0,0,114,122,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,34,0,0,0,111,1,0,0, - 115,16,0,0,0,6,2,6,1,6,1,6,1,14,1,6, - 3,10,1,255,128,122,19,77,111,100,117,108,101,83,112,101, - 99,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67, - 0,0,0,115,102,0,0,0,100,1,160,0,124,0,106,1, - 161,1,100,2,160,0,124,0,106,2,161,1,103,2,125,1, - 124,0,106,3,100,0,117,1,114,52,124,1,160,4,100,3, - 160,0,124,0,106,3,161,1,161,1,1,0,124,0,106,5, - 100,0,117,1,114,80,124,1,160,4,100,4,160,0,124,0, - 106,5,161,1,161,1,1,0,100,5,160,0,124,0,106,6, - 106,7,100,6,160,8,124,1,161,1,161,2,83,0,41,7, - 78,122,9,110,97,109,101,61,123,33,114,125,122,11,108,111, - 97,100,101,114,61,123,33,114,125,122,11,111,114,105,103,105, - 110,61,123,33,114,125,122,29,115,117,98,109,111,100,117,108, - 101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111, - 110,115,61,123,125,122,6,123,125,40,123,125,41,122,2,44, - 32,41,9,114,49,0,0,0,114,20,0,0,0,114,116,0, - 0,0,114,120,0,0,0,218,6,97,112,112,101,110,100,114, - 123,0,0,0,218,9,95,95,99,108,97,115,115,95,95,114, - 9,0,0,0,218,4,106,111,105,110,41,2,114,33,0,0, - 0,114,59,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,52,0,0,0,123,1,0,0,115,22, - 0,0,0,10,1,10,1,4,255,10,2,18,1,10,1,8, - 1,4,1,6,255,22,2,255,128,122,19,77,111,100,117,108, - 101,83,112,101,99,46,95,95,114,101,112,114,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8, - 0,0,0,67,0,0,0,115,102,0,0,0,124,0,106,0, - 125,2,122,72,124,0,106,1,124,1,106,1,107,2,111,76, - 124,0,106,2,124,1,106,2,107,2,111,76,124,0,106,3, - 124,1,106,3,107,2,111,76,124,2,124,1,106,0,107,2, - 111,76,124,0,106,4,124,1,106,4,107,2,111,76,124,0, - 106,5,124,1,106,5,107,2,87,0,83,0,4,0,116,6, - 121,100,1,0,1,0,1,0,116,7,6,0,89,0,83,0, - 48,0,114,0,0,0,0,41,8,114,123,0,0,0,114,20, - 0,0,0,114,116,0,0,0,114,120,0,0,0,218,6,99, - 97,99,104,101,100,218,12,104,97,115,95,108,111,99,97,116, - 105,111,110,114,2,0,0,0,218,14,78,111,116,73,109,112, - 108,101,109,101,110,116,101,100,41,3,114,33,0,0,0,90, - 5,111,116,104,101,114,90,4,115,109,115,108,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,6,95,95,101, - 113,95,95,133,1,0,0,115,32,0,0,0,6,1,2,1, - 12,1,10,1,2,255,10,2,2,254,8,3,2,253,10,4, - 2,252,10,5,4,251,12,6,10,1,255,128,122,17,77,111, - 100,117,108,101,83,112,101,99,46,95,95,101,113,95,95,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,58,0,0,0,124,0,106, - 0,100,0,117,0,114,52,124,0,106,1,100,0,117,1,114, - 52,124,0,106,2,114,52,116,3,100,0,117,0,114,38,116, - 4,130,1,116,3,160,5,124,0,106,1,161,1,124,0,95, - 0,124,0,106,0,83,0,114,0,0,0,0,41,6,114,125, - 0,0,0,114,120,0,0,0,114,124,0,0,0,218,19,95, - 98,111,111,116,115,116,114,97,112,95,101,120,116,101,114,110, - 97,108,218,19,78,111,116,73,109,112,108,101,109,101,110,116, - 101,100,69,114,114,111,114,90,11,95,103,101,116,95,99,97, - 99,104,101,100,114,51,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,114,129,0,0,0,145,1,0, - 0,115,14,0,0,0,10,2,16,1,8,1,4,1,14,1, - 6,1,255,128,122,17,77,111,100,117,108,101,83,112,101,99, - 46,99,97,99,104,101,100,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, - 115,10,0,0,0,124,1,124,0,95,0,100,0,83,0,114, - 0,0,0,0,41,1,114,125,0,0,0,41,2,114,33,0, - 0,0,114,129,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,129,0,0,0,154,1,0,0,115, - 4,0,0,0,10,2,255,128,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,32,0,0,0,124,0,106,0,100,1,117,0,114,26, - 124,0,106,1,160,2,100,2,161,1,100,3,25,0,83,0, - 124,0,106,1,83,0,41,4,122,32,84,104,101,32,110,97, - 109,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, - 39,115,32,112,97,114,101,110,116,46,78,218,1,46,114,25, - 0,0,0,41,3,114,123,0,0,0,114,20,0,0,0,218, - 10,114,112,97,114,116,105,116,105,111,110,114,51,0,0,0, + 0,0,218,17,95,115,112,101,99,95,102,114,111,109,95,109, + 111,100,117,108,101,201,1,0,0,115,74,0,0,0,2,2, + 10,1,12,1,6,1,8,2,4,1,6,2,8,1,2,1, + 10,1,12,1,6,2,2,1,10,1,12,1,10,1,8,1, + 8,1,2,1,10,1,12,1,10,1,4,2,2,1,10,1, + 12,1,10,1,2,1,14,1,12,1,10,1,14,2,20,1, + 6,1,6,1,4,1,255,128,114,149,0,0,0,70,169,1, + 218,8,111,118,101,114,114,105,100,101,99,2,0,0,0,0, + 0,0,0,1,0,0,0,5,0,0,0,8,0,0,0,67, + 0,0,0,115,214,1,0,0,124,2,115,20,116,0,124,1, + 100,1,100,0,131,3,100,0,117,0,114,52,122,12,124,0, + 106,1,124,1,95,2,87,0,110,18,4,0,116,3,121,50, + 1,0,1,0,1,0,89,0,110,2,48,0,124,2,115,72, + 116,0,124,1,100,2,100,0,131,3,100,0,117,0,114,174, + 124,0,106,4,125,3,124,3,100,0,117,0,114,144,124,0, + 106,5,100,0,117,1,114,144,116,6,100,0,117,0,114,108, + 116,7,130,1,116,6,106,8,125,4,124,4,160,9,124,4, + 161,1,125,3,124,0,106,5,124,3,95,10,124,3,124,0, + 95,4,100,0,124,1,95,11,122,10,124,3,124,1,95,12, + 87,0,110,18,4,0,116,3,121,172,1,0,1,0,1,0, + 89,0,110,2,48,0,124,2,115,194,116,0,124,1,100,3, + 100,0,131,3,100,0,117,0,114,226,122,12,124,0,106,13, + 124,1,95,14,87,0,110,18,4,0,116,3,121,224,1,0, + 1,0,1,0,89,0,110,2,48,0,122,10,124,0,124,1, + 95,15,87,0,110,18,4,0,116,3,121,254,1,0,1,0, + 1,0,89,0,110,2,48,0,124,2,144,1,115,24,116,0, + 124,1,100,4,100,0,131,3,100,0,117,0,144,1,114,70, + 124,0,106,5,100,0,117,1,144,1,114,70,122,12,124,0, + 106,5,124,1,95,16,87,0,110,20,4,0,116,3,144,1, + 121,68,1,0,1,0,1,0,89,0,110,2,48,0,124,0, + 106,17,144,1,114,210,124,2,144,1,115,102,116,0,124,1, + 100,5,100,0,131,3,100,0,117,0,144,1,114,136,122,12, + 124,0,106,18,124,1,95,11,87,0,110,20,4,0,116,3, + 144,1,121,134,1,0,1,0,1,0,89,0,110,2,48,0, + 124,2,144,1,115,160,116,0,124,1,100,6,100,0,131,3, + 100,0,117,0,144,1,114,210,124,0,106,19,100,0,117,1, + 144,1,114,210,122,14,124,0,106,19,124,1,95,20,87,0, + 124,1,83,0,4,0,116,3,144,1,121,208,1,0,1,0, + 1,0,89,0,124,1,83,0,48,0,124,1,83,0,41,7, + 78,114,9,0,0,0,114,106,0,0,0,218,11,95,95,112, + 97,99,107,97,103,101,95,95,114,148,0,0,0,114,115,0, + 0,0,114,146,0,0,0,41,21,114,13,0,0,0,114,20, + 0,0,0,114,9,0,0,0,114,2,0,0,0,114,116,0, + 0,0,114,123,0,0,0,114,133,0,0,0,114,134,0,0, + 0,218,16,95,78,97,109,101,115,112,97,99,101,76,111,97, + 100,101,114,218,7,95,95,110,101,119,95,95,90,5,95,112, + 97,116,104,114,115,0,0,0,114,106,0,0,0,114,137,0, + 0,0,114,152,0,0,0,114,113,0,0,0,114,148,0,0, + 0,114,130,0,0,0,114,120,0,0,0,114,129,0,0,0, + 114,146,0,0,0,41,5,114,103,0,0,0,114,104,0,0, + 0,114,151,0,0,0,114,116,0,0,0,114,153,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 6,112,97,114,101,110,116,158,1,0,0,115,8,0,0,0, - 10,3,16,1,6,2,255,128,122,17,77,111,100,117,108,101, - 83,112,101,99,46,112,97,114,101,110,116,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0, - 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,114, - 0,0,0,0,41,1,114,124,0,0,0,114,51,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 130,0,0,0,166,1,0,0,115,4,0,0,0,6,2,255, - 128,122,23,77,111,100,117,108,101,83,112,101,99,46,104,97, - 115,95,108,111,99,97,116,105,111,110,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67, - 0,0,0,115,14,0,0,0,116,0,124,1,131,1,124,0, - 95,1,100,0,83,0,114,0,0,0,0,41,2,218,4,98, - 111,111,108,114,124,0,0,0,41,2,114,33,0,0,0,218, - 5,118,97,108,117,101,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,130,0,0,0,170,1,0,0,115,4, - 0,0,0,14,2,255,128,41,12,114,9,0,0,0,114,8, - 0,0,0,114,1,0,0,0,114,10,0,0,0,114,34,0, - 0,0,114,52,0,0,0,114,132,0,0,0,218,8,112,114, - 111,112,101,114,116,121,114,129,0,0,0,218,6,115,101,116, - 116,101,114,114,137,0,0,0,114,130,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,119,0,0,0,74,1,0,0,115,36,0,0,0,8, - 0,4,1,4,36,2,1,12,255,8,12,8,10,2,12,10, - 1,4,8,10,1,2,3,10,1,2,7,10,1,4,3,14, - 1,255,128,114,119,0,0,0,169,2,114,120,0,0,0,114, - 122,0,0,0,99,2,0,0,0,0,0,0,0,2,0,0, - 0,6,0,0,0,8,0,0,0,67,0,0,0,115,150,0, - 0,0,116,0,124,1,100,1,131,2,114,74,116,1,100,2, - 117,0,114,22,116,2,130,1,116,1,106,3,125,4,124,3, - 100,2,117,0,114,48,124,4,124,0,124,1,100,3,141,2, - 83,0,124,3,114,56,103,0,110,2,100,2,125,5,124,4, - 124,0,124,1,124,5,100,4,141,3,83,0,124,3,100,2, - 117,0,114,134,116,0,124,1,100,5,131,2,114,130,122,14, - 124,1,160,4,124,0,161,1,125,3,87,0,110,26,4,0, - 116,5,121,128,1,0,1,0,1,0,100,2,125,3,89,0, - 110,6,48,0,100,6,125,3,116,6,124,0,124,1,124,2, - 124,3,100,7,141,4,83,0,41,8,122,53,82,101,116,117, - 114,110,32,97,32,109,111,100,117,108,101,32,115,112,101,99, - 32,98,97,115,101,100,32,111,110,32,118,97,114,105,111,117, - 115,32,108,111,97,100,101,114,32,109,101,116,104,111,100,115, - 46,90,12,103,101,116,95,102,105,108,101,110,97,109,101,78, - 41,1,114,116,0,0,0,41,2,114,116,0,0,0,114,123, - 0,0,0,114,122,0,0,0,70,114,142,0,0,0,41,7, - 114,11,0,0,0,114,133,0,0,0,114,134,0,0,0,218, - 23,115,112,101,99,95,102,114,111,109,95,102,105,108,101,95, - 108,111,99,97,116,105,111,110,114,122,0,0,0,114,83,0, - 0,0,114,119,0,0,0,41,6,114,20,0,0,0,114,116, - 0,0,0,114,120,0,0,0,114,122,0,0,0,114,143,0, - 0,0,90,6,115,101,97,114,99,104,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,98,0,0,0,175,1, - 0,0,115,38,0,0,0,10,2,8,1,4,1,6,1,8, - 2,12,1,12,1,6,1,2,1,6,255,8,3,10,1,2, - 1,14,1,12,1,10,1,4,3,16,2,255,128,114,98,0, - 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,8, - 0,0,0,8,0,0,0,67,0,0,0,115,40,1,0,0, - 122,10,124,0,106,0,125,3,87,0,110,18,4,0,116,1, - 121,28,1,0,1,0,1,0,89,0,110,14,48,0,124,3, - 100,0,117,1,114,42,124,3,83,0,124,0,106,2,125,4, - 124,1,100,0,117,0,114,86,122,10,124,0,106,3,125,1, - 87,0,110,18,4,0,116,1,121,84,1,0,1,0,1,0, - 89,0,110,2,48,0,122,10,124,0,106,4,125,5,87,0, - 110,22,4,0,116,1,121,118,1,0,1,0,1,0,100,0, - 125,5,89,0,110,2,48,0,124,2,100,0,117,0,114,174, - 124,5,100,0,117,0,114,170,122,10,124,1,106,5,125,2, - 87,0,110,26,4,0,116,1,121,168,1,0,1,0,1,0, - 100,0,125,2,89,0,110,6,48,0,124,5,125,2,122,10, - 124,0,106,6,125,6,87,0,110,22,4,0,116,1,121,206, - 1,0,1,0,1,0,100,0,125,6,89,0,110,2,48,0, - 122,14,116,7,124,0,106,8,131,1,125,7,87,0,110,22, - 4,0,116,1,121,244,1,0,1,0,1,0,100,0,125,7, - 89,0,110,2,48,0,116,9,124,4,124,1,124,2,100,1, - 141,3,125,3,124,5,100,0,117,0,144,1,114,18,100,2, - 110,2,100,3,124,3,95,10,124,6,124,3,95,11,124,7, - 124,3,95,12,124,3,83,0,41,4,78,169,1,114,120,0, - 0,0,70,84,41,13,114,113,0,0,0,114,2,0,0,0, - 114,9,0,0,0,114,106,0,0,0,114,115,0,0,0,218, - 7,95,79,82,73,71,73,78,218,10,95,95,99,97,99,104, - 101,100,95,95,218,4,108,105,115,116,218,8,95,95,112,97, - 116,104,95,95,114,119,0,0,0,114,124,0,0,0,114,129, - 0,0,0,114,123,0,0,0,41,8,114,104,0,0,0,114, - 116,0,0,0,114,120,0,0,0,114,103,0,0,0,114,20, - 0,0,0,90,8,108,111,99,97,116,105,111,110,114,129,0, - 0,0,114,123,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,17,95,115,112,101,99,95,102,114, - 111,109,95,109,111,100,117,108,101,201,1,0,0,115,74,0, - 0,0,2,2,10,1,12,1,6,1,8,2,4,1,6,2, - 8,1,2,1,10,1,12,1,6,2,2,1,10,1,12,1, - 10,1,8,1,8,1,2,1,10,1,12,1,10,1,4,2, - 2,1,10,1,12,1,10,1,2,1,14,1,12,1,10,1, - 14,2,20,1,6,1,6,1,4,1,255,128,114,149,0,0, - 0,70,169,1,218,8,111,118,101,114,114,105,100,101,99,2, - 0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,8, - 0,0,0,67,0,0,0,115,214,1,0,0,124,2,115,20, - 116,0,124,1,100,1,100,0,131,3,100,0,117,0,114,52, - 122,12,124,0,106,1,124,1,95,2,87,0,110,18,4,0, - 116,3,121,50,1,0,1,0,1,0,89,0,110,2,48,0, - 124,2,115,72,116,0,124,1,100,2,100,0,131,3,100,0, - 117,0,114,174,124,0,106,4,125,3,124,3,100,0,117,0, - 114,144,124,0,106,5,100,0,117,1,114,144,116,6,100,0, - 117,0,114,108,116,7,130,1,116,6,106,8,125,4,124,4, - 160,9,124,4,161,1,125,3,124,0,106,5,124,3,95,10, - 124,3,124,0,95,4,100,0,124,1,95,11,122,10,124,3, - 124,1,95,12,87,0,110,18,4,0,116,3,121,172,1,0, - 1,0,1,0,89,0,110,2,48,0,124,2,115,194,116,0, - 124,1,100,3,100,0,131,3,100,0,117,0,114,226,122,12, - 124,0,106,13,124,1,95,14,87,0,110,18,4,0,116,3, - 121,224,1,0,1,0,1,0,89,0,110,2,48,0,122,10, - 124,0,124,1,95,15,87,0,110,18,4,0,116,3,121,254, - 1,0,1,0,1,0,89,0,110,2,48,0,124,2,144,1, - 115,24,116,0,124,1,100,4,100,0,131,3,100,0,117,0, - 144,1,114,70,124,0,106,5,100,0,117,1,144,1,114,70, - 122,12,124,0,106,5,124,1,95,16,87,0,110,20,4,0, - 116,3,144,1,121,68,1,0,1,0,1,0,89,0,110,2, - 48,0,124,0,106,17,144,1,114,210,124,2,144,1,115,102, - 116,0,124,1,100,5,100,0,131,3,100,0,117,0,144,1, - 114,136,122,12,124,0,106,18,124,1,95,11,87,0,110,20, - 4,0,116,3,144,1,121,134,1,0,1,0,1,0,89,0, - 110,2,48,0,124,2,144,1,115,160,116,0,124,1,100,6, - 100,0,131,3,100,0,117,0,144,1,114,210,124,0,106,19, - 100,0,117,1,144,1,114,210,122,14,124,0,106,19,124,1, - 95,20,87,0,124,1,83,0,4,0,116,3,144,1,121,208, - 1,0,1,0,1,0,89,0,124,1,83,0,48,0,124,1, - 83,0,41,7,78,114,9,0,0,0,114,106,0,0,0,218, - 11,95,95,112,97,99,107,97,103,101,95,95,114,148,0,0, - 0,114,115,0,0,0,114,146,0,0,0,41,21,114,13,0, - 0,0,114,20,0,0,0,114,9,0,0,0,114,2,0,0, - 0,114,116,0,0,0,114,123,0,0,0,114,133,0,0,0, - 114,134,0,0,0,218,16,95,78,97,109,101,115,112,97,99, - 101,76,111,97,100,101,114,218,7,95,95,110,101,119,95,95, - 90,5,95,112,97,116,104,114,115,0,0,0,114,106,0,0, - 0,114,137,0,0,0,114,152,0,0,0,114,113,0,0,0, - 114,148,0,0,0,114,130,0,0,0,114,120,0,0,0,114, - 129,0,0,0,114,146,0,0,0,41,5,114,103,0,0,0, - 114,104,0,0,0,114,151,0,0,0,114,116,0,0,0,114, - 153,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,18,95,105,110,105,116,95,109,111,100,117,108, - 101,95,97,116,116,114,115,246,1,0,0,115,104,0,0,0, - 20,4,2,1,12,1,12,1,6,1,20,2,6,1,8,1, - 10,2,8,1,4,1,6,1,10,2,8,1,6,1,6,11, - 2,1,10,1,12,1,6,1,20,2,2,1,12,1,12,1, - 6,1,2,2,10,1,12,1,6,1,24,2,12,1,2,1, - 12,1,14,1,6,1,8,2,24,1,2,1,12,1,14,1, - 6,1,24,2,12,1,2,1,10,1,4,3,14,254,2,1, - 4,1,2,255,4,1,255,128,114,155,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,82,0,0,0,100,1,125,1,116, - 0,124,0,106,1,100,2,131,2,114,30,124,0,106,1,160, - 2,124,0,161,1,125,1,110,20,116,0,124,0,106,1,100, - 3,131,2,114,50,116,3,100,4,131,1,130,1,124,1,100, - 1,117,0,114,68,116,4,124,0,106,5,131,1,125,1,116, - 6,124,0,124,1,131,2,1,0,124,1,83,0,41,5,122, - 43,67,114,101,97,116,101,32,97,32,109,111,100,117,108,101, - 32,98,97,115,101,100,32,111,110,32,116,104,101,32,112,114, - 111,118,105,100,101,100,32,115,112,101,99,46,78,218,13,99, - 114,101,97,116,101,95,109,111,100,117,108,101,218,11,101,120, - 101,99,95,109,111,100,117,108,101,122,66,108,111,97,100,101, - 114,115,32,116,104,97,116,32,100,101,102,105,110,101,32,101, - 120,101,99,95,109,111,100,117,108,101,40,41,32,109,117,115, - 116,32,97,108,115,111,32,100,101,102,105,110,101,32,99,114, - 101,97,116,101,95,109,111,100,117,108,101,40,41,41,7,114, - 11,0,0,0,114,116,0,0,0,114,156,0,0,0,114,83, - 0,0,0,114,21,0,0,0,114,20,0,0,0,114,155,0, - 0,0,169,2,114,103,0,0,0,114,104,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,16,109, - 111,100,117,108,101,95,102,114,111,109,95,115,112,101,99,62, - 2,0,0,115,20,0,0,0,4,3,12,1,14,3,12,1, - 8,1,8,2,10,1,10,1,4,1,255,128,114,159,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,4,0,0,0,67,0,0,0,115,100,0,0,0,124, - 0,106,0,100,1,117,0,114,14,100,2,110,4,124,0,106, - 0,125,1,124,0,106,1,100,1,117,0,114,64,124,0,106, - 2,100,1,117,0,114,50,100,3,160,3,124,1,161,1,83, - 0,100,4,160,3,124,1,124,0,106,2,161,2,83,0,124, - 0,106,4,114,84,100,5,160,3,124,1,124,0,106,1,161, - 2,83,0,100,6,160,3,124,0,106,0,124,0,106,1,161, - 2,83,0,41,7,122,38,82,101,116,117,114,110,32,116,104, - 101,32,114,101,112,114,32,116,111,32,117,115,101,32,102,111, - 114,32,116,104,101,32,109,111,100,117,108,101,46,78,114,108, - 0,0,0,114,109,0,0,0,114,110,0,0,0,114,111,0, - 0,0,250,18,60,109,111,100,117,108,101,32,123,33,114,125, - 32,40,123,125,41,62,41,5,114,20,0,0,0,114,120,0, - 0,0,114,116,0,0,0,114,49,0,0,0,114,130,0,0, - 0,41,2,114,103,0,0,0,114,20,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,114,0,0, - 0,79,2,0,0,115,18,0,0,0,20,3,10,1,10,1, - 10,1,14,2,6,2,14,1,16,2,255,128,114,114,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,10,0,0,0,67,0,0,0,115,26,1,0,0,124, - 0,106,0,125,2,116,1,124,2,131,1,143,246,1,0,116, - 2,106,3,160,4,124,2,161,1,124,1,117,1,114,54,100, - 1,160,5,124,2,161,1,125,3,116,6,124,3,124,2,100, - 2,141,2,130,1,122,160,124,0,106,7,100,3,117,0,114, - 106,124,0,106,8,100,3,117,0,114,90,116,6,100,4,124, - 0,106,0,100,2,141,2,130,1,116,9,124,0,124,1,100, - 5,100,6,141,3,1,0,110,80,116,9,124,0,124,1,100, - 5,100,6,141,3,1,0,116,10,124,0,106,7,100,7,131, - 2,115,174,116,11,124,0,106,7,131,1,155,0,100,8,157, - 2,125,3,116,12,160,13,124,3,116,14,161,2,1,0,124, - 0,106,7,160,15,124,2,161,1,1,0,110,12,124,0,106, - 7,160,16,124,1,161,1,1,0,87,0,116,2,106,3,160, - 17,124,0,106,0,161,1,125,1,124,1,116,2,106,3,124, - 0,106,0,60,0,110,28,116,2,106,3,160,17,124,0,106, + 18,95,105,110,105,116,95,109,111,100,117,108,101,95,97,116, + 116,114,115,246,1,0,0,115,104,0,0,0,20,4,2,1, + 12,1,12,1,6,1,20,2,6,1,8,1,10,2,8,1, + 4,1,6,1,10,2,8,1,6,1,6,11,2,1,10,1, + 12,1,6,1,20,2,2,1,12,1,12,1,6,1,2,2, + 10,1,12,1,6,1,24,2,12,1,2,1,12,1,14,1, + 6,1,8,2,24,1,2,1,12,1,14,1,6,1,24,2, + 12,1,2,1,10,1,4,3,14,254,2,1,4,1,2,255, + 4,1,255,128,114,155,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, + 0,0,115,82,0,0,0,100,1,125,1,116,0,124,0,106, + 1,100,2,131,2,114,30,124,0,106,1,160,2,124,0,161, + 1,125,1,110,20,116,0,124,0,106,1,100,3,131,2,114, + 50,116,3,100,4,131,1,130,1,124,1,100,1,117,0,114, + 68,116,4,124,0,106,5,131,1,125,1,116,6,124,0,124, + 1,131,2,1,0,124,1,83,0,41,5,122,43,67,114,101, + 97,116,101,32,97,32,109,111,100,117,108,101,32,98,97,115, + 101,100,32,111,110,32,116,104,101,32,112,114,111,118,105,100, + 101,100,32,115,112,101,99,46,78,218,13,99,114,101,97,116, + 101,95,109,111,100,117,108,101,218,11,101,120,101,99,95,109, + 111,100,117,108,101,122,66,108,111,97,100,101,114,115,32,116, + 104,97,116,32,100,101,102,105,110,101,32,101,120,101,99,95, + 109,111,100,117,108,101,40,41,32,109,117,115,116,32,97,108, + 115,111,32,100,101,102,105,110,101,32,99,114,101,97,116,101, + 95,109,111,100,117,108,101,40,41,41,7,114,11,0,0,0, + 114,116,0,0,0,114,156,0,0,0,114,83,0,0,0,114, + 21,0,0,0,114,20,0,0,0,114,155,0,0,0,169,2, + 114,103,0,0,0,114,104,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,16,109,111,100,117,108, + 101,95,102,114,111,109,95,115,112,101,99,62,2,0,0,115, + 20,0,0,0,4,3,12,1,14,3,12,1,8,1,8,2, + 10,1,10,1,4,1,255,128,114,159,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,67,0,0,0,115,100,0,0,0,124,0,106,0,100, + 1,117,0,114,14,100,2,110,4,124,0,106,0,125,1,124, + 0,106,1,100,1,117,0,114,64,124,0,106,2,100,1,117, + 0,114,50,100,3,160,3,124,1,161,1,83,0,100,4,160, + 3,124,1,124,0,106,2,161,2,83,0,124,0,106,4,114, + 84,100,5,160,3,124,1,124,0,106,1,161,2,83,0,100, + 6,160,3,124,0,106,0,124,0,106,1,161,2,83,0,41, + 7,122,38,82,101,116,117,114,110,32,116,104,101,32,114,101, + 112,114,32,116,111,32,117,115,101,32,102,111,114,32,116,104, + 101,32,109,111,100,117,108,101,46,78,114,108,0,0,0,114, + 109,0,0,0,114,110,0,0,0,114,111,0,0,0,250,18, + 60,109,111,100,117,108,101,32,123,33,114,125,32,40,123,125, + 41,62,41,5,114,20,0,0,0,114,120,0,0,0,114,116, + 0,0,0,114,49,0,0,0,114,130,0,0,0,41,2,114, + 103,0,0,0,114,20,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,114,0,0,0,79,2,0, + 0,115,18,0,0,0,20,3,10,1,10,1,10,1,14,2, + 6,2,14,1,16,2,255,128,114,114,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,10,0, + 0,0,67,0,0,0,115,26,1,0,0,124,0,106,0,125, + 2,116,1,124,2,131,1,143,246,1,0,116,2,106,3,160, + 4,124,2,161,1,124,1,117,1,114,54,100,1,160,5,124, + 2,161,1,125,3,116,6,124,3,124,2,100,2,141,2,130, + 1,122,160,124,0,106,7,100,3,117,0,114,106,124,0,106, + 8,100,3,117,0,114,90,116,6,100,4,124,0,106,0,100, + 2,141,2,130,1,116,9,124,0,124,1,100,5,100,6,141, + 3,1,0,110,80,116,9,124,0,124,1,100,5,100,6,141, + 3,1,0,116,10,124,0,106,7,100,7,131,2,115,174,116, + 11,124,0,106,7,131,1,155,0,100,8,157,2,125,3,116, + 12,160,13,124,3,116,14,161,2,1,0,124,0,106,7,160, + 15,124,2,161,1,1,0,110,12,124,0,106,7,160,16,124, + 1,161,1,1,0,87,0,116,2,106,3,160,17,124,0,106, 0,161,1,125,1,124,1,116,2,106,3,124,0,106,0,60, - 0,48,0,87,0,100,3,4,0,4,0,131,3,1,0,124, - 1,83,0,49,0,144,1,115,12,48,0,1,0,1,0,1, - 0,89,0,1,0,124,1,83,0,41,9,122,70,69,120,101, - 99,117,116,101,32,116,104,101,32,115,112,101,99,39,115,32, - 115,112,101,99,105,102,105,101,100,32,109,111,100,117,108,101, - 32,105,110,32,97,110,32,101,120,105,115,116,105,110,103,32, - 109,111,100,117,108,101,39,115,32,110,97,109,101,115,112,97, - 99,101,46,122,30,109,111,100,117,108,101,32,123,33,114,125, - 32,110,111,116,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,114,19,0,0,0,78,250,14,109,105,115,115,105, - 110,103,32,108,111,97,100,101,114,84,114,150,0,0,0,114, - 157,0,0,0,250,55,46,101,120,101,99,95,109,111,100,117, - 108,101,40,41,32,110,111,116,32,102,111,117,110,100,59,32, - 102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32, - 108,111,97,100,95,109,111,100,117,108,101,40,41,41,18,114, - 20,0,0,0,114,54,0,0,0,114,18,0,0,0,114,99, - 0,0,0,114,38,0,0,0,114,49,0,0,0,114,83,0, - 0,0,114,116,0,0,0,114,123,0,0,0,114,155,0,0, - 0,114,11,0,0,0,114,7,0,0,0,114,95,0,0,0, - 114,96,0,0,0,218,13,73,109,112,111,114,116,87,97,114, - 110,105,110,103,218,11,108,111,97,100,95,109,111,100,117,108, - 101,114,157,0,0,0,218,3,112,111,112,41,4,114,103,0, - 0,0,114,104,0,0,0,114,20,0,0,0,114,102,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,100,0,0,0,96,2,0,0,115,50,0,0,0,6,2, - 10,1,16,1,10,1,12,1,2,1,10,1,10,1,14,1, - 16,2,14,2,12,1,16,1,12,2,14,1,12,2,2,128, - 14,4,14,1,14,255,26,1,4,1,18,255,4,1,255,128, - 114,100,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,18, - 1,0,0,122,18,124,0,106,0,160,1,124,0,106,2,161, - 1,1,0,87,0,110,46,1,0,1,0,1,0,124,0,106, - 2,116,3,106,4,118,0,114,64,116,3,106,4,160,5,124, - 0,106,2,161,1,125,1,124,1,116,3,106,4,124,0,106, - 2,60,0,130,0,116,3,106,4,160,5,124,0,106,2,161, - 1,125,1,124,1,116,3,106,4,124,0,106,2,60,0,116, - 6,124,1,100,1,100,0,131,3,100,0,117,0,114,140,122, - 12,124,0,106,0,124,1,95,7,87,0,110,18,4,0,116, - 8,121,138,1,0,1,0,1,0,89,0,110,2,48,0,116, - 6,124,1,100,2,100,0,131,3,100,0,117,0,114,216,122, - 40,124,1,106,9,124,1,95,10,116,11,124,1,100,3,131, - 2,115,194,124,0,106,2,160,12,100,4,161,1,100,5,25, - 0,124,1,95,10,87,0,110,18,4,0,116,8,121,214,1, + 0,110,28,116,2,106,3,160,17,124,0,106,0,161,1,125, + 1,124,1,116,2,106,3,124,0,106,0,60,0,48,0,87, + 0,100,3,4,0,4,0,131,3,1,0,124,1,83,0,49, + 0,144,1,115,12,48,0,1,0,1,0,1,0,89,0,1, + 0,124,1,83,0,41,9,122,70,69,120,101,99,117,116,101, + 32,116,104,101,32,115,112,101,99,39,115,32,115,112,101,99, + 105,102,105,101,100,32,109,111,100,117,108,101,32,105,110,32, + 97,110,32,101,120,105,115,116,105,110,103,32,109,111,100,117, + 108,101,39,115,32,110,97,109,101,115,112,97,99,101,46,122, + 30,109,111,100,117,108,101,32,123,33,114,125,32,110,111,116, + 32,105,110,32,115,121,115,46,109,111,100,117,108,101,115,114, + 19,0,0,0,78,250,14,109,105,115,115,105,110,103,32,108, + 111,97,100,101,114,84,114,150,0,0,0,114,157,0,0,0, + 250,55,46,101,120,101,99,95,109,111,100,117,108,101,40,41, + 32,110,111,116,32,102,111,117,110,100,59,32,102,97,108,108, + 105,110,103,32,98,97,99,107,32,116,111,32,108,111,97,100, + 95,109,111,100,117,108,101,40,41,41,18,114,20,0,0,0, + 114,54,0,0,0,114,18,0,0,0,114,99,0,0,0,114, + 38,0,0,0,114,49,0,0,0,114,83,0,0,0,114,116, + 0,0,0,114,123,0,0,0,114,155,0,0,0,114,11,0, + 0,0,114,7,0,0,0,114,95,0,0,0,114,96,0,0, + 0,218,13,73,109,112,111,114,116,87,97,114,110,105,110,103, + 218,11,108,111,97,100,95,109,111,100,117,108,101,114,157,0, + 0,0,218,3,112,111,112,41,4,114,103,0,0,0,114,104, + 0,0,0,114,20,0,0,0,114,102,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,100,0,0, + 0,96,2,0,0,115,50,0,0,0,6,2,10,1,16,1, + 10,1,12,1,2,1,10,1,10,1,14,1,16,2,14,2, + 12,1,16,1,12,2,14,1,12,2,2,128,14,4,14,1, + 14,255,26,1,4,1,18,255,4,1,255,128,114,100,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,8,0,0,0,67,0,0,0,115,18,1,0,0,122, + 18,124,0,106,0,160,1,124,0,106,2,161,1,1,0,87, + 0,110,46,1,0,1,0,1,0,124,0,106,2,116,3,106, + 4,118,0,114,64,116,3,106,4,160,5,124,0,106,2,161, + 1,125,1,124,1,116,3,106,4,124,0,106,2,60,0,130, + 0,116,3,106,4,160,5,124,0,106,2,161,1,125,1,124, + 1,116,3,106,4,124,0,106,2,60,0,116,6,124,1,100, + 1,100,0,131,3,100,0,117,0,114,140,122,12,124,0,106, + 0,124,1,95,7,87,0,110,18,4,0,116,8,121,138,1, 0,1,0,1,0,89,0,110,2,48,0,116,6,124,1,100, - 6,100,0,131,3,100,0,117,0,144,1,114,14,122,12,124, - 0,124,1,95,13,87,0,124,1,83,0,4,0,116,8,144, - 1,121,12,1,0,1,0,1,0,89,0,124,1,83,0,48, - 0,124,1,83,0,41,7,78,114,106,0,0,0,114,152,0, - 0,0,114,148,0,0,0,114,135,0,0,0,114,25,0,0, - 0,114,113,0,0,0,41,14,114,116,0,0,0,114,164,0, - 0,0,114,20,0,0,0,114,18,0,0,0,114,99,0,0, - 0,114,165,0,0,0,114,13,0,0,0,114,106,0,0,0, - 114,2,0,0,0,114,9,0,0,0,114,152,0,0,0,114, - 11,0,0,0,114,136,0,0,0,114,113,0,0,0,114,158, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,25,95,108,111,97,100,95,98,97,99,107,119,97, - 114,100,95,99,111,109,112,97,116,105,98,108,101,126,2,0, - 0,115,62,0,0,0,2,3,18,1,6,1,12,1,14,1, - 12,1,2,1,14,3,12,1,16,1,2,1,12,1,12,1, - 6,1,16,1,2,1,8,4,10,1,22,1,12,1,6,1, - 18,1,2,1,8,1,4,3,14,254,2,1,4,1,2,255, - 4,1,255,128,114,166,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,11,0,0,0,67,0, - 0,0,115,240,0,0,0,124,0,106,0,100,0,117,1,114, - 58,116,1,124,0,106,0,100,1,131,2,115,58,116,2,124, - 0,106,0,131,1,155,0,100,2,157,2,125,1,116,3,160, - 4,124,1,116,5,161,2,1,0,116,6,124,0,131,1,83, - 0,116,7,124,0,131,1,125,2,100,3,124,0,95,8,122, - 158,124,2,116,9,106,10,124,0,106,11,60,0,122,50,124, - 0,106,0,100,0,117,0,114,122,124,0,106,12,100,0,117, - 0,114,134,116,13,100,4,124,0,106,11,100,5,141,2,130, - 1,124,0,106,0,160,14,124,2,161,1,1,0,87,0,110, - 40,1,0,1,0,1,0,122,14,116,9,106,10,124,0,106, - 11,61,0,87,0,130,0,4,0,116,15,121,176,1,0,1, - 0,1,0,89,0,130,0,48,0,116,9,106,10,160,16,124, - 0,106,11,161,1,125,2,124,2,116,9,106,10,124,0,106, - 11,60,0,116,17,100,6,124,0,106,11,124,0,106,0,131, - 3,1,0,87,0,100,7,124,0,95,8,124,2,83,0,100, - 7,124,0,95,8,48,0,41,8,78,114,157,0,0,0,114, - 162,0,0,0,84,114,161,0,0,0,114,19,0,0,0,122, - 18,105,109,112,111,114,116,32,123,33,114,125,32,35,32,123, - 33,114,125,70,41,18,114,116,0,0,0,114,11,0,0,0, - 114,7,0,0,0,114,95,0,0,0,114,96,0,0,0,114, - 163,0,0,0,114,166,0,0,0,114,159,0,0,0,90,13, - 95,105,110,105,116,105,97,108,105,122,105,110,103,114,18,0, - 0,0,114,99,0,0,0,114,20,0,0,0,114,123,0,0, - 0,114,83,0,0,0,114,157,0,0,0,114,67,0,0,0, - 114,165,0,0,0,114,80,0,0,0,41,3,114,103,0,0, - 0,114,102,0,0,0,114,104,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,14,95,108,111,97, - 100,95,117,110,108,111,99,107,101,100,162,2,0,0,115,58, - 0,0,0,10,2,12,2,16,1,12,2,8,1,8,2,6, - 5,2,1,12,1,2,1,10,1,10,1,14,1,16,3,6, - 1,2,1,12,1,2,3,12,254,2,1,2,1,2,255,14, - 6,12,1,18,1,6,2,4,2,8,254,255,128,114,167,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,8,0,0,0,67,0,0,0,115,54,0,0,0, - 116,0,124,0,106,1,131,1,143,24,1,0,116,2,124,0, - 131,1,87,0,2,0,100,1,4,0,4,0,131,3,1,0, - 83,0,49,0,115,40,48,0,1,0,1,0,1,0,89,0, - 1,0,100,1,83,0,41,2,122,191,82,101,116,117,114,110, - 32,97,32,110,101,119,32,109,111,100,117,108,101,32,111,98, - 106,101,99,116,44,32,108,111,97,100,101,100,32,98,121,32, - 116,104,101,32,115,112,101,99,39,115,32,108,111,97,100,101, - 114,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,97,100,100,101,100,32, - 116,111,32,105,116,115,32,112,97,114,101,110,116,46,10,10, - 32,32,32,32,73,102,32,97,32,109,111,100,117,108,101,32, - 105,115,32,97,108,114,101,97,100,121,32,105,110,32,115,121, - 115,46,109,111,100,117,108,101,115,44,32,116,104,97,116,32, - 101,120,105,115,116,105,110,103,32,109,111,100,117,108,101,32, - 103,101,116,115,10,32,32,32,32,99,108,111,98,98,101,114, - 101,100,46,10,10,32,32,32,32,78,41,3,114,54,0,0, - 0,114,20,0,0,0,114,167,0,0,0,169,1,114,103,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,101,0,0,0,207,2,0,0,115,6,0,0,0,12, - 9,42,1,255,128,114,101,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, - 0,0,0,115,140,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,90,4,101,5,100,3,100,4,132,0, - 131,1,90,6,101,7,100,20,100,6,100,7,132,1,131,1, - 90,8,101,7,100,21,100,8,100,9,132,1,131,1,90,9, - 101,5,100,10,100,11,132,0,131,1,90,10,101,5,100,12, - 100,13,132,0,131,1,90,11,101,7,101,12,100,14,100,15, - 132,0,131,1,131,1,90,13,101,7,101,12,100,16,100,17, - 132,0,131,1,131,1,90,14,101,7,101,12,100,18,100,19, - 132,0,131,1,131,1,90,15,101,7,101,16,131,1,90,17, - 100,5,83,0,41,22,218,15,66,117,105,108,116,105,110,73, - 109,112,111,114,116,101,114,122,144,77,101,116,97,32,112,97, - 116,104,32,105,109,112,111,114,116,32,102,111,114,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,46,10, - 10,32,32,32,32,65,108,108,32,109,101,116,104,111,100,115, - 32,97,114,101,32,101,105,116,104,101,114,32,99,108,97,115, - 115,32,111,114,32,115,116,97,116,105,99,32,109,101,116,104, - 111,100,115,32,116,111,32,97,118,111,105,100,32,116,104,101, - 32,110,101,101,100,32,116,111,10,32,32,32,32,105,110,115, - 116,97,110,116,105,97,116,101,32,116,104,101,32,99,108,97, - 115,115,46,10,10,32,32,32,32,122,8,98,117,105,108,116, - 45,105,110,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,5,0,0,0,67,0,0,0,115,22,0,0, - 0,100,1,124,0,106,0,155,2,100,2,116,1,106,2,155, - 0,100,3,157,5,83,0,41,5,250,115,82,101,116,117,114, - 110,32,114,101,112,114,32,102,111,114,32,116,104,101,32,109, + 2,100,0,131,3,100,0,117,0,114,216,122,40,124,1,106, + 9,124,1,95,10,116,11,124,1,100,3,131,2,115,194,124, + 0,106,2,160,12,100,4,161,1,100,5,25,0,124,1,95, + 10,87,0,110,18,4,0,116,8,121,214,1,0,1,0,1, + 0,89,0,110,2,48,0,116,6,124,1,100,6,100,0,131, + 3,100,0,117,0,144,1,114,14,122,12,124,0,124,1,95, + 13,87,0,124,1,83,0,4,0,116,8,144,1,121,12,1, + 0,1,0,1,0,89,0,124,1,83,0,48,0,124,1,83, + 0,41,7,78,114,106,0,0,0,114,152,0,0,0,114,148, + 0,0,0,114,135,0,0,0,114,25,0,0,0,114,113,0, + 0,0,41,14,114,116,0,0,0,114,164,0,0,0,114,20, + 0,0,0,114,18,0,0,0,114,99,0,0,0,114,165,0, + 0,0,114,13,0,0,0,114,106,0,0,0,114,2,0,0, + 0,114,9,0,0,0,114,152,0,0,0,114,11,0,0,0, + 114,136,0,0,0,114,113,0,0,0,114,158,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,25, + 95,108,111,97,100,95,98,97,99,107,119,97,114,100,95,99, + 111,109,112,97,116,105,98,108,101,126,2,0,0,115,62,0, + 0,0,2,3,18,1,6,1,12,1,14,1,12,1,2,1, + 14,3,12,1,16,1,2,1,12,1,12,1,6,1,16,1, + 2,1,8,4,10,1,22,1,12,1,6,1,18,1,2,1, + 8,1,4,3,14,254,2,1,4,1,2,255,4,1,255,128, + 114,166,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,11,0,0,0,67,0,0,0,115,240, + 0,0,0,124,0,106,0,100,0,117,1,114,58,116,1,124, + 0,106,0,100,1,131,2,115,58,116,2,124,0,106,0,131, + 1,155,0,100,2,157,2,125,1,116,3,160,4,124,1,116, + 5,161,2,1,0,116,6,124,0,131,1,83,0,116,7,124, + 0,131,1,125,2,100,3,124,0,95,8,122,158,124,2,116, + 9,106,10,124,0,106,11,60,0,122,50,124,0,106,0,100, + 0,117,0,114,122,124,0,106,12,100,0,117,0,114,134,116, + 13,100,4,124,0,106,11,100,5,141,2,130,1,124,0,106, + 0,160,14,124,2,161,1,1,0,87,0,110,40,1,0,1, + 0,1,0,122,14,116,9,106,10,124,0,106,11,61,0,87, + 0,130,0,4,0,116,15,121,176,1,0,1,0,1,0,89, + 0,130,0,48,0,116,9,106,10,160,16,124,0,106,11,161, + 1,125,2,124,2,116,9,106,10,124,0,106,11,60,0,116, + 17,100,6,124,0,106,11,124,0,106,0,131,3,1,0,87, + 0,100,7,124,0,95,8,124,2,83,0,100,7,124,0,95, + 8,48,0,41,8,78,114,157,0,0,0,114,162,0,0,0, + 84,114,161,0,0,0,114,19,0,0,0,122,18,105,109,112, + 111,114,116,32,123,33,114,125,32,35,32,123,33,114,125,70, + 41,18,114,116,0,0,0,114,11,0,0,0,114,7,0,0, + 0,114,95,0,0,0,114,96,0,0,0,114,163,0,0,0, + 114,166,0,0,0,114,159,0,0,0,90,13,95,105,110,105, + 116,105,97,108,105,122,105,110,103,114,18,0,0,0,114,99, + 0,0,0,114,20,0,0,0,114,123,0,0,0,114,83,0, + 0,0,114,157,0,0,0,114,67,0,0,0,114,165,0,0, + 0,114,80,0,0,0,41,3,114,103,0,0,0,114,102,0, + 0,0,114,104,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,14,95,108,111,97,100,95,117,110, + 108,111,99,107,101,100,162,2,0,0,115,58,0,0,0,10, + 2,12,2,16,1,12,2,8,1,8,2,6,5,2,1,12, + 1,2,1,10,1,10,1,14,1,16,3,6,1,2,1,12, + 1,2,3,12,254,2,1,2,1,2,255,14,6,12,1,18, + 1,6,2,4,2,8,254,255,128,114,167,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8, + 0,0,0,67,0,0,0,115,54,0,0,0,116,0,124,0, + 106,1,131,1,143,24,1,0,116,2,124,0,131,1,87,0, + 2,0,100,1,4,0,4,0,131,3,1,0,83,0,49,0, + 115,40,48,0,1,0,1,0,1,0,89,0,1,0,100,1, + 83,0,41,2,122,191,82,101,116,117,114,110,32,97,32,110, + 101,119,32,109,111,100,117,108,101,32,111,98,106,101,99,116, + 44,32,108,111,97,100,101,100,32,98,121,32,116,104,101,32, + 115,112,101,99,39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111,32,105, + 116,115,32,112,97,114,101,110,116,46,10,10,32,32,32,32, + 73,102,32,97,32,109,111,100,117,108,101,32,105,115,32,97, + 108,114,101,97,100,121,32,105,110,32,115,121,115,46,109,111, + 100,117,108,101,115,44,32,116,104,97,116,32,101,120,105,115, + 116,105,110,103,32,109,111,100,117,108,101,32,103,101,116,115, + 10,32,32,32,32,99,108,111,98,98,101,114,101,100,46,10, + 10,32,32,32,32,78,41,3,114,54,0,0,0,114,20,0, + 0,0,114,167,0,0,0,169,1,114,103,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,101,0, + 0,0,207,2,0,0,115,6,0,0,0,12,9,42,1,255, + 128,114,101,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, + 140,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,90,4,101,5,100,3,100,4,132,0,131,1,90,6, + 101,7,100,20,100,6,100,7,132,1,131,1,90,8,101,7, + 100,21,100,8,100,9,132,1,131,1,90,9,101,5,100,10, + 100,11,132,0,131,1,90,10,101,5,100,12,100,13,132,0, + 131,1,90,11,101,7,101,12,100,14,100,15,132,0,131,1, + 131,1,90,13,101,7,101,12,100,16,100,17,132,0,131,1, + 131,1,90,14,101,7,101,12,100,18,100,19,132,0,131,1, + 131,1,90,15,101,7,101,16,131,1,90,17,100,5,83,0, + 41,22,218,15,66,117,105,108,116,105,110,73,109,112,111,114, + 116,101,114,122,144,77,101,116,97,32,112,97,116,104,32,105, + 109,112,111,114,116,32,102,111,114,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,115,46,10,10,32,32,32, + 32,65,108,108,32,109,101,116,104,111,100,115,32,97,114,101, + 32,101,105,116,104,101,114,32,99,108,97,115,115,32,111,114, + 32,115,116,97,116,105,99,32,109,101,116,104,111,100,115,32, + 116,111,32,97,118,111,105,100,32,116,104,101,32,110,101,101, + 100,32,116,111,10,32,32,32,32,105,110,115,116,97,110,116, + 105,97,116,101,32,116,104,101,32,99,108,97,115,115,46,10, + 10,32,32,32,32,122,8,98,117,105,108,116,45,105,110,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 5,0,0,0,67,0,0,0,115,22,0,0,0,100,1,124, + 0,106,0,155,2,100,2,116,1,106,2,155,0,100,3,157, + 5,83,0,41,5,250,115,82,101,116,117,114,110,32,114,101, + 112,114,32,102,111,114,32,116,104,101,32,109,111,100,117,108, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,84,104,101,32,105,109,112,111,114, + 116,32,109,97,99,104,105,110,101,114,121,32,100,111,101,115, + 32,116,104,101,32,106,111,98,32,105,116,115,101,108,102,46, + 10,10,32,32,32,32,32,32,32,32,122,8,60,109,111,100, + 117,108,101,32,122,2,32,40,122,2,41,62,78,41,3,114, + 9,0,0,0,114,169,0,0,0,114,145,0,0,0,169,1, + 114,104,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,107,0,0,0,233,2,0,0,115,4,0, + 0,0,22,7,255,128,122,27,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,4,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,5,0,0,0,67,0,0,0,115,42,0, + 0,0,124,2,100,0,117,1,114,12,100,0,83,0,116,0, + 160,1,124,1,161,1,114,38,116,2,124,1,124,0,124,0, + 106,3,100,1,141,3,83,0,100,0,83,0,169,2,78,114, + 144,0,0,0,41,4,114,61,0,0,0,90,10,105,115,95, + 98,117,105,108,116,105,110,114,98,0,0,0,114,145,0,0, + 0,169,4,218,3,99,108,115,114,85,0,0,0,218,4,112, + 97,116,104,218,6,116,97,114,103,101,116,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,9,102,105,110,100, + 95,115,112,101,99,242,2,0,0,115,12,0,0,0,8,2, + 4,1,10,1,16,1,4,2,255,128,122,25,66,117,105,108, + 116,105,110,73,109,112,111,114,116,101,114,46,102,105,110,100, + 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,30, + 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, + 3,100,1,117,1,114,26,124,3,106,1,83,0,100,1,83, + 0,41,2,122,175,70,105,110,100,32,116,104,101,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,73,102,32,39,112,97,116,104, + 39,32,105,115,32,101,118,101,114,32,115,112,101,99,105,102, + 105,101,100,32,116,104,101,110,32,116,104,101,32,115,101,97, + 114,99,104,32,105,115,32,99,111,110,115,105,100,101,114,101, + 100,32,97,32,102,97,105,108,117,114,101,46,10,10,32,32, + 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40, + 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, + 32,32,32,32,78,41,2,114,177,0,0,0,114,116,0,0, + 0,41,4,114,174,0,0,0,114,85,0,0,0,114,175,0, + 0,0,114,103,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,11,102,105,110,100,95,109,111,100, + 117,108,101,251,2,0,0,115,6,0,0,0,12,9,18,1, + 255,128,122,27,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, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 4,0,0,0,67,0,0,0,115,46,0,0,0,124,0,106, + 0,116,1,106,2,118,1,114,34,116,3,100,1,160,4,124, + 0,106,0,161,1,124,0,106,0,100,2,141,2,130,1,116, + 5,116,6,106,7,124,0,131,2,83,0,41,4,122,24,67, + 114,101,97,116,101,32,97,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,114,81,0,0,0,114,19,0,0, + 0,78,41,8,114,20,0,0,0,114,18,0,0,0,114,82, + 0,0,0,114,83,0,0,0,114,49,0,0,0,114,71,0, + 0,0,114,61,0,0,0,90,14,99,114,101,97,116,101,95, + 98,117,105,108,116,105,110,114,168,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,156,0,0,0, + 7,3,0,0,115,12,0,0,0,12,3,12,1,4,1,6, + 255,12,2,255,128,122,29,66,117,105,108,116,105,110,73,109, + 112,111,114,116,101,114,46,99,114,101,97,116,101,95,109,111, + 100,117,108,101,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,16,0, + 0,0,116,0,116,1,106,2,124,0,131,2,1,0,100,1, + 83,0,41,2,122,22,69,120,101,99,32,97,32,98,117,105, + 108,116,45,105,110,32,109,111,100,117,108,101,78,41,3,114, + 71,0,0,0,114,61,0,0,0,90,12,101,120,101,99,95, + 98,117,105,108,116,105,110,114,171,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,157,0,0,0, + 15,3,0,0,115,4,0,0,0,16,3,255,128,122,27,66, + 117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,101, + 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,57, + 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, + 100,111,32,110,111,116,32,104,97,118,101,32,99,111,100,101, + 32,111,98,106,101,99,116,115,46,78,114,5,0,0,0,169, + 2,114,174,0,0,0,114,85,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,8,103,101,116,95, + 99,111,100,101,20,3,0,0,115,4,0,0,0,4,4,255, + 128,122,24,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,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, + 56,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, + 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, + 114,99,101,32,99,111,100,101,46,78,114,5,0,0,0,114, + 179,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,26, + 3,0,0,115,4,0,0,0,4,4,255,128,122,26,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,3,122,52,82,101, + 116,117,114,110,32,70,97,108,115,101,32,97,115,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,97, + 114,101,32,110,101,118,101,114,32,112,97,99,107,97,103,101, + 115,46,70,78,114,5,0,0,0,114,179,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,122,0, + 0,0,32,3,0,0,115,4,0,0,0,4,4,255,128,122, + 26,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,41,2,78,78,41, + 1,78,41,18,114,9,0,0,0,114,8,0,0,0,114,1, + 0,0,0,114,10,0,0,0,114,145,0,0,0,218,12,115, + 116,97,116,105,99,109,101,116,104,111,100,114,107,0,0,0, + 218,11,99,108,97,115,115,109,101,116,104,111,100,114,177,0, + 0,0,114,178,0,0,0,114,156,0,0,0,114,157,0,0, + 0,114,90,0,0,0,114,180,0,0,0,114,181,0,0,0, + 114,122,0,0,0,114,105,0,0,0,114,164,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,169,0,0,0,222,2,0,0,115,48,0,0, + 0,8,0,4,2,4,7,2,2,10,1,2,8,12,1,2, + 8,12,1,2,11,10,1,2,7,10,1,2,4,2,1,12, + 1,2,4,2,1,12,1,2,4,2,1,12,1,12,4,255, + 128,114,169,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, + 144,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,90,4,101,5,100,3,100,4,132,0,131,1,90,6, + 101,7,100,22,100,6,100,7,132,1,131,1,90,8,101,7, + 100,23,100,8,100,9,132,1,131,1,90,9,101,5,100,10, + 100,11,132,0,131,1,90,10,101,5,100,12,100,13,132,0, + 131,1,90,11,101,7,100,14,100,15,132,0,131,1,90,12, + 101,7,101,13,100,16,100,17,132,0,131,1,131,1,90,14, + 101,7,101,13,100,18,100,19,132,0,131,1,131,1,90,15, + 101,7,101,13,100,20,100,21,132,0,131,1,131,1,90,16, + 100,5,83,0,41,24,218,14,70,114,111,122,101,110,73,109, + 112,111,114,116,101,114,122,142,77,101,116,97,32,112,97,116, + 104,32,105,109,112,111,114,116,32,102,111,114,32,102,114,111, + 122,101,110,32,109,111,100,117,108,101,115,46,10,10,32,32, + 32,32,65,108,108,32,109,101,116,104,111,100,115,32,97,114, + 101,32,101,105,116,104,101,114,32,99,108,97,115,115,32,111, + 114,32,115,116,97,116,105,99,32,109,101,116,104,111,100,115, + 32,116,111,32,97,118,111,105,100,32,116,104,101,32,110,101, + 101,100,32,116,111,10,32,32,32,32,105,110,115,116,97,110, + 116,105,97,116,101,32,116,104,101,32,99,108,97,115,115,46, + 10,10,32,32,32,32,90,6,102,114,111,122,101,110,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, + 0,0,0,67,0,0,0,115,16,0,0,0,100,1,160,0, + 124,0,106,1,116,2,106,3,161,2,83,0,41,3,114,170, + 0,0,0,114,160,0,0,0,78,41,4,114,49,0,0,0, + 114,9,0,0,0,114,184,0,0,0,114,145,0,0,0,41, + 1,218,1,109,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,107,0,0,0,52,3,0,0,115,4,0,0, + 0,16,7,255,128,122,26,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,4,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,5,0,0,0,67,0,0,0,115,30,0,0,0, + 116,0,160,1,124,1,161,1,114,26,116,2,124,1,124,0, + 124,0,106,3,100,1,141,3,83,0,100,0,83,0,114,172, + 0,0,0,41,4,114,61,0,0,0,114,92,0,0,0,114, + 98,0,0,0,114,145,0,0,0,114,173,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,177,0, + 0,0,61,3,0,0,115,8,0,0,0,10,2,16,1,4, + 2,255,128,122,24,70,114,111,122,101,110,73,109,112,111,114, + 116,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,18,0,0,0,116,0,160,1,124, + 1,161,1,114,14,124,0,83,0,100,1,83,0,41,2,122, + 93,70,105,110,100,32,97,32,102,114,111,122,101,110,32,109, 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, - 84,104,101,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,84,104,101,32,105, - 109,112,111,114,116,32,109,97,99,104,105,110,101,114,121,32, - 100,111,101,115,32,116,104,101,32,106,111,98,32,105,116,115, - 101,108,102,46,10,10,32,32,32,32,32,32,32,32,122,8, - 60,109,111,100,117,108,101,32,122,2,32,40,122,2,41,62, - 78,41,3,114,9,0,0,0,114,169,0,0,0,114,145,0, - 0,0,169,1,114,104,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,114,107,0,0,0,233,2,0, - 0,115,4,0,0,0,22,7,255,128,122,27,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,4,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, - 0,115,42,0,0,0,124,2,100,0,117,1,114,12,100,0, - 83,0,116,0,160,1,124,1,161,1,114,38,116,2,124,1, - 124,0,124,0,106,3,100,1,141,3,83,0,100,0,83,0, - 169,2,78,114,144,0,0,0,41,4,114,61,0,0,0,90, - 10,105,115,95,98,117,105,108,116,105,110,114,98,0,0,0, - 114,145,0,0,0,169,4,218,3,99,108,115,114,85,0,0, - 0,218,4,112,97,116,104,218,6,116,97,114,103,101,116,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,9, - 102,105,110,100,95,115,112,101,99,242,2,0,0,115,12,0, - 0,0,8,2,4,1,10,1,16,1,4,2,255,128,122,25, - 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46, - 102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, - 0,0,115,30,0,0,0,124,0,160,0,124,1,124,2,161, - 2,125,3,124,3,100,1,117,1,114,26,124,3,106,1,83, - 0,100,1,83,0,41,2,122,175,70,105,110,100,32,116,104, - 101,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,39, - 112,97,116,104,39,32,105,115,32,101,118,101,114,32,115,112, - 101,99,105,102,105,101,100,32,116,104,101,110,32,116,104,101, - 32,115,101,97,114,99,104,32,105,115,32,99,111,110,115,105, - 100,101,114,101,100,32,97,32,102,97,105,108,117,114,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, - 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,32,32,85,115,101,32,102,105,110,100,95,115, - 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,78,41,2,114,177,0,0,0, - 114,116,0,0,0,41,4,114,174,0,0,0,114,85,0,0, - 0,114,175,0,0,0,114,103,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,11,102,105,110,100, - 95,109,111,100,117,108,101,251,2,0,0,115,6,0,0,0, - 12,9,18,1,255,128,122,27,66,117,105,108,116,105,110,73, - 109,112,111,114,116,101,114,46,102,105,110,100,95,109,111,100, + 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, + 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, + 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,41, + 2,114,61,0,0,0,114,92,0,0,0,41,3,114,174,0, + 0,0,114,85,0,0,0,114,175,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,178,0,0,0, + 68,3,0,0,115,4,0,0,0,18,7,255,128,122,26,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,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,42,85, + 115,101,32,100,101,102,97,117,108,116,32,115,101,109,97,110, + 116,105,99,115,32,102,111,114,32,109,111,100,117,108,101,32, + 99,114,101,97,116,105,111,110,46,78,114,5,0,0,0,114, + 168,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,156,0,0,0,77,3,0,0,115,4,0,0, + 0,4,0,255,128,122,28,70,114,111,122,101,110,73,109,112, + 111,114,116,101,114,46,99,114,101,97,116,101,95,109,111,100, 117,108,101,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,4,0,0,0,67,0,0,0,115,46,0,0, - 0,124,0,106,0,116,1,106,2,118,1,114,34,116,3,100, - 1,160,4,124,0,106,0,161,1,124,0,106,0,100,2,141, - 2,130,1,116,5,116,6,106,7,124,0,131,2,83,0,41, - 4,122,24,67,114,101,97,116,101,32,97,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,114,81,0,0,0, - 114,19,0,0,0,78,41,8,114,20,0,0,0,114,18,0, - 0,0,114,82,0,0,0,114,83,0,0,0,114,49,0,0, - 0,114,71,0,0,0,114,61,0,0,0,90,14,99,114,101, - 97,116,101,95,98,117,105,108,116,105,110,114,168,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 156,0,0,0,7,3,0,0,115,12,0,0,0,12,3,12, - 1,4,1,6,255,12,2,255,128,122,29,66,117,105,108,116, - 105,110,73,109,112,111,114,116,101,114,46,99,114,101,97,116, - 101,95,109,111,100,117,108,101,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,16,0,0,0,116,0,116,1,106,2,124,0,131,2, - 1,0,100,1,83,0,41,2,122,22,69,120,101,99,32,97, - 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, - 78,41,3,114,71,0,0,0,114,61,0,0,0,90,12,101, - 120,101,99,95,98,117,105,108,116,105,110,114,171,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 157,0,0,0,15,3,0,0,115,4,0,0,0,16,3,255, - 128,122,27,66,117,105,108,116,105,110,73,109,112,111,114,116, - 101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2, + 3,0,0,0,4,0,0,0,67,0,0,0,115,64,0,0, + 0,124,0,106,0,106,1,125,1,116,2,160,3,124,1,161, + 1,115,36,116,4,100,1,160,5,124,1,161,1,124,1,100, + 2,141,2,130,1,116,6,116,2,106,7,124,1,131,2,125, + 2,116,8,124,2,124,0,106,9,131,2,1,0,100,0,83, + 0,114,91,0,0,0,41,10,114,113,0,0,0,114,20,0, + 0,0,114,61,0,0,0,114,92,0,0,0,114,83,0,0, + 0,114,49,0,0,0,114,71,0,0,0,218,17,103,101,116, + 95,102,114,111,122,101,110,95,111,98,106,101,99,116,218,4, + 101,120,101,99,114,14,0,0,0,41,3,114,104,0,0,0, + 114,20,0,0,0,218,4,99,111,100,101,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,157,0,0,0,81, + 3,0,0,115,16,0,0,0,8,2,10,1,10,1,2,1, + 6,255,12,2,16,1,255,128,122,26,70,114,111,122,101,110, + 73,109,112,111,114,116,101,114,46,101,120,101,99,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,10,0, + 0,0,116,0,124,0,124,1,131,2,83,0,41,2,122,95, + 76,111,97,100,32,97,32,102,114,111,122,101,110,32,109,111, + 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101, + 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, + 41,1,114,105,0,0,0,114,179,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,164,0,0,0, + 90,3,0,0,115,4,0,0,0,10,8,255,128,122,26,70, + 114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, + 0,0,115,10,0,0,0,116,0,160,1,124,1,161,1,83, + 0,41,2,122,45,82,101,116,117,114,110,32,116,104,101,32, + 99,111,100,101,32,111,98,106,101,99,116,32,102,111,114,32, + 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,46,78,41,2,114,61,0,0,0,114,186,0,0,0,114, + 179,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,180,0,0,0,100,3,0,0,115,4,0,0, + 0,10,4,255,128,122,23,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,0,0,0,0,2,0,0,0,1, 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, - 41,2,122,57,82,101,116,117,114,110,32,78,111,110,101,32, - 97,115,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32, - 99,111,100,101,32,111,98,106,101,99,116,115,46,78,114,5, - 0,0,0,169,2,114,174,0,0,0,114,85,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,8, - 103,101,116,95,99,111,100,101,20,3,0,0,115,4,0,0, - 0,4,4,255,128,122,24,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,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,122,56,82,101,116,117,114,110,32,78,111,110,101, - 32,97,115,32,98,117,105,108,116,45,105,110,32,109,111,100, - 117,108,101,115,32,100,111,32,110,111,116,32,104,97,118,101, - 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,5, - 0,0,0,114,179,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,10,103,101,116,95,115,111,117, - 114,99,101,26,3,0,0,115,4,0,0,0,4,4,255,128, - 122,26,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,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,3, - 122,52,82,101,116,117,114,110,32,70,97,108,115,101,32,97, - 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,115,32,97,114,101,32,110,101,118,101,114,32,112,97,99, - 107,97,103,101,115,46,70,78,114,5,0,0,0,114,179,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,122,0,0,0,32,3,0,0,115,4,0,0,0,4, - 4,255,128,122,26,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,41, - 2,78,78,41,1,78,41,18,114,9,0,0,0,114,8,0, - 0,0,114,1,0,0,0,114,10,0,0,0,114,145,0,0, - 0,218,12,115,116,97,116,105,99,109,101,116,104,111,100,114, - 107,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111, - 100,114,177,0,0,0,114,178,0,0,0,114,156,0,0,0, - 114,157,0,0,0,114,90,0,0,0,114,180,0,0,0,114, - 181,0,0,0,114,122,0,0,0,114,105,0,0,0,114,164, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,169,0,0,0,222,2,0,0, - 115,48,0,0,0,8,0,4,2,4,7,2,2,10,1,2, - 8,12,1,2,8,12,1,2,11,10,1,2,7,10,1,2, - 4,2,1,12,1,2,4,2,1,12,1,2,4,2,1,12, - 1,12,4,255,128,114,169,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, - 0,0,0,115,144,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,90,4,101,5,100,3,100,4,132,0, - 131,1,90,6,101,7,100,22,100,6,100,7,132,1,131,1, - 90,8,101,7,100,23,100,8,100,9,132,1,131,1,90,9, - 101,5,100,10,100,11,132,0,131,1,90,10,101,5,100,12, - 100,13,132,0,131,1,90,11,101,7,100,14,100,15,132,0, - 131,1,90,12,101,7,101,13,100,16,100,17,132,0,131,1, - 131,1,90,14,101,7,101,13,100,18,100,19,132,0,131,1, - 131,1,90,15,101,7,101,13,100,20,100,21,132,0,131,1, - 131,1,90,16,100,5,83,0,41,24,218,14,70,114,111,122, - 101,110,73,109,112,111,114,116,101,114,122,142,77,101,116,97, - 32,112,97,116,104,32,105,109,112,111,114,116,32,102,111,114, - 32,102,114,111,122,101,110,32,109,111,100,117,108,101,115,46, - 10,10,32,32,32,32,65,108,108,32,109,101,116,104,111,100, - 115,32,97,114,101,32,101,105,116,104,101,114,32,99,108,97, - 115,115,32,111,114,32,115,116,97,116,105,99,32,109,101,116, - 104,111,100,115,32,116,111,32,97,118,111,105,100,32,116,104, - 101,32,110,101,101,100,32,116,111,10,32,32,32,32,105,110, - 115,116,97,110,116,105,97,116,101,32,116,104,101,32,99,108, - 97,115,115,46,10,10,32,32,32,32,90,6,102,114,111,122, - 101,110,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,4,0,0,0,67,0,0,0,115,16,0,0,0, - 100,1,160,0,124,0,106,1,116,2,106,3,161,2,83,0, - 41,3,114,170,0,0,0,114,160,0,0,0,78,41,4,114, - 49,0,0,0,114,9,0,0,0,114,184,0,0,0,114,145, - 0,0,0,41,1,218,1,109,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,107,0,0,0,52,3,0,0, - 115,4,0,0,0,16,7,255,128,122,26,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,4,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, - 30,0,0,0,116,0,160,1,124,1,161,1,114,26,116,2, - 124,1,124,0,124,0,106,3,100,1,141,3,83,0,100,0, - 83,0,114,172,0,0,0,41,4,114,61,0,0,0,114,92, - 0,0,0,114,98,0,0,0,114,145,0,0,0,114,173,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,177,0,0,0,61,3,0,0,115,8,0,0,0,10, - 2,16,1,4,2,255,128,122,24,70,114,111,122,101,110,73, - 109,112,111,114,116,101,114,46,102,105,110,100,95,115,112,101, - 99,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,3,0,0,0,67,0,0,0,115,18,0,0,0,116, - 0,160,1,124,1,161,1,114,14,124,0,83,0,100,1,83, - 0,41,2,122,93,70,105,110,100,32,97,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,46,10,10,32,32,32,32, - 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, - 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, - 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, - 32,32,78,41,2,114,61,0,0,0,114,92,0,0,0,41, - 3,114,174,0,0,0,114,85,0,0,0,114,175,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 178,0,0,0,68,3,0,0,115,4,0,0,0,18,7,255, - 128,122,26,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,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,115, - 101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,100, - 117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,5, - 0,0,0,114,168,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,156,0,0,0,77,3,0,0, - 115,4,0,0,0,4,0,255,128,122,28,70,114,111,122,101, - 110,73,109,112,111,114,116,101,114,46,99,114,101,97,116,101, - 95,109,111,100,117,108,101,99,1,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,4,0,0,0,67,0,0,0, - 115,64,0,0,0,124,0,106,0,106,1,125,1,116,2,160, - 3,124,1,161,1,115,36,116,4,100,1,160,5,124,1,161, - 1,124,1,100,2,141,2,130,1,116,6,116,2,106,7,124, - 1,131,2,125,2,116,8,124,2,124,0,106,9,131,2,1, - 0,100,0,83,0,114,91,0,0,0,41,10,114,113,0,0, - 0,114,20,0,0,0,114,61,0,0,0,114,92,0,0,0, - 114,83,0,0,0,114,49,0,0,0,114,71,0,0,0,218, - 17,103,101,116,95,102,114,111,122,101,110,95,111,98,106,101, - 99,116,218,4,101,120,101,99,114,14,0,0,0,41,3,114, - 104,0,0,0,114,20,0,0,0,218,4,99,111,100,101,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,157, - 0,0,0,81,3,0,0,115,16,0,0,0,8,2,10,1, - 10,1,2,1,6,255,12,2,16,1,255,128,122,26,70,114, - 111,122,101,110,73,109,112,111,114,116,101,114,46,101,120,101, - 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, - 0,115,10,0,0,0,116,0,124,0,124,1,131,2,83,0, - 41,2,122,95,76,111,97,100,32,97,32,102,114,111,122,101, - 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, - 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, - 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, - 115,101,32,101,120,101,99,95,109,111,100,117,108,101,40,41, - 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, - 32,32,32,78,41,1,114,105,0,0,0,114,179,0,0,0, + 41,2,122,54,82,101,116,117,114,110,32,78,111,110,101,32, + 97,115,32,102,114,111,122,101,110,32,109,111,100,117,108,101, + 115,32,100,111,32,110,111,116,32,104,97,118,101,32,115,111, + 117,114,99,101,32,99,111,100,101,46,78,114,5,0,0,0, + 114,179,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,181,0,0,0,106,3,0,0,115,4,0, + 0,0,4,4,255,128,122,25,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,0,0,0,0,2,0, + 0,0,3,0,0,0,67,0,0,0,115,10,0,0,0,116, + 0,160,1,124,1,161,1,83,0,41,2,122,46,82,101,116, + 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, + 102,114,111,122,101,110,32,109,111,100,117,108,101,32,105,115, + 32,97,32,112,97,99,107,97,103,101,46,78,41,2,114,61, + 0,0,0,90,17,105,115,95,102,114,111,122,101,110,95,112, + 97,99,107,97,103,101,114,179,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,122,0,0,0,112, + 3,0,0,115,4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17, + 114,9,0,0,0,114,8,0,0,0,114,1,0,0,0,114, + 10,0,0,0,114,145,0,0,0,114,182,0,0,0,114,107, + 0,0,0,114,183,0,0,0,114,177,0,0,0,114,178,0, + 0,0,114,156,0,0,0,114,157,0,0,0,114,164,0,0, + 0,114,94,0,0,0,114,180,0,0,0,114,181,0,0,0, + 114,122,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,184,0,0,0,41,3, + 0,0,115,50,0,0,0,8,0,4,2,4,7,2,2,10, + 1,2,8,12,1,2,6,12,1,2,8,10,1,2,3,10, + 1,2,8,10,1,2,9,2,1,12,1,2,4,2,1,12, + 1,2,4,2,1,16,1,255,128,114,184,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,64,0,0,0,115,32,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,100,6,83,0,41,7,218,18, + 95,73,109,112,111,114,116,76,111,99,107,67,111,110,116,101, + 120,116,122,36,67,111,110,116,101,120,116,32,109,97,110,97, + 103,101,114,32,102,111,114,32,116,104,101,32,105,109,112,111, + 114,116,32,108,111,99,107,46,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,0, + 0,115,12,0,0,0,116,0,160,1,161,0,1,0,100,1, + 83,0,41,2,122,24,65,99,113,117,105,114,101,32,116,104, + 101,32,105,109,112,111,114,116,32,108,111,99,107,46,78,41, + 2,114,61,0,0,0,114,62,0,0,0,114,51,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 164,0,0,0,90,3,0,0,115,4,0,0,0,10,8,255, - 128,122,26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, - 1,161,1,83,0,41,2,122,45,82,101,116,117,114,110,32, - 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, - 102,111,114,32,116,104,101,32,102,114,111,122,101,110,32,109, - 111,100,117,108,101,46,78,41,2,114,61,0,0,0,114,186, - 0,0,0,114,179,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,180,0,0,0,100,3,0,0, - 115,4,0,0,0,10,4,255,128,122,23,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,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,54,82,101,116,117,114,110,32,78, - 111,110,101,32,97,115,32,102,114,111,122,101,110,32,109,111, - 100,117,108,101,115,32,100,111,32,110,111,116,32,104,97,118, - 101,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114, - 5,0,0,0,114,179,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,114,181,0,0,0,106,3,0, - 0,115,4,0,0,0,4,4,255,128,122,25,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,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, - 0,0,0,116,0,160,1,124,1,161,1,83,0,41,2,122, - 46,82,101,116,117,114,110,32,84,114,117,101,32,105,102,32, - 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,78, - 41,2,114,61,0,0,0,90,17,105,115,95,102,114,111,122, - 101,110,95,112,97,99,107,97,103,101,114,179,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,122, - 0,0,0,112,3,0,0,115,4,0,0,0,10,4,255,128, - 122,25,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,41,2,78,78,41, - 1,78,41,17,114,9,0,0,0,114,8,0,0,0,114,1, - 0,0,0,114,10,0,0,0,114,145,0,0,0,114,182,0, - 0,0,114,107,0,0,0,114,183,0,0,0,114,177,0,0, - 0,114,178,0,0,0,114,156,0,0,0,114,157,0,0,0, - 114,164,0,0,0,114,94,0,0,0,114,180,0,0,0,114, - 181,0,0,0,114,122,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,184,0, - 0,0,41,3,0,0,115,50,0,0,0,8,0,4,2,4, - 7,2,2,10,1,2,8,12,1,2,6,12,1,2,8,10, - 1,2,3,10,1,2,8,10,1,2,9,2,1,12,1,2, - 4,2,1,12,1,2,4,2,1,16,1,255,128,114,184,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,64,0,0,0,115,32,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,83,0, - 41,7,218,18,95,73,109,112,111,114,116,76,111,99,107,67, - 111,110,116,101,120,116,122,36,67,111,110,116,101,120,116,32, - 109,97,110,97,103,101,114,32,102,111,114,32,116,104,101,32, - 105,109,112,111,114,116,32,108,111,99,107,46,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, - 0,67,0,0,0,115,12,0,0,0,116,0,160,1,161,0, - 1,0,100,1,83,0,41,2,122,24,65,99,113,117,105,114, - 101,32,116,104,101,32,105,109,112,111,114,116,32,108,111,99, - 107,46,78,41,2,114,61,0,0,0,114,62,0,0,0,114, - 51,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,58,0,0,0,125,3,0,0,115,4,0,0, - 0,12,2,255,128,122,28,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,0,0,0,0, - 4,0,0,0,2,0,0,0,67,0,0,0,115,12,0,0, - 0,116,0,160,1,161,0,1,0,100,1,83,0,41,2,122, - 60,82,101,108,101,97,115,101,32,116,104,101,32,105,109,112, - 111,114,116,32,108,111,99,107,32,114,101,103,97,114,100,108, - 101,115,115,32,111,102,32,97,110,121,32,114,97,105,115,101, - 100,32,101,120,99,101,112,116,105,111,110,115,46,78,41,2, - 114,61,0,0,0,114,64,0,0,0,41,4,114,33,0,0, - 0,218,8,101,120,99,95,116,121,112,101,218,9,101,120,99, - 95,118,97,108,117,101,218,13,101,120,99,95,116,114,97,99, - 101,98,97,99,107,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,60,0,0,0,129,3,0,0,115,4,0, - 0,0,12,2,255,128,122,27,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,41,6,114,9,0,0,0,114,8,0,0,0, - 114,1,0,0,0,114,10,0,0,0,114,58,0,0,0,114, - 60,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,114,189,0,0,0,121,3,0, - 0,115,10,0,0,0,8,0,4,2,8,2,12,4,255,128, - 114,189,0,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,64, - 0,0,0,124,1,160,0,100,1,124,2,100,2,24,0,161, - 2,125,3,116,1,124,3,131,1,124,2,107,0,114,36,116, - 2,100,3,131,1,130,1,124,3,100,4,25,0,125,4,124, - 0,114,60,100,5,160,3,124,4,124,0,161,2,83,0,124, - 4,83,0,41,7,122,50,82,101,115,111,108,118,101,32,97, - 32,114,101,108,97,116,105,118,101,32,109,111,100,117,108,101, - 32,110,97,109,101,32,116,111,32,97,110,32,97,98,115,111, - 108,117,116,101,32,111,110,101,46,114,135,0,0,0,114,42, - 0,0,0,122,50,97,116,116,101,109,112,116,101,100,32,114, - 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,98, - 101,121,111,110,100,32,116,111,112,45,108,101,118,101,108,32, - 112,97,99,107,97,103,101,114,25,0,0,0,250,5,123,125, - 46,123,125,78,41,4,218,6,114,115,112,108,105,116,218,3, - 108,101,110,114,83,0,0,0,114,49,0,0,0,41,5,114, - 20,0,0,0,218,7,112,97,99,107,97,103,101,218,5,108, - 101,118,101,108,90,4,98,105,116,115,90,4,98,97,115,101, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 13,95,114,101,115,111,108,118,101,95,110,97,109,101,134,3, - 0,0,115,12,0,0,0,16,2,12,1,8,1,8,1,20, - 1,255,128,114,198,0,0,0,99,3,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, - 0,115,34,0,0,0,124,0,160,0,124,1,124,2,161,2, - 125,3,124,3,100,0,117,0,114,24,100,0,83,0,116,1, - 124,1,124,3,131,2,83,0,114,0,0,0,0,41,2,114, - 178,0,0,0,114,98,0,0,0,41,4,218,6,102,105,110, - 100,101,114,114,20,0,0,0,114,175,0,0,0,114,116,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,17,95,102,105,110,100,95,115,112,101,99,95,108,101, - 103,97,99,121,143,3,0,0,115,10,0,0,0,12,3,8, - 1,4,1,10,1,255,128,114,200,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0, - 0,67,0,0,0,115,28,1,0,0,116,0,106,1,125,3, - 124,3,100,1,117,0,114,22,116,2,100,2,131,1,130,1, - 124,3,115,38,116,3,160,4,100,3,116,5,161,2,1,0, - 124,0,116,0,106,6,118,0,125,4,124,3,68,0,93,226, - 125,5,116,7,131,0,143,94,1,0,122,10,124,5,106,8, - 125,6,87,0,110,54,4,0,116,9,121,128,1,0,1,0, - 1,0,116,10,124,5,124,0,124,1,131,3,125,7,124,7, - 100,1,117,0,114,124,89,0,87,0,100,1,4,0,4,0, - 131,3,1,0,113,52,89,0,110,14,48,0,124,6,124,0, - 124,1,124,2,131,3,125,7,87,0,100,1,4,0,4,0, - 131,3,1,0,110,16,49,0,115,162,48,0,1,0,1,0, - 1,0,89,0,1,0,124,7,100,1,117,1,114,52,124,4, - 144,1,115,16,124,0,116,0,106,6,118,0,144,1,114,16, - 116,0,106,6,124,0,25,0,125,8,122,10,124,8,106,11, - 125,9,87,0,110,26,4,0,116,9,121,244,1,0,1,0, - 1,0,124,7,6,0,89,0,2,0,1,0,83,0,48,0, - 124,9,100,1,117,0,144,1,114,8,124,7,2,0,1,0, - 83,0,124,9,2,0,1,0,83,0,124,7,2,0,1,0, - 83,0,100,1,83,0,41,4,122,21,70,105,110,100,32,97, - 32,109,111,100,117,108,101,39,115,32,115,112,101,99,46,78, - 122,53,115,121,115,46,109,101,116,97,95,112,97,116,104,32, - 105,115,32,78,111,110,101,44,32,80,121,116,104,111,110,32, - 105,115,32,108,105,107,101,108,121,32,115,104,117,116,116,105, - 110,103,32,100,111,119,110,122,22,115,121,115,46,109,101,116, - 97,95,112,97,116,104,32,105,115,32,101,109,112,116,121,41, - 12,114,18,0,0,0,218,9,109,101,116,97,95,112,97,116, - 104,114,83,0,0,0,114,95,0,0,0,114,96,0,0,0, - 114,163,0,0,0,114,99,0,0,0,114,189,0,0,0,114, - 177,0,0,0,114,2,0,0,0,114,200,0,0,0,114,113, - 0,0,0,41,10,114,20,0,0,0,114,175,0,0,0,114, - 176,0,0,0,114,201,0,0,0,90,9,105,115,95,114,101, - 108,111,97,100,114,199,0,0,0,114,177,0,0,0,114,103, - 0,0,0,114,104,0,0,0,114,113,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,10,95,102, - 105,110,100,95,115,112,101,99,152,3,0,0,115,56,0,0, - 0,6,2,8,1,8,2,4,3,12,1,10,5,8,1,8, - 1,2,1,10,1,12,1,12,1,8,1,22,1,42,2,8, - 1,18,2,10,1,2,1,10,1,12,1,14,4,10,2,8, - 1,8,2,8,2,4,2,255,128,114,202,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, - 0,0,0,67,0,0,0,115,110,0,0,0,116,0,124,0, - 116,1,131,2,115,28,116,2,100,1,160,3,116,4,124,0, - 131,1,161,1,131,1,130,1,124,2,100,2,107,0,114,44, - 116,5,100,3,131,1,130,1,124,2,100,2,107,4,114,82, - 116,0,124,1,116,1,131,2,115,70,116,2,100,4,131,1, - 130,1,124,1,115,82,116,6,100,5,131,1,130,1,124,0, - 115,106,124,2,100,2,107,2,114,102,116,5,100,6,131,1, - 130,1,100,7,83,0,100,7,83,0,41,8,122,28,86,101, - 114,105,102,121,32,97,114,103,117,109,101,110,116,115,32,97, - 114,101,32,34,115,97,110,101,34,46,122,31,109,111,100,117, - 108,101,32,110,97,109,101,32,109,117,115,116,32,98,101,32, - 115,116,114,44,32,110,111,116,32,123,125,114,25,0,0,0, - 122,18,108,101,118,101,108,32,109,117,115,116,32,98,101,32, - 62,61,32,48,122,31,95,95,112,97,99,107,97,103,101,95, - 95,32,110,111,116,32,115,101,116,32,116,111,32,97,32,115, - 116,114,105,110,103,122,54,97,116,116,101,109,112,116,101,100, + 58,0,0,0,125,3,0,0,115,4,0,0,0,12,2,255, + 128,122,28,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,0,0,0,0,4,0,0,0, + 2,0,0,0,67,0,0,0,115,12,0,0,0,116,0,160, + 1,161,0,1,0,100,1,83,0,41,2,122,60,82,101,108, + 101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32, + 108,111,99,107,32,114,101,103,97,114,100,108,101,115,115,32, + 111,102,32,97,110,121,32,114,97,105,115,101,100,32,101,120, + 99,101,112,116,105,111,110,115,46,78,41,2,114,61,0,0, + 0,114,64,0,0,0,41,4,114,33,0,0,0,218,8,101, + 120,99,95,116,121,112,101,218,9,101,120,99,95,118,97,108, + 117,101,218,13,101,120,99,95,116,114,97,99,101,98,97,99, + 107,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 114,60,0,0,0,129,3,0,0,115,4,0,0,0,12,2, + 255,128,122,27,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, + 41,6,114,9,0,0,0,114,8,0,0,0,114,1,0,0, + 0,114,10,0,0,0,114,58,0,0,0,114,60,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,189,0,0,0,121,3,0,0,115,10,0, + 0,0,8,0,4,2,8,2,12,4,255,128,114,189,0,0, + 0,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,5,0,0,0,67,0,0,0,115,64,0,0,0,124, + 1,160,0,100,1,124,2,100,2,24,0,161,2,125,3,116, + 1,124,3,131,1,124,2,107,0,114,36,116,2,100,3,131, + 1,130,1,124,3,100,4,25,0,125,4,124,0,114,60,100, + 5,160,3,124,4,124,0,161,2,83,0,124,4,83,0,41, + 7,122,50,82,101,115,111,108,118,101,32,97,32,114,101,108, + 97,116,105,118,101,32,109,111,100,117,108,101,32,110,97,109, + 101,32,116,111,32,97,110,32,97,98,115,111,108,117,116,101, + 32,111,110,101,46,114,135,0,0,0,114,42,0,0,0,122, + 50,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, + 105,118,101,32,105,109,112,111,114,116,32,98,101,121,111,110, + 100,32,116,111,112,45,108,101,118,101,108,32,112,97,99,107, + 97,103,101,114,25,0,0,0,250,5,123,125,46,123,125,78, + 41,4,218,6,114,115,112,108,105,116,218,3,108,101,110,114, + 83,0,0,0,114,49,0,0,0,41,5,114,20,0,0,0, + 218,7,112,97,99,107,97,103,101,218,5,108,101,118,101,108, + 90,4,98,105,116,115,90,4,98,97,115,101,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,13,95,114,101, + 115,111,108,118,101,95,110,97,109,101,134,3,0,0,115,12, + 0,0,0,16,2,12,1,8,1,8,1,20,1,255,128,114, + 198,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,4,0,0,0,67,0,0,0,115,34,0, + 0,0,124,0,160,0,124,1,124,2,161,2,125,3,124,3, + 100,0,117,0,114,24,100,0,83,0,116,1,124,1,124,3, + 131,2,83,0,114,0,0,0,0,41,2,114,178,0,0,0, + 114,98,0,0,0,41,4,218,6,102,105,110,100,101,114,114, + 20,0,0,0,114,175,0,0,0,114,116,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,17,95, + 102,105,110,100,95,115,112,101,99,95,108,101,103,97,99,121, + 143,3,0,0,115,10,0,0,0,12,3,8,1,4,1,10, + 1,255,128,114,200,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,10,0,0,0,10,0,0,0,67,0,0, + 0,115,28,1,0,0,116,0,106,1,125,3,124,3,100,1, + 117,0,114,22,116,2,100,2,131,1,130,1,124,3,115,38, + 116,3,160,4,100,3,116,5,161,2,1,0,124,0,116,0, + 106,6,118,0,125,4,124,3,68,0,93,226,125,5,116,7, + 131,0,143,94,1,0,122,10,124,5,106,8,125,6,87,0, + 110,54,4,0,116,9,121,128,1,0,1,0,1,0,116,10, + 124,5,124,0,124,1,131,3,125,7,124,7,100,1,117,0, + 114,124,89,0,87,0,100,1,4,0,4,0,131,3,1,0, + 113,52,89,0,110,14,48,0,124,6,124,0,124,1,124,2, + 131,3,125,7,87,0,100,1,4,0,4,0,131,3,1,0, + 110,16,49,0,115,162,48,0,1,0,1,0,1,0,89,0, + 1,0,124,7,100,1,117,1,114,52,124,4,144,1,115,16, + 124,0,116,0,106,6,118,0,144,1,114,16,116,0,106,6, + 124,0,25,0,125,8,122,10,124,8,106,11,125,9,87,0, + 110,26,4,0,116,9,121,244,1,0,1,0,1,0,124,7, + 6,0,89,0,2,0,1,0,83,0,48,0,124,9,100,1, + 117,0,144,1,114,8,124,7,2,0,1,0,83,0,124,9, + 2,0,1,0,83,0,124,7,2,0,1,0,83,0,100,1, + 83,0,41,4,122,21,70,105,110,100,32,97,32,109,111,100, + 117,108,101,39,115,32,115,112,101,99,46,78,122,53,115,121, + 115,46,109,101,116,97,95,112,97,116,104,32,105,115,32,78, + 111,110,101,44,32,80,121,116,104,111,110,32,105,115,32,108, + 105,107,101,108,121,32,115,104,117,116,116,105,110,103,32,100, + 111,119,110,122,22,115,121,115,46,109,101,116,97,95,112,97, + 116,104,32,105,115,32,101,109,112,116,121,41,12,114,18,0, + 0,0,218,9,109,101,116,97,95,112,97,116,104,114,83,0, + 0,0,114,95,0,0,0,114,96,0,0,0,114,163,0,0, + 0,114,99,0,0,0,114,189,0,0,0,114,177,0,0,0, + 114,2,0,0,0,114,200,0,0,0,114,113,0,0,0,41, + 10,114,20,0,0,0,114,175,0,0,0,114,176,0,0,0, + 114,201,0,0,0,90,9,105,115,95,114,101,108,111,97,100, + 114,199,0,0,0,114,177,0,0,0,114,103,0,0,0,114, + 104,0,0,0,114,113,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,10,95,102,105,110,100,95, + 115,112,101,99,152,3,0,0,115,56,0,0,0,6,2,8, + 1,8,2,4,3,12,1,10,5,8,1,8,1,2,1,10, + 1,12,1,12,1,8,1,22,1,42,2,8,1,18,2,10, + 1,2,1,10,1,12,1,14,4,10,2,8,1,8,2,8, + 2,4,2,255,128,114,202,0,0,0,99,3,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,5,0,0,0,67, + 0,0,0,115,110,0,0,0,116,0,124,0,116,1,131,2, + 115,28,116,2,100,1,160,3,116,4,124,0,131,1,161,1, + 131,1,130,1,124,2,100,2,107,0,114,44,116,5,100,3, + 131,1,130,1,124,2,100,2,107,4,114,82,116,0,124,1, + 116,1,131,2,115,70,116,2,100,4,131,1,130,1,124,1, + 115,82,116,6,100,5,131,1,130,1,124,0,115,106,124,2, + 100,2,107,2,114,102,116,5,100,6,131,1,130,1,100,7, + 83,0,100,7,83,0,41,8,122,28,86,101,114,105,102,121, + 32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,34, + 115,97,110,101,34,46,122,31,109,111,100,117,108,101,32,110, + 97,109,101,32,109,117,115,116,32,98,101,32,115,116,114,44, + 32,110,111,116,32,123,125,114,25,0,0,0,122,18,108,101, + 118,101,108,32,109,117,115,116,32,98,101,32,62,61,32,48, + 122,31,95,95,112,97,99,107,97,103,101,95,95,32,110,111, + 116,32,115,101,116,32,116,111,32,97,32,115,116,114,105,110, + 103,122,54,97,116,116,101,109,112,116,101,100,32,114,101,108, + 97,116,105,118,101,32,105,109,112,111,114,116,32,119,105,116, + 104,32,110,111,32,107,110,111,119,110,32,112,97,114,101,110, + 116,32,112,97,99,107,97,103,101,122,17,69,109,112,116,121, + 32,109,111,100,117,108,101,32,110,97,109,101,78,41,7,218, + 10,105,115,105,110,115,116,97,110,99,101,218,3,115,116,114, + 218,9,84,121,112,101,69,114,114,111,114,114,49,0,0,0, + 114,3,0,0,0,218,10,86,97,108,117,101,69,114,114,111, + 114,114,83,0,0,0,169,3,114,20,0,0,0,114,196,0, + 0,0,114,197,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,13,95,115,97,110,105,116,121,95, + 99,104,101,99,107,199,3,0,0,115,26,0,0,0,10,2, + 18,1,8,1,8,1,8,1,10,1,8,1,4,1,8,1, + 12,2,8,1,8,255,255,128,114,208,0,0,0,122,16,78, + 111,32,109,111,100,117,108,101,32,110,97,109,101,100,32,122, + 4,123,33,114,125,99,2,0,0,0,0,0,0,0,0,0, + 0,0,9,0,0,0,8,0,0,0,67,0,0,0,115,20, + 1,0,0,100,0,125,2,124,0,160,0,100,1,161,1,100, + 2,25,0,125,3,124,3,114,128,124,3,116,1,106,2,118, + 1,114,42,116,3,124,1,124,3,131,2,1,0,124,0,116, + 1,106,2,118,0,114,62,116,1,106,2,124,0,25,0,83, + 0,116,1,106,2,124,3,25,0,125,4,122,10,124,4,106, + 4,125,2,87,0,110,44,4,0,116,5,121,126,1,0,1, + 0,1,0,116,6,100,3,23,0,160,7,124,0,124,3,161, + 2,125,5,116,8,124,5,124,0,100,4,141,2,100,0,130, + 2,48,0,116,9,124,0,124,2,131,2,125,6,124,6,100, + 0,117,0,114,164,116,8,116,6,160,7,124,0,161,1,124, + 0,100,4,141,2,130,1,116,10,124,6,131,1,125,7,124, + 3,144,1,114,16,116,1,106,2,124,3,25,0,125,4,124, + 0,160,0,100,1,161,1,100,5,25,0,125,8,122,18,116, + 11,124,4,124,8,124,7,131,3,1,0,87,0,124,7,83, + 0,4,0,116,5,144,1,121,14,1,0,1,0,1,0,100, + 6,124,3,155,2,100,7,124,8,155,2,157,4,125,5,116, + 12,160,13,124,5,116,14,161,2,1,0,89,0,124,7,83, + 0,48,0,124,7,83,0,41,8,78,114,135,0,0,0,114, + 25,0,0,0,122,23,59,32,123,33,114,125,32,105,115,32, + 110,111,116,32,97,32,112,97,99,107,97,103,101,114,19,0, + 0,0,233,2,0,0,0,122,27,67,97,110,110,111,116,32, + 115,101,116,32,97,110,32,97,116,116,114,105,98,117,116,101, + 32,111,110,32,122,18,32,102,111,114,32,99,104,105,108,100, + 32,109,111,100,117,108,101,32,41,15,114,136,0,0,0,114, + 18,0,0,0,114,99,0,0,0,114,71,0,0,0,114,148, + 0,0,0,114,2,0,0,0,218,8,95,69,82,82,95,77, + 83,71,114,49,0,0,0,218,19,77,111,100,117,108,101,78, + 111,116,70,111,117,110,100,69,114,114,111,114,114,202,0,0, + 0,114,167,0,0,0,114,12,0,0,0,114,95,0,0,0, + 114,96,0,0,0,114,163,0,0,0,41,9,114,20,0,0, + 0,218,7,105,109,112,111,114,116,95,114,175,0,0,0,114, + 137,0,0,0,90,13,112,97,114,101,110,116,95,109,111,100, + 117,108,101,114,102,0,0,0,114,103,0,0,0,114,104,0, + 0,0,90,5,99,104,105,108,100,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,95, + 97,110,100,95,108,111,97,100,95,117,110,108,111,99,107,101, + 100,218,3,0,0,115,60,0,0,0,4,1,14,1,4,1, + 10,1,10,1,10,2,10,1,10,1,2,1,10,1,12,1, + 16,1,16,1,10,1,8,1,18,1,8,2,6,1,10,2, + 14,1,2,1,14,1,4,4,14,253,16,1,14,1,4,1, + 2,255,4,1,255,128,114,213,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,8,0,0,0, + 67,0,0,0,115,128,0,0,0,116,0,124,0,131,1,143, + 62,1,0,116,1,106,2,160,3,124,0,116,4,161,2,125, + 2,124,2,116,4,117,0,114,56,116,5,124,0,124,1,131, + 2,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, + 0,87,0,100,1,4,0,4,0,131,3,1,0,110,16,49, + 0,115,76,48,0,1,0,1,0,1,0,89,0,1,0,124, + 2,100,1,117,0,114,116,100,2,160,6,124,0,161,1,125, + 3,116,7,124,3,124,0,100,3,141,2,130,1,116,8,124, + 0,131,1,1,0,124,2,83,0,41,4,122,25,70,105,110, + 100,32,97,110,100,32,108,111,97,100,32,116,104,101,32,109, + 111,100,117,108,101,46,78,122,40,105,109,112,111,114,116,32, + 111,102,32,123,125,32,104,97,108,116,101,100,59,32,78,111, + 110,101,32,105,110,32,115,121,115,46,109,111,100,117,108,101, + 115,114,19,0,0,0,41,9,114,54,0,0,0,114,18,0, + 0,0,114,99,0,0,0,114,38,0,0,0,218,14,95,78, + 69,69,68,83,95,76,79,65,68,73,78,71,114,213,0,0, + 0,114,49,0,0,0,114,211,0,0,0,114,69,0,0,0, + 41,4,114,20,0,0,0,114,212,0,0,0,114,104,0,0, + 0,114,79,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,14,95,102,105,110,100,95,97,110,100, + 95,108,111,97,100,253,3,0,0,115,24,0,0,0,10,2, + 14,1,8,1,54,1,8,2,4,1,2,1,4,255,12,2, + 8,2,4,1,255,128,114,215,0,0,0,114,25,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,67,0,0,0,115,42,0,0,0,116,0, + 124,0,124,1,124,2,131,3,1,0,124,2,100,1,107,4, + 114,32,116,1,124,0,124,1,124,2,131,3,125,0,116,2, + 124,0,116,3,131,2,83,0,41,3,97,50,1,0,0,73, + 109,112,111,114,116,32,97,110,100,32,114,101,116,117,114,110, + 32,116,104,101,32,109,111,100,117,108,101,32,98,97,115,101, + 100,32,111,110,32,105,116,115,32,110,97,109,101,44,32,116, + 104,101,32,112,97,99,107,97,103,101,32,116,104,101,32,99, + 97,108,108,32,105,115,10,32,32,32,32,98,101,105,110,103, + 32,109,97,100,101,32,102,114,111,109,44,32,97,110,100,32, + 116,104,101,32,108,101,118,101,108,32,97,100,106,117,115,116, + 109,101,110,116,46,10,10,32,32,32,32,84,104,105,115,32, + 102,117,110,99,116,105,111,110,32,114,101,112,114,101,115,101, + 110,116,115,32,116,104,101,32,103,114,101,97,116,101,115,116, + 32,99,111,109,109,111,110,32,100,101,110,111,109,105,110,97, + 116,111,114,32,111,102,32,102,117,110,99,116,105,111,110,97, + 108,105,116,121,10,32,32,32,32,98,101,116,119,101,101,110, + 32,105,109,112,111,114,116,95,109,111,100,117,108,101,32,97, + 110,100,32,95,95,105,109,112,111,114,116,95,95,46,32,84, + 104,105,115,32,105,110,99,108,117,100,101,115,32,115,101,116, + 116,105,110,103,32,95,95,112,97,99,107,97,103,101,95,95, + 32,105,102,10,32,32,32,32,116,104,101,32,108,111,97,100, + 101,114,32,100,105,100,32,110,111,116,46,10,10,32,32,32, + 32,114,25,0,0,0,78,41,4,114,208,0,0,0,114,198, + 0,0,0,114,215,0,0,0,218,11,95,103,99,100,95,105, + 109,112,111,114,116,114,207,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,216,0,0,0,13,4, + 0,0,115,10,0,0,0,12,9,8,1,12,1,10,1,255, + 128,114,216,0,0,0,169,1,218,9,114,101,99,117,114,115, + 105,118,101,99,3,0,0,0,0,0,0,0,1,0,0,0, + 8,0,0,0,11,0,0,0,67,0,0,0,115,216,0,0, + 0,124,1,68,0,93,204,125,4,116,0,124,4,116,1,131, + 2,115,64,124,3,114,34,124,0,106,2,100,1,23,0,125, + 5,110,4,100,2,125,5,116,3,100,3,124,5,155,0,100, + 4,116,4,124,4,131,1,106,2,155,0,157,4,131,1,130, + 1,124,4,100,5,107,2,114,106,124,3,115,4,116,5,124, + 0,100,6,131,2,114,4,116,6,124,0,124,0,106,7,124, + 2,100,7,100,8,141,4,1,0,113,4,116,5,124,0,124, + 4,131,2,115,4,100,9,160,8,124,0,106,2,124,4,161, + 2,125,6,122,14,116,9,124,2,124,6,131,2,1,0,87, + 0,113,4,4,0,116,10,121,214,1,0,125,7,1,0,122, + 42,124,7,106,11,124,6,107,2,114,200,116,12,106,13,160, + 14,124,6,116,15,161,2,100,10,117,1,114,200,87,0,89, + 0,100,10,125,7,126,7,113,4,130,0,100,10,125,7,126, + 7,48,0,124,0,83,0,48,0,41,11,122,238,70,105,103, + 117,114,101,32,111,117,116,32,119,104,97,116,32,95,95,105, + 109,112,111,114,116,95,95,32,115,104,111,117,108,100,32,114, + 101,116,117,114,110,46,10,10,32,32,32,32,84,104,101,32, + 105,109,112,111,114,116,95,32,112,97,114,97,109,101,116,101, + 114,32,105,115,32,97,32,99,97,108,108,97,98,108,101,32, + 119,104,105,99,104,32,116,97,107,101,115,32,116,104,101,32, + 110,97,109,101,32,111,102,32,109,111,100,117,108,101,32,116, + 111,10,32,32,32,32,105,109,112,111,114,116,46,32,73,116, + 32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32, + 100,101,99,111,117,112,108,101,32,116,104,101,32,102,117,110, + 99,116,105,111,110,32,102,114,111,109,32,97,115,115,117,109, + 105,110,103,32,105,109,112,111,114,116,108,105,98,39,115,10, + 32,32,32,32,105,109,112,111,114,116,32,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,32,105,115,32,100,101,115, + 105,114,101,100,46,10,10,32,32,32,32,122,8,46,95,95, + 97,108,108,95,95,122,13,96,96,102,114,111,109,32,108,105, + 115,116,39,39,122,8,73,116,101,109,32,105,110,32,122,18, + 32,109,117,115,116,32,98,101,32,115,116,114,44,32,110,111, + 116,32,250,1,42,218,7,95,95,97,108,108,95,95,84,114, + 217,0,0,0,114,193,0,0,0,78,41,16,114,203,0,0, + 0,114,204,0,0,0,114,9,0,0,0,114,205,0,0,0, + 114,3,0,0,0,114,11,0,0,0,218,16,95,104,97,110, + 100,108,101,95,102,114,111,109,108,105,115,116,114,220,0,0, + 0,114,49,0,0,0,114,71,0,0,0,114,211,0,0,0, + 114,20,0,0,0,114,18,0,0,0,114,99,0,0,0,114, + 38,0,0,0,114,214,0,0,0,41,8,114,104,0,0,0, + 218,8,102,114,111,109,108,105,115,116,114,212,0,0,0,114, + 218,0,0,0,218,1,120,90,5,119,104,101,114,101,90,9, + 102,114,111,109,95,110,97,109,101,90,3,101,120,99,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,221,0, + 0,0,28,4,0,0,115,54,0,0,0,8,10,10,1,4, + 1,12,1,4,2,10,1,8,1,8,255,8,2,14,1,10, + 1,2,1,8,255,10,2,14,1,2,1,14,1,14,1,10, + 4,16,1,2,255,12,2,2,1,8,128,4,1,2,248,255, + 128,114,221,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,6,0,0,0,67,0,0,0,115, + 146,0,0,0,124,0,160,0,100,1,161,1,125,1,124,0, + 160,0,100,2,161,1,125,2,124,1,100,3,117,1,114,82, + 124,2,100,3,117,1,114,78,124,1,124,2,106,1,107,3, + 114,78,116,2,106,3,100,4,124,1,155,2,100,5,124,2, + 106,1,155,2,100,6,157,5,116,4,100,7,100,8,141,3, + 1,0,124,1,83,0,124,2,100,3,117,1,114,96,124,2, + 106,1,83,0,116,2,106,3,100,9,116,4,100,7,100,8, + 141,3,1,0,124,0,100,10,25,0,125,1,100,11,124,0, + 118,1,114,142,124,1,160,5,100,12,161,1,100,13,25,0, + 125,1,124,1,83,0,41,14,122,167,67,97,108,99,117,108, + 97,116,101,32,119,104,97,116,32,95,95,112,97,99,107,97, + 103,101,95,95,32,115,104,111,117,108,100,32,98,101,46,10, + 10,32,32,32,32,95,95,112,97,99,107,97,103,101,95,95, + 32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101, + 101,100,32,116,111,32,98,101,32,100,101,102,105,110,101,100, + 32,111,114,32,99,111,117,108,100,32,98,101,32,115,101,116, + 32,116,111,32,78,111,110,101,10,32,32,32,32,116,111,32, + 114,101,112,114,101,115,101,110,116,32,116,104,97,116,32,105, + 116,115,32,112,114,111,112,101,114,32,118,97,108,117,101,32, + 105,115,32,117,110,107,110,111,119,110,46,10,10,32,32,32, + 32,114,152,0,0,0,114,113,0,0,0,78,122,32,95,95, + 112,97,99,107,97,103,101,95,95,32,33,61,32,95,95,115, + 112,101,99,95,95,46,112,97,114,101,110,116,32,40,122,4, + 32,33,61,32,250,1,41,233,3,0,0,0,41,1,90,10, + 115,116,97,99,107,108,101,118,101,108,122,89,99,97,110,39, + 116,32,114,101,115,111,108,118,101,32,112,97,99,107,97,103, + 101,32,102,114,111,109,32,95,95,115,112,101,99,95,95,32, + 111,114,32,95,95,112,97,99,107,97,103,101,95,95,44,32, + 102,97,108,108,105,110,103,32,98,97,99,107,32,111,110,32, + 95,95,110,97,109,101,95,95,32,97,110,100,32,95,95,112, + 97,116,104,95,95,114,9,0,0,0,114,148,0,0,0,114, + 135,0,0,0,114,25,0,0,0,41,6,114,38,0,0,0, + 114,137,0,0,0,114,95,0,0,0,114,96,0,0,0,114, + 163,0,0,0,114,136,0,0,0,41,3,218,7,103,108,111, + 98,97,108,115,114,196,0,0,0,114,103,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,17,95, + 99,97,108,99,95,95,95,112,97,99,107,97,103,101,95,95, + 65,4,0,0,115,44,0,0,0,10,7,10,1,8,1,18, + 1,6,1,2,1,4,255,4,1,6,255,4,2,6,254,4, + 3,8,1,6,1,6,2,4,2,6,254,8,3,8,1,14, + 1,4,1,255,128,114,227,0,0,0,114,5,0,0,0,99, + 5,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, + 5,0,0,0,67,0,0,0,115,174,0,0,0,124,4,100, + 1,107,2,114,18,116,0,124,0,131,1,125,5,110,36,124, + 1,100,2,117,1,114,30,124,1,110,2,105,0,125,6,116, + 1,124,6,131,1,125,7,116,0,124,0,124,7,124,4,131, + 3,125,5,124,3,115,148,124,4,100,1,107,2,114,84,116, + 0,124,0,160,2,100,3,161,1,100,1,25,0,131,1,83, + 0,124,0,115,92,124,5,83,0,116,3,124,0,131,1,116, + 3,124,0,160,2,100,3,161,1,100,1,25,0,131,1,24, + 0,125,8,116,4,106,5,124,5,106,6,100,2,116,3,124, + 5,106,6,131,1,124,8,24,0,133,2,25,0,25,0,83, + 0,116,7,124,5,100,4,131,2,114,170,116,8,124,5,124, + 3,116,0,131,3,83,0,124,5,83,0,41,5,97,215,1, + 0,0,73,109,112,111,114,116,32,97,32,109,111,100,117,108, + 101,46,10,10,32,32,32,32,84,104,101,32,39,103,108,111, + 98,97,108,115,39,32,97,114,103,117,109,101,110,116,32,105, + 115,32,117,115,101,100,32,116,111,32,105,110,102,101,114,32, + 119,104,101,114,101,32,116,104,101,32,105,109,112,111,114,116, + 32,105,115,32,111,99,99,117,114,114,105,110,103,32,102,114, + 111,109,10,32,32,32,32,116,111,32,104,97,110,100,108,101, 32,114,101,108,97,116,105,118,101,32,105,109,112,111,114,116, - 32,119,105,116,104,32,110,111,32,107,110,111,119,110,32,112, - 97,114,101,110,116,32,112,97,99,107,97,103,101,122,17,69, - 109,112,116,121,32,109,111,100,117,108,101,32,110,97,109,101, - 78,41,7,218,10,105,115,105,110,115,116,97,110,99,101,218, - 3,115,116,114,218,9,84,121,112,101,69,114,114,111,114,114, - 49,0,0,0,114,3,0,0,0,218,10,86,97,108,117,101, - 69,114,114,111,114,114,83,0,0,0,169,3,114,20,0,0, - 0,114,196,0,0,0,114,197,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,13,95,115,97,110, - 105,116,121,95,99,104,101,99,107,199,3,0,0,115,26,0, - 0,0,10,2,18,1,8,1,8,1,8,1,10,1,8,1, - 4,1,8,1,12,2,8,1,8,255,255,128,114,208,0,0, - 0,122,16,78,111,32,109,111,100,117,108,101,32,110,97,109, - 101,100,32,122,4,123,33,114,125,99,2,0,0,0,0,0, - 0,0,0,0,0,0,9,0,0,0,8,0,0,0,67,0, - 0,0,115,20,1,0,0,100,0,125,2,124,0,160,0,100, - 1,161,1,100,2,25,0,125,3,124,3,114,128,124,3,116, - 1,106,2,118,1,114,42,116,3,124,1,124,3,131,2,1, - 0,124,0,116,1,106,2,118,0,114,62,116,1,106,2,124, - 0,25,0,83,0,116,1,106,2,124,3,25,0,125,4,122, - 10,124,4,106,4,125,2,87,0,110,44,4,0,116,5,121, - 126,1,0,1,0,1,0,116,6,100,3,23,0,160,7,124, - 0,124,3,161,2,125,5,116,8,124,5,124,0,100,4,141, - 2,100,0,130,2,48,0,116,9,124,0,124,2,131,2,125, - 6,124,6,100,0,117,0,114,164,116,8,116,6,160,7,124, - 0,161,1,124,0,100,4,141,2,130,1,116,10,124,6,131, - 1,125,7,124,3,144,1,114,16,116,1,106,2,124,3,25, - 0,125,4,124,0,160,0,100,1,161,1,100,5,25,0,125, - 8,122,18,116,11,124,4,124,8,124,7,131,3,1,0,87, - 0,124,7,83,0,4,0,116,5,144,1,121,14,1,0,1, - 0,1,0,100,6,124,3,155,2,100,7,124,8,155,2,157, - 4,125,5,116,12,160,13,124,5,116,14,161,2,1,0,89, - 0,124,7,83,0,48,0,124,7,83,0,41,8,78,114,135, - 0,0,0,114,25,0,0,0,122,23,59,32,123,33,114,125, - 32,105,115,32,110,111,116,32,97,32,112,97,99,107,97,103, - 101,114,19,0,0,0,233,2,0,0,0,122,27,67,97,110, - 110,111,116,32,115,101,116,32,97,110,32,97,116,116,114,105, - 98,117,116,101,32,111,110,32,122,18,32,102,111,114,32,99, - 104,105,108,100,32,109,111,100,117,108,101,32,41,15,114,136, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,71,0, - 0,0,114,148,0,0,0,114,2,0,0,0,218,8,95,69, - 82,82,95,77,83,71,114,49,0,0,0,218,19,77,111,100, - 117,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, - 114,202,0,0,0,114,167,0,0,0,114,12,0,0,0,114, - 95,0,0,0,114,96,0,0,0,114,163,0,0,0,41,9, - 114,20,0,0,0,218,7,105,109,112,111,114,116,95,114,175, - 0,0,0,114,137,0,0,0,90,13,112,97,114,101,110,116, - 95,109,111,100,117,108,101,114,102,0,0,0,114,103,0,0, - 0,114,104,0,0,0,90,5,99,104,105,108,100,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,23,95,102, - 105,110,100,95,97,110,100,95,108,111,97,100,95,117,110,108, - 111,99,107,101,100,218,3,0,0,115,60,0,0,0,4,1, - 14,1,4,1,10,1,10,1,10,2,10,1,10,1,2,1, - 10,1,12,1,16,1,16,1,10,1,8,1,18,1,8,2, - 6,1,10,2,14,1,2,1,14,1,4,4,14,253,16,1, - 14,1,4,1,2,255,4,1,255,128,114,213,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 8,0,0,0,67,0,0,0,115,128,0,0,0,116,0,124, - 0,131,1,143,62,1,0,116,1,106,2,160,3,124,0,116, - 4,161,2,125,2,124,2,116,4,117,0,114,56,116,5,124, - 0,124,1,131,2,87,0,2,0,100,1,4,0,4,0,131, - 3,1,0,83,0,87,0,100,1,4,0,4,0,131,3,1, - 0,110,16,49,0,115,76,48,0,1,0,1,0,1,0,89, - 0,1,0,124,2,100,1,117,0,114,116,100,2,160,6,124, - 0,161,1,125,3,116,7,124,3,124,0,100,3,141,2,130, - 1,116,8,124,0,131,1,1,0,124,2,83,0,41,4,122, - 25,70,105,110,100,32,97,110,100,32,108,111,97,100,32,116, - 104,101,32,109,111,100,117,108,101,46,78,122,40,105,109,112, - 111,114,116,32,111,102,32,123,125,32,104,97,108,116,101,100, - 59,32,78,111,110,101,32,105,110,32,115,121,115,46,109,111, - 100,117,108,101,115,114,19,0,0,0,41,9,114,54,0,0, - 0,114,18,0,0,0,114,99,0,0,0,114,38,0,0,0, - 218,14,95,78,69,69,68,83,95,76,79,65,68,73,78,71, - 114,213,0,0,0,114,49,0,0,0,114,211,0,0,0,114, - 69,0,0,0,41,4,114,20,0,0,0,114,212,0,0,0, - 114,104,0,0,0,114,79,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,14,95,102,105,110,100, - 95,97,110,100,95,108,111,97,100,253,3,0,0,115,24,0, - 0,0,10,2,14,1,8,1,54,1,8,2,4,1,2,1, - 4,255,12,2,8,2,4,1,255,128,114,215,0,0,0,114, - 25,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,4,0,0,0,67,0,0,0,115,42,0, - 0,0,116,0,124,0,124,1,124,2,131,3,1,0,124,2, - 100,1,107,4,114,32,116,1,124,0,124,1,124,2,131,3, - 125,0,116,2,124,0,116,3,131,2,83,0,41,3,97,50, - 1,0,0,73,109,112,111,114,116,32,97,110,100,32,114,101, - 116,117,114,110,32,116,104,101,32,109,111,100,117,108,101,32, - 98,97,115,101,100,32,111,110,32,105,116,115,32,110,97,109, - 101,44,32,116,104,101,32,112,97,99,107,97,103,101,32,116, - 104,101,32,99,97,108,108,32,105,115,10,32,32,32,32,98, - 101,105,110,103,32,109,97,100,101,32,102,114,111,109,44,32, - 97,110,100,32,116,104,101,32,108,101,118,101,108,32,97,100, - 106,117,115,116,109,101,110,116,46,10,10,32,32,32,32,84, - 104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,112, - 114,101,115,101,110,116,115,32,116,104,101,32,103,114,101,97, - 116,101,115,116,32,99,111,109,109,111,110,32,100,101,110,111, - 109,105,110,97,116,111,114,32,111,102,32,102,117,110,99,116, - 105,111,110,97,108,105,116,121,10,32,32,32,32,98,101,116, - 119,101,101,110,32,105,109,112,111,114,116,95,109,111,100,117, - 108,101,32,97,110,100,32,95,95,105,109,112,111,114,116,95, - 95,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115, - 32,115,101,116,116,105,110,103,32,95,95,112,97,99,107,97, - 103,101,95,95,32,105,102,10,32,32,32,32,116,104,101,32, - 108,111,97,100,101,114,32,100,105,100,32,110,111,116,46,10, - 10,32,32,32,32,114,25,0,0,0,78,41,4,114,208,0, - 0,0,114,198,0,0,0,114,215,0,0,0,218,11,95,103, - 99,100,95,105,109,112,111,114,116,114,207,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,216,0, - 0,0,13,4,0,0,115,10,0,0,0,12,9,8,1,12, - 1,10,1,255,128,114,216,0,0,0,169,1,218,9,114,101, - 99,117,114,115,105,118,101,99,3,0,0,0,0,0,0,0, - 1,0,0,0,8,0,0,0,11,0,0,0,67,0,0,0, - 115,216,0,0,0,124,1,68,0,93,204,125,4,116,0,124, - 4,116,1,131,2,115,64,124,3,114,34,124,0,106,2,100, - 1,23,0,125,5,110,4,100,2,125,5,116,3,100,3,124, - 5,155,0,100,4,116,4,124,4,131,1,106,2,155,0,157, - 4,131,1,130,1,124,4,100,5,107,2,114,106,124,3,115, - 4,116,5,124,0,100,6,131,2,114,4,116,6,124,0,124, - 0,106,7,124,2,100,7,100,8,141,4,1,0,113,4,116, - 5,124,0,124,4,131,2,115,4,100,9,160,8,124,0,106, - 2,124,4,161,2,125,6,122,14,116,9,124,2,124,6,131, - 2,1,0,87,0,113,4,4,0,116,10,121,214,1,0,125, - 7,1,0,122,42,124,7,106,11,124,6,107,2,114,200,116, - 12,106,13,160,14,124,6,116,15,161,2,100,10,117,1,114, - 200,87,0,89,0,100,10,125,7,126,7,113,4,130,0,100, - 10,125,7,126,7,48,0,124,0,83,0,48,0,41,11,122, - 238,70,105,103,117,114,101,32,111,117,116,32,119,104,97,116, - 32,95,95,105,109,112,111,114,116,95,95,32,115,104,111,117, - 108,100,32,114,101,116,117,114,110,46,10,10,32,32,32,32, - 84,104,101,32,105,109,112,111,114,116,95,32,112,97,114,97, - 109,101,116,101,114,32,105,115,32,97,32,99,97,108,108,97, - 98,108,101,32,119,104,105,99,104,32,116,97,107,101,115,32, - 116,104,101,32,110,97,109,101,32,111,102,32,109,111,100,117, - 108,101,32,116,111,10,32,32,32,32,105,109,112,111,114,116, - 46,32,73,116,32,105,115,32,114,101,113,117,105,114,101,100, - 32,116,111,32,100,101,99,111,117,112,108,101,32,116,104,101, - 32,102,117,110,99,116,105,111,110,32,102,114,111,109,32,97, - 115,115,117,109,105,110,103,32,105,109,112,111,114,116,108,105, - 98,39,115,10,32,32,32,32,105,109,112,111,114,116,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,105,115, - 32,100,101,115,105,114,101,100,46,10,10,32,32,32,32,122, - 8,46,95,95,97,108,108,95,95,122,13,96,96,102,114,111, - 109,32,108,105,115,116,39,39,122,8,73,116,101,109,32,105, - 110,32,122,18,32,109,117,115,116,32,98,101,32,115,116,114, - 44,32,110,111,116,32,250,1,42,218,7,95,95,97,108,108, - 95,95,84,114,217,0,0,0,114,193,0,0,0,78,41,16, - 114,203,0,0,0,114,204,0,0,0,114,9,0,0,0,114, - 205,0,0,0,114,3,0,0,0,114,11,0,0,0,218,16, - 95,104,97,110,100,108,101,95,102,114,111,109,108,105,115,116, - 114,220,0,0,0,114,49,0,0,0,114,71,0,0,0,114, - 211,0,0,0,114,20,0,0,0,114,18,0,0,0,114,99, - 0,0,0,114,38,0,0,0,114,214,0,0,0,41,8,114, - 104,0,0,0,218,8,102,114,111,109,108,105,115,116,114,212, - 0,0,0,114,218,0,0,0,218,1,120,90,5,119,104,101, - 114,101,90,9,102,114,111,109,95,110,97,109,101,90,3,101, - 120,99,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,221,0,0,0,28,4,0,0,115,54,0,0,0,8, - 10,10,1,4,1,12,1,4,2,10,1,8,1,8,255,8, - 2,14,1,10,1,2,1,8,255,10,2,14,1,2,1,14, - 1,14,1,10,4,16,1,2,255,12,2,2,1,8,128,4, - 1,2,248,255,128,114,221,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,6,0,0,0,67, - 0,0,0,115,146,0,0,0,124,0,160,0,100,1,161,1, - 125,1,124,0,160,0,100,2,161,1,125,2,124,1,100,3, - 117,1,114,82,124,2,100,3,117,1,114,78,124,1,124,2, - 106,1,107,3,114,78,116,2,106,3,100,4,124,1,155,2, - 100,5,124,2,106,1,155,2,100,6,157,5,116,4,100,7, - 100,8,141,3,1,0,124,1,83,0,124,2,100,3,117,1, - 114,96,124,2,106,1,83,0,116,2,106,3,100,9,116,4, - 100,7,100,8,141,3,1,0,124,0,100,10,25,0,125,1, - 100,11,124,0,118,1,114,142,124,1,160,5,100,12,161,1, - 100,13,25,0,125,1,124,1,83,0,41,14,122,167,67,97, - 108,99,117,108,97,116,101,32,119,104,97,116,32,95,95,112, - 97,99,107,97,103,101,95,95,32,115,104,111,117,108,100,32, - 98,101,46,10,10,32,32,32,32,95,95,112,97,99,107,97, - 103,101,95,95,32,105,115,32,110,111,116,32,103,117,97,114, - 97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,102, - 105,110,101,100,32,111,114,32,99,111,117,108,100,32,98,101, - 32,115,101,116,32,116,111,32,78,111,110,101,10,32,32,32, - 32,116,111,32,114,101,112,114,101,115,101,110,116,32,116,104, - 97,116,32,105,116,115,32,112,114,111,112,101,114,32,118,97, - 108,117,101,32,105,115,32,117,110,107,110,111,119,110,46,10, - 10,32,32,32,32,114,152,0,0,0,114,113,0,0,0,78, - 122,32,95,95,112,97,99,107,97,103,101,95,95,32,33,61, - 32,95,95,115,112,101,99,95,95,46,112,97,114,101,110,116, - 32,40,122,4,32,33,61,32,250,1,41,233,3,0,0,0, - 41,1,90,10,115,116,97,99,107,108,101,118,101,108,122,89, - 99,97,110,39,116,32,114,101,115,111,108,118,101,32,112,97, - 99,107,97,103,101,32,102,114,111,109,32,95,95,115,112,101, - 99,95,95,32,111,114,32,95,95,112,97,99,107,97,103,101, - 95,95,44,32,102,97,108,108,105,110,103,32,98,97,99,107, - 32,111,110,32,95,95,110,97,109,101,95,95,32,97,110,100, - 32,95,95,112,97,116,104,95,95,114,9,0,0,0,114,148, - 0,0,0,114,135,0,0,0,114,25,0,0,0,41,6,114, - 38,0,0,0,114,137,0,0,0,114,95,0,0,0,114,96, - 0,0,0,114,163,0,0,0,114,136,0,0,0,41,3,218, - 7,103,108,111,98,97,108,115,114,196,0,0,0,114,103,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,17,95,99,97,108,99,95,95,95,112,97,99,107,97, - 103,101,95,95,65,4,0,0,115,44,0,0,0,10,7,10, - 1,8,1,18,1,6,1,2,1,4,255,4,1,6,255,4, - 2,6,254,4,3,8,1,6,1,6,2,4,2,6,254,8, - 3,8,1,14,1,4,1,255,128,114,227,0,0,0,114,5, - 0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,5,0,0,0,67,0,0,0,115,174,0,0, - 0,124,4,100,1,107,2,114,18,116,0,124,0,131,1,125, - 5,110,36,124,1,100,2,117,1,114,30,124,1,110,2,105, - 0,125,6,116,1,124,6,131,1,125,7,116,0,124,0,124, - 7,124,4,131,3,125,5,124,3,115,148,124,4,100,1,107, - 2,114,84,116,0,124,0,160,2,100,3,161,1,100,1,25, - 0,131,1,83,0,124,0,115,92,124,5,83,0,116,3,124, - 0,131,1,116,3,124,0,160,2,100,3,161,1,100,1,25, - 0,131,1,24,0,125,8,116,4,106,5,124,5,106,6,100, - 2,116,3,124,5,106,6,131,1,124,8,24,0,133,2,25, - 0,25,0,83,0,116,7,124,5,100,4,131,2,114,170,116, - 8,124,5,124,3,116,0,131,3,83,0,124,5,83,0,41, - 5,97,215,1,0,0,73,109,112,111,114,116,32,97,32,109, - 111,100,117,108,101,46,10,10,32,32,32,32,84,104,101,32, - 39,103,108,111,98,97,108,115,39,32,97,114,103,117,109,101, - 110,116,32,105,115,32,117,115,101,100,32,116,111,32,105,110, - 102,101,114,32,119,104,101,114,101,32,116,104,101,32,105,109, - 112,111,114,116,32,105,115,32,111,99,99,117,114,114,105,110, - 103,32,102,114,111,109,10,32,32,32,32,116,111,32,104,97, - 110,100,108,101,32,114,101,108,97,116,105,118,101,32,105,109, - 112,111,114,116,115,46,32,84,104,101,32,39,108,111,99,97, - 108,115,39,32,97,114,103,117,109,101,110,116,32,105,115,32, - 105,103,110,111,114,101,100,46,32,84,104,101,10,32,32,32, - 32,39,102,114,111,109,108,105,115,116,39,32,97,114,103,117, - 109,101,110,116,32,115,112,101,99,105,102,105,101,115,32,119, - 104,97,116,32,115,104,111,117,108,100,32,101,120,105,115,116, - 32,97,115,32,97,116,116,114,105,98,117,116,101,115,32,111, - 110,32,116,104,101,32,109,111,100,117,108,101,10,32,32,32, - 32,98,101,105,110,103,32,105,109,112,111,114,116,101,100,32, - 40,101,46,103,46,32,96,96,102,114,111,109,32,109,111,100, - 117,108,101,32,105,109,112,111,114,116,32,60,102,114,111,109, - 108,105,115,116,62,96,96,41,46,32,32,84,104,101,32,39, - 108,101,118,101,108,39,10,32,32,32,32,97,114,103,117,109, - 101,110,116,32,114,101,112,114,101,115,101,110,116,115,32,116, - 104,101,32,112,97,99,107,97,103,101,32,108,111,99,97,116, - 105,111,110,32,116,111,32,105,109,112,111,114,116,32,102,114, - 111,109,32,105,110,32,97,32,114,101,108,97,116,105,118,101, - 10,32,32,32,32,105,109,112,111,114,116,32,40,101,46,103, - 46,32,96,96,102,114,111,109,32,46,46,112,107,103,32,105, - 109,112,111,114,116,32,109,111,100,96,96,32,119,111,117,108, - 100,32,104,97,118,101,32,97,32,39,108,101,118,101,108,39, - 32,111,102,32,50,41,46,10,10,32,32,32,32,114,25,0, - 0,0,78,114,135,0,0,0,114,148,0,0,0,41,9,114, - 216,0,0,0,114,227,0,0,0,218,9,112,97,114,116,105, - 116,105,111,110,114,195,0,0,0,114,18,0,0,0,114,99, - 0,0,0,114,9,0,0,0,114,11,0,0,0,114,221,0, - 0,0,41,9,114,20,0,0,0,114,226,0,0,0,218,6, - 108,111,99,97,108,115,114,222,0,0,0,114,197,0,0,0, - 114,104,0,0,0,90,8,103,108,111,98,97,108,115,95,114, - 196,0,0,0,90,7,99,117,116,95,111,102,102,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,10,95,95, - 105,109,112,111,114,116,95,95,92,4,0,0,115,32,0,0, - 0,8,11,10,1,16,2,8,1,12,1,4,1,8,3,18, - 1,4,1,4,1,26,4,30,3,10,1,12,1,4,2,255, - 128,114,230,0,0,0,99,1,0,0,0,0,0,0,0,0, + 115,46,32,84,104,101,32,39,108,111,99,97,108,115,39,32, + 97,114,103,117,109,101,110,116,32,105,115,32,105,103,110,111, + 114,101,100,46,32,84,104,101,10,32,32,32,32,39,102,114, + 111,109,108,105,115,116,39,32,97,114,103,117,109,101,110,116, + 32,115,112,101,99,105,102,105,101,115,32,119,104,97,116,32, + 115,104,111,117,108,100,32,101,120,105,115,116,32,97,115,32, + 97,116,116,114,105,98,117,116,101,115,32,111,110,32,116,104, + 101,32,109,111,100,117,108,101,10,32,32,32,32,98,101,105, + 110,103,32,105,109,112,111,114,116,101,100,32,40,101,46,103, + 46,32,96,96,102,114,111,109,32,109,111,100,117,108,101,32, + 105,109,112,111,114,116,32,60,102,114,111,109,108,105,115,116, + 62,96,96,41,46,32,32,84,104,101,32,39,108,101,118,101, + 108,39,10,32,32,32,32,97,114,103,117,109,101,110,116,32, + 114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,112, + 97,99,107,97,103,101,32,108,111,99,97,116,105,111,110,32, + 116,111,32,105,109,112,111,114,116,32,102,114,111,109,32,105, + 110,32,97,32,114,101,108,97,116,105,118,101,10,32,32,32, + 32,105,109,112,111,114,116,32,40,101,46,103,46,32,96,96, + 102,114,111,109,32,46,46,112,107,103,32,105,109,112,111,114, + 116,32,109,111,100,96,96,32,119,111,117,108,100,32,104,97, + 118,101,32,97,32,39,108,101,118,101,108,39,32,111,102,32, + 50,41,46,10,10,32,32,32,32,114,25,0,0,0,78,114, + 135,0,0,0,114,148,0,0,0,41,9,114,216,0,0,0, + 114,227,0,0,0,218,9,112,97,114,116,105,116,105,111,110, + 114,195,0,0,0,114,18,0,0,0,114,99,0,0,0,114, + 9,0,0,0,114,11,0,0,0,114,221,0,0,0,41,9, + 114,20,0,0,0,114,226,0,0,0,218,6,108,111,99,97, + 108,115,114,222,0,0,0,114,197,0,0,0,114,104,0,0, + 0,90,8,103,108,111,98,97,108,115,95,114,196,0,0,0, + 90,7,99,117,116,95,111,102,102,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,10,95,95,105,109,112,111, + 114,116,95,95,92,4,0,0,115,32,0,0,0,8,11,10, + 1,16,2,8,1,12,1,4,1,8,3,18,1,4,1,4, + 1,26,4,30,3,10,1,12,1,4,2,255,128,114,230,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 116,0,160,1,124,0,161,1,125,1,124,1,100,0,117,0, + 114,30,116,2,100,1,124,0,23,0,131,1,130,1,116,3, + 124,1,131,1,83,0,41,2,78,122,25,110,111,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,32,110,97, + 109,101,100,32,41,4,114,169,0,0,0,114,177,0,0,0, + 114,83,0,0,0,114,167,0,0,0,41,2,114,20,0,0, + 0,114,103,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,18,95,98,117,105,108,116,105,110,95, + 102,114,111,109,95,110,97,109,101,129,4,0,0,115,10,0, + 0,0,10,1,8,1,12,1,8,1,255,128,114,231,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,10,0, + 0,0,5,0,0,0,67,0,0,0,115,164,0,0,0,124, + 1,97,0,124,0,97,1,116,2,116,1,131,1,125,2,116, + 1,106,3,160,4,161,0,68,0,93,70,92,2,125,3,125, + 4,116,5,124,4,124,2,131,2,114,26,124,3,116,1,106, + 6,118,0,114,60,116,7,125,5,110,16,116,0,160,8,124, + 3,161,1,114,26,116,9,125,5,110,0,116,10,124,4,124, + 5,131,2,125,6,116,11,124,6,124,4,131,2,1,0,113, + 26,116,1,106,3,116,12,25,0,125,7,100,1,68,0,93, + 46,125,8,124,8,116,1,106,3,118,1,114,136,116,13,124, + 8,131,1,125,9,110,10,116,1,106,3,124,8,25,0,125, + 9,116,14,124,7,124,8,124,9,131,3,1,0,113,112,100, + 2,83,0,41,3,122,250,83,101,116,117,112,32,105,109,112, + 111,114,116,108,105,98,32,98,121,32,105,109,112,111,114,116, + 105,110,103,32,110,101,101,100,101,100,32,98,117,105,108,116, + 45,105,110,32,109,111,100,117,108,101,115,32,97,110,100,32, + 105,110,106,101,99,116,105,110,103,32,116,104,101,109,10,32, + 32,32,32,105,110,116,111,32,116,104,101,32,103,108,111,98, + 97,108,32,110,97,109,101,115,112,97,99,101,46,10,10,32, + 32,32,32,65,115,32,115,121,115,32,105,115,32,110,101,101, + 100,101,100,32,102,111,114,32,115,121,115,46,109,111,100,117, + 108,101,115,32,97,99,99,101,115,115,32,97,110,100,32,95, + 105,109,112,32,105,115,32,110,101,101,100,101,100,32,116,111, + 32,108,111,97,100,32,98,117,105,108,116,45,105,110,10,32, + 32,32,32,109,111,100,117,108,101,115,44,32,116,104,111,115, + 101,32,116,119,111,32,109,111,100,117,108,101,115,32,109,117, + 115,116,32,98,101,32,101,120,112,108,105,99,105,116,108,121, + 32,112,97,115,115,101,100,32,105,110,46,10,10,32,32,32, + 32,41,3,114,26,0,0,0,114,95,0,0,0,114,68,0, + 0,0,78,41,15,114,61,0,0,0,114,18,0,0,0,114, + 3,0,0,0,114,99,0,0,0,218,5,105,116,101,109,115, + 114,203,0,0,0,114,82,0,0,0,114,169,0,0,0,114, + 92,0,0,0,114,184,0,0,0,114,149,0,0,0,114,155, + 0,0,0,114,9,0,0,0,114,231,0,0,0,114,12,0, + 0,0,41,10,218,10,115,121,115,95,109,111,100,117,108,101, + 218,11,95,105,109,112,95,109,111,100,117,108,101,90,11,109, + 111,100,117,108,101,95,116,121,112,101,114,20,0,0,0,114, + 104,0,0,0,114,116,0,0,0,114,103,0,0,0,90,11, + 115,101,108,102,95,109,111,100,117,108,101,90,12,98,117,105, + 108,116,105,110,95,110,97,109,101,90,14,98,117,105,108,116, + 105,110,95,109,111,100,117,108,101,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,6,95,115,101,116,117,112, + 136,4,0,0,115,40,0,0,0,4,9,4,1,8,3,18, + 1,10,1,10,1,6,1,10,1,6,1,10,3,10,1,2, + 128,10,3,8,1,10,1,10,1,10,2,14,1,4,251,255, + 128,114,235,0,0,0,99,2,0,0,0,0,0,0,0,0, 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 38,0,0,0,116,0,160,1,124,0,161,1,125,1,124,1, - 100,0,117,0,114,30,116,2,100,1,124,0,23,0,131,1, - 130,1,116,3,124,1,131,1,83,0,41,2,78,122,25,110, - 111,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,32,110,97,109,101,100,32,41,4,114,169,0,0,0,114, - 177,0,0,0,114,83,0,0,0,114,167,0,0,0,41,2, - 114,20,0,0,0,114,103,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,18,95,98,117,105,108, - 116,105,110,95,102,114,111,109,95,110,97,109,101,129,4,0, - 0,115,10,0,0,0,10,1,8,1,12,1,8,1,255,128, - 114,231,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,10,0,0,0,5,0,0,0,67,0,0,0,115,164, - 0,0,0,124,1,97,0,124,0,97,1,116,2,116,1,131, - 1,125,2,116,1,106,3,160,4,161,0,68,0,93,70,92, - 2,125,3,125,4,116,5,124,4,124,2,131,2,114,26,124, - 3,116,1,106,6,118,0,114,60,116,7,125,5,110,16,116, - 0,160,8,124,3,161,1,114,26,116,9,125,5,110,0,116, - 10,124,4,124,5,131,2,125,6,116,11,124,6,124,4,131, - 2,1,0,113,26,116,1,106,3,116,12,25,0,125,7,100, - 1,68,0,93,46,125,8,124,8,116,1,106,3,118,1,114, - 136,116,13,124,8,131,1,125,9,110,10,116,1,106,3,124, - 8,25,0,125,9,116,14,124,7,124,8,124,9,131,3,1, - 0,113,112,100,2,83,0,41,3,122,250,83,101,116,117,112, - 32,105,109,112,111,114,116,108,105,98,32,98,121,32,105,109, - 112,111,114,116,105,110,103,32,110,101,101,100,101,100,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, - 97,110,100,32,105,110,106,101,99,116,105,110,103,32,116,104, - 101,109,10,32,32,32,32,105,110,116,111,32,116,104,101,32, - 103,108,111,98,97,108,32,110,97,109,101,115,112,97,99,101, - 46,10,10,32,32,32,32,65,115,32,115,121,115,32,105,115, - 32,110,101,101,100,101,100,32,102,111,114,32,115,121,115,46, - 109,111,100,117,108,101,115,32,97,99,99,101,115,115,32,97, - 110,100,32,95,105,109,112,32,105,115,32,110,101,101,100,101, - 100,32,116,111,32,108,111,97,100,32,98,117,105,108,116,45, - 105,110,10,32,32,32,32,109,111,100,117,108,101,115,44,32, - 116,104,111,115,101,32,116,119,111,32,109,111,100,117,108,101, - 115,32,109,117,115,116,32,98,101,32,101,120,112,108,105,99, - 105,116,108,121,32,112,97,115,115,101,100,32,105,110,46,10, - 10,32,32,32,32,41,3,114,26,0,0,0,114,95,0,0, - 0,114,68,0,0,0,78,41,15,114,61,0,0,0,114,18, - 0,0,0,114,3,0,0,0,114,99,0,0,0,218,5,105, - 116,101,109,115,114,203,0,0,0,114,82,0,0,0,114,169, - 0,0,0,114,92,0,0,0,114,184,0,0,0,114,149,0, - 0,0,114,155,0,0,0,114,9,0,0,0,114,231,0,0, - 0,114,12,0,0,0,41,10,218,10,115,121,115,95,109,111, - 100,117,108,101,218,11,95,105,109,112,95,109,111,100,117,108, - 101,90,11,109,111,100,117,108,101,95,116,121,112,101,114,20, - 0,0,0,114,104,0,0,0,114,116,0,0,0,114,103,0, - 0,0,90,11,115,101,108,102,95,109,111,100,117,108,101,90, - 12,98,117,105,108,116,105,110,95,110,97,109,101,90,14,98, - 117,105,108,116,105,110,95,109,111,100,117,108,101,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,6,95,115, - 101,116,117,112,136,4,0,0,115,40,0,0,0,4,9,4, - 1,8,3,18,1,10,1,10,1,6,1,10,1,6,1,10, - 3,10,1,2,128,10,3,8,1,10,1,10,1,10,2,14, - 1,4,251,255,128,114,235,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,124,0,124,1,131,2, - 1,0,116,1,106,2,160,3,116,4,161,1,1,0,116,1, - 106,2,160,3,116,5,161,1,1,0,100,1,83,0,41,2, - 122,48,73,110,115,116,97,108,108,32,105,109,112,111,114,116, - 101,114,115,32,102,111,114,32,98,117,105,108,116,105,110,32, - 97,110,100,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,115,78,41,6,114,235,0,0,0,114,18,0,0,0,114, - 201,0,0,0,114,126,0,0,0,114,169,0,0,0,114,184, - 0,0,0,41,2,114,233,0,0,0,114,234,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,8, - 95,105,110,115,116,97,108,108,171,4,0,0,115,8,0,0, - 0,10,2,12,2,16,1,255,128,114,236,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, - 0,0,0,67,0,0,0,115,32,0,0,0,100,1,100,2, - 108,0,125,0,124,0,97,1,124,0,160,2,116,3,106,4, - 116,5,25,0,161,1,1,0,100,2,83,0,41,3,122,57, - 73,110,115,116,97,108,108,32,105,109,112,111,114,116,101,114, - 115,32,116,104,97,116,32,114,101,113,117,105,114,101,32,101, - 120,116,101,114,110,97,108,32,102,105,108,101,115,121,115,116, - 101,109,32,97,99,99,101,115,115,114,25,0,0,0,78,41, - 6,218,26,95,102,114,111,122,101,110,95,105,109,112,111,114, - 116,108,105,98,95,101,120,116,101,114,110,97,108,114,133,0, - 0,0,114,236,0,0,0,114,18,0,0,0,114,99,0,0, - 0,114,9,0,0,0,41,1,114,237,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,27,95,105, - 110,115,116,97,108,108,95,101,120,116,101,114,110,97,108,95, - 105,109,112,111,114,116,101,114,115,179,4,0,0,115,8,0, - 0,0,8,3,4,1,20,1,255,128,114,238,0,0,0,41, - 2,78,78,41,1,78,41,2,78,114,25,0,0,0,41,4, - 78,78,114,5,0,0,0,114,25,0,0,0,41,54,114,10, - 0,0,0,114,7,0,0,0,114,26,0,0,0,114,95,0, - 0,0,114,68,0,0,0,114,133,0,0,0,114,17,0,0, - 0,114,21,0,0,0,114,63,0,0,0,114,37,0,0,0, - 114,47,0,0,0,114,22,0,0,0,114,23,0,0,0,114, - 53,0,0,0,114,54,0,0,0,114,57,0,0,0,114,69, - 0,0,0,114,71,0,0,0,114,80,0,0,0,114,90,0, - 0,0,114,94,0,0,0,114,105,0,0,0,114,118,0,0, - 0,114,119,0,0,0,114,98,0,0,0,114,149,0,0,0, - 114,155,0,0,0,114,159,0,0,0,114,114,0,0,0,114, - 100,0,0,0,114,166,0,0,0,114,167,0,0,0,114,101, - 0,0,0,114,169,0,0,0,114,184,0,0,0,114,189,0, - 0,0,114,198,0,0,0,114,200,0,0,0,114,202,0,0, - 0,114,208,0,0,0,90,15,95,69,82,82,95,77,83,71, - 95,80,82,69,70,73,88,114,210,0,0,0,114,213,0,0, - 0,218,6,111,98,106,101,99,116,114,214,0,0,0,114,215, - 0,0,0,114,216,0,0,0,114,221,0,0,0,114,227,0, - 0,0,114,230,0,0,0,114,231,0,0,0,114,235,0,0, - 0,114,236,0,0,0,114,238,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 8,60,109,111,100,117,108,101,62,1,0,0,0,115,106,0, - 0,0,4,0,8,22,4,9,4,1,4,1,4,3,8,3, - 8,8,4,8,4,2,16,3,14,4,14,77,14,21,8,16, - 8,37,8,17,14,11,8,8,8,11,8,12,8,19,14,36, - 16,101,10,26,14,45,8,72,8,17,8,17,8,30,8,36, - 8,45,14,15,14,75,14,80,8,13,8,9,10,9,8,47, - 4,16,8,1,8,2,6,32,8,3,10,16,14,15,8,37, - 10,27,8,37,8,7,8,35,12,8,255,128, + 38,0,0,0,116,0,124,0,124,1,131,2,1,0,116,1, + 106,2,160,3,116,4,161,1,1,0,116,1,106,2,160,3, + 116,5,161,1,1,0,100,1,83,0,41,2,122,48,73,110, + 115,116,97,108,108,32,105,109,112,111,114,116,101,114,115,32, + 102,111,114,32,98,117,105,108,116,105,110,32,97,110,100,32, + 102,114,111,122,101,110,32,109,111,100,117,108,101,115,78,41, + 6,114,235,0,0,0,114,18,0,0,0,114,201,0,0,0, + 114,126,0,0,0,114,169,0,0,0,114,184,0,0,0,41, + 2,114,233,0,0,0,114,234,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,8,95,105,110,115, + 116,97,108,108,171,4,0,0,115,8,0,0,0,10,2,12, + 2,16,1,255,128,114,236,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,67, + 0,0,0,115,32,0,0,0,100,1,100,2,108,0,125,0, + 124,0,97,1,124,0,160,2,116,3,106,4,116,5,25,0, + 161,1,1,0,100,2,83,0,41,3,122,57,73,110,115,116, + 97,108,108,32,105,109,112,111,114,116,101,114,115,32,116,104, + 97,116,32,114,101,113,117,105,114,101,32,101,120,116,101,114, + 110,97,108,32,102,105,108,101,115,121,115,116,101,109,32,97, + 99,99,101,115,115,114,25,0,0,0,78,41,6,218,26,95, + 102,114,111,122,101,110,95,105,109,112,111,114,116,108,105,98, + 95,101,120,116,101,114,110,97,108,114,133,0,0,0,114,236, + 0,0,0,114,18,0,0,0,114,99,0,0,0,114,9,0, + 0,0,41,1,114,237,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,27,95,105,110,115,116,97, + 108,108,95,101,120,116,101,114,110,97,108,95,105,109,112,111, + 114,116,101,114,115,179,4,0,0,115,8,0,0,0,8,3, + 4,1,20,1,255,128,114,238,0,0,0,41,2,78,78,41, + 1,78,41,2,78,114,25,0,0,0,41,4,78,78,114,5, + 0,0,0,114,25,0,0,0,41,54,114,10,0,0,0,114, + 7,0,0,0,114,26,0,0,0,114,95,0,0,0,114,68, + 0,0,0,114,133,0,0,0,114,17,0,0,0,114,21,0, + 0,0,114,63,0,0,0,114,37,0,0,0,114,47,0,0, + 0,114,22,0,0,0,114,23,0,0,0,114,53,0,0,0, + 114,54,0,0,0,114,57,0,0,0,114,69,0,0,0,114, + 71,0,0,0,114,80,0,0,0,114,90,0,0,0,114,94, + 0,0,0,114,105,0,0,0,114,118,0,0,0,114,119,0, + 0,0,114,98,0,0,0,114,149,0,0,0,114,155,0,0, + 0,114,159,0,0,0,114,114,0,0,0,114,100,0,0,0, + 114,166,0,0,0,114,167,0,0,0,114,101,0,0,0,114, + 169,0,0,0,114,184,0,0,0,114,189,0,0,0,114,198, + 0,0,0,114,200,0,0,0,114,202,0,0,0,114,208,0, + 0,0,90,15,95,69,82,82,95,77,83,71,95,80,82,69, + 70,73,88,114,210,0,0,0,114,213,0,0,0,218,6,111, + 98,106,101,99,116,114,214,0,0,0,114,215,0,0,0,114, + 216,0,0,0,114,221,0,0,0,114,227,0,0,0,114,230, + 0,0,0,114,231,0,0,0,114,235,0,0,0,114,236,0, + 0,0,114,238,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,8,60,109,111, + 100,117,108,101,62,1,0,0,0,115,106,0,0,0,4,0, + 8,22,4,9,4,1,4,1,4,3,8,3,8,8,4,8, + 4,2,16,3,14,4,14,77,14,21,8,16,8,37,8,17, + 14,11,8,8,8,11,8,12,8,19,14,36,16,101,10,26, + 14,45,8,72,8,17,8,17,8,30,8,36,8,45,14,15, + 14,75,14,80,8,13,8,9,10,9,8,47,4,16,8,1, + 8,2,6,32,8,3,10,16,14,15,8,37,10,27,8,37, + 8,7,8,35,12,8,255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index a5da2a92df4747..fee8f44f79cdba 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -1581,1088 +1581,1089 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 76,111,97,100,101,114,46,95,99,97,99,104,101,95,98,121, 116,101,99,111,100,101,114,68,0,0,0,114,8,1,0,0, 99,3,0,0,0,0,0,0,0,1,0,0,0,9,0,0, - 0,11,0,0,0,67,0,0,0,115,248,0,0,0,116,0, + 0,11,0,0,0,67,0,0,0,115,4,1,0,0,116,0, 124,1,131,1,92,2,125,4,125,5,103,0,125,6,124,4, - 114,52,116,1,124,4,131,1,115,52,116,0,124,4,131,1, + 114,62,116,1,124,4,131,1,115,62,116,0,124,4,131,1, 92,2,125,4,125,7,124,6,160,2,124,7,161,1,1,0, - 113,16,116,3,124,6,131,1,68,0,93,96,125,7,116,4, - 124,4,124,7,131,2,125,4,122,14,116,5,160,6,124,4, - 161,1,1,0,87,0,113,60,4,0,116,7,121,106,1,0, - 1,0,1,0,89,0,113,60,4,0,116,8,121,246,1,0, - 125,8,1,0,122,30,116,9,160,10,100,1,124,4,124,8, - 161,3,1,0,87,0,89,0,100,2,125,8,126,8,1,0, - 100,2,83,0,100,2,125,8,126,8,48,0,122,30,116,11, - 124,1,124,2,124,3,131,3,1,0,116,9,160,10,100,3, - 124,1,161,2,1,0,87,0,100,2,83,0,4,0,116,8, - 121,240,1,0,125,8,1,0,122,28,116,9,160,10,100,1, - 124,1,124,8,161,3,1,0,87,0,89,0,100,2,125,8, - 126,8,100,2,83,0,100,2,125,8,126,8,48,0,48,0, - 100,2,83,0,48,0,41,4,122,27,87,114,105,116,101,32, - 98,121,116,101,115,32,100,97,116,97,32,116,111,32,97,32, - 102,105,108,101,46,122,27,99,111,117,108,100,32,110,111,116, - 32,99,114,101,97,116,101,32,123,33,114,125,58,32,123,33, - 114,125,78,122,12,99,114,101,97,116,101,100,32,123,33,114, - 125,41,12,114,55,0,0,0,114,64,0,0,0,114,190,0, - 0,0,114,50,0,0,0,114,48,0,0,0,114,18,0,0, - 0,90,5,109,107,100,105,114,218,15,70,105,108,101,69,120, - 105,115,116,115,69,114,114,111,114,114,58,0,0,0,114,139, - 0,0,0,114,153,0,0,0,114,77,0,0,0,41,9,114, - 123,0,0,0,114,52,0,0,0,114,37,0,0,0,114,9, - 1,0,0,218,6,112,97,114,101,110,116,114,101,0,0,0, - 114,47,0,0,0,114,43,0,0,0,114,235,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,232, - 0,0,0,24,4,0,0,115,58,0,0,0,12,2,4,1, - 12,2,12,1,12,1,12,2,10,1,2,1,14,1,12,1, - 4,2,14,1,6,3,4,1,4,255,16,2,8,128,2,1, - 12,1,18,1,14,1,8,2,2,1,18,255,8,128,2,254, - 4,255,2,248,255,128,122,25,83,111,117,114,99,101,70,105, - 108,101,76,111,97,100,101,114,46,115,101,116,95,100,97,116, - 97,78,41,7,114,130,0,0,0,114,129,0,0,0,114,131, - 0,0,0,114,132,0,0,0,114,231,0,0,0,114,233,0, - 0,0,114,232,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,6,1,0,0, - 10,4,0,0,115,12,0,0,0,8,0,4,2,8,2,8, - 5,18,5,255,128,114,6,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114, - 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, - 122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104, - 97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115, - 115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160, - 0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125, - 3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124, - 1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100, - 2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83, - 0,41,4,78,114,163,0,0,0,114,149,0,0,0,41,2, - 114,121,0,0,0,114,111,0,0,0,41,5,114,183,0,0, - 0,114,234,0,0,0,114,156,0,0,0,114,169,0,0,0, - 114,242,0,0,0,41,5,114,123,0,0,0,114,143,0,0, - 0,114,52,0,0,0,114,37,0,0,0,114,155,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 220,0,0,0,59,4,0,0,115,24,0,0,0,10,1,10, - 1,2,4,2,1,6,254,12,4,2,1,14,1,2,1,2, - 1,6,253,255,128,122,29,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,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,41,2,122,39,82,101,116,117,114,110, - 32,78,111,110,101,32,97,115,32,116,104,101,114,101,32,105, - 115,32,110,111,32,115,111,117,114,99,101,32,99,111,100,101, - 46,78,114,7,0,0,0,114,226,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,236,0,0,0, - 75,4,0,0,115,4,0,0,0,4,2,255,128,122,31,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,41, - 6,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, - 114,132,0,0,0,114,220,0,0,0,114,236,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,12,1,0,0,55,4,0,0,115,10,0,0, - 0,8,0,4,2,8,2,12,16,255,128,114,12,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,64,0,0,0,115,92,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, - 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, - 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, - 90,10,100,16,100,17,132,0,90,11,101,12,100,18,100,19, - 132,0,131,1,90,13,100,20,83,0,41,21,114,3,1,0, - 0,122,93,76,111,97,100,101,114,32,102,111,114,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,46, - 10,10,32,32,32,32,84,104,101,32,99,111,110,115,116,114, - 117,99,116,111,114,32,105,115,32,100,101,115,105,103,110,101, - 100,32,116,111,32,119,111,114,107,32,119,105,116,104,32,70, - 105,108,101,70,105,110,100,101,114,46,10,10,32,32,32,32, - 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,2,0,0,0,67,0,0,0,115,16,0,0,0,124,1, - 124,0,95,0,124,2,124,0,95,1,100,0,83,0,114,114, - 0,0,0,114,163,0,0,0,41,3,114,123,0,0,0,114, - 121,0,0,0,114,52,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,216,0,0,0,88,4,0, - 0,115,6,0,0,0,6,1,10,1,255,128,122,28,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,0,0,0,0,2,0,0,0,2,0,0,0,67, - 0,0,0,115,24,0,0,0,124,0,106,0,124,1,106,0, - 107,2,111,22,124,0,106,1,124,1,106,1,107,2,83,0, - 114,114,0,0,0,114,247,0,0,0,114,249,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,250, - 0,0,0,92,4,0,0,115,8,0,0,0,12,1,10,1, - 2,255,255,128,122,26,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,95, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,20,0,0,0,116,0, - 124,0,106,1,131,1,116,0,124,0,106,2,131,1,65,0, - 83,0,114,114,0,0,0,114,251,0,0,0,114,253,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,254,0,0,0,96,4,0,0,115,4,0,0,0,20,1, - 255,128,122,28,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,46,95,95,104,97,115,104,95,95, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,5,0,0,0,67,0,0,0,115,36,0,0,0,116,0, - 160,1,116,2,106,3,124,1,161,2,125,2,116,0,160,4, - 100,1,124,1,106,5,124,0,106,6,161,3,1,0,124,2, - 83,0,41,3,122,38,67,114,101,97,116,101,32,97,110,32, - 117,110,105,116,105,97,108,105,122,101,100,32,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,122,38,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,123, - 33,114,125,32,108,111,97,100,101,100,32,102,114,111,109,32, - 123,33,114,125,78,41,7,114,139,0,0,0,114,221,0,0, - 0,114,167,0,0,0,90,14,99,114,101,97,116,101,95,100, - 121,110,97,109,105,99,114,153,0,0,0,114,121,0,0,0, - 114,52,0,0,0,41,3,114,123,0,0,0,114,191,0,0, - 0,114,223,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,219,0,0,0,99,4,0,0,115,16, - 0,0,0,4,2,6,1,4,255,6,2,8,1,4,255,4, - 2,255,128,122,33,69,120,116,101,110,115,105,111,110,70,105, - 108,101,76,111,97,100,101,114,46,99,114,101,97,116,101,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,5,0,0,0,67,0,0,0,115, - 36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,2, - 1,0,116,0,160,4,100,1,124,0,106,5,124,0,106,6, - 161,3,1,0,100,2,83,0,41,3,122,30,73,110,105,116, - 105,97,108,105,122,101,32,97,110,32,101,120,116,101,110,115, - 105,111,110,32,109,111,100,117,108,101,122,40,101,120,116,101, + 124,4,114,62,116,1,124,4,131,1,114,28,116,3,124,6, + 131,1,68,0,93,98,125,7,116,4,124,4,124,7,131,2, + 125,4,122,14,116,5,160,6,124,4,161,1,1,0,87,0, + 113,70,4,0,116,7,121,116,1,0,1,0,1,0,89,0, + 113,70,4,0,116,8,144,1,121,2,1,0,125,8,1,0, + 122,30,116,9,160,10,100,1,124,4,124,8,161,3,1,0, + 87,0,89,0,100,2,125,8,126,8,1,0,100,2,83,0, + 100,2,125,8,126,8,48,0,122,30,116,11,124,1,124,2, + 124,3,131,3,1,0,116,9,160,10,100,3,124,1,161,2, + 1,0,87,0,100,2,83,0,4,0,116,8,121,252,1,0, + 125,8,1,0,122,28,116,9,160,10,100,1,124,1,124,8, + 161,3,1,0,87,0,89,0,100,2,125,8,126,8,100,2, + 83,0,100,2,125,8,126,8,48,0,48,0,100,2,83,0, + 48,0,41,4,122,27,87,114,105,116,101,32,98,121,116,101, + 115,32,100,97,116,97,32,116,111,32,97,32,102,105,108,101, + 46,122,27,99,111,117,108,100,32,110,111,116,32,99,114,101, + 97,116,101,32,123,33,114,125,58,32,123,33,114,125,78,122, + 12,99,114,101,97,116,101,100,32,123,33,114,125,41,12,114, + 55,0,0,0,114,64,0,0,0,114,190,0,0,0,114,50, + 0,0,0,114,48,0,0,0,114,18,0,0,0,90,5,109, + 107,100,105,114,218,15,70,105,108,101,69,120,105,115,116,115, + 69,114,114,111,114,114,58,0,0,0,114,139,0,0,0,114, + 153,0,0,0,114,77,0,0,0,41,9,114,123,0,0,0, + 114,52,0,0,0,114,37,0,0,0,114,9,1,0,0,218, + 6,112,97,114,101,110,116,114,101,0,0,0,114,47,0,0, + 0,114,43,0,0,0,114,235,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,232,0,0,0,24, + 4,0,0,115,60,0,0,0,12,2,4,1,12,2,12,1, + 10,1,12,254,12,4,10,1,2,1,14,1,12,1,4,2, + 16,1,6,3,4,1,4,255,16,2,8,128,2,1,12,1, + 18,1,14,1,8,2,2,1,18,255,8,128,2,254,4,255, + 2,248,255,128,122,25,83,111,117,114,99,101,70,105,108,101, + 76,111,97,100,101,114,46,115,101,116,95,100,97,116,97,78, + 41,7,114,130,0,0,0,114,129,0,0,0,114,131,0,0, + 0,114,132,0,0,0,114,231,0,0,0,114,233,0,0,0, + 114,232,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,6,1,0,0,10,4, + 0,0,115,12,0,0,0,8,0,4,2,8,2,8,5,18, + 5,255,128,114,6,1,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, + 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, + 90,5,100,6,83,0,41,7,218,20,83,111,117,114,99,101, + 108,101,115,115,70,105,108,101,76,111,97,100,101,114,122,45, + 76,111,97,100,101,114,32,119,104,105,99,104,32,104,97,110, + 100,108,101,115,32,115,111,117,114,99,101,108,101,115,115,32, + 102,105,108,101,32,105,109,112,111,114,116,115,46,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, + 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,124, + 1,161,1,125,2,124,0,160,1,124,2,161,1,125,3,124, + 1,124,2,100,1,156,2,125,4,116,2,124,3,124,1,124, + 4,131,3,1,0,116,3,116,4,124,3,131,1,100,2,100, + 0,133,2,25,0,124,1,124,2,100,3,141,3,83,0,41, + 4,78,114,163,0,0,0,114,149,0,0,0,41,2,114,121, + 0,0,0,114,111,0,0,0,41,5,114,183,0,0,0,114, + 234,0,0,0,114,156,0,0,0,114,169,0,0,0,114,242, + 0,0,0,41,5,114,123,0,0,0,114,143,0,0,0,114, + 52,0,0,0,114,37,0,0,0,114,155,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,220,0, + 0,0,59,4,0,0,115,24,0,0,0,10,1,10,1,2, + 4,2,1,6,254,12,4,2,1,14,1,2,1,2,1,6, + 253,255,128,122,29,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,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,78, + 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, + 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, + 114,7,0,0,0,114,226,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,236,0,0,0,75,4, + 0,0,115,4,0,0,0,4,2,255,128,122,31,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,41,6,114, + 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, + 0,0,0,114,220,0,0,0,114,236,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,12,1,0,0,55,4,0,0,115,10,0,0,0,8, + 0,4,2,8,2,12,16,255,128,114,12,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,64,0,0,0,115,92,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6, + 100,8,100,9,132,0,90,7,100,10,100,11,132,0,90,8, + 100,12,100,13,132,0,90,9,100,14,100,15,132,0,90,10, + 100,16,100,17,132,0,90,11,101,12,100,18,100,19,132,0, + 131,1,90,13,100,20,83,0,41,21,114,3,1,0,0,122, + 93,76,111,97,100,101,114,32,102,111,114,32,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,115,46,10,10, + 32,32,32,32,84,104,101,32,99,111,110,115,116,114,117,99, + 116,111,114,32,105,115,32,100,101,115,105,103,110,101,100,32, + 116,111,32,119,111,114,107,32,119,105,116,104,32,70,105,108, + 101,70,105,110,100,101,114,46,10,10,32,32,32,32,99,3, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2, + 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0, + 95,0,124,2,124,0,95,1,100,0,83,0,114,114,0,0, + 0,114,163,0,0,0,41,3,114,123,0,0,0,114,121,0, + 0,0,114,52,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,216,0,0,0,88,4,0,0,115, + 6,0,0,0,6,1,10,1,255,128,122,28,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,115,24,0,0,0,124,0,106,0,124,1,106,0,107,2, + 111,22,124,0,106,1,124,1,106,1,107,2,83,0,114,114, + 0,0,0,114,247,0,0,0,114,249,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,250,0,0, + 0,92,4,0,0,115,8,0,0,0,12,1,10,1,2,255, + 255,128,122,26,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,95,95,101,113,95,95,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, + 0,0,0,67,0,0,0,115,20,0,0,0,116,0,124,0, + 106,1,131,1,116,0,124,0,106,2,131,1,65,0,83,0, + 114,114,0,0,0,114,251,0,0,0,114,253,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,254, + 0,0,0,96,4,0,0,115,4,0,0,0,20,1,255,128, + 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76, + 111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, + 0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1, + 116,2,106,3,124,1,161,2,125,2,116,0,160,4,100,1, + 124,1,106,5,124,0,106,6,161,3,1,0,124,2,83,0, + 41,3,122,38,67,114,101,97,116,101,32,97,110,32,117,110, + 105,116,105,97,108,105,122,101,100,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,122,38,101,120,116,101, 110,115,105,111,110,32,109,111,100,117,108,101,32,123,33,114, - 125,32,101,120,101,99,117,116,101,100,32,102,114,111,109,32, - 123,33,114,125,78,41,7,114,139,0,0,0,114,221,0,0, - 0,114,167,0,0,0,90,12,101,120,101,99,95,100,121,110, + 125,32,108,111,97,100,101,100,32,102,114,111,109,32,123,33, + 114,125,78,41,7,114,139,0,0,0,114,221,0,0,0,114, + 167,0,0,0,90,14,99,114,101,97,116,101,95,100,121,110, 97,109,105,99,114,153,0,0,0,114,121,0,0,0,114,52, - 0,0,0,169,2,114,123,0,0,0,114,223,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,224, - 0,0,0,107,4,0,0,115,10,0,0,0,14,2,6,1, - 8,1,8,255,255,128,122,31,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,99, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0, - 115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,25, - 0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,116, - 3,68,0,131,1,131,1,83,0,41,5,122,49,82,101,116, - 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, + 0,0,0,41,3,114,123,0,0,0,114,191,0,0,0,114, + 223,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,219,0,0,0,99,4,0,0,115,16,0,0, + 0,4,2,6,1,4,255,6,2,8,1,4,255,4,2,255, + 128,122,33,69,120,116,101,110,115,105,111,110,70,105,108,101, + 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,5,0,0,0,67,0,0,0,115,36,0, + 0,0,116,0,160,1,116,2,106,3,124,1,161,2,1,0, + 116,0,160,4,100,1,124,0,106,5,124,0,106,6,161,3, + 1,0,100,2,83,0,41,3,122,30,73,110,105,116,105,97, + 108,105,122,101,32,97,110,32,101,120,116,101,110,115,105,111, + 110,32,109,111,100,117,108,101,122,40,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,32,123,33,114,125,32, + 101,120,101,99,117,116,101,100,32,102,114,111,109,32,123,33, + 114,125,78,41,7,114,139,0,0,0,114,221,0,0,0,114, + 167,0,0,0,90,12,101,120,101,99,95,100,121,110,97,109, + 105,99,114,153,0,0,0,114,121,0,0,0,114,52,0,0, + 0,169,2,114,123,0,0,0,114,223,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,224,0,0, + 0,107,4,0,0,115,10,0,0,0,14,2,6,1,8,1, + 8,255,255,128,122,31,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,36, + 0,0,0,116,0,124,0,106,1,131,1,100,1,25,0,137, + 0,116,2,135,0,102,1,100,2,100,3,132,8,116,3,68, + 0,131,1,131,1,83,0,41,5,122,49,82,101,116,117,114, + 110,32,84,114,117,101,32,105,102,32,116,104,101,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,105, + 115,32,97,32,112,97,99,107,97,103,101,46,114,3,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,4,0,0,0,51,0,0,0,115,26,0,0,0,124, + 0,93,18,125,1,136,0,100,0,124,1,23,0,107,2,86, + 0,1,0,113,2,100,1,83,0,41,2,114,216,0,0,0, + 78,114,7,0,0,0,169,2,114,5,0,0,0,218,6,115, + 117,102,102,105,120,169,1,90,9,102,105,108,101,95,110,97, + 109,101,114,7,0,0,0,114,8,0,0,0,114,9,0,0, + 0,116,4,0,0,115,8,0,0,0,4,0,2,1,20,255, + 255,128,122,49,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,111,99,97,108,115,62,46,60,103,101,110, + 101,120,112,114,62,78,41,4,114,55,0,0,0,114,52,0, + 0,0,218,3,97,110,121,114,212,0,0,0,114,226,0,0, + 0,114,7,0,0,0,114,16,1,0,0,114,8,0,0,0, + 114,186,0,0,0,113,4,0,0,115,10,0,0,0,14,2, + 12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,101, + 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32, 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,3, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,0, - 0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,107, - 2,86,0,1,0,113,2,100,1,83,0,41,2,114,216,0, - 0,0,78,114,7,0,0,0,169,2,114,5,0,0,0,218, - 6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,95, - 110,97,109,101,114,7,0,0,0,114,8,0,0,0,114,9, - 0,0,0,116,4,0,0,115,8,0,0,0,4,0,2,1, - 20,255,255,128,122,49,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,111,99,97,108,115,62,46,60,103, - 101,110,101,120,112,114,62,78,41,4,114,55,0,0,0,114, - 52,0,0,0,218,3,97,110,121,114,212,0,0,0,114,226, - 0,0,0,114,7,0,0,0,114,16,1,0,0,114,8,0, - 0,0,114,186,0,0,0,113,4,0,0,115,10,0,0,0, - 14,2,12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,63, - 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,97, - 110,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,32,99,97,110,110,111,116,32,99,114,101,97,116,101, - 32,97,32,99,111,100,101,32,111,98,106,101,99,116,46,78, - 114,7,0,0,0,114,226,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,220,0,0,0,119,4, - 0,0,115,4,0,0,0,4,2,255,128,122,28,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,53,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,32, - 104,97,118,101,32,110,111,32,115,111,117,114,99,101,32,99, - 111,100,101,46,78,114,7,0,0,0,114,226,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,236, - 0,0,0,123,4,0,0,115,4,0,0,0,4,2,255,128, - 122,30,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, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,6,0,0,0,124,0, - 106,0,83,0,114,1,1,0,0,114,56,0,0,0,114,226, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,183,0,0,0,127,4,0,0,115,4,0,0,0, - 6,3,255,128,122,32,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,103,101,116,95,102,105, - 108,101,110,97,109,101,78,41,14,114,130,0,0,0,114,129, - 0,0,0,114,131,0,0,0,114,132,0,0,0,114,216,0, - 0,0,114,250,0,0,0,114,254,0,0,0,114,219,0,0, - 0,114,224,0,0,0,114,186,0,0,0,114,220,0,0,0, - 114,236,0,0,0,114,140,0,0,0,114,183,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,3,1,0,0,80,4,0,0,115,26,0,0, - 0,8,0,4,2,8,6,8,4,8,4,8,3,8,8,8, - 6,8,6,8,4,2,4,14,1,255,128,114,3,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,64,0,0,0,115,104,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, - 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, - 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, - 90,10,100,16,100,17,132,0,90,11,100,18,100,19,132,0, - 90,12,100,20,100,21,132,0,90,13,100,22,100,23,132,0, - 90,14,100,24,83,0,41,25,218,14,95,78,97,109,101,115, - 112,97,99,101,80,97,116,104,97,38,1,0,0,82,101,112, - 114,101,115,101,110,116,115,32,97,32,110,97,109,101,115,112, - 97,99,101,32,112,97,99,107,97,103,101,39,115,32,112,97, - 116,104,46,32,32,73,116,32,117,115,101,115,32,116,104,101, - 32,109,111,100,117,108,101,32,110,97,109,101,10,32,32,32, - 32,116,111,32,102,105,110,100,32,105,116,115,32,112,97,114, - 101,110,116,32,109,111,100,117,108,101,44,32,97,110,100,32, - 102,114,111,109,32,116,104,101,114,101,32,105,116,32,108,111, - 111,107,115,32,117,112,32,116,104,101,32,112,97,114,101,110, - 116,39,115,10,32,32,32,32,95,95,112,97,116,104,95,95, - 46,32,32,87,104,101,110,32,116,104,105,115,32,99,104,97, - 110,103,101,115,44,32,116,104,101,32,109,111,100,117,108,101, - 39,115,32,111,119,110,32,112,97,116,104,32,105,115,32,114, - 101,99,111,109,112,117,116,101,100,44,10,32,32,32,32,117, - 115,105,110,103,32,112,97,116,104,95,102,105,110,100,101,114, - 46,32,32,70,111,114,32,116,111,112,45,108,101,118,101,108, - 32,109,111,100,117,108,101,115,44,32,116,104,101,32,112,97, - 114,101,110,116,32,109,111,100,117,108,101,39,115,32,112,97, - 116,104,10,32,32,32,32,105,115,32,115,121,115,46,112,97, - 116,104,46,99,4,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,3,0,0,0,67,0,0,0,115,36,0,0, - 0,124,1,124,0,95,0,124,2,124,0,95,1,116,2,124, - 0,160,3,161,0,131,1,124,0,95,4,124,3,124,0,95, - 5,100,0,83,0,114,114,0,0,0,41,6,218,5,95,110, - 97,109,101,218,5,95,112,97,116,104,114,116,0,0,0,218, - 16,95,103,101,116,95,112,97,114,101,110,116,95,112,97,116, - 104,218,17,95,108,97,115,116,95,112,97,114,101,110,116,95, - 112,97,116,104,218,12,95,112,97,116,104,95,102,105,110,100, - 101,114,169,4,114,123,0,0,0,114,121,0,0,0,114,52, - 0,0,0,90,11,112,97,116,104,95,102,105,110,100,101,114, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 216,0,0,0,140,4,0,0,115,10,0,0,0,6,1,6, - 1,14,1,10,1,255,128,122,23,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,0,0,0,0,4,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, - 106,0,160,1,100,1,161,1,92,3,125,1,125,2,125,3, - 124,2,100,2,107,2,114,30,100,3,83,0,124,1,100,4, - 102,2,83,0,41,6,122,62,82,101,116,117,114,110,115,32, - 97,32,116,117,112,108,101,32,111,102,32,40,112,97,114,101, - 110,116,45,109,111,100,117,108,101,45,110,97,109,101,44,32, - 112,97,114,101,110,116,45,112,97,116,104,45,97,116,116,114, - 45,110,97,109,101,41,114,79,0,0,0,114,10,0,0,0, - 41,2,114,15,0,0,0,114,52,0,0,0,90,8,95,95, - 112,97,116,104,95,95,78,41,2,114,19,1,0,0,114,49, - 0,0,0,41,4,114,123,0,0,0,114,11,1,0,0,218, - 3,100,111,116,90,2,109,101,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,23,95,102,105,110,100,95,112, - 97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,115, - 146,4,0,0,115,10,0,0,0,18,2,8,1,4,2,8, - 3,255,128,122,38,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,101,115,99,1,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,28,0,0,0,124,0,160,0,161,0,92, - 2,125,1,125,2,116,1,116,2,106,3,124,1,25,0,124, - 2,131,2,83,0,114,114,0,0,0,41,4,114,26,1,0, - 0,114,135,0,0,0,114,15,0,0,0,218,7,109,111,100, - 117,108,101,115,41,3,114,123,0,0,0,90,18,112,97,114, - 101,110,116,95,109,111,100,117,108,101,95,110,97,109,101,90, - 14,112,97,116,104,95,97,116,116,114,95,110,97,109,101,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,21, - 1,0,0,156,4,0,0,115,6,0,0,0,12,1,16,1, - 255,128,122,31,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,0,0,0,0, - 3,0,0,0,4,0,0,0,67,0,0,0,115,80,0,0, - 0,116,0,124,0,160,1,161,0,131,1,125,1,124,1,124, - 0,106,2,107,3,114,74,124,0,160,3,124,0,106,4,124, - 1,161,2,125,2,124,2,100,0,117,1,114,68,124,2,106, - 5,100,0,117,0,114,68,124,2,106,6,114,68,124,2,106, - 6,124,0,95,7,124,1,124,0,95,2,124,0,106,7,83, - 0,114,114,0,0,0,41,8,114,116,0,0,0,114,21,1, - 0,0,114,22,1,0,0,114,23,1,0,0,114,19,1,0, - 0,114,144,0,0,0,114,182,0,0,0,114,20,1,0,0, - 41,3,114,123,0,0,0,90,11,112,97,114,101,110,116,95, - 112,97,116,104,114,191,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,12,95,114,101,99,97,108, - 99,117,108,97,116,101,160,4,0,0,115,18,0,0,0,12, - 2,10,1,14,1,18,3,6,1,8,1,6,1,6,1,255, - 128,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,114,101,99,97,108,99,117,108,97,116,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,12,0,0,0,116,0,124,0, - 160,1,161,0,131,1,83,0,114,114,0,0,0,41,2,218, - 4,105,116,101,114,114,28,1,0,0,114,253,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,8, - 95,95,105,116,101,114,95,95,173,4,0,0,115,4,0,0, - 0,12,1,255,128,122,23,95,78,97,109,101,115,112,97,99, - 101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, - 0,0,0,67,0,0,0,115,12,0,0,0,124,0,160,0, - 161,0,124,1,25,0,83,0,114,114,0,0,0,169,1,114, - 28,1,0,0,41,2,114,123,0,0,0,218,5,105,110,100, - 101,120,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,95,95,103,101,116,105,116,101,109,95,95,176,4, - 0,0,115,4,0,0,0,12,1,255,128,122,26,95,78,97, - 109,101,115,112,97,99,101,80,97,116,104,46,95,95,103,101, - 116,105,116,101,109,95,95,99,3,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, - 115,14,0,0,0,124,2,124,0,106,0,124,1,60,0,100, - 0,83,0,114,114,0,0,0,41,1,114,20,1,0,0,41, - 3,114,123,0,0,0,114,32,1,0,0,114,52,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,95,95,115,101,116,105,116,101,109,95,95,179,4,0,0, - 115,4,0,0,0,14,1,255,128,122,26,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,46,95,95,115,101,116,105, - 116,101,109,95,95,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,116,0,124,0,160,1,161,0,131,1,83,0,114, - 114,0,0,0,41,2,114,4,0,0,0,114,28,1,0,0, - 114,253,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,7,95,95,108,101,110,95,95,182,4,0, - 0,115,4,0,0,0,12,1,255,128,122,22,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,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, - 100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122, - 20,95,78,97,109,101,115,112,97,99,101,80,97,116,104,40, - 123,33,114,125,41,41,2,114,70,0,0,0,114,20,1,0, - 0,114,253,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,8,95,95,114,101,112,114,95,95,185, - 4,0,0,115,4,0,0,0,12,1,255,128,122,23,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,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,124,1,124,0,160,0,161,0,118,0,83,0,114, - 114,0,0,0,114,31,1,0,0,169,2,114,123,0,0,0, - 218,4,105,116,101,109,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,12,95,95,99,111,110,116,97,105,110, - 115,95,95,188,4,0,0,115,4,0,0,0,12,1,255,128, - 122,27,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,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,16,0,0,0,124,0,106,0,160, - 1,124,1,161,1,1,0,100,0,83,0,114,114,0,0,0, - 41,2,114,20,1,0,0,114,190,0,0,0,114,37,1,0, + 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, + 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,7, + 0,0,0,114,226,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,220,0,0,0,119,4,0,0, + 115,4,0,0,0,4,2,255,128,122,28,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, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,53,82,101,116, + 117,114,110,32,78,111,110,101,32,97,115,32,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,115,32,104,97, + 118,101,32,110,111,32,115,111,117,114,99,101,32,99,111,100, + 101,46,78,114,7,0,0,0,114,226,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,236,0,0, + 0,123,4,0,0,115,4,0,0,0,4,2,255,128,122,30, + 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,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, + 0,0,0,67,0,0,0,115,6,0,0,0,124,0,106,0, + 83,0,114,1,1,0,0,114,56,0,0,0,114,226,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,190,0,0,0,191,4,0,0,115,4,0,0,0,16,1, - 255,128,122,21,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,97,112,112,101,110,100,78,41,15,114,130,0,0, - 0,114,129,0,0,0,114,131,0,0,0,114,132,0,0,0, - 114,216,0,0,0,114,26,1,0,0,114,21,1,0,0,114, - 28,1,0,0,114,30,1,0,0,114,33,1,0,0,114,34, - 1,0,0,114,35,1,0,0,114,36,1,0,0,114,39,1, - 0,0,114,190,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,18,1,0,0, - 133,4,0,0,115,28,0,0,0,8,0,4,1,8,6,8, - 6,8,10,8,4,8,13,8,3,8,3,8,3,8,3,8, - 3,12,3,255,128,114,18,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, - 0,0,0,115,80,0,0,0,101,0,90,1,100,0,90,2, - 100,1,100,2,132,0,90,3,101,4,100,3,100,4,132,0, - 131,1,90,5,100,5,100,6,132,0,90,6,100,7,100,8, - 132,0,90,7,100,9,100,10,132,0,90,8,100,11,100,12, - 132,0,90,9,100,13,100,14,132,0,90,10,100,15,100,16, - 132,0,90,11,100,17,83,0,41,18,218,16,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,99,4,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, - 0,67,0,0,0,115,18,0,0,0,116,0,124,1,124,2, - 124,3,131,3,124,0,95,1,100,0,83,0,114,114,0,0, - 0,41,2,114,18,1,0,0,114,20,1,0,0,114,24,1, + 114,183,0,0,0,127,4,0,0,115,4,0,0,0,6,3, + 255,128,122,32,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,101, + 110,97,109,101,78,41,14,114,130,0,0,0,114,129,0,0, + 0,114,131,0,0,0,114,132,0,0,0,114,216,0,0,0, + 114,250,0,0,0,114,254,0,0,0,114,219,0,0,0,114, + 224,0,0,0,114,186,0,0,0,114,220,0,0,0,114,236, + 0,0,0,114,140,0,0,0,114,183,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,216,0,0,0,197,4,0,0,115,4,0,0,0,18, - 1,255,128,122,25,95,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,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,12,0,0,0,100,1,160,0, - 124,0,106,1,161,1,83,0,41,3,122,115,82,101,116,117, - 114,110,32,114,101,112,114,32,102,111,114,32,116,104,101,32, - 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,101,32,109,101,116,104,111,100,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,32,84,104,101,32, - 105,109,112,111,114,116,32,109,97,99,104,105,110,101,114,121, - 32,100,111,101,115,32,116,104,101,32,106,111,98,32,105,116, - 115,101,108,102,46,10,10,32,32,32,32,32,32,32,32,122, - 25,60,109,111,100,117,108,101,32,123,33,114,125,32,40,110, - 97,109,101,115,112,97,99,101,41,62,78,41,2,114,70,0, - 0,0,114,130,0,0,0,41,1,114,223,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,109, - 111,100,117,108,101,95,114,101,112,114,200,4,0,0,115,4, - 0,0,0,12,7,255,128,122,28,95,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,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,78,84,114,7,0,0,0, + 0,114,3,1,0,0,80,4,0,0,115,26,0,0,0,8, + 0,4,2,8,6,8,4,8,4,8,3,8,8,8,6,8, + 6,8,4,2,4,14,1,255,128,114,3,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,64,0,0,0,115,104,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6, + 100,8,100,9,132,0,90,7,100,10,100,11,132,0,90,8, + 100,12,100,13,132,0,90,9,100,14,100,15,132,0,90,10, + 100,16,100,17,132,0,90,11,100,18,100,19,132,0,90,12, + 100,20,100,21,132,0,90,13,100,22,100,23,132,0,90,14, + 100,24,83,0,41,25,218,14,95,78,97,109,101,115,112,97, + 99,101,80,97,116,104,97,38,1,0,0,82,101,112,114,101, + 115,101,110,116,115,32,97,32,110,97,109,101,115,112,97,99, + 101,32,112,97,99,107,97,103,101,39,115,32,112,97,116,104, + 46,32,32,73,116,32,117,115,101,115,32,116,104,101,32,109, + 111,100,117,108,101,32,110,97,109,101,10,32,32,32,32,116, + 111,32,102,105,110,100,32,105,116,115,32,112,97,114,101,110, + 116,32,109,111,100,117,108,101,44,32,97,110,100,32,102,114, + 111,109,32,116,104,101,114,101,32,105,116,32,108,111,111,107, + 115,32,117,112,32,116,104,101,32,112,97,114,101,110,116,39, + 115,10,32,32,32,32,95,95,112,97,116,104,95,95,46,32, + 32,87,104,101,110,32,116,104,105,115,32,99,104,97,110,103, + 101,115,44,32,116,104,101,32,109,111,100,117,108,101,39,115, + 32,111,119,110,32,112,97,116,104,32,105,115,32,114,101,99, + 111,109,112,117,116,101,100,44,10,32,32,32,32,117,115,105, + 110,103,32,112,97,116,104,95,102,105,110,100,101,114,46,32, + 32,70,111,114,32,116,111,112,45,108,101,118,101,108,32,109, + 111,100,117,108,101,115,44,32,116,104,101,32,112,97,114,101, + 110,116,32,109,111,100,117,108,101,39,115,32,112,97,116,104, + 10,32,32,32,32,105,115,32,115,121,115,46,112,97,116,104, + 46,99,4,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,3,0,0,0,67,0,0,0,115,36,0,0,0,124, + 1,124,0,95,0,124,2,124,0,95,1,116,2,124,0,160, + 3,161,0,131,1,124,0,95,4,124,3,124,0,95,5,100, + 0,83,0,114,114,0,0,0,41,6,218,5,95,110,97,109, + 101,218,5,95,112,97,116,104,114,116,0,0,0,218,16,95, + 103,101,116,95,112,97,114,101,110,116,95,112,97,116,104,218, + 17,95,108,97,115,116,95,112,97,114,101,110,116,95,112,97, + 116,104,218,12,95,112,97,116,104,95,102,105,110,100,101,114, + 169,4,114,123,0,0,0,114,121,0,0,0,114,52,0,0, + 0,90,11,112,97,116,104,95,102,105,110,100,101,114,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, + 0,0,140,4,0,0,115,10,0,0,0,6,1,6,1,14, + 1,10,1,255,128,122,23,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,0,0,0,0,4,0,0,0,3, + 0,0,0,67,0,0,0,115,38,0,0,0,124,0,106,0, + 160,1,100,1,161,1,92,3,125,1,125,2,125,3,124,2, + 100,2,107,2,114,30,100,3,83,0,124,1,100,4,102,2, + 83,0,41,6,122,62,82,101,116,117,114,110,115,32,97,32, + 116,117,112,108,101,32,111,102,32,40,112,97,114,101,110,116, + 45,109,111,100,117,108,101,45,110,97,109,101,44,32,112,97, + 114,101,110,116,45,112,97,116,104,45,97,116,116,114,45,110, + 97,109,101,41,114,79,0,0,0,114,10,0,0,0,41,2, + 114,15,0,0,0,114,52,0,0,0,90,8,95,95,112,97, + 116,104,95,95,78,41,2,114,19,1,0,0,114,49,0,0, + 0,41,4,114,123,0,0,0,114,11,1,0,0,218,3,100, + 111,116,90,2,109,101,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,23,95,102,105,110,100,95,112,97,114, + 101,110,116,95,112,97,116,104,95,110,97,109,101,115,146,4, + 0,0,115,10,0,0,0,18,2,8,1,4,2,8,3,255, + 128,122,38,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,101,115,99,1,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, + 0,0,115,28,0,0,0,124,0,160,0,161,0,92,2,125, + 1,125,2,116,1,116,2,106,3,124,1,25,0,124,2,131, + 2,83,0,114,114,0,0,0,41,4,114,26,1,0,0,114, + 135,0,0,0,114,15,0,0,0,218,7,109,111,100,117,108, + 101,115,41,3,114,123,0,0,0,90,18,112,97,114,101,110, + 116,95,109,111,100,117,108,101,95,110,97,109,101,90,14,112, + 97,116,104,95,97,116,116,114,95,110,97,109,101,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,21,1,0, + 0,156,4,0,0,115,6,0,0,0,12,1,16,1,255,128, + 122,31,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,0,0,0,0,3,0, + 0,0,4,0,0,0,67,0,0,0,115,80,0,0,0,116, + 0,124,0,160,1,161,0,131,1,125,1,124,1,124,0,106, + 2,107,3,114,74,124,0,160,3,124,0,106,4,124,1,161, + 2,125,2,124,2,100,0,117,1,114,68,124,2,106,5,100, + 0,117,0,114,68,124,2,106,6,114,68,124,2,106,6,124, + 0,95,7,124,1,124,0,95,2,124,0,106,7,83,0,114, + 114,0,0,0,41,8,114,116,0,0,0,114,21,1,0,0, + 114,22,1,0,0,114,23,1,0,0,114,19,1,0,0,114, + 144,0,0,0,114,182,0,0,0,114,20,1,0,0,41,3, + 114,123,0,0,0,90,11,112,97,114,101,110,116,95,112,97, + 116,104,114,191,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,12,95,114,101,99,97,108,99,117, + 108,97,116,101,160,4,0,0,115,18,0,0,0,12,2,10, + 1,14,1,18,3,6,1,8,1,6,1,6,1,255,128,122, + 27,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,114,101,99,97,108,99,117,108,97,116,101,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,116,0,124,0,160,1, + 161,0,131,1,83,0,114,114,0,0,0,41,2,218,4,105, + 116,101,114,114,28,1,0,0,114,253,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,8,95,95, + 105,116,101,114,95,95,173,4,0,0,115,4,0,0,0,12, + 1,255,128,122,23,95,78,97,109,101,115,112,97,99,101,80, + 97,116,104,46,95,95,105,116,101,114,95,95,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, + 0,67,0,0,0,115,12,0,0,0,124,0,160,0,161,0, + 124,1,25,0,83,0,114,114,0,0,0,169,1,114,28,1, + 0,0,41,2,114,123,0,0,0,218,5,105,110,100,101,120, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 11,95,95,103,101,116,105,116,101,109,95,95,176,4,0,0, + 115,4,0,0,0,12,1,255,128,122,26,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,103,101,116,105, + 116,101,109,95,95,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,14, + 0,0,0,124,2,124,0,106,0,124,1,60,0,100,0,83, + 0,114,114,0,0,0,41,1,114,20,1,0,0,41,3,114, + 123,0,0,0,114,32,1,0,0,114,52,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, + 95,115,101,116,105,116,101,109,95,95,179,4,0,0,115,4, + 0,0,0,14,1,255,128,122,26,95,78,97,109,101,115,112, + 97,99,101,80,97,116,104,46,95,95,115,101,116,105,116,101, + 109,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, + 0,116,0,124,0,160,1,161,0,131,1,83,0,114,114,0, + 0,0,41,2,114,4,0,0,0,114,28,1,0,0,114,253, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,7,95,95,108,101,110,95,95,182,4,0,0,115, + 4,0,0,0,12,1,255,128,122,22,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,0,0,0,0,1,0,0, + 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, + 160,0,124,0,106,1,161,1,83,0,41,2,78,122,20,95, + 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, + 114,125,41,41,2,114,70,0,0,0,114,20,1,0,0,114, + 253,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,8,95,95,114,101,112,114,95,95,185,4,0, + 0,115,4,0,0,0,12,1,255,128,122,23,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,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, + 0,124,1,124,0,160,0,161,0,118,0,83,0,114,114,0, + 0,0,114,31,1,0,0,169,2,114,123,0,0,0,218,4, + 105,116,101,109,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, + 95,188,4,0,0,115,4,0,0,0,12,1,255,128,122,27, + 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,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124, + 1,161,1,1,0,100,0,83,0,114,114,0,0,0,41,2, + 114,20,1,0,0,114,190,0,0,0,114,37,1,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,190, + 0,0,0,191,4,0,0,115,4,0,0,0,16,1,255,128, + 122,21,95,78,97,109,101,115,112,97,99,101,80,97,116,104, + 46,97,112,112,101,110,100,78,41,15,114,130,0,0,0,114, + 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,216, + 0,0,0,114,26,1,0,0,114,21,1,0,0,114,28,1, + 0,0,114,30,1,0,0,114,33,1,0,0,114,34,1,0, + 0,114,35,1,0,0,114,36,1,0,0,114,39,1,0,0, + 114,190,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,18,1,0,0,133,4, + 0,0,115,28,0,0,0,8,0,4,1,8,6,8,6,8, + 10,8,4,8,13,8,3,8,3,8,3,8,3,8,3,12, + 3,255,128,114,18,1,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, + 0,115,80,0,0,0,101,0,90,1,100,0,90,2,100,1, + 100,2,132,0,90,3,101,4,100,3,100,4,132,0,131,1, + 90,5,100,5,100,6,132,0,90,6,100,7,100,8,132,0, + 90,7,100,9,100,10,132,0,90,8,100,11,100,12,132,0, + 90,9,100,13,100,14,132,0,90,10,100,15,100,16,132,0, + 90,11,100,17,83,0,41,18,218,16,95,78,97,109,101,115, + 112,97,99,101,76,111,97,100,101,114,99,4,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, + 0,0,0,115,18,0,0,0,116,0,124,1,124,2,124,3, + 131,3,124,0,95,1,100,0,83,0,114,114,0,0,0,41, + 2,114,18,1,0,0,114,20,1,0,0,114,24,1,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 216,0,0,0,197,4,0,0,115,4,0,0,0,18,1,255, + 128,122,25,95,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,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, + 106,1,161,1,83,0,41,3,122,115,82,101,116,117,114,110, + 32,114,101,112,114,32,102,111,114,32,116,104,101,32,109,111, + 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,101,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,32,84,104,101,32,105,109, + 112,111,114,116,32,109,97,99,104,105,110,101,114,121,32,100, + 111,101,115,32,116,104,101,32,106,111,98,32,105,116,115,101, + 108,102,46,10,10,32,32,32,32,32,32,32,32,122,25,60, + 109,111,100,117,108,101,32,123,33,114,125,32,40,110,97,109, + 101,115,112,97,99,101,41,62,78,41,2,114,70,0,0,0, + 114,130,0,0,0,41,1,114,223,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,11,109,111,100, + 117,108,101,95,114,101,112,114,200,4,0,0,115,4,0,0, + 0,12,7,255,128,122,28,95,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,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,78,84,114,7,0,0,0,114,226, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,186,0,0,0,209,4,0,0,115,4,0,0,0, + 4,1,255,128,122,27,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,78,114,10,0,0,0,114,7,0,0,0, 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,186,0,0,0,209,4,0,0,115,4,0, + 8,0,0,0,114,236,0,0,0,212,4,0,0,115,4,0, 0,0,4,1,255,128,122,27,95,78,97,109,101,115,112,97, - 99,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,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,78,114,10,0,0,0,114,7,0, - 0,0,114,226,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,236,0,0,0,212,4,0,0,115, - 4,0,0,0,4,1,255,128,122,27,95,78,97,109,101,115, - 112,97,99,101,76,111,97,100,101,114,46,103,101,116,95,115, - 111,117,114,99,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,6,0,0,0,67,0,0,0,115,16, - 0,0,0,116,0,100,1,100,2,100,3,100,4,100,5,141, - 4,83,0,41,6,78,114,10,0,0,0,122,8,60,115,116, - 114,105,110,103,62,114,222,0,0,0,84,41,1,114,238,0, - 0,0,41,1,114,239,0,0,0,114,226,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,220,0, - 0,0,215,4,0,0,115,4,0,0,0,16,1,255,128,122, - 25,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, - 114,46,103,101,116,95,99,111,100,101,99,2,0,0,0,0, + 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117, + 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,6,0,0,0,67,0,0,0,115,16,0,0, + 0,116,0,100,1,100,2,100,3,100,4,100,5,141,4,83, + 0,41,6,78,114,10,0,0,0,122,8,60,115,116,114,105, + 110,103,62,114,222,0,0,0,84,41,1,114,238,0,0,0, + 41,1,114,239,0,0,0,114,226,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,220,0,0,0, + 215,4,0,0,115,4,0,0,0,16,1,255,128,122,25,95, + 78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,114,217,0,0,0,114, + 7,0,0,0,114,218,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,219,0,0,0,218,4,0, + 0,115,4,0,0,0,4,0,255,128,122,30,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, + 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,114,217,0,0, - 0,114,7,0,0,0,114,218,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,219,0,0,0,218, - 4,0,0,115,4,0,0,0,4,0,255,128,122,30,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,99, - 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,114, - 0,0,0,114,7,0,0,0,114,13,1,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,224,0,0, - 0,221,4,0,0,115,4,0,0,0,4,1,255,128,122,28, - 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, - 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,26,0,0,0,116,0,160,1,100,1, - 124,0,106,2,161,2,1,0,116,0,160,3,124,0,124,1, - 161,2,83,0,41,3,122,98,76,111,97,100,32,97,32,110, - 97,109,101,115,112,97,99,101,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, - 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,109, - 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,46, - 10,10,32,32,32,32,32,32,32,32,122,38,110,97,109,101, - 115,112,97,99,101,32,109,111,100,117,108,101,32,108,111,97, - 100,101,100,32,119,105,116,104,32,112,97,116,104,32,123,33, - 114,125,78,41,4,114,139,0,0,0,114,153,0,0,0,114, - 20,1,0,0,114,225,0,0,0,114,226,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,227,0, - 0,0,224,4,0,0,115,10,0,0,0,6,7,4,1,4, - 255,12,3,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0, - 114,131,0,0,0,114,216,0,0,0,114,213,0,0,0,114, - 41,1,0,0,114,186,0,0,0,114,236,0,0,0,114,220, - 0,0,0,114,219,0,0,0,114,224,0,0,0,114,227,0, + 0,0,0,115,4,0,0,0,100,0,83,0,114,114,0,0, + 0,114,7,0,0,0,114,13,1,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,224,0,0,0,221, + 4,0,0,115,4,0,0,0,4,1,255,128,122,28,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, + 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, + 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, + 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, + 83,0,41,3,122,98,76,111,97,100,32,97,32,110,97,109, + 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, + 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, + 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, + 78,41,4,114,139,0,0,0,114,153,0,0,0,114,20,1, + 0,0,114,225,0,0,0,114,226,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,227,0,0,0, + 224,4,0,0,115,10,0,0,0,6,7,4,1,4,255,12, + 3,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0,114,131, + 0,0,0,114,216,0,0,0,114,213,0,0,0,114,41,1, + 0,0,114,186,0,0,0,114,236,0,0,0,114,220,0,0, + 0,114,219,0,0,0,114,224,0,0,0,114,227,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,40,1,0,0,196,4,0,0,115,22,0, + 0,0,8,0,8,1,2,3,10,1,8,8,8,3,8,3, + 8,3,8,3,12,3,255,128,114,40,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,64,0,0,0,115,118,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,101,4,100,2,100,3,132,0,131, + 1,90,5,101,4,100,4,100,5,132,0,131,1,90,6,101, + 7,100,6,100,7,132,0,131,1,90,8,101,7,100,8,100, + 9,132,0,131,1,90,9,101,7,100,19,100,11,100,12,132, + 1,131,1,90,10,101,7,100,20,100,13,100,14,132,1,131, + 1,90,11,101,7,100,21,100,15,100,16,132,1,131,1,90, + 12,101,4,100,17,100,18,132,0,131,1,90,13,100,10,83, + 0,41,22,218,10,80,97,116,104,70,105,110,100,101,114,122, + 62,77,101,116,97,32,112,97,116,104,32,102,105,110,100,101, + 114,32,102,111,114,32,115,121,115,46,112,97,116,104,32,97, + 110,100,32,112,97,99,107,97,103,101,32,95,95,112,97,116, + 104,95,95,32,97,116,116,114,105,98,117,116,101,115,46,99, + 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,116, + 1,106,2,160,3,161,0,131,1,68,0,93,44,92,2,125, + 0,125,1,124,1,100,1,117,0,114,40,116,1,106,2,124, + 0,61,0,113,14,116,4,124,1,100,2,131,2,114,14,124, + 1,160,5,161,0,1,0,113,14,100,1,83,0,41,3,122, + 125,67,97,108,108,32,116,104,101,32,105,110,118,97,108,105, + 100,97,116,101,95,99,97,99,104,101,115,40,41,32,109,101, + 116,104,111,100,32,111,110,32,97,108,108,32,112,97,116,104, + 32,101,110,116,114,121,32,102,105,110,100,101,114,115,10,32, + 32,32,32,32,32,32,32,115,116,111,114,101,100,32,105,110, + 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, + 101,114,95,99,97,99,104,101,115,32,40,119,104,101,114,101, + 32,105,109,112,108,101,109,101,110,116,101,100,41,46,78,218, + 17,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104, + 101,115,41,6,218,4,108,105,115,116,114,15,0,0,0,218, + 19,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, + 97,99,104,101,218,5,105,116,101,109,115,114,133,0,0,0, + 114,43,1,0,0,41,2,114,121,0,0,0,218,6,102,105, + 110,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,43,1,0,0,243,4,0,0,115,16,0,0, + 0,22,4,8,1,10,1,10,1,8,1,2,128,4,252,255, + 128,122,28,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, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 9,0,0,0,67,0,0,0,115,76,0,0,0,116,0,106, + 1,100,1,117,1,114,28,116,0,106,1,115,28,116,2,160, + 3,100,2,116,4,161,2,1,0,116,0,106,1,68,0,93, + 36,125,1,122,14,124,1,124,0,131,1,87,0,2,0,1, + 0,83,0,4,0,116,5,121,70,1,0,1,0,1,0,89, + 0,113,34,48,0,100,1,83,0,41,3,122,46,83,101,97, + 114,99,104,32,115,121,115,46,112,97,116,104,95,104,111,111, + 107,115,32,102,111,114,32,97,32,102,105,110,100,101,114,32, + 102,111,114,32,39,112,97,116,104,39,46,78,122,23,115,121, + 115,46,112,97,116,104,95,104,111,111,107,115,32,105,115,32, + 101,109,112,116,121,41,6,114,15,0,0,0,218,10,112,97, + 116,104,95,104,111,111,107,115,114,81,0,0,0,114,82,0, + 0,0,114,142,0,0,0,114,122,0,0,0,41,2,114,52, + 0,0,0,90,4,104,111,111,107,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, + 104,111,111,107,115,253,4,0,0,115,18,0,0,0,16,3, + 12,1,10,1,2,1,14,1,12,1,6,1,4,2,255,128, + 122,22,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,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, + 0,115,100,0,0,0,124,1,100,1,107,2,114,42,122,12, + 116,0,160,1,161,0,125,1,87,0,110,20,4,0,116,2, + 121,40,1,0,1,0,1,0,89,0,100,2,83,0,48,0, + 122,16,116,3,106,4,124,1,25,0,125,2,87,0,124,2, + 83,0,4,0,116,5,121,98,1,0,1,0,1,0,124,0, + 160,6,124,1,161,1,125,2,124,2,116,3,106,4,124,1, + 60,0,89,0,124,2,83,0,48,0,41,3,122,210,71,101, + 116,32,116,104,101,32,102,105,110,100,101,114,32,102,111,114, + 32,116,104,101,32,112,97,116,104,32,101,110,116,114,121,32, + 102,114,111,109,32,115,121,115,46,112,97,116,104,95,105,109, + 112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,32, + 32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,97, + 116,104,32,101,110,116,114,121,32,105,115,32,110,111,116,32, + 105,110,32,116,104,101,32,99,97,99,104,101,44,32,102,105, + 110,100,32,116,104,101,32,97,112,112,114,111,112,114,105,97, + 116,101,32,102,105,110,100,101,114,10,32,32,32,32,32,32, + 32,32,97,110,100,32,99,97,99,104,101,32,105,116,46,32, + 73,102,32,110,111,32,102,105,110,100,101,114,32,105,115,32, + 97,118,97,105,108,97,98,108,101,44,32,115,116,111,114,101, + 32,78,111,110,101,46,10,10,32,32,32,32,32,32,32,32, + 114,10,0,0,0,78,41,7,114,18,0,0,0,114,63,0, + 0,0,218,17,70,105,108,101,78,111,116,70,111,117,110,100, + 69,114,114,111,114,114,15,0,0,0,114,45,1,0,0,218, + 8,75,101,121,69,114,114,111,114,114,49,1,0,0,41,3, + 114,202,0,0,0,114,52,0,0,0,114,47,1,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,20, + 95,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, + 97,99,104,101,10,5,0,0,115,28,0,0,0,8,8,2, + 1,12,1,12,1,8,3,2,1,12,1,4,4,12,253,10, + 1,12,1,4,1,2,255,255,128,122,31,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,99,97,99,104,101,99,3,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67, + 0,0,0,115,82,0,0,0,116,0,124,2,100,1,131,2, + 114,26,124,2,160,1,124,1,161,1,92,2,125,3,125,4, + 110,14,124,2,160,2,124,1,161,1,125,3,103,0,125,4, + 124,3,100,0,117,1,114,60,116,3,160,4,124,1,124,3, + 161,2,83,0,116,3,160,5,124,1,100,0,161,2,125,5, + 124,4,124,5,95,6,124,5,83,0,41,2,78,114,141,0, + 0,0,41,7,114,133,0,0,0,114,141,0,0,0,114,210, + 0,0,0,114,139,0,0,0,114,205,0,0,0,114,187,0, + 0,0,114,182,0,0,0,41,6,114,202,0,0,0,114,143, + 0,0,0,114,47,1,0,0,114,144,0,0,0,114,145,0, + 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,16,95,108,101,103,97,99,121,95, + 103,101,116,95,115,112,101,99,32,5,0,0,115,20,0,0, + 0,10,4,16,1,10,2,4,1,8,1,12,1,12,1,6, + 1,4,1,255,128,122,27,80,97,116,104,70,105,110,100,101, + 114,46,95,108,101,103,97,99,121,95,103,101,116,95,115,112, + 101,99,78,99,4,0,0,0,0,0,0,0,0,0,0,0, + 9,0,0,0,5,0,0,0,67,0,0,0,115,166,0,0, + 0,103,0,125,4,124,2,68,0,93,134,125,5,116,0,124, + 5,116,1,116,2,102,2,131,2,115,28,113,8,124,0,160, + 3,124,5,161,1,125,6,124,6,100,1,117,1,114,8,116, + 4,124,6,100,2,131,2,114,70,124,6,160,5,124,1,124, + 3,161,2,125,7,110,12,124,0,160,6,124,1,124,6,161, + 2,125,7,124,7,100,1,117,0,114,92,113,8,124,7,106, + 7,100,1,117,1,114,110,124,7,2,0,1,0,83,0,124, + 7,106,8,125,8,124,8,100,1,117,0,114,132,116,9,100, + 3,131,1,130,1,124,4,160,10,124,8,161,1,1,0,113, + 8,116,11,160,12,124,1,100,1,161,2,125,7,124,4,124, + 7,95,8,124,7,83,0,41,4,122,63,70,105,110,100,32, + 116,104,101,32,108,111,97,100,101,114,32,111,114,32,110,97, + 109,101,115,112,97,99,101,95,112,97,116,104,32,102,111,114, + 32,116,104,105,115,32,109,111,100,117,108,101,47,112,97,99, + 107,97,103,101,32,110,97,109,101,46,78,114,207,0,0,0, + 122,19,115,112,101,99,32,109,105,115,115,105,110,103,32,108, + 111,97,100,101,114,41,13,114,165,0,0,0,114,90,0,0, + 0,218,5,98,121,116,101,115,114,52,1,0,0,114,133,0, + 0,0,114,207,0,0,0,114,53,1,0,0,114,144,0,0, + 0,114,182,0,0,0,114,122,0,0,0,114,171,0,0,0, + 114,139,0,0,0,114,187,0,0,0,41,9,114,202,0,0, + 0,114,143,0,0,0,114,52,0,0,0,114,206,0,0,0, + 218,14,110,97,109,101,115,112,97,99,101,95,112,97,116,104, + 90,5,101,110,116,114,121,114,47,1,0,0,114,191,0,0, + 0,114,145,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,9,95,103,101,116,95,115,112,101,99, + 47,5,0,0,115,44,0,0,0,4,5,8,1,14,1,2, + 1,10,1,8,1,10,1,14,1,12,2,8,1,2,1,10, + 1,8,1,6,1,8,1,8,1,10,5,2,128,12,2,6, + 1,4,1,255,128,122,20,80,97,116,104,70,105,110,100,101, + 114,46,95,103,101,116,95,115,112,101,99,99,4,0,0,0, + 0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0, + 67,0,0,0,115,94,0,0,0,124,2,100,1,117,0,114, + 14,116,0,106,1,125,2,124,0,160,2,124,1,124,2,124, + 3,161,3,125,4,124,4,100,1,117,0,114,40,100,1,83, + 0,124,4,106,3,100,1,117,0,114,90,124,4,106,4,125, + 5,124,5,114,86,100,1,124,4,95,5,116,6,124,1,124, + 5,124,0,106,2,131,3,124,4,95,4,124,4,83,0,100, + 1,83,0,124,4,83,0,41,2,122,141,84,114,121,32,116, + 111,32,102,105,110,100,32,97,32,115,112,101,99,32,102,111, + 114,32,39,102,117,108,108,110,97,109,101,39,32,111,110,32, + 115,121,115,46,112,97,116,104,32,111,114,32,39,112,97,116, + 104,39,46,10,10,32,32,32,32,32,32,32,32,84,104,101, + 32,115,101,97,114,99,104,32,105,115,32,98,97,115,101,100, + 32,111,110,32,115,121,115,46,112,97,116,104,95,104,111,111, + 107,115,32,97,110,100,32,115,121,115,46,112,97,116,104,95, + 105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,10, + 32,32,32,32,32,32,32,32,78,41,7,114,15,0,0,0, + 114,52,0,0,0,114,56,1,0,0,114,144,0,0,0,114, + 182,0,0,0,114,185,0,0,0,114,18,1,0,0,41,6, + 114,202,0,0,0,114,143,0,0,0,114,52,0,0,0,114, + 206,0,0,0,114,191,0,0,0,114,55,1,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,207,0, + 0,0,79,5,0,0,115,28,0,0,0,8,6,6,1,14, + 1,8,1,4,1,10,1,6,1,4,1,6,3,16,1,4, + 1,4,2,4,2,255,128,122,20,80,97,116,104,70,105,110, + 100,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, + 0,0,67,0,0,0,115,30,0,0,0,124,0,160,0,124, + 1,124,2,161,2,125,3,124,3,100,1,117,0,114,24,100, + 1,83,0,124,3,106,1,83,0,41,2,122,170,102,105,110, + 100,32,116,104,101,32,109,111,100,117,108,101,32,111,110,32, + 115,121,115,46,112,97,116,104,32,111,114,32,39,112,97,116, + 104,39,32,98,97,115,101,100,32,111,110,32,115,121,115,46, + 112,97,116,104,95,104,111,111,107,115,32,97,110,100,10,32, + 32,32,32,32,32,32,32,115,121,115,46,112,97,116,104,95, + 105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,10, + 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,32,32,85,115,101,32,102,105,110,100,95,115,112, + 101,99,40,41,32,105,110,115,116,101,97,100,46,10,10,32, + 32,32,32,32,32,32,32,78,114,208,0,0,0,114,209,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,210,0,0,0,103,5,0,0,115,10,0,0,0,12, + 8,8,1,4,1,6,1,255,128,122,22,80,97,116,104,70, + 105,110,100,101,114,46,102,105,110,100,95,109,111,100,117,108, + 101,99,0,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,4,0,0,0,79,0,0,0,115,28,0,0,0,100, + 1,100,2,108,0,109,1,125,2,1,0,124,2,106,2,124, + 0,105,0,124,1,164,1,142,1,83,0,41,4,97,32,1, + 0,0,10,32,32,32,32,32,32,32,32,70,105,110,100,32, + 100,105,115,116,114,105,98,117,116,105,111,110,115,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,97, + 110,32,105,116,101,114,97,98,108,101,32,111,102,32,97,108, + 108,32,68,105,115,116,114,105,98,117,116,105,111,110,32,105, + 110,115,116,97,110,99,101,115,32,99,97,112,97,98,108,101, + 32,111,102,10,32,32,32,32,32,32,32,32,108,111,97,100, + 105,110,103,32,116,104,101,32,109,101,116,97,100,97,116,97, + 32,102,111,114,32,112,97,99,107,97,103,101,115,32,109,97, + 116,99,104,105,110,103,32,96,96,99,111,110,116,101,120,116, + 46,110,97,109,101,96,96,10,32,32,32,32,32,32,32,32, + 40,111,114,32,97,108,108,32,110,97,109,101,115,32,105,102, + 32,96,96,78,111,110,101,96,96,32,105,110,100,105,99,97, + 116,101,100,41,32,97,108,111,110,103,32,116,104,101,32,112, + 97,116,104,115,32,105,110,32,116,104,101,32,108,105,115,116, + 10,32,32,32,32,32,32,32,32,111,102,32,100,105,114,101, + 99,116,111,114,105,101,115,32,96,96,99,111,110,116,101,120, + 116,46,112,97,116,104,96,96,46,10,32,32,32,32,32,32, + 32,32,114,0,0,0,0,41,1,218,18,77,101,116,97,100, + 97,116,97,80,97,116,104,70,105,110,100,101,114,78,41,3, + 90,18,105,109,112,111,114,116,108,105,98,46,109,101,116,97, + 100,97,116,97,114,57,1,0,0,218,18,102,105,110,100,95, + 100,105,115,116,114,105,98,117,116,105,111,110,115,41,3,114, + 124,0,0,0,114,125,0,0,0,114,57,1,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,58,1, + 0,0,116,5,0,0,115,6,0,0,0,12,10,16,1,255, + 128,122,29,80,97,116,104,70,105,110,100,101,114,46,102,105, + 110,100,95,100,105,115,116,114,105,98,117,116,105,111,110,115, + 41,1,78,41,2,78,78,41,1,78,41,14,114,130,0,0, + 0,114,129,0,0,0,114,131,0,0,0,114,132,0,0,0, + 114,213,0,0,0,114,43,1,0,0,114,49,1,0,0,114, + 214,0,0,0,114,52,1,0,0,114,53,1,0,0,114,56, + 1,0,0,114,207,0,0,0,114,210,0,0,0,114,58,1, 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,40,1,0,0,196,4,0,0,115, - 22,0,0,0,8,0,8,1,2,3,10,1,8,8,8,3, - 8,3,8,3,8,3,12,3,255,128,114,40,1,0,0,99, + 0,114,8,0,0,0,114,42,1,0,0,239,4,0,0,115, + 38,0,0,0,8,0,4,2,2,2,10,1,2,9,10,1, + 2,12,10,1,2,21,10,1,2,14,12,1,2,31,12,1, + 2,23,12,1,2,12,14,1,255,128,114,42,1,0,0,99, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,64,0,0,0,115,118,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,101,4,100,2,100,3,132, - 0,131,1,90,5,101,4,100,4,100,5,132,0,131,1,90, - 6,101,7,100,6,100,7,132,0,131,1,90,8,101,7,100, - 8,100,9,132,0,131,1,90,9,101,7,100,19,100,11,100, - 12,132,1,131,1,90,10,101,7,100,20,100,13,100,14,132, - 1,131,1,90,11,101,7,100,21,100,15,100,16,132,1,131, - 1,90,12,101,4,100,17,100,18,132,0,131,1,90,13,100, - 10,83,0,41,22,218,10,80,97,116,104,70,105,110,100,101, - 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, - 100,101,114,32,102,111,114,32,115,121,115,46,112,97,116,104, - 32,97,110,100,32,112,97,99,107,97,103,101,32,95,95,112, - 97,116,104,95,95,32,97,116,116,114,105,98,117,116,101,115, - 46,99,0,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116, - 0,116,1,106,2,160,3,161,0,131,1,68,0,93,44,92, - 2,125,0,125,1,124,1,100,1,117,0,114,40,116,1,106, - 2,124,0,61,0,113,14,116,4,124,1,100,2,131,2,114, - 14,124,1,160,5,161,0,1,0,113,14,100,1,83,0,41, - 3,122,125,67,97,108,108,32,116,104,101,32,105,110,118,97, - 108,105,100,97,116,101,95,99,97,99,104,101,115,40,41,32, - 109,101,116,104,111,100,32,111,110,32,97,108,108,32,112,97, - 116,104,32,101,110,116,114,121,32,102,105,110,100,101,114,115, - 10,32,32,32,32,32,32,32,32,115,116,111,114,101,100,32, - 105,110,32,115,121,115,46,112,97,116,104,95,105,109,112,111, - 114,116,101,114,95,99,97,99,104,101,115,32,40,119,104,101, - 114,101,32,105,109,112,108,101,109,101,110,116,101,100,41,46, - 78,218,17,105,110,118,97,108,105,100,97,116,101,95,99,97, - 99,104,101,115,41,6,218,4,108,105,115,116,114,15,0,0, - 0,218,19,112,97,116,104,95,105,109,112,111,114,116,101,114, - 95,99,97,99,104,101,218,5,105,116,101,109,115,114,133,0, - 0,0,114,43,1,0,0,41,2,114,121,0,0,0,218,6, - 102,105,110,100,101,114,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,43,1,0,0,243,4,0,0,115,16, - 0,0,0,22,4,8,1,10,1,10,1,8,1,2,128,4, - 252,255,128,122,28,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,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,9,0,0,0,67,0,0,0,115,76,0,0,0,116, - 0,106,1,100,1,117,1,114,28,116,0,106,1,115,28,116, - 2,160,3,100,2,116,4,161,2,1,0,116,0,106,1,68, - 0,93,36,125,1,122,14,124,1,124,0,131,1,87,0,2, - 0,1,0,83,0,4,0,116,5,121,70,1,0,1,0,1, - 0,89,0,113,34,48,0,100,1,83,0,41,3,122,46,83, - 101,97,114,99,104,32,115,121,115,46,112,97,116,104,95,104, - 111,111,107,115,32,102,111,114,32,97,32,102,105,110,100,101, - 114,32,102,111,114,32,39,112,97,116,104,39,46,78,122,23, - 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,105, - 115,32,101,109,112,116,121,41,6,114,15,0,0,0,218,10, - 112,97,116,104,95,104,111,111,107,115,114,81,0,0,0,114, - 82,0,0,0,114,142,0,0,0,114,122,0,0,0,41,2, - 114,52,0,0,0,90,4,104,111,111,107,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,11,95,112,97,116, - 104,95,104,111,111,107,115,253,4,0,0,115,18,0,0,0, - 16,3,12,1,10,1,2,1,14,1,12,1,6,1,4,2, - 255,128,122,22,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,0,0,0,0,3,0,0,0,8,0,0,0,67, - 0,0,0,115,100,0,0,0,124,1,100,1,107,2,114,42, - 122,12,116,0,160,1,161,0,125,1,87,0,110,20,4,0, - 116,2,121,40,1,0,1,0,1,0,89,0,100,2,83,0, - 48,0,122,16,116,3,106,4,124,1,25,0,125,2,87,0, - 124,2,83,0,4,0,116,5,121,98,1,0,1,0,1,0, - 124,0,160,6,124,1,161,1,125,2,124,2,116,3,106,4, - 124,1,60,0,89,0,124,2,83,0,48,0,41,3,122,210, - 71,101,116,32,116,104,101,32,102,105,110,100,101,114,32,102, - 111,114,32,116,104,101,32,112,97,116,104,32,101,110,116,114, - 121,32,102,114,111,109,32,115,121,115,46,112,97,116,104,95, - 105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,10, - 10,32,32,32,32,32,32,32,32,73,102,32,116,104,101,32, - 112,97,116,104,32,101,110,116,114,121,32,105,115,32,110,111, - 116,32,105,110,32,116,104,101,32,99,97,99,104,101,44,32, - 102,105,110,100,32,116,104,101,32,97,112,112,114,111,112,114, - 105,97,116,101,32,102,105,110,100,101,114,10,32,32,32,32, - 32,32,32,32,97,110,100,32,99,97,99,104,101,32,105,116, - 46,32,73,102,32,110,111,32,102,105,110,100,101,114,32,105, - 115,32,97,118,97,105,108,97,98,108,101,44,32,115,116,111, - 114,101,32,78,111,110,101,46,10,10,32,32,32,32,32,32, - 32,32,114,10,0,0,0,78,41,7,114,18,0,0,0,114, - 63,0,0,0,218,17,70,105,108,101,78,111,116,70,111,117, - 110,100,69,114,114,111,114,114,15,0,0,0,114,45,1,0, - 0,218,8,75,101,121,69,114,114,111,114,114,49,1,0,0, - 41,3,114,202,0,0,0,114,52,0,0,0,114,47,1,0, + 3,0,0,0,64,0,0,0,115,90,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, + 4,100,4,100,5,132,0,90,5,101,6,90,7,100,6,100, + 7,132,0,90,8,100,8,100,9,132,0,90,9,100,19,100, + 11,100,12,132,1,90,10,100,13,100,14,132,0,90,11,101, + 12,100,15,100,16,132,0,131,1,90,13,100,17,100,18,132, + 0,90,14,100,10,83,0,41,20,218,10,70,105,108,101,70, + 105,110,100,101,114,122,172,70,105,108,101,45,98,97,115,101, + 100,32,102,105,110,100,101,114,46,10,10,32,32,32,32,73, + 110,116,101,114,97,99,116,105,111,110,115,32,119,105,116,104, + 32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109, + 32,97,114,101,32,99,97,99,104,101,100,32,102,111,114,32, + 112,101,114,102,111,114,109,97,110,99,101,44,32,98,101,105, + 110,103,10,32,32,32,32,114,101,102,114,101,115,104,101,100, + 32,119,104,101,110,32,116,104,101,32,100,105,114,101,99,116, + 111,114,121,32,116,104,101,32,102,105,110,100,101,114,32,105, + 115,32,104,97,110,100,108,105,110,103,32,104,97,115,32,98, + 101,101,110,32,109,111,100,105,102,105,101,100,46,10,10,32, + 32,32,32,99,2,0,0,0,0,0,0,0,0,0,0,0, + 5,0,0,0,6,0,0,0,7,0,0,0,115,84,0,0, + 0,103,0,125,3,124,2,68,0,93,32,92,2,137,0,125, + 4,124,3,160,0,135,0,102,1,100,1,100,2,132,8,124, + 4,68,0,131,1,161,1,1,0,113,8,124,3,124,0,95, + 1,124,1,112,54,100,3,124,0,95,2,100,4,124,0,95, + 3,116,4,131,0,124,0,95,5,116,4,131,0,124,0,95, + 6,100,5,83,0,41,6,122,154,73,110,105,116,105,97,108, + 105,122,101,32,119,105,116,104,32,116,104,101,32,112,97,116, + 104,32,116,111,32,115,101,97,114,99,104,32,111,110,32,97, + 110,100,32,97,32,118,97,114,105,97,98,108,101,32,110,117, + 109,98,101,114,32,111,102,10,32,32,32,32,32,32,32,32, + 50,45,116,117,112,108,101,115,32,99,111,110,116,97,105,110, + 105,110,103,32,116,104,101,32,108,111,97,100,101,114,32,97, + 110,100,32,116,104,101,32,102,105,108,101,32,115,117,102,102, + 105,120,101,115,32,116,104,101,32,108,111,97,100,101,114,10, + 32,32,32,32,32,32,32,32,114,101,99,111,103,110,105,122, + 101,115,46,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,51,0,0,0,115,22,0,0, + 0,124,0,93,14,125,1,124,1,136,0,102,2,86,0,1, + 0,113,2,100,0,83,0,114,114,0,0,0,114,7,0,0, + 0,114,14,1,0,0,169,1,114,144,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,9,0,0,0,145,5,0,0, + 115,4,0,0,0,22,0,255,128,122,38,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,114,79,0,0,0,114,109,0,0,0,78,41,7,114,171, + 0,0,0,218,8,95,108,111,97,100,101,114,115,114,52,0, + 0,0,218,11,95,112,97,116,104,95,109,116,105,109,101,218, + 3,115,101,116,218,11,95,112,97,116,104,95,99,97,99,104, + 101,218,19,95,114,101,108,97,120,101,100,95,112,97,116,104, + 95,99,97,99,104,101,41,5,114,123,0,0,0,114,52,0, + 0,0,218,14,108,111,97,100,101,114,95,100,101,116,97,105, + 108,115,90,7,108,111,97,100,101,114,115,114,193,0,0,0, + 114,7,0,0,0,114,60,1,0,0,114,8,0,0,0,114, + 216,0,0,0,139,5,0,0,115,18,0,0,0,4,4,12, + 1,26,1,6,1,10,2,6,1,8,1,12,1,255,128,122, + 19,70,105,108,101,70,105,110,100,101,114,46,95,95,105,110, + 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,2,0,0,0,67,0,0,0,115,10,0, + 0,0,100,1,124,0,95,0,100,2,83,0,41,3,122,31, + 73,110,118,97,108,105,100,97,116,101,32,116,104,101,32,100, + 105,114,101,99,116,111,114,121,32,109,116,105,109,101,46,114, + 109,0,0,0,78,41,1,114,62,1,0,0,114,253,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,20,95,112,97,116,104,95,105,109,112,111,114,116,101,114, - 95,99,97,99,104,101,10,5,0,0,115,28,0,0,0,8, - 8,2,1,12,1,12,1,8,3,2,1,12,1,4,4,12, - 253,10,1,12,1,4,1,2,255,255,128,122,31,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,99,97,99,104,101,99,3,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, - 0,67,0,0,0,115,82,0,0,0,116,0,124,2,100,1, - 131,2,114,26,124,2,160,1,124,1,161,1,92,2,125,3, - 125,4,110,14,124,2,160,2,124,1,161,1,125,3,103,0, - 125,4,124,3,100,0,117,1,114,60,116,3,160,4,124,1, - 124,3,161,2,83,0,116,3,160,5,124,1,100,0,161,2, - 125,5,124,4,124,5,95,6,124,5,83,0,41,2,78,114, - 141,0,0,0,41,7,114,133,0,0,0,114,141,0,0,0, - 114,210,0,0,0,114,139,0,0,0,114,205,0,0,0,114, - 187,0,0,0,114,182,0,0,0,41,6,114,202,0,0,0, - 114,143,0,0,0,114,47,1,0,0,114,144,0,0,0,114, - 145,0,0,0,114,191,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,16,95,108,101,103,97,99, - 121,95,103,101,116,95,115,112,101,99,32,5,0,0,115,20, - 0,0,0,10,4,16,1,10,2,4,1,8,1,12,1,12, - 1,6,1,4,1,255,128,122,27,80,97,116,104,70,105,110, - 100,101,114,46,95,108,101,103,97,99,121,95,103,101,116,95, - 115,112,101,99,78,99,4,0,0,0,0,0,0,0,0,0, - 0,0,9,0,0,0,5,0,0,0,67,0,0,0,115,166, - 0,0,0,103,0,125,4,124,2,68,0,93,134,125,5,116, - 0,124,5,116,1,116,2,102,2,131,2,115,28,113,8,124, - 0,160,3,124,5,161,1,125,6,124,6,100,1,117,1,114, - 8,116,4,124,6,100,2,131,2,114,70,124,6,160,5,124, - 1,124,3,161,2,125,7,110,12,124,0,160,6,124,1,124, - 6,161,2,125,7,124,7,100,1,117,0,114,92,113,8,124, - 7,106,7,100,1,117,1,114,110,124,7,2,0,1,0,83, - 0,124,7,106,8,125,8,124,8,100,1,117,0,114,132,116, - 9,100,3,131,1,130,1,124,4,160,10,124,8,161,1,1, - 0,113,8,116,11,160,12,124,1,100,1,161,2,125,7,124, - 4,124,7,95,8,124,7,83,0,41,4,122,63,70,105,110, - 100,32,116,104,101,32,108,111,97,100,101,114,32,111,114,32, - 110,97,109,101,115,112,97,99,101,95,112,97,116,104,32,102, - 111,114,32,116,104,105,115,32,109,111,100,117,108,101,47,112, - 97,99,107,97,103,101,32,110,97,109,101,46,78,114,207,0, - 0,0,122,19,115,112,101,99,32,109,105,115,115,105,110,103, - 32,108,111,97,100,101,114,41,13,114,165,0,0,0,114,90, - 0,0,0,218,5,98,121,116,101,115,114,52,1,0,0,114, - 133,0,0,0,114,207,0,0,0,114,53,1,0,0,114,144, - 0,0,0,114,182,0,0,0,114,122,0,0,0,114,171,0, - 0,0,114,139,0,0,0,114,187,0,0,0,41,9,114,202, - 0,0,0,114,143,0,0,0,114,52,0,0,0,114,206,0, - 0,0,218,14,110,97,109,101,115,112,97,99,101,95,112,97, - 116,104,90,5,101,110,116,114,121,114,47,1,0,0,114,191, - 0,0,0,114,145,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,9,95,103,101,116,95,115,112, - 101,99,47,5,0,0,115,44,0,0,0,4,5,8,1,14, - 1,2,1,10,1,8,1,10,1,14,1,12,2,8,1,2, - 1,10,1,8,1,6,1,8,1,8,1,10,5,2,128,12, - 2,6,1,4,1,255,128,122,20,80,97,116,104,70,105,110, - 100,101,114,46,95,103,101,116,95,115,112,101,99,99,4,0, - 0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0, - 0,0,67,0,0,0,115,94,0,0,0,124,2,100,1,117, - 0,114,14,116,0,106,1,125,2,124,0,160,2,124,1,124, - 2,124,3,161,3,125,4,124,4,100,1,117,0,114,40,100, - 1,83,0,124,4,106,3,100,1,117,0,114,90,124,4,106, - 4,125,5,124,5,114,86,100,1,124,4,95,5,116,6,124, - 1,124,5,124,0,106,2,131,3,124,4,95,4,124,4,83, - 0,100,1,83,0,124,4,83,0,41,2,122,141,84,114,121, - 32,116,111,32,102,105,110,100,32,97,32,115,112,101,99,32, - 102,111,114,32,39,102,117,108,108,110,97,109,101,39,32,111, - 110,32,115,121,115,46,112,97,116,104,32,111,114,32,39,112, - 97,116,104,39,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,115,101,97,114,99,104,32,105,115,32,98,97,115, - 101,100,32,111,110,32,115,121,115,46,112,97,116,104,95,104, - 111,111,107,115,32,97,110,100,32,115,121,115,46,112,97,116, - 104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,101, - 46,10,32,32,32,32,32,32,32,32,78,41,7,114,15,0, - 0,0,114,52,0,0,0,114,56,1,0,0,114,144,0,0, - 0,114,182,0,0,0,114,185,0,0,0,114,18,1,0,0, - 41,6,114,202,0,0,0,114,143,0,0,0,114,52,0,0, - 0,114,206,0,0,0,114,191,0,0,0,114,55,1,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 207,0,0,0,79,5,0,0,115,28,0,0,0,8,6,6, - 1,14,1,8,1,4,1,10,1,6,1,4,1,6,3,16, - 1,4,1,4,2,4,2,255,128,122,20,80,97,116,104,70, - 105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,99, - 3,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 4,0,0,0,67,0,0,0,115,30,0,0,0,124,0,160, - 0,124,1,124,2,161,2,125,3,124,3,100,1,117,0,114, - 24,100,1,83,0,124,3,106,1,83,0,41,2,122,170,102, - 105,110,100,32,116,104,101,32,109,111,100,117,108,101,32,111, - 110,32,115,121,115,46,112,97,116,104,32,111,114,32,39,112, - 97,116,104,39,32,98,97,115,101,100,32,111,110,32,115,121, - 115,46,112,97,116,104,95,104,111,111,107,115,32,97,110,100, - 10,32,32,32,32,32,32,32,32,115,121,115,46,112,97,116, - 104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,101, - 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,85,115,101,32,102,105,110,100,95, - 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, - 10,32,32,32,32,32,32,32,32,78,114,208,0,0,0,114, - 209,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,210,0,0,0,103,5,0,0,115,10,0,0, - 0,12,8,8,1,4,1,6,1,255,128,122,22,80,97,116, - 104,70,105,110,100,101,114,46,102,105,110,100,95,109,111,100, - 117,108,101,99,0,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,4,0,0,0,79,0,0,0,115,28,0,0, - 0,100,1,100,2,108,0,109,1,125,2,1,0,124,2,106, - 2,124,0,105,0,124,1,164,1,142,1,83,0,41,4,97, - 32,1,0,0,10,32,32,32,32,32,32,32,32,70,105,110, - 100,32,100,105,115,116,114,105,98,117,116,105,111,110,115,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 32,97,110,32,105,116,101,114,97,98,108,101,32,111,102,32, - 97,108,108,32,68,105,115,116,114,105,98,117,116,105,111,110, - 32,105,110,115,116,97,110,99,101,115,32,99,97,112,97,98, - 108,101,32,111,102,10,32,32,32,32,32,32,32,32,108,111, - 97,100,105,110,103,32,116,104,101,32,109,101,116,97,100,97, - 116,97,32,102,111,114,32,112,97,99,107,97,103,101,115,32, - 109,97,116,99,104,105,110,103,32,96,96,99,111,110,116,101, - 120,116,46,110,97,109,101,96,96,10,32,32,32,32,32,32, - 32,32,40,111,114,32,97,108,108,32,110,97,109,101,115,32, - 105,102,32,96,96,78,111,110,101,96,96,32,105,110,100,105, - 99,97,116,101,100,41,32,97,108,111,110,103,32,116,104,101, - 32,112,97,116,104,115,32,105,110,32,116,104,101,32,108,105, - 115,116,10,32,32,32,32,32,32,32,32,111,102,32,100,105, - 114,101,99,116,111,114,105,101,115,32,96,96,99,111,110,116, - 101,120,116,46,112,97,116,104,96,96,46,10,32,32,32,32, - 32,32,32,32,114,0,0,0,0,41,1,218,18,77,101,116, - 97,100,97,116,97,80,97,116,104,70,105,110,100,101,114,78, - 41,3,90,18,105,109,112,111,114,116,108,105,98,46,109,101, - 116,97,100,97,116,97,114,57,1,0,0,218,18,102,105,110, - 100,95,100,105,115,116,114,105,98,117,116,105,111,110,115,41, - 3,114,124,0,0,0,114,125,0,0,0,114,57,1,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 58,1,0,0,116,5,0,0,115,6,0,0,0,12,10,16, - 1,255,128,122,29,80,97,116,104,70,105,110,100,101,114,46, - 102,105,110,100,95,100,105,115,116,114,105,98,117,116,105,111, - 110,115,41,1,78,41,2,78,78,41,1,78,41,14,114,130, - 0,0,0,114,129,0,0,0,114,131,0,0,0,114,132,0, - 0,0,114,213,0,0,0,114,43,1,0,0,114,49,1,0, - 0,114,214,0,0,0,114,52,1,0,0,114,53,1,0,0, - 114,56,1,0,0,114,207,0,0,0,114,210,0,0,0,114, - 58,1,0,0,114,7,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,42,1,0,0,239,4,0, - 0,115,38,0,0,0,8,0,4,2,2,2,10,1,2,9, - 10,1,2,12,10,1,2,21,10,1,2,14,12,1,2,31, - 12,1,2,23,12,1,2,12,14,1,255,128,114,42,1,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,64,0,0,0,115,90,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, - 0,90,4,100,4,100,5,132,0,90,5,101,6,90,7,100, - 6,100,7,132,0,90,8,100,8,100,9,132,0,90,9,100, - 19,100,11,100,12,132,1,90,10,100,13,100,14,132,0,90, - 11,101,12,100,15,100,16,132,0,131,1,90,13,100,17,100, - 18,132,0,90,14,100,10,83,0,41,20,218,10,70,105,108, - 101,70,105,110,100,101,114,122,172,70,105,108,101,45,98,97, - 115,101,100,32,102,105,110,100,101,114,46,10,10,32,32,32, - 32,73,110,116,101,114,97,99,116,105,111,110,115,32,119,105, - 116,104,32,116,104,101,32,102,105,108,101,32,115,121,115,116, - 101,109,32,97,114,101,32,99,97,99,104,101,100,32,102,111, - 114,32,112,101,114,102,111,114,109,97,110,99,101,44,32,98, - 101,105,110,103,10,32,32,32,32,114,101,102,114,101,115,104, - 101,100,32,119,104,101,110,32,116,104,101,32,100,105,114,101, - 99,116,111,114,121,32,116,104,101,32,102,105,110,100,101,114, - 32,105,115,32,104,97,110,100,108,105,110,103,32,104,97,115, - 32,98,101,101,110,32,109,111,100,105,102,105,101,100,46,10, - 10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,6,0,0,0,7,0,0,0,115,84, - 0,0,0,103,0,125,3,124,2,68,0,93,32,92,2,137, - 0,125,4,124,3,160,0,135,0,102,1,100,1,100,2,132, - 8,124,4,68,0,131,1,161,1,1,0,113,8,124,3,124, - 0,95,1,124,1,112,54,100,3,124,0,95,2,100,4,124, - 0,95,3,116,4,131,0,124,0,95,5,116,4,131,0,124, - 0,95,6,100,5,83,0,41,6,122,154,73,110,105,116,105, - 97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,112, - 97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,110, - 32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,32, - 110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,32, - 32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,97, - 105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,114, - 32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,117, - 102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,101, - 114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,110, - 105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,22, - 0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,86, - 0,1,0,113,2,100,0,83,0,114,114,0,0,0,114,7, - 0,0,0,114,14,1,0,0,169,1,114,144,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,9,0,0,0,145,5, - 0,0,115,4,0,0,0,22,0,255,128,122,38,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,114,79,0,0,0,114,109,0,0,0,78,41,7, - 114,171,0,0,0,218,8,95,108,111,97,100,101,114,115,114, - 52,0,0,0,218,11,95,112,97,116,104,95,109,116,105,109, - 101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,97, - 99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,97, - 116,104,95,99,97,99,104,101,41,5,114,123,0,0,0,114, - 52,0,0,0,218,14,108,111,97,100,101,114,95,100,101,116, - 97,105,108,115,90,7,108,111,97,100,101,114,115,114,193,0, - 0,0,114,7,0,0,0,114,60,1,0,0,114,8,0,0, - 0,114,216,0,0,0,139,5,0,0,115,18,0,0,0,4, - 4,12,1,26,1,6,1,10,2,6,1,8,1,12,1,255, - 128,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, - 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, - 10,0,0,0,100,1,124,0,95,0,100,2,83,0,41,3, - 122,31,73,110,118,97,108,105,100,97,116,101,32,116,104,101, - 32,100,105,114,101,99,116,111,114,121,32,109,116,105,109,101, - 46,114,109,0,0,0,78,41,1,114,62,1,0,0,114,253, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,43,1,0,0,153,5,0,0,115,4,0,0,0, - 10,2,255,128,122,28,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,0,0,0,0,0,0,0,0,3, - 0,0,0,3,0,0,0,67,0,0,0,115,42,0,0,0, - 124,0,160,0,124,1,161,1,125,2,124,2,100,1,117,0, - 114,26,100,1,103,0,102,2,83,0,124,2,106,1,124,2, - 106,2,112,38,103,0,102,2,83,0,41,2,122,197,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,44,32,111,114,32, - 116,104,101,32,110,97,109,101,115,112,97,99,101,10,32,32, - 32,32,32,32,32,32,112,97,99,107,97,103,101,32,112,111, - 114,116,105,111,110,115,46,32,82,101,116,117,114,110,115,32, - 40,108,111,97,100,101,114,44,32,108,105,115,116,45,111,102, - 45,112,111,114,116,105,111,110,115,41,46,10,10,32,32,32, - 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, - 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, - 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, - 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, - 32,32,32,78,41,3,114,207,0,0,0,114,144,0,0,0, - 114,182,0,0,0,41,3,114,123,0,0,0,114,143,0,0, - 0,114,191,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,141,0,0,0,159,5,0,0,115,10, - 0,0,0,10,7,8,1,8,1,16,1,255,128,122,22,70, - 105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,108, - 111,97,100,101,114,99,6,0,0,0,0,0,0,0,0,0, - 0,0,7,0,0,0,6,0,0,0,67,0,0,0,115,26, - 0,0,0,124,1,124,2,124,3,131,2,125,6,116,0,124, - 2,124,3,124,6,124,4,100,1,141,4,83,0,41,2,78, - 114,181,0,0,0,41,1,114,194,0,0,0,41,7,114,123, - 0,0,0,114,192,0,0,0,114,143,0,0,0,114,52,0, - 0,0,90,4,115,109,115,108,114,206,0,0,0,114,144,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,56,1,0,0,171,5,0,0,115,10,0,0,0,10, - 1,8,1,2,1,6,255,255,128,122,20,70,105,108,101,70, - 105,110,100,101,114,46,95,103,101,116,95,115,112,101,99,78, - 99,3,0,0,0,0,0,0,0,0,0,0,0,14,0,0, - 0,8,0,0,0,67,0,0,0,115,92,1,0,0,100,1, - 125,3,124,1,160,0,100,2,161,1,100,3,25,0,125,4, - 122,24,116,1,124,0,106,2,112,34,116,3,160,4,161,0, - 131,1,106,5,125,5,87,0,110,22,4,0,116,6,121,64, - 1,0,1,0,1,0,100,4,125,5,89,0,110,2,48,0, - 124,5,124,0,106,7,107,3,114,90,124,0,160,8,161,0, - 1,0,124,5,124,0,95,7,116,9,131,0,114,112,124,0, - 106,10,125,6,124,4,160,11,161,0,125,7,110,10,124,0, - 106,12,125,6,124,4,125,7,124,7,124,6,118,0,114,214, - 116,13,124,0,106,2,124,4,131,2,125,8,124,0,106,14, - 68,0,93,56,92,2,125,9,125,10,100,5,124,9,23,0, - 125,11,116,13,124,8,124,11,131,2,125,12,116,15,124,12, - 131,1,114,148,124,0,160,16,124,10,124,1,124,12,124,8, - 103,1,124,2,161,5,2,0,1,0,83,0,116,17,124,8, - 131,1,125,3,124,0,106,14,68,0,93,80,92,2,125,9, - 125,10,116,13,124,0,106,2,124,4,124,9,23,0,131,2, - 125,12,116,18,106,19,100,6,124,12,100,3,100,7,141,3, - 1,0,124,7,124,9,23,0,124,6,118,0,114,220,116,15, - 124,12,131,1,114,220,124,0,160,16,124,10,124,1,124,12, - 100,8,124,2,161,5,2,0,1,0,83,0,124,3,144,1, - 114,88,116,18,160,19,100,9,124,8,161,2,1,0,116,18, - 160,20,124,1,100,8,161,2,125,13,124,8,103,1,124,13, - 95,21,124,13,83,0,100,8,83,0,41,10,122,111,84,114, - 121,32,116,111,32,102,105,110,100,32,97,32,115,112,101,99, + 114,43,1,0,0,153,5,0,0,115,4,0,0,0,10,2, + 255,128,122,28,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,0,0,0,0,0,0,0,0,3,0,0, + 0,3,0,0,0,67,0,0,0,115,42,0,0,0,124,0, + 160,0,124,1,161,1,125,2,124,2,100,1,117,0,114,26, + 100,1,103,0,102,2,83,0,124,2,106,1,124,2,106,2, + 112,38,103,0,102,2,83,0,41,2,122,197,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,46,10,10,32,32,32,32, - 32,32,32,32,82,101,116,117,114,110,115,32,116,104,101,32, - 109,97,116,99,104,105,110,103,32,115,112,101,99,44,32,111, - 114,32,78,111,110,101,32,105,102,32,110,111,116,32,102,111, - 117,110,100,46,10,32,32,32,32,32,32,32,32,70,114,79, - 0,0,0,114,39,0,0,0,114,109,0,0,0,114,216,0, - 0,0,122,9,116,114,121,105,110,103,32,123,125,41,1,90, - 9,118,101,114,98,111,115,105,116,121,78,122,25,112,111,115, - 115,105,98,108,101,32,110,97,109,101,115,112,97,99,101,32, - 102,111,114,32,123,125,41,22,114,49,0,0,0,114,57,0, - 0,0,114,52,0,0,0,114,18,0,0,0,114,63,0,0, - 0,114,7,1,0,0,114,58,0,0,0,114,62,1,0,0, - 218,11,95,102,105,108,108,95,99,97,99,104,101,114,21,0, - 0,0,114,65,1,0,0,114,110,0,0,0,114,64,1,0, - 0,114,48,0,0,0,114,61,1,0,0,114,62,0,0,0, - 114,56,1,0,0,114,64,0,0,0,114,139,0,0,0,114, - 153,0,0,0,114,187,0,0,0,114,182,0,0,0,41,14, - 114,123,0,0,0,114,143,0,0,0,114,206,0,0,0,90, - 12,105,115,95,110,97,109,101,115,112,97,99,101,90,11,116, - 97,105,108,95,109,111,100,117,108,101,114,173,0,0,0,90, - 5,99,97,99,104,101,90,12,99,97,99,104,101,95,109,111, - 100,117,108,101,90,9,98,97,115,101,95,112,97,116,104,114, - 15,1,0,0,114,192,0,0,0,90,13,105,110,105,116,95, - 102,105,108,101,110,97,109,101,90,9,102,117,108,108,95,112, - 97,116,104,114,191,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,207,0,0,0,176,5,0,0, - 115,74,0,0,0,4,5,14,1,2,1,24,1,12,1,10, - 1,10,1,8,1,6,1,6,2,6,1,10,1,6,2,4, - 1,8,2,12,1,14,1,8,1,10,1,8,1,24,1,8, - 4,14,2,16,1,16,1,12,1,8,1,10,1,4,1,8, - 255,6,2,12,1,12,1,8,1,4,1,4,1,255,128,122, - 20,70,105,108,101,70,105,110,100,101,114,46,102,105,110,100, - 95,115,112,101,99,99,1,0,0,0,0,0,0,0,0,0, - 0,0,9,0,0,0,10,0,0,0,67,0,0,0,115,192, - 0,0,0,124,0,106,0,125,1,122,22,116,1,160,2,124, - 1,112,22,116,1,160,3,161,0,161,1,125,2,87,0,110, - 28,4,0,116,4,116,5,116,6,102,3,121,56,1,0,1, - 0,1,0,103,0,125,2,89,0,110,2,48,0,116,7,106, - 8,160,9,100,1,161,1,115,82,116,10,124,2,131,1,124, - 0,95,11,110,74,116,10,131,0,125,3,124,2,68,0,93, - 56,125,4,124,4,160,12,100,2,161,1,92,3,125,5,125, - 6,125,7,124,6,114,134,100,3,160,13,124,5,124,7,160, - 14,161,0,161,2,125,8,110,4,124,5,125,8,124,3,160, - 15,124,8,161,1,1,0,113,92,124,3,124,0,95,11,116, - 7,106,8,160,9,116,16,161,1,114,188,100,4,100,5,132, - 0,124,2,68,0,131,1,124,0,95,17,100,6,83,0,100, - 6,83,0,41,7,122,68,70,105,108,108,32,116,104,101,32, - 99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,105, - 97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,112, - 97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,115, - 32,100,105,114,101,99,116,111,114,121,46,114,14,0,0,0, - 114,79,0,0,0,114,69,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,83, - 0,0,0,115,20,0,0,0,104,0,124,0,93,12,125,1, - 124,1,160,0,161,0,146,2,113,4,83,0,114,7,0,0, - 0,41,1,114,110,0,0,0,41,2,114,5,0,0,0,90, - 2,102,110,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,13,0,0,0,253,5,0,0,115,4,0,0,0, - 20,0,255,128,122,41,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,115,101,116,99,111,109,112,62,78, - 41,18,114,52,0,0,0,114,18,0,0,0,90,7,108,105, - 115,116,100,105,114,114,63,0,0,0,114,50,1,0,0,218, - 15,80,101,114,109,105,115,115,105,111,110,69,114,114,111,114, - 218,18,78,111,116,65,68,105,114,101,99,116,111,114,121,69, - 114,114,111,114,114,15,0,0,0,114,22,0,0,0,114,23, - 0,0,0,114,63,1,0,0,114,64,1,0,0,114,105,0, - 0,0,114,70,0,0,0,114,110,0,0,0,218,3,97,100, - 100,114,24,0,0,0,114,65,1,0,0,41,9,114,123,0, - 0,0,114,52,0,0,0,90,8,99,111,110,116,101,110,116, - 115,90,21,108,111,119,101,114,95,115,117,102,102,105,120,95, - 99,111,110,116,101,110,116,115,114,38,1,0,0,114,121,0, - 0,0,114,25,1,0,0,114,15,1,0,0,90,8,110,101, - 119,95,110,97,109,101,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,67,1,0,0,224,5,0,0,115,38, - 0,0,0,6,2,2,1,22,1,18,1,10,3,12,3,12, - 1,6,7,8,1,16,1,4,1,18,1,4,2,12,1,6, - 1,12,1,20,1,4,255,255,128,122,22,70,105,108,101,70, - 105,110,100,101,114,46,95,102,105,108,108,95,99,97,99,104, - 101,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,3,0,0,0,7,0,0,0,115,18,0,0,0,135, - 0,135,1,102,2,100,1,100,2,132,8,125,2,124,2,83, - 0,41,4,97,20,1,0,0,65,32,99,108,97,115,115,32, - 109,101,116,104,111,100,32,119,104,105,99,104,32,114,101,116, - 117,114,110,115,32,97,32,99,108,111,115,117,114,101,32,116, - 111,32,117,115,101,32,111,110,32,115,121,115,46,112,97,116, - 104,95,104,111,111,107,10,32,32,32,32,32,32,32,32,119, - 104,105,99,104,32,119,105,108,108,32,114,101,116,117,114,110, - 32,97,110,32,105,110,115,116,97,110,99,101,32,117,115,105, - 110,103,32,116,104,101,32,115,112,101,99,105,102,105,101,100, - 32,108,111,97,100,101,114,115,32,97,110,100,32,116,104,101, - 32,112,97,116,104,10,32,32,32,32,32,32,32,32,99,97, - 108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115, - 117,114,101,46,10,10,32,32,32,32,32,32,32,32,73,102, - 32,116,104,101,32,112,97,116,104,32,99,97,108,108,101,100, - 32,111,110,32,116,104,101,32,99,108,111,115,117,114,101,32, - 105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111, - 114,121,44,32,73,109,112,111,114,116,69,114,114,111,114,32, - 105,115,10,32,32,32,32,32,32,32,32,114,97,105,115,101, - 100,46,10,10,32,32,32,32,32,32,32,32,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,19,0,0,0,115,36,0,0,0,116,0,124,0,131,1, - 115,20,116,1,100,1,124,0,100,2,141,2,130,1,136,0, - 124,0,103,1,136,1,162,1,82,0,142,0,83,0,41,4, - 122,45,80,97,116,104,32,104,111,111,107,32,102,111,114,32, - 105,109,112,111,114,116,108,105,98,46,109,97,99,104,105,110, - 101,114,121,46,70,105,108,101,70,105,110,100,101,114,46,122, - 30,111,110,108,121,32,100,105,114,101,99,116,111,114,105,101, - 115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,114, - 56,0,0,0,78,41,2,114,64,0,0,0,114,122,0,0, - 0,114,56,0,0,0,169,2,114,202,0,0,0,114,66,1, - 0,0,114,7,0,0,0,114,8,0,0,0,218,24,112,97, - 116,104,95,104,111,111,107,95,102,111,114,95,70,105,108,101, - 70,105,110,100,101,114,9,6,0,0,115,8,0,0,0,8, - 2,12,1,16,1,255,128,122,54,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,107, - 95,102,111,114,95,70,105,108,101,70,105,110,100,101,114,78, - 114,7,0,0,0,41,3,114,202,0,0,0,114,66,1,0, - 0,114,72,1,0,0,114,7,0,0,0,114,71,1,0,0, - 114,8,0,0,0,218,9,112,97,116,104,95,104,111,111,107, - 255,5,0,0,115,6,0,0,0,14,10,4,6,255,128,122, - 20,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,0,0, - 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,41, - 2,78,122,16,70,105,108,101,70,105,110,100,101,114,40,123, - 33,114,125,41,41,2,114,70,0,0,0,114,52,0,0,0, - 114,253,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,36,1,0,0,17,6,0,0,115,4,0, - 0,0,12,1,255,128,122,19,70,105,108,101,70,105,110,100, - 101,114,46,95,95,114,101,112,114,95,95,41,1,78,41,15, - 114,130,0,0,0,114,129,0,0,0,114,131,0,0,0,114, - 132,0,0,0,114,216,0,0,0,114,43,1,0,0,114,147, - 0,0,0,114,210,0,0,0,114,141,0,0,0,114,56,1, - 0,0,114,207,0,0,0,114,67,1,0,0,114,214,0,0, - 0,114,73,1,0,0,114,36,1,0,0,114,7,0,0,0, + 101,100,32,109,111,100,117,108,101,44,32,111,114,32,116,104, + 101,32,110,97,109,101,115,112,97,99,101,10,32,32,32,32, + 32,32,32,32,112,97,99,107,97,103,101,32,112,111,114,116, + 105,111,110,115,46,32,82,101,116,117,114,110,115,32,40,108, + 111,97,100,101,114,44,32,108,105,115,116,45,111,102,45,112, + 111,114,116,105,111,110,115,41,46,10,10,32,32,32,32,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,78,41,3,114,207,0,0,0,114,144,0,0,0,114,182, + 0,0,0,41,3,114,123,0,0,0,114,143,0,0,0,114, + 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,141,0,0,0,159,5,0,0,115,10,0,0, + 0,10,7,8,1,8,1,16,1,255,128,122,22,70,105,108, + 101,70,105,110,100,101,114,46,102,105,110,100,95,108,111,97, + 100,101,114,99,6,0,0,0,0,0,0,0,0,0,0,0, + 7,0,0,0,6,0,0,0,67,0,0,0,115,26,0,0, + 0,124,1,124,2,124,3,131,2,125,6,116,0,124,2,124, + 3,124,6,124,4,100,1,141,4,83,0,41,2,78,114,181, + 0,0,0,41,1,114,194,0,0,0,41,7,114,123,0,0, + 0,114,192,0,0,0,114,143,0,0,0,114,52,0,0,0, + 90,4,115,109,115,108,114,206,0,0,0,114,144,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 59,1,0,0,130,5,0,0,115,26,0,0,0,8,0,4, - 2,8,7,8,14,4,4,8,2,8,12,10,5,8,48,2, - 31,10,1,12,17,255,128,114,59,1,0,0,99,4,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,8,0,0, - 0,67,0,0,0,115,144,0,0,0,124,0,160,0,100,1, - 161,1,125,4,124,0,160,0,100,2,161,1,125,5,124,4, - 115,66,124,5,114,36,124,5,106,1,125,4,110,30,124,2, - 124,3,107,2,114,56,116,2,124,1,124,2,131,2,125,4, - 110,10,116,3,124,1,124,2,131,2,125,4,124,5,115,84, - 116,4,124,1,124,2,124,4,100,3,141,3,125,5,122,38, - 124,5,124,0,100,2,60,0,124,4,124,0,100,1,60,0, - 124,2,124,0,100,4,60,0,124,3,124,0,100,5,60,0, - 87,0,100,0,83,0,4,0,116,5,121,142,1,0,1,0, - 1,0,89,0,100,0,83,0,48,0,41,6,78,218,10,95, - 95,108,111,97,100,101,114,95,95,218,8,95,95,115,112,101, - 99,95,95,114,60,1,0,0,90,8,95,95,102,105,108,101, - 95,95,90,10,95,95,99,97,99,104,101,100,95,95,41,6, - 218,3,103,101,116,114,144,0,0,0,114,12,1,0,0,114, - 6,1,0,0,114,194,0,0,0,218,9,69,120,99,101,112, - 116,105,111,110,41,6,90,2,110,115,114,121,0,0,0,90, - 8,112,97,116,104,110,97,109,101,90,9,99,112,97,116,104, - 110,97,109,101,114,144,0,0,0,114,191,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,14,95, - 102,105,120,95,117,112,95,109,111,100,117,108,101,23,6,0, - 0,115,36,0,0,0,10,2,10,1,4,1,4,1,8,1, - 8,1,12,1,10,2,4,1,14,1,2,1,8,1,8,1, - 8,1,14,1,12,1,8,2,255,128,114,78,1,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,38,0,0,0,116,0,116, - 1,160,2,161,0,102,2,125,0,116,3,116,4,102,2,125, - 1,116,5,116,6,102,2,125,2,124,0,124,1,124,2,103, - 3,83,0,41,2,122,95,82,101,116,117,114,110,115,32,97, - 32,108,105,115,116,32,111,102,32,102,105,108,101,45,98,97, - 115,101,100,32,109,111,100,117,108,101,32,108,111,97,100,101, - 114,115,46,10,10,32,32,32,32,69,97,99,104,32,105,116, - 101,109,32,105,115,32,97,32,116,117,112,108,101,32,40,108, - 111,97,100,101,114,44,32,115,117,102,102,105,120,101,115,41, - 46,10,32,32,32,32,78,41,7,114,3,1,0,0,114,167, - 0,0,0,218,18,101,120,116,101,110,115,105,111,110,95,115, - 117,102,102,105,120,101,115,114,6,1,0,0,114,106,0,0, - 0,114,12,1,0,0,114,94,0,0,0,41,3,90,10,101, - 120,116,101,110,115,105,111,110,115,90,6,115,111,117,114,99, - 101,90,8,98,121,116,101,99,111,100,101,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,188,0,0,0,46, - 6,0,0,115,10,0,0,0,12,5,8,1,8,1,10,1, - 255,128,114,188,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,0,67,0,0,0, - 115,8,0,0,0,124,0,97,0,100,0,83,0,114,114,0, - 0,0,41,1,114,139,0,0,0,41,1,218,17,95,98,111, - 111,116,115,116,114,97,112,95,109,111,100,117,108,101,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,21,95, - 115,101,116,95,98,111,111,116,115,116,114,97,112,95,109,111, - 100,117,108,101,57,6,0,0,115,4,0,0,0,8,2,255, - 128,114,81,1,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, - 50,0,0,0,116,0,124,0,131,1,1,0,116,1,131,0, - 125,1,116,2,106,3,160,4,116,5,106,6,124,1,142,0, - 103,1,161,1,1,0,116,2,106,7,160,8,116,9,161,1, - 1,0,100,1,83,0,41,2,122,41,73,110,115,116,97,108, - 108,32,116,104,101,32,112,97,116,104,45,98,97,115,101,100, - 32,105,109,112,111,114,116,32,99,111,109,112,111,110,101,110, - 116,115,46,78,41,10,114,81,1,0,0,114,188,0,0,0, - 114,15,0,0,0,114,48,1,0,0,114,171,0,0,0,114, - 59,1,0,0,114,73,1,0,0,218,9,109,101,116,97,95, - 112,97,116,104,114,190,0,0,0,114,42,1,0,0,41,2, - 114,80,1,0,0,90,17,115,117,112,112,111,114,116,101,100, - 95,108,111,97,100,101,114,115,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,8,95,105,110,115,116,97,108, - 108,62,6,0,0,115,10,0,0,0,8,2,6,1,20,1, - 16,1,255,128,114,83,1,0,0,41,1,114,68,0,0,0, - 41,1,78,41,3,78,78,78,41,2,114,0,0,0,0,114, - 0,0,0,0,41,1,84,41,1,78,41,1,78,41,83,114, - 132,0,0,0,114,139,0,0,0,114,167,0,0,0,114,72, - 0,0,0,114,15,0,0,0,114,81,0,0,0,114,164,0, - 0,0,114,22,0,0,0,114,211,0,0,0,90,2,110,116, - 114,18,0,0,0,114,196,0,0,0,90,5,112,111,115,105, - 120,114,42,0,0,0,218,3,97,108,108,114,45,0,0,0, - 114,46,0,0,0,114,66,0,0,0,114,25,0,0,0,90, - 37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, - 86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,84, - 69,83,95,75,69,89,114,24,0,0,0,114,26,0,0,0, - 114,21,0,0,0,114,33,0,0,0,114,38,0,0,0,114, - 40,0,0,0,114,48,0,0,0,114,55,0,0,0,114,57, - 0,0,0,114,61,0,0,0,114,62,0,0,0,114,64,0, - 0,0,114,67,0,0,0,114,77,0,0,0,218,4,116,121, - 112,101,218,8,95,95,99,111,100,101,95,95,114,166,0,0, - 0,114,31,0,0,0,114,152,0,0,0,114,30,0,0,0, - 114,35,0,0,0,114,243,0,0,0,114,97,0,0,0,114, - 93,0,0,0,114,106,0,0,0,114,190,0,0,0,114,79, - 1,0,0,114,212,0,0,0,114,94,0,0,0,90,23,68, - 69,66,85,71,95,66,89,84,69,67,79,68,69,95,83,85, - 70,70,73,88,69,83,90,27,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,114,102,0,0,0,114,107,0,0,0,114,113,0, - 0,0,114,117,0,0,0,114,119,0,0,0,114,140,0,0, - 0,114,147,0,0,0,114,156,0,0,0,114,160,0,0,0, - 114,162,0,0,0,114,169,0,0,0,114,174,0,0,0,114, - 175,0,0,0,114,180,0,0,0,218,6,111,98,106,101,99, - 116,114,189,0,0,0,114,194,0,0,0,114,195,0,0,0, - 114,215,0,0,0,114,228,0,0,0,114,246,0,0,0,114, - 6,1,0,0,114,12,1,0,0,114,3,1,0,0,114,18, - 1,0,0,114,40,1,0,0,114,42,1,0,0,114,59,1, - 0,0,114,78,1,0,0,114,188,0,0,0,114,81,1,0, - 0,114,83,1,0,0,114,7,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,8,60,109,111,100, - 117,108,101,62,1,0,0,0,115,172,0,0,0,4,0,4, - 22,8,3,8,1,8,1,8,1,8,1,10,3,4,1,8, - 1,10,1,8,2,4,3,10,1,6,2,22,2,8,1,10, - 1,14,1,4,4,4,1,2,1,2,1,4,255,8,4,6, - 16,8,3,8,5,8,5,8,6,8,6,8,12,8,10,8, - 9,8,5,8,7,10,9,10,22,0,127,16,23,12,1,4, - 2,4,1,6,2,6,1,10,1,8,2,6,2,8,2,16, - 2,8,71,8,40,8,19,8,12,8,12,8,31,8,17,8, - 33,8,28,10,24,10,13,10,10,8,11,6,14,4,3,2, - 1,12,255,14,68,14,64,16,30,0,127,14,17,18,50,18, - 45,18,25,14,53,14,63,14,43,0,127,14,20,0,127,10, - 22,8,23,8,11,12,5,255,128, + 56,1,0,0,171,5,0,0,115,10,0,0,0,10,1,8, + 1,2,1,6,255,255,128,122,20,70,105,108,101,70,105,110, + 100,101,114,46,95,103,101,116,95,115,112,101,99,78,99,3, + 0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,8, + 0,0,0,67,0,0,0,115,92,1,0,0,100,1,125,3, + 124,1,160,0,100,2,161,1,100,3,25,0,125,4,122,24, + 116,1,124,0,106,2,112,34,116,3,160,4,161,0,131,1, + 106,5,125,5,87,0,110,22,4,0,116,6,121,64,1,0, + 1,0,1,0,100,4,125,5,89,0,110,2,48,0,124,5, + 124,0,106,7,107,3,114,90,124,0,160,8,161,0,1,0, + 124,5,124,0,95,7,116,9,131,0,114,112,124,0,106,10, + 125,6,124,4,160,11,161,0,125,7,110,10,124,0,106,12, + 125,6,124,4,125,7,124,7,124,6,118,0,114,214,116,13, + 124,0,106,2,124,4,131,2,125,8,124,0,106,14,68,0, + 93,56,92,2,125,9,125,10,100,5,124,9,23,0,125,11, + 116,13,124,8,124,11,131,2,125,12,116,15,124,12,131,1, + 114,148,124,0,160,16,124,10,124,1,124,12,124,8,103,1, + 124,2,161,5,2,0,1,0,83,0,116,17,124,8,131,1, + 125,3,124,0,106,14,68,0,93,80,92,2,125,9,125,10, + 116,13,124,0,106,2,124,4,124,9,23,0,131,2,125,12, + 116,18,106,19,100,6,124,12,100,3,100,7,141,3,1,0, + 124,7,124,9,23,0,124,6,118,0,114,220,116,15,124,12, + 131,1,114,220,124,0,160,16,124,10,124,1,124,12,100,8, + 124,2,161,5,2,0,1,0,83,0,124,3,144,1,114,88, + 116,18,160,19,100,9,124,8,161,2,1,0,116,18,160,20, + 124,1,100,8,161,2,125,13,124,8,103,1,124,13,95,21, + 124,13,83,0,100,8,83,0,41,10,122,111,84,114,121,32, + 116,111,32,102,105,110,100,32,97,32,115,112,101,99,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,46,10,10,32,32,32,32,32,32, + 32,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97, + 116,99,104,105,110,103,32,115,112,101,99,44,32,111,114,32, + 78,111,110,101,32,105,102,32,110,111,116,32,102,111,117,110, + 100,46,10,32,32,32,32,32,32,32,32,70,114,79,0,0, + 0,114,39,0,0,0,114,109,0,0,0,114,216,0,0,0, + 122,9,116,114,121,105,110,103,32,123,125,41,1,90,9,118, + 101,114,98,111,115,105,116,121,78,122,25,112,111,115,115,105, + 98,108,101,32,110,97,109,101,115,112,97,99,101,32,102,111, + 114,32,123,125,41,22,114,49,0,0,0,114,57,0,0,0, + 114,52,0,0,0,114,18,0,0,0,114,63,0,0,0,114, + 7,1,0,0,114,58,0,0,0,114,62,1,0,0,218,11, + 95,102,105,108,108,95,99,97,99,104,101,114,21,0,0,0, + 114,65,1,0,0,114,110,0,0,0,114,64,1,0,0,114, + 48,0,0,0,114,61,1,0,0,114,62,0,0,0,114,56, + 1,0,0,114,64,0,0,0,114,139,0,0,0,114,153,0, + 0,0,114,187,0,0,0,114,182,0,0,0,41,14,114,123, + 0,0,0,114,143,0,0,0,114,206,0,0,0,90,12,105, + 115,95,110,97,109,101,115,112,97,99,101,90,11,116,97,105, + 108,95,109,111,100,117,108,101,114,173,0,0,0,90,5,99, + 97,99,104,101,90,12,99,97,99,104,101,95,109,111,100,117, + 108,101,90,9,98,97,115,101,95,112,97,116,104,114,15,1, + 0,0,114,192,0,0,0,90,13,105,110,105,116,95,102,105, + 108,101,110,97,109,101,90,9,102,117,108,108,95,112,97,116, + 104,114,191,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,207,0,0,0,176,5,0,0,115,74, + 0,0,0,4,5,14,1,2,1,24,1,12,1,10,1,10, + 1,8,1,6,1,6,2,6,1,10,1,6,2,4,1,8, + 2,12,1,14,1,8,1,10,1,8,1,24,1,8,4,14, + 2,16,1,16,1,12,1,8,1,10,1,4,1,8,255,6, + 2,12,1,12,1,8,1,4,1,4,1,255,128,122,20,70, + 105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,115, + 112,101,99,99,1,0,0,0,0,0,0,0,0,0,0,0, + 9,0,0,0,10,0,0,0,67,0,0,0,115,192,0,0, + 0,124,0,106,0,125,1,122,22,116,1,160,2,124,1,112, + 22,116,1,160,3,161,0,161,1,125,2,87,0,110,28,4, + 0,116,4,116,5,116,6,102,3,121,56,1,0,1,0,1, + 0,103,0,125,2,89,0,110,2,48,0,116,7,106,8,160, + 9,100,1,161,1,115,82,116,10,124,2,131,1,124,0,95, + 11,110,74,116,10,131,0,125,3,124,2,68,0,93,56,125, + 4,124,4,160,12,100,2,161,1,92,3,125,5,125,6,125, + 7,124,6,114,134,100,3,160,13,124,5,124,7,160,14,161, + 0,161,2,125,8,110,4,124,5,125,8,124,3,160,15,124, + 8,161,1,1,0,113,92,124,3,124,0,95,11,116,7,106, + 8,160,9,116,16,161,1,114,188,100,4,100,5,132,0,124, + 2,68,0,131,1,124,0,95,17,100,6,83,0,100,6,83, + 0,41,7,122,68,70,105,108,108,32,116,104,101,32,99,97, + 99,104,101,32,111,102,32,112,111,116,101,110,116,105,97,108, + 32,109,111,100,117,108,101,115,32,97,110,100,32,112,97,99, + 107,97,103,101,115,32,102,111,114,32,116,104,105,115,32,100, + 105,114,101,99,116,111,114,121,46,114,14,0,0,0,114,79, + 0,0,0,114,69,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,83,0,0, + 0,115,20,0,0,0,104,0,124,0,93,12,125,1,124,1, + 160,0,161,0,146,2,113,4,83,0,114,7,0,0,0,41, + 1,114,110,0,0,0,41,2,114,5,0,0,0,90,2,102, + 110,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,13,0,0,0,253,5,0,0,115,4,0,0,0,20,0, + 255,128,122,41,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,115,101,116,99,111,109,112,62,78,41,18, + 114,52,0,0,0,114,18,0,0,0,90,7,108,105,115,116, + 100,105,114,114,63,0,0,0,114,50,1,0,0,218,15,80, + 101,114,109,105,115,115,105,111,110,69,114,114,111,114,218,18, + 78,111,116,65,68,105,114,101,99,116,111,114,121,69,114,114, + 111,114,114,15,0,0,0,114,22,0,0,0,114,23,0,0, + 0,114,63,1,0,0,114,64,1,0,0,114,105,0,0,0, + 114,70,0,0,0,114,110,0,0,0,218,3,97,100,100,114, + 24,0,0,0,114,65,1,0,0,41,9,114,123,0,0,0, + 114,52,0,0,0,90,8,99,111,110,116,101,110,116,115,90, + 21,108,111,119,101,114,95,115,117,102,102,105,120,95,99,111, + 110,116,101,110,116,115,114,38,1,0,0,114,121,0,0,0, + 114,25,1,0,0,114,15,1,0,0,90,8,110,101,119,95, + 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,67,1,0,0,224,5,0,0,115,38,0,0, + 0,6,2,2,1,22,1,18,1,10,3,12,3,12,1,6, + 7,8,1,16,1,4,1,18,1,4,2,12,1,6,1,12, + 1,20,1,4,255,255,128,122,22,70,105,108,101,70,105,110, + 100,101,114,46,95,102,105,108,108,95,99,97,99,104,101,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,7,0,0,0,115,18,0,0,0,135,0,135, + 1,102,2,100,1,100,2,132,8,125,2,124,2,83,0,41, + 4,97,20,1,0,0,65,32,99,108,97,115,115,32,109,101, + 116,104,111,100,32,119,104,105,99,104,32,114,101,116,117,114, + 110,115,32,97,32,99,108,111,115,117,114,101,32,116,111,32, + 117,115,101,32,111,110,32,115,121,115,46,112,97,116,104,95, + 104,111,111,107,10,32,32,32,32,32,32,32,32,119,104,105, + 99,104,32,119,105,108,108,32,114,101,116,117,114,110,32,97, + 110,32,105,110,115,116,97,110,99,101,32,117,115,105,110,103, + 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,108, + 111,97,100,101,114,115,32,97,110,100,32,116,104,101,32,112, + 97,116,104,10,32,32,32,32,32,32,32,32,99,97,108,108, + 101,100,32,111,110,32,116,104,101,32,99,108,111,115,117,114, + 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,116, + 104,101,32,112,97,116,104,32,99,97,108,108,101,100,32,111, + 110,32,116,104,101,32,99,108,111,115,117,114,101,32,105,115, + 32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121, + 44,32,73,109,112,111,114,116,69,114,114,111,114,32,105,115, + 10,32,32,32,32,32,32,32,32,114,97,105,115,101,100,46, + 10,10,32,32,32,32,32,32,32,32,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,19, + 0,0,0,115,36,0,0,0,116,0,124,0,131,1,115,20, + 116,1,100,1,124,0,100,2,141,2,130,1,136,0,124,0, + 103,1,136,1,162,1,82,0,142,0,83,0,41,4,122,45, + 80,97,116,104,32,104,111,111,107,32,102,111,114,32,105,109, + 112,111,114,116,108,105,98,46,109,97,99,104,105,110,101,114, + 121,46,70,105,108,101,70,105,110,100,101,114,46,122,30,111, + 110,108,121,32,100,105,114,101,99,116,111,114,105,101,115,32, + 97,114,101,32,115,117,112,112,111,114,116,101,100,114,56,0, + 0,0,78,41,2,114,64,0,0,0,114,122,0,0,0,114, + 56,0,0,0,169,2,114,202,0,0,0,114,66,1,0,0, + 114,7,0,0,0,114,8,0,0,0,218,24,112,97,116,104, + 95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,105, + 110,100,101,114,9,6,0,0,115,8,0,0,0,8,2,12, + 1,16,1,255,128,122,54,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,107,95,102, + 111,114,95,70,105,108,101,70,105,110,100,101,114,78,114,7, + 0,0,0,41,3,114,202,0,0,0,114,66,1,0,0,114, + 72,1,0,0,114,7,0,0,0,114,71,1,0,0,114,8, + 0,0,0,218,9,112,97,116,104,95,104,111,111,107,255,5, + 0,0,115,6,0,0,0,14,10,4,6,255,128,122,20,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,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, + 0,100,1,160,0,124,0,106,1,161,1,83,0,41,2,78, + 122,16,70,105,108,101,70,105,110,100,101,114,40,123,33,114, + 125,41,41,2,114,70,0,0,0,114,52,0,0,0,114,253, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,36,1,0,0,17,6,0,0,115,4,0,0,0, + 12,1,255,128,122,19,70,105,108,101,70,105,110,100,101,114, + 46,95,95,114,101,112,114,95,95,41,1,78,41,15,114,130, + 0,0,0,114,129,0,0,0,114,131,0,0,0,114,132,0, + 0,0,114,216,0,0,0,114,43,1,0,0,114,147,0,0, + 0,114,210,0,0,0,114,141,0,0,0,114,56,1,0,0, + 114,207,0,0,0,114,67,1,0,0,114,214,0,0,0,114, + 73,1,0,0,114,36,1,0,0,114,7,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,59,1, + 0,0,130,5,0,0,115,26,0,0,0,8,0,4,2,8, + 7,8,14,4,4,8,2,8,12,10,5,8,48,2,31,10, + 1,12,17,255,128,114,59,1,0,0,99,4,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,8,0,0,0,67, + 0,0,0,115,144,0,0,0,124,0,160,0,100,1,161,1, + 125,4,124,0,160,0,100,2,161,1,125,5,124,4,115,66, + 124,5,114,36,124,5,106,1,125,4,110,30,124,2,124,3, + 107,2,114,56,116,2,124,1,124,2,131,2,125,4,110,10, + 116,3,124,1,124,2,131,2,125,4,124,5,115,84,116,4, + 124,1,124,2,124,4,100,3,141,3,125,5,122,38,124,5, + 124,0,100,2,60,0,124,4,124,0,100,1,60,0,124,2, + 124,0,100,4,60,0,124,3,124,0,100,5,60,0,87,0, + 100,0,83,0,4,0,116,5,121,142,1,0,1,0,1,0, + 89,0,100,0,83,0,48,0,41,6,78,218,10,95,95,108, + 111,97,100,101,114,95,95,218,8,95,95,115,112,101,99,95, + 95,114,60,1,0,0,90,8,95,95,102,105,108,101,95,95, + 90,10,95,95,99,97,99,104,101,100,95,95,41,6,218,3, + 103,101,116,114,144,0,0,0,114,12,1,0,0,114,6,1, + 0,0,114,194,0,0,0,218,9,69,120,99,101,112,116,105, + 111,110,41,6,90,2,110,115,114,121,0,0,0,90,8,112, + 97,116,104,110,97,109,101,90,9,99,112,97,116,104,110,97, + 109,101,114,144,0,0,0,114,191,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,14,95,102,105, + 120,95,117,112,95,109,111,100,117,108,101,23,6,0,0,115, + 36,0,0,0,10,2,10,1,4,1,4,1,8,1,8,1, + 12,1,10,2,4,1,14,1,2,1,8,1,8,1,8,1, + 14,1,12,1,8,2,255,128,114,78,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,38,0,0,0,116,0,116,1,160, + 2,161,0,102,2,125,0,116,3,116,4,102,2,125,1,116, + 5,116,6,102,2,125,2,124,0,124,1,124,2,103,3,83, + 0,41,2,122,95,82,101,116,117,114,110,115,32,97,32,108, + 105,115,116,32,111,102,32,102,105,108,101,45,98,97,115,101, + 100,32,109,111,100,117,108,101,32,108,111,97,100,101,114,115, + 46,10,10,32,32,32,32,69,97,99,104,32,105,116,101,109, + 32,105,115,32,97,32,116,117,112,108,101,32,40,108,111,97, + 100,101,114,44,32,115,117,102,102,105,120,101,115,41,46,10, + 32,32,32,32,78,41,7,114,3,1,0,0,114,167,0,0, + 0,218,18,101,120,116,101,110,115,105,111,110,95,115,117,102, + 102,105,120,101,115,114,6,1,0,0,114,106,0,0,0,114, + 12,1,0,0,114,94,0,0,0,41,3,90,10,101,120,116, + 101,110,115,105,111,110,115,90,6,115,111,117,114,99,101,90, + 8,98,121,116,101,99,111,100,101,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,188,0,0,0,46,6,0, + 0,115,10,0,0,0,12,5,8,1,8,1,10,1,255,128, + 114,188,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,8, + 0,0,0,124,0,97,0,100,0,83,0,114,114,0,0,0, + 41,1,114,139,0,0,0,41,1,218,17,95,98,111,111,116, + 115,116,114,97,112,95,109,111,100,117,108,101,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,21,95,115,101, + 116,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, + 108,101,57,6,0,0,115,4,0,0,0,8,2,255,128,114, + 81,1,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,4,0,0,0,67,0,0,0,115,50,0, + 0,0,116,0,124,0,131,1,1,0,116,1,131,0,125,1, + 116,2,106,3,160,4,116,5,106,6,124,1,142,0,103,1, + 161,1,1,0,116,2,106,7,160,8,116,9,161,1,1,0, + 100,1,83,0,41,2,122,41,73,110,115,116,97,108,108,32, + 116,104,101,32,112,97,116,104,45,98,97,115,101,100,32,105, + 109,112,111,114,116,32,99,111,109,112,111,110,101,110,116,115, + 46,78,41,10,114,81,1,0,0,114,188,0,0,0,114,15, + 0,0,0,114,48,1,0,0,114,171,0,0,0,114,59,1, + 0,0,114,73,1,0,0,218,9,109,101,116,97,95,112,97, + 116,104,114,190,0,0,0,114,42,1,0,0,41,2,114,80, + 1,0,0,90,17,115,117,112,112,111,114,116,101,100,95,108, + 111,97,100,101,114,115,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,8,95,105,110,115,116,97,108,108,62, + 6,0,0,115,10,0,0,0,8,2,6,1,20,1,16,1, + 255,128,114,83,1,0,0,41,1,114,68,0,0,0,41,1, + 78,41,3,78,78,78,41,2,114,0,0,0,0,114,0,0, + 0,0,41,1,84,41,1,78,41,1,78,41,83,114,132,0, + 0,0,114,139,0,0,0,114,167,0,0,0,114,72,0,0, + 0,114,15,0,0,0,114,81,0,0,0,114,164,0,0,0, + 114,22,0,0,0,114,211,0,0,0,90,2,110,116,114,18, + 0,0,0,114,196,0,0,0,90,5,112,111,115,105,120,114, + 42,0,0,0,218,3,97,108,108,114,45,0,0,0,114,46, + 0,0,0,114,66,0,0,0,114,25,0,0,0,90,37,95, + 67,65,83,69,95,73,78,83,69,78,83,73,84,73,86,69, + 95,80,76,65,84,70,79,82,77,83,95,66,89,84,69,83, + 95,75,69,89,114,24,0,0,0,114,26,0,0,0,114,21, + 0,0,0,114,33,0,0,0,114,38,0,0,0,114,40,0, + 0,0,114,48,0,0,0,114,55,0,0,0,114,57,0,0, + 0,114,61,0,0,0,114,62,0,0,0,114,64,0,0,0, + 114,67,0,0,0,114,77,0,0,0,218,4,116,121,112,101, + 218,8,95,95,99,111,100,101,95,95,114,166,0,0,0,114, + 31,0,0,0,114,152,0,0,0,114,30,0,0,0,114,35, + 0,0,0,114,243,0,0,0,114,97,0,0,0,114,93,0, + 0,0,114,106,0,0,0,114,190,0,0,0,114,79,1,0, + 0,114,212,0,0,0,114,94,0,0,0,90,23,68,69,66, + 85,71,95,66,89,84,69,67,79,68,69,95,83,85,70,70, + 73,88,69,83,90,27,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,114,102,0,0,0,114,107,0,0,0,114,113,0,0,0, + 114,117,0,0,0,114,119,0,0,0,114,140,0,0,0,114, + 147,0,0,0,114,156,0,0,0,114,160,0,0,0,114,162, + 0,0,0,114,169,0,0,0,114,174,0,0,0,114,175,0, + 0,0,114,180,0,0,0,218,6,111,98,106,101,99,116,114, + 189,0,0,0,114,194,0,0,0,114,195,0,0,0,114,215, + 0,0,0,114,228,0,0,0,114,246,0,0,0,114,6,1, + 0,0,114,12,1,0,0,114,3,1,0,0,114,18,1,0, + 0,114,40,1,0,0,114,42,1,0,0,114,59,1,0,0, + 114,78,1,0,0,114,188,0,0,0,114,81,1,0,0,114, + 83,1,0,0,114,7,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,8,60,109,111,100,117,108, + 101,62,1,0,0,0,115,172,0,0,0,4,0,4,22,8, + 3,8,1,8,1,8,1,8,1,10,3,4,1,8,1,10, + 1,8,2,4,3,10,1,6,2,22,2,8,1,10,1,14, + 1,4,4,4,1,2,1,2,1,4,255,8,4,6,16,8, + 3,8,5,8,5,8,6,8,6,8,12,8,10,8,9,8, + 5,8,7,10,9,10,22,0,127,16,23,12,1,4,2,4, + 1,6,2,6,1,10,1,8,2,6,2,8,2,16,2,8, + 71,8,40,8,19,8,12,8,12,8,31,8,17,8,33,8, + 28,10,24,10,13,10,10,8,11,6,14,4,3,2,1,12, + 255,14,68,14,64,16,30,0,127,14,17,18,50,18,45,18, + 25,14,53,14,63,14,43,0,127,14,20,0,127,10,22,8, + 23,8,11,12,5,255,128, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index 59a2fe2502921a..2058a9e3548737 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -118,610 +118,611 @@ const unsigned char _Py_M__zipimport[] = { 104,101,10,32,32,32,32,122,105,112,102,105,108,101,32,116, 97,114,103,101,116,101,100,46,10,32,32,32,32,99,2,0, 0,0,0,0,0,0,0,0,0,0,8,0,0,0,9,0, - 0,0,67,0,0,0,115,32,1,0,0,116,0,124,1,116, + 0,0,67,0,0,0,115,36,1,0,0,116,0,124,1,116, 1,131,2,115,28,100,1,100,0,108,2,125,2,124,2,160, 3,124,1,161,1,125,1,124,1,115,44,116,4,100,2,124, 1,100,3,141,2,130,1,116,5,114,60,124,1,160,6,116, - 5,116,7,161,2,125,1,103,0,125,3,122,14,116,8,160, - 9,124,1,161,1,125,4,87,0,110,70,4,0,116,10,116, - 11,102,2,121,148,1,0,1,0,1,0,116,8,160,12,124, - 1,161,1,92,2,125,5,125,6,124,5,124,1,107,2,114, - 130,116,4,100,4,124,1,100,3,141,2,130,1,124,5,125, - 1,124,3,160,13,124,6,161,1,1,0,89,0,113,64,48, - 0,124,4,106,14,100,5,64,0,100,6,107,3,114,176,116, - 4,100,4,124,1,100,3,141,2,130,1,122,12,116,15,124, - 1,25,0,125,7,87,0,110,34,4,0,116,16,121,222,1, - 0,1,0,1,0,116,17,124,1,131,1,125,7,124,7,116, - 15,124,1,60,0,89,0,110,2,48,0,124,7,124,0,95, - 18,124,1,124,0,95,19,116,8,106,20,124,3,100,0,100, - 0,100,7,133,3,25,0,142,0,124,0,95,21,124,0,106, - 21,144,1,114,28,124,0,4,0,106,21,116,7,55,0,2, - 0,95,21,100,0,83,0,100,0,83,0,41,8,78,114,0, - 0,0,0,122,21,97,114,99,104,105,118,101,32,112,97,116, - 104,32,105,115,32,101,109,112,116,121,169,1,218,4,112,97, - 116,104,122,14,110,111,116,32,97,32,90,105,112,32,102,105, - 108,101,105,0,240,0,0,105,0,128,0,0,233,255,255,255, - 255,41,22,218,10,105,115,105,110,115,116,97,110,99,101,218, - 3,115,116,114,218,2,111,115,90,8,102,115,100,101,99,111, - 100,101,114,3,0,0,0,218,12,97,108,116,95,112,97,116, - 104,95,115,101,112,218,7,114,101,112,108,97,99,101,218,8, - 112,97,116,104,95,115,101,112,218,19,95,98,111,111,116,115, - 116,114,97,112,95,101,120,116,101,114,110,97,108,90,10,95, - 112,97,116,104,95,115,116,97,116,218,7,79,83,69,114,114, - 111,114,218,10,86,97,108,117,101,69,114,114,111,114,90,11, - 95,112,97,116,104,95,115,112,108,105,116,218,6,97,112,112, - 101,110,100,90,7,115,116,95,109,111,100,101,218,20,95,122, - 105,112,95,100,105,114,101,99,116,111,114,121,95,99,97,99, - 104,101,218,8,75,101,121,69,114,114,111,114,218,15,95,114, - 101,97,100,95,100,105,114,101,99,116,111,114,121,218,6,95, - 102,105,108,101,115,218,7,97,114,99,104,105,118,101,218,10, - 95,112,97,116,104,95,106,111,105,110,218,6,112,114,101,102, - 105,120,41,8,218,4,115,101,108,102,114,13,0,0,0,114, - 17,0,0,0,114,31,0,0,0,90,2,115,116,90,7,100, - 105,114,110,97,109,101,90,8,98,97,115,101,110,97,109,101, - 218,5,102,105,108,101,115,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,8,95,95,105,110,105,116,95,95, - 64,0,0,0,115,60,0,0,0,10,1,8,1,10,1,4, - 1,12,1,4,1,12,1,4,2,2,2,14,1,16,1,14, - 3,8,1,12,1,4,1,16,1,14,3,12,2,2,3,12, - 1,12,1,8,1,14,1,6,1,6,1,22,2,8,1,18, - 1,4,255,255,128,122,20,122,105,112,105,109,112,111,114,116, - 101,114,46,95,95,105,110,105,116,95,95,78,99,3,0,0, - 0,0,0,0,0,0,0,0,0,5,0,0,0,4,0,0, - 0,67,0,0,0,115,78,0,0,0,116,0,124,0,124,1, - 131,2,125,3,124,3,100,1,117,1,114,26,124,0,103,0, - 102,2,83,0,116,1,124,0,124,1,131,2,125,4,116,2, - 124,0,124,4,131,2,114,70,100,1,124,0,106,3,155,0, - 116,4,155,0,124,4,155,0,157,3,103,1,102,2,83,0, - 100,1,103,0,102,2,83,0,41,2,97,47,2,0,0,102, - 105,110,100,95,108,111,97,100,101,114,40,102,117,108,108,110, - 97,109,101,44,32,112,97,116,104,61,78,111,110,101,41,32, - 45,62,32,115,101,108,102,44,32,115,116,114,32,111,114,32, - 78,111,110,101,46,10,10,32,32,32,32,32,32,32,32,83, - 101,97,114,99,104,32,102,111,114,32,97,32,109,111,100,117, - 108,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32, - 39,102,117,108,108,110,97,109,101,39,46,32,39,102,117,108, - 108,110,97,109,101,39,32,109,117,115,116,32,98,101,32,116, - 104,101,10,32,32,32,32,32,32,32,32,102,117,108,108,121, - 32,113,117,97,108,105,102,105,101,100,32,40,100,111,116,116, - 101,100,41,32,109,111,100,117,108,101,32,110,97,109,101,46, - 32,73,116,32,114,101,116,117,114,110,115,32,116,104,101,32, - 122,105,112,105,109,112,111,114,116,101,114,10,32,32,32,32, - 32,32,32,32,105,110,115,116,97,110,99,101,32,105,116,115, - 101,108,102,32,105,102,32,116,104,101,32,109,111,100,117,108, - 101,32,119,97,115,32,102,111,117,110,100,44,32,97,32,115, - 116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103, - 32,116,104,101,10,32,32,32,32,32,32,32,32,102,117,108, - 108,32,112,97,116,104,32,110,97,109,101,32,105,102,32,105, - 116,39,115,32,112,111,115,115,105,98,108,121,32,97,32,112, - 111,114,116,105,111,110,32,111,102,32,97,32,110,97,109,101, - 115,112,97,99,101,32,112,97,99,107,97,103,101,44,10,32, - 32,32,32,32,32,32,32,111,114,32,78,111,110,101,32,111, - 116,104,101,114,119,105,115,101,46,32,84,104,101,32,111,112, - 116,105,111,110,97,108,32,39,112,97,116,104,39,32,97,114, - 103,117,109,101,110,116,32,105,115,32,105,103,110,111,114,101, - 100,32,45,45,32,105,116,39,115,10,32,32,32,32,32,32, - 32,32,116,104,101,114,101,32,102,111,114,32,99,111,109,112, - 97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,116, - 104,101,32,105,109,112,111,114,116,101,114,32,112,114,111,116, - 111,99,111,108,46,10,10,32,32,32,32,32,32,32,32,68, - 101,112,114,101,99,97,116,101,100,32,115,105,110,99,101,32, - 80,121,116,104,111,110,32,51,46,49,48,46,32,85,115,101, - 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, - 116,101,97,100,46,10,32,32,32,32,32,32,32,32,78,41, - 5,218,16,95,103,101,116,95,109,111,100,117,108,101,95,105, - 110,102,111,218,16,95,103,101,116,95,109,111,100,117,108,101, - 95,112,97,116,104,218,7,95,105,115,95,100,105,114,114,29, - 0,0,0,114,20,0,0,0,41,5,114,32,0,0,0,218, - 8,102,117,108,108,110,97,109,101,114,13,0,0,0,218,2, - 109,105,218,7,109,111,100,112,97,116,104,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,11,102,105,110,100, - 95,108,111,97,100,101,114,110,0,0,0,115,16,0,0,0, - 10,12,8,1,8,2,10,7,10,1,24,4,8,2,255,128, - 122,23,122,105,112,105,109,112,111,114,116,101,114,46,102,105, - 110,100,95,108,111,97,100,101,114,99,3,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, - 0,0,115,16,0,0,0,124,0,160,0,124,1,124,2,161, - 2,100,1,25,0,83,0,41,3,97,203,1,0,0,102,105, - 110,100,95,109,111,100,117,108,101,40,102,117,108,108,110,97, - 109,101,44,32,112,97,116,104,61,78,111,110,101,41,32,45, - 62,32,115,101,108,102,32,111,114,32,78,111,110,101,46,10, - 10,32,32,32,32,32,32,32,32,83,101,97,114,99,104,32, - 102,111,114,32,97,32,109,111,100,117,108,101,32,115,112,101, - 99,105,102,105,101,100,32,98,121,32,39,102,117,108,108,110, - 97,109,101,39,46,32,39,102,117,108,108,110,97,109,101,39, - 32,109,117,115,116,32,98,101,32,116,104,101,10,32,32,32, - 32,32,32,32,32,102,117,108,108,121,32,113,117,97,108,105, - 102,105,101,100,32,40,100,111,116,116,101,100,41,32,109,111, - 100,117,108,101,32,110,97,109,101,46,32,73,116,32,114,101, - 116,117,114,110,115,32,116,104,101,32,122,105,112,105,109,112, - 111,114,116,101,114,10,32,32,32,32,32,32,32,32,105,110, - 115,116,97,110,99,101,32,105,116,115,101,108,102,32,105,102, - 32,116,104,101,32,109,111,100,117,108,101,32,119,97,115,32, - 102,111,117,110,100,44,32,111,114,32,78,111,110,101,32,105, - 102,32,105,116,32,119,97,115,110,39,116,46,10,32,32,32, - 32,32,32,32,32,84,104,101,32,111,112,116,105,111,110,97, - 108,32,39,112,97,116,104,39,32,97,114,103,117,109,101,110, - 116,32,105,115,32,105,103,110,111,114,101,100,32,45,45,32, - 105,116,39,115,32,116,104,101,114,101,32,102,111,114,32,99, - 111,109,112,97,116,105,98,105,108,105,116,121,10,32,32,32, - 32,32,32,32,32,119,105,116,104,32,116,104,101,32,105,109, - 112,111,114,116,101,114,32,112,114,111,116,111,99,111,108,46, - 10,10,32,32,32,32,32,32,32,32,68,101,112,114,101,99, - 97,116,101,100,32,115,105,110,99,101,32,80,121,116,104,111, - 110,32,51,46,49,48,46,32,85,115,101,32,102,105,110,100, - 95,115,112,101,99,40,41,32,105,110,115,116,101,97,100,46, - 10,32,32,32,32,32,32,32,32,114,0,0,0,0,78,41, - 1,114,41,0,0,0,41,3,114,32,0,0,0,114,38,0, - 0,0,114,13,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,11,102,105,110,100,95,109,111,100, - 117,108,101,144,0,0,0,115,4,0,0,0,16,11,255,128, - 122,23,122,105,112,105,109,112,111,114,116,101,114,46,102,105, - 110,100,95,109,111,100,117,108,101,99,3,0,0,0,0,0, - 0,0,0,0,0,0,7,0,0,0,5,0,0,0,67,0, - 0,0,115,108,0,0,0,116,0,124,0,124,1,131,2,125, - 3,124,3,100,1,117,1,114,34,116,1,106,2,124,1,124, - 0,124,3,100,2,141,3,83,0,116,3,124,0,124,1,131, - 2,125,4,116,4,124,0,124,4,131,2,114,104,124,0,106, - 5,155,0,116,6,155,0,124,4,155,0,157,3,125,5,116, - 1,106,7,124,1,100,1,100,3,100,4,141,3,125,6,124, - 6,106,8,160,9,124,5,161,1,1,0,124,6,83,0,100, - 1,83,0,41,5,122,107,67,114,101,97,116,101,32,97,32, - 77,111,100,117,108,101,83,112,101,99,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,46,10,10,32,32,32,32,32,32,32,32,82,101, - 116,117,114,110,115,32,78,111,110,101,32,105,102,32,116,104, - 101,32,109,111,100,117,108,101,32,99,97,110,110,111,116,32, - 98,101,32,102,111,117,110,100,46,10,32,32,32,32,32,32, - 32,32,78,41,1,218,10,105,115,95,112,97,99,107,97,103, - 101,84,41,3,218,4,110,97,109,101,90,6,108,111,97,100, - 101,114,114,43,0,0,0,41,10,114,35,0,0,0,218,10, - 95,98,111,111,116,115,116,114,97,112,90,16,115,112,101,99, - 95,102,114,111,109,95,108,111,97,100,101,114,114,36,0,0, - 0,114,37,0,0,0,114,29,0,0,0,114,20,0,0,0, - 90,10,77,111,100,117,108,101,83,112,101,99,90,26,115,117, - 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, - 111,99,97,116,105,111,110,115,114,24,0,0,0,41,7,114, - 32,0,0,0,114,38,0,0,0,90,6,116,97,114,103,101, - 116,90,11,109,111,100,117,108,101,95,105,110,102,111,114,40, - 0,0,0,114,13,0,0,0,90,4,115,112,101,99,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,9,102, - 105,110,100,95,115,112,101,99,157,0,0,0,115,26,0,0, - 0,10,5,8,1,16,1,10,7,10,1,18,4,8,1,2, - 1,6,255,12,2,4,1,4,2,255,128,122,21,122,105,112, - 105,109,112,111,114,116,101,114,46,102,105,110,100,95,115,112, - 101,99,99,2,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,3,0,0,0,67,0,0,0,115,20,0,0,0, - 116,0,124,0,124,1,131,2,92,3,125,2,125,3,125,4, - 124,2,83,0,41,2,122,163,103,101,116,95,99,111,100,101, - 40,102,117,108,108,110,97,109,101,41,32,45,62,32,99,111, - 100,101,32,111,98,106,101,99,116,46,10,10,32,32,32,32, - 32,32,32,32,82,101,116,117,114,110,32,116,104,101,32,99, - 111,100,101,32,111,98,106,101,99,116,32,102,111,114,32,116, + 5,116,7,161,2,125,1,103,0,125,3,9,0,122,14,116, + 8,160,9,124,1,161,1,125,4,87,0,110,70,4,0,116, + 10,116,11,102,2,121,150,1,0,1,0,1,0,116,8,160, + 12,124,1,161,1,92,2,125,5,125,6,124,5,124,1,107, + 2,114,132,116,4,100,5,124,1,100,3,141,2,130,1,124, + 5,125,1,124,3,160,13,124,6,161,1,1,0,89,0,110, + 28,48,0,124,4,106,14,100,6,64,0,100,7,107,3,114, + 180,116,4,100,5,124,1,100,3,141,2,130,1,113,66,122, + 12,116,15,124,1,25,0,125,7,87,0,110,34,4,0,116, + 16,121,226,1,0,1,0,1,0,116,17,124,1,131,1,125, + 7,124,7,116,15,124,1,60,0,89,0,110,2,48,0,124, + 7,124,0,95,18,124,1,124,0,95,19,116,8,106,20,124, + 3,100,0,100,0,100,8,133,3,25,0,142,0,124,0,95, + 21,124,0,106,21,144,1,114,32,124,0,4,0,106,21,116, + 7,55,0,2,0,95,21,100,0,83,0,100,0,83,0,41, + 9,78,114,0,0,0,0,122,21,97,114,99,104,105,118,101, + 32,112,97,116,104,32,105,115,32,101,109,112,116,121,169,1, + 218,4,112,97,116,104,84,122,14,110,111,116,32,97,32,90, + 105,112,32,102,105,108,101,105,0,240,0,0,105,0,128,0, + 0,233,255,255,255,255,41,22,218,10,105,115,105,110,115,116, + 97,110,99,101,218,3,115,116,114,218,2,111,115,90,8,102, + 115,100,101,99,111,100,101,114,3,0,0,0,218,12,97,108, + 116,95,112,97,116,104,95,115,101,112,218,7,114,101,112,108, + 97,99,101,218,8,112,97,116,104,95,115,101,112,218,19,95, + 98,111,111,116,115,116,114,97,112,95,101,120,116,101,114,110, + 97,108,90,10,95,112,97,116,104,95,115,116,97,116,218,7, + 79,83,69,114,114,111,114,218,10,86,97,108,117,101,69,114, + 114,111,114,90,11,95,112,97,116,104,95,115,112,108,105,116, + 218,6,97,112,112,101,110,100,90,7,115,116,95,109,111,100, + 101,218,20,95,122,105,112,95,100,105,114,101,99,116,111,114, + 121,95,99,97,99,104,101,218,8,75,101,121,69,114,114,111, + 114,218,15,95,114,101,97,100,95,100,105,114,101,99,116,111, + 114,121,218,6,95,102,105,108,101,115,218,7,97,114,99,104, + 105,118,101,218,10,95,112,97,116,104,95,106,111,105,110,218, + 6,112,114,101,102,105,120,41,8,218,4,115,101,108,102,114, + 13,0,0,0,114,17,0,0,0,114,31,0,0,0,90,2, + 115,116,90,7,100,105,114,110,97,109,101,90,8,98,97,115, + 101,110,97,109,101,218,5,102,105,108,101,115,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,8,95,95,105, + 110,105,116,95,95,64,0,0,0,115,64,0,0,0,10,1, + 8,1,10,1,4,1,12,1,4,1,12,1,4,2,2,1, + 2,1,14,1,16,1,14,3,8,1,12,1,4,1,16,1, + 14,3,12,2,2,241,2,18,12,1,12,1,8,1,14,1, + 6,1,6,1,22,2,8,1,18,1,4,255,255,128,122,20, + 122,105,112,105,109,112,111,114,116,101,114,46,95,95,105,110, + 105,116,95,95,78,99,3,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,4,0,0,0,67,0,0,0,115,78, + 0,0,0,116,0,124,0,124,1,131,2,125,3,124,3,100, + 1,117,1,114,26,124,0,103,0,102,2,83,0,116,1,124, + 0,124,1,131,2,125,4,116,2,124,0,124,4,131,2,114, + 70,100,1,124,0,106,3,155,0,116,4,155,0,124,4,155, + 0,157,3,103,1,102,2,83,0,100,1,103,0,102,2,83, + 0,41,2,97,47,2,0,0,102,105,110,100,95,108,111,97, + 100,101,114,40,102,117,108,108,110,97,109,101,44,32,112,97, + 116,104,61,78,111,110,101,41,32,45,62,32,115,101,108,102, + 44,32,115,116,114,32,111,114,32,78,111,110,101,46,10,10, + 32,32,32,32,32,32,32,32,83,101,97,114,99,104,32,102, + 111,114,32,97,32,109,111,100,117,108,101,32,115,112,101,99, + 105,102,105,101,100,32,98,121,32,39,102,117,108,108,110,97, + 109,101,39,46,32,39,102,117,108,108,110,97,109,101,39,32, + 109,117,115,116,32,98,101,32,116,104,101,10,32,32,32,32, + 32,32,32,32,102,117,108,108,121,32,113,117,97,108,105,102, + 105,101,100,32,40,100,111,116,116,101,100,41,32,109,111,100, + 117,108,101,32,110,97,109,101,46,32,73,116,32,114,101,116, + 117,114,110,115,32,116,104,101,32,122,105,112,105,109,112,111, + 114,116,101,114,10,32,32,32,32,32,32,32,32,105,110,115, + 116,97,110,99,101,32,105,116,115,101,108,102,32,105,102,32, + 116,104,101,32,109,111,100,117,108,101,32,119,97,115,32,102, + 111,117,110,100,44,32,97,32,115,116,114,105,110,103,32,99, + 111,110,116,97,105,110,105,110,103,32,116,104,101,10,32,32, + 32,32,32,32,32,32,102,117,108,108,32,112,97,116,104,32, + 110,97,109,101,32,105,102,32,105,116,39,115,32,112,111,115, + 115,105,98,108,121,32,97,32,112,111,114,116,105,111,110,32, + 111,102,32,97,32,110,97,109,101,115,112,97,99,101,32,112, + 97,99,107,97,103,101,44,10,32,32,32,32,32,32,32,32, + 111,114,32,78,111,110,101,32,111,116,104,101,114,119,105,115, + 101,46,32,84,104,101,32,111,112,116,105,111,110,97,108,32, + 39,112,97,116,104,39,32,97,114,103,117,109,101,110,116,32, + 105,115,32,105,103,110,111,114,101,100,32,45,45,32,105,116, + 39,115,10,32,32,32,32,32,32,32,32,116,104,101,114,101, + 32,102,111,114,32,99,111,109,112,97,116,105,98,105,108,105, + 116,121,32,119,105,116,104,32,116,104,101,32,105,109,112,111, + 114,116,101,114,32,112,114,111,116,111,99,111,108,46,10,10, + 32,32,32,32,32,32,32,32,68,101,112,114,101,99,97,116, + 101,100,32,115,105,110,99,101,32,80,121,116,104,111,110,32, + 51,46,49,48,46,32,85,115,101,32,102,105,110,100,95,115, + 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,32, + 32,32,32,32,32,32,32,78,41,5,218,16,95,103,101,116, + 95,109,111,100,117,108,101,95,105,110,102,111,218,16,95,103, + 101,116,95,109,111,100,117,108,101,95,112,97,116,104,218,7, + 95,105,115,95,100,105,114,114,29,0,0,0,114,20,0,0, + 0,41,5,114,32,0,0,0,218,8,102,117,108,108,110,97, + 109,101,114,13,0,0,0,218,2,109,105,218,7,109,111,100, + 112,97,116,104,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,11,102,105,110,100,95,108,111,97,100,101,114, + 110,0,0,0,115,16,0,0,0,10,12,8,1,8,2,10, + 7,10,1,24,4,8,2,255,128,122,23,122,105,112,105,109, + 112,111,114,116,101,114,46,102,105,110,100,95,108,111,97,100, + 101,114,99,3,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,4,0,0,0,67,0,0,0,115,16,0,0,0, + 124,0,160,0,124,1,124,2,161,2,100,1,25,0,83,0, + 41,3,97,203,1,0,0,102,105,110,100,95,109,111,100,117, + 108,101,40,102,117,108,108,110,97,109,101,44,32,112,97,116, + 104,61,78,111,110,101,41,32,45,62,32,115,101,108,102,32, + 111,114,32,78,111,110,101,46,10,10,32,32,32,32,32,32, + 32,32,83,101,97,114,99,104,32,102,111,114,32,97,32,109, + 111,100,117,108,101,32,115,112,101,99,105,102,105,101,100,32, + 98,121,32,39,102,117,108,108,110,97,109,101,39,46,32,39, + 102,117,108,108,110,97,109,101,39,32,109,117,115,116,32,98, + 101,32,116,104,101,10,32,32,32,32,32,32,32,32,102,117, + 108,108,121,32,113,117,97,108,105,102,105,101,100,32,40,100, + 111,116,116,101,100,41,32,109,111,100,117,108,101,32,110,97, + 109,101,46,32,73,116,32,114,101,116,117,114,110,115,32,116, + 104,101,32,122,105,112,105,109,112,111,114,116,101,114,10,32, + 32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,32, + 105,116,115,101,108,102,32,105,102,32,116,104,101,32,109,111, + 100,117,108,101,32,119,97,115,32,102,111,117,110,100,44,32, + 111,114,32,78,111,110,101,32,105,102,32,105,116,32,119,97, + 115,110,39,116,46,10,32,32,32,32,32,32,32,32,84,104, + 101,32,111,112,116,105,111,110,97,108,32,39,112,97,116,104, + 39,32,97,114,103,117,109,101,110,116,32,105,115,32,105,103, + 110,111,114,101,100,32,45,45,32,105,116,39,115,32,116,104, + 101,114,101,32,102,111,114,32,99,111,109,112,97,116,105,98, + 105,108,105,116,121,10,32,32,32,32,32,32,32,32,119,105, + 116,104,32,116,104,101,32,105,109,112,111,114,116,101,114,32, + 112,114,111,116,111,99,111,108,46,10,10,32,32,32,32,32, + 32,32,32,68,101,112,114,101,99,97,116,101,100,32,115,105, + 110,99,101,32,80,121,116,104,111,110,32,51,46,49,48,46, + 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, + 32,105,110,115,116,101,97,100,46,10,32,32,32,32,32,32, + 32,32,114,0,0,0,0,78,41,1,114,41,0,0,0,41, + 3,114,32,0,0,0,114,38,0,0,0,114,13,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 11,102,105,110,100,95,109,111,100,117,108,101,144,0,0,0, + 115,4,0,0,0,16,11,255,128,122,23,122,105,112,105,109, + 112,111,114,116,101,114,46,102,105,110,100,95,109,111,100,117, + 108,101,99,3,0,0,0,0,0,0,0,0,0,0,0,7, + 0,0,0,5,0,0,0,67,0,0,0,115,108,0,0,0, + 116,0,124,0,124,1,131,2,125,3,124,3,100,1,117,1, + 114,34,116,1,106,2,124,1,124,0,124,3,100,2,141,3, + 83,0,116,3,124,0,124,1,131,2,125,4,116,4,124,0, + 124,4,131,2,114,104,124,0,106,5,155,0,116,6,155,0, + 124,4,155,0,157,3,125,5,116,1,106,7,124,1,100,1, + 100,3,100,4,141,3,125,6,124,6,106,8,160,9,124,5, + 161,1,1,0,124,6,83,0,100,1,83,0,41,5,122,107, + 67,114,101,97,116,101,32,97,32,77,111,100,117,108,101,83, + 112,101,99,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,46,10,10,32, + 32,32,32,32,32,32,32,82,101,116,117,114,110,115,32,78, + 111,110,101,32,105,102,32,116,104,101,32,109,111,100,117,108, + 101,32,99,97,110,110,111,116,32,98,101,32,102,111,117,110, + 100,46,10,32,32,32,32,32,32,32,32,78,41,1,218,10, + 105,115,95,112,97,99,107,97,103,101,84,41,3,218,4,110, + 97,109,101,90,6,108,111,97,100,101,114,114,43,0,0,0, + 41,10,114,35,0,0,0,218,10,95,98,111,111,116,115,116, + 114,97,112,90,16,115,112,101,99,95,102,114,111,109,95,108, + 111,97,100,101,114,114,36,0,0,0,114,37,0,0,0,114, + 29,0,0,0,114,20,0,0,0,90,10,77,111,100,117,108, + 101,83,112,101,99,90,26,115,117,98,109,111,100,117,108,101, + 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, + 115,114,24,0,0,0,41,7,114,32,0,0,0,114,38,0, + 0,0,90,6,116,97,114,103,101,116,90,11,109,111,100,117, + 108,101,95,105,110,102,111,114,40,0,0,0,114,13,0,0, + 0,90,4,115,112,101,99,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,9,102,105,110,100,95,115,112,101, + 99,157,0,0,0,115,26,0,0,0,10,5,8,1,16,1, + 10,7,10,1,18,4,8,1,2,1,6,255,12,2,4,1, + 4,2,255,128,122,21,122,105,112,105,109,112,111,114,116,101, + 114,46,102,105,110,100,95,115,112,101,99,99,2,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0, + 67,0,0,0,115,20,0,0,0,116,0,124,0,124,1,131, + 2,92,3,125,2,125,3,125,4,124,2,83,0,41,2,122, + 163,103,101,116,95,99,111,100,101,40,102,117,108,108,110,97, + 109,101,41,32,45,62,32,99,111,100,101,32,111,98,106,101, + 99,116,46,10,10,32,32,32,32,32,32,32,32,82,101,116, + 117,114,110,32,116,104,101,32,99,111,100,101,32,111,98,106, + 101,99,116,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,46,32,82,97, + 105,115,101,32,90,105,112,73,109,112,111,114,116,69,114,114, + 111,114,10,32,32,32,32,32,32,32,32,105,102,32,116,104, + 101,32,109,111,100,117,108,101,32,99,111,117,108,100,110,39, + 116,32,98,101,32,102,111,117,110,100,46,10,32,32,32,32, + 32,32,32,32,78,169,1,218,16,95,103,101,116,95,109,111, + 100,117,108,101,95,99,111,100,101,169,5,114,32,0,0,0, + 114,38,0,0,0,218,4,99,111,100,101,218,9,105,115,112, + 97,99,107,97,103,101,114,40,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,8,103,101,116,95, + 99,111,100,101,184,0,0,0,115,6,0,0,0,16,6,4, + 1,255,128,122,20,122,105,112,105,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,0,0,0,0,4,0,0,0,8,0,0,0,67,0, + 0,0,115,112,0,0,0,116,0,114,16,124,1,160,1,116, + 0,116,2,161,2,125,1,124,1,125,2,124,1,160,3,124, + 0,106,4,116,2,23,0,161,1,114,58,124,1,116,5,124, + 0,106,4,116,2,23,0,131,1,100,1,133,2,25,0,125, + 2,122,14,124,0,106,6,124,2,25,0,125,3,87,0,110, + 26,4,0,116,7,121,98,1,0,1,0,1,0,116,8,100, + 2,100,3,124,2,131,3,130,1,48,0,116,9,124,0,106, + 4,124,3,131,2,83,0,41,4,122,154,103,101,116,95,100, + 97,116,97,40,112,97,116,104,110,97,109,101,41,32,45,62, + 32,115,116,114,105,110,103,32,119,105,116,104,32,102,105,108, + 101,32,100,97,116,97,46,10,10,32,32,32,32,32,32,32, + 32,82,101,116,117,114,110,32,116,104,101,32,100,97,116,97, + 32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104, + 32,39,112,97,116,104,110,97,109,101,39,46,32,82,97,105, + 115,101,32,79,83,69,114,114,111,114,32,105,102,10,32,32, + 32,32,32,32,32,32,116,104,101,32,102,105,108,101,32,119, + 97,115,110,39,116,32,102,111,117,110,100,46,10,32,32,32, + 32,32,32,32,32,78,114,0,0,0,0,218,0,41,10,114, + 18,0,0,0,114,19,0,0,0,114,20,0,0,0,218,10, + 115,116,97,114,116,115,119,105,116,104,114,29,0,0,0,218, + 3,108,101,110,114,28,0,0,0,114,26,0,0,0,114,22, + 0,0,0,218,9,95,103,101,116,95,100,97,116,97,41,4, + 114,32,0,0,0,218,8,112,97,116,104,110,97,109,101,90, + 3,107,101,121,218,9,116,111,99,95,101,110,116,114,121,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, + 103,101,116,95,100,97,116,97,194,0,0,0,115,22,0,0, + 0,4,6,12,1,4,2,16,1,22,1,2,2,14,1,12, + 1,14,1,12,1,255,128,122,20,122,105,112,105,109,112,111, + 114,116,101,114,46,103,101,116,95,100,97,116,97,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,0, + 0,0,67,0,0,0,115,20,0,0,0,116,0,124,0,124, + 1,131,2,92,3,125,2,125,3,125,4,124,4,83,0,41, + 2,122,106,103,101,116,95,102,105,108,101,110,97,109,101,40, + 102,117,108,108,110,97,109,101,41,32,45,62,32,102,105,108, + 101,110,97,109,101,32,115,116,114,105,110,103,46,10,10,32, + 32,32,32,32,32,32,32,82,101,116,117,114,110,32,116,104, + 101,32,102,105,108,101,110,97,109,101,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,46,32,82,97,105,115,101,32,90,105,112,73,109, - 112,111,114,116,69,114,114,111,114,10,32,32,32,32,32,32, - 32,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32, - 99,111,117,108,100,110,39,116,32,98,101,32,102,111,117,110, - 100,46,10,32,32,32,32,32,32,32,32,78,169,1,218,16, - 95,103,101,116,95,109,111,100,117,108,101,95,99,111,100,101, - 169,5,114,32,0,0,0,114,38,0,0,0,218,4,99,111, - 100,101,218,9,105,115,112,97,99,107,97,103,101,114,40,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,8,103,101,116,95,99,111,100,101,184,0,0,0,115, - 6,0,0,0,16,6,4,1,255,128,122,20,122,105,112,105, - 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,0,0,0,0,4,0,0, - 0,8,0,0,0,67,0,0,0,115,112,0,0,0,116,0, - 114,16,124,1,160,1,116,0,116,2,161,2,125,1,124,1, - 125,2,124,1,160,3,124,0,106,4,116,2,23,0,161,1, - 114,58,124,1,116,5,124,0,106,4,116,2,23,0,131,1, - 100,1,133,2,25,0,125,2,122,14,124,0,106,6,124,2, - 25,0,125,3,87,0,110,26,4,0,116,7,121,98,1,0, - 1,0,1,0,116,8,100,2,100,3,124,2,131,3,130,1, - 48,0,116,9,124,0,106,4,124,3,131,2,83,0,41,4, - 122,154,103,101,116,95,100,97,116,97,40,112,97,116,104,110, - 97,109,101,41,32,45,62,32,115,116,114,105,110,103,32,119, - 105,116,104,32,102,105,108,101,32,100,97,116,97,46,10,10, - 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,116, - 104,101,32,100,97,116,97,32,97,115,115,111,99,105,97,116, - 101,100,32,119,105,116,104,32,39,112,97,116,104,110,97,109, - 101,39,46,32,82,97,105,115,101,32,79,83,69,114,114,111, - 114,32,105,102,10,32,32,32,32,32,32,32,32,116,104,101, - 32,102,105,108,101,32,119,97,115,110,39,116,32,102,111,117, - 110,100,46,10,32,32,32,32,32,32,32,32,78,114,0,0, - 0,0,218,0,41,10,114,18,0,0,0,114,19,0,0,0, - 114,20,0,0,0,218,10,115,116,97,114,116,115,119,105,116, - 104,114,29,0,0,0,218,3,108,101,110,114,28,0,0,0, - 114,26,0,0,0,114,22,0,0,0,218,9,95,103,101,116, - 95,100,97,116,97,41,4,114,32,0,0,0,218,8,112,97, - 116,104,110,97,109,101,90,3,107,101,121,218,9,116,111,99, - 95,101,110,116,114,121,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,8,103,101,116,95,100,97,116,97,194, - 0,0,0,115,22,0,0,0,4,6,12,1,4,2,16,1, - 22,1,2,2,14,1,12,1,14,1,12,1,255,128,122,20, - 122,105,112,105,109,112,111,114,116,101,114,46,103,101,116,95, - 100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,3,0,0,0,67,0,0,0,115,20,0, - 0,0,116,0,124,0,124,1,131,2,92,3,125,2,125,3, - 125,4,124,4,83,0,41,2,122,106,103,101,116,95,102,105, - 108,101,110,97,109,101,40,102,117,108,108,110,97,109,101,41, - 32,45,62,32,102,105,108,101,110,97,109,101,32,115,116,114, + 117,108,101,46,10,32,32,32,32,32,32,32,32,78,114,47, + 0,0,0,114,49,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,12,103,101,116,95,102,105,108, + 101,110,97,109,101,215,0,0,0,115,6,0,0,0,16,7, + 4,1,255,128,122,24,122,105,112,105,109,112,111,114,116,101, + 114,46,103,101,116,95,102,105,108,101,110,97,109,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,8, + 0,0,0,67,0,0,0,115,126,0,0,0,116,0,124,0, + 124,1,131,2,125,2,124,2,100,1,117,0,114,36,116,1, + 100,2,124,1,155,2,157,2,124,1,100,3,141,2,130,1, + 116,2,124,0,124,1,131,2,125,3,124,2,114,64,116,3, + 160,4,124,3,100,4,161,2,125,4,110,10,124,3,155,0, + 100,5,157,2,125,4,122,14,124,0,106,5,124,4,25,0, + 125,5,87,0,110,20,4,0,116,6,121,108,1,0,1,0, + 1,0,89,0,100,1,83,0,48,0,116,7,124,0,106,8, + 124,5,131,2,160,9,161,0,83,0,41,6,122,253,103,101, + 116,95,115,111,117,114,99,101,40,102,117,108,108,110,97,109, + 101,41,32,45,62,32,115,111,117,114,99,101,32,115,116,114, 105,110,103,46,10,10,32,32,32,32,32,32,32,32,82,101, - 116,117,114,110,32,116,104,101,32,102,105,108,101,110,97,109, - 101,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,46,10,32,32,32,32, - 32,32,32,32,78,114,47,0,0,0,114,49,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,12, - 103,101,116,95,102,105,108,101,110,97,109,101,215,0,0,0, - 115,6,0,0,0,16,7,4,1,255,128,122,24,122,105,112, - 105,109,112,111,114,116,101,114,46,103,101,116,95,102,105,108, - 101,110,97,109,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,6,0,0,0,8,0,0,0,67,0,0,0,115,126, - 0,0,0,116,0,124,0,124,1,131,2,125,2,124,2,100, - 1,117,0,114,36,116,1,100,2,124,1,155,2,157,2,124, - 1,100,3,141,2,130,1,116,2,124,0,124,1,131,2,125, - 3,124,2,114,64,116,3,160,4,124,3,100,4,161,2,125, - 4,110,10,124,3,155,0,100,5,157,2,125,4,122,14,124, - 0,106,5,124,4,25,0,125,5,87,0,110,20,4,0,116, - 6,121,108,1,0,1,0,1,0,89,0,100,1,83,0,48, - 0,116,7,124,0,106,8,124,5,131,2,160,9,161,0,83, - 0,41,6,122,253,103,101,116,95,115,111,117,114,99,101,40, - 102,117,108,108,110,97,109,101,41,32,45,62,32,115,111,117, - 114,99,101,32,115,116,114,105,110,103,46,10,10,32,32,32, - 32,32,32,32,32,82,101,116,117,114,110,32,116,104,101,32, - 115,111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32,90,105,112,73, - 109,112,111,114,116,69,114,114,111,114,10,32,32,32,32,32, - 32,32,32,105,102,32,116,104,101,32,109,111,100,117,108,101, - 32,99,111,117,108,100,110,39,116,32,98,101,32,102,111,117, - 110,100,44,32,114,101,116,117,114,110,32,78,111,110,101,32, - 105,102,32,116,104,101,32,97,114,99,104,105,118,101,32,100, - 111,101,115,10,32,32,32,32,32,32,32,32,99,111,110,116, - 97,105,110,32,116,104,101,32,109,111,100,117,108,101,44,32, - 98,117,116,32,104,97,115,32,110,111,32,115,111,117,114,99, - 101,32,102,111,114,32,105,116,46,10,32,32,32,32,32,32, - 32,32,78,250,18,99,97,110,39,116,32,102,105,110,100,32, - 109,111,100,117,108,101,32,169,1,114,44,0,0,0,250,11, - 95,95,105,110,105,116,95,95,46,112,121,250,3,46,112,121, - 41,10,114,35,0,0,0,114,3,0,0,0,114,36,0,0, - 0,114,21,0,0,0,114,30,0,0,0,114,28,0,0,0, - 114,26,0,0,0,114,56,0,0,0,114,29,0,0,0,218, - 6,100,101,99,111,100,101,41,6,114,32,0,0,0,114,38, - 0,0,0,114,39,0,0,0,114,13,0,0,0,218,8,102, - 117,108,108,112,97,116,104,114,58,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,10,103,101,116, - 95,115,111,117,114,99,101,226,0,0,0,115,26,0,0,0, - 10,7,8,1,18,1,10,2,4,1,14,1,10,2,2,2, - 14,1,12,1,8,2,16,1,255,128,122,22,122,105,112,105, - 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,0,0,0,0,3, - 0,0,0,4,0,0,0,67,0,0,0,115,40,0,0,0, - 116,0,124,0,124,1,131,2,125,2,124,2,100,1,117,0, - 114,36,116,1,100,2,124,1,155,2,157,2,124,1,100,3, - 141,2,130,1,124,2,83,0,41,4,122,171,105,115,95,112, - 97,99,107,97,103,101,40,102,117,108,108,110,97,109,101,41, - 32,45,62,32,98,111,111,108,46,10,10,32,32,32,32,32, - 32,32,32,82,101,116,117,114,110,32,84,114,117,101,32,105, - 102,32,116,104,101,32,109,111,100,117,108,101,32,115,112,101, - 99,105,102,105,101,100,32,98,121,32,102,117,108,108,110,97, - 109,101,32,105,115,32,97,32,112,97,99,107,97,103,101,46, - 10,32,32,32,32,32,32,32,32,82,97,105,115,101,32,90, - 105,112,73,109,112,111,114,116,69,114,114,111,114,32,105,102, - 32,116,104,101,32,109,111,100,117,108,101,32,99,111,117,108, - 100,110,39,116,32,98,101,32,102,111,117,110,100,46,10,32, - 32,32,32,32,32,32,32,78,114,61,0,0,0,114,62,0, - 0,0,41,2,114,35,0,0,0,114,3,0,0,0,41,3, - 114,32,0,0,0,114,38,0,0,0,114,39,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,43, - 0,0,0,252,0,0,0,115,10,0,0,0,10,6,8,1, - 18,1,4,1,255,128,122,22,122,105,112,105,109,112,111,114, - 116,101,114,46,105,115,95,112,97,99,107,97,103,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,8, - 0,0,0,67,0,0,0,115,252,0,0,0,100,1,125,2, - 116,0,160,1,124,2,116,2,161,2,1,0,116,3,124,0, - 124,1,131,2,92,3,125,3,125,4,125,5,116,4,106,5, - 160,6,124,1,161,1,125,6,124,6,100,2,117,0,115,62, - 116,7,124,6,116,8,131,2,115,80,116,8,124,1,131,1, - 125,6,124,6,116,4,106,5,124,1,60,0,124,0,124,6, - 95,9,122,84,124,4,114,124,116,10,124,0,124,1,131,2, - 125,7,116,11,160,12,124,0,106,13,124,7,161,2,125,8, - 124,8,103,1,124,6,95,14,116,15,124,6,100,3,131,2, - 115,140,116,16,124,6,95,16,116,11,160,17,124,6,106,18, - 124,1,124,5,161,3,1,0,116,19,124,3,124,6,106,18, - 131,2,1,0,87,0,110,16,1,0,1,0,1,0,116,4, - 106,5,124,1,61,0,130,0,122,14,116,4,106,5,124,1, - 25,0,125,6,87,0,110,30,4,0,116,20,121,232,1,0, - 1,0,1,0,116,21,100,4,124,1,155,2,100,5,157,3, - 131,1,130,1,48,0,116,22,160,23,100,6,124,1,124,5, - 161,3,1,0,124,6,83,0,41,7,97,55,1,0,0,108, - 111,97,100,95,109,111,100,117,108,101,40,102,117,108,108,110, - 97,109,101,41,32,45,62,32,109,111,100,117,108,101,46,10, - 10,32,32,32,32,32,32,32,32,76,111,97,100,32,116,104, - 101,32,109,111,100,117,108,101,32,115,112,101,99,105,102,105, - 101,100,32,98,121,32,39,102,117,108,108,110,97,109,101,39, - 46,32,39,102,117,108,108,110,97,109,101,39,32,109,117,115, - 116,32,98,101,32,116,104,101,10,32,32,32,32,32,32,32, - 32,102,117,108,108,121,32,113,117,97,108,105,102,105,101,100, - 32,40,100,111,116,116,101,100,41,32,109,111,100,117,108,101, - 32,110,97,109,101,46,32,73,116,32,114,101,116,117,114,110, - 115,32,116,104,101,32,105,109,112,111,114,116,101,100,10,32, - 32,32,32,32,32,32,32,109,111,100,117,108,101,44,32,111, - 114,32,114,97,105,115,101,115,32,90,105,112,73,109,112,111, - 114,116,69,114,114,111,114,32,105,102,32,105,116,32,119,97, - 115,110,39,116,32,102,111,117,110,100,46,10,10,32,32,32, - 32,32,32,32,32,68,101,112,114,101,99,97,116,101,100,32, - 115,105,110,99,101,32,80,121,116,104,111,110,32,51,46,49, - 48,46,32,85,115,101,32,101,120,101,99,95,109,111,100,117, - 108,101,40,41,32,105,110,115,116,101,97,100,46,10,32,32, - 32,32,32,32,32,32,122,114,122,105,112,105,109,112,111,114, - 116,46,122,105,112,105,109,112,111,114,116,101,114,46,108,111, - 97,100,95,109,111,100,117,108,101,40,41,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,32,97,110,100,32,115,108, - 97,116,101,100,32,102,111,114,32,114,101,109,111,118,97,108, - 32,105,110,32,80,121,116,104,111,110,32,51,46,49,50,59, - 32,117,115,101,32,101,120,101,99,95,109,111,100,117,108,101, - 40,41,32,105,110,115,116,101,97,100,78,218,12,95,95,98, - 117,105,108,116,105,110,115,95,95,122,14,76,111,97,100,101, - 100,32,109,111,100,117,108,101,32,122,25,32,110,111,116,32, - 102,111,117,110,100,32,105,110,32,115,121,115,46,109,111,100, - 117,108,101,115,122,30,105,109,112,111,114,116,32,123,125,32, - 35,32,108,111,97,100,101,100,32,102,114,111,109,32,90,105, - 112,32,123,125,41,24,218,9,95,119,97,114,110,105,110,103, - 115,90,4,119,97,114,110,218,18,68,101,112,114,101,99,97, - 116,105,111,110,87,97,114,110,105,110,103,114,48,0,0,0, - 218,3,115,121,115,218,7,109,111,100,117,108,101,115,218,3, - 103,101,116,114,15,0,0,0,218,12,95,109,111,100,117,108, - 101,95,116,121,112,101,218,10,95,95,108,111,97,100,101,114, - 95,95,114,36,0,0,0,114,21,0,0,0,114,30,0,0, - 0,114,29,0,0,0,90,8,95,95,112,97,116,104,95,95, - 218,7,104,97,115,97,116,116,114,114,68,0,0,0,90,14, - 95,102,105,120,95,117,112,95,109,111,100,117,108,101,218,8, - 95,95,100,105,99,116,95,95,218,4,101,120,101,99,114,26, - 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, - 114,45,0,0,0,218,16,95,118,101,114,98,111,115,101,95, - 109,101,115,115,97,103,101,41,9,114,32,0,0,0,114,38, - 0,0,0,218,3,109,115,103,114,50,0,0,0,114,51,0, - 0,0,114,40,0,0,0,90,3,109,111,100,114,13,0,0, - 0,114,66,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,11,108,111,97,100,95,109,111,100,117, - 108,101,9,1,0,0,115,54,0,0,0,4,9,12,2,16, - 1,12,1,18,1,8,1,10,1,6,1,2,2,4,1,10, - 3,14,1,8,1,10,2,6,1,16,1,16,1,6,1,8, - 1,2,1,2,2,14,1,12,1,18,1,14,1,4,1,255, - 128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0,0,8,0,0,0,67, - 0,0,0,115,64,0,0,0,122,20,124,0,160,0,124,1, - 161,1,115,18,87,0,100,1,83,0,87,0,110,20,4,0, - 116,1,121,40,1,0,1,0,1,0,89,0,100,1,83,0, - 48,0,100,2,100,3,108,2,109,3,125,2,1,0,124,2, - 124,0,124,1,131,2,83,0,41,4,122,204,82,101,116,117, - 114,110,32,116,104,101,32,82,101,115,111,117,114,99,101,82, - 101,97,100,101,114,32,102,111,114,32,97,32,112,97,99,107, - 97,103,101,32,105,110,32,97,32,122,105,112,32,102,105,108, - 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,39, - 102,117,108,108,110,97,109,101,39,32,105,115,32,97,32,112, - 97,99,107,97,103,101,32,119,105,116,104,105,110,32,116,104, - 101,32,122,105,112,32,102,105,108,101,44,32,114,101,116,117, - 114,110,32,116,104,101,10,32,32,32,32,32,32,32,32,39, - 82,101,115,111,117,114,99,101,82,101,97,100,101,114,39,32, - 111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,112, - 97,99,107,97,103,101,46,32,32,79,116,104,101,114,119,105, - 115,101,32,114,101,116,117,114,110,32,78,111,110,101,46,10, - 32,32,32,32,32,32,32,32,78,114,0,0,0,0,41,1, - 218,9,90,105,112,82,101,97,100,101,114,41,4,114,43,0, - 0,0,114,3,0,0,0,90,17,105,109,112,111,114,116,108, - 105,98,46,114,101,97,100,101,114,115,114,83,0,0,0,41, - 3,114,32,0,0,0,114,38,0,0,0,114,83,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 19,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, - 97,100,101,114,52,1,0,0,115,16,0,0,0,2,6,10, - 1,10,1,12,1,8,1,12,1,10,1,255,128,122,31,122, - 105,112,105,109,112,111,114,116,101,114,46,103,101,116,95,114, - 101,115,111,117,114,99,101,95,114,101,97,100,101,114,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5, - 0,0,0,67,0,0,0,115,24,0,0,0,100,1,124,0, - 106,0,155,0,116,1,155,0,124,0,106,2,155,0,100,2, - 157,5,83,0,41,3,78,122,21,60,122,105,112,105,109,112, - 111,114,116,101,114,32,111,98,106,101,99,116,32,34,122,2, - 34,62,41,3,114,29,0,0,0,114,20,0,0,0,114,31, - 0,0,0,41,1,114,32,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,8,95,95,114,101,112, - 114,95,95,67,1,0,0,115,4,0,0,0,24,1,255,128, - 122,20,122,105,112,105,109,112,111,114,116,101,114,46,95,95, - 114,101,112,114,95,95,41,1,78,41,1,78,41,1,78,41, - 16,114,6,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,7,95,95,100,111,99,95,95,114,34,0,0,0,114,41, - 0,0,0,114,42,0,0,0,114,46,0,0,0,114,52,0, - 0,0,114,59,0,0,0,114,60,0,0,0,114,67,0,0, - 0,114,43,0,0,0,114,82,0,0,0,114,84,0,0,0, - 114,85,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,4,0,0,0,46,0, - 0,0,115,30,0,0,0,8,0,4,1,8,17,10,46,10, - 34,10,13,8,27,8,10,8,21,8,11,8,26,8,13,8, - 43,12,15,255,128,122,12,95,95,105,110,105,116,95,95,46, - 112,121,99,84,114,63,0,0,0,70,41,3,122,4,46,112, - 121,99,84,70,41,3,114,64,0,0,0,70,70,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, - 0,0,67,0,0,0,115,20,0,0,0,124,0,106,0,124, - 1,160,1,100,1,161,1,100,2,25,0,23,0,83,0,41, - 3,78,218,1,46,233,2,0,0,0,41,2,114,31,0,0, - 0,218,10,114,112,97,114,116,105,116,105,111,110,41,2,114, - 32,0,0,0,114,38,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,36,0,0,0,85,1,0, - 0,115,4,0,0,0,20,1,255,128,114,36,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 2,0,0,0,67,0,0,0,115,18,0,0,0,124,1,116, - 0,23,0,125,2,124,2,124,0,106,1,118,0,83,0,169, - 1,78,41,2,114,20,0,0,0,114,28,0,0,0,41,3, - 114,32,0,0,0,114,13,0,0,0,90,7,100,105,114,112, - 97,116,104,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,37,0,0,0,89,1,0,0,115,6,0,0,0, - 8,4,10,2,255,128,114,37,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,7,0,0,0,4,0,0,0, - 67,0,0,0,115,54,0,0,0,116,0,124,0,124,1,131, - 2,125,2,116,1,68,0,93,34,92,3,125,3,125,4,125, - 5,124,2,124,3,23,0,125,6,124,6,124,0,106,2,118, - 0,114,14,124,5,2,0,1,0,83,0,100,0,83,0,114, - 90,0,0,0,41,3,114,36,0,0,0,218,16,95,122,105, - 112,95,115,101,97,114,99,104,111,114,100,101,114,114,28,0, - 0,0,41,7,114,32,0,0,0,114,38,0,0,0,114,13, - 0,0,0,218,6,115,117,102,102,105,120,218,10,105,115,98, - 121,116,101,99,111,100,101,114,51,0,0,0,114,66,0,0, - 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 114,35,0,0,0,98,1,0,0,115,14,0,0,0,10,1, - 14,1,8,1,10,1,8,1,4,1,255,128,114,35,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,26,0, - 0,0,9,0,0,0,67,0,0,0,115,230,4,0,0,122, - 14,116,0,160,1,124,0,161,1,125,1,87,0,110,32,4, - 0,116,2,121,46,1,0,1,0,1,0,116,3,100,1,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,48,0,124, - 1,144,4,143,140,1,0,122,36,124,1,160,4,116,5,11, - 0,100,3,161,2,1,0,124,1,160,6,161,0,125,2,124, - 1,160,7,116,5,161,1,125,3,87,0,110,32,4,0,116, - 2,121,124,1,0,1,0,1,0,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,48,0,116,8,124, - 3,131,1,116,5,107,3,114,156,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,124,3,100,0,100, - 5,133,2,25,0,116,9,107,3,144,1,114,154,122,24,124, - 1,160,4,100,6,100,3,161,2,1,0,124,1,160,6,161, - 0,125,4,87,0,110,32,4,0,116,2,121,230,1,0,1, - 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,48,0,116,10,124,4,116,11,24,0,116, - 5,24,0,100,6,131,2,125,5,122,22,124,1,160,4,124, - 5,161,1,1,0,124,1,160,7,161,0,125,6,87,0,110, - 34,4,0,116,2,144,1,121,50,1,0,1,0,1,0,116, - 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,48,0,124,6,160,12,116,9,161,1,125,7,124,7,100, - 6,107,0,144,1,114,90,116,3,100,7,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,124,6,124,7,124,7,116, - 5,23,0,133,2,25,0,125,3,116,8,124,3,131,1,116, - 5,107,3,144,1,114,138,116,3,100,8,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,124,4,116,8,124,6,131, - 1,24,0,124,7,23,0,125,2,116,13,124,3,100,9,100, - 10,133,2,25,0,131,1,125,8,116,13,124,3,100,10,100, - 11,133,2,25,0,131,1,125,9,124,2,124,8,107,0,144, - 1,114,214,116,3,100,12,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,124,2,124,9,107,0,144,1,114,242,116, - 3,100,13,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,124,2,124,8,56,0,125,2,124,2,124,9,24,0,125, - 10,124,10,100,6,107,0,144,2,114,30,116,3,100,14,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,105,0,125, - 11,100,6,125,12,122,14,124,1,160,4,124,2,161,1,1, - 0,87,0,110,34,4,0,116,2,144,2,121,86,1,0,1, - 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,48,0,124,1,160,7,100,15,161,1,125, - 3,116,8,124,3,131,1,100,5,107,0,144,2,114,120,116, - 14,100,16,131,1,130,1,124,3,100,0,100,5,133,2,25, - 0,100,17,107,3,144,2,114,142,144,4,113,180,116,8,124, - 3,131,1,100,15,107,3,144,2,114,164,116,14,100,16,131, - 1,130,1,116,15,124,3,100,18,100,19,133,2,25,0,131, - 1,125,13,116,15,124,3,100,19,100,9,133,2,25,0,131, - 1,125,14,116,15,124,3,100,9,100,20,133,2,25,0,131, - 1,125,15,116,15,124,3,100,20,100,10,133,2,25,0,131, - 1,125,16,116,13,124,3,100,10,100,11,133,2,25,0,131, - 1,125,17,116,13,124,3,100,11,100,21,133,2,25,0,131, - 1,125,18,116,13,124,3,100,21,100,22,133,2,25,0,131, - 1,125,4,116,15,124,3,100,22,100,23,133,2,25,0,131, - 1,125,19,116,15,124,3,100,23,100,24,133,2,25,0,131, - 1,125,20,116,15,124,3,100,24,100,25,133,2,25,0,131, - 1,125,21,116,13,124,3,100,26,100,15,133,2,25,0,131, - 1,125,22,124,19,124,20,23,0,124,21,23,0,125,8,124, - 22,124,9,107,4,144,3,114,124,116,3,100,27,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,124,22,124,10,55, - 0,125,22,122,14,124,1,160,7,124,19,161,1,125,23,87, - 0,110,34,4,0,116,2,144,3,121,180,1,0,1,0,1, - 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,48,0,116,8,124,23,131,1,124,19,107,3,144, - 3,114,214,116,3,100,4,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,122,50,116,8,124,1,160,7,124,8,124, - 19,24,0,161,1,131,1,124,8,124,19,24,0,107,3,144, - 4,114,6,116,3,100,4,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,87,0,110,34,4,0,116,2,144,4,121, - 42,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,48,0,124,13,100,28,64, - 0,144,4,114,64,124,23,160,16,161,0,125,23,110,52,122, - 14,124,23,160,16,100,29,161,1,125,23,87,0,110,36,4, - 0,116,17,144,4,121,114,1,0,1,0,1,0,124,23,160, - 16,100,30,161,1,160,18,116,19,161,1,125,23,89,0,110, - 2,48,0,124,23,160,20,100,31,116,21,161,2,125,23,116, - 22,160,23,124,0,124,23,161,2,125,24,124,24,124,14,124, - 18,124,4,124,22,124,15,124,16,124,17,102,8,125,25,124, - 25,124,11,124,23,60,0,124,12,100,32,55,0,125,12,144, - 2,113,88,87,0,100,0,4,0,4,0,131,3,1,0,110, - 18,49,0,144,4,115,202,48,0,1,0,1,0,1,0,89, - 0,1,0,116,24,160,25,100,33,124,12,124,0,161,3,1, - 0,124,11,83,0,41,34,78,122,21,99,97,110,39,116,32, - 111,112,101,110,32,90,105,112,32,102,105,108,101,58,32,114, - 12,0,0,0,114,88,0,0,0,250,21,99,97,110,39,116, - 32,114,101,97,100,32,90,105,112,32,102,105,108,101,58,32, - 233,4,0,0,0,114,0,0,0,0,122,16,110,111,116,32, - 97,32,90,105,112,32,102,105,108,101,58,32,122,18,99,111, - 114,114,117,112,116,32,90,105,112,32,102,105,108,101,58,32, - 233,12,0,0,0,233,16,0,0,0,233,20,0,0,0,122, - 28,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, - 101,99,116,111,114,121,32,115,105,122,101,58,32,122,30,98, - 97,100,32,99,101,110,116,114,97,108,32,100,105,114,101,99, - 116,111,114,121,32,111,102,102,115,101,116,58,32,122,38,98, - 97,100,32,99,101,110,116,114,97,108,32,100,105,114,101,99, - 116,111,114,121,32,115,105,122,101,32,111,114,32,111,102,102, - 115,101,116,58,32,233,46,0,0,0,250,27,69,79,70,32, - 114,101,97,100,32,119,104,101,114,101,32,110,111,116,32,101, - 120,112,101,99,116,101,100,115,4,0,0,0,80,75,1,2, - 233,8,0,0,0,233,10,0,0,0,233,14,0,0,0,233, - 24,0,0,0,233,28,0,0,0,233,30,0,0,0,233,32, - 0,0,0,233,34,0,0,0,233,42,0,0,0,122,25,98, - 97,100,32,108,111,99,97,108,32,104,101,97,100,101,114,32, - 111,102,102,115,101,116,58,32,105,0,8,0,0,218,5,97, - 115,99,105,105,90,6,108,97,116,105,110,49,250,1,47,114, - 5,0,0,0,122,33,122,105,112,105,109,112,111,114,116,58, - 32,102,111,117,110,100,32,123,125,32,110,97,109,101,115,32, - 105,110,32,123,33,114,125,41,26,218,3,95,105,111,218,9, - 111,112,101,110,95,99,111,100,101,114,22,0,0,0,114,3, - 0,0,0,218,4,115,101,101,107,218,20,69,78,68,95,67, - 69,78,84,82,65,76,95,68,73,82,95,83,73,90,69,90, - 4,116,101,108,108,218,4,114,101,97,100,114,55,0,0,0, - 218,18,83,84,82,73,78,71,95,69,78,68,95,65,82,67, - 72,73,86,69,218,3,109,97,120,218,15,77,65,88,95,67, - 79,77,77,69,78,84,95,76,69,78,218,5,114,102,105,110, - 100,114,2,0,0,0,218,8,69,79,70,69,114,114,111,114, - 114,1,0,0,0,114,65,0,0,0,218,18,85,110,105,99, - 111,100,101,68,101,99,111,100,101,69,114,114,111,114,218,9, - 116,114,97,110,115,108,97,116,101,218,11,99,112,52,51,55, - 95,116,97,98,108,101,114,19,0,0,0,114,20,0,0,0, - 114,21,0,0,0,114,30,0,0,0,114,45,0,0,0,114, - 80,0,0,0,41,26,114,29,0,0,0,218,2,102,112,90, - 15,104,101,97,100,101,114,95,112,111,115,105,116,105,111,110, - 218,6,98,117,102,102,101,114,218,9,102,105,108,101,95,115, - 105,122,101,90,17,109,97,120,95,99,111,109,109,101,110,116, - 95,115,116,97,114,116,218,4,100,97,116,97,90,3,112,111, - 115,218,11,104,101,97,100,101,114,95,115,105,122,101,90,13, - 104,101,97,100,101,114,95,111,102,102,115,101,116,90,10,97, - 114,99,95,111,102,102,115,101,116,114,33,0,0,0,218,5, - 99,111,117,110,116,218,5,102,108,97,103,115,218,8,99,111, - 109,112,114,101,115,115,218,4,116,105,109,101,218,4,100,97, - 116,101,218,3,99,114,99,218,9,100,97,116,97,95,115,105, - 122,101,218,9,110,97,109,101,95,115,105,122,101,218,10,101, - 120,116,114,97,95,115,105,122,101,90,12,99,111,109,109,101, - 110,116,95,115,105,122,101,218,11,102,105,108,101,95,111,102, - 102,115,101,116,114,44,0,0,0,114,13,0,0,0,218,1, - 116,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 114,27,0,0,0,129,1,0,0,115,214,0,0,0,2,1, - 14,1,12,1,20,1,8,2,2,1,14,1,8,1,14,1, - 12,1,20,1,12,1,18,1,18,1,2,3,12,1,12,1, - 12,1,10,1,2,1,8,255,8,2,2,1,2,255,2,1, - 4,255,2,2,10,1,12,1,14,1,10,1,2,1,8,255, - 10,2,10,1,10,1,2,1,6,255,16,2,14,1,10,1, - 2,1,6,255,16,2,16,2,16,1,10,1,18,1,10,1, - 18,1,8,1,8,1,10,1,18,1,4,2,4,2,2,1, - 14,1,14,1,20,1,10,2,14,1,8,1,18,2,4,1, - 14,1,8,1,16,1,16,1,16,1,16,1,16,1,16,1, - 16,1,16,1,16,1,16,1,16,1,12,1,10,1,18,1, - 8,1,2,2,14,1,14,1,20,1,14,1,18,1,2,4, - 28,1,22,1,14,1,20,1,10,2,10,2,2,3,14,1, - 14,1,22,1,12,2,12,1,20,1,8,1,44,1,14,1, + 116,117,114,110,32,116,104,101,32,115,111,117,114,99,101,32, + 99,111,100,101,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,46,32,82, + 97,105,115,101,32,90,105,112,73,109,112,111,114,116,69,114, + 114,111,114,10,32,32,32,32,32,32,32,32,105,102,32,116, + 104,101,32,109,111,100,117,108,101,32,99,111,117,108,100,110, + 39,116,32,98,101,32,102,111,117,110,100,44,32,114,101,116, + 117,114,110,32,78,111,110,101,32,105,102,32,116,104,101,32, + 97,114,99,104,105,118,101,32,100,111,101,115,10,32,32,32, + 32,32,32,32,32,99,111,110,116,97,105,110,32,116,104,101, + 32,109,111,100,117,108,101,44,32,98,117,116,32,104,97,115, + 32,110,111,32,115,111,117,114,99,101,32,102,111,114,32,105, + 116,46,10,32,32,32,32,32,32,32,32,78,250,18,99,97, + 110,39,116,32,102,105,110,100,32,109,111,100,117,108,101,32, + 169,1,114,44,0,0,0,250,11,95,95,105,110,105,116,95, + 95,46,112,121,250,3,46,112,121,41,10,114,35,0,0,0, + 114,3,0,0,0,114,36,0,0,0,114,21,0,0,0,114, + 30,0,0,0,114,28,0,0,0,114,26,0,0,0,114,56, + 0,0,0,114,29,0,0,0,218,6,100,101,99,111,100,101, + 41,6,114,32,0,0,0,114,38,0,0,0,114,39,0,0, + 0,114,13,0,0,0,218,8,102,117,108,108,112,97,116,104, + 114,58,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,10,103,101,116,95,115,111,117,114,99,101, + 226,0,0,0,115,26,0,0,0,10,7,8,1,18,1,10, + 2,4,1,14,1,10,2,2,2,14,1,12,1,8,2,16, + 1,255,128,122,22,122,105,112,105,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,0,0,0,0,3,0,0,0,4,0,0,0, + 67,0,0,0,115,40,0,0,0,116,0,124,0,124,1,131, + 2,125,2,124,2,100,1,117,0,114,36,116,1,100,2,124, + 1,155,2,157,2,124,1,100,3,141,2,130,1,124,2,83, + 0,41,4,122,171,105,115,95,112,97,99,107,97,103,101,40, + 102,117,108,108,110,97,109,101,41,32,45,62,32,98,111,111, + 108,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, + 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,109, + 111,100,117,108,101,32,115,112,101,99,105,102,105,101,100,32, + 98,121,32,102,117,108,108,110,97,109,101,32,105,115,32,97, + 32,112,97,99,107,97,103,101,46,10,32,32,32,32,32,32, + 32,32,82,97,105,115,101,32,90,105,112,73,109,112,111,114, + 116,69,114,114,111,114,32,105,102,32,116,104,101,32,109,111, + 100,117,108,101,32,99,111,117,108,100,110,39,116,32,98,101, + 32,102,111,117,110,100,46,10,32,32,32,32,32,32,32,32, + 78,114,61,0,0,0,114,62,0,0,0,41,2,114,35,0, + 0,0,114,3,0,0,0,41,3,114,32,0,0,0,114,38, + 0,0,0,114,39,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,114,43,0,0,0,252,0,0,0, + 115,10,0,0,0,10,6,8,1,18,1,4,1,255,128,122, + 22,122,105,112,105,109,112,111,114,116,101,114,46,105,115,95, + 112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,9,0,0,0,8,0,0,0,67,0,0,0, + 115,252,0,0,0,100,1,125,2,116,0,160,1,124,2,116, + 2,161,2,1,0,116,3,124,0,124,1,131,2,92,3,125, + 3,125,4,125,5,116,4,106,5,160,6,124,1,161,1,125, + 6,124,6,100,2,117,0,115,62,116,7,124,6,116,8,131, + 2,115,80,116,8,124,1,131,1,125,6,124,6,116,4,106, + 5,124,1,60,0,124,0,124,6,95,9,122,84,124,4,114, + 124,116,10,124,0,124,1,131,2,125,7,116,11,160,12,124, + 0,106,13,124,7,161,2,125,8,124,8,103,1,124,6,95, + 14,116,15,124,6,100,3,131,2,115,140,116,16,124,6,95, + 16,116,11,160,17,124,6,106,18,124,1,124,5,161,3,1, + 0,116,19,124,3,124,6,106,18,131,2,1,0,87,0,110, + 16,1,0,1,0,1,0,116,4,106,5,124,1,61,0,130, + 0,122,14,116,4,106,5,124,1,25,0,125,6,87,0,110, + 30,4,0,116,20,121,232,1,0,1,0,1,0,116,21,100, + 4,124,1,155,2,100,5,157,3,131,1,130,1,48,0,116, + 22,160,23,100,6,124,1,124,5,161,3,1,0,124,6,83, + 0,41,7,97,55,1,0,0,108,111,97,100,95,109,111,100, + 117,108,101,40,102,117,108,108,110,97,109,101,41,32,45,62, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, + 32,32,76,111,97,100,32,116,104,101,32,109,111,100,117,108, + 101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,39, + 102,117,108,108,110,97,109,101,39,46,32,39,102,117,108,108, + 110,97,109,101,39,32,109,117,115,116,32,98,101,32,116,104, + 101,10,32,32,32,32,32,32,32,32,102,117,108,108,121,32, + 113,117,97,108,105,102,105,101,100,32,40,100,111,116,116,101, + 100,41,32,109,111,100,117,108,101,32,110,97,109,101,46,32, + 73,116,32,114,101,116,117,114,110,115,32,116,104,101,32,105, + 109,112,111,114,116,101,100,10,32,32,32,32,32,32,32,32, + 109,111,100,117,108,101,44,32,111,114,32,114,97,105,115,101, + 115,32,90,105,112,73,109,112,111,114,116,69,114,114,111,114, + 32,105,102,32,105,116,32,119,97,115,110,39,116,32,102,111, + 117,110,100,46,10,10,32,32,32,32,32,32,32,32,68,101, + 112,114,101,99,97,116,101,100,32,115,105,110,99,101,32,80, + 121,116,104,111,110,32,51,46,49,48,46,32,85,115,101,32, + 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, + 115,116,101,97,100,46,10,32,32,32,32,32,32,32,32,122, + 114,122,105,112,105,109,112,111,114,116,46,122,105,112,105,109, + 112,111,114,116,101,114,46,108,111,97,100,95,109,111,100,117, + 108,101,40,41,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,32,97,110,100,32,115,108,97,116,101,100,32,102,111, + 114,32,114,101,109,111,118,97,108,32,105,110,32,80,121,116, + 104,111,110,32,51,46,49,50,59,32,117,115,101,32,101,120, + 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, + 101,97,100,78,218,12,95,95,98,117,105,108,116,105,110,115, + 95,95,122,14,76,111,97,100,101,100,32,109,111,100,117,108, + 101,32,122,25,32,110,111,116,32,102,111,117,110,100,32,105, + 110,32,115,121,115,46,109,111,100,117,108,101,115,122,30,105, + 109,112,111,114,116,32,123,125,32,35,32,108,111,97,100,101, + 100,32,102,114,111,109,32,90,105,112,32,123,125,41,24,218, + 9,95,119,97,114,110,105,110,103,115,90,4,119,97,114,110, + 218,18,68,101,112,114,101,99,97,116,105,111,110,87,97,114, + 110,105,110,103,114,48,0,0,0,218,3,115,121,115,218,7, + 109,111,100,117,108,101,115,218,3,103,101,116,114,15,0,0, + 0,218,12,95,109,111,100,117,108,101,95,116,121,112,101,218, + 10,95,95,108,111,97,100,101,114,95,95,114,36,0,0,0, + 114,21,0,0,0,114,30,0,0,0,114,29,0,0,0,90, + 8,95,95,112,97,116,104,95,95,218,7,104,97,115,97,116, + 116,114,114,68,0,0,0,90,14,95,102,105,120,95,117,112, + 95,109,111,100,117,108,101,218,8,95,95,100,105,99,116,95, + 95,218,4,101,120,101,99,114,26,0,0,0,218,11,73,109, + 112,111,114,116,69,114,114,111,114,114,45,0,0,0,218,16, + 95,118,101,114,98,111,115,101,95,109,101,115,115,97,103,101, + 41,9,114,32,0,0,0,114,38,0,0,0,218,3,109,115, + 103,114,50,0,0,0,114,51,0,0,0,114,40,0,0,0, + 90,3,109,111,100,114,13,0,0,0,114,66,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,11, + 108,111,97,100,95,109,111,100,117,108,101,9,1,0,0,115, + 54,0,0,0,4,9,12,2,16,1,12,1,18,1,8,1, + 10,1,6,1,2,2,4,1,10,3,14,1,8,1,10,2, + 6,1,16,1,16,1,6,1,8,1,2,1,2,2,14,1, + 12,1,18,1,14,1,4,1,255,128,122,23,122,105,112,105, + 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,0,0,0,0,0, + 3,0,0,0,8,0,0,0,67,0,0,0,115,64,0,0, + 0,122,20,124,0,160,0,124,1,161,1,115,18,87,0,100, + 1,83,0,87,0,110,20,4,0,116,1,121,40,1,0,1, + 0,1,0,89,0,100,1,83,0,48,0,100,2,100,3,108, + 2,109,3,125,2,1,0,124,2,124,0,124,1,131,2,83, + 0,41,4,122,204,82,101,116,117,114,110,32,116,104,101,32, + 82,101,115,111,117,114,99,101,82,101,97,100,101,114,32,102, + 111,114,32,97,32,112,97,99,107,97,103,101,32,105,110,32, + 97,32,122,105,112,32,102,105,108,101,46,10,10,32,32,32, + 32,32,32,32,32,73,102,32,39,102,117,108,108,110,97,109, + 101,39,32,105,115,32,97,32,112,97,99,107,97,103,101,32, + 119,105,116,104,105,110,32,116,104,101,32,122,105,112,32,102, + 105,108,101,44,32,114,101,116,117,114,110,32,116,104,101,10, + 32,32,32,32,32,32,32,32,39,82,101,115,111,117,114,99, + 101,82,101,97,100,101,114,39,32,111,98,106,101,99,116,32, + 102,111,114,32,116,104,101,32,112,97,99,107,97,103,101,46, + 32,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117, + 114,110,32,78,111,110,101,46,10,32,32,32,32,32,32,32, + 32,78,114,0,0,0,0,41,1,218,9,90,105,112,82,101, + 97,100,101,114,41,4,114,43,0,0,0,114,3,0,0,0, + 90,17,105,109,112,111,114,116,108,105,98,46,114,101,97,100, + 101,114,115,114,83,0,0,0,41,3,114,32,0,0,0,114, + 38,0,0,0,114,83,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,19,103,101,116,95,114,101, + 115,111,117,114,99,101,95,114,101,97,100,101,114,52,1,0, + 0,115,16,0,0,0,2,6,10,1,10,1,12,1,8,1, + 12,1,10,1,255,128,122,31,122,105,112,105,109,112,111,114, + 116,101,114,46,103,101,116,95,114,101,115,111,117,114,99,101, + 95,114,101,97,100,101,114,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,5,0,0,0,67,0,0,0, + 115,24,0,0,0,100,1,124,0,106,0,155,0,116,1,155, + 0,124,0,106,2,155,0,100,2,157,5,83,0,41,3,78, + 122,21,60,122,105,112,105,109,112,111,114,116,101,114,32,111, + 98,106,101,99,116,32,34,122,2,34,62,41,3,114,29,0, + 0,0,114,20,0,0,0,114,31,0,0,0,41,1,114,32, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,8,95,95,114,101,112,114,95,95,67,1,0,0, + 115,4,0,0,0,24,1,255,128,122,20,122,105,112,105,109, + 112,111,114,116,101,114,46,95,95,114,101,112,114,95,95,41, + 1,78,41,1,78,41,1,78,41,16,114,6,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,7,95,95,100,111,99, + 95,95,114,34,0,0,0,114,41,0,0,0,114,42,0,0, + 0,114,46,0,0,0,114,52,0,0,0,114,59,0,0,0, + 114,60,0,0,0,114,67,0,0,0,114,43,0,0,0,114, + 82,0,0,0,114,84,0,0,0,114,85,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,4,0,0,0,46,0,0,0,115,30,0,0,0, + 8,0,4,1,8,17,10,46,10,34,10,13,8,27,8,10, + 8,21,8,11,8,26,8,13,8,43,12,15,255,128,122,12, + 95,95,105,110,105,116,95,95,46,112,121,99,84,114,63,0, + 0,0,70,41,3,122,4,46,112,121,99,84,70,41,3,114, + 64,0,0,0,70,70,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 20,0,0,0,124,0,106,0,124,1,160,1,100,1,161,1, + 100,2,25,0,23,0,83,0,41,3,78,218,1,46,233,2, + 0,0,0,41,2,114,31,0,0,0,218,10,114,112,97,114, + 116,105,116,105,111,110,41,2,114,32,0,0,0,114,38,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,36,0,0,0,85,1,0,0,115,4,0,0,0,20, + 1,255,128,114,36,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, + 0,115,18,0,0,0,124,1,116,0,23,0,125,2,124,2, + 124,0,106,1,118,0,83,0,169,1,78,41,2,114,20,0, + 0,0,114,28,0,0,0,41,3,114,32,0,0,0,114,13, + 0,0,0,90,7,100,105,114,112,97,116,104,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,114,37,0,0,0, + 89,1,0,0,115,6,0,0,0,8,4,10,2,255,128,114, + 37,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,7,0,0,0,4,0,0,0,67,0,0,0,115,54,0, + 0,0,116,0,124,0,124,1,131,2,125,2,116,1,68,0, + 93,34,92,3,125,3,125,4,125,5,124,2,124,3,23,0, + 125,6,124,6,124,0,106,2,118,0,114,14,124,5,2,0, + 1,0,83,0,100,0,83,0,114,90,0,0,0,41,3,114, + 36,0,0,0,218,16,95,122,105,112,95,115,101,97,114,99, + 104,111,114,100,101,114,114,28,0,0,0,41,7,114,32,0, + 0,0,114,38,0,0,0,114,13,0,0,0,218,6,115,117, + 102,102,105,120,218,10,105,115,98,121,116,101,99,111,100,101, + 114,51,0,0,0,114,66,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,35,0,0,0,98,1, + 0,0,115,14,0,0,0,10,1,14,1,8,1,10,1,8, + 1,4,1,255,128,114,35,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,26,0,0,0,9,0,0,0,67, + 0,0,0,115,232,4,0,0,122,14,116,0,160,1,124,0, + 161,1,125,1,87,0,110,32,4,0,116,2,121,46,1,0, + 1,0,1,0,116,3,100,1,124,0,155,2,157,2,124,0, + 100,2,141,2,130,1,48,0,124,1,144,4,143,142,1,0, + 122,36,124,1,160,4,116,5,11,0,100,3,161,2,1,0, + 124,1,160,6,161,0,125,2,124,1,160,7,116,5,161,1, + 125,3,87,0,110,32,4,0,116,2,121,124,1,0,1,0, + 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,48,0,116,8,124,3,131,1,116,5,107,3, + 114,156,116,3,100,4,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,124,3,100,0,100,5,133,2,25,0,116,9, + 107,3,144,1,114,154,122,24,124,1,160,4,100,6,100,3, + 161,2,1,0,124,1,160,6,161,0,125,4,87,0,110,32, + 4,0,116,2,121,230,1,0,1,0,1,0,116,3,100,4, + 124,0,155,2,157,2,124,0,100,2,141,2,130,1,48,0, + 116,10,124,4,116,11,24,0,116,5,24,0,100,6,131,2, + 125,5,122,22,124,1,160,4,124,5,161,1,1,0,124,1, + 160,7,161,0,125,6,87,0,110,34,4,0,116,2,144,1, + 121,50,1,0,1,0,1,0,116,3,100,4,124,0,155,2, + 157,2,124,0,100,2,141,2,130,1,48,0,124,6,160,12, + 116,9,161,1,125,7,124,7,100,6,107,0,144,1,114,90, + 116,3,100,7,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,124,6,124,7,124,7,116,5,23,0,133,2,25,0, + 125,3,116,8,124,3,131,1,116,5,107,3,144,1,114,138, + 116,3,100,8,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,124,4,116,8,124,6,131,1,24,0,124,7,23,0, + 125,2,116,13,124,3,100,9,100,10,133,2,25,0,131,1, + 125,8,116,13,124,3,100,10,100,11,133,2,25,0,131,1, + 125,9,124,2,124,8,107,0,144,1,114,214,116,3,100,12, + 124,0,155,2,157,2,124,0,100,2,141,2,130,1,124,2, + 124,9,107,0,144,1,114,242,116,3,100,13,124,0,155,2, + 157,2,124,0,100,2,141,2,130,1,124,2,124,8,56,0, + 125,2,124,2,124,9,24,0,125,10,124,10,100,6,107,0, + 144,2,114,30,116,3,100,14,124,0,155,2,157,2,124,0, + 100,2,141,2,130,1,105,0,125,11,100,6,125,12,122,14, + 124,1,160,4,124,2,161,1,1,0,87,0,110,34,4,0, + 116,2,144,2,121,86,1,0,1,0,1,0,116,3,100,4, + 124,0,155,2,157,2,124,0,100,2,141,2,130,1,48,0, + 9,0,124,1,160,7,100,16,161,1,125,3,116,8,124,3, + 131,1,100,5,107,0,144,2,114,122,116,14,100,17,131,1, + 130,1,124,3,100,0,100,5,133,2,25,0,100,18,107,3, + 144,2,114,144,144,4,113,182,116,8,124,3,131,1,100,16, + 107,3,144,2,114,166,116,14,100,17,131,1,130,1,116,15, + 124,3,100,19,100,20,133,2,25,0,131,1,125,13,116,15, + 124,3,100,20,100,9,133,2,25,0,131,1,125,14,116,15, + 124,3,100,9,100,21,133,2,25,0,131,1,125,15,116,15, + 124,3,100,21,100,10,133,2,25,0,131,1,125,16,116,13, + 124,3,100,10,100,11,133,2,25,0,131,1,125,17,116,13, + 124,3,100,11,100,22,133,2,25,0,131,1,125,18,116,13, + 124,3,100,22,100,23,133,2,25,0,131,1,125,4,116,15, + 124,3,100,23,100,24,133,2,25,0,131,1,125,19,116,15, + 124,3,100,24,100,25,133,2,25,0,131,1,125,20,116,15, + 124,3,100,25,100,26,133,2,25,0,131,1,125,21,116,13, + 124,3,100,27,100,16,133,2,25,0,131,1,125,22,124,19, + 124,20,23,0,124,21,23,0,125,8,124,22,124,9,107,4, + 144,3,114,126,116,3,100,28,124,0,155,2,157,2,124,0, + 100,2,141,2,130,1,124,22,124,10,55,0,125,22,122,14, + 124,1,160,7,124,19,161,1,125,23,87,0,110,34,4,0, + 116,2,144,3,121,182,1,0,1,0,1,0,116,3,100,4, + 124,0,155,2,157,2,124,0,100,2,141,2,130,1,48,0, + 116,8,124,23,131,1,124,19,107,3,144,3,114,216,116,3, + 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, + 122,50,116,8,124,1,160,7,124,8,124,19,24,0,161,1, + 131,1,124,8,124,19,24,0,107,3,144,4,114,8,116,3, + 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, + 87,0,110,34,4,0,116,2,144,4,121,44,1,0,1,0, + 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,48,0,124,13,100,29,64,0,144,4,114,66, + 124,23,160,16,161,0,125,23,110,52,122,14,124,23,160,16, + 100,30,161,1,125,23,87,0,110,36,4,0,116,17,144,4, + 121,116,1,0,1,0,1,0,124,23,160,16,100,31,161,1, + 160,18,116,19,161,1,125,23,89,0,110,2,48,0,124,23, + 160,20,100,32,116,21,161,2,125,23,116,22,160,23,124,0, + 124,23,161,2,125,24,124,24,124,14,124,18,124,4,124,22, + 124,15,124,16,124,17,102,8,125,25,124,25,124,11,124,23, + 60,0,124,12,100,33,55,0,125,12,144,2,113,90,87,0, + 100,0,4,0,4,0,131,3,1,0,110,18,49,0,144,4, + 115,204,48,0,1,0,1,0,1,0,89,0,1,0,116,24, + 160,25,100,34,124,12,124,0,161,3,1,0,124,11,83,0, + 41,35,78,122,21,99,97,110,39,116,32,111,112,101,110,32, + 90,105,112,32,102,105,108,101,58,32,114,12,0,0,0,114, + 88,0,0,0,250,21,99,97,110,39,116,32,114,101,97,100, + 32,90,105,112,32,102,105,108,101,58,32,233,4,0,0,0, + 114,0,0,0,0,122,16,110,111,116,32,97,32,90,105,112, + 32,102,105,108,101,58,32,122,18,99,111,114,114,117,112,116, + 32,90,105,112,32,102,105,108,101,58,32,233,12,0,0,0, + 233,16,0,0,0,233,20,0,0,0,122,28,98,97,100,32, + 99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114, + 121,32,115,105,122,101,58,32,122,30,98,97,100,32,99,101, + 110,116,114,97,108,32,100,105,114,101,99,116,111,114,121,32, + 111,102,102,115,101,116,58,32,122,38,98,97,100,32,99,101, + 110,116,114,97,108,32,100,105,114,101,99,116,111,114,121,32, + 115,105,122,101,32,111,114,32,111,102,102,115,101,116,58,32, + 84,233,46,0,0,0,250,27,69,79,70,32,114,101,97,100, + 32,119,104,101,114,101,32,110,111,116,32,101,120,112,101,99, + 116,101,100,115,4,0,0,0,80,75,1,2,233,8,0,0, + 0,233,10,0,0,0,233,14,0,0,0,233,24,0,0,0, + 233,28,0,0,0,233,30,0,0,0,233,32,0,0,0,233, + 34,0,0,0,233,42,0,0,0,122,25,98,97,100,32,108, + 111,99,97,108,32,104,101,97,100,101,114,32,111,102,102,115, + 101,116,58,32,105,0,8,0,0,218,5,97,115,99,105,105, + 90,6,108,97,116,105,110,49,250,1,47,114,5,0,0,0, + 122,33,122,105,112,105,109,112,111,114,116,58,32,102,111,117, + 110,100,32,123,125,32,110,97,109,101,115,32,105,110,32,123, + 33,114,125,41,26,218,3,95,105,111,218,9,111,112,101,110, + 95,99,111,100,101,114,22,0,0,0,114,3,0,0,0,218, + 4,115,101,101,107,218,20,69,78,68,95,67,69,78,84,82, + 65,76,95,68,73,82,95,83,73,90,69,90,4,116,101,108, + 108,218,4,114,101,97,100,114,55,0,0,0,218,18,83,84, + 82,73,78,71,95,69,78,68,95,65,82,67,72,73,86,69, + 218,3,109,97,120,218,15,77,65,88,95,67,79,77,77,69, + 78,84,95,76,69,78,218,5,114,102,105,110,100,114,2,0, + 0,0,218,8,69,79,70,69,114,114,111,114,114,1,0,0, + 0,114,65,0,0,0,218,18,85,110,105,99,111,100,101,68, + 101,99,111,100,101,69,114,114,111,114,218,9,116,114,97,110, + 115,108,97,116,101,218,11,99,112,52,51,55,95,116,97,98, + 108,101,114,19,0,0,0,114,20,0,0,0,114,21,0,0, + 0,114,30,0,0,0,114,45,0,0,0,114,80,0,0,0, + 41,26,114,29,0,0,0,218,2,102,112,90,15,104,101,97, + 100,101,114,95,112,111,115,105,116,105,111,110,218,6,98,117, + 102,102,101,114,218,9,102,105,108,101,95,115,105,122,101,90, + 17,109,97,120,95,99,111,109,109,101,110,116,95,115,116,97, + 114,116,218,4,100,97,116,97,90,3,112,111,115,218,11,104, + 101,97,100,101,114,95,115,105,122,101,90,13,104,101,97,100, + 101,114,95,111,102,102,115,101,116,90,10,97,114,99,95,111, + 102,102,115,101,116,114,33,0,0,0,218,5,99,111,117,110, + 116,218,5,102,108,97,103,115,218,8,99,111,109,112,114,101, + 115,115,218,4,116,105,109,101,218,4,100,97,116,101,218,3, + 99,114,99,218,9,100,97,116,97,95,115,105,122,101,218,9, + 110,97,109,101,95,115,105,122,101,218,10,101,120,116,114,97, + 95,115,105,122,101,90,12,99,111,109,109,101,110,116,95,115, + 105,122,101,218,11,102,105,108,101,95,111,102,102,115,101,116, + 114,44,0,0,0,114,13,0,0,0,218,1,116,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,27,0,0, + 0,129,1,0,0,115,218,0,0,0,2,1,14,1,12,1, + 20,1,8,2,2,1,14,1,8,1,14,1,12,1,20,1, + 12,1,18,1,18,1,2,3,12,1,12,1,12,1,10,1, + 2,1,8,255,8,2,2,1,2,255,2,1,4,255,2,2, + 10,1,12,1,14,1,10,1,2,1,8,255,10,2,10,1, + 10,1,2,1,6,255,16,2,14,1,10,1,2,1,6,255, + 16,2,16,2,16,1,10,1,18,1,10,1,18,1,8,1, + 8,1,10,1,18,1,4,2,4,2,2,1,14,1,14,1, + 20,1,2,1,10,1,14,1,8,1,18,2,4,1,14,1, + 8,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1, + 16,1,16,1,16,1,16,1,12,1,10,1,18,1,8,1, + 2,2,14,1,14,1,20,1,14,1,18,1,2,4,28,1, + 22,1,14,1,20,1,10,2,10,2,2,3,14,1,14,1, + 22,1,12,2,12,1,20,1,8,1,8,1,36,202,14,55, 4,1,255,128,114,27,0,0,0,117,190,1,0,0,0,1, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33, From 44d7e67be575355b055046dcea80c3e2403cad7e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 15 Dec 2020 14:34:19 +0100 Subject: [PATCH 0779/1261] bpo-42639: Move atexit state to PyInterpreterState (GH-23763) * Add _PyAtExit_Call() function and remove pyexitfunc and pyexitmodule members of PyInterpreterState. The function logs atexit callback errors using _PyErr_WriteUnraisableMsg(). * Add _PyAtExit_Init() and _PyAtExit_Fini() functions. * Remove traverse, clear and free functions of the atexit module. Co-authored-by: Dong-hee Na --- Include/internal/pycore_interp.h | 18 ++- Include/internal/pycore_pylifecycle.h | 4 +- Lib/test/test_atexit.py | 18 +++ .../2020-12-09-01-55-10.bpo-42639.5pI5HG.rst | 3 + Modules/atexitmodule.c | 150 +++++++----------- Python/pylifecycle.c | 20 +-- Python/pystate.c | 1 + 7 files changed, 101 insertions(+), 113 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-09-01-55-10.bpo-42639.5pI5HG.rst diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 12416c2e94d433..9ec5358b5e36e5 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -159,6 +159,20 @@ struct _Py_exc_state { }; +// atexit state +typedef struct { + PyObject *func; + PyObject *args; + PyObject *kwargs; +} atexit_callback; + +struct atexit_state { + atexit_callback **callbacks; + int ncallbacks; + int callback_len; +}; + + /* interpreter state */ #define _PY_NSMALLPOSINTS 257 @@ -234,12 +248,10 @@ struct _is { PyObject *after_forkers_child; #endif - /* AtExit module */ - PyObject *atexit_module; - uint64_t tstate_next_unique_id; struct _warnings_runtime_state warnings; + struct atexit_state atexit; PyObject *audit_hooks; diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index e6e4187cd5ab0d..d1c23c81791503 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -55,6 +55,7 @@ extern PyStatus _PyTypes_Init(void); extern PyStatus _PyTypes_InitSlotDefs(void); extern PyStatus _PyImportZip_Init(PyThreadState *tstate); extern PyStatus _PyGC_Init(PyThreadState *tstate); +extern PyStatus _PyAtExit_Init(PyThreadState *tstate); /* Various internal finalizers */ @@ -85,6 +86,7 @@ extern void _PyHash_Fini(void); extern void _PyTraceMalloc_Fini(void); extern void _PyWarnings_Fini(PyInterpreterState *interp); extern void _PyAST_Fini(PyInterpreterState *interp); +extern void _PyAtExit_Fini(PyInterpreterState *interp); extern PyStatus _PyGILState_Init(PyThreadState *tstate); extern void _PyGILState_Fini(PyThreadState *tstate); @@ -109,7 +111,7 @@ PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception, PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate); -extern void _PyAtExit_Call(PyObject *module); +extern void _PyAtExit_Call(PyThreadState *tstate); #ifdef __cplusplus } diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index 906f96dc31af08..29faaaf0a9d80e 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -170,6 +170,24 @@ def f(msg): self.assertEqual(res.out.decode().splitlines(), ["two", "one"]) self.assertFalse(res.err) + def test_atexit_instances(self): + # bpo-42639: It is safe to have more than one atexit instance. + code = textwrap.dedent(""" + import sys + import atexit as atexit1 + del sys.modules['atexit'] + import atexit as atexit2 + del sys.modules['atexit'] + + assert atexit2 is not atexit1 + + atexit1.register(print, "atexit1") + atexit2.register(print, "atexit2") + """) + res = script_helper.assert_python_ok("-c", code) + self.assertEqual(res.out.decode().splitlines(), ["atexit2", "atexit1"]) + self.assertFalse(res.err) + @support.cpython_only class SubinterpreterTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-09-01-55-10.bpo-42639.5pI5HG.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-09-01-55-10.bpo-42639.5pI5HG.rst new file mode 100644 index 00000000000000..7999ee976f3c02 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-12-09-01-55-10.bpo-42639.5pI5HG.rst @@ -0,0 +1,3 @@ +Make the :mod:`atexit` module state per-interpreter. It is now safe have more +than one :mod:`atexit` module instance. +Patch by Dong-hee Na and Victor Stinner. diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index 90ed7d50cad492..ae13eae75dbaec 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -7,38 +7,26 @@ */ #include "Python.h" -#include "pycore_interp.h" // PyInterpreterState.atexit_func +#include "pycore_initconfig.h" // _PyStatus_NO_MEMORY +#include "pycore_interp.h" // PyInterpreterState.atexit #include "pycore_pystate.h" // _PyInterpreterState_GET /* ===================================================================== */ /* Callback machinery. */ -typedef struct { - PyObject *func; - PyObject *args; - PyObject *kwargs; -} atexit_callback; - -struct atexit_state { - atexit_callback **atexit_callbacks; - int ncallbacks; - int callback_len; -}; - static inline struct atexit_state* -get_atexit_state(PyObject *module) +get_atexit_state(void) { - void *state = PyModule_GetState(module); - assert(state != NULL); - return (struct atexit_state *)state; + PyInterpreterState *interp = _PyInterpreterState_GET(); + return &interp->atexit; } static void atexit_delete_cb(struct atexit_state *state, int i) { - atexit_callback *cb = state->atexit_callbacks[i]; - state->atexit_callbacks[i] = NULL; + atexit_callback *cb = state->callbacks[i]; + state->callbacks[i] = NULL; Py_DECREF(cb->func); Py_DECREF(cb->args); @@ -53,7 +41,7 @@ atexit_cleanup(struct atexit_state *state) { atexit_callback *cb; for (int i = 0; i < state->ncallbacks; i++) { - cb = state->atexit_callbacks[i]; + cb = state->callbacks[i]; if (cb == NULL) continue; @@ -62,25 +50,45 @@ atexit_cleanup(struct atexit_state *state) state->ncallbacks = 0; } -/* Installed into pylifecycle.c's atexit mechanism */ -static void -atexit_callfuncs(PyObject *module, int ignore_exc) +PyStatus +_PyAtExit_Init(PyThreadState *tstate) { - assert(!PyErr_Occurred()); + struct atexit_state *state = &tstate->interp->atexit; + // _PyAtExit_Init() must only be called once + assert(state->callbacks == NULL); - if (module == NULL) { - return; + state->callback_len = 32; + state->ncallbacks = 0; + state->callbacks = PyMem_New(atexit_callback*, state->callback_len); + if (state->callbacks == NULL) { + return _PyStatus_NO_MEMORY(); } + return _PyStatus_OK(); +} + + +void +_PyAtExit_Fini(PyInterpreterState *interp) +{ + struct atexit_state *state = &interp->atexit; + atexit_cleanup(state); + PyMem_Free(state->callbacks); +} + + +static void +atexit_callfuncs(struct atexit_state *state, int ignore_exc) +{ + assert(!PyErr_Occurred()); - struct atexit_state *state = get_atexit_state(module); if (state->ncallbacks == 0) { return; } PyObject *exc_type = NULL, *exc_value, *exc_tb; for (int i = state->ncallbacks - 1; i >= 0; i--) { - atexit_callback *cb = state->atexit_callbacks[i]; + atexit_callback *cb = state->callbacks[i]; if (cb == NULL) { continue; } @@ -125,15 +133,17 @@ atexit_callfuncs(PyObject *module, int ignore_exc) void -_PyAtExit_Call(PyObject *module) +_PyAtExit_Call(PyThreadState *tstate) { - atexit_callfuncs(module, 1); + struct atexit_state *state = &tstate->interp->atexit; + atexit_callfuncs(state, 1); } /* ===================================================================== */ /* Module methods. */ + PyDoc_STRVAR(atexit_register__doc__, "register(func, *args, **kwargs) -> func\n\ \n\ @@ -161,15 +171,15 @@ atexit_register(PyObject *module, PyObject *args, PyObject *kwargs) return NULL; } - struct atexit_state *state = get_atexit_state(module); + struct atexit_state *state = get_atexit_state(); if (state->ncallbacks >= state->callback_len) { atexit_callback **r; state->callback_len += 16; - r = (atexit_callback**)PyMem_Realloc(state->atexit_callbacks, - sizeof(atexit_callback*) * state->callback_len); + size_t size = sizeof(atexit_callback*) * (size_t)state->callback_len; + r = (atexit_callback**)PyMem_Realloc(state->callbacks, size); if (r == NULL) return PyErr_NoMemory(); - state->atexit_callbacks = r; + state->callbacks = r; } atexit_callback *callback = PyMem_Malloc(sizeof(atexit_callback)); @@ -185,7 +195,7 @@ atexit_register(PyObject *module, PyObject *args, PyObject *kwargs) callback->func = Py_NewRef(func); callback->kwargs = Py_XNewRef(kwargs); - state->atexit_callbacks[state->ncallbacks++] = callback; + state->callbacks[state->ncallbacks++] = callback; return Py_NewRef(func); } @@ -198,7 +208,8 @@ Run all registered exit functions."); static PyObject * atexit_run_exitfuncs(PyObject *module, PyObject *unused) { - atexit_callfuncs(module, 0); + struct atexit_state *state = get_atexit_state(); + atexit_callfuncs(state, 0); if (PyErr_Occurred()) { return NULL; } @@ -213,7 +224,7 @@ Clear the list of previously registered exit functions."); static PyObject * atexit_clear(PyObject *module, PyObject *unused) { - atexit_cleanup(get_atexit_state(module)); + atexit_cleanup(get_atexit_state()); Py_RETURN_NONE; } @@ -225,41 +236,10 @@ Return the number of registered exit functions."); static PyObject * atexit_ncallbacks(PyObject *module, PyObject *unused) { - struct atexit_state *state = get_atexit_state(module); + struct atexit_state *state = get_atexit_state(); return PyLong_FromSsize_t(state->ncallbacks); } -static int -atexit_m_traverse(PyObject *module, visitproc visit, void *arg) -{ - struct atexit_state *state = (struct atexit_state *)PyModule_GetState(module); - for (int i = 0; i < state->ncallbacks; i++) { - atexit_callback *cb = state->atexit_callbacks[i]; - if (cb == NULL) - continue; - Py_VISIT(cb->func); - Py_VISIT(cb->args); - Py_VISIT(cb->kwargs); - } - return 0; -} - -static int -atexit_m_clear(PyObject *module) -{ - struct atexit_state *state = (struct atexit_state *)PyModule_GetState(module); - atexit_cleanup(state); - return 0; -} - -static void -atexit_free(PyObject *module) -{ - struct atexit_state *state = (struct atexit_state *)PyModule_GetState(module); - atexit_cleanup(state); - PyMem_Free(state->atexit_callbacks); -} - PyDoc_STRVAR(atexit_unregister__doc__, "unregister(func) -> None\n\ \n\ @@ -271,10 +251,10 @@ atexit.register\n\ static PyObject * atexit_unregister(PyObject *module, PyObject *func) { - struct atexit_state *state = get_atexit_state(module); + struct atexit_state *state = get_atexit_state(); for (int i = 0; i < state->ncallbacks; i++) { - atexit_callback *cb = state->atexit_callbacks[i]; + atexit_callback *cb = state->callbacks[i]; if (cb == NULL) { continue; } @@ -305,6 +285,7 @@ static PyMethodDef atexit_methods[] = { {NULL, NULL} /* sentinel */ }; + /* ===================================================================== */ /* Initialization function. */ @@ -315,37 +296,12 @@ upon normal program termination.\n\ Two public functions, register and unregister, are defined.\n\ "); -static int -atexit_exec(PyObject *module) -{ - struct atexit_state *state = get_atexit_state(module); - state->callback_len = 32; - state->ncallbacks = 0; - state->atexit_callbacks = PyMem_New(atexit_callback*, state->callback_len); - if (state->atexit_callbacks == NULL) { - return -1; - } - - PyInterpreterState *interp = _PyInterpreterState_GET(); - interp->atexit_module = module; - return 0; -} - -static PyModuleDef_Slot atexit_slots[] = { - {Py_mod_exec, atexit_exec}, - {0, NULL} -}; - static struct PyModuleDef atexitmodule = { PyModuleDef_HEAD_INIT, .m_name = "atexit", .m_doc = atexit__doc__, - .m_size = sizeof(struct atexit_state), + .m_size = 0, .m_methods = atexit_methods, - .m_slots = atexit_slots, - .m_traverse = atexit_m_traverse, - .m_clear = atexit_m_clear, - .m_free = (freefunc)atexit_free }; PyMODINIT_FUNC diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 7b80d01a375e5b..8d744c7bfd4a9d 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -55,7 +55,6 @@ static PyStatus add_main_module(PyInterpreterState *interp); static PyStatus init_import_site(void); static PyStatus init_set_builtins_open(void); static PyStatus init_sys_streams(PyThreadState *tstate); -static void call_py_exitfuncs(PyThreadState *tstate); static void wait_for_thread_shutdown(PyThreadState *tstate); static void call_ll_exitfuncs(_PyRuntimeState *runtime); @@ -690,6 +689,12 @@ pycore_init_types(PyThreadState *tstate) if (_PyWarnings_InitState(tstate) < 0) { return _PyStatus_ERR("can't initialize warnings"); } + + status = _PyAtExit_Init(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + return _PyStatus_OK(); } @@ -1655,7 +1660,7 @@ Py_FinalizeEx(void) * the threads created via Threading. */ - call_py_exitfuncs(tstate); + _PyAtExit_Call(tstate); /* Copy the core config, PyInterpreterState_Delete() free the core config memory */ @@ -1946,7 +1951,7 @@ Py_EndInterpreter(PyThreadState *tstate) // Wrap up existing "threading"-module-created, non-daemon threads. wait_for_thread_shutdown(tstate); - call_py_exitfuncs(tstate); + _PyAtExit_Call(tstate); if (tstate != interp->tstate_head || tstate->next != NULL) { Py_FatalError("not the last thread"); @@ -2633,15 +2638,6 @@ Py_ExitStatusException(PyStatus status) } -/* Clean up and exit */ - -static void -call_py_exitfuncs(PyThreadState *tstate) -{ - _PyAtExit_Call(tstate->interp->atexit_module); -} - - /* Wait until threading._shutdown completes, provided the threading module was imported in the first place. The shutdown routine will wait until all non-daemon diff --git a/Python/pystate.c b/Python/pystate.c index 8da583f8e06bc0..ead25b08d7a83a 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -303,6 +303,7 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate) _PyAST_Fini(interp); _PyWarnings_Fini(interp); + _PyAtExit_Fini(interp); // All Python types must be destroyed before the last GC collection. Python // types create a reference cycle to themselves in their in their From 94dc70f8da6804138de17c17b074d7e43ad20ef3 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 15 Dec 2020 15:14:35 +0100 Subject: [PATCH 0780/1261] bpo-14935: Remove static state from the _csv module (GH-23224) Uses code from: https://github.com/python/cpython/pull/16078 Co-authored-by: Marcel Plch Co-authored-by: Eddie Elizondo Co-authored-by: Hai Shi --- ...2020-10-20-23-28-55.bpo-1635741.Iyka3r.rst | 1 + Modules/_csv.c | 544 ++++++++++-------- 2 files changed, 304 insertions(+), 241 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-20-23-28-55.bpo-1635741.Iyka3r.rst diff --git a/Misc/NEWS.d/next/Library/2020-10-20-23-28-55.bpo-1635741.Iyka3r.rst b/Misc/NEWS.d/next/Library/2020-10-20-23-28-55.bpo-1635741.Iyka3r.rst new file mode 100644 index 00000000000000..e14e9a12c275dd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-20-23-28-55.bpo-1635741.Iyka3r.rst @@ -0,0 +1 @@ +Port the _csv module to the multi-phase initialization API (:pep:`489`). diff --git a/Modules/_csv.c b/Modules/_csv.c index 594f6c14727262..cade1ca9d47f06 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -18,9 +18,14 @@ module instead. typedef struct { PyObject *error_obj; /* CSV exception */ PyObject *dialects; /* Dialect registry */ + PyTypeObject *dialect_type; + PyTypeObject *reader_type; + PyTypeObject *writer_type; long field_limit; /* max parsed field size */ } _csvstate; +static struct PyModuleDef _csvmodule; + static inline _csvstate* get_csv_state(PyObject *module) { @@ -30,31 +35,35 @@ get_csv_state(PyObject *module) } static int -_csv_clear(PyObject *m) +_csv_clear(PyObject *module) { - Py_CLEAR(get_csv_state(m)->error_obj); - Py_CLEAR(get_csv_state(m)->dialects); + _csvstate *module_state = PyModule_GetState(module); + Py_CLEAR(module_state->error_obj); + Py_CLEAR(module_state->dialects); + Py_CLEAR(module_state->dialect_type); + Py_CLEAR(module_state->reader_type); + Py_CLEAR(module_state->writer_type); return 0; } static int -_csv_traverse(PyObject *m, visitproc visit, void *arg) +_csv_traverse(PyObject *module, visitproc visit, void *arg) { - Py_VISIT(get_csv_state(m)->error_obj); - Py_VISIT(get_csv_state(m)->dialects); + _csvstate *module_state = PyModule_GetState(module); + Py_VISIT(module_state->error_obj); + Py_VISIT(module_state->dialects); + Py_VISIT(module_state->dialect_type); + Py_VISIT(module_state->reader_type); + Py_VISIT(module_state->writer_type); return 0; } static void -_csv_free(void *m) +_csv_free(void *module) { - _csv_clear((PyObject *)m); + _csv_clear((PyObject *)module); } -static struct PyModuleDef _csvmodule; - -#define _csvstate_global ((_csvstate *)PyModule_GetState(PyState_FindModule(&_csvmodule))) - typedef enum { START_RECORD, START_FIELD, ESCAPED_CHAR, IN_FIELD, IN_QUOTED_FIELD, ESCAPE_IN_QUOTED_FIELD, QUOTE_IN_QUOTED_FIELD, @@ -92,8 +101,6 @@ typedef struct { } DialectObj; -static PyTypeObject Dialect_Type; - typedef struct { PyObject_HEAD @@ -110,8 +117,6 @@ typedef struct { unsigned long line_num; /* Source-file line number */ } ReaderObj; -static PyTypeObject Reader_Type; - typedef struct { PyObject_HEAD @@ -123,26 +128,27 @@ typedef struct { Py_ssize_t rec_size; /* size of allocated record */ Py_ssize_t rec_len; /* length of record */ int num_fields; /* number of fields in record */ -} WriterObj; -static PyTypeObject Writer_Type; + PyObject *error_obj; /* cached error object */ +} WriterObj; /* * DIALECT class */ static PyObject * -get_dialect_from_registry(PyObject * name_obj) +get_dialect_from_registry(PyObject *name_obj, _csvstate *module_state) { PyObject *dialect_obj; - dialect_obj = PyDict_GetItemWithError(_csvstate_global->dialects, name_obj); + dialect_obj = PyDict_GetItemWithError(module_state->dialects, name_obj); if (dialect_obj == NULL) { if (!PyErr_Occurred()) - PyErr_Format(_csvstate_global->error_obj, "unknown dialect"); + PyErr_Format(module_state->error_obj, "unknown dialect"); } else Py_INCREF(dialect_obj); + return dialect_obj; } @@ -309,8 +315,16 @@ static PyGetSetDef Dialect_getsetlist[] = { static void Dialect_dealloc(DialectObj *self) { - Py_XDECREF(self->lineterminator); - Py_TYPE(self)->tp_free((PyObject *)self); + PyTypeObject *tp = Py_TYPE(self); + Py_CLEAR(self->lineterminator); + tp->tp_free((PyObject *)self); + Py_DECREF(tp); +} + +static void +Dialect_finalize(DialectObj *self) +{ + Py_CLEAR(self->lineterminator); } static char *dialect_kws[] = { @@ -326,6 +340,22 @@ static char *dialect_kws[] = { NULL }; +static _csvstate * +_csv_state_from_type(PyTypeObject *type, const char *name) +{ + PyObject *module = _PyType_GetModuleByDef(type, &_csvmodule); + if (module == NULL) { + return NULL; + } + _csvstate *module_state = PyModule_GetState(module); + if (module_state == NULL) { + PyErr_Format(PyExc_SystemError, + "%s: No _csv module state found", name); + return NULL; + } + return module_state; +} + static PyObject * dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { @@ -354,16 +384,21 @@ dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) &strict)) return NULL; + _csvstate *module_state = _csv_state_from_type(type, "dialect_new"); + if (module_state == NULL) { + return NULL; + } + if (dialect != NULL) { if (PyUnicode_Check(dialect)) { - dialect = get_dialect_from_registry(dialect); + dialect = get_dialect_from_registry(dialect, module_state); if (dialect == NULL) return NULL; } else Py_INCREF(dialect); /* Can we reuse this instance? */ - if (PyObject_TypeCheck(dialect, &Dialect_Type) && + if (PyObject_TypeCheck(dialect, module_state->dialect_type) && delimiter == NULL && doublequote == NULL && escapechar == NULL && @@ -377,7 +412,7 @@ dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) self = (DialectObj *)type->tp_alloc(type, 0); if (self == NULL) { - Py_XDECREF(dialect); + Py_CLEAR(dialect); return NULL; } self->lineterminator = NULL; @@ -441,76 +476,69 @@ dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) ret = (PyObject *)self; Py_INCREF(self); err: - Py_XDECREF(self); - Py_XDECREF(dialect); - Py_XDECREF(delimiter); - Py_XDECREF(doublequote); - Py_XDECREF(escapechar); - Py_XDECREF(lineterminator); - Py_XDECREF(quotechar); - Py_XDECREF(quoting); - Py_XDECREF(skipinitialspace); - Py_XDECREF(strict); + Py_CLEAR(self); + Py_CLEAR(dialect); + Py_CLEAR(delimiter); + Py_CLEAR(doublequote); + Py_CLEAR(escapechar); + Py_CLEAR(lineterminator); + Py_CLEAR(quotechar); + Py_CLEAR(quoting); + Py_CLEAR(skipinitialspace); + Py_CLEAR(strict); return ret; } +/* Since dialect is now a heap type, it inherits pickling method for + * protocol 0 and 1 from object, therefore it needs to be overriden */ + +PyDoc_STRVAR(dialect_reduce_doc, "raises an exception to avoid pickling"); + +static PyObject * +Dialect_reduce(PyObject *self, PyObject *args) { + PyErr_Format(PyExc_TypeError, + "cannot pickle '%.100s' instances", _PyType_Name(Py_TYPE(self))); + return NULL; +} + +static struct PyMethodDef dialect_methods[] = { + {"__reduce__", Dialect_reduce, METH_VARARGS, dialect_reduce_doc}, + {"__reduce_ex__", Dialect_reduce, METH_VARARGS, dialect_reduce_doc}, + {NULL, NULL} +}; PyDoc_STRVAR(Dialect_Type_doc, "CSV dialect\n" "\n" "The Dialect type records CSV parsing and generation options.\n"); -static PyTypeObject Dialect_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_csv.Dialect", /* tp_name */ - sizeof(DialectObj), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)Dialect_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - (getattrfunc)0, /* tp_getattr */ - (setattrfunc)0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - (hashfunc)0, /* tp_hash */ - (ternaryfunc)0, /* tp_call */ - (reprfunc)0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Dialect_Type_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - Dialect_memberlist, /* tp_members */ - Dialect_getsetlist, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - dialect_new, /* tp_new */ - 0, /* tp_free */ +static PyType_Slot Dialect_Type_slots[] = { + {Py_tp_doc, (char*)Dialect_Type_doc}, + {Py_tp_members, Dialect_memberlist}, + {Py_tp_getset, Dialect_getsetlist}, + {Py_tp_new, dialect_new}, + {Py_tp_methods, dialect_methods}, + {Py_tp_finalize, Dialect_finalize}, + {Py_tp_dealloc, Dialect_dealloc}, + {0, NULL} }; +PyType_Spec Dialect_Type_spec = { + .name = "_csv.Dialect", + .basicsize = sizeof(DialectObj), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .slots = Dialect_Type_slots, +}; + + /* * Return an instance of the dialect type, given a Python instance or kwarg * description of the dialect */ static PyObject * -_call_dialect(PyObject *dialect_inst, PyObject *kwargs) +_call_dialect(_csvstate *module_state, PyObject *dialect_inst, PyObject *kwargs) { - PyObject *type = (PyObject *)&Dialect_Type; + PyObject *type = (PyObject *)module_state->dialect_type; if (dialect_inst) { return PyObject_VectorcallDict(type, &dialect_inst, 1, kwargs); } @@ -568,11 +596,12 @@ parse_grow_buff(ReaderObj *self) } static int -parse_add_char(ReaderObj *self, Py_UCS4 c) +parse_add_char(ReaderObj *self, _csvstate *module_state, Py_UCS4 c) { - if (self->field_len >= _csvstate_global->field_limit) { - PyErr_Format(_csvstate_global->error_obj, "field larger than field limit (%ld)", - _csvstate_global->field_limit); + if (self->field_len >= module_state->field_limit) { + PyErr_Format(module_state->error_obj, + "field larger than field limit (%ld)", + module_state->field_limit); return -1; } if (self->field_len == self->field_size && !parse_grow_buff(self)) @@ -582,7 +611,7 @@ parse_add_char(ReaderObj *self, Py_UCS4 c) } static int -parse_process_char(ReaderObj *self, Py_UCS4 c) +parse_process_char(ReaderObj *self, _csvstate *module_state, Py_UCS4 c) { DialectObj *dialect = self->dialect; @@ -628,7 +657,7 @@ parse_process_char(ReaderObj *self, Py_UCS4 c) /* begin new unquoted field */ if (dialect->quoting == QUOTE_NONNUMERIC) self->numeric_field = 1; - if (parse_add_char(self, c) < 0) + if (parse_add_char(self, module_state, c) < 0) return -1; self->state = IN_FIELD; } @@ -636,14 +665,14 @@ parse_process_char(ReaderObj *self, Py_UCS4 c) case ESCAPED_CHAR: if (c == '\n' || c=='\r') { - if (parse_add_char(self, c) < 0) + if (parse_add_char(self, module_state, c) < 0) return -1; self->state = AFTER_ESCAPED_CRNL; break; } if (c == '\0') c = '\n'; - if (parse_add_char(self, c) < 0) + if (parse_add_char(self, module_state, c) < 0) return -1; self->state = IN_FIELD; break; @@ -673,7 +702,7 @@ parse_process_char(ReaderObj *self, Py_UCS4 c) } else { /* normal character - save in field */ - if (parse_add_char(self, c) < 0) + if (parse_add_char(self, module_state, c) < 0) return -1; } break; @@ -699,7 +728,7 @@ parse_process_char(ReaderObj *self, Py_UCS4 c) } else { /* normal character - save in field */ - if (parse_add_char(self, c) < 0) + if (parse_add_char(self, module_state, c) < 0) return -1; } break; @@ -707,7 +736,7 @@ parse_process_char(ReaderObj *self, Py_UCS4 c) case ESCAPE_IN_QUOTED_FIELD: if (c == '\0') c = '\n'; - if (parse_add_char(self, c) < 0) + if (parse_add_char(self, module_state, c) < 0) return -1; self->state = IN_QUOTED_FIELD; break; @@ -717,7 +746,7 @@ parse_process_char(ReaderObj *self, Py_UCS4 c) if (dialect->quoting != QUOTE_NONE && c == dialect->quotechar) { /* save "" as " */ - if (parse_add_char(self, c) < 0) + if (parse_add_char(self, module_state, c) < 0) return -1; self->state = IN_QUOTED_FIELD; } @@ -734,13 +763,13 @@ parse_process_char(ReaderObj *self, Py_UCS4 c) self->state = (c == '\0' ? START_RECORD : EAT_CRNL); } else if (!dialect->strict) { - if (parse_add_char(self, c) < 0) + if (parse_add_char(self, module_state, c) < 0) return -1; self->state = IN_FIELD; } else { /* illegal */ - PyErr_Format(_csvstate_global->error_obj, "'%c' expected after '%c'", + PyErr_Format(module_state->error_obj, "'%c' expected after '%c'", dialect->delimiter, dialect->quotechar); return -1; @@ -753,7 +782,8 @@ parse_process_char(ReaderObj *self, Py_UCS4 c) else if (c == '\0') self->state = START_RECORD; else { - PyErr_Format(_csvstate_global->error_obj, "new-line character seen in unquoted field - do you need to open the file in universal-newline mode?"); + PyErr_Format(module_state->error_obj, + "new-line character seen in unquoted field - do you need to open the file in universal-newline mode?"); return -1; } break; @@ -784,6 +814,12 @@ Reader_iternext(ReaderObj *self) const void *data; PyObject *lineobj; + _csvstate *module_state = _csv_state_from_type(Py_TYPE(self), + "Reader.__next__"); + if (module_state == NULL) { + return NULL; + } + if (parse_reset(self) < 0) return NULL; do { @@ -793,7 +829,7 @@ Reader_iternext(ReaderObj *self) if (!PyErr_Occurred() && (self->field_len != 0 || self->state == IN_QUOTED_FIELD)) { if (self->dialect->strict) - PyErr_SetString(_csvstate_global->error_obj, + PyErr_SetString(module_state->error_obj, "unexpected end of data"); else if (parse_save_field(self) >= 0) break; @@ -801,7 +837,7 @@ Reader_iternext(ReaderObj *self) return NULL; } if (!PyUnicode_Check(lineobj)) { - PyErr_Format(_csvstate_global->error_obj, + PyErr_Format(module_state->error_obj, "iterator should return strings, " "not %.200s " "(the file should be opened in text mode)", @@ -823,18 +859,18 @@ Reader_iternext(ReaderObj *self) c = PyUnicode_READ(kind, data, pos); if (c == '\0') { Py_DECREF(lineobj); - PyErr_Format(_csvstate_global->error_obj, + PyErr_Format(module_state->error_obj, "line contains NUL"); goto err; } - if (parse_process_char(self, c) < 0) { + if (parse_process_char(self, module_state, c) < 0) { Py_DECREF(lineobj); goto err; } pos++; } Py_DECREF(lineobj); - if (parse_process_char(self, 0) < 0) + if (parse_process_char(self, module_state, 0) < 0) goto err; } while (self->state != START_RECORD); @@ -847,13 +883,29 @@ Reader_iternext(ReaderObj *self) static void Reader_dealloc(ReaderObj *self) { + PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); - Py_XDECREF(self->dialect); - Py_XDECREF(self->input_iter); - Py_XDECREF(self->fields); - if (self->field != NULL) + Py_CLEAR(self->dialect); + Py_CLEAR(self->input_iter); + Py_CLEAR(self->fields); + if (self->field != NULL) { PyMem_Free(self->field); + self->field = NULL; + } PyObject_GC_Del(self); + Py_DECREF(tp); +} + +static void +Reader_finalize(ReaderObj *self) +{ + Py_CLEAR(self->dialect); + Py_CLEAR(self->input_iter); + Py_CLEAR(self->fields); + if (self->field != NULL) { + PyMem_Free(self->field); + self->field = NULL; + } } static int @@ -893,47 +945,35 @@ static struct PyMemberDef Reader_memberlist[] = { }; -static PyTypeObject Reader_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_csv.reader", /*tp_name*/ - sizeof(ReaderObj), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)Reader_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - (getattrfunc)0, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - 0, /*tp_as_async*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - Reader_Type_doc, /*tp_doc*/ - (traverseproc)Reader_traverse, /*tp_traverse*/ - (inquiry)Reader_clear, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - PyObject_SelfIter, /*tp_iter*/ - (getiterfunc)Reader_iternext, /*tp_iternext*/ - Reader_methods, /*tp_methods*/ - Reader_memberlist, /*tp_members*/ - 0, /*tp_getset*/ +static PyType_Slot Reader_Type_slots[] = { + {Py_tp_doc, (char*)Reader_Type_doc}, + {Py_tp_traverse, Reader_traverse}, + {Py_tp_clear, Reader_clear}, + {Py_tp_iter, PyObject_SelfIter}, + {Py_tp_iternext, Reader_iternext}, + {Py_tp_methods, Reader_methods}, + {Py_tp_members, Reader_memberlist}, + {Py_tp_finalize, Reader_finalize}, + {Py_tp_dealloc, Reader_dealloc}, + {0, NULL} +}; +PyType_Spec Reader_Type_spec = { + .name = "_csv.reader", + .basicsize = sizeof(ReaderObj), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + .slots = Reader_Type_slots }; + static PyObject * csv_reader(PyObject *module, PyObject *args, PyObject *keyword_args) { PyObject * iterator, * dialect = NULL; - ReaderObj * self = PyObject_GC_New(ReaderObj, &Reader_Type); + _csvstate *module_state = get_csv_state(module); + ReaderObj * self = PyObject_GC_New( + ReaderObj, + module_state->reader_type); if (!self) return NULL; @@ -959,7 +999,8 @@ csv_reader(PyObject *module, PyObject *args, PyObject *keyword_args) Py_DECREF(self); return NULL; } - self->dialect = (DialectObj *)_call_dialect(dialect, keyword_args); + self->dialect = (DialectObj *)_call_dialect(module_state, dialect, + keyword_args); if (self->dialect == NULL) { Py_DECREF(self); return NULL; @@ -1048,7 +1089,7 @@ join_append_data(WriterObj *self, unsigned int field_kind, const void *field_dat } if (want_escape) { if (!dialect->escapechar) { - PyErr_Format(_csvstate_global->error_obj, + PyErr_Format(self->error_obj, "need to escape, but no escapechar set"); return -1; } @@ -1166,7 +1207,7 @@ csv_writerow(WriterObj *self, PyObject *seq) iter = PyObject_GetIter(seq); if (iter == NULL) { if (PyErr_ExceptionMatches(PyExc_TypeError)) { - PyErr_Format(_csvstate_global->error_obj, + PyErr_Format(self->error_obj, "iterable expected, not %.200s", Py_TYPE(seq)->tp_name); } @@ -1223,7 +1264,7 @@ csv_writerow(WriterObj *self, PyObject *seq) if (self->num_fields > 0 && self->rec_len == 0) { if (dialect->quoting == QUOTE_NONE) { - PyErr_Format(_csvstate_global->error_obj, + PyErr_Format(self->error_obj, "single empty field record must be quoted"); return NULL; } @@ -1292,22 +1333,12 @@ static struct PyMemberDef Writer_memberlist[] = { { NULL } }; -static void -Writer_dealloc(WriterObj *self) -{ - PyObject_GC_UnTrack(self); - Py_XDECREF(self->dialect); - Py_XDECREF(self->write); - if (self->rec != NULL) - PyMem_Free(self->rec); - PyObject_GC_Del(self); -} - static int Writer_traverse(WriterObj *self, visitproc visit, void *arg) { Py_VISIT(self->dialect); Py_VISIT(self->write); + Py_VISIT(self->error_obj); return 0; } @@ -1316,9 +1347,19 @@ Writer_clear(WriterObj *self) { Py_CLEAR(self->dialect); Py_CLEAR(self->write); + Py_CLEAR(self->error_obj); return 0; } +static void +Writer_finalize(WriterObj *self) +{ + Writer_clear(self); + if (self->rec != NULL) { + PyMem_Free(self->rec); + } +} + PyDoc_STRVAR(Writer_Type_doc, "CSV writer\n" "\n" @@ -1326,46 +1367,30 @@ PyDoc_STRVAR(Writer_Type_doc, "in CSV format from sequence input.\n" ); -static PyTypeObject Writer_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_csv.writer", /*tp_name*/ - sizeof(WriterObj), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)Writer_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - (getattrfunc)0, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - 0, /*tp_as_async*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - Writer_Type_doc, - (traverseproc)Writer_traverse, /*tp_traverse*/ - (inquiry)Writer_clear, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - (getiterfunc)0, /*tp_iter*/ - (getiterfunc)0, /*tp_iternext*/ - Writer_methods, /*tp_methods*/ - Writer_memberlist, /*tp_members*/ - 0, /*tp_getset*/ +static PyType_Slot Writer_Type_slots[] = { + {Py_tp_finalize, Writer_finalize}, + {Py_tp_doc, (char*)Writer_Type_doc}, + {Py_tp_traverse, Writer_traverse}, + {Py_tp_clear, Writer_clear}, + {Py_tp_methods, Writer_methods}, + {Py_tp_members, Writer_memberlist}, + {0, NULL} +}; + +PyType_Spec Writer_Type_spec = { + .name = "_csv.writer", + .basicsize = sizeof(WriterObj), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + .slots = Writer_Type_slots, }; + static PyObject * csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args) { PyObject * output_file, * dialect = NULL; - WriterObj * self = PyObject_GC_New(WriterObj, &Writer_Type); + _csvstate *module_state = get_csv_state(module); + WriterObj * self = PyObject_GC_New(WriterObj, module_state->writer_type); _Py_IDENTIFIER(write); if (!self) @@ -1379,6 +1404,8 @@ csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args) self->rec_len = 0; self->num_fields = 0; + self->error_obj = Py_NewRef(module_state->error_obj); + if (!PyArg_UnpackTuple(args, "", 1, 2, &output_file, &dialect)) { Py_DECREF(self); return NULL; @@ -1393,7 +1420,8 @@ csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args) Py_DECREF(self); return NULL; } - self->dialect = (DialectObj *)_call_dialect(dialect, keyword_args); + self->dialect = (DialectObj *)_call_dialect(module_state, dialect, + keyword_args); if (self->dialect == NULL) { Py_DECREF(self); return NULL; @@ -1408,13 +1436,14 @@ csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args) static PyObject * csv_list_dialects(PyObject *module, PyObject *args) { - return PyDict_Keys(_csvstate_global->dialects); + return PyDict_Keys(get_csv_state(module)->dialects); } static PyObject * csv_register_dialect(PyObject *module, PyObject *args, PyObject *kwargs) { PyObject *name_obj, *dialect_obj = NULL; + _csvstate *module_state = get_csv_state(module); PyObject *dialect; if (!PyArg_UnpackTuple(args, "", 1, 2, &name_obj, &dialect_obj)) @@ -1426,10 +1455,10 @@ csv_register_dialect(PyObject *module, PyObject *args, PyObject *kwargs) } if (PyUnicode_READY(name_obj) == -1) return NULL; - dialect = _call_dialect(dialect_obj, kwargs); + dialect = _call_dialect(module_state, dialect_obj, kwargs); if (dialect == NULL) return NULL; - if (PyDict_SetItem(_csvstate_global->dialects, name_obj, dialect) < 0) { + if (PyDict_SetItem(module_state->dialects, name_obj, dialect) < 0) { Py_DECREF(dialect); return NULL; } @@ -1440,9 +1469,10 @@ csv_register_dialect(PyObject *module, PyObject *args, PyObject *kwargs) static PyObject * csv_unregister_dialect(PyObject *module, PyObject *name_obj) { - if (PyDict_DelItem(_csvstate_global->dialects, name_obj) < 0) { + _csvstate *module_state = get_csv_state(module); + if (PyDict_DelItem(module_state->dialects, name_obj) < 0) { if (PyErr_ExceptionMatches(PyExc_KeyError)) { - PyErr_Format(_csvstate_global->error_obj, "unknown dialect"); + PyErr_Format(module_state->error_obj, "unknown dialect"); } return NULL; } @@ -1452,14 +1482,15 @@ csv_unregister_dialect(PyObject *module, PyObject *name_obj) static PyObject * csv_get_dialect(PyObject *module, PyObject *name_obj) { - return get_dialect_from_registry(name_obj); + return get_dialect_from_registry(name_obj, get_csv_state(module)); } static PyObject * csv_field_size_limit(PyObject *module, PyObject *args) { PyObject *new_limit = NULL; - long old_limit = _csvstate_global->field_limit; + _csvstate *module_state = get_csv_state(module); + long old_limit = module_state->field_limit; if (!PyArg_UnpackTuple(args, "field_size_limit", 0, 1, &new_limit)) return NULL; @@ -1469,15 +1500,25 @@ csv_field_size_limit(PyObject *module, PyObject *args) "limit must be an integer"); return NULL; } - _csvstate_global->field_limit = PyLong_AsLong(new_limit); - if (_csvstate_global->field_limit == -1 && PyErr_Occurred()) { - _csvstate_global->field_limit = old_limit; + module_state->field_limit = PyLong_AsLong(new_limit); + if (module_state->field_limit == -1 && PyErr_Occurred()) { + module_state->field_limit = old_limit; return NULL; } } return PyLong_FromLong(old_limit); } +static PyType_Slot error_slots[] = { + {0, NULL}, +}; + +PyType_Spec error_spec = { + .name = "_csv.Error", + .flags = Py_TPFLAGS_DEFAULT, + .slots = error_slots, +}; + /* * MODULE */ @@ -1610,68 +1651,89 @@ static struct PyMethodDef csv_methods[] = { { NULL, NULL } }; -static struct PyModuleDef _csvmodule = { - PyModuleDef_HEAD_INIT, - "_csv", - csv_module_doc, - sizeof(_csvstate), - csv_methods, - NULL, - _csv_traverse, - _csv_clear, - _csv_free -}; - -PyMODINIT_FUNC -PyInit__csv(void) -{ - PyObject *module; +static int +csv_exec(PyObject *module) { const StyleDesc *style; + PyObject *temp; + _csvstate *module_state = get_csv_state(module); - if (PyType_Ready(&Reader_Type) < 0) - return NULL; + temp = PyType_FromModuleAndSpec(module, &Dialect_Type_spec, NULL); + module_state->dialect_type = (PyTypeObject *)temp; + if (PyModule_AddObjectRef(module, "Dialect", temp) < 0) { + return -1; + } - if (PyType_Ready(&Writer_Type) < 0) - return NULL; + temp = PyType_FromModuleAndSpec(module, &Reader_Type_spec, NULL); + module_state->reader_type = (PyTypeObject *)temp; + if (PyModule_AddObjectRef(module, "Reader", temp) < 0) { + return -1; + } - /* Create the module and add the functions */ - module = PyModule_Create(&_csvmodule); - if (module == NULL) - return NULL; + temp = PyType_FromModuleAndSpec(module, &Writer_Type_spec, NULL); + module_state->writer_type = (PyTypeObject *)temp; + if (PyModule_AddObjectRef(module, "Writer", temp) < 0) { + return -1; + } /* Add version to the module. */ if (PyModule_AddStringConstant(module, "__version__", - MODULE_VERSION) == -1) - return NULL; + MODULE_VERSION) == -1) { + return -1; + } /* Set the field limit */ - get_csv_state(module)->field_limit = 128 * 1024; - /* Do I still need to add this var to the Module Dict? */ + module_state->field_limit = 128 * 1024; /* Add _dialects dictionary */ - get_csv_state(module)->dialects = PyDict_New(); - if (get_csv_state(module)->dialects == NULL) - return NULL; - Py_INCREF(get_csv_state(module)->dialects); - if (PyModule_AddObject(module, "_dialects", get_csv_state(module)->dialects)) - return NULL; + module_state->dialects = PyDict_New(); + if (PyModule_AddObjectRef(module, "_dialects", module_state->dialects) < 0) { + return -1; + } /* Add quote styles into dictionary */ for (style = quote_styles; style->name; style++) { if (PyModule_AddIntConstant(module, style->name, style->style) == -1) - return NULL; + return -1; } - if (PyModule_AddType(module, &Dialect_Type)) { - return NULL; + /* Add the CSV exception object to the module. */ + PyObject *bases = PyTuple_Pack(1, PyExc_Exception); + if (bases == NULL) { + return -1; + } + module_state->error_obj = PyType_FromModuleAndSpec(module, &error_spec, + bases); + Py_DECREF(bases); + if (module_state->error_obj == NULL) { + return -1; + } + if (PyModule_AddType(module, (PyTypeObject *)module_state->error_obj) != 0) { + return -1; } - /* Add the CSV exception object to the module. */ - get_csv_state(module)->error_obj = PyErr_NewException("_csv.Error", NULL, NULL); - if (get_csv_state(module)->error_obj == NULL) - return NULL; - Py_INCREF(get_csv_state(module)->error_obj); - PyModule_AddObject(module, "Error", get_csv_state(module)->error_obj); - return module; + return 0; +} + +static PyModuleDef_Slot csv_slots[] = { + {Py_mod_exec, csv_exec}, + {0, NULL} +}; + +static struct PyModuleDef _csvmodule = { + PyModuleDef_HEAD_INIT, + "_csv", + csv_module_doc, + sizeof(_csvstate), + csv_methods, + csv_slots, + _csv_traverse, + _csv_clear, + _csv_free +}; + +PyMODINIT_FUNC +PyInit__csv(void) +{ + return PyModuleDef_Init(&_csvmodule); } From 770e3c2583e3ddef8912d06a27ce087a0908e570 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 15 Dec 2020 16:08:16 +0100 Subject: [PATCH 0781/1261] bpo-42639: Add script_helper.run_test_script() (GH-23777) * Add run_test_script() function to test.support.script_helper. * Rename Lib/test/eintrdata/eintr_tester.py to Lib/test/_test_eintr.py. * test_eintr.py uses run_test_script(). --- .../eintr_tester.py => _test_eintr.py} | 0 Lib/test/support/script_helper.py | 32 +++++++++++++++++++ Lib/test/test_eintr.py | 18 ++--------- 3 files changed, 34 insertions(+), 16 deletions(-) rename Lib/test/{eintrdata/eintr_tester.py => _test_eintr.py} (100%) diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/_test_eintr.py similarity index 100% rename from Lib/test/eintrdata/eintr_tester.py rename to Lib/test/_test_eintr.py diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py index 09bb586dcf79d0..6d699c8486cd20 100644 --- a/Lib/test/support/script_helper.py +++ b/Lib/test/support/script_helper.py @@ -11,12 +11,14 @@ import zipfile from importlib.util import source_from_cache +from test import support from test.support.import_helper import make_legacy_pyc # Cached result of the expensive test performed in the function below. __cached_interp_requires_environment = None + def interpreter_requires_environment(): """ Returns True if our sys.executable interpreter requires environment @@ -136,12 +138,14 @@ def run_python_until_end(*args, **env_vars): rc = proc.returncode return _PythonRunResult(rc, out, err), cmd_line + def _assert_python(expected_success, /, *args, **env_vars): res, cmd_line = run_python_until_end(*args, **env_vars) if (res.rc and expected_success) or (not res.rc and not expected_success): res.fail(cmd_line) return res + def assert_python_ok(*args, **env_vars): """ Assert that running the interpreter with `args` and optional environment @@ -155,6 +159,7 @@ def assert_python_ok(*args, **env_vars): """ return _assert_python(True, *args, **env_vars) + def assert_python_failure(*args, **env_vars): """ Assert that running the interpreter with `args` and optional environment @@ -165,6 +170,7 @@ def assert_python_failure(*args, **env_vars): """ return _assert_python(False, *args, **env_vars) + def spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw): """Run a Python subprocess with the given arguments. @@ -187,6 +193,7 @@ def spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw): stdout=stdout, stderr=stderr, **kw) + def kill_python(p): """Run the given Popen process until completion and return stdout.""" p.stdin.close() @@ -198,6 +205,7 @@ def kill_python(p): subprocess._cleanup() return data + def make_script(script_dir, script_basename, source, omit_suffix=False): script_filename = script_basename if not omit_suffix: @@ -209,6 +217,7 @@ def make_script(script_dir, script_basename, source, omit_suffix=False): importlib.invalidate_caches() return script_name + def make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None): zip_filename = zip_basename+os.extsep+'zip' zip_name = os.path.join(zip_dir, zip_filename) @@ -228,10 +237,12 @@ def make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None): # zip_file.printdir() return zip_name, os.path.join(zip_name, name_in_zip) + def make_pkg(pkg_dir, init_source=''): os.mkdir(pkg_dir) make_script(pkg_dir, '__init__', init_source) + def make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, source, depth=1, compiled=False): unlink = [] @@ -260,3 +271,24 @@ def make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, # print 'Contents of %r:' % zip_name # zip_file.printdir() return zip_name, os.path.join(zip_name, script_name_in_zip) + + +def run_test_script(script): + # use -u to try to get the full output if the test hangs or crash + if support.verbose: + def title(text): + return f"===== {text} ======" + + name = f"script {os.path.basename(script)}" + print() + print(title(name), flush=True) + # In verbose mode, the child process inherit stdout and stdout, + # to see output in realtime and reduce the risk of losing output. + args = [sys.executable, "-E", "-X", "faulthandler", "-u", script, "-v"] + proc = subprocess.run(args) + print(title(f"{name} completed: exit code {proc.returncode}"), + flush=True) + if proc.returncode: + raise AssertionError(f"{name} failed") + else: + assert_python_ok("-u", script, "-v") diff --git a/Lib/test/test_eintr.py b/Lib/test/test_eintr.py index a5f8f6465e88b8..b61cdfa0a122d9 100644 --- a/Lib/test/test_eintr.py +++ b/Lib/test/test_eintr.py @@ -15,22 +15,8 @@ class EINTRTests(unittest.TestCase): def test_all(self): # Run the tester in a sub-process, to make sure there is only one # thread (for reliable signal delivery). - tester = support.findfile("eintr_tester.py", subdir="eintrdata") - # use -u to try to get the full output if the test hangs or crash - args = ["-u", tester, "-v"] - if support.verbose: - print() - print("--- run eintr_tester.py ---", flush=True) - # In verbose mode, the child process inherit stdout and stdout, - # to see output in realtime and reduce the risk of losing output. - args = [sys.executable, "-E", "-X", "faulthandler", *args] - proc = subprocess.run(args) - print(f"--- eintr_tester.py completed: " - f"exit code {proc.returncode} ---", flush=True) - if proc.returncode: - self.fail("eintr_tester.py failed") - else: - script_helper.assert_python_ok("-u", tester, "-v") + script = support.findfile("_test_eintr.py") + script_helper.run_test_script(script) if __name__ == "__main__": From d546bbe0de25ede055b733dd2b861819608b25bd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 15 Dec 2020 16:25:27 +0100 Subject: [PATCH 0782/1261] bpo-32381: pymain_run_file() uses PySys_FormatStderr() (GH-23778) If config->run_filename doesn't exist, log the error into sys.stderr using "%R" format, to escape properly unencodable characters (usually with backslashreplace). --- Modules/main.c | 51 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/Modules/main.c b/Modules/main.c index 7ffcb07a7fd4b6..b97034ea1e78a8 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -305,20 +305,23 @@ pymain_run_module(const wchar_t *modname, int set_argv0) static int -pymain_run_file(const PyConfig *config, PyCompilerFlags *cf) +pymain_run_file_obj(PyObject *program_name, PyObject *filename, + int skip_source_first_line, PyCompilerFlags *cf) { - const wchar_t *filename = config->run_filename; - if (PySys_Audit("cpython.run_file", "u", filename) < 0) { + if (PySys_Audit("cpython.run_file", "O", filename) < 0) { return pymain_exit_err_print(); } - FILE *fp = _Py_wfopen(filename, L"rb"); + + FILE *fp = _Py_fopen_obj(filename, "rb"); if (fp == NULL) { - fprintf(stderr, "%ls: can't open file '%ls': [Errno %d] %s\n", - config->program_name, filename, errno, strerror(errno)); + // Ignore the OSError + PyErr_Clear(); + PySys_FormatStderr("%S: can't open file %R: [Errno %d] %s\n", + program_name, filename, errno, strerror(errno)); return 2; } - if (config->skip_source_first_line) { + if (skip_source_first_line) { int ch; /* Push back first newline so line numbers remain the same */ while ((ch = getc(fp)) != EOF) { @@ -331,29 +334,43 @@ pymain_run_file(const PyConfig *config, PyCompilerFlags *cf) struct _Py_stat_struct sb; if (_Py_fstat_noraise(fileno(fp), &sb) == 0 && S_ISDIR(sb.st_mode)) { - fprintf(stderr, - "%ls: '%ls' is a directory, cannot continue\n", - config->program_name, filename); + PySys_FormatStderr("%S: %R is a directory, cannot continue\n", + program_name, filename); fclose(fp); return 1; } - /* call pending calls like signal handlers (SIGINT) */ + // Call pending calls like signal handlers (SIGINT) if (Py_MakePendingCalls() == -1) { fclose(fp); return pymain_exit_err_print(); } - PyObject *filename_obj = PyUnicode_FromWideChar(filename, -1); - if (filename_obj == NULL) { + /* PyRun_AnyFileExFlags(closeit=1) calls fclose(fp) before running code */ + int run = _PyRun_AnyFileObject(fp, filename, 1, cf); + return (run != 0); +} + +static int +pymain_run_file(const PyConfig *config, PyCompilerFlags *cf) +{ + PyObject *filename = PyUnicode_FromWideChar(config->run_filename, -1); + if (filename == NULL) { + PyErr_Print(); + return -1; + } + PyObject *program_name = PyUnicode_FromWideChar(config->program_name, -1); + if (program_name == NULL) { + Py_DECREF(filename); PyErr_Print(); return -1; } - /* PyRun_AnyFileExFlags(closeit=1) calls fclose(fp) before running code */ - int run = _PyRun_AnyFileObject(fp, filename_obj, 1, cf); - Py_XDECREF(filename_obj); - return (run != 0); + int res = pymain_run_file_obj(program_name, filename, + config->skip_source_first_line, cf); + Py_DECREF(filename); + Py_DECREF(program_name); + return res; } From 3dfd425e2c67d3d8d72b012f0da76ea45ba12067 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 15 Dec 2020 17:12:02 +0100 Subject: [PATCH 0783/1261] bpo-42639: atexit._run_exitfuncs() uses sys.unraisablehook (GH-23779) atexit._run_exitfuncs() now logs callback exceptions using sys.unraisablehook, rather than logging them directly into sys.stderr and raising the last exception. Run GeneralTest of test_atexit in a subprocess since it calls atexit._clear() which clears all atexit callbacks. _PyAtExit_Fini() sets state->callbacks to NULL. --- Lib/test/_test_atexit.py | 121 ++++++++++++++ Lib/test/test_atexit.py | 151 +----------------- Lib/test/test_eintr.py | 3 - .../2020-12-15-15-14-29.bpo-42639.uJ3h8I.rst | 3 + Modules/atexitmodule.c | 46 ++---- 5 files changed, 140 insertions(+), 184 deletions(-) create mode 100644 Lib/test/_test_atexit.py create mode 100644 Misc/NEWS.d/next/Library/2020-12-15-15-14-29.bpo-42639.uJ3h8I.rst diff --git a/Lib/test/_test_atexit.py b/Lib/test/_test_atexit.py new file mode 100644 index 00000000000000..a31658531113ba --- /dev/null +++ b/Lib/test/_test_atexit.py @@ -0,0 +1,121 @@ +""" +Tests run by test_atexit in a subprocess since it clears atexit callbacks. +""" +import atexit +import sys +import unittest +from test import support + + +class GeneralTest(unittest.TestCase): + def setUp(self): + atexit._clear() + + def tearDown(self): + atexit._clear() + + def assert_raises_unraisable(self, exc_type, func, *args): + with support.catch_unraisable_exception() as cm: + atexit.register(func, *args) + atexit._run_exitfuncs() + + self.assertEqual(cm.unraisable.object, func) + self.assertEqual(cm.unraisable.exc_type, exc_type) + self.assertEqual(type(cm.unraisable.exc_value), exc_type) + + def test_order(self): + # Check that callbacks are called in reverse order with the expected + # positional and keyword arguments. + calls = [] + + def func1(*args, **kwargs): + calls.append(('func1', args, kwargs)) + + def func2(*args, **kwargs): + calls.append(('func2', args, kwargs)) + + # be sure args are handled properly + atexit.register(func1, 1, 2) + atexit.register(func2) + atexit.register(func2, 3, key="value") + atexit._run_exitfuncs() + + self.assertEqual(calls, + [('func2', (3,), {'key': 'value'}), + ('func2', (), {}), + ('func1', (1, 2), {})]) + + def test_badargs(self): + def func(): + pass + + # func() has no parameter, but it's called with 2 parameters + self.assert_raises_unraisable(TypeError, func, 1 ,2) + + def test_raise(self): + def raise_type_error(): + raise TypeError + + self.assert_raises_unraisable(TypeError, raise_type_error) + + def test_raise_unnormalized(self): + # bpo-10756: Make sure that an unnormalized exception is handled + # properly. + def div_zero(): + 1 / 0 + + self.assert_raises_unraisable(ZeroDivisionError, div_zero) + + def test_exit(self): + self.assert_raises_unraisable(SystemExit, sys.exit) + + def test_stress(self): + a = [0] + def inc(): + a[0] += 1 + + for i in range(128): + atexit.register(inc) + atexit._run_exitfuncs() + + self.assertEqual(a[0], 128) + + def test_clear(self): + a = [0] + def inc(): + a[0] += 1 + + atexit.register(inc) + atexit._clear() + atexit._run_exitfuncs() + + self.assertEqual(a[0], 0) + + def test_unregister(self): + a = [0] + def inc(): + a[0] += 1 + def dec(): + a[0] -= 1 + + for i in range(4): + atexit.register(inc) + atexit.register(dec) + atexit.unregister(inc) + atexit._run_exitfuncs() + + self.assertEqual(a[0], -1) + + def test_bound_methods(self): + l = [] + atexit.register(l.append, 5) + atexit._run_exitfuncs() + self.assertEqual(l, [5]) + + atexit.unregister(l.append) + atexit._run_exitfuncs() + self.assertEqual(l, [5]) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index 29faaaf0a9d80e..e0feef7c653606 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -1,5 +1,4 @@ import atexit -import io import os import sys import textwrap @@ -7,154 +6,14 @@ from test import support from test.support import script_helper -### helpers -def h1(): - print("h1") - -def h2(): - print("h2") - -def h3(): - print("h3") - -def h4(*args, **kwargs): - print("h4", args, kwargs) - -def raise1(): - raise TypeError - -def raise2(): - raise SystemError - -def exit(): - raise SystemExit - class GeneralTest(unittest.TestCase): + def test_general(self): + # Run _test_atexit.py in a subprocess since it calls atexit._clear() + script = support.findfile("_test_atexit.py") + script_helper.run_test_script(script) - def setUp(self): - self.save_stdout = sys.stdout - self.save_stderr = sys.stderr - self.stream = io.StringIO() - sys.stdout = sys.stderr = self.stream - atexit._clear() - - def tearDown(self): - sys.stdout = self.save_stdout - sys.stderr = self.save_stderr - atexit._clear() - - def test_args(self): - # be sure args are handled properly - atexit.register(h1) - atexit.register(h4) - atexit.register(h4, 4, kw="abc") - atexit._run_exitfuncs() - - self.assertEqual(self.stream.getvalue(), - "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n") - - def test_badargs(self): - atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0) - self.assertRaises(TypeError, atexit._run_exitfuncs) - - def test_order(self): - # be sure handlers are executed in reverse order - atexit.register(h1) - atexit.register(h2) - atexit.register(h3) - atexit._run_exitfuncs() - - self.assertEqual(self.stream.getvalue(), "h3\nh2\nh1\n") - - def test_raise(self): - # be sure raises are handled properly - atexit.register(raise1) - atexit.register(raise2) - - self.assertRaises(TypeError, atexit._run_exitfuncs) - - def test_raise_unnormalized(self): - # Issue #10756: Make sure that an unnormalized exception is - # handled properly - atexit.register(lambda: 1 / 0) - - self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs) - self.assertIn("ZeroDivisionError", self.stream.getvalue()) - - def test_exit(self): - # be sure a SystemExit is handled properly - atexit.register(exit) - - self.assertRaises(SystemExit, atexit._run_exitfuncs) - self.assertEqual(self.stream.getvalue(), '') - - def test_print_tracebacks(self): - # Issue #18776: the tracebacks should be printed when errors occur. - def f(): - 1/0 # one - def g(): - 1/0 # two - def h(): - 1/0 # three - atexit.register(f) - atexit.register(g) - atexit.register(h) - - self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs) - stderr = self.stream.getvalue() - self.assertEqual(stderr.count("ZeroDivisionError"), 3) - self.assertIn("# one", stderr) - self.assertIn("# two", stderr) - self.assertIn("# three", stderr) - - def test_stress(self): - a = [0] - def inc(): - a[0] += 1 - - for i in range(128): - atexit.register(inc) - atexit._run_exitfuncs() - - self.assertEqual(a[0], 128) - - def test_clear(self): - a = [0] - def inc(): - a[0] += 1 - - atexit.register(inc) - atexit._clear() - atexit._run_exitfuncs() - - self.assertEqual(a[0], 0) - - def test_unregister(self): - a = [0] - def inc(): - a[0] += 1 - def dec(): - a[0] -= 1 - - for i in range(4): - atexit.register(inc) - atexit.register(dec) - atexit.unregister(inc) - atexit._run_exitfuncs() - - self.assertEqual(a[0], -1) - - def test_bound_methods(self): - l = [] - atexit.register(l.append, 5) - atexit._run_exitfuncs() - self.assertEqual(l, [5]) - - atexit.unregister(l.append) - atexit._run_exitfuncs() - self.assertEqual(l, [5]) - +class FunctionalTest(unittest.TestCase): def test_shutdown(self): # Actually test the shutdown mechanism in a subprocess code = textwrap.dedent(""" diff --git a/Lib/test/test_eintr.py b/Lib/test/test_eintr.py index b61cdfa0a122d9..528147802ba47e 100644 --- a/Lib/test/test_eintr.py +++ b/Lib/test/test_eintr.py @@ -1,9 +1,6 @@ import os import signal -import subprocess -import sys import unittest - from test import support from test.support import script_helper diff --git a/Misc/NEWS.d/next/Library/2020-12-15-15-14-29.bpo-42639.uJ3h8I.rst b/Misc/NEWS.d/next/Library/2020-12-15-15-14-29.bpo-42639.uJ3h8I.rst new file mode 100644 index 00000000000000..847c24112f9a8f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-15-15-14-29.bpo-42639.uJ3h8I.rst @@ -0,0 +1,3 @@ +:func:`atexit._run_exitfuncs` now logs callback exceptions using +:data:`sys.unraisablehook`, rather than logging them directly into +:data:`sys.stderr` and raise the last exception. diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index ae13eae75dbaec..49e2a75137e4ab 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -74,11 +74,12 @@ _PyAtExit_Fini(PyInterpreterState *interp) struct atexit_state *state = &interp->atexit; atexit_cleanup(state); PyMem_Free(state->callbacks); + state->callbacks = NULL; } static void -atexit_callfuncs(struct atexit_state *state, int ignore_exc) +atexit_callfuncs(struct atexit_state *state) { assert(!PyErr_Occurred()); @@ -86,7 +87,6 @@ atexit_callfuncs(struct atexit_state *state, int ignore_exc) return; } - PyObject *exc_type = NULL, *exc_value, *exc_tb; for (int i = state->ncallbacks - 1; i >= 0; i--) { atexit_callback *cb = state->callbacks[i]; if (cb == NULL) { @@ -95,24 +95,7 @@ atexit_callfuncs(struct atexit_state *state, int ignore_exc) PyObject *res = PyObject_Call(cb->func, cb->args, cb->kwargs); if (res == NULL) { - if (ignore_exc) { - _PyErr_WriteUnraisableMsg("in atexit callback", cb->func); - } - else { - /* Maintain the last exception, but don't leak if there are - multiple exceptions. */ - if (exc_type) { - Py_DECREF(exc_type); - Py_XDECREF(exc_value); - Py_XDECREF(exc_tb); - } - PyErr_Fetch(&exc_type, &exc_value, &exc_tb); - if (!PyErr_GivenExceptionMatches(exc_type, PyExc_SystemExit)) { - PySys_WriteStderr("Error in atexit._run_exitfuncs:\n"); - PyErr_NormalizeException(&exc_type, &exc_value, &exc_tb); - PyErr_Display(exc_type, exc_value, exc_tb); - } - } + _PyErr_WriteUnraisableMsg("in atexit callback", cb->func); } else { Py_DECREF(res); @@ -121,14 +104,7 @@ atexit_callfuncs(struct atexit_state *state, int ignore_exc) atexit_cleanup(state); - if (ignore_exc) { - assert(!PyErr_Occurred()); - } - else { - if (exc_type) { - PyErr_Restore(exc_type, exc_value, exc_tb); - } - } + assert(!PyErr_Occurred()); } @@ -136,7 +112,7 @@ void _PyAtExit_Call(PyThreadState *tstate) { struct atexit_state *state = &tstate->interp->atexit; - atexit_callfuncs(state, 1); + atexit_callfuncs(state); } @@ -177,8 +153,9 @@ atexit_register(PyObject *module, PyObject *args, PyObject *kwargs) state->callback_len += 16; size_t size = sizeof(atexit_callback*) * (size_t)state->callback_len; r = (atexit_callback**)PyMem_Realloc(state->callbacks, size); - if (r == NULL) + if (r == NULL) { return PyErr_NoMemory(); + } state->callbacks = r; } @@ -203,16 +180,15 @@ atexit_register(PyObject *module, PyObject *args, PyObject *kwargs) PyDoc_STRVAR(atexit_run_exitfuncs__doc__, "_run_exitfuncs() -> None\n\ \n\ -Run all registered exit functions."); +Run all registered exit functions.\n\ +\n\ +If a callaback raises an exception, it is logged with sys.unraisablehook."); static PyObject * atexit_run_exitfuncs(PyObject *module, PyObject *unused) { struct atexit_state *state = get_atexit_state(); - atexit_callfuncs(state, 0); - if (PyErr_Occurred()) { - return NULL; - } + atexit_callfuncs(state); Py_RETURN_NONE; } From fb38c64690a459d1ee0799d1e22b7911dd97a65d Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Tue, 15 Dec 2020 17:23:03 +0100 Subject: [PATCH 0784/1261] bpo-36675: Doc: Reveal doctest directives (GH-23620) --- .azure-pipelines/docs-steps.yml | 4 +-- Doc/library/doctest.rst | 54 ++++++++++++++++++++++----------- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/.azure-pipelines/docs-steps.yml b/.azure-pipelines/docs-steps.yml index 55c38611b95c81..8e72baf2b12fe1 100644 --- a/.azure-pipelines/docs-steps.yml +++ b/.azure-pipelines/docs-steps.yml @@ -12,7 +12,7 @@ steps: inputs: versionSpec: '>=3.6' -- script: python -m pip install sphinx==2.2.0 blurb python-docs-theme +- script: python -m pip install sphinx==3.2.1 blurb python-docs-theme displayName: 'Install build dependencies' - ${{ if ne(parameters.latex, 'true') }}: @@ -31,7 +31,7 @@ steps: - ${{ if eq(parameters.upload, 'true') }}: - task: PublishBuildArtifacts@1 displayName: 'Publish docs' - + inputs: PathToPublish: '$(build.sourcesDirectory)/Doc/build' ArtifactName: docs diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index a77322f83acbde..42ad0c9f06e237 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -719,36 +719,51 @@ above. An example's doctest directives modify doctest's behavior for that single example. Use ``+`` to enable the named behavior, or ``-`` to disable it. -For example, this test passes:: +For example, this test passes: - >>> print(list(range(20))) # doctest: +NORMALIZE_WHITESPACE +.. doctest:: + :no-trim-doctest-flags: + + >>> print(list(range(20))) # doctest: +NORMALIZE_WHITESPACE [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] Without the directive it would fail, both because the actual output doesn't have two blanks before the single-digit list elements, and because the actual output is on a single line. This test also passes, and also requires a directive to do -so:: +so: + +.. doctest:: + :no-trim-doctest-flags: - >>> print(list(range(20))) # doctest: +ELLIPSIS + >>> print(list(range(20))) # doctest: +ELLIPSIS [0, 1, ..., 18, 19] Multiple directives can be used on a single physical line, separated by -commas:: +commas: - >>> print(list(range(20))) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE +.. doctest:: + :no-trim-doctest-flags: + + >>> print(list(range(20))) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [0, 1, ..., 18, 19] If multiple directive comments are used for a single example, then they are -combined:: +combined: + +.. doctest:: + :no-trim-doctest-flags: - >>> print(list(range(20))) # doctest: +ELLIPSIS - ... # doctest: +NORMALIZE_WHITESPACE + >>> print(list(range(20))) # doctest: +ELLIPSIS + ... # doctest: +NORMALIZE_WHITESPACE [0, 1, ..., 18, 19] As the previous example shows, you can add ``...`` lines to your example containing only directives. This can be useful when an example is too long for -a directive to comfortably fit on the same line:: +a directive to comfortably fit on the same line: + +.. doctest:: + :no-trim-doctest-flags: >>> print(list(range(5)) + list(range(10, 20)) + list(range(30, 40))) ... # doctest: +ELLIPSIS @@ -793,18 +808,23 @@ instead. Another is to do :: There are others, but you get the idea. -Another bad idea is to print things that embed an object address, like :: +Another bad idea is to print things that embed an object address, like + +.. doctest:: - >>> id(1.0) # certain to fail some of the time + >>> id(1.0) # certain to fail some of the time # doctest: +SKIP 7948648 >>> class C: pass - >>> C() # the default repr() for instances embeds an address - <__main__.C instance at 0x00AC18F0> + >>> C() # the default repr() for instances embeds an address # doctest: +SKIP + + +The :const:`ELLIPSIS` directive gives a nice approach for the last example: -The :const:`ELLIPSIS` directive gives a nice approach for the last example:: +.. doctest:: + :no-trim-doctest-flags: - >>> C() #doctest: +ELLIPSIS - <__main__.C instance at 0x...> + >>> C() # doctest: +ELLIPSIS + Floating-point numbers are also subject to small output variations across platforms, because Python defers to the platform C library for float formatting, From d1132a7aadda1626b317d7e2b1db39dc6400ac47 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 15 Dec 2020 18:06:36 +0100 Subject: [PATCH 0785/1261] bpo-42641: Enhance test_select.test_select() (GH-23782) Enhance test_select.test_select(): it now takes 500 ms rather than 10 seconds. * Use Python rather than a shell as the child process to make the test more portable. * Use a sleep of 50 ms per line rather than 1 second. * Use subprocess.Popen rather than os.popen(). --- Lib/test/test_select.py | 30 +++++++++++++------ .../2020-12-15-17-38-04.bpo-42641.uzwlF_.rst | 2 ++ 2 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-12-15-17-38-04.bpo-42641.uzwlF_.rst diff --git a/Lib/test/test_select.py b/Lib/test/test_select.py index 458998a62fdf5e..4ddd5fb96e0ce1 100644 --- a/Lib/test/test_select.py +++ b/Lib/test/test_select.py @@ -1,7 +1,9 @@ import errno import os import select +import subprocess import sys +import textwrap import unittest from test import support @@ -45,16 +47,25 @@ def test_returned_list_identity(self): self.assertIsNot(w, x) def test_select(self): - cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done' - with os.popen(cmd) as p: - for tout in (0, 1, 2, 4, 8, 16) + (None,)*10: + code = textwrap.dedent(''' + import time + for i in range(10): + print("testing...", flush=True) + time.sleep(0.050) + ''') + cmd = [sys.executable, '-I', '-c', code] + with subprocess.Popen(cmd, stdout=subprocess.PIPE) as proc: + pipe = proc.stdout + for timeout in (0, 1, 2, 4, 8, 16) + (None,)*10: if support.verbose: - print('timeout =', tout) - rfd, wfd, xfd = select.select([p], [], [], tout) - if (rfd, wfd, xfd) == ([], [], []): + print(f'timeout = {timeout}') + rfd, wfd, xfd = select.select([pipe], [], [], timeout) + self.assertEqual(wfd, []) + self.assertEqual(xfd, []) + if not rfd: continue - if (rfd, wfd, xfd) == ([p], [], []): - line = p.readline() + if rfd == [pipe]: + line = pipe.readline() if support.verbose: print(repr(line)) if not line: @@ -62,7 +73,8 @@ def test_select(self): print('EOF') break continue - self.fail('Unexpected return values from select():', rfd, wfd, xfd) + self.fail('Unexpected return values from select():', + rfd, wfd, xfd) # Issue 16230: Crash on select resized list def test_select_mutated(self): diff --git a/Misc/NEWS.d/next/Tests/2020-12-15-17-38-04.bpo-42641.uzwlF_.rst b/Misc/NEWS.d/next/Tests/2020-12-15-17-38-04.bpo-42641.uzwlF_.rst new file mode 100644 index 00000000000000..bf890b73ee720e --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-12-15-17-38-04.bpo-42641.uzwlF_.rst @@ -0,0 +1,2 @@ +Enhance ``test_select.test_select()``: it now takes 500 ms rather than 10 +seconds. Use Python rather than a shell to make the test more portable. From 74f2659e9cb9c865b4302c68622dbe15839c6a38 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 15 Dec 2020 18:16:13 +0000 Subject: [PATCH 0786/1261] Update stable ABI script for MacOS and update list of exported symbols (GH-23783) --- Doc/data/stable_abi.dat | 1 + Tools/scripts/stable_abi.py | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 28cb50b12301ba..c2c9c6e11e4ce1 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -743,6 +743,7 @@ Py_FileSystemDefaultEncodeErrors Py_FileSystemDefaultEncoding Py_Finalize Py_FinalizeEx +Py_FrozenMain Py_GenericAlias Py_GenericAliasType Py_GetBuildInfo diff --git a/Tools/scripts/stable_abi.py b/Tools/scripts/stable_abi.py index b3a46f985e0a2d..47547a97bfd318 100755 --- a/Tools/scripts/stable_abi.py +++ b/Tools/scripts/stable_abi.py @@ -31,6 +31,7 @@ "ucnhash.h", } +MACOS = (sys.platform == "darwin") def get_exported_symbols(library, dynamic=False): # Only look at dynamic symbols @@ -57,7 +58,10 @@ def get_exported_symbols(library, dynamic=False): continue symbol = parts[-1] - yield symbol + if MACOS and symbol.startswith("_"): + yield symbol[1:] + else: + yield symbol def check_library(stable_abi_file, library, abi_funcs, dynamic=False): From b5d4668566da3741b2a374cf9dcc492fb242e14b Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 15 Dec 2020 11:04:55 -0800 Subject: [PATCH 0787/1261] Let dependabot create PRs against the maintenance branches (GH-22992) With this, we don't have to manually trigger backport whenever there is update to GitHub Actions dependencies. --- .github/dependabot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e90677b9f775a7..d9cbb3c7ec3854 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,3 +7,7 @@ updates: labels: - "skip issue" - "skip news" + target_branch: + - "master" + - "3.9" + - "3.8" From 8dcc0dc0074711269f7956dd031271271035f904 Mon Sep 17 00:00:00 2001 From: E-Paine <63801254+E-Paine@users.noreply.github.com> Date: Tue, 15 Dec 2020 19:42:55 +0000 Subject: [PATCH 0788/1261] bpo-40219: Lowered ttk LabeledScale dummy (GH-21467) --- Lib/tkinter/ttk.py | 5 ++++- .../next/Library/2020-07-13-19-43-11.bpo-40219.MUoJEP.rst | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-07-13-19-43-11.bpo-40219.MUoJEP.rst diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index 968fd54dce1ee0..f3a2f7660f30b8 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -1538,7 +1538,10 @@ def __init__(self, master=None, variable=None, from_=0, to=10, **kw): scale_side = 'bottom' if self._label_top else 'top' label_side = 'top' if scale_side == 'bottom' else 'bottom' self.scale.pack(side=scale_side, fill='x') - tmp = Label(self).pack(side=label_side) # place holder + # Dummy required to make frame correct height + dummy = Label(self) + dummy.pack(side=label_side) + dummy.lower() self.label.place(anchor='n' if label_side == 'top' else 's') # update the label as scale or variable changes diff --git a/Misc/NEWS.d/next/Library/2020-07-13-19-43-11.bpo-40219.MUoJEP.rst b/Misc/NEWS.d/next/Library/2020-07-13-19-43-11.bpo-40219.MUoJEP.rst new file mode 100644 index 00000000000000..aedc5c49b4087a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-07-13-19-43-11.bpo-40219.MUoJEP.rst @@ -0,0 +1 @@ +Lowered :class:`tkinter.ttk.LabeledScale` dummy widget to prevent hiding part of the content label. From e3096b49cab5855a67cbcfb15d5baffadb81786d Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 15 Dec 2020 11:58:43 -0800 Subject: [PATCH 0789/1261] Adding "stale" GitHub Action (GH-21247) Adding "stale" GitHub Action Added the "stale" GitHub action to the CPython repo. PR's older than 30 days will be labeled as stale using the "stale-pr" label. Closes https://github.com/python/core-workflow/issues/372 Co-authored-by: Brett Cannon --- .github/workflows/stale.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 00000000000000..706d8e11a20735 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,19 @@ +name: Mark stale pull requests + +on: + schedule: + - cron: "0 0 * * *" + +jobs: + stale: + + runs-on: ubuntu-latest + + steps: + - uses: actions/stale@v3 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity. Remove stale label or comment or this will be closed in 5 days' + stale-pr-label: 'stale' + days-before-stale: 30 + days-before-close: -1 From 57a349ed82f84ef66ef65095a6ba687ec965f705 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Wed, 16 Dec 2020 05:20:07 +0800 Subject: [PATCH 0790/1261] bpo-31904: Disable os.popen and popen test cases on VxWorks (GH-21687) --- Doc/library/os.rst | 2 +- Lib/os.py | 94 ++++++++++--------- Lib/test/test_os.py | 2 + Lib/test/test_popen.py | 3 + Lib/test/test_posix.py | 1 + Lib/test/test_select.py | 1 + .../2020-07-30-18-06-15.bpo-31904.y3d8dk.rst | 1 + 7 files changed, 58 insertions(+), 46 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-07-30-18-06-15.bpo-31904.y3d8dk.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index a4c5fbb481521e..b3099886889599 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -32,7 +32,7 @@ Notes on the availability of these functions: objects, and result in an object of the same type, if a path or file name is returned. -* On VxWorks, os.fork, os.execv and os.spawn*p* are not supported. +* On VxWorks, os.popen, os.fork, os.execv and os.spawn*p* are not supported. .. note:: diff --git a/Lib/os.py b/Lib/os.py index b794159f86c33e..05e9c32c5a7117 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -36,7 +36,7 @@ __all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep", "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR", "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen", - "popen", "extsep"] + "extsep"] def _exists(name): return name in globals() @@ -969,51 +969,55 @@ def spawnlpe(mode, file, *args): __all__.extend(["spawnlp", "spawnlpe"]) - -# Supply os.popen() -def popen(cmd, mode="r", buffering=-1): - if not isinstance(cmd, str): - raise TypeError("invalid cmd type (%s, expected string)" % type(cmd)) - if mode not in ("r", "w"): - raise ValueError("invalid mode %r" % mode) - if buffering == 0 or buffering is None: - raise ValueError("popen() does not support unbuffered streams") - import subprocess, io - if mode == "r": - proc = subprocess.Popen(cmd, - shell=True, - stdout=subprocess.PIPE, - bufsize=buffering) - return _wrap_close(io.TextIOWrapper(proc.stdout), proc) - else: - proc = subprocess.Popen(cmd, - shell=True, - stdin=subprocess.PIPE, - bufsize=buffering) - return _wrap_close(io.TextIOWrapper(proc.stdin), proc) - -# Helper for popen() -- a proxy for a file whose close waits for the process -class _wrap_close: - def __init__(self, stream, proc): - self._stream = stream - self._proc = proc - def close(self): - self._stream.close() - returncode = self._proc.wait() - if returncode == 0: - return None - if name == 'nt': - return returncode +# VxWorks has no user space shell provided. As a result, running +# command in a shell can't be supported. +if sys.platform != 'vxworks': + # Supply os.popen() + def popen(cmd, mode="r", buffering=-1): + if not isinstance(cmd, str): + raise TypeError("invalid cmd type (%s, expected string)" % type(cmd)) + if mode not in ("r", "w"): + raise ValueError("invalid mode %r" % mode) + if buffering == 0 or buffering is None: + raise ValueError("popen() does not support unbuffered streams") + import subprocess, io + if mode == "r": + proc = subprocess.Popen(cmd, + shell=True, + stdout=subprocess.PIPE, + bufsize=buffering) + return _wrap_close(io.TextIOWrapper(proc.stdout), proc) else: - return returncode << 8 # Shift left to match old behavior - def __enter__(self): - return self - def __exit__(self, *args): - self.close() - def __getattr__(self, name): - return getattr(self._stream, name) - def __iter__(self): - return iter(self._stream) + proc = subprocess.Popen(cmd, + shell=True, + stdin=subprocess.PIPE, + bufsize=buffering) + return _wrap_close(io.TextIOWrapper(proc.stdin), proc) + + # Helper for popen() -- a proxy for a file whose close waits for the process + class _wrap_close: + def __init__(self, stream, proc): + self._stream = stream + self._proc = proc + def close(self): + self._stream.close() + returncode = self._proc.wait() + if returncode == 0: + return None + if name == 'nt': + return returncode + else: + return returncode << 8 # Shift left to match old behavior + def __enter__(self): + return self + def __exit__(self, *args): + self.close() + def __getattr__(self, name): + return getattr(self._stream, name) + def __iter__(self): + return iter(self._stream) + + __all__.append("popen") # Supply os.fdopen() def fdopen(fd, *args, **kwargs): diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index dbb2975c0eee49..08d7ab8a30ba7e 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -991,6 +991,7 @@ def _empty_mapping(self): # Bug 1110478 @unittest.skipUnless(unix_shell and os.path.exists(unix_shell), 'requires a shell') + @unittest.skipUnless(hasattr(os, 'popen'), "needs os.popen()") def test_update2(self): os.environ.clear() os.environ.update(HELLO="World") @@ -1000,6 +1001,7 @@ def test_update2(self): @unittest.skipUnless(unix_shell and os.path.exists(unix_shell), 'requires a shell') + @unittest.skipUnless(hasattr(os, 'popen'), "needs os.popen()") def test_os_popen_iter(self): with os.popen("%s -c 'echo \"line1\nline2\nline3\"'" % unix_shell) as popen: diff --git a/Lib/test/test_popen.py b/Lib/test/test_popen.py index ab1bc776552ca9..cac2f6177f3257 100644 --- a/Lib/test/test_popen.py +++ b/Lib/test/test_popen.py @@ -7,6 +7,9 @@ from test import support import os, sys +if not hasattr(os, 'popen'): + raise unittest.SkipTest("need os.popen()") + # Test that command-lines get down as we expect. # To do this we execute: # python -c "import sys;print(sys.argv)" {rest_of_commandline} diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 185b293b070469..cd18a4972fa2c7 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1045,6 +1045,7 @@ def test_getgrouplist(self): @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()") + @unittest.skipUnless(hasattr(os, 'popen'), "test needs os.popen()") def test_getgroups(self): with os.popen('id -G 2>/dev/null') as idg: groups = idg.read().strip() diff --git a/Lib/test/test_select.py b/Lib/test/test_select.py index 4ddd5fb96e0ce1..f63564e6b0ee6d 100644 --- a/Lib/test/test_select.py +++ b/Lib/test/test_select.py @@ -46,6 +46,7 @@ def test_returned_list_identity(self): self.assertIsNot(r, x) self.assertIsNot(w, x) + @unittest.skipUnless(hasattr(os, 'popen'), "need os.popen()") def test_select(self): code = textwrap.dedent(''' import time diff --git a/Misc/NEWS.d/next/Tests/2020-07-30-18-06-15.bpo-31904.y3d8dk.rst b/Misc/NEWS.d/next/Tests/2020-07-30-18-06-15.bpo-31904.y3d8dk.rst new file mode 100644 index 00000000000000..fa2974963bf019 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-07-30-18-06-15.bpo-31904.y3d8dk.rst @@ -0,0 +1 @@ +Disable os.popen and impacted tests on VxWorks From 467b30aa0eff466a976e9e355d2248d210871af4 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Wed, 16 Dec 2020 05:21:53 +0800 Subject: [PATCH 0791/1261] bpo-31904: Skip some tests of changing owner in _test_all_chown_common() on VxWorks (GH-23716) --- Lib/test/test_posix.py | 13 +++++++++++-- .../Tests/2020-12-09-15-23-28.bpo-31904.ghj38d.rst | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-12-09-15-23-28.bpo-31904.ghj38d.rst diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index cd18a4972fa2c7..588c86994b4bd2 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -724,11 +724,20 @@ def check_stat(uid, gid): chown_func(first_param, uid, -1) check_stat(uid, gid) - if uid == 0: + if sys.platform == "vxworks": + # On VxWorks, root user id is 1 and 0 means no login user: + # both are super users. + is_root = (uid in (0, 1)) + else: + is_root = (uid == 0) + if is_root: # Try an amusingly large uid/gid to make sure we handle # large unsigned values. (chown lets you use any # uid/gid you like, even if they aren't defined.) # + # On VxWorks uid_t is defined as unsigned short. A big + # value greater than 65535 will result in underflow error. + # # This problem keeps coming up: # http://bugs.python.org/issue1747858 # http://bugs.python.org/issue4591 @@ -738,7 +747,7 @@ def check_stat(uid, gid): # This part of the test only runs when run as root. # Only scary people run their tests as root. - big_value = 2**31 + big_value = (2**31 if sys.platform != "vxworks" else 2**15) chown_func(first_param, big_value, big_value) check_stat(big_value, big_value) chown_func(first_param, -1, -1) diff --git a/Misc/NEWS.d/next/Tests/2020-12-09-15-23-28.bpo-31904.ghj38d.rst b/Misc/NEWS.d/next/Tests/2020-12-09-15-23-28.bpo-31904.ghj38d.rst new file mode 100644 index 00000000000000..654562bf407b16 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-12-09-15-23-28.bpo-31904.ghj38d.rst @@ -0,0 +1 @@ +Skip some tests in _test_all_chown_common() on VxWorks. From fbe75ad043bc1aacce0131c829e37659cb5f2dcb Mon Sep 17 00:00:00 2001 From: pxinwr Date: Wed, 16 Dec 2020 05:24:00 +0800 Subject: [PATCH 0792/1261] bpo-31904: Skip os.path.expanduser() tests on VxWorks (GH-23776) --- Lib/test/test_pathlib.py | 2 ++ Lib/test/test_posixpath.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 7f7f72c625806f..9be72941d33544 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -2467,6 +2467,8 @@ def test_rglob(self): @unittest.skipUnless(hasattr(pwd, 'getpwall'), 'pwd module does not expose getpwall()') + @unittest.skipIf(sys.platform == "vxworks", + "no home directory on VxWorks") def test_expanduser(self): P = self.cls import_helper.import_module('pwd') diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py index 42fd8ef8b17465..e18d01f4635a3a 100644 --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -1,5 +1,6 @@ import os import posixpath +import sys import unittest from posixpath import realpath, abspath, dirname, basename from test import test_genericpath @@ -262,6 +263,8 @@ def test_expanduser_home_envvar(self): self.assertEqual(posixpath.expanduser("~/"), "/") self.assertEqual(posixpath.expanduser("~/foo"), "/foo") + @unittest.skipIf(sys.platform == "vxworks", + "no home directory on VxWorks") def test_expanduser_pwd(self): pwd = import_helper.import_module('pwd') From c4af3188cb5b1b6652bfc5862b9dab8aab32bc35 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Tue, 15 Dec 2020 21:12:54 -0500 Subject: [PATCH 0793/1261] bpo-42090: zipfile.Path.joinpath now accepts multiple arguments (GH-22976) Automerge-Triggered-By: GH:jaraco --- Doc/library/zipfile.rst | 15 ++++++++++++++- Lib/test/test_zipfile.py | 6 ++++++ Lib/zipfile.py | 4 ++-- .../2020-10-25-14-48-57.bpo-42090.Ubuc0j.rst | 2 ++ 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-25-14-48-57.bpo-42090.Ubuc0j.rst diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 7126d8bd703f62..3db55e646c47cc 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -483,7 +483,7 @@ Path Objects Path objects expose the following features of :mod:`pathlib.Path` objects: -Path objects are traversable using the ``/`` operator. +Path objects are traversable using the ``/`` operator or ``joinpath``. .. attribute:: Path.name @@ -532,6 +532,19 @@ Path objects are traversable using the ``/`` operator. Read the current file as bytes. +.. method:: Path.joinpath(*other) + + Return a new Path object with each of the *other* arguments + joined. The following are equivalent:: + + >>> Path(...).joinpath('child').joinpath('grandchild') + >>> Path(...).joinpath('child', 'grandchild') + >>> Path(...) / 'child' / 'grandchild' + + .. versionchanged:: 3.10 + Prior to 3.10, ``joinpath`` was undocumented and accepted + exactly one parameter. + .. _pyzipfile-objects: diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index b3c24213f3474d..7c09e2f51b005a 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -2965,6 +2965,12 @@ def test_joinpath(self, alpharep): e = root.joinpath("b").joinpath("d").joinpath("e.txt") assert e.read_text() == "content of e" + @pass_alpharep + def test_joinpath_multiple(self, alpharep): + root = zipfile.Path(alpharep) + e = root.joinpath("b", "d", "e.txt") + assert e.read_text() == "content of e" + @pass_alpharep def test_traverse_truediv(self, alpharep): root = zipfile.Path(alpharep) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index e1a50a3eb51d95..0eed4ce9a63441 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -2379,8 +2379,8 @@ def __str__(self): def __repr__(self): return self.__repr.format(self=self) - def joinpath(self, add): - next = posixpath.join(self.at, add) + def joinpath(self, *other): + next = posixpath.join(self.at, *other) return self._next(self.root.resolve_dir(next)) __truediv__ = joinpath diff --git a/Misc/NEWS.d/next/Library/2020-10-25-14-48-57.bpo-42090.Ubuc0j.rst b/Misc/NEWS.d/next/Library/2020-10-25-14-48-57.bpo-42090.Ubuc0j.rst new file mode 100644 index 00000000000000..72f6853b505044 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-25-14-48-57.bpo-42090.Ubuc0j.rst @@ -0,0 +1,2 @@ +``zipfile.Path.joinpath`` now accepts arbitrary arguments, same as +``pathlib.Path.joinpath``. From 6af3be6309fe935496eb77ce20940692be47ac74 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 15 Dec 2020 18:36:33 -0800 Subject: [PATCH 0794/1261] Update Stale action message (GH-23791) We don't close PRs after it becomes stale. --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 706d8e11a20735..58c9a4f21c30ff 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/stale@v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity. Remove stale label or comment or this will be closed in 5 days' + stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity.' stale-pr-label: 'stale' days-before-stale: 30 days-before-close: -1 From e498947a75cb2ce0b7c2074048674d7d26642f23 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 15 Dec 2020 18:47:26 -0800 Subject: [PATCH 0795/1261] bpo-42179: Clarify exception chaining (GH-23160) * Update errors.rst Clarify exception chaining behaviour and give a reference to the library documentation. * Update errors.rst Wording * Update errors.rst Spelling * Update errors.rst Remove mentioning of special attributes as folks think it's too much for beginners. --- Doc/tutorial/errors.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst index efe44da3043c5e..4a25861a050e61 100644 --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -281,17 +281,17 @@ chaining exceptions. For example:: This can be useful when you are transforming exceptions. For example:: >>> def func(): - ... raise IOError + ... raise ConnectionError ... >>> try: ... func() - ... except IOError as exc: + ... except ConnectionError as exc: ... raise RuntimeError('Failed to open database') from exc ... Traceback (most recent call last): File "", line 2, in File "", line 2, in func - OSError + ConnectionError The above exception was the direct cause of the following exception: @@ -300,7 +300,7 @@ This can be useful when you are transforming exceptions. For example:: RuntimeError: Failed to open database Exception chaining happens automatically when an exception is raised inside an -:keyword:`except` or :keyword:`finally` section. Exception chaining can be +:keyword:`except` or :keyword:`finally` section. This can be disabled by using ``from None`` idiom: >>> try: From 680ad15f810bca060277b373e2121aab9f475649 Mon Sep 17 00:00:00 2001 From: Matthias Bussonnier Date: Wed, 16 Dec 2020 01:43:39 -0800 Subject: [PATCH 0796/1261] bpo-42644: Validate values in logging.disable() (#23786) * bpo-42644: Validate values in logging.disable() Technically make the value of manager a property that checks and convert values assigned to it properly. This has the side effect of making `logging.disable` also accept strings representing the various level of warnings. We want to validate the type of the disable attribute at assignment time, as it is later compared to other levels when emitting warnings and would generate a `TypeError: '>=' not supported between ....` in a different part of the code base, which can make it difficult to track down. When assigned an incorrect value; it will raise a TypeError when the wrong type, or ValueError if an invalid str. Co-authored-by: Andrew Svetlov --- Lib/logging/__init__.py | 8 ++++++++ Lib/test/test_logging.py | 9 +++++++++ .../Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst | 3 +++ 3 files changed, 20 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index badfd654b16895..50b7378cd6386b 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1289,6 +1289,14 @@ def __init__(self, rootnode): self.loggerClass = None self.logRecordFactory = None + @property + def disable(self): + return self._disable + + @disable.setter + def disable(self, value): + self._disable = _checkLevel(value) + def getLogger(self, name): """ Get a logger with the specified name (channel name), creating it diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index e2196736dcdf4d..859baa4738ba7e 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -4219,6 +4219,15 @@ def test_disable(self): logging.disable(83) self.assertEqual(logging.root.manager.disable, 83) + self.assertRaises(ValueError, logging.disable, "doesnotexists") + + class _NotAnIntOrString: + pass + + self.assertRaises(TypeError, logging.disable, _NotAnIntOrString()) + + logging.disable("WARN") + # test the default value introduced in 3.7 # (Issue #28524) logging.disable() diff --git a/Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst b/Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst new file mode 100644 index 00000000000000..f58b58e4002ada --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst @@ -0,0 +1,3 @@ +`logging.disable` will now validate the types and value of its parameter. It +also now accepts strings representing the levels (as does `loging.setLevel`) +instead of only the numerical values. From cf19c50576b112f2661247d946158339ffcdb4aa Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 16 Dec 2020 11:16:25 +0100 Subject: [PATCH 0797/1261] bpo-41804: Enhance test_epoll.test_control_and_wait() (GH-23795) Use shorter timeout and replace send() with sendall(). --- Lib/test/test_epoll.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py index 10f148fe5cdb41..b623852f9eb4ee 100644 --- a/Lib/test/test_epoll.py +++ b/Lib/test/test_epoll.py @@ -160,44 +160,42 @@ def test_fromfd(self): self.fail("epoll on closed fd didn't raise EBADF") def test_control_and_wait(self): + # create the epoll object client, server = self._connected_pair() - ep = select.epoll(16) ep.register(server.fileno(), select.EPOLLIN | select.EPOLLOUT | select.EPOLLET) ep.register(client.fileno(), select.EPOLLIN | select.EPOLLOUT | select.EPOLLET) + # EPOLLOUT now = time.monotonic() events = ep.poll(1, 4) then = time.monotonic() self.assertFalse(then - now > 0.1, then - now) - events.sort() expected = [(client.fileno(), select.EPOLLOUT), (server.fileno(), select.EPOLLOUT)] - expected.sort() - - self.assertEqual(events, expected) + self.assertEqual(sorted(events), sorted(expected)) - events = ep.poll(timeout=2.1, maxevents=4) + # no event + events = ep.poll(timeout=0.1, maxevents=4) self.assertFalse(events) - client.send(b"Hello!") - server.send(b"world!!!") + # send: EPOLLIN and EPOLLOUT + client.sendall(b"Hello!") + server.sendall(b"world!!!") now = time.monotonic() - events = ep.poll(1, 4) + events = ep.poll(1.0, 4) then = time.monotonic() self.assertFalse(then - now > 0.01) - events.sort() expected = [(client.fileno(), select.EPOLLIN | select.EPOLLOUT), (server.fileno(), select.EPOLLIN | select.EPOLLOUT)] - expected.sort() - - self.assertEqual(events, expected) + self.assertEqual(sorted(events), sorted(expected)) + # unregister, modify ep.unregister(client.fileno()) ep.modify(server.fileno(), select.EPOLLOUT) now = time.monotonic() From 5d4c7a3de0f70c4e2b7cbd4b0aaad8b96590632e Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 16 Dec 2020 12:31:49 +0200 Subject: [PATCH 0798/1261] bpo-19733: Re-enable tests for -image option in Tkinter (GH-23785) --- Lib/tkinter/test/test_tkinter/test_widgets.py | 3 --- Lib/tkinter/test/widget_tests.py | 3 --- 2 files changed, 6 deletions(-) diff --git a/Lib/tkinter/test/test_tkinter/test_widgets.py b/Lib/tkinter/test/test_tkinter/test_widgets.py index b6f792d6c2cf85..4b9b6ebdda04ea 100644 --- a/Lib/tkinter/test/test_tkinter/test_widgets.py +++ b/Lib/tkinter/test/test_tkinter/test_widgets.py @@ -2,7 +2,6 @@ import tkinter from tkinter import TclError import os -import sys from test.support import requires from tkinter.test.support import (tcl_version, requires_tcl, @@ -265,8 +264,6 @@ def test_height(self): test_highlightthickness = StandardOptionsTests.test_highlightthickness - @unittest.skipIf(sys.platform == 'darwin', - 'crashes with Cocoa Tk (issue19733)') def test_image(self): widget = self.create() image = tkinter.PhotoImage(master=self.root, name='image1') diff --git a/Lib/tkinter/test/widget_tests.py b/Lib/tkinter/test/widget_tests.py index b42ff52178f29e..ad4a8bd2bf3252 100644 --- a/Lib/tkinter/test/widget_tests.py +++ b/Lib/tkinter/test/widget_tests.py @@ -1,7 +1,6 @@ # Common tests for test_tkinter/test_widgets.py and test_ttk/test_widgets.py import unittest -import sys import tkinter from tkinter.test.support import (AbstractTkTest, tcl_version, requires_tcl, get_tk_patchlevel, pixels_conv, tcl_obj_eq) @@ -332,8 +331,6 @@ def test_highlightthickness(self): self.checkParam(widget, 'highlightthickness', -2, expected=0, conv=self._conv_pixels) - @unittest.skipIf(sys.platform == 'darwin', - 'crashes with Cocoa Tk (issue19733)') def test_image(self): widget = self.create() self.checkImageParam(widget, 'image') From cd49c79cc94aad6eedc841eb8431bdda55d31478 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 16 Dec 2020 12:11:24 +0100 Subject: [PATCH 0799/1261] bpo-40364: asyncio uses os.waitstatus_to_exitcode() (GH-23798) test_unix_events.py no longer checks if waitstatus_to_exitcode() mock has been called or not to make the test more functional, rather than checking the exact implementation. --- Lib/asyncio/unix_events.py | 34 ++- Lib/test/test_asyncio/test_unix_events.py | 261 ++++++---------------- 2 files changed, 80 insertions(+), 215 deletions(-) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 1b57e34563eea9..33a6732941fc33 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -44,6 +44,16 @@ def _sighandler_noop(signum, frame): pass +def waitstatus_to_exitcode(status): + try: + return os.waitstatus_to_exitcode(status) + except ValueError: + # The child exited, but we don't understand its status. + # This shouldn't happen, but if it does, let's just + # return that status; perhaps that helps debug it. + return status + + class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): """Unix event loop. @@ -941,7 +951,7 @@ def _do_wait(self, pid): " will report returncode 255", pid) else: - returncode = _compute_returncode(status) + returncode = waitstatus_to_exitcode(status) os.close(pidfd) callback(pid, returncode, *args) @@ -956,20 +966,6 @@ def remove_child_handler(self, pid): return True -def _compute_returncode(status): - if os.WIFSIGNALED(status): - # The child process died because of a signal. - return -os.WTERMSIG(status) - elif os.WIFEXITED(status): - # The child process exited (e.g sys.exit()). - return os.WEXITSTATUS(status) - else: - # The child exited, but we don't understand its status. - # This shouldn't happen, but if it does, let's just - # return that status; perhaps that helps debug it. - return status - - class BaseChildWatcher(AbstractChildWatcher): def __init__(self): @@ -1080,7 +1076,7 @@ def _do_waitpid(self, expected_pid): # The child process is still alive. return - returncode = _compute_returncode(status) + returncode = waitstatus_to_exitcode(status) if self._loop.get_debug(): logger.debug('process %s exited with returncode %s', expected_pid, returncode) @@ -1173,7 +1169,7 @@ def _do_waitpid_all(self): # A child process is still alive. return - returncode = _compute_returncode(status) + returncode = waitstatus_to_exitcode(status) with self._lock: try: @@ -1296,7 +1292,7 @@ def _do_waitpid(self, expected_pid): # The child process is still alive. return - returncode = _compute_returncode(status) + returncode = waitstatus_to_exitcode(status) debug_log = True try: loop, callback, args = self._callbacks.pop(pid) @@ -1399,7 +1395,7 @@ def _do_waitpid(self, loop, expected_pid, callback, args): "Unknown child process pid %d, will report returncode 255", pid) else: - returncode = _compute_returncode(status) + returncode = waitstatus_to_exitcode(status) if loop.get_debug(): logger.debug('process %s exited with returncode %s', expected_pid, returncode) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index 2c7d52a15bb72a..643638564e342b 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -1,6 +1,5 @@ """Tests for unix_events.py.""" -import collections import contextlib import errno import io @@ -30,6 +29,15 @@ MOCK_ANY = mock.ANY +def EXITCODE(exitcode): + return 32768 + exitcode + + +def SIGNAL(signum): + assert 1 <= signum <= 68 + return 32768 - signum + + def tearDownModule(): asyncio.set_event_loop_policy(None) @@ -1125,15 +1133,6 @@ def test_not_implemented(self): NotImplementedError, watcher._do_waitpid, f) -WaitPidMocks = collections.namedtuple("WaitPidMocks", - ("waitpid", - "WIFEXITED", - "WIFSIGNALED", - "WEXITSTATUS", - "WTERMSIG", - )) - - class ChildWatcherTestsMixin: ignore_warnings = mock.patch.object(log.logger, "warning") @@ -1164,22 +1163,16 @@ def waitpid(self, pid, flags): else: raise ChildProcessError() - def add_zombie(self, pid, returncode): - self.zombies[pid] = returncode + 32768 - - def WIFEXITED(self, status): - return status >= 32768 + def add_zombie(self, pid, status): + self.zombies[pid] = status - def WIFSIGNALED(self, status): - return 32700 < status < 32768 - - def WEXITSTATUS(self, status): - self.assertTrue(self.WIFEXITED(status)) - return status - 32768 - - def WTERMSIG(self, status): - self.assertTrue(self.WIFSIGNALED(status)) - return 32768 - status + def waitstatus_to_exitcode(self, status): + if status > 32768: + return status - 32768 + elif 32700 < status < 32768: + return status - 32768 + else: + return status def test_create_watcher(self): self.m_add_signal_handler.assert_called_once_with( @@ -1191,19 +1184,13 @@ def patch(target, wrapper): return mock.patch(target, wraps=wrapper, new_callable=mock.Mock) - with patch('os.WTERMSIG', self.WTERMSIG) as m_WTERMSIG, \ - patch('os.WEXITSTATUS', self.WEXITSTATUS) as m_WEXITSTATUS, \ - patch('os.WIFSIGNALED', self.WIFSIGNALED) as m_WIFSIGNALED, \ - patch('os.WIFEXITED', self.WIFEXITED) as m_WIFEXITED, \ + with patch('asyncio.unix_events.waitstatus_to_exitcode', self.waitstatus_to_exitcode), \ patch('os.waitpid', self.waitpid) as m_waitpid: - func(self, WaitPidMocks(m_waitpid, - m_WIFEXITED, m_WIFSIGNALED, - m_WEXITSTATUS, m_WTERMSIG, - )) + func(self, m_waitpid) return wrapped_func @waitpid_mocks - def test_sigchld(self, m): + def test_sigchld(self, m_waitpid): # register a child callback = mock.Mock() @@ -1212,59 +1199,36 @@ def test_sigchld(self, m): self.watcher.add_child_handler(42, callback, 9, 10, 14) self.assertFalse(callback.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # child is running self.watcher._sig_chld() self.assertFalse(callback.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # child terminates (returncode 12) self.running = False - self.add_zombie(42, 12) + self.add_zombie(42, EXITCODE(12)) self.watcher._sig_chld() - self.assertTrue(m.WIFEXITED.called) - self.assertTrue(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) callback.assert_called_once_with(42, 12, 9, 10, 14) - m.WIFSIGNALED.reset_mock() - m.WIFEXITED.reset_mock() - m.WEXITSTATUS.reset_mock() callback.reset_mock() # ensure that the child is effectively reaped - self.add_zombie(42, 13) + self.add_zombie(42, EXITCODE(13)) with self.ignore_warnings: self.watcher._sig_chld() self.assertFalse(callback.called) - self.assertFalse(m.WTERMSIG.called) - - m.WIFSIGNALED.reset_mock() - m.WIFEXITED.reset_mock() - m.WEXITSTATUS.reset_mock() # sigchld called again self.zombies.clear() self.watcher._sig_chld() self.assertFalse(callback.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) @waitpid_mocks - def test_sigchld_two_children(self, m): + def test_sigchld_two_children(self, m_waitpid): callback1 = mock.Mock() callback2 = mock.Mock() @@ -1275,10 +1239,6 @@ def test_sigchld_two_children(self, m): self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # register child 2 with self.watcher: @@ -1286,34 +1246,20 @@ def test_sigchld_two_children(self, m): self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # children are running self.watcher._sig_chld() self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # child 1 terminates (signal 3) - self.add_zombie(43, -3) + self.add_zombie(43, SIGNAL(3)) self.watcher._sig_chld() callback1.assert_called_once_with(43, -3, 7, 8) self.assertFalse(callback2.called) - self.assertTrue(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertTrue(m.WTERMSIG.called) - m.WIFSIGNALED.reset_mock() - m.WIFEXITED.reset_mock() - m.WTERMSIG.reset_mock() callback1.reset_mock() # child 2 still running @@ -1321,40 +1267,25 @@ def test_sigchld_two_children(self, m): self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # child 2 terminates (code 108) - self.add_zombie(44, 108) + self.add_zombie(44, EXITCODE(108)) self.running = False self.watcher._sig_chld() callback2.assert_called_once_with(44, 108, 147, 18) self.assertFalse(callback1.called) - self.assertTrue(m.WIFEXITED.called) - self.assertTrue(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) - m.WIFSIGNALED.reset_mock() - m.WIFEXITED.reset_mock() - m.WEXITSTATUS.reset_mock() callback2.reset_mock() # ensure that the children are effectively reaped - self.add_zombie(43, 14) - self.add_zombie(44, 15) + self.add_zombie(43, EXITCODE(14)) + self.add_zombie(44, EXITCODE(15)) with self.ignore_warnings: self.watcher._sig_chld() self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WTERMSIG.called) - - m.WIFSIGNALED.reset_mock() - m.WIFEXITED.reset_mock() - m.WEXITSTATUS.reset_mock() # sigchld called again self.zombies.clear() @@ -1362,13 +1293,9 @@ def test_sigchld_two_children(self, m): self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) @waitpid_mocks - def test_sigchld_two_children_terminating_together(self, m): + def test_sigchld_two_children_terminating_together(self, m_waitpid): callback1 = mock.Mock() callback2 = mock.Mock() @@ -1379,10 +1306,6 @@ def test_sigchld_two_children_terminating_together(self, m): self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # register child 2 with self.watcher: @@ -1390,60 +1313,43 @@ def test_sigchld_two_children_terminating_together(self, m): self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # children are running self.watcher._sig_chld() self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # child 1 terminates (code 78) # child 2 terminates (signal 5) - self.add_zombie(45, 78) - self.add_zombie(46, -5) + self.add_zombie(45, EXITCODE(78)) + self.add_zombie(46, SIGNAL(5)) self.running = False self.watcher._sig_chld() callback1.assert_called_once_with(45, 78, 17, 8) callback2.assert_called_once_with(46, -5, 1147, 18) - self.assertTrue(m.WIFSIGNALED.called) - self.assertTrue(m.WIFEXITED.called) - self.assertTrue(m.WEXITSTATUS.called) - self.assertTrue(m.WTERMSIG.called) - - m.WIFSIGNALED.reset_mock() - m.WIFEXITED.reset_mock() - m.WTERMSIG.reset_mock() - m.WEXITSTATUS.reset_mock() + callback1.reset_mock() callback2.reset_mock() # ensure that the children are effectively reaped - self.add_zombie(45, 14) - self.add_zombie(46, 15) + self.add_zombie(45, EXITCODE(14)) + self.add_zombie(46, EXITCODE(15)) with self.ignore_warnings: self.watcher._sig_chld() self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WTERMSIG.called) @waitpid_mocks - def test_sigchld_race_condition(self, m): + def test_sigchld_race_condition(self, m_waitpid): # register a child callback = mock.Mock() with self.watcher: # child terminates before being registered - self.add_zombie(50, 4) + self.add_zombie(50, EXITCODE(4)) self.watcher._sig_chld() self.watcher.add_child_handler(50, callback, 1, 12) @@ -1452,14 +1358,14 @@ def test_sigchld_race_condition(self, m): callback.reset_mock() # ensure that the child is effectively reaped - self.add_zombie(50, -1) + self.add_zombie(50, SIGNAL(1)) with self.ignore_warnings: self.watcher._sig_chld() self.assertFalse(callback.called) @waitpid_mocks - def test_sigchld_replace_handler(self, m): + def test_sigchld_replace_handler(self, m_waitpid): callback1 = mock.Mock() callback2 = mock.Mock() @@ -1470,10 +1376,6 @@ def test_sigchld_replace_handler(self, m): self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # register the same child again with self.watcher: @@ -1481,38 +1383,27 @@ def test_sigchld_replace_handler(self, m): self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # child terminates (signal 8) self.running = False - self.add_zombie(51, -8) + self.add_zombie(51, SIGNAL(8)) self.watcher._sig_chld() callback2.assert_called_once_with(51, -8, 21) self.assertFalse(callback1.called) - self.assertTrue(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertTrue(m.WTERMSIG.called) - m.WIFSIGNALED.reset_mock() - m.WIFEXITED.reset_mock() - m.WTERMSIG.reset_mock() callback2.reset_mock() # ensure that the child is effectively reaped - self.add_zombie(51, 13) + self.add_zombie(51, EXITCODE(13)) with self.ignore_warnings: self.watcher._sig_chld() self.assertFalse(callback1.called) self.assertFalse(callback2.called) - self.assertFalse(m.WTERMSIG.called) @waitpid_mocks - def test_sigchld_remove_handler(self, m): + def test_sigchld_remove_handler(self, m_waitpid): callback = mock.Mock() # register a child @@ -1521,30 +1412,22 @@ def test_sigchld_remove_handler(self, m): self.watcher.add_child_handler(52, callback, 1984) self.assertFalse(callback.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # unregister the child self.watcher.remove_child_handler(52) self.assertFalse(callback.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # child terminates (code 99) self.running = False - self.add_zombie(52, 99) + self.add_zombie(52, EXITCODE(99)) with self.ignore_warnings: self.watcher._sig_chld() self.assertFalse(callback.called) @waitpid_mocks - def test_sigchld_unknown_status(self, m): + def test_sigchld_unknown_status(self, m_waitpid): callback = mock.Mock() # register a child @@ -1553,10 +1436,6 @@ def test_sigchld_unknown_status(self, m): self.watcher.add_child_handler(53, callback, -19) self.assertFalse(callback.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # terminate with unknown status self.zombies[53] = 1178 @@ -1564,24 +1443,18 @@ def test_sigchld_unknown_status(self, m): self.watcher._sig_chld() callback.assert_called_once_with(53, 1178, -19) - self.assertTrue(m.WIFEXITED.called) - self.assertTrue(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) callback.reset_mock() - m.WIFEXITED.reset_mock() - m.WIFSIGNALED.reset_mock() # ensure that the child is effectively reaped - self.add_zombie(53, 101) + self.add_zombie(53, EXITCODE(101)) with self.ignore_warnings: self.watcher._sig_chld() self.assertFalse(callback.called) @waitpid_mocks - def test_remove_child_handler(self, m): + def test_remove_child_handler(self, m_waitpid): callback1 = mock.Mock() callback2 = mock.Mock() callback3 = mock.Mock() @@ -1602,9 +1475,9 @@ def test_remove_child_handler(self, m): self.assertFalse(self.watcher.remove_child_handler(55)) # all children terminate - self.add_zombie(54, 0) - self.add_zombie(55, 1) - self.add_zombie(56, 2) + self.add_zombie(54, EXITCODE(0)) + self.add_zombie(55, EXITCODE(1)) + self.add_zombie(56, EXITCODE(2)) self.running = False with self.ignore_warnings: self.watcher._sig_chld() @@ -1614,7 +1487,7 @@ def test_remove_child_handler(self, m): callback3.assert_called_once_with(56, 2, 3) @waitpid_mocks - def test_sigchld_unhandled_exception(self, m): + def test_sigchld_unhandled_exception(self, m_waitpid): callback = mock.Mock() # register a child @@ -1623,7 +1496,7 @@ def test_sigchld_unhandled_exception(self, m): self.watcher.add_child_handler(57, callback) # raise an exception - m.waitpid.side_effect = ValueError + m_waitpid.side_effect = ValueError with mock.patch.object(log.logger, 'error') as m_error: @@ -1632,7 +1505,7 @@ def test_sigchld_unhandled_exception(self, m): self.assertTrue(m_error.called) @waitpid_mocks - def test_sigchld_child_reaped_elsewhere(self, m): + def test_sigchld_child_reaped_elsewhere(self, m_waitpid): # register a child callback = mock.Mock() @@ -1641,19 +1514,15 @@ def test_sigchld_child_reaped_elsewhere(self, m): self.watcher.add_child_handler(58, callback) self.assertFalse(callback.called) - self.assertFalse(m.WIFEXITED.called) - self.assertFalse(m.WIFSIGNALED.called) - self.assertFalse(m.WEXITSTATUS.called) - self.assertFalse(m.WTERMSIG.called) # child terminates self.running = False - self.add_zombie(58, 4) + self.add_zombie(58, EXITCODE(4)) # waitpid is called elsewhere os.waitpid(58, os.WNOHANG) - m.waitpid.reset_mock() + m_waitpid.reset_mock() # sigchld with self.ignore_warnings: @@ -1667,7 +1536,7 @@ def test_sigchld_child_reaped_elsewhere(self, m): callback.assert_called_once_with(58, 255) @waitpid_mocks - def test_sigchld_unknown_pid_during_registration(self, m): + def test_sigchld_unknown_pid_during_registration(self, m_waitpid): # register two children callback1 = mock.Mock() callback2 = mock.Mock() @@ -1675,9 +1544,9 @@ def test_sigchld_unknown_pid_during_registration(self, m): with self.ignore_warnings, self.watcher: self.running = True # child 1 terminates - self.add_zombie(591, 7) + self.add_zombie(591, EXITCODE(7)) # an unknown child terminates - self.add_zombie(593, 17) + self.add_zombie(593, EXITCODE(17)) self.watcher._sig_chld() @@ -1688,7 +1557,7 @@ def test_sigchld_unknown_pid_during_registration(self, m): self.assertFalse(callback2.called) @waitpid_mocks - def test_set_loop(self, m): + def test_set_loop(self, m_waitpid): # register a child callback = mock.Mock() @@ -1713,13 +1582,13 @@ def test_set_loop(self, m): # child terminates self.running = False - self.add_zombie(60, 9) + self.add_zombie(60, EXITCODE(9)) self.watcher._sig_chld() callback.assert_called_once_with(60, 9) @waitpid_mocks - def test_set_loop_race_condition(self, m): + def test_set_loop_race_condition(self, m_waitpid): # register 3 children callback1 = mock.Mock() callback2 = mock.Mock() @@ -1746,8 +1615,8 @@ def test_set_loop_race_condition(self, m): signal.SIGCHLD) # child 1 & 2 terminate - self.add_zombie(61, 11) - self.add_zombie(62, -5) + self.add_zombie(61, EXITCODE(11)) + self.add_zombie(62, SIGNAL(5)) # SIGCHLD was not caught self.assertFalse(callback1.called) @@ -1773,7 +1642,7 @@ def test_set_loop_race_condition(self, m): # child 3 terminates self.running = False - self.add_zombie(622, 19) + self.add_zombie(622, EXITCODE(19)) self.watcher._sig_chld() self.assertFalse(callback1.called) @@ -1781,16 +1650,16 @@ def test_set_loop_race_condition(self, m): callback3.assert_called_once_with(622, 19) @waitpid_mocks - def test_close(self, m): + def test_close(self, m_waitpid): # register two children callback1 = mock.Mock() with self.watcher: self.running = True # child 1 terminates - self.add_zombie(63, 9) + self.add_zombie(63, EXITCODE(9)) # other child terminates - self.add_zombie(65, 18) + self.add_zombie(65, EXITCODE(18)) self.watcher._sig_chld() self.watcher.add_child_handler(63, callback1) From 7c9b58b46bc1e6f90ad89be3c1d028c5247f3fe7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 16 Dec 2020 12:12:36 +0100 Subject: [PATCH 0800/1261] bpo-42613: Fix freeze.py config directory (GH-23792) Fix freeze.py tool to use the prope config and library directories. --- .../2020-12-16-09-10-32.bpo-42613.J-jnm5.rst | 2 ++ Tools/freeze/freeze.py | 20 +++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2020-12-16-09-10-32.bpo-42613.J-jnm5.rst diff --git a/Misc/NEWS.d/next/Tools-Demos/2020-12-16-09-10-32.bpo-42613.J-jnm5.rst b/Misc/NEWS.d/next/Tools-Demos/2020-12-16-09-10-32.bpo-42613.J-jnm5.rst new file mode 100644 index 00000000000000..140ff8255b96b1 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2020-12-16-09-10-32.bpo-42613.J-jnm5.rst @@ -0,0 +1,2 @@ +Fix ``freeze.py`` tool to use the prope config and library directories. +Patch by Victor Stinner. diff --git a/Tools/freeze/freeze.py b/Tools/freeze/freeze.py index 83aa508a46a93e..d66e1e2708e758 100755 --- a/Tools/freeze/freeze.py +++ b/Tools/freeze/freeze.py @@ -93,6 +93,7 @@ import getopt import os import sys +import sysconfig # Import the freeze-private modules @@ -226,7 +227,7 @@ def main(): extensions_c = 'frozen_extensions.c' if ishome: print("(Using Python source directory)") - binlib = exec_prefix + configdir = exec_prefix incldir = os.path.join(prefix, 'Include') config_h_dir = exec_prefix config_c_in = os.path.join(prefix, 'Modules', 'config.c.in') @@ -235,22 +236,21 @@ def main(): if win: frozendllmain_c = os.path.join(exec_prefix, 'Pc\\frozen_dllmain.c') else: - binlib = os.path.join(exec_prefix, - 'lib', 'python%s' % version, - 'config-%s' % flagged_version) + configdir = sysconfig.get_config_var('LIBPL') incldir = os.path.join(prefix, 'include', 'python%s' % flagged_version) config_h_dir = os.path.join(exec_prefix, 'include', 'python%s' % flagged_version) - config_c_in = os.path.join(binlib, 'config.c.in') - frozenmain_c = os.path.join(binlib, 'frozenmain.c') - makefile_in = os.path.join(binlib, 'Makefile') - frozendllmain_c = os.path.join(binlib, 'frozen_dllmain.c') + config_c_in = os.path.join(configdir, 'config.c.in') + frozenmain_c = os.path.join(configdir, 'frozenmain.c') + makefile_in = os.path.join(configdir, 'Makefile') + frozendllmain_c = os.path.join(configdir, 'frozen_dllmain.c') + libdir = sysconfig.get_config_var('LIBDIR') supp_sources = [] defines = [] includes = ['-I' + incldir, '-I' + config_h_dir] # sanity check of directories and files - check_dirs = [prefix, exec_prefix, binlib, incldir] + check_dirs = [prefix, exec_prefix, configdir, incldir] if not win: # These are not directories on Windows. check_dirs = check_dirs + extensions @@ -457,7 +457,7 @@ def main(): cflags = ['$(OPT)'] cppflags = defines + includes - libs = [os.path.join(binlib, '$(LDLIBRARY)')] + libs = [os.path.join(libdir, '$(LDLIBRARY)')] somevars = {} if os.path.exists(makefile_in): From bc6346fcd8b5b5130fa7698c1fe8d43ef26b7e34 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 16 Dec 2020 12:20:33 +0100 Subject: [PATCH 0801/1261] bpo-1635741: Refactor _threadmodule.c (GH-23793) * Fix ExceptHookArgsType name: "_thread.ExceptHookArgs", instead of "_thread._ExceptHookArgs". * PyInit__thread() no longer intializes interp->num_threads to 0: it is already done in PyInterpreterState_New(). * Use PyModule_AddType(), Py_NewRef() and Py_XNewRef(). * Replace str_dict variable with _Py_IDENTIFIER(__dict__). * Remove assert(Py_IS_TYPE(obj, &Locktype)) from release_sentinel() to avoid having to retrive the type from this callback. * Add thread_bootstate_free() * Rename t_bootstrap() to thread_run() * bootstate structure: rename keyw member to kwargs --- Modules/_threadmodule.c | 537 +++++++++++++++++----------------------- 1 file changed, 226 insertions(+), 311 deletions(-) diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 86d5f544fcf0fa..bd4331c6108bd8 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -8,12 +8,15 @@ #include "pycore_pystate.h" // _PyThreadState_Init() #include // offsetof() -static PyObject *ThreadError; -static PyObject *str_dict; +// ThreadError is just an alias to PyExc_RuntimeError +#define ThreadError PyExc_RuntimeError + +_Py_IDENTIFIER(__dict__); _Py_IDENTIFIER(stderr); _Py_IDENTIFIER(flush); + /* Lock objects */ typedef struct { @@ -26,8 +29,9 @@ typedef struct { static void lock_dealloc(lockobject *self) { - if (self->in_weakreflist != NULL) + if (self->in_weakreflist != NULL) { PyObject_ClearWeakRefs((PyObject *) self); + } if (self->lock_lock != NULL) { /* Unlock the lock so it's safe to free it */ if (self->locked) @@ -48,12 +52,13 @@ acquire_timed(PyThread_type_lock lock, _PyTime_t timeout) { PyLockStatus r; _PyTime_t endtime = 0; - _PyTime_t microseconds; - if (timeout > 0) + if (timeout > 0) { endtime = _PyTime_GetMonotonicClock() + timeout; + } do { + _PyTime_t microseconds; microseconds = _PyTime_AsMicroseconds(timeout, _PyTime_ROUND_CEILING); /* first a simple non-blocking try without releasing the GIL */ @@ -138,12 +143,10 @@ static PyObject * lock_PyThread_acquire_lock(lockobject *self, PyObject *args, PyObject *kwds) { _PyTime_t timeout; - PyLockStatus r; - if (lock_acquire_parse_args(args, kwds, &timeout) < 0) return NULL; - r = acquire_timed(self->lock_lock, timeout); + PyLockStatus r = acquire_timed(self->lock_lock, timeout); if (r == PY_LOCK_INTR) { return NULL; } @@ -245,36 +248,28 @@ static PyMethodDef lock_methods[] = { {NULL, NULL} /* sentinel */ }; +PyDoc_STRVAR(lock_doc, +"A lock object is a synchronization primitive. To create a lock,\n\ +call threading.Lock(). Methods are:\n\ +\n\ +acquire() -- lock the lock, possibly blocking until it can be obtained\n\ +release() -- unlock of the lock\n\ +locked() -- test whether the lock is currently locked\n\ +\n\ +A lock is not owned by the thread that locked it; another thread may\n\ +unlock it. A thread attempting to lock a lock that it has already locked\n\ +will block until another thread unlocks it. Deadlocks may ensue."); + static PyTypeObject Locktype = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "_thread.lock", /*tp_name*/ - sizeof(lockobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)lock_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - (reprfunc)lock_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - offsetof(lockobject, in_weakreflist), /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - lock_methods, /*tp_methods*/ + .tp_name = "_thread.lock", + .tp_basicsize = sizeof(lockobject), + .tp_dealloc = (destructor)lock_dealloc, + .tp_repr = (reprfunc)lock_repr, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_doc = lock_doc, + .tp_weaklistoffset = offsetof(lockobject, in_weakreflist), + .tp_methods = lock_methods, }; /* Recursive lock objects */ @@ -527,56 +522,29 @@ static PyMethodDef rlock_methods[] = { static PyTypeObject RLocktype = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "_thread.RLock", /*tp_name*/ - sizeof(rlockobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)rlock_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - (reprfunc)rlock_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - offsetof(rlockobject, in_weakreflist), /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - rlock_methods, /*tp_methods*/ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - rlock_new /* tp_new */ + .tp_name = "_thread.RLock", + .tp_basicsize = sizeof(rlockobject), + .tp_dealloc = (destructor)rlock_dealloc, + .tp_repr = (reprfunc)rlock_repr, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .tp_weaklistoffset = offsetof(rlockobject, in_weakreflist), + .tp_methods = rlock_methods, + .tp_alloc = PyType_GenericAlloc, + .tp_new = rlock_new, }; static lockobject * newlockobject(void) { - lockobject *self; - self = PyObject_New(lockobject, &Locktype); - if (self == NULL) + lockobject *self = PyObject_New(lockobject, &Locktype); + if (self == NULL) { return NULL; + } + self->lock_lock = PyThread_allocate_lock(); self->locked = 0; self->in_weakreflist = NULL; + if (self->lock_lock == NULL) { Py_DECREF(self); PyErr_SetString(ThreadError, "can't allocate lock"); @@ -642,30 +610,12 @@ localdummy_dealloc(localdummyobject *self) static PyTypeObject localdummytype = { PyVarObject_HEAD_INIT(NULL, 0) - /* tp_name */ "_thread._localdummy", - /* tp_basicsize */ sizeof(localdummyobject), - /* tp_itemsize */ 0, - /* tp_dealloc */ (destructor)localdummy_dealloc, - /* tp_vectorcall_offset */ 0, - /* tp_getattr */ 0, - /* tp_setattr */ 0, - /* tp_as_async */ 0, - /* tp_repr */ 0, - /* tp_as_number */ 0, - /* tp_as_sequence */ 0, - /* tp_as_mapping */ 0, - /* tp_hash */ 0, - /* tp_call */ 0, - /* tp_str */ 0, - /* tp_getattro */ 0, - /* tp_setattro */ 0, - /* tp_as_buffer */ 0, - /* tp_flags */ Py_TPFLAGS_DEFAULT, - /* tp_doc */ "Thread-local dummy", - /* tp_traverse */ 0, - /* tp_clear */ 0, - /* tp_richcompare */ 0, - /* tp_weaklistoffset */ offsetof(localdummyobject, weakreflist) + .tp_name = "_thread._localdummy", + .tp_basicsize = sizeof(localdummyobject), + .tp_dealloc = (destructor)localdummy_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_doc = "Thread-local dummy", + .tp_weaklistoffset = offsetof(localdummyobject, weakreflist), }; @@ -690,11 +640,10 @@ static PyObject *_localdummy_destroyed(PyObject *meth_self, PyObject *dummyweakr static PyObject * _local_create_dummy(localobject *self) { - PyObject *tdict, *ldict = NULL, *wr = NULL; + PyObject *ldict = NULL, *wr = NULL; localdummyobject *dummy = NULL; - int r; - tdict = PyThreadState_GetDict(); + PyObject *tdict = PyThreadState_GetDict(); if (tdict == NULL) { PyErr_SetString(PyExc_SystemError, "Couldn't get thread-state dictionary"); @@ -702,25 +651,30 @@ _local_create_dummy(localobject *self) } ldict = PyDict_New(); - if (ldict == NULL) + if (ldict == NULL) { goto err; + } dummy = (localdummyobject *) localdummytype.tp_alloc(&localdummytype, 0); - if (dummy == NULL) + if (dummy == NULL) { goto err; + } dummy->localdict = ldict; wr = PyWeakref_NewRef((PyObject *) dummy, self->wr_callback); - if (wr == NULL) + if (wr == NULL) { goto err; + } /* As a side-effect, this will cache the weakref's hash before the dummy gets deleted */ - r = PyDict_SetItem(self->dummies, wr, ldict); - if (r < 0) + int r = PyDict_SetItem(self->dummies, wr, ldict); + if (r < 0) { goto err; + } Py_CLEAR(wr); r = PyDict_SetItem(tdict, self->key, (PyObject *) dummy); - if (r < 0) + if (r < 0) { goto err; + } Py_CLEAR(dummy); Py_DECREF(ldict); @@ -737,7 +691,6 @@ static PyObject * local_new(PyTypeObject *type, PyObject *args, PyObject *kw) { localobject *self; - PyObject *wr; static PyMethodDef wr_callback_def = { "_localdummy_destroyed", (PyCFunction) _localdummy_destroyed, METH_O }; @@ -749,42 +702,45 @@ local_new(PyTypeObject *type, PyObject *args, PyObject *kw) if (rc == 0 && kw != NULL) rc = PyObject_IsTrue(kw); if (rc != 0) { - if (rc > 0) + if (rc > 0) { PyErr_SetString(PyExc_TypeError, "Initialization arguments are not supported"); + } return NULL; } } self = (localobject *)type->tp_alloc(type, 0); - if (self == NULL) + if (self == NULL) { return NULL; + } - Py_XINCREF(args); - self->args = args; - Py_XINCREF(kw); - self->kw = kw; + self->args = Py_XNewRef(args); + self->kw = Py_XNewRef(kw); self->key = PyUnicode_FromFormat("thread.local.%p", self); - if (self->key == NULL) + if (self->key == NULL) { goto err; + } self->dummies = PyDict_New(); - if (self->dummies == NULL) + if (self->dummies == NULL) { goto err; + } /* We use a weak reference to self in the callback closure in order to avoid spurious reference cycles */ - wr = PyWeakref_NewRef((PyObject *) self, NULL); - if (wr == NULL) + PyObject *wr = PyWeakref_NewRef((PyObject *) self, NULL); + if (wr == NULL) { goto err; + } self->wr_callback = PyCFunction_NewEx(&wr_callback_def, wr, NULL); Py_DECREF(wr); - if (self->wr_callback == NULL) + if (self->wr_callback == NULL) { goto err; - - if (_local_create_dummy(self) == NULL) + } + if (_local_create_dummy(self) == NULL) { goto err; - + } return (PyObject *)self; err: @@ -834,8 +790,9 @@ local_dealloc(localobject *self) { /* Weakrefs must be invalidated right now, otherwise they can be used from code called below, which is very dangerous since Py_REFCNT(self) == 0 */ - if (self->weakreflist != NULL) + if (self->weakreflist != NULL) { PyObject_ClearWeakRefs((PyObject *) self); + } PyObject_GC_UnTrack(self); @@ -848,16 +805,15 @@ local_dealloc(localobject *self) static PyObject * _ldict(localobject *self) { - PyObject *tdict, *ldict, *dummy; - - tdict = PyThreadState_GetDict(); + PyObject *tdict = PyThreadState_GetDict(); if (tdict == NULL) { PyErr_SetString(PyExc_SystemError, "Couldn't get thread-state dictionary"); return NULL; } - dummy = PyDict_GetItemWithError(tdict, self->key); + PyObject *ldict; + PyObject *dummy = PyDict_GetItemWithError(tdict, self->key); if (dummy == NULL) { if (PyErr_Occurred()) { return NULL; @@ -887,22 +843,26 @@ _ldict(localobject *self) static int local_setattro(localobject *self, PyObject *name, PyObject *v) { - PyObject *ldict; - int r; + PyObject *ldict = _ldict(self); + if (ldict == NULL) { + return -1; + } - ldict = _ldict(self); - if (ldict == NULL) + PyObject *str_dict = _PyUnicode_FromId(&PyId___dict__); // borrowed ref + if (str_dict == NULL) { return -1; + } - r = PyObject_RichCompareBool(name, str_dict, Py_EQ); + int r = PyObject_RichCompareBool(name, str_dict, Py_EQ); + if (r == -1) { + return -1; + } if (r == 1) { PyErr_Format(PyExc_AttributeError, "'%.50s' object attribute '%U' is read-only", Py_TYPE(self)->tp_name, name); return -1; } - if (r == -1) - return -1; return _PyObject_GenericSetAttrWithDict((PyObject *)self, name, v, ldict); } @@ -911,80 +871,54 @@ static PyObject *local_getattro(localobject *, PyObject *); static PyTypeObject localtype = { PyVarObject_HEAD_INIT(NULL, 0) - /* tp_name */ "_thread._local", - /* tp_basicsize */ sizeof(localobject), - /* tp_itemsize */ 0, - /* tp_dealloc */ (destructor)local_dealloc, - /* tp_vectorcall_offset */ 0, - /* tp_getattr */ 0, - /* tp_setattr */ 0, - /* tp_as_async */ 0, - /* tp_repr */ 0, - /* tp_as_number */ 0, - /* tp_as_sequence */ 0, - /* tp_as_mapping */ 0, - /* tp_hash */ 0, - /* tp_call */ 0, - /* tp_str */ 0, - /* tp_getattro */ (getattrofunc)local_getattro, - /* tp_setattro */ (setattrofunc)local_setattro, - /* tp_as_buffer */ 0, - /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC, - /* tp_doc */ "Thread-local data", - /* tp_traverse */ (traverseproc)local_traverse, - /* tp_clear */ (inquiry)local_clear, - /* tp_richcompare */ 0, - /* tp_weaklistoffset */ offsetof(localobject, weakreflist), - /* tp_iter */ 0, - /* tp_iternext */ 0, - /* tp_methods */ 0, - /* tp_members */ 0, - /* tp_getset */ 0, - /* tp_base */ 0, - /* tp_dict */ 0, /* internal use */ - /* tp_descr_get */ 0, - /* tp_descr_set */ 0, - /* tp_dictoffset */ 0, - /* tp_init */ 0, - /* tp_alloc */ 0, - /* tp_new */ local_new, - /* tp_free */ 0, /* Low-level free-mem routine */ - /* tp_is_gc */ 0, /* For PyObject_IS_GC */ + .tp_name = "_thread._local", + .tp_basicsize = sizeof(localobject), + .tp_dealloc = (destructor)local_dealloc, + .tp_getattro = (getattrofunc)local_getattro, + .tp_setattro = (setattrofunc)local_setattro, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + .tp_doc = "Thread-local data", + .tp_traverse = (traverseproc)local_traverse, + .tp_clear = (inquiry)local_clear, + .tp_weaklistoffset = offsetof(localobject, weakreflist), + .tp_new = local_new, }; static PyObject * local_getattro(localobject *self, PyObject *name) { - PyObject *ldict, *value; - int r; - - ldict = _ldict(self); + PyObject *ldict = _ldict(self); if (ldict == NULL) return NULL; - r = PyObject_RichCompareBool(name, str_dict, Py_EQ); + PyObject *str_dict = _PyUnicode_FromId(&PyId___dict__); // borrowed ref + if (str_dict == NULL) { + return NULL; + } + + int r = PyObject_RichCompareBool(name, str_dict, Py_EQ); if (r == 1) { - Py_INCREF(ldict); - return ldict; + return Py_NewRef(ldict); } - if (r == -1) + if (r == -1) { return NULL; + } - if (!Py_IS_TYPE(self, &localtype)) + if (!Py_IS_TYPE(self, &localtype)) { /* use generic lookup for subtypes */ - return _PyObject_GenericGetAttrWithDict( - (PyObject *)self, name, ldict, 0); + return _PyObject_GenericGetAttrWithDict((PyObject *)self, name, + ldict, 0); + } /* Optimization: just look in dict ourselves */ - value = PyDict_GetItemWithError(ldict, name); + PyObject *value = PyDict_GetItemWithError(ldict, name); if (value != NULL) { - Py_INCREF(value); - return value; + return Py_NewRef(value); } - else if (PyErr_Occurred()) { + if (PyErr_Occurred()) { return NULL; } + /* Fall back on generic to get __class__ and __dict__ */ return _PyObject_GenericGetAttrWithDict( (PyObject *)self, name, ldict, 0); @@ -994,17 +928,15 @@ local_getattro(localobject *self, PyObject *name) static PyObject * _localdummy_destroyed(PyObject *localweakref, PyObject *dummyweakref) { - PyObject *obj; - localobject *self; assert(PyWeakref_CheckRef(localweakref)); - obj = PyWeakref_GET_OBJECT(localweakref); - if (obj == Py_None) + PyObject *obj = PyWeakref_GET_OBJECT(localweakref); + if (obj == Py_None) { Py_RETURN_NONE; - Py_INCREF(obj); - assert(PyObject_TypeCheck(obj, &localtype)); + } + /* If the thread-local object is still alive and not being cleared, remove the corresponding local dict */ - self = (localobject *) obj; + localobject *self = (localobject *)Py_NewRef(obj); if (self->dummies != NULL) { PyObject *ldict; ldict = PyDict_GetItemWithError(self->dummies, dummyweakref); @@ -1024,24 +956,35 @@ struct bootstate { PyInterpreterState *interp; PyObject *func; PyObject *args; - PyObject *keyw; + PyObject *kwargs; PyThreadState *tstate; _PyRuntimeState *runtime; }; + static void -t_bootstrap(void *boot_raw) +thread_bootstate_free(struct bootstate *boot) +{ + Py_DECREF(boot->func); + Py_DECREF(boot->args); + Py_XDECREF(boot->kwargs); + PyMem_Free(boot); +} + + +static void +thread_run(void *boot_raw) { struct bootstate *boot = (struct bootstate *) boot_raw; PyThreadState *tstate; - PyObject *res; tstate = boot->tstate; tstate->thread_id = PyThread_get_thread_ident(); _PyThreadState_Init(tstate); PyEval_AcquireThread(tstate); tstate->interp->num_threads++; - res = PyObject_Call(boot->func, boot->args, boot->keyw); + + PyObject *res = PyObject_Call(boot->func, boot->args, boot->kwargs); if (res == NULL) { if (PyErr_ExceptionMatches(PyExc_SystemExit)) /* SystemExit is ignored silently */ @@ -1053,13 +996,12 @@ t_bootstrap(void *boot_raw) else { Py_DECREF(res); } - Py_DECREF(boot->func); - Py_DECREF(boot->args); - Py_XDECREF(boot->keyw); - PyMem_Free(boot_raw); + + thread_bootstate_free(boot); tstate->interp->num_threads--; PyThreadState_Clear(tstate); _PyThreadState_DeleteCurrent(tstate); + PyThread_exit_thread(); } @@ -1067,12 +1009,10 @@ static PyObject * thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) { _PyRuntimeState *runtime = &_PyRuntime; - PyObject *func, *args, *keyw = NULL; - struct bootstate *boot; - unsigned long ident; + PyObject *func, *args, *kwargs = NULL; if (!PyArg_UnpackTuple(fargs, "start_new_thread", 2, 3, - &func, &args, &keyw)) + &func, &args, &kwargs)) return NULL; if (!PyCallable_Check(func)) { PyErr_SetString(PyExc_TypeError, @@ -1084,7 +1024,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) "2nd arg must be a tuple"); return NULL; } - if (keyw != NULL && !PyDict_Check(keyw)) { + if (kwargs != NULL && !PyDict_Check(kwargs)) { PyErr_SetString(PyExc_TypeError, "optional 3rd arg must be a dictionary"); return NULL; @@ -1097,31 +1037,26 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) return NULL; } - boot = PyMem_NEW(struct bootstate, 1); - if (boot == NULL) + struct bootstate *boot = PyMem_NEW(struct bootstate, 1); + if (boot == NULL) { return PyErr_NoMemory(); + } boot->interp = _PyInterpreterState_GET(); - boot->func = func; - boot->args = args; - boot->keyw = keyw; boot->tstate = _PyThreadState_Prealloc(boot->interp); - boot->runtime = runtime; if (boot->tstate == NULL) { PyMem_Free(boot); return PyErr_NoMemory(); } - Py_INCREF(func); - Py_INCREF(args); - Py_XINCREF(keyw); + boot->runtime = runtime; + boot->func = Py_NewRef(func); + boot->args = Py_NewRef(args); + boot->kwargs = Py_XNewRef(kwargs); - ident = PyThread_start_new_thread(t_bootstrap, (void*) boot); + unsigned long ident = PyThread_start_new_thread(thread_run, (void*) boot); if (ident == PYTHREAD_INVALID_THREAD_ID) { PyErr_SetString(ThreadError, "can't start new thread"); - Py_DECREF(func); - Py_DECREF(args); - Py_XDECREF(keyw); PyThreadState_Clear(boot->tstate); - PyMem_Free(boot); + thread_bootstate_free(boot); return NULL; } return PyLong_FromUnsignedLong(ident); @@ -1169,7 +1104,7 @@ A subthread can use this function to interrupt the main thread." static lockobject *newlockobject(void); static PyObject * -thread_PyThread_allocate_lock(PyObject *self, PyObject *Py_UNUSED(ignored)) +thread_PyThread_allocate_lock(PyObject *module, PyObject *Py_UNUSED(ignored)) { return (PyObject *) newlockobject(); } @@ -1248,7 +1183,6 @@ release_sentinel(void *wr_raw) PyObject *obj = PyWeakref_GET_OBJECT(wr); lockobject *lock; if (obj != Py_None) { - assert(Py_IS_TYPE(obj, &Locktype)); lock = (lockobject *) obj; if (lock->locked) { PyThread_release_lock(lock->lock_lock); @@ -1261,7 +1195,7 @@ release_sentinel(void *wr_raw) } static PyObject * -thread__set_sentinel(PyObject *self, PyObject *Py_UNUSED(ignored)) +thread__set_sentinel(PyObject *module, PyObject *Py_UNUSED(ignored)) { PyObject *wr; PyThreadState *tstate = PyThreadState_Get(); @@ -1429,7 +1363,7 @@ static PyStructSequence_Field ExceptHookArgs_fields[] = { }; static PyStructSequence_Desc ExceptHookArgs_desc = { - .name = "_thread.ExceptHookArgs", + .name = "_thread._ExceptHookArgs", .doc = ExceptHookArgs__doc__, .fields = ExceptHookArgs_fields, .n_in_sequence = 4 @@ -1530,106 +1464,87 @@ static PyMethodDef thread_methods[] = { /* Initialization function */ -PyDoc_STRVAR(thread_doc, -"This module provides primitive operations to write multi-threaded programs.\n\ -The 'threading' module provides a more convenient interface."); - -PyDoc_STRVAR(lock_doc, -"A lock object is a synchronization primitive. To create a lock,\n\ -call threading.Lock(). Methods are:\n\ -\n\ -acquire() -- lock the lock, possibly blocking until it can be obtained\n\ -release() -- unlock of the lock\n\ -locked() -- test whether the lock is currently locked\n\ -\n\ -A lock is not owned by the thread that locked it; another thread may\n\ -unlock it. A thread attempting to lock a lock that it has already locked\n\ -will block until another thread unlocks it. Deadlocks may ensue."); - -static struct PyModuleDef threadmodule = { - PyModuleDef_HEAD_INIT, - "_thread", - thread_doc, - -1, - thread_methods, - NULL, - NULL, - NULL, - NULL -}; - - -PyMODINIT_FUNC -PyInit__thread(void) +static int +_thread_module_exec(PyObject *module) { - PyObject *m, *d, *v; - double time_max; - double timeout_max; - PyInterpreterState *interp = _PyInterpreterState_GET(); + // Initialize the C thread library + PyThread_init_thread(); - /* Initialize types: */ + // Initialize types if (PyType_Ready(&localdummytype) < 0) - return NULL; - if (PyType_Ready(&localtype) < 0) - return NULL; - if (PyType_Ready(&Locktype) < 0) - return NULL; - if (PyType_Ready(&RLocktype) < 0) - return NULL; + return -1; + if (PyType_Ready(&localtype) < 0) { + return -1; + } + if (PyType_Ready(&Locktype) < 0) { + return -1; + } + if (PyType_Ready(&RLocktype) < 0) { + return -1; + } if (ExceptHookArgsType.tp_name == NULL) { if (PyStructSequence_InitType2(&ExceptHookArgsType, &ExceptHookArgs_desc) < 0) { - return NULL; + return -1; } } - /* Create the module and add the functions */ - m = PyModule_Create(&threadmodule); - if (m == NULL) - return NULL; + // Add module attributes + PyObject *d = PyModule_GetDict(module); + if (PyDict_SetItemString(d, "error", ThreadError) < 0) { + return -1; + } + if (PyDict_SetItemString(d, "LockType", (PyObject *)&Locktype) < 0) { + return -1; + } + if (PyModule_AddType(module, &RLocktype) < 0) { + return -1; + } + if (PyModule_AddType(module, &localtype) < 0) { + return -1; + } + if (PyModule_AddType(module, &ExceptHookArgsType) < 0) { + return -1; + } - timeout_max = (_PyTime_t)PY_TIMEOUT_MAX * 1e-6; - time_max = _PyTime_AsSecondsDouble(_PyTime_MAX); + // TIMEOUT_MAX + double timeout_max = (_PyTime_t)PY_TIMEOUT_MAX * 1e-6; + double time_max = _PyTime_AsSecondsDouble(_PyTime_MAX); timeout_max = Py_MIN(timeout_max, time_max); - /* Round towards minus infinity */ + // Round towards minus infinity timeout_max = floor(timeout_max); - v = PyFloat_FromDouble(timeout_max); - if (!v) - return NULL; - if (PyModule_AddObject(m, "TIMEOUT_MAX", v) < 0) - return NULL; + if (PyModule_AddObject(module, "TIMEOUT_MAX", + PyFloat_FromDouble(timeout_max)) < 0) { + return -1; + } - /* Add a symbolic constant */ - d = PyModule_GetDict(m); - ThreadError = PyExc_RuntimeError; - Py_INCREF(ThreadError); + return 0; +} - PyDict_SetItemString(d, "error", ThreadError); - Locktype.tp_doc = lock_doc; - Py_INCREF(&Locktype); - PyDict_SetItemString(d, "LockType", (PyObject *)&Locktype); - Py_INCREF(&RLocktype); - if (PyModule_AddObject(m, "RLock", (PyObject *)&RLocktype) < 0) - return NULL; +PyDoc_STRVAR(thread_doc, +"This module provides primitive operations to write multi-threaded programs.\n\ +The 'threading' module provides a more convenient interface."); - Py_INCREF(&localtype); - if (PyModule_AddObject(m, "_local", (PyObject *)&localtype) < 0) - return NULL; +static struct PyModuleDef _thread_module = { + PyModuleDef_HEAD_INIT, + .m_name = "_thread", + .m_doc = thread_doc, + .m_size = -1, + .m_methods = thread_methods, +}; - Py_INCREF(&ExceptHookArgsType); - if (PyModule_AddObject(m, "_ExceptHookArgs", - (PyObject *)&ExceptHookArgsType) < 0) +PyMODINIT_FUNC +PyInit__thread(void) +{ + PyObject *module = PyModule_Create(&_thread_module); + if (module == NULL) return NULL; - interp->num_threads = 0; - - str_dict = PyUnicode_InternFromString("__dict__"); - if (str_dict == NULL) + if (_thread_module_exec(module) < 0) { + Py_DECREF(module); return NULL; - - /* Initialize the C thread library */ - PyThread_init_thread(); - return m; + } + return module; } From a0594c05fd91fd28f779c391b522ff92a3c5050f Mon Sep 17 00:00:00 2001 From: Om G <34579088+OmG-117@users.noreply.github.com> Date: Wed, 16 Dec 2020 17:48:05 +0530 Subject: [PATCH 0802/1261] bpo-42615: Delete redundant jump instructions that only bypass empty blocks (GH-23733) * Delete jump instructions that bypass empty blocks * Add news entry * Explicitly check for unconditional jump opcodes Using the is_jump function results in the inclusion of instructions like returns for which this optimization is not really valid. So, instead explicitly check that the instruction is an unconditional jump. * Handle conditional jumps, delete jumps gracefully * Ensure b_nofallthrough and b_reachable are valid * Add test for redundant jumps * Regenerate importlib.h and edit Misc/ACKS * Fix bad whitespace --- Lib/test/test_compile.py | 28 +++ Misc/ACKS | 1 + .../2020-12-10-17-06-52.bpo-42615.Je6Q-r.rst | 2 + Python/compile.c | 42 ++++ Python/importlib.h | 202 +++++++++--------- 5 files changed, 174 insertions(+), 101 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-10-17-06-52.bpo-42615.Je6Q-r.rst diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 3a37b6cf30bfcc..3e826b9accfb1b 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -837,6 +837,34 @@ def test_big_dict_literal(self): the_dict = "{" + ",".join(f"{x}:{x}" for x in range(dict_size)) + "}" self.assertEqual(len(eval(the_dict)), dict_size) + def test_redundant_jump_in_if_else_break(self): + # Check if bytecode containing jumps that simply point to the next line + # is generated around if-else-break style structures. See bpo-42615. + + def if_else_break(): + val = 1 + while True: + if val > 0: + val -= 1 + else: + break + val = -1 + + INSTR_SIZE = 2 + HANDLED_JUMPS = ( + 'POP_JUMP_IF_FALSE', + 'POP_JUMP_IF_TRUE', + 'JUMP_ABSOLUTE', + 'JUMP_FORWARD', + ) + + for line, instr in enumerate(dis.Bytecode(if_else_break)): + if instr.opname == 'JUMP_FORWARD': + self.assertNotEqual(instr.arg, 0) + elif instr.opname in HANDLED_JUMPS: + self.assertNotEqual(instr.arg, (line + 1)*INSTR_SIZE) + + class TestExpressionStackSize(unittest.TestCase): # These tests check that the computed stack size for a code object # stays within reasonable bounds (see issue #21523 for an example diff --git a/Misc/ACKS b/Misc/ACKS index 253349017c5cdc..134f4ea3be874c 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -643,6 +643,7 @@ Grzegorz Grzywacz Thomas Guettler Yuyang Guo Anuj Gupta +Om Gupta Michael Guravage Lars Gustäbel Thomas Güttler diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-10-17-06-52.bpo-42615.Je6Q-r.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-10-17-06-52.bpo-42615.Je6Q-r.rst new file mode 100644 index 00000000000000..2d919a8192d5a7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-12-10-17-06-52.bpo-42615.Je6Q-r.rst @@ -0,0 +1,2 @@ +Remove jump commands made redundant by the deletion of unreachable bytecode +blocks diff --git a/Python/compile.c b/Python/compile.c index ae92869fc9565b..4792733fd58614 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -6437,8 +6437,50 @@ optimize_cfg(struct assembler *a, PyObject *consts) for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { if (b->b_reachable == 0) { b->b_iused = 0; + b->b_nofallthrough = 0; } } + /* Delete jump instructions made redundant by previous step. If a non-empty + block ends with a jump instruction, check if the next non-empty block + reached through normal flow control is the target of that jump. If it + is, then the jump instruction is redundant and can be deleted. + */ + for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { + if (b->b_iused > 0) { + struct instr *b_last_instr = &b->b_instr[b->b_iused - 1]; + if (b_last_instr->i_opcode == POP_JUMP_IF_FALSE || + b_last_instr->i_opcode == POP_JUMP_IF_TRUE || + b_last_instr->i_opcode == JUMP_ABSOLUTE || + b_last_instr->i_opcode == JUMP_FORWARD) { + basicblock *b_next_act = b->b_next; + while (b_next_act != NULL && b_next_act->b_iused == 0) { + b_next_act = b_next_act->b_next; + } + if (b_last_instr->i_target == b_next_act) { + b->b_nofallthrough = 0; + switch(b_last_instr->i_opcode) { + case POP_JUMP_IF_FALSE: + case POP_JUMP_IF_TRUE: + b_last_instr->i_opcode = POP_TOP; + b_last_instr->i_target = NULL; + b_last_instr->i_oparg = 0; + break; + case JUMP_ABSOLUTE: + case JUMP_FORWARD: + b_last_instr->i_opcode = NOP; + clean_basic_block(b); + break; + } + /* The blocks after this one are now reachable through it */ + b_next_act = b->b_next; + while (b_next_act != NULL && b_next_act->b_iused == 0) { + b_next_act->b_reachable = 1; + b_next_act = b_next_act->b_next; + } + } + } + } + } minimize_lineno_table(a); return 0; } diff --git a/Python/importlib.h b/Python/importlib.h index e05c8ea391474f..f8def1b2b95e25 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -1749,107 +1749,107 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 102,114,111,109,95,110,97,109,101,129,4,0,0,115,10,0, 0,0,10,1,8,1,12,1,8,1,255,128,114,231,0,0, 0,99,2,0,0,0,0,0,0,0,0,0,0,0,10,0, - 0,0,5,0,0,0,67,0,0,0,115,164,0,0,0,124, + 0,0,5,0,0,0,67,0,0,0,115,162,0,0,0,124, 1,97,0,124,0,97,1,116,2,116,1,131,1,125,2,116, - 1,106,3,160,4,161,0,68,0,93,70,92,2,125,3,125, + 1,106,3,160,4,161,0,68,0,93,68,92,2,125,3,125, 4,116,5,124,4,124,2,131,2,114,26,124,3,116,1,106, - 6,118,0,114,60,116,7,125,5,110,16,116,0,160,8,124, - 3,161,1,114,26,116,9,125,5,110,0,116,10,124,4,124, - 5,131,2,125,6,116,11,124,6,124,4,131,2,1,0,113, - 26,116,1,106,3,116,12,25,0,125,7,100,1,68,0,93, - 46,125,8,124,8,116,1,106,3,118,1,114,136,116,13,124, - 8,131,1,125,9,110,10,116,1,106,3,124,8,25,0,125, - 9,116,14,124,7,124,8,124,9,131,3,1,0,113,112,100, - 2,83,0,41,3,122,250,83,101,116,117,112,32,105,109,112, - 111,114,116,108,105,98,32,98,121,32,105,109,112,111,114,116, - 105,110,103,32,110,101,101,100,101,100,32,98,117,105,108,116, - 45,105,110,32,109,111,100,117,108,101,115,32,97,110,100,32, - 105,110,106,101,99,116,105,110,103,32,116,104,101,109,10,32, - 32,32,32,105,110,116,111,32,116,104,101,32,103,108,111,98, - 97,108,32,110,97,109,101,115,112,97,99,101,46,10,10,32, - 32,32,32,65,115,32,115,121,115,32,105,115,32,110,101,101, - 100,101,100,32,102,111,114,32,115,121,115,46,109,111,100,117, - 108,101,115,32,97,99,99,101,115,115,32,97,110,100,32,95, - 105,109,112,32,105,115,32,110,101,101,100,101,100,32,116,111, - 32,108,111,97,100,32,98,117,105,108,116,45,105,110,10,32, - 32,32,32,109,111,100,117,108,101,115,44,32,116,104,111,115, - 101,32,116,119,111,32,109,111,100,117,108,101,115,32,109,117, - 115,116,32,98,101,32,101,120,112,108,105,99,105,116,108,121, - 32,112,97,115,115,101,100,32,105,110,46,10,10,32,32,32, - 32,41,3,114,26,0,0,0,114,95,0,0,0,114,68,0, - 0,0,78,41,15,114,61,0,0,0,114,18,0,0,0,114, - 3,0,0,0,114,99,0,0,0,218,5,105,116,101,109,115, - 114,203,0,0,0,114,82,0,0,0,114,169,0,0,0,114, - 92,0,0,0,114,184,0,0,0,114,149,0,0,0,114,155, - 0,0,0,114,9,0,0,0,114,231,0,0,0,114,12,0, - 0,0,41,10,218,10,115,121,115,95,109,111,100,117,108,101, - 218,11,95,105,109,112,95,109,111,100,117,108,101,90,11,109, - 111,100,117,108,101,95,116,121,112,101,114,20,0,0,0,114, - 104,0,0,0,114,116,0,0,0,114,103,0,0,0,90,11, - 115,101,108,102,95,109,111,100,117,108,101,90,12,98,117,105, - 108,116,105,110,95,110,97,109,101,90,14,98,117,105,108,116, - 105,110,95,109,111,100,117,108,101,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,6,95,115,101,116,117,112, - 136,4,0,0,115,40,0,0,0,4,9,4,1,8,3,18, - 1,10,1,10,1,6,1,10,1,6,1,10,3,10,1,2, - 128,10,3,8,1,10,1,10,1,10,2,14,1,4,251,255, - 128,114,235,0,0,0,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 38,0,0,0,116,0,124,0,124,1,131,2,1,0,116,1, - 106,2,160,3,116,4,161,1,1,0,116,1,106,2,160,3, - 116,5,161,1,1,0,100,1,83,0,41,2,122,48,73,110, - 115,116,97,108,108,32,105,109,112,111,114,116,101,114,115,32, - 102,111,114,32,98,117,105,108,116,105,110,32,97,110,100,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,115,78,41, - 6,114,235,0,0,0,114,18,0,0,0,114,201,0,0,0, - 114,126,0,0,0,114,169,0,0,0,114,184,0,0,0,41, - 2,114,233,0,0,0,114,234,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,8,95,105,110,115, - 116,97,108,108,171,4,0,0,115,8,0,0,0,10,2,12, - 2,16,1,255,128,114,236,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,67, - 0,0,0,115,32,0,0,0,100,1,100,2,108,0,125,0, - 124,0,97,1,124,0,160,2,116,3,106,4,116,5,25,0, - 161,1,1,0,100,2,83,0,41,3,122,57,73,110,115,116, - 97,108,108,32,105,109,112,111,114,116,101,114,115,32,116,104, - 97,116,32,114,101,113,117,105,114,101,32,101,120,116,101,114, - 110,97,108,32,102,105,108,101,115,121,115,116,101,109,32,97, - 99,99,101,115,115,114,25,0,0,0,78,41,6,218,26,95, - 102,114,111,122,101,110,95,105,109,112,111,114,116,108,105,98, - 95,101,120,116,101,114,110,97,108,114,133,0,0,0,114,236, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,9,0, - 0,0,41,1,114,237,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,27,95,105,110,115,116,97, - 108,108,95,101,120,116,101,114,110,97,108,95,105,109,112,111, - 114,116,101,114,115,179,4,0,0,115,8,0,0,0,8,3, - 4,1,20,1,255,128,114,238,0,0,0,41,2,78,78,41, - 1,78,41,2,78,114,25,0,0,0,41,4,78,78,114,5, - 0,0,0,114,25,0,0,0,41,54,114,10,0,0,0,114, - 7,0,0,0,114,26,0,0,0,114,95,0,0,0,114,68, - 0,0,0,114,133,0,0,0,114,17,0,0,0,114,21,0, - 0,0,114,63,0,0,0,114,37,0,0,0,114,47,0,0, - 0,114,22,0,0,0,114,23,0,0,0,114,53,0,0,0, - 114,54,0,0,0,114,57,0,0,0,114,69,0,0,0,114, - 71,0,0,0,114,80,0,0,0,114,90,0,0,0,114,94, - 0,0,0,114,105,0,0,0,114,118,0,0,0,114,119,0, - 0,0,114,98,0,0,0,114,149,0,0,0,114,155,0,0, - 0,114,159,0,0,0,114,114,0,0,0,114,100,0,0,0, - 114,166,0,0,0,114,167,0,0,0,114,101,0,0,0,114, - 169,0,0,0,114,184,0,0,0,114,189,0,0,0,114,198, - 0,0,0,114,200,0,0,0,114,202,0,0,0,114,208,0, - 0,0,90,15,95,69,82,82,95,77,83,71,95,80,82,69, - 70,73,88,114,210,0,0,0,114,213,0,0,0,218,6,111, - 98,106,101,99,116,114,214,0,0,0,114,215,0,0,0,114, - 216,0,0,0,114,221,0,0,0,114,227,0,0,0,114,230, - 0,0,0,114,231,0,0,0,114,235,0,0,0,114,236,0, - 0,0,114,238,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,8,60,109,111, - 100,117,108,101,62,1,0,0,0,115,106,0,0,0,4,0, - 8,22,4,9,4,1,4,1,4,3,8,3,8,8,4,8, - 4,2,16,3,14,4,14,77,14,21,8,16,8,37,8,17, - 14,11,8,8,8,11,8,12,8,19,14,36,16,101,10,26, - 14,45,8,72,8,17,8,17,8,30,8,36,8,45,14,15, - 14,75,14,80,8,13,8,9,10,9,8,47,4,16,8,1, - 8,2,6,32,8,3,10,16,14,15,8,37,10,27,8,37, - 8,7,8,35,12,8,255,128, + 6,118,0,114,60,116,7,125,5,110,14,116,0,160,8,124, + 3,161,1,114,26,116,9,125,5,116,10,124,4,124,5,131, + 2,125,6,116,11,124,6,124,4,131,2,1,0,113,26,116, + 1,106,3,116,12,25,0,125,7,100,1,68,0,93,46,125, + 8,124,8,116,1,106,3,118,1,114,134,116,13,124,8,131, + 1,125,9,110,10,116,1,106,3,124,8,25,0,125,9,116, + 14,124,7,124,8,124,9,131,3,1,0,113,110,100,2,83, + 0,41,3,122,250,83,101,116,117,112,32,105,109,112,111,114, + 116,108,105,98,32,98,121,32,105,109,112,111,114,116,105,110, + 103,32,110,101,101,100,101,100,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,115,32,97,110,100,32,105,110, + 106,101,99,116,105,110,103,32,116,104,101,109,10,32,32,32, + 32,105,110,116,111,32,116,104,101,32,103,108,111,98,97,108, + 32,110,97,109,101,115,112,97,99,101,46,10,10,32,32,32, + 32,65,115,32,115,121,115,32,105,115,32,110,101,101,100,101, + 100,32,102,111,114,32,115,121,115,46,109,111,100,117,108,101, + 115,32,97,99,99,101,115,115,32,97,110,100,32,95,105,109, + 112,32,105,115,32,110,101,101,100,101,100,32,116,111,32,108, + 111,97,100,32,98,117,105,108,116,45,105,110,10,32,32,32, + 32,109,111,100,117,108,101,115,44,32,116,104,111,115,101,32, + 116,119,111,32,109,111,100,117,108,101,115,32,109,117,115,116, + 32,98,101,32,101,120,112,108,105,99,105,116,108,121,32,112, + 97,115,115,101,100,32,105,110,46,10,10,32,32,32,32,41, + 3,114,26,0,0,0,114,95,0,0,0,114,68,0,0,0, + 78,41,15,114,61,0,0,0,114,18,0,0,0,114,3,0, + 0,0,114,99,0,0,0,218,5,105,116,101,109,115,114,203, + 0,0,0,114,82,0,0,0,114,169,0,0,0,114,92,0, + 0,0,114,184,0,0,0,114,149,0,0,0,114,155,0,0, + 0,114,9,0,0,0,114,231,0,0,0,114,12,0,0,0, + 41,10,218,10,115,121,115,95,109,111,100,117,108,101,218,11, + 95,105,109,112,95,109,111,100,117,108,101,90,11,109,111,100, + 117,108,101,95,116,121,112,101,114,20,0,0,0,114,104,0, + 0,0,114,116,0,0,0,114,103,0,0,0,90,11,115,101, + 108,102,95,109,111,100,117,108,101,90,12,98,117,105,108,116, + 105,110,95,110,97,109,101,90,14,98,117,105,108,116,105,110, + 95,109,111,100,117,108,101,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,6,95,115,101,116,117,112,136,4, + 0,0,115,40,0,0,0,4,9,4,1,8,3,18,1,10, + 1,10,1,6,1,10,1,4,1,10,3,10,1,2,128,10, + 3,8,1,10,1,10,1,10,2,14,1,4,251,255,128,114, + 235,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,38,0, + 0,0,116,0,124,0,124,1,131,2,1,0,116,1,106,2, + 160,3,116,4,161,1,1,0,116,1,106,2,160,3,116,5, + 161,1,1,0,100,1,83,0,41,2,122,48,73,110,115,116, + 97,108,108,32,105,109,112,111,114,116,101,114,115,32,102,111, + 114,32,98,117,105,108,116,105,110,32,97,110,100,32,102,114, + 111,122,101,110,32,109,111,100,117,108,101,115,78,41,6,114, + 235,0,0,0,114,18,0,0,0,114,201,0,0,0,114,126, + 0,0,0,114,169,0,0,0,114,184,0,0,0,41,2,114, + 233,0,0,0,114,234,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,8,95,105,110,115,116,97, + 108,108,171,4,0,0,115,8,0,0,0,10,2,12,2,16, + 1,255,128,114,236,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, + 0,115,32,0,0,0,100,1,100,2,108,0,125,0,124,0, + 97,1,124,0,160,2,116,3,106,4,116,5,25,0,161,1, + 1,0,100,2,83,0,41,3,122,57,73,110,115,116,97,108, + 108,32,105,109,112,111,114,116,101,114,115,32,116,104,97,116, + 32,114,101,113,117,105,114,101,32,101,120,116,101,114,110,97, + 108,32,102,105,108,101,115,121,115,116,101,109,32,97,99,99, + 101,115,115,114,25,0,0,0,78,41,6,218,26,95,102,114, + 111,122,101,110,95,105,109,112,111,114,116,108,105,98,95,101, + 120,116,101,114,110,97,108,114,133,0,0,0,114,236,0,0, + 0,114,18,0,0,0,114,99,0,0,0,114,9,0,0,0, + 41,1,114,237,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,27,95,105,110,115,116,97,108,108, + 95,101,120,116,101,114,110,97,108,95,105,109,112,111,114,116, + 101,114,115,179,4,0,0,115,8,0,0,0,8,3,4,1, + 20,1,255,128,114,238,0,0,0,41,2,78,78,41,1,78, + 41,2,78,114,25,0,0,0,41,4,78,78,114,5,0,0, + 0,114,25,0,0,0,41,54,114,10,0,0,0,114,7,0, + 0,0,114,26,0,0,0,114,95,0,0,0,114,68,0,0, + 0,114,133,0,0,0,114,17,0,0,0,114,21,0,0,0, + 114,63,0,0,0,114,37,0,0,0,114,47,0,0,0,114, + 22,0,0,0,114,23,0,0,0,114,53,0,0,0,114,54, + 0,0,0,114,57,0,0,0,114,69,0,0,0,114,71,0, + 0,0,114,80,0,0,0,114,90,0,0,0,114,94,0,0, + 0,114,105,0,0,0,114,118,0,0,0,114,119,0,0,0, + 114,98,0,0,0,114,149,0,0,0,114,155,0,0,0,114, + 159,0,0,0,114,114,0,0,0,114,100,0,0,0,114,166, + 0,0,0,114,167,0,0,0,114,101,0,0,0,114,169,0, + 0,0,114,184,0,0,0,114,189,0,0,0,114,198,0,0, + 0,114,200,0,0,0,114,202,0,0,0,114,208,0,0,0, + 90,15,95,69,82,82,95,77,83,71,95,80,82,69,70,73, + 88,114,210,0,0,0,114,213,0,0,0,218,6,111,98,106, + 101,99,116,114,214,0,0,0,114,215,0,0,0,114,216,0, + 0,0,114,221,0,0,0,114,227,0,0,0,114,230,0,0, + 0,114,231,0,0,0,114,235,0,0,0,114,236,0,0,0, + 114,238,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,8,60,109,111,100,117, + 108,101,62,1,0,0,0,115,106,0,0,0,4,0,8,22, + 4,9,4,1,4,1,4,3,8,3,8,8,4,8,4,2, + 16,3,14,4,14,77,14,21,8,16,8,37,8,17,14,11, + 8,8,8,11,8,12,8,19,14,36,16,101,10,26,14,45, + 8,72,8,17,8,17,8,30,8,36,8,45,14,15,14,75, + 14,80,8,13,8,9,10,9,8,47,4,16,8,1,8,2, + 6,32,8,3,10,16,14,15,8,37,10,27,8,37,8,7, + 8,35,12,8,255,128, }; From 725f1bc1db46f327c369460548982ecac552bfaa Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Wed, 16 Dec 2020 13:07:01 +0000 Subject: [PATCH 0803/1261] bpo-42645: Make sure that return/break/continue are only traced once when exiting via a finally block. (GH-23780) * Make sure that return/break/continue are only traced once when exiting via a finally block. * Add test for return in try-finally. * Update importlib --- Lib/test/test_dis.py | 16 +- Lib/test/test_sys_settrace.py | 113 ++ Python/compile.c | 17 +- Python/importlib.h | 3320 ++++++++++++++++----------------- 4 files changed, 1790 insertions(+), 1676 deletions(-) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index eb931703d51ed1..f279f75c9614d5 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -366,16 +366,12 @@ def _tryfinallyconst(b): %3d 6 LOAD_FAST 1 (b) 8 CALL_FUNCTION 0 10 POP_TOP - -%3d 12 RETURN_VALUE - -%3d >> 14 LOAD_FAST 1 (b) + 12 RETURN_VALUE + >> 14 LOAD_FAST 1 (b) 16 CALL_FUNCTION 0 18 POP_TOP 20 RERAISE """ % (_tryfinally.__code__.co_firstlineno + 1, - _tryfinally.__code__.co_firstlineno + 2, - _tryfinally.__code__.co_firstlineno + 4, _tryfinally.__code__.co_firstlineno + 2, _tryfinally.__code__.co_firstlineno + 4, ) @@ -388,17 +384,13 @@ def _tryfinallyconst(b): %3d 4 LOAD_FAST 0 (b) 6 CALL_FUNCTION 0 8 POP_TOP - -%3d 10 LOAD_CONST 1 (1) + 10 LOAD_CONST 1 (1) 12 RETURN_VALUE - -%3d >> 14 LOAD_FAST 0 (b) + >> 14 LOAD_FAST 0 (b) 16 CALL_FUNCTION 0 18 POP_TOP 20 RERAISE """ % (_tryfinallyconst.__code__.co_firstlineno + 1, - _tryfinallyconst.__code__.co_firstlineno + 2, - _tryfinallyconst.__code__.co_firstlineno + 4, _tryfinallyconst.__code__.co_firstlineno + 2, _tryfinallyconst.__code__.co_firstlineno + 4, ) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index a842139cd8e4ca..3bfc99385d2eb3 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -678,6 +678,119 @@ def func(): (4, 'line'), (4, 'return')]) + def test_if_break(self): + + def func(): + seq = [1, 0] + while seq: + n = seq.pop() + if n: + break # line 5 + else: + n = 99 + return n # line 8 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (4, 'line'), + (2, 'line'), + (3, 'line'), + (4, 'line'), + (5, 'line'), + (8, 'line'), + (8, 'return')]) + + def test_break_through_finally(self): + + def func(): + a, c, d, i = 1, 1, 1, 99 + try: + for i in range(3): + try: + a = 5 + if i > 0: + break # line 7 + a = 8 + finally: + c = 10 + except: + d = 12 # line 12 + assert a == 5 and c == 10 and d == 1 # line 13 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (4, 'line'), + (5, 'line'), + (6, 'line'), + (8, 'line'), + (10, 'line'), + (3, 'line'), + (4, 'line'), + (5, 'line'), + (6, 'line'), + (7, 'line'), + (10, 'line'), + (13, 'line'), + (13, 'return')]) + + def test_continue_through_finally(self): + + def func(): + a, b, c, d, i = 1, 1, 1, 1, 99 + try: + for i in range(2): + try: + a = 5 + if i > 0: + continue # line 7 + b = 8 + finally: + c = 10 + except: + d = 12 # line 12 + assert (a, b, c, d) == (5, 8, 10, 1) # line 13 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (4, 'line'), + (5, 'line'), + (6, 'line'), + (8, 'line'), + (10, 'line'), + (3, 'line'), + (4, 'line'), + (5, 'line'), + (6, 'line'), + (7, 'line'), + (10, 'line'), + (3, 'line'), + (13, 'line'), + (13, 'return')]) + + def test_return_through_finally(self): + + def func(): + try: + return 2 + finally: + 4 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (4, 'line'), + (4, 'return')]) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Python/compile.c b/Python/compile.c index 4792733fd58614..2871ffc476f8df 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1695,19 +1695,22 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, return 1; case FINALLY_TRY: + /* This POP_BLOCK gets the line number of the unwinding statement */ ADDOP(c, POP_BLOCK); if (preserve_tos) { if (!compiler_push_fblock(c, POP_VALUE, NULL, NULL, NULL)) { return 0; } } - /* Emit the finally block, restoring the line number when done */ - int saved_lineno = c->u->u_lineno; + /* Emit the finally block */ VISIT_SEQ(c, stmt, info->fb_datum); - c->u->u_lineno = saved_lineno; if (preserve_tos) { compiler_pop_fblock(c, POP_VALUE, NULL); } + /* The finally block should appear to execute after the + * statement causing the unwinding, so make the unwinding + * instruction artificial */ + c->u->u_lineno = -1; return 1; case FINALLY_END: @@ -2859,6 +2862,12 @@ compiler_return(struct compiler *c, stmt_ty s) } if (preserve_tos) { VISIT(c, expr, s->v.Return.value); + } else { + /* Emit instruction with line number for expression */ + if (s->v.Return.value != NULL) { + SET_LOC(c, s->v.Return.value); + ADDOP(c, NOP); + } } if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL)) return 0; @@ -2866,7 +2875,7 @@ compiler_return(struct compiler *c, stmt_ty s) ADDOP_LOAD_CONST(c, Py_None); } else if (!preserve_tos) { - VISIT(c, expr, s->v.Return.value); + ADDOP_LOAD_CONST(c, s->v.Return.value->v.Constant.value); } ADDOP(c, RETURN_VALUE); NEXT_BLOCK(c); diff --git a/Python/importlib.h b/Python/importlib.h index f8def1b2b95e25..1caf2f4f742d22 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -183,1673 +183,1673 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 101,114,31,0,0,0,218,7,114,101,108,101,97,115,101,169, 2,114,33,0,0,0,114,40,0,0,0,114,5,0,0,0, 114,5,0,0,0,114,6,0,0,0,114,43,0,0,0,100, - 0,0,0,115,40,0,0,0,8,6,8,1,2,1,2,1, - 8,1,20,1,6,1,14,1,14,1,6,9,4,247,8,1, - 12,1,12,1,44,1,10,2,10,1,2,244,8,14,255,128, - 122,19,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,0,0, - 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,144, - 0,0,0,116,0,160,1,161,0,125,1,124,0,106,2,143, - 110,1,0,124,0,106,3,124,1,107,3,114,34,116,4,100, - 1,131,1,130,1,124,0,106,5,100,2,107,4,115,48,74, - 0,130,1,124,0,4,0,106,5,100,3,56,0,2,0,95, - 5,124,0,106,5,100,2,107,2,114,108,100,0,124,0,95, - 3,124,0,106,6,114,108,124,0,4,0,106,6,100,3,56, - 0,2,0,95,6,124,0,106,7,160,8,161,0,1,0,87, - 0,100,0,4,0,4,0,131,3,1,0,100,0,83,0,49, - 0,115,130,48,0,1,0,1,0,1,0,89,0,1,0,100, - 0,83,0,41,4,78,250,31,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,114,25,0,0,0,114,42,0,0, - 0,41,9,114,26,0,0,0,114,35,0,0,0,114,27,0, - 0,0,114,29,0,0,0,218,12,82,117,110,116,105,109,101, - 69,114,114,111,114,114,30,0,0,0,114,31,0,0,0,114, - 28,0,0,0,114,44,0,0,0,114,45,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,44,0, - 0,0,125,0,0,0,115,24,0,0,0,8,1,8,1,10, - 1,8,1,14,1,14,1,10,1,6,1,6,1,14,1,46, - 1,255,128,122,19,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,0,0,0,0,1,0,0,0,5,0,0,0,67,0,0, - 0,115,18,0,0,0,100,1,160,0,124,0,106,1,116,2, - 124,0,131,1,161,2,83,0,41,2,78,122,23,95,77,111, - 100,117,108,101,76,111,99,107,40,123,33,114,125,41,32,97, - 116,32,123,125,169,3,218,6,102,111,114,109,97,116,114,20, - 0,0,0,218,2,105,100,169,1,114,33,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,8,95, - 95,114,101,112,114,95,95,138,0,0,0,115,4,0,0,0, - 18,1,255,128,122,20,95,77,111,100,117,108,101,76,111,99, - 107,46,95,95,114,101,112,114,95,95,78,41,9,114,9,0, - 0,0,114,8,0,0,0,114,1,0,0,0,114,10,0,0, - 0,114,34,0,0,0,114,41,0,0,0,114,43,0,0,0, - 114,44,0,0,0,114,52,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,23, - 0,0,0,65,0,0,0,115,16,0,0,0,8,0,4,1, - 8,5,8,8,8,21,8,25,12,13,255,128,114,23,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,64,0,0,0,115,48,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, - 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,132, - 0,90,6,100,8,100,9,132,0,90,7,100,10,83,0,41, - 11,218,16,95,68,117,109,109,121,77,111,100,117,108,101,76, - 111,99,107,122,86,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,0,0,0,0,2,0,0,0,2,0,0,0, - 67,0,0,0,115,16,0,0,0,124,1,124,0,95,0,100, - 1,124,0,95,1,100,0,83,0,114,24,0,0,0,41,2, - 114,20,0,0,0,114,30,0,0,0,114,32,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,34, - 0,0,0,146,0,0,0,115,6,0,0,0,6,1,10,1, - 255,128,122,25,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,115,38,0,0,0,8,6,8,1,2,1,2,1, + 8,1,20,1,6,1,14,1,14,1,10,9,8,248,12,1, + 12,1,44,1,10,2,10,1,2,244,8,14,255,128,122,19, + 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,0,0,0,0, + 2,0,0,0,8,0,0,0,67,0,0,0,115,144,0,0, + 0,116,0,160,1,161,0,125,1,124,0,106,2,143,110,1, + 0,124,0,106,3,124,1,107,3,114,34,116,4,100,1,131, + 1,130,1,124,0,106,5,100,2,107,4,115,48,74,0,130, + 1,124,0,4,0,106,5,100,3,56,0,2,0,95,5,124, + 0,106,5,100,2,107,2,114,108,100,0,124,0,95,3,124, + 0,106,6,114,108,124,0,4,0,106,6,100,3,56,0,2, + 0,95,6,124,0,106,7,160,8,161,0,1,0,87,0,100, + 0,4,0,4,0,131,3,1,0,100,0,83,0,49,0,115, + 130,48,0,1,0,1,0,1,0,89,0,1,0,100,0,83, + 0,41,4,78,250,31,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,114,25,0,0,0,114,42,0,0,0,41, + 9,114,26,0,0,0,114,35,0,0,0,114,27,0,0,0, + 114,29,0,0,0,218,12,82,117,110,116,105,109,101,69,114, + 114,111,114,114,30,0,0,0,114,31,0,0,0,114,28,0, + 0,0,114,44,0,0,0,114,45,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,44,0,0,0, + 125,0,0,0,115,24,0,0,0,8,1,8,1,10,1,8, + 1,14,1,14,1,10,1,6,1,6,1,14,1,46,1,255, + 128,122,19,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,0, + 0,0,0,1,0,0,0,5,0,0,0,67,0,0,0,115, + 18,0,0,0,100,1,160,0,124,0,106,1,116,2,124,0, + 131,1,161,2,83,0,41,2,78,122,23,95,77,111,100,117, + 108,101,76,111,99,107,40,123,33,114,125,41,32,97,116,32, + 123,125,169,3,218,6,102,111,114,109,97,116,114,20,0,0, + 0,218,2,105,100,169,1,114,33,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,8,95,95,114, + 101,112,114,95,95,138,0,0,0,115,4,0,0,0,18,1, + 255,128,122,20,95,77,111,100,117,108,101,76,111,99,107,46, + 95,95,114,101,112,114,95,95,78,41,9,114,9,0,0,0, + 114,8,0,0,0,114,1,0,0,0,114,10,0,0,0,114, + 34,0,0,0,114,41,0,0,0,114,43,0,0,0,114,44, + 0,0,0,114,52,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,23,0,0, + 0,65,0,0,0,115,16,0,0,0,8,0,4,1,8,5, + 8,8,8,21,8,25,12,13,255,128,114,23,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,64,0,0,0,115,48,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, + 4,100,4,100,5,132,0,90,5,100,6,100,7,132,0,90, + 6,100,8,100,9,132,0,90,7,100,10,83,0,41,11,218, + 16,95,68,117,109,109,121,77,111,100,117,108,101,76,111,99, + 107,122,86,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0, + 0,0,115,16,0,0,0,124,1,124,0,95,0,100,1,124, + 0,95,1,100,0,83,0,114,24,0,0,0,41,2,114,20, + 0,0,0,114,30,0,0,0,114,32,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,34,0,0, + 0,146,0,0,0,115,6,0,0,0,6,1,10,1,255,128, + 122,25,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,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,18,0,0,0,124,0,4,0,106,0,100, + 1,55,0,2,0,95,0,100,2,83,0,41,3,78,114,42, + 0,0,0,84,41,1,114,30,0,0,0,114,51,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 43,0,0,0,150,0,0,0,115,6,0,0,0,14,1,4, + 1,255,128,122,24,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,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,18,0,0,0,124,0,4,0,106, - 0,100,1,55,0,2,0,95,0,100,2,83,0,41,3,78, - 114,42,0,0,0,84,41,1,114,30,0,0,0,114,51,0, + 0,0,67,0,0,0,115,36,0,0,0,124,0,106,0,100, + 1,107,2,114,18,116,1,100,2,131,1,130,1,124,0,4, + 0,106,0,100,3,56,0,2,0,95,0,100,0,83,0,41, + 4,78,114,25,0,0,0,114,46,0,0,0,114,42,0,0, + 0,41,2,114,30,0,0,0,114,47,0,0,0,114,51,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,43,0,0,0,150,0,0,0,115,6,0,0,0,14, - 1,4,1,255,128,122,24,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,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,36,0,0,0,124,0,106, - 0,100,1,107,2,114,18,116,1,100,2,131,1,130,1,124, - 0,4,0,106,0,100,3,56,0,2,0,95,0,100,0,83, - 0,41,4,78,114,25,0,0,0,114,46,0,0,0,114,42, - 0,0,0,41,2,114,30,0,0,0,114,47,0,0,0,114, - 51,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,44,0,0,0,154,0,0,0,115,8,0,0, - 0,10,1,8,1,18,1,255,128,122,24,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,0,0,0,0, - 1,0,0,0,5,0,0,0,67,0,0,0,115,18,0,0, - 0,100,1,160,0,124,0,106,1,116,2,124,0,131,1,161, - 2,83,0,41,2,78,122,28,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,114,48,0,0,0,114,51,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,52,0, - 0,0,159,0,0,0,115,4,0,0,0,18,1,255,128,122, - 25,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,41,8,114,9,0, - 0,0,114,8,0,0,0,114,1,0,0,0,114,10,0,0, - 0,114,34,0,0,0,114,43,0,0,0,114,44,0,0,0, - 114,52,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,53,0,0,0,142,0, - 0,0,115,14,0,0,0,8,0,4,1,8,3,8,4,8, - 4,12,5,255,128,114,53,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,36,0,0,0,101,0,90,1,100,0,90,2, - 100,1,100,2,132,0,90,3,100,3,100,4,132,0,90,4, - 100,5,100,6,132,0,90,5,100,7,83,0,41,8,218,18, - 95,77,111,100,117,108,101,76,111,99,107,77,97,110,97,103, - 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, - 124,1,124,0,95,0,100,0,124,0,95,1,100,0,83,0, - 114,0,0,0,0,41,2,218,5,95,110,97,109,101,218,5, - 95,108,111,99,107,114,32,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,34,0,0,0,165,0, - 0,0,115,6,0,0,0,6,1,10,1,255,128,122,27,95, - 77,111,100,117,108,101,76,111,99,107,77,97,110,97,103,101, - 114,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, - 0,0,0,115,26,0,0,0,116,0,124,0,106,1,131,1, - 124,0,95,2,124,0,106,2,160,3,161,0,1,0,100,0, - 83,0,114,0,0,0,0,41,4,218,16,95,103,101,116,95, - 109,111,100,117,108,101,95,108,111,99,107,114,55,0,0,0, - 114,56,0,0,0,114,43,0,0,0,114,51,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,9, - 95,95,101,110,116,101,114,95,95,169,0,0,0,115,6,0, - 0,0,12,1,14,1,255,128,122,28,95,77,111,100,117,108, - 101,76,111,99,107,77,97,110,97,103,101,114,46,95,95,101, - 110,116,101,114,95,95,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,2,0,0,0,79,0,0,0,115, - 14,0,0,0,124,0,106,0,160,1,161,0,1,0,100,0, - 83,0,114,0,0,0,0,41,2,114,56,0,0,0,114,44, - 0,0,0,41,3,114,33,0,0,0,218,4,97,114,103,115, - 90,6,107,119,97,114,103,115,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,8,95,95,101,120,105,116,95, - 95,173,0,0,0,115,4,0,0,0,14,1,255,128,122,27, - 95,77,111,100,117,108,101,76,111,99,107,77,97,110,97,103, - 101,114,46,95,95,101,120,105,116,95,95,78,41,6,114,9, - 0,0,0,114,8,0,0,0,114,1,0,0,0,114,34,0, - 0,0,114,58,0,0,0,114,60,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,54,0,0,0,163,0,0,0,115,10,0,0,0,8,0, - 8,2,8,4,12,4,255,128,114,54,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0, - 0,0,67,0,0,0,115,134,0,0,0,116,0,160,1,161, - 0,1,0,122,114,122,14,116,2,124,0,25,0,131,0,125, - 1,87,0,110,22,4,0,116,3,121,46,1,0,1,0,1, - 0,100,1,125,1,89,0,110,2,48,0,124,1,100,1,117, - 0,114,110,116,4,100,1,117,0,114,74,116,5,124,0,131, - 1,125,1,110,8,116,6,124,0,131,1,125,1,124,0,102, - 1,100,2,100,3,132,1,125,2,116,7,160,8,124,1,124, - 2,161,2,116,2,124,0,60,0,87,0,116,0,160,9,161, - 0,1,0,124,1,83,0,116,0,160,9,161,0,1,0,48, - 0,41,4,122,139,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,65,99,113,117,105,114,101,47,114,101,108,101,97,115,101, - 32,105,110,116,101,114,110,97,108,108,121,32,116,104,101,32, - 103,108,111,98,97,108,32,105,109,112,111,114,116,32,108,111, - 99,107,32,116,111,32,112,114,111,116,101,99,116,10,32,32, - 32,32,95,109,111,100,117,108,101,95,108,111,99,107,115,46, - 78,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,8,0,0,0,83,0,0,0,115,54,0,0,0,116, - 0,160,1,161,0,1,0,122,34,116,2,160,3,124,1,161, - 1,124,0,117,0,114,30,116,2,124,1,61,0,87,0,116, - 0,160,4,161,0,1,0,100,0,83,0,116,0,160,4,161, - 0,1,0,48,0,114,0,0,0,0,41,5,218,4,95,105, - 109,112,218,12,97,99,113,117,105,114,101,95,108,111,99,107, - 218,13,95,109,111,100,117,108,101,95,108,111,99,107,115,114, - 38,0,0,0,218,12,114,101,108,101,97,115,101,95,108,111, - 99,107,41,2,218,3,114,101,102,114,20,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,2,99, - 98,198,0,0,0,115,14,0,0,0,8,1,2,1,14,4, - 6,1,2,128,22,2,255,128,122,28,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,41,10,114,61,0,0,0,114,62,0, - 0,0,114,63,0,0,0,218,8,75,101,121,69,114,114,111, - 114,114,26,0,0,0,114,53,0,0,0,114,23,0,0,0, - 218,8,95,119,101,97,107,114,101,102,114,65,0,0,0,114, - 64,0,0,0,41,3,114,20,0,0,0,114,27,0,0,0, - 114,66,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,57,0,0,0,179,0,0,0,115,34,0, - 0,0,8,6,2,1,2,1,14,1,12,1,10,1,8,2, - 8,1,10,1,8,2,12,2,16,11,2,128,8,2,4,2, - 10,254,255,128,114,57,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,8,0,0,0,67,0, - 0,0,115,54,0,0,0,116,0,124,0,131,1,125,1,122, - 12,124,1,160,1,161,0,1,0,87,0,110,20,4,0,116, - 2,121,40,1,0,1,0,1,0,89,0,100,1,83,0,48, - 0,124,1,160,3,161,0,1,0,100,1,83,0,41,2,122, - 189,65,99,113,117,105,114,101,115,32,116,104,101,110,32,114, - 101,108,101,97,115,101,115,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,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,32,32,32,32,78,41, - 4,114,57,0,0,0,114,43,0,0,0,114,22,0,0,0, - 114,44,0,0,0,41,2,114,20,0,0,0,114,27,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,19,95,108,111,99,107,95,117,110,108,111,99,107,95,109, - 111,100,117,108,101,216,0,0,0,115,14,0,0,0,8,6, - 2,1,12,1,12,1,8,3,12,2,255,128,114,69,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,4,0,0,0,79,0,0,0,115,14,0,0,0,124, - 0,124,1,105,0,124,2,164,1,142,1,83,0,41,2,97, - 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,78,114,5,0,0,0,41,3,218,1,102,114,59,0, - 0,0,90,4,107,119,100,115,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,25,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,233,0,0,0,115,4,0,0,0,14,8,255,128,114, - 71,0,0,0,114,42,0,0,0,41,1,218,9,118,101,114, - 98,111,115,105,116,121,99,1,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,4,0,0,0,71,0,0,0,115, - 58,0,0,0,116,0,106,1,106,2,124,1,107,5,114,54, - 124,0,160,3,100,1,161,1,115,30,100,2,124,0,23,0, - 125,0,116,4,124,0,106,5,124,2,142,0,116,0,106,6, - 100,3,141,2,1,0,100,4,83,0,100,4,83,0,41,5, - 122,61,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,41, - 2,250,1,35,122,7,105,109,112,111,114,116,32,122,2,35, - 32,41,1,90,4,102,105,108,101,78,41,7,114,18,0,0, - 0,218,5,102,108,97,103,115,218,7,118,101,114,98,111,115, - 101,218,10,115,116,97,114,116,115,119,105,116,104,218,5,112, - 114,105,110,116,114,49,0,0,0,218,6,115,116,100,101,114, - 114,41,3,218,7,109,101,115,115,97,103,101,114,72,0,0, - 0,114,59,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,16,95,118,101,114,98,111,115,101,95, - 109,101,115,115,97,103,101,244,0,0,0,115,12,0,0,0, - 12,2,10,1,8,1,24,1,4,253,255,128,114,80,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,3,0,0,0,115,26,0,0,0,135, - 0,102,1,100,1,100,2,132,8,125,1,116,0,124,1,136, - 0,131,2,1,0,124,1,83,0,41,4,122,49,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,0,0,0,0,2,0,0,0,4, - 0,0,0,19,0,0,0,115,38,0,0,0,124,1,116,0, - 106,1,118,1,114,28,116,2,100,1,160,3,124,1,161,1, - 124,1,100,2,141,2,130,1,136,0,124,0,124,1,131,2, - 83,0,41,3,78,250,29,123,33,114,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,114,19,0,0,0,41,4,114,18,0,0,0, - 218,20,98,117,105,108,116,105,110,95,109,111,100,117,108,101, - 95,110,97,109,101,115,218,11,73,109,112,111,114,116,69,114, - 114,111,114,114,49,0,0,0,169,2,114,33,0,0,0,218, - 8,102,117,108,108,110,97,109,101,169,1,218,3,102,120,110, - 114,5,0,0,0,114,6,0,0,0,218,25,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,254,0,0,0,115,12,0,0,0,10,1, - 10,1,2,1,6,255,10,2,255,128,122,52,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, - 78,169,1,114,17,0,0,0,41,2,114,87,0,0,0,114, - 88,0,0,0,114,5,0,0,0,114,86,0,0,0,114,6, - 0,0,0,218,17,95,114,101,113,117,105,114,101,115,95,98, - 117,105,108,116,105,110,252,0,0,0,115,8,0,0,0,12, - 2,10,5,4,1,255,128,114,90,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, - 0,3,0,0,0,115,26,0,0,0,135,0,102,1,100,1, - 100,2,132,8,125,1,116,0,124,1,136,0,131,2,1,0, - 124,1,83,0,41,4,122,47,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, - 0,0,0,0,2,0,0,0,4,0,0,0,19,0,0,0, - 115,38,0,0,0,116,0,160,1,124,1,161,1,115,28,116, - 2,100,1,160,3,124,1,161,1,124,1,100,2,141,2,130, - 1,136,0,124,0,124,1,131,2,83,0,169,3,78,122,27, - 123,33,114,125,32,105,115,32,110,111,116,32,97,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,114,19,0,0,0, - 41,4,114,61,0,0,0,218,9,105,115,95,102,114,111,122, - 101,110,114,83,0,0,0,114,49,0,0,0,114,84,0,0, - 0,114,86,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,24,95,114,101,113,117,105,114,101,115,95,102,114,111,122, - 101,110,95,119,114,97,112,112,101,114,9,1,0,0,115,12, - 0,0,0,10,1,10,1,2,1,6,255,10,2,255,128,122, - 50,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,78,114,89,0,0,0,41,2,114,87,0,0,0, - 114,93,0,0,0,114,5,0,0,0,114,86,0,0,0,114, - 6,0,0,0,218,16,95,114,101,113,117,105,114,101,115,95, - 102,114,111,122,101,110,7,1,0,0,115,8,0,0,0,12, - 2,10,5,4,1,255,128,114,94,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,5,0,0,0,4,0,0, - 0,67,0,0,0,115,74,0,0,0,100,1,125,2,116,0, - 160,1,124,2,116,2,161,2,1,0,116,3,124,1,124,0, - 131,2,125,3,124,1,116,4,106,5,118,0,114,66,116,4, - 106,5,124,1,25,0,125,4,116,6,124,3,124,4,131,2, - 1,0,116,4,106,5,124,1,25,0,83,0,116,7,124,3, - 131,1,83,0,41,3,122,128,76,111,97,100,32,116,104,101, - 32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,108, - 101,32,105,110,116,111,32,115,121,115,46,109,111,100,117,108, - 101,115,32,97,110,100,32,114,101,116,117,114,110,32,105,116, - 46,10,10,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,85,115,101,32,108,111,97,100,101,114,46,101,120, - 101,99,95,109,111,100,117,108,101,32,105,110,115,116,101,97, - 100,46,10,10,32,32,32,32,122,103,116,104,101,32,108,111, - 97,100,95,109,111,100,117,108,101,40,41,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 32,97,110,100,32,115,108,97,116,101,100,32,102,111,114,32, - 114,101,109,111,118,97,108,32,105,110,32,80,121,116,104,111, - 110,32,51,46,49,50,59,32,117,115,101,32,101,120,101,99, - 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, - 100,78,41,8,218,9,95,119,97,114,110,105,110,103,115,218, - 4,119,97,114,110,218,18,68,101,112,114,101,99,97,116,105, - 111,110,87,97,114,110,105,110,103,218,16,115,112,101,99,95, - 102,114,111,109,95,108,111,97,100,101,114,114,18,0,0,0, - 218,7,109,111,100,117,108,101,115,218,5,95,101,120,101,99, - 218,5,95,108,111,97,100,41,5,114,33,0,0,0,114,85, - 0,0,0,218,3,109,115,103,218,4,115,112,101,99,218,6, - 109,111,100,117,108,101,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,17,95,108,111,97,100,95,109,111,100, - 117,108,101,95,115,104,105,109,19,1,0,0,115,18,0,0, - 0,4,6,12,2,10,1,10,1,10,1,10,1,10,1,8, - 2,255,128,114,105,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,5,0,0,0,8,0,0,0,67,0,0, - 0,115,210,0,0,0,116,0,124,0,100,1,100,0,131,3, - 125,1,116,1,124,1,100,2,131,2,114,54,122,12,124,1, - 160,2,124,0,161,1,87,0,83,0,4,0,116,3,121,52, - 1,0,1,0,1,0,89,0,110,2,48,0,122,10,124,0, - 106,4,125,2,87,0,110,18,4,0,116,5,121,82,1,0, - 1,0,1,0,89,0,110,18,48,0,124,2,100,0,117,1, - 114,100,116,6,124,2,131,1,83,0,122,10,124,0,106,7, - 125,3,87,0,110,22,4,0,116,5,121,132,1,0,1,0, - 1,0,100,3,125,3,89,0,110,2,48,0,122,10,124,0, - 106,8,125,4,87,0,110,52,4,0,116,5,121,196,1,0, - 1,0,1,0,124,1,100,0,117,0,114,180,100,4,160,9, - 124,3,161,1,6,0,89,0,83,0,100,5,160,9,124,3, - 124,1,161,2,6,0,89,0,83,0,48,0,100,6,160,9, - 124,3,124,4,161,2,83,0,41,7,78,218,10,95,95,108, - 111,97,100,101,114,95,95,218,11,109,111,100,117,108,101,95, - 114,101,112,114,250,1,63,250,13,60,109,111,100,117,108,101, - 32,123,33,114,125,62,250,20,60,109,111,100,117,108,101,32, - 123,33,114,125,32,40,123,33,114,125,41,62,250,23,60,109, - 111,100,117,108,101,32,123,33,114,125,32,102,114,111,109,32, - 123,33,114,125,62,41,10,114,13,0,0,0,114,11,0,0, - 0,114,107,0,0,0,218,9,69,120,99,101,112,116,105,111, - 110,218,8,95,95,115,112,101,99,95,95,114,2,0,0,0, - 218,22,95,109,111,100,117,108,101,95,114,101,112,114,95,102, - 114,111,109,95,115,112,101,99,114,9,0,0,0,218,8,95, - 95,102,105,108,101,95,95,114,49,0,0,0,41,5,114,104, - 0,0,0,218,6,108,111,97,100,101,114,114,103,0,0,0, - 114,20,0,0,0,218,8,102,105,108,101,110,97,109,101,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,12, - 95,109,111,100,117,108,101,95,114,101,112,114,38,1,0,0, - 115,48,0,0,0,12,2,10,1,2,4,12,1,12,1,6, - 1,2,1,10,1,12,1,6,1,8,2,8,1,2,4,10, - 1,12,1,10,1,2,1,10,1,12,1,8,1,14,1,18, - 2,12,2,255,128,114,118,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, - 0,0,0,115,114,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,2,100,2,100,3,156,3,100,4, - 100,5,132,2,90,4,100,6,100,7,132,0,90,5,100,8, - 100,9,132,0,90,6,101,7,100,10,100,11,132,0,131,1, - 90,8,101,8,106,9,100,12,100,11,132,0,131,1,90,8, - 101,7,100,13,100,14,132,0,131,1,90,10,101,7,100,15, - 100,16,132,0,131,1,90,11,101,11,106,9,100,17,100,16, - 132,0,131,1,90,11,100,2,83,0,41,18,218,10,77,111, - 100,117,108,101,83,112,101,99,97,208,5,0,0,84,104,101, - 32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102, - 111,114,32,97,32,109,111,100,117,108,101,44,32,117,115,101, - 100,32,102,111,114,32,108,111,97,100,105,110,103,46,10,10, - 32,32,32,32,65,32,109,111,100,117,108,101,39,115,32,115, - 112,101,99,32,105,115,32,116,104,101,32,115,111,117,114,99, - 101,32,102,111,114,32,105,110,102,111,114,109,97,116,105,111, - 110,32,97,98,111,117,116,32,116,104,101,32,109,111,100,117, - 108,101,46,32,32,70,111,114,10,32,32,32,32,100,97,116, - 97,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116, - 104,32,116,104,101,32,109,111,100,117,108,101,44,32,105,110, - 99,108,117,100,105,110,103,32,115,111,117,114,99,101,44,32, - 117,115,101,32,116,104,101,32,115,112,101,99,39,115,10,32, - 32,32,32,108,111,97,100,101,114,46,10,10,32,32,32,32, - 96,110,97,109,101,96,32,105,115,32,116,104,101,32,97,98, - 115,111,108,117,116,101,32,110,97,109,101,32,111,102,32,116, - 104,101,32,109,111,100,117,108,101,46,32,32,96,108,111,97, - 100,101,114,96,32,105,115,32,116,104,101,32,108,111,97,100, - 101,114,10,32,32,32,32,116,111,32,117,115,101,32,119,104, - 101,110,32,108,111,97,100,105,110,103,32,116,104,101,32,109, - 111,100,117,108,101,46,32,32,96,112,97,114,101,110,116,96, - 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, - 116,104,101,10,32,32,32,32,112,97,99,107,97,103,101,32, - 116,104,101,32,109,111,100,117,108,101,32,105,115,32,105,110, - 46,32,32,84,104,101,32,112,97,114,101,110,116,32,105,115, - 32,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104, - 101,32,110,97,109,101,46,10,10,32,32,32,32,96,105,115, - 95,112,97,99,107,97,103,101,96,32,100,101,116,101,114,109, - 105,110,101,115,32,105,102,32,116,104,101,32,109,111,100,117, - 108,101,32,105,115,32,99,111,110,115,105,100,101,114,101,100, - 32,97,32,112,97,99,107,97,103,101,32,111,114,10,32,32, - 32,32,110,111,116,46,32,32,79,110,32,109,111,100,117,108, - 101,115,32,116,104,105,115,32,105,115,32,114,101,102,108,101, - 99,116,101,100,32,98,121,32,116,104,101,32,96,95,95,112, - 97,116,104,95,95,96,32,97,116,116,114,105,98,117,116,101, - 46,10,10,32,32,32,32,96,111,114,105,103,105,110,96,32, - 105,115,32,116,104,101,32,115,112,101,99,105,102,105,99,32, - 108,111,99,97,116,105,111,110,32,117,115,101,100,32,98,121, - 32,116,104,101,32,108,111,97,100,101,114,32,102,114,111,109, - 32,119,104,105,99,104,32,116,111,10,32,32,32,32,108,111, - 97,100,32,116,104,101,32,109,111,100,117,108,101,44,32,105, - 102,32,116,104,97,116,32,105,110,102,111,114,109,97,116,105, - 111,110,32,105,115,32,97,118,97,105,108,97,98,108,101,46, - 32,32,87,104,101,110,32,102,105,108,101,110,97,109,101,32, - 105,115,10,32,32,32,32,115,101,116,44,32,111,114,105,103, - 105,110,32,119,105,108,108,32,109,97,116,99,104,46,10,10, - 32,32,32,32,96,104,97,115,95,108,111,99,97,116,105,111, - 110,96,32,105,110,100,105,99,97,116,101,115,32,116,104,97, - 116,32,97,32,115,112,101,99,39,115,32,34,111,114,105,103, - 105,110,34,32,114,101,102,108,101,99,116,115,32,97,32,108, - 111,99,97,116,105,111,110,46,10,32,32,32,32,87,104,101, - 110,32,116,104,105,115,32,105,115,32,84,114,117,101,44,32, - 96,95,95,102,105,108,101,95,95,96,32,97,116,116,114,105, - 98,117,116,101,32,111,102,32,116,104,101,32,109,111,100,117, - 108,101,32,105,115,32,115,101,116,46,10,10,32,32,32,32, - 96,99,97,99,104,101,100,96,32,105,115,32,116,104,101,32, - 108,111,99,97,116,105,111,110,32,111,102,32,116,104,101,32, - 99,97,99,104,101,100,32,98,121,116,101,99,111,100,101,32, - 102,105,108,101,44,32,105,102,32,97,110,121,46,32,32,73, - 116,10,32,32,32,32,99,111,114,114,101,115,112,111,110,100, - 115,32,116,111,32,116,104,101,32,96,95,95,99,97,99,104, - 101,100,95,95,96,32,97,116,116,114,105,98,117,116,101,46, - 10,10,32,32,32,32,96,115,117,98,109,111,100,117,108,101, - 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, - 115,96,32,105,115,32,116,104,101,32,115,101,113,117,101,110, - 99,101,32,111,102,32,112,97,116,104,32,101,110,116,114,105, - 101,115,32,116,111,10,32,32,32,32,115,101,97,114,99,104, - 32,119,104,101,110,32,105,109,112,111,114,116,105,110,103,32, - 115,117,98,109,111,100,117,108,101,115,46,32,32,73,102,32, - 115,101,116,44,32,105,115,95,112,97,99,107,97,103,101,32, - 115,104,111,117,108,100,32,98,101,10,32,32,32,32,84,114, - 117,101,45,45,97,110,100,32,70,97,108,115,101,32,111,116, - 104,101,114,119,105,115,101,46,10,10,32,32,32,32,80,97, - 99,107,97,103,101,115,32,97,114,101,32,115,105,109,112,108, - 121,32,109,111,100,117,108,101,115,32,116,104,97,116,32,40, - 109,97,121,41,32,104,97,118,101,32,115,117,98,109,111,100, - 117,108,101,115,46,32,32,73,102,32,97,32,115,112,101,99, - 10,32,32,32,32,104,97,115,32,97,32,110,111,110,45,78, - 111,110,101,32,118,97,108,117,101,32,105,110,32,96,115,117, - 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, - 111,99,97,116,105,111,110,115,96,44,32,116,104,101,32,105, - 109,112,111,114,116,10,32,32,32,32,115,121,115,116,101,109, - 32,119,105,108,108,32,99,111,110,115,105,100,101,114,32,109, - 111,100,117,108,101,115,32,108,111,97,100,101,100,32,102,114, - 111,109,32,116,104,101,32,115,112,101,99,32,97,115,32,112, - 97,99,107,97,103,101,115,46,10,10,32,32,32,32,79,110, - 108,121,32,102,105,110,100,101,114,115,32,40,115,101,101,32, - 105,109,112,111,114,116,108,105,98,46,97,98,99,46,77,101, - 116,97,80,97,116,104,70,105,110,100,101,114,32,97,110,100, - 10,32,32,32,32,105,109,112,111,114,116,108,105,98,46,97, - 98,99,46,80,97,116,104,69,110,116,114,121,70,105,110,100, - 101,114,41,32,115,104,111,117,108,100,32,109,111,100,105,102, - 121,32,77,111,100,117,108,101,83,112,101,99,32,105,110,115, - 116,97,110,99,101,115,46,10,10,32,32,32,32,78,41,3, - 218,6,111,114,105,103,105,110,218,12,108,111,97,100,101,114, - 95,115,116,97,116,101,218,10,105,115,95,112,97,99,107,97, - 103,101,99,3,0,0,0,0,0,0,0,3,0,0,0,6, - 0,0,0,2,0,0,0,67,0,0,0,115,54,0,0,0, - 124,1,124,0,95,0,124,2,124,0,95,1,124,3,124,0, - 95,2,124,4,124,0,95,3,124,5,114,32,103,0,110,2, - 100,0,124,0,95,4,100,1,124,0,95,5,100,0,124,0, - 95,6,100,0,83,0,41,2,78,70,41,7,114,20,0,0, - 0,114,116,0,0,0,114,120,0,0,0,114,121,0,0,0, - 218,26,115,117,98,109,111,100,117,108,101,95,115,101,97,114, - 99,104,95,108,111,99,97,116,105,111,110,115,218,13,95,115, - 101,116,95,102,105,108,101,97,116,116,114,218,7,95,99,97, - 99,104,101,100,41,6,114,33,0,0,0,114,20,0,0,0, - 114,116,0,0,0,114,120,0,0,0,114,121,0,0,0,114, - 122,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,34,0,0,0,111,1,0,0,115,16,0,0, - 0,6,2,6,1,6,1,6,1,14,1,6,3,10,1,255, - 128,122,19,77,111,100,117,108,101,83,112,101,99,46,95,95, - 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,6,0,0,0,67,0,0,0,115, - 102,0,0,0,100,1,160,0,124,0,106,1,161,1,100,2, - 160,0,124,0,106,2,161,1,103,2,125,1,124,0,106,3, - 100,0,117,1,114,52,124,1,160,4,100,3,160,0,124,0, - 106,3,161,1,161,1,1,0,124,0,106,5,100,0,117,1, - 114,80,124,1,160,4,100,4,160,0,124,0,106,5,161,1, - 161,1,1,0,100,5,160,0,124,0,106,6,106,7,100,6, - 160,8,124,1,161,1,161,2,83,0,41,7,78,122,9,110, - 97,109,101,61,123,33,114,125,122,11,108,111,97,100,101,114, - 61,123,33,114,125,122,11,111,114,105,103,105,110,61,123,33, - 114,125,122,29,115,117,98,109,111,100,117,108,101,95,115,101, - 97,114,99,104,95,108,111,99,97,116,105,111,110,115,61,123, - 125,122,6,123,125,40,123,125,41,122,2,44,32,41,9,114, - 49,0,0,0,114,20,0,0,0,114,116,0,0,0,114,120, - 0,0,0,218,6,97,112,112,101,110,100,114,123,0,0,0, - 218,9,95,95,99,108,97,115,115,95,95,114,9,0,0,0, - 218,4,106,111,105,110,41,2,114,33,0,0,0,114,59,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,52,0,0,0,123,1,0,0,115,22,0,0,0,10, - 1,10,1,4,255,10,2,18,1,10,1,8,1,4,1,6, - 255,22,2,255,128,122,19,77,111,100,117,108,101,83,112,101, - 99,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,67, - 0,0,0,115,102,0,0,0,124,0,106,0,125,2,122,72, - 124,0,106,1,124,1,106,1,107,2,111,76,124,0,106,2, - 124,1,106,2,107,2,111,76,124,0,106,3,124,1,106,3, - 107,2,111,76,124,2,124,1,106,0,107,2,111,76,124,0, - 106,4,124,1,106,4,107,2,111,76,124,0,106,5,124,1, - 106,5,107,2,87,0,83,0,4,0,116,6,121,100,1,0, - 1,0,1,0,116,7,6,0,89,0,83,0,48,0,114,0, - 0,0,0,41,8,114,123,0,0,0,114,20,0,0,0,114, - 116,0,0,0,114,120,0,0,0,218,6,99,97,99,104,101, - 100,218,12,104,97,115,95,108,111,99,97,116,105,111,110,114, - 2,0,0,0,218,14,78,111,116,73,109,112,108,101,109,101, - 110,116,101,100,41,3,114,33,0,0,0,90,5,111,116,104, - 101,114,90,4,115,109,115,108,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,6,95,95,101,113,95,95,133, - 1,0,0,115,32,0,0,0,6,1,2,1,12,1,10,1, - 2,255,10,2,2,254,8,3,2,253,10,4,2,252,10,5, - 4,251,12,6,10,1,255,128,122,17,77,111,100,117,108,101, - 83,112,101,99,46,95,95,101,113,95,95,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,58,0,0,0,124,0,106,0,100,0,117, - 0,114,52,124,0,106,1,100,0,117,1,114,52,124,0,106, - 2,114,52,116,3,100,0,117,0,114,38,116,4,130,1,116, - 3,160,5,124,0,106,1,161,1,124,0,95,0,124,0,106, - 0,83,0,114,0,0,0,0,41,6,114,125,0,0,0,114, - 120,0,0,0,114,124,0,0,0,218,19,95,98,111,111,116, - 115,116,114,97,112,95,101,120,116,101,114,110,97,108,218,19, - 78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,114, - 114,111,114,90,11,95,103,101,116,95,99,97,99,104,101,100, - 114,51,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,129,0,0,0,145,1,0,0,115,14,0, - 0,0,10,2,16,1,8,1,4,1,14,1,6,1,255,128, - 122,17,77,111,100,117,108,101,83,112,101,99,46,99,97,99, - 104,101,100,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,2,0,0,0,67,0,0,0,115,10,0,0, - 0,124,1,124,0,95,0,100,0,83,0,114,0,0,0,0, - 41,1,114,125,0,0,0,41,2,114,33,0,0,0,114,129, + 0,114,44,0,0,0,154,0,0,0,115,8,0,0,0,10, + 1,8,1,18,1,255,128,122,24,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,0,0,0,0,1,0, + 0,0,5,0,0,0,67,0,0,0,115,18,0,0,0,100, + 1,160,0,124,0,106,1,116,2,124,0,131,1,161,2,83, + 0,41,2,78,122,28,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,114,48,0,0,0,114,51,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,52,0,0,0, + 159,0,0,0,115,4,0,0,0,18,1,255,128,122,25,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,41,8,114,9,0,0,0, + 114,8,0,0,0,114,1,0,0,0,114,10,0,0,0,114, + 34,0,0,0,114,43,0,0,0,114,44,0,0,0,114,52, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,53,0,0,0,142,0,0,0, + 115,14,0,0,0,8,0,4,1,8,3,8,4,8,4,12, + 5,255,128,114,53,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, + 0,115,36,0,0,0,101,0,90,1,100,0,90,2,100,1, + 100,2,132,0,90,3,100,3,100,4,132,0,90,4,100,5, + 100,6,132,0,90,5,100,7,83,0,41,8,218,18,95,77, + 111,100,117,108,101,76,111,99,107,77,97,110,97,103,101,114, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,2,0,0,0,67,0,0,0,115,16,0,0,0,124,1, + 124,0,95,0,100,0,124,0,95,1,100,0,83,0,114,0, + 0,0,0,41,2,218,5,95,110,97,109,101,218,5,95,108, + 111,99,107,114,32,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,34,0,0,0,165,0,0,0, + 115,6,0,0,0,6,1,10,1,255,128,122,27,95,77,111, + 100,117,108,101,76,111,99,107,77,97,110,97,103,101,114,46, + 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,0, + 0,115,26,0,0,0,116,0,124,0,106,1,131,1,124,0, + 95,2,124,0,106,2,160,3,161,0,1,0,100,0,83,0, + 114,0,0,0,0,41,4,218,16,95,103,101,116,95,109,111, + 100,117,108,101,95,108,111,99,107,114,55,0,0,0,114,56, + 0,0,0,114,43,0,0,0,114,51,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,9,95,95, + 101,110,116,101,114,95,95,169,0,0,0,115,6,0,0,0, + 12,1,14,1,255,128,122,28,95,77,111,100,117,108,101,76, + 111,99,107,77,97,110,97,103,101,114,46,95,95,101,110,116, + 101,114,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,2,0,0,0,79,0,0,0,115,14,0, + 0,0,124,0,106,0,160,1,161,0,1,0,100,0,83,0, + 114,0,0,0,0,41,2,114,56,0,0,0,114,44,0,0, + 0,41,3,114,33,0,0,0,218,4,97,114,103,115,90,6, + 107,119,97,114,103,115,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,8,95,95,101,120,105,116,95,95,173, + 0,0,0,115,4,0,0,0,14,1,255,128,122,27,95,77, + 111,100,117,108,101,76,111,99,107,77,97,110,97,103,101,114, + 46,95,95,101,120,105,116,95,95,78,41,6,114,9,0,0, + 0,114,8,0,0,0,114,1,0,0,0,114,34,0,0,0, + 114,58,0,0,0,114,60,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,54, + 0,0,0,163,0,0,0,115,10,0,0,0,8,0,8,2, + 8,4,12,4,255,128,114,54,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0, + 67,0,0,0,115,134,0,0,0,116,0,160,1,161,0,1, + 0,122,114,122,14,116,2,124,0,25,0,131,0,125,1,87, + 0,110,22,4,0,116,3,121,46,1,0,1,0,1,0,100, + 1,125,1,89,0,110,2,48,0,124,1,100,1,117,0,114, + 110,116,4,100,1,117,0,114,74,116,5,124,0,131,1,125, + 1,110,8,116,6,124,0,131,1,125,1,124,0,102,1,100, + 2,100,3,132,1,125,2,116,7,160,8,124,1,124,2,161, + 2,116,2,124,0,60,0,87,0,116,0,160,9,161,0,1, + 0,124,1,83,0,116,0,160,9,161,0,1,0,48,0,41, + 4,122,139,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,65, + 99,113,117,105,114,101,47,114,101,108,101,97,115,101,32,105, + 110,116,101,114,110,97,108,108,121,32,116,104,101,32,103,108, + 111,98,97,108,32,105,109,112,111,114,116,32,108,111,99,107, + 32,116,111,32,112,114,111,116,101,99,116,10,32,32,32,32, + 95,109,111,100,117,108,101,95,108,111,99,107,115,46,78,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 8,0,0,0,83,0,0,0,115,54,0,0,0,116,0,160, + 1,161,0,1,0,122,34,116,2,160,3,124,1,161,1,124, + 0,117,0,114,30,116,2,124,1,61,0,87,0,116,0,160, + 4,161,0,1,0,100,0,83,0,116,0,160,4,161,0,1, + 0,48,0,114,0,0,0,0,41,5,218,4,95,105,109,112, + 218,12,97,99,113,117,105,114,101,95,108,111,99,107,218,13, + 95,109,111,100,117,108,101,95,108,111,99,107,115,114,38,0, + 0,0,218,12,114,101,108,101,97,115,101,95,108,111,99,107, + 41,2,218,3,114,101,102,114,20,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,2,99,98,198, + 0,0,0,115,14,0,0,0,8,1,2,1,14,4,6,1, + 2,128,22,2,255,128,122,28,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,41,10,114,61,0,0,0,114,62,0,0,0, + 114,63,0,0,0,218,8,75,101,121,69,114,114,111,114,114, + 26,0,0,0,114,53,0,0,0,114,23,0,0,0,218,8, + 95,119,101,97,107,114,101,102,114,65,0,0,0,114,64,0, + 0,0,41,3,114,20,0,0,0,114,27,0,0,0,114,66, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,129,0,0,0,154,1,0,0,115,4,0,0,0, - 10,2,255,128,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,32,0, - 0,0,124,0,106,0,100,1,117,0,114,26,124,0,106,1, - 160,2,100,2,161,1,100,3,25,0,83,0,124,0,106,1, - 83,0,41,4,122,32,84,104,101,32,110,97,109,101,32,111, - 102,32,116,104,101,32,109,111,100,117,108,101,39,115,32,112, - 97,114,101,110,116,46,78,218,1,46,114,25,0,0,0,41, - 3,114,123,0,0,0,114,20,0,0,0,218,10,114,112,97, - 114,116,105,116,105,111,110,114,51,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,6,112,97,114, - 101,110,116,158,1,0,0,115,8,0,0,0,10,3,16,1, - 6,2,255,128,122,17,77,111,100,117,108,101,83,112,101,99, - 46,112,97,114,101,110,116,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,0,67,0,0,0, - 115,6,0,0,0,124,0,106,0,83,0,114,0,0,0,0, - 41,1,114,124,0,0,0,114,51,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,130,0,0,0, - 166,1,0,0,115,4,0,0,0,6,2,255,128,122,23,77, - 111,100,117,108,101,83,112,101,99,46,104,97,115,95,108,111, - 99,97,116,105,111,110,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, - 14,0,0,0,116,0,124,1,131,1,124,0,95,1,100,0, - 83,0,114,0,0,0,0,41,2,218,4,98,111,111,108,114, - 124,0,0,0,41,2,114,33,0,0,0,218,5,118,97,108, - 117,101,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,130,0,0,0,170,1,0,0,115,4,0,0,0,14, - 2,255,128,41,12,114,9,0,0,0,114,8,0,0,0,114, - 1,0,0,0,114,10,0,0,0,114,34,0,0,0,114,52, - 0,0,0,114,132,0,0,0,218,8,112,114,111,112,101,114, - 116,121,114,129,0,0,0,218,6,115,101,116,116,101,114,114, - 137,0,0,0,114,130,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,119,0, - 0,0,74,1,0,0,115,36,0,0,0,8,0,4,1,4, - 36,2,1,12,255,8,12,8,10,2,12,10,1,4,8,10, - 1,2,3,10,1,2,7,10,1,4,3,14,1,255,128,114, - 119,0,0,0,169,2,114,120,0,0,0,114,122,0,0,0, - 99,2,0,0,0,0,0,0,0,2,0,0,0,6,0,0, - 0,8,0,0,0,67,0,0,0,115,150,0,0,0,116,0, - 124,1,100,1,131,2,114,74,116,1,100,2,117,0,114,22, - 116,2,130,1,116,1,106,3,125,4,124,3,100,2,117,0, - 114,48,124,4,124,0,124,1,100,3,141,2,83,0,124,3, - 114,56,103,0,110,2,100,2,125,5,124,4,124,0,124,1, - 124,5,100,4,141,3,83,0,124,3,100,2,117,0,114,134, - 116,0,124,1,100,5,131,2,114,130,122,14,124,1,160,4, - 124,0,161,1,125,3,87,0,110,26,4,0,116,5,121,128, - 1,0,1,0,1,0,100,2,125,3,89,0,110,6,48,0, - 100,6,125,3,116,6,124,0,124,1,124,2,124,3,100,7, - 141,4,83,0,41,8,122,53,82,101,116,117,114,110,32,97, - 32,109,111,100,117,108,101,32,115,112,101,99,32,98,97,115, - 101,100,32,111,110,32,118,97,114,105,111,117,115,32,108,111, - 97,100,101,114,32,109,101,116,104,111,100,115,46,90,12,103, - 101,116,95,102,105,108,101,110,97,109,101,78,41,1,114,116, - 0,0,0,41,2,114,116,0,0,0,114,123,0,0,0,114, - 122,0,0,0,70,114,142,0,0,0,41,7,114,11,0,0, - 0,114,133,0,0,0,114,134,0,0,0,218,23,115,112,101, - 99,95,102,114,111,109,95,102,105,108,101,95,108,111,99,97, - 116,105,111,110,114,122,0,0,0,114,83,0,0,0,114,119, - 0,0,0,41,6,114,20,0,0,0,114,116,0,0,0,114, - 120,0,0,0,114,122,0,0,0,114,143,0,0,0,90,6, - 115,101,97,114,99,104,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,98,0,0,0,175,1,0,0,115,38, - 0,0,0,10,2,8,1,4,1,6,1,8,2,12,1,12, - 1,6,1,2,1,6,255,8,3,10,1,2,1,14,1,12, - 1,10,1,4,3,16,2,255,128,114,98,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8, - 0,0,0,67,0,0,0,115,40,1,0,0,122,10,124,0, - 106,0,125,3,87,0,110,18,4,0,116,1,121,28,1,0, - 1,0,1,0,89,0,110,14,48,0,124,3,100,0,117,1, - 114,42,124,3,83,0,124,0,106,2,125,4,124,1,100,0, - 117,0,114,86,122,10,124,0,106,3,125,1,87,0,110,18, - 4,0,116,1,121,84,1,0,1,0,1,0,89,0,110,2, - 48,0,122,10,124,0,106,4,125,5,87,0,110,22,4,0, - 116,1,121,118,1,0,1,0,1,0,100,0,125,5,89,0, - 110,2,48,0,124,2,100,0,117,0,114,174,124,5,100,0, - 117,0,114,170,122,10,124,1,106,5,125,2,87,0,110,26, - 4,0,116,1,121,168,1,0,1,0,1,0,100,0,125,2, - 89,0,110,6,48,0,124,5,125,2,122,10,124,0,106,6, - 125,6,87,0,110,22,4,0,116,1,121,206,1,0,1,0, - 1,0,100,0,125,6,89,0,110,2,48,0,122,14,116,7, - 124,0,106,8,131,1,125,7,87,0,110,22,4,0,116,1, - 121,244,1,0,1,0,1,0,100,0,125,7,89,0,110,2, - 48,0,116,9,124,4,124,1,124,2,100,1,141,3,125,3, - 124,5,100,0,117,0,144,1,114,18,100,2,110,2,100,3, - 124,3,95,10,124,6,124,3,95,11,124,7,124,3,95,12, - 124,3,83,0,41,4,78,169,1,114,120,0,0,0,70,84, - 41,13,114,113,0,0,0,114,2,0,0,0,114,9,0,0, - 0,114,106,0,0,0,114,115,0,0,0,218,7,95,79,82, - 73,71,73,78,218,10,95,95,99,97,99,104,101,100,95,95, - 218,4,108,105,115,116,218,8,95,95,112,97,116,104,95,95, - 114,119,0,0,0,114,124,0,0,0,114,129,0,0,0,114, - 123,0,0,0,41,8,114,104,0,0,0,114,116,0,0,0, - 114,120,0,0,0,114,103,0,0,0,114,20,0,0,0,90, - 8,108,111,99,97,116,105,111,110,114,129,0,0,0,114,123, + 0,0,114,57,0,0,0,179,0,0,0,115,34,0,0,0, + 8,6,2,1,2,1,14,1,12,1,10,1,8,2,8,1, + 10,1,8,2,12,2,16,11,2,128,8,2,4,2,10,254, + 255,128,114,57,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,8,0,0,0,67,0,0,0, + 115,54,0,0,0,116,0,124,0,131,1,125,1,122,12,124, + 1,160,1,161,0,1,0,87,0,110,20,4,0,116,2,121, + 40,1,0,1,0,1,0,89,0,100,1,83,0,48,0,124, + 1,160,3,161,0,1,0,100,1,83,0,41,2,122,189,65, + 99,113,117,105,114,101,115,32,116,104,101,110,32,114,101,108, + 101,97,115,101,115,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,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,32,32,32,32,78,41,4,114, + 57,0,0,0,114,43,0,0,0,114,22,0,0,0,114,44, + 0,0,0,41,2,114,20,0,0,0,114,27,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,19, + 95,108,111,99,107,95,117,110,108,111,99,107,95,109,111,100, + 117,108,101,216,0,0,0,115,14,0,0,0,8,6,2,1, + 12,1,12,1,8,3,12,2,255,128,114,69,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 4,0,0,0,79,0,0,0,115,14,0,0,0,124,0,124, + 1,105,0,124,2,164,1,142,1,83,0,41,2,97,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, + 78,114,5,0,0,0,41,3,218,1,102,114,59,0,0,0, + 90,4,107,119,100,115,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,25,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, + 233,0,0,0,115,4,0,0,0,14,8,255,128,114,71,0, + 0,0,114,42,0,0,0,41,1,218,9,118,101,114,98,111, + 115,105,116,121,99,1,0,0,0,0,0,0,0,1,0,0, + 0,3,0,0,0,4,0,0,0,71,0,0,0,115,58,0, + 0,0,116,0,106,1,106,2,124,1,107,5,114,54,124,0, + 160,3,100,1,161,1,115,30,100,2,124,0,23,0,125,0, + 116,4,124,0,106,5,124,2,142,0,116,0,106,6,100,3, + 141,2,1,0,100,4,83,0,100,4,83,0,41,5,122,61, + 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,41,2,250, + 1,35,122,7,105,109,112,111,114,116,32,122,2,35,32,41, + 1,90,4,102,105,108,101,78,41,7,114,18,0,0,0,218, + 5,102,108,97,103,115,218,7,118,101,114,98,111,115,101,218, + 10,115,116,97,114,116,115,119,105,116,104,218,5,112,114,105, + 110,116,114,49,0,0,0,218,6,115,116,100,101,114,114,41, + 3,218,7,109,101,115,115,97,103,101,114,72,0,0,0,114, + 59,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, + 115,115,97,103,101,244,0,0,0,115,12,0,0,0,12,2, + 10,1,8,1,24,1,4,253,255,128,114,80,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,3,0,0,0,115,26,0,0,0,135,0,102, + 1,100,1,100,2,132,8,125,1,116,0,124,1,136,0,131, + 2,1,0,124,1,83,0,41,4,122,49,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,0,0,0,0,2,0,0,0,4,0,0, + 0,19,0,0,0,115,38,0,0,0,124,1,116,0,106,1, + 118,1,114,28,116,2,100,1,160,3,124,1,161,1,124,1, + 100,2,141,2,130,1,136,0,124,0,124,1,131,2,83,0, + 41,3,78,250,29,123,33,114,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,114,19,0,0,0,41,4,114,18,0,0,0,218,20, + 98,117,105,108,116,105,110,95,109,111,100,117,108,101,95,110, + 97,109,101,115,218,11,73,109,112,111,114,116,69,114,114,111, + 114,114,49,0,0,0,169,2,114,33,0,0,0,218,8,102, + 117,108,108,110,97,109,101,169,1,218,3,102,120,110,114,5, + 0,0,0,114,6,0,0,0,218,25,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,254,0,0,0,115,12,0,0,0,10,1,10,1, + 2,1,6,255,10,2,255,128,122,52,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,78,169, + 1,114,17,0,0,0,41,2,114,87,0,0,0,114,88,0, + 0,0,114,5,0,0,0,114,86,0,0,0,114,6,0,0, + 0,218,17,95,114,101,113,117,105,114,101,115,95,98,117,105, + 108,116,105,110,252,0,0,0,115,8,0,0,0,12,2,10, + 5,4,1,255,128,114,90,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,3, + 0,0,0,115,26,0,0,0,135,0,102,1,100,1,100,2, + 132,8,125,1,116,0,124,1,136,0,131,2,1,0,124,1, + 83,0,41,4,122,47,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,0,0, + 0,0,2,0,0,0,4,0,0,0,19,0,0,0,115,38, + 0,0,0,116,0,160,1,124,1,161,1,115,28,116,2,100, + 1,160,3,124,1,161,1,124,1,100,2,141,2,130,1,136, + 0,124,0,124,1,131,2,83,0,169,3,78,122,27,123,33, + 114,125,32,105,115,32,110,111,116,32,97,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,114,19,0,0,0,41,4, + 114,61,0,0,0,218,9,105,115,95,102,114,111,122,101,110, + 114,83,0,0,0,114,49,0,0,0,114,84,0,0,0,114, + 86,0,0,0,114,5,0,0,0,114,6,0,0,0,218,24, + 95,114,101,113,117,105,114,101,115,95,102,114,111,122,101,110, + 95,119,114,97,112,112,101,114,9,1,0,0,115,12,0,0, + 0,10,1,10,1,2,1,6,255,10,2,255,128,122,50,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,78,114,89,0,0,0,41,2,114,87,0,0,0,114,93, + 0,0,0,114,5,0,0,0,114,86,0,0,0,114,6,0, + 0,0,218,16,95,114,101,113,117,105,114,101,115,95,102,114, + 111,122,101,110,7,1,0,0,115,8,0,0,0,12,2,10, + 5,4,1,255,128,114,94,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,67, + 0,0,0,115,74,0,0,0,100,1,125,2,116,0,160,1, + 124,2,116,2,161,2,1,0,116,3,124,1,124,0,131,2, + 125,3,124,1,116,4,106,5,118,0,114,66,116,4,106,5, + 124,1,25,0,125,4,116,6,124,3,124,4,131,2,1,0, + 116,4,106,5,124,1,25,0,83,0,116,7,124,3,131,1, + 83,0,41,3,122,128,76,111,97,100,32,116,104,101,32,115, + 112,101,99,105,102,105,101,100,32,109,111,100,117,108,101,32, + 105,110,116,111,32,115,121,115,46,109,111,100,117,108,101,115, + 32,97,110,100,32,114,101,116,117,114,110,32,105,116,46,10, + 10,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,108,111,97,100,101,114,46,101,120,101,99, + 95,109,111,100,117,108,101,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,122,103,116,104,101,32,108,111,97,100, + 95,109,111,100,117,108,101,40,41,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97, + 110,100,32,115,108,97,116,101,100,32,102,111,114,32,114,101, + 109,111,118,97,108,32,105,110,32,80,121,116,104,111,110,32, + 51,46,49,50,59,32,117,115,101,32,101,120,101,99,95,109, + 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,78, + 41,8,218,9,95,119,97,114,110,105,110,103,115,218,4,119, + 97,114,110,218,18,68,101,112,114,101,99,97,116,105,111,110, + 87,97,114,110,105,110,103,218,16,115,112,101,99,95,102,114, + 111,109,95,108,111,97,100,101,114,114,18,0,0,0,218,7, + 109,111,100,117,108,101,115,218,5,95,101,120,101,99,218,5, + 95,108,111,97,100,41,5,114,33,0,0,0,114,85,0,0, + 0,218,3,109,115,103,218,4,115,112,101,99,218,6,109,111, + 100,117,108,101,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,17,95,108,111,97,100,95,109,111,100,117,108, + 101,95,115,104,105,109,19,1,0,0,115,18,0,0,0,4, + 6,12,2,10,1,10,1,10,1,10,1,10,1,8,2,255, + 128,114,105,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,8,0,0,0,67,0,0,0,115, + 210,0,0,0,116,0,124,0,100,1,100,0,131,3,125,1, + 116,1,124,1,100,2,131,2,114,54,122,12,124,1,160,2, + 124,0,161,1,87,0,83,0,4,0,116,3,121,52,1,0, + 1,0,1,0,89,0,110,2,48,0,122,10,124,0,106,4, + 125,2,87,0,110,18,4,0,116,5,121,82,1,0,1,0, + 1,0,89,0,110,18,48,0,124,2,100,0,117,1,114,100, + 116,6,124,2,131,1,83,0,122,10,124,0,106,7,125,3, + 87,0,110,22,4,0,116,5,121,132,1,0,1,0,1,0, + 100,3,125,3,89,0,110,2,48,0,122,10,124,0,106,8, + 125,4,87,0,110,52,4,0,116,5,121,196,1,0,1,0, + 1,0,124,1,100,0,117,0,114,180,100,4,160,9,124,3, + 161,1,6,0,89,0,83,0,100,5,160,9,124,3,124,1, + 161,2,6,0,89,0,83,0,48,0,100,6,160,9,124,3, + 124,4,161,2,83,0,41,7,78,218,10,95,95,108,111,97, + 100,101,114,95,95,218,11,109,111,100,117,108,101,95,114,101, + 112,114,250,1,63,250,13,60,109,111,100,117,108,101,32,123, + 33,114,125,62,250,20,60,109,111,100,117,108,101,32,123,33, + 114,125,32,40,123,33,114,125,41,62,250,23,60,109,111,100, + 117,108,101,32,123,33,114,125,32,102,114,111,109,32,123,33, + 114,125,62,41,10,114,13,0,0,0,114,11,0,0,0,114, + 107,0,0,0,218,9,69,120,99,101,112,116,105,111,110,218, + 8,95,95,115,112,101,99,95,95,114,2,0,0,0,218,22, + 95,109,111,100,117,108,101,95,114,101,112,114,95,102,114,111, + 109,95,115,112,101,99,114,9,0,0,0,218,8,95,95,102, + 105,108,101,95,95,114,49,0,0,0,41,5,114,104,0,0, + 0,218,6,108,111,97,100,101,114,114,103,0,0,0,114,20, + 0,0,0,218,8,102,105,108,101,110,97,109,101,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,12,95,109, + 111,100,117,108,101,95,114,101,112,114,38,1,0,0,115,48, + 0,0,0,12,2,10,1,2,4,12,1,12,1,6,1,2, + 1,10,1,12,1,6,1,8,2,8,1,2,4,10,1,12, + 1,10,1,2,1,10,1,12,1,8,1,14,1,18,2,12, + 2,255,128,114,118,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, + 0,115,114,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,2,100,2,100,3,156,3,100,4,100,5, + 132,2,90,4,100,6,100,7,132,0,90,5,100,8,100,9, + 132,0,90,6,101,7,100,10,100,11,132,0,131,1,90,8, + 101,8,106,9,100,12,100,11,132,0,131,1,90,8,101,7, + 100,13,100,14,132,0,131,1,90,10,101,7,100,15,100,16, + 132,0,131,1,90,11,101,11,106,9,100,17,100,16,132,0, + 131,1,90,11,100,2,83,0,41,18,218,10,77,111,100,117, + 108,101,83,112,101,99,97,208,5,0,0,84,104,101,32,115, + 112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114, + 32,97,32,109,111,100,117,108,101,44,32,117,115,101,100,32, + 102,111,114,32,108,111,97,100,105,110,103,46,10,10,32,32, + 32,32,65,32,109,111,100,117,108,101,39,115,32,115,112,101, + 99,32,105,115,32,116,104,101,32,115,111,117,114,99,101,32, + 102,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32, + 97,98,111,117,116,32,116,104,101,32,109,111,100,117,108,101, + 46,32,32,70,111,114,10,32,32,32,32,100,97,116,97,32, + 97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32, + 116,104,101,32,109,111,100,117,108,101,44,32,105,110,99,108, + 117,100,105,110,103,32,115,111,117,114,99,101,44,32,117,115, + 101,32,116,104,101,32,115,112,101,99,39,115,10,32,32,32, + 32,108,111,97,100,101,114,46,10,10,32,32,32,32,96,110, + 97,109,101,96,32,105,115,32,116,104,101,32,97,98,115,111, + 108,117,116,101,32,110,97,109,101,32,111,102,32,116,104,101, + 32,109,111,100,117,108,101,46,32,32,96,108,111,97,100,101, + 114,96,32,105,115,32,116,104,101,32,108,111,97,100,101,114, + 10,32,32,32,32,116,111,32,117,115,101,32,119,104,101,110, + 32,108,111,97,100,105,110,103,32,116,104,101,32,109,111,100, + 117,108,101,46,32,32,96,112,97,114,101,110,116,96,32,105, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,10,32,32,32,32,112,97,99,107,97,103,101,32,116,104, + 101,32,109,111,100,117,108,101,32,105,115,32,105,110,46,32, + 32,84,104,101,32,112,97,114,101,110,116,32,105,115,32,100, + 101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32, + 110,97,109,101,46,10,10,32,32,32,32,96,105,115,95,112, + 97,99,107,97,103,101,96,32,100,101,116,101,114,109,105,110, + 101,115,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, + 32,112,97,99,107,97,103,101,32,111,114,10,32,32,32,32, + 110,111,116,46,32,32,79,110,32,109,111,100,117,108,101,115, + 32,116,104,105,115,32,105,115,32,114,101,102,108,101,99,116, + 101,100,32,98,121,32,116,104,101,32,96,95,95,112,97,116, + 104,95,95,96,32,97,116,116,114,105,98,117,116,101,46,10, + 10,32,32,32,32,96,111,114,105,103,105,110,96,32,105,115, + 32,116,104,101,32,115,112,101,99,105,102,105,99,32,108,111, + 99,97,116,105,111,110,32,117,115,101,100,32,98,121,32,116, + 104,101,32,108,111,97,100,101,114,32,102,114,111,109,32,119, + 104,105,99,104,32,116,111,10,32,32,32,32,108,111,97,100, + 32,116,104,101,32,109,111,100,117,108,101,44,32,105,102,32, + 116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110, + 32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,32, + 87,104,101,110,32,102,105,108,101,110,97,109,101,32,105,115, + 10,32,32,32,32,115,101,116,44,32,111,114,105,103,105,110, + 32,119,105,108,108,32,109,97,116,99,104,46,10,10,32,32, + 32,32,96,104,97,115,95,108,111,99,97,116,105,111,110,96, + 32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32, + 97,32,115,112,101,99,39,115,32,34,111,114,105,103,105,110, + 34,32,114,101,102,108,101,99,116,115,32,97,32,108,111,99, + 97,116,105,111,110,46,10,32,32,32,32,87,104,101,110,32, + 116,104,105,115,32,105,115,32,84,114,117,101,44,32,96,95, + 95,102,105,108,101,95,95,96,32,97,116,116,114,105,98,117, + 116,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,115,101,116,46,10,10,32,32,32,32,96,99, + 97,99,104,101,100,96,32,105,115,32,116,104,101,32,108,111, + 99,97,116,105,111,110,32,111,102,32,116,104,101,32,99,97, + 99,104,101,100,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,44,32,105,102,32,97,110,121,46,32,32,73,116,10, + 32,32,32,32,99,111,114,114,101,115,112,111,110,100,115,32, + 116,111,32,116,104,101,32,96,95,95,99,97,99,104,101,100, + 95,95,96,32,97,116,116,114,105,98,117,116,101,46,10,10, + 32,32,32,32,96,115,117,98,109,111,100,117,108,101,95,115, + 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,96, + 32,105,115,32,116,104,101,32,115,101,113,117,101,110,99,101, + 32,111,102,32,112,97,116,104,32,101,110,116,114,105,101,115, + 32,116,111,10,32,32,32,32,115,101,97,114,99,104,32,119, + 104,101,110,32,105,109,112,111,114,116,105,110,103,32,115,117, + 98,109,111,100,117,108,101,115,46,32,32,73,102,32,115,101, + 116,44,32,105,115,95,112,97,99,107,97,103,101,32,115,104, + 111,117,108,100,32,98,101,10,32,32,32,32,84,114,117,101, + 45,45,97,110,100,32,70,97,108,115,101,32,111,116,104,101, + 114,119,105,115,101,46,10,10,32,32,32,32,80,97,99,107, + 97,103,101,115,32,97,114,101,32,115,105,109,112,108,121,32, + 109,111,100,117,108,101,115,32,116,104,97,116,32,40,109,97, + 121,41,32,104,97,118,101,32,115,117,98,109,111,100,117,108, + 101,115,46,32,32,73,102,32,97,32,115,112,101,99,10,32, + 32,32,32,104,97,115,32,97,32,110,111,110,45,78,111,110, + 101,32,118,97,108,117,101,32,105,110,32,96,115,117,98,109, + 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, + 97,116,105,111,110,115,96,44,32,116,104,101,32,105,109,112, + 111,114,116,10,32,32,32,32,115,121,115,116,101,109,32,119, + 105,108,108,32,99,111,110,115,105,100,101,114,32,109,111,100, + 117,108,101,115,32,108,111,97,100,101,100,32,102,114,111,109, + 32,116,104,101,32,115,112,101,99,32,97,115,32,112,97,99, + 107,97,103,101,115,46,10,10,32,32,32,32,79,110,108,121, + 32,102,105,110,100,101,114,115,32,40,115,101,101,32,105,109, + 112,111,114,116,108,105,98,46,97,98,99,46,77,101,116,97, + 80,97,116,104,70,105,110,100,101,114,32,97,110,100,10,32, + 32,32,32,105,109,112,111,114,116,108,105,98,46,97,98,99, + 46,80,97,116,104,69,110,116,114,121,70,105,110,100,101,114, + 41,32,115,104,111,117,108,100,32,109,111,100,105,102,121,32, + 77,111,100,117,108,101,83,112,101,99,32,105,110,115,116,97, + 110,99,101,115,46,10,10,32,32,32,32,78,41,3,218,6, + 111,114,105,103,105,110,218,12,108,111,97,100,101,114,95,115, + 116,97,116,101,218,10,105,115,95,112,97,99,107,97,103,101, + 99,3,0,0,0,0,0,0,0,3,0,0,0,6,0,0, + 0,2,0,0,0,67,0,0,0,115,54,0,0,0,124,1, + 124,0,95,0,124,2,124,0,95,1,124,3,124,0,95,2, + 124,4,124,0,95,3,124,5,114,32,103,0,110,2,100,0, + 124,0,95,4,100,1,124,0,95,5,100,0,124,0,95,6, + 100,0,83,0,41,2,78,70,41,7,114,20,0,0,0,114, + 116,0,0,0,114,120,0,0,0,114,121,0,0,0,218,26, + 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, + 95,108,111,99,97,116,105,111,110,115,218,13,95,115,101,116, + 95,102,105,108,101,97,116,116,114,218,7,95,99,97,99,104, + 101,100,41,6,114,33,0,0,0,114,20,0,0,0,114,116, + 0,0,0,114,120,0,0,0,114,121,0,0,0,114,122,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,34,0,0,0,111,1,0,0,115,16,0,0,0,6, + 2,6,1,6,1,6,1,14,1,6,3,10,1,255,128,122, + 19,77,111,100,117,108,101,83,112,101,99,46,95,95,105,110, + 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,6,0,0,0,67,0,0,0,115,102,0, + 0,0,100,1,160,0,124,0,106,1,161,1,100,2,160,0, + 124,0,106,2,161,1,103,2,125,1,124,0,106,3,100,0, + 117,1,114,52,124,1,160,4,100,3,160,0,124,0,106,3, + 161,1,161,1,1,0,124,0,106,5,100,0,117,1,114,80, + 124,1,160,4,100,4,160,0,124,0,106,5,161,1,161,1, + 1,0,100,5,160,0,124,0,106,6,106,7,100,6,160,8, + 124,1,161,1,161,2,83,0,41,7,78,122,9,110,97,109, + 101,61,123,33,114,125,122,11,108,111,97,100,101,114,61,123, + 33,114,125,122,11,111,114,105,103,105,110,61,123,33,114,125, + 122,29,115,117,98,109,111,100,117,108,101,95,115,101,97,114, + 99,104,95,108,111,99,97,116,105,111,110,115,61,123,125,122, + 6,123,125,40,123,125,41,122,2,44,32,41,9,114,49,0, + 0,0,114,20,0,0,0,114,116,0,0,0,114,120,0,0, + 0,218,6,97,112,112,101,110,100,114,123,0,0,0,218,9, + 95,95,99,108,97,115,115,95,95,114,9,0,0,0,218,4, + 106,111,105,110,41,2,114,33,0,0,0,114,59,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 52,0,0,0,123,1,0,0,115,22,0,0,0,10,1,10, + 1,4,255,10,2,18,1,10,1,8,1,4,1,6,255,22, + 2,255,128,122,19,77,111,100,117,108,101,83,112,101,99,46, + 95,95,114,101,112,114,95,95,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, + 0,115,102,0,0,0,124,0,106,0,125,2,122,72,124,0, + 106,1,124,1,106,1,107,2,111,76,124,0,106,2,124,1, + 106,2,107,2,111,76,124,0,106,3,124,1,106,3,107,2, + 111,76,124,2,124,1,106,0,107,2,111,76,124,0,106,4, + 124,1,106,4,107,2,111,76,124,0,106,5,124,1,106,5, + 107,2,87,0,83,0,4,0,116,6,121,100,1,0,1,0, + 1,0,116,7,6,0,89,0,83,0,48,0,114,0,0,0, + 0,41,8,114,123,0,0,0,114,20,0,0,0,114,116,0, + 0,0,114,120,0,0,0,218,6,99,97,99,104,101,100,218, + 12,104,97,115,95,108,111,99,97,116,105,111,110,114,2,0, + 0,0,218,14,78,111,116,73,109,112,108,101,109,101,110,116, + 101,100,41,3,114,33,0,0,0,90,5,111,116,104,101,114, + 90,4,115,109,115,108,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,6,95,95,101,113,95,95,133,1,0, + 0,115,32,0,0,0,6,1,2,1,12,1,10,1,2,255, + 10,2,2,254,8,3,2,253,10,4,2,252,10,5,4,251, + 12,6,10,1,255,128,122,17,77,111,100,117,108,101,83,112, + 101,99,46,95,95,101,113,95,95,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,58,0,0,0,124,0,106,0,100,0,117,0,114, + 52,124,0,106,1,100,0,117,1,114,52,124,0,106,2,114, + 52,116,3,100,0,117,0,114,38,116,4,130,1,116,3,160, + 5,124,0,106,1,161,1,124,0,95,0,124,0,106,0,83, + 0,114,0,0,0,0,41,6,114,125,0,0,0,114,120,0, + 0,0,114,124,0,0,0,218,19,95,98,111,111,116,115,116, + 114,97,112,95,101,120,116,101,114,110,97,108,218,19,78,111, + 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, + 114,90,11,95,103,101,116,95,99,97,99,104,101,100,114,51, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,17,95,115,112,101,99,95,102,114,111,109,95,109, - 111,100,117,108,101,201,1,0,0,115,74,0,0,0,2,2, - 10,1,12,1,6,1,8,2,4,1,6,2,8,1,2,1, - 10,1,12,1,6,2,2,1,10,1,12,1,10,1,8,1, - 8,1,2,1,10,1,12,1,10,1,4,2,2,1,10,1, - 12,1,10,1,2,1,14,1,12,1,10,1,14,2,20,1, - 6,1,6,1,4,1,255,128,114,149,0,0,0,70,169,1, - 218,8,111,118,101,114,114,105,100,101,99,2,0,0,0,0, - 0,0,0,1,0,0,0,5,0,0,0,8,0,0,0,67, - 0,0,0,115,214,1,0,0,124,2,115,20,116,0,124,1, - 100,1,100,0,131,3,100,0,117,0,114,52,122,12,124,0, - 106,1,124,1,95,2,87,0,110,18,4,0,116,3,121,50, - 1,0,1,0,1,0,89,0,110,2,48,0,124,2,115,72, - 116,0,124,1,100,2,100,0,131,3,100,0,117,0,114,174, - 124,0,106,4,125,3,124,3,100,0,117,0,114,144,124,0, - 106,5,100,0,117,1,114,144,116,6,100,0,117,0,114,108, - 116,7,130,1,116,6,106,8,125,4,124,4,160,9,124,4, - 161,1,125,3,124,0,106,5,124,3,95,10,124,3,124,0, - 95,4,100,0,124,1,95,11,122,10,124,3,124,1,95,12, - 87,0,110,18,4,0,116,3,121,172,1,0,1,0,1,0, - 89,0,110,2,48,0,124,2,115,194,116,0,124,1,100,3, - 100,0,131,3,100,0,117,0,114,226,122,12,124,0,106,13, - 124,1,95,14,87,0,110,18,4,0,116,3,121,224,1,0, - 1,0,1,0,89,0,110,2,48,0,122,10,124,0,124,1, - 95,15,87,0,110,18,4,0,116,3,121,254,1,0,1,0, - 1,0,89,0,110,2,48,0,124,2,144,1,115,24,116,0, - 124,1,100,4,100,0,131,3,100,0,117,0,144,1,114,70, - 124,0,106,5,100,0,117,1,144,1,114,70,122,12,124,0, - 106,5,124,1,95,16,87,0,110,20,4,0,116,3,144,1, - 121,68,1,0,1,0,1,0,89,0,110,2,48,0,124,0, - 106,17,144,1,114,210,124,2,144,1,115,102,116,0,124,1, - 100,5,100,0,131,3,100,0,117,0,144,1,114,136,122,12, - 124,0,106,18,124,1,95,11,87,0,110,20,4,0,116,3, - 144,1,121,134,1,0,1,0,1,0,89,0,110,2,48,0, - 124,2,144,1,115,160,116,0,124,1,100,6,100,0,131,3, - 100,0,117,0,144,1,114,210,124,0,106,19,100,0,117,1, - 144,1,114,210,122,14,124,0,106,19,124,1,95,20,87,0, - 124,1,83,0,4,0,116,3,144,1,121,208,1,0,1,0, - 1,0,89,0,124,1,83,0,48,0,124,1,83,0,41,7, - 78,114,9,0,0,0,114,106,0,0,0,218,11,95,95,112, - 97,99,107,97,103,101,95,95,114,148,0,0,0,114,115,0, - 0,0,114,146,0,0,0,41,21,114,13,0,0,0,114,20, - 0,0,0,114,9,0,0,0,114,2,0,0,0,114,116,0, - 0,0,114,123,0,0,0,114,133,0,0,0,114,134,0,0, - 0,218,16,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,218,7,95,95,110,101,119,95,95,90,5,95,112, - 97,116,104,114,115,0,0,0,114,106,0,0,0,114,137,0, - 0,0,114,152,0,0,0,114,113,0,0,0,114,148,0,0, - 0,114,130,0,0,0,114,120,0,0,0,114,129,0,0,0, - 114,146,0,0,0,41,5,114,103,0,0,0,114,104,0,0, - 0,114,151,0,0,0,114,116,0,0,0,114,153,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 18,95,105,110,105,116,95,109,111,100,117,108,101,95,97,116, - 116,114,115,246,1,0,0,115,104,0,0,0,20,4,2,1, - 12,1,12,1,6,1,20,2,6,1,8,1,10,2,8,1, - 4,1,6,1,10,2,8,1,6,1,6,11,2,1,10,1, - 12,1,6,1,20,2,2,1,12,1,12,1,6,1,2,2, - 10,1,12,1,6,1,24,2,12,1,2,1,12,1,14,1, - 6,1,8,2,24,1,2,1,12,1,14,1,6,1,24,2, - 12,1,2,1,10,1,4,3,14,254,2,1,4,1,2,255, - 4,1,255,128,114,155,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, - 0,0,115,82,0,0,0,100,1,125,1,116,0,124,0,106, - 1,100,2,131,2,114,30,124,0,106,1,160,2,124,0,161, - 1,125,1,110,20,116,0,124,0,106,1,100,3,131,2,114, - 50,116,3,100,4,131,1,130,1,124,1,100,1,117,0,114, - 68,116,4,124,0,106,5,131,1,125,1,116,6,124,0,124, - 1,131,2,1,0,124,1,83,0,41,5,122,43,67,114,101, - 97,116,101,32,97,32,109,111,100,117,108,101,32,98,97,115, - 101,100,32,111,110,32,116,104,101,32,112,114,111,118,105,100, - 101,100,32,115,112,101,99,46,78,218,13,99,114,101,97,116, - 101,95,109,111,100,117,108,101,218,11,101,120,101,99,95,109, - 111,100,117,108,101,122,66,108,111,97,100,101,114,115,32,116, - 104,97,116,32,100,101,102,105,110,101,32,101,120,101,99,95, - 109,111,100,117,108,101,40,41,32,109,117,115,116,32,97,108, - 115,111,32,100,101,102,105,110,101,32,99,114,101,97,116,101, - 95,109,111,100,117,108,101,40,41,41,7,114,11,0,0,0, - 114,116,0,0,0,114,156,0,0,0,114,83,0,0,0,114, - 21,0,0,0,114,20,0,0,0,114,155,0,0,0,169,2, - 114,103,0,0,0,114,104,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,16,109,111,100,117,108, - 101,95,102,114,111,109,95,115,112,101,99,62,2,0,0,115, - 20,0,0,0,4,3,12,1,14,3,12,1,8,1,8,2, - 10,1,10,1,4,1,255,128,114,159,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, - 0,0,67,0,0,0,115,100,0,0,0,124,0,106,0,100, - 1,117,0,114,14,100,2,110,4,124,0,106,0,125,1,124, - 0,106,1,100,1,117,0,114,64,124,0,106,2,100,1,117, - 0,114,50,100,3,160,3,124,1,161,1,83,0,100,4,160, - 3,124,1,124,0,106,2,161,2,83,0,124,0,106,4,114, - 84,100,5,160,3,124,1,124,0,106,1,161,2,83,0,100, - 6,160,3,124,0,106,0,124,0,106,1,161,2,83,0,41, - 7,122,38,82,101,116,117,114,110,32,116,104,101,32,114,101, - 112,114,32,116,111,32,117,115,101,32,102,111,114,32,116,104, - 101,32,109,111,100,117,108,101,46,78,114,108,0,0,0,114, - 109,0,0,0,114,110,0,0,0,114,111,0,0,0,250,18, - 60,109,111,100,117,108,101,32,123,33,114,125,32,40,123,125, - 41,62,41,5,114,20,0,0,0,114,120,0,0,0,114,116, - 0,0,0,114,49,0,0,0,114,130,0,0,0,41,2,114, - 103,0,0,0,114,20,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,114,114,0,0,0,79,2,0, - 0,115,18,0,0,0,20,3,10,1,10,1,10,1,14,2, - 6,2,14,1,16,2,255,128,114,114,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,10,0, - 0,0,67,0,0,0,115,26,1,0,0,124,0,106,0,125, - 2,116,1,124,2,131,1,143,246,1,0,116,2,106,3,160, - 4,124,2,161,1,124,1,117,1,114,54,100,1,160,5,124, - 2,161,1,125,3,116,6,124,3,124,2,100,2,141,2,130, - 1,122,160,124,0,106,7,100,3,117,0,114,106,124,0,106, - 8,100,3,117,0,114,90,116,6,100,4,124,0,106,0,100, - 2,141,2,130,1,116,9,124,0,124,1,100,5,100,6,141, - 3,1,0,110,80,116,9,124,0,124,1,100,5,100,6,141, - 3,1,0,116,10,124,0,106,7,100,7,131,2,115,174,116, - 11,124,0,106,7,131,1,155,0,100,8,157,2,125,3,116, - 12,160,13,124,3,116,14,161,2,1,0,124,0,106,7,160, - 15,124,2,161,1,1,0,110,12,124,0,106,7,160,16,124, - 1,161,1,1,0,87,0,116,2,106,3,160,17,124,0,106, - 0,161,1,125,1,124,1,116,2,106,3,124,0,106,0,60, - 0,110,28,116,2,106,3,160,17,124,0,106,0,161,1,125, - 1,124,1,116,2,106,3,124,0,106,0,60,0,48,0,87, - 0,100,3,4,0,4,0,131,3,1,0,124,1,83,0,49, - 0,144,1,115,12,48,0,1,0,1,0,1,0,89,0,1, - 0,124,1,83,0,41,9,122,70,69,120,101,99,117,116,101, - 32,116,104,101,32,115,112,101,99,39,115,32,115,112,101,99, - 105,102,105,101,100,32,109,111,100,117,108,101,32,105,110,32, - 97,110,32,101,120,105,115,116,105,110,103,32,109,111,100,117, - 108,101,39,115,32,110,97,109,101,115,112,97,99,101,46,122, - 30,109,111,100,117,108,101,32,123,33,114,125,32,110,111,116, - 32,105,110,32,115,121,115,46,109,111,100,117,108,101,115,114, - 19,0,0,0,78,250,14,109,105,115,115,105,110,103,32,108, - 111,97,100,101,114,84,114,150,0,0,0,114,157,0,0,0, - 250,55,46,101,120,101,99,95,109,111,100,117,108,101,40,41, - 32,110,111,116,32,102,111,117,110,100,59,32,102,97,108,108, - 105,110,103,32,98,97,99,107,32,116,111,32,108,111,97,100, - 95,109,111,100,117,108,101,40,41,41,18,114,20,0,0,0, - 114,54,0,0,0,114,18,0,0,0,114,99,0,0,0,114, - 38,0,0,0,114,49,0,0,0,114,83,0,0,0,114,116, - 0,0,0,114,123,0,0,0,114,155,0,0,0,114,11,0, - 0,0,114,7,0,0,0,114,95,0,0,0,114,96,0,0, - 0,218,13,73,109,112,111,114,116,87,97,114,110,105,110,103, - 218,11,108,111,97,100,95,109,111,100,117,108,101,114,157,0, - 0,0,218,3,112,111,112,41,4,114,103,0,0,0,114,104, - 0,0,0,114,20,0,0,0,114,102,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,100,0,0, - 0,96,2,0,0,115,50,0,0,0,6,2,10,1,16,1, - 10,1,12,1,2,1,10,1,10,1,14,1,16,2,14,2, - 12,1,16,1,12,2,14,1,12,2,2,128,14,4,14,1, - 14,255,26,1,4,1,18,255,4,1,255,128,114,100,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,8,0,0,0,67,0,0,0,115,18,1,0,0,122, - 18,124,0,106,0,160,1,124,0,106,2,161,1,1,0,87, - 0,110,46,1,0,1,0,1,0,124,0,106,2,116,3,106, - 4,118,0,114,64,116,3,106,4,160,5,124,0,106,2,161, - 1,125,1,124,1,116,3,106,4,124,0,106,2,60,0,130, - 0,116,3,106,4,160,5,124,0,106,2,161,1,125,1,124, - 1,116,3,106,4,124,0,106,2,60,0,116,6,124,1,100, - 1,100,0,131,3,100,0,117,0,114,140,122,12,124,0,106, - 0,124,1,95,7,87,0,110,18,4,0,116,8,121,138,1, - 0,1,0,1,0,89,0,110,2,48,0,116,6,124,1,100, - 2,100,0,131,3,100,0,117,0,114,216,122,40,124,1,106, - 9,124,1,95,10,116,11,124,1,100,3,131,2,115,194,124, - 0,106,2,160,12,100,4,161,1,100,5,25,0,124,1,95, - 10,87,0,110,18,4,0,116,8,121,214,1,0,1,0,1, - 0,89,0,110,2,48,0,116,6,124,1,100,6,100,0,131, - 3,100,0,117,0,144,1,114,14,122,12,124,0,124,1,95, - 13,87,0,124,1,83,0,4,0,116,8,144,1,121,12,1, - 0,1,0,1,0,89,0,124,1,83,0,48,0,124,1,83, - 0,41,7,78,114,106,0,0,0,114,152,0,0,0,114,148, - 0,0,0,114,135,0,0,0,114,25,0,0,0,114,113,0, - 0,0,41,14,114,116,0,0,0,114,164,0,0,0,114,20, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,165,0, - 0,0,114,13,0,0,0,114,106,0,0,0,114,2,0,0, - 0,114,9,0,0,0,114,152,0,0,0,114,11,0,0,0, - 114,136,0,0,0,114,113,0,0,0,114,158,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,25, - 95,108,111,97,100,95,98,97,99,107,119,97,114,100,95,99, - 111,109,112,97,116,105,98,108,101,126,2,0,0,115,62,0, - 0,0,2,3,18,1,6,1,12,1,14,1,12,1,2,1, - 14,3,12,1,16,1,2,1,12,1,12,1,6,1,16,1, - 2,1,8,4,10,1,22,1,12,1,6,1,18,1,2,1, - 8,1,4,3,14,254,2,1,4,1,2,255,4,1,255,128, - 114,166,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,11,0,0,0,67,0,0,0,115,240, - 0,0,0,124,0,106,0,100,0,117,1,114,58,116,1,124, - 0,106,0,100,1,131,2,115,58,116,2,124,0,106,0,131, - 1,155,0,100,2,157,2,125,1,116,3,160,4,124,1,116, - 5,161,2,1,0,116,6,124,0,131,1,83,0,116,7,124, - 0,131,1,125,2,100,3,124,0,95,8,122,158,124,2,116, - 9,106,10,124,0,106,11,60,0,122,50,124,0,106,0,100, - 0,117,0,114,122,124,0,106,12,100,0,117,0,114,134,116, - 13,100,4,124,0,106,11,100,5,141,2,130,1,124,0,106, - 0,160,14,124,2,161,1,1,0,87,0,110,40,1,0,1, - 0,1,0,122,14,116,9,106,10,124,0,106,11,61,0,87, - 0,130,0,4,0,116,15,121,176,1,0,1,0,1,0,89, - 0,130,0,48,0,116,9,106,10,160,16,124,0,106,11,161, - 1,125,2,124,2,116,9,106,10,124,0,106,11,60,0,116, - 17,100,6,124,0,106,11,124,0,106,0,131,3,1,0,87, - 0,100,7,124,0,95,8,124,2,83,0,100,7,124,0,95, - 8,48,0,41,8,78,114,157,0,0,0,114,162,0,0,0, - 84,114,161,0,0,0,114,19,0,0,0,122,18,105,109,112, - 111,114,116,32,123,33,114,125,32,35,32,123,33,114,125,70, - 41,18,114,116,0,0,0,114,11,0,0,0,114,7,0,0, - 0,114,95,0,0,0,114,96,0,0,0,114,163,0,0,0, - 114,166,0,0,0,114,159,0,0,0,90,13,95,105,110,105, - 116,105,97,108,105,122,105,110,103,114,18,0,0,0,114,99, - 0,0,0,114,20,0,0,0,114,123,0,0,0,114,83,0, - 0,0,114,157,0,0,0,114,67,0,0,0,114,165,0,0, - 0,114,80,0,0,0,41,3,114,103,0,0,0,114,102,0, - 0,0,114,104,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,14,95,108,111,97,100,95,117,110, - 108,111,99,107,101,100,162,2,0,0,115,58,0,0,0,10, - 2,12,2,16,1,12,2,8,1,8,2,6,5,2,1,12, - 1,2,1,10,1,10,1,14,1,16,3,6,1,2,1,12, - 1,2,3,12,254,2,1,2,1,2,255,14,6,12,1,18, - 1,6,2,4,2,8,254,255,128,114,167,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8, - 0,0,0,67,0,0,0,115,54,0,0,0,116,0,124,0, - 106,1,131,1,143,24,1,0,116,2,124,0,131,1,87,0, - 2,0,100,1,4,0,4,0,131,3,1,0,83,0,49,0, - 115,40,48,0,1,0,1,0,1,0,89,0,1,0,100,1, - 83,0,41,2,122,191,82,101,116,117,114,110,32,97,32,110, - 101,119,32,109,111,100,117,108,101,32,111,98,106,101,99,116, - 44,32,108,111,97,100,101,100,32,98,121,32,116,104,101,32, - 115,112,101,99,39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111,32,105, - 116,115,32,112,97,114,101,110,116,46,10,10,32,32,32,32, - 73,102,32,97,32,109,111,100,117,108,101,32,105,115,32,97, - 108,114,101,97,100,121,32,105,110,32,115,121,115,46,109,111, - 100,117,108,101,115,44,32,116,104,97,116,32,101,120,105,115, - 116,105,110,103,32,109,111,100,117,108,101,32,103,101,116,115, - 10,32,32,32,32,99,108,111,98,98,101,114,101,100,46,10, - 10,32,32,32,32,78,41,3,114,54,0,0,0,114,20,0, - 0,0,114,167,0,0,0,169,1,114,103,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,101,0, - 0,0,207,2,0,0,115,6,0,0,0,12,9,42,1,255, - 128,114,101,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 140,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,90,4,101,5,100,3,100,4,132,0,131,1,90,6, - 101,7,100,20,100,6,100,7,132,1,131,1,90,8,101,7, - 100,21,100,8,100,9,132,1,131,1,90,9,101,5,100,10, - 100,11,132,0,131,1,90,10,101,5,100,12,100,13,132,0, - 131,1,90,11,101,7,101,12,100,14,100,15,132,0,131,1, - 131,1,90,13,101,7,101,12,100,16,100,17,132,0,131,1, - 131,1,90,14,101,7,101,12,100,18,100,19,132,0,131,1, - 131,1,90,15,101,7,101,16,131,1,90,17,100,5,83,0, - 41,22,218,15,66,117,105,108,116,105,110,73,109,112,111,114, - 116,101,114,122,144,77,101,116,97,32,112,97,116,104,32,105, - 109,112,111,114,116,32,102,111,114,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,46,10,10,32,32,32, - 32,65,108,108,32,109,101,116,104,111,100,115,32,97,114,101, - 32,101,105,116,104,101,114,32,99,108,97,115,115,32,111,114, - 32,115,116,97,116,105,99,32,109,101,116,104,111,100,115,32, - 116,111,32,97,118,111,105,100,32,116,104,101,32,110,101,101, - 100,32,116,111,10,32,32,32,32,105,110,115,116,97,110,116, - 105,97,116,101,32,116,104,101,32,99,108,97,115,115,46,10, - 10,32,32,32,32,122,8,98,117,105,108,116,45,105,110,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 5,0,0,0,67,0,0,0,115,22,0,0,0,100,1,124, - 0,106,0,155,2,100,2,116,1,106,2,155,0,100,3,157, - 5,83,0,41,5,250,115,82,101,116,117,114,110,32,114,101, - 112,114,32,102,111,114,32,116,104,101,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,84,104,101,32,105,109,112,111,114, - 116,32,109,97,99,104,105,110,101,114,121,32,100,111,101,115, - 32,116,104,101,32,106,111,98,32,105,116,115,101,108,102,46, - 10,10,32,32,32,32,32,32,32,32,122,8,60,109,111,100, - 117,108,101,32,122,2,32,40,122,2,41,62,78,41,3,114, - 9,0,0,0,114,169,0,0,0,114,145,0,0,0,169,1, + 0,0,114,129,0,0,0,145,1,0,0,115,14,0,0,0, + 10,2,16,1,8,1,4,1,14,1,6,1,255,128,122,17, + 77,111,100,117,108,101,83,112,101,99,46,99,97,99,104,101, + 100,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,2,0,0,0,67,0,0,0,115,10,0,0,0,124, + 1,124,0,95,0,100,0,83,0,114,0,0,0,0,41,1, + 114,125,0,0,0,41,2,114,33,0,0,0,114,129,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 114,129,0,0,0,154,1,0,0,115,4,0,0,0,10,2, + 255,128,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,32,0,0,0, + 124,0,106,0,100,1,117,0,114,26,124,0,106,1,160,2, + 100,2,161,1,100,3,25,0,83,0,124,0,106,1,83,0, + 41,4,122,32,84,104,101,32,110,97,109,101,32,111,102,32, + 116,104,101,32,109,111,100,117,108,101,39,115,32,112,97,114, + 101,110,116,46,78,218,1,46,114,25,0,0,0,41,3,114, + 123,0,0,0,114,20,0,0,0,218,10,114,112,97,114,116, + 105,116,105,111,110,114,51,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,6,112,97,114,101,110, + 116,158,1,0,0,115,8,0,0,0,10,3,16,1,6,2, + 255,128,122,17,77,111,100,117,108,101,83,112,101,99,46,112, + 97,114,101,110,116,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,6, + 0,0,0,124,0,106,0,83,0,114,0,0,0,0,41,1, + 114,124,0,0,0,114,51,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,130,0,0,0,166,1, + 0,0,115,4,0,0,0,6,2,255,128,122,23,77,111,100, + 117,108,101,83,112,101,99,46,104,97,115,95,108,111,99,97, + 116,105,111,110,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,2,0,0,0,67,0,0,0,115,14,0, + 0,0,116,0,124,1,131,1,124,0,95,1,100,0,83,0, + 114,0,0,0,0,41,2,218,4,98,111,111,108,114,124,0, + 0,0,41,2,114,33,0,0,0,218,5,118,97,108,117,101, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 130,0,0,0,170,1,0,0,115,4,0,0,0,14,2,255, + 128,41,12,114,9,0,0,0,114,8,0,0,0,114,1,0, + 0,0,114,10,0,0,0,114,34,0,0,0,114,52,0,0, + 0,114,132,0,0,0,218,8,112,114,111,112,101,114,116,121, + 114,129,0,0,0,218,6,115,101,116,116,101,114,114,137,0, + 0,0,114,130,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,119,0,0,0, + 74,1,0,0,115,36,0,0,0,8,0,4,1,4,36,2, + 1,12,255,8,12,8,10,2,12,10,1,4,8,10,1,2, + 3,10,1,2,7,10,1,4,3,14,1,255,128,114,119,0, + 0,0,169,2,114,120,0,0,0,114,122,0,0,0,99,2, + 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,8, + 0,0,0,67,0,0,0,115,150,0,0,0,116,0,124,1, + 100,1,131,2,114,74,116,1,100,2,117,0,114,22,116,2, + 130,1,116,1,106,3,125,4,124,3,100,2,117,0,114,48, + 124,4,124,0,124,1,100,3,141,2,83,0,124,3,114,56, + 103,0,110,2,100,2,125,5,124,4,124,0,124,1,124,5, + 100,4,141,3,83,0,124,3,100,2,117,0,114,134,116,0, + 124,1,100,5,131,2,114,130,122,14,124,1,160,4,124,0, + 161,1,125,3,87,0,110,26,4,0,116,5,121,128,1,0, + 1,0,1,0,100,2,125,3,89,0,110,6,48,0,100,6, + 125,3,116,6,124,0,124,1,124,2,124,3,100,7,141,4, + 83,0,41,8,122,53,82,101,116,117,114,110,32,97,32,109, + 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, + 32,111,110,32,118,97,114,105,111,117,115,32,108,111,97,100, + 101,114,32,109,101,116,104,111,100,115,46,90,12,103,101,116, + 95,102,105,108,101,110,97,109,101,78,41,1,114,116,0,0, + 0,41,2,114,116,0,0,0,114,123,0,0,0,114,122,0, + 0,0,70,114,142,0,0,0,41,7,114,11,0,0,0,114, + 133,0,0,0,114,134,0,0,0,218,23,115,112,101,99,95, + 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, + 111,110,114,122,0,0,0,114,83,0,0,0,114,119,0,0, + 0,41,6,114,20,0,0,0,114,116,0,0,0,114,120,0, + 0,0,114,122,0,0,0,114,143,0,0,0,90,6,115,101, + 97,114,99,104,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,98,0,0,0,175,1,0,0,115,38,0,0, + 0,10,2,8,1,4,1,6,1,8,2,12,1,12,1,6, + 1,2,1,6,255,8,3,10,1,2,1,14,1,12,1,10, + 1,4,3,16,2,255,128,114,98,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0, + 0,67,0,0,0,115,40,1,0,0,122,10,124,0,106,0, + 125,3,87,0,110,18,4,0,116,1,121,28,1,0,1,0, + 1,0,89,0,110,14,48,0,124,3,100,0,117,1,114,42, + 124,3,83,0,124,0,106,2,125,4,124,1,100,0,117,0, + 114,86,122,10,124,0,106,3,125,1,87,0,110,18,4,0, + 116,1,121,84,1,0,1,0,1,0,89,0,110,2,48,0, + 122,10,124,0,106,4,125,5,87,0,110,22,4,0,116,1, + 121,118,1,0,1,0,1,0,100,0,125,5,89,0,110,2, + 48,0,124,2,100,0,117,0,114,174,124,5,100,0,117,0, + 114,170,122,10,124,1,106,5,125,2,87,0,110,26,4,0, + 116,1,121,168,1,0,1,0,1,0,100,0,125,2,89,0, + 110,6,48,0,124,5,125,2,122,10,124,0,106,6,125,6, + 87,0,110,22,4,0,116,1,121,206,1,0,1,0,1,0, + 100,0,125,6,89,0,110,2,48,0,122,14,116,7,124,0, + 106,8,131,1,125,7,87,0,110,22,4,0,116,1,121,244, + 1,0,1,0,1,0,100,0,125,7,89,0,110,2,48,0, + 116,9,124,4,124,1,124,2,100,1,141,3,125,3,124,5, + 100,0,117,0,144,1,114,18,100,2,110,2,100,3,124,3, + 95,10,124,6,124,3,95,11,124,7,124,3,95,12,124,3, + 83,0,41,4,78,169,1,114,120,0,0,0,70,84,41,13, + 114,113,0,0,0,114,2,0,0,0,114,9,0,0,0,114, + 106,0,0,0,114,115,0,0,0,218,7,95,79,82,73,71, + 73,78,218,10,95,95,99,97,99,104,101,100,95,95,218,4, + 108,105,115,116,218,8,95,95,112,97,116,104,95,95,114,119, + 0,0,0,114,124,0,0,0,114,129,0,0,0,114,123,0, + 0,0,41,8,114,104,0,0,0,114,116,0,0,0,114,120, + 0,0,0,114,103,0,0,0,114,20,0,0,0,90,8,108, + 111,99,97,116,105,111,110,114,129,0,0,0,114,123,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,17,95,115,112,101,99,95,102,114,111,109,95,109,111,100, + 117,108,101,201,1,0,0,115,74,0,0,0,2,2,10,1, + 12,1,6,1,8,2,4,1,6,2,8,1,2,1,10,1, + 12,1,6,2,2,1,10,1,12,1,10,1,8,1,8,1, + 2,1,10,1,12,1,10,1,4,2,2,1,10,1,12,1, + 10,1,2,1,14,1,12,1,10,1,14,2,20,1,6,1, + 6,1,4,1,255,128,114,149,0,0,0,70,169,1,218,8, + 111,118,101,114,114,105,100,101,99,2,0,0,0,0,0,0, + 0,1,0,0,0,5,0,0,0,8,0,0,0,67,0,0, + 0,115,214,1,0,0,124,2,115,20,116,0,124,1,100,1, + 100,0,131,3,100,0,117,0,114,52,122,12,124,0,106,1, + 124,1,95,2,87,0,110,18,4,0,116,3,121,50,1,0, + 1,0,1,0,89,0,110,2,48,0,124,2,115,72,116,0, + 124,1,100,2,100,0,131,3,100,0,117,0,114,174,124,0, + 106,4,125,3,124,3,100,0,117,0,114,144,124,0,106,5, + 100,0,117,1,114,144,116,6,100,0,117,0,114,108,116,7, + 130,1,116,6,106,8,125,4,124,4,160,9,124,4,161,1, + 125,3,124,0,106,5,124,3,95,10,124,3,124,0,95,4, + 100,0,124,1,95,11,122,10,124,3,124,1,95,12,87,0, + 110,18,4,0,116,3,121,172,1,0,1,0,1,0,89,0, + 110,2,48,0,124,2,115,194,116,0,124,1,100,3,100,0, + 131,3,100,0,117,0,114,226,122,12,124,0,106,13,124,1, + 95,14,87,0,110,18,4,0,116,3,121,224,1,0,1,0, + 1,0,89,0,110,2,48,0,122,10,124,0,124,1,95,15, + 87,0,110,18,4,0,116,3,121,254,1,0,1,0,1,0, + 89,0,110,2,48,0,124,2,144,1,115,24,116,0,124,1, + 100,4,100,0,131,3,100,0,117,0,144,1,114,70,124,0, + 106,5,100,0,117,1,144,1,114,70,122,12,124,0,106,5, + 124,1,95,16,87,0,110,20,4,0,116,3,144,1,121,68, + 1,0,1,0,1,0,89,0,110,2,48,0,124,0,106,17, + 144,1,114,210,124,2,144,1,115,102,116,0,124,1,100,5, + 100,0,131,3,100,0,117,0,144,1,114,136,122,12,124,0, + 106,18,124,1,95,11,87,0,110,20,4,0,116,3,144,1, + 121,134,1,0,1,0,1,0,89,0,110,2,48,0,124,2, + 144,1,115,160,116,0,124,1,100,6,100,0,131,3,100,0, + 117,0,144,1,114,210,124,0,106,19,100,0,117,1,144,1, + 114,210,122,14,124,0,106,19,124,1,95,20,87,0,124,1, + 83,0,4,0,116,3,144,1,121,208,1,0,1,0,1,0, + 89,0,124,1,83,0,48,0,124,1,83,0,41,7,78,114, + 9,0,0,0,114,106,0,0,0,218,11,95,95,112,97,99, + 107,97,103,101,95,95,114,148,0,0,0,114,115,0,0,0, + 114,146,0,0,0,41,21,114,13,0,0,0,114,20,0,0, + 0,114,9,0,0,0,114,2,0,0,0,114,116,0,0,0, + 114,123,0,0,0,114,133,0,0,0,114,134,0,0,0,218, + 16,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,218,7,95,95,110,101,119,95,95,90,5,95,112,97,116, + 104,114,115,0,0,0,114,106,0,0,0,114,137,0,0,0, + 114,152,0,0,0,114,113,0,0,0,114,148,0,0,0,114, + 130,0,0,0,114,120,0,0,0,114,129,0,0,0,114,146, + 0,0,0,41,5,114,103,0,0,0,114,104,0,0,0,114, + 151,0,0,0,114,116,0,0,0,114,153,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,18,95, + 105,110,105,116,95,109,111,100,117,108,101,95,97,116,116,114, + 115,246,1,0,0,115,104,0,0,0,20,4,2,1,12,1, + 12,1,6,1,20,2,6,1,8,1,10,2,8,1,4,1, + 6,1,10,2,8,1,6,1,6,11,2,1,10,1,12,1, + 6,1,20,2,2,1,12,1,12,1,6,1,2,2,10,1, + 12,1,6,1,24,2,12,1,2,1,12,1,14,1,6,1, + 8,2,24,1,2,1,12,1,14,1,6,1,24,2,12,1, + 2,1,10,1,4,3,14,254,2,1,4,1,2,255,4,1, + 255,128,114,155,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,82,0,0,0,100,1,125,1,116,0,124,0,106,1,100, + 2,131,2,114,30,124,0,106,1,160,2,124,0,161,1,125, + 1,110,20,116,0,124,0,106,1,100,3,131,2,114,50,116, + 3,100,4,131,1,130,1,124,1,100,1,117,0,114,68,116, + 4,124,0,106,5,131,1,125,1,116,6,124,0,124,1,131, + 2,1,0,124,1,83,0,41,5,122,43,67,114,101,97,116, + 101,32,97,32,109,111,100,117,108,101,32,98,97,115,101,100, + 32,111,110,32,116,104,101,32,112,114,111,118,105,100,101,100, + 32,115,112,101,99,46,78,218,13,99,114,101,97,116,101,95, + 109,111,100,117,108,101,218,11,101,120,101,99,95,109,111,100, + 117,108,101,122,66,108,111,97,100,101,114,115,32,116,104,97, + 116,32,100,101,102,105,110,101,32,101,120,101,99,95,109,111, + 100,117,108,101,40,41,32,109,117,115,116,32,97,108,115,111, + 32,100,101,102,105,110,101,32,99,114,101,97,116,101,95,109, + 111,100,117,108,101,40,41,41,7,114,11,0,0,0,114,116, + 0,0,0,114,156,0,0,0,114,83,0,0,0,114,21,0, + 0,0,114,20,0,0,0,114,155,0,0,0,169,2,114,103, + 0,0,0,114,104,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,16,109,111,100,117,108,101,95, + 102,114,111,109,95,115,112,101,99,62,2,0,0,115,20,0, + 0,0,4,3,12,1,14,3,12,1,8,1,8,2,10,1, + 10,1,4,1,255,128,114,159,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, + 67,0,0,0,115,100,0,0,0,124,0,106,0,100,1,117, + 0,114,14,100,2,110,4,124,0,106,0,125,1,124,0,106, + 1,100,1,117,0,114,64,124,0,106,2,100,1,117,0,114, + 50,100,3,160,3,124,1,161,1,83,0,100,4,160,3,124, + 1,124,0,106,2,161,2,83,0,124,0,106,4,114,84,100, + 5,160,3,124,1,124,0,106,1,161,2,83,0,100,6,160, + 3,124,0,106,0,124,0,106,1,161,2,83,0,41,7,122, + 38,82,101,116,117,114,110,32,116,104,101,32,114,101,112,114, + 32,116,111,32,117,115,101,32,102,111,114,32,116,104,101,32, + 109,111,100,117,108,101,46,78,114,108,0,0,0,114,109,0, + 0,0,114,110,0,0,0,114,111,0,0,0,250,18,60,109, + 111,100,117,108,101,32,123,33,114,125,32,40,123,125,41,62, + 41,5,114,20,0,0,0,114,120,0,0,0,114,116,0,0, + 0,114,49,0,0,0,114,130,0,0,0,41,2,114,103,0, + 0,0,114,20,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,114,0,0,0,79,2,0,0,115, + 18,0,0,0,20,3,10,1,10,1,10,1,14,2,6,2, + 14,1,16,2,255,128,114,114,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,10,0,0,0, + 67,0,0,0,115,26,1,0,0,124,0,106,0,125,2,116, + 1,124,2,131,1,143,246,1,0,116,2,106,3,160,4,124, + 2,161,1,124,1,117,1,114,54,100,1,160,5,124,2,161, + 1,125,3,116,6,124,3,124,2,100,2,141,2,130,1,122, + 160,124,0,106,7,100,3,117,0,114,106,124,0,106,8,100, + 3,117,0,114,90,116,6,100,4,124,0,106,0,100,2,141, + 2,130,1,116,9,124,0,124,1,100,5,100,6,141,3,1, + 0,110,80,116,9,124,0,124,1,100,5,100,6,141,3,1, + 0,116,10,124,0,106,7,100,7,131,2,115,174,116,11,124, + 0,106,7,131,1,155,0,100,8,157,2,125,3,116,12,160, + 13,124,3,116,14,161,2,1,0,124,0,106,7,160,15,124, + 2,161,1,1,0,110,12,124,0,106,7,160,16,124,1,161, + 1,1,0,87,0,116,2,106,3,160,17,124,0,106,0,161, + 1,125,1,124,1,116,2,106,3,124,0,106,0,60,0,110, + 28,116,2,106,3,160,17,124,0,106,0,161,1,125,1,124, + 1,116,2,106,3,124,0,106,0,60,0,48,0,87,0,100, + 3,4,0,4,0,131,3,1,0,124,1,83,0,49,0,144, + 1,115,12,48,0,1,0,1,0,1,0,89,0,1,0,124, + 1,83,0,41,9,122,70,69,120,101,99,117,116,101,32,116, + 104,101,32,115,112,101,99,39,115,32,115,112,101,99,105,102, + 105,101,100,32,109,111,100,117,108,101,32,105,110,32,97,110, + 32,101,120,105,115,116,105,110,103,32,109,111,100,117,108,101, + 39,115,32,110,97,109,101,115,112,97,99,101,46,122,30,109, + 111,100,117,108,101,32,123,33,114,125,32,110,111,116,32,105, + 110,32,115,121,115,46,109,111,100,117,108,101,115,114,19,0, + 0,0,78,250,14,109,105,115,115,105,110,103,32,108,111,97, + 100,101,114,84,114,150,0,0,0,114,157,0,0,0,250,55, + 46,101,120,101,99,95,109,111,100,117,108,101,40,41,32,110, + 111,116,32,102,111,117,110,100,59,32,102,97,108,108,105,110, + 103,32,98,97,99,107,32,116,111,32,108,111,97,100,95,109, + 111,100,117,108,101,40,41,41,18,114,20,0,0,0,114,54, + 0,0,0,114,18,0,0,0,114,99,0,0,0,114,38,0, + 0,0,114,49,0,0,0,114,83,0,0,0,114,116,0,0, + 0,114,123,0,0,0,114,155,0,0,0,114,11,0,0,0, + 114,7,0,0,0,114,95,0,0,0,114,96,0,0,0,218, + 13,73,109,112,111,114,116,87,97,114,110,105,110,103,218,11, + 108,111,97,100,95,109,111,100,117,108,101,114,157,0,0,0, + 218,3,112,111,112,41,4,114,103,0,0,0,114,104,0,0, + 0,114,20,0,0,0,114,102,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,100,0,0,0,96, + 2,0,0,115,50,0,0,0,6,2,10,1,16,1,10,1, + 12,1,2,1,10,1,10,1,14,1,16,2,14,2,12,1, + 16,1,12,2,14,1,12,2,2,128,14,4,14,1,14,255, + 26,1,4,1,18,255,4,1,255,128,114,100,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 8,0,0,0,67,0,0,0,115,18,1,0,0,122,18,124, + 0,106,0,160,1,124,0,106,2,161,1,1,0,87,0,110, + 46,1,0,1,0,1,0,124,0,106,2,116,3,106,4,118, + 0,114,64,116,3,106,4,160,5,124,0,106,2,161,1,125, + 1,124,1,116,3,106,4,124,0,106,2,60,0,130,0,116, + 3,106,4,160,5,124,0,106,2,161,1,125,1,124,1,116, + 3,106,4,124,0,106,2,60,0,116,6,124,1,100,1,100, + 0,131,3,100,0,117,0,114,140,122,12,124,0,106,0,124, + 1,95,7,87,0,110,18,4,0,116,8,121,138,1,0,1, + 0,1,0,89,0,110,2,48,0,116,6,124,1,100,2,100, + 0,131,3,100,0,117,0,114,216,122,40,124,1,106,9,124, + 1,95,10,116,11,124,1,100,3,131,2,115,194,124,0,106, + 2,160,12,100,4,161,1,100,5,25,0,124,1,95,10,87, + 0,110,18,4,0,116,8,121,214,1,0,1,0,1,0,89, + 0,110,2,48,0,116,6,124,1,100,6,100,0,131,3,100, + 0,117,0,144,1,114,14,122,12,124,0,124,1,95,13,87, + 0,124,1,83,0,4,0,116,8,144,1,121,12,1,0,1, + 0,1,0,89,0,124,1,83,0,48,0,124,1,83,0,41, + 7,78,114,106,0,0,0,114,152,0,0,0,114,148,0,0, + 0,114,135,0,0,0,114,25,0,0,0,114,113,0,0,0, + 41,14,114,116,0,0,0,114,164,0,0,0,114,20,0,0, + 0,114,18,0,0,0,114,99,0,0,0,114,165,0,0,0, + 114,13,0,0,0,114,106,0,0,0,114,2,0,0,0,114, + 9,0,0,0,114,152,0,0,0,114,11,0,0,0,114,136, + 0,0,0,114,113,0,0,0,114,158,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,25,95,108, + 111,97,100,95,98,97,99,107,119,97,114,100,95,99,111,109, + 112,97,116,105,98,108,101,126,2,0,0,115,62,0,0,0, + 2,3,18,1,6,1,12,1,14,1,12,1,2,1,14,3, + 12,1,16,1,2,1,12,1,12,1,6,1,16,1,2,1, + 8,4,10,1,22,1,12,1,6,1,18,1,2,1,8,1, + 4,3,14,254,2,1,4,1,2,255,4,1,255,128,114,166, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,11,0,0,0,67,0,0,0,115,240,0,0, + 0,124,0,106,0,100,0,117,1,114,58,116,1,124,0,106, + 0,100,1,131,2,115,58,116,2,124,0,106,0,131,1,155, + 0,100,2,157,2,125,1,116,3,160,4,124,1,116,5,161, + 2,1,0,116,6,124,0,131,1,83,0,116,7,124,0,131, + 1,125,2,100,3,124,0,95,8,122,158,124,2,116,9,106, + 10,124,0,106,11,60,0,122,50,124,0,106,0,100,0,117, + 0,114,122,124,0,106,12,100,0,117,0,114,134,116,13,100, + 4,124,0,106,11,100,5,141,2,130,1,124,0,106,0,160, + 14,124,2,161,1,1,0,87,0,110,40,1,0,1,0,1, + 0,122,14,116,9,106,10,124,0,106,11,61,0,87,0,130, + 0,4,0,116,15,121,176,1,0,1,0,1,0,89,0,130, + 0,48,0,116,9,106,10,160,16,124,0,106,11,161,1,125, + 2,124,2,116,9,106,10,124,0,106,11,60,0,116,17,100, + 6,124,0,106,11,124,0,106,0,131,3,1,0,87,0,100, + 7,124,0,95,8,124,2,83,0,100,7,124,0,95,8,48, + 0,41,8,78,114,157,0,0,0,114,162,0,0,0,84,114, + 161,0,0,0,114,19,0,0,0,122,18,105,109,112,111,114, + 116,32,123,33,114,125,32,35,32,123,33,114,125,70,41,18, + 114,116,0,0,0,114,11,0,0,0,114,7,0,0,0,114, + 95,0,0,0,114,96,0,0,0,114,163,0,0,0,114,166, + 0,0,0,114,159,0,0,0,90,13,95,105,110,105,116,105, + 97,108,105,122,105,110,103,114,18,0,0,0,114,99,0,0, + 0,114,20,0,0,0,114,123,0,0,0,114,83,0,0,0, + 114,157,0,0,0,114,67,0,0,0,114,165,0,0,0,114, + 80,0,0,0,41,3,114,103,0,0,0,114,102,0,0,0, 114,104,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,107,0,0,0,233,2,0,0,115,4,0, - 0,0,22,7,255,128,122,27,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,4,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,5,0,0,0,67,0,0,0,115,42,0, - 0,0,124,2,100,0,117,1,114,12,100,0,83,0,116,0, - 160,1,124,1,161,1,114,38,116,2,124,1,124,0,124,0, - 106,3,100,1,141,3,83,0,100,0,83,0,169,2,78,114, - 144,0,0,0,41,4,114,61,0,0,0,90,10,105,115,95, - 98,117,105,108,116,105,110,114,98,0,0,0,114,145,0,0, - 0,169,4,218,3,99,108,115,114,85,0,0,0,218,4,112, - 97,116,104,218,6,116,97,114,103,101,116,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,9,102,105,110,100, - 95,115,112,101,99,242,2,0,0,115,12,0,0,0,8,2, - 4,1,10,1,16,1,4,2,255,128,122,25,66,117,105,108, - 116,105,110,73,109,112,111,114,116,101,114,46,102,105,110,100, - 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,30, - 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, - 3,100,1,117,1,114,26,124,3,106,1,83,0,100,1,83, - 0,41,2,122,175,70,105,110,100,32,116,104,101,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,73,102,32,39,112,97,116,104, - 39,32,105,115,32,101,118,101,114,32,115,112,101,99,105,102, - 105,101,100,32,116,104,101,110,32,116,104,101,32,115,101,97, - 114,99,104,32,105,115,32,99,111,110,115,105,100,101,114,101, - 100,32,97,32,102,97,105,108,117,114,101,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40, - 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, - 32,32,32,32,78,41,2,114,177,0,0,0,114,116,0,0, - 0,41,4,114,174,0,0,0,114,85,0,0,0,114,175,0, - 0,0,114,103,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,11,102,105,110,100,95,109,111,100, - 117,108,101,251,2,0,0,115,6,0,0,0,12,9,18,1, - 255,128,122,27,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, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 4,0,0,0,67,0,0,0,115,46,0,0,0,124,0,106, - 0,116,1,106,2,118,1,114,34,116,3,100,1,160,4,124, - 0,106,0,161,1,124,0,106,0,100,2,141,2,130,1,116, - 5,116,6,106,7,124,0,131,2,83,0,41,4,122,24,67, - 114,101,97,116,101,32,97,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,114,81,0,0,0,114,19,0,0, - 0,78,41,8,114,20,0,0,0,114,18,0,0,0,114,82, - 0,0,0,114,83,0,0,0,114,49,0,0,0,114,71,0, - 0,0,114,61,0,0,0,90,14,99,114,101,97,116,101,95, - 98,117,105,108,116,105,110,114,168,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,156,0,0,0, - 7,3,0,0,115,12,0,0,0,12,3,12,1,4,1,6, - 255,12,2,255,128,122,29,66,117,105,108,116,105,110,73,109, - 112,111,114,116,101,114,46,99,114,101,97,116,101,95,109,111, - 100,117,108,101,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,16,0, - 0,0,116,0,116,1,106,2,124,0,131,2,1,0,100,1, - 83,0,41,2,122,22,69,120,101,99,32,97,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,78,41,3,114, - 71,0,0,0,114,61,0,0,0,90,12,101,120,101,99,95, - 98,117,105,108,116,105,110,114,171,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,157,0,0,0, - 15,3,0,0,115,4,0,0,0,16,3,255,128,122,27,66, - 117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,101, - 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,57, - 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, - 100,111,32,110,111,116,32,104,97,118,101,32,99,111,100,101, - 32,111,98,106,101,99,116,115,46,78,114,5,0,0,0,169, - 2,114,174,0,0,0,114,85,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,8,103,101,116,95, - 99,111,100,101,20,3,0,0,115,4,0,0,0,4,4,255, - 128,122,24,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,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, - 56,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, - 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, - 114,99,101,32,99,111,100,101,46,78,114,5,0,0,0,114, - 179,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,26, - 3,0,0,115,4,0,0,0,4,4,255,128,122,26,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,3,122,52,82,101, - 116,117,114,110,32,70,97,108,115,101,32,97,115,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,97, - 114,101,32,110,101,118,101,114,32,112,97,99,107,97,103,101, - 115,46,70,78,114,5,0,0,0,114,179,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,122,0, - 0,0,32,3,0,0,115,4,0,0,0,4,4,255,128,122, - 26,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,41,2,78,78,41, - 1,78,41,18,114,9,0,0,0,114,8,0,0,0,114,1, - 0,0,0,114,10,0,0,0,114,145,0,0,0,218,12,115, - 116,97,116,105,99,109,101,116,104,111,100,114,107,0,0,0, - 218,11,99,108,97,115,115,109,101,116,104,111,100,114,177,0, - 0,0,114,178,0,0,0,114,156,0,0,0,114,157,0,0, - 0,114,90,0,0,0,114,180,0,0,0,114,181,0,0,0, - 114,122,0,0,0,114,105,0,0,0,114,164,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,169,0,0,0,222,2,0,0,115,48,0,0, - 0,8,0,4,2,4,7,2,2,10,1,2,8,12,1,2, - 8,12,1,2,11,10,1,2,7,10,1,2,4,2,1,12, - 1,2,4,2,1,12,1,2,4,2,1,12,1,12,4,255, - 128,114,169,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 144,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,90,4,101,5,100,3,100,4,132,0,131,1,90,6, - 101,7,100,22,100,6,100,7,132,1,131,1,90,8,101,7, - 100,23,100,8,100,9,132,1,131,1,90,9,101,5,100,10, - 100,11,132,0,131,1,90,10,101,5,100,12,100,13,132,0, - 131,1,90,11,101,7,100,14,100,15,132,0,131,1,90,12, - 101,7,101,13,100,16,100,17,132,0,131,1,131,1,90,14, - 101,7,101,13,100,18,100,19,132,0,131,1,131,1,90,15, - 101,7,101,13,100,20,100,21,132,0,131,1,131,1,90,16, - 100,5,83,0,41,24,218,14,70,114,111,122,101,110,73,109, - 112,111,114,116,101,114,122,142,77,101,116,97,32,112,97,116, - 104,32,105,109,112,111,114,116,32,102,111,114,32,102,114,111, - 122,101,110,32,109,111,100,117,108,101,115,46,10,10,32,32, - 32,32,65,108,108,32,109,101,116,104,111,100,115,32,97,114, - 101,32,101,105,116,104,101,114,32,99,108,97,115,115,32,111, - 114,32,115,116,97,116,105,99,32,109,101,116,104,111,100,115, - 32,116,111,32,97,118,111,105,100,32,116,104,101,32,110,101, - 101,100,32,116,111,10,32,32,32,32,105,110,115,116,97,110, - 116,105,97,116,101,32,116,104,101,32,99,108,97,115,115,46, - 10,10,32,32,32,32,90,6,102,114,111,122,101,110,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, - 0,0,0,67,0,0,0,115,16,0,0,0,100,1,160,0, - 124,0,106,1,116,2,106,3,161,2,83,0,41,3,114,170, - 0,0,0,114,160,0,0,0,78,41,4,114,49,0,0,0, - 114,9,0,0,0,114,184,0,0,0,114,145,0,0,0,41, - 1,218,1,109,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,107,0,0,0,52,3,0,0,115,4,0,0, - 0,16,7,255,128,122,26,70,114,111,122,101,110,73,109,112, + 6,0,0,0,218,14,95,108,111,97,100,95,117,110,108,111, + 99,107,101,100,162,2,0,0,115,58,0,0,0,10,2,12, + 2,16,1,12,2,8,1,8,2,6,5,2,1,12,1,2, + 1,10,1,10,1,14,1,16,3,6,1,2,1,12,1,2, + 3,12,254,2,1,2,1,2,255,14,6,12,1,18,1,6, + 2,4,2,8,254,255,128,114,167,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, + 0,67,0,0,0,115,54,0,0,0,116,0,124,0,106,1, + 131,1,143,24,1,0,116,2,124,0,131,1,87,0,2,0, + 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,40, + 48,0,1,0,1,0,1,0,89,0,1,0,100,1,83,0, + 41,2,122,191,82,101,116,117,114,110,32,97,32,110,101,119, + 32,109,111,100,117,108,101,32,111,98,106,101,99,116,44,32, + 108,111,97,100,101,100,32,98,121,32,116,104,101,32,115,112, + 101,99,39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111,32,105,116,115, + 32,112,97,114,101,110,116,46,10,10,32,32,32,32,73,102, + 32,97,32,109,111,100,117,108,101,32,105,115,32,97,108,114, + 101,97,100,121,32,105,110,32,115,121,115,46,109,111,100,117, + 108,101,115,44,32,116,104,97,116,32,101,120,105,115,116,105, + 110,103,32,109,111,100,117,108,101,32,103,101,116,115,10,32, + 32,32,32,99,108,111,98,98,101,114,101,100,46,10,10,32, + 32,32,32,78,41,3,114,54,0,0,0,114,20,0,0,0, + 114,167,0,0,0,169,1,114,103,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,101,0,0,0, + 207,2,0,0,115,6,0,0,0,12,9,42,1,255,128,114, + 101,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,64,0,0,0,115,140,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 90,4,101,5,100,3,100,4,132,0,131,1,90,6,101,7, + 100,20,100,6,100,7,132,1,131,1,90,8,101,7,100,21, + 100,8,100,9,132,1,131,1,90,9,101,5,100,10,100,11, + 132,0,131,1,90,10,101,5,100,12,100,13,132,0,131,1, + 90,11,101,7,101,12,100,14,100,15,132,0,131,1,131,1, + 90,13,101,7,101,12,100,16,100,17,132,0,131,1,131,1, + 90,14,101,7,101,12,100,18,100,19,132,0,131,1,131,1, + 90,15,101,7,101,16,131,1,90,17,100,5,83,0,41,22, + 218,15,66,117,105,108,116,105,110,73,109,112,111,114,116,101, + 114,122,144,77,101,116,97,32,112,97,116,104,32,105,109,112, + 111,114,116,32,102,111,114,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,65, + 108,108,32,109,101,116,104,111,100,115,32,97,114,101,32,101, + 105,116,104,101,114,32,99,108,97,115,115,32,111,114,32,115, + 116,97,116,105,99,32,109,101,116,104,111,100,115,32,116,111, + 32,97,118,111,105,100,32,116,104,101,32,110,101,101,100,32, + 116,111,10,32,32,32,32,105,110,115,116,97,110,116,105,97, + 116,101,32,116,104,101,32,99,108,97,115,115,46,10,10,32, + 32,32,32,122,8,98,117,105,108,116,45,105,110,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0, + 0,0,67,0,0,0,115,22,0,0,0,100,1,124,0,106, + 0,155,2,100,2,116,1,106,2,155,0,100,3,157,5,83, + 0,41,5,250,115,82,101,116,117,114,110,32,114,101,112,114, + 32,102,111,114,32,116,104,101,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,101,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,32,32,84,104,101,32,105,109,112,111,114,116,32, + 109,97,99,104,105,110,101,114,121,32,100,111,101,115,32,116, + 104,101,32,106,111,98,32,105,116,115,101,108,102,46,10,10, + 32,32,32,32,32,32,32,32,122,8,60,109,111,100,117,108, + 101,32,122,2,32,40,122,2,41,62,78,41,3,114,9,0, + 0,0,114,169,0,0,0,114,145,0,0,0,169,1,114,104, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,114,107,0,0,0,233,2,0,0,115,4,0,0,0, + 22,7,255,128,122,27,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,4,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,5,0,0,0,67,0,0,0,115,30,0,0,0, - 116,0,160,1,124,1,161,1,114,26,116,2,124,1,124,0, - 124,0,106,3,100,1,141,3,83,0,100,0,83,0,114,172, - 0,0,0,41,4,114,61,0,0,0,114,92,0,0,0,114, - 98,0,0,0,114,145,0,0,0,114,173,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,177,0, - 0,0,61,3,0,0,115,8,0,0,0,10,2,16,1,4, - 2,255,128,122,24,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, - 0,0,67,0,0,0,115,18,0,0,0,116,0,160,1,124, - 1,161,1,114,14,124,0,83,0,100,1,83,0,41,2,122, - 93,70,105,110,100,32,97,32,102,114,111,122,101,110,32,109, - 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, - 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, - 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, - 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,41, - 2,114,61,0,0,0,114,92,0,0,0,41,3,114,174,0, - 0,0,114,85,0,0,0,114,175,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,178,0,0,0, - 68,3,0,0,115,4,0,0,0,18,7,255,128,122,26,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,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,42,85, - 115,101,32,100,101,102,97,117,108,116,32,115,101,109,97,110, - 116,105,99,115,32,102,111,114,32,109,111,100,117,108,101,32, - 99,114,101,97,116,105,111,110,46,78,114,5,0,0,0,114, - 168,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,156,0,0,0,77,3,0,0,115,4,0,0, - 0,4,0,255,128,122,28,70,114,111,122,101,110,73,109,112, - 111,114,116,101,114,46,99,114,101,97,116,101,95,109,111,100, - 117,108,101,99,1,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,4,0,0,0,67,0,0,0,115,64,0,0, - 0,124,0,106,0,106,1,125,1,116,2,160,3,124,1,161, - 1,115,36,116,4,100,1,160,5,124,1,161,1,124,1,100, - 2,141,2,130,1,116,6,116,2,106,7,124,1,131,2,125, - 2,116,8,124,2,124,0,106,9,131,2,1,0,100,0,83, - 0,114,91,0,0,0,41,10,114,113,0,0,0,114,20,0, - 0,0,114,61,0,0,0,114,92,0,0,0,114,83,0,0, - 0,114,49,0,0,0,114,71,0,0,0,218,17,103,101,116, - 95,102,114,111,122,101,110,95,111,98,106,101,99,116,218,4, - 101,120,101,99,114,14,0,0,0,41,3,114,104,0,0,0, - 114,20,0,0,0,218,4,99,111,100,101,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,114,157,0,0,0,81, - 3,0,0,115,16,0,0,0,8,2,10,1,10,1,2,1, - 6,255,12,2,16,1,255,128,122,26,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,46,101,120,101,99,95,109,111, - 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,10,0, - 0,0,116,0,124,0,124,1,131,2,83,0,41,2,122,95, - 76,111,97,100,32,97,32,102,114,111,122,101,110,32,109,111, - 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101, - 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, - 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, - 41,1,114,105,0,0,0,114,179,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,164,0,0,0, - 90,3,0,0,115,4,0,0,0,10,8,255,128,122,26,70, - 114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, - 0,0,115,10,0,0,0,116,0,160,1,124,1,161,1,83, - 0,41,2,122,45,82,101,116,117,114,110,32,116,104,101,32, - 99,111,100,101,32,111,98,106,101,99,116,32,102,111,114,32, - 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,46,78,41,2,114,61,0,0,0,114,186,0,0,0,114, - 179,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,180,0,0,0,100,3,0,0,115,4,0,0, - 0,10,4,255,128,122,23,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,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, - 41,2,122,54,82,101,116,117,114,110,32,78,111,110,101,32, - 97,115,32,102,114,111,122,101,110,32,109,111,100,117,108,101, - 115,32,100,111,32,110,111,116,32,104,97,118,101,32,115,111, - 117,114,99,101,32,99,111,100,101,46,78,114,5,0,0,0, - 114,179,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,181,0,0,0,106,3,0,0,115,4,0, - 0,0,4,4,255,128,122,25,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,0,0,0,0,2,0, - 0,0,3,0,0,0,67,0,0,0,115,10,0,0,0,116, - 0,160,1,124,1,161,1,83,0,41,2,122,46,82,101,116, - 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,32,105,115, - 32,97,32,112,97,99,107,97,103,101,46,78,41,2,114,61, - 0,0,0,90,17,105,115,95,102,114,111,122,101,110,95,112, - 97,99,107,97,103,101,114,179,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,114,122,0,0,0,112, - 3,0,0,115,4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17, + 0,0,0,5,0,0,0,67,0,0,0,115,42,0,0,0, + 124,2,100,0,117,1,114,12,100,0,83,0,116,0,160,1, + 124,1,161,1,114,38,116,2,124,1,124,0,124,0,106,3, + 100,1,141,3,83,0,100,0,83,0,169,2,78,114,144,0, + 0,0,41,4,114,61,0,0,0,90,10,105,115,95,98,117, + 105,108,116,105,110,114,98,0,0,0,114,145,0,0,0,169, + 4,218,3,99,108,115,114,85,0,0,0,218,4,112,97,116, + 104,218,6,116,97,114,103,101,116,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,9,102,105,110,100,95,115, + 112,101,99,242,2,0,0,115,12,0,0,0,8,2,4,1, + 10,1,16,1,4,2,255,128,122,25,66,117,105,108,116,105, + 110,73,109,112,111,114,116,101,114,46,102,105,110,100,95,115, + 112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,4,0,0,0,67,0,0,0,115,30,0,0, + 0,124,0,160,0,124,1,124,2,161,2,125,3,124,3,100, + 1,117,1,114,26,124,3,106,1,83,0,100,1,83,0,41, + 2,122,175,70,105,110,100,32,116,104,101,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,46,10,10,32,32, + 32,32,32,32,32,32,73,102,32,39,112,97,116,104,39,32, + 105,115,32,101,118,101,114,32,115,112,101,99,105,102,105,101, + 100,32,116,104,101,110,32,116,104,101,32,115,101,97,114,99, + 104,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32, + 97,32,102,97,105,108,117,114,101,46,10,10,32,32,32,32, + 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, + 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, + 32,32,78,41,2,114,177,0,0,0,114,116,0,0,0,41, + 4,114,174,0,0,0,114,85,0,0,0,114,175,0,0,0, + 114,103,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,11,102,105,110,100,95,109,111,100,117,108, + 101,251,2,0,0,115,6,0,0,0,12,9,18,1,255,128, + 122,27,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,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, + 0,0,67,0,0,0,115,46,0,0,0,124,0,106,0,116, + 1,106,2,118,1,114,34,116,3,100,1,160,4,124,0,106, + 0,161,1,124,0,106,0,100,2,141,2,130,1,116,5,116, + 6,106,7,124,0,131,2,83,0,41,4,122,24,67,114,101, + 97,116,101,32,97,32,98,117,105,108,116,45,105,110,32,109, + 111,100,117,108,101,114,81,0,0,0,114,19,0,0,0,78, + 41,8,114,20,0,0,0,114,18,0,0,0,114,82,0,0, + 0,114,83,0,0,0,114,49,0,0,0,114,71,0,0,0, + 114,61,0,0,0,90,14,99,114,101,97,116,101,95,98,117, + 105,108,116,105,110,114,168,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,156,0,0,0,7,3, + 0,0,115,12,0,0,0,12,3,12,1,4,1,6,255,12, + 2,255,128,122,29,66,117,105,108,116,105,110,73,109,112,111, + 114,116,101,114,46,99,114,101,97,116,101,95,109,111,100,117, + 108,101,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,16,0,0,0, + 116,0,116,1,106,2,124,0,131,2,1,0,100,1,83,0, + 41,2,122,22,69,120,101,99,32,97,32,98,117,105,108,116, + 45,105,110,32,109,111,100,117,108,101,78,41,3,114,71,0, + 0,0,114,61,0,0,0,90,12,101,120,101,99,95,98,117, + 105,108,116,105,110,114,171,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,157,0,0,0,15,3, + 0,0,115,4,0,0,0,16,3,255,128,122,27,66,117,105, + 108,116,105,110,73,109,112,111,114,116,101,114,46,101,120,101, + 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,57,82,101, + 116,117,114,110,32,78,111,110,101,32,97,115,32,98,117,105, + 108,116,45,105,110,32,109,111,100,117,108,101,115,32,100,111, + 32,110,111,116,32,104,97,118,101,32,99,111,100,101,32,111, + 98,106,101,99,116,115,46,78,114,5,0,0,0,169,2,114, + 174,0,0,0,114,85,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,8,103,101,116,95,99,111, + 100,101,20,3,0,0,115,4,0,0,0,4,4,255,128,122, + 24,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,56,82, + 101,116,117,114,110,32,78,111,110,101,32,97,115,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,100, + 111,32,110,111,116,32,104,97,118,101,32,115,111,117,114,99, + 101,32,99,111,100,101,46,78,114,5,0,0,0,114,179,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,10,103,101,116,95,115,111,117,114,99,101,26,3,0, + 0,115,4,0,0,0,4,4,255,128,122,26,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,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,1,83,0,41,3,122,52,82,101,116,117, + 114,110,32,70,97,108,115,101,32,97,115,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,115,32,97,114,101, + 32,110,101,118,101,114,32,112,97,99,107,97,103,101,115,46, + 70,78,114,5,0,0,0,114,179,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,122,0,0,0, + 32,3,0,0,115,4,0,0,0,4,4,255,128,122,26,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,41,2,78,78,41,1,78, + 41,18,114,9,0,0,0,114,8,0,0,0,114,1,0,0, + 0,114,10,0,0,0,114,145,0,0,0,218,12,115,116,97, + 116,105,99,109,101,116,104,111,100,114,107,0,0,0,218,11, + 99,108,97,115,115,109,101,116,104,111,100,114,177,0,0,0, + 114,178,0,0,0,114,156,0,0,0,114,157,0,0,0,114, + 90,0,0,0,114,180,0,0,0,114,181,0,0,0,114,122, + 0,0,0,114,105,0,0,0,114,164,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,169,0,0,0,222,2,0,0,115,48,0,0,0,8, + 0,4,2,4,7,2,2,10,1,2,8,12,1,2,8,12, + 1,2,11,10,1,2,7,10,1,2,4,2,1,12,1,2, + 4,2,1,12,1,2,4,2,1,12,1,12,4,255,128,114, + 169,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,64,0,0,0,115,144,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 90,4,101,5,100,3,100,4,132,0,131,1,90,6,101,7, + 100,22,100,6,100,7,132,1,131,1,90,8,101,7,100,23, + 100,8,100,9,132,1,131,1,90,9,101,5,100,10,100,11, + 132,0,131,1,90,10,101,5,100,12,100,13,132,0,131,1, + 90,11,101,7,100,14,100,15,132,0,131,1,90,12,101,7, + 101,13,100,16,100,17,132,0,131,1,131,1,90,14,101,7, + 101,13,100,18,100,19,132,0,131,1,131,1,90,15,101,7, + 101,13,100,20,100,21,132,0,131,1,131,1,90,16,100,5, + 83,0,41,24,218,14,70,114,111,122,101,110,73,109,112,111, + 114,116,101,114,122,142,77,101,116,97,32,112,97,116,104,32, + 105,109,112,111,114,116,32,102,111,114,32,102,114,111,122,101, + 110,32,109,111,100,117,108,101,115,46,10,10,32,32,32,32, + 65,108,108,32,109,101,116,104,111,100,115,32,97,114,101,32, + 101,105,116,104,101,114,32,99,108,97,115,115,32,111,114,32, + 115,116,97,116,105,99,32,109,101,116,104,111,100,115,32,116, + 111,32,97,118,111,105,100,32,116,104,101,32,110,101,101,100, + 32,116,111,10,32,32,32,32,105,110,115,116,97,110,116,105, + 97,116,101,32,116,104,101,32,99,108,97,115,115,46,10,10, + 32,32,32,32,90,6,102,114,111,122,101,110,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, + 0,67,0,0,0,115,16,0,0,0,100,1,160,0,124,0, + 106,1,116,2,106,3,161,2,83,0,41,3,114,170,0,0, + 0,114,160,0,0,0,78,41,4,114,49,0,0,0,114,9, + 0,0,0,114,184,0,0,0,114,145,0,0,0,41,1,218, + 1,109,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,107,0,0,0,52,3,0,0,115,4,0,0,0,16, + 7,255,128,122,26,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,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,5,0,0,0,67,0,0,0,115,30,0,0,0,116,0, + 160,1,124,1,161,1,114,26,116,2,124,1,124,0,124,0, + 106,3,100,1,141,3,83,0,100,0,83,0,114,172,0,0, + 0,41,4,114,61,0,0,0,114,92,0,0,0,114,98,0, + 0,0,114,145,0,0,0,114,173,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,177,0,0,0, + 61,3,0,0,115,8,0,0,0,10,2,16,1,4,2,255, + 128,122,24,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,18,0,0,0,116,0,160,1,124,1,161, + 1,114,14,124,0,83,0,100,1,83,0,41,2,122,93,70, + 105,110,100,32,97,32,102,114,111,122,101,110,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, + 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,32,85,115,101,32,102,105, + 110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,32,32,32,32,78,41,2,114, + 61,0,0,0,114,92,0,0,0,41,3,114,174,0,0,0, + 114,85,0,0,0,114,175,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,178,0,0,0,68,3, + 0,0,115,4,0,0,0,18,7,255,128,122,26,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,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,42,85,115,101, + 32,100,101,102,97,117,108,116,32,115,101,109,97,110,116,105, + 99,115,32,102,111,114,32,109,111,100,117,108,101,32,99,114, + 101,97,116,105,111,110,46,78,114,5,0,0,0,114,168,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,156,0,0,0,77,3,0,0,115,4,0,0,0,4, + 0,255,128,122,28,70,114,111,122,101,110,73,109,112,111,114, + 116,101,114,46,99,114,101,97,116,101,95,109,111,100,117,108, + 101,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,124, + 0,106,0,106,1,125,1,116,2,160,3,124,1,161,1,115, + 36,116,4,100,1,160,5,124,1,161,1,124,1,100,2,141, + 2,130,1,116,6,116,2,106,7,124,1,131,2,125,2,116, + 8,124,2,124,0,106,9,131,2,1,0,100,0,83,0,114, + 91,0,0,0,41,10,114,113,0,0,0,114,20,0,0,0, + 114,61,0,0,0,114,92,0,0,0,114,83,0,0,0,114, + 49,0,0,0,114,71,0,0,0,218,17,103,101,116,95,102, + 114,111,122,101,110,95,111,98,106,101,99,116,218,4,101,120, + 101,99,114,14,0,0,0,41,3,114,104,0,0,0,114,20, + 0,0,0,218,4,99,111,100,101,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,157,0,0,0,81,3,0, + 0,115,16,0,0,0,8,2,10,1,10,1,2,1,6,255, + 12,2,16,1,255,128,122,26,70,114,111,122,101,110,73,109, + 112,111,114,116,101,114,46,101,120,101,99,95,109,111,100,117, + 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0, + 116,0,124,0,124,1,131,2,83,0,41,2,122,95,76,111, + 97,100,32,97,32,102,114,111,122,101,110,32,109,111,100,117, + 108,101,46,10,10,32,32,32,32,32,32,32,32,84,104,105, + 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, + 101,99,97,116,101,100,46,32,32,85,115,101,32,101,120,101, + 99,95,109,111,100,117,108,101,40,41,32,105,110,115,116,101, + 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,1, + 114,105,0,0,0,114,179,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,164,0,0,0,90,3, + 0,0,115,4,0,0,0,10,8,255,128,122,26,70,114,111, + 122,101,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,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,10,0,0,0,116,0,160,1,124,1,161,1,83,0,41, + 2,122,45,82,101,116,117,114,110,32,116,104,101,32,99,111, + 100,101,32,111,98,106,101,99,116,32,102,111,114,32,116,104, + 101,32,102,114,111,122,101,110,32,109,111,100,117,108,101,46, + 78,41,2,114,61,0,0,0,114,186,0,0,0,114,179,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,180,0,0,0,100,3,0,0,115,4,0,0,0,10, + 4,255,128,122,23,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,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, + 122,54,82,101,116,117,114,110,32,78,111,110,101,32,97,115, + 32,102,114,111,122,101,110,32,109,111,100,117,108,101,115,32, + 100,111,32,110,111,116,32,104,97,118,101,32,115,111,117,114, + 99,101,32,99,111,100,101,46,78,114,5,0,0,0,114,179, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,114,181,0,0,0,106,3,0,0,115,4,0,0,0, + 4,4,255,128,122,25,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,0,0,0,0,2,0,0,0, + 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,160, + 1,124,1,161,1,83,0,41,2,122,46,82,101,116,117,114, + 110,32,84,114,117,101,32,105,102,32,116,104,101,32,102,114, + 111,122,101,110,32,109,111,100,117,108,101,32,105,115,32,97, + 32,112,97,99,107,97,103,101,46,78,41,2,114,61,0,0, + 0,90,17,105,115,95,102,114,111,122,101,110,95,112,97,99, + 107,97,103,101,114,179,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,122,0,0,0,112,3,0, + 0,115,4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17,114,9, + 0,0,0,114,8,0,0,0,114,1,0,0,0,114,10,0, + 0,0,114,145,0,0,0,114,182,0,0,0,114,107,0,0, + 0,114,183,0,0,0,114,177,0,0,0,114,178,0,0,0, + 114,156,0,0,0,114,157,0,0,0,114,164,0,0,0,114, + 94,0,0,0,114,180,0,0,0,114,181,0,0,0,114,122, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,184,0,0,0,41,3,0,0, + 115,50,0,0,0,8,0,4,2,4,7,2,2,10,1,2, + 8,12,1,2,6,12,1,2,8,10,1,2,3,10,1,2, + 8,10,1,2,9,2,1,12,1,2,4,2,1,12,1,2, + 4,2,1,16,1,255,128,114,184,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,64,0,0,0,115,32,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, + 100,5,132,0,90,5,100,6,83,0,41,7,218,18,95,73, + 109,112,111,114,116,76,111,99,107,67,111,110,116,101,120,116, + 122,36,67,111,110,116,101,120,116,32,109,97,110,97,103,101, + 114,32,102,111,114,32,116,104,101,32,105,109,112,111,114,116, + 32,108,111,99,107,46,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, + 12,0,0,0,116,0,160,1,161,0,1,0,100,1,83,0, + 41,2,122,24,65,99,113,117,105,114,101,32,116,104,101,32, + 105,109,112,111,114,116,32,108,111,99,107,46,78,41,2,114, + 61,0,0,0,114,62,0,0,0,114,51,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,58,0, + 0,0,125,3,0,0,115,4,0,0,0,12,2,255,128,122, + 28,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,0,0,0,0,4,0,0,0,2,0, + 0,0,67,0,0,0,115,12,0,0,0,116,0,160,1,161, + 0,1,0,100,1,83,0,41,2,122,60,82,101,108,101,97, + 115,101,32,116,104,101,32,105,109,112,111,114,116,32,108,111, + 99,107,32,114,101,103,97,114,100,108,101,115,115,32,111,102, + 32,97,110,121,32,114,97,105,115,101,100,32,101,120,99,101, + 112,116,105,111,110,115,46,78,41,2,114,61,0,0,0,114, + 64,0,0,0,41,4,114,33,0,0,0,218,8,101,120,99, + 95,116,121,112,101,218,9,101,120,99,95,118,97,108,117,101, + 218,13,101,120,99,95,116,114,97,99,101,98,97,99,107,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,60, + 0,0,0,129,3,0,0,115,4,0,0,0,12,2,255,128, + 122,27,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,41,6, 114,9,0,0,0,114,8,0,0,0,114,1,0,0,0,114, - 10,0,0,0,114,145,0,0,0,114,182,0,0,0,114,107, - 0,0,0,114,183,0,0,0,114,177,0,0,0,114,178,0, - 0,0,114,156,0,0,0,114,157,0,0,0,114,164,0,0, - 0,114,94,0,0,0,114,180,0,0,0,114,181,0,0,0, - 114,122,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,184,0,0,0,41,3, - 0,0,115,50,0,0,0,8,0,4,2,4,7,2,2,10, - 1,2,8,12,1,2,6,12,1,2,8,10,1,2,3,10, - 1,2,8,10,1,2,9,2,1,12,1,2,4,2,1,12, - 1,2,4,2,1,16,1,255,128,114,184,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,64,0,0,0,115,32,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, - 100,4,100,5,132,0,90,5,100,6,83,0,41,7,218,18, - 95,73,109,112,111,114,116,76,111,99,107,67,111,110,116,101, - 120,116,122,36,67,111,110,116,101,120,116,32,109,97,110,97, - 103,101,114,32,102,111,114,32,116,104,101,32,105,109,112,111, - 114,116,32,108,111,99,107,46,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,0, - 0,115,12,0,0,0,116,0,160,1,161,0,1,0,100,1, - 83,0,41,2,122,24,65,99,113,117,105,114,101,32,116,104, - 101,32,105,109,112,111,114,116,32,108,111,99,107,46,78,41, - 2,114,61,0,0,0,114,62,0,0,0,114,51,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 58,0,0,0,125,3,0,0,115,4,0,0,0,12,2,255, - 128,122,28,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,0,0,0,0,4,0,0,0, - 2,0,0,0,67,0,0,0,115,12,0,0,0,116,0,160, - 1,161,0,1,0,100,1,83,0,41,2,122,60,82,101,108, - 101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32, - 108,111,99,107,32,114,101,103,97,114,100,108,101,115,115,32, - 111,102,32,97,110,121,32,114,97,105,115,101,100,32,101,120, - 99,101,112,116,105,111,110,115,46,78,41,2,114,61,0,0, - 0,114,64,0,0,0,41,4,114,33,0,0,0,218,8,101, - 120,99,95,116,121,112,101,218,9,101,120,99,95,118,97,108, - 117,101,218,13,101,120,99,95,116,114,97,99,101,98,97,99, - 107,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,60,0,0,0,129,3,0,0,115,4,0,0,0,12,2, - 255,128,122,27,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, - 41,6,114,9,0,0,0,114,8,0,0,0,114,1,0,0, - 0,114,10,0,0,0,114,58,0,0,0,114,60,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,189,0,0,0,121,3,0,0,115,10,0, - 0,0,8,0,4,2,8,2,12,4,255,128,114,189,0,0, - 0,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,5,0,0,0,67,0,0,0,115,64,0,0,0,124, - 1,160,0,100,1,124,2,100,2,24,0,161,2,125,3,116, - 1,124,3,131,1,124,2,107,0,114,36,116,2,100,3,131, - 1,130,1,124,3,100,4,25,0,125,4,124,0,114,60,100, - 5,160,3,124,4,124,0,161,2,83,0,124,4,83,0,41, - 7,122,50,82,101,115,111,108,118,101,32,97,32,114,101,108, - 97,116,105,118,101,32,109,111,100,117,108,101,32,110,97,109, - 101,32,116,111,32,97,110,32,97,98,115,111,108,117,116,101, - 32,111,110,101,46,114,135,0,0,0,114,42,0,0,0,122, - 50,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, - 105,118,101,32,105,109,112,111,114,116,32,98,101,121,111,110, - 100,32,116,111,112,45,108,101,118,101,108,32,112,97,99,107, - 97,103,101,114,25,0,0,0,250,5,123,125,46,123,125,78, - 41,4,218,6,114,115,112,108,105,116,218,3,108,101,110,114, - 83,0,0,0,114,49,0,0,0,41,5,114,20,0,0,0, - 218,7,112,97,99,107,97,103,101,218,5,108,101,118,101,108, - 90,4,98,105,116,115,90,4,98,97,115,101,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,13,95,114,101, - 115,111,108,118,101,95,110,97,109,101,134,3,0,0,115,12, - 0,0,0,16,2,12,1,8,1,8,1,20,1,255,128,114, - 198,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,4,0,0,0,67,0,0,0,115,34,0, - 0,0,124,0,160,0,124,1,124,2,161,2,125,3,124,3, - 100,0,117,0,114,24,100,0,83,0,116,1,124,1,124,3, - 131,2,83,0,114,0,0,0,0,41,2,114,178,0,0,0, - 114,98,0,0,0,41,4,218,6,102,105,110,100,101,114,114, - 20,0,0,0,114,175,0,0,0,114,116,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,17,95, - 102,105,110,100,95,115,112,101,99,95,108,101,103,97,99,121, - 143,3,0,0,115,10,0,0,0,12,3,8,1,4,1,10, - 1,255,128,114,200,0,0,0,99,3,0,0,0,0,0,0, - 0,0,0,0,0,10,0,0,0,10,0,0,0,67,0,0, - 0,115,28,1,0,0,116,0,106,1,125,3,124,3,100,1, - 117,0,114,22,116,2,100,2,131,1,130,1,124,3,115,38, - 116,3,160,4,100,3,116,5,161,2,1,0,124,0,116,0, - 106,6,118,0,125,4,124,3,68,0,93,226,125,5,116,7, - 131,0,143,94,1,0,122,10,124,5,106,8,125,6,87,0, - 110,54,4,0,116,9,121,128,1,0,1,0,1,0,116,10, - 124,5,124,0,124,1,131,3,125,7,124,7,100,1,117,0, - 114,124,89,0,87,0,100,1,4,0,4,0,131,3,1,0, - 113,52,89,0,110,14,48,0,124,6,124,0,124,1,124,2, - 131,3,125,7,87,0,100,1,4,0,4,0,131,3,1,0, - 110,16,49,0,115,162,48,0,1,0,1,0,1,0,89,0, - 1,0,124,7,100,1,117,1,114,52,124,4,144,1,115,16, - 124,0,116,0,106,6,118,0,144,1,114,16,116,0,106,6, - 124,0,25,0,125,8,122,10,124,8,106,11,125,9,87,0, - 110,26,4,0,116,9,121,244,1,0,1,0,1,0,124,7, - 6,0,89,0,2,0,1,0,83,0,48,0,124,9,100,1, - 117,0,144,1,114,8,124,7,2,0,1,0,83,0,124,9, - 2,0,1,0,83,0,124,7,2,0,1,0,83,0,100,1, - 83,0,41,4,122,21,70,105,110,100,32,97,32,109,111,100, - 117,108,101,39,115,32,115,112,101,99,46,78,122,53,115,121, - 115,46,109,101,116,97,95,112,97,116,104,32,105,115,32,78, - 111,110,101,44,32,80,121,116,104,111,110,32,105,115,32,108, - 105,107,101,108,121,32,115,104,117,116,116,105,110,103,32,100, - 111,119,110,122,22,115,121,115,46,109,101,116,97,95,112,97, - 116,104,32,105,115,32,101,109,112,116,121,41,12,114,18,0, - 0,0,218,9,109,101,116,97,95,112,97,116,104,114,83,0, - 0,0,114,95,0,0,0,114,96,0,0,0,114,163,0,0, - 0,114,99,0,0,0,114,189,0,0,0,114,177,0,0,0, - 114,2,0,0,0,114,200,0,0,0,114,113,0,0,0,41, - 10,114,20,0,0,0,114,175,0,0,0,114,176,0,0,0, - 114,201,0,0,0,90,9,105,115,95,114,101,108,111,97,100, - 114,199,0,0,0,114,177,0,0,0,114,103,0,0,0,114, - 104,0,0,0,114,113,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,10,95,102,105,110,100,95, - 115,112,101,99,152,3,0,0,115,56,0,0,0,6,2,8, - 1,8,2,4,3,12,1,10,5,8,1,8,1,2,1,10, - 1,12,1,12,1,8,1,22,1,42,2,8,1,18,2,10, - 1,2,1,10,1,12,1,14,4,10,2,8,1,8,2,8, - 2,4,2,255,128,114,202,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,5,0,0,0,67, - 0,0,0,115,110,0,0,0,116,0,124,0,116,1,131,2, - 115,28,116,2,100,1,160,3,116,4,124,0,131,1,161,1, - 131,1,130,1,124,2,100,2,107,0,114,44,116,5,100,3, - 131,1,130,1,124,2,100,2,107,4,114,82,116,0,124,1, - 116,1,131,2,115,70,116,2,100,4,131,1,130,1,124,1, - 115,82,116,6,100,5,131,1,130,1,124,0,115,106,124,2, - 100,2,107,2,114,102,116,5,100,6,131,1,130,1,100,7, - 83,0,100,7,83,0,41,8,122,28,86,101,114,105,102,121, - 32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,34, - 115,97,110,101,34,46,122,31,109,111,100,117,108,101,32,110, - 97,109,101,32,109,117,115,116,32,98,101,32,115,116,114,44, - 32,110,111,116,32,123,125,114,25,0,0,0,122,18,108,101, - 118,101,108,32,109,117,115,116,32,98,101,32,62,61,32,48, - 122,31,95,95,112,97,99,107,97,103,101,95,95,32,110,111, - 116,32,115,101,116,32,116,111,32,97,32,115,116,114,105,110, - 103,122,54,97,116,116,101,109,112,116,101,100,32,114,101,108, - 97,116,105,118,101,32,105,109,112,111,114,116,32,119,105,116, - 104,32,110,111,32,107,110,111,119,110,32,112,97,114,101,110, - 116,32,112,97,99,107,97,103,101,122,17,69,109,112,116,121, - 32,109,111,100,117,108,101,32,110,97,109,101,78,41,7,218, - 10,105,115,105,110,115,116,97,110,99,101,218,3,115,116,114, - 218,9,84,121,112,101,69,114,114,111,114,114,49,0,0,0, - 114,3,0,0,0,218,10,86,97,108,117,101,69,114,114,111, - 114,114,83,0,0,0,169,3,114,20,0,0,0,114,196,0, - 0,0,114,197,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,13,95,115,97,110,105,116,121,95, - 99,104,101,99,107,199,3,0,0,115,26,0,0,0,10,2, - 18,1,8,1,8,1,8,1,10,1,8,1,4,1,8,1, - 12,2,8,1,8,255,255,128,114,208,0,0,0,122,16,78, - 111,32,109,111,100,117,108,101,32,110,97,109,101,100,32,122, - 4,123,33,114,125,99,2,0,0,0,0,0,0,0,0,0, - 0,0,9,0,0,0,8,0,0,0,67,0,0,0,115,20, - 1,0,0,100,0,125,2,124,0,160,0,100,1,161,1,100, - 2,25,0,125,3,124,3,114,128,124,3,116,1,106,2,118, - 1,114,42,116,3,124,1,124,3,131,2,1,0,124,0,116, - 1,106,2,118,0,114,62,116,1,106,2,124,0,25,0,83, - 0,116,1,106,2,124,3,25,0,125,4,122,10,124,4,106, - 4,125,2,87,0,110,44,4,0,116,5,121,126,1,0,1, - 0,1,0,116,6,100,3,23,0,160,7,124,0,124,3,161, - 2,125,5,116,8,124,5,124,0,100,4,141,2,100,0,130, - 2,48,0,116,9,124,0,124,2,131,2,125,6,124,6,100, - 0,117,0,114,164,116,8,116,6,160,7,124,0,161,1,124, - 0,100,4,141,2,130,1,116,10,124,6,131,1,125,7,124, - 3,144,1,114,16,116,1,106,2,124,3,25,0,125,4,124, - 0,160,0,100,1,161,1,100,5,25,0,125,8,122,18,116, - 11,124,4,124,8,124,7,131,3,1,0,87,0,124,7,83, - 0,4,0,116,5,144,1,121,14,1,0,1,0,1,0,100, - 6,124,3,155,2,100,7,124,8,155,2,157,4,125,5,116, - 12,160,13,124,5,116,14,161,2,1,0,89,0,124,7,83, - 0,48,0,124,7,83,0,41,8,78,114,135,0,0,0,114, - 25,0,0,0,122,23,59,32,123,33,114,125,32,105,115,32, - 110,111,116,32,97,32,112,97,99,107,97,103,101,114,19,0, - 0,0,233,2,0,0,0,122,27,67,97,110,110,111,116,32, - 115,101,116,32,97,110,32,97,116,116,114,105,98,117,116,101, - 32,111,110,32,122,18,32,102,111,114,32,99,104,105,108,100, - 32,109,111,100,117,108,101,32,41,15,114,136,0,0,0,114, - 18,0,0,0,114,99,0,0,0,114,71,0,0,0,114,148, - 0,0,0,114,2,0,0,0,218,8,95,69,82,82,95,77, - 83,71,114,49,0,0,0,218,19,77,111,100,117,108,101,78, - 111,116,70,111,117,110,100,69,114,114,111,114,114,202,0,0, - 0,114,167,0,0,0,114,12,0,0,0,114,95,0,0,0, - 114,96,0,0,0,114,163,0,0,0,41,9,114,20,0,0, - 0,218,7,105,109,112,111,114,116,95,114,175,0,0,0,114, - 137,0,0,0,90,13,112,97,114,101,110,116,95,109,111,100, - 117,108,101,114,102,0,0,0,114,103,0,0,0,114,104,0, - 0,0,90,5,99,104,105,108,100,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,95, - 97,110,100,95,108,111,97,100,95,117,110,108,111,99,107,101, - 100,218,3,0,0,115,60,0,0,0,4,1,14,1,4,1, - 10,1,10,1,10,2,10,1,10,1,2,1,10,1,12,1, - 16,1,16,1,10,1,8,1,18,1,8,2,6,1,10,2, - 14,1,2,1,14,1,4,4,14,253,16,1,14,1,4,1, - 2,255,4,1,255,128,114,213,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,8,0,0,0, - 67,0,0,0,115,128,0,0,0,116,0,124,0,131,1,143, - 62,1,0,116,1,106,2,160,3,124,0,116,4,161,2,125, - 2,124,2,116,4,117,0,114,56,116,5,124,0,124,1,131, - 2,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, - 0,87,0,100,1,4,0,4,0,131,3,1,0,110,16,49, - 0,115,76,48,0,1,0,1,0,1,0,89,0,1,0,124, - 2,100,1,117,0,114,116,100,2,160,6,124,0,161,1,125, - 3,116,7,124,3,124,0,100,3,141,2,130,1,116,8,124, - 0,131,1,1,0,124,2,83,0,41,4,122,25,70,105,110, - 100,32,97,110,100,32,108,111,97,100,32,116,104,101,32,109, - 111,100,117,108,101,46,78,122,40,105,109,112,111,114,116,32, - 111,102,32,123,125,32,104,97,108,116,101,100,59,32,78,111, - 110,101,32,105,110,32,115,121,115,46,109,111,100,117,108,101, - 115,114,19,0,0,0,41,9,114,54,0,0,0,114,18,0, - 0,0,114,99,0,0,0,114,38,0,0,0,218,14,95,78, - 69,69,68,83,95,76,79,65,68,73,78,71,114,213,0,0, - 0,114,49,0,0,0,114,211,0,0,0,114,69,0,0,0, - 41,4,114,20,0,0,0,114,212,0,0,0,114,104,0,0, - 0,114,79,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,14,95,102,105,110,100,95,97,110,100, - 95,108,111,97,100,253,3,0,0,115,24,0,0,0,10,2, - 14,1,8,1,54,1,8,2,4,1,2,1,4,255,12,2, - 8,2,4,1,255,128,114,215,0,0,0,114,25,0,0,0, - 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,4,0,0,0,67,0,0,0,115,42,0,0,0,116,0, - 124,0,124,1,124,2,131,3,1,0,124,2,100,1,107,4, - 114,32,116,1,124,0,124,1,124,2,131,3,125,0,116,2, - 124,0,116,3,131,2,83,0,41,3,97,50,1,0,0,73, - 109,112,111,114,116,32,97,110,100,32,114,101,116,117,114,110, - 32,116,104,101,32,109,111,100,117,108,101,32,98,97,115,101, - 100,32,111,110,32,105,116,115,32,110,97,109,101,44,32,116, - 104,101,32,112,97,99,107,97,103,101,32,116,104,101,32,99, - 97,108,108,32,105,115,10,32,32,32,32,98,101,105,110,103, - 32,109,97,100,101,32,102,114,111,109,44,32,97,110,100,32, - 116,104,101,32,108,101,118,101,108,32,97,100,106,117,115,116, - 109,101,110,116,46,10,10,32,32,32,32,84,104,105,115,32, - 102,117,110,99,116,105,111,110,32,114,101,112,114,101,115,101, - 110,116,115,32,116,104,101,32,103,114,101,97,116,101,115,116, - 32,99,111,109,109,111,110,32,100,101,110,111,109,105,110,97, - 116,111,114,32,111,102,32,102,117,110,99,116,105,111,110,97, - 108,105,116,121,10,32,32,32,32,98,101,116,119,101,101,110, - 32,105,109,112,111,114,116,95,109,111,100,117,108,101,32,97, - 110,100,32,95,95,105,109,112,111,114,116,95,95,46,32,84, - 104,105,115,32,105,110,99,108,117,100,101,115,32,115,101,116, - 116,105,110,103,32,95,95,112,97,99,107,97,103,101,95,95, - 32,105,102,10,32,32,32,32,116,104,101,32,108,111,97,100, - 101,114,32,100,105,100,32,110,111,116,46,10,10,32,32,32, - 32,114,25,0,0,0,78,41,4,114,208,0,0,0,114,198, - 0,0,0,114,215,0,0,0,218,11,95,103,99,100,95,105, - 109,112,111,114,116,114,207,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,216,0,0,0,13,4, - 0,0,115,10,0,0,0,12,9,8,1,12,1,10,1,255, - 128,114,216,0,0,0,169,1,218,9,114,101,99,117,114,115, - 105,118,101,99,3,0,0,0,0,0,0,0,1,0,0,0, - 8,0,0,0,11,0,0,0,67,0,0,0,115,216,0,0, - 0,124,1,68,0,93,204,125,4,116,0,124,4,116,1,131, - 2,115,64,124,3,114,34,124,0,106,2,100,1,23,0,125, - 5,110,4,100,2,125,5,116,3,100,3,124,5,155,0,100, - 4,116,4,124,4,131,1,106,2,155,0,157,4,131,1,130, - 1,124,4,100,5,107,2,114,106,124,3,115,4,116,5,124, - 0,100,6,131,2,114,4,116,6,124,0,124,0,106,7,124, - 2,100,7,100,8,141,4,1,0,113,4,116,5,124,0,124, - 4,131,2,115,4,100,9,160,8,124,0,106,2,124,4,161, - 2,125,6,122,14,116,9,124,2,124,6,131,2,1,0,87, - 0,113,4,4,0,116,10,121,214,1,0,125,7,1,0,122, - 42,124,7,106,11,124,6,107,2,114,200,116,12,106,13,160, - 14,124,6,116,15,161,2,100,10,117,1,114,200,87,0,89, - 0,100,10,125,7,126,7,113,4,130,0,100,10,125,7,126, - 7,48,0,124,0,83,0,48,0,41,11,122,238,70,105,103, - 117,114,101,32,111,117,116,32,119,104,97,116,32,95,95,105, - 109,112,111,114,116,95,95,32,115,104,111,117,108,100,32,114, - 101,116,117,114,110,46,10,10,32,32,32,32,84,104,101,32, - 105,109,112,111,114,116,95,32,112,97,114,97,109,101,116,101, - 114,32,105,115,32,97,32,99,97,108,108,97,98,108,101,32, - 119,104,105,99,104,32,116,97,107,101,115,32,116,104,101,32, - 110,97,109,101,32,111,102,32,109,111,100,117,108,101,32,116, - 111,10,32,32,32,32,105,109,112,111,114,116,46,32,73,116, - 32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32, - 100,101,99,111,117,112,108,101,32,116,104,101,32,102,117,110, - 99,116,105,111,110,32,102,114,111,109,32,97,115,115,117,109, - 105,110,103,32,105,109,112,111,114,116,108,105,98,39,115,10, - 32,32,32,32,105,109,112,111,114,116,32,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,32,105,115,32,100,101,115, - 105,114,101,100,46,10,10,32,32,32,32,122,8,46,95,95, - 97,108,108,95,95,122,13,96,96,102,114,111,109,32,108,105, - 115,116,39,39,122,8,73,116,101,109,32,105,110,32,122,18, - 32,109,117,115,116,32,98,101,32,115,116,114,44,32,110,111, - 116,32,250,1,42,218,7,95,95,97,108,108,95,95,84,114, - 217,0,0,0,114,193,0,0,0,78,41,16,114,203,0,0, - 0,114,204,0,0,0,114,9,0,0,0,114,205,0,0,0, - 114,3,0,0,0,114,11,0,0,0,218,16,95,104,97,110, - 100,108,101,95,102,114,111,109,108,105,115,116,114,220,0,0, - 0,114,49,0,0,0,114,71,0,0,0,114,211,0,0,0, - 114,20,0,0,0,114,18,0,0,0,114,99,0,0,0,114, - 38,0,0,0,114,214,0,0,0,41,8,114,104,0,0,0, - 218,8,102,114,111,109,108,105,115,116,114,212,0,0,0,114, - 218,0,0,0,218,1,120,90,5,119,104,101,114,101,90,9, - 102,114,111,109,95,110,97,109,101,90,3,101,120,99,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,221,0, - 0,0,28,4,0,0,115,54,0,0,0,8,10,10,1,4, - 1,12,1,4,2,10,1,8,1,8,255,8,2,14,1,10, - 1,2,1,8,255,10,2,14,1,2,1,14,1,14,1,10, - 4,16,1,2,255,12,2,2,1,8,128,4,1,2,248,255, - 128,114,221,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,6,0,0,0,67,0,0,0,115, - 146,0,0,0,124,0,160,0,100,1,161,1,125,1,124,0, - 160,0,100,2,161,1,125,2,124,1,100,3,117,1,114,82, - 124,2,100,3,117,1,114,78,124,1,124,2,106,1,107,3, - 114,78,116,2,106,3,100,4,124,1,155,2,100,5,124,2, - 106,1,155,2,100,6,157,5,116,4,100,7,100,8,141,3, - 1,0,124,1,83,0,124,2,100,3,117,1,114,96,124,2, - 106,1,83,0,116,2,106,3,100,9,116,4,100,7,100,8, - 141,3,1,0,124,0,100,10,25,0,125,1,100,11,124,0, - 118,1,114,142,124,1,160,5,100,12,161,1,100,13,25,0, - 125,1,124,1,83,0,41,14,122,167,67,97,108,99,117,108, - 97,116,101,32,119,104,97,116,32,95,95,112,97,99,107,97, - 103,101,95,95,32,115,104,111,117,108,100,32,98,101,46,10, - 10,32,32,32,32,95,95,112,97,99,107,97,103,101,95,95, - 32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101, - 101,100,32,116,111,32,98,101,32,100,101,102,105,110,101,100, - 32,111,114,32,99,111,117,108,100,32,98,101,32,115,101,116, - 32,116,111,32,78,111,110,101,10,32,32,32,32,116,111,32, - 114,101,112,114,101,115,101,110,116,32,116,104,97,116,32,105, - 116,115,32,112,114,111,112,101,114,32,118,97,108,117,101,32, - 105,115,32,117,110,107,110,111,119,110,46,10,10,32,32,32, - 32,114,152,0,0,0,114,113,0,0,0,78,122,32,95,95, - 112,97,99,107,97,103,101,95,95,32,33,61,32,95,95,115, - 112,101,99,95,95,46,112,97,114,101,110,116,32,40,122,4, - 32,33,61,32,250,1,41,233,3,0,0,0,41,1,90,10, - 115,116,97,99,107,108,101,118,101,108,122,89,99,97,110,39, - 116,32,114,101,115,111,108,118,101,32,112,97,99,107,97,103, - 101,32,102,114,111,109,32,95,95,115,112,101,99,95,95,32, - 111,114,32,95,95,112,97,99,107,97,103,101,95,95,44,32, - 102,97,108,108,105,110,103,32,98,97,99,107,32,111,110,32, - 95,95,110,97,109,101,95,95,32,97,110,100,32,95,95,112, - 97,116,104,95,95,114,9,0,0,0,114,148,0,0,0,114, - 135,0,0,0,114,25,0,0,0,41,6,114,38,0,0,0, - 114,137,0,0,0,114,95,0,0,0,114,96,0,0,0,114, - 163,0,0,0,114,136,0,0,0,41,3,218,7,103,108,111, - 98,97,108,115,114,196,0,0,0,114,103,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,17,95, - 99,97,108,99,95,95,95,112,97,99,107,97,103,101,95,95, - 65,4,0,0,115,44,0,0,0,10,7,10,1,8,1,18, - 1,6,1,2,1,4,255,4,1,6,255,4,2,6,254,4, - 3,8,1,6,1,6,2,4,2,6,254,8,3,8,1,14, - 1,4,1,255,128,114,227,0,0,0,114,5,0,0,0,99, - 5,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, - 5,0,0,0,67,0,0,0,115,174,0,0,0,124,4,100, - 1,107,2,114,18,116,0,124,0,131,1,125,5,110,36,124, - 1,100,2,117,1,114,30,124,1,110,2,105,0,125,6,116, - 1,124,6,131,1,125,7,116,0,124,0,124,7,124,4,131, - 3,125,5,124,3,115,148,124,4,100,1,107,2,114,84,116, - 0,124,0,160,2,100,3,161,1,100,1,25,0,131,1,83, - 0,124,0,115,92,124,5,83,0,116,3,124,0,131,1,116, - 3,124,0,160,2,100,3,161,1,100,1,25,0,131,1,24, - 0,125,8,116,4,106,5,124,5,106,6,100,2,116,3,124, - 5,106,6,131,1,124,8,24,0,133,2,25,0,25,0,83, - 0,116,7,124,5,100,4,131,2,114,170,116,8,124,5,124, - 3,116,0,131,3,83,0,124,5,83,0,41,5,97,215,1, - 0,0,73,109,112,111,114,116,32,97,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,84,104,101,32,39,103,108,111, - 98,97,108,115,39,32,97,114,103,117,109,101,110,116,32,105, - 115,32,117,115,101,100,32,116,111,32,105,110,102,101,114,32, - 119,104,101,114,101,32,116,104,101,32,105,109,112,111,114,116, - 32,105,115,32,111,99,99,117,114,114,105,110,103,32,102,114, - 111,109,10,32,32,32,32,116,111,32,104,97,110,100,108,101, - 32,114,101,108,97,116,105,118,101,32,105,109,112,111,114,116, - 115,46,32,84,104,101,32,39,108,111,99,97,108,115,39,32, - 97,114,103,117,109,101,110,116,32,105,115,32,105,103,110,111, - 114,101,100,46,32,84,104,101,10,32,32,32,32,39,102,114, - 111,109,108,105,115,116,39,32,97,114,103,117,109,101,110,116, - 32,115,112,101,99,105,102,105,101,115,32,119,104,97,116,32, - 115,104,111,117,108,100,32,101,120,105,115,116,32,97,115,32, - 97,116,116,114,105,98,117,116,101,115,32,111,110,32,116,104, - 101,32,109,111,100,117,108,101,10,32,32,32,32,98,101,105, - 110,103,32,105,109,112,111,114,116,101,100,32,40,101,46,103, - 46,32,96,96,102,114,111,109,32,109,111,100,117,108,101,32, - 105,109,112,111,114,116,32,60,102,114,111,109,108,105,115,116, - 62,96,96,41,46,32,32,84,104,101,32,39,108,101,118,101, - 108,39,10,32,32,32,32,97,114,103,117,109,101,110,116,32, - 114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,112, - 97,99,107,97,103,101,32,108,111,99,97,116,105,111,110,32, - 116,111,32,105,109,112,111,114,116,32,102,114,111,109,32,105, - 110,32,97,32,114,101,108,97,116,105,118,101,10,32,32,32, - 32,105,109,112,111,114,116,32,40,101,46,103,46,32,96,96, - 102,114,111,109,32,46,46,112,107,103,32,105,109,112,111,114, - 116,32,109,111,100,96,96,32,119,111,117,108,100,32,104,97, - 118,101,32,97,32,39,108,101,118,101,108,39,32,111,102,32, - 50,41,46,10,10,32,32,32,32,114,25,0,0,0,78,114, - 135,0,0,0,114,148,0,0,0,41,9,114,216,0,0,0, - 114,227,0,0,0,218,9,112,97,114,116,105,116,105,111,110, - 114,195,0,0,0,114,18,0,0,0,114,99,0,0,0,114, - 9,0,0,0,114,11,0,0,0,114,221,0,0,0,41,9, - 114,20,0,0,0,114,226,0,0,0,218,6,108,111,99,97, - 108,115,114,222,0,0,0,114,197,0,0,0,114,104,0,0, - 0,90,8,103,108,111,98,97,108,115,95,114,196,0,0,0, - 90,7,99,117,116,95,111,102,102,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,10,95,95,105,109,112,111, - 114,116,95,95,92,4,0,0,115,32,0,0,0,8,11,10, - 1,16,2,8,1,12,1,4,1,8,3,18,1,4,1,4, - 1,26,4,30,3,10,1,12,1,4,2,255,128,114,230,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 10,0,0,0,114,58,0,0,0,114,60,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,114,189,0,0,0,121,3,0,0,115,10,0,0,0, + 8,0,4,2,8,2,12,4,255,128,114,189,0,0,0,99, + 3,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 5,0,0,0,67,0,0,0,115,64,0,0,0,124,1,160, + 0,100,1,124,2,100,2,24,0,161,2,125,3,116,1,124, + 3,131,1,124,2,107,0,114,36,116,2,100,3,131,1,130, + 1,124,3,100,4,25,0,125,4,124,0,114,60,100,5,160, + 3,124,4,124,0,161,2,83,0,124,4,83,0,41,7,122, + 50,82,101,115,111,108,118,101,32,97,32,114,101,108,97,116, + 105,118,101,32,109,111,100,117,108,101,32,110,97,109,101,32, + 116,111,32,97,110,32,97,98,115,111,108,117,116,101,32,111, + 110,101,46,114,135,0,0,0,114,42,0,0,0,122,50,97, + 116,116,101,109,112,116,101,100,32,114,101,108,97,116,105,118, + 101,32,105,109,112,111,114,116,32,98,101,121,111,110,100,32, + 116,111,112,45,108,101,118,101,108,32,112,97,99,107,97,103, + 101,114,25,0,0,0,250,5,123,125,46,123,125,78,41,4, + 218,6,114,115,112,108,105,116,218,3,108,101,110,114,83,0, + 0,0,114,49,0,0,0,41,5,114,20,0,0,0,218,7, + 112,97,99,107,97,103,101,218,5,108,101,118,101,108,90,4, + 98,105,116,115,90,4,98,97,115,101,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,13,95,114,101,115,111, + 108,118,101,95,110,97,109,101,134,3,0,0,115,12,0,0, + 0,16,2,12,1,8,1,8,1,20,1,255,128,114,198,0, + 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,4,0,0,0,67,0,0,0,115,34,0,0,0, + 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,0, + 117,0,114,24,100,0,83,0,116,1,124,1,124,3,131,2, + 83,0,114,0,0,0,0,41,2,114,178,0,0,0,114,98, + 0,0,0,41,4,218,6,102,105,110,100,101,114,114,20,0, + 0,0,114,175,0,0,0,114,116,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,17,95,102,105, + 110,100,95,115,112,101,99,95,108,101,103,97,99,121,143,3, + 0,0,115,10,0,0,0,12,3,8,1,4,1,10,1,255, + 128,114,200,0,0,0,99,3,0,0,0,0,0,0,0,0, + 0,0,0,10,0,0,0,10,0,0,0,67,0,0,0,115, + 28,1,0,0,116,0,106,1,125,3,124,3,100,1,117,0, + 114,22,116,2,100,2,131,1,130,1,124,3,115,38,116,3, + 160,4,100,3,116,5,161,2,1,0,124,0,116,0,106,6, + 118,0,125,4,124,3,68,0,93,226,125,5,116,7,131,0, + 143,94,1,0,122,10,124,5,106,8,125,6,87,0,110,54, + 4,0,116,9,121,128,1,0,1,0,1,0,116,10,124,5, + 124,0,124,1,131,3,125,7,124,7,100,1,117,0,114,124, + 89,0,87,0,100,1,4,0,4,0,131,3,1,0,113,52, + 89,0,110,14,48,0,124,6,124,0,124,1,124,2,131,3, + 125,7,87,0,100,1,4,0,4,0,131,3,1,0,110,16, + 49,0,115,162,48,0,1,0,1,0,1,0,89,0,1,0, + 124,7,100,1,117,1,114,52,124,4,144,1,115,16,124,0, + 116,0,106,6,118,0,144,1,114,16,116,0,106,6,124,0, + 25,0,125,8,122,10,124,8,106,11,125,9,87,0,110,26, + 4,0,116,9,121,244,1,0,1,0,1,0,124,7,6,0, + 89,0,2,0,1,0,83,0,48,0,124,9,100,1,117,0, + 144,1,114,8,124,7,2,0,1,0,83,0,124,9,2,0, + 1,0,83,0,124,7,2,0,1,0,83,0,100,1,83,0, + 41,4,122,21,70,105,110,100,32,97,32,109,111,100,117,108, + 101,39,115,32,115,112,101,99,46,78,122,53,115,121,115,46, + 109,101,116,97,95,112,97,116,104,32,105,115,32,78,111,110, + 101,44,32,80,121,116,104,111,110,32,105,115,32,108,105,107, + 101,108,121,32,115,104,117,116,116,105,110,103,32,100,111,119, + 110,122,22,115,121,115,46,109,101,116,97,95,112,97,116,104, + 32,105,115,32,101,109,112,116,121,41,12,114,18,0,0,0, + 218,9,109,101,116,97,95,112,97,116,104,114,83,0,0,0, + 114,95,0,0,0,114,96,0,0,0,114,163,0,0,0,114, + 99,0,0,0,114,189,0,0,0,114,177,0,0,0,114,2, + 0,0,0,114,200,0,0,0,114,113,0,0,0,41,10,114, + 20,0,0,0,114,175,0,0,0,114,176,0,0,0,114,201, + 0,0,0,90,9,105,115,95,114,101,108,111,97,100,114,199, + 0,0,0,114,177,0,0,0,114,103,0,0,0,114,104,0, + 0,0,114,113,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,10,95,102,105,110,100,95,115,112, + 101,99,152,3,0,0,115,56,0,0,0,6,2,8,1,8, + 2,4,3,12,1,10,5,8,1,8,1,2,1,10,1,12, + 1,12,1,8,1,22,1,42,2,8,1,18,2,10,1,2, + 1,10,1,12,1,14,4,10,2,8,1,8,2,8,2,4, + 2,255,128,114,202,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0, + 0,115,110,0,0,0,116,0,124,0,116,1,131,2,115,28, + 116,2,100,1,160,3,116,4,124,0,131,1,161,1,131,1, + 130,1,124,2,100,2,107,0,114,44,116,5,100,3,131,1, + 130,1,124,2,100,2,107,4,114,82,116,0,124,1,116,1, + 131,2,115,70,116,2,100,4,131,1,130,1,124,1,115,82, + 116,6,100,5,131,1,130,1,124,0,115,106,124,2,100,2, + 107,2,114,102,116,5,100,6,131,1,130,1,100,7,83,0, + 100,7,83,0,41,8,122,28,86,101,114,105,102,121,32,97, + 114,103,117,109,101,110,116,115,32,97,114,101,32,34,115,97, + 110,101,34,46,122,31,109,111,100,117,108,101,32,110,97,109, + 101,32,109,117,115,116,32,98,101,32,115,116,114,44,32,110, + 111,116,32,123,125,114,25,0,0,0,122,18,108,101,118,101, + 108,32,109,117,115,116,32,98,101,32,62,61,32,48,122,31, + 95,95,112,97,99,107,97,103,101,95,95,32,110,111,116,32, + 115,101,116,32,116,111,32,97,32,115,116,114,105,110,103,122, + 54,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, + 105,118,101,32,105,109,112,111,114,116,32,119,105,116,104,32, + 110,111,32,107,110,111,119,110,32,112,97,114,101,110,116,32, + 112,97,99,107,97,103,101,122,17,69,109,112,116,121,32,109, + 111,100,117,108,101,32,110,97,109,101,78,41,7,218,10,105, + 115,105,110,115,116,97,110,99,101,218,3,115,116,114,218,9, + 84,121,112,101,69,114,114,111,114,114,49,0,0,0,114,3, + 0,0,0,218,10,86,97,108,117,101,69,114,114,111,114,114, + 83,0,0,0,169,3,114,20,0,0,0,114,196,0,0,0, + 114,197,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,13,95,115,97,110,105,116,121,95,99,104, + 101,99,107,199,3,0,0,115,26,0,0,0,10,2,18,1, + 8,1,8,1,8,1,10,1,8,1,4,1,8,1,12,2, + 8,1,8,255,255,128,114,208,0,0,0,122,16,78,111,32, + 109,111,100,117,108,101,32,110,97,109,101,100,32,122,4,123, + 33,114,125,99,2,0,0,0,0,0,0,0,0,0,0,0, + 9,0,0,0,8,0,0,0,67,0,0,0,115,20,1,0, + 0,100,0,125,2,124,0,160,0,100,1,161,1,100,2,25, + 0,125,3,124,3,114,128,124,3,116,1,106,2,118,1,114, + 42,116,3,124,1,124,3,131,2,1,0,124,0,116,1,106, + 2,118,0,114,62,116,1,106,2,124,0,25,0,83,0,116, + 1,106,2,124,3,25,0,125,4,122,10,124,4,106,4,125, + 2,87,0,110,44,4,0,116,5,121,126,1,0,1,0,1, + 0,116,6,100,3,23,0,160,7,124,0,124,3,161,2,125, + 5,116,8,124,5,124,0,100,4,141,2,100,0,130,2,48, + 0,116,9,124,0,124,2,131,2,125,6,124,6,100,0,117, + 0,114,164,116,8,116,6,160,7,124,0,161,1,124,0,100, + 4,141,2,130,1,116,10,124,6,131,1,125,7,124,3,144, + 1,114,16,116,1,106,2,124,3,25,0,125,4,124,0,160, + 0,100,1,161,1,100,5,25,0,125,8,122,18,116,11,124, + 4,124,8,124,7,131,3,1,0,87,0,124,7,83,0,4, + 0,116,5,144,1,121,14,1,0,1,0,1,0,100,6,124, + 3,155,2,100,7,124,8,155,2,157,4,125,5,116,12,160, + 13,124,5,116,14,161,2,1,0,89,0,124,7,83,0,48, + 0,124,7,83,0,41,8,78,114,135,0,0,0,114,25,0, + 0,0,122,23,59,32,123,33,114,125,32,105,115,32,110,111, + 116,32,97,32,112,97,99,107,97,103,101,114,19,0,0,0, + 233,2,0,0,0,122,27,67,97,110,110,111,116,32,115,101, + 116,32,97,110,32,97,116,116,114,105,98,117,116,101,32,111, + 110,32,122,18,32,102,111,114,32,99,104,105,108,100,32,109, + 111,100,117,108,101,32,41,15,114,136,0,0,0,114,18,0, + 0,0,114,99,0,0,0,114,71,0,0,0,114,148,0,0, + 0,114,2,0,0,0,218,8,95,69,82,82,95,77,83,71, + 114,49,0,0,0,218,19,77,111,100,117,108,101,78,111,116, + 70,111,117,110,100,69,114,114,111,114,114,202,0,0,0,114, + 167,0,0,0,114,12,0,0,0,114,95,0,0,0,114,96, + 0,0,0,114,163,0,0,0,41,9,114,20,0,0,0,218, + 7,105,109,112,111,114,116,95,114,175,0,0,0,114,137,0, + 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, + 101,114,102,0,0,0,114,103,0,0,0,114,104,0,0,0, + 90,5,99,104,105,108,100,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,23,95,102,105,110,100,95,97,110, + 100,95,108,111,97,100,95,117,110,108,111,99,107,101,100,218, + 3,0,0,115,60,0,0,0,4,1,14,1,4,1,10,1, + 10,1,10,2,10,1,10,1,2,1,10,1,12,1,16,1, + 16,1,10,1,8,1,18,1,8,2,6,1,10,2,14,1, + 2,1,14,1,4,4,14,253,16,1,14,1,4,1,2,255, + 4,1,255,128,114,213,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,8,0,0,0,67,0, + 0,0,115,128,0,0,0,116,0,124,0,131,1,143,62,1, + 0,116,1,106,2,160,3,124,0,116,4,161,2,125,2,124, + 2,116,4,117,0,114,56,116,5,124,0,124,1,131,2,87, + 0,2,0,100,1,4,0,4,0,131,3,1,0,83,0,87, + 0,100,1,4,0,4,0,131,3,1,0,110,16,49,0,115, + 76,48,0,1,0,1,0,1,0,89,0,1,0,124,2,100, + 1,117,0,114,116,100,2,160,6,124,0,161,1,125,3,116, + 7,124,3,124,0,100,3,141,2,130,1,116,8,124,0,131, + 1,1,0,124,2,83,0,41,4,122,25,70,105,110,100,32, + 97,110,100,32,108,111,97,100,32,116,104,101,32,109,111,100, + 117,108,101,46,78,122,40,105,109,112,111,114,116,32,111,102, + 32,123,125,32,104,97,108,116,101,100,59,32,78,111,110,101, + 32,105,110,32,115,121,115,46,109,111,100,117,108,101,115,114, + 19,0,0,0,41,9,114,54,0,0,0,114,18,0,0,0, + 114,99,0,0,0,114,38,0,0,0,218,14,95,78,69,69, + 68,83,95,76,79,65,68,73,78,71,114,213,0,0,0,114, + 49,0,0,0,114,211,0,0,0,114,69,0,0,0,41,4, + 114,20,0,0,0,114,212,0,0,0,114,104,0,0,0,114, + 79,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,14,95,102,105,110,100,95,97,110,100,95,108, + 111,97,100,253,3,0,0,115,24,0,0,0,10,2,14,1, + 8,1,54,1,8,2,4,1,2,1,4,255,12,2,8,2, + 4,1,255,128,114,215,0,0,0,114,25,0,0,0,99,3, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, + 0,0,0,67,0,0,0,115,42,0,0,0,116,0,124,0, + 124,1,124,2,131,3,1,0,124,2,100,1,107,4,114,32, + 116,1,124,0,124,1,124,2,131,3,125,0,116,2,124,0, + 116,3,131,2,83,0,41,3,97,50,1,0,0,73,109,112, + 111,114,116,32,97,110,100,32,114,101,116,117,114,110,32,116, + 104,101,32,109,111,100,117,108,101,32,98,97,115,101,100,32, + 111,110,32,105,116,115,32,110,97,109,101,44,32,116,104,101, + 32,112,97,99,107,97,103,101,32,116,104,101,32,99,97,108, + 108,32,105,115,10,32,32,32,32,98,101,105,110,103,32,109, + 97,100,101,32,102,114,111,109,44,32,97,110,100,32,116,104, + 101,32,108,101,118,101,108,32,97,100,106,117,115,116,109,101, + 110,116,46,10,10,32,32,32,32,84,104,105,115,32,102,117, + 110,99,116,105,111,110,32,114,101,112,114,101,115,101,110,116, + 115,32,116,104,101,32,103,114,101,97,116,101,115,116,32,99, + 111,109,109,111,110,32,100,101,110,111,109,105,110,97,116,111, + 114,32,111,102,32,102,117,110,99,116,105,111,110,97,108,105, + 116,121,10,32,32,32,32,98,101,116,119,101,101,110,32,105, + 109,112,111,114,116,95,109,111,100,117,108,101,32,97,110,100, + 32,95,95,105,109,112,111,114,116,95,95,46,32,84,104,105, + 115,32,105,110,99,108,117,100,101,115,32,115,101,116,116,105, + 110,103,32,95,95,112,97,99,107,97,103,101,95,95,32,105, + 102,10,32,32,32,32,116,104,101,32,108,111,97,100,101,114, + 32,100,105,100,32,110,111,116,46,10,10,32,32,32,32,114, + 25,0,0,0,78,41,4,114,208,0,0,0,114,198,0,0, + 0,114,215,0,0,0,218,11,95,103,99,100,95,105,109,112, + 111,114,116,114,207,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,216,0,0,0,13,4,0,0, + 115,10,0,0,0,12,9,8,1,12,1,10,1,255,128,114, + 216,0,0,0,169,1,218,9,114,101,99,117,114,115,105,118, + 101,99,3,0,0,0,0,0,0,0,1,0,0,0,8,0, + 0,0,11,0,0,0,67,0,0,0,115,216,0,0,0,124, + 1,68,0,93,204,125,4,116,0,124,4,116,1,131,2,115, + 64,124,3,114,34,124,0,106,2,100,1,23,0,125,5,110, + 4,100,2,125,5,116,3,100,3,124,5,155,0,100,4,116, + 4,124,4,131,1,106,2,155,0,157,4,131,1,130,1,124, + 4,100,5,107,2,114,106,124,3,115,4,116,5,124,0,100, + 6,131,2,114,4,116,6,124,0,124,0,106,7,124,2,100, + 7,100,8,141,4,1,0,113,4,116,5,124,0,124,4,131, + 2,115,4,100,9,160,8,124,0,106,2,124,4,161,2,125, + 6,122,14,116,9,124,2,124,6,131,2,1,0,87,0,113, + 4,4,0,116,10,121,214,1,0,125,7,1,0,122,42,124, + 7,106,11,124,6,107,2,114,200,116,12,106,13,160,14,124, + 6,116,15,161,2,100,10,117,1,114,200,87,0,89,0,100, + 10,125,7,126,7,113,4,130,0,100,10,125,7,126,7,48, + 0,124,0,83,0,48,0,41,11,122,238,70,105,103,117,114, + 101,32,111,117,116,32,119,104,97,116,32,95,95,105,109,112, + 111,114,116,95,95,32,115,104,111,117,108,100,32,114,101,116, + 117,114,110,46,10,10,32,32,32,32,84,104,101,32,105,109, + 112,111,114,116,95,32,112,97,114,97,109,101,116,101,114,32, + 105,115,32,97,32,99,97,108,108,97,98,108,101,32,119,104, + 105,99,104,32,116,97,107,101,115,32,116,104,101,32,110,97, + 109,101,32,111,102,32,109,111,100,117,108,101,32,116,111,10, + 32,32,32,32,105,109,112,111,114,116,46,32,73,116,32,105, + 115,32,114,101,113,117,105,114,101,100,32,116,111,32,100,101, + 99,111,117,112,108,101,32,116,104,101,32,102,117,110,99,116, + 105,111,110,32,102,114,111,109,32,97,115,115,117,109,105,110, + 103,32,105,109,112,111,114,116,108,105,98,39,115,10,32,32, + 32,32,105,109,112,111,114,116,32,105,109,112,108,101,109,101, + 110,116,97,116,105,111,110,32,105,115,32,100,101,115,105,114, + 101,100,46,10,10,32,32,32,32,122,8,46,95,95,97,108, + 108,95,95,122,13,96,96,102,114,111,109,32,108,105,115,116, + 39,39,122,8,73,116,101,109,32,105,110,32,122,18,32,109, + 117,115,116,32,98,101,32,115,116,114,44,32,110,111,116,32, + 250,1,42,218,7,95,95,97,108,108,95,95,84,114,217,0, + 0,0,114,193,0,0,0,78,41,16,114,203,0,0,0,114, + 204,0,0,0,114,9,0,0,0,114,205,0,0,0,114,3, + 0,0,0,114,11,0,0,0,218,16,95,104,97,110,100,108, + 101,95,102,114,111,109,108,105,115,116,114,220,0,0,0,114, + 49,0,0,0,114,71,0,0,0,114,211,0,0,0,114,20, + 0,0,0,114,18,0,0,0,114,99,0,0,0,114,38,0, + 0,0,114,214,0,0,0,41,8,114,104,0,0,0,218,8, + 102,114,111,109,108,105,115,116,114,212,0,0,0,114,218,0, + 0,0,218,1,120,90,5,119,104,101,114,101,90,9,102,114, + 111,109,95,110,97,109,101,90,3,101,120,99,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,221,0,0,0, + 28,4,0,0,115,54,0,0,0,8,10,10,1,4,1,12, + 1,4,2,10,1,8,1,8,255,8,2,14,1,10,1,2, + 1,8,255,10,2,14,1,2,1,14,1,14,1,10,4,16, + 1,2,255,12,2,2,1,8,128,4,1,2,248,255,128,114, + 221,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,6,0,0,0,67,0,0,0,115,146,0, + 0,0,124,0,160,0,100,1,161,1,125,1,124,0,160,0, + 100,2,161,1,125,2,124,1,100,3,117,1,114,82,124,2, + 100,3,117,1,114,78,124,1,124,2,106,1,107,3,114,78, + 116,2,106,3,100,4,124,1,155,2,100,5,124,2,106,1, + 155,2,100,6,157,5,116,4,100,7,100,8,141,3,1,0, + 124,1,83,0,124,2,100,3,117,1,114,96,124,2,106,1, + 83,0,116,2,106,3,100,9,116,4,100,7,100,8,141,3, + 1,0,124,0,100,10,25,0,125,1,100,11,124,0,118,1, + 114,142,124,1,160,5,100,12,161,1,100,13,25,0,125,1, + 124,1,83,0,41,14,122,167,67,97,108,99,117,108,97,116, + 101,32,119,104,97,116,32,95,95,112,97,99,107,97,103,101, + 95,95,32,115,104,111,117,108,100,32,98,101,46,10,10,32, + 32,32,32,95,95,112,97,99,107,97,103,101,95,95,32,105, + 115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100, + 32,116,111,32,98,101,32,100,101,102,105,110,101,100,32,111, + 114,32,99,111,117,108,100,32,98,101,32,115,101,116,32,116, + 111,32,78,111,110,101,10,32,32,32,32,116,111,32,114,101, + 112,114,101,115,101,110,116,32,116,104,97,116,32,105,116,115, + 32,112,114,111,112,101,114,32,118,97,108,117,101,32,105,115, + 32,117,110,107,110,111,119,110,46,10,10,32,32,32,32,114, + 152,0,0,0,114,113,0,0,0,78,122,32,95,95,112,97, + 99,107,97,103,101,95,95,32,33,61,32,95,95,115,112,101, + 99,95,95,46,112,97,114,101,110,116,32,40,122,4,32,33, + 61,32,250,1,41,233,3,0,0,0,41,1,90,10,115,116, + 97,99,107,108,101,118,101,108,122,89,99,97,110,39,116,32, + 114,101,115,111,108,118,101,32,112,97,99,107,97,103,101,32, + 102,114,111,109,32,95,95,115,112,101,99,95,95,32,111,114, + 32,95,95,112,97,99,107,97,103,101,95,95,44,32,102,97, + 108,108,105,110,103,32,98,97,99,107,32,111,110,32,95,95, + 110,97,109,101,95,95,32,97,110,100,32,95,95,112,97,116, + 104,95,95,114,9,0,0,0,114,148,0,0,0,114,135,0, + 0,0,114,25,0,0,0,41,6,114,38,0,0,0,114,137, + 0,0,0,114,95,0,0,0,114,96,0,0,0,114,163,0, + 0,0,114,136,0,0,0,41,3,218,7,103,108,111,98,97, + 108,115,114,196,0,0,0,114,103,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,17,95,99,97, + 108,99,95,95,95,112,97,99,107,97,103,101,95,95,65,4, + 0,0,115,44,0,0,0,10,7,10,1,8,1,18,1,6, + 1,2,1,4,255,4,1,6,255,4,2,6,254,4,3,8, + 1,6,1,6,2,4,2,6,254,8,3,8,1,14,1,4, + 1,255,128,114,227,0,0,0,114,5,0,0,0,99,5,0, + 0,0,0,0,0,0,0,0,0,0,9,0,0,0,5,0, + 0,0,67,0,0,0,115,174,0,0,0,124,4,100,1,107, + 2,114,18,116,0,124,0,131,1,125,5,110,36,124,1,100, + 2,117,1,114,30,124,1,110,2,105,0,125,6,116,1,124, + 6,131,1,125,7,116,0,124,0,124,7,124,4,131,3,125, + 5,124,3,115,148,124,4,100,1,107,2,114,84,116,0,124, + 0,160,2,100,3,161,1,100,1,25,0,131,1,83,0,124, + 0,115,92,124,5,83,0,116,3,124,0,131,1,116,3,124, + 0,160,2,100,3,161,1,100,1,25,0,131,1,24,0,125, + 8,116,4,106,5,124,5,106,6,100,2,116,3,124,5,106, + 6,131,1,124,8,24,0,133,2,25,0,25,0,83,0,116, + 7,124,5,100,4,131,2,114,170,116,8,124,5,124,3,116, + 0,131,3,83,0,124,5,83,0,41,5,97,215,1,0,0, + 73,109,112,111,114,116,32,97,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,84,104,101,32,39,103,108,111,98,97, + 108,115,39,32,97,114,103,117,109,101,110,116,32,105,115,32, + 117,115,101,100,32,116,111,32,105,110,102,101,114,32,119,104, + 101,114,101,32,116,104,101,32,105,109,112,111,114,116,32,105, + 115,32,111,99,99,117,114,114,105,110,103,32,102,114,111,109, + 10,32,32,32,32,116,111,32,104,97,110,100,108,101,32,114, + 101,108,97,116,105,118,101,32,105,109,112,111,114,116,115,46, + 32,84,104,101,32,39,108,111,99,97,108,115,39,32,97,114, + 103,117,109,101,110,116,32,105,115,32,105,103,110,111,114,101, + 100,46,32,84,104,101,10,32,32,32,32,39,102,114,111,109, + 108,105,115,116,39,32,97,114,103,117,109,101,110,116,32,115, + 112,101,99,105,102,105,101,115,32,119,104,97,116,32,115,104, + 111,117,108,100,32,101,120,105,115,116,32,97,115,32,97,116, + 116,114,105,98,117,116,101,115,32,111,110,32,116,104,101,32, + 109,111,100,117,108,101,10,32,32,32,32,98,101,105,110,103, + 32,105,109,112,111,114,116,101,100,32,40,101,46,103,46,32, + 96,96,102,114,111,109,32,109,111,100,117,108,101,32,105,109, + 112,111,114,116,32,60,102,114,111,109,108,105,115,116,62,96, + 96,41,46,32,32,84,104,101,32,39,108,101,118,101,108,39, + 10,32,32,32,32,97,114,103,117,109,101,110,116,32,114,101, + 112,114,101,115,101,110,116,115,32,116,104,101,32,112,97,99, + 107,97,103,101,32,108,111,99,97,116,105,111,110,32,116,111, + 32,105,109,112,111,114,116,32,102,114,111,109,32,105,110,32, + 97,32,114,101,108,97,116,105,118,101,10,32,32,32,32,105, + 109,112,111,114,116,32,40,101,46,103,46,32,96,96,102,114, + 111,109,32,46,46,112,107,103,32,105,109,112,111,114,116,32, + 109,111,100,96,96,32,119,111,117,108,100,32,104,97,118,101, + 32,97,32,39,108,101,118,101,108,39,32,111,102,32,50,41, + 46,10,10,32,32,32,32,114,25,0,0,0,78,114,135,0, + 0,0,114,148,0,0,0,41,9,114,216,0,0,0,114,227, + 0,0,0,218,9,112,97,114,116,105,116,105,111,110,114,195, + 0,0,0,114,18,0,0,0,114,99,0,0,0,114,9,0, + 0,0,114,11,0,0,0,114,221,0,0,0,41,9,114,20, + 0,0,0,114,226,0,0,0,218,6,108,111,99,97,108,115, + 114,222,0,0,0,114,197,0,0,0,114,104,0,0,0,90, + 8,103,108,111,98,97,108,115,95,114,196,0,0,0,90,7, + 99,117,116,95,111,102,102,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,10,95,95,105,109,112,111,114,116, + 95,95,92,4,0,0,115,32,0,0,0,8,11,10,1,16, + 2,8,1,12,1,4,1,8,3,18,1,4,1,4,1,26, + 4,30,3,10,1,12,1,4,2,255,128,114,230,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, + 160,1,124,0,161,1,125,1,124,1,100,0,117,0,114,30, + 116,2,100,1,124,0,23,0,131,1,130,1,116,3,124,1, + 131,1,83,0,41,2,78,122,25,110,111,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,32,110,97,109,101, + 100,32,41,4,114,169,0,0,0,114,177,0,0,0,114,83, + 0,0,0,114,167,0,0,0,41,2,114,20,0,0,0,114, + 103,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,18,95,98,117,105,108,116,105,110,95,102,114, + 111,109,95,110,97,109,101,129,4,0,0,115,10,0,0,0, + 10,1,8,1,12,1,8,1,255,128,114,231,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, + 5,0,0,0,67,0,0,0,115,162,0,0,0,124,1,97, + 0,124,0,97,1,116,2,116,1,131,1,125,2,116,1,106, + 3,160,4,161,0,68,0,93,68,92,2,125,3,125,4,116, + 5,124,4,124,2,131,2,114,26,124,3,116,1,106,6,118, + 0,114,60,116,7,125,5,110,14,116,0,160,8,124,3,161, + 1,114,26,116,9,125,5,116,10,124,4,124,5,131,2,125, + 6,116,11,124,6,124,4,131,2,1,0,113,26,116,1,106, + 3,116,12,25,0,125,7,100,1,68,0,93,46,125,8,124, + 8,116,1,106,3,118,1,114,134,116,13,124,8,131,1,125, + 9,110,10,116,1,106,3,124,8,25,0,125,9,116,14,124, + 7,124,8,124,9,131,3,1,0,113,110,100,2,83,0,41, + 3,122,250,83,101,116,117,112,32,105,109,112,111,114,116,108, + 105,98,32,98,121,32,105,109,112,111,114,116,105,110,103,32, + 110,101,101,100,101,100,32,98,117,105,108,116,45,105,110,32, + 109,111,100,117,108,101,115,32,97,110,100,32,105,110,106,101, + 99,116,105,110,103,32,116,104,101,109,10,32,32,32,32,105, + 110,116,111,32,116,104,101,32,103,108,111,98,97,108,32,110, + 97,109,101,115,112,97,99,101,46,10,10,32,32,32,32,65, + 115,32,115,121,115,32,105,115,32,110,101,101,100,101,100,32, + 102,111,114,32,115,121,115,46,109,111,100,117,108,101,115,32, + 97,99,99,101,115,115,32,97,110,100,32,95,105,109,112,32, + 105,115,32,110,101,101,100,101,100,32,116,111,32,108,111,97, + 100,32,98,117,105,108,116,45,105,110,10,32,32,32,32,109, + 111,100,117,108,101,115,44,32,116,104,111,115,101,32,116,119, + 111,32,109,111,100,117,108,101,115,32,109,117,115,116,32,98, + 101,32,101,120,112,108,105,99,105,116,108,121,32,112,97,115, + 115,101,100,32,105,110,46,10,10,32,32,32,32,41,3,114, + 26,0,0,0,114,95,0,0,0,114,68,0,0,0,78,41, + 15,114,61,0,0,0,114,18,0,0,0,114,3,0,0,0, + 114,99,0,0,0,218,5,105,116,101,109,115,114,203,0,0, + 0,114,82,0,0,0,114,169,0,0,0,114,92,0,0,0, + 114,184,0,0,0,114,149,0,0,0,114,155,0,0,0,114, + 9,0,0,0,114,231,0,0,0,114,12,0,0,0,41,10, + 218,10,115,121,115,95,109,111,100,117,108,101,218,11,95,105, + 109,112,95,109,111,100,117,108,101,90,11,109,111,100,117,108, + 101,95,116,121,112,101,114,20,0,0,0,114,104,0,0,0, + 114,116,0,0,0,114,103,0,0,0,90,11,115,101,108,102, + 95,109,111,100,117,108,101,90,12,98,117,105,108,116,105,110, + 95,110,97,109,101,90,14,98,117,105,108,116,105,110,95,109, + 111,100,117,108,101,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,6,95,115,101,116,117,112,136,4,0,0, + 115,40,0,0,0,4,9,4,1,8,3,18,1,10,1,10, + 1,6,1,10,1,4,1,10,3,10,1,2,128,10,3,8, + 1,10,1,10,1,10,2,14,1,4,251,255,128,114,235,0, + 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 116,0,160,1,124,0,161,1,125,1,124,1,100,0,117,0, - 114,30,116,2,100,1,124,0,23,0,131,1,130,1,116,3, - 124,1,131,1,83,0,41,2,78,122,25,110,111,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,32,110,97, - 109,101,100,32,41,4,114,169,0,0,0,114,177,0,0,0, - 114,83,0,0,0,114,167,0,0,0,41,2,114,20,0,0, - 0,114,103,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,18,95,98,117,105,108,116,105,110,95, - 102,114,111,109,95,110,97,109,101,129,4,0,0,115,10,0, - 0,0,10,1,8,1,12,1,8,1,255,128,114,231,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,10,0, - 0,0,5,0,0,0,67,0,0,0,115,162,0,0,0,124, - 1,97,0,124,0,97,1,116,2,116,1,131,1,125,2,116, - 1,106,3,160,4,161,0,68,0,93,68,92,2,125,3,125, - 4,116,5,124,4,124,2,131,2,114,26,124,3,116,1,106, - 6,118,0,114,60,116,7,125,5,110,14,116,0,160,8,124, - 3,161,1,114,26,116,9,125,5,116,10,124,4,124,5,131, - 2,125,6,116,11,124,6,124,4,131,2,1,0,113,26,116, - 1,106,3,116,12,25,0,125,7,100,1,68,0,93,46,125, - 8,124,8,116,1,106,3,118,1,114,134,116,13,124,8,131, - 1,125,9,110,10,116,1,106,3,124,8,25,0,125,9,116, - 14,124,7,124,8,124,9,131,3,1,0,113,110,100,2,83, - 0,41,3,122,250,83,101,116,117,112,32,105,109,112,111,114, - 116,108,105,98,32,98,121,32,105,109,112,111,114,116,105,110, - 103,32,110,101,101,100,101,100,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,115,32,97,110,100,32,105,110, - 106,101,99,116,105,110,103,32,116,104,101,109,10,32,32,32, - 32,105,110,116,111,32,116,104,101,32,103,108,111,98,97,108, - 32,110,97,109,101,115,112,97,99,101,46,10,10,32,32,32, - 32,65,115,32,115,121,115,32,105,115,32,110,101,101,100,101, - 100,32,102,111,114,32,115,121,115,46,109,111,100,117,108,101, - 115,32,97,99,99,101,115,115,32,97,110,100,32,95,105,109, - 112,32,105,115,32,110,101,101,100,101,100,32,116,111,32,108, - 111,97,100,32,98,117,105,108,116,45,105,110,10,32,32,32, - 32,109,111,100,117,108,101,115,44,32,116,104,111,115,101,32, - 116,119,111,32,109,111,100,117,108,101,115,32,109,117,115,116, - 32,98,101,32,101,120,112,108,105,99,105,116,108,121,32,112, - 97,115,115,101,100,32,105,110,46,10,10,32,32,32,32,41, - 3,114,26,0,0,0,114,95,0,0,0,114,68,0,0,0, - 78,41,15,114,61,0,0,0,114,18,0,0,0,114,3,0, - 0,0,114,99,0,0,0,218,5,105,116,101,109,115,114,203, - 0,0,0,114,82,0,0,0,114,169,0,0,0,114,92,0, - 0,0,114,184,0,0,0,114,149,0,0,0,114,155,0,0, - 0,114,9,0,0,0,114,231,0,0,0,114,12,0,0,0, - 41,10,218,10,115,121,115,95,109,111,100,117,108,101,218,11, - 95,105,109,112,95,109,111,100,117,108,101,90,11,109,111,100, - 117,108,101,95,116,121,112,101,114,20,0,0,0,114,104,0, - 0,0,114,116,0,0,0,114,103,0,0,0,90,11,115,101, - 108,102,95,109,111,100,117,108,101,90,12,98,117,105,108,116, - 105,110,95,110,97,109,101,90,14,98,117,105,108,116,105,110, - 95,109,111,100,117,108,101,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,6,95,115,101,116,117,112,136,4, - 0,0,115,40,0,0,0,4,9,4,1,8,3,18,1,10, - 1,10,1,6,1,10,1,4,1,10,3,10,1,2,128,10, - 3,8,1,10,1,10,1,10,2,14,1,4,251,255,128,114, - 235,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,38,0, - 0,0,116,0,124,0,124,1,131,2,1,0,116,1,106,2, - 160,3,116,4,161,1,1,0,116,1,106,2,160,3,116,5, - 161,1,1,0,100,1,83,0,41,2,122,48,73,110,115,116, - 97,108,108,32,105,109,112,111,114,116,101,114,115,32,102,111, - 114,32,98,117,105,108,116,105,110,32,97,110,100,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,115,78,41,6,114, - 235,0,0,0,114,18,0,0,0,114,201,0,0,0,114,126, - 0,0,0,114,169,0,0,0,114,184,0,0,0,41,2,114, - 233,0,0,0,114,234,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,8,95,105,110,115,116,97, - 108,108,171,4,0,0,115,8,0,0,0,10,2,12,2,16, - 1,255,128,114,236,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, - 0,115,32,0,0,0,100,1,100,2,108,0,125,0,124,0, - 97,1,124,0,160,2,116,3,106,4,116,5,25,0,161,1, - 1,0,100,2,83,0,41,3,122,57,73,110,115,116,97,108, - 108,32,105,109,112,111,114,116,101,114,115,32,116,104,97,116, - 32,114,101,113,117,105,114,101,32,101,120,116,101,114,110,97, - 108,32,102,105,108,101,115,121,115,116,101,109,32,97,99,99, - 101,115,115,114,25,0,0,0,78,41,6,218,26,95,102,114, - 111,122,101,110,95,105,109,112,111,114,116,108,105,98,95,101, - 120,116,101,114,110,97,108,114,133,0,0,0,114,236,0,0, - 0,114,18,0,0,0,114,99,0,0,0,114,9,0,0,0, - 41,1,114,237,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,27,95,105,110,115,116,97,108,108, - 95,101,120,116,101,114,110,97,108,95,105,109,112,111,114,116, - 101,114,115,179,4,0,0,115,8,0,0,0,8,3,4,1, - 20,1,255,128,114,238,0,0,0,41,2,78,78,41,1,78, - 41,2,78,114,25,0,0,0,41,4,78,78,114,5,0,0, - 0,114,25,0,0,0,41,54,114,10,0,0,0,114,7,0, - 0,0,114,26,0,0,0,114,95,0,0,0,114,68,0,0, - 0,114,133,0,0,0,114,17,0,0,0,114,21,0,0,0, - 114,63,0,0,0,114,37,0,0,0,114,47,0,0,0,114, - 22,0,0,0,114,23,0,0,0,114,53,0,0,0,114,54, - 0,0,0,114,57,0,0,0,114,69,0,0,0,114,71,0, - 0,0,114,80,0,0,0,114,90,0,0,0,114,94,0,0, - 0,114,105,0,0,0,114,118,0,0,0,114,119,0,0,0, - 114,98,0,0,0,114,149,0,0,0,114,155,0,0,0,114, - 159,0,0,0,114,114,0,0,0,114,100,0,0,0,114,166, - 0,0,0,114,167,0,0,0,114,101,0,0,0,114,169,0, - 0,0,114,184,0,0,0,114,189,0,0,0,114,198,0,0, - 0,114,200,0,0,0,114,202,0,0,0,114,208,0,0,0, - 90,15,95,69,82,82,95,77,83,71,95,80,82,69,70,73, - 88,114,210,0,0,0,114,213,0,0,0,218,6,111,98,106, - 101,99,116,114,214,0,0,0,114,215,0,0,0,114,216,0, - 0,0,114,221,0,0,0,114,227,0,0,0,114,230,0,0, - 0,114,231,0,0,0,114,235,0,0,0,114,236,0,0,0, - 114,238,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,8,60,109,111,100,117, - 108,101,62,1,0,0,0,115,106,0,0,0,4,0,8,22, - 4,9,4,1,4,1,4,3,8,3,8,8,4,8,4,2, - 16,3,14,4,14,77,14,21,8,16,8,37,8,17,14,11, - 8,8,8,11,8,12,8,19,14,36,16,101,10,26,14,45, - 8,72,8,17,8,17,8,30,8,36,8,45,14,15,14,75, - 14,80,8,13,8,9,10,9,8,47,4,16,8,1,8,2, - 6,32,8,3,10,16,14,15,8,37,10,27,8,37,8,7, - 8,35,12,8,255,128, + 116,0,124,0,124,1,131,2,1,0,116,1,106,2,160,3, + 116,4,161,1,1,0,116,1,106,2,160,3,116,5,161,1, + 1,0,100,1,83,0,41,2,122,48,73,110,115,116,97,108, + 108,32,105,109,112,111,114,116,101,114,115,32,102,111,114,32, + 98,117,105,108,116,105,110,32,97,110,100,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,115,78,41,6,114,235,0, + 0,0,114,18,0,0,0,114,201,0,0,0,114,126,0,0, + 0,114,169,0,0,0,114,184,0,0,0,41,2,114,233,0, + 0,0,114,234,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,8,95,105,110,115,116,97,108,108, + 171,4,0,0,115,8,0,0,0,10,2,12,2,16,1,255, + 128,114,236,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, + 32,0,0,0,100,1,100,2,108,0,125,0,124,0,97,1, + 124,0,160,2,116,3,106,4,116,5,25,0,161,1,1,0, + 100,2,83,0,41,3,122,57,73,110,115,116,97,108,108,32, + 105,109,112,111,114,116,101,114,115,32,116,104,97,116,32,114, + 101,113,117,105,114,101,32,101,120,116,101,114,110,97,108,32, + 102,105,108,101,115,121,115,116,101,109,32,97,99,99,101,115, + 115,114,25,0,0,0,78,41,6,218,26,95,102,114,111,122, + 101,110,95,105,109,112,111,114,116,108,105,98,95,101,120,116, + 101,114,110,97,108,114,133,0,0,0,114,236,0,0,0,114, + 18,0,0,0,114,99,0,0,0,114,9,0,0,0,41,1, + 114,237,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,27,95,105,110,115,116,97,108,108,95,101, + 120,116,101,114,110,97,108,95,105,109,112,111,114,116,101,114, + 115,179,4,0,0,115,8,0,0,0,8,3,4,1,20,1, + 255,128,114,238,0,0,0,41,2,78,78,41,1,78,41,2, + 78,114,25,0,0,0,41,4,78,78,114,5,0,0,0,114, + 25,0,0,0,41,54,114,10,0,0,0,114,7,0,0,0, + 114,26,0,0,0,114,95,0,0,0,114,68,0,0,0,114, + 133,0,0,0,114,17,0,0,0,114,21,0,0,0,114,63, + 0,0,0,114,37,0,0,0,114,47,0,0,0,114,22,0, + 0,0,114,23,0,0,0,114,53,0,0,0,114,54,0,0, + 0,114,57,0,0,0,114,69,0,0,0,114,71,0,0,0, + 114,80,0,0,0,114,90,0,0,0,114,94,0,0,0,114, + 105,0,0,0,114,118,0,0,0,114,119,0,0,0,114,98, + 0,0,0,114,149,0,0,0,114,155,0,0,0,114,159,0, + 0,0,114,114,0,0,0,114,100,0,0,0,114,166,0,0, + 0,114,167,0,0,0,114,101,0,0,0,114,169,0,0,0, + 114,184,0,0,0,114,189,0,0,0,114,198,0,0,0,114, + 200,0,0,0,114,202,0,0,0,114,208,0,0,0,90,15, + 95,69,82,82,95,77,83,71,95,80,82,69,70,73,88,114, + 210,0,0,0,114,213,0,0,0,218,6,111,98,106,101,99, + 116,114,214,0,0,0,114,215,0,0,0,114,216,0,0,0, + 114,221,0,0,0,114,227,0,0,0,114,230,0,0,0,114, + 231,0,0,0,114,235,0,0,0,114,236,0,0,0,114,238, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,8,60,109,111,100,117,108,101, + 62,1,0,0,0,115,106,0,0,0,4,0,8,22,4,9, + 4,1,4,1,4,3,8,3,8,8,4,8,4,2,16,3, + 14,4,14,77,14,21,8,16,8,37,8,17,14,11,8,8, + 8,11,8,12,8,19,14,36,16,101,10,26,14,45,8,72, + 8,17,8,17,8,30,8,36,8,45,14,15,14,75,14,80, + 8,13,8,9,10,9,8,47,4,16,8,1,8,2,6,32, + 8,3,10,16,14,15,8,37,10,27,8,37,8,7,8,35, + 12,8,255,128, }; From 0bc4ea23f87b1f70c407ed01c00c19e34efd4512 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 16 Dec 2020 15:08:23 +0100 Subject: [PATCH 0804/1261] Add symbols of the stable ABI to python3dll.c (GH-23598) Add the following symbols to python3dll.c: * PyFrame_GetCode (bpo-40421) * PyFrame_GetLineNumber (bpo-40421) * PyModule_AddObjectRef (bpo-1635741) * PyObject_CallNoArgs (bpo-37194) * PyThreadState_GetFrame (bpo-39947) * PyThreadState_GetID (bpo-39947) * PyThreadState_GetInterpreter (bpo-39947) --- PC/python3dll.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/PC/python3dll.c b/PC/python3dll.c index 9eb81e36af0013..fa44a46fb7622b 100644 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -257,6 +257,8 @@ EXPORT_FUNC(PyFloat_FromString) EXPORT_FUNC(PyFloat_GetInfo) EXPORT_FUNC(PyFloat_GetMax) EXPORT_FUNC(PyFloat_GetMin) +EXPORT_FUNC(PyFrame_GetLineNumber) +EXPORT_FUNC(PyFrame_GetCode) EXPORT_FUNC(PyFrozenSet_New) EXPORT_FUNC(PyGC_Collect) EXPORT_FUNC(PyGILState_Ensure) @@ -405,6 +407,7 @@ EXPORT_FUNC(PyObject_CallFunction) EXPORT_FUNC(PyObject_CallFunctionObjArgs) EXPORT_FUNC(PyObject_CallMethod) EXPORT_FUNC(PyObject_CallMethodObjArgs) +EXPORT_FUNC(PyObject_CallNoArgs) EXPORT_FUNC(PyObject_CallObject) EXPORT_FUNC(PyObject_Calloc) EXPORT_FUNC(PyObject_ClearWeakRefs) @@ -535,6 +538,9 @@ EXPORT_FUNC(PyThreadState_Delete) EXPORT_FUNC(PyThreadState_DeleteCurrent) EXPORT_FUNC(PyThreadState_Get) EXPORT_FUNC(PyThreadState_GetDict) +EXPORT_FUNC(PyThreadState_GetFrame) +EXPORT_FUNC(PyThreadState_GetID) +EXPORT_FUNC(PyThreadState_GetInterpreter) EXPORT_FUNC(PyThreadState_New) EXPORT_FUNC(PyThreadState_SetAsyncExc) EXPORT_FUNC(PyThreadState_Swap) @@ -791,6 +797,7 @@ EXPORT_DATA(PyMemoryView_Type) EXPORT_DATA(PyMethodDescr_Type) EXPORT_DATA(PyModule_Type) EXPORT_DATA(PyModuleDef_Type) +EXPORT_DATA(PyModule_AddObjectRef) EXPORT_DATA(PyNullImporter_Type) EXPORT_DATA(PyODict_Type) EXPORT_DATA(PyODictItems_Type) From d169dcbd5d53bf173423499d93331940d793fb15 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Wed, 16 Dec 2020 16:22:19 +0100 Subject: [PATCH 0805/1261] Fix reStructuredText typo in NEWS.d. (GH-23800) --- .../Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst index ac52a008e352f5..fec4b7f81cb45b 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst @@ -6,6 +6,6 @@ for :class:`collections.abc.Callable` are now flattened while ``collections.abc.Callable``'s ``__class_getitem__`` will now return a subclass of ``types.GenericAlias``. Tests for typing were also updated to not subclass things like ``Callable[..., T]`` as that is not a valid base class. Finally, -both ``Callable``s no longer validate their ``argtypes``, in +both ``Callable``\ s no longer validate their ``argtypes``, in ``Callable[[argtypes], resulttype]`` to prepare for :pep:`612`. Patch by Ken Jin. From fbdcc3e809a44ba816d726d8bebfface5dc1763d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 16 Dec 2020 16:26:15 +0100 Subject: [PATCH 0806/1261] bpo-40686: Fix compiler warnings on _zoneinfo.c (GH-23614) "uint8_t day" is unsigned and so "day < 0" test is always true. Remove the test to fix the following warnings on Windows: modules\_zoneinfo.c(1224): warning C4068: unknown pragma modules\_zoneinfo.c(1225): warning C4068: unknown pragma modules\_zoneinfo.c(1227): warning C4068: unknown pragma --- Modules/_zoneinfo.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c index 7888cf86de0a5c..bb32b1496683e4 100644 --- a/Modules/_zoneinfo.c +++ b/Modules/_zoneinfo.c @@ -172,7 +172,7 @@ static void update_strong_cache(const PyTypeObject *const type, PyObject *key, PyObject *zone); static PyObject * -zone_from_strong_cache(const PyTypeObject *const type, PyObject *key); +zone_from_strong_cache(const PyTypeObject *const type, PyObject *const key); static PyObject * zoneinfo_new_instance(PyTypeObject *type, PyObject *key) @@ -1214,15 +1214,9 @@ calendarrule_new(uint8_t month, uint8_t week, uint8_t day, int8_t hour, return -1; } - // day is an unsigned integer, so day < 0 should always return false, but - // if day's type changes to a signed integer *without* changing this value, - // it may create a bug. Considering that the compiler should be able to - // optimize out the first comparison if day is an unsigned integer anyway, - // we will leave this comparison in place and disable the compiler warning. -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wtype-limits" - if (day < 0 || day > 6) { -#pragma GCC diagnostic pop + // If the 'day' parameter type is changed to a signed type, + // "day < 0" check must be added. + if (/* day < 0 || */ day > 6) { PyErr_Format(PyExc_ValueError, "Day must be in [0, 6]"); return -1; } From 38e1f23b81117324d9167de708d537f2b22a53fc Mon Sep 17 00:00:00 2001 From: Antoine <43954001+awecx@users.noreply.github.com> Date: Wed, 16 Dec 2020 16:45:19 +0100 Subject: [PATCH 0807/1261] Clarify eval() doc from library/functions. (GH-22700) --- Doc/library/functions.rst | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index a8a4ca42007c63..24dc65d563c66d 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -478,14 +478,15 @@ are always available. They are listed here in alphabetical order. dictionaries as global and local namespace. If the *globals* dictionary is present and does not contain a value for the key ``__builtins__``, a reference to the dictionary of the built-in module :mod:`builtins` is - inserted under that key before *expression* is parsed. This means that - *expression* normally has full access to the standard :mod:`builtins` - module and restricted environments are propagated. If the *locals* - dictionary is omitted it defaults to the *globals* dictionary. If both - dictionaries are omitted, the expression is executed with the *globals* and - *locals* in the environment where :func:`eval` is called. Note, *eval()* - does not have access to the :term:`nested scopes ` (non-locals) in the - enclosing environment. + inserted under that key before *expression* is parsed. That way you can + control what builtins are available to the executed code by inserting your + own ``__builtins__`` dictionary into *globals* before passing it to + :func:`eval`. If the *locals* dictionary is omitted it defaults to the + *globals* dictionary. If both dictionaries are omitted, the expression is + executed with the *globals* and *locals* in the environment where + :func:`eval` is called. Note, *eval()* does not have access to the + :term:`nested scopes ` (non-locals) in the enclosing + environment. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions. Example: From 29c61e4788c403bfd682130b2dc9111e9f5a0bb7 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Wed, 16 Dec 2020 16:03:32 +0000 Subject: [PATCH 0808/1261] bpo-23915: update and elucidate documentation of with_traceback (GH-23680) --- Doc/library/exceptions.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index 8fb25a50e2d404..1028213699d637 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -90,8 +90,13 @@ The following exceptions are used mostly as base classes for other exceptions. .. method:: with_traceback(tb) This method sets *tb* as the new traceback for the exception and returns - the exception object. It is usually used in exception handling code like - this:: + the exception object. It was more commonly used before the exception + chaining features of :pep:`3134` became available. The following example + shows how we can convert an instance of ``SomeException`` into an + instance of ``OtherException`` while preserving the traceback. Once + raised, the current frame is pushed onto the traceback of the + ``OtherException``, as would have happened to the traceback of the + original ``SomeException`` had we allowed it to propagate to the caller. try: ... From b9a14d4c29af5081bee4821412bef9ebdf86c6bb Mon Sep 17 00:00:00 2001 From: Chris Jerdonek Date: Wed, 16 Dec 2020 09:50:25 -0800 Subject: [PATCH 0809/1261] bpo-38323: Add guard clauses in MultiLoopChildWatcher. (#22756) This is a trivial refactor in preparation for a fix for bpo-38323. --- Lib/asyncio/unix_events.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 33a6732941fc33..e4f445e95026b5 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -1226,13 +1226,15 @@ def is_active(self): def close(self): self._callbacks.clear() - if self._saved_sighandler is not None: - handler = signal.getsignal(signal.SIGCHLD) - if handler != self._sig_chld: - logger.warning("SIGCHLD handler was changed by outside code") - else: - signal.signal(signal.SIGCHLD, self._saved_sighandler) - self._saved_sighandler = None + if self._saved_sighandler is None: + return + + handler = signal.getsignal(signal.SIGCHLD) + if handler != self._sig_chld: + logger.warning("SIGCHLD handler was changed by outside code") + else: + signal.signal(signal.SIGCHLD, self._saved_sighandler) + self._saved_sighandler = None def __enter__(self): return self @@ -1259,15 +1261,17 @@ def attach_loop(self, loop): # The reason to do it here is that attach_loop() is called from # unix policy only for the main thread. # Main thread is required for subscription on SIGCHLD signal + if self._saved_sighandler is not None: + return + + self._saved_sighandler = signal.signal(signal.SIGCHLD, self._sig_chld) if self._saved_sighandler is None: - self._saved_sighandler = signal.signal(signal.SIGCHLD, self._sig_chld) - if self._saved_sighandler is None: - logger.warning("Previous SIGCHLD handler was set by non-Python code, " - "restore to default handler on watcher close.") - self._saved_sighandler = signal.SIG_DFL + logger.warning("Previous SIGCHLD handler was set by non-Python code, " + "restore to default handler on watcher close.") + self._saved_sighandler = signal.SIG_DFL - # Set SA_RESTART to limit EINTR occurrences. - signal.siginterrupt(signal.SIGCHLD, False) + # Set SA_RESTART to limit EINTR occurrences. + signal.siginterrupt(signal.SIGCHLD, False) def _do_waitpid_all(self): for pid in list(self._callbacks): From 5af408b96c5065361a07d2c8c7eba8aa838ccf27 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Wed, 16 Dec 2020 22:38:32 +0100 Subject: [PATCH 0810/1261] bpo-37961: Fix regression in tracemalloc.Traceback.__repr__ (GH-23805) Regression in 8d59eb1b66c51b2b918da9881c57d07d08df43b7. --- Lib/test/test_tracemalloc.py | 20 +++++++++++++++++++ Lib/tracemalloc.py | 2 +- .../2020-12-16-16-16-33.bpo-37961.jrESEq.rst | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-16-16-16-33.bpo-37961.jrESEq.rst diff --git a/Lib/test/test_tracemalloc.py b/Lib/test/test_tracemalloc.py index a0037f81b88f27..556656747bbcbe 100644 --- a/Lib/test/test_tracemalloc.py +++ b/Lib/test/test_tracemalloc.py @@ -85,6 +85,25 @@ def traceback_filename(filename): return traceback_lineno(filename, 0) +class TestTraceback(unittest.TestCase): + def test_repr(self): + def get_repr(*args) -> str: + return repr(tracemalloc.Traceback(*args)) + + self.assertEqual(get_repr(()), "") + self.assertEqual(get_repr((), 0), "") + + frames = (("f1", 1), ("f2", 2)) + exp_repr_frames = ( + "(," + " )" + ) + self.assertEqual(get_repr(frames), + f"") + self.assertEqual(get_repr(frames, 2), + f"") + + class TestTracemallocEnabled(unittest.TestCase): def setUp(self): if tracemalloc.is_tracing(): @@ -1065,6 +1084,7 @@ def test_stop_untrack(self): def test_main(): support.run_unittest( + TestTraceback, TestTracemallocEnabled, TestSnapshot, TestFilters, diff --git a/Lib/tracemalloc.py b/Lib/tracemalloc.py index 69b4170ec82462..cec99c59700fe0 100644 --- a/Lib/tracemalloc.py +++ b/Lib/tracemalloc.py @@ -226,7 +226,7 @@ def __str__(self): return str(self[0]) def __repr__(self): - s = " Date: Wed, 16 Dec 2020 18:17:22 -0500 Subject: [PATCH 0811/1261] Fix indentation for get_stats_profile() docs (GH-23618) The existing method is indented one too many times which makes it look like a sub-method of print_callees(). --- Doc/library/profile.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index 34525a96f55c43..7edabfde0d7f18 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -525,7 +525,7 @@ Analysis of the profiler data is done using the :class:`~pstats.Stats` class. ordering are identical to the :meth:`~pstats.Stats.print_callers` method. - .. method:: get_stats_profile() + .. method:: get_stats_profile() This method returns an instance of StatsProfile, which contains a mapping of function names to instances of FunctionProfile. Each FunctionProfile From f96d85397c8aa9dd663f2dba5599b627baf1a337 Mon Sep 17 00:00:00 2001 From: Mike Lei Date: Thu, 17 Dec 2020 01:34:19 +0000 Subject: [PATCH 0812/1261] Correct referenced RFC number in cgi module (GH-22827) The quoted sentence can be found from the last paragraph of RFC 2046, Section 5.1, while the content of RFC 2026 is unrelated to this module. --- Lib/cgi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/cgi.py b/Lib/cgi.py index 77ab703cc03600..6018c3608697af 100755 --- a/Lib/cgi.py +++ b/Lib/cgi.py @@ -194,7 +194,7 @@ def parse_multipart(fp, pdict, encoding="utf-8", errors="replace"): value is a list of values for that field. For non-file fields, the value is a list of strings. """ - # RFC 2026, Section 5.1 : The "multipart" boundary delimiters are always + # RFC 2046, Section 5.1 : The "multipart" boundary delimiters are always # represented as 7bit US-ASCII. boundary = pdict['boundary'].decode('ascii') ctype = "multipart/form-data; boundary={}".format(boundary) From 4afb8db1dad52285620d1e0f6a31ea73d63cc149 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 16 Dec 2020 22:37:28 -0300 Subject: [PATCH 0813/1261] [doc] Fix erroneous backslashes in signatures and names (GH-23658) The issue being resolved is shown in the 3.10 docs (if you select docs for older versions you won't see a visual glitch). The newer sphinx version that produces the 3.10 docs doesn't treat the backslash to escape things in some situations it previously did. --- Doc/library/asyncio-eventloop.rst | 36 +++++++++++++++--------------- Doc/library/asyncio-future.rst | 6 ++--- Doc/library/asyncio-policy.rst | 2 +- Doc/library/asyncio-stream.rst | 10 ++++----- Doc/library/asyncio-subprocess.rst | 6 ++--- Doc/library/asyncio-task.rst | 18 +++++++-------- Doc/library/base64.rst | 2 +- Doc/library/compileall.rst | 4 ++-- Doc/library/concurrent.futures.rst | 2 +- Doc/library/contextvars.rst | 4 ++-- Doc/library/ctypes.rst | 2 +- Doc/library/difflib.rst | 6 ++--- Doc/library/email.header.rst | 2 +- Doc/library/email.policy.rst | 2 +- Doc/library/functions.rst | 2 +- Doc/library/http.cookies.rst | 2 +- Doc/library/importlib.rst | 4 ++-- Doc/library/inspect.rst | 8 +++---- Doc/library/io.rst | 2 +- Doc/library/lzma.rst | 4 ++-- Doc/library/os.rst | 10 ++++----- Doc/library/pickle.rst | 12 +++++----- Doc/library/plistlib.rst | 8 +++---- Doc/library/shutil.rst | 2 +- Doc/library/stdtypes.rst | 4 ++-- Doc/library/subprocess.rst | 2 +- Doc/library/sysconfig.rst | 2 +- Doc/library/tarfile.rst | 2 +- Doc/library/test.rst | 4 ++-- Doc/library/warnings.rst | 2 +- Doc/library/winreg.rst | 2 +- Doc/library/xml.dom.minidom.rst | 2 +- 32 files changed, 88 insertions(+), 88 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 15b5b3fe822ce8..7de5a0ab2595c5 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -321,7 +321,7 @@ Creating Futures and Tasks .. versionadded:: 3.5.2 -.. method:: loop.create_task(coro, \*, name=None) +.. method:: loop.create_task(coro, *, name=None) Schedule the execution of a :ref:`coroutine`. Return a :class:`Task` object. @@ -356,7 +356,7 @@ Opening network connections ^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. coroutinemethod:: loop.create_connection(protocol_factory, \ - host=None, port=None, \*, ssl=None, \ + host=None, port=None, *, ssl=None, \ family=0, proto=0, flags=0, sock=None, \ local_addr=None, server_hostname=None, \ ssl_handshake_timeout=None, \ @@ -482,7 +482,7 @@ Opening network connections that can be used directly in async/await code. .. coroutinemethod:: loop.create_datagram_endpoint(protocol_factory, \ - local_addr=None, remote_addr=None, \*, \ + local_addr=None, remote_addr=None, *, \ family=0, proto=0, flags=0, \ reuse_address=None, reuse_port=None, \ allow_broadcast=None, sock=None) @@ -559,7 +559,7 @@ Opening network connections Added support for Windows. .. coroutinemethod:: loop.create_unix_connection(protocol_factory, \ - path=None, \*, ssl=None, sock=None, \ + path=None, *, ssl=None, sock=None, \ server_hostname=None, ssl_handshake_timeout=None) Create a Unix connection. @@ -592,7 +592,7 @@ Creating network servers ^^^^^^^^^^^^^^^^^^^^^^^^ .. coroutinemethod:: loop.create_server(protocol_factory, \ - host=None, port=None, \*, \ + host=None, port=None, *, \ family=socket.AF_UNSPEC, \ flags=socket.AI_PASSIVE, \ sock=None, backlog=100, ssl=None, \ @@ -683,7 +683,7 @@ Creating network servers .. coroutinemethod:: loop.create_unix_server(protocol_factory, path=None, \ - \*, sock=None, backlog=100, ssl=None, \ + *, sock=None, backlog=100, ssl=None, \ ssl_handshake_timeout=None, start_serving=True) Similar to :meth:`loop.create_server` but works with the @@ -708,7 +708,7 @@ Creating network servers The *path* parameter can now be a :class:`~pathlib.Path` object. .. coroutinemethod:: loop.connect_accepted_socket(protocol_factory, \ - sock, \*, ssl=None, ssl_handshake_timeout=None) + sock, *, ssl=None, ssl_handshake_timeout=None) Wrap an already accepted connection into a transport/protocol pair. @@ -773,7 +773,7 @@ TLS Upgrade ^^^^^^^^^^^ .. coroutinemethod:: loop.start_tls(transport, protocol, \ - sslcontext, \*, server_side=False, \ + sslcontext, *, server_side=False, \ server_hostname=None, ssl_handshake_timeout=None) Upgrade an existing transport-based connection to TLS. @@ -806,7 +806,7 @@ TLS Upgrade Watching file descriptors ^^^^^^^^^^^^^^^^^^^^^^^^^ -.. method:: loop.add_reader(fd, callback, \*args) +.. method:: loop.add_reader(fd, callback, *args) Start monitoring the *fd* file descriptor for read availability and invoke *callback* with the specified arguments once *fd* is available for @@ -816,7 +816,7 @@ Watching file descriptors Stop monitoring the *fd* file descriptor for read availability. -.. method:: loop.add_writer(fd, callback, \*args) +.. method:: loop.add_writer(fd, callback, *args) Start monitoring the *fd* file descriptor for write availability and invoke *callback* with the specified arguments once *fd* is available for @@ -930,7 +930,7 @@ convenient. :meth:`loop.create_server` and :func:`start_server`. .. coroutinemethod:: loop.sock_sendfile(sock, file, offset=0, count=None, \ - \*, fallback=True) + *, fallback=True) Send a file using high-performance :mod:`os.sendfile` if possible. Return the total number of bytes sent. @@ -964,7 +964,7 @@ convenient. DNS ^^^ -.. coroutinemethod:: loop.getaddrinfo(host, port, \*, family=0, \ +.. coroutinemethod:: loop.getaddrinfo(host, port, *, family=0, \ type=0, proto=0, flags=0) Asynchronous version of :meth:`socket.getaddrinfo`. @@ -1029,7 +1029,7 @@ Working with pipes Unix signals ^^^^^^^^^^^^ -.. method:: loop.add_signal_handler(signum, callback, \*args) +.. method:: loop.add_signal_handler(signum, callback, *args) Set *callback* as the handler for the *signum* signal. @@ -1064,7 +1064,7 @@ Unix signals Executing code in thread or process pools ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. awaitablemethod:: loop.run_in_executor(executor, func, \*args) +.. awaitablemethod:: loop.run_in_executor(executor, func, *args) Arrange for *func* to be called in the specified executor. @@ -1237,9 +1237,9 @@ async/await code consider using the high-level subprocesses. See :ref:`Subprocess Support on Windows ` for details. -.. coroutinemethod:: loop.subprocess_exec(protocol_factory, \*args, \ +.. coroutinemethod:: loop.subprocess_exec(protocol_factory, *args, \ stdin=subprocess.PIPE, stdout=subprocess.PIPE, \ - stderr=subprocess.PIPE, \*\*kwargs) + stderr=subprocess.PIPE, **kwargs) Create a subprocess from one or more string arguments specified by *args*. @@ -1319,9 +1319,9 @@ async/await code consider using the high-level conforms to the :class:`asyncio.SubprocessTransport` base class and *protocol* is an object instantiated by the *protocol_factory*. -.. coroutinemethod:: loop.subprocess_shell(protocol_factory, cmd, \*, \ +.. coroutinemethod:: loop.subprocess_shell(protocol_factory, cmd, *, \ stdin=subprocess.PIPE, stdout=subprocess.PIPE, \ - stderr=subprocess.PIPE, \*\*kwargs) + stderr=subprocess.PIPE, **kwargs) Create a subprocess from *cmd*, which can be a :class:`str` or a :class:`bytes` string encoded to the diff --git a/Doc/library/asyncio-future.rst b/Doc/library/asyncio-future.rst index e1ac18eaf09882..939d4c1a84523a 100644 --- a/Doc/library/asyncio-future.rst +++ b/Doc/library/asyncio-future.rst @@ -31,7 +31,7 @@ Future Functions .. versionadded:: 3.5 -.. function:: ensure_future(obj, \*, loop=None) +.. function:: ensure_future(obj, *, loop=None) Return: @@ -58,7 +58,7 @@ Future Functions The function accepts any :term:`awaitable` object. -.. function:: wrap_future(future, \*, loop=None) +.. function:: wrap_future(future, *, loop=None) Wrap a :class:`concurrent.futures.Future` object in a :class:`asyncio.Future` object. @@ -67,7 +67,7 @@ Future Functions Future Object ============= -.. class:: Future(\*, loop=None) +.. class:: Future(*, loop=None) A Future represents an eventual result of an asynchronous operation. Not thread-safe. diff --git a/Doc/library/asyncio-policy.rst b/Doc/library/asyncio-policy.rst index 5e69525e90dd27..ef6a0588506b52 100644 --- a/Doc/library/asyncio-policy.rst +++ b/Doc/library/asyncio-policy.rst @@ -159,7 +159,7 @@ implementation used by the asyncio event loop: .. class:: AbstractChildWatcher - .. method:: add_child_handler(pid, callback, \*args) + .. method:: add_child_handler(pid, callback, *args) Register a new child handler. diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index bee47bcdcbf21a..9b456c14351e44 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -48,7 +48,7 @@ The following top-level asyncio functions can be used to create and work with streams: -.. coroutinefunction:: open_connection(host=None, port=None, \*, \ +.. coroutinefunction:: open_connection(host=None, port=None, *, \ limit=None, ssl=None, family=0, proto=0, \ flags=0, sock=None, local_addr=None, \ server_hostname=None, ssl_handshake_timeout=None) @@ -71,7 +71,7 @@ and work with streams: The *ssl_handshake_timeout* parameter. .. coroutinefunction:: start_server(client_connected_cb, host=None, \ - port=None, \*, limit=None, \ + port=None, *, limit=None, \ family=socket.AF_UNSPEC, \ flags=socket.AI_PASSIVE, sock=None, \ backlog=100, ssl=None, reuse_address=None, \ @@ -103,7 +103,7 @@ and work with streams: .. rubric:: Unix Sockets -.. coroutinefunction:: open_unix_connection(path=None, \*, limit=None, \ +.. coroutinefunction:: open_unix_connection(path=None, *, limit=None, \ ssl=None, sock=None, server_hostname=None, \ ssl_handshake_timeout=None) @@ -126,7 +126,7 @@ and work with streams: .. coroutinefunction:: start_unix_server(client_connected_cb, path=None, \ - \*, limit=None, sock=None, backlog=100, ssl=None, \ + *, limit=None, sock=None, backlog=100, ssl=None, \ ssl_handshake_timeout=None, start_serving=True) Start a Unix socket server. @@ -185,7 +185,7 @@ StreamReader can be read. Use the :attr:`IncompleteReadError.partial` attribute to get the partially read data. - .. coroutinemethod:: readuntil(separator=b'\\n') + .. coroutinemethod:: readuntil(separator=b'\n') Read data from the stream until *separator* is found. diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index ea674302bd9d6a..f955a292e15d08 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -61,8 +61,8 @@ See also the `Examples`_ subsection. Creating Subprocesses ===================== -.. coroutinefunction:: create_subprocess_exec(program, \*args, stdin=None, \ - stdout=None, stderr=None, limit=None, \*\*kwds) +.. coroutinefunction:: create_subprocess_exec(program, *args, stdin=None, \ + stdout=None, stderr=None, limit=None, **kwds) Create a subprocess. @@ -77,7 +77,7 @@ Creating Subprocesses .. coroutinefunction:: create_subprocess_shell(cmd, stdin=None, \ - stdout=None, stderr=None, limit=None, \*\*kwds) + stdout=None, stderr=None, limit=None, **kwds) Run the *cmd* shell command. diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index 73ada0e2f006cd..45e58437e0366d 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -210,7 +210,7 @@ is :meth:`loop.run_in_executor`. Running an asyncio Program ========================== -.. function:: run(coro, \*, debug=False) +.. function:: run(coro, *, debug=False) Execute the :term:`coroutine` *coro* and return the result. @@ -247,7 +247,7 @@ Running an asyncio Program Creating Tasks ============== -.. function:: create_task(coro, \*, name=None) +.. function:: create_task(coro, *, name=None) Wrap the *coro* :ref:`coroutine ` into a :class:`Task` and schedule its execution. Return the Task object. @@ -316,7 +316,7 @@ Sleeping Running Tasks Concurrently ========================== -.. awaitablefunction:: gather(\*aws, return_exceptions=False) +.. awaitablefunction:: gather(*aws, return_exceptions=False) Run :ref:`awaitable objects ` in the *aws* sequence *concurrently*. @@ -488,7 +488,7 @@ Timeouts Waiting Primitives ================== -.. coroutinefunction:: wait(aws, \*, timeout=None, return_when=ALL_COMPLETED) +.. coroutinefunction:: wait(aws, *, timeout=None, return_when=ALL_COMPLETED) Run :ref:`awaitable objects ` in the *aws* iterable concurrently and block until the condition specified @@ -573,7 +573,7 @@ Waiting Primitives deprecated. -.. function:: as_completed(aws, \*, timeout=None) +.. function:: as_completed(aws, *, timeout=None) Run :ref:`awaitable objects ` in the *aws* iterable concurrently. Return an iterator of coroutines. @@ -593,7 +593,7 @@ Waiting Primitives Running in Threads ================== -.. coroutinefunction:: to_thread(func, /, \*args, \*\*kwargs) +.. coroutinefunction:: to_thread(func, /, *args, **kwargs) Asynchronously run function *func* in a separate thread. @@ -723,7 +723,7 @@ Introspection Task Object =========== -.. class:: Task(coro, \*, loop=None, name=None) +.. class:: Task(coro, *, loop=None, name=None) A :class:`Future-like ` object that runs a Python :ref:`coroutine `. Not thread-safe. @@ -889,7 +889,7 @@ Task Object See the documentation of :meth:`Future.remove_done_callback` for more details. - .. method:: get_stack(\*, limit=None) + .. method:: get_stack(*, limit=None) Return the list of stack frames for this Task. @@ -910,7 +910,7 @@ Task Object stack are returned, but the oldest frames of a traceback are returned. (This matches the behavior of the traceback module.) - .. method:: print_stack(\*, limit=None, file=None) + .. method:: print_stack(*, limit=None, file=None) Print the stack or traceback for this Task. diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst index 2f24bb63912fb6..25b3a4ca2967cb 100644 --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -199,7 +199,7 @@ The modern interface provides: .. versionadded:: 3.4 -.. function:: a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \\t\\n\\r\\v') +.. function:: a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\v') Decode the Ascii85 encoded :term:`bytes-like object` or ASCII string *b* and return the decoded :class:`bytes`. diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst index 9b914b1f0d9c6d..5c6e68f9304753 100644 --- a/Doc/library/compileall.rst +++ b/Doc/library/compileall.rst @@ -148,7 +148,7 @@ runtime. Public functions ---------------- -.. function:: compile_dir(dir, maxlevels=sys.getrecursionlimit(), ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, workers=1, invalidation_mode=None, \*, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False) +.. function:: compile_dir(dir, maxlevels=sys.getrecursionlimit(), ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, workers=1, invalidation_mode=None, *, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False) Recursively descend the directory tree named by *dir*, compiling all :file:`.py` files along the way. Return a true value if all the files compiled successfully, @@ -231,7 +231,7 @@ Public functions Added *stripdir*, *prependdir*, *limit_sl_dest* and *hardlink_dupes* arguments. Default value of *maxlevels* was changed from ``10`` to ``sys.getrecursionlimit()`` -.. function:: compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, invalidation_mode=None, \*, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False) +.. function:: compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, invalidation_mode=None, *, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False) Compile the file with path *fullname*. Return a true value if the file compiled successfully, and a false value otherwise. diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 61d6c1143cfdd5..d57f8ce23d12c4 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -67,7 +67,7 @@ Executor Objects .. versionchanged:: 3.5 Added the *chunksize* argument. - .. method:: shutdown(wait=True, \*, cancel_futures=False) + .. method:: shutdown(wait=True, *, cancel_futures=False) Signal the executor that it should free any resources that it is using when the currently pending futures are done executing. Calls to diff --git a/Doc/library/contextvars.rst b/Doc/library/contextvars.rst index 8805661c456edb..14ac47f4c9eb16 100644 --- a/Doc/library/contextvars.rst +++ b/Doc/library/contextvars.rst @@ -26,7 +26,7 @@ See also :pep:`567` for additional details. Context Variables ----------------- -.. class:: ContextVar(name, [\*, default]) +.. class:: ContextVar(name, [*, default]) This class is used to declare a new Context Variable, e.g.:: @@ -146,7 +146,7 @@ Manual Context Management Context implements the :class:`collections.abc.Mapping` interface. - .. method:: run(callable, \*args, \*\*kwargs) + .. method:: run(callable, *args, **kwargs) Execute ``callable(*args, **kwargs)`` code in the context object the *run* method is called on. Return the result of the execution diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index bf32d3e549b480..7313148721dac6 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -2508,7 +2508,7 @@ other data types containing pointer type fields. Arrays and pointers ^^^^^^^^^^^^^^^^^^^ -.. class:: Array(\*args) +.. class:: Array(*args) Abstract base class for arrays. diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst index aa08988c8b36f7..a5ee0fb5389793 100644 --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -149,7 +149,7 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module. contains a good example of its use. -.. function:: context_diff(a, b, fromfile='', tofile='', fromfiledate='', tofiledate='', n=3, lineterm='\\n') +.. function:: context_diff(a, b, fromfile='', tofile='', fromfiledate='', tofiledate='', n=3, lineterm='\n') Compare *a* and *b* (lists of strings); return a delta (a :term:`generator` generating the delta lines) in context diff format. @@ -279,7 +279,7 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module. emu -.. function:: unified_diff(a, b, fromfile='', tofile='', fromfiledate='', tofiledate='', n=3, lineterm='\\n') +.. function:: unified_diff(a, b, fromfile='', tofile='', fromfiledate='', tofiledate='', n=3, lineterm='\n') Compare *a* and *b* (lists of strings); return a delta (a :term:`generator` generating the delta lines) in unified diff format. @@ -321,7 +321,7 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module. See :ref:`difflib-interface` for a more detailed example. -.. function:: diff_bytes(dfunc, a, b, fromfile=b'', tofile=b'', fromfiledate=b'', tofiledate=b'', n=3, lineterm=b'\\n') +.. function:: diff_bytes(dfunc, a, b, fromfile=b'', tofile=b'', fromfiledate=b'', tofiledate=b'', n=3, lineterm=b'\n') Compare *a* and *b* (lists of bytes objects) using *dfunc*; yield a sequence of delta lines (also bytes) in the format returned by *dfunc*. diff --git a/Doc/library/email.header.rst b/Doc/library/email.header.rst index 07152c224f2ff0..e093f138936b36 100644 --- a/Doc/library/email.header.rst +++ b/Doc/library/email.header.rst @@ -116,7 +116,7 @@ Here is the :class:`Header` class description: if *s* is a byte string. - .. method:: encode(splitchars=';, \\t', maxlinelen=None, linesep='\\n') + .. method:: encode(splitchars=';, \t', maxlinelen=None, linesep='\n') Encode a message header into an RFC-compliant format, possibly wrapping long lines and encapsulating non-ASCII parts in base64 or quoted-printable diff --git a/Doc/library/email.policy.rst b/Doc/library/email.policy.rst index 8e7076259810f5..bf53b9520fc723 100644 --- a/Doc/library/email.policy.rst +++ b/Doc/library/email.policy.rst @@ -210,7 +210,7 @@ added matters. To illustrate:: :meth:`register_defect` method. - .. attribute:: mangle_from\_ + .. attribute:: mangle_from_ If :const:`True`, lines starting with *"From "* in the body are escaped by putting a ``>`` in front of them. This parameter is used when diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 24dc65d563c66d..0598a6ce9415e2 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1334,7 +1334,7 @@ are always available. They are listed here in alphabetical order. supported. -.. function:: print(*objects, sep=' ', end='\\n', file=sys.stdout, flush=False) +.. function:: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) Print *objects* to the text stream *file*, separated by *sep* and followed by *end*. *sep*, *end*, *file* and *flush*, if present, must be given as keyword diff --git a/Doc/library/http.cookies.rst b/Doc/library/http.cookies.rst index 17792b200599bd..a2c1eb00d8b33d 100644 --- a/Doc/library/http.cookies.rst +++ b/Doc/library/http.cookies.rst @@ -93,7 +93,7 @@ Cookie Objects :meth:`value_decode` are inverses on the range of *value_decode*. -.. method:: BaseCookie.output(attrs=None, header='Set-Cookie:', sep='\\r\\n') +.. method:: BaseCookie.output(attrs=None, header='Set-Cookie:', sep='\r\n') Return a string representation suitable to be sent as HTTP headers. *attrs* and *header* are sent to each :class:`Morsel`'s :meth:`output` method. *sep* is used diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index 45b62aec9ef537..f1c444fe8232c0 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -1138,7 +1138,7 @@ find and load modules. directory for ``''`` (i.e. the empty string). -.. class:: FileFinder(path, \*loader_details) +.. class:: FileFinder(path, *loader_details) A concrete implementation of :class:`importlib.abc.PathEntryFinder` which caches results from the file system. @@ -1181,7 +1181,7 @@ find and load modules. Clear out the internal cache. - .. classmethod:: path_hook(\*loader_details) + .. classmethod:: path_hook(*loader_details) A class method which returns a closure for use on :attr:`sys.path_hooks`. An instance of :class:`FileFinder` is returned by the closure using the diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index d00a30ff004063..b53a9421fbca61 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -556,7 +556,7 @@ The Signature object represents the call signature of a callable object and its return annotation. To retrieve a Signature object, use the :func:`signature` function. -.. function:: signature(callable, \*, follow_wrapped=True) +.. function:: signature(callable, *, follow_wrapped=True) Return a :class:`Signature` object for the given ``callable``:: @@ -597,7 +597,7 @@ function. C provide no metadata about their arguments. -.. class:: Signature(parameters=None, \*, return_annotation=Signature.empty) +.. class:: Signature(parameters=None, *, return_annotation=Signature.empty) A Signature object represents the call signature of a function and its return annotation. For each parameter accepted by the function it stores a @@ -668,7 +668,7 @@ function. >>> str(new_sig) "(a, b) -> 'new return anno'" - .. classmethod:: Signature.from_callable(obj, \*, follow_wrapped=True) + .. classmethod:: Signature.from_callable(obj, *, follow_wrapped=True) Return a :class:`Signature` (or its subclass) object for a given callable ``obj``. Pass ``follow_wrapped=False`` to get a signature of ``obj`` @@ -684,7 +684,7 @@ function. .. versionadded:: 3.5 -.. class:: Parameter(name, kind, \*, default=Parameter.empty, annotation=Parameter.empty) +.. class:: Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty) Parameter objects are *immutable*. Instead of modifying a Parameter object, you can use :meth:`Parameter.replace` to create a modified copy. diff --git a/Doc/library/io.rst b/Doc/library/io.rst index aecbec56866d73..048cb2a7ff6924 100644 --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -964,7 +964,7 @@ Text I/O .. versionadded:: 3.7 -.. class:: StringIO(initial_value='', newline='\\n') +.. class:: StringIO(initial_value='', newline='\n') A text stream using an in-memory text buffer. It inherits :class:`TextIOBase`. diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst index 4bfff9c6147ed4..633c87873cd8ce 100644 --- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -33,7 +33,7 @@ from multiple threads, it is necessary to protect it with a lock. Reading and writing compressed files ------------------------------------ -.. function:: open(filename, mode="rb", \*, format=None, check=-1, preset=None, filters=None, encoding=None, errors=None, newline=None) +.. function:: open(filename, mode="rb", *, format=None, check=-1, preset=None, filters=None, encoding=None, errors=None, newline=None) Open an LZMA-compressed file in binary or text mode, returning a :term:`file object`. @@ -69,7 +69,7 @@ Reading and writing compressed files Accepts a :term:`path-like object`. -.. class:: LZMAFile(filename=None, mode="r", \*, format=None, check=-1, preset=None, filters=None) +.. class:: LZMAFile(filename=None, mode="r", *, format=None, check=-1, preset=None, filters=None) Open an LZMA-compressed file in binary mode. diff --git a/Doc/library/os.rst b/Doc/library/os.rst index b3099886889599..ab1a615b6ea2a4 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1991,7 +1991,7 @@ features: Accepts a :term:`path-like object`. -.. function:: lstat(path, \*, dir_fd=None) +.. function:: lstat(path, *, dir_fd=None) Perform the equivalent of an :c:func:`lstat` system call on the given path. Similar to :func:`~os.stat`, but does not follow symbolic links. Return a @@ -2498,7 +2498,7 @@ features: On the first, uncached call, a system call is required on Windows but not on Unix. - .. method:: is_dir(\*, follow_symlinks=True) + .. method:: is_dir(*, follow_symlinks=True) Return ``True`` if this entry is a directory or a symbolic link pointing to a directory; return ``False`` if the entry is or points to any other @@ -2522,7 +2522,7 @@ features: This method can raise :exc:`OSError`, such as :exc:`PermissionError`, but :exc:`FileNotFoundError` is caught and not raised. - .. method:: is_file(\*, follow_symlinks=True) + .. method:: is_file(*, follow_symlinks=True) Return ``True`` if this entry is a file or a symbolic link pointing to a file; return ``False`` if the entry is or points to a directory or other @@ -2552,7 +2552,7 @@ features: This method can raise :exc:`OSError`, such as :exc:`PermissionError`, but :exc:`FileNotFoundError` is caught and not raised. - .. method:: stat(\*, follow_symlinks=True) + .. method:: stat(*, follow_symlinks=True) Return a :class:`stat_result` object for this entry. This method follows symbolic links by default; to stat a symbolic link add the @@ -2584,7 +2584,7 @@ features: for :class:`bytes` paths on Windows. -.. function:: stat(path, \*, dir_fd=None, follow_symlinks=True) +.. function:: stat(path, *, dir_fd=None, follow_symlinks=True) Get the status of a file or a file descriptor. Perform the equivalent of a :c:func:`stat` system call on the given path. *path* may be specified as diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index b7c34527719486..be48561ed10ac8 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -213,7 +213,7 @@ The :mod:`pickle` module provides the following constants: The :mod:`pickle` module provides the following functions to make the pickling process more convenient: -.. function:: dump(obj, file, protocol=None, \*, fix_imports=True, buffer_callback=None) +.. function:: dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None) Write the pickled representation of the object *obj* to the open :term:`file object` *file*. This is equivalent to @@ -225,7 +225,7 @@ process more convenient: .. versionchanged:: 3.8 The *buffer_callback* argument was added. -.. function:: dumps(obj, protocol=None, \*, fix_imports=True, buffer_callback=None) +.. function:: dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None) Return the pickled representation of the object *obj* as a :class:`bytes` object, instead of writing it to a file. @@ -236,7 +236,7 @@ process more convenient: .. versionchanged:: 3.8 The *buffer_callback* argument was added. -.. function:: load(file, \*, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) +.. function:: load(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) Read the pickled representation of an object from the open :term:`file object` *file* and return the reconstituted object hierarchy specified therein. @@ -252,7 +252,7 @@ process more convenient: .. versionchanged:: 3.8 The *buffers* argument was added. -.. function:: loads(data, /, \*, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) +.. function:: loads(data, /, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) Return the reconstituted object hierarchy of the pickled representation *data* of an object. *data* must be a :term:`bytes-like object`. @@ -296,7 +296,7 @@ The :mod:`pickle` module defines three exceptions: The :mod:`pickle` module exports three classes, :class:`Pickler`, :class:`Unpickler` and :class:`PickleBuffer`: -.. class:: Pickler(file, protocol=None, \*, fix_imports=True, buffer_callback=None) +.. class:: Pickler(file, protocol=None, *, fix_imports=True, buffer_callback=None) This takes a binary file for writing a pickle data stream. @@ -391,7 +391,7 @@ The :mod:`pickle` module exports three classes, :class:`Pickler`, Use :func:`pickletools.optimize` if you need more compact pickles. -.. class:: Unpickler(file, \*, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) +.. class:: Unpickler(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) This takes a binary file for reading a pickle data stream. diff --git a/Doc/library/plistlib.rst b/Doc/library/plistlib.rst index 6def72b3736b91..ce6d4a85bf5e9d 100644 --- a/Doc/library/plistlib.rst +++ b/Doc/library/plistlib.rst @@ -52,7 +52,7 @@ or :class:`datetime.datetime` objects. This module defines the following functions: -.. function:: load(fp, \*, fmt=None, dict_type=dict) +.. function:: load(fp, *, fmt=None, dict_type=dict) Read a plist file. *fp* should be a readable and binary file object. Return the unpacked root object (which usually is a @@ -80,7 +80,7 @@ This module defines the following functions: .. versionadded:: 3.4 -.. function:: loads(data, \*, fmt=None, dict_type=dict) +.. function:: loads(data, *, fmt=None, dict_type=dict) Load a plist from a bytes object. See :func:`load` for an explanation of the keyword arguments. @@ -88,7 +88,7 @@ This module defines the following functions: .. versionadded:: 3.4 -.. function:: dump(value, fp, \*, fmt=FMT_XML, sort_keys=True, skipkeys=False) +.. function:: dump(value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False) Write *value* to a plist file. *Fp* should be a writable, binary file object. @@ -116,7 +116,7 @@ This module defines the following functions: .. versionadded:: 3.4 -.. function:: dumps(value, \*, fmt=FMT_XML, sort_keys=True, skipkeys=False) +.. function:: dumps(value, *, fmt=FMT_XML, sort_keys=True, skipkeys=False) Return *value* as a plist-formatted bytes object. See the documentation for :func:`dump` for an explanation of the keyword diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 3f5122760ee16f..435787c27661d5 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -218,7 +218,7 @@ Directory and files operations copy the file more efficiently. See :ref:`shutil-platform-dependent-efficient-copy-operations` section. -.. function:: ignore_patterns(\*patterns) +.. function:: ignore_patterns(*patterns) This factory function creates a function that can be used as a callable for :func:`copytree`\'s *ignore* argument, ignoring files and directories that diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 59c2b84b52719c..e48f67bfb96367 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -499,7 +499,7 @@ class`. In addition, it provides a few more methods: .. versionadded:: 3.10 -.. method:: int.to_bytes(length, byteorder, \*, signed=False) +.. method:: int.to_bytes(length, byteorder, *, signed=False) Return an array of bytes representing an integer. @@ -531,7 +531,7 @@ class`. In addition, it provides a few more methods: .. versionadded:: 3.2 -.. classmethod:: int.from_bytes(bytes, byteorder, \*, signed=False) +.. classmethod:: int.from_bytes(bytes, byteorder, *, signed=False) Return the integer represented by the given array of bytes. diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 7f947efcb6766b..4ac3f80a319f80 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -339,7 +339,7 @@ functions. stderr=None, preexec_fn=None, close_fds=True, shell=False, \ cwd=None, env=None, universal_newlines=None, \ startupinfo=None, creationflags=0, restore_signals=True, \ - start_new_session=False, pass_fds=(), \*, group=None, \ + start_new_session=False, pass_fds=(), *, group=None, \ extra_groups=None, user=None, umask=-1, \ encoding=None, errors=None, text=None, pipesize=-1) diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst index 78a1dfce9ae05c..c9306e9bf9de16 100644 --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -32,7 +32,7 @@ can be accessed using :func:`get_config_vars` or :func:`get_config_var`. Notice that on Windows, it's a much smaller set. -.. function:: get_config_vars(\*args) +.. function:: get_config_vars(*args) With no arguments, return a dictionary of all configuration variables relevant for the current platform. diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index 7a114fdf5d54b1..13088a10d77c57 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -37,7 +37,7 @@ Some facts and figures: Added support for :mod:`lzma` compression. -.. function:: open(name=None, mode='r', fileobj=None, bufsize=10240, \*\*kwargs) +.. function:: open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs) Return a :class:`TarFile` object for the pathname *name*. For detailed information on :class:`TarFile` objects and the keyword arguments that are diff --git a/Doc/library/test.rst b/Doc/library/test.rst index ce6b868458ea4f..e4f779bd83eb87 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -453,7 +453,7 @@ The :mod:`test.support` module defines the following functions: Define match test with regular expression *patterns*. -.. function:: run_unittest(\*classes) +.. function:: run_unittest(*classes) Execute :class:`unittest.TestCase` subclasses passed to the function. The function scans the classes for methods starting with the prefix ``test_`` @@ -1599,7 +1599,7 @@ The :mod:`test.support.warnings_helper` module provides support for warnings tes .. versionadded:: 3.8 -.. function:: check_warnings(\*filters, quiet=True) +.. function:: check_warnings(*filters, quiet=True) A convenience wrapper for :func:`warnings.catch_warnings()` that makes it easier to test that a warning was correctly raised. It is approximately diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst index a481a3509d4ec8..9c1743cad23cb7 100644 --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -491,7 +491,7 @@ Available Functions Available Context Managers -------------------------- -.. class:: catch_warnings(\*, record=False, module=None) +.. class:: catch_warnings(*, record=False, module=None) A context manager that copies and, upon exit, restores the warnings filter and the :func:`showwarning` function. diff --git a/Doc/library/winreg.rst b/Doc/library/winreg.rst index dccb7db27e90cc..487856a3ac6c60 100644 --- a/Doc/library/winreg.rst +++ b/Doc/library/winreg.rst @@ -791,7 +791,7 @@ integer handle, and also disconnect the Windows handle from the handle object. .. method:: PyHKEY.__enter__() - PyHKEY.__exit__(\*exc_info) + PyHKEY.__exit__(*exc_info) The HKEY object implements :meth:`~object.__enter__` and :meth:`~object.__exit__` and thus supports the context protocol for the diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index bf72c46561b7c7..e1cc96794221ad 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -174,7 +174,7 @@ module documentation. This section lists the differences between the API and The :meth:`toxml` method now preserves the attribute order specified by the user. -.. method:: Node.toprettyxml(indent="\\t", newl="\\n", encoding=None, \ +.. method:: Node.toprettyxml(indent="\t", newl="\n", encoding=None, \ standalone=None) Return a pretty-printed version of the document. *indent* specifies the From d54c548a99875d1845d80ea71812955c7ab35571 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Thu, 17 Dec 2020 18:04:47 +0800 Subject: [PATCH 0814/1261] bpo-31904: Skip some asyncio tests on VxWorks (#23815) --- Lib/test/test_asyncio/test_base_events.py | 2 ++ Lib/test/test_asyncio/test_events.py | 9 ++++++++- .../Tests/2020-12-17-15-42-44.bpo-31904.d8g3l0d5.rst | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-12-17-15-42-44.bpo-31904.d8g3l0d5.rst diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 8d048c87d00507..e40e7999b64d15 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1745,6 +1745,8 @@ class FakeSock: MyDatagramProto, allow_broadcast=True, sock=FakeSock()) self.assertRaises(ValueError, self.loop.run_until_complete, fut) + @unittest.skipIf(sys.platform == 'vxworks', + "SO_BROADCAST is enabled by default on VxWorks") def test_create_datagram_endpoint_sockopts(self): # Socket options should not be applied unless asked for. # SO_REUSEPORT is not available on all platforms. diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index ce615606db7e3d..6523a79b4a6344 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -22,7 +22,7 @@ from unittest import mock import weakref -if sys.platform != 'win32': +if sys.platform not in ('win32', 'vxworks'): import tty import asyncio @@ -465,6 +465,8 @@ def my_handler(): self.assertFalse(self.loop.remove_signal_handler(signal.SIGINT)) @unittest.skipUnless(hasattr(signal, 'SIGALRM'), 'No SIGALRM') + @unittest.skipUnless(hasattr(signal, 'setitimer'), + 'need signal.setitimer()') def test_signal_handling_while_selecting(self): # Test with a signal actually arriving during a select() call. caught = 0 @@ -482,6 +484,8 @@ def my_handler(): self.assertEqual(caught, 1) @unittest.skipUnless(hasattr(signal, 'SIGALRM'), 'No SIGALRM') + @unittest.skipUnless(hasattr(signal, 'setitimer'), + 'need signal.setitimer()') def test_signal_handling_args(self): some_args = (42,) caught = 0 @@ -1371,6 +1375,7 @@ async def connect(): @unittest.skipUnless(sys.platform != 'win32', "Don't support pipes for Windows") + @unittest.skipUnless(hasattr(os, 'openpty'), 'need os.openpty()') def test_read_pty_output(self): proto = MyReadPipeProto(loop=self.loop) @@ -1468,6 +1473,7 @@ def test_write_pipe_disconnect_on_close(self): @unittest.skipUnless(sys.platform != 'win32', "Don't support pipes for Windows") + @unittest.skipUnless(hasattr(os, 'openpty'), 'need os.openpty()') # select, poll and kqueue don't support character devices (PTY) on Mac OS X # older than 10.6 (Snow Leopard) @support.requires_mac_ver(10, 6) @@ -1512,6 +1518,7 @@ def reader(data): @unittest.skipUnless(sys.platform != 'win32', "Don't support pipes for Windows") + @unittest.skipUnless(hasattr(os, 'openpty'), 'need os.openpty()') # select, poll and kqueue don't support character devices (PTY) on Mac OS X # older than 10.6 (Snow Leopard) @support.requires_mac_ver(10, 6) diff --git a/Misc/NEWS.d/next/Tests/2020-12-17-15-42-44.bpo-31904.d8g3l0d5.rst b/Misc/NEWS.d/next/Tests/2020-12-17-15-42-44.bpo-31904.d8g3l0d5.rst new file mode 100644 index 00000000000000..d74e4666853b56 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-12-17-15-42-44.bpo-31904.d8g3l0d5.rst @@ -0,0 +1 @@ +Skip some asyncio tests on VxWorks. From 53acfc77236e5a9119a992ce2713f6f0ba5ac085 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Thu, 17 Dec 2020 12:33:07 +0000 Subject: [PATCH 0815/1261] bpo-26564: fix obsolete comment in traceback.c (GH-23819) --- Python/traceback.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Python/traceback.c b/Python/traceback.c index 708678facf7c31..b82cfd3665ce1d 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -622,7 +622,8 @@ PyTraceBack_Print(PyObject *v, PyObject *f) return err; } -/* Reverse a string. For example, "abcd" becomes "dcba". +/* Format an integer in range [0; 0xffffffff] to decimal and write it + into the file fd. This function is signal safe. */ From ae7808e26a46b66b3a5016924b3ce79bc83dc5fa Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 17 Dec 2020 13:55:28 +0000 Subject: [PATCH 0816/1261] bpo-42246: Make sure that `f_lasti`, and thus `f_lineno`, is set correctly after raising or reraising an exception (GH-23803) * Ensure that f_lasti is set correctly after an exception is raised to conform to PEP 626. * Update importlib * Add NEWS. --- Doc/library/dis.rst | 3 +- Include/opcode.h | 2 +- Lib/importlib/_bootstrap_external.py | 3 +- Lib/opcode.py | 2 +- Lib/test/test_dis.py | 14 +- Lib/test/test_exceptions.py | 83 ++++++ .../2020-12-16-14-44-21.bpo-42246.RtIEY7.rst | 3 + Python/ceval.c | 6 +- Python/compile.c | 8 +- Python/importlib.h | 86 +++--- Python/importlib_external.h | 276 +++++++++--------- Python/importlib_zipimport.h | 52 ++-- Python/opcode_targets.h | 4 +- 13 files changed, 317 insertions(+), 225 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-16-14-44-21.bpo-42246.RtIEY7.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index ec64d3daf003a9..c09d8338d2c3b3 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -708,7 +708,8 @@ iterations of the loop. .. opcode:: RERAISE - Re-raises the exception currently on top of the stack. + Re-raises the exception currently on top of the stack. If oparg is non-zero, + restores ``f_lasti`` of the current frame to its value when the exception was raised. .. versionadded:: 3.9 diff --git a/Include/opcode.h b/Include/opcode.h index 420c87aa0f24f3..998a5ce492d03f 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -30,7 +30,6 @@ extern "C" { #define BINARY_TRUE_DIVIDE 27 #define INPLACE_FLOOR_DIVIDE 28 #define INPLACE_TRUE_DIVIDE 29 -#define RERAISE 48 #define WITH_EXCEPT_START 49 #define GET_AITER 50 #define GET_ANEXT 51 @@ -96,6 +95,7 @@ extern "C" { #define LOAD_GLOBAL 116 #define IS_OP 117 #define CONTAINS_OP 118 +#define RERAISE 119 #define JUMP_IF_NOT_EXC_MATCH 121 #define SETUP_FINALLY 122 #define LOAD_FAST 124 diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index d9e44df409062c..354650011e1d92 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -312,6 +312,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.10a1 3430 (Make 'annotations' future by default) # Python 3.10a1 3431 (New line number table format -- PEP 626) # Python 3.10a2 3432 (Function annotation for MAKE_FUNCTION is changed from dict to tuple bpo-42202) +# Python 3.10a2 3433 (RERAISE restores f_lasti if oparg != 0) # # MAGIC must change whenever the bytecode emitted by the compiler may no @@ -321,7 +322,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3432).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3433).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/Lib/opcode.py b/Lib/opcode.py index ac1aa535f66ff6..cc321166e79262 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -83,7 +83,6 @@ def jabs_op(name, op): def_op('INPLACE_FLOOR_DIVIDE', 28) def_op('INPLACE_TRUE_DIVIDE', 29) -def_op('RERAISE', 48) def_op('WITH_EXCEPT_START', 49) def_op('GET_AITER', 50) def_op('GET_ANEXT', 51) @@ -161,6 +160,7 @@ def jabs_op(name, op): def_op('IS_OP', 117) def_op('CONTAINS_OP', 118) +def_op('RERAISE', 119) jabs_op('JUMP_IF_NOT_EXC_MATCH', 121) jrel_op('SETUP_FINALLY', 122) # Distance to target address diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index f279f75c9614d5..786744923eb461 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -313,9 +313,9 @@ def bug42562(): >> 50 LOAD_CONST 0 (None) 52 STORE_FAST 0 (e) 54 DELETE_FAST 0 (e) - 56 RERAISE + 56 RERAISE 1 -%3d >> 58 RERAISE +%3d >> 58 RERAISE 0 """ % (TRACEBACK_CODE.co_firstlineno + 1, TRACEBACK_CODE.co_firstlineno + 2, TRACEBACK_CODE.co_firstlineno + 5, @@ -370,7 +370,7 @@ def _tryfinallyconst(b): >> 14 LOAD_FAST 1 (b) 16 CALL_FUNCTION 0 18 POP_TOP - 20 RERAISE + 20 RERAISE 0 """ % (_tryfinally.__code__.co_firstlineno + 1, _tryfinally.__code__.co_firstlineno + 2, _tryfinally.__code__.co_firstlineno + 4, @@ -389,7 +389,7 @@ def _tryfinallyconst(b): >> 14 LOAD_FAST 0 (b) 16 CALL_FUNCTION 0 18 POP_TOP - 20 RERAISE + 20 RERAISE 0 """ % (_tryfinallyconst.__code__.co_firstlineno + 1, _tryfinallyconst.__code__.co_firstlineno + 2, _tryfinallyconst.__code__.co_firstlineno + 4, @@ -1076,7 +1076,7 @@ def jumpy(): Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=136, starts_line=None, is_jump_target=False), Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), Instruction(opname='JUMP_FORWARD', opcode=110, arg=46, argval=188, argrepr='to 188', offset=140, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=142, starts_line=None, is_jump_target=True), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=142, starts_line=None, is_jump_target=True), Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, starts_line=25, is_jump_target=True), Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=172, argrepr='to 172', offset=146, starts_line=None, is_jump_target=False), Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=148, starts_line=None, is_jump_target=False), @@ -1093,7 +1093,7 @@ def jumpy(): Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=188, argrepr='to 188', offset=170, starts_line=None, is_jump_target=False), Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=True), Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=178, argval=178, argrepr='', offset=174, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=176, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=176, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=True), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), @@ -1110,7 +1110,7 @@ def jumpy(): Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=204, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=206, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=208, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=210, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=210, starts_line=None, is_jump_target=False), ] # One last piece of inspect fodder to check the default line number handling diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index e752ab72ccff33..864422390ad302 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1488,5 +1488,88 @@ def test_copy_pickle(self): self.assertEqual(exc.path, orig.path) +class PEP626Tests(unittest.TestCase): + + def lineno_after_raise(self, f, line): + try: + f() + except Exception as ex: + t = ex.__traceback__ + while t.tb_next: + t = t.tb_next + frame = t.tb_frame + self.assertEqual(frame.f_lineno-frame.f_code.co_firstlineno, line) + + def test_lineno_after_raise_simple(self): + def simple(): + 1/0 + pass + self.lineno_after_raise(simple, 1) + + def test_lineno_after_raise_in_except(self): + def in_except(): + try: + 1/0 + except: + 1/0 + pass + self.lineno_after_raise(in_except, 4) + + def test_lineno_after_other_except(self): + def other_except(): + try: + 1/0 + except TypeError as ex: + pass + self.lineno_after_raise(other_except, 3) + + def test_lineno_in_named_except(self): + def in_named_except(): + try: + 1/0 + except Exception as ex: + 1/0 + pass + self.lineno_after_raise(in_named_except, 4) + + def test_lineno_in_try(self): + def in_try(): + try: + 1/0 + finally: + pass + self.lineno_after_raise(in_try, 4) + + def test_lineno_in_finally_normal(self): + def in_finally_normal(): + try: + pass + finally: + 1/0 + pass + self.lineno_after_raise(in_finally_normal, 4) + + def test_lineno_in_finally_except(self): + def in_finally_except(): + try: + 1/0 + finally: + 1/0 + pass + self.lineno_after_raise(in_finally_except, 4) + + def test_lineno_after_with(self): + class Noop: + def __enter__(self): + return self + def __exit__(self, *args): + pass + def after_with(): + with Noop(): + 1/0 + pass + self.lineno_after_raise(after_with, 2) + + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-16-14-44-21.bpo-42246.RtIEY7.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-16-14-44-21.bpo-42246.RtIEY7.rst new file mode 100644 index 00000000000000..a3814b6419e4c8 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-12-16-14-44-21.bpo-42246.RtIEY7.rst @@ -0,0 +1,3 @@ +Make sure that the ``f_lasti`` and ``f_lineno`` attributes of a frame are +set correctly when an exception is raised or re-raised. Required for PEP +626. diff --git a/Python/ceval.c b/Python/ceval.c index 9de925780e4072..f0f39539c97bb6 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2430,6 +2430,10 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) } case TARGET(RERAISE): { + assert(f->f_iblock > 0); + if (oparg) { + f->f_lasti = f->f_blockstack[f->f_iblock-1].b_handler; + } PyObject *exc = POP(); PyObject *val = POP(); PyObject *tb = POP(); @@ -4039,7 +4043,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) int handler = b->b_handler; _PyErr_StackItem *exc_info = tstate->exc_info; /* Beware, this invalidates all b->b_* fields */ - PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL()); + PyFrame_BlockSetup(f, EXCEPT_HANDLER, f->f_lasti, STACK_LEVEL()); PUSH(exc_info->exc_traceback); PUSH(exc_info->exc_value); if (exc_info->exc_type != NULL) { diff --git a/Python/compile.c b/Python/compile.c index 2871ffc476f8df..d4dbaf7b6aa774 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2981,7 +2981,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s) return 0; VISIT_SEQ(c, stmt, s->v.Try.finalbody); compiler_pop_fblock(c, FINALLY_END, end); - ADDOP(c, RERAISE); + ADDOP_I(c, RERAISE, 0); compiler_use_next_block(c, exit); return 1; } @@ -3107,7 +3107,7 @@ compiler_try_except(struct compiler *c, stmt_ty s) compiler_nameop(c, handler->v.ExceptHandler.name, Store); compiler_nameop(c, handler->v.ExceptHandler.name, Del); - ADDOP(c, RERAISE); + ADDOP_I(c, RERAISE, 1); } else { basicblock *cleanup_body; @@ -3129,7 +3129,7 @@ compiler_try_except(struct compiler *c, stmt_ty s) compiler_use_next_block(c, except); } compiler_pop_fblock(c, EXCEPTION_HANDLER, NULL); - ADDOP(c, RERAISE); + ADDOP_I(c, RERAISE, 0); compiler_use_next_block(c, orelse); VISIT_SEQ(c, stmt, s->v.Try.orelse); compiler_use_next_block(c, end); @@ -4759,7 +4759,7 @@ compiler_with_except_finish(struct compiler *c) { return 0; ADDOP_JUMP(c, POP_JUMP_IF_TRUE, exit); NEXT_BLOCK(c); - ADDOP(c, RERAISE); + ADDOP_I(c, RERAISE, 1); compiler_use_next_block(c, exit); ADDOP(c, POP_TOP); ADDOP(c, POP_TOP); diff --git a/Python/importlib.h b/Python/importlib.h index 1caf2f4f742d22..87b8c63ce85a8f 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -57,7 +57,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,67,0,0,0,115,38,0,0,0,122,8,124,0, 106,0,87,0,83,0,4,0,116,1,121,36,1,0,1,0, 1,0,116,2,124,0,131,1,106,0,6,0,89,0,83,0, - 48,0,169,1,78,41,3,218,12,95,95,113,117,97,108,110, + 119,0,169,1,78,41,3,218,12,95,95,113,117,97,108,110, 97,109,101,95,95,218,14,65,116,116,114,105,98,117,116,101, 69,114,114,111,114,218,4,116,121,112,101,41,1,218,3,111, 98,106,169,0,114,5,0,0,0,250,29,60,102,114,111,122, @@ -159,10 +159,10 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 161,0,114,112,116,7,100,5,124,0,22,0,131,1,130,1, 124,0,106,8,160,9,100,6,161,1,114,138,124,0,4,0, 106,10,100,3,55,0,2,0,95,10,87,0,100,4,4,0, - 4,0,131,3,1,0,110,16,49,0,115,158,48,0,1,0, + 4,0,131,3,1,0,110,16,49,0,115,158,119,1,1,0, 1,0,1,0,89,0,1,0,124,0,106,8,160,9,161,0, 1,0,124,0,106,8,160,11,161,0,1,0,113,20,116,2, - 124,1,61,0,48,0,41,7,122,185,10,32,32,32,32,32, + 124,1,61,0,119,0,41,7,122,185,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, @@ -197,7 +197,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,106,6,114,108,124,0,4,0,106,6,100,3,56,0,2, 0,95,6,124,0,106,7,160,8,161,0,1,0,87,0,100, 0,4,0,4,0,131,3,1,0,100,0,83,0,49,0,115, - 130,48,0,1,0,1,0,1,0,89,0,1,0,100,0,83, + 130,119,1,1,0,1,0,1,0,89,0,1,0,100,0,83, 0,41,4,78,250,31,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,114,25,0,0,0,114,42,0,0,0,41, @@ -323,12 +323,12 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 67,0,0,0,115,134,0,0,0,116,0,160,1,161,0,1, 0,122,114,122,14,116,2,124,0,25,0,131,0,125,1,87, 0,110,22,4,0,116,3,121,46,1,0,1,0,1,0,100, - 1,125,1,89,0,110,2,48,0,124,1,100,1,117,0,114, + 1,125,1,89,0,110,2,119,0,124,1,100,1,117,0,114, 110,116,4,100,1,117,0,114,74,116,5,124,0,131,1,125, 1,110,8,116,6,124,0,131,1,125,1,124,0,102,1,100, 2,100,3,132,1,125,2,116,7,160,8,124,1,124,2,161, 2,116,2,124,0,60,0,87,0,116,0,160,9,161,0,1, - 0,124,1,83,0,116,0,160,9,161,0,1,0,48,0,41, + 0,124,1,83,0,116,0,160,9,161,0,1,0,119,0,41, 4,122,139,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, @@ -343,7 +343,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 1,161,0,1,0,122,34,116,2,160,3,124,1,161,1,124, 0,117,0,114,30,116,2,124,1,61,0,87,0,116,0,160, 4,161,0,1,0,100,0,83,0,116,0,160,4,161,0,1, - 0,48,0,114,0,0,0,0,41,5,218,4,95,105,109,112, + 0,119,0,114,0,0,0,0,41,5,218,4,95,105,109,112, 218,12,97,99,113,117,105,114,101,95,108,111,99,107,218,13, 95,109,111,100,117,108,101,95,108,111,99,107,115,114,38,0, 0,0,218,12,114,101,108,101,97,115,101,95,108,111,99,107, @@ -365,7 +365,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,0,2,0,0,0,8,0,0,0,67,0,0,0, 115,54,0,0,0,116,0,124,0,131,1,125,1,122,12,124, 1,160,1,161,0,1,0,87,0,110,20,4,0,116,2,121, - 40,1,0,1,0,1,0,89,0,100,1,83,0,48,0,124, + 40,1,0,1,0,1,0,89,0,100,1,83,0,119,0,124, 1,160,3,161,0,1,0,100,1,83,0,41,2,122,189,65, 99,113,117,105,114,101,115,32,116,104,101,110,32,114,101,108, 101,97,115,101,115,32,116,104,101,32,109,111,100,117,108,101, @@ -527,16 +527,16 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 210,0,0,0,116,0,124,0,100,1,100,0,131,3,125,1, 116,1,124,1,100,2,131,2,114,54,122,12,124,1,160,2, 124,0,161,1,87,0,83,0,4,0,116,3,121,52,1,0, - 1,0,1,0,89,0,110,2,48,0,122,10,124,0,106,4, + 1,0,1,0,89,0,110,2,119,0,122,10,124,0,106,4, 125,2,87,0,110,18,4,0,116,5,121,82,1,0,1,0, - 1,0,89,0,110,18,48,0,124,2,100,0,117,1,114,100, + 1,0,89,0,110,18,119,0,124,2,100,0,117,1,114,100, 116,6,124,2,131,1,83,0,122,10,124,0,106,7,125,3, 87,0,110,22,4,0,116,5,121,132,1,0,1,0,1,0, - 100,3,125,3,89,0,110,2,48,0,122,10,124,0,106,8, + 100,3,125,3,89,0,110,2,119,0,122,10,124,0,106,8, 125,4,87,0,110,52,4,0,116,5,121,196,1,0,1,0, 1,0,124,1,100,0,117,0,114,180,100,4,160,9,124,3, 161,1,6,0,89,0,83,0,100,5,160,9,124,3,124,1, - 161,2,6,0,89,0,83,0,48,0,100,6,160,9,124,3, + 161,2,6,0,89,0,83,0,119,0,100,6,160,9,124,3, 124,4,161,2,83,0,41,7,78,218,10,95,95,108,111,97, 100,101,114,95,95,218,11,109,111,100,117,108,101,95,114,101, 112,114,250,1,63,250,13,60,109,111,100,117,108,101,32,123, @@ -708,7 +708,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 111,76,124,2,124,1,106,0,107,2,111,76,124,0,106,4, 124,1,106,4,107,2,111,76,124,0,106,5,124,1,106,5, 107,2,87,0,83,0,4,0,116,6,121,100,1,0,1,0, - 1,0,116,7,6,0,89,0,83,0,48,0,114,0,0,0, + 1,0,116,7,6,0,89,0,83,0,119,0,114,0,0,0, 0,41,8,114,123,0,0,0,114,20,0,0,0,114,116,0, 0,0,114,120,0,0,0,218,6,99,97,99,104,101,100,218, 12,104,97,115,95,108,111,99,97,116,105,111,110,114,2,0, @@ -785,7 +785,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 100,4,141,3,83,0,124,3,100,2,117,0,114,134,116,0, 124,1,100,5,131,2,114,130,122,14,124,1,160,4,124,0, 161,1,125,3,87,0,110,26,4,0,116,5,121,128,1,0, - 1,0,1,0,100,2,125,3,89,0,110,6,48,0,100,6, + 1,0,1,0,100,2,125,3,89,0,110,6,119,0,100,6, 125,3,116,6,124,0,124,1,124,2,124,3,100,7,141,4, 83,0,41,8,122,53,82,101,116,117,114,110,32,97,32,109, 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, @@ -807,20 +807,20 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0, 0,67,0,0,0,115,40,1,0,0,122,10,124,0,106,0, 125,3,87,0,110,18,4,0,116,1,121,28,1,0,1,0, - 1,0,89,0,110,14,48,0,124,3,100,0,117,1,114,42, + 1,0,89,0,110,14,119,0,124,3,100,0,117,1,114,42, 124,3,83,0,124,0,106,2,125,4,124,1,100,0,117,0, 114,86,122,10,124,0,106,3,125,1,87,0,110,18,4,0, - 116,1,121,84,1,0,1,0,1,0,89,0,110,2,48,0, + 116,1,121,84,1,0,1,0,1,0,89,0,110,2,119,0, 122,10,124,0,106,4,125,5,87,0,110,22,4,0,116,1, 121,118,1,0,1,0,1,0,100,0,125,5,89,0,110,2, - 48,0,124,2,100,0,117,0,114,174,124,5,100,0,117,0, + 119,0,124,2,100,0,117,0,114,174,124,5,100,0,117,0, 114,170,122,10,124,1,106,5,125,2,87,0,110,26,4,0, 116,1,121,168,1,0,1,0,1,0,100,0,125,2,89,0, - 110,6,48,0,124,5,125,2,122,10,124,0,106,6,125,6, + 110,6,119,0,124,5,125,2,122,10,124,0,106,6,125,6, 87,0,110,22,4,0,116,1,121,206,1,0,1,0,1,0, - 100,0,125,6,89,0,110,2,48,0,122,14,116,7,124,0, + 100,0,125,6,89,0,110,2,119,0,122,14,116,7,124,0, 106,8,131,1,125,7,87,0,110,22,4,0,116,1,121,244, - 1,0,1,0,1,0,100,0,125,7,89,0,110,2,48,0, + 1,0,1,0,1,0,100,0,125,7,89,0,110,2,119,0, 116,9,124,4,124,1,124,2,100,1,141,3,125,3,124,5, 100,0,117,0,144,1,114,18,100,2,110,2,100,3,124,3, 95,10,124,6,124,3,95,11,124,7,124,3,95,12,124,3, @@ -846,7 +846,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,115,214,1,0,0,124,2,115,20,116,0,124,1,100,1, 100,0,131,3,100,0,117,0,114,52,122,12,124,0,106,1, 124,1,95,2,87,0,110,18,4,0,116,3,121,50,1,0, - 1,0,1,0,89,0,110,2,48,0,124,2,115,72,116,0, + 1,0,1,0,89,0,110,2,119,0,124,2,115,72,116,0, 124,1,100,2,100,0,131,3,100,0,117,0,114,174,124,0, 106,4,125,3,124,3,100,0,117,0,114,144,124,0,106,5, 100,0,117,1,114,144,116,6,100,0,117,0,114,108,116,7, @@ -854,25 +854,25 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 125,3,124,0,106,5,124,3,95,10,124,3,124,0,95,4, 100,0,124,1,95,11,122,10,124,3,124,1,95,12,87,0, 110,18,4,0,116,3,121,172,1,0,1,0,1,0,89,0, - 110,2,48,0,124,2,115,194,116,0,124,1,100,3,100,0, + 110,2,119,0,124,2,115,194,116,0,124,1,100,3,100,0, 131,3,100,0,117,0,114,226,122,12,124,0,106,13,124,1, 95,14,87,0,110,18,4,0,116,3,121,224,1,0,1,0, - 1,0,89,0,110,2,48,0,122,10,124,0,124,1,95,15, + 1,0,89,0,110,2,119,0,122,10,124,0,124,1,95,15, 87,0,110,18,4,0,116,3,121,254,1,0,1,0,1,0, - 89,0,110,2,48,0,124,2,144,1,115,24,116,0,124,1, + 89,0,110,2,119,0,124,2,144,1,115,24,116,0,124,1, 100,4,100,0,131,3,100,0,117,0,144,1,114,70,124,0, 106,5,100,0,117,1,144,1,114,70,122,12,124,0,106,5, 124,1,95,16,87,0,110,20,4,0,116,3,144,1,121,68, - 1,0,1,0,1,0,89,0,110,2,48,0,124,0,106,17, + 1,0,1,0,1,0,89,0,110,2,119,0,124,0,106,17, 144,1,114,210,124,2,144,1,115,102,116,0,124,1,100,5, 100,0,131,3,100,0,117,0,144,1,114,136,122,12,124,0, 106,18,124,1,95,11,87,0,110,20,4,0,116,3,144,1, - 121,134,1,0,1,0,1,0,89,0,110,2,48,0,124,2, + 121,134,1,0,1,0,1,0,89,0,110,2,119,0,124,2, 144,1,115,160,116,0,124,1,100,6,100,0,131,3,100,0, 117,0,144,1,114,210,124,0,106,19,100,0,117,1,144,1, 114,210,122,14,124,0,106,19,124,1,95,20,87,0,124,1, 83,0,4,0,116,3,144,1,121,208,1,0,1,0,1,0, - 89,0,124,1,83,0,48,0,124,1,83,0,41,7,78,114, + 89,0,124,1,83,0,119,0,124,1,83,0,41,7,78,114, 9,0,0,0,114,106,0,0,0,218,11,95,95,112,97,99, 107,97,103,101,95,95,114,148,0,0,0,114,115,0,0,0, 114,146,0,0,0,41,21,114,13,0,0,0,114,20,0,0, @@ -953,9 +953,9 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 1,1,0,87,0,116,2,106,3,160,17,124,0,106,0,161, 1,125,1,124,1,116,2,106,3,124,0,106,0,60,0,110, 28,116,2,106,3,160,17,124,0,106,0,161,1,125,1,124, - 1,116,2,106,3,124,0,106,0,60,0,48,0,87,0,100, + 1,116,2,106,3,124,0,106,0,60,0,119,0,87,0,100, 3,4,0,4,0,131,3,1,0,124,1,83,0,49,0,144, - 1,115,12,48,0,1,0,1,0,1,0,89,0,1,0,124, + 1,115,12,119,1,1,0,1,0,1,0,89,0,1,0,124, 1,83,0,41,9,122,70,69,120,101,99,117,116,101,32,116, 104,101,32,115,112,101,99,39,115,32,115,112,101,99,105,102, 105,101,100,32,109,111,100,117,108,101,32,105,110,32,97,110, @@ -992,15 +992,15 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 3,106,4,124,0,106,2,60,0,116,6,124,1,100,1,100, 0,131,3,100,0,117,0,114,140,122,12,124,0,106,0,124, 1,95,7,87,0,110,18,4,0,116,8,121,138,1,0,1, - 0,1,0,89,0,110,2,48,0,116,6,124,1,100,2,100, + 0,1,0,89,0,110,2,119,0,116,6,124,1,100,2,100, 0,131,3,100,0,117,0,114,216,122,40,124,1,106,9,124, 1,95,10,116,11,124,1,100,3,131,2,115,194,124,0,106, 2,160,12,100,4,161,1,100,5,25,0,124,1,95,10,87, 0,110,18,4,0,116,8,121,214,1,0,1,0,1,0,89, - 0,110,2,48,0,116,6,124,1,100,6,100,0,131,3,100, + 0,110,2,119,0,116,6,124,1,100,6,100,0,131,3,100, 0,117,0,144,1,114,14,122,12,124,0,124,1,95,13,87, 0,124,1,83,0,4,0,116,8,144,1,121,12,1,0,1, - 0,1,0,89,0,124,1,83,0,48,0,124,1,83,0,41, + 0,1,0,89,0,124,1,83,0,119,0,124,1,83,0,41, 7,78,114,106,0,0,0,114,152,0,0,0,114,148,0,0, 0,114,135,0,0,0,114,25,0,0,0,114,113,0,0,0, 41,14,114,116,0,0,0,114,164,0,0,0,114,20,0,0, @@ -1028,10 +1028,10 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 14,124,2,161,1,1,0,87,0,110,40,1,0,1,0,1, 0,122,14,116,9,106,10,124,0,106,11,61,0,87,0,130, 0,4,0,116,15,121,176,1,0,1,0,1,0,89,0,130, - 0,48,0,116,9,106,10,160,16,124,0,106,11,161,1,125, + 0,119,0,116,9,106,10,160,16,124,0,106,11,161,1,125, 2,124,2,116,9,106,10,124,0,106,11,60,0,116,17,100, 6,124,0,106,11,124,0,106,0,131,3,1,0,87,0,100, - 7,124,0,95,8,124,2,83,0,100,7,124,0,95,8,48, + 7,124,0,95,8,124,2,83,0,100,7,124,0,95,8,119, 0,41,8,78,114,157,0,0,0,114,162,0,0,0,84,114, 161,0,0,0,114,19,0,0,0,122,18,105,109,112,111,114, 116,32,123,33,114,125,32,35,32,123,33,114,125,70,41,18, @@ -1053,7 +1053,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,67,0,0,0,115,54,0,0,0,116,0,124,0,106,1, 131,1,143,24,1,0,116,2,124,0,131,1,87,0,2,0, 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,40, - 48,0,1,0,1,0,1,0,89,0,1,0,100,1,83,0, + 119,1,1,0,1,0,1,0,89,0,1,0,100,1,83,0, 41,2,122,191,82,101,116,117,114,110,32,97,32,110,101,119, 32,109,111,100,117,108,101,32,111,98,106,101,99,116,44,32, 108,111,97,100,101,100,32,98,121,32,116,104,101,32,115,112, @@ -1429,14 +1429,14 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 4,0,116,9,121,128,1,0,1,0,1,0,116,10,124,5, 124,0,124,1,131,3,125,7,124,7,100,1,117,0,114,124, 89,0,87,0,100,1,4,0,4,0,131,3,1,0,113,52, - 89,0,110,14,48,0,124,6,124,0,124,1,124,2,131,3, + 89,0,110,14,119,0,124,6,124,0,124,1,124,2,131,3, 125,7,87,0,100,1,4,0,4,0,131,3,1,0,110,16, - 49,0,115,162,48,0,1,0,1,0,1,0,89,0,1,0, + 49,0,115,162,119,1,1,0,1,0,1,0,89,0,1,0, 124,7,100,1,117,1,114,52,124,4,144,1,115,16,124,0, 116,0,106,6,118,0,144,1,114,16,116,0,106,6,124,0, 25,0,125,8,122,10,124,8,106,11,125,9,87,0,110,26, 4,0,116,9,121,244,1,0,1,0,1,0,124,7,6,0, - 89,0,2,0,1,0,83,0,48,0,124,9,100,1,117,0, + 89,0,2,0,1,0,83,0,119,0,124,9,100,1,117,0, 144,1,114,8,124,7,2,0,1,0,83,0,124,9,2,0, 1,0,83,0,124,7,2,0,1,0,83,0,100,1,83,0, 41,4,122,21,70,105,110,100,32,97,32,109,111,100,117,108, @@ -1500,7 +1500,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 1,106,2,124,3,25,0,125,4,122,10,124,4,106,4,125, 2,87,0,110,44,4,0,116,5,121,126,1,0,1,0,1, 0,116,6,100,3,23,0,160,7,124,0,124,3,161,2,125, - 5,116,8,124,5,124,0,100,4,141,2,100,0,130,2,48, + 5,116,8,124,5,124,0,100,4,141,2,100,0,130,2,119, 0,116,9,124,0,124,2,131,2,125,6,124,6,100,0,117, 0,114,164,116,8,116,6,160,7,124,0,161,1,124,0,100, 4,141,2,130,1,116,10,124,6,131,1,125,7,124,3,144, @@ -1509,7 +1509,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 4,124,8,124,7,131,3,1,0,87,0,124,7,83,0,4, 0,116,5,144,1,121,14,1,0,1,0,1,0,100,6,124, 3,155,2,100,7,124,8,155,2,157,4,125,5,116,12,160, - 13,124,5,116,14,161,2,1,0,89,0,124,7,83,0,48, + 13,124,5,116,14,161,2,1,0,89,0,124,7,83,0,119, 0,124,7,83,0,41,8,78,114,135,0,0,0,114,25,0, 0,0,122,23,59,32,123,33,114,125,32,105,115,32,110,111, 116,32,97,32,112,97,99,107,97,103,101,114,19,0,0,0, @@ -1540,7 +1540,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 2,116,4,117,0,114,56,116,5,124,0,124,1,131,2,87, 0,2,0,100,1,4,0,4,0,131,3,1,0,83,0,87, 0,100,1,4,0,4,0,131,3,1,0,110,16,49,0,115, - 76,48,0,1,0,1,0,1,0,89,0,1,0,124,2,100, + 76,119,1,1,0,1,0,1,0,89,0,1,0,124,2,100, 1,117,0,114,116,100,2,160,6,124,0,161,1,125,3,116, 7,124,3,124,0,100,3,141,2,130,1,116,8,124,0,131, 1,1,0,124,2,83,0,41,4,122,25,70,105,110,100,32, @@ -1602,8 +1602,8 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 4,4,0,116,10,121,214,1,0,125,7,1,0,122,42,124, 7,106,11,124,6,107,2,114,200,116,12,106,13,160,14,124, 6,116,15,161,2,100,10,117,1,114,200,87,0,89,0,100, - 10,125,7,126,7,113,4,130,0,100,10,125,7,126,7,48, - 0,124,0,83,0,48,0,41,11,122,238,70,105,103,117,114, + 10,125,7,126,7,113,4,130,0,100,10,125,7,126,7,119, + 1,124,0,83,0,119,0,41,11,122,238,70,105,103,117,114, 101,32,111,117,116,32,119,104,97,116,32,95,95,105,109,112, 111,114,116,95,95,32,115,104,111,117,108,100,32,114,101,116, 117,114,110,46,10,10,32,32,32,32,84,104,101,32,105,109, diff --git a/Python/importlib_external.h b/Python/importlib_external.h index fee8f44f79cdba..e420ef86662a98 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -230,7 +230,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,3,0,0,0,8,0,0,0,67,0,0,0,115,48, 0,0,0,122,12,116,0,124,0,131,1,125,2,87,0,110, 20,4,0,116,1,121,32,1,0,1,0,1,0,89,0,100, - 1,83,0,48,0,124,2,106,2,100,2,64,0,124,1,107, + 1,83,0,119,0,124,2,106,2,100,2,64,0,124,1,107, 2,83,0,41,4,122,49,84,101,115,116,32,119,104,101,116, 104,101,114,32,116,104,101,32,112,97,116,104,32,105,115,32, 116,104,101,32,115,112,101,99,105,102,105,101,100,32,109,111, @@ -287,12 +287,12 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 6,66,0,124,2,100,2,64,0,161,3,125,4,122,72,116, 7,160,8,124,4,100,3,161,2,143,26,125,5,124,5,160, 9,124,1,161,1,1,0,87,0,100,4,4,0,4,0,131, - 3,1,0,110,16,49,0,115,94,48,0,1,0,1,0,1, + 3,1,0,110,16,49,0,115,94,119,1,1,0,1,0,1, 0,89,0,1,0,116,2,160,10,124,3,124,0,161,2,1, 0,87,0,100,4,83,0,4,0,116,11,121,168,1,0,1, 0,1,0,122,14,116,2,160,12,124,3,161,1,1,0,87, 0,130,0,4,0,116,11,121,166,1,0,1,0,1,0,89, - 0,130,0,48,0,48,0,41,5,122,162,66,101,115,116,45, + 0,130,0,119,0,119,0,41,5,122,162,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, @@ -317,7 +317,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,115,36,0,0,0,16,5,6,1,22,1,4,255, 2,2,14,3,40,1,18,1,12,1,2,1,12,1,2,3, 12,254,2,1,2,1,2,255,2,1,255,128,114,77,0,0, - 0,105,104,13,0,0,114,39,0,0,0,114,29,0,0,0, + 0,105,105,13,0,0,114,39,0,0,0,114,29,0,0,0, 115,2,0,0,0,13,10,90,11,95,95,112,121,99,97,99, 104,101,95,95,122,4,111,112,116,45,122,3,46,112,121,122, 4,46,112,121,119,122,4,46,112,121,99,41,1,218,12,111, @@ -431,7 +431,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,108,109,111,115,116,95,102,105,108,101,110,97,109,101,218, 8,102,105,108,101,110,97,109,101,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,17,99,97,99,104,101,95, - 102,114,111,109,95,115,111,117,114,99,101,84,1,0,0,115, + 102,114,111,109,95,115,111,117,114,99,101,85,1,0,0,115, 74,0,0,0,8,18,6,1,2,1,4,255,8,2,4,1, 8,1,12,1,10,1,12,1,16,1,8,1,8,1,8,1, 24,1,8,1,12,1,6,1,8,2,8,1,8,1,8,1, @@ -512,7 +512,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 90,9,111,112,116,95,108,101,118,101,108,90,13,98,97,115, 101,95,102,105,108,101,110,97,109,101,114,7,0,0,0,114, 7,0,0,0,114,8,0,0,0,218,17,115,111,117,114,99, - 101,95,102,114,111,109,95,99,97,99,104,101,155,1,0,0, + 101,95,102,114,111,109,95,99,97,99,104,101,156,1,0,0, 115,62,0,0,0,12,9,8,1,10,1,12,1,4,1,10, 1,12,1,14,1,16,1,4,1,4,1,12,1,8,1,8, 1,2,1,8,255,10,2,8,1,14,1,10,1,16,1,10, @@ -526,7 +526,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 83,0,122,12,116,3,124,0,131,1,125,4,87,0,110,34, 4,0,116,4,116,5,102,2,121,106,1,0,1,0,1,0, 124,0,100,2,100,5,133,2,25,0,125,4,89,0,110,2, - 48,0,116,6,124,4,131,1,114,120,124,4,83,0,124,0, + 119,0,116,6,124,4,131,1,114,120,124,4,83,0,124,0, 83,0,41,7,122,188,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, @@ -548,26 +548,26 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 120,116,101,110,115,105,111,110,218,11,115,111,117,114,99,101, 95,112,97,116,104,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,15,95,103,101,116,95,115,111,117,114,99, - 101,102,105,108,101,195,1,0,0,115,22,0,0,0,12,7, + 101,102,105,108,101,196,1,0,0,115,22,0,0,0,12,7, 4,1,16,1,24,1,4,1,2,1,12,1,16,1,18,1, 16,1,255,128,114,113,0,0,0,99,1,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,8,0,0,0,67,0, 0,0,115,68,0,0,0,124,0,160,0,116,1,116,2,131, 1,161,1,114,46,122,10,116,3,124,0,131,1,87,0,83, 0,4,0,116,4,121,44,1,0,1,0,1,0,89,0,100, - 0,83,0,48,0,124,0,160,0,116,1,116,5,131,1,161, + 0,83,0,119,0,124,0,160,0,116,1,116,5,131,1,161, 1,114,64,124,0,83,0,100,0,83,0,169,1,78,41,6, 218,8,101,110,100,115,119,105,116,104,218,5,116,117,112,108, 101,114,106,0,0,0,114,102,0,0,0,114,88,0,0,0, 114,94,0,0,0,41,1,114,101,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,11,95,103,101, - 116,95,99,97,99,104,101,100,214,1,0,0,115,18,0,0, + 116,95,99,97,99,104,101,100,215,1,0,0,115,18,0,0, 0,14,1,2,1,10,1,12,1,8,1,14,1,4,1,4, 2,255,128,114,117,0,0,0,99,1,0,0,0,0,0,0, 0,0,0,0,0,2,0,0,0,8,0,0,0,67,0,0, 0,115,50,0,0,0,122,14,116,0,124,0,131,1,106,1, 125,1,87,0,110,22,4,0,116,2,121,36,1,0,1,0, - 1,0,100,1,125,1,89,0,110,2,48,0,124,1,100,2, + 1,0,100,1,125,1,89,0,110,2,119,0,124,1,100,2, 79,0,125,1,124,1,83,0,41,4,122,51,67,97,108,99, 117,108,97,116,101,32,116,104,101,32,109,111,100,101,32,112, 101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,97, @@ -576,7 +576,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,59,0,0,0,114,58,0,0,0,41,2,114,52,0, 0,0,114,60,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,10,95,99,97,108,99,95,109,111, - 100,101,226,1,0,0,115,14,0,0,0,2,2,14,1,12, + 100,101,227,1,0,0,115,14,0,0,0,2,2,14,1,12, 1,10,1,8,3,4,1,255,128,114,119,0,0,0,99,1, 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, 0,0,0,3,0,0,0,115,52,0,0,0,100,6,135,0, @@ -613,7 +613,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,218,4,97,114,103,115,218,6,107,119,97,114,103, 115,169,1,218,6,109,101,116,104,111,100,114,7,0,0,0, 114,8,0,0,0,218,19,95,99,104,101,99,107,95,110,97, - 109,101,95,119,114,97,112,112,101,114,246,1,0,0,115,20, + 109,101,95,119,114,97,112,112,101,114,247,1,0,0,115,20, 0,0,0,8,1,8,1,10,1,4,1,8,1,2,255,2, 1,6,255,24,2,255,128,122,40,95,99,104,101,99,107,95, 110,97,109,101,46,60,108,111,99,97,108,115,62,46,95,99, @@ -631,7 +631,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,116,97,116,116,114,218,8,95,95,100,105,99,116,95,95, 218,6,117,112,100,97,116,101,41,3,90,3,110,101,119,90, 3,111,108,100,114,75,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,5,95,119,114,97,112,3, + 0,0,0,114,8,0,0,0,218,5,95,119,114,97,112,4, 2,0,0,115,12,0,0,0,8,1,10,1,18,1,2,128, 18,1,255,128,122,26,95,99,104,101,99,107,95,110,97,109, 101,46,60,108,111,99,97,108,115,62,46,95,119,114,97,112, @@ -639,7 +639,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 112,114,138,0,0,0,41,3,114,127,0,0,0,114,128,0, 0,0,114,138,0,0,0,114,7,0,0,0,114,126,0,0, 0,114,8,0,0,0,218,11,95,99,104,101,99,107,95,110, - 97,109,101,238,1,0,0,115,14,0,0,0,14,8,8,10, + 97,109,101,239,1,0,0,115,14,0,0,0,14,8,8,10, 8,1,8,2,10,6,4,1,255,128,114,140,0,0,0,99, 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, 6,0,0,0,67,0,0,0,115,60,0,0,0,124,0,160, @@ -667,7 +667,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 6,108,111,97,100,101,114,218,8,112,111,114,116,105,111,110, 115,218,3,109,115,103,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,17,95,102,105,110,100,95,109,111,100, - 117,108,101,95,115,104,105,109,13,2,0,0,115,12,0,0, + 117,108,101,95,115,104,105,109,14,2,0,0,115,12,0,0, 0,14,10,16,1,4,1,22,1,4,1,255,128,114,147,0, 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,6, 0,0,0,4,0,0,0,67,0,0,0,115,166,0,0,0, @@ -734,7 +734,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 218,11,101,120,99,95,100,101,116,97,105,108,115,90,5,109, 97,103,105,99,114,98,0,0,0,114,16,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,13,95, - 99,108,97,115,115,105,102,121,95,112,121,99,30,2,0,0, + 99,108,97,115,115,105,102,121,95,112,121,99,31,2,0,0, 115,30,0,0,0,12,16,8,1,16,1,12,1,16,1,12, 1,10,1,12,1,8,1,16,1,8,2,16,1,16,1,4, 1,255,128,114,156,0,0,0,99,5,0,0,0,0,0,0, @@ -790,7 +790,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 155,0,0,0,114,98,0,0,0,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,23,95,118,97,108,105,100, 97,116,101,95,116,105,109,101,115,116,97,109,112,95,112,121, - 99,63,2,0,0,115,20,0,0,0,24,19,10,1,12,1, + 99,64,2,0,0,115,20,0,0,0,24,19,10,1,12,1, 16,1,8,1,22,1,2,255,22,2,8,254,255,128,114,160, 0,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, 4,0,0,0,4,0,0,0,67,0,0,0,115,42,0,0, @@ -836,7 +836,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,111,117,114,99,101,95,104,97,115,104,114,121,0,0,0, 114,155,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,18,95,118,97,108,105,100,97,116,101,95, - 104,97,115,104,95,112,121,99,91,2,0,0,115,16,0,0, + 104,97,115,104,95,112,121,99,92,2,0,0,115,16,0,0, 0,16,17,2,1,8,1,4,255,2,2,6,254,4,255,255, 128,114,162,0,0,0,99,4,0,0,0,0,0,0,0,0, 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, @@ -860,7 +860,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,121,0,0,0,114,111,0,0,0,114,112,0,0,0, 218,4,99,111,100,101,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,17,95,99,111,109,112,105,108,101,95, - 98,121,116,101,99,111,100,101,115,2,0,0,115,20,0,0, + 98,121,116,101,99,111,100,101,116,2,0,0,115,20,0,0, 0,10,2,10,1,12,1,8,1,12,1,4,1,10,2,4, 1,6,255,255,128,114,169,0,0,0,99,3,0,0,0,0, 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, @@ -878,7 +878,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,168,0,0,0,218,5,109,116,105,109,101,114,159,0,0, 0,114,37,0,0,0,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,22,95,99,111,100,101,95,116,111,95, - 116,105,109,101,115,116,97,109,112,95,112,121,99,128,2,0, + 116,105,109,101,115,116,97,109,112,95,112,121,99,129,2,0, 0,115,14,0,0,0,8,2,14,1,14,1,14,1,16,1, 4,1,255,128,114,174,0,0,0,84,99,3,0,0,0,0, 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, @@ -897,7 +897,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,104,101,99,107,101,100,114,37,0,0,0,114,16,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, 218,17,95,99,111,100,101,95,116,111,95,104,97,115,104,95, - 112,121,99,138,2,0,0,115,16,0,0,0,8,2,12,1, + 112,121,99,139,2,0,0,115,16,0,0,0,8,2,12,1, 14,1,16,1,10,1,16,1,4,1,255,128,114,175,0,0, 0,99,1,0,0,0,0,0,0,0,0,0,0,0,5,0, 0,0,6,0,0,0,67,0,0,0,115,62,0,0,0,100, @@ -924,7 +924,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,108,105,110,101,218,8,101,110,99,111,100,105,110,103,90, 15,110,101,119,108,105,110,101,95,100,101,99,111,100,101,114, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 13,100,101,99,111,100,101,95,115,111,117,114,99,101,149,2, + 13,100,101,99,111,100,101,95,115,111,117,114,99,101,150,2, 0,0,115,12,0,0,0,8,5,12,1,10,1,12,1,20, 1,255,128,114,180,0,0,0,169,2,114,144,0,0,0,218, 26,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, @@ -933,7 +933,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 67,0,0,0,115,8,1,0,0,124,1,100,1,117,0,114, 56,100,2,125,1,116,0,124,2,100,3,131,2,114,66,122, 14,124,2,160,1,124,0,161,1,125,1,87,0,110,28,4, - 0,116,2,121,54,1,0,1,0,1,0,89,0,110,12,48, + 0,116,2,121,54,1,0,1,0,1,0,89,0,110,12,119, 0,116,3,160,4,124,1,161,1,125,1,116,5,106,6,124, 0,124,2,124,1,100,4,141,3,125,4,100,5,124,4,95, 7,124,2,100,1,117,0,114,148,116,8,131,0,68,0,93, @@ -942,7 +942,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 2,124,4,95,11,1,0,113,148,100,1,83,0,124,3,116, 12,117,0,114,212,116,0,124,2,100,6,131,2,114,218,122, 14,124,2,160,13,124,0,161,1,125,7,87,0,110,18,4, - 0,116,2,121,198,1,0,1,0,1,0,89,0,110,20,48, + 0,116,2,121,198,1,0,1,0,1,0,89,0,110,20,119, 0,124,7,114,218,103,0,124,4,95,14,110,6,124,3,124, 4,95,14,124,4,106,14,103,0,107,2,144,1,114,4,124, 1,144,1,114,4,116,15,124,1,131,1,100,7,25,0,125, @@ -986,7 +986,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,90,7,100,105,114,110,97,109,101,114,7,0,0,0, 114,7,0,0,0,114,8,0,0,0,218,23,115,112,101,99, 95,102,114,111,109,95,102,105,108,101,95,108,111,99,97,116, - 105,111,110,166,2,0,0,115,64,0,0,0,8,12,4,4, + 105,111,110,167,2,0,0,115,64,0,0,0,8,12,4,4, 10,1,2,2,14,1,12,1,6,1,10,2,16,8,6,1, 8,3,14,1,14,1,10,1,6,1,4,1,4,2,8,3, 10,2,2,1,14,1,12,1,6,1,4,2,8,1,6,2, @@ -1017,14 +1017,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,115,50,0,0,0,122,16,116,0,160,1,116,0,106,2, 124,0,161,2,87,0,83,0,4,0,116,3,121,48,1,0, 1,0,1,0,116,0,160,1,116,0,106,4,124,0,161,2, - 6,0,89,0,83,0,48,0,114,114,0,0,0,41,5,218, + 6,0,89,0,83,0,119,0,114,114,0,0,0,41,5,218, 6,119,105,110,114,101,103,90,7,79,112,101,110,75,101,121, 90,17,72,75,69,89,95,67,85,82,82,69,78,84,95,85, 83,69,82,114,58,0,0,0,90,18,72,75,69,89,95,76, 79,67,65,76,95,77,65,67,72,73,78,69,114,19,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, 218,14,95,111,112,101,110,95,114,101,103,105,115,116,114,121, - 246,2,0,0,115,10,0,0,0,2,2,16,1,12,1,20, + 247,2,0,0,115,10,0,0,0,2,2,16,1,12,1,20, 1,255,128,122,36,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,2,0,0,0,0,0, @@ -1035,9 +1035,9 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,100,3,141,2,125,3,122,60,124,0,160,6,124,3,161, 1,143,28,125,4,116,7,160,8,124,4,100,4,161,2,125, 5,87,0,100,0,4,0,4,0,131,3,1,0,110,16,49, - 0,115,94,48,0,1,0,1,0,1,0,89,0,1,0,87, + 0,115,94,119,1,1,0,1,0,1,0,89,0,1,0,87, 0,124,5,83,0,4,0,116,9,121,128,1,0,1,0,1, - 0,89,0,100,0,83,0,48,0,41,5,78,122,5,37,100, + 0,89,0,100,0,83,0,119,0,41,5,78,122,5,37,100, 46,37,100,114,39,0,0,0,41,2,114,143,0,0,0,90, 11,115,121,115,95,118,101,114,115,105,111,110,114,10,0,0, 0,41,10,218,11,68,69,66,85,71,95,66,85,73,76,68, @@ -1051,7 +1051,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 20,0,0,0,90,4,104,107,101,121,218,8,102,105,108,101, 112,97,116,104,114,7,0,0,0,114,7,0,0,0,114,8, 0,0,0,218,16,95,115,101,97,114,99,104,95,114,101,103, - 105,115,116,114,121,253,2,0,0,115,26,0,0,0,6,2, + 105,115,116,114,121,254,2,0,0,115,26,0,0,0,6,2, 8,1,6,2,6,1,16,1,6,255,2,2,12,1,44,1, 4,3,12,254,8,1,255,128,122,38,87,105,110,100,111,119, 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, @@ -1061,7 +1061,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,160,0,124,1,161,1,125,4,124,4,100,0,117,0,114, 22,100,0,83,0,122,12,116,1,124,4,131,1,1,0,87, 0,110,20,4,0,116,2,121,54,1,0,1,0,1,0,89, - 0,100,0,83,0,48,0,116,3,131,0,68,0,93,50,92, + 0,100,0,83,0,119,0,116,3,131,0,68,0,93,50,92, 2,125,5,125,6,124,4,160,4,116,5,124,6,131,1,161, 1,114,62,116,6,106,7,124,1,124,5,124,1,124,4,131, 2,124,4,100,1,141,3,125,7,124,7,2,0,1,0,83, @@ -1073,7 +1073,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,52,0,0,0,218,6,116,97,114,103,101,116,114,203,0, 0,0,114,144,0,0,0,114,193,0,0,0,114,191,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,9,102,105,110,100,95,115,112,101,99,12,3,0,0,115, + 218,9,102,105,110,100,95,115,112,101,99,13,3,0,0,115, 32,0,0,0,10,2,8,1,4,1,2,1,12,1,12,1, 8,1,14,1,14,1,6,1,8,1,2,1,6,254,8,3, 4,251,255,128,122,31,87,105,110,100,111,119,115,82,101,103, @@ -1093,7 +1093,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,202,0,0,0,114,143,0,0,0,114,52,0,0,0,114, 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101, - 28,3,0,0,115,10,0,0,0,12,7,8,1,6,1,4, + 29,3,0,0,115,10,0,0,0,12,7,8,1,6,1,4, 2,255,128,122,33,87,105,110,100,111,119,115,82,101,103,105, 115,116,114,121,70,105,110,100,101,114,46,102,105,110,100,95, 109,111,100,117,108,101,41,2,78,78,41,1,78,41,15,114, @@ -1105,7 +1105,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,114,197,0,0,0,218,11,99,108,97,115,115,109,101,116, 104,111,100,114,204,0,0,0,114,207,0,0,0,114,210,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,195,0,0,0,234,2,0,0,115, + 0,114,8,0,0,0,114,195,0,0,0,235,2,0,0,115, 32,0,0,0,8,0,4,2,2,3,2,255,2,4,2,255, 12,3,2,2,10,1,2,6,10,1,2,14,12,1,2,15, 16,1,255,128,114,195,0,0,0,99,0,0,0,0,0,0, @@ -1142,7 +1142,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,90,13,102,105,108,101,110,97,109,101,95,98,97,115, 101,90,9,116,97,105,108,95,110,97,109,101,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,186,0,0,0, - 47,3,0,0,115,10,0,0,0,18,3,16,1,14,1,16, + 48,3,0,0,115,10,0,0,0,18,3,16,1,14,1,16, 1,255,128,122,24,95,76,111,97,100,101,114,66,97,115,105, 99,115,46,105,115,95,112,97,99,107,97,103,101,99,2,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, @@ -1152,7 +1152,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,7, 0,0,0,169,2,114,123,0,0,0,114,191,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,13, - 99,114,101,97,116,101,95,109,111,100,117,108,101,55,3,0, + 99,114,101,97,116,101,95,109,111,100,117,108,101,56,3,0, 0,115,4,0,0,0,4,0,255,128,122,27,95,76,111,97, 100,101,114,66,97,115,105,99,115,46,99,114,101,97,116,101, 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, @@ -1173,7 +1173,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,41,3,114,123,0,0,0,218,6,109,111,100,117,108,101, 114,168,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,11,101,120,101,99,95,109,111,100,117,108, - 101,58,3,0,0,115,14,0,0,0,12,2,8,1,6,1, + 101,59,3,0,0,115,14,0,0,0,12,2,8,1,6,1, 4,1,6,255,20,2,255,128,122,25,95,76,111,97,100,101, 114,66,97,115,105,99,115,46,101,120,101,99,95,109,111,100, 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, @@ -1184,14 +1184,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,218,17,95,108,111,97,100,95,109,111,100,117,108, 101,95,115,104,105,109,169,2,114,123,0,0,0,114,143,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,108,111,97,100,95,109,111,100,117,108,101,66,3, + 0,218,11,108,111,97,100,95,109,111,100,117,108,101,67,3, 0,0,115,4,0,0,0,12,3,255,128,122,25,95,76,111, 97,100,101,114,66,97,115,105,99,115,46,108,111,97,100,95, 109,111,100,117,108,101,78,41,8,114,130,0,0,0,114,129, 0,0,0,114,131,0,0,0,114,132,0,0,0,114,186,0, 0,0,114,219,0,0,0,114,224,0,0,0,114,227,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,215,0,0,0,42,3,0,0,115,14, + 114,8,0,0,0,114,215,0,0,0,43,3,0,0,115,14, 0,0,0,8,0,4,2,8,3,8,8,8,3,12,8,255, 128,114,215,0,0,0,99,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, @@ -1216,7 +1216,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 10,32,32,32,32,32,32,32,32,78,41,1,114,58,0,0, 0,169,2,114,123,0,0,0,114,52,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,10,112,97, - 116,104,95,109,116,105,109,101,74,3,0,0,115,4,0,0, + 116,104,95,109,116,105,109,101,75,3,0,0,115,4,0,0, 0,4,6,255,128,122,23,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,0,0,0,0,2,0,0,0,4, @@ -1250,7 +1250,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,114, 173,0,0,0,78,41,1,114,230,0,0,0,114,229,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,10,112,97,116,104,95,115,116,97,116,115,82,3,0,0, + 218,10,112,97,116,104,95,115,116,97,116,115,83,3,0,0, 115,4,0,0,0,14,12,255,128,122,23,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,0,0,0,0,4, @@ -1274,7 +1274,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,41,4,114,123,0,0,0,114,112,0,0,0,90,10,99, 97,99,104,101,95,112,97,116,104,114,37,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,15,95, - 99,97,99,104,101,95,98,121,116,101,99,111,100,101,96,3, + 99,97,99,104,101,95,98,121,116,101,99,111,100,101,97,3, 0,0,115,4,0,0,0,12,8,255,128,122,28,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, @@ -1292,7 +1292,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,78,114,7,0,0,0,41,3,114,123,0, 0,0,114,52,0,0,0,114,37,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,232,0,0,0, - 106,3,0,0,115,4,0,0,0,4,0,255,128,122,21,83, + 107,3,0,0,115,4,0,0,0,4,0,255,128,122,21,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,0,0,0, 0,5,0,0,0,10,0,0,0,67,0,0,0,115,70,0, @@ -1300,7 +1300,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 160,1,124,2,161,1,125,3,87,0,116,4,124,3,131,1, 83,0,4,0,116,2,121,68,1,0,125,4,1,0,122,14, 116,3,100,1,124,1,100,2,141,2,124,4,130,2,100,3, - 125,4,126,4,48,0,48,0,41,4,122,52,67,111,110,99, + 125,4,126,4,119,1,119,0,41,4,122,52,67,111,110,99, 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,46, @@ -1312,7 +1312,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 5,114,123,0,0,0,114,143,0,0,0,114,52,0,0,0, 114,178,0,0,0,218,3,101,120,99,114,7,0,0,0,114, 7,0,0,0,114,8,0,0,0,218,10,103,101,116,95,115, - 111,117,114,99,101,113,3,0,0,115,26,0,0,0,10,2, + 111,117,114,99,101,114,3,0,0,115,26,0,0,0,10,2, 2,1,12,1,8,4,14,253,4,1,2,1,4,255,2,1, 2,255,8,128,2,255,255,128,122,23,83,111,117,114,99,101, 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, @@ -1335,7 +1335,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,123,0,0,0,114,37,0,0,0,114,52,0,0,0,114, 237,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, 0,0,0,218,14,115,111,117,114,99,101,95,116,111,95,99, - 111,100,101,123,3,0,0,115,8,0,0,0,12,5,4,1, + 111,100,101,124,3,0,0,115,8,0,0,0,12,5,4,1, 6,255,255,128,122,27,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,0,0,0,0,15,0, @@ -1344,12 +1344,12 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 4,100,1,125,5,100,2,125,6,100,3,125,7,122,12,116, 1,124,2,131,1,125,8,87,0,110,24,4,0,116,2,121, 66,1,0,1,0,1,0,100,1,125,8,89,0,144,1,110, - 42,48,0,122,14,124,0,160,3,124,2,161,1,125,9,87, + 42,119,0,122,14,124,0,160,3,124,2,161,1,125,9,87, 0,110,20,4,0,116,4,121,102,1,0,1,0,1,0,89, - 0,144,1,110,6,48,0,116,5,124,9,100,4,25,0,131, + 0,144,1,110,6,119,0,116,5,124,9,100,4,25,0,131, 1,125,3,122,14,124,0,160,6,124,8,161,1,125,10,87, 0,110,18,4,0,116,4,121,148,1,0,1,0,1,0,89, - 0,110,216,48,0,124,1,124,8,100,5,156,2,125,11,122, + 0,110,216,119,0,124,1,124,8,100,5,156,2,125,11,122, 148,116,7,124,10,124,1,124,11,131,3,125,12,116,8,124, 10,131,1,100,6,100,1,133,2,25,0,125,13,124,12,100, 7,64,0,100,8,107,3,125,6,124,6,144,1,114,30,124, @@ -1360,7 +1360,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 10,124,5,124,1,124,11,131,4,1,0,110,20,116,14,124, 10,124,3,124,9,100,12,25,0,124,1,124,11,131,5,1, 0,87,0,110,24,4,0,116,15,116,16,102,2,144,1,121, - 76,1,0,1,0,1,0,89,0,110,32,48,0,116,17,160, + 76,1,0,1,0,1,0,89,0,110,32,119,0,116,17,160, 18,100,13,124,8,124,2,161,3,1,0,116,19,124,13,124, 1,124,8,124,2,100,14,141,4,83,0,124,4,100,1,117, 0,144,1,114,128,124,0,160,6,124,2,161,1,125,4,124, @@ -1373,7 +1373,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 3,116,25,124,4,131,1,131,3,125,10,122,20,124,0,160, 26,124,2,124,8,124,10,161,3,1,0,87,0,124,14,83, 0,4,0,116,2,144,2,121,22,1,0,1,0,1,0,89, - 0,124,14,83,0,48,0,124,14,83,0,41,16,122,190,67, + 0,124,14,83,0,119,0,124,14,83,0,41,16,122,190,67, 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99, 116,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101, @@ -1412,7 +1412,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,155,0,0,0,114,16,0,0,0,90,10,98,121,116,101, 115,95,100,97,116,97,90,11,99,111,100,101,95,111,98,106, 101,99,116,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,220,0,0,0,131,3,0,0,115,160,0,0,0, + 0,0,114,220,0,0,0,132,3,0,0,115,160,0,0,0, 10,7,4,1,4,1,4,1,4,1,4,1,2,1,12,1, 12,1,12,1,2,2,14,1,12,1,8,1,12,2,2,1, 14,1,12,1,6,1,2,3,2,1,6,254,2,4,12,1, @@ -1429,7 +1429,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,233,0,0,0,114,232,0,0,0,114,236,0, 0,0,114,240,0,0,0,114,220,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,228,0,0,0,72,3,0,0,115,18,0,0,0,8,0, + 114,228,0,0,0,73,3,0,0,115,18,0,0,0,8,0, 8,2,8,8,8,14,8,10,8,7,14,10,12,8,255,128, 114,228,0,0,0,99,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,4,0,0,0,0,0,0,0,115,92, @@ -1456,7 +1456,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,104,101,10,32,32,32,32,32,32,32,32,102,105,110,100, 101,114,46,78,114,163,0,0,0,41,3,114,123,0,0,0, 114,143,0,0,0,114,52,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,216,0,0,0,221,3, + 7,0,0,0,114,8,0,0,0,114,216,0,0,0,222,3, 0,0,115,6,0,0,0,6,3,10,1,255,128,122,19,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,0,0,0,0,2, @@ -1466,7 +1466,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 9,95,95,99,108,97,115,115,95,95,114,136,0,0,0,169, 2,114,123,0,0,0,90,5,111,116,104,101,114,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,6,95,95, - 101,113,95,95,227,3,0,0,115,8,0,0,0,12,1,10, + 101,113,95,95,228,3,0,0,115,8,0,0,0,12,1,10, 1,2,255,255,128,122,17,70,105,108,101,76,111,97,100,101, 114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, @@ -1475,7 +1475,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 3,218,4,104,97,115,104,114,121,0,0,0,114,52,0,0, 0,169,1,114,123,0,0,0,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,8,95,95,104,97,115,104,95, - 95,231,3,0,0,115,4,0,0,0,20,1,255,128,122,19, + 95,232,3,0,0,115,4,0,0,0,20,1,255,128,122,19, 70,105,108,101,76,111,97,100,101,114,46,95,95,104,97,115, 104,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,3,0,0,0,3,0,0,0,115,16,0,0, @@ -1489,7 +1489,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 10,32,32,32,32,32,32,32,32,78,41,3,218,5,115,117, 112,101,114,114,246,0,0,0,114,227,0,0,0,114,226,0, 0,0,169,1,114,248,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,227,0,0,0,234,3,0,0,115,4,0,0, + 0,0,0,114,227,0,0,0,235,3,0,0,115,4,0,0, 0,16,10,255,128,122,22,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,0,0,0,0,2,0,0,0,1,0, @@ -1499,7 +1499,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,101,32,102,105,108,101,32,97,115,32,102,111,117,110,100, 32,98,121,32,116,104,101,32,102,105,110,100,101,114,46,78, 114,56,0,0,0,114,226,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,183,0,0,0,246,3, + 7,0,0,0,114,8,0,0,0,114,183,0,0,0,247,3, 0,0,115,4,0,0,0,6,3,255,128,122,23,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,0,0,0, @@ -1507,11 +1507,11 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,116,0,124,0,116,1,116,2,102,2,131,2,114,72, 116,3,160,4,116,5,124,1,131,1,161,1,143,24,125,2, 124,2,160,6,161,0,87,0,2,0,100,1,4,0,4,0, - 131,3,1,0,83,0,49,0,115,58,48,0,1,0,1,0, + 131,3,1,0,83,0,49,0,115,58,119,1,1,0,1,0, 1,0,89,0,1,0,100,1,83,0,116,3,160,7,124,1, 100,2,161,2,143,24,125,2,124,2,160,6,161,0,87,0, 2,0,100,1,4,0,4,0,131,3,1,0,83,0,49,0, - 115,114,48,0,1,0,1,0,1,0,89,0,1,0,100,1, + 115,114,119,1,1,0,1,0,1,0,89,0,1,0,100,1, 83,0,41,3,122,39,82,101,116,117,114,110,32,116,104,101, 32,100,97,116,97,32,102,114,111,109,32,112,97,116,104,32, 97,115,32,114,97,119,32,98,121,116,101,115,46,78,218,1, @@ -1521,7 +1521,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,101,114,90,0,0,0,90,4,114,101,97,100,114,73,0, 0,0,41,3,114,123,0,0,0,114,52,0,0,0,114,76, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,234,0,0,0,251,3,0,0,115,14,0,0,0, + 0,0,114,234,0,0,0,252,3,0,0,115,14,0,0,0, 14,2,16,1,42,1,14,2,38,1,4,128,255,128,122,19, 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,100, 97,116,97,99,2,0,0,0,0,0,0,0,0,0,0,0, @@ -1533,7 +1533,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,4,1,0,0,41,3,114,123,0,0,0,114,223,0,0, 0,114,4,1,0,0,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,19,103,101,116,95,114,101,115,111,117, - 114,99,101,95,114,101,97,100,101,114,4,4,0,0,115,6, + 114,99,101,95,114,101,97,100,101,114,5,4,0,0,115,6, 0,0,0,12,2,8,1,255,128,122,30,70,105,108,101,76, 111,97,100,101,114,46,103,101,116,95,114,101,115,111,117,114, 99,101,95,114,101,97,100,101,114,41,13,114,130,0,0,0, @@ -1542,7 +1542,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,227,0,0,0,114,183,0,0,0,114,234,0, 0,0,114,5,1,0,0,90,13,95,95,99,108,97,115,115, 99,101,108,108,95,95,114,7,0,0,0,114,7,0,0,0, - 114,0,1,0,0,114,8,0,0,0,114,246,0,0,0,216, + 114,0,1,0,0,114,8,0,0,0,114,246,0,0,0,217, 3,0,0,115,26,0,0,0,8,0,4,2,8,3,8,6, 8,4,2,3,14,1,2,11,10,1,8,4,2,9,18,1, 255,128,114,246,0,0,0,99,0,0,0,0,0,0,0,0, @@ -1565,7 +1565,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 57,0,0,0,218,8,115,116,95,109,116,105,109,101,90,7, 115,116,95,115,105,122,101,41,3,114,123,0,0,0,114,52, 0,0,0,114,245,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,231,0,0,0,14,4,0,0, + 0,0,114,8,0,0,0,114,231,0,0,0,15,4,0,0, 115,6,0,0,0,8,2,14,1,255,128,122,27,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, @@ -1576,7 +1576,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,232,0,0,0,41,5,114,123,0,0,0,114,112,0, 0,0,114,111,0,0,0,114,37,0,0,0,114,60,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,233,0,0,0,19,4,0,0,115,6,0,0,0,8,2, + 114,233,0,0,0,20,4,0,0,115,6,0,0,0,8,2, 16,1,255,128,122,32,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,99,111,100,101,114,68,0,0,0,114,8,1,0,0, @@ -1592,13 +1592,13 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 113,70,4,0,116,8,144,1,121,2,1,0,125,8,1,0, 122,30,116,9,160,10,100,1,124,4,124,8,161,3,1,0, 87,0,89,0,100,2,125,8,126,8,1,0,100,2,83,0, - 100,2,125,8,126,8,48,0,122,30,116,11,124,1,124,2, + 100,2,125,8,126,8,119,1,122,30,116,11,124,1,124,2, 124,3,131,3,1,0,116,9,160,10,100,3,124,1,161,2, 1,0,87,0,100,2,83,0,4,0,116,8,121,252,1,0, 125,8,1,0,122,28,116,9,160,10,100,1,124,1,124,8, 161,3,1,0,87,0,89,0,100,2,125,8,126,8,100,2, - 83,0,100,2,125,8,126,8,48,0,48,0,100,2,83,0, - 48,0,41,4,122,27,87,114,105,116,101,32,98,121,116,101, + 83,0,100,2,125,8,126,8,119,1,119,0,100,2,83,0, + 119,0,41,4,122,27,87,114,105,116,101,32,98,121,116,101, 115,32,100,97,116,97,32,116,111,32,97,32,102,105,108,101, 46,122,27,99,111,117,108,100,32,110,111,116,32,99,114,101, 97,116,101,32,123,33,114,125,58,32,123,33,114,125,78,122, @@ -1611,7 +1611,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,52,0,0,0,114,37,0,0,0,114,9,1,0,0,218, 6,112,97,114,101,110,116,114,101,0,0,0,114,47,0,0, 0,114,43,0,0,0,114,235,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,232,0,0,0,24, + 114,7,0,0,0,114,8,0,0,0,114,232,0,0,0,25, 4,0,0,115,60,0,0,0,12,2,4,1,12,2,12,1, 10,1,12,254,12,4,10,1,2,1,14,1,12,1,4,2, 16,1,6,3,4,1,4,255,16,2,8,128,2,1,12,1, @@ -1621,7 +1621,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 41,7,114,130,0,0,0,114,129,0,0,0,114,131,0,0, 0,114,132,0,0,0,114,231,0,0,0,114,233,0,0,0, 114,232,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,6,1,0,0,10,4, + 7,0,0,0,114,8,0,0,0,114,6,1,0,0,11,4, 0,0,115,12,0,0,0,8,0,4,2,8,2,8,5,18, 5,255,128,114,6,1,0,0,99,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, @@ -1644,7 +1644,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,41,5,114,123,0,0,0,114,143,0,0,0,114, 52,0,0,0,114,37,0,0,0,114,155,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,220,0, - 0,0,59,4,0,0,115,24,0,0,0,10,1,10,1,2, + 0,0,60,4,0,0,115,24,0,0,0,10,1,10,1,2, 4,2,1,6,254,12,4,2,1,14,1,2,1,2,1,6, 253,255,128,122,29,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, @@ -1654,14 +1654,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, 114,7,0,0,0,114,226,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,236,0,0,0,75,4, + 7,0,0,0,114,8,0,0,0,114,236,0,0,0,76,4, 0,0,115,4,0,0,0,4,2,255,128,122,31,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,41,6,114, 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, 0,0,0,114,220,0,0,0,114,236,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,12,1,0,0,55,4,0,0,115,10,0,0,0,8, + 0,114,12,1,0,0,56,4,0,0,115,10,0,0,0,8, 0,4,2,8,2,12,16,255,128,114,12,1,0,0,99,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, 0,0,0,64,0,0,0,115,92,0,0,0,101,0,90,1, @@ -1682,7 +1682,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,0,124,2,124,0,95,1,100,0,83,0,114,114,0,0, 0,114,163,0,0,0,41,3,114,123,0,0,0,114,121,0, 0,0,114,52,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,216,0,0,0,88,4,0,0,115, + 0,114,8,0,0,0,114,216,0,0,0,89,4,0,0,115, 6,0,0,0,6,1,10,1,255,128,122,28,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, @@ -1691,7 +1691,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,22,124,0,106,1,124,1,106,1,107,2,83,0,114,114, 0,0,0,114,247,0,0,0,114,249,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,250,0,0, - 0,92,4,0,0,115,8,0,0,0,12,1,10,1,2,255, + 0,93,4,0,0,115,8,0,0,0,12,1,10,1,2,255, 255,128,122,26,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,95,95,101,113,95,95,99,1, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, @@ -1699,7 +1699,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 106,1,131,1,116,0,124,0,106,2,131,1,65,0,83,0, 114,114,0,0,0,114,251,0,0,0,114,253,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,254, - 0,0,0,96,4,0,0,115,4,0,0,0,20,1,255,128, + 0,0,0,97,4,0,0,115,4,0,0,0,20,1,255,128, 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76, 111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,2, 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, @@ -1716,7 +1716,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,109,105,99,114,153,0,0,0,114,121,0,0,0,114,52, 0,0,0,41,3,114,123,0,0,0,114,191,0,0,0,114, 223,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,219,0,0,0,99,4,0,0,115,16,0,0, + 0,0,0,114,219,0,0,0,100,4,0,0,115,16,0,0, 0,4,2,6,1,4,255,6,2,8,1,4,255,4,2,255, 128,122,33,69,120,116,101,110,115,105,111,110,70,105,108,101, 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111, @@ -1734,7 +1734,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 105,99,114,153,0,0,0,114,121,0,0,0,114,52,0,0, 0,169,2,114,123,0,0,0,114,223,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,224,0,0, - 0,107,4,0,0,115,10,0,0,0,14,2,6,1,8,1, + 0,108,4,0,0,115,10,0,0,0,14,2,6,1,8,1, 8,255,255,128,122,31,69,120,116,101,110,115,105,111,110,70, 105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,109, 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, @@ -1752,14 +1752,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,114,7,0,0,0,169,2,114,5,0,0,0,218,6,115, 117,102,102,105,120,169,1,90,9,102,105,108,101,95,110,97, 109,101,114,7,0,0,0,114,8,0,0,0,114,9,0,0, - 0,116,4,0,0,115,8,0,0,0,4,0,2,1,20,255, + 0,117,4,0,0,115,8,0,0,0,4,0,2,1,20,255, 255,128,122,49,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,111,99,97,108,115,62,46,60,103,101,110, 101,120,112,114,62,78,41,4,114,55,0,0,0,114,52,0, 0,0,218,3,97,110,121,114,212,0,0,0,114,226,0,0, 0,114,7,0,0,0,114,16,1,0,0,114,8,0,0,0, - 114,186,0,0,0,113,4,0,0,115,10,0,0,0,14,2, + 114,186,0,0,0,114,4,0,0,115,10,0,0,0,14,2, 12,1,2,1,8,255,255,128,122,30,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, @@ -1770,7 +1770,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,7, 0,0,0,114,226,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,220,0,0,0,119,4,0,0, + 0,0,114,8,0,0,0,114,220,0,0,0,120,4,0,0, 115,4,0,0,0,4,2,255,128,122,28,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, @@ -1781,14 +1781,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 118,101,32,110,111,32,115,111,117,114,99,101,32,99,111,100, 101,46,78,114,7,0,0,0,114,226,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,236,0,0, - 0,123,4,0,0,115,4,0,0,0,4,2,255,128,122,30, + 0,124,4,0,0,115,4,0,0,0,4,2,255,128,122,30, 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,99,2, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, 0,0,0,67,0,0,0,115,6,0,0,0,124,0,106,0, 83,0,114,1,1,0,0,114,56,0,0,0,114,226,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,183,0,0,0,127,4,0,0,115,4,0,0,0,6,3, + 114,183,0,0,0,128,4,0,0,115,4,0,0,0,6,3, 255,128,122,32,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,101, 110,97,109,101,78,41,14,114,130,0,0,0,114,129,0,0, @@ -1797,7 +1797,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 224,0,0,0,114,186,0,0,0,114,220,0,0,0,114,236, 0,0,0,114,140,0,0,0,114,183,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,3,1,0,0,80,4,0,0,115,26,0,0,0,8, + 0,114,3,1,0,0,81,4,0,0,115,26,0,0,0,8, 0,4,2,8,6,8,4,8,4,8,3,8,8,8,6,8, 6,8,4,2,4,14,1,255,128,114,3,1,0,0,99,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, @@ -1840,7 +1840,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 169,4,114,123,0,0,0,114,121,0,0,0,114,52,0,0, 0,90,11,112,97,116,104,95,102,105,110,100,101,114,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, - 0,0,140,4,0,0,115,10,0,0,0,6,1,6,1,14, + 0,0,141,4,0,0,115,10,0,0,0,6,1,6,1,14, 1,10,1,255,128,122,23,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,0,0,0,0,4,0,0,0,3, @@ -1857,7 +1857,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,41,4,114,123,0,0,0,114,11,1,0,0,218,3,100, 111,116,90,2,109,101,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,23,95,102,105,110,100,95,112,97,114, - 101,110,116,95,112,97,116,104,95,110,97,109,101,115,146,4, + 101,110,116,95,112,97,116,104,95,110,97,109,101,115,147,4, 0,0,115,10,0,0,0,18,2,8,1,4,2,8,3,255, 128,122,38,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, @@ -1871,7 +1871,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,95,109,111,100,117,108,101,95,110,97,109,101,90,14,112, 97,116,104,95,97,116,116,114,95,110,97,109,101,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,21,1,0, - 0,156,4,0,0,115,6,0,0,0,12,1,16,1,255,128, + 0,157,4,0,0,115,6,0,0,0,12,1,16,1,255,128, 122,31,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,0,0,0,0,3,0, @@ -1887,7 +1887,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,123,0,0,0,90,11,112,97,114,101,110,116,95,112,97, 116,104,114,191,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,12,95,114,101,99,97,108,99,117, - 108,97,116,101,160,4,0,0,115,18,0,0,0,12,2,10, + 108,97,116,101,161,4,0,0,115,18,0,0,0,12,2,10, 1,14,1,18,3,6,1,8,1,6,1,6,1,255,128,122, 27,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, 95,114,101,99,97,108,99,117,108,97,116,101,99,1,0,0, @@ -1896,7 +1896,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 161,0,131,1,83,0,114,114,0,0,0,41,2,218,4,105, 116,101,114,114,28,1,0,0,114,253,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,8,95,95, - 105,116,101,114,95,95,173,4,0,0,115,4,0,0,0,12, + 105,116,101,114,95,95,174,4,0,0,115,4,0,0,0,12, 1,255,128,122,23,95,78,97,109,101,115,112,97,99,101,80, 97,116,104,46,95,95,105,116,101,114,95,95,99,2,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, @@ -1904,7 +1904,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,1,25,0,83,0,114,114,0,0,0,169,1,114,28,1, 0,0,41,2,114,123,0,0,0,218,5,105,110,100,101,120, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,95,95,103,101,116,105,116,101,109,95,95,176,4,0,0, + 11,95,95,103,101,116,105,116,101,109,95,95,177,4,0,0, 115,4,0,0,0,12,1,255,128,122,26,95,78,97,109,101, 115,112,97,99,101,80,97,116,104,46,95,95,103,101,116,105, 116,101,109,95,95,99,3,0,0,0,0,0,0,0,0,0, @@ -1913,7 +1913,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,114,0,0,0,41,1,114,20,1,0,0,41,3,114, 123,0,0,0,114,32,1,0,0,114,52,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, - 95,115,101,116,105,116,101,109,95,95,179,4,0,0,115,4, + 95,115,101,116,105,116,101,109,95,95,180,4,0,0,115,4, 0,0,0,14,1,255,128,122,26,95,78,97,109,101,115,112, 97,99,101,80,97,116,104,46,95,95,115,101,116,105,116,101, 109,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, @@ -1921,7 +1921,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,116,0,124,0,160,1,161,0,131,1,83,0,114,114,0, 0,0,41,2,114,4,0,0,0,114,28,1,0,0,114,253, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,7,95,95,108,101,110,95,95,182,4,0,0,115, + 0,0,218,7,95,95,108,101,110,95,95,183,4,0,0,115, 4,0,0,0,12,1,255,128,122,22,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,0,0,0,0,1,0,0, @@ -1930,7 +1930,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, 114,125,41,41,2,114,70,0,0,0,114,20,1,0,0,114, 253,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,8,95,95,114,101,112,114,95,95,185,4,0, + 0,0,0,218,8,95,95,114,101,112,114,95,95,186,4,0, 0,115,4,0,0,0,12,1,255,128,122,23,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,0,0,0,0, @@ -1939,7 +1939,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,31,1,0,0,169,2,114,123,0,0,0,218,4, 105,116,101,109,114,7,0,0,0,114,7,0,0,0,114,8, 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, - 95,188,4,0,0,115,4,0,0,0,12,1,255,128,122,27, + 95,189,4,0,0,115,4,0,0,0,12,1,255,128,122,27, 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,0,0,0,0,2,0,0,0,3,0,0,0, @@ -1947,7 +1947,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,161,1,1,0,100,0,83,0,114,114,0,0,0,41,2, 114,20,1,0,0,114,190,0,0,0,114,37,1,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,190, - 0,0,0,191,4,0,0,115,4,0,0,0,16,1,255,128, + 0,0,0,192,4,0,0,115,4,0,0,0,16,1,255,128, 122,21,95,78,97,109,101,115,112,97,99,101,80,97,116,104, 46,97,112,112,101,110,100,78,41,15,114,130,0,0,0,114, 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,216, @@ -1955,7 +1955,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,30,1,0,0,114,33,1,0,0,114,34,1,0, 0,114,35,1,0,0,114,36,1,0,0,114,39,1,0,0, 114,190,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,18,1,0,0,133,4, + 7,0,0,0,114,8,0,0,0,114,18,1,0,0,134,4, 0,0,115,28,0,0,0,8,0,4,1,8,6,8,6,8, 10,8,4,8,13,8,3,8,3,8,3,8,3,8,3,12, 3,255,128,114,18,1,0,0,99,0,0,0,0,0,0,0, @@ -1972,7 +1972,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 131,3,124,0,95,1,100,0,83,0,114,114,0,0,0,41, 2,114,18,1,0,0,114,20,1,0,0,114,24,1,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 216,0,0,0,197,4,0,0,115,4,0,0,0,18,1,255, + 216,0,0,0,198,4,0,0,115,4,0,0,0,18,1,255, 128,122,25,95,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,1,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, @@ -1989,21 +1989,21 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,115,112,97,99,101,41,62,78,41,2,114,70,0,0,0, 114,130,0,0,0,41,1,114,223,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,11,109,111,100, - 117,108,101,95,114,101,112,114,200,4,0,0,115,4,0,0, + 117,108,101,95,114,101,112,114,201,4,0,0,115,4,0,0, 0,12,7,255,128,122,28,95,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,0,0,0,0, 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, 0,100,1,83,0,41,2,78,84,114,7,0,0,0,114,226, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,186,0,0,0,209,4,0,0,115,4,0,0,0, + 0,0,114,186,0,0,0,210,4,0,0,115,4,0,0,0, 4,1,255,128,122,27,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0, 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, 1,83,0,41,2,78,114,10,0,0,0,114,7,0,0,0, 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,236,0,0,0,212,4,0,0,115,4,0, + 8,0,0,0,114,236,0,0,0,213,4,0,0,115,4,0, 0,0,4,1,255,128,122,27,95,78,97,109,101,115,112,97, 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117, 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0, @@ -2013,20 +2013,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,103,62,114,222,0,0,0,84,41,1,114,238,0,0,0, 41,1,114,239,0,0,0,114,226,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,220,0,0,0, - 215,4,0,0,115,4,0,0,0,16,1,255,128,122,25,95, + 216,4,0,0,115,4,0,0,0,16,1,255,128,122,25,95, 78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, 0,115,4,0,0,0,100,1,83,0,114,217,0,0,0,114, 7,0,0,0,114,218,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,219,0,0,0,218,4,0, + 0,0,0,114,8,0,0,0,114,219,0,0,0,219,4,0, 0,115,4,0,0,0,4,0,255,128,122,30,95,78,97,109, 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, 0,0,0,115,4,0,0,0,100,0,83,0,114,114,0,0, 0,114,7,0,0,0,114,13,1,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,224,0,0,0,221, + 114,7,0,0,0,114,8,0,0,0,114,224,0,0,0,222, 4,0,0,115,4,0,0,0,4,1,255,128,122,28,95,78, 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, @@ -2045,7 +2045,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,41,4,114,139,0,0,0,114,153,0,0,0,114,20,1, 0,0,114,225,0,0,0,114,226,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,227,0,0,0, - 224,4,0,0,115,10,0,0,0,6,7,4,1,4,255,12, + 225,4,0,0,115,10,0,0,0,6,7,4,1,4,255,12, 3,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0,114,131, @@ -2053,7 +2053,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,186,0,0,0,114,236,0,0,0,114,220,0,0, 0,114,219,0,0,0,114,224,0,0,0,114,227,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,40,1,0,0,196,4,0,0,115,22,0, + 8,0,0,0,114,40,1,0,0,197,4,0,0,115,22,0, 0,0,8,0,8,1,2,3,10,1,8,8,8,3,8,3, 8,3,8,3,12,3,255,128,114,40,1,0,0,99,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, @@ -2090,7 +2090,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,99,104,101,218,5,105,116,101,109,115,114,133,0,0,0, 114,43,1,0,0,41,2,114,121,0,0,0,218,6,102,105, 110,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,43,1,0,0,243,4,0,0,115,16,0,0, + 0,0,0,114,43,1,0,0,244,4,0,0,115,16,0,0, 0,22,4,8,1,10,1,10,1,8,1,2,128,4,252,255, 128,122,28,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, @@ -2100,7 +2100,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 3,100,2,116,4,161,2,1,0,116,0,106,1,68,0,93, 36,125,1,122,14,124,1,124,0,131,1,87,0,2,0,1, 0,83,0,4,0,116,5,121,70,1,0,1,0,1,0,89, - 0,113,34,48,0,100,1,83,0,41,3,122,46,83,101,97, + 0,113,34,119,0,100,1,83,0,41,3,122,46,83,101,97, 114,99,104,32,115,121,115,46,112,97,116,104,95,104,111,111, 107,115,32,102,111,114,32,97,32,102,105,110,100,101,114,32, 102,111,114,32,39,112,97,116,104,39,46,78,122,23,115,121, @@ -2110,18 +2110,18 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,142,0,0,0,114,122,0,0,0,41,2,114,52, 0,0,0,90,4,104,111,111,107,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, - 104,111,111,107,115,253,4,0,0,115,18,0,0,0,16,3, + 104,111,111,107,115,254,4,0,0,115,18,0,0,0,16,3, 12,1,10,1,2,1,14,1,12,1,6,1,4,2,255,128, 122,22,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,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, 0,115,100,0,0,0,124,1,100,1,107,2,114,42,122,12, 116,0,160,1,161,0,125,1,87,0,110,20,4,0,116,2, - 121,40,1,0,1,0,1,0,89,0,100,2,83,0,48,0, + 121,40,1,0,1,0,1,0,89,0,100,2,83,0,119,0, 122,16,116,3,106,4,124,1,25,0,125,2,87,0,124,2, 83,0,4,0,116,5,121,98,1,0,1,0,1,0,124,0, 160,6,124,1,161,1,125,2,124,2,116,3,106,4,124,1, - 60,0,89,0,124,2,83,0,48,0,41,3,122,210,71,101, + 60,0,89,0,124,2,83,0,119,0,41,3,122,210,71,101, 116,32,116,104,101,32,102,105,110,100,101,114,32,102,111,114, 32,116,104,101,32,112,97,116,104,32,101,110,116,114,121,32, 102,114,111,109,32,115,121,115,46,112,97,116,104,95,105,109, @@ -2142,7 +2142,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,202,0,0,0,114,52,0,0,0,114,47,1,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,20, 95,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,10,5,0,0,115,28,0,0,0,8,8,2, + 97,99,104,101,11,5,0,0,115,28,0,0,0,8,8,2, 1,12,1,12,1,8,3,2,1,12,1,4,4,12,253,10, 1,12,1,4,1,2,255,255,128,122,31,80,97,116,104,70, 105,110,100,101,114,46,95,112,97,116,104,95,105,109,112,111, @@ -2160,7 +2160,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,47,1,0,0,114,144,0,0,0,114,145,0, 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,16,95,108,101,103,97,99,121,95, - 103,101,116,95,115,112,101,99,32,5,0,0,115,20,0,0, + 103,101,116,95,115,112,101,99,33,5,0,0,115,20,0,0, 0,10,4,16,1,10,2,4,1,8,1,12,1,12,1,6, 1,4,1,255,128,122,27,80,97,116,104,70,105,110,100,101, 114,46,95,108,101,103,97,99,121,95,103,101,116,95,115,112, @@ -2192,7 +2192,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 90,5,101,110,116,114,121,114,47,1,0,0,114,191,0,0, 0,114,145,0,0,0,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,9,95,103,101,116,95,115,112,101,99, - 47,5,0,0,115,44,0,0,0,4,5,8,1,14,1,2, + 48,5,0,0,115,44,0,0,0,4,5,8,1,14,1,2, 1,10,1,8,1,10,1,14,1,12,2,8,1,2,1,10, 1,8,1,6,1,8,1,8,1,10,5,2,128,12,2,6, 1,4,1,255,128,122,20,80,97,116,104,70,105,110,100,101, @@ -2219,7 +2219,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,202,0,0,0,114,143,0,0,0,114,52,0,0,0,114, 206,0,0,0,114,191,0,0,0,114,55,1,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,207,0, - 0,0,79,5,0,0,115,28,0,0,0,8,6,6,1,14, + 0,0,80,5,0,0,115,28,0,0,0,8,6,6,1,14, 1,8,1,4,1,10,1,6,1,4,1,6,3,16,1,4, 1,4,2,4,2,255,128,122,20,80,97,116,104,70,105,110, 100,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, @@ -2239,7 +2239,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,99,40,41,32,105,110,115,116,101,97,100,46,10,10,32, 32,32,32,32,32,32,32,78,114,208,0,0,0,114,209,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,210,0,0,0,103,5,0,0,115,10,0,0,0,12, + 0,114,210,0,0,0,104,5,0,0,115,10,0,0,0,12, 8,8,1,4,1,6,1,255,128,122,22,80,97,116,104,70, 105,110,100,101,114,46,102,105,110,100,95,109,111,100,117,108, 101,99,0,0,0,0,0,0,0,0,0,0,0,0,3,0, @@ -2271,7 +2271,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,105,115,116,114,105,98,117,116,105,111,110,115,41,3,114, 124,0,0,0,114,125,0,0,0,114,57,1,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,58,1, - 0,0,116,5,0,0,115,6,0,0,0,12,10,16,1,255, + 0,0,117,5,0,0,115,6,0,0,0,12,10,16,1,255, 128,122,29,80,97,116,104,70,105,110,100,101,114,46,102,105, 110,100,95,100,105,115,116,114,105,98,117,116,105,111,110,115, 41,1,78,41,2,78,78,41,1,78,41,14,114,130,0,0, @@ -2280,7 +2280,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 214,0,0,0,114,52,1,0,0,114,53,1,0,0,114,56, 1,0,0,114,207,0,0,0,114,210,0,0,0,114,58,1, 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,42,1,0,0,239,4,0,0,115, + 0,114,8,0,0,0,114,42,1,0,0,240,4,0,0,115, 38,0,0,0,8,0,4,2,2,2,10,1,2,9,10,1, 2,12,10,1,2,21,10,1,2,14,12,1,2,31,12,1, 2,23,12,1,2,12,14,1,255,128,114,42,1,0,0,99, @@ -2325,7 +2325,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,124,0,93,14,125,1,124,1,136,0,102,2,86,0,1, 0,113,2,100,0,83,0,114,114,0,0,0,114,7,0,0, 0,114,14,1,0,0,169,1,114,144,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,9,0,0,0,145,5,0,0, + 0,0,114,8,0,0,0,114,9,0,0,0,146,5,0,0, 115,4,0,0,0,22,0,255,128,122,38,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, @@ -2338,7 +2338,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,218,14,108,111,97,100,101,114,95,100,101,116,97,105, 108,115,90,7,108,111,97,100,101,114,115,114,193,0,0,0, 114,7,0,0,0,114,60,1,0,0,114,8,0,0,0,114, - 216,0,0,0,139,5,0,0,115,18,0,0,0,4,4,12, + 216,0,0,0,140,5,0,0,115,18,0,0,0,4,4,12, 1,26,1,6,1,10,2,6,1,8,1,12,1,255,128,122, 19,70,105,108,101,70,105,110,100,101,114,46,95,95,105,110, 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, @@ -2348,7 +2348,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 105,114,101,99,116,111,114,121,32,109,116,105,109,101,46,114, 109,0,0,0,78,41,1,114,62,1,0,0,114,253,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,43,1,0,0,153,5,0,0,115,4,0,0,0,10,2, + 114,43,1,0,0,154,5,0,0,115,4,0,0,0,10,2, 255,128,122,28,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,0,0,0,0,0,0,0,0,3,0,0, @@ -2371,7 +2371,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,78,41,3,114,207,0,0,0,114,144,0,0,0,114,182, 0,0,0,41,3,114,123,0,0,0,114,143,0,0,0,114, 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,141,0,0,0,159,5,0,0,115,10,0,0, + 0,0,0,114,141,0,0,0,160,5,0,0,115,10,0,0, 0,10,7,8,1,8,1,16,1,255,128,122,22,70,105,108, 101,70,105,110,100,101,114,46,102,105,110,100,95,108,111,97, 100,101,114,99,6,0,0,0,0,0,0,0,0,0,0,0, @@ -2382,7 +2382,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,192,0,0,0,114,143,0,0,0,114,52,0,0,0, 90,4,115,109,115,108,114,206,0,0,0,114,144,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 56,1,0,0,171,5,0,0,115,10,0,0,0,10,1,8, + 56,1,0,0,172,5,0,0,115,10,0,0,0,10,1,8, 1,2,1,6,255,255,128,122,20,70,105,108,101,70,105,110, 100,101,114,46,95,103,101,116,95,115,112,101,99,78,99,3, 0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,8, @@ -2390,7 +2390,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,1,160,0,100,2,161,1,100,3,25,0,125,4,122,24, 116,1,124,0,106,2,112,34,116,3,160,4,161,0,131,1, 106,5,125,5,87,0,110,22,4,0,116,6,121,64,1,0, - 1,0,1,0,100,4,125,5,89,0,110,2,48,0,124,5, + 1,0,1,0,100,4,125,5,89,0,110,2,119,0,124,5, 124,0,106,7,107,3,114,90,124,0,160,8,161,0,1,0, 124,5,124,0,95,7,116,9,131,0,114,112,124,0,106,10, 125,6,124,4,160,11,161,0,125,7,110,10,124,0,106,12, @@ -2436,7 +2436,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,192,0,0,0,90,13,105,110,105,116,95,102,105, 108,101,110,97,109,101,90,9,102,117,108,108,95,112,97,116, 104,114,191,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,207,0,0,0,176,5,0,0,115,74, + 114,8,0,0,0,114,207,0,0,0,177,5,0,0,115,74, 0,0,0,4,5,14,1,2,1,24,1,12,1,10,1,10, 1,8,1,6,1,6,2,6,1,10,1,6,2,4,1,8, 2,12,1,14,1,8,1,10,1,8,1,24,1,8,4,14, @@ -2448,7 +2448,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,124,0,106,0,125,1,122,22,116,1,160,2,124,1,112, 22,116,1,160,3,161,0,161,1,125,2,87,0,110,28,4, 0,116,4,116,5,116,6,102,3,121,56,1,0,1,0,1, - 0,103,0,125,2,89,0,110,2,48,0,116,7,106,8,160, + 0,103,0,125,2,89,0,110,2,119,0,116,7,106,8,160, 9,100,1,161,1,115,82,116,10,124,2,131,1,124,0,95, 11,110,74,116,10,131,0,125,3,124,2,68,0,93,56,125, 4,124,4,160,12,100,2,161,1,92,3,125,5,125,6,125, @@ -2468,7 +2468,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 160,0,161,0,146,2,113,4,83,0,114,7,0,0,0,41, 1,114,110,0,0,0,41,2,114,5,0,0,0,90,2,102, 110,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,13,0,0,0,253,5,0,0,115,4,0,0,0,20,0, + 114,13,0,0,0,254,5,0,0,115,4,0,0,0,20,0, 255,128,122,41,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,115,101,116,99,111,109,112,62,78,41,18, @@ -2485,7 +2485,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,116,101,110,116,115,114,38,1,0,0,114,121,0,0,0, 114,25,1,0,0,114,15,1,0,0,90,8,110,101,119,95, 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,67,1,0,0,224,5,0,0,115,38,0,0, + 0,0,0,114,67,1,0,0,225,5,0,0,115,38,0,0, 0,6,2,2,1,22,1,18,1,10,3,12,3,12,1,6, 7,8,1,16,1,4,1,18,1,4,2,12,1,6,1,12, 1,20,1,4,255,255,128,122,22,70,105,108,101,70,105,110, @@ -2524,14 +2524,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 56,0,0,0,169,2,114,202,0,0,0,114,66,1,0,0, 114,7,0,0,0,114,8,0,0,0,218,24,112,97,116,104, 95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,105, - 110,100,101,114,9,6,0,0,115,8,0,0,0,8,2,12, + 110,100,101,114,10,6,0,0,115,8,0,0,0,8,2,12, 1,16,1,255,128,122,54,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,107,95,102, 111,114,95,70,105,108,101,70,105,110,100,101,114,78,114,7, 0,0,0,41,3,114,202,0,0,0,114,66,1,0,0,114, 72,1,0,0,114,7,0,0,0,114,71,1,0,0,114,8, - 0,0,0,218,9,112,97,116,104,95,104,111,111,107,255,5, + 0,0,0,218,9,112,97,116,104,95,104,111,111,107,0,6, 0,0,115,6,0,0,0,14,10,4,6,255,128,122,20,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,0,0,0,0, @@ -2540,7 +2540,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 122,16,70,105,108,101,70,105,110,100,101,114,40,123,33,114, 125,41,41,2,114,70,0,0,0,114,52,0,0,0,114,253, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,36,1,0,0,17,6,0,0,115,4,0,0,0, + 0,0,114,36,1,0,0,18,6,0,0,115,4,0,0,0, 12,1,255,128,122,19,70,105,108,101,70,105,110,100,101,114, 46,95,95,114,101,112,114,95,95,41,1,78,41,15,114,130, 0,0,0,114,129,0,0,0,114,131,0,0,0,114,132,0, @@ -2549,7 +2549,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,207,0,0,0,114,67,1,0,0,114,214,0,0,0,114, 73,1,0,0,114,36,1,0,0,114,7,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,59,1, - 0,0,130,5,0,0,115,26,0,0,0,8,0,4,2,8, + 0,0,131,5,0,0,115,26,0,0,0,8,0,4,2,8, 7,8,14,4,4,8,2,8,12,10,5,8,48,2,31,10, 1,12,17,255,128,114,59,1,0,0,99,4,0,0,0,0, 0,0,0,0,0,0,0,6,0,0,0,8,0,0,0,67, @@ -2562,7 +2562,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 124,0,100,2,60,0,124,4,124,0,100,1,60,0,124,2, 124,0,100,4,60,0,124,3,124,0,100,5,60,0,87,0, 100,0,83,0,4,0,116,5,121,142,1,0,1,0,1,0, - 89,0,100,0,83,0,48,0,41,6,78,218,10,95,95,108, + 89,0,100,0,83,0,119,0,41,6,78,218,10,95,95,108, 111,97,100,101,114,95,95,218,8,95,95,115,112,101,99,95, 95,114,60,1,0,0,90,8,95,95,102,105,108,101,95,95, 90,10,95,95,99,97,99,104,101,100,95,95,41,6,218,3, @@ -2572,7 +2572,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,116,104,110,97,109,101,90,9,99,112,97,116,104,110,97, 109,101,114,144,0,0,0,114,191,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,14,95,102,105, - 120,95,117,112,95,109,111,100,117,108,101,23,6,0,0,115, + 120,95,117,112,95,109,111,100,117,108,101,24,6,0,0,115, 36,0,0,0,10,2,10,1,4,1,4,1,8,1,8,1, 12,1,10,2,4,1,14,1,2,1,8,1,8,1,8,1, 14,1,12,1,8,2,255,128,114,78,1,0,0,99,0,0, @@ -2592,7 +2592,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 12,1,0,0,114,94,0,0,0,41,3,90,10,101,120,116, 101,110,115,105,111,110,115,90,6,115,111,117,114,99,101,90, 8,98,121,116,101,99,111,100,101,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,188,0,0,0,46,6,0, + 0,0,0,114,8,0,0,0,114,188,0,0,0,47,6,0, 0,115,10,0,0,0,12,5,8,1,8,1,10,1,255,128, 114,188,0,0,0,99,1,0,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,8, @@ -2601,7 +2601,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,116,114,97,112,95,109,111,100,117,108,101,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,21,95,115,101, 116,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, - 108,101,57,6,0,0,115,4,0,0,0,8,2,255,128,114, + 108,101,58,6,0,0,115,4,0,0,0,8,2,255,128,114, 81,1,0,0,99,1,0,0,0,0,0,0,0,0,0,0, 0,2,0,0,0,4,0,0,0,67,0,0,0,115,50,0, 0,0,116,0,124,0,131,1,1,0,116,1,131,0,125,1, @@ -2616,7 +2616,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,104,114,190,0,0,0,114,42,1,0,0,41,2,114,80, 1,0,0,90,17,115,117,112,112,111,114,116,101,100,95,108, 111,97,100,101,114,115,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,8,95,105,110,115,116,97,108,108,62, + 114,8,0,0,0,218,8,95,105,110,115,116,97,108,108,63, 6,0,0,115,10,0,0,0,8,2,6,1,20,1,16,1, 255,128,114,83,1,0,0,41,1,114,68,0,0,0,41,1, 78,41,3,78,78,78,41,2,114,0,0,0,0,114,0,0, @@ -2659,7 +2659,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,8,2,4,3,10,1,6,2,22,2,8,1,10,1,14, 1,4,4,4,1,2,1,2,1,4,255,8,4,6,16,8, 3,8,5,8,5,8,6,8,6,8,12,8,10,8,9,8, - 5,8,7,10,9,10,22,0,127,16,23,12,1,4,2,4, + 5,8,7,10,9,10,22,0,127,16,24,12,1,4,2,4, 1,6,2,6,1,10,1,8,2,6,2,8,2,16,2,8, 71,8,40,8,19,8,12,8,12,8,31,8,17,8,33,8, 28,10,24,10,13,10,10,8,11,6,14,4,3,2,1,12, diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index 2058a9e3548737..38f148ea783828 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -128,11 +128,11 @@ const unsigned char _Py_M__zipimport[] = { 12,124,1,161,1,92,2,125,5,125,6,124,5,124,1,107, 2,114,132,116,4,100,5,124,1,100,3,141,2,130,1,124, 5,125,1,124,3,160,13,124,6,161,1,1,0,89,0,110, - 28,48,0,124,4,106,14,100,6,64,0,100,7,107,3,114, + 28,119,0,124,4,106,14,100,6,64,0,100,7,107,3,114, 180,116,4,100,5,124,1,100,3,141,2,130,1,113,66,122, 12,116,15,124,1,25,0,125,7,87,0,110,34,4,0,116, 16,121,226,1,0,1,0,1,0,116,17,124,1,131,1,125, - 7,124,7,116,15,124,1,60,0,89,0,110,2,48,0,124, + 7,124,7,116,15,124,1,60,0,89,0,110,2,119,0,124, 7,124,0,95,18,124,1,124,0,95,19,116,8,106,20,124, 3,100,0,100,0,100,8,133,3,25,0,142,0,124,0,95, 21,124,0,106,21,144,1,114,32,124,0,4,0,106,21,116, @@ -319,7 +319,7 @@ const unsigned char _Py_M__zipimport[] = { 0,106,4,116,2,23,0,131,1,100,1,133,2,25,0,125, 2,122,14,124,0,106,6,124,2,25,0,125,3,87,0,110, 26,4,0,116,7,121,98,1,0,1,0,1,0,116,8,100, - 2,100,3,124,2,131,3,130,1,48,0,116,9,124,0,106, + 2,100,3,124,2,131,3,130,1,119,0,116,9,124,0,106, 4,124,3,131,2,83,0,41,4,122,154,103,101,116,95,100, 97,116,97,40,112,97,116,104,110,97,109,101,41,32,45,62, 32,115,116,114,105,110,103,32,119,105,116,104,32,102,105,108, @@ -365,7 +365,7 @@ const unsigned char _Py_M__zipimport[] = { 160,4,124,3,100,4,161,2,125,4,110,10,124,3,155,0, 100,5,157,2,125,4,122,14,124,0,106,5,124,4,25,0, 125,5,87,0,110,20,4,0,116,6,121,108,1,0,1,0, - 1,0,89,0,100,1,83,0,48,0,116,7,124,0,106,8, + 1,0,89,0,100,1,83,0,119,0,116,7,124,0,106,8, 124,5,131,2,160,9,161,0,83,0,41,6,122,253,103,101, 116,95,115,111,117,114,99,101,40,102,117,108,108,110,97,109, 101,41,32,45,62,32,115,111,117,114,99,101,32,115,116,114, @@ -434,7 +434,7 @@ const unsigned char _Py_M__zipimport[] = { 16,1,0,1,0,1,0,116,4,106,5,124,1,61,0,130, 0,122,14,116,4,106,5,124,1,25,0,125,6,87,0,110, 30,4,0,116,20,121,232,1,0,1,0,1,0,116,21,100, - 4,124,1,155,2,100,5,157,3,131,1,130,1,48,0,116, + 4,124,1,155,2,100,5,157,3,131,1,130,1,119,0,116, 22,160,23,100,6,124,1,124,5,161,3,1,0,124,6,83, 0,41,7,97,55,1,0,0,108,111,97,100,95,109,111,100, 117,108,101,40,102,117,108,108,110,97,109,101,41,32,45,62, @@ -496,7 +496,7 @@ const unsigned char _Py_M__zipimport[] = { 3,0,0,0,8,0,0,0,67,0,0,0,115,64,0,0, 0,122,20,124,0,160,0,124,1,161,1,115,18,87,0,100, 1,83,0,87,0,110,20,4,0,116,1,121,40,1,0,1, - 0,1,0,89,0,100,1,83,0,48,0,100,2,100,3,108, + 0,1,0,89,0,100,1,83,0,119,0,100,2,100,3,108, 2,109,3,125,2,1,0,124,2,124,0,124,1,131,2,83, 0,41,4,122,204,82,101,116,117,114,110,32,116,104,101,32, 82,101,115,111,117,114,99,101,82,101,97,100,101,114,32,102, @@ -578,23 +578,23 @@ const unsigned char _Py_M__zipimport[] = { 0,0,0,115,232,4,0,0,122,14,116,0,160,1,124,0, 161,1,125,1,87,0,110,32,4,0,116,2,121,46,1,0, 1,0,1,0,116,3,100,1,124,0,155,2,157,2,124,0, - 100,2,141,2,130,1,48,0,124,1,144,4,143,142,1,0, + 100,2,141,2,130,1,119,0,124,1,144,4,143,142,1,0, 122,36,124,1,160,4,116,5,11,0,100,3,161,2,1,0, 124,1,160,6,161,0,125,2,124,1,160,7,116,5,161,1, 125,3,87,0,110,32,4,0,116,2,121,124,1,0,1,0, 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,48,0,116,8,124,3,131,1,116,5,107,3, + 141,2,130,1,119,0,116,8,124,3,131,1,116,5,107,3, 114,156,116,3,100,4,124,0,155,2,157,2,124,0,100,2, 141,2,130,1,124,3,100,0,100,5,133,2,25,0,116,9, 107,3,144,1,114,154,122,24,124,1,160,4,100,6,100,3, 161,2,1,0,124,1,160,6,161,0,125,4,87,0,110,32, 4,0,116,2,121,230,1,0,1,0,1,0,116,3,100,4, - 124,0,155,2,157,2,124,0,100,2,141,2,130,1,48,0, + 124,0,155,2,157,2,124,0,100,2,141,2,130,1,119,0, 116,10,124,4,116,11,24,0,116,5,24,0,100,6,131,2, 125,5,122,22,124,1,160,4,124,5,161,1,1,0,124,1, 160,7,161,0,125,6,87,0,110,34,4,0,116,2,144,1, 121,50,1,0,1,0,1,0,116,3,100,4,124,0,155,2, - 157,2,124,0,100,2,141,2,130,1,48,0,124,6,160,12, + 157,2,124,0,100,2,141,2,130,1,119,0,124,6,160,12, 116,9,161,1,125,7,124,7,100,6,107,0,144,1,114,90, 116,3,100,7,124,0,155,2,157,2,124,0,100,2,141,2, 130,1,124,6,124,7,124,7,116,5,23,0,133,2,25,0, @@ -612,7 +612,7 @@ const unsigned char _Py_M__zipimport[] = { 100,2,141,2,130,1,105,0,125,11,100,6,125,12,122,14, 124,1,160,4,124,2,161,1,1,0,87,0,110,34,4,0, 116,2,144,2,121,86,1,0,1,0,1,0,116,3,100,4, - 124,0,155,2,157,2,124,0,100,2,141,2,130,1,48,0, + 124,0,155,2,157,2,124,0,100,2,141,2,130,1,119,0, 9,0,124,1,160,7,100,16,161,1,125,3,116,8,124,3, 131,1,100,5,107,0,144,2,114,122,116,14,100,17,131,1, 130,1,124,3,100,0,100,5,133,2,25,0,100,18,107,3, @@ -634,7 +634,7 @@ const unsigned char _Py_M__zipimport[] = { 100,2,141,2,130,1,124,22,124,10,55,0,125,22,122,14, 124,1,160,7,124,19,161,1,125,23,87,0,110,34,4,0, 116,2,144,3,121,182,1,0,1,0,1,0,116,3,100,4, - 124,0,155,2,157,2,124,0,100,2,141,2,130,1,48,0, + 124,0,155,2,157,2,124,0,100,2,141,2,130,1,119,0, 116,8,124,23,131,1,124,19,107,3,144,3,114,216,116,3, 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, 122,50,116,8,124,1,160,7,124,8,124,19,24,0,161,1, @@ -642,17 +642,17 @@ const unsigned char _Py_M__zipimport[] = { 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, 87,0,110,34,4,0,116,2,144,4,121,44,1,0,1,0, 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,48,0,124,13,100,29,64,0,144,4,114,66, + 141,2,130,1,119,0,124,13,100,29,64,0,144,4,114,66, 124,23,160,16,161,0,125,23,110,52,122,14,124,23,160,16, 100,30,161,1,125,23,87,0,110,36,4,0,116,17,144,4, 121,116,1,0,1,0,1,0,124,23,160,16,100,31,161,1, - 160,18,116,19,161,1,125,23,89,0,110,2,48,0,124,23, + 160,18,116,19,161,1,125,23,89,0,110,2,119,0,124,23, 160,20,100,32,116,21,161,2,125,23,116,22,160,23,124,0, 124,23,161,2,125,24,124,24,124,14,124,18,124,4,124,22, 124,15,124,16,124,17,102,8,125,25,124,25,124,11,124,23, 60,0,124,12,100,33,55,0,125,12,144,2,113,90,87,0, 100,0,4,0,4,0,131,3,1,0,110,18,49,0,144,4, - 115,204,48,0,1,0,1,0,1,0,89,0,1,0,116,24, + 115,204,119,1,1,0,1,0,1,0,89,0,1,0,116,24, 160,25,100,34,124,12,124,0,161,3,1,0,124,11,83,0, 41,35,78,122,21,99,97,110,39,116,32,111,112,101,110,32, 90,105,112,32,102,105,108,101,58,32,114,12,0,0,0,114, @@ -758,8 +758,8 @@ const unsigned char _Py_M__zipimport[] = { 100,3,97,0,122,58,122,16,100,4,100,5,108,4,109,5, 125,0,1,0,87,0,110,32,4,0,116,6,121,76,1,0, 1,0,1,0,116,1,160,2,100,1,161,1,1,0,116,3, - 100,2,131,1,130,1,48,0,87,0,100,6,97,0,110,6, - 100,6,97,0,48,0,116,1,160,2,100,7,161,1,1,0, + 100,2,131,1,130,1,119,0,87,0,100,6,97,0,110,6, + 100,6,97,0,119,0,116,1,160,2,100,7,161,1,1,0, 124,0,83,0,41,8,78,122,27,122,105,112,105,109,112,111, 114,116,58,32,122,108,105,98,32,85,78,65,86,65,73,76, 65,66,76,69,250,41,99,97,110,39,116,32,100,101,99,111, @@ -784,7 +784,7 @@ const unsigned char _Py_M__zipimport[] = { 2,124,0,161,1,144,1,143,6,125,10,122,14,124,10,160, 3,124,6,161,1,1,0,87,0,110,32,4,0,116,4,121, 96,1,0,1,0,1,0,116,0,100,3,124,0,155,2,157, - 2,124,0,100,4,141,2,130,1,48,0,124,10,160,5,100, + 2,124,0,100,4,141,2,130,1,119,0,124,10,160,5,100, 5,161,1,125,11,116,6,124,11,131,1,100,5,107,3,114, 128,116,7,100,6,131,1,130,1,124,11,100,0,100,7,133, 2,25,0,100,8,107,3,114,162,116,0,100,9,124,0,155, @@ -794,15 +794,15 @@ const unsigned char _Py_M__zipimport[] = { 0,124,13,23,0,125,14,124,6,124,14,55,0,125,6,122, 14,124,10,160,3,124,6,161,1,1,0,87,0,110,34,4, 0,116,4,144,1,121,6,1,0,1,0,1,0,116,0,100, - 3,124,0,155,2,157,2,124,0,100,4,141,2,130,1,48, + 3,124,0,155,2,157,2,124,0,100,4,141,2,130,1,119, 0,124,10,160,5,124,4,161,1,125,15,116,6,124,15,131, 1,124,4,107,3,144,1,114,40,116,4,100,12,131,1,130, 1,87,0,100,0,4,0,4,0,131,3,1,0,110,18,49, - 0,144,1,115,62,48,0,1,0,1,0,1,0,89,0,1, + 0,144,1,115,62,119,1,1,0,1,0,1,0,89,0,1, 0,124,3,100,1,107,2,144,1,114,86,124,15,83,0,122, 10,116,9,131,0,125,16,87,0,110,24,4,0,116,10,144, 1,121,120,1,0,1,0,1,0,116,0,100,13,131,1,130, - 1,48,0,124,16,124,15,100,14,131,2,83,0,41,15,78, + 1,119,0,124,16,124,15,100,14,131,2,83,0,41,15,78, 114,0,0,0,0,122,18,110,101,103,97,116,105,118,101,32, 100,97,116,97,32,115,105,122,101,114,94,0,0,0,114,12, 0,0,0,114,106,0,0,0,114,100,0,0,0,114,95,0, @@ -839,7 +839,7 @@ const unsigned char _Py_M__zipimport[] = { 0,124,3,124,2,100,1,156,2,125,5,122,18,116,0,160, 1,124,4,124,3,124,5,161,3,125,6,87,0,110,20,4, 0,116,2,121,48,1,0,1,0,1,0,89,0,100,0,83, - 0,48,0,124,6,100,2,64,0,100,3,107,3,125,7,124, + 0,119,0,124,6,100,2,64,0,100,3,107,3,125,7,124, 7,114,182,124,6,100,4,64,0,100,3,107,3,125,8,116, 3,106,4,100,5,107,3,144,1,114,10,124,8,115,106,116, 3,106,4,100,6,107,2,144,1,114,10,116,5,124,0,124, @@ -847,7 +847,7 @@ const unsigned char _Py_M__zipimport[] = { 3,160,6,116,0,106,7,124,9,161,2,125,10,122,20,116, 0,160,8,124,4,124,10,124,3,124,5,161,4,1,0,87, 0,110,104,4,0,116,2,121,180,1,0,1,0,1,0,89, - 0,100,0,83,0,48,0,116,9,124,0,124,2,131,2,92, + 0,100,0,83,0,119,0,116,9,124,0,124,2,131,2,92, 2,125,11,125,12,124,11,144,1,114,10,116,10,116,11,124, 4,100,7,100,8,133,2,25,0,131,1,124,11,131,2,114, 246,116,11,124,4,100,8,100,9,133,2,25,0,131,1,124, @@ -936,7 +936,7 @@ const unsigned char _Py_M__zipimport[] = { 100,4,25,0,125,4,124,2,100,5,25,0,125,5,116,1, 124,4,124,3,131,2,124,5,102,2,87,0,83,0,4,0, 116,2,116,3,116,4,102,3,121,108,1,0,1,0,1,0, - 89,0,100,6,83,0,48,0,41,7,78,114,14,0,0,0, + 89,0,100,6,83,0,119,0,41,7,78,114,14,0,0,0, 169,2,218,1,99,218,1,111,114,165,0,0,0,233,6,0, 0,0,233,3,0,0,0,41,2,114,0,0,0,0,114,0, 0,0,0,41,5,114,28,0,0,0,114,171,0,0,0,114, @@ -953,7 +953,7 @@ const unsigned char _Py_M__zipimport[] = { 2,25,0,100,2,118,0,115,20,74,0,130,1,124,1,100, 0,100,1,133,2,25,0,125,1,122,14,124,0,106,0,124, 1,25,0,125,2,87,0,110,20,4,0,116,1,121,66,1, - 0,1,0,1,0,89,0,100,0,83,0,48,0,116,2,124, + 0,1,0,1,0,89,0,100,0,83,0,119,0,116,2,124, 0,106,3,124,2,131,2,83,0,41,3,78,114,14,0,0, 0,114,172,0,0,0,41,4,114,28,0,0,0,114,26,0, 0,0,114,56,0,0,0,114,29,0,0,0,41,3,114,32, @@ -968,7 +968,7 @@ const unsigned char _Py_M__zipimport[] = { 3,100,1,124,0,106,4,116,5,124,6,100,2,100,3,141, 5,1,0,122,14,124,0,106,6,124,6,25,0,125,7,87, 0,110,18,4,0,116,7,121,86,1,0,1,0,1,0,89, - 0,113,14,48,0,124,7,100,4,25,0,125,8,116,8,124, + 0,113,14,119,0,124,7,100,4,25,0,125,8,116,8,124, 0,106,4,124,7,131,2,125,9,124,4,114,130,116,9,124, 0,124,8,124,6,124,1,124,9,131,5,125,10,110,10,116, 10,124,8,124,9,131,2,125,10,124,10,100,0,117,0,114, diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index 538fdbe3e0b5ae..8495871e21313a 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -47,7 +47,7 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&TARGET_RERAISE, + &&_unknown_opcode, &&TARGET_WITH_EXCEPT_START, &&TARGET_GET_AITER, &&TARGET_GET_ANEXT, @@ -118,7 +118,7 @@ static void *opcode_targets[256] = { &&TARGET_LOAD_GLOBAL, &&TARGET_IS_OP, &&TARGET_CONTAINS_OP, - &&_unknown_opcode, + &&TARGET_RERAISE, &&_unknown_opcode, &&TARGET_JUMP_IF_NOT_EXC_MATCH, &&TARGET_SETUP_FINALLY, From c7d9d371d90f533b71b5c6c8ce8ff2306049ca2a Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Thu, 17 Dec 2020 14:25:55 -0300 Subject: [PATCH 0817/1261] [doc] Fix a few margins due to bad markup (GH-23619) --- Doc/library/dialog.rst | 2 +- Doc/library/enum.rst | 2 +- Doc/library/logging.config.rst | 78 +++++++++++++++++----------------- Doc/library/os.rst | 12 +++--- Doc/library/platform.rst | 2 +- Doc/library/profile.rst | 6 +-- Doc/library/socket.rst | 10 ++--- Doc/library/symtable.rst | 2 +- Doc/library/trace.rst | 50 +++++++++++----------- Doc/library/turtle.rst | 12 +++--- Doc/reference/datamodel.rst | 1 - 11 files changed, 88 insertions(+), 89 deletions(-) diff --git a/Doc/library/dialog.rst b/Doc/library/dialog.rst index dc82a974ce095d..53f98c1018988f 100644 --- a/Doc/library/dialog.rst +++ b/Doc/library/dialog.rst @@ -198,7 +198,7 @@ These do not emulate the native look-and-feel of the platform. A subclass of FileDialog that creates a dialog window for selecting a destination file. - .. method:: ok_command() + .. method:: ok_command() Test whether or not the selection points to a valid file that is not a directory. Confirmation is required if an already existing file is diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index a0b078c971706b..c532e2caec466c 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -61,7 +61,7 @@ helper, :class:`auto`. the bitwise operations without losing their :class:`Flag` membership. .. function:: unique - :noindex: + :noindex: Enum class decorator that ensures only one name is bound to any one value. diff --git a/Doc/library/logging.config.rst b/Doc/library/logging.config.rst index 683d6ed5e8ba52..0b5e2fc2a658d5 100644 --- a/Doc/library/logging.config.rst +++ b/Doc/library/logging.config.rst @@ -35,45 +35,45 @@ in :mod:`logging` itself) and defining handlers which are declared either in .. function:: dictConfig(config) - Takes the logging configuration from a dictionary. The contents of - this dictionary are described in :ref:`logging-config-dictschema` - below. - - If an error is encountered during configuration, this function will - raise a :exc:`ValueError`, :exc:`TypeError`, :exc:`AttributeError` - or :exc:`ImportError` with a suitably descriptive message. The - following is a (possibly incomplete) list of conditions which will - raise an error: - - * A ``level`` which is not a string or which is a string not - corresponding to an actual logging level. - * A ``propagate`` value which is not a boolean. - * An id which does not have a corresponding destination. - * A non-existent handler id found during an incremental call. - * An invalid logger name. - * Inability to resolve to an internal or external object. - - Parsing is performed by the :class:`DictConfigurator` class, whose - constructor is passed the dictionary used for configuration, and - has a :meth:`configure` method. The :mod:`logging.config` module - has a callable attribute :attr:`dictConfigClass` - which is initially set to :class:`DictConfigurator`. - You can replace the value of :attr:`dictConfigClass` with a - suitable implementation of your own. - - :func:`dictConfig` calls :attr:`dictConfigClass` passing - the specified dictionary, and then calls the :meth:`configure` method on - the returned object to put the configuration into effect:: - - def dictConfig(config): - dictConfigClass(config).configure() - - For example, a subclass of :class:`DictConfigurator` could call - ``DictConfigurator.__init__()`` in its own :meth:`__init__()`, then - set up custom prefixes which would be usable in the subsequent - :meth:`configure` call. :attr:`dictConfigClass` would be bound to - this new subclass, and then :func:`dictConfig` could be called exactly as - in the default, uncustomized state. + Takes the logging configuration from a dictionary. The contents of + this dictionary are described in :ref:`logging-config-dictschema` + below. + + If an error is encountered during configuration, this function will + raise a :exc:`ValueError`, :exc:`TypeError`, :exc:`AttributeError` + or :exc:`ImportError` with a suitably descriptive message. The + following is a (possibly incomplete) list of conditions which will + raise an error: + + * A ``level`` which is not a string or which is a string not + corresponding to an actual logging level. + * A ``propagate`` value which is not a boolean. + * An id which does not have a corresponding destination. + * A non-existent handler id found during an incremental call. + * An invalid logger name. + * Inability to resolve to an internal or external object. + + Parsing is performed by the :class:`DictConfigurator` class, whose + constructor is passed the dictionary used for configuration, and + has a :meth:`configure` method. The :mod:`logging.config` module + has a callable attribute :attr:`dictConfigClass` + which is initially set to :class:`DictConfigurator`. + You can replace the value of :attr:`dictConfigClass` with a + suitable implementation of your own. + + :func:`dictConfig` calls :attr:`dictConfigClass` passing + the specified dictionary, and then calls the :meth:`configure` method on + the returned object to put the configuration into effect:: + + def dictConfig(config): + dictConfigClass(config).configure() + + For example, a subclass of :class:`DictConfigurator` could call + ``DictConfigurator.__init__()`` in its own :meth:`__init__()`, then + set up custom prefixes which would be usable in the subsequent + :meth:`configure` call. :attr:`dictConfigClass` would be bound to + this new subclass, and then :func:`dictConfig` could be called exactly as + in the default, uncustomized state. .. versionadded:: 3.2 diff --git a/Doc/library/os.rst b/Doc/library/os.rst index ab1a615b6ea2a4..35cf7c0a0ba5c3 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1323,12 +1323,12 @@ or `the MSDN `_ on Windo .. data:: RWF_APPEND - Provide a per-write equivalent of the :data:`O_APPEND` :func:`os.open` - flag. This flag is meaningful only for :func:`os.pwritev`, and its - effect applies only to the data range written by the system call. The - *offset* argument does not affect the write operation; the data is always - appended to the end of the file. However, if the *offset* argument is - ``-1``, the current file *offset* is updated. + Provide a per-write equivalent of the :data:`O_APPEND` :func:`os.open` + flag. This flag is meaningful only for :func:`os.pwritev`, and its + effect applies only to the data range written by the system call. The + *offset* argument does not affect the write operation; the data is always + appended to the end of the file. However, if the *offset* argument is + ``-1``, the current file *offset* is updated. .. availability:: Linux 4.16 and newer. diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index fc51b5de881cc4..be86e568c180ba 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -290,4 +290,4 @@ Linux Platforms ids.extend(info["ID_LIKE"].split()) return ids - .. versionadded:: 3.10 + .. versionadded:: 3.10 diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index 7edabfde0d7f18..774d46d0e96247 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -532,9 +532,9 @@ Analysis of the profiler data is done using the :class:`~pstats.Stats` class. instance holds information related to the function's profile such as how long the function took to run, how many times it was called, etc... - .. versionadded:: 3.9 - Added the following dataclasses: StatsProfile, FunctionProfile. - Added the following function: get_stats_profile. + .. versionadded:: 3.9 + Added the following dataclasses: StatsProfile, FunctionProfile. + Added the following function: get_stats_profile. .. _deterministic-profiling: diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index d52b84f610ed67..4511ff9ea4a51a 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -56,12 +56,12 @@ created. Socket addresses are represented as follows: bytes-like object can be used for either type of address when passing it as an argument. - .. versionchanged:: 3.3 - Previously, :const:`AF_UNIX` socket paths were assumed to use UTF-8 - encoding. + .. versionchanged:: 3.3 + Previously, :const:`AF_UNIX` socket paths were assumed to use UTF-8 + encoding. - .. versionchanged:: 3.5 - Writable :term:`bytes-like object` is now accepted. + .. versionchanged:: 3.5 + Writable :term:`bytes-like object` is now accepted. .. _host_port: diff --git a/Doc/library/symtable.rst b/Doc/library/symtable.rst index c9521d649b893e..40c1795b083a2a 100644 --- a/Doc/library/symtable.rst +++ b/Doc/library/symtable.rst @@ -156,7 +156,7 @@ Examining Symbol Tables Return ``True`` if the symbol is local to its block. - .. method:: is_annotated() + .. method:: is_annotated() Return ``True`` if the symbol is annotated. diff --git a/Doc/library/trace.rst b/Doc/library/trace.rst index c2732d900bc138..40cf198f1287d7 100644 --- a/Doc/library/trace.rst +++ b/Doc/library/trace.rst @@ -153,47 +153,47 @@ Programmatic Interface count information. *timing* enables a timestamp relative to when tracing was started to be displayed. - .. method:: run(cmd) + .. method:: run(cmd) - Execute the command and gather statistics from the execution with - the current tracing parameters. *cmd* must be a string or code object, - suitable for passing into :func:`exec`. + Execute the command and gather statistics from the execution with + the current tracing parameters. *cmd* must be a string or code object, + suitable for passing into :func:`exec`. - .. method:: runctx(cmd, globals=None, locals=None) + .. method:: runctx(cmd, globals=None, locals=None) - Execute the command and gather statistics from the execution with the - current tracing parameters, in the defined global and local - environments. If not defined, *globals* and *locals* default to empty - dictionaries. + Execute the command and gather statistics from the execution with the + current tracing parameters, in the defined global and local + environments. If not defined, *globals* and *locals* default to empty + dictionaries. - .. method:: runfunc(func, /, *args, **kwds) + .. method:: runfunc(func, /, *args, **kwds) - Call *func* with the given arguments under control of the :class:`Trace` - object with the current tracing parameters. + Call *func* with the given arguments under control of the :class:`Trace` + object with the current tracing parameters. - .. method:: results() + .. method:: results() - Return a :class:`CoverageResults` object that contains the cumulative - results of all previous calls to ``run``, ``runctx`` and ``runfunc`` - for the given :class:`Trace` instance. Does not reset the accumulated - trace results. + Return a :class:`CoverageResults` object that contains the cumulative + results of all previous calls to ``run``, ``runctx`` and ``runfunc`` + for the given :class:`Trace` instance. Does not reset the accumulated + trace results. .. class:: CoverageResults A container for coverage results, created by :meth:`Trace.results`. Should not be created directly by the user. - .. method:: update(other) + .. method:: update(other) - Merge in data from another :class:`CoverageResults` object. + Merge in data from another :class:`CoverageResults` object. - .. method:: write_results(show_missing=True, summary=False, coverdir=None) + .. method:: write_results(show_missing=True, summary=False, coverdir=None) - Write coverage results. Set *show_missing* to show lines that had no - hits. Set *summary* to include in the output the coverage summary per - module. *coverdir* specifies the directory into which the coverage - result files will be output. If ``None``, the results for each source - file are placed in its directory. + Write coverage results. Set *show_missing* to show lines that had no + hits. Set *summary* to include in the output the coverage summary per + module. *coverdir* specifies the directory into which the coverage + result files will be output. If ``None``, the results for each source + file are placed in its directory. A simple example demonstrating the use of the programmatic interface:: diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index d3487537df99a9..2084d75b3a57a0 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -913,8 +913,8 @@ Color control Set pencolor to the RGB color represented by *r*, *g*, and *b*. Each of *r*, *g*, and *b* must be in the range 0..colormode. - If turtleshape is a polygon, the outline of that polygon is drawn with the - newly set pencolor. + If turtleshape is a polygon, the outline of that polygon is drawn with the + newly set pencolor. .. doctest:: :skipif: _tkinter is None @@ -962,8 +962,8 @@ Color control Set fillcolor to the RGB color represented by *r*, *g*, and *b*. Each of *r*, *g*, and *b* must be in the range 0..colormode. - If turtleshape is a polygon, the interior of that polygon is drawn - with the newly set fillcolor. + If turtleshape is a polygon, the interior of that polygon is drawn + with the newly set fillcolor. .. doctest:: :skipif: _tkinter is None @@ -1001,8 +1001,8 @@ Color control Equivalent to ``pencolor(colorstring1)`` and ``fillcolor(colorstring2)`` and analogously if the other input format is used. - If turtleshape is a polygon, outline and interior of that polygon is drawn - with the newly set colors. + If turtleshape is a polygon, outline and interior of that polygon is drawn + with the newly set colors. .. doctest:: :skipif: _tkinter is None diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index c882301ad3a4af..62f852953623c1 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -217,7 +217,6 @@ Ellipsis There are two types of integers: Integers (:class:`int`) - These represent numbers in an unlimited range, subject to available (virtual) memory only. For the purpose of shift and mask operations, a binary representation is assumed, and negative numbers are represented in a variant of From c55135a15cab139349f3e763ba49651a5d46d6f8 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Fri, 18 Dec 2020 03:22:29 +0800 Subject: [PATCH 0818/1261] bpo-31904: posixpath.expanduser() handles None user home on VxWorks (GH-23530) --- Lib/posixpath.py | 3 +++ .../next/Library/2020-11-27-18-09-59.bpo-31904.g8k43d.rst | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-11-27-18-09-59.bpo-31904.g8k43d.rst diff --git a/Lib/posixpath.py b/Lib/posixpath.py index ecb4e5a8f7072c..62afbd0ccf0f0f 100644 --- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -262,6 +262,9 @@ def expanduser(path): # password database, return the path unchanged return path userhome = pwent.pw_dir + # if no user home, return the path unchanged on VxWorks + if userhome is None and sys.platform == "vxworks": + return path if isinstance(path, bytes): userhome = os.fsencode(userhome) root = b'/' diff --git a/Misc/NEWS.d/next/Library/2020-11-27-18-09-59.bpo-31904.g8k43d.rst b/Misc/NEWS.d/next/Library/2020-11-27-18-09-59.bpo-31904.g8k43d.rst new file mode 100644 index 00000000000000..5a687d1eb32deb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-27-18-09-59.bpo-31904.g8k43d.rst @@ -0,0 +1,2 @@ +:func:`posixpath.expanduser` returns the input *path* unchanged if +user home directory is None on VxWorks. From 001bf08b3450ce0abe8026551f80ba07aae42b16 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Thu, 17 Dec 2020 13:24:43 -0700 Subject: [PATCH 0819/1261] bpo-42670: Fix a missing word in the itertools.product() docs (GH-23823) --- Doc/library/itertools.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 44728b42287bce..612a66f25371dc 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -582,7 +582,7 @@ loops that truncate the stream. Before :func:`product` runs, it completely consumes the input iterables, keeping pools of values in memory to generate the products. Accordingly, - it only useful with finite inputs. + it is only useful with finite inputs. .. function:: repeat(object[, times]) From 5edbf4c6058fe984c06fdb90e1134a927dcbb322 Mon Sep 17 00:00:00 2001 From: Max Bernstein Date: Thu, 17 Dec 2020 16:30:29 -0800 Subject: [PATCH 0820/1261] bpo-42199: Fix bytecode_helper assertNotInBytecode (#23031) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * bpo-42199: Fix bytecode_helper assertNotInBytecode Add tests. * 📜🤖 Added by blurb_it. Co-authored-by: Dino Viehland Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- Lib/test/support/bytecode_helper.py | 3 ++- Lib/test/test_dis.py | 19 +++++++++++++++++++ .../2020-10-29-21-26-46.bpo-42199.KksGCV.rst | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-10-29-21-26-46.bpo-42199.KksGCV.rst diff --git a/Lib/test/support/bytecode_helper.py b/Lib/test/support/bytecode_helper.py index 348e277c165882..471d4a68f915aa 100644 --- a/Lib/test/support/bytecode_helper.py +++ b/Lib/test/support/bytecode_helper.py @@ -35,7 +35,8 @@ def assertNotInBytecode(self, x, opname, argval=_UNSPECIFIED): disassembly = self.get_disassembly_as_string(x) if argval is _UNSPECIFIED: msg = '%s occurs in bytecode:\n%s' % (opname, disassembly) + self.fail(msg) elif instr.argval == argval: msg = '(%s,%r) occurs in bytecode:\n%s' msg = msg % (opname, argval, disassembly) - self.fail(msg) + self.fail(msg) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 786744923eb461..d5d815dc5dc55a 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1212,5 +1212,24 @@ def test_from_traceback_dis(self): b = dis.Bytecode.from_traceback(tb) self.assertEqual(b.dis(), dis_traceback) + +class TestBytecodeTestCase(BytecodeTestCase): + def test_assert_not_in_with_op_not_in_bytecode(self): + code = compile("a = 1", "", "exec") + self.assertInBytecode(code, "LOAD_CONST", 1) + self.assertNotInBytecode(code, "LOAD_NAME") + self.assertNotInBytecode(code, "LOAD_NAME", "a") + + def test_assert_not_in_with_arg_not_in_bytecode(self): + code = compile("a = 1", "", "exec") + self.assertInBytecode(code, "LOAD_CONST") + self.assertInBytecode(code, "LOAD_CONST", 1) + self.assertNotInBytecode(code, "LOAD_CONST", 2) + + def test_assert_not_in_with_arg_in_bytecode(self): + code = compile("a = 1", "", "exec") + with self.assertRaises(AssertionError): + self.assertNotInBytecode(code, "LOAD_CONST", 1) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Tests/2020-10-29-21-26-46.bpo-42199.KksGCV.rst b/Misc/NEWS.d/next/Tests/2020-10-29-21-26-46.bpo-42199.KksGCV.rst new file mode 100644 index 00000000000000..4426f336368bfc --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-10-29-21-26-46.bpo-42199.KksGCV.rst @@ -0,0 +1 @@ +Fix bytecode helper assertNotInBytecode. \ No newline at end of file From f0913031de2d6e606479d6de7854514829237d4a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 18 Dec 2020 01:39:00 +0100 Subject: [PATCH 0821/1261] bpo-1635741: Port _thread to multiphase init (GH-23811) Port the _thread extension module to the multiphase initialization API (PEP 489) and convert its static types to heap types. Add a traverse function to the lock type, so the garbage collector can break reference cycles. --- ...2020-12-16-23-28-52.bpo-1635741.Quy3zn.rst | 2 + Modules/_threadmodule.c | 311 +++++++++++++----- 2 files changed, 223 insertions(+), 90 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-16-23-28-52.bpo-1635741.Quy3zn.rst diff --git a/Misc/NEWS.d/next/Library/2020-12-16-23-28-52.bpo-1635741.Quy3zn.rst b/Misc/NEWS.d/next/Library/2020-12-16-23-28-52.bpo-1635741.Quy3zn.rst new file mode 100644 index 00000000000000..3412c204b05ca3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-16-23-28-52.bpo-1635741.Quy3zn.rst @@ -0,0 +1,2 @@ +Port the :mod:`_thread` extension module to the multiphase initialization +API (:pep:`489`) and convert its static types to heap types. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index bd4331c6108bd8..9b8757715a0b9b 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -7,6 +7,7 @@ #include "pycore_interp.h" // _PyInterpreterState.num_threads #include "pycore_pystate.h" // _PyThreadState_Init() #include // offsetof() +#include "structmember.h" // PyMemberDef // ThreadError is just an alias to PyExc_RuntimeError #define ThreadError PyExc_RuntimeError @@ -17,6 +18,25 @@ _Py_IDENTIFIER(stderr); _Py_IDENTIFIER(flush); +// Forward declarations +static struct PyModuleDef thread_module; + + +typedef struct { + PyTypeObject *lock_type; + PyTypeObject *local_type; + PyTypeObject *local_dummy_type; +} thread_module_state; + +static inline thread_module_state* +get_thread_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (thread_module_state *)state; +} + + /* Lock objects */ typedef struct { @@ -26,6 +46,13 @@ typedef struct { char locked; /* for sanity checking */ } lockobject; +static int +lock_traverse(lockobject *self, visitproc visit, void *arg) +{ + Py_VISIT(Py_TYPE(self)); + return 0; +} + static void lock_dealloc(lockobject *self) { @@ -38,7 +65,9 @@ lock_dealloc(lockobject *self) PyThread_release_lock(self->lock_lock); PyThread_free_lock(self->lock_lock); } - PyObject_Free(self); + PyTypeObject *tp = Py_TYPE(self); + tp->tp_free((PyObject*)self); + Py_DECREF(tp); } /* Helper to acquire an interruptible lock with a timeout. If the lock acquire @@ -260,16 +289,26 @@ A lock is not owned by the thread that locked it; another thread may\n\ unlock it. A thread attempting to lock a lock that it has already locked\n\ will block until another thread unlocks it. Deadlocks may ensue."); -static PyTypeObject Locktype = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - .tp_name = "_thread.lock", - .tp_basicsize = sizeof(lockobject), - .tp_dealloc = (destructor)lock_dealloc, - .tp_repr = (reprfunc)lock_repr, - .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = lock_doc, - .tp_weaklistoffset = offsetof(lockobject, in_weakreflist), - .tp_methods = lock_methods, +static PyMemberDef lock_type_members[] = { + {"__weaklistoffset__", T_PYSSIZET, offsetof(lockobject, in_weakreflist), READONLY}, + {NULL}, +}; + +static PyType_Slot lock_type_slots[] = { + {Py_tp_dealloc, (destructor)lock_dealloc}, + {Py_tp_repr, (reprfunc)lock_repr}, + {Py_tp_doc, (void *)lock_doc}, + {Py_tp_methods, lock_methods}, + {Py_tp_traverse, lock_traverse}, + {Py_tp_members, lock_type_members}, + {0, 0} +}; + +static PyType_Spec lock_type_spec = { + .name = "_thread.lock", + .basicsize = sizeof(lockobject), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .slots = lock_type_slots, }; /* Recursive lock objects */ @@ -296,7 +335,9 @@ rlock_dealloc(rlockobject *self) PyThread_free_lock(self->rlock_lock); } - Py_TYPE(self)->tp_free(self); + PyTypeObject *tp = Py_TYPE(self); + tp->tp_free(self); + Py_DECREF(tp); } static PyObject * @@ -520,23 +561,35 @@ static PyMethodDef rlock_methods[] = { }; -static PyTypeObject RLocktype = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - .tp_name = "_thread.RLock", - .tp_basicsize = sizeof(rlockobject), - .tp_dealloc = (destructor)rlock_dealloc, - .tp_repr = (reprfunc)rlock_repr, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_weaklistoffset = offsetof(rlockobject, in_weakreflist), - .tp_methods = rlock_methods, - .tp_alloc = PyType_GenericAlloc, - .tp_new = rlock_new, +static PyMemberDef rlock_type_members[] = { + {"__weaklistoffset__", T_PYSSIZET, offsetof(rlockobject, in_weakreflist), READONLY}, + {NULL}, +}; + +static PyType_Slot rlock_type_slots[] = { + {Py_tp_dealloc, (destructor)rlock_dealloc}, + {Py_tp_repr, (reprfunc)rlock_repr}, + {Py_tp_methods, rlock_methods}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_new, rlock_new}, + {Py_tp_members, rlock_type_members}, + {0, 0}, +}; + +static PyType_Spec rlock_type_spec = { + .name = "_thread.RLock", + .basicsize = sizeof(rlockobject), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .slots = rlock_type_slots, }; static lockobject * -newlockobject(void) +newlockobject(PyObject *module) { - lockobject *self = PyObject_New(lockobject, &Locktype); + thread_module_state *state = get_thread_state(module); + + PyTypeObject *type = state->lock_type; + lockobject *self = (lockobject *)type->tp_alloc(type, 0); if (self == NULL) { return NULL; } @@ -605,17 +658,28 @@ localdummy_dealloc(localdummyobject *self) { if (self->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) self); - Py_TYPE(self)->tp_free((PyObject*)self); + PyTypeObject *tp = Py_TYPE(self); + tp->tp_free((PyObject*)self); + Py_DECREF(tp); } -static PyTypeObject localdummytype = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "_thread._localdummy", - .tp_basicsize = sizeof(localdummyobject), - .tp_dealloc = (destructor)localdummy_dealloc, - .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = "Thread-local dummy", - .tp_weaklistoffset = offsetof(localdummyobject, weakreflist), +static PyMemberDef local_dummy_type_members[] = { + {"__weaklistoffset__", T_PYSSIZET, offsetof(localdummyobject, weakreflist), READONLY}, + {NULL}, +}; + +static PyType_Slot local_dummy_type_slots[] = { + {Py_tp_dealloc, (destructor)localdummy_dealloc}, + {Py_tp_doc, "Thread-local dummy"}, + {Py_tp_members, local_dummy_type_members}, + {0, 0} +}; + +static PyType_Spec local_dummy_type_spec = { + .name = "_thread._localdummy", + .basicsize = sizeof(localdummyobject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = local_dummy_type_slots, }; @@ -632,16 +696,17 @@ typedef struct { } localobject; /* Forward declaration */ -static PyObject *_ldict(localobject *self); +static PyObject *_ldict(localobject *self, thread_module_state *state); static PyObject *_localdummy_destroyed(PyObject *meth_self, PyObject *dummyweakref); /* Create and register the dummy for the current thread. Returns a borrowed reference of the corresponding local dict */ static PyObject * -_local_create_dummy(localobject *self) +_local_create_dummy(localobject *self, thread_module_state *state) { PyObject *ldict = NULL, *wr = NULL; localdummyobject *dummy = NULL; + PyTypeObject *type = state->local_dummy_type; PyObject *tdict = PyThreadState_GetDict(); if (tdict == NULL) { @@ -654,7 +719,7 @@ _local_create_dummy(localobject *self) if (ldict == NULL) { goto err; } - dummy = (localdummyobject *) localdummytype.tp_alloc(&localdummytype, 0); + dummy = (localdummyobject *) type->tp_alloc(type, 0); if (dummy == NULL) { goto err; } @@ -690,7 +755,6 @@ _local_create_dummy(localobject *self) static PyObject * local_new(PyTypeObject *type, PyObject *args, PyObject *kw) { - localobject *self; static PyMethodDef wr_callback_def = { "_localdummy_destroyed", (PyCFunction) _localdummy_destroyed, METH_O }; @@ -710,7 +774,10 @@ local_new(PyTypeObject *type, PyObject *args, PyObject *kw) } } - self = (localobject *)type->tp_alloc(type, 0); + PyObject *module = _PyType_GetModuleByDef(type, &thread_module); + thread_module_state *state = get_thread_state(module); + + localobject *self = (localobject *)type->tp_alloc(type, 0); if (self == NULL) { return NULL; } @@ -738,7 +805,7 @@ local_new(PyTypeObject *type, PyObject *args, PyObject *kw) if (self->wr_callback == NULL) { goto err; } - if (_local_create_dummy(self) == NULL) { + if (_local_create_dummy(self, state) == NULL) { goto err; } return (PyObject *)self; @@ -751,6 +818,7 @@ local_new(PyTypeObject *type, PyObject *args, PyObject *kw) static int local_traverse(localobject *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(self->args); Py_VISIT(self->kw); Py_VISIT(self->dummies); @@ -798,12 +866,15 @@ local_dealloc(localobject *self) local_clear(self); Py_XDECREF(self->key); - Py_TYPE(self)->tp_free((PyObject*)self); + + PyTypeObject *tp = Py_TYPE(self); + tp->tp_free((PyObject*)self); + Py_DECREF(tp); } /* Returns a borrowed reference to the local dict, creating it if necessary */ static PyObject * -_ldict(localobject *self) +_ldict(localobject *self, thread_module_state *state) { PyObject *tdict = PyThreadState_GetDict(); if (tdict == NULL) { @@ -818,7 +889,7 @@ _ldict(localobject *self) if (PyErr_Occurred()) { return NULL; } - ldict = _local_create_dummy(self); + ldict = _local_create_dummy(self, state); if (ldict == NULL) return NULL; @@ -833,7 +904,7 @@ _ldict(localobject *self) } } else { - assert(Py_IS_TYPE(dummy, &localdummytype)); + assert(Py_IS_TYPE(dummy, state->local_dummy_type)); ldict = ((localdummyobject *) dummy)->localdict; } @@ -843,7 +914,10 @@ _ldict(localobject *self) static int local_setattro(localobject *self, PyObject *name, PyObject *v) { - PyObject *ldict = _ldict(self); + PyObject *module = _PyType_GetModuleByDef(Py_TYPE(self), &thread_module); + thread_module_state *state = get_thread_state(module); + + PyObject *ldict = _ldict(self, state); if (ldict == NULL) { return -1; } @@ -869,25 +943,37 @@ local_setattro(localobject *self, PyObject *name, PyObject *v) static PyObject *local_getattro(localobject *, PyObject *); -static PyTypeObject localtype = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "_thread._local", - .tp_basicsize = sizeof(localobject), - .tp_dealloc = (destructor)local_dealloc, - .tp_getattro = (getattrofunc)local_getattro, - .tp_setattro = (setattrofunc)local_setattro, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, - .tp_doc = "Thread-local data", - .tp_traverse = (traverseproc)local_traverse, - .tp_clear = (inquiry)local_clear, - .tp_weaklistoffset = offsetof(localobject, weakreflist), - .tp_new = local_new, +static PyMemberDef local_type_members[] = { + {"__weaklistoffset__", T_PYSSIZET, offsetof(localobject, weakreflist), READONLY}, + {NULL}, +}; + +static PyType_Slot local_type_slots[] = { + {Py_tp_dealloc, (destructor)local_dealloc}, + {Py_tp_getattro, (getattrofunc)local_getattro}, + {Py_tp_setattro, (setattrofunc)local_setattro}, + {Py_tp_doc, "Thread-local data"}, + {Py_tp_traverse, (traverseproc)local_traverse}, + {Py_tp_clear, (inquiry)local_clear}, + {Py_tp_new, local_new}, + {Py_tp_members, local_type_members}, + {0, 0} +}; + +static PyType_Spec local_type_spec = { + .name = "_thread._local", + .basicsize = sizeof(localobject), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + .slots = local_type_slots, }; static PyObject * local_getattro(localobject *self, PyObject *name) { - PyObject *ldict = _ldict(self); + PyObject *module = _PyType_GetModuleByDef(Py_TYPE(self), &thread_module); + thread_module_state *state = get_thread_state(module); + + PyObject *ldict = _ldict(self, state); if (ldict == NULL) return NULL; @@ -904,7 +990,7 @@ local_getattro(localobject *self, PyObject *name) return NULL; } - if (!Py_IS_TYPE(self, &localtype)) { + if (!Py_IS_TYPE(self, state->local_type)) { /* use generic lookup for subtypes */ return _PyObject_GenericGetAttrWithDict((PyObject *)self, name, ldict, 0); @@ -1101,12 +1187,12 @@ Raise a KeyboardInterrupt in the main thread.\n\ A subthread can use this function to interrupt the main thread." ); -static lockobject *newlockobject(void); +static lockobject *newlockobject(PyObject *module); static PyObject * thread_PyThread_allocate_lock(PyObject *module, PyObject *Py_UNUSED(ignored)) { - return (PyObject *) newlockobject(); + return (PyObject *) newlockobject(module); } PyDoc_STRVAR(allocate_doc, @@ -1210,7 +1296,7 @@ thread__set_sentinel(PyObject *module, PyObject *Py_UNUSED(ignored)) tstate->on_delete_data = NULL; Py_DECREF(wr); } - lock = newlockobject(); + lock = newlockobject(module); if (lock == NULL) return NULL; /* The lock is owned by whoever called _set_sentinel(), but the weakref @@ -1465,23 +1551,49 @@ static PyMethodDef thread_methods[] = { /* Initialization function */ static int -_thread_module_exec(PyObject *module) +thread_module_exec(PyObject *module) { + thread_module_state *state = get_thread_state(module); + PyObject *d = PyModule_GetDict(module); + // Initialize the C thread library PyThread_init_thread(); - // Initialize types - if (PyType_Ready(&localdummytype) < 0) + // Lock + state->lock_type = (PyTypeObject *)PyType_FromSpec(&lock_type_spec); + if (state->lock_type == NULL) { + return -1; + } + if (PyDict_SetItemString(d, "LockType", (PyObject *)state->lock_type) < 0) { + return -1; + } + + // RLock + PyTypeObject *rlock_type = (PyTypeObject *)PyType_FromSpec(&rlock_type_spec); + if (rlock_type == NULL) { + return -1; + } + if (PyModule_AddType(module, rlock_type) < 0) { + Py_DECREF(rlock_type); return -1; - if (PyType_Ready(&localtype) < 0) { + } + Py_DECREF(rlock_type); + + // Local dummy + state->local_dummy_type = (PyTypeObject *)PyType_FromSpec(&local_dummy_type_spec); + if (state->local_dummy_type == NULL) { return -1; } - if (PyType_Ready(&Locktype) < 0) { + + // Local + state->local_type = (PyTypeObject *)PyType_FromModuleAndSpec(module, &local_type_spec, NULL); + if (state->local_type == NULL) { return -1; } - if (PyType_Ready(&RLocktype) < 0) { + if (PyModule_AddType(module, state->local_type) < 0) { return -1; } + if (ExceptHookArgsType.tp_name == NULL) { if (PyStructSequence_InitType2(&ExceptHookArgsType, &ExceptHookArgs_desc) < 0) { @@ -1490,19 +1602,9 @@ _thread_module_exec(PyObject *module) } // Add module attributes - PyObject *d = PyModule_GetDict(module); if (PyDict_SetItemString(d, "error", ThreadError) < 0) { return -1; } - if (PyDict_SetItemString(d, "LockType", (PyObject *)&Locktype) < 0) { - return -1; - } - if (PyModule_AddType(module, &RLocktype) < 0) { - return -1; - } - if (PyModule_AddType(module, &localtype) < 0) { - return -1; - } if (PyModule_AddType(module, &ExceptHookArgsType) < 0) { return -1; } @@ -1523,28 +1625,57 @@ _thread_module_exec(PyObject *module) } +static int +thread_module_traverse(PyObject *module, visitproc visit, void *arg) +{ + thread_module_state *state = get_thread_state(module); + Py_VISIT(state->lock_type); + Py_VISIT(state->local_type); + Py_VISIT(state->local_dummy_type); + return 0; +} + +static int +thread_module_clear(PyObject *module) +{ + thread_module_state *state = get_thread_state(module); + Py_CLEAR(state->lock_type); + Py_CLEAR(state->local_type); + Py_CLEAR(state->local_dummy_type); + return 0; +} + +static void +thread_module_free(void *module) +{ + thread_module_clear((PyObject *)module); +} + + + PyDoc_STRVAR(thread_doc, "This module provides primitive operations to write multi-threaded programs.\n\ The 'threading' module provides a more convenient interface."); -static struct PyModuleDef _thread_module = { +static PyModuleDef_Slot thread_module_slots[] = { + {Py_mod_exec, thread_module_exec}, + {0, NULL} +}; + +static struct PyModuleDef thread_module = { PyModuleDef_HEAD_INIT, .m_name = "_thread", .m_doc = thread_doc, - .m_size = -1, + .m_size = sizeof(thread_module_state), .m_methods = thread_methods, + .m_traverse = thread_module_traverse, + .m_clear = thread_module_clear, + .m_free = thread_module_free, + .m_slots = thread_module_slots, }; PyMODINIT_FUNC PyInit__thread(void) { - PyObject *module = PyModule_Create(&_thread_module); - if (module == NULL) - return NULL; - - if (_thread_module_exec(module) < 0) { - Py_DECREF(module); - return NULL; - } - return module; + return PyModuleDef_Init(&thread_module); } From c71233eb55dae452ba85e67f1b0fcc7ceae84656 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Fri, 18 Dec 2020 09:24:06 +0000 Subject: [PATCH 0822/1261] bpo-39096: Format specification documentation fixes for numeric types (GH-23575) --- Doc/library/string.rst | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 5542e9b727a6b8..54786d0c2ab0df 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -514,6 +514,8 @@ The available presentation types for :class:`float` and | | this rounds the number to ``p`` significant digits and | | | then formats the result in either fixed-point format | | | or in scientific notation, depending on its magnitude. | + | | A precision of ``0`` is treated as equivalent to a | + | | precision of ``1``. | | | | | | The precise rules are as follows: suppose that the | | | result formatted with presentation type ``'e'`` and | @@ -528,16 +530,19 @@ The available presentation types for :class:`float` and | | removed if there are no remaining digits following it, | | | unless the ``'#'`` option is used. | | | | + | | With no precision given, uses a precision of ``6`` | + | | significant digits for :class:`float`. For | + | | :class:`~decimal.Decimal`, the coefficient of the result | + | | is formed from the coefficient digits of the value; | + | | scientific notation is used for values smaller than | + | | ``1e-6`` in absolute value and values where the place | + | | value of the least significant digit is larger than 1, | + | | and fixed-point notation is used otherwise. | + | | | | | Positive and negative infinity, positive and negative | | | zero, and nans, are formatted as ``inf``, ``-inf``, | | | ``0``, ``-0`` and ``nan`` respectively, regardless of | | | the precision. | - | | | - | | A precision of ``0`` is treated as equivalent to a | - | | precision of ``1``. With no precision given, uses a | - | | precision of ``6`` significant digits for | - | | :class:`float`, and shows all coefficient digits | - | | for :class:`~decimal.Decimal`. | +---------+----------------------------------------------------------+ | ``'G'`` | General format. Same as ``'g'`` except switches to | | | ``'E'`` if the number gets too large. The | @@ -550,12 +555,18 @@ The available presentation types for :class:`float` and | ``'%'`` | Percentage. Multiplies the number by 100 and displays | | | in fixed (``'f'``) format, followed by a percent sign. | +---------+----------------------------------------------------------+ - | None | Similar to ``'g'``, except that fixed-point notation, | - | | when used, has at least one digit past the decimal point.| - | | The default precision is as high as needed to represent | - | | the particular value. The overall effect is to match the | - | | output of :func:`str` as altered by the other format | - | | modifiers. | + | None | For :class:`float` this is the same as ``'g'``, except | + | | that when fixed-point notation is used to format the | + | | result, it always includes at least one digit past the | + | | decimal point. The precision used is as large as needed | + | | to represent the given value faithfully. | + | | | + | | For :class:`~decimal.Decimal`, this is the same as | + | | either ``'g'`` or ``'G'`` depending on the value of | + | | ``context.capitals`` for the current decimal context. | + | | | + | | The overall effect is to match the output of :func:`str` | + | | as altered by the other format modifiers. | +---------+----------------------------------------------------------+ From f017116da54cf8109162364c041bbde4628328a4 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Fri, 18 Dec 2020 10:48:08 +0100 Subject: [PATCH 0823/1261] bpo-42238: Check Misc/NEWS.d/next/ for reStructuredText issues. (GH-23802) --- Doc/Makefile | 1 + Doc/tools/rstlint.py | 76 +++++++++++++++++++ .../2020-11-20-00-57-47.bpo-42195.HeqcpS.rst | 15 ++-- .../2020-10-02-10-19-49.bpo-41907.wiIEsz.rst | 2 +- .../2020-12-08-22-43-35.bpo-42678.ba9ktU.rst | 2 +- .../2020-12-10-18-36-52.bpo-39717.sK2u0w.rst | 2 +- .../2020-12-15-10-00-04.bpo-42644.XgLCNx.rst | 4 +- 7 files changed, 89 insertions(+), 13 deletions(-) diff --git a/Doc/Makefile b/Doc/Makefile index c24c70c699a06a..f113dd06539869 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -202,6 +202,7 @@ dist: check: $(PYTHON) tools/rstlint.py -i tools -i $(VENVDIR) -i README.rst + $(PYTHON) tools/rstlint.py ../Misc/NEWS.d/next/ serve: $(PYTHON) ../Tools/scripts/serve.py build/html diff --git a/Doc/tools/rstlint.py b/Doc/tools/rstlint.py index a3024d6734d25b..cbcb8eb801b135 100755 --- a/Doc/tools/rstlint.py +++ b/Doc/tools/rstlint.py @@ -13,6 +13,7 @@ import re import sys import getopt +from string import ascii_letters from os.path import join, splitext, abspath, exists from collections import defaultdict @@ -128,6 +129,81 @@ def check_leaked_markup(fn, lines): yield lno+1, 'possibly leaked markup: %r' % line +def hide_literal_blocks(lines): + """Tool to remove literal blocks from given lines. + + It yields empty lines in place of blocks, so line numbers are + still meaningful. + """ + in_block = False + for line in lines: + if line.endswith("::\n"): + in_block = True + elif in_block: + if line == "\n" or line.startswith(" "): + line = "\n" + else: + in_block = False + yield line + + +def type_of_explicit_markup(line): + if re.match(fr'\.\. {all_directives}::', line): + return 'directive' + if re.match(r'\.\. \[[0-9]+\] ', line): + return 'footnote' + if re.match(r'\.\. \[[^\]]+\] ', line): + return 'citation' + if re.match(r'\.\. _.*[^_]: ', line): + return 'target' + if re.match(r'\.\. \|[^\|]*\| ', line): + return 'substitution_definition' + return 'comment' + + +def hide_comments(lines): + """Tool to remove comments from given lines. + + It yields empty lines in place of comments, so line numbers are + still meaningfull. + """ + in_multiline_comment = False + for line in lines: + if line == "..\n": + in_multiline_comment = True + elif in_multiline_comment: + if line == "\n" or line.startswith(" "): + line = "\n" + else: + in_multiline_comment = False + if line.startswith(".. ") and type_of_explicit_markup(line) == 'comment': + line = "\n" + yield line + + + +@checker(".rst", severity=2) +def check_missing_surrogate_space_on_plural(fn, lines): + r"""Check for missing 'backslash-space' between a code sample a letter. + + Good: ``Point``\ s + Bad: ``Point``s + """ + in_code_sample = False + check_next_one = False + for lno, line in enumerate(hide_comments(hide_literal_blocks(lines))): + tokens = line.split("``") + for token_no, token in enumerate(tokens): + if check_next_one: + if token[0] in ascii_letters: + yield lno + 1, f"Missing backslash-space between code sample and {token!r}." + check_next_one = False + if token_no == len(tokens) - 1: + continue + if in_code_sample: + check_next_one = True + in_code_sample = not in_code_sample + def main(argv): usage = '''\ Usage: %s [-v] [-f] [-s sev] [-i path]* [path] diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst index fec4b7f81cb45b..87e8c0e89b3b8f 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst @@ -1,11 +1,10 @@ The ``__args__`` of the parameterized generics for :data:`typing.Callable` -and :class:`collections.abc.Callable` are now consistent. The ``__args__`` -for :class:`collections.abc.Callable` are now flattened while -:data:`typing.Callable`'s have not changed. To allow this change, -:class:`types.GenericAlias` can now be subclassed and +and :class:`collections.abc.Callable` are now consistent. The ``__args__`` +for :class:`collections.abc.Callable` are now flattened while +:data:`typing.Callable`'s have not changed. To allow this change, +:class:`types.GenericAlias` can now be subclassed and ``collections.abc.Callable``'s ``__class_getitem__`` will now return a subclass -of ``types.GenericAlias``. Tests for typing were also updated to not subclass +of ``types.GenericAlias``. Tests for typing were also updated to not subclass things like ``Callable[..., T]`` as that is not a valid base class. Finally, -both ``Callable``\ s no longer validate their ``argtypes``, in -``Callable[[argtypes], resulttype]`` to prepare for :pep:`612`. Patch by Ken Jin. - +both ``Callable``\ s no longer validate their ``argtypes``, in +``Callable[[argtypes], resulttype]`` to prepare for :pep:`612`. Patch by Ken Jin. diff --git a/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst b/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst index aa337b38046e61..2c7b70d589d83c 100644 --- a/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst +++ b/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst @@ -1 +1 @@ -fix `format()` behavior for `IntFlag` +fix ``format()`` behavior for ``IntFlag`` diff --git a/Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst b/Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst index 7c94cdf40dd4cc..4b2ced5c148af7 100644 --- a/Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst +++ b/Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst @@ -1 +1 @@ -`Enum`: call `__init_subclass__` after members have been added +``Enum``: call ``__init_subclass__`` after members have been added diff --git a/Misc/NEWS.d/next/Library/2020-12-10-18-36-52.bpo-39717.sK2u0w.rst b/Misc/NEWS.d/next/Library/2020-12-10-18-36-52.bpo-39717.sK2u0w.rst index fcbf99925208b0..6f3691f591f2b1 100644 --- a/Misc/NEWS.d/next/Library/2020-12-10-18-36-52.bpo-39717.sK2u0w.rst +++ b/Misc/NEWS.d/next/Library/2020-12-10-18-36-52.bpo-39717.sK2u0w.rst @@ -1 +1 @@ -[tarfile] update nested exception raising to use `from None` or `from e` +[tarfile] update nested exception raising to use ``from None`` or ``from e`` diff --git a/Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst b/Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst index f58b58e4002ada..ee4d111dc349a9 100644 --- a/Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst +++ b/Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst @@ -1,3 +1,3 @@ -`logging.disable` will now validate the types and value of its parameter. It -also now accepts strings representing the levels (as does `loging.setLevel`) +``logging.disable`` will now validate the types and value of its parameter. It +also now accepts strings representing the levels (as does ``loging.setLevel``) instead of only the numerical values. From 730f273081a6f21c081bfcbb706cbca96d4dea74 Mon Sep 17 00:00:00 2001 From: Matt Wozniski Date: Fri, 18 Dec 2020 08:05:46 -0500 Subject: [PATCH 0824/1261] bpo-17140: Document multiprocessing's ThreadPool (GH-23812) Up until now, the `multiprocessing.pool.ThreadPool` class has gone undocumented, despite being a public class in multiprocessing that is included in `multiprocessing.pool.__all__`. --- Doc/library/multiprocessing.rst | 40 +++++++++++++++++++ .../2020-12-16-21-06-16.bpo-17140.1leSEg.rst | 1 + 2 files changed, 41 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 128aa43b8b76f4..e109b1ebe1cee4 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -2661,6 +2661,46 @@ The :mod:`multiprocessing.dummy` module :mod:`multiprocessing.dummy` replicates the API of :mod:`multiprocessing` but is no more than a wrapper around the :mod:`threading` module. +.. currentmodule:: multiprocessing.pool + +In particular, the ``Pool`` function provided by :mod:`multiprocessing.dummy` +returns an instance of :class:`ThreadPool`, which is a subclass of +:class:`Pool` that supports all the same method calls but uses a pool of +worker threads rather than worker processes. + + +.. class:: ThreadPool([processes[, initializer[, initargs]]]) + + A thread pool object which controls a pool of worker threads to which jobs + can be submitted. :class:`ThreadPool` instances are fully interface + compatible with :class:`Pool` instances, and their resources must also be + properly managed, either by using the pool as a context manager or by + calling :meth:`~multiprocessing.pool.Pool.close` and + :meth:`~multiprocessing.pool.Pool.terminate` manually. + + *processes* is the number of worker threads to use. If *processes* is + ``None`` then the number returned by :func:`os.cpu_count` is used. + + If *initializer* is not ``None`` then each worker process will call + ``initializer(*initargs)`` when it starts. + + Unlike :class:`Pool`, *maxtasksperchild* and *context* cannot be provided. + + .. note:: + + A :class:`ThreadPool` shares the same interface as :class:`Pool`, which + is designed around a pool of processes and predates the introduction of + the :class:`concurrent.futures` module. As such, it inherits some + operations that don't make sense for a pool backed by threads, and it + has its own type for representing the status of asynchronous jobs, + :class:`AsyncResult`, that is not understood by any other libraries. + + Users should generally prefer to use + :class:`concurrent.futures.ThreadPoolExecutor`, which has a simpler + interface that was designed around threads from the start, and which + returns :class:`concurrent.futures.Future` instances that are + compatible with many other libraries, including :mod:`asyncio`. + .. _multiprocessing-programming: diff --git a/Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst b/Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst new file mode 100644 index 00000000000000..cb1fd23a56e639 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst @@ -0,0 +1 @@ +Add documentation for the :class:`multiprocessing.pool.ThreadPool` class. From 7f94211af6b40b0b3c09c9e4b32a901cde7ea125 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Fri, 18 Dec 2020 15:25:35 +0100 Subject: [PATCH 0825/1261] bpo-40956: Convert _sqlite3.Connection to Argument Clinic (GH-23341) --- Modules/_sqlite/clinic/connection.c.h | 490 ++++++++++++++++++++++++++ Modules/_sqlite/connection.c | 344 +++++++++++------- Modules/_sqlite/connection.h | 3 - 3 files changed, 702 insertions(+), 135 deletions(-) create mode 100644 Modules/_sqlite/clinic/connection.c.h diff --git a/Modules/_sqlite/clinic/connection.c.h b/Modules/_sqlite/clinic/connection.c.h new file mode 100644 index 00000000000000..6b0ff4de4299e9 --- /dev/null +++ b/Modules/_sqlite/clinic/connection.c.h @@ -0,0 +1,490 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(pysqlite_connection_cursor__doc__, +"cursor($self, /, factory=)\n" +"--\n" +"\n" +"Return a cursor for the connection."); + +#define PYSQLITE_CONNECTION_CURSOR_METHODDEF \ + {"cursor", (PyCFunction)(void(*)(void))pysqlite_connection_cursor, METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_cursor__doc__}, + +static PyObject * +pysqlite_connection_cursor_impl(pysqlite_Connection *self, PyObject *factory); + +static PyObject * +pysqlite_connection_cursor(pysqlite_Connection *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"factory", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "cursor", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *factory = NULL; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + factory = args[0]; +skip_optional_pos: + return_value = pysqlite_connection_cursor_impl(self, factory); + +exit: + return return_value; +} + +PyDoc_STRVAR(pysqlite_connection_close__doc__, +"close($self, /)\n" +"--\n" +"\n" +"Closes the connection."); + +#define PYSQLITE_CONNECTION_CLOSE_METHODDEF \ + {"close", (PyCFunction)pysqlite_connection_close, METH_NOARGS, pysqlite_connection_close__doc__}, + +static PyObject * +pysqlite_connection_close_impl(pysqlite_Connection *self); + +static PyObject * +pysqlite_connection_close(pysqlite_Connection *self, PyObject *Py_UNUSED(ignored)) +{ + return pysqlite_connection_close_impl(self); +} + +PyDoc_STRVAR(pysqlite_connection_rollback__doc__, +"rollback($self, /)\n" +"--\n" +"\n" +"Roll back the current transaction."); + +#define PYSQLITE_CONNECTION_ROLLBACK_METHODDEF \ + {"rollback", (PyCFunction)pysqlite_connection_rollback, METH_NOARGS, pysqlite_connection_rollback__doc__}, + +static PyObject * +pysqlite_connection_rollback_impl(pysqlite_Connection *self); + +static PyObject * +pysqlite_connection_rollback(pysqlite_Connection *self, PyObject *Py_UNUSED(ignored)) +{ + return pysqlite_connection_rollback_impl(self); +} + +PyDoc_STRVAR(pysqlite_connection_create_function__doc__, +"create_function($self, /, name, narg, func, *, deterministic=False)\n" +"--\n" +"\n" +"Creates a new function. Non-standard."); + +#define PYSQLITE_CONNECTION_CREATE_FUNCTION_METHODDEF \ + {"create_function", (PyCFunction)(void(*)(void))pysqlite_connection_create_function, METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_create_function__doc__}, + +static PyObject * +pysqlite_connection_create_function_impl(pysqlite_Connection *self, + const char *name, int narg, + PyObject *func, int deterministic); + +static PyObject * +pysqlite_connection_create_function(pysqlite_Connection *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"name", "narg", "func", "deterministic", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "create_function", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; + const char *name; + int narg; + PyObject *func; + int deterministic = 0; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("create_function", "argument 'name'", "str", args[0]); + goto exit; + } + Py_ssize_t name_length; + name = PyUnicode_AsUTF8AndSize(args[0], &name_length); + if (name == NULL) { + goto exit; + } + if (strlen(name) != (size_t)name_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + narg = _PyLong_AsInt(args[1]); + if (narg == -1 && PyErr_Occurred()) { + goto exit; + } + func = args[2]; + if (!noptargs) { + goto skip_optional_kwonly; + } + deterministic = PyObject_IsTrue(args[3]); + if (deterministic < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = pysqlite_connection_create_function_impl(self, name, narg, func, deterministic); + +exit: + return return_value; +} + +PyDoc_STRVAR(pysqlite_connection_create_aggregate__doc__, +"create_aggregate($self, /, name, n_arg, aggregate_class)\n" +"--\n" +"\n" +"Creates a new aggregate. Non-standard."); + +#define PYSQLITE_CONNECTION_CREATE_AGGREGATE_METHODDEF \ + {"create_aggregate", (PyCFunction)(void(*)(void))pysqlite_connection_create_aggregate, METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_create_aggregate__doc__}, + +static PyObject * +pysqlite_connection_create_aggregate_impl(pysqlite_Connection *self, + const char *name, int n_arg, + PyObject *aggregate_class); + +static PyObject * +pysqlite_connection_create_aggregate(pysqlite_Connection *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"name", "n_arg", "aggregate_class", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "create_aggregate", 0}; + PyObject *argsbuf[3]; + const char *name; + int n_arg; + PyObject *aggregate_class; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("create_aggregate", "argument 'name'", "str", args[0]); + goto exit; + } + Py_ssize_t name_length; + name = PyUnicode_AsUTF8AndSize(args[0], &name_length); + if (name == NULL) { + goto exit; + } + if (strlen(name) != (size_t)name_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + n_arg = _PyLong_AsInt(args[1]); + if (n_arg == -1 && PyErr_Occurred()) { + goto exit; + } + aggregate_class = args[2]; + return_value = pysqlite_connection_create_aggregate_impl(self, name, n_arg, aggregate_class); + +exit: + return return_value; +} + +PyDoc_STRVAR(pysqlite_connection_set_authorizer__doc__, +"set_authorizer($self, /, authorizer_callback)\n" +"--\n" +"\n" +"Sets authorizer callback. Non-standard."); + +#define PYSQLITE_CONNECTION_SET_AUTHORIZER_METHODDEF \ + {"set_authorizer", (PyCFunction)(void(*)(void))pysqlite_connection_set_authorizer, METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_set_authorizer__doc__}, + +static PyObject * +pysqlite_connection_set_authorizer_impl(pysqlite_Connection *self, + PyObject *authorizer_cb); + +static PyObject * +pysqlite_connection_set_authorizer(pysqlite_Connection *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"authorizer_callback", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "set_authorizer", 0}; + PyObject *argsbuf[1]; + PyObject *authorizer_cb; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + authorizer_cb = args[0]; + return_value = pysqlite_connection_set_authorizer_impl(self, authorizer_cb); + +exit: + return return_value; +} + +PyDoc_STRVAR(pysqlite_connection_set_progress_handler__doc__, +"set_progress_handler($self, /, progress_handler, n)\n" +"--\n" +"\n" +"Sets progress handler callback. Non-standard."); + +#define PYSQLITE_CONNECTION_SET_PROGRESS_HANDLER_METHODDEF \ + {"set_progress_handler", (PyCFunction)(void(*)(void))pysqlite_connection_set_progress_handler, METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_set_progress_handler__doc__}, + +static PyObject * +pysqlite_connection_set_progress_handler_impl(pysqlite_Connection *self, + PyObject *progress_handler, + int n); + +static PyObject * +pysqlite_connection_set_progress_handler(pysqlite_Connection *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"progress_handler", "n", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "set_progress_handler", 0}; + PyObject *argsbuf[2]; + PyObject *progress_handler; + int n; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + progress_handler = args[0]; + n = _PyLong_AsInt(args[1]); + if (n == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = pysqlite_connection_set_progress_handler_impl(self, progress_handler, n); + +exit: + return return_value; +} + +PyDoc_STRVAR(pysqlite_connection_set_trace_callback__doc__, +"set_trace_callback($self, trace_callback, /)\n" +"--\n" +"\n" +"Sets a trace callback called for each SQL statement (passed as unicode).\n" +"\n" +"Non-standard."); + +#define PYSQLITE_CONNECTION_SET_TRACE_CALLBACK_METHODDEF \ + {"set_trace_callback", (PyCFunction)pysqlite_connection_set_trace_callback, METH_O, pysqlite_connection_set_trace_callback__doc__}, + +#if !defined(SQLITE_OMIT_LOAD_EXTENSION) + +PyDoc_STRVAR(pysqlite_connection_enable_load_extension__doc__, +"enable_load_extension($self, enable, /)\n" +"--\n" +"\n" +"Enable dynamic loading of SQLite extension modules. Non-standard."); + +#define PYSQLITE_CONNECTION_ENABLE_LOAD_EXTENSION_METHODDEF \ + {"enable_load_extension", (PyCFunction)pysqlite_connection_enable_load_extension, METH_O, pysqlite_connection_enable_load_extension__doc__}, + +static PyObject * +pysqlite_connection_enable_load_extension_impl(pysqlite_Connection *self, + int onoff); + +static PyObject * +pysqlite_connection_enable_load_extension(pysqlite_Connection *self, PyObject *arg) +{ + PyObject *return_value = NULL; + int onoff; + + onoff = _PyLong_AsInt(arg); + if (onoff == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = pysqlite_connection_enable_load_extension_impl(self, onoff); + +exit: + return return_value; +} + +#endif /* !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +#if !defined(SQLITE_OMIT_LOAD_EXTENSION) + +PyDoc_STRVAR(pysqlite_connection_load_extension__doc__, +"load_extension($self, name, /)\n" +"--\n" +"\n" +"Load SQLite extension module. Non-standard."); + +#define PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF \ + {"load_extension", (PyCFunction)pysqlite_connection_load_extension, METH_O, pysqlite_connection_load_extension__doc__}, + +static PyObject * +pysqlite_connection_load_extension_impl(pysqlite_Connection *self, + const char *extension_name); + +static PyObject * +pysqlite_connection_load_extension(pysqlite_Connection *self, PyObject *arg) +{ + PyObject *return_value = NULL; + const char *extension_name; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("load_extension", "argument", "str", arg); + goto exit; + } + Py_ssize_t extension_name_length; + extension_name = PyUnicode_AsUTF8AndSize(arg, &extension_name_length); + if (extension_name == NULL) { + goto exit; + } + if (strlen(extension_name) != (size_t)extension_name_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + return_value = pysqlite_connection_load_extension_impl(self, extension_name); + +exit: + return return_value; +} + +#endif /* !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +PyDoc_STRVAR(pysqlite_connection_interrupt__doc__, +"interrupt($self, /)\n" +"--\n" +"\n" +"Abort any pending database operation. Non-standard."); + +#define PYSQLITE_CONNECTION_INTERRUPT_METHODDEF \ + {"interrupt", (PyCFunction)pysqlite_connection_interrupt, METH_NOARGS, pysqlite_connection_interrupt__doc__}, + +static PyObject * +pysqlite_connection_interrupt_impl(pysqlite_Connection *self); + +static PyObject * +pysqlite_connection_interrupt(pysqlite_Connection *self, PyObject *Py_UNUSED(ignored)) +{ + return pysqlite_connection_interrupt_impl(self); +} + +PyDoc_STRVAR(pysqlite_connection_iterdump__doc__, +"iterdump($self, /)\n" +"--\n" +"\n" +"Returns iterator to the dump of the database in an SQL text format.\n" +"\n" +"Non-standard."); + +#define PYSQLITE_CONNECTION_ITERDUMP_METHODDEF \ + {"iterdump", (PyCFunction)pysqlite_connection_iterdump, METH_NOARGS, pysqlite_connection_iterdump__doc__}, + +static PyObject * +pysqlite_connection_iterdump_impl(pysqlite_Connection *self); + +static PyObject * +pysqlite_connection_iterdump(pysqlite_Connection *self, PyObject *Py_UNUSED(ignored)) +{ + return pysqlite_connection_iterdump_impl(self); +} + +PyDoc_STRVAR(pysqlite_connection_create_collation__doc__, +"create_collation($self, name, callback, /)\n" +"--\n" +"\n" +"Creates a collation function. Non-standard."); + +#define PYSQLITE_CONNECTION_CREATE_COLLATION_METHODDEF \ + {"create_collation", (PyCFunction)(void(*)(void))pysqlite_connection_create_collation, METH_FASTCALL, pysqlite_connection_create_collation__doc__}, + +static PyObject * +pysqlite_connection_create_collation_impl(pysqlite_Connection *self, + PyObject *name, PyObject *callable); + +static PyObject * +pysqlite_connection_create_collation(pysqlite_Connection *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *name; + PyObject *callable; + + if (!_PyArg_CheckPositional("create_collation", nargs, 2, 2)) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("create_collation", "argument 1", "str", args[0]); + goto exit; + } + if (PyUnicode_READY(args[0]) == -1) { + goto exit; + } + name = args[0]; + callable = args[1]; + return_value = pysqlite_connection_create_collation_impl(self, name, callable); + +exit: + return return_value; +} + +PyDoc_STRVAR(pysqlite_connection_enter__doc__, +"__enter__($self, /)\n" +"--\n" +"\n" +"Called when the connection is used as a context manager.\n" +"\n" +"Returns itself as a convenience to the caller."); + +#define PYSQLITE_CONNECTION_ENTER_METHODDEF \ + {"__enter__", (PyCFunction)pysqlite_connection_enter, METH_NOARGS, pysqlite_connection_enter__doc__}, + +static PyObject * +pysqlite_connection_enter_impl(pysqlite_Connection *self); + +static PyObject * +pysqlite_connection_enter(pysqlite_Connection *self, PyObject *Py_UNUSED(ignored)) +{ + return pysqlite_connection_enter_impl(self); +} + +PyDoc_STRVAR(pysqlite_connection_exit__doc__, +"__exit__($self, type, value, traceback, /)\n" +"--\n" +"\n" +"Called when the connection is used as a context manager.\n" +"\n" +"If there was any exception, a rollback takes place; otherwise we commit."); + +#define PYSQLITE_CONNECTION_EXIT_METHODDEF \ + {"__exit__", (PyCFunction)(void(*)(void))pysqlite_connection_exit, METH_FASTCALL, pysqlite_connection_exit__doc__}, + +static PyObject * +pysqlite_connection_exit_impl(pysqlite_Connection *self, PyObject *exc_type, + PyObject *exc_value, PyObject *exc_tb); + +static PyObject * +pysqlite_connection_exit(pysqlite_Connection *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *exc_type; + PyObject *exc_value; + PyObject *exc_tb; + + if (!_PyArg_CheckPositional("__exit__", nargs, 3, 3)) { + goto exit; + } + exc_type = args[0]; + exc_value = args[1]; + exc_tb = args[2]; + return_value = pysqlite_connection_exit_impl(self, exc_type, exc_value, exc_tb); + +exit: + return return_value; +} + +#ifndef PYSQLITE_CONNECTION_ENABLE_LOAD_EXTENSION_METHODDEF + #define PYSQLITE_CONNECTION_ENABLE_LOAD_EXTENSION_METHODDEF +#endif /* !defined(PYSQLITE_CONNECTION_ENABLE_LOAD_EXTENSION_METHODDEF) */ + +#ifndef PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF + #define PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF +#endif /* !defined(PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF) */ +/*[clinic end generated code: output=e14085c0abc0a407 input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 69203f85e05553..1c8f37e16480d6 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -37,6 +37,13 @@ #define HAVE_TRACE_V2 #endif +#include "clinic/connection.c.h" +/*[clinic input] +module _sqlite3 +class _sqlite3.Connection "pysqlite_Connection *" "pysqlite_ConnectionType" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=aa796073bd8f69db]*/ + _Py_IDENTIFIER(cursor); static const char * const begin_statements[] = { @@ -269,17 +276,20 @@ int pysqlite_connection_register_cursor(pysqlite_Connection* connection, PyObjec return 0; } -PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) +/*[clinic input] +_sqlite3.Connection.cursor as pysqlite_connection_cursor + + factory: object = NULL + +Return a cursor for the connection. +[clinic start generated code]*/ + +static PyObject * +pysqlite_connection_cursor_impl(pysqlite_Connection *self, PyObject *factory) +/*[clinic end generated code: output=562432a9e6af2aa1 input=4127345aa091b650]*/ { - static char *kwlist[] = {"factory", NULL}; - PyObject* factory = NULL; PyObject* cursor; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", kwlist, - &factory)) { - return NULL; - } - if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { return NULL; } @@ -309,7 +319,15 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, return cursor; } -PyObject* pysqlite_connection_close(pysqlite_Connection* self, PyObject* args) +/*[clinic input] +_sqlite3.Connection.close as pysqlite_connection_close + +Closes the connection. +[clinic start generated code]*/ + +static PyObject * +pysqlite_connection_close_impl(pysqlite_Connection *self) +/*[clinic end generated code: output=a546a0da212c9b97 input=3d58064bbffaa3d3]*/ { int rc; @@ -431,7 +449,15 @@ PyObject* pysqlite_connection_commit(pysqlite_Connection* self, PyObject* args) } } -PyObject* pysqlite_connection_rollback(pysqlite_Connection* self, PyObject* args) +/*[clinic input] +_sqlite3.Connection.rollback as pysqlite_connection_rollback + +Roll back the current transaction. +[clinic start generated code]*/ + +static PyObject * +pysqlite_connection_rollback_impl(pysqlite_Connection *self) +/*[clinic end generated code: output=b66fa0d43e7ef305 input=12d4e8d068942830]*/ { int rc; const char* tail; @@ -780,27 +806,31 @@ static void _destructor(void* args) Py_DECREF((PyObject*)args); } -PyObject* pysqlite_connection_create_function(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"name", "narg", "func", "deterministic", NULL}; +/*[clinic input] +_sqlite3.Connection.create_function as pysqlite_connection_create_function + + name: str + narg: int + func: object + * + deterministic: bool = False + +Creates a new function. Non-standard. +[clinic start generated code]*/ - PyObject* func; - char* name; - int narg; +static PyObject * +pysqlite_connection_create_function_impl(pysqlite_Connection *self, + const char *name, int narg, + PyObject *func, int deterministic) +/*[clinic end generated code: output=07d1877dd98c0308 input=f2edcf073e815beb]*/ +{ int rc; - int deterministic = 0; int flags = SQLITE_UTF8; if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { return NULL; } - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO|$p", kwlist, - &name, &narg, &func, &deterministic)) - { - return NULL; - } - if (deterministic) { #if SQLITE_VERSION_NUMBER < 3008003 PyErr_SetString(pysqlite_NotSupportedError, @@ -834,23 +864,28 @@ PyObject* pysqlite_connection_create_function(pysqlite_Connection* self, PyObjec Py_RETURN_NONE; } -PyObject* pysqlite_connection_create_aggregate(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) -{ - PyObject* aggregate_class; +/*[clinic input] +_sqlite3.Connection.create_aggregate as pysqlite_connection_create_aggregate - int n_arg; - char* name; - static char *kwlist[] = { "name", "n_arg", "aggregate_class", NULL }; + name: str + n_arg: int + aggregate_class: object + +Creates a new aggregate. Non-standard. +[clinic start generated code]*/ + +static PyObject * +pysqlite_connection_create_aggregate_impl(pysqlite_Connection *self, + const char *name, int n_arg, + PyObject *aggregate_class) +/*[clinic end generated code: output=fbb2f858cfa4d8db input=c2e13bbf234500a5]*/ +{ int rc; if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { return NULL; } - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO:create_aggregate", - kwlist, &name, &n_arg, &aggregate_class)) { - return NULL; - } Py_INCREF(aggregate_class); rc = sqlite3_create_function_v2(self->db, name, @@ -982,22 +1017,25 @@ static void _trace_callback(void* user_arg, const char* statement_string) #endif } -static PyObject* pysqlite_connection_set_authorizer(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) -{ - PyObject* authorizer_cb; +/*[clinic input] +_sqlite3.Connection.set_authorizer as pysqlite_connection_set_authorizer + + authorizer_callback as authorizer_cb: object + +Sets authorizer callback. Non-standard. +[clinic start generated code]*/ - static char *kwlist[] = { "authorizer_callback", NULL }; +static PyObject * +pysqlite_connection_set_authorizer_impl(pysqlite_Connection *self, + PyObject *authorizer_cb) +/*[clinic end generated code: output=f18ba575d788b35c input=df079724c020d2f2]*/ +{ int rc; if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { return NULL; } - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:set_authorizer", - kwlist, &authorizer_cb)) { - return NULL; - } - rc = sqlite3_set_authorizer(self->db, _authorizer_callback, (void*)authorizer_cb); if (rc != SQLITE_OK) { PyErr_SetString(pysqlite_OperationalError, "Error setting authorizer callback"); @@ -1010,19 +1048,22 @@ static PyObject* pysqlite_connection_set_authorizer(pysqlite_Connection* self, P Py_RETURN_NONE; } -static PyObject* pysqlite_connection_set_progress_handler(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) -{ - PyObject* progress_handler; - int n; +/*[clinic input] +_sqlite3.Connection.set_progress_handler as pysqlite_connection_set_progress_handler - static char *kwlist[] = { "progress_handler", "n", NULL }; + progress_handler: object + n: int - if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { - return NULL; - } +Sets progress handler callback. Non-standard. +[clinic start generated code]*/ - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Oi:set_progress_handler", - kwlist, &progress_handler, &n)) { +static PyObject * +pysqlite_connection_set_progress_handler_impl(pysqlite_Connection *self, + PyObject *progress_handler, + int n) +/*[clinic end generated code: output=35a7c10364cb1b04 input=857696c25f964c64]*/ +{ + if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { return NULL; } @@ -1038,28 +1079,34 @@ static PyObject* pysqlite_connection_set_progress_handler(pysqlite_Connection* s Py_RETURN_NONE; } -/* - * Ref. - * - https://sqlite.org/c3ref/c_trace.html - * - https://sqlite.org/c3ref/trace_v2.html - */ -static PyObject* pysqlite_connection_set_trace_callback(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) -{ - PyObject* trace_callback; +/*[clinic input] +_sqlite3.Connection.set_trace_callback as pysqlite_connection_set_trace_callback - static char *kwlist[] = { "trace_callback", NULL }; + trace_callback: object + / - if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { - return NULL; - } +Sets a trace callback called for each SQL statement (passed as unicode). + +Non-standard. +[clinic start generated code]*/ - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:set_trace_callback", - kwlist, &trace_callback)) { +static PyObject * +pysqlite_connection_set_trace_callback(pysqlite_Connection *self, + PyObject *trace_callback) +/*[clinic end generated code: output=efd1bf439e81696c input=05a4a14360e0e034]*/ +{ + if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { return NULL; } if (trace_callback == Py_None) { - /* None clears the trace callback previously set */ + /* + * None clears the trace callback previously set + * + * Ref. + * - https://sqlite.org/c3ref/c_trace.html + * - https://sqlite.org/c3ref/trace_v2.html + */ #ifdef HAVE_TRACE_V2 sqlite3_trace_v2(self->db, SQLITE_TRACE_STMT, 0, 0); #else @@ -1080,19 +1127,26 @@ static PyObject* pysqlite_connection_set_trace_callback(pysqlite_Connection* sel } #ifndef SQLITE_OMIT_LOAD_EXTENSION -static PyObject* pysqlite_enable_load_extension(pysqlite_Connection* self, PyObject* args) +/*[clinic input] +_sqlite3.Connection.enable_load_extension as pysqlite_connection_enable_load_extension + + enable as onoff: int + / + +Enable dynamic loading of SQLite extension modules. Non-standard. +[clinic start generated code]*/ + +static PyObject * +pysqlite_connection_enable_load_extension_impl(pysqlite_Connection *self, + int onoff) +/*[clinic end generated code: output=9cac37190d388baf input=7df2986f1602d6bd]*/ { int rc; - int onoff; if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { return NULL; } - if (!PyArg_ParseTuple(args, "i", &onoff)) { - return NULL; - } - rc = sqlite3_enable_load_extension(self->db, onoff); if (rc != SQLITE_OK) { @@ -1103,20 +1157,27 @@ static PyObject* pysqlite_enable_load_extension(pysqlite_Connection* self, PyObj } } -static PyObject* pysqlite_load_extension(pysqlite_Connection* self, PyObject* args) +/*[clinic input] +_sqlite3.Connection.load_extension as pysqlite_connection_load_extension + + name as extension_name: str + / + +Load SQLite extension module. Non-standard. +[clinic start generated code]*/ + +static PyObject * +pysqlite_connection_load_extension_impl(pysqlite_Connection *self, + const char *extension_name) +/*[clinic end generated code: output=47eb1d7312bc97a7 input=0b711574560db9fc]*/ { int rc; - char* extension_name; char* errmsg; if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { return NULL; } - if (!PyArg_ParseTuple(args, "s", &extension_name)) { - return NULL; - } - rc = sqlite3_load_extension(self->db, extension_name, 0, &errmsg); if (rc != 0) { PyErr_SetString(pysqlite_OperationalError, errmsg); @@ -1421,8 +1482,15 @@ pysqlite_collation_callback( return result; } +/*[clinic input] +_sqlite3.Connection.interrupt as pysqlite_connection_interrupt + +Abort any pending database operation. Non-standard. +[clinic start generated code]*/ + static PyObject * -pysqlite_connection_interrupt(pysqlite_Connection* self, PyObject* args) +pysqlite_connection_interrupt_impl(pysqlite_Connection *self) +/*[clinic end generated code: output=f193204bc9e70b47 input=4bd0ad083cf93aa7]*/ { PyObject* retval = NULL; @@ -1443,8 +1511,17 @@ pysqlite_connection_interrupt(pysqlite_Connection* self, PyObject* args) * Class method of Connection to call the Python function _iterdump * of the sqlite3 module. */ +/*[clinic input] +_sqlite3.Connection.iterdump as pysqlite_connection_iterdump + +Returns iterator to the dump of the database in an SQL text format. + +Non-standard. +[clinic start generated code]*/ + static PyObject * -pysqlite_connection_iterdump(pysqlite_Connection* self, PyObject* args) +pysqlite_connection_iterdump_impl(pysqlite_Connection *self) +/*[clinic end generated code: output=586997aaf9808768 input=53bc907cb5eedb85]*/ { _Py_IDENTIFIER(_iterdump); PyObject* retval = NULL; @@ -1637,12 +1714,22 @@ pysqlite_connection_backup(pysqlite_Connection *self, PyObject *args, PyObject * } } +/*[clinic input] +_sqlite3.Connection.create_collation as pysqlite_connection_create_collation + + name: unicode + callback as callable: object + / + +Creates a collation function. Non-standard. +[clinic start generated code]*/ + static PyObject * -pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) +pysqlite_connection_create_collation_impl(pysqlite_Connection *self, + PyObject *name, PyObject *callable) +/*[clinic end generated code: output=0f63b8995565ae22 input=5c3898813a776cf2]*/ { - PyObject* callable; PyObject* uppercase_name = 0; - PyObject* name; PyObject* retval; Py_ssize_t i, len; _Py_IDENTIFIER(upper); @@ -1655,11 +1742,6 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) goto finally; } - if (!PyArg_ParseTuple(args, "UO:create_collation(name, callback)", - &name, &callable)) { - goto finally; - } - uppercase_name = _PyObject_CallMethodIdOneArg((PyObject *)&PyUnicode_Type, &PyId_upper, name); if (!uppercase_name) { @@ -1725,28 +1807,43 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) return retval; } -/* Called when the connection is used as a context manager. Returns itself as a - * convenience to the caller. */ +/*[clinic input] +_sqlite3.Connection.__enter__ as pysqlite_connection_enter + +Called when the connection is used as a context manager. + +Returns itself as a convenience to the caller. +[clinic start generated code]*/ + static PyObject * -pysqlite_connection_enter(pysqlite_Connection* self, PyObject* args) +pysqlite_connection_enter_impl(pysqlite_Connection *self) +/*[clinic end generated code: output=457b09726d3e9dcd input=127d7a4f17e86d8f]*/ { Py_INCREF(self); return (PyObject*)self; } -/** Called when the connection is used as a context manager. If there was any - * exception, a rollback takes place; otherwise we commit. */ +/*[clinic input] +_sqlite3.Connection.__exit__ as pysqlite_connection_exit + + type as exc_type: object + value as exc_value: object + traceback as exc_tb: object + / + +Called when the connection is used as a context manager. + +If there was any exception, a rollback takes place; otherwise we commit. +[clinic start generated code]*/ + static PyObject * -pysqlite_connection_exit(pysqlite_Connection* self, PyObject* args) +pysqlite_connection_exit_impl(pysqlite_Connection *self, PyObject *exc_type, + PyObject *exc_value, PyObject *exc_tb) +/*[clinic end generated code: output=0705200e9321202a input=bd66f1532c9c54a7]*/ { - PyObject* exc_type, *exc_value, *exc_tb; const char* method_name; PyObject* result; - if (!PyArg_ParseTuple(args, "OOO", &exc_type, &exc_value, &exc_tb)) { - return NULL; - } - if (exc_type == Py_None && exc_value == Py_None && exc_tb == Py_None) { method_name = "commit"; } else { @@ -1773,48 +1870,31 @@ static PyGetSetDef connection_getset[] = { }; static PyMethodDef connection_methods[] = { - {"cursor", (PyCFunction)(void(*)(void))pysqlite_connection_cursor, METH_VARARGS|METH_KEYWORDS, - PyDoc_STR("Return a cursor for the connection.")}, - {"close", (PyCFunction)pysqlite_connection_close, METH_NOARGS, - PyDoc_STR("Closes the connection.")}, + PYSQLITE_CONNECTION_CLOSE_METHODDEF + PYSQLITE_CONNECTION_CREATE_AGGREGATE_METHODDEF + PYSQLITE_CONNECTION_CREATE_COLLATION_METHODDEF + PYSQLITE_CONNECTION_CREATE_FUNCTION_METHODDEF + PYSQLITE_CONNECTION_CURSOR_METHODDEF + PYSQLITE_CONNECTION_ENABLE_LOAD_EXTENSION_METHODDEF + PYSQLITE_CONNECTION_ENTER_METHODDEF + PYSQLITE_CONNECTION_EXIT_METHODDEF + PYSQLITE_CONNECTION_INTERRUPT_METHODDEF + PYSQLITE_CONNECTION_ITERDUMP_METHODDEF + PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF + PYSQLITE_CONNECTION_ROLLBACK_METHODDEF + PYSQLITE_CONNECTION_SET_AUTHORIZER_METHODDEF + PYSQLITE_CONNECTION_SET_PROGRESS_HANDLER_METHODDEF + PYSQLITE_CONNECTION_SET_TRACE_CALLBACK_METHODDEF {"commit", (PyCFunction)pysqlite_connection_commit, METH_NOARGS, PyDoc_STR("Commit the current transaction.")}, - {"rollback", (PyCFunction)pysqlite_connection_rollback, METH_NOARGS, - PyDoc_STR("Roll back the current transaction.")}, - {"create_function", (PyCFunction)(void(*)(void))pysqlite_connection_create_function, METH_VARARGS|METH_KEYWORDS, - PyDoc_STR("Creates a new function. Non-standard.")}, - {"create_aggregate", (PyCFunction)(void(*)(void))pysqlite_connection_create_aggregate, METH_VARARGS|METH_KEYWORDS, - PyDoc_STR("Creates a new aggregate. Non-standard.")}, - {"set_authorizer", (PyCFunction)(void(*)(void))pysqlite_connection_set_authorizer, METH_VARARGS|METH_KEYWORDS, - PyDoc_STR("Sets authorizer callback. Non-standard.")}, - #ifndef SQLITE_OMIT_LOAD_EXTENSION - {"enable_load_extension", (PyCFunction)pysqlite_enable_load_extension, METH_VARARGS, - PyDoc_STR("Enable dynamic loading of SQLite extension modules. Non-standard.")}, - {"load_extension", (PyCFunction)pysqlite_load_extension, METH_VARARGS, - PyDoc_STR("Load SQLite extension module. Non-standard.")}, - #endif - {"set_progress_handler", (PyCFunction)(void(*)(void))pysqlite_connection_set_progress_handler, METH_VARARGS|METH_KEYWORDS, - PyDoc_STR("Sets progress handler callback. Non-standard.")}, - {"set_trace_callback", (PyCFunction)(void(*)(void))pysqlite_connection_set_trace_callback, METH_VARARGS|METH_KEYWORDS, - PyDoc_STR("Sets a trace callback called for each SQL statement (passed as unicode). Non-standard.")}, {"execute", (PyCFunction)pysqlite_connection_execute, METH_VARARGS, PyDoc_STR("Executes a SQL statement. Non-standard.")}, {"executemany", (PyCFunction)pysqlite_connection_executemany, METH_VARARGS, PyDoc_STR("Repeatedly executes a SQL statement. Non-standard.")}, {"executescript", (PyCFunction)pysqlite_connection_executescript, METH_VARARGS, PyDoc_STR("Executes a multiple SQL statements at once. Non-standard.")}, - {"create_collation", (PyCFunction)pysqlite_connection_create_collation, METH_VARARGS, - PyDoc_STR("Creates a collation function. Non-standard.")}, - {"interrupt", (PyCFunction)pysqlite_connection_interrupt, METH_NOARGS, - PyDoc_STR("Abort any pending database operation. Non-standard.")}, - {"iterdump", (PyCFunction)pysqlite_connection_iterdump, METH_NOARGS, - PyDoc_STR("Returns iterator to the dump of the database in an SQL text format. Non-standard.")}, {"backup", (PyCFunction)(void(*)(void))pysqlite_connection_backup, METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Makes a backup of the database. Non-standard.")}, - {"__enter__", (PyCFunction)pysqlite_connection_enter, METH_NOARGS, - PyDoc_STR("For context manager. Non-standard.")}, - {"__exit__", (PyCFunction)pysqlite_connection_exit, METH_VARARGS, - PyDoc_STR("For context manager. Non-standard.")}, {NULL, NULL} }; diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h index aadf439034fe28..341ef01eda7fef 100644 --- a/Modules/_sqlite/connection.h +++ b/Modules/_sqlite/connection.h @@ -110,11 +110,8 @@ extern PyTypeObject *pysqlite_ConnectionType; PyObject* pysqlite_connection_alloc(PyTypeObject* type, int aware); void pysqlite_connection_dealloc(pysqlite_Connection* self); -PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, PyObject* kwargs); -PyObject* pysqlite_connection_close(pysqlite_Connection* self, PyObject* args); PyObject* _pysqlite_connection_begin(pysqlite_Connection* self); PyObject* pysqlite_connection_commit(pysqlite_Connection* self, PyObject* args); -PyObject* pysqlite_connection_rollback(pysqlite_Connection* self, PyObject* args); PyObject* pysqlite_connection_new(PyTypeObject* type, PyObject* args, PyObject* kw); int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject* kwargs); From e2f6bb46a4a42147987a55cac7c63f9c7a9bc7ec Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sat, 19 Dec 2020 00:41:33 +0900 Subject: [PATCH 0826/1261] bpo-40956: Fix sqlite3 AC code (GH-23837) --- Modules/_sqlite/clinic/connection.c.h | 30 ++++++++++++++++++++++++--- Modules/_sqlite/connection.c | 11 +++++----- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Modules/_sqlite/clinic/connection.c.h b/Modules/_sqlite/clinic/connection.c.h index 6b0ff4de4299e9..7e3c9a9e61b19d 100644 --- a/Modules/_sqlite/clinic/connection.c.h +++ b/Modules/_sqlite/clinic/connection.c.h @@ -264,7 +264,7 @@ pysqlite_connection_set_progress_handler(pysqlite_Connection *self, PyObject *co } PyDoc_STRVAR(pysqlite_connection_set_trace_callback__doc__, -"set_trace_callback($self, trace_callback, /)\n" +"set_trace_callback($self, /, trace_callback)\n" "--\n" "\n" "Sets a trace callback called for each SQL statement (passed as unicode).\n" @@ -272,7 +272,31 @@ PyDoc_STRVAR(pysqlite_connection_set_trace_callback__doc__, "Non-standard."); #define PYSQLITE_CONNECTION_SET_TRACE_CALLBACK_METHODDEF \ - {"set_trace_callback", (PyCFunction)pysqlite_connection_set_trace_callback, METH_O, pysqlite_connection_set_trace_callback__doc__}, + {"set_trace_callback", (PyCFunction)(void(*)(void))pysqlite_connection_set_trace_callback, METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_set_trace_callback__doc__}, + +static PyObject * +pysqlite_connection_set_trace_callback_impl(pysqlite_Connection *self, + PyObject *trace_callback); + +static PyObject * +pysqlite_connection_set_trace_callback(pysqlite_Connection *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"trace_callback", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "set_trace_callback", 0}; + PyObject *argsbuf[1]; + PyObject *trace_callback; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + trace_callback = args[0]; + return_value = pysqlite_connection_set_trace_callback_impl(self, trace_callback); + +exit: + return return_value; +} #if !defined(SQLITE_OMIT_LOAD_EXTENSION) @@ -487,4 +511,4 @@ pysqlite_connection_exit(pysqlite_Connection *self, PyObject *const *args, Py_ss #ifndef PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF #define PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF #endif /* !defined(PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF) */ -/*[clinic end generated code: output=e14085c0abc0a407 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=eb14a52e4c682f3b input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 1c8f37e16480d6..75aec74e0aaa92 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -1083,7 +1083,6 @@ pysqlite_connection_set_progress_handler_impl(pysqlite_Connection *self, _sqlite3.Connection.set_trace_callback as pysqlite_connection_set_trace_callback trace_callback: object - / Sets a trace callback called for each SQL statement (passed as unicode). @@ -1091,9 +1090,9 @@ Non-standard. [clinic start generated code]*/ static PyObject * -pysqlite_connection_set_trace_callback(pysqlite_Connection *self, - PyObject *trace_callback) -/*[clinic end generated code: output=efd1bf439e81696c input=05a4a14360e0e034]*/ +pysqlite_connection_set_trace_callback_impl(pysqlite_Connection *self, + PyObject *trace_callback) +/*[clinic end generated code: output=fb0e307b9924d454 input=56d60fd38d763679]*/ { if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { return NULL; @@ -1130,7 +1129,7 @@ pysqlite_connection_set_trace_callback(pysqlite_Connection *self, /*[clinic input] _sqlite3.Connection.enable_load_extension as pysqlite_connection_enable_load_extension - enable as onoff: int + enable as onoff: bool(accept={int}) / Enable dynamic loading of SQLite extension modules. Non-standard. @@ -1139,7 +1138,7 @@ Enable dynamic loading of SQLite extension modules. Non-standard. static PyObject * pysqlite_connection_enable_load_extension_impl(pysqlite_Connection *self, int onoff) -/*[clinic end generated code: output=9cac37190d388baf input=7df2986f1602d6bd]*/ +/*[clinic end generated code: output=9cac37190d388baf input=5c0da5b121121cbc]*/ { int rc; From f5051a79203c87230c545b24885aa9b79e1ebbf1 Mon Sep 17 00:00:00 2001 From: Richard Kojedzinszky Date: Fri, 18 Dec 2020 18:26:04 +0100 Subject: [PATCH 0827/1261] bpo-41891: ensure asyncio.wait_for waits for task completion (#22461) --- Lib/asyncio/tasks.py | 5 +- Lib/test/test_asyncio/test_asyncio_waitfor.py | 61 +++++++++++++++++++ .../2020-09-30-13-35-29.bpo-41891.pNAeYI.rst | 1 + 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 Lib/test/test_asyncio/test_asyncio_waitfor.py create mode 100644 Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 0d3a24b7853f57..52f1e6629e2fc6 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -437,7 +437,10 @@ async def wait_for(fut, timeout): return fut.result() else: fut.remove_done_callback(cb) - fut.cancel() + # We must ensure that the task is not running + # after wait_for() returns. + # See https://bugs.python.org/issue32751 + await _cancel_and_wait(fut, loop=loop) raise if fut.done(): diff --git a/Lib/test/test_asyncio/test_asyncio_waitfor.py b/Lib/test/test_asyncio/test_asyncio_waitfor.py new file mode 100644 index 00000000000000..2ca64abbeb527c --- /dev/null +++ b/Lib/test/test_asyncio/test_asyncio_waitfor.py @@ -0,0 +1,61 @@ +import asyncio +import unittest +import time + +def tearDownModule(): + asyncio.set_event_loop_policy(None) + + +class SlowTask: + """ Task will run for this defined time, ignoring cancel requests """ + TASK_TIMEOUT = 0.2 + + def __init__(self): + self.exited = False + + async def run(self): + exitat = time.monotonic() + self.TASK_TIMEOUT + + while True: + tosleep = exitat - time.monotonic() + if tosleep <= 0: + break + + try: + await asyncio.sleep(tosleep) + except asyncio.CancelledError: + pass + + self.exited = True + +class AsyncioWaitForTest(unittest.TestCase): + + async def atest_asyncio_wait_for_cancelled(self): + t = SlowTask() + + waitfortask = asyncio.create_task(asyncio.wait_for(t.run(), t.TASK_TIMEOUT * 2)) + await asyncio.sleep(0) + waitfortask.cancel() + await asyncio.wait({waitfortask}) + + self.assertTrue(t.exited) + + def test_asyncio_wait_for_cancelled(self): + asyncio.run(self.atest_asyncio_wait_for_cancelled()) + + async def atest_asyncio_wait_for_timeout(self): + t = SlowTask() + + try: + await asyncio.wait_for(t.run(), t.TASK_TIMEOUT / 2) + except asyncio.TimeoutError: + pass + + self.assertTrue(t.exited) + + def test_asyncio_wait_for_timeout(self): + asyncio.run(self.atest_asyncio_wait_for_timeout()) + + +if __name__ == '__main__': + unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst b/Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst new file mode 100644 index 00000000000000..75c25127803153 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst @@ -0,0 +1 @@ +Ensure asyncio.wait_for waits for task completion From c1baf61fa2b06525d6982a985865ea0c7e0b0818 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Sat, 19 Dec 2020 01:39:26 +0800 Subject: [PATCH 0828/1261] bpo-42675: Document collections.abc.Callable changes (GH-23839) --- Doc/library/types.rst | 4 ++++ Doc/whatsnew/3.10.rst | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 6f0dc259303fad..8e05f8408e545d 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -280,6 +280,10 @@ Standard names are defined for the following types: .. versionadded:: 3.9 + .. versionchanged:: 3.9.2 + This type can now be subclassed. + + .. data:: Union The type of :ref:`union type expressions`. diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index b690f8d2d7cd7c..a6f9b0b1754d29 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -179,6 +179,21 @@ codecs Add a :func:`codecs.unregister` function to unregister a codec search function. (Contributed by Hai Shi in :issue:`41842`.) +collections.abc +--------------- + +The ``__args__`` of the :ref:`parameterized generic ` for +:class:`collections.abc.Callable` are now consistent with :data:`typing.Callable`. +:class:`collections.abc.Callable` generic now flattens type parameters, similar +to what :data:`typing.Callable` currently does. This means that +``collections.abc.Callable[[int, str], str]`` will have ``__args__`` of +``(int, str, str)``; previously this was ``([int, str], str)``. To allow this +change, :class:`types.GenericAlias` can now be subclassed, and a subclass will +be returned when subscripting the :class:`collections.abc.Callable` type. Note +that a :exc:`TypeError` may be raised for invalid forms of parameterizing +:class:`collections.abc.Callable` which may have passed silently in Python 3.9. +(Contributed by Ken Jin in :issue:`42195`.) + contextlib ---------- @@ -507,6 +522,15 @@ Changes in the Python API ignored. (Contributed by Victor Stinner in :issue:`42639`.) +* :class:`collections.abc.Callable` generic now flattens type parameters, similar + to what :data:`typing.Callable` currently does. This means that + ``collections.abc.Callable[[int, str], str]`` will have ``__args__`` of + ``(int, str, str)``; previously this was ``([int, str], str)``. Code which + accesses the arguments via :func:`typing.get_args` or ``__args__`` need to account + for this change. Furthermore, :exc:`TypeError` may be raised for invalid forms + of parameterizing :class:`collections.abc.Callable` which may have passed + silently in Python 3.9. + (Contributed by Ken Jin in :issue:`42195`.) CPython bytecode changes ======================== From 69251f492a5107964ddcaa8022a88aea3f70f9c3 Mon Sep 17 00:00:00 2001 From: Ammar Askar Date: Fri, 18 Dec 2020 14:00:51 -0500 Subject: [PATCH 0829/1261] bpo-34398: Allow glossary results to show up on search page (GH-8773) --- Doc/conf.py | 3 +- Doc/tools/extensions/glossary_search.py | 57 +++++++++++++++++++ Doc/tools/templates/search.html | 48 ++++++++++++++++ .../2019-03-04-18-51-21.bpo-34398.YedUqW.rst | 2 + 4 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 Doc/tools/extensions/glossary_search.py create mode 100644 Doc/tools/templates/search.html create mode 100644 Misc/NEWS.d/next/Documentation/2019-03-04-18-51-21.bpo-34398.YedUqW.rst diff --git a/Doc/conf.py b/Doc/conf.py index 079d17717f381c..6b88c23a44473f 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -15,8 +15,7 @@ extensions = ['sphinx.ext.coverage', 'sphinx.ext.doctest', 'pyspecific', 'c_annotations', 'escape4chm', - 'asdl_highlight', 'peg_highlight'] - + 'asdl_highlight', 'peg_highlight', 'glossary_search'] doctest_global_setup = ''' try: diff --git a/Doc/tools/extensions/glossary_search.py b/Doc/tools/extensions/glossary_search.py new file mode 100644 index 00000000000000..34d227d670243e --- /dev/null +++ b/Doc/tools/extensions/glossary_search.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +""" + glossary_search.py + ~~~~~~~~~~~~~~~~ + + Feature search results for glossary items prominently. + + :license: Python license. +""" +from os import path +from sphinx.addnodes import glossary +from sphinx.util import logging +from docutils.nodes import definition_list_item +import json + + +logger = logging.getLogger(__name__) + + +def process_glossary_nodes(app, doctree, fromdocname): + if app.builder.format != 'html': + return + + terms = {} + + for node in doctree.traverse(glossary): + for glossary_item in node.traverse(definition_list_item): + term = glossary_item[0].astext().lower() + definition = glossary_item[1] + + rendered = app.builder.render_partial(definition) + terms[term] = { + 'title': glossary_item[0].astext(), + 'body': rendered['html_body'] + } + + if hasattr(app.env, 'glossary_terms'): + app.env.glossary_terms.update(terms) + else: + app.env.glossary_terms = terms + +def on_build_finish(app, exc): + if not hasattr(app.env, 'glossary_terms'): + return + if not app.env.glossary_terms: + return + + logger.info('Writing glossary.json', color='green') + with open(path.join(app.outdir, '_static', 'glossary.json'), 'w') as f: + json.dump(app.env.glossary_terms, f) + + +def setup(app): + app.connect('doctree-resolved', process_glossary_nodes) + app.connect('build-finished', on_build_finish) + + return {'version': '0.1', 'parallel_read_safe': True} diff --git a/Doc/tools/templates/search.html b/Doc/tools/templates/search.html new file mode 100644 index 00000000000000..cf20c2e1d4ff83 --- /dev/null +++ b/Doc/tools/templates/search.html @@ -0,0 +1,48 @@ +{% extends "!search.html" %} +{% block extrahead %} + {{ super() }} + +{% endblock %} \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2019-03-04-18-51-21.bpo-34398.YedUqW.rst b/Misc/NEWS.d/next/Documentation/2019-03-04-18-51-21.bpo-34398.YedUqW.rst new file mode 100644 index 00000000000000..4693cecdb7b391 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-03-04-18-51-21.bpo-34398.YedUqW.rst @@ -0,0 +1,2 @@ +Prominently feature listings from the glossary in documentation search +results. Patch by Ammar Askar. From 03c325df2805627aad3f24b04beb177da7fcf2d6 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Fri, 18 Dec 2020 16:10:20 -0300 Subject: [PATCH 0830/1261] bpo-36769: Document that fnmatch.filter supports any kind of iterable (#13039) --- Doc/library/fnmatch.rst | 2 +- Lib/fnmatch.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/fnmatch.rst b/Doc/library/fnmatch.rst index ce07d326b395d8..925f08e914685e 100644 --- a/Doc/library/fnmatch.rst +++ b/Doc/library/fnmatch.rst @@ -75,7 +75,7 @@ patterns. .. function:: filter(names, pattern) - Return the subset of the list of *names* that match *pattern*. It is the same as + Construct a list from those elements of the iterable *names* that match *pattern*. It is the same as ``[n for n in names if fnmatch(n, pattern)]``, but implemented more efficiently. diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py index 0eb1802bdb53c5..7c52c23067d40f 100644 --- a/Lib/fnmatch.py +++ b/Lib/fnmatch.py @@ -52,7 +52,7 @@ def _compile_pattern(pat): return re.compile(res).match def filter(names, pat): - """Return the subset of the list NAMES that match PAT.""" + """Construct a list from those elements of the iterable NAMES that match PAT.""" result = [] pat = os.path.normcase(pat) match = _compile_pattern(pat) From af00b83a675469afe4240f3a2c83b90193d927c0 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Sat, 19 Dec 2020 00:09:54 +0000 Subject: [PATCH 0831/1261] bpo-24792: Fix zipimporter masking the cause of import errors (GH-22204) zipimport's _unmarshal_code swallows import errors and then _get_module_code doesn't know the cause of the error, and returns the generic, and sometimes incorrect, 'could not find...'. Automerge-Triggered-By: GH:brettcannon --- Doc/library/zipimport.rst | 9 +- Lib/test/test_zipimport.py | 8 +- Lib/zipimport.py | 38 +- .../2020-09-11-16-07-00.bpo-24792.Z-ARra.rst | 1 + Python/importlib_zipimport.h | 1429 +++++++++-------- 5 files changed, 748 insertions(+), 737 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-11-16-07-00.bpo-24792.Z-ARra.rst diff --git a/Doc/library/zipimport.rst b/Doc/library/zipimport.rst index 8d579f21c7e8b0..62e1e47e980e17 100644 --- a/Doc/library/zipimport.rst +++ b/Doc/library/zipimport.rst @@ -121,7 +121,7 @@ zipimporter Objects .. method:: get_code(fullname) Return the code object for the specified module. Raise - :exc:`ZipImportError` if the module couldn't be found. + :exc:`ZipImportError` if the module couldn't be imported. .. method:: get_data(pathname) @@ -137,7 +137,7 @@ zipimporter Objects Return the value ``__file__`` would be set to if the specified module was imported. Raise :exc:`ZipImportError` if the module couldn't be - found. + imported. .. versionadded:: 3.1 @@ -159,14 +159,13 @@ zipimporter Objects .. method:: load_module(fullname) Load the module specified by *fullname*. *fullname* must be the fully - qualified (dotted) module name. It returns the imported module, or raises - :exc:`ZipImportError` if it wasn't found. + qualified (dotted) module name. Returns the imported module on success, + raises :exc:`ZipImportError` on failure. .. deprecated:: 3.10 Use :meth:`exec_module` instead. - .. attribute:: archive The file name of the importer's associated ZIP file, without a possible diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index 6dea2b16287ad4..d59ef1ed6ff81d 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -242,10 +242,10 @@ def testBadMagic2(self): files = {TESTMOD + pyc_ext: (NOW, badmagic_pyc)} try: self.doTest(".py", files, TESTMOD) - except ImportError: - pass - else: - self.fail("expected ImportError; import from bad pyc") + self.fail("This should not be reached") + except zipimport.ZipImportError as exc: + self.assertIsInstance(exc.__cause__, ImportError) + self.assertIn("magic number", exc.__cause__.msg) def testBadMTime(self): badtime_pyc = bytearray(test_pyc) diff --git a/Lib/zipimport.py b/Lib/zipimport.py index 02e4fd38d0e2a2..ce3e00e24faf26 100644 --- a/Lib/zipimport.py +++ b/Lib/zipimport.py @@ -185,7 +185,7 @@ def get_code(self, fullname): """get_code(fullname) -> code object. Return the code object for the specified module. Raise ZipImportError - if the module couldn't be found. + if the module couldn't be imported. """ code, ispackage, modpath = _get_module_code(self, fullname) return code @@ -215,7 +215,8 @@ def get_data(self, pathname): def get_filename(self, fullname): """get_filename(fullname) -> filename string. - Return the filename for the specified module. + Return the filename for the specified module or raise ZipImportError + if it couldn't be imported. """ # Deciding the filename requires working out where the code # would come from if the module was actually loaded @@ -267,7 +268,7 @@ def load_module(self, fullname): Load the module specified by 'fullname'. 'fullname' must be the fully qualified (dotted) module name. It returns the imported - module, or raises ZipImportError if it wasn't found. + module, or raises ZipImportError if it could not be imported. Deprecated since Python 3.10. Use exec_module() instead. """ @@ -613,20 +614,15 @@ def _eq_mtime(t1, t2): # Given the contents of a .py[co] file, unmarshal the data -# and return the code object. Return None if it the magic word doesn't -# match, or if the recorded .py[co] metadata does not match the source, -# (we do this instead of raising an exception as we fall back -# to .py if available and we don't want to mask other errors). +# and return the code object. Raises ImportError it the magic word doesn't +# match, or if the recorded .py[co] metadata does not match the source. def _unmarshal_code(self, pathname, fullpath, fullname, data): exc_details = { 'name': fullname, 'path': fullpath, } - try: - flags = _bootstrap_external._classify_pyc(data, fullname, exc_details) - except ImportError: - return None + flags = _bootstrap_external._classify_pyc(data, fullname, exc_details) hash_based = flags & 0b1 != 0 if hash_based: @@ -640,11 +636,8 @@ def _unmarshal_code(self, pathname, fullpath, fullname, data): source_bytes, ) - try: - _bootstrap_external._validate_hash_pyc( - data, source_hash, fullname, exc_details) - except ImportError: - return None + _bootstrap_external._validate_hash_pyc( + data, source_hash, fullname, exc_details) else: source_mtime, source_size = \ _get_mtime_and_size_of_source(self, fullpath) @@ -730,6 +723,7 @@ def _get_pyc_source(self, path): # 'fullname'. def _get_module_code(self, fullname): path = _get_module_path(self, fullname) + import_error = None for suffix, isbytecode, ispackage in _zip_searchorder: fullpath = path + suffix _bootstrap._verbose_message('trying {}{}{}', self.archive, path_sep, fullpath, verbosity=2) @@ -740,8 +734,12 @@ def _get_module_code(self, fullname): else: modpath = toc_entry[0] data = _get_data(self.archive, toc_entry) + code = None if isbytecode: - code = _unmarshal_code(self, modpath, fullpath, fullname, data) + try: + code = _unmarshal_code(self, modpath, fullpath, fullname, data) + except ImportError as exc: + import_error = exc else: code = _compile_source(modpath, data) if code is None: @@ -751,4 +749,8 @@ def _get_module_code(self, fullname): modpath = toc_entry[0] return code, ispackage, modpath else: - raise ZipImportError(f"can't find module {fullname!r}", name=fullname) + if import_error: + msg = f"module load failed: {import_error}" + raise ZipImportError(msg, name=fullname) from import_error + else: + raise ZipImportError(f"can't find module {fullname!r}", name=fullname) diff --git a/Misc/NEWS.d/next/Library/2020-09-11-16-07-00.bpo-24792.Z-ARra.rst b/Misc/NEWS.d/next/Library/2020-09-11-16-07-00.bpo-24792.Z-ARra.rst new file mode 100644 index 00000000000000..4f1f18a5584083 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-11-16-07-00.bpo-24792.Z-ARra.rst @@ -0,0 +1 @@ +Fixed bug where :mod:`zipimporter` sometimes reports an incorrect cause of import errors. \ No newline at end of file diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index 38f148ea783828..96169c16edcd62 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -294,7 +294,7 @@ const unsigned char _Py_M__zipimport[] = { 0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0, 67,0,0,0,115,20,0,0,0,116,0,124,0,124,1,131, 2,92,3,125,2,125,3,125,4,124,2,83,0,41,2,122, - 163,103,101,116,95,99,111,100,101,40,102,117,108,108,110,97, + 166,103,101,116,95,99,111,100,101,40,102,117,108,108,110,97, 109,101,41,32,45,62,32,99,111,100,101,32,111,98,106,101, 99,116,46,10,10,32,32,32,32,32,32,32,32,82,101,116, 117,114,110,32,116,104,101,32,99,111,100,101,32,111,98,106, @@ -303,718 +303,727 @@ const unsigned char _Py_M__zipimport[] = { 105,115,101,32,90,105,112,73,109,112,111,114,116,69,114,114, 111,114,10,32,32,32,32,32,32,32,32,105,102,32,116,104, 101,32,109,111,100,117,108,101,32,99,111,117,108,100,110,39, - 116,32,98,101,32,102,111,117,110,100,46,10,32,32,32,32, - 32,32,32,32,78,169,1,218,16,95,103,101,116,95,109,111, - 100,117,108,101,95,99,111,100,101,169,5,114,32,0,0,0, - 114,38,0,0,0,218,4,99,111,100,101,218,9,105,115,112, - 97,99,107,97,103,101,114,40,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,8,103,101,116,95, - 99,111,100,101,184,0,0,0,115,6,0,0,0,16,6,4, - 1,255,128,122,20,122,105,112,105,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,0,0,0,0,4,0,0,0,8,0,0,0,67,0, - 0,0,115,112,0,0,0,116,0,114,16,124,1,160,1,116, - 0,116,2,161,2,125,1,124,1,125,2,124,1,160,3,124, - 0,106,4,116,2,23,0,161,1,114,58,124,1,116,5,124, - 0,106,4,116,2,23,0,131,1,100,1,133,2,25,0,125, - 2,122,14,124,0,106,6,124,2,25,0,125,3,87,0,110, - 26,4,0,116,7,121,98,1,0,1,0,1,0,116,8,100, - 2,100,3,124,2,131,3,130,1,119,0,116,9,124,0,106, - 4,124,3,131,2,83,0,41,4,122,154,103,101,116,95,100, - 97,116,97,40,112,97,116,104,110,97,109,101,41,32,45,62, - 32,115,116,114,105,110,103,32,119,105,116,104,32,102,105,108, - 101,32,100,97,116,97,46,10,10,32,32,32,32,32,32,32, - 32,82,101,116,117,114,110,32,116,104,101,32,100,97,116,97, - 32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104, - 32,39,112,97,116,104,110,97,109,101,39,46,32,82,97,105, - 115,101,32,79,83,69,114,114,111,114,32,105,102,10,32,32, - 32,32,32,32,32,32,116,104,101,32,102,105,108,101,32,119, - 97,115,110,39,116,32,102,111,117,110,100,46,10,32,32,32, - 32,32,32,32,32,78,114,0,0,0,0,218,0,41,10,114, - 18,0,0,0,114,19,0,0,0,114,20,0,0,0,218,10, - 115,116,97,114,116,115,119,105,116,104,114,29,0,0,0,218, - 3,108,101,110,114,28,0,0,0,114,26,0,0,0,114,22, - 0,0,0,218,9,95,103,101,116,95,100,97,116,97,41,4, - 114,32,0,0,0,218,8,112,97,116,104,110,97,109,101,90, - 3,107,101,121,218,9,116,111,99,95,101,110,116,114,121,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, - 103,101,116,95,100,97,116,97,194,0,0,0,115,22,0,0, - 0,4,6,12,1,4,2,16,1,22,1,2,2,14,1,12, - 1,14,1,12,1,255,128,122,20,122,105,112,105,109,112,111, - 114,116,101,114,46,103,101,116,95,100,97,116,97,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,0, - 0,0,67,0,0,0,115,20,0,0,0,116,0,124,0,124, - 1,131,2,92,3,125,2,125,3,125,4,124,4,83,0,41, - 2,122,106,103,101,116,95,102,105,108,101,110,97,109,101,40, - 102,117,108,108,110,97,109,101,41,32,45,62,32,102,105,108, - 101,110,97,109,101,32,115,116,114,105,110,103,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,32,116,104, - 101,32,102,105,108,101,110,97,109,101,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,46,10,32,32,32,32,32,32,32,32,78,114,47, - 0,0,0,114,49,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,12,103,101,116,95,102,105,108, - 101,110,97,109,101,215,0,0,0,115,6,0,0,0,16,7, - 4,1,255,128,122,24,122,105,112,105,109,112,111,114,116,101, - 114,46,103,101,116,95,102,105,108,101,110,97,109,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,126,0,0,0,116,0,124,0, - 124,1,131,2,125,2,124,2,100,1,117,0,114,36,116,1, - 100,2,124,1,155,2,157,2,124,1,100,3,141,2,130,1, - 116,2,124,0,124,1,131,2,125,3,124,2,114,64,116,3, - 160,4,124,3,100,4,161,2,125,4,110,10,124,3,155,0, - 100,5,157,2,125,4,122,14,124,0,106,5,124,4,25,0, - 125,5,87,0,110,20,4,0,116,6,121,108,1,0,1,0, - 1,0,89,0,100,1,83,0,119,0,116,7,124,0,106,8, - 124,5,131,2,160,9,161,0,83,0,41,6,122,253,103,101, - 116,95,115,111,117,114,99,101,40,102,117,108,108,110,97,109, - 101,41,32,45,62,32,115,111,117,114,99,101,32,115,116,114, - 105,110,103,46,10,10,32,32,32,32,32,32,32,32,82,101, - 116,117,114,110,32,116,104,101,32,115,111,117,114,99,101,32, - 99,111,100,101,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,46,32,82, - 97,105,115,101,32,90,105,112,73,109,112,111,114,116,69,114, - 114,111,114,10,32,32,32,32,32,32,32,32,105,102,32,116, - 104,101,32,109,111,100,117,108,101,32,99,111,117,108,100,110, - 39,116,32,98,101,32,102,111,117,110,100,44,32,114,101,116, - 117,114,110,32,78,111,110,101,32,105,102,32,116,104,101,32, - 97,114,99,104,105,118,101,32,100,111,101,115,10,32,32,32, - 32,32,32,32,32,99,111,110,116,97,105,110,32,116,104,101, - 32,109,111,100,117,108,101,44,32,98,117,116,32,104,97,115, - 32,110,111,32,115,111,117,114,99,101,32,102,111,114,32,105, - 116,46,10,32,32,32,32,32,32,32,32,78,250,18,99,97, - 110,39,116,32,102,105,110,100,32,109,111,100,117,108,101,32, - 169,1,114,44,0,0,0,250,11,95,95,105,110,105,116,95, - 95,46,112,121,250,3,46,112,121,41,10,114,35,0,0,0, - 114,3,0,0,0,114,36,0,0,0,114,21,0,0,0,114, - 30,0,0,0,114,28,0,0,0,114,26,0,0,0,114,56, - 0,0,0,114,29,0,0,0,218,6,100,101,99,111,100,101, - 41,6,114,32,0,0,0,114,38,0,0,0,114,39,0,0, - 0,114,13,0,0,0,218,8,102,117,108,108,112,97,116,104, - 114,58,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,218,10,103,101,116,95,115,111,117,114,99,101, - 226,0,0,0,115,26,0,0,0,10,7,8,1,18,1,10, - 2,4,1,14,1,10,2,2,2,14,1,12,1,8,2,16, - 1,255,128,122,22,122,105,112,105,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,0,0,0,0,3,0,0,0,4,0,0,0, - 67,0,0,0,115,40,0,0,0,116,0,124,0,124,1,131, - 2,125,2,124,2,100,1,117,0,114,36,116,1,100,2,124, - 1,155,2,157,2,124,1,100,3,141,2,130,1,124,2,83, - 0,41,4,122,171,105,115,95,112,97,99,107,97,103,101,40, - 102,117,108,108,110,97,109,101,41,32,45,62,32,98,111,111, - 108,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, - 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,109, - 111,100,117,108,101,32,115,112,101,99,105,102,105,101,100,32, - 98,121,32,102,117,108,108,110,97,109,101,32,105,115,32,97, - 32,112,97,99,107,97,103,101,46,10,32,32,32,32,32,32, - 32,32,82,97,105,115,101,32,90,105,112,73,109,112,111,114, - 116,69,114,114,111,114,32,105,102,32,116,104,101,32,109,111, - 100,117,108,101,32,99,111,117,108,100,110,39,116,32,98,101, - 32,102,111,117,110,100,46,10,32,32,32,32,32,32,32,32, - 78,114,61,0,0,0,114,62,0,0,0,41,2,114,35,0, - 0,0,114,3,0,0,0,41,3,114,32,0,0,0,114,38, - 0,0,0,114,39,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,114,43,0,0,0,252,0,0,0, - 115,10,0,0,0,10,6,8,1,18,1,4,1,255,128,122, - 22,122,105,112,105,109,112,111,114,116,101,114,46,105,115,95, - 112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,9,0,0,0,8,0,0,0,67,0,0,0, - 115,252,0,0,0,100,1,125,2,116,0,160,1,124,2,116, - 2,161,2,1,0,116,3,124,0,124,1,131,2,92,3,125, - 3,125,4,125,5,116,4,106,5,160,6,124,1,161,1,125, - 6,124,6,100,2,117,0,115,62,116,7,124,6,116,8,131, - 2,115,80,116,8,124,1,131,1,125,6,124,6,116,4,106, - 5,124,1,60,0,124,0,124,6,95,9,122,84,124,4,114, - 124,116,10,124,0,124,1,131,2,125,7,116,11,160,12,124, - 0,106,13,124,7,161,2,125,8,124,8,103,1,124,6,95, - 14,116,15,124,6,100,3,131,2,115,140,116,16,124,6,95, - 16,116,11,160,17,124,6,106,18,124,1,124,5,161,3,1, - 0,116,19,124,3,124,6,106,18,131,2,1,0,87,0,110, - 16,1,0,1,0,1,0,116,4,106,5,124,1,61,0,130, - 0,122,14,116,4,106,5,124,1,25,0,125,6,87,0,110, - 30,4,0,116,20,121,232,1,0,1,0,1,0,116,21,100, - 4,124,1,155,2,100,5,157,3,131,1,130,1,119,0,116, - 22,160,23,100,6,124,1,124,5,161,3,1,0,124,6,83, - 0,41,7,97,55,1,0,0,108,111,97,100,95,109,111,100, - 117,108,101,40,102,117,108,108,110,97,109,101,41,32,45,62, - 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, - 32,32,76,111,97,100,32,116,104,101,32,109,111,100,117,108, - 101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,39, - 102,117,108,108,110,97,109,101,39,46,32,39,102,117,108,108, - 110,97,109,101,39,32,109,117,115,116,32,98,101,32,116,104, - 101,10,32,32,32,32,32,32,32,32,102,117,108,108,121,32, - 113,117,97,108,105,102,105,101,100,32,40,100,111,116,116,101, - 100,41,32,109,111,100,117,108,101,32,110,97,109,101,46,32, - 73,116,32,114,101,116,117,114,110,115,32,116,104,101,32,105, - 109,112,111,114,116,101,100,10,32,32,32,32,32,32,32,32, - 109,111,100,117,108,101,44,32,111,114,32,114,97,105,115,101, - 115,32,90,105,112,73,109,112,111,114,116,69,114,114,111,114, - 32,105,102,32,105,116,32,119,97,115,110,39,116,32,102,111, - 117,110,100,46,10,10,32,32,32,32,32,32,32,32,68,101, - 112,114,101,99,97,116,101,100,32,115,105,110,99,101,32,80, - 121,116,104,111,110,32,51,46,49,48,46,32,85,115,101,32, - 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, - 115,116,101,97,100,46,10,32,32,32,32,32,32,32,32,122, - 114,122,105,112,105,109,112,111,114,116,46,122,105,112,105,109, - 112,111,114,116,101,114,46,108,111,97,100,95,109,111,100,117, - 108,101,40,41,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,32,97,110,100,32,115,108,97,116,101,100,32,102,111, - 114,32,114,101,109,111,118,97,108,32,105,110,32,80,121,116, - 104,111,110,32,51,46,49,50,59,32,117,115,101,32,101,120, - 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, - 101,97,100,78,218,12,95,95,98,117,105,108,116,105,110,115, - 95,95,122,14,76,111,97,100,101,100,32,109,111,100,117,108, - 101,32,122,25,32,110,111,116,32,102,111,117,110,100,32,105, - 110,32,115,121,115,46,109,111,100,117,108,101,115,122,30,105, - 109,112,111,114,116,32,123,125,32,35,32,108,111,97,100,101, - 100,32,102,114,111,109,32,90,105,112,32,123,125,41,24,218, - 9,95,119,97,114,110,105,110,103,115,90,4,119,97,114,110, - 218,18,68,101,112,114,101,99,97,116,105,111,110,87,97,114, - 110,105,110,103,114,48,0,0,0,218,3,115,121,115,218,7, - 109,111,100,117,108,101,115,218,3,103,101,116,114,15,0,0, - 0,218,12,95,109,111,100,117,108,101,95,116,121,112,101,218, - 10,95,95,108,111,97,100,101,114,95,95,114,36,0,0,0, - 114,21,0,0,0,114,30,0,0,0,114,29,0,0,0,90, - 8,95,95,112,97,116,104,95,95,218,7,104,97,115,97,116, - 116,114,114,68,0,0,0,90,14,95,102,105,120,95,117,112, - 95,109,111,100,117,108,101,218,8,95,95,100,105,99,116,95, - 95,218,4,101,120,101,99,114,26,0,0,0,218,11,73,109, - 112,111,114,116,69,114,114,111,114,114,45,0,0,0,218,16, - 95,118,101,114,98,111,115,101,95,109,101,115,115,97,103,101, - 41,9,114,32,0,0,0,114,38,0,0,0,218,3,109,115, - 103,114,50,0,0,0,114,51,0,0,0,114,40,0,0,0, - 90,3,109,111,100,114,13,0,0,0,114,66,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,11, - 108,111,97,100,95,109,111,100,117,108,101,9,1,0,0,115, - 54,0,0,0,4,9,12,2,16,1,12,1,18,1,8,1, - 10,1,6,1,2,2,4,1,10,3,14,1,8,1,10,2, - 6,1,16,1,16,1,6,1,8,1,2,1,2,2,14,1, - 12,1,18,1,14,1,4,1,255,128,122,23,122,105,112,105, - 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,0,0,0,0,0, - 3,0,0,0,8,0,0,0,67,0,0,0,115,64,0,0, - 0,122,20,124,0,160,0,124,1,161,1,115,18,87,0,100, - 1,83,0,87,0,110,20,4,0,116,1,121,40,1,0,1, - 0,1,0,89,0,100,1,83,0,119,0,100,2,100,3,108, - 2,109,3,125,2,1,0,124,2,124,0,124,1,131,2,83, - 0,41,4,122,204,82,101,116,117,114,110,32,116,104,101,32, - 82,101,115,111,117,114,99,101,82,101,97,100,101,114,32,102, - 111,114,32,97,32,112,97,99,107,97,103,101,32,105,110,32, - 97,32,122,105,112,32,102,105,108,101,46,10,10,32,32,32, - 32,32,32,32,32,73,102,32,39,102,117,108,108,110,97,109, - 101,39,32,105,115,32,97,32,112,97,99,107,97,103,101,32, - 119,105,116,104,105,110,32,116,104,101,32,122,105,112,32,102, - 105,108,101,44,32,114,101,116,117,114,110,32,116,104,101,10, - 32,32,32,32,32,32,32,32,39,82,101,115,111,117,114,99, - 101,82,101,97,100,101,114,39,32,111,98,106,101,99,116,32, - 102,111,114,32,116,104,101,32,112,97,99,107,97,103,101,46, - 32,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117, - 114,110,32,78,111,110,101,46,10,32,32,32,32,32,32,32, - 32,78,114,0,0,0,0,41,1,218,9,90,105,112,82,101, - 97,100,101,114,41,4,114,43,0,0,0,114,3,0,0,0, - 90,17,105,109,112,111,114,116,108,105,98,46,114,101,97,100, - 101,114,115,114,83,0,0,0,41,3,114,32,0,0,0,114, - 38,0,0,0,114,83,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,19,103,101,116,95,114,101, - 115,111,117,114,99,101,95,114,101,97,100,101,114,52,1,0, - 0,115,16,0,0,0,2,6,10,1,10,1,12,1,8,1, - 12,1,10,1,255,128,122,31,122,105,112,105,109,112,111,114, - 116,101,114,46,103,101,116,95,114,101,115,111,117,114,99,101, - 95,114,101,97,100,101,114,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,5,0,0,0,67,0,0,0, - 115,24,0,0,0,100,1,124,0,106,0,155,0,116,1,155, - 0,124,0,106,2,155,0,100,2,157,5,83,0,41,3,78, - 122,21,60,122,105,112,105,109,112,111,114,116,101,114,32,111, - 98,106,101,99,116,32,34,122,2,34,62,41,3,114,29,0, - 0,0,114,20,0,0,0,114,31,0,0,0,41,1,114,32, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,8,95,95,114,101,112,114,95,95,67,1,0,0, - 115,4,0,0,0,24,1,255,128,122,20,122,105,112,105,109, - 112,111,114,116,101,114,46,95,95,114,101,112,114,95,95,41, - 1,78,41,1,78,41,1,78,41,16,114,6,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,7,95,95,100,111,99, - 95,95,114,34,0,0,0,114,41,0,0,0,114,42,0,0, - 0,114,46,0,0,0,114,52,0,0,0,114,59,0,0,0, - 114,60,0,0,0,114,67,0,0,0,114,43,0,0,0,114, - 82,0,0,0,114,84,0,0,0,114,85,0,0,0,114,9, + 116,32,98,101,32,105,109,112,111,114,116,101,100,46,10,32, + 32,32,32,32,32,32,32,78,169,1,218,16,95,103,101,116, + 95,109,111,100,117,108,101,95,99,111,100,101,169,5,114,32, + 0,0,0,114,38,0,0,0,218,4,99,111,100,101,218,9, + 105,115,112,97,99,107,97,103,101,114,40,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,8,103, + 101,116,95,99,111,100,101,184,0,0,0,115,6,0,0,0, + 16,6,4,1,255,128,122,20,122,105,112,105,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,0,0,0,0,4,0,0,0,8,0,0, + 0,67,0,0,0,115,112,0,0,0,116,0,114,16,124,1, + 160,1,116,0,116,2,161,2,125,1,124,1,125,2,124,1, + 160,3,124,0,106,4,116,2,23,0,161,1,114,58,124,1, + 116,5,124,0,106,4,116,2,23,0,131,1,100,1,133,2, + 25,0,125,2,122,14,124,0,106,6,124,2,25,0,125,3, + 87,0,110,26,4,0,116,7,121,98,1,0,1,0,1,0, + 116,8,100,2,100,3,124,2,131,3,130,1,119,0,116,9, + 124,0,106,4,124,3,131,2,83,0,41,4,122,154,103,101, + 116,95,100,97,116,97,40,112,97,116,104,110,97,109,101,41, + 32,45,62,32,115,116,114,105,110,103,32,119,105,116,104,32, + 102,105,108,101,32,100,97,116,97,46,10,10,32,32,32,32, + 32,32,32,32,82,101,116,117,114,110,32,116,104,101,32,100, + 97,116,97,32,97,115,115,111,99,105,97,116,101,100,32,119, + 105,116,104,32,39,112,97,116,104,110,97,109,101,39,46,32, + 82,97,105,115,101,32,79,83,69,114,114,111,114,32,105,102, + 10,32,32,32,32,32,32,32,32,116,104,101,32,102,105,108, + 101,32,119,97,115,110,39,116,32,102,111,117,110,100,46,10, + 32,32,32,32,32,32,32,32,78,114,0,0,0,0,218,0, + 41,10,114,18,0,0,0,114,19,0,0,0,114,20,0,0, + 0,218,10,115,116,97,114,116,115,119,105,116,104,114,29,0, + 0,0,218,3,108,101,110,114,28,0,0,0,114,26,0,0, + 0,114,22,0,0,0,218,9,95,103,101,116,95,100,97,116, + 97,41,4,114,32,0,0,0,218,8,112,97,116,104,110,97, + 109,101,90,3,107,101,121,218,9,116,111,99,95,101,110,116, + 114,121,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,8,103,101,116,95,100,97,116,97,194,0,0,0,115, + 22,0,0,0,4,6,12,1,4,2,16,1,22,1,2,2, + 14,1,12,1,14,1,12,1,255,128,122,20,122,105,112,105, + 109,112,111,114,116,101,114,46,103,101,116,95,100,97,116,97, + 99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,3,0,0,0,67,0,0,0,115,20,0,0,0,116,0, + 124,0,124,1,131,2,92,3,125,2,125,3,125,4,124,4, + 83,0,41,2,122,165,103,101,116,95,102,105,108,101,110,97, + 109,101,40,102,117,108,108,110,97,109,101,41,32,45,62,32, + 102,105,108,101,110,97,109,101,32,115,116,114,105,110,103,46, + 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, + 32,116,104,101,32,102,105,108,101,110,97,109,101,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,111,114,32,114,97,105,115,101,32, + 90,105,112,73,109,112,111,114,116,69,114,114,111,114,10,32, + 32,32,32,32,32,32,32,105,102,32,105,116,32,99,111,117, + 108,100,110,39,116,32,98,101,32,105,109,112,111,114,116,101, + 100,46,10,32,32,32,32,32,32,32,32,78,114,47,0,0, + 0,114,49,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,12,103,101,116,95,102,105,108,101,110, + 97,109,101,215,0,0,0,115,6,0,0,0,16,8,4,1, + 255,128,122,24,122,105,112,105,109,112,111,114,116,101,114,46, + 103,101,116,95,102,105,108,101,110,97,109,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,8,0,0, + 0,67,0,0,0,115,126,0,0,0,116,0,124,0,124,1, + 131,2,125,2,124,2,100,1,117,0,114,36,116,1,100,2, + 124,1,155,2,157,2,124,1,100,3,141,2,130,1,116,2, + 124,0,124,1,131,2,125,3,124,2,114,64,116,3,160,4, + 124,3,100,4,161,2,125,4,110,10,124,3,155,0,100,5, + 157,2,125,4,122,14,124,0,106,5,124,4,25,0,125,5, + 87,0,110,20,4,0,116,6,121,108,1,0,1,0,1,0, + 89,0,100,1,83,0,119,0,116,7,124,0,106,8,124,5, + 131,2,160,9,161,0,83,0,41,6,122,253,103,101,116,95, + 115,111,117,114,99,101,40,102,117,108,108,110,97,109,101,41, + 32,45,62,32,115,111,117,114,99,101,32,115,116,114,105,110, + 103,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, + 114,110,32,116,104,101,32,115,111,117,114,99,101,32,99,111, + 100,101,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,46,32,82,97,105, + 115,101,32,90,105,112,73,109,112,111,114,116,69,114,114,111, + 114,10,32,32,32,32,32,32,32,32,105,102,32,116,104,101, + 32,109,111,100,117,108,101,32,99,111,117,108,100,110,39,116, + 32,98,101,32,102,111,117,110,100,44,32,114,101,116,117,114, + 110,32,78,111,110,101,32,105,102,32,116,104,101,32,97,114, + 99,104,105,118,101,32,100,111,101,115,10,32,32,32,32,32, + 32,32,32,99,111,110,116,97,105,110,32,116,104,101,32,109, + 111,100,117,108,101,44,32,98,117,116,32,104,97,115,32,110, + 111,32,115,111,117,114,99,101,32,102,111,114,32,105,116,46, + 10,32,32,32,32,32,32,32,32,78,250,18,99,97,110,39, + 116,32,102,105,110,100,32,109,111,100,117,108,101,32,169,1, + 114,44,0,0,0,250,11,95,95,105,110,105,116,95,95,46, + 112,121,250,3,46,112,121,41,10,114,35,0,0,0,114,3, + 0,0,0,114,36,0,0,0,114,21,0,0,0,114,30,0, + 0,0,114,28,0,0,0,114,26,0,0,0,114,56,0,0, + 0,114,29,0,0,0,218,6,100,101,99,111,100,101,41,6, + 114,32,0,0,0,114,38,0,0,0,114,39,0,0,0,114, + 13,0,0,0,218,8,102,117,108,108,112,97,116,104,114,58, 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,4,0,0,0,46,0,0,0,115,30,0,0,0, - 8,0,4,1,8,17,10,46,10,34,10,13,8,27,8,10, - 8,21,8,11,8,26,8,13,8,43,12,15,255,128,122,12, - 95,95,105,110,105,116,95,95,46,112,121,99,84,114,63,0, - 0,0,70,41,3,122,4,46,112,121,99,84,70,41,3,114, - 64,0,0,0,70,70,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, - 20,0,0,0,124,0,106,0,124,1,160,1,100,1,161,1, - 100,2,25,0,23,0,83,0,41,3,78,218,1,46,233,2, - 0,0,0,41,2,114,31,0,0,0,218,10,114,112,97,114, - 116,105,116,105,111,110,41,2,114,32,0,0,0,114,38,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,36,0,0,0,85,1,0,0,115,4,0,0,0,20, - 1,255,128,114,36,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, - 0,115,18,0,0,0,124,1,116,0,23,0,125,2,124,2, - 124,0,106,1,118,0,83,0,169,1,78,41,2,114,20,0, - 0,0,114,28,0,0,0,41,3,114,32,0,0,0,114,13, - 0,0,0,90,7,100,105,114,112,97,116,104,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,114,37,0,0,0, - 89,1,0,0,115,6,0,0,0,8,4,10,2,255,128,114, - 37,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,7,0,0,0,4,0,0,0,67,0,0,0,115,54,0, - 0,0,116,0,124,0,124,1,131,2,125,2,116,1,68,0, - 93,34,92,3,125,3,125,4,125,5,124,2,124,3,23,0, - 125,6,124,6,124,0,106,2,118,0,114,14,124,5,2,0, - 1,0,83,0,100,0,83,0,114,90,0,0,0,41,3,114, - 36,0,0,0,218,16,95,122,105,112,95,115,101,97,114,99, - 104,111,114,100,101,114,114,28,0,0,0,41,7,114,32,0, - 0,0,114,38,0,0,0,114,13,0,0,0,218,6,115,117, - 102,102,105,120,218,10,105,115,98,121,116,101,99,111,100,101, - 114,51,0,0,0,114,66,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,35,0,0,0,98,1, - 0,0,115,14,0,0,0,10,1,14,1,8,1,10,1,8, - 1,4,1,255,128,114,35,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,26,0,0,0,9,0,0,0,67, - 0,0,0,115,232,4,0,0,122,14,116,0,160,1,124,0, - 161,1,125,1,87,0,110,32,4,0,116,2,121,46,1,0, - 1,0,1,0,116,3,100,1,124,0,155,2,157,2,124,0, - 100,2,141,2,130,1,119,0,124,1,144,4,143,142,1,0, - 122,36,124,1,160,4,116,5,11,0,100,3,161,2,1,0, - 124,1,160,6,161,0,125,2,124,1,160,7,116,5,161,1, - 125,3,87,0,110,32,4,0,116,2,121,124,1,0,1,0, - 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,119,0,116,8,124,3,131,1,116,5,107,3, - 114,156,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,124,3,100,0,100,5,133,2,25,0,116,9, - 107,3,144,1,114,154,122,24,124,1,160,4,100,6,100,3, - 161,2,1,0,124,1,160,6,161,0,125,4,87,0,110,32, - 4,0,116,2,121,230,1,0,1,0,1,0,116,3,100,4, - 124,0,155,2,157,2,124,0,100,2,141,2,130,1,119,0, - 116,10,124,4,116,11,24,0,116,5,24,0,100,6,131,2, - 125,5,122,22,124,1,160,4,124,5,161,1,1,0,124,1, - 160,7,161,0,125,6,87,0,110,34,4,0,116,2,144,1, - 121,50,1,0,1,0,1,0,116,3,100,4,124,0,155,2, - 157,2,124,0,100,2,141,2,130,1,119,0,124,6,160,12, - 116,9,161,1,125,7,124,7,100,6,107,0,144,1,114,90, - 116,3,100,7,124,0,155,2,157,2,124,0,100,2,141,2, - 130,1,124,6,124,7,124,7,116,5,23,0,133,2,25,0, - 125,3,116,8,124,3,131,1,116,5,107,3,144,1,114,138, - 116,3,100,8,124,0,155,2,157,2,124,0,100,2,141,2, - 130,1,124,4,116,8,124,6,131,1,24,0,124,7,23,0, - 125,2,116,13,124,3,100,9,100,10,133,2,25,0,131,1, - 125,8,116,13,124,3,100,10,100,11,133,2,25,0,131,1, - 125,9,124,2,124,8,107,0,144,1,114,214,116,3,100,12, - 124,0,155,2,157,2,124,0,100,2,141,2,130,1,124,2, - 124,9,107,0,144,1,114,242,116,3,100,13,124,0,155,2, - 157,2,124,0,100,2,141,2,130,1,124,2,124,8,56,0, - 125,2,124,2,124,9,24,0,125,10,124,10,100,6,107,0, - 144,2,114,30,116,3,100,14,124,0,155,2,157,2,124,0, - 100,2,141,2,130,1,105,0,125,11,100,6,125,12,122,14, - 124,1,160,4,124,2,161,1,1,0,87,0,110,34,4,0, - 116,2,144,2,121,86,1,0,1,0,1,0,116,3,100,4, - 124,0,155,2,157,2,124,0,100,2,141,2,130,1,119,0, - 9,0,124,1,160,7,100,16,161,1,125,3,116,8,124,3, - 131,1,100,5,107,0,144,2,114,122,116,14,100,17,131,1, - 130,1,124,3,100,0,100,5,133,2,25,0,100,18,107,3, - 144,2,114,144,144,4,113,182,116,8,124,3,131,1,100,16, - 107,3,144,2,114,166,116,14,100,17,131,1,130,1,116,15, - 124,3,100,19,100,20,133,2,25,0,131,1,125,13,116,15, - 124,3,100,20,100,9,133,2,25,0,131,1,125,14,116,15, - 124,3,100,9,100,21,133,2,25,0,131,1,125,15,116,15, - 124,3,100,21,100,10,133,2,25,0,131,1,125,16,116,13, - 124,3,100,10,100,11,133,2,25,0,131,1,125,17,116,13, - 124,3,100,11,100,22,133,2,25,0,131,1,125,18,116,13, - 124,3,100,22,100,23,133,2,25,0,131,1,125,4,116,15, - 124,3,100,23,100,24,133,2,25,0,131,1,125,19,116,15, - 124,3,100,24,100,25,133,2,25,0,131,1,125,20,116,15, - 124,3,100,25,100,26,133,2,25,0,131,1,125,21,116,13, - 124,3,100,27,100,16,133,2,25,0,131,1,125,22,124,19, - 124,20,23,0,124,21,23,0,125,8,124,22,124,9,107,4, - 144,3,114,126,116,3,100,28,124,0,155,2,157,2,124,0, - 100,2,141,2,130,1,124,22,124,10,55,0,125,22,122,14, - 124,1,160,7,124,19,161,1,125,23,87,0,110,34,4,0, - 116,2,144,3,121,182,1,0,1,0,1,0,116,3,100,4, - 124,0,155,2,157,2,124,0,100,2,141,2,130,1,119,0, - 116,8,124,23,131,1,124,19,107,3,144,3,114,216,116,3, - 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, - 122,50,116,8,124,1,160,7,124,8,124,19,24,0,161,1, - 131,1,124,8,124,19,24,0,107,3,144,4,114,8,116,3, - 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, - 87,0,110,34,4,0,116,2,144,4,121,44,1,0,1,0, - 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,119,0,124,13,100,29,64,0,144,4,114,66, - 124,23,160,16,161,0,125,23,110,52,122,14,124,23,160,16, - 100,30,161,1,125,23,87,0,110,36,4,0,116,17,144,4, - 121,116,1,0,1,0,1,0,124,23,160,16,100,31,161,1, - 160,18,116,19,161,1,125,23,89,0,110,2,119,0,124,23, - 160,20,100,32,116,21,161,2,125,23,116,22,160,23,124,0, - 124,23,161,2,125,24,124,24,124,14,124,18,124,4,124,22, - 124,15,124,16,124,17,102,8,125,25,124,25,124,11,124,23, - 60,0,124,12,100,33,55,0,125,12,144,2,113,90,87,0, - 100,0,4,0,4,0,131,3,1,0,110,18,49,0,144,4, - 115,204,119,1,1,0,1,0,1,0,89,0,1,0,116,24, - 160,25,100,34,124,12,124,0,161,3,1,0,124,11,83,0, - 41,35,78,122,21,99,97,110,39,116,32,111,112,101,110,32, - 90,105,112,32,102,105,108,101,58,32,114,12,0,0,0,114, - 88,0,0,0,250,21,99,97,110,39,116,32,114,101,97,100, - 32,90,105,112,32,102,105,108,101,58,32,233,4,0,0,0, - 114,0,0,0,0,122,16,110,111,116,32,97,32,90,105,112, - 32,102,105,108,101,58,32,122,18,99,111,114,114,117,112,116, - 32,90,105,112,32,102,105,108,101,58,32,233,12,0,0,0, - 233,16,0,0,0,233,20,0,0,0,122,28,98,97,100,32, - 99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114, - 121,32,115,105,122,101,58,32,122,30,98,97,100,32,99,101, - 110,116,114,97,108,32,100,105,114,101,99,116,111,114,121,32, - 111,102,102,115,101,116,58,32,122,38,98,97,100,32,99,101, - 110,116,114,97,108,32,100,105,114,101,99,116,111,114,121,32, - 115,105,122,101,32,111,114,32,111,102,102,115,101,116,58,32, - 84,233,46,0,0,0,250,27,69,79,70,32,114,101,97,100, - 32,119,104,101,114,101,32,110,111,116,32,101,120,112,101,99, - 116,101,100,115,4,0,0,0,80,75,1,2,233,8,0,0, - 0,233,10,0,0,0,233,14,0,0,0,233,24,0,0,0, - 233,28,0,0,0,233,30,0,0,0,233,32,0,0,0,233, - 34,0,0,0,233,42,0,0,0,122,25,98,97,100,32,108, - 111,99,97,108,32,104,101,97,100,101,114,32,111,102,102,115, - 101,116,58,32,105,0,8,0,0,218,5,97,115,99,105,105, - 90,6,108,97,116,105,110,49,250,1,47,114,5,0,0,0, - 122,33,122,105,112,105,109,112,111,114,116,58,32,102,111,117, - 110,100,32,123,125,32,110,97,109,101,115,32,105,110,32,123, - 33,114,125,41,26,218,3,95,105,111,218,9,111,112,101,110, - 95,99,111,100,101,114,22,0,0,0,114,3,0,0,0,218, - 4,115,101,101,107,218,20,69,78,68,95,67,69,78,84,82, - 65,76,95,68,73,82,95,83,73,90,69,90,4,116,101,108, - 108,218,4,114,101,97,100,114,55,0,0,0,218,18,83,84, - 82,73,78,71,95,69,78,68,95,65,82,67,72,73,86,69, - 218,3,109,97,120,218,15,77,65,88,95,67,79,77,77,69, - 78,84,95,76,69,78,218,5,114,102,105,110,100,114,2,0, - 0,0,218,8,69,79,70,69,114,114,111,114,114,1,0,0, - 0,114,65,0,0,0,218,18,85,110,105,99,111,100,101,68, - 101,99,111,100,101,69,114,114,111,114,218,9,116,114,97,110, - 115,108,97,116,101,218,11,99,112,52,51,55,95,116,97,98, - 108,101,114,19,0,0,0,114,20,0,0,0,114,21,0,0, - 0,114,30,0,0,0,114,45,0,0,0,114,80,0,0,0, - 41,26,114,29,0,0,0,218,2,102,112,90,15,104,101,97, - 100,101,114,95,112,111,115,105,116,105,111,110,218,6,98,117, - 102,102,101,114,218,9,102,105,108,101,95,115,105,122,101,90, - 17,109,97,120,95,99,111,109,109,101,110,116,95,115,116,97, - 114,116,218,4,100,97,116,97,90,3,112,111,115,218,11,104, - 101,97,100,101,114,95,115,105,122,101,90,13,104,101,97,100, - 101,114,95,111,102,102,115,101,116,90,10,97,114,99,95,111, - 102,102,115,101,116,114,33,0,0,0,218,5,99,111,117,110, - 116,218,5,102,108,97,103,115,218,8,99,111,109,112,114,101, - 115,115,218,4,116,105,109,101,218,4,100,97,116,101,218,3, - 99,114,99,218,9,100,97,116,97,95,115,105,122,101,218,9, - 110,97,109,101,95,115,105,122,101,218,10,101,120,116,114,97, - 95,115,105,122,101,90,12,99,111,109,109,101,110,116,95,115, - 105,122,101,218,11,102,105,108,101,95,111,102,102,115,101,116, - 114,44,0,0,0,114,13,0,0,0,218,1,116,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,114,27,0,0, - 0,129,1,0,0,115,218,0,0,0,2,1,14,1,12,1, - 20,1,8,2,2,1,14,1,8,1,14,1,12,1,20,1, - 12,1,18,1,18,1,2,3,12,1,12,1,12,1,10,1, - 2,1,8,255,8,2,2,1,2,255,2,1,4,255,2,2, - 10,1,12,1,14,1,10,1,2,1,8,255,10,2,10,1, - 10,1,2,1,6,255,16,2,14,1,10,1,2,1,6,255, - 16,2,16,2,16,1,10,1,18,1,10,1,18,1,8,1, - 8,1,10,1,18,1,4,2,4,2,2,1,14,1,14,1, - 20,1,2,1,10,1,14,1,8,1,18,2,4,1,14,1, - 8,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1, - 16,1,16,1,16,1,16,1,12,1,10,1,18,1,8,1, - 2,2,14,1,14,1,20,1,14,1,18,1,2,4,28,1, - 22,1,14,1,20,1,10,2,10,2,2,3,14,1,14,1, - 22,1,12,2,12,1,20,1,8,1,8,1,36,202,14,55, - 4,1,255,128,114,27,0,0,0,117,190,1,0,0,0,1, - 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, - 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33, - 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49, - 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65, - 66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81, - 82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97, - 98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113, - 114,115,116,117,118,119,120,121,122,123,124,125,126,127,195,135, - 195,188,195,169,195,162,195,164,195,160,195,165,195,167,195,170, - 195,171,195,168,195,175,195,174,195,172,195,132,195,133,195,137, - 195,166,195,134,195,180,195,182,195,178,195,187,195,185,195,191, - 195,150,195,156,194,162,194,163,194,165,226,130,167,198,146,195, - 161,195,173,195,179,195,186,195,177,195,145,194,170,194,186,194, - 191,226,140,144,194,172,194,189,194,188,194,161,194,171,194,187, - 226,150,145,226,150,146,226,150,147,226,148,130,226,148,164,226, - 149,161,226,149,162,226,149,150,226,149,149,226,149,163,226,149, - 145,226,149,151,226,149,157,226,149,156,226,149,155,226,148,144, - 226,148,148,226,148,180,226,148,172,226,148,156,226,148,128,226, - 148,188,226,149,158,226,149,159,226,149,154,226,149,148,226,149, - 169,226,149,166,226,149,160,226,149,144,226,149,172,226,149,167, - 226,149,168,226,149,164,226,149,165,226,149,153,226,149,152,226, - 149,146,226,149,147,226,149,171,226,149,170,226,148,152,226,148, - 140,226,150,136,226,150,132,226,150,140,226,150,144,226,150,128, - 206,177,195,159,206,147,207,128,206,163,207,131,194,181,207,132, - 206,166,206,152,206,169,206,180,226,136,158,207,134,206,181,226, - 136,169,226,137,161,194,177,226,137,165,226,137,164,226,140,160, - 226,140,161,195,183,226,137,136,194,176,226,136,153,194,183,226, - 136,154,226,129,191,194,178,226,150,160,194,160,99,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,67,0,0,0,115,106,0,0,0,116,0,114,22,116,1, - 160,2,100,1,161,1,1,0,116,3,100,2,131,1,130,1, - 100,3,97,0,122,58,122,16,100,4,100,5,108,4,109,5, - 125,0,1,0,87,0,110,32,4,0,116,6,121,76,1,0, - 1,0,1,0,116,1,160,2,100,1,161,1,1,0,116,3, - 100,2,131,1,130,1,119,0,87,0,100,6,97,0,110,6, - 100,6,97,0,119,0,116,1,160,2,100,7,161,1,1,0, - 124,0,83,0,41,8,78,122,27,122,105,112,105,109,112,111, - 114,116,58,32,122,108,105,98,32,85,78,65,86,65,73,76, - 65,66,76,69,250,41,99,97,110,39,116,32,100,101,99,111, - 109,112,114,101,115,115,32,100,97,116,97,59,32,122,108,105, - 98,32,110,111,116,32,97,118,97,105,108,97,98,108,101,84, - 114,0,0,0,0,169,1,218,10,100,101,99,111,109,112,114, - 101,115,115,70,122,25,122,105,112,105,109,112,111,114,116,58, - 32,122,108,105,98,32,97,118,97,105,108,97,98,108,101,41, - 7,218,15,95,105,109,112,111,114,116,105,110,103,95,122,108, - 105,98,114,45,0,0,0,114,80,0,0,0,114,3,0,0, - 0,90,4,122,108,105,98,114,143,0,0,0,218,9,69,120, - 99,101,112,116,105,111,110,114,142,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,20,95,103,101, - 116,95,100,101,99,111,109,112,114,101,115,115,95,102,117,110, - 99,31,2,0,0,115,28,0,0,0,4,2,10,3,8,1, - 4,2,4,1,16,1,12,1,10,1,10,1,2,128,12,2, - 10,2,4,1,255,128,114,146,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,17,0,0,0,9,0,0,0, - 67,0,0,0,115,132,1,0,0,124,1,92,8,125,2,125, - 3,125,4,125,5,125,6,125,7,125,8,125,9,124,4,100, - 1,107,0,114,36,116,0,100,2,131,1,130,1,116,1,160, - 2,124,0,161,1,144,1,143,6,125,10,122,14,124,10,160, - 3,124,6,161,1,1,0,87,0,110,32,4,0,116,4,121, - 96,1,0,1,0,1,0,116,0,100,3,124,0,155,2,157, - 2,124,0,100,4,141,2,130,1,119,0,124,10,160,5,100, - 5,161,1,125,11,116,6,124,11,131,1,100,5,107,3,114, - 128,116,7,100,6,131,1,130,1,124,11,100,0,100,7,133, - 2,25,0,100,8,107,3,114,162,116,0,100,9,124,0,155, - 2,157,2,124,0,100,4,141,2,130,1,116,8,124,11,100, - 10,100,11,133,2,25,0,131,1,125,12,116,8,124,11,100, - 11,100,5,133,2,25,0,131,1,125,13,100,5,124,12,23, - 0,124,13,23,0,125,14,124,6,124,14,55,0,125,6,122, - 14,124,10,160,3,124,6,161,1,1,0,87,0,110,34,4, - 0,116,4,144,1,121,6,1,0,1,0,1,0,116,0,100, - 3,124,0,155,2,157,2,124,0,100,4,141,2,130,1,119, - 0,124,10,160,5,124,4,161,1,125,15,116,6,124,15,131, - 1,124,4,107,3,144,1,114,40,116,4,100,12,131,1,130, - 1,87,0,100,0,4,0,4,0,131,3,1,0,110,18,49, - 0,144,1,115,62,119,1,1,0,1,0,1,0,89,0,1, - 0,124,3,100,1,107,2,144,1,114,86,124,15,83,0,122, - 10,116,9,131,0,125,16,87,0,110,24,4,0,116,10,144, - 1,121,120,1,0,1,0,1,0,116,0,100,13,131,1,130, - 1,119,0,124,16,124,15,100,14,131,2,83,0,41,15,78, - 114,0,0,0,0,122,18,110,101,103,97,116,105,118,101,32, - 100,97,116,97,32,115,105,122,101,114,94,0,0,0,114,12, - 0,0,0,114,106,0,0,0,114,100,0,0,0,114,95,0, - 0,0,115,4,0,0,0,80,75,3,4,122,23,98,97,100, - 32,108,111,99,97,108,32,102,105,108,101,32,104,101,97,100, - 101,114,58,32,233,26,0,0,0,114,105,0,0,0,122,26, - 122,105,112,105,109,112,111,114,116,58,32,99,97,110,39,116, - 32,114,101,97,100,32,100,97,116,97,114,141,0,0,0,105, - 241,255,255,255,41,11,114,3,0,0,0,114,112,0,0,0, - 114,113,0,0,0,114,114,0,0,0,114,22,0,0,0,114, - 116,0,0,0,114,55,0,0,0,114,121,0,0,0,114,1, - 0,0,0,114,146,0,0,0,114,145,0,0,0,41,17,114, - 29,0,0,0,114,58,0,0,0,90,8,100,97,116,97,112, - 97,116,104,114,132,0,0,0,114,136,0,0,0,114,127,0, - 0,0,114,139,0,0,0,114,133,0,0,0,114,134,0,0, - 0,114,135,0,0,0,114,125,0,0,0,114,126,0,0,0, - 114,137,0,0,0,114,138,0,0,0,114,129,0,0,0,90, - 8,114,97,119,95,100,97,116,97,114,143,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,114,56,0, - 0,0,52,2,0,0,115,64,0,0,0,20,1,8,1,8, - 1,14,2,2,2,14,1,12,1,20,1,10,1,12,1,8, - 1,16,2,18,2,16,2,16,1,12,1,8,1,2,1,14, - 1,14,1,20,1,10,1,14,1,40,1,10,2,4,2,2, - 3,10,1,14,1,10,1,10,1,255,128,114,56,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,16,0,0,0,116,0, - 124,0,124,1,24,0,131,1,100,1,107,1,83,0,41,2, - 78,114,5,0,0,0,41,1,218,3,97,98,115,41,2,90, - 2,116,49,90,2,116,50,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,9,95,101,113,95,109,116,105,109, - 101,98,2,0,0,115,4,0,0,0,16,2,255,128,114,149, - 0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,0, - 14,0,0,0,8,0,0,0,67,0,0,0,115,60,1,0, - 0,124,3,124,2,100,1,156,2,125,5,122,18,116,0,160, - 1,124,4,124,3,124,5,161,3,125,6,87,0,110,20,4, - 0,116,2,121,48,1,0,1,0,1,0,89,0,100,0,83, - 0,119,0,124,6,100,2,64,0,100,3,107,3,125,7,124, - 7,114,182,124,6,100,4,64,0,100,3,107,3,125,8,116, - 3,106,4,100,5,107,3,144,1,114,10,124,8,115,106,116, - 3,106,4,100,6,107,2,144,1,114,10,116,5,124,0,124, - 2,131,2,125,9,124,9,100,0,117,1,144,1,114,10,116, - 3,160,6,116,0,106,7,124,9,161,2,125,10,122,20,116, - 0,160,8,124,4,124,10,124,3,124,5,161,4,1,0,87, - 0,110,104,4,0,116,2,121,180,1,0,1,0,1,0,89, - 0,100,0,83,0,119,0,116,9,124,0,124,2,131,2,92, - 2,125,11,125,12,124,11,144,1,114,10,116,10,116,11,124, - 4,100,7,100,8,133,2,25,0,131,1,124,11,131,2,114, - 246,116,11,124,4,100,8,100,9,133,2,25,0,131,1,124, - 12,107,3,144,1,114,10,116,12,160,13,100,10,124,3,155, - 2,157,2,161,1,1,0,100,0,83,0,116,14,160,15,124, - 4,100,9,100,0,133,2,25,0,161,1,125,13,116,16,124, - 13,116,17,131,2,144,1,115,56,116,18,100,11,124,1,155, - 2,100,12,157,3,131,1,130,1,124,13,83,0,41,13,78, - 41,2,114,44,0,0,0,114,13,0,0,0,114,5,0,0, - 0,114,0,0,0,0,114,88,0,0,0,90,5,110,101,118, - 101,114,90,6,97,108,119,97,121,115,114,101,0,0,0,114, - 96,0,0,0,114,97,0,0,0,122,22,98,121,116,101,99, - 111,100,101,32,105,115,32,115,116,97,108,101,32,102,111,114, - 32,122,16,99,111,109,112,105,108,101,100,32,109,111,100,117, - 108,101,32,122,21,32,105,115,32,110,111,116,32,97,32,99, - 111,100,101,32,111,98,106,101,99,116,41,19,114,21,0,0, - 0,90,13,95,99,108,97,115,115,105,102,121,95,112,121,99, - 114,79,0,0,0,218,4,95,105,109,112,90,21,99,104,101, - 99,107,95,104,97,115,104,95,98,97,115,101,100,95,112,121, - 99,115,218,15,95,103,101,116,95,112,121,99,95,115,111,117, - 114,99,101,218,11,115,111,117,114,99,101,95,104,97,115,104, - 90,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, - 66,69,82,90,18,95,118,97,108,105,100,97,116,101,95,104, - 97,115,104,95,112,121,99,218,29,95,103,101,116,95,109,116, - 105,109,101,95,97,110,100,95,115,105,122,101,95,111,102,95, - 115,111,117,114,99,101,114,149,0,0,0,114,2,0,0,0, - 114,45,0,0,0,114,80,0,0,0,218,7,109,97,114,115, - 104,97,108,90,5,108,111,97,100,115,114,15,0,0,0,218, - 10,95,99,111,100,101,95,116,121,112,101,218,9,84,121,112, - 101,69,114,114,111,114,41,14,114,32,0,0,0,114,57,0, - 0,0,114,66,0,0,0,114,38,0,0,0,114,128,0,0, - 0,90,11,101,120,99,95,100,101,116,97,105,108,115,114,131, - 0,0,0,90,10,104,97,115,104,95,98,97,115,101,100,90, - 12,99,104,101,99,107,95,115,111,117,114,99,101,90,12,115, - 111,117,114,99,101,95,98,121,116,101,115,114,152,0,0,0, - 90,12,115,111,117,114,99,101,95,109,116,105,109,101,90,11, - 115,111,117,114,99,101,95,115,105,122,101,114,50,0,0,0, + 0,0,218,10,103,101,116,95,115,111,117,114,99,101,227,0, + 0,0,115,26,0,0,0,10,7,8,1,18,1,10,2,4, + 1,14,1,10,2,2,2,14,1,12,1,8,2,16,1,255, + 128,122,22,122,105,112,105,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,0,0,0,0,3,0,0,0,4,0,0,0,67,0, + 0,0,115,40,0,0,0,116,0,124,0,124,1,131,2,125, + 2,124,2,100,1,117,0,114,36,116,1,100,2,124,1,155, + 2,157,2,124,1,100,3,141,2,130,1,124,2,83,0,41, + 4,122,171,105,115,95,112,97,99,107,97,103,101,40,102,117, + 108,108,110,97,109,101,41,32,45,62,32,98,111,111,108,46, + 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, + 32,84,114,117,101,32,105,102,32,116,104,101,32,109,111,100, + 117,108,101,32,115,112,101,99,105,102,105,101,100,32,98,121, + 32,102,117,108,108,110,97,109,101,32,105,115,32,97,32,112, + 97,99,107,97,103,101,46,10,32,32,32,32,32,32,32,32, + 82,97,105,115,101,32,90,105,112,73,109,112,111,114,116,69, + 114,114,111,114,32,105,102,32,116,104,101,32,109,111,100,117, + 108,101,32,99,111,117,108,100,110,39,116,32,98,101,32,102, + 111,117,110,100,46,10,32,32,32,32,32,32,32,32,78,114, + 61,0,0,0,114,62,0,0,0,41,2,114,35,0,0,0, + 114,3,0,0,0,41,3,114,32,0,0,0,114,38,0,0, + 0,114,39,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,43,0,0,0,253,0,0,0,115,10, + 0,0,0,10,6,8,1,18,1,4,1,255,128,122,22,122, + 105,112,105,109,112,111,114,116,101,114,46,105,115,95,112,97, + 99,107,97,103,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,9,0,0,0,8,0,0,0,67,0,0,0,115,252, + 0,0,0,100,1,125,2,116,0,160,1,124,2,116,2,161, + 2,1,0,116,3,124,0,124,1,131,2,92,3,125,3,125, + 4,125,5,116,4,106,5,160,6,124,1,161,1,125,6,124, + 6,100,2,117,0,115,62,116,7,124,6,116,8,131,2,115, + 80,116,8,124,1,131,1,125,6,124,6,116,4,106,5,124, + 1,60,0,124,0,124,6,95,9,122,84,124,4,114,124,116, + 10,124,0,124,1,131,2,125,7,116,11,160,12,124,0,106, + 13,124,7,161,2,125,8,124,8,103,1,124,6,95,14,116, + 15,124,6,100,3,131,2,115,140,116,16,124,6,95,16,116, + 11,160,17,124,6,106,18,124,1,124,5,161,3,1,0,116, + 19,124,3,124,6,106,18,131,2,1,0,87,0,110,16,1, + 0,1,0,1,0,116,4,106,5,124,1,61,0,130,0,122, + 14,116,4,106,5,124,1,25,0,125,6,87,0,110,30,4, + 0,116,20,121,232,1,0,1,0,1,0,116,21,100,4,124, + 1,155,2,100,5,157,3,131,1,130,1,119,0,116,22,160, + 23,100,6,124,1,124,5,161,3,1,0,124,6,83,0,41, + 7,97,64,1,0,0,108,111,97,100,95,109,111,100,117,108, + 101,40,102,117,108,108,110,97,109,101,41,32,45,62,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 76,111,97,100,32,116,104,101,32,109,111,100,117,108,101,32, + 115,112,101,99,105,102,105,101,100,32,98,121,32,39,102,117, + 108,108,110,97,109,101,39,46,32,39,102,117,108,108,110,97, + 109,101,39,32,109,117,115,116,32,98,101,32,116,104,101,10, + 32,32,32,32,32,32,32,32,102,117,108,108,121,32,113,117, + 97,108,105,102,105,101,100,32,40,100,111,116,116,101,100,41, + 32,109,111,100,117,108,101,32,110,97,109,101,46,32,73,116, + 32,114,101,116,117,114,110,115,32,116,104,101,32,105,109,112, + 111,114,116,101,100,10,32,32,32,32,32,32,32,32,109,111, + 100,117,108,101,44,32,111,114,32,114,97,105,115,101,115,32, + 90,105,112,73,109,112,111,114,116,69,114,114,111,114,32,105, + 102,32,105,116,32,99,111,117,108,100,32,110,111,116,32,98, + 101,32,105,109,112,111,114,116,101,100,46,10,10,32,32,32, + 32,32,32,32,32,68,101,112,114,101,99,97,116,101,100,32, + 115,105,110,99,101,32,80,121,116,104,111,110,32,51,46,49, + 48,46,32,85,115,101,32,101,120,101,99,95,109,111,100,117, + 108,101,40,41,32,105,110,115,116,101,97,100,46,10,32,32, + 32,32,32,32,32,32,122,114,122,105,112,105,109,112,111,114, + 116,46,122,105,112,105,109,112,111,114,116,101,114,46,108,111, + 97,100,95,109,111,100,117,108,101,40,41,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,32,97,110,100,32,115,108, + 97,116,101,100,32,102,111,114,32,114,101,109,111,118,97,108, + 32,105,110,32,80,121,116,104,111,110,32,51,46,49,50,59, + 32,117,115,101,32,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,105,110,115,116,101,97,100,78,218,12,95,95,98, + 117,105,108,116,105,110,115,95,95,122,14,76,111,97,100,101, + 100,32,109,111,100,117,108,101,32,122,25,32,110,111,116,32, + 102,111,117,110,100,32,105,110,32,115,121,115,46,109,111,100, + 117,108,101,115,122,30,105,109,112,111,114,116,32,123,125,32, + 35,32,108,111,97,100,101,100,32,102,114,111,109,32,90,105, + 112,32,123,125,41,24,218,9,95,119,97,114,110,105,110,103, + 115,90,4,119,97,114,110,218,18,68,101,112,114,101,99,97, + 116,105,111,110,87,97,114,110,105,110,103,114,48,0,0,0, + 218,3,115,121,115,218,7,109,111,100,117,108,101,115,218,3, + 103,101,116,114,15,0,0,0,218,12,95,109,111,100,117,108, + 101,95,116,121,112,101,218,10,95,95,108,111,97,100,101,114, + 95,95,114,36,0,0,0,114,21,0,0,0,114,30,0,0, + 0,114,29,0,0,0,90,8,95,95,112,97,116,104,95,95, + 218,7,104,97,115,97,116,116,114,114,68,0,0,0,90,14, + 95,102,105,120,95,117,112,95,109,111,100,117,108,101,218,8, + 95,95,100,105,99,116,95,95,218,4,101,120,101,99,114,26, + 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, + 114,45,0,0,0,218,16,95,118,101,114,98,111,115,101,95, + 109,101,115,115,97,103,101,41,9,114,32,0,0,0,114,38, + 0,0,0,218,3,109,115,103,114,50,0,0,0,114,51,0, + 0,0,114,40,0,0,0,90,3,109,111,100,114,13,0,0, + 0,114,66,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,11,108,111,97,100,95,109,111,100,117, + 108,101,10,1,0,0,115,54,0,0,0,4,9,12,2,16, + 1,12,1,18,1,8,1,10,1,6,1,2,2,4,1,10, + 3,14,1,8,1,10,2,6,1,16,1,16,1,6,1,8, + 1,2,1,2,2,14,1,12,1,18,1,14,1,4,1,255, + 128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,64,0,0,0,122,20,124,0,160,0,124,1, + 161,1,115,18,87,0,100,1,83,0,87,0,110,20,4,0, + 116,1,121,40,1,0,1,0,1,0,89,0,100,1,83,0, + 119,0,100,2,100,3,108,2,109,3,125,2,1,0,124,2, + 124,0,124,1,131,2,83,0,41,4,122,204,82,101,116,117, + 114,110,32,116,104,101,32,82,101,115,111,117,114,99,101,82, + 101,97,100,101,114,32,102,111,114,32,97,32,112,97,99,107, + 97,103,101,32,105,110,32,97,32,122,105,112,32,102,105,108, + 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,39, + 102,117,108,108,110,97,109,101,39,32,105,115,32,97,32,112, + 97,99,107,97,103,101,32,119,105,116,104,105,110,32,116,104, + 101,32,122,105,112,32,102,105,108,101,44,32,114,101,116,117, + 114,110,32,116,104,101,10,32,32,32,32,32,32,32,32,39, + 82,101,115,111,117,114,99,101,82,101,97,100,101,114,39,32, + 111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,112, + 97,99,107,97,103,101,46,32,32,79,116,104,101,114,119,105, + 115,101,32,114,101,116,117,114,110,32,78,111,110,101,46,10, + 32,32,32,32,32,32,32,32,78,114,0,0,0,0,41,1, + 218,9,90,105,112,82,101,97,100,101,114,41,4,114,43,0, + 0,0,114,3,0,0,0,90,17,105,109,112,111,114,116,108, + 105,98,46,114,101,97,100,101,114,115,114,83,0,0,0,41, + 3,114,32,0,0,0,114,38,0,0,0,114,83,0,0,0, 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 15,95,117,110,109,97,114,115,104,97,108,95,99,111,100,101, - 108,2,0,0,115,84,0,0,0,2,2,2,1,6,254,2, - 5,18,1,12,1,8,1,12,2,4,1,12,1,12,1,2, - 1,2,255,8,1,4,255,10,2,10,1,4,1,4,1,2, - 1,4,254,2,5,4,1,8,1,8,255,12,2,8,1,8, - 3,6,255,6,3,22,3,18,1,4,255,4,2,8,1,4, - 255,4,2,18,2,12,1,16,1,4,1,255,128,114,157,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,4,0,0,0,67,0,0,0,115,28,0,0,0, - 124,0,160,0,100,1,100,2,161,2,125,0,124,0,160,0, - 100,3,100,2,161,2,125,0,124,0,83,0,41,4,78,115, - 2,0,0,0,13,10,243,1,0,0,0,10,243,1,0,0, - 0,13,41,1,114,19,0,0,0,41,1,218,6,115,111,117, - 114,99,101,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,23,95,110,111,114,109,97,108,105,122,101,95,108, - 105,110,101,95,101,110,100,105,110,103,115,159,2,0,0,115, - 8,0,0,0,12,1,12,1,4,1,255,128,114,161,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,6,0,0,0,67,0,0,0,115,24,0,0,0,116, - 0,124,1,131,1,125,1,116,1,124,1,124,0,100,1,100, - 2,100,3,141,4,83,0,41,4,78,114,78,0,0,0,84, - 41,1,90,12,100,111,110,116,95,105,110,104,101,114,105,116, - 41,2,114,161,0,0,0,218,7,99,111,109,112,105,108,101, - 41,2,114,57,0,0,0,114,160,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,15,95,99,111, - 109,112,105,108,101,95,115,111,117,114,99,101,166,2,0,0, - 115,6,0,0,0,8,1,16,1,255,128,114,163,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,11,0,0,0,67,0,0,0,115,68,0,0,0,116,0, - 160,1,124,0,100,1,63,0,100,2,23,0,124,0,100,3, - 63,0,100,4,64,0,124,0,100,5,64,0,124,1,100,6, - 63,0,124,1,100,3,63,0,100,7,64,0,124,1,100,5, - 64,0,100,8,20,0,100,9,100,9,100,9,102,9,161,1, - 83,0,41,10,78,233,9,0,0,0,105,188,7,0,0,233, - 5,0,0,0,233,15,0,0,0,233,31,0,0,0,233,11, - 0,0,0,233,63,0,0,0,114,88,0,0,0,114,14,0, - 0,0,41,2,114,133,0,0,0,90,6,109,107,116,105,109, - 101,41,2,218,1,100,114,140,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,14,95,112,97,114, - 115,101,95,100,111,115,116,105,109,101,172,2,0,0,115,20, - 0,0,0,4,1,10,1,10,1,6,1,6,1,10,1,10, - 1,6,1,6,249,255,128,114,171,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,10,0,0, - 0,67,0,0,0,115,110,0,0,0,122,82,124,1,100,1, - 100,0,133,2,25,0,100,2,118,0,115,22,74,0,130,1, - 124,1,100,0,100,1,133,2,25,0,125,1,124,0,106,0, - 124,1,25,0,125,2,124,2,100,3,25,0,125,3,124,2, - 100,4,25,0,125,4,124,2,100,5,25,0,125,5,116,1, - 124,4,124,3,131,2,124,5,102,2,87,0,83,0,4,0, - 116,2,116,3,116,4,102,3,121,108,1,0,1,0,1,0, - 89,0,100,6,83,0,119,0,41,7,78,114,14,0,0,0, - 169,2,218,1,99,218,1,111,114,165,0,0,0,233,6,0, - 0,0,233,3,0,0,0,41,2,114,0,0,0,0,114,0, - 0,0,0,41,5,114,28,0,0,0,114,171,0,0,0,114, - 26,0,0,0,218,10,73,110,100,101,120,69,114,114,111,114, - 114,156,0,0,0,41,6,114,32,0,0,0,114,13,0,0, - 0,114,58,0,0,0,114,133,0,0,0,114,134,0,0,0, - 90,17,117,110,99,111,109,112,114,101,115,115,101,100,95,115, - 105,122,101,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,153,0,0,0,185,2,0,0,115,22,0,0,0, - 2,1,20,2,12,1,10,1,8,3,8,1,8,1,16,1, - 18,1,8,1,255,128,114,153,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0, - 67,0,0,0,115,80,0,0,0,124,1,100,1,100,0,133, - 2,25,0,100,2,118,0,115,20,74,0,130,1,124,1,100, - 0,100,1,133,2,25,0,125,1,122,14,124,0,106,0,124, - 1,25,0,125,2,87,0,110,20,4,0,116,1,121,66,1, - 0,1,0,1,0,89,0,100,0,83,0,119,0,116,2,124, - 0,106,3,124,2,131,2,83,0,41,3,78,114,14,0,0, - 0,114,172,0,0,0,41,4,114,28,0,0,0,114,26,0, - 0,0,114,56,0,0,0,114,29,0,0,0,41,3,114,32, - 0,0,0,114,13,0,0,0,114,58,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,114,151,0,0, - 0,204,2,0,0,115,16,0,0,0,20,2,12,1,2,2, - 14,1,12,1,8,1,12,2,255,128,114,151,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0, - 9,0,0,0,67,0,0,0,115,190,0,0,0,116,0,124, - 0,124,1,131,2,125,2,116,1,68,0,93,156,92,3,125, - 3,125,4,125,5,124,2,124,3,23,0,125,6,116,2,106, - 3,100,1,124,0,106,4,116,5,124,6,100,2,100,3,141, - 5,1,0,122,14,124,0,106,6,124,6,25,0,125,7,87, - 0,110,18,4,0,116,7,121,86,1,0,1,0,1,0,89, - 0,113,14,119,0,124,7,100,4,25,0,125,8,116,8,124, - 0,106,4,124,7,131,2,125,9,124,4,114,130,116,9,124, - 0,124,8,124,6,124,1,124,9,131,5,125,10,110,10,116, - 10,124,8,124,9,131,2,125,10,124,10,100,0,117,0,114, - 150,113,14,124,7,100,4,25,0,125,8,124,10,124,5,124, - 8,102,3,2,0,1,0,83,0,116,11,100,5,124,1,155, - 2,157,2,124,1,100,6,141,2,130,1,41,7,78,122,13, - 116,114,121,105,110,103,32,123,125,123,125,123,125,114,88,0, - 0,0,41,1,90,9,118,101,114,98,111,115,105,116,121,114, - 0,0,0,0,114,61,0,0,0,114,62,0,0,0,41,12, + 19,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, + 97,100,101,114,53,1,0,0,115,16,0,0,0,2,6,10, + 1,10,1,12,1,8,1,12,1,10,1,255,128,122,31,122, + 105,112,105,109,112,111,114,116,101,114,46,103,101,116,95,114, + 101,115,111,117,114,99,101,95,114,101,97,100,101,114,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5, + 0,0,0,67,0,0,0,115,24,0,0,0,100,1,124,0, + 106,0,155,0,116,1,155,0,124,0,106,2,155,0,100,2, + 157,5,83,0,41,3,78,122,21,60,122,105,112,105,109,112, + 111,114,116,101,114,32,111,98,106,101,99,116,32,34,122,2, + 34,62,41,3,114,29,0,0,0,114,20,0,0,0,114,31, + 0,0,0,41,1,114,32,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,8,95,95,114,101,112, + 114,95,95,68,1,0,0,115,4,0,0,0,24,1,255,128, + 122,20,122,105,112,105,109,112,111,114,116,101,114,46,95,95, + 114,101,112,114,95,95,41,1,78,41,1,78,41,1,78,41, + 16,114,6,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,7,95,95,100,111,99,95,95,114,34,0,0,0,114,41, + 0,0,0,114,42,0,0,0,114,46,0,0,0,114,52,0, + 0,0,114,59,0,0,0,114,60,0,0,0,114,67,0,0, + 0,114,43,0,0,0,114,82,0,0,0,114,84,0,0,0, + 114,85,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,4,0,0,0,46,0, + 0,0,115,30,0,0,0,8,0,4,1,8,17,10,46,10, + 34,10,13,8,27,8,10,8,21,8,12,8,26,8,13,8, + 43,12,15,255,128,122,12,95,95,105,110,105,116,95,95,46, + 112,121,99,84,114,63,0,0,0,70,41,3,122,4,46,112, + 121,99,84,70,41,3,114,64,0,0,0,70,70,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,67,0,0,0,115,20,0,0,0,124,0,106,0,124, + 1,160,1,100,1,161,1,100,2,25,0,23,0,83,0,41, + 3,78,218,1,46,233,2,0,0,0,41,2,114,31,0,0, + 0,218,10,114,112,97,114,116,105,116,105,111,110,41,2,114, + 32,0,0,0,114,38,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,36,0,0,0,86,1,0, + 0,115,4,0,0,0,20,1,255,128,114,36,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 2,0,0,0,67,0,0,0,115,18,0,0,0,124,1,116, + 0,23,0,125,2,124,2,124,0,106,1,118,0,83,0,169, + 1,78,41,2,114,20,0,0,0,114,28,0,0,0,41,3, + 114,32,0,0,0,114,13,0,0,0,90,7,100,105,114,112, + 97,116,104,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,37,0,0,0,90,1,0,0,115,6,0,0,0, + 8,4,10,2,255,128,114,37,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,7,0,0,0,4,0,0,0, + 67,0,0,0,115,54,0,0,0,116,0,124,0,124,1,131, + 2,125,2,116,1,68,0,93,34,92,3,125,3,125,4,125, + 5,124,2,124,3,23,0,125,6,124,6,124,0,106,2,118, + 0,114,14,124,5,2,0,1,0,83,0,100,0,83,0,114, + 90,0,0,0,41,3,114,36,0,0,0,218,16,95,122,105, + 112,95,115,101,97,114,99,104,111,114,100,101,114,114,28,0, + 0,0,41,7,114,32,0,0,0,114,38,0,0,0,114,13, + 0,0,0,218,6,115,117,102,102,105,120,218,10,105,115,98, + 121,116,101,99,111,100,101,114,51,0,0,0,114,66,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,35,0,0,0,99,1,0,0,115,14,0,0,0,10,1, + 14,1,8,1,10,1,8,1,4,1,255,128,114,35,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,26,0, + 0,0,9,0,0,0,67,0,0,0,115,232,4,0,0,122, + 14,116,0,160,1,124,0,161,1,125,1,87,0,110,32,4, + 0,116,2,121,46,1,0,1,0,1,0,116,3,100,1,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,119,0,124, + 1,144,4,143,142,1,0,122,36,124,1,160,4,116,5,11, + 0,100,3,161,2,1,0,124,1,160,6,161,0,125,2,124, + 1,160,7,116,5,161,1,125,3,87,0,110,32,4,0,116, + 2,121,124,1,0,1,0,1,0,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,119,0,116,8,124, + 3,131,1,116,5,107,3,114,156,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,124,3,100,0,100, + 5,133,2,25,0,116,9,107,3,144,1,114,154,122,24,124, + 1,160,4,100,6,100,3,161,2,1,0,124,1,160,6,161, + 0,125,4,87,0,110,32,4,0,116,2,121,230,1,0,1, + 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,119,0,116,10,124,4,116,11,24,0,116, + 5,24,0,100,6,131,2,125,5,122,22,124,1,160,4,124, + 5,161,1,1,0,124,1,160,7,161,0,125,6,87,0,110, + 34,4,0,116,2,144,1,121,50,1,0,1,0,1,0,116, + 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,119,0,124,6,160,12,116,9,161,1,125,7,124,7,100, + 6,107,0,144,1,114,90,116,3,100,7,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,124,6,124,7,124,7,116, + 5,23,0,133,2,25,0,125,3,116,8,124,3,131,1,116, + 5,107,3,144,1,114,138,116,3,100,8,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,124,4,116,8,124,6,131, + 1,24,0,124,7,23,0,125,2,116,13,124,3,100,9,100, + 10,133,2,25,0,131,1,125,8,116,13,124,3,100,10,100, + 11,133,2,25,0,131,1,125,9,124,2,124,8,107,0,144, + 1,114,214,116,3,100,12,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,124,2,124,9,107,0,144,1,114,242,116, + 3,100,13,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,124,2,124,8,56,0,125,2,124,2,124,9,24,0,125, + 10,124,10,100,6,107,0,144,2,114,30,116,3,100,14,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,105,0,125, + 11,100,6,125,12,122,14,124,1,160,4,124,2,161,1,1, + 0,87,0,110,34,4,0,116,2,144,2,121,86,1,0,1, + 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,119,0,9,0,124,1,160,7,100,16,161, + 1,125,3,116,8,124,3,131,1,100,5,107,0,144,2,114, + 122,116,14,100,17,131,1,130,1,124,3,100,0,100,5,133, + 2,25,0,100,18,107,3,144,2,114,144,144,4,113,182,116, + 8,124,3,131,1,100,16,107,3,144,2,114,166,116,14,100, + 17,131,1,130,1,116,15,124,3,100,19,100,20,133,2,25, + 0,131,1,125,13,116,15,124,3,100,20,100,9,133,2,25, + 0,131,1,125,14,116,15,124,3,100,9,100,21,133,2,25, + 0,131,1,125,15,116,15,124,3,100,21,100,10,133,2,25, + 0,131,1,125,16,116,13,124,3,100,10,100,11,133,2,25, + 0,131,1,125,17,116,13,124,3,100,11,100,22,133,2,25, + 0,131,1,125,18,116,13,124,3,100,22,100,23,133,2,25, + 0,131,1,125,4,116,15,124,3,100,23,100,24,133,2,25, + 0,131,1,125,19,116,15,124,3,100,24,100,25,133,2,25, + 0,131,1,125,20,116,15,124,3,100,25,100,26,133,2,25, + 0,131,1,125,21,116,13,124,3,100,27,100,16,133,2,25, + 0,131,1,125,22,124,19,124,20,23,0,124,21,23,0,125, + 8,124,22,124,9,107,4,144,3,114,126,116,3,100,28,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,124,22,124, + 10,55,0,125,22,122,14,124,1,160,7,124,19,161,1,125, + 23,87,0,110,34,4,0,116,2,144,3,121,182,1,0,1, + 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,119,0,116,8,124,23,131,1,124,19,107, + 3,144,3,114,216,116,3,100,4,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,122,50,116,8,124,1,160,7,124, + 8,124,19,24,0,161,1,131,1,124,8,124,19,24,0,107, + 3,144,4,114,8,116,3,100,4,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,87,0,110,34,4,0,116,2,144, + 4,121,44,1,0,1,0,1,0,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,119,0,124,13,100, + 29,64,0,144,4,114,66,124,23,160,16,161,0,125,23,110, + 52,122,14,124,23,160,16,100,30,161,1,125,23,87,0,110, + 36,4,0,116,17,144,4,121,116,1,0,1,0,1,0,124, + 23,160,16,100,31,161,1,160,18,116,19,161,1,125,23,89, + 0,110,2,119,0,124,23,160,20,100,32,116,21,161,2,125, + 23,116,22,160,23,124,0,124,23,161,2,125,24,124,24,124, + 14,124,18,124,4,124,22,124,15,124,16,124,17,102,8,125, + 25,124,25,124,11,124,23,60,0,124,12,100,33,55,0,125, + 12,144,2,113,90,87,0,100,0,4,0,4,0,131,3,1, + 0,110,18,49,0,144,4,115,204,119,1,1,0,1,0,1, + 0,89,0,1,0,116,24,160,25,100,34,124,12,124,0,161, + 3,1,0,124,11,83,0,41,35,78,122,21,99,97,110,39, + 116,32,111,112,101,110,32,90,105,112,32,102,105,108,101,58, + 32,114,12,0,0,0,114,88,0,0,0,250,21,99,97,110, + 39,116,32,114,101,97,100,32,90,105,112,32,102,105,108,101, + 58,32,233,4,0,0,0,114,0,0,0,0,122,16,110,111, + 116,32,97,32,90,105,112,32,102,105,108,101,58,32,122,18, + 99,111,114,114,117,112,116,32,90,105,112,32,102,105,108,101, + 58,32,233,12,0,0,0,233,16,0,0,0,233,20,0,0, + 0,122,28,98,97,100,32,99,101,110,116,114,97,108,32,100, + 105,114,101,99,116,111,114,121,32,115,105,122,101,58,32,122, + 30,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, + 101,99,116,111,114,121,32,111,102,102,115,101,116,58,32,122, + 38,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, + 101,99,116,111,114,121,32,115,105,122,101,32,111,114,32,111, + 102,102,115,101,116,58,32,84,233,46,0,0,0,250,27,69, + 79,70,32,114,101,97,100,32,119,104,101,114,101,32,110,111, + 116,32,101,120,112,101,99,116,101,100,115,4,0,0,0,80, + 75,1,2,233,8,0,0,0,233,10,0,0,0,233,14,0, + 0,0,233,24,0,0,0,233,28,0,0,0,233,30,0,0, + 0,233,32,0,0,0,233,34,0,0,0,233,42,0,0,0, + 122,25,98,97,100,32,108,111,99,97,108,32,104,101,97,100, + 101,114,32,111,102,102,115,101,116,58,32,105,0,8,0,0, + 218,5,97,115,99,105,105,90,6,108,97,116,105,110,49,250, + 1,47,114,5,0,0,0,122,33,122,105,112,105,109,112,111, + 114,116,58,32,102,111,117,110,100,32,123,125,32,110,97,109, + 101,115,32,105,110,32,123,33,114,125,41,26,218,3,95,105, + 111,218,9,111,112,101,110,95,99,111,100,101,114,22,0,0, + 0,114,3,0,0,0,218,4,115,101,101,107,218,20,69,78, + 68,95,67,69,78,84,82,65,76,95,68,73,82,95,83,73, + 90,69,90,4,116,101,108,108,218,4,114,101,97,100,114,55, + 0,0,0,218,18,83,84,82,73,78,71,95,69,78,68,95, + 65,82,67,72,73,86,69,218,3,109,97,120,218,15,77,65, + 88,95,67,79,77,77,69,78,84,95,76,69,78,218,5,114, + 102,105,110,100,114,2,0,0,0,218,8,69,79,70,69,114, + 114,111,114,114,1,0,0,0,114,65,0,0,0,218,18,85, + 110,105,99,111,100,101,68,101,99,111,100,101,69,114,114,111, + 114,218,9,116,114,97,110,115,108,97,116,101,218,11,99,112, + 52,51,55,95,116,97,98,108,101,114,19,0,0,0,114,20, + 0,0,0,114,21,0,0,0,114,30,0,0,0,114,45,0, + 0,0,114,80,0,0,0,41,26,114,29,0,0,0,218,2, + 102,112,90,15,104,101,97,100,101,114,95,112,111,115,105,116, + 105,111,110,218,6,98,117,102,102,101,114,218,9,102,105,108, + 101,95,115,105,122,101,90,17,109,97,120,95,99,111,109,109, + 101,110,116,95,115,116,97,114,116,218,4,100,97,116,97,90, + 3,112,111,115,218,11,104,101,97,100,101,114,95,115,105,122, + 101,90,13,104,101,97,100,101,114,95,111,102,102,115,101,116, + 90,10,97,114,99,95,111,102,102,115,101,116,114,33,0,0, + 0,218,5,99,111,117,110,116,218,5,102,108,97,103,115,218, + 8,99,111,109,112,114,101,115,115,218,4,116,105,109,101,218, + 4,100,97,116,101,218,3,99,114,99,218,9,100,97,116,97, + 95,115,105,122,101,218,9,110,97,109,101,95,115,105,122,101, + 218,10,101,120,116,114,97,95,115,105,122,101,90,12,99,111, + 109,109,101,110,116,95,115,105,122,101,218,11,102,105,108,101, + 95,111,102,102,115,101,116,114,44,0,0,0,114,13,0,0, + 0,218,1,116,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,114,27,0,0,0,130,1,0,0,115,218,0,0, + 0,2,1,14,1,12,1,20,1,8,2,2,1,14,1,8, + 1,14,1,12,1,20,1,12,1,18,1,18,1,2,3,12, + 1,12,1,12,1,10,1,2,1,8,255,8,2,2,1,2, + 255,2,1,4,255,2,2,10,1,12,1,14,1,10,1,2, + 1,8,255,10,2,10,1,10,1,2,1,6,255,16,2,14, + 1,10,1,2,1,6,255,16,2,16,2,16,1,10,1,18, + 1,10,1,18,1,8,1,8,1,10,1,18,1,4,2,4, + 2,2,1,14,1,14,1,20,1,2,1,10,1,14,1,8, + 1,18,2,4,1,14,1,8,1,16,1,16,1,16,1,16, + 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,12, + 1,10,1,18,1,8,1,2,2,14,1,14,1,20,1,14, + 1,18,1,2,4,28,1,22,1,14,1,20,1,10,2,10, + 2,2,3,14,1,14,1,22,1,12,2,12,1,20,1,8, + 1,8,1,36,202,14,55,4,1,255,128,114,27,0,0,0, + 117,190,1,0,0,0,1,2,3,4,5,6,7,8,9,10, + 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26, + 27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42, + 43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58, + 59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74, + 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, + 91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106, + 107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122, + 123,124,125,126,127,195,135,195,188,195,169,195,162,195,164,195, + 160,195,165,195,167,195,170,195,171,195,168,195,175,195,174,195, + 172,195,132,195,133,195,137,195,166,195,134,195,180,195,182,195, + 178,195,187,195,185,195,191,195,150,195,156,194,162,194,163,194, + 165,226,130,167,198,146,195,161,195,173,195,179,195,186,195,177, + 195,145,194,170,194,186,194,191,226,140,144,194,172,194,189,194, + 188,194,161,194,171,194,187,226,150,145,226,150,146,226,150,147, + 226,148,130,226,148,164,226,149,161,226,149,162,226,149,150,226, + 149,149,226,149,163,226,149,145,226,149,151,226,149,157,226,149, + 156,226,149,155,226,148,144,226,148,148,226,148,180,226,148,172, + 226,148,156,226,148,128,226,148,188,226,149,158,226,149,159,226, + 149,154,226,149,148,226,149,169,226,149,166,226,149,160,226,149, + 144,226,149,172,226,149,167,226,149,168,226,149,164,226,149,165, + 226,149,153,226,149,152,226,149,146,226,149,147,226,149,171,226, + 149,170,226,148,152,226,148,140,226,150,136,226,150,132,226,150, + 140,226,150,144,226,150,128,206,177,195,159,206,147,207,128,206, + 163,207,131,194,181,207,132,206,166,206,152,206,169,206,180,226, + 136,158,207,134,206,181,226,136,169,226,137,161,194,177,226,137, + 165,226,137,164,226,140,160,226,140,161,195,183,226,137,136,194, + 176,226,136,153,194,183,226,136,154,226,129,191,194,178,226,150, + 160,194,160,99,0,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,8,0,0,0,67,0,0,0,115,106,0,0, + 0,116,0,114,22,116,1,160,2,100,1,161,1,1,0,116, + 3,100,2,131,1,130,1,100,3,97,0,122,58,122,16,100, + 4,100,5,108,4,109,5,125,0,1,0,87,0,110,32,4, + 0,116,6,121,76,1,0,1,0,1,0,116,1,160,2,100, + 1,161,1,1,0,116,3,100,2,131,1,130,1,119,0,87, + 0,100,6,97,0,110,6,100,6,97,0,119,0,116,1,160, + 2,100,7,161,1,1,0,124,0,83,0,41,8,78,122,27, + 122,105,112,105,109,112,111,114,116,58,32,122,108,105,98,32, + 85,78,65,86,65,73,76,65,66,76,69,250,41,99,97,110, + 39,116,32,100,101,99,111,109,112,114,101,115,115,32,100,97, + 116,97,59,32,122,108,105,98,32,110,111,116,32,97,118,97, + 105,108,97,98,108,101,84,114,0,0,0,0,169,1,218,10, + 100,101,99,111,109,112,114,101,115,115,70,122,25,122,105,112, + 105,109,112,111,114,116,58,32,122,108,105,98,32,97,118,97, + 105,108,97,98,108,101,41,7,218,15,95,105,109,112,111,114, + 116,105,110,103,95,122,108,105,98,114,45,0,0,0,114,80, + 0,0,0,114,3,0,0,0,90,4,122,108,105,98,114,143, + 0,0,0,218,9,69,120,99,101,112,116,105,111,110,114,142, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,20,95,103,101,116,95,100,101,99,111,109,112,114, + 101,115,115,95,102,117,110,99,32,2,0,0,115,28,0,0, + 0,4,2,10,3,8,1,4,2,4,1,16,1,12,1,10, + 1,10,1,2,128,12,2,10,2,4,1,255,128,114,146,0, + 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,17, + 0,0,0,9,0,0,0,67,0,0,0,115,132,1,0,0, + 124,1,92,8,125,2,125,3,125,4,125,5,125,6,125,7, + 125,8,125,9,124,4,100,1,107,0,114,36,116,0,100,2, + 131,1,130,1,116,1,160,2,124,0,161,1,144,1,143,6, + 125,10,122,14,124,10,160,3,124,6,161,1,1,0,87,0, + 110,32,4,0,116,4,121,96,1,0,1,0,1,0,116,0, + 100,3,124,0,155,2,157,2,124,0,100,4,141,2,130,1, + 119,0,124,10,160,5,100,5,161,1,125,11,116,6,124,11, + 131,1,100,5,107,3,114,128,116,7,100,6,131,1,130,1, + 124,11,100,0,100,7,133,2,25,0,100,8,107,3,114,162, + 116,0,100,9,124,0,155,2,157,2,124,0,100,4,141,2, + 130,1,116,8,124,11,100,10,100,11,133,2,25,0,131,1, + 125,12,116,8,124,11,100,11,100,5,133,2,25,0,131,1, + 125,13,100,5,124,12,23,0,124,13,23,0,125,14,124,6, + 124,14,55,0,125,6,122,14,124,10,160,3,124,6,161,1, + 1,0,87,0,110,34,4,0,116,4,144,1,121,6,1,0, + 1,0,1,0,116,0,100,3,124,0,155,2,157,2,124,0, + 100,4,141,2,130,1,119,0,124,10,160,5,124,4,161,1, + 125,15,116,6,124,15,131,1,124,4,107,3,144,1,114,40, + 116,4,100,12,131,1,130,1,87,0,100,0,4,0,4,0, + 131,3,1,0,110,18,49,0,144,1,115,62,119,1,1,0, + 1,0,1,0,89,0,1,0,124,3,100,1,107,2,144,1, + 114,86,124,15,83,0,122,10,116,9,131,0,125,16,87,0, + 110,24,4,0,116,10,144,1,121,120,1,0,1,0,1,0, + 116,0,100,13,131,1,130,1,119,0,124,16,124,15,100,14, + 131,2,83,0,41,15,78,114,0,0,0,0,122,18,110,101, + 103,97,116,105,118,101,32,100,97,116,97,32,115,105,122,101, + 114,94,0,0,0,114,12,0,0,0,114,106,0,0,0,114, + 100,0,0,0,114,95,0,0,0,115,4,0,0,0,80,75, + 3,4,122,23,98,97,100,32,108,111,99,97,108,32,102,105, + 108,101,32,104,101,97,100,101,114,58,32,233,26,0,0,0, + 114,105,0,0,0,122,26,122,105,112,105,109,112,111,114,116, + 58,32,99,97,110,39,116,32,114,101,97,100,32,100,97,116, + 97,114,141,0,0,0,105,241,255,255,255,41,11,114,3,0, + 0,0,114,112,0,0,0,114,113,0,0,0,114,114,0,0, + 0,114,22,0,0,0,114,116,0,0,0,114,55,0,0,0, + 114,121,0,0,0,114,1,0,0,0,114,146,0,0,0,114, + 145,0,0,0,41,17,114,29,0,0,0,114,58,0,0,0, + 90,8,100,97,116,97,112,97,116,104,114,132,0,0,0,114, + 136,0,0,0,114,127,0,0,0,114,139,0,0,0,114,133, + 0,0,0,114,134,0,0,0,114,135,0,0,0,114,125,0, + 0,0,114,126,0,0,0,114,137,0,0,0,114,138,0,0, + 0,114,129,0,0,0,90,8,114,97,119,95,100,97,116,97, + 114,143,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,56,0,0,0,53,2,0,0,115,64,0, + 0,0,20,1,8,1,8,1,14,2,2,2,14,1,12,1, + 20,1,10,1,12,1,8,1,16,2,18,2,16,2,16,1, + 12,1,8,1,2,1,14,1,14,1,20,1,10,1,14,1, + 40,1,10,2,4,2,2,3,10,1,14,1,10,1,10,1, + 255,128,114,56,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,16,0,0,0,116,0,124,0,124,1,24,0,131,1,100, + 1,107,1,83,0,41,2,78,114,5,0,0,0,41,1,218, + 3,97,98,115,41,2,90,2,116,49,90,2,116,50,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,9,95, + 101,113,95,109,116,105,109,101,99,2,0,0,115,4,0,0, + 0,16,2,255,128,114,149,0,0,0,99,5,0,0,0,0, + 0,0,0,0,0,0,0,14,0,0,0,6,0,0,0,67, + 0,0,0,115,254,0,0,0,124,3,124,2,100,1,156,2, + 125,5,116,0,160,1,124,4,124,3,124,5,161,3,125,6, + 124,6,100,2,64,0,100,3,107,3,125,7,124,7,114,126, + 124,6,100,4,64,0,100,3,107,3,125,8,116,2,106,3, + 100,5,107,3,114,206,124,8,115,76,116,2,106,3,100,6, + 107,2,114,206,116,4,124,0,124,2,131,2,125,9,124,9, + 100,0,117,1,114,206,116,2,160,5,116,0,106,6,124,9, + 161,2,125,10,116,0,160,7,124,4,124,10,124,3,124,5, + 161,4,1,0,110,80,116,8,124,0,124,2,131,2,92,2, + 125,11,125,12,124,11,114,206,116,9,116,10,124,4,100,7, + 100,8,133,2,25,0,131,1,124,11,131,2,114,186,116,10, + 124,4,100,8,100,9,133,2,25,0,131,1,124,12,107,3, + 114,206,116,11,160,12,100,10,124,3,155,2,157,2,161,1, + 1,0,100,0,83,0,116,13,160,14,124,4,100,9,100,0, + 133,2,25,0,161,1,125,13,116,15,124,13,116,16,131,2, + 115,250,116,17,100,11,124,1,155,2,100,12,157,3,131,1, + 130,1,124,13,83,0,41,13,78,41,2,114,44,0,0,0, + 114,13,0,0,0,114,5,0,0,0,114,0,0,0,0,114, + 88,0,0,0,90,5,110,101,118,101,114,90,6,97,108,119, + 97,121,115,114,101,0,0,0,114,96,0,0,0,114,97,0, + 0,0,122,22,98,121,116,101,99,111,100,101,32,105,115,32, + 115,116,97,108,101,32,102,111,114,32,122,16,99,111,109,112, + 105,108,101,100,32,109,111,100,117,108,101,32,122,21,32,105, + 115,32,110,111,116,32,97,32,99,111,100,101,32,111,98,106, + 101,99,116,41,18,114,21,0,0,0,90,13,95,99,108,97, + 115,115,105,102,121,95,112,121,99,218,4,95,105,109,112,90, + 21,99,104,101,99,107,95,104,97,115,104,95,98,97,115,101, + 100,95,112,121,99,115,218,15,95,103,101,116,95,112,121,99, + 95,115,111,117,114,99,101,218,11,115,111,117,114,99,101,95, + 104,97,115,104,90,17,95,82,65,87,95,77,65,71,73,67, + 95,78,85,77,66,69,82,90,18,95,118,97,108,105,100,97, + 116,101,95,104,97,115,104,95,112,121,99,218,29,95,103,101, + 116,95,109,116,105,109,101,95,97,110,100,95,115,105,122,101, + 95,111,102,95,115,111,117,114,99,101,114,149,0,0,0,114, + 2,0,0,0,114,45,0,0,0,114,80,0,0,0,218,7, + 109,97,114,115,104,97,108,90,5,108,111,97,100,115,114,15, + 0,0,0,218,10,95,99,111,100,101,95,116,121,112,101,218, + 9,84,121,112,101,69,114,114,111,114,41,14,114,32,0,0, + 0,114,57,0,0,0,114,66,0,0,0,114,38,0,0,0, + 114,128,0,0,0,90,11,101,120,99,95,100,101,116,97,105, + 108,115,114,131,0,0,0,90,10,104,97,115,104,95,98,97, + 115,101,100,90,12,99,104,101,99,107,95,115,111,117,114,99, + 101,90,12,115,111,117,114,99,101,95,98,121,116,101,115,114, + 152,0,0,0,90,12,115,111,117,114,99,101,95,109,116,105, + 109,101,90,11,115,111,117,114,99,101,95,115,105,122,101,114, + 50,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,15,95,117,110,109,97,114,115,104,97,108,95, + 99,111,100,101,107,2,0,0,115,72,0,0,0,2,2,2, + 1,6,254,14,5,12,2,4,1,12,1,10,1,2,1,2, + 255,8,1,2,255,10,2,8,1,4,1,4,1,2,1,4, + 254,4,5,8,1,6,255,8,4,6,255,4,3,22,3,18, + 1,2,255,4,2,8,1,4,255,4,2,18,2,10,1,16, + 1,4,1,255,128,114,157,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,67, + 0,0,0,115,28,0,0,0,124,0,160,0,100,1,100,2, + 161,2,125,0,124,0,160,0,100,3,100,2,161,2,125,0, + 124,0,83,0,41,4,78,115,2,0,0,0,13,10,243,1, + 0,0,0,10,243,1,0,0,0,13,41,1,114,19,0,0, + 0,41,1,218,6,115,111,117,114,99,101,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,23,95,110,111,114, + 109,97,108,105,122,101,95,108,105,110,101,95,101,110,100,105, + 110,103,115,152,2,0,0,115,8,0,0,0,12,1,12,1, + 4,1,255,128,114,161,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,0, + 0,0,115,24,0,0,0,116,0,124,1,131,1,125,1,116, + 1,124,1,124,0,100,1,100,2,100,3,141,4,83,0,41, + 4,78,114,78,0,0,0,84,41,1,90,12,100,111,110,116, + 95,105,110,104,101,114,105,116,41,2,114,161,0,0,0,218, + 7,99,111,109,112,105,108,101,41,2,114,57,0,0,0,114, + 160,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,15,95,99,111,109,112,105,108,101,95,115,111, + 117,114,99,101,159,2,0,0,115,6,0,0,0,8,1,16, + 1,255,128,114,163,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,11,0,0,0,67,0,0, + 0,115,68,0,0,0,116,0,160,1,124,0,100,1,63,0, + 100,2,23,0,124,0,100,3,63,0,100,4,64,0,124,0, + 100,5,64,0,124,1,100,6,63,0,124,1,100,3,63,0, + 100,7,64,0,124,1,100,5,64,0,100,8,20,0,100,9, + 100,9,100,9,102,9,161,1,83,0,41,10,78,233,9,0, + 0,0,105,188,7,0,0,233,5,0,0,0,233,15,0,0, + 0,233,31,0,0,0,233,11,0,0,0,233,63,0,0,0, + 114,88,0,0,0,114,14,0,0,0,41,2,114,133,0,0, + 0,90,6,109,107,116,105,109,101,41,2,218,1,100,114,140, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,14,95,112,97,114,115,101,95,100,111,115,116,105, + 109,101,165,2,0,0,115,20,0,0,0,4,1,10,1,10, + 1,6,1,6,1,10,1,10,1,6,1,6,249,255,128,114, + 171,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,6,0,0,0,10,0,0,0,67,0,0,0,115,110,0, + 0,0,122,82,124,1,100,1,100,0,133,2,25,0,100,2, + 118,0,115,22,74,0,130,1,124,1,100,0,100,1,133,2, + 25,0,125,1,124,0,106,0,124,1,25,0,125,2,124,2, + 100,3,25,0,125,3,124,2,100,4,25,0,125,4,124,2, + 100,5,25,0,125,5,116,1,124,4,124,3,131,2,124,5, + 102,2,87,0,83,0,4,0,116,2,116,3,116,4,102,3, + 121,108,1,0,1,0,1,0,89,0,100,6,83,0,119,0, + 41,7,78,114,14,0,0,0,169,2,218,1,99,218,1,111, + 114,165,0,0,0,233,6,0,0,0,233,3,0,0,0,41, + 2,114,0,0,0,0,114,0,0,0,0,41,5,114,28,0, + 0,0,114,171,0,0,0,114,26,0,0,0,218,10,73,110, + 100,101,120,69,114,114,111,114,114,156,0,0,0,41,6,114, + 32,0,0,0,114,13,0,0,0,114,58,0,0,0,114,133, + 0,0,0,114,134,0,0,0,90,17,117,110,99,111,109,112, + 114,101,115,115,101,100,95,115,105,122,101,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,153,0,0,0,178, + 2,0,0,115,22,0,0,0,2,1,20,2,12,1,10,1, + 8,3,8,1,8,1,16,1,18,1,8,1,255,128,114,153, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,8,0,0,0,67,0,0,0,115,80,0,0, + 0,124,1,100,1,100,0,133,2,25,0,100,2,118,0,115, + 20,74,0,130,1,124,1,100,0,100,1,133,2,25,0,125, + 1,122,14,124,0,106,0,124,1,25,0,125,2,87,0,110, + 20,4,0,116,1,121,66,1,0,1,0,1,0,89,0,100, + 0,83,0,119,0,116,2,124,0,106,3,124,2,131,2,83, + 0,41,3,78,114,14,0,0,0,114,172,0,0,0,41,4, + 114,28,0,0,0,114,26,0,0,0,114,56,0,0,0,114, + 29,0,0,0,41,3,114,32,0,0,0,114,13,0,0,0, + 114,58,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,151,0,0,0,197,2,0,0,115,16,0, + 0,0,20,2,12,1,2,2,14,1,12,1,8,1,12,2, + 255,128,114,151,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,14,0,0,0,11,0,0,0,67,0,0,0, + 115,16,1,0,0,116,0,124,0,124,1,131,2,125,2,100, + 0,125,3,116,1,68,0,93,204,92,3,125,4,125,5,125, + 6,124,2,124,4,23,0,125,7,116,2,106,3,100,1,124, + 0,106,4,116,5,124,7,100,2,100,3,141,5,1,0,122, + 14,124,0,106,6,124,7,25,0,125,8,87,0,110,18,4, + 0,116,7,121,90,1,0,1,0,1,0,89,0,113,18,119, + 0,124,8,100,4,25,0,125,9,116,8,124,0,106,4,124, + 8,131,2,125,10,100,0,125,11,124,5,114,182,122,20,116, + 9,124,0,124,9,124,7,124,1,124,10,131,5,125,11,87, + 0,110,50,4,0,116,10,144,1,121,14,1,0,125,12,1, + 0,122,16,124,12,125,3,87,0,89,0,100,0,125,12,126, + 12,110,18,100,0,125,12,126,12,119,1,116,11,124,9,124, + 10,131,2,125,11,124,11,100,0,117,0,114,202,113,18,124, + 8,100,4,25,0,125,9,124,11,124,6,124,9,102,3,2, + 0,1,0,83,0,124,3,114,252,100,5,124,3,155,0,157, + 2,125,13,116,12,124,13,124,1,100,6,141,2,124,3,130, + 2,116,12,100,7,124,1,155,2,157,2,124,1,100,6,141, + 2,130,1,119,0,41,8,78,122,13,116,114,121,105,110,103, + 32,123,125,123,125,123,125,114,88,0,0,0,41,1,90,9, + 118,101,114,98,111,115,105,116,121,114,0,0,0,0,122,20, + 109,111,100,117,108,101,32,108,111,97,100,32,102,97,105,108, + 101,100,58,32,114,62,0,0,0,114,61,0,0,0,41,13, 114,36,0,0,0,114,91,0,0,0,114,45,0,0,0,114, 80,0,0,0,114,29,0,0,0,114,20,0,0,0,114,28, 0,0,0,114,26,0,0,0,114,56,0,0,0,114,157,0, - 0,0,114,163,0,0,0,114,3,0,0,0,41,11,114,32, - 0,0,0,114,38,0,0,0,114,13,0,0,0,114,92,0, - 0,0,114,93,0,0,0,114,51,0,0,0,114,66,0,0, - 0,114,58,0,0,0,114,40,0,0,0,114,128,0,0,0, - 114,50,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,48,0,0,0,219,2,0,0,115,38,0, - 0,0,10,1,14,1,8,1,22,1,2,1,14,1,12,1, - 6,1,8,2,12,1,4,1,18,1,10,2,8,1,2,3, - 8,1,14,1,18,2,255,128,114,48,0,0,0,41,46,114, - 86,0,0,0,90,26,95,102,114,111,122,101,110,95,105,109, - 112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108, - 114,21,0,0,0,114,1,0,0,0,114,2,0,0,0,90, - 17,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, - 105,98,114,45,0,0,0,114,150,0,0,0,114,112,0,0, - 0,114,154,0,0,0,114,71,0,0,0,114,133,0,0,0, - 114,69,0,0,0,90,7,95,95,97,108,108,95,95,114,20, - 0,0,0,90,15,112,97,116,104,95,115,101,112,97,114,97, - 116,111,114,115,114,18,0,0,0,114,79,0,0,0,114,3, - 0,0,0,114,25,0,0,0,218,4,116,121,112,101,114,74, - 0,0,0,114,115,0,0,0,114,117,0,0,0,114,119,0, - 0,0,90,13,95,76,111,97,100,101,114,66,97,115,105,99, - 115,114,4,0,0,0,114,91,0,0,0,114,36,0,0,0, - 114,37,0,0,0,114,35,0,0,0,114,27,0,0,0,114, - 124,0,0,0,114,144,0,0,0,114,146,0,0,0,114,56, - 0,0,0,114,149,0,0,0,114,157,0,0,0,218,8,95, - 95,99,111,100,101,95,95,114,155,0,0,0,114,161,0,0, - 0,114,163,0,0,0,114,171,0,0,0,114,153,0,0,0, - 114,151,0,0,0,114,48,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, - 60,109,111,100,117,108,101,62,1,0,0,0,115,92,0,0, - 0,4,0,8,16,16,1,8,1,8,1,8,1,8,1,8, - 1,8,1,8,1,8,2,6,3,14,1,16,3,4,4,8, - 2,4,2,4,1,4,1,18,2,0,127,0,127,12,33,12, - 1,2,1,2,1,4,252,8,9,8,4,8,9,8,31,2, - 126,2,254,4,29,8,5,8,21,8,46,8,10,10,46,8, - 5,8,7,8,6,8,13,8,19,12,15,255,128, + 0,0,114,79,0,0,0,114,163,0,0,0,114,3,0,0, + 0,41,14,114,32,0,0,0,114,38,0,0,0,114,13,0, + 0,0,90,12,105,109,112,111,114,116,95,101,114,114,111,114, + 114,92,0,0,0,114,93,0,0,0,114,51,0,0,0,114, + 66,0,0,0,114,58,0,0,0,114,40,0,0,0,114,128, + 0,0,0,114,50,0,0,0,90,3,101,120,99,114,81,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,48,0,0,0,212,2,0,0,115,58,0,0,0,10, + 1,4,1,14,1,8,1,22,1,2,1,14,1,12,1,6, + 1,8,2,12,1,4,1,4,1,2,1,20,1,16,1,16, + 1,8,128,10,2,8,1,2,3,8,1,14,1,4,2,10, + 1,14,1,18,2,2,241,255,128,114,48,0,0,0,41,46, + 114,86,0,0,0,90,26,95,102,114,111,122,101,110,95,105, + 109,112,111,114,116,108,105,98,95,101,120,116,101,114,110,97, + 108,114,21,0,0,0,114,1,0,0,0,114,2,0,0,0, + 90,17,95,102,114,111,122,101,110,95,105,109,112,111,114,116, + 108,105,98,114,45,0,0,0,114,150,0,0,0,114,112,0, + 0,0,114,154,0,0,0,114,71,0,0,0,114,133,0,0, + 0,114,69,0,0,0,90,7,95,95,97,108,108,95,95,114, + 20,0,0,0,90,15,112,97,116,104,95,115,101,112,97,114, + 97,116,111,114,115,114,18,0,0,0,114,79,0,0,0,114, + 3,0,0,0,114,25,0,0,0,218,4,116,121,112,101,114, + 74,0,0,0,114,115,0,0,0,114,117,0,0,0,114,119, + 0,0,0,90,13,95,76,111,97,100,101,114,66,97,115,105, + 99,115,114,4,0,0,0,114,91,0,0,0,114,36,0,0, + 0,114,37,0,0,0,114,35,0,0,0,114,27,0,0,0, + 114,124,0,0,0,114,144,0,0,0,114,146,0,0,0,114, + 56,0,0,0,114,149,0,0,0,114,157,0,0,0,218,8, + 95,95,99,111,100,101,95,95,114,155,0,0,0,114,161,0, + 0,0,114,163,0,0,0,114,171,0,0,0,114,153,0,0, + 0,114,151,0,0,0,114,48,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 8,60,109,111,100,117,108,101,62,1,0,0,0,115,92,0, + 0,0,4,0,8,16,16,1,8,1,8,1,8,1,8,1, + 8,1,8,1,8,1,8,2,6,3,14,1,16,3,4,4, + 8,2,4,2,4,1,4,1,18,2,0,127,0,127,12,34, + 12,1,2,1,2,1,4,252,8,9,8,4,8,9,8,31, + 2,126,2,254,4,29,8,5,8,21,8,46,8,8,10,40, + 8,5,8,7,8,6,8,13,8,19,12,15,255,128, }; From 7ad42f5e7f30848badc758e80a2daff44ce1bb2f Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 18 Dec 2020 16:53:50 -0800 Subject: [PATCH 0832/1261] bpo-34805: Guarantee that __subclasses__() is in definition order. (GH-23844) --- Doc/library/stdtypes.rst | 4 ++-- Lib/test/test_descr.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index e48f67bfb96367..2869378bbdaf0e 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -5353,8 +5353,8 @@ types, where they are relevant. Some of these are not reported by the .. method:: class.__subclasses__ Each class keeps a list of weak references to its immediate subclasses. This - method returns a list of all those references still alive. - Example:: + method returns a list of all those references still alive. The list is in + definition order. Example:: >>> int.__subclasses__() [] diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 307416c3300ae3..f0048f42f882b0 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4,6 +4,8 @@ import itertools import math import pickle +import random +import string import sys import types import unittest @@ -845,6 +847,14 @@ class Module(types.ModuleType, str): self.fail("inheriting from ModuleType and str at the same time " "should fail") + # Issue 34805: Verify that definition order is retained + def random_name(): + return ''.join(random.choices(string.ascii_letters, k=10)) + class A: + pass + subclasses = [type(random_name(), (A,), {}) for i in range(100)] + self.assertEqual(A.__subclasses__(), subclasses) + def test_multiple_inheritance(self): # Testing multiple inheritance... class C(object): From efe1a8a1fc225f8a77e43676343edc1fbb2d20f2 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 18 Dec 2020 17:03:10 -0800 Subject: [PATCH 0833/1261] bpo-42559: Not that getrandbits() is non-negative. (GH-23843) --- Doc/library/random.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index c243aced986e56..fa5c74b40b25ee 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -142,10 +142,11 @@ Functions for integers .. function:: getrandbits(k) - Returns a Python integer with *k* random bits. This method is supplied with - the MersenneTwister generator and some other generators may also provide it - as an optional part of the API. When available, :meth:`getrandbits` enables - :meth:`randrange` to handle arbitrarily large ranges. + Returns a non-negative Python integer with *k* random bits. This method + is supplied with the MersenneTwister generator and some other generators + may also provide it as an optional part of the API. When available, + :meth:`getrandbits` enables :meth:`randrange` to handle arbitrarily large + ranges. .. versionchanged:: 3.9 This method now accepts zero for *k*. From 72caa4e9c0eb849a354d7184bd46ecdc3d1830e9 Mon Sep 17 00:00:00 2001 From: Casper Smet Date: Sat, 19 Dec 2020 05:28:21 +0100 Subject: [PATCH 0834/1261] Fixed typo in itertools documentation (GH-23816) --- Misc/ACKS | 1 + 1 file changed, 1 insertion(+) diff --git a/Misc/ACKS b/Misc/ACKS index 134f4ea3be874c..381aed1009c1ae 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1624,6 +1624,7 @@ Ville Skyttä Michael Sloan Nick Sloan Václav Šmilauer +Casper W. Smet Allen W. Smith Christopher Smith Eric V. Smith From e9af5e1e189cfc51557d8d4ce755417efc4ae4b4 Mon Sep 17 00:00:00 2001 From: masklinn Date: Sat, 19 Dec 2020 05:33:36 +0100 Subject: [PATCH 0835/1261] bpo-42470: Do not warn on sequences which are also sets in random.sample() (GH-23665) --- Lib/random.py | 13 +++++++------ Lib/test/test_random.py | 18 +++++++++++++++++- .../2020-12-06-12-00-00.bpo-42470.iqtC4L.rst | 1 + 3 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-06-12-00-00.bpo-42470.iqtC4L.rst diff --git a/Lib/random.py b/Lib/random.py index 139e8a40bb2724..66433baa8cc18f 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -424,13 +424,14 @@ def sample(self, population, k, *, counts=None): # too many calls to _randbelow(), making them slower and # causing them to eat more entropy than necessary. - if isinstance(population, _Set): - _warn('Sampling from a set deprecated\n' - 'since Python 3.9 and will be removed in a subsequent version.', - DeprecationWarning, 2) - population = tuple(population) if not isinstance(population, _Sequence): - raise TypeError("Population must be a sequence. For dicts or sets, use sorted(d).") + if isinstance(population, _Set): + _warn('Sampling from a set deprecated\n' + 'since Python 3.9 and will be removed in a subsequent version.', + DeprecationWarning, 2) + population = tuple(population) + else: + raise TypeError("Population must be a sequence. For dicts or sets, use sorted(d).") n = len(population) if counts is not None: cum_counts = list(_accumulate(counts)) diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 0c1fdeec9915ee..327bfa3bbda1bd 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -11,7 +11,7 @@ from math import log, exp, pi, fsum, sin, factorial from test import support from fractions import Fraction -from collections import Counter +from collections import abc, Counter class TestBasicOps: # Superclass with tests common to all generators. @@ -163,6 +163,22 @@ def test_sample_on_sets(self): population = {10, 20, 30, 40, 50, 60, 70} self.gen.sample(population, k=5) + def test_sample_on_seqsets(self): + class SeqSet(abc.Sequence, abc.Set): + def __init__(self, items): + self._items = items + + def __len__(self): + return len(self._items) + + def __getitem__(self, index): + return self._items[index] + + population = SeqSet([2, 4, 1, 3]) + with warnings.catch_warnings(): + warnings.simplefilter("error", DeprecationWarning) + self.gen.sample(population, k=2) + def test_sample_with_counts(self): sample = self.gen.sample diff --git a/Misc/NEWS.d/next/Library/2020-12-06-12-00-00.bpo-42470.iqtC4L.rst b/Misc/NEWS.d/next/Library/2020-12-06-12-00-00.bpo-42470.iqtC4L.rst new file mode 100644 index 00000000000000..cd2edb65d7a6c6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-06-12-00-00.bpo-42470.iqtC4L.rst @@ -0,0 +1 @@ +:func:`random.sample` no longer warns on a sequence which is also a set. From 0f0209c2c6836bf7dceec22c8c90a5538ccbcf4c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 19 Dec 2020 12:17:08 +0200 Subject: [PATCH 0836/1261] bpo-42630: Improve error reporting in Tkinter for absent default root (GH-23781) * Tkinter functions and constructors which need a default root window raise now RuntimeError with descriptive message instead of obscure AttributeError or NameError if it is not created yet or cannot be created automatically. * Add tests for all functions which use default root window. * Fix import in the pynche script. --- Lib/idlelib/pyshell.py | 4 +- Lib/test/test_idle.py | 2 +- Lib/tkinter/__init__.py | 51 +++++++----- Lib/tkinter/commondialog.py | 4 +- Lib/tkinter/font.py | 6 +- Lib/tkinter/simpledialog.py | 19 ++--- Lib/tkinter/test/support.py | 27 ++++++ Lib/tkinter/test/test_tkinter/test_font.py | 34 +++++++- Lib/tkinter/test/test_tkinter/test_images.py | 45 +++++++++- Lib/tkinter/test/test_tkinter/test_misc.py | 82 ++++++++++++++++++- .../test/test_tkinter/test_simpledialog.py | 25 ++++++ .../test/test_tkinter/test_variables.py | 17 +++- Lib/tkinter/test/test_tkinter/test_widgets.py | 14 +++- Lib/tkinter/test/test_ttk/test_extensions.py | 26 ++---- Lib/tkinter/test/test_ttk/test_widgets.py | 14 +++- Lib/tkinter/tix.py | 9 +- Lib/tkinter/ttk.py | 7 +- .../2020-12-15-17-51-27.bpo-42630.jf4jBl.rst | 4 + Tools/pynche/PyncheWidget.py | 12 +-- 19 files changed, 315 insertions(+), 87 deletions(-) create mode 100644 Lib/tkinter/test/test_tkinter/test_simpledialog.py create mode 100644 Misc/NEWS.d/next/Library/2020-12-15-17-51-27.bpo-42630.jf4jBl.rst diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index c3ecdc7b1b077c..abe8a85952bc9b 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -1061,8 +1061,10 @@ def begin(self): (sys.version, sys.platform, self.COPYRIGHT, nosub)) self.text.focus_force() self.showprompt() + # User code should use separate default Tk root window import tkinter - tkinter._default_root = None # 03Jan04 KBK What's this? + tkinter._support_default_root = True + tkinter._default_root = None return True def stop_readline(self): diff --git a/Lib/test/test_idle.py b/Lib/test/test_idle.py index b205d356498605..8756b766334e83 100644 --- a/Lib/test/test_idle.py +++ b/Lib/test/test_idle.py @@ -20,5 +20,5 @@ if __name__ == '__main__': tk.NoDefaultRoot() unittest.main(exit=False) - tk._support_default_root = 1 + tk._support_default_root = True tk._default_root = None diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 3bfeb7a0179036..1cc18704613809 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -270,7 +270,7 @@ def __repr__(self): ) -_support_default_root = 1 +_support_default_root = True _default_root = None @@ -280,13 +280,26 @@ def NoDefaultRoot(): Call this function to inhibit that the first instance of Tk is used for windows without an explicit parent window. """ - global _support_default_root - _support_default_root = 0 - global _default_root + global _support_default_root, _default_root + _support_default_root = False + # Delete, so any use of _default_root will immediately raise an exception. + # Rebind before deletion, so repeated calls will not fail. _default_root = None del _default_root +def _get_default_root(what=None): + if not _support_default_root: + raise RuntimeError("No master specified and tkinter is " + "configured to not support default root") + if not _default_root: + if what: + raise RuntimeError(f"Too early to {what}: no default root window") + root = Tk() + assert _default_root is root + return _default_root + + def _tkerror(err): """Internal function.""" pass @@ -330,7 +343,7 @@ def __init__(self, master=None, value=None, name=None): raise TypeError("name must be a string") global _varnum if not master: - master = _default_root + master = _get_default_root('create variable') self._root = master._root() self._tk = master.tk if name: @@ -591,7 +604,7 @@ def get(self): def mainloop(n=0): """Run the main loop of Tcl.""" - _default_root.tk.mainloop(n) + _get_default_root('run the main loop').tk.mainloop(n) getint = int @@ -600,9 +613,9 @@ def mainloop(n=0): def getboolean(s): - """Convert true and false to integer values 1 and 0.""" + """Convert Tcl object to True or False.""" try: - return _default_root.tk.getboolean(s) + return _get_default_root('use getboolean()').tk.getboolean(s) except TclError: raise ValueError("invalid literal for getboolean()") @@ -2248,7 +2261,7 @@ def __init__(self, screenName=None, baseName=None, className='Tk', is the name of the widget class.""" self.master = None self.children = {} - self._tkloaded = 0 + self._tkloaded = False # to avoid recursions in the getattr code in case of failure, we # ensure that self.tk is always _something_. self.tk = None @@ -2272,7 +2285,7 @@ def loadtk(self): self._loadtk() def _loadtk(self): - self._tkloaded = 1 + self._tkloaded = True global _default_root # Version sanity checks tk_version = self.tk.getvar('tk_version') @@ -2521,12 +2534,8 @@ class BaseWidget(Misc): def _setup(self, master, cnf): """Internal function. Sets up information about children.""" - if _support_default_root: - global _default_root - if not master: - if not _default_root: - _default_root = Tk() - master = _default_root + if not master: + master = _get_default_root() self.master = master self.tk = master.tk name = None @@ -3990,9 +3999,7 @@ class Image: def __init__(self, imgtype, name=None, cnf={}, master=None, **kw): self.name = None if not master: - master = _default_root - if not master: - raise RuntimeError('Too early to create image') + master = _get_default_root('create image') self.tk = getattr(master, 'tk', master) if not name: Image._last_id += 1 @@ -4146,11 +4153,13 @@ def __init__(self, name=None, cnf={}, master=None, **kw): def image_names(): - return _default_root.tk.splitlist(_default_root.tk.call('image', 'names')) + tk = _get_default_root('use image_names()').tk + return tk.splitlist(tk.call('image', 'names')) def image_types(): - return _default_root.tk.splitlist(_default_root.tk.call('image', 'types')) + tk = _get_default_root('use image_types()').tk + return tk.splitlist(tk.call('image', 'types')) class Spinbox(Widget, XView): diff --git a/Lib/tkinter/commondialog.py b/Lib/tkinter/commondialog.py index e56b5baf7d1e12..cc3069842c3e46 100644 --- a/Lib/tkinter/commondialog.py +++ b/Lib/tkinter/commondialog.py @@ -18,10 +18,10 @@ class Dialog: command = None def __init__(self, master=None, **options): + if not master: + master = options.get('parent') self.master = master self.options = options - if not master and options.get('parent'): - self.master = options['parent'] def _fixoptions(self): pass # hook diff --git a/Lib/tkinter/font.py b/Lib/tkinter/font.py index a9f79d8e456bb7..c051162bd29e00 100644 --- a/Lib/tkinter/font.py +++ b/Lib/tkinter/font.py @@ -69,7 +69,7 @@ def _mkdict(self, args): def __init__(self, root=None, font=None, name=None, exists=False, **options): if not root: - root = tkinter._default_root + root = tkinter._get_default_root('use font') tk = getattr(root, 'tk', root) if font: # get actual settings corresponding to the given font @@ -184,7 +184,7 @@ def metrics(self, *options, **kw): def families(root=None, displayof=None): "Get font families (as a tuple)" if not root: - root = tkinter._default_root + root = tkinter._get_default_root('use font.families()') args = () if displayof: args = ('-displayof', displayof) @@ -194,7 +194,7 @@ def families(root=None, displayof=None): def names(root=None): "Get names of defined fonts (as a tuple)" if not root: - root = tkinter._default_root + root = tkinter._get_default_root('use font.names()') return root.tk.splitlist(root.tk.call("font", "names")) diff --git a/Lib/tkinter/simpledialog.py b/Lib/tkinter/simpledialog.py index 85244171117b61..b882d47c961bdb 100644 --- a/Lib/tkinter/simpledialog.py +++ b/Lib/tkinter/simpledialog.py @@ -24,9 +24,7 @@ """ from tkinter import * -from tkinter import messagebox - -import tkinter # used at _QueryDialog for tkinter._default_root +from tkinter import messagebox, _get_default_root class SimpleDialog: @@ -128,13 +126,17 @@ def __init__(self, parent, title = None): title -- the dialog title ''' - Toplevel.__init__(self, parent) + master = parent + if not master: + master = _get_default_root('create dialog window') + + Toplevel.__init__(self, master) self.withdraw() # remain invisible for now - # If the master is not viewable, don't + # If the parent is not viewable, don't # make the child transient, or else it # would be opened withdrawn - if parent.winfo_viewable(): + if parent is not None and parent.winfo_viewable(): self.transient(parent) if title: @@ -155,7 +157,7 @@ def __init__(self, parent, title = None): self.protocol("WM_DELETE_WINDOW", self.cancel) - if self.parent is not None: + if parent is not None: self.geometry("+%d+%d" % (parent.winfo_rootx()+50, parent.winfo_rooty()+50)) @@ -259,9 +261,6 @@ def __init__(self, title, prompt, minvalue = None, maxvalue = None, parent = None): - if not parent: - parent = tkinter._default_root - self.prompt = prompt self.minvalue = minvalue self.maxvalue = maxvalue diff --git a/Lib/tkinter/test/support.py b/Lib/tkinter/test/support.py index 467a0b66c265c0..dbc47a81e65157 100644 --- a/Lib/tkinter/test/support.py +++ b/Lib/tkinter/test/support.py @@ -36,6 +36,33 @@ def tearDown(self): w.destroy() self.root.withdraw() + +class AbstractDefaultRootTest: + + def setUp(self): + self._old_support_default_root = tkinter._support_default_root + destroy_default_root() + tkinter._support_default_root = True + self.wantobjects = tkinter.wantobjects + + def tearDown(self): + destroy_default_root() + tkinter._default_root = None + tkinter._support_default_root = self._old_support_default_root + + def _test_widget(self, constructor): + # no master passing + x = constructor() + self.assertIsNotNone(tkinter._default_root) + self.assertIs(x.master, tkinter._default_root) + self.assertIs(x.tk, tkinter._default_root.tk) + x.destroy() + destroy_default_root() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, constructor) + self.assertFalse(hasattr(tkinter, '_default_root')) + + def destroy_default_root(): if getattr(tkinter, '_default_root', None): tkinter._default_root.update_idletasks() diff --git a/Lib/tkinter/test/test_tkinter/test_font.py b/Lib/tkinter/test/test_tkinter/test_font.py index 6d1eea44b4d2f3..3f71209064321d 100644 --- a/Lib/tkinter/test/test_tkinter/test_font.py +++ b/Lib/tkinter/test/test_tkinter/test_font.py @@ -2,7 +2,7 @@ import tkinter from tkinter import font from test.support import requires, run_unittest, gc_collect, ALWAYS_EQ -from tkinter.test.support import AbstractTkTest +from tkinter.test.support import AbstractTkTest, AbstractDefaultRootTest requires('gui') @@ -107,7 +107,37 @@ def test_repr(self): ) -tests_gui = (FontTest, ) +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_families(self): + self.assertRaises(RuntimeError, font.families) + root = tkinter.Tk() + families = font.families() + self.assertIsInstance(families, tuple) + self.assertTrue(families) + for family in families: + self.assertIsInstance(family, str) + self.assertTrue(family) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, font.families) + + def test_names(self): + self.assertRaises(RuntimeError, font.names) + root = tkinter.Tk() + names = font.names() + self.assertIsInstance(names, tuple) + self.assertTrue(names) + for name in names: + self.assertIsInstance(name, str) + self.assertTrue(name) + self.assertIn(fontname, names) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, font.names) + + +tests_gui = (FontTest, DefaultRootTest) if __name__ == "__main__": run_unittest(*tests_gui) diff --git a/Lib/tkinter/test/test_tkinter/test_images.py b/Lib/tkinter/test/test_tkinter/test_images.py index 6c6cb4e148573f..2526e92200d902 100644 --- a/Lib/tkinter/test/test_tkinter/test_images.py +++ b/Lib/tkinter/test/test_tkinter/test_images.py @@ -2,7 +2,7 @@ import tkinter from test import support from test.support import os_helper -from tkinter.test.support import AbstractTkTest, requires_tcl +from tkinter.test.support import AbstractTkTest, AbstractDefaultRootTest, requires_tcl support.requires('gui') @@ -20,6 +20,47 @@ def test_image_names(self): self.assertIsInstance(image_names, tuple) +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_image_types(self): + self.assertRaises(RuntimeError, tkinter.image_types) + root = tkinter.Tk() + image_types = tkinter.image_types() + self.assertIsInstance(image_types, tuple) + self.assertIn('photo', image_types) + self.assertIn('bitmap', image_types) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.image_types) + + def test_image_names(self): + self.assertRaises(RuntimeError, tkinter.image_names) + root = tkinter.Tk() + image_names = tkinter.image_names() + self.assertIsInstance(image_names, tuple) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.image_names) + + def test_image_create_bitmap(self): + self.assertRaises(RuntimeError, tkinter.BitmapImage) + root = tkinter.Tk() + image = tkinter.BitmapImage() + self.assertIn(image.name, tkinter.image_names()) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.BitmapImage) + + def test_image_create_photo(self): + self.assertRaises(RuntimeError, tkinter.PhotoImage) + root = tkinter.Tk() + image = tkinter.PhotoImage() + self.assertIn(image.name, tkinter.image_names()) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.PhotoImage) + + class BitmapImageTest(AbstractTkTest, unittest.TestCase): @classmethod @@ -331,7 +372,7 @@ def test_transparency(self): self.assertEqual(image.transparency_get(4, 6), False) -tests_gui = (MiscTest, BitmapImageTest, PhotoImageTest,) +tests_gui = (MiscTest, DefaultRootTest, BitmapImageTest, PhotoImageTest,) if __name__ == "__main__": support.run_unittest(*tests_gui) diff --git a/Lib/tkinter/test/test_tkinter/test_misc.py b/Lib/tkinter/test/test_tkinter/test_misc.py index b8eea2544f5228..585d81ddf9f2d6 100644 --- a/Lib/tkinter/test/test_tkinter/test_misc.py +++ b/Lib/tkinter/test/test_tkinter/test_misc.py @@ -1,7 +1,7 @@ import unittest import tkinter from test import support -from tkinter.test.support import AbstractTkTest +from tkinter.test.support import AbstractTkTest, AbstractDefaultRootTest support.requires('gui') @@ -241,7 +241,85 @@ def test_event_repr(self): " num=3 delta=-1 focus=True" " x=10 y=20 width=300 height=200>") -tests_gui = (MiscTest, ) + def test_getboolean(self): + for v in 'true', 'yes', 'on', '1', 't', 'y', 1, True: + self.assertIs(self.root.getboolean(v), True) + for v in 'false', 'no', 'off', '0', 'f', 'n', 0, False: + self.assertIs(self.root.getboolean(v), False) + self.assertRaises(ValueError, self.root.getboolean, 'yea') + self.assertRaises(ValueError, self.root.getboolean, '') + self.assertRaises(TypeError, self.root.getboolean, None) + self.assertRaises(TypeError, self.root.getboolean, ()) + + def test_mainloop(self): + log = [] + def callback(): + log.append(1) + self.root.after(100, self.root.quit) + self.root.after(100, callback) + self.root.mainloop(1) + self.assertEqual(log, []) + self.root.mainloop(0) + self.assertEqual(log, [1]) + self.assertTrue(self.root.winfo_exists()) + + +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_default_root(self): + self.assertIs(tkinter._support_default_root, True) + self.assertIsNone(tkinter._default_root) + root = tkinter.Tk() + root2 = tkinter.Tk() + root3 = tkinter.Tk() + self.assertIs(tkinter._default_root, root) + root2.destroy() + self.assertIs(tkinter._default_root, root) + root.destroy() + self.assertIsNone(tkinter._default_root) + root3.destroy() + self.assertIsNone(tkinter._default_root) + + def test_no_default_root(self): + self.assertIs(tkinter._support_default_root, True) + self.assertIsNone(tkinter._default_root) + root = tkinter.Tk() + self.assertIs(tkinter._default_root, root) + tkinter.NoDefaultRoot() + self.assertIs(tkinter._support_default_root, False) + self.assertFalse(hasattr(tkinter, '_default_root')) + # repeated call is no-op + tkinter.NoDefaultRoot() + self.assertIs(tkinter._support_default_root, False) + self.assertFalse(hasattr(tkinter, '_default_root')) + root.destroy() + self.assertIs(tkinter._support_default_root, False) + self.assertFalse(hasattr(tkinter, '_default_root')) + root = tkinter.Tk() + self.assertIs(tkinter._support_default_root, False) + self.assertFalse(hasattr(tkinter, '_default_root')) + root.destroy() + + def test_getboolean(self): + self.assertRaises(RuntimeError, tkinter.getboolean, '1') + root = tkinter.Tk() + self.assertIs(tkinter.getboolean('1'), True) + self.assertRaises(ValueError, tkinter.getboolean, 'yea') + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.getboolean, '1') + + def test_mainloop(self): + self.assertRaises(RuntimeError, tkinter.mainloop) + root = tkinter.Tk() + root.after_idle(root.quit) + tkinter.mainloop() + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.mainloop) + + +tests_gui = (MiscTest, DefaultRootTest) if __name__ == "__main__": support.run_unittest(*tests_gui) diff --git a/Lib/tkinter/test/test_tkinter/test_simpledialog.py b/Lib/tkinter/test/test_tkinter/test_simpledialog.py new file mode 100644 index 00000000000000..911917258806d1 --- /dev/null +++ b/Lib/tkinter/test/test_tkinter/test_simpledialog.py @@ -0,0 +1,25 @@ +import unittest +import tkinter +from test.support import requires, run_unittest, swap_attr +from tkinter.test.support import AbstractDefaultRootTest +from tkinter.simpledialog import Dialog, askinteger + +requires('gui') + + +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_askinteger(self): + self.assertRaises(RuntimeError, askinteger, "Go To Line", "Line number") + root = tkinter.Tk() + with swap_attr(Dialog, 'wait_window', lambda self, w: w.destroy()): + askinteger("Go To Line", "Line number") + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, askinteger, "Go To Line", "Line number") + + +tests_gui = (DefaultRootTest,) + +if __name__ == "__main__": + run_unittest(*tests_gui) diff --git a/Lib/tkinter/test/test_tkinter/test_variables.py b/Lib/tkinter/test/test_tkinter/test_variables.py index 08b7dedcaf933b..63d7c21059e38c 100644 --- a/Lib/tkinter/test/test_tkinter/test_variables.py +++ b/Lib/tkinter/test/test_tkinter/test_variables.py @@ -1,8 +1,10 @@ import unittest import gc +import tkinter from tkinter import (Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tcl, TclError) from test.support import ALWAYS_EQ +from tkinter.test.support import AbstractDefaultRootTest class Var(Variable): @@ -308,8 +310,21 @@ def test_invalid_value_domain(self): v.get() +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_variable(self): + self.assertRaises(RuntimeError, Variable) + root = tkinter.Tk() + v = Variable() + v.set("value") + self.assertEqual(v.get(), "value") + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, Variable) + + tests_gui = (TestVariable, TestStringVar, TestIntVar, - TestDoubleVar, TestBooleanVar) + TestDoubleVar, TestBooleanVar, DefaultRootTest) if __name__ == "__main__": diff --git a/Lib/tkinter/test/test_tkinter/test_widgets.py b/Lib/tkinter/test/test_tkinter/test_widgets.py index 4b9b6ebdda04ea..54eddbf8216110 100644 --- a/Lib/tkinter/test/test_tkinter/test_widgets.py +++ b/Lib/tkinter/test/test_tkinter/test_widgets.py @@ -5,7 +5,8 @@ from test.support import requires from tkinter.test.support import (tcl_version, requires_tcl, - get_tk_patchlevel, widget_eq) + get_tk_patchlevel, widget_eq, + AbstractDefaultRootTest) from tkinter.test.widget_tests import ( add_standard_options, noconv, pixels_round, AbstractWidgetTest, StandardOptionsTests, IntegerSizeTests, PixelSizeTests, @@ -1295,12 +1296,21 @@ def test_aspect(self): self.checkIntegerParam(widget, 'aspect', 250, 0, -300) +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_frame(self): + self._test_widget(tkinter.Frame) + + def test_label(self): + self._test_widget(tkinter.Label) + + tests_gui = ( ButtonTest, CanvasTest, CheckbuttonTest, EntryTest, FrameTest, LabelFrameTest,LabelTest, ListboxTest, MenubuttonTest, MenuTest, MessageTest, OptionMenuTest, PanedWindowTest, RadiobuttonTest, ScaleTest, ScrollbarTest, - SpinboxTest, TextTest, ToplevelTest, + SpinboxTest, TextTest, ToplevelTest, DefaultRootTest, ) if __name__ == '__main__': diff --git a/Lib/tkinter/test/test_ttk/test_extensions.py b/Lib/tkinter/test/test_ttk/test_extensions.py index 6937ba1ca9be41..1a70e0befe6234 100644 --- a/Lib/tkinter/test/test_ttk/test_extensions.py +++ b/Lib/tkinter/test/test_ttk/test_extensions.py @@ -2,8 +2,8 @@ import unittest import tkinter from tkinter import ttk -from test.support import requires, run_unittest, swap_attr -from tkinter.test.support import AbstractTkTest, destroy_default_root +from test.support import requires, run_unittest +from tkinter.test.support import AbstractTkTest, AbstractDefaultRootTest requires('gui') @@ -46,20 +46,6 @@ def test_widget_destroy(self): if hasattr(sys, 'last_type'): self.assertNotEqual(sys.last_type, tkinter.TclError) - - def test_initialization_no_master(self): - # no master passing - with swap_attr(tkinter, '_default_root', None), \ - swap_attr(tkinter, '_support_default_root', True): - try: - x = ttk.LabeledScale() - self.assertIsNotNone(tkinter._default_root) - self.assertEqual(x.master, tkinter._default_root) - self.assertEqual(x.tk, tkinter._default_root.tk) - x.destroy() - finally: - destroy_default_root() - def test_initialization(self): # master passing master = tkinter.Frame(self.root) @@ -311,7 +297,13 @@ def test_unique_radiobuttons(self): optmenu2.destroy() -tests_gui = (LabeledScaleTest, OptionMenuTest) +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_labeledscale(self): + self._test_widget(ttk.LabeledScale) + + +tests_gui = (LabeledScaleTest, OptionMenuTest, DefaultRootTest) if __name__ == "__main__": run_unittest(*tests_gui) diff --git a/Lib/tkinter/test/test_ttk/test_widgets.py b/Lib/tkinter/test/test_ttk/test_widgets.py index 157ef0e8f87bb5..de30e2476b4eb9 100644 --- a/Lib/tkinter/test/test_ttk/test_widgets.py +++ b/Lib/tkinter/test/test_ttk/test_widgets.py @@ -6,7 +6,7 @@ from tkinter.test.test_ttk.test_functions import MockTclObj from tkinter.test.support import (AbstractTkTest, tcl_version, get_tk_patchlevel, - simulate_mouse_click) + simulate_mouse_click, AbstractDefaultRootTest) from tkinter.test.widget_tests import (add_standard_options, noconv, AbstractWidgetTest, StandardOptionsTests, IntegerSizeTests, PixelSizeTests, setUpModule) @@ -1860,12 +1860,22 @@ class SizegripTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return ttk.Sizegrip(self.root, **kwargs) + +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_frame(self): + self._test_widget(ttk.Frame) + + def test_label(self): + self._test_widget(ttk.Label) + + tests_gui = ( ButtonTest, CheckbuttonTest, ComboboxTest, EntryTest, FrameTest, LabelFrameTest, LabelTest, MenubuttonTest, NotebookTest, PanedWindowTest, ProgressbarTest, RadiobuttonTest, ScaleTest, ScrollbarTest, SeparatorTest, - SizegripTest, SpinboxTest, TreeviewTest, WidgetTest, + SizegripTest, SpinboxTest, TreeviewTest, WidgetTest, DefaultRootTest, ) if __name__ == "__main__": diff --git a/Lib/tkinter/tix.py b/Lib/tkinter/tix.py index ac545502e45c30..ef1e7406bc1ae0 100644 --- a/Lib/tkinter/tix.py +++ b/Lib/tkinter/tix.py @@ -387,9 +387,7 @@ def config_all(self, option, value): # These are missing from Tkinter def image_create(self, imgtype, cnf={}, master=None, **kw): if not master: - master = tkinter._default_root - if not master: - raise RuntimeError('Too early to create image') + master = self if kw and cnf: cnf = _cnfmerge((cnf, kw)) elif kw: cnf = kw options = () @@ -475,10 +473,7 @@ def __init__(self, itemtype, cnf={}, *, master=None, **kw): elif 'refwindow' in cnf: master = cnf['refwindow'] else: - master = tkinter._default_root - if not master: - raise RuntimeError("Too early to create display style: " - "no root window") + master = tkinter._get_default_root('create display style') self.tk = master.tk self.stylename = self.tk.call('tixDisplayStyle', itemtype, *self._options(cnf,kw) ) diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index f3a2f7660f30b8..ab7aeb15e8ff22 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -349,12 +349,7 @@ def setup_master(master=None): If it is not allowed to use the default root and master is None, RuntimeError is raised.""" if master is None: - if tkinter._support_default_root: - master = tkinter._default_root or tkinter.Tk() - else: - raise RuntimeError( - "No master specified and tkinter is " - "configured to not support default root") + master = tkinter._get_default_root() return master diff --git a/Misc/NEWS.d/next/Library/2020-12-15-17-51-27.bpo-42630.jf4jBl.rst b/Misc/NEWS.d/next/Library/2020-12-15-17-51-27.bpo-42630.jf4jBl.rst new file mode 100644 index 00000000000000..4b4a520931fda4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-15-17-51-27.bpo-42630.jf4jBl.rst @@ -0,0 +1,4 @@ +:mod:`tkinter` functions and constructors which need a default root window +raise now :exc:`RuntimeError` with descriptive message instead of obscure +:exc:`AttributeError` or :exc:`NameError` if it is not created yet or cannot +be created automatically. diff --git a/Tools/pynche/PyncheWidget.py b/Tools/pynche/PyncheWidget.py index ef12198a218388..ea456e577e12a9 100644 --- a/Tools/pynche/PyncheWidget.py +++ b/Tools/pynche/PyncheWidget.py @@ -36,15 +36,11 @@ def __init__(self, version, switchboard, master=None, extrapath=[]): else: # Is there already a default root for Tk, say because we're # running under Guido's IDE? :-) Two conditions say no, either the - # import fails or _default_root is None. - tkroot = None - try: - from Tkinter import _default_root - tkroot = self.__tkroot = _default_root - except ImportError: - pass + # _default_root is None or it is unset. + tkroot = getattr(tkinter, '_default_root', None) if not tkroot: - tkroot = self.__tkroot = Tk(className='Pynche') + tkroot = Tk(className='Pynche') + self.__tkroot = tkroot # but this isn't our top level widget, so make it invisible tkroot.withdraw() # create the menubar From f1dc53485d764c580fdc0acbee85e1d8d7b33252 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Sat, 19 Dec 2020 12:48:06 -0300 Subject: [PATCH 0837/1261] [doc] Mention with and except clauses in globals() (GH-13232) --- Doc/reference/simple_stmts.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index f8ab2e918c6a10..2c6c90140201c3 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -950,7 +950,7 @@ Names listed in a :keyword:`global` statement must not be used in the same code block textually preceding that :keyword:`!global` statement. Names listed in a :keyword:`global` statement must not be defined as formal -parameters or in a :keyword:`for` loop control target, :keyword:`class` +parameters, or as targets in :keyword:`with` statements or :keyword:`except` clauses, or in a :keyword:`for` target list, :keyword:`class` definition, function definition, :keyword:`import` statement, or variable annotation. From 5ddf6171c4c8e5875a408e2c43b91214d950b5a9 Mon Sep 17 00:00:00 2001 From: sblondon Date: Sat, 19 Dec 2020 23:52:39 +0100 Subject: [PATCH 0838/1261] bpo-41724: Explain when the conversion is not possible with detect_types enabled (GH-23855) * Explain when the conversion is not possible with detect_types enabled --- Doc/library/sqlite3.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 13aa8c512d0319..c36648775a615e 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -198,7 +198,9 @@ Module functions and constants *detect_types* defaults to 0 (i. e. off, no type detection), you can set it to any combination of :const:`PARSE_DECLTYPES` and :const:`PARSE_COLNAMES` to turn - type detection on. + type detection on. Due to SQLite behaviour, types can't be detected for generated + fields (for example ``max(data)``), even when *detect_types* parameter is set. In + such case, the returned type is :class:`str`. By default, *check_same_thread* is :const:`True` and only the creating thread may use the connection. If set :const:`False`, the returned connection may be shared From 5434bdcb696fbedccdfa41d78d8c6d24da2104b6 Mon Sep 17 00:00:00 2001 From: Matti Picus Date: Sun, 20 Dec 2020 04:56:57 +0200 Subject: [PATCH 0839/1261] bpo-42604: always set EXT_SUFFIX=${SOABI}${SHLIB_SUFFIX} when using configure (GH-23708) Now all platforms use a value for the "EXT_SUFFIX" build variable derived from SOABI (for instance in FreeBSD, "EXT_SUFFIX" is now ".cpython-310d.so" instead of ".so"). Previously only Linux, Mac and VxWorks were using a value for "EXT_SUFFIX" that included "SOABI". Co-authored-by: Pablo Galindo --- .../next/Build/2020-12-20-02-35-28.bpo-42604.gRd89w.rst | 4 ++++ configure | 8 +------- configure.ac | 7 +------ 3 files changed, 6 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-12-20-02-35-28.bpo-42604.gRd89w.rst diff --git a/Misc/NEWS.d/next/Build/2020-12-20-02-35-28.bpo-42604.gRd89w.rst b/Misc/NEWS.d/next/Build/2020-12-20-02-35-28.bpo-42604.gRd89w.rst new file mode 100644 index 00000000000000..caaada41cf9bad --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-12-20-02-35-28.bpo-42604.gRd89w.rst @@ -0,0 +1,4 @@ +Now all platforms use a value for the "EXT_SUFFIX" build variable derived +from SOABI (for instance in freeBSD, "EXT_SUFFIX" is now ".cpython-310d.so" +instead of ".so"). Previosuly only Linux, Mac and VxWorks were using a value +for "EXT_SUFFIX" that included "SOABI". diff --git a/configure b/configure index d9e610ea4d0cb7..f07edfff266a0e 100755 --- a/configure +++ b/configure @@ -15429,13 +15429,7 @@ _ACEOF fi - -case $ac_sys_system in - Linux*|GNU*|Darwin|VxWorks) - EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX};; - *) - EXT_SUFFIX=${SHLIB_SUFFIX};; -esac +EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX} { $as_echo "$as_me:${as_lineno-$LINENO}: checking LDVERSION" >&5 $as_echo_n "checking LDVERSION... " >&6; } diff --git a/configure.ac b/configure.ac index 445dae13587486..ee5573cf644316 100644 --- a/configure.ac +++ b/configure.ac @@ -4786,12 +4786,7 @@ if test "$Py_DEBUG" = 'true' -a "$with_trace_refs" != "yes"; then fi AC_SUBST(EXT_SUFFIX) -case $ac_sys_system in - Linux*|GNU*|Darwin|VxWorks) - EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX};; - *) - EXT_SUFFIX=${SHLIB_SUFFIX};; -esac +EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX} AC_MSG_CHECKING(LDVERSION) LDVERSION='$(VERSION)$(ABIFLAGS)' From dd6c54046c8d8f8d730a8dd871b505389f3ee9fb Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 20 Dec 2020 10:14:54 -0800 Subject: [PATCH 0840/1261] bpo-42572: Improve argparse docs for the type parameter. (GH-23849) --- Doc/library/argparse.rst | 107 +++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 50 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 02cd70f4f71cd6..1a298cdd2b5344 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1050,63 +1050,70 @@ command-line argument was not present:: type ^^^^ -By default, :class:`ArgumentParser` objects read command-line arguments in as simple +By default, the parser reads command-line arguments in as simple strings. However, quite often the command-line string should instead be -interpreted as another type, like a :class:`float` or :class:`int`. The -``type`` keyword argument of :meth:`~ArgumentParser.add_argument` allows any -necessary type-checking and type conversions to be performed. Common built-in -types and functions can be used directly as the value of the ``type`` argument:: +interpreted as another type, such as a :class:`float` or :class:`int`. The +``type`` keyword for :meth:`~ArgumentParser.add_argument` allows any +necessary type-checking and type conversions to be performed. - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('foo', type=int) - >>> parser.add_argument('bar', type=open) - >>> parser.parse_args('2 temp.txt'.split()) - Namespace(bar=<_io.TextIOWrapper name='temp.txt' encoding='UTF-8'>, foo=2) +If the type_ keyword is used with the default_ keyword, the type converter +is only applied if the default is a string. -See the section on the default_ keyword argument for information on when the -``type`` argument is applied to default arguments. +The argument to ``type`` can be any callable that accepts a single string. +If the function raises :exc:`ArgumentTypeError`, :exc:`TypeError`, or +:exc:`ValueError`, the exception is caught and a nicely formatted error +message is displayed. No other exception types are handled. -To ease the use of various types of files, the argparse module provides the -factory FileType which takes the ``mode=``, ``bufsize=``, ``encoding=`` and -``errors=`` arguments of the :func:`open` function. For example, -``FileType('w')`` can be used to create a writable file:: +Common built-in types and functions can be used as type converters: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('bar', type=argparse.FileType('w')) - >>> parser.parse_args(['out.txt']) - Namespace(bar=<_io.TextIOWrapper name='out.txt' encoding='UTF-8'>) - -``type=`` can take any callable that takes a single string argument and returns -the converted value:: - - >>> def perfect_square(string): - ... value = int(string) - ... sqrt = math.sqrt(value) - ... if sqrt != int(sqrt): - ... msg = "%r is not a perfect square" % string - ... raise argparse.ArgumentTypeError(msg) - ... return value - ... - >>> parser = argparse.ArgumentParser(prog='PROG') - >>> parser.add_argument('foo', type=perfect_square) - >>> parser.parse_args(['9']) - Namespace(foo=9) - >>> parser.parse_args(['7']) - usage: PROG [-h] foo - PROG: error: argument foo: '7' is not a perfect square +.. testcode:: -The choices_ keyword argument may be more convenient for type checkers that -simply check against a range of values:: + import argparse + import pathlib - >>> parser = argparse.ArgumentParser(prog='PROG') - >>> parser.add_argument('foo', type=int, choices=range(5, 10)) - >>> parser.parse_args(['7']) - Namespace(foo=7) - >>> parser.parse_args(['11']) - usage: PROG [-h] {5,6,7,8,9} - PROG: error: argument foo: invalid choice: 11 (choose from 5, 6, 7, 8, 9) - -See the choices_ section for more details. + parser = argparse.ArgumentParser() + parser.add_argument('count', type=int) + parser.add_argument('distance', type=float) + parser.add_argument('street', type=ascii) + parser.add_argument('code_point', type=ord) + parser.add_argument('source_file', type=open) + parser.add_argument('dest_file', type=argparse.FileType('w', encoding='latin-1')) + parser.add_argument('datapath', type=pathlib.Path) + +User defined functions can be used as well: + +.. doctest:: + + >>> def hyphenated(string): + ... return '-'.join([word[:4] for word in string.casefold().split()]) + ... + >>> parser = argparse.ArgumentParser() + >>> _ = parser.add_argument('short_title', type=hyphenated) + >>> parser.parse_args(['"The Tale of Two Cities"']) + Namespace(short_title='"the-tale-of-two-citi') + +The :func:`bool` function is not recommended as a type converter. All it does +is convert empty strings to ``False`` and non-empty strings to ``True``. +This is usually not what is desired. + +In general, the ``type`` keyword is a convenience that should only be used for +simple conversions that can only raise one of the three supported exceptions. +Anything with more interesting error-handling or resource management should be +done downstream after the arguments are parsed. + +For example, JSON or YAML conversions have complex error cases that require +better reporting than can be given by the ``type`` keyword. An +:exc:`~json.JSONDecodeError` would not be well formatted and a +:exc:`FileNotFound` exception would not be handled at all. + +Even :class:`~argparse.FileType` has its limitations for use with the ``type`` +keyword. If one argument uses *FileType* and then a subsequent argument fails, +an error is reported but the file is not automatically closed. In this case, it +would be better to wait until after the parser has run and then use the +:keyword:`with`-statement to manage the files. + +For type checkers that simply check against a fixed set of values, consider +using the choices_ keyword instead. choices From 4c233837f750aa4b1a472dcf6f03f4a1f10350eb Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Sun, 20 Dec 2020 18:24:10 +0000 Subject: [PATCH 0841/1261] bpo-42669: Document that `except` rejects nested tuples (GH-23822) In Python 2, it was possible to use `except` with a nested tuple, and occasionally natural. For example, `zope.formlib.interfaces.InputErrors` is a tuple of several exception classes, and one might reasonably think to do something like this: try: self.getInputValue() return True except (InputErrors, SomethingElse): return False As of Python 3.0, this raises `TypeError: catching classes that do not inherit from BaseException is not allowed` instead: one must instead either break it up into multiple `except` clauses or flatten the tuple. However, the reference documentation was never updated to match this new restriction. Make it clear that the definition is no longer recursive. Automerge-Triggered-By: GH:ericvsmith --- Doc/reference/compound_stmts.rst | 3 ++- Misc/ACKS | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index a55aacccc16dfe..8da74c79801be9 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -254,7 +254,8 @@ present, must be last; it matches any exception. For an except clause with an expression, that expression is evaluated, and the clause matches the exception if the resulting object is "compatible" with the exception. An object is compatible with an exception if it is the class or a base class of the exception -object or a tuple containing an item compatible with the exception. +object, or a tuple containing an item that is the class or a base class of +the exception object. If no except clause matches the exception, the search for an exception handler continues in the surrounding code and on the invocation stack. [#]_ diff --git a/Misc/ACKS b/Misc/ACKS index 381aed1009c1ae..80e51f93e3aa93 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1849,6 +1849,7 @@ Zachary Ware Barry Warsaw Steve Waterbury Bob Watson +Colin Watson David Watson Aaron Watters Henrik Weber From 1bda4fa57a332dfec10716e132f737a1b78be133 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Mon, 21 Dec 2020 06:27:42 +0800 Subject: [PATCH 0842/1261] bpo-31904: Fix site and sysconfig modules for VxWorks RTOS (GH-21821) --- Lib/distutils/command/install.py | 13 +- Lib/distutils/tests/test_install.py | 8 +- Lib/site.py | 24 ++-- Lib/sysconfig.py | 115 ++++++++++-------- Lib/test/test_site.py | 5 + Lib/test/test_sysconfig.py | 19 ++- .../2020-08-11-17-44-07.bpo-31904.cb13ea.rst | 1 + 7 files changed, 113 insertions(+), 72 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-08-11-17-44-07.bpo-31904.cb13ea.rst diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py index aaa300efa96e6e..bdead133bd399a 100644 --- a/Lib/distutils/command/install.py +++ b/Lib/distutils/command/install.py @@ -17,7 +17,8 @@ from site import USER_BASE from site import USER_SITE -HAS_USER_SITE = True + +HAS_USER_SITE = (USER_SITE is not None) WINDOWS_SCHEME = { 'purelib': '$base/Lib/site-packages', @@ -169,8 +170,9 @@ def initialize_options(self): self.install_lib = None # set to either purelib or platlib self.install_scripts = None self.install_data = None - self.install_userbase = USER_BASE - self.install_usersite = USER_SITE + if HAS_USER_SITE: + self.install_userbase = USER_BASE + self.install_usersite = USER_SITE self.compile = None self.optimize = None @@ -343,8 +345,9 @@ def finalize_options(self): # Convert directories from Unix /-separated syntax to the local # convention. self.convert_paths('lib', 'purelib', 'platlib', - 'scripts', 'data', 'headers', - 'userbase', 'usersite') + 'scripts', 'data', 'headers') + if HAS_USER_SITE: + self.convert_paths('userbase', 'usersite') # Deprecated # Well, we're not actually fully completely finalized yet: we still diff --git a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py index 51c80e0421a8c1..21a7b7c85c49da 100644 --- a/Lib/distutils/tests/test_install.py +++ b/Lib/distutils/tests/test_install.py @@ -8,7 +8,7 @@ from test.support import captured_stdout, run_unittest from distutils import sysconfig -from distutils.command.install import install +from distutils.command.install import install, HAS_USER_SITE from distutils.command import install as install_module from distutils.command.build_ext import build_ext from distutils.command.install import INSTALL_SCHEMES @@ -66,6 +66,7 @@ def check_path(got, expected): check_path(cmd.install_scripts, os.path.join(destination, "bin")) check_path(cmd.install_data, destination) + @unittest.skipUnless(HAS_USER_SITE, 'need user site') def test_user_site(self): # test install with --user # preparing the environment for the test @@ -93,8 +94,9 @@ def cleanup(): self.addCleanup(cleanup) - for key in ('nt_user', 'unix_user'): - self.assertIn(key, INSTALL_SCHEMES) + if HAS_USER_SITE: + for key in ('nt_user', 'unix_user'): + self.assertIn(key, INSTALL_SCHEMES) dist = Distribution({'name': 'xx'}) cmd = install(dist) diff --git a/Lib/site.py b/Lib/site.py index 3a0f619d71c86e..5f1b31e73d90ad 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -264,6 +264,10 @@ def _getuserbase(): if env_base: return env_base + # VxWorks has no home directories + if sys.platform == "vxworks": + return None + def joinuser(*args): return os.path.expanduser(os.path.join(*args)) @@ -311,11 +315,14 @@ def getusersitepackages(): If the global variable ``USER_SITE`` is not initialized yet, this function will also set it. """ - global USER_SITE + global USER_SITE, ENABLE_USER_SITE userbase = getuserbase() # this will also set USER_BASE if USER_SITE is None: - USER_SITE = _get_path(userbase) + if userbase is None: + ENABLE_USER_SITE = False # disable user site and return None + else: + USER_SITE = _get_path(userbase) return USER_SITE @@ -630,11 +637,14 @@ def _script(): for dir in sys.path: print(" %r," % (dir,)) print("]") - print("USER_BASE: %r (%s)" % (user_base, - "exists" if os.path.isdir(user_base) else "doesn't exist")) - print("USER_SITE: %r (%s)" % (user_site, - "exists" if os.path.isdir(user_site) else "doesn't exist")) - print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) + def exists(path): + if path is not None and os.path.isdir(path): + return "exists" + else: + return "doesn't exist" + print(f"USER_BASE: {user_base!r} ({exists(user_base)})") + print(f"USER_SITE: {user_site!r} ({exists(user_site)})") + print(f"ENABLE_USER_SITE: {ENABLE_USER_SITE!r}") sys.exit(0) buffer = [] diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index e1b2f93f876d78..c1aaf79a677ba2 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -51,34 +51,65 @@ 'scripts': '{base}/Scripts', 'data': '{base}', }, - # NOTE: When modifying "purelib" scheme, update site._get_path() too. - 'nt_user': { - 'stdlib': '{userbase}/Python{py_version_nodot_plat}', - 'platstdlib': '{userbase}/Python{py_version_nodot_plat}', - 'purelib': '{userbase}/Python{py_version_nodot_plat}/site-packages', - 'platlib': '{userbase}/Python{py_version_nodot_plat}/site-packages', - 'include': '{userbase}/Python{py_version_nodot_plat}/Include', - 'scripts': '{userbase}/Python{py_version_nodot_plat}/Scripts', - 'data': '{userbase}', - }, - 'posix_user': { - 'stdlib': '{userbase}/{platlibdir}/python{py_version_short}', - 'platstdlib': '{userbase}/{platlibdir}/python{py_version_short}', - 'purelib': '{userbase}/lib/python{py_version_short}/site-packages', - 'platlib': '{userbase}/{platlibdir}/python{py_version_short}/site-packages', - 'include': '{userbase}/include/python{py_version_short}', - 'scripts': '{userbase}/bin', - 'data': '{userbase}', - }, - 'osx_framework_user': { - 'stdlib': '{userbase}/lib/python', - 'platstdlib': '{userbase}/lib/python', - 'purelib': '{userbase}/lib/python/site-packages', - 'platlib': '{userbase}/lib/python/site-packages', - 'include': '{userbase}/include', - 'scripts': '{userbase}/bin', - 'data': '{userbase}', - }, + } + + +# NOTE: site.py has copy of this function. +# Sync it when modify this function. +def _getuserbase(): + env_base = os.environ.get("PYTHONUSERBASE", None) + if env_base: + return env_base + + # VxWorks has no home directories + if sys.platform == "vxworks": + return None + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + return joinuser(base, "Python") + + if sys.platform == "darwin" and sys._framework: + return joinuser("~", "Library", sys._framework, + "%d.%d" % sys.version_info[:2]) + + return joinuser("~", ".local") + +_HAS_USER_BASE = (_getuserbase() is not None) + +if _HAS_USER_BASE: + _INSTALL_SCHEMES |= { + # NOTE: When modifying "purelib" scheme, update site._get_path() too. + 'nt_user': { + 'stdlib': '{userbase}/Python{py_version_nodot_plat}', + 'platstdlib': '{userbase}/Python{py_version_nodot_plat}', + 'purelib': '{userbase}/Python{py_version_nodot_plat}/site-packages', + 'platlib': '{userbase}/Python{py_version_nodot_plat}/site-packages', + 'include': '{userbase}/Python{py_version_nodot_plat}/Include', + 'scripts': '{userbase}/Python{py_version_nodot_plat}/Scripts', + 'data': '{userbase}', + }, + 'posix_user': { + 'stdlib': '{userbase}/{platlibdir}/python{py_version_short}', + 'platstdlib': '{userbase}/{platlibdir}/python{py_version_short}', + 'purelib': '{userbase}/lib/python{py_version_short}/site-packages', + 'platlib': '{userbase}/{platlibdir}/python{py_version_short}/site-packages', + 'include': '{userbase}/include/python{py_version_short}', + 'scripts': '{userbase}/bin', + 'data': '{userbase}', + }, + 'osx_framework_user': { + 'stdlib': '{userbase}/lib/python', + 'platstdlib': '{userbase}/lib/python', + 'purelib': '{userbase}/lib/python/site-packages', + 'platlib': '{userbase}/lib/python/site-packages', + 'include': '{userbase}/include', + 'scripts': '{userbase}/bin', + 'data': '{userbase}', + }, } _SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include', @@ -183,25 +214,6 @@ def _get_default_scheme(): return os.name -# NOTE: site.py has copy of this function. -# Sync it when modify this function. -def _getuserbase(): - env_base = os.environ.get("PYTHONUSERBASE", None) - if env_base: - return env_base - - def joinuser(*args): - return os.path.expanduser(os.path.join(*args)) - - if os.name == "nt": - base = os.environ.get("APPDATA") or "~" - return joinuser(base, "Python") - - if sys.platform == "darwin" and sys._framework: - return joinuser("~", "Library", sys._framework, - "%d.%d" % sys.version_info[:2]) - - return joinuser("~", ".local") def _parse_makefile(filename, vars=None): @@ -558,10 +570,11 @@ def get_config_vars(*args): SO = _CONFIG_VARS.get('EXT_SUFFIX') if SO is not None: _CONFIG_VARS['SO'] = SO - # Setting 'userbase' is done below the call to the - # init function to enable using 'get_config_var' in - # the init-function. - _CONFIG_VARS['userbase'] = _getuserbase() + if _HAS_USER_BASE: + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + _CONFIG_VARS['userbase'] = _getuserbase() # Always convert srcdir to an absolute path srcdir = _CONFIG_VARS.get('srcdir', _PROJECT_BASE) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 2e70880f56d141..6060288248efba 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -36,6 +36,7 @@ import site +HAS_USER_SITE = (site.USER_SITE is not None) OLD_SYS_PATH = None @@ -195,6 +196,7 @@ def test_addsitedir(self): def test__getuserbase(self): self.assertEqual(site._getuserbase(), sysconfig._getuserbase()) + @unittest.skipUnless(HAS_USER_SITE, 'need user site') def test_get_path(self): if sys.platform == 'darwin' and sys._framework: scheme = 'osx_framework_user' @@ -244,6 +246,7 @@ def test_s_option(self): self.assertEqual(rc, 1, "User base not set by PYTHONUSERBASE") + @unittest.skipUnless(HAS_USER_SITE, 'need user site') def test_getuserbase(self): site.USER_BASE = None user_base = site.getuserbase() @@ -261,6 +264,7 @@ def test_getuserbase(self): self.assertTrue(site.getuserbase().startswith('xoxo'), site.getuserbase()) + @unittest.skipUnless(HAS_USER_SITE, 'need user site') def test_getusersitepackages(self): site.USER_SITE = None site.USER_BASE = None @@ -295,6 +299,7 @@ def test_getsitepackages(self): wanted = os.path.join('xoxo', 'lib', 'site-packages') self.assertEqual(dirs[1], wanted) + @unittest.skipUnless(HAS_USER_SITE, 'need user site') def test_no_home_directory(self): # bpo-10496: getuserbase() and getusersitepackages() must not fail if # the current user has no home directory (if expanduser() returns the diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py index 352dbdea817e63..e279957e26ced4 100644 --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -18,6 +18,10 @@ get_scheme_names, get_config_var, _main) import _osx_support + +HAS_USER_BASE = sysconfig._HAS_USER_BASE + + class TestSysConfig(unittest.TestCase): def setUp(self): @@ -230,9 +234,10 @@ def test_get_config_h_filename(self): self.assertTrue(os.path.isfile(config_h), config_h) def test_get_scheme_names(self): - wanted = ('nt', 'nt_user', 'osx_framework_user', - 'posix_home', 'posix_prefix', 'posix_user') - self.assertEqual(get_scheme_names(), wanted) + wanted = ['nt', 'posix_home', 'posix_prefix'] + if HAS_USER_BASE: + wanted.extend(['nt_user', 'osx_framework_user', 'posix_user']) + self.assertEqual(get_scheme_names(), tuple(sorted(wanted))) @skip_unless_symlink def test_symlink(self): # Issue 7880 @@ -244,7 +249,8 @@ def test_user_similar(self): # Issue #8759: make sure the posix scheme for the users # is similar to the global posix_prefix one base = get_config_var('base') - user = get_config_var('userbase') + if HAS_USER_BASE: + user = get_config_var('userbase') # the global scheme mirrors the distinction between prefix and # exec-prefix but not the user scheme, so we have to adapt the paths # before comparing (issue #9100) @@ -259,8 +265,9 @@ def test_user_similar(self): # before comparing global_path = global_path.replace(sys.base_prefix, sys.prefix) base = base.replace(sys.base_prefix, sys.prefix) - user_path = get_path(name, 'posix_user') - self.assertEqual(user_path, global_path.replace(base, user, 1)) + if HAS_USER_BASE: + user_path = get_path(name, 'posix_user') + self.assertEqual(user_path, global_path.replace(base, user, 1)) def test_main(self): # just making sure _main() runs and returns things in the stdout diff --git a/Misc/NEWS.d/next/Library/2020-08-11-17-44-07.bpo-31904.cb13ea.rst b/Misc/NEWS.d/next/Library/2020-08-11-17-44-07.bpo-31904.cb13ea.rst new file mode 100644 index 00000000000000..a7164b7a5a26dd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-11-17-44-07.bpo-31904.cb13ea.rst @@ -0,0 +1 @@ +Fix site and sysconfig modules for VxWorks RTOS which has no home directories. From 05fb1aa0938352a1bdaacd612eb2a68867ace99a Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Mon, 21 Dec 2020 07:38:02 +0100 Subject: [PATCH 0843/1261] [WIP/RFC] bpo-15872: tests: remove oddity from test_rmtree_errors (GH-22967) This was added for (some) Windows buildbots back in 2012, and should either not be necessary anymore, or it should probably get investigated why "\*.*" gets added to filenames in the first place. Ref: Automerge-Triggered-By: GH:hynek --- Lib/test/test_shutil.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index df7fbedf24a7c2..df8dcdcce60919 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -280,10 +280,7 @@ def test_rmtree_errors(self): filename = os.path.join(tmpdir, "tstfile") with self.assertRaises(NotADirectoryError) as cm: shutil.rmtree(filename) - # The reason for this rather odd construct is that Windows sprinkles - # a \*.* at the end of file names. But only sometimes on some buildbots - possible_args = [filename, os.path.join(filename, '*.*')] - self.assertIn(cm.exception.filename, possible_args) + self.assertEqual(cm.exception.filename, filename) self.assertTrue(os.path.exists(filename)) # test that ignore_errors option is honored shutil.rmtree(filename, ignore_errors=True) @@ -296,11 +293,11 @@ def onerror(*args): self.assertIs(errors[0][0], os.scandir) self.assertEqual(errors[0][1], filename) self.assertIsInstance(errors[0][2][1], NotADirectoryError) - self.assertIn(errors[0][2][1].filename, possible_args) + self.assertEqual(errors[0][2][1].filename, filename) self.assertIs(errors[1][0], os.rmdir) self.assertEqual(errors[1][1], filename) self.assertIsInstance(errors[1][2][1], NotADirectoryError) - self.assertIn(errors[1][2][1].filename, possible_args) + self.assertEqual(errors[1][2][1].filename, filename) @unittest.skipIf(sys.platform[:6] == 'cygwin', From 231c2206d59ba2d20072e65e58a98bf0622f9607 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Ogam?= Date: Mon, 21 Dec 2020 14:13:08 +0100 Subject: [PATCH 0844/1261] bpo-35790: Correct the description of sys.exc_info() and add a code example (GH-11625) --- Doc/reference/compound_stmts.rst | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 8da74c79801be9..5bba3eea6f6c04 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -302,9 +302,27 @@ Before an except clause's suite is executed, details about the exception are stored in the :mod:`sys` module and can be accessed via :func:`sys.exc_info`. :func:`sys.exc_info` returns a 3-tuple consisting of the exception class, the exception instance and a traceback object (see section :ref:`types`) identifying -the point in the program where the exception occurred. :func:`sys.exc_info` -values are restored to their previous values (before the call) when returning -from a function that handled an exception. +the point in the program where the exception occurred. The details about the +exception accessed via :func:`sys.exc_info` are restored to their previous values +when leaving an exception handler:: + + >>> print(sys.exc_info()) + (None, None, None) + >>> try: + ... raise TypeError + ... except: + ... print(sys.exc_info()) + ... try: + ... raise ValueError + ... except: + ... print(sys.exc_info()) + ... print(sys.exc_info()) + ... + (, TypeError(), ) + (, ValueError(), ) + (, TypeError(), ) + >>> print(sys.exc_info()) + (None, None, None) .. index:: keyword: else From da580d1d4f4d87046be6d0401aee4c3f1cea8e73 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Mon, 21 Dec 2020 13:53:50 +0000 Subject: [PATCH 0845/1261] bpo-42634: Mark reraise after except blocks as artificial. (GH-23877) * Mark reraise after except blocks as artificial. * Update importlib * Update dis test. --- Lib/test/test_dis.py | 74 +- Lib/test/test_sys_settrace.py | 19 + Python/compile.c | 2 + Python/importlib.h | 3455 +++++++++++------------ Python/importlib_external.h | 4811 +++++++++++++++++---------------- Python/importlib_zipimport.h | 1734 ++++++------ 6 files changed, 5063 insertions(+), 5032 deletions(-) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index d5d815dc5dc55a..f618d2dbf62131 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1056,17 +1056,17 @@ def jumpy(): Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=96, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=98, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=100, starts_line=None, is_jump_target=False), - Instruction(opname='SETUP_FINALLY', opcode=122, arg=98, argval=202, argrepr='to 202', offset=102, starts_line=20, is_jump_target=True), + Instruction(opname='SETUP_FINALLY', opcode=122, arg=96, argval=200, argrepr='to 200', offset=102, starts_line=20, is_jump_target=True), Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=118, argrepr='to 118', offset=104, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=106, starts_line=21, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False), Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=144, argrepr='to 144', offset=116, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=24, argval=142, argrepr='to 142', offset=116, starts_line=None, is_jump_target=False), Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=118, starts_line=22, is_jump_target=True), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=120, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_IF_NOT_EXC_MATCH', opcode=121, arg=142, argval=142, argrepr='', offset=122, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_IF_NOT_EXC_MATCH', opcode=121, arg=210, argval=210, argrepr='', offset=122, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=124, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=126, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=128, starts_line=None, is_jump_target=False), @@ -1075,42 +1075,42 @@ def jumpy(): Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=134, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=136, starts_line=None, is_jump_target=False), Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=46, argval=188, argrepr='to 188', offset=140, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=142, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, starts_line=25, is_jump_target=True), - Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=172, argrepr='to 172', offset=146, starts_line=None, is_jump_target=False), - Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=148, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=150, starts_line=26, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=152, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=154, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=156, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=160, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=44, argval=186, argrepr='to 186', offset=140, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=142, starts_line=25, is_jump_target=True), + Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=170, argrepr='to 170', offset=144, starts_line=None, is_jump_target=False), + Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=146, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=148, starts_line=26, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=150, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=152, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=154, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=156, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=158, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False), Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=162, starts_line=None, is_jump_target=False), - Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=166, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=188, argrepr='to 188', offset=170, starts_line=None, is_jump_target=False), - Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=True), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=178, argval=178, argrepr='', offset=174, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=176, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=True), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=164, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=166, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=186, argrepr='to 186', offset=168, starts_line=None, is_jump_target=False), + Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=170, starts_line=None, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=176, argval=176, argrepr='', offset=172, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=174, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=176, starts_line=None, is_jump_target=True), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=188, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=190, starts_line=28, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=192, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=194, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=196, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=198, starts_line=None, is_jump_target=False), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=200, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=202, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=204, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=206, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=208, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=210, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=188, starts_line=28, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=190, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=192, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=194, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=196, starts_line=None, is_jump_target=False), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=198, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=200, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=202, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=204, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=206, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=208, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=210, starts_line=22, is_jump_target=True), ] # One last piece of inspect fodder to check the default line number handling diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 3bfc99385d2eb3..340f37fae7c5bc 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -791,6 +791,25 @@ def func(): (4, 'line'), (4, 'return')]) + def test_try_except_with_wrong_type(self): + + def func(): + try: + 2/0 + except IndexError: + 4 + finally: + return 6 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (2, 'exception'), + (3, 'line'), + (6, 'line'), + (6, 'return')]) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Python/compile.c b/Python/compile.c index d4dbaf7b6aa774..6698b55000d9cf 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3129,6 +3129,8 @@ compiler_try_except(struct compiler *c, stmt_ty s) compiler_use_next_block(c, except); } compiler_pop_fblock(c, EXCEPTION_HANDLER, NULL); + /* Mark as artificial */ + c->u->u_lineno = -1; ADDOP_I(c, RERAISE, 0); compiler_use_next_block(c, orelse); VISIT_SEQ(c, stmt, s->v.Try.orelse); diff --git a/Python/importlib.h b/Python/importlib.h index 87b8c63ce85a8f..14d0557f75aae7 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -63,272 +63,272 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 98,106,169,0,114,5,0,0,0,250,29,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,218,12,95,111,98,106,101,99, - 116,95,110,97,109,101,23,0,0,0,115,10,0,0,0,2, - 1,8,1,12,1,16,1,255,128,114,7,0,0,0,78,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 7,0,0,0,67,0,0,0,115,56,0,0,0,100,1,68, - 0,93,32,125,2,116,0,124,1,124,2,131,2,114,4,116, - 1,124,0,124,2,116,2,124,1,124,2,131,2,131,3,1, - 0,113,4,124,0,106,3,160,4,124,1,106,3,161,1,1, - 0,100,2,83,0,41,3,122,47,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,41,4,218,10,95,95,109,111, - 100,117,108,101,95,95,218,8,95,95,110,97,109,101,95,95, - 114,1,0,0,0,218,7,95,95,100,111,99,95,95,78,41, - 5,218,7,104,97,115,97,116,116,114,218,7,115,101,116,97, - 116,116,114,218,7,103,101,116,97,116,116,114,218,8,95,95, - 100,105,99,116,95,95,218,6,117,112,100,97,116,101,41,3, - 90,3,110,101,119,90,3,111,108,100,218,7,114,101,112,108, - 97,99,101,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,5,95,119,114,97,112,40,0,0,0,115,12,0, - 0,0,8,2,10,1,18,1,2,128,18,1,255,128,114,17, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,2,0,0,0,67,0,0,0,115,12,0,0, - 0,116,0,116,1,131,1,124,0,131,1,83,0,114,0,0, - 0,0,41,2,114,3,0,0,0,218,3,115,121,115,169,1, - 218,4,110,97,109,101,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,11,95,110,101,119,95,109,111,100,117, - 108,101,48,0,0,0,115,4,0,0,0,12,1,255,128,114, - 21,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,64,0,0,0,115,12,0, - 0,0,101,0,90,1,100,0,90,2,100,1,83,0,41,2, - 218,14,95,68,101,97,100,108,111,99,107,69,114,114,111,114, - 78,41,3,114,9,0,0,0,114,8,0,0,0,114,1,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,22,0,0,0,61,0,0,0,115, - 6,0,0,0,8,0,4,1,255,128,114,22,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,64,0,0,0,115,56,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, - 4,100,4,100,5,132,0,90,5,100,6,100,7,132,0,90, - 6,100,8,100,9,132,0,90,7,100,10,100,11,132,0,90, - 8,100,12,83,0,41,13,218,11,95,77,111,100,117,108,101, - 76,111,99,107,122,169,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,0,0,0,0,2,0,0,0, - 2,0,0,0,67,0,0,0,115,48,0,0,0,116,0,160, - 1,161,0,124,0,95,2,116,0,160,1,161,0,124,0,95, - 3,124,1,124,0,95,4,100,0,124,0,95,5,100,1,124, - 0,95,6,100,1,124,0,95,7,100,0,83,0,169,2,78, - 233,0,0,0,0,41,8,218,7,95,116,104,114,101,97,100, - 90,13,97,108,108,111,99,97,116,101,95,108,111,99,107,218, - 4,108,111,99,107,218,6,119,97,107,101,117,112,114,20,0, - 0,0,218,5,111,119,110,101,114,218,5,99,111,117,110,116, - 218,7,119,97,105,116,101,114,115,169,2,218,4,115,101,108, - 102,114,20,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,8,95,95,105,110,105,116,95,95,71, - 0,0,0,115,14,0,0,0,10,1,10,1,6,1,6,1, - 6,1,10,1,255,128,122,20,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,0,0,0,0,5,0,0,0,3,0,0, - 0,67,0,0,0,115,86,0,0,0,116,0,160,1,161,0, - 125,1,124,0,106,2,125,2,116,3,131,0,125,3,9,0, - 116,4,160,5,124,2,161,1,125,4,124,4,100,0,117,0, - 114,44,100,2,83,0,124,4,106,2,125,2,124,2,124,1, - 107,2,114,62,100,1,83,0,124,2,124,3,118,0,114,74, - 100,2,83,0,124,3,160,6,124,2,161,1,1,0,113,22, - 41,3,78,84,70,41,7,114,26,0,0,0,218,9,103,101, - 116,95,105,100,101,110,116,114,29,0,0,0,218,3,115,101, - 116,218,12,95,98,108,111,99,107,105,110,103,95,111,110,218, - 3,103,101,116,218,3,97,100,100,41,5,114,33,0,0,0, - 90,2,109,101,218,3,116,105,100,90,4,115,101,101,110,114, - 27,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,12,104,97,115,95,100,101,97,100,108,111,99, - 107,79,0,0,0,115,30,0,0,0,8,2,6,1,6,1, - 2,1,10,1,8,1,4,1,6,1,8,1,4,1,8,1, - 4,6,10,1,2,242,255,128,122,24,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,0,0,0,0,2, - 0,0,0,8,0,0,0,67,0,0,0,115,198,0,0,0, - 116,0,160,1,161,0,125,1,124,0,116,2,124,1,60,0, - 122,172,9,0,124,0,106,3,143,126,1,0,124,0,106,4, - 100,2,107,2,115,48,124,0,106,5,124,1,107,2,114,92, - 124,1,124,0,95,5,124,0,4,0,106,4,100,3,55,0, - 2,0,95,4,87,0,100,4,4,0,4,0,131,3,1,0, - 87,0,116,2,124,1,61,0,100,1,83,0,124,0,160,6, - 161,0,114,112,116,7,100,5,124,0,22,0,131,1,130,1, - 124,0,106,8,160,9,100,6,161,1,114,138,124,0,4,0, - 106,10,100,3,55,0,2,0,95,10,87,0,100,4,4,0, - 4,0,131,3,1,0,110,16,49,0,115,158,119,1,1,0, - 1,0,1,0,89,0,1,0,124,0,106,8,160,9,161,0, - 1,0,124,0,106,8,160,11,161,0,1,0,113,20,116,2, - 124,1,61,0,119,0,41,7,122,185,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,84,114,25,0,0,0,233,1,0,0,0,78,122, - 23,100,101,97,100,108,111,99,107,32,100,101,116,101,99,116, - 101,100,32,98,121,32,37,114,70,41,12,114,26,0,0,0, - 114,35,0,0,0,114,37,0,0,0,114,27,0,0,0,114, - 30,0,0,0,114,29,0,0,0,114,41,0,0,0,114,22, - 0,0,0,114,28,0,0,0,218,7,97,99,113,117,105,114, - 101,114,31,0,0,0,218,7,114,101,108,101,97,115,101,169, - 2,114,33,0,0,0,114,40,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,114,43,0,0,0,100, - 0,0,0,115,38,0,0,0,8,6,8,1,2,1,2,1, - 8,1,20,1,6,1,14,1,14,1,10,9,8,248,12,1, - 12,1,44,1,10,2,10,1,2,244,8,14,255,128,122,19, - 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,0,0,0,0, - 2,0,0,0,8,0,0,0,67,0,0,0,115,144,0,0, - 0,116,0,160,1,161,0,125,1,124,0,106,2,143,110,1, - 0,124,0,106,3,124,1,107,3,114,34,116,4,100,1,131, - 1,130,1,124,0,106,5,100,2,107,4,115,48,74,0,130, - 1,124,0,4,0,106,5,100,3,56,0,2,0,95,5,124, - 0,106,5,100,2,107,2,114,108,100,0,124,0,95,3,124, - 0,106,6,114,108,124,0,4,0,106,6,100,3,56,0,2, - 0,95,6,124,0,106,7,160,8,161,0,1,0,87,0,100, - 0,4,0,4,0,131,3,1,0,100,0,83,0,49,0,115, - 130,119,1,1,0,1,0,1,0,89,0,1,0,100,0,83, - 0,41,4,78,250,31,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,114,25,0,0,0,114,42,0,0,0,41, - 9,114,26,0,0,0,114,35,0,0,0,114,27,0,0,0, - 114,29,0,0,0,218,12,82,117,110,116,105,109,101,69,114, - 114,111,114,114,30,0,0,0,114,31,0,0,0,114,28,0, - 0,0,114,44,0,0,0,114,45,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,44,0,0,0, - 125,0,0,0,115,24,0,0,0,8,1,8,1,10,1,8, - 1,14,1,14,1,10,1,6,1,6,1,14,1,46,1,255, - 128,122,19,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,0, - 0,0,0,1,0,0,0,5,0,0,0,67,0,0,0,115, - 18,0,0,0,100,1,160,0,124,0,106,1,116,2,124,0, - 131,1,161,2,83,0,41,2,78,122,23,95,77,111,100,117, - 108,101,76,111,99,107,40,123,33,114,125,41,32,97,116,32, - 123,125,169,3,218,6,102,111,114,109,97,116,114,20,0,0, - 0,218,2,105,100,169,1,114,33,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,8,95,95,114, - 101,112,114,95,95,138,0,0,0,115,4,0,0,0,18,1, - 255,128,122,20,95,77,111,100,117,108,101,76,111,99,107,46, - 95,95,114,101,112,114,95,95,78,41,9,114,9,0,0,0, - 114,8,0,0,0,114,1,0,0,0,114,10,0,0,0,114, - 34,0,0,0,114,41,0,0,0,114,43,0,0,0,114,44, - 0,0,0,114,52,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,23,0,0, - 0,65,0,0,0,115,16,0,0,0,8,0,4,1,8,5, - 8,8,8,21,8,25,12,13,255,128,114,23,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,64,0,0,0,115,48,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, - 4,100,4,100,5,132,0,90,5,100,6,100,7,132,0,90, - 6,100,8,100,9,132,0,90,7,100,10,83,0,41,11,218, - 16,95,68,117,109,109,121,77,111,100,117,108,101,76,111,99, - 107,122,86,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0, - 0,0,115,16,0,0,0,124,1,124,0,95,0,100,1,124, - 0,95,1,100,0,83,0,114,24,0,0,0,41,2,114,20, - 0,0,0,114,30,0,0,0,114,32,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,34,0,0, - 0,146,0,0,0,115,6,0,0,0,6,1,10,1,255,128, - 122,25,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,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,18,0,0,0,124,0,4,0,106,0,100, - 1,55,0,2,0,95,0,100,2,83,0,41,3,78,114,42, - 0,0,0,84,41,1,114,30,0,0,0,114,51,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 43,0,0,0,150,0,0,0,115,6,0,0,0,14,1,4, - 1,255,128,122,24,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, + 116,95,110,97,109,101,23,0,0,0,115,12,0,0,0,2, + 1,8,1,12,1,14,1,2,255,255,128,114,7,0,0,0, + 78,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,7,0,0,0,67,0,0,0,115,56,0,0,0,100, + 1,68,0,93,32,125,2,116,0,124,1,124,2,131,2,114, + 4,116,1,124,0,124,2,116,2,124,1,124,2,131,2,131, + 3,1,0,113,4,124,0,106,3,160,4,124,1,106,3,161, + 1,1,0,100,2,83,0,41,3,122,47,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,41,4,218,10,95,95, + 109,111,100,117,108,101,95,95,218,8,95,95,110,97,109,101, + 95,95,114,1,0,0,0,218,7,95,95,100,111,99,95,95, + 78,41,5,218,7,104,97,115,97,116,116,114,218,7,115,101, + 116,97,116,116,114,218,7,103,101,116,97,116,116,114,218,8, + 95,95,100,105,99,116,95,95,218,6,117,112,100,97,116,101, + 41,3,90,3,110,101,119,90,3,111,108,100,218,7,114,101, + 112,108,97,99,101,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,5,95,119,114,97,112,40,0,0,0,115, + 12,0,0,0,8,2,10,1,18,1,2,128,18,1,255,128, + 114,17,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,12, + 0,0,0,116,0,116,1,131,1,124,0,131,1,83,0,114, + 0,0,0,0,41,2,114,3,0,0,0,218,3,115,121,115, + 169,1,218,4,110,97,109,101,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,11,95,110,101,119,95,109,111, + 100,117,108,101,48,0,0,0,115,4,0,0,0,12,1,255, + 128,114,21,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,64,0,0,0,115, + 12,0,0,0,101,0,90,1,100,0,90,2,100,1,83,0, + 41,2,218,14,95,68,101,97,100,108,111,99,107,69,114,114, + 111,114,78,41,3,114,9,0,0,0,114,8,0,0,0,114, + 1,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,22,0,0,0,61,0,0, + 0,115,6,0,0,0,8,0,4,1,255,128,114,22,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,64,0,0,0,115,56,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, + 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,132, + 0,90,6,100,8,100,9,132,0,90,7,100,10,100,11,132, + 0,90,8,100,12,83,0,41,13,218,11,95,77,111,100,117, + 108,101,76,111,99,107,122,169,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,0,0,0,0,2,0, + 0,0,2,0,0,0,67,0,0,0,115,48,0,0,0,116, + 0,160,1,161,0,124,0,95,2,116,0,160,1,161,0,124, + 0,95,3,124,1,124,0,95,4,100,0,124,0,95,5,100, + 1,124,0,95,6,100,1,124,0,95,7,100,0,83,0,169, + 2,78,233,0,0,0,0,41,8,218,7,95,116,104,114,101, + 97,100,90,13,97,108,108,111,99,97,116,101,95,108,111,99, + 107,218,4,108,111,99,107,218,6,119,97,107,101,117,112,114, + 20,0,0,0,218,5,111,119,110,101,114,218,5,99,111,117, + 110,116,218,7,119,97,105,116,101,114,115,169,2,218,4,115, + 101,108,102,114,20,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,8,95,95,105,110,105,116,95, + 95,71,0,0,0,115,14,0,0,0,10,1,10,1,6,1, + 6,1,6,1,10,1,255,128,122,20,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,0,0,0,0,5,0,0,0,3, + 0,0,0,67,0,0,0,115,86,0,0,0,116,0,160,1, + 161,0,125,1,124,0,106,2,125,2,116,3,131,0,125,3, + 9,0,116,4,160,5,124,2,161,1,125,4,124,4,100,0, + 117,0,114,44,100,2,83,0,124,4,106,2,125,2,124,2, + 124,1,107,2,114,62,100,1,83,0,124,2,124,3,118,0, + 114,74,100,2,83,0,124,3,160,6,124,2,161,1,1,0, + 113,22,41,3,78,84,70,41,7,114,26,0,0,0,218,9, + 103,101,116,95,105,100,101,110,116,114,29,0,0,0,218,3, + 115,101,116,218,12,95,98,108,111,99,107,105,110,103,95,111, + 110,218,3,103,101,116,218,3,97,100,100,41,5,114,33,0, + 0,0,90,2,109,101,218,3,116,105,100,90,4,115,101,101, + 110,114,27,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,12,104,97,115,95,100,101,97,100,108, + 111,99,107,79,0,0,0,115,30,0,0,0,8,2,6,1, + 6,1,2,1,10,1,8,1,4,1,6,1,8,1,4,1, + 8,1,4,6,10,1,2,242,255,128,122,24,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,0,0,0, + 0,2,0,0,0,8,0,0,0,67,0,0,0,115,198,0, + 0,0,116,0,160,1,161,0,125,1,124,0,116,2,124,1, + 60,0,122,172,9,0,124,0,106,3,143,126,1,0,124,0, + 106,4,100,2,107,2,115,48,124,0,106,5,124,1,107,2, + 114,92,124,1,124,0,95,5,124,0,4,0,106,4,100,3, + 55,0,2,0,95,4,87,0,100,4,4,0,4,0,131,3, + 1,0,87,0,116,2,124,1,61,0,100,1,83,0,124,0, + 160,6,161,0,114,112,116,7,100,5,124,0,22,0,131,1, + 130,1,124,0,106,8,160,9,100,6,161,1,114,138,124,0, + 4,0,106,10,100,3,55,0,2,0,95,10,87,0,100,4, + 4,0,4,0,131,3,1,0,110,16,49,0,115,158,119,1, + 1,0,1,0,1,0,89,0,1,0,124,0,106,8,160,9, + 161,0,1,0,124,0,106,8,160,11,161,0,1,0,113,20, + 116,2,124,1,61,0,119,0,41,7,122,185,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,84,114,25,0,0,0,233,1,0,0,0, + 78,122,23,100,101,97,100,108,111,99,107,32,100,101,116,101, + 99,116,101,100,32,98,121,32,37,114,70,41,12,114,26,0, + 0,0,114,35,0,0,0,114,37,0,0,0,114,27,0,0, + 0,114,30,0,0,0,114,29,0,0,0,114,41,0,0,0, + 114,22,0,0,0,114,28,0,0,0,218,7,97,99,113,117, + 105,114,101,114,31,0,0,0,218,7,114,101,108,101,97,115, + 101,169,2,114,33,0,0,0,114,40,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,43,0,0, + 0,100,0,0,0,115,38,0,0,0,8,6,8,1,2,1, + 2,1,8,1,20,1,6,1,14,1,14,1,10,9,8,248, + 12,1,12,1,44,1,10,2,10,1,2,244,8,14,255,128, + 122,19,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,0,0, + 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,144, + 0,0,0,116,0,160,1,161,0,125,1,124,0,106,2,143, + 110,1,0,124,0,106,3,124,1,107,3,114,34,116,4,100, + 1,131,1,130,1,124,0,106,5,100,2,107,4,115,48,74, + 0,130,1,124,0,4,0,106,5,100,3,56,0,2,0,95, + 5,124,0,106,5,100,2,107,2,114,108,100,0,124,0,95, + 3,124,0,106,6,114,108,124,0,4,0,106,6,100,3,56, + 0,2,0,95,6,124,0,106,7,160,8,161,0,1,0,87, + 0,100,0,4,0,4,0,131,3,1,0,100,0,83,0,49, + 0,115,130,119,1,1,0,1,0,1,0,89,0,1,0,100, + 0,83,0,41,4,78,250,31,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,114,25,0,0,0,114,42,0,0, + 0,41,9,114,26,0,0,0,114,35,0,0,0,114,27,0, + 0,0,114,29,0,0,0,218,12,82,117,110,116,105,109,101, + 69,114,114,111,114,114,30,0,0,0,114,31,0,0,0,114, + 28,0,0,0,114,44,0,0,0,114,45,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,44,0, + 0,0,125,0,0,0,115,24,0,0,0,8,1,8,1,10, + 1,8,1,14,1,14,1,10,1,6,1,6,1,14,1,46, + 1,255,128,122,19,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,0,0,0,0,1,0,0,0,5,0,0,0,67,0,0, + 0,115,18,0,0,0,100,1,160,0,124,0,106,1,116,2, + 124,0,131,1,161,2,83,0,41,2,78,122,23,95,77,111, + 100,117,108,101,76,111,99,107,40,123,33,114,125,41,32,97, + 116,32,123,125,169,3,218,6,102,111,114,109,97,116,114,20, + 0,0,0,218,2,105,100,169,1,114,33,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,8,95, + 95,114,101,112,114,95,95,138,0,0,0,115,4,0,0,0, + 18,1,255,128,122,20,95,77,111,100,117,108,101,76,111,99, + 107,46,95,95,114,101,112,114,95,95,78,41,9,114,9,0, + 0,0,114,8,0,0,0,114,1,0,0,0,114,10,0,0, + 0,114,34,0,0,0,114,41,0,0,0,114,43,0,0,0, + 114,44,0,0,0,114,52,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,23, + 0,0,0,65,0,0,0,115,16,0,0,0,8,0,4,1, + 8,5,8,8,8,21,8,25,12,13,255,128,114,23,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,64,0,0,0,115,48,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, + 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,132, + 0,90,6,100,8,100,9,132,0,90,7,100,10,83,0,41, + 11,218,16,95,68,117,109,109,121,77,111,100,117,108,101,76, + 111,99,107,122,86,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,0,0,0,0,2,0,0,0,2,0,0,0, + 67,0,0,0,115,16,0,0,0,124,1,124,0,95,0,100, + 1,124,0,95,1,100,0,83,0,114,24,0,0,0,41,2, + 114,20,0,0,0,114,30,0,0,0,114,32,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,34, + 0,0,0,146,0,0,0,115,6,0,0,0,6,1,10,1, + 255,128,122,25,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,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,36,0,0,0,124,0,106,0,100, - 1,107,2,114,18,116,1,100,2,131,1,130,1,124,0,4, - 0,106,0,100,3,56,0,2,0,95,0,100,0,83,0,41, - 4,78,114,25,0,0,0,114,46,0,0,0,114,42,0,0, - 0,41,2,114,30,0,0,0,114,47,0,0,0,114,51,0, + 0,0,67,0,0,0,115,18,0,0,0,124,0,4,0,106, + 0,100,1,55,0,2,0,95,0,100,2,83,0,41,3,78, + 114,42,0,0,0,84,41,1,114,30,0,0,0,114,51,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,44,0,0,0,154,0,0,0,115,8,0,0,0,10, - 1,8,1,18,1,255,128,122,24,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,0,0,0,0,1,0, - 0,0,5,0,0,0,67,0,0,0,115,18,0,0,0,100, - 1,160,0,124,0,106,1,116,2,124,0,131,1,161,2,83, - 0,41,2,78,122,28,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,114,48,0,0,0,114,51,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,52,0,0,0, - 159,0,0,0,115,4,0,0,0,18,1,255,128,122,25,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,41,8,114,9,0,0,0, - 114,8,0,0,0,114,1,0,0,0,114,10,0,0,0,114, - 34,0,0,0,114,43,0,0,0,114,44,0,0,0,114,52, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,53,0,0,0,142,0,0,0, - 115,14,0,0,0,8,0,4,1,8,3,8,4,8,4,12, - 5,255,128,114,53,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,36,0,0,0,101,0,90,1,100,0,90,2,100,1, - 100,2,132,0,90,3,100,3,100,4,132,0,90,4,100,5, - 100,6,132,0,90,5,100,7,83,0,41,8,218,18,95,77, - 111,100,117,108,101,76,111,99,107,77,97,110,97,103,101,114, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,2,0,0,0,67,0,0,0,115,16,0,0,0,124,1, - 124,0,95,0,100,0,124,0,95,1,100,0,83,0,114,0, - 0,0,0,41,2,218,5,95,110,97,109,101,218,5,95,108, - 111,99,107,114,32,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,34,0,0,0,165,0,0,0, - 115,6,0,0,0,6,1,10,1,255,128,122,27,95,77,111, - 100,117,108,101,76,111,99,107,77,97,110,97,103,101,114,46, - 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,0, - 0,115,26,0,0,0,116,0,124,0,106,1,131,1,124,0, - 95,2,124,0,106,2,160,3,161,0,1,0,100,0,83,0, - 114,0,0,0,0,41,4,218,16,95,103,101,116,95,109,111, - 100,117,108,101,95,108,111,99,107,114,55,0,0,0,114,56, - 0,0,0,114,43,0,0,0,114,51,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,9,95,95, - 101,110,116,101,114,95,95,169,0,0,0,115,6,0,0,0, - 12,1,14,1,255,128,122,28,95,77,111,100,117,108,101,76, - 111,99,107,77,97,110,97,103,101,114,46,95,95,101,110,116, - 101,114,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,2,0,0,0,79,0,0,0,115,14,0, - 0,0,124,0,106,0,160,1,161,0,1,0,100,0,83,0, - 114,0,0,0,0,41,2,114,56,0,0,0,114,44,0,0, - 0,41,3,114,33,0,0,0,218,4,97,114,103,115,90,6, - 107,119,97,114,103,115,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,8,95,95,101,120,105,116,95,95,173, - 0,0,0,115,4,0,0,0,14,1,255,128,122,27,95,77, - 111,100,117,108,101,76,111,99,107,77,97,110,97,103,101,114, - 46,95,95,101,120,105,116,95,95,78,41,6,114,9,0,0, - 0,114,8,0,0,0,114,1,0,0,0,114,34,0,0,0, - 114,58,0,0,0,114,60,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,54, - 0,0,0,163,0,0,0,115,10,0,0,0,8,0,8,2, - 8,4,12,4,255,128,114,54,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0, - 67,0,0,0,115,134,0,0,0,116,0,160,1,161,0,1, - 0,122,114,122,14,116,2,124,0,25,0,131,0,125,1,87, - 0,110,22,4,0,116,3,121,46,1,0,1,0,1,0,100, - 1,125,1,89,0,110,2,119,0,124,1,100,1,117,0,114, - 110,116,4,100,1,117,0,114,74,116,5,124,0,131,1,125, - 1,110,8,116,6,124,0,131,1,125,1,124,0,102,1,100, - 2,100,3,132,1,125,2,116,7,160,8,124,1,124,2,161, - 2,116,2,124,0,60,0,87,0,116,0,160,9,161,0,1, - 0,124,1,83,0,116,0,160,9,161,0,1,0,119,0,41, + 0,114,43,0,0,0,150,0,0,0,115,6,0,0,0,14, + 1,4,1,255,128,122,24,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,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,36,0,0,0,124,0,106, + 0,100,1,107,2,114,18,116,1,100,2,131,1,130,1,124, + 0,4,0,106,0,100,3,56,0,2,0,95,0,100,0,83, + 0,41,4,78,114,25,0,0,0,114,46,0,0,0,114,42, + 0,0,0,41,2,114,30,0,0,0,114,47,0,0,0,114, + 51,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,44,0,0,0,154,0,0,0,115,8,0,0, + 0,10,1,8,1,18,1,255,128,122,24,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,0,0,0,0, + 1,0,0,0,5,0,0,0,67,0,0,0,115,18,0,0, + 0,100,1,160,0,124,0,106,1,116,2,124,0,131,1,161, + 2,83,0,41,2,78,122,28,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,114,48,0,0,0,114,51,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,52,0, + 0,0,159,0,0,0,115,4,0,0,0,18,1,255,128,122, + 25,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,41,8,114,9,0, + 0,0,114,8,0,0,0,114,1,0,0,0,114,10,0,0, + 0,114,34,0,0,0,114,43,0,0,0,114,44,0,0,0, + 114,52,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,53,0,0,0,142,0, + 0,0,115,14,0,0,0,8,0,4,1,8,3,8,4,8, + 4,12,5,255,128,114,53,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,36,0,0,0,101,0,90,1,100,0,90,2, + 100,1,100,2,132,0,90,3,100,3,100,4,132,0,90,4, + 100,5,100,6,132,0,90,5,100,7,83,0,41,8,218,18, + 95,77,111,100,117,108,101,76,111,99,107,77,97,110,97,103, + 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, + 124,1,124,0,95,0,100,0,124,0,95,1,100,0,83,0, + 114,0,0,0,0,41,2,218,5,95,110,97,109,101,218,5, + 95,108,111,99,107,114,32,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,34,0,0,0,165,0, + 0,0,115,6,0,0,0,6,1,10,1,255,128,122,27,95, + 77,111,100,117,108,101,76,111,99,107,77,97,110,97,103,101, + 114,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, + 0,0,0,115,26,0,0,0,116,0,124,0,106,1,131,1, + 124,0,95,2,124,0,106,2,160,3,161,0,1,0,100,0, + 83,0,114,0,0,0,0,41,4,218,16,95,103,101,116,95, + 109,111,100,117,108,101,95,108,111,99,107,114,55,0,0,0, + 114,56,0,0,0,114,43,0,0,0,114,51,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,9, + 95,95,101,110,116,101,114,95,95,169,0,0,0,115,6,0, + 0,0,12,1,14,1,255,128,122,28,95,77,111,100,117,108, + 101,76,111,99,107,77,97,110,97,103,101,114,46,95,95,101, + 110,116,101,114,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,2,0,0,0,79,0,0,0,115, + 14,0,0,0,124,0,106,0,160,1,161,0,1,0,100,0, + 83,0,114,0,0,0,0,41,2,114,56,0,0,0,114,44, + 0,0,0,41,3,114,33,0,0,0,218,4,97,114,103,115, + 90,6,107,119,97,114,103,115,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,8,95,95,101,120,105,116,95, + 95,173,0,0,0,115,4,0,0,0,14,1,255,128,122,27, + 95,77,111,100,117,108,101,76,111,99,107,77,97,110,97,103, + 101,114,46,95,95,101,120,105,116,95,95,78,41,6,114,9, + 0,0,0,114,8,0,0,0,114,1,0,0,0,114,34,0, + 0,0,114,58,0,0,0,114,60,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 114,54,0,0,0,163,0,0,0,115,10,0,0,0,8,0, + 8,2,8,4,12,4,255,128,114,54,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0, + 0,0,67,0,0,0,115,132,0,0,0,116,0,160,1,161, + 0,1,0,122,110,122,14,116,2,124,0,25,0,131,0,125, + 1,87,0,110,18,4,0,116,3,121,130,1,0,1,0,1, + 0,100,1,125,1,89,0,124,1,100,1,117,0,114,106,116, + 4,100,1,117,0,114,70,116,5,124,0,131,1,125,1,110, + 8,116,6,124,0,131,1,125,1,124,0,102,1,100,2,100, + 3,132,1,125,2,116,7,160,8,124,1,124,2,161,2,116, + 2,124,0,60,0,87,0,116,0,160,9,161,0,1,0,124, + 1,83,0,116,0,160,9,161,0,1,0,119,0,119,0,41, 4,122,139,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, @@ -358,186 +358,186 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 95,119,101,97,107,114,101,102,114,65,0,0,0,114,64,0, 0,0,41,3,114,20,0,0,0,114,27,0,0,0,114,66, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,57,0,0,0,179,0,0,0,115,34,0,0,0, - 8,6,2,1,2,1,14,1,12,1,10,1,8,2,8,1, + 0,0,114,57,0,0,0,179,0,0,0,115,36,0,0,0, + 8,6,2,1,2,1,14,1,12,1,6,1,8,2,8,1, 10,1,8,2,12,2,16,11,2,128,8,2,4,2,10,254, - 255,128,114,57,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,8,0,0,0,67,0,0,0, - 115,54,0,0,0,116,0,124,0,131,1,125,1,122,12,124, - 1,160,1,161,0,1,0,87,0,110,20,4,0,116,2,121, - 40,1,0,1,0,1,0,89,0,100,1,83,0,119,0,124, - 1,160,3,161,0,1,0,100,1,83,0,41,2,122,189,65, - 99,113,117,105,114,101,115,32,116,104,101,110,32,114,101,108, - 101,97,115,101,115,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,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,32,32,32,32,78,41,4,114, - 57,0,0,0,114,43,0,0,0,114,22,0,0,0,114,44, - 0,0,0,41,2,114,20,0,0,0,114,27,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,19, - 95,108,111,99,107,95,117,110,108,111,99,107,95,109,111,100, - 117,108,101,216,0,0,0,115,14,0,0,0,8,6,2,1, - 12,1,12,1,8,3,12,2,255,128,114,69,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 4,0,0,0,79,0,0,0,115,14,0,0,0,124,0,124, - 1,105,0,124,2,164,1,142,1,83,0,41,2,97,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, - 78,114,5,0,0,0,41,3,218,1,102,114,59,0,0,0, - 90,4,107,119,100,115,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,25,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, - 233,0,0,0,115,4,0,0,0,14,8,255,128,114,71,0, - 0,0,114,42,0,0,0,41,1,218,9,118,101,114,98,111, - 115,105,116,121,99,1,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,4,0,0,0,71,0,0,0,115,58,0, - 0,0,116,0,106,1,106,2,124,1,107,5,114,54,124,0, - 160,3,100,1,161,1,115,30,100,2,124,0,23,0,125,0, - 116,4,124,0,106,5,124,2,142,0,116,0,106,6,100,3, - 141,2,1,0,100,4,83,0,100,4,83,0,41,5,122,61, - 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,41,2,250, - 1,35,122,7,105,109,112,111,114,116,32,122,2,35,32,41, - 1,90,4,102,105,108,101,78,41,7,114,18,0,0,0,218, - 5,102,108,97,103,115,218,7,118,101,114,98,111,115,101,218, - 10,115,116,97,114,116,115,119,105,116,104,218,5,112,114,105, - 110,116,114,49,0,0,0,218,6,115,116,100,101,114,114,41, - 3,218,7,109,101,115,115,97,103,101,114,72,0,0,0,114, - 59,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, - 115,115,97,103,101,244,0,0,0,115,12,0,0,0,12,2, - 10,1,8,1,24,1,4,253,255,128,114,80,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,3,0,0,0,115,26,0,0,0,135,0,102, - 1,100,1,100,2,132,8,125,1,116,0,124,1,136,0,131, - 2,1,0,124,1,83,0,41,4,122,49,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,0,0,0,0,2,0,0,0,4,0,0, - 0,19,0,0,0,115,38,0,0,0,124,1,116,0,106,1, - 118,1,114,28,116,2,100,1,160,3,124,1,161,1,124,1, - 100,2,141,2,130,1,136,0,124,0,124,1,131,2,83,0, - 41,3,78,250,29,123,33,114,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,114,19,0,0,0,41,4,114,18,0,0,0,218,20, - 98,117,105,108,116,105,110,95,109,111,100,117,108,101,95,110, - 97,109,101,115,218,11,73,109,112,111,114,116,69,114,114,111, - 114,114,49,0,0,0,169,2,114,33,0,0,0,218,8,102, - 117,108,108,110,97,109,101,169,1,218,3,102,120,110,114,5, - 0,0,0,114,6,0,0,0,218,25,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,254,0,0,0,115,12,0,0,0,10,1,10,1, - 2,1,6,255,10,2,255,128,122,52,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,78,169, - 1,114,17,0,0,0,41,2,114,87,0,0,0,114,88,0, - 0,0,114,5,0,0,0,114,86,0,0,0,114,6,0,0, - 0,218,17,95,114,101,113,117,105,114,101,115,95,98,117,105, - 108,116,105,110,252,0,0,0,115,8,0,0,0,12,2,10, - 5,4,1,255,128,114,90,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,3, - 0,0,0,115,26,0,0,0,135,0,102,1,100,1,100,2, - 132,8,125,1,116,0,124,1,136,0,131,2,1,0,124,1, - 83,0,41,4,122,47,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,0,0, - 0,0,2,0,0,0,4,0,0,0,19,0,0,0,115,38, - 0,0,0,116,0,160,1,124,1,161,1,115,28,116,2,100, - 1,160,3,124,1,161,1,124,1,100,2,141,2,130,1,136, - 0,124,0,124,1,131,2,83,0,169,3,78,122,27,123,33, - 114,125,32,105,115,32,110,111,116,32,97,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,114,19,0,0,0,41,4, - 114,61,0,0,0,218,9,105,115,95,102,114,111,122,101,110, - 114,83,0,0,0,114,49,0,0,0,114,84,0,0,0,114, - 86,0,0,0,114,5,0,0,0,114,6,0,0,0,218,24, - 95,114,101,113,117,105,114,101,115,95,102,114,111,122,101,110, - 95,119,114,97,112,112,101,114,9,1,0,0,115,12,0,0, - 0,10,1,10,1,2,1,6,255,10,2,255,128,122,50,95, - 114,101,113,117,105,114,101,115,95,102,114,111,122,101,110,46, + 2,234,255,128,114,57,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,8,0,0,0,67,0, + 0,0,115,54,0,0,0,116,0,124,0,131,1,125,1,122, + 12,124,1,160,1,161,0,1,0,87,0,110,18,4,0,116, + 2,121,52,1,0,1,0,1,0,89,0,100,1,83,0,124, + 1,160,3,161,0,1,0,100,1,83,0,119,0,41,2,122, + 189,65,99,113,117,105,114,101,115,32,116,104,101,110,32,114, + 101,108,101,97,115,101,115,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,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,32,32,32,32,78,41, + 4,114,57,0,0,0,114,43,0,0,0,114,22,0,0,0, + 114,44,0,0,0,41,2,114,20,0,0,0,114,27,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,19,95,108,111,99,107,95,117,110,108,111,99,107,95,109, + 111,100,117,108,101,216,0,0,0,115,16,0,0,0,8,6, + 2,1,12,1,12,1,6,3,12,2,2,251,255,128,114,69, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,4,0,0,0,79,0,0,0,115,14,0,0, + 0,124,0,124,1,105,0,124,2,164,1,142,1,83,0,41, + 2,97,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,78,114,5,0,0,0,41,3,218,1,102,114, + 59,0,0,0,90,4,107,119,100,115,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,25,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,233,0,0,0,115,4,0,0,0,14,8,255, + 128,114,71,0,0,0,114,42,0,0,0,41,1,218,9,118, + 101,114,98,111,115,105,116,121,99,1,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,4,0,0,0,71,0,0, + 0,115,58,0,0,0,116,0,106,1,106,2,124,1,107,5, + 114,54,124,0,160,3,100,1,161,1,115,30,100,2,124,0, + 23,0,125,0,116,4,124,0,106,5,124,2,142,0,116,0, + 106,6,100,3,141,2,1,0,100,4,83,0,100,4,83,0, + 41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111,114,116,32,122, + 2,35,32,41,1,90,4,102,105,108,101,78,41,7,114,18, + 0,0,0,218,5,102,108,97,103,115,218,7,118,101,114,98, + 111,115,101,218,10,115,116,97,114,116,115,119,105,116,104,218, + 5,112,114,105,110,116,114,49,0,0,0,218,6,115,116,100, + 101,114,114,41,3,218,7,109,101,115,115,97,103,101,114,72, + 0,0,0,114,59,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,16,95,118,101,114,98,111,115, + 101,95,109,101,115,115,97,103,101,244,0,0,0,115,12,0, + 0,0,12,2,10,1,8,1,24,1,4,253,255,128,114,80, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,3,0,0,0,115,26,0,0, + 0,135,0,102,1,100,1,100,2,132,8,125,1,116,0,124, + 1,136,0,131,2,1,0,124,1,83,0,41,4,122,49,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,0,0,0,0,2,0,0, + 0,4,0,0,0,19,0,0,0,115,38,0,0,0,124,1, + 116,0,106,1,118,1,114,28,116,2,100,1,160,3,124,1, + 161,1,124,1,100,2,141,2,130,1,136,0,124,0,124,1, + 131,2,83,0,41,3,78,250,29,123,33,114,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,114,19,0,0,0,41,4,114,18,0, + 0,0,218,20,98,117,105,108,116,105,110,95,109,111,100,117, + 108,101,95,110,97,109,101,115,218,11,73,109,112,111,114,116, + 69,114,114,111,114,114,49,0,0,0,169,2,114,33,0,0, + 0,218,8,102,117,108,108,110,97,109,101,169,1,218,3,102, + 120,110,114,5,0,0,0,114,6,0,0,0,218,25,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,254,0,0,0,115,12,0,0,0, + 10,1,10,1,2,1,6,255,10,2,255,128,122,52,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,102,114,111,122,101,110,95,119,114,97,112,112,101, - 114,78,114,89,0,0,0,41,2,114,87,0,0,0,114,93, - 0,0,0,114,5,0,0,0,114,86,0,0,0,114,6,0, - 0,0,218,16,95,114,101,113,117,105,114,101,115,95,102,114, - 111,122,101,110,7,1,0,0,115,8,0,0,0,12,2,10, - 5,4,1,255,128,114,94,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,67, - 0,0,0,115,74,0,0,0,100,1,125,2,116,0,160,1, - 124,2,116,2,161,2,1,0,116,3,124,1,124,0,131,2, - 125,3,124,1,116,4,106,5,118,0,114,66,116,4,106,5, - 124,1,25,0,125,4,116,6,124,3,124,4,131,2,1,0, - 116,4,106,5,124,1,25,0,83,0,116,7,124,3,131,1, - 83,0,41,3,122,128,76,111,97,100,32,116,104,101,32,115, - 112,101,99,105,102,105,101,100,32,109,111,100,117,108,101,32, - 105,110,116,111,32,115,121,115,46,109,111,100,117,108,101,115, - 32,97,110,100,32,114,101,116,117,114,110,32,105,116,46,10, - 10,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, - 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, - 32,85,115,101,32,108,111,97,100,101,114,46,101,120,101,99, - 95,109,111,100,117,108,101,32,105,110,115,116,101,97,100,46, - 10,10,32,32,32,32,122,103,116,104,101,32,108,111,97,100, - 95,109,111,100,117,108,101,40,41,32,109,101,116,104,111,100, - 32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97, - 110,100,32,115,108,97,116,101,100,32,102,111,114,32,114,101, - 109,111,118,97,108,32,105,110,32,80,121,116,104,111,110,32, - 51,46,49,50,59,32,117,115,101,32,101,120,101,99,95,109, - 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,78, - 41,8,218,9,95,119,97,114,110,105,110,103,115,218,4,119, - 97,114,110,218,18,68,101,112,114,101,99,97,116,105,111,110, - 87,97,114,110,105,110,103,218,16,115,112,101,99,95,102,114, - 111,109,95,108,111,97,100,101,114,114,18,0,0,0,218,7, - 109,111,100,117,108,101,115,218,5,95,101,120,101,99,218,5, - 95,108,111,97,100,41,5,114,33,0,0,0,114,85,0,0, - 0,218,3,109,115,103,218,4,115,112,101,99,218,6,109,111, - 100,117,108,101,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,17,95,108,111,97,100,95,109,111,100,117,108, - 101,95,115,104,105,109,19,1,0,0,115,18,0,0,0,4, - 6,12,2,10,1,10,1,10,1,10,1,10,1,8,2,255, - 128,114,105,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,5,0,0,0,8,0,0,0,67,0,0,0,115, - 210,0,0,0,116,0,124,0,100,1,100,0,131,3,125,1, - 116,1,124,1,100,2,131,2,114,54,122,12,124,1,160,2, - 124,0,161,1,87,0,83,0,4,0,116,3,121,52,1,0, - 1,0,1,0,89,0,110,2,119,0,122,10,124,0,106,4, - 125,2,87,0,110,18,4,0,116,5,121,82,1,0,1,0, - 1,0,89,0,110,18,119,0,124,2,100,0,117,1,114,100, - 116,6,124,2,131,1,83,0,122,10,124,0,106,7,125,3, - 87,0,110,22,4,0,116,5,121,132,1,0,1,0,1,0, - 100,3,125,3,89,0,110,2,119,0,122,10,124,0,106,8, - 125,4,87,0,110,52,4,0,116,5,121,196,1,0,1,0, - 1,0,124,1,100,0,117,0,114,180,100,4,160,9,124,3, - 161,1,6,0,89,0,83,0,100,5,160,9,124,3,124,1, - 161,2,6,0,89,0,83,0,119,0,100,6,160,9,124,3, - 124,4,161,2,83,0,41,7,78,218,10,95,95,108,111,97, + 101,115,95,98,117,105,108,116,105,110,95,119,114,97,112,112, + 101,114,78,169,1,114,17,0,0,0,41,2,114,87,0,0, + 0,114,88,0,0,0,114,5,0,0,0,114,86,0,0,0, + 114,6,0,0,0,218,17,95,114,101,113,117,105,114,101,115, + 95,98,117,105,108,116,105,110,252,0,0,0,115,8,0,0, + 0,12,2,10,5,4,1,255,128,114,90,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,3,0,0,0,115,26,0,0,0,135,0,102,1, + 100,1,100,2,132,8,125,1,116,0,124,1,136,0,131,2, + 1,0,124,1,83,0,41,4,122,47,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,0,0,0,0,2,0,0,0,4,0,0,0,19,0, + 0,0,115,38,0,0,0,116,0,160,1,124,1,161,1,115, + 28,116,2,100,1,160,3,124,1,161,1,124,1,100,2,141, + 2,130,1,136,0,124,0,124,1,131,2,83,0,169,3,78, + 122,27,123,33,114,125,32,105,115,32,110,111,116,32,97,32, + 102,114,111,122,101,110,32,109,111,100,117,108,101,114,19,0, + 0,0,41,4,114,61,0,0,0,218,9,105,115,95,102,114, + 111,122,101,110,114,83,0,0,0,114,49,0,0,0,114,84, + 0,0,0,114,86,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,24,95,114,101,113,117,105,114,101,115,95,102,114, + 111,122,101,110,95,119,114,97,112,112,101,114,9,1,0,0, + 115,12,0,0,0,10,1,10,1,2,1,6,255,10,2,255, + 128,122,50,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,78,114,89,0,0,0,41,2,114,87,0, + 0,0,114,93,0,0,0,114,5,0,0,0,114,86,0,0, + 0,114,6,0,0,0,218,16,95,114,101,113,117,105,114,101, + 115,95,102,114,111,122,101,110,7,1,0,0,115,8,0,0, + 0,12,2,10,5,4,1,255,128,114,94,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4, + 0,0,0,67,0,0,0,115,74,0,0,0,100,1,125,2, + 116,0,160,1,124,2,116,2,161,2,1,0,116,3,124,1, + 124,0,131,2,125,3,124,1,116,4,106,5,118,0,114,66, + 116,4,106,5,124,1,25,0,125,4,116,6,124,3,124,4, + 131,2,1,0,116,4,106,5,124,1,25,0,83,0,116,7, + 124,3,131,1,83,0,41,3,122,128,76,111,97,100,32,116, + 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, + 117,108,101,32,105,110,116,111,32,115,121,115,46,109,111,100, + 117,108,101,115,32,97,110,100,32,114,101,116,117,114,110,32, + 105,116,46,10,10,32,32,32,32,84,104,105,115,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,32,32,85,115,101,32,108,111,97,100,101,114,46, + 101,120,101,99,95,109,111,100,117,108,101,32,105,110,115,116, + 101,97,100,46,10,10,32,32,32,32,122,103,116,104,101,32, + 108,111,97,100,95,109,111,100,117,108,101,40,41,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,32,97,110,100,32,115,108,97,116,101,100,32,102,111, + 114,32,114,101,109,111,118,97,108,32,105,110,32,80,121,116, + 104,111,110,32,51,46,49,50,59,32,117,115,101,32,101,120, + 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, + 101,97,100,78,41,8,218,9,95,119,97,114,110,105,110,103, + 115,218,4,119,97,114,110,218,18,68,101,112,114,101,99,97, + 116,105,111,110,87,97,114,110,105,110,103,218,16,115,112,101, + 99,95,102,114,111,109,95,108,111,97,100,101,114,114,18,0, + 0,0,218,7,109,111,100,117,108,101,115,218,5,95,101,120, + 101,99,218,5,95,108,111,97,100,41,5,114,33,0,0,0, + 114,85,0,0,0,218,3,109,115,103,218,4,115,112,101,99, + 218,6,109,111,100,117,108,101,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,17,95,108,111,97,100,95,109, + 111,100,117,108,101,95,115,104,105,109,19,1,0,0,115,18, + 0,0,0,4,6,12,2,10,1,10,1,10,1,10,1,10, + 1,8,2,255,128,114,105,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,8,0,0,0,67, + 0,0,0,115,206,0,0,0,116,0,124,0,100,1,100,0, + 131,3,125,1,116,1,124,1,100,2,131,2,114,50,122,12, + 124,1,160,2,124,0,161,1,87,0,83,0,4,0,116,3, + 121,204,1,0,1,0,1,0,89,0,122,10,124,0,106,4, + 125,2,87,0,110,16,4,0,116,5,121,202,1,0,1,0, + 1,0,89,0,110,16,124,2,100,0,117,1,114,94,116,6, + 124,2,131,1,83,0,122,10,124,0,106,7,125,3,87,0, + 110,18,4,0,116,5,121,200,1,0,1,0,1,0,100,3, + 125,3,89,0,122,10,124,0,106,8,125,4,87,0,110,50, + 4,0,116,5,121,198,1,0,1,0,1,0,124,1,100,0, + 117,0,114,170,100,4,160,9,124,3,161,1,6,0,89,0, + 83,0,100,5,160,9,124,3,124,1,161,2,6,0,89,0, + 83,0,100,6,160,9,124,3,124,4,161,2,83,0,119,0, + 119,0,119,0,119,0,41,7,78,218,10,95,95,108,111,97, 100,101,114,95,95,218,11,109,111,100,117,108,101,95,114,101, 112,114,250,1,63,250,13,60,109,111,100,117,108,101,32,123, 33,114,125,62,250,20,60,109,111,100,117,108,101,32,123,33, @@ -552,279 +552,280 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,218,6,108,111,97,100,101,114,114,103,0,0,0,114,20, 0,0,0,218,8,102,105,108,101,110,97,109,101,114,5,0, 0,0,114,5,0,0,0,114,6,0,0,0,218,12,95,109, - 111,100,117,108,101,95,114,101,112,114,38,1,0,0,115,48, - 0,0,0,12,2,10,1,2,4,12,1,12,1,6,1,2, - 1,10,1,12,1,6,1,8,2,8,1,2,4,10,1,12, - 1,10,1,2,1,10,1,12,1,8,1,14,1,18,2,12, - 2,255,128,114,118,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, - 0,115,114,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,2,100,2,100,3,156,3,100,4,100,5, - 132,2,90,4,100,6,100,7,132,0,90,5,100,8,100,9, - 132,0,90,6,101,7,100,10,100,11,132,0,131,1,90,8, - 101,8,106,9,100,12,100,11,132,0,131,1,90,8,101,7, - 100,13,100,14,132,0,131,1,90,10,101,7,100,15,100,16, - 132,0,131,1,90,11,101,11,106,9,100,17,100,16,132,0, - 131,1,90,11,100,2,83,0,41,18,218,10,77,111,100,117, - 108,101,83,112,101,99,97,208,5,0,0,84,104,101,32,115, - 112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114, - 32,97,32,109,111,100,117,108,101,44,32,117,115,101,100,32, - 102,111,114,32,108,111,97,100,105,110,103,46,10,10,32,32, - 32,32,65,32,109,111,100,117,108,101,39,115,32,115,112,101, - 99,32,105,115,32,116,104,101,32,115,111,117,114,99,101,32, - 102,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32, - 97,98,111,117,116,32,116,104,101,32,109,111,100,117,108,101, - 46,32,32,70,111,114,10,32,32,32,32,100,97,116,97,32, - 97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32, - 116,104,101,32,109,111,100,117,108,101,44,32,105,110,99,108, - 117,100,105,110,103,32,115,111,117,114,99,101,44,32,117,115, - 101,32,116,104,101,32,115,112,101,99,39,115,10,32,32,32, - 32,108,111,97,100,101,114,46,10,10,32,32,32,32,96,110, - 97,109,101,96,32,105,115,32,116,104,101,32,97,98,115,111, - 108,117,116,101,32,110,97,109,101,32,111,102,32,116,104,101, - 32,109,111,100,117,108,101,46,32,32,96,108,111,97,100,101, - 114,96,32,105,115,32,116,104,101,32,108,111,97,100,101,114, - 10,32,32,32,32,116,111,32,117,115,101,32,119,104,101,110, - 32,108,111,97,100,105,110,103,32,116,104,101,32,109,111,100, - 117,108,101,46,32,32,96,112,97,114,101,110,116,96,32,105, - 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, - 101,10,32,32,32,32,112,97,99,107,97,103,101,32,116,104, - 101,32,109,111,100,117,108,101,32,105,115,32,105,110,46,32, - 32,84,104,101,32,112,97,114,101,110,116,32,105,115,32,100, - 101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32, - 110,97,109,101,46,10,10,32,32,32,32,96,105,115,95,112, - 97,99,107,97,103,101,96,32,100,101,116,101,114,109,105,110, - 101,115,32,105,102,32,116,104,101,32,109,111,100,117,108,101, - 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, - 32,112,97,99,107,97,103,101,32,111,114,10,32,32,32,32, - 110,111,116,46,32,32,79,110,32,109,111,100,117,108,101,115, - 32,116,104,105,115,32,105,115,32,114,101,102,108,101,99,116, - 101,100,32,98,121,32,116,104,101,32,96,95,95,112,97,116, - 104,95,95,96,32,97,116,116,114,105,98,117,116,101,46,10, - 10,32,32,32,32,96,111,114,105,103,105,110,96,32,105,115, - 32,116,104,101,32,115,112,101,99,105,102,105,99,32,108,111, - 99,97,116,105,111,110,32,117,115,101,100,32,98,121,32,116, - 104,101,32,108,111,97,100,101,114,32,102,114,111,109,32,119, - 104,105,99,104,32,116,111,10,32,32,32,32,108,111,97,100, - 32,116,104,101,32,109,111,100,117,108,101,44,32,105,102,32, - 116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110, - 32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,32, - 87,104,101,110,32,102,105,108,101,110,97,109,101,32,105,115, - 10,32,32,32,32,115,101,116,44,32,111,114,105,103,105,110, - 32,119,105,108,108,32,109,97,116,99,104,46,10,10,32,32, - 32,32,96,104,97,115,95,108,111,99,97,116,105,111,110,96, - 32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32, - 97,32,115,112,101,99,39,115,32,34,111,114,105,103,105,110, - 34,32,114,101,102,108,101,99,116,115,32,97,32,108,111,99, - 97,116,105,111,110,46,10,32,32,32,32,87,104,101,110,32, - 116,104,105,115,32,105,115,32,84,114,117,101,44,32,96,95, - 95,102,105,108,101,95,95,96,32,97,116,116,114,105,98,117, - 116,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, - 32,105,115,32,115,101,116,46,10,10,32,32,32,32,96,99, - 97,99,104,101,100,96,32,105,115,32,116,104,101,32,108,111, - 99,97,116,105,111,110,32,111,102,32,116,104,101,32,99,97, - 99,104,101,100,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,44,32,105,102,32,97,110,121,46,32,32,73,116,10, - 32,32,32,32,99,111,114,114,101,115,112,111,110,100,115,32, - 116,111,32,116,104,101,32,96,95,95,99,97,99,104,101,100, - 95,95,96,32,97,116,116,114,105,98,117,116,101,46,10,10, - 32,32,32,32,96,115,117,98,109,111,100,117,108,101,95,115, - 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,96, - 32,105,115,32,116,104,101,32,115,101,113,117,101,110,99,101, - 32,111,102,32,112,97,116,104,32,101,110,116,114,105,101,115, - 32,116,111,10,32,32,32,32,115,101,97,114,99,104,32,119, - 104,101,110,32,105,109,112,111,114,116,105,110,103,32,115,117, - 98,109,111,100,117,108,101,115,46,32,32,73,102,32,115,101, - 116,44,32,105,115,95,112,97,99,107,97,103,101,32,115,104, - 111,117,108,100,32,98,101,10,32,32,32,32,84,114,117,101, - 45,45,97,110,100,32,70,97,108,115,101,32,111,116,104,101, - 114,119,105,115,101,46,10,10,32,32,32,32,80,97,99,107, - 97,103,101,115,32,97,114,101,32,115,105,109,112,108,121,32, - 109,111,100,117,108,101,115,32,116,104,97,116,32,40,109,97, - 121,41,32,104,97,118,101,32,115,117,98,109,111,100,117,108, - 101,115,46,32,32,73,102,32,97,32,115,112,101,99,10,32, - 32,32,32,104,97,115,32,97,32,110,111,110,45,78,111,110, - 101,32,118,97,108,117,101,32,105,110,32,96,115,117,98,109, - 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,96,44,32,116,104,101,32,105,109,112, - 111,114,116,10,32,32,32,32,115,121,115,116,101,109,32,119, - 105,108,108,32,99,111,110,115,105,100,101,114,32,109,111,100, - 117,108,101,115,32,108,111,97,100,101,100,32,102,114,111,109, - 32,116,104,101,32,115,112,101,99,32,97,115,32,112,97,99, - 107,97,103,101,115,46,10,10,32,32,32,32,79,110,108,121, - 32,102,105,110,100,101,114,115,32,40,115,101,101,32,105,109, - 112,111,114,116,108,105,98,46,97,98,99,46,77,101,116,97, - 80,97,116,104,70,105,110,100,101,114,32,97,110,100,10,32, - 32,32,32,105,109,112,111,114,116,108,105,98,46,97,98,99, - 46,80,97,116,104,69,110,116,114,121,70,105,110,100,101,114, - 41,32,115,104,111,117,108,100,32,109,111,100,105,102,121,32, - 77,111,100,117,108,101,83,112,101,99,32,105,110,115,116,97, - 110,99,101,115,46,10,10,32,32,32,32,78,41,3,218,6, - 111,114,105,103,105,110,218,12,108,111,97,100,101,114,95,115, - 116,97,116,101,218,10,105,115,95,112,97,99,107,97,103,101, - 99,3,0,0,0,0,0,0,0,3,0,0,0,6,0,0, - 0,2,0,0,0,67,0,0,0,115,54,0,0,0,124,1, - 124,0,95,0,124,2,124,0,95,1,124,3,124,0,95,2, - 124,4,124,0,95,3,124,5,114,32,103,0,110,2,100,0, - 124,0,95,4,100,1,124,0,95,5,100,0,124,0,95,6, - 100,0,83,0,41,2,78,70,41,7,114,20,0,0,0,114, - 116,0,0,0,114,120,0,0,0,114,121,0,0,0,218,26, - 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, - 95,108,111,99,97,116,105,111,110,115,218,13,95,115,101,116, - 95,102,105,108,101,97,116,116,114,218,7,95,99,97,99,104, - 101,100,41,6,114,33,0,0,0,114,20,0,0,0,114,116, - 0,0,0,114,120,0,0,0,114,121,0,0,0,114,122,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,34,0,0,0,111,1,0,0,115,16,0,0,0,6, - 2,6,1,6,1,6,1,14,1,6,3,10,1,255,128,122, - 19,77,111,100,117,108,101,83,112,101,99,46,95,95,105,110, - 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,6,0,0,0,67,0,0,0,115,102,0, - 0,0,100,1,160,0,124,0,106,1,161,1,100,2,160,0, - 124,0,106,2,161,1,103,2,125,1,124,0,106,3,100,0, - 117,1,114,52,124,1,160,4,100,3,160,0,124,0,106,3, - 161,1,161,1,1,0,124,0,106,5,100,0,117,1,114,80, - 124,1,160,4,100,4,160,0,124,0,106,5,161,1,161,1, - 1,0,100,5,160,0,124,0,106,6,106,7,100,6,160,8, - 124,1,161,1,161,2,83,0,41,7,78,122,9,110,97,109, - 101,61,123,33,114,125,122,11,108,111,97,100,101,114,61,123, - 33,114,125,122,11,111,114,105,103,105,110,61,123,33,114,125, - 122,29,115,117,98,109,111,100,117,108,101,95,115,101,97,114, - 99,104,95,108,111,99,97,116,105,111,110,115,61,123,125,122, - 6,123,125,40,123,125,41,122,2,44,32,41,9,114,49,0, - 0,0,114,20,0,0,0,114,116,0,0,0,114,120,0,0, - 0,218,6,97,112,112,101,110,100,114,123,0,0,0,218,9, - 95,95,99,108,97,115,115,95,95,114,9,0,0,0,218,4, - 106,111,105,110,41,2,114,33,0,0,0,114,59,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 52,0,0,0,123,1,0,0,115,22,0,0,0,10,1,10, - 1,4,255,10,2,18,1,10,1,8,1,4,1,6,255,22, - 2,255,128,122,19,77,111,100,117,108,101,83,112,101,99,46, - 95,95,114,101,112,114,95,95,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, - 0,115,102,0,0,0,124,0,106,0,125,2,122,72,124,0, - 106,1,124,1,106,1,107,2,111,76,124,0,106,2,124,1, - 106,2,107,2,111,76,124,0,106,3,124,1,106,3,107,2, - 111,76,124,2,124,1,106,0,107,2,111,76,124,0,106,4, - 124,1,106,4,107,2,111,76,124,0,106,5,124,1,106,5, - 107,2,87,0,83,0,4,0,116,6,121,100,1,0,1,0, - 1,0,116,7,6,0,89,0,83,0,119,0,114,0,0,0, - 0,41,8,114,123,0,0,0,114,20,0,0,0,114,116,0, - 0,0,114,120,0,0,0,218,6,99,97,99,104,101,100,218, - 12,104,97,115,95,108,111,99,97,116,105,111,110,114,2,0, - 0,0,218,14,78,111,116,73,109,112,108,101,109,101,110,116, - 101,100,41,3,114,33,0,0,0,90,5,111,116,104,101,114, - 90,4,115,109,115,108,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,6,95,95,101,113,95,95,133,1,0, - 0,115,32,0,0,0,6,1,2,1,12,1,10,1,2,255, - 10,2,2,254,8,3,2,253,10,4,2,252,10,5,4,251, - 12,6,10,1,255,128,122,17,77,111,100,117,108,101,83,112, - 101,99,46,95,95,101,113,95,95,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,58,0,0,0,124,0,106,0,100,0,117,0,114, - 52,124,0,106,1,100,0,117,1,114,52,124,0,106,2,114, - 52,116,3,100,0,117,0,114,38,116,4,130,1,116,3,160, - 5,124,0,106,1,161,1,124,0,95,0,124,0,106,0,83, - 0,114,0,0,0,0,41,6,114,125,0,0,0,114,120,0, - 0,0,114,124,0,0,0,218,19,95,98,111,111,116,115,116, - 114,97,112,95,101,120,116,101,114,110,97,108,218,19,78,111, - 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, - 114,90,11,95,103,101,116,95,99,97,99,104,101,100,114,51, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,129,0,0,0,145,1,0,0,115,14,0,0,0, - 10,2,16,1,8,1,4,1,14,1,6,1,255,128,122,17, - 77,111,100,117,108,101,83,112,101,99,46,99,97,99,104,101, - 100,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,2,0,0,0,67,0,0,0,115,10,0,0,0,124, - 1,124,0,95,0,100,0,83,0,114,0,0,0,0,41,1, - 114,125,0,0,0,41,2,114,33,0,0,0,114,129,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,129,0,0,0,154,1,0,0,115,4,0,0,0,10,2, - 255,128,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,32,0,0,0, - 124,0,106,0,100,1,117,0,114,26,124,0,106,1,160,2, - 100,2,161,1,100,3,25,0,83,0,124,0,106,1,83,0, - 41,4,122,32,84,104,101,32,110,97,109,101,32,111,102,32, - 116,104,101,32,109,111,100,117,108,101,39,115,32,112,97,114, - 101,110,116,46,78,218,1,46,114,25,0,0,0,41,3,114, - 123,0,0,0,114,20,0,0,0,218,10,114,112,97,114,116, - 105,116,105,111,110,114,51,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,6,112,97,114,101,110, - 116,158,1,0,0,115,8,0,0,0,10,3,16,1,6,2, - 255,128,122,17,77,111,100,117,108,101,83,112,101,99,46,112, - 97,114,101,110,116,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,6, - 0,0,0,124,0,106,0,83,0,114,0,0,0,0,41,1, - 114,124,0,0,0,114,51,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,130,0,0,0,166,1, - 0,0,115,4,0,0,0,6,2,255,128,122,23,77,111,100, - 117,108,101,83,112,101,99,46,104,97,115,95,108,111,99,97, - 116,105,111,110,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,2,0,0,0,67,0,0,0,115,14,0, - 0,0,116,0,124,1,131,1,124,0,95,1,100,0,83,0, - 114,0,0,0,0,41,2,218,4,98,111,111,108,114,124,0, - 0,0,41,2,114,33,0,0,0,218,5,118,97,108,117,101, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 130,0,0,0,170,1,0,0,115,4,0,0,0,14,2,255, - 128,41,12,114,9,0,0,0,114,8,0,0,0,114,1,0, - 0,0,114,10,0,0,0,114,34,0,0,0,114,52,0,0, - 0,114,132,0,0,0,218,8,112,114,111,112,101,114,116,121, - 114,129,0,0,0,218,6,115,101,116,116,101,114,114,137,0, - 0,0,114,130,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,119,0,0,0, - 74,1,0,0,115,36,0,0,0,8,0,4,1,4,36,2, - 1,12,255,8,12,8,10,2,12,10,1,4,8,10,1,2, - 3,10,1,2,7,10,1,4,3,14,1,255,128,114,119,0, - 0,0,169,2,114,120,0,0,0,114,122,0,0,0,99,2, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,150,0,0,0,116,0,124,1, - 100,1,131,2,114,74,116,1,100,2,117,0,114,22,116,2, - 130,1,116,1,106,3,125,4,124,3,100,2,117,0,114,48, - 124,4,124,0,124,1,100,3,141,2,83,0,124,3,114,56, - 103,0,110,2,100,2,125,5,124,4,124,0,124,1,124,5, - 100,4,141,3,83,0,124,3,100,2,117,0,114,134,116,0, - 124,1,100,5,131,2,114,130,122,14,124,1,160,4,124,0, - 161,1,125,3,87,0,110,26,4,0,116,5,121,128,1,0, - 1,0,1,0,100,2,125,3,89,0,110,6,119,0,100,6, - 125,3,116,6,124,0,124,1,124,2,124,3,100,7,141,4, - 83,0,41,8,122,53,82,101,116,117,114,110,32,97,32,109, - 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, - 32,111,110,32,118,97,114,105,111,117,115,32,108,111,97,100, - 101,114,32,109,101,116,104,111,100,115,46,90,12,103,101,116, - 95,102,105,108,101,110,97,109,101,78,41,1,114,116,0,0, - 0,41,2,114,116,0,0,0,114,123,0,0,0,114,122,0, - 0,0,70,114,142,0,0,0,41,7,114,11,0,0,0,114, - 133,0,0,0,114,134,0,0,0,218,23,115,112,101,99,95, - 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, - 111,110,114,122,0,0,0,114,83,0,0,0,114,119,0,0, - 0,41,6,114,20,0,0,0,114,116,0,0,0,114,120,0, - 0,0,114,122,0,0,0,114,143,0,0,0,90,6,115,101, - 97,114,99,104,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,98,0,0,0,175,1,0,0,115,38,0,0, - 0,10,2,8,1,4,1,6,1,8,2,12,1,12,1,6, - 1,2,1,6,255,8,3,10,1,2,1,14,1,12,1,10, - 1,4,3,16,2,255,128,114,98,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0, - 0,67,0,0,0,115,40,1,0,0,122,10,124,0,106,0, - 125,3,87,0,110,18,4,0,116,1,121,28,1,0,1,0, - 1,0,89,0,110,14,119,0,124,3,100,0,117,1,114,42, - 124,3,83,0,124,0,106,2,125,4,124,1,100,0,117,0, - 114,86,122,10,124,0,106,3,125,1,87,0,110,18,4,0, - 116,1,121,84,1,0,1,0,1,0,89,0,110,2,119,0, - 122,10,124,0,106,4,125,5,87,0,110,22,4,0,116,1, - 121,118,1,0,1,0,1,0,100,0,125,5,89,0,110,2, - 119,0,124,2,100,0,117,0,114,174,124,5,100,0,117,0, - 114,170,122,10,124,1,106,5,125,2,87,0,110,26,4,0, - 116,1,121,168,1,0,1,0,1,0,100,0,125,2,89,0, - 110,6,119,0,124,5,125,2,122,10,124,0,106,6,125,6, - 87,0,110,22,4,0,116,1,121,206,1,0,1,0,1,0, - 100,0,125,6,89,0,110,2,119,0,122,14,116,7,124,0, - 106,8,131,1,125,7,87,0,110,22,4,0,116,1,121,244, - 1,0,1,0,1,0,100,0,125,7,89,0,110,2,119,0, - 116,9,124,4,124,1,124,2,100,1,141,3,125,3,124,5, - 100,0,117,0,144,1,114,18,100,2,110,2,100,3,124,3, - 95,10,124,6,124,3,95,11,124,7,124,3,95,12,124,3, - 83,0,41,4,78,169,1,114,120,0,0,0,70,84,41,13, + 111,100,117,108,101,95,114,101,112,114,38,1,0,0,115,56, + 0,0,0,12,2,10,1,2,4,12,1,12,1,2,1,2, + 1,10,1,12,1,4,1,8,2,8,1,2,4,10,1,12, + 1,6,1,2,1,10,1,12,1,8,1,14,1,16,2,12, + 2,2,250,2,252,2,246,2,252,255,128,114,118,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,64,0,0,0,115,114,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,2,100,2, + 100,3,156,3,100,4,100,5,132,2,90,4,100,6,100,7, + 132,0,90,5,100,8,100,9,132,0,90,6,101,7,100,10, + 100,11,132,0,131,1,90,8,101,8,106,9,100,12,100,11, + 132,0,131,1,90,8,101,7,100,13,100,14,132,0,131,1, + 90,10,101,7,100,15,100,16,132,0,131,1,90,11,101,11, + 106,9,100,17,100,16,132,0,131,1,90,11,100,2,83,0, + 41,18,218,10,77,111,100,117,108,101,83,112,101,99,97,208, + 5,0,0,84,104,101,32,115,112,101,99,105,102,105,99,97, + 116,105,111,110,32,102,111,114,32,97,32,109,111,100,117,108, + 101,44,32,117,115,101,100,32,102,111,114,32,108,111,97,100, + 105,110,103,46,10,10,32,32,32,32,65,32,109,111,100,117, + 108,101,39,115,32,115,112,101,99,32,105,115,32,116,104,101, + 32,115,111,117,114,99,101,32,102,111,114,32,105,110,102,111, + 114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104, + 101,32,109,111,100,117,108,101,46,32,32,70,111,114,10,32, + 32,32,32,100,97,116,97,32,97,115,115,111,99,105,97,116, + 101,100,32,119,105,116,104,32,116,104,101,32,109,111,100,117, + 108,101,44,32,105,110,99,108,117,100,105,110,103,32,115,111, + 117,114,99,101,44,32,117,115,101,32,116,104,101,32,115,112, + 101,99,39,115,10,32,32,32,32,108,111,97,100,101,114,46, + 10,10,32,32,32,32,96,110,97,109,101,96,32,105,115,32, + 116,104,101,32,97,98,115,111,108,117,116,101,32,110,97,109, + 101,32,111,102,32,116,104,101,32,109,111,100,117,108,101,46, + 32,32,96,108,111,97,100,101,114,96,32,105,115,32,116,104, + 101,32,108,111,97,100,101,114,10,32,32,32,32,116,111,32, + 117,115,101,32,119,104,101,110,32,108,111,97,100,105,110,103, + 32,116,104,101,32,109,111,100,117,108,101,46,32,32,96,112, + 97,114,101,110,116,96,32,105,115,32,116,104,101,32,110,97, + 109,101,32,111,102,32,116,104,101,10,32,32,32,32,112,97, + 99,107,97,103,101,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,105,110,46,32,32,84,104,101,32,112,97,114, + 101,110,116,32,105,115,32,100,101,114,105,118,101,100,32,102, + 114,111,109,32,116,104,101,32,110,97,109,101,46,10,10,32, + 32,32,32,96,105,115,95,112,97,99,107,97,103,101,96,32, + 100,101,116,101,114,109,105,110,101,115,32,105,102,32,116,104, + 101,32,109,111,100,117,108,101,32,105,115,32,99,111,110,115, + 105,100,101,114,101,100,32,97,32,112,97,99,107,97,103,101, + 32,111,114,10,32,32,32,32,110,111,116,46,32,32,79,110, + 32,109,111,100,117,108,101,115,32,116,104,105,115,32,105,115, + 32,114,101,102,108,101,99,116,101,100,32,98,121,32,116,104, + 101,32,96,95,95,112,97,116,104,95,95,96,32,97,116,116, + 114,105,98,117,116,101,46,10,10,32,32,32,32,96,111,114, + 105,103,105,110,96,32,105,115,32,116,104,101,32,115,112,101, + 99,105,102,105,99,32,108,111,99,97,116,105,111,110,32,117, + 115,101,100,32,98,121,32,116,104,101,32,108,111,97,100,101, + 114,32,102,114,111,109,32,119,104,105,99,104,32,116,111,10, + 32,32,32,32,108,111,97,100,32,116,104,101,32,109,111,100, + 117,108,101,44,32,105,102,32,116,104,97,116,32,105,110,102, + 111,114,109,97,116,105,111,110,32,105,115,32,97,118,97,105, + 108,97,98,108,101,46,32,32,87,104,101,110,32,102,105,108, + 101,110,97,109,101,32,105,115,10,32,32,32,32,115,101,116, + 44,32,111,114,105,103,105,110,32,119,105,108,108,32,109,97, + 116,99,104,46,10,10,32,32,32,32,96,104,97,115,95,108, + 111,99,97,116,105,111,110,96,32,105,110,100,105,99,97,116, + 101,115,32,116,104,97,116,32,97,32,115,112,101,99,39,115, + 32,34,111,114,105,103,105,110,34,32,114,101,102,108,101,99, + 116,115,32,97,32,108,111,99,97,116,105,111,110,46,10,32, + 32,32,32,87,104,101,110,32,116,104,105,115,32,105,115,32, + 84,114,117,101,44,32,96,95,95,102,105,108,101,95,95,96, + 32,97,116,116,114,105,98,117,116,101,32,111,102,32,116,104, + 101,32,109,111,100,117,108,101,32,105,115,32,115,101,116,46, + 10,10,32,32,32,32,96,99,97,99,104,101,100,96,32,105, + 115,32,116,104,101,32,108,111,99,97,116,105,111,110,32,111, + 102,32,116,104,101,32,99,97,99,104,101,100,32,98,121,116, + 101,99,111,100,101,32,102,105,108,101,44,32,105,102,32,97, + 110,121,46,32,32,73,116,10,32,32,32,32,99,111,114,114, + 101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,96, + 95,95,99,97,99,104,101,100,95,95,96,32,97,116,116,114, + 105,98,117,116,101,46,10,10,32,32,32,32,96,115,117,98, + 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, + 99,97,116,105,111,110,115,96,32,105,115,32,116,104,101,32, + 115,101,113,117,101,110,99,101,32,111,102,32,112,97,116,104, + 32,101,110,116,114,105,101,115,32,116,111,10,32,32,32,32, + 115,101,97,114,99,104,32,119,104,101,110,32,105,109,112,111, + 114,116,105,110,103,32,115,117,98,109,111,100,117,108,101,115, + 46,32,32,73,102,32,115,101,116,44,32,105,115,95,112,97, + 99,107,97,103,101,32,115,104,111,117,108,100,32,98,101,10, + 32,32,32,32,84,114,117,101,45,45,97,110,100,32,70,97, + 108,115,101,32,111,116,104,101,114,119,105,115,101,46,10,10, + 32,32,32,32,80,97,99,107,97,103,101,115,32,97,114,101, + 32,115,105,109,112,108,121,32,109,111,100,117,108,101,115,32, + 116,104,97,116,32,40,109,97,121,41,32,104,97,118,101,32, + 115,117,98,109,111,100,117,108,101,115,46,32,32,73,102,32, + 97,32,115,112,101,99,10,32,32,32,32,104,97,115,32,97, + 32,110,111,110,45,78,111,110,101,32,118,97,108,117,101,32, + 105,110,32,96,115,117,98,109,111,100,117,108,101,95,115,101, + 97,114,99,104,95,108,111,99,97,116,105,111,110,115,96,44, + 32,116,104,101,32,105,109,112,111,114,116,10,32,32,32,32, + 115,121,115,116,101,109,32,119,105,108,108,32,99,111,110,115, + 105,100,101,114,32,109,111,100,117,108,101,115,32,108,111,97, + 100,101,100,32,102,114,111,109,32,116,104,101,32,115,112,101, + 99,32,97,115,32,112,97,99,107,97,103,101,115,46,10,10, + 32,32,32,32,79,110,108,121,32,102,105,110,100,101,114,115, + 32,40,115,101,101,32,105,109,112,111,114,116,108,105,98,46, + 97,98,99,46,77,101,116,97,80,97,116,104,70,105,110,100, + 101,114,32,97,110,100,10,32,32,32,32,105,109,112,111,114, + 116,108,105,98,46,97,98,99,46,80,97,116,104,69,110,116, + 114,121,70,105,110,100,101,114,41,32,115,104,111,117,108,100, + 32,109,111,100,105,102,121,32,77,111,100,117,108,101,83,112, + 101,99,32,105,110,115,116,97,110,99,101,115,46,10,10,32, + 32,32,32,78,41,3,218,6,111,114,105,103,105,110,218,12, + 108,111,97,100,101,114,95,115,116,97,116,101,218,10,105,115, + 95,112,97,99,107,97,103,101,99,3,0,0,0,0,0,0, + 0,3,0,0,0,6,0,0,0,2,0,0,0,67,0,0, + 0,115,54,0,0,0,124,1,124,0,95,0,124,2,124,0, + 95,1,124,3,124,0,95,2,124,4,124,0,95,3,124,5, + 114,32,103,0,110,2,100,0,124,0,95,4,100,1,124,0, + 95,5,100,0,124,0,95,6,100,0,83,0,41,2,78,70, + 41,7,114,20,0,0,0,114,116,0,0,0,114,120,0,0, + 0,114,121,0,0,0,218,26,115,117,98,109,111,100,117,108, + 101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111, + 110,115,218,13,95,115,101,116,95,102,105,108,101,97,116,116, + 114,218,7,95,99,97,99,104,101,100,41,6,114,33,0,0, + 0,114,20,0,0,0,114,116,0,0,0,114,120,0,0,0, + 114,121,0,0,0,114,122,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,34,0,0,0,111,1, + 0,0,115,16,0,0,0,6,2,6,1,6,1,6,1,14, + 1,6,3,10,1,255,128,122,19,77,111,100,117,108,101,83, + 112,101,99,46,95,95,105,110,105,116,95,95,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,6,0,0, + 0,67,0,0,0,115,102,0,0,0,100,1,160,0,124,0, + 106,1,161,1,100,2,160,0,124,0,106,2,161,1,103,2, + 125,1,124,0,106,3,100,0,117,1,114,52,124,1,160,4, + 100,3,160,0,124,0,106,3,161,1,161,1,1,0,124,0, + 106,5,100,0,117,1,114,80,124,1,160,4,100,4,160,0, + 124,0,106,5,161,1,161,1,1,0,100,5,160,0,124,0, + 106,6,106,7,100,6,160,8,124,1,161,1,161,2,83,0, + 41,7,78,122,9,110,97,109,101,61,123,33,114,125,122,11, + 108,111,97,100,101,114,61,123,33,114,125,122,11,111,114,105, + 103,105,110,61,123,33,114,125,122,29,115,117,98,109,111,100, + 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, + 105,111,110,115,61,123,125,122,6,123,125,40,123,125,41,122, + 2,44,32,41,9,114,49,0,0,0,114,20,0,0,0,114, + 116,0,0,0,114,120,0,0,0,218,6,97,112,112,101,110, + 100,114,123,0,0,0,218,9,95,95,99,108,97,115,115,95, + 95,114,9,0,0,0,218,4,106,111,105,110,41,2,114,33, + 0,0,0,114,59,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,52,0,0,0,123,1,0,0, + 115,22,0,0,0,10,1,10,1,4,255,10,2,18,1,10, + 1,8,1,4,1,6,255,22,2,255,128,122,19,77,111,100, + 117,108,101,83,112,101,99,46,95,95,114,101,112,114,95,95, + 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,8,0,0,0,67,0,0,0,115,102,0,0,0,124,0, + 106,0,125,2,122,72,124,0,106,1,124,1,106,1,107,2, + 111,76,124,0,106,2,124,1,106,2,107,2,111,76,124,0, + 106,3,124,1,106,3,107,2,111,76,124,2,124,1,106,0, + 107,2,111,76,124,0,106,4,124,1,106,4,107,2,111,76, + 124,0,106,5,124,1,106,5,107,2,87,0,83,0,4,0, + 116,6,121,100,1,0,1,0,1,0,116,7,6,0,89,0, + 83,0,119,0,114,0,0,0,0,41,8,114,123,0,0,0, + 114,20,0,0,0,114,116,0,0,0,114,120,0,0,0,218, + 6,99,97,99,104,101,100,218,12,104,97,115,95,108,111,99, + 97,116,105,111,110,114,2,0,0,0,218,14,78,111,116,73, + 109,112,108,101,109,101,110,116,101,100,41,3,114,33,0,0, + 0,90,5,111,116,104,101,114,90,4,115,109,115,108,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,6,95, + 95,101,113,95,95,133,1,0,0,115,34,0,0,0,6,1, + 2,1,12,1,10,1,2,255,10,2,2,254,8,3,2,253, + 10,4,2,252,10,5,4,251,12,6,8,1,2,255,255,128, + 122,17,77,111,100,117,108,101,83,112,101,99,46,95,95,101, + 113,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,58,0,0, + 0,124,0,106,0,100,0,117,0,114,52,124,0,106,1,100, + 0,117,1,114,52,124,0,106,2,114,52,116,3,100,0,117, + 0,114,38,116,4,130,1,116,3,160,5,124,0,106,1,161, + 1,124,0,95,0,124,0,106,0,83,0,114,0,0,0,0, + 41,6,114,125,0,0,0,114,120,0,0,0,114,124,0,0, + 0,218,19,95,98,111,111,116,115,116,114,97,112,95,101,120, + 116,101,114,110,97,108,218,19,78,111,116,73,109,112,108,101, + 109,101,110,116,101,100,69,114,114,111,114,90,11,95,103,101, + 116,95,99,97,99,104,101,100,114,51,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,129,0,0, + 0,145,1,0,0,115,14,0,0,0,10,2,16,1,8,1, + 4,1,14,1,6,1,255,128,122,17,77,111,100,117,108,101, + 83,112,101,99,46,99,97,99,104,101,100,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, + 67,0,0,0,115,10,0,0,0,124,1,124,0,95,0,100, + 0,83,0,114,0,0,0,0,41,1,114,125,0,0,0,41, + 2,114,33,0,0,0,114,129,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,129,0,0,0,154, + 1,0,0,115,4,0,0,0,10,2,255,128,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,32,0,0,0,124,0,106,0,100,1, + 117,0,114,26,124,0,106,1,160,2,100,2,161,1,100,3, + 25,0,83,0,124,0,106,1,83,0,41,4,122,32,84,104, + 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, + 100,117,108,101,39,115,32,112,97,114,101,110,116,46,78,218, + 1,46,114,25,0,0,0,41,3,114,123,0,0,0,114,20, + 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, + 51,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,6,112,97,114,101,110,116,158,1,0,0,115, + 8,0,0,0,10,3,16,1,6,2,255,128,122,17,77,111, + 100,117,108,101,83,112,101,99,46,112,97,114,101,110,116,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, + 0,83,0,114,0,0,0,0,41,1,114,124,0,0,0,114, + 51,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,130,0,0,0,166,1,0,0,115,4,0,0, + 0,6,2,255,128,122,23,77,111,100,117,108,101,83,112,101, + 99,46,104,97,115,95,108,111,99,97,116,105,111,110,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, + 0,0,0,67,0,0,0,115,14,0,0,0,116,0,124,1, + 131,1,124,0,95,1,100,0,83,0,114,0,0,0,0,41, + 2,218,4,98,111,111,108,114,124,0,0,0,41,2,114,33, + 0,0,0,218,5,118,97,108,117,101,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,130,0,0,0,170,1, + 0,0,115,4,0,0,0,14,2,255,128,41,12,114,9,0, + 0,0,114,8,0,0,0,114,1,0,0,0,114,10,0,0, + 0,114,34,0,0,0,114,52,0,0,0,114,132,0,0,0, + 218,8,112,114,111,112,101,114,116,121,114,129,0,0,0,218, + 6,115,101,116,116,101,114,114,137,0,0,0,114,130,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,119,0,0,0,74,1,0,0,115,36, + 0,0,0,8,0,4,1,4,36,2,1,12,255,8,12,8, + 10,2,12,10,1,4,8,10,1,2,3,10,1,2,7,10, + 1,4,3,14,1,255,128,114,119,0,0,0,169,2,114,120, + 0,0,0,114,122,0,0,0,99,2,0,0,0,0,0,0, + 0,2,0,0,0,6,0,0,0,8,0,0,0,67,0,0, + 0,115,150,0,0,0,116,0,124,1,100,1,131,2,114,74, + 116,1,100,2,117,0,114,22,116,2,130,1,116,1,106,3, + 125,4,124,3,100,2,117,0,114,48,124,4,124,0,124,1, + 100,3,141,2,83,0,124,3,114,56,103,0,110,2,100,2, + 125,5,124,4,124,0,124,1,124,5,100,4,141,3,83,0, + 124,3,100,2,117,0,114,132,116,0,124,1,100,5,131,2, + 114,128,122,14,124,1,160,4,124,0,161,1,125,3,87,0, + 110,24,4,0,116,5,121,148,1,0,1,0,1,0,100,2, + 125,3,89,0,110,4,100,6,125,3,116,6,124,0,124,1, + 124,2,124,3,100,7,141,4,83,0,119,0,41,8,122,53, + 82,101,116,117,114,110,32,97,32,109,111,100,117,108,101,32, + 115,112,101,99,32,98,97,115,101,100,32,111,110,32,118,97, + 114,105,111,117,115,32,108,111,97,100,101,114,32,109,101,116, + 104,111,100,115,46,90,12,103,101,116,95,102,105,108,101,110, + 97,109,101,78,41,1,114,116,0,0,0,41,2,114,116,0, + 0,0,114,123,0,0,0,114,122,0,0,0,70,114,142,0, + 0,0,41,7,114,11,0,0,0,114,133,0,0,0,114,134, + 0,0,0,218,23,115,112,101,99,95,102,114,111,109,95,102, + 105,108,101,95,108,111,99,97,116,105,111,110,114,122,0,0, + 0,114,83,0,0,0,114,119,0,0,0,41,6,114,20,0, + 0,0,114,116,0,0,0,114,120,0,0,0,114,122,0,0, + 0,114,143,0,0,0,90,6,115,101,97,114,99,104,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,98,0, + 0,0,175,1,0,0,115,40,0,0,0,10,2,8,1,4, + 1,6,1,8,2,12,1,12,1,6,1,2,1,6,255,8, + 3,10,1,2,1,14,1,12,1,8,1,4,3,16,2,2, + 250,255,128,114,98,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,8,0,0,0,8,0,0,0,67,0,0, + 0,115,44,1,0,0,122,10,124,0,106,0,125,3,87,0, + 110,18,4,0,116,1,144,1,121,42,1,0,1,0,1,0, + 89,0,110,12,124,3,100,0,117,1,114,42,124,3,83,0, + 124,0,106,2,125,4,124,1,100,0,117,0,114,84,122,10, + 124,0,106,3,125,1,87,0,110,16,4,0,116,1,144,1, + 121,40,1,0,1,0,1,0,89,0,122,10,124,0,106,4, + 125,5,87,0,110,20,4,0,116,1,144,1,121,38,1,0, + 1,0,1,0,100,0,125,5,89,0,124,2,100,0,117,0, + 114,170,124,5,100,0,117,0,114,166,122,10,124,1,106,5, + 125,2,87,0,110,26,4,0,116,1,144,1,121,36,1,0, + 1,0,1,0,100,0,125,2,89,0,110,4,124,5,125,2, + 122,10,124,0,106,6,125,6,87,0,110,20,4,0,116,1, + 144,1,121,34,1,0,1,0,1,0,100,0,125,6,89,0, + 122,14,116,7,124,0,106,8,131,1,125,7,87,0,110,20, + 4,0,116,1,144,1,121,32,1,0,1,0,1,0,100,0, + 125,7,89,0,116,9,124,4,124,1,124,2,100,1,141,3, + 125,3,124,5,100,0,117,0,144,1,114,10,100,2,110,2, + 100,3,124,3,95,10,124,6,124,3,95,11,124,7,124,3, + 95,12,124,3,83,0,119,0,119,0,119,0,119,0,119,0, + 119,0,41,4,78,169,1,114,120,0,0,0,70,84,41,13, 114,113,0,0,0,114,2,0,0,0,114,9,0,0,0,114, 106,0,0,0,114,115,0,0,0,218,7,95,79,82,73,71, 73,78,218,10,95,95,99,97,99,104,101,100,95,95,218,4, @@ -835,1021 +836,1023 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 111,99,97,116,105,111,110,114,129,0,0,0,114,123,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, 218,17,95,115,112,101,99,95,102,114,111,109,95,109,111,100, - 117,108,101,201,1,0,0,115,74,0,0,0,2,2,10,1, - 12,1,6,1,8,2,4,1,6,2,8,1,2,1,10,1, - 12,1,6,2,2,1,10,1,12,1,10,1,8,1,8,1, - 2,1,10,1,12,1,10,1,4,2,2,1,10,1,12,1, - 10,1,2,1,14,1,12,1,10,1,14,2,20,1,6,1, - 6,1,4,1,255,128,114,149,0,0,0,70,169,1,218,8, - 111,118,101,114,114,105,100,101,99,2,0,0,0,0,0,0, - 0,1,0,0,0,5,0,0,0,8,0,0,0,67,0,0, - 0,115,214,1,0,0,124,2,115,20,116,0,124,1,100,1, - 100,0,131,3,100,0,117,0,114,52,122,12,124,0,106,1, - 124,1,95,2,87,0,110,18,4,0,116,3,121,50,1,0, - 1,0,1,0,89,0,110,2,119,0,124,2,115,72,116,0, - 124,1,100,2,100,0,131,3,100,0,117,0,114,174,124,0, - 106,4,125,3,124,3,100,0,117,0,114,144,124,0,106,5, - 100,0,117,1,114,144,116,6,100,0,117,0,114,108,116,7, - 130,1,116,6,106,8,125,4,124,4,160,9,124,4,161,1, - 125,3,124,0,106,5,124,3,95,10,124,3,124,0,95,4, - 100,0,124,1,95,11,122,10,124,3,124,1,95,12,87,0, - 110,18,4,0,116,3,121,172,1,0,1,0,1,0,89,0, - 110,2,119,0,124,2,115,194,116,0,124,1,100,3,100,0, - 131,3,100,0,117,0,114,226,122,12,124,0,106,13,124,1, - 95,14,87,0,110,18,4,0,116,3,121,224,1,0,1,0, - 1,0,89,0,110,2,119,0,122,10,124,0,124,1,95,15, - 87,0,110,18,4,0,116,3,121,254,1,0,1,0,1,0, - 89,0,110,2,119,0,124,2,144,1,115,24,116,0,124,1, - 100,4,100,0,131,3,100,0,117,0,144,1,114,70,124,0, - 106,5,100,0,117,1,144,1,114,70,122,12,124,0,106,5, - 124,1,95,16,87,0,110,20,4,0,116,3,144,1,121,68, - 1,0,1,0,1,0,89,0,110,2,119,0,124,0,106,17, - 144,1,114,210,124,2,144,1,115,102,116,0,124,1,100,5, - 100,0,131,3,100,0,117,0,144,1,114,136,122,12,124,0, - 106,18,124,1,95,11,87,0,110,20,4,0,116,3,144,1, - 121,134,1,0,1,0,1,0,89,0,110,2,119,0,124,2, - 144,1,115,160,116,0,124,1,100,6,100,0,131,3,100,0, - 117,0,144,1,114,210,124,0,106,19,100,0,117,1,144,1, - 114,210,122,14,124,0,106,19,124,1,95,20,87,0,124,1, - 83,0,4,0,116,3,144,1,121,208,1,0,1,0,1,0, - 89,0,124,1,83,0,119,0,124,1,83,0,41,7,78,114, - 9,0,0,0,114,106,0,0,0,218,11,95,95,112,97,99, - 107,97,103,101,95,95,114,148,0,0,0,114,115,0,0,0, - 114,146,0,0,0,41,21,114,13,0,0,0,114,20,0,0, - 0,114,9,0,0,0,114,2,0,0,0,114,116,0,0,0, - 114,123,0,0,0,114,133,0,0,0,114,134,0,0,0,218, - 16,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, - 114,218,7,95,95,110,101,119,95,95,90,5,95,112,97,116, - 104,114,115,0,0,0,114,106,0,0,0,114,137,0,0,0, - 114,152,0,0,0,114,113,0,0,0,114,148,0,0,0,114, - 130,0,0,0,114,120,0,0,0,114,129,0,0,0,114,146, - 0,0,0,41,5,114,103,0,0,0,114,104,0,0,0,114, - 151,0,0,0,114,116,0,0,0,114,153,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,18,95, - 105,110,105,116,95,109,111,100,117,108,101,95,97,116,116,114, - 115,246,1,0,0,115,104,0,0,0,20,4,2,1,12,1, - 12,1,6,1,20,2,6,1,8,1,10,2,8,1,4,1, - 6,1,10,2,8,1,6,1,6,11,2,1,10,1,12,1, - 6,1,20,2,2,1,12,1,12,1,6,1,2,2,10,1, - 12,1,6,1,24,2,12,1,2,1,12,1,14,1,6,1, - 8,2,24,1,2,1,12,1,14,1,6,1,24,2,12,1, - 2,1,10,1,4,3,14,254,2,1,4,1,2,255,4,1, - 255,128,114,155,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,82,0,0,0,100,1,125,1,116,0,124,0,106,1,100, - 2,131,2,114,30,124,0,106,1,160,2,124,0,161,1,125, - 1,110,20,116,0,124,0,106,1,100,3,131,2,114,50,116, - 3,100,4,131,1,130,1,124,1,100,1,117,0,114,68,116, - 4,124,0,106,5,131,1,125,1,116,6,124,0,124,1,131, - 2,1,0,124,1,83,0,41,5,122,43,67,114,101,97,116, - 101,32,97,32,109,111,100,117,108,101,32,98,97,115,101,100, - 32,111,110,32,116,104,101,32,112,114,111,118,105,100,101,100, - 32,115,112,101,99,46,78,218,13,99,114,101,97,116,101,95, - 109,111,100,117,108,101,218,11,101,120,101,99,95,109,111,100, - 117,108,101,122,66,108,111,97,100,101,114,115,32,116,104,97, - 116,32,100,101,102,105,110,101,32,101,120,101,99,95,109,111, - 100,117,108,101,40,41,32,109,117,115,116,32,97,108,115,111, - 32,100,101,102,105,110,101,32,99,114,101,97,116,101,95,109, - 111,100,117,108,101,40,41,41,7,114,11,0,0,0,114,116, - 0,0,0,114,156,0,0,0,114,83,0,0,0,114,21,0, - 0,0,114,20,0,0,0,114,155,0,0,0,169,2,114,103, - 0,0,0,114,104,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,16,109,111,100,117,108,101,95, - 102,114,111,109,95,115,112,101,99,62,2,0,0,115,20,0, - 0,0,4,3,12,1,14,3,12,1,8,1,8,2,10,1, - 10,1,4,1,255,128,114,159,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 67,0,0,0,115,100,0,0,0,124,0,106,0,100,1,117, - 0,114,14,100,2,110,4,124,0,106,0,125,1,124,0,106, - 1,100,1,117,0,114,64,124,0,106,2,100,1,117,0,114, - 50,100,3,160,3,124,1,161,1,83,0,100,4,160,3,124, - 1,124,0,106,2,161,2,83,0,124,0,106,4,114,84,100, - 5,160,3,124,1,124,0,106,1,161,2,83,0,100,6,160, - 3,124,0,106,0,124,0,106,1,161,2,83,0,41,7,122, - 38,82,101,116,117,114,110,32,116,104,101,32,114,101,112,114, - 32,116,111,32,117,115,101,32,102,111,114,32,116,104,101,32, - 109,111,100,117,108,101,46,78,114,108,0,0,0,114,109,0, - 0,0,114,110,0,0,0,114,111,0,0,0,250,18,60,109, - 111,100,117,108,101,32,123,33,114,125,32,40,123,125,41,62, - 41,5,114,20,0,0,0,114,120,0,0,0,114,116,0,0, - 0,114,49,0,0,0,114,130,0,0,0,41,2,114,103,0, - 0,0,114,20,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,114,0,0,0,79,2,0,0,115, - 18,0,0,0,20,3,10,1,10,1,10,1,14,2,6,2, - 14,1,16,2,255,128,114,114,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,10,0,0,0, - 67,0,0,0,115,26,1,0,0,124,0,106,0,125,2,116, - 1,124,2,131,1,143,246,1,0,116,2,106,3,160,4,124, - 2,161,1,124,1,117,1,114,54,100,1,160,5,124,2,161, - 1,125,3,116,6,124,3,124,2,100,2,141,2,130,1,122, - 160,124,0,106,7,100,3,117,0,114,106,124,0,106,8,100, - 3,117,0,114,90,116,6,100,4,124,0,106,0,100,2,141, - 2,130,1,116,9,124,0,124,1,100,5,100,6,141,3,1, - 0,110,80,116,9,124,0,124,1,100,5,100,6,141,3,1, - 0,116,10,124,0,106,7,100,7,131,2,115,174,116,11,124, - 0,106,7,131,1,155,0,100,8,157,2,125,3,116,12,160, - 13,124,3,116,14,161,2,1,0,124,0,106,7,160,15,124, - 2,161,1,1,0,110,12,124,0,106,7,160,16,124,1,161, - 1,1,0,87,0,116,2,106,3,160,17,124,0,106,0,161, - 1,125,1,124,1,116,2,106,3,124,0,106,0,60,0,110, - 28,116,2,106,3,160,17,124,0,106,0,161,1,125,1,124, - 1,116,2,106,3,124,0,106,0,60,0,119,0,87,0,100, - 3,4,0,4,0,131,3,1,0,124,1,83,0,49,0,144, - 1,115,12,119,1,1,0,1,0,1,0,89,0,1,0,124, - 1,83,0,41,9,122,70,69,120,101,99,117,116,101,32,116, - 104,101,32,115,112,101,99,39,115,32,115,112,101,99,105,102, - 105,101,100,32,109,111,100,117,108,101,32,105,110,32,97,110, - 32,101,120,105,115,116,105,110,103,32,109,111,100,117,108,101, - 39,115,32,110,97,109,101,115,112,97,99,101,46,122,30,109, - 111,100,117,108,101,32,123,33,114,125,32,110,111,116,32,105, - 110,32,115,121,115,46,109,111,100,117,108,101,115,114,19,0, - 0,0,78,250,14,109,105,115,115,105,110,103,32,108,111,97, - 100,101,114,84,114,150,0,0,0,114,157,0,0,0,250,55, - 46,101,120,101,99,95,109,111,100,117,108,101,40,41,32,110, - 111,116,32,102,111,117,110,100,59,32,102,97,108,108,105,110, - 103,32,98,97,99,107,32,116,111,32,108,111,97,100,95,109, - 111,100,117,108,101,40,41,41,18,114,20,0,0,0,114,54, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,38,0, - 0,0,114,49,0,0,0,114,83,0,0,0,114,116,0,0, - 0,114,123,0,0,0,114,155,0,0,0,114,11,0,0,0, - 114,7,0,0,0,114,95,0,0,0,114,96,0,0,0,218, - 13,73,109,112,111,114,116,87,97,114,110,105,110,103,218,11, - 108,111,97,100,95,109,111,100,117,108,101,114,157,0,0,0, - 218,3,112,111,112,41,4,114,103,0,0,0,114,104,0,0, - 0,114,20,0,0,0,114,102,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,114,100,0,0,0,96, - 2,0,0,115,50,0,0,0,6,2,10,1,16,1,10,1, - 12,1,2,1,10,1,10,1,14,1,16,2,14,2,12,1, - 16,1,12,2,14,1,12,2,2,128,14,4,14,1,14,255, - 26,1,4,1,18,255,4,1,255,128,114,100,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 8,0,0,0,67,0,0,0,115,18,1,0,0,122,18,124, - 0,106,0,160,1,124,0,106,2,161,1,1,0,87,0,110, - 46,1,0,1,0,1,0,124,0,106,2,116,3,106,4,118, - 0,114,64,116,3,106,4,160,5,124,0,106,2,161,1,125, - 1,124,1,116,3,106,4,124,0,106,2,60,0,130,0,116, - 3,106,4,160,5,124,0,106,2,161,1,125,1,124,1,116, - 3,106,4,124,0,106,2,60,0,116,6,124,1,100,1,100, - 0,131,3,100,0,117,0,114,140,122,12,124,0,106,0,124, - 1,95,7,87,0,110,18,4,0,116,8,121,138,1,0,1, - 0,1,0,89,0,110,2,119,0,116,6,124,1,100,2,100, - 0,131,3,100,0,117,0,114,216,122,40,124,1,106,9,124, - 1,95,10,116,11,124,1,100,3,131,2,115,194,124,0,106, + 117,108,101,201,1,0,0,115,86,0,0,0,2,2,10,1, + 14,1,4,1,8,2,4,1,6,2,8,1,2,1,10,1, + 14,1,2,2,2,1,10,1,14,1,6,1,8,1,8,1, + 2,1,10,1,14,1,8,1,4,2,2,1,10,1,14,1, + 6,1,2,1,14,1,14,1,6,1,14,2,20,1,6,1, + 6,1,4,1,2,249,2,252,2,250,2,250,2,251,2,246, + 255,128,114,149,0,0,0,70,169,1,218,8,111,118,101,114, + 114,105,100,101,99,2,0,0,0,0,0,0,0,1,0,0, + 0,5,0,0,0,8,0,0,0,67,0,0,0,115,210,1, + 0,0,124,2,115,20,116,0,124,1,100,1,100,0,131,3, + 100,0,117,0,114,50,122,12,124,0,106,1,124,1,95,2, + 87,0,110,16,4,0,116,3,144,1,121,208,1,0,1,0, + 1,0,89,0,124,2,115,70,116,0,124,1,100,2,100,0, + 131,3,100,0,117,0,114,170,124,0,106,4,125,3,124,3, + 100,0,117,0,114,142,124,0,106,5,100,0,117,1,114,142, + 116,6,100,0,117,0,114,106,116,7,130,1,116,6,106,8, + 125,4,124,4,160,9,124,4,161,1,125,3,124,0,106,5, + 124,3,95,10,124,3,124,0,95,4,100,0,124,1,95,11, + 122,10,124,3,124,1,95,12,87,0,110,16,4,0,116,3, + 144,1,121,206,1,0,1,0,1,0,89,0,124,2,115,190, + 116,0,124,1,100,3,100,0,131,3,100,0,117,0,114,220, + 122,12,124,0,106,13,124,1,95,14,87,0,110,16,4,0, + 116,3,144,1,121,204,1,0,1,0,1,0,89,0,122,10, + 124,0,124,1,95,15,87,0,110,16,4,0,116,3,144,1, + 121,202,1,0,1,0,1,0,89,0,124,2,144,1,115,16, + 116,0,124,1,100,4,100,0,131,3,100,0,117,0,144,1, + 114,58,124,0,106,5,100,0,117,1,144,1,114,58,122,12, + 124,0,106,5,124,1,95,16,87,0,110,16,4,0,116,3, + 144,1,121,200,1,0,1,0,1,0,89,0,124,0,106,17, + 144,1,114,192,124,2,144,1,115,90,116,0,124,1,100,5, + 100,0,131,3,100,0,117,0,144,1,114,120,122,12,124,0, + 106,18,124,1,95,11,87,0,110,16,4,0,116,3,144,1, + 121,198,1,0,1,0,1,0,89,0,124,2,144,1,115,144, + 116,0,124,1,100,6,100,0,131,3,100,0,117,0,144,1, + 114,192,124,0,106,19,100,0,117,1,144,1,114,192,122,14, + 124,0,106,19,124,1,95,20,87,0,124,1,83,0,4,0, + 116,3,144,1,121,196,1,0,1,0,1,0,89,0,124,1, + 83,0,124,1,83,0,119,0,119,0,119,0,119,0,119,0, + 119,0,119,0,41,7,78,114,9,0,0,0,114,106,0,0, + 0,218,11,95,95,112,97,99,107,97,103,101,95,95,114,148, + 0,0,0,114,115,0,0,0,114,146,0,0,0,41,21,114, + 13,0,0,0,114,20,0,0,0,114,9,0,0,0,114,2, + 0,0,0,114,116,0,0,0,114,123,0,0,0,114,133,0, + 0,0,114,134,0,0,0,218,16,95,78,97,109,101,115,112, + 97,99,101,76,111,97,100,101,114,218,7,95,95,110,101,119, + 95,95,90,5,95,112,97,116,104,114,115,0,0,0,114,106, + 0,0,0,114,137,0,0,0,114,152,0,0,0,114,113,0, + 0,0,114,148,0,0,0,114,130,0,0,0,114,120,0,0, + 0,114,129,0,0,0,114,146,0,0,0,41,5,114,103,0, + 0,0,114,104,0,0,0,114,151,0,0,0,114,116,0,0, + 0,114,153,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,18,95,105,110,105,116,95,109,111,100, + 117,108,101,95,97,116,116,114,115,246,1,0,0,115,114,0, + 0,0,20,4,2,1,12,1,14,1,2,1,20,2,6,1, + 8,1,10,2,8,1,4,1,6,1,10,2,8,1,6,1, + 6,11,2,1,10,1,14,1,2,1,20,2,2,1,12,1, + 14,1,2,1,2,2,10,1,14,1,2,1,24,2,12,1, + 2,1,12,1,14,1,2,1,8,2,24,1,2,1,12,1, + 14,1,2,1,24,2,12,1,2,1,10,1,4,3,14,254, + 2,1,8,1,2,254,2,249,2,249,2,249,2,251,2,250, + 2,228,255,128,114,155,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, + 0,0,115,82,0,0,0,100,1,125,1,116,0,124,0,106, + 1,100,2,131,2,114,30,124,0,106,1,160,2,124,0,161, + 1,125,1,110,20,116,0,124,0,106,1,100,3,131,2,114, + 50,116,3,100,4,131,1,130,1,124,1,100,1,117,0,114, + 68,116,4,124,0,106,5,131,1,125,1,116,6,124,0,124, + 1,131,2,1,0,124,1,83,0,41,5,122,43,67,114,101, + 97,116,101,32,97,32,109,111,100,117,108,101,32,98,97,115, + 101,100,32,111,110,32,116,104,101,32,112,114,111,118,105,100, + 101,100,32,115,112,101,99,46,78,218,13,99,114,101,97,116, + 101,95,109,111,100,117,108,101,218,11,101,120,101,99,95,109, + 111,100,117,108,101,122,66,108,111,97,100,101,114,115,32,116, + 104,97,116,32,100,101,102,105,110,101,32,101,120,101,99,95, + 109,111,100,117,108,101,40,41,32,109,117,115,116,32,97,108, + 115,111,32,100,101,102,105,110,101,32,99,114,101,97,116,101, + 95,109,111,100,117,108,101,40,41,41,7,114,11,0,0,0, + 114,116,0,0,0,114,156,0,0,0,114,83,0,0,0,114, + 21,0,0,0,114,20,0,0,0,114,155,0,0,0,169,2, + 114,103,0,0,0,114,104,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,16,109,111,100,117,108, + 101,95,102,114,111,109,95,115,112,101,99,62,2,0,0,115, + 20,0,0,0,4,3,12,1,14,3,12,1,8,1,8,2, + 10,1,10,1,4,1,255,128,114,159,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,67,0,0,0,115,100,0,0,0,124,0,106,0,100, + 1,117,0,114,14,100,2,110,4,124,0,106,0,125,1,124, + 0,106,1,100,1,117,0,114,64,124,0,106,2,100,1,117, + 0,114,50,100,3,160,3,124,1,161,1,83,0,100,4,160, + 3,124,1,124,0,106,2,161,2,83,0,124,0,106,4,114, + 84,100,5,160,3,124,1,124,0,106,1,161,2,83,0,100, + 6,160,3,124,0,106,0,124,0,106,1,161,2,83,0,41, + 7,122,38,82,101,116,117,114,110,32,116,104,101,32,114,101, + 112,114,32,116,111,32,117,115,101,32,102,111,114,32,116,104, + 101,32,109,111,100,117,108,101,46,78,114,108,0,0,0,114, + 109,0,0,0,114,110,0,0,0,114,111,0,0,0,250,18, + 60,109,111,100,117,108,101,32,123,33,114,125,32,40,123,125, + 41,62,41,5,114,20,0,0,0,114,120,0,0,0,114,116, + 0,0,0,114,49,0,0,0,114,130,0,0,0,41,2,114, + 103,0,0,0,114,20,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,114,0,0,0,79,2,0, + 0,115,18,0,0,0,20,3,10,1,10,1,10,1,14,2, + 6,2,14,1,16,2,255,128,114,114,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,10,0, + 0,0,67,0,0,0,115,26,1,0,0,124,0,106,0,125, + 2,116,1,124,2,131,1,143,246,1,0,116,2,106,3,160, + 4,124,2,161,1,124,1,117,1,114,54,100,1,160,5,124, + 2,161,1,125,3,116,6,124,3,124,2,100,2,141,2,130, + 1,122,160,124,0,106,7,100,3,117,0,114,106,124,0,106, + 8,100,3,117,0,114,90,116,6,100,4,124,0,106,0,100, + 2,141,2,130,1,116,9,124,0,124,1,100,5,100,6,141, + 3,1,0,110,80,116,9,124,0,124,1,100,5,100,6,141, + 3,1,0,116,10,124,0,106,7,100,7,131,2,115,174,116, + 11,124,0,106,7,131,1,155,0,100,8,157,2,125,3,116, + 12,160,13,124,3,116,14,161,2,1,0,124,0,106,7,160, + 15,124,2,161,1,1,0,110,12,124,0,106,7,160,16,124, + 1,161,1,1,0,87,0,116,2,106,3,160,17,124,0,106, + 0,161,1,125,1,124,1,116,2,106,3,124,0,106,0,60, + 0,110,28,116,2,106,3,160,17,124,0,106,0,161,1,125, + 1,124,1,116,2,106,3,124,0,106,0,60,0,119,0,87, + 0,100,3,4,0,4,0,131,3,1,0,124,1,83,0,49, + 0,144,1,115,12,119,1,1,0,1,0,1,0,89,0,1, + 0,124,1,83,0,41,9,122,70,69,120,101,99,117,116,101, + 32,116,104,101,32,115,112,101,99,39,115,32,115,112,101,99, + 105,102,105,101,100,32,109,111,100,117,108,101,32,105,110,32, + 97,110,32,101,120,105,115,116,105,110,103,32,109,111,100,117, + 108,101,39,115,32,110,97,109,101,115,112,97,99,101,46,122, + 30,109,111,100,117,108,101,32,123,33,114,125,32,110,111,116, + 32,105,110,32,115,121,115,46,109,111,100,117,108,101,115,114, + 19,0,0,0,78,250,14,109,105,115,115,105,110,103,32,108, + 111,97,100,101,114,84,114,150,0,0,0,114,157,0,0,0, + 250,55,46,101,120,101,99,95,109,111,100,117,108,101,40,41, + 32,110,111,116,32,102,111,117,110,100,59,32,102,97,108,108, + 105,110,103,32,98,97,99,107,32,116,111,32,108,111,97,100, + 95,109,111,100,117,108,101,40,41,41,18,114,20,0,0,0, + 114,54,0,0,0,114,18,0,0,0,114,99,0,0,0,114, + 38,0,0,0,114,49,0,0,0,114,83,0,0,0,114,116, + 0,0,0,114,123,0,0,0,114,155,0,0,0,114,11,0, + 0,0,114,7,0,0,0,114,95,0,0,0,114,96,0,0, + 0,218,13,73,109,112,111,114,116,87,97,114,110,105,110,103, + 218,11,108,111,97,100,95,109,111,100,117,108,101,114,157,0, + 0,0,218,3,112,111,112,41,4,114,103,0,0,0,114,104, + 0,0,0,114,20,0,0,0,114,102,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,100,0,0, + 0,96,2,0,0,115,50,0,0,0,6,2,10,1,16,1, + 10,1,12,1,2,1,10,1,10,1,14,1,16,2,14,2, + 12,1,16,1,12,2,14,1,12,2,2,128,14,4,14,1, + 14,255,26,1,4,1,18,255,4,1,255,128,114,100,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,8,0,0,0,67,0,0,0,115,18,1,0,0,122, + 18,124,0,106,0,160,1,124,0,106,2,161,1,1,0,87, + 0,110,46,1,0,1,0,1,0,124,0,106,2,116,3,106, + 4,118,0,114,64,116,3,106,4,160,5,124,0,106,2,161, + 1,125,1,124,1,116,3,106,4,124,0,106,2,60,0,130, + 0,116,3,106,4,160,5,124,0,106,2,161,1,125,1,124, + 1,116,3,106,4,124,0,106,2,60,0,116,6,124,1,100, + 1,100,0,131,3,100,0,117,0,114,138,122,12,124,0,106, + 0,124,1,95,7,87,0,110,16,4,0,116,8,144,1,121, + 16,1,0,1,0,1,0,89,0,116,6,124,1,100,2,100, + 0,131,3,100,0,117,0,114,212,122,40,124,1,106,9,124, + 1,95,10,116,11,124,1,100,3,131,2,115,192,124,0,106, 2,160,12,100,4,161,1,100,5,25,0,124,1,95,10,87, - 0,110,18,4,0,116,8,121,214,1,0,1,0,1,0,89, - 0,110,2,119,0,116,6,124,1,100,6,100,0,131,3,100, - 0,117,0,144,1,114,14,122,12,124,0,124,1,95,13,87, - 0,124,1,83,0,4,0,116,8,144,1,121,12,1,0,1, - 0,1,0,89,0,124,1,83,0,119,0,124,1,83,0,41, - 7,78,114,106,0,0,0,114,152,0,0,0,114,148,0,0, - 0,114,135,0,0,0,114,25,0,0,0,114,113,0,0,0, - 41,14,114,116,0,0,0,114,164,0,0,0,114,20,0,0, - 0,114,18,0,0,0,114,99,0,0,0,114,165,0,0,0, - 114,13,0,0,0,114,106,0,0,0,114,2,0,0,0,114, - 9,0,0,0,114,152,0,0,0,114,11,0,0,0,114,136, - 0,0,0,114,113,0,0,0,114,158,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,25,95,108, - 111,97,100,95,98,97,99,107,119,97,114,100,95,99,111,109, - 112,97,116,105,98,108,101,126,2,0,0,115,62,0,0,0, - 2,3,18,1,6,1,12,1,14,1,12,1,2,1,14,3, - 12,1,16,1,2,1,12,1,12,1,6,1,16,1,2,1, - 8,4,10,1,22,1,12,1,6,1,18,1,2,1,8,1, - 4,3,14,254,2,1,4,1,2,255,4,1,255,128,114,166, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,11,0,0,0,67,0,0,0,115,240,0,0, - 0,124,0,106,0,100,0,117,1,114,58,116,1,124,0,106, - 0,100,1,131,2,115,58,116,2,124,0,106,0,131,1,155, - 0,100,2,157,2,125,1,116,3,160,4,124,1,116,5,161, - 2,1,0,116,6,124,0,131,1,83,0,116,7,124,0,131, - 1,125,2,100,3,124,0,95,8,122,158,124,2,116,9,106, - 10,124,0,106,11,60,0,122,50,124,0,106,0,100,0,117, - 0,114,122,124,0,106,12,100,0,117,0,114,134,116,13,100, - 4,124,0,106,11,100,5,141,2,130,1,124,0,106,0,160, - 14,124,2,161,1,1,0,87,0,110,40,1,0,1,0,1, - 0,122,14,116,9,106,10,124,0,106,11,61,0,87,0,130, - 0,4,0,116,15,121,176,1,0,1,0,1,0,89,0,130, - 0,119,0,116,9,106,10,160,16,124,0,106,11,161,1,125, - 2,124,2,116,9,106,10,124,0,106,11,60,0,116,17,100, - 6,124,0,106,11,124,0,106,0,131,3,1,0,87,0,100, - 7,124,0,95,8,124,2,83,0,100,7,124,0,95,8,119, - 0,41,8,78,114,157,0,0,0,114,162,0,0,0,84,114, - 161,0,0,0,114,19,0,0,0,122,18,105,109,112,111,114, - 116,32,123,33,114,125,32,35,32,123,33,114,125,70,41,18, - 114,116,0,0,0,114,11,0,0,0,114,7,0,0,0,114, - 95,0,0,0,114,96,0,0,0,114,163,0,0,0,114,166, - 0,0,0,114,159,0,0,0,90,13,95,105,110,105,116,105, - 97,108,105,122,105,110,103,114,18,0,0,0,114,99,0,0, - 0,114,20,0,0,0,114,123,0,0,0,114,83,0,0,0, - 114,157,0,0,0,114,67,0,0,0,114,165,0,0,0,114, - 80,0,0,0,41,3,114,103,0,0,0,114,102,0,0,0, - 114,104,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,14,95,108,111,97,100,95,117,110,108,111, - 99,107,101,100,162,2,0,0,115,58,0,0,0,10,2,12, - 2,16,1,12,2,8,1,8,2,6,5,2,1,12,1,2, - 1,10,1,10,1,14,1,16,3,6,1,2,1,12,1,2, - 3,12,254,2,1,2,1,2,255,14,6,12,1,18,1,6, - 2,4,2,8,254,255,128,114,167,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,67,0,0,0,115,54,0,0,0,116,0,124,0,106,1, - 131,1,143,24,1,0,116,2,124,0,131,1,87,0,2,0, - 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,40, - 119,1,1,0,1,0,1,0,89,0,1,0,100,1,83,0, - 41,2,122,191,82,101,116,117,114,110,32,97,32,110,101,119, - 32,109,111,100,117,108,101,32,111,98,106,101,99,116,44,32, - 108,111,97,100,101,100,32,98,121,32,116,104,101,32,115,112, - 101,99,39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111,32,105,116,115, - 32,112,97,114,101,110,116,46,10,10,32,32,32,32,73,102, - 32,97,32,109,111,100,117,108,101,32,105,115,32,97,108,114, - 101,97,100,121,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,44,32,116,104,97,116,32,101,120,105,115,116,105, - 110,103,32,109,111,100,117,108,101,32,103,101,116,115,10,32, - 32,32,32,99,108,111,98,98,101,114,101,100,46,10,10,32, - 32,32,32,78,41,3,114,54,0,0,0,114,20,0,0,0, - 114,167,0,0,0,169,1,114,103,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,101,0,0,0, - 207,2,0,0,115,6,0,0,0,12,9,42,1,255,128,114, - 101,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,64,0,0,0,115,140,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 90,4,101,5,100,3,100,4,132,0,131,1,90,6,101,7, - 100,20,100,6,100,7,132,1,131,1,90,8,101,7,100,21, - 100,8,100,9,132,1,131,1,90,9,101,5,100,10,100,11, - 132,0,131,1,90,10,101,5,100,12,100,13,132,0,131,1, - 90,11,101,7,101,12,100,14,100,15,132,0,131,1,131,1, - 90,13,101,7,101,12,100,16,100,17,132,0,131,1,131,1, - 90,14,101,7,101,12,100,18,100,19,132,0,131,1,131,1, - 90,15,101,7,101,16,131,1,90,17,100,5,83,0,41,22, - 218,15,66,117,105,108,116,105,110,73,109,112,111,114,116,101, - 114,122,144,77,101,116,97,32,112,97,116,104,32,105,109,112, - 111,114,116,32,102,111,114,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,65, - 108,108,32,109,101,116,104,111,100,115,32,97,114,101,32,101, - 105,116,104,101,114,32,99,108,97,115,115,32,111,114,32,115, - 116,97,116,105,99,32,109,101,116,104,111,100,115,32,116,111, - 32,97,118,111,105,100,32,116,104,101,32,110,101,101,100,32, - 116,111,10,32,32,32,32,105,110,115,116,97,110,116,105,97, - 116,101,32,116,104,101,32,99,108,97,115,115,46,10,10,32, - 32,32,32,122,8,98,117,105,108,116,45,105,110,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0, - 0,0,67,0,0,0,115,22,0,0,0,100,1,124,0,106, - 0,155,2,100,2,116,1,106,2,155,0,100,3,157,5,83, - 0,41,5,250,115,82,101,116,117,114,110,32,114,101,112,114, - 32,102,111,114,32,116,104,101,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,101,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,84,104,101,32,105,109,112,111,114,116,32, - 109,97,99,104,105,110,101,114,121,32,100,111,101,115,32,116, - 104,101,32,106,111,98,32,105,116,115,101,108,102,46,10,10, - 32,32,32,32,32,32,32,32,122,8,60,109,111,100,117,108, - 101,32,122,2,32,40,122,2,41,62,78,41,3,114,9,0, - 0,0,114,169,0,0,0,114,145,0,0,0,169,1,114,104, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,107,0,0,0,233,2,0,0,115,4,0,0,0, - 22,7,255,128,122,27,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,4,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,5,0,0,0,67,0,0,0,115,42,0,0,0, - 124,2,100,0,117,1,114,12,100,0,83,0,116,0,160,1, - 124,1,161,1,114,38,116,2,124,1,124,0,124,0,106,3, - 100,1,141,3,83,0,100,0,83,0,169,2,78,114,144,0, - 0,0,41,4,114,61,0,0,0,90,10,105,115,95,98,117, - 105,108,116,105,110,114,98,0,0,0,114,145,0,0,0,169, - 4,218,3,99,108,115,114,85,0,0,0,218,4,112,97,116, - 104,218,6,116,97,114,103,101,116,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,9,102,105,110,100,95,115, - 112,101,99,242,2,0,0,115,12,0,0,0,8,2,4,1, - 10,1,16,1,4,2,255,128,122,25,66,117,105,108,116,105, - 110,73,109,112,111,114,116,101,114,46,102,105,110,100,95,115, - 112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,30,0,0, - 0,124,0,160,0,124,1,124,2,161,2,125,3,124,3,100, - 1,117,1,114,26,124,3,106,1,83,0,100,1,83,0,41, - 2,122,175,70,105,110,100,32,116,104,101,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,32,32,32,32,73,102,32,39,112,97,116,104,39,32, - 105,115,32,101,118,101,114,32,115,112,101,99,105,102,105,101, - 100,32,116,104,101,110,32,116,104,101,32,115,101,97,114,99, - 104,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32, - 97,32,102,97,105,108,117,114,101,46,10,10,32,32,32,32, - 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, - 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, - 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, - 32,32,78,41,2,114,177,0,0,0,114,116,0,0,0,41, - 4,114,174,0,0,0,114,85,0,0,0,114,175,0,0,0, - 114,103,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,11,102,105,110,100,95,109,111,100,117,108, - 101,251,2,0,0,115,6,0,0,0,12,9,18,1,255,128, - 122,27,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,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, - 0,0,67,0,0,0,115,46,0,0,0,124,0,106,0,116, - 1,106,2,118,1,114,34,116,3,100,1,160,4,124,0,106, - 0,161,1,124,0,106,0,100,2,141,2,130,1,116,5,116, - 6,106,7,124,0,131,2,83,0,41,4,122,24,67,114,101, - 97,116,101,32,97,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,114,81,0,0,0,114,19,0,0,0,78, - 41,8,114,20,0,0,0,114,18,0,0,0,114,82,0,0, - 0,114,83,0,0,0,114,49,0,0,0,114,71,0,0,0, - 114,61,0,0,0,90,14,99,114,101,97,116,101,95,98,117, - 105,108,116,105,110,114,168,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,156,0,0,0,7,3, - 0,0,115,12,0,0,0,12,3,12,1,4,1,6,255,12, - 2,255,128,122,29,66,117,105,108,116,105,110,73,109,112,111, - 114,116,101,114,46,99,114,101,97,116,101,95,109,111,100,117, - 108,101,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,16,0,0,0, - 116,0,116,1,106,2,124,0,131,2,1,0,100,1,83,0, - 41,2,122,22,69,120,101,99,32,97,32,98,117,105,108,116, - 45,105,110,32,109,111,100,117,108,101,78,41,3,114,71,0, - 0,0,114,61,0,0,0,90,12,101,120,101,99,95,98,117, - 105,108,116,105,110,114,171,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,157,0,0,0,15,3, - 0,0,115,4,0,0,0,16,3,255,128,122,27,66,117,105, - 108,116,105,110,73,109,112,111,114,116,101,114,46,101,120,101, - 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,57,82,101, - 116,117,114,110,32,78,111,110,101,32,97,115,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,115,32,100,111, - 32,110,111,116,32,104,97,118,101,32,99,111,100,101,32,111, - 98,106,101,99,116,115,46,78,114,5,0,0,0,169,2,114, - 174,0,0,0,114,85,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,8,103,101,116,95,99,111, - 100,101,20,3,0,0,115,4,0,0,0,4,4,255,128,122, - 24,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,56,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,100, - 111,32,110,111,116,32,104,97,118,101,32,115,111,117,114,99, - 101,32,99,111,100,101,46,78,114,5,0,0,0,114,179,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,10,103,101,116,95,115,111,117,114,99,101,26,3,0, - 0,115,4,0,0,0,4,4,255,128,122,26,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,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,3,122,52,82,101,116,117, - 114,110,32,70,97,108,115,101,32,97,115,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,115,32,97,114,101, - 32,110,101,118,101,114,32,112,97,99,107,97,103,101,115,46, - 70,78,114,5,0,0,0,114,179,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,122,0,0,0, - 32,3,0,0,115,4,0,0,0,4,4,255,128,122,26,66, - 117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,105, + 0,110,16,4,0,116,8,144,1,121,14,1,0,1,0,1, + 0,89,0,116,6,124,1,100,6,100,0,131,3,100,0,117, + 0,144,1,114,8,122,12,124,0,124,1,95,13,87,0,124, + 1,83,0,4,0,116,8,144,1,121,12,1,0,1,0,1, + 0,89,0,124,1,83,0,124,1,83,0,119,0,119,0,119, + 0,41,7,78,114,106,0,0,0,114,152,0,0,0,114,148, + 0,0,0,114,135,0,0,0,114,25,0,0,0,114,113,0, + 0,0,41,14,114,116,0,0,0,114,164,0,0,0,114,20, + 0,0,0,114,18,0,0,0,114,99,0,0,0,114,165,0, + 0,0,114,13,0,0,0,114,106,0,0,0,114,2,0,0, + 0,114,9,0,0,0,114,152,0,0,0,114,11,0,0,0, + 114,136,0,0,0,114,113,0,0,0,114,158,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,25, + 95,108,111,97,100,95,98,97,99,107,119,97,114,100,95,99, + 111,109,112,97,116,105,98,108,101,126,2,0,0,115,64,0, + 0,0,2,3,18,1,6,1,12,1,14,1,12,1,2,1, + 14,3,12,1,16,1,2,1,12,1,14,1,2,1,16,1, + 2,1,8,4,10,1,22,1,14,1,2,1,18,1,2,1, + 8,1,4,3,14,254,2,1,8,1,2,254,2,251,2,246, + 255,128,114,166,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,11,0,0,0,67,0,0,0, + 115,240,0,0,0,124,0,106,0,100,0,117,1,114,58,116, + 1,124,0,106,0,100,1,131,2,115,58,116,2,124,0,106, + 0,131,1,155,0,100,2,157,2,125,1,116,3,160,4,124, + 1,116,5,161,2,1,0,116,6,124,0,131,1,83,0,116, + 7,124,0,131,1,125,2,100,3,124,0,95,8,122,156,124, + 2,116,9,106,10,124,0,106,11,60,0,122,50,124,0,106, + 0,100,0,117,0,114,122,124,0,106,12,100,0,117,0,114, + 134,116,13,100,4,124,0,106,11,100,5,141,2,130,1,124, + 0,106,0,160,14,124,2,161,1,1,0,87,0,110,38,1, + 0,1,0,1,0,122,14,116,9,106,10,124,0,106,11,61, + 0,87,0,130,0,4,0,116,15,121,238,1,0,1,0,1, + 0,89,0,130,0,116,9,106,10,160,16,124,0,106,11,161, + 1,125,2,124,2,116,9,106,10,124,0,106,11,60,0,116, + 17,100,6,124,0,106,11,124,0,106,0,131,3,1,0,87, + 0,100,7,124,0,95,8,124,2,83,0,100,7,124,0,95, + 8,119,0,119,0,41,8,78,114,157,0,0,0,114,162,0, + 0,0,84,114,161,0,0,0,114,19,0,0,0,122,18,105, + 109,112,111,114,116,32,123,33,114,125,32,35,32,123,33,114, + 125,70,41,18,114,116,0,0,0,114,11,0,0,0,114,7, + 0,0,0,114,95,0,0,0,114,96,0,0,0,114,163,0, + 0,0,114,166,0,0,0,114,159,0,0,0,90,13,95,105, + 110,105,116,105,97,108,105,122,105,110,103,114,18,0,0,0, + 114,99,0,0,0,114,20,0,0,0,114,123,0,0,0,114, + 83,0,0,0,114,157,0,0,0,114,67,0,0,0,114,165, + 0,0,0,114,80,0,0,0,41,3,114,103,0,0,0,114, + 102,0,0,0,114,104,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,14,95,108,111,97,100,95, + 117,110,108,111,99,107,101,100,162,2,0,0,115,58,0,0, + 0,10,2,12,2,16,1,12,2,8,1,8,2,6,5,2, + 1,12,1,2,1,10,1,10,1,14,1,16,3,6,1,2, + 1,12,1,2,3,12,254,2,1,2,1,14,5,12,1,18, + 1,6,2,4,2,8,254,2,245,255,128,114,167,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,8,0,0,0,67,0,0,0,115,54,0,0,0,116,0, + 124,0,106,1,131,1,143,24,1,0,116,2,124,0,131,1, + 87,0,2,0,100,1,4,0,4,0,131,3,1,0,83,0, + 49,0,115,40,119,1,1,0,1,0,1,0,89,0,1,0, + 100,1,83,0,41,2,122,191,82,101,116,117,114,110,32,97, + 32,110,101,119,32,109,111,100,117,108,101,32,111,98,106,101, + 99,116,44,32,108,111,97,100,101,100,32,98,121,32,116,104, + 101,32,115,112,101,99,39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111, + 32,105,116,115,32,112,97,114,101,110,116,46,10,10,32,32, + 32,32,73,102,32,97,32,109,111,100,117,108,101,32,105,115, + 32,97,108,114,101,97,100,121,32,105,110,32,115,121,115,46, + 109,111,100,117,108,101,115,44,32,116,104,97,116,32,101,120, + 105,115,116,105,110,103,32,109,111,100,117,108,101,32,103,101, + 116,115,10,32,32,32,32,99,108,111,98,98,101,114,101,100, + 46,10,10,32,32,32,32,78,41,3,114,54,0,0,0,114, + 20,0,0,0,114,167,0,0,0,169,1,114,103,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 101,0,0,0,207,2,0,0,115,6,0,0,0,12,9,42, + 1,255,128,114,101,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, + 0,115,140,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,90,4,101,5,100,3,100,4,132,0,131,1, + 90,6,101,7,100,20,100,6,100,7,132,1,131,1,90,8, + 101,7,100,21,100,8,100,9,132,1,131,1,90,9,101,5, + 100,10,100,11,132,0,131,1,90,10,101,5,100,12,100,13, + 132,0,131,1,90,11,101,7,101,12,100,14,100,15,132,0, + 131,1,131,1,90,13,101,7,101,12,100,16,100,17,132,0, + 131,1,131,1,90,14,101,7,101,12,100,18,100,19,132,0, + 131,1,131,1,90,15,101,7,101,16,131,1,90,17,100,5, + 83,0,41,22,218,15,66,117,105,108,116,105,110,73,109,112, + 111,114,116,101,114,122,144,77,101,116,97,32,112,97,116,104, + 32,105,109,112,111,114,116,32,102,111,114,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,115,46,10,10,32, + 32,32,32,65,108,108,32,109,101,116,104,111,100,115,32,97, + 114,101,32,101,105,116,104,101,114,32,99,108,97,115,115,32, + 111,114,32,115,116,97,116,105,99,32,109,101,116,104,111,100, + 115,32,116,111,32,97,118,111,105,100,32,116,104,101,32,110, + 101,101,100,32,116,111,10,32,32,32,32,105,110,115,116,97, + 110,116,105,97,116,101,32,116,104,101,32,99,108,97,115,115, + 46,10,10,32,32,32,32,122,8,98,117,105,108,116,45,105, + 110,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,5,0,0,0,67,0,0,0,115,22,0,0,0,100, + 1,124,0,106,0,155,2,100,2,116,1,106,2,155,0,100, + 3,157,5,83,0,41,5,250,115,82,101,116,117,114,110,32, + 114,101,112,114,32,102,111,114,32,116,104,101,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, + 101,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, + 101,99,97,116,101,100,46,32,32,84,104,101,32,105,109,112, + 111,114,116,32,109,97,99,104,105,110,101,114,121,32,100,111, + 101,115,32,116,104,101,32,106,111,98,32,105,116,115,101,108, + 102,46,10,10,32,32,32,32,32,32,32,32,122,8,60,109, + 111,100,117,108,101,32,122,2,32,40,122,2,41,62,78,41, + 3,114,9,0,0,0,114,169,0,0,0,114,145,0,0,0, + 169,1,114,104,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,107,0,0,0,233,2,0,0,115, + 4,0,0,0,22,7,255,128,122,27,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,4,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, + 42,0,0,0,124,2,100,0,117,1,114,12,100,0,83,0, + 116,0,160,1,124,1,161,1,114,38,116,2,124,1,124,0, + 124,0,106,3,100,1,141,3,83,0,100,0,83,0,169,2, + 78,114,144,0,0,0,41,4,114,61,0,0,0,90,10,105, + 115,95,98,117,105,108,116,105,110,114,98,0,0,0,114,145, + 0,0,0,169,4,218,3,99,108,115,114,85,0,0,0,218, + 4,112,97,116,104,218,6,116,97,114,103,101,116,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,9,102,105, + 110,100,95,115,112,101,99,242,2,0,0,115,12,0,0,0, + 8,2,4,1,10,1,16,1,4,2,255,128,122,25,66,117, + 105,108,116,105,110,73,109,112,111,114,116,101,114,46,102,105, + 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,30,0,0,0,124,0,160,0,124,1,124,2,161,2,125, + 3,124,3,100,1,117,1,114,26,124,3,106,1,83,0,100, + 1,83,0,41,2,122,175,70,105,110,100,32,116,104,101,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,73,102,32,39,112,97, + 116,104,39,32,105,115,32,101,118,101,114,32,115,112,101,99, + 105,102,105,101,100,32,116,104,101,110,32,116,104,101,32,115, + 101,97,114,99,104,32,105,115,32,99,111,110,115,105,100,101, + 114,101,100,32,97,32,102,97,105,108,117,114,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, + 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,32,32,32,32,78,41,2,114,177,0,0,0,114,116, + 0,0,0,41,4,114,174,0,0,0,114,85,0,0,0,114, + 175,0,0,0,114,103,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,11,102,105,110,100,95,109, + 111,100,117,108,101,251,2,0,0,115,6,0,0,0,12,9, + 18,1,255,128,122,27,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,4,0,0,0,67,0,0,0,115,46,0,0,0,124, + 0,106,0,116,1,106,2,118,1,114,34,116,3,100,1,160, + 4,124,0,106,0,161,1,124,0,106,0,100,2,141,2,130, + 1,116,5,116,6,106,7,124,0,131,2,83,0,41,4,122, + 24,67,114,101,97,116,101,32,97,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,114,81,0,0,0,114,19, + 0,0,0,78,41,8,114,20,0,0,0,114,18,0,0,0, + 114,82,0,0,0,114,83,0,0,0,114,49,0,0,0,114, + 71,0,0,0,114,61,0,0,0,90,14,99,114,101,97,116, + 101,95,98,117,105,108,116,105,110,114,168,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,156,0, + 0,0,7,3,0,0,115,12,0,0,0,12,3,12,1,4, + 1,6,255,12,2,255,128,122,29,66,117,105,108,116,105,110, + 73,109,112,111,114,116,101,114,46,99,114,101,97,116,101,95, + 109,111,100,117,108,101,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 16,0,0,0,116,0,116,1,106,2,124,0,131,2,1,0, + 100,1,83,0,41,2,122,22,69,120,101,99,32,97,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,78,41, + 3,114,71,0,0,0,114,61,0,0,0,90,12,101,120,101, + 99,95,98,117,105,108,116,105,110,114,171,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,157,0, + 0,0,15,3,0,0,115,4,0,0,0,16,3,255,128,122, + 27,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, + 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, + 122,57,82,101,116,117,114,110,32,78,111,110,101,32,97,115, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 115,32,100,111,32,110,111,116,32,104,97,118,101,32,99,111, + 100,101,32,111,98,106,101,99,116,115,46,78,114,5,0,0, + 0,169,2,114,174,0,0,0,114,85,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,8,103,101, + 116,95,99,111,100,101,20,3,0,0,115,4,0,0,0,4, + 4,255,128,122,24,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,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,122,56,82,101,116,117,114,110,32,78,111,110,101,32,97, + 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, + 111,117,114,99,101,32,99,111,100,101,46,78,114,5,0,0, + 0,114,179,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,10,103,101,116,95,115,111,117,114,99, + 101,26,3,0,0,115,4,0,0,0,4,4,255,128,122,26, + 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,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,3,122,52, + 82,101,116,117,114,110,32,70,97,108,115,101,32,97,115,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, + 32,97,114,101,32,110,101,118,101,114,32,112,97,99,107,97, + 103,101,115,46,70,78,114,5,0,0,0,114,179,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 122,0,0,0,32,3,0,0,115,4,0,0,0,4,4,255, + 128,122,26,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,41,2,78, + 78,41,1,78,41,18,114,9,0,0,0,114,8,0,0,0, + 114,1,0,0,0,114,10,0,0,0,114,145,0,0,0,218, + 12,115,116,97,116,105,99,109,101,116,104,111,100,114,107,0, + 0,0,218,11,99,108,97,115,115,109,101,116,104,111,100,114, + 177,0,0,0,114,178,0,0,0,114,156,0,0,0,114,157, + 0,0,0,114,90,0,0,0,114,180,0,0,0,114,181,0, + 0,0,114,122,0,0,0,114,105,0,0,0,114,164,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,169,0,0,0,222,2,0,0,115,48, + 0,0,0,8,0,4,2,4,7,2,2,10,1,2,8,12, + 1,2,8,12,1,2,11,10,1,2,7,10,1,2,4,2, + 1,12,1,2,4,2,1,12,1,2,4,2,1,12,1,12, + 4,255,128,114,169,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, + 0,115,144,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,90,4,101,5,100,3,100,4,132,0,131,1, + 90,6,101,7,100,22,100,6,100,7,132,1,131,1,90,8, + 101,7,100,23,100,8,100,9,132,1,131,1,90,9,101,5, + 100,10,100,11,132,0,131,1,90,10,101,5,100,12,100,13, + 132,0,131,1,90,11,101,7,100,14,100,15,132,0,131,1, + 90,12,101,7,101,13,100,16,100,17,132,0,131,1,131,1, + 90,14,101,7,101,13,100,18,100,19,132,0,131,1,131,1, + 90,15,101,7,101,13,100,20,100,21,132,0,131,1,131,1, + 90,16,100,5,83,0,41,24,218,14,70,114,111,122,101,110, + 73,109,112,111,114,116,101,114,122,142,77,101,116,97,32,112, + 97,116,104,32,105,109,112,111,114,116,32,102,111,114,32,102, + 114,111,122,101,110,32,109,111,100,117,108,101,115,46,10,10, + 32,32,32,32,65,108,108,32,109,101,116,104,111,100,115,32, + 97,114,101,32,101,105,116,104,101,114,32,99,108,97,115,115, + 32,111,114,32,115,116,97,116,105,99,32,109,101,116,104,111, + 100,115,32,116,111,32,97,118,111,105,100,32,116,104,101,32, + 110,101,101,100,32,116,111,10,32,32,32,32,105,110,115,116, + 97,110,116,105,97,116,101,32,116,104,101,32,99,108,97,115, + 115,46,10,10,32,32,32,32,90,6,102,114,111,122,101,110, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,4,0,0,0,67,0,0,0,115,16,0,0,0,100,1, + 160,0,124,0,106,1,116,2,106,3,161,2,83,0,41,3, + 114,170,0,0,0,114,160,0,0,0,78,41,4,114,49,0, + 0,0,114,9,0,0,0,114,184,0,0,0,114,145,0,0, + 0,41,1,218,1,109,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,107,0,0,0,52,3,0,0,115,4, + 0,0,0,16,7,255,128,122,26,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,4,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,5,0,0,0,67,0,0,0,115,30,0, + 0,0,116,0,160,1,124,1,161,1,114,26,116,2,124,1, + 124,0,124,0,106,3,100,1,141,3,83,0,100,0,83,0, + 114,172,0,0,0,41,4,114,61,0,0,0,114,92,0,0, + 0,114,98,0,0,0,114,145,0,0,0,114,173,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 177,0,0,0,61,3,0,0,115,8,0,0,0,10,2,16, + 1,4,2,255,128,122,24,70,114,111,122,101,110,73,109,112, + 111,114,116,101,114,46,102,105,110,100,95,115,112,101,99,99, + 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,18,0,0,0,116,0,160, + 1,124,1,161,1,114,14,124,0,83,0,100,1,83,0,41, + 2,122,93,70,105,110,100,32,97,32,102,114,111,122,101,110, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, + 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, + 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110, + 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, + 78,41,2,114,61,0,0,0,114,92,0,0,0,41,3,114, + 174,0,0,0,114,85,0,0,0,114,175,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,178,0, + 0,0,68,3,0,0,115,4,0,0,0,18,7,255,128,122, + 26,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,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0, + 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, + 42,85,115,101,32,100,101,102,97,117,108,116,32,115,101,109, + 97,110,116,105,99,115,32,102,111,114,32,109,111,100,117,108, + 101,32,99,114,101,97,116,105,111,110,46,78,114,5,0,0, + 0,114,168,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,156,0,0,0,77,3,0,0,115,4, + 0,0,0,4,0,255,128,122,28,70,114,111,122,101,110,73, + 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, + 111,100,117,108,101,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,64, + 0,0,0,124,0,106,0,106,1,125,1,116,2,160,3,124, + 1,161,1,115,36,116,4,100,1,160,5,124,1,161,1,124, + 1,100,2,141,2,130,1,116,6,116,2,106,7,124,1,131, + 2,125,2,116,8,124,2,124,0,106,9,131,2,1,0,100, + 0,83,0,114,91,0,0,0,41,10,114,113,0,0,0,114, + 20,0,0,0,114,61,0,0,0,114,92,0,0,0,114,83, + 0,0,0,114,49,0,0,0,114,71,0,0,0,218,17,103, + 101,116,95,102,114,111,122,101,110,95,111,98,106,101,99,116, + 218,4,101,120,101,99,114,14,0,0,0,41,3,114,104,0, + 0,0,114,20,0,0,0,218,4,99,111,100,101,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,157,0,0, + 0,81,3,0,0,115,16,0,0,0,8,2,10,1,10,1, + 2,1,6,255,12,2,16,1,255,128,122,26,70,114,111,122, + 101,110,73,109,112,111,114,116,101,114,46,101,120,101,99,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 10,0,0,0,116,0,124,0,124,1,131,2,83,0,41,2, + 122,95,76,111,97,100,32,97,32,102,114,111,122,101,110,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,78,41,1,114,105,0,0,0,114,179,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,164,0, + 0,0,90,3,0,0,115,4,0,0,0,10,8,255,128,122, + 26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,10,0,0,0,116,0,160,1,124,1,161, + 1,83,0,41,2,122,45,82,101,116,117,114,110,32,116,104, + 101,32,99,111,100,101,32,111,98,106,101,99,116,32,102,111, + 114,32,116,104,101,32,102,114,111,122,101,110,32,109,111,100, + 117,108,101,46,78,41,2,114,61,0,0,0,114,186,0,0, + 0,114,179,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,180,0,0,0,100,3,0,0,115,4, + 0,0,0,10,4,255,128,122,23,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,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 83,0,41,2,122,54,82,101,116,117,114,110,32,78,111,110, + 101,32,97,115,32,102,114,111,122,101,110,32,109,111,100,117, + 108,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32, + 115,111,117,114,99,101,32,99,111,100,101,46,78,114,5,0, + 0,0,114,179,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,181,0,0,0,106,3,0,0,115, + 4,0,0,0,4,4,255,128,122,25,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,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,10,0,0, + 0,116,0,160,1,124,1,161,1,83,0,41,2,122,46,82, + 101,116,117,114,110,32,84,114,117,101,32,105,102,32,116,104, + 101,32,102,114,111,122,101,110,32,109,111,100,117,108,101,32, + 105,115,32,97,32,112,97,99,107,97,103,101,46,78,41,2, + 114,61,0,0,0,90,17,105,115,95,102,114,111,122,101,110, + 95,112,97,99,107,97,103,101,114,179,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,122,0,0, + 0,112,3,0,0,115,4,0,0,0,10,4,255,128,122,25, + 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,41,2,78,78,41,1,78, - 41,18,114,9,0,0,0,114,8,0,0,0,114,1,0,0, - 0,114,10,0,0,0,114,145,0,0,0,218,12,115,116,97, - 116,105,99,109,101,116,104,111,100,114,107,0,0,0,218,11, - 99,108,97,115,115,109,101,116,104,111,100,114,177,0,0,0, - 114,178,0,0,0,114,156,0,0,0,114,157,0,0,0,114, - 90,0,0,0,114,180,0,0,0,114,181,0,0,0,114,122, - 0,0,0,114,105,0,0,0,114,164,0,0,0,114,5,0, + 41,17,114,9,0,0,0,114,8,0,0,0,114,1,0,0, + 0,114,10,0,0,0,114,145,0,0,0,114,182,0,0,0, + 114,107,0,0,0,114,183,0,0,0,114,177,0,0,0,114, + 178,0,0,0,114,156,0,0,0,114,157,0,0,0,114,164, + 0,0,0,114,94,0,0,0,114,180,0,0,0,114,181,0, + 0,0,114,122,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,184,0,0,0, + 41,3,0,0,115,50,0,0,0,8,0,4,2,4,7,2, + 2,10,1,2,8,12,1,2,6,12,1,2,8,10,1,2, + 3,10,1,2,8,10,1,2,9,2,1,12,1,2,4,2, + 1,12,1,2,4,2,1,16,1,255,128,114,184,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,64,0,0,0,115,32,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,100,6,83,0,41,7, + 218,18,95,73,109,112,111,114,116,76,111,99,107,67,111,110, + 116,101,120,116,122,36,67,111,110,116,101,120,116,32,109,97, + 110,97,103,101,114,32,102,111,114,32,116,104,101,32,105,109, + 112,111,114,116,32,108,111,99,107,46,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, + 0,0,0,115,12,0,0,0,116,0,160,1,161,0,1,0, + 100,1,83,0,41,2,122,24,65,99,113,117,105,114,101,32, + 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, + 78,41,2,114,61,0,0,0,114,62,0,0,0,114,51,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,169,0,0,0,222,2,0,0,115,48,0,0,0,8, - 0,4,2,4,7,2,2,10,1,2,8,12,1,2,8,12, - 1,2,11,10,1,2,7,10,1,2,4,2,1,12,1,2, - 4,2,1,12,1,2,4,2,1,12,1,12,4,255,128,114, - 169,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,64,0,0,0,115,144,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 90,4,101,5,100,3,100,4,132,0,131,1,90,6,101,7, - 100,22,100,6,100,7,132,1,131,1,90,8,101,7,100,23, - 100,8,100,9,132,1,131,1,90,9,101,5,100,10,100,11, - 132,0,131,1,90,10,101,5,100,12,100,13,132,0,131,1, - 90,11,101,7,100,14,100,15,132,0,131,1,90,12,101,7, - 101,13,100,16,100,17,132,0,131,1,131,1,90,14,101,7, - 101,13,100,18,100,19,132,0,131,1,131,1,90,15,101,7, - 101,13,100,20,100,21,132,0,131,1,131,1,90,16,100,5, - 83,0,41,24,218,14,70,114,111,122,101,110,73,109,112,111, - 114,116,101,114,122,142,77,101,116,97,32,112,97,116,104,32, - 105,109,112,111,114,116,32,102,111,114,32,102,114,111,122,101, - 110,32,109,111,100,117,108,101,115,46,10,10,32,32,32,32, - 65,108,108,32,109,101,116,104,111,100,115,32,97,114,101,32, - 101,105,116,104,101,114,32,99,108,97,115,115,32,111,114,32, - 115,116,97,116,105,99,32,109,101,116,104,111,100,115,32,116, - 111,32,97,118,111,105,100,32,116,104,101,32,110,101,101,100, - 32,116,111,10,32,32,32,32,105,110,115,116,97,110,116,105, - 97,116,101,32,116,104,101,32,99,108,97,115,115,46,10,10, - 32,32,32,32,90,6,102,114,111,122,101,110,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,67,0,0,0,115,16,0,0,0,100,1,160,0,124,0, - 106,1,116,2,106,3,161,2,83,0,41,3,114,170,0,0, - 0,114,160,0,0,0,78,41,4,114,49,0,0,0,114,9, - 0,0,0,114,184,0,0,0,114,145,0,0,0,41,1,218, - 1,109,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,107,0,0,0,52,3,0,0,115,4,0,0,0,16, - 7,255,128,122,26,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,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,5,0,0,0,67,0,0,0,115,30,0,0,0,116,0, - 160,1,124,1,161,1,114,26,116,2,124,1,124,0,124,0, - 106,3,100,1,141,3,83,0,100,0,83,0,114,172,0,0, - 0,41,4,114,61,0,0,0,114,92,0,0,0,114,98,0, - 0,0,114,145,0,0,0,114,173,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,177,0,0,0, - 61,3,0,0,115,8,0,0,0,10,2,16,1,4,2,255, - 128,122,24,70,114,111,122,101,110,73,109,112,111,114,116,101, - 114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,18,0,0,0,116,0,160,1,124,1,161, - 1,114,14,124,0,83,0,100,1,83,0,41,2,122,93,70, - 105,110,100,32,97,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, - 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,46,32,32,85,115,101,32,102,105, - 110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,97, - 100,46,10,10,32,32,32,32,32,32,32,32,78,41,2,114, - 61,0,0,0,114,92,0,0,0,41,3,114,174,0,0,0, - 114,85,0,0,0,114,175,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,178,0,0,0,68,3, - 0,0,115,4,0,0,0,18,7,255,128,122,26,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,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,122,42,85,115,101, - 32,100,101,102,97,117,108,116,32,115,101,109,97,110,116,105, - 99,115,32,102,111,114,32,109,111,100,117,108,101,32,99,114, - 101,97,116,105,111,110,46,78,114,5,0,0,0,114,168,0, + 0,114,58,0,0,0,125,3,0,0,115,4,0,0,0,12, + 2,255,128,122,28,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,0,0,0,0,4,0, + 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,160,1,161,0,1,0,100,1,83,0,41,2,122,60,82, + 101,108,101,97,115,101,32,116,104,101,32,105,109,112,111,114, + 116,32,108,111,99,107,32,114,101,103,97,114,100,108,101,115, + 115,32,111,102,32,97,110,121,32,114,97,105,115,101,100,32, + 101,120,99,101,112,116,105,111,110,115,46,78,41,2,114,61, + 0,0,0,114,64,0,0,0,41,4,114,33,0,0,0,218, + 8,101,120,99,95,116,121,112,101,218,9,101,120,99,95,118, + 97,108,117,101,218,13,101,120,99,95,116,114,97,99,101,98, + 97,99,107,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,114,60,0,0,0,129,3,0,0,115,4,0,0,0, + 12,2,255,128,122,27,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,41,6,114,9,0,0,0,114,8,0,0,0,114,1, + 0,0,0,114,10,0,0,0,114,58,0,0,0,114,60,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,189,0,0,0,121,3,0,0,115, + 10,0,0,0,8,0,4,2,8,2,12,4,255,128,114,189, + 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, + 5,0,0,0,5,0,0,0,67,0,0,0,115,64,0,0, + 0,124,1,160,0,100,1,124,2,100,2,24,0,161,2,125, + 3,116,1,124,3,131,1,124,2,107,0,114,36,116,2,100, + 3,131,1,130,1,124,3,100,4,25,0,125,4,124,0,114, + 60,100,5,160,3,124,4,124,0,161,2,83,0,124,4,83, + 0,41,7,122,50,82,101,115,111,108,118,101,32,97,32,114, + 101,108,97,116,105,118,101,32,109,111,100,117,108,101,32,110, + 97,109,101,32,116,111,32,97,110,32,97,98,115,111,108,117, + 116,101,32,111,110,101,46,114,135,0,0,0,114,42,0,0, + 0,122,50,97,116,116,101,109,112,116,101,100,32,114,101,108, + 97,116,105,118,101,32,105,109,112,111,114,116,32,98,101,121, + 111,110,100,32,116,111,112,45,108,101,118,101,108,32,112,97, + 99,107,97,103,101,114,25,0,0,0,250,5,123,125,46,123, + 125,78,41,4,218,6,114,115,112,108,105,116,218,3,108,101, + 110,114,83,0,0,0,114,49,0,0,0,41,5,114,20,0, + 0,0,218,7,112,97,99,107,97,103,101,218,5,108,101,118, + 101,108,90,4,98,105,116,115,90,4,98,97,115,101,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,13,95, + 114,101,115,111,108,118,101,95,110,97,109,101,134,3,0,0, + 115,12,0,0,0,16,2,12,1,8,1,8,1,20,1,255, + 128,114,198,0,0,0,99,3,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, + 34,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, + 124,3,100,0,117,0,114,24,100,0,83,0,116,1,124,1, + 124,3,131,2,83,0,114,0,0,0,0,41,2,114,178,0, + 0,0,114,98,0,0,0,41,4,218,6,102,105,110,100,101, + 114,114,20,0,0,0,114,175,0,0,0,114,116,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 17,95,102,105,110,100,95,115,112,101,99,95,108,101,103,97, + 99,121,143,3,0,0,115,10,0,0,0,12,3,8,1,4, + 1,10,1,255,128,114,200,0,0,0,99,3,0,0,0,0, + 0,0,0,0,0,0,0,10,0,0,0,10,0,0,0,67, + 0,0,0,115,32,1,0,0,116,0,106,1,125,3,124,3, + 100,1,117,0,114,22,116,2,100,2,131,1,130,1,124,3, + 115,38,116,3,160,4,100,3,116,5,161,2,1,0,124,0, + 116,0,106,6,118,0,125,4,124,3,68,0,93,226,125,5, + 116,7,131,0,143,94,1,0,122,10,124,5,106,8,125,6, + 87,0,110,54,4,0,116,9,144,1,121,30,1,0,1,0, + 1,0,116,10,124,5,124,0,124,1,131,3,125,7,124,7, + 100,1,117,0,114,126,89,0,87,0,100,1,4,0,4,0, + 131,3,1,0,113,52,89,0,110,12,124,6,124,0,124,1, + 124,2,131,3,125,7,87,0,100,1,4,0,4,0,131,3, + 1,0,110,16,49,0,115,162,119,1,1,0,1,0,1,0, + 89,0,1,0,124,7,100,1,117,1,114,52,124,4,144,1, + 115,16,124,0,116,0,106,6,118,0,144,1,114,16,116,0, + 106,6,124,0,25,0,125,8,122,10,124,8,106,11,125,9, + 87,0,110,26,4,0,116,9,144,1,121,28,1,0,1,0, + 1,0,124,7,6,0,89,0,2,0,1,0,83,0,124,9, + 100,1,117,0,144,1,114,8,124,7,2,0,1,0,83,0, + 124,9,2,0,1,0,83,0,124,7,2,0,1,0,83,0, + 100,1,83,0,119,0,119,0,41,4,122,21,70,105,110,100, + 32,97,32,109,111,100,117,108,101,39,115,32,115,112,101,99, + 46,78,122,53,115,121,115,46,109,101,116,97,95,112,97,116, + 104,32,105,115,32,78,111,110,101,44,32,80,121,116,104,111, + 110,32,105,115,32,108,105,107,101,108,121,32,115,104,117,116, + 116,105,110,103,32,100,111,119,110,122,22,115,121,115,46,109, + 101,116,97,95,112,97,116,104,32,105,115,32,101,109,112,116, + 121,41,12,114,18,0,0,0,218,9,109,101,116,97,95,112, + 97,116,104,114,83,0,0,0,114,95,0,0,0,114,96,0, + 0,0,114,163,0,0,0,114,99,0,0,0,114,189,0,0, + 0,114,177,0,0,0,114,2,0,0,0,114,200,0,0,0, + 114,113,0,0,0,41,10,114,20,0,0,0,114,175,0,0, + 0,114,176,0,0,0,114,201,0,0,0,90,9,105,115,95, + 114,101,108,111,97,100,114,199,0,0,0,114,177,0,0,0, + 114,103,0,0,0,114,104,0,0,0,114,113,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,10, + 95,102,105,110,100,95,115,112,101,99,152,3,0,0,115,60, + 0,0,0,6,2,8,1,8,2,4,3,12,1,10,5,8, + 1,8,1,2,1,10,1,14,1,12,1,8,1,20,1,42, + 2,8,1,18,2,10,1,2,1,10,1,14,1,12,4,10, + 2,8,1,8,2,8,2,4,2,2,243,2,244,255,128,114, + 202,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,5,0,0,0,67,0,0,0,115,110,0, + 0,0,116,0,124,0,116,1,131,2,115,28,116,2,100,1, + 160,3,116,4,124,0,131,1,161,1,131,1,130,1,124,2, + 100,2,107,0,114,44,116,5,100,3,131,1,130,1,124,2, + 100,2,107,4,114,82,116,0,124,1,116,1,131,2,115,70, + 116,2,100,4,131,1,130,1,124,1,115,82,116,6,100,5, + 131,1,130,1,124,0,115,106,124,2,100,2,107,2,114,102, + 116,5,100,6,131,1,130,1,100,7,83,0,100,7,83,0, + 41,8,122,28,86,101,114,105,102,121,32,97,114,103,117,109, + 101,110,116,115,32,97,114,101,32,34,115,97,110,101,34,46, + 122,31,109,111,100,117,108,101,32,110,97,109,101,32,109,117, + 115,116,32,98,101,32,115,116,114,44,32,110,111,116,32,123, + 125,114,25,0,0,0,122,18,108,101,118,101,108,32,109,117, + 115,116,32,98,101,32,62,61,32,48,122,31,95,95,112,97, + 99,107,97,103,101,95,95,32,110,111,116,32,115,101,116,32, + 116,111,32,97,32,115,116,114,105,110,103,122,54,97,116,116, + 101,109,112,116,101,100,32,114,101,108,97,116,105,118,101,32, + 105,109,112,111,114,116,32,119,105,116,104,32,110,111,32,107, + 110,111,119,110,32,112,97,114,101,110,116,32,112,97,99,107, + 97,103,101,122,17,69,109,112,116,121,32,109,111,100,117,108, + 101,32,110,97,109,101,78,41,7,218,10,105,115,105,110,115, + 116,97,110,99,101,218,3,115,116,114,218,9,84,121,112,101, + 69,114,114,111,114,114,49,0,0,0,114,3,0,0,0,218, + 10,86,97,108,117,101,69,114,114,111,114,114,83,0,0,0, + 169,3,114,20,0,0,0,114,196,0,0,0,114,197,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,13,95,115,97,110,105,116,121,95,99,104,101,99,107,199, + 3,0,0,115,26,0,0,0,10,2,18,1,8,1,8,1, + 8,1,10,1,8,1,4,1,8,1,12,2,8,1,8,255, + 255,128,114,208,0,0,0,122,16,78,111,32,109,111,100,117, + 108,101,32,110,97,109,101,100,32,122,4,123,33,114,125,99, + 2,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, + 8,0,0,0,67,0,0,0,115,22,1,0,0,100,0,125, + 2,124,0,160,0,100,1,161,1,100,2,25,0,125,3,124, + 3,114,128,124,3,116,1,106,2,118,1,114,42,116,3,124, + 1,124,3,131,2,1,0,124,0,116,1,106,2,118,0,114, + 62,116,1,106,2,124,0,25,0,83,0,116,1,106,2,124, + 3,25,0,125,4,122,10,124,4,106,4,125,2,87,0,110, + 44,4,0,116,5,144,1,121,20,1,0,1,0,1,0,116, + 6,100,3,23,0,160,7,124,0,124,3,161,2,125,5,116, + 8,124,5,124,0,100,4,141,2,100,0,130,2,116,9,124, + 0,124,2,131,2,125,6,124,6,100,0,117,0,114,164,116, + 8,116,6,160,7,124,0,161,1,124,0,100,4,141,2,130, + 1,116,10,124,6,131,1,125,7,124,3,144,1,114,14,116, + 1,106,2,124,3,25,0,125,4,124,0,160,0,100,1,161, + 1,100,5,25,0,125,8,122,18,116,11,124,4,124,8,124, + 7,131,3,1,0,87,0,124,7,83,0,4,0,116,5,144, + 1,121,18,1,0,1,0,1,0,100,6,124,3,155,2,100, + 7,124,8,155,2,157,4,125,5,116,12,160,13,124,5,116, + 14,161,2,1,0,89,0,124,7,83,0,124,7,83,0,119, + 0,119,0,41,8,78,114,135,0,0,0,114,25,0,0,0, + 122,23,59,32,123,33,114,125,32,105,115,32,110,111,116,32, + 97,32,112,97,99,107,97,103,101,114,19,0,0,0,233,2, + 0,0,0,122,27,67,97,110,110,111,116,32,115,101,116,32, + 97,110,32,97,116,116,114,105,98,117,116,101,32,111,110,32, + 122,18,32,102,111,114,32,99,104,105,108,100,32,109,111,100, + 117,108,101,32,41,15,114,136,0,0,0,114,18,0,0,0, + 114,99,0,0,0,114,71,0,0,0,114,148,0,0,0,114, + 2,0,0,0,218,8,95,69,82,82,95,77,83,71,114,49, + 0,0,0,218,19,77,111,100,117,108,101,78,111,116,70,111, + 117,110,100,69,114,114,111,114,114,202,0,0,0,114,167,0, + 0,0,114,12,0,0,0,114,95,0,0,0,114,96,0,0, + 0,114,163,0,0,0,41,9,114,20,0,0,0,218,7,105, + 109,112,111,114,116,95,114,175,0,0,0,114,137,0,0,0, + 90,13,112,97,114,101,110,116,95,109,111,100,117,108,101,114, + 102,0,0,0,114,103,0,0,0,114,104,0,0,0,90,5, + 99,104,105,108,100,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,23,95,102,105,110,100,95,97,110,100,95, + 108,111,97,100,95,117,110,108,111,99,107,101,100,218,3,0, + 0,115,60,0,0,0,4,1,14,1,4,1,10,1,10,1, + 10,2,10,1,10,1,2,1,10,1,14,1,16,1,14,1, + 10,1,8,1,18,1,8,2,6,1,10,2,14,1,2,1, + 14,1,4,4,14,253,16,1,14,1,8,1,2,253,2,242, + 255,128,114,213,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,8,0,0,0,67,0,0,0, + 115,128,0,0,0,116,0,124,0,131,1,143,62,1,0,116, + 1,106,2,160,3,124,0,116,4,161,2,125,2,124,2,116, + 4,117,0,114,56,116,5,124,0,124,1,131,2,87,0,2, + 0,100,1,4,0,4,0,131,3,1,0,83,0,87,0,100, + 1,4,0,4,0,131,3,1,0,110,16,49,0,115,76,119, + 1,1,0,1,0,1,0,89,0,1,0,124,2,100,1,117, + 0,114,116,100,2,160,6,124,0,161,1,125,3,116,7,124, + 3,124,0,100,3,141,2,130,1,116,8,124,0,131,1,1, + 0,124,2,83,0,41,4,122,25,70,105,110,100,32,97,110, + 100,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108, + 101,46,78,122,40,105,109,112,111,114,116,32,111,102,32,123, + 125,32,104,97,108,116,101,100,59,32,78,111,110,101,32,105, + 110,32,115,121,115,46,109,111,100,117,108,101,115,114,19,0, + 0,0,41,9,114,54,0,0,0,114,18,0,0,0,114,99, + 0,0,0,114,38,0,0,0,218,14,95,78,69,69,68,83, + 95,76,79,65,68,73,78,71,114,213,0,0,0,114,49,0, + 0,0,114,211,0,0,0,114,69,0,0,0,41,4,114,20, + 0,0,0,114,212,0,0,0,114,104,0,0,0,114,79,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,156,0,0,0,77,3,0,0,115,4,0,0,0,4, - 0,255,128,122,28,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,46,99,114,101,97,116,101,95,109,111,100,117,108, - 101,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,124, - 0,106,0,106,1,125,1,116,2,160,3,124,1,161,1,115, - 36,116,4,100,1,160,5,124,1,161,1,124,1,100,2,141, - 2,130,1,116,6,116,2,106,7,124,1,131,2,125,2,116, - 8,124,2,124,0,106,9,131,2,1,0,100,0,83,0,114, - 91,0,0,0,41,10,114,113,0,0,0,114,20,0,0,0, - 114,61,0,0,0,114,92,0,0,0,114,83,0,0,0,114, - 49,0,0,0,114,71,0,0,0,218,17,103,101,116,95,102, - 114,111,122,101,110,95,111,98,106,101,99,116,218,4,101,120, - 101,99,114,14,0,0,0,41,3,114,104,0,0,0,114,20, - 0,0,0,218,4,99,111,100,101,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,114,157,0,0,0,81,3,0, - 0,115,16,0,0,0,8,2,10,1,10,1,2,1,6,255, - 12,2,16,1,255,128,122,26,70,114,111,122,101,110,73,109, - 112,111,114,116,101,114,46,101,120,101,99,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0, - 116,0,124,0,124,1,131,2,83,0,41,2,122,95,76,111, - 97,100,32,97,32,102,114,111,122,101,110,32,109,111,100,117, - 108,101,46,10,10,32,32,32,32,32,32,32,32,84,104,105, - 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,32,32,85,115,101,32,101,120,101, - 99,95,109,111,100,117,108,101,40,41,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,1, - 114,105,0,0,0,114,179,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,164,0,0,0,90,3, - 0,0,115,4,0,0,0,10,8,255,128,122,26,70,114,111, - 122,101,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,0, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,10,0,0,0,116,0,160,1,124,1,161,1,83,0,41, - 2,122,45,82,101,116,117,114,110,32,116,104,101,32,99,111, - 100,101,32,111,98,106,101,99,116,32,102,111,114,32,116,104, - 101,32,102,114,111,122,101,110,32,109,111,100,117,108,101,46, - 78,41,2,114,61,0,0,0,114,186,0,0,0,114,179,0, + 0,218,14,95,102,105,110,100,95,97,110,100,95,108,111,97, + 100,253,3,0,0,115,24,0,0,0,10,2,14,1,8,1, + 54,1,8,2,4,1,2,1,4,255,12,2,8,2,4,1, + 255,128,114,215,0,0,0,114,25,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, + 0,67,0,0,0,115,42,0,0,0,116,0,124,0,124,1, + 124,2,131,3,1,0,124,2,100,1,107,4,114,32,116,1, + 124,0,124,1,124,2,131,3,125,0,116,2,124,0,116,3, + 131,2,83,0,41,3,97,50,1,0,0,73,109,112,111,114, + 116,32,97,110,100,32,114,101,116,117,114,110,32,116,104,101, + 32,109,111,100,117,108,101,32,98,97,115,101,100,32,111,110, + 32,105,116,115,32,110,97,109,101,44,32,116,104,101,32,112, + 97,99,107,97,103,101,32,116,104,101,32,99,97,108,108,32, + 105,115,10,32,32,32,32,98,101,105,110,103,32,109,97,100, + 101,32,102,114,111,109,44,32,97,110,100,32,116,104,101,32, + 108,101,118,101,108,32,97,100,106,117,115,116,109,101,110,116, + 46,10,10,32,32,32,32,84,104,105,115,32,102,117,110,99, + 116,105,111,110,32,114,101,112,114,101,115,101,110,116,115,32, + 116,104,101,32,103,114,101,97,116,101,115,116,32,99,111,109, + 109,111,110,32,100,101,110,111,109,105,110,97,116,111,114,32, + 111,102,32,102,117,110,99,116,105,111,110,97,108,105,116,121, + 10,32,32,32,32,98,101,116,119,101,101,110,32,105,109,112, + 111,114,116,95,109,111,100,117,108,101,32,97,110,100,32,95, + 95,105,109,112,111,114,116,95,95,46,32,84,104,105,115,32, + 105,110,99,108,117,100,101,115,32,115,101,116,116,105,110,103, + 32,95,95,112,97,99,107,97,103,101,95,95,32,105,102,10, + 32,32,32,32,116,104,101,32,108,111,97,100,101,114,32,100, + 105,100,32,110,111,116,46,10,10,32,32,32,32,114,25,0, + 0,0,78,41,4,114,208,0,0,0,114,198,0,0,0,114, + 215,0,0,0,218,11,95,103,99,100,95,105,109,112,111,114, + 116,114,207,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,216,0,0,0,13,4,0,0,115,10, + 0,0,0,12,9,8,1,12,1,10,1,255,128,114,216,0, + 0,0,169,1,218,9,114,101,99,117,114,115,105,118,101,99, + 3,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0, + 11,0,0,0,67,0,0,0,115,216,0,0,0,124,1,68, + 0,93,204,125,4,116,0,124,4,116,1,131,2,115,64,124, + 3,114,34,124,0,106,2,100,1,23,0,125,5,110,4,100, + 2,125,5,116,3,100,3,124,5,155,0,100,4,116,4,124, + 4,131,1,106,2,155,0,157,4,131,1,130,1,124,4,100, + 5,107,2,114,106,124,3,115,4,116,5,124,0,100,6,131, + 2,114,4,116,6,124,0,124,0,106,7,124,2,100,7,100, + 8,141,4,1,0,113,4,116,5,124,0,124,4,131,2,115, + 4,100,9,160,8,124,0,106,2,124,4,161,2,125,6,122, + 14,116,9,124,2,124,6,131,2,1,0,87,0,113,4,4, + 0,116,10,121,214,1,0,125,7,1,0,122,42,124,7,106, + 11,124,6,107,2,114,200,116,12,106,13,160,14,124,6,116, + 15,161,2,100,10,117,1,114,200,87,0,89,0,100,10,125, + 7,126,7,113,4,130,0,100,10,125,7,126,7,119,1,124, + 0,83,0,119,0,41,11,122,238,70,105,103,117,114,101,32, + 111,117,116,32,119,104,97,116,32,95,95,105,109,112,111,114, + 116,95,95,32,115,104,111,117,108,100,32,114,101,116,117,114, + 110,46,10,10,32,32,32,32,84,104,101,32,105,109,112,111, + 114,116,95,32,112,97,114,97,109,101,116,101,114,32,105,115, + 32,97,32,99,97,108,108,97,98,108,101,32,119,104,105,99, + 104,32,116,97,107,101,115,32,116,104,101,32,110,97,109,101, + 32,111,102,32,109,111,100,117,108,101,32,116,111,10,32,32, + 32,32,105,109,112,111,114,116,46,32,73,116,32,105,115,32, + 114,101,113,117,105,114,101,100,32,116,111,32,100,101,99,111, + 117,112,108,101,32,116,104,101,32,102,117,110,99,116,105,111, + 110,32,102,114,111,109,32,97,115,115,117,109,105,110,103,32, + 105,109,112,111,114,116,108,105,98,39,115,10,32,32,32,32, + 105,109,112,111,114,116,32,105,109,112,108,101,109,101,110,116, + 97,116,105,111,110,32,105,115,32,100,101,115,105,114,101,100, + 46,10,10,32,32,32,32,122,8,46,95,95,97,108,108,95, + 95,122,13,96,96,102,114,111,109,32,108,105,115,116,39,39, + 122,8,73,116,101,109,32,105,110,32,122,18,32,109,117,115, + 116,32,98,101,32,115,116,114,44,32,110,111,116,32,250,1, + 42,218,7,95,95,97,108,108,95,95,84,114,217,0,0,0, + 114,193,0,0,0,78,41,16,114,203,0,0,0,114,204,0, + 0,0,114,9,0,0,0,114,205,0,0,0,114,3,0,0, + 0,114,11,0,0,0,218,16,95,104,97,110,100,108,101,95, + 102,114,111,109,108,105,115,116,114,220,0,0,0,114,49,0, + 0,0,114,71,0,0,0,114,211,0,0,0,114,20,0,0, + 0,114,18,0,0,0,114,99,0,0,0,114,38,0,0,0, + 114,214,0,0,0,41,8,114,104,0,0,0,218,8,102,114, + 111,109,108,105,115,116,114,212,0,0,0,114,218,0,0,0, + 218,1,120,90,5,119,104,101,114,101,90,9,102,114,111,109, + 95,110,97,109,101,90,3,101,120,99,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,221,0,0,0,28,4, + 0,0,115,54,0,0,0,8,10,10,1,4,1,12,1,4, + 2,10,1,8,1,8,255,8,2,14,1,10,1,2,1,8, + 255,10,2,14,1,2,1,14,1,14,1,10,4,16,1,2, + 255,12,2,2,1,8,128,4,1,2,248,255,128,114,221,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,6,0,0,0,67,0,0,0,115,146,0,0,0, + 124,0,160,0,100,1,161,1,125,1,124,0,160,0,100,2, + 161,1,125,2,124,1,100,3,117,1,114,82,124,2,100,3, + 117,1,114,78,124,1,124,2,106,1,107,3,114,78,116,2, + 106,3,100,4,124,1,155,2,100,5,124,2,106,1,155,2, + 100,6,157,5,116,4,100,7,100,8,141,3,1,0,124,1, + 83,0,124,2,100,3,117,1,114,96,124,2,106,1,83,0, + 116,2,106,3,100,9,116,4,100,7,100,8,141,3,1,0, + 124,0,100,10,25,0,125,1,100,11,124,0,118,1,114,142, + 124,1,160,5,100,12,161,1,100,13,25,0,125,1,124,1, + 83,0,41,14,122,167,67,97,108,99,117,108,97,116,101,32, + 119,104,97,116,32,95,95,112,97,99,107,97,103,101,95,95, + 32,115,104,111,117,108,100,32,98,101,46,10,10,32,32,32, + 32,95,95,112,97,99,107,97,103,101,95,95,32,105,115,32, + 110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116, + 111,32,98,101,32,100,101,102,105,110,101,100,32,111,114,32, + 99,111,117,108,100,32,98,101,32,115,101,116,32,116,111,32, + 78,111,110,101,10,32,32,32,32,116,111,32,114,101,112,114, + 101,115,101,110,116,32,116,104,97,116,32,105,116,115,32,112, + 114,111,112,101,114,32,118,97,108,117,101,32,105,115,32,117, + 110,107,110,111,119,110,46,10,10,32,32,32,32,114,152,0, + 0,0,114,113,0,0,0,78,122,32,95,95,112,97,99,107, + 97,103,101,95,95,32,33,61,32,95,95,115,112,101,99,95, + 95,46,112,97,114,101,110,116,32,40,122,4,32,33,61,32, + 250,1,41,233,3,0,0,0,41,1,90,10,115,116,97,99, + 107,108,101,118,101,108,122,89,99,97,110,39,116,32,114,101, + 115,111,108,118,101,32,112,97,99,107,97,103,101,32,102,114, + 111,109,32,95,95,115,112,101,99,95,95,32,111,114,32,95, + 95,112,97,99,107,97,103,101,95,95,44,32,102,97,108,108, + 105,110,103,32,98,97,99,107,32,111,110,32,95,95,110,97, + 109,101,95,95,32,97,110,100,32,95,95,112,97,116,104,95, + 95,114,9,0,0,0,114,148,0,0,0,114,135,0,0,0, + 114,25,0,0,0,41,6,114,38,0,0,0,114,137,0,0, + 0,114,95,0,0,0,114,96,0,0,0,114,163,0,0,0, + 114,136,0,0,0,41,3,218,7,103,108,111,98,97,108,115, + 114,196,0,0,0,114,103,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,17,95,99,97,108,99, + 95,95,95,112,97,99,107,97,103,101,95,95,65,4,0,0, + 115,44,0,0,0,10,7,10,1,8,1,18,1,6,1,2, + 1,4,255,4,1,6,255,4,2,6,254,4,3,8,1,6, + 1,6,2,4,2,6,254,8,3,8,1,14,1,4,1,255, + 128,114,227,0,0,0,114,5,0,0,0,99,5,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, + 67,0,0,0,115,174,0,0,0,124,4,100,1,107,2,114, + 18,116,0,124,0,131,1,125,5,110,36,124,1,100,2,117, + 1,114,30,124,1,110,2,105,0,125,6,116,1,124,6,131, + 1,125,7,116,0,124,0,124,7,124,4,131,3,125,5,124, + 3,115,148,124,4,100,1,107,2,114,84,116,0,124,0,160, + 2,100,3,161,1,100,1,25,0,131,1,83,0,124,0,115, + 92,124,5,83,0,116,3,124,0,131,1,116,3,124,0,160, + 2,100,3,161,1,100,1,25,0,131,1,24,0,125,8,116, + 4,106,5,124,5,106,6,100,2,116,3,124,5,106,6,131, + 1,124,8,24,0,133,2,25,0,25,0,83,0,116,7,124, + 5,100,4,131,2,114,170,116,8,124,5,124,3,116,0,131, + 3,83,0,124,5,83,0,41,5,97,215,1,0,0,73,109, + 112,111,114,116,32,97,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,84,104,101,32,39,103,108,111,98,97,108,115, + 39,32,97,114,103,117,109,101,110,116,32,105,115,32,117,115, + 101,100,32,116,111,32,105,110,102,101,114,32,119,104,101,114, + 101,32,116,104,101,32,105,109,112,111,114,116,32,105,115,32, + 111,99,99,117,114,114,105,110,103,32,102,114,111,109,10,32, + 32,32,32,116,111,32,104,97,110,100,108,101,32,114,101,108, + 97,116,105,118,101,32,105,109,112,111,114,116,115,46,32,84, + 104,101,32,39,108,111,99,97,108,115,39,32,97,114,103,117, + 109,101,110,116,32,105,115,32,105,103,110,111,114,101,100,46, + 32,84,104,101,10,32,32,32,32,39,102,114,111,109,108,105, + 115,116,39,32,97,114,103,117,109,101,110,116,32,115,112,101, + 99,105,102,105,101,115,32,119,104,97,116,32,115,104,111,117, + 108,100,32,101,120,105,115,116,32,97,115,32,97,116,116,114, + 105,98,117,116,101,115,32,111,110,32,116,104,101,32,109,111, + 100,117,108,101,10,32,32,32,32,98,101,105,110,103,32,105, + 109,112,111,114,116,101,100,32,40,101,46,103,46,32,96,96, + 102,114,111,109,32,109,111,100,117,108,101,32,105,109,112,111, + 114,116,32,60,102,114,111,109,108,105,115,116,62,96,96,41, + 46,32,32,84,104,101,32,39,108,101,118,101,108,39,10,32, + 32,32,32,97,114,103,117,109,101,110,116,32,114,101,112,114, + 101,115,101,110,116,115,32,116,104,101,32,112,97,99,107,97, + 103,101,32,108,111,99,97,116,105,111,110,32,116,111,32,105, + 109,112,111,114,116,32,102,114,111,109,32,105,110,32,97,32, + 114,101,108,97,116,105,118,101,10,32,32,32,32,105,109,112, + 111,114,116,32,40,101,46,103,46,32,96,96,102,114,111,109, + 32,46,46,112,107,103,32,105,109,112,111,114,116,32,109,111, + 100,96,96,32,119,111,117,108,100,32,104,97,118,101,32,97, + 32,39,108,101,118,101,108,39,32,111,102,32,50,41,46,10, + 10,32,32,32,32,114,25,0,0,0,78,114,135,0,0,0, + 114,148,0,0,0,41,9,114,216,0,0,0,114,227,0,0, + 0,218,9,112,97,114,116,105,116,105,111,110,114,195,0,0, + 0,114,18,0,0,0,114,99,0,0,0,114,9,0,0,0, + 114,11,0,0,0,114,221,0,0,0,41,9,114,20,0,0, + 0,114,226,0,0,0,218,6,108,111,99,97,108,115,114,222, + 0,0,0,114,197,0,0,0,114,104,0,0,0,90,8,103, + 108,111,98,97,108,115,95,114,196,0,0,0,90,7,99,117, + 116,95,111,102,102,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,10,95,95,105,109,112,111,114,116,95,95, + 92,4,0,0,115,32,0,0,0,8,11,10,1,16,2,8, + 1,12,1,4,1,8,3,18,1,4,1,4,1,26,4,30, + 3,10,1,12,1,4,2,255,128,114,230,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,67,0,0,0,115,38,0,0,0,116,0,160,1, + 124,0,161,1,125,1,124,1,100,0,117,0,114,30,116,2, + 100,1,124,0,23,0,131,1,130,1,116,3,124,1,131,1, + 83,0,41,2,78,122,25,110,111,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,32,110,97,109,101,100,32, + 41,4,114,169,0,0,0,114,177,0,0,0,114,83,0,0, + 0,114,167,0,0,0,41,2,114,20,0,0,0,114,103,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,180,0,0,0,100,3,0,0,115,4,0,0,0,10, - 4,255,128,122,23,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,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, - 122,54,82,101,116,117,114,110,32,78,111,110,101,32,97,115, - 32,102,114,111,122,101,110,32,109,111,100,117,108,101,115,32, - 100,111,32,110,111,116,32,104,97,118,101,32,115,111,117,114, - 99,101,32,99,111,100,101,46,78,114,5,0,0,0,114,179, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,181,0,0,0,106,3,0,0,115,4,0,0,0, - 4,4,255,128,122,25,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,0,0,0,0,2,0,0,0, - 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,160, - 1,124,1,161,1,83,0,41,2,122,46,82,101,116,117,114, - 110,32,84,114,117,101,32,105,102,32,116,104,101,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,32,105,115,32,97, - 32,112,97,99,107,97,103,101,46,78,41,2,114,61,0,0, - 0,90,17,105,115,95,102,114,111,122,101,110,95,112,97,99, - 107,97,103,101,114,179,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,114,122,0,0,0,112,3,0, - 0,115,4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17,114,9, - 0,0,0,114,8,0,0,0,114,1,0,0,0,114,10,0, - 0,0,114,145,0,0,0,114,182,0,0,0,114,107,0,0, - 0,114,183,0,0,0,114,177,0,0,0,114,178,0,0,0, - 114,156,0,0,0,114,157,0,0,0,114,164,0,0,0,114, - 94,0,0,0,114,180,0,0,0,114,181,0,0,0,114,122, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,184,0,0,0,41,3,0,0, - 115,50,0,0,0,8,0,4,2,4,7,2,2,10,1,2, - 8,12,1,2,6,12,1,2,8,10,1,2,3,10,1,2, - 8,10,1,2,9,2,1,12,1,2,4,2,1,12,1,2, - 4,2,1,16,1,255,128,114,184,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,64,0,0,0,115,32,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, - 100,5,132,0,90,5,100,6,83,0,41,7,218,18,95,73, - 109,112,111,114,116,76,111,99,107,67,111,110,116,101,120,116, - 122,36,67,111,110,116,101,120,116,32,109,97,110,97,103,101, - 114,32,102,111,114,32,116,104,101,32,105,109,112,111,114,116, - 32,108,111,99,107,46,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, - 12,0,0,0,116,0,160,1,161,0,1,0,100,1,83,0, - 41,2,122,24,65,99,113,117,105,114,101,32,116,104,101,32, - 105,109,112,111,114,116,32,108,111,99,107,46,78,41,2,114, - 61,0,0,0,114,62,0,0,0,114,51,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,58,0, - 0,0,125,3,0,0,115,4,0,0,0,12,2,255,128,122, - 28,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,0,0,0,0,4,0,0,0,2,0, - 0,0,67,0,0,0,115,12,0,0,0,116,0,160,1,161, - 0,1,0,100,1,83,0,41,2,122,60,82,101,108,101,97, - 115,101,32,116,104,101,32,105,109,112,111,114,116,32,108,111, - 99,107,32,114,101,103,97,114,100,108,101,115,115,32,111,102, - 32,97,110,121,32,114,97,105,115,101,100,32,101,120,99,101, - 112,116,105,111,110,115,46,78,41,2,114,61,0,0,0,114, - 64,0,0,0,41,4,114,33,0,0,0,218,8,101,120,99, - 95,116,121,112,101,218,9,101,120,99,95,118,97,108,117,101, - 218,13,101,120,99,95,116,114,97,99,101,98,97,99,107,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,60, - 0,0,0,129,3,0,0,115,4,0,0,0,12,2,255,128, - 122,27,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,41,6, - 114,9,0,0,0,114,8,0,0,0,114,1,0,0,0,114, - 10,0,0,0,114,58,0,0,0,114,60,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,189,0,0,0,121,3,0,0,115,10,0,0,0, - 8,0,4,2,8,2,12,4,255,128,114,189,0,0,0,99, - 3,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 5,0,0,0,67,0,0,0,115,64,0,0,0,124,1,160, - 0,100,1,124,2,100,2,24,0,161,2,125,3,116,1,124, - 3,131,1,124,2,107,0,114,36,116,2,100,3,131,1,130, - 1,124,3,100,4,25,0,125,4,124,0,114,60,100,5,160, - 3,124,4,124,0,161,2,83,0,124,4,83,0,41,7,122, - 50,82,101,115,111,108,118,101,32,97,32,114,101,108,97,116, - 105,118,101,32,109,111,100,117,108,101,32,110,97,109,101,32, - 116,111,32,97,110,32,97,98,115,111,108,117,116,101,32,111, - 110,101,46,114,135,0,0,0,114,42,0,0,0,122,50,97, - 116,116,101,109,112,116,101,100,32,114,101,108,97,116,105,118, - 101,32,105,109,112,111,114,116,32,98,101,121,111,110,100,32, - 116,111,112,45,108,101,118,101,108,32,112,97,99,107,97,103, - 101,114,25,0,0,0,250,5,123,125,46,123,125,78,41,4, - 218,6,114,115,112,108,105,116,218,3,108,101,110,114,83,0, - 0,0,114,49,0,0,0,41,5,114,20,0,0,0,218,7, - 112,97,99,107,97,103,101,218,5,108,101,118,101,108,90,4, - 98,105,116,115,90,4,98,97,115,101,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,13,95,114,101,115,111, - 108,118,101,95,110,97,109,101,134,3,0,0,115,12,0,0, - 0,16,2,12,1,8,1,8,1,20,1,255,128,114,198,0, - 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,4,0,0,0,67,0,0,0,115,34,0,0,0, - 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,0, - 117,0,114,24,100,0,83,0,116,1,124,1,124,3,131,2, - 83,0,114,0,0,0,0,41,2,114,178,0,0,0,114,98, - 0,0,0,41,4,218,6,102,105,110,100,101,114,114,20,0, - 0,0,114,175,0,0,0,114,116,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,17,95,102,105, - 110,100,95,115,112,101,99,95,108,101,103,97,99,121,143,3, - 0,0,115,10,0,0,0,12,3,8,1,4,1,10,1,255, - 128,114,200,0,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,10,0,0,0,10,0,0,0,67,0,0,0,115, - 28,1,0,0,116,0,106,1,125,3,124,3,100,1,117,0, - 114,22,116,2,100,2,131,1,130,1,124,3,115,38,116,3, - 160,4,100,3,116,5,161,2,1,0,124,0,116,0,106,6, - 118,0,125,4,124,3,68,0,93,226,125,5,116,7,131,0, - 143,94,1,0,122,10,124,5,106,8,125,6,87,0,110,54, - 4,0,116,9,121,128,1,0,1,0,1,0,116,10,124,5, - 124,0,124,1,131,3,125,7,124,7,100,1,117,0,114,124, - 89,0,87,0,100,1,4,0,4,0,131,3,1,0,113,52, - 89,0,110,14,119,0,124,6,124,0,124,1,124,2,131,3, - 125,7,87,0,100,1,4,0,4,0,131,3,1,0,110,16, - 49,0,115,162,119,1,1,0,1,0,1,0,89,0,1,0, - 124,7,100,1,117,1,114,52,124,4,144,1,115,16,124,0, - 116,0,106,6,118,0,144,1,114,16,116,0,106,6,124,0, - 25,0,125,8,122,10,124,8,106,11,125,9,87,0,110,26, - 4,0,116,9,121,244,1,0,1,0,1,0,124,7,6,0, - 89,0,2,0,1,0,83,0,119,0,124,9,100,1,117,0, - 144,1,114,8,124,7,2,0,1,0,83,0,124,9,2,0, - 1,0,83,0,124,7,2,0,1,0,83,0,100,1,83,0, - 41,4,122,21,70,105,110,100,32,97,32,109,111,100,117,108, - 101,39,115,32,115,112,101,99,46,78,122,53,115,121,115,46, - 109,101,116,97,95,112,97,116,104,32,105,115,32,78,111,110, - 101,44,32,80,121,116,104,111,110,32,105,115,32,108,105,107, - 101,108,121,32,115,104,117,116,116,105,110,103,32,100,111,119, - 110,122,22,115,121,115,46,109,101,116,97,95,112,97,116,104, - 32,105,115,32,101,109,112,116,121,41,12,114,18,0,0,0, - 218,9,109,101,116,97,95,112,97,116,104,114,83,0,0,0, - 114,95,0,0,0,114,96,0,0,0,114,163,0,0,0,114, - 99,0,0,0,114,189,0,0,0,114,177,0,0,0,114,2, - 0,0,0,114,200,0,0,0,114,113,0,0,0,41,10,114, - 20,0,0,0,114,175,0,0,0,114,176,0,0,0,114,201, - 0,0,0,90,9,105,115,95,114,101,108,111,97,100,114,199, - 0,0,0,114,177,0,0,0,114,103,0,0,0,114,104,0, - 0,0,114,113,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,10,95,102,105,110,100,95,115,112, - 101,99,152,3,0,0,115,56,0,0,0,6,2,8,1,8, - 2,4,3,12,1,10,5,8,1,8,1,2,1,10,1,12, - 1,12,1,8,1,22,1,42,2,8,1,18,2,10,1,2, - 1,10,1,12,1,14,4,10,2,8,1,8,2,8,2,4, - 2,255,128,114,202,0,0,0,99,3,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0, - 0,115,110,0,0,0,116,0,124,0,116,1,131,2,115,28, - 116,2,100,1,160,3,116,4,124,0,131,1,161,1,131,1, - 130,1,124,2,100,2,107,0,114,44,116,5,100,3,131,1, - 130,1,124,2,100,2,107,4,114,82,116,0,124,1,116,1, - 131,2,115,70,116,2,100,4,131,1,130,1,124,1,115,82, - 116,6,100,5,131,1,130,1,124,0,115,106,124,2,100,2, - 107,2,114,102,116,5,100,6,131,1,130,1,100,7,83,0, - 100,7,83,0,41,8,122,28,86,101,114,105,102,121,32,97, - 114,103,117,109,101,110,116,115,32,97,114,101,32,34,115,97, - 110,101,34,46,122,31,109,111,100,117,108,101,32,110,97,109, - 101,32,109,117,115,116,32,98,101,32,115,116,114,44,32,110, - 111,116,32,123,125,114,25,0,0,0,122,18,108,101,118,101, - 108,32,109,117,115,116,32,98,101,32,62,61,32,48,122,31, - 95,95,112,97,99,107,97,103,101,95,95,32,110,111,116,32, - 115,101,116,32,116,111,32,97,32,115,116,114,105,110,103,122, - 54,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, - 105,118,101,32,105,109,112,111,114,116,32,119,105,116,104,32, - 110,111,32,107,110,111,119,110,32,112,97,114,101,110,116,32, - 112,97,99,107,97,103,101,122,17,69,109,112,116,121,32,109, - 111,100,117,108,101,32,110,97,109,101,78,41,7,218,10,105, - 115,105,110,115,116,97,110,99,101,218,3,115,116,114,218,9, - 84,121,112,101,69,114,114,111,114,114,49,0,0,0,114,3, - 0,0,0,218,10,86,97,108,117,101,69,114,114,111,114,114, - 83,0,0,0,169,3,114,20,0,0,0,114,196,0,0,0, - 114,197,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,13,95,115,97,110,105,116,121,95,99,104, - 101,99,107,199,3,0,0,115,26,0,0,0,10,2,18,1, - 8,1,8,1,8,1,10,1,8,1,4,1,8,1,12,2, - 8,1,8,255,255,128,114,208,0,0,0,122,16,78,111,32, - 109,111,100,117,108,101,32,110,97,109,101,100,32,122,4,123, - 33,114,125,99,2,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,8,0,0,0,67,0,0,0,115,20,1,0, - 0,100,0,125,2,124,0,160,0,100,1,161,1,100,2,25, - 0,125,3,124,3,114,128,124,3,116,1,106,2,118,1,114, - 42,116,3,124,1,124,3,131,2,1,0,124,0,116,1,106, - 2,118,0,114,62,116,1,106,2,124,0,25,0,83,0,116, - 1,106,2,124,3,25,0,125,4,122,10,124,4,106,4,125, - 2,87,0,110,44,4,0,116,5,121,126,1,0,1,0,1, - 0,116,6,100,3,23,0,160,7,124,0,124,3,161,2,125, - 5,116,8,124,5,124,0,100,4,141,2,100,0,130,2,119, - 0,116,9,124,0,124,2,131,2,125,6,124,6,100,0,117, - 0,114,164,116,8,116,6,160,7,124,0,161,1,124,0,100, - 4,141,2,130,1,116,10,124,6,131,1,125,7,124,3,144, - 1,114,16,116,1,106,2,124,3,25,0,125,4,124,0,160, - 0,100,1,161,1,100,5,25,0,125,8,122,18,116,11,124, - 4,124,8,124,7,131,3,1,0,87,0,124,7,83,0,4, - 0,116,5,144,1,121,14,1,0,1,0,1,0,100,6,124, - 3,155,2,100,7,124,8,155,2,157,4,125,5,116,12,160, - 13,124,5,116,14,161,2,1,0,89,0,124,7,83,0,119, - 0,124,7,83,0,41,8,78,114,135,0,0,0,114,25,0, - 0,0,122,23,59,32,123,33,114,125,32,105,115,32,110,111, - 116,32,97,32,112,97,99,107,97,103,101,114,19,0,0,0, - 233,2,0,0,0,122,27,67,97,110,110,111,116,32,115,101, - 116,32,97,110,32,97,116,116,114,105,98,117,116,101,32,111, - 110,32,122,18,32,102,111,114,32,99,104,105,108,100,32,109, - 111,100,117,108,101,32,41,15,114,136,0,0,0,114,18,0, - 0,0,114,99,0,0,0,114,71,0,0,0,114,148,0,0, - 0,114,2,0,0,0,218,8,95,69,82,82,95,77,83,71, - 114,49,0,0,0,218,19,77,111,100,117,108,101,78,111,116, - 70,111,117,110,100,69,114,114,111,114,114,202,0,0,0,114, - 167,0,0,0,114,12,0,0,0,114,95,0,0,0,114,96, - 0,0,0,114,163,0,0,0,41,9,114,20,0,0,0,218, - 7,105,109,112,111,114,116,95,114,175,0,0,0,114,137,0, - 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, - 101,114,102,0,0,0,114,103,0,0,0,114,104,0,0,0, - 90,5,99,104,105,108,100,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,23,95,102,105,110,100,95,97,110, - 100,95,108,111,97,100,95,117,110,108,111,99,107,101,100,218, - 3,0,0,115,60,0,0,0,4,1,14,1,4,1,10,1, - 10,1,10,2,10,1,10,1,2,1,10,1,12,1,16,1, - 16,1,10,1,8,1,18,1,8,2,6,1,10,2,14,1, - 2,1,14,1,4,4,14,253,16,1,14,1,4,1,2,255, - 4,1,255,128,114,213,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,8,0,0,0,67,0, - 0,0,115,128,0,0,0,116,0,124,0,131,1,143,62,1, - 0,116,1,106,2,160,3,124,0,116,4,161,2,125,2,124, - 2,116,4,117,0,114,56,116,5,124,0,124,1,131,2,87, - 0,2,0,100,1,4,0,4,0,131,3,1,0,83,0,87, - 0,100,1,4,0,4,0,131,3,1,0,110,16,49,0,115, - 76,119,1,1,0,1,0,1,0,89,0,1,0,124,2,100, - 1,117,0,114,116,100,2,160,6,124,0,161,1,125,3,116, - 7,124,3,124,0,100,3,141,2,130,1,116,8,124,0,131, - 1,1,0,124,2,83,0,41,4,122,25,70,105,110,100,32, - 97,110,100,32,108,111,97,100,32,116,104,101,32,109,111,100, - 117,108,101,46,78,122,40,105,109,112,111,114,116,32,111,102, - 32,123,125,32,104,97,108,116,101,100,59,32,78,111,110,101, - 32,105,110,32,115,121,115,46,109,111,100,117,108,101,115,114, - 19,0,0,0,41,9,114,54,0,0,0,114,18,0,0,0, - 114,99,0,0,0,114,38,0,0,0,218,14,95,78,69,69, - 68,83,95,76,79,65,68,73,78,71,114,213,0,0,0,114, - 49,0,0,0,114,211,0,0,0,114,69,0,0,0,41,4, - 114,20,0,0,0,114,212,0,0,0,114,104,0,0,0,114, - 79,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,14,95,102,105,110,100,95,97,110,100,95,108, - 111,97,100,253,3,0,0,115,24,0,0,0,10,2,14,1, - 8,1,54,1,8,2,4,1,2,1,4,255,12,2,8,2, - 4,1,255,128,114,215,0,0,0,114,25,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, - 0,0,0,67,0,0,0,115,42,0,0,0,116,0,124,0, - 124,1,124,2,131,3,1,0,124,2,100,1,107,4,114,32, - 116,1,124,0,124,1,124,2,131,3,125,0,116,2,124,0, - 116,3,131,2,83,0,41,3,97,50,1,0,0,73,109,112, - 111,114,116,32,97,110,100,32,114,101,116,117,114,110,32,116, - 104,101,32,109,111,100,117,108,101,32,98,97,115,101,100,32, - 111,110,32,105,116,115,32,110,97,109,101,44,32,116,104,101, - 32,112,97,99,107,97,103,101,32,116,104,101,32,99,97,108, - 108,32,105,115,10,32,32,32,32,98,101,105,110,103,32,109, - 97,100,101,32,102,114,111,109,44,32,97,110,100,32,116,104, - 101,32,108,101,118,101,108,32,97,100,106,117,115,116,109,101, - 110,116,46,10,10,32,32,32,32,84,104,105,115,32,102,117, - 110,99,116,105,111,110,32,114,101,112,114,101,115,101,110,116, - 115,32,116,104,101,32,103,114,101,97,116,101,115,116,32,99, - 111,109,109,111,110,32,100,101,110,111,109,105,110,97,116,111, - 114,32,111,102,32,102,117,110,99,116,105,111,110,97,108,105, - 116,121,10,32,32,32,32,98,101,116,119,101,101,110,32,105, - 109,112,111,114,116,95,109,111,100,117,108,101,32,97,110,100, - 32,95,95,105,109,112,111,114,116,95,95,46,32,84,104,105, - 115,32,105,110,99,108,117,100,101,115,32,115,101,116,116,105, - 110,103,32,95,95,112,97,99,107,97,103,101,95,95,32,105, - 102,10,32,32,32,32,116,104,101,32,108,111,97,100,101,114, - 32,100,105,100,32,110,111,116,46,10,10,32,32,32,32,114, - 25,0,0,0,78,41,4,114,208,0,0,0,114,198,0,0, - 0,114,215,0,0,0,218,11,95,103,99,100,95,105,109,112, - 111,114,116,114,207,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,216,0,0,0,13,4,0,0, - 115,10,0,0,0,12,9,8,1,12,1,10,1,255,128,114, - 216,0,0,0,169,1,218,9,114,101,99,117,114,115,105,118, - 101,99,3,0,0,0,0,0,0,0,1,0,0,0,8,0, - 0,0,11,0,0,0,67,0,0,0,115,216,0,0,0,124, - 1,68,0,93,204,125,4,116,0,124,4,116,1,131,2,115, - 64,124,3,114,34,124,0,106,2,100,1,23,0,125,5,110, - 4,100,2,125,5,116,3,100,3,124,5,155,0,100,4,116, - 4,124,4,131,1,106,2,155,0,157,4,131,1,130,1,124, - 4,100,5,107,2,114,106,124,3,115,4,116,5,124,0,100, - 6,131,2,114,4,116,6,124,0,124,0,106,7,124,2,100, - 7,100,8,141,4,1,0,113,4,116,5,124,0,124,4,131, - 2,115,4,100,9,160,8,124,0,106,2,124,4,161,2,125, - 6,122,14,116,9,124,2,124,6,131,2,1,0,87,0,113, - 4,4,0,116,10,121,214,1,0,125,7,1,0,122,42,124, - 7,106,11,124,6,107,2,114,200,116,12,106,13,160,14,124, - 6,116,15,161,2,100,10,117,1,114,200,87,0,89,0,100, - 10,125,7,126,7,113,4,130,0,100,10,125,7,126,7,119, - 1,124,0,83,0,119,0,41,11,122,238,70,105,103,117,114, - 101,32,111,117,116,32,119,104,97,116,32,95,95,105,109,112, - 111,114,116,95,95,32,115,104,111,117,108,100,32,114,101,116, - 117,114,110,46,10,10,32,32,32,32,84,104,101,32,105,109, - 112,111,114,116,95,32,112,97,114,97,109,101,116,101,114,32, - 105,115,32,97,32,99,97,108,108,97,98,108,101,32,119,104, - 105,99,104,32,116,97,107,101,115,32,116,104,101,32,110,97, - 109,101,32,111,102,32,109,111,100,117,108,101,32,116,111,10, - 32,32,32,32,105,109,112,111,114,116,46,32,73,116,32,105, - 115,32,114,101,113,117,105,114,101,100,32,116,111,32,100,101, - 99,111,117,112,108,101,32,116,104,101,32,102,117,110,99,116, - 105,111,110,32,102,114,111,109,32,97,115,115,117,109,105,110, - 103,32,105,109,112,111,114,116,108,105,98,39,115,10,32,32, - 32,32,105,109,112,111,114,116,32,105,109,112,108,101,109,101, - 110,116,97,116,105,111,110,32,105,115,32,100,101,115,105,114, - 101,100,46,10,10,32,32,32,32,122,8,46,95,95,97,108, - 108,95,95,122,13,96,96,102,114,111,109,32,108,105,115,116, - 39,39,122,8,73,116,101,109,32,105,110,32,122,18,32,109, - 117,115,116,32,98,101,32,115,116,114,44,32,110,111,116,32, - 250,1,42,218,7,95,95,97,108,108,95,95,84,114,217,0, - 0,0,114,193,0,0,0,78,41,16,114,203,0,0,0,114, - 204,0,0,0,114,9,0,0,0,114,205,0,0,0,114,3, - 0,0,0,114,11,0,0,0,218,16,95,104,97,110,100,108, - 101,95,102,114,111,109,108,105,115,116,114,220,0,0,0,114, - 49,0,0,0,114,71,0,0,0,114,211,0,0,0,114,20, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,38,0, - 0,0,114,214,0,0,0,41,8,114,104,0,0,0,218,8, - 102,114,111,109,108,105,115,116,114,212,0,0,0,114,218,0, - 0,0,218,1,120,90,5,119,104,101,114,101,90,9,102,114, - 111,109,95,110,97,109,101,90,3,101,120,99,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,221,0,0,0, - 28,4,0,0,115,54,0,0,0,8,10,10,1,4,1,12, - 1,4,2,10,1,8,1,8,255,8,2,14,1,10,1,2, - 1,8,255,10,2,14,1,2,1,14,1,14,1,10,4,16, - 1,2,255,12,2,2,1,8,128,4,1,2,248,255,128,114, - 221,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,6,0,0,0,67,0,0,0,115,146,0, - 0,0,124,0,160,0,100,1,161,1,125,1,124,0,160,0, - 100,2,161,1,125,2,124,1,100,3,117,1,114,82,124,2, - 100,3,117,1,114,78,124,1,124,2,106,1,107,3,114,78, - 116,2,106,3,100,4,124,1,155,2,100,5,124,2,106,1, - 155,2,100,6,157,5,116,4,100,7,100,8,141,3,1,0, - 124,1,83,0,124,2,100,3,117,1,114,96,124,2,106,1, - 83,0,116,2,106,3,100,9,116,4,100,7,100,8,141,3, - 1,0,124,0,100,10,25,0,125,1,100,11,124,0,118,1, - 114,142,124,1,160,5,100,12,161,1,100,13,25,0,125,1, - 124,1,83,0,41,14,122,167,67,97,108,99,117,108,97,116, - 101,32,119,104,97,116,32,95,95,112,97,99,107,97,103,101, - 95,95,32,115,104,111,117,108,100,32,98,101,46,10,10,32, - 32,32,32,95,95,112,97,99,107,97,103,101,95,95,32,105, - 115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100, - 32,116,111,32,98,101,32,100,101,102,105,110,101,100,32,111, - 114,32,99,111,117,108,100,32,98,101,32,115,101,116,32,116, - 111,32,78,111,110,101,10,32,32,32,32,116,111,32,114,101, - 112,114,101,115,101,110,116,32,116,104,97,116,32,105,116,115, - 32,112,114,111,112,101,114,32,118,97,108,117,101,32,105,115, - 32,117,110,107,110,111,119,110,46,10,10,32,32,32,32,114, - 152,0,0,0,114,113,0,0,0,78,122,32,95,95,112,97, - 99,107,97,103,101,95,95,32,33,61,32,95,95,115,112,101, - 99,95,95,46,112,97,114,101,110,116,32,40,122,4,32,33, - 61,32,250,1,41,233,3,0,0,0,41,1,90,10,115,116, - 97,99,107,108,101,118,101,108,122,89,99,97,110,39,116,32, - 114,101,115,111,108,118,101,32,112,97,99,107,97,103,101,32, - 102,114,111,109,32,95,95,115,112,101,99,95,95,32,111,114, - 32,95,95,112,97,99,107,97,103,101,95,95,44,32,102,97, - 108,108,105,110,103,32,98,97,99,107,32,111,110,32,95,95, - 110,97,109,101,95,95,32,97,110,100,32,95,95,112,97,116, - 104,95,95,114,9,0,0,0,114,148,0,0,0,114,135,0, - 0,0,114,25,0,0,0,41,6,114,38,0,0,0,114,137, - 0,0,0,114,95,0,0,0,114,96,0,0,0,114,163,0, - 0,0,114,136,0,0,0,41,3,218,7,103,108,111,98,97, - 108,115,114,196,0,0,0,114,103,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,17,95,99,97, - 108,99,95,95,95,112,97,99,107,97,103,101,95,95,65,4, - 0,0,115,44,0,0,0,10,7,10,1,8,1,18,1,6, - 1,2,1,4,255,4,1,6,255,4,2,6,254,4,3,8, - 1,6,1,6,2,4,2,6,254,8,3,8,1,14,1,4, - 1,255,128,114,227,0,0,0,114,5,0,0,0,99,5,0, - 0,0,0,0,0,0,0,0,0,0,9,0,0,0,5,0, - 0,0,67,0,0,0,115,174,0,0,0,124,4,100,1,107, - 2,114,18,116,0,124,0,131,1,125,5,110,36,124,1,100, - 2,117,1,114,30,124,1,110,2,105,0,125,6,116,1,124, - 6,131,1,125,7,116,0,124,0,124,7,124,4,131,3,125, - 5,124,3,115,148,124,4,100,1,107,2,114,84,116,0,124, - 0,160,2,100,3,161,1,100,1,25,0,131,1,83,0,124, - 0,115,92,124,5,83,0,116,3,124,0,131,1,116,3,124, - 0,160,2,100,3,161,1,100,1,25,0,131,1,24,0,125, - 8,116,4,106,5,124,5,106,6,100,2,116,3,124,5,106, - 6,131,1,124,8,24,0,133,2,25,0,25,0,83,0,116, - 7,124,5,100,4,131,2,114,170,116,8,124,5,124,3,116, - 0,131,3,83,0,124,5,83,0,41,5,97,215,1,0,0, - 73,109,112,111,114,116,32,97,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,84,104,101,32,39,103,108,111,98,97, - 108,115,39,32,97,114,103,117,109,101,110,116,32,105,115,32, - 117,115,101,100,32,116,111,32,105,110,102,101,114,32,119,104, - 101,114,101,32,116,104,101,32,105,109,112,111,114,116,32,105, - 115,32,111,99,99,117,114,114,105,110,103,32,102,114,111,109, - 10,32,32,32,32,116,111,32,104,97,110,100,108,101,32,114, - 101,108,97,116,105,118,101,32,105,109,112,111,114,116,115,46, - 32,84,104,101,32,39,108,111,99,97,108,115,39,32,97,114, - 103,117,109,101,110,116,32,105,115,32,105,103,110,111,114,101, - 100,46,32,84,104,101,10,32,32,32,32,39,102,114,111,109, - 108,105,115,116,39,32,97,114,103,117,109,101,110,116,32,115, - 112,101,99,105,102,105,101,115,32,119,104,97,116,32,115,104, - 111,117,108,100,32,101,120,105,115,116,32,97,115,32,97,116, - 116,114,105,98,117,116,101,115,32,111,110,32,116,104,101,32, - 109,111,100,117,108,101,10,32,32,32,32,98,101,105,110,103, - 32,105,109,112,111,114,116,101,100,32,40,101,46,103,46,32, - 96,96,102,114,111,109,32,109,111,100,117,108,101,32,105,109, - 112,111,114,116,32,60,102,114,111,109,108,105,115,116,62,96, - 96,41,46,32,32,84,104,101,32,39,108,101,118,101,108,39, - 10,32,32,32,32,97,114,103,117,109,101,110,116,32,114,101, - 112,114,101,115,101,110,116,115,32,116,104,101,32,112,97,99, - 107,97,103,101,32,108,111,99,97,116,105,111,110,32,116,111, - 32,105,109,112,111,114,116,32,102,114,111,109,32,105,110,32, - 97,32,114,101,108,97,116,105,118,101,10,32,32,32,32,105, - 109,112,111,114,116,32,40,101,46,103,46,32,96,96,102,114, - 111,109,32,46,46,112,107,103,32,105,109,112,111,114,116,32, - 109,111,100,96,96,32,119,111,117,108,100,32,104,97,118,101, - 32,97,32,39,108,101,118,101,108,39,32,111,102,32,50,41, - 46,10,10,32,32,32,32,114,25,0,0,0,78,114,135,0, - 0,0,114,148,0,0,0,41,9,114,216,0,0,0,114,227, - 0,0,0,218,9,112,97,114,116,105,116,105,111,110,114,195, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,9,0, - 0,0,114,11,0,0,0,114,221,0,0,0,41,9,114,20, - 0,0,0,114,226,0,0,0,218,6,108,111,99,97,108,115, - 114,222,0,0,0,114,197,0,0,0,114,104,0,0,0,90, - 8,103,108,111,98,97,108,115,95,114,196,0,0,0,90,7, - 99,117,116,95,111,102,102,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,10,95,95,105,109,112,111,114,116, - 95,95,92,4,0,0,115,32,0,0,0,8,11,10,1,16, - 2,8,1,12,1,4,1,8,3,18,1,4,1,4,1,26, - 4,30,3,10,1,12,1,4,2,255,128,114,230,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,218,18,95,98,117,105,108,116,105,110,95,102,114,111,109, + 95,110,97,109,101,129,4,0,0,115,10,0,0,0,10,1, + 8,1,12,1,8,1,255,128,114,231,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,10,0,0,0,5,0, + 0,0,67,0,0,0,115,162,0,0,0,124,1,97,0,124, + 0,97,1,116,2,116,1,131,1,125,2,116,1,106,3,160, + 4,161,0,68,0,93,68,92,2,125,3,125,4,116,5,124, + 4,124,2,131,2,114,26,124,3,116,1,106,6,118,0,114, + 60,116,7,125,5,110,14,116,0,160,8,124,3,161,1,114, + 26,116,9,125,5,116,10,124,4,124,5,131,2,125,6,116, + 11,124,6,124,4,131,2,1,0,113,26,116,1,106,3,116, + 12,25,0,125,7,100,1,68,0,93,46,125,8,124,8,116, + 1,106,3,118,1,114,134,116,13,124,8,131,1,125,9,110, + 10,116,1,106,3,124,8,25,0,125,9,116,14,124,7,124, + 8,124,9,131,3,1,0,113,110,100,2,83,0,41,3,122, + 250,83,101,116,117,112,32,105,109,112,111,114,116,108,105,98, + 32,98,121,32,105,109,112,111,114,116,105,110,103,32,110,101, + 101,100,101,100,32,98,117,105,108,116,45,105,110,32,109,111, + 100,117,108,101,115,32,97,110,100,32,105,110,106,101,99,116, + 105,110,103,32,116,104,101,109,10,32,32,32,32,105,110,116, + 111,32,116,104,101,32,103,108,111,98,97,108,32,110,97,109, + 101,115,112,97,99,101,46,10,10,32,32,32,32,65,115,32, + 115,121,115,32,105,115,32,110,101,101,100,101,100,32,102,111, + 114,32,115,121,115,46,109,111,100,117,108,101,115,32,97,99, + 99,101,115,115,32,97,110,100,32,95,105,109,112,32,105,115, + 32,110,101,101,100,101,100,32,116,111,32,108,111,97,100,32, + 98,117,105,108,116,45,105,110,10,32,32,32,32,109,111,100, + 117,108,101,115,44,32,116,104,111,115,101,32,116,119,111,32, + 109,111,100,117,108,101,115,32,109,117,115,116,32,98,101,32, + 101,120,112,108,105,99,105,116,108,121,32,112,97,115,115,101, + 100,32,105,110,46,10,10,32,32,32,32,41,3,114,26,0, + 0,0,114,95,0,0,0,114,68,0,0,0,78,41,15,114, + 61,0,0,0,114,18,0,0,0,114,3,0,0,0,114,99, + 0,0,0,218,5,105,116,101,109,115,114,203,0,0,0,114, + 82,0,0,0,114,169,0,0,0,114,92,0,0,0,114,184, + 0,0,0,114,149,0,0,0,114,155,0,0,0,114,9,0, + 0,0,114,231,0,0,0,114,12,0,0,0,41,10,218,10, + 115,121,115,95,109,111,100,117,108,101,218,11,95,105,109,112, + 95,109,111,100,117,108,101,90,11,109,111,100,117,108,101,95, + 116,121,112,101,114,20,0,0,0,114,104,0,0,0,114,116, + 0,0,0,114,103,0,0,0,90,11,115,101,108,102,95,109, + 111,100,117,108,101,90,12,98,117,105,108,116,105,110,95,110, + 97,109,101,90,14,98,117,105,108,116,105,110,95,109,111,100, + 117,108,101,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,6,95,115,101,116,117,112,136,4,0,0,115,40, + 0,0,0,4,9,4,1,8,3,18,1,10,1,10,1,6, + 1,10,1,4,1,10,3,10,1,2,128,10,3,8,1,10, + 1,10,1,10,2,14,1,4,251,255,128,114,235,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, - 160,1,124,0,161,1,125,1,124,1,100,0,117,0,114,30, - 116,2,100,1,124,0,23,0,131,1,130,1,116,3,124,1, - 131,1,83,0,41,2,78,122,25,110,111,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,32,110,97,109,101, - 100,32,41,4,114,169,0,0,0,114,177,0,0,0,114,83, - 0,0,0,114,167,0,0,0,41,2,114,20,0,0,0,114, - 103,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,18,95,98,117,105,108,116,105,110,95,102,114, - 111,109,95,110,97,109,101,129,4,0,0,115,10,0,0,0, - 10,1,8,1,12,1,8,1,255,128,114,231,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, - 5,0,0,0,67,0,0,0,115,162,0,0,0,124,1,97, - 0,124,0,97,1,116,2,116,1,131,1,125,2,116,1,106, - 3,160,4,161,0,68,0,93,68,92,2,125,3,125,4,116, - 5,124,4,124,2,131,2,114,26,124,3,116,1,106,6,118, - 0,114,60,116,7,125,5,110,14,116,0,160,8,124,3,161, - 1,114,26,116,9,125,5,116,10,124,4,124,5,131,2,125, - 6,116,11,124,6,124,4,131,2,1,0,113,26,116,1,106, - 3,116,12,25,0,125,7,100,1,68,0,93,46,125,8,124, - 8,116,1,106,3,118,1,114,134,116,13,124,8,131,1,125, - 9,110,10,116,1,106,3,124,8,25,0,125,9,116,14,124, - 7,124,8,124,9,131,3,1,0,113,110,100,2,83,0,41, - 3,122,250,83,101,116,117,112,32,105,109,112,111,114,116,108, - 105,98,32,98,121,32,105,109,112,111,114,116,105,110,103,32, - 110,101,101,100,101,100,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,115,32,97,110,100,32,105,110,106,101, - 99,116,105,110,103,32,116,104,101,109,10,32,32,32,32,105, - 110,116,111,32,116,104,101,32,103,108,111,98,97,108,32,110, - 97,109,101,115,112,97,99,101,46,10,10,32,32,32,32,65, - 115,32,115,121,115,32,105,115,32,110,101,101,100,101,100,32, - 102,111,114,32,115,121,115,46,109,111,100,117,108,101,115,32, - 97,99,99,101,115,115,32,97,110,100,32,95,105,109,112,32, - 105,115,32,110,101,101,100,101,100,32,116,111,32,108,111,97, - 100,32,98,117,105,108,116,45,105,110,10,32,32,32,32,109, - 111,100,117,108,101,115,44,32,116,104,111,115,101,32,116,119, - 111,32,109,111,100,117,108,101,115,32,109,117,115,116,32,98, - 101,32,101,120,112,108,105,99,105,116,108,121,32,112,97,115, - 115,101,100,32,105,110,46,10,10,32,32,32,32,41,3,114, - 26,0,0,0,114,95,0,0,0,114,68,0,0,0,78,41, - 15,114,61,0,0,0,114,18,0,0,0,114,3,0,0,0, - 114,99,0,0,0,218,5,105,116,101,109,115,114,203,0,0, - 0,114,82,0,0,0,114,169,0,0,0,114,92,0,0,0, - 114,184,0,0,0,114,149,0,0,0,114,155,0,0,0,114, - 9,0,0,0,114,231,0,0,0,114,12,0,0,0,41,10, - 218,10,115,121,115,95,109,111,100,117,108,101,218,11,95,105, - 109,112,95,109,111,100,117,108,101,90,11,109,111,100,117,108, - 101,95,116,121,112,101,114,20,0,0,0,114,104,0,0,0, - 114,116,0,0,0,114,103,0,0,0,90,11,115,101,108,102, - 95,109,111,100,117,108,101,90,12,98,117,105,108,116,105,110, - 95,110,97,109,101,90,14,98,117,105,108,116,105,110,95,109, - 111,100,117,108,101,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,6,95,115,101,116,117,112,136,4,0,0, - 115,40,0,0,0,4,9,4,1,8,3,18,1,10,1,10, - 1,6,1,10,1,4,1,10,3,10,1,2,128,10,3,8, - 1,10,1,10,1,10,2,14,1,4,251,255,128,114,235,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 116,0,124,0,124,1,131,2,1,0,116,1,106,2,160,3, - 116,4,161,1,1,0,116,1,106,2,160,3,116,5,161,1, - 1,0,100,1,83,0,41,2,122,48,73,110,115,116,97,108, - 108,32,105,109,112,111,114,116,101,114,115,32,102,111,114,32, - 98,117,105,108,116,105,110,32,97,110,100,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,115,78,41,6,114,235,0, - 0,0,114,18,0,0,0,114,201,0,0,0,114,126,0,0, - 0,114,169,0,0,0,114,184,0,0,0,41,2,114,233,0, - 0,0,114,234,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,8,95,105,110,115,116,97,108,108, - 171,4,0,0,115,8,0,0,0,10,2,12,2,16,1,255, - 128,114,236,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, - 32,0,0,0,100,1,100,2,108,0,125,0,124,0,97,1, - 124,0,160,2,116,3,106,4,116,5,25,0,161,1,1,0, - 100,2,83,0,41,3,122,57,73,110,115,116,97,108,108,32, - 105,109,112,111,114,116,101,114,115,32,116,104,97,116,32,114, - 101,113,117,105,114,101,32,101,120,116,101,114,110,97,108,32, - 102,105,108,101,115,121,115,116,101,109,32,97,99,99,101,115, - 115,114,25,0,0,0,78,41,6,218,26,95,102,114,111,122, - 101,110,95,105,109,112,111,114,116,108,105,98,95,101,120,116, - 101,114,110,97,108,114,133,0,0,0,114,236,0,0,0,114, - 18,0,0,0,114,99,0,0,0,114,9,0,0,0,41,1, - 114,237,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,27,95,105,110,115,116,97,108,108,95,101, - 120,116,101,114,110,97,108,95,105,109,112,111,114,116,101,114, - 115,179,4,0,0,115,8,0,0,0,8,3,4,1,20,1, - 255,128,114,238,0,0,0,41,2,78,78,41,1,78,41,2, - 78,114,25,0,0,0,41,4,78,78,114,5,0,0,0,114, - 25,0,0,0,41,54,114,10,0,0,0,114,7,0,0,0, - 114,26,0,0,0,114,95,0,0,0,114,68,0,0,0,114, - 133,0,0,0,114,17,0,0,0,114,21,0,0,0,114,63, - 0,0,0,114,37,0,0,0,114,47,0,0,0,114,22,0, - 0,0,114,23,0,0,0,114,53,0,0,0,114,54,0,0, - 0,114,57,0,0,0,114,69,0,0,0,114,71,0,0,0, - 114,80,0,0,0,114,90,0,0,0,114,94,0,0,0,114, - 105,0,0,0,114,118,0,0,0,114,119,0,0,0,114,98, - 0,0,0,114,149,0,0,0,114,155,0,0,0,114,159,0, - 0,0,114,114,0,0,0,114,100,0,0,0,114,166,0,0, - 0,114,167,0,0,0,114,101,0,0,0,114,169,0,0,0, - 114,184,0,0,0,114,189,0,0,0,114,198,0,0,0,114, - 200,0,0,0,114,202,0,0,0,114,208,0,0,0,90,15, - 95,69,82,82,95,77,83,71,95,80,82,69,70,73,88,114, - 210,0,0,0,114,213,0,0,0,218,6,111,98,106,101,99, - 116,114,214,0,0,0,114,215,0,0,0,114,216,0,0,0, - 114,221,0,0,0,114,227,0,0,0,114,230,0,0,0,114, - 231,0,0,0,114,235,0,0,0,114,236,0,0,0,114,238, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,8,60,109,111,100,117,108,101, - 62,1,0,0,0,115,106,0,0,0,4,0,8,22,4,9, - 4,1,4,1,4,3,8,3,8,8,4,8,4,2,16,3, - 14,4,14,77,14,21,8,16,8,37,8,17,14,11,8,8, - 8,11,8,12,8,19,14,36,16,101,10,26,14,45,8,72, - 8,17,8,17,8,30,8,36,8,45,14,15,14,75,14,80, - 8,13,8,9,10,9,8,47,4,16,8,1,8,2,6,32, - 8,3,10,16,14,15,8,37,10,27,8,37,8,7,8,35, - 12,8,255,128, + 124,0,124,1,131,2,1,0,116,1,106,2,160,3,116,4, + 161,1,1,0,116,1,106,2,160,3,116,5,161,1,1,0, + 100,1,83,0,41,2,122,48,73,110,115,116,97,108,108,32, + 105,109,112,111,114,116,101,114,115,32,102,111,114,32,98,117, + 105,108,116,105,110,32,97,110,100,32,102,114,111,122,101,110, + 32,109,111,100,117,108,101,115,78,41,6,114,235,0,0,0, + 114,18,0,0,0,114,201,0,0,0,114,126,0,0,0,114, + 169,0,0,0,114,184,0,0,0,41,2,114,233,0,0,0, + 114,234,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,8,95,105,110,115,116,97,108,108,171,4, + 0,0,115,8,0,0,0,10,2,12,2,16,1,255,128,114, + 236,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,67,0,0,0,115,32,0, + 0,0,100,1,100,2,108,0,125,0,124,0,97,1,124,0, + 160,2,116,3,106,4,116,5,25,0,161,1,1,0,100,2, + 83,0,41,3,122,57,73,110,115,116,97,108,108,32,105,109, + 112,111,114,116,101,114,115,32,116,104,97,116,32,114,101,113, + 117,105,114,101,32,101,120,116,101,114,110,97,108,32,102,105, + 108,101,115,121,115,116,101,109,32,97,99,99,101,115,115,114, + 25,0,0,0,78,41,6,218,26,95,102,114,111,122,101,110, + 95,105,109,112,111,114,116,108,105,98,95,101,120,116,101,114, + 110,97,108,114,133,0,0,0,114,236,0,0,0,114,18,0, + 0,0,114,99,0,0,0,114,9,0,0,0,41,1,114,237, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,27,95,105,110,115,116,97,108,108,95,101,120,116, + 101,114,110,97,108,95,105,109,112,111,114,116,101,114,115,179, + 4,0,0,115,8,0,0,0,8,3,4,1,20,1,255,128, + 114,238,0,0,0,41,2,78,78,41,1,78,41,2,78,114, + 25,0,0,0,41,4,78,78,114,5,0,0,0,114,25,0, + 0,0,41,54,114,10,0,0,0,114,7,0,0,0,114,26, + 0,0,0,114,95,0,0,0,114,68,0,0,0,114,133,0, + 0,0,114,17,0,0,0,114,21,0,0,0,114,63,0,0, + 0,114,37,0,0,0,114,47,0,0,0,114,22,0,0,0, + 114,23,0,0,0,114,53,0,0,0,114,54,0,0,0,114, + 57,0,0,0,114,69,0,0,0,114,71,0,0,0,114,80, + 0,0,0,114,90,0,0,0,114,94,0,0,0,114,105,0, + 0,0,114,118,0,0,0,114,119,0,0,0,114,98,0,0, + 0,114,149,0,0,0,114,155,0,0,0,114,159,0,0,0, + 114,114,0,0,0,114,100,0,0,0,114,166,0,0,0,114, + 167,0,0,0,114,101,0,0,0,114,169,0,0,0,114,184, + 0,0,0,114,189,0,0,0,114,198,0,0,0,114,200,0, + 0,0,114,202,0,0,0,114,208,0,0,0,90,15,95,69, + 82,82,95,77,83,71,95,80,82,69,70,73,88,114,210,0, + 0,0,114,213,0,0,0,218,6,111,98,106,101,99,116,114, + 214,0,0,0,114,215,0,0,0,114,216,0,0,0,114,221, + 0,0,0,114,227,0,0,0,114,230,0,0,0,114,231,0, + 0,0,114,235,0,0,0,114,236,0,0,0,114,238,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,8,60,109,111,100,117,108,101,62,1, + 0,0,0,115,106,0,0,0,4,0,8,22,4,9,4,1, + 4,1,4,3,8,3,8,8,4,8,4,2,16,3,14,4, + 14,77,14,21,8,16,8,37,8,17,14,11,8,8,8,11, + 8,12,8,19,14,36,16,101,10,26,14,45,8,72,8,17, + 8,17,8,30,8,36,8,45,14,15,14,75,14,80,8,13, + 8,9,10,9,8,47,4,16,8,1,8,2,6,32,8,3, + 10,16,14,15,8,37,10,27,8,37,8,7,8,35,12,8, + 255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index e420ef86662a98..f420fa1faaa3df 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -229,9 +229,9 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,57,0,0,0,99,2,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,0,8,0,0,0,67,0,0,0,115,48, 0,0,0,122,12,116,0,124,0,131,1,125,2,87,0,110, - 20,4,0,116,1,121,32,1,0,1,0,1,0,89,0,100, - 1,83,0,119,0,124,2,106,2,100,2,64,0,124,1,107, - 2,83,0,41,4,122,49,84,101,115,116,32,119,104,101,116, + 18,4,0,116,1,121,46,1,0,1,0,1,0,89,0,100, + 1,83,0,124,2,106,2,100,2,64,0,124,1,107,2,83, + 0,119,0,41,4,122,49,84,101,115,116,32,119,104,101,116, 104,101,114,32,116,104,101,32,112,97,116,104,32,105,115,32, 116,104,101,32,115,112,101,99,105,102,105,101,100,32,109,111, 100,101,32,116,121,112,101,46,70,105,0,240,0,0,78,41, @@ -240,2430 +240,2433 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 4,109,111,100,101,90,9,115,116,97,116,95,105,110,102,111, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, 18,95,112,97,116,104,95,105,115,95,109,111,100,101,95,116, - 121,112,101,122,0,0,0,115,12,0,0,0,2,2,12,1, - 12,1,8,1,14,1,255,128,114,61,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,100, - 1,131,2,83,0,41,3,122,31,82,101,112,108,97,99,101, - 109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,104, - 46,105,115,102,105,108,101,46,105,0,128,0,0,78,41,1, - 114,61,0,0,0,114,56,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,12,95,112,97,116,104, - 95,105,115,102,105,108,101,131,0,0,0,115,4,0,0,0, - 10,2,255,128,114,62,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,22,0,0,0,124,0,115,12,116,0,160,1,161, - 0,125,0,116,2,124,0,100,1,131,2,83,0,41,3,122, - 30,82,101,112,108,97,99,101,109,101,110,116,32,102,111,114, - 32,111,115,46,112,97,116,104,46,105,115,100,105,114,46,105, - 0,64,0,0,78,41,3,114,18,0,0,0,218,6,103,101, - 116,99,119,100,114,61,0,0,0,114,56,0,0,0,114,7, + 121,112,101,122,0,0,0,115,14,0,0,0,2,2,12,1, + 12,1,6,1,14,1,2,254,255,128,114,61,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,124, + 0,100,1,131,2,83,0,41,3,122,31,82,101,112,108,97, + 99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,97, + 116,104,46,105,115,102,105,108,101,46,105,0,128,0,0,78, + 41,1,114,61,0,0,0,114,56,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,12,95,112,97, + 116,104,95,105,115,102,105,108,101,131,0,0,0,115,4,0, + 0,0,10,2,255,128,114,62,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,22,0,0,0,124,0,115,12,116,0,160, + 1,161,0,125,0,116,2,124,0,100,1,131,2,83,0,41, + 3,122,30,82,101,112,108,97,99,101,109,101,110,116,32,102, + 111,114,32,111,115,46,112,97,116,104,46,105,115,100,105,114, + 46,105,0,64,0,0,78,41,3,114,18,0,0,0,218,6, + 103,101,116,99,119,100,114,61,0,0,0,114,56,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 11,95,112,97,116,104,95,105,115,100,105,114,136,0,0,0, + 115,8,0,0,0,4,2,8,1,10,1,255,128,114,64,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,26,0,0,0, + 124,0,160,0,116,1,161,1,112,24,124,0,100,1,100,2, + 133,2,25,0,116,2,118,0,83,0,41,4,122,142,82,101, + 112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,115, + 46,112,97,116,104,46,105,115,97,98,115,46,10,10,32,32, + 32,32,67,111,110,115,105,100,101,114,115,32,97,32,87,105, + 110,100,111,119,115,32,100,114,105,118,101,45,114,101,108,97, + 116,105,118,101,32,112,97,116,104,32,40,110,111,32,100,114, + 105,118,101,44,32,98,117,116,32,115,116,97,114,116,115,32, + 119,105,116,104,32,115,108,97,115,104,41,32,116,111,10,32, + 32,32,32,115,116,105,108,108,32,98,101,32,34,97,98,115, + 111,108,117,116,101,34,46,10,32,32,32,32,114,3,0,0, + 0,233,3,0,0,0,78,41,3,114,23,0,0,0,114,42, + 0,0,0,218,20,95,112,97,116,104,115,101,112,115,95,119, + 105,116,104,95,99,111,108,111,110,114,56,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, - 112,97,116,104,95,105,115,100,105,114,136,0,0,0,115,8, - 0,0,0,4,2,8,1,10,1,255,128,114,64,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,26,0,0,0,124,0, - 160,0,116,1,161,1,112,24,124,0,100,1,100,2,133,2, - 25,0,116,2,118,0,83,0,41,4,122,142,82,101,112,108, - 97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,112, - 97,116,104,46,105,115,97,98,115,46,10,10,32,32,32,32, - 67,111,110,115,105,100,101,114,115,32,97,32,87,105,110,100, - 111,119,115,32,100,114,105,118,101,45,114,101,108,97,116,105, - 118,101,32,112,97,116,104,32,40,110,111,32,100,114,105,118, - 101,44,32,98,117,116,32,115,116,97,114,116,115,32,119,105, - 116,104,32,115,108,97,115,104,41,32,116,111,10,32,32,32, - 32,115,116,105,108,108,32,98,101,32,34,97,98,115,111,108, - 117,116,101,34,46,10,32,32,32,32,114,3,0,0,0,233, - 3,0,0,0,78,41,3,114,23,0,0,0,114,42,0,0, - 0,218,20,95,112,97,116,104,115,101,112,115,95,119,105,116, - 104,95,99,111,108,111,110,114,56,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,11,95,112,97, - 116,104,95,105,115,97,98,115,143,0,0,0,115,4,0,0, - 0,26,6,255,128,114,67,0,0,0,233,182,1,0,0,99, - 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, - 11,0,0,0,67,0,0,0,115,170,0,0,0,100,1,160, - 0,124,0,116,1,124,0,131,1,161,2,125,3,116,2,160, - 3,124,3,116,2,106,4,116,2,106,5,66,0,116,2,106, - 6,66,0,124,2,100,2,64,0,161,3,125,4,122,72,116, - 7,160,8,124,4,100,3,161,2,143,26,125,5,124,5,160, - 9,124,1,161,1,1,0,87,0,100,4,4,0,4,0,131, - 3,1,0,110,16,49,0,115,94,119,1,1,0,1,0,1, - 0,89,0,1,0,116,2,160,10,124,3,124,0,161,2,1, - 0,87,0,100,4,83,0,4,0,116,11,121,168,1,0,1, - 0,1,0,122,14,116,2,160,12,124,3,161,1,1,0,87, - 0,130,0,4,0,116,11,121,166,1,0,1,0,1,0,89, - 0,130,0,119,0,119,0,41,5,122,162,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,250,5,123, - 125,46,123,125,114,68,0,0,0,90,2,119,98,78,41,13, - 218,6,102,111,114,109,97,116,218,2,105,100,114,18,0,0, - 0,90,4,111,112,101,110,90,6,79,95,69,88,67,76,90, - 7,79,95,67,82,69,65,84,90,8,79,95,87,82,79,78, - 76,89,218,3,95,105,111,218,6,70,105,108,101,73,79,218, - 5,119,114,105,116,101,218,7,114,101,112,108,97,99,101,114, - 58,0,0,0,90,6,117,110,108,105,110,107,41,6,114,52, - 0,0,0,114,37,0,0,0,114,60,0,0,0,90,8,112, - 97,116,104,95,116,109,112,90,2,102,100,218,4,102,105,108, + 112,97,116,104,95,105,115,97,98,115,143,0,0,0,115,4, + 0,0,0,26,6,255,128,114,67,0,0,0,233,182,1,0, + 0,99,3,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,11,0,0,0,67,0,0,0,115,174,0,0,0,100, + 1,160,0,124,0,116,1,124,0,131,1,161,2,125,3,116, + 2,160,3,124,3,116,2,106,4,116,2,106,5,66,0,116, + 2,106,6,66,0,124,2,100,2,64,0,161,3,125,4,122, + 72,116,7,160,8,124,4,100,3,161,2,143,26,125,5,124, + 5,160,9,124,1,161,1,1,0,87,0,100,4,4,0,4, + 0,131,3,1,0,110,16,49,0,115,94,119,1,1,0,1, + 0,1,0,89,0,1,0,116,2,160,10,124,3,124,0,161, + 2,1,0,87,0,100,4,83,0,4,0,116,11,121,172,1, + 0,1,0,1,0,122,14,116,2,160,12,124,3,161,1,1, + 0,87,0,130,0,4,0,116,11,121,166,1,0,1,0,1, + 0,89,0,130,0,119,0,100,4,83,0,119,0,41,5,122, + 162,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,250,5,123,125,46,123,125,114,68,0,0,0,90, + 2,119,98,78,41,13,218,6,102,111,114,109,97,116,218,2, + 105,100,114,18,0,0,0,90,4,111,112,101,110,90,6,79, + 95,69,88,67,76,90,7,79,95,67,82,69,65,84,90,8, + 79,95,87,82,79,78,76,89,218,3,95,105,111,218,6,70, + 105,108,101,73,79,218,5,119,114,105,116,101,218,7,114,101, + 112,108,97,99,101,114,58,0,0,0,90,6,117,110,108,105, + 110,107,41,6,114,52,0,0,0,114,37,0,0,0,114,60, + 0,0,0,90,8,112,97,116,104,95,116,109,112,90,2,102, + 100,218,4,102,105,108,101,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,13,95,119,114,105,116,101,95,97, + 116,111,109,105,99,152,0,0,0,115,38,0,0,0,16,5, + 6,1,22,1,4,255,2,2,14,3,40,1,18,1,12,1, + 2,1,12,1,2,3,12,254,2,1,2,1,2,254,4,252, + 2,1,255,128,114,77,0,0,0,105,105,13,0,0,114,39, + 0,0,0,114,29,0,0,0,115,2,0,0,0,13,10,90, + 11,95,95,112,121,99,97,99,104,101,95,95,122,4,111,112, + 116,45,122,3,46,112,121,122,4,46,112,121,119,122,4,46, + 112,121,99,41,1,218,12,111,112,116,105,109,105,122,97,116, + 105,111,110,99,2,0,0,0,0,0,0,0,1,0,0,0, + 12,0,0,0,5,0,0,0,67,0,0,0,115,88,1,0, + 0,124,1,100,1,117,1,114,52,116,0,160,1,100,2,116, + 2,161,2,1,0,124,2,100,1,117,1,114,40,100,3,125, + 3,116,3,124,3,131,1,130,1,124,1,114,48,100,4,110, + 2,100,5,125,2,116,4,160,5,124,0,161,1,125,0,116, + 6,124,0,131,1,92,2,125,4,125,5,124,5,160,7,100, + 6,161,1,92,3,125,6,125,7,125,8,116,8,106,9,106, + 10,125,9,124,9,100,1,117,0,114,114,116,11,100,7,131, + 1,130,1,100,4,160,12,124,6,114,126,124,6,110,2,124, + 8,124,7,124,9,103,3,161,1,125,10,124,2,100,1,117, + 0,114,172,116,8,106,13,106,14,100,8,107,2,114,164,100, + 4,125,2,110,8,116,8,106,13,106,14,125,2,116,15,124, + 2,131,1,125,2,124,2,100,4,107,3,114,224,124,2,160, + 16,161,0,115,210,116,17,100,9,160,18,124,2,161,1,131, + 1,130,1,100,10,160,18,124,10,116,19,124,2,161,3,125, + 10,124,10,116,20,100,8,25,0,23,0,125,11,116,8,106, + 21,100,1,117,1,144,1,114,76,116,22,124,4,131,1,144, + 1,115,16,116,23,116,4,160,24,161,0,124,4,131,2,125, + 4,124,4,100,5,25,0,100,11,107,2,144,1,114,56,124, + 4,100,8,25,0,116,25,118,1,144,1,114,56,124,4,100, + 12,100,1,133,2,25,0,125,4,116,23,116,8,106,21,124, + 4,160,26,116,25,161,1,124,11,131,3,83,0,116,23,124, + 4,116,27,124,11,131,3,83,0,41,13,97,254,2,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,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,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,10,10,32,32,32,32,84,104, + 101,32,39,111,112,116,105,109,105,122,97,116,105,111,110,39, + 32,112,97,114,97,109,101,116,101,114,32,99,111,110,116,114, + 111,108,115,32,116,104,101,32,112,114,101,115,117,109,101,100, + 32,111,112,116,105,109,105,122,97,116,105,111,110,32,108,101, + 118,101,108,32,111,102,10,32,32,32,32,116,104,101,32,98, + 121,116,101,99,111,100,101,32,102,105,108,101,46,32,73,102, + 32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,32, + 105,115,32,110,111,116,32,78,111,110,101,44,32,116,104,101, + 32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110, + 116,97,116,105,111,110,10,32,32,32,32,111,102,32,116,104, + 101,32,97,114,103,117,109,101,110,116,32,105,115,32,116,97, + 107,101,110,32,97,110,100,32,118,101,114,105,102,105,101,100, + 32,116,111,32,98,101,32,97,108,112,104,97,110,117,109,101, + 114,105,99,32,40,101,108,115,101,32,86,97,108,117,101,69, + 114,114,111,114,10,32,32,32,32,105,115,32,114,97,105,115, + 101,100,41,46,10,10,32,32,32,32,84,104,101,32,100,101, + 98,117,103,95,111,118,101,114,114,105,100,101,32,112,97,114, + 97,109,101,116,101,114,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,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,10,32,32,32,32,97,32,84,114,117,101,32, + 118,97,108,117,101,32,105,115,32,116,104,101,32,115,97,109, + 101,32,97,115,32,115,101,116,116,105,110,103,32,39,111,112, + 116,105,109,105,122,97,116,105,111,110,39,32,116,111,32,116, + 104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,10, + 32,32,32,32,119,104,105,108,101,32,97,32,70,97,108,115, + 101,32,118,97,108,117,101,32,105,115,32,101,113,117,105,118, + 97,108,101,110,116,32,116,111,32,115,101,116,116,105,110,103, + 32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,32, + 116,111,32,39,49,39,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,122, + 70,116,104,101,32,100,101,98,117,103,95,111,118,101,114,114, + 105,100,101,32,112,97,114,97,109,101,116,101,114,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,59,32,117,115,101, + 32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,32, + 105,110,115,116,101,97,100,122,50,100,101,98,117,103,95,111, + 118,101,114,114,105,100,101,32,111,114,32,111,112,116,105,109, + 105,122,97,116,105,111,110,32,109,117,115,116,32,98,101,32, + 115,101,116,32,116,111,32,78,111,110,101,114,10,0,0,0, + 114,3,0,0,0,218,1,46,250,36,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,114,0, + 0,0,0,122,24,123,33,114,125,32,105,115,32,110,111,116, + 32,97,108,112,104,97,110,117,109,101,114,105,99,122,7,123, + 125,46,123,125,123,125,114,11,0,0,0,114,39,0,0,0, + 41,28,218,9,95,119,97,114,110,105,110,103,115,218,4,119, + 97,114,110,218,18,68,101,112,114,101,99,97,116,105,111,110, + 87,97,114,110,105,110,103,218,9,84,121,112,101,69,114,114, + 111,114,114,18,0,0,0,218,6,102,115,112,97,116,104,114, + 55,0,0,0,114,49,0,0,0,114,15,0,0,0,218,14, + 105,109,112,108,101,109,101,110,116,97,116,105,111,110,218,9, + 99,97,99,104,101,95,116,97,103,218,19,78,111,116,73,109, + 112,108,101,109,101,110,116,101,100,69,114,114,111,114,114,46, + 0,0,0,114,16,0,0,0,218,8,111,112,116,105,109,105, + 122,101,218,3,115,116,114,218,7,105,115,97,108,110,117,109, + 218,10,86,97,108,117,101,69,114,114,111,114,114,70,0,0, + 0,218,4,95,79,80,84,218,17,66,89,84,69,67,79,68, + 69,95,83,85,70,70,73,88,69,83,218,14,112,121,99,97, + 99,104,101,95,112,114,101,102,105,120,114,67,0,0,0,114, + 48,0,0,0,114,63,0,0,0,114,42,0,0,0,218,6, + 108,115,116,114,105,112,218,8,95,80,89,67,65,67,72,69, + 41,12,114,52,0,0,0,90,14,100,101,98,117,103,95,111, + 118,101,114,114,105,100,101,114,78,0,0,0,218,7,109,101, + 115,115,97,103,101,218,4,104,101,97,100,114,54,0,0,0, + 90,4,98,97,115,101,114,6,0,0,0,218,4,114,101,115, + 116,90,3,116,97,103,90,15,97,108,109,111,115,116,95,102, + 105,108,101,110,97,109,101,218,8,102,105,108,101,110,97,109, 101,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,13,95,119,114,105,116,101,95,97,116,111,109,105,99,152, - 0,0,0,115,36,0,0,0,16,5,6,1,22,1,4,255, - 2,2,14,3,40,1,18,1,12,1,2,1,12,1,2,3, - 12,254,2,1,2,1,2,255,2,1,255,128,114,77,0,0, - 0,105,105,13,0,0,114,39,0,0,0,114,29,0,0,0, - 115,2,0,0,0,13,10,90,11,95,95,112,121,99,97,99, - 104,101,95,95,122,4,111,112,116,45,122,3,46,112,121,122, - 4,46,112,121,119,122,4,46,112,121,99,41,1,218,12,111, - 112,116,105,109,105,122,97,116,105,111,110,99,2,0,0,0, - 0,0,0,0,1,0,0,0,12,0,0,0,5,0,0,0, - 67,0,0,0,115,88,1,0,0,124,1,100,1,117,1,114, - 52,116,0,160,1,100,2,116,2,161,2,1,0,124,2,100, - 1,117,1,114,40,100,3,125,3,116,3,124,3,131,1,130, - 1,124,1,114,48,100,4,110,2,100,5,125,2,116,4,160, + 218,17,99,97,99,104,101,95,102,114,111,109,95,115,111,117, + 114,99,101,85,1,0,0,115,74,0,0,0,8,18,6,1, + 2,1,4,255,8,2,4,1,8,1,12,1,10,1,12,1, + 16,1,8,1,8,1,8,1,24,1,8,1,12,1,6,1, + 8,2,8,1,8,1,8,1,14,1,14,1,12,1,12,1, + 10,9,14,1,28,5,12,1,2,4,4,1,8,1,2,1, + 4,253,12,5,255,128,114,102,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,10,0,0,0,5,0,0,0, + 67,0,0,0,115,44,1,0,0,116,0,106,1,106,2,100, + 1,117,0,114,20,116,3,100,2,131,1,130,1,116,4,160, 5,124,0,161,1,125,0,116,6,124,0,131,1,92,2,125, - 4,125,5,124,5,160,7,100,6,161,1,92,3,125,6,125, - 7,125,8,116,8,106,9,106,10,125,9,124,9,100,1,117, - 0,114,114,116,11,100,7,131,1,130,1,100,4,160,12,124, - 6,114,126,124,6,110,2,124,8,124,7,124,9,103,3,161, - 1,125,10,124,2,100,1,117,0,114,172,116,8,106,13,106, - 14,100,8,107,2,114,164,100,4,125,2,110,8,116,8,106, - 13,106,14,125,2,116,15,124,2,131,1,125,2,124,2,100, - 4,107,3,114,224,124,2,160,16,161,0,115,210,116,17,100, - 9,160,18,124,2,161,1,131,1,130,1,100,10,160,18,124, - 10,116,19,124,2,161,3,125,10,124,10,116,20,100,8,25, - 0,23,0,125,11,116,8,106,21,100,1,117,1,144,1,114, - 76,116,22,124,4,131,1,144,1,115,16,116,23,116,4,160, - 24,161,0,124,4,131,2,125,4,124,4,100,5,25,0,100, - 11,107,2,144,1,114,56,124,4,100,8,25,0,116,25,118, - 1,144,1,114,56,124,4,100,12,100,1,133,2,25,0,125, - 4,116,23,116,8,106,21,124,4,160,26,116,25,161,1,124, - 11,131,3,83,0,116,23,124,4,116,27,124,11,131,3,83, - 0,41,13,97,254,2,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,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,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, - 10,10,32,32,32,32,84,104,101,32,39,111,112,116,105,109, - 105,122,97,116,105,111,110,39,32,112,97,114,97,109,101,116, - 101,114,32,99,111,110,116,114,111,108,115,32,116,104,101,32, - 112,114,101,115,117,109,101,100,32,111,112,116,105,109,105,122, - 97,116,105,111,110,32,108,101,118,101,108,32,111,102,10,32, - 32,32,32,116,104,101,32,98,121,116,101,99,111,100,101,32, - 102,105,108,101,46,32,73,102,32,39,111,112,116,105,109,105, - 122,97,116,105,111,110,39,32,105,115,32,110,111,116,32,78, - 111,110,101,44,32,116,104,101,32,115,116,114,105,110,103,32, - 114,101,112,114,101,115,101,110,116,97,116,105,111,110,10,32, - 32,32,32,111,102,32,116,104,101,32,97,114,103,117,109,101, - 110,116,32,105,115,32,116,97,107,101,110,32,97,110,100,32, - 118,101,114,105,102,105,101,100,32,116,111,32,98,101,32,97, - 108,112,104,97,110,117,109,101,114,105,99,32,40,101,108,115, - 101,32,86,97,108,117,101,69,114,114,111,114,10,32,32,32, - 32,105,115,32,114,97,105,115,101,100,41,46,10,10,32,32, - 32,32,84,104,101,32,100,101,98,117,103,95,111,118,101,114, - 114,105,100,101,32,112,97,114,97,109,101,116,101,114,32,105, - 115,32,100,101,112,114,101,99,97,116,101,100,46,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,10,32,32,32, - 32,97,32,84,114,117,101,32,118,97,108,117,101,32,105,115, - 32,116,104,101,32,115,97,109,101,32,97,115,32,115,101,116, - 116,105,110,103,32,39,111,112,116,105,109,105,122,97,116,105, - 111,110,39,32,116,111,32,116,104,101,32,101,109,112,116,121, - 32,115,116,114,105,110,103,10,32,32,32,32,119,104,105,108, - 101,32,97,32,70,97,108,115,101,32,118,97,108,117,101,32, - 105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111, - 32,115,101,116,116,105,110,103,32,39,111,112,116,105,109,105, - 122,97,116,105,111,110,39,32,116,111,32,39,49,39,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,122,70,116,104,101,32,100,101,98, - 117,103,95,111,118,101,114,114,105,100,101,32,112,97,114,97, - 109,101,116,101,114,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,59,32,117,115,101,32,39,111,112,116,105,109,105, - 122,97,116,105,111,110,39,32,105,110,115,116,101,97,100,122, - 50,100,101,98,117,103,95,111,118,101,114,114,105,100,101,32, - 111,114,32,111,112,116,105,109,105,122,97,116,105,111,110,32, - 109,117,115,116,32,98,101,32,115,101,116,32,116,111,32,78, - 111,110,101,114,10,0,0,0,114,3,0,0,0,218,1,46, - 250,36,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,114,0,0,0,0,122,24,123,33,114, - 125,32,105,115,32,110,111,116,32,97,108,112,104,97,110,117, - 109,101,114,105,99,122,7,123,125,46,123,125,123,125,114,11, - 0,0,0,114,39,0,0,0,41,28,218,9,95,119,97,114, - 110,105,110,103,115,218,4,119,97,114,110,218,18,68,101,112, - 114,101,99,97,116,105,111,110,87,97,114,110,105,110,103,218, - 9,84,121,112,101,69,114,114,111,114,114,18,0,0,0,218, - 6,102,115,112,97,116,104,114,55,0,0,0,114,49,0,0, - 0,114,15,0,0,0,218,14,105,109,112,108,101,109,101,110, - 116,97,116,105,111,110,218,9,99,97,99,104,101,95,116,97, - 103,218,19,78,111,116,73,109,112,108,101,109,101,110,116,101, - 100,69,114,114,111,114,114,46,0,0,0,114,16,0,0,0, - 218,8,111,112,116,105,109,105,122,101,218,3,115,116,114,218, - 7,105,115,97,108,110,117,109,218,10,86,97,108,117,101,69, - 114,114,111,114,114,70,0,0,0,218,4,95,79,80,84,218, - 17,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88, - 69,83,218,14,112,121,99,97,99,104,101,95,112,114,101,102, - 105,120,114,67,0,0,0,114,48,0,0,0,114,63,0,0, - 0,114,42,0,0,0,218,6,108,115,116,114,105,112,218,8, - 95,80,89,67,65,67,72,69,41,12,114,52,0,0,0,90, - 14,100,101,98,117,103,95,111,118,101,114,114,105,100,101,114, - 78,0,0,0,218,7,109,101,115,115,97,103,101,218,4,104, - 101,97,100,114,54,0,0,0,90,4,98,97,115,101,114,6, - 0,0,0,218,4,114,101,115,116,90,3,116,97,103,90,15, - 97,108,109,111,115,116,95,102,105,108,101,110,97,109,101,218, - 8,102,105,108,101,110,97,109,101,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,17,99,97,99,104,101,95, - 102,114,111,109,95,115,111,117,114,99,101,85,1,0,0,115, - 74,0,0,0,8,18,6,1,2,1,4,255,8,2,4,1, - 8,1,12,1,10,1,12,1,16,1,8,1,8,1,8,1, - 24,1,8,1,12,1,6,1,8,2,8,1,8,1,8,1, - 14,1,14,1,12,1,12,1,10,9,14,1,28,5,12,1, - 2,4,4,1,8,1,2,1,4,253,12,5,255,128,114,102, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 10,0,0,0,5,0,0,0,67,0,0,0,115,44,1,0, - 0,116,0,106,1,106,2,100,1,117,0,114,20,116,3,100, - 2,131,1,130,1,116,4,160,5,124,0,161,1,125,0,116, - 6,124,0,131,1,92,2,125,1,125,2,100,3,125,3,116, - 0,106,7,100,1,117,1,114,102,116,0,106,7,160,8,116, - 9,161,1,125,4,124,1,160,10,124,4,116,11,23,0,161, - 1,114,102,124,1,116,12,124,4,131,1,100,1,133,2,25, - 0,125,1,100,4,125,3,124,3,115,144,116,6,124,1,131, - 1,92,2,125,1,125,5,124,5,116,13,107,3,114,144,116, - 14,116,13,155,0,100,5,124,0,155,2,157,3,131,1,130, - 1,124,2,160,15,100,6,161,1,125,6,124,6,100,7,118, - 1,114,176,116,14,100,8,124,2,155,2,157,2,131,1,130, - 1,124,6,100,9,107,2,144,1,114,12,124,2,160,16,100, - 6,100,10,161,2,100,11,25,0,125,7,124,7,160,10,116, - 17,161,1,115,226,116,14,100,12,116,17,155,2,157,2,131, - 1,130,1,124,7,116,12,116,17,131,1,100,1,133,2,25, - 0,125,8,124,8,160,18,161,0,144,1,115,12,116,14,100, - 13,124,7,155,2,100,14,157,3,131,1,130,1,124,2,160, - 19,100,6,161,1,100,15,25,0,125,9,116,20,124,1,124, - 9,116,21,100,15,25,0,23,0,131,2,83,0,41,16,97, - 110,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,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,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,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,47,52,56,56,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,114,80,0,0,0,70,84,122,31,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,114,79,0,0,0, - 62,2,0,0,0,114,39,0,0,0,114,65,0,0,0,122, - 29,101,120,112,101,99,116,101,100,32,111,110,108,121,32,50, - 32,111,114,32,51,32,100,111,116,115,32,105,110,32,114,65, - 0,0,0,114,39,0,0,0,233,254,255,255,255,122,53,111, - 112,116,105,109,105,122,97,116,105,111,110,32,112,111,114,116, - 105,111,110,32,111,102,32,102,105,108,101,110,97,109,101,32, - 100,111,101,115,32,110,111,116,32,115,116,97,114,116,32,119, - 105,116,104,32,122,19,111,112,116,105,109,105,122,97,116,105, - 111,110,32,108,101,118,101,108,32,122,29,32,105,115,32,110, - 111,116,32,97,110,32,97,108,112,104,97,110,117,109,101,114, - 105,99,32,118,97,108,117,101,114,0,0,0,0,41,22,114, - 15,0,0,0,114,86,0,0,0,114,87,0,0,0,114,88, - 0,0,0,114,18,0,0,0,114,85,0,0,0,114,55,0, - 0,0,114,95,0,0,0,114,41,0,0,0,114,42,0,0, - 0,114,23,0,0,0,114,45,0,0,0,114,4,0,0,0, - 114,97,0,0,0,114,92,0,0,0,218,5,99,111,117,110, - 116,114,51,0,0,0,114,93,0,0,0,114,91,0,0,0, - 218,9,112,97,114,116,105,116,105,111,110,114,48,0,0,0, - 218,15,83,79,85,82,67,69,95,83,85,70,70,73,88,69, - 83,41,10,114,52,0,0,0,114,99,0,0,0,90,16,112, - 121,99,97,99,104,101,95,102,105,108,101,110,97,109,101,90, - 23,102,111,117,110,100,95,105,110,95,112,121,99,97,99,104, - 101,95,112,114,101,102,105,120,90,13,115,116,114,105,112,112, - 101,100,95,112,97,116,104,90,7,112,121,99,97,99,104,101, - 90,9,100,111,116,95,99,111,117,110,116,114,78,0,0,0, - 90,9,111,112,116,95,108,101,118,101,108,90,13,98,97,115, - 101,95,102,105,108,101,110,97,109,101,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,17,115,111,117,114,99, - 101,95,102,114,111,109,95,99,97,99,104,101,156,1,0,0, - 115,62,0,0,0,12,9,8,1,10,1,12,1,4,1,10, - 1,12,1,14,1,16,1,4,1,4,1,12,1,8,1,8, - 1,2,1,8,255,10,2,8,1,14,1,10,1,16,1,10, - 1,4,1,2,1,8,255,16,2,10,1,16,1,14,2,18, - 1,255,128,114,107,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,5,0,0,0,9,0,0,0,67,0,0, - 0,115,124,0,0,0,116,0,124,0,131,1,100,1,107,2, - 114,16,100,2,83,0,124,0,160,1,100,3,161,1,92,3, - 125,1,125,2,125,3,124,1,114,56,124,3,160,2,161,0, - 100,4,100,5,133,2,25,0,100,6,107,3,114,60,124,0, - 83,0,122,12,116,3,124,0,131,1,125,4,87,0,110,34, - 4,0,116,4,116,5,102,2,121,106,1,0,1,0,1,0, - 124,0,100,2,100,5,133,2,25,0,125,4,89,0,110,2, - 119,0,116,6,124,4,131,1,114,120,124,4,83,0,124,0, - 83,0,41,7,122,188,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,114,0,0,0,0,78,114,79,0,0,0,233,253,255, - 255,255,233,255,255,255,255,90,2,112,121,41,7,114,4,0, - 0,0,114,49,0,0,0,218,5,108,111,119,101,114,114,107, - 0,0,0,114,88,0,0,0,114,92,0,0,0,114,62,0, - 0,0,41,5,218,13,98,121,116,101,99,111,100,101,95,112, - 97,116,104,114,100,0,0,0,114,53,0,0,0,90,9,101, - 120,116,101,110,115,105,111,110,218,11,115,111,117,114,99,101, - 95,112,97,116,104,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,15,95,103,101,116,95,115,111,117,114,99, - 101,102,105,108,101,196,1,0,0,115,22,0,0,0,12,7, - 4,1,16,1,24,1,4,1,2,1,12,1,16,1,18,1, - 16,1,255,128,114,113,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,8,0,0,0,67,0, - 0,0,115,68,0,0,0,124,0,160,0,116,1,116,2,131, - 1,161,1,114,46,122,10,116,3,124,0,131,1,87,0,83, - 0,4,0,116,4,121,44,1,0,1,0,1,0,89,0,100, - 0,83,0,119,0,124,0,160,0,116,1,116,5,131,1,161, - 1,114,64,124,0,83,0,100,0,83,0,169,1,78,41,6, - 218,8,101,110,100,115,119,105,116,104,218,5,116,117,112,108, - 101,114,106,0,0,0,114,102,0,0,0,114,88,0,0,0, - 114,94,0,0,0,41,1,114,101,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,11,95,103,101, - 116,95,99,97,99,104,101,100,215,1,0,0,115,18,0,0, - 0,14,1,2,1,10,1,12,1,8,1,14,1,4,1,4, - 2,255,128,114,117,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,8,0,0,0,67,0,0, - 0,115,50,0,0,0,122,14,116,0,124,0,131,1,106,1, - 125,1,87,0,110,22,4,0,116,2,121,36,1,0,1,0, - 1,0,100,1,125,1,89,0,110,2,119,0,124,1,100,2, - 79,0,125,1,124,1,83,0,41,4,122,51,67,97,108,99, - 117,108,97,116,101,32,116,104,101,32,109,111,100,101,32,112, - 101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,97, - 32,98,121,116,101,99,111,100,101,32,102,105,108,101,46,114, - 68,0,0,0,233,128,0,0,0,78,41,3,114,57,0,0, - 0,114,59,0,0,0,114,58,0,0,0,41,2,114,52,0, - 0,0,114,60,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,10,95,99,97,108,99,95,109,111, - 100,101,227,1,0,0,115,14,0,0,0,2,2,14,1,12, - 1,10,1,8,3,4,1,255,128,114,119,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, - 0,0,0,3,0,0,0,115,52,0,0,0,100,6,135,0, - 102,1,100,2,100,3,132,9,125,1,116,0,100,1,117,1, - 114,30,116,0,106,1,125,2,110,8,100,4,100,5,132,0, - 125,2,124,2,124,1,136,0,131,2,1,0,124,1,83,0, - 41,7,122,252,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,0,0,0,0,4,0, - 0,0,4,0,0,0,31,0,0,0,115,72,0,0,0,124, - 1,100,0,117,0,114,16,124,0,106,0,125,1,110,32,124, - 0,106,0,124,1,107,3,114,48,116,1,100,1,124,0,106, - 0,124,1,102,2,22,0,124,1,100,2,141,2,130,1,136, - 0,124,0,124,1,103,2,124,2,162,1,82,0,105,0,124, - 3,164,1,142,1,83,0,41,3,78,122,30,108,111,97,100, - 101,114,32,102,111,114,32,37,115,32,99,97,110,110,111,116, - 32,104,97,110,100,108,101,32,37,115,169,1,218,4,110,97, - 109,101,41,2,114,121,0,0,0,218,11,73,109,112,111,114, - 116,69,114,114,111,114,41,4,218,4,115,101,108,102,114,121, - 0,0,0,218,4,97,114,103,115,218,6,107,119,97,114,103, - 115,169,1,218,6,109,101,116,104,111,100,114,7,0,0,0, - 114,8,0,0,0,218,19,95,99,104,101,99,107,95,110,97, - 109,101,95,119,114,97,112,112,101,114,247,1,0,0,115,20, - 0,0,0,8,1,8,1,10,1,4,1,8,1,2,255,2, - 1,6,255,24,2,255,128,122,40,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,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,7,0,0,0,83,0,0,0,115,56,0,0,0,100, - 1,68,0,93,32,125,2,116,0,124,1,124,2,131,2,114, - 4,116,1,124,0,124,2,116,2,124,1,124,2,131,2,131, - 3,1,0,113,4,124,0,106,3,160,4,124,1,106,3,161, - 1,1,0,100,0,83,0,41,2,78,41,4,218,10,95,95, - 109,111,100,117,108,101,95,95,218,8,95,95,110,97,109,101, - 95,95,218,12,95,95,113,117,97,108,110,97,109,101,95,95, - 218,7,95,95,100,111,99,95,95,41,5,218,7,104,97,115, - 97,116,116,114,218,7,115,101,116,97,116,116,114,218,7,103, - 101,116,97,116,116,114,218,8,95,95,100,105,99,116,95,95, - 218,6,117,112,100,97,116,101,41,3,90,3,110,101,119,90, - 3,111,108,100,114,75,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,5,95,119,114,97,112,4, - 2,0,0,115,12,0,0,0,8,1,10,1,18,1,2,128, - 18,1,255,128,122,26,95,99,104,101,99,107,95,110,97,109, - 101,46,60,108,111,99,97,108,115,62,46,95,119,114,97,112, - 41,1,78,41,2,218,10,95,98,111,111,116,115,116,114,97, - 112,114,138,0,0,0,41,3,114,127,0,0,0,114,128,0, - 0,0,114,138,0,0,0,114,7,0,0,0,114,126,0,0, - 0,114,8,0,0,0,218,11,95,99,104,101,99,107,95,110, - 97,109,101,239,1,0,0,115,14,0,0,0,14,8,8,10, - 8,1,8,2,10,6,4,1,255,128,114,140,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 6,0,0,0,67,0,0,0,115,60,0,0,0,124,0,160, - 0,124,1,161,1,92,2,125,2,125,3,124,2,100,1,117, - 0,114,56,116,1,124,3,131,1,114,56,100,2,125,4,116, - 2,160,3,124,4,160,4,124,3,100,3,25,0,161,1,116, - 5,161,2,1,0,124,2,83,0,41,4,122,155,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,10,10,32,32,32,32,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,32,105,110,32,102,97,118,111,114,32,111,102,32,102, - 105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,40, - 41,46,10,10,32,32,32,32,78,122,44,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,114,0,0,0,0,41,6,218,11, - 102,105,110,100,95,108,111,97,100,101,114,114,4,0,0,0, - 114,81,0,0,0,114,82,0,0,0,114,70,0,0,0,218, - 13,73,109,112,111,114,116,87,97,114,110,105,110,103,41,5, - 114,123,0,0,0,218,8,102,117,108,108,110,97,109,101,218, - 6,108,111,97,100,101,114,218,8,112,111,114,116,105,111,110, - 115,218,3,109,115,103,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,17,95,102,105,110,100,95,109,111,100, - 117,108,101,95,115,104,105,109,14,2,0,0,115,12,0,0, - 0,14,10,16,1,4,1,22,1,4,1,255,128,114,147,0, - 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,4,0,0,0,67,0,0,0,115,166,0,0,0, - 124,0,100,1,100,2,133,2,25,0,125,3,124,3,116,0, - 107,3,114,64,100,3,124,1,155,2,100,4,124,3,155,2, - 157,4,125,4,116,1,160,2,100,5,124,4,161,2,1,0, - 116,3,124,4,102,1,105,0,124,2,164,1,142,1,130,1, - 116,4,124,0,131,1,100,6,107,0,114,106,100,7,124,1, - 155,2,157,2,125,4,116,1,160,2,100,5,124,4,161,2, - 1,0,116,5,124,4,131,1,130,1,116,6,124,0,100,2, - 100,8,133,2,25,0,131,1,125,5,124,5,100,9,64,0, - 114,162,100,10,124,5,155,2,100,11,124,1,155,2,157,4, - 125,4,116,3,124,4,102,1,105,0,124,2,164,1,142,1, - 130,1,124,5,83,0,41,12,97,84,2,0,0,80,101,114, - 102,111,114,109,32,98,97,115,105,99,32,118,97,108,105,100, - 105,116,121,32,99,104,101,99,107,105,110,103,32,111,102,32, - 97,32,112,121,99,32,104,101,97,100,101,114,32,97,110,100, - 32,114,101,116,117,114,110,32,116,104,101,32,102,108,97,103, - 115,32,102,105,101,108,100,44,10,32,32,32,32,119,104,105, - 99,104,32,100,101,116,101,114,109,105,110,101,115,32,104,111, - 119,32,116,104,101,32,112,121,99,32,115,104,111,117,108,100, - 32,98,101,32,102,117,114,116,104,101,114,32,118,97,108,105, - 100,97,116,101,100,32,97,103,97,105,110,115,116,32,116,104, - 101,32,115,111,117,114,99,101,46,10,10,32,32,32,32,42, - 100,97,116,97,42,32,105,115,32,116,104,101,32,99,111,110, - 116,101,110,116,115,32,111,102,32,116,104,101,32,112,121,99, - 32,102,105,108,101,46,32,40,79,110,108,121,32,116,104,101, - 32,102,105,114,115,116,32,49,54,32,98,121,116,101,115,32, - 97,114,101,10,32,32,32,32,114,101,113,117,105,114,101,100, - 44,32,116,104,111,117,103,104,46,41,10,10,32,32,32,32, - 42,110,97,109,101,42,32,105,115,32,116,104,101,32,110,97, - 109,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, - 32,98,101,105,110,103,32,105,109,112,111,114,116,101,100,46, - 32,73,116,32,105,115,32,117,115,101,100,32,102,111,114,32, - 108,111,103,103,105,110,103,46,10,10,32,32,32,32,42,101, - 120,99,95,100,101,116,97,105,108,115,42,32,105,115,32,97, - 32,100,105,99,116,105,111,110,97,114,121,32,112,97,115,115, - 101,100,32,116,111,32,73,109,112,111,114,116,69,114,114,111, - 114,32,105,102,32,105,116,32,114,97,105,115,101,100,32,102, - 111,114,10,32,32,32,32,105,109,112,114,111,118,101,100,32, - 100,101,98,117,103,103,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,119,104,101,110, - 32,116,104,101,32,102,108,97,103,115,10,32,32,32,32,102, - 105,101,108,100,32,105,115,32,105,110,118,97,108,105,100,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, - 32,116,114,117,110,99,97,116,101,100,46,10,10,32,32,32, - 32,78,114,28,0,0,0,122,20,98,97,100,32,109,97,103, - 105,99,32,110,117,109,98,101,114,32,105,110,32,122,2,58, - 32,250,2,123,125,233,16,0,0,0,122,40,114,101,97,99, - 104,101,100,32,69,79,70,32,119,104,105,108,101,32,114,101, - 97,100,105,110,103,32,112,121,99,32,104,101,97,100,101,114, - 32,111,102,32,233,8,0,0,0,233,252,255,255,255,122,14, - 105,110,118,97,108,105,100,32,102,108,97,103,115,32,122,4, - 32,105,110,32,41,7,218,12,77,65,71,73,67,95,78,85, - 77,66,69,82,114,139,0,0,0,218,16,95,118,101,114,98, - 111,115,101,95,109,101,115,115,97,103,101,114,122,0,0,0, - 114,4,0,0,0,218,8,69,79,70,69,114,114,111,114,114, - 38,0,0,0,41,6,114,37,0,0,0,114,121,0,0,0, - 218,11,101,120,99,95,100,101,116,97,105,108,115,90,5,109, - 97,103,105,99,114,98,0,0,0,114,16,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,13,95, - 99,108,97,115,115,105,102,121,95,112,121,99,31,2,0,0, - 115,30,0,0,0,12,16,8,1,16,1,12,1,16,1,12, - 1,10,1,12,1,8,1,16,1,8,2,16,1,16,1,4, - 1,255,128,114,156,0,0,0,99,5,0,0,0,0,0,0, - 0,0,0,0,0,6,0,0,0,4,0,0,0,67,0,0, - 0,115,124,0,0,0,116,0,124,0,100,1,100,2,133,2, - 25,0,131,1,124,1,100,3,64,0,107,3,114,62,100,4, - 124,3,155,2,157,2,125,5,116,1,160,2,100,5,124,5, - 161,2,1,0,116,3,124,5,102,1,105,0,124,4,164,1, - 142,1,130,1,124,2,100,6,117,1,114,120,116,0,124,0, - 100,2,100,7,133,2,25,0,131,1,124,2,100,3,64,0, - 107,3,114,116,116,3,100,4,124,3,155,2,157,2,102,1, - 105,0,124,4,164,1,142,1,130,1,100,6,83,0,100,6, - 83,0,41,8,97,7,2,0,0,86,97,108,105,100,97,116, - 101,32,97,32,112,121,99,32,97,103,97,105,110,115,116,32, - 116,104,101,32,115,111,117,114,99,101,32,108,97,115,116,45, - 109,111,100,105,102,105,101,100,32,116,105,109,101,46,10,10, - 32,32,32,32,42,100,97,116,97,42,32,105,115,32,116,104, - 101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104, - 101,32,112,121,99,32,102,105,108,101,46,32,40,79,110,108, - 121,32,116,104,101,32,102,105,114,115,116,32,49,54,32,98, - 121,116,101,115,32,97,114,101,10,32,32,32,32,114,101,113, - 117,105,114,101,100,46,41,10,10,32,32,32,32,42,115,111, - 117,114,99,101,95,109,116,105,109,101,42,32,105,115,32,116, - 104,101,32,108,97,115,116,32,109,111,100,105,102,105,101,100, - 32,116,105,109,101,115,116,97,109,112,32,111,102,32,116,104, - 101,32,115,111,117,114,99,101,32,102,105,108,101,46,10,10, - 32,32,32,32,42,115,111,117,114,99,101,95,115,105,122,101, - 42,32,105,115,32,78,111,110,101,32,111,114,32,116,104,101, - 32,115,105,122,101,32,111,102,32,116,104,101,32,115,111,117, - 114,99,101,32,102,105,108,101,32,105,110,32,98,121,116,101, - 115,46,10,10,32,32,32,32,42,110,97,109,101,42,32,105, - 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, - 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105, - 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117, - 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46, - 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105, - 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110, - 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109, - 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32, - 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105, - 109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,110, - 103,46,10,10,32,32,32,32,65,110,32,73,109,112,111,114, - 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, - 32,105,102,32,116,104,101,32,98,121,116,101,99,111,100,101, - 32,105,115,32,115,116,97,108,101,46,10,10,32,32,32,32, - 114,150,0,0,0,233,12,0,0,0,114,27,0,0,0,122, - 22,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97, - 108,101,32,102,111,114,32,114,148,0,0,0,78,114,149,0, - 0,0,41,4,114,38,0,0,0,114,139,0,0,0,114,153, - 0,0,0,114,122,0,0,0,41,6,114,37,0,0,0,218, - 12,115,111,117,114,99,101,95,109,116,105,109,101,218,11,115, - 111,117,114,99,101,95,115,105,122,101,114,121,0,0,0,114, - 155,0,0,0,114,98,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,23,95,118,97,108,105,100, - 97,116,101,95,116,105,109,101,115,116,97,109,112,95,112,121, - 99,64,2,0,0,115,20,0,0,0,24,19,10,1,12,1, - 16,1,8,1,22,1,2,255,22,2,8,254,255,128,114,160, - 0,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,42,0,0, - 0,124,0,100,1,100,2,133,2,25,0,124,1,107,3,114, - 38,116,0,100,3,124,2,155,2,157,2,102,1,105,0,124, - 3,164,1,142,1,130,1,100,4,83,0,41,5,97,243,1, - 0,0,86,97,108,105,100,97,116,101,32,97,32,104,97,115, - 104,45,98,97,115,101,100,32,112,121,99,32,98,121,32,99, - 104,101,99,107,105,110,103,32,116,104,101,32,114,101,97,108, - 32,115,111,117,114,99,101,32,104,97,115,104,32,97,103,97, - 105,110,115,116,32,116,104,101,32,111,110,101,32,105,110,10, - 32,32,32,32,116,104,101,32,112,121,99,32,104,101,97,100, - 101,114,46,10,10,32,32,32,32,42,100,97,116,97,42,32, + 1,125,2,100,3,125,3,116,0,106,7,100,1,117,1,114, + 102,116,0,106,7,160,8,116,9,161,1,125,4,124,1,160, + 10,124,4,116,11,23,0,161,1,114,102,124,1,116,12,124, + 4,131,1,100,1,133,2,25,0,125,1,100,4,125,3,124, + 3,115,144,116,6,124,1,131,1,92,2,125,1,125,5,124, + 5,116,13,107,3,114,144,116,14,116,13,155,0,100,5,124, + 0,155,2,157,3,131,1,130,1,124,2,160,15,100,6,161, + 1,125,6,124,6,100,7,118,1,114,176,116,14,100,8,124, + 2,155,2,157,2,131,1,130,1,124,6,100,9,107,2,144, + 1,114,12,124,2,160,16,100,6,100,10,161,2,100,11,25, + 0,125,7,124,7,160,10,116,17,161,1,115,226,116,14,100, + 12,116,17,155,2,157,2,131,1,130,1,124,7,116,12,116, + 17,131,1,100,1,133,2,25,0,125,8,124,8,160,18,161, + 0,144,1,115,12,116,14,100,13,124,7,155,2,100,14,157, + 3,131,1,130,1,124,2,160,19,100,6,161,1,100,15,25, + 0,125,9,116,20,124,1,124,9,116,21,100,15,25,0,23, + 0,131,2,83,0,41,16,97,110,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,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,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,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,47,52,56, + 56,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,114,80,0,0,0, + 70,84,122,31,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,114,79,0,0,0,62,2,0,0,0,114,39,0, + 0,0,114,65,0,0,0,122,29,101,120,112,101,99,116,101, + 100,32,111,110,108,121,32,50,32,111,114,32,51,32,100,111, + 116,115,32,105,110,32,114,65,0,0,0,114,39,0,0,0, + 233,254,255,255,255,122,53,111,112,116,105,109,105,122,97,116, + 105,111,110,32,112,111,114,116,105,111,110,32,111,102,32,102, + 105,108,101,110,97,109,101,32,100,111,101,115,32,110,111,116, + 32,115,116,97,114,116,32,119,105,116,104,32,122,19,111,112, + 116,105,109,105,122,97,116,105,111,110,32,108,101,118,101,108, + 32,122,29,32,105,115,32,110,111,116,32,97,110,32,97,108, + 112,104,97,110,117,109,101,114,105,99,32,118,97,108,117,101, + 114,0,0,0,0,41,22,114,15,0,0,0,114,86,0,0, + 0,114,87,0,0,0,114,88,0,0,0,114,18,0,0,0, + 114,85,0,0,0,114,55,0,0,0,114,95,0,0,0,114, + 41,0,0,0,114,42,0,0,0,114,23,0,0,0,114,45, + 0,0,0,114,4,0,0,0,114,97,0,0,0,114,92,0, + 0,0,218,5,99,111,117,110,116,114,51,0,0,0,114,93, + 0,0,0,114,91,0,0,0,218,9,112,97,114,116,105,116, + 105,111,110,114,48,0,0,0,218,15,83,79,85,82,67,69, + 95,83,85,70,70,73,88,69,83,41,10,114,52,0,0,0, + 114,99,0,0,0,90,16,112,121,99,97,99,104,101,95,102, + 105,108,101,110,97,109,101,90,23,102,111,117,110,100,95,105, + 110,95,112,121,99,97,99,104,101,95,112,114,101,102,105,120, + 90,13,115,116,114,105,112,112,101,100,95,112,97,116,104,90, + 7,112,121,99,97,99,104,101,90,9,100,111,116,95,99,111, + 117,110,116,114,78,0,0,0,90,9,111,112,116,95,108,101, + 118,101,108,90,13,98,97,115,101,95,102,105,108,101,110,97, + 109,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,17,115,111,117,114,99,101,95,102,114,111,109,95,99, + 97,99,104,101,156,1,0,0,115,62,0,0,0,12,9,8, + 1,10,1,12,1,4,1,10,1,12,1,14,1,16,1,4, + 1,4,1,12,1,8,1,8,1,2,1,8,255,10,2,8, + 1,14,1,10,1,16,1,10,1,4,1,2,1,8,255,16, + 2,10,1,16,1,14,2,18,1,255,128,114,107,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,9,0,0,0,67,0,0,0,115,122,0,0,0,116,0, + 124,0,131,1,100,1,107,2,114,16,100,2,83,0,124,0, + 160,1,100,3,161,1,92,3,125,1,125,2,125,3,124,1, + 114,56,124,3,160,2,161,0,100,4,100,5,133,2,25,0, + 100,6,107,3,114,60,124,0,83,0,122,12,116,3,124,0, + 131,1,125,4,87,0,110,30,4,0,116,4,116,5,102,2, + 121,120,1,0,1,0,1,0,124,0,100,2,100,5,133,2, + 25,0,125,4,89,0,116,6,124,4,131,1,114,116,124,4, + 83,0,124,0,83,0,119,0,41,7,122,188,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,114,0,0,0,0,78,114,79, + 0,0,0,233,253,255,255,255,233,255,255,255,255,90,2,112, + 121,41,7,114,4,0,0,0,114,49,0,0,0,218,5,108, + 111,119,101,114,114,107,0,0,0,114,88,0,0,0,114,92, + 0,0,0,114,62,0,0,0,41,5,218,13,98,121,116,101, + 99,111,100,101,95,112,97,116,104,114,100,0,0,0,114,53, + 0,0,0,90,9,101,120,116,101,110,115,105,111,110,218,11, + 115,111,117,114,99,101,95,112,97,116,104,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,15,95,103,101,116, + 95,115,111,117,114,99,101,102,105,108,101,196,1,0,0,115, + 24,0,0,0,12,7,4,1,16,1,24,1,4,1,2,1, + 12,1,16,1,14,1,16,1,2,254,255,128,114,113,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,8,0,0,0,67,0,0,0,115,68,0,0,0,124, + 0,160,0,116,1,116,2,131,1,161,1,114,44,122,10,116, + 3,124,0,131,1,87,0,83,0,4,0,116,4,121,66,1, + 0,1,0,1,0,89,0,100,0,83,0,124,0,160,0,116, + 1,116,5,131,1,161,1,114,62,124,0,83,0,100,0,83, + 0,119,0,169,1,78,41,6,218,8,101,110,100,115,119,105, + 116,104,218,5,116,117,112,108,101,114,106,0,0,0,114,102, + 0,0,0,114,88,0,0,0,114,94,0,0,0,41,1,114, + 101,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, + 215,1,0,0,115,20,0,0,0,14,1,2,1,10,1,12, + 1,6,1,14,1,4,1,4,2,2,251,255,128,114,117,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,8,0,0,0,67,0,0,0,115,48,0,0,0, + 122,14,116,0,124,0,131,1,106,1,125,1,87,0,110,18, + 4,0,116,2,121,46,1,0,1,0,1,0,100,1,125,1, + 89,0,124,1,100,2,79,0,125,1,124,1,83,0,119,0, + 41,4,122,51,67,97,108,99,117,108,97,116,101,32,116,104, + 101,32,109,111,100,101,32,112,101,114,109,105,115,115,105,111, + 110,115,32,102,111,114,32,97,32,98,121,116,101,99,111,100, + 101,32,102,105,108,101,46,114,68,0,0,0,233,128,0,0, + 0,78,41,3,114,57,0,0,0,114,59,0,0,0,114,58, + 0,0,0,41,2,114,52,0,0,0,114,60,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, + 95,99,97,108,99,95,109,111,100,101,227,1,0,0,115,16, + 0,0,0,2,2,14,1,12,1,6,1,8,3,4,1,2, + 251,255,128,114,119,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,4,0,0,0,3,0,0, + 0,115,52,0,0,0,100,6,135,0,102,1,100,2,100,3, + 132,9,125,1,116,0,100,1,117,1,114,30,116,0,106,1, + 125,2,110,8,100,4,100,5,132,0,125,2,124,2,124,1, + 136,0,131,2,1,0,124,1,83,0,41,7,122,252,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,0,0,0,0,4,0,0,0,4,0,0,0, + 31,0,0,0,115,72,0,0,0,124,1,100,0,117,0,114, + 16,124,0,106,0,125,1,110,32,124,0,106,0,124,1,107, + 3,114,48,116,1,100,1,124,0,106,0,124,1,102,2,22, + 0,124,1,100,2,141,2,130,1,136,0,124,0,124,1,103, + 2,124,2,162,1,82,0,105,0,124,3,164,1,142,1,83, + 0,41,3,78,122,30,108,111,97,100,101,114,32,102,111,114, + 32,37,115,32,99,97,110,110,111,116,32,104,97,110,100,108, + 101,32,37,115,169,1,218,4,110,97,109,101,41,2,114,121, + 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, + 41,4,218,4,115,101,108,102,114,121,0,0,0,218,4,97, + 114,103,115,218,6,107,119,97,114,103,115,169,1,218,6,109, + 101,116,104,111,100,114,7,0,0,0,114,8,0,0,0,218, + 19,95,99,104,101,99,107,95,110,97,109,101,95,119,114,97, + 112,112,101,114,247,1,0,0,115,20,0,0,0,8,1,8, + 1,10,1,4,1,8,1,2,255,2,1,6,255,24,2,255, + 128,122,40,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,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0, + 83,0,0,0,115,56,0,0,0,100,1,68,0,93,32,125, + 2,116,0,124,1,124,2,131,2,114,4,116,1,124,0,124, + 2,116,2,124,1,124,2,131,2,131,3,1,0,113,4,124, + 0,106,3,160,4,124,1,106,3,161,1,1,0,100,0,83, + 0,41,2,78,41,4,218,10,95,95,109,111,100,117,108,101, + 95,95,218,8,95,95,110,97,109,101,95,95,218,12,95,95, + 113,117,97,108,110,97,109,101,95,95,218,7,95,95,100,111, + 99,95,95,41,5,218,7,104,97,115,97,116,116,114,218,7, + 115,101,116,97,116,116,114,218,7,103,101,116,97,116,116,114, + 218,8,95,95,100,105,99,116,95,95,218,6,117,112,100,97, + 116,101,41,3,90,3,110,101,119,90,3,111,108,100,114,75, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,5,95,119,114,97,112,4,2,0,0,115,12,0, + 0,0,8,1,10,1,18,1,2,128,18,1,255,128,122,26, + 95,99,104,101,99,107,95,110,97,109,101,46,60,108,111,99, + 97,108,115,62,46,95,119,114,97,112,41,1,78,41,2,218, + 10,95,98,111,111,116,115,116,114,97,112,114,138,0,0,0, + 41,3,114,127,0,0,0,114,128,0,0,0,114,138,0,0, + 0,114,7,0,0,0,114,126,0,0,0,114,8,0,0,0, + 218,11,95,99,104,101,99,107,95,110,97,109,101,239,1,0, + 0,115,14,0,0,0,14,8,8,10,8,1,8,2,10,6, + 4,1,255,128,114,140,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,6,0,0,0,67,0, + 0,0,115,60,0,0,0,124,0,160,0,124,1,161,1,92, + 2,125,2,125,3,124,2,100,1,117,0,114,56,116,1,124, + 3,131,1,114,56,100,2,125,4,116,2,160,3,124,4,160, + 4,124,3,100,3,25,0,161,1,116,5,161,2,1,0,124, + 2,83,0,41,4,122,155,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,10,10,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,32,105,110,32, + 102,97,118,111,114,32,111,102,32,102,105,110,100,101,114,46, + 102,105,110,100,95,115,112,101,99,40,41,46,10,10,32,32, + 32,32,78,122,44,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,114,0,0,0,0,41,6,218,11,102,105,110,100,95,108, + 111,97,100,101,114,114,4,0,0,0,114,81,0,0,0,114, + 82,0,0,0,114,70,0,0,0,218,13,73,109,112,111,114, + 116,87,97,114,110,105,110,103,41,5,114,123,0,0,0,218, + 8,102,117,108,108,110,97,109,101,218,6,108,111,97,100,101, + 114,218,8,112,111,114,116,105,111,110,115,218,3,109,115,103, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 17,95,102,105,110,100,95,109,111,100,117,108,101,95,115,104, + 105,109,14,2,0,0,115,12,0,0,0,14,10,16,1,4, + 1,22,1,4,1,255,128,114,147,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, + 0,67,0,0,0,115,166,0,0,0,124,0,100,1,100,2, + 133,2,25,0,125,3,124,3,116,0,107,3,114,64,100,3, + 124,1,155,2,100,4,124,3,155,2,157,4,125,4,116,1, + 160,2,100,5,124,4,161,2,1,0,116,3,124,4,102,1, + 105,0,124,2,164,1,142,1,130,1,116,4,124,0,131,1, + 100,6,107,0,114,106,100,7,124,1,155,2,157,2,125,4, + 116,1,160,2,100,5,124,4,161,2,1,0,116,5,124,4, + 131,1,130,1,116,6,124,0,100,2,100,8,133,2,25,0, + 131,1,125,5,124,5,100,9,64,0,114,162,100,10,124,5, + 155,2,100,11,124,1,155,2,157,4,125,4,116,3,124,4, + 102,1,105,0,124,2,164,1,142,1,130,1,124,5,83,0, + 41,12,97,84,2,0,0,80,101,114,102,111,114,109,32,98, + 97,115,105,99,32,118,97,108,105,100,105,116,121,32,99,104, + 101,99,107,105,110,103,32,111,102,32,97,32,112,121,99,32, + 104,101,97,100,101,114,32,97,110,100,32,114,101,116,117,114, + 110,32,116,104,101,32,102,108,97,103,115,32,102,105,101,108, + 100,44,10,32,32,32,32,119,104,105,99,104,32,100,101,116, + 101,114,109,105,110,101,115,32,104,111,119,32,116,104,101,32, + 112,121,99,32,115,104,111,117,108,100,32,98,101,32,102,117, + 114,116,104,101,114,32,118,97,108,105,100,97,116,101,100,32, + 97,103,97,105,110,115,116,32,116,104,101,32,115,111,117,114, + 99,101,46,10,10,32,32,32,32,42,100,97,116,97,42,32, 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32, 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46, 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116, 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32, - 32,32,114,101,113,117,105,114,101,100,46,41,10,10,32,32, - 32,32,42,115,111,117,114,99,101,95,104,97,115,104,42,32, - 105,115,32,116,104,101,32,105,109,112,111,114,116,108,105,98, - 46,117,116,105,108,46,115,111,117,114,99,101,95,104,97,115, - 104,40,41,32,111,102,32,116,104,101,32,115,111,117,114,99, - 101,32,102,105,108,101,46,10,10,32,32,32,32,42,110,97, - 109,101,42,32,105,115,32,116,104,101,32,110,97,109,101,32, - 111,102,32,116,104,101,32,109,111,100,117,108,101,32,98,101, - 105,110,103,32,105,109,112,111,114,116,101,100,46,32,73,116, - 32,105,115,32,117,115,101,100,32,102,111,114,32,108,111,103, - 103,105,110,103,46,10,10,32,32,32,32,42,101,120,99,95, - 100,101,116,97,105,108,115,42,32,105,115,32,97,32,100,105, - 99,116,105,111,110,97,114,121,32,112,97,115,115,101,100,32, - 116,111,32,73,109,112,111,114,116,69,114,114,111,114,32,105, - 102,32,105,116,32,114,97,105,115,101,100,32,102,111,114,10, - 32,32,32,32,105,109,112,114,111,118,101,100,32,100,101,98, - 117,103,103,105,110,103,46,10,10,32,32,32,32,65,110,32, - 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114, - 97,105,115,101,100,32,105,102,32,116,104,101,32,98,121,116, - 101,99,111,100,101,32,105,115,32,115,116,97,108,101,46,10, - 10,32,32,32,32,114,150,0,0,0,114,149,0,0,0,122, - 46,104,97,115,104,32,105,110,32,98,121,116,101,99,111,100, - 101,32,100,111,101,115,110,39,116,32,109,97,116,99,104,32, - 104,97,115,104,32,111,102,32,115,111,117,114,99,101,32,78, - 41,1,114,122,0,0,0,41,4,114,37,0,0,0,218,11, - 115,111,117,114,99,101,95,104,97,115,104,114,121,0,0,0, - 114,155,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,18,95,118,97,108,105,100,97,116,101,95, - 104,97,115,104,95,112,121,99,92,2,0,0,115,16,0,0, - 0,16,17,2,1,8,1,4,255,2,2,6,254,4,255,255, - 128,114,162,0,0,0,99,4,0,0,0,0,0,0,0,0, - 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, - 76,0,0,0,116,0,160,1,124,0,161,1,125,4,116,2, - 124,4,116,3,131,2,114,56,116,4,160,5,100,1,124,2, - 161,2,1,0,124,3,100,2,117,1,114,52,116,6,160,7, - 124,4,124,3,161,2,1,0,124,4,83,0,116,8,100,3, - 160,9,124,2,161,1,124,1,124,2,100,4,141,3,130,1, - 41,5,122,35,67,111,109,112,105,108,101,32,98,121,116,101, - 99,111,100,101,32,97,115,32,102,111,117,110,100,32,105,110, - 32,97,32,112,121,99,46,122,21,99,111,100,101,32,111,98, - 106,101,99,116,32,102,114,111,109,32,123,33,114,125,78,122, - 23,78,111,110,45,99,111,100,101,32,111,98,106,101,99,116, - 32,105,110,32,123,33,114,125,169,2,114,121,0,0,0,114, - 52,0,0,0,41,10,218,7,109,97,114,115,104,97,108,90, - 5,108,111,97,100,115,218,10,105,115,105,110,115,116,97,110, - 99,101,218,10,95,99,111,100,101,95,116,121,112,101,114,139, - 0,0,0,114,153,0,0,0,218,4,95,105,109,112,90,16, - 95,102,105,120,95,99,111,95,102,105,108,101,110,97,109,101, - 114,122,0,0,0,114,70,0,0,0,41,5,114,37,0,0, - 0,114,121,0,0,0,114,111,0,0,0,114,112,0,0,0, - 218,4,99,111,100,101,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,17,95,99,111,109,112,105,108,101,95, - 98,121,116,101,99,111,100,101,116,2,0,0,115,20,0,0, - 0,10,2,10,1,12,1,8,1,12,1,4,1,10,2,4, - 1,6,255,255,128,114,169,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, - 0,0,0,115,70,0,0,0,116,0,116,1,131,1,125,3, - 124,3,160,2,116,3,100,1,131,1,161,1,1,0,124,3, - 160,2,116,3,124,1,131,1,161,1,1,0,124,3,160,2, - 116,3,124,2,131,1,161,1,1,0,124,3,160,2,116,4, - 160,5,124,0,161,1,161,1,1,0,124,3,83,0,41,3, - 122,43,80,114,111,100,117,99,101,32,116,104,101,32,100,97, - 116,97,32,102,111,114,32,97,32,116,105,109,101,115,116,97, - 109,112,45,98,97,115,101,100,32,112,121,99,46,114,0,0, - 0,0,78,41,6,218,9,98,121,116,101,97,114,114,97,121, - 114,152,0,0,0,218,6,101,120,116,101,110,100,114,33,0, - 0,0,114,164,0,0,0,218,5,100,117,109,112,115,41,4, - 114,168,0,0,0,218,5,109,116,105,109,101,114,159,0,0, - 0,114,37,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,22,95,99,111,100,101,95,116,111,95, - 116,105,109,101,115,116,97,109,112,95,112,121,99,129,2,0, - 0,115,14,0,0,0,8,2,14,1,14,1,14,1,16,1, - 4,1,255,128,114,174,0,0,0,84,99,3,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, - 0,0,0,115,80,0,0,0,116,0,116,1,131,1,125,3, - 100,1,124,2,100,1,62,0,66,0,125,4,124,3,160,2, - 116,3,124,4,131,1,161,1,1,0,116,4,124,1,131,1, - 100,2,107,2,115,50,74,0,130,1,124,3,160,2,124,1, - 161,1,1,0,124,3,160,2,116,5,160,6,124,0,161,1, - 161,1,1,0,124,3,83,0,41,4,122,38,80,114,111,100, + 32,32,114,101,113,117,105,114,101,100,44,32,116,104,111,117, + 103,104,46,41,10,10,32,32,32,32,42,110,97,109,101,42, + 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, + 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103, + 32,105,109,112,111,114,116,101,100,46,32,73,116,32,105,115, + 32,117,115,101,100,32,102,111,114,32,108,111,103,103,105,110, + 103,46,10,10,32,32,32,32,42,101,120,99,95,100,101,116, + 97,105,108,115,42,32,105,115,32,97,32,100,105,99,116,105, + 111,110,97,114,121,32,112,97,115,115,101,100,32,116,111,32, + 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105, + 116,32,114,97,105,115,101,100,32,102,111,114,10,32,32,32, + 32,105,109,112,114,111,118,101,100,32,100,101,98,117,103,103, + 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,119,104,101,110,32,116,104,101,32,102, + 108,97,103,115,10,32,32,32,32,102,105,101,108,100,32,105, + 115,32,105,110,118,97,108,105,100,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,32,116,114,117,110,99, + 97,116,101,100,46,10,10,32,32,32,32,78,114,28,0,0, + 0,122,20,98,97,100,32,109,97,103,105,99,32,110,117,109, + 98,101,114,32,105,110,32,122,2,58,32,250,2,123,125,233, + 16,0,0,0,122,40,114,101,97,99,104,101,100,32,69,79, + 70,32,119,104,105,108,101,32,114,101,97,100,105,110,103,32, + 112,121,99,32,104,101,97,100,101,114,32,111,102,32,233,8, + 0,0,0,233,252,255,255,255,122,14,105,110,118,97,108,105, + 100,32,102,108,97,103,115,32,122,4,32,105,110,32,41,7, + 218,12,77,65,71,73,67,95,78,85,77,66,69,82,114,139, + 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, + 115,115,97,103,101,114,122,0,0,0,114,4,0,0,0,218, + 8,69,79,70,69,114,114,111,114,114,38,0,0,0,41,6, + 114,37,0,0,0,114,121,0,0,0,218,11,101,120,99,95, + 100,101,116,97,105,108,115,90,5,109,97,103,105,99,114,98, + 0,0,0,114,16,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,13,95,99,108,97,115,115,105, + 102,121,95,112,121,99,31,2,0,0,115,30,0,0,0,12, + 16,8,1,16,1,12,1,16,1,12,1,10,1,12,1,8, + 1,16,1,8,2,16,1,16,1,4,1,255,128,114,156,0, + 0,0,99,5,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,4,0,0,0,67,0,0,0,115,124,0,0,0, + 116,0,124,0,100,1,100,2,133,2,25,0,131,1,124,1, + 100,3,64,0,107,3,114,62,100,4,124,3,155,2,157,2, + 125,5,116,1,160,2,100,5,124,5,161,2,1,0,116,3, + 124,5,102,1,105,0,124,4,164,1,142,1,130,1,124,2, + 100,6,117,1,114,120,116,0,124,0,100,2,100,7,133,2, + 25,0,131,1,124,2,100,3,64,0,107,3,114,116,116,3, + 100,4,124,3,155,2,157,2,102,1,105,0,124,4,164,1, + 142,1,130,1,100,6,83,0,100,6,83,0,41,8,97,7, + 2,0,0,86,97,108,105,100,97,116,101,32,97,32,112,121, + 99,32,97,103,97,105,110,115,116,32,116,104,101,32,115,111, + 117,114,99,101,32,108,97,115,116,45,109,111,100,105,102,105, + 101,100,32,116,105,109,101,46,10,10,32,32,32,32,42,100, + 97,116,97,42,32,105,115,32,116,104,101,32,99,111,110,116, + 101,110,116,115,32,111,102,32,116,104,101,32,112,121,99,32, + 102,105,108,101,46,32,40,79,110,108,121,32,116,104,101,32, + 102,105,114,115,116,32,49,54,32,98,121,116,101,115,32,97, + 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,46, + 41,10,10,32,32,32,32,42,115,111,117,114,99,101,95,109, + 116,105,109,101,42,32,105,115,32,116,104,101,32,108,97,115, + 116,32,109,111,100,105,102,105,101,100,32,116,105,109,101,115, + 116,97,109,112,32,111,102,32,116,104,101,32,115,111,117,114, + 99,101,32,102,105,108,101,46,10,10,32,32,32,32,42,115, + 111,117,114,99,101,95,115,105,122,101,42,32,105,115,32,78, + 111,110,101,32,111,114,32,116,104,101,32,115,105,122,101,32, + 111,102,32,116,104,101,32,115,111,117,114,99,101,32,102,105, + 108,101,32,105,110,32,98,121,116,101,115,46,10,10,32,32, + 32,32,42,110,97,109,101,42,32,105,115,32,116,104,101,32, + 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, + 108,101,32,98,101,105,110,103,32,105,109,112,111,114,116,101, + 100,46,32,73,116,32,105,115,32,117,115,101,100,32,102,111, + 114,32,108,111,103,103,105,110,103,46,10,10,32,32,32,32, + 42,101,120,99,95,100,101,116,97,105,108,115,42,32,105,115, + 32,97,32,100,105,99,116,105,111,110,97,114,121,32,112,97, + 115,115,101,100,32,116,111,32,73,109,112,111,114,116,69,114, + 114,111,114,32,105,102,32,105,116,32,114,97,105,115,101,100, + 32,102,111,114,10,32,32,32,32,105,109,112,114,111,118,101, + 100,32,100,101,98,117,103,103,105,110,103,46,10,10,32,32, + 32,32,65,110,32,73,109,112,111,114,116,69,114,114,111,114, + 32,105,115,32,114,97,105,115,101,100,32,105,102,32,116,104, + 101,32,98,121,116,101,99,111,100,101,32,105,115,32,115,116, + 97,108,101,46,10,10,32,32,32,32,114,150,0,0,0,233, + 12,0,0,0,114,27,0,0,0,122,22,98,121,116,101,99, + 111,100,101,32,105,115,32,115,116,97,108,101,32,102,111,114, + 32,114,148,0,0,0,78,114,149,0,0,0,41,4,114,38, + 0,0,0,114,139,0,0,0,114,153,0,0,0,114,122,0, + 0,0,41,6,114,37,0,0,0,218,12,115,111,117,114,99, + 101,95,109,116,105,109,101,218,11,115,111,117,114,99,101,95, + 115,105,122,101,114,121,0,0,0,114,155,0,0,0,114,98, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,23,95,118,97,108,105,100,97,116,101,95,116,105, + 109,101,115,116,97,109,112,95,112,121,99,64,2,0,0,115, + 20,0,0,0,24,19,10,1,12,1,16,1,8,1,22,1, + 2,255,22,2,8,254,255,128,114,160,0,0,0,99,4,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, + 0,0,67,0,0,0,115,42,0,0,0,124,0,100,1,100, + 2,133,2,25,0,124,1,107,3,114,38,116,0,100,3,124, + 2,155,2,157,2,102,1,105,0,124,3,164,1,142,1,130, + 1,100,4,83,0,41,5,97,243,1,0,0,86,97,108,105, + 100,97,116,101,32,97,32,104,97,115,104,45,98,97,115,101, + 100,32,112,121,99,32,98,121,32,99,104,101,99,107,105,110, + 103,32,116,104,101,32,114,101,97,108,32,115,111,117,114,99, + 101,32,104,97,115,104,32,97,103,97,105,110,115,116,32,116, + 104,101,32,111,110,101,32,105,110,10,32,32,32,32,116,104, + 101,32,112,121,99,32,104,101,97,100,101,114,46,10,10,32, + 32,32,32,42,100,97,116,97,42,32,105,115,32,116,104,101, + 32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101, + 32,112,121,99,32,102,105,108,101,46,32,40,79,110,108,121, + 32,116,104,101,32,102,105,114,115,116,32,49,54,32,98,121, + 116,101,115,32,97,114,101,10,32,32,32,32,114,101,113,117, + 105,114,101,100,46,41,10,10,32,32,32,32,42,115,111,117, + 114,99,101,95,104,97,115,104,42,32,105,115,32,116,104,101, + 32,105,109,112,111,114,116,108,105,98,46,117,116,105,108,46, + 115,111,117,114,99,101,95,104,97,115,104,40,41,32,111,102, + 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, + 46,10,10,32,32,32,32,42,110,97,109,101,42,32,105,115, + 32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101, + 32,109,111,100,117,108,101,32,98,101,105,110,103,32,105,109, + 112,111,114,116,101,100,46,32,73,116,32,105,115,32,117,115, + 101,100,32,102,111,114,32,108,111,103,103,105,110,103,46,10, + 10,32,32,32,32,42,101,120,99,95,100,101,116,97,105,108, + 115,42,32,105,115,32,97,32,100,105,99,116,105,111,110,97, + 114,121,32,112,97,115,115,101,100,32,116,111,32,73,109,112, + 111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,114, + 97,105,115,101,100,32,102,111,114,10,32,32,32,32,105,109, + 112,114,111,118,101,100,32,100,101,98,117,103,103,105,110,103, + 46,10,10,32,32,32,32,65,110,32,73,109,112,111,114,116, + 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,32, + 105,102,32,116,104,101,32,98,121,116,101,99,111,100,101,32, + 105,115,32,115,116,97,108,101,46,10,10,32,32,32,32,114, + 150,0,0,0,114,149,0,0,0,122,46,104,97,115,104,32, + 105,110,32,98,121,116,101,99,111,100,101,32,100,111,101,115, + 110,39,116,32,109,97,116,99,104,32,104,97,115,104,32,111, + 102,32,115,111,117,114,99,101,32,78,41,1,114,122,0,0, + 0,41,4,114,37,0,0,0,218,11,115,111,117,114,99,101, + 95,104,97,115,104,114,121,0,0,0,114,155,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,18, + 95,118,97,108,105,100,97,116,101,95,104,97,115,104,95,112, + 121,99,92,2,0,0,115,16,0,0,0,16,17,2,1,8, + 1,4,255,2,2,6,254,4,255,255,128,114,162,0,0,0, + 99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,5,0,0,0,67,0,0,0,115,76,0,0,0,116,0, + 160,1,124,0,161,1,125,4,116,2,124,4,116,3,131,2, + 114,56,116,4,160,5,100,1,124,2,161,2,1,0,124,3, + 100,2,117,1,114,52,116,6,160,7,124,4,124,3,161,2, + 1,0,124,4,83,0,116,8,100,3,160,9,124,2,161,1, + 124,1,124,2,100,4,141,3,130,1,41,5,122,35,67,111, + 109,112,105,108,101,32,98,121,116,101,99,111,100,101,32,97, + 115,32,102,111,117,110,100,32,105,110,32,97,32,112,121,99, + 46,122,21,99,111,100,101,32,111,98,106,101,99,116,32,102, + 114,111,109,32,123,33,114,125,78,122,23,78,111,110,45,99, + 111,100,101,32,111,98,106,101,99,116,32,105,110,32,123,33, + 114,125,169,2,114,121,0,0,0,114,52,0,0,0,41,10, + 218,7,109,97,114,115,104,97,108,90,5,108,111,97,100,115, + 218,10,105,115,105,110,115,116,97,110,99,101,218,10,95,99, + 111,100,101,95,116,121,112,101,114,139,0,0,0,114,153,0, + 0,0,218,4,95,105,109,112,90,16,95,102,105,120,95,99, + 111,95,102,105,108,101,110,97,109,101,114,122,0,0,0,114, + 70,0,0,0,41,5,114,37,0,0,0,114,121,0,0,0, + 114,111,0,0,0,114,112,0,0,0,218,4,99,111,100,101, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 17,95,99,111,109,112,105,108,101,95,98,121,116,101,99,111, + 100,101,116,2,0,0,115,20,0,0,0,10,2,10,1,12, + 1,8,1,12,1,4,1,10,2,4,1,6,255,255,128,114, + 169,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,5,0,0,0,67,0,0,0,115,70,0, + 0,0,116,0,116,1,131,1,125,3,124,3,160,2,116,3, + 100,1,131,1,161,1,1,0,124,3,160,2,116,3,124,1, + 131,1,161,1,1,0,124,3,160,2,116,3,124,2,131,1, + 161,1,1,0,124,3,160,2,116,4,160,5,124,0,161,1, + 161,1,1,0,124,3,83,0,41,3,122,43,80,114,111,100, 117,99,101,32,116,104,101,32,100,97,116,97,32,102,111,114, - 32,97,32,104,97,115,104,45,98,97,115,101,100,32,112,121, - 99,46,114,3,0,0,0,114,150,0,0,0,78,41,7,114, - 170,0,0,0,114,152,0,0,0,114,171,0,0,0,114,33, - 0,0,0,114,4,0,0,0,114,164,0,0,0,114,172,0, - 0,0,41,5,114,168,0,0,0,114,161,0,0,0,90,7, - 99,104,101,99,107,101,100,114,37,0,0,0,114,16,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,17,95,99,111,100,101,95,116,111,95,104,97,115,104,95, - 112,121,99,139,2,0,0,115,16,0,0,0,8,2,12,1, - 14,1,16,1,10,1,16,1,4,1,255,128,114,175,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,6,0,0,0,67,0,0,0,115,62,0,0,0,100, - 1,100,2,108,0,125,1,116,1,160,2,124,0,161,1,106, - 3,125,2,124,1,160,4,124,2,161,1,125,3,116,1,160, - 5,100,2,100,3,161,2,125,4,124,4,160,6,124,0,160, - 6,124,3,100,1,25,0,161,1,161,1,83,0,41,4,122, - 121,68,101,99,111,100,101,32,98,121,116,101,115,32,114,101, - 112,114,101,115,101,110,116,105,110,103,32,115,111,117,114,99, - 101,32,99,111,100,101,32,97,110,100,32,114,101,116,117,114, - 110,32,116,104,101,32,115,116,114,105,110,103,46,10,10,32, - 32,32,32,85,110,105,118,101,114,115,97,108,32,110,101,119, - 108,105,110,101,32,115,117,112,112,111,114,116,32,105,115,32, - 117,115,101,100,32,105,110,32,116,104,101,32,100,101,99,111, - 100,105,110,103,46,10,32,32,32,32,114,0,0,0,0,78, - 84,41,7,218,8,116,111,107,101,110,105,122,101,114,72,0, - 0,0,90,7,66,121,116,101,115,73,79,90,8,114,101,97, - 100,108,105,110,101,90,15,100,101,116,101,99,116,95,101,110, - 99,111,100,105,110,103,90,25,73,110,99,114,101,109,101,110, - 116,97,108,78,101,119,108,105,110,101,68,101,99,111,100,101, - 114,218,6,100,101,99,111,100,101,41,5,218,12,115,111,117, - 114,99,101,95,98,121,116,101,115,114,176,0,0,0,90,21, - 115,111,117,114,99,101,95,98,121,116,101,115,95,114,101,97, - 100,108,105,110,101,218,8,101,110,99,111,100,105,110,103,90, - 15,110,101,119,108,105,110,101,95,100,101,99,111,100,101,114, + 32,97,32,116,105,109,101,115,116,97,109,112,45,98,97,115, + 101,100,32,112,121,99,46,114,0,0,0,0,78,41,6,218, + 9,98,121,116,101,97,114,114,97,121,114,152,0,0,0,218, + 6,101,120,116,101,110,100,114,33,0,0,0,114,164,0,0, + 0,218,5,100,117,109,112,115,41,4,114,168,0,0,0,218, + 5,109,116,105,109,101,114,159,0,0,0,114,37,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 13,100,101,99,111,100,101,95,115,111,117,114,99,101,150,2, - 0,0,115,12,0,0,0,8,5,12,1,10,1,12,1,20, - 1,255,128,114,180,0,0,0,169,2,114,144,0,0,0,218, - 26,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, - 104,95,108,111,99,97,116,105,111,110,115,99,2,0,0,0, - 0,0,0,0,2,0,0,0,9,0,0,0,8,0,0,0, - 67,0,0,0,115,8,1,0,0,124,1,100,1,117,0,114, - 56,100,2,125,1,116,0,124,2,100,3,131,2,114,66,122, - 14,124,2,160,1,124,0,161,1,125,1,87,0,110,28,4, - 0,116,2,121,54,1,0,1,0,1,0,89,0,110,12,119, - 0,116,3,160,4,124,1,161,1,125,1,116,5,106,6,124, - 0,124,2,124,1,100,4,141,3,125,4,100,5,124,4,95, - 7,124,2,100,1,117,0,114,148,116,8,131,0,68,0,93, - 40,92,2,125,5,125,6,124,1,160,9,116,10,124,6,131, - 1,161,1,114,102,124,5,124,0,124,1,131,2,125,2,124, - 2,124,4,95,11,1,0,113,148,100,1,83,0,124,3,116, - 12,117,0,114,212,116,0,124,2,100,6,131,2,114,218,122, - 14,124,2,160,13,124,0,161,1,125,7,87,0,110,18,4, - 0,116,2,121,198,1,0,1,0,1,0,89,0,110,20,119, - 0,124,7,114,218,103,0,124,4,95,14,110,6,124,3,124, - 4,95,14,124,4,106,14,103,0,107,2,144,1,114,4,124, - 1,144,1,114,4,116,15,124,1,131,1,100,7,25,0,125, - 8,124,4,106,14,160,16,124,8,161,1,1,0,124,4,83, - 0,41,8,97,61,1,0,0,82,101,116,117,114,110,32,97, - 32,109,111,100,117,108,101,32,115,112,101,99,32,98,97,115, - 101,100,32,111,110,32,97,32,102,105,108,101,32,108,111,99, - 97,116,105,111,110,46,10,10,32,32,32,32,84,111,32,105, - 110,100,105,99,97,116,101,32,116,104,97,116,32,116,104,101, - 32,109,111,100,117,108,101,32,105,115,32,97,32,112,97,99, - 107,97,103,101,44,32,115,101,116,10,32,32,32,32,115,117, - 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, - 111,99,97,116,105,111,110,115,32,116,111,32,97,32,108,105, - 115,116,32,111,102,32,100,105,114,101,99,116,111,114,121,32, - 112,97,116,104,115,46,32,32,65,110,10,32,32,32,32,101, - 109,112,116,121,32,108,105,115,116,32,105,115,32,115,117,102, - 102,105,99,105,101,110,116,44,32,116,104,111,117,103,104,32, - 105,116,115,32,110,111,116,32,111,116,104,101,114,119,105,115, - 101,32,117,115,101,102,117,108,32,116,111,32,116,104,101,10, - 32,32,32,32,105,109,112,111,114,116,32,115,121,115,116,101, - 109,46,10,10,32,32,32,32,84,104,101,32,108,111,97,100, - 101,114,32,109,117,115,116,32,116,97,107,101,32,97,32,115, - 112,101,99,32,97,115,32,105,116,115,32,111,110,108,121,32, - 95,95,105,110,105,116,95,95,40,41,32,97,114,103,46,10, - 10,32,32,32,32,78,122,9,60,117,110,107,110,111,119,110, - 62,218,12,103,101,116,95,102,105,108,101,110,97,109,101,169, - 1,218,6,111,114,105,103,105,110,84,218,10,105,115,95,112, - 97,99,107,97,103,101,114,0,0,0,0,41,17,114,133,0, - 0,0,114,183,0,0,0,114,122,0,0,0,114,18,0,0, - 0,114,85,0,0,0,114,139,0,0,0,218,10,77,111,100, - 117,108,101,83,112,101,99,90,13,95,115,101,116,95,102,105, - 108,101,97,116,116,114,218,27,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,114,115,0,0,0,114,116,0,0,0,114,144,0, - 0,0,218,9,95,80,79,80,85,76,65,84,69,114,186,0, - 0,0,114,182,0,0,0,114,55,0,0,0,218,6,97,112, - 112,101,110,100,41,9,114,121,0,0,0,90,8,108,111,99, - 97,116,105,111,110,114,144,0,0,0,114,182,0,0,0,218, - 4,115,112,101,99,218,12,108,111,97,100,101,114,95,99,108, - 97,115,115,218,8,115,117,102,102,105,120,101,115,114,186,0, - 0,0,90,7,100,105,114,110,97,109,101,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,23,115,112,101,99, - 95,102,114,111,109,95,102,105,108,101,95,108,111,99,97,116, - 105,111,110,167,2,0,0,115,64,0,0,0,8,12,4,4, - 10,1,2,2,14,1,12,1,6,1,10,2,16,8,6,1, - 8,3,14,1,14,1,10,1,6,1,4,1,4,2,8,3, - 10,2,2,1,14,1,12,1,6,1,4,2,8,1,6,2, - 12,1,6,1,12,1,12,1,4,2,255,128,114,194,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,64,0,0,0,115,88,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,100, - 3,90,5,101,6,111,30,100,4,101,7,118,0,90,8,101, - 9,100,5,100,6,132,0,131,1,90,10,101,11,100,7,100, - 8,132,0,131,1,90,12,101,11,100,14,100,10,100,11,132, - 1,131,1,90,13,101,11,100,15,100,12,100,13,132,1,131, - 1,90,14,100,9,83,0,41,16,218,21,87,105,110,100,111, - 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, - 122,62,77,101,116,97,32,112,97,116,104,32,102,105,110,100, - 101,114,32,102,111,114,32,109,111,100,117,108,101,115,32,100, - 101,99,108,97,114,101,100,32,105,110,32,116,104,101,32,87, - 105,110,100,111,119,115,32,114,101,103,105,115,116,114,121,46, - 122,59,83,111,102,116,119,97,114,101,92,80,121,116,104,111, - 110,92,80,121,116,104,111,110,67,111,114,101,92,123,115,121, - 115,95,118,101,114,115,105,111,110,125,92,77,111,100,117,108, - 101,115,92,123,102,117,108,108,110,97,109,101,125,122,65,83, - 111,102,116,119,97,114,101,92,80,121,116,104,111,110,92,80, - 121,116,104,111,110,67,111,114,101,92,123,115,121,115,95,118, - 101,114,115,105,111,110,125,92,77,111,100,117,108,101,115,92, - 123,102,117,108,108,110,97,109,101,125,92,68,101,98,117,103, - 122,6,95,100,46,112,121,100,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,8,0,0,0,67,0,0, - 0,115,50,0,0,0,122,16,116,0,160,1,116,0,106,2, - 124,0,161,2,87,0,83,0,4,0,116,3,121,48,1,0, - 1,0,1,0,116,0,160,1,116,0,106,4,124,0,161,2, - 6,0,89,0,83,0,119,0,114,114,0,0,0,41,5,218, - 6,119,105,110,114,101,103,90,7,79,112,101,110,75,101,121, - 90,17,72,75,69,89,95,67,85,82,82,69,78,84,95,85, - 83,69,82,114,58,0,0,0,90,18,72,75,69,89,95,76, - 79,67,65,76,95,77,65,67,72,73,78,69,114,19,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,14,95,111,112,101,110,95,114,101,103,105,115,116,114,121, - 247,2,0,0,115,10,0,0,0,2,2,16,1,12,1,20, - 1,255,128,122,36,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,2,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,8,0,0,0,67,0, - 0,0,115,130,0,0,0,124,0,106,0,114,14,124,0,106, - 1,125,2,110,6,124,0,106,2,125,2,124,2,106,3,124, - 1,100,1,116,4,106,5,100,0,100,2,133,2,25,0,22, - 0,100,3,141,2,125,3,122,60,124,0,160,6,124,3,161, - 1,143,28,125,4,116,7,160,8,124,4,100,4,161,2,125, - 5,87,0,100,0,4,0,4,0,131,3,1,0,110,16,49, - 0,115,94,119,1,1,0,1,0,1,0,89,0,1,0,87, - 0,124,5,83,0,4,0,116,9,121,128,1,0,1,0,1, - 0,89,0,100,0,83,0,119,0,41,5,78,122,5,37,100, - 46,37,100,114,39,0,0,0,41,2,114,143,0,0,0,90, - 11,115,121,115,95,118,101,114,115,105,111,110,114,10,0,0, - 0,41,10,218,11,68,69,66,85,71,95,66,85,73,76,68, - 218,18,82,69,71,73,83,84,82,89,95,75,69,89,95,68, - 69,66,85,71,218,12,82,69,71,73,83,84,82,89,95,75, - 69,89,114,70,0,0,0,114,15,0,0,0,218,12,118,101, - 114,115,105,111,110,95,105,110,102,111,114,197,0,0,0,114, - 196,0,0,0,90,10,81,117,101,114,121,86,97,108,117,101, - 114,58,0,0,0,41,6,218,3,99,108,115,114,143,0,0, - 0,90,12,114,101,103,105,115,116,114,121,95,107,101,121,114, - 20,0,0,0,90,4,104,107,101,121,218,8,102,105,108,101, - 112,97,116,104,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,16,95,115,101,97,114,99,104,95,114,101,103, - 105,115,116,114,121,254,2,0,0,115,26,0,0,0,6,2, - 8,1,6,2,6,1,16,1,6,255,2,2,12,1,44,1, - 4,3,12,254,8,1,255,128,122,38,87,105,110,100,111,119, - 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, - 95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,121, - 78,99,4,0,0,0,0,0,0,0,0,0,0,0,8,0, - 0,0,8,0,0,0,67,0,0,0,115,118,0,0,0,124, - 0,160,0,124,1,161,1,125,4,124,4,100,0,117,0,114, - 22,100,0,83,0,122,12,116,1,124,4,131,1,1,0,87, - 0,110,20,4,0,116,2,121,54,1,0,1,0,1,0,89, - 0,100,0,83,0,119,0,116,3,131,0,68,0,93,50,92, - 2,125,5,125,6,124,4,160,4,116,5,124,6,131,1,161, - 1,114,62,116,6,106,7,124,1,124,5,124,1,124,4,131, - 2,124,4,100,1,141,3,125,7,124,7,2,0,1,0,83, - 0,100,0,83,0,41,2,78,114,184,0,0,0,41,8,114, - 204,0,0,0,114,57,0,0,0,114,58,0,0,0,114,188, - 0,0,0,114,115,0,0,0,114,116,0,0,0,114,139,0, - 0,0,218,16,115,112,101,99,95,102,114,111,109,95,108,111, - 97,100,101,114,41,8,114,202,0,0,0,114,143,0,0,0, - 114,52,0,0,0,218,6,116,97,114,103,101,116,114,203,0, - 0,0,114,144,0,0,0,114,193,0,0,0,114,191,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,9,102,105,110,100,95,115,112,101,99,13,3,0,0,115, - 32,0,0,0,10,2,8,1,4,1,2,1,12,1,12,1, - 8,1,14,1,14,1,6,1,8,1,2,1,6,254,8,3, - 4,251,255,128,122,31,87,105,110,100,111,119,115,82,101,103, - 105,115,116,114,121,70,105,110,100,101,114,46,102,105,110,100, - 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,30, - 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, - 3,100,1,117,1,114,26,124,3,106,1,83,0,100,1,83, - 0,41,2,122,108,70,105,110,100,32,109,111,100,117,108,101, - 32,110,97,109,101,100,32,105,110,32,116,104,101,32,114,101, - 103,105,115,116,114,121,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, - 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, - 32,78,169,2,114,207,0,0,0,114,144,0,0,0,169,4, - 114,202,0,0,0,114,143,0,0,0,114,52,0,0,0,114, - 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101, - 29,3,0,0,115,10,0,0,0,12,7,8,1,6,1,4, - 2,255,128,122,33,87,105,110,100,111,119,115,82,101,103,105, - 115,116,114,121,70,105,110,100,101,114,46,102,105,110,100,95, - 109,111,100,117,108,101,41,2,78,78,41,1,78,41,15,114, - 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, - 0,0,0,114,200,0,0,0,114,199,0,0,0,218,11,95, - 77,83,95,87,73,78,68,79,87,83,218,18,69,88,84,69, - 78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,198, - 0,0,0,218,12,115,116,97,116,105,99,109,101,116,104,111, - 100,114,197,0,0,0,218,11,99,108,97,115,115,109,101,116, - 104,111,100,114,204,0,0,0,114,207,0,0,0,114,210,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,195,0,0,0,235,2,0,0,115, - 32,0,0,0,8,0,4,2,2,3,2,255,2,4,2,255, - 12,3,2,2,10,1,2,6,10,1,2,14,12,1,2,15, - 16,1,255,128,114,195,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,0, - 0,0,115,48,0,0,0,101,0,90,1,100,0,90,2,100, - 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, - 0,90,5,100,6,100,7,132,0,90,6,100,8,100,9,132, - 0,90,7,100,10,83,0,41,11,218,13,95,76,111,97,100, - 101,114,66,97,115,105,99,115,122,83,66,97,115,101,32,99, - 108,97,115,115,32,111,102,32,99,111,109,109,111,110,32,99, - 111,100,101,32,110,101,101,100,101,100,32,98,121,32,98,111, - 116,104,32,83,111,117,114,99,101,76,111,97,100,101,114,32, - 97,110,100,10,32,32,32,32,83,111,117,114,99,101,108,101, - 115,115,70,105,108,101,76,111,97,100,101,114,46,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0, - 0,0,67,0,0,0,115,64,0,0,0,116,0,124,0,160, - 1,124,1,161,1,131,1,100,1,25,0,125,2,124,2,160, - 2,100,2,100,1,161,2,100,3,25,0,125,3,124,1,160, - 3,100,2,161,1,100,4,25,0,125,4,124,3,100,5,107, - 2,111,62,124,4,100,5,107,3,83,0,41,7,122,141,67, - 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, - 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99, - 116,76,111,97,100,101,114,46,105,115,95,112,97,99,107,97, - 103,101,32,98,121,32,99,104,101,99,107,105,110,103,32,105, - 102,10,32,32,32,32,32,32,32,32,116,104,101,32,112,97, - 116,104,32,114,101,116,117,114,110,101,100,32,98,121,32,103, - 101,116,95,102,105,108,101,110,97,109,101,32,104,97,115,32, - 97,32,102,105,108,101,110,97,109,101,32,111,102,32,39,95, - 95,105,110,105,116,95,95,46,112,121,39,46,114,3,0,0, - 0,114,79,0,0,0,114,0,0,0,0,114,39,0,0,0, - 218,8,95,95,105,110,105,116,95,95,78,41,4,114,55,0, - 0,0,114,183,0,0,0,114,51,0,0,0,114,49,0,0, - 0,41,5,114,123,0,0,0,114,143,0,0,0,114,101,0, - 0,0,90,13,102,105,108,101,110,97,109,101,95,98,97,115, - 101,90,9,116,97,105,108,95,110,97,109,101,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,186,0,0,0, - 48,3,0,0,115,10,0,0,0,18,3,16,1,14,1,16, - 1,255,128,122,24,95,76,111,97,100,101,114,66,97,115,105, - 99,115,46,105,115,95,112,97,99,107,97,103,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,169, - 2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,115, - 101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,100, - 117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,7, - 0,0,0,169,2,114,123,0,0,0,114,191,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,13, - 99,114,101,97,116,101,95,109,111,100,117,108,101,56,3,0, - 0,115,4,0,0,0,4,0,255,128,122,27,95,76,111,97, - 100,101,114,66,97,115,105,99,115,46,99,114,101,97,116,101, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,5,0,0,0,67,0,0,0, - 115,56,0,0,0,124,0,160,0,124,1,106,1,161,1,125, - 2,124,2,100,1,117,0,114,36,116,2,100,2,160,3,124, - 1,106,1,161,1,131,1,130,1,116,4,160,5,116,6,124, - 2,124,1,106,7,161,3,1,0,100,1,83,0,41,3,122, - 19,69,120,101,99,117,116,101,32,116,104,101,32,109,111,100, - 117,108,101,46,78,122,52,99,97,110,110,111,116,32,108,111, - 97,100,32,109,111,100,117,108,101,32,123,33,114,125,32,119, - 104,101,110,32,103,101,116,95,99,111,100,101,40,41,32,114, - 101,116,117,114,110,115,32,78,111,110,101,41,8,218,8,103, - 101,116,95,99,111,100,101,114,130,0,0,0,114,122,0,0, - 0,114,70,0,0,0,114,139,0,0,0,218,25,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,218,4,101,120,101,99,114,136,0,0, - 0,41,3,114,123,0,0,0,218,6,109,111,100,117,108,101, - 114,168,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,11,101,120,101,99,95,109,111,100,117,108, - 101,59,3,0,0,115,14,0,0,0,12,2,8,1,6,1, - 4,1,6,255,20,2,255,128,122,25,95,76,111,97,100,101, - 114,66,97,115,105,99,115,46,101,120,101,99,95,109,111,100, - 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,4,0,0,0,67,0,0,0,115,12,0,0, - 0,116,0,160,1,124,0,124,1,161,2,83,0,41,2,122, - 26,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,78,41,2,114,139, - 0,0,0,218,17,95,108,111,97,100,95,109,111,100,117,108, - 101,95,115,104,105,109,169,2,114,123,0,0,0,114,143,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,108,111,97,100,95,109,111,100,117,108,101,67,3, - 0,0,115,4,0,0,0,12,3,255,128,122,25,95,76,111, - 97,100,101,114,66,97,115,105,99,115,46,108,111,97,100,95, - 109,111,100,117,108,101,78,41,8,114,130,0,0,0,114,129, - 0,0,0,114,131,0,0,0,114,132,0,0,0,114,186,0, - 0,0,114,219,0,0,0,114,224,0,0,0,114,227,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,215,0,0,0,43,3,0,0,115,14, - 0,0,0,8,0,4,2,8,3,8,8,8,3,12,8,255, - 128,114,215,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, - 74,0,0,0,101,0,90,1,100,0,90,2,100,1,100,2, - 132,0,90,3,100,3,100,4,132,0,90,4,100,5,100,6, - 132,0,90,5,100,7,100,8,132,0,90,6,100,9,100,10, - 132,0,90,7,100,11,100,12,156,1,100,13,100,14,132,2, - 90,8,100,15,100,16,132,0,90,9,100,17,83,0,41,18, - 218,12,83,111,117,114,99,101,76,111,97,100,101,114,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,116,0,130,1, - 41,2,122,165,79,112,116,105,111,110,97,108,32,109,101,116, - 104,111,100,32,116,104,97,116,32,114,101,116,117,114,110,115, - 32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111, - 110,32,116,105,109,101,32,40,97,110,32,105,110,116,41,32, - 102,111,114,32,116,104,101,10,32,32,32,32,32,32,32,32, - 115,112,101,99,105,102,105,101,100,32,112,97,116,104,32,40, - 97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,32, - 32,82,97,105,115,101,115,32,79,83,69,114,114,111,114,32, - 119,104,101,110,32,116,104,101,32,112,97,116,104,32,99,97, - 110,110,111,116,32,98,101,32,104,97,110,100,108,101,100,46, - 10,32,32,32,32,32,32,32,32,78,41,1,114,58,0,0, - 0,169,2,114,123,0,0,0,114,52,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,10,112,97, - 116,104,95,109,116,105,109,101,75,3,0,0,115,4,0,0, - 0,4,6,255,128,122,23,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,0,0,0,0,2,0,0,0,4, - 0,0,0,67,0,0,0,115,14,0,0,0,100,1,124,0, - 160,0,124,1,161,1,105,1,83,0,41,3,97,158,1,0, - 0,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, - 32,114,101,116,117,114,110,105,110,103,32,97,32,109,101,116, - 97,100,97,116,97,32,100,105,99,116,32,102,111,114,32,116, - 104,101,32,115,112,101,99,105,102,105,101,100,10,32,32,32, - 32,32,32,32,32,112,97,116,104,32,40,97,32,115,116,114, - 41,46,10,10,32,32,32,32,32,32,32,32,80,111,115,115, - 105,98,108,101,32,107,101,121,115,58,10,32,32,32,32,32, - 32,32,32,45,32,39,109,116,105,109,101,39,32,40,109,97, - 110,100,97,116,111,114,121,41,32,105,115,32,116,104,101,32, - 110,117,109,101,114,105,99,32,116,105,109,101,115,116,97,109, - 112,32,111,102,32,108,97,115,116,32,115,111,117,114,99,101, - 10,32,32,32,32,32,32,32,32,32,32,99,111,100,101,32, - 109,111,100,105,102,105,99,97,116,105,111,110,59,10,32,32, - 32,32,32,32,32,32,45,32,39,115,105,122,101,39,32,40, - 111,112,116,105,111,110,97,108,41,32,105,115,32,116,104,101, - 32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,111, - 102,32,116,104,101,32,115,111,117,114,99,101,32,99,111,100, - 101,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, - 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, - 116,104,111,100,32,97,108,108,111,119,115,32,116,104,101,32, - 108,111,97,100,101,114,32,116,111,32,114,101,97,100,32,98, - 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,32, - 32,32,32,32,32,32,32,82,97,105,115,101,115,32,79,83, - 69,114,114,111,114,32,119,104,101,110,32,116,104,101,32,112, - 97,116,104,32,99,97,110,110,111,116,32,98,101,32,104,97, - 110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,114, - 173,0,0,0,78,41,1,114,230,0,0,0,114,229,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,10,112,97,116,104,95,115,116,97,116,115,83,3,0,0, - 115,4,0,0,0,14,12,255,128,122,23,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,0,0,0,0,4, - 0,0,0,4,0,0,0,67,0,0,0,115,12,0,0,0, - 124,0,160,0,124,2,124,3,161,2,83,0,41,2,122,228, - 79,112,116,105,111,110,97,108,32,109,101,116,104,111,100,32, - 119,104,105,99,104,32,119,114,105,116,101,115,32,100,97,116, - 97,32,40,98,121,116,101,115,41,32,116,111,32,97,32,102, - 105,108,101,32,112,97,116,104,32,40,97,32,115,116,114,41, - 46,10,10,32,32,32,32,32,32,32,32,73,109,112,108,101, - 109,101,110,116,105,110,103,32,116,104,105,115,32,109,101,116, - 104,111,100,32,97,108,108,111,119,115,32,102,111,114,32,116, - 104,101,32,119,114,105,116,105,110,103,32,111,102,32,98,121, - 116,101,99,111,100,101,32,102,105,108,101,115,46,10,10,32, - 32,32,32,32,32,32,32,84,104,101,32,115,111,117,114,99, - 101,32,112,97,116,104,32,105,115,32,110,101,101,100,101,100, - 32,105,110,32,111,114,100,101,114,32,116,111,32,99,111,114, - 114,101,99,116,108,121,32,116,114,97,110,115,102,101,114,32, - 112,101,114,109,105,115,115,105,111,110,115,10,32,32,32,32, - 32,32,32,32,78,41,1,218,8,115,101,116,95,100,97,116, - 97,41,4,114,123,0,0,0,114,112,0,0,0,90,10,99, - 97,99,104,101,95,112,97,116,104,114,37,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,15,95, - 99,97,99,104,101,95,98,121,116,101,99,111,100,101,97,3, - 0,0,115,4,0,0,0,12,8,255,128,122,28,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,0,0,0,0,3,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,150,79, - 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,119, - 104,105,99,104,32,119,114,105,116,101,115,32,100,97,116,97, - 32,40,98,121,116,101,115,41,32,116,111,32,97,32,102,105, - 108,101,32,112,97,116,104,32,40,97,32,115,116,114,41,46, - 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, - 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, - 111,100,32,97,108,108,111,119,115,32,102,111,114,32,116,104, - 101,32,119,114,105,116,105,110,103,32,111,102,32,98,121,116, - 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, - 32,32,32,32,32,78,114,7,0,0,0,41,3,114,123,0, - 0,0,114,52,0,0,0,114,37,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,232,0,0,0, - 107,3,0,0,115,4,0,0,0,4,0,255,128,122,21,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,0,0,0, - 0,5,0,0,0,10,0,0,0,67,0,0,0,115,70,0, - 0,0,124,0,160,0,124,1,161,1,125,2,122,20,124,0, - 160,1,124,2,161,1,125,3,87,0,116,4,124,3,131,1, - 83,0,4,0,116,2,121,68,1,0,125,4,1,0,122,14, - 116,3,100,1,124,1,100,2,141,2,124,4,130,2,100,3, - 125,4,126,4,119,1,119,0,41,4,122,52,67,111,110,99, - 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, - 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,46, - 122,39,115,111,117,114,99,101,32,110,111,116,32,97,118,97, - 105,108,97,98,108,101,32,116,104,114,111,117,103,104,32,103, - 101,116,95,100,97,116,97,40,41,114,120,0,0,0,78,41, - 5,114,183,0,0,0,218,8,103,101,116,95,100,97,116,97, - 114,58,0,0,0,114,122,0,0,0,114,180,0,0,0,41, - 5,114,123,0,0,0,114,143,0,0,0,114,52,0,0,0, - 114,178,0,0,0,218,3,101,120,99,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,10,103,101,116,95,115, - 111,117,114,99,101,114,3,0,0,115,26,0,0,0,10,2, - 2,1,12,1,8,4,14,253,4,1,2,1,4,255,2,1, - 2,255,8,128,2,255,255,128,122,23,83,111,117,114,99,101, - 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, - 101,114,109,0,0,0,41,1,218,9,95,111,112,116,105,109, - 105,122,101,99,3,0,0,0,0,0,0,0,1,0,0,0, - 4,0,0,0,8,0,0,0,67,0,0,0,115,22,0,0, - 0,116,0,106,1,116,2,124,1,124,2,100,1,100,2,124, - 3,100,3,141,6,83,0,41,5,122,130,82,101,116,117,114, - 110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,99, - 116,32,99,111,109,112,105,108,101,100,32,102,114,111,109,32, - 115,111,117,114,99,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,101,32,39,100,97,116,97,39,32,97,114,103,117, - 109,101,110,116,32,99,97,110,32,98,101,32,97,110,121,32, - 111,98,106,101,99,116,32,116,121,112,101,32,116,104,97,116, - 32,99,111,109,112,105,108,101,40,41,32,115,117,112,112,111, - 114,116,115,46,10,32,32,32,32,32,32,32,32,114,222,0, - 0,0,84,41,2,218,12,100,111,110,116,95,105,110,104,101, - 114,105,116,114,89,0,0,0,78,41,3,114,139,0,0,0, - 114,221,0,0,0,218,7,99,111,109,112,105,108,101,41,4, - 114,123,0,0,0,114,37,0,0,0,114,52,0,0,0,114, - 237,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,14,115,111,117,114,99,101,95,116,111,95,99, - 111,100,101,124,3,0,0,115,8,0,0,0,12,5,4,1, - 6,255,255,128,122,27,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,0,0,0,0,15,0, - 0,0,9,0,0,0,67,0,0,0,115,28,2,0,0,124, - 0,160,0,124,1,161,1,125,2,100,1,125,3,100,1,125, - 4,100,1,125,5,100,2,125,6,100,3,125,7,122,12,116, - 1,124,2,131,1,125,8,87,0,110,24,4,0,116,2,121, - 66,1,0,1,0,1,0,100,1,125,8,89,0,144,1,110, - 42,119,0,122,14,124,0,160,3,124,2,161,1,125,9,87, - 0,110,20,4,0,116,4,121,102,1,0,1,0,1,0,89, - 0,144,1,110,6,119,0,116,5,124,9,100,4,25,0,131, - 1,125,3,122,14,124,0,160,6,124,8,161,1,125,10,87, - 0,110,18,4,0,116,4,121,148,1,0,1,0,1,0,89, - 0,110,216,119,0,124,1,124,8,100,5,156,2,125,11,122, - 148,116,7,124,10,124,1,124,11,131,3,125,12,116,8,124, - 10,131,1,100,6,100,1,133,2,25,0,125,13,124,12,100, - 7,64,0,100,8,107,3,125,6,124,6,144,1,114,30,124, - 12,100,9,64,0,100,8,107,3,125,7,116,9,106,10,100, - 10,107,3,144,1,114,50,124,7,115,248,116,9,106,10,100, - 11,107,2,144,1,114,50,124,0,160,6,124,2,161,1,125, - 4,116,9,160,11,116,12,124,4,161,2,125,5,116,13,124, - 10,124,5,124,1,124,11,131,4,1,0,110,20,116,14,124, - 10,124,3,124,9,100,12,25,0,124,1,124,11,131,5,1, - 0,87,0,110,24,4,0,116,15,116,16,102,2,144,1,121, - 76,1,0,1,0,1,0,89,0,110,32,119,0,116,17,160, - 18,100,13,124,8,124,2,161,3,1,0,116,19,124,13,124, - 1,124,8,124,2,100,14,141,4,83,0,124,4,100,1,117, - 0,144,1,114,128,124,0,160,6,124,2,161,1,125,4,124, - 0,160,20,124,4,124,2,161,2,125,14,116,17,160,18,100, - 15,124,2,161,2,1,0,116,21,106,22,144,2,115,24,124, - 8,100,1,117,1,144,2,114,24,124,3,100,1,117,1,144, - 2,114,24,124,6,144,1,114,220,124,5,100,1,117,0,144, - 1,114,206,116,9,160,11,124,4,161,1,125,5,116,23,124, - 14,124,5,124,7,131,3,125,10,110,16,116,24,124,14,124, - 3,116,25,124,4,131,1,131,3,125,10,122,20,124,0,160, - 26,124,2,124,8,124,10,161,3,1,0,87,0,124,14,83, - 0,4,0,116,2,144,2,121,22,1,0,1,0,1,0,89, - 0,124,14,83,0,119,0,124,14,83,0,41,16,122,190,67, - 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, - 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99, - 116,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101, - 46,10,10,32,32,32,32,32,32,32,32,82,101,97,100,105, - 110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,114, - 101,113,117,105,114,101,115,32,112,97,116,104,95,115,116,97, - 116,115,32,116,111,32,98,101,32,105,109,112,108,101,109,101, - 110,116,101,100,46,32,84,111,32,119,114,105,116,101,10,32, - 32,32,32,32,32,32,32,98,121,116,101,99,111,100,101,44, - 32,115,101,116,95,100,97,116,97,32,109,117,115,116,32,97, - 108,115,111,32,98,101,32,105,109,112,108,101,109,101,110,116, - 101,100,46,10,10,32,32,32,32,32,32,32,32,78,70,84, - 114,173,0,0,0,114,163,0,0,0,114,149,0,0,0,114, - 3,0,0,0,114,0,0,0,0,114,39,0,0,0,90,5, - 110,101,118,101,114,90,6,97,108,119,97,121,115,218,4,115, - 105,122,101,122,13,123,125,32,109,97,116,99,104,101,115,32, - 123,125,41,3,114,121,0,0,0,114,111,0,0,0,114,112, - 0,0,0,122,19,99,111,100,101,32,111,98,106,101,99,116, - 32,102,114,111,109,32,123,125,41,27,114,183,0,0,0,114, - 102,0,0,0,114,88,0,0,0,114,231,0,0,0,114,58, - 0,0,0,114,30,0,0,0,114,234,0,0,0,114,156,0, - 0,0,218,10,109,101,109,111,114,121,118,105,101,119,114,167, - 0,0,0,90,21,99,104,101,99,107,95,104,97,115,104,95, - 98,97,115,101,100,95,112,121,99,115,114,161,0,0,0,218, - 17,95,82,65,87,95,77,65,71,73,67,95,78,85,77,66, - 69,82,114,162,0,0,0,114,160,0,0,0,114,122,0,0, - 0,114,154,0,0,0,114,139,0,0,0,114,153,0,0,0, - 114,169,0,0,0,114,240,0,0,0,114,15,0,0,0,218, - 19,100,111,110,116,95,119,114,105,116,101,95,98,121,116,101, - 99,111,100,101,114,175,0,0,0,114,174,0,0,0,114,4, - 0,0,0,114,233,0,0,0,41,15,114,123,0,0,0,114, - 143,0,0,0,114,112,0,0,0,114,158,0,0,0,114,178, - 0,0,0,114,161,0,0,0,90,10,104,97,115,104,95,98, - 97,115,101,100,90,12,99,104,101,99,107,95,115,111,117,114, - 99,101,114,111,0,0,0,218,2,115,116,114,37,0,0,0, - 114,155,0,0,0,114,16,0,0,0,90,10,98,121,116,101, - 115,95,100,97,116,97,90,11,99,111,100,101,95,111,98,106, - 101,99,116,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,220,0,0,0,132,3,0,0,115,160,0,0,0, - 10,7,4,1,4,1,4,1,4,1,4,1,2,1,12,1, - 12,1,12,1,2,2,14,1,12,1,8,1,12,2,2,1, - 14,1,12,1,6,1,2,3,2,1,6,254,2,4,12,1, - 16,1,12,1,6,1,12,1,12,1,2,1,2,255,8,2, - 4,254,10,3,4,1,2,1,2,1,4,254,8,4,2,1, - 6,255,2,3,2,1,2,1,6,1,2,1,2,1,8,251, - 18,7,6,1,8,2,2,1,4,255,6,2,2,1,2,1, - 6,254,10,3,10,1,12,1,12,1,18,1,6,1,4,255, - 6,2,10,1,10,1,14,1,6,2,6,1,4,255,2,2, - 16,1,4,3,14,254,2,1,4,1,2,255,4,1,255,128, - 122,21,83,111,117,114,99,101,76,111,97,100,101,114,46,103, - 101,116,95,99,111,100,101,78,41,10,114,130,0,0,0,114, - 129,0,0,0,114,131,0,0,0,114,230,0,0,0,114,231, - 0,0,0,114,233,0,0,0,114,232,0,0,0,114,236,0, - 0,0,114,240,0,0,0,114,220,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,228,0,0,0,73,3,0,0,115,18,0,0,0,8,0, - 8,2,8,8,8,14,8,10,8,7,14,10,12,8,255,128, - 114,228,0,0,0,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,0,0,0,0,115,92, - 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, - 2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,100, - 6,100,7,132,0,90,6,101,7,135,0,102,1,100,8,100, - 9,132,8,131,1,90,8,101,7,100,10,100,11,132,0,131, - 1,90,9,100,12,100,13,132,0,90,10,101,7,100,14,100, - 15,132,0,131,1,90,11,135,0,4,0,90,12,83,0,41, - 16,218,10,70,105,108,101,76,111,97,100,101,114,122,103,66, - 97,115,101,32,102,105,108,101,32,108,111,97,100,101,114,32, - 99,108,97,115,115,32,119,104,105,99,104,32,105,109,112,108, - 101,109,101,110,116,115,32,116,104,101,32,108,111,97,100,101, - 114,32,112,114,111,116,111,99,111,108,32,109,101,116,104,111, - 100,115,32,116,104,97,116,10,32,32,32,32,114,101,113,117, - 105,114,101,32,102,105,108,101,32,115,121,115,116,101,109,32, - 117,115,97,103,101,46,99,3,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, - 16,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, - 100,1,83,0,41,2,122,75,67,97,99,104,101,32,116,104, - 101,32,109,111,100,117,108,101,32,110,97,109,101,32,97,110, - 100,32,116,104,101,32,112,97,116,104,32,116,111,32,116,104, - 101,32,102,105,108,101,32,102,111,117,110,100,32,98,121,32, - 116,104,101,10,32,32,32,32,32,32,32,32,102,105,110,100, - 101,114,46,78,114,163,0,0,0,41,3,114,123,0,0,0, - 114,143,0,0,0,114,52,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,216,0,0,0,222,3, - 0,0,115,6,0,0,0,6,3,10,1,255,128,122,19,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,0,0,0,0,2, - 0,0,0,2,0,0,0,67,0,0,0,115,24,0,0,0, - 124,0,106,0,124,1,106,0,107,2,111,22,124,0,106,1, - 124,1,106,1,107,2,83,0,114,114,0,0,0,169,2,218, - 9,95,95,99,108,97,115,115,95,95,114,136,0,0,0,169, - 2,114,123,0,0,0,90,5,111,116,104,101,114,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,6,95,95, - 101,113,95,95,228,3,0,0,115,8,0,0,0,12,1,10, - 1,2,255,255,128,122,17,70,105,108,101,76,111,97,100,101, - 114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,0, - 124,0,106,2,131,1,65,0,83,0,114,114,0,0,0,169, - 3,218,4,104,97,115,104,114,121,0,0,0,114,52,0,0, - 0,169,1,114,123,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,8,95,95,104,97,115,104,95, - 95,232,3,0,0,115,4,0,0,0,20,1,255,128,122,19, - 70,105,108,101,76,111,97,100,101,114,46,95,95,104,97,115, - 104,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,3,0,0,0,115,16,0,0, - 0,116,0,116,1,124,0,131,2,160,2,124,1,161,1,83, - 0,41,2,122,100,76,111,97,100,32,97,32,109,111,100,117, - 108,101,32,102,114,111,109,32,97,32,102,105,108,101,46,10, + 22,95,99,111,100,101,95,116,111,95,116,105,109,101,115,116, + 97,109,112,95,112,121,99,129,2,0,0,115,14,0,0,0, + 8,2,14,1,14,1,14,1,16,1,4,1,255,128,114,174, + 0,0,0,84,99,3,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,5,0,0,0,67,0,0,0,115,80,0, + 0,0,116,0,116,1,131,1,125,3,100,1,124,2,100,1, + 62,0,66,0,125,4,124,3,160,2,116,3,124,4,131,1, + 161,1,1,0,116,4,124,1,131,1,100,2,107,2,115,50, + 74,0,130,1,124,3,160,2,124,1,161,1,1,0,124,3, + 160,2,116,5,160,6,124,0,161,1,161,1,1,0,124,3, + 83,0,41,4,122,38,80,114,111,100,117,99,101,32,116,104, + 101,32,100,97,116,97,32,102,111,114,32,97,32,104,97,115, + 104,45,98,97,115,101,100,32,112,121,99,46,114,3,0,0, + 0,114,150,0,0,0,78,41,7,114,170,0,0,0,114,152, + 0,0,0,114,171,0,0,0,114,33,0,0,0,114,4,0, + 0,0,114,164,0,0,0,114,172,0,0,0,41,5,114,168, + 0,0,0,114,161,0,0,0,90,7,99,104,101,99,107,101, + 100,114,37,0,0,0,114,16,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,17,95,99,111,100, + 101,95,116,111,95,104,97,115,104,95,112,121,99,139,2,0, + 0,115,16,0,0,0,8,2,12,1,14,1,16,1,10,1, + 16,1,4,1,255,128,114,175,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0, + 67,0,0,0,115,62,0,0,0,100,1,100,2,108,0,125, + 1,116,1,160,2,124,0,161,1,106,3,125,2,124,1,160, + 4,124,2,161,1,125,3,116,1,160,5,100,2,100,3,161, + 2,125,4,124,4,160,6,124,0,160,6,124,3,100,1,25, + 0,161,1,161,1,83,0,41,4,122,121,68,101,99,111,100, + 101,32,98,121,116,101,115,32,114,101,112,114,101,115,101,110, + 116,105,110,103,32,115,111,117,114,99,101,32,99,111,100,101, + 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32, + 115,116,114,105,110,103,46,10,10,32,32,32,32,85,110,105, + 118,101,114,115,97,108,32,110,101,119,108,105,110,101,32,115, + 117,112,112,111,114,116,32,105,115,32,117,115,101,100,32,105, + 110,32,116,104,101,32,100,101,99,111,100,105,110,103,46,10, + 32,32,32,32,114,0,0,0,0,78,84,41,7,218,8,116, + 111,107,101,110,105,122,101,114,72,0,0,0,90,7,66,121, + 116,101,115,73,79,90,8,114,101,97,100,108,105,110,101,90, + 15,100,101,116,101,99,116,95,101,110,99,111,100,105,110,103, + 90,25,73,110,99,114,101,109,101,110,116,97,108,78,101,119, + 108,105,110,101,68,101,99,111,100,101,114,218,6,100,101,99, + 111,100,101,41,5,218,12,115,111,117,114,99,101,95,98,121, + 116,101,115,114,176,0,0,0,90,21,115,111,117,114,99,101, + 95,98,121,116,101,115,95,114,101,97,100,108,105,110,101,218, + 8,101,110,99,111,100,105,110,103,90,15,110,101,119,108,105, + 110,101,95,100,101,99,111,100,101,114,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,13,100,101,99,111,100, + 101,95,115,111,117,114,99,101,150,2,0,0,115,12,0,0, + 0,8,5,12,1,10,1,12,1,20,1,255,128,114,180,0, + 0,0,169,2,114,144,0,0,0,218,26,115,117,98,109,111, + 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, + 116,105,111,110,115,99,2,0,0,0,0,0,0,0,2,0, + 0,0,9,0,0,0,8,0,0,0,67,0,0,0,115,12, + 1,0,0,124,1,100,1,117,0,114,56,100,2,125,1,116, + 0,124,2,100,3,131,2,114,66,122,14,124,2,160,1,124, + 0,161,1,125,1,87,0,110,28,4,0,116,2,144,1,121, + 10,1,0,1,0,1,0,89,0,110,10,116,3,160,4,124, + 1,161,1,125,1,116,5,106,6,124,0,124,2,124,1,100, + 4,141,3,125,4,100,5,124,4,95,7,124,2,100,1,117, + 0,114,148,116,8,131,0,68,0,93,40,92,2,125,5,125, + 6,124,1,160,9,116,10,124,6,131,1,161,1,114,102,124, + 5,124,0,124,1,131,2,125,2,124,2,124,4,95,11,1, + 0,113,148,100,1,83,0,124,3,116,12,117,0,114,212,116, + 0,124,2,100,6,131,2,114,218,122,14,124,2,160,13,124, + 0,161,1,125,7,87,0,110,18,4,0,116,2,144,1,121, + 8,1,0,1,0,1,0,89,0,110,18,124,7,114,218,103, + 0,124,4,95,14,110,6,124,3,124,4,95,14,124,4,106, + 14,103,0,107,2,144,1,114,4,124,1,144,1,114,4,116, + 15,124,1,131,1,100,7,25,0,125,8,124,4,106,14,160, + 16,124,8,161,1,1,0,124,4,83,0,119,0,119,0,41, + 8,97,61,1,0,0,82,101,116,117,114,110,32,97,32,109, + 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, + 32,111,110,32,97,32,102,105,108,101,32,108,111,99,97,116, + 105,111,110,46,10,10,32,32,32,32,84,111,32,105,110,100, + 105,99,97,116,101,32,116,104,97,116,32,116,104,101,32,109, + 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, + 103,101,44,32,115,101,116,10,32,32,32,32,115,117,98,109, + 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, + 97,116,105,111,110,115,32,116,111,32,97,32,108,105,115,116, + 32,111,102,32,100,105,114,101,99,116,111,114,121,32,112,97, + 116,104,115,46,32,32,65,110,10,32,32,32,32,101,109,112, + 116,121,32,108,105,115,116,32,105,115,32,115,117,102,102,105, + 99,105,101,110,116,44,32,116,104,111,117,103,104,32,105,116, + 115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32, + 117,115,101,102,117,108,32,116,111,32,116,104,101,10,32,32, + 32,32,105,109,112,111,114,116,32,115,121,115,116,101,109,46, + 10,10,32,32,32,32,84,104,101,32,108,111,97,100,101,114, + 32,109,117,115,116,32,116,97,107,101,32,97,32,115,112,101, + 99,32,97,115,32,105,116,115,32,111,110,108,121,32,95,95, + 105,110,105,116,95,95,40,41,32,97,114,103,46,10,10,32, + 32,32,32,78,122,9,60,117,110,107,110,111,119,110,62,218, + 12,103,101,116,95,102,105,108,101,110,97,109,101,169,1,218, + 6,111,114,105,103,105,110,84,218,10,105,115,95,112,97,99, + 107,97,103,101,114,0,0,0,0,41,17,114,133,0,0,0, + 114,183,0,0,0,114,122,0,0,0,114,18,0,0,0,114, + 85,0,0,0,114,139,0,0,0,218,10,77,111,100,117,108, + 101,83,112,101,99,90,13,95,115,101,116,95,102,105,108,101, + 97,116,116,114,218,27,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,114,115,0,0,0,114,116,0,0,0,114,144,0,0,0, + 218,9,95,80,79,80,85,76,65,84,69,114,186,0,0,0, + 114,182,0,0,0,114,55,0,0,0,218,6,97,112,112,101, + 110,100,41,9,114,121,0,0,0,90,8,108,111,99,97,116, + 105,111,110,114,144,0,0,0,114,182,0,0,0,218,4,115, + 112,101,99,218,12,108,111,97,100,101,114,95,99,108,97,115, + 115,218,8,115,117,102,102,105,120,101,115,114,186,0,0,0, + 90,7,100,105,114,110,97,109,101,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,23,115,112,101,99,95,102, + 114,111,109,95,102,105,108,101,95,108,111,99,97,116,105,111, + 110,167,2,0,0,115,68,0,0,0,8,12,4,4,10,1, + 2,2,14,1,14,1,4,1,10,2,16,8,6,1,8,3, + 14,1,14,1,10,1,6,1,4,1,4,2,8,3,10,2, + 2,1,14,1,14,1,4,1,4,2,8,1,6,2,12,1, + 6,1,12,1,12,1,4,2,2,244,2,226,255,128,114,194, + 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,64,0,0,0,115,88,0,0, + 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,90, + 4,100,3,90,5,101,6,111,30,100,4,101,7,118,0,90, + 8,101,9,100,5,100,6,132,0,131,1,90,10,101,11,100, + 7,100,8,132,0,131,1,90,12,101,11,100,14,100,10,100, + 11,132,1,131,1,90,13,101,11,100,15,100,12,100,13,132, + 1,131,1,90,14,100,9,83,0,41,16,218,21,87,105,110, + 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, + 101,114,122,62,77,101,116,97,32,112,97,116,104,32,102,105, + 110,100,101,114,32,102,111,114,32,109,111,100,117,108,101,115, + 32,100,101,99,108,97,114,101,100,32,105,110,32,116,104,101, + 32,87,105,110,100,111,119,115,32,114,101,103,105,115,116,114, + 121,46,122,59,83,111,102,116,119,97,114,101,92,80,121,116, + 104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123, + 115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100, + 117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,122, + 65,83,111,102,116,119,97,114,101,92,80,121,116,104,111,110, + 92,80,121,116,104,111,110,67,111,114,101,92,123,115,121,115, + 95,118,101,114,115,105,111,110,125,92,77,111,100,117,108,101, + 115,92,123,102,117,108,108,110,97,109,101,125,92,68,101,98, + 117,103,122,6,95,100,46,112,121,100,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,67, + 0,0,0,115,50,0,0,0,122,16,116,0,160,1,116,0, + 106,2,124,0,161,2,87,0,83,0,4,0,116,3,121,48, + 1,0,1,0,1,0,116,0,160,1,116,0,106,4,124,0, + 161,2,6,0,89,0,83,0,119,0,114,114,0,0,0,41, + 5,218,6,119,105,110,114,101,103,90,7,79,112,101,110,75, + 101,121,90,17,72,75,69,89,95,67,85,82,82,69,78,84, + 95,85,83,69,82,114,58,0,0,0,90,18,72,75,69,89, + 95,76,79,67,65,76,95,77,65,67,72,73,78,69,114,19, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,14,95,111,112,101,110,95,114,101,103,105,115,116, + 114,121,247,2,0,0,115,12,0,0,0,2,2,16,1,12, + 1,18,1,2,255,255,128,122,36,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,2,0, + 0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0, + 0,0,67,0,0,0,115,130,0,0,0,124,0,106,0,114, + 14,124,0,106,1,125,2,110,6,124,0,106,2,125,2,124, + 2,106,3,124,1,100,1,116,4,106,5,100,0,100,2,133, + 2,25,0,22,0,100,3,141,2,125,3,122,60,124,0,160, + 6,124,3,161,1,143,28,125,4,116,7,160,8,124,4,100, + 4,161,2,125,5,87,0,100,0,4,0,4,0,131,3,1, + 0,110,16,49,0,115,94,119,1,1,0,1,0,1,0,89, + 0,1,0,87,0,124,5,83,0,4,0,116,9,121,128,1, + 0,1,0,1,0,89,0,100,0,83,0,119,0,41,5,78, + 122,5,37,100,46,37,100,114,39,0,0,0,41,2,114,143, + 0,0,0,90,11,115,121,115,95,118,101,114,115,105,111,110, + 114,10,0,0,0,41,10,218,11,68,69,66,85,71,95,66, + 85,73,76,68,218,18,82,69,71,73,83,84,82,89,95,75, + 69,89,95,68,69,66,85,71,218,12,82,69,71,73,83,84, + 82,89,95,75,69,89,114,70,0,0,0,114,15,0,0,0, + 218,12,118,101,114,115,105,111,110,95,105,110,102,111,114,197, + 0,0,0,114,196,0,0,0,90,10,81,117,101,114,121,86, + 97,108,117,101,114,58,0,0,0,41,6,218,3,99,108,115, + 114,143,0,0,0,90,12,114,101,103,105,115,116,114,121,95, + 107,101,121,114,20,0,0,0,90,4,104,107,101,121,218,8, + 102,105,108,101,112,97,116,104,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,16,95,115,101,97,114,99,104, + 95,114,101,103,105,115,116,114,121,254,2,0,0,115,28,0, + 0,0,6,2,8,1,6,2,6,1,16,1,6,255,2,2, + 12,1,44,1,4,3,12,254,6,1,2,255,255,128,122,38, + 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, + 105,110,100,101,114,46,95,115,101,97,114,99,104,95,114,101, + 103,105,115,116,114,121,78,99,4,0,0,0,0,0,0,0, + 0,0,0,0,8,0,0,0,8,0,0,0,67,0,0,0, + 115,118,0,0,0,124,0,160,0,124,1,161,1,125,4,124, + 4,100,0,117,0,114,22,100,0,83,0,122,12,116,1,124, + 4,131,1,1,0,87,0,110,18,4,0,116,2,121,116,1, + 0,1,0,1,0,89,0,100,0,83,0,116,3,131,0,68, + 0,93,50,92,2,125,5,125,6,124,4,160,4,116,5,124, + 6,131,1,161,1,114,60,116,6,106,7,124,1,124,5,124, + 1,124,4,131,2,124,4,100,1,141,3,125,7,124,7,2, + 0,1,0,83,0,100,0,83,0,119,0,41,2,78,114,184, + 0,0,0,41,8,114,204,0,0,0,114,57,0,0,0,114, + 58,0,0,0,114,188,0,0,0,114,115,0,0,0,114,116, + 0,0,0,114,139,0,0,0,218,16,115,112,101,99,95,102, + 114,111,109,95,108,111,97,100,101,114,41,8,114,202,0,0, + 0,114,143,0,0,0,114,52,0,0,0,218,6,116,97,114, + 103,101,116,114,203,0,0,0,114,144,0,0,0,114,193,0, + 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,9,102,105,110,100,95,115,112,101, + 99,13,3,0,0,115,34,0,0,0,10,2,8,1,4,1, + 2,1,12,1,12,1,6,1,14,1,14,1,6,1,8,1, + 2,1,6,254,8,3,4,251,2,254,255,128,122,31,87,105, + 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, + 100,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, + 0,0,67,0,0,0,115,30,0,0,0,124,0,160,0,124, + 1,124,2,161,2,125,3,124,3,100,1,117,1,114,26,124, + 3,106,1,83,0,100,1,83,0,41,2,122,108,70,105,110, + 100,32,109,111,100,117,108,101,32,110,97,109,101,100,32,105, + 110,32,116,104,101,32,114,101,103,105,115,116,114,121,46,10, 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, 101,100,46,32,32,85,115,101,32,101,120,101,99,95,109,111, 100,117,108,101,40,41,32,105,110,115,116,101,97,100,46,10, - 10,32,32,32,32,32,32,32,32,78,41,3,218,5,115,117, - 112,101,114,114,246,0,0,0,114,227,0,0,0,114,226,0, - 0,0,169,1,114,248,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,227,0,0,0,235,3,0,0,115,4,0,0, - 0,16,10,255,128,122,22,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,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, - 0,169,2,122,58,82,101,116,117,114,110,32,116,104,101,32, - 112,97,116,104,32,116,111,32,116,104,101,32,115,111,117,114, - 99,101,32,102,105,108,101,32,97,115,32,102,111,117,110,100, - 32,98,121,32,116,104,101,32,102,105,110,100,101,114,46,78, - 114,56,0,0,0,114,226,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,183,0,0,0,247,3, - 0,0,115,4,0,0,0,6,3,255,128,122,23,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,0,0,0, - 0,3,0,0,0,8,0,0,0,67,0,0,0,115,128,0, - 0,0,116,0,124,0,116,1,116,2,102,2,131,2,114,72, - 116,3,160,4,116,5,124,1,131,1,161,1,143,24,125,2, - 124,2,160,6,161,0,87,0,2,0,100,1,4,0,4,0, - 131,3,1,0,83,0,49,0,115,58,119,1,1,0,1,0, - 1,0,89,0,1,0,100,1,83,0,116,3,160,7,124,1, - 100,2,161,2,143,24,125,2,124,2,160,6,161,0,87,0, - 2,0,100,1,4,0,4,0,131,3,1,0,83,0,49,0, - 115,114,119,1,1,0,1,0,1,0,89,0,1,0,100,1, - 83,0,41,3,122,39,82,101,116,117,114,110,32,116,104,101, - 32,100,97,116,97,32,102,114,111,109,32,112,97,116,104,32, - 97,115,32,114,97,119,32,98,121,116,101,115,46,78,218,1, - 114,41,8,114,165,0,0,0,114,228,0,0,0,218,19,69, - 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, - 101,114,114,72,0,0,0,90,9,111,112,101,110,95,99,111, - 100,101,114,90,0,0,0,90,4,114,101,97,100,114,73,0, - 0,0,41,3,114,123,0,0,0,114,52,0,0,0,114,76, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,234,0,0,0,252,3,0,0,115,14,0,0,0, - 14,2,16,1,42,1,14,2,38,1,4,128,255,128,122,19, - 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,100, - 97,116,97,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,2,0,0,0,67,0,0,0,115,20,0,0, - 0,100,1,100,2,108,0,109,1,125,2,1,0,124,2,124, - 0,131,1,83,0,41,3,78,114,0,0,0,0,41,1,218, - 10,70,105,108,101,82,101,97,100,101,114,41,2,90,17,105, - 109,112,111,114,116,108,105,98,46,114,101,97,100,101,114,115, - 114,4,1,0,0,41,3,114,123,0,0,0,114,223,0,0, - 0,114,4,1,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,19,103,101,116,95,114,101,115,111,117, - 114,99,101,95,114,101,97,100,101,114,5,4,0,0,115,6, - 0,0,0,12,2,8,1,255,128,122,30,70,105,108,101,76, - 111,97,100,101,114,46,103,101,116,95,114,101,115,111,117,114, - 99,101,95,114,101,97,100,101,114,41,13,114,130,0,0,0, - 114,129,0,0,0,114,131,0,0,0,114,132,0,0,0,114, - 216,0,0,0,114,250,0,0,0,114,254,0,0,0,114,140, - 0,0,0,114,227,0,0,0,114,183,0,0,0,114,234,0, - 0,0,114,5,1,0,0,90,13,95,95,99,108,97,115,115, - 99,101,108,108,95,95,114,7,0,0,0,114,7,0,0,0, - 114,0,1,0,0,114,8,0,0,0,114,246,0,0,0,217, - 3,0,0,115,26,0,0,0,8,0,4,2,8,3,8,6, - 8,4,2,3,14,1,2,11,10,1,8,4,2,9,18,1, - 255,128,114,246,0,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,64,0,0,0, - 115,46,0,0,0,101,0,90,1,100,0,90,2,100,1,90, - 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, - 5,100,6,100,7,156,1,100,8,100,9,132,2,90,6,100, - 10,83,0,41,11,218,16,83,111,117,114,99,101,70,105,108, - 101,76,111,97,100,101,114,122,62,67,111,110,99,114,101,116, - 101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, - 32,111,102,32,83,111,117,114,99,101,76,111,97,100,101,114, - 32,117,115,105,110,103,32,116,104,101,32,102,105,108,101,32, - 115,121,115,116,101,109,46,99,2,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, - 115,22,0,0,0,116,0,124,1,131,1,125,2,124,2,106, - 1,124,2,106,2,100,1,156,2,83,0,41,3,122,33,82, - 101,116,117,114,110,32,116,104,101,32,109,101,116,97,100,97, - 116,97,32,102,111,114,32,116,104,101,32,112,97,116,104,46, - 41,2,114,173,0,0,0,114,241,0,0,0,78,41,3,114, - 57,0,0,0,218,8,115,116,95,109,116,105,109,101,90,7, - 115,116,95,115,105,122,101,41,3,114,123,0,0,0,114,52, - 0,0,0,114,245,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,231,0,0,0,15,4,0,0, - 115,6,0,0,0,8,2,14,1,255,128,122,27,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, - 0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,0, - 0,115,24,0,0,0,116,0,124,1,131,1,125,4,124,0, - 106,1,124,2,124,3,124,4,100,1,141,3,83,0,41,2, - 78,169,1,218,5,95,109,111,100,101,41,2,114,119,0,0, - 0,114,232,0,0,0,41,5,114,123,0,0,0,114,112,0, - 0,0,114,111,0,0,0,114,37,0,0,0,114,60,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,233,0,0,0,20,4,0,0,115,6,0,0,0,8,2, - 16,1,255,128,122,32,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,99,111,100,101,114,68,0,0,0,114,8,1,0,0, - 99,3,0,0,0,0,0,0,0,1,0,0,0,9,0,0, - 0,11,0,0,0,67,0,0,0,115,4,1,0,0,116,0, - 124,1,131,1,92,2,125,4,125,5,103,0,125,6,124,4, - 114,62,116,1,124,4,131,1,115,62,116,0,124,4,131,1, - 92,2,125,4,125,7,124,6,160,2,124,7,161,1,1,0, - 124,4,114,62,116,1,124,4,131,1,114,28,116,3,124,6, - 131,1,68,0,93,98,125,7,116,4,124,4,124,7,131,2, - 125,4,122,14,116,5,160,6,124,4,161,1,1,0,87,0, - 113,70,4,0,116,7,121,116,1,0,1,0,1,0,89,0, - 113,70,4,0,116,8,144,1,121,2,1,0,125,8,1,0, - 122,30,116,9,160,10,100,1,124,4,124,8,161,3,1,0, - 87,0,89,0,100,2,125,8,126,8,1,0,100,2,83,0, - 100,2,125,8,126,8,119,1,122,30,116,11,124,1,124,2, - 124,3,131,3,1,0,116,9,160,10,100,3,124,1,161,2, - 1,0,87,0,100,2,83,0,4,0,116,8,121,252,1,0, - 125,8,1,0,122,28,116,9,160,10,100,1,124,1,124,8, - 161,3,1,0,87,0,89,0,100,2,125,8,126,8,100,2, - 83,0,100,2,125,8,126,8,119,1,119,0,100,2,83,0, - 119,0,41,4,122,27,87,114,105,116,101,32,98,121,116,101, - 115,32,100,97,116,97,32,116,111,32,97,32,102,105,108,101, - 46,122,27,99,111,117,108,100,32,110,111,116,32,99,114,101, - 97,116,101,32,123,33,114,125,58,32,123,33,114,125,78,122, - 12,99,114,101,97,116,101,100,32,123,33,114,125,41,12,114, - 55,0,0,0,114,64,0,0,0,114,190,0,0,0,114,50, - 0,0,0,114,48,0,0,0,114,18,0,0,0,90,5,109, - 107,100,105,114,218,15,70,105,108,101,69,120,105,115,116,115, - 69,114,114,111,114,114,58,0,0,0,114,139,0,0,0,114, - 153,0,0,0,114,77,0,0,0,41,9,114,123,0,0,0, - 114,52,0,0,0,114,37,0,0,0,114,9,1,0,0,218, - 6,112,97,114,101,110,116,114,101,0,0,0,114,47,0,0, - 0,114,43,0,0,0,114,235,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,232,0,0,0,25, - 4,0,0,115,60,0,0,0,12,2,4,1,12,2,12,1, - 10,1,12,254,12,4,10,1,2,1,14,1,12,1,4,2, - 16,1,6,3,4,1,4,255,16,2,8,128,2,1,12,1, - 18,1,14,1,8,2,2,1,18,255,8,128,2,254,4,255, - 2,248,255,128,122,25,83,111,117,114,99,101,70,105,108,101, - 76,111,97,100,101,114,46,115,101,116,95,100,97,116,97,78, - 41,7,114,130,0,0,0,114,129,0,0,0,114,131,0,0, - 0,114,132,0,0,0,114,231,0,0,0,114,233,0,0,0, - 114,232,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,6,1,0,0,11,4, - 0,0,115,12,0,0,0,8,0,4,2,8,2,8,5,18, - 5,255,128,114,6,1,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,83,0,41,7,218,20,83,111,117,114,99,101, - 108,101,115,115,70,105,108,101,76,111,97,100,101,114,122,45, - 76,111,97,100,101,114,32,119,104,105,99,104,32,104,97,110, - 100,108,101,115,32,115,111,117,114,99,101,108,101,115,115,32, - 102,105,108,101,32,105,109,112,111,114,116,115,46,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, - 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,124, - 1,161,1,125,2,124,0,160,1,124,2,161,1,125,3,124, - 1,124,2,100,1,156,2,125,4,116,2,124,3,124,1,124, - 4,131,3,1,0,116,3,116,4,124,3,131,1,100,2,100, - 0,133,2,25,0,124,1,124,2,100,3,141,3,83,0,41, - 4,78,114,163,0,0,0,114,149,0,0,0,41,2,114,121, - 0,0,0,114,111,0,0,0,41,5,114,183,0,0,0,114, - 234,0,0,0,114,156,0,0,0,114,169,0,0,0,114,242, - 0,0,0,41,5,114,123,0,0,0,114,143,0,0,0,114, - 52,0,0,0,114,37,0,0,0,114,155,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,220,0, - 0,0,60,4,0,0,115,24,0,0,0,10,1,10,1,2, - 4,2,1,6,254,12,4,2,1,14,1,2,1,2,1,6, - 253,255,128,122,29,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,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,78, - 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, - 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, - 114,7,0,0,0,114,226,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,236,0,0,0,76,4, - 0,0,115,4,0,0,0,4,2,255,128,122,31,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,41,6,114, + 10,32,32,32,32,32,32,32,32,78,169,2,114,207,0,0, + 0,114,144,0,0,0,169,4,114,202,0,0,0,114,143,0, + 0,0,114,52,0,0,0,114,191,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,11,102,105,110, + 100,95,109,111,100,117,108,101,29,3,0,0,115,10,0,0, + 0,12,7,8,1,6,1,4,2,255,128,122,33,87,105,110, + 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, + 101,114,46,102,105,110,100,95,109,111,100,117,108,101,41,2, + 78,78,41,1,78,41,15,114,130,0,0,0,114,129,0,0, + 0,114,131,0,0,0,114,132,0,0,0,114,200,0,0,0, + 114,199,0,0,0,218,11,95,77,83,95,87,73,78,68,79, + 87,83,218,18,69,88,84,69,78,83,73,79,78,95,83,85, + 70,70,73,88,69,83,114,198,0,0,0,218,12,115,116,97, + 116,105,99,109,101,116,104,111,100,114,197,0,0,0,218,11, + 99,108,97,115,115,109,101,116,104,111,100,114,204,0,0,0, + 114,207,0,0,0,114,210,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,195, + 0,0,0,235,2,0,0,115,32,0,0,0,8,0,4,2, + 2,3,2,255,2,4,2,255,12,3,2,2,10,1,2,6, + 10,1,2,14,12,1,2,15,16,1,255,128,114,195,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,64,0,0,0,115,48,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, + 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,132, + 0,90,6,100,8,100,9,132,0,90,7,100,10,83,0,41, + 11,218,13,95,76,111,97,100,101,114,66,97,115,105,99,115, + 122,83,66,97,115,101,32,99,108,97,115,115,32,111,102,32, + 99,111,109,109,111,110,32,99,111,100,101,32,110,101,101,100, + 101,100,32,98,121,32,98,111,116,104,32,83,111,117,114,99, + 101,76,111,97,100,101,114,32,97,110,100,10,32,32,32,32, + 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111, + 97,100,101,114,46,99,2,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,4,0,0,0,67,0,0,0,115,64, + 0,0,0,116,0,124,0,160,1,124,1,161,1,131,1,100, + 1,25,0,125,2,124,2,160,2,100,2,100,1,161,2,100, + 3,25,0,125,3,124,1,160,3,100,2,161,1,100,4,25, + 0,125,4,124,3,100,5,107,2,111,62,124,4,100,5,107, + 3,83,0,41,7,122,141,67,111,110,99,114,101,116,101,32, + 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111, + 102,32,73,110,115,112,101,99,116,76,111,97,100,101,114,46, + 105,115,95,112,97,99,107,97,103,101,32,98,121,32,99,104, + 101,99,107,105,110,103,32,105,102,10,32,32,32,32,32,32, + 32,32,116,104,101,32,112,97,116,104,32,114,101,116,117,114, + 110,101,100,32,98,121,32,103,101,116,95,102,105,108,101,110, + 97,109,101,32,104,97,115,32,97,32,102,105,108,101,110,97, + 109,101,32,111,102,32,39,95,95,105,110,105,116,95,95,46, + 112,121,39,46,114,3,0,0,0,114,79,0,0,0,114,0, + 0,0,0,114,39,0,0,0,218,8,95,95,105,110,105,116, + 95,95,78,41,4,114,55,0,0,0,114,183,0,0,0,114, + 51,0,0,0,114,49,0,0,0,41,5,114,123,0,0,0, + 114,143,0,0,0,114,101,0,0,0,90,13,102,105,108,101, + 110,97,109,101,95,98,97,115,101,90,9,116,97,105,108,95, + 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,186,0,0,0,48,3,0,0,115,10,0,0, + 0,18,3,16,1,14,1,16,1,255,128,122,24,95,76,111, + 97,100,101,114,66,97,115,105,99,115,46,105,115,95,112,97, + 99,107,97,103,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,169,2,122,42,85,115,101,32,100, + 101,102,97,117,108,116,32,115,101,109,97,110,116,105,99,115, + 32,102,111,114,32,109,111,100,117,108,101,32,99,114,101,97, + 116,105,111,110,46,78,114,7,0,0,0,169,2,114,123,0, + 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,13,99,114,101,97,116,101,95,109, + 111,100,117,108,101,56,3,0,0,115,4,0,0,0,4,0, + 255,128,122,27,95,76,111,97,100,101,114,66,97,115,105,99, + 115,46,99,114,101,97,116,101,95,109,111,100,117,108,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 5,0,0,0,67,0,0,0,115,56,0,0,0,124,0,160, + 0,124,1,106,1,161,1,125,2,124,2,100,1,117,0,114, + 36,116,2,100,2,160,3,124,1,106,1,161,1,131,1,130, + 1,116,4,160,5,116,6,124,2,124,1,106,7,161,3,1, + 0,100,1,83,0,41,3,122,19,69,120,101,99,117,116,101, + 32,116,104,101,32,109,111,100,117,108,101,46,78,122,52,99, + 97,110,110,111,116,32,108,111,97,100,32,109,111,100,117,108, + 101,32,123,33,114,125,32,119,104,101,110,32,103,101,116,95, + 99,111,100,101,40,41,32,114,101,116,117,114,110,115,32,78, + 111,110,101,41,8,218,8,103,101,116,95,99,111,100,101,114, + 130,0,0,0,114,122,0,0,0,114,70,0,0,0,114,139, + 0,0,0,218,25,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,218,4, + 101,120,101,99,114,136,0,0,0,41,3,114,123,0,0,0, + 218,6,109,111,100,117,108,101,114,168,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,11,101,120, + 101,99,95,109,111,100,117,108,101,59,3,0,0,115,14,0, + 0,0,12,2,8,1,6,1,4,1,6,255,20,2,255,128, + 122,25,95,76,111,97,100,101,114,66,97,115,105,99,115,46, + 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, + 67,0,0,0,115,12,0,0,0,116,0,160,1,124,0,124, + 1,161,2,83,0,41,2,122,26,84,104,105,115,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,78,41,2,114,139,0,0,0,218,17,95,108,111, + 97,100,95,109,111,100,117,108,101,95,115,104,105,109,169,2, + 114,123,0,0,0,114,143,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,11,108,111,97,100,95, + 109,111,100,117,108,101,67,3,0,0,115,4,0,0,0,12, + 3,255,128,122,25,95,76,111,97,100,101,114,66,97,115,105, + 99,115,46,108,111,97,100,95,109,111,100,117,108,101,78,41, + 8,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, + 114,132,0,0,0,114,186,0,0,0,114,219,0,0,0,114, + 224,0,0,0,114,227,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,215,0, + 0,0,43,3,0,0,115,14,0,0,0,8,0,4,2,8, + 3,8,8,8,3,12,8,255,128,114,215,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,64,0,0,0,115,74,0,0,0,101,0,90,1, + 100,0,90,2,100,1,100,2,132,0,90,3,100,3,100,4, + 132,0,90,4,100,5,100,6,132,0,90,5,100,7,100,8, + 132,0,90,6,100,9,100,10,132,0,90,7,100,11,100,12, + 156,1,100,13,100,14,132,2,90,8,100,15,100,16,132,0, + 90,9,100,17,83,0,41,18,218,12,83,111,117,114,99,101, + 76,111,97,100,101,114,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,116,0,130,1,41,2,122,165,79,112,116,105, + 111,110,97,108,32,109,101,116,104,111,100,32,116,104,97,116, + 32,114,101,116,117,114,110,115,32,116,104,101,32,109,111,100, + 105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,40, + 97,110,32,105,110,116,41,32,102,111,114,32,116,104,101,10, + 32,32,32,32,32,32,32,32,115,112,101,99,105,102,105,101, + 100,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, + 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32, + 79,83,69,114,114,111,114,32,119,104,101,110,32,116,104,101, + 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32, + 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32, + 32,78,41,1,114,58,0,0,0,169,2,114,123,0,0,0, + 114,52,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,10,112,97,116,104,95,109,116,105,109,101, + 75,3,0,0,115,4,0,0,0,4,6,255,128,122,23,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,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 14,0,0,0,100,1,124,0,160,0,124,1,161,1,105,1, + 83,0,41,3,97,158,1,0,0,79,112,116,105,111,110,97, + 108,32,109,101,116,104,111,100,32,114,101,116,117,114,110,105, + 110,103,32,97,32,109,101,116,97,100,97,116,97,32,100,105, + 99,116,32,102,111,114,32,116,104,101,32,115,112,101,99,105, + 102,105,101,100,10,32,32,32,32,32,32,32,32,112,97,116, + 104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,32, + 32,32,32,32,80,111,115,115,105,98,108,101,32,107,101,121, + 115,58,10,32,32,32,32,32,32,32,32,45,32,39,109,116, + 105,109,101,39,32,40,109,97,110,100,97,116,111,114,121,41, + 32,105,115,32,116,104,101,32,110,117,109,101,114,105,99,32, + 116,105,109,101,115,116,97,109,112,32,111,102,32,108,97,115, + 116,32,115,111,117,114,99,101,10,32,32,32,32,32,32,32, + 32,32,32,99,111,100,101,32,109,111,100,105,102,105,99,97, + 116,105,111,110,59,10,32,32,32,32,32,32,32,32,45,32, + 39,115,105,122,101,39,32,40,111,112,116,105,111,110,97,108, + 41,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110, + 32,98,121,116,101,115,32,111,102,32,116,104,101,32,115,111, + 117,114,99,101,32,99,111,100,101,46,10,10,32,32,32,32, + 32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,103, + 32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,108, + 111,119,115,32,116,104,101,32,108,111,97,100,101,114,32,116, + 111,32,114,101,97,100,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,82, + 97,105,115,101,115,32,79,83,69,114,114,111,114,32,119,104, + 101,110,32,116,104,101,32,112,97,116,104,32,99,97,110,110, + 111,116,32,98,101,32,104,97,110,100,108,101,100,46,10,32, + 32,32,32,32,32,32,32,114,173,0,0,0,78,41,1,114, + 230,0,0,0,114,229,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,10,112,97,116,104,95,115, + 116,97,116,115,83,3,0,0,115,4,0,0,0,14,12,255, + 128,122,23,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,0,0,0,0,4,0,0,0,4,0,0,0,67, + 0,0,0,115,12,0,0,0,124,0,160,0,124,2,124,3, + 161,2,83,0,41,2,122,228,79,112,116,105,111,110,97,108, + 32,109,101,116,104,111,100,32,119,104,105,99,104,32,119,114, + 105,116,101,115,32,100,97,116,97,32,40,98,121,116,101,115, + 41,32,116,111,32,97,32,102,105,108,101,32,112,97,116,104, + 32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,32, + 32,32,32,73,109,112,108,101,109,101,110,116,105,110,103,32, + 116,104,105,115,32,109,101,116,104,111,100,32,97,108,108,111, + 119,115,32,102,111,114,32,116,104,101,32,119,114,105,116,105, + 110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,102, + 105,108,101,115,46,10,10,32,32,32,32,32,32,32,32,84, + 104,101,32,115,111,117,114,99,101,32,112,97,116,104,32,105, + 115,32,110,101,101,100,101,100,32,105,110,32,111,114,100,101, + 114,32,116,111,32,99,111,114,114,101,99,116,108,121,32,116, + 114,97,110,115,102,101,114,32,112,101,114,109,105,115,115,105, + 111,110,115,10,32,32,32,32,32,32,32,32,78,41,1,218, + 8,115,101,116,95,100,97,116,97,41,4,114,123,0,0,0, + 114,112,0,0,0,90,10,99,97,99,104,101,95,112,97,116, + 104,114,37,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,15,95,99,97,99,104,101,95,98,121, + 116,101,99,111,100,101,97,3,0,0,115,4,0,0,0,12, + 8,255,128,122,28,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,0,0,0,0,3,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,122,150,79,112,116,105,111,110,97,108,32, + 109,101,116,104,111,100,32,119,104,105,99,104,32,119,114,105, + 116,101,115,32,100,97,116,97,32,40,98,121,116,101,115,41, + 32,116,111,32,97,32,102,105,108,101,32,112,97,116,104,32, + 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, + 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, + 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, + 115,32,102,111,114,32,116,104,101,32,119,114,105,116,105,110, + 103,32,111,102,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,115,46,10,32,32,32,32,32,32,32,32,78,114,7, + 0,0,0,41,3,114,123,0,0,0,114,52,0,0,0,114, + 37,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,232,0,0,0,107,3,0,0,115,4,0,0, + 0,4,0,255,128,122,21,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,0,0,0,0,5,0,0,0,10,0,0, + 0,67,0,0,0,115,70,0,0,0,124,0,160,0,124,1, + 161,1,125,2,122,20,124,0,160,1,124,2,161,1,125,3, + 87,0,116,4,124,3,131,1,83,0,4,0,116,2,121,68, + 1,0,125,4,1,0,122,14,116,3,100,1,124,1,100,2, + 141,2,124,4,130,2,100,3,125,4,126,4,119,1,119,0, + 41,4,122,52,67,111,110,99,114,101,116,101,32,105,109,112, + 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73, + 110,115,112,101,99,116,76,111,97,100,101,114,46,103,101,116, + 95,115,111,117,114,99,101,46,122,39,115,111,117,114,99,101, + 32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,116, + 104,114,111,117,103,104,32,103,101,116,95,100,97,116,97,40, + 41,114,120,0,0,0,78,41,5,114,183,0,0,0,218,8, + 103,101,116,95,100,97,116,97,114,58,0,0,0,114,122,0, + 0,0,114,180,0,0,0,41,5,114,123,0,0,0,114,143, + 0,0,0,114,52,0,0,0,114,178,0,0,0,218,3,101, + 120,99,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,10,103,101,116,95,115,111,117,114,99,101,114,3,0, + 0,115,26,0,0,0,10,2,2,1,12,1,8,4,14,253, + 4,1,2,1,4,255,2,1,2,255,8,128,2,255,255,128, + 122,23,83,111,117,114,99,101,76,111,97,100,101,114,46,103, + 101,116,95,115,111,117,114,99,101,114,109,0,0,0,41,1, + 218,9,95,111,112,116,105,109,105,122,101,99,3,0,0,0, + 0,0,0,0,1,0,0,0,4,0,0,0,8,0,0,0, + 67,0,0,0,115,22,0,0,0,116,0,106,1,116,2,124, + 1,124,2,100,1,100,2,124,3,100,3,141,6,83,0,41, + 5,122,130,82,101,116,117,114,110,32,116,104,101,32,99,111, + 100,101,32,111,98,106,101,99,116,32,99,111,109,112,105,108, + 101,100,32,102,114,111,109,32,115,111,117,114,99,101,46,10, + 10,32,32,32,32,32,32,32,32,84,104,101,32,39,100,97, + 116,97,39,32,97,114,103,117,109,101,110,116,32,99,97,110, + 32,98,101,32,97,110,121,32,111,98,106,101,99,116,32,116, + 121,112,101,32,116,104,97,116,32,99,111,109,112,105,108,101, + 40,41,32,115,117,112,112,111,114,116,115,46,10,32,32,32, + 32,32,32,32,32,114,222,0,0,0,84,41,2,218,12,100, + 111,110,116,95,105,110,104,101,114,105,116,114,89,0,0,0, + 78,41,3,114,139,0,0,0,114,221,0,0,0,218,7,99, + 111,109,112,105,108,101,41,4,114,123,0,0,0,114,37,0, + 0,0,114,52,0,0,0,114,237,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,14,115,111,117, + 114,99,101,95,116,111,95,99,111,100,101,124,3,0,0,115, + 8,0,0,0,12,5,4,1,6,255,255,128,122,27,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,0,0,0,0,15,0,0,0,9,0,0,0,67,0, + 0,0,115,34,2,0,0,124,0,160,0,124,1,161,1,125, + 2,100,1,125,3,100,1,125,4,100,1,125,5,100,2,125, + 6,100,3,125,7,122,12,116,1,124,2,131,1,125,8,87, + 0,110,24,4,0,116,2,144,2,121,32,1,0,1,0,1, + 0,100,1,125,8,89,0,144,1,110,38,122,14,124,0,160, + 3,124,2,161,1,125,9,87,0,110,20,4,0,116,4,144, + 2,121,30,1,0,1,0,1,0,89,0,144,1,110,2,116, + 5,124,9,100,4,25,0,131,1,125,3,122,14,124,0,160, + 6,124,8,161,1,125,10,87,0,110,18,4,0,116,4,144, + 2,121,28,1,0,1,0,1,0,89,0,110,212,124,1,124, + 8,100,5,156,2,125,11,122,148,116,7,124,10,124,1,124, + 11,131,3,125,12,116,8,124,10,131,1,100,6,100,1,133, + 2,25,0,125,13,124,12,100,7,64,0,100,8,107,3,125, + 6,124,6,144,1,114,30,124,12,100,9,64,0,100,8,107, + 3,125,7,116,9,106,10,100,10,107,3,144,1,114,50,124, + 7,115,248,116,9,106,10,100,11,107,2,144,1,114,50,124, + 0,160,6,124,2,161,1,125,4,116,9,160,11,116,12,124, + 4,161,2,125,5,116,13,124,10,124,5,124,1,124,11,131, + 4,1,0,110,20,116,14,124,10,124,3,124,9,100,12,25, + 0,124,1,124,11,131,5,1,0,87,0,110,22,4,0,116, + 15,116,16,102,2,144,2,121,26,1,0,1,0,1,0,89, + 0,110,30,116,17,160,18,100,13,124,8,124,2,161,3,1, + 0,116,19,124,13,124,1,124,8,124,2,100,14,141,4,83, + 0,124,4,100,1,117,0,144,1,114,126,124,0,160,6,124, + 2,161,1,125,4,124,0,160,20,124,4,124,2,161,2,125, + 14,116,17,160,18,100,15,124,2,161,2,1,0,116,21,106, + 22,144,2,115,20,124,8,100,1,117,1,144,2,114,20,124, + 3,100,1,117,1,144,2,114,20,124,6,144,1,114,218,124, + 5,100,1,117,0,144,1,114,204,116,9,160,11,124,4,161, + 1,125,5,116,23,124,14,124,5,124,7,131,3,125,10,110, + 16,116,24,124,14,124,3,116,25,124,4,131,1,131,3,125, + 10,122,20,124,0,160,26,124,2,124,8,124,10,161,3,1, + 0,87,0,124,14,83,0,4,0,116,2,144,2,121,24,1, + 0,1,0,1,0,89,0,124,14,83,0,124,14,83,0,119, + 0,119,0,119,0,119,0,119,0,41,16,122,190,67,111,110, + 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, + 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76, + 111,97,100,101,114,46,103,101,116,95,99,111,100,101,46,10, + 10,32,32,32,32,32,32,32,32,82,101,97,100,105,110,103, + 32,111,102,32,98,121,116,101,99,111,100,101,32,114,101,113, + 117,105,114,101,115,32,112,97,116,104,95,115,116,97,116,115, + 32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116, + 101,100,46,32,84,111,32,119,114,105,116,101,10,32,32,32, + 32,32,32,32,32,98,121,116,101,99,111,100,101,44,32,115, + 101,116,95,100,97,116,97,32,109,117,115,116,32,97,108,115, + 111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100, + 46,10,10,32,32,32,32,32,32,32,32,78,70,84,114,173, + 0,0,0,114,163,0,0,0,114,149,0,0,0,114,3,0, + 0,0,114,0,0,0,0,114,39,0,0,0,90,5,110,101, + 118,101,114,90,6,97,108,119,97,121,115,218,4,115,105,122, + 101,122,13,123,125,32,109,97,116,99,104,101,115,32,123,125, + 41,3,114,121,0,0,0,114,111,0,0,0,114,112,0,0, + 0,122,19,99,111,100,101,32,111,98,106,101,99,116,32,102, + 114,111,109,32,123,125,41,27,114,183,0,0,0,114,102,0, + 0,0,114,88,0,0,0,114,231,0,0,0,114,58,0,0, + 0,114,30,0,0,0,114,234,0,0,0,114,156,0,0,0, + 218,10,109,101,109,111,114,121,118,105,101,119,114,167,0,0, + 0,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, + 115,101,100,95,112,121,99,115,114,161,0,0,0,218,17,95, + 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, + 114,162,0,0,0,114,160,0,0,0,114,122,0,0,0,114, + 154,0,0,0,114,139,0,0,0,114,153,0,0,0,114,169, + 0,0,0,114,240,0,0,0,114,15,0,0,0,218,19,100, + 111,110,116,95,119,114,105,116,101,95,98,121,116,101,99,111, + 100,101,114,175,0,0,0,114,174,0,0,0,114,4,0,0, + 0,114,233,0,0,0,41,15,114,123,0,0,0,114,143,0, + 0,0,114,112,0,0,0,114,158,0,0,0,114,178,0,0, + 0,114,161,0,0,0,90,10,104,97,115,104,95,98,97,115, + 101,100,90,12,99,104,101,99,107,95,115,111,117,114,99,101, + 114,111,0,0,0,218,2,115,116,114,37,0,0,0,114,155, + 0,0,0,114,16,0,0,0,90,10,98,121,116,101,115,95, + 100,97,116,97,90,11,99,111,100,101,95,111,98,106,101,99, + 116,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,220,0,0,0,132,3,0,0,115,166,0,0,0,10,7, + 4,1,4,1,4,1,4,1,4,1,2,1,12,1,14,1, + 10,1,2,2,14,1,14,1,6,1,12,2,2,1,14,1, + 14,1,4,1,2,3,2,1,6,254,2,4,12,1,16,1, + 12,1,6,1,12,1,12,1,2,1,2,255,8,2,4,254, + 10,3,4,1,2,1,2,1,4,254,8,4,2,1,6,255, + 2,3,2,1,2,1,6,1,2,1,2,1,8,251,18,7, + 4,1,8,2,2,1,4,255,6,2,2,1,2,1,6,254, + 10,3,10,1,12,1,12,1,18,1,6,1,4,255,6,2, + 10,1,10,1,14,1,6,2,6,1,4,255,2,2,16,1, + 4,3,14,254,2,1,8,1,2,254,2,233,2,225,2,250, + 2,251,255,128,122,21,83,111,117,114,99,101,76,111,97,100, + 101,114,46,103,101,116,95,99,111,100,101,78,41,10,114,130, + 0,0,0,114,129,0,0,0,114,131,0,0,0,114,230,0, + 0,0,114,231,0,0,0,114,233,0,0,0,114,232,0,0, + 0,114,236,0,0,0,114,240,0,0,0,114,220,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,228,0,0,0,73,3,0,0,115,18,0, + 0,0,8,0,8,2,8,8,8,14,8,10,8,7,14,10, + 12,8,255,128,114,228,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, + 0,0,115,92,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, + 0,90,5,100,6,100,7,132,0,90,6,101,7,135,0,102, + 1,100,8,100,9,132,8,131,1,90,8,101,7,100,10,100, + 11,132,0,131,1,90,9,100,12,100,13,132,0,90,10,101, + 7,100,14,100,15,132,0,131,1,90,11,135,0,4,0,90, + 12,83,0,41,16,218,10,70,105,108,101,76,111,97,100,101, + 114,122,103,66,97,115,101,32,102,105,108,101,32,108,111,97, + 100,101,114,32,99,108,97,115,115,32,119,104,105,99,104,32, + 105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,108, + 111,97,100,101,114,32,112,114,111,116,111,99,111,108,32,109, + 101,116,104,111,100,115,32,116,104,97,116,10,32,32,32,32, + 114,101,113,117,105,114,101,32,102,105,108,101,32,115,121,115, + 116,101,109,32,117,115,97,103,101,46,99,3,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,67, + 0,0,0,115,16,0,0,0,124,1,124,0,95,0,124,2, + 124,0,95,1,100,1,83,0,41,2,122,75,67,97,99,104, + 101,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109, + 101,32,97,110,100,32,116,104,101,32,112,97,116,104,32,116, + 111,32,116,104,101,32,102,105,108,101,32,102,111,117,110,100, + 32,98,121,32,116,104,101,10,32,32,32,32,32,32,32,32, + 102,105,110,100,101,114,46,78,114,163,0,0,0,41,3,114, + 123,0,0,0,114,143,0,0,0,114,52,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, + 0,0,222,3,0,0,115,6,0,0,0,6,3,10,1,255, + 128,122,19,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,0, + 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, + 24,0,0,0,124,0,106,0,124,1,106,0,107,2,111,22, + 124,0,106,1,124,1,106,1,107,2,83,0,114,114,0,0, + 0,169,2,218,9,95,95,99,108,97,115,115,95,95,114,136, + 0,0,0,169,2,114,123,0,0,0,90,5,111,116,104,101, + 114,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,6,95,95,101,113,95,95,228,3,0,0,115,8,0,0, + 0,12,1,10,1,2,255,255,128,122,17,70,105,108,101,76, + 111,97,100,101,114,46,95,95,101,113,95,95,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,20,0,0,0,116,0,124,0,106,1, + 131,1,116,0,124,0,106,2,131,1,65,0,83,0,114,114, + 0,0,0,169,3,218,4,104,97,115,104,114,121,0,0,0, + 114,52,0,0,0,169,1,114,123,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,8,95,95,104, + 97,115,104,95,95,232,3,0,0,115,4,0,0,0,20,1, + 255,128,122,19,70,105,108,101,76,111,97,100,101,114,46,95, + 95,104,97,115,104,95,95,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0, + 115,16,0,0,0,116,0,116,1,124,0,131,2,160,2,124, + 1,161,1,83,0,41,2,122,100,76,111,97,100,32,97,32, + 109,111,100,117,108,101,32,102,114,111,109,32,97,32,102,105, + 108,101,46,10,10,32,32,32,32,32,32,32,32,84,104,105, + 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, + 101,99,97,116,101,100,46,32,32,85,115,101,32,101,120,101, + 99,95,109,111,100,117,108,101,40,41,32,105,110,115,116,101, + 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,3, + 218,5,115,117,112,101,114,114,246,0,0,0,114,227,0,0, + 0,114,226,0,0,0,169,1,114,248,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,227,0,0,0,235,3,0,0, + 115,4,0,0,0,16,10,255,128,122,22,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,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,6,0,0,0,124, + 0,106,0,83,0,169,2,122,58,82,101,116,117,114,110,32, + 116,104,101,32,112,97,116,104,32,116,111,32,116,104,101,32, + 115,111,117,114,99,101,32,102,105,108,101,32,97,115,32,102, + 111,117,110,100,32,98,121,32,116,104,101,32,102,105,110,100, + 101,114,46,78,114,56,0,0,0,114,226,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,183,0, + 0,0,247,3,0,0,115,4,0,0,0,6,3,255,128,122, + 23,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,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, + 0,115,128,0,0,0,116,0,124,0,116,1,116,2,102,2, + 131,2,114,72,116,3,160,4,116,5,124,1,131,1,161,1, + 143,24,125,2,124,2,160,6,161,0,87,0,2,0,100,1, + 4,0,4,0,131,3,1,0,83,0,49,0,115,58,119,1, + 1,0,1,0,1,0,89,0,1,0,100,1,83,0,116,3, + 160,7,124,1,100,2,161,2,143,24,125,2,124,2,160,6, + 161,0,87,0,2,0,100,1,4,0,4,0,131,3,1,0, + 83,0,49,0,115,114,119,1,1,0,1,0,1,0,89,0, + 1,0,100,1,83,0,41,3,122,39,82,101,116,117,114,110, + 32,116,104,101,32,100,97,116,97,32,102,114,111,109,32,112, + 97,116,104,32,97,115,32,114,97,119,32,98,121,116,101,115, + 46,78,218,1,114,41,8,114,165,0,0,0,114,228,0,0, + 0,218,19,69,120,116,101,110,115,105,111,110,70,105,108,101, + 76,111,97,100,101,114,114,72,0,0,0,90,9,111,112,101, + 110,95,99,111,100,101,114,90,0,0,0,90,4,114,101,97, + 100,114,73,0,0,0,41,3,114,123,0,0,0,114,52,0, + 0,0,114,76,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,234,0,0,0,252,3,0,0,115, + 14,0,0,0,14,2,16,1,42,1,14,2,38,1,4,128, + 255,128,122,19,70,105,108,101,76,111,97,100,101,114,46,103, + 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,2,0,0,0,67,0,0,0, + 115,20,0,0,0,100,1,100,2,108,0,109,1,125,2,1, + 0,124,2,124,0,131,1,83,0,41,3,78,114,0,0,0, + 0,41,1,218,10,70,105,108,101,82,101,97,100,101,114,41, + 2,90,17,105,109,112,111,114,116,108,105,98,46,114,101,97, + 100,101,114,115,114,4,1,0,0,41,3,114,123,0,0,0, + 114,223,0,0,0,114,4,1,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,19,103,101,116,95,114, + 101,115,111,117,114,99,101,95,114,101,97,100,101,114,5,4, + 0,0,115,6,0,0,0,12,2,8,1,255,128,122,30,70, + 105,108,101,76,111,97,100,101,114,46,103,101,116,95,114,101, + 115,111,117,114,99,101,95,114,101,97,100,101,114,41,13,114, 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, - 0,0,0,114,220,0,0,0,114,236,0,0,0,114,7,0, + 0,0,0,114,216,0,0,0,114,250,0,0,0,114,254,0, + 0,0,114,140,0,0,0,114,227,0,0,0,114,183,0,0, + 0,114,234,0,0,0,114,5,1,0,0,90,13,95,95,99, + 108,97,115,115,99,101,108,108,95,95,114,7,0,0,0,114, + 7,0,0,0,114,0,1,0,0,114,8,0,0,0,114,246, + 0,0,0,217,3,0,0,115,26,0,0,0,8,0,4,2, + 8,3,8,6,8,4,2,3,14,1,2,11,10,1,8,4, + 2,9,18,1,255,128,114,246,0,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 64,0,0,0,115,46,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, + 5,132,0,90,5,100,6,100,7,156,1,100,8,100,9,132, + 2,90,6,100,10,83,0,41,11,218,16,83,111,117,114,99, + 101,70,105,108,101,76,111,97,100,101,114,122,62,67,111,110, + 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, + 116,105,111,110,32,111,102,32,83,111,117,114,99,101,76,111, + 97,100,101,114,32,117,115,105,110,103,32,116,104,101,32,102, + 105,108,101,32,115,121,115,116,101,109,46,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,22,0,0,0,116,0,124,1,131,1,125, + 2,124,2,106,1,124,2,106,2,100,1,156,2,83,0,41, + 3,122,33,82,101,116,117,114,110,32,116,104,101,32,109,101, + 116,97,100,97,116,97,32,102,111,114,32,116,104,101,32,112, + 97,116,104,46,41,2,114,173,0,0,0,114,241,0,0,0, + 78,41,3,114,57,0,0,0,218,8,115,116,95,109,116,105, + 109,101,90,7,115,116,95,115,105,122,101,41,3,114,123,0, + 0,0,114,52,0,0,0,114,245,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,231,0,0,0, + 15,4,0,0,115,6,0,0,0,8,2,14,1,255,128,122, + 27,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,0,0,0,0,0,5,0,0,0,5,0,0, + 0,67,0,0,0,115,24,0,0,0,116,0,124,1,131,1, + 125,4,124,0,106,1,124,2,124,3,124,4,100,1,141,3, + 83,0,41,2,78,169,1,218,5,95,109,111,100,101,41,2, + 114,119,0,0,0,114,232,0,0,0,41,5,114,123,0,0, + 0,114,112,0,0,0,114,111,0,0,0,114,37,0,0,0, + 114,60,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,233,0,0,0,20,4,0,0,115,6,0, + 0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,68,0,0,0,114, + 8,1,0,0,99,3,0,0,0,0,0,0,0,1,0,0, + 0,9,0,0,0,11,0,0,0,67,0,0,0,115,4,1, + 0,0,116,0,124,1,131,1,92,2,125,4,125,5,103,0, + 125,6,124,4,114,62,116,1,124,4,131,1,115,62,116,0, + 124,4,131,1,92,2,125,4,125,7,124,6,160,2,124,7, + 161,1,1,0,124,4,114,62,116,1,124,4,131,1,114,28, + 116,3,124,6,131,1,68,0,93,98,125,7,116,4,124,4, + 124,7,131,2,125,4,122,14,116,5,160,6,124,4,161,1, + 1,0,87,0,113,70,4,0,116,7,121,116,1,0,1,0, + 1,0,89,0,113,70,4,0,116,8,144,1,121,2,1,0, + 125,8,1,0,122,30,116,9,160,10,100,1,124,4,124,8, + 161,3,1,0,87,0,89,0,100,2,125,8,126,8,1,0, + 100,2,83,0,100,2,125,8,126,8,119,1,122,30,116,11, + 124,1,124,2,124,3,131,3,1,0,116,9,160,10,100,3, + 124,1,161,2,1,0,87,0,100,2,83,0,4,0,116,8, + 121,252,1,0,125,8,1,0,122,28,116,9,160,10,100,1, + 124,1,124,8,161,3,1,0,87,0,89,0,100,2,125,8, + 126,8,100,2,83,0,100,2,125,8,126,8,119,1,119,0, + 100,2,83,0,119,0,41,4,122,27,87,114,105,116,101,32, + 98,121,116,101,115,32,100,97,116,97,32,116,111,32,97,32, + 102,105,108,101,46,122,27,99,111,117,108,100,32,110,111,116, + 32,99,114,101,97,116,101,32,123,33,114,125,58,32,123,33, + 114,125,78,122,12,99,114,101,97,116,101,100,32,123,33,114, + 125,41,12,114,55,0,0,0,114,64,0,0,0,114,190,0, + 0,0,114,50,0,0,0,114,48,0,0,0,114,18,0,0, + 0,90,5,109,107,100,105,114,218,15,70,105,108,101,69,120, + 105,115,116,115,69,114,114,111,114,114,58,0,0,0,114,139, + 0,0,0,114,153,0,0,0,114,77,0,0,0,41,9,114, + 123,0,0,0,114,52,0,0,0,114,37,0,0,0,114,9, + 1,0,0,218,6,112,97,114,101,110,116,114,101,0,0,0, + 114,47,0,0,0,114,43,0,0,0,114,235,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,232, + 0,0,0,25,4,0,0,115,60,0,0,0,12,2,4,1, + 12,2,12,1,10,1,12,254,12,4,10,1,2,1,14,1, + 12,1,4,2,16,1,6,3,4,1,4,255,16,2,8,128, + 2,1,12,1,18,1,14,1,8,2,2,1,18,255,8,128, + 2,254,4,255,2,248,255,128,122,25,83,111,117,114,99,101, + 70,105,108,101,76,111,97,100,101,114,46,115,101,116,95,100, + 97,116,97,78,41,7,114,130,0,0,0,114,129,0,0,0, + 114,131,0,0,0,114,132,0,0,0,114,231,0,0,0,114, + 233,0,0,0,114,232,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,6,1, + 0,0,11,4,0,0,115,12,0,0,0,8,0,4,2,8, + 2,8,5,18,5,255,128,114,6,1,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,64,0,0,0,115,32,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, + 100,5,132,0,90,5,100,6,83,0,41,7,218,20,83,111, + 117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,100, + 101,114,122,45,76,111,97,100,101,114,32,119,104,105,99,104, + 32,104,97,110,100,108,101,115,32,115,111,117,114,99,101,108, + 101,115,115,32,102,105,108,101,32,105,109,112,111,114,116,115, + 46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,5,0,0,0,67,0,0,0,115,68,0,0,0,124, + 0,160,0,124,1,161,1,125,2,124,0,160,1,124,2,161, + 1,125,3,124,1,124,2,100,1,156,2,125,4,116,2,124, + 3,124,1,124,4,131,3,1,0,116,3,116,4,124,3,131, + 1,100,2,100,0,133,2,25,0,124,1,124,2,100,3,141, + 3,83,0,41,4,78,114,163,0,0,0,114,149,0,0,0, + 41,2,114,121,0,0,0,114,111,0,0,0,41,5,114,183, + 0,0,0,114,234,0,0,0,114,156,0,0,0,114,169,0, + 0,0,114,242,0,0,0,41,5,114,123,0,0,0,114,143, + 0,0,0,114,52,0,0,0,114,37,0,0,0,114,155,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,12,1,0,0,56,4,0,0,115,10,0,0,0,8, - 0,4,2,8,2,12,16,255,128,114,12,1,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,64,0,0,0,115,92,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, - 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6, - 100,8,100,9,132,0,90,7,100,10,100,11,132,0,90,8, - 100,12,100,13,132,0,90,9,100,14,100,15,132,0,90,10, - 100,16,100,17,132,0,90,11,101,12,100,18,100,19,132,0, - 131,1,90,13,100,20,83,0,41,21,114,3,1,0,0,122, - 93,76,111,97,100,101,114,32,102,111,114,32,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,115,46,10,10, - 32,32,32,32,84,104,101,32,99,111,110,115,116,114,117,99, - 116,111,114,32,105,115,32,100,101,115,105,103,110,101,100,32, - 116,111,32,119,111,114,107,32,119,105,116,104,32,70,105,108, - 101,70,105,110,100,101,114,46,10,10,32,32,32,32,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2, - 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0, - 95,0,124,2,124,0,95,1,100,0,83,0,114,114,0,0, - 0,114,163,0,0,0,41,3,114,123,0,0,0,114,121,0, - 0,0,114,52,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,216,0,0,0,89,4,0,0,115, - 6,0,0,0,6,1,10,1,255,128,122,28,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, - 0,115,24,0,0,0,124,0,106,0,124,1,106,0,107,2, - 111,22,124,0,106,1,124,1,106,1,107,2,83,0,114,114, - 0,0,0,114,247,0,0,0,114,249,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,250,0,0, - 0,93,4,0,0,115,8,0,0,0,12,1,10,1,2,255, - 255,128,122,26,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,46,95,95,101,113,95,95,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,20,0,0,0,116,0,124,0, - 106,1,131,1,116,0,124,0,106,2,131,1,65,0,83,0, - 114,114,0,0,0,114,251,0,0,0,114,253,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,254, - 0,0,0,97,4,0,0,115,4,0,0,0,20,1,255,128, - 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76, - 111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, - 0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1, - 116,2,106,3,124,1,161,2,125,2,116,0,160,4,100,1, - 124,1,106,5,124,0,106,6,161,3,1,0,124,2,83,0, - 41,3,122,38,67,114,101,97,116,101,32,97,110,32,117,110, - 105,116,105,97,108,105,122,101,100,32,101,120,116,101,110,115, - 105,111,110,32,109,111,100,117,108,101,122,38,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,32,123,33,114, - 125,32,108,111,97,100,101,100,32,102,114,111,109,32,123,33, - 114,125,78,41,7,114,139,0,0,0,114,221,0,0,0,114, - 167,0,0,0,90,14,99,114,101,97,116,101,95,100,121,110, - 97,109,105,99,114,153,0,0,0,114,121,0,0,0,114,52, - 0,0,0,41,3,114,123,0,0,0,114,191,0,0,0,114, - 223,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,219,0,0,0,100,4,0,0,115,16,0,0, - 0,4,2,6,1,4,255,6,2,8,1,4,255,4,2,255, - 128,122,33,69,120,116,101,110,115,105,111,110,70,105,108,101, - 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111, - 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,5,0,0,0,67,0,0,0,115,36,0, - 0,0,116,0,160,1,116,2,106,3,124,1,161,2,1,0, - 116,0,160,4,100,1,124,0,106,5,124,0,106,6,161,3, - 1,0,100,2,83,0,41,3,122,30,73,110,105,116,105,97, - 108,105,122,101,32,97,110,32,101,120,116,101,110,115,105,111, - 110,32,109,111,100,117,108,101,122,40,101,120,116,101,110,115, - 105,111,110,32,109,111,100,117,108,101,32,123,33,114,125,32, - 101,120,101,99,117,116,101,100,32,102,114,111,109,32,123,33, - 114,125,78,41,7,114,139,0,0,0,114,221,0,0,0,114, - 167,0,0,0,90,12,101,120,101,99,95,100,121,110,97,109, - 105,99,114,153,0,0,0,114,121,0,0,0,114,52,0,0, - 0,169,2,114,123,0,0,0,114,223,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,224,0,0, - 0,108,4,0,0,115,10,0,0,0,14,2,6,1,8,1, - 8,255,255,128,122,31,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,36, - 0,0,0,116,0,124,0,106,1,131,1,100,1,25,0,137, - 0,116,2,135,0,102,1,100,2,100,3,132,8,116,3,68, - 0,131,1,131,1,83,0,41,5,122,49,82,101,116,117,114, - 110,32,84,114,117,101,32,105,102,32,116,104,101,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,105, - 115,32,97,32,112,97,99,107,97,103,101,46,114,3,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,4,0,0,0,51,0,0,0,115,26,0,0,0,124, - 0,93,18,125,1,136,0,100,0,124,1,23,0,107,2,86, - 0,1,0,113,2,100,1,83,0,41,2,114,216,0,0,0, - 78,114,7,0,0,0,169,2,114,5,0,0,0,218,6,115, - 117,102,102,105,120,169,1,90,9,102,105,108,101,95,110,97, - 109,101,114,7,0,0,0,114,8,0,0,0,114,9,0,0, - 0,117,4,0,0,115,8,0,0,0,4,0,2,1,20,255, - 255,128,122,49,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,111,99,97,108,115,62,46,60,103,101,110, - 101,120,112,114,62,78,41,4,114,55,0,0,0,114,52,0, - 0,0,218,3,97,110,121,114,212,0,0,0,114,226,0,0, - 0,114,7,0,0,0,114,16,1,0,0,114,8,0,0,0, - 114,186,0,0,0,114,4,0,0,115,10,0,0,0,14,2, - 12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,101, - 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32, + 0,114,220,0,0,0,60,4,0,0,115,24,0,0,0,10, + 1,10,1,2,4,2,1,6,254,12,4,2,1,14,1,2, + 1,2,1,6,253,255,128,122,29,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,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,1,83,0,41,2,122,39,82,101,116,117, + 114,110,32,78,111,110,101,32,97,115,32,116,104,101,114,101, + 32,105,115,32,110,111,32,115,111,117,114,99,101,32,99,111, + 100,101,46,78,114,7,0,0,0,114,226,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,236,0, + 0,0,76,4,0,0,115,4,0,0,0,4,2,255,128,122, + 31,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,41,6,114,130,0,0,0,114,129,0,0,0,114,131,0, + 0,0,114,132,0,0,0,114,220,0,0,0,114,236,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,12,1,0,0,56,4,0,0,115,10, + 0,0,0,8,0,4,2,8,2,12,16,255,128,114,12,1, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,64,0,0,0,115,92,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, + 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, + 132,0,90,6,100,8,100,9,132,0,90,7,100,10,100,11, + 132,0,90,8,100,12,100,13,132,0,90,9,100,14,100,15, + 132,0,90,10,100,16,100,17,132,0,90,11,101,12,100,18, + 100,19,132,0,131,1,90,13,100,20,83,0,41,21,114,3, + 1,0,0,122,93,76,111,97,100,101,114,32,102,111,114,32, 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, - 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,7, - 0,0,0,114,226,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,220,0,0,0,120,4,0,0, - 115,4,0,0,0,4,2,255,128,122,28,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, - 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,122,53,82,101,116, - 117,114,110,32,78,111,110,101,32,97,115,32,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,115,32,104,97, - 118,101,32,110,111,32,115,111,117,114,99,101,32,99,111,100, - 101,46,78,114,7,0,0,0,114,226,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,236,0,0, - 0,124,4,0,0,115,4,0,0,0,4,2,255,128,122,30, + 115,46,10,10,32,32,32,32,84,104,101,32,99,111,110,115, + 116,114,117,99,116,111,114,32,105,115,32,100,101,115,105,103, + 110,101,100,32,116,111,32,119,111,114,107,32,119,105,116,104, + 32,70,105,108,101,70,105,110,100,101,114,46,10,10,32,32, + 32,32,99,3,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, + 124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0, + 114,114,0,0,0,114,163,0,0,0,41,3,114,123,0,0, + 0,114,121,0,0,0,114,52,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,216,0,0,0,89, + 4,0,0,115,6,0,0,0,6,1,10,1,255,128,122,28, 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,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,6,0,0,0,124,0,106,0, - 83,0,114,1,1,0,0,114,56,0,0,0,114,226,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,183,0,0,0,128,4,0,0,115,4,0,0,0,6,3, - 255,128,122,32,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,101, - 110,97,109,101,78,41,14,114,130,0,0,0,114,129,0,0, - 0,114,131,0,0,0,114,132,0,0,0,114,216,0,0,0, - 114,250,0,0,0,114,254,0,0,0,114,219,0,0,0,114, - 224,0,0,0,114,186,0,0,0,114,220,0,0,0,114,236, - 0,0,0,114,140,0,0,0,114,183,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,3,1,0,0,81,4,0,0,115,26,0,0,0,8, - 0,4,2,8,6,8,4,8,4,8,3,8,8,8,6,8, - 6,8,4,2,4,14,1,255,128,114,3,1,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,64,0,0,0,115,104,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, - 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6, - 100,8,100,9,132,0,90,7,100,10,100,11,132,0,90,8, - 100,12,100,13,132,0,90,9,100,14,100,15,132,0,90,10, - 100,16,100,17,132,0,90,11,100,18,100,19,132,0,90,12, - 100,20,100,21,132,0,90,13,100,22,100,23,132,0,90,14, - 100,24,83,0,41,25,218,14,95,78,97,109,101,115,112,97, - 99,101,80,97,116,104,97,38,1,0,0,82,101,112,114,101, - 115,101,110,116,115,32,97,32,110,97,109,101,115,112,97,99, - 101,32,112,97,99,107,97,103,101,39,115,32,112,97,116,104, - 46,32,32,73,116,32,117,115,101,115,32,116,104,101,32,109, - 111,100,117,108,101,32,110,97,109,101,10,32,32,32,32,116, - 111,32,102,105,110,100,32,105,116,115,32,112,97,114,101,110, - 116,32,109,111,100,117,108,101,44,32,97,110,100,32,102,114, - 111,109,32,116,104,101,114,101,32,105,116,32,108,111,111,107, - 115,32,117,112,32,116,104,101,32,112,97,114,101,110,116,39, - 115,10,32,32,32,32,95,95,112,97,116,104,95,95,46,32, - 32,87,104,101,110,32,116,104,105,115,32,99,104,97,110,103, - 101,115,44,32,116,104,101,32,109,111,100,117,108,101,39,115, - 32,111,119,110,32,112,97,116,104,32,105,115,32,114,101,99, - 111,109,112,117,116,101,100,44,10,32,32,32,32,117,115,105, - 110,103,32,112,97,116,104,95,102,105,110,100,101,114,46,32, - 32,70,111,114,32,116,111,112,45,108,101,118,101,108,32,109, - 111,100,117,108,101,115,44,32,116,104,101,32,112,97,114,101, - 110,116,32,109,111,100,117,108,101,39,115,32,112,97,116,104, - 10,32,32,32,32,105,115,32,115,121,115,46,112,97,116,104, - 46,99,4,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,3,0,0,0,67,0,0,0,115,36,0,0,0,124, - 1,124,0,95,0,124,2,124,0,95,1,116,2,124,0,160, - 3,161,0,131,1,124,0,95,4,124,3,124,0,95,5,100, - 0,83,0,114,114,0,0,0,41,6,218,5,95,110,97,109, - 101,218,5,95,112,97,116,104,114,116,0,0,0,218,16,95, - 103,101,116,95,112,97,114,101,110,116,95,112,97,116,104,218, - 17,95,108,97,115,116,95,112,97,114,101,110,116,95,112,97, - 116,104,218,12,95,112,97,116,104,95,102,105,110,100,101,114, - 169,4,114,123,0,0,0,114,121,0,0,0,114,52,0,0, - 0,90,11,112,97,116,104,95,102,105,110,100,101,114,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, - 0,0,141,4,0,0,115,10,0,0,0,6,1,6,1,14, - 1,10,1,255,128,122,23,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,0,0,0,0,4,0,0,0,3, - 0,0,0,67,0,0,0,115,38,0,0,0,124,0,106,0, - 160,1,100,1,161,1,92,3,125,1,125,2,125,3,124,2, - 100,2,107,2,114,30,100,3,83,0,124,1,100,4,102,2, - 83,0,41,6,122,62,82,101,116,117,114,110,115,32,97,32, - 116,117,112,108,101,32,111,102,32,40,112,97,114,101,110,116, - 45,109,111,100,117,108,101,45,110,97,109,101,44,32,112,97, - 114,101,110,116,45,112,97,116,104,45,97,116,116,114,45,110, - 97,109,101,41,114,79,0,0,0,114,10,0,0,0,41,2, - 114,15,0,0,0,114,52,0,0,0,90,8,95,95,112,97, - 116,104,95,95,78,41,2,114,19,1,0,0,114,49,0,0, - 0,41,4,114,123,0,0,0,114,11,1,0,0,218,3,100, - 111,116,90,2,109,101,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,23,95,102,105,110,100,95,112,97,114, - 101,110,116,95,112,97,116,104,95,110,97,109,101,115,147,4, - 0,0,115,10,0,0,0,18,2,8,1,4,2,8,3,255, - 128,122,38,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,101,115,99,1,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, - 0,0,115,28,0,0,0,124,0,160,0,161,0,92,2,125, - 1,125,2,116,1,116,2,106,3,124,1,25,0,124,2,131, - 2,83,0,114,114,0,0,0,41,4,114,26,1,0,0,114, - 135,0,0,0,114,15,0,0,0,218,7,109,111,100,117,108, - 101,115,41,3,114,123,0,0,0,90,18,112,97,114,101,110, - 116,95,109,111,100,117,108,101,95,110,97,109,101,90,14,112, - 97,116,104,95,97,116,116,114,95,110,97,109,101,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,21,1,0, - 0,157,4,0,0,115,6,0,0,0,12,1,16,1,255,128, - 122,31,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,0,0,0,0,3,0, - 0,0,4,0,0,0,67,0,0,0,115,80,0,0,0,116, - 0,124,0,160,1,161,0,131,1,125,1,124,1,124,0,106, - 2,107,3,114,74,124,0,160,3,124,0,106,4,124,1,161, - 2,125,2,124,2,100,0,117,1,114,68,124,2,106,5,100, - 0,117,0,114,68,124,2,106,6,114,68,124,2,106,6,124, - 0,95,7,124,1,124,0,95,2,124,0,106,7,83,0,114, - 114,0,0,0,41,8,114,116,0,0,0,114,21,1,0,0, - 114,22,1,0,0,114,23,1,0,0,114,19,1,0,0,114, - 144,0,0,0,114,182,0,0,0,114,20,1,0,0,41,3, - 114,123,0,0,0,90,11,112,97,114,101,110,116,95,112,97, - 116,104,114,191,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,12,95,114,101,99,97,108,99,117, - 108,97,116,101,161,4,0,0,115,18,0,0,0,12,2,10, - 1,14,1,18,3,6,1,8,1,6,1,6,1,255,128,122, - 27,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, - 95,114,101,99,97,108,99,117,108,97,116,101,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,115,12,0,0,0,116,0,124,0,160,1, - 161,0,131,1,83,0,114,114,0,0,0,41,2,218,4,105, - 116,101,114,114,28,1,0,0,114,253,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,8,95,95, - 105,116,101,114,95,95,174,4,0,0,115,4,0,0,0,12, - 1,255,128,122,23,95,78,97,109,101,115,112,97,99,101,80, - 97,116,104,46,95,95,105,116,101,114,95,95,99,2,0,0, + 100,101,114,46,95,95,105,110,105,116,95,95,99,2,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, - 0,67,0,0,0,115,12,0,0,0,124,0,160,0,161,0, - 124,1,25,0,83,0,114,114,0,0,0,169,1,114,28,1, - 0,0,41,2,114,123,0,0,0,218,5,105,110,100,101,120, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,95,95,103,101,116,105,116,101,109,95,95,177,4,0,0, - 115,4,0,0,0,12,1,255,128,122,26,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,46,95,95,103,101,116,105, - 116,101,109,95,95,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,14, - 0,0,0,124,2,124,0,106,0,124,1,60,0,100,0,83, - 0,114,114,0,0,0,41,1,114,20,1,0,0,41,3,114, - 123,0,0,0,114,32,1,0,0,114,52,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, - 95,115,101,116,105,116,101,109,95,95,180,4,0,0,115,4, - 0,0,0,14,1,255,128,122,26,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,46,95,95,115,101,116,105,116,101, - 109,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, - 0,116,0,124,0,160,1,161,0,131,1,83,0,114,114,0, - 0,0,41,2,114,4,0,0,0,114,28,1,0,0,114,253, + 0,67,0,0,0,115,24,0,0,0,124,0,106,0,124,1, + 106,0,107,2,111,22,124,0,106,1,124,1,106,1,107,2, + 83,0,114,114,0,0,0,114,247,0,0,0,114,249,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,250,0,0,0,93,4,0,0,115,8,0,0,0,12,1, + 10,1,2,255,255,128,122,26,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,95,95,101,113, + 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,20,0,0,0, + 116,0,124,0,106,1,131,1,116,0,124,0,106,2,131,1, + 65,0,83,0,114,114,0,0,0,114,251,0,0,0,114,253, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,7,95,95,108,101,110,95,95,183,4,0,0,115, - 4,0,0,0,12,1,255,128,122,22,95,78,97,109,101,115, - 112,97,99,101,80,97,116,104,46,95,95,108,101,110,95,95, + 0,0,114,254,0,0,0,97,4,0,0,115,4,0,0,0, + 20,1,255,128,122,28,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,95,95,104,97,115,104, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,5,0,0,0,67,0,0,0,115,36,0,0,0, + 116,0,160,1,116,2,106,3,124,1,161,2,125,2,116,0, + 160,4,100,1,124,1,106,5,124,0,106,6,161,3,1,0, + 124,2,83,0,41,3,122,38,67,114,101,97,116,101,32,97, + 110,32,117,110,105,116,105,97,108,105,122,101,100,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,122,38, + 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, + 32,123,33,114,125,32,108,111,97,100,101,100,32,102,114,111, + 109,32,123,33,114,125,78,41,7,114,139,0,0,0,114,221, + 0,0,0,114,167,0,0,0,90,14,99,114,101,97,116,101, + 95,100,121,110,97,109,105,99,114,153,0,0,0,114,121,0, + 0,0,114,52,0,0,0,41,3,114,123,0,0,0,114,191, + 0,0,0,114,223,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,219,0,0,0,100,4,0,0, + 115,16,0,0,0,4,2,6,1,4,255,6,2,8,1,4, + 255,4,2,255,128,122,33,69,120,116,101,110,115,105,111,110, + 70,105,108,101,76,111,97,100,101,114,46,99,114,101,97,116, + 101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,5,0,0,0,67,0,0, + 0,115,36,0,0,0,116,0,160,1,116,2,106,3,124,1, + 161,2,1,0,116,0,160,4,100,1,124,0,106,5,124,0, + 106,6,161,3,1,0,100,2,83,0,41,3,122,30,73,110, + 105,116,105,97,108,105,122,101,32,97,110,32,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,122,40,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,123, + 33,114,125,32,101,120,101,99,117,116,101,100,32,102,114,111, + 109,32,123,33,114,125,78,41,7,114,139,0,0,0,114,221, + 0,0,0,114,167,0,0,0,90,12,101,120,101,99,95,100, + 121,110,97,109,105,99,114,153,0,0,0,114,121,0,0,0, + 114,52,0,0,0,169,2,114,123,0,0,0,114,223,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,224,0,0,0,108,4,0,0,115,10,0,0,0,14,2, + 6,1,8,1,8,255,255,128,122,31,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,46,101,120, + 101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,4,0,0,0,3,0, + 0,0,115,36,0,0,0,116,0,124,0,106,1,131,1,100, + 1,25,0,137,0,116,2,135,0,102,1,100,2,100,3,132, + 8,116,3,68,0,131,1,131,1,83,0,41,5,122,49,82, + 101,116,117,114,110,32,84,114,117,101,32,105,102,32,116,104, + 101,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, + 108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,46, + 114,3,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,51,0,0,0,115,26, + 0,0,0,124,0,93,18,125,1,136,0,100,0,124,1,23, + 0,107,2,86,0,1,0,113,2,100,1,83,0,41,2,114, + 216,0,0,0,78,114,7,0,0,0,169,2,114,5,0,0, + 0,218,6,115,117,102,102,105,120,169,1,90,9,102,105,108, + 101,95,110,97,109,101,114,7,0,0,0,114,8,0,0,0, + 114,9,0,0,0,117,4,0,0,115,8,0,0,0,4,0, + 2,1,20,255,255,128,122,49,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,111,99,97,108,115,62,46, + 60,103,101,110,101,120,112,114,62,78,41,4,114,55,0,0, + 0,114,52,0,0,0,218,3,97,110,121,114,212,0,0,0, + 114,226,0,0,0,114,7,0,0,0,114,16,1,0,0,114, + 8,0,0,0,114,186,0,0,0,114,4,0,0,115,10,0, + 0,0,14,2,12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, + 122,63,82,101,116,117,114,110,32,78,111,110,101,32,97,115, + 32,97,110,32,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,32,99,97,110,110,111,116,32,99,114,101,97, + 116,101,32,97,32,99,111,100,101,32,111,98,106,101,99,116, + 46,78,114,7,0,0,0,114,226,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,220,0,0,0, + 120,4,0,0,115,4,0,0,0,4,2,255,128,122,28,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,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, + 53,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, + 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, + 115,32,104,97,118,101,32,110,111,32,115,111,117,114,99,101, + 32,99,111,100,101,46,78,114,7,0,0,0,114,226,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,236,0,0,0,124,4,0,0,115,4,0,0,0,4,2, + 255,128,122,30,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,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,6,0,0,0, + 124,0,106,0,83,0,114,1,1,0,0,114,56,0,0,0, + 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,183,0,0,0,128,4,0,0,115,4,0, + 0,0,6,3,255,128,122,32,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, + 102,105,108,101,110,97,109,101,78,41,14,114,130,0,0,0, + 114,129,0,0,0,114,131,0,0,0,114,132,0,0,0,114, + 216,0,0,0,114,250,0,0,0,114,254,0,0,0,114,219, + 0,0,0,114,224,0,0,0,114,186,0,0,0,114,220,0, + 0,0,114,236,0,0,0,114,140,0,0,0,114,183,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,3,1,0,0,81,4,0,0,115,26, + 0,0,0,8,0,4,2,8,6,8,4,8,4,8,3,8, + 8,8,6,8,6,8,4,2,4,14,1,255,128,114,3,1, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,64,0,0,0,115,104,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, + 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, + 132,0,90,6,100,8,100,9,132,0,90,7,100,10,100,11, + 132,0,90,8,100,12,100,13,132,0,90,9,100,14,100,15, + 132,0,90,10,100,16,100,17,132,0,90,11,100,18,100,19, + 132,0,90,12,100,20,100,21,132,0,90,13,100,22,100,23, + 132,0,90,14,100,24,83,0,41,25,218,14,95,78,97,109, + 101,115,112,97,99,101,80,97,116,104,97,38,1,0,0,82, + 101,112,114,101,115,101,110,116,115,32,97,32,110,97,109,101, + 115,112,97,99,101,32,112,97,99,107,97,103,101,39,115,32, + 112,97,116,104,46,32,32,73,116,32,117,115,101,115,32,116, + 104,101,32,109,111,100,117,108,101,32,110,97,109,101,10,32, + 32,32,32,116,111,32,102,105,110,100,32,105,116,115,32,112, + 97,114,101,110,116,32,109,111,100,117,108,101,44,32,97,110, + 100,32,102,114,111,109,32,116,104,101,114,101,32,105,116,32, + 108,111,111,107,115,32,117,112,32,116,104,101,32,112,97,114, + 101,110,116,39,115,10,32,32,32,32,95,95,112,97,116,104, + 95,95,46,32,32,87,104,101,110,32,116,104,105,115,32,99, + 104,97,110,103,101,115,44,32,116,104,101,32,109,111,100,117, + 108,101,39,115,32,111,119,110,32,112,97,116,104,32,105,115, + 32,114,101,99,111,109,112,117,116,101,100,44,10,32,32,32, + 32,117,115,105,110,103,32,112,97,116,104,95,102,105,110,100, + 101,114,46,32,32,70,111,114,32,116,111,112,45,108,101,118, + 101,108,32,109,111,100,117,108,101,115,44,32,116,104,101,32, + 112,97,114,101,110,116,32,109,111,100,117,108,101,39,115,32, + 112,97,116,104,10,32,32,32,32,105,115,32,115,121,115,46, + 112,97,116,104,46,99,4,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,36, + 0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,116, + 2,124,0,160,3,161,0,131,1,124,0,95,4,124,3,124, + 0,95,5,100,0,83,0,114,114,0,0,0,41,6,218,5, + 95,110,97,109,101,218,5,95,112,97,116,104,114,116,0,0, + 0,218,16,95,103,101,116,95,112,97,114,101,110,116,95,112, + 97,116,104,218,17,95,108,97,115,116,95,112,97,114,101,110, + 116,95,112,97,116,104,218,12,95,112,97,116,104,95,102,105, + 110,100,101,114,169,4,114,123,0,0,0,114,121,0,0,0, + 114,52,0,0,0,90,11,112,97,116,104,95,102,105,110,100, + 101,114,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,216,0,0,0,141,4,0,0,115,10,0,0,0,6, + 1,6,1,14,1,10,1,255,128,122,23,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,0,0,0,0,4, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,2, + 125,3,124,2,100,2,107,2,114,30,100,3,83,0,124,1, + 100,4,102,2,83,0,41,6,122,62,82,101,116,117,114,110, + 115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,97, + 114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,101, + 44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,116, + 116,114,45,110,97,109,101,41,114,79,0,0,0,114,10,0, + 0,0,41,2,114,15,0,0,0,114,52,0,0,0,90,8, + 95,95,112,97,116,104,95,95,78,41,2,114,19,1,0,0, + 114,49,0,0,0,41,4,114,123,0,0,0,114,11,1,0, + 0,218,3,100,111,116,90,2,109,101,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,23,95,102,105,110,100, + 95,112,97,114,101,110,116,95,112,97,116,104,95,110,97,109, + 101,115,147,4,0,0,115,10,0,0,0,18,2,8,1,4, + 2,8,3,255,128,122,38,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,101,115,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,28,0,0,0,124,0,160,0,161, + 0,92,2,125,1,125,2,116,1,116,2,106,3,124,1,25, + 0,124,2,131,2,83,0,114,114,0,0,0,41,4,114,26, + 1,0,0,114,135,0,0,0,114,15,0,0,0,218,7,109, + 111,100,117,108,101,115,41,3,114,123,0,0,0,90,18,112, + 97,114,101,110,116,95,109,111,100,117,108,101,95,110,97,109, + 101,90,14,112,97,116,104,95,97,116,116,114,95,110,97,109, + 101,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,21,1,0,0,157,4,0,0,115,6,0,0,0,12,1, + 16,1,255,128,122,31,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,0,0, + 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,80, + 0,0,0,116,0,124,0,160,1,161,0,131,1,125,1,124, + 1,124,0,106,2,107,3,114,74,124,0,160,3,124,0,106, + 4,124,1,161,2,125,2,124,2,100,0,117,1,114,68,124, + 2,106,5,100,0,117,0,114,68,124,2,106,6,114,68,124, + 2,106,6,124,0,95,7,124,1,124,0,95,2,124,0,106, + 7,83,0,114,114,0,0,0,41,8,114,116,0,0,0,114, + 21,1,0,0,114,22,1,0,0,114,23,1,0,0,114,19, + 1,0,0,114,144,0,0,0,114,182,0,0,0,114,20,1, + 0,0,41,3,114,123,0,0,0,90,11,112,97,114,101,110, + 116,95,112,97,116,104,114,191,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,12,95,114,101,99, + 97,108,99,117,108,97,116,101,161,4,0,0,115,18,0,0, + 0,12,2,10,1,14,1,18,3,6,1,8,1,6,1,6, + 1,255,128,122,27,95,78,97,109,101,115,112,97,99,101,80, + 97,116,104,46,95,114,101,99,97,108,99,117,108,97,116,101, 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, - 160,0,124,0,106,1,161,1,83,0,41,2,78,122,20,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, - 114,125,41,41,2,114,70,0,0,0,114,20,1,0,0,114, - 253,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,8,95,95,114,101,112,114,95,95,186,4,0, - 0,115,4,0,0,0,12,1,255,128,122,23,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,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, - 0,124,1,124,0,160,0,161,0,118,0,83,0,114,114,0, - 0,0,114,31,1,0,0,169,2,114,123,0,0,0,218,4, - 105,116,101,109,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, - 95,189,4,0,0,115,4,0,0,0,12,1,255,128,122,27, + 0,3,0,0,0,67,0,0,0,115,12,0,0,0,116,0, + 124,0,160,1,161,0,131,1,83,0,114,114,0,0,0,41, + 2,218,4,105,116,101,114,114,28,1,0,0,114,253,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,8,95,95,105,116,101,114,95,95,174,4,0,0,115,4, + 0,0,0,12,1,255,128,122,23,95,78,97,109,101,115,112, + 97,99,101,80,97,116,104,46,95,95,105,116,101,114,95,95, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,2,0,0,0,67,0,0,0,115,12,0,0,0,124,0, + 160,0,161,0,124,1,25,0,83,0,114,114,0,0,0,169, + 1,114,28,1,0,0,41,2,114,123,0,0,0,218,5,105, + 110,100,101,120,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,11,95,95,103,101,116,105,116,101,109,95,95, + 177,4,0,0,115,4,0,0,0,12,1,255,128,122,26,95, + 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, + 103,101,116,105,116,101,109,95,95,99,3,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, + 0,0,115,14,0,0,0,124,2,124,0,106,0,124,1,60, + 0,100,0,83,0,114,114,0,0,0,41,1,114,20,1,0, + 0,41,3,114,123,0,0,0,114,32,1,0,0,114,52,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,11,95,95,115,101,116,105,116,101,109,95,95,180,4, + 0,0,115,4,0,0,0,14,1,255,128,122,26,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,95,95,115,101, + 116,105,116,101,109,95,95,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,12,0,0,0,116,0,124,0,160,1,161,0,131,1,83, + 0,114,114,0,0,0,41,2,114,4,0,0,0,114,28,1, + 0,0,114,253,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,7,95,95,108,101,110,95,95,183, + 4,0,0,115,4,0,0,0,12,1,255,128,122,22,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,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0, + 0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,2, + 78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,40,123,33,114,125,41,41,2,114,70,0,0,0,114,20, + 1,0,0,114,253,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,8,95,95,114,101,112,114,95, + 95,186,4,0,0,115,4,0,0,0,12,1,255,128,122,23, 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,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124, - 1,161,1,1,0,100,0,83,0,114,114,0,0,0,41,2, - 114,20,1,0,0,114,190,0,0,0,114,37,1,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,190, - 0,0,0,192,4,0,0,115,4,0,0,0,16,1,255,128, - 122,21,95,78,97,109,101,115,112,97,99,101,80,97,116,104, - 46,97,112,112,101,110,100,78,41,15,114,130,0,0,0,114, - 129,0,0,0,114,131,0,0,0,114,132,0,0,0,114,216, - 0,0,0,114,26,1,0,0,114,21,1,0,0,114,28,1, - 0,0,114,30,1,0,0,114,33,1,0,0,114,34,1,0, - 0,114,35,1,0,0,114,36,1,0,0,114,39,1,0,0, - 114,190,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,18,1,0,0,134,4, - 0,0,115,28,0,0,0,8,0,4,1,8,6,8,6,8, - 10,8,4,8,13,8,3,8,3,8,3,8,3,8,3,12, - 3,255,128,114,18,1,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,80,0,0,0,101,0,90,1,100,0,90,2,100,1, - 100,2,132,0,90,3,101,4,100,3,100,4,132,0,131,1, - 90,5,100,5,100,6,132,0,90,6,100,7,100,8,132,0, - 90,7,100,9,100,10,132,0,90,8,100,11,100,12,132,0, - 90,9,100,13,100,14,132,0,90,10,100,15,100,16,132,0, - 90,11,100,17,83,0,41,18,218,16,95,78,97,109,101,115, - 112,97,99,101,76,111,97,100,101,114,99,4,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, - 0,0,0,115,18,0,0,0,116,0,124,1,124,2,124,3, - 131,3,124,0,95,1,100,0,83,0,114,114,0,0,0,41, - 2,114,18,1,0,0,114,20,1,0,0,114,24,1,0,0, + 95,114,101,112,114,95,95,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,12,0,0,0,124,1,124,0,160,0,161,0,118,0,83, + 0,114,114,0,0,0,114,31,1,0,0,169,2,114,123,0, + 0,0,218,4,105,116,101,109,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,12,95,95,99,111,110,116,97, + 105,110,115,95,95,189,4,0,0,115,4,0,0,0,12,1, + 255,128,122,27,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,0,0,0,0,2,0,0,0, + 3,0,0,0,67,0,0,0,115,16,0,0,0,124,0,106, + 0,160,1,124,1,161,1,1,0,100,0,83,0,114,114,0, + 0,0,41,2,114,20,1,0,0,114,190,0,0,0,114,37, + 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,190,0,0,0,192,4,0,0,115,4,0,0,0, + 16,1,255,128,122,21,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,46,97,112,112,101,110,100,78,41,15,114,130, + 0,0,0,114,129,0,0,0,114,131,0,0,0,114,132,0, + 0,0,114,216,0,0,0,114,26,1,0,0,114,21,1,0, + 0,114,28,1,0,0,114,30,1,0,0,114,33,1,0,0, + 114,34,1,0,0,114,35,1,0,0,114,36,1,0,0,114, + 39,1,0,0,114,190,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,18,1, + 0,0,134,4,0,0,115,28,0,0,0,8,0,4,1,8, + 6,8,6,8,10,8,4,8,13,8,3,8,3,8,3,8, + 3,8,3,12,3,255,128,114,18,1,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,64,0,0,0,115,80,0,0,0,101,0,90,1,100,0, + 90,2,100,1,100,2,132,0,90,3,101,4,100,3,100,4, + 132,0,131,1,90,5,100,5,100,6,132,0,90,6,100,7, + 100,8,132,0,90,7,100,9,100,10,132,0,90,8,100,11, + 100,12,132,0,90,9,100,13,100,14,132,0,90,10,100,15, + 100,16,132,0,90,11,100,17,83,0,41,18,218,16,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,99,4, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4, + 0,0,0,67,0,0,0,115,18,0,0,0,116,0,124,1, + 124,2,124,3,131,3,124,0,95,1,100,0,83,0,114,114, + 0,0,0,41,2,114,18,1,0,0,114,20,1,0,0,114, + 24,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,216,0,0,0,198,4,0,0,115,4,0,0, + 0,18,1,255,128,122,25,95,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, + 160,0,124,0,106,1,161,1,83,0,41,3,122,115,82,101, + 116,117,114,110,32,114,101,112,114,32,102,111,114,32,116,104, + 101,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, + 32,32,32,84,104,101,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,46,32,32,84,104, + 101,32,105,109,112,111,114,116,32,109,97,99,104,105,110,101, + 114,121,32,100,111,101,115,32,116,104,101,32,106,111,98,32, + 105,116,115,101,108,102,46,10,10,32,32,32,32,32,32,32, + 32,122,25,60,109,111,100,117,108,101,32,123,33,114,125,32, + 40,110,97,109,101,115,112,97,99,101,41,62,78,41,2,114, + 70,0,0,0,114,130,0,0,0,41,1,114,223,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 11,109,111,100,117,108,101,95,114,101,112,114,201,4,0,0, + 115,4,0,0,0,12,7,255,128,122,28,95,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, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,78,84,114,7,0, + 0,0,114,226,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,186,0,0,0,210,4,0,0,115, + 4,0,0,0,4,1,255,128,122,27,95,78,97,109,101,115, + 112,97,99,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,0,0, + 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,78,114,10,0,0,0,114, + 7,0,0,0,114,226,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,236,0,0,0,213,4,0, + 0,115,4,0,0,0,4,1,255,128,122,27,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,46,103,101,116, + 95,115,111,117,114,99,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,6,0,0,0,67,0,0,0, + 115,16,0,0,0,116,0,100,1,100,2,100,3,100,4,100, + 5,141,4,83,0,41,6,78,114,10,0,0,0,122,8,60, + 115,116,114,105,110,103,62,114,222,0,0,0,84,41,1,114, + 238,0,0,0,41,1,114,239,0,0,0,114,226,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 216,0,0,0,198,4,0,0,115,4,0,0,0,18,1,255, + 220,0,0,0,216,4,0,0,115,4,0,0,0,16,1,255, 128,122,25,95,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,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, - 106,1,161,1,83,0,41,3,122,115,82,101,116,117,114,110, - 32,114,101,112,114,32,102,111,114,32,116,104,101,32,109,111, - 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,109,101,116,104,111,100,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,46,32,32,84,104,101,32,105,109, - 112,111,114,116,32,109,97,99,104,105,110,101,114,121,32,100, - 111,101,115,32,116,104,101,32,106,111,98,32,105,116,115,101, - 108,102,46,10,10,32,32,32,32,32,32,32,32,122,25,60, - 109,111,100,117,108,101,32,123,33,114,125,32,40,110,97,109, - 101,115,112,97,99,101,41,62,78,41,2,114,70,0,0,0, - 114,130,0,0,0,41,1,114,223,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,11,109,111,100, - 117,108,101,95,114,101,112,114,201,4,0,0,115,4,0,0, - 0,12,7,255,128,122,28,95,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,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,78,84,114,7,0,0,0,114,226, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,186,0,0,0,210,4,0,0,115,4,0,0,0, - 4,1,255,128,122,27,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,78,114,10,0,0,0,114,7,0,0,0, - 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,236,0,0,0,213,4,0,0,115,4,0, - 0,0,4,1,255,128,122,27,95,78,97,109,101,115,112,97, - 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117, - 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,6,0,0,0,67,0,0,0,115,16,0,0, - 0,116,0,100,1,100,2,100,3,100,4,100,5,141,4,83, - 0,41,6,78,114,10,0,0,0,122,8,60,115,116,114,105, - 110,103,62,114,222,0,0,0,84,41,1,114,238,0,0,0, - 41,1,114,239,0,0,0,114,226,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,220,0,0,0, - 216,4,0,0,115,4,0,0,0,16,1,255,128,122,25,95, - 78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,114,217,0,0,0,114, - 7,0,0,0,114,218,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,219,0,0,0,219,4,0, - 0,115,4,0,0,0,4,0,255,128,122,30,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, - 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,0,83,0,114,114,0,0, - 0,114,7,0,0,0,114,13,1,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,224,0,0,0,222, - 4,0,0,115,4,0,0,0,4,1,255,128,122,28,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, - 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, - 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, - 83,0,41,3,122,98,76,111,97,100,32,97,32,110,97,109, - 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, - 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, - 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, - 78,41,4,114,139,0,0,0,114,153,0,0,0,114,20,1, - 0,0,114,225,0,0,0,114,226,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,227,0,0,0, - 225,4,0,0,115,10,0,0,0,6,7,4,1,4,255,12, - 3,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0,114,131, - 0,0,0,114,216,0,0,0,114,213,0,0,0,114,41,1, - 0,0,114,186,0,0,0,114,236,0,0,0,114,220,0,0, - 0,114,219,0,0,0,114,224,0,0,0,114,227,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,40,1,0,0,197,4,0,0,115,22,0, - 0,0,8,0,8,1,2,3,10,1,8,8,8,3,8,3, - 8,3,8,3,12,3,255,128,114,40,1,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,64,0,0,0,115,118,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,101,4,100,2,100,3,132,0,131, - 1,90,5,101,4,100,4,100,5,132,0,131,1,90,6,101, - 7,100,6,100,7,132,0,131,1,90,8,101,7,100,8,100, - 9,132,0,131,1,90,9,101,7,100,19,100,11,100,12,132, - 1,131,1,90,10,101,7,100,20,100,13,100,14,132,1,131, - 1,90,11,101,7,100,21,100,15,100,16,132,1,131,1,90, - 12,101,4,100,17,100,18,132,0,131,1,90,13,100,10,83, - 0,41,22,218,10,80,97,116,104,70,105,110,100,101,114,122, - 62,77,101,116,97,32,112,97,116,104,32,102,105,110,100,101, - 114,32,102,111,114,32,115,121,115,46,112,97,116,104,32,97, - 110,100,32,112,97,99,107,97,103,101,32,95,95,112,97,116, - 104,95,95,32,97,116,116,114,105,98,117,116,101,115,46,99, - 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,116, - 1,106,2,160,3,161,0,131,1,68,0,93,44,92,2,125, - 0,125,1,124,1,100,1,117,0,114,40,116,1,106,2,124, - 0,61,0,113,14,116,4,124,1,100,2,131,2,114,14,124, - 1,160,5,161,0,1,0,113,14,100,1,83,0,41,3,122, - 125,67,97,108,108,32,116,104,101,32,105,110,118,97,108,105, - 100,97,116,101,95,99,97,99,104,101,115,40,41,32,109,101, - 116,104,111,100,32,111,110,32,97,108,108,32,112,97,116,104, - 32,101,110,116,114,121,32,102,105,110,100,101,114,115,10,32, - 32,32,32,32,32,32,32,115,116,111,114,101,100,32,105,110, - 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, - 101,114,95,99,97,99,104,101,115,32,40,119,104,101,114,101, - 32,105,109,112,108,101,109,101,110,116,101,100,41,46,78,218, - 17,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104, - 101,115,41,6,218,4,108,105,115,116,114,15,0,0,0,218, - 19,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,218,5,105,116,101,109,115,114,133,0,0,0, - 114,43,1,0,0,41,2,114,121,0,0,0,218,6,102,105, - 110,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,43,1,0,0,244,4,0,0,115,16,0,0, - 0,22,4,8,1,10,1,10,1,8,1,2,128,4,252,255, - 128,122,28,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, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 9,0,0,0,67,0,0,0,115,76,0,0,0,116,0,106, - 1,100,1,117,1,114,28,116,0,106,1,115,28,116,2,160, - 3,100,2,116,4,161,2,1,0,116,0,106,1,68,0,93, - 36,125,1,122,14,124,1,124,0,131,1,87,0,2,0,1, - 0,83,0,4,0,116,5,121,70,1,0,1,0,1,0,89, - 0,113,34,119,0,100,1,83,0,41,3,122,46,83,101,97, - 114,99,104,32,115,121,115,46,112,97,116,104,95,104,111,111, - 107,115,32,102,111,114,32,97,32,102,105,110,100,101,114,32, - 102,111,114,32,39,112,97,116,104,39,46,78,122,23,115,121, - 115,46,112,97,116,104,95,104,111,111,107,115,32,105,115,32, - 101,109,112,116,121,41,6,114,15,0,0,0,218,10,112,97, - 116,104,95,104,111,111,107,115,114,81,0,0,0,114,82,0, - 0,0,114,142,0,0,0,114,122,0,0,0,41,2,114,52, - 0,0,0,90,4,104,111,111,107,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, - 104,111,111,107,115,254,4,0,0,115,18,0,0,0,16,3, - 12,1,10,1,2,1,14,1,12,1,6,1,4,2,255,128, - 122,22,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,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, - 0,115,100,0,0,0,124,1,100,1,107,2,114,42,122,12, - 116,0,160,1,161,0,125,1,87,0,110,20,4,0,116,2, - 121,40,1,0,1,0,1,0,89,0,100,2,83,0,119,0, - 122,16,116,3,106,4,124,1,25,0,125,2,87,0,124,2, - 83,0,4,0,116,5,121,98,1,0,1,0,1,0,124,0, - 160,6,124,1,161,1,125,2,124,2,116,3,106,4,124,1, - 60,0,89,0,124,2,83,0,119,0,41,3,122,210,71,101, - 116,32,116,104,101,32,102,105,110,100,101,114,32,102,111,114, - 32,116,104,101,32,112,97,116,104,32,101,110,116,114,121,32, - 102,114,111,109,32,115,121,115,46,112,97,116,104,95,105,109, - 112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,32, - 32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,97, - 116,104,32,101,110,116,114,121,32,105,115,32,110,111,116,32, - 105,110,32,116,104,101,32,99,97,99,104,101,44,32,102,105, - 110,100,32,116,104,101,32,97,112,112,114,111,112,114,105,97, - 116,101,32,102,105,110,100,101,114,10,32,32,32,32,32,32, - 32,32,97,110,100,32,99,97,99,104,101,32,105,116,46,32, - 73,102,32,110,111,32,102,105,110,100,101,114,32,105,115,32, - 97,118,97,105,108,97,98,108,101,44,32,115,116,111,114,101, - 32,78,111,110,101,46,10,10,32,32,32,32,32,32,32,32, - 114,10,0,0,0,78,41,7,114,18,0,0,0,114,63,0, - 0,0,218,17,70,105,108,101,78,111,116,70,111,117,110,100, - 69,114,114,111,114,114,15,0,0,0,114,45,1,0,0,218, - 8,75,101,121,69,114,114,111,114,114,49,1,0,0,41,3, - 114,202,0,0,0,114,52,0,0,0,114,47,1,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,20, - 95,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,11,5,0,0,115,28,0,0,0,8,8,2, - 1,12,1,12,1,8,3,2,1,12,1,4,4,12,253,10, - 1,12,1,4,1,2,255,255,128,122,31,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,99,97,99,104,101,99,3,0,0,0,0, - 0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67, - 0,0,0,115,82,0,0,0,116,0,124,2,100,1,131,2, - 114,26,124,2,160,1,124,1,161,1,92,2,125,3,125,4, - 110,14,124,2,160,2,124,1,161,1,125,3,103,0,125,4, - 124,3,100,0,117,1,114,60,116,3,160,4,124,1,124,3, - 161,2,83,0,116,3,160,5,124,1,100,0,161,2,125,5, - 124,4,124,5,95,6,124,5,83,0,41,2,78,114,141,0, - 0,0,41,7,114,133,0,0,0,114,141,0,0,0,114,210, - 0,0,0,114,139,0,0,0,114,205,0,0,0,114,187,0, - 0,0,114,182,0,0,0,41,6,114,202,0,0,0,114,143, - 0,0,0,114,47,1,0,0,114,144,0,0,0,114,145,0, - 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,16,95,108,101,103,97,99,121,95, - 103,101,116,95,115,112,101,99,33,5,0,0,115,20,0,0, - 0,10,4,16,1,10,2,4,1,8,1,12,1,12,1,6, - 1,4,1,255,128,122,27,80,97,116,104,70,105,110,100,101, - 114,46,95,108,101,103,97,99,121,95,103,101,116,95,115,112, - 101,99,78,99,4,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,5,0,0,0,67,0,0,0,115,166,0,0, - 0,103,0,125,4,124,2,68,0,93,134,125,5,116,0,124, - 5,116,1,116,2,102,2,131,2,115,28,113,8,124,0,160, - 3,124,5,161,1,125,6,124,6,100,1,117,1,114,8,116, - 4,124,6,100,2,131,2,114,70,124,6,160,5,124,1,124, - 3,161,2,125,7,110,12,124,0,160,6,124,1,124,6,161, - 2,125,7,124,7,100,1,117,0,114,92,113,8,124,7,106, - 7,100,1,117,1,114,110,124,7,2,0,1,0,83,0,124, - 7,106,8,125,8,124,8,100,1,117,0,114,132,116,9,100, - 3,131,1,130,1,124,4,160,10,124,8,161,1,1,0,113, - 8,116,11,160,12,124,1,100,1,161,2,125,7,124,4,124, - 7,95,8,124,7,83,0,41,4,122,63,70,105,110,100,32, - 116,104,101,32,108,111,97,100,101,114,32,111,114,32,110,97, - 109,101,115,112,97,99,101,95,112,97,116,104,32,102,111,114, - 32,116,104,105,115,32,109,111,100,117,108,101,47,112,97,99, - 107,97,103,101,32,110,97,109,101,46,78,114,207,0,0,0, - 122,19,115,112,101,99,32,109,105,115,115,105,110,103,32,108, - 111,97,100,101,114,41,13,114,165,0,0,0,114,90,0,0, - 0,218,5,98,121,116,101,115,114,52,1,0,0,114,133,0, - 0,0,114,207,0,0,0,114,53,1,0,0,114,144,0,0, - 0,114,182,0,0,0,114,122,0,0,0,114,171,0,0,0, - 114,139,0,0,0,114,187,0,0,0,41,9,114,202,0,0, - 0,114,143,0,0,0,114,52,0,0,0,114,206,0,0,0, - 218,14,110,97,109,101,115,112,97,99,101,95,112,97,116,104, - 90,5,101,110,116,114,121,114,47,1,0,0,114,191,0,0, - 0,114,145,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,9,95,103,101,116,95,115,112,101,99, - 48,5,0,0,115,44,0,0,0,4,5,8,1,14,1,2, - 1,10,1,8,1,10,1,14,1,12,2,8,1,2,1,10, - 1,8,1,6,1,8,1,8,1,10,5,2,128,12,2,6, - 1,4,1,255,128,122,20,80,97,116,104,70,105,110,100,101, - 114,46,95,103,101,116,95,115,112,101,99,99,4,0,0,0, - 0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0, - 67,0,0,0,115,94,0,0,0,124,2,100,1,117,0,114, - 14,116,0,106,1,125,2,124,0,160,2,124,1,124,2,124, - 3,161,3,125,4,124,4,100,1,117,0,114,40,100,1,83, - 0,124,4,106,3,100,1,117,0,114,90,124,4,106,4,125, - 5,124,5,114,86,100,1,124,4,95,5,116,6,124,1,124, - 5,124,0,106,2,131,3,124,4,95,4,124,4,83,0,100, - 1,83,0,124,4,83,0,41,2,122,141,84,114,121,32,116, - 111,32,102,105,110,100,32,97,32,115,112,101,99,32,102,111, - 114,32,39,102,117,108,108,110,97,109,101,39,32,111,110,32, - 115,121,115,46,112,97,116,104,32,111,114,32,39,112,97,116, - 104,39,46,10,10,32,32,32,32,32,32,32,32,84,104,101, - 32,115,101,97,114,99,104,32,105,115,32,98,97,115,101,100, + 100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,114,217, + 0,0,0,114,7,0,0,0,114,218,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,219,0,0, + 0,219,4,0,0,115,4,0,0,0,4,0,255,128,122,30, + 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, + 46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, + 0,0,0,67,0,0,0,115,4,0,0,0,100,0,83,0, + 114,114,0,0,0,114,7,0,0,0,114,13,1,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,224, + 0,0,0,222,4,0,0,115,4,0,0,0,4,1,255,128, + 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, + 0,0,0,67,0,0,0,115,26,0,0,0,116,0,160,1, + 100,1,124,0,106,2,161,2,1,0,116,0,160,3,124,0, + 124,1,161,2,83,0,41,3,122,98,76,111,97,100,32,97, + 32,110,97,109,101,115,112,97,99,101,32,109,111,100,117,108, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99, + 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,32,32,32,32,122,38,110,97, + 109,101,115,112,97,99,101,32,109,111,100,117,108,101,32,108, + 111,97,100,101,100,32,119,105,116,104,32,112,97,116,104,32, + 123,33,114,125,78,41,4,114,139,0,0,0,114,153,0,0, + 0,114,20,1,0,0,114,225,0,0,0,114,226,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 227,0,0,0,225,4,0,0,115,10,0,0,0,6,7,4, + 1,4,255,12,3,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0, + 0,0,114,131,0,0,0,114,216,0,0,0,114,213,0,0, + 0,114,41,1,0,0,114,186,0,0,0,114,236,0,0,0, + 114,220,0,0,0,114,219,0,0,0,114,224,0,0,0,114, + 227,0,0,0,114,7,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,40,1,0,0,197,4,0, + 0,115,22,0,0,0,8,0,8,1,2,3,10,1,8,8, + 8,3,8,3,8,3,8,3,12,3,255,128,114,40,1,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,64,0,0,0,115,118,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,101,4,100,2,100, + 3,132,0,131,1,90,5,101,4,100,4,100,5,132,0,131, + 1,90,6,101,7,100,6,100,7,132,0,131,1,90,8,101, + 7,100,8,100,9,132,0,131,1,90,9,101,7,100,19,100, + 11,100,12,132,1,131,1,90,10,101,7,100,20,100,13,100, + 14,132,1,131,1,90,11,101,7,100,21,100,15,100,16,132, + 1,131,1,90,12,101,4,100,17,100,18,132,0,131,1,90, + 13,100,10,83,0,41,22,218,10,80,97,116,104,70,105,110, + 100,101,114,122,62,77,101,116,97,32,112,97,116,104,32,102, + 105,110,100,101,114,32,102,111,114,32,115,121,115,46,112,97, + 116,104,32,97,110,100,32,112,97,99,107,97,103,101,32,95, + 95,112,97,116,104,95,95,32,97,116,116,114,105,98,117,116, + 101,115,46,99,0,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,67,0,0,0,115,64,0,0, + 0,116,0,116,1,106,2,160,3,161,0,131,1,68,0,93, + 44,92,2,125,0,125,1,124,1,100,1,117,0,114,40,116, + 1,106,2,124,0,61,0,113,14,116,4,124,1,100,2,131, + 2,114,14,124,1,160,5,161,0,1,0,113,14,100,1,83, + 0,41,3,122,125,67,97,108,108,32,116,104,101,32,105,110, + 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,40, + 41,32,109,101,116,104,111,100,32,111,110,32,97,108,108,32, + 112,97,116,104,32,101,110,116,114,121,32,102,105,110,100,101, + 114,115,10,32,32,32,32,32,32,32,32,115,116,111,114,101, + 100,32,105,110,32,115,121,115,46,112,97,116,104,95,105,109, + 112,111,114,116,101,114,95,99,97,99,104,101,115,32,40,119, + 104,101,114,101,32,105,109,112,108,101,109,101,110,116,101,100, + 41,46,78,218,17,105,110,118,97,108,105,100,97,116,101,95, + 99,97,99,104,101,115,41,6,218,4,108,105,115,116,114,15, + 0,0,0,218,19,112,97,116,104,95,105,109,112,111,114,116, + 101,114,95,99,97,99,104,101,218,5,105,116,101,109,115,114, + 133,0,0,0,114,43,1,0,0,41,2,114,121,0,0,0, + 218,6,102,105,110,100,101,114,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,43,1,0,0,244,4,0,0, + 115,16,0,0,0,22,4,8,1,10,1,10,1,8,1,2, + 128,4,252,255,128,122,28,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,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,9,0,0,0,67,0,0,0,115,76,0,0, + 0,116,0,106,1,100,1,117,1,114,28,116,0,106,1,115, + 28,116,2,160,3,100,2,116,4,161,2,1,0,116,0,106, + 1,68,0,93,34,125,1,122,14,124,1,124,0,131,1,87, + 0,2,0,1,0,83,0,4,0,116,5,121,74,1,0,1, + 0,1,0,89,0,113,34,100,1,83,0,119,0,41,3,122, + 46,83,101,97,114,99,104,32,115,121,115,46,112,97,116,104, + 95,104,111,111,107,115,32,102,111,114,32,97,32,102,105,110, + 100,101,114,32,102,111,114,32,39,112,97,116,104,39,46,78, + 122,23,115,121,115,46,112,97,116,104,95,104,111,111,107,115, + 32,105,115,32,101,109,112,116,121,41,6,114,15,0,0,0, + 218,10,112,97,116,104,95,104,111,111,107,115,114,81,0,0, + 0,114,82,0,0,0,114,142,0,0,0,114,122,0,0,0, + 41,2,114,52,0,0,0,90,4,104,111,111,107,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,11,95,112, + 97,116,104,95,104,111,111,107,115,254,4,0,0,115,20,0, + 0,0,16,3,12,1,10,1,2,1,14,1,12,1,4,1, + 4,2,2,253,255,128,122,22,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,0,0,0,0,3,0,0,0,8, + 0,0,0,67,0,0,0,115,100,0,0,0,124,1,100,1, + 107,2,114,40,122,12,116,0,160,1,161,0,125,1,87,0, + 110,18,4,0,116,2,121,98,1,0,1,0,1,0,89,0, + 100,2,83,0,122,16,116,3,106,4,124,1,25,0,125,2, + 87,0,124,2,83,0,4,0,116,5,121,96,1,0,1,0, + 1,0,124,0,160,6,124,1,161,1,125,2,124,2,116,3, + 106,4,124,1,60,0,89,0,124,2,83,0,119,0,119,0, + 41,3,122,210,71,101,116,32,116,104,101,32,102,105,110,100, + 101,114,32,102,111,114,32,116,104,101,32,112,97,116,104,32, + 101,110,116,114,121,32,102,114,111,109,32,115,121,115,46,112, + 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, + 104,101,46,10,10,32,32,32,32,32,32,32,32,73,102,32, + 116,104,101,32,112,97,116,104,32,101,110,116,114,121,32,105, + 115,32,110,111,116,32,105,110,32,116,104,101,32,99,97,99, + 104,101,44,32,102,105,110,100,32,116,104,101,32,97,112,112, + 114,111,112,114,105,97,116,101,32,102,105,110,100,101,114,10, + 32,32,32,32,32,32,32,32,97,110,100,32,99,97,99,104, + 101,32,105,116,46,32,73,102,32,110,111,32,102,105,110,100, + 101,114,32,105,115,32,97,118,97,105,108,97,98,108,101,44, + 32,115,116,111,114,101,32,78,111,110,101,46,10,10,32,32, + 32,32,32,32,32,32,114,10,0,0,0,78,41,7,114,18, + 0,0,0,114,63,0,0,0,218,17,70,105,108,101,78,111, + 116,70,111,117,110,100,69,114,114,111,114,114,15,0,0,0, + 114,45,1,0,0,218,8,75,101,121,69,114,114,111,114,114, + 49,1,0,0,41,3,114,202,0,0,0,114,52,0,0,0, + 114,47,1,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,20,95,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,11,5,0,0,115,30, + 0,0,0,8,8,2,1,12,1,12,1,6,3,2,1,12, + 1,4,4,12,253,10,1,12,1,4,1,2,253,2,250,255, + 128,122,31,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,99,97,99, + 104,101,99,3,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,4,0,0,0,67,0,0,0,115,82,0,0,0, + 116,0,124,2,100,1,131,2,114,26,124,2,160,1,124,1, + 161,1,92,2,125,3,125,4,110,14,124,2,160,2,124,1, + 161,1,125,3,103,0,125,4,124,3,100,0,117,1,114,60, + 116,3,160,4,124,1,124,3,161,2,83,0,116,3,160,5, + 124,1,100,0,161,2,125,5,124,4,124,5,95,6,124,5, + 83,0,41,2,78,114,141,0,0,0,41,7,114,133,0,0, + 0,114,141,0,0,0,114,210,0,0,0,114,139,0,0,0, + 114,205,0,0,0,114,187,0,0,0,114,182,0,0,0,41, + 6,114,202,0,0,0,114,143,0,0,0,114,47,1,0,0, + 114,144,0,0,0,114,145,0,0,0,114,191,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,16, + 95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99, + 33,5,0,0,115,20,0,0,0,10,4,16,1,10,2,4, + 1,8,1,12,1,12,1,6,1,4,1,255,128,122,27,80, + 97,116,104,70,105,110,100,101,114,46,95,108,101,103,97,99, + 121,95,103,101,116,95,115,112,101,99,78,99,4,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, + 67,0,0,0,115,166,0,0,0,103,0,125,4,124,2,68, + 0,93,134,125,5,116,0,124,5,116,1,116,2,102,2,131, + 2,115,28,113,8,124,0,160,3,124,5,161,1,125,6,124, + 6,100,1,117,1,114,8,116,4,124,6,100,2,131,2,114, + 70,124,6,160,5,124,1,124,3,161,2,125,7,110,12,124, + 0,160,6,124,1,124,6,161,2,125,7,124,7,100,1,117, + 0,114,92,113,8,124,7,106,7,100,1,117,1,114,110,124, + 7,2,0,1,0,83,0,124,7,106,8,125,8,124,8,100, + 1,117,0,114,132,116,9,100,3,131,1,130,1,124,4,160, + 10,124,8,161,1,1,0,113,8,116,11,160,12,124,1,100, + 1,161,2,125,7,124,4,124,7,95,8,124,7,83,0,41, + 4,122,63,70,105,110,100,32,116,104,101,32,108,111,97,100, + 101,114,32,111,114,32,110,97,109,101,115,112,97,99,101,95, + 112,97,116,104,32,102,111,114,32,116,104,105,115,32,109,111, + 100,117,108,101,47,112,97,99,107,97,103,101,32,110,97,109, + 101,46,78,114,207,0,0,0,122,19,115,112,101,99,32,109, + 105,115,115,105,110,103,32,108,111,97,100,101,114,41,13,114, + 165,0,0,0,114,90,0,0,0,218,5,98,121,116,101,115, + 114,52,1,0,0,114,133,0,0,0,114,207,0,0,0,114, + 53,1,0,0,114,144,0,0,0,114,182,0,0,0,114,122, + 0,0,0,114,171,0,0,0,114,139,0,0,0,114,187,0, + 0,0,41,9,114,202,0,0,0,114,143,0,0,0,114,52, + 0,0,0,114,206,0,0,0,218,14,110,97,109,101,115,112, + 97,99,101,95,112,97,116,104,90,5,101,110,116,114,121,114, + 47,1,0,0,114,191,0,0,0,114,145,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,9,95, + 103,101,116,95,115,112,101,99,48,5,0,0,115,44,0,0, + 0,4,5,8,1,14,1,2,1,10,1,8,1,10,1,14, + 1,12,2,8,1,2,1,10,1,8,1,6,1,8,1,8, + 1,10,5,2,128,12,2,6,1,4,1,255,128,122,20,80, + 97,116,104,70,105,110,100,101,114,46,95,103,101,116,95,115, + 112,101,99,99,4,0,0,0,0,0,0,0,0,0,0,0, + 6,0,0,0,5,0,0,0,67,0,0,0,115,94,0,0, + 0,124,2,100,1,117,0,114,14,116,0,106,1,125,2,124, + 0,160,2,124,1,124,2,124,3,161,3,125,4,124,4,100, + 1,117,0,114,40,100,1,83,0,124,4,106,3,100,1,117, + 0,114,90,124,4,106,4,125,5,124,5,114,86,100,1,124, + 4,95,5,116,6,124,1,124,5,124,0,106,2,131,3,124, + 4,95,4,124,4,83,0,100,1,83,0,124,4,83,0,41, + 2,122,141,84,114,121,32,116,111,32,102,105,110,100,32,97, + 32,115,112,101,99,32,102,111,114,32,39,102,117,108,108,110, + 97,109,101,39,32,111,110,32,115,121,115,46,112,97,116,104, + 32,111,114,32,39,112,97,116,104,39,46,10,10,32,32,32, + 32,32,32,32,32,84,104,101,32,115,101,97,114,99,104,32, + 105,115,32,98,97,115,101,100,32,111,110,32,115,121,115,46, + 112,97,116,104,95,104,111,111,107,115,32,97,110,100,32,115, + 121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114, + 95,99,97,99,104,101,46,10,32,32,32,32,32,32,32,32, + 78,41,7,114,15,0,0,0,114,52,0,0,0,114,56,1, + 0,0,114,144,0,0,0,114,182,0,0,0,114,185,0,0, + 0,114,18,1,0,0,41,6,114,202,0,0,0,114,143,0, + 0,0,114,52,0,0,0,114,206,0,0,0,114,191,0,0, + 0,114,55,1,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,207,0,0,0,80,5,0,0,115,28, + 0,0,0,8,6,6,1,14,1,8,1,4,1,10,1,6, + 1,4,1,6,3,16,1,4,1,4,2,4,2,255,128,122, + 20,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, + 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,30, + 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, + 3,100,1,117,0,114,24,100,1,83,0,124,3,106,1,83, + 0,41,2,122,170,102,105,110,100,32,116,104,101,32,109,111, + 100,117,108,101,32,111,110,32,115,121,115,46,112,97,116,104, + 32,111,114,32,39,112,97,116,104,39,32,98,97,115,101,100, 32,111,110,32,115,121,115,46,112,97,116,104,95,104,111,111, - 107,115,32,97,110,100,32,115,121,115,46,112,97,116,104,95, - 105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,10, - 32,32,32,32,32,32,32,32,78,41,7,114,15,0,0,0, - 114,52,0,0,0,114,56,1,0,0,114,144,0,0,0,114, - 182,0,0,0,114,185,0,0,0,114,18,1,0,0,41,6, - 114,202,0,0,0,114,143,0,0,0,114,52,0,0,0,114, - 206,0,0,0,114,191,0,0,0,114,55,1,0,0,114,7, + 107,115,32,97,110,100,10,32,32,32,32,32,32,32,32,115, + 121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114, + 95,99,97,99,104,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, + 114,208,0,0,0,114,209,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,210,0,0,0,104,5, + 0,0,115,10,0,0,0,12,8,8,1,4,1,6,1,255, + 128,122,22,80,97,116,104,70,105,110,100,101,114,46,102,105, + 110,100,95,109,111,100,117,108,101,99,0,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,4,0,0,0,79,0, + 0,0,115,28,0,0,0,100,1,100,2,108,0,109,1,125, + 2,1,0,124,2,106,2,124,0,105,0,124,1,164,1,142, + 1,83,0,41,4,97,32,1,0,0,10,32,32,32,32,32, + 32,32,32,70,105,110,100,32,100,105,115,116,114,105,98,117, + 116,105,111,110,115,46,10,10,32,32,32,32,32,32,32,32, + 82,101,116,117,114,110,32,97,110,32,105,116,101,114,97,98, + 108,101,32,111,102,32,97,108,108,32,68,105,115,116,114,105, + 98,117,116,105,111,110,32,105,110,115,116,97,110,99,101,115, + 32,99,97,112,97,98,108,101,32,111,102,10,32,32,32,32, + 32,32,32,32,108,111,97,100,105,110,103,32,116,104,101,32, + 109,101,116,97,100,97,116,97,32,102,111,114,32,112,97,99, + 107,97,103,101,115,32,109,97,116,99,104,105,110,103,32,96, + 96,99,111,110,116,101,120,116,46,110,97,109,101,96,96,10, + 32,32,32,32,32,32,32,32,40,111,114,32,97,108,108,32, + 110,97,109,101,115,32,105,102,32,96,96,78,111,110,101,96, + 96,32,105,110,100,105,99,97,116,101,100,41,32,97,108,111, + 110,103,32,116,104,101,32,112,97,116,104,115,32,105,110,32, + 116,104,101,32,108,105,115,116,10,32,32,32,32,32,32,32, + 32,111,102,32,100,105,114,101,99,116,111,114,105,101,115,32, + 96,96,99,111,110,116,101,120,116,46,112,97,116,104,96,96, + 46,10,32,32,32,32,32,32,32,32,114,0,0,0,0,41, + 1,218,18,77,101,116,97,100,97,116,97,80,97,116,104,70, + 105,110,100,101,114,78,41,3,90,18,105,109,112,111,114,116, + 108,105,98,46,109,101,116,97,100,97,116,97,114,57,1,0, + 0,218,18,102,105,110,100,95,100,105,115,116,114,105,98,117, + 116,105,111,110,115,41,3,114,124,0,0,0,114,125,0,0, + 0,114,57,1,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,58,1,0,0,117,5,0,0,115,6, + 0,0,0,12,10,16,1,255,128,122,29,80,97,116,104,70, + 105,110,100,101,114,46,102,105,110,100,95,100,105,115,116,114, + 105,98,117,116,105,111,110,115,41,1,78,41,2,78,78,41, + 1,78,41,14,114,130,0,0,0,114,129,0,0,0,114,131, + 0,0,0,114,132,0,0,0,114,213,0,0,0,114,43,1, + 0,0,114,49,1,0,0,114,214,0,0,0,114,52,1,0, + 0,114,53,1,0,0,114,56,1,0,0,114,207,0,0,0, + 114,210,0,0,0,114,58,1,0,0,114,7,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,42, + 1,0,0,240,4,0,0,115,38,0,0,0,8,0,4,2, + 2,2,10,1,2,9,10,1,2,12,10,1,2,21,10,1, + 2,14,12,1,2,31,12,1,2,23,12,1,2,12,14,1, + 255,128,114,42,1,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,64,0,0,0, + 115,90,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, + 5,101,6,90,7,100,6,100,7,132,0,90,8,100,8,100, + 9,132,0,90,9,100,19,100,11,100,12,132,1,90,10,100, + 13,100,14,132,0,90,11,101,12,100,15,100,16,132,0,131, + 1,90,13,100,17,100,18,132,0,90,14,100,10,83,0,41, + 20,218,10,70,105,108,101,70,105,110,100,101,114,122,172,70, + 105,108,101,45,98,97,115,101,100,32,102,105,110,100,101,114, + 46,10,10,32,32,32,32,73,110,116,101,114,97,99,116,105, + 111,110,115,32,119,105,116,104,32,116,104,101,32,102,105,108, + 101,32,115,121,115,116,101,109,32,97,114,101,32,99,97,99, + 104,101,100,32,102,111,114,32,112,101,114,102,111,114,109,97, + 110,99,101,44,32,98,101,105,110,103,10,32,32,32,32,114, + 101,102,114,101,115,104,101,100,32,119,104,101,110,32,116,104, + 101,32,100,105,114,101,99,116,111,114,121,32,116,104,101,32, + 102,105,110,100,101,114,32,105,115,32,104,97,110,100,108,105, + 110,103,32,104,97,115,32,98,101,101,110,32,109,111,100,105, + 102,105,101,100,46,10,10,32,32,32,32,99,2,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0, + 7,0,0,0,115,84,0,0,0,103,0,125,3,124,2,68, + 0,93,32,92,2,137,0,125,4,124,3,160,0,135,0,102, + 1,100,1,100,2,132,8,124,4,68,0,131,1,161,1,1, + 0,113,8,124,3,124,0,95,1,124,1,112,54,100,3,124, + 0,95,2,100,4,124,0,95,3,116,4,131,0,124,0,95, + 5,116,4,131,0,124,0,95,6,100,5,83,0,41,6,122, + 154,73,110,105,116,105,97,108,105,122,101,32,119,105,116,104, + 32,116,104,101,32,112,97,116,104,32,116,111,32,115,101,97, + 114,99,104,32,111,110,32,97,110,100,32,97,32,118,97,114, + 105,97,98,108,101,32,110,117,109,98,101,114,32,111,102,10, + 32,32,32,32,32,32,32,32,50,45,116,117,112,108,101,115, + 32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32, + 108,111,97,100,101,114,32,97,110,100,32,116,104,101,32,102, + 105,108,101,32,115,117,102,102,105,120,101,115,32,116,104,101, + 32,108,111,97,100,101,114,10,32,32,32,32,32,32,32,32, + 114,101,99,111,103,110,105,122,101,115,46,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 51,0,0,0,115,22,0,0,0,124,0,93,14,125,1,124, + 1,136,0,102,2,86,0,1,0,113,2,100,0,83,0,114, + 114,0,0,0,114,7,0,0,0,114,14,1,0,0,169,1, + 114,144,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 9,0,0,0,146,5,0,0,115,4,0,0,0,22,0,255, + 128,122,38,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,114,79,0,0,0,114,109, + 0,0,0,78,41,7,114,171,0,0,0,218,8,95,108,111, + 97,100,101,114,115,114,52,0,0,0,218,11,95,112,97,116, + 104,95,109,116,105,109,101,218,3,115,101,116,218,11,95,112, + 97,116,104,95,99,97,99,104,101,218,19,95,114,101,108,97, + 120,101,100,95,112,97,116,104,95,99,97,99,104,101,41,5, + 114,123,0,0,0,114,52,0,0,0,218,14,108,111,97,100, + 101,114,95,100,101,116,97,105,108,115,90,7,108,111,97,100, + 101,114,115,114,193,0,0,0,114,7,0,0,0,114,60,1, + 0,0,114,8,0,0,0,114,216,0,0,0,140,5,0,0, + 115,18,0,0,0,4,4,12,1,26,1,6,1,10,2,6, + 1,8,1,12,1,255,128,122,19,70,105,108,101,70,105,110, + 100,101,114,46,95,95,105,110,105,116,95,95,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, + 0,67,0,0,0,115,10,0,0,0,100,1,124,0,95,0, + 100,2,83,0,41,3,122,31,73,110,118,97,108,105,100,97, + 116,101,32,116,104,101,32,100,105,114,101,99,116,111,114,121, + 32,109,116,105,109,101,46,114,109,0,0,0,78,41,1,114, + 62,1,0,0,114,253,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,43,1,0,0,154,5,0, + 0,115,4,0,0,0,10,2,255,128,122,28,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,0,0,0, + 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, + 0,115,42,0,0,0,124,0,160,0,124,1,161,1,125,2, + 124,2,100,1,117,0,114,26,100,1,103,0,102,2,83,0, + 124,2,106,1,124,2,106,2,112,38,103,0,102,2,83,0, + 41,2,122,197,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,44,32,111,114,32,116,104,101,32,110,97,109,101,115,112, + 97,99,101,10,32,32,32,32,32,32,32,32,112,97,99,107, + 97,103,101,32,112,111,114,116,105,111,110,115,46,32,82,101, + 116,117,114,110,115,32,40,108,111,97,100,101,114,44,32,108, + 105,115,116,45,111,102,45,112,111,114,116,105,111,110,115,41, + 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,102,105,110,100,95, + 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, + 10,32,32,32,32,32,32,32,32,78,41,3,114,207,0,0, + 0,114,144,0,0,0,114,182,0,0,0,41,3,114,123,0, + 0,0,114,143,0,0,0,114,191,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,141,0,0,0, + 160,5,0,0,115,10,0,0,0,10,7,8,1,8,1,16, + 1,255,128,122,22,70,105,108,101,70,105,110,100,101,114,46, + 102,105,110,100,95,108,111,97,100,101,114,99,6,0,0,0, + 0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0, + 67,0,0,0,115,26,0,0,0,124,1,124,2,124,3,131, + 2,125,6,116,0,124,2,124,3,124,6,124,4,100,1,141, + 4,83,0,41,2,78,114,181,0,0,0,41,1,114,194,0, + 0,0,41,7,114,123,0,0,0,114,192,0,0,0,114,143, + 0,0,0,114,52,0,0,0,90,4,115,109,115,108,114,206, + 0,0,0,114,144,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,56,1,0,0,172,5,0,0, + 115,10,0,0,0,10,1,8,1,2,1,6,255,255,128,122, + 20,70,105,108,101,70,105,110,100,101,114,46,95,103,101,116, + 95,115,112,101,99,78,99,3,0,0,0,0,0,0,0,0, + 0,0,0,14,0,0,0,8,0,0,0,67,0,0,0,115, + 92,1,0,0,100,1,125,3,124,1,160,0,100,2,161,1, + 100,3,25,0,125,4,122,24,116,1,124,0,106,2,112,34, + 116,3,160,4,161,0,131,1,106,5,125,5,87,0,110,20, + 4,0,116,6,144,1,121,90,1,0,1,0,1,0,100,4, + 125,5,89,0,124,5,124,0,106,7,107,3,114,88,124,0, + 160,8,161,0,1,0,124,5,124,0,95,7,116,9,131,0, + 114,110,124,0,106,10,125,6,124,4,160,11,161,0,125,7, + 110,10,124,0,106,12,125,6,124,4,125,7,124,7,124,6, + 118,0,114,212,116,13,124,0,106,2,124,4,131,2,125,8, + 124,0,106,14,68,0,93,56,92,2,125,9,125,10,100,5, + 124,9,23,0,125,11,116,13,124,8,124,11,131,2,125,12, + 116,15,124,12,131,1,114,146,124,0,160,16,124,10,124,1, + 124,12,124,8,103,1,124,2,161,5,2,0,1,0,83,0, + 116,17,124,8,131,1,125,3,124,0,106,14,68,0,93,80, + 92,2,125,9,125,10,116,13,124,0,106,2,124,4,124,9, + 23,0,131,2,125,12,116,18,106,19,100,6,124,12,100,3, + 100,7,141,3,1,0,124,7,124,9,23,0,124,6,118,0, + 114,218,116,15,124,12,131,1,114,218,124,0,160,16,124,10, + 124,1,124,12,100,8,124,2,161,5,2,0,1,0,83,0, + 124,3,144,1,114,86,116,18,160,19,100,9,124,8,161,2, + 1,0,116,18,160,20,124,1,100,8,161,2,125,13,124,8, + 103,1,124,13,95,21,124,13,83,0,100,8,83,0,119,0, + 41,10,122,111,84,114,121,32,116,111,32,102,105,110,100,32, + 97,32,115,112,101,99,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,46, + 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, + 115,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115, + 112,101,99,44,32,111,114,32,78,111,110,101,32,105,102,32, + 110,111,116,32,102,111,117,110,100,46,10,32,32,32,32,32, + 32,32,32,70,114,79,0,0,0,114,39,0,0,0,114,109, + 0,0,0,114,216,0,0,0,122,9,116,114,121,105,110,103, + 32,123,125,41,1,90,9,118,101,114,98,111,115,105,116,121, + 78,122,25,112,111,115,115,105,98,108,101,32,110,97,109,101, + 115,112,97,99,101,32,102,111,114,32,123,125,41,22,114,49, + 0,0,0,114,57,0,0,0,114,52,0,0,0,114,18,0, + 0,0,114,63,0,0,0,114,7,1,0,0,114,58,0,0, + 0,114,62,1,0,0,218,11,95,102,105,108,108,95,99,97, + 99,104,101,114,21,0,0,0,114,65,1,0,0,114,110,0, + 0,0,114,64,1,0,0,114,48,0,0,0,114,61,1,0, + 0,114,62,0,0,0,114,56,1,0,0,114,64,0,0,0, + 114,139,0,0,0,114,153,0,0,0,114,187,0,0,0,114, + 182,0,0,0,41,14,114,123,0,0,0,114,143,0,0,0, + 114,206,0,0,0,90,12,105,115,95,110,97,109,101,115,112, + 97,99,101,90,11,116,97,105,108,95,109,111,100,117,108,101, + 114,173,0,0,0,90,5,99,97,99,104,101,90,12,99,97, + 99,104,101,95,109,111,100,117,108,101,90,9,98,97,115,101, + 95,112,97,116,104,114,15,1,0,0,114,192,0,0,0,90, + 13,105,110,105,116,95,102,105,108,101,110,97,109,101,90,9, + 102,117,108,108,95,112,97,116,104,114,191,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,207,0, - 0,0,80,5,0,0,115,28,0,0,0,8,6,6,1,14, - 1,8,1,4,1,10,1,6,1,4,1,6,3,16,1,4, - 1,4,2,4,2,255,128,122,20,80,97,116,104,70,105,110, - 100,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, - 0,0,67,0,0,0,115,30,0,0,0,124,0,160,0,124, - 1,124,2,161,2,125,3,124,3,100,1,117,0,114,24,100, - 1,83,0,124,3,106,1,83,0,41,2,122,170,102,105,110, - 100,32,116,104,101,32,109,111,100,117,108,101,32,111,110,32, - 115,121,115,46,112,97,116,104,32,111,114,32,39,112,97,116, - 104,39,32,98,97,115,101,100,32,111,110,32,115,121,115,46, - 112,97,116,104,95,104,111,111,107,115,32,97,110,100,10,32, - 32,32,32,32,32,32,32,115,121,115,46,112,97,116,104,95, - 105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,10, - 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,85,115,101,32,102,105,110,100,95,115,112, - 101,99,40,41,32,105,110,115,116,101,97,100,46,10,10,32, - 32,32,32,32,32,32,32,78,114,208,0,0,0,114,209,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,210,0,0,0,104,5,0,0,115,10,0,0,0,12, - 8,8,1,4,1,6,1,255,128,122,22,80,97,116,104,70, - 105,110,100,101,114,46,102,105,110,100,95,109,111,100,117,108, - 101,99,0,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,4,0,0,0,79,0,0,0,115,28,0,0,0,100, - 1,100,2,108,0,109,1,125,2,1,0,124,2,106,2,124, - 0,105,0,124,1,164,1,142,1,83,0,41,4,97,32,1, - 0,0,10,32,32,32,32,32,32,32,32,70,105,110,100,32, - 100,105,115,116,114,105,98,117,116,105,111,110,115,46,10,10, - 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,97, - 110,32,105,116,101,114,97,98,108,101,32,111,102,32,97,108, - 108,32,68,105,115,116,114,105,98,117,116,105,111,110,32,105, - 110,115,116,97,110,99,101,115,32,99,97,112,97,98,108,101, - 32,111,102,10,32,32,32,32,32,32,32,32,108,111,97,100, - 105,110,103,32,116,104,101,32,109,101,116,97,100,97,116,97, - 32,102,111,114,32,112,97,99,107,97,103,101,115,32,109,97, - 116,99,104,105,110,103,32,96,96,99,111,110,116,101,120,116, - 46,110,97,109,101,96,96,10,32,32,32,32,32,32,32,32, - 40,111,114,32,97,108,108,32,110,97,109,101,115,32,105,102, - 32,96,96,78,111,110,101,96,96,32,105,110,100,105,99,97, - 116,101,100,41,32,97,108,111,110,103,32,116,104,101,32,112, - 97,116,104,115,32,105,110,32,116,104,101,32,108,105,115,116, - 10,32,32,32,32,32,32,32,32,111,102,32,100,105,114,101, - 99,116,111,114,105,101,115,32,96,96,99,111,110,116,101,120, - 116,46,112,97,116,104,96,96,46,10,32,32,32,32,32,32, - 32,32,114,0,0,0,0,41,1,218,18,77,101,116,97,100, - 97,116,97,80,97,116,104,70,105,110,100,101,114,78,41,3, - 90,18,105,109,112,111,114,116,108,105,98,46,109,101,116,97, - 100,97,116,97,114,57,1,0,0,218,18,102,105,110,100,95, - 100,105,115,116,114,105,98,117,116,105,111,110,115,41,3,114, - 124,0,0,0,114,125,0,0,0,114,57,1,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,58,1, - 0,0,117,5,0,0,115,6,0,0,0,12,10,16,1,255, - 128,122,29,80,97,116,104,70,105,110,100,101,114,46,102,105, - 110,100,95,100,105,115,116,114,105,98,117,116,105,111,110,115, - 41,1,78,41,2,78,78,41,1,78,41,14,114,130,0,0, - 0,114,129,0,0,0,114,131,0,0,0,114,132,0,0,0, - 114,213,0,0,0,114,43,1,0,0,114,49,1,0,0,114, - 214,0,0,0,114,52,1,0,0,114,53,1,0,0,114,56, - 1,0,0,114,207,0,0,0,114,210,0,0,0,114,58,1, - 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,42,1,0,0,240,4,0,0,115, - 38,0,0,0,8,0,4,2,2,2,10,1,2,9,10,1, - 2,12,10,1,2,21,10,1,2,14,12,1,2,31,12,1, - 2,23,12,1,2,12,14,1,255,128,114,42,1,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,64,0,0,0,115,90,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, - 4,100,4,100,5,132,0,90,5,101,6,90,7,100,6,100, - 7,132,0,90,8,100,8,100,9,132,0,90,9,100,19,100, - 11,100,12,132,1,90,10,100,13,100,14,132,0,90,11,101, - 12,100,15,100,16,132,0,131,1,90,13,100,17,100,18,132, - 0,90,14,100,10,83,0,41,20,218,10,70,105,108,101,70, - 105,110,100,101,114,122,172,70,105,108,101,45,98,97,115,101, - 100,32,102,105,110,100,101,114,46,10,10,32,32,32,32,73, - 110,116,101,114,97,99,116,105,111,110,115,32,119,105,116,104, - 32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109, - 32,97,114,101,32,99,97,99,104,101,100,32,102,111,114,32, - 112,101,114,102,111,114,109,97,110,99,101,44,32,98,101,105, - 110,103,10,32,32,32,32,114,101,102,114,101,115,104,101,100, - 32,119,104,101,110,32,116,104,101,32,100,105,114,101,99,116, - 111,114,121,32,116,104,101,32,102,105,110,100,101,114,32,105, - 115,32,104,97,110,100,108,105,110,103,32,104,97,115,32,98, - 101,101,110,32,109,111,100,105,102,105,101,100,46,10,10,32, - 32,32,32,99,2,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,6,0,0,0,7,0,0,0,115,84,0,0, - 0,103,0,125,3,124,2,68,0,93,32,92,2,137,0,125, - 4,124,3,160,0,135,0,102,1,100,1,100,2,132,8,124, - 4,68,0,131,1,161,1,1,0,113,8,124,3,124,0,95, - 1,124,1,112,54,100,3,124,0,95,2,100,4,124,0,95, - 3,116,4,131,0,124,0,95,5,116,4,131,0,124,0,95, - 6,100,5,83,0,41,6,122,154,73,110,105,116,105,97,108, - 105,122,101,32,119,105,116,104,32,116,104,101,32,112,97,116, - 104,32,116,111,32,115,101,97,114,99,104,32,111,110,32,97, - 110,100,32,97,32,118,97,114,105,97,98,108,101,32,110,117, - 109,98,101,114,32,111,102,10,32,32,32,32,32,32,32,32, - 50,45,116,117,112,108,101,115,32,99,111,110,116,97,105,110, - 105,110,103,32,116,104,101,32,108,111,97,100,101,114,32,97, - 110,100,32,116,104,101,32,102,105,108,101,32,115,117,102,102, - 105,120,101,115,32,116,104,101,32,108,111,97,100,101,114,10, - 32,32,32,32,32,32,32,32,114,101,99,111,103,110,105,122, - 101,115,46,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,51,0,0,0,115,22,0,0, - 0,124,0,93,14,125,1,124,1,136,0,102,2,86,0,1, - 0,113,2,100,0,83,0,114,114,0,0,0,114,7,0,0, - 0,114,14,1,0,0,169,1,114,144,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,9,0,0,0,146,5,0,0, - 115,4,0,0,0,22,0,255,128,122,38,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,114,79,0,0,0,114,109,0,0,0,78,41,7,114,171, - 0,0,0,218,8,95,108,111,97,100,101,114,115,114,52,0, - 0,0,218,11,95,112,97,116,104,95,109,116,105,109,101,218, - 3,115,101,116,218,11,95,112,97,116,104,95,99,97,99,104, - 101,218,19,95,114,101,108,97,120,101,100,95,112,97,116,104, - 95,99,97,99,104,101,41,5,114,123,0,0,0,114,52,0, - 0,0,218,14,108,111,97,100,101,114,95,100,101,116,97,105, - 108,115,90,7,108,111,97,100,101,114,115,114,193,0,0,0, - 114,7,0,0,0,114,60,1,0,0,114,8,0,0,0,114, - 216,0,0,0,140,5,0,0,115,18,0,0,0,4,4,12, - 1,26,1,6,1,10,2,6,1,8,1,12,1,255,128,122, - 19,70,105,108,101,70,105,110,100,101,114,46,95,95,105,110, - 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,2,0,0,0,67,0,0,0,115,10,0, - 0,0,100,1,124,0,95,0,100,2,83,0,41,3,122,31, - 73,110,118,97,108,105,100,97,116,101,32,116,104,101,32,100, - 105,114,101,99,116,111,114,121,32,109,116,105,109,101,46,114, - 109,0,0,0,78,41,1,114,62,1,0,0,114,253,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,43,1,0,0,154,5,0,0,115,4,0,0,0,10,2, - 255,128,122,28,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,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,67,0,0,0,115,42,0,0,0,124,0, - 160,0,124,1,161,1,125,2,124,2,100,1,117,0,114,26, - 100,1,103,0,102,2,83,0,124,2,106,1,124,2,106,2, - 112,38,103,0,102,2,83,0,41,2,122,197,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,44,32,111,114,32,116,104, - 101,32,110,97,109,101,115,112,97,99,101,10,32,32,32,32, - 32,32,32,32,112,97,99,107,97,103,101,32,112,111,114,116, - 105,111,110,115,46,32,82,101,116,117,114,110,115,32,40,108, - 111,97,100,101,114,44,32,108,105,115,116,45,111,102,45,112, - 111,114,116,105,111,110,115,41,46,10,10,32,32,32,32,32, - 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, - 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, - 115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,105, - 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, - 32,78,41,3,114,207,0,0,0,114,144,0,0,0,114,182, - 0,0,0,41,3,114,123,0,0,0,114,143,0,0,0,114, - 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,141,0,0,0,160,5,0,0,115,10,0,0, - 0,10,7,8,1,8,1,16,1,255,128,122,22,70,105,108, - 101,70,105,110,100,101,114,46,102,105,110,100,95,108,111,97, - 100,101,114,99,6,0,0,0,0,0,0,0,0,0,0,0, - 7,0,0,0,6,0,0,0,67,0,0,0,115,26,0,0, - 0,124,1,124,2,124,3,131,2,125,6,116,0,124,2,124, - 3,124,6,124,4,100,1,141,4,83,0,41,2,78,114,181, - 0,0,0,41,1,114,194,0,0,0,41,7,114,123,0,0, - 0,114,192,0,0,0,114,143,0,0,0,114,52,0,0,0, - 90,4,115,109,115,108,114,206,0,0,0,114,144,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 56,1,0,0,172,5,0,0,115,10,0,0,0,10,1,8, - 1,2,1,6,255,255,128,122,20,70,105,108,101,70,105,110, - 100,101,114,46,95,103,101,116,95,115,112,101,99,78,99,3, - 0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,8, - 0,0,0,67,0,0,0,115,92,1,0,0,100,1,125,3, - 124,1,160,0,100,2,161,1,100,3,25,0,125,4,122,24, - 116,1,124,0,106,2,112,34,116,3,160,4,161,0,131,1, - 106,5,125,5,87,0,110,22,4,0,116,6,121,64,1,0, - 1,0,1,0,100,4,125,5,89,0,110,2,119,0,124,5, - 124,0,106,7,107,3,114,90,124,0,160,8,161,0,1,0, - 124,5,124,0,95,7,116,9,131,0,114,112,124,0,106,10, - 125,6,124,4,160,11,161,0,125,7,110,10,124,0,106,12, - 125,6,124,4,125,7,124,7,124,6,118,0,114,214,116,13, - 124,0,106,2,124,4,131,2,125,8,124,0,106,14,68,0, - 93,56,92,2,125,9,125,10,100,5,124,9,23,0,125,11, - 116,13,124,8,124,11,131,2,125,12,116,15,124,12,131,1, - 114,148,124,0,160,16,124,10,124,1,124,12,124,8,103,1, - 124,2,161,5,2,0,1,0,83,0,116,17,124,8,131,1, - 125,3,124,0,106,14,68,0,93,80,92,2,125,9,125,10, - 116,13,124,0,106,2,124,4,124,9,23,0,131,2,125,12, - 116,18,106,19,100,6,124,12,100,3,100,7,141,3,1,0, - 124,7,124,9,23,0,124,6,118,0,114,220,116,15,124,12, - 131,1,114,220,124,0,160,16,124,10,124,1,124,12,100,8, - 124,2,161,5,2,0,1,0,83,0,124,3,144,1,114,88, - 116,18,160,19,100,9,124,8,161,2,1,0,116,18,160,20, - 124,1,100,8,161,2,125,13,124,8,103,1,124,13,95,21, - 124,13,83,0,100,8,83,0,41,10,122,111,84,114,121,32, - 116,111,32,102,105,110,100,32,97,32,115,112,101,99,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,46,10,10,32,32,32,32,32,32, - 32,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97, - 116,99,104,105,110,103,32,115,112,101,99,44,32,111,114,32, - 78,111,110,101,32,105,102,32,110,111,116,32,102,111,117,110, - 100,46,10,32,32,32,32,32,32,32,32,70,114,79,0,0, - 0,114,39,0,0,0,114,109,0,0,0,114,216,0,0,0, - 122,9,116,114,121,105,110,103,32,123,125,41,1,90,9,118, - 101,114,98,111,115,105,116,121,78,122,25,112,111,115,115,105, - 98,108,101,32,110,97,109,101,115,112,97,99,101,32,102,111, - 114,32,123,125,41,22,114,49,0,0,0,114,57,0,0,0, - 114,52,0,0,0,114,18,0,0,0,114,63,0,0,0,114, - 7,1,0,0,114,58,0,0,0,114,62,1,0,0,218,11, - 95,102,105,108,108,95,99,97,99,104,101,114,21,0,0,0, - 114,65,1,0,0,114,110,0,0,0,114,64,1,0,0,114, - 48,0,0,0,114,61,1,0,0,114,62,0,0,0,114,56, - 1,0,0,114,64,0,0,0,114,139,0,0,0,114,153,0, - 0,0,114,187,0,0,0,114,182,0,0,0,41,14,114,123, - 0,0,0,114,143,0,0,0,114,206,0,0,0,90,12,105, - 115,95,110,97,109,101,115,112,97,99,101,90,11,116,97,105, - 108,95,109,111,100,117,108,101,114,173,0,0,0,90,5,99, - 97,99,104,101,90,12,99,97,99,104,101,95,109,111,100,117, - 108,101,90,9,98,97,115,101,95,112,97,116,104,114,15,1, - 0,0,114,192,0,0,0,90,13,105,110,105,116,95,102,105, - 108,101,110,97,109,101,90,9,102,117,108,108,95,112,97,116, - 104,114,191,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,207,0,0,0,177,5,0,0,115,74, - 0,0,0,4,5,14,1,2,1,24,1,12,1,10,1,10, - 1,8,1,6,1,6,2,6,1,10,1,6,2,4,1,8, - 2,12,1,14,1,8,1,10,1,8,1,24,1,8,4,14, - 2,16,1,16,1,12,1,8,1,10,1,4,1,8,255,6, - 2,12,1,12,1,8,1,4,1,4,1,255,128,122,20,70, - 105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,115, - 112,101,99,99,1,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,10,0,0,0,67,0,0,0,115,192,0,0, - 0,124,0,106,0,125,1,122,22,116,1,160,2,124,1,112, - 22,116,1,160,3,161,0,161,1,125,2,87,0,110,28,4, - 0,116,4,116,5,116,6,102,3,121,56,1,0,1,0,1, - 0,103,0,125,2,89,0,110,2,119,0,116,7,106,8,160, - 9,100,1,161,1,115,82,116,10,124,2,131,1,124,0,95, - 11,110,74,116,10,131,0,125,3,124,2,68,0,93,56,125, - 4,124,4,160,12,100,2,161,1,92,3,125,5,125,6,125, - 7,124,6,114,134,100,3,160,13,124,5,124,7,160,14,161, - 0,161,2,125,8,110,4,124,5,125,8,124,3,160,15,124, - 8,161,1,1,0,113,92,124,3,124,0,95,11,116,7,106, - 8,160,9,116,16,161,1,114,188,100,4,100,5,132,0,124, - 2,68,0,131,1,124,0,95,17,100,6,83,0,100,6,83, - 0,41,7,122,68,70,105,108,108,32,116,104,101,32,99,97, - 99,104,101,32,111,102,32,112,111,116,101,110,116,105,97,108, - 32,109,111,100,117,108,101,115,32,97,110,100,32,112,97,99, - 107,97,103,101,115,32,102,111,114,32,116,104,105,115,32,100, - 105,114,101,99,116,111,114,121,46,114,14,0,0,0,114,79, - 0,0,0,114,69,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,83,0,0, - 0,115,20,0,0,0,104,0,124,0,93,12,125,1,124,1, - 160,0,161,0,146,2,113,4,83,0,114,7,0,0,0,41, - 1,114,110,0,0,0,41,2,114,5,0,0,0,90,2,102, - 110,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,13,0,0,0,254,5,0,0,115,4,0,0,0,20,0, - 255,128,122,41,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,115,101,116,99,111,109,112,62,78,41,18, - 114,52,0,0,0,114,18,0,0,0,90,7,108,105,115,116, - 100,105,114,114,63,0,0,0,114,50,1,0,0,218,15,80, - 101,114,109,105,115,115,105,111,110,69,114,114,111,114,218,18, - 78,111,116,65,68,105,114,101,99,116,111,114,121,69,114,114, - 111,114,114,15,0,0,0,114,22,0,0,0,114,23,0,0, - 0,114,63,1,0,0,114,64,1,0,0,114,105,0,0,0, - 114,70,0,0,0,114,110,0,0,0,218,3,97,100,100,114, - 24,0,0,0,114,65,1,0,0,41,9,114,123,0,0,0, - 114,52,0,0,0,90,8,99,111,110,116,101,110,116,115,90, - 21,108,111,119,101,114,95,115,117,102,102,105,120,95,99,111, - 110,116,101,110,116,115,114,38,1,0,0,114,121,0,0,0, - 114,25,1,0,0,114,15,1,0,0,90,8,110,101,119,95, - 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,67,1,0,0,225,5,0,0,115,38,0,0, - 0,6,2,2,1,22,1,18,1,10,3,12,3,12,1,6, - 7,8,1,16,1,4,1,18,1,4,2,12,1,6,1,12, - 1,20,1,4,255,255,128,122,22,70,105,108,101,70,105,110, - 100,101,114,46,95,102,105,108,108,95,99,97,99,104,101,99, - 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,7,0,0,0,115,18,0,0,0,135,0,135, - 1,102,2,100,1,100,2,132,8,125,2,124,2,83,0,41, - 4,97,20,1,0,0,65,32,99,108,97,115,115,32,109,101, - 116,104,111,100,32,119,104,105,99,104,32,114,101,116,117,114, - 110,115,32,97,32,99,108,111,115,117,114,101,32,116,111,32, - 117,115,101,32,111,110,32,115,121,115,46,112,97,116,104,95, - 104,111,111,107,10,32,32,32,32,32,32,32,32,119,104,105, - 99,104,32,119,105,108,108,32,114,101,116,117,114,110,32,97, - 110,32,105,110,115,116,97,110,99,101,32,117,115,105,110,103, - 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,108, - 111,97,100,101,114,115,32,97,110,100,32,116,104,101,32,112, - 97,116,104,10,32,32,32,32,32,32,32,32,99,97,108,108, - 101,100,32,111,110,32,116,104,101,32,99,108,111,115,117,114, - 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,116, - 104,101,32,112,97,116,104,32,99,97,108,108,101,100,32,111, - 110,32,116,104,101,32,99,108,111,115,117,114,101,32,105,115, - 32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121, - 44,32,73,109,112,111,114,116,69,114,114,111,114,32,105,115, - 10,32,32,32,32,32,32,32,32,114,97,105,115,101,100,46, - 10,10,32,32,32,32,32,32,32,32,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,19, - 0,0,0,115,36,0,0,0,116,0,124,0,131,1,115,20, - 116,1,100,1,124,0,100,2,141,2,130,1,136,0,124,0, - 103,1,136,1,162,1,82,0,142,0,83,0,41,4,122,45, - 80,97,116,104,32,104,111,111,107,32,102,111,114,32,105,109, - 112,111,114,116,108,105,98,46,109,97,99,104,105,110,101,114, - 121,46,70,105,108,101,70,105,110,100,101,114,46,122,30,111, - 110,108,121,32,100,105,114,101,99,116,111,114,105,101,115,32, - 97,114,101,32,115,117,112,112,111,114,116,101,100,114,56,0, - 0,0,78,41,2,114,64,0,0,0,114,122,0,0,0,114, - 56,0,0,0,169,2,114,202,0,0,0,114,66,1,0,0, - 114,7,0,0,0,114,8,0,0,0,218,24,112,97,116,104, - 95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,105, - 110,100,101,114,10,6,0,0,115,8,0,0,0,8,2,12, - 1,16,1,255,128,122,54,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,107,95,102, - 111,114,95,70,105,108,101,70,105,110,100,101,114,78,114,7, - 0,0,0,41,3,114,202,0,0,0,114,66,1,0,0,114, - 72,1,0,0,114,7,0,0,0,114,71,1,0,0,114,8, - 0,0,0,218,9,112,97,116,104,95,104,111,111,107,0,6, - 0,0,115,6,0,0,0,14,10,4,6,255,128,122,20,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,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, - 0,100,1,160,0,124,0,106,1,161,1,83,0,41,2,78, - 122,16,70,105,108,101,70,105,110,100,101,114,40,123,33,114, - 125,41,41,2,114,70,0,0,0,114,52,0,0,0,114,253, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,36,1,0,0,18,6,0,0,115,4,0,0,0, - 12,1,255,128,122,19,70,105,108,101,70,105,110,100,101,114, - 46,95,95,114,101,112,114,95,95,41,1,78,41,15,114,130, - 0,0,0,114,129,0,0,0,114,131,0,0,0,114,132,0, - 0,0,114,216,0,0,0,114,43,1,0,0,114,147,0,0, - 0,114,210,0,0,0,114,141,0,0,0,114,56,1,0,0, - 114,207,0,0,0,114,67,1,0,0,114,214,0,0,0,114, - 73,1,0,0,114,36,1,0,0,114,7,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,59,1, - 0,0,131,5,0,0,115,26,0,0,0,8,0,4,2,8, - 7,8,14,4,4,8,2,8,12,10,5,8,48,2,31,10, - 1,12,17,255,128,114,59,1,0,0,99,4,0,0,0,0, - 0,0,0,0,0,0,0,6,0,0,0,8,0,0,0,67, - 0,0,0,115,144,0,0,0,124,0,160,0,100,1,161,1, - 125,4,124,0,160,0,100,2,161,1,125,5,124,4,115,66, - 124,5,114,36,124,5,106,1,125,4,110,30,124,2,124,3, - 107,2,114,56,116,2,124,1,124,2,131,2,125,4,110,10, - 116,3,124,1,124,2,131,2,125,4,124,5,115,84,116,4, - 124,1,124,2,124,4,100,3,141,3,125,5,122,38,124,5, - 124,0,100,2,60,0,124,4,124,0,100,1,60,0,124,2, - 124,0,100,4,60,0,124,3,124,0,100,5,60,0,87,0, - 100,0,83,0,4,0,116,5,121,142,1,0,1,0,1,0, - 89,0,100,0,83,0,119,0,41,6,78,218,10,95,95,108, - 111,97,100,101,114,95,95,218,8,95,95,115,112,101,99,95, - 95,114,60,1,0,0,90,8,95,95,102,105,108,101,95,95, - 90,10,95,95,99,97,99,104,101,100,95,95,41,6,218,3, - 103,101,116,114,144,0,0,0,114,12,1,0,0,114,6,1, - 0,0,114,194,0,0,0,218,9,69,120,99,101,112,116,105, - 111,110,41,6,90,2,110,115,114,121,0,0,0,90,8,112, - 97,116,104,110,97,109,101,90,9,99,112,97,116,104,110,97, - 109,101,114,144,0,0,0,114,191,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,14,95,102,105, - 120,95,117,112,95,109,111,100,117,108,101,24,6,0,0,115, - 36,0,0,0,10,2,10,1,4,1,4,1,8,1,8,1, - 12,1,10,2,4,1,14,1,2,1,8,1,8,1,8,1, - 14,1,12,1,8,2,255,128,114,78,1,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, - 0,0,67,0,0,0,115,38,0,0,0,116,0,116,1,160, - 2,161,0,102,2,125,0,116,3,116,4,102,2,125,1,116, - 5,116,6,102,2,125,2,124,0,124,1,124,2,103,3,83, - 0,41,2,122,95,82,101,116,117,114,110,115,32,97,32,108, - 105,115,116,32,111,102,32,102,105,108,101,45,98,97,115,101, - 100,32,109,111,100,117,108,101,32,108,111,97,100,101,114,115, - 46,10,10,32,32,32,32,69,97,99,104,32,105,116,101,109, - 32,105,115,32,97,32,116,117,112,108,101,32,40,108,111,97, - 100,101,114,44,32,115,117,102,102,105,120,101,115,41,46,10, - 32,32,32,32,78,41,7,114,3,1,0,0,114,167,0,0, - 0,218,18,101,120,116,101,110,115,105,111,110,95,115,117,102, - 102,105,120,101,115,114,6,1,0,0,114,106,0,0,0,114, - 12,1,0,0,114,94,0,0,0,41,3,90,10,101,120,116, - 101,110,115,105,111,110,115,90,6,115,111,117,114,99,101,90, - 8,98,121,116,101,99,111,100,101,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,188,0,0,0,47,6,0, - 0,115,10,0,0,0,12,5,8,1,8,1,10,1,255,128, - 114,188,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,8, - 0,0,0,124,0,97,0,100,0,83,0,114,114,0,0,0, - 41,1,114,139,0,0,0,41,1,218,17,95,98,111,111,116, - 115,116,114,97,112,95,109,111,100,117,108,101,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,21,95,115,101, - 116,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, - 108,101,58,6,0,0,115,4,0,0,0,8,2,255,128,114, - 81,1,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,4,0,0,0,67,0,0,0,115,50,0, - 0,0,116,0,124,0,131,1,1,0,116,1,131,0,125,1, - 116,2,106,3,160,4,116,5,106,6,124,1,142,0,103,1, - 161,1,1,0,116,2,106,7,160,8,116,9,161,1,1,0, - 100,1,83,0,41,2,122,41,73,110,115,116,97,108,108,32, - 116,104,101,32,112,97,116,104,45,98,97,115,101,100,32,105, - 109,112,111,114,116,32,99,111,109,112,111,110,101,110,116,115, - 46,78,41,10,114,81,1,0,0,114,188,0,0,0,114,15, - 0,0,0,114,48,1,0,0,114,171,0,0,0,114,59,1, - 0,0,114,73,1,0,0,218,9,109,101,116,97,95,112,97, - 116,104,114,190,0,0,0,114,42,1,0,0,41,2,114,80, - 1,0,0,90,17,115,117,112,112,111,114,116,101,100,95,108, - 111,97,100,101,114,115,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,8,95,105,110,115,116,97,108,108,63, - 6,0,0,115,10,0,0,0,8,2,6,1,20,1,16,1, - 255,128,114,83,1,0,0,41,1,114,68,0,0,0,41,1, - 78,41,3,78,78,78,41,2,114,0,0,0,0,114,0,0, - 0,0,41,1,84,41,1,78,41,1,78,41,83,114,132,0, - 0,0,114,139,0,0,0,114,167,0,0,0,114,72,0,0, - 0,114,15,0,0,0,114,81,0,0,0,114,164,0,0,0, - 114,22,0,0,0,114,211,0,0,0,90,2,110,116,114,18, - 0,0,0,114,196,0,0,0,90,5,112,111,115,105,120,114, - 42,0,0,0,218,3,97,108,108,114,45,0,0,0,114,46, - 0,0,0,114,66,0,0,0,114,25,0,0,0,90,37,95, - 67,65,83,69,95,73,78,83,69,78,83,73,84,73,86,69, - 95,80,76,65,84,70,79,82,77,83,95,66,89,84,69,83, - 95,75,69,89,114,24,0,0,0,114,26,0,0,0,114,21, - 0,0,0,114,33,0,0,0,114,38,0,0,0,114,40,0, - 0,0,114,48,0,0,0,114,55,0,0,0,114,57,0,0, - 0,114,61,0,0,0,114,62,0,0,0,114,64,0,0,0, - 114,67,0,0,0,114,77,0,0,0,218,4,116,121,112,101, - 218,8,95,95,99,111,100,101,95,95,114,166,0,0,0,114, - 31,0,0,0,114,152,0,0,0,114,30,0,0,0,114,35, - 0,0,0,114,243,0,0,0,114,97,0,0,0,114,93,0, - 0,0,114,106,0,0,0,114,190,0,0,0,114,79,1,0, - 0,114,212,0,0,0,114,94,0,0,0,90,23,68,69,66, - 85,71,95,66,89,84,69,67,79,68,69,95,83,85,70,70, - 73,88,69,83,90,27,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,114,102,0,0,0,114,107,0,0,0,114,113,0,0,0, - 114,117,0,0,0,114,119,0,0,0,114,140,0,0,0,114, - 147,0,0,0,114,156,0,0,0,114,160,0,0,0,114,162, - 0,0,0,114,169,0,0,0,114,174,0,0,0,114,175,0, - 0,0,114,180,0,0,0,218,6,111,98,106,101,99,116,114, - 189,0,0,0,114,194,0,0,0,114,195,0,0,0,114,215, - 0,0,0,114,228,0,0,0,114,246,0,0,0,114,6,1, - 0,0,114,12,1,0,0,114,3,1,0,0,114,18,1,0, - 0,114,40,1,0,0,114,42,1,0,0,114,59,1,0,0, - 114,78,1,0,0,114,188,0,0,0,114,81,1,0,0,114, - 83,1,0,0,114,7,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,8,60,109,111,100,117,108, - 101,62,1,0,0,0,115,172,0,0,0,4,0,4,22,8, - 3,8,1,8,1,8,1,8,1,10,3,4,1,8,1,10, - 1,8,2,4,3,10,1,6,2,22,2,8,1,10,1,14, - 1,4,4,4,1,2,1,2,1,4,255,8,4,6,16,8, - 3,8,5,8,5,8,6,8,6,8,12,8,10,8,9,8, - 5,8,7,10,9,10,22,0,127,16,24,12,1,4,2,4, - 1,6,2,6,1,10,1,8,2,6,2,8,2,16,2,8, - 71,8,40,8,19,8,12,8,12,8,31,8,17,8,33,8, - 28,10,24,10,13,10,10,8,11,6,14,4,3,2,1,12, - 255,14,68,14,64,16,30,0,127,14,17,18,50,18,45,18, - 25,14,53,14,63,14,43,0,127,14,20,0,127,10,22,8, - 23,8,11,12,5,255,128, + 0,0,177,5,0,0,115,76,0,0,0,4,5,14,1,2, + 1,24,1,14,1,6,1,10,1,8,1,6,1,6,2,6, + 1,10,1,6,2,4,1,8,2,12,1,14,1,8,1,10, + 1,8,1,24,1,8,4,14,2,16,1,16,1,12,1,8, + 1,10,1,4,1,8,255,6,2,12,1,12,1,8,1,4, + 1,4,1,2,219,255,128,122,20,70,105,108,101,70,105,110, + 100,101,114,46,102,105,110,100,95,115,112,101,99,99,1,0, + 0,0,0,0,0,0,0,0,0,0,9,0,0,0,10,0, + 0,0,67,0,0,0,115,190,0,0,0,124,0,106,0,125, + 1,122,22,116,1,160,2,124,1,112,22,116,1,160,3,161, + 0,161,1,125,2,87,0,110,24,4,0,116,4,116,5,116, + 6,102,3,121,188,1,0,1,0,1,0,103,0,125,2,89, + 0,116,7,106,8,160,9,100,1,161,1,115,78,116,10,124, + 2,131,1,124,0,95,11,110,74,116,10,131,0,125,3,124, + 2,68,0,93,56,125,4,124,4,160,12,100,2,161,1,92, + 3,125,5,125,6,125,7,124,6,114,130,100,3,160,13,124, + 5,124,7,160,14,161,0,161,2,125,8,110,4,124,5,125, + 8,124,3,160,15,124,8,161,1,1,0,113,88,124,3,124, + 0,95,11,116,7,106,8,160,9,116,16,161,1,114,184,100, + 4,100,5,132,0,124,2,68,0,131,1,124,0,95,17,100, + 6,83,0,100,6,83,0,119,0,41,7,122,68,70,105,108, + 108,32,116,104,101,32,99,97,99,104,101,32,111,102,32,112, + 111,116,101,110,116,105,97,108,32,109,111,100,117,108,101,115, + 32,97,110,100,32,112,97,99,107,97,103,101,115,32,102,111, + 114,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121, + 46,114,14,0,0,0,114,79,0,0,0,114,69,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,83,0,0,0,115,20,0,0,0,104,0, + 124,0,93,12,125,1,124,1,160,0,161,0,146,2,113,4, + 83,0,114,7,0,0,0,41,1,114,110,0,0,0,41,2, + 114,5,0,0,0,90,2,102,110,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,13,0,0,0,254,5,0, + 0,115,4,0,0,0,20,0,255,128,122,41,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,115,101,116, + 99,111,109,112,62,78,41,18,114,52,0,0,0,114,18,0, + 0,0,90,7,108,105,115,116,100,105,114,114,63,0,0,0, + 114,50,1,0,0,218,15,80,101,114,109,105,115,115,105,111, + 110,69,114,114,111,114,218,18,78,111,116,65,68,105,114,101, + 99,116,111,114,121,69,114,114,111,114,114,15,0,0,0,114, + 22,0,0,0,114,23,0,0,0,114,63,1,0,0,114,64, + 1,0,0,114,105,0,0,0,114,70,0,0,0,114,110,0, + 0,0,218,3,97,100,100,114,24,0,0,0,114,65,1,0, + 0,41,9,114,123,0,0,0,114,52,0,0,0,90,8,99, + 111,110,116,101,110,116,115,90,21,108,111,119,101,114,95,115, + 117,102,102,105,120,95,99,111,110,116,101,110,116,115,114,38, + 1,0,0,114,121,0,0,0,114,25,1,0,0,114,15,1, + 0,0,90,8,110,101,119,95,110,97,109,101,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,67,1,0,0, + 225,5,0,0,115,40,0,0,0,6,2,2,1,22,1,18, + 1,6,3,12,3,12,1,6,7,8,1,16,1,4,1,18, + 1,4,2,12,1,6,1,12,1,20,1,4,255,2,233,255, + 128,122,22,70,105,108,101,70,105,110,100,101,114,46,95,102, + 105,108,108,95,99,97,99,104,101,99,1,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,3,0,0,0,7,0, + 0,0,115,18,0,0,0,135,0,135,1,102,2,100,1,100, + 2,132,8,125,2,124,2,83,0,41,4,97,20,1,0,0, + 65,32,99,108,97,115,115,32,109,101,116,104,111,100,32,119, + 104,105,99,104,32,114,101,116,117,114,110,115,32,97,32,99, + 108,111,115,117,114,101,32,116,111,32,117,115,101,32,111,110, + 32,115,121,115,46,112,97,116,104,95,104,111,111,107,10,32, + 32,32,32,32,32,32,32,119,104,105,99,104,32,119,105,108, + 108,32,114,101,116,117,114,110,32,97,110,32,105,110,115,116, + 97,110,99,101,32,117,115,105,110,103,32,116,104,101,32,115, + 112,101,99,105,102,105,101,100,32,108,111,97,100,101,114,115, + 32,97,110,100,32,116,104,101,32,112,97,116,104,10,32,32, + 32,32,32,32,32,32,99,97,108,108,101,100,32,111,110,32, + 116,104,101,32,99,108,111,115,117,114,101,46,10,10,32,32, + 32,32,32,32,32,32,73,102,32,116,104,101,32,112,97,116, + 104,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32, + 99,108,111,115,117,114,101,32,105,115,32,110,111,116,32,97, + 32,100,105,114,101,99,116,111,114,121,44,32,73,109,112,111, + 114,116,69,114,114,111,114,32,105,115,10,32,32,32,32,32, + 32,32,32,114,97,105,115,101,100,46,10,10,32,32,32,32, + 32,32,32,32,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,19,0,0,0,115,36,0, + 0,0,116,0,124,0,131,1,115,20,116,1,100,1,124,0, + 100,2,141,2,130,1,136,0,124,0,103,1,136,1,162,1, + 82,0,142,0,83,0,41,4,122,45,80,97,116,104,32,104, + 111,111,107,32,102,111,114,32,105,109,112,111,114,116,108,105, + 98,46,109,97,99,104,105,110,101,114,121,46,70,105,108,101, + 70,105,110,100,101,114,46,122,30,111,110,108,121,32,100,105, + 114,101,99,116,111,114,105,101,115,32,97,114,101,32,115,117, + 112,112,111,114,116,101,100,114,56,0,0,0,78,41,2,114, + 64,0,0,0,114,122,0,0,0,114,56,0,0,0,169,2, + 114,202,0,0,0,114,66,1,0,0,114,7,0,0,0,114, + 8,0,0,0,218,24,112,97,116,104,95,104,111,111,107,95, + 102,111,114,95,70,105,108,101,70,105,110,100,101,114,10,6, + 0,0,115,8,0,0,0,8,2,12,1,16,1,255,128,122, + 54,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,107,95,102,111,114,95,70,105,108, + 101,70,105,110,100,101,114,78,114,7,0,0,0,41,3,114, + 202,0,0,0,114,66,1,0,0,114,72,1,0,0,114,7, + 0,0,0,114,71,1,0,0,114,8,0,0,0,218,9,112, + 97,116,104,95,104,111,111,107,0,6,0,0,115,6,0,0, + 0,14,10,4,6,255,128,122,20,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,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,12,0,0,0,100,1,160,0,124, + 0,106,1,161,1,83,0,41,2,78,122,16,70,105,108,101, + 70,105,110,100,101,114,40,123,33,114,125,41,41,2,114,70, + 0,0,0,114,52,0,0,0,114,253,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,36,1,0, + 0,18,6,0,0,115,4,0,0,0,12,1,255,128,122,19, + 70,105,108,101,70,105,110,100,101,114,46,95,95,114,101,112, + 114,95,95,41,1,78,41,15,114,130,0,0,0,114,129,0, + 0,0,114,131,0,0,0,114,132,0,0,0,114,216,0,0, + 0,114,43,1,0,0,114,147,0,0,0,114,210,0,0,0, + 114,141,0,0,0,114,56,1,0,0,114,207,0,0,0,114, + 67,1,0,0,114,214,0,0,0,114,73,1,0,0,114,36, + 1,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,59,1,0,0,131,5,0,0, + 115,26,0,0,0,8,0,4,2,8,7,8,14,4,4,8, + 2,8,12,10,5,8,48,2,31,10,1,12,17,255,128,114, + 59,1,0,0,99,4,0,0,0,0,0,0,0,0,0,0, + 0,6,0,0,0,8,0,0,0,67,0,0,0,115,148,0, + 0,0,124,0,160,0,100,1,161,1,125,4,124,0,160,0, + 100,2,161,1,125,5,124,4,115,66,124,5,114,36,124,5, + 106,1,125,4,110,30,124,2,124,3,107,2,114,56,116,2, + 124,1,124,2,131,2,125,4,110,10,116,3,124,1,124,2, + 131,2,125,4,124,5,115,84,116,4,124,1,124,2,124,4, + 100,3,141,3,125,5,122,38,124,5,124,0,100,2,60,0, + 124,4,124,0,100,1,60,0,124,2,124,0,100,4,60,0, + 124,3,124,0,100,5,60,0,87,0,100,0,83,0,4,0, + 116,5,121,142,1,0,1,0,1,0,89,0,100,0,83,0, + 119,0,100,0,83,0,41,6,78,218,10,95,95,108,111,97, + 100,101,114,95,95,218,8,95,95,115,112,101,99,95,95,114, + 60,1,0,0,90,8,95,95,102,105,108,101,95,95,90,10, + 95,95,99,97,99,104,101,100,95,95,41,6,218,3,103,101, + 116,114,144,0,0,0,114,12,1,0,0,114,6,1,0,0, + 114,194,0,0,0,218,9,69,120,99,101,112,116,105,111,110, + 41,6,90,2,110,115,114,121,0,0,0,90,8,112,97,116, + 104,110,97,109,101,90,9,99,112,97,116,104,110,97,109,101, + 114,144,0,0,0,114,191,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,14,95,102,105,120,95, + 117,112,95,109,111,100,117,108,101,24,6,0,0,115,40,0, + 0,0,10,2,10,1,4,1,4,1,8,1,8,1,12,1, + 10,2,4,1,14,1,2,1,8,1,8,1,8,1,14,1, + 12,1,6,2,2,254,4,255,255,128,114,78,1,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,38,0,0,0,116,0,116, + 1,160,2,161,0,102,2,125,0,116,3,116,4,102,2,125, + 1,116,5,116,6,102,2,125,2,124,0,124,1,124,2,103, + 3,83,0,41,2,122,95,82,101,116,117,114,110,115,32,97, + 32,108,105,115,116,32,111,102,32,102,105,108,101,45,98,97, + 115,101,100,32,109,111,100,117,108,101,32,108,111,97,100,101, + 114,115,46,10,10,32,32,32,32,69,97,99,104,32,105,116, + 101,109,32,105,115,32,97,32,116,117,112,108,101,32,40,108, + 111,97,100,101,114,44,32,115,117,102,102,105,120,101,115,41, + 46,10,32,32,32,32,78,41,7,114,3,1,0,0,114,167, + 0,0,0,218,18,101,120,116,101,110,115,105,111,110,95,115, + 117,102,102,105,120,101,115,114,6,1,0,0,114,106,0,0, + 0,114,12,1,0,0,114,94,0,0,0,41,3,90,10,101, + 120,116,101,110,115,105,111,110,115,90,6,115,111,117,114,99, + 101,90,8,98,121,116,101,99,111,100,101,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,188,0,0,0,47, + 6,0,0,115,10,0,0,0,12,5,8,1,8,1,10,1, + 255,128,114,188,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,1,0,0,0,67,0,0,0, + 115,8,0,0,0,124,0,97,0,100,0,83,0,114,114,0, + 0,0,41,1,114,139,0,0,0,41,1,218,17,95,98,111, + 111,116,115,116,114,97,112,95,109,111,100,117,108,101,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,21,95, + 115,101,116,95,98,111,111,116,115,116,114,97,112,95,109,111, + 100,117,108,101,58,6,0,0,115,4,0,0,0,8,2,255, + 128,114,81,1,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 50,0,0,0,116,0,124,0,131,1,1,0,116,1,131,0, + 125,1,116,2,106,3,160,4,116,5,106,6,124,1,142,0, + 103,1,161,1,1,0,116,2,106,7,160,8,116,9,161,1, + 1,0,100,1,83,0,41,2,122,41,73,110,115,116,97,108, + 108,32,116,104,101,32,112,97,116,104,45,98,97,115,101,100, + 32,105,109,112,111,114,116,32,99,111,109,112,111,110,101,110, + 116,115,46,78,41,10,114,81,1,0,0,114,188,0,0,0, + 114,15,0,0,0,114,48,1,0,0,114,171,0,0,0,114, + 59,1,0,0,114,73,1,0,0,218,9,109,101,116,97,95, + 112,97,116,104,114,190,0,0,0,114,42,1,0,0,41,2, + 114,80,1,0,0,90,17,115,117,112,112,111,114,116,101,100, + 95,108,111,97,100,101,114,115,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,8,95,105,110,115,116,97,108, + 108,63,6,0,0,115,10,0,0,0,8,2,6,1,20,1, + 16,1,255,128,114,83,1,0,0,41,1,114,68,0,0,0, + 41,1,78,41,3,78,78,78,41,2,114,0,0,0,0,114, + 0,0,0,0,41,1,84,41,1,78,41,1,78,41,83,114, + 132,0,0,0,114,139,0,0,0,114,167,0,0,0,114,72, + 0,0,0,114,15,0,0,0,114,81,0,0,0,114,164,0, + 0,0,114,22,0,0,0,114,211,0,0,0,90,2,110,116, + 114,18,0,0,0,114,196,0,0,0,90,5,112,111,115,105, + 120,114,42,0,0,0,218,3,97,108,108,114,45,0,0,0, + 114,46,0,0,0,114,66,0,0,0,114,25,0,0,0,90, + 37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, + 86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,84, + 69,83,95,75,69,89,114,24,0,0,0,114,26,0,0,0, + 114,21,0,0,0,114,33,0,0,0,114,38,0,0,0,114, + 40,0,0,0,114,48,0,0,0,114,55,0,0,0,114,57, + 0,0,0,114,61,0,0,0,114,62,0,0,0,114,64,0, + 0,0,114,67,0,0,0,114,77,0,0,0,218,4,116,121, + 112,101,218,8,95,95,99,111,100,101,95,95,114,166,0,0, + 0,114,31,0,0,0,114,152,0,0,0,114,30,0,0,0, + 114,35,0,0,0,114,243,0,0,0,114,97,0,0,0,114, + 93,0,0,0,114,106,0,0,0,114,190,0,0,0,114,79, + 1,0,0,114,212,0,0,0,114,94,0,0,0,90,23,68, + 69,66,85,71,95,66,89,84,69,67,79,68,69,95,83,85, + 70,70,73,88,69,83,90,27,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,114,102,0,0,0,114,107,0,0,0,114,113,0, + 0,0,114,117,0,0,0,114,119,0,0,0,114,140,0,0, + 0,114,147,0,0,0,114,156,0,0,0,114,160,0,0,0, + 114,162,0,0,0,114,169,0,0,0,114,174,0,0,0,114, + 175,0,0,0,114,180,0,0,0,218,6,111,98,106,101,99, + 116,114,189,0,0,0,114,194,0,0,0,114,195,0,0,0, + 114,215,0,0,0,114,228,0,0,0,114,246,0,0,0,114, + 6,1,0,0,114,12,1,0,0,114,3,1,0,0,114,18, + 1,0,0,114,40,1,0,0,114,42,1,0,0,114,59,1, + 0,0,114,78,1,0,0,114,188,0,0,0,114,81,1,0, + 0,114,83,1,0,0,114,7,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,8,60,109,111,100, + 117,108,101,62,1,0,0,0,115,172,0,0,0,4,0,4, + 22,8,3,8,1,8,1,8,1,8,1,10,3,4,1,8, + 1,10,1,8,2,4,3,10,1,6,2,22,2,8,1,10, + 1,14,1,4,4,4,1,2,1,2,1,4,255,8,4,6, + 16,8,3,8,5,8,5,8,6,8,6,8,12,8,10,8, + 9,8,5,8,7,10,9,10,22,0,127,16,24,12,1,4, + 2,4,1,6,2,6,1,10,1,8,2,6,2,8,2,16, + 2,8,71,8,40,8,19,8,12,8,12,8,31,8,17,8, + 33,8,28,10,24,10,13,10,10,8,11,6,14,4,3,2, + 1,12,255,14,68,14,64,16,30,0,127,14,17,18,50,18, + 45,18,25,14,53,14,63,14,43,0,127,14,20,0,127,10, + 22,8,23,8,11,12,5,255,128, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index 96169c16edcd62..66e0f3f7f04051 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -118,66 +118,115 @@ const unsigned char _Py_M__zipimport[] = { 104,101,10,32,32,32,32,122,105,112,102,105,108,101,32,116, 97,114,103,101,116,101,100,46,10,32,32,32,32,99,2,0, 0,0,0,0,0,0,0,0,0,0,8,0,0,0,9,0, - 0,0,67,0,0,0,115,36,1,0,0,116,0,124,1,116, + 0,0,67,0,0,0,115,38,1,0,0,116,0,124,1,116, 1,131,2,115,28,100,1,100,0,108,2,125,2,124,2,160, 3,124,1,161,1,125,1,124,1,115,44,116,4,100,2,124, 1,100,3,141,2,130,1,116,5,114,60,124,1,160,6,116, 5,116,7,161,2,125,1,103,0,125,3,9,0,122,14,116, 8,160,9,124,1,161,1,125,4,87,0,110,70,4,0,116, - 10,116,11,102,2,121,150,1,0,1,0,1,0,116,8,160, - 12,124,1,161,1,92,2,125,5,125,6,124,5,124,1,107, - 2,114,132,116,4,100,5,124,1,100,3,141,2,130,1,124, - 5,125,1,124,3,160,13,124,6,161,1,1,0,89,0,110, - 28,119,0,124,4,106,14,100,6,64,0,100,7,107,3,114, + 10,116,11,102,2,144,1,121,36,1,0,1,0,1,0,116, + 8,160,12,124,1,161,1,92,2,125,5,125,6,124,5,124, + 1,107,2,114,134,116,4,100,5,124,1,100,3,141,2,130, + 1,124,5,125,1,124,3,160,13,124,6,161,1,1,0,89, + 0,110,26,124,4,106,14,100,6,64,0,100,7,107,3,114, 180,116,4,100,5,124,1,100,3,141,2,130,1,113,66,122, - 12,116,15,124,1,25,0,125,7,87,0,110,34,4,0,116, - 16,121,226,1,0,1,0,1,0,116,17,124,1,131,1,125, - 7,124,7,116,15,124,1,60,0,89,0,110,2,119,0,124, - 7,124,0,95,18,124,1,124,0,95,19,116,8,106,20,124, - 3,100,0,100,0,100,8,133,3,25,0,142,0,124,0,95, - 21,124,0,106,21,144,1,114,32,124,0,4,0,106,21,116, - 7,55,0,2,0,95,21,100,0,83,0,100,0,83,0,41, - 9,78,114,0,0,0,0,122,21,97,114,99,104,105,118,101, - 32,112,97,116,104,32,105,115,32,101,109,112,116,121,169,1, - 218,4,112,97,116,104,84,122,14,110,111,116,32,97,32,90, - 105,112,32,102,105,108,101,105,0,240,0,0,105,0,128,0, - 0,233,255,255,255,255,41,22,218,10,105,115,105,110,115,116, - 97,110,99,101,218,3,115,116,114,218,2,111,115,90,8,102, - 115,100,101,99,111,100,101,114,3,0,0,0,218,12,97,108, - 116,95,112,97,116,104,95,115,101,112,218,7,114,101,112,108, - 97,99,101,218,8,112,97,116,104,95,115,101,112,218,19,95, - 98,111,111,116,115,116,114,97,112,95,101,120,116,101,114,110, - 97,108,90,10,95,112,97,116,104,95,115,116,97,116,218,7, - 79,83,69,114,114,111,114,218,10,86,97,108,117,101,69,114, - 114,111,114,90,11,95,112,97,116,104,95,115,112,108,105,116, - 218,6,97,112,112,101,110,100,90,7,115,116,95,109,111,100, - 101,218,20,95,122,105,112,95,100,105,114,101,99,116,111,114, - 121,95,99,97,99,104,101,218,8,75,101,121,69,114,114,111, - 114,218,15,95,114,101,97,100,95,100,105,114,101,99,116,111, - 114,121,218,6,95,102,105,108,101,115,218,7,97,114,99,104, - 105,118,101,218,10,95,112,97,116,104,95,106,111,105,110,218, - 6,112,114,101,102,105,120,41,8,218,4,115,101,108,102,114, - 13,0,0,0,114,17,0,0,0,114,31,0,0,0,90,2, - 115,116,90,7,100,105,114,110,97,109,101,90,8,98,97,115, - 101,110,97,109,101,218,5,102,105,108,101,115,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,8,95,95,105, - 110,105,116,95,95,64,0,0,0,115,64,0,0,0,10,1, - 8,1,10,1,4,1,12,1,4,1,12,1,4,2,2,1, - 2,1,14,1,16,1,14,3,8,1,12,1,4,1,16,1, - 14,3,12,2,2,241,2,18,12,1,12,1,8,1,14,1, - 6,1,6,1,22,2,8,1,18,1,4,255,255,128,122,20, - 122,105,112,105,109,112,111,114,116,101,114,46,95,95,105,110, - 105,116,95,95,78,99,3,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,4,0,0,0,67,0,0,0,115,78, - 0,0,0,116,0,124,0,124,1,131,2,125,3,124,3,100, - 1,117,1,114,26,124,0,103,0,102,2,83,0,116,1,124, - 0,124,1,131,2,125,4,116,2,124,0,124,4,131,2,114, - 70,100,1,124,0,106,3,155,0,116,4,155,0,124,4,155, - 0,157,3,103,1,102,2,83,0,100,1,103,0,102,2,83, - 0,41,2,97,47,2,0,0,102,105,110,100,95,108,111,97, - 100,101,114,40,102,117,108,108,110,97,109,101,44,32,112,97, - 116,104,61,78,111,110,101,41,32,45,62,32,115,101,108,102, - 44,32,115,116,114,32,111,114,32,78,111,110,101,46,10,10, + 12,116,15,124,1,25,0,125,7,87,0,110,32,4,0,116, + 16,144,1,121,34,1,0,1,0,1,0,116,17,124,1,131, + 1,125,7,124,7,116,15,124,1,60,0,89,0,124,7,124, + 0,95,18,124,1,124,0,95,19,116,8,106,20,124,3,100, + 0,100,0,100,8,133,3,25,0,142,0,124,0,95,21,124, + 0,106,21,144,1,114,30,124,0,4,0,106,21,116,7,55, + 0,2,0,95,21,100,0,83,0,100,0,83,0,119,0,119, + 0,41,9,78,114,0,0,0,0,122,21,97,114,99,104,105, + 118,101,32,112,97,116,104,32,105,115,32,101,109,112,116,121, + 169,1,218,4,112,97,116,104,84,122,14,110,111,116,32,97, + 32,90,105,112,32,102,105,108,101,105,0,240,0,0,105,0, + 128,0,0,233,255,255,255,255,41,22,218,10,105,115,105,110, + 115,116,97,110,99,101,218,3,115,116,114,218,2,111,115,90, + 8,102,115,100,101,99,111,100,101,114,3,0,0,0,218,12, + 97,108,116,95,112,97,116,104,95,115,101,112,218,7,114,101, + 112,108,97,99,101,218,8,112,97,116,104,95,115,101,112,218, + 19,95,98,111,111,116,115,116,114,97,112,95,101,120,116,101, + 114,110,97,108,90,10,95,112,97,116,104,95,115,116,97,116, + 218,7,79,83,69,114,114,111,114,218,10,86,97,108,117,101, + 69,114,114,111,114,90,11,95,112,97,116,104,95,115,112,108, + 105,116,218,6,97,112,112,101,110,100,90,7,115,116,95,109, + 111,100,101,218,20,95,122,105,112,95,100,105,114,101,99,116, + 111,114,121,95,99,97,99,104,101,218,8,75,101,121,69,114, + 114,111,114,218,15,95,114,101,97,100,95,100,105,114,101,99, + 116,111,114,121,218,6,95,102,105,108,101,115,218,7,97,114, + 99,104,105,118,101,218,10,95,112,97,116,104,95,106,111,105, + 110,218,6,112,114,101,102,105,120,41,8,218,4,115,101,108, + 102,114,13,0,0,0,114,17,0,0,0,114,31,0,0,0, + 90,2,115,116,90,7,100,105,114,110,97,109,101,90,8,98, + 97,115,101,110,97,109,101,218,5,102,105,108,101,115,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,8,95, + 95,105,110,105,116,95,95,64,0,0,0,115,68,0,0,0, + 10,1,8,1,10,1,4,1,12,1,4,1,12,1,4,2, + 2,1,2,1,14,1,18,1,14,3,8,1,12,1,4,1, + 14,1,14,3,12,2,2,241,2,18,12,1,14,1,8,1, + 10,1,6,1,6,1,22,2,8,1,18,1,4,255,2,249, + 2,239,255,128,122,20,122,105,112,105,109,112,111,114,116,101, + 114,46,95,95,105,110,105,116,95,95,78,99,3,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0, + 67,0,0,0,115,78,0,0,0,116,0,124,0,124,1,131, + 2,125,3,124,3,100,1,117,1,114,26,124,0,103,0,102, + 2,83,0,116,1,124,0,124,1,131,2,125,4,116,2,124, + 0,124,4,131,2,114,70,100,1,124,0,106,3,155,0,116, + 4,155,0,124,4,155,0,157,3,103,1,102,2,83,0,100, + 1,103,0,102,2,83,0,41,2,97,47,2,0,0,102,105, + 110,100,95,108,111,97,100,101,114,40,102,117,108,108,110,97, + 109,101,44,32,112,97,116,104,61,78,111,110,101,41,32,45, + 62,32,115,101,108,102,44,32,115,116,114,32,111,114,32,78, + 111,110,101,46,10,10,32,32,32,32,32,32,32,32,83,101, + 97,114,99,104,32,102,111,114,32,97,32,109,111,100,117,108, + 101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,39, + 102,117,108,108,110,97,109,101,39,46,32,39,102,117,108,108, + 110,97,109,101,39,32,109,117,115,116,32,98,101,32,116,104, + 101,10,32,32,32,32,32,32,32,32,102,117,108,108,121,32, + 113,117,97,108,105,102,105,101,100,32,40,100,111,116,116,101, + 100,41,32,109,111,100,117,108,101,32,110,97,109,101,46,32, + 73,116,32,114,101,116,117,114,110,115,32,116,104,101,32,122, + 105,112,105,109,112,111,114,116,101,114,10,32,32,32,32,32, + 32,32,32,105,110,115,116,97,110,99,101,32,105,116,115,101, + 108,102,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,119,97,115,32,102,111,117,110,100,44,32,97,32,115,116, + 114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32, + 116,104,101,10,32,32,32,32,32,32,32,32,102,117,108,108, + 32,112,97,116,104,32,110,97,109,101,32,105,102,32,105,116, + 39,115,32,112,111,115,115,105,98,108,121,32,97,32,112,111, + 114,116,105,111,110,32,111,102,32,97,32,110,97,109,101,115, + 112,97,99,101,32,112,97,99,107,97,103,101,44,10,32,32, + 32,32,32,32,32,32,111,114,32,78,111,110,101,32,111,116, + 104,101,114,119,105,115,101,46,32,84,104,101,32,111,112,116, + 105,111,110,97,108,32,39,112,97,116,104,39,32,97,114,103, + 117,109,101,110,116,32,105,115,32,105,103,110,111,114,101,100, + 32,45,45,32,105,116,39,115,10,32,32,32,32,32,32,32, + 32,116,104,101,114,101,32,102,111,114,32,99,111,109,112,97, + 116,105,98,105,108,105,116,121,32,119,105,116,104,32,116,104, + 101,32,105,109,112,111,114,116,101,114,32,112,114,111,116,111, + 99,111,108,46,10,10,32,32,32,32,32,32,32,32,68,101, + 112,114,101,99,97,116,101,100,32,115,105,110,99,101,32,80, + 121,116,104,111,110,32,51,46,49,48,46,32,85,115,101,32, + 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, + 101,97,100,46,10,32,32,32,32,32,32,32,32,78,41,5, + 218,16,95,103,101,116,95,109,111,100,117,108,101,95,105,110, + 102,111,218,16,95,103,101,116,95,109,111,100,117,108,101,95, + 112,97,116,104,218,7,95,105,115,95,100,105,114,114,29,0, + 0,0,114,20,0,0,0,41,5,114,32,0,0,0,218,8, + 102,117,108,108,110,97,109,101,114,13,0,0,0,218,2,109, + 105,218,7,109,111,100,112,97,116,104,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,11,102,105,110,100,95, + 108,111,97,100,101,114,110,0,0,0,115,16,0,0,0,10, + 12,8,1,8,2,10,7,10,1,24,4,8,2,255,128,122, + 23,122,105,112,105,109,112,111,114,116,101,114,46,102,105,110, + 100,95,108,111,97,100,101,114,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, + 0,115,16,0,0,0,124,0,160,0,124,1,124,2,161,2, + 100,1,25,0,83,0,41,3,97,203,1,0,0,102,105,110, + 100,95,109,111,100,117,108,101,40,102,117,108,108,110,97,109, + 101,44,32,112,97,116,104,61,78,111,110,101,41,32,45,62, + 32,115,101,108,102,32,111,114,32,78,111,110,101,46,10,10, 32,32,32,32,32,32,32,32,83,101,97,114,99,104,32,102, 111,114,32,97,32,109,111,100,117,108,101,32,115,112,101,99, 105,102,105,101,100,32,98,121,32,39,102,117,108,108,110,97, @@ -190,785 +239,739 @@ const unsigned char _Py_M__zipimport[] = { 114,116,101,114,10,32,32,32,32,32,32,32,32,105,110,115, 116,97,110,99,101,32,105,116,115,101,108,102,32,105,102,32, 116,104,101,32,109,111,100,117,108,101,32,119,97,115,32,102, - 111,117,110,100,44,32,97,32,115,116,114,105,110,103,32,99, - 111,110,116,97,105,110,105,110,103,32,116,104,101,10,32,32, - 32,32,32,32,32,32,102,117,108,108,32,112,97,116,104,32, - 110,97,109,101,32,105,102,32,105,116,39,115,32,112,111,115, - 115,105,98,108,121,32,97,32,112,111,114,116,105,111,110,32, - 111,102,32,97,32,110,97,109,101,115,112,97,99,101,32,112, - 97,99,107,97,103,101,44,10,32,32,32,32,32,32,32,32, - 111,114,32,78,111,110,101,32,111,116,104,101,114,119,105,115, - 101,46,32,84,104,101,32,111,112,116,105,111,110,97,108,32, - 39,112,97,116,104,39,32,97,114,103,117,109,101,110,116,32, - 105,115,32,105,103,110,111,114,101,100,32,45,45,32,105,116, - 39,115,10,32,32,32,32,32,32,32,32,116,104,101,114,101, - 32,102,111,114,32,99,111,109,112,97,116,105,98,105,108,105, - 116,121,32,119,105,116,104,32,116,104,101,32,105,109,112,111, - 114,116,101,114,32,112,114,111,116,111,99,111,108,46,10,10, - 32,32,32,32,32,32,32,32,68,101,112,114,101,99,97,116, - 101,100,32,115,105,110,99,101,32,80,121,116,104,111,110,32, - 51,46,49,48,46,32,85,115,101,32,102,105,110,100,95,115, - 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,32, - 32,32,32,32,32,32,32,78,41,5,218,16,95,103,101,116, - 95,109,111,100,117,108,101,95,105,110,102,111,218,16,95,103, - 101,116,95,109,111,100,117,108,101,95,112,97,116,104,218,7, - 95,105,115,95,100,105,114,114,29,0,0,0,114,20,0,0, - 0,41,5,114,32,0,0,0,218,8,102,117,108,108,110,97, - 109,101,114,13,0,0,0,218,2,109,105,218,7,109,111,100, - 112,97,116,104,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,11,102,105,110,100,95,108,111,97,100,101,114, - 110,0,0,0,115,16,0,0,0,10,12,8,1,8,2,10, - 7,10,1,24,4,8,2,255,128,122,23,122,105,112,105,109, - 112,111,114,116,101,114,46,102,105,110,100,95,108,111,97,100, - 101,114,99,3,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,4,0,0,0,67,0,0,0,115,16,0,0,0, - 124,0,160,0,124,1,124,2,161,2,100,1,25,0,83,0, - 41,3,97,203,1,0,0,102,105,110,100,95,109,111,100,117, - 108,101,40,102,117,108,108,110,97,109,101,44,32,112,97,116, - 104,61,78,111,110,101,41,32,45,62,32,115,101,108,102,32, - 111,114,32,78,111,110,101,46,10,10,32,32,32,32,32,32, - 32,32,83,101,97,114,99,104,32,102,111,114,32,97,32,109, - 111,100,117,108,101,32,115,112,101,99,105,102,105,101,100,32, - 98,121,32,39,102,117,108,108,110,97,109,101,39,46,32,39, - 102,117,108,108,110,97,109,101,39,32,109,117,115,116,32,98, - 101,32,116,104,101,10,32,32,32,32,32,32,32,32,102,117, - 108,108,121,32,113,117,97,108,105,102,105,101,100,32,40,100, - 111,116,116,101,100,41,32,109,111,100,117,108,101,32,110,97, - 109,101,46,32,73,116,32,114,101,116,117,114,110,115,32,116, - 104,101,32,122,105,112,105,109,112,111,114,116,101,114,10,32, - 32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,32, - 105,116,115,101,108,102,32,105,102,32,116,104,101,32,109,111, - 100,117,108,101,32,119,97,115,32,102,111,117,110,100,44,32, - 111,114,32,78,111,110,101,32,105,102,32,105,116,32,119,97, - 115,110,39,116,46,10,32,32,32,32,32,32,32,32,84,104, - 101,32,111,112,116,105,111,110,97,108,32,39,112,97,116,104, - 39,32,97,114,103,117,109,101,110,116,32,105,115,32,105,103, - 110,111,114,101,100,32,45,45,32,105,116,39,115,32,116,104, - 101,114,101,32,102,111,114,32,99,111,109,112,97,116,105,98, - 105,108,105,116,121,10,32,32,32,32,32,32,32,32,119,105, - 116,104,32,116,104,101,32,105,109,112,111,114,116,101,114,32, - 112,114,111,116,111,99,111,108,46,10,10,32,32,32,32,32, - 32,32,32,68,101,112,114,101,99,97,116,101,100,32,115,105, - 110,99,101,32,80,121,116,104,111,110,32,51,46,49,48,46, - 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, - 32,105,110,115,116,101,97,100,46,10,32,32,32,32,32,32, - 32,32,114,0,0,0,0,78,41,1,114,41,0,0,0,41, - 3,114,32,0,0,0,114,38,0,0,0,114,13,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 11,102,105,110,100,95,109,111,100,117,108,101,144,0,0,0, - 115,4,0,0,0,16,11,255,128,122,23,122,105,112,105,109, - 112,111,114,116,101,114,46,102,105,110,100,95,109,111,100,117, - 108,101,99,3,0,0,0,0,0,0,0,0,0,0,0,7, - 0,0,0,5,0,0,0,67,0,0,0,115,108,0,0,0, - 116,0,124,0,124,1,131,2,125,3,124,3,100,1,117,1, - 114,34,116,1,106,2,124,1,124,0,124,3,100,2,141,3, - 83,0,116,3,124,0,124,1,131,2,125,4,116,4,124,0, - 124,4,131,2,114,104,124,0,106,5,155,0,116,6,155,0, - 124,4,155,0,157,3,125,5,116,1,106,7,124,1,100,1, - 100,3,100,4,141,3,125,6,124,6,106,8,160,9,124,5, - 161,1,1,0,124,6,83,0,100,1,83,0,41,5,122,107, - 67,114,101,97,116,101,32,97,32,77,111,100,117,108,101,83, - 112,101,99,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,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,115,32,78, - 111,110,101,32,105,102,32,116,104,101,32,109,111,100,117,108, - 101,32,99,97,110,110,111,116,32,98,101,32,102,111,117,110, - 100,46,10,32,32,32,32,32,32,32,32,78,41,1,218,10, - 105,115,95,112,97,99,107,97,103,101,84,41,3,218,4,110, - 97,109,101,90,6,108,111,97,100,101,114,114,43,0,0,0, - 41,10,114,35,0,0,0,218,10,95,98,111,111,116,115,116, - 114,97,112,90,16,115,112,101,99,95,102,114,111,109,95,108, - 111,97,100,101,114,114,36,0,0,0,114,37,0,0,0,114, - 29,0,0,0,114,20,0,0,0,90,10,77,111,100,117,108, - 101,83,112,101,99,90,26,115,117,98,109,111,100,117,108,101, - 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, - 115,114,24,0,0,0,41,7,114,32,0,0,0,114,38,0, - 0,0,90,6,116,97,114,103,101,116,90,11,109,111,100,117, - 108,101,95,105,110,102,111,114,40,0,0,0,114,13,0,0, - 0,90,4,115,112,101,99,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,9,102,105,110,100,95,115,112,101, - 99,157,0,0,0,115,26,0,0,0,10,5,8,1,16,1, - 10,7,10,1,18,4,8,1,2,1,6,255,12,2,4,1, - 4,2,255,128,122,21,122,105,112,105,109,112,111,114,116,101, - 114,46,102,105,110,100,95,115,112,101,99,99,2,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0, - 67,0,0,0,115,20,0,0,0,116,0,124,0,124,1,131, - 2,92,3,125,2,125,3,125,4,124,2,83,0,41,2,122, - 166,103,101,116,95,99,111,100,101,40,102,117,108,108,110,97, - 109,101,41,32,45,62,32,99,111,100,101,32,111,98,106,101, - 99,116,46,10,10,32,32,32,32,32,32,32,32,82,101,116, - 117,114,110,32,116,104,101,32,99,111,100,101,32,111,98,106, - 101,99,116,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,46,32,82,97, - 105,115,101,32,90,105,112,73,109,112,111,114,116,69,114,114, - 111,114,10,32,32,32,32,32,32,32,32,105,102,32,116,104, - 101,32,109,111,100,117,108,101,32,99,111,117,108,100,110,39, - 116,32,98,101,32,105,109,112,111,114,116,101,100,46,10,32, - 32,32,32,32,32,32,32,78,169,1,218,16,95,103,101,116, - 95,109,111,100,117,108,101,95,99,111,100,101,169,5,114,32, - 0,0,0,114,38,0,0,0,218,4,99,111,100,101,218,9, - 105,115,112,97,99,107,97,103,101,114,40,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,8,103, - 101,116,95,99,111,100,101,184,0,0,0,115,6,0,0,0, - 16,6,4,1,255,128,122,20,122,105,112,105,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,0,0,0,0,4,0,0,0,8,0,0, - 0,67,0,0,0,115,112,0,0,0,116,0,114,16,124,1, - 160,1,116,0,116,2,161,2,125,1,124,1,125,2,124,1, - 160,3,124,0,106,4,116,2,23,0,161,1,114,58,124,1, - 116,5,124,0,106,4,116,2,23,0,131,1,100,1,133,2, - 25,0,125,2,122,14,124,0,106,6,124,2,25,0,125,3, - 87,0,110,26,4,0,116,7,121,98,1,0,1,0,1,0, - 116,8,100,2,100,3,124,2,131,3,130,1,119,0,116,9, - 124,0,106,4,124,3,131,2,83,0,41,4,122,154,103,101, - 116,95,100,97,116,97,40,112,97,116,104,110,97,109,101,41, - 32,45,62,32,115,116,114,105,110,103,32,119,105,116,104,32, - 102,105,108,101,32,100,97,116,97,46,10,10,32,32,32,32, - 32,32,32,32,82,101,116,117,114,110,32,116,104,101,32,100, - 97,116,97,32,97,115,115,111,99,105,97,116,101,100,32,119, - 105,116,104,32,39,112,97,116,104,110,97,109,101,39,46,32, - 82,97,105,115,101,32,79,83,69,114,114,111,114,32,105,102, - 10,32,32,32,32,32,32,32,32,116,104,101,32,102,105,108, - 101,32,119,97,115,110,39,116,32,102,111,117,110,100,46,10, - 32,32,32,32,32,32,32,32,78,114,0,0,0,0,218,0, - 41,10,114,18,0,0,0,114,19,0,0,0,114,20,0,0, - 0,218,10,115,116,97,114,116,115,119,105,116,104,114,29,0, - 0,0,218,3,108,101,110,114,28,0,0,0,114,26,0,0, - 0,114,22,0,0,0,218,9,95,103,101,116,95,100,97,116, - 97,41,4,114,32,0,0,0,218,8,112,97,116,104,110,97, - 109,101,90,3,107,101,121,218,9,116,111,99,95,101,110,116, - 114,121,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,8,103,101,116,95,100,97,116,97,194,0,0,0,115, - 22,0,0,0,4,6,12,1,4,2,16,1,22,1,2,2, - 14,1,12,1,14,1,12,1,255,128,122,20,122,105,112,105, - 109,112,111,114,116,101,114,46,103,101,116,95,100,97,116,97, - 99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,3,0,0,0,67,0,0,0,115,20,0,0,0,116,0, - 124,0,124,1,131,2,92,3,125,2,125,3,125,4,124,4, - 83,0,41,2,122,165,103,101,116,95,102,105,108,101,110,97, - 109,101,40,102,117,108,108,110,97,109,101,41,32,45,62,32, - 102,105,108,101,110,97,109,101,32,115,116,114,105,110,103,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 32,116,104,101,32,102,105,108,101,110,97,109,101,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,111,114,32,114,97,105,115,101,32, - 90,105,112,73,109,112,111,114,116,69,114,114,111,114,10,32, - 32,32,32,32,32,32,32,105,102,32,105,116,32,99,111,117, - 108,100,110,39,116,32,98,101,32,105,109,112,111,114,116,101, - 100,46,10,32,32,32,32,32,32,32,32,78,114,47,0,0, - 0,114,49,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,12,103,101,116,95,102,105,108,101,110, - 97,109,101,215,0,0,0,115,6,0,0,0,16,8,4,1, - 255,128,122,24,122,105,112,105,109,112,111,114,116,101,114,46, - 103,101,116,95,102,105,108,101,110,97,109,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,8,0,0, - 0,67,0,0,0,115,126,0,0,0,116,0,124,0,124,1, - 131,2,125,2,124,2,100,1,117,0,114,36,116,1,100,2, - 124,1,155,2,157,2,124,1,100,3,141,2,130,1,116,2, - 124,0,124,1,131,2,125,3,124,2,114,64,116,3,160,4, - 124,3,100,4,161,2,125,4,110,10,124,3,155,0,100,5, - 157,2,125,4,122,14,124,0,106,5,124,4,25,0,125,5, - 87,0,110,20,4,0,116,6,121,108,1,0,1,0,1,0, - 89,0,100,1,83,0,119,0,116,7,124,0,106,8,124,5, - 131,2,160,9,161,0,83,0,41,6,122,253,103,101,116,95, - 115,111,117,114,99,101,40,102,117,108,108,110,97,109,101,41, - 32,45,62,32,115,111,117,114,99,101,32,115,116,114,105,110, - 103,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, - 114,110,32,116,104,101,32,115,111,117,114,99,101,32,99,111, - 100,101,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,46,32,82,97,105, - 115,101,32,90,105,112,73,109,112,111,114,116,69,114,114,111, - 114,10,32,32,32,32,32,32,32,32,105,102,32,116,104,101, - 32,109,111,100,117,108,101,32,99,111,117,108,100,110,39,116, - 32,98,101,32,102,111,117,110,100,44,32,114,101,116,117,114, - 110,32,78,111,110,101,32,105,102,32,116,104,101,32,97,114, - 99,104,105,118,101,32,100,111,101,115,10,32,32,32,32,32, - 32,32,32,99,111,110,116,97,105,110,32,116,104,101,32,109, - 111,100,117,108,101,44,32,98,117,116,32,104,97,115,32,110, - 111,32,115,111,117,114,99,101,32,102,111,114,32,105,116,46, - 10,32,32,32,32,32,32,32,32,78,250,18,99,97,110,39, - 116,32,102,105,110,100,32,109,111,100,117,108,101,32,169,1, - 114,44,0,0,0,250,11,95,95,105,110,105,116,95,95,46, - 112,121,250,3,46,112,121,41,10,114,35,0,0,0,114,3, - 0,0,0,114,36,0,0,0,114,21,0,0,0,114,30,0, - 0,0,114,28,0,0,0,114,26,0,0,0,114,56,0,0, - 0,114,29,0,0,0,218,6,100,101,99,111,100,101,41,6, - 114,32,0,0,0,114,38,0,0,0,114,39,0,0,0,114, - 13,0,0,0,218,8,102,117,108,108,112,97,116,104,114,58, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,10,103,101,116,95,115,111,117,114,99,101,227,0, - 0,0,115,26,0,0,0,10,7,8,1,18,1,10,2,4, - 1,14,1,10,2,2,2,14,1,12,1,8,2,16,1,255, - 128,122,22,122,105,112,105,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,0,0,0,0,3,0,0,0,4,0,0,0,67,0, - 0,0,115,40,0,0,0,116,0,124,0,124,1,131,2,125, - 2,124,2,100,1,117,0,114,36,116,1,100,2,124,1,155, - 2,157,2,124,1,100,3,141,2,130,1,124,2,83,0,41, - 4,122,171,105,115,95,112,97,99,107,97,103,101,40,102,117, - 108,108,110,97,109,101,41,32,45,62,32,98,111,111,108,46, + 111,117,110,100,44,32,111,114,32,78,111,110,101,32,105,102, + 32,105,116,32,119,97,115,110,39,116,46,10,32,32,32,32, + 32,32,32,32,84,104,101,32,111,112,116,105,111,110,97,108, + 32,39,112,97,116,104,39,32,97,114,103,117,109,101,110,116, + 32,105,115,32,105,103,110,111,114,101,100,32,45,45,32,105, + 116,39,115,32,116,104,101,114,101,32,102,111,114,32,99,111, + 109,112,97,116,105,98,105,108,105,116,121,10,32,32,32,32, + 32,32,32,32,119,105,116,104,32,116,104,101,32,105,109,112, + 111,114,116,101,114,32,112,114,111,116,111,99,111,108,46,10, + 10,32,32,32,32,32,32,32,32,68,101,112,114,101,99,97, + 116,101,100,32,115,105,110,99,101,32,80,121,116,104,111,110, + 32,51,46,49,48,46,32,85,115,101,32,102,105,110,100,95, + 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, + 32,32,32,32,32,32,32,32,114,0,0,0,0,78,41,1, + 114,41,0,0,0,41,3,114,32,0,0,0,114,38,0,0, + 0,114,13,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,11,102,105,110,100,95,109,111,100,117, + 108,101,144,0,0,0,115,4,0,0,0,16,11,255,128,122, + 23,122,105,112,105,109,112,111,114,116,101,114,46,102,105,110, + 100,95,109,111,100,117,108,101,99,3,0,0,0,0,0,0, + 0,0,0,0,0,7,0,0,0,5,0,0,0,67,0,0, + 0,115,108,0,0,0,116,0,124,0,124,1,131,2,125,3, + 124,3,100,1,117,1,114,34,116,1,106,2,124,1,124,0, + 124,3,100,2,141,3,83,0,116,3,124,0,124,1,131,2, + 125,4,116,4,124,0,124,4,131,2,114,104,124,0,106,5, + 155,0,116,6,155,0,124,4,155,0,157,3,125,5,116,1, + 106,7,124,1,100,1,100,3,100,4,141,3,125,6,124,6, + 106,8,160,9,124,5,161,1,1,0,124,6,83,0,100,1, + 83,0,41,5,122,107,67,114,101,97,116,101,32,97,32,77, + 111,100,117,108,101,83,112,101,99,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,46,10,10,32,32,32,32,32,32,32,32,82,101,116, + 117,114,110,115,32,78,111,110,101,32,105,102,32,116,104,101, + 32,109,111,100,117,108,101,32,99,97,110,110,111,116,32,98, + 101,32,102,111,117,110,100,46,10,32,32,32,32,32,32,32, + 32,78,41,1,218,10,105,115,95,112,97,99,107,97,103,101, + 84,41,3,218,4,110,97,109,101,90,6,108,111,97,100,101, + 114,114,43,0,0,0,41,10,114,35,0,0,0,218,10,95, + 98,111,111,116,115,116,114,97,112,90,16,115,112,101,99,95, + 102,114,111,109,95,108,111,97,100,101,114,114,36,0,0,0, + 114,37,0,0,0,114,29,0,0,0,114,20,0,0,0,90, + 10,77,111,100,117,108,101,83,112,101,99,90,26,115,117,98, + 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, + 99,97,116,105,111,110,115,114,24,0,0,0,41,7,114,32, + 0,0,0,114,38,0,0,0,90,6,116,97,114,103,101,116, + 90,11,109,111,100,117,108,101,95,105,110,102,111,114,40,0, + 0,0,114,13,0,0,0,90,4,115,112,101,99,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,9,102,105, + 110,100,95,115,112,101,99,157,0,0,0,115,26,0,0,0, + 10,5,8,1,16,1,10,7,10,1,18,4,8,1,2,1, + 6,255,12,2,4,1,4,2,255,128,122,21,122,105,112,105, + 109,112,111,114,116,101,114,46,102,105,110,100,95,115,112,101, + 99,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,3,0,0,0,67,0,0,0,115,20,0,0,0,116, + 0,124,0,124,1,131,2,92,3,125,2,125,3,125,4,124, + 2,83,0,41,2,122,166,103,101,116,95,99,111,100,101,40, + 102,117,108,108,110,97,109,101,41,32,45,62,32,99,111,100, + 101,32,111,98,106,101,99,116,46,10,10,32,32,32,32,32, + 32,32,32,82,101,116,117,114,110,32,116,104,101,32,99,111, + 100,101,32,111,98,106,101,99,116,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,46,32,82,97,105,115,101,32,90,105,112,73,109,112, + 111,114,116,69,114,114,111,114,10,32,32,32,32,32,32,32, + 32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,99, + 111,117,108,100,110,39,116,32,98,101,32,105,109,112,111,114, + 116,101,100,46,10,32,32,32,32,32,32,32,32,78,169,1, + 218,16,95,103,101,116,95,109,111,100,117,108,101,95,99,111, + 100,101,169,5,114,32,0,0,0,114,38,0,0,0,218,4, + 99,111,100,101,218,9,105,115,112,97,99,107,97,103,101,114, + 40,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,8,103,101,116,95,99,111,100,101,184,0,0, + 0,115,6,0,0,0,16,6,4,1,255,128,122,20,122,105, + 112,105,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,0,0,0,0,4, + 0,0,0,8,0,0,0,67,0,0,0,115,112,0,0,0, + 116,0,114,16,124,1,160,1,116,0,116,2,161,2,125,1, + 124,1,125,2,124,1,160,3,124,0,106,4,116,2,23,0, + 161,1,114,58,124,1,116,5,124,0,106,4,116,2,23,0, + 131,1,100,1,133,2,25,0,125,2,122,14,124,0,106,6, + 124,2,25,0,125,3,87,0,110,24,4,0,116,7,121,110, + 1,0,1,0,1,0,116,8,100,2,100,3,124,2,131,3, + 130,1,116,9,124,0,106,4,124,3,131,2,83,0,119,0, + 41,4,122,154,103,101,116,95,100,97,116,97,40,112,97,116, + 104,110,97,109,101,41,32,45,62,32,115,116,114,105,110,103, + 32,119,105,116,104,32,102,105,108,101,32,100,97,116,97,46, 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 32,84,114,117,101,32,105,102,32,116,104,101,32,109,111,100, - 117,108,101,32,115,112,101,99,105,102,105,101,100,32,98,121, - 32,102,117,108,108,110,97,109,101,32,105,115,32,97,32,112, - 97,99,107,97,103,101,46,10,32,32,32,32,32,32,32,32, - 82,97,105,115,101,32,90,105,112,73,109,112,111,114,116,69, - 114,114,111,114,32,105,102,32,116,104,101,32,109,111,100,117, - 108,101,32,99,111,117,108,100,110,39,116,32,98,101,32,102, + 32,116,104,101,32,100,97,116,97,32,97,115,115,111,99,105, + 97,116,101,100,32,119,105,116,104,32,39,112,97,116,104,110, + 97,109,101,39,46,32,82,97,105,115,101,32,79,83,69,114, + 114,111,114,32,105,102,10,32,32,32,32,32,32,32,32,116, + 104,101,32,102,105,108,101,32,119,97,115,110,39,116,32,102, 111,117,110,100,46,10,32,32,32,32,32,32,32,32,78,114, - 61,0,0,0,114,62,0,0,0,41,2,114,35,0,0,0, - 114,3,0,0,0,41,3,114,32,0,0,0,114,38,0,0, - 0,114,39,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,114,43,0,0,0,253,0,0,0,115,10, - 0,0,0,10,6,8,1,18,1,4,1,255,128,122,22,122, - 105,112,105,109,112,111,114,116,101,114,46,105,115,95,112,97, - 99,107,97,103,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,9,0,0,0,8,0,0,0,67,0,0,0,115,252, - 0,0,0,100,1,125,2,116,0,160,1,124,2,116,2,161, - 2,1,0,116,3,124,0,124,1,131,2,92,3,125,3,125, - 4,125,5,116,4,106,5,160,6,124,1,161,1,125,6,124, - 6,100,2,117,0,115,62,116,7,124,6,116,8,131,2,115, - 80,116,8,124,1,131,1,125,6,124,6,116,4,106,5,124, - 1,60,0,124,0,124,6,95,9,122,84,124,4,114,124,116, - 10,124,0,124,1,131,2,125,7,116,11,160,12,124,0,106, - 13,124,7,161,2,125,8,124,8,103,1,124,6,95,14,116, - 15,124,6,100,3,131,2,115,140,116,16,124,6,95,16,116, - 11,160,17,124,6,106,18,124,1,124,5,161,3,1,0,116, - 19,124,3,124,6,106,18,131,2,1,0,87,0,110,16,1, - 0,1,0,1,0,116,4,106,5,124,1,61,0,130,0,122, - 14,116,4,106,5,124,1,25,0,125,6,87,0,110,30,4, - 0,116,20,121,232,1,0,1,0,1,0,116,21,100,4,124, - 1,155,2,100,5,157,3,131,1,130,1,119,0,116,22,160, - 23,100,6,124,1,124,5,161,3,1,0,124,6,83,0,41, - 7,97,64,1,0,0,108,111,97,100,95,109,111,100,117,108, - 101,40,102,117,108,108,110,97,109,101,41,32,45,62,32,109, - 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, - 76,111,97,100,32,116,104,101,32,109,111,100,117,108,101,32, - 115,112,101,99,105,102,105,101,100,32,98,121,32,39,102,117, - 108,108,110,97,109,101,39,46,32,39,102,117,108,108,110,97, - 109,101,39,32,109,117,115,116,32,98,101,32,116,104,101,10, - 32,32,32,32,32,32,32,32,102,117,108,108,121,32,113,117, - 97,108,105,102,105,101,100,32,40,100,111,116,116,101,100,41, - 32,109,111,100,117,108,101,32,110,97,109,101,46,32,73,116, - 32,114,101,116,117,114,110,115,32,116,104,101,32,105,109,112, - 111,114,116,101,100,10,32,32,32,32,32,32,32,32,109,111, - 100,117,108,101,44,32,111,114,32,114,97,105,115,101,115,32, + 0,0,0,0,218,0,41,10,114,18,0,0,0,114,19,0, + 0,0,114,20,0,0,0,218,10,115,116,97,114,116,115,119, + 105,116,104,114,29,0,0,0,218,3,108,101,110,114,28,0, + 0,0,114,26,0,0,0,114,22,0,0,0,218,9,95,103, + 101,116,95,100,97,116,97,41,4,114,32,0,0,0,218,8, + 112,97,116,104,110,97,109,101,90,3,107,101,121,218,9,116, + 111,99,95,101,110,116,114,121,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,8,103,101,116,95,100,97,116, + 97,194,0,0,0,115,24,0,0,0,4,6,12,1,4,2, + 16,1,22,1,2,2,14,1,12,1,12,1,12,1,2,254, + 255,128,122,20,122,105,112,105,109,112,111,114,116,101,114,46, + 103,101,116,95,100,97,116,97,99,2,0,0,0,0,0,0, + 0,0,0,0,0,5,0,0,0,3,0,0,0,67,0,0, + 0,115,20,0,0,0,116,0,124,0,124,1,131,2,92,3, + 125,2,125,3,125,4,124,4,83,0,41,2,122,165,103,101, + 116,95,102,105,108,101,110,97,109,101,40,102,117,108,108,110, + 97,109,101,41,32,45,62,32,102,105,108,101,110,97,109,101, + 32,115,116,114,105,110,103,46,10,10,32,32,32,32,32,32, + 32,32,82,101,116,117,114,110,32,116,104,101,32,102,105,108, + 101,110,97,109,101,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,111, + 114,32,114,97,105,115,101,32,90,105,112,73,109,112,111,114, + 116,69,114,114,111,114,10,32,32,32,32,32,32,32,32,105, + 102,32,105,116,32,99,111,117,108,100,110,39,116,32,98,101, + 32,105,109,112,111,114,116,101,100,46,10,32,32,32,32,32, + 32,32,32,78,114,47,0,0,0,114,49,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,12,103, + 101,116,95,102,105,108,101,110,97,109,101,215,0,0,0,115, + 6,0,0,0,16,8,4,1,255,128,122,24,122,105,112,105, + 109,112,111,114,116,101,114,46,103,101,116,95,102,105,108,101, + 110,97,109,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,6,0,0,0,8,0,0,0,67,0,0,0,115,126,0, + 0,0,116,0,124,0,124,1,131,2,125,2,124,2,100,1, + 117,0,114,36,116,1,100,2,124,1,155,2,157,2,124,1, + 100,3,141,2,130,1,116,2,124,0,124,1,131,2,125,3, + 124,2,114,64,116,3,160,4,124,3,100,4,161,2,125,4, + 110,10,124,3,155,0,100,5,157,2,125,4,122,14,124,0, + 106,5,124,4,25,0,125,5,87,0,110,18,4,0,116,6, + 121,124,1,0,1,0,1,0,89,0,100,1,83,0,116,7, + 124,0,106,8,124,5,131,2,160,9,161,0,83,0,119,0, + 41,6,122,253,103,101,116,95,115,111,117,114,99,101,40,102, + 117,108,108,110,97,109,101,41,32,45,62,32,115,111,117,114, + 99,101,32,115,116,114,105,110,103,46,10,10,32,32,32,32, + 32,32,32,32,82,101,116,117,114,110,32,116,104,101,32,115, + 111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32,90,105,112,73,109, + 112,111,114,116,69,114,114,111,114,10,32,32,32,32,32,32, + 32,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32, + 99,111,117,108,100,110,39,116,32,98,101,32,102,111,117,110, + 100,44,32,114,101,116,117,114,110,32,78,111,110,101,32,105, + 102,32,116,104,101,32,97,114,99,104,105,118,101,32,100,111, + 101,115,10,32,32,32,32,32,32,32,32,99,111,110,116,97, + 105,110,32,116,104,101,32,109,111,100,117,108,101,44,32,98, + 117,116,32,104,97,115,32,110,111,32,115,111,117,114,99,101, + 32,102,111,114,32,105,116,46,10,32,32,32,32,32,32,32, + 32,78,250,18,99,97,110,39,116,32,102,105,110,100,32,109, + 111,100,117,108,101,32,169,1,114,44,0,0,0,250,11,95, + 95,105,110,105,116,95,95,46,112,121,250,3,46,112,121,41, + 10,114,35,0,0,0,114,3,0,0,0,114,36,0,0,0, + 114,21,0,0,0,114,30,0,0,0,114,28,0,0,0,114, + 26,0,0,0,114,56,0,0,0,114,29,0,0,0,218,6, + 100,101,99,111,100,101,41,6,114,32,0,0,0,114,38,0, + 0,0,114,39,0,0,0,114,13,0,0,0,218,8,102,117, + 108,108,112,97,116,104,114,58,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,10,103,101,116,95, + 115,111,117,114,99,101,227,0,0,0,115,28,0,0,0,10, + 7,8,1,18,1,10,2,4,1,14,1,10,2,2,2,14, + 1,12,1,6,2,16,1,2,253,255,128,122,22,122,105,112, + 105,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,0,0,0,0, + 3,0,0,0,4,0,0,0,67,0,0,0,115,40,0,0, + 0,116,0,124,0,124,1,131,2,125,2,124,2,100,1,117, + 0,114,36,116,1,100,2,124,1,155,2,157,2,124,1,100, + 3,141,2,130,1,124,2,83,0,41,4,122,171,105,115,95, + 112,97,99,107,97,103,101,40,102,117,108,108,110,97,109,101, + 41,32,45,62,32,98,111,111,108,46,10,10,32,32,32,32, + 32,32,32,32,82,101,116,117,114,110,32,84,114,117,101,32, + 105,102,32,116,104,101,32,109,111,100,117,108,101,32,115,112, + 101,99,105,102,105,101,100,32,98,121,32,102,117,108,108,110, + 97,109,101,32,105,115,32,97,32,112,97,99,107,97,103,101, + 46,10,32,32,32,32,32,32,32,32,82,97,105,115,101,32, 90,105,112,73,109,112,111,114,116,69,114,114,111,114,32,105, - 102,32,105,116,32,99,111,117,108,100,32,110,111,116,32,98, - 101,32,105,109,112,111,114,116,101,100,46,10,10,32,32,32, - 32,32,32,32,32,68,101,112,114,101,99,97,116,101,100,32, - 115,105,110,99,101,32,80,121,116,104,111,110,32,51,46,49, - 48,46,32,85,115,101,32,101,120,101,99,95,109,111,100,117, - 108,101,40,41,32,105,110,115,116,101,97,100,46,10,32,32, - 32,32,32,32,32,32,122,114,122,105,112,105,109,112,111,114, - 116,46,122,105,112,105,109,112,111,114,116,101,114,46,108,111, - 97,100,95,109,111,100,117,108,101,40,41,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,32,97,110,100,32,115,108, - 97,116,101,100,32,102,111,114,32,114,101,109,111,118,97,108, - 32,105,110,32,80,121,116,104,111,110,32,51,46,49,50,59, - 32,117,115,101,32,101,120,101,99,95,109,111,100,117,108,101, - 40,41,32,105,110,115,116,101,97,100,78,218,12,95,95,98, - 117,105,108,116,105,110,115,95,95,122,14,76,111,97,100,101, - 100,32,109,111,100,117,108,101,32,122,25,32,110,111,116,32, - 102,111,117,110,100,32,105,110,32,115,121,115,46,109,111,100, - 117,108,101,115,122,30,105,109,112,111,114,116,32,123,125,32, - 35,32,108,111,97,100,101,100,32,102,114,111,109,32,90,105, - 112,32,123,125,41,24,218,9,95,119,97,114,110,105,110,103, - 115,90,4,119,97,114,110,218,18,68,101,112,114,101,99,97, - 116,105,111,110,87,97,114,110,105,110,103,114,48,0,0,0, - 218,3,115,121,115,218,7,109,111,100,117,108,101,115,218,3, - 103,101,116,114,15,0,0,0,218,12,95,109,111,100,117,108, - 101,95,116,121,112,101,218,10,95,95,108,111,97,100,101,114, - 95,95,114,36,0,0,0,114,21,0,0,0,114,30,0,0, - 0,114,29,0,0,0,90,8,95,95,112,97,116,104,95,95, - 218,7,104,97,115,97,116,116,114,114,68,0,0,0,90,14, - 95,102,105,120,95,117,112,95,109,111,100,117,108,101,218,8, - 95,95,100,105,99,116,95,95,218,4,101,120,101,99,114,26, - 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, - 114,45,0,0,0,218,16,95,118,101,114,98,111,115,101,95, - 109,101,115,115,97,103,101,41,9,114,32,0,0,0,114,38, - 0,0,0,218,3,109,115,103,114,50,0,0,0,114,51,0, - 0,0,114,40,0,0,0,90,3,109,111,100,114,13,0,0, - 0,114,66,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,11,108,111,97,100,95,109,111,100,117, - 108,101,10,1,0,0,115,54,0,0,0,4,9,12,2,16, - 1,12,1,18,1,8,1,10,1,6,1,2,2,4,1,10, - 3,14,1,8,1,10,2,6,1,16,1,16,1,6,1,8, - 1,2,1,2,2,14,1,12,1,18,1,14,1,4,1,255, - 128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0,0,8,0,0,0,67, - 0,0,0,115,64,0,0,0,122,20,124,0,160,0,124,1, - 161,1,115,18,87,0,100,1,83,0,87,0,110,20,4,0, - 116,1,121,40,1,0,1,0,1,0,89,0,100,1,83,0, - 119,0,100,2,100,3,108,2,109,3,125,2,1,0,124,2, - 124,0,124,1,131,2,83,0,41,4,122,204,82,101,116,117, - 114,110,32,116,104,101,32,82,101,115,111,117,114,99,101,82, - 101,97,100,101,114,32,102,111,114,32,97,32,112,97,99,107, - 97,103,101,32,105,110,32,97,32,122,105,112,32,102,105,108, - 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,39, - 102,117,108,108,110,97,109,101,39,32,105,115,32,97,32,112, - 97,99,107,97,103,101,32,119,105,116,104,105,110,32,116,104, - 101,32,122,105,112,32,102,105,108,101,44,32,114,101,116,117, - 114,110,32,116,104,101,10,32,32,32,32,32,32,32,32,39, - 82,101,115,111,117,114,99,101,82,101,97,100,101,114,39,32, - 111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,112, - 97,99,107,97,103,101,46,32,32,79,116,104,101,114,119,105, - 115,101,32,114,101,116,117,114,110,32,78,111,110,101,46,10, - 32,32,32,32,32,32,32,32,78,114,0,0,0,0,41,1, - 218,9,90,105,112,82,101,97,100,101,114,41,4,114,43,0, - 0,0,114,3,0,0,0,90,17,105,109,112,111,114,116,108, - 105,98,46,114,101,97,100,101,114,115,114,83,0,0,0,41, - 3,114,32,0,0,0,114,38,0,0,0,114,83,0,0,0, + 102,32,116,104,101,32,109,111,100,117,108,101,32,99,111,117, + 108,100,110,39,116,32,98,101,32,102,111,117,110,100,46,10, + 32,32,32,32,32,32,32,32,78,114,61,0,0,0,114,62, + 0,0,0,41,2,114,35,0,0,0,114,3,0,0,0,41, + 3,114,32,0,0,0,114,38,0,0,0,114,39,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, + 43,0,0,0,253,0,0,0,115,10,0,0,0,10,6,8, + 1,18,1,4,1,255,128,122,22,122,105,112,105,109,112,111, + 114,116,101,114,46,105,115,95,112,97,99,107,97,103,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, + 8,0,0,0,67,0,0,0,115,252,0,0,0,100,1,125, + 2,116,0,160,1,124,2,116,2,161,2,1,0,116,3,124, + 0,124,1,131,2,92,3,125,3,125,4,125,5,116,4,106, + 5,160,6,124,1,161,1,125,6,124,6,100,2,117,0,115, + 62,116,7,124,6,116,8,131,2,115,80,116,8,124,1,131, + 1,125,6,124,6,116,4,106,5,124,1,60,0,124,0,124, + 6,95,9,122,84,124,4,114,124,116,10,124,0,124,1,131, + 2,125,7,116,11,160,12,124,0,106,13,124,7,161,2,125, + 8,124,8,103,1,124,6,95,14,116,15,124,6,100,3,131, + 2,115,140,116,16,124,6,95,16,116,11,160,17,124,6,106, + 18,124,1,124,5,161,3,1,0,116,19,124,3,124,6,106, + 18,131,2,1,0,87,0,110,16,1,0,1,0,1,0,116, + 4,106,5,124,1,61,0,130,0,122,14,116,4,106,5,124, + 1,25,0,125,6,87,0,110,28,4,0,116,20,121,250,1, + 0,1,0,1,0,116,21,100,4,124,1,155,2,100,5,157, + 3,131,1,130,1,116,22,160,23,100,6,124,1,124,5,161, + 3,1,0,124,6,83,0,119,0,41,7,97,64,1,0,0, + 108,111,97,100,95,109,111,100,117,108,101,40,102,117,108,108, + 110,97,109,101,41,32,45,62,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,76,111,97,100,32,116, + 104,101,32,109,111,100,117,108,101,32,115,112,101,99,105,102, + 105,101,100,32,98,121,32,39,102,117,108,108,110,97,109,101, + 39,46,32,39,102,117,108,108,110,97,109,101,39,32,109,117, + 115,116,32,98,101,32,116,104,101,10,32,32,32,32,32,32, + 32,32,102,117,108,108,121,32,113,117,97,108,105,102,105,101, + 100,32,40,100,111,116,116,101,100,41,32,109,111,100,117,108, + 101,32,110,97,109,101,46,32,73,116,32,114,101,116,117,114, + 110,115,32,116,104,101,32,105,109,112,111,114,116,101,100,10, + 32,32,32,32,32,32,32,32,109,111,100,117,108,101,44,32, + 111,114,32,114,97,105,115,101,115,32,90,105,112,73,109,112, + 111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,99, + 111,117,108,100,32,110,111,116,32,98,101,32,105,109,112,111, + 114,116,101,100,46,10,10,32,32,32,32,32,32,32,32,68, + 101,112,114,101,99,97,116,101,100,32,115,105,110,99,101,32, + 80,121,116,104,111,110,32,51,46,49,48,46,32,85,115,101, + 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, + 110,115,116,101,97,100,46,10,32,32,32,32,32,32,32,32, + 122,114,122,105,112,105,109,112,111,114,116,46,122,105,112,105, + 109,112,111,114,116,101,114,46,108,111,97,100,95,109,111,100, + 117,108,101,40,41,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,32,97,110,100,32,115,108,97,116,101,100,32,102, + 111,114,32,114,101,109,111,118,97,108,32,105,110,32,80,121, + 116,104,111,110,32,51,46,49,50,59,32,117,115,101,32,101, + 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, + 116,101,97,100,78,218,12,95,95,98,117,105,108,116,105,110, + 115,95,95,122,14,76,111,97,100,101,100,32,109,111,100,117, + 108,101,32,122,25,32,110,111,116,32,102,111,117,110,100,32, + 105,110,32,115,121,115,46,109,111,100,117,108,101,115,122,30, + 105,109,112,111,114,116,32,123,125,32,35,32,108,111,97,100, + 101,100,32,102,114,111,109,32,90,105,112,32,123,125,41,24, + 218,9,95,119,97,114,110,105,110,103,115,90,4,119,97,114, + 110,218,18,68,101,112,114,101,99,97,116,105,111,110,87,97, + 114,110,105,110,103,114,48,0,0,0,218,3,115,121,115,218, + 7,109,111,100,117,108,101,115,218,3,103,101,116,114,15,0, + 0,0,218,12,95,109,111,100,117,108,101,95,116,121,112,101, + 218,10,95,95,108,111,97,100,101,114,95,95,114,36,0,0, + 0,114,21,0,0,0,114,30,0,0,0,114,29,0,0,0, + 90,8,95,95,112,97,116,104,95,95,218,7,104,97,115,97, + 116,116,114,114,68,0,0,0,90,14,95,102,105,120,95,117, + 112,95,109,111,100,117,108,101,218,8,95,95,100,105,99,116, + 95,95,218,4,101,120,101,99,114,26,0,0,0,218,11,73, + 109,112,111,114,116,69,114,114,111,114,114,45,0,0,0,218, + 16,95,118,101,114,98,111,115,101,95,109,101,115,115,97,103, + 101,41,9,114,32,0,0,0,114,38,0,0,0,218,3,109, + 115,103,114,50,0,0,0,114,51,0,0,0,114,40,0,0, + 0,90,3,109,111,100,114,13,0,0,0,114,66,0,0,0, 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 19,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, - 97,100,101,114,53,1,0,0,115,16,0,0,0,2,6,10, - 1,10,1,12,1,8,1,12,1,10,1,255,128,122,31,122, - 105,112,105,109,112,111,114,116,101,114,46,103,101,116,95,114, - 101,115,111,117,114,99,101,95,114,101,97,100,101,114,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5, - 0,0,0,67,0,0,0,115,24,0,0,0,100,1,124,0, - 106,0,155,0,116,1,155,0,124,0,106,2,155,0,100,2, - 157,5,83,0,41,3,78,122,21,60,122,105,112,105,109,112, - 111,114,116,101,114,32,111,98,106,101,99,116,32,34,122,2, - 34,62,41,3,114,29,0,0,0,114,20,0,0,0,114,31, - 0,0,0,41,1,114,32,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,8,95,95,114,101,112, - 114,95,95,68,1,0,0,115,4,0,0,0,24,1,255,128, - 122,20,122,105,112,105,109,112,111,114,116,101,114,46,95,95, - 114,101,112,114,95,95,41,1,78,41,1,78,41,1,78,41, - 16,114,6,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,7,95,95,100,111,99,95,95,114,34,0,0,0,114,41, - 0,0,0,114,42,0,0,0,114,46,0,0,0,114,52,0, - 0,0,114,59,0,0,0,114,60,0,0,0,114,67,0,0, - 0,114,43,0,0,0,114,82,0,0,0,114,84,0,0,0, - 114,85,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,4,0,0,0,46,0, - 0,0,115,30,0,0,0,8,0,4,1,8,17,10,46,10, - 34,10,13,8,27,8,10,8,21,8,12,8,26,8,13,8, - 43,12,15,255,128,122,12,95,95,105,110,105,116,95,95,46, - 112,121,99,84,114,63,0,0,0,70,41,3,122,4,46,112, - 121,99,84,70,41,3,114,64,0,0,0,70,70,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, - 0,0,67,0,0,0,115,20,0,0,0,124,0,106,0,124, - 1,160,1,100,1,161,1,100,2,25,0,23,0,83,0,41, - 3,78,218,1,46,233,2,0,0,0,41,2,114,31,0,0, - 0,218,10,114,112,97,114,116,105,116,105,111,110,41,2,114, - 32,0,0,0,114,38,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,36,0,0,0,86,1,0, - 0,115,4,0,0,0,20,1,255,128,114,36,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 2,0,0,0,67,0,0,0,115,18,0,0,0,124,1,116, - 0,23,0,125,2,124,2,124,0,106,1,118,0,83,0,169, - 1,78,41,2,114,20,0,0,0,114,28,0,0,0,41,3, - 114,32,0,0,0,114,13,0,0,0,90,7,100,105,114,112, - 97,116,104,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,37,0,0,0,90,1,0,0,115,6,0,0,0, - 8,4,10,2,255,128,114,37,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,7,0,0,0,4,0,0,0, - 67,0,0,0,115,54,0,0,0,116,0,124,0,124,1,131, - 2,125,2,116,1,68,0,93,34,92,3,125,3,125,4,125, - 5,124,2,124,3,23,0,125,6,124,6,124,0,106,2,118, - 0,114,14,124,5,2,0,1,0,83,0,100,0,83,0,114, - 90,0,0,0,41,3,114,36,0,0,0,218,16,95,122,105, - 112,95,115,101,97,114,99,104,111,114,100,101,114,114,28,0, - 0,0,41,7,114,32,0,0,0,114,38,0,0,0,114,13, - 0,0,0,218,6,115,117,102,102,105,120,218,10,105,115,98, - 121,116,101,99,111,100,101,114,51,0,0,0,114,66,0,0, - 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 114,35,0,0,0,99,1,0,0,115,14,0,0,0,10,1, - 14,1,8,1,10,1,8,1,4,1,255,128,114,35,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,26,0, - 0,0,9,0,0,0,67,0,0,0,115,232,4,0,0,122, - 14,116,0,160,1,124,0,161,1,125,1,87,0,110,32,4, - 0,116,2,121,46,1,0,1,0,1,0,116,3,100,1,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,119,0,124, - 1,144,4,143,142,1,0,122,36,124,1,160,4,116,5,11, - 0,100,3,161,2,1,0,124,1,160,6,161,0,125,2,124, - 1,160,7,116,5,161,1,125,3,87,0,110,32,4,0,116, - 2,121,124,1,0,1,0,1,0,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,119,0,116,8,124, - 3,131,1,116,5,107,3,114,156,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,124,3,100,0,100, - 5,133,2,25,0,116,9,107,3,144,1,114,154,122,24,124, - 1,160,4,100,6,100,3,161,2,1,0,124,1,160,6,161, - 0,125,4,87,0,110,32,4,0,116,2,121,230,1,0,1, + 11,108,111,97,100,95,109,111,100,117,108,101,10,1,0,0, + 115,56,0,0,0,4,9,12,2,16,1,12,1,18,1,8, + 1,10,1,6,1,2,2,4,1,10,3,14,1,8,1,10, + 2,6,1,16,1,16,1,6,1,8,1,2,1,2,2,14, + 1,12,1,16,1,14,1,4,1,2,253,255,128,122,23,122, + 105,112,105,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,0,0, + 0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,115, + 64,0,0,0,122,20,124,0,160,0,124,1,161,1,115,18, + 87,0,100,1,83,0,87,0,110,18,4,0,116,1,121,62, + 1,0,1,0,1,0,89,0,100,1,83,0,100,2,100,3, + 108,2,109,3,125,2,1,0,124,2,124,0,124,1,131,2, + 83,0,119,0,41,4,122,204,82,101,116,117,114,110,32,116, + 104,101,32,82,101,115,111,117,114,99,101,82,101,97,100,101, + 114,32,102,111,114,32,97,32,112,97,99,107,97,103,101,32, + 105,110,32,97,32,122,105,112,32,102,105,108,101,46,10,10, + 32,32,32,32,32,32,32,32,73,102,32,39,102,117,108,108, + 110,97,109,101,39,32,105,115,32,97,32,112,97,99,107,97, + 103,101,32,119,105,116,104,105,110,32,116,104,101,32,122,105, + 112,32,102,105,108,101,44,32,114,101,116,117,114,110,32,116, + 104,101,10,32,32,32,32,32,32,32,32,39,82,101,115,111, + 117,114,99,101,82,101,97,100,101,114,39,32,111,98,106,101, + 99,116,32,102,111,114,32,116,104,101,32,112,97,99,107,97, + 103,101,46,32,32,79,116,104,101,114,119,105,115,101,32,114, + 101,116,117,114,110,32,78,111,110,101,46,10,32,32,32,32, + 32,32,32,32,78,114,0,0,0,0,41,1,218,9,90,105, + 112,82,101,97,100,101,114,41,4,114,43,0,0,0,114,3, + 0,0,0,90,17,105,109,112,111,114,116,108,105,98,46,114, + 101,97,100,101,114,115,114,83,0,0,0,41,3,114,32,0, + 0,0,114,38,0,0,0,114,83,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,19,103,101,116, + 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, + 53,1,0,0,115,18,0,0,0,2,6,10,1,10,1,12, + 1,6,1,12,1,10,1,2,253,255,128,122,31,122,105,112, + 105,109,112,111,114,116,101,114,46,103,101,116,95,114,101,115, + 111,117,114,99,101,95,114,101,97,100,101,114,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0, + 0,67,0,0,0,115,24,0,0,0,100,1,124,0,106,0, + 155,0,116,1,155,0,124,0,106,2,155,0,100,2,157,5, + 83,0,41,3,78,122,21,60,122,105,112,105,109,112,111,114, + 116,101,114,32,111,98,106,101,99,116,32,34,122,2,34,62, + 41,3,114,29,0,0,0,114,20,0,0,0,114,31,0,0, + 0,41,1,114,32,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,8,95,95,114,101,112,114,95, + 95,68,1,0,0,115,4,0,0,0,24,1,255,128,122,20, + 122,105,112,105,109,112,111,114,116,101,114,46,95,95,114,101, + 112,114,95,95,41,1,78,41,1,78,41,1,78,41,16,114, + 6,0,0,0,114,7,0,0,0,114,8,0,0,0,218,7, + 95,95,100,111,99,95,95,114,34,0,0,0,114,41,0,0, + 0,114,42,0,0,0,114,46,0,0,0,114,52,0,0,0, + 114,59,0,0,0,114,60,0,0,0,114,67,0,0,0,114, + 43,0,0,0,114,82,0,0,0,114,84,0,0,0,114,85, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,114,4,0,0,0,46,0,0,0, + 115,30,0,0,0,8,0,4,1,8,17,10,46,10,34,10, + 13,8,27,8,10,8,21,8,12,8,26,8,13,8,43,12, + 15,255,128,122,12,95,95,105,110,105,116,95,95,46,112,121, + 99,84,114,63,0,0,0,70,41,3,122,4,46,112,121,99, + 84,70,41,3,114,64,0,0,0,70,70,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, + 67,0,0,0,115,20,0,0,0,124,0,106,0,124,1,160, + 1,100,1,161,1,100,2,25,0,23,0,83,0,41,3,78, + 218,1,46,233,2,0,0,0,41,2,114,31,0,0,0,218, + 10,114,112,97,114,116,105,116,105,111,110,41,2,114,32,0, + 0,0,114,38,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,114,36,0,0,0,86,1,0,0,115, + 4,0,0,0,20,1,255,128,114,36,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0, + 0,0,67,0,0,0,115,18,0,0,0,124,1,116,0,23, + 0,125,2,124,2,124,0,106,1,118,0,83,0,169,1,78, + 41,2,114,20,0,0,0,114,28,0,0,0,41,3,114,32, + 0,0,0,114,13,0,0,0,90,7,100,105,114,112,97,116, + 104,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,37,0,0,0,90,1,0,0,115,6,0,0,0,8,4, + 10,2,255,128,114,37,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,7,0,0,0,4,0,0,0,67,0, + 0,0,115,54,0,0,0,116,0,124,0,124,1,131,2,125, + 2,116,1,68,0,93,34,92,3,125,3,125,4,125,5,124, + 2,124,3,23,0,125,6,124,6,124,0,106,2,118,0,114, + 14,124,5,2,0,1,0,83,0,100,0,83,0,114,90,0, + 0,0,41,3,114,36,0,0,0,218,16,95,122,105,112,95, + 115,101,97,114,99,104,111,114,100,101,114,114,28,0,0,0, + 41,7,114,32,0,0,0,114,38,0,0,0,114,13,0,0, + 0,218,6,115,117,102,102,105,120,218,10,105,115,98,121,116, + 101,99,111,100,101,114,51,0,0,0,114,66,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,35, + 0,0,0,99,1,0,0,115,14,0,0,0,10,1,14,1, + 8,1,10,1,8,1,4,1,255,128,114,35,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0, + 9,0,0,0,67,0,0,0,115,236,4,0,0,122,14,116, + 0,160,1,124,0,161,1,125,1,87,0,110,32,4,0,116, + 2,144,4,121,234,1,0,1,0,1,0,116,3,100,1,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,124,1,144, + 4,143,130,1,0,122,36,124,1,160,4,116,5,11,0,100, + 3,161,2,1,0,124,1,160,6,161,0,125,2,124,1,160, + 7,116,5,161,1,125,3,87,0,110,32,4,0,116,2,144, + 4,121,232,1,0,1,0,1,0,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,116,8,124,3,131, + 1,116,5,107,3,114,156,116,3,100,4,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,124,3,100,0,100,5,133, + 2,25,0,116,9,107,3,144,1,114,152,122,24,124,1,160, + 4,100,6,100,3,161,2,1,0,124,1,160,6,161,0,125, + 4,87,0,110,32,4,0,116,2,144,4,121,230,1,0,1, 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,119,0,116,10,124,4,116,11,24,0,116, - 5,24,0,100,6,131,2,125,5,122,22,124,1,160,4,124, - 5,161,1,1,0,124,1,160,7,161,0,125,6,87,0,110, - 34,4,0,116,2,144,1,121,50,1,0,1,0,1,0,116, + 2,141,2,130,1,116,10,124,4,116,11,24,0,116,5,24, + 0,100,6,131,2,125,5,122,22,124,1,160,4,124,5,161, + 1,1,0,124,1,160,7,161,0,125,6,87,0,110,32,4, + 0,116,2,144,4,121,228,1,0,1,0,1,0,116,3,100, + 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124, + 6,160,12,116,9,161,1,125,7,124,7,100,6,107,0,144, + 1,114,88,116,3,100,7,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,124,6,124,7,124,7,116,5,23,0,133, + 2,25,0,125,3,116,8,124,3,131,1,116,5,107,3,144, + 1,114,136,116,3,100,8,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,124,4,116,8,124,6,131,1,24,0,124, + 7,23,0,125,2,116,13,124,3,100,9,100,10,133,2,25, + 0,131,1,125,8,116,13,124,3,100,10,100,11,133,2,25, + 0,131,1,125,9,124,2,124,8,107,0,144,1,114,212,116, + 3,100,12,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,124,2,124,9,107,0,144,1,114,240,116,3,100,13,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,124,2,124, + 8,56,0,125,2,124,2,124,9,24,0,125,10,124,10,100, + 6,107,0,144,2,114,28,116,3,100,14,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,105,0,125,11,100,6,125, + 12,122,14,124,1,160,4,124,2,161,1,1,0,87,0,110, + 32,4,0,116,2,144,4,121,226,1,0,1,0,1,0,116, 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,119,0,124,6,160,12,116,9,161,1,125,7,124,7,100, - 6,107,0,144,1,114,90,116,3,100,7,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,124,6,124,7,124,7,116, - 5,23,0,133,2,25,0,125,3,116,8,124,3,131,1,116, - 5,107,3,144,1,114,138,116,3,100,8,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,124,4,116,8,124,6,131, - 1,24,0,124,7,23,0,125,2,116,13,124,3,100,9,100, - 10,133,2,25,0,131,1,125,8,116,13,124,3,100,10,100, - 11,133,2,25,0,131,1,125,9,124,2,124,8,107,0,144, - 1,114,214,116,3,100,12,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,124,2,124,9,107,0,144,1,114,242,116, - 3,100,13,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,124,2,124,8,56,0,125,2,124,2,124,9,24,0,125, - 10,124,10,100,6,107,0,144,2,114,30,116,3,100,14,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,105,0,125, - 11,100,6,125,12,122,14,124,1,160,4,124,2,161,1,1, - 0,87,0,110,34,4,0,116,2,144,2,121,86,1,0,1, - 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,119,0,9,0,124,1,160,7,100,16,161, - 1,125,3,116,8,124,3,131,1,100,5,107,0,144,2,114, - 122,116,14,100,17,131,1,130,1,124,3,100,0,100,5,133, - 2,25,0,100,18,107,3,144,2,114,144,144,4,113,182,116, - 8,124,3,131,1,100,16,107,3,144,2,114,166,116,14,100, - 17,131,1,130,1,116,15,124,3,100,19,100,20,133,2,25, - 0,131,1,125,13,116,15,124,3,100,20,100,9,133,2,25, - 0,131,1,125,14,116,15,124,3,100,9,100,21,133,2,25, - 0,131,1,125,15,116,15,124,3,100,21,100,10,133,2,25, - 0,131,1,125,16,116,13,124,3,100,10,100,11,133,2,25, - 0,131,1,125,17,116,13,124,3,100,11,100,22,133,2,25, - 0,131,1,125,18,116,13,124,3,100,22,100,23,133,2,25, - 0,131,1,125,4,116,15,124,3,100,23,100,24,133,2,25, - 0,131,1,125,19,116,15,124,3,100,24,100,25,133,2,25, - 0,131,1,125,20,116,15,124,3,100,25,100,26,133,2,25, - 0,131,1,125,21,116,13,124,3,100,27,100,16,133,2,25, - 0,131,1,125,22,124,19,124,20,23,0,124,21,23,0,125, - 8,124,22,124,9,107,4,144,3,114,126,116,3,100,28,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,124,22,124, - 10,55,0,125,22,122,14,124,1,160,7,124,19,161,1,125, - 23,87,0,110,34,4,0,116,2,144,3,121,182,1,0,1, - 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,119,0,116,8,124,23,131,1,124,19,107, - 3,144,3,114,216,116,3,100,4,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,122,50,116,8,124,1,160,7,124, - 8,124,19,24,0,161,1,131,1,124,8,124,19,24,0,107, - 3,144,4,114,8,116,3,100,4,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,87,0,110,34,4,0,116,2,144, - 4,121,44,1,0,1,0,1,0,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,119,0,124,13,100, - 29,64,0,144,4,114,66,124,23,160,16,161,0,125,23,110, - 52,122,14,124,23,160,16,100,30,161,1,125,23,87,0,110, - 36,4,0,116,17,144,4,121,116,1,0,1,0,1,0,124, - 23,160,16,100,31,161,1,160,18,116,19,161,1,125,23,89, - 0,110,2,119,0,124,23,160,20,100,32,116,21,161,2,125, - 23,116,22,160,23,124,0,124,23,161,2,125,24,124,24,124, - 14,124,18,124,4,124,22,124,15,124,16,124,17,102,8,125, - 25,124,25,124,11,124,23,60,0,124,12,100,33,55,0,125, - 12,144,2,113,90,87,0,100,0,4,0,4,0,131,3,1, - 0,110,18,49,0,144,4,115,204,119,1,1,0,1,0,1, - 0,89,0,1,0,116,24,160,25,100,34,124,12,124,0,161, - 3,1,0,124,11,83,0,41,35,78,122,21,99,97,110,39, - 116,32,111,112,101,110,32,90,105,112,32,102,105,108,101,58, - 32,114,12,0,0,0,114,88,0,0,0,250,21,99,97,110, - 39,116,32,114,101,97,100,32,90,105,112,32,102,105,108,101, - 58,32,233,4,0,0,0,114,0,0,0,0,122,16,110,111, - 116,32,97,32,90,105,112,32,102,105,108,101,58,32,122,18, - 99,111,114,114,117,112,116,32,90,105,112,32,102,105,108,101, - 58,32,233,12,0,0,0,233,16,0,0,0,233,20,0,0, - 0,122,28,98,97,100,32,99,101,110,116,114,97,108,32,100, - 105,114,101,99,116,111,114,121,32,115,105,122,101,58,32,122, - 30,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, - 101,99,116,111,114,121,32,111,102,102,115,101,116,58,32,122, - 38,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114, - 101,99,116,111,114,121,32,115,105,122,101,32,111,114,32,111, - 102,102,115,101,116,58,32,84,233,46,0,0,0,250,27,69, - 79,70,32,114,101,97,100,32,119,104,101,114,101,32,110,111, - 116,32,101,120,112,101,99,116,101,100,115,4,0,0,0,80, - 75,1,2,233,8,0,0,0,233,10,0,0,0,233,14,0, - 0,0,233,24,0,0,0,233,28,0,0,0,233,30,0,0, - 0,233,32,0,0,0,233,34,0,0,0,233,42,0,0,0, - 122,25,98,97,100,32,108,111,99,97,108,32,104,101,97,100, - 101,114,32,111,102,102,115,101,116,58,32,105,0,8,0,0, - 218,5,97,115,99,105,105,90,6,108,97,116,105,110,49,250, - 1,47,114,5,0,0,0,122,33,122,105,112,105,109,112,111, - 114,116,58,32,102,111,117,110,100,32,123,125,32,110,97,109, - 101,115,32,105,110,32,123,33,114,125,41,26,218,3,95,105, - 111,218,9,111,112,101,110,95,99,111,100,101,114,22,0,0, - 0,114,3,0,0,0,218,4,115,101,101,107,218,20,69,78, - 68,95,67,69,78,84,82,65,76,95,68,73,82,95,83,73, - 90,69,90,4,116,101,108,108,218,4,114,101,97,100,114,55, - 0,0,0,218,18,83,84,82,73,78,71,95,69,78,68,95, - 65,82,67,72,73,86,69,218,3,109,97,120,218,15,77,65, - 88,95,67,79,77,77,69,78,84,95,76,69,78,218,5,114, - 102,105,110,100,114,2,0,0,0,218,8,69,79,70,69,114, - 114,111,114,114,1,0,0,0,114,65,0,0,0,218,18,85, - 110,105,99,111,100,101,68,101,99,111,100,101,69,114,114,111, - 114,218,9,116,114,97,110,115,108,97,116,101,218,11,99,112, - 52,51,55,95,116,97,98,108,101,114,19,0,0,0,114,20, - 0,0,0,114,21,0,0,0,114,30,0,0,0,114,45,0, - 0,0,114,80,0,0,0,41,26,114,29,0,0,0,218,2, - 102,112,90,15,104,101,97,100,101,114,95,112,111,115,105,116, - 105,111,110,218,6,98,117,102,102,101,114,218,9,102,105,108, - 101,95,115,105,122,101,90,17,109,97,120,95,99,111,109,109, - 101,110,116,95,115,116,97,114,116,218,4,100,97,116,97,90, - 3,112,111,115,218,11,104,101,97,100,101,114,95,115,105,122, - 101,90,13,104,101,97,100,101,114,95,111,102,102,115,101,116, - 90,10,97,114,99,95,111,102,102,115,101,116,114,33,0,0, - 0,218,5,99,111,117,110,116,218,5,102,108,97,103,115,218, - 8,99,111,109,112,114,101,115,115,218,4,116,105,109,101,218, - 4,100,97,116,101,218,3,99,114,99,218,9,100,97,116,97, - 95,115,105,122,101,218,9,110,97,109,101,95,115,105,122,101, - 218,10,101,120,116,114,97,95,115,105,122,101,90,12,99,111, - 109,109,101,110,116,95,115,105,122,101,218,11,102,105,108,101, - 95,111,102,102,115,101,116,114,44,0,0,0,114,13,0,0, - 0,218,1,116,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,114,27,0,0,0,130,1,0,0,115,218,0,0, - 0,2,1,14,1,12,1,20,1,8,2,2,1,14,1,8, - 1,14,1,12,1,20,1,12,1,18,1,18,1,2,3,12, - 1,12,1,12,1,10,1,2,1,8,255,8,2,2,1,2, - 255,2,1,4,255,2,2,10,1,12,1,14,1,10,1,2, - 1,8,255,10,2,10,1,10,1,2,1,6,255,16,2,14, - 1,10,1,2,1,6,255,16,2,16,2,16,1,10,1,18, - 1,10,1,18,1,8,1,8,1,10,1,18,1,4,2,4, - 2,2,1,14,1,14,1,20,1,2,1,10,1,14,1,8, - 1,18,2,4,1,14,1,8,1,16,1,16,1,16,1,16, - 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,12, - 1,10,1,18,1,8,1,2,2,14,1,14,1,20,1,14, - 1,18,1,2,4,28,1,22,1,14,1,20,1,10,2,10, - 2,2,3,14,1,14,1,22,1,12,2,12,1,20,1,8, - 1,8,1,36,202,14,55,4,1,255,128,114,27,0,0,0, - 117,190,1,0,0,0,1,2,3,4,5,6,7,8,9,10, - 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26, - 27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42, - 43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58, - 59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74, - 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, - 91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106, - 107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122, - 123,124,125,126,127,195,135,195,188,195,169,195,162,195,164,195, - 160,195,165,195,167,195,170,195,171,195,168,195,175,195,174,195, - 172,195,132,195,133,195,137,195,166,195,134,195,180,195,182,195, - 178,195,187,195,185,195,191,195,150,195,156,194,162,194,163,194, - 165,226,130,167,198,146,195,161,195,173,195,179,195,186,195,177, - 195,145,194,170,194,186,194,191,226,140,144,194,172,194,189,194, - 188,194,161,194,171,194,187,226,150,145,226,150,146,226,150,147, - 226,148,130,226,148,164,226,149,161,226,149,162,226,149,150,226, - 149,149,226,149,163,226,149,145,226,149,151,226,149,157,226,149, - 156,226,149,155,226,148,144,226,148,148,226,148,180,226,148,172, - 226,148,156,226,148,128,226,148,188,226,149,158,226,149,159,226, - 149,154,226,149,148,226,149,169,226,149,166,226,149,160,226,149, - 144,226,149,172,226,149,167,226,149,168,226,149,164,226,149,165, - 226,149,153,226,149,152,226,149,146,226,149,147,226,149,171,226, - 149,170,226,148,152,226,148,140,226,150,136,226,150,132,226,150, - 140,226,150,144,226,150,128,206,177,195,159,206,147,207,128,206, - 163,207,131,194,181,207,132,206,166,206,152,206,169,206,180,226, - 136,158,207,134,206,181,226,136,169,226,137,161,194,177,226,137, - 165,226,137,164,226,140,160,226,140,161,195,183,226,137,136,194, - 176,226,136,153,194,183,226,136,154,226,129,191,194,178,226,150, - 160,194,160,99,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,8,0,0,0,67,0,0,0,115,106,0,0, - 0,116,0,114,22,116,1,160,2,100,1,161,1,1,0,116, - 3,100,2,131,1,130,1,100,3,97,0,122,58,122,16,100, - 4,100,5,108,4,109,5,125,0,1,0,87,0,110,32,4, - 0,116,6,121,76,1,0,1,0,1,0,116,1,160,2,100, - 1,161,1,1,0,116,3,100,2,131,1,130,1,119,0,87, + 1,9,0,124,1,160,7,100,16,161,1,125,3,116,8,124, + 3,131,1,100,5,107,0,144,2,114,118,116,14,100,17,131, + 1,130,1,124,3,100,0,100,5,133,2,25,0,100,18,107, + 3,144,2,114,140,144,4,113,170,116,8,124,3,131,1,100, + 16,107,3,144,2,114,162,116,14,100,17,131,1,130,1,116, + 15,124,3,100,19,100,20,133,2,25,0,131,1,125,13,116, + 15,124,3,100,20,100,9,133,2,25,0,131,1,125,14,116, + 15,124,3,100,9,100,21,133,2,25,0,131,1,125,15,116, + 15,124,3,100,21,100,10,133,2,25,0,131,1,125,16,116, + 13,124,3,100,10,100,11,133,2,25,0,131,1,125,17,116, + 13,124,3,100,11,100,22,133,2,25,0,131,1,125,18,116, + 13,124,3,100,22,100,23,133,2,25,0,131,1,125,4,116, + 15,124,3,100,23,100,24,133,2,25,0,131,1,125,19,116, + 15,124,3,100,24,100,25,133,2,25,0,131,1,125,20,116, + 15,124,3,100,25,100,26,133,2,25,0,131,1,125,21,116, + 13,124,3,100,27,100,16,133,2,25,0,131,1,125,22,124, + 19,124,20,23,0,124,21,23,0,125,8,124,22,124,9,107, + 4,144,3,114,122,116,3,100,28,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,124,22,124,10,55,0,125,22,122, + 14,124,1,160,7,124,19,161,1,125,23,87,0,110,32,4, + 0,116,2,144,4,121,224,1,0,1,0,1,0,116,3,100, + 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,116, + 8,124,23,131,1,124,19,107,3,144,3,114,210,116,3,100, + 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,122, + 50,116,8,124,1,160,7,124,8,124,19,24,0,161,1,131, + 1,124,8,124,19,24,0,107,3,144,4,114,2,116,3,100, + 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,87, + 0,110,32,4,0,116,2,144,4,121,222,1,0,1,0,1, + 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, + 2,130,1,124,13,100,29,64,0,144,4,114,58,124,23,160, + 16,161,0,125,23,110,48,122,14,124,23,160,16,100,30,161, + 1,125,23,87,0,110,32,4,0,116,17,144,4,121,220,1, + 0,1,0,1,0,124,23,160,16,100,31,161,1,160,18,116, + 19,161,1,125,23,89,0,124,23,160,20,100,32,116,21,161, + 2,125,23,116,22,160,23,124,0,124,23,161,2,125,24,124, + 24,124,14,124,18,124,4,124,22,124,15,124,16,124,17,102, + 8,125,25,124,25,124,11,124,23,60,0,124,12,100,33,55, + 0,125,12,144,2,113,86,87,0,100,0,4,0,4,0,131, + 3,1,0,110,18,49,0,144,4,115,192,119,1,1,0,1, + 0,1,0,89,0,1,0,116,24,160,25,100,34,124,12,124, + 0,161,3,1,0,124,11,83,0,119,0,119,0,119,0,119, + 0,119,0,119,0,119,0,119,0,41,35,78,122,21,99,97, + 110,39,116,32,111,112,101,110,32,90,105,112,32,102,105,108, + 101,58,32,114,12,0,0,0,114,88,0,0,0,250,21,99, + 97,110,39,116,32,114,101,97,100,32,90,105,112,32,102,105, + 108,101,58,32,233,4,0,0,0,114,0,0,0,0,122,16, + 110,111,116,32,97,32,90,105,112,32,102,105,108,101,58,32, + 122,18,99,111,114,114,117,112,116,32,90,105,112,32,102,105, + 108,101,58,32,233,12,0,0,0,233,16,0,0,0,233,20, + 0,0,0,122,28,98,97,100,32,99,101,110,116,114,97,108, + 32,100,105,114,101,99,116,111,114,121,32,115,105,122,101,58, + 32,122,30,98,97,100,32,99,101,110,116,114,97,108,32,100, + 105,114,101,99,116,111,114,121,32,111,102,102,115,101,116,58, + 32,122,38,98,97,100,32,99,101,110,116,114,97,108,32,100, + 105,114,101,99,116,111,114,121,32,115,105,122,101,32,111,114, + 32,111,102,102,115,101,116,58,32,84,233,46,0,0,0,250, + 27,69,79,70,32,114,101,97,100,32,119,104,101,114,101,32, + 110,111,116,32,101,120,112,101,99,116,101,100,115,4,0,0, + 0,80,75,1,2,233,8,0,0,0,233,10,0,0,0,233, + 14,0,0,0,233,24,0,0,0,233,28,0,0,0,233,30, + 0,0,0,233,32,0,0,0,233,34,0,0,0,233,42,0, + 0,0,122,25,98,97,100,32,108,111,99,97,108,32,104,101, + 97,100,101,114,32,111,102,102,115,101,116,58,32,105,0,8, + 0,0,218,5,97,115,99,105,105,90,6,108,97,116,105,110, + 49,250,1,47,114,5,0,0,0,122,33,122,105,112,105,109, + 112,111,114,116,58,32,102,111,117,110,100,32,123,125,32,110, + 97,109,101,115,32,105,110,32,123,33,114,125,41,26,218,3, + 95,105,111,218,9,111,112,101,110,95,99,111,100,101,114,22, + 0,0,0,114,3,0,0,0,218,4,115,101,101,107,218,20, + 69,78,68,95,67,69,78,84,82,65,76,95,68,73,82,95, + 83,73,90,69,90,4,116,101,108,108,218,4,114,101,97,100, + 114,55,0,0,0,218,18,83,84,82,73,78,71,95,69,78, + 68,95,65,82,67,72,73,86,69,218,3,109,97,120,218,15, + 77,65,88,95,67,79,77,77,69,78,84,95,76,69,78,218, + 5,114,102,105,110,100,114,2,0,0,0,218,8,69,79,70, + 69,114,114,111,114,114,1,0,0,0,114,65,0,0,0,218, + 18,85,110,105,99,111,100,101,68,101,99,111,100,101,69,114, + 114,111,114,218,9,116,114,97,110,115,108,97,116,101,218,11, + 99,112,52,51,55,95,116,97,98,108,101,114,19,0,0,0, + 114,20,0,0,0,114,21,0,0,0,114,30,0,0,0,114, + 45,0,0,0,114,80,0,0,0,41,26,114,29,0,0,0, + 218,2,102,112,90,15,104,101,97,100,101,114,95,112,111,115, + 105,116,105,111,110,218,6,98,117,102,102,101,114,218,9,102, + 105,108,101,95,115,105,122,101,90,17,109,97,120,95,99,111, + 109,109,101,110,116,95,115,116,97,114,116,218,4,100,97,116, + 97,90,3,112,111,115,218,11,104,101,97,100,101,114,95,115, + 105,122,101,90,13,104,101,97,100,101,114,95,111,102,102,115, + 101,116,90,10,97,114,99,95,111,102,102,115,101,116,114,33, + 0,0,0,218,5,99,111,117,110,116,218,5,102,108,97,103, + 115,218,8,99,111,109,112,114,101,115,115,218,4,116,105,109, + 101,218,4,100,97,116,101,218,3,99,114,99,218,9,100,97, + 116,97,95,115,105,122,101,218,9,110,97,109,101,95,115,105, + 122,101,218,10,101,120,116,114,97,95,115,105,122,101,90,12, + 99,111,109,109,101,110,116,95,115,105,122,101,218,11,102,105, + 108,101,95,111,102,102,115,101,116,114,44,0,0,0,114,13, + 0,0,0,218,1,116,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,27,0,0,0,130,1,0,0,115,234, + 0,0,0,2,1,14,1,14,1,18,1,8,2,2,1,14, + 1,8,1,14,1,14,1,18,1,12,1,18,1,18,1,2, + 3,12,1,12,1,14,1,10,1,2,1,6,255,8,2,2, + 1,2,255,2,1,4,255,2,2,10,1,12,1,14,1,10, + 1,2,1,6,255,10,2,10,1,10,1,2,1,6,255,16, + 2,14,1,10,1,2,1,6,255,16,2,16,2,16,1,10, + 1,18,1,10,1,18,1,8,1,8,1,10,1,18,1,4, + 2,4,2,2,1,14,1,14,1,18,1,2,1,10,1,14, + 1,8,1,18,2,4,1,14,1,8,1,16,1,16,1,16, + 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16, + 1,12,1,10,1,18,1,8,1,2,2,14,1,14,1,18, + 1,14,1,18,1,2,4,28,1,22,1,14,1,18,1,10, + 2,10,2,2,3,14,1,14,1,18,1,12,2,12,1,20, + 1,8,1,8,1,36,202,14,55,4,1,2,247,2,246,2, + 246,2,227,2,227,2,248,2,246,2,248,255,128,114,27,0, + 0,0,117,190,1,0,0,0,1,2,3,4,5,6,7,8, + 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, + 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, + 41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56, + 57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72, + 73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88, + 89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104, + 105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120, + 121,122,123,124,125,126,127,195,135,195,188,195,169,195,162,195, + 164,195,160,195,165,195,167,195,170,195,171,195,168,195,175,195, + 174,195,172,195,132,195,133,195,137,195,166,195,134,195,180,195, + 182,195,178,195,187,195,185,195,191,195,150,195,156,194,162,194, + 163,194,165,226,130,167,198,146,195,161,195,173,195,179,195,186, + 195,177,195,145,194,170,194,186,194,191,226,140,144,194,172,194, + 189,194,188,194,161,194,171,194,187,226,150,145,226,150,146,226, + 150,147,226,148,130,226,148,164,226,149,161,226,149,162,226,149, + 150,226,149,149,226,149,163,226,149,145,226,149,151,226,149,157, + 226,149,156,226,149,155,226,148,144,226,148,148,226,148,180,226, + 148,172,226,148,156,226,148,128,226,148,188,226,149,158,226,149, + 159,226,149,154,226,149,148,226,149,169,226,149,166,226,149,160, + 226,149,144,226,149,172,226,149,167,226,149,168,226,149,164,226, + 149,165,226,149,153,226,149,152,226,149,146,226,149,147,226,149, + 171,226,149,170,226,148,152,226,148,140,226,150,136,226,150,132, + 226,150,140,226,150,144,226,150,128,206,177,195,159,206,147,207, + 128,206,163,207,131,194,181,207,132,206,166,206,152,206,169,206, + 180,226,136,158,207,134,206,181,226,136,169,226,137,161,194,177, + 226,137,165,226,137,164,226,140,160,226,140,161,195,183,226,137, + 136,194,176,226,136,153,194,183,226,136,154,226,129,191,194,178, + 226,150,160,194,160,99,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,8,0,0,0,67,0,0,0,115,106, + 0,0,0,116,0,114,22,116,1,160,2,100,1,161,1,1, + 0,116,3,100,2,131,1,130,1,100,3,97,0,122,56,122, + 16,100,4,100,5,108,4,109,5,125,0,1,0,87,0,110, + 30,4,0,116,6,121,104,1,0,1,0,1,0,116,1,160, + 2,100,1,161,1,1,0,116,3,100,2,131,1,130,1,87, 0,100,6,97,0,110,6,100,6,97,0,119,0,116,1,160, - 2,100,7,161,1,1,0,124,0,83,0,41,8,78,122,27, - 122,105,112,105,109,112,111,114,116,58,32,122,108,105,98,32, - 85,78,65,86,65,73,76,65,66,76,69,250,41,99,97,110, - 39,116,32,100,101,99,111,109,112,114,101,115,115,32,100,97, - 116,97,59,32,122,108,105,98,32,110,111,116,32,97,118,97, - 105,108,97,98,108,101,84,114,0,0,0,0,169,1,218,10, - 100,101,99,111,109,112,114,101,115,115,70,122,25,122,105,112, - 105,109,112,111,114,116,58,32,122,108,105,98,32,97,118,97, - 105,108,97,98,108,101,41,7,218,15,95,105,109,112,111,114, - 116,105,110,103,95,122,108,105,98,114,45,0,0,0,114,80, - 0,0,0,114,3,0,0,0,90,4,122,108,105,98,114,143, - 0,0,0,218,9,69,120,99,101,112,116,105,111,110,114,142, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,20,95,103,101,116,95,100,101,99,111,109,112,114, - 101,115,115,95,102,117,110,99,32,2,0,0,115,28,0,0, - 0,4,2,10,3,8,1,4,2,4,1,16,1,12,1,10, - 1,10,1,2,128,12,2,10,2,4,1,255,128,114,146,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,17, - 0,0,0,9,0,0,0,67,0,0,0,115,132,1,0,0, - 124,1,92,8,125,2,125,3,125,4,125,5,125,6,125,7, - 125,8,125,9,124,4,100,1,107,0,114,36,116,0,100,2, - 131,1,130,1,116,1,160,2,124,0,161,1,144,1,143,6, - 125,10,122,14,124,10,160,3,124,6,161,1,1,0,87,0, - 110,32,4,0,116,4,121,96,1,0,1,0,1,0,116,0, - 100,3,124,0,155,2,157,2,124,0,100,4,141,2,130,1, - 119,0,124,10,160,5,100,5,161,1,125,11,116,6,124,11, - 131,1,100,5,107,3,114,128,116,7,100,6,131,1,130,1, - 124,11,100,0,100,7,133,2,25,0,100,8,107,3,114,162, - 116,0,100,9,124,0,155,2,157,2,124,0,100,4,141,2, - 130,1,116,8,124,11,100,10,100,11,133,2,25,0,131,1, - 125,12,116,8,124,11,100,11,100,5,133,2,25,0,131,1, - 125,13,100,5,124,12,23,0,124,13,23,0,125,14,124,6, - 124,14,55,0,125,6,122,14,124,10,160,3,124,6,161,1, - 1,0,87,0,110,34,4,0,116,4,144,1,121,6,1,0, + 2,100,7,161,1,1,0,124,0,83,0,119,0,41,8,78, + 122,27,122,105,112,105,109,112,111,114,116,58,32,122,108,105, + 98,32,85,78,65,86,65,73,76,65,66,76,69,250,41,99, + 97,110,39,116,32,100,101,99,111,109,112,114,101,115,115,32, + 100,97,116,97,59,32,122,108,105,98,32,110,111,116,32,97, + 118,97,105,108,97,98,108,101,84,114,0,0,0,0,169,1, + 218,10,100,101,99,111,109,112,114,101,115,115,70,122,25,122, + 105,112,105,109,112,111,114,116,58,32,122,108,105,98,32,97, + 118,97,105,108,97,98,108,101,41,7,218,15,95,105,109,112, + 111,114,116,105,110,103,95,122,108,105,98,114,45,0,0,0, + 114,80,0,0,0,114,3,0,0,0,90,4,122,108,105,98, + 114,143,0,0,0,218,9,69,120,99,101,112,116,105,111,110, + 114,142,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,20,95,103,101,116,95,100,101,99,111,109, + 112,114,101,115,115,95,102,117,110,99,32,2,0,0,115,30, + 0,0,0,4,2,10,3,8,1,4,2,4,1,16,1,12, + 1,10,1,8,1,2,128,12,2,10,2,4,1,2,249,255, + 128,114,146,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,17,0,0,0,9,0,0,0,67,0,0,0,115, + 134,1,0,0,124,1,92,8,125,2,125,3,125,4,125,5, + 125,6,125,7,125,8,125,9,124,4,100,1,107,0,114,36, + 116,0,100,2,131,1,130,1,116,1,160,2,124,0,161,1, + 144,1,143,4,125,10,122,14,124,10,160,3,124,6,161,1, + 1,0,87,0,110,32,4,0,116,4,144,1,121,132,1,0, 1,0,1,0,116,0,100,3,124,0,155,2,157,2,124,0, - 100,4,141,2,130,1,119,0,124,10,160,5,124,4,161,1, - 125,15,116,6,124,15,131,1,124,4,107,3,144,1,114,40, - 116,4,100,12,131,1,130,1,87,0,100,0,4,0,4,0, - 131,3,1,0,110,18,49,0,144,1,115,62,119,1,1,0, - 1,0,1,0,89,0,1,0,124,3,100,1,107,2,144,1, - 114,86,124,15,83,0,122,10,116,9,131,0,125,16,87,0, - 110,24,4,0,116,10,144,1,121,120,1,0,1,0,1,0, - 116,0,100,13,131,1,130,1,119,0,124,16,124,15,100,14, - 131,2,83,0,41,15,78,114,0,0,0,0,122,18,110,101, - 103,97,116,105,118,101,32,100,97,116,97,32,115,105,122,101, - 114,94,0,0,0,114,12,0,0,0,114,106,0,0,0,114, - 100,0,0,0,114,95,0,0,0,115,4,0,0,0,80,75, - 3,4,122,23,98,97,100,32,108,111,99,97,108,32,102,105, - 108,101,32,104,101,97,100,101,114,58,32,233,26,0,0,0, - 114,105,0,0,0,122,26,122,105,112,105,109,112,111,114,116, - 58,32,99,97,110,39,116,32,114,101,97,100,32,100,97,116, - 97,114,141,0,0,0,105,241,255,255,255,41,11,114,3,0, - 0,0,114,112,0,0,0,114,113,0,0,0,114,114,0,0, - 0,114,22,0,0,0,114,116,0,0,0,114,55,0,0,0, - 114,121,0,0,0,114,1,0,0,0,114,146,0,0,0,114, - 145,0,0,0,41,17,114,29,0,0,0,114,58,0,0,0, - 90,8,100,97,116,97,112,97,116,104,114,132,0,0,0,114, - 136,0,0,0,114,127,0,0,0,114,139,0,0,0,114,133, - 0,0,0,114,134,0,0,0,114,135,0,0,0,114,125,0, - 0,0,114,126,0,0,0,114,137,0,0,0,114,138,0,0, - 0,114,129,0,0,0,90,8,114,97,119,95,100,97,116,97, - 114,143,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,56,0,0,0,53,2,0,0,115,64,0, - 0,0,20,1,8,1,8,1,14,2,2,2,14,1,12,1, - 20,1,10,1,12,1,8,1,16,2,18,2,16,2,16,1, - 12,1,8,1,2,1,14,1,14,1,20,1,10,1,14,1, - 40,1,10,2,4,2,2,3,10,1,14,1,10,1,10,1, - 255,128,114,56,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,16,0,0,0,116,0,124,0,124,1,24,0,131,1,100, - 1,107,1,83,0,41,2,78,114,5,0,0,0,41,1,218, - 3,97,98,115,41,2,90,2,116,49,90,2,116,50,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,9,95, - 101,113,95,109,116,105,109,101,99,2,0,0,115,4,0,0, - 0,16,2,255,128,114,149,0,0,0,99,5,0,0,0,0, - 0,0,0,0,0,0,0,14,0,0,0,6,0,0,0,67, - 0,0,0,115,254,0,0,0,124,3,124,2,100,1,156,2, - 125,5,116,0,160,1,124,4,124,3,124,5,161,3,125,6, - 124,6,100,2,64,0,100,3,107,3,125,7,124,7,114,126, - 124,6,100,4,64,0,100,3,107,3,125,8,116,2,106,3, - 100,5,107,3,114,206,124,8,115,76,116,2,106,3,100,6, - 107,2,114,206,116,4,124,0,124,2,131,2,125,9,124,9, - 100,0,117,1,114,206,116,2,160,5,116,0,106,6,124,9, - 161,2,125,10,116,0,160,7,124,4,124,10,124,3,124,5, - 161,4,1,0,110,80,116,8,124,0,124,2,131,2,92,2, - 125,11,125,12,124,11,114,206,116,9,116,10,124,4,100,7, - 100,8,133,2,25,0,131,1,124,11,131,2,114,186,116,10, - 124,4,100,8,100,9,133,2,25,0,131,1,124,12,107,3, - 114,206,116,11,160,12,100,10,124,3,155,2,157,2,161,1, - 1,0,100,0,83,0,116,13,160,14,124,4,100,9,100,0, - 133,2,25,0,161,1,125,13,116,15,124,13,116,16,131,2, - 115,250,116,17,100,11,124,1,155,2,100,12,157,3,131,1, - 130,1,124,13,83,0,41,13,78,41,2,114,44,0,0,0, - 114,13,0,0,0,114,5,0,0,0,114,0,0,0,0,114, - 88,0,0,0,90,5,110,101,118,101,114,90,6,97,108,119, - 97,121,115,114,101,0,0,0,114,96,0,0,0,114,97,0, - 0,0,122,22,98,121,116,101,99,111,100,101,32,105,115,32, - 115,116,97,108,101,32,102,111,114,32,122,16,99,111,109,112, - 105,108,101,100,32,109,111,100,117,108,101,32,122,21,32,105, - 115,32,110,111,116,32,97,32,99,111,100,101,32,111,98,106, - 101,99,116,41,18,114,21,0,0,0,90,13,95,99,108,97, - 115,115,105,102,121,95,112,121,99,218,4,95,105,109,112,90, - 21,99,104,101,99,107,95,104,97,115,104,95,98,97,115,101, - 100,95,112,121,99,115,218,15,95,103,101,116,95,112,121,99, - 95,115,111,117,114,99,101,218,11,115,111,117,114,99,101,95, - 104,97,115,104,90,17,95,82,65,87,95,77,65,71,73,67, - 95,78,85,77,66,69,82,90,18,95,118,97,108,105,100,97, - 116,101,95,104,97,115,104,95,112,121,99,218,29,95,103,101, - 116,95,109,116,105,109,101,95,97,110,100,95,115,105,122,101, - 95,111,102,95,115,111,117,114,99,101,114,149,0,0,0,114, - 2,0,0,0,114,45,0,0,0,114,80,0,0,0,218,7, - 109,97,114,115,104,97,108,90,5,108,111,97,100,115,114,15, - 0,0,0,218,10,95,99,111,100,101,95,116,121,112,101,218, - 9,84,121,112,101,69,114,114,111,114,41,14,114,32,0,0, - 0,114,57,0,0,0,114,66,0,0,0,114,38,0,0,0, - 114,128,0,0,0,90,11,101,120,99,95,100,101,116,97,105, - 108,115,114,131,0,0,0,90,10,104,97,115,104,95,98,97, - 115,101,100,90,12,99,104,101,99,107,95,115,111,117,114,99, - 101,90,12,115,111,117,114,99,101,95,98,121,116,101,115,114, - 152,0,0,0,90,12,115,111,117,114,99,101,95,109,116,105, - 109,101,90,11,115,111,117,114,99,101,95,115,105,122,101,114, - 50,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,15,95,117,110,109,97,114,115,104,97,108,95, - 99,111,100,101,107,2,0,0,115,72,0,0,0,2,2,2, - 1,6,254,14,5,12,2,4,1,12,1,10,1,2,1,2, - 255,8,1,2,255,10,2,8,1,4,1,4,1,2,1,4, - 254,4,5,8,1,6,255,8,4,6,255,4,3,22,3,18, - 1,2,255,4,2,8,1,4,255,4,2,18,2,10,1,16, - 1,4,1,255,128,114,157,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,67, - 0,0,0,115,28,0,0,0,124,0,160,0,100,1,100,2, - 161,2,125,0,124,0,160,0,100,3,100,2,161,2,125,0, - 124,0,83,0,41,4,78,115,2,0,0,0,13,10,243,1, - 0,0,0,10,243,1,0,0,0,13,41,1,114,19,0,0, - 0,41,1,218,6,115,111,117,114,99,101,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,23,95,110,111,114, - 109,97,108,105,122,101,95,108,105,110,101,95,101,110,100,105, - 110,103,115,152,2,0,0,115,8,0,0,0,12,1,12,1, - 4,1,255,128,114,161,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,0, - 0,0,115,24,0,0,0,116,0,124,1,131,1,125,1,116, - 1,124,1,124,0,100,1,100,2,100,3,141,4,83,0,41, - 4,78,114,78,0,0,0,84,41,1,90,12,100,111,110,116, - 95,105,110,104,101,114,105,116,41,2,114,161,0,0,0,218, - 7,99,111,109,112,105,108,101,41,2,114,57,0,0,0,114, - 160,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,15,95,99,111,109,112,105,108,101,95,115,111, - 117,114,99,101,159,2,0,0,115,6,0,0,0,8,1,16, - 1,255,128,114,163,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,11,0,0,0,67,0,0, - 0,115,68,0,0,0,116,0,160,1,124,0,100,1,63,0, - 100,2,23,0,124,0,100,3,63,0,100,4,64,0,124,0, - 100,5,64,0,124,1,100,6,63,0,124,1,100,3,63,0, - 100,7,64,0,124,1,100,5,64,0,100,8,20,0,100,9, - 100,9,100,9,102,9,161,1,83,0,41,10,78,233,9,0, - 0,0,105,188,7,0,0,233,5,0,0,0,233,15,0,0, - 0,233,31,0,0,0,233,11,0,0,0,233,63,0,0,0, - 114,88,0,0,0,114,14,0,0,0,41,2,114,133,0,0, - 0,90,6,109,107,116,105,109,101,41,2,218,1,100,114,140, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,14,95,112,97,114,115,101,95,100,111,115,116,105, - 109,101,165,2,0,0,115,20,0,0,0,4,1,10,1,10, - 1,6,1,6,1,10,1,10,1,6,1,6,249,255,128,114, - 171,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,6,0,0,0,10,0,0,0,67,0,0,0,115,110,0, - 0,0,122,82,124,1,100,1,100,0,133,2,25,0,100,2, - 118,0,115,22,74,0,130,1,124,1,100,0,100,1,133,2, - 25,0,125,1,124,0,106,0,124,1,25,0,125,2,124,2, - 100,3,25,0,125,3,124,2,100,4,25,0,125,4,124,2, - 100,5,25,0,125,5,116,1,124,4,124,3,131,2,124,5, - 102,2,87,0,83,0,4,0,116,2,116,3,116,4,102,3, - 121,108,1,0,1,0,1,0,89,0,100,6,83,0,119,0, - 41,7,78,114,14,0,0,0,169,2,218,1,99,218,1,111, - 114,165,0,0,0,233,6,0,0,0,233,3,0,0,0,41, - 2,114,0,0,0,0,114,0,0,0,0,41,5,114,28,0, - 0,0,114,171,0,0,0,114,26,0,0,0,218,10,73,110, - 100,101,120,69,114,114,111,114,114,156,0,0,0,41,6,114, - 32,0,0,0,114,13,0,0,0,114,58,0,0,0,114,133, - 0,0,0,114,134,0,0,0,90,17,117,110,99,111,109,112, - 114,101,115,115,101,100,95,115,105,122,101,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,114,153,0,0,0,178, - 2,0,0,115,22,0,0,0,2,1,20,2,12,1,10,1, - 8,3,8,1,8,1,16,1,18,1,8,1,255,128,114,153, + 100,4,141,2,130,1,124,10,160,5,100,5,161,1,125,11, + 116,6,124,11,131,1,100,5,107,3,114,128,116,7,100,6, + 131,1,130,1,124,11,100,0,100,7,133,2,25,0,100,8, + 107,3,114,162,116,0,100,9,124,0,155,2,157,2,124,0, + 100,4,141,2,130,1,116,8,124,11,100,10,100,11,133,2, + 25,0,131,1,125,12,116,8,124,11,100,11,100,5,133,2, + 25,0,131,1,125,13,100,5,124,12,23,0,124,13,23,0, + 125,14,124,6,124,14,55,0,125,6,122,14,124,10,160,3, + 124,6,161,1,1,0,87,0,110,32,4,0,116,4,144,1, + 121,130,1,0,1,0,1,0,116,0,100,3,124,0,155,2, + 157,2,124,0,100,4,141,2,130,1,124,10,160,5,124,4, + 161,1,125,15,116,6,124,15,131,1,124,4,107,3,144,1, + 114,38,116,4,100,12,131,1,130,1,87,0,100,0,4,0, + 4,0,131,3,1,0,110,18,49,0,144,1,115,60,119,1, + 1,0,1,0,1,0,89,0,1,0,124,3,100,1,107,2, + 144,1,114,84,124,15,83,0,122,10,116,9,131,0,125,16, + 87,0,110,22,4,0,116,10,144,1,121,128,1,0,1,0, + 1,0,116,0,100,13,131,1,130,1,124,16,124,15,100,14, + 131,2,83,0,119,0,119,0,119,0,41,15,78,114,0,0, + 0,0,122,18,110,101,103,97,116,105,118,101,32,100,97,116, + 97,32,115,105,122,101,114,94,0,0,0,114,12,0,0,0, + 114,106,0,0,0,114,100,0,0,0,114,95,0,0,0,115, + 4,0,0,0,80,75,3,4,122,23,98,97,100,32,108,111, + 99,97,108,32,102,105,108,101,32,104,101,97,100,101,114,58, + 32,233,26,0,0,0,114,105,0,0,0,122,26,122,105,112, + 105,109,112,111,114,116,58,32,99,97,110,39,116,32,114,101, + 97,100,32,100,97,116,97,114,141,0,0,0,105,241,255,255, + 255,41,11,114,3,0,0,0,114,112,0,0,0,114,113,0, + 0,0,114,114,0,0,0,114,22,0,0,0,114,116,0,0, + 0,114,55,0,0,0,114,121,0,0,0,114,1,0,0,0, + 114,146,0,0,0,114,145,0,0,0,41,17,114,29,0,0, + 0,114,58,0,0,0,90,8,100,97,116,97,112,97,116,104, + 114,132,0,0,0,114,136,0,0,0,114,127,0,0,0,114, + 139,0,0,0,114,133,0,0,0,114,134,0,0,0,114,135, + 0,0,0,114,125,0,0,0,114,126,0,0,0,114,137,0, + 0,0,114,138,0,0,0,114,129,0,0,0,90,8,114,97, + 119,95,100,97,116,97,114,143,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,56,0,0,0,53, + 2,0,0,115,70,0,0,0,20,1,8,1,8,1,14,2, + 2,2,14,1,14,1,18,1,10,1,12,1,8,1,16,2, + 18,2,16,2,16,1,12,1,8,1,2,1,14,1,14,1, + 18,1,10,1,14,1,40,1,10,2,4,2,2,3,10,1, + 14,1,8,1,10,1,2,254,2,243,2,240,255,128,114,56, 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,8,0,0,0,67,0,0,0,115,80,0,0, - 0,124,1,100,1,100,0,133,2,25,0,100,2,118,0,115, - 20,74,0,130,1,124,1,100,0,100,1,133,2,25,0,125, - 1,122,14,124,0,106,0,124,1,25,0,125,2,87,0,110, - 20,4,0,116,1,121,66,1,0,1,0,1,0,89,0,100, - 0,83,0,119,0,116,2,124,0,106,3,124,2,131,2,83, - 0,41,3,78,114,14,0,0,0,114,172,0,0,0,41,4, - 114,28,0,0,0,114,26,0,0,0,114,56,0,0,0,114, - 29,0,0,0,41,3,114,32,0,0,0,114,13,0,0,0, - 114,58,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,151,0,0,0,197,2,0,0,115,16,0, - 0,0,20,2,12,1,2,2,14,1,12,1,8,1,12,2, + 2,0,0,0,3,0,0,0,67,0,0,0,115,16,0,0, + 0,116,0,124,0,124,1,24,0,131,1,100,1,107,1,83, + 0,41,2,78,114,5,0,0,0,41,1,218,3,97,98,115, + 41,2,90,2,116,49,90,2,116,50,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,9,95,101,113,95,109, + 116,105,109,101,99,2,0,0,115,4,0,0,0,16,2,255, + 128,114,149,0,0,0,99,5,0,0,0,0,0,0,0,0, + 0,0,0,14,0,0,0,6,0,0,0,67,0,0,0,115, + 254,0,0,0,124,3,124,2,100,1,156,2,125,5,116,0, + 160,1,124,4,124,3,124,5,161,3,125,6,124,6,100,2, + 64,0,100,3,107,3,125,7,124,7,114,126,124,6,100,4, + 64,0,100,3,107,3,125,8,116,2,106,3,100,5,107,3, + 114,206,124,8,115,76,116,2,106,3,100,6,107,2,114,206, + 116,4,124,0,124,2,131,2,125,9,124,9,100,0,117,1, + 114,206,116,2,160,5,116,0,106,6,124,9,161,2,125,10, + 116,0,160,7,124,4,124,10,124,3,124,5,161,4,1,0, + 110,80,116,8,124,0,124,2,131,2,92,2,125,11,125,12, + 124,11,114,206,116,9,116,10,124,4,100,7,100,8,133,2, + 25,0,131,1,124,11,131,2,114,186,116,10,124,4,100,8, + 100,9,133,2,25,0,131,1,124,12,107,3,114,206,116,11, + 160,12,100,10,124,3,155,2,157,2,161,1,1,0,100,0, + 83,0,116,13,160,14,124,4,100,9,100,0,133,2,25,0, + 161,1,125,13,116,15,124,13,116,16,131,2,115,250,116,17, + 100,11,124,1,155,2,100,12,157,3,131,1,130,1,124,13, + 83,0,41,13,78,41,2,114,44,0,0,0,114,13,0,0, + 0,114,5,0,0,0,114,0,0,0,0,114,88,0,0,0, + 90,5,110,101,118,101,114,90,6,97,108,119,97,121,115,114, + 101,0,0,0,114,96,0,0,0,114,97,0,0,0,122,22, + 98,121,116,101,99,111,100,101,32,105,115,32,115,116,97,108, + 101,32,102,111,114,32,122,16,99,111,109,112,105,108,101,100, + 32,109,111,100,117,108,101,32,122,21,32,105,115,32,110,111, + 116,32,97,32,99,111,100,101,32,111,98,106,101,99,116,41, + 18,114,21,0,0,0,90,13,95,99,108,97,115,115,105,102, + 121,95,112,121,99,218,4,95,105,109,112,90,21,99,104,101, + 99,107,95,104,97,115,104,95,98,97,115,101,100,95,112,121, + 99,115,218,15,95,103,101,116,95,112,121,99,95,115,111,117, + 114,99,101,218,11,115,111,117,114,99,101,95,104,97,115,104, + 90,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, + 66,69,82,90,18,95,118,97,108,105,100,97,116,101,95,104, + 97,115,104,95,112,121,99,218,29,95,103,101,116,95,109,116, + 105,109,101,95,97,110,100,95,115,105,122,101,95,111,102,95, + 115,111,117,114,99,101,114,149,0,0,0,114,2,0,0,0, + 114,45,0,0,0,114,80,0,0,0,218,7,109,97,114,115, + 104,97,108,90,5,108,111,97,100,115,114,15,0,0,0,218, + 10,95,99,111,100,101,95,116,121,112,101,218,9,84,121,112, + 101,69,114,114,111,114,41,14,114,32,0,0,0,114,57,0, + 0,0,114,66,0,0,0,114,38,0,0,0,114,128,0,0, + 0,90,11,101,120,99,95,100,101,116,97,105,108,115,114,131, + 0,0,0,90,10,104,97,115,104,95,98,97,115,101,100,90, + 12,99,104,101,99,107,95,115,111,117,114,99,101,90,12,115, + 111,117,114,99,101,95,98,121,116,101,115,114,152,0,0,0, + 90,12,115,111,117,114,99,101,95,109,116,105,109,101,90,11, + 115,111,117,114,99,101,95,115,105,122,101,114,50,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 15,95,117,110,109,97,114,115,104,97,108,95,99,111,100,101, + 107,2,0,0,115,72,0,0,0,2,2,2,1,6,254,14, + 5,12,2,4,1,12,1,10,1,2,1,2,255,8,1,2, + 255,10,2,8,1,4,1,4,1,2,1,4,254,4,5,8, + 1,6,255,8,4,6,255,4,3,22,3,18,1,2,255,4, + 2,8,1,4,255,4,2,18,2,10,1,16,1,4,1,255, + 128,114,157,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, + 28,0,0,0,124,0,160,0,100,1,100,2,161,2,125,0, + 124,0,160,0,100,3,100,2,161,2,125,0,124,0,83,0, + 41,4,78,115,2,0,0,0,13,10,243,1,0,0,0,10, + 243,1,0,0,0,13,41,1,114,19,0,0,0,41,1,218, + 6,115,111,117,114,99,101,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,23,95,110,111,114,109,97,108,105, + 122,101,95,108,105,110,101,95,101,110,100,105,110,103,115,152, + 2,0,0,115,8,0,0,0,12,1,12,1,4,1,255,128, + 114,161,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,6,0,0,0,67,0,0,0,115,24, + 0,0,0,116,0,124,1,131,1,125,1,116,1,124,1,124, + 0,100,1,100,2,100,3,141,4,83,0,41,4,78,114,78, + 0,0,0,84,41,1,90,12,100,111,110,116,95,105,110,104, + 101,114,105,116,41,2,114,161,0,0,0,218,7,99,111,109, + 112,105,108,101,41,2,114,57,0,0,0,114,160,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 15,95,99,111,109,112,105,108,101,95,115,111,117,114,99,101, + 159,2,0,0,115,6,0,0,0,8,1,16,1,255,128,114, + 163,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,11,0,0,0,67,0,0,0,115,68,0, + 0,0,116,0,160,1,124,0,100,1,63,0,100,2,23,0, + 124,0,100,3,63,0,100,4,64,0,124,0,100,5,64,0, + 124,1,100,6,63,0,124,1,100,3,63,0,100,7,64,0, + 124,1,100,5,64,0,100,8,20,0,100,9,100,9,100,9, + 102,9,161,1,83,0,41,10,78,233,9,0,0,0,105,188, + 7,0,0,233,5,0,0,0,233,15,0,0,0,233,31,0, + 0,0,233,11,0,0,0,233,63,0,0,0,114,88,0,0, + 0,114,14,0,0,0,41,2,114,133,0,0,0,90,6,109, + 107,116,105,109,101,41,2,218,1,100,114,140,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,14, + 95,112,97,114,115,101,95,100,111,115,116,105,109,101,165,2, + 0,0,115,20,0,0,0,4,1,10,1,10,1,6,1,6, + 1,10,1,10,1,6,1,6,249,255,128,114,171,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,10,0,0,0,67,0,0,0,115,110,0,0,0,122,82, + 124,1,100,1,100,0,133,2,25,0,100,2,118,0,115,22, + 74,0,130,1,124,1,100,0,100,1,133,2,25,0,125,1, + 124,0,106,0,124,1,25,0,125,2,124,2,100,3,25,0, + 125,3,124,2,100,4,25,0,125,4,124,2,100,5,25,0, + 125,5,116,1,124,4,124,3,131,2,124,5,102,2,87,0, + 83,0,4,0,116,2,116,3,116,4,102,3,121,108,1,0, + 1,0,1,0,89,0,100,6,83,0,119,0,41,7,78,114, + 14,0,0,0,169,2,218,1,99,218,1,111,114,165,0,0, + 0,233,6,0,0,0,233,3,0,0,0,41,2,114,0,0, + 0,0,114,0,0,0,0,41,5,114,28,0,0,0,114,171, + 0,0,0,114,26,0,0,0,218,10,73,110,100,101,120,69, + 114,114,111,114,114,156,0,0,0,41,6,114,32,0,0,0, + 114,13,0,0,0,114,58,0,0,0,114,133,0,0,0,114, + 134,0,0,0,90,17,117,110,99,111,109,112,114,101,115,115, + 101,100,95,115,105,122,101,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,114,153,0,0,0,178,2,0,0,115, + 24,0,0,0,2,1,20,2,12,1,10,1,8,3,8,1, + 8,1,16,1,18,1,6,1,2,255,255,128,114,153,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,8,0,0,0,67,0,0,0,115,80,0,0,0,124, + 1,100,1,100,0,133,2,25,0,100,2,118,0,115,20,74, + 0,130,1,124,1,100,0,100,1,133,2,25,0,125,1,122, + 14,124,0,106,0,124,1,25,0,125,2,87,0,110,18,4, + 0,116,1,121,78,1,0,1,0,1,0,89,0,100,0,83, + 0,116,2,124,0,106,3,124,2,131,2,83,0,119,0,41, + 3,78,114,14,0,0,0,114,172,0,0,0,41,4,114,28, + 0,0,0,114,26,0,0,0,114,56,0,0,0,114,29,0, + 0,0,41,3,114,32,0,0,0,114,13,0,0,0,114,58, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,151,0,0,0,197,2,0,0,115,18,0,0,0, + 20,2,12,1,2,2,14,1,12,1,6,1,12,2,2,253, 255,128,114,151,0,0,0,99,2,0,0,0,0,0,0,0, 0,0,0,0,14,0,0,0,11,0,0,0,67,0,0,0, - 115,16,1,0,0,116,0,124,0,124,1,131,2,125,2,100, + 115,18,1,0,0,116,0,124,0,124,1,131,2,125,2,100, 0,125,3,116,1,68,0,93,204,92,3,125,4,125,5,125, 6,124,2,124,4,23,0,125,7,116,2,106,3,100,1,124, 0,106,4,116,5,124,7,100,2,100,3,141,5,1,0,122, 14,124,0,106,6,124,7,25,0,125,8,87,0,110,18,4, - 0,116,7,121,90,1,0,1,0,1,0,89,0,113,18,119, - 0,124,8,100,4,25,0,125,9,116,8,124,0,106,4,124, + 0,116,7,144,1,121,16,1,0,1,0,1,0,89,0,113, + 18,124,8,100,4,25,0,125,9,116,8,124,0,106,4,124, 8,131,2,125,10,100,0,125,11,124,5,114,182,122,20,116, 9,124,0,124,9,124,7,124,1,124,10,131,5,125,11,87, 0,110,50,4,0,116,10,144,1,121,14,1,0,125,12,1, @@ -979,51 +982,52 @@ const unsigned char _Py_M__zipimport[] = { 0,1,0,83,0,124,3,114,252,100,5,124,3,155,0,157, 2,125,13,116,12,124,13,124,1,100,6,141,2,124,3,130, 2,116,12,100,7,124,1,155,2,157,2,124,1,100,6,141, - 2,130,1,119,0,41,8,78,122,13,116,114,121,105,110,103, - 32,123,125,123,125,123,125,114,88,0,0,0,41,1,90,9, - 118,101,114,98,111,115,105,116,121,114,0,0,0,0,122,20, - 109,111,100,117,108,101,32,108,111,97,100,32,102,97,105,108, - 101,100,58,32,114,62,0,0,0,114,61,0,0,0,41,13, - 114,36,0,0,0,114,91,0,0,0,114,45,0,0,0,114, - 80,0,0,0,114,29,0,0,0,114,20,0,0,0,114,28, - 0,0,0,114,26,0,0,0,114,56,0,0,0,114,157,0, - 0,0,114,79,0,0,0,114,163,0,0,0,114,3,0,0, - 0,41,14,114,32,0,0,0,114,38,0,0,0,114,13,0, - 0,0,90,12,105,109,112,111,114,116,95,101,114,114,111,114, - 114,92,0,0,0,114,93,0,0,0,114,51,0,0,0,114, - 66,0,0,0,114,58,0,0,0,114,40,0,0,0,114,128, - 0,0,0,114,50,0,0,0,90,3,101,120,99,114,81,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,48,0,0,0,212,2,0,0,115,58,0,0,0,10, - 1,4,1,14,1,8,1,22,1,2,1,14,1,12,1,6, - 1,8,2,12,1,4,1,4,1,2,1,20,1,16,1,16, - 1,8,128,10,2,8,1,2,3,8,1,14,1,4,2,10, - 1,14,1,18,2,2,241,255,128,114,48,0,0,0,41,46, - 114,86,0,0,0,90,26,95,102,114,111,122,101,110,95,105, - 109,112,111,114,116,108,105,98,95,101,120,116,101,114,110,97, - 108,114,21,0,0,0,114,1,0,0,0,114,2,0,0,0, - 90,17,95,102,114,111,122,101,110,95,105,109,112,111,114,116, - 108,105,98,114,45,0,0,0,114,150,0,0,0,114,112,0, - 0,0,114,154,0,0,0,114,71,0,0,0,114,133,0,0, - 0,114,69,0,0,0,90,7,95,95,97,108,108,95,95,114, - 20,0,0,0,90,15,112,97,116,104,95,115,101,112,97,114, - 97,116,111,114,115,114,18,0,0,0,114,79,0,0,0,114, - 3,0,0,0,114,25,0,0,0,218,4,116,121,112,101,114, - 74,0,0,0,114,115,0,0,0,114,117,0,0,0,114,119, - 0,0,0,90,13,95,76,111,97,100,101,114,66,97,115,105, - 99,115,114,4,0,0,0,114,91,0,0,0,114,36,0,0, - 0,114,37,0,0,0,114,35,0,0,0,114,27,0,0,0, - 114,124,0,0,0,114,144,0,0,0,114,146,0,0,0,114, - 56,0,0,0,114,149,0,0,0,114,157,0,0,0,218,8, - 95,95,99,111,100,101,95,95,114,155,0,0,0,114,161,0, - 0,0,114,163,0,0,0,114,171,0,0,0,114,153,0,0, - 0,114,151,0,0,0,114,48,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 8,60,109,111,100,117,108,101,62,1,0,0,0,115,92,0, - 0,0,4,0,8,16,16,1,8,1,8,1,8,1,8,1, - 8,1,8,1,8,1,8,2,6,3,14,1,16,3,4,4, - 8,2,4,2,4,1,4,1,18,2,0,127,0,127,12,34, - 12,1,2,1,2,1,4,252,8,9,8,4,8,9,8,31, - 2,126,2,254,4,29,8,5,8,21,8,46,8,8,10,40, - 8,5,8,7,8,6,8,13,8,19,12,15,255,128, + 2,130,1,119,0,119,0,41,8,78,122,13,116,114,121,105, + 110,103,32,123,125,123,125,123,125,114,88,0,0,0,41,1, + 90,9,118,101,114,98,111,115,105,116,121,114,0,0,0,0, + 122,20,109,111,100,117,108,101,32,108,111,97,100,32,102,97, + 105,108,101,100,58,32,114,62,0,0,0,114,61,0,0,0, + 41,13,114,36,0,0,0,114,91,0,0,0,114,45,0,0, + 0,114,80,0,0,0,114,29,0,0,0,114,20,0,0,0, + 114,28,0,0,0,114,26,0,0,0,114,56,0,0,0,114, + 157,0,0,0,114,79,0,0,0,114,163,0,0,0,114,3, + 0,0,0,41,14,114,32,0,0,0,114,38,0,0,0,114, + 13,0,0,0,90,12,105,109,112,111,114,116,95,101,114,114, + 111,114,114,92,0,0,0,114,93,0,0,0,114,51,0,0, + 0,114,66,0,0,0,114,58,0,0,0,114,40,0,0,0, + 114,128,0,0,0,114,50,0,0,0,90,3,101,120,99,114, + 81,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,114,48,0,0,0,212,2,0,0,115,60,0,0, + 0,10,1,4,1,14,1,8,1,22,1,2,1,14,1,14, + 1,4,1,8,2,12,1,4,1,4,1,2,1,20,1,16, + 1,16,1,8,128,10,2,8,1,2,3,8,1,14,1,4, + 2,10,1,14,1,18,2,2,241,2,247,255,128,114,48,0, + 0,0,41,46,114,86,0,0,0,90,26,95,102,114,111,122, + 101,110,95,105,109,112,111,114,116,108,105,98,95,101,120,116, + 101,114,110,97,108,114,21,0,0,0,114,1,0,0,0,114, + 2,0,0,0,90,17,95,102,114,111,122,101,110,95,105,109, + 112,111,114,116,108,105,98,114,45,0,0,0,114,150,0,0, + 0,114,112,0,0,0,114,154,0,0,0,114,71,0,0,0, + 114,133,0,0,0,114,69,0,0,0,90,7,95,95,97,108, + 108,95,95,114,20,0,0,0,90,15,112,97,116,104,95,115, + 101,112,97,114,97,116,111,114,115,114,18,0,0,0,114,79, + 0,0,0,114,3,0,0,0,114,25,0,0,0,218,4,116, + 121,112,101,114,74,0,0,0,114,115,0,0,0,114,117,0, + 0,0,114,119,0,0,0,90,13,95,76,111,97,100,101,114, + 66,97,115,105,99,115,114,4,0,0,0,114,91,0,0,0, + 114,36,0,0,0,114,37,0,0,0,114,35,0,0,0,114, + 27,0,0,0,114,124,0,0,0,114,144,0,0,0,114,146, + 0,0,0,114,56,0,0,0,114,149,0,0,0,114,157,0, + 0,0,218,8,95,95,99,111,100,101,95,95,114,155,0,0, + 0,114,161,0,0,0,114,163,0,0,0,114,171,0,0,0, + 114,153,0,0,0,114,151,0,0,0,114,48,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,0, + 0,115,92,0,0,0,4,0,8,16,16,1,8,1,8,1, + 8,1,8,1,8,1,8,1,8,1,8,2,6,3,14,1, + 16,3,4,4,8,2,4,2,4,1,4,1,18,2,0,127, + 0,127,12,34,12,1,2,1,2,1,4,252,8,9,8,4, + 8,9,8,31,2,126,2,254,4,29,8,5,8,21,8,46, + 8,8,10,40,8,5,8,7,8,6,8,13,8,19,12,15, + 255,128, }; From dbfe68d1503208dfb6dcc5a207dda29a96f05463 Mon Sep 17 00:00:00 2001 From: Fernando Toledo <42938011+fernandohtr@users.noreply.github.com> Date: Mon, 21 Dec 2020 11:06:31 -0300 Subject: [PATCH 0846/1261] Fix typo in docstring (GH-23515) --- Lib/http/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/http/client.py b/Lib/http/client.py index a54679cf84d18a..4eca93ef2685ad 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -861,7 +861,7 @@ def set_tunnel(self, host, port=None, headers=None): the endpoint passed to `set_tunnel`. This done by sending an HTTP CONNECT request to the proxy server when the connection is established. - This method must be called before the HTML connection has been + This method must be called before the HTTP connection has been established. The headers argument should be a mapping of extra HTTP headers to send From 5959ec114d448bb99578134b075b6e7fa016b8b7 Mon Sep 17 00:00:00 2001 From: AMIR <31338382+amiremohamadi@users.noreply.github.com> Date: Tue, 22 Dec 2020 03:15:50 +0330 Subject: [PATCH 0847/1261] bpo-42008: Fix internal _random.Random() seeding for the one argument case (GH-22668) --- Lib/test/test_random.py | 9 +++++++++ .../2020-10-12-14-51-59.bpo-42008.ijWw2I.rst | 1 + Modules/_randommodule.c | 13 ++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-12-14-51-59.bpo-42008.ijWw2I.rst diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 327bfa3bbda1bd..e7f911d12875e1 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -414,6 +414,15 @@ def test_bug_41052(self): r = _random.Random() self.assertRaises(TypeError, pickle.dumps, r, proto) + @test.support.cpython_only + def test_bug_42008(self): + # _random.Random should call seed with first element of arg tuple + import _random + r1 = _random.Random() + r1.seed(8675309) + r2 = _random.Random(8675309) + self.assertEqual(r1.random(), r2.random()) + def test_bug_1727780(self): # verify that version-2-pickles can be loaded # fine, whether they are created on 32-bit or 64-bit diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-12-14-51-59.bpo-42008.ijWw2I.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-12-14-51-59.bpo-42008.ijWw2I.rst new file mode 100644 index 00000000000000..1b50a0ef3b02d6 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-12-14-51-59.bpo-42008.ijWw2I.rst @@ -0,0 +1 @@ +Fix _random.Random() seeding. diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index ad4fd474428d4b..99be69c06556e6 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -519,6 +519,7 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { RandomObject *self; PyObject *tmp; + PyObject *arg = NULL; _randomstate *state = _randomstate_type(type); if (type == (PyTypeObject*)state->Random_Type && @@ -529,12 +530,22 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds) self = (RandomObject *)PyType_GenericAlloc(type, 0); if (self == NULL) return NULL; - tmp = random_seed(self, args); + + if (PyTuple_GET_SIZE(args) > 1) { + PyErr_SetString(PyExc_TypeError, "Random() requires 0 or 1 argument"); + return NULL; + } + + if (PyTuple_GET_SIZE(args) == 1) + arg = PyTuple_GET_ITEM(args, 0); + + tmp = random_seed(self, arg); if (tmp == NULL) { Py_DECREF(self); return NULL; } Py_DECREF(tmp); + return (PyObject *)self; } From e93e4235782f082616e7c12369784eb9b6738fad Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Tue, 22 Dec 2020 03:15:40 +0300 Subject: [PATCH 0848/1261] bpo-39159: Declare error that might be raised from literal_eval (GH-19899) --- Doc/library/ast.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 8a5c6ec5f1279d..9149a53e0dca8f 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -1576,7 +1576,7 @@ and classes for traversing abstract syntax trees: Safely evaluate an expression node or a string containing a Python literal or container display. The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, - dicts, sets, booleans, and ``None``. + dicts, sets, booleans, ``None`` and ``Ellipsis``. This can be used for safely evaluating strings containing Python values from untrusted sources without the need to parse the values oneself. It is not @@ -1588,6 +1588,10 @@ and classes for traversing abstract syntax trees: sufficiently large/complex string due to stack depth limitations in Python's AST compiler. + It can raise :exc:`ValueError`, :exc:`TypeError`, :exc:`SyntaxError`, + :exc:`MemoryError` and :exc:`RecursionError` depending on the malformed + input. + .. versionchanged:: 3.2 Now allows bytes and set literals. From 243aa8fff73419cfad5ad7d1c74827419536525e Mon Sep 17 00:00:00 2001 From: erykoff Date: Tue, 22 Dec 2020 03:12:07 -0800 Subject: [PATCH 0849/1261] bpo-42688: Fix ffi alloc/free when using external libffi on macos (GH-23868) Automerge-Triggered-By: GH:ronaldoussoren --- Modules/_ctypes/malloc_closure.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Modules/_ctypes/malloc_closure.c b/Modules/_ctypes/malloc_closure.c index 4f220e42ff3fcc..788bae6a96c7f4 100644 --- a/Modules/_ctypes/malloc_closure.c +++ b/Modules/_ctypes/malloc_closure.c @@ -91,11 +91,15 @@ static void more_core(void) /* put the item back into the free list */ void Py_ffi_closure_free(void *p) { -#if USING_APPLE_OS_LIBFFI && HAVE_FFI_CLOSURE_ALLOC +#if HAVE_FFI_CLOSURE_ALLOC +#if USING_APPLE_OS_LIBFFI if (__builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *)) { +#endif ffi_closure_free(p); return; +#if USING_APPLE_OS_LIBFFI } +#endif #endif ITEM *item = (ITEM *)p; item->next = free_list; @@ -105,10 +109,14 @@ void Py_ffi_closure_free(void *p) /* return one item from the free list, allocating more if needed */ void *Py_ffi_closure_alloc(size_t size, void** codeloc) { -#if USING_APPLE_OS_LIBFFI && HAVE_FFI_CLOSURE_ALLOC +#if HAVE_FFI_CLOSURE_ALLOC +#if USING_APPLE_OS_LIBFFI if (__builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *)) { +#endif return ffi_closure_alloc(size, codeloc); +#if USING_APPLE_OS_LIBFFI } +#endif #endif ITEM *item; if (!free_list) From dd643cb32d202f0e02e57451c8bbbdf9731b24eb Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Tue, 22 Dec 2020 13:02:52 -0300 Subject: [PATCH 0850/1261] [doc] Fix missing commas in signatures (#23693) * Fix star in signatures * Fix comma in signatures --- Doc/library/datetime.rst | 4 ++-- Doc/library/email.contentmanager.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 508bc88e7f4b8a..dae0dd7aa55898 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -1219,7 +1219,7 @@ Instance methods: .. method:: datetime.replace(year=self.year, month=self.month, day=self.day, \ hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, \ - tzinfo=self.tzinfo, * fold=0) + tzinfo=self.tzinfo, *, fold=0) Return a datetime with the same attributes, except for those attributes given new values by whichever keyword arguments are specified. Note that @@ -1783,7 +1783,7 @@ Other constructor: Instance methods: .. method:: time.replace(hour=self.hour, minute=self.minute, second=self.second, \ - microsecond=self.microsecond, tzinfo=self.tzinfo, * fold=0) + microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0) Return a :class:`.time` with the same value, except for those attributes given new values by whichever keyword arguments are specified. Note that diff --git a/Doc/library/email.contentmanager.rst b/Doc/library/email.contentmanager.rst index e09c7c0e402bbc..918fc55677e723 100644 --- a/Doc/library/email.contentmanager.rst +++ b/Doc/library/email.contentmanager.rst @@ -116,7 +116,7 @@ Currently the email package provides only one concrete content manager, decoding the payload to unicode. The default error handler is ``replace``. - .. method:: set_content(msg, <'str'>, subtype="plain", charset='utf-8' \ + .. method:: set_content(msg, <'str'>, subtype="plain", charset='utf-8', \ cte=None, \ disposition=None, filename=None, cid=None, \ params=None, headers=None) From 0d94c83256e1c5e86bb186f6d9709e668138ae4c Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 22 Dec 2020 09:24:26 -0800 Subject: [PATCH 0851/1261] bpo-29030: Document interaction between *choices* and *metavar*. (GH-23884) --- Doc/library/argparse.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 1a298cdd2b5344..4542961d7816ea 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1152,6 +1152,11 @@ Any container can be passed as the *choices* value, so :class:`list` objects, Use of :class:`enum.Enum` is not recommended because it is difficult to control its appearance in usage, help, and error messages. +Formatted choices overrides the default *metavar* which is normally derived +from *dest*. This is usually what you want because the user never sees the +*dest* parameter. If this display isn't desirable (perhaps because there are +many choices), just specify an explicit metavar_. + required ^^^^^^^^ From fbe70a736b05e3179fe86c14e6addc55fb06c5bb Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Tue, 22 Dec 2020 19:53:09 +0000 Subject: [PATCH 0852/1261] bpo-34463: Make python tracebacks identical to C tracebacks for SyntaxErrors without a lineno (GH-23427) --- Lib/test/test_traceback.py | 25 +++++++++++++++++++ Lib/traceback.py | 14 +++++++---- .../2020-11-20-19-00-27.bpo-34463.aJcm56.rst | 1 + 3 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-11-20-19-00-27.bpo-34463.aJcm56.rst diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 5df701caf0f01e..abb5762cd43efb 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -687,6 +687,31 @@ def e(): msg = self.get_report(e).splitlines() self.assertEqual(msg[-2], ' ^') + def test_syntax_error_no_lineno(self): + # See #34463. + + # Without filename + e = SyntaxError('bad syntax') + msg = self.get_report(e).splitlines() + self.assertEqual(msg, + ['SyntaxError: bad syntax']) + e.lineno = 100 + msg = self.get_report(e).splitlines() + self.assertEqual(msg, + [' File "", line 100', 'SyntaxError: bad syntax']) + + # With filename + e = SyntaxError('bad syntax') + e.filename = 'myfile.py' + + msg = self.get_report(e).splitlines() + self.assertEqual(msg, + ['SyntaxError: bad syntax (myfile.py)']) + e.lineno = 100 + msg = self.get_report(e).splitlines() + self.assertEqual(msg, + [' File "myfile.py", line 100', 'SyntaxError: bad syntax']) + def test_message_none(self): # A message that looks like "None" should not be treated specially err = self.get_report(Exception(None)) diff --git a/Lib/traceback.py b/Lib/traceback.py index 457d92511af051..4e008bc0e081a3 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -525,7 +525,8 @@ def __init__(self, exc_type, exc_value, exc_traceback, *, limit=None, if exc_type and issubclass(exc_type, SyntaxError): # Handle SyntaxError's specially self.filename = exc_value.filename - self.lineno = str(exc_value.lineno) + lno = exc_value.lineno + self.lineno = str(lno) if lno is not None else None self.text = exc_value.text self.offset = exc_value.offset self.msg = exc_value.msg @@ -584,9 +585,12 @@ def format_exception_only(self): def _format_syntax_error(self, stype): """Format SyntaxError exceptions (internal helper).""" # Show exactly where the problem was found. - filename = self.filename or "" - lineno = str(self.lineno) or '?' - yield ' File "{}", line {}\n'.format(filename, lineno) + filename_suffix = '' + if self.lineno is not None: + yield ' File "{}", line {}\n'.format( + self.filename or "", self.lineno) + elif self.filename is not None: + filename_suffix = ' ({})'.format(self.filename) text = self.text if text is not None: @@ -604,7 +608,7 @@ def _format_syntax_error(self, stype): caretspace = ((c if c.isspace() else ' ') for c in ltext[:caret]) yield ' {}^\n'.format(''.join(caretspace)) msg = self.msg or "" - yield "{}: {}\n".format(stype, msg) + yield "{}: {}{}\n".format(stype, msg, filename_suffix) def format(self, *, chain=True): """Format the exception. diff --git a/Misc/NEWS.d/next/Library/2020-11-20-19-00-27.bpo-34463.aJcm56.rst b/Misc/NEWS.d/next/Library/2020-11-20-19-00-27.bpo-34463.aJcm56.rst new file mode 100644 index 00000000000000..df183548236afb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-20-19-00-27.bpo-34463.aJcm56.rst @@ -0,0 +1 @@ +Fixed discrepancy between :mod:`traceback` and the interpreter in formatting of SyntaxError with lineno not set (:mod:`traceback` was changed to match interpreter). From 0e36c46e56a38926856434d0e0a75d6fdcb6a2b1 Mon Sep 17 00:00:00 2001 From: Joannah Nanjekye <33177550+nanjekyejoannah@users.noreply.github.com> Date: Tue, 22 Dec 2020 18:31:46 -0400 Subject: [PATCH 0853/1261] Fix typos in sysmodule (GH-23883) --- Python/sysmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Python/sysmodule.c b/Python/sysmodule.c index b80d37df42c808..720532eade29b3 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1907,12 +1907,12 @@ sys__debugmallocstats_impl(PyObject *module) } #ifdef Py_TRACE_REFS -/* Defined in objects.c because it uses static globals if that file */ +/* Defined in objects.c because it uses static globals in that file */ extern PyObject *_Py_GetObjects(PyObject *, PyObject *); #endif #ifdef DYNAMIC_EXECUTION_PROFILE -/* Defined in ceval.c because it uses static globals if that file */ +/* Defined in ceval.c because it uses static globals in that file */ extern PyObject *_Py_GetDXProfile(PyObject *, PyObject *); #endif From 7640e0578a03bdb3f4ef1c6b078d13cb9fba9f63 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Dec 2020 03:41:08 +0100 Subject: [PATCH 0854/1261] bpo-39465: Add pycore_atomic_funcs.h header (GH-20766) Add pycore_atomic_funcs.h internal header file: similar to pycore_atomic.h but don't require to declare variables as atomic. Add _Py_atomic_size_get() and _Py_atomic_size_set() functions. --- Include/internal/pycore_atomic.h | 6 +- Include/internal/pycore_atomic_funcs.h | 94 ++++++++++++++++++++++++++ Makefile.pre.in | 1 + Modules/_testinternalcapi.c | 13 ++++ PCbuild/pythoncore.vcxproj | 1 + PCbuild/pythoncore.vcxproj.filters | 3 + configure | 12 ++-- configure.ac | 11 +-- pyconfig.h.in | 8 +-- 9 files changed, 132 insertions(+), 17 deletions(-) create mode 100644 Include/internal/pycore_atomic_funcs.h diff --git a/Include/internal/pycore_atomic.h b/Include/internal/pycore_atomic.h index 1d5c5621677eb3..3d42e54464c4c7 100644 --- a/Include/internal/pycore_atomic.h +++ b/Include/internal/pycore_atomic.h @@ -11,8 +11,8 @@ extern "C" { #include "dynamic_annotations.h" /* _Py_ANNOTATE_MEMORY_ORDER */ #include "pyconfig.h" -#if defined(HAVE_STD_ATOMIC) -#include +#ifdef HAVE_STD_ATOMIC +# include #endif @@ -62,7 +62,7 @@ typedef struct _Py_atomic_int { #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ atomic_load_explicit(&((ATOMIC_VAL)->_value), ORDER) -/* Use builtin atomic operations in GCC >= 4.7 */ +// Use builtin atomic operations in GCC >= 4.7 and clang #elif defined(HAVE_BUILTIN_ATOMIC) typedef enum _Py_memory_order { diff --git a/Include/internal/pycore_atomic_funcs.h b/Include/internal/pycore_atomic_funcs.h new file mode 100644 index 00000000000000..a708789cea733b --- /dev/null +++ b/Include/internal/pycore_atomic_funcs.h @@ -0,0 +1,94 @@ +/* Atomic functions: similar to pycore_atomic.h, but don't need + to declare variables as atomic. + + Py_ssize_t type: + + * value = _Py_atomic_size_get(&var) + * _Py_atomic_size_set(&var, value) + + Use sequentially-consistent ordering (__ATOMIC_SEQ_CST memory order): + enforce total ordering with all other atomic functions. +*/ +#ifndef Py_ATOMIC_FUNC_H +#define Py_ATOMIC_FUNC_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#if defined(_MSC_VER) +# include // _InterlockedExchange() +#endif + + +// Use builtin atomic operations in GCC >= 4.7 and clang +#ifdef HAVE_BUILTIN_ATOMIC + +static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) +{ + return __atomic_load_n(var, __ATOMIC_SEQ_CST); +} + +static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) +{ + __atomic_store_n(var, value, __ATOMIC_SEQ_CST); +} + +#elif defined(_MSC_VER) + +static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) +{ +#if SIZEOF_VOID_P == 8 + Py_BUILD_ASSERT(sizeof(__int64) == sizeof(*var)); + volatile __int64 *volatile_var = (volatile __int64 *)var; + __int64 old; + do { + old = *volatile_var; + } while(_InterlockedCompareExchange64(volatile_var, old, old) != old); +#else + Py_BUILD_ASSERT(sizeof(long) == sizeof(*var)); + volatile long *volatile_var = (volatile long *)var; + long old; + do { + old = *volatile_var; + } while(_InterlockedCompareExchange(volatile_var, old, old) != old); +#endif + return old; +} + +static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) +{ +#if SIZEOF_VOID_P == 8 + Py_BUILD_ASSERT(sizeof(__int64) == sizeof(*var)); + volatile __int64 *volatile_var = (volatile __int64 *)var; + _InterlockedExchange64(volatile_var, value); +#else + Py_BUILD_ASSERT(sizeof(long) == sizeof(*var)); + volatile long *volatile_var = (volatile long *)var; + _InterlockedExchange(volatile_var, value); +#endif +} + +#else +// Fallback implementation using volatile + +static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) +{ + volatile Py_ssize_t *volatile_var = (volatile Py_ssize_t *)var; + return *volatile_var; +} + +static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) +{ + volatile Py_ssize_t *volatile_var = (volatile Py_ssize_t *)var; + *volatile_var = value; +} +#endif + +#ifdef __cplusplus +} +#endif +#endif /* Py_ATOMIC_FUNC_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 69ed251936a605..5c93b0b3fa9c60 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1111,6 +1111,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_abstract.h \ $(srcdir)/Include/internal/pycore_accu.h \ $(srcdir)/Include/internal/pycore_atomic.h \ + $(srcdir)/Include/internal/pycore_atomic_funcs.h \ $(srcdir)/Include/internal/pycore_bitutils.h \ $(srcdir)/Include/internal/pycore_bytes_methods.h \ $(srcdir)/Include/internal/pycore_call.h \ diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index df4725ea0a1c82..ab6c5965d1661b 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -12,6 +12,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_atomic_funcs.h" // _Py_atomic_int_get() #include "pycore_bitutils.h" // _Py_bswap32() #include "pycore_gc.h" // PyGC_Head #include "pycore_hashtable.h" // _Py_hashtable_new() @@ -267,6 +268,17 @@ test_set_config(PyObject *Py_UNUSED(self), PyObject *dict) } +static PyObject* +test_atomic_funcs(PyObject *self, PyObject *Py_UNUSED(args)) +{ + // Test _Py_atomic_size_get() and _Py_atomic_size_set() + Py_ssize_t var = 1; + _Py_atomic_size_set(&var, 2); + assert(_Py_atomic_size_get(&var) == 2); + Py_RETURN_NONE; +} + + static PyMethodDef TestMethods[] = { {"get_configs", get_configs, METH_NOARGS}, {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, @@ -276,6 +288,7 @@ static PyMethodDef TestMethods[] = { {"test_hashtable", test_hashtable, METH_NOARGS}, {"get_config", test_get_config, METH_NOARGS}, {"set_config", test_set_config, METH_O}, + {"test_atomic_funcs", test_atomic_funcs, METH_NOARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index bbceb025c0c22e..fd27dea9daec71 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -168,6 +168,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index ee1aa90bf76886..75a653dcbdab29 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -486,6 +486,9 @@ Include\internal + + Include + Include\internal diff --git a/configure b/configure index f07edfff266a0e..530c04a0edee3e 100755 --- a/configure +++ b/configure @@ -15429,6 +15429,7 @@ _ACEOF fi + EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX} { $as_echo "$as_me:${as_lineno-$LINENO}: checking LDVERSION" >&5 @@ -17095,16 +17096,17 @@ $as_echo "#define HAVE_STD_ATOMIC 1" >>confdefs.h fi -# Check for GCC >= 4.7 __atomic builtins -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GCC >= 4.7 __atomic builtins" >&5 -$as_echo_n "checking for GCC >= 4.7 __atomic builtins... " >&6; } +# Check for GCC >= 4.7 and clang __atomic builtin functions +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for builtin __atomic_load_n and __atomic_store_n functions" >&5 +$as_echo_n "checking for builtin __atomic_load_n and __atomic_store_n functions... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - volatile int val = 1; + int val; int main() { - __atomic_load_n(&val, __ATOMIC_SEQ_CST); + __atomic_store_n(&val, 1, __ATOMIC_SEQ_CST); + (void)__atomic_load_n(&val, __ATOMIC_SEQ_CST); return 0; } diff --git a/configure.ac b/configure.ac index ee5573cf644316..39eadfedfba02d 100644 --- a/configure.ac +++ b/configure.ac @@ -5586,14 +5586,15 @@ if test "$have_stdatomic_h" = yes; then [Has stdatomic.h with atomic_int and atomic_uintptr_t]) fi -# Check for GCC >= 4.7 __atomic builtins -AC_MSG_CHECKING(for GCC >= 4.7 __atomic builtins) +# Check for GCC >= 4.7 and clang __atomic builtin functions +AC_MSG_CHECKING(for builtin __atomic_load_n and __atomic_store_n functions) AC_LINK_IFELSE( [ AC_LANG_SOURCE([[ - volatile int val = 1; + int val; int main() { - __atomic_load_n(&val, __ATOMIC_SEQ_CST); + __atomic_store_n(&val, 1, __ATOMIC_SEQ_CST); + (void)__atomic_load_n(&val, __ATOMIC_SEQ_CST); return 0; } ]]) @@ -5602,7 +5603,7 @@ AC_LINK_IFELSE( AC_MSG_RESULT($have_builtin_atomic) if test "$have_builtin_atomic" = yes; then - AC_DEFINE(HAVE_BUILTIN_ATOMIC, 1, [Has builtin atomics]) + AC_DEFINE(HAVE_BUILTIN_ATOMIC, 1, [Has builtin __atomic_load_n() and __atomic_store_n() functions]) fi # ensurepip option diff --git a/pyconfig.h.in b/pyconfig.h.in index 6ff5fc968a30c2..045cbd53aee595 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -115,7 +115,7 @@ /* Define if `unsetenv` does not return an int. */ #undef HAVE_BROKEN_UNSETENV -/* Has builtin atomics */ +/* Has builtin __atomic_load_n() and __atomic_store_n() functions */ #undef HAVE_BUILTIN_ATOMIC /* Define to 1 if you have the 'chflags' function. */ @@ -287,6 +287,9 @@ /* Define to 1 if you have the `dup3' function. */ #undef HAVE_DUP3 +/* Define if you have the '_dyld_shared_cache_contains_path' function. */ +#undef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH + /* Defined when any dynamic module loading is enabled. */ #undef HAVE_DYNAMIC_LOADING @@ -787,9 +790,6 @@ /* Define if you have the 'prlimit' functions. */ #undef HAVE_PRLIMIT -/* Define if you have the '_dyld_shared_cache_contains_path' function. */ -#undef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH - /* Define to 1 if you have the header file. */ #undef HAVE_PROCESS_H From 979a57a1d0170f90d83a57bcadf8dbc381c8fddf Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Wed, 23 Dec 2020 08:25:57 +0100 Subject: [PATCH 0855/1261] bpo-42620: Improve socket.getsockname doc string (GH-23742) Signed-off-by: Christian Heimes --- Modules/socketmodule.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index f8e4de5825f7ad..bb33db0fa47b8c 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3365,8 +3365,9 @@ sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored)) PyDoc_STRVAR(getsockname_doc, "getsockname() -> address info\n\ \n\ -Return the address of the local endpoint. For IP sockets, the address\n\ -info is a pair (hostaddr, port)."); +Return the address of the local endpoint. The format depends on the\n\ +address family. For IPv4 sockets, the address info is a pair\n\ +(hostaddr, port)."); #ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */ From 44259ce0391ca31d39d3ace2fa4ed68742d9c94d Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Wed, 23 Dec 2020 08:55:11 +0100 Subject: [PATCH 0856/1261] bpo-1635741: Port resource extension module to module state (GH-23462) Signed-off-by: Christian Heimes --- ...2020-11-22-13-46-06.bpo-1635741.-fJLzA.rst | 1 + Modules/resource.c | 56 ++++++++++++++----- 2 files changed, 44 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-11-22-13-46-06.bpo-1635741.-fJLzA.rst diff --git a/Misc/NEWS.d/next/C API/2020-11-22-13-46-06.bpo-1635741.-fJLzA.rst b/Misc/NEWS.d/next/C API/2020-11-22-13-46-06.bpo-1635741.-fJLzA.rst new file mode 100644 index 00000000000000..da1e4cb9ef17e3 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-22-13-46-06.bpo-1635741.-fJLzA.rst @@ -0,0 +1 @@ +Port :mod:`resource` extension module to module state diff --git a/Modules/resource.c b/Modules/resource.c index 4f5dcf84387888..f10a80f4776863 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -63,8 +63,20 @@ static PyStructSequence_Desc struct_rusage_desc = { 16 /* n_in_sequence */ }; -static int initialized; -static PyTypeObject StructRUsageType; +typedef struct { + PyTypeObject *StructRUsageType; +} resourcemodulestate; + + +static inline resourcemodulestate* +get_resource_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (resourcemodulestate *)state; +} + +static struct PyModuleDef resourcemodule; /*[clinic input] resource.getrusage @@ -91,7 +103,8 @@ resource_getrusage_impl(PyObject *module, int who) return NULL; } - result = PyStructSequence_New(&StructRUsageType); + result = PyStructSequence_New( + get_resource_state(module)->StructRUsageType); if (!result) return NULL; @@ -336,10 +349,10 @@ resource_methods[] = { /* Module initialization */ - static int resource_exec(PyObject *module) { + resourcemodulestate *state = get_resource_state(module); #define ADD_INT(module, value) \ do { \ if (PyModule_AddIntConstant(module, #value, value) < 0) { \ @@ -353,13 +366,12 @@ resource_exec(PyObject *module) Py_DECREF(PyExc_OSError); return -1; } - if (!initialized) { - if (PyStructSequence_InitType2(&StructRUsageType, - &struct_rusage_desc) < 0) - return -1; - } - if(PyModule_AddType(module, &StructRUsageType) < 0) { + state->StructRUsageType = PyStructSequence_NewType(&struct_rusage_desc); + if (state->StructRUsageType == NULL) { + return -1; + } + if (PyModule_AddType(module, state->StructRUsageType) < 0) { return -1; } @@ -483,8 +495,6 @@ resource_exec(PyObject *module) Py_DECREF(v); return -1; } - - initialized = 1; return 0; #undef ADD_INT @@ -495,12 +505,32 @@ static struct PyModuleDef_Slot resource_slots[] = { {0, NULL} }; +static int +resourcemodule_traverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(get_resource_state(m)->StructRUsageType); + return 0; +} + +static int +resourcemodule_clear(PyObject *m) { + Py_CLEAR(get_resource_state(m)->StructRUsageType); + return 0; +} + +static void +resourcemodule_free(void *m) { + resourcemodule_clear((PyObject *)m); +} + static struct PyModuleDef resourcemodule = { PyModuleDef_HEAD_INIT, .m_name = "resource", - .m_size = 0, + .m_size = sizeof(resourcemodulestate), .m_methods = resource_methods, .m_slots = resource_slots, + .m_traverse = resourcemodule_traverse, + .m_clear = resourcemodule_clear, + .m_free = resourcemodule_free, }; PyMODINIT_FUNC From e60770db358b8ca48aa2e1d6218727c160e52474 Mon Sep 17 00:00:00 2001 From: Matt Fowler Date: Wed, 23 Dec 2020 05:44:52 -0500 Subject: [PATCH 0857/1261] BPO-42703: Fix incorrect documentation links for asyncio.Event (GH-23881) --- Doc/library/asyncio-sync.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst index a7688d5120efda..d12630afc6a326 100644 --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -101,8 +101,8 @@ Event that some event has happened. An Event object manages an internal flag that can be set to *true* - with the :meth:`set` method and reset to *false* with the - :meth:`clear` method. The :meth:`wait` method blocks until the + with the :meth:`~Event.set` method and reset to *false* with the + :meth:`clear` method. The :meth:`~Event.wait` method blocks until the flag is set to *true*. The flag is set to *false* initially. .. _asyncio_example_sync_event: @@ -135,7 +135,7 @@ Event Wait until the event is set. If the event is set, return ``True`` immediately. - Otherwise block until another task calls :meth:`set`. + Otherwise block until another task calls :meth:`~Event.set`. .. method:: set() @@ -148,8 +148,8 @@ Event Clear (unset) the event. - Tasks awaiting on :meth:`wait` will now block until the - :meth:`set` method is called again. + Tasks awaiting on :meth:`~Event.wait` will now block until the + :meth:`~Event.set` method is called again. .. method:: is_set() From 21d216526784f5a7a98655127938f54e254948b2 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Wed, 23 Dec 2020 11:43:10 +0000 Subject: [PATCH 0858/1261] bpo-42246: Don't eliminate jumps to jumps, if it will break PEP 626. (GH-23896) --- Lib/test/test_dis.py | 169 +- Lib/test/test_sys_settrace.py | 64 + .../2020-12-22-20-30-11.bpo-42246.7BrPLg.rst | 1 + Python/compile.c | 135 +- Python/importlib.h | 1531 +++--- Python/importlib_external.h | 4884 +++++++++-------- Python/importlib_zipimport.h | 1796 +++--- 7 files changed, 4341 insertions(+), 4239 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-22-20-30-11.bpo-42246.7BrPLg.rst diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index f618d2dbf62131..0383124464ff35 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1009,7 +1009,7 @@ def jumpy(): Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=10, argrepr='10', offset=2, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=4, starts_line=None, is_jump_target=False), Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=6, starts_line=None, is_jump_target=False), - Instruction(opname='FOR_ITER', opcode=93, arg=32, argval=42, argrepr='to 42', offset=8, starts_line=None, is_jump_target=True), + Instruction(opname='FOR_ITER', opcode=93, arg=34, argval=44, argrepr='to 44', offset=8, starts_line=None, is_jump_target=True), Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=10, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=12, starts_line=4, is_jump_target=False), Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=14, starts_line=None, is_jump_target=False), @@ -1023,94 +1023,95 @@ def jumpy(): Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=30, starts_line=7, is_jump_target=True), Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=32, starts_line=None, is_jump_target=False), Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=34, starts_line=None, is_jump_target=False), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=8, argval=8, argrepr='', offset=36, starts_line=None, is_jump_target=False), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=42, argval=42, argrepr='', offset=36, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=38, starts_line=8, is_jump_target=False), - Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=50, argval=50, argrepr='', offset=40, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=42, starts_line=10, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=44, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=46, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=48, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=50, starts_line=11, is_jump_target=True), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=94, argval=94, argrepr='', offset=52, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=54, starts_line=12, is_jump_target=True), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=56, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=58, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=62, starts_line=13, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=64, starts_line=None, is_jump_target=False), - Instruction(opname='INPLACE_SUBTRACT', opcode=56, arg=None, argval=None, argrepr='', offset=66, starts_line=None, is_jump_target=False), - Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=68, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=70, starts_line=14, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=72, starts_line=None, is_jump_target=False), - Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=74, starts_line=None, is_jump_target=False), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=80, argval=80, argrepr='', offset=76, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=50, argval=50, argrepr='', offset=78, starts_line=15, is_jump_target=False), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=80, starts_line=16, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=82, starts_line=None, is_jump_target=False), - Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=84, starts_line=None, is_jump_target=False), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=90, argval=90, argrepr='', offset=86, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=102, argval=102, argrepr='', offset=88, starts_line=17, is_jump_target=False), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=90, starts_line=11, is_jump_target=True), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=54, argval=54, argrepr='', offset=92, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=94, starts_line=19, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=96, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=98, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=100, starts_line=None, is_jump_target=False), - Instruction(opname='SETUP_FINALLY', opcode=122, arg=96, argval=200, argrepr='to 200', offset=102, starts_line=20, is_jump_target=True), - Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=118, argrepr='to 118', offset=104, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=106, starts_line=21, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), - Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=24, argval=142, argrepr='to 142', offset=116, starts_line=None, is_jump_target=False), - Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=118, starts_line=22, is_jump_target=True), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=120, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_IF_NOT_EXC_MATCH', opcode=121, arg=210, argval=210, argrepr='', offset=122, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=124, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=52, argval=52, argrepr='', offset=40, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=8, argval=8, argrepr='', offset=42, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=44, starts_line=10, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=46, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=48, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=50, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=52, starts_line=11, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=96, argval=96, argrepr='', offset=54, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=56, starts_line=12, is_jump_target=True), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=58, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=60, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=62, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=64, starts_line=13, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=66, starts_line=None, is_jump_target=False), + Instruction(opname='INPLACE_SUBTRACT', opcode=56, arg=None, argval=None, argrepr='', offset=68, starts_line=None, is_jump_target=False), + Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=70, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=72, starts_line=14, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=74, starts_line=None, is_jump_target=False), + Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=76, starts_line=None, is_jump_target=False), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=82, argval=82, argrepr='', offset=78, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=52, argval=52, argrepr='', offset=80, starts_line=15, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=82, starts_line=16, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=84, starts_line=None, is_jump_target=False), + Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=86, starts_line=None, is_jump_target=False), + Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=92, argval=92, argrepr='', offset=88, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=104, argval=104, argrepr='', offset=90, starts_line=17, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=92, starts_line=11, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=56, argval=56, argrepr='', offset=94, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=96, starts_line=19, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=98, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=100, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=102, starts_line=None, is_jump_target=False), + Instruction(opname='SETUP_FINALLY', opcode=122, arg=96, argval=202, argrepr='to 202', offset=104, starts_line=20, is_jump_target=True), + Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=120, argrepr='to 120', offset=106, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=108, starts_line=21, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=110, starts_line=None, is_jump_target=False), + Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=116, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=24, argval=144, argrepr='to 144', offset=118, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=120, starts_line=22, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=122, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_IF_NOT_EXC_MATCH', opcode=121, arg=212, argval=212, argrepr='', offset=124, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=126, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=128, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=130, starts_line=23, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=132, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=134, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=136, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=44, argval=186, argrepr='to 186', offset=140, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=142, starts_line=25, is_jump_target=True), - Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=170, argrepr='to 170', offset=144, starts_line=None, is_jump_target=False), - Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=146, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=148, starts_line=26, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=150, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=152, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=154, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=156, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=158, starts_line=None, is_jump_target=False), - Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=130, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=132, starts_line=23, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=134, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=136, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=140, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=44, argval=188, argrepr='to 188', offset=142, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, starts_line=25, is_jump_target=True), + Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=172, argrepr='to 172', offset=146, starts_line=None, is_jump_target=False), + Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=148, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=150, starts_line=26, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=152, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=154, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=156, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=160, starts_line=None, is_jump_target=False), Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=162, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=164, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=166, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=186, argrepr='to 186', offset=168, starts_line=None, is_jump_target=False), - Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=170, starts_line=None, is_jump_target=True), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=176, argval=176, argrepr='', offset=172, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=174, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=176, starts_line=None, is_jump_target=True), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=166, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=188, argrepr='to 188', offset=170, starts_line=None, is_jump_target=False), + Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=178, argval=178, argrepr='', offset=174, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=176, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=True), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=188, starts_line=28, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=190, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=192, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=194, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=196, starts_line=None, is_jump_target=False), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=198, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=200, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=202, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=204, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=206, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=208, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=210, starts_line=22, is_jump_target=True), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=188, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=190, starts_line=28, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=192, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=194, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=196, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=198, starts_line=None, is_jump_target=False), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=200, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=202, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=204, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=206, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=208, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=210, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=212, starts_line=22, is_jump_target=True), ] # One last piece of inspect fodder to check the default line number handling diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 340f37fae7c5bc..50b5672e35a329 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -810,6 +810,70 @@ def func(): (6, 'line'), (6, 'return')]) + def test_break_to_continue1(self): + + def func(): + TRUE = 1 + x = [1] + while x: + x.pop() + while TRUE: + break + continue + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (4, 'line'), + (5, 'line'), + (6, 'line'), + (7, 'line'), + (3, 'line'), + (3, 'return')]) + + def test_break_to_continue2(self): + + def func(): + TRUE = 1 + x = [1] + while x: + x.pop() + while TRUE: + break + else: + continue + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (4, 'line'), + (5, 'line'), + (6, 'line'), + (3, 'line'), + (3, 'return')]) + + def test_break_to_break(self): + + def func(): + TRUE = 1 + while TRUE: + while TRUE: + break + break + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (4, 'line'), + (5, 'line'), + (5, 'return')]) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-22-20-30-11.bpo-42246.7BrPLg.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-22-20-30-11.bpo-42246.7BrPLg.rst new file mode 100644 index 00000000000000..33564f6b56b9f2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-12-22-20-30-11.bpo-42246.7BrPLg.rst @@ -0,0 +1 @@ +Jumps to jumps are not eliminated when it would break PEP 626. diff --git a/Python/compile.c b/Python/compile.c index 6698b55000d9cf..4ba91400001aa9 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1432,28 +1432,32 @@ compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg) return 1; } -static int -compiler_addop_j(struct compiler *c, int opcode, basicblock *b) +static int add_jump_to_block(basicblock *b, int opcode, int lineno, basicblock *target) { - struct instr *i; - int off; - - if (c->c_do_not_emit_bytecode) { - return 1; - } - assert(HAS_ARG(opcode)); assert(b != NULL); - off = compiler_next_instr(c->u->u_curblock); - if (off < 0) + assert(target != NULL); + + int off = compiler_next_instr(b); + struct instr *i = &b->b_instr[off]; + if (off < 0) { return 0; - i = &c->u->u_curblock->b_instr[off]; + } i->i_opcode = opcode; - i->i_target = b; - i->i_lineno = c->u->u_lineno; + i->i_target = target; + i->i_lineno = lineno; return 1; } +static int +compiler_addop_j(struct compiler *c, int opcode, basicblock *b) +{ + if (c->c_do_not_emit_bytecode) { + return 1; + } + return add_jump_to_block(c->u->u_curblock, opcode, c->u->u_lineno, b); +} + /* NEXT_BLOCK() creates an implicit jump from the current block to the new block. @@ -6067,6 +6071,27 @@ fold_tuple_on_constants(struct instr *inst, return 0; } + +static int +eliminate_jump_to_jump(basicblock *bb, int opcode) { + assert (bb->b_iused > 0); + struct instr *inst = &bb->b_instr[bb->b_iused-1]; + assert (is_jump(inst)); + assert (inst->i_target->b_iused > 0); + struct instr *target = &inst->i_target->b_instr[0]; + if (inst->i_target == target->i_target) { + /* Nothing to do */ + return 0; + } + int lineno = target->i_lineno; + if (add_jump_to_block(bb, opcode, lineno, target->i_target) == 0) { + return -1; + } + assert (bb->b_iused >= 2); + bb->b_instr[bb->b_iused-2].i_opcode = NOP; + return 0; +} + /* Maximum size of basic block that should be copied in optimizer */ #define MAX_COPY_SIZE 4 @@ -6183,22 +6208,27 @@ optimize_basic_block(basicblock *bb, PyObject *consts) case JUMP_IF_FALSE_OR_POP: switch(target->i_opcode) { case POP_JUMP_IF_FALSE: - *inst = *target; - --i; + if (inst->i_lineno == target->i_lineno) { + *inst = *target; + i--; + } break; case JUMP_ABSOLUTE: case JUMP_FORWARD: case JUMP_IF_FALSE_OR_POP: - if (inst->i_target != target->i_target) { + if (inst->i_lineno == target->i_lineno && + inst->i_target != target->i_target) { inst->i_target = target->i_target; - --i; + i--; } break; case JUMP_IF_TRUE_OR_POP: assert (inst->i_target->b_iused == 1); - inst->i_opcode = POP_JUMP_IF_FALSE; - inst->i_target = inst->i_target->b_next; - --i; + if (inst->i_lineno == target->i_lineno) { + inst->i_opcode = POP_JUMP_IF_FALSE; + inst->i_target = inst->i_target->b_next; + --i; + } break; } break; @@ -6206,22 +6236,27 @@ optimize_basic_block(basicblock *bb, PyObject *consts) case JUMP_IF_TRUE_OR_POP: switch(target->i_opcode) { case POP_JUMP_IF_TRUE: - *inst = *target; - --i; + if (inst->i_lineno == target->i_lineno) { + *inst = *target; + i--; + } break; case JUMP_ABSOLUTE: case JUMP_FORWARD: case JUMP_IF_TRUE_OR_POP: - if (inst->i_target != target->i_target) { + if (inst->i_lineno == target->i_lineno && + inst->i_target != target->i_target) { inst->i_target = target->i_target; - --i; + i--; } break; case JUMP_IF_FALSE_OR_POP: assert (inst->i_target->b_iused == 1); - inst->i_opcode = POP_JUMP_IF_TRUE; - inst->i_target = inst->i_target->b_next; - --i; + if (inst->i_lineno == target->i_lineno) { + inst->i_opcode = POP_JUMP_IF_TRUE; + inst->i_target = inst->i_target->b_next; + --i; + } break; } break; @@ -6230,9 +6265,9 @@ optimize_basic_block(basicblock *bb, PyObject *consts) switch(target->i_opcode) { case JUMP_ABSOLUTE: case JUMP_FORWARD: - if (inst->i_target != target->i_target) { + if (inst->i_lineno == target->i_lineno) { inst->i_target = target->i_target; - --i; + i--; } break; } @@ -6242,9 +6277,9 @@ optimize_basic_block(basicblock *bb, PyObject *consts) switch(target->i_opcode) { case JUMP_ABSOLUTE: case JUMP_FORWARD: - if (inst->i_target != target->i_target) { + if (inst->i_lineno == target->i_lineno) { inst->i_target = target->i_target; - --i; + i--; } break; } @@ -6255,32 +6290,30 @@ optimize_basic_block(basicblock *bb, PyObject *consts) assert (i == bb->b_iused-1); switch(target->i_opcode) { case JUMP_FORWARD: - if (inst->i_target != target->i_target) { - inst->i_target = target->i_target; -// --i; + if (eliminate_jump_to_jump(bb, inst->i_opcode)) { + goto error; } break; + case JUMP_ABSOLUTE: - if (inst->i_target != target->i_target) { - inst->i_target = target->i_target; - inst->i_opcode = target->i_opcode; - --i; + if (eliminate_jump_to_jump(bb, JUMP_ABSOLUTE)) { + goto error; } break; - } - if (inst->i_target->b_exit && inst->i_target->b_iused <= MAX_COPY_SIZE) { - basicblock *to_copy = inst->i_target; - inst->i_opcode = NOP; - for (i = 0; i < to_copy->b_iused; i++) { - int index = compiler_next_instr(bb); - if (index < 0) { - return -1; + default: + if (inst->i_target->b_exit && inst->i_target->b_iused <= MAX_COPY_SIZE) { + basicblock *to_copy = inst->i_target; + inst->i_opcode = NOP; + for (i = 0; i < to_copy->b_iused; i++) { + int index = compiler_next_instr(bb); + if (index < 0) { + return -1; + } + bb->b_instr[index] = to_copy->b_instr[i]; + } + bb->b_exit = 1; } - bb->b_instr[index] = to_copy->b_instr[i]; - } - bb->b_exit = 1; } - break; } } return 0; diff --git a/Python/importlib.h b/Python/importlib.h index 14d0557f75aae7..2f100515b55423 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -68,7 +68,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 78,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, 0,0,7,0,0,0,67,0,0,0,115,56,0,0,0,100, 1,68,0,93,32,125,2,116,0,124,1,124,2,131,2,114, - 4,116,1,124,0,124,2,116,2,124,1,124,2,131,2,131, + 36,116,1,124,0,124,2,116,2,124,1,124,2,131,2,131, 3,1,0,113,4,124,0,106,3,160,4,124,1,106,3,161, 1,1,0,100,2,83,0,41,3,122,47,83,105,109,112,108, 101,32,115,117,98,115,116,105,116,117,116,101,32,102,111,114, @@ -1019,782 +1019,783 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 8,1,4,3,14,254,2,1,8,1,2,254,2,251,2,246, 255,128,114,166,0,0,0,99,1,0,0,0,0,0,0,0, 0,0,0,0,3,0,0,0,11,0,0,0,67,0,0,0, - 115,240,0,0,0,124,0,106,0,100,0,117,1,114,58,116, + 115,242,0,0,0,124,0,106,0,100,0,117,1,114,58,116, 1,124,0,106,0,100,1,131,2,115,58,116,2,124,0,106, 0,131,1,155,0,100,2,157,2,125,1,116,3,160,4,124, 1,116,5,161,2,1,0,116,6,124,0,131,1,83,0,116, - 7,124,0,131,1,125,2,100,3,124,0,95,8,122,156,124, - 2,116,9,106,10,124,0,106,11,60,0,122,50,124,0,106, - 0,100,0,117,0,114,122,124,0,106,12,100,0,117,0,114, - 134,116,13,100,4,124,0,106,11,100,5,141,2,130,1,124, - 0,106,0,160,14,124,2,161,1,1,0,87,0,110,38,1, - 0,1,0,1,0,122,14,116,9,106,10,124,0,106,11,61, - 0,87,0,130,0,4,0,116,15,121,238,1,0,1,0,1, - 0,89,0,130,0,116,9,106,10,160,16,124,0,106,11,161, - 1,125,2,124,2,116,9,106,10,124,0,106,11,60,0,116, - 17,100,6,124,0,106,11,124,0,106,0,131,3,1,0,87, - 0,100,7,124,0,95,8,124,2,83,0,100,7,124,0,95, - 8,119,0,119,0,41,8,78,114,157,0,0,0,114,162,0, - 0,0,84,114,161,0,0,0,114,19,0,0,0,122,18,105, - 109,112,111,114,116,32,123,33,114,125,32,35,32,123,33,114, - 125,70,41,18,114,116,0,0,0,114,11,0,0,0,114,7, - 0,0,0,114,95,0,0,0,114,96,0,0,0,114,163,0, - 0,0,114,166,0,0,0,114,159,0,0,0,90,13,95,105, - 110,105,116,105,97,108,105,122,105,110,103,114,18,0,0,0, - 114,99,0,0,0,114,20,0,0,0,114,123,0,0,0,114, - 83,0,0,0,114,157,0,0,0,114,67,0,0,0,114,165, - 0,0,0,114,80,0,0,0,41,3,114,103,0,0,0,114, - 102,0,0,0,114,104,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,14,95,108,111,97,100,95, - 117,110,108,111,99,107,101,100,162,2,0,0,115,58,0,0, - 0,10,2,12,2,16,1,12,2,8,1,8,2,6,5,2, - 1,12,1,2,1,10,1,10,1,14,1,16,3,6,1,2, - 1,12,1,2,3,12,254,2,1,2,1,14,5,12,1,18, - 1,6,2,4,2,8,254,2,245,255,128,114,167,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,8,0,0,0,67,0,0,0,115,54,0,0,0,116,0, - 124,0,106,1,131,1,143,24,1,0,116,2,124,0,131,1, - 87,0,2,0,100,1,4,0,4,0,131,3,1,0,83,0, - 49,0,115,40,119,1,1,0,1,0,1,0,89,0,1,0, - 100,1,83,0,41,2,122,191,82,101,116,117,114,110,32,97, - 32,110,101,119,32,109,111,100,117,108,101,32,111,98,106,101, - 99,116,44,32,108,111,97,100,101,100,32,98,121,32,116,104, - 101,32,115,112,101,99,39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111, - 32,105,116,115,32,112,97,114,101,110,116,46,10,10,32,32, - 32,32,73,102,32,97,32,109,111,100,117,108,101,32,105,115, - 32,97,108,114,101,97,100,121,32,105,110,32,115,121,115,46, - 109,111,100,117,108,101,115,44,32,116,104,97,116,32,101,120, - 105,115,116,105,110,103,32,109,111,100,117,108,101,32,103,101, - 116,115,10,32,32,32,32,99,108,111,98,98,101,114,101,100, - 46,10,10,32,32,32,32,78,41,3,114,54,0,0,0,114, - 20,0,0,0,114,167,0,0,0,169,1,114,103,0,0,0, + 7,124,0,131,1,125,2,100,3,124,0,95,8,122,158,124, + 2,116,9,106,10,124,0,106,11,60,0,122,52,124,0,106, + 0,100,0,117,0,114,124,124,0,106,12,100,0,117,0,114, + 122,116,13,100,4,124,0,106,11,100,5,141,2,130,1,110, + 12,124,0,106,0,160,14,124,2,161,1,1,0,87,0,110, + 38,1,0,1,0,1,0,122,14,116,9,106,10,124,0,106, + 11,61,0,87,0,130,0,4,0,116,15,121,240,1,0,1, + 0,1,0,89,0,130,0,116,9,106,10,160,16,124,0,106, + 11,161,1,125,2,124,2,116,9,106,10,124,0,106,11,60, + 0,116,17,100,6,124,0,106,11,124,0,106,0,131,3,1, + 0,87,0,100,7,124,0,95,8,124,2,83,0,100,7,124, + 0,95,8,119,0,119,0,41,8,78,114,157,0,0,0,114, + 162,0,0,0,84,114,161,0,0,0,114,19,0,0,0,122, + 18,105,109,112,111,114,116,32,123,33,114,125,32,35,32,123, + 33,114,125,70,41,18,114,116,0,0,0,114,11,0,0,0, + 114,7,0,0,0,114,95,0,0,0,114,96,0,0,0,114, + 163,0,0,0,114,166,0,0,0,114,159,0,0,0,90,13, + 95,105,110,105,116,105,97,108,105,122,105,110,103,114,18,0, + 0,0,114,99,0,0,0,114,20,0,0,0,114,123,0,0, + 0,114,83,0,0,0,114,157,0,0,0,114,67,0,0,0, + 114,165,0,0,0,114,80,0,0,0,41,3,114,103,0,0, + 0,114,102,0,0,0,114,104,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,14,95,108,111,97, + 100,95,117,110,108,111,99,107,101,100,162,2,0,0,115,58, + 0,0,0,10,2,12,2,16,1,12,2,8,1,8,2,6, + 5,2,1,12,1,2,1,10,1,10,1,16,1,16,3,6, + 1,2,1,12,1,2,3,12,254,2,1,2,1,14,5,12, + 1,18,1,6,2,4,2,8,254,2,245,255,128,114,167,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,8,0,0,0,67,0,0,0,115,54,0,0,0, + 116,0,124,0,106,1,131,1,143,24,1,0,116,2,124,0, + 131,1,87,0,2,0,100,1,4,0,4,0,131,3,1,0, + 83,0,49,0,115,40,119,1,1,0,1,0,1,0,89,0, + 1,0,100,1,83,0,41,2,122,191,82,101,116,117,114,110, + 32,97,32,110,101,119,32,109,111,100,117,108,101,32,111,98, + 106,101,99,116,44,32,108,111,97,100,101,100,32,98,121,32, + 116,104,101,32,115,112,101,99,39,115,32,108,111,97,100,101, + 114,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,97,100,100,101,100,32, + 116,111,32,105,116,115,32,112,97,114,101,110,116,46,10,10, + 32,32,32,32,73,102,32,97,32,109,111,100,117,108,101,32, + 105,115,32,97,108,114,101,97,100,121,32,105,110,32,115,121, + 115,46,109,111,100,117,108,101,115,44,32,116,104,97,116,32, + 101,120,105,115,116,105,110,103,32,109,111,100,117,108,101,32, + 103,101,116,115,10,32,32,32,32,99,108,111,98,98,101,114, + 101,100,46,10,10,32,32,32,32,78,41,3,114,54,0,0, + 0,114,20,0,0,0,114,167,0,0,0,169,1,114,103,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,101,0,0,0,207,2,0,0,115,6,0,0,0,12, + 9,42,1,255,128,114,101,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, + 0,0,0,115,140,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,90,4,101,5,100,3,100,4,132,0, + 131,1,90,6,101,7,100,20,100,6,100,7,132,1,131,1, + 90,8,101,7,100,21,100,8,100,9,132,1,131,1,90,9, + 101,5,100,10,100,11,132,0,131,1,90,10,101,5,100,12, + 100,13,132,0,131,1,90,11,101,7,101,12,100,14,100,15, + 132,0,131,1,131,1,90,13,101,7,101,12,100,16,100,17, + 132,0,131,1,131,1,90,14,101,7,101,12,100,18,100,19, + 132,0,131,1,131,1,90,15,101,7,101,16,131,1,90,17, + 100,5,83,0,41,22,218,15,66,117,105,108,116,105,110,73, + 109,112,111,114,116,101,114,122,144,77,101,116,97,32,112,97, + 116,104,32,105,109,112,111,114,116,32,102,111,114,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,115,46,10, + 10,32,32,32,32,65,108,108,32,109,101,116,104,111,100,115, + 32,97,114,101,32,101,105,116,104,101,114,32,99,108,97,115, + 115,32,111,114,32,115,116,97,116,105,99,32,109,101,116,104, + 111,100,115,32,116,111,32,97,118,111,105,100,32,116,104,101, + 32,110,101,101,100,32,116,111,10,32,32,32,32,105,110,115, + 116,97,110,116,105,97,116,101,32,116,104,101,32,99,108,97, + 115,115,46,10,10,32,32,32,32,122,8,98,117,105,108,116, + 45,105,110,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,5,0,0,0,67,0,0,0,115,22,0,0, + 0,100,1,124,0,106,0,155,2,100,2,116,1,106,2,155, + 0,100,3,157,5,83,0,41,5,250,115,82,101,116,117,114, + 110,32,114,101,112,114,32,102,111,114,32,116,104,101,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,101,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,84,104,101,32,105, + 109,112,111,114,116,32,109,97,99,104,105,110,101,114,121,32, + 100,111,101,115,32,116,104,101,32,106,111,98,32,105,116,115, + 101,108,102,46,10,10,32,32,32,32,32,32,32,32,122,8, + 60,109,111,100,117,108,101,32,122,2,32,40,122,2,41,62, + 78,41,3,114,9,0,0,0,114,169,0,0,0,114,145,0, + 0,0,169,1,114,104,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,107,0,0,0,233,2,0, + 0,115,4,0,0,0,22,7,255,128,122,27,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,4,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, + 0,115,42,0,0,0,124,2,100,0,117,1,114,12,100,0, + 83,0,116,0,160,1,124,1,161,1,114,38,116,2,124,1, + 124,0,124,0,106,3,100,1,141,3,83,0,100,0,83,0, + 169,2,78,114,144,0,0,0,41,4,114,61,0,0,0,90, + 10,105,115,95,98,117,105,108,116,105,110,114,98,0,0,0, + 114,145,0,0,0,169,4,218,3,99,108,115,114,85,0,0, + 0,218,4,112,97,116,104,218,6,116,97,114,103,101,116,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,9, + 102,105,110,100,95,115,112,101,99,242,2,0,0,115,12,0, + 0,0,8,2,4,1,10,1,16,1,4,2,255,128,122,25, + 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46, + 102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, + 0,0,115,30,0,0,0,124,0,160,0,124,1,124,2,161, + 2,125,3,124,3,100,1,117,1,114,26,124,3,106,1,83, + 0,100,1,83,0,41,2,122,175,70,105,110,100,32,116,104, + 101,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,39, + 112,97,116,104,39,32,105,115,32,101,118,101,114,32,115,112, + 101,99,105,102,105,101,100,32,116,104,101,110,32,116,104,101, + 32,115,101,97,114,99,104,32,105,115,32,99,111,110,115,105, + 100,101,114,101,100,32,97,32,102,97,105,108,117,114,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,102,105,110,100,95,115, + 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,78,41,2,114,177,0,0,0, + 114,116,0,0,0,41,4,114,174,0,0,0,114,85,0,0, + 0,114,175,0,0,0,114,103,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,11,102,105,110,100, + 95,109,111,100,117,108,101,251,2,0,0,115,6,0,0,0, + 12,9,18,1,255,128,122,27,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,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,4,0,0,0,67,0,0,0,115,46,0,0, + 0,124,0,106,0,116,1,106,2,118,1,114,34,116,3,100, + 1,160,4,124,0,106,0,161,1,124,0,106,0,100,2,141, + 2,130,1,116,5,116,6,106,7,124,0,131,2,83,0,41, + 4,122,24,67,114,101,97,116,101,32,97,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,114,81,0,0,0, + 114,19,0,0,0,78,41,8,114,20,0,0,0,114,18,0, + 0,0,114,82,0,0,0,114,83,0,0,0,114,49,0,0, + 0,114,71,0,0,0,114,61,0,0,0,90,14,99,114,101, + 97,116,101,95,98,117,105,108,116,105,110,114,168,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 101,0,0,0,207,2,0,0,115,6,0,0,0,12,9,42, - 1,255,128,114,101,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, - 0,115,140,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,90,4,101,5,100,3,100,4,132,0,131,1, - 90,6,101,7,100,20,100,6,100,7,132,1,131,1,90,8, - 101,7,100,21,100,8,100,9,132,1,131,1,90,9,101,5, - 100,10,100,11,132,0,131,1,90,10,101,5,100,12,100,13, - 132,0,131,1,90,11,101,7,101,12,100,14,100,15,132,0, - 131,1,131,1,90,13,101,7,101,12,100,16,100,17,132,0, - 131,1,131,1,90,14,101,7,101,12,100,18,100,19,132,0, - 131,1,131,1,90,15,101,7,101,16,131,1,90,17,100,5, - 83,0,41,22,218,15,66,117,105,108,116,105,110,73,109,112, - 111,114,116,101,114,122,144,77,101,116,97,32,112,97,116,104, - 32,105,109,112,111,114,116,32,102,111,114,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,115,46,10,10,32, - 32,32,32,65,108,108,32,109,101,116,104,111,100,115,32,97, - 114,101,32,101,105,116,104,101,114,32,99,108,97,115,115,32, - 111,114,32,115,116,97,116,105,99,32,109,101,116,104,111,100, - 115,32,116,111,32,97,118,111,105,100,32,116,104,101,32,110, - 101,101,100,32,116,111,10,32,32,32,32,105,110,115,116,97, - 110,116,105,97,116,101,32,116,104,101,32,99,108,97,115,115, - 46,10,10,32,32,32,32,122,8,98,117,105,108,116,45,105, - 110,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,5,0,0,0,67,0,0,0,115,22,0,0,0,100, - 1,124,0,106,0,155,2,100,2,116,1,106,2,155,0,100, - 3,157,5,83,0,41,5,250,115,82,101,116,117,114,110,32, - 114,101,112,114,32,102,111,114,32,116,104,101,32,109,111,100, - 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, - 101,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,32,32,84,104,101,32,105,109,112, - 111,114,116,32,109,97,99,104,105,110,101,114,121,32,100,111, - 101,115,32,116,104,101,32,106,111,98,32,105,116,115,101,108, - 102,46,10,10,32,32,32,32,32,32,32,32,122,8,60,109, - 111,100,117,108,101,32,122,2,32,40,122,2,41,62,78,41, - 3,114,9,0,0,0,114,169,0,0,0,114,145,0,0,0, - 169,1,114,104,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,107,0,0,0,233,2,0,0,115, - 4,0,0,0,22,7,255,128,122,27,66,117,105,108,116,105, + 156,0,0,0,7,3,0,0,115,12,0,0,0,12,3,12, + 1,4,1,6,255,12,2,255,128,122,29,66,117,105,108,116, + 105,110,73,109,112,111,114,116,101,114,46,99,114,101,97,116, + 101,95,109,111,100,117,108,101,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,16,0,0,0,116,0,116,1,106,2,124,0,131,2, + 1,0,100,1,83,0,41,2,122,22,69,120,101,99,32,97, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 78,41,3,114,71,0,0,0,114,61,0,0,0,90,12,101, + 120,101,99,95,98,117,105,108,116,105,110,114,171,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 157,0,0,0,15,3,0,0,115,4,0,0,0,16,3,255, + 128,122,27,66,117,105,108,116,105,110,73,109,112,111,114,116, + 101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, + 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, + 41,2,122,57,82,101,116,117,114,110,32,78,111,110,101,32, + 97,115,32,98,117,105,108,116,45,105,110,32,109,111,100,117, + 108,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32, + 99,111,100,101,32,111,98,106,101,99,116,115,46,78,114,5, + 0,0,0,169,2,114,174,0,0,0,114,85,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,8, + 103,101,116,95,99,111,100,101,20,3,0,0,115,4,0,0, + 0,4,4,255,128,122,24,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,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, + 0,41,2,122,56,82,101,116,117,114,110,32,78,111,110,101, + 32,97,115,32,98,117,105,108,116,45,105,110,32,109,111,100, + 117,108,101,115,32,100,111,32,110,111,116,32,104,97,118,101, + 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,5, + 0,0,0,114,179,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,10,103,101,116,95,115,111,117, + 114,99,101,26,3,0,0,115,4,0,0,0,4,4,255,128, + 122,26,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,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,3, + 122,52,82,101,116,117,114,110,32,70,97,108,115,101,32,97, + 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,115,32,97,114,101,32,110,101,118,101,114,32,112,97,99, + 107,97,103,101,115,46,70,78,114,5,0,0,0,114,179,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,122,0,0,0,32,3,0,0,115,4,0,0,0,4, + 4,255,128,122,26,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,41, + 2,78,78,41,1,78,41,18,114,9,0,0,0,114,8,0, + 0,0,114,1,0,0,0,114,10,0,0,0,114,145,0,0, + 0,218,12,115,116,97,116,105,99,109,101,116,104,111,100,114, + 107,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111, + 100,114,177,0,0,0,114,178,0,0,0,114,156,0,0,0, + 114,157,0,0,0,114,90,0,0,0,114,180,0,0,0,114, + 181,0,0,0,114,122,0,0,0,114,105,0,0,0,114,164, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,169,0,0,0,222,2,0,0, + 115,48,0,0,0,8,0,4,2,4,7,2,2,10,1,2, + 8,12,1,2,8,12,1,2,11,10,1,2,7,10,1,2, + 4,2,1,12,1,2,4,2,1,12,1,2,4,2,1,12, + 1,12,4,255,128,114,169,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, + 0,0,0,115,144,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,90,4,101,5,100,3,100,4,132,0, + 131,1,90,6,101,7,100,22,100,6,100,7,132,1,131,1, + 90,8,101,7,100,23,100,8,100,9,132,1,131,1,90,9, + 101,5,100,10,100,11,132,0,131,1,90,10,101,5,100,12, + 100,13,132,0,131,1,90,11,101,7,100,14,100,15,132,0, + 131,1,90,12,101,7,101,13,100,16,100,17,132,0,131,1, + 131,1,90,14,101,7,101,13,100,18,100,19,132,0,131,1, + 131,1,90,15,101,7,101,13,100,20,100,21,132,0,131,1, + 131,1,90,16,100,5,83,0,41,24,218,14,70,114,111,122, + 101,110,73,109,112,111,114,116,101,114,122,142,77,101,116,97, + 32,112,97,116,104,32,105,109,112,111,114,116,32,102,111,114, + 32,102,114,111,122,101,110,32,109,111,100,117,108,101,115,46, + 10,10,32,32,32,32,65,108,108,32,109,101,116,104,111,100, + 115,32,97,114,101,32,101,105,116,104,101,114,32,99,108,97, + 115,115,32,111,114,32,115,116,97,116,105,99,32,109,101,116, + 104,111,100,115,32,116,111,32,97,118,111,105,100,32,116,104, + 101,32,110,101,101,100,32,116,111,10,32,32,32,32,105,110, + 115,116,97,110,116,105,97,116,101,32,116,104,101,32,99,108, + 97,115,115,46,10,10,32,32,32,32,90,6,102,114,111,122, + 101,110,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,4,0,0,0,67,0,0,0,115,16,0,0,0, + 100,1,160,0,124,0,106,1,116,2,106,3,161,2,83,0, + 41,3,114,170,0,0,0,114,160,0,0,0,78,41,4,114, + 49,0,0,0,114,9,0,0,0,114,184,0,0,0,114,145, + 0,0,0,41,1,218,1,109,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,107,0,0,0,52,3,0,0, + 115,4,0,0,0,16,7,255,128,122,26,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,4,0,0,0,0,0,0,0,0, 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, - 42,0,0,0,124,2,100,0,117,1,114,12,100,0,83,0, - 116,0,160,1,124,1,161,1,114,38,116,2,124,1,124,0, - 124,0,106,3,100,1,141,3,83,0,100,0,83,0,169,2, - 78,114,144,0,0,0,41,4,114,61,0,0,0,90,10,105, - 115,95,98,117,105,108,116,105,110,114,98,0,0,0,114,145, - 0,0,0,169,4,218,3,99,108,115,114,85,0,0,0,218, - 4,112,97,116,104,218,6,116,97,114,103,101,116,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,9,102,105, - 110,100,95,115,112,101,99,242,2,0,0,115,12,0,0,0, - 8,2,4,1,10,1,16,1,4,2,255,128,122,25,66,117, - 105,108,116,105,110,73,109,112,111,114,116,101,114,46,102,105, - 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, - 115,30,0,0,0,124,0,160,0,124,1,124,2,161,2,125, - 3,124,3,100,1,117,1,114,26,124,3,106,1,83,0,100, - 1,83,0,41,2,122,175,70,105,110,100,32,116,104,101,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,73,102,32,39,112,97, - 116,104,39,32,105,115,32,101,118,101,114,32,115,112,101,99, - 105,102,105,101,100,32,116,104,101,110,32,116,104,101,32,115, - 101,97,114,99,104,32,105,115,32,99,111,110,115,105,100,101, - 114,101,100,32,97,32,102,97,105,108,117,114,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, - 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,41,2,114,177,0,0,0,114,116, - 0,0,0,41,4,114,174,0,0,0,114,85,0,0,0,114, - 175,0,0,0,114,103,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,11,102,105,110,100,95,109, - 111,100,117,108,101,251,2,0,0,115,6,0,0,0,12,9, - 18,1,255,128,122,27,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,4,0,0,0,67,0,0,0,115,46,0,0,0,124, - 0,106,0,116,1,106,2,118,1,114,34,116,3,100,1,160, - 4,124,0,106,0,161,1,124,0,106,0,100,2,141,2,130, - 1,116,5,116,6,106,7,124,0,131,2,83,0,41,4,122, - 24,67,114,101,97,116,101,32,97,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,114,81,0,0,0,114,19, - 0,0,0,78,41,8,114,20,0,0,0,114,18,0,0,0, - 114,82,0,0,0,114,83,0,0,0,114,49,0,0,0,114, - 71,0,0,0,114,61,0,0,0,90,14,99,114,101,97,116, - 101,95,98,117,105,108,116,105,110,114,168,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,156,0, - 0,0,7,3,0,0,115,12,0,0,0,12,3,12,1,4, - 1,6,255,12,2,255,128,122,29,66,117,105,108,116,105,110, - 73,109,112,111,114,116,101,114,46,99,114,101,97,116,101,95, - 109,111,100,117,108,101,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 16,0,0,0,116,0,116,1,106,2,124,0,131,2,1,0, - 100,1,83,0,41,2,122,22,69,120,101,99,32,97,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,78,41, - 3,114,71,0,0,0,114,61,0,0,0,90,12,101,120,101, - 99,95,98,117,105,108,116,105,110,114,171,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,157,0, - 0,0,15,3,0,0,115,4,0,0,0,16,3,255,128,122, - 27,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, - 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, - 122,57,82,101,116,117,114,110,32,78,111,110,101,32,97,115, - 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, - 115,32,100,111,32,110,111,116,32,104,97,118,101,32,99,111, - 100,101,32,111,98,106,101,99,116,115,46,78,114,5,0,0, - 0,169,2,114,174,0,0,0,114,85,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,8,103,101, - 116,95,99,111,100,101,20,3,0,0,115,4,0,0,0,4, - 4,255,128,122,24,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,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,122,56,82,101,116,117,114,110,32,78,111,110,101,32,97, - 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, - 111,117,114,99,101,32,99,111,100,101,46,78,114,5,0,0, - 0,114,179,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,218,10,103,101,116,95,115,111,117,114,99, - 101,26,3,0,0,115,4,0,0,0,4,4,255,128,122,26, - 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,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,3,122,52, - 82,101,116,117,114,110,32,70,97,108,115,101,32,97,115,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, - 32,97,114,101,32,110,101,118,101,114,32,112,97,99,107,97, - 103,101,115,46,70,78,114,5,0,0,0,114,179,0,0,0, + 30,0,0,0,116,0,160,1,124,1,161,1,114,26,116,2, + 124,1,124,0,124,0,106,3,100,1,141,3,83,0,100,0, + 83,0,114,172,0,0,0,41,4,114,61,0,0,0,114,92, + 0,0,0,114,98,0,0,0,114,145,0,0,0,114,173,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,177,0,0,0,61,3,0,0,115,8,0,0,0,10, + 2,16,1,4,2,255,128,122,24,70,114,111,122,101,110,73, + 109,112,111,114,116,101,114,46,102,105,110,100,95,115,112,101, + 99,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,3,0,0,0,67,0,0,0,115,18,0,0,0,116, + 0,160,1,124,1,161,1,114,14,124,0,83,0,100,1,83, + 0,41,2,122,93,70,105,110,100,32,97,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,46,10,10,32,32,32,32, + 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, + 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, + 32,32,78,41,2,114,61,0,0,0,114,92,0,0,0,41, + 3,114,174,0,0,0,114,85,0,0,0,114,175,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 122,0,0,0,32,3,0,0,115,4,0,0,0,4,4,255, - 128,122,26,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,41,2,78, - 78,41,1,78,41,18,114,9,0,0,0,114,8,0,0,0, - 114,1,0,0,0,114,10,0,0,0,114,145,0,0,0,218, - 12,115,116,97,116,105,99,109,101,116,104,111,100,114,107,0, - 0,0,218,11,99,108,97,115,115,109,101,116,104,111,100,114, - 177,0,0,0,114,178,0,0,0,114,156,0,0,0,114,157, - 0,0,0,114,90,0,0,0,114,180,0,0,0,114,181,0, - 0,0,114,122,0,0,0,114,105,0,0,0,114,164,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,169,0,0,0,222,2,0,0,115,48, - 0,0,0,8,0,4,2,4,7,2,2,10,1,2,8,12, - 1,2,8,12,1,2,11,10,1,2,7,10,1,2,4,2, - 1,12,1,2,4,2,1,12,1,2,4,2,1,12,1,12, - 4,255,128,114,169,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, - 0,115,144,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,90,4,101,5,100,3,100,4,132,0,131,1, - 90,6,101,7,100,22,100,6,100,7,132,1,131,1,90,8, - 101,7,100,23,100,8,100,9,132,1,131,1,90,9,101,5, - 100,10,100,11,132,0,131,1,90,10,101,5,100,12,100,13, - 132,0,131,1,90,11,101,7,100,14,100,15,132,0,131,1, - 90,12,101,7,101,13,100,16,100,17,132,0,131,1,131,1, - 90,14,101,7,101,13,100,18,100,19,132,0,131,1,131,1, - 90,15,101,7,101,13,100,20,100,21,132,0,131,1,131,1, - 90,16,100,5,83,0,41,24,218,14,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,122,142,77,101,116,97,32,112, - 97,116,104,32,105,109,112,111,114,116,32,102,111,114,32,102, - 114,111,122,101,110,32,109,111,100,117,108,101,115,46,10,10, - 32,32,32,32,65,108,108,32,109,101,116,104,111,100,115,32, - 97,114,101,32,101,105,116,104,101,114,32,99,108,97,115,115, - 32,111,114,32,115,116,97,116,105,99,32,109,101,116,104,111, - 100,115,32,116,111,32,97,118,111,105,100,32,116,104,101,32, - 110,101,101,100,32,116,111,10,32,32,32,32,105,110,115,116, - 97,110,116,105,97,116,101,32,116,104,101,32,99,108,97,115, - 115,46,10,10,32,32,32,32,90,6,102,114,111,122,101,110, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,4,0,0,0,67,0,0,0,115,16,0,0,0,100,1, - 160,0,124,0,106,1,116,2,106,3,161,2,83,0,41,3, - 114,170,0,0,0,114,160,0,0,0,78,41,4,114,49,0, - 0,0,114,9,0,0,0,114,184,0,0,0,114,145,0,0, - 0,41,1,218,1,109,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,107,0,0,0,52,3,0,0,115,4, - 0,0,0,16,7,255,128,122,26,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,4,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,5,0,0,0,67,0,0,0,115,30,0, - 0,0,116,0,160,1,124,1,161,1,114,26,116,2,124,1, - 124,0,124,0,106,3,100,1,141,3,83,0,100,0,83,0, - 114,172,0,0,0,41,4,114,61,0,0,0,114,92,0,0, - 0,114,98,0,0,0,114,145,0,0,0,114,173,0,0,0, + 178,0,0,0,68,3,0,0,115,4,0,0,0,18,7,255, + 128,122,26,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,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,115, + 101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,100, + 117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,5, + 0,0,0,114,168,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,156,0,0,0,77,3,0,0, + 115,4,0,0,0,4,0,255,128,122,28,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,99,114,101,97,116,101, + 95,109,111,100,117,108,101,99,1,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,4,0,0,0,67,0,0,0, + 115,64,0,0,0,124,0,106,0,106,1,125,1,116,2,160, + 3,124,1,161,1,115,36,116,4,100,1,160,5,124,1,161, + 1,124,1,100,2,141,2,130,1,116,6,116,2,106,7,124, + 1,131,2,125,2,116,8,124,2,124,0,106,9,131,2,1, + 0,100,0,83,0,114,91,0,0,0,41,10,114,113,0,0, + 0,114,20,0,0,0,114,61,0,0,0,114,92,0,0,0, + 114,83,0,0,0,114,49,0,0,0,114,71,0,0,0,218, + 17,103,101,116,95,102,114,111,122,101,110,95,111,98,106,101, + 99,116,218,4,101,120,101,99,114,14,0,0,0,41,3,114, + 104,0,0,0,114,20,0,0,0,218,4,99,111,100,101,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,157, + 0,0,0,81,3,0,0,115,16,0,0,0,8,2,10,1, + 10,1,2,1,6,255,12,2,16,1,255,128,122,26,70,114, + 111,122,101,110,73,109,112,111,114,116,101,114,46,101,120,101, + 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,10,0,0,0,116,0,124,0,124,1,131,2,83,0, + 41,2,122,95,76,111,97,100,32,97,32,102,114,111,122,101, + 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,101,120,101,99,95,109,111,100,117,108,101,40,41, + 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, + 32,32,32,78,41,1,114,105,0,0,0,114,179,0,0,0, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 177,0,0,0,61,3,0,0,115,8,0,0,0,10,2,16, - 1,4,2,255,128,122,24,70,114,111,122,101,110,73,109,112, - 111,114,116,101,114,46,102,105,110,100,95,115,112,101,99,99, - 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,18,0,0,0,116,0,160, - 1,124,1,161,1,114,14,124,0,83,0,100,1,83,0,41, - 2,122,93,70,105,110,100,32,97,32,102,114,111,122,101,110, - 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, - 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, - 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110, - 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, - 78,41,2,114,61,0,0,0,114,92,0,0,0,41,3,114, - 174,0,0,0,114,85,0,0,0,114,175,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,178,0, - 0,0,68,3,0,0,115,4,0,0,0,18,7,255,128,122, - 26,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,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, - 42,85,115,101,32,100,101,102,97,117,108,116,32,115,101,109, - 97,110,116,105,99,115,32,102,111,114,32,109,111,100,117,108, - 101,32,99,114,101,97,116,105,111,110,46,78,114,5,0,0, - 0,114,168,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,156,0,0,0,77,3,0,0,115,4, - 0,0,0,4,0,255,128,122,28,70,114,111,122,101,110,73, - 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, - 111,100,117,108,101,99,1,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,64, - 0,0,0,124,0,106,0,106,1,125,1,116,2,160,3,124, - 1,161,1,115,36,116,4,100,1,160,5,124,1,161,1,124, - 1,100,2,141,2,130,1,116,6,116,2,106,7,124,1,131, - 2,125,2,116,8,124,2,124,0,106,9,131,2,1,0,100, - 0,83,0,114,91,0,0,0,41,10,114,113,0,0,0,114, - 20,0,0,0,114,61,0,0,0,114,92,0,0,0,114,83, - 0,0,0,114,49,0,0,0,114,71,0,0,0,218,17,103, - 101,116,95,102,114,111,122,101,110,95,111,98,106,101,99,116, - 218,4,101,120,101,99,114,14,0,0,0,41,3,114,104,0, - 0,0,114,20,0,0,0,218,4,99,111,100,101,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,157,0,0, - 0,81,3,0,0,115,16,0,0,0,8,2,10,1,10,1, - 2,1,6,255,12,2,16,1,255,128,122,26,70,114,111,122, - 101,110,73,109,112,111,114,116,101,114,46,101,120,101,99,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 10,0,0,0,116,0,124,0,124,1,131,2,83,0,41,2, - 122,95,76,111,97,100,32,97,32,102,114,111,122,101,110,32, - 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, - 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, - 32,78,41,1,114,105,0,0,0,114,179,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,164,0, - 0,0,90,3,0,0,115,4,0,0,0,10,8,255,128,122, - 26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,10,0,0,0,116,0,160,1,124,1,161, - 1,83,0,41,2,122,45,82,101,116,117,114,110,32,116,104, - 101,32,99,111,100,101,32,111,98,106,101,99,116,32,102,111, - 114,32,116,104,101,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,46,78,41,2,114,61,0,0,0,114,186,0,0, - 0,114,179,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,180,0,0,0,100,3,0,0,115,4, - 0,0,0,10,4,255,128,122,23,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,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, - 83,0,41,2,122,54,82,101,116,117,114,110,32,78,111,110, - 101,32,97,115,32,102,114,111,122,101,110,32,109,111,100,117, - 108,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32, - 115,111,117,114,99,101,32,99,111,100,101,46,78,114,5,0, - 0,0,114,179,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,181,0,0,0,106,3,0,0,115, - 4,0,0,0,4,4,255,128,122,25,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,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,10,0,0, - 0,116,0,160,1,124,1,161,1,83,0,41,2,122,46,82, - 101,116,117,114,110,32,84,114,117,101,32,105,102,32,116,104, - 101,32,102,114,111,122,101,110,32,109,111,100,117,108,101,32, - 105,115,32,97,32,112,97,99,107,97,103,101,46,78,41,2, - 114,61,0,0,0,90,17,105,115,95,102,114,111,122,101,110, - 95,112,97,99,107,97,103,101,114,179,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,122,0,0, - 0,112,3,0,0,115,4,0,0,0,10,4,255,128,122,25, - 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,41,2,78,78,41,1,78, - 41,17,114,9,0,0,0,114,8,0,0,0,114,1,0,0, - 0,114,10,0,0,0,114,145,0,0,0,114,182,0,0,0, - 114,107,0,0,0,114,183,0,0,0,114,177,0,0,0,114, - 178,0,0,0,114,156,0,0,0,114,157,0,0,0,114,164, - 0,0,0,114,94,0,0,0,114,180,0,0,0,114,181,0, - 0,0,114,122,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,184,0,0,0, - 41,3,0,0,115,50,0,0,0,8,0,4,2,4,7,2, - 2,10,1,2,8,12,1,2,6,12,1,2,8,10,1,2, - 3,10,1,2,8,10,1,2,9,2,1,12,1,2,4,2, - 1,12,1,2,4,2,1,16,1,255,128,114,184,0,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,64,0,0,0,115,32,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,83,0,41,7, - 218,18,95,73,109,112,111,114,116,76,111,99,107,67,111,110, - 116,101,120,116,122,36,67,111,110,116,101,120,116,32,109,97, - 110,97,103,101,114,32,102,111,114,32,116,104,101,32,105,109, - 112,111,114,116,32,108,111,99,107,46,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, - 0,0,0,115,12,0,0,0,116,0,160,1,161,0,1,0, - 100,1,83,0,41,2,122,24,65,99,113,117,105,114,101,32, - 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, - 78,41,2,114,61,0,0,0,114,62,0,0,0,114,51,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,58,0,0,0,125,3,0,0,115,4,0,0,0,12, - 2,255,128,122,28,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,0,0,0,0,4,0, - 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,116, - 0,160,1,161,0,1,0,100,1,83,0,41,2,122,60,82, - 101,108,101,97,115,101,32,116,104,101,32,105,109,112,111,114, - 116,32,108,111,99,107,32,114,101,103,97,114,100,108,101,115, - 115,32,111,102,32,97,110,121,32,114,97,105,115,101,100,32, - 101,120,99,101,112,116,105,111,110,115,46,78,41,2,114,61, - 0,0,0,114,64,0,0,0,41,4,114,33,0,0,0,218, - 8,101,120,99,95,116,121,112,101,218,9,101,120,99,95,118, - 97,108,117,101,218,13,101,120,99,95,116,114,97,99,101,98, - 97,99,107,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,60,0,0,0,129,3,0,0,115,4,0,0,0, - 12,2,255,128,122,27,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,41,6,114,9,0,0,0,114,8,0,0,0,114,1, - 0,0,0,114,10,0,0,0,114,58,0,0,0,114,60,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,189,0,0,0,121,3,0,0,115, - 10,0,0,0,8,0,4,2,8,2,12,4,255,128,114,189, - 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,5,0,0,0,67,0,0,0,115,64,0,0, - 0,124,1,160,0,100,1,124,2,100,2,24,0,161,2,125, - 3,116,1,124,3,131,1,124,2,107,0,114,36,116,2,100, - 3,131,1,130,1,124,3,100,4,25,0,125,4,124,0,114, - 60,100,5,160,3,124,4,124,0,161,2,83,0,124,4,83, - 0,41,7,122,50,82,101,115,111,108,118,101,32,97,32,114, - 101,108,97,116,105,118,101,32,109,111,100,117,108,101,32,110, - 97,109,101,32,116,111,32,97,110,32,97,98,115,111,108,117, - 116,101,32,111,110,101,46,114,135,0,0,0,114,42,0,0, - 0,122,50,97,116,116,101,109,112,116,101,100,32,114,101,108, - 97,116,105,118,101,32,105,109,112,111,114,116,32,98,101,121, - 111,110,100,32,116,111,112,45,108,101,118,101,108,32,112,97, - 99,107,97,103,101,114,25,0,0,0,250,5,123,125,46,123, - 125,78,41,4,218,6,114,115,112,108,105,116,218,3,108,101, - 110,114,83,0,0,0,114,49,0,0,0,41,5,114,20,0, - 0,0,218,7,112,97,99,107,97,103,101,218,5,108,101,118, - 101,108,90,4,98,105,116,115,90,4,98,97,115,101,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,13,95, - 114,101,115,111,108,118,101,95,110,97,109,101,134,3,0,0, - 115,12,0,0,0,16,2,12,1,8,1,8,1,20,1,255, - 128,114,198,0,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, - 34,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, - 124,3,100,0,117,0,114,24,100,0,83,0,116,1,124,1, - 124,3,131,2,83,0,114,0,0,0,0,41,2,114,178,0, - 0,0,114,98,0,0,0,41,4,218,6,102,105,110,100,101, - 114,114,20,0,0,0,114,175,0,0,0,114,116,0,0,0, + 164,0,0,0,90,3,0,0,115,4,0,0,0,10,8,255, + 128,122,26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, + 1,161,1,83,0,41,2,122,45,82,101,116,117,114,110,32, + 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, + 102,111,114,32,116,104,101,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,46,78,41,2,114,61,0,0,0,114,186, + 0,0,0,114,179,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,180,0,0,0,100,3,0,0, + 115,4,0,0,0,10,4,255,128,122,23,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,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,41,2,122,54,82,101,116,117,114,110,32,78, + 111,110,101,32,97,115,32,102,114,111,122,101,110,32,109,111, + 100,117,108,101,115,32,100,111,32,110,111,116,32,104,97,118, + 101,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114, + 5,0,0,0,114,179,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,181,0,0,0,106,3,0, + 0,115,4,0,0,0,4,4,255,128,122,25,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,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, + 0,0,0,116,0,160,1,124,1,161,1,83,0,41,2,122, + 46,82,101,116,117,114,110,32,84,114,117,101,32,105,102,32, + 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,78, + 41,2,114,61,0,0,0,90,17,105,115,95,102,114,111,122, + 101,110,95,112,97,99,107,97,103,101,114,179,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,122, + 0,0,0,112,3,0,0,115,4,0,0,0,10,4,255,128, + 122,25,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,41,2,78,78,41, + 1,78,41,17,114,9,0,0,0,114,8,0,0,0,114,1, + 0,0,0,114,10,0,0,0,114,145,0,0,0,114,182,0, + 0,0,114,107,0,0,0,114,183,0,0,0,114,177,0,0, + 0,114,178,0,0,0,114,156,0,0,0,114,157,0,0,0, + 114,164,0,0,0,114,94,0,0,0,114,180,0,0,0,114, + 181,0,0,0,114,122,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,184,0, + 0,0,41,3,0,0,115,50,0,0,0,8,0,4,2,4, + 7,2,2,10,1,2,8,12,1,2,6,12,1,2,8,10, + 1,2,3,10,1,2,8,10,1,2,9,2,1,12,1,2, + 4,2,1,12,1,2,4,2,1,16,1,255,128,114,184,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,64,0,0,0,115,32,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, + 132,0,90,4,100,4,100,5,132,0,90,5,100,6,83,0, + 41,7,218,18,95,73,109,112,111,114,116,76,111,99,107,67, + 111,110,116,101,120,116,122,36,67,111,110,116,101,120,116,32, + 109,97,110,97,103,101,114,32,102,111,114,32,116,104,101,32, + 105,109,112,111,114,116,32,108,111,99,107,46,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, + 0,67,0,0,0,115,12,0,0,0,116,0,160,1,161,0, + 1,0,100,1,83,0,41,2,122,24,65,99,113,117,105,114, + 101,32,116,104,101,32,105,109,112,111,114,116,32,108,111,99, + 107,46,78,41,2,114,61,0,0,0,114,62,0,0,0,114, + 51,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,58,0,0,0,125,3,0,0,115,4,0,0, + 0,12,2,255,128,122,28,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,0,0,0,0, + 4,0,0,0,2,0,0,0,67,0,0,0,115,12,0,0, + 0,116,0,160,1,161,0,1,0,100,1,83,0,41,2,122, + 60,82,101,108,101,97,115,101,32,116,104,101,32,105,109,112, + 111,114,116,32,108,111,99,107,32,114,101,103,97,114,100,108, + 101,115,115,32,111,102,32,97,110,121,32,114,97,105,115,101, + 100,32,101,120,99,101,112,116,105,111,110,115,46,78,41,2, + 114,61,0,0,0,114,64,0,0,0,41,4,114,33,0,0, + 0,218,8,101,120,99,95,116,121,112,101,218,9,101,120,99, + 95,118,97,108,117,101,218,13,101,120,99,95,116,114,97,99, + 101,98,97,99,107,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,60,0,0,0,129,3,0,0,115,4,0, + 0,0,12,2,255,128,122,27,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,41,6,114,9,0,0,0,114,8,0,0,0, + 114,1,0,0,0,114,10,0,0,0,114,58,0,0,0,114, + 60,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,189,0,0,0,121,3,0, + 0,115,10,0,0,0,8,0,4,2,8,2,12,4,255,128, + 114,189,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,64, + 0,0,0,124,1,160,0,100,1,124,2,100,2,24,0,161, + 2,125,3,116,1,124,3,131,1,124,2,107,0,114,36,116, + 2,100,3,131,1,130,1,124,3,100,4,25,0,125,4,124, + 0,114,60,100,5,160,3,124,4,124,0,161,2,83,0,124, + 4,83,0,41,7,122,50,82,101,115,111,108,118,101,32,97, + 32,114,101,108,97,116,105,118,101,32,109,111,100,117,108,101, + 32,110,97,109,101,32,116,111,32,97,110,32,97,98,115,111, + 108,117,116,101,32,111,110,101,46,114,135,0,0,0,114,42, + 0,0,0,122,50,97,116,116,101,109,112,116,101,100,32,114, + 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,98, + 101,121,111,110,100,32,116,111,112,45,108,101,118,101,108,32, + 112,97,99,107,97,103,101,114,25,0,0,0,250,5,123,125, + 46,123,125,78,41,4,218,6,114,115,112,108,105,116,218,3, + 108,101,110,114,83,0,0,0,114,49,0,0,0,41,5,114, + 20,0,0,0,218,7,112,97,99,107,97,103,101,218,5,108, + 101,118,101,108,90,4,98,105,116,115,90,4,98,97,115,101, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 17,95,102,105,110,100,95,115,112,101,99,95,108,101,103,97, - 99,121,143,3,0,0,115,10,0,0,0,12,3,8,1,4, - 1,10,1,255,128,114,200,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,10,0,0,0,10,0,0,0,67, - 0,0,0,115,32,1,0,0,116,0,106,1,125,3,124,3, - 100,1,117,0,114,22,116,2,100,2,131,1,130,1,124,3, - 115,38,116,3,160,4,100,3,116,5,161,2,1,0,124,0, - 116,0,106,6,118,0,125,4,124,3,68,0,93,226,125,5, - 116,7,131,0,143,94,1,0,122,10,124,5,106,8,125,6, - 87,0,110,54,4,0,116,9,144,1,121,30,1,0,1,0, - 1,0,116,10,124,5,124,0,124,1,131,3,125,7,124,7, - 100,1,117,0,114,126,89,0,87,0,100,1,4,0,4,0, - 131,3,1,0,113,52,89,0,110,12,124,6,124,0,124,1, - 124,2,131,3,125,7,87,0,100,1,4,0,4,0,131,3, - 1,0,110,16,49,0,115,162,119,1,1,0,1,0,1,0, - 89,0,1,0,124,7,100,1,117,1,114,52,124,4,144,1, - 115,16,124,0,116,0,106,6,118,0,144,1,114,16,116,0, - 106,6,124,0,25,0,125,8,122,10,124,8,106,11,125,9, - 87,0,110,26,4,0,116,9,144,1,121,28,1,0,1,0, - 1,0,124,7,6,0,89,0,2,0,1,0,83,0,124,9, - 100,1,117,0,144,1,114,8,124,7,2,0,1,0,83,0, - 124,9,2,0,1,0,83,0,124,7,2,0,1,0,83,0, - 100,1,83,0,119,0,119,0,41,4,122,21,70,105,110,100, - 32,97,32,109,111,100,117,108,101,39,115,32,115,112,101,99, - 46,78,122,53,115,121,115,46,109,101,116,97,95,112,97,116, - 104,32,105,115,32,78,111,110,101,44,32,80,121,116,104,111, - 110,32,105,115,32,108,105,107,101,108,121,32,115,104,117,116, - 116,105,110,103,32,100,111,119,110,122,22,115,121,115,46,109, - 101,116,97,95,112,97,116,104,32,105,115,32,101,109,112,116, - 121,41,12,114,18,0,0,0,218,9,109,101,116,97,95,112, - 97,116,104,114,83,0,0,0,114,95,0,0,0,114,96,0, - 0,0,114,163,0,0,0,114,99,0,0,0,114,189,0,0, - 0,114,177,0,0,0,114,2,0,0,0,114,200,0,0,0, - 114,113,0,0,0,41,10,114,20,0,0,0,114,175,0,0, - 0,114,176,0,0,0,114,201,0,0,0,90,9,105,115,95, - 114,101,108,111,97,100,114,199,0,0,0,114,177,0,0,0, - 114,103,0,0,0,114,104,0,0,0,114,113,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,10, - 95,102,105,110,100,95,115,112,101,99,152,3,0,0,115,60, - 0,0,0,6,2,8,1,8,2,4,3,12,1,10,5,8, - 1,8,1,2,1,10,1,14,1,12,1,8,1,20,1,42, - 2,8,1,18,2,10,1,2,1,10,1,14,1,12,4,10, - 2,8,1,8,2,8,2,4,2,2,243,2,244,255,128,114, - 202,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,5,0,0,0,67,0,0,0,115,110,0, - 0,0,116,0,124,0,116,1,131,2,115,28,116,2,100,1, - 160,3,116,4,124,0,131,1,161,1,131,1,130,1,124,2, - 100,2,107,0,114,44,116,5,100,3,131,1,130,1,124,2, - 100,2,107,4,114,82,116,0,124,1,116,1,131,2,115,70, - 116,2,100,4,131,1,130,1,124,1,115,82,116,6,100,5, - 131,1,130,1,124,0,115,106,124,2,100,2,107,2,114,102, - 116,5,100,6,131,1,130,1,100,7,83,0,100,7,83,0, - 41,8,122,28,86,101,114,105,102,121,32,97,114,103,117,109, - 101,110,116,115,32,97,114,101,32,34,115,97,110,101,34,46, - 122,31,109,111,100,117,108,101,32,110,97,109,101,32,109,117, - 115,116,32,98,101,32,115,116,114,44,32,110,111,116,32,123, - 125,114,25,0,0,0,122,18,108,101,118,101,108,32,109,117, - 115,116,32,98,101,32,62,61,32,48,122,31,95,95,112,97, - 99,107,97,103,101,95,95,32,110,111,116,32,115,101,116,32, - 116,111,32,97,32,115,116,114,105,110,103,122,54,97,116,116, - 101,109,112,116,101,100,32,114,101,108,97,116,105,118,101,32, - 105,109,112,111,114,116,32,119,105,116,104,32,110,111,32,107, - 110,111,119,110,32,112,97,114,101,110,116,32,112,97,99,107, - 97,103,101,122,17,69,109,112,116,121,32,109,111,100,117,108, - 101,32,110,97,109,101,78,41,7,218,10,105,115,105,110,115, - 116,97,110,99,101,218,3,115,116,114,218,9,84,121,112,101, - 69,114,114,111,114,114,49,0,0,0,114,3,0,0,0,218, - 10,86,97,108,117,101,69,114,114,111,114,114,83,0,0,0, - 169,3,114,20,0,0,0,114,196,0,0,0,114,197,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,13,95,115,97,110,105,116,121,95,99,104,101,99,107,199, - 3,0,0,115,26,0,0,0,10,2,18,1,8,1,8,1, - 8,1,10,1,8,1,4,1,8,1,12,2,8,1,8,255, - 255,128,114,208,0,0,0,122,16,78,111,32,109,111,100,117, - 108,101,32,110,97,109,101,100,32,122,4,123,33,114,125,99, - 2,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, - 8,0,0,0,67,0,0,0,115,22,1,0,0,100,0,125, - 2,124,0,160,0,100,1,161,1,100,2,25,0,125,3,124, - 3,114,128,124,3,116,1,106,2,118,1,114,42,116,3,124, - 1,124,3,131,2,1,0,124,0,116,1,106,2,118,0,114, - 62,116,1,106,2,124,0,25,0,83,0,116,1,106,2,124, - 3,25,0,125,4,122,10,124,4,106,4,125,2,87,0,110, - 44,4,0,116,5,144,1,121,20,1,0,1,0,1,0,116, - 6,100,3,23,0,160,7,124,0,124,3,161,2,125,5,116, - 8,124,5,124,0,100,4,141,2,100,0,130,2,116,9,124, - 0,124,2,131,2,125,6,124,6,100,0,117,0,114,164,116, - 8,116,6,160,7,124,0,161,1,124,0,100,4,141,2,130, - 1,116,10,124,6,131,1,125,7,124,3,144,1,114,14,116, - 1,106,2,124,3,25,0,125,4,124,0,160,0,100,1,161, - 1,100,5,25,0,125,8,122,18,116,11,124,4,124,8,124, - 7,131,3,1,0,87,0,124,7,83,0,4,0,116,5,144, - 1,121,18,1,0,1,0,1,0,100,6,124,3,155,2,100, - 7,124,8,155,2,157,4,125,5,116,12,160,13,124,5,116, - 14,161,2,1,0,89,0,124,7,83,0,124,7,83,0,119, - 0,119,0,41,8,78,114,135,0,0,0,114,25,0,0,0, - 122,23,59,32,123,33,114,125,32,105,115,32,110,111,116,32, - 97,32,112,97,99,107,97,103,101,114,19,0,0,0,233,2, - 0,0,0,122,27,67,97,110,110,111,116,32,115,101,116,32, - 97,110,32,97,116,116,114,105,98,117,116,101,32,111,110,32, - 122,18,32,102,111,114,32,99,104,105,108,100,32,109,111,100, - 117,108,101,32,41,15,114,136,0,0,0,114,18,0,0,0, - 114,99,0,0,0,114,71,0,0,0,114,148,0,0,0,114, - 2,0,0,0,218,8,95,69,82,82,95,77,83,71,114,49, - 0,0,0,218,19,77,111,100,117,108,101,78,111,116,70,111, - 117,110,100,69,114,114,111,114,114,202,0,0,0,114,167,0, - 0,0,114,12,0,0,0,114,95,0,0,0,114,96,0,0, - 0,114,163,0,0,0,41,9,114,20,0,0,0,218,7,105, - 109,112,111,114,116,95,114,175,0,0,0,114,137,0,0,0, - 90,13,112,97,114,101,110,116,95,109,111,100,117,108,101,114, - 102,0,0,0,114,103,0,0,0,114,104,0,0,0,90,5, - 99,104,105,108,100,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,23,95,102,105,110,100,95,97,110,100,95, - 108,111,97,100,95,117,110,108,111,99,107,101,100,218,3,0, - 0,115,60,0,0,0,4,1,14,1,4,1,10,1,10,1, - 10,2,10,1,10,1,2,1,10,1,14,1,16,1,14,1, - 10,1,8,1,18,1,8,2,6,1,10,2,14,1,2,1, - 14,1,4,4,14,253,16,1,14,1,8,1,2,253,2,242, - 255,128,114,213,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,8,0,0,0,67,0,0,0, - 115,128,0,0,0,116,0,124,0,131,1,143,62,1,0,116, - 1,106,2,160,3,124,0,116,4,161,2,125,2,124,2,116, - 4,117,0,114,56,116,5,124,0,124,1,131,2,87,0,2, - 0,100,1,4,0,4,0,131,3,1,0,83,0,87,0,100, - 1,4,0,4,0,131,3,1,0,110,16,49,0,115,76,119, - 1,1,0,1,0,1,0,89,0,1,0,124,2,100,1,117, - 0,114,116,100,2,160,6,124,0,161,1,125,3,116,7,124, - 3,124,0,100,3,141,2,130,1,116,8,124,0,131,1,1, - 0,124,2,83,0,41,4,122,25,70,105,110,100,32,97,110, - 100,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108, - 101,46,78,122,40,105,109,112,111,114,116,32,111,102,32,123, - 125,32,104,97,108,116,101,100,59,32,78,111,110,101,32,105, - 110,32,115,121,115,46,109,111,100,117,108,101,115,114,19,0, - 0,0,41,9,114,54,0,0,0,114,18,0,0,0,114,99, - 0,0,0,114,38,0,0,0,218,14,95,78,69,69,68,83, - 95,76,79,65,68,73,78,71,114,213,0,0,0,114,49,0, - 0,0,114,211,0,0,0,114,69,0,0,0,41,4,114,20, - 0,0,0,114,212,0,0,0,114,104,0,0,0,114,79,0, + 13,95,114,101,115,111,108,118,101,95,110,97,109,101,134,3, + 0,0,115,12,0,0,0,16,2,12,1,8,1,8,1,20, + 1,255,128,114,198,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, + 0,115,34,0,0,0,124,0,160,0,124,1,124,2,161,2, + 125,3,124,3,100,0,117,0,114,24,100,0,83,0,116,1, + 124,1,124,3,131,2,83,0,114,0,0,0,0,41,2,114, + 178,0,0,0,114,98,0,0,0,41,4,218,6,102,105,110, + 100,101,114,114,20,0,0,0,114,175,0,0,0,114,116,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,14,95,102,105,110,100,95,97,110,100,95,108,111,97, - 100,253,3,0,0,115,24,0,0,0,10,2,14,1,8,1, - 54,1,8,2,4,1,2,1,4,255,12,2,8,2,4,1, - 255,128,114,215,0,0,0,114,25,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, - 0,67,0,0,0,115,42,0,0,0,116,0,124,0,124,1, - 124,2,131,3,1,0,124,2,100,1,107,4,114,32,116,1, - 124,0,124,1,124,2,131,3,125,0,116,2,124,0,116,3, - 131,2,83,0,41,3,97,50,1,0,0,73,109,112,111,114, - 116,32,97,110,100,32,114,101,116,117,114,110,32,116,104,101, - 32,109,111,100,117,108,101,32,98,97,115,101,100,32,111,110, - 32,105,116,115,32,110,97,109,101,44,32,116,104,101,32,112, - 97,99,107,97,103,101,32,116,104,101,32,99,97,108,108,32, - 105,115,10,32,32,32,32,98,101,105,110,103,32,109,97,100, - 101,32,102,114,111,109,44,32,97,110,100,32,116,104,101,32, - 108,101,118,101,108,32,97,100,106,117,115,116,109,101,110,116, - 46,10,10,32,32,32,32,84,104,105,115,32,102,117,110,99, - 116,105,111,110,32,114,101,112,114,101,115,101,110,116,115,32, - 116,104,101,32,103,114,101,97,116,101,115,116,32,99,111,109, - 109,111,110,32,100,101,110,111,109,105,110,97,116,111,114,32, - 111,102,32,102,117,110,99,116,105,111,110,97,108,105,116,121, - 10,32,32,32,32,98,101,116,119,101,101,110,32,105,109,112, - 111,114,116,95,109,111,100,117,108,101,32,97,110,100,32,95, - 95,105,109,112,111,114,116,95,95,46,32,84,104,105,115,32, - 105,110,99,108,117,100,101,115,32,115,101,116,116,105,110,103, - 32,95,95,112,97,99,107,97,103,101,95,95,32,105,102,10, - 32,32,32,32,116,104,101,32,108,111,97,100,101,114,32,100, - 105,100,32,110,111,116,46,10,10,32,32,32,32,114,25,0, - 0,0,78,41,4,114,208,0,0,0,114,198,0,0,0,114, - 215,0,0,0,218,11,95,103,99,100,95,105,109,112,111,114, - 116,114,207,0,0,0,114,5,0,0,0,114,5,0,0,0, - 114,6,0,0,0,114,216,0,0,0,13,4,0,0,115,10, - 0,0,0,12,9,8,1,12,1,10,1,255,128,114,216,0, - 0,0,169,1,218,9,114,101,99,117,114,115,105,118,101,99, - 3,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0, - 11,0,0,0,67,0,0,0,115,216,0,0,0,124,1,68, - 0,93,204,125,4,116,0,124,4,116,1,131,2,115,64,124, - 3,114,34,124,0,106,2,100,1,23,0,125,5,110,4,100, - 2,125,5,116,3,100,3,124,5,155,0,100,4,116,4,124, - 4,131,1,106,2,155,0,157,4,131,1,130,1,124,4,100, - 5,107,2,114,106,124,3,115,4,116,5,124,0,100,6,131, - 2,114,4,116,6,124,0,124,0,106,7,124,2,100,7,100, - 8,141,4,1,0,113,4,116,5,124,0,124,4,131,2,115, - 4,100,9,160,8,124,0,106,2,124,4,161,2,125,6,122, - 14,116,9,124,2,124,6,131,2,1,0,87,0,113,4,4, - 0,116,10,121,214,1,0,125,7,1,0,122,42,124,7,106, - 11,124,6,107,2,114,200,116,12,106,13,160,14,124,6,116, - 15,161,2,100,10,117,1,114,200,87,0,89,0,100,10,125, - 7,126,7,113,4,130,0,100,10,125,7,126,7,119,1,124, - 0,83,0,119,0,41,11,122,238,70,105,103,117,114,101,32, - 111,117,116,32,119,104,97,116,32,95,95,105,109,112,111,114, - 116,95,95,32,115,104,111,117,108,100,32,114,101,116,117,114, - 110,46,10,10,32,32,32,32,84,104,101,32,105,109,112,111, - 114,116,95,32,112,97,114,97,109,101,116,101,114,32,105,115, - 32,97,32,99,97,108,108,97,98,108,101,32,119,104,105,99, - 104,32,116,97,107,101,115,32,116,104,101,32,110,97,109,101, - 32,111,102,32,109,111,100,117,108,101,32,116,111,10,32,32, - 32,32,105,109,112,111,114,116,46,32,73,116,32,105,115,32, - 114,101,113,117,105,114,101,100,32,116,111,32,100,101,99,111, - 117,112,108,101,32,116,104,101,32,102,117,110,99,116,105,111, - 110,32,102,114,111,109,32,97,115,115,117,109,105,110,103,32, - 105,109,112,111,114,116,108,105,98,39,115,10,32,32,32,32, - 105,109,112,111,114,116,32,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,32,105,115,32,100,101,115,105,114,101,100, - 46,10,10,32,32,32,32,122,8,46,95,95,97,108,108,95, - 95,122,13,96,96,102,114,111,109,32,108,105,115,116,39,39, - 122,8,73,116,101,109,32,105,110,32,122,18,32,109,117,115, - 116,32,98,101,32,115,116,114,44,32,110,111,116,32,250,1, - 42,218,7,95,95,97,108,108,95,95,84,114,217,0,0,0, - 114,193,0,0,0,78,41,16,114,203,0,0,0,114,204,0, - 0,0,114,9,0,0,0,114,205,0,0,0,114,3,0,0, - 0,114,11,0,0,0,218,16,95,104,97,110,100,108,101,95, - 102,114,111,109,108,105,115,116,114,220,0,0,0,114,49,0, - 0,0,114,71,0,0,0,114,211,0,0,0,114,20,0,0, + 0,218,17,95,102,105,110,100,95,115,112,101,99,95,108,101, + 103,97,99,121,143,3,0,0,115,10,0,0,0,12,3,8, + 1,4,1,10,1,255,128,114,200,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0, + 0,67,0,0,0,115,36,1,0,0,116,0,106,1,125,3, + 124,3,100,1,117,0,114,22,116,2,100,2,131,1,130,1, + 124,3,115,38,116,3,160,4,100,3,116,5,161,2,1,0, + 124,0,116,0,106,6,118,0,125,4,124,3,68,0,93,230, + 125,5,116,7,131,0,143,94,1,0,122,10,124,5,106,8, + 125,6,87,0,110,54,4,0,116,9,144,1,121,34,1,0, + 1,0,1,0,116,10,124,5,124,0,124,1,131,3,125,7, + 124,7,100,1,117,0,114,126,89,0,87,0,100,1,4,0, + 4,0,131,3,1,0,113,52,89,0,110,12,124,6,124,0, + 124,1,124,2,131,3,125,7,87,0,100,1,4,0,4,0, + 131,3,1,0,110,16,49,0,115,162,119,1,1,0,1,0, + 1,0,89,0,1,0,124,7,100,1,117,1,144,1,114,26, + 124,4,144,1,115,18,124,0,116,0,106,6,118,0,144,1, + 114,18,116,0,106,6,124,0,25,0,125,8,122,10,124,8, + 106,11,125,9,87,0,110,26,4,0,116,9,144,1,121,32, + 1,0,1,0,1,0,124,7,6,0,89,0,2,0,1,0, + 83,0,124,9,100,1,117,0,144,1,114,10,124,7,2,0, + 1,0,83,0,124,9,2,0,1,0,83,0,124,7,2,0, + 1,0,83,0,113,52,100,1,83,0,119,0,119,0,41,4, + 122,21,70,105,110,100,32,97,32,109,111,100,117,108,101,39, + 115,32,115,112,101,99,46,78,122,53,115,121,115,46,109,101, + 116,97,95,112,97,116,104,32,105,115,32,78,111,110,101,44, + 32,80,121,116,104,111,110,32,105,115,32,108,105,107,101,108, + 121,32,115,104,117,116,116,105,110,103,32,100,111,119,110,122, + 22,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, + 115,32,101,109,112,116,121,41,12,114,18,0,0,0,218,9, + 109,101,116,97,95,112,97,116,104,114,83,0,0,0,114,95, + 0,0,0,114,96,0,0,0,114,163,0,0,0,114,99,0, + 0,0,114,189,0,0,0,114,177,0,0,0,114,2,0,0, + 0,114,200,0,0,0,114,113,0,0,0,41,10,114,20,0, + 0,0,114,175,0,0,0,114,176,0,0,0,114,201,0,0, + 0,90,9,105,115,95,114,101,108,111,97,100,114,199,0,0, + 0,114,177,0,0,0,114,103,0,0,0,114,104,0,0,0, + 114,113,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,10,95,102,105,110,100,95,115,112,101,99, + 152,3,0,0,115,62,0,0,0,6,2,8,1,8,2,4, + 3,12,1,10,5,8,1,8,1,2,1,10,1,14,1,12, + 1,8,1,20,1,42,2,10,1,18,2,10,1,2,1,10, + 1,14,1,12,4,10,2,8,1,8,2,8,2,2,128,4, + 2,2,243,2,244,255,128,114,202,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, + 0,67,0,0,0,115,110,0,0,0,116,0,124,0,116,1, + 131,2,115,28,116,2,100,1,160,3,116,4,124,0,131,1, + 161,1,131,1,130,1,124,2,100,2,107,0,114,44,116,5, + 100,3,131,1,130,1,124,2,100,2,107,4,114,82,116,0, + 124,1,116,1,131,2,115,70,116,2,100,4,131,1,130,1, + 124,1,115,82,116,6,100,5,131,1,130,1,124,0,115,106, + 124,2,100,2,107,2,114,102,116,5,100,6,131,1,130,1, + 100,7,83,0,100,7,83,0,41,8,122,28,86,101,114,105, + 102,121,32,97,114,103,117,109,101,110,116,115,32,97,114,101, + 32,34,115,97,110,101,34,46,122,31,109,111,100,117,108,101, + 32,110,97,109,101,32,109,117,115,116,32,98,101,32,115,116, + 114,44,32,110,111,116,32,123,125,114,25,0,0,0,122,18, + 108,101,118,101,108,32,109,117,115,116,32,98,101,32,62,61, + 32,48,122,31,95,95,112,97,99,107,97,103,101,95,95,32, + 110,111,116,32,115,101,116,32,116,111,32,97,32,115,116,114, + 105,110,103,122,54,97,116,116,101,109,112,116,101,100,32,114, + 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,119, + 105,116,104,32,110,111,32,107,110,111,119,110,32,112,97,114, + 101,110,116,32,112,97,99,107,97,103,101,122,17,69,109,112, + 116,121,32,109,111,100,117,108,101,32,110,97,109,101,78,41, + 7,218,10,105,115,105,110,115,116,97,110,99,101,218,3,115, + 116,114,218,9,84,121,112,101,69,114,114,111,114,114,49,0, + 0,0,114,3,0,0,0,218,10,86,97,108,117,101,69,114, + 114,111,114,114,83,0,0,0,169,3,114,20,0,0,0,114, + 196,0,0,0,114,197,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,13,95,115,97,110,105,116, + 121,95,99,104,101,99,107,199,3,0,0,115,26,0,0,0, + 10,2,18,1,8,1,8,1,8,1,10,1,8,1,4,1, + 8,1,12,2,8,1,8,255,255,128,114,208,0,0,0,122, + 16,78,111,32,109,111,100,117,108,101,32,110,97,109,101,100, + 32,122,4,123,33,114,125,99,2,0,0,0,0,0,0,0, + 0,0,0,0,9,0,0,0,8,0,0,0,67,0,0,0, + 115,22,1,0,0,100,0,125,2,124,0,160,0,100,1,161, + 1,100,2,25,0,125,3,124,3,114,128,124,3,116,1,106, + 2,118,1,114,42,116,3,124,1,124,3,131,2,1,0,124, + 0,116,1,106,2,118,0,114,62,116,1,106,2,124,0,25, + 0,83,0,116,1,106,2,124,3,25,0,125,4,122,10,124, + 4,106,4,125,2,87,0,110,44,4,0,116,5,144,1,121, + 20,1,0,1,0,1,0,116,6,100,3,23,0,160,7,124, + 0,124,3,161,2,125,5,116,8,124,5,124,0,100,4,141, + 2,100,0,130,2,116,9,124,0,124,2,131,2,125,6,124, + 6,100,0,117,0,114,164,116,8,116,6,160,7,124,0,161, + 1,124,0,100,4,141,2,130,1,116,10,124,6,131,1,125, + 7,124,3,144,1,114,14,116,1,106,2,124,3,25,0,125, + 4,124,0,160,0,100,1,161,1,100,5,25,0,125,8,122, + 18,116,11,124,4,124,8,124,7,131,3,1,0,87,0,124, + 7,83,0,4,0,116,5,144,1,121,18,1,0,1,0,1, + 0,100,6,124,3,155,2,100,7,124,8,155,2,157,4,125, + 5,116,12,160,13,124,5,116,14,161,2,1,0,89,0,124, + 7,83,0,124,7,83,0,119,0,119,0,41,8,78,114,135, + 0,0,0,114,25,0,0,0,122,23,59,32,123,33,114,125, + 32,105,115,32,110,111,116,32,97,32,112,97,99,107,97,103, + 101,114,19,0,0,0,233,2,0,0,0,122,27,67,97,110, + 110,111,116,32,115,101,116,32,97,110,32,97,116,116,114,105, + 98,117,116,101,32,111,110,32,122,18,32,102,111,114,32,99, + 104,105,108,100,32,109,111,100,117,108,101,32,41,15,114,136, + 0,0,0,114,18,0,0,0,114,99,0,0,0,114,71,0, + 0,0,114,148,0,0,0,114,2,0,0,0,218,8,95,69, + 82,82,95,77,83,71,114,49,0,0,0,218,19,77,111,100, + 117,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, + 114,202,0,0,0,114,167,0,0,0,114,12,0,0,0,114, + 95,0,0,0,114,96,0,0,0,114,163,0,0,0,41,9, + 114,20,0,0,0,218,7,105,109,112,111,114,116,95,114,175, + 0,0,0,114,137,0,0,0,90,13,112,97,114,101,110,116, + 95,109,111,100,117,108,101,114,102,0,0,0,114,103,0,0, + 0,114,104,0,0,0,90,5,99,104,105,108,100,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,23,95,102, + 105,110,100,95,97,110,100,95,108,111,97,100,95,117,110,108, + 111,99,107,101,100,218,3,0,0,115,60,0,0,0,4,1, + 14,1,4,1,10,1,10,1,10,2,10,1,10,1,2,1, + 10,1,14,1,16,1,14,1,10,1,8,1,18,1,8,2, + 6,1,10,2,14,1,2,1,14,1,4,4,14,253,16,1, + 14,1,8,1,2,253,2,242,255,128,114,213,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 8,0,0,0,67,0,0,0,115,128,0,0,0,116,0,124, + 0,131,1,143,62,1,0,116,1,106,2,160,3,124,0,116, + 4,161,2,125,2,124,2,116,4,117,0,114,56,116,5,124, + 0,124,1,131,2,87,0,2,0,100,1,4,0,4,0,131, + 3,1,0,83,0,87,0,100,1,4,0,4,0,131,3,1, + 0,110,16,49,0,115,76,119,1,1,0,1,0,1,0,89, + 0,1,0,124,2,100,1,117,0,114,116,100,2,160,6,124, + 0,161,1,125,3,116,7,124,3,124,0,100,3,141,2,130, + 1,116,8,124,0,131,1,1,0,124,2,83,0,41,4,122, + 25,70,105,110,100,32,97,110,100,32,108,111,97,100,32,116, + 104,101,32,109,111,100,117,108,101,46,78,122,40,105,109,112, + 111,114,116,32,111,102,32,123,125,32,104,97,108,116,101,100, + 59,32,78,111,110,101,32,105,110,32,115,121,115,46,109,111, + 100,117,108,101,115,114,19,0,0,0,41,9,114,54,0,0, 0,114,18,0,0,0,114,99,0,0,0,114,38,0,0,0, - 114,214,0,0,0,41,8,114,104,0,0,0,218,8,102,114, - 111,109,108,105,115,116,114,212,0,0,0,114,218,0,0,0, - 218,1,120,90,5,119,104,101,114,101,90,9,102,114,111,109, - 95,110,97,109,101,90,3,101,120,99,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,221,0,0,0,28,4, - 0,0,115,54,0,0,0,8,10,10,1,4,1,12,1,4, - 2,10,1,8,1,8,255,8,2,14,1,10,1,2,1,8, - 255,10,2,14,1,2,1,14,1,14,1,10,4,16,1,2, - 255,12,2,2,1,8,128,4,1,2,248,255,128,114,221,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,6,0,0,0,67,0,0,0,115,146,0,0,0, - 124,0,160,0,100,1,161,1,125,1,124,0,160,0,100,2, - 161,1,125,2,124,1,100,3,117,1,114,82,124,2,100,3, - 117,1,114,78,124,1,124,2,106,1,107,3,114,78,116,2, - 106,3,100,4,124,1,155,2,100,5,124,2,106,1,155,2, - 100,6,157,5,116,4,100,7,100,8,141,3,1,0,124,1, - 83,0,124,2,100,3,117,1,114,96,124,2,106,1,83,0, - 116,2,106,3,100,9,116,4,100,7,100,8,141,3,1,0, - 124,0,100,10,25,0,125,1,100,11,124,0,118,1,114,142, - 124,1,160,5,100,12,161,1,100,13,25,0,125,1,124,1, - 83,0,41,14,122,167,67,97,108,99,117,108,97,116,101,32, - 119,104,97,116,32,95,95,112,97,99,107,97,103,101,95,95, - 32,115,104,111,117,108,100,32,98,101,46,10,10,32,32,32, - 32,95,95,112,97,99,107,97,103,101,95,95,32,105,115,32, - 110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116, - 111,32,98,101,32,100,101,102,105,110,101,100,32,111,114,32, - 99,111,117,108,100,32,98,101,32,115,101,116,32,116,111,32, - 78,111,110,101,10,32,32,32,32,116,111,32,114,101,112,114, - 101,115,101,110,116,32,116,104,97,116,32,105,116,115,32,112, - 114,111,112,101,114,32,118,97,108,117,101,32,105,115,32,117, - 110,107,110,111,119,110,46,10,10,32,32,32,32,114,152,0, - 0,0,114,113,0,0,0,78,122,32,95,95,112,97,99,107, - 97,103,101,95,95,32,33,61,32,95,95,115,112,101,99,95, - 95,46,112,97,114,101,110,116,32,40,122,4,32,33,61,32, - 250,1,41,233,3,0,0,0,41,1,90,10,115,116,97,99, - 107,108,101,118,101,108,122,89,99,97,110,39,116,32,114,101, - 115,111,108,118,101,32,112,97,99,107,97,103,101,32,102,114, - 111,109,32,95,95,115,112,101,99,95,95,32,111,114,32,95, - 95,112,97,99,107,97,103,101,95,95,44,32,102,97,108,108, - 105,110,103,32,98,97,99,107,32,111,110,32,95,95,110,97, - 109,101,95,95,32,97,110,100,32,95,95,112,97,116,104,95, - 95,114,9,0,0,0,114,148,0,0,0,114,135,0,0,0, - 114,25,0,0,0,41,6,114,38,0,0,0,114,137,0,0, - 0,114,95,0,0,0,114,96,0,0,0,114,163,0,0,0, - 114,136,0,0,0,41,3,218,7,103,108,111,98,97,108,115, - 114,196,0,0,0,114,103,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,17,95,99,97,108,99, - 95,95,95,112,97,99,107,97,103,101,95,95,65,4,0,0, - 115,44,0,0,0,10,7,10,1,8,1,18,1,6,1,2, - 1,4,255,4,1,6,255,4,2,6,254,4,3,8,1,6, - 1,6,2,4,2,6,254,8,3,8,1,14,1,4,1,255, - 128,114,227,0,0,0,114,5,0,0,0,99,5,0,0,0, - 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, - 67,0,0,0,115,174,0,0,0,124,4,100,1,107,2,114, - 18,116,0,124,0,131,1,125,5,110,36,124,1,100,2,117, - 1,114,30,124,1,110,2,105,0,125,6,116,1,124,6,131, - 1,125,7,116,0,124,0,124,7,124,4,131,3,125,5,124, - 3,115,148,124,4,100,1,107,2,114,84,116,0,124,0,160, - 2,100,3,161,1,100,1,25,0,131,1,83,0,124,0,115, - 92,124,5,83,0,116,3,124,0,131,1,116,3,124,0,160, - 2,100,3,161,1,100,1,25,0,131,1,24,0,125,8,116, - 4,106,5,124,5,106,6,100,2,116,3,124,5,106,6,131, - 1,124,8,24,0,133,2,25,0,25,0,83,0,116,7,124, - 5,100,4,131,2,114,170,116,8,124,5,124,3,116,0,131, - 3,83,0,124,5,83,0,41,5,97,215,1,0,0,73,109, - 112,111,114,116,32,97,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,84,104,101,32,39,103,108,111,98,97,108,115, - 39,32,97,114,103,117,109,101,110,116,32,105,115,32,117,115, - 101,100,32,116,111,32,105,110,102,101,114,32,119,104,101,114, - 101,32,116,104,101,32,105,109,112,111,114,116,32,105,115,32, - 111,99,99,117,114,114,105,110,103,32,102,114,111,109,10,32, - 32,32,32,116,111,32,104,97,110,100,108,101,32,114,101,108, - 97,116,105,118,101,32,105,109,112,111,114,116,115,46,32,84, - 104,101,32,39,108,111,99,97,108,115,39,32,97,114,103,117, - 109,101,110,116,32,105,115,32,105,103,110,111,114,101,100,46, - 32,84,104,101,10,32,32,32,32,39,102,114,111,109,108,105, - 115,116,39,32,97,114,103,117,109,101,110,116,32,115,112,101, - 99,105,102,105,101,115,32,119,104,97,116,32,115,104,111,117, - 108,100,32,101,120,105,115,116,32,97,115,32,97,116,116,114, - 105,98,117,116,101,115,32,111,110,32,116,104,101,32,109,111, - 100,117,108,101,10,32,32,32,32,98,101,105,110,103,32,105, - 109,112,111,114,116,101,100,32,40,101,46,103,46,32,96,96, - 102,114,111,109,32,109,111,100,117,108,101,32,105,109,112,111, - 114,116,32,60,102,114,111,109,108,105,115,116,62,96,96,41, - 46,32,32,84,104,101,32,39,108,101,118,101,108,39,10,32, - 32,32,32,97,114,103,117,109,101,110,116,32,114,101,112,114, - 101,115,101,110,116,115,32,116,104,101,32,112,97,99,107,97, - 103,101,32,108,111,99,97,116,105,111,110,32,116,111,32,105, - 109,112,111,114,116,32,102,114,111,109,32,105,110,32,97,32, - 114,101,108,97,116,105,118,101,10,32,32,32,32,105,109,112, - 111,114,116,32,40,101,46,103,46,32,96,96,102,114,111,109, - 32,46,46,112,107,103,32,105,109,112,111,114,116,32,109,111, - 100,96,96,32,119,111,117,108,100,32,104,97,118,101,32,97, - 32,39,108,101,118,101,108,39,32,111,102,32,50,41,46,10, - 10,32,32,32,32,114,25,0,0,0,78,114,135,0,0,0, - 114,148,0,0,0,41,9,114,216,0,0,0,114,227,0,0, - 0,218,9,112,97,114,116,105,116,105,111,110,114,195,0,0, - 0,114,18,0,0,0,114,99,0,0,0,114,9,0,0,0, - 114,11,0,0,0,114,221,0,0,0,41,9,114,20,0,0, - 0,114,226,0,0,0,218,6,108,111,99,97,108,115,114,222, - 0,0,0,114,197,0,0,0,114,104,0,0,0,90,8,103, - 108,111,98,97,108,115,95,114,196,0,0,0,90,7,99,117, - 116,95,111,102,102,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,10,95,95,105,109,112,111,114,116,95,95, - 92,4,0,0,115,32,0,0,0,8,11,10,1,16,2,8, - 1,12,1,4,1,8,3,18,1,4,1,4,1,26,4,30, - 3,10,1,12,1,4,2,255,128,114,230,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, - 0,0,0,67,0,0,0,115,38,0,0,0,116,0,160,1, - 124,0,161,1,125,1,124,1,100,0,117,0,114,30,116,2, - 100,1,124,0,23,0,131,1,130,1,116,3,124,1,131,1, - 83,0,41,2,78,122,25,110,111,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,32,110,97,109,101,100,32, - 41,4,114,169,0,0,0,114,177,0,0,0,114,83,0,0, - 0,114,167,0,0,0,41,2,114,20,0,0,0,114,103,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,18,95,98,117,105,108,116,105,110,95,102,114,111,109, - 95,110,97,109,101,129,4,0,0,115,10,0,0,0,10,1, - 8,1,12,1,8,1,255,128,114,231,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,10,0,0,0,5,0, - 0,0,67,0,0,0,115,162,0,0,0,124,1,97,0,124, - 0,97,1,116,2,116,1,131,1,125,2,116,1,106,3,160, - 4,161,0,68,0,93,68,92,2,125,3,125,4,116,5,124, - 4,124,2,131,2,114,26,124,3,116,1,106,6,118,0,114, - 60,116,7,125,5,110,14,116,0,160,8,124,3,161,1,114, - 26,116,9,125,5,116,10,124,4,124,5,131,2,125,6,116, - 11,124,6,124,4,131,2,1,0,113,26,116,1,106,3,116, - 12,25,0,125,7,100,1,68,0,93,46,125,8,124,8,116, - 1,106,3,118,1,114,134,116,13,124,8,131,1,125,9,110, - 10,116,1,106,3,124,8,25,0,125,9,116,14,124,7,124, - 8,124,9,131,3,1,0,113,110,100,2,83,0,41,3,122, - 250,83,101,116,117,112,32,105,109,112,111,114,116,108,105,98, - 32,98,121,32,105,109,112,111,114,116,105,110,103,32,110,101, - 101,100,101,100,32,98,117,105,108,116,45,105,110,32,109,111, - 100,117,108,101,115,32,97,110,100,32,105,110,106,101,99,116, - 105,110,103,32,116,104,101,109,10,32,32,32,32,105,110,116, - 111,32,116,104,101,32,103,108,111,98,97,108,32,110,97,109, - 101,115,112,97,99,101,46,10,10,32,32,32,32,65,115,32, - 115,121,115,32,105,115,32,110,101,101,100,101,100,32,102,111, - 114,32,115,121,115,46,109,111,100,117,108,101,115,32,97,99, - 99,101,115,115,32,97,110,100,32,95,105,109,112,32,105,115, - 32,110,101,101,100,101,100,32,116,111,32,108,111,97,100,32, - 98,117,105,108,116,45,105,110,10,32,32,32,32,109,111,100, - 117,108,101,115,44,32,116,104,111,115,101,32,116,119,111,32, - 109,111,100,117,108,101,115,32,109,117,115,116,32,98,101,32, - 101,120,112,108,105,99,105,116,108,121,32,112,97,115,115,101, - 100,32,105,110,46,10,10,32,32,32,32,41,3,114,26,0, - 0,0,114,95,0,0,0,114,68,0,0,0,78,41,15,114, - 61,0,0,0,114,18,0,0,0,114,3,0,0,0,114,99, - 0,0,0,218,5,105,116,101,109,115,114,203,0,0,0,114, - 82,0,0,0,114,169,0,0,0,114,92,0,0,0,114,184, - 0,0,0,114,149,0,0,0,114,155,0,0,0,114,9,0, - 0,0,114,231,0,0,0,114,12,0,0,0,41,10,218,10, - 115,121,115,95,109,111,100,117,108,101,218,11,95,105,109,112, - 95,109,111,100,117,108,101,90,11,109,111,100,117,108,101,95, - 116,121,112,101,114,20,0,0,0,114,104,0,0,0,114,116, - 0,0,0,114,103,0,0,0,90,11,115,101,108,102,95,109, - 111,100,117,108,101,90,12,98,117,105,108,116,105,110,95,110, - 97,109,101,90,14,98,117,105,108,116,105,110,95,109,111,100, - 117,108,101,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,6,95,115,101,116,117,112,136,4,0,0,115,40, - 0,0,0,4,9,4,1,8,3,18,1,10,1,10,1,6, - 1,10,1,4,1,10,3,10,1,2,128,10,3,8,1,10, + 218,14,95,78,69,69,68,83,95,76,79,65,68,73,78,71, + 114,213,0,0,0,114,49,0,0,0,114,211,0,0,0,114, + 69,0,0,0,41,4,114,20,0,0,0,114,212,0,0,0, + 114,104,0,0,0,114,79,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,14,95,102,105,110,100, + 95,97,110,100,95,108,111,97,100,253,3,0,0,115,24,0, + 0,0,10,2,14,1,8,1,54,1,8,2,4,1,2,1, + 4,255,12,2,8,2,4,1,255,128,114,215,0,0,0,114, + 25,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,4,0,0,0,67,0,0,0,115,42,0, + 0,0,116,0,124,0,124,1,124,2,131,3,1,0,124,2, + 100,1,107,4,114,32,116,1,124,0,124,1,124,2,131,3, + 125,0,116,2,124,0,116,3,131,2,83,0,41,3,97,50, + 1,0,0,73,109,112,111,114,116,32,97,110,100,32,114,101, + 116,117,114,110,32,116,104,101,32,109,111,100,117,108,101,32, + 98,97,115,101,100,32,111,110,32,105,116,115,32,110,97,109, + 101,44,32,116,104,101,32,112,97,99,107,97,103,101,32,116, + 104,101,32,99,97,108,108,32,105,115,10,32,32,32,32,98, + 101,105,110,103,32,109,97,100,101,32,102,114,111,109,44,32, + 97,110,100,32,116,104,101,32,108,101,118,101,108,32,97,100, + 106,117,115,116,109,101,110,116,46,10,10,32,32,32,32,84, + 104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,112, + 114,101,115,101,110,116,115,32,116,104,101,32,103,114,101,97, + 116,101,115,116,32,99,111,109,109,111,110,32,100,101,110,111, + 109,105,110,97,116,111,114,32,111,102,32,102,117,110,99,116, + 105,111,110,97,108,105,116,121,10,32,32,32,32,98,101,116, + 119,101,101,110,32,105,109,112,111,114,116,95,109,111,100,117, + 108,101,32,97,110,100,32,95,95,105,109,112,111,114,116,95, + 95,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115, + 32,115,101,116,116,105,110,103,32,95,95,112,97,99,107,97, + 103,101,95,95,32,105,102,10,32,32,32,32,116,104,101,32, + 108,111,97,100,101,114,32,100,105,100,32,110,111,116,46,10, + 10,32,32,32,32,114,25,0,0,0,78,41,4,114,208,0, + 0,0,114,198,0,0,0,114,215,0,0,0,218,11,95,103, + 99,100,95,105,109,112,111,114,116,114,207,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,216,0, + 0,0,13,4,0,0,115,10,0,0,0,12,9,8,1,12, + 1,10,1,255,128,114,216,0,0,0,169,1,218,9,114,101, + 99,117,114,115,105,118,101,99,3,0,0,0,0,0,0,0, + 1,0,0,0,8,0,0,0,11,0,0,0,67,0,0,0, + 115,218,0,0,0,124,1,68,0,93,206,125,4,116,0,124, + 4,116,1,131,2,115,64,124,3,114,34,124,0,106,2,100, + 1,23,0,125,5,110,4,100,2,125,5,116,3,100,3,124, + 5,155,0,100,4,116,4,124,4,131,1,106,2,155,0,157, + 4,131,1,130,1,124,4,100,5,107,2,114,106,124,3,115, + 104,116,5,124,0,100,6,131,2,114,104,116,6,124,0,124, + 0,106,7,124,2,100,7,100,8,141,4,1,0,113,4,116, + 5,124,0,124,4,131,2,115,210,100,9,160,8,124,0,106, + 2,124,4,161,2,125,6,122,14,116,9,124,2,124,6,131, + 2,1,0,87,0,113,4,4,0,116,10,121,216,1,0,125, + 7,1,0,122,42,124,7,106,11,124,6,107,2,114,200,116, + 12,106,13,160,14,124,6,116,15,161,2,100,10,117,1,114, + 200,87,0,89,0,100,10,125,7,126,7,113,4,130,0,100, + 10,125,7,126,7,119,1,113,4,124,0,83,0,119,0,41, + 11,122,238,70,105,103,117,114,101,32,111,117,116,32,119,104, + 97,116,32,95,95,105,109,112,111,114,116,95,95,32,115,104, + 111,117,108,100,32,114,101,116,117,114,110,46,10,10,32,32, + 32,32,84,104,101,32,105,109,112,111,114,116,95,32,112,97, + 114,97,109,101,116,101,114,32,105,115,32,97,32,99,97,108, + 108,97,98,108,101,32,119,104,105,99,104,32,116,97,107,101, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,109,111, + 100,117,108,101,32,116,111,10,32,32,32,32,105,109,112,111, + 114,116,46,32,73,116,32,105,115,32,114,101,113,117,105,114, + 101,100,32,116,111,32,100,101,99,111,117,112,108,101,32,116, + 104,101,32,102,117,110,99,116,105,111,110,32,102,114,111,109, + 32,97,115,115,117,109,105,110,103,32,105,109,112,111,114,116, + 108,105,98,39,115,10,32,32,32,32,105,109,112,111,114,116, + 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, + 105,115,32,100,101,115,105,114,101,100,46,10,10,32,32,32, + 32,122,8,46,95,95,97,108,108,95,95,122,13,96,96,102, + 114,111,109,32,108,105,115,116,39,39,122,8,73,116,101,109, + 32,105,110,32,122,18,32,109,117,115,116,32,98,101,32,115, + 116,114,44,32,110,111,116,32,250,1,42,218,7,95,95,97, + 108,108,95,95,84,114,217,0,0,0,114,193,0,0,0,78, + 41,16,114,203,0,0,0,114,204,0,0,0,114,9,0,0, + 0,114,205,0,0,0,114,3,0,0,0,114,11,0,0,0, + 218,16,95,104,97,110,100,108,101,95,102,114,111,109,108,105, + 115,116,114,220,0,0,0,114,49,0,0,0,114,71,0,0, + 0,114,211,0,0,0,114,20,0,0,0,114,18,0,0,0, + 114,99,0,0,0,114,38,0,0,0,114,214,0,0,0,41, + 8,114,104,0,0,0,218,8,102,114,111,109,108,105,115,116, + 114,212,0,0,0,114,218,0,0,0,218,1,120,90,5,119, + 104,101,114,101,90,9,102,114,111,109,95,110,97,109,101,90, + 3,101,120,99,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,221,0,0,0,28,4,0,0,115,54,0,0, + 0,8,10,10,1,4,1,12,1,4,2,10,1,8,1,8, + 255,8,2,14,1,10,1,2,1,8,255,10,2,14,1,2, + 1,14,1,14,1,10,4,16,1,2,255,12,2,2,1,10, + 128,4,1,2,248,255,128,114,221,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,6,0,0, + 0,67,0,0,0,115,146,0,0,0,124,0,160,0,100,1, + 161,1,125,1,124,0,160,0,100,2,161,1,125,2,124,1, + 100,3,117,1,114,82,124,2,100,3,117,1,114,78,124,1, + 124,2,106,1,107,3,114,78,116,2,106,3,100,4,124,1, + 155,2,100,5,124,2,106,1,155,2,100,6,157,5,116,4, + 100,7,100,8,141,3,1,0,124,1,83,0,124,2,100,3, + 117,1,114,96,124,2,106,1,83,0,116,2,106,3,100,9, + 116,4,100,7,100,8,141,3,1,0,124,0,100,10,25,0, + 125,1,100,11,124,0,118,1,114,142,124,1,160,5,100,12, + 161,1,100,13,25,0,125,1,124,1,83,0,41,14,122,167, + 67,97,108,99,117,108,97,116,101,32,119,104,97,116,32,95, + 95,112,97,99,107,97,103,101,95,95,32,115,104,111,117,108, + 100,32,98,101,46,10,10,32,32,32,32,95,95,112,97,99, + 107,97,103,101,95,95,32,105,115,32,110,111,116,32,103,117, + 97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100, + 101,102,105,110,101,100,32,111,114,32,99,111,117,108,100,32, + 98,101,32,115,101,116,32,116,111,32,78,111,110,101,10,32, + 32,32,32,116,111,32,114,101,112,114,101,115,101,110,116,32, + 116,104,97,116,32,105,116,115,32,112,114,111,112,101,114,32, + 118,97,108,117,101,32,105,115,32,117,110,107,110,111,119,110, + 46,10,10,32,32,32,32,114,152,0,0,0,114,113,0,0, + 0,78,122,32,95,95,112,97,99,107,97,103,101,95,95,32, + 33,61,32,95,95,115,112,101,99,95,95,46,112,97,114,101, + 110,116,32,40,122,4,32,33,61,32,250,1,41,233,3,0, + 0,0,41,1,90,10,115,116,97,99,107,108,101,118,101,108, + 122,89,99,97,110,39,116,32,114,101,115,111,108,118,101,32, + 112,97,99,107,97,103,101,32,102,114,111,109,32,95,95,115, + 112,101,99,95,95,32,111,114,32,95,95,112,97,99,107,97, + 103,101,95,95,44,32,102,97,108,108,105,110,103,32,98,97, + 99,107,32,111,110,32,95,95,110,97,109,101,95,95,32,97, + 110,100,32,95,95,112,97,116,104,95,95,114,9,0,0,0, + 114,148,0,0,0,114,135,0,0,0,114,25,0,0,0,41, + 6,114,38,0,0,0,114,137,0,0,0,114,95,0,0,0, + 114,96,0,0,0,114,163,0,0,0,114,136,0,0,0,41, + 3,218,7,103,108,111,98,97,108,115,114,196,0,0,0,114, + 103,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,17,95,99,97,108,99,95,95,95,112,97,99, + 107,97,103,101,95,95,65,4,0,0,115,44,0,0,0,10, + 7,10,1,8,1,18,1,6,1,2,1,4,255,4,1,6, + 255,4,2,6,254,4,3,8,1,6,1,6,2,4,2,6, + 254,8,3,8,1,14,1,4,1,255,128,114,227,0,0,0, + 114,5,0,0,0,99,5,0,0,0,0,0,0,0,0,0, + 0,0,9,0,0,0,5,0,0,0,67,0,0,0,115,174, + 0,0,0,124,4,100,1,107,2,114,18,116,0,124,0,131, + 1,125,5,110,36,124,1,100,2,117,1,114,30,124,1,110, + 2,105,0,125,6,116,1,124,6,131,1,125,7,116,0,124, + 0,124,7,124,4,131,3,125,5,124,3,115,148,124,4,100, + 1,107,2,114,84,116,0,124,0,160,2,100,3,161,1,100, + 1,25,0,131,1,83,0,124,0,115,92,124,5,83,0,116, + 3,124,0,131,1,116,3,124,0,160,2,100,3,161,1,100, + 1,25,0,131,1,24,0,125,8,116,4,106,5,124,5,106, + 6,100,2,116,3,124,5,106,6,131,1,124,8,24,0,133, + 2,25,0,25,0,83,0,116,7,124,5,100,4,131,2,114, + 170,116,8,124,5,124,3,116,0,131,3,83,0,124,5,83, + 0,41,5,97,215,1,0,0,73,109,112,111,114,116,32,97, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,84,104, + 101,32,39,103,108,111,98,97,108,115,39,32,97,114,103,117, + 109,101,110,116,32,105,115,32,117,115,101,100,32,116,111,32, + 105,110,102,101,114,32,119,104,101,114,101,32,116,104,101,32, + 105,109,112,111,114,116,32,105,115,32,111,99,99,117,114,114, + 105,110,103,32,102,114,111,109,10,32,32,32,32,116,111,32, + 104,97,110,100,108,101,32,114,101,108,97,116,105,118,101,32, + 105,109,112,111,114,116,115,46,32,84,104,101,32,39,108,111, + 99,97,108,115,39,32,97,114,103,117,109,101,110,116,32,105, + 115,32,105,103,110,111,114,101,100,46,32,84,104,101,10,32, + 32,32,32,39,102,114,111,109,108,105,115,116,39,32,97,114, + 103,117,109,101,110,116,32,115,112,101,99,105,102,105,101,115, + 32,119,104,97,116,32,115,104,111,117,108,100,32,101,120,105, + 115,116,32,97,115,32,97,116,116,114,105,98,117,116,101,115, + 32,111,110,32,116,104,101,32,109,111,100,117,108,101,10,32, + 32,32,32,98,101,105,110,103,32,105,109,112,111,114,116,101, + 100,32,40,101,46,103,46,32,96,96,102,114,111,109,32,109, + 111,100,117,108,101,32,105,109,112,111,114,116,32,60,102,114, + 111,109,108,105,115,116,62,96,96,41,46,32,32,84,104,101, + 32,39,108,101,118,101,108,39,10,32,32,32,32,97,114,103, + 117,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115, + 32,116,104,101,32,112,97,99,107,97,103,101,32,108,111,99, + 97,116,105,111,110,32,116,111,32,105,109,112,111,114,116,32, + 102,114,111,109,32,105,110,32,97,32,114,101,108,97,116,105, + 118,101,10,32,32,32,32,105,109,112,111,114,116,32,40,101, + 46,103,46,32,96,96,102,114,111,109,32,46,46,112,107,103, + 32,105,109,112,111,114,116,32,109,111,100,96,96,32,119,111, + 117,108,100,32,104,97,118,101,32,97,32,39,108,101,118,101, + 108,39,32,111,102,32,50,41,46,10,10,32,32,32,32,114, + 25,0,0,0,78,114,135,0,0,0,114,148,0,0,0,41, + 9,114,216,0,0,0,114,227,0,0,0,218,9,112,97,114, + 116,105,116,105,111,110,114,195,0,0,0,114,18,0,0,0, + 114,99,0,0,0,114,9,0,0,0,114,11,0,0,0,114, + 221,0,0,0,41,9,114,20,0,0,0,114,226,0,0,0, + 218,6,108,111,99,97,108,115,114,222,0,0,0,114,197,0, + 0,0,114,104,0,0,0,90,8,103,108,111,98,97,108,115, + 95,114,196,0,0,0,90,7,99,117,116,95,111,102,102,114, + 5,0,0,0,114,5,0,0,0,114,6,0,0,0,218,10, + 95,95,105,109,112,111,114,116,95,95,92,4,0,0,115,32, + 0,0,0,8,11,10,1,16,2,8,1,12,1,4,1,8, + 3,18,1,4,1,4,1,26,4,30,3,10,1,12,1,4, + 2,255,128,114,230,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,38,0,0,0,116,0,160,1,124,0,161,1,125,1, + 124,1,100,0,117,0,114,30,116,2,100,1,124,0,23,0, + 131,1,130,1,116,3,124,1,131,1,83,0,41,2,78,122, + 25,110,111,32,98,117,105,108,116,45,105,110,32,109,111,100, + 117,108,101,32,110,97,109,101,100,32,41,4,114,169,0,0, + 0,114,177,0,0,0,114,83,0,0,0,114,167,0,0,0, + 41,2,114,20,0,0,0,114,103,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,218,18,95,98,117, + 105,108,116,105,110,95,102,114,111,109,95,110,97,109,101,129, + 4,0,0,115,10,0,0,0,10,1,8,1,12,1,8,1, + 255,128,114,231,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0, + 115,166,0,0,0,124,1,97,0,124,0,97,1,116,2,116, + 1,131,1,125,2,116,1,106,3,160,4,161,0,68,0,93, + 72,92,2,125,3,125,4,116,5,124,4,124,2,131,2,114, + 98,124,3,116,1,106,6,118,0,114,60,116,7,125,5,110, + 18,116,0,160,8,124,3,161,1,114,76,116,9,125,5,110, + 2,113,26,116,10,124,4,124,5,131,2,125,6,116,11,124, + 6,124,4,131,2,1,0,113,26,116,1,106,3,116,12,25, + 0,125,7,100,1,68,0,93,46,125,8,124,8,116,1,106, + 3,118,1,114,138,116,13,124,8,131,1,125,9,110,10,116, + 1,106,3,124,8,25,0,125,9,116,14,124,7,124,8,124, + 9,131,3,1,0,113,114,100,2,83,0,41,3,122,250,83, + 101,116,117,112,32,105,109,112,111,114,116,108,105,98,32,98, + 121,32,105,109,112,111,114,116,105,110,103,32,110,101,101,100, + 101,100,32,98,117,105,108,116,45,105,110,32,109,111,100,117, + 108,101,115,32,97,110,100,32,105,110,106,101,99,116,105,110, + 103,32,116,104,101,109,10,32,32,32,32,105,110,116,111,32, + 116,104,101,32,103,108,111,98,97,108,32,110,97,109,101,115, + 112,97,99,101,46,10,10,32,32,32,32,65,115,32,115,121, + 115,32,105,115,32,110,101,101,100,101,100,32,102,111,114,32, + 115,121,115,46,109,111,100,117,108,101,115,32,97,99,99,101, + 115,115,32,97,110,100,32,95,105,109,112,32,105,115,32,110, + 101,101,100,101,100,32,116,111,32,108,111,97,100,32,98,117, + 105,108,116,45,105,110,10,32,32,32,32,109,111,100,117,108, + 101,115,44,32,116,104,111,115,101,32,116,119,111,32,109,111, + 100,117,108,101,115,32,109,117,115,116,32,98,101,32,101,120, + 112,108,105,99,105,116,108,121,32,112,97,115,115,101,100,32, + 105,110,46,10,10,32,32,32,32,41,3,114,26,0,0,0, + 114,95,0,0,0,114,68,0,0,0,78,41,15,114,61,0, + 0,0,114,18,0,0,0,114,3,0,0,0,114,99,0,0, + 0,218,5,105,116,101,109,115,114,203,0,0,0,114,82,0, + 0,0,114,169,0,0,0,114,92,0,0,0,114,184,0,0, + 0,114,149,0,0,0,114,155,0,0,0,114,9,0,0,0, + 114,231,0,0,0,114,12,0,0,0,41,10,218,10,115,121, + 115,95,109,111,100,117,108,101,218,11,95,105,109,112,95,109, + 111,100,117,108,101,90,11,109,111,100,117,108,101,95,116,121, + 112,101,114,20,0,0,0,114,104,0,0,0,114,116,0,0, + 0,114,103,0,0,0,90,11,115,101,108,102,95,109,111,100, + 117,108,101,90,12,98,117,105,108,116,105,110,95,110,97,109, + 101,90,14,98,117,105,108,116,105,110,95,109,111,100,117,108, + 101,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,6,95,115,101,116,117,112,136,4,0,0,115,42,0,0, + 0,4,9,4,1,8,3,18,1,10,1,10,1,6,1,10, + 1,6,1,2,2,10,1,10,1,2,128,10,3,8,1,10, 1,10,1,10,2,14,1,4,251,255,128,114,235,0,0,0, 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, diff --git a/Python/importlib_external.h b/Python/importlib_external.h index f420fa1faaa3df..93dcfb141052a3 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -193,880 +193,881 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 106,111,105,110,94,0,0,0,115,8,0,0,0,10,2,2, 1,8,255,255,128,114,48,0,0,0,99,1,0,0,0,0, 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, - 0,0,0,115,94,0,0,0,116,0,116,1,131,1,100,1, + 0,0,0,115,96,0,0,0,116,0,116,1,131,1,100,1, 107,2,114,36,124,0,160,2,116,3,161,1,92,3,125,1, 125,2,125,3,124,1,124,3,102,2,83,0,116,4,124,0, - 131,1,68,0,93,40,125,4,124,4,116,1,118,0,114,44, + 131,1,68,0,93,42,125,4,124,4,116,1,118,0,114,86, 124,0,106,5,124,4,100,1,100,2,141,2,92,2,125,1, - 125,3,124,1,124,3,102,2,2,0,1,0,83,0,100,3, - 124,0,102,2,83,0,41,5,122,32,82,101,112,108,97,99, - 101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,116, - 104,46,115,112,108,105,116,40,41,46,114,3,0,0,0,41, - 1,90,8,109,97,120,115,112,108,105,116,114,10,0,0,0, - 78,41,6,114,4,0,0,0,114,42,0,0,0,218,10,114, - 112,97,114,116,105,116,105,111,110,114,45,0,0,0,218,8, - 114,101,118,101,114,115,101,100,218,6,114,115,112,108,105,116, - 41,5,218,4,112,97,116,104,90,5,102,114,111,110,116,218, - 1,95,218,4,116,97,105,108,114,32,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,11,95,112, - 97,116,104,95,115,112,108,105,116,100,0,0,0,115,18,0, - 0,0,12,2,16,1,8,1,12,1,8,1,18,1,12,1, - 8,1,255,128,114,55,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,10,0,0,0,116,0,160,1,124,0,161,1,83, - 0,41,2,122,126,83,116,97,116,32,116,104,101,32,112,97, - 116,104,46,10,10,32,32,32,32,77,97,100,101,32,97,32, - 115,101,112,97,114,97,116,101,32,102,117,110,99,116,105,111, - 110,32,116,111,32,109,97,107,101,32,105,116,32,101,97,115, - 105,101,114,32,116,111,32,111,118,101,114,114,105,100,101,32, - 105,110,32,101,120,112,101,114,105,109,101,110,116,115,10,32, - 32,32,32,40,101,46,103,46,32,99,97,99,104,101,32,115, - 116,97,116,32,114,101,115,117,108,116,115,41,46,10,10,32, - 32,32,32,78,41,2,114,18,0,0,0,90,4,115,116,97, - 116,169,1,114,52,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,10,95,112,97,116,104,95,115, - 116,97,116,112,0,0,0,115,4,0,0,0,10,7,255,128, - 114,57,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,8,0,0,0,67,0,0,0,115,48, - 0,0,0,122,12,116,0,124,0,131,1,125,2,87,0,110, - 18,4,0,116,1,121,46,1,0,1,0,1,0,89,0,100, - 1,83,0,124,2,106,2,100,2,64,0,124,1,107,2,83, - 0,119,0,41,4,122,49,84,101,115,116,32,119,104,101,116, - 104,101,114,32,116,104,101,32,112,97,116,104,32,105,115,32, - 116,104,101,32,115,112,101,99,105,102,105,101,100,32,109,111, - 100,101,32,116,121,112,101,46,70,105,0,240,0,0,78,41, - 3,114,57,0,0,0,218,7,79,83,69,114,114,111,114,218, - 7,115,116,95,109,111,100,101,41,3,114,52,0,0,0,218, - 4,109,111,100,101,90,9,115,116,97,116,95,105,110,102,111, + 125,3,124,1,124,3,102,2,2,0,1,0,83,0,113,44, + 100,3,124,0,102,2,83,0,41,5,122,32,82,101,112,108, + 97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,112, + 97,116,104,46,115,112,108,105,116,40,41,46,114,3,0,0, + 0,41,1,90,8,109,97,120,115,112,108,105,116,114,10,0, + 0,0,78,41,6,114,4,0,0,0,114,42,0,0,0,218, + 10,114,112,97,114,116,105,116,105,111,110,114,45,0,0,0, + 218,8,114,101,118,101,114,115,101,100,218,6,114,115,112,108, + 105,116,41,5,218,4,112,97,116,104,90,5,102,114,111,110, + 116,218,1,95,218,4,116,97,105,108,114,32,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11, + 95,112,97,116,104,95,115,112,108,105,116,100,0,0,0,115, + 20,0,0,0,12,2,16,1,8,1,12,1,8,1,18,1, + 12,1,2,128,8,1,255,128,114,55,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, + 0,161,1,83,0,41,2,122,126,83,116,97,116,32,116,104, + 101,32,112,97,116,104,46,10,10,32,32,32,32,77,97,100, + 101,32,97,32,115,101,112,97,114,97,116,101,32,102,117,110, + 99,116,105,111,110,32,116,111,32,109,97,107,101,32,105,116, + 32,101,97,115,105,101,114,32,116,111,32,111,118,101,114,114, + 105,100,101,32,105,110,32,101,120,112,101,114,105,109,101,110, + 116,115,10,32,32,32,32,40,101,46,103,46,32,99,97,99, + 104,101,32,115,116,97,116,32,114,101,115,117,108,116,115,41, + 46,10,10,32,32,32,32,78,41,2,114,18,0,0,0,90, + 4,115,116,97,116,169,1,114,52,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,10,95,112,97, + 116,104,95,115,116,97,116,112,0,0,0,115,4,0,0,0, + 10,7,255,128,114,57,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0, + 0,0,115,48,0,0,0,122,12,116,0,124,0,131,1,125, + 2,87,0,110,18,4,0,116,1,121,46,1,0,1,0,1, + 0,89,0,100,1,83,0,124,2,106,2,100,2,64,0,124, + 1,107,2,83,0,119,0,41,4,122,49,84,101,115,116,32, + 119,104,101,116,104,101,114,32,116,104,101,32,112,97,116,104, + 32,105,115,32,116,104,101,32,115,112,101,99,105,102,105,101, + 100,32,109,111,100,101,32,116,121,112,101,46,70,105,0,240, + 0,0,78,41,3,114,57,0,0,0,218,7,79,83,69,114, + 114,111,114,218,7,115,116,95,109,111,100,101,41,3,114,52, + 0,0,0,218,4,109,111,100,101,90,9,115,116,97,116,95, + 105,110,102,111,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,18,95,112,97,116,104,95,105,115,95,109,111, + 100,101,95,116,121,112,101,122,0,0,0,115,14,0,0,0, + 2,2,12,1,12,1,6,1,14,1,2,254,255,128,114,61, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,10,0,0, + 0,116,0,124,0,100,1,131,2,83,0,41,3,122,31,82, + 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, + 115,46,112,97,116,104,46,105,115,102,105,108,101,46,105,0, + 128,0,0,78,41,1,114,61,0,0,0,114,56,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 18,95,112,97,116,104,95,105,115,95,109,111,100,101,95,116, - 121,112,101,122,0,0,0,115,14,0,0,0,2,2,12,1, - 12,1,6,1,14,1,2,254,255,128,114,61,0,0,0,99, + 12,95,112,97,116,104,95,105,115,102,105,108,101,131,0,0, + 0,115,4,0,0,0,10,2,255,128,114,62,0,0,0,99, 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,124, - 0,100,1,131,2,83,0,41,3,122,31,82,101,112,108,97, - 99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,97, - 116,104,46,105,115,102,105,108,101,46,105,0,128,0,0,78, - 41,1,114,61,0,0,0,114,56,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,12,95,112,97, - 116,104,95,105,115,102,105,108,101,131,0,0,0,115,4,0, - 0,0,10,2,255,128,114,62,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,22,0,0,0,124,0,115,12,116,0,160, - 1,161,0,125,0,116,2,124,0,100,1,131,2,83,0,41, - 3,122,30,82,101,112,108,97,99,101,109,101,110,116,32,102, - 111,114,32,111,115,46,112,97,116,104,46,105,115,100,105,114, - 46,105,0,64,0,0,78,41,3,114,18,0,0,0,218,6, - 103,101,116,99,119,100,114,61,0,0,0,114,56,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,95,112,97,116,104,95,105,115,100,105,114,136,0,0,0, - 115,8,0,0,0,4,2,8,1,10,1,255,128,114,64,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,26,0,0,0, - 124,0,160,0,116,1,161,1,112,24,124,0,100,1,100,2, - 133,2,25,0,116,2,118,0,83,0,41,4,122,142,82,101, - 112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,115, - 46,112,97,116,104,46,105,115,97,98,115,46,10,10,32,32, - 32,32,67,111,110,115,105,100,101,114,115,32,97,32,87,105, - 110,100,111,119,115,32,100,114,105,118,101,45,114,101,108,97, - 116,105,118,101,32,112,97,116,104,32,40,110,111,32,100,114, - 105,118,101,44,32,98,117,116,32,115,116,97,114,116,115,32, - 119,105,116,104,32,115,108,97,115,104,41,32,116,111,10,32, - 32,32,32,115,116,105,108,108,32,98,101,32,34,97,98,115, - 111,108,117,116,101,34,46,10,32,32,32,32,114,3,0,0, - 0,233,3,0,0,0,78,41,3,114,23,0,0,0,114,42, - 0,0,0,218,20,95,112,97,116,104,115,101,112,115,95,119, - 105,116,104,95,99,111,108,111,110,114,56,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, - 112,97,116,104,95,105,115,97,98,115,143,0,0,0,115,4, - 0,0,0,26,6,255,128,114,67,0,0,0,233,182,1,0, - 0,99,3,0,0,0,0,0,0,0,0,0,0,0,6,0, - 0,0,11,0,0,0,67,0,0,0,115,174,0,0,0,100, - 1,160,0,124,0,116,1,124,0,131,1,161,2,125,3,116, - 2,160,3,124,3,116,2,106,4,116,2,106,5,66,0,116, - 2,106,6,66,0,124,2,100,2,64,0,161,3,125,4,122, - 72,116,7,160,8,124,4,100,3,161,2,143,26,125,5,124, - 5,160,9,124,1,161,1,1,0,87,0,100,4,4,0,4, - 0,131,3,1,0,110,16,49,0,115,94,119,1,1,0,1, - 0,1,0,89,0,1,0,116,2,160,10,124,3,124,0,161, - 2,1,0,87,0,100,4,83,0,4,0,116,11,121,172,1, - 0,1,0,1,0,122,14,116,2,160,12,124,3,161,1,1, - 0,87,0,130,0,4,0,116,11,121,166,1,0,1,0,1, - 0,89,0,130,0,119,0,100,4,83,0,119,0,41,5,122, - 162,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,250,5,123,125,46,123,125,114,68,0,0,0,90, - 2,119,98,78,41,13,218,6,102,111,114,109,97,116,218,2, - 105,100,114,18,0,0,0,90,4,111,112,101,110,90,6,79, - 95,69,88,67,76,90,7,79,95,67,82,69,65,84,90,8, - 79,95,87,82,79,78,76,89,218,3,95,105,111,218,6,70, - 105,108,101,73,79,218,5,119,114,105,116,101,218,7,114,101, - 112,108,97,99,101,114,58,0,0,0,90,6,117,110,108,105, - 110,107,41,6,114,52,0,0,0,114,37,0,0,0,114,60, - 0,0,0,90,8,112,97,116,104,95,116,109,112,90,2,102, - 100,218,4,102,105,108,101,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,13,95,119,114,105,116,101,95,97, - 116,111,109,105,99,152,0,0,0,115,38,0,0,0,16,5, - 6,1,22,1,4,255,2,2,14,3,40,1,18,1,12,1, - 2,1,12,1,2,3,12,254,2,1,2,1,2,254,4,252, - 2,1,255,128,114,77,0,0,0,105,105,13,0,0,114,39, - 0,0,0,114,29,0,0,0,115,2,0,0,0,13,10,90, - 11,95,95,112,121,99,97,99,104,101,95,95,122,4,111,112, - 116,45,122,3,46,112,121,122,4,46,112,121,119,122,4,46, - 112,121,99,41,1,218,12,111,112,116,105,109,105,122,97,116, - 105,111,110,99,2,0,0,0,0,0,0,0,1,0,0,0, - 12,0,0,0,5,0,0,0,67,0,0,0,115,88,1,0, - 0,124,1,100,1,117,1,114,52,116,0,160,1,100,2,116, - 2,161,2,1,0,124,2,100,1,117,1,114,40,100,3,125, - 3,116,3,124,3,131,1,130,1,124,1,114,48,100,4,110, - 2,100,5,125,2,116,4,160,5,124,0,161,1,125,0,116, - 6,124,0,131,1,92,2,125,4,125,5,124,5,160,7,100, - 6,161,1,92,3,125,6,125,7,125,8,116,8,106,9,106, - 10,125,9,124,9,100,1,117,0,114,114,116,11,100,7,131, - 1,130,1,100,4,160,12,124,6,114,126,124,6,110,2,124, - 8,124,7,124,9,103,3,161,1,125,10,124,2,100,1,117, - 0,114,172,116,8,106,13,106,14,100,8,107,2,114,164,100, - 4,125,2,110,8,116,8,106,13,106,14,125,2,116,15,124, - 2,131,1,125,2,124,2,100,4,107,3,114,224,124,2,160, - 16,161,0,115,210,116,17,100,9,160,18,124,2,161,1,131, - 1,130,1,100,10,160,18,124,10,116,19,124,2,161,3,125, - 10,124,10,116,20,100,8,25,0,23,0,125,11,116,8,106, - 21,100,1,117,1,144,1,114,76,116,22,124,4,131,1,144, - 1,115,16,116,23,116,4,160,24,161,0,124,4,131,2,125, - 4,124,4,100,5,25,0,100,11,107,2,144,1,114,56,124, - 4,100,8,25,0,116,25,118,1,144,1,114,56,124,4,100, - 12,100,1,133,2,25,0,125,4,116,23,116,8,106,21,124, - 4,160,26,116,25,161,1,124,11,131,3,83,0,116,23,124, - 4,116,27,124,11,131,3,83,0,41,13,97,254,2,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,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,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,10,10,32,32,32,32,84,104, - 101,32,39,111,112,116,105,109,105,122,97,116,105,111,110,39, - 32,112,97,114,97,109,101,116,101,114,32,99,111,110,116,114, - 111,108,115,32,116,104,101,32,112,114,101,115,117,109,101,100, - 32,111,112,116,105,109,105,122,97,116,105,111,110,32,108,101, - 118,101,108,32,111,102,10,32,32,32,32,116,104,101,32,98, - 121,116,101,99,111,100,101,32,102,105,108,101,46,32,73,102, - 32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,32, - 105,115,32,110,111,116,32,78,111,110,101,44,32,116,104,101, - 32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110, - 116,97,116,105,111,110,10,32,32,32,32,111,102,32,116,104, - 101,32,97,114,103,117,109,101,110,116,32,105,115,32,116,97, - 107,101,110,32,97,110,100,32,118,101,114,105,102,105,101,100, - 32,116,111,32,98,101,32,97,108,112,104,97,110,117,109,101, - 114,105,99,32,40,101,108,115,101,32,86,97,108,117,101,69, - 114,114,111,114,10,32,32,32,32,105,115,32,114,97,105,115, - 101,100,41,46,10,10,32,32,32,32,84,104,101,32,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,32,112,97,114, - 97,109,101,116,101,114,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,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,10,32,32,32,32,97,32,84,114,117,101,32, - 118,97,108,117,101,32,105,115,32,116,104,101,32,115,97,109, - 101,32,97,115,32,115,101,116,116,105,110,103,32,39,111,112, - 116,105,109,105,122,97,116,105,111,110,39,32,116,111,32,116, - 104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,10, - 32,32,32,32,119,104,105,108,101,32,97,32,70,97,108,115, - 101,32,118,97,108,117,101,32,105,115,32,101,113,117,105,118, - 97,108,101,110,116,32,116,111,32,115,101,116,116,105,110,103, + 3,0,0,0,67,0,0,0,115,22,0,0,0,124,0,115, + 12,116,0,160,1,161,0,125,0,116,2,124,0,100,1,131, + 2,83,0,41,3,122,30,82,101,112,108,97,99,101,109,101, + 110,116,32,102,111,114,32,111,115,46,112,97,116,104,46,105, + 115,100,105,114,46,105,0,64,0,0,78,41,3,114,18,0, + 0,0,218,6,103,101,116,99,119,100,114,61,0,0,0,114, + 56,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,11,95,112,97,116,104,95,105,115,100,105,114, + 136,0,0,0,115,8,0,0,0,4,2,8,1,10,1,255, + 128,114,64,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 26,0,0,0,124,0,160,0,116,1,161,1,112,24,124,0, + 100,1,100,2,133,2,25,0,116,2,118,0,83,0,41,4, + 122,142,82,101,112,108,97,99,101,109,101,110,116,32,102,111, + 114,32,111,115,46,112,97,116,104,46,105,115,97,98,115,46, + 10,10,32,32,32,32,67,111,110,115,105,100,101,114,115,32, + 97,32,87,105,110,100,111,119,115,32,100,114,105,118,101,45, + 114,101,108,97,116,105,118,101,32,112,97,116,104,32,40,110, + 111,32,100,114,105,118,101,44,32,98,117,116,32,115,116,97, + 114,116,115,32,119,105,116,104,32,115,108,97,115,104,41,32, + 116,111,10,32,32,32,32,115,116,105,108,108,32,98,101,32, + 34,97,98,115,111,108,117,116,101,34,46,10,32,32,32,32, + 114,3,0,0,0,233,3,0,0,0,78,41,3,114,23,0, + 0,0,114,42,0,0,0,218,20,95,112,97,116,104,115,101, + 112,115,95,119,105,116,104,95,99,111,108,111,110,114,56,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,11,95,112,97,116,104,95,105,115,97,98,115,143,0, + 0,0,115,4,0,0,0,26,6,255,128,114,67,0,0,0, + 233,182,1,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,6,0,0,0,11,0,0,0,67,0,0,0,115,174, + 0,0,0,100,1,160,0,124,0,116,1,124,0,131,1,161, + 2,125,3,116,2,160,3,124,3,116,2,106,4,116,2,106, + 5,66,0,116,2,106,6,66,0,124,2,100,2,64,0,161, + 3,125,4,122,72,116,7,160,8,124,4,100,3,161,2,143, + 26,125,5,124,5,160,9,124,1,161,1,1,0,87,0,100, + 4,4,0,4,0,131,3,1,0,110,16,49,0,115,94,119, + 1,1,0,1,0,1,0,89,0,1,0,116,2,160,10,124, + 3,124,0,161,2,1,0,87,0,100,4,83,0,4,0,116, + 11,121,172,1,0,1,0,1,0,122,14,116,2,160,12,124, + 3,161,1,1,0,87,0,130,0,4,0,116,11,121,166,1, + 0,1,0,1,0,89,0,130,0,119,0,100,4,83,0,119, + 0,41,5,122,162,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,250,5,123,125,46,123,125,114,68, + 0,0,0,90,2,119,98,78,41,13,218,6,102,111,114,109, + 97,116,218,2,105,100,114,18,0,0,0,90,4,111,112,101, + 110,90,6,79,95,69,88,67,76,90,7,79,95,67,82,69, + 65,84,90,8,79,95,87,82,79,78,76,89,218,3,95,105, + 111,218,6,70,105,108,101,73,79,218,5,119,114,105,116,101, + 218,7,114,101,112,108,97,99,101,114,58,0,0,0,90,6, + 117,110,108,105,110,107,41,6,114,52,0,0,0,114,37,0, + 0,0,114,60,0,0,0,90,8,112,97,116,104,95,116,109, + 112,90,2,102,100,218,4,102,105,108,101,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,13,95,119,114,105, + 116,101,95,97,116,111,109,105,99,152,0,0,0,115,38,0, + 0,0,16,5,6,1,22,1,4,255,2,2,14,3,40,1, + 18,1,12,1,2,1,12,1,2,3,12,254,2,1,2,1, + 2,254,4,252,2,1,255,128,114,77,0,0,0,105,105,13, + 0,0,114,39,0,0,0,114,29,0,0,0,115,2,0,0, + 0,13,10,90,11,95,95,112,121,99,97,99,104,101,95,95, + 122,4,111,112,116,45,122,3,46,112,121,122,4,46,112,121, + 119,122,4,46,112,121,99,41,1,218,12,111,112,116,105,109, + 105,122,97,116,105,111,110,99,2,0,0,0,0,0,0,0, + 1,0,0,0,12,0,0,0,5,0,0,0,67,0,0,0, + 115,88,1,0,0,124,1,100,1,117,1,114,52,116,0,160, + 1,100,2,116,2,161,2,1,0,124,2,100,1,117,1,114, + 40,100,3,125,3,116,3,124,3,131,1,130,1,124,1,114, + 48,100,4,110,2,100,5,125,2,116,4,160,5,124,0,161, + 1,125,0,116,6,124,0,131,1,92,2,125,4,125,5,124, + 5,160,7,100,6,161,1,92,3,125,6,125,7,125,8,116, + 8,106,9,106,10,125,9,124,9,100,1,117,0,114,114,116, + 11,100,7,131,1,130,1,100,4,160,12,124,6,114,126,124, + 6,110,2,124,8,124,7,124,9,103,3,161,1,125,10,124, + 2,100,1,117,0,114,172,116,8,106,13,106,14,100,8,107, + 2,114,164,100,4,125,2,110,8,116,8,106,13,106,14,125, + 2,116,15,124,2,131,1,125,2,124,2,100,4,107,3,114, + 224,124,2,160,16,161,0,115,210,116,17,100,9,160,18,124, + 2,161,1,131,1,130,1,100,10,160,18,124,10,116,19,124, + 2,161,3,125,10,124,10,116,20,100,8,25,0,23,0,125, + 11,116,8,106,21,100,1,117,1,144,1,114,76,116,22,124, + 4,131,1,144,1,115,16,116,23,116,4,160,24,161,0,124, + 4,131,2,125,4,124,4,100,5,25,0,100,11,107,2,144, + 1,114,56,124,4,100,8,25,0,116,25,118,1,144,1,114, + 56,124,4,100,12,100,1,133,2,25,0,125,4,116,23,116, + 8,106,21,124,4,160,26,116,25,161,1,124,11,131,3,83, + 0,116,23,124,4,116,27,124,11,131,3,83,0,41,13,97, + 254,2,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,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,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,10,10,32,32, + 32,32,84,104,101,32,39,111,112,116,105,109,105,122,97,116, + 105,111,110,39,32,112,97,114,97,109,101,116,101,114,32,99, + 111,110,116,114,111,108,115,32,116,104,101,32,112,114,101,115, + 117,109,101,100,32,111,112,116,105,109,105,122,97,116,105,111, + 110,32,108,101,118,101,108,32,111,102,10,32,32,32,32,116, + 104,101,32,98,121,116,101,99,111,100,101,32,102,105,108,101, + 46,32,73,102,32,39,111,112,116,105,109,105,122,97,116,105, + 111,110,39,32,105,115,32,110,111,116,32,78,111,110,101,44, + 32,116,104,101,32,115,116,114,105,110,103,32,114,101,112,114, + 101,115,101,110,116,97,116,105,111,110,10,32,32,32,32,111, + 102,32,116,104,101,32,97,114,103,117,109,101,110,116,32,105, + 115,32,116,97,107,101,110,32,97,110,100,32,118,101,114,105, + 102,105,101,100,32,116,111,32,98,101,32,97,108,112,104,97, + 110,117,109,101,114,105,99,32,40,101,108,115,101,32,86,97, + 108,117,101,69,114,114,111,114,10,32,32,32,32,105,115,32, + 114,97,105,115,101,100,41,46,10,10,32,32,32,32,84,104, + 101,32,100,101,98,117,103,95,111,118,101,114,114,105,100,101, + 32,112,97,114,97,109,101,116,101,114,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,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,10,32,32,32,32,97,32,84, + 114,117,101,32,118,97,108,117,101,32,105,115,32,116,104,101, + 32,115,97,109,101,32,97,115,32,115,101,116,116,105,110,103, 32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,32, - 116,111,32,39,49,39,46,10,10,32,32,32,32,73,102,32, + 116,111,32,116,104,101,32,101,109,112,116,121,32,115,116,114, + 105,110,103,10,32,32,32,32,119,104,105,108,101,32,97,32, + 70,97,108,115,101,32,118,97,108,117,101,32,105,115,32,101, + 113,117,105,118,97,108,101,110,116,32,116,111,32,115,101,116, + 116,105,110,103,32,39,111,112,116,105,109,105,122,97,116,105, + 111,110,39,32,116,111,32,39,49,39,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,122,70,116,104,101,32,100,101,98,117,103,95,111, + 118,101,114,114,105,100,101,32,112,97,114,97,109,101,116,101, + 114,32,105,115,32,100,101,112,114,101,99,97,116,101,100,59, + 32,117,115,101,32,39,111,112,116,105,109,105,122,97,116,105, + 111,110,39,32,105,110,115,116,101,97,100,122,50,100,101,98, + 117,103,95,111,118,101,114,114,105,100,101,32,111,114,32,111, + 112,116,105,109,105,122,97,116,105,111,110,32,109,117,115,116, + 32,98,101,32,115,101,116,32,116,111,32,78,111,110,101,114, + 10,0,0,0,114,3,0,0,0,218,1,46,250,36,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,114,0,0,0,0,122,24,123,33,114,125,32,105,115, + 32,110,111,116,32,97,108,112,104,97,110,117,109,101,114,105, + 99,122,7,123,125,46,123,125,123,125,114,11,0,0,0,114, + 39,0,0,0,41,28,218,9,95,119,97,114,110,105,110,103, + 115,218,4,119,97,114,110,218,18,68,101,112,114,101,99,97, + 116,105,111,110,87,97,114,110,105,110,103,218,9,84,121,112, + 101,69,114,114,111,114,114,18,0,0,0,218,6,102,115,112, + 97,116,104,114,55,0,0,0,114,49,0,0,0,114,15,0, + 0,0,218,14,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,218,9,99,97,99,104,101,95,116,97,103,218,19,78, + 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, + 111,114,114,46,0,0,0,114,16,0,0,0,218,8,111,112, + 116,105,109,105,122,101,218,3,115,116,114,218,7,105,115,97, + 108,110,117,109,218,10,86,97,108,117,101,69,114,114,111,114, + 114,70,0,0,0,218,4,95,79,80,84,218,17,66,89,84, + 69,67,79,68,69,95,83,85,70,70,73,88,69,83,218,14, + 112,121,99,97,99,104,101,95,112,114,101,102,105,120,114,67, + 0,0,0,114,48,0,0,0,114,63,0,0,0,114,42,0, + 0,0,218,6,108,115,116,114,105,112,218,8,95,80,89,67, + 65,67,72,69,41,12,114,52,0,0,0,90,14,100,101,98, + 117,103,95,111,118,101,114,114,105,100,101,114,78,0,0,0, + 218,7,109,101,115,115,97,103,101,218,4,104,101,97,100,114, + 54,0,0,0,90,4,98,97,115,101,114,6,0,0,0,218, + 4,114,101,115,116,90,3,116,97,103,90,15,97,108,109,111, + 115,116,95,102,105,108,101,110,97,109,101,218,8,102,105,108, + 101,110,97,109,101,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,17,99,97,99,104,101,95,102,114,111,109, + 95,115,111,117,114,99,101,85,1,0,0,115,74,0,0,0, + 8,18,6,1,2,1,4,255,8,2,4,1,8,1,12,1, + 10,1,12,1,16,1,8,1,8,1,8,1,24,1,8,1, + 12,1,6,1,8,2,8,1,8,1,8,1,14,1,14,1, + 12,1,12,1,10,9,14,1,28,5,12,1,2,4,4,1, + 8,1,2,1,4,253,12,5,255,128,114,102,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, + 5,0,0,0,67,0,0,0,115,44,1,0,0,116,0,106, + 1,106,2,100,1,117,0,114,20,116,3,100,2,131,1,130, + 1,116,4,160,5,124,0,161,1,125,0,116,6,124,0,131, + 1,92,2,125,1,125,2,100,3,125,3,116,0,106,7,100, + 1,117,1,114,102,116,0,106,7,160,8,116,9,161,1,125, + 4,124,1,160,10,124,4,116,11,23,0,161,1,114,102,124, + 1,116,12,124,4,131,1,100,1,133,2,25,0,125,1,100, + 4,125,3,124,3,115,144,116,6,124,1,131,1,92,2,125, + 1,125,5,124,5,116,13,107,3,114,144,116,14,116,13,155, + 0,100,5,124,0,155,2,157,3,131,1,130,1,124,2,160, + 15,100,6,161,1,125,6,124,6,100,7,118,1,114,176,116, + 14,100,8,124,2,155,2,157,2,131,1,130,1,124,6,100, + 9,107,2,144,1,114,12,124,2,160,16,100,6,100,10,161, + 2,100,11,25,0,125,7,124,7,160,10,116,17,161,1,115, + 226,116,14,100,12,116,17,155,2,157,2,131,1,130,1,124, + 7,116,12,116,17,131,1,100,1,133,2,25,0,125,8,124, + 8,160,18,161,0,144,1,115,12,116,14,100,13,124,7,155, + 2,100,14,157,3,131,1,130,1,124,2,160,19,100,6,161, + 1,100,15,25,0,125,9,116,20,124,1,124,9,116,21,100, + 15,25,0,23,0,131,2,83,0,41,16,97,110,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,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,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,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,47,52,56,56,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,122, - 70,116,104,101,32,100,101,98,117,103,95,111,118,101,114,114, - 105,100,101,32,112,97,114,97,109,101,116,101,114,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,59,32,117,115,101, - 32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,32, - 105,110,115,116,101,97,100,122,50,100,101,98,117,103,95,111, - 118,101,114,114,105,100,101,32,111,114,32,111,112,116,105,109, - 105,122,97,116,105,111,110,32,109,117,115,116,32,98,101,32, - 115,101,116,32,116,111,32,78,111,110,101,114,10,0,0,0, - 114,3,0,0,0,218,1,46,250,36,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,114,0, - 0,0,0,122,24,123,33,114,125,32,105,115,32,110,111,116, - 32,97,108,112,104,97,110,117,109,101,114,105,99,122,7,123, - 125,46,123,125,123,125,114,11,0,0,0,114,39,0,0,0, - 41,28,218,9,95,119,97,114,110,105,110,103,115,218,4,119, - 97,114,110,218,18,68,101,112,114,101,99,97,116,105,111,110, - 87,97,114,110,105,110,103,218,9,84,121,112,101,69,114,114, - 111,114,114,18,0,0,0,218,6,102,115,112,97,116,104,114, - 55,0,0,0,114,49,0,0,0,114,15,0,0,0,218,14, - 105,109,112,108,101,109,101,110,116,97,116,105,111,110,218,9, - 99,97,99,104,101,95,116,97,103,218,19,78,111,116,73,109, - 112,108,101,109,101,110,116,101,100,69,114,114,111,114,114,46, - 0,0,0,114,16,0,0,0,218,8,111,112,116,105,109,105, - 122,101,218,3,115,116,114,218,7,105,115,97,108,110,117,109, - 218,10,86,97,108,117,101,69,114,114,111,114,114,70,0,0, - 0,218,4,95,79,80,84,218,17,66,89,84,69,67,79,68, - 69,95,83,85,70,70,73,88,69,83,218,14,112,121,99,97, - 99,104,101,95,112,114,101,102,105,120,114,67,0,0,0,114, - 48,0,0,0,114,63,0,0,0,114,42,0,0,0,218,6, - 108,115,116,114,105,112,218,8,95,80,89,67,65,67,72,69, - 41,12,114,52,0,0,0,90,14,100,101,98,117,103,95,111, - 118,101,114,114,105,100,101,114,78,0,0,0,218,7,109,101, - 115,115,97,103,101,218,4,104,101,97,100,114,54,0,0,0, - 90,4,98,97,115,101,114,6,0,0,0,218,4,114,101,115, - 116,90,3,116,97,103,90,15,97,108,109,111,115,116,95,102, - 105,108,101,110,97,109,101,218,8,102,105,108,101,110,97,109, - 101,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,17,99,97,99,104,101,95,102,114,111,109,95,115,111,117, - 114,99,101,85,1,0,0,115,74,0,0,0,8,18,6,1, - 2,1,4,255,8,2,4,1,8,1,12,1,10,1,12,1, - 16,1,8,1,8,1,8,1,24,1,8,1,12,1,6,1, - 8,2,8,1,8,1,8,1,14,1,14,1,12,1,12,1, - 10,9,14,1,28,5,12,1,2,4,4,1,8,1,2,1, - 4,253,12,5,255,128,114,102,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,10,0,0,0,5,0,0,0, - 67,0,0,0,115,44,1,0,0,116,0,106,1,106,2,100, - 1,117,0,114,20,116,3,100,2,131,1,130,1,116,4,160, - 5,124,0,161,1,125,0,116,6,124,0,131,1,92,2,125, - 1,125,2,100,3,125,3,116,0,106,7,100,1,117,1,114, - 102,116,0,106,7,160,8,116,9,161,1,125,4,124,1,160, - 10,124,4,116,11,23,0,161,1,114,102,124,1,116,12,124, - 4,131,1,100,1,133,2,25,0,125,1,100,4,125,3,124, - 3,115,144,116,6,124,1,131,1,92,2,125,1,125,5,124, - 5,116,13,107,3,114,144,116,14,116,13,155,0,100,5,124, - 0,155,2,157,3,131,1,130,1,124,2,160,15,100,6,161, - 1,125,6,124,6,100,7,118,1,114,176,116,14,100,8,124, - 2,155,2,157,2,131,1,130,1,124,6,100,9,107,2,144, - 1,114,12,124,2,160,16,100,6,100,10,161,2,100,11,25, - 0,125,7,124,7,160,10,116,17,161,1,115,226,116,14,100, - 12,116,17,155,2,157,2,131,1,130,1,124,7,116,12,116, - 17,131,1,100,1,133,2,25,0,125,8,124,8,160,18,161, - 0,144,1,115,12,116,14,100,13,124,7,155,2,100,14,157, - 3,131,1,130,1,124,2,160,19,100,6,161,1,100,15,25, - 0,125,9,116,20,124,1,124,9,116,21,100,15,25,0,23, - 0,131,2,83,0,41,16,97,110,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,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,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,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,47,52,56, - 56,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,114,80,0,0,0, - 70,84,122,31,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,114,79,0,0,0,62,2,0,0,0,114,39,0, - 0,0,114,65,0,0,0,122,29,101,120,112,101,99,116,101, - 100,32,111,110,108,121,32,50,32,111,114,32,51,32,100,111, - 116,115,32,105,110,32,114,65,0,0,0,114,39,0,0,0, - 233,254,255,255,255,122,53,111,112,116,105,109,105,122,97,116, - 105,111,110,32,112,111,114,116,105,111,110,32,111,102,32,102, - 105,108,101,110,97,109,101,32,100,111,101,115,32,110,111,116, - 32,115,116,97,114,116,32,119,105,116,104,32,122,19,111,112, - 116,105,109,105,122,97,116,105,111,110,32,108,101,118,101,108, - 32,122,29,32,105,115,32,110,111,116,32,97,110,32,97,108, - 112,104,97,110,117,109,101,114,105,99,32,118,97,108,117,101, - 114,0,0,0,0,41,22,114,15,0,0,0,114,86,0,0, - 0,114,87,0,0,0,114,88,0,0,0,114,18,0,0,0, - 114,85,0,0,0,114,55,0,0,0,114,95,0,0,0,114, - 41,0,0,0,114,42,0,0,0,114,23,0,0,0,114,45, - 0,0,0,114,4,0,0,0,114,97,0,0,0,114,92,0, - 0,0,218,5,99,111,117,110,116,114,51,0,0,0,114,93, - 0,0,0,114,91,0,0,0,218,9,112,97,114,116,105,116, - 105,111,110,114,48,0,0,0,218,15,83,79,85,82,67,69, - 95,83,85,70,70,73,88,69,83,41,10,114,52,0,0,0, - 114,99,0,0,0,90,16,112,121,99,97,99,104,101,95,102, - 105,108,101,110,97,109,101,90,23,102,111,117,110,100,95,105, - 110,95,112,121,99,97,99,104,101,95,112,114,101,102,105,120, - 90,13,115,116,114,105,112,112,101,100,95,112,97,116,104,90, - 7,112,121,99,97,99,104,101,90,9,100,111,116,95,99,111, - 117,110,116,114,78,0,0,0,90,9,111,112,116,95,108,101, - 118,101,108,90,13,98,97,115,101,95,102,105,108,101,110,97, - 109,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,17,115,111,117,114,99,101,95,102,114,111,109,95,99, - 97,99,104,101,156,1,0,0,115,62,0,0,0,12,9,8, - 1,10,1,12,1,4,1,10,1,12,1,14,1,16,1,4, - 1,4,1,12,1,8,1,8,1,2,1,8,255,10,2,8, - 1,14,1,10,1,16,1,10,1,4,1,2,1,8,255,16, - 2,10,1,16,1,14,2,18,1,255,128,114,107,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,9,0,0,0,67,0,0,0,115,122,0,0,0,116,0, - 124,0,131,1,100,1,107,2,114,16,100,2,83,0,124,0, - 160,1,100,3,161,1,92,3,125,1,125,2,125,3,124,1, - 114,56,124,3,160,2,161,0,100,4,100,5,133,2,25,0, - 100,6,107,3,114,60,124,0,83,0,122,12,116,3,124,0, - 131,1,125,4,87,0,110,30,4,0,116,4,116,5,102,2, - 121,120,1,0,1,0,1,0,124,0,100,2,100,5,133,2, - 25,0,125,4,89,0,116,6,124,4,131,1,114,116,124,4, - 83,0,124,0,83,0,119,0,41,7,122,188,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,114,0,0,0,0,78,114,79, - 0,0,0,233,253,255,255,255,233,255,255,255,255,90,2,112, - 121,41,7,114,4,0,0,0,114,49,0,0,0,218,5,108, - 111,119,101,114,114,107,0,0,0,114,88,0,0,0,114,92, - 0,0,0,114,62,0,0,0,41,5,218,13,98,121,116,101, - 99,111,100,101,95,112,97,116,104,114,100,0,0,0,114,53, - 0,0,0,90,9,101,120,116,101,110,115,105,111,110,218,11, - 115,111,117,114,99,101,95,112,97,116,104,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,15,95,103,101,116, - 95,115,111,117,114,99,101,102,105,108,101,196,1,0,0,115, - 24,0,0,0,12,7,4,1,16,1,24,1,4,1,2,1, - 12,1,16,1,14,1,16,1,2,254,255,128,114,113,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,8,0,0,0,67,0,0,0,115,68,0,0,0,124, - 0,160,0,116,1,116,2,131,1,161,1,114,44,122,10,116, - 3,124,0,131,1,87,0,83,0,4,0,116,4,121,66,1, - 0,1,0,1,0,89,0,100,0,83,0,124,0,160,0,116, - 1,116,5,131,1,161,1,114,62,124,0,83,0,100,0,83, - 0,119,0,169,1,78,41,6,218,8,101,110,100,115,119,105, - 116,104,218,5,116,117,112,108,101,114,106,0,0,0,114,102, - 0,0,0,114,88,0,0,0,114,94,0,0,0,41,1,114, - 101,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, - 215,1,0,0,115,20,0,0,0,14,1,2,1,10,1,12, - 1,6,1,14,1,4,1,4,2,2,251,255,128,114,117,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,67,0,0,0,115,48,0,0,0, - 122,14,116,0,124,0,131,1,106,1,125,1,87,0,110,18, - 4,0,116,2,121,46,1,0,1,0,1,0,100,1,125,1, - 89,0,124,1,100,2,79,0,125,1,124,1,83,0,119,0, - 41,4,122,51,67,97,108,99,117,108,97,116,101,32,116,104, - 101,32,109,111,100,101,32,112,101,114,109,105,115,115,105,111, - 110,115,32,102,111,114,32,97,32,98,121,116,101,99,111,100, - 101,32,102,105,108,101,46,114,68,0,0,0,233,128,0,0, - 0,78,41,3,114,57,0,0,0,114,59,0,0,0,114,58, - 0,0,0,41,2,114,52,0,0,0,114,60,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, - 95,99,97,108,99,95,109,111,100,101,227,1,0,0,115,16, - 0,0,0,2,2,14,1,12,1,6,1,8,3,4,1,2, - 251,255,128,114,119,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,4,0,0,0,3,0,0, - 0,115,52,0,0,0,100,6,135,0,102,1,100,2,100,3, - 132,9,125,1,116,0,100,1,117,1,114,30,116,0,106,1, - 125,2,110,8,100,4,100,5,132,0,125,2,124,2,124,1, - 136,0,131,2,1,0,124,1,83,0,41,7,122,252,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,0,0,0,0,4,0,0,0,4,0,0,0, - 31,0,0,0,115,72,0,0,0,124,1,100,0,117,0,114, - 16,124,0,106,0,125,1,110,32,124,0,106,0,124,1,107, - 3,114,48,116,1,100,1,124,0,106,0,124,1,102,2,22, - 0,124,1,100,2,141,2,130,1,136,0,124,0,124,1,103, - 2,124,2,162,1,82,0,105,0,124,3,164,1,142,1,83, - 0,41,3,78,122,30,108,111,97,100,101,114,32,102,111,114, - 32,37,115,32,99,97,110,110,111,116,32,104,97,110,100,108, - 101,32,37,115,169,1,218,4,110,97,109,101,41,2,114,121, - 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, - 41,4,218,4,115,101,108,102,114,121,0,0,0,218,4,97, - 114,103,115,218,6,107,119,97,114,103,115,169,1,218,6,109, - 101,116,104,111,100,114,7,0,0,0,114,8,0,0,0,218, - 19,95,99,104,101,99,107,95,110,97,109,101,95,119,114,97, - 112,112,101,114,247,1,0,0,115,20,0,0,0,8,1,8, - 1,10,1,4,1,8,1,2,255,2,1,6,255,24,2,255, - 128,122,40,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,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0, - 83,0,0,0,115,56,0,0,0,100,1,68,0,93,32,125, - 2,116,0,124,1,124,2,131,2,114,4,116,1,124,0,124, - 2,116,2,124,1,124,2,131,2,131,3,1,0,113,4,124, - 0,106,3,160,4,124,1,106,3,161,1,1,0,100,0,83, - 0,41,2,78,41,4,218,10,95,95,109,111,100,117,108,101, - 95,95,218,8,95,95,110,97,109,101,95,95,218,12,95,95, - 113,117,97,108,110,97,109,101,95,95,218,7,95,95,100,111, - 99,95,95,41,5,218,7,104,97,115,97,116,116,114,218,7, - 115,101,116,97,116,116,114,218,7,103,101,116,97,116,116,114, - 218,8,95,95,100,105,99,116,95,95,218,6,117,112,100,97, - 116,101,41,3,90,3,110,101,119,90,3,111,108,100,114,75, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,5,95,119,114,97,112,4,2,0,0,115,12,0, - 0,0,8,1,10,1,18,1,2,128,18,1,255,128,122,26, - 95,99,104,101,99,107,95,110,97,109,101,46,60,108,111,99, - 97,108,115,62,46,95,119,114,97,112,41,1,78,41,2,218, - 10,95,98,111,111,116,115,116,114,97,112,114,138,0,0,0, - 41,3,114,127,0,0,0,114,128,0,0,0,114,138,0,0, - 0,114,7,0,0,0,114,126,0,0,0,114,8,0,0,0, - 218,11,95,99,104,101,99,107,95,110,97,109,101,239,1,0, - 0,115,14,0,0,0,14,8,8,10,8,1,8,2,10,6, - 4,1,255,128,114,140,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,6,0,0,0,67,0, - 0,0,115,60,0,0,0,124,0,160,0,124,1,161,1,92, - 2,125,2,125,3,124,2,100,1,117,0,114,56,116,1,124, - 3,131,1,114,56,100,2,125,4,116,2,160,3,124,4,160, - 4,124,3,100,3,25,0,161,1,116,5,161,2,1,0,124, - 2,83,0,41,4,122,155,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,10,10,32, - 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, - 115,32,100,101,112,114,101,99,97,116,101,100,32,105,110,32, - 102,97,118,111,114,32,111,102,32,102,105,110,100,101,114,46, - 102,105,110,100,95,115,112,101,99,40,41,46,10,10,32,32, - 32,32,78,122,44,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,114,0,0,0,0,41,6,218,11,102,105,110,100,95,108, - 111,97,100,101,114,114,4,0,0,0,114,81,0,0,0,114, - 82,0,0,0,114,70,0,0,0,218,13,73,109,112,111,114, - 116,87,97,114,110,105,110,103,41,5,114,123,0,0,0,218, - 8,102,117,108,108,110,97,109,101,218,6,108,111,97,100,101, - 114,218,8,112,111,114,116,105,111,110,115,218,3,109,115,103, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 17,95,102,105,110,100,95,109,111,100,117,108,101,95,115,104, - 105,109,14,2,0,0,115,12,0,0,0,14,10,16,1,4, - 1,22,1,4,1,255,128,114,147,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, - 0,67,0,0,0,115,166,0,0,0,124,0,100,1,100,2, - 133,2,25,0,125,3,124,3,116,0,107,3,114,64,100,3, - 124,1,155,2,100,4,124,3,155,2,157,4,125,4,116,1, - 160,2,100,5,124,4,161,2,1,0,116,3,124,4,102,1, - 105,0,124,2,164,1,142,1,130,1,116,4,124,0,131,1, - 100,6,107,0,114,106,100,7,124,1,155,2,157,2,125,4, - 116,1,160,2,100,5,124,4,161,2,1,0,116,5,124,4, - 131,1,130,1,116,6,124,0,100,2,100,8,133,2,25,0, - 131,1,125,5,124,5,100,9,64,0,114,162,100,10,124,5, - 155,2,100,11,124,1,155,2,157,4,125,4,116,3,124,4, - 102,1,105,0,124,2,164,1,142,1,130,1,124,5,83,0, - 41,12,97,84,2,0,0,80,101,114,102,111,114,109,32,98, - 97,115,105,99,32,118,97,108,105,100,105,116,121,32,99,104, - 101,99,107,105,110,103,32,111,102,32,97,32,112,121,99,32, - 104,101,97,100,101,114,32,97,110,100,32,114,101,116,117,114, - 110,32,116,104,101,32,102,108,97,103,115,32,102,105,101,108, - 100,44,10,32,32,32,32,119,104,105,99,104,32,100,101,116, - 101,114,109,105,110,101,115,32,104,111,119,32,116,104,101,32, - 112,121,99,32,115,104,111,117,108,100,32,98,101,32,102,117, - 114,116,104,101,114,32,118,97,108,105,100,97,116,101,100,32, - 97,103,97,105,110,115,116,32,116,104,101,32,115,111,117,114, - 99,101,46,10,10,32,32,32,32,42,100,97,116,97,42,32, - 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32, - 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46, - 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116, - 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32, - 32,32,114,101,113,117,105,114,101,100,44,32,116,104,111,117, - 103,104,46,41,10,10,32,32,32,32,42,110,97,109,101,42, - 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, - 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103, - 32,105,109,112,111,114,116,101,100,46,32,73,116,32,105,115, - 32,117,115,101,100,32,102,111,114,32,108,111,103,103,105,110, - 103,46,10,10,32,32,32,32,42,101,120,99,95,100,101,116, - 97,105,108,115,42,32,105,115,32,97,32,100,105,99,116,105, - 111,110,97,114,121,32,112,97,115,115,101,100,32,116,111,32, - 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105, - 116,32,114,97,105,115,101,100,32,102,111,114,10,32,32,32, - 32,105,109,112,114,111,118,101,100,32,100,101,98,117,103,103, - 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,119,104,101,110,32,116,104,101,32,102, - 108,97,103,115,10,32,32,32,32,102,105,101,108,100,32,105, - 115,32,105,110,118,97,108,105,100,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,32,116,114,117,110,99, - 97,116,101,100,46,10,10,32,32,32,32,78,114,28,0,0, - 0,122,20,98,97,100,32,109,97,103,105,99,32,110,117,109, - 98,101,114,32,105,110,32,122,2,58,32,250,2,123,125,233, - 16,0,0,0,122,40,114,101,97,99,104,101,100,32,69,79, - 70,32,119,104,105,108,101,32,114,101,97,100,105,110,103,32, - 112,121,99,32,104,101,97,100,101,114,32,111,102,32,233,8, - 0,0,0,233,252,255,255,255,122,14,105,110,118,97,108,105, - 100,32,102,108,97,103,115,32,122,4,32,105,110,32,41,7, - 218,12,77,65,71,73,67,95,78,85,77,66,69,82,114,139, - 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, - 115,115,97,103,101,114,122,0,0,0,114,4,0,0,0,218, - 8,69,79,70,69,114,114,111,114,114,38,0,0,0,41,6, - 114,37,0,0,0,114,121,0,0,0,218,11,101,120,99,95, - 100,101,116,97,105,108,115,90,5,109,97,103,105,99,114,98, - 0,0,0,114,16,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,13,95,99,108,97,115,115,105, - 102,121,95,112,121,99,31,2,0,0,115,30,0,0,0,12, - 16,8,1,16,1,12,1,16,1,12,1,10,1,12,1,8, - 1,16,1,8,2,16,1,16,1,4,1,255,128,114,156,0, - 0,0,99,5,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,4,0,0,0,67,0,0,0,115,124,0,0,0, - 116,0,124,0,100,1,100,2,133,2,25,0,131,1,124,1, - 100,3,64,0,107,3,114,62,100,4,124,3,155,2,157,2, - 125,5,116,1,160,2,100,5,124,5,161,2,1,0,116,3, - 124,5,102,1,105,0,124,4,164,1,142,1,130,1,124,2, - 100,6,117,1,114,120,116,0,124,0,100,2,100,7,133,2, - 25,0,131,1,124,2,100,3,64,0,107,3,114,116,116,3, - 100,4,124,3,155,2,157,2,102,1,105,0,124,4,164,1, - 142,1,130,1,100,6,83,0,100,6,83,0,41,8,97,7, - 2,0,0,86,97,108,105,100,97,116,101,32,97,32,112,121, - 99,32,97,103,97,105,110,115,116,32,116,104,101,32,115,111, - 117,114,99,101,32,108,97,115,116,45,109,111,100,105,102,105, - 101,100,32,116,105,109,101,46,10,10,32,32,32,32,42,100, - 97,116,97,42,32,105,115,32,116,104,101,32,99,111,110,116, - 101,110,116,115,32,111,102,32,116,104,101,32,112,121,99,32, - 102,105,108,101,46,32,40,79,110,108,121,32,116,104,101,32, - 102,105,114,115,116,32,49,54,32,98,121,116,101,115,32,97, - 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,46, - 41,10,10,32,32,32,32,42,115,111,117,114,99,101,95,109, - 116,105,109,101,42,32,105,115,32,116,104,101,32,108,97,115, - 116,32,109,111,100,105,102,105,101,100,32,116,105,109,101,115, - 116,97,109,112,32,111,102,32,116,104,101,32,115,111,117,114, - 99,101,32,102,105,108,101,46,10,10,32,32,32,32,42,115, - 111,117,114,99,101,95,115,105,122,101,42,32,105,115,32,78, - 111,110,101,32,111,114,32,116,104,101,32,115,105,122,101,32, - 111,102,32,116,104,101,32,115,111,117,114,99,101,32,102,105, - 108,101,32,105,110,32,98,121,116,101,115,46,10,10,32,32, - 32,32,42,110,97,109,101,42,32,105,115,32,116,104,101,32, - 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, - 108,101,32,98,101,105,110,103,32,105,109,112,111,114,116,101, - 100,46,32,73,116,32,105,115,32,117,115,101,100,32,102,111, - 114,32,108,111,103,103,105,110,103,46,10,10,32,32,32,32, - 42,101,120,99,95,100,101,116,97,105,108,115,42,32,105,115, - 32,97,32,100,105,99,116,105,111,110,97,114,121,32,112,97, - 115,115,101,100,32,116,111,32,73,109,112,111,114,116,69,114, - 114,111,114,32,105,102,32,105,116,32,114,97,105,115,101,100, - 32,102,111,114,10,32,32,32,32,105,109,112,114,111,118,101, - 100,32,100,101,98,117,103,103,105,110,103,46,10,10,32,32, - 32,32,65,110,32,73,109,112,111,114,116,69,114,114,111,114, - 32,105,115,32,114,97,105,115,101,100,32,105,102,32,116,104, - 101,32,98,121,116,101,99,111,100,101,32,105,115,32,115,116, - 97,108,101,46,10,10,32,32,32,32,114,150,0,0,0,233, - 12,0,0,0,114,27,0,0,0,122,22,98,121,116,101,99, - 111,100,101,32,105,115,32,115,116,97,108,101,32,102,111,114, - 32,114,148,0,0,0,78,114,149,0,0,0,41,4,114,38, - 0,0,0,114,139,0,0,0,114,153,0,0,0,114,122,0, - 0,0,41,6,114,37,0,0,0,218,12,115,111,117,114,99, - 101,95,109,116,105,109,101,218,11,115,111,117,114,99,101,95, - 115,105,122,101,114,121,0,0,0,114,155,0,0,0,114,98, + 32,114,97,105,115,101,100,46,10,10,32,32,32,32,78,114, + 80,0,0,0,70,84,122,31,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,114,79,0,0,0,62,2,0,0, + 0,114,39,0,0,0,114,65,0,0,0,122,29,101,120,112, + 101,99,116,101,100,32,111,110,108,121,32,50,32,111,114,32, + 51,32,100,111,116,115,32,105,110,32,114,65,0,0,0,114, + 39,0,0,0,233,254,255,255,255,122,53,111,112,116,105,109, + 105,122,97,116,105,111,110,32,112,111,114,116,105,111,110,32, + 111,102,32,102,105,108,101,110,97,109,101,32,100,111,101,115, + 32,110,111,116,32,115,116,97,114,116,32,119,105,116,104,32, + 122,19,111,112,116,105,109,105,122,97,116,105,111,110,32,108, + 101,118,101,108,32,122,29,32,105,115,32,110,111,116,32,97, + 110,32,97,108,112,104,97,110,117,109,101,114,105,99,32,118, + 97,108,117,101,114,0,0,0,0,41,22,114,15,0,0,0, + 114,86,0,0,0,114,87,0,0,0,114,88,0,0,0,114, + 18,0,0,0,114,85,0,0,0,114,55,0,0,0,114,95, + 0,0,0,114,41,0,0,0,114,42,0,0,0,114,23,0, + 0,0,114,45,0,0,0,114,4,0,0,0,114,97,0,0, + 0,114,92,0,0,0,218,5,99,111,117,110,116,114,51,0, + 0,0,114,93,0,0,0,114,91,0,0,0,218,9,112,97, + 114,116,105,116,105,111,110,114,48,0,0,0,218,15,83,79, + 85,82,67,69,95,83,85,70,70,73,88,69,83,41,10,114, + 52,0,0,0,114,99,0,0,0,90,16,112,121,99,97,99, + 104,101,95,102,105,108,101,110,97,109,101,90,23,102,111,117, + 110,100,95,105,110,95,112,121,99,97,99,104,101,95,112,114, + 101,102,105,120,90,13,115,116,114,105,112,112,101,100,95,112, + 97,116,104,90,7,112,121,99,97,99,104,101,90,9,100,111, + 116,95,99,111,117,110,116,114,78,0,0,0,90,9,111,112, + 116,95,108,101,118,101,108,90,13,98,97,115,101,95,102,105, + 108,101,110,97,109,101,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,17,115,111,117,114,99,101,95,102,114, + 111,109,95,99,97,99,104,101,156,1,0,0,115,62,0,0, + 0,12,9,8,1,10,1,12,1,4,1,10,1,12,1,14, + 1,16,1,4,1,4,1,12,1,8,1,8,1,2,1,8, + 255,10,2,8,1,14,1,10,1,16,1,10,1,4,1,2, + 1,8,255,16,2,10,1,16,1,14,2,18,1,255,128,114, + 107,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,9,0,0,0,67,0,0,0,115,122,0, + 0,0,116,0,124,0,131,1,100,1,107,2,114,16,100,2, + 83,0,124,0,160,1,100,3,161,1,92,3,125,1,125,2, + 125,3,124,1,114,56,124,3,160,2,161,0,100,4,100,5, + 133,2,25,0,100,6,107,3,114,60,124,0,83,0,122,12, + 116,3,124,0,131,1,125,4,87,0,110,30,4,0,116,4, + 116,5,102,2,121,120,1,0,1,0,1,0,124,0,100,2, + 100,5,133,2,25,0,125,4,89,0,116,6,124,4,131,1, + 114,116,124,4,83,0,124,0,83,0,119,0,41,7,122,188, + 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,114,0,0,0, + 0,78,114,79,0,0,0,233,253,255,255,255,233,255,255,255, + 255,90,2,112,121,41,7,114,4,0,0,0,114,49,0,0, + 0,218,5,108,111,119,101,114,114,107,0,0,0,114,88,0, + 0,0,114,92,0,0,0,114,62,0,0,0,41,5,218,13, + 98,121,116,101,99,111,100,101,95,112,97,116,104,114,100,0, + 0,0,114,53,0,0,0,90,9,101,120,116,101,110,115,105, + 111,110,218,11,115,111,117,114,99,101,95,112,97,116,104,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,15, + 95,103,101,116,95,115,111,117,114,99,101,102,105,108,101,196, + 1,0,0,115,24,0,0,0,12,7,4,1,16,1,24,1, + 4,1,2,1,12,1,16,1,14,1,16,1,2,254,255,128, + 114,113,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,8,0,0,0,67,0,0,0,115,68, + 0,0,0,124,0,160,0,116,1,116,2,131,1,161,1,114, + 44,122,10,116,3,124,0,131,1,87,0,83,0,4,0,116, + 4,121,66,1,0,1,0,1,0,89,0,100,0,83,0,124, + 0,160,0,116,1,116,5,131,1,161,1,114,62,124,0,83, + 0,100,0,83,0,119,0,169,1,78,41,6,218,8,101,110, + 100,115,119,105,116,104,218,5,116,117,112,108,101,114,106,0, + 0,0,114,102,0,0,0,114,88,0,0,0,114,94,0,0, + 0,41,1,114,101,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,11,95,103,101,116,95,99,97, + 99,104,101,100,215,1,0,0,115,20,0,0,0,14,1,2, + 1,10,1,12,1,6,1,14,1,4,1,4,2,2,251,255, + 128,114,117,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, + 48,0,0,0,122,14,116,0,124,0,131,1,106,1,125,1, + 87,0,110,18,4,0,116,2,121,46,1,0,1,0,1,0, + 100,1,125,1,89,0,124,1,100,2,79,0,125,1,124,1, + 83,0,119,0,41,4,122,51,67,97,108,99,117,108,97,116, + 101,32,116,104,101,32,109,111,100,101,32,112,101,114,109,105, + 115,115,105,111,110,115,32,102,111,114,32,97,32,98,121,116, + 101,99,111,100,101,32,102,105,108,101,46,114,68,0,0,0, + 233,128,0,0,0,78,41,3,114,57,0,0,0,114,59,0, + 0,0,114,58,0,0,0,41,2,114,52,0,0,0,114,60, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,23,95,118,97,108,105,100,97,116,101,95,116,105, - 109,101,115,116,97,109,112,95,112,121,99,64,2,0,0,115, - 20,0,0,0,24,19,10,1,12,1,16,1,8,1,22,1, - 2,255,22,2,8,254,255,128,114,160,0,0,0,99,4,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, - 0,0,67,0,0,0,115,42,0,0,0,124,0,100,1,100, - 2,133,2,25,0,124,1,107,3,114,38,116,0,100,3,124, - 2,155,2,157,2,102,1,105,0,124,3,164,1,142,1,130, - 1,100,4,83,0,41,5,97,243,1,0,0,86,97,108,105, - 100,97,116,101,32,97,32,104,97,115,104,45,98,97,115,101, - 100,32,112,121,99,32,98,121,32,99,104,101,99,107,105,110, - 103,32,116,104,101,32,114,101,97,108,32,115,111,117,114,99, - 101,32,104,97,115,104,32,97,103,97,105,110,115,116,32,116, - 104,101,32,111,110,101,32,105,110,10,32,32,32,32,116,104, - 101,32,112,121,99,32,104,101,97,100,101,114,46,10,10,32, - 32,32,32,42,100,97,116,97,42,32,105,115,32,116,104,101, - 32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101, - 32,112,121,99,32,102,105,108,101,46,32,40,79,110,108,121, - 32,116,104,101,32,102,105,114,115,116,32,49,54,32,98,121, - 116,101,115,32,97,114,101,10,32,32,32,32,114,101,113,117, - 105,114,101,100,46,41,10,10,32,32,32,32,42,115,111,117, - 114,99,101,95,104,97,115,104,42,32,105,115,32,116,104,101, - 32,105,109,112,111,114,116,108,105,98,46,117,116,105,108,46, - 115,111,117,114,99,101,95,104,97,115,104,40,41,32,111,102, - 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, - 46,10,10,32,32,32,32,42,110,97,109,101,42,32,105,115, - 32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101, - 32,109,111,100,117,108,101,32,98,101,105,110,103,32,105,109, - 112,111,114,116,101,100,46,32,73,116,32,105,115,32,117,115, - 101,100,32,102,111,114,32,108,111,103,103,105,110,103,46,10, - 10,32,32,32,32,42,101,120,99,95,100,101,116,97,105,108, - 115,42,32,105,115,32,97,32,100,105,99,116,105,111,110,97, - 114,121,32,112,97,115,115,101,100,32,116,111,32,73,109,112, - 111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,114, - 97,105,115,101,100,32,102,111,114,10,32,32,32,32,105,109, - 112,114,111,118,101,100,32,100,101,98,117,103,103,105,110,103, - 46,10,10,32,32,32,32,65,110,32,73,109,112,111,114,116, - 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,32, - 105,102,32,116,104,101,32,98,121,116,101,99,111,100,101,32, - 105,115,32,115,116,97,108,101,46,10,10,32,32,32,32,114, - 150,0,0,0,114,149,0,0,0,122,46,104,97,115,104,32, - 105,110,32,98,121,116,101,99,111,100,101,32,100,111,101,115, - 110,39,116,32,109,97,116,99,104,32,104,97,115,104,32,111, - 102,32,115,111,117,114,99,101,32,78,41,1,114,122,0,0, - 0,41,4,114,37,0,0,0,218,11,115,111,117,114,99,101, - 95,104,97,115,104,114,121,0,0,0,114,155,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,18, - 95,118,97,108,105,100,97,116,101,95,104,97,115,104,95,112, - 121,99,92,2,0,0,115,16,0,0,0,16,17,2,1,8, - 1,4,255,2,2,6,254,4,255,255,128,114,162,0,0,0, - 99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,5,0,0,0,67,0,0,0,115,76,0,0,0,116,0, - 160,1,124,0,161,1,125,4,116,2,124,4,116,3,131,2, - 114,56,116,4,160,5,100,1,124,2,161,2,1,0,124,3, - 100,2,117,1,114,52,116,6,160,7,124,4,124,3,161,2, - 1,0,124,4,83,0,116,8,100,3,160,9,124,2,161,1, - 124,1,124,2,100,4,141,3,130,1,41,5,122,35,67,111, - 109,112,105,108,101,32,98,121,116,101,99,111,100,101,32,97, - 115,32,102,111,117,110,100,32,105,110,32,97,32,112,121,99, - 46,122,21,99,111,100,101,32,111,98,106,101,99,116,32,102, - 114,111,109,32,123,33,114,125,78,122,23,78,111,110,45,99, - 111,100,101,32,111,98,106,101,99,116,32,105,110,32,123,33, - 114,125,169,2,114,121,0,0,0,114,52,0,0,0,41,10, - 218,7,109,97,114,115,104,97,108,90,5,108,111,97,100,115, - 218,10,105,115,105,110,115,116,97,110,99,101,218,10,95,99, - 111,100,101,95,116,121,112,101,114,139,0,0,0,114,153,0, - 0,0,218,4,95,105,109,112,90,16,95,102,105,120,95,99, - 111,95,102,105,108,101,110,97,109,101,114,122,0,0,0,114, - 70,0,0,0,41,5,114,37,0,0,0,114,121,0,0,0, - 114,111,0,0,0,114,112,0,0,0,218,4,99,111,100,101, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 17,95,99,111,109,112,105,108,101,95,98,121,116,101,99,111, - 100,101,116,2,0,0,115,20,0,0,0,10,2,10,1,12, - 1,8,1,12,1,4,1,10,2,4,1,6,255,255,128,114, - 169,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,5,0,0,0,67,0,0,0,115,70,0, - 0,0,116,0,116,1,131,1,125,3,124,3,160,2,116,3, - 100,1,131,1,161,1,1,0,124,3,160,2,116,3,124,1, - 131,1,161,1,1,0,124,3,160,2,116,3,124,2,131,1, - 161,1,1,0,124,3,160,2,116,4,160,5,124,0,161,1, - 161,1,1,0,124,3,83,0,41,3,122,43,80,114,111,100, - 117,99,101,32,116,104,101,32,100,97,116,97,32,102,111,114, - 32,97,32,116,105,109,101,115,116,97,109,112,45,98,97,115, - 101,100,32,112,121,99,46,114,0,0,0,0,78,41,6,218, - 9,98,121,116,101,97,114,114,97,121,114,152,0,0,0,218, - 6,101,120,116,101,110,100,114,33,0,0,0,114,164,0,0, - 0,218,5,100,117,109,112,115,41,4,114,168,0,0,0,218, - 5,109,116,105,109,101,114,159,0,0,0,114,37,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 22,95,99,111,100,101,95,116,111,95,116,105,109,101,115,116, - 97,109,112,95,112,121,99,129,2,0,0,115,14,0,0,0, - 8,2,14,1,14,1,14,1,16,1,4,1,255,128,114,174, - 0,0,0,84,99,3,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,5,0,0,0,67,0,0,0,115,80,0, - 0,0,116,0,116,1,131,1,125,3,100,1,124,2,100,1, - 62,0,66,0,125,4,124,3,160,2,116,3,124,4,131,1, - 161,1,1,0,116,4,124,1,131,1,100,2,107,2,115,50, - 74,0,130,1,124,3,160,2,124,1,161,1,1,0,124,3, - 160,2,116,5,160,6,124,0,161,1,161,1,1,0,124,3, - 83,0,41,4,122,38,80,114,111,100,117,99,101,32,116,104, - 101,32,100,97,116,97,32,102,111,114,32,97,32,104,97,115, - 104,45,98,97,115,101,100,32,112,121,99,46,114,3,0,0, - 0,114,150,0,0,0,78,41,7,114,170,0,0,0,114,152, - 0,0,0,114,171,0,0,0,114,33,0,0,0,114,4,0, - 0,0,114,164,0,0,0,114,172,0,0,0,41,5,114,168, - 0,0,0,114,161,0,0,0,90,7,99,104,101,99,107,101, - 100,114,37,0,0,0,114,16,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,17,95,99,111,100, - 101,95,116,111,95,104,97,115,104,95,112,121,99,139,2,0, - 0,115,16,0,0,0,8,2,12,1,14,1,16,1,10,1, - 16,1,4,1,255,128,114,175,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0, - 67,0,0,0,115,62,0,0,0,100,1,100,2,108,0,125, - 1,116,1,160,2,124,0,161,1,106,3,125,2,124,1,160, - 4,124,2,161,1,125,3,116,1,160,5,100,2,100,3,161, - 2,125,4,124,4,160,6,124,0,160,6,124,3,100,1,25, - 0,161,1,161,1,83,0,41,4,122,121,68,101,99,111,100, - 101,32,98,121,116,101,115,32,114,101,112,114,101,115,101,110, - 116,105,110,103,32,115,111,117,114,99,101,32,99,111,100,101, - 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32, - 115,116,114,105,110,103,46,10,10,32,32,32,32,85,110,105, - 118,101,114,115,97,108,32,110,101,119,108,105,110,101,32,115, - 117,112,112,111,114,116,32,105,115,32,117,115,101,100,32,105, - 110,32,116,104,101,32,100,101,99,111,100,105,110,103,46,10, - 32,32,32,32,114,0,0,0,0,78,84,41,7,218,8,116, - 111,107,101,110,105,122,101,114,72,0,0,0,90,7,66,121, - 116,101,115,73,79,90,8,114,101,97,100,108,105,110,101,90, - 15,100,101,116,101,99,116,95,101,110,99,111,100,105,110,103, - 90,25,73,110,99,114,101,109,101,110,116,97,108,78,101,119, - 108,105,110,101,68,101,99,111,100,101,114,218,6,100,101,99, - 111,100,101,41,5,218,12,115,111,117,114,99,101,95,98,121, - 116,101,115,114,176,0,0,0,90,21,115,111,117,114,99,101, - 95,98,121,116,101,115,95,114,101,97,100,108,105,110,101,218, - 8,101,110,99,111,100,105,110,103,90,15,110,101,119,108,105, - 110,101,95,100,101,99,111,100,101,114,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,13,100,101,99,111,100, - 101,95,115,111,117,114,99,101,150,2,0,0,115,12,0,0, - 0,8,5,12,1,10,1,12,1,20,1,255,128,114,180,0, - 0,0,169,2,114,144,0,0,0,218,26,115,117,98,109,111, - 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, - 116,105,111,110,115,99,2,0,0,0,0,0,0,0,2,0, - 0,0,9,0,0,0,8,0,0,0,67,0,0,0,115,12, - 1,0,0,124,1,100,1,117,0,114,56,100,2,125,1,116, - 0,124,2,100,3,131,2,114,66,122,14,124,2,160,1,124, - 0,161,1,125,1,87,0,110,28,4,0,116,2,144,1,121, - 10,1,0,1,0,1,0,89,0,110,10,116,3,160,4,124, - 1,161,1,125,1,116,5,106,6,124,0,124,2,124,1,100, - 4,141,3,125,4,100,5,124,4,95,7,124,2,100,1,117, - 0,114,148,116,8,131,0,68,0,93,40,92,2,125,5,125, - 6,124,1,160,9,116,10,124,6,131,1,161,1,114,102,124, - 5,124,0,124,1,131,2,125,2,124,2,124,4,95,11,1, - 0,113,148,100,1,83,0,124,3,116,12,117,0,114,212,116, - 0,124,2,100,6,131,2,114,218,122,14,124,2,160,13,124, - 0,161,1,125,7,87,0,110,18,4,0,116,2,144,1,121, - 8,1,0,1,0,1,0,89,0,110,18,124,7,114,218,103, - 0,124,4,95,14,110,6,124,3,124,4,95,14,124,4,106, - 14,103,0,107,2,144,1,114,4,124,1,144,1,114,4,116, - 15,124,1,131,1,100,7,25,0,125,8,124,4,106,14,160, - 16,124,8,161,1,1,0,124,4,83,0,119,0,119,0,41, - 8,97,61,1,0,0,82,101,116,117,114,110,32,97,32,109, - 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, - 32,111,110,32,97,32,102,105,108,101,32,108,111,99,97,116, - 105,111,110,46,10,10,32,32,32,32,84,111,32,105,110,100, - 105,99,97,116,101,32,116,104,97,116,32,116,104,101,32,109, - 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, - 103,101,44,32,115,101,116,10,32,32,32,32,115,117,98,109, - 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,32,116,111,32,97,32,108,105,115,116, - 32,111,102,32,100,105,114,101,99,116,111,114,121,32,112,97, - 116,104,115,46,32,32,65,110,10,32,32,32,32,101,109,112, - 116,121,32,108,105,115,116,32,105,115,32,115,117,102,102,105, - 99,105,101,110,116,44,32,116,104,111,117,103,104,32,105,116, - 115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32, - 117,115,101,102,117,108,32,116,111,32,116,104,101,10,32,32, - 32,32,105,109,112,111,114,116,32,115,121,115,116,101,109,46, - 10,10,32,32,32,32,84,104,101,32,108,111,97,100,101,114, - 32,109,117,115,116,32,116,97,107,101,32,97,32,115,112,101, - 99,32,97,115,32,105,116,115,32,111,110,108,121,32,95,95, - 105,110,105,116,95,95,40,41,32,97,114,103,46,10,10,32, - 32,32,32,78,122,9,60,117,110,107,110,111,119,110,62,218, - 12,103,101,116,95,102,105,108,101,110,97,109,101,169,1,218, - 6,111,114,105,103,105,110,84,218,10,105,115,95,112,97,99, - 107,97,103,101,114,0,0,0,0,41,17,114,133,0,0,0, - 114,183,0,0,0,114,122,0,0,0,114,18,0,0,0,114, - 85,0,0,0,114,139,0,0,0,218,10,77,111,100,117,108, - 101,83,112,101,99,90,13,95,115,101,116,95,102,105,108,101, - 97,116,116,114,218,27,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,114,115,0,0,0,114,116,0,0,0,114,144,0,0,0, - 218,9,95,80,79,80,85,76,65,84,69,114,186,0,0,0, - 114,182,0,0,0,114,55,0,0,0,218,6,97,112,112,101, - 110,100,41,9,114,121,0,0,0,90,8,108,111,99,97,116, - 105,111,110,114,144,0,0,0,114,182,0,0,0,218,4,115, - 112,101,99,218,12,108,111,97,100,101,114,95,99,108,97,115, - 115,218,8,115,117,102,102,105,120,101,115,114,186,0,0,0, - 90,7,100,105,114,110,97,109,101,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,23,115,112,101,99,95,102, - 114,111,109,95,102,105,108,101,95,108,111,99,97,116,105,111, - 110,167,2,0,0,115,68,0,0,0,8,12,4,4,10,1, - 2,2,14,1,14,1,4,1,10,2,16,8,6,1,8,3, - 14,1,14,1,10,1,6,1,4,1,4,2,8,3,10,2, - 2,1,14,1,14,1,4,1,4,2,8,1,6,2,12,1, - 6,1,12,1,12,1,4,2,2,244,2,226,255,128,114,194, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,64,0,0,0,115,88,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,90, - 4,100,3,90,5,101,6,111,30,100,4,101,7,118,0,90, - 8,101,9,100,5,100,6,132,0,131,1,90,10,101,11,100, - 7,100,8,132,0,131,1,90,12,101,11,100,14,100,10,100, - 11,132,1,131,1,90,13,101,11,100,15,100,12,100,13,132, - 1,131,1,90,14,100,9,83,0,41,16,218,21,87,105,110, - 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, - 101,114,122,62,77,101,116,97,32,112,97,116,104,32,102,105, - 110,100,101,114,32,102,111,114,32,109,111,100,117,108,101,115, - 32,100,101,99,108,97,114,101,100,32,105,110,32,116,104,101, - 32,87,105,110,100,111,119,115,32,114,101,103,105,115,116,114, - 121,46,122,59,83,111,102,116,119,97,114,101,92,80,121,116, - 104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123, - 115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100, - 117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,122, - 65,83,111,102,116,119,97,114,101,92,80,121,116,104,111,110, - 92,80,121,116,104,111,110,67,111,114,101,92,123,115,121,115, - 95,118,101,114,115,105,111,110,125,92,77,111,100,117,108,101, - 115,92,123,102,117,108,108,110,97,109,101,125,92,68,101,98, - 117,103,122,6,95,100,46,112,121,100,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,67, - 0,0,0,115,50,0,0,0,122,16,116,0,160,1,116,0, - 106,2,124,0,161,2,87,0,83,0,4,0,116,3,121,48, - 1,0,1,0,1,0,116,0,160,1,116,0,106,4,124,0, - 161,2,6,0,89,0,83,0,119,0,114,114,0,0,0,41, - 5,218,6,119,105,110,114,101,103,90,7,79,112,101,110,75, - 101,121,90,17,72,75,69,89,95,67,85,82,82,69,78,84, - 95,85,83,69,82,114,58,0,0,0,90,18,72,75,69,89, - 95,76,79,67,65,76,95,77,65,67,72,73,78,69,114,19, + 0,0,218,10,95,99,97,108,99,95,109,111,100,101,227,1, + 0,0,115,16,0,0,0,2,2,14,1,12,1,6,1,8, + 3,4,1,2,251,255,128,114,119,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, + 0,3,0,0,0,115,52,0,0,0,100,6,135,0,102,1, + 100,2,100,3,132,9,125,1,116,0,100,1,117,1,114,30, + 116,0,106,1,125,2,110,8,100,4,100,5,132,0,125,2, + 124,2,124,1,136,0,131,2,1,0,124,1,83,0,41,7, + 122,252,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,0,0,0,0,4,0,0,0, + 4,0,0,0,31,0,0,0,115,72,0,0,0,124,1,100, + 0,117,0,114,16,124,0,106,0,125,1,110,32,124,0,106, + 0,124,1,107,3,114,48,116,1,100,1,124,0,106,0,124, + 1,102,2,22,0,124,1,100,2,141,2,130,1,136,0,124, + 0,124,1,103,2,124,2,162,1,82,0,105,0,124,3,164, + 1,142,1,83,0,41,3,78,122,30,108,111,97,100,101,114, + 32,102,111,114,32,37,115,32,99,97,110,110,111,116,32,104, + 97,110,100,108,101,32,37,115,169,1,218,4,110,97,109,101, + 41,2,114,121,0,0,0,218,11,73,109,112,111,114,116,69, + 114,114,111,114,41,4,218,4,115,101,108,102,114,121,0,0, + 0,218,4,97,114,103,115,218,6,107,119,97,114,103,115,169, + 1,218,6,109,101,116,104,111,100,114,7,0,0,0,114,8, + 0,0,0,218,19,95,99,104,101,99,107,95,110,97,109,101, + 95,119,114,97,112,112,101,114,247,1,0,0,115,20,0,0, + 0,8,1,8,1,10,1,4,1,8,1,2,255,2,1,6, + 255,24,2,255,128,122,40,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,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 7,0,0,0,83,0,0,0,115,56,0,0,0,100,1,68, + 0,93,32,125,2,116,0,124,1,124,2,131,2,114,36,116, + 1,124,0,124,2,116,2,124,1,124,2,131,2,131,3,1, + 0,113,4,124,0,106,3,160,4,124,1,106,3,161,1,1, + 0,100,0,83,0,41,2,78,41,4,218,10,95,95,109,111, + 100,117,108,101,95,95,218,8,95,95,110,97,109,101,95,95, + 218,12,95,95,113,117,97,108,110,97,109,101,95,95,218,7, + 95,95,100,111,99,95,95,41,5,218,7,104,97,115,97,116, + 116,114,218,7,115,101,116,97,116,116,114,218,7,103,101,116, + 97,116,116,114,218,8,95,95,100,105,99,116,95,95,218,6, + 117,112,100,97,116,101,41,3,90,3,110,101,119,90,3,111, + 108,100,114,75,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,5,95,119,114,97,112,4,2,0, + 0,115,12,0,0,0,8,1,10,1,18,1,2,128,18,1, + 255,128,122,26,95,99,104,101,99,107,95,110,97,109,101,46, + 60,108,111,99,97,108,115,62,46,95,119,114,97,112,41,1, + 78,41,2,218,10,95,98,111,111,116,115,116,114,97,112,114, + 138,0,0,0,41,3,114,127,0,0,0,114,128,0,0,0, + 114,138,0,0,0,114,7,0,0,0,114,126,0,0,0,114, + 8,0,0,0,218,11,95,99,104,101,99,107,95,110,97,109, + 101,239,1,0,0,115,14,0,0,0,14,8,8,10,8,1, + 8,2,10,6,4,1,255,128,114,140,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0, + 0,0,67,0,0,0,115,60,0,0,0,124,0,160,0,124, + 1,161,1,92,2,125,2,125,3,124,2,100,1,117,0,114, + 56,116,1,124,3,131,1,114,56,100,2,125,4,116,2,160, + 3,124,4,160,4,124,3,100,3,25,0,161,1,116,5,161, + 2,1,0,124,2,83,0,41,4,122,155,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,10,10,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 32,105,110,32,102,97,118,111,114,32,111,102,32,102,105,110, + 100,101,114,46,102,105,110,100,95,115,112,101,99,40,41,46, + 10,10,32,32,32,32,78,122,44,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,114,0,0,0,0,41,6,218,11,102,105, + 110,100,95,108,111,97,100,101,114,114,4,0,0,0,114,81, + 0,0,0,114,82,0,0,0,114,70,0,0,0,218,13,73, + 109,112,111,114,116,87,97,114,110,105,110,103,41,5,114,123, + 0,0,0,218,8,102,117,108,108,110,97,109,101,218,6,108, + 111,97,100,101,114,218,8,112,111,114,116,105,111,110,115,218, + 3,109,115,103,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,17,95,102,105,110,100,95,109,111,100,117,108, + 101,95,115,104,105,109,14,2,0,0,115,12,0,0,0,14, + 10,16,1,4,1,22,1,4,1,255,128,114,147,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,4,0,0,0,67,0,0,0,115,166,0,0,0,124,0, + 100,1,100,2,133,2,25,0,125,3,124,3,116,0,107,3, + 114,64,100,3,124,1,155,2,100,4,124,3,155,2,157,4, + 125,4,116,1,160,2,100,5,124,4,161,2,1,0,116,3, + 124,4,102,1,105,0,124,2,164,1,142,1,130,1,116,4, + 124,0,131,1,100,6,107,0,114,106,100,7,124,1,155,2, + 157,2,125,4,116,1,160,2,100,5,124,4,161,2,1,0, + 116,5,124,4,131,1,130,1,116,6,124,0,100,2,100,8, + 133,2,25,0,131,1,125,5,124,5,100,9,64,0,114,162, + 100,10,124,5,155,2,100,11,124,1,155,2,157,4,125,4, + 116,3,124,4,102,1,105,0,124,2,164,1,142,1,130,1, + 124,5,83,0,41,12,97,84,2,0,0,80,101,114,102,111, + 114,109,32,98,97,115,105,99,32,118,97,108,105,100,105,116, + 121,32,99,104,101,99,107,105,110,103,32,111,102,32,97,32, + 112,121,99,32,104,101,97,100,101,114,32,97,110,100,32,114, + 101,116,117,114,110,32,116,104,101,32,102,108,97,103,115,32, + 102,105,101,108,100,44,10,32,32,32,32,119,104,105,99,104, + 32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32, + 116,104,101,32,112,121,99,32,115,104,111,117,108,100,32,98, + 101,32,102,117,114,116,104,101,114,32,118,97,108,105,100,97, + 116,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32, + 115,111,117,114,99,101,46,10,10,32,32,32,32,42,100,97, + 116,97,42,32,105,115,32,116,104,101,32,99,111,110,116,101, + 110,116,115,32,111,102,32,116,104,101,32,112,121,99,32,102, + 105,108,101,46,32,40,79,110,108,121,32,116,104,101,32,102, + 105,114,115,116,32,49,54,32,98,121,116,101,115,32,97,114, + 101,10,32,32,32,32,114,101,113,117,105,114,101,100,44,32, + 116,104,111,117,103,104,46,41,10,10,32,32,32,32,42,110, + 97,109,101,42,32,105,115,32,116,104,101,32,110,97,109,101, + 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,98, + 101,105,110,103,32,105,109,112,111,114,116,101,100,46,32,73, + 116,32,105,115,32,117,115,101,100,32,102,111,114,32,108,111, + 103,103,105,110,103,46,10,10,32,32,32,32,42,101,120,99, + 95,100,101,116,97,105,108,115,42,32,105,115,32,97,32,100, + 105,99,116,105,111,110,97,114,121,32,112,97,115,115,101,100, + 32,116,111,32,73,109,112,111,114,116,69,114,114,111,114,32, + 105,102,32,105,116,32,114,97,105,115,101,100,32,102,111,114, + 10,32,32,32,32,105,109,112,114,111,118,101,100,32,100,101, + 98,117,103,103,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,119,104,101,110,32,116, + 104,101,32,102,108,97,103,115,10,32,32,32,32,102,105,101, + 108,100,32,105,115,32,105,110,118,97,108,105,100,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,32,116, + 114,117,110,99,97,116,101,100,46,10,10,32,32,32,32,78, + 114,28,0,0,0,122,20,98,97,100,32,109,97,103,105,99, + 32,110,117,109,98,101,114,32,105,110,32,122,2,58,32,250, + 2,123,125,233,16,0,0,0,122,40,114,101,97,99,104,101, + 100,32,69,79,70,32,119,104,105,108,101,32,114,101,97,100, + 105,110,103,32,112,121,99,32,104,101,97,100,101,114,32,111, + 102,32,233,8,0,0,0,233,252,255,255,255,122,14,105,110, + 118,97,108,105,100,32,102,108,97,103,115,32,122,4,32,105, + 110,32,41,7,218,12,77,65,71,73,67,95,78,85,77,66, + 69,82,114,139,0,0,0,218,16,95,118,101,114,98,111,115, + 101,95,109,101,115,115,97,103,101,114,122,0,0,0,114,4, + 0,0,0,218,8,69,79,70,69,114,114,111,114,114,38,0, + 0,0,41,6,114,37,0,0,0,114,121,0,0,0,218,11, + 101,120,99,95,100,101,116,97,105,108,115,90,5,109,97,103, + 105,99,114,98,0,0,0,114,16,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,13,95,99,108, + 97,115,115,105,102,121,95,112,121,99,31,2,0,0,115,30, + 0,0,0,12,16,8,1,16,1,12,1,16,1,12,1,10, + 1,12,1,8,1,16,1,8,2,16,1,16,1,4,1,255, + 128,114,156,0,0,0,99,5,0,0,0,0,0,0,0,0, + 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, + 124,0,0,0,116,0,124,0,100,1,100,2,133,2,25,0, + 131,1,124,1,100,3,64,0,107,3,114,62,100,4,124,3, + 155,2,157,2,125,5,116,1,160,2,100,5,124,5,161,2, + 1,0,116,3,124,5,102,1,105,0,124,4,164,1,142,1, + 130,1,124,2,100,6,117,1,114,120,116,0,124,0,100,2, + 100,7,133,2,25,0,131,1,124,2,100,3,64,0,107,3, + 114,116,116,3,100,4,124,3,155,2,157,2,102,1,105,0, + 124,4,164,1,142,1,130,1,100,6,83,0,100,6,83,0, + 41,8,97,7,2,0,0,86,97,108,105,100,97,116,101,32, + 97,32,112,121,99,32,97,103,97,105,110,115,116,32,116,104, + 101,32,115,111,117,114,99,101,32,108,97,115,116,45,109,111, + 100,105,102,105,101,100,32,116,105,109,101,46,10,10,32,32, + 32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,32, + 99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32, + 112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,32, + 116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,116, + 101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,105, + 114,101,100,46,41,10,10,32,32,32,32,42,115,111,117,114, + 99,101,95,109,116,105,109,101,42,32,105,115,32,116,104,101, + 32,108,97,115,116,32,109,111,100,105,102,105,101,100,32,116, + 105,109,101,115,116,97,109,112,32,111,102,32,116,104,101,32, + 115,111,117,114,99,101,32,102,105,108,101,46,10,10,32,32, + 32,32,42,115,111,117,114,99,101,95,115,105,122,101,42,32, + 105,115,32,78,111,110,101,32,111,114,32,116,104,101,32,115, + 105,122,101,32,111,102,32,116,104,101,32,115,111,117,114,99, + 101,32,102,105,108,101,32,105,110,32,98,121,116,101,115,46, + 10,10,32,32,32,32,42,110,97,109,101,42,32,105,115,32, + 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32, + 109,111,100,117,108,101,32,98,101,105,110,103,32,105,109,112, + 111,114,116,101,100,46,32,73,116,32,105,115,32,117,115,101, + 100,32,102,111,114,32,108,111,103,103,105,110,103,46,10,10, + 32,32,32,32,42,101,120,99,95,100,101,116,97,105,108,115, + 42,32,105,115,32,97,32,100,105,99,116,105,111,110,97,114, + 121,32,112,97,115,115,101,100,32,116,111,32,73,109,112,111, + 114,116,69,114,114,111,114,32,105,102,32,105,116,32,114,97, + 105,115,101,100,32,102,111,114,10,32,32,32,32,105,109,112, + 114,111,118,101,100,32,100,101,98,117,103,103,105,110,103,46, + 10,10,32,32,32,32,65,110,32,73,109,112,111,114,116,69, + 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,105, + 102,32,116,104,101,32,98,121,116,101,99,111,100,101,32,105, + 115,32,115,116,97,108,101,46,10,10,32,32,32,32,114,150, + 0,0,0,233,12,0,0,0,114,27,0,0,0,122,22,98, + 121,116,101,99,111,100,101,32,105,115,32,115,116,97,108,101, + 32,102,111,114,32,114,148,0,0,0,78,114,149,0,0,0, + 41,4,114,38,0,0,0,114,139,0,0,0,114,153,0,0, + 0,114,122,0,0,0,41,6,114,37,0,0,0,218,12,115, + 111,117,114,99,101,95,109,116,105,109,101,218,11,115,111,117, + 114,99,101,95,115,105,122,101,114,121,0,0,0,114,155,0, + 0,0,114,98,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,23,95,118,97,108,105,100,97,116, + 101,95,116,105,109,101,115,116,97,109,112,95,112,121,99,64, + 2,0,0,115,20,0,0,0,24,19,10,1,12,1,16,1, + 8,1,22,1,2,255,22,2,8,254,255,128,114,160,0,0, + 0,99,4,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,4,0,0,0,67,0,0,0,115,42,0,0,0,124, + 0,100,1,100,2,133,2,25,0,124,1,107,3,114,38,116, + 0,100,3,124,2,155,2,157,2,102,1,105,0,124,3,164, + 1,142,1,130,1,100,4,83,0,41,5,97,243,1,0,0, + 86,97,108,105,100,97,116,101,32,97,32,104,97,115,104,45, + 98,97,115,101,100,32,112,121,99,32,98,121,32,99,104,101, + 99,107,105,110,103,32,116,104,101,32,114,101,97,108,32,115, + 111,117,114,99,101,32,104,97,115,104,32,97,103,97,105,110, + 115,116,32,116,104,101,32,111,110,101,32,105,110,10,32,32, + 32,32,116,104,101,32,112,121,99,32,104,101,97,100,101,114, + 46,10,10,32,32,32,32,42,100,97,116,97,42,32,105,115, + 32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102, + 32,116,104,101,32,112,121,99,32,102,105,108,101,46,32,40, + 79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,49, + 54,32,98,121,116,101,115,32,97,114,101,10,32,32,32,32, + 114,101,113,117,105,114,101,100,46,41,10,10,32,32,32,32, + 42,115,111,117,114,99,101,95,104,97,115,104,42,32,105,115, + 32,116,104,101,32,105,109,112,111,114,116,108,105,98,46,117, + 116,105,108,46,115,111,117,114,99,101,95,104,97,115,104,40, + 41,32,111,102,32,116,104,101,32,115,111,117,114,99,101,32, + 102,105,108,101,46,10,10,32,32,32,32,42,110,97,109,101, + 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, + 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, + 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, + 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, + 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, + 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, + 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, + 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, + 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, + 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, + 103,105,110,103,46,10,10,32,32,32,32,65,110,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, + 115,101,100,32,105,102,32,116,104,101,32,98,121,116,101,99, + 111,100,101,32,105,115,32,115,116,97,108,101,46,10,10,32, + 32,32,32,114,150,0,0,0,114,149,0,0,0,122,46,104, + 97,115,104,32,105,110,32,98,121,116,101,99,111,100,101,32, + 100,111,101,115,110,39,116,32,109,97,116,99,104,32,104,97, + 115,104,32,111,102,32,115,111,117,114,99,101,32,78,41,1, + 114,122,0,0,0,41,4,114,37,0,0,0,218,11,115,111, + 117,114,99,101,95,104,97,115,104,114,121,0,0,0,114,155, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,14,95,111,112,101,110,95,114,101,103,105,115,116, - 114,121,247,2,0,0,115,12,0,0,0,2,2,16,1,12, - 1,18,1,2,255,255,128,122,36,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,2,0, - 0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0, - 0,0,67,0,0,0,115,130,0,0,0,124,0,106,0,114, - 14,124,0,106,1,125,2,110,6,124,0,106,2,125,2,124, - 2,106,3,124,1,100,1,116,4,106,5,100,0,100,2,133, - 2,25,0,22,0,100,3,141,2,125,3,122,60,124,0,160, - 6,124,3,161,1,143,28,125,4,116,7,160,8,124,4,100, - 4,161,2,125,5,87,0,100,0,4,0,4,0,131,3,1, - 0,110,16,49,0,115,94,119,1,1,0,1,0,1,0,89, - 0,1,0,87,0,124,5,83,0,4,0,116,9,121,128,1, - 0,1,0,1,0,89,0,100,0,83,0,119,0,41,5,78, - 122,5,37,100,46,37,100,114,39,0,0,0,41,2,114,143, - 0,0,0,90,11,115,121,115,95,118,101,114,115,105,111,110, - 114,10,0,0,0,41,10,218,11,68,69,66,85,71,95,66, - 85,73,76,68,218,18,82,69,71,73,83,84,82,89,95,75, - 69,89,95,68,69,66,85,71,218,12,82,69,71,73,83,84, - 82,89,95,75,69,89,114,70,0,0,0,114,15,0,0,0, - 218,12,118,101,114,115,105,111,110,95,105,110,102,111,114,197, - 0,0,0,114,196,0,0,0,90,10,81,117,101,114,121,86, - 97,108,117,101,114,58,0,0,0,41,6,218,3,99,108,115, - 114,143,0,0,0,90,12,114,101,103,105,115,116,114,121,95, - 107,101,121,114,20,0,0,0,90,4,104,107,101,121,218,8, - 102,105,108,101,112,97,116,104,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,16,95,115,101,97,114,99,104, - 95,114,101,103,105,115,116,114,121,254,2,0,0,115,28,0, - 0,0,6,2,8,1,6,2,6,1,16,1,6,255,2,2, - 12,1,44,1,4,3,12,254,6,1,2,255,255,128,122,38, - 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, - 105,110,100,101,114,46,95,115,101,97,114,99,104,95,114,101, - 103,105,115,116,114,121,78,99,4,0,0,0,0,0,0,0, - 0,0,0,0,8,0,0,0,8,0,0,0,67,0,0,0, - 115,118,0,0,0,124,0,160,0,124,1,161,1,125,4,124, - 4,100,0,117,0,114,22,100,0,83,0,122,12,116,1,124, - 4,131,1,1,0,87,0,110,18,4,0,116,2,121,116,1, - 0,1,0,1,0,89,0,100,0,83,0,116,3,131,0,68, - 0,93,50,92,2,125,5,125,6,124,4,160,4,116,5,124, - 6,131,1,161,1,114,60,116,6,106,7,124,1,124,5,124, - 1,124,4,131,2,124,4,100,1,141,3,125,7,124,7,2, - 0,1,0,83,0,100,0,83,0,119,0,41,2,78,114,184, + 0,0,218,18,95,118,97,108,105,100,97,116,101,95,104,97, + 115,104,95,112,121,99,92,2,0,0,115,16,0,0,0,16, + 17,2,1,8,1,4,255,2,2,6,254,4,255,255,128,114, + 162,0,0,0,99,4,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,5,0,0,0,67,0,0,0,115,76,0, + 0,0,116,0,160,1,124,0,161,1,125,4,116,2,124,4, + 116,3,131,2,114,56,116,4,160,5,100,1,124,2,161,2, + 1,0,124,3,100,2,117,1,114,52,116,6,160,7,124,4, + 124,3,161,2,1,0,124,4,83,0,116,8,100,3,160,9, + 124,2,161,1,124,1,124,2,100,4,141,3,130,1,41,5, + 122,35,67,111,109,112,105,108,101,32,98,121,116,101,99,111, + 100,101,32,97,115,32,102,111,117,110,100,32,105,110,32,97, + 32,112,121,99,46,122,21,99,111,100,101,32,111,98,106,101, + 99,116,32,102,114,111,109,32,123,33,114,125,78,122,23,78, + 111,110,45,99,111,100,101,32,111,98,106,101,99,116,32,105, + 110,32,123,33,114,125,169,2,114,121,0,0,0,114,52,0, + 0,0,41,10,218,7,109,97,114,115,104,97,108,90,5,108, + 111,97,100,115,218,10,105,115,105,110,115,116,97,110,99,101, + 218,10,95,99,111,100,101,95,116,121,112,101,114,139,0,0, + 0,114,153,0,0,0,218,4,95,105,109,112,90,16,95,102, + 105,120,95,99,111,95,102,105,108,101,110,97,109,101,114,122, + 0,0,0,114,70,0,0,0,41,5,114,37,0,0,0,114, + 121,0,0,0,114,111,0,0,0,114,112,0,0,0,218,4, + 99,111,100,101,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,17,95,99,111,109,112,105,108,101,95,98,121, + 116,101,99,111,100,101,116,2,0,0,115,20,0,0,0,10, + 2,10,1,12,1,8,1,12,1,4,1,10,2,4,1,6, + 255,255,128,114,169,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, + 0,115,70,0,0,0,116,0,116,1,131,1,125,3,124,3, + 160,2,116,3,100,1,131,1,161,1,1,0,124,3,160,2, + 116,3,124,1,131,1,161,1,1,0,124,3,160,2,116,3, + 124,2,131,1,161,1,1,0,124,3,160,2,116,4,160,5, + 124,0,161,1,161,1,1,0,124,3,83,0,41,3,122,43, + 80,114,111,100,117,99,101,32,116,104,101,32,100,97,116,97, + 32,102,111,114,32,97,32,116,105,109,101,115,116,97,109,112, + 45,98,97,115,101,100,32,112,121,99,46,114,0,0,0,0, + 78,41,6,218,9,98,121,116,101,97,114,114,97,121,114,152, + 0,0,0,218,6,101,120,116,101,110,100,114,33,0,0,0, + 114,164,0,0,0,218,5,100,117,109,112,115,41,4,114,168, + 0,0,0,218,5,109,116,105,109,101,114,159,0,0,0,114, + 37,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,22,95,99,111,100,101,95,116,111,95,116,105, + 109,101,115,116,97,109,112,95,112,121,99,129,2,0,0,115, + 14,0,0,0,8,2,14,1,14,1,14,1,16,1,4,1, + 255,128,114,174,0,0,0,84,99,3,0,0,0,0,0,0, + 0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,0, + 0,115,80,0,0,0,116,0,116,1,131,1,125,3,100,1, + 124,2,100,1,62,0,66,0,125,4,124,3,160,2,116,3, + 124,4,131,1,161,1,1,0,116,4,124,1,131,1,100,2, + 107,2,115,50,74,0,130,1,124,3,160,2,124,1,161,1, + 1,0,124,3,160,2,116,5,160,6,124,0,161,1,161,1, + 1,0,124,3,83,0,41,4,122,38,80,114,111,100,117,99, + 101,32,116,104,101,32,100,97,116,97,32,102,111,114,32,97, + 32,104,97,115,104,45,98,97,115,101,100,32,112,121,99,46, + 114,3,0,0,0,114,150,0,0,0,78,41,7,114,170,0, + 0,0,114,152,0,0,0,114,171,0,0,0,114,33,0,0, + 0,114,4,0,0,0,114,164,0,0,0,114,172,0,0,0, + 41,5,114,168,0,0,0,114,161,0,0,0,90,7,99,104, + 101,99,107,101,100,114,37,0,0,0,114,16,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,17, + 95,99,111,100,101,95,116,111,95,104,97,115,104,95,112,121, + 99,139,2,0,0,115,16,0,0,0,8,2,12,1,14,1, + 16,1,10,1,16,1,4,1,255,128,114,175,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 6,0,0,0,67,0,0,0,115,62,0,0,0,100,1,100, + 2,108,0,125,1,116,1,160,2,124,0,161,1,106,3,125, + 2,124,1,160,4,124,2,161,1,125,3,116,1,160,5,100, + 2,100,3,161,2,125,4,124,4,160,6,124,0,160,6,124, + 3,100,1,25,0,161,1,161,1,83,0,41,4,122,121,68, + 101,99,111,100,101,32,98,121,116,101,115,32,114,101,112,114, + 101,115,101,110,116,105,110,103,32,115,111,117,114,99,101,32, + 99,111,100,101,32,97,110,100,32,114,101,116,117,114,110,32, + 116,104,101,32,115,116,114,105,110,103,46,10,10,32,32,32, + 32,85,110,105,118,101,114,115,97,108,32,110,101,119,108,105, + 110,101,32,115,117,112,112,111,114,116,32,105,115,32,117,115, + 101,100,32,105,110,32,116,104,101,32,100,101,99,111,100,105, + 110,103,46,10,32,32,32,32,114,0,0,0,0,78,84,41, + 7,218,8,116,111,107,101,110,105,122,101,114,72,0,0,0, + 90,7,66,121,116,101,115,73,79,90,8,114,101,97,100,108, + 105,110,101,90,15,100,101,116,101,99,116,95,101,110,99,111, + 100,105,110,103,90,25,73,110,99,114,101,109,101,110,116,97, + 108,78,101,119,108,105,110,101,68,101,99,111,100,101,114,218, + 6,100,101,99,111,100,101,41,5,218,12,115,111,117,114,99, + 101,95,98,121,116,101,115,114,176,0,0,0,90,21,115,111, + 117,114,99,101,95,98,121,116,101,115,95,114,101,97,100,108, + 105,110,101,218,8,101,110,99,111,100,105,110,103,90,15,110, + 101,119,108,105,110,101,95,100,101,99,111,100,101,114,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,13,100, + 101,99,111,100,101,95,115,111,117,114,99,101,150,2,0,0, + 115,12,0,0,0,8,5,12,1,10,1,12,1,20,1,255, + 128,114,180,0,0,0,169,2,114,144,0,0,0,218,26,115, + 117,98,109,111,100,117,108,101,95,115,101,97,114,99,104,95, + 108,111,99,97,116,105,111,110,115,99,2,0,0,0,0,0, + 0,0,2,0,0,0,9,0,0,0,8,0,0,0,67,0, + 0,0,115,16,1,0,0,124,1,100,1,117,0,114,58,100, + 2,125,1,116,0,124,2,100,3,131,2,114,56,122,14,124, + 2,160,1,124,0,161,1,125,1,87,0,110,30,4,0,116, + 2,144,1,121,14,1,0,1,0,1,0,89,0,110,12,110, + 10,116,3,160,4,124,1,161,1,125,1,116,5,106,6,124, + 0,124,2,124,1,100,4,141,3,125,4,100,5,124,4,95, + 7,124,2,100,1,117,0,114,152,116,8,131,0,68,0,93, + 42,92,2,125,5,125,6,124,1,160,9,116,10,124,6,131, + 1,161,1,114,146,124,5,124,0,124,1,131,2,125,2,124, + 2,124,4,95,11,1,0,113,152,113,104,100,1,83,0,124, + 3,116,12,117,0,114,216,116,0,124,2,100,6,131,2,114, + 214,122,14,124,2,160,13,124,0,161,1,125,7,87,0,110, + 18,4,0,116,2,144,1,121,12,1,0,1,0,1,0,89, + 0,110,18,124,7,114,214,103,0,124,4,95,14,110,6,124, + 3,124,4,95,14,124,4,106,14,103,0,107,2,144,1,114, + 8,124,1,144,1,114,8,116,15,124,1,131,1,100,7,25, + 0,125,8,124,4,106,14,160,16,124,8,161,1,1,0,124, + 4,83,0,119,0,119,0,41,8,97,61,1,0,0,82,101, + 116,117,114,110,32,97,32,109,111,100,117,108,101,32,115,112, + 101,99,32,98,97,115,101,100,32,111,110,32,97,32,102,105, + 108,101,32,108,111,99,97,116,105,111,110,46,10,10,32,32, + 32,32,84,111,32,105,110,100,105,99,97,116,101,32,116,104, + 97,116,32,116,104,101,32,109,111,100,117,108,101,32,105,115, + 32,97,32,112,97,99,107,97,103,101,44,32,115,101,116,10, + 32,32,32,32,115,117,98,109,111,100,117,108,101,95,115,101, + 97,114,99,104,95,108,111,99,97,116,105,111,110,115,32,116, + 111,32,97,32,108,105,115,116,32,111,102,32,100,105,114,101, + 99,116,111,114,121,32,112,97,116,104,115,46,32,32,65,110, + 10,32,32,32,32,101,109,112,116,121,32,108,105,115,116,32, + 105,115,32,115,117,102,102,105,99,105,101,110,116,44,32,116, + 104,111,117,103,104,32,105,116,115,32,110,111,116,32,111,116, + 104,101,114,119,105,115,101,32,117,115,101,102,117,108,32,116, + 111,32,116,104,101,10,32,32,32,32,105,109,112,111,114,116, + 32,115,121,115,116,101,109,46,10,10,32,32,32,32,84,104, + 101,32,108,111,97,100,101,114,32,109,117,115,116,32,116,97, + 107,101,32,97,32,115,112,101,99,32,97,115,32,105,116,115, + 32,111,110,108,121,32,95,95,105,110,105,116,95,95,40,41, + 32,97,114,103,46,10,10,32,32,32,32,78,122,9,60,117, + 110,107,110,111,119,110,62,218,12,103,101,116,95,102,105,108, + 101,110,97,109,101,169,1,218,6,111,114,105,103,105,110,84, + 218,10,105,115,95,112,97,99,107,97,103,101,114,0,0,0, + 0,41,17,114,133,0,0,0,114,183,0,0,0,114,122,0, + 0,0,114,18,0,0,0,114,85,0,0,0,114,139,0,0, + 0,218,10,77,111,100,117,108,101,83,112,101,99,90,13,95, + 115,101,116,95,102,105,108,101,97,116,116,114,218,27,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,114,115,0,0,0,114,116, + 0,0,0,114,144,0,0,0,218,9,95,80,79,80,85,76, + 65,84,69,114,186,0,0,0,114,182,0,0,0,114,55,0, + 0,0,218,6,97,112,112,101,110,100,41,9,114,121,0,0, + 0,90,8,108,111,99,97,116,105,111,110,114,144,0,0,0, + 114,182,0,0,0,218,4,115,112,101,99,218,12,108,111,97, + 100,101,114,95,99,108,97,115,115,218,8,115,117,102,102,105, + 120,101,115,114,186,0,0,0,90,7,100,105,114,110,97,109, + 101,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,23,115,112,101,99,95,102,114,111,109,95,102,105,108,101, + 95,108,111,99,97,116,105,111,110,167,2,0,0,115,74,0, + 0,0,8,12,4,4,10,1,2,2,14,1,14,1,4,1, + 2,128,10,2,16,8,6,1,8,3,14,1,14,1,10,1, + 6,1,4,1,2,128,4,2,8,3,10,2,2,1,14,1, + 14,1,2,1,2,3,4,255,8,1,6,2,12,1,6,1, + 12,1,12,1,4,2,2,244,2,226,255,128,114,194,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,64,0,0,0,115,88,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,100, + 3,90,5,101,6,111,30,100,4,101,7,118,0,90,8,101, + 9,100,5,100,6,132,0,131,1,90,10,101,11,100,7,100, + 8,132,0,131,1,90,12,101,11,100,14,100,10,100,11,132, + 1,131,1,90,13,101,11,100,15,100,12,100,13,132,1,131, + 1,90,14,100,9,83,0,41,16,218,21,87,105,110,100,111, + 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, + 122,62,77,101,116,97,32,112,97,116,104,32,102,105,110,100, + 101,114,32,102,111,114,32,109,111,100,117,108,101,115,32,100, + 101,99,108,97,114,101,100,32,105,110,32,116,104,101,32,87, + 105,110,100,111,119,115,32,114,101,103,105,115,116,114,121,46, + 122,59,83,111,102,116,119,97,114,101,92,80,121,116,104,111, + 110,92,80,121,116,104,111,110,67,111,114,101,92,123,115,121, + 115,95,118,101,114,115,105,111,110,125,92,77,111,100,117,108, + 101,115,92,123,102,117,108,108,110,97,109,101,125,122,65,83, + 111,102,116,119,97,114,101,92,80,121,116,104,111,110,92,80, + 121,116,104,111,110,67,111,114,101,92,123,115,121,115,95,118, + 101,114,115,105,111,110,125,92,77,111,100,117,108,101,115,92, + 123,102,117,108,108,110,97,109,101,125,92,68,101,98,117,103, + 122,6,95,100,46,112,121,100,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,8,0,0,0,67,0,0, + 0,115,50,0,0,0,122,16,116,0,160,1,116,0,106,2, + 124,0,161,2,87,0,83,0,4,0,116,3,121,48,1,0, + 1,0,1,0,116,0,160,1,116,0,106,4,124,0,161,2, + 6,0,89,0,83,0,119,0,114,114,0,0,0,41,5,218, + 6,119,105,110,114,101,103,90,7,79,112,101,110,75,101,121, + 90,17,72,75,69,89,95,67,85,82,82,69,78,84,95,85, + 83,69,82,114,58,0,0,0,90,18,72,75,69,89,95,76, + 79,67,65,76,95,77,65,67,72,73,78,69,114,19,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,14,95,111,112,101,110,95,114,101,103,105,115,116,114,121, + 247,2,0,0,115,12,0,0,0,2,2,16,1,12,1,18, + 1,2,255,255,128,122,36,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,2,0,0,0, + 0,0,0,0,0,0,0,0,6,0,0,0,8,0,0,0, + 67,0,0,0,115,130,0,0,0,124,0,106,0,114,14,124, + 0,106,1,125,2,110,6,124,0,106,2,125,2,124,2,106, + 3,124,1,100,1,116,4,106,5,100,0,100,2,133,2,25, + 0,22,0,100,3,141,2,125,3,122,60,124,0,160,6,124, + 3,161,1,143,28,125,4,116,7,160,8,124,4,100,4,161, + 2,125,5,87,0,100,0,4,0,4,0,131,3,1,0,110, + 16,49,0,115,94,119,1,1,0,1,0,1,0,89,0,1, + 0,87,0,124,5,83,0,4,0,116,9,121,128,1,0,1, + 0,1,0,89,0,100,0,83,0,119,0,41,5,78,122,5, + 37,100,46,37,100,114,39,0,0,0,41,2,114,143,0,0, + 0,90,11,115,121,115,95,118,101,114,115,105,111,110,114,10, + 0,0,0,41,10,218,11,68,69,66,85,71,95,66,85,73, + 76,68,218,18,82,69,71,73,83,84,82,89,95,75,69,89, + 95,68,69,66,85,71,218,12,82,69,71,73,83,84,82,89, + 95,75,69,89,114,70,0,0,0,114,15,0,0,0,218,12, + 118,101,114,115,105,111,110,95,105,110,102,111,114,197,0,0, + 0,114,196,0,0,0,90,10,81,117,101,114,121,86,97,108, + 117,101,114,58,0,0,0,41,6,218,3,99,108,115,114,143, + 0,0,0,90,12,114,101,103,105,115,116,114,121,95,107,101, + 121,114,20,0,0,0,90,4,104,107,101,121,218,8,102,105, + 108,101,112,97,116,104,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,16,95,115,101,97,114,99,104,95,114, + 101,103,105,115,116,114,121,254,2,0,0,115,28,0,0,0, + 6,2,8,1,6,2,6,1,16,1,6,255,2,2,12,1, + 44,1,4,3,12,254,6,1,2,255,255,128,122,38,87,105, + 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, + 100,101,114,46,95,115,101,97,114,99,104,95,114,101,103,105, + 115,116,114,121,78,99,4,0,0,0,0,0,0,0,0,0, + 0,0,8,0,0,0,8,0,0,0,67,0,0,0,115,120, + 0,0,0,124,0,160,0,124,1,161,1,125,4,124,4,100, + 0,117,0,114,22,100,0,83,0,122,12,116,1,124,4,131, + 1,1,0,87,0,110,18,4,0,116,2,121,118,1,0,1, + 0,1,0,89,0,100,0,83,0,116,3,131,0,68,0,93, + 52,92,2,125,5,125,6,124,4,160,4,116,5,124,6,131, + 1,161,1,114,112,116,6,106,7,124,1,124,5,124,1,124, + 4,131,2,124,4,100,1,141,3,125,7,124,7,2,0,1, + 0,83,0,113,60,100,0,83,0,119,0,41,2,78,114,184, 0,0,0,41,8,114,204,0,0,0,114,57,0,0,0,114, 58,0,0,0,114,188,0,0,0,114,115,0,0,0,114,116, 0,0,0,114,139,0,0,0,218,16,115,112,101,99,95,102, @@ -1075,1598 +1076,1599 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 103,101,116,114,203,0,0,0,114,144,0,0,0,114,193,0, 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,9,102,105,110,100,95,115,112,101, - 99,13,3,0,0,115,34,0,0,0,10,2,8,1,4,1, + 99,13,3,0,0,115,36,0,0,0,10,2,8,1,4,1, 2,1,12,1,12,1,6,1,14,1,14,1,6,1,8,1, - 2,1,6,254,8,3,4,251,2,254,255,128,122,31,87,105, - 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, - 100,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, - 0,0,67,0,0,0,115,30,0,0,0,124,0,160,0,124, - 1,124,2,161,2,125,3,124,3,100,1,117,1,114,26,124, - 3,106,1,83,0,100,1,83,0,41,2,122,108,70,105,110, - 100,32,109,111,100,117,108,101,32,110,97,109,101,100,32,105, - 110,32,116,104,101,32,114,101,103,105,115,116,114,121,46,10, - 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,85,115,101,32,101,120,101,99,95,109,111, - 100,117,108,101,40,41,32,105,110,115,116,101,97,100,46,10, - 10,32,32,32,32,32,32,32,32,78,169,2,114,207,0,0, - 0,114,144,0,0,0,169,4,114,202,0,0,0,114,143,0, - 0,0,114,52,0,0,0,114,191,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,11,102,105,110, - 100,95,109,111,100,117,108,101,29,3,0,0,115,10,0,0, - 0,12,7,8,1,6,1,4,2,255,128,122,33,87,105,110, - 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, - 101,114,46,102,105,110,100,95,109,111,100,117,108,101,41,2, - 78,78,41,1,78,41,15,114,130,0,0,0,114,129,0,0, - 0,114,131,0,0,0,114,132,0,0,0,114,200,0,0,0, - 114,199,0,0,0,218,11,95,77,83,95,87,73,78,68,79, - 87,83,218,18,69,88,84,69,78,83,73,79,78,95,83,85, - 70,70,73,88,69,83,114,198,0,0,0,218,12,115,116,97, - 116,105,99,109,101,116,104,111,100,114,197,0,0,0,218,11, - 99,108,97,115,115,109,101,116,104,111,100,114,204,0,0,0, - 114,207,0,0,0,114,210,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,195, - 0,0,0,235,2,0,0,115,32,0,0,0,8,0,4,2, - 2,3,2,255,2,4,2,255,12,3,2,2,10,1,2,6, - 10,1,2,14,12,1,2,15,16,1,255,128,114,195,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,64,0,0,0,115,48,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, - 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,132, - 0,90,6,100,8,100,9,132,0,90,7,100,10,83,0,41, - 11,218,13,95,76,111,97,100,101,114,66,97,115,105,99,115, - 122,83,66,97,115,101,32,99,108,97,115,115,32,111,102,32, - 99,111,109,109,111,110,32,99,111,100,101,32,110,101,101,100, - 101,100,32,98,121,32,98,111,116,104,32,83,111,117,114,99, - 101,76,111,97,100,101,114,32,97,110,100,10,32,32,32,32, - 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111, - 97,100,101,114,46,99,2,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,4,0,0,0,67,0,0,0,115,64, - 0,0,0,116,0,124,0,160,1,124,1,161,1,131,1,100, - 1,25,0,125,2,124,2,160,2,100,2,100,1,161,2,100, - 3,25,0,125,3,124,1,160,3,100,2,161,1,100,4,25, - 0,125,4,124,3,100,5,107,2,111,62,124,4,100,5,107, - 3,83,0,41,7,122,141,67,111,110,99,114,101,116,101,32, - 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111, - 102,32,73,110,115,112,101,99,116,76,111,97,100,101,114,46, - 105,115,95,112,97,99,107,97,103,101,32,98,121,32,99,104, - 101,99,107,105,110,103,32,105,102,10,32,32,32,32,32,32, - 32,32,116,104,101,32,112,97,116,104,32,114,101,116,117,114, - 110,101,100,32,98,121,32,103,101,116,95,102,105,108,101,110, - 97,109,101,32,104,97,115,32,97,32,102,105,108,101,110,97, - 109,101,32,111,102,32,39,95,95,105,110,105,116,95,95,46, - 112,121,39,46,114,3,0,0,0,114,79,0,0,0,114,0, - 0,0,0,114,39,0,0,0,218,8,95,95,105,110,105,116, - 95,95,78,41,4,114,55,0,0,0,114,183,0,0,0,114, - 51,0,0,0,114,49,0,0,0,41,5,114,123,0,0,0, - 114,143,0,0,0,114,101,0,0,0,90,13,102,105,108,101, - 110,97,109,101,95,98,97,115,101,90,9,116,97,105,108,95, - 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,186,0,0,0,48,3,0,0,115,10,0,0, - 0,18,3,16,1,14,1,16,1,255,128,122,24,95,76,111, - 97,100,101,114,66,97,115,105,99,115,46,105,115,95,112,97, - 99,107,97,103,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,169,2,122,42,85,115,101,32,100, - 101,102,97,117,108,116,32,115,101,109,97,110,116,105,99,115, - 32,102,111,114,32,109,111,100,117,108,101,32,99,114,101,97, - 116,105,111,110,46,78,114,7,0,0,0,169,2,114,123,0, - 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,13,99,114,101,97,116,101,95,109, - 111,100,117,108,101,56,3,0,0,115,4,0,0,0,4,0, - 255,128,122,27,95,76,111,97,100,101,114,66,97,115,105,99, - 115,46,99,114,101,97,116,101,95,109,111,100,117,108,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 5,0,0,0,67,0,0,0,115,56,0,0,0,124,0,160, - 0,124,1,106,1,161,1,125,2,124,2,100,1,117,0,114, - 36,116,2,100,2,160,3,124,1,106,1,161,1,131,1,130, - 1,116,4,160,5,116,6,124,2,124,1,106,7,161,3,1, - 0,100,1,83,0,41,3,122,19,69,120,101,99,117,116,101, - 32,116,104,101,32,109,111,100,117,108,101,46,78,122,52,99, - 97,110,110,111,116,32,108,111,97,100,32,109,111,100,117,108, - 101,32,123,33,114,125,32,119,104,101,110,32,103,101,116,95, - 99,111,100,101,40,41,32,114,101,116,117,114,110,115,32,78, - 111,110,101,41,8,218,8,103,101,116,95,99,111,100,101,114, - 130,0,0,0,114,122,0,0,0,114,70,0,0,0,114,139, - 0,0,0,218,25,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,218,4, - 101,120,101,99,114,136,0,0,0,41,3,114,123,0,0,0, - 218,6,109,111,100,117,108,101,114,168,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,11,101,120, - 101,99,95,109,111,100,117,108,101,59,3,0,0,115,14,0, - 0,0,12,2,8,1,6,1,4,1,6,255,20,2,255,128, - 122,25,95,76,111,97,100,101,114,66,97,115,105,99,115,46, - 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 67,0,0,0,115,12,0,0,0,116,0,160,1,124,0,124, - 1,161,2,83,0,41,2,122,26,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,78,41,2,114,139,0,0,0,218,17,95,108,111, - 97,100,95,109,111,100,117,108,101,95,115,104,105,109,169,2, - 114,123,0,0,0,114,143,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,11,108,111,97,100,95, - 109,111,100,117,108,101,67,3,0,0,115,4,0,0,0,12, - 3,255,128,122,25,95,76,111,97,100,101,114,66,97,115,105, - 99,115,46,108,111,97,100,95,109,111,100,117,108,101,78,41, - 8,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, - 114,132,0,0,0,114,186,0,0,0,114,219,0,0,0,114, - 224,0,0,0,114,227,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,215,0, - 0,0,43,3,0,0,115,14,0,0,0,8,0,4,2,8, - 3,8,8,8,3,12,8,255,128,114,215,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,64,0,0,0,115,74,0,0,0,101,0,90,1, - 100,0,90,2,100,1,100,2,132,0,90,3,100,3,100,4, - 132,0,90,4,100,5,100,6,132,0,90,5,100,7,100,8, - 132,0,90,6,100,9,100,10,132,0,90,7,100,11,100,12, - 156,1,100,13,100,14,132,2,90,8,100,15,100,16,132,0, - 90,9,100,17,83,0,41,18,218,12,83,111,117,114,99,101, - 76,111,97,100,101,114,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,116,0,130,1,41,2,122,165,79,112,116,105, - 111,110,97,108,32,109,101,116,104,111,100,32,116,104,97,116, - 32,114,101,116,117,114,110,115,32,116,104,101,32,109,111,100, - 105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,40, - 97,110,32,105,110,116,41,32,102,111,114,32,116,104,101,10, - 32,32,32,32,32,32,32,32,115,112,101,99,105,102,105,101, - 100,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, - 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32, - 79,83,69,114,114,111,114,32,119,104,101,110,32,116,104,101, - 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32, - 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32, - 32,78,41,1,114,58,0,0,0,169,2,114,123,0,0,0, - 114,52,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,10,112,97,116,104,95,109,116,105,109,101, - 75,3,0,0,115,4,0,0,0,4,6,255,128,122,23,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,0, - 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, - 14,0,0,0,100,1,124,0,160,0,124,1,161,1,105,1, - 83,0,41,3,97,158,1,0,0,79,112,116,105,111,110,97, - 108,32,109,101,116,104,111,100,32,114,101,116,117,114,110,105, - 110,103,32,97,32,109,101,116,97,100,97,116,97,32,100,105, - 99,116,32,102,111,114,32,116,104,101,32,115,112,101,99,105, - 102,105,101,100,10,32,32,32,32,32,32,32,32,112,97,116, + 2,1,6,254,8,3,2,128,4,251,2,254,255,128,122,31, + 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, + 105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,99, + 3,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 4,0,0,0,67,0,0,0,115,30,0,0,0,124,0,160, + 0,124,1,124,2,161,2,125,3,124,3,100,1,117,1,114, + 26,124,3,106,1,83,0,100,1,83,0,41,2,122,108,70, + 105,110,100,32,109,111,100,117,108,101,32,110,97,109,101,100, + 32,105,110,32,116,104,101,32,114,101,103,105,115,116,114,121, + 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,95, + 109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,100, + 46,10,10,32,32,32,32,32,32,32,32,78,169,2,114,207, + 0,0,0,114,144,0,0,0,169,4,114,202,0,0,0,114, + 143,0,0,0,114,52,0,0,0,114,191,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,102, + 105,110,100,95,109,111,100,117,108,101,29,3,0,0,115,10, + 0,0,0,12,7,8,1,6,1,4,2,255,128,122,33,87, + 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, + 110,100,101,114,46,102,105,110,100,95,109,111,100,117,108,101, + 41,2,78,78,41,1,78,41,15,114,130,0,0,0,114,129, + 0,0,0,114,131,0,0,0,114,132,0,0,0,114,200,0, + 0,0,114,199,0,0,0,218,11,95,77,83,95,87,73,78, + 68,79,87,83,218,18,69,88,84,69,78,83,73,79,78,95, + 83,85,70,70,73,88,69,83,114,198,0,0,0,218,12,115, + 116,97,116,105,99,109,101,116,104,111,100,114,197,0,0,0, + 218,11,99,108,97,115,115,109,101,116,104,111,100,114,204,0, + 0,0,114,207,0,0,0,114,210,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,195,0,0,0,235,2,0,0,115,32,0,0,0,8,0, + 4,2,2,3,2,255,2,4,2,255,12,3,2,2,10,1, + 2,6,10,1,2,14,12,1,2,15,16,1,255,128,114,195, + 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,64,0,0,0,115,48,0,0, + 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, + 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100, + 7,132,0,90,6,100,8,100,9,132,0,90,7,100,10,83, + 0,41,11,218,13,95,76,111,97,100,101,114,66,97,115,105, + 99,115,122,83,66,97,115,101,32,99,108,97,115,115,32,111, + 102,32,99,111,109,109,111,110,32,99,111,100,101,32,110,101, + 101,100,101,100,32,98,121,32,98,111,116,104,32,83,111,117, + 114,99,101,76,111,97,100,101,114,32,97,110,100,10,32,32, + 32,32,83,111,117,114,99,101,108,101,115,115,70,105,108,101, + 76,111,97,100,101,114,46,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,4,0,0,0,67,0,0,0, + 115,64,0,0,0,116,0,124,0,160,1,124,1,161,1,131, + 1,100,1,25,0,125,2,124,2,160,2,100,2,100,1,161, + 2,100,3,25,0,125,3,124,1,160,3,100,2,161,1,100, + 4,25,0,125,4,124,3,100,5,107,2,111,62,124,4,100, + 5,107,3,83,0,41,7,122,141,67,111,110,99,114,101,116, + 101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, + 32,111,102,32,73,110,115,112,101,99,116,76,111,97,100,101, + 114,46,105,115,95,112,97,99,107,97,103,101,32,98,121,32, + 99,104,101,99,107,105,110,103,32,105,102,10,32,32,32,32, + 32,32,32,32,116,104,101,32,112,97,116,104,32,114,101,116, + 117,114,110,101,100,32,98,121,32,103,101,116,95,102,105,108, + 101,110,97,109,101,32,104,97,115,32,97,32,102,105,108,101, + 110,97,109,101,32,111,102,32,39,95,95,105,110,105,116,95, + 95,46,112,121,39,46,114,3,0,0,0,114,79,0,0,0, + 114,0,0,0,0,114,39,0,0,0,218,8,95,95,105,110, + 105,116,95,95,78,41,4,114,55,0,0,0,114,183,0,0, + 0,114,51,0,0,0,114,49,0,0,0,41,5,114,123,0, + 0,0,114,143,0,0,0,114,101,0,0,0,90,13,102,105, + 108,101,110,97,109,101,95,98,97,115,101,90,9,116,97,105, + 108,95,110,97,109,101,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,186,0,0,0,48,3,0,0,115,10, + 0,0,0,18,3,16,1,14,1,16,1,255,128,122,24,95, + 76,111,97,100,101,114,66,97,115,105,99,115,46,105,115,95, + 112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,169,2,122,42,85,115,101, + 32,100,101,102,97,117,108,116,32,115,101,109,97,110,116,105, + 99,115,32,102,111,114,32,109,111,100,117,108,101,32,99,114, + 101,97,116,105,111,110,46,78,114,7,0,0,0,169,2,114, + 123,0,0,0,114,191,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,13,99,114,101,97,116,101, + 95,109,111,100,117,108,101,56,3,0,0,115,4,0,0,0, + 4,0,255,128,122,27,95,76,111,97,100,101,114,66,97,115, + 105,99,115,46,99,114,101,97,116,101,95,109,111,100,117,108, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,5,0,0,0,67,0,0,0,115,56,0,0,0,124, + 0,160,0,124,1,106,1,161,1,125,2,124,2,100,1,117, + 0,114,36,116,2,100,2,160,3,124,1,106,1,161,1,131, + 1,130,1,116,4,160,5,116,6,124,2,124,1,106,7,161, + 3,1,0,100,1,83,0,41,3,122,19,69,120,101,99,117, + 116,101,32,116,104,101,32,109,111,100,117,108,101,46,78,122, + 52,99,97,110,110,111,116,32,108,111,97,100,32,109,111,100, + 117,108,101,32,123,33,114,125,32,119,104,101,110,32,103,101, + 116,95,99,111,100,101,40,41,32,114,101,116,117,114,110,115, + 32,78,111,110,101,41,8,218,8,103,101,116,95,99,111,100, + 101,114,130,0,0,0,114,122,0,0,0,114,70,0,0,0, + 114,139,0,0,0,218,25,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, + 218,4,101,120,101,99,114,136,0,0,0,41,3,114,123,0, + 0,0,218,6,109,111,100,117,108,101,114,168,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11, + 101,120,101,99,95,109,111,100,117,108,101,59,3,0,0,115, + 14,0,0,0,12,2,8,1,6,1,4,1,6,255,20,2, + 255,128,122,25,95,76,111,97,100,101,114,66,97,115,105,99, + 115,46,101,120,101,99,95,109,111,100,117,108,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,67,0,0,0,115,12,0,0,0,116,0,160,1,124, + 0,124,1,161,2,83,0,41,2,122,26,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,78,41,2,114,139,0,0,0,218,17,95, + 108,111,97,100,95,109,111,100,117,108,101,95,115,104,105,109, + 169,2,114,123,0,0,0,114,143,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,11,108,111,97, + 100,95,109,111,100,117,108,101,67,3,0,0,115,4,0,0, + 0,12,3,255,128,122,25,95,76,111,97,100,101,114,66,97, + 115,105,99,115,46,108,111,97,100,95,109,111,100,117,108,101, + 78,41,8,114,130,0,0,0,114,129,0,0,0,114,131,0, + 0,0,114,132,0,0,0,114,186,0,0,0,114,219,0,0, + 0,114,224,0,0,0,114,227,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 215,0,0,0,43,3,0,0,115,14,0,0,0,8,0,4, + 2,8,3,8,8,8,3,12,8,255,128,114,215,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,74,0,0,0,101,0, + 90,1,100,0,90,2,100,1,100,2,132,0,90,3,100,3, + 100,4,132,0,90,4,100,5,100,6,132,0,90,5,100,7, + 100,8,132,0,90,6,100,9,100,10,132,0,90,7,100,11, + 100,12,156,1,100,13,100,14,132,2,90,8,100,15,100,16, + 132,0,90,9,100,17,83,0,41,18,218,12,83,111,117,114, + 99,101,76,111,97,100,101,114,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,116,0,130,1,41,2,122,165,79,112, + 116,105,111,110,97,108,32,109,101,116,104,111,100,32,116,104, + 97,116,32,114,101,116,117,114,110,115,32,116,104,101,32,109, + 111,100,105,102,105,99,97,116,105,111,110,32,116,105,109,101, + 32,40,97,110,32,105,110,116,41,32,102,111,114,32,116,104, + 101,10,32,32,32,32,32,32,32,32,115,112,101,99,105,102, + 105,101,100,32,112,97,116,104,32,40,97,32,115,116,114,41, + 46,10,10,32,32,32,32,32,32,32,32,82,97,105,115,101, + 115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,116, + 104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,98, + 101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,32, + 32,32,32,78,41,1,114,58,0,0,0,169,2,114,123,0, + 0,0,114,52,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,10,112,97,116,104,95,109,116,105, + 109,101,75,3,0,0,115,4,0,0,0,4,6,255,128,122, + 23,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,0,0,0,0,2,0,0,0,4,0,0,0,67,0,0, + 0,115,14,0,0,0,100,1,124,0,160,0,124,1,161,1, + 105,1,83,0,41,3,97,158,1,0,0,79,112,116,105,111, + 110,97,108,32,109,101,116,104,111,100,32,114,101,116,117,114, + 110,105,110,103,32,97,32,109,101,116,97,100,97,116,97,32, + 100,105,99,116,32,102,111,114,32,116,104,101,32,115,112,101, + 99,105,102,105,101,100,10,32,32,32,32,32,32,32,32,112, + 97,116,104,32,40,97,32,115,116,114,41,46,10,10,32,32, + 32,32,32,32,32,32,80,111,115,115,105,98,108,101,32,107, + 101,121,115,58,10,32,32,32,32,32,32,32,32,45,32,39, + 109,116,105,109,101,39,32,40,109,97,110,100,97,116,111,114, + 121,41,32,105,115,32,116,104,101,32,110,117,109,101,114,105, + 99,32,116,105,109,101,115,116,97,109,112,32,111,102,32,108, + 97,115,116,32,115,111,117,114,99,101,10,32,32,32,32,32, + 32,32,32,32,32,99,111,100,101,32,109,111,100,105,102,105, + 99,97,116,105,111,110,59,10,32,32,32,32,32,32,32,32, + 45,32,39,115,105,122,101,39,32,40,111,112,116,105,111,110, + 97,108,41,32,105,115,32,116,104,101,32,115,105,122,101,32, + 105,110,32,98,121,116,101,115,32,111,102,32,116,104,101,32, + 115,111,117,114,99,101,32,99,111,100,101,46,10,10,32,32, + 32,32,32,32,32,32,73,109,112,108,101,109,101,110,116,105, + 110,103,32,116,104,105,115,32,109,101,116,104,111,100,32,97, + 108,108,111,119,115,32,116,104,101,32,108,111,97,100,101,114, + 32,116,111,32,114,101,97,100,32,98,121,116,101,99,111,100, + 101,32,102,105,108,101,115,46,10,32,32,32,32,32,32,32, + 32,82,97,105,115,101,115,32,79,83,69,114,114,111,114,32, + 119,104,101,110,32,116,104,101,32,112,97,116,104,32,99,97, + 110,110,111,116,32,98,101,32,104,97,110,100,108,101,100,46, + 10,32,32,32,32,32,32,32,32,114,173,0,0,0,78,41, + 1,114,230,0,0,0,114,229,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,10,112,97,116,104, + 95,115,116,97,116,115,83,3,0,0,115,4,0,0,0,14, + 12,255,128,122,23,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,0,0,0,0,4,0,0,0,4,0,0, + 0,67,0,0,0,115,12,0,0,0,124,0,160,0,124,2, + 124,3,161,2,83,0,41,2,122,228,79,112,116,105,111,110, + 97,108,32,109,101,116,104,111,100,32,119,104,105,99,104,32, + 119,114,105,116,101,115,32,100,97,116,97,32,40,98,121,116, + 101,115,41,32,116,111,32,97,32,102,105,108,101,32,112,97, + 116,104,32,40,97,32,115,116,114,41,46,10,10,32,32,32, + 32,32,32,32,32,73,109,112,108,101,109,101,110,116,105,110, + 103,32,116,104,105,115,32,109,101,116,104,111,100,32,97,108, + 108,111,119,115,32,102,111,114,32,116,104,101,32,119,114,105, + 116,105,110,103,32,111,102,32,98,121,116,101,99,111,100,101, + 32,102,105,108,101,115,46,10,10,32,32,32,32,32,32,32, + 32,84,104,101,32,115,111,117,114,99,101,32,112,97,116,104, + 32,105,115,32,110,101,101,100,101,100,32,105,110,32,111,114, + 100,101,114,32,116,111,32,99,111,114,114,101,99,116,108,121, + 32,116,114,97,110,115,102,101,114,32,112,101,114,109,105,115, + 115,105,111,110,115,10,32,32,32,32,32,32,32,32,78,41, + 1,218,8,115,101,116,95,100,97,116,97,41,4,114,123,0, + 0,0,114,112,0,0,0,90,10,99,97,99,104,101,95,112, + 97,116,104,114,37,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,15,95,99,97,99,104,101,95, + 98,121,116,101,99,111,100,101,97,3,0,0,115,4,0,0, + 0,12,8,255,128,122,28,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,0,0,0,0, + 3,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,122,150,79,112,116,105,111,110,97, + 108,32,109,101,116,104,111,100,32,119,104,105,99,104,32,119, + 114,105,116,101,115,32,100,97,116,97,32,40,98,121,116,101, + 115,41,32,116,111,32,97,32,102,105,108,101,32,112,97,116, 104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,32, - 32,32,32,32,80,111,115,115,105,98,108,101,32,107,101,121, - 115,58,10,32,32,32,32,32,32,32,32,45,32,39,109,116, - 105,109,101,39,32,40,109,97,110,100,97,116,111,114,121,41, - 32,105,115,32,116,104,101,32,110,117,109,101,114,105,99,32, - 116,105,109,101,115,116,97,109,112,32,111,102,32,108,97,115, - 116,32,115,111,117,114,99,101,10,32,32,32,32,32,32,32, - 32,32,32,99,111,100,101,32,109,111,100,105,102,105,99,97, - 116,105,111,110,59,10,32,32,32,32,32,32,32,32,45,32, - 39,115,105,122,101,39,32,40,111,112,116,105,111,110,97,108, - 41,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110, - 32,98,121,116,101,115,32,111,102,32,116,104,101,32,115,111, - 117,114,99,101,32,99,111,100,101,46,10,10,32,32,32,32, 32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,103, 32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,108, - 111,119,115,32,116,104,101,32,108,111,97,100,101,114,32,116, - 111,32,114,101,97,100,32,98,121,116,101,99,111,100,101,32, - 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,82, - 97,105,115,101,115,32,79,83,69,114,114,111,114,32,119,104, - 101,110,32,116,104,101,32,112,97,116,104,32,99,97,110,110, - 111,116,32,98,101,32,104,97,110,100,108,101,100,46,10,32, - 32,32,32,32,32,32,32,114,173,0,0,0,78,41,1,114, - 230,0,0,0,114,229,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,10,112,97,116,104,95,115, - 116,97,116,115,83,3,0,0,115,4,0,0,0,14,12,255, - 128,122,23,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,0,0,0,0,4,0,0,0,4,0,0,0,67, - 0,0,0,115,12,0,0,0,124,0,160,0,124,2,124,3, - 161,2,83,0,41,2,122,228,79,112,116,105,111,110,97,108, - 32,109,101,116,104,111,100,32,119,104,105,99,104,32,119,114, - 105,116,101,115,32,100,97,116,97,32,40,98,121,116,101,115, - 41,32,116,111,32,97,32,102,105,108,101,32,112,97,116,104, - 32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,32, - 32,32,32,73,109,112,108,101,109,101,110,116,105,110,103,32, - 116,104,105,115,32,109,101,116,104,111,100,32,97,108,108,111, - 119,115,32,102,111,114,32,116,104,101,32,119,114,105,116,105, - 110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,102, - 105,108,101,115,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,115,111,117,114,99,101,32,112,97,116,104,32,105, - 115,32,110,101,101,100,101,100,32,105,110,32,111,114,100,101, - 114,32,116,111,32,99,111,114,114,101,99,116,108,121,32,116, - 114,97,110,115,102,101,114,32,112,101,114,109,105,115,115,105, - 111,110,115,10,32,32,32,32,32,32,32,32,78,41,1,218, - 8,115,101,116,95,100,97,116,97,41,4,114,123,0,0,0, - 114,112,0,0,0,90,10,99,97,99,104,101,95,112,97,116, - 104,114,37,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,15,95,99,97,99,104,101,95,98,121, - 116,101,99,111,100,101,97,3,0,0,115,4,0,0,0,12, - 8,255,128,122,28,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,0,0,0,0,3,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,150,79,112,116,105,111,110,97,108,32, - 109,101,116,104,111,100,32,119,104,105,99,104,32,119,114,105, - 116,101,115,32,100,97,116,97,32,40,98,121,116,101,115,41, - 32,116,111,32,97,32,102,105,108,101,32,112,97,116,104,32, - 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, - 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, - 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, - 115,32,102,111,114,32,116,104,101,32,119,114,105,116,105,110, - 103,32,111,102,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,115,46,10,32,32,32,32,32,32,32,32,78,114,7, - 0,0,0,41,3,114,123,0,0,0,114,52,0,0,0,114, - 37,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,232,0,0,0,107,3,0,0,115,4,0,0, - 0,4,0,255,128,122,21,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,0,0,0,0,5,0,0,0,10,0,0, - 0,67,0,0,0,115,70,0,0,0,124,0,160,0,124,1, - 161,1,125,2,122,20,124,0,160,1,124,2,161,1,125,3, - 87,0,116,4,124,3,131,1,83,0,4,0,116,2,121,68, - 1,0,125,4,1,0,122,14,116,3,100,1,124,1,100,2, - 141,2,124,4,130,2,100,3,125,4,126,4,119,1,119,0, - 41,4,122,52,67,111,110,99,114,101,116,101,32,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73, - 110,115,112,101,99,116,76,111,97,100,101,114,46,103,101,116, - 95,115,111,117,114,99,101,46,122,39,115,111,117,114,99,101, - 32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,116, - 104,114,111,117,103,104,32,103,101,116,95,100,97,116,97,40, - 41,114,120,0,0,0,78,41,5,114,183,0,0,0,218,8, - 103,101,116,95,100,97,116,97,114,58,0,0,0,114,122,0, - 0,0,114,180,0,0,0,41,5,114,123,0,0,0,114,143, - 0,0,0,114,52,0,0,0,114,178,0,0,0,218,3,101, - 120,99,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,10,103,101,116,95,115,111,117,114,99,101,114,3,0, - 0,115,26,0,0,0,10,2,2,1,12,1,8,4,14,253, - 4,1,2,1,4,255,2,1,2,255,8,128,2,255,255,128, - 122,23,83,111,117,114,99,101,76,111,97,100,101,114,46,103, - 101,116,95,115,111,117,114,99,101,114,109,0,0,0,41,1, - 218,9,95,111,112,116,105,109,105,122,101,99,3,0,0,0, - 0,0,0,0,1,0,0,0,4,0,0,0,8,0,0,0, - 67,0,0,0,115,22,0,0,0,116,0,106,1,116,2,124, - 1,124,2,100,1,100,2,124,3,100,3,141,6,83,0,41, - 5,122,130,82,101,116,117,114,110,32,116,104,101,32,99,111, - 100,101,32,111,98,106,101,99,116,32,99,111,109,112,105,108, - 101,100,32,102,114,111,109,32,115,111,117,114,99,101,46,10, - 10,32,32,32,32,32,32,32,32,84,104,101,32,39,100,97, - 116,97,39,32,97,114,103,117,109,101,110,116,32,99,97,110, - 32,98,101,32,97,110,121,32,111,98,106,101,99,116,32,116, - 121,112,101,32,116,104,97,116,32,99,111,109,112,105,108,101, - 40,41,32,115,117,112,112,111,114,116,115,46,10,32,32,32, - 32,32,32,32,32,114,222,0,0,0,84,41,2,218,12,100, - 111,110,116,95,105,110,104,101,114,105,116,114,89,0,0,0, - 78,41,3,114,139,0,0,0,114,221,0,0,0,218,7,99, - 111,109,112,105,108,101,41,4,114,123,0,0,0,114,37,0, - 0,0,114,52,0,0,0,114,237,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,14,115,111,117, - 114,99,101,95,116,111,95,99,111,100,101,124,3,0,0,115, - 8,0,0,0,12,5,4,1,6,255,255,128,122,27,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,0,0,0,0,15,0,0,0,9,0,0,0,67,0, - 0,0,115,34,2,0,0,124,0,160,0,124,1,161,1,125, - 2,100,1,125,3,100,1,125,4,100,1,125,5,100,2,125, - 6,100,3,125,7,122,12,116,1,124,2,131,1,125,8,87, - 0,110,24,4,0,116,2,144,2,121,32,1,0,1,0,1, - 0,100,1,125,8,89,0,144,1,110,38,122,14,124,0,160, - 3,124,2,161,1,125,9,87,0,110,20,4,0,116,4,144, - 2,121,30,1,0,1,0,1,0,89,0,144,1,110,2,116, - 5,124,9,100,4,25,0,131,1,125,3,122,14,124,0,160, - 6,124,8,161,1,125,10,87,0,110,18,4,0,116,4,144, - 2,121,28,1,0,1,0,1,0,89,0,110,212,124,1,124, - 8,100,5,156,2,125,11,122,148,116,7,124,10,124,1,124, - 11,131,3,125,12,116,8,124,10,131,1,100,6,100,1,133, - 2,25,0,125,13,124,12,100,7,64,0,100,8,107,3,125, - 6,124,6,144,1,114,30,124,12,100,9,64,0,100,8,107, - 3,125,7,116,9,106,10,100,10,107,3,144,1,114,50,124, - 7,115,248,116,9,106,10,100,11,107,2,144,1,114,50,124, - 0,160,6,124,2,161,1,125,4,116,9,160,11,116,12,124, - 4,161,2,125,5,116,13,124,10,124,5,124,1,124,11,131, - 4,1,0,110,20,116,14,124,10,124,3,124,9,100,12,25, - 0,124,1,124,11,131,5,1,0,87,0,110,22,4,0,116, - 15,116,16,102,2,144,2,121,26,1,0,1,0,1,0,89, - 0,110,30,116,17,160,18,100,13,124,8,124,2,161,3,1, - 0,116,19,124,13,124,1,124,8,124,2,100,14,141,4,83, - 0,124,4,100,1,117,0,144,1,114,126,124,0,160,6,124, - 2,161,1,125,4,124,0,160,20,124,4,124,2,161,2,125, - 14,116,17,160,18,100,15,124,2,161,2,1,0,116,21,106, - 22,144,2,115,20,124,8,100,1,117,1,144,2,114,20,124, - 3,100,1,117,1,144,2,114,20,124,6,144,1,114,218,124, - 5,100,1,117,0,144,1,114,204,116,9,160,11,124,4,161, - 1,125,5,116,23,124,14,124,5,124,7,131,3,125,10,110, - 16,116,24,124,14,124,3,116,25,124,4,131,1,131,3,125, - 10,122,20,124,0,160,26,124,2,124,8,124,10,161,3,1, - 0,87,0,124,14,83,0,4,0,116,2,144,2,121,24,1, - 0,1,0,1,0,89,0,124,14,83,0,124,14,83,0,119, - 0,119,0,119,0,119,0,119,0,41,16,122,190,67,111,110, - 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, - 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76, - 111,97,100,101,114,46,103,101,116,95,99,111,100,101,46,10, - 10,32,32,32,32,32,32,32,32,82,101,97,100,105,110,103, - 32,111,102,32,98,121,116,101,99,111,100,101,32,114,101,113, - 117,105,114,101,115,32,112,97,116,104,95,115,116,97,116,115, - 32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116, - 101,100,46,32,84,111,32,119,114,105,116,101,10,32,32,32, - 32,32,32,32,32,98,121,116,101,99,111,100,101,44,32,115, - 101,116,95,100,97,116,97,32,109,117,115,116,32,97,108,115, - 111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100, - 46,10,10,32,32,32,32,32,32,32,32,78,70,84,114,173, - 0,0,0,114,163,0,0,0,114,149,0,0,0,114,3,0, - 0,0,114,0,0,0,0,114,39,0,0,0,90,5,110,101, - 118,101,114,90,6,97,108,119,97,121,115,218,4,115,105,122, - 101,122,13,123,125,32,109,97,116,99,104,101,115,32,123,125, - 41,3,114,121,0,0,0,114,111,0,0,0,114,112,0,0, - 0,122,19,99,111,100,101,32,111,98,106,101,99,116,32,102, - 114,111,109,32,123,125,41,27,114,183,0,0,0,114,102,0, - 0,0,114,88,0,0,0,114,231,0,0,0,114,58,0,0, - 0,114,30,0,0,0,114,234,0,0,0,114,156,0,0,0, - 218,10,109,101,109,111,114,121,118,105,101,119,114,167,0,0, - 0,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, - 115,101,100,95,112,121,99,115,114,161,0,0,0,218,17,95, - 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, - 114,162,0,0,0,114,160,0,0,0,114,122,0,0,0,114, - 154,0,0,0,114,139,0,0,0,114,153,0,0,0,114,169, - 0,0,0,114,240,0,0,0,114,15,0,0,0,218,19,100, - 111,110,116,95,119,114,105,116,101,95,98,121,116,101,99,111, - 100,101,114,175,0,0,0,114,174,0,0,0,114,4,0,0, - 0,114,233,0,0,0,41,15,114,123,0,0,0,114,143,0, - 0,0,114,112,0,0,0,114,158,0,0,0,114,178,0,0, - 0,114,161,0,0,0,90,10,104,97,115,104,95,98,97,115, - 101,100,90,12,99,104,101,99,107,95,115,111,117,114,99,101, - 114,111,0,0,0,218,2,115,116,114,37,0,0,0,114,155, - 0,0,0,114,16,0,0,0,90,10,98,121,116,101,115,95, - 100,97,116,97,90,11,99,111,100,101,95,111,98,106,101,99, - 116,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,220,0,0,0,132,3,0,0,115,166,0,0,0,10,7, - 4,1,4,1,4,1,4,1,4,1,2,1,12,1,14,1, - 10,1,2,2,14,1,14,1,6,1,12,2,2,1,14,1, - 14,1,4,1,2,3,2,1,6,254,2,4,12,1,16,1, - 12,1,6,1,12,1,12,1,2,1,2,255,8,2,4,254, - 10,3,4,1,2,1,2,1,4,254,8,4,2,1,6,255, - 2,3,2,1,2,1,6,1,2,1,2,1,8,251,18,7, - 4,1,8,2,2,1,4,255,6,2,2,1,2,1,6,254, - 10,3,10,1,12,1,12,1,18,1,6,1,4,255,6,2, - 10,1,10,1,14,1,6,2,6,1,4,255,2,2,16,1, - 4,3,14,254,2,1,8,1,2,254,2,233,2,225,2,250, - 2,251,255,128,122,21,83,111,117,114,99,101,76,111,97,100, - 101,114,46,103,101,116,95,99,111,100,101,78,41,10,114,130, - 0,0,0,114,129,0,0,0,114,131,0,0,0,114,230,0, - 0,0,114,231,0,0,0,114,233,0,0,0,114,232,0,0, - 0,114,236,0,0,0,114,240,0,0,0,114,220,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,228,0,0,0,73,3,0,0,115,18,0, - 0,0,8,0,8,2,8,8,8,14,8,10,8,7,14,10, - 12,8,255,128,114,228,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, - 0,0,115,92,0,0,0,101,0,90,1,100,0,90,2,100, - 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, - 0,90,5,100,6,100,7,132,0,90,6,101,7,135,0,102, - 1,100,8,100,9,132,8,131,1,90,8,101,7,100,10,100, - 11,132,0,131,1,90,9,100,12,100,13,132,0,90,10,101, - 7,100,14,100,15,132,0,131,1,90,11,135,0,4,0,90, - 12,83,0,41,16,218,10,70,105,108,101,76,111,97,100,101, - 114,122,103,66,97,115,101,32,102,105,108,101,32,108,111,97, - 100,101,114,32,99,108,97,115,115,32,119,104,105,99,104,32, - 105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,108, - 111,97,100,101,114,32,112,114,111,116,111,99,111,108,32,109, - 101,116,104,111,100,115,32,116,104,97,116,10,32,32,32,32, - 114,101,113,117,105,114,101,32,102,105,108,101,32,115,121,115, - 116,101,109,32,117,115,97,103,101,46,99,3,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,67, - 0,0,0,115,16,0,0,0,124,1,124,0,95,0,124,2, - 124,0,95,1,100,1,83,0,41,2,122,75,67,97,99,104, - 101,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109, - 101,32,97,110,100,32,116,104,101,32,112,97,116,104,32,116, - 111,32,116,104,101,32,102,105,108,101,32,102,111,117,110,100, - 32,98,121,32,116,104,101,10,32,32,32,32,32,32,32,32, - 102,105,110,100,101,114,46,78,114,163,0,0,0,41,3,114, - 123,0,0,0,114,143,0,0,0,114,52,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,216,0, - 0,0,222,3,0,0,115,6,0,0,0,6,3,10,1,255, - 128,122,19,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,0, - 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, - 24,0,0,0,124,0,106,0,124,1,106,0,107,2,111,22, - 124,0,106,1,124,1,106,1,107,2,83,0,114,114,0,0, - 0,169,2,218,9,95,95,99,108,97,115,115,95,95,114,136, - 0,0,0,169,2,114,123,0,0,0,90,5,111,116,104,101, - 114,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,6,95,95,101,113,95,95,228,3,0,0,115,8,0,0, - 0,12,1,10,1,2,255,255,128,122,17,70,105,108,101,76, - 111,97,100,101,114,46,95,95,101,113,95,95,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,115,20,0,0,0,116,0,124,0,106,1, - 131,1,116,0,124,0,106,2,131,1,65,0,83,0,114,114, - 0,0,0,169,3,218,4,104,97,115,104,114,121,0,0,0, - 114,52,0,0,0,169,1,114,123,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,8,95,95,104, - 97,115,104,95,95,232,3,0,0,115,4,0,0,0,20,1, - 255,128,122,19,70,105,108,101,76,111,97,100,101,114,46,95, - 95,104,97,115,104,95,95,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0, - 115,16,0,0,0,116,0,116,1,124,0,131,2,160,2,124, - 1,161,1,83,0,41,2,122,100,76,111,97,100,32,97,32, - 109,111,100,117,108,101,32,102,114,111,109,32,97,32,102,105, - 108,101,46,10,10,32,32,32,32,32,32,32,32,84,104,105, - 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,32,32,85,115,101,32,101,120,101, - 99,95,109,111,100,117,108,101,40,41,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,3, - 218,5,115,117,112,101,114,114,246,0,0,0,114,227,0,0, - 0,114,226,0,0,0,169,1,114,248,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,227,0,0,0,235,3,0,0, - 115,4,0,0,0,16,10,255,128,122,22,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,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,6,0,0,0,124, - 0,106,0,83,0,169,2,122,58,82,101,116,117,114,110,32, - 116,104,101,32,112,97,116,104,32,116,111,32,116,104,101,32, - 115,111,117,114,99,101,32,102,105,108,101,32,97,115,32,102, - 111,117,110,100,32,98,121,32,116,104,101,32,102,105,110,100, - 101,114,46,78,114,56,0,0,0,114,226,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,183,0, - 0,0,247,3,0,0,115,4,0,0,0,6,3,255,128,122, - 23,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,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, - 0,115,128,0,0,0,116,0,124,0,116,1,116,2,102,2, - 131,2,114,72,116,3,160,4,116,5,124,1,131,1,161,1, - 143,24,125,2,124,2,160,6,161,0,87,0,2,0,100,1, - 4,0,4,0,131,3,1,0,83,0,49,0,115,58,119,1, - 1,0,1,0,1,0,89,0,1,0,100,1,83,0,116,3, - 160,7,124,1,100,2,161,2,143,24,125,2,124,2,160,6, - 161,0,87,0,2,0,100,1,4,0,4,0,131,3,1,0, - 83,0,49,0,115,114,119,1,1,0,1,0,1,0,89,0, - 1,0,100,1,83,0,41,3,122,39,82,101,116,117,114,110, - 32,116,104,101,32,100,97,116,97,32,102,114,111,109,32,112, - 97,116,104,32,97,115,32,114,97,119,32,98,121,116,101,115, - 46,78,218,1,114,41,8,114,165,0,0,0,114,228,0,0, - 0,218,19,69,120,116,101,110,115,105,111,110,70,105,108,101, - 76,111,97,100,101,114,114,72,0,0,0,90,9,111,112,101, - 110,95,99,111,100,101,114,90,0,0,0,90,4,114,101,97, - 100,114,73,0,0,0,41,3,114,123,0,0,0,114,52,0, - 0,0,114,76,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,234,0,0,0,252,3,0,0,115, - 14,0,0,0,14,2,16,1,42,1,14,2,38,1,4,128, - 255,128,122,19,70,105,108,101,76,111,97,100,101,114,46,103, - 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,2,0,0,0,67,0,0,0, - 115,20,0,0,0,100,1,100,2,108,0,109,1,125,2,1, - 0,124,2,124,0,131,1,83,0,41,3,78,114,0,0,0, - 0,41,1,218,10,70,105,108,101,82,101,97,100,101,114,41, - 2,90,17,105,109,112,111,114,116,108,105,98,46,114,101,97, - 100,101,114,115,114,4,1,0,0,41,3,114,123,0,0,0, - 114,223,0,0,0,114,4,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,19,103,101,116,95,114, - 101,115,111,117,114,99,101,95,114,101,97,100,101,114,5,4, - 0,0,115,6,0,0,0,12,2,8,1,255,128,122,30,70, - 105,108,101,76,111,97,100,101,114,46,103,101,116,95,114,101, - 115,111,117,114,99,101,95,114,101,97,100,101,114,41,13,114, - 130,0,0,0,114,129,0,0,0,114,131,0,0,0,114,132, - 0,0,0,114,216,0,0,0,114,250,0,0,0,114,254,0, - 0,0,114,140,0,0,0,114,227,0,0,0,114,183,0,0, - 0,114,234,0,0,0,114,5,1,0,0,90,13,95,95,99, - 108,97,115,115,99,101,108,108,95,95,114,7,0,0,0,114, - 7,0,0,0,114,0,1,0,0,114,8,0,0,0,114,246, - 0,0,0,217,3,0,0,115,26,0,0,0,8,0,4,2, - 8,3,8,6,8,4,2,3,14,1,2,11,10,1,8,4, - 2,9,18,1,255,128,114,246,0,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 64,0,0,0,115,46,0,0,0,101,0,90,1,100,0,90, + 111,119,115,32,102,111,114,32,116,104,101,32,119,114,105,116, + 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,78, + 114,7,0,0,0,41,3,114,123,0,0,0,114,52,0,0, + 0,114,37,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,232,0,0,0,107,3,0,0,115,4, + 0,0,0,4,0,255,128,122,21,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,0,0,0,0,5,0,0,0,10, + 0,0,0,67,0,0,0,115,70,0,0,0,124,0,160,0, + 124,1,161,1,125,2,122,20,124,0,160,1,124,2,161,1, + 125,3,87,0,116,4,124,3,131,1,83,0,4,0,116,2, + 121,68,1,0,125,4,1,0,122,14,116,3,100,1,124,1, + 100,2,141,2,124,4,130,2,100,3,125,4,126,4,119,1, + 119,0,41,4,122,52,67,111,110,99,114,101,116,101,32,105, + 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, + 32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,103, + 101,116,95,115,111,117,114,99,101,46,122,39,115,111,117,114, + 99,101,32,110,111,116,32,97,118,97,105,108,97,98,108,101, + 32,116,104,114,111,117,103,104,32,103,101,116,95,100,97,116, + 97,40,41,114,120,0,0,0,78,41,5,114,183,0,0,0, + 218,8,103,101,116,95,100,97,116,97,114,58,0,0,0,114, + 122,0,0,0,114,180,0,0,0,41,5,114,123,0,0,0, + 114,143,0,0,0,114,52,0,0,0,114,178,0,0,0,218, + 3,101,120,99,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,114, + 3,0,0,115,26,0,0,0,10,2,2,1,12,1,8,4, + 14,253,4,1,2,1,4,255,2,1,2,255,8,128,2,255, + 255,128,122,23,83,111,117,114,99,101,76,111,97,100,101,114, + 46,103,101,116,95,115,111,117,114,99,101,114,109,0,0,0, + 41,1,218,9,95,111,112,116,105,109,105,122,101,99,3,0, + 0,0,0,0,0,0,1,0,0,0,4,0,0,0,8,0, + 0,0,67,0,0,0,115,22,0,0,0,116,0,106,1,116, + 2,124,1,124,2,100,1,100,2,124,3,100,3,141,6,83, + 0,41,5,122,130,82,101,116,117,114,110,32,116,104,101,32, + 99,111,100,101,32,111,98,106,101,99,116,32,99,111,109,112, + 105,108,101,100,32,102,114,111,109,32,115,111,117,114,99,101, + 46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,39, + 100,97,116,97,39,32,97,114,103,117,109,101,110,116,32,99, + 97,110,32,98,101,32,97,110,121,32,111,98,106,101,99,116, + 32,116,121,112,101,32,116,104,97,116,32,99,111,109,112,105, + 108,101,40,41,32,115,117,112,112,111,114,116,115,46,10,32, + 32,32,32,32,32,32,32,114,222,0,0,0,84,41,2,218, + 12,100,111,110,116,95,105,110,104,101,114,105,116,114,89,0, + 0,0,78,41,3,114,139,0,0,0,114,221,0,0,0,218, + 7,99,111,109,112,105,108,101,41,4,114,123,0,0,0,114, + 37,0,0,0,114,52,0,0,0,114,237,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,14,115, + 111,117,114,99,101,95,116,111,95,99,111,100,101,124,3,0, + 0,115,8,0,0,0,12,5,4,1,6,255,255,128,122,27, + 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,0,0,0,0,15,0,0,0,9,0,0,0, + 67,0,0,0,115,34,2,0,0,124,0,160,0,124,1,161, + 1,125,2,100,1,125,3,100,1,125,4,100,1,125,5,100, + 2,125,6,100,3,125,7,122,12,116,1,124,2,131,1,125, + 8,87,0,110,24,4,0,116,2,144,2,121,32,1,0,1, + 0,1,0,100,1,125,8,89,0,144,1,110,38,122,14,124, + 0,160,3,124,2,161,1,125,9,87,0,110,20,4,0,116, + 4,144,2,121,30,1,0,1,0,1,0,89,0,144,1,110, + 2,116,5,124,9,100,4,25,0,131,1,125,3,122,14,124, + 0,160,6,124,8,161,1,125,10,87,0,110,18,4,0,116, + 4,144,2,121,28,1,0,1,0,1,0,89,0,110,212,124, + 1,124,8,100,5,156,2,125,11,122,148,116,7,124,10,124, + 1,124,11,131,3,125,12,116,8,124,10,131,1,100,6,100, + 1,133,2,25,0,125,13,124,12,100,7,64,0,100,8,107, + 3,125,6,124,6,144,1,114,30,124,12,100,9,64,0,100, + 8,107,3,125,7,116,9,106,10,100,10,107,3,144,1,114, + 28,124,7,115,248,116,9,106,10,100,11,107,2,144,1,114, + 28,124,0,160,6,124,2,161,1,125,4,116,9,160,11,116, + 12,124,4,161,2,125,5,116,13,124,10,124,5,124,1,124, + 11,131,4,1,0,110,20,116,14,124,10,124,3,124,9,100, + 12,25,0,124,1,124,11,131,5,1,0,87,0,110,22,4, + 0,116,15,116,16,102,2,144,2,121,26,1,0,1,0,1, + 0,89,0,110,30,116,17,160,18,100,13,124,8,124,2,161, + 3,1,0,116,19,124,13,124,1,124,8,124,2,100,14,141, + 4,83,0,124,4,100,1,117,0,144,1,114,126,124,0,160, + 6,124,2,161,1,125,4,124,0,160,20,124,4,124,2,161, + 2,125,14,116,17,160,18,100,15,124,2,161,2,1,0,116, + 21,106,22,144,2,115,20,124,8,100,1,117,1,144,2,114, + 20,124,3,100,1,117,1,144,2,114,20,124,6,144,1,114, + 218,124,5,100,1,117,0,144,1,114,204,116,9,160,11,124, + 4,161,1,125,5,116,23,124,14,124,5,124,7,131,3,125, + 10,110,16,116,24,124,14,124,3,116,25,124,4,131,1,131, + 3,125,10,122,20,124,0,160,26,124,2,124,8,124,10,161, + 3,1,0,87,0,124,14,83,0,4,0,116,2,144,2,121, + 24,1,0,1,0,1,0,89,0,124,14,83,0,124,14,83, + 0,119,0,119,0,119,0,119,0,119,0,41,16,122,190,67, + 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99, + 116,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101, + 46,10,10,32,32,32,32,32,32,32,32,82,101,97,100,105, + 110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,114, + 101,113,117,105,114,101,115,32,112,97,116,104,95,115,116,97, + 116,115,32,116,111,32,98,101,32,105,109,112,108,101,109,101, + 110,116,101,100,46,32,84,111,32,119,114,105,116,101,10,32, + 32,32,32,32,32,32,32,98,121,116,101,99,111,100,101,44, + 32,115,101,116,95,100,97,116,97,32,109,117,115,116,32,97, + 108,115,111,32,98,101,32,105,109,112,108,101,109,101,110,116, + 101,100,46,10,10,32,32,32,32,32,32,32,32,78,70,84, + 114,173,0,0,0,114,163,0,0,0,114,149,0,0,0,114, + 3,0,0,0,114,0,0,0,0,114,39,0,0,0,90,5, + 110,101,118,101,114,90,6,97,108,119,97,121,115,218,4,115, + 105,122,101,122,13,123,125,32,109,97,116,99,104,101,115,32, + 123,125,41,3,114,121,0,0,0,114,111,0,0,0,114,112, + 0,0,0,122,19,99,111,100,101,32,111,98,106,101,99,116, + 32,102,114,111,109,32,123,125,41,27,114,183,0,0,0,114, + 102,0,0,0,114,88,0,0,0,114,231,0,0,0,114,58, + 0,0,0,114,30,0,0,0,114,234,0,0,0,114,156,0, + 0,0,218,10,109,101,109,111,114,121,118,105,101,119,114,167, + 0,0,0,90,21,99,104,101,99,107,95,104,97,115,104,95, + 98,97,115,101,100,95,112,121,99,115,114,161,0,0,0,218, + 17,95,82,65,87,95,77,65,71,73,67,95,78,85,77,66, + 69,82,114,162,0,0,0,114,160,0,0,0,114,122,0,0, + 0,114,154,0,0,0,114,139,0,0,0,114,153,0,0,0, + 114,169,0,0,0,114,240,0,0,0,114,15,0,0,0,218, + 19,100,111,110,116,95,119,114,105,116,101,95,98,121,116,101, + 99,111,100,101,114,175,0,0,0,114,174,0,0,0,114,4, + 0,0,0,114,233,0,0,0,41,15,114,123,0,0,0,114, + 143,0,0,0,114,112,0,0,0,114,158,0,0,0,114,178, + 0,0,0,114,161,0,0,0,90,10,104,97,115,104,95,98, + 97,115,101,100,90,12,99,104,101,99,107,95,115,111,117,114, + 99,101,114,111,0,0,0,218,2,115,116,114,37,0,0,0, + 114,155,0,0,0,114,16,0,0,0,90,10,98,121,116,101, + 115,95,100,97,116,97,90,11,99,111,100,101,95,111,98,106, + 101,99,116,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,220,0,0,0,132,3,0,0,115,166,0,0,0, + 10,7,4,1,4,1,4,1,4,1,4,1,2,1,12,1, + 14,1,10,1,2,2,14,1,14,1,6,1,12,2,2,1, + 14,1,14,1,4,1,2,3,2,1,6,254,2,4,12,1, + 16,1,12,1,6,1,12,1,12,1,2,1,2,255,8,2, + 4,254,10,3,4,1,2,1,2,1,4,254,8,4,2,1, + 6,255,2,3,2,1,2,1,6,1,2,1,2,1,8,251, + 18,7,4,1,8,2,2,1,4,255,6,2,2,1,2,1, + 6,254,10,3,10,1,12,1,12,1,18,1,6,1,4,255, + 6,2,10,1,10,1,14,1,6,2,6,1,4,255,2,2, + 16,1,4,3,14,254,2,1,8,1,2,254,2,233,2,225, + 2,250,2,251,255,128,122,21,83,111,117,114,99,101,76,111, + 97,100,101,114,46,103,101,116,95,99,111,100,101,78,41,10, + 114,130,0,0,0,114,129,0,0,0,114,131,0,0,0,114, + 230,0,0,0,114,231,0,0,0,114,233,0,0,0,114,232, + 0,0,0,114,236,0,0,0,114,240,0,0,0,114,220,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,228,0,0,0,73,3,0,0,115, + 18,0,0,0,8,0,8,2,8,8,8,14,8,10,8,7, + 14,10,12,8,255,128,114,228,0,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 0,0,0,0,115,92,0,0,0,101,0,90,1,100,0,90, 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, - 5,132,0,90,5,100,6,100,7,156,1,100,8,100,9,132, - 2,90,6,100,10,83,0,41,11,218,16,83,111,117,114,99, - 101,70,105,108,101,76,111,97,100,101,114,122,62,67,111,110, - 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, - 116,105,111,110,32,111,102,32,83,111,117,114,99,101,76,111, - 97,100,101,114,32,117,115,105,110,103,32,116,104,101,32,102, - 105,108,101,32,115,121,115,116,101,109,46,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,22,0,0,0,116,0,124,1,131,1,125, - 2,124,2,106,1,124,2,106,2,100,1,156,2,83,0,41, - 3,122,33,82,101,116,117,114,110,32,116,104,101,32,109,101, - 116,97,100,97,116,97,32,102,111,114,32,116,104,101,32,112, - 97,116,104,46,41,2,114,173,0,0,0,114,241,0,0,0, - 78,41,3,114,57,0,0,0,218,8,115,116,95,109,116,105, - 109,101,90,7,115,116,95,115,105,122,101,41,3,114,123,0, - 0,0,114,52,0,0,0,114,245,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,231,0,0,0, - 15,4,0,0,115,6,0,0,0,8,2,14,1,255,128,122, - 27,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,0,0,0,0,0,5,0,0,0,5,0,0, - 0,67,0,0,0,115,24,0,0,0,116,0,124,1,131,1, - 125,4,124,0,106,1,124,2,124,3,124,4,100,1,141,3, - 83,0,41,2,78,169,1,218,5,95,109,111,100,101,41,2, - 114,119,0,0,0,114,232,0,0,0,41,5,114,123,0,0, - 0,114,112,0,0,0,114,111,0,0,0,114,37,0,0,0, - 114,60,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,233,0,0,0,20,4,0,0,115,6,0, - 0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,68,0,0,0,114, - 8,1,0,0,99,3,0,0,0,0,0,0,0,1,0,0, - 0,9,0,0,0,11,0,0,0,67,0,0,0,115,4,1, - 0,0,116,0,124,1,131,1,92,2,125,4,125,5,103,0, - 125,6,124,4,114,62,116,1,124,4,131,1,115,62,116,0, - 124,4,131,1,92,2,125,4,125,7,124,6,160,2,124,7, - 161,1,1,0,124,4,114,62,116,1,124,4,131,1,114,28, - 116,3,124,6,131,1,68,0,93,98,125,7,116,4,124,4, - 124,7,131,2,125,4,122,14,116,5,160,6,124,4,161,1, - 1,0,87,0,113,70,4,0,116,7,121,116,1,0,1,0, - 1,0,89,0,113,70,4,0,116,8,144,1,121,2,1,0, - 125,8,1,0,122,30,116,9,160,10,100,1,124,4,124,8, - 161,3,1,0,87,0,89,0,100,2,125,8,126,8,1,0, - 100,2,83,0,100,2,125,8,126,8,119,1,122,30,116,11, - 124,1,124,2,124,3,131,3,1,0,116,9,160,10,100,3, - 124,1,161,2,1,0,87,0,100,2,83,0,4,0,116,8, - 121,252,1,0,125,8,1,0,122,28,116,9,160,10,100,1, - 124,1,124,8,161,3,1,0,87,0,89,0,100,2,125,8, - 126,8,100,2,83,0,100,2,125,8,126,8,119,1,119,0, - 100,2,83,0,119,0,41,4,122,27,87,114,105,116,101,32, - 98,121,116,101,115,32,100,97,116,97,32,116,111,32,97,32, - 102,105,108,101,46,122,27,99,111,117,108,100,32,110,111,116, - 32,99,114,101,97,116,101,32,123,33,114,125,58,32,123,33, - 114,125,78,122,12,99,114,101,97,116,101,100,32,123,33,114, - 125,41,12,114,55,0,0,0,114,64,0,0,0,114,190,0, - 0,0,114,50,0,0,0,114,48,0,0,0,114,18,0,0, - 0,90,5,109,107,100,105,114,218,15,70,105,108,101,69,120, - 105,115,116,115,69,114,114,111,114,114,58,0,0,0,114,139, - 0,0,0,114,153,0,0,0,114,77,0,0,0,41,9,114, - 123,0,0,0,114,52,0,0,0,114,37,0,0,0,114,9, - 1,0,0,218,6,112,97,114,101,110,116,114,101,0,0,0, - 114,47,0,0,0,114,43,0,0,0,114,235,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,232, - 0,0,0,25,4,0,0,115,60,0,0,0,12,2,4,1, - 12,2,12,1,10,1,12,254,12,4,10,1,2,1,14,1, - 12,1,4,2,16,1,6,3,4,1,4,255,16,2,8,128, - 2,1,12,1,18,1,14,1,8,2,2,1,18,255,8,128, - 2,254,4,255,2,248,255,128,122,25,83,111,117,114,99,101, - 70,105,108,101,76,111,97,100,101,114,46,115,101,116,95,100, - 97,116,97,78,41,7,114,130,0,0,0,114,129,0,0,0, - 114,131,0,0,0,114,132,0,0,0,114,231,0,0,0,114, - 233,0,0,0,114,232,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,6,1, - 0,0,11,4,0,0,115,12,0,0,0,8,0,4,2,8, - 2,8,5,18,5,255,128,114,6,1,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,64,0,0,0,115,32,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, - 100,5,132,0,90,5,100,6,83,0,41,7,218,20,83,111, - 117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,100, - 101,114,122,45,76,111,97,100,101,114,32,119,104,105,99,104, - 32,104,97,110,100,108,101,115,32,115,111,117,114,99,101,108, - 101,115,115,32,102,105,108,101,32,105,109,112,111,114,116,115, - 46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,5,0,0,0,67,0,0,0,115,68,0,0,0,124, - 0,160,0,124,1,161,1,125,2,124,0,160,1,124,2,161, - 1,125,3,124,1,124,2,100,1,156,2,125,4,116,2,124, - 3,124,1,124,4,131,3,1,0,116,3,116,4,124,3,131, - 1,100,2,100,0,133,2,25,0,124,1,124,2,100,3,141, - 3,83,0,41,4,78,114,163,0,0,0,114,149,0,0,0, - 41,2,114,121,0,0,0,114,111,0,0,0,41,5,114,183, - 0,0,0,114,234,0,0,0,114,156,0,0,0,114,169,0, - 0,0,114,242,0,0,0,41,5,114,123,0,0,0,114,143, - 0,0,0,114,52,0,0,0,114,37,0,0,0,114,155,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,220,0,0,0,60,4,0,0,115,24,0,0,0,10, - 1,10,1,2,4,2,1,6,254,12,4,2,1,14,1,2, - 1,2,1,6,253,255,128,122,29,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,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,2,122,39,82,101,116,117, - 114,110,32,78,111,110,101,32,97,115,32,116,104,101,114,101, - 32,105,115,32,110,111,32,115,111,117,114,99,101,32,99,111, - 100,101,46,78,114,7,0,0,0,114,226,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,236,0, - 0,0,76,4,0,0,115,4,0,0,0,4,2,255,128,122, - 31,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,41,6,114,130,0,0,0,114,129,0,0,0,114,131,0, - 0,0,114,132,0,0,0,114,220,0,0,0,114,236,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,12,1,0,0,56,4,0,0,115,10, - 0,0,0,8,0,4,2,8,2,12,16,255,128,114,12,1, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,64,0,0,0,115,92,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, - 132,0,90,6,100,8,100,9,132,0,90,7,100,10,100,11, - 132,0,90,8,100,12,100,13,132,0,90,9,100,14,100,15, - 132,0,90,10,100,16,100,17,132,0,90,11,101,12,100,18, - 100,19,132,0,131,1,90,13,100,20,83,0,41,21,114,3, - 1,0,0,122,93,76,111,97,100,101,114,32,102,111,114,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 115,46,10,10,32,32,32,32,84,104,101,32,99,111,110,115, - 116,114,117,99,116,111,114,32,105,115,32,100,101,115,105,103, - 110,101,100,32,116,111,32,119,111,114,107,32,119,105,116,104, - 32,70,105,108,101,70,105,110,100,101,114,46,10,10,32,32, - 32,32,99,3,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, - 124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0, - 114,114,0,0,0,114,163,0,0,0,41,3,114,123,0,0, - 0,114,121,0,0,0,114,52,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,216,0,0,0,89, - 4,0,0,115,6,0,0,0,6,1,10,1,255,128,122,28, - 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,0,0,0,0,2,0,0,0,2,0,0, - 0,67,0,0,0,115,24,0,0,0,124,0,106,0,124,1, - 106,0,107,2,111,22,124,0,106,1,124,1,106,1,107,2, - 83,0,114,114,0,0,0,114,247,0,0,0,114,249,0,0, + 5,132,0,90,5,100,6,100,7,132,0,90,6,101,7,135, + 0,102,1,100,8,100,9,132,8,131,1,90,8,101,7,100, + 10,100,11,132,0,131,1,90,9,100,12,100,13,132,0,90, + 10,101,7,100,14,100,15,132,0,131,1,90,11,135,0,4, + 0,90,12,83,0,41,16,218,10,70,105,108,101,76,111,97, + 100,101,114,122,103,66,97,115,101,32,102,105,108,101,32,108, + 111,97,100,101,114,32,99,108,97,115,115,32,119,104,105,99, + 104,32,105,109,112,108,101,109,101,110,116,115,32,116,104,101, + 32,108,111,97,100,101,114,32,112,114,111,116,111,99,111,108, + 32,109,101,116,104,111,100,115,32,116,104,97,116,10,32,32, + 32,32,114,101,113,117,105,114,101,32,102,105,108,101,32,115, + 121,115,116,101,109,32,117,115,97,103,101,46,99,3,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0, + 0,67,0,0,0,115,16,0,0,0,124,1,124,0,95,0, + 124,2,124,0,95,1,100,1,83,0,41,2,122,75,67,97, + 99,104,101,32,116,104,101,32,109,111,100,117,108,101,32,110, + 97,109,101,32,97,110,100,32,116,104,101,32,112,97,116,104, + 32,116,111,32,116,104,101,32,102,105,108,101,32,102,111,117, + 110,100,32,98,121,32,116,104,101,10,32,32,32,32,32,32, + 32,32,102,105,110,100,101,114,46,78,114,163,0,0,0,41, + 3,114,123,0,0,0,114,143,0,0,0,114,52,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 216,0,0,0,222,3,0,0,115,6,0,0,0,6,3,10, + 1,255,128,122,19,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,115,24,0,0,0,124,0,106,0,124,1,106,0,107,2, + 111,22,124,0,106,1,124,1,106,1,107,2,83,0,114,114, + 0,0,0,169,2,218,9,95,95,99,108,97,115,115,95,95, + 114,136,0,0,0,169,2,114,123,0,0,0,90,5,111,116, + 104,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,6,95,95,101,113,95,95,228,3,0,0,115,8, + 0,0,0,12,1,10,1,2,255,255,128,122,17,70,105,108, + 101,76,111,97,100,101,114,46,95,95,101,113,95,95,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, + 0,0,0,67,0,0,0,115,20,0,0,0,116,0,124,0, + 106,1,131,1,116,0,124,0,106,2,131,1,65,0,83,0, + 114,114,0,0,0,169,3,218,4,104,97,115,104,114,121,0, + 0,0,114,52,0,0,0,169,1,114,123,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,95, + 95,104,97,115,104,95,95,232,3,0,0,115,4,0,0,0, + 20,1,255,128,122,19,70,105,108,101,76,111,97,100,101,114, + 46,95,95,104,97,115,104,95,95,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,3,0,0,0,3,0, + 0,0,115,16,0,0,0,116,0,116,1,124,0,131,2,160, + 2,124,1,161,1,83,0,41,2,122,100,76,111,97,100,32, + 97,32,109,111,100,117,108,101,32,102,114,111,109,32,97,32, + 102,105,108,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101, + 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, + 41,3,218,5,115,117,112,101,114,114,246,0,0,0,114,227, + 0,0,0,114,226,0,0,0,169,1,114,248,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,227,0,0,0,235,3, + 0,0,115,4,0,0,0,16,10,255,128,122,22,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,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,6,0,0, + 0,124,0,106,0,83,0,169,2,122,58,82,101,116,117,114, + 110,32,116,104,101,32,112,97,116,104,32,116,111,32,116,104, + 101,32,115,111,117,114,99,101,32,102,105,108,101,32,97,115, + 32,102,111,117,110,100,32,98,121,32,116,104,101,32,102,105, + 110,100,101,114,46,78,114,56,0,0,0,114,226,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 183,0,0,0,247,3,0,0,115,4,0,0,0,6,3,255, + 128,122,23,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,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,128,0,0,0,116,0,124,0,116,1,116,2, + 102,2,131,2,114,72,116,3,160,4,116,5,124,1,131,1, + 161,1,143,24,125,2,124,2,160,6,161,0,87,0,2,0, + 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,58, + 119,1,1,0,1,0,1,0,89,0,1,0,100,1,83,0, + 116,3,160,7,124,1,100,2,161,2,143,24,125,2,124,2, + 160,6,161,0,87,0,2,0,100,1,4,0,4,0,131,3, + 1,0,83,0,49,0,115,114,119,1,1,0,1,0,1,0, + 89,0,1,0,100,1,83,0,41,3,122,39,82,101,116,117, + 114,110,32,116,104,101,32,100,97,116,97,32,102,114,111,109, + 32,112,97,116,104,32,97,115,32,114,97,119,32,98,121,116, + 101,115,46,78,218,1,114,41,8,114,165,0,0,0,114,228, + 0,0,0,218,19,69,120,116,101,110,115,105,111,110,70,105, + 108,101,76,111,97,100,101,114,114,72,0,0,0,90,9,111, + 112,101,110,95,99,111,100,101,114,90,0,0,0,90,4,114, + 101,97,100,114,73,0,0,0,41,3,114,123,0,0,0,114, + 52,0,0,0,114,76,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,234,0,0,0,252,3,0, + 0,115,14,0,0,0,14,2,16,1,42,1,14,2,38,1, + 4,128,255,128,122,19,70,105,108,101,76,111,97,100,101,114, + 46,103,101,116,95,100,97,116,97,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,2,0,0,0,67,0, + 0,0,115,20,0,0,0,100,1,100,2,108,0,109,1,125, + 2,1,0,124,2,124,0,131,1,83,0,41,3,78,114,0, + 0,0,0,41,1,218,10,70,105,108,101,82,101,97,100,101, + 114,41,2,90,17,105,109,112,111,114,116,108,105,98,46,114, + 101,97,100,101,114,115,114,4,1,0,0,41,3,114,123,0, + 0,0,114,223,0,0,0,114,4,1,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,19,103,101,116, + 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, + 5,4,0,0,115,6,0,0,0,12,2,8,1,255,128,122, + 30,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, + 114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,41, + 13,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, + 114,132,0,0,0,114,216,0,0,0,114,250,0,0,0,114, + 254,0,0,0,114,140,0,0,0,114,227,0,0,0,114,183, + 0,0,0,114,234,0,0,0,114,5,1,0,0,90,13,95, + 95,99,108,97,115,115,99,101,108,108,95,95,114,7,0,0, + 0,114,7,0,0,0,114,0,1,0,0,114,8,0,0,0, + 114,246,0,0,0,217,3,0,0,115,26,0,0,0,8,0, + 4,2,8,3,8,6,8,4,2,3,14,1,2,11,10,1, + 8,4,2,9,18,1,255,128,114,246,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,64,0,0,0,115,46,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,100,6,100,7,156,1,100,8,100, + 9,132,2,90,6,100,10,83,0,41,11,218,16,83,111,117, + 114,99,101,70,105,108,101,76,111,97,100,101,114,122,62,67, + 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,32,111,102,32,83,111,117,114,99,101, + 76,111,97,100,101,114,32,117,115,105,110,103,32,116,104,101, + 32,102,105,108,101,32,115,121,115,116,101,109,46,99,2,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,22,0,0,0,116,0,124,1,131, + 1,125,2,124,2,106,1,124,2,106,2,100,1,156,2,83, + 0,41,3,122,33,82,101,116,117,114,110,32,116,104,101,32, + 109,101,116,97,100,97,116,97,32,102,111,114,32,116,104,101, + 32,112,97,116,104,46,41,2,114,173,0,0,0,114,241,0, + 0,0,78,41,3,114,57,0,0,0,218,8,115,116,95,109, + 116,105,109,101,90,7,115,116,95,115,105,122,101,41,3,114, + 123,0,0,0,114,52,0,0,0,114,245,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,231,0, + 0,0,15,4,0,0,115,6,0,0,0,8,2,14,1,255, + 128,122,27,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,0,0,0,0,0,5,0,0,0,5, + 0,0,0,67,0,0,0,115,24,0,0,0,116,0,124,1, + 131,1,125,4,124,0,106,1,124,2,124,3,124,4,100,1, + 141,3,83,0,41,2,78,169,1,218,5,95,109,111,100,101, + 41,2,114,119,0,0,0,114,232,0,0,0,41,5,114,123, + 0,0,0,114,112,0,0,0,114,111,0,0,0,114,37,0, + 0,0,114,60,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,233,0,0,0,20,4,0,0,115, + 6,0,0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,68,0,0, + 0,114,8,1,0,0,99,3,0,0,0,0,0,0,0,1, + 0,0,0,9,0,0,0,11,0,0,0,67,0,0,0,115, + 4,1,0,0,116,0,124,1,131,1,92,2,125,4,125,5, + 103,0,125,6,124,4,114,62,116,1,124,4,131,1,115,62, + 116,0,124,4,131,1,92,2,125,4,125,7,124,6,160,2, + 124,7,161,1,1,0,124,4,114,62,116,1,124,4,131,1, + 114,28,116,3,124,6,131,1,68,0,93,98,125,7,116,4, + 124,4,124,7,131,2,125,4,122,14,116,5,160,6,124,4, + 161,1,1,0,87,0,113,70,4,0,116,7,121,116,1,0, + 1,0,1,0,89,0,113,70,4,0,116,8,144,1,121,2, + 1,0,125,8,1,0,122,30,116,9,160,10,100,1,124,4, + 124,8,161,3,1,0,87,0,89,0,100,2,125,8,126,8, + 1,0,100,2,83,0,100,2,125,8,126,8,119,1,122,30, + 116,11,124,1,124,2,124,3,131,3,1,0,116,9,160,10, + 100,3,124,1,161,2,1,0,87,0,100,2,83,0,4,0, + 116,8,121,252,1,0,125,8,1,0,122,28,116,9,160,10, + 100,1,124,1,124,8,161,3,1,0,87,0,89,0,100,2, + 125,8,126,8,100,2,83,0,100,2,125,8,126,8,119,1, + 119,0,100,2,83,0,119,0,41,4,122,27,87,114,105,116, + 101,32,98,121,116,101,115,32,100,97,116,97,32,116,111,32, + 97,32,102,105,108,101,46,122,27,99,111,117,108,100,32,110, + 111,116,32,99,114,101,97,116,101,32,123,33,114,125,58,32, + 123,33,114,125,78,122,12,99,114,101,97,116,101,100,32,123, + 33,114,125,41,12,114,55,0,0,0,114,64,0,0,0,114, + 190,0,0,0,114,50,0,0,0,114,48,0,0,0,114,18, + 0,0,0,90,5,109,107,100,105,114,218,15,70,105,108,101, + 69,120,105,115,116,115,69,114,114,111,114,114,58,0,0,0, + 114,139,0,0,0,114,153,0,0,0,114,77,0,0,0,41, + 9,114,123,0,0,0,114,52,0,0,0,114,37,0,0,0, + 114,9,1,0,0,218,6,112,97,114,101,110,116,114,101,0, + 0,0,114,47,0,0,0,114,43,0,0,0,114,235,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,250,0,0,0,93,4,0,0,115,8,0,0,0,12,1, - 10,1,2,255,255,128,122,26,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,95,95,101,113, - 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,20,0,0,0, - 116,0,124,0,106,1,131,1,116,0,124,0,106,2,131,1, - 65,0,83,0,114,114,0,0,0,114,251,0,0,0,114,253, + 114,232,0,0,0,25,4,0,0,115,60,0,0,0,12,2, + 4,1,12,2,12,1,10,1,12,254,12,4,10,1,2,1, + 14,1,12,1,4,2,16,1,6,3,4,1,4,255,16,2, + 8,128,2,1,12,1,18,1,14,1,8,2,2,1,18,255, + 8,128,2,254,4,255,2,248,255,128,122,25,83,111,117,114, + 99,101,70,105,108,101,76,111,97,100,101,114,46,115,101,116, + 95,100,97,116,97,78,41,7,114,130,0,0,0,114,129,0, + 0,0,114,131,0,0,0,114,132,0,0,0,114,231,0,0, + 0,114,233,0,0,0,114,232,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 6,1,0,0,11,4,0,0,115,12,0,0,0,8,0,4, + 2,8,2,8,5,18,5,255,128,114,6,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,64,0,0,0,115,32,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,100,6,83,0,41,7,218,20, + 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111, + 97,100,101,114,122,45,76,111,97,100,101,114,32,119,104,105, + 99,104,32,104,97,110,100,108,101,115,32,115,111,117,114,99, + 101,108,101,115,115,32,102,105,108,101,32,105,109,112,111,114, + 116,115,46,99,2,0,0,0,0,0,0,0,0,0,0,0, + 5,0,0,0,5,0,0,0,67,0,0,0,115,68,0,0, + 0,124,0,160,0,124,1,161,1,125,2,124,0,160,1,124, + 2,161,1,125,3,124,1,124,2,100,1,156,2,125,4,116, + 2,124,3,124,1,124,4,131,3,1,0,116,3,116,4,124, + 3,131,1,100,2,100,0,133,2,25,0,124,1,124,2,100, + 3,141,3,83,0,41,4,78,114,163,0,0,0,114,149,0, + 0,0,41,2,114,121,0,0,0,114,111,0,0,0,41,5, + 114,183,0,0,0,114,234,0,0,0,114,156,0,0,0,114, + 169,0,0,0,114,242,0,0,0,41,5,114,123,0,0,0, + 114,143,0,0,0,114,52,0,0,0,114,37,0,0,0,114, + 155,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,220,0,0,0,60,4,0,0,115,24,0,0, + 0,10,1,10,1,2,4,2,1,6,254,12,4,2,1,14, + 1,2,1,2,1,6,253,255,128,122,29,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,39,82,101, + 116,117,114,110,32,78,111,110,101,32,97,115,32,116,104,101, + 114,101,32,105,115,32,110,111,32,115,111,117,114,99,101,32, + 99,111,100,101,46,78,114,7,0,0,0,114,226,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 236,0,0,0,76,4,0,0,115,4,0,0,0,4,2,255, + 128,122,31,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,41,6,114,130,0,0,0,114,129,0,0,0,114, + 131,0,0,0,114,132,0,0,0,114,220,0,0,0,114,236, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,12,1,0,0,56,4,0,0, + 115,10,0,0,0,8,0,4,2,8,2,12,16,255,128,114, + 12,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,64,0,0,0,115,92,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, + 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, + 100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,14, + 100,15,132,0,90,10,100,16,100,17,132,0,90,11,101,12, + 100,18,100,19,132,0,131,1,90,13,100,20,83,0,41,21, + 114,3,1,0,0,122,93,76,111,97,100,101,114,32,102,111, + 114,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, + 108,101,115,46,10,10,32,32,32,32,84,104,101,32,99,111, + 110,115,116,114,117,99,116,111,114,32,105,115,32,100,101,115, + 105,103,110,101,100,32,116,111,32,119,111,114,107,32,119,105, + 116,104,32,70,105,108,101,70,105,110,100,101,114,46,10,10, + 32,32,32,32,99,3,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,2,0,0,0,67,0,0,0,115,16,0, + 0,0,124,1,124,0,95,0,124,2,124,0,95,1,100,0, + 83,0,114,114,0,0,0,114,163,0,0,0,41,3,114,123, + 0,0,0,114,121,0,0,0,114,52,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,216,0,0, + 0,89,4,0,0,115,6,0,0,0,6,1,10,1,255,128, + 122,28,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,0,0,0,0,2,0,0,0,2, + 0,0,0,67,0,0,0,115,24,0,0,0,124,0,106,0, + 124,1,106,0,107,2,111,22,124,0,106,1,124,1,106,1, + 107,2,83,0,114,114,0,0,0,114,247,0,0,0,114,249, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,254,0,0,0,97,4,0,0,115,4,0,0,0, - 20,1,255,128,122,28,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,95,95,104,97,115,104, - 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,5,0,0,0,67,0,0,0,115,36,0,0,0, - 116,0,160,1,116,2,106,3,124,1,161,2,125,2,116,0, - 160,4,100,1,124,1,106,5,124,0,106,6,161,3,1,0, - 124,2,83,0,41,3,122,38,67,114,101,97,116,101,32,97, - 110,32,117,110,105,116,105,97,108,105,122,101,100,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,122,38, + 0,0,114,250,0,0,0,93,4,0,0,115,8,0,0,0, + 12,1,10,1,2,255,255,128,122,26,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95, + 101,113,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,20,0, + 0,0,116,0,124,0,106,1,131,1,116,0,124,0,106,2, + 131,1,65,0,83,0,114,114,0,0,0,114,251,0,0,0, + 114,253,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,254,0,0,0,97,4,0,0,115,4,0, + 0,0,20,1,255,128,122,28,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97, + 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,5,0,0,0,67,0,0,0,115,36,0, + 0,0,116,0,160,1,116,2,106,3,124,1,161,2,125,2, + 116,0,160,4,100,1,124,1,106,5,124,0,106,6,161,3, + 1,0,124,2,83,0,41,3,122,38,67,114,101,97,116,101, + 32,97,110,32,117,110,105,116,105,97,108,105,122,101,100,32, 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,123,33,114,125,32,108,111,97,100,101,100,32,102,114,111, - 109,32,123,33,114,125,78,41,7,114,139,0,0,0,114,221, - 0,0,0,114,167,0,0,0,90,14,99,114,101,97,116,101, - 95,100,121,110,97,109,105,99,114,153,0,0,0,114,121,0, - 0,0,114,52,0,0,0,41,3,114,123,0,0,0,114,191, - 0,0,0,114,223,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,219,0,0,0,100,4,0,0, - 115,16,0,0,0,4,2,6,1,4,255,6,2,8,1,4, - 255,4,2,255,128,122,33,69,120,116,101,110,115,105,111,110, - 70,105,108,101,76,111,97,100,101,114,46,99,114,101,97,116, - 101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,5,0,0,0,67,0,0, - 0,115,36,0,0,0,116,0,160,1,116,2,106,3,124,1, - 161,2,1,0,116,0,160,4,100,1,124,0,106,5,124,0, - 106,6,161,3,1,0,100,2,83,0,41,3,122,30,73,110, - 105,116,105,97,108,105,122,101,32,97,110,32,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,122,40,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,123, - 33,114,125,32,101,120,101,99,117,116,101,100,32,102,114,111, - 109,32,123,33,114,125,78,41,7,114,139,0,0,0,114,221, - 0,0,0,114,167,0,0,0,90,12,101,120,101,99,95,100, - 121,110,97,109,105,99,114,153,0,0,0,114,121,0,0,0, - 114,52,0,0,0,169,2,114,123,0,0,0,114,223,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,224,0,0,0,108,4,0,0,115,10,0,0,0,14,2, - 6,1,8,1,8,255,255,128,122,31,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,101,120, - 101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,4,0,0,0,3,0, - 0,0,115,36,0,0,0,116,0,124,0,106,1,131,1,100, - 1,25,0,137,0,116,2,135,0,102,1,100,2,100,3,132, - 8,116,3,68,0,131,1,131,1,83,0,41,5,122,49,82, - 101,116,117,114,110,32,84,114,117,101,32,105,102,32,116,104, - 101,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,46, - 114,3,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,4,0,0,0,51,0,0,0,115,26, - 0,0,0,124,0,93,18,125,1,136,0,100,0,124,1,23, - 0,107,2,86,0,1,0,113,2,100,1,83,0,41,2,114, - 216,0,0,0,78,114,7,0,0,0,169,2,114,5,0,0, - 0,218,6,115,117,102,102,105,120,169,1,90,9,102,105,108, - 101,95,110,97,109,101,114,7,0,0,0,114,8,0,0,0, - 114,9,0,0,0,117,4,0,0,115,8,0,0,0,4,0, - 2,1,20,255,255,128,122,49,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,111,99,97,108,115,62,46, - 60,103,101,110,101,120,112,114,62,78,41,4,114,55,0,0, - 0,114,52,0,0,0,218,3,97,110,121,114,212,0,0,0, - 114,226,0,0,0,114,7,0,0,0,114,16,1,0,0,114, - 8,0,0,0,114,186,0,0,0,114,4,0,0,115,10,0, - 0,0,14,2,12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, - 122,63,82,101,116,117,114,110,32,78,111,110,101,32,97,115, - 32,97,110,32,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,32,99,97,110,110,111,116,32,99,114,101,97, - 116,101,32,97,32,99,111,100,101,32,111,98,106,101,99,116, - 46,78,114,7,0,0,0,114,226,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,220,0,0,0, - 120,4,0,0,115,4,0,0,0,4,2,255,128,122,28,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,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, - 53,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, + 122,38,101,120,116,101,110,115,105,111,110,32,109,111,100,117, + 108,101,32,123,33,114,125,32,108,111,97,100,101,100,32,102, + 114,111,109,32,123,33,114,125,78,41,7,114,139,0,0,0, + 114,221,0,0,0,114,167,0,0,0,90,14,99,114,101,97, + 116,101,95,100,121,110,97,109,105,99,114,153,0,0,0,114, + 121,0,0,0,114,52,0,0,0,41,3,114,123,0,0,0, + 114,191,0,0,0,114,223,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,219,0,0,0,100,4, + 0,0,115,16,0,0,0,4,2,6,1,4,255,6,2,8, + 1,4,255,4,2,255,128,122,33,69,120,116,101,110,115,105, + 111,110,70,105,108,101,76,111,97,100,101,114,46,99,114,101, + 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,5,0,0,0,67, + 0,0,0,115,36,0,0,0,116,0,160,1,116,2,106,3, + 124,1,161,2,1,0,116,0,160,4,100,1,124,0,106,5, + 124,0,106,6,161,3,1,0,100,2,83,0,41,3,122,30, + 73,110,105,116,105,97,108,105,122,101,32,97,110,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,122,40, 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 115,32,104,97,118,101,32,110,111,32,115,111,117,114,99,101, - 32,99,111,100,101,46,78,114,7,0,0,0,114,226,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,236,0,0,0,124,4,0,0,115,4,0,0,0,4,2, - 255,128,122,30,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,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,6,0,0,0, - 124,0,106,0,83,0,114,1,1,0,0,114,56,0,0,0, - 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,183,0,0,0,128,4,0,0,115,4,0, - 0,0,6,3,255,128,122,32,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, - 102,105,108,101,110,97,109,101,78,41,14,114,130,0,0,0, - 114,129,0,0,0,114,131,0,0,0,114,132,0,0,0,114, - 216,0,0,0,114,250,0,0,0,114,254,0,0,0,114,219, - 0,0,0,114,224,0,0,0,114,186,0,0,0,114,220,0, - 0,0,114,236,0,0,0,114,140,0,0,0,114,183,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,3,1,0,0,81,4,0,0,115,26, - 0,0,0,8,0,4,2,8,6,8,4,8,4,8,3,8, - 8,8,6,8,6,8,4,2,4,14,1,255,128,114,3,1, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,64,0,0,0,115,104,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, - 132,0,90,6,100,8,100,9,132,0,90,7,100,10,100,11, - 132,0,90,8,100,12,100,13,132,0,90,9,100,14,100,15, - 132,0,90,10,100,16,100,17,132,0,90,11,100,18,100,19, - 132,0,90,12,100,20,100,21,132,0,90,13,100,22,100,23, - 132,0,90,14,100,24,83,0,41,25,218,14,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,97,38,1,0,0,82, - 101,112,114,101,115,101,110,116,115,32,97,32,110,97,109,101, - 115,112,97,99,101,32,112,97,99,107,97,103,101,39,115,32, - 112,97,116,104,46,32,32,73,116,32,117,115,101,115,32,116, - 104,101,32,109,111,100,117,108,101,32,110,97,109,101,10,32, - 32,32,32,116,111,32,102,105,110,100,32,105,116,115,32,112, - 97,114,101,110,116,32,109,111,100,117,108,101,44,32,97,110, - 100,32,102,114,111,109,32,116,104,101,114,101,32,105,116,32, - 108,111,111,107,115,32,117,112,32,116,104,101,32,112,97,114, - 101,110,116,39,115,10,32,32,32,32,95,95,112,97,116,104, - 95,95,46,32,32,87,104,101,110,32,116,104,105,115,32,99, - 104,97,110,103,101,115,44,32,116,104,101,32,109,111,100,117, - 108,101,39,115,32,111,119,110,32,112,97,116,104,32,105,115, - 32,114,101,99,111,109,112,117,116,101,100,44,10,32,32,32, - 32,117,115,105,110,103,32,112,97,116,104,95,102,105,110,100, - 101,114,46,32,32,70,111,114,32,116,111,112,45,108,101,118, - 101,108,32,109,111,100,117,108,101,115,44,32,116,104,101,32, - 112,97,114,101,110,116,32,109,111,100,117,108,101,39,115,32, - 112,97,116,104,10,32,32,32,32,105,115,32,115,121,115,46, - 112,97,116,104,46,99,4,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,36, - 0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,116, - 2,124,0,160,3,161,0,131,1,124,0,95,4,124,3,124, - 0,95,5,100,0,83,0,114,114,0,0,0,41,6,218,5, - 95,110,97,109,101,218,5,95,112,97,116,104,114,116,0,0, - 0,218,16,95,103,101,116,95,112,97,114,101,110,116,95,112, - 97,116,104,218,17,95,108,97,115,116,95,112,97,114,101,110, - 116,95,112,97,116,104,218,12,95,112,97,116,104,95,102,105, - 110,100,101,114,169,4,114,123,0,0,0,114,121,0,0,0, - 114,52,0,0,0,90,11,112,97,116,104,95,102,105,110,100, - 101,114,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,216,0,0,0,141,4,0,0,115,10,0,0,0,6, - 1,6,1,14,1,10,1,255,128,122,23,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,0,0,0,0,4, - 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,2, - 125,3,124,2,100,2,107,2,114,30,100,3,83,0,124,1, - 100,4,102,2,83,0,41,6,122,62,82,101,116,117,114,110, - 115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,97, - 114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,101, - 44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,116, - 116,114,45,110,97,109,101,41,114,79,0,0,0,114,10,0, - 0,0,41,2,114,15,0,0,0,114,52,0,0,0,90,8, - 95,95,112,97,116,104,95,95,78,41,2,114,19,1,0,0, - 114,49,0,0,0,41,4,114,123,0,0,0,114,11,1,0, - 0,218,3,100,111,116,90,2,109,101,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,23,95,102,105,110,100, - 95,112,97,114,101,110,116,95,112,97,116,104,95,110,97,109, - 101,115,147,4,0,0,115,10,0,0,0,18,2,8,1,4, - 2,8,3,255,128,122,38,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,101,115,99,1,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, - 0,0,67,0,0,0,115,28,0,0,0,124,0,160,0,161, - 0,92,2,125,1,125,2,116,1,116,2,106,3,124,1,25, - 0,124,2,131,2,83,0,114,114,0,0,0,41,4,114,26, - 1,0,0,114,135,0,0,0,114,15,0,0,0,218,7,109, - 111,100,117,108,101,115,41,3,114,123,0,0,0,90,18,112, - 97,114,101,110,116,95,109,111,100,117,108,101,95,110,97,109, - 101,90,14,112,97,116,104,95,97,116,116,114,95,110,97,109, - 101,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,21,1,0,0,157,4,0,0,115,6,0,0,0,12,1, - 16,1,255,128,122,31,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,0,0, - 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,80, - 0,0,0,116,0,124,0,160,1,161,0,131,1,125,1,124, - 1,124,0,106,2,107,3,114,74,124,0,160,3,124,0,106, - 4,124,1,161,2,125,2,124,2,100,0,117,1,114,68,124, - 2,106,5,100,0,117,0,114,68,124,2,106,6,114,68,124, - 2,106,6,124,0,95,7,124,1,124,0,95,2,124,0,106, - 7,83,0,114,114,0,0,0,41,8,114,116,0,0,0,114, - 21,1,0,0,114,22,1,0,0,114,23,1,0,0,114,19, - 1,0,0,114,144,0,0,0,114,182,0,0,0,114,20,1, - 0,0,41,3,114,123,0,0,0,90,11,112,97,114,101,110, - 116,95,112,97,116,104,114,191,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,12,95,114,101,99, - 97,108,99,117,108,97,116,101,161,4,0,0,115,18,0,0, - 0,12,2,10,1,14,1,18,3,6,1,8,1,6,1,6, - 1,255,128,122,27,95,78,97,109,101,115,112,97,99,101,80, - 97,116,104,46,95,114,101,99,97,108,99,117,108,97,116,101, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,12,0,0,0,116,0, - 124,0,160,1,161,0,131,1,83,0,114,114,0,0,0,41, - 2,218,4,105,116,101,114,114,28,1,0,0,114,253,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,8,95,95,105,116,101,114,95,95,174,4,0,0,115,4, - 0,0,0,12,1,255,128,122,23,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,46,95,95,105,116,101,114,95,95, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,2,0,0,0,67,0,0,0,115,12,0,0,0,124,0, - 160,0,161,0,124,1,25,0,83,0,114,114,0,0,0,169, - 1,114,28,1,0,0,41,2,114,123,0,0,0,218,5,105, - 110,100,101,120,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,11,95,95,103,101,116,105,116,101,109,95,95, - 177,4,0,0,115,4,0,0,0,12,1,255,128,122,26,95, + 32,123,33,114,125,32,101,120,101,99,117,116,101,100,32,102, + 114,111,109,32,123,33,114,125,78,41,7,114,139,0,0,0, + 114,221,0,0,0,114,167,0,0,0,90,12,101,120,101,99, + 95,100,121,110,97,109,105,99,114,153,0,0,0,114,121,0, + 0,0,114,52,0,0,0,169,2,114,123,0,0,0,114,223, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,224,0,0,0,108,4,0,0,115,10,0,0,0, + 14,2,6,1,8,1,8,255,255,128,122,31,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, + 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, + 3,0,0,0,115,36,0,0,0,116,0,124,0,106,1,131, + 1,100,1,25,0,137,0,116,2,135,0,102,1,100,2,100, + 3,132,8,116,3,68,0,131,1,131,1,83,0,41,5,122, + 49,82,101,116,117,114,110,32,84,114,117,101,32,105,102,32, + 116,104,101,32,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,32,105,115,32,97,32,112,97,99,107,97,103, + 101,46,114,3,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,4,0,0,0,51,0,0,0, + 115,26,0,0,0,124,0,93,18,125,1,136,0,100,0,124, + 1,23,0,107,2,86,0,1,0,113,2,100,1,83,0,41, + 2,114,216,0,0,0,78,114,7,0,0,0,169,2,114,5, + 0,0,0,218,6,115,117,102,102,105,120,169,1,90,9,102, + 105,108,101,95,110,97,109,101,114,7,0,0,0,114,8,0, + 0,0,114,9,0,0,0,117,4,0,0,115,8,0,0,0, + 4,0,2,1,20,255,255,128,122,49,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,111,99,97,108,115, + 62,46,60,103,101,110,101,120,112,114,62,78,41,4,114,55, + 0,0,0,114,52,0,0,0,218,3,97,110,121,114,212,0, + 0,0,114,226,0,0,0,114,7,0,0,0,114,16,1,0, + 0,114,8,0,0,0,114,186,0,0,0,114,4,0,0,115, + 10,0,0,0,14,2,12,1,2,1,8,255,255,128,122,30, + 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,0,0,0,0,2,0,0,0,1, + 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, + 41,2,122,63,82,101,116,117,114,110,32,78,111,110,101,32, + 97,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32, + 109,111,100,117,108,101,32,99,97,110,110,111,116,32,99,114, + 101,97,116,101,32,97,32,99,111,100,101,32,111,98,106,101, + 99,116,46,78,114,7,0,0,0,114,226,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,220,0, + 0,0,120,4,0,0,115,4,0,0,0,4,2,255,128,122, + 28,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,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,122,53,82,101,116,117,114,110,32,78,111,110,101,32,97, + 115,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, + 108,101,115,32,104,97,118,101,32,110,111,32,115,111,117,114, + 99,101,32,99,111,100,101,46,78,114,7,0,0,0,114,226, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,236,0,0,0,124,4,0,0,115,4,0,0,0, + 4,2,255,128,122,30,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,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,6,0, + 0,0,124,0,106,0,83,0,114,1,1,0,0,114,56,0, + 0,0,114,226,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,183,0,0,0,128,4,0,0,115, + 4,0,0,0,6,3,255,128,122,32,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,102,105,108,101,110,97,109,101,78,41,14,114,130,0, + 0,0,114,129,0,0,0,114,131,0,0,0,114,132,0,0, + 0,114,216,0,0,0,114,250,0,0,0,114,254,0,0,0, + 114,219,0,0,0,114,224,0,0,0,114,186,0,0,0,114, + 220,0,0,0,114,236,0,0,0,114,140,0,0,0,114,183, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,3,1,0,0,81,4,0,0, + 115,26,0,0,0,8,0,4,2,8,6,8,4,8,4,8, + 3,8,8,8,6,8,6,8,4,2,4,14,1,255,128,114, + 3,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, + 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, + 100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,14, + 100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,18, + 100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,22, + 100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,0, + 0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,97, + 109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,39, + 115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,115, + 32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101, + 10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,115, + 32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,32, + 97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,105, + 116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,112, + 97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,97, + 116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,115, + 32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,111, + 100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,32, + 105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,32, + 32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,105, + 110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,108, + 101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,104, + 101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,39, + 115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,121, + 115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, + 115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,95, + 1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,124, + 3,124,0,95,5,100,0,83,0,114,114,0,0,0,41,6, + 218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,116, + 0,0,0,218,16,95,103,101,116,95,112,97,114,101,110,116, + 95,112,97,116,104,218,17,95,108,97,115,116,95,112,97,114, + 101,110,116,95,112,97,116,104,218,12,95,112,97,116,104,95, + 102,105,110,100,101,114,169,4,114,123,0,0,0,114,121,0, + 0,0,114,52,0,0,0,90,11,112,97,116,104,95,102,105, + 110,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,216,0,0,0,141,4,0,0,115,10,0,0, + 0,6,1,6,1,14,1,10,1,255,128,122,23,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,0,0,0, + 0,4,0,0,0,3,0,0,0,67,0,0,0,115,38,0, + 0,0,124,0,106,0,160,1,100,1,161,1,92,3,125,1, + 125,2,125,3,124,2,100,2,107,2,114,30,100,3,83,0, + 124,1,100,4,102,2,83,0,41,6,122,62,82,101,116,117, + 114,110,115,32,97,32,116,117,112,108,101,32,111,102,32,40, + 112,97,114,101,110,116,45,109,111,100,117,108,101,45,110,97, + 109,101,44,32,112,97,114,101,110,116,45,112,97,116,104,45, + 97,116,116,114,45,110,97,109,101,41,114,79,0,0,0,114, + 10,0,0,0,41,2,114,15,0,0,0,114,52,0,0,0, + 90,8,95,95,112,97,116,104,95,95,78,41,2,114,19,1, + 0,0,114,49,0,0,0,41,4,114,123,0,0,0,114,11, + 1,0,0,218,3,100,111,116,90,2,109,101,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,23,95,102,105, + 110,100,95,112,97,114,101,110,116,95,112,97,116,104,95,110, + 97,109,101,115,147,4,0,0,115,10,0,0,0,18,2,8, + 1,4,2,8,3,255,128,122,38,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,101,115,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,28,0,0,0,124,0,160, + 0,161,0,92,2,125,1,125,2,116,1,116,2,106,3,124, + 1,25,0,124,2,131,2,83,0,114,114,0,0,0,41,4, + 114,26,1,0,0,114,135,0,0,0,114,15,0,0,0,218, + 7,109,111,100,117,108,101,115,41,3,114,123,0,0,0,90, + 18,112,97,114,101,110,116,95,109,111,100,117,108,101,95,110, + 97,109,101,90,14,112,97,116,104,95,97,116,116,114,95,110, + 97,109,101,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,21,1,0,0,157,4,0,0,115,6,0,0,0, + 12,1,16,1,255,128,122,31,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, + 0,0,0,0,3,0,0,0,4,0,0,0,67,0,0,0, + 115,80,0,0,0,116,0,124,0,160,1,161,0,131,1,125, + 1,124,1,124,0,106,2,107,3,114,74,124,0,160,3,124, + 0,106,4,124,1,161,2,125,2,124,2,100,0,117,1,114, + 68,124,2,106,5,100,0,117,0,114,68,124,2,106,6,114, + 68,124,2,106,6,124,0,95,7,124,1,124,0,95,2,124, + 0,106,7,83,0,114,114,0,0,0,41,8,114,116,0,0, + 0,114,21,1,0,0,114,22,1,0,0,114,23,1,0,0, + 114,19,1,0,0,114,144,0,0,0,114,182,0,0,0,114, + 20,1,0,0,41,3,114,123,0,0,0,90,11,112,97,114, + 101,110,116,95,112,97,116,104,114,191,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,12,95,114, + 101,99,97,108,99,117,108,97,116,101,161,4,0,0,115,18, + 0,0,0,12,2,10,1,14,1,18,3,6,1,8,1,6, + 1,6,1,255,128,122,27,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,114,101,99,97,108,99,117,108,97, + 116,101,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, + 116,0,124,0,160,1,161,0,131,1,83,0,114,114,0,0, + 0,41,2,218,4,105,116,101,114,114,28,1,0,0,114,253, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,8,95,95,105,116,101,114,95,95,174,4,0,0, + 115,4,0,0,0,12,1,255,128,122,23,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,105,116,101,114, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,12,0,0,0, + 124,0,160,0,161,0,124,1,25,0,83,0,114,114,0,0, + 0,169,1,114,28,1,0,0,41,2,114,123,0,0,0,218, + 5,105,110,100,101,120,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,11,95,95,103,101,116,105,116,101,109, + 95,95,177,4,0,0,115,4,0,0,0,12,1,255,128,122, + 26,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,95,103,101,116,105,116,101,109,95,95,99,3,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,14,0,0,0,124,2,124,0,106,0,124, + 1,60,0,100,0,83,0,114,114,0,0,0,41,1,114,20, + 1,0,0,41,3,114,123,0,0,0,114,32,1,0,0,114, + 52,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,11,95,95,115,101,116,105,116,101,109,95,95, + 180,4,0,0,115,4,0,0,0,14,1,255,128,122,26,95, 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, - 103,101,116,105,116,101,109,95,95,99,3,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, - 0,0,115,14,0,0,0,124,2,124,0,106,0,124,1,60, - 0,100,0,83,0,114,114,0,0,0,41,1,114,20,1,0, - 0,41,3,114,123,0,0,0,114,32,1,0,0,114,52,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,95,95,115,101,116,105,116,101,109,95,95,180,4, - 0,0,115,4,0,0,0,14,1,255,128,122,26,95,78,97, - 109,101,115,112,97,99,101,80,97,116,104,46,95,95,115,101, - 116,105,116,101,109,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,116,0,124,0,160,1,161,0,131,1,83, - 0,114,114,0,0,0,41,2,114,4,0,0,0,114,28,1, - 0,0,114,253,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,7,95,95,108,101,110,95,95,183, - 4,0,0,115,4,0,0,0,12,1,255,128,122,22,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,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0, - 0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,2, - 78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,40,123,33,114,125,41,41,2,114,70,0,0,0,114,20, - 1,0,0,114,253,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,8,95,95,114,101,112,114,95, - 95,186,4,0,0,115,4,0,0,0,12,1,255,128,122,23, + 115,101,116,105,116,101,109,95,95,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, + 1,83,0,114,114,0,0,0,41,2,114,4,0,0,0,114, + 28,1,0,0,114,253,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,7,95,95,108,101,110,95, + 95,183,4,0,0,115,4,0,0,0,12,1,255,128,122,22, 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, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,124,1,124,0,160,0,161,0,118,0,83, - 0,114,114,0,0,0,114,31,1,0,0,169,2,114,123,0, - 0,0,218,4,105,116,101,109,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,12,95,95,99,111,110,116,97, - 105,110,115,95,95,189,4,0,0,115,4,0,0,0,12,1, - 255,128,122,27,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,0,0,0,0,2,0,0,0, - 3,0,0,0,67,0,0,0,115,16,0,0,0,124,0,106, - 0,160,1,124,1,161,1,1,0,100,0,83,0,114,114,0, - 0,0,41,2,114,20,1,0,0,114,190,0,0,0,114,37, - 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,190,0,0,0,192,4,0,0,115,4,0,0,0, - 16,1,255,128,122,21,95,78,97,109,101,115,112,97,99,101, - 80,97,116,104,46,97,112,112,101,110,100,78,41,15,114,130, - 0,0,0,114,129,0,0,0,114,131,0,0,0,114,132,0, - 0,0,114,216,0,0,0,114,26,1,0,0,114,21,1,0, - 0,114,28,1,0,0,114,30,1,0,0,114,33,1,0,0, - 114,34,1,0,0,114,35,1,0,0,114,36,1,0,0,114, - 39,1,0,0,114,190,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,18,1, - 0,0,134,4,0,0,115,28,0,0,0,8,0,4,1,8, - 6,8,6,8,10,8,4,8,13,8,3,8,3,8,3,8, - 3,8,3,12,3,255,128,114,18,1,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,64,0,0,0,115,80,0,0,0,101,0,90,1,100,0, - 90,2,100,1,100,2,132,0,90,3,101,4,100,3,100,4, - 132,0,131,1,90,5,100,5,100,6,132,0,90,6,100,7, - 100,8,132,0,90,7,100,9,100,10,132,0,90,8,100,11, - 100,12,132,0,90,9,100,13,100,14,132,0,90,10,100,15, - 100,16,132,0,90,11,100,17,83,0,41,18,218,16,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,99,4, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4, - 0,0,0,67,0,0,0,115,18,0,0,0,116,0,124,1, - 124,2,124,3,131,3,124,0,95,1,100,0,83,0,114,114, - 0,0,0,41,2,114,18,1,0,0,114,20,1,0,0,114, - 24,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,216,0,0,0,198,4,0,0,115,4,0,0, - 0,18,1,255,128,122,25,95,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, - 160,0,124,0,106,1,161,1,83,0,41,3,122,115,82,101, - 116,117,114,110,32,114,101,112,114,32,102,111,114,32,116,104, - 101,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, - 32,32,32,84,104,101,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,46,32,32,84,104, - 101,32,105,109,112,111,114,116,32,109,97,99,104,105,110,101, - 114,121,32,100,111,101,115,32,116,104,101,32,106,111,98,32, - 105,116,115,101,108,102,46,10,10,32,32,32,32,32,32,32, - 32,122,25,60,109,111,100,117,108,101,32,123,33,114,125,32, - 40,110,97,109,101,115,112,97,99,101,41,62,78,41,2,114, - 70,0,0,0,114,130,0,0,0,41,1,114,223,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,109,111,100,117,108,101,95,114,101,112,114,201,4,0,0, - 115,4,0,0,0,12,7,255,128,122,28,95,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, - 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,78,84,114,7,0, - 0,0,114,226,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,186,0,0,0,210,4,0,0,115, - 4,0,0,0,4,1,255,128,122,27,95,78,97,109,101,115, - 112,97,99,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,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,78,114,10,0,0,0,114, - 7,0,0,0,114,226,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,236,0,0,0,213,4,0, - 0,115,4,0,0,0,4,1,255,128,122,27,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,103,101,116, - 95,115,111,117,114,99,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,6,0,0,0,67,0,0,0, - 115,16,0,0,0,116,0,100,1,100,2,100,3,100,4,100, - 5,141,4,83,0,41,6,78,114,10,0,0,0,122,8,60, - 115,116,114,105,110,103,62,114,222,0,0,0,84,41,1,114, - 238,0,0,0,41,1,114,239,0,0,0,114,226,0,0,0, + 95,108,101,110,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 12,0,0,0,100,1,160,0,124,0,106,1,161,1,83,0, + 41,2,78,122,20,95,78,97,109,101,115,112,97,99,101,80, + 97,116,104,40,123,33,114,125,41,41,2,114,70,0,0,0, + 114,20,1,0,0,114,253,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,8,95,95,114,101,112, + 114,95,95,186,4,0,0,115,4,0,0,0,12,1,255,128, + 122,23,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,0,0,0,0,2,0,0,0,3,0,0,0,67,0, + 0,0,115,12,0,0,0,124,1,124,0,160,0,161,0,118, + 0,83,0,114,114,0,0,0,114,31,1,0,0,169,2,114, + 123,0,0,0,218,4,105,116,101,109,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,12,95,95,99,111,110, + 116,97,105,110,115,95,95,189,4,0,0,115,4,0,0,0, + 12,1,255,128,122,27,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,0,0,0,0,2,0, + 0,0,3,0,0,0,67,0,0,0,115,16,0,0,0,124, + 0,106,0,160,1,124,1,161,1,1,0,100,0,83,0,114, + 114,0,0,0,41,2,114,20,1,0,0,114,190,0,0,0, + 114,37,1,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,114,190,0,0,0,192,4,0,0,115,4,0, + 0,0,16,1,255,128,122,21,95,78,97,109,101,115,112,97, + 99,101,80,97,116,104,46,97,112,112,101,110,100,78,41,15, + 114,130,0,0,0,114,129,0,0,0,114,131,0,0,0,114, + 132,0,0,0,114,216,0,0,0,114,26,1,0,0,114,21, + 1,0,0,114,28,1,0,0,114,30,1,0,0,114,33,1, + 0,0,114,34,1,0,0,114,35,1,0,0,114,36,1,0, + 0,114,39,1,0,0,114,190,0,0,0,114,7,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 220,0,0,0,216,4,0,0,115,4,0,0,0,16,1,255, - 128,122,25,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,114,217, - 0,0,0,114,7,0,0,0,114,218,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,219,0,0, - 0,219,4,0,0,115,4,0,0,0,4,0,255,128,122,30, + 18,1,0,0,134,4,0,0,115,28,0,0,0,8,0,4, + 1,8,6,8,6,8,10,8,4,8,13,8,3,8,3,8, + 3,8,3,8,3,12,3,255,128,114,18,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,64,0,0,0,115,80,0,0,0,101,0,90,1, + 100,0,90,2,100,1,100,2,132,0,90,3,101,4,100,3, + 100,4,132,0,131,1,90,5,100,5,100,6,132,0,90,6, + 100,7,100,8,132,0,90,7,100,9,100,10,132,0,90,8, + 100,11,100,12,132,0,90,9,100,13,100,14,132,0,90,10, + 100,15,100,16,132,0,90,11,100,17,83,0,41,18,218,16, 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, - 46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,2, + 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,18,0,0,0,116,0, + 124,1,124,2,124,3,131,3,124,0,95,1,100,0,83,0, + 114,114,0,0,0,41,2,114,18,1,0,0,114,20,1,0, + 0,114,24,1,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,216,0,0,0,198,4,0,0,115,4, + 0,0,0,18,1,255,128,122,25,95,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,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, + 100,1,160,0,124,0,106,1,161,1,83,0,41,3,122,115, + 82,101,116,117,114,110,32,114,101,112,114,32,102,111,114,32, + 116,104,101,32,109,111,100,117,108,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,101,32,109,101,116,104,111,100,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, + 84,104,101,32,105,109,112,111,114,116,32,109,97,99,104,105, + 110,101,114,121,32,100,111,101,115,32,116,104,101,32,106,111, + 98,32,105,116,115,101,108,102,46,10,10,32,32,32,32,32, + 32,32,32,122,25,60,109,111,100,117,108,101,32,123,33,114, + 125,32,40,110,97,109,101,115,112,97,99,101,41,62,78,41, + 2,114,70,0,0,0,114,130,0,0,0,41,1,114,223,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,11,109,111,100,117,108,101,95,114,101,112,114,201,4, + 0,0,115,4,0,0,0,12,7,255,128,122,28,95,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,78,84,114, + 7,0,0,0,114,226,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,186,0,0,0,210,4,0, + 0,115,4,0,0,0,4,1,255,128,122,27,95,78,97,109, + 101,115,112,97,99,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, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,78,114,10,0,0, + 0,114,7,0,0,0,114,226,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,236,0,0,0,213, + 4,0,0,115,4,0,0,0,4,1,255,128,122,27,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,103, + 101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,0, + 0,0,115,16,0,0,0,116,0,100,1,100,2,100,3,100, + 4,100,5,141,4,83,0,41,6,78,114,10,0,0,0,122, + 8,60,115,116,114,105,110,103,62,114,222,0,0,0,84,41, + 1,114,238,0,0,0,41,1,114,239,0,0,0,114,226,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,220,0,0,0,216,4,0,0,115,4,0,0,0,16, + 1,255,128,122,25,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,0,83,0, - 114,114,0,0,0,114,7,0,0,0,114,13,1,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,224, - 0,0,0,222,4,0,0,115,4,0,0,0,4,1,255,128, - 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100, - 101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2, + 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, + 114,217,0,0,0,114,7,0,0,0,114,218,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,219, + 0,0,0,219,4,0,0,115,4,0,0,0,4,0,255,128, + 122,30,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,0, + 83,0,114,114,0,0,0,114,7,0,0,0,114,13,1,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,224,0,0,0,222,4,0,0,115,4,0,0,0,4,1, + 255,128,122,28,95,78,97,109,101,115,112,97,99,101,76,111, + 97,100,101,114,46,101,120,101,99,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,67,0,0,0,115,26,0,0,0,116,0, + 160,1,100,1,124,0,106,2,161,2,1,0,116,0,160,3, + 124,0,124,1,161,2,83,0,41,3,122,98,76,111,97,100, + 32,97,32,110,97,109,101,115,112,97,99,101,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, + 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,32,85,115,101,32,101,120, + 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, + 101,97,100,46,10,10,32,32,32,32,32,32,32,32,122,38, + 110,97,109,101,115,112,97,99,101,32,109,111,100,117,108,101, + 32,108,111,97,100,101,100,32,119,105,116,104,32,112,97,116, + 104,32,123,33,114,125,78,41,4,114,139,0,0,0,114,153, + 0,0,0,114,20,1,0,0,114,225,0,0,0,114,226,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,227,0,0,0,225,4,0,0,115,10,0,0,0,6, + 7,4,1,4,255,12,3,255,128,122,28,95,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,41,12,114,130,0,0,0,114, + 129,0,0,0,114,131,0,0,0,114,216,0,0,0,114,213, + 0,0,0,114,41,1,0,0,114,186,0,0,0,114,236,0, + 0,0,114,220,0,0,0,114,219,0,0,0,114,224,0,0, + 0,114,227,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,40,1,0,0,197, + 4,0,0,115,22,0,0,0,8,0,8,1,2,3,10,1, + 8,8,8,3,8,3,8,3,8,3,12,3,255,128,114,40, + 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,64,0,0,0,115,118,0,0, + 0,101,0,90,1,100,0,90,2,100,1,90,3,101,4,100, + 2,100,3,132,0,131,1,90,5,101,4,100,4,100,5,132, + 0,131,1,90,6,101,7,100,6,100,7,132,0,131,1,90, + 8,101,7,100,8,100,9,132,0,131,1,90,9,101,7,100, + 19,100,11,100,12,132,1,131,1,90,10,101,7,100,20,100, + 13,100,14,132,1,131,1,90,11,101,7,100,21,100,15,100, + 16,132,1,131,1,90,12,101,4,100,17,100,18,132,0,131, + 1,90,13,100,10,83,0,41,22,218,10,80,97,116,104,70, + 105,110,100,101,114,122,62,77,101,116,97,32,112,97,116,104, + 32,102,105,110,100,101,114,32,102,111,114,32,115,121,115,46, + 112,97,116,104,32,97,110,100,32,112,97,99,107,97,103,101, + 32,95,95,112,97,116,104,95,95,32,97,116,116,114,105,98, + 117,116,101,115,46,99,0,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,67,0,0,0,115,64, + 0,0,0,116,0,116,1,106,2,160,3,161,0,131,1,68, + 0,93,44,92,2,125,0,125,1,124,1,100,1,117,0,114, + 40,116,1,106,2,124,0,61,0,113,14,116,4,124,1,100, + 2,131,2,114,58,124,1,160,5,161,0,1,0,113,14,100, + 1,83,0,41,3,122,125,67,97,108,108,32,116,104,101,32, + 105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,101, + 115,40,41,32,109,101,116,104,111,100,32,111,110,32,97,108, + 108,32,112,97,116,104,32,101,110,116,114,121,32,102,105,110, + 100,101,114,115,10,32,32,32,32,32,32,32,32,115,116,111, + 114,101,100,32,105,110,32,115,121,115,46,112,97,116,104,95, + 105,109,112,111,114,116,101,114,95,99,97,99,104,101,115,32, + 40,119,104,101,114,101,32,105,109,112,108,101,109,101,110,116, + 101,100,41,46,78,218,17,105,110,118,97,108,105,100,97,116, + 101,95,99,97,99,104,101,115,41,6,218,4,108,105,115,116, + 114,15,0,0,0,218,19,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,218,5,105,116,101,109, + 115,114,133,0,0,0,114,43,1,0,0,41,2,114,121,0, + 0,0,218,6,102,105,110,100,101,114,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,43,1,0,0,244,4, + 0,0,115,16,0,0,0,22,4,8,1,10,1,10,1,8, + 1,2,128,4,252,255,128,122,28,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,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,9,0,0,0,67,0,0,0,115,76, + 0,0,0,116,0,106,1,100,1,117,1,114,28,116,0,106, + 1,115,28,116,2,160,3,100,2,116,4,161,2,1,0,116, + 0,106,1,68,0,93,34,125,1,122,14,124,1,124,0,131, + 1,87,0,2,0,1,0,83,0,4,0,116,5,121,74,1, + 0,1,0,1,0,89,0,113,34,100,1,83,0,119,0,41, + 3,122,46,83,101,97,114,99,104,32,115,121,115,46,112,97, + 116,104,95,104,111,111,107,115,32,102,111,114,32,97,32,102, + 105,110,100,101,114,32,102,111,114,32,39,112,97,116,104,39, + 46,78,122,23,115,121,115,46,112,97,116,104,95,104,111,111, + 107,115,32,105,115,32,101,109,112,116,121,41,6,114,15,0, + 0,0,218,10,112,97,116,104,95,104,111,111,107,115,114,81, + 0,0,0,114,82,0,0,0,114,142,0,0,0,114,122,0, + 0,0,41,2,114,52,0,0,0,90,4,104,111,111,107,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11, + 95,112,97,116,104,95,104,111,111,107,115,254,4,0,0,115, + 20,0,0,0,16,3,12,1,10,1,2,1,14,1,12,1, + 4,1,4,2,2,253,255,128,122,22,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,0,0,0,0,3,0,0, + 0,8,0,0,0,67,0,0,0,115,100,0,0,0,124,1, + 100,1,107,2,114,40,122,12,116,0,160,1,161,0,125,1, + 87,0,110,18,4,0,116,2,121,98,1,0,1,0,1,0, + 89,0,100,2,83,0,122,16,116,3,106,4,124,1,25,0, + 125,2,87,0,124,2,83,0,4,0,116,5,121,96,1,0, + 1,0,1,0,124,0,160,6,124,1,161,1,125,2,124,2, + 116,3,106,4,124,1,60,0,89,0,124,2,83,0,119,0, + 119,0,41,3,122,210,71,101,116,32,116,104,101,32,102,105, + 110,100,101,114,32,102,111,114,32,116,104,101,32,112,97,116, + 104,32,101,110,116,114,121,32,102,114,111,109,32,115,121,115, + 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, + 97,99,104,101,46,10,10,32,32,32,32,32,32,32,32,73, + 102,32,116,104,101,32,112,97,116,104,32,101,110,116,114,121, + 32,105,115,32,110,111,116,32,105,110,32,116,104,101,32,99, + 97,99,104,101,44,32,102,105,110,100,32,116,104,101,32,97, + 112,112,114,111,112,114,105,97,116,101,32,102,105,110,100,101, + 114,10,32,32,32,32,32,32,32,32,97,110,100,32,99,97, + 99,104,101,32,105,116,46,32,73,102,32,110,111,32,102,105, + 110,100,101,114,32,105,115,32,97,118,97,105,108,97,98,108, + 101,44,32,115,116,111,114,101,32,78,111,110,101,46,10,10, + 32,32,32,32,32,32,32,32,114,10,0,0,0,78,41,7, + 114,18,0,0,0,114,63,0,0,0,218,17,70,105,108,101, + 78,111,116,70,111,117,110,100,69,114,114,111,114,114,15,0, + 0,0,114,45,1,0,0,218,8,75,101,121,69,114,114,111, + 114,114,49,1,0,0,41,3,114,202,0,0,0,114,52,0, + 0,0,114,47,1,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,20,95,112,97,116,104,95,105,109, + 112,111,114,116,101,114,95,99,97,99,104,101,11,5,0,0, + 115,30,0,0,0,8,8,2,1,12,1,12,1,6,3,2, + 1,12,1,4,4,12,253,10,1,12,1,4,1,2,253,2, + 250,255,128,122,31,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,99, + 97,99,104,101,99,3,0,0,0,0,0,0,0,0,0,0, + 0,6,0,0,0,4,0,0,0,67,0,0,0,115,82,0, + 0,0,116,0,124,2,100,1,131,2,114,26,124,2,160,1, + 124,1,161,1,92,2,125,3,125,4,110,14,124,2,160,2, + 124,1,161,1,125,3,103,0,125,4,124,3,100,0,117,1, + 114,60,116,3,160,4,124,1,124,3,161,2,83,0,116,3, + 160,5,124,1,100,0,161,2,125,5,124,4,124,5,95,6, + 124,5,83,0,41,2,78,114,141,0,0,0,41,7,114,133, + 0,0,0,114,141,0,0,0,114,210,0,0,0,114,139,0, + 0,0,114,205,0,0,0,114,187,0,0,0,114,182,0,0, + 0,41,6,114,202,0,0,0,114,143,0,0,0,114,47,1, + 0,0,114,144,0,0,0,114,145,0,0,0,114,191,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 218,16,95,108,101,103,97,99,121,95,103,101,116,95,115,112, + 101,99,33,5,0,0,115,20,0,0,0,10,4,16,1,10, + 2,4,1,8,1,12,1,12,1,6,1,4,1,255,128,122, + 27,80,97,116,104,70,105,110,100,101,114,46,95,108,101,103, + 97,99,121,95,103,101,116,95,115,112,101,99,78,99,4,0, + 0,0,0,0,0,0,0,0,0,0,9,0,0,0,5,0, + 0,0,67,0,0,0,115,166,0,0,0,103,0,125,4,124, + 2,68,0,93,134,125,5,116,0,124,5,116,1,116,2,102, + 2,131,2,115,28,113,8,124,0,160,3,124,5,161,1,125, + 6,124,6,100,1,117,1,114,142,116,4,124,6,100,2,131, + 2,114,70,124,6,160,5,124,1,124,3,161,2,125,7,110, + 12,124,0,160,6,124,1,124,6,161,2,125,7,124,7,100, + 1,117,0,114,92,113,8,124,7,106,7,100,1,117,1,114, + 110,124,7,2,0,1,0,83,0,124,7,106,8,125,8,124, + 8,100,1,117,0,114,132,116,9,100,3,131,1,130,1,124, + 4,160,10,124,8,161,1,1,0,113,8,116,11,160,12,124, + 1,100,1,161,2,125,7,124,4,124,7,95,8,124,7,83, + 0,41,4,122,63,70,105,110,100,32,116,104,101,32,108,111, + 97,100,101,114,32,111,114,32,110,97,109,101,115,112,97,99, + 101,95,112,97,116,104,32,102,111,114,32,116,104,105,115,32, + 109,111,100,117,108,101,47,112,97,99,107,97,103,101,32,110, + 97,109,101,46,78,114,207,0,0,0,122,19,115,112,101,99, + 32,109,105,115,115,105,110,103,32,108,111,97,100,101,114,41, + 13,114,165,0,0,0,114,90,0,0,0,218,5,98,121,116, + 101,115,114,52,1,0,0,114,133,0,0,0,114,207,0,0, + 0,114,53,1,0,0,114,144,0,0,0,114,182,0,0,0, + 114,122,0,0,0,114,171,0,0,0,114,139,0,0,0,114, + 187,0,0,0,41,9,114,202,0,0,0,114,143,0,0,0, + 114,52,0,0,0,114,206,0,0,0,218,14,110,97,109,101, + 115,112,97,99,101,95,112,97,116,104,90,5,101,110,116,114, + 121,114,47,1,0,0,114,191,0,0,0,114,145,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 9,95,103,101,116,95,115,112,101,99,48,5,0,0,115,44, + 0,0,0,4,5,8,1,14,1,2,1,10,1,8,1,10, + 1,14,1,12,2,8,1,2,1,10,1,8,1,6,1,8, + 1,8,1,10,5,2,128,12,2,6,1,4,1,255,128,122, + 20,80,97,116,104,70,105,110,100,101,114,46,95,103,101,116, + 95,115,112,101,99,99,4,0,0,0,0,0,0,0,0,0, + 0,0,6,0,0,0,5,0,0,0,67,0,0,0,115,94, + 0,0,0,124,2,100,1,117,0,114,14,116,0,106,1,125, + 2,124,0,160,2,124,1,124,2,124,3,161,3,125,4,124, + 4,100,1,117,0,114,40,100,1,83,0,124,4,106,3,100, + 1,117,0,114,90,124,4,106,4,125,5,124,5,114,86,100, + 1,124,4,95,5,116,6,124,1,124,5,124,0,106,2,131, + 3,124,4,95,4,124,4,83,0,100,1,83,0,124,4,83, + 0,41,2,122,141,84,114,121,32,116,111,32,102,105,110,100, + 32,97,32,115,112,101,99,32,102,111,114,32,39,102,117,108, + 108,110,97,109,101,39,32,111,110,32,115,121,115,46,112,97, + 116,104,32,111,114,32,39,112,97,116,104,39,46,10,10,32, + 32,32,32,32,32,32,32,84,104,101,32,115,101,97,114,99, + 104,32,105,115,32,98,97,115,101,100,32,111,110,32,115,121, + 115,46,112,97,116,104,95,104,111,111,107,115,32,97,110,100, + 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, + 101,114,95,99,97,99,104,101,46,10,32,32,32,32,32,32, + 32,32,78,41,7,114,15,0,0,0,114,52,0,0,0,114, + 56,1,0,0,114,144,0,0,0,114,182,0,0,0,114,185, + 0,0,0,114,18,1,0,0,41,6,114,202,0,0,0,114, + 143,0,0,0,114,52,0,0,0,114,206,0,0,0,114,191, + 0,0,0,114,55,1,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,207,0,0,0,80,5,0,0, + 115,28,0,0,0,8,6,6,1,14,1,8,1,4,1,10, + 1,6,1,4,1,6,3,16,1,4,1,4,2,4,2,255, + 128,122,20,80,97,116,104,70,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,30,0,0,0,124,0,160,0,124,1,124,2,161,2,125, + 3,124,3,100,1,117,0,114,24,100,1,83,0,124,3,106, + 1,83,0,41,2,122,170,102,105,110,100,32,116,104,101,32, + 109,111,100,117,108,101,32,111,110,32,115,121,115,46,112,97, + 116,104,32,111,114,32,39,112,97,116,104,39,32,98,97,115, + 101,100,32,111,110,32,115,121,115,46,112,97,116,104,95,104, + 111,111,107,115,32,97,110,100,10,32,32,32,32,32,32,32, + 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, + 101,114,95,99,97,99,104,101,46,10,10,32,32,32,32,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,78,114,208,0,0,0,114,209,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,210,0,0,0, + 104,5,0,0,115,10,0,0,0,12,8,8,1,4,1,6, + 1,255,128,122,22,80,97,116,104,70,105,110,100,101,114,46, + 102,105,110,100,95,109,111,100,117,108,101,99,0,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0, + 79,0,0,0,115,28,0,0,0,100,1,100,2,108,0,109, + 1,125,2,1,0,124,2,106,2,124,0,105,0,124,1,164, + 1,142,1,83,0,41,4,97,32,1,0,0,10,32,32,32, + 32,32,32,32,32,70,105,110,100,32,100,105,115,116,114,105, + 98,117,116,105,111,110,115,46,10,10,32,32,32,32,32,32, + 32,32,82,101,116,117,114,110,32,97,110,32,105,116,101,114, + 97,98,108,101,32,111,102,32,97,108,108,32,68,105,115,116, + 114,105,98,117,116,105,111,110,32,105,110,115,116,97,110,99, + 101,115,32,99,97,112,97,98,108,101,32,111,102,10,32,32, + 32,32,32,32,32,32,108,111,97,100,105,110,103,32,116,104, + 101,32,109,101,116,97,100,97,116,97,32,102,111,114,32,112, + 97,99,107,97,103,101,115,32,109,97,116,99,104,105,110,103, + 32,96,96,99,111,110,116,101,120,116,46,110,97,109,101,96, + 96,10,32,32,32,32,32,32,32,32,40,111,114,32,97,108, + 108,32,110,97,109,101,115,32,105,102,32,96,96,78,111,110, + 101,96,96,32,105,110,100,105,99,97,116,101,100,41,32,97, + 108,111,110,103,32,116,104,101,32,112,97,116,104,115,32,105, + 110,32,116,104,101,32,108,105,115,116,10,32,32,32,32,32, + 32,32,32,111,102,32,100,105,114,101,99,116,111,114,105,101, + 115,32,96,96,99,111,110,116,101,120,116,46,112,97,116,104, + 96,96,46,10,32,32,32,32,32,32,32,32,114,0,0,0, + 0,41,1,218,18,77,101,116,97,100,97,116,97,80,97,116, + 104,70,105,110,100,101,114,78,41,3,90,18,105,109,112,111, + 114,116,108,105,98,46,109,101,116,97,100,97,116,97,114,57, + 1,0,0,218,18,102,105,110,100,95,100,105,115,116,114,105, + 98,117,116,105,111,110,115,41,3,114,124,0,0,0,114,125, + 0,0,0,114,57,1,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,58,1,0,0,117,5,0,0, + 115,6,0,0,0,12,10,16,1,255,128,122,29,80,97,116, + 104,70,105,110,100,101,114,46,102,105,110,100,95,100,105,115, + 116,114,105,98,117,116,105,111,110,115,41,1,78,41,2,78, + 78,41,1,78,41,14,114,130,0,0,0,114,129,0,0,0, + 114,131,0,0,0,114,132,0,0,0,114,213,0,0,0,114, + 43,1,0,0,114,49,1,0,0,114,214,0,0,0,114,52, + 1,0,0,114,53,1,0,0,114,56,1,0,0,114,207,0, + 0,0,114,210,0,0,0,114,58,1,0,0,114,7,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,42,1,0,0,240,4,0,0,115,38,0,0,0,8,0, + 4,2,2,2,10,1,2,9,10,1,2,12,10,1,2,21, + 10,1,2,14,12,1,2,31,12,1,2,23,12,1,2,12, + 14,1,255,128,114,42,1,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0, + 0,0,115,90,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, + 0,90,5,101,6,90,7,100,6,100,7,132,0,90,8,100, + 8,100,9,132,0,90,9,100,19,100,11,100,12,132,1,90, + 10,100,13,100,14,132,0,90,11,101,12,100,15,100,16,132, + 0,131,1,90,13,100,17,100,18,132,0,90,14,100,10,83, + 0,41,20,218,10,70,105,108,101,70,105,110,100,101,114,122, + 172,70,105,108,101,45,98,97,115,101,100,32,102,105,110,100, + 101,114,46,10,10,32,32,32,32,73,110,116,101,114,97,99, + 116,105,111,110,115,32,119,105,116,104,32,116,104,101,32,102, + 105,108,101,32,115,121,115,116,101,109,32,97,114,101,32,99, + 97,99,104,101,100,32,102,111,114,32,112,101,114,102,111,114, + 109,97,110,99,101,44,32,98,101,105,110,103,10,32,32,32, + 32,114,101,102,114,101,115,104,101,100,32,119,104,101,110,32, + 116,104,101,32,100,105,114,101,99,116,111,114,121,32,116,104, + 101,32,102,105,110,100,101,114,32,105,115,32,104,97,110,100, + 108,105,110,103,32,104,97,115,32,98,101,101,110,32,109,111, + 100,105,102,105,101,100,46,10,10,32,32,32,32,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0, + 0,0,7,0,0,0,115,84,0,0,0,103,0,125,3,124, + 2,68,0,93,32,92,2,137,0,125,4,124,3,160,0,135, + 0,102,1,100,1,100,2,132,8,124,4,68,0,131,1,161, + 1,1,0,113,8,124,3,124,0,95,1,124,1,112,54,100, + 3,124,0,95,2,100,4,124,0,95,3,116,4,131,0,124, + 0,95,5,116,4,131,0,124,0,95,6,100,5,83,0,41, + 6,122,154,73,110,105,116,105,97,108,105,122,101,32,119,105, + 116,104,32,116,104,101,32,112,97,116,104,32,116,111,32,115, + 101,97,114,99,104,32,111,110,32,97,110,100,32,97,32,118, + 97,114,105,97,98,108,101,32,110,117,109,98,101,114,32,111, + 102,10,32,32,32,32,32,32,32,32,50,45,116,117,112,108, + 101,115,32,99,111,110,116,97,105,110,105,110,103,32,116,104, + 101,32,108,111,97,100,101,114,32,97,110,100,32,116,104,101, + 32,102,105,108,101,32,115,117,102,102,105,120,101,115,32,116, + 104,101,32,108,111,97,100,101,114,10,32,32,32,32,32,32, + 32,32,114,101,99,111,103,110,105,122,101,115,46,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,51,0,0,0,115,22,0,0,0,124,0,93,14,125, + 1,124,1,136,0,102,2,86,0,1,0,113,2,100,0,83, + 0,114,114,0,0,0,114,7,0,0,0,114,14,1,0,0, + 169,1,114,144,0,0,0,114,7,0,0,0,114,8,0,0, + 0,114,9,0,0,0,146,5,0,0,115,4,0,0,0,22, + 0,255,128,122,38,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,114,79,0,0,0, + 114,109,0,0,0,78,41,7,114,171,0,0,0,218,8,95, + 108,111,97,100,101,114,115,114,52,0,0,0,218,11,95,112, + 97,116,104,95,109,116,105,109,101,218,3,115,101,116,218,11, + 95,112,97,116,104,95,99,97,99,104,101,218,19,95,114,101, + 108,97,120,101,100,95,112,97,116,104,95,99,97,99,104,101, + 41,5,114,123,0,0,0,114,52,0,0,0,218,14,108,111, + 97,100,101,114,95,100,101,116,97,105,108,115,90,7,108,111, + 97,100,101,114,115,114,193,0,0,0,114,7,0,0,0,114, + 60,1,0,0,114,8,0,0,0,114,216,0,0,0,140,5, + 0,0,115,18,0,0,0,4,4,12,1,26,1,6,1,10, + 2,6,1,8,1,12,1,255,128,122,19,70,105,108,101,70, + 105,110,100,101,114,46,95,95,105,110,105,116,95,95,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, + 0,0,0,67,0,0,0,115,10,0,0,0,100,1,124,0, + 95,0,100,2,83,0,41,3,122,31,73,110,118,97,108,105, + 100,97,116,101,32,116,104,101,32,100,105,114,101,99,116,111, + 114,121,32,109,116,105,109,101,46,114,109,0,0,0,78,41, + 1,114,62,1,0,0,114,253,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,43,1,0,0,154, + 5,0,0,115,4,0,0,0,10,2,255,128,122,28,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,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,42,0,0,0,124,0,160,0,124,1,161,1, + 125,2,124,2,100,1,117,0,114,26,100,1,103,0,102,2, + 83,0,124,2,106,1,124,2,106,2,112,38,103,0,102,2, + 83,0,41,2,122,197,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,44,32,111,114,32,116,104,101,32,110,97,109,101, + 115,112,97,99,101,10,32,32,32,32,32,32,32,32,112,97, + 99,107,97,103,101,32,112,111,114,116,105,111,110,115,46,32, + 82,101,116,117,114,110,115,32,40,108,111,97,100,101,114,44, + 32,108,105,115,116,45,111,102,45,112,111,114,116,105,111,110, + 115,41,46,10,10,32,32,32,32,32,32,32,32,84,104,105, + 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, + 101,99,97,116,101,100,46,32,32,85,115,101,32,102,105,110, + 100,95,115,112,101,99,40,41,32,105,110,115,116,101,97,100, + 46,10,10,32,32,32,32,32,32,32,32,78,41,3,114,207, + 0,0,0,114,144,0,0,0,114,182,0,0,0,41,3,114, + 123,0,0,0,114,143,0,0,0,114,191,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,141,0, + 0,0,160,5,0,0,115,10,0,0,0,10,7,8,1,8, + 1,16,1,255,128,122,22,70,105,108,101,70,105,110,100,101, + 114,46,102,105,110,100,95,108,111,97,100,101,114,99,6,0, + 0,0,0,0,0,0,0,0,0,0,7,0,0,0,6,0, + 0,0,67,0,0,0,115,26,0,0,0,124,1,124,2,124, + 3,131,2,125,6,116,0,124,2,124,3,124,6,124,4,100, + 1,141,4,83,0,41,2,78,114,181,0,0,0,41,1,114, + 194,0,0,0,41,7,114,123,0,0,0,114,192,0,0,0, + 114,143,0,0,0,114,52,0,0,0,90,4,115,109,115,108, + 114,206,0,0,0,114,144,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,56,1,0,0,172,5, + 0,0,115,10,0,0,0,10,1,8,1,2,1,6,255,255, + 128,122,20,70,105,108,101,70,105,110,100,101,114,46,95,103, + 101,116,95,115,112,101,99,78,99,3,0,0,0,0,0,0, + 0,0,0,0,0,14,0,0,0,8,0,0,0,67,0,0, + 0,115,100,1,0,0,100,1,125,3,124,1,160,0,100,2, + 161,1,100,3,25,0,125,4,122,24,116,1,124,0,106,2, + 112,34,116,3,160,4,161,0,131,1,106,5,125,5,87,0, + 110,20,4,0,116,6,144,1,121,98,1,0,1,0,1,0, + 100,4,125,5,89,0,124,5,124,0,106,7,107,3,114,88, + 124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,9, + 131,0,114,110,124,0,106,10,125,6,124,4,160,11,161,0, + 125,7,110,10,124,0,106,12,125,6,124,4,125,7,124,7, + 124,6,118,0,114,214,116,13,124,0,106,2,124,4,131,2, + 125,8,124,0,106,14,68,0,93,58,92,2,125,9,125,10, + 100,5,124,9,23,0,125,11,116,13,124,8,124,11,131,2, + 125,12,116,15,124,12,131,1,114,204,124,0,160,16,124,10, + 124,1,124,12,124,8,103,1,124,2,161,5,2,0,1,0, + 83,0,113,146,116,17,124,8,131,1,125,3,124,0,106,14, + 68,0,93,86,92,2,125,9,125,10,116,13,124,0,106,2, + 124,4,124,9,23,0,131,2,125,12,116,18,106,19,100,6, + 124,12,100,3,100,7,141,3,1,0,124,7,124,9,23,0, + 124,6,118,0,144,1,114,50,116,15,124,12,131,1,144,1, + 114,50,124,0,160,16,124,10,124,1,124,12,100,8,124,2, + 161,5,2,0,1,0,83,0,113,220,124,3,144,1,114,94, + 116,18,160,19,100,9,124,8,161,2,1,0,116,18,160,20, + 124,1,100,8,161,2,125,13,124,8,103,1,124,13,95,21, + 124,13,83,0,100,8,83,0,119,0,41,10,122,111,84,114, + 121,32,116,111,32,102,105,110,100,32,97,32,115,112,101,99, + 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,46,10,10,32,32,32,32, + 32,32,32,32,82,101,116,117,114,110,115,32,116,104,101,32, + 109,97,116,99,104,105,110,103,32,115,112,101,99,44,32,111, + 114,32,78,111,110,101,32,105,102,32,110,111,116,32,102,111, + 117,110,100,46,10,32,32,32,32,32,32,32,32,70,114,79, + 0,0,0,114,39,0,0,0,114,109,0,0,0,114,216,0, + 0,0,122,9,116,114,121,105,110,103,32,123,125,41,1,90, + 9,118,101,114,98,111,115,105,116,121,78,122,25,112,111,115, + 115,105,98,108,101,32,110,97,109,101,115,112,97,99,101,32, + 102,111,114,32,123,125,41,22,114,49,0,0,0,114,57,0, + 0,0,114,52,0,0,0,114,18,0,0,0,114,63,0,0, + 0,114,7,1,0,0,114,58,0,0,0,114,62,1,0,0, + 218,11,95,102,105,108,108,95,99,97,99,104,101,114,21,0, + 0,0,114,65,1,0,0,114,110,0,0,0,114,64,1,0, + 0,114,48,0,0,0,114,61,1,0,0,114,62,0,0,0, + 114,56,1,0,0,114,64,0,0,0,114,139,0,0,0,114, + 153,0,0,0,114,187,0,0,0,114,182,0,0,0,41,14, + 114,123,0,0,0,114,143,0,0,0,114,206,0,0,0,90, + 12,105,115,95,110,97,109,101,115,112,97,99,101,90,11,116, + 97,105,108,95,109,111,100,117,108,101,114,173,0,0,0,90, + 5,99,97,99,104,101,90,12,99,97,99,104,101,95,109,111, + 100,117,108,101,90,9,98,97,115,101,95,112,97,116,104,114, + 15,1,0,0,114,192,0,0,0,90,13,105,110,105,116,95, + 102,105,108,101,110,97,109,101,90,9,102,117,108,108,95,112, + 97,116,104,114,191,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,207,0,0,0,177,5,0,0, + 115,80,0,0,0,4,5,14,1,2,1,24,1,14,1,6, + 1,10,1,8,1,6,1,6,2,6,1,10,1,6,2,4, + 1,8,2,12,1,14,1,8,1,10,1,8,1,24,1,2, + 128,8,4,14,2,16,1,16,1,14,1,10,1,10,1,4, + 1,8,255,2,128,6,2,12,1,12,1,8,1,4,1,4, + 1,2,219,255,128,122,20,70,105,108,101,70,105,110,100,101, + 114,46,102,105,110,100,95,115,112,101,99,99,1,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,10,0,0,0, + 67,0,0,0,115,190,0,0,0,124,0,106,0,125,1,122, + 22,116,1,160,2,124,1,112,22,116,1,160,3,161,0,161, + 1,125,2,87,0,110,24,4,0,116,4,116,5,116,6,102, + 3,121,188,1,0,1,0,1,0,103,0,125,2,89,0,116, + 7,106,8,160,9,100,1,161,1,115,78,116,10,124,2,131, + 1,124,0,95,11,110,74,116,10,131,0,125,3,124,2,68, + 0,93,56,125,4,124,4,160,12,100,2,161,1,92,3,125, + 5,125,6,125,7,124,6,114,130,100,3,160,13,124,5,124, + 7,160,14,161,0,161,2,125,8,110,4,124,5,125,8,124, + 3,160,15,124,8,161,1,1,0,113,88,124,3,124,0,95, + 11,116,7,106,8,160,9,116,16,161,1,114,184,100,4,100, + 5,132,0,124,2,68,0,131,1,124,0,95,17,100,6,83, + 0,100,6,83,0,119,0,41,7,122,68,70,105,108,108,32, + 116,104,101,32,99,97,99,104,101,32,111,102,32,112,111,116, + 101,110,116,105,97,108,32,109,111,100,117,108,101,115,32,97, + 110,100,32,112,97,99,107,97,103,101,115,32,102,111,114,32, + 116,104,105,115,32,100,105,114,101,99,116,111,114,121,46,114, + 14,0,0,0,114,79,0,0,0,114,69,0,0,0,99,1, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,67,0,0,0,115,26,0,0,0,116,0,160,1, - 100,1,124,0,106,2,161,2,1,0,116,0,160,3,124,0, - 124,1,161,2,83,0,41,3,122,98,76,111,97,100,32,97, - 32,110,97,109,101,115,112,97,99,101,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, - 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, - 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99, - 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, - 100,46,10,10,32,32,32,32,32,32,32,32,122,38,110,97, - 109,101,115,112,97,99,101,32,109,111,100,117,108,101,32,108, - 111,97,100,101,100,32,119,105,116,104,32,112,97,116,104,32, - 123,33,114,125,78,41,4,114,139,0,0,0,114,153,0,0, - 0,114,20,1,0,0,114,225,0,0,0,114,226,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 227,0,0,0,225,4,0,0,115,10,0,0,0,6,7,4, - 1,4,255,12,3,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0, - 0,0,114,131,0,0,0,114,216,0,0,0,114,213,0,0, - 0,114,41,1,0,0,114,186,0,0,0,114,236,0,0,0, - 114,220,0,0,0,114,219,0,0,0,114,224,0,0,0,114, - 227,0,0,0,114,7,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,40,1,0,0,197,4,0, - 0,115,22,0,0,0,8,0,8,1,2,3,10,1,8,8, - 8,3,8,3,8,3,8,3,12,3,255,128,114,40,1,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,64,0,0,0,115,118,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,101,4,100,2,100, - 3,132,0,131,1,90,5,101,4,100,4,100,5,132,0,131, - 1,90,6,101,7,100,6,100,7,132,0,131,1,90,8,101, - 7,100,8,100,9,132,0,131,1,90,9,101,7,100,19,100, - 11,100,12,132,1,131,1,90,10,101,7,100,20,100,13,100, - 14,132,1,131,1,90,11,101,7,100,21,100,15,100,16,132, - 1,131,1,90,12,101,4,100,17,100,18,132,0,131,1,90, - 13,100,10,83,0,41,22,218,10,80,97,116,104,70,105,110, - 100,101,114,122,62,77,101,116,97,32,112,97,116,104,32,102, - 105,110,100,101,114,32,102,111,114,32,115,121,115,46,112,97, - 116,104,32,97,110,100,32,112,97,99,107,97,103,101,32,95, - 95,112,97,116,104,95,95,32,97,116,116,114,105,98,117,116, - 101,115,46,99,0,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,4,0,0,0,67,0,0,0,115,64,0,0, - 0,116,0,116,1,106,2,160,3,161,0,131,1,68,0,93, - 44,92,2,125,0,125,1,124,1,100,1,117,0,114,40,116, - 1,106,2,124,0,61,0,113,14,116,4,124,1,100,2,131, - 2,114,14,124,1,160,5,161,0,1,0,113,14,100,1,83, - 0,41,3,122,125,67,97,108,108,32,116,104,101,32,105,110, - 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,40, - 41,32,109,101,116,104,111,100,32,111,110,32,97,108,108,32, - 112,97,116,104,32,101,110,116,114,121,32,102,105,110,100,101, - 114,115,10,32,32,32,32,32,32,32,32,115,116,111,114,101, - 100,32,105,110,32,115,121,115,46,112,97,116,104,95,105,109, - 112,111,114,116,101,114,95,99,97,99,104,101,115,32,40,119, - 104,101,114,101,32,105,109,112,108,101,109,101,110,116,101,100, - 41,46,78,218,17,105,110,118,97,108,105,100,97,116,101,95, - 99,97,99,104,101,115,41,6,218,4,108,105,115,116,114,15, - 0,0,0,218,19,112,97,116,104,95,105,109,112,111,114,116, - 101,114,95,99,97,99,104,101,218,5,105,116,101,109,115,114, - 133,0,0,0,114,43,1,0,0,41,2,114,121,0,0,0, - 218,6,102,105,110,100,101,114,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,43,1,0,0,244,4,0,0, - 115,16,0,0,0,22,4,8,1,10,1,10,1,8,1,2, - 128,4,252,255,128,122,28,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,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,9,0,0,0,67,0,0,0,115,76,0,0, - 0,116,0,106,1,100,1,117,1,114,28,116,0,106,1,115, - 28,116,2,160,3,100,2,116,4,161,2,1,0,116,0,106, - 1,68,0,93,34,125,1,122,14,124,1,124,0,131,1,87, - 0,2,0,1,0,83,0,4,0,116,5,121,74,1,0,1, - 0,1,0,89,0,113,34,100,1,83,0,119,0,41,3,122, - 46,83,101,97,114,99,104,32,115,121,115,46,112,97,116,104, - 95,104,111,111,107,115,32,102,111,114,32,97,32,102,105,110, - 100,101,114,32,102,111,114,32,39,112,97,116,104,39,46,78, - 122,23,115,121,115,46,112,97,116,104,95,104,111,111,107,115, - 32,105,115,32,101,109,112,116,121,41,6,114,15,0,0,0, - 218,10,112,97,116,104,95,104,111,111,107,115,114,81,0,0, - 0,114,82,0,0,0,114,142,0,0,0,114,122,0,0,0, - 41,2,114,52,0,0,0,90,4,104,111,111,107,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,11,95,112, - 97,116,104,95,104,111,111,107,115,254,4,0,0,115,20,0, - 0,0,16,3,12,1,10,1,2,1,14,1,12,1,4,1, - 4,2,2,253,255,128,122,22,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,0,0,0,0,3,0,0,0,8, - 0,0,0,67,0,0,0,115,100,0,0,0,124,1,100,1, - 107,2,114,40,122,12,116,0,160,1,161,0,125,1,87,0, - 110,18,4,0,116,2,121,98,1,0,1,0,1,0,89,0, - 100,2,83,0,122,16,116,3,106,4,124,1,25,0,125,2, - 87,0,124,2,83,0,4,0,116,5,121,96,1,0,1,0, - 1,0,124,0,160,6,124,1,161,1,125,2,124,2,116,3, - 106,4,124,1,60,0,89,0,124,2,83,0,119,0,119,0, - 41,3,122,210,71,101,116,32,116,104,101,32,102,105,110,100, - 101,114,32,102,111,114,32,116,104,101,32,112,97,116,104,32, - 101,110,116,114,121,32,102,114,111,109,32,115,121,115,46,112, - 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, - 104,101,46,10,10,32,32,32,32,32,32,32,32,73,102,32, - 116,104,101,32,112,97,116,104,32,101,110,116,114,121,32,105, - 115,32,110,111,116,32,105,110,32,116,104,101,32,99,97,99, - 104,101,44,32,102,105,110,100,32,116,104,101,32,97,112,112, - 114,111,112,114,105,97,116,101,32,102,105,110,100,101,114,10, - 32,32,32,32,32,32,32,32,97,110,100,32,99,97,99,104, - 101,32,105,116,46,32,73,102,32,110,111,32,102,105,110,100, - 101,114,32,105,115,32,97,118,97,105,108,97,98,108,101,44, - 32,115,116,111,114,101,32,78,111,110,101,46,10,10,32,32, - 32,32,32,32,32,32,114,10,0,0,0,78,41,7,114,18, - 0,0,0,114,63,0,0,0,218,17,70,105,108,101,78,111, - 116,70,111,117,110,100,69,114,114,111,114,114,15,0,0,0, - 114,45,1,0,0,218,8,75,101,121,69,114,114,111,114,114, - 49,1,0,0,41,3,114,202,0,0,0,114,52,0,0,0, - 114,47,1,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,20,95,112,97,116,104,95,105,109,112,111, - 114,116,101,114,95,99,97,99,104,101,11,5,0,0,115,30, - 0,0,0,8,8,2,1,12,1,12,1,6,3,2,1,12, - 1,4,4,12,253,10,1,12,1,4,1,2,253,2,250,255, - 128,122,31,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,99,97,99, - 104,101,99,3,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,4,0,0,0,67,0,0,0,115,82,0,0,0, - 116,0,124,2,100,1,131,2,114,26,124,2,160,1,124,1, - 161,1,92,2,125,3,125,4,110,14,124,2,160,2,124,1, - 161,1,125,3,103,0,125,4,124,3,100,0,117,1,114,60, - 116,3,160,4,124,1,124,3,161,2,83,0,116,3,160,5, - 124,1,100,0,161,2,125,5,124,4,124,5,95,6,124,5, - 83,0,41,2,78,114,141,0,0,0,41,7,114,133,0,0, - 0,114,141,0,0,0,114,210,0,0,0,114,139,0,0,0, - 114,205,0,0,0,114,187,0,0,0,114,182,0,0,0,41, - 6,114,202,0,0,0,114,143,0,0,0,114,47,1,0,0, - 114,144,0,0,0,114,145,0,0,0,114,191,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,16, - 95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99, - 33,5,0,0,115,20,0,0,0,10,4,16,1,10,2,4, - 1,8,1,12,1,12,1,6,1,4,1,255,128,122,27,80, - 97,116,104,70,105,110,100,101,114,46,95,108,101,103,97,99, - 121,95,103,101,116,95,115,112,101,99,78,99,4,0,0,0, - 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, - 67,0,0,0,115,166,0,0,0,103,0,125,4,124,2,68, - 0,93,134,125,5,116,0,124,5,116,1,116,2,102,2,131, - 2,115,28,113,8,124,0,160,3,124,5,161,1,125,6,124, - 6,100,1,117,1,114,8,116,4,124,6,100,2,131,2,114, - 70,124,6,160,5,124,1,124,3,161,2,125,7,110,12,124, - 0,160,6,124,1,124,6,161,2,125,7,124,7,100,1,117, - 0,114,92,113,8,124,7,106,7,100,1,117,1,114,110,124, - 7,2,0,1,0,83,0,124,7,106,8,125,8,124,8,100, - 1,117,0,114,132,116,9,100,3,131,1,130,1,124,4,160, - 10,124,8,161,1,1,0,113,8,116,11,160,12,124,1,100, - 1,161,2,125,7,124,4,124,7,95,8,124,7,83,0,41, - 4,122,63,70,105,110,100,32,116,104,101,32,108,111,97,100, - 101,114,32,111,114,32,110,97,109,101,115,112,97,99,101,95, - 112,97,116,104,32,102,111,114,32,116,104,105,115,32,109,111, - 100,117,108,101,47,112,97,99,107,97,103,101,32,110,97,109, - 101,46,78,114,207,0,0,0,122,19,115,112,101,99,32,109, - 105,115,115,105,110,103,32,108,111,97,100,101,114,41,13,114, - 165,0,0,0,114,90,0,0,0,218,5,98,121,116,101,115, - 114,52,1,0,0,114,133,0,0,0,114,207,0,0,0,114, - 53,1,0,0,114,144,0,0,0,114,182,0,0,0,114,122, - 0,0,0,114,171,0,0,0,114,139,0,0,0,114,187,0, - 0,0,41,9,114,202,0,0,0,114,143,0,0,0,114,52, - 0,0,0,114,206,0,0,0,218,14,110,97,109,101,115,112, - 97,99,101,95,112,97,116,104,90,5,101,110,116,114,121,114, - 47,1,0,0,114,191,0,0,0,114,145,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,9,95, - 103,101,116,95,115,112,101,99,48,5,0,0,115,44,0,0, - 0,4,5,8,1,14,1,2,1,10,1,8,1,10,1,14, - 1,12,2,8,1,2,1,10,1,8,1,6,1,8,1,8, - 1,10,5,2,128,12,2,6,1,4,1,255,128,122,20,80, - 97,116,104,70,105,110,100,101,114,46,95,103,101,116,95,115, - 112,101,99,99,4,0,0,0,0,0,0,0,0,0,0,0, - 6,0,0,0,5,0,0,0,67,0,0,0,115,94,0,0, - 0,124,2,100,1,117,0,114,14,116,0,106,1,125,2,124, - 0,160,2,124,1,124,2,124,3,161,3,125,4,124,4,100, - 1,117,0,114,40,100,1,83,0,124,4,106,3,100,1,117, - 0,114,90,124,4,106,4,125,5,124,5,114,86,100,1,124, - 4,95,5,116,6,124,1,124,5,124,0,106,2,131,3,124, - 4,95,4,124,4,83,0,100,1,83,0,124,4,83,0,41, - 2,122,141,84,114,121,32,116,111,32,102,105,110,100,32,97, - 32,115,112,101,99,32,102,111,114,32,39,102,117,108,108,110, - 97,109,101,39,32,111,110,32,115,121,115,46,112,97,116,104, - 32,111,114,32,39,112,97,116,104,39,46,10,10,32,32,32, - 32,32,32,32,32,84,104,101,32,115,101,97,114,99,104,32, - 105,115,32,98,97,115,101,100,32,111,110,32,115,121,115,46, - 112,97,116,104,95,104,111,111,107,115,32,97,110,100,32,115, - 121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114, - 95,99,97,99,104,101,46,10,32,32,32,32,32,32,32,32, - 78,41,7,114,15,0,0,0,114,52,0,0,0,114,56,1, - 0,0,114,144,0,0,0,114,182,0,0,0,114,185,0,0, - 0,114,18,1,0,0,41,6,114,202,0,0,0,114,143,0, - 0,0,114,52,0,0,0,114,206,0,0,0,114,191,0,0, - 0,114,55,1,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,207,0,0,0,80,5,0,0,115,28, - 0,0,0,8,6,6,1,14,1,8,1,4,1,10,1,6, - 1,4,1,6,3,16,1,4,1,4,2,4,2,255,128,122, - 20,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, - 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,30, - 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, - 3,100,1,117,0,114,24,100,1,83,0,124,3,106,1,83, - 0,41,2,122,170,102,105,110,100,32,116,104,101,32,109,111, - 100,117,108,101,32,111,110,32,115,121,115,46,112,97,116,104, - 32,111,114,32,39,112,97,116,104,39,32,98,97,115,101,100, - 32,111,110,32,115,121,115,46,112,97,116,104,95,104,111,111, - 107,115,32,97,110,100,10,32,32,32,32,32,32,32,32,115, - 121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114, - 95,99,97,99,104,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, - 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, - 114,208,0,0,0,114,209,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,210,0,0,0,104,5, - 0,0,115,10,0,0,0,12,8,8,1,4,1,6,1,255, - 128,122,22,80,97,116,104,70,105,110,100,101,114,46,102,105, - 110,100,95,109,111,100,117,108,101,99,0,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,4,0,0,0,79,0, - 0,0,115,28,0,0,0,100,1,100,2,108,0,109,1,125, - 2,1,0,124,2,106,2,124,0,105,0,124,1,164,1,142, - 1,83,0,41,4,97,32,1,0,0,10,32,32,32,32,32, - 32,32,32,70,105,110,100,32,100,105,115,116,114,105,98,117, - 116,105,111,110,115,46,10,10,32,32,32,32,32,32,32,32, - 82,101,116,117,114,110,32,97,110,32,105,116,101,114,97,98, - 108,101,32,111,102,32,97,108,108,32,68,105,115,116,114,105, - 98,117,116,105,111,110,32,105,110,115,116,97,110,99,101,115, - 32,99,97,112,97,98,108,101,32,111,102,10,32,32,32,32, - 32,32,32,32,108,111,97,100,105,110,103,32,116,104,101,32, - 109,101,116,97,100,97,116,97,32,102,111,114,32,112,97,99, - 107,97,103,101,115,32,109,97,116,99,104,105,110,103,32,96, - 96,99,111,110,116,101,120,116,46,110,97,109,101,96,96,10, - 32,32,32,32,32,32,32,32,40,111,114,32,97,108,108,32, - 110,97,109,101,115,32,105,102,32,96,96,78,111,110,101,96, - 96,32,105,110,100,105,99,97,116,101,100,41,32,97,108,111, - 110,103,32,116,104,101,32,112,97,116,104,115,32,105,110,32, - 116,104,101,32,108,105,115,116,10,32,32,32,32,32,32,32, - 32,111,102,32,100,105,114,101,99,116,111,114,105,101,115,32, - 96,96,99,111,110,116,101,120,116,46,112,97,116,104,96,96, - 46,10,32,32,32,32,32,32,32,32,114,0,0,0,0,41, - 1,218,18,77,101,116,97,100,97,116,97,80,97,116,104,70, - 105,110,100,101,114,78,41,3,90,18,105,109,112,111,114,116, - 108,105,98,46,109,101,116,97,100,97,116,97,114,57,1,0, - 0,218,18,102,105,110,100,95,100,105,115,116,114,105,98,117, - 116,105,111,110,115,41,3,114,124,0,0,0,114,125,0,0, - 0,114,57,1,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,58,1,0,0,117,5,0,0,115,6, - 0,0,0,12,10,16,1,255,128,122,29,80,97,116,104,70, - 105,110,100,101,114,46,102,105,110,100,95,100,105,115,116,114, - 105,98,117,116,105,111,110,115,41,1,78,41,2,78,78,41, - 1,78,41,14,114,130,0,0,0,114,129,0,0,0,114,131, - 0,0,0,114,132,0,0,0,114,213,0,0,0,114,43,1, - 0,0,114,49,1,0,0,114,214,0,0,0,114,52,1,0, - 0,114,53,1,0,0,114,56,1,0,0,114,207,0,0,0, - 114,210,0,0,0,114,58,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,42, - 1,0,0,240,4,0,0,115,38,0,0,0,8,0,4,2, - 2,2,10,1,2,9,10,1,2,12,10,1,2,21,10,1, - 2,14,12,1,2,31,12,1,2,23,12,1,2,12,14,1, - 255,128,114,42,1,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,64,0,0,0, - 115,90,0,0,0,101,0,90,1,100,0,90,2,100,1,90, - 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, - 5,101,6,90,7,100,6,100,7,132,0,90,8,100,8,100, - 9,132,0,90,9,100,19,100,11,100,12,132,1,90,10,100, - 13,100,14,132,0,90,11,101,12,100,15,100,16,132,0,131, - 1,90,13,100,17,100,18,132,0,90,14,100,10,83,0,41, - 20,218,10,70,105,108,101,70,105,110,100,101,114,122,172,70, - 105,108,101,45,98,97,115,101,100,32,102,105,110,100,101,114, - 46,10,10,32,32,32,32,73,110,116,101,114,97,99,116,105, - 111,110,115,32,119,105,116,104,32,116,104,101,32,102,105,108, - 101,32,115,121,115,116,101,109,32,97,114,101,32,99,97,99, - 104,101,100,32,102,111,114,32,112,101,114,102,111,114,109,97, - 110,99,101,44,32,98,101,105,110,103,10,32,32,32,32,114, - 101,102,114,101,115,104,101,100,32,119,104,101,110,32,116,104, - 101,32,100,105,114,101,99,116,111,114,121,32,116,104,101,32, - 102,105,110,100,101,114,32,105,115,32,104,97,110,100,108,105, - 110,103,32,104,97,115,32,98,101,101,110,32,109,111,100,105, - 102,105,101,100,46,10,10,32,32,32,32,99,2,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0, - 7,0,0,0,115,84,0,0,0,103,0,125,3,124,2,68, - 0,93,32,92,2,137,0,125,4,124,3,160,0,135,0,102, - 1,100,1,100,2,132,8,124,4,68,0,131,1,161,1,1, - 0,113,8,124,3,124,0,95,1,124,1,112,54,100,3,124, - 0,95,2,100,4,124,0,95,3,116,4,131,0,124,0,95, - 5,116,4,131,0,124,0,95,6,100,5,83,0,41,6,122, - 154,73,110,105,116,105,97,108,105,122,101,32,119,105,116,104, - 32,116,104,101,32,112,97,116,104,32,116,111,32,115,101,97, - 114,99,104,32,111,110,32,97,110,100,32,97,32,118,97,114, - 105,97,98,108,101,32,110,117,109,98,101,114,32,111,102,10, - 32,32,32,32,32,32,32,32,50,45,116,117,112,108,101,115, - 32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32, - 108,111,97,100,101,114,32,97,110,100,32,116,104,101,32,102, - 105,108,101,32,115,117,102,102,105,120,101,115,32,116,104,101, - 32,108,111,97,100,101,114,10,32,32,32,32,32,32,32,32, - 114,101,99,111,103,110,105,122,101,115,46,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 51,0,0,0,115,22,0,0,0,124,0,93,14,125,1,124, - 1,136,0,102,2,86,0,1,0,113,2,100,0,83,0,114, - 114,0,0,0,114,7,0,0,0,114,14,1,0,0,169,1, - 114,144,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 9,0,0,0,146,5,0,0,115,4,0,0,0,22,0,255, - 128,122,38,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,114,79,0,0,0,114,109, - 0,0,0,78,41,7,114,171,0,0,0,218,8,95,108,111, - 97,100,101,114,115,114,52,0,0,0,218,11,95,112,97,116, - 104,95,109,116,105,109,101,218,3,115,101,116,218,11,95,112, - 97,116,104,95,99,97,99,104,101,218,19,95,114,101,108,97, - 120,101,100,95,112,97,116,104,95,99,97,99,104,101,41,5, - 114,123,0,0,0,114,52,0,0,0,218,14,108,111,97,100, - 101,114,95,100,101,116,97,105,108,115,90,7,108,111,97,100, - 101,114,115,114,193,0,0,0,114,7,0,0,0,114,60,1, - 0,0,114,8,0,0,0,114,216,0,0,0,140,5,0,0, - 115,18,0,0,0,4,4,12,1,26,1,6,1,10,2,6, - 1,8,1,12,1,255,128,122,19,70,105,108,101,70,105,110, - 100,101,114,46,95,95,105,110,105,116,95,95,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, - 0,67,0,0,0,115,10,0,0,0,100,1,124,0,95,0, - 100,2,83,0,41,3,122,31,73,110,118,97,108,105,100,97, - 116,101,32,116,104,101,32,100,105,114,101,99,116,111,114,121, - 32,109,116,105,109,101,46,114,109,0,0,0,78,41,1,114, - 62,1,0,0,114,253,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,43,1,0,0,154,5,0, - 0,115,4,0,0,0,10,2,255,128,122,28,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,0,0,0, - 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, - 0,115,42,0,0,0,124,0,160,0,124,1,161,1,125,2, - 124,2,100,1,117,0,114,26,100,1,103,0,102,2,83,0, - 124,2,106,1,124,2,106,2,112,38,103,0,102,2,83,0, - 41,2,122,197,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,44,32,111,114,32,116,104,101,32,110,97,109,101,115,112, - 97,99,101,10,32,32,32,32,32,32,32,32,112,97,99,107, - 97,103,101,32,112,111,114,116,105,111,110,115,46,32,82,101, - 116,117,114,110,115,32,40,108,111,97,100,101,114,44,32,108, - 105,115,116,45,111,102,45,112,111,114,116,105,111,110,115,41, - 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,85,115,101,32,102,105,110,100,95, - 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, - 10,32,32,32,32,32,32,32,32,78,41,3,114,207,0,0, - 0,114,144,0,0,0,114,182,0,0,0,41,3,114,123,0, - 0,0,114,143,0,0,0,114,191,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,141,0,0,0, - 160,5,0,0,115,10,0,0,0,10,7,8,1,8,1,16, - 1,255,128,122,22,70,105,108,101,70,105,110,100,101,114,46, - 102,105,110,100,95,108,111,97,100,101,114,99,6,0,0,0, - 0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0, - 67,0,0,0,115,26,0,0,0,124,1,124,2,124,3,131, - 2,125,6,116,0,124,2,124,3,124,6,124,4,100,1,141, - 4,83,0,41,2,78,114,181,0,0,0,41,1,114,194,0, - 0,0,41,7,114,123,0,0,0,114,192,0,0,0,114,143, - 0,0,0,114,52,0,0,0,90,4,115,109,115,108,114,206, - 0,0,0,114,144,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,56,1,0,0,172,5,0,0, - 115,10,0,0,0,10,1,8,1,2,1,6,255,255,128,122, - 20,70,105,108,101,70,105,110,100,101,114,46,95,103,101,116, - 95,115,112,101,99,78,99,3,0,0,0,0,0,0,0,0, - 0,0,0,14,0,0,0,8,0,0,0,67,0,0,0,115, - 92,1,0,0,100,1,125,3,124,1,160,0,100,2,161,1, - 100,3,25,0,125,4,122,24,116,1,124,0,106,2,112,34, - 116,3,160,4,161,0,131,1,106,5,125,5,87,0,110,20, - 4,0,116,6,144,1,121,90,1,0,1,0,1,0,100,4, - 125,5,89,0,124,5,124,0,106,7,107,3,114,88,124,0, - 160,8,161,0,1,0,124,5,124,0,95,7,116,9,131,0, - 114,110,124,0,106,10,125,6,124,4,160,11,161,0,125,7, - 110,10,124,0,106,12,125,6,124,4,125,7,124,7,124,6, - 118,0,114,212,116,13,124,0,106,2,124,4,131,2,125,8, - 124,0,106,14,68,0,93,56,92,2,125,9,125,10,100,5, - 124,9,23,0,125,11,116,13,124,8,124,11,131,2,125,12, - 116,15,124,12,131,1,114,146,124,0,160,16,124,10,124,1, - 124,12,124,8,103,1,124,2,161,5,2,0,1,0,83,0, - 116,17,124,8,131,1,125,3,124,0,106,14,68,0,93,80, - 92,2,125,9,125,10,116,13,124,0,106,2,124,4,124,9, - 23,0,131,2,125,12,116,18,106,19,100,6,124,12,100,3, - 100,7,141,3,1,0,124,7,124,9,23,0,124,6,118,0, - 114,218,116,15,124,12,131,1,114,218,124,0,160,16,124,10, - 124,1,124,12,100,8,124,2,161,5,2,0,1,0,83,0, - 124,3,144,1,114,86,116,18,160,19,100,9,124,8,161,2, - 1,0,116,18,160,20,124,1,100,8,161,2,125,13,124,8, - 103,1,124,13,95,21,124,13,83,0,100,8,83,0,119,0, - 41,10,122,111,84,114,121,32,116,111,32,102,105,110,100,32, - 97,32,115,112,101,99,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,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 115,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115, - 112,101,99,44,32,111,114,32,78,111,110,101,32,105,102,32, - 110,111,116,32,102,111,117,110,100,46,10,32,32,32,32,32, - 32,32,32,70,114,79,0,0,0,114,39,0,0,0,114,109, - 0,0,0,114,216,0,0,0,122,9,116,114,121,105,110,103, - 32,123,125,41,1,90,9,118,101,114,98,111,115,105,116,121, - 78,122,25,112,111,115,115,105,98,108,101,32,110,97,109,101, - 115,112,97,99,101,32,102,111,114,32,123,125,41,22,114,49, - 0,0,0,114,57,0,0,0,114,52,0,0,0,114,18,0, - 0,0,114,63,0,0,0,114,7,1,0,0,114,58,0,0, - 0,114,62,1,0,0,218,11,95,102,105,108,108,95,99,97, - 99,104,101,114,21,0,0,0,114,65,1,0,0,114,110,0, - 0,0,114,64,1,0,0,114,48,0,0,0,114,61,1,0, - 0,114,62,0,0,0,114,56,1,0,0,114,64,0,0,0, - 114,139,0,0,0,114,153,0,0,0,114,187,0,0,0,114, - 182,0,0,0,41,14,114,123,0,0,0,114,143,0,0,0, - 114,206,0,0,0,90,12,105,115,95,110,97,109,101,115,112, - 97,99,101,90,11,116,97,105,108,95,109,111,100,117,108,101, - 114,173,0,0,0,90,5,99,97,99,104,101,90,12,99,97, - 99,104,101,95,109,111,100,117,108,101,90,9,98,97,115,101, - 95,112,97,116,104,114,15,1,0,0,114,192,0,0,0,90, - 13,105,110,105,116,95,102,105,108,101,110,97,109,101,90,9, - 102,117,108,108,95,112,97,116,104,114,191,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,207,0, - 0,0,177,5,0,0,115,76,0,0,0,4,5,14,1,2, - 1,24,1,14,1,6,1,10,1,8,1,6,1,6,2,6, - 1,10,1,6,2,4,1,8,2,12,1,14,1,8,1,10, - 1,8,1,24,1,8,4,14,2,16,1,16,1,12,1,8, - 1,10,1,4,1,8,255,6,2,12,1,12,1,8,1,4, - 1,4,1,2,219,255,128,122,20,70,105,108,101,70,105,110, - 100,101,114,46,102,105,110,100,95,115,112,101,99,99,1,0, - 0,0,0,0,0,0,0,0,0,0,9,0,0,0,10,0, - 0,0,67,0,0,0,115,190,0,0,0,124,0,106,0,125, - 1,122,22,116,1,160,2,124,1,112,22,116,1,160,3,161, - 0,161,1,125,2,87,0,110,24,4,0,116,4,116,5,116, - 6,102,3,121,188,1,0,1,0,1,0,103,0,125,2,89, - 0,116,7,106,8,160,9,100,1,161,1,115,78,116,10,124, - 2,131,1,124,0,95,11,110,74,116,10,131,0,125,3,124, - 2,68,0,93,56,125,4,124,4,160,12,100,2,161,1,92, - 3,125,5,125,6,125,7,124,6,114,130,100,3,160,13,124, - 5,124,7,160,14,161,0,161,2,125,8,110,4,124,5,125, - 8,124,3,160,15,124,8,161,1,1,0,113,88,124,3,124, - 0,95,11,116,7,106,8,160,9,116,16,161,1,114,184,100, - 4,100,5,132,0,124,2,68,0,131,1,124,0,95,17,100, - 6,83,0,100,6,83,0,119,0,41,7,122,68,70,105,108, - 108,32,116,104,101,32,99,97,99,104,101,32,111,102,32,112, - 111,116,101,110,116,105,97,108,32,109,111,100,117,108,101,115, - 32,97,110,100,32,112,97,99,107,97,103,101,115,32,102,111, - 114,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121, - 46,114,14,0,0,0,114,79,0,0,0,114,69,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,4,0,0,0,83,0,0,0,115,20,0,0,0,104,0, - 124,0,93,12,125,1,124,1,160,0,161,0,146,2,113,4, - 83,0,114,7,0,0,0,41,1,114,110,0,0,0,41,2, - 114,5,0,0,0,90,2,102,110,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,13,0,0,0,254,5,0, - 0,115,4,0,0,0,20,0,255,128,122,41,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,115,101,116, - 99,111,109,112,62,78,41,18,114,52,0,0,0,114,18,0, - 0,0,90,7,108,105,115,116,100,105,114,114,63,0,0,0, - 114,50,1,0,0,218,15,80,101,114,109,105,115,115,105,111, - 110,69,114,114,111,114,218,18,78,111,116,65,68,105,114,101, - 99,116,111,114,121,69,114,114,111,114,114,15,0,0,0,114, - 22,0,0,0,114,23,0,0,0,114,63,1,0,0,114,64, - 1,0,0,114,105,0,0,0,114,70,0,0,0,114,110,0, - 0,0,218,3,97,100,100,114,24,0,0,0,114,65,1,0, - 0,41,9,114,123,0,0,0,114,52,0,0,0,90,8,99, - 111,110,116,101,110,116,115,90,21,108,111,119,101,114,95,115, - 117,102,102,105,120,95,99,111,110,116,101,110,116,115,114,38, - 1,0,0,114,121,0,0,0,114,25,1,0,0,114,15,1, - 0,0,90,8,110,101,119,95,110,97,109,101,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,67,1,0,0, - 225,5,0,0,115,40,0,0,0,6,2,2,1,22,1,18, - 1,6,3,12,3,12,1,6,7,8,1,16,1,4,1,18, - 1,4,2,12,1,6,1,12,1,20,1,4,255,2,233,255, - 128,122,22,70,105,108,101,70,105,110,100,101,114,46,95,102, - 105,108,108,95,99,97,99,104,101,99,1,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,3,0,0,0,7,0, - 0,0,115,18,0,0,0,135,0,135,1,102,2,100,1,100, - 2,132,8,125,2,124,2,83,0,41,4,97,20,1,0,0, - 65,32,99,108,97,115,115,32,109,101,116,104,111,100,32,119, - 104,105,99,104,32,114,101,116,117,114,110,115,32,97,32,99, - 108,111,115,117,114,101,32,116,111,32,117,115,101,32,111,110, - 32,115,121,115,46,112,97,116,104,95,104,111,111,107,10,32, - 32,32,32,32,32,32,32,119,104,105,99,104,32,119,105,108, - 108,32,114,101,116,117,114,110,32,97,110,32,105,110,115,116, - 97,110,99,101,32,117,115,105,110,103,32,116,104,101,32,115, - 112,101,99,105,102,105,101,100,32,108,111,97,100,101,114,115, - 32,97,110,100,32,116,104,101,32,112,97,116,104,10,32,32, - 32,32,32,32,32,32,99,97,108,108,101,100,32,111,110,32, - 116,104,101,32,99,108,111,115,117,114,101,46,10,10,32,32, - 32,32,32,32,32,32,73,102,32,116,104,101,32,112,97,116, - 104,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32, - 99,108,111,115,117,114,101,32,105,115,32,110,111,116,32,97, - 32,100,105,114,101,99,116,111,114,121,44,32,73,109,112,111, - 114,116,69,114,114,111,114,32,105,115,10,32,32,32,32,32, - 32,32,32,114,97,105,115,101,100,46,10,10,32,32,32,32, - 32,32,32,32,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,4,0,0,0,19,0,0,0,115,36,0, - 0,0,116,0,124,0,131,1,115,20,116,1,100,1,124,0, - 100,2,141,2,130,1,136,0,124,0,103,1,136,1,162,1, - 82,0,142,0,83,0,41,4,122,45,80,97,116,104,32,104, - 111,111,107,32,102,111,114,32,105,109,112,111,114,116,108,105, - 98,46,109,97,99,104,105,110,101,114,121,46,70,105,108,101, - 70,105,110,100,101,114,46,122,30,111,110,108,121,32,100,105, - 114,101,99,116,111,114,105,101,115,32,97,114,101,32,115,117, - 112,112,111,114,116,101,100,114,56,0,0,0,78,41,2,114, - 64,0,0,0,114,122,0,0,0,114,56,0,0,0,169,2, - 114,202,0,0,0,114,66,1,0,0,114,7,0,0,0,114, - 8,0,0,0,218,24,112,97,116,104,95,104,111,111,107,95, - 102,111,114,95,70,105,108,101,70,105,110,100,101,114,10,6, - 0,0,115,8,0,0,0,8,2,12,1,16,1,255,128,122, - 54,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,107,95,102,111,114,95,70,105,108, - 101,70,105,110,100,101,114,78,114,7,0,0,0,41,3,114, - 202,0,0,0,114,66,1,0,0,114,72,1,0,0,114,7, - 0,0,0,114,71,1,0,0,114,8,0,0,0,218,9,112, - 97,116,104,95,104,111,111,107,0,6,0,0,115,6,0,0, - 0,14,10,4,6,255,128,122,20,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,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,12,0,0,0,100,1,160,0,124, - 0,106,1,161,1,83,0,41,2,78,122,16,70,105,108,101, - 70,105,110,100,101,114,40,123,33,114,125,41,41,2,114,70, - 0,0,0,114,52,0,0,0,114,253,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,36,1,0, - 0,18,6,0,0,115,4,0,0,0,12,1,255,128,122,19, - 70,105,108,101,70,105,110,100,101,114,46,95,95,114,101,112, - 114,95,95,41,1,78,41,15,114,130,0,0,0,114,129,0, - 0,0,114,131,0,0,0,114,132,0,0,0,114,216,0,0, - 0,114,43,1,0,0,114,147,0,0,0,114,210,0,0,0, - 114,141,0,0,0,114,56,1,0,0,114,207,0,0,0,114, - 67,1,0,0,114,214,0,0,0,114,73,1,0,0,114,36, - 1,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,59,1,0,0,131,5,0,0, - 115,26,0,0,0,8,0,4,2,8,7,8,14,4,4,8, - 2,8,12,10,5,8,48,2,31,10,1,12,17,255,128,114, - 59,1,0,0,99,4,0,0,0,0,0,0,0,0,0,0, - 0,6,0,0,0,8,0,0,0,67,0,0,0,115,148,0, - 0,0,124,0,160,0,100,1,161,1,125,4,124,0,160,0, - 100,2,161,1,125,5,124,4,115,66,124,5,114,36,124,5, - 106,1,125,4,110,30,124,2,124,3,107,2,114,56,116,2, - 124,1,124,2,131,2,125,4,110,10,116,3,124,1,124,2, - 131,2,125,4,124,5,115,84,116,4,124,1,124,2,124,4, - 100,3,141,3,125,5,122,38,124,5,124,0,100,2,60,0, - 124,4,124,0,100,1,60,0,124,2,124,0,100,4,60,0, - 124,3,124,0,100,5,60,0,87,0,100,0,83,0,4,0, - 116,5,121,142,1,0,1,0,1,0,89,0,100,0,83,0, - 119,0,100,0,83,0,41,6,78,218,10,95,95,108,111,97, - 100,101,114,95,95,218,8,95,95,115,112,101,99,95,95,114, - 60,1,0,0,90,8,95,95,102,105,108,101,95,95,90,10, - 95,95,99,97,99,104,101,100,95,95,41,6,218,3,103,101, - 116,114,144,0,0,0,114,12,1,0,0,114,6,1,0,0, - 114,194,0,0,0,218,9,69,120,99,101,112,116,105,111,110, - 41,6,90,2,110,115,114,121,0,0,0,90,8,112,97,116, - 104,110,97,109,101,90,9,99,112,97,116,104,110,97,109,101, - 114,144,0,0,0,114,191,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,14,95,102,105,120,95, - 117,112,95,109,111,100,117,108,101,24,6,0,0,115,40,0, - 0,0,10,2,10,1,4,1,4,1,8,1,8,1,12,1, - 10,2,4,1,14,1,2,1,8,1,8,1,8,1,14,1, - 12,1,6,2,2,254,4,255,255,128,114,78,1,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,38,0,0,0,116,0,116, - 1,160,2,161,0,102,2,125,0,116,3,116,4,102,2,125, - 1,116,5,116,6,102,2,125,2,124,0,124,1,124,2,103, - 3,83,0,41,2,122,95,82,101,116,117,114,110,115,32,97, - 32,108,105,115,116,32,111,102,32,102,105,108,101,45,98,97, - 115,101,100,32,109,111,100,117,108,101,32,108,111,97,100,101, - 114,115,46,10,10,32,32,32,32,69,97,99,104,32,105,116, - 101,109,32,105,115,32,97,32,116,117,112,108,101,32,40,108, - 111,97,100,101,114,44,32,115,117,102,102,105,120,101,115,41, - 46,10,32,32,32,32,78,41,7,114,3,1,0,0,114,167, - 0,0,0,218,18,101,120,116,101,110,115,105,111,110,95,115, - 117,102,102,105,120,101,115,114,6,1,0,0,114,106,0,0, - 0,114,12,1,0,0,114,94,0,0,0,41,3,90,10,101, - 120,116,101,110,115,105,111,110,115,90,6,115,111,117,114,99, - 101,90,8,98,121,116,101,99,111,100,101,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,188,0,0,0,47, - 6,0,0,115,10,0,0,0,12,5,8,1,8,1,10,1, - 255,128,114,188,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,0,67,0,0,0, - 115,8,0,0,0,124,0,97,0,100,0,83,0,114,114,0, - 0,0,41,1,114,139,0,0,0,41,1,218,17,95,98,111, - 111,116,115,116,114,97,112,95,109,111,100,117,108,101,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,21,95, - 115,101,116,95,98,111,111,116,115,116,114,97,112,95,109,111, - 100,117,108,101,58,6,0,0,115,4,0,0,0,8,2,255, - 128,114,81,1,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, - 50,0,0,0,116,0,124,0,131,1,1,0,116,1,131,0, - 125,1,116,2,106,3,160,4,116,5,106,6,124,1,142,0, - 103,1,161,1,1,0,116,2,106,7,160,8,116,9,161,1, - 1,0,100,1,83,0,41,2,122,41,73,110,115,116,97,108, - 108,32,116,104,101,32,112,97,116,104,45,98,97,115,101,100, - 32,105,109,112,111,114,116,32,99,111,109,112,111,110,101,110, - 116,115,46,78,41,10,114,81,1,0,0,114,188,0,0,0, - 114,15,0,0,0,114,48,1,0,0,114,171,0,0,0,114, - 59,1,0,0,114,73,1,0,0,218,9,109,101,116,97,95, - 112,97,116,104,114,190,0,0,0,114,42,1,0,0,41,2, - 114,80,1,0,0,90,17,115,117,112,112,111,114,116,101,100, - 95,108,111,97,100,101,114,115,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,8,95,105,110,115,116,97,108, - 108,63,6,0,0,115,10,0,0,0,8,2,6,1,20,1, - 16,1,255,128,114,83,1,0,0,41,1,114,68,0,0,0, - 41,1,78,41,3,78,78,78,41,2,114,0,0,0,0,114, - 0,0,0,0,41,1,84,41,1,78,41,1,78,41,83,114, - 132,0,0,0,114,139,0,0,0,114,167,0,0,0,114,72, - 0,0,0,114,15,0,0,0,114,81,0,0,0,114,164,0, - 0,0,114,22,0,0,0,114,211,0,0,0,90,2,110,116, - 114,18,0,0,0,114,196,0,0,0,90,5,112,111,115,105, - 120,114,42,0,0,0,218,3,97,108,108,114,45,0,0,0, - 114,46,0,0,0,114,66,0,0,0,114,25,0,0,0,90, - 37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, - 86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,84, - 69,83,95,75,69,89,114,24,0,0,0,114,26,0,0,0, - 114,21,0,0,0,114,33,0,0,0,114,38,0,0,0,114, - 40,0,0,0,114,48,0,0,0,114,55,0,0,0,114,57, - 0,0,0,114,61,0,0,0,114,62,0,0,0,114,64,0, - 0,0,114,67,0,0,0,114,77,0,0,0,218,4,116,121, - 112,101,218,8,95,95,99,111,100,101,95,95,114,166,0,0, - 0,114,31,0,0,0,114,152,0,0,0,114,30,0,0,0, - 114,35,0,0,0,114,243,0,0,0,114,97,0,0,0,114, - 93,0,0,0,114,106,0,0,0,114,190,0,0,0,114,79, - 1,0,0,114,212,0,0,0,114,94,0,0,0,90,23,68, - 69,66,85,71,95,66,89,84,69,67,79,68,69,95,83,85, - 70,70,73,88,69,83,90,27,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,114,102,0,0,0,114,107,0,0,0,114,113,0, - 0,0,114,117,0,0,0,114,119,0,0,0,114,140,0,0, - 0,114,147,0,0,0,114,156,0,0,0,114,160,0,0,0, - 114,162,0,0,0,114,169,0,0,0,114,174,0,0,0,114, - 175,0,0,0,114,180,0,0,0,218,6,111,98,106,101,99, - 116,114,189,0,0,0,114,194,0,0,0,114,195,0,0,0, - 114,215,0,0,0,114,228,0,0,0,114,246,0,0,0,114, - 6,1,0,0,114,12,1,0,0,114,3,1,0,0,114,18, - 1,0,0,114,40,1,0,0,114,42,1,0,0,114,59,1, - 0,0,114,78,1,0,0,114,188,0,0,0,114,81,1,0, - 0,114,83,1,0,0,114,7,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,8,60,109,111,100, - 117,108,101,62,1,0,0,0,115,172,0,0,0,4,0,4, - 22,8,3,8,1,8,1,8,1,8,1,10,3,4,1,8, - 1,10,1,8,2,4,3,10,1,6,2,22,2,8,1,10, - 1,14,1,4,4,4,1,2,1,2,1,4,255,8,4,6, - 16,8,3,8,5,8,5,8,6,8,6,8,12,8,10,8, - 9,8,5,8,7,10,9,10,22,0,127,16,24,12,1,4, - 2,4,1,6,2,6,1,10,1,8,2,6,2,8,2,16, - 2,8,71,8,40,8,19,8,12,8,12,8,31,8,17,8, - 33,8,28,10,24,10,13,10,10,8,11,6,14,4,3,2, - 1,12,255,14,68,14,64,16,30,0,127,14,17,18,50,18, - 45,18,25,14,53,14,63,14,43,0,127,14,20,0,127,10, - 22,8,23,8,11,12,5,255,128, + 0,0,0,83,0,0,0,115,20,0,0,0,104,0,124,0, + 93,12,125,1,124,1,160,0,161,0,146,2,113,4,83,0, + 114,7,0,0,0,41,1,114,110,0,0,0,41,2,114,5, + 0,0,0,90,2,102,110,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,13,0,0,0,254,5,0,0,115, + 4,0,0,0,20,0,255,128,122,41,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,115,101,116,99,111, + 109,112,62,78,41,18,114,52,0,0,0,114,18,0,0,0, + 90,7,108,105,115,116,100,105,114,114,63,0,0,0,114,50, + 1,0,0,218,15,80,101,114,109,105,115,115,105,111,110,69, + 114,114,111,114,218,18,78,111,116,65,68,105,114,101,99,116, + 111,114,121,69,114,114,111,114,114,15,0,0,0,114,22,0, + 0,0,114,23,0,0,0,114,63,1,0,0,114,64,1,0, + 0,114,105,0,0,0,114,70,0,0,0,114,110,0,0,0, + 218,3,97,100,100,114,24,0,0,0,114,65,1,0,0,41, + 9,114,123,0,0,0,114,52,0,0,0,90,8,99,111,110, + 116,101,110,116,115,90,21,108,111,119,101,114,95,115,117,102, + 102,105,120,95,99,111,110,116,101,110,116,115,114,38,1,0, + 0,114,121,0,0,0,114,25,1,0,0,114,15,1,0,0, + 90,8,110,101,119,95,110,97,109,101,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,67,1,0,0,225,5, + 0,0,115,40,0,0,0,6,2,2,1,22,1,18,1,6, + 3,12,3,12,1,6,7,8,1,16,1,4,1,18,1,4, + 2,12,1,6,1,12,1,20,1,4,255,2,233,255,128,122, + 22,70,105,108,101,70,105,110,100,101,114,46,95,102,105,108, + 108,95,99,97,99,104,101,99,1,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,7,0,0,0, + 115,18,0,0,0,135,0,135,1,102,2,100,1,100,2,132, + 8,125,2,124,2,83,0,41,4,97,20,1,0,0,65,32, + 99,108,97,115,115,32,109,101,116,104,111,100,32,119,104,105, + 99,104,32,114,101,116,117,114,110,115,32,97,32,99,108,111, + 115,117,114,101,32,116,111,32,117,115,101,32,111,110,32,115, + 121,115,46,112,97,116,104,95,104,111,111,107,10,32,32,32, + 32,32,32,32,32,119,104,105,99,104,32,119,105,108,108,32, + 114,101,116,117,114,110,32,97,110,32,105,110,115,116,97,110, + 99,101,32,117,115,105,110,103,32,116,104,101,32,115,112,101, + 99,105,102,105,101,100,32,108,111,97,100,101,114,115,32,97, + 110,100,32,116,104,101,32,112,97,116,104,10,32,32,32,32, + 32,32,32,32,99,97,108,108,101,100,32,111,110,32,116,104, + 101,32,99,108,111,115,117,114,101,46,10,10,32,32,32,32, + 32,32,32,32,73,102,32,116,104,101,32,112,97,116,104,32, + 99,97,108,108,101,100,32,111,110,32,116,104,101,32,99,108, + 111,115,117,114,101,32,105,115,32,110,111,116,32,97,32,100, + 105,114,101,99,116,111,114,121,44,32,73,109,112,111,114,116, + 69,114,114,111,114,32,105,115,10,32,32,32,32,32,32,32, + 32,114,97,105,115,101,100,46,10,10,32,32,32,32,32,32, + 32,32,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,4,0,0,0,19,0,0,0,115,36,0,0,0, + 116,0,124,0,131,1,115,20,116,1,100,1,124,0,100,2, + 141,2,130,1,136,0,124,0,103,1,136,1,162,1,82,0, + 142,0,83,0,41,4,122,45,80,97,116,104,32,104,111,111, + 107,32,102,111,114,32,105,109,112,111,114,116,108,105,98,46, + 109,97,99,104,105,110,101,114,121,46,70,105,108,101,70,105, + 110,100,101,114,46,122,30,111,110,108,121,32,100,105,114,101, + 99,116,111,114,105,101,115,32,97,114,101,32,115,117,112,112, + 111,114,116,101,100,114,56,0,0,0,78,41,2,114,64,0, + 0,0,114,122,0,0,0,114,56,0,0,0,169,2,114,202, + 0,0,0,114,66,1,0,0,114,7,0,0,0,114,8,0, + 0,0,218,24,112,97,116,104,95,104,111,111,107,95,102,111, + 114,95,70,105,108,101,70,105,110,100,101,114,10,6,0,0, + 115,8,0,0,0,8,2,12,1,16,1,255,128,122,54,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,107,95,102,111,114,95,70,105,108,101,70, + 105,110,100,101,114,78,114,7,0,0,0,41,3,114,202,0, + 0,0,114,66,1,0,0,114,72,1,0,0,114,7,0,0, + 0,114,71,1,0,0,114,8,0,0,0,218,9,112,97,116, + 104,95,104,111,111,107,0,6,0,0,115,6,0,0,0,14, + 10,4,6,255,128,122,20,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,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,12,0,0,0,100,1,160,0,124,0,106, + 1,161,1,83,0,41,2,78,122,16,70,105,108,101,70,105, + 110,100,101,114,40,123,33,114,125,41,41,2,114,70,0,0, + 0,114,52,0,0,0,114,253,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,36,1,0,0,18, + 6,0,0,115,4,0,0,0,12,1,255,128,122,19,70,105, + 108,101,70,105,110,100,101,114,46,95,95,114,101,112,114,95, + 95,41,1,78,41,15,114,130,0,0,0,114,129,0,0,0, + 114,131,0,0,0,114,132,0,0,0,114,216,0,0,0,114, + 43,1,0,0,114,147,0,0,0,114,210,0,0,0,114,141, + 0,0,0,114,56,1,0,0,114,207,0,0,0,114,67,1, + 0,0,114,214,0,0,0,114,73,1,0,0,114,36,1,0, + 0,114,7,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,59,1,0,0,131,5,0,0,115,26, + 0,0,0,8,0,4,2,8,7,8,14,4,4,8,2,8, + 12,10,5,8,48,2,31,10,1,12,17,255,128,114,59,1, + 0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,8,0,0,0,67,0,0,0,115,148,0,0,0, + 124,0,160,0,100,1,161,1,125,4,124,0,160,0,100,2, + 161,1,125,5,124,4,115,66,124,5,114,36,124,5,106,1, + 125,4,110,30,124,2,124,3,107,2,114,56,116,2,124,1, + 124,2,131,2,125,4,110,10,116,3,124,1,124,2,131,2, + 125,4,124,5,115,84,116,4,124,1,124,2,124,4,100,3, + 141,3,125,5,122,38,124,5,124,0,100,2,60,0,124,4, + 124,0,100,1,60,0,124,2,124,0,100,4,60,0,124,3, + 124,0,100,5,60,0,87,0,100,0,83,0,4,0,116,5, + 121,142,1,0,1,0,1,0,89,0,100,0,83,0,119,0, + 100,0,83,0,41,6,78,218,10,95,95,108,111,97,100,101, + 114,95,95,218,8,95,95,115,112,101,99,95,95,114,60,1, + 0,0,90,8,95,95,102,105,108,101,95,95,90,10,95,95, + 99,97,99,104,101,100,95,95,41,6,218,3,103,101,116,114, + 144,0,0,0,114,12,1,0,0,114,6,1,0,0,114,194, + 0,0,0,218,9,69,120,99,101,112,116,105,111,110,41,6, + 90,2,110,115,114,121,0,0,0,90,8,112,97,116,104,110, + 97,109,101,90,9,99,112,97,116,104,110,97,109,101,114,144, + 0,0,0,114,191,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,14,95,102,105,120,95,117,112, + 95,109,111,100,117,108,101,24,6,0,0,115,40,0,0,0, + 10,2,10,1,4,1,4,1,8,1,8,1,12,1,10,2, + 4,1,14,1,2,1,8,1,8,1,8,1,14,1,12,1, + 6,2,2,254,4,255,255,128,114,78,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,38,0,0,0,116,0,116,1,160, + 2,161,0,102,2,125,0,116,3,116,4,102,2,125,1,116, + 5,116,6,102,2,125,2,124,0,124,1,124,2,103,3,83, + 0,41,2,122,95,82,101,116,117,114,110,115,32,97,32,108, + 105,115,116,32,111,102,32,102,105,108,101,45,98,97,115,101, + 100,32,109,111,100,117,108,101,32,108,111,97,100,101,114,115, + 46,10,10,32,32,32,32,69,97,99,104,32,105,116,101,109, + 32,105,115,32,97,32,116,117,112,108,101,32,40,108,111,97, + 100,101,114,44,32,115,117,102,102,105,120,101,115,41,46,10, + 32,32,32,32,78,41,7,114,3,1,0,0,114,167,0,0, + 0,218,18,101,120,116,101,110,115,105,111,110,95,115,117,102, + 102,105,120,101,115,114,6,1,0,0,114,106,0,0,0,114, + 12,1,0,0,114,94,0,0,0,41,3,90,10,101,120,116, + 101,110,115,105,111,110,115,90,6,115,111,117,114,99,101,90, + 8,98,121,116,101,99,111,100,101,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,188,0,0,0,47,6,0, + 0,115,10,0,0,0,12,5,8,1,8,1,10,1,255,128, + 114,188,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,8, + 0,0,0,124,0,97,0,100,0,83,0,114,114,0,0,0, + 41,1,114,139,0,0,0,41,1,218,17,95,98,111,111,116, + 115,116,114,97,112,95,109,111,100,117,108,101,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,21,95,115,101, + 116,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, + 108,101,58,6,0,0,115,4,0,0,0,8,2,255,128,114, + 81,1,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,4,0,0,0,67,0,0,0,115,50,0, + 0,0,116,0,124,0,131,1,1,0,116,1,131,0,125,1, + 116,2,106,3,160,4,116,5,106,6,124,1,142,0,103,1, + 161,1,1,0,116,2,106,7,160,8,116,9,161,1,1,0, + 100,1,83,0,41,2,122,41,73,110,115,116,97,108,108,32, + 116,104,101,32,112,97,116,104,45,98,97,115,101,100,32,105, + 109,112,111,114,116,32,99,111,109,112,111,110,101,110,116,115, + 46,78,41,10,114,81,1,0,0,114,188,0,0,0,114,15, + 0,0,0,114,48,1,0,0,114,171,0,0,0,114,59,1, + 0,0,114,73,1,0,0,218,9,109,101,116,97,95,112,97, + 116,104,114,190,0,0,0,114,42,1,0,0,41,2,114,80, + 1,0,0,90,17,115,117,112,112,111,114,116,101,100,95,108, + 111,97,100,101,114,115,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,8,95,105,110,115,116,97,108,108,63, + 6,0,0,115,10,0,0,0,8,2,6,1,20,1,16,1, + 255,128,114,83,1,0,0,41,1,114,68,0,0,0,41,1, + 78,41,3,78,78,78,41,2,114,0,0,0,0,114,0,0, + 0,0,41,1,84,41,1,78,41,1,78,41,83,114,132,0, + 0,0,114,139,0,0,0,114,167,0,0,0,114,72,0,0, + 0,114,15,0,0,0,114,81,0,0,0,114,164,0,0,0, + 114,22,0,0,0,114,211,0,0,0,90,2,110,116,114,18, + 0,0,0,114,196,0,0,0,90,5,112,111,115,105,120,114, + 42,0,0,0,218,3,97,108,108,114,45,0,0,0,114,46, + 0,0,0,114,66,0,0,0,114,25,0,0,0,90,37,95, + 67,65,83,69,95,73,78,83,69,78,83,73,84,73,86,69, + 95,80,76,65,84,70,79,82,77,83,95,66,89,84,69,83, + 95,75,69,89,114,24,0,0,0,114,26,0,0,0,114,21, + 0,0,0,114,33,0,0,0,114,38,0,0,0,114,40,0, + 0,0,114,48,0,0,0,114,55,0,0,0,114,57,0,0, + 0,114,61,0,0,0,114,62,0,0,0,114,64,0,0,0, + 114,67,0,0,0,114,77,0,0,0,218,4,116,121,112,101, + 218,8,95,95,99,111,100,101,95,95,114,166,0,0,0,114, + 31,0,0,0,114,152,0,0,0,114,30,0,0,0,114,35, + 0,0,0,114,243,0,0,0,114,97,0,0,0,114,93,0, + 0,0,114,106,0,0,0,114,190,0,0,0,114,79,1,0, + 0,114,212,0,0,0,114,94,0,0,0,90,23,68,69,66, + 85,71,95,66,89,84,69,67,79,68,69,95,83,85,70,70, + 73,88,69,83,90,27,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,114,102,0,0,0,114,107,0,0,0,114,113,0,0,0, + 114,117,0,0,0,114,119,0,0,0,114,140,0,0,0,114, + 147,0,0,0,114,156,0,0,0,114,160,0,0,0,114,162, + 0,0,0,114,169,0,0,0,114,174,0,0,0,114,175,0, + 0,0,114,180,0,0,0,218,6,111,98,106,101,99,116,114, + 189,0,0,0,114,194,0,0,0,114,195,0,0,0,114,215, + 0,0,0,114,228,0,0,0,114,246,0,0,0,114,6,1, + 0,0,114,12,1,0,0,114,3,1,0,0,114,18,1,0, + 0,114,40,1,0,0,114,42,1,0,0,114,59,1,0,0, + 114,78,1,0,0,114,188,0,0,0,114,81,1,0,0,114, + 83,1,0,0,114,7,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,8,60,109,111,100,117,108, + 101,62,1,0,0,0,115,172,0,0,0,4,0,4,22,8, + 3,8,1,8,1,8,1,8,1,10,3,4,1,8,1,10, + 1,8,2,4,3,10,1,6,2,22,2,8,1,10,1,14, + 1,4,4,4,1,2,1,2,1,4,255,8,4,6,16,8, + 3,8,5,8,5,8,6,8,6,8,12,8,10,8,9,8, + 5,8,7,10,9,10,22,0,127,16,24,12,1,4,2,4, + 1,6,2,6,1,10,1,8,2,6,2,8,2,16,2,8, + 71,8,40,8,19,8,12,8,12,8,31,8,17,8,33,8, + 28,10,24,10,13,10,10,8,11,6,14,4,3,2,1,12, + 255,14,68,14,64,16,30,0,127,14,17,18,50,18,45,18, + 25,14,53,14,63,14,43,0,127,14,20,0,127,10,22,8, + 23,8,11,12,5,255,128, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index 66e0f3f7f04051..79296d495b5882 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -118,916 +118,916 @@ const unsigned char _Py_M__zipimport[] = { 104,101,10,32,32,32,32,122,105,112,102,105,108,101,32,116, 97,114,103,101,116,101,100,46,10,32,32,32,32,99,2,0, 0,0,0,0,0,0,0,0,0,0,8,0,0,0,9,0, - 0,0,67,0,0,0,115,38,1,0,0,116,0,124,1,116, + 0,0,67,0,0,0,115,40,1,0,0,116,0,124,1,116, 1,131,2,115,28,100,1,100,0,108,2,125,2,124,2,160, 3,124,1,161,1,125,1,124,1,115,44,116,4,100,2,124, 1,100,3,141,2,130,1,116,5,114,60,124,1,160,6,116, 5,116,7,161,2,125,1,103,0,125,3,9,0,122,14,116, 8,160,9,124,1,161,1,125,4,87,0,110,70,4,0,116, - 10,116,11,102,2,144,1,121,36,1,0,1,0,1,0,116, + 10,116,11,102,2,144,1,121,38,1,0,1,0,1,0,116, 8,160,12,124,1,161,1,92,2,125,5,125,6,124,5,124, 1,107,2,114,134,116,4,100,5,124,1,100,3,141,2,130, 1,124,5,125,1,124,3,160,13,124,6,161,1,1,0,89, - 0,110,26,124,4,106,14,100,6,64,0,100,7,107,3,114, - 180,116,4,100,5,124,1,100,3,141,2,130,1,113,66,122, - 12,116,15,124,1,25,0,125,7,87,0,110,32,4,0,116, - 16,144,1,121,34,1,0,1,0,1,0,116,17,124,1,131, - 1,125,7,124,7,116,15,124,1,60,0,89,0,124,7,124, - 0,95,18,124,1,124,0,95,19,116,8,106,20,124,3,100, - 0,100,0,100,8,133,3,25,0,142,0,124,0,95,21,124, - 0,106,21,144,1,114,30,124,0,4,0,106,21,116,7,55, - 0,2,0,95,21,100,0,83,0,100,0,83,0,119,0,119, - 0,41,9,78,114,0,0,0,0,122,21,97,114,99,104,105, - 118,101,32,112,97,116,104,32,105,115,32,101,109,112,116,121, - 169,1,218,4,112,97,116,104,84,122,14,110,111,116,32,97, - 32,90,105,112,32,102,105,108,101,105,0,240,0,0,105,0, - 128,0,0,233,255,255,255,255,41,22,218,10,105,115,105,110, - 115,116,97,110,99,101,218,3,115,116,114,218,2,111,115,90, - 8,102,115,100,101,99,111,100,101,114,3,0,0,0,218,12, - 97,108,116,95,112,97,116,104,95,115,101,112,218,7,114,101, - 112,108,97,99,101,218,8,112,97,116,104,95,115,101,112,218, - 19,95,98,111,111,116,115,116,114,97,112,95,101,120,116,101, - 114,110,97,108,90,10,95,112,97,116,104,95,115,116,97,116, - 218,7,79,83,69,114,114,111,114,218,10,86,97,108,117,101, - 69,114,114,111,114,90,11,95,112,97,116,104,95,115,112,108, - 105,116,218,6,97,112,112,101,110,100,90,7,115,116,95,109, - 111,100,101,218,20,95,122,105,112,95,100,105,114,101,99,116, - 111,114,121,95,99,97,99,104,101,218,8,75,101,121,69,114, - 114,111,114,218,15,95,114,101,97,100,95,100,105,114,101,99, - 116,111,114,121,218,6,95,102,105,108,101,115,218,7,97,114, - 99,104,105,118,101,218,10,95,112,97,116,104,95,106,111,105, - 110,218,6,112,114,101,102,105,120,41,8,218,4,115,101,108, - 102,114,13,0,0,0,114,17,0,0,0,114,31,0,0,0, - 90,2,115,116,90,7,100,105,114,110,97,109,101,90,8,98, - 97,115,101,110,97,109,101,218,5,102,105,108,101,115,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,8,95, - 95,105,110,105,116,95,95,64,0,0,0,115,68,0,0,0, - 10,1,8,1,10,1,4,1,12,1,4,1,12,1,4,2, - 2,1,2,1,14,1,18,1,14,3,8,1,12,1,4,1, - 14,1,14,3,12,2,2,241,2,18,12,1,14,1,8,1, - 10,1,6,1,6,1,22,2,8,1,18,1,4,255,2,249, - 2,239,255,128,122,20,122,105,112,105,109,112,111,114,116,101, - 114,46,95,95,105,110,105,116,95,95,78,99,3,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0, - 67,0,0,0,115,78,0,0,0,116,0,124,0,124,1,131, - 2,125,3,124,3,100,1,117,1,114,26,124,0,103,0,102, - 2,83,0,116,1,124,0,124,1,131,2,125,4,116,2,124, - 0,124,4,131,2,114,70,100,1,124,0,106,3,155,0,116, - 4,155,0,124,4,155,0,157,3,103,1,102,2,83,0,100, - 1,103,0,102,2,83,0,41,2,97,47,2,0,0,102,105, - 110,100,95,108,111,97,100,101,114,40,102,117,108,108,110,97, - 109,101,44,32,112,97,116,104,61,78,111,110,101,41,32,45, - 62,32,115,101,108,102,44,32,115,116,114,32,111,114,32,78, - 111,110,101,46,10,10,32,32,32,32,32,32,32,32,83,101, - 97,114,99,104,32,102,111,114,32,97,32,109,111,100,117,108, - 101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,39, - 102,117,108,108,110,97,109,101,39,46,32,39,102,117,108,108, - 110,97,109,101,39,32,109,117,115,116,32,98,101,32,116,104, - 101,10,32,32,32,32,32,32,32,32,102,117,108,108,121,32, - 113,117,97,108,105,102,105,101,100,32,40,100,111,116,116,101, - 100,41,32,109,111,100,117,108,101,32,110,97,109,101,46,32, - 73,116,32,114,101,116,117,114,110,115,32,116,104,101,32,122, - 105,112,105,109,112,111,114,116,101,114,10,32,32,32,32,32, - 32,32,32,105,110,115,116,97,110,99,101,32,105,116,115,101, - 108,102,32,105,102,32,116,104,101,32,109,111,100,117,108,101, - 32,119,97,115,32,102,111,117,110,100,44,32,97,32,115,116, - 114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32, - 116,104,101,10,32,32,32,32,32,32,32,32,102,117,108,108, - 32,112,97,116,104,32,110,97,109,101,32,105,102,32,105,116, - 39,115,32,112,111,115,115,105,98,108,121,32,97,32,112,111, - 114,116,105,111,110,32,111,102,32,97,32,110,97,109,101,115, - 112,97,99,101,32,112,97,99,107,97,103,101,44,10,32,32, - 32,32,32,32,32,32,111,114,32,78,111,110,101,32,111,116, - 104,101,114,119,105,115,101,46,32,84,104,101,32,111,112,116, - 105,111,110,97,108,32,39,112,97,116,104,39,32,97,114,103, - 117,109,101,110,116,32,105,115,32,105,103,110,111,114,101,100, - 32,45,45,32,105,116,39,115,10,32,32,32,32,32,32,32, - 32,116,104,101,114,101,32,102,111,114,32,99,111,109,112,97, - 116,105,98,105,108,105,116,121,32,119,105,116,104,32,116,104, - 101,32,105,109,112,111,114,116,101,114,32,112,114,111,116,111, - 99,111,108,46,10,10,32,32,32,32,32,32,32,32,68,101, - 112,114,101,99,97,116,101,100,32,115,105,110,99,101,32,80, - 121,116,104,111,110,32,51,46,49,48,46,32,85,115,101,32, - 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, - 101,97,100,46,10,32,32,32,32,32,32,32,32,78,41,5, - 218,16,95,103,101,116,95,109,111,100,117,108,101,95,105,110, - 102,111,218,16,95,103,101,116,95,109,111,100,117,108,101,95, - 112,97,116,104,218,7,95,105,115,95,100,105,114,114,29,0, - 0,0,114,20,0,0,0,41,5,114,32,0,0,0,218,8, - 102,117,108,108,110,97,109,101,114,13,0,0,0,218,2,109, - 105,218,7,109,111,100,112,97,116,104,114,9,0,0,0,114, + 0,110,28,124,4,106,14,100,6,64,0,100,7,107,3,114, + 178,116,4,100,5,124,1,100,3,141,2,130,1,113,182,113, + 66,122,12,116,15,124,1,25,0,125,7,87,0,110,32,4, + 0,116,16,144,1,121,36,1,0,1,0,1,0,116,17,124, + 1,131,1,125,7,124,7,116,15,124,1,60,0,89,0,124, + 7,124,0,95,18,124,1,124,0,95,19,116,8,106,20,124, + 3,100,0,100,0,100,8,133,3,25,0,142,0,124,0,95, + 21,124,0,106,21,144,1,114,32,124,0,4,0,106,21,116, + 7,55,0,2,0,95,21,100,0,83,0,100,0,83,0,119, + 0,119,0,41,9,78,114,0,0,0,0,122,21,97,114,99, + 104,105,118,101,32,112,97,116,104,32,105,115,32,101,109,112, + 116,121,169,1,218,4,112,97,116,104,84,122,14,110,111,116, + 32,97,32,90,105,112,32,102,105,108,101,105,0,240,0,0, + 105,0,128,0,0,233,255,255,255,255,41,22,218,10,105,115, + 105,110,115,116,97,110,99,101,218,3,115,116,114,218,2,111, + 115,90,8,102,115,100,101,99,111,100,101,114,3,0,0,0, + 218,12,97,108,116,95,112,97,116,104,95,115,101,112,218,7, + 114,101,112,108,97,99,101,218,8,112,97,116,104,95,115,101, + 112,218,19,95,98,111,111,116,115,116,114,97,112,95,101,120, + 116,101,114,110,97,108,90,10,95,112,97,116,104,95,115,116, + 97,116,218,7,79,83,69,114,114,111,114,218,10,86,97,108, + 117,101,69,114,114,111,114,90,11,95,112,97,116,104,95,115, + 112,108,105,116,218,6,97,112,112,101,110,100,90,7,115,116, + 95,109,111,100,101,218,20,95,122,105,112,95,100,105,114,101, + 99,116,111,114,121,95,99,97,99,104,101,218,8,75,101,121, + 69,114,114,111,114,218,15,95,114,101,97,100,95,100,105,114, + 101,99,116,111,114,121,218,6,95,102,105,108,101,115,218,7, + 97,114,99,104,105,118,101,218,10,95,112,97,116,104,95,106, + 111,105,110,218,6,112,114,101,102,105,120,41,8,218,4,115, + 101,108,102,114,13,0,0,0,114,17,0,0,0,114,31,0, + 0,0,90,2,115,116,90,7,100,105,114,110,97,109,101,90, + 8,98,97,115,101,110,97,109,101,218,5,102,105,108,101,115, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 8,95,95,105,110,105,116,95,95,64,0,0,0,115,70,0, + 0,0,10,1,8,1,10,1,4,1,12,1,4,1,12,1, + 4,2,2,1,2,1,14,1,18,1,14,3,8,1,12,1, + 4,1,14,1,14,3,12,2,2,1,2,240,2,18,12,1, + 14,1,8,1,10,1,6,1,6,1,22,2,8,1,18,1, + 4,255,2,249,2,239,255,128,122,20,122,105,112,105,109,112, + 111,114,116,101,114,46,95,95,105,110,105,116,95,95,78,99, + 3,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 4,0,0,0,67,0,0,0,115,78,0,0,0,116,0,124, + 0,124,1,131,2,125,3,124,3,100,1,117,1,114,26,124, + 0,103,0,102,2,83,0,116,1,124,0,124,1,131,2,125, + 4,116,2,124,0,124,4,131,2,114,70,100,1,124,0,106, + 3,155,0,116,4,155,0,124,4,155,0,157,3,103,1,102, + 2,83,0,100,1,103,0,102,2,83,0,41,2,97,47,2, + 0,0,102,105,110,100,95,108,111,97,100,101,114,40,102,117, + 108,108,110,97,109,101,44,32,112,97,116,104,61,78,111,110, + 101,41,32,45,62,32,115,101,108,102,44,32,115,116,114,32, + 111,114,32,78,111,110,101,46,10,10,32,32,32,32,32,32, + 32,32,83,101,97,114,99,104,32,102,111,114,32,97,32,109, + 111,100,117,108,101,32,115,112,101,99,105,102,105,101,100,32, + 98,121,32,39,102,117,108,108,110,97,109,101,39,46,32,39, + 102,117,108,108,110,97,109,101,39,32,109,117,115,116,32,98, + 101,32,116,104,101,10,32,32,32,32,32,32,32,32,102,117, + 108,108,121,32,113,117,97,108,105,102,105,101,100,32,40,100, + 111,116,116,101,100,41,32,109,111,100,117,108,101,32,110,97, + 109,101,46,32,73,116,32,114,101,116,117,114,110,115,32,116, + 104,101,32,122,105,112,105,109,112,111,114,116,101,114,10,32, + 32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,32, + 105,116,115,101,108,102,32,105,102,32,116,104,101,32,109,111, + 100,117,108,101,32,119,97,115,32,102,111,117,110,100,44,32, + 97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110, + 105,110,103,32,116,104,101,10,32,32,32,32,32,32,32,32, + 102,117,108,108,32,112,97,116,104,32,110,97,109,101,32,105, + 102,32,105,116,39,115,32,112,111,115,115,105,98,108,121,32, + 97,32,112,111,114,116,105,111,110,32,111,102,32,97,32,110, + 97,109,101,115,112,97,99,101,32,112,97,99,107,97,103,101, + 44,10,32,32,32,32,32,32,32,32,111,114,32,78,111,110, + 101,32,111,116,104,101,114,119,105,115,101,46,32,84,104,101, + 32,111,112,116,105,111,110,97,108,32,39,112,97,116,104,39, + 32,97,114,103,117,109,101,110,116,32,105,115,32,105,103,110, + 111,114,101,100,32,45,45,32,105,116,39,115,10,32,32,32, + 32,32,32,32,32,116,104,101,114,101,32,102,111,114,32,99, + 111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116, + 104,32,116,104,101,32,105,109,112,111,114,116,101,114,32,112, + 114,111,116,111,99,111,108,46,10,10,32,32,32,32,32,32, + 32,32,68,101,112,114,101,99,97,116,101,100,32,115,105,110, + 99,101,32,80,121,116,104,111,110,32,51,46,49,48,46,32, + 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, + 105,110,115,116,101,97,100,46,10,32,32,32,32,32,32,32, + 32,78,41,5,218,16,95,103,101,116,95,109,111,100,117,108, + 101,95,105,110,102,111,218,16,95,103,101,116,95,109,111,100, + 117,108,101,95,112,97,116,104,218,7,95,105,115,95,100,105, + 114,114,29,0,0,0,114,20,0,0,0,41,5,114,32,0, + 0,0,218,8,102,117,108,108,110,97,109,101,114,13,0,0, + 0,218,2,109,105,218,7,109,111,100,112,97,116,104,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,11,102, + 105,110,100,95,108,111,97,100,101,114,110,0,0,0,115,16, + 0,0,0,10,12,8,1,8,2,10,7,10,1,24,4,8, + 2,255,128,122,23,122,105,112,105,109,112,111,114,116,101,114, + 46,102,105,110,100,95,108,111,97,100,101,114,99,3,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, + 0,67,0,0,0,115,16,0,0,0,124,0,160,0,124,1, + 124,2,161,2,100,1,25,0,83,0,41,3,97,203,1,0, + 0,102,105,110,100,95,109,111,100,117,108,101,40,102,117,108, + 108,110,97,109,101,44,32,112,97,116,104,61,78,111,110,101, + 41,32,45,62,32,115,101,108,102,32,111,114,32,78,111,110, + 101,46,10,10,32,32,32,32,32,32,32,32,83,101,97,114, + 99,104,32,102,111,114,32,97,32,109,111,100,117,108,101,32, + 115,112,101,99,105,102,105,101,100,32,98,121,32,39,102,117, + 108,108,110,97,109,101,39,46,32,39,102,117,108,108,110,97, + 109,101,39,32,109,117,115,116,32,98,101,32,116,104,101,10, + 32,32,32,32,32,32,32,32,102,117,108,108,121,32,113,117, + 97,108,105,102,105,101,100,32,40,100,111,116,116,101,100,41, + 32,109,111,100,117,108,101,32,110,97,109,101,46,32,73,116, + 32,114,101,116,117,114,110,115,32,116,104,101,32,122,105,112, + 105,109,112,111,114,116,101,114,10,32,32,32,32,32,32,32, + 32,105,110,115,116,97,110,99,101,32,105,116,115,101,108,102, + 32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,119, + 97,115,32,102,111,117,110,100,44,32,111,114,32,78,111,110, + 101,32,105,102,32,105,116,32,119,97,115,110,39,116,46,10, + 32,32,32,32,32,32,32,32,84,104,101,32,111,112,116,105, + 111,110,97,108,32,39,112,97,116,104,39,32,97,114,103,117, + 109,101,110,116,32,105,115,32,105,103,110,111,114,101,100,32, + 45,45,32,105,116,39,115,32,116,104,101,114,101,32,102,111, + 114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,10, + 32,32,32,32,32,32,32,32,119,105,116,104,32,116,104,101, + 32,105,109,112,111,114,116,101,114,32,112,114,111,116,111,99, + 111,108,46,10,10,32,32,32,32,32,32,32,32,68,101,112, + 114,101,99,97,116,101,100,32,115,105,110,99,101,32,80,121, + 116,104,111,110,32,51,46,49,48,46,32,85,115,101,32,102, + 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, + 97,100,46,10,32,32,32,32,32,32,32,32,114,0,0,0, + 0,78,41,1,114,41,0,0,0,41,3,114,32,0,0,0, + 114,38,0,0,0,114,13,0,0,0,114,9,0,0,0,114, 9,0,0,0,114,10,0,0,0,218,11,102,105,110,100,95, - 108,111,97,100,101,114,110,0,0,0,115,16,0,0,0,10, - 12,8,1,8,2,10,7,10,1,24,4,8,2,255,128,122, - 23,122,105,112,105,109,112,111,114,116,101,114,46,102,105,110, - 100,95,108,111,97,100,101,114,99,3,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, - 0,115,16,0,0,0,124,0,160,0,124,1,124,2,161,2, - 100,1,25,0,83,0,41,3,97,203,1,0,0,102,105,110, - 100,95,109,111,100,117,108,101,40,102,117,108,108,110,97,109, - 101,44,32,112,97,116,104,61,78,111,110,101,41,32,45,62, - 32,115,101,108,102,32,111,114,32,78,111,110,101,46,10,10, - 32,32,32,32,32,32,32,32,83,101,97,114,99,104,32,102, - 111,114,32,97,32,109,111,100,117,108,101,32,115,112,101,99, - 105,102,105,101,100,32,98,121,32,39,102,117,108,108,110,97, - 109,101,39,46,32,39,102,117,108,108,110,97,109,101,39,32, - 109,117,115,116,32,98,101,32,116,104,101,10,32,32,32,32, - 32,32,32,32,102,117,108,108,121,32,113,117,97,108,105,102, - 105,101,100,32,40,100,111,116,116,101,100,41,32,109,111,100, - 117,108,101,32,110,97,109,101,46,32,73,116,32,114,101,116, - 117,114,110,115,32,116,104,101,32,122,105,112,105,109,112,111, - 114,116,101,114,10,32,32,32,32,32,32,32,32,105,110,115, - 116,97,110,99,101,32,105,116,115,101,108,102,32,105,102,32, - 116,104,101,32,109,111,100,117,108,101,32,119,97,115,32,102, - 111,117,110,100,44,32,111,114,32,78,111,110,101,32,105,102, - 32,105,116,32,119,97,115,110,39,116,46,10,32,32,32,32, - 32,32,32,32,84,104,101,32,111,112,116,105,111,110,97,108, - 32,39,112,97,116,104,39,32,97,114,103,117,109,101,110,116, - 32,105,115,32,105,103,110,111,114,101,100,32,45,45,32,105, - 116,39,115,32,116,104,101,114,101,32,102,111,114,32,99,111, - 109,112,97,116,105,98,105,108,105,116,121,10,32,32,32,32, - 32,32,32,32,119,105,116,104,32,116,104,101,32,105,109,112, - 111,114,116,101,114,32,112,114,111,116,111,99,111,108,46,10, - 10,32,32,32,32,32,32,32,32,68,101,112,114,101,99,97, - 116,101,100,32,115,105,110,99,101,32,80,121,116,104,111,110, - 32,51,46,49,48,46,32,85,115,101,32,102,105,110,100,95, - 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, - 32,32,32,32,32,32,32,32,114,0,0,0,0,78,41,1, - 114,41,0,0,0,41,3,114,32,0,0,0,114,38,0,0, - 0,114,13,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,11,102,105,110,100,95,109,111,100,117, - 108,101,144,0,0,0,115,4,0,0,0,16,11,255,128,122, - 23,122,105,112,105,109,112,111,114,116,101,114,46,102,105,110, - 100,95,109,111,100,117,108,101,99,3,0,0,0,0,0,0, - 0,0,0,0,0,7,0,0,0,5,0,0,0,67,0,0, - 0,115,108,0,0,0,116,0,124,0,124,1,131,2,125,3, - 124,3,100,1,117,1,114,34,116,1,106,2,124,1,124,0, - 124,3,100,2,141,3,83,0,116,3,124,0,124,1,131,2, - 125,4,116,4,124,0,124,4,131,2,114,104,124,0,106,5, - 155,0,116,6,155,0,124,4,155,0,157,3,125,5,116,1, - 106,7,124,1,100,1,100,3,100,4,141,3,125,6,124,6, - 106,8,160,9,124,5,161,1,1,0,124,6,83,0,100,1, - 83,0,41,5,122,107,67,114,101,97,116,101,32,97,32,77, - 111,100,117,108,101,83,112,101,99,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,46,10,10,32,32,32,32,32,32,32,32,82,101,116, - 117,114,110,115,32,78,111,110,101,32,105,102,32,116,104,101, - 32,109,111,100,117,108,101,32,99,97,110,110,111,116,32,98, - 101,32,102,111,117,110,100,46,10,32,32,32,32,32,32,32, - 32,78,41,1,218,10,105,115,95,112,97,99,107,97,103,101, - 84,41,3,218,4,110,97,109,101,90,6,108,111,97,100,101, - 114,114,43,0,0,0,41,10,114,35,0,0,0,218,10,95, - 98,111,111,116,115,116,114,97,112,90,16,115,112,101,99,95, - 102,114,111,109,95,108,111,97,100,101,114,114,36,0,0,0, - 114,37,0,0,0,114,29,0,0,0,114,20,0,0,0,90, - 10,77,111,100,117,108,101,83,112,101,99,90,26,115,117,98, - 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, - 99,97,116,105,111,110,115,114,24,0,0,0,41,7,114,32, - 0,0,0,114,38,0,0,0,90,6,116,97,114,103,101,116, - 90,11,109,111,100,117,108,101,95,105,110,102,111,114,40,0, - 0,0,114,13,0,0,0,90,4,115,112,101,99,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,9,102,105, - 110,100,95,115,112,101,99,157,0,0,0,115,26,0,0,0, - 10,5,8,1,16,1,10,7,10,1,18,4,8,1,2,1, - 6,255,12,2,4,1,4,2,255,128,122,21,122,105,112,105, - 109,112,111,114,116,101,114,46,102,105,110,100,95,115,112,101, - 99,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,3,0,0,0,67,0,0,0,115,20,0,0,0,116, - 0,124,0,124,1,131,2,92,3,125,2,125,3,125,4,124, - 2,83,0,41,2,122,166,103,101,116,95,99,111,100,101,40, - 102,117,108,108,110,97,109,101,41,32,45,62,32,99,111,100, - 101,32,111,98,106,101,99,116,46,10,10,32,32,32,32,32, - 32,32,32,82,101,116,117,114,110,32,116,104,101,32,99,111, - 100,101,32,111,98,106,101,99,116,32,102,111,114,32,116,104, + 109,111,100,117,108,101,144,0,0,0,115,4,0,0,0,16, + 11,255,128,122,23,122,105,112,105,109,112,111,114,116,101,114, + 46,102,105,110,100,95,109,111,100,117,108,101,99,3,0,0, + 0,0,0,0,0,0,0,0,0,7,0,0,0,5,0,0, + 0,67,0,0,0,115,108,0,0,0,116,0,124,0,124,1, + 131,2,125,3,124,3,100,1,117,1,114,34,116,1,106,2, + 124,1,124,0,124,3,100,2,141,3,83,0,116,3,124,0, + 124,1,131,2,125,4,116,4,124,0,124,4,131,2,114,104, + 124,0,106,5,155,0,116,6,155,0,124,4,155,0,157,3, + 125,5,116,1,106,7,124,1,100,1,100,3,100,4,141,3, + 125,6,124,6,106,8,160,9,124,5,161,1,1,0,124,6, + 83,0,100,1,83,0,41,5,122,107,67,114,101,97,116,101, + 32,97,32,77,111,100,117,108,101,83,112,101,99,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,46,10,10,32,32,32,32,32,32,32, + 32,82,101,116,117,114,110,115,32,78,111,110,101,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,99,97,110,110, + 111,116,32,98,101,32,102,111,117,110,100,46,10,32,32,32, + 32,32,32,32,32,78,41,1,218,10,105,115,95,112,97,99, + 107,97,103,101,84,41,3,218,4,110,97,109,101,90,6,108, + 111,97,100,101,114,114,43,0,0,0,41,10,114,35,0,0, + 0,218,10,95,98,111,111,116,115,116,114,97,112,90,16,115, + 112,101,99,95,102,114,111,109,95,108,111,97,100,101,114,114, + 36,0,0,0,114,37,0,0,0,114,29,0,0,0,114,20, + 0,0,0,90,10,77,111,100,117,108,101,83,112,101,99,90, + 26,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, + 104,95,108,111,99,97,116,105,111,110,115,114,24,0,0,0, + 41,7,114,32,0,0,0,114,38,0,0,0,90,6,116,97, + 114,103,101,116,90,11,109,111,100,117,108,101,95,105,110,102, + 111,114,40,0,0,0,114,13,0,0,0,90,4,115,112,101, + 99,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,9,102,105,110,100,95,115,112,101,99,157,0,0,0,115, + 26,0,0,0,10,5,8,1,16,1,10,7,10,1,18,4, + 8,1,2,1,6,255,12,2,4,1,4,2,255,128,122,21, + 122,105,112,105,109,112,111,114,116,101,114,46,102,105,110,100, + 95,115,112,101,99,99,2,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,3,0,0,0,67,0,0,0,115,20, + 0,0,0,116,0,124,0,124,1,131,2,92,3,125,2,125, + 3,125,4,124,2,83,0,41,2,122,166,103,101,116,95,99, + 111,100,101,40,102,117,108,108,110,97,109,101,41,32,45,62, + 32,99,111,100,101,32,111,98,106,101,99,116,46,10,10,32, + 32,32,32,32,32,32,32,82,101,116,117,114,110,32,116,104, + 101,32,99,111,100,101,32,111,98,106,101,99,116,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,46,32,82,97,105,115,101,32,90,105, + 112,73,109,112,111,114,116,69,114,114,111,114,10,32,32,32, + 32,32,32,32,32,105,102,32,116,104,101,32,109,111,100,117, + 108,101,32,99,111,117,108,100,110,39,116,32,98,101,32,105, + 109,112,111,114,116,101,100,46,10,32,32,32,32,32,32,32, + 32,78,169,1,218,16,95,103,101,116,95,109,111,100,117,108, + 101,95,99,111,100,101,169,5,114,32,0,0,0,114,38,0, + 0,0,218,4,99,111,100,101,218,9,105,115,112,97,99,107, + 97,103,101,114,40,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,8,103,101,116,95,99,111,100, + 101,184,0,0,0,115,6,0,0,0,16,6,4,1,255,128, + 122,20,122,105,112,105,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,0, + 0,0,0,4,0,0,0,8,0,0,0,67,0,0,0,115, + 112,0,0,0,116,0,114,16,124,1,160,1,116,0,116,2, + 161,2,125,1,124,1,125,2,124,1,160,3,124,0,106,4, + 116,2,23,0,161,1,114,58,124,1,116,5,124,0,106,4, + 116,2,23,0,131,1,100,1,133,2,25,0,125,2,122,14, + 124,0,106,6,124,2,25,0,125,3,87,0,110,24,4,0, + 116,7,121,110,1,0,1,0,1,0,116,8,100,2,100,3, + 124,2,131,3,130,1,116,9,124,0,106,4,124,3,131,2, + 83,0,119,0,41,4,122,154,103,101,116,95,100,97,116,97, + 40,112,97,116,104,110,97,109,101,41,32,45,62,32,115,116, + 114,105,110,103,32,119,105,116,104,32,102,105,108,101,32,100, + 97,116,97,46,10,10,32,32,32,32,32,32,32,32,82,101, + 116,117,114,110,32,116,104,101,32,100,97,116,97,32,97,115, + 115,111,99,105,97,116,101,100,32,119,105,116,104,32,39,112, + 97,116,104,110,97,109,101,39,46,32,82,97,105,115,101,32, + 79,83,69,114,114,111,114,32,105,102,10,32,32,32,32,32, + 32,32,32,116,104,101,32,102,105,108,101,32,119,97,115,110, + 39,116,32,102,111,117,110,100,46,10,32,32,32,32,32,32, + 32,32,78,114,0,0,0,0,218,0,41,10,114,18,0,0, + 0,114,19,0,0,0,114,20,0,0,0,218,10,115,116,97, + 114,116,115,119,105,116,104,114,29,0,0,0,218,3,108,101, + 110,114,28,0,0,0,114,26,0,0,0,114,22,0,0,0, + 218,9,95,103,101,116,95,100,97,116,97,41,4,114,32,0, + 0,0,218,8,112,97,116,104,110,97,109,101,90,3,107,101, + 121,218,9,116,111,99,95,101,110,116,114,121,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,8,103,101,116, + 95,100,97,116,97,194,0,0,0,115,24,0,0,0,4,6, + 12,1,4,2,16,1,22,1,2,2,14,1,12,1,12,1, + 12,1,2,254,255,128,122,20,122,105,112,105,109,112,111,114, + 116,101,114,46,103,101,116,95,100,97,116,97,99,2,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,3,0,0, + 0,67,0,0,0,115,20,0,0,0,116,0,124,0,124,1, + 131,2,92,3,125,2,125,3,125,4,124,4,83,0,41,2, + 122,165,103,101,116,95,102,105,108,101,110,97,109,101,40,102, + 117,108,108,110,97,109,101,41,32,45,62,32,102,105,108,101, + 110,97,109,101,32,115,116,114,105,110,103,46,10,10,32,32, + 32,32,32,32,32,32,82,101,116,117,114,110,32,116,104,101, + 32,102,105,108,101,110,97,109,101,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,46,32,82,97,105,115,101,32,90,105,112,73,109,112, - 111,114,116,69,114,114,111,114,10,32,32,32,32,32,32,32, - 32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,99, - 111,117,108,100,110,39,116,32,98,101,32,105,109,112,111,114, - 116,101,100,46,10,32,32,32,32,32,32,32,32,78,169,1, - 218,16,95,103,101,116,95,109,111,100,117,108,101,95,99,111, - 100,101,169,5,114,32,0,0,0,114,38,0,0,0,218,4, - 99,111,100,101,218,9,105,115,112,97,99,107,97,103,101,114, - 40,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,8,103,101,116,95,99,111,100,101,184,0,0, - 0,115,6,0,0,0,16,6,4,1,255,128,122,20,122,105, - 112,105,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,0,0,0,0,4, - 0,0,0,8,0,0,0,67,0,0,0,115,112,0,0,0, - 116,0,114,16,124,1,160,1,116,0,116,2,161,2,125,1, - 124,1,125,2,124,1,160,3,124,0,106,4,116,2,23,0, - 161,1,114,58,124,1,116,5,124,0,106,4,116,2,23,0, - 131,1,100,1,133,2,25,0,125,2,122,14,124,0,106,6, - 124,2,25,0,125,3,87,0,110,24,4,0,116,7,121,110, - 1,0,1,0,1,0,116,8,100,2,100,3,124,2,131,3, - 130,1,116,9,124,0,106,4,124,3,131,2,83,0,119,0, - 41,4,122,154,103,101,116,95,100,97,116,97,40,112,97,116, - 104,110,97,109,101,41,32,45,62,32,115,116,114,105,110,103, - 32,119,105,116,104,32,102,105,108,101,32,100,97,116,97,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 32,116,104,101,32,100,97,116,97,32,97,115,115,111,99,105, - 97,116,101,100,32,119,105,116,104,32,39,112,97,116,104,110, - 97,109,101,39,46,32,82,97,105,115,101,32,79,83,69,114, - 114,111,114,32,105,102,10,32,32,32,32,32,32,32,32,116, - 104,101,32,102,105,108,101,32,119,97,115,110,39,116,32,102, - 111,117,110,100,46,10,32,32,32,32,32,32,32,32,78,114, - 0,0,0,0,218,0,41,10,114,18,0,0,0,114,19,0, - 0,0,114,20,0,0,0,218,10,115,116,97,114,116,115,119, - 105,116,104,114,29,0,0,0,218,3,108,101,110,114,28,0, - 0,0,114,26,0,0,0,114,22,0,0,0,218,9,95,103, - 101,116,95,100,97,116,97,41,4,114,32,0,0,0,218,8, - 112,97,116,104,110,97,109,101,90,3,107,101,121,218,9,116, - 111,99,95,101,110,116,114,121,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,8,103,101,116,95,100,97,116, - 97,194,0,0,0,115,24,0,0,0,4,6,12,1,4,2, - 16,1,22,1,2,2,14,1,12,1,12,1,12,1,2,254, - 255,128,122,20,122,105,112,105,109,112,111,114,116,101,114,46, - 103,101,116,95,100,97,116,97,99,2,0,0,0,0,0,0, - 0,0,0,0,0,5,0,0,0,3,0,0,0,67,0,0, - 0,115,20,0,0,0,116,0,124,0,124,1,131,2,92,3, - 125,2,125,3,125,4,124,4,83,0,41,2,122,165,103,101, - 116,95,102,105,108,101,110,97,109,101,40,102,117,108,108,110, - 97,109,101,41,32,45,62,32,102,105,108,101,110,97,109,101, - 32,115,116,114,105,110,103,46,10,10,32,32,32,32,32,32, - 32,32,82,101,116,117,114,110,32,116,104,101,32,102,105,108, - 101,110,97,109,101,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,111, - 114,32,114,97,105,115,101,32,90,105,112,73,109,112,111,114, - 116,69,114,114,111,114,10,32,32,32,32,32,32,32,32,105, - 102,32,105,116,32,99,111,117,108,100,110,39,116,32,98,101, - 32,105,109,112,111,114,116,101,100,46,10,32,32,32,32,32, - 32,32,32,78,114,47,0,0,0,114,49,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,12,103, - 101,116,95,102,105,108,101,110,97,109,101,215,0,0,0,115, - 6,0,0,0,16,8,4,1,255,128,122,24,122,105,112,105, - 109,112,111,114,116,101,114,46,103,101,116,95,102,105,108,101, - 110,97,109,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,6,0,0,0,8,0,0,0,67,0,0,0,115,126,0, - 0,0,116,0,124,0,124,1,131,2,125,2,124,2,100,1, - 117,0,114,36,116,1,100,2,124,1,155,2,157,2,124,1, - 100,3,141,2,130,1,116,2,124,0,124,1,131,2,125,3, - 124,2,114,64,116,3,160,4,124,3,100,4,161,2,125,4, - 110,10,124,3,155,0,100,5,157,2,125,4,122,14,124,0, - 106,5,124,4,25,0,125,5,87,0,110,18,4,0,116,6, - 121,124,1,0,1,0,1,0,89,0,100,1,83,0,116,7, - 124,0,106,8,124,5,131,2,160,9,161,0,83,0,119,0, - 41,6,122,253,103,101,116,95,115,111,117,114,99,101,40,102, - 117,108,108,110,97,109,101,41,32,45,62,32,115,111,117,114, - 99,101,32,115,116,114,105,110,103,46,10,10,32,32,32,32, - 32,32,32,32,82,101,116,117,114,110,32,116,104,101,32,115, - 111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32,90,105,112,73,109, - 112,111,114,116,69,114,114,111,114,10,32,32,32,32,32,32, - 32,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32, - 99,111,117,108,100,110,39,116,32,98,101,32,102,111,117,110, - 100,44,32,114,101,116,117,114,110,32,78,111,110,101,32,105, - 102,32,116,104,101,32,97,114,99,104,105,118,101,32,100,111, - 101,115,10,32,32,32,32,32,32,32,32,99,111,110,116,97, - 105,110,32,116,104,101,32,109,111,100,117,108,101,44,32,98, - 117,116,32,104,97,115,32,110,111,32,115,111,117,114,99,101, - 32,102,111,114,32,105,116,46,10,32,32,32,32,32,32,32, - 32,78,250,18,99,97,110,39,116,32,102,105,110,100,32,109, - 111,100,117,108,101,32,169,1,114,44,0,0,0,250,11,95, - 95,105,110,105,116,95,95,46,112,121,250,3,46,112,121,41, - 10,114,35,0,0,0,114,3,0,0,0,114,36,0,0,0, - 114,21,0,0,0,114,30,0,0,0,114,28,0,0,0,114, - 26,0,0,0,114,56,0,0,0,114,29,0,0,0,218,6, - 100,101,99,111,100,101,41,6,114,32,0,0,0,114,38,0, - 0,0,114,39,0,0,0,114,13,0,0,0,218,8,102,117, - 108,108,112,97,116,104,114,58,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,10,103,101,116,95, - 115,111,117,114,99,101,227,0,0,0,115,28,0,0,0,10, - 7,8,1,18,1,10,2,4,1,14,1,10,2,2,2,14, - 1,12,1,6,2,16,1,2,253,255,128,122,22,122,105,112, - 105,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,0,0,0,0, - 3,0,0,0,4,0,0,0,67,0,0,0,115,40,0,0, - 0,116,0,124,0,124,1,131,2,125,2,124,2,100,1,117, - 0,114,36,116,1,100,2,124,1,155,2,157,2,124,1,100, - 3,141,2,130,1,124,2,83,0,41,4,122,171,105,115,95, - 112,97,99,107,97,103,101,40,102,117,108,108,110,97,109,101, - 41,32,45,62,32,98,111,111,108,46,10,10,32,32,32,32, - 32,32,32,32,82,101,116,117,114,110,32,84,114,117,101,32, - 105,102,32,116,104,101,32,109,111,100,117,108,101,32,115,112, - 101,99,105,102,105,101,100,32,98,121,32,102,117,108,108,110, - 97,109,101,32,105,115,32,97,32,112,97,99,107,97,103,101, - 46,10,32,32,32,32,32,32,32,32,82,97,105,115,101,32, - 90,105,112,73,109,112,111,114,116,69,114,114,111,114,32,105, - 102,32,116,104,101,32,109,111,100,117,108,101,32,99,111,117, - 108,100,110,39,116,32,98,101,32,102,111,117,110,100,46,10, - 32,32,32,32,32,32,32,32,78,114,61,0,0,0,114,62, - 0,0,0,41,2,114,35,0,0,0,114,3,0,0,0,41, - 3,114,32,0,0,0,114,38,0,0,0,114,39,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, - 43,0,0,0,253,0,0,0,115,10,0,0,0,10,6,8, - 1,18,1,4,1,255,128,122,22,122,105,112,105,109,112,111, - 114,116,101,114,46,105,115,95,112,97,99,107,97,103,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, - 8,0,0,0,67,0,0,0,115,252,0,0,0,100,1,125, - 2,116,0,160,1,124,2,116,2,161,2,1,0,116,3,124, - 0,124,1,131,2,92,3,125,3,125,4,125,5,116,4,106, - 5,160,6,124,1,161,1,125,6,124,6,100,2,117,0,115, - 62,116,7,124,6,116,8,131,2,115,80,116,8,124,1,131, - 1,125,6,124,6,116,4,106,5,124,1,60,0,124,0,124, - 6,95,9,122,84,124,4,114,124,116,10,124,0,124,1,131, - 2,125,7,116,11,160,12,124,0,106,13,124,7,161,2,125, - 8,124,8,103,1,124,6,95,14,116,15,124,6,100,3,131, - 2,115,140,116,16,124,6,95,16,116,11,160,17,124,6,106, - 18,124,1,124,5,161,3,1,0,116,19,124,3,124,6,106, - 18,131,2,1,0,87,0,110,16,1,0,1,0,1,0,116, - 4,106,5,124,1,61,0,130,0,122,14,116,4,106,5,124, - 1,25,0,125,6,87,0,110,28,4,0,116,20,121,250,1, - 0,1,0,1,0,116,21,100,4,124,1,155,2,100,5,157, - 3,131,1,130,1,116,22,160,23,100,6,124,1,124,5,161, - 3,1,0,124,6,83,0,119,0,41,7,97,64,1,0,0, - 108,111,97,100,95,109,111,100,117,108,101,40,102,117,108,108, - 110,97,109,101,41,32,45,62,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,76,111,97,100,32,116, - 104,101,32,109,111,100,117,108,101,32,115,112,101,99,105,102, - 105,101,100,32,98,121,32,39,102,117,108,108,110,97,109,101, - 39,46,32,39,102,117,108,108,110,97,109,101,39,32,109,117, - 115,116,32,98,101,32,116,104,101,10,32,32,32,32,32,32, - 32,32,102,117,108,108,121,32,113,117,97,108,105,102,105,101, - 100,32,40,100,111,116,116,101,100,41,32,109,111,100,117,108, - 101,32,110,97,109,101,46,32,73,116,32,114,101,116,117,114, - 110,115,32,116,104,101,32,105,109,112,111,114,116,101,100,10, - 32,32,32,32,32,32,32,32,109,111,100,117,108,101,44,32, - 111,114,32,114,97,105,115,101,115,32,90,105,112,73,109,112, - 111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,99, - 111,117,108,100,32,110,111,116,32,98,101,32,105,109,112,111, - 114,116,101,100,46,10,10,32,32,32,32,32,32,32,32,68, - 101,112,114,101,99,97,116,101,100,32,115,105,110,99,101,32, - 80,121,116,104,111,110,32,51,46,49,48,46,32,85,115,101, - 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, - 110,115,116,101,97,100,46,10,32,32,32,32,32,32,32,32, - 122,114,122,105,112,105,109,112,111,114,116,46,122,105,112,105, - 109,112,111,114,116,101,114,46,108,111,97,100,95,109,111,100, - 117,108,101,40,41,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,32,97,110,100,32,115,108,97,116,101,100,32,102, - 111,114,32,114,101,109,111,118,97,108,32,105,110,32,80,121, - 116,104,111,110,32,51,46,49,50,59,32,117,115,101,32,101, - 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, - 116,101,97,100,78,218,12,95,95,98,117,105,108,116,105,110, - 115,95,95,122,14,76,111,97,100,101,100,32,109,111,100,117, - 108,101,32,122,25,32,110,111,116,32,102,111,117,110,100,32, - 105,110,32,115,121,115,46,109,111,100,117,108,101,115,122,30, - 105,109,112,111,114,116,32,123,125,32,35,32,108,111,97,100, - 101,100,32,102,114,111,109,32,90,105,112,32,123,125,41,24, - 218,9,95,119,97,114,110,105,110,103,115,90,4,119,97,114, - 110,218,18,68,101,112,114,101,99,97,116,105,111,110,87,97, - 114,110,105,110,103,114,48,0,0,0,218,3,115,121,115,218, - 7,109,111,100,117,108,101,115,218,3,103,101,116,114,15,0, - 0,0,218,12,95,109,111,100,117,108,101,95,116,121,112,101, - 218,10,95,95,108,111,97,100,101,114,95,95,114,36,0,0, - 0,114,21,0,0,0,114,30,0,0,0,114,29,0,0,0, - 90,8,95,95,112,97,116,104,95,95,218,7,104,97,115,97, - 116,116,114,114,68,0,0,0,90,14,95,102,105,120,95,117, - 112,95,109,111,100,117,108,101,218,8,95,95,100,105,99,116, - 95,95,218,4,101,120,101,99,114,26,0,0,0,218,11,73, - 109,112,111,114,116,69,114,114,111,114,114,45,0,0,0,218, - 16,95,118,101,114,98,111,115,101,95,109,101,115,115,97,103, - 101,41,9,114,32,0,0,0,114,38,0,0,0,218,3,109, - 115,103,114,50,0,0,0,114,51,0,0,0,114,40,0,0, - 0,90,3,109,111,100,114,13,0,0,0,114,66,0,0,0, + 108,101,32,111,114,32,114,97,105,115,101,32,90,105,112,73, + 109,112,111,114,116,69,114,114,111,114,10,32,32,32,32,32, + 32,32,32,105,102,32,105,116,32,99,111,117,108,100,110,39, + 116,32,98,101,32,105,109,112,111,114,116,101,100,46,10,32, + 32,32,32,32,32,32,32,78,114,47,0,0,0,114,49,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,12,103,101,116,95,102,105,108,101,110,97,109,101,215, + 0,0,0,115,6,0,0,0,16,8,4,1,255,128,122,24, + 122,105,112,105,109,112,111,114,116,101,114,46,103,101,116,95, + 102,105,108,101,110,97,109,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,6,0,0,0,8,0,0,0,67,0,0, + 0,115,126,0,0,0,116,0,124,0,124,1,131,2,125,2, + 124,2,100,1,117,0,114,36,116,1,100,2,124,1,155,2, + 157,2,124,1,100,3,141,2,130,1,116,2,124,0,124,1, + 131,2,125,3,124,2,114,64,116,3,160,4,124,3,100,4, + 161,2,125,4,110,10,124,3,155,0,100,5,157,2,125,4, + 122,14,124,0,106,5,124,4,25,0,125,5,87,0,110,18, + 4,0,116,6,121,124,1,0,1,0,1,0,89,0,100,1, + 83,0,116,7,124,0,106,8,124,5,131,2,160,9,161,0, + 83,0,119,0,41,6,122,253,103,101,116,95,115,111,117,114, + 99,101,40,102,117,108,108,110,97,109,101,41,32,45,62,32, + 115,111,117,114,99,101,32,115,116,114,105,110,103,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,116, + 104,101,32,115,111,117,114,99,101,32,99,111,100,101,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,46,32,82,97,105,115,101,32,90, + 105,112,73,109,112,111,114,116,69,114,114,111,114,10,32,32, + 32,32,32,32,32,32,105,102,32,116,104,101,32,109,111,100, + 117,108,101,32,99,111,117,108,100,110,39,116,32,98,101,32, + 102,111,117,110,100,44,32,114,101,116,117,114,110,32,78,111, + 110,101,32,105,102,32,116,104,101,32,97,114,99,104,105,118, + 101,32,100,111,101,115,10,32,32,32,32,32,32,32,32,99, + 111,110,116,97,105,110,32,116,104,101,32,109,111,100,117,108, + 101,44,32,98,117,116,32,104,97,115,32,110,111,32,115,111, + 117,114,99,101,32,102,111,114,32,105,116,46,10,32,32,32, + 32,32,32,32,32,78,250,18,99,97,110,39,116,32,102,105, + 110,100,32,109,111,100,117,108,101,32,169,1,114,44,0,0, + 0,250,11,95,95,105,110,105,116,95,95,46,112,121,250,3, + 46,112,121,41,10,114,35,0,0,0,114,3,0,0,0,114, + 36,0,0,0,114,21,0,0,0,114,30,0,0,0,114,28, + 0,0,0,114,26,0,0,0,114,56,0,0,0,114,29,0, + 0,0,218,6,100,101,99,111,100,101,41,6,114,32,0,0, + 0,114,38,0,0,0,114,39,0,0,0,114,13,0,0,0, + 218,8,102,117,108,108,112,97,116,104,114,58,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,10, + 103,101,116,95,115,111,117,114,99,101,227,0,0,0,115,28, + 0,0,0,10,7,8,1,18,1,10,2,4,1,14,1,10, + 2,2,2,14,1,12,1,6,2,16,1,2,253,255,128,122, + 22,122,105,112,105,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, + 0,0,0,0,3,0,0,0,4,0,0,0,67,0,0,0, + 115,40,0,0,0,116,0,124,0,124,1,131,2,125,2,124, + 2,100,1,117,0,114,36,116,1,100,2,124,1,155,2,157, + 2,124,1,100,3,141,2,130,1,124,2,83,0,41,4,122, + 171,105,115,95,112,97,99,107,97,103,101,40,102,117,108,108, + 110,97,109,101,41,32,45,62,32,98,111,111,108,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,84, + 114,117,101,32,105,102,32,116,104,101,32,109,111,100,117,108, + 101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,102, + 117,108,108,110,97,109,101,32,105,115,32,97,32,112,97,99, + 107,97,103,101,46,10,32,32,32,32,32,32,32,32,82,97, + 105,115,101,32,90,105,112,73,109,112,111,114,116,69,114,114, + 111,114,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,99,111,117,108,100,110,39,116,32,98,101,32,102,111,117, + 110,100,46,10,32,32,32,32,32,32,32,32,78,114,61,0, + 0,0,114,62,0,0,0,41,2,114,35,0,0,0,114,3, + 0,0,0,41,3,114,32,0,0,0,114,38,0,0,0,114, + 39,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,114,43,0,0,0,253,0,0,0,115,10,0,0, + 0,10,6,8,1,18,1,4,1,255,128,122,22,122,105,112, + 105,109,112,111,114,116,101,114,46,105,115,95,112,97,99,107, + 97,103,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 9,0,0,0,8,0,0,0,67,0,0,0,115,252,0,0, + 0,100,1,125,2,116,0,160,1,124,2,116,2,161,2,1, + 0,116,3,124,0,124,1,131,2,92,3,125,3,125,4,125, + 5,116,4,106,5,160,6,124,1,161,1,125,6,124,6,100, + 2,117,0,115,62,116,7,124,6,116,8,131,2,115,80,116, + 8,124,1,131,1,125,6,124,6,116,4,106,5,124,1,60, + 0,124,0,124,6,95,9,122,84,124,4,114,124,116,10,124, + 0,124,1,131,2,125,7,116,11,160,12,124,0,106,13,124, + 7,161,2,125,8,124,8,103,1,124,6,95,14,116,15,124, + 6,100,3,131,2,115,140,116,16,124,6,95,16,116,11,160, + 17,124,6,106,18,124,1,124,5,161,3,1,0,116,19,124, + 3,124,6,106,18,131,2,1,0,87,0,110,16,1,0,1, + 0,1,0,116,4,106,5,124,1,61,0,130,0,122,14,116, + 4,106,5,124,1,25,0,125,6,87,0,110,28,4,0,116, + 20,121,250,1,0,1,0,1,0,116,21,100,4,124,1,155, + 2,100,5,157,3,131,1,130,1,116,22,160,23,100,6,124, + 1,124,5,161,3,1,0,124,6,83,0,119,0,41,7,97, + 64,1,0,0,108,111,97,100,95,109,111,100,117,108,101,40, + 102,117,108,108,110,97,109,101,41,32,45,62,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,32,32,32,32,76,111, + 97,100,32,116,104,101,32,109,111,100,117,108,101,32,115,112, + 101,99,105,102,105,101,100,32,98,121,32,39,102,117,108,108, + 110,97,109,101,39,46,32,39,102,117,108,108,110,97,109,101, + 39,32,109,117,115,116,32,98,101,32,116,104,101,10,32,32, + 32,32,32,32,32,32,102,117,108,108,121,32,113,117,97,108, + 105,102,105,101,100,32,40,100,111,116,116,101,100,41,32,109, + 111,100,117,108,101,32,110,97,109,101,46,32,73,116,32,114, + 101,116,117,114,110,115,32,116,104,101,32,105,109,112,111,114, + 116,101,100,10,32,32,32,32,32,32,32,32,109,111,100,117, + 108,101,44,32,111,114,32,114,97,105,115,101,115,32,90,105, + 112,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, + 105,116,32,99,111,117,108,100,32,110,111,116,32,98,101,32, + 105,109,112,111,114,116,101,100,46,10,10,32,32,32,32,32, + 32,32,32,68,101,112,114,101,99,97,116,101,100,32,115,105, + 110,99,101,32,80,121,116,104,111,110,32,51,46,49,48,46, + 32,85,115,101,32,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,105,110,115,116,101,97,100,46,10,32,32,32,32, + 32,32,32,32,122,114,122,105,112,105,109,112,111,114,116,46, + 122,105,112,105,109,112,111,114,116,101,114,46,108,111,97,100, + 95,109,111,100,117,108,101,40,41,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,32,97,110,100,32,115,108,97,116, + 101,100,32,102,111,114,32,114,101,109,111,118,97,108,32,105, + 110,32,80,121,116,104,111,110,32,51,46,49,50,59,32,117, + 115,101,32,101,120,101,99,95,109,111,100,117,108,101,40,41, + 32,105,110,115,116,101,97,100,78,218,12,95,95,98,117,105, + 108,116,105,110,115,95,95,122,14,76,111,97,100,101,100,32, + 109,111,100,117,108,101,32,122,25,32,110,111,116,32,102,111, + 117,110,100,32,105,110,32,115,121,115,46,109,111,100,117,108, + 101,115,122,30,105,109,112,111,114,116,32,123,125,32,35,32, + 108,111,97,100,101,100,32,102,114,111,109,32,90,105,112,32, + 123,125,41,24,218,9,95,119,97,114,110,105,110,103,115,90, + 4,119,97,114,110,218,18,68,101,112,114,101,99,97,116,105, + 111,110,87,97,114,110,105,110,103,114,48,0,0,0,218,3, + 115,121,115,218,7,109,111,100,117,108,101,115,218,3,103,101, + 116,114,15,0,0,0,218,12,95,109,111,100,117,108,101,95, + 116,121,112,101,218,10,95,95,108,111,97,100,101,114,95,95, + 114,36,0,0,0,114,21,0,0,0,114,30,0,0,0,114, + 29,0,0,0,90,8,95,95,112,97,116,104,95,95,218,7, + 104,97,115,97,116,116,114,114,68,0,0,0,90,14,95,102, + 105,120,95,117,112,95,109,111,100,117,108,101,218,8,95,95, + 100,105,99,116,95,95,218,4,101,120,101,99,114,26,0,0, + 0,218,11,73,109,112,111,114,116,69,114,114,111,114,114,45, + 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, + 115,115,97,103,101,41,9,114,32,0,0,0,114,38,0,0, + 0,218,3,109,115,103,114,50,0,0,0,114,51,0,0,0, + 114,40,0,0,0,90,3,109,111,100,114,13,0,0,0,114, + 66,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, + 10,1,0,0,115,56,0,0,0,4,9,12,2,16,1,12, + 1,18,1,8,1,10,1,6,1,2,2,4,1,10,3,14, + 1,8,1,10,2,6,1,16,1,16,1,6,1,8,1,2, + 1,2,2,14,1,12,1,16,1,14,1,4,1,2,253,255, + 128,122,23,122,105,112,105,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,0,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,64,0,0,0,122,20,124,0,160,0,124,1, + 161,1,115,18,87,0,100,1,83,0,87,0,110,18,4,0, + 116,1,121,62,1,0,1,0,1,0,89,0,100,1,83,0, + 100,2,100,3,108,2,109,3,125,2,1,0,124,2,124,0, + 124,1,131,2,83,0,119,0,41,4,122,204,82,101,116,117, + 114,110,32,116,104,101,32,82,101,115,111,117,114,99,101,82, + 101,97,100,101,114,32,102,111,114,32,97,32,112,97,99,107, + 97,103,101,32,105,110,32,97,32,122,105,112,32,102,105,108, + 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,39, + 102,117,108,108,110,97,109,101,39,32,105,115,32,97,32,112, + 97,99,107,97,103,101,32,119,105,116,104,105,110,32,116,104, + 101,32,122,105,112,32,102,105,108,101,44,32,114,101,116,117, + 114,110,32,116,104,101,10,32,32,32,32,32,32,32,32,39, + 82,101,115,111,117,114,99,101,82,101,97,100,101,114,39,32, + 111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,112, + 97,99,107,97,103,101,46,32,32,79,116,104,101,114,119,105, + 115,101,32,114,101,116,117,114,110,32,78,111,110,101,46,10, + 32,32,32,32,32,32,32,32,78,114,0,0,0,0,41,1, + 218,9,90,105,112,82,101,97,100,101,114,41,4,114,43,0, + 0,0,114,3,0,0,0,90,17,105,109,112,111,114,116,108, + 105,98,46,114,101,97,100,101,114,115,114,83,0,0,0,41, + 3,114,32,0,0,0,114,38,0,0,0,114,83,0,0,0, 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 11,108,111,97,100,95,109,111,100,117,108,101,10,1,0,0, - 115,56,0,0,0,4,9,12,2,16,1,12,1,18,1,8, - 1,10,1,6,1,2,2,4,1,10,3,14,1,8,1,10, - 2,6,1,16,1,16,1,6,1,8,1,2,1,2,2,14, - 1,12,1,16,1,14,1,4,1,2,253,255,128,122,23,122, - 105,112,105,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,0,0, - 0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,115, - 64,0,0,0,122,20,124,0,160,0,124,1,161,1,115,18, - 87,0,100,1,83,0,87,0,110,18,4,0,116,1,121,62, - 1,0,1,0,1,0,89,0,100,1,83,0,100,2,100,3, - 108,2,109,3,125,2,1,0,124,2,124,0,124,1,131,2, - 83,0,119,0,41,4,122,204,82,101,116,117,114,110,32,116, - 104,101,32,82,101,115,111,117,114,99,101,82,101,97,100,101, - 114,32,102,111,114,32,97,32,112,97,99,107,97,103,101,32, - 105,110,32,97,32,122,105,112,32,102,105,108,101,46,10,10, - 32,32,32,32,32,32,32,32,73,102,32,39,102,117,108,108, - 110,97,109,101,39,32,105,115,32,97,32,112,97,99,107,97, - 103,101,32,119,105,116,104,105,110,32,116,104,101,32,122,105, - 112,32,102,105,108,101,44,32,114,101,116,117,114,110,32,116, - 104,101,10,32,32,32,32,32,32,32,32,39,82,101,115,111, - 117,114,99,101,82,101,97,100,101,114,39,32,111,98,106,101, - 99,116,32,102,111,114,32,116,104,101,32,112,97,99,107,97, - 103,101,46,32,32,79,116,104,101,114,119,105,115,101,32,114, - 101,116,117,114,110,32,78,111,110,101,46,10,32,32,32,32, - 32,32,32,32,78,114,0,0,0,0,41,1,218,9,90,105, - 112,82,101,97,100,101,114,41,4,114,43,0,0,0,114,3, - 0,0,0,90,17,105,109,112,111,114,116,108,105,98,46,114, - 101,97,100,101,114,115,114,83,0,0,0,41,3,114,32,0, - 0,0,114,38,0,0,0,114,83,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,19,103,101,116, + 19,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, + 97,100,101,114,53,1,0,0,115,18,0,0,0,2,6,10, + 1,10,1,12,1,6,1,12,1,10,1,2,253,255,128,122, + 31,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, - 53,1,0,0,115,18,0,0,0,2,6,10,1,10,1,12, - 1,6,1,12,1,10,1,2,253,255,128,122,31,122,105,112, - 105,109,112,111,114,116,101,114,46,103,101,116,95,114,101,115, - 111,117,114,99,101,95,114,101,97,100,101,114,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0, - 0,67,0,0,0,115,24,0,0,0,100,1,124,0,106,0, - 155,0,116,1,155,0,124,0,106,2,155,0,100,2,157,5, - 83,0,41,3,78,122,21,60,122,105,112,105,109,112,111,114, - 116,101,114,32,111,98,106,101,99,116,32,34,122,2,34,62, - 41,3,114,29,0,0,0,114,20,0,0,0,114,31,0,0, - 0,41,1,114,32,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,8,95,95,114,101,112,114,95, - 95,68,1,0,0,115,4,0,0,0,24,1,255,128,122,20, - 122,105,112,105,109,112,111,114,116,101,114,46,95,95,114,101, - 112,114,95,95,41,1,78,41,1,78,41,1,78,41,16,114, - 6,0,0,0,114,7,0,0,0,114,8,0,0,0,218,7, - 95,95,100,111,99,95,95,114,34,0,0,0,114,41,0,0, - 0,114,42,0,0,0,114,46,0,0,0,114,52,0,0,0, - 114,59,0,0,0,114,60,0,0,0,114,67,0,0,0,114, - 43,0,0,0,114,82,0,0,0,114,84,0,0,0,114,85, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,114,4,0,0,0,46,0,0,0, - 115,30,0,0,0,8,0,4,1,8,17,10,46,10,34,10, - 13,8,27,8,10,8,21,8,12,8,26,8,13,8,43,12, - 15,255,128,122,12,95,95,105,110,105,116,95,95,46,112,121, - 99,84,114,63,0,0,0,70,41,3,122,4,46,112,121,99, - 84,70,41,3,114,64,0,0,0,70,70,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 67,0,0,0,115,20,0,0,0,124,0,106,0,124,1,160, - 1,100,1,161,1,100,2,25,0,23,0,83,0,41,3,78, - 218,1,46,233,2,0,0,0,41,2,114,31,0,0,0,218, - 10,114,112,97,114,116,105,116,105,111,110,41,2,114,32,0, - 0,0,114,38,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,114,36,0,0,0,86,1,0,0,115, - 4,0,0,0,20,1,255,128,114,36,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0, - 0,0,67,0,0,0,115,18,0,0,0,124,1,116,0,23, - 0,125,2,124,2,124,0,106,1,118,0,83,0,169,1,78, - 41,2,114,20,0,0,0,114,28,0,0,0,41,3,114,32, - 0,0,0,114,13,0,0,0,90,7,100,105,114,112,97,116, - 104,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 114,37,0,0,0,90,1,0,0,115,6,0,0,0,8,4, - 10,2,255,128,114,37,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,7,0,0,0,4,0,0,0,67,0, - 0,0,115,54,0,0,0,116,0,124,0,124,1,131,2,125, - 2,116,1,68,0,93,34,92,3,125,3,125,4,125,5,124, - 2,124,3,23,0,125,6,124,6,124,0,106,2,118,0,114, - 14,124,5,2,0,1,0,83,0,100,0,83,0,114,90,0, - 0,0,41,3,114,36,0,0,0,218,16,95,122,105,112,95, - 115,101,97,114,99,104,111,114,100,101,114,114,28,0,0,0, - 41,7,114,32,0,0,0,114,38,0,0,0,114,13,0,0, - 0,218,6,115,117,102,102,105,120,218,10,105,115,98,121,116, - 101,99,111,100,101,114,51,0,0,0,114,66,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,35, - 0,0,0,99,1,0,0,115,14,0,0,0,10,1,14,1, - 8,1,10,1,8,1,4,1,255,128,114,35,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0, - 9,0,0,0,67,0,0,0,115,236,4,0,0,122,14,116, - 0,160,1,124,0,161,1,125,1,87,0,110,32,4,0,116, - 2,144,4,121,234,1,0,1,0,1,0,116,3,100,1,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,124,1,144, - 4,143,130,1,0,122,36,124,1,160,4,116,5,11,0,100, - 3,161,2,1,0,124,1,160,6,161,0,125,2,124,1,160, - 7,116,5,161,1,125,3,87,0,110,32,4,0,116,2,144, - 4,121,232,1,0,1,0,1,0,116,3,100,4,124,0,155, - 2,157,2,124,0,100,2,141,2,130,1,116,8,124,3,131, - 1,116,5,107,3,114,156,116,3,100,4,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,124,3,100,0,100,5,133, - 2,25,0,116,9,107,3,144,1,114,152,122,24,124,1,160, - 4,100,6,100,3,161,2,1,0,124,1,160,6,161,0,125, - 4,87,0,110,32,4,0,116,2,144,4,121,230,1,0,1, - 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,116,10,124,4,116,11,24,0,116,5,24, - 0,100,6,131,2,125,5,122,22,124,1,160,4,124,5,161, - 1,1,0,124,1,160,7,161,0,125,6,87,0,110,32,4, - 0,116,2,144,4,121,228,1,0,1,0,1,0,116,3,100, - 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124, - 6,160,12,116,9,161,1,125,7,124,7,100,6,107,0,144, - 1,114,88,116,3,100,7,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,124,6,124,7,124,7,116,5,23,0,133, - 2,25,0,125,3,116,8,124,3,131,1,116,5,107,3,144, - 1,114,136,116,3,100,8,124,0,155,2,157,2,124,0,100, - 2,141,2,130,1,124,4,116,8,124,6,131,1,24,0,124, - 7,23,0,125,2,116,13,124,3,100,9,100,10,133,2,25, - 0,131,1,125,8,116,13,124,3,100,10,100,11,133,2,25, - 0,131,1,125,9,124,2,124,8,107,0,144,1,114,212,116, - 3,100,12,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,124,2,124,9,107,0,144,1,114,240,116,3,100,13,124, - 0,155,2,157,2,124,0,100,2,141,2,130,1,124,2,124, - 8,56,0,125,2,124,2,124,9,24,0,125,10,124,10,100, - 6,107,0,144,2,114,28,116,3,100,14,124,0,155,2,157, - 2,124,0,100,2,141,2,130,1,105,0,125,11,100,6,125, - 12,122,14,124,1,160,4,124,2,161,1,1,0,87,0,110, - 32,4,0,116,2,144,4,121,226,1,0,1,0,1,0,116, - 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, - 1,9,0,124,1,160,7,100,16,161,1,125,3,116,8,124, - 3,131,1,100,5,107,0,144,2,114,118,116,14,100,17,131, - 1,130,1,124,3,100,0,100,5,133,2,25,0,100,18,107, - 3,144,2,114,140,144,4,113,170,116,8,124,3,131,1,100, - 16,107,3,144,2,114,162,116,14,100,17,131,1,130,1,116, - 15,124,3,100,19,100,20,133,2,25,0,131,1,125,13,116, - 15,124,3,100,20,100,9,133,2,25,0,131,1,125,14,116, - 15,124,3,100,9,100,21,133,2,25,0,131,1,125,15,116, - 15,124,3,100,21,100,10,133,2,25,0,131,1,125,16,116, - 13,124,3,100,10,100,11,133,2,25,0,131,1,125,17,116, - 13,124,3,100,11,100,22,133,2,25,0,131,1,125,18,116, - 13,124,3,100,22,100,23,133,2,25,0,131,1,125,4,116, - 15,124,3,100,23,100,24,133,2,25,0,131,1,125,19,116, - 15,124,3,100,24,100,25,133,2,25,0,131,1,125,20,116, - 15,124,3,100,25,100,26,133,2,25,0,131,1,125,21,116, - 13,124,3,100,27,100,16,133,2,25,0,131,1,125,22,124, - 19,124,20,23,0,124,21,23,0,125,8,124,22,124,9,107, - 4,144,3,114,122,116,3,100,28,124,0,155,2,157,2,124, - 0,100,2,141,2,130,1,124,22,124,10,55,0,125,22,122, - 14,124,1,160,7,124,19,161,1,125,23,87,0,110,32,4, - 0,116,2,144,4,121,224,1,0,1,0,1,0,116,3,100, - 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,116, - 8,124,23,131,1,124,19,107,3,144,3,114,210,116,3,100, - 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,122, - 50,116,8,124,1,160,7,124,8,124,19,24,0,161,1,131, - 1,124,8,124,19,24,0,107,3,144,4,114,2,116,3,100, - 4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,87, - 0,110,32,4,0,116,2,144,4,121,222,1,0,1,0,1, - 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, - 2,130,1,124,13,100,29,64,0,144,4,114,58,124,23,160, - 16,161,0,125,23,110,48,122,14,124,23,160,16,100,30,161, - 1,125,23,87,0,110,32,4,0,116,17,144,4,121,220,1, - 0,1,0,1,0,124,23,160,16,100,31,161,1,160,18,116, - 19,161,1,125,23,89,0,124,23,160,20,100,32,116,21,161, - 2,125,23,116,22,160,23,124,0,124,23,161,2,125,24,124, - 24,124,14,124,18,124,4,124,22,124,15,124,16,124,17,102, - 8,125,25,124,25,124,11,124,23,60,0,124,12,100,33,55, - 0,125,12,144,2,113,86,87,0,100,0,4,0,4,0,131, - 3,1,0,110,18,49,0,144,4,115,192,119,1,1,0,1, - 0,1,0,89,0,1,0,116,24,160,25,100,34,124,12,124, - 0,161,3,1,0,124,11,83,0,119,0,119,0,119,0,119, - 0,119,0,119,0,119,0,119,0,41,35,78,122,21,99,97, - 110,39,116,32,111,112,101,110,32,90,105,112,32,102,105,108, - 101,58,32,114,12,0,0,0,114,88,0,0,0,250,21,99, - 97,110,39,116,32,114,101,97,100,32,90,105,112,32,102,105, - 108,101,58,32,233,4,0,0,0,114,0,0,0,0,122,16, - 110,111,116,32,97,32,90,105,112,32,102,105,108,101,58,32, - 122,18,99,111,114,114,117,112,116,32,90,105,112,32,102,105, - 108,101,58,32,233,12,0,0,0,233,16,0,0,0,233,20, - 0,0,0,122,28,98,97,100,32,99,101,110,116,114,97,108, - 32,100,105,114,101,99,116,111,114,121,32,115,105,122,101,58, - 32,122,30,98,97,100,32,99,101,110,116,114,97,108,32,100, - 105,114,101,99,116,111,114,121,32,111,102,102,115,101,116,58, - 32,122,38,98,97,100,32,99,101,110,116,114,97,108,32,100, - 105,114,101,99,116,111,114,121,32,115,105,122,101,32,111,114, - 32,111,102,102,115,101,116,58,32,84,233,46,0,0,0,250, - 27,69,79,70,32,114,101,97,100,32,119,104,101,114,101,32, - 110,111,116,32,101,120,112,101,99,116,101,100,115,4,0,0, - 0,80,75,1,2,233,8,0,0,0,233,10,0,0,0,233, - 14,0,0,0,233,24,0,0,0,233,28,0,0,0,233,30, - 0,0,0,233,32,0,0,0,233,34,0,0,0,233,42,0, - 0,0,122,25,98,97,100,32,108,111,99,97,108,32,104,101, - 97,100,101,114,32,111,102,102,115,101,116,58,32,105,0,8, - 0,0,218,5,97,115,99,105,105,90,6,108,97,116,105,110, - 49,250,1,47,114,5,0,0,0,122,33,122,105,112,105,109, - 112,111,114,116,58,32,102,111,117,110,100,32,123,125,32,110, - 97,109,101,115,32,105,110,32,123,33,114,125,41,26,218,3, - 95,105,111,218,9,111,112,101,110,95,99,111,100,101,114,22, - 0,0,0,114,3,0,0,0,218,4,115,101,101,107,218,20, - 69,78,68,95,67,69,78,84,82,65,76,95,68,73,82,95, - 83,73,90,69,90,4,116,101,108,108,218,4,114,101,97,100, - 114,55,0,0,0,218,18,83,84,82,73,78,71,95,69,78, - 68,95,65,82,67,72,73,86,69,218,3,109,97,120,218,15, - 77,65,88,95,67,79,77,77,69,78,84,95,76,69,78,218, - 5,114,102,105,110,100,114,2,0,0,0,218,8,69,79,70, - 69,114,114,111,114,114,1,0,0,0,114,65,0,0,0,218, - 18,85,110,105,99,111,100,101,68,101,99,111,100,101,69,114, - 114,111,114,218,9,116,114,97,110,115,108,97,116,101,218,11, - 99,112,52,51,55,95,116,97,98,108,101,114,19,0,0,0, - 114,20,0,0,0,114,21,0,0,0,114,30,0,0,0,114, - 45,0,0,0,114,80,0,0,0,41,26,114,29,0,0,0, - 218,2,102,112,90,15,104,101,97,100,101,114,95,112,111,115, - 105,116,105,111,110,218,6,98,117,102,102,101,114,218,9,102, - 105,108,101,95,115,105,122,101,90,17,109,97,120,95,99,111, - 109,109,101,110,116,95,115,116,97,114,116,218,4,100,97,116, - 97,90,3,112,111,115,218,11,104,101,97,100,101,114,95,115, - 105,122,101,90,13,104,101,97,100,101,114,95,111,102,102,115, - 101,116,90,10,97,114,99,95,111,102,102,115,101,116,114,33, - 0,0,0,218,5,99,111,117,110,116,218,5,102,108,97,103, - 115,218,8,99,111,109,112,114,101,115,115,218,4,116,105,109, - 101,218,4,100,97,116,101,218,3,99,114,99,218,9,100,97, - 116,97,95,115,105,122,101,218,9,110,97,109,101,95,115,105, - 122,101,218,10,101,120,116,114,97,95,115,105,122,101,90,12, - 99,111,109,109,101,110,116,95,115,105,122,101,218,11,102,105, - 108,101,95,111,102,102,115,101,116,114,44,0,0,0,114,13, - 0,0,0,218,1,116,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,114,27,0,0,0,130,1,0,0,115,234, - 0,0,0,2,1,14,1,14,1,18,1,8,2,2,1,14, - 1,8,1,14,1,14,1,18,1,12,1,18,1,18,1,2, - 3,12,1,12,1,14,1,10,1,2,1,6,255,8,2,2, - 1,2,255,2,1,4,255,2,2,10,1,12,1,14,1,10, - 1,2,1,6,255,10,2,10,1,10,1,2,1,6,255,16, - 2,14,1,10,1,2,1,6,255,16,2,16,2,16,1,10, - 1,18,1,10,1,18,1,8,1,8,1,10,1,18,1,4, - 2,4,2,2,1,14,1,14,1,18,1,2,1,10,1,14, - 1,8,1,18,2,4,1,14,1,8,1,16,1,16,1,16, - 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16, - 1,12,1,10,1,18,1,8,1,2,2,14,1,14,1,18, - 1,14,1,18,1,2,4,28,1,22,1,14,1,18,1,10, - 2,10,2,2,3,14,1,14,1,18,1,12,2,12,1,20, - 1,8,1,8,1,36,202,14,55,4,1,2,247,2,246,2, - 246,2,227,2,227,2,248,2,246,2,248,255,128,114,27,0, - 0,0,117,190,1,0,0,0,1,2,3,4,5,6,7,8, - 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, - 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, - 41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56, - 57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72, - 73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88, - 89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104, - 105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120, - 121,122,123,124,125,126,127,195,135,195,188,195,169,195,162,195, - 164,195,160,195,165,195,167,195,170,195,171,195,168,195,175,195, - 174,195,172,195,132,195,133,195,137,195,166,195,134,195,180,195, - 182,195,178,195,187,195,185,195,191,195,150,195,156,194,162,194, - 163,194,165,226,130,167,198,146,195,161,195,173,195,179,195,186, - 195,177,195,145,194,170,194,186,194,191,226,140,144,194,172,194, - 189,194,188,194,161,194,171,194,187,226,150,145,226,150,146,226, - 150,147,226,148,130,226,148,164,226,149,161,226,149,162,226,149, - 150,226,149,149,226,149,163,226,149,145,226,149,151,226,149,157, - 226,149,156,226,149,155,226,148,144,226,148,148,226,148,180,226, - 148,172,226,148,156,226,148,128,226,148,188,226,149,158,226,149, - 159,226,149,154,226,149,148,226,149,169,226,149,166,226,149,160, - 226,149,144,226,149,172,226,149,167,226,149,168,226,149,164,226, - 149,165,226,149,153,226,149,152,226,149,146,226,149,147,226,149, - 171,226,149,170,226,148,152,226,148,140,226,150,136,226,150,132, - 226,150,140,226,150,144,226,150,128,206,177,195,159,206,147,207, - 128,206,163,207,131,194,181,207,132,206,166,206,152,206,169,206, - 180,226,136,158,207,134,206,181,226,136,169,226,137,161,194,177, - 226,137,165,226,137,164,226,140,160,226,140,161,195,183,226,137, - 136,194,176,226,136,153,194,183,226,136,154,226,129,191,194,178, - 226,150,160,194,160,99,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,8,0,0,0,67,0,0,0,115,106, - 0,0,0,116,0,114,22,116,1,160,2,100,1,161,1,1, - 0,116,3,100,2,131,1,130,1,100,3,97,0,122,56,122, - 16,100,4,100,5,108,4,109,5,125,0,1,0,87,0,110, - 30,4,0,116,6,121,104,1,0,1,0,1,0,116,1,160, - 2,100,1,161,1,1,0,116,3,100,2,131,1,130,1,87, - 0,100,6,97,0,110,6,100,6,97,0,119,0,116,1,160, - 2,100,7,161,1,1,0,124,0,83,0,119,0,41,8,78, - 122,27,122,105,112,105,109,112,111,114,116,58,32,122,108,105, - 98,32,85,78,65,86,65,73,76,65,66,76,69,250,41,99, - 97,110,39,116,32,100,101,99,111,109,112,114,101,115,115,32, - 100,97,116,97,59,32,122,108,105,98,32,110,111,116,32,97, - 118,97,105,108,97,98,108,101,84,114,0,0,0,0,169,1, - 218,10,100,101,99,111,109,112,114,101,115,115,70,122,25,122, - 105,112,105,109,112,111,114,116,58,32,122,108,105,98,32,97, - 118,97,105,108,97,98,108,101,41,7,218,15,95,105,109,112, - 111,114,116,105,110,103,95,122,108,105,98,114,45,0,0,0, - 114,80,0,0,0,114,3,0,0,0,90,4,122,108,105,98, - 114,143,0,0,0,218,9,69,120,99,101,112,116,105,111,110, - 114,142,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,218,20,95,103,101,116,95,100,101,99,111,109, - 112,114,101,115,115,95,102,117,110,99,32,2,0,0,115,30, - 0,0,0,4,2,10,3,8,1,4,2,4,1,16,1,12, - 1,10,1,8,1,2,128,12,2,10,2,4,1,2,249,255, - 128,114,146,0,0,0,99,2,0,0,0,0,0,0,0,0, - 0,0,0,17,0,0,0,9,0,0,0,67,0,0,0,115, - 134,1,0,0,124,1,92,8,125,2,125,3,125,4,125,5, - 125,6,125,7,125,8,125,9,124,4,100,1,107,0,114,36, - 116,0,100,2,131,1,130,1,116,1,160,2,124,0,161,1, - 144,1,143,4,125,10,122,14,124,10,160,3,124,6,161,1, - 1,0,87,0,110,32,4,0,116,4,144,1,121,132,1,0, - 1,0,1,0,116,0,100,3,124,0,155,2,157,2,124,0, - 100,4,141,2,130,1,124,10,160,5,100,5,161,1,125,11, - 116,6,124,11,131,1,100,5,107,3,114,128,116,7,100,6, - 131,1,130,1,124,11,100,0,100,7,133,2,25,0,100,8, - 107,3,114,162,116,0,100,9,124,0,155,2,157,2,124,0, - 100,4,141,2,130,1,116,8,124,11,100,10,100,11,133,2, - 25,0,131,1,125,12,116,8,124,11,100,11,100,5,133,2, - 25,0,131,1,125,13,100,5,124,12,23,0,124,13,23,0, - 125,14,124,6,124,14,55,0,125,6,122,14,124,10,160,3, - 124,6,161,1,1,0,87,0,110,32,4,0,116,4,144,1, - 121,130,1,0,1,0,1,0,116,0,100,3,124,0,155,2, - 157,2,124,0,100,4,141,2,130,1,124,10,160,5,124,4, - 161,1,125,15,116,6,124,15,131,1,124,4,107,3,144,1, - 114,38,116,4,100,12,131,1,130,1,87,0,100,0,4,0, - 4,0,131,3,1,0,110,18,49,0,144,1,115,60,119,1, - 1,0,1,0,1,0,89,0,1,0,124,3,100,1,107,2, - 144,1,114,84,124,15,83,0,122,10,116,9,131,0,125,16, - 87,0,110,22,4,0,116,10,144,1,121,128,1,0,1,0, - 1,0,116,0,100,13,131,1,130,1,124,16,124,15,100,14, - 131,2,83,0,119,0,119,0,119,0,41,15,78,114,0,0, - 0,0,122,18,110,101,103,97,116,105,118,101,32,100,97,116, - 97,32,115,105,122,101,114,94,0,0,0,114,12,0,0,0, - 114,106,0,0,0,114,100,0,0,0,114,95,0,0,0,115, - 4,0,0,0,80,75,3,4,122,23,98,97,100,32,108,111, - 99,97,108,32,102,105,108,101,32,104,101,97,100,101,114,58, - 32,233,26,0,0,0,114,105,0,0,0,122,26,122,105,112, - 105,109,112,111,114,116,58,32,99,97,110,39,116,32,114,101, - 97,100,32,100,97,116,97,114,141,0,0,0,105,241,255,255, - 255,41,11,114,3,0,0,0,114,112,0,0,0,114,113,0, - 0,0,114,114,0,0,0,114,22,0,0,0,114,116,0,0, - 0,114,55,0,0,0,114,121,0,0,0,114,1,0,0,0, - 114,146,0,0,0,114,145,0,0,0,41,17,114,29,0,0, - 0,114,58,0,0,0,90,8,100,97,116,97,112,97,116,104, - 114,132,0,0,0,114,136,0,0,0,114,127,0,0,0,114, - 139,0,0,0,114,133,0,0,0,114,134,0,0,0,114,135, - 0,0,0,114,125,0,0,0,114,126,0,0,0,114,137,0, - 0,0,114,138,0,0,0,114,129,0,0,0,90,8,114,97, - 119,95,100,97,116,97,114,143,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,114,56,0,0,0,53, - 2,0,0,115,70,0,0,0,20,1,8,1,8,1,14,2, - 2,2,14,1,14,1,18,1,10,1,12,1,8,1,16,2, - 18,2,16,2,16,1,12,1,8,1,2,1,14,1,14,1, - 18,1,10,1,14,1,40,1,10,2,4,2,2,3,10,1, - 14,1,8,1,10,1,2,254,2,243,2,240,255,128,114,56, - 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,16,0,0, - 0,116,0,124,0,124,1,24,0,131,1,100,1,107,1,83, - 0,41,2,78,114,5,0,0,0,41,1,218,3,97,98,115, - 41,2,90,2,116,49,90,2,116,50,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,9,95,101,113,95,109, - 116,105,109,101,99,2,0,0,115,4,0,0,0,16,2,255, - 128,114,149,0,0,0,99,5,0,0,0,0,0,0,0,0, - 0,0,0,14,0,0,0,6,0,0,0,67,0,0,0,115, - 254,0,0,0,124,3,124,2,100,1,156,2,125,5,116,0, - 160,1,124,4,124,3,124,5,161,3,125,6,124,6,100,2, - 64,0,100,3,107,3,125,7,124,7,114,126,124,6,100,4, - 64,0,100,3,107,3,125,8,116,2,106,3,100,5,107,3, - 114,206,124,8,115,76,116,2,106,3,100,6,107,2,114,206, - 116,4,124,0,124,2,131,2,125,9,124,9,100,0,117,1, - 114,206,116,2,160,5,116,0,106,6,124,9,161,2,125,10, - 116,0,160,7,124,4,124,10,124,3,124,5,161,4,1,0, - 110,80,116,8,124,0,124,2,131,2,92,2,125,11,125,12, - 124,11,114,206,116,9,116,10,124,4,100,7,100,8,133,2, - 25,0,131,1,124,11,131,2,114,186,116,10,124,4,100,8, - 100,9,133,2,25,0,131,1,124,12,107,3,114,206,116,11, - 160,12,100,10,124,3,155,2,157,2,161,1,1,0,100,0, - 83,0,116,13,160,14,124,4,100,9,100,0,133,2,25,0, - 161,1,125,13,116,15,124,13,116,16,131,2,115,250,116,17, - 100,11,124,1,155,2,100,12,157,3,131,1,130,1,124,13, - 83,0,41,13,78,41,2,114,44,0,0,0,114,13,0,0, - 0,114,5,0,0,0,114,0,0,0,0,114,88,0,0,0, - 90,5,110,101,118,101,114,90,6,97,108,119,97,121,115,114, - 101,0,0,0,114,96,0,0,0,114,97,0,0,0,122,22, - 98,121,116,101,99,111,100,101,32,105,115,32,115,116,97,108, - 101,32,102,111,114,32,122,16,99,111,109,112,105,108,101,100, - 32,109,111,100,117,108,101,32,122,21,32,105,115,32,110,111, - 116,32,97,32,99,111,100,101,32,111,98,106,101,99,116,41, - 18,114,21,0,0,0,90,13,95,99,108,97,115,115,105,102, - 121,95,112,121,99,218,4,95,105,109,112,90,21,99,104,101, - 99,107,95,104,97,115,104,95,98,97,115,101,100,95,112,121, - 99,115,218,15,95,103,101,116,95,112,121,99,95,115,111,117, - 114,99,101,218,11,115,111,117,114,99,101,95,104,97,115,104, - 90,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, - 66,69,82,90,18,95,118,97,108,105,100,97,116,101,95,104, - 97,115,104,95,112,121,99,218,29,95,103,101,116,95,109,116, - 105,109,101,95,97,110,100,95,115,105,122,101,95,111,102,95, - 115,111,117,114,99,101,114,149,0,0,0,114,2,0,0,0, - 114,45,0,0,0,114,80,0,0,0,218,7,109,97,114,115, - 104,97,108,90,5,108,111,97,100,115,114,15,0,0,0,218, - 10,95,99,111,100,101,95,116,121,112,101,218,9,84,121,112, - 101,69,114,114,111,114,41,14,114,32,0,0,0,114,57,0, - 0,0,114,66,0,0,0,114,38,0,0,0,114,128,0,0, - 0,90,11,101,120,99,95,100,101,116,97,105,108,115,114,131, - 0,0,0,90,10,104,97,115,104,95,98,97,115,101,100,90, - 12,99,104,101,99,107,95,115,111,117,114,99,101,90,12,115, - 111,117,114,99,101,95,98,121,116,101,115,114,152,0,0,0, - 90,12,115,111,117,114,99,101,95,109,116,105,109,101,90,11, - 115,111,117,114,99,101,95,115,105,122,101,114,50,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 15,95,117,110,109,97,114,115,104,97,108,95,99,111,100,101, - 107,2,0,0,115,72,0,0,0,2,2,2,1,6,254,14, - 5,12,2,4,1,12,1,10,1,2,1,2,255,8,1,2, - 255,10,2,8,1,4,1,4,1,2,1,4,254,4,5,8, - 1,6,255,8,4,6,255,4,3,22,3,18,1,2,255,4, - 2,8,1,4,255,4,2,18,2,10,1,16,1,4,1,255, - 128,114,157,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, - 28,0,0,0,124,0,160,0,100,1,100,2,161,2,125,0, - 124,0,160,0,100,3,100,2,161,2,125,0,124,0,83,0, - 41,4,78,115,2,0,0,0,13,10,243,1,0,0,0,10, - 243,1,0,0,0,13,41,1,114,19,0,0,0,41,1,218, - 6,115,111,117,114,99,101,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,23,95,110,111,114,109,97,108,105, - 122,101,95,108,105,110,101,95,101,110,100,105,110,103,115,152, - 2,0,0,115,8,0,0,0,12,1,12,1,4,1,255,128, - 114,161,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,6,0,0,0,67,0,0,0,115,24, - 0,0,0,116,0,124,1,131,1,125,1,116,1,124,1,124, - 0,100,1,100,2,100,3,141,4,83,0,41,4,78,114,78, - 0,0,0,84,41,1,90,12,100,111,110,116,95,105,110,104, - 101,114,105,116,41,2,114,161,0,0,0,218,7,99,111,109, - 112,105,108,101,41,2,114,57,0,0,0,114,160,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 15,95,99,111,109,112,105,108,101,95,115,111,117,114,99,101, - 159,2,0,0,115,6,0,0,0,8,1,16,1,255,128,114, - 163,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,11,0,0,0,67,0,0,0,115,68,0, - 0,0,116,0,160,1,124,0,100,1,63,0,100,2,23,0, - 124,0,100,3,63,0,100,4,64,0,124,0,100,5,64,0, - 124,1,100,6,63,0,124,1,100,3,63,0,100,7,64,0, - 124,1,100,5,64,0,100,8,20,0,100,9,100,9,100,9, - 102,9,161,1,83,0,41,10,78,233,9,0,0,0,105,188, - 7,0,0,233,5,0,0,0,233,15,0,0,0,233,31,0, - 0,0,233,11,0,0,0,233,63,0,0,0,114,88,0,0, - 0,114,14,0,0,0,41,2,114,133,0,0,0,90,6,109, - 107,116,105,109,101,41,2,218,1,100,114,140,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,14, - 95,112,97,114,115,101,95,100,111,115,116,105,109,101,165,2, - 0,0,115,20,0,0,0,4,1,10,1,10,1,6,1,6, - 1,10,1,10,1,6,1,6,249,255,128,114,171,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,6,0,0, - 0,10,0,0,0,67,0,0,0,115,110,0,0,0,122,82, - 124,1,100,1,100,0,133,2,25,0,100,2,118,0,115,22, - 74,0,130,1,124,1,100,0,100,1,133,2,25,0,125,1, - 124,0,106,0,124,1,25,0,125,2,124,2,100,3,25,0, - 125,3,124,2,100,4,25,0,125,4,124,2,100,5,25,0, - 125,5,116,1,124,4,124,3,131,2,124,5,102,2,87,0, - 83,0,4,0,116,2,116,3,116,4,102,3,121,108,1,0, - 1,0,1,0,89,0,100,6,83,0,119,0,41,7,78,114, - 14,0,0,0,169,2,218,1,99,218,1,111,114,165,0,0, - 0,233,6,0,0,0,233,3,0,0,0,41,2,114,0,0, - 0,0,114,0,0,0,0,41,5,114,28,0,0,0,114,171, - 0,0,0,114,26,0,0,0,218,10,73,110,100,101,120,69, - 114,114,111,114,114,156,0,0,0,41,6,114,32,0,0,0, - 114,13,0,0,0,114,58,0,0,0,114,133,0,0,0,114, - 134,0,0,0,90,17,117,110,99,111,109,112,114,101,115,115, - 101,100,95,115,105,122,101,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,114,153,0,0,0,178,2,0,0,115, - 24,0,0,0,2,1,20,2,12,1,10,1,8,3,8,1, - 8,1,16,1,18,1,6,1,2,255,255,128,114,153,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,5,0,0,0,67,0,0,0,115,24,0,0,0,100,1, + 124,0,106,0,155,0,116,1,155,0,124,0,106,2,155,0, + 100,2,157,5,83,0,41,3,78,122,21,60,122,105,112,105, + 109,112,111,114,116,101,114,32,111,98,106,101,99,116,32,34, + 122,2,34,62,41,3,114,29,0,0,0,114,20,0,0,0, + 114,31,0,0,0,41,1,114,32,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,8,95,95,114, + 101,112,114,95,95,68,1,0,0,115,4,0,0,0,24,1, + 255,128,122,20,122,105,112,105,109,112,111,114,116,101,114,46, + 95,95,114,101,112,114,95,95,41,1,78,41,1,78,41,1, + 78,41,16,114,6,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,7,95,95,100,111,99,95,95,114,34,0,0,0, + 114,41,0,0,0,114,42,0,0,0,114,46,0,0,0,114, + 52,0,0,0,114,59,0,0,0,114,60,0,0,0,114,67, + 0,0,0,114,43,0,0,0,114,82,0,0,0,114,84,0, + 0,0,114,85,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,114,4,0,0,0, + 46,0,0,0,115,30,0,0,0,8,0,4,1,8,17,10, + 46,10,34,10,13,8,27,8,10,8,21,8,12,8,26,8, + 13,8,43,12,15,255,128,122,12,95,95,105,110,105,116,95, + 95,46,112,121,99,84,114,63,0,0,0,70,41,3,122,4, + 46,112,121,99,84,70,41,3,114,64,0,0,0,70,70,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,67,0,0,0,115,20,0,0,0,124,0,106, + 0,124,1,160,1,100,1,161,1,100,2,25,0,23,0,83, + 0,41,3,78,218,1,46,233,2,0,0,0,41,2,114,31, + 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,41, + 2,114,32,0,0,0,114,38,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,36,0,0,0,86, + 1,0,0,115,4,0,0,0,20,1,255,128,114,36,0,0, 0,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,8,0,0,0,67,0,0,0,115,80,0,0,0,124, - 1,100,1,100,0,133,2,25,0,100,2,118,0,115,20,74, - 0,130,1,124,1,100,0,100,1,133,2,25,0,125,1,122, - 14,124,0,106,0,124,1,25,0,125,2,87,0,110,18,4, - 0,116,1,121,78,1,0,1,0,1,0,89,0,100,0,83, - 0,116,2,124,0,106,3,124,2,131,2,83,0,119,0,41, - 3,78,114,14,0,0,0,114,172,0,0,0,41,4,114,28, - 0,0,0,114,26,0,0,0,114,56,0,0,0,114,29,0, - 0,0,41,3,114,32,0,0,0,114,13,0,0,0,114,58, + 0,0,2,0,0,0,67,0,0,0,115,18,0,0,0,124, + 1,116,0,23,0,125,2,124,2,124,0,106,1,118,0,83, + 0,169,1,78,41,2,114,20,0,0,0,114,28,0,0,0, + 41,3,114,32,0,0,0,114,13,0,0,0,90,7,100,105, + 114,112,97,116,104,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,37,0,0,0,90,1,0,0,115,6,0, + 0,0,8,4,10,2,255,128,114,37,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,7,0,0,0,4,0, + 0,0,67,0,0,0,115,56,0,0,0,116,0,124,0,124, + 1,131,2,125,2,116,1,68,0,93,36,92,3,125,3,125, + 4,125,5,124,2,124,3,23,0,125,6,124,6,124,0,106, + 2,118,0,114,50,124,5,2,0,1,0,83,0,113,14,100, + 0,83,0,114,90,0,0,0,41,3,114,36,0,0,0,218, + 16,95,122,105,112,95,115,101,97,114,99,104,111,114,100,101, + 114,114,28,0,0,0,41,7,114,32,0,0,0,114,38,0, + 0,0,114,13,0,0,0,218,6,115,117,102,102,105,120,218, + 10,105,115,98,121,116,101,99,111,100,101,114,51,0,0,0, + 114,66,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,35,0,0,0,99,1,0,0,115,16,0, + 0,0,10,1,14,1,8,1,10,1,8,1,2,128,4,1, + 255,128,114,35,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,26,0,0,0,9,0,0,0,67,0,0,0, + 115,236,4,0,0,122,14,116,0,160,1,124,0,161,1,125, + 1,87,0,110,32,4,0,116,2,144,4,121,234,1,0,1, + 0,1,0,116,3,100,1,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,124,1,144,4,143,130,1,0,122,36,124, + 1,160,4,116,5,11,0,100,3,161,2,1,0,124,1,160, + 6,161,0,125,2,124,1,160,7,116,5,161,1,125,3,87, + 0,110,32,4,0,116,2,144,4,121,232,1,0,1,0,1, + 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141, + 2,130,1,116,8,124,3,131,1,116,5,107,3,114,156,116, + 3,100,4,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,124,3,100,0,100,5,133,2,25,0,116,9,107,3,144, + 1,114,152,122,24,124,1,160,4,100,6,100,3,161,2,1, + 0,124,1,160,6,161,0,125,4,87,0,110,32,4,0,116, + 2,144,4,121,230,1,0,1,0,1,0,116,3,100,4,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,116,10,124, + 4,116,11,24,0,116,5,24,0,100,6,131,2,125,5,122, + 22,124,1,160,4,124,5,161,1,1,0,124,1,160,7,161, + 0,125,6,87,0,110,32,4,0,116,2,144,4,121,228,1, + 0,1,0,1,0,116,3,100,4,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,124,6,160,12,116,9,161,1,125, + 7,124,7,100,6,107,0,144,1,114,88,116,3,100,7,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,124,6,124, + 7,124,7,116,5,23,0,133,2,25,0,125,3,116,8,124, + 3,131,1,116,5,107,3,144,1,114,136,116,3,100,8,124, + 0,155,2,157,2,124,0,100,2,141,2,130,1,124,4,116, + 8,124,6,131,1,24,0,124,7,23,0,125,2,116,13,124, + 3,100,9,100,10,133,2,25,0,131,1,125,8,116,13,124, + 3,100,10,100,11,133,2,25,0,131,1,125,9,124,2,124, + 8,107,0,144,1,114,212,116,3,100,12,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,124,2,124,9,107,0,144, + 1,114,240,116,3,100,13,124,0,155,2,157,2,124,0,100, + 2,141,2,130,1,124,2,124,8,56,0,125,2,124,2,124, + 9,24,0,125,10,124,10,100,6,107,0,144,2,114,28,116, + 3,100,14,124,0,155,2,157,2,124,0,100,2,141,2,130, + 1,105,0,125,11,100,6,125,12,122,14,124,1,160,4,124, + 2,161,1,1,0,87,0,110,32,4,0,116,2,144,4,121, + 226,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, + 2,124,0,100,2,141,2,130,1,9,0,124,1,160,7,100, + 16,161,1,125,3,116,8,124,3,131,1,100,5,107,0,144, + 2,114,118,116,14,100,17,131,1,130,1,124,3,100,0,100, + 5,133,2,25,0,100,18,107,3,144,2,114,140,144,4,113, + 170,116,8,124,3,131,1,100,16,107,3,144,2,114,162,116, + 14,100,17,131,1,130,1,116,15,124,3,100,19,100,20,133, + 2,25,0,131,1,125,13,116,15,124,3,100,20,100,9,133, + 2,25,0,131,1,125,14,116,15,124,3,100,9,100,21,133, + 2,25,0,131,1,125,15,116,15,124,3,100,21,100,10,133, + 2,25,0,131,1,125,16,116,13,124,3,100,10,100,11,133, + 2,25,0,131,1,125,17,116,13,124,3,100,11,100,22,133, + 2,25,0,131,1,125,18,116,13,124,3,100,22,100,23,133, + 2,25,0,131,1,125,4,116,15,124,3,100,23,100,24,133, + 2,25,0,131,1,125,19,116,15,124,3,100,24,100,25,133, + 2,25,0,131,1,125,20,116,15,124,3,100,25,100,26,133, + 2,25,0,131,1,125,21,116,13,124,3,100,27,100,16,133, + 2,25,0,131,1,125,22,124,19,124,20,23,0,124,21,23, + 0,125,8,124,22,124,9,107,4,144,3,114,122,116,3,100, + 28,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124, + 22,124,10,55,0,125,22,122,14,124,1,160,7,124,19,161, + 1,125,23,87,0,110,32,4,0,116,2,144,4,121,224,1, + 0,1,0,1,0,116,3,100,4,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,116,8,124,23,131,1,124,19,107, + 3,144,3,114,210,116,3,100,4,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,122,50,116,8,124,1,160,7,124, + 8,124,19,24,0,161,1,131,1,124,8,124,19,24,0,107, + 3,144,4,114,2,116,3,100,4,124,0,155,2,157,2,124, + 0,100,2,141,2,130,1,87,0,110,32,4,0,116,2,144, + 4,121,222,1,0,1,0,1,0,116,3,100,4,124,0,155, + 2,157,2,124,0,100,2,141,2,130,1,124,13,100,29,64, + 0,144,4,114,58,124,23,160,16,161,0,125,23,110,48,122, + 14,124,23,160,16,100,30,161,1,125,23,87,0,110,32,4, + 0,116,17,144,4,121,220,1,0,1,0,1,0,124,23,160, + 16,100,31,161,1,160,18,116,19,161,1,125,23,89,0,124, + 23,160,20,100,32,116,21,161,2,125,23,116,22,160,23,124, + 0,124,23,161,2,125,24,124,24,124,14,124,18,124,4,124, + 22,124,15,124,16,124,17,102,8,125,25,124,25,124,11,124, + 23,60,0,124,12,100,33,55,0,125,12,144,2,113,86,87, + 0,100,0,4,0,4,0,131,3,1,0,110,18,49,0,144, + 4,115,192,119,1,1,0,1,0,1,0,89,0,1,0,116, + 24,160,25,100,34,124,12,124,0,161,3,1,0,124,11,83, + 0,119,0,119,0,119,0,119,0,119,0,119,0,119,0,119, + 0,41,35,78,122,21,99,97,110,39,116,32,111,112,101,110, + 32,90,105,112,32,102,105,108,101,58,32,114,12,0,0,0, + 114,88,0,0,0,250,21,99,97,110,39,116,32,114,101,97, + 100,32,90,105,112,32,102,105,108,101,58,32,233,4,0,0, + 0,114,0,0,0,0,122,16,110,111,116,32,97,32,90,105, + 112,32,102,105,108,101,58,32,122,18,99,111,114,114,117,112, + 116,32,90,105,112,32,102,105,108,101,58,32,233,12,0,0, + 0,233,16,0,0,0,233,20,0,0,0,122,28,98,97,100, + 32,99,101,110,116,114,97,108,32,100,105,114,101,99,116,111, + 114,121,32,115,105,122,101,58,32,122,30,98,97,100,32,99, + 101,110,116,114,97,108,32,100,105,114,101,99,116,111,114,121, + 32,111,102,102,115,101,116,58,32,122,38,98,97,100,32,99, + 101,110,116,114,97,108,32,100,105,114,101,99,116,111,114,121, + 32,115,105,122,101,32,111,114,32,111,102,102,115,101,116,58, + 32,84,233,46,0,0,0,250,27,69,79,70,32,114,101,97, + 100,32,119,104,101,114,101,32,110,111,116,32,101,120,112,101, + 99,116,101,100,115,4,0,0,0,80,75,1,2,233,8,0, + 0,0,233,10,0,0,0,233,14,0,0,0,233,24,0,0, + 0,233,28,0,0,0,233,30,0,0,0,233,32,0,0,0, + 233,34,0,0,0,233,42,0,0,0,122,25,98,97,100,32, + 108,111,99,97,108,32,104,101,97,100,101,114,32,111,102,102, + 115,101,116,58,32,105,0,8,0,0,218,5,97,115,99,105, + 105,90,6,108,97,116,105,110,49,250,1,47,114,5,0,0, + 0,122,33,122,105,112,105,109,112,111,114,116,58,32,102,111, + 117,110,100,32,123,125,32,110,97,109,101,115,32,105,110,32, + 123,33,114,125,41,26,218,3,95,105,111,218,9,111,112,101, + 110,95,99,111,100,101,114,22,0,0,0,114,3,0,0,0, + 218,4,115,101,101,107,218,20,69,78,68,95,67,69,78,84, + 82,65,76,95,68,73,82,95,83,73,90,69,90,4,116,101, + 108,108,218,4,114,101,97,100,114,55,0,0,0,218,18,83, + 84,82,73,78,71,95,69,78,68,95,65,82,67,72,73,86, + 69,218,3,109,97,120,218,15,77,65,88,95,67,79,77,77, + 69,78,84,95,76,69,78,218,5,114,102,105,110,100,114,2, + 0,0,0,218,8,69,79,70,69,114,114,111,114,114,1,0, + 0,0,114,65,0,0,0,218,18,85,110,105,99,111,100,101, + 68,101,99,111,100,101,69,114,114,111,114,218,9,116,114,97, + 110,115,108,97,116,101,218,11,99,112,52,51,55,95,116,97, + 98,108,101,114,19,0,0,0,114,20,0,0,0,114,21,0, + 0,0,114,30,0,0,0,114,45,0,0,0,114,80,0,0, + 0,41,26,114,29,0,0,0,218,2,102,112,90,15,104,101, + 97,100,101,114,95,112,111,115,105,116,105,111,110,218,6,98, + 117,102,102,101,114,218,9,102,105,108,101,95,115,105,122,101, + 90,17,109,97,120,95,99,111,109,109,101,110,116,95,115,116, + 97,114,116,218,4,100,97,116,97,90,3,112,111,115,218,11, + 104,101,97,100,101,114,95,115,105,122,101,90,13,104,101,97, + 100,101,114,95,111,102,102,115,101,116,90,10,97,114,99,95, + 111,102,102,115,101,116,114,33,0,0,0,218,5,99,111,117, + 110,116,218,5,102,108,97,103,115,218,8,99,111,109,112,114, + 101,115,115,218,4,116,105,109,101,218,4,100,97,116,101,218, + 3,99,114,99,218,9,100,97,116,97,95,115,105,122,101,218, + 9,110,97,109,101,95,115,105,122,101,218,10,101,120,116,114, + 97,95,115,105,122,101,90,12,99,111,109,109,101,110,116,95, + 115,105,122,101,218,11,102,105,108,101,95,111,102,102,115,101, + 116,114,44,0,0,0,114,13,0,0,0,218,1,116,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,27,0, + 0,0,130,1,0,0,115,234,0,0,0,2,1,14,1,14, + 1,18,1,8,2,2,1,14,1,8,1,14,1,14,1,18, + 1,12,1,18,1,18,1,2,3,12,1,12,1,14,1,10, + 1,2,1,6,255,8,2,2,1,2,255,2,1,4,255,2, + 2,10,1,12,1,14,1,10,1,2,1,6,255,10,2,10, + 1,10,1,2,1,6,255,16,2,14,1,10,1,2,1,6, + 255,16,2,16,2,16,1,10,1,18,1,10,1,18,1,8, + 1,8,1,10,1,18,1,4,2,4,2,2,1,14,1,14, + 1,18,1,2,1,10,1,14,1,8,1,18,2,4,1,14, + 1,8,1,16,1,16,1,16,1,16,1,16,1,16,1,16, + 1,16,1,16,1,16,1,16,1,12,1,10,1,18,1,8, + 1,2,2,14,1,14,1,18,1,14,1,18,1,2,4,28, + 1,22,1,14,1,18,1,10,2,10,2,2,3,14,1,14, + 1,18,1,12,2,12,1,20,1,8,1,8,1,36,202,14, + 55,4,1,2,247,2,246,2,246,2,227,2,227,2,248,2, + 246,2,248,255,128,114,27,0,0,0,117,190,1,0,0,0, + 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, + 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, + 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, + 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64, + 65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80, + 81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96, + 97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, + 113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,195, + 135,195,188,195,169,195,162,195,164,195,160,195,165,195,167,195, + 170,195,171,195,168,195,175,195,174,195,172,195,132,195,133,195, + 137,195,166,195,134,195,180,195,182,195,178,195,187,195,185,195, + 191,195,150,195,156,194,162,194,163,194,165,226,130,167,198,146, + 195,161,195,173,195,179,195,186,195,177,195,145,194,170,194,186, + 194,191,226,140,144,194,172,194,189,194,188,194,161,194,171,194, + 187,226,150,145,226,150,146,226,150,147,226,148,130,226,148,164, + 226,149,161,226,149,162,226,149,150,226,149,149,226,149,163,226, + 149,145,226,149,151,226,149,157,226,149,156,226,149,155,226,148, + 144,226,148,148,226,148,180,226,148,172,226,148,156,226,148,128, + 226,148,188,226,149,158,226,149,159,226,149,154,226,149,148,226, + 149,169,226,149,166,226,149,160,226,149,144,226,149,172,226,149, + 167,226,149,168,226,149,164,226,149,165,226,149,153,226,149,152, + 226,149,146,226,149,147,226,149,171,226,149,170,226,148,152,226, + 148,140,226,150,136,226,150,132,226,150,140,226,150,144,226,150, + 128,206,177,195,159,206,147,207,128,206,163,207,131,194,181,207, + 132,206,166,206,152,206,169,206,180,226,136,158,207,134,206,181, + 226,136,169,226,137,161,194,177,226,137,165,226,137,164,226,140, + 160,226,140,161,195,183,226,137,136,194,176,226,136,153,194,183, + 226,136,154,226,129,191,194,178,226,150,160,194,160,99,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0, + 0,0,67,0,0,0,115,106,0,0,0,116,0,114,22,116, + 1,160,2,100,1,161,1,1,0,116,3,100,2,131,1,130, + 1,100,3,97,0,122,56,122,16,100,4,100,5,108,4,109, + 5,125,0,1,0,87,0,110,30,4,0,116,6,121,104,1, + 0,1,0,1,0,116,1,160,2,100,1,161,1,1,0,116, + 3,100,2,131,1,130,1,87,0,100,6,97,0,110,6,100, + 6,97,0,119,0,116,1,160,2,100,7,161,1,1,0,124, + 0,83,0,119,0,41,8,78,122,27,122,105,112,105,109,112, + 111,114,116,58,32,122,108,105,98,32,85,78,65,86,65,73, + 76,65,66,76,69,250,41,99,97,110,39,116,32,100,101,99, + 111,109,112,114,101,115,115,32,100,97,116,97,59,32,122,108, + 105,98,32,110,111,116,32,97,118,97,105,108,97,98,108,101, + 84,114,0,0,0,0,169,1,218,10,100,101,99,111,109,112, + 114,101,115,115,70,122,25,122,105,112,105,109,112,111,114,116, + 58,32,122,108,105,98,32,97,118,97,105,108,97,98,108,101, + 41,7,218,15,95,105,109,112,111,114,116,105,110,103,95,122, + 108,105,98,114,45,0,0,0,114,80,0,0,0,114,3,0, + 0,0,90,4,122,108,105,98,114,143,0,0,0,218,9,69, + 120,99,101,112,116,105,111,110,114,142,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,20,95,103, + 101,116,95,100,101,99,111,109,112,114,101,115,115,95,102,117, + 110,99,32,2,0,0,115,30,0,0,0,4,2,10,3,8, + 1,4,2,4,1,16,1,12,1,10,1,8,1,2,128,12, + 2,10,2,4,1,2,249,255,128,114,146,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,9, + 0,0,0,67,0,0,0,115,134,1,0,0,124,1,92,8, + 125,2,125,3,125,4,125,5,125,6,125,7,125,8,125,9, + 124,4,100,1,107,0,114,36,116,0,100,2,131,1,130,1, + 116,1,160,2,124,0,161,1,144,1,143,4,125,10,122,14, + 124,10,160,3,124,6,161,1,1,0,87,0,110,32,4,0, + 116,4,144,1,121,132,1,0,1,0,1,0,116,0,100,3, + 124,0,155,2,157,2,124,0,100,4,141,2,130,1,124,10, + 160,5,100,5,161,1,125,11,116,6,124,11,131,1,100,5, + 107,3,114,128,116,7,100,6,131,1,130,1,124,11,100,0, + 100,7,133,2,25,0,100,8,107,3,114,162,116,0,100,9, + 124,0,155,2,157,2,124,0,100,4,141,2,130,1,116,8, + 124,11,100,10,100,11,133,2,25,0,131,1,125,12,116,8, + 124,11,100,11,100,5,133,2,25,0,131,1,125,13,100,5, + 124,12,23,0,124,13,23,0,125,14,124,6,124,14,55,0, + 125,6,122,14,124,10,160,3,124,6,161,1,1,0,87,0, + 110,32,4,0,116,4,144,1,121,130,1,0,1,0,1,0, + 116,0,100,3,124,0,155,2,157,2,124,0,100,4,141,2, + 130,1,124,10,160,5,124,4,161,1,125,15,116,6,124,15, + 131,1,124,4,107,3,144,1,114,38,116,4,100,12,131,1, + 130,1,87,0,100,0,4,0,4,0,131,3,1,0,110,18, + 49,0,144,1,115,60,119,1,1,0,1,0,1,0,89,0, + 1,0,124,3,100,1,107,2,144,1,114,84,124,15,83,0, + 122,10,116,9,131,0,125,16,87,0,110,22,4,0,116,10, + 144,1,121,128,1,0,1,0,1,0,116,0,100,13,131,1, + 130,1,124,16,124,15,100,14,131,2,83,0,119,0,119,0, + 119,0,41,15,78,114,0,0,0,0,122,18,110,101,103,97, + 116,105,118,101,32,100,97,116,97,32,115,105,122,101,114,94, + 0,0,0,114,12,0,0,0,114,106,0,0,0,114,100,0, + 0,0,114,95,0,0,0,115,4,0,0,0,80,75,3,4, + 122,23,98,97,100,32,108,111,99,97,108,32,102,105,108,101, + 32,104,101,97,100,101,114,58,32,233,26,0,0,0,114,105, + 0,0,0,122,26,122,105,112,105,109,112,111,114,116,58,32, + 99,97,110,39,116,32,114,101,97,100,32,100,97,116,97,114, + 141,0,0,0,105,241,255,255,255,41,11,114,3,0,0,0, + 114,112,0,0,0,114,113,0,0,0,114,114,0,0,0,114, + 22,0,0,0,114,116,0,0,0,114,55,0,0,0,114,121, + 0,0,0,114,1,0,0,0,114,146,0,0,0,114,145,0, + 0,0,41,17,114,29,0,0,0,114,58,0,0,0,90,8, + 100,97,116,97,112,97,116,104,114,132,0,0,0,114,136,0, + 0,0,114,127,0,0,0,114,139,0,0,0,114,133,0,0, + 0,114,134,0,0,0,114,135,0,0,0,114,125,0,0,0, + 114,126,0,0,0,114,137,0,0,0,114,138,0,0,0,114, + 129,0,0,0,90,8,114,97,119,95,100,97,116,97,114,143, 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,151,0,0,0,197,2,0,0,115,18,0,0,0, - 20,2,12,1,2,2,14,1,12,1,6,1,12,2,2,253, - 255,128,114,151,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,14,0,0,0,11,0,0,0,67,0,0,0, - 115,18,1,0,0,116,0,124,0,124,1,131,2,125,2,100, - 0,125,3,116,1,68,0,93,204,92,3,125,4,125,5,125, - 6,124,2,124,4,23,0,125,7,116,2,106,3,100,1,124, - 0,106,4,116,5,124,7,100,2,100,3,141,5,1,0,122, - 14,124,0,106,6,124,7,25,0,125,8,87,0,110,18,4, - 0,116,7,144,1,121,16,1,0,1,0,1,0,89,0,113, - 18,124,8,100,4,25,0,125,9,116,8,124,0,106,4,124, - 8,131,2,125,10,100,0,125,11,124,5,114,182,122,20,116, - 9,124,0,124,9,124,7,124,1,124,10,131,5,125,11,87, - 0,110,50,4,0,116,10,144,1,121,14,1,0,125,12,1, - 0,122,16,124,12,125,3,87,0,89,0,100,0,125,12,126, - 12,110,18,100,0,125,12,126,12,119,1,116,11,124,9,124, - 10,131,2,125,11,124,11,100,0,117,0,114,202,113,18,124, - 8,100,4,25,0,125,9,124,11,124,6,124,9,102,3,2, - 0,1,0,83,0,124,3,114,252,100,5,124,3,155,0,157, - 2,125,13,116,12,124,13,124,1,100,6,141,2,124,3,130, - 2,116,12,100,7,124,1,155,2,157,2,124,1,100,6,141, - 2,130,1,119,0,119,0,41,8,78,122,13,116,114,121,105, - 110,103,32,123,125,123,125,123,125,114,88,0,0,0,41,1, - 90,9,118,101,114,98,111,115,105,116,121,114,0,0,0,0, - 122,20,109,111,100,117,108,101,32,108,111,97,100,32,102,97, - 105,108,101,100,58,32,114,62,0,0,0,114,61,0,0,0, - 41,13,114,36,0,0,0,114,91,0,0,0,114,45,0,0, - 0,114,80,0,0,0,114,29,0,0,0,114,20,0,0,0, - 114,28,0,0,0,114,26,0,0,0,114,56,0,0,0,114, - 157,0,0,0,114,79,0,0,0,114,163,0,0,0,114,3, - 0,0,0,41,14,114,32,0,0,0,114,38,0,0,0,114, - 13,0,0,0,90,12,105,109,112,111,114,116,95,101,114,114, - 111,114,114,92,0,0,0,114,93,0,0,0,114,51,0,0, - 0,114,66,0,0,0,114,58,0,0,0,114,40,0,0,0, - 114,128,0,0,0,114,50,0,0,0,90,3,101,120,99,114, - 81,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,114,48,0,0,0,212,2,0,0,115,60,0,0, - 0,10,1,4,1,14,1,8,1,22,1,2,1,14,1,14, - 1,4,1,8,2,12,1,4,1,4,1,2,1,20,1,16, - 1,16,1,8,128,10,2,8,1,2,3,8,1,14,1,4, - 2,10,1,14,1,18,2,2,241,2,247,255,128,114,48,0, - 0,0,41,46,114,86,0,0,0,90,26,95,102,114,111,122, - 101,110,95,105,109,112,111,114,116,108,105,98,95,101,120,116, - 101,114,110,97,108,114,21,0,0,0,114,1,0,0,0,114, - 2,0,0,0,90,17,95,102,114,111,122,101,110,95,105,109, - 112,111,114,116,108,105,98,114,45,0,0,0,114,150,0,0, - 0,114,112,0,0,0,114,154,0,0,0,114,71,0,0,0, - 114,133,0,0,0,114,69,0,0,0,90,7,95,95,97,108, - 108,95,95,114,20,0,0,0,90,15,112,97,116,104,95,115, - 101,112,97,114,97,116,111,114,115,114,18,0,0,0,114,79, - 0,0,0,114,3,0,0,0,114,25,0,0,0,218,4,116, - 121,112,101,114,74,0,0,0,114,115,0,0,0,114,117,0, - 0,0,114,119,0,0,0,90,13,95,76,111,97,100,101,114, - 66,97,115,105,99,115,114,4,0,0,0,114,91,0,0,0, - 114,36,0,0,0,114,37,0,0,0,114,35,0,0,0,114, - 27,0,0,0,114,124,0,0,0,114,144,0,0,0,114,146, - 0,0,0,114,56,0,0,0,114,149,0,0,0,114,157,0, - 0,0,218,8,95,95,99,111,100,101,95,95,114,155,0,0, - 0,114,161,0,0,0,114,163,0,0,0,114,171,0,0,0, - 114,153,0,0,0,114,151,0,0,0,114,48,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,0, - 0,115,92,0,0,0,4,0,8,16,16,1,8,1,8,1, - 8,1,8,1,8,1,8,1,8,1,8,2,6,3,14,1, - 16,3,4,4,8,2,4,2,4,1,4,1,18,2,0,127, - 0,127,12,34,12,1,2,1,2,1,4,252,8,9,8,4, - 8,9,8,31,2,126,2,254,4,29,8,5,8,21,8,46, - 8,8,10,40,8,5,8,7,8,6,8,13,8,19,12,15, - 255,128, + 0,0,114,56,0,0,0,53,2,0,0,115,70,0,0,0, + 20,1,8,1,8,1,14,2,2,2,14,1,14,1,18,1, + 10,1,12,1,8,1,16,2,18,2,16,2,16,1,12,1, + 8,1,2,1,14,1,14,1,18,1,10,1,14,1,40,1, + 10,2,4,2,2,3,10,1,14,1,8,1,10,1,2,254, + 2,243,2,240,255,128,114,56,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,16,0,0,0,116,0,124,0,124,1,24, + 0,131,1,100,1,107,1,83,0,41,2,78,114,5,0,0, + 0,41,1,218,3,97,98,115,41,2,90,2,116,49,90,2, + 116,50,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,9,95,101,113,95,109,116,105,109,101,99,2,0,0, + 115,4,0,0,0,16,2,255,128,114,149,0,0,0,99,5, + 0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,6, + 0,0,0,67,0,0,0,115,254,0,0,0,124,3,124,2, + 100,1,156,2,125,5,116,0,160,1,124,4,124,3,124,5, + 161,3,125,6,124,6,100,2,64,0,100,3,107,3,125,7, + 124,7,114,126,124,6,100,4,64,0,100,3,107,3,125,8, + 116,2,106,3,100,5,107,3,114,124,124,8,115,76,116,2, + 106,3,100,6,107,2,114,124,116,4,124,0,124,2,131,2, + 125,9,124,9,100,0,117,1,114,124,116,2,160,5,116,0, + 106,6,124,9,161,2,125,10,116,0,160,7,124,4,124,10, + 124,3,124,5,161,4,1,0,110,80,116,8,124,0,124,2, + 131,2,92,2,125,11,125,12,124,11,114,206,116,9,116,10, + 124,4,100,7,100,8,133,2,25,0,131,1,124,11,131,2, + 114,186,116,10,124,4,100,8,100,9,133,2,25,0,131,1, + 124,12,107,3,114,206,116,11,160,12,100,10,124,3,155,2, + 157,2,161,1,1,0,100,0,83,0,116,13,160,14,124,4, + 100,9,100,0,133,2,25,0,161,1,125,13,116,15,124,13, + 116,16,131,2,115,250,116,17,100,11,124,1,155,2,100,12, + 157,3,131,1,130,1,124,13,83,0,41,13,78,41,2,114, + 44,0,0,0,114,13,0,0,0,114,5,0,0,0,114,0, + 0,0,0,114,88,0,0,0,90,5,110,101,118,101,114,90, + 6,97,108,119,97,121,115,114,101,0,0,0,114,96,0,0, + 0,114,97,0,0,0,122,22,98,121,116,101,99,111,100,101, + 32,105,115,32,115,116,97,108,101,32,102,111,114,32,122,16, + 99,111,109,112,105,108,101,100,32,109,111,100,117,108,101,32, + 122,21,32,105,115,32,110,111,116,32,97,32,99,111,100,101, + 32,111,98,106,101,99,116,41,18,114,21,0,0,0,90,13, + 95,99,108,97,115,115,105,102,121,95,112,121,99,218,4,95, + 105,109,112,90,21,99,104,101,99,107,95,104,97,115,104,95, + 98,97,115,101,100,95,112,121,99,115,218,15,95,103,101,116, + 95,112,121,99,95,115,111,117,114,99,101,218,11,115,111,117, + 114,99,101,95,104,97,115,104,90,17,95,82,65,87,95,77, + 65,71,73,67,95,78,85,77,66,69,82,90,18,95,118,97, + 108,105,100,97,116,101,95,104,97,115,104,95,112,121,99,218, + 29,95,103,101,116,95,109,116,105,109,101,95,97,110,100,95, + 115,105,122,101,95,111,102,95,115,111,117,114,99,101,114,149, + 0,0,0,114,2,0,0,0,114,45,0,0,0,114,80,0, + 0,0,218,7,109,97,114,115,104,97,108,90,5,108,111,97, + 100,115,114,15,0,0,0,218,10,95,99,111,100,101,95,116, + 121,112,101,218,9,84,121,112,101,69,114,114,111,114,41,14, + 114,32,0,0,0,114,57,0,0,0,114,66,0,0,0,114, + 38,0,0,0,114,128,0,0,0,90,11,101,120,99,95,100, + 101,116,97,105,108,115,114,131,0,0,0,90,10,104,97,115, + 104,95,98,97,115,101,100,90,12,99,104,101,99,107,95,115, + 111,117,114,99,101,90,12,115,111,117,114,99,101,95,98,121, + 116,101,115,114,152,0,0,0,90,12,115,111,117,114,99,101, + 95,109,116,105,109,101,90,11,115,111,117,114,99,101,95,115, + 105,122,101,114,50,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,15,95,117,110,109,97,114,115, + 104,97,108,95,99,111,100,101,107,2,0,0,115,72,0,0, + 0,2,2,2,1,6,254,14,5,12,2,4,1,12,1,10, + 1,2,1,2,255,8,1,2,255,10,2,8,1,4,1,4, + 1,2,1,4,254,4,5,8,1,6,255,8,4,6,255,4, + 3,22,3,18,1,2,255,4,2,8,1,4,255,4,2,18, + 2,10,1,16,1,4,1,255,128,114,157,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, + 0,0,0,67,0,0,0,115,28,0,0,0,124,0,160,0, + 100,1,100,2,161,2,125,0,124,0,160,0,100,3,100,2, + 161,2,125,0,124,0,83,0,41,4,78,115,2,0,0,0, + 13,10,243,1,0,0,0,10,243,1,0,0,0,13,41,1, + 114,19,0,0,0,41,1,218,6,115,111,117,114,99,101,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,23, + 95,110,111,114,109,97,108,105,122,101,95,108,105,110,101,95, + 101,110,100,105,110,103,115,152,2,0,0,115,8,0,0,0, + 12,1,12,1,4,1,255,128,114,161,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,6,0, + 0,0,67,0,0,0,115,24,0,0,0,116,0,124,1,131, + 1,125,1,116,1,124,1,124,0,100,1,100,2,100,3,141, + 4,83,0,41,4,78,114,78,0,0,0,84,41,1,90,12, + 100,111,110,116,95,105,110,104,101,114,105,116,41,2,114,161, + 0,0,0,218,7,99,111,109,112,105,108,101,41,2,114,57, + 0,0,0,114,160,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,15,95,99,111,109,112,105,108, + 101,95,115,111,117,114,99,101,159,2,0,0,115,6,0,0, + 0,8,1,16,1,255,128,114,163,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,11,0,0, + 0,67,0,0,0,115,68,0,0,0,116,0,160,1,124,0, + 100,1,63,0,100,2,23,0,124,0,100,3,63,0,100,4, + 64,0,124,0,100,5,64,0,124,1,100,6,63,0,124,1, + 100,3,63,0,100,7,64,0,124,1,100,5,64,0,100,8, + 20,0,100,9,100,9,100,9,102,9,161,1,83,0,41,10, + 78,233,9,0,0,0,105,188,7,0,0,233,5,0,0,0, + 233,15,0,0,0,233,31,0,0,0,233,11,0,0,0,233, + 63,0,0,0,114,88,0,0,0,114,14,0,0,0,41,2, + 114,133,0,0,0,90,6,109,107,116,105,109,101,41,2,218, + 1,100,114,140,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,14,95,112,97,114,115,101,95,100, + 111,115,116,105,109,101,165,2,0,0,115,20,0,0,0,4, + 1,10,1,10,1,6,1,6,1,10,1,10,1,6,1,6, + 249,255,128,114,171,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,6,0,0,0,10,0,0,0,67,0,0, + 0,115,110,0,0,0,122,82,124,1,100,1,100,0,133,2, + 25,0,100,2,118,0,115,22,74,0,130,1,124,1,100,0, + 100,1,133,2,25,0,125,1,124,0,106,0,124,1,25,0, + 125,2,124,2,100,3,25,0,125,3,124,2,100,4,25,0, + 125,4,124,2,100,5,25,0,125,5,116,1,124,4,124,3, + 131,2,124,5,102,2,87,0,83,0,4,0,116,2,116,3, + 116,4,102,3,121,108,1,0,1,0,1,0,89,0,100,6, + 83,0,119,0,41,7,78,114,14,0,0,0,169,2,218,1, + 99,218,1,111,114,165,0,0,0,233,6,0,0,0,233,3, + 0,0,0,41,2,114,0,0,0,0,114,0,0,0,0,41, + 5,114,28,0,0,0,114,171,0,0,0,114,26,0,0,0, + 218,10,73,110,100,101,120,69,114,114,111,114,114,156,0,0, + 0,41,6,114,32,0,0,0,114,13,0,0,0,114,58,0, + 0,0,114,133,0,0,0,114,134,0,0,0,90,17,117,110, + 99,111,109,112,114,101,115,115,101,100,95,115,105,122,101,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,153, + 0,0,0,178,2,0,0,115,24,0,0,0,2,1,20,2, + 12,1,10,1,8,3,8,1,8,1,16,1,18,1,6,1, + 2,255,255,128,114,153,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0, + 0,0,115,80,0,0,0,124,1,100,1,100,0,133,2,25, + 0,100,2,118,0,115,20,74,0,130,1,124,1,100,0,100, + 1,133,2,25,0,125,1,122,14,124,0,106,0,124,1,25, + 0,125,2,87,0,110,18,4,0,116,1,121,78,1,0,1, + 0,1,0,89,0,100,0,83,0,116,2,124,0,106,3,124, + 2,131,2,83,0,119,0,41,3,78,114,14,0,0,0,114, + 172,0,0,0,41,4,114,28,0,0,0,114,26,0,0,0, + 114,56,0,0,0,114,29,0,0,0,41,3,114,32,0,0, + 0,114,13,0,0,0,114,58,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,151,0,0,0,197, + 2,0,0,115,18,0,0,0,20,2,12,1,2,2,14,1, + 12,1,6,1,12,2,2,253,255,128,114,151,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0, + 11,0,0,0,67,0,0,0,115,18,1,0,0,116,0,124, + 0,124,1,131,2,125,2,100,0,125,3,116,1,68,0,93, + 204,92,3,125,4,125,5,125,6,124,2,124,4,23,0,125, + 7,116,2,106,3,100,1,124,0,106,4,116,5,124,7,100, + 2,100,3,141,5,1,0,122,14,124,0,106,6,124,7,25, + 0,125,8,87,0,110,18,4,0,116,7,144,1,121,16,1, + 0,1,0,1,0,89,0,113,18,124,8,100,4,25,0,125, + 9,116,8,124,0,106,4,124,8,131,2,125,10,100,0,125, + 11,124,5,114,182,122,20,116,9,124,0,124,9,124,7,124, + 1,124,10,131,5,125,11,87,0,110,50,4,0,116,10,144, + 1,121,14,1,0,125,12,1,0,122,16,124,12,125,3,87, + 0,89,0,100,0,125,12,126,12,110,18,100,0,125,12,126, + 12,119,1,116,11,124,9,124,10,131,2,125,11,124,11,100, + 0,117,0,114,202,113,18,124,8,100,4,25,0,125,9,124, + 11,124,6,124,9,102,3,2,0,1,0,83,0,124,3,114, + 252,100,5,124,3,155,0,157,2,125,13,116,12,124,13,124, + 1,100,6,141,2,124,3,130,2,116,12,100,7,124,1,155, + 2,157,2,124,1,100,6,141,2,130,1,119,0,119,0,41, + 8,78,122,13,116,114,121,105,110,103,32,123,125,123,125,123, + 125,114,88,0,0,0,41,1,90,9,118,101,114,98,111,115, + 105,116,121,114,0,0,0,0,122,20,109,111,100,117,108,101, + 32,108,111,97,100,32,102,97,105,108,101,100,58,32,114,62, + 0,0,0,114,61,0,0,0,41,13,114,36,0,0,0,114, + 91,0,0,0,114,45,0,0,0,114,80,0,0,0,114,29, + 0,0,0,114,20,0,0,0,114,28,0,0,0,114,26,0, + 0,0,114,56,0,0,0,114,157,0,0,0,114,79,0,0, + 0,114,163,0,0,0,114,3,0,0,0,41,14,114,32,0, + 0,0,114,38,0,0,0,114,13,0,0,0,90,12,105,109, + 112,111,114,116,95,101,114,114,111,114,114,92,0,0,0,114, + 93,0,0,0,114,51,0,0,0,114,66,0,0,0,114,58, + 0,0,0,114,40,0,0,0,114,128,0,0,0,114,50,0, + 0,0,90,3,101,120,99,114,81,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,114,48,0,0,0, + 212,2,0,0,115,60,0,0,0,10,1,4,1,14,1,8, + 1,22,1,2,1,14,1,14,1,4,1,8,2,12,1,4, + 1,4,1,2,1,20,1,16,1,16,1,8,128,10,2,8, + 1,2,3,8,1,14,1,4,2,10,1,14,1,18,2,2, + 241,2,247,255,128,114,48,0,0,0,41,46,114,86,0,0, + 0,90,26,95,102,114,111,122,101,110,95,105,109,112,111,114, + 116,108,105,98,95,101,120,116,101,114,110,97,108,114,21,0, + 0,0,114,1,0,0,0,114,2,0,0,0,90,17,95,102, + 114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,114, + 45,0,0,0,114,150,0,0,0,114,112,0,0,0,114,154, + 0,0,0,114,71,0,0,0,114,133,0,0,0,114,69,0, + 0,0,90,7,95,95,97,108,108,95,95,114,20,0,0,0, + 90,15,112,97,116,104,95,115,101,112,97,114,97,116,111,114, + 115,114,18,0,0,0,114,79,0,0,0,114,3,0,0,0, + 114,25,0,0,0,218,4,116,121,112,101,114,74,0,0,0, + 114,115,0,0,0,114,117,0,0,0,114,119,0,0,0,90, + 13,95,76,111,97,100,101,114,66,97,115,105,99,115,114,4, + 0,0,0,114,91,0,0,0,114,36,0,0,0,114,37,0, + 0,0,114,35,0,0,0,114,27,0,0,0,114,124,0,0, + 0,114,144,0,0,0,114,146,0,0,0,114,56,0,0,0, + 114,149,0,0,0,114,157,0,0,0,218,8,95,95,99,111, + 100,101,95,95,114,155,0,0,0,114,161,0,0,0,114,163, + 0,0,0,114,171,0,0,0,114,153,0,0,0,114,151,0, + 0,0,114,48,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,8,60,109,111, + 100,117,108,101,62,1,0,0,0,115,92,0,0,0,4,0, + 8,16,16,1,8,1,8,1,8,1,8,1,8,1,8,1, + 8,1,8,2,6,3,14,1,16,3,4,4,8,2,4,2, + 4,1,4,1,18,2,0,127,0,127,12,34,12,1,2,1, + 2,1,4,252,8,9,8,4,8,9,8,31,2,126,2,254, + 4,29,8,5,8,21,8,46,8,8,10,40,8,5,8,7, + 8,6,8,13,8,19,12,15,255,128, }; From 6ec473b88343afe6f15485b84a3d6da0b156b6d1 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Dec 2020 17:35:53 +0100 Subject: [PATCH 0859/1261] bpo-28468: Fix typo in _os_release_candidates (GH-23913) Automerge-Triggered-By: GH:tiran --- Lib/platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/platform.py b/Lib/platform.py index 138a974f02bb6d..1a07b44077b88b 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -1241,7 +1241,7 @@ def platform(aliased=0, terse=0): # unescape five special characters mentioned in the standard _os_release_unescape = re.compile(r"\\([\\\$\"\'`])") # /etc takes precedence over /usr/lib -_os_release_candidates = ("/etc/os-release", "/usr/lib/os-relesase") +_os_release_candidates = ("/etc/os-release", "/usr/lib/os-release") _os_release_cache = None From a314abec7fbc42e36c372e598cc72c8a721ae06b Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 23 Dec 2020 09:40:56 -0800 Subject: [PATCH 0860/1261] bpo-9694: Fix misleading phrase "optional arguments" (GH-23858) --- Doc/howto/argparse.rst | 23 ++-- Doc/library/argparse.rst | 54 ++++----- Lib/argparse.py | 2 +- Lib/test/test_argparse.py | 112 +++++++++--------- .../2020-12-19-12-33-38.bpo-9694.CkKK9V.rst | 2 + 5 files changed, 98 insertions(+), 95 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-19-12-33-38.bpo-9694.CkKK9V.rst diff --git a/Doc/howto/argparse.rst b/Doc/howto/argparse.rst index 76d8e6be42935f..a97d10cfe6bb69 100644 --- a/Doc/howto/argparse.rst +++ b/Doc/howto/argparse.rst @@ -83,7 +83,7 @@ Following is a result of running the code: $ python3 prog.py --help usage: prog.py [-h] - optional arguments: + options: -h, --help show this help message and exit $ python3 prog.py --verbose usage: prog.py [-h] @@ -130,7 +130,7 @@ And running the code: positional arguments: echo - optional arguments: + options: -h, --help show this help message and exit $ python3 prog.py foo foo @@ -172,7 +172,7 @@ And we get: positional arguments: echo echo the string you use here - optional arguments: + options: -h, --help show this help message and exit Now, how about doing something even more useful:: @@ -241,7 +241,7 @@ And the output: $ python3 prog.py --help usage: prog.py [-h] [--verbosity VERBOSITY] - optional arguments: + options: -h, --help show this help message and exit --verbosity VERBOSITY increase output verbosity @@ -289,7 +289,7 @@ And the output: $ python3 prog.py --help usage: prog.py [-h] [--verbose] - optional arguments: + options: -h, --help show this help message and exit --verbose increase output verbosity @@ -332,7 +332,7 @@ And here goes: $ python3 prog.py --help usage: prog.py [-h] [-v] - optional arguments: + options: -h, --help show this help message and exit -v, --verbose increase output verbosity @@ -440,7 +440,7 @@ And the output: positional arguments: square display a square of a given number - optional arguments: + options: -h, --help show this help message and exit -v {0,1,2}, --verbosity {0,1,2} increase output verbosity @@ -468,7 +468,8 @@ verbosity argument (check the output of ``python --help``):: print(answer) We have introduced another action, "count", -to count the number of occurrences of a specific optional arguments: +to count the number of occurrences of specific options. + .. code-block:: shell-session @@ -489,7 +490,7 @@ to count the number of occurrences of a specific optional arguments: positional arguments: square display a square of a given number - optional arguments: + options: -h, --help show this help message and exit -v, --verbosity increase output verbosity $ python3 prog.py 4 -vvv @@ -626,7 +627,7 @@ Output: x the base y the exponent - optional arguments: + options: -h, --help show this help message and exit -v, --verbosity $ python3 prog.py 4 2 -v @@ -750,7 +751,7 @@ but not both at the same time: x the base y the exponent - optional arguments: + options: -h, --help show this help message and exit -v, --verbose -q, --quiet diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 4542961d7816ea..80e0f013df09e5 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -57,7 +57,7 @@ be run at the command line and provides useful help messages: positional arguments: N an integer for the accumulator - optional arguments: + options: -h, --help show this help message and exit --sum sum the integers (default: find the max) @@ -217,14 +217,14 @@ The help for this program will display ``myprogram.py`` as the program name $ python myprogram.py --help usage: myprogram.py [-h] [--foo FOO] - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help $ cd .. $ python subdir/myprogram.py --help usage: myprogram.py [-h] [--foo FOO] - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help @@ -235,7 +235,7 @@ To change this default behavior, another value can be supplied using the >>> parser.print_help() usage: myprogram [-h] - optional arguments: + options: -h, --help show this help message and exit Note that the program name, whether determined from ``sys.argv[0]`` or from the @@ -249,7 +249,7 @@ specifier. >>> parser.print_help() usage: myprogram [-h] [--foo FOO] - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo of the myprogram program @@ -269,7 +269,7 @@ arguments it contains:: positional arguments: bar bar help - optional arguments: + options: -h, --help show this help message and exit --foo [FOO] foo help @@ -284,7 +284,7 @@ The default message can be overridden with the ``usage=`` keyword argument:: positional arguments: bar bar help - optional arguments: + options: -h, --help show this help message and exit --foo [FOO] foo help @@ -307,7 +307,7 @@ various arguments:: A foo that bars - optional arguments: + options: -h, --help show this help message and exit By default, the description will be line-wrapped so that it fits within the @@ -329,7 +329,7 @@ argument to :class:`ArgumentParser`:: A foo that bars - optional arguments: + options: -h, --help show this help message and exit And that's how you'd foo a bar @@ -403,7 +403,7 @@ epilog_ texts in command-line help messages:: this description was indented weird but that is okay - optional arguments: + options: -h, --help show this help message and exit likewise for this epilog whose whitespace will be cleaned up and whose words @@ -432,7 +432,7 @@ should not be line-wrapped:: exactly the way I want it - optional arguments: + options: -h, --help show this help message and exit :class:`RawTextHelpFormatter` maintains whitespace for all sorts of help text, @@ -454,7 +454,7 @@ default values to each of the argument help messages:: positional arguments: bar BAR! (default: [1, 2, 3]) - optional arguments: + options: -h, --help show this help message and exit --foo FOO FOO! (default: 42) @@ -473,7 +473,7 @@ as the regular formatter does):: positional arguments: float - optional arguments: + options: -h, --help show this help message and exit --foo int @@ -592,7 +592,7 @@ older arguments with the same option string. To get this behavior, the value >>> parser.print_help() usage: PROG [-h] [-f FOO] [--foo FOO] - optional arguments: + options: -h, --help show this help message and exit -f FOO old foo help --foo FOO new foo help @@ -623,7 +623,7 @@ help will be printed: $ python myprogram.py --help usage: myprogram.py [-h] [--foo FOO] - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help @@ -636,7 +636,7 @@ This can be achieved by passing ``False`` as the ``add_help=`` argument to >>> parser.print_help() usage: PROG [--foo FOO] - optional arguments: + options: --foo FOO foo help The help option is typically ``-h/--help``. The exception to this is @@ -649,7 +649,7 @@ the help options:: >>> parser.print_help() usage: PROG [+h] - optional arguments: + options: +h, ++help show this help message and exit @@ -1203,7 +1203,7 @@ argument:: positional arguments: bar one of the bars to be frobbled - optional arguments: + options: -h, --help show this help message and exit --foo foo the bars before frobbling @@ -1221,7 +1221,7 @@ specifiers include the program name, ``%(prog)s`` and most keyword arguments to positional arguments: bar the bar to frobble (default: 42) - optional arguments: + options: -h, --help show this help message and exit As the help string supports %-formatting, if you want a literal ``%`` to appear @@ -1235,7 +1235,7 @@ setting the ``help`` value to ``argparse.SUPPRESS``:: >>> parser.print_help() usage: frobble [-h] - optional arguments: + options: -h, --help show this help message and exit @@ -1262,7 +1262,7 @@ will be referred to as ``FOO``. An example:: positional arguments: bar - optional arguments: + options: -h, --help show this help message and exit --foo FOO @@ -1279,7 +1279,7 @@ An alternative name can be specified with ``metavar``:: positional arguments: XXX - optional arguments: + options: -h, --help show this help message and exit --foo YYY @@ -1297,7 +1297,7 @@ arguments:: >>> parser.print_help() usage: PROG [-h] [-x X X] [--foo bar baz] - optional arguments: + options: -h, --help show this help message and exit -x X X --foo bar baz @@ -1701,7 +1701,7 @@ Sub-commands a a help b b help - optional arguments: + options: -h, --help show this help message and exit --foo foo help @@ -1711,13 +1711,13 @@ Sub-commands positional arguments: bar bar help - optional arguments: + options: -h, --help show this help message and exit >>> parser.parse_args(['b', '--help']) usage: PROG b [-h] [--baz {X,Y,Z}] - optional arguments: + options: -h, --help show this help message and exit --baz {X,Y,Z} baz help @@ -1734,7 +1734,7 @@ Sub-commands >>> parser.parse_args(['-h']) usage: [-h] {foo,bar} ... - optional arguments: + options: -h, --help show this help message and exit subcommands: diff --git a/Lib/argparse.py b/Lib/argparse.py index 2fb1da59f942cf..8a12dea7668799 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1719,7 +1719,7 @@ def __init__(self, add_group = self.add_argument_group self._positionals = add_group(_('positional arguments')) - self._optionals = add_group(_('optional arguments')) + self._optionals = add_group(_('options')) self._subparsers = None # register types diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index e98c15b11afb31..ec9711e4f6a472 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -2078,7 +2078,7 @@ def test_help(self): bar bar help {1,2,3} command help - optional arguments: + options: -h, --help show this help message and exit --foo foo help ''')) @@ -2097,7 +2097,7 @@ def test_help_extra_prefix_chars(self): bar bar help {1,2,3} command help - optional arguments: + options: -h, --help show this help message and exit ++foo foo help ''')) @@ -2114,7 +2114,7 @@ def test_help_non_breaking_spaces(self): main description - optional arguments: + options: -h, --help show this help message and exit --non-breaking help message containing non-breaking spaces shall not wrap\N{NO-BREAK SPACE}at non-breaking spaces @@ -2133,7 +2133,7 @@ def test_help_alternate_prefix_chars(self): bar bar help {1,2,3} command help - optional arguments: + options: +h, ++help show this help message and exit ++foo foo help ''')) @@ -2154,7 +2154,7 @@ def test_parser_command_help(self): 2 2 help 3 3 help - optional arguments: + options: -h, --help show this help message and exit --foo foo help ''')) @@ -2179,7 +2179,7 @@ def test_subparser_title_help(self): positional arguments: bar bar help - optional arguments: + options: -h, --help show this help message and exit --foo foo help @@ -2203,7 +2203,7 @@ def test_subparser1_help(self): positional arguments: {a,b,c} x help - optional arguments: + options: -h, --help show this help message and exit -w W w help ''')) @@ -2217,7 +2217,7 @@ def test_subparser2_help(self): positional arguments: z z help - optional arguments: + options: -h, --help show this help message and exit -y {1,2,3} y help ''')) @@ -2249,7 +2249,7 @@ def test_alias_help(self): positional arguments: bar bar help - optional arguments: + options: -h, --help show this help message and exit --foo foo help @@ -2437,7 +2437,7 @@ def test_parent_help(self): a z - optional arguments: + options: -h, --help show this help message and exit -b B --w W @@ -2467,7 +2467,7 @@ def test_groups_parents(self): self.assertEqual(parser_help, textwrap.dedent('''\ usage: {}{}[-h] [-w W] [-x X] [-y Y | -z Z] - optional arguments: + options: -h, --help show this help message and exit -y Y -z Z @@ -2512,7 +2512,7 @@ def test_help(self): expected = '''\ usage: PROG [-h] [--foo | --bar] [--soup | --nuts] - optional arguments: + options: -h, --help show this help message and exit --foo --bar @@ -2597,7 +2597,7 @@ def get_parser(self, required=None): ''' help = '''\ - optional arguments: + options: -h, --help show this help message and exit --bar BAR bar help --baz [BAZ] baz help @@ -2638,7 +2638,7 @@ def get_parser(self, required=None): ''' help = '''\ - optional arguments: + options: -h, --help show this help message and exit --abcde ABCDE abcde help --fghij FGHIJ fghij help @@ -2674,7 +2674,7 @@ def get_parser(self, required): ''' help = '''\ - optional arguments: + options: -h, --help show this help message and exit -y y help ''' @@ -2711,7 +2711,7 @@ def get_parser(self, required): ''' help = '''\ - optional arguments: + options: -h, --help show this help message and exit ''' @@ -2754,7 +2754,7 @@ def get_parser(self, required): positional arguments: badger BADGER - optional arguments: + options: -h, --help show this help message and exit --foo FOO --spam SPAM SPAM @@ -2793,7 +2793,7 @@ def get_parser(self, required): ''' help = '''\ - optional arguments: + options: -h, --help show this help message and exit -x x help -a a help @@ -2832,7 +2832,7 @@ def get_parser(self, required=None): ''' help = '''\ - optional arguments: + options: -h, --help show this help message and exit Titled group: @@ -2877,7 +2877,7 @@ def get_parser(self, required): x x help a a help - optional arguments: + options: -h, --help show this help message and exit -y y help -b b help @@ -2908,7 +2908,7 @@ def get_parser(self, required): help = '''\ - optional arguments: + options: -h, --help show this help message and exit -a A -b B @@ -3226,7 +3226,7 @@ class TestHelpBiggerOptionals(HelpTestCase): foo FOO HELP bar BAR HELP - optional arguments: + options: -h, --help show this help message and exit -v, --version show program's version number and exit -x X HELP @@ -3271,7 +3271,7 @@ def setUp(self): bar BAR HELP - optional arguments: + options: -h, --help show this help @@ -3321,7 +3321,7 @@ class TestHelpBiggerOptionalGroups(HelpTestCase): foo FOO HELP bar BAR HELP - optional arguments: + options: -h, --help show this help message and exit -v, --version show program's version number and exit -x X HELP @@ -3362,7 +3362,7 @@ class TestHelpBiggerPositionals(HelpTestCase): ekiekiekifekang EKI HELP bar BAR HELP - optional arguments: + options: -h, --help show this help message and exit -x X HELP --y Y Y HELP @@ -3409,7 +3409,7 @@ class TestHelpReformatting(HelpTestCase): positional arguments: yyy normal y help - optional arguments: + options: -h, --help show this help message and exit -x XX oddly formatted -x help @@ -3449,7 +3449,7 @@ class TestHelpWrappingShortNames(HelpTestCase): YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH - optional arguments: + options: -h, --help show this help message and exit -x XX XHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH \ HXXHH HXXHH @@ -3492,7 +3492,7 @@ class TestHelpWrappingLongNames(HelpTestCase): YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH - optional arguments: + options: -h, --help show this help message and exit -v, --version show program's version number and exit -x XXXXXXXXXXXXXXXXXXXXXXXXX @@ -3554,7 +3554,7 @@ class TestHelpUsage(HelpTestCase): b b c c - optional arguments: + options: -h, --help show this help message and exit -w W [W ...] w -x [X ...] x @@ -3623,7 +3623,7 @@ class TestHelpUsageLongProg(HelpTestCase): a b - optional arguments: + options: -h, --help show this help message and exit -w W -x X @@ -3657,7 +3657,7 @@ class TestHelpUsageLongProgOptionsWrap(HelpTestCase): a b - optional arguments: + options: -h, --help show this help message and exit -w WWWWWWWWWWWWWWWWWWWWWWWWW -x XXXXXXXXXXXXXXXXXXXXXXXXX @@ -3720,7 +3720,7 @@ class TestHelpUsageOptionalsWrap(HelpTestCase): b c - optional arguments: + options: -h, --help show this help message and exit -w WWWWWWWWWWWWWWWWWWWWWWWWW -x XXXXXXXXXXXXXXXXXXXXXXXXX @@ -3755,7 +3755,7 @@ class TestHelpUsagePositionalsWrap(HelpTestCase): bbbbbbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccccc - optional arguments: + options: -h, --help show this help message and exit -x X -y Y @@ -3791,7 +3791,7 @@ class TestHelpUsageOptionalsPositionalsWrap(HelpTestCase): bbbbbbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccccc - optional arguments: + options: -h, --help show this help message and exit -x XXXXXXXXXXXXXXXXXXXXXXXXX -y YYYYYYYYYYYYYYYYYYYYYYYYY @@ -3817,7 +3817,7 @@ class TestHelpUsageOptionalsOnlyWrap(HelpTestCase): ''' help = usage + '''\ - optional arguments: + options: -h, --help show this help message and exit -x XXXXXXXXXXXXXXXXXXXXXXXXX -y YYYYYYYYYYYYYYYYYYYYYYYYY @@ -3882,7 +3882,7 @@ class TestHelpVariableExpansion(HelpTestCase): spam spam PROG None badger badger PROG 0.5 - optional arguments: + options: -h, --help show this help message and exit -x X x PROG None int % -y y PROG 42 XXX @@ -3907,7 +3907,7 @@ class TestHelpVariableExpansionUsageSupplied(HelpTestCase): ''') help = usage + '''\ - optional arguments: + options: -h, --help show this help message and exit ''' version = '' @@ -3939,7 +3939,7 @@ class TestHelpSuppressUsage(HelpTestCase): positional arguments: spam spam help - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help ''' @@ -3986,7 +3986,7 @@ class TestHelpSuppressOptionalGroup(HelpTestCase): positional arguments: spam spam help - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help ''' @@ -4007,7 +4007,7 @@ class TestHelpSuppressPositional(HelpTestCase): ''' help = usage + '''\ - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help ''' @@ -4027,7 +4027,7 @@ class TestHelpRequiredOptional(HelpTestCase): ''' help = usage + '''\ - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help ''' @@ -4048,7 +4048,7 @@ class TestHelpAlternatePrefixChars(HelpTestCase): ''' help = usage + '''\ - optional arguments: + options: ^^foo foo help ;b BAR, ;;bar BAR bar help ''' @@ -4072,7 +4072,7 @@ class TestHelpNoHelpOptional(HelpTestCase): positional arguments: spam spam help - optional arguments: + options: --foo FOO foo help ''' version = '' @@ -4095,7 +4095,7 @@ class TestHelpNone(HelpTestCase): positional arguments: spam - optional arguments: + options: -h, --help show this help message and exit --foo FOO ''' @@ -4119,7 +4119,7 @@ class TestHelpTupleMetavar(HelpTestCase): ''' help = usage + '''\ - optional arguments: + options: -h, --help show this help message and exit -w W1 [W2 ...] w -x [X1 [X2 ...]] x @@ -4163,7 +4163,7 @@ class TestHelpRawText(HelpTestCase): positional arguments: spam spam help - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help should also appear as given here @@ -4212,7 +4212,7 @@ class TestHelpRawDescription(HelpTestCase): positional arguments: spam spam help - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help should not retain this odd formatting @@ -4254,7 +4254,7 @@ class TestHelpArgumentDefaults(HelpTestCase): spam spam help badger badger help (default: wooden) - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help - oh and by the way, None --bar bar help (default: False) @@ -4279,7 +4279,7 @@ class TestHelpVersionAction(HelpTestCase): description - optional arguments: + options: -h, --help show this help message and exit -V, --version show program's version number and exit ''' @@ -4305,7 +4305,7 @@ class TestHelpVersionActionSuppress(HelpTestCase): positional arguments: spam spam help - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help ''' @@ -4331,7 +4331,7 @@ class TestHelpSubparsersOrdering(HelpTestCase): positional arguments: {a,b,c,d,e} - optional arguments: + options: -h, --help show this help message and exit -v, --version show program's version number and exit ''' @@ -4372,7 +4372,7 @@ class TestHelpSubparsersWithHelpOrdering(HelpTestCase): d d subcommand help e e subcommand help - optional arguments: + options: -h, --help show this help message and exit -v, --version show program's version number and exit ''' @@ -4404,7 +4404,7 @@ def custom_type(string): positional arguments: int - optional arguments: + options: -h, --help show this help message and exit -b custom_type -c SOME FLOAT @@ -4596,7 +4596,7 @@ def test_resolve_error(self): self.assertEqual(parser.format_help(), textwrap.dedent('''\ usage: PROG [-h] [-x X] - optional arguments: + options: -h, --help show this help message and exit -x X NEW X ''')) @@ -4606,7 +4606,7 @@ def test_resolve_error(self): self.assertEqual(parser.format_help(), textwrap.dedent('''\ usage: PROG [-h] [-x X] [--spam NEW_SPAM] - optional arguments: + options: -h, --help show this help message and exit -x X NEW X --spam NEW_SPAM @@ -5337,7 +5337,7 @@ def test_help_with_metavar(self): usage: this_is_spammy_prog_with_a_long_name_sorry_about_the_name [-h] [--proxy ] - optional arguments: + options: -h, --help show this help message and exit --proxy ''')) diff --git a/Misc/NEWS.d/next/Library/2020-12-19-12-33-38.bpo-9694.CkKK9V.rst b/Misc/NEWS.d/next/Library/2020-12-19-12-33-38.bpo-9694.CkKK9V.rst new file mode 100644 index 00000000000000..723955270d02c4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-19-12-33-38.bpo-9694.CkKK9V.rst @@ -0,0 +1,2 @@ +Argparse help no longer uses the confusing phrase, "optional arguments". +It uses "options" instead. From d953e32a1ea55035494b0efdfb31581f6fdc3e61 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 23 Dec 2020 19:16:56 +0100 Subject: [PATCH 0861/1261] bpo-32381: pymain_run_command() uses PyCF_IGNORE_COOKIE (GH-23724) The coding cookie (ex: "# coding: latin1") is now ignored in the command passed to the -c command line option. Since pymain_run_command() uses UTF-8, pass PyCF_IGNORE_COOKIE compiler flag to the parser. pymain_run_python() no longer propages compiler flags between function calls. --- Lib/test/test_cmd_line.py | 8 ++++ .../2020-12-15-18-43-43.bpo-32381.3tIofL.rst | 2 + Modules/main.c | 42 ++++++++++--------- 3 files changed, 33 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-15-18-43-43.bpo-32381.3tIofL.rst diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index fa3329efa28b82..f12dff3202fe31 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -153,6 +153,14 @@ def test_non_ascii(self): % (os_helper.FS_NONASCII, ord(os_helper.FS_NONASCII))) assert_python_ok('-c', command) + @unittest.skipUnless(os_helper.FS_NONASCII, 'need os_helper.FS_NONASCII') + def test_coding(self): + # bpo-32381: the -c command ignores the coding cookie + ch = os_helper.FS_NONASCII + cmd = f"# coding: latin1\nprint(ascii('{ch}'))" + res = assert_python_ok('-c', cmd) + self.assertEqual(res.out.rstrip(), ascii(ch).encode('ascii')) + # On Windows, pass bytes to subprocess doesn't test how Python decodes the # command line, but how subprocess does decode bytes to unicode. Python # doesn't decode the command line because Windows provides directly the diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-15-18-43-43.bpo-32381.3tIofL.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-15-18-43-43.bpo-32381.3tIofL.rst new file mode 100644 index 00000000000000..fc8ea82fb084b1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-12-15-18-43-43.bpo-32381.3tIofL.rst @@ -0,0 +1,2 @@ +The coding cookie (ex: ``# coding: latin1``) is now ignored in the command +passed to the :option:`-c` command line option. Patch by Victor Stinner. diff --git a/Modules/main.c b/Modules/main.c index b97034ea1e78a8..ccf096352e928b 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -223,7 +223,7 @@ pymain_import_readline(const PyConfig *config) static int -pymain_run_command(wchar_t *command, PyCompilerFlags *cf) +pymain_run_command(wchar_t *command) { PyObject *unicode, *bytes; int ret; @@ -243,7 +243,9 @@ pymain_run_command(wchar_t *command, PyCompilerFlags *cf) goto error; } - ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf); + PyCompilerFlags cf = _PyCompilerFlags_INIT; + cf.cf_flags |= PyCF_IGNORE_COOKIE; + ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), &cf); Py_DECREF(bytes); return (ret != 0); @@ -306,7 +308,7 @@ pymain_run_module(const wchar_t *modname, int set_argv0) static int pymain_run_file_obj(PyObject *program_name, PyObject *filename, - int skip_source_first_line, PyCompilerFlags *cf) + int skip_source_first_line) { if (PySys_Audit("cpython.run_file", "O", filename) < 0) { return pymain_exit_err_print(); @@ -347,12 +349,13 @@ pymain_run_file_obj(PyObject *program_name, PyObject *filename, } /* PyRun_AnyFileExFlags(closeit=1) calls fclose(fp) before running code */ - int run = _PyRun_AnyFileObject(fp, filename, 1, cf); + PyCompilerFlags cf = _PyCompilerFlags_INIT; + int run = _PyRun_AnyFileObject(fp, filename, 1, &cf); return (run != 0); } static int -pymain_run_file(const PyConfig *config, PyCompilerFlags *cf) +pymain_run_file(const PyConfig *config) { PyObject *filename = PyUnicode_FromWideChar(config->run_filename, -1); if (filename == NULL) { @@ -367,7 +370,7 @@ pymain_run_file(const PyConfig *config, PyCompilerFlags *cf) } int res = pymain_run_file_obj(program_name, filename, - config->skip_source_first_line, cf); + config->skip_source_first_line); Py_DECREF(filename); Py_DECREF(program_name); return res; @@ -375,7 +378,7 @@ pymain_run_file(const PyConfig *config, PyCompilerFlags *cf) static int -pymain_run_startup(PyConfig *config, PyCompilerFlags *cf, int *exitcode) +pymain_run_startup(PyConfig *config, int *exitcode) { int ret; if (!config->use_environment) { @@ -416,7 +419,8 @@ pymain_run_startup(PyConfig *config, PyCompilerFlags *cf, int *exitcode) goto error; } - (void) _PyRun_SimpleFileObject(fp, startup, 0, cf); + PyCompilerFlags cf = _PyCompilerFlags_INIT; + (void) _PyRun_SimpleFileObject(fp, startup, 0, &cf); PyErr_Clear(); fclose(fp); ret = 0; @@ -469,14 +473,14 @@ pymain_run_interactive_hook(int *exitcode) static int -pymain_run_stdin(PyConfig *config, PyCompilerFlags *cf) +pymain_run_stdin(PyConfig *config) { if (stdin_is_interactive(config)) { config->inspect = 0; Py_InspectFlag = 0; /* do exit on SystemExit */ int exitcode; - if (pymain_run_startup(config, cf, &exitcode)) { + if (pymain_run_startup(config, &exitcode)) { return exitcode; } @@ -494,13 +498,14 @@ pymain_run_stdin(PyConfig *config, PyCompilerFlags *cf) return pymain_exit_err_print(); } - int run = PyRun_AnyFileExFlags(stdin, "", 0, cf); + PyCompilerFlags cf = _PyCompilerFlags_INIT; + int run = PyRun_AnyFileExFlags(stdin, "", 0, &cf); return (run != 0); } static void -pymain_repl(PyConfig *config, PyCompilerFlags *cf, int *exitcode) +pymain_repl(PyConfig *config, int *exitcode) { /* Check this environment variable at the end, to give programs the opportunity to set it from Python. */ @@ -519,7 +524,8 @@ pymain_repl(PyConfig *config, PyCompilerFlags *cf, int *exitcode) return; } - int res = PyRun_AnyFileFlags(stdin, "", cf); + PyCompilerFlags cf = _PyCompilerFlags_INIT; + int res = PyRun_AnyFileFlags(stdin, "", &cf); *exitcode = (res != 0); } @@ -565,13 +571,11 @@ pymain_run_python(int *exitcode) } } - PyCompilerFlags cf = _PyCompilerFlags_INIT; - pymain_header(config); pymain_import_readline(config); if (config->run_command) { - *exitcode = pymain_run_command(config->run_command, &cf); + *exitcode = pymain_run_command(config->run_command); } else if (config->run_module) { *exitcode = pymain_run_module(config->run_module, 1); @@ -580,13 +584,13 @@ pymain_run_python(int *exitcode) *exitcode = pymain_run_module(L"__main__", 0); } else if (config->run_filename != NULL) { - *exitcode = pymain_run_file(config, &cf); + *exitcode = pymain_run_file(config); } else { - *exitcode = pymain_run_stdin(config, &cf); + *exitcode = pymain_run_stdin(config); } - pymain_repl(config, &cf, exitcode); + pymain_repl(config, exitcode); goto done; error: From 028dc99a5811717d123bff649f5f96a404d28af2 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 23 Dec 2020 11:45:06 -0800 Subject: [PATCH 0862/1261] bpo-25246: Optimize deque.remove() (GH-23898) --- .../2020-12-22-13-16-43.bpo-25246.GhhCTl.rst | 1 + Modules/_collectionsmodule.c | 74 +++++++++++-------- 2 files changed, 43 insertions(+), 32 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-22-13-16-43.bpo-25246.GhhCTl.rst diff --git a/Misc/NEWS.d/next/Library/2020-12-22-13-16-43.bpo-25246.GhhCTl.rst b/Misc/NEWS.d/next/Library/2020-12-22-13-16-43.bpo-25246.GhhCTl.rst new file mode 100644 index 00000000000000..258bb12ff8beba --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-22-13-16-43.bpo-25246.GhhCTl.rst @@ -0,0 +1 @@ +Optimized :meth:`collections.deque.remove`. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 157875067635ac..90bafb0ea86d92 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1128,38 +1128,6 @@ deque_insert(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs) PyDoc_STRVAR(insert_doc, "D.insert(index, object) -- insert object before index"); -static PyObject * -deque_remove(dequeobject *deque, PyObject *value) -{ - Py_ssize_t i, n=Py_SIZE(deque); - - for (i=0 ; ileftblock->data[deque->leftindex]; - int cmp = PyObject_RichCompareBool(item, value, Py_EQ); - - if (Py_SIZE(deque) != n) { - PyErr_SetString(PyExc_IndexError, - "deque mutated during remove()."); - return NULL; - } - if (cmp > 0) { - PyObject *tgt = deque_popleft(deque, NULL); - assert (tgt != NULL); - if (_deque_rotate(deque, i)) - return NULL; - Py_DECREF(tgt); - Py_RETURN_NONE; - } - else if (cmp < 0) { - _deque_rotate(deque, i); - return NULL; - } - _deque_rotate(deque, -1); - } - PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque"); - return NULL; -} - PyDoc_STRVAR(remove_doc, "D.remove(value) -- remove first occurrence of value."); @@ -1227,6 +1195,48 @@ deque_del_item(dequeobject *deque, Py_ssize_t i) return rv; } +static PyObject * +deque_remove(dequeobject *deque, PyObject *value) +{ + PyObject *item; + block *b = deque->leftblock; + Py_ssize_t i, n = Py_SIZE(deque), index = deque->leftindex; + size_t start_state = deque->state; + int cmp, rv; + + for (i = 0 ; i < n; i++) { + item = b->data[index]; + Py_INCREF(item); + cmp = PyObject_RichCompareBool(item, value, Py_EQ); + Py_DECREF(item); + if (cmp < 0) { + return NULL; + } + if (start_state != deque->state) { + PyErr_SetString(PyExc_IndexError, + "deque mutated during iteration"); + return NULL; + } + if (cmp > 0) { + break; + } + index++; + if (index == BLOCKLEN) { + b = b->rightlink; + index = 0; + } + } + if (i == n) { + PyErr_Format(PyExc_ValueError, "%R is not in deque", value); + return NULL; + } + rv = deque_del_item(deque, i); + if (rv == -1) { + return NULL; + } + Py_RETURN_NONE; +} + static int deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v) { From 32d1a228c858d84cb15e34cba49b054ec0e6361e Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Thu, 24 Dec 2020 01:45:13 +0300 Subject: [PATCH 0863/1261] bpo-41960: Add globalns and localns parameters to inspect.signature and Signature.from_callable (GH-22583) --- Doc/library/inspect.rst | 22 ++++- Doc/whatsnew/3.10.rst | 5 ++ Lib/inspect.py | 80 +++++++------------ Lib/test/test_inspect.py | 20 +++++ .../2020-10-06-23-59-20.bpo-41960.icQ7Xd.rst | 2 + 5 files changed, 77 insertions(+), 52 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-10-06-23-59-20.bpo-41960.icQ7Xd.rst diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index b53a9421fbca61..850d6018bab1f9 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -556,7 +556,7 @@ The Signature object represents the call signature of a callable object and its return annotation. To retrieve a Signature object, use the :func:`signature` function. -.. function:: signature(callable, *, follow_wrapped=True) +.. function:: signature(callable, *, follow_wrapped=True, globalns=None, localns=None) Return a :class:`Signature` object for the given ``callable``:: @@ -581,6 +581,9 @@ function. Raises :exc:`ValueError` if no signature can be provided, and :exc:`TypeError` if that type of object is not supported. + ``globalns`` and ``localns`` are passed into + :func:`typing.get_type_hints` when resolving the annotations. + A slash(/) in the signature of a function denotes that the parameters prior to it are positional-only. For more info, see :ref:`the FAQ entry on positional-only parameters `. @@ -590,12 +593,21 @@ function. ``callable`` specifically (``callable.__wrapped__`` will not be used to unwrap decorated callables.) + .. versionadded:: 3.10 + ``globalns`` and ``localns`` parameters. + .. note:: Some callables may not be introspectable in certain implementations of Python. For example, in CPython, some built-in functions defined in C provide no metadata about their arguments. + .. note:: + + Will first try to resolve the annotations, but when it fails and + encounters with an error while that operation, the annotations will be + returned unchanged (as strings). + .. class:: Signature(parameters=None, *, return_annotation=Signature.empty) @@ -668,11 +680,12 @@ function. >>> str(new_sig) "(a, b) -> 'new return anno'" - .. classmethod:: Signature.from_callable(obj, *, follow_wrapped=True) + .. classmethod:: Signature.from_callable(obj, *, follow_wrapped=True, globalns=None, localns=None) Return a :class:`Signature` (or its subclass) object for a given callable ``obj``. Pass ``follow_wrapped=False`` to get a signature of ``obj`` - without unwrapping its ``__wrapped__`` chain. + without unwrapping its ``__wrapped__`` chain. ``globalns`` and + ``localns`` will be used as the namespaces when resolving annotations. This method simplifies subclassing of :class:`Signature`:: @@ -683,6 +696,9 @@ function. .. versionadded:: 3.5 + .. versionadded:: 3.10 + ``globalns`` and ``localns`` parameters. + .. class:: Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index a6f9b0b1754d29..b5fb1e9a629c1c 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -238,6 +238,11 @@ inspect When a module does not define ``__loader__``, fall back to ``__spec__.loader``. (Contributed by Brett Cannon in :issue:`42133`.) +Added *globalns* and *localns* parameters in :func:`~inspect.signature` and +:meth:`inspect.Signature.from_callable` to retrieve the annotations in given +local and global namespaces. +(Contributed by Batuhan Taskaya in :issue:`41960`.) + linecache --------- diff --git a/Lib/inspect.py b/Lib/inspect.py index 9150ac104dcb73..70c5ef7bb6471c 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -2137,9 +2137,9 @@ def p(name_node, default_node, default=empty): return cls(parameters, return_annotation=cls.empty) -def _get_type_hints(func): +def _get_type_hints(func, **kwargs): try: - return typing.get_type_hints(func) + return typing.get_type_hints(func, **kwargs) except Exception: # First, try to use the get_type_hints to resolve # annotations. But for keeping the behavior intact @@ -2164,7 +2164,8 @@ def _signature_from_builtin(cls, func, skip_bound_arg=True): return _signature_fromstr(cls, func, s, skip_bound_arg) -def _signature_from_function(cls, func, skip_bound_arg=True): +def _signature_from_function(cls, func, skip_bound_arg=True, + globalns=None, localns=None): """Private helper: constructs Signature for the given python function.""" is_duck_function = False @@ -2190,7 +2191,7 @@ def _signature_from_function(cls, func, skip_bound_arg=True): positional = arg_names[:pos_count] keyword_only_count = func_code.co_kwonlyargcount keyword_only = arg_names[pos_count:pos_count + keyword_only_count] - annotations = _get_type_hints(func) + annotations = _get_type_hints(func, globalns=globalns, localns=localns) defaults = func.__defaults__ kwdefaults = func.__kwdefaults__ @@ -2262,23 +2263,28 @@ def _signature_from_function(cls, func, skip_bound_arg=True): def _signature_from_callable(obj, *, follow_wrapper_chains=True, skip_bound_arg=True, + globalns=None, + localns=None, sigcls): """Private helper function to get signature for arbitrary callable objects. """ + _get_signature_of = functools.partial(_signature_from_callable, + follow_wrapper_chains=follow_wrapper_chains, + skip_bound_arg=skip_bound_arg, + globalns=globalns, + localns=localns, + sigcls=sigcls) + if not callable(obj): raise TypeError('{!r} is not a callable object'.format(obj)) if isinstance(obj, types.MethodType): # In this case we skip the first parameter of the underlying # function (usually `self` or `cls`). - sig = _signature_from_callable( - obj.__func__, - follow_wrapper_chains=follow_wrapper_chains, - skip_bound_arg=skip_bound_arg, - sigcls=sigcls) + sig = _get_signature_of(obj.__func__) if skip_bound_arg: return _signature_bound_method(sig) @@ -2292,11 +2298,7 @@ def _signature_from_callable(obj, *, # If the unwrapped object is a *method*, we might want to # skip its first parameter (self). # See test_signature_wrapped_bound_method for details. - return _signature_from_callable( - obj, - follow_wrapper_chains=follow_wrapper_chains, - skip_bound_arg=skip_bound_arg, - sigcls=sigcls) + return _get_signature_of(obj) try: sig = obj.__signature__ @@ -2323,11 +2325,7 @@ def _signature_from_callable(obj, *, # (usually `self`, or `cls`) will not be passed # automatically (as for boundmethods) - wrapped_sig = _signature_from_callable( - partialmethod.func, - follow_wrapper_chains=follow_wrapper_chains, - skip_bound_arg=skip_bound_arg, - sigcls=sigcls) + wrapped_sig = _get_signature_of(partialmethod.func) sig = _signature_get_partial(wrapped_sig, partialmethod, (None,)) first_wrapped_param = tuple(wrapped_sig.parameters.values())[0] @@ -2346,18 +2344,15 @@ def _signature_from_callable(obj, *, # If it's a pure Python function, or an object that is duck type # of a Python function (Cython functions, for instance), then: return _signature_from_function(sigcls, obj, - skip_bound_arg=skip_bound_arg) + skip_bound_arg=skip_bound_arg, + globalns=globalns, localns=localns) if _signature_is_builtin(obj): return _signature_from_builtin(sigcls, obj, skip_bound_arg=skip_bound_arg) if isinstance(obj, functools.partial): - wrapped_sig = _signature_from_callable( - obj.func, - follow_wrapper_chains=follow_wrapper_chains, - skip_bound_arg=skip_bound_arg, - sigcls=sigcls) + wrapped_sig = _get_signature_of(obj.func) return _signature_get_partial(wrapped_sig, obj) sig = None @@ -2368,29 +2363,17 @@ def _signature_from_callable(obj, *, # in its metaclass call = _signature_get_user_defined_method(type(obj), '__call__') if call is not None: - sig = _signature_from_callable( - call, - follow_wrapper_chains=follow_wrapper_chains, - skip_bound_arg=skip_bound_arg, - sigcls=sigcls) + sig = _get_signature_of(call) else: # Now we check if the 'obj' class has a '__new__' method new = _signature_get_user_defined_method(obj, '__new__') if new is not None: - sig = _signature_from_callable( - new, - follow_wrapper_chains=follow_wrapper_chains, - skip_bound_arg=skip_bound_arg, - sigcls=sigcls) + sig = _get_signature_of(new) else: # Finally, we should have at least __init__ implemented init = _signature_get_user_defined_method(obj, '__init__') if init is not None: - sig = _signature_from_callable( - init, - follow_wrapper_chains=follow_wrapper_chains, - skip_bound_arg=skip_bound_arg, - sigcls=sigcls) + sig = _get_signature_of(init) if sig is None: # At this point we know, that `obj` is a class, with no user- @@ -2436,11 +2419,7 @@ def _signature_from_callable(obj, *, call = _signature_get_user_defined_method(type(obj), '__call__') if call is not None: try: - sig = _signature_from_callable( - call, - follow_wrapper_chains=follow_wrapper_chains, - skip_bound_arg=skip_bound_arg, - sigcls=sigcls) + sig = _get_signature_of(call) except ValueError as ex: msg = 'no signature found for {!r}'.format(obj) raise ValueError(msg) from ex @@ -2892,10 +2871,12 @@ def from_builtin(cls, func): return _signature_from_builtin(cls, func) @classmethod - def from_callable(cls, obj, *, follow_wrapped=True): + def from_callable(cls, obj, *, + follow_wrapped=True, globalns=None, localns=None): """Constructs Signature for the given callable object.""" return _signature_from_callable(obj, sigcls=cls, - follow_wrapper_chains=follow_wrapped) + follow_wrapper_chains=follow_wrapped, + globalns=globalns, localns=localns) @property def parameters(self): @@ -3143,9 +3124,10 @@ def __str__(self): return rendered -def signature(obj, *, follow_wrapped=True): +def signature(obj, *, follow_wrapped=True, globalns=None, localns=None): """Get a signature object for the passed callable.""" - return Signature.from_callable(obj, follow_wrapped=follow_wrapped) + return Signature.from_callable(obj, follow_wrapped=follow_wrapped, + globalns=globalns, localns=localns) def _main(): diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index c81d828b57ece9..706fcbe3439b48 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -3250,6 +3250,26 @@ def test_signater_parameters_is_ordered(self): p2 = inspect.signature(lambda y, x: None).parameters self.assertNotEqual(p1, p2) + def test_signature_annotations_with_local_namespaces(self): + class Foo: ... + def func(foo: Foo) -> int: pass + def func2(foo: Foo, bar: Bar) -> int: pass + + for signature_func in (inspect.signature, inspect.Signature.from_callable): + with self.subTest(signature_func = signature_func): + sig1 = signature_func(func) + self.assertEqual(sig1.return_annotation, 'int') + self.assertEqual(sig1.parameters['foo'].annotation, 'Foo') + + sig2 = signature_func(func, localns=locals()) + self.assertEqual(sig2.return_annotation, int) + self.assertEqual(sig2.parameters['foo'].annotation, Foo) + + sig3 = signature_func(func2, globalns={'Bar': int}, localns=locals()) + self.assertEqual(sig3.return_annotation, int) + self.assertEqual(sig3.parameters['foo'].annotation, Foo) + self.assertEqual(sig3.parameters['bar'].annotation, int) + class TestParameterObject(unittest.TestCase): def test_signature_parameter_kinds(self): diff --git a/Misc/NEWS.d/next/Library/2020-10-06-23-59-20.bpo-41960.icQ7Xd.rst b/Misc/NEWS.d/next/Library/2020-10-06-23-59-20.bpo-41960.icQ7Xd.rst new file mode 100644 index 00000000000000..f7e71998dab9b6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-06-23-59-20.bpo-41960.icQ7Xd.rst @@ -0,0 +1,2 @@ +Add ``globalns`` and ``localns`` parameters to the :func:`inspect.signature` +and :meth:`inspect.Signature.from_callable`. From 01c00fa9e50ee8d06a52696068513cc894b8d5dd Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Thu, 24 Dec 2020 10:47:40 +0800 Subject: [PATCH 0864/1261] bpo-42195: Override _CallableGenericAlias's __getitem__ (GH-23915) Added `__getitem__` for `_CallableGenericAlias` so that it returns a subclass (itself) of `types.GenericAlias` rather than the default behavior of returning a plain `types.GenericAlias`. This fixes `repr` issues occuring after `TypeVar` substitution arising from the previous behavior. --- Lib/_collections_abc.py | 12 +++++++++++- Lib/test/test_genericalias.py | 6 ++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index 7c3faa64ea7f98..e4eac796462359 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -434,7 +434,7 @@ def __create_ga(cls, origin, args): raise TypeError( "Callable must be used as Callable[[arg, ...], result].") t_args, t_result = args - if isinstance(t_args, list): + if isinstance(t_args, (list, tuple)): ga_args = tuple(t_args) + (t_result,) # This relaxes what t_args can be on purpose to allow things like # PEP 612 ParamSpec. Responsibility for whether a user is using @@ -456,6 +456,16 @@ def __reduce__(self): args = list(args[:-1]), args[-1] return _CallableGenericAlias, (Callable, args) + def __getitem__(self, item): + # Called during TypeVar substitution, returns the custom subclass + # rather than the default types.GenericAlias object. + ga = super().__getitem__(item) + args = ga.__args__ + t_result = args[-1] + t_args = args[:-1] + args = (t_args, t_result) + return _CallableGenericAlias(Callable, args) + def _type_repr(obj): """Return the repr() of an object, special-casing types (internal helper). diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 5de13fe6d2f68c..ccf40b13d3a94c 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -347,6 +347,12 @@ def test_abc_callable(self): self.assertEqual(C2[int, float, str], Callable[[int, float], str]) self.assertEqual(C3[int], Callable[..., int]) + # multi chaining + C4 = C2[int, V, str] + self.assertEqual(repr(C4).split(".")[-1], "Callable[[int, ~V], str]") + self.assertEqual(repr(C4[dict]).split(".")[-1], "Callable[[int, dict], str]") + self.assertEqual(C4[dict], Callable[[int, dict], str]) + with self.subTest("Testing type erasure"): class C1(Callable): def __call__(self): From 7a61bbc201102eb28b75a100d00d0e42c1eac529 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 23 Dec 2020 19:52:09 -0800 Subject: [PATCH 0865/1261] bpo-38308: Add optional weighting to statistics.harmonic_mean() (GH-23914) --- Doc/library/statistics.rst | 21 +++++---- Lib/statistics.py | 46 +++++++++++-------- Lib/test/test_statistics.py | 21 +++++++++ .../2020-12-23-15-16-12.bpo-38308.lB4Sv0.rst | 1 + 4 files changed, 62 insertions(+), 27 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-23-15-16-12.bpo-38308.lB4Sv0.rst diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 38a499ab37e890..6467704006d905 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -156,10 +156,11 @@ However, for reading convenience, most of the examples show sorted sequences. .. versionadded:: 3.8 -.. function:: harmonic_mean(data) +.. function:: harmonic_mean(data, weights=None) Return the harmonic mean of *data*, a sequence or iterable of - real-valued numbers. + real-valued numbers. If *weights* is omitted or *None*, then + equal weighting is assumed. The harmonic mean, sometimes called the subcontrary mean, is the reciprocal of the arithmetic :func:`mean` of the reciprocals of the @@ -179,17 +180,17 @@ However, for reading convenience, most of the examples show sorted sequences. >>> harmonic_mean([40, 60]) 48.0 - Suppose an investor purchases an equal value of shares in each of - three companies, with P/E (price/earning) ratios of 2.5, 3 and 10. - What is the average P/E ratio for the investor's portfolio? + Suppose a car travels 40 km/hr for 5 km, and when traffic clears, + speeds-up to 60 km/hr for the remaining 30 km of the journey. What + is the average speed? .. doctest:: - >>> harmonic_mean([2.5, 3, 10]) # For an equal investment portfolio. - 3.6 + >>> harmonic_mean([40, 60], weights=[5, 30]) + 56.0 - :exc:`StatisticsError` is raised if *data* is empty, or any element - is less than zero. + :exc:`StatisticsError` is raised if *data* is empty, any element + is less than zero, or if the weighted sum isn't positive. The current algorithm has an early-out when it encounters a zero in the input. This means that the subsequent inputs are not tested @@ -197,6 +198,8 @@ However, for reading convenience, most of the examples show sorted sequences. .. versionadded:: 3.6 + .. versionchanged:: 3.8 + Added support for *weights*. .. function:: median(data) diff --git a/Lib/statistics.py b/Lib/statistics.py index f9d3802ec5f83e..4b054b961141b4 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -106,7 +106,7 @@ from fractions import Fraction from decimal import Decimal -from itertools import groupby +from itertools import groupby, repeat from bisect import bisect_left, bisect_right from math import hypot, sqrt, fabs, exp, erf, tau, log, fsum from operator import itemgetter @@ -364,37 +364,37 @@ def geometric_mean(data): ' containing positive numbers') from None -def harmonic_mean(data): +def harmonic_mean(data, weights=None): """Return the harmonic mean of data. The harmonic mean, sometimes called the subcontrary mean, is the reciprocal of the arithmetic mean of the reciprocals of the data, and is often appropriate when averaging quantities which are rates - or ratios, for example speeds. Example: + or ratios, for example speeds. - Suppose an investor purchases an equal value of shares in each of - three companies, with P/E (price/earning) ratios of 2.5, 3 and 10. - What is the average P/E ratio for the investor's portfolio? + Suppose a car travels 40 km/hr for 5 km and then speeds-up to + 60 km/hr for another 5 km. What is the average speed? - >>> harmonic_mean([2.5, 3, 10]) # For an equal investment portfolio. - 3.6 + >>> harmonic_mean([40, 60]) + 48.0 - Using the arithmetic mean would give an average of about 5.167, which - is too high. + Suppose a car travels 40 km/hr for 5 km, and when traffic clears, + speeds-up to 60 km/hr for the remaining 30 km of the journey. What + is the average speed? + + >>> harmonic_mean([40, 60], weights=[5, 30]) + 56.0 If ``data`` is empty, or any element is less than zero, ``harmonic_mean`` will raise ``StatisticsError``. """ - # For a justification for using harmonic mean for P/E ratios, see - # http://fixthepitch.pellucid.com/comps-analysis-the-missing-harmony-of-summary-statistics/ - # http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2621087 if iter(data) is data: data = list(data) errmsg = 'harmonic mean does not support negative values' n = len(data) if n < 1: raise StatisticsError('harmonic_mean requires at least one data point') - elif n == 1: + elif n == 1 and weights is None: x = data[0] if isinstance(x, (numbers.Real, Decimal)): if x < 0: @@ -402,13 +402,23 @@ def harmonic_mean(data): return x else: raise TypeError('unsupported type') + if weights is None: + weights = repeat(1, n) + sum_weights = n + else: + if iter(weights) is weights: + weights = list(weights) + if len(weights) != n: + raise StatisticsError('Number of weights does not match data size') + _, sum_weights, _ = _sum(w for w in _fail_neg(weights, errmsg)) try: - T, total, count = _sum(1 / x for x in _fail_neg(data, errmsg)) + data = _fail_neg(data, errmsg) + T, total, count = _sum(w / x if w else 0 for w, x in zip(weights, data)) except ZeroDivisionError: return 0 - assert count == n - return _convert(n / total, T) - + if total <= 0: + raise StatisticsError('Weighted sum must be positive') + return _convert(sum_weights / total, T) # FIXME: investigate ways to calculate medians without sorting? Quickselect? def median(data): diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 997110732a1765..4b8686b6818220 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -1599,6 +1599,27 @@ def test_doubled_data(self): actual = self.func(data*2) self.assertApproxEqual(actual, expected) + def test_with_weights(self): + self.assertEqual(self.func([40, 60], [5, 30]), 56.0) # common case + self.assertEqual(self.func([40, 60], + weights=[5, 30]), 56.0) # keyword argument + self.assertEqual(self.func(iter([40, 60]), + iter([5, 30])), 56.0) # iterator inputs + self.assertEqual( + self.func([Fraction(10, 3), Fraction(23, 5), Fraction(7, 2)], [5, 2, 10]), + self.func([Fraction(10, 3)] * 5 + + [Fraction(23, 5)] * 2 + + [Fraction(7, 2)] * 10)) + self.assertEqual(self.func([10], [7]), 10) # n=1 fast path + with self.assertRaises(TypeError): + self.func([1, 2, 3], [1, (), 3]) # non-numeric weight + with self.assertRaises(statistics.StatisticsError): + self.func([1, 2, 3], [1, 2]) # wrong number of weights + with self.assertRaises(statistics.StatisticsError): + self.func([10], [0]) # no non-zero weights + with self.assertRaises(statistics.StatisticsError): + self.func([10, 20], [0, 0]) # no non-zero weights + class TestMedian(NumericTestCase, AverageMixin): # Common tests for median and all median.* functions. diff --git a/Misc/NEWS.d/next/Library/2020-12-23-15-16-12.bpo-38308.lB4Sv0.rst b/Misc/NEWS.d/next/Library/2020-12-23-15-16-12.bpo-38308.lB4Sv0.rst new file mode 100644 index 00000000000000..cf3807d9dc48af --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-23-15-16-12.bpo-38308.lB4Sv0.rst @@ -0,0 +1 @@ +Add optional *weights* to *statistics.harmonic_mean()*. From 41127aedca1015830abf271cdc512848b12f5b61 Mon Sep 17 00:00:00 2001 From: kj <28750310+Fidget-Spinner@users.noreply.github.com> Date: Thu, 24 Dec 2020 12:33:48 +0800 Subject: [PATCH 0866/1261] bpo-41559: Implement PEP 612 - Add ParamSpec and Concatenate to typing (#23702) --- Lib/_collections_abc.py | 28 ++- Lib/test/test_genericalias.py | 21 ++ Lib/test/test_typing.py | 120 ++++++++-- Lib/typing.py | 209 ++++++++++++++---- .../2020-12-10-00-09-40.bpo-41559.1l4yjP.rst | 2 + Objects/genericaliasobject.c | 76 +++++-- 6 files changed, 381 insertions(+), 75 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-10-00-09-40.bpo-41559.1l4yjP.rst diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index e4eac796462359..87302ac76d8019 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -416,7 +416,7 @@ def __subclasshook__(cls, C): class _CallableGenericAlias(GenericAlias): """ Represent `Callable[argtypes, resulttype]`. - This sets ``__args__`` to a tuple containing the flattened``argtypes`` + This sets ``__args__`` to a tuple containing the flattened ``argtypes`` followed by ``resulttype``. Example: ``Callable[[int, str], float]`` sets ``__args__`` to @@ -444,7 +444,7 @@ def __create_ga(cls, origin, args): return super().__new__(cls, origin, ga_args) def __repr__(self): - if len(self.__args__) == 2 and self.__args__[0] is Ellipsis: + if _has_special_args(self.__args__): return super().__repr__() return (f'collections.abc.Callable' f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], ' @@ -452,7 +452,7 @@ def __repr__(self): def __reduce__(self): args = self.__args__ - if not (len(args) == 2 and args[0] is Ellipsis): + if not _has_special_args(args): args = list(args[:-1]), args[-1] return _CallableGenericAlias, (Callable, args) @@ -461,12 +461,28 @@ def __getitem__(self, item): # rather than the default types.GenericAlias object. ga = super().__getitem__(item) args = ga.__args__ - t_result = args[-1] - t_args = args[:-1] - args = (t_args, t_result) + # args[0] occurs due to things like Z[[int, str, bool]] from PEP 612 + if not isinstance(ga.__args__[0], tuple): + t_result = ga.__args__[-1] + t_args = ga.__args__[:-1] + args = (t_args, t_result) return _CallableGenericAlias(Callable, args) +def _has_special_args(args): + """Checks if args[0] matches either ``...``, ``ParamSpec`` or + ``_ConcatenateGenericAlias`` from typing.py + """ + if len(args) != 2: + return False + obj = args[0] + if obj is Ellipsis: + return True + obj = type(obj) + names = ('ParamSpec', '_ConcatenateGenericAlias') + return obj.__module__ == 'typing' and any(obj.__name__ == name for name in names) + + def _type_repr(obj): """Return the repr() of an object, special-casing types (internal helper). diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index ccf40b13d3a94c..fd024dcec8208b 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -369,6 +369,27 @@ def __call__(self): self.assertEqual(c1.__args__, c2.__args__) self.assertEqual(hash(c1.__args__), hash(c2.__args__)) + with self.subTest("Testing ParamSpec uses"): + P = typing.ParamSpec('P') + C1 = Callable[P, T] + # substitution + self.assertEqual(C1[int, str], Callable[[int], str]) + self.assertEqual(C1[[int, str], str], Callable[[int, str], str]) + self.assertEqual(repr(C1).split(".")[-1], "Callable[~P, ~T]") + self.assertEqual(repr(C1[int, str]).split(".")[-1], "Callable[[int], str]") + + C2 = Callable[P, int] + # special case in PEP 612 where + # X[int, str, float] == X[[int, str, float]] + self.assertEqual(C2[int, str, float], C2[[int, str, float]]) + self.assertEqual(repr(C2).split(".")[-1], "Callable[~P, int]") + self.assertEqual(repr(C2[int, str]).split(".")[-1], "Callable[[int, str], int]") + + with self.subTest("Testing Concatenate uses"): + P = typing.ParamSpec('P') + C1 = Callable[typing.Concatenate[int, P], int] + self.assertEqual(repr(C1), "collections.abc.Callable" + "[typing.Concatenate[int, ~P], int]") if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 8e86e769a0d833..c340c8a898289d 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -25,6 +25,7 @@ from typing import Pattern, Match from typing import Annotated, ForwardRef from typing import TypeAlias +from typing import ParamSpec, Concatenate import abc import typing import weakref @@ -1130,10 +1131,6 @@ class P(PR[int, T], Protocol[T]): PR[int] with self.assertRaises(TypeError): P[int, str] - with self.assertRaises(TypeError): - PR[int, 1] - with self.assertRaises(TypeError): - PR[int, ClassVar] class C(PR[int, T]): pass @@ -1155,8 +1152,6 @@ class P(PR[int, str], Protocol): self.assertIsSubclass(P, PR) with self.assertRaises(TypeError): PR[int] - with self.assertRaises(TypeError): - PR[int, 1] class P1(Protocol, Generic[T]): def bar(self, x: T) -> str: ... @@ -1175,8 +1170,6 @@ def bar(self, x: str) -> str: return x self.assertIsInstance(Test(), PSub) - with self.assertRaises(TypeError): - PR[int, ClassVar] def test_init_called(self): T = TypeVar('T') @@ -1746,8 +1739,6 @@ def test_extended_generic_rules_eq(self): self.assertEqual(typing.Iterable[Tuple[T, T]][T], typing.Iterable[Tuple[T, T]]) with self.assertRaises(TypeError): Tuple[T, int][()] - with self.assertRaises(TypeError): - Tuple[T, U][T, ...] self.assertEqual(Union[T, int][int], int) self.assertEqual(Union[T, U][int, Union[int, str]], Union[int, str]) @@ -1759,10 +1750,6 @@ class Derived(Base): ... self.assertEqual(Callable[[T], T][KT], Callable[[KT], KT]) self.assertEqual(Callable[..., List[T]][int], Callable[..., List[int]]) - with self.assertRaises(TypeError): - Callable[[T], U][..., int] - with self.assertRaises(TypeError): - Callable[[T], U][[], int] def test_extended_generic_rules_repr(self): T = TypeVar('T') @@ -4243,6 +4230,111 @@ def test_cannot_subscript(self): TypeAlias[int] +class ParamSpecTests(BaseTestCase): + + def test_basic_plain(self): + P = ParamSpec('P') + self.assertEqual(P, P) + self.assertIsInstance(P, ParamSpec) + + def test_valid_uses(self): + P = ParamSpec('P') + T = TypeVar('T') + C1 = Callable[P, int] + self.assertEqual(C1.__args__, (P, int)) + self.assertEqual(C1.__parameters__, (P,)) + C2 = Callable[P, T] + self.assertEqual(C2.__args__, (P, T)) + self.assertEqual(C2.__parameters__, (P, T)) + # Test collections.abc.Callable too. + C3 = collections.abc.Callable[P, int] + self.assertEqual(C3.__args__, (P, int)) + self.assertEqual(C3.__parameters__, (P,)) + C4 = collections.abc.Callable[P, T] + self.assertEqual(C4.__args__, (P, T)) + self.assertEqual(C4.__parameters__, (P, T)) + + # ParamSpec instances should also have args and kwargs attributes. + self.assertIn('args', dir(P)) + self.assertIn('kwargs', dir(P)) + P.args + P.kwargs + + def test_user_generics(self): + T = TypeVar("T") + P = ParamSpec("P") + P_2 = ParamSpec("P_2") + + class X(Generic[T, P]): + f: Callable[P, int] + x: T + G1 = X[int, P_2] + self.assertEqual(G1.__args__, (int, P_2)) + self.assertEqual(G1.__parameters__, (P_2,)) + + G2 = X[int, Concatenate[int, P_2]] + self.assertEqual(G2.__args__, (int, Concatenate[int, P_2])) + self.assertEqual(G2.__parameters__, (P_2,)) + + G3 = X[int, [int, bool]] + self.assertEqual(G3.__args__, (int, (int, bool))) + self.assertEqual(G3.__parameters__, ()) + + G4 = X[int, ...] + self.assertEqual(G4.__args__, (int, Ellipsis)) + self.assertEqual(G4.__parameters__, ()) + + class Z(Generic[P]): + f: Callable[P, int] + + G5 = Z[[int, str, bool]] + self.assertEqual(G5.__args__, ((int, str, bool),)) + self.assertEqual(G5.__parameters__, ()) + + G6 = Z[int, str, bool] + self.assertEqual(G6.__args__, ((int, str, bool),)) + self.assertEqual(G6.__parameters__, ()) + + # G5 and G6 should be equivalent according to the PEP + self.assertEqual(G5.__args__, G6.__args__) + self.assertEqual(G5.__origin__, G6.__origin__) + self.assertEqual(G5.__parameters__, G6.__parameters__) + self.assertEqual(G5, G6) + + def test_var_substitution(self): + T = TypeVar("T") + P = ParamSpec("P") + C1 = Callable[P, T] + self.assertEqual(C1[int, str], Callable[[int], str]) + self.assertEqual(C1[[int, str, dict], float], Callable[[int, str, dict], float]) + + +class ConcatenateTests(BaseTestCase): + def test_basics(self): + P = ParamSpec('P') + class MyClass: ... + c = Concatenate[MyClass, P] + self.assertNotEqual(c, Concatenate) + + def test_valid_uses(self): + P = ParamSpec('P') + T = TypeVar('T') + C1 = Callable[Concatenate[int, P], int] + self.assertEqual(C1.__args__, (Concatenate[int, P], int)) + self.assertEqual(C1.__parameters__, (P,)) + C2 = Callable[Concatenate[int, T, P], T] + self.assertEqual(C2.__args__, (Concatenate[int, T, P], T)) + self.assertEqual(C2.__parameters__, (T, P)) + + # Test collections.abc.Callable too. + C3 = collections.abc.Callable[Concatenate[int, P], int] + self.assertEqual(C3.__args__, (Concatenate[int, P], int)) + self.assertEqual(C3.__parameters__, (P,)) + C4 = collections.abc.Callable[Concatenate[int, T, P], T] + self.assertEqual(C4.__args__, (Concatenate[int, T, P], T)) + self.assertEqual(C4.__parameters__, (T, P)) + + class AllTests(BaseTestCase): """Tests for __all__.""" diff --git a/Lib/typing.py b/Lib/typing.py index 7f07321cda82a7..7b79876d4ebc70 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -4,8 +4,10 @@ At large scale, the structure of the module is following: * Imports and exports, all public names should be explicitly added to __all__. * Internal helper functions: these should never be used in code outside this module. -* _SpecialForm and its instances (special forms): Any, NoReturn, ClassVar, Union, Optional -* Two classes whose instances can be type arguments in addition to types: ForwardRef and TypeVar +* _SpecialForm and its instances (special forms): + Any, NoReturn, ClassVar, Union, Optional, Concatenate +* Classes whose instances can be type arguments in addition to types: + ForwardRef, TypeVar and ParamSpec * The core of internal generics API: _GenericAlias and _VariadicGenericAlias, the latter is currently only used by Tuple and Callable. All subscripted types like X[int], Union[int, str], etc., are instances of either of these classes. @@ -36,11 +38,13 @@ 'Any', 'Callable', 'ClassVar', + 'Concatenate', 'Final', 'ForwardRef', 'Generic', 'Literal', 'Optional', + 'ParamSpec', 'Protocol', 'Tuple', 'Type', @@ -154,7 +158,7 @@ def _type_check(arg, msg, is_argument=True): return arg if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol): raise TypeError(f"Plain {arg} is not valid as type argument") - if isinstance(arg, (type, TypeVar, ForwardRef, types.Union)): + if isinstance(arg, (type, TypeVar, ForwardRef, types.Union, ParamSpec)): return arg if not callable(arg): raise TypeError(f"{msg} Got {arg!r:.100}.") @@ -183,14 +187,14 @@ def _type_repr(obj): def _collect_type_vars(types): - """Collect all type variable contained in types in order of - first appearance (lexicographic order). For example:: + """Collect all type variable-like variables contained + in types in order of first appearance (lexicographic order). For example:: _collect_type_vars((T, List[S, T])) == (T, S) """ tvars = [] for t in types: - if isinstance(t, TypeVar) and t not in tvars: + if isinstance(t, _TypeVarLike) and t not in tvars: tvars.append(t) if isinstance(t, (_GenericAlias, GenericAlias)): tvars.extend([t for t in t.__parameters__ if t not in tvars]) @@ -208,6 +212,21 @@ def _check_generic(cls, parameters, elen): raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};" f" actual {alen}, expected {elen}") +def _prepare_paramspec_params(cls, params): + """Prepares the parameters for a Generic containing ParamSpec + variables (internal helper). + """ + # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612. + if len(cls.__parameters__) == 1 and len(params) > 1: + return (params,) + else: + _params = [] + # Convert lists to tuples to help other libraries cache the results. + for p, tvar in zip(params, cls.__parameters__): + if isinstance(tvar, ParamSpec) and isinstance(p, list): + p = tuple(p) + _params.append(p) + return tuple(_params) def _deduplicate(params): # Weed out strict duplicates, preserving the first of each occurrence. @@ -523,6 +542,29 @@ def TypeAlias(self, parameters): raise TypeError(f"{self} is not subscriptable") +@_SpecialForm +def Concatenate(self, parameters): + """Used in conjunction with ParamSpec and Callable to represent a higher + order function which adds, removes or transforms parameters of a Callable. + + For example:: + + Callable[Concatenate[int, P], int] + + See PEP 612 for detailed information. + """ + if parameters == (): + raise TypeError("Cannot take a Concatenate of no types.") + if not isinstance(parameters, tuple): + parameters = (parameters,) + if not isinstance(parameters[-1], ParamSpec): + raise TypeError("The last parameter to Concatenate should be a " + "ParamSpec variable.") + msg = "Concatenate[arg, ...]: each arg must be a type." + parameters = tuple(_type_check(p, msg) for p in parameters) + return _ConcatenateGenericAlias(self, parameters) + + class ForwardRef(_Final, _root=True): """Internal wrapper to hold a forward reference.""" @@ -585,8 +627,41 @@ def __hash__(self): def __repr__(self): return f'ForwardRef({self.__forward_arg__!r})' +class _TypeVarLike: + """Mixin for TypeVar-like types (TypeVar and ParamSpec).""" + def __init__(self, bound, covariant, contravariant): + """Used to setup TypeVars and ParamSpec's bound, covariant and + contravariant attributes. + """ + if covariant and contravariant: + raise ValueError("Bivariant types are not supported.") + self.__covariant__ = bool(covariant) + self.__contravariant__ = bool(contravariant) + if bound: + self.__bound__ = _type_check(bound, "Bound must be a type.") + else: + self.__bound__ = None + + def __or__(self, right): + return Union[self, right] + + def __ror__(self, right): + return Union[self, right] + + def __repr__(self): + if self.__covariant__: + prefix = '+' + elif self.__contravariant__: + prefix = '-' + else: + prefix = '~' + return prefix + self.__name__ + + def __reduce__(self): + return self.__name__ + -class TypeVar(_Final, _Immutable, _root=True): +class TypeVar( _Final, _Immutable, _TypeVarLike, _root=True): """Type variable. Usage:: @@ -636,20 +711,13 @@ def longest(x: A, y: A) -> A: def __init__(self, name, *constraints, bound=None, covariant=False, contravariant=False): self.__name__ = name - if covariant and contravariant: - raise ValueError("Bivariant types are not supported.") - self.__covariant__ = bool(covariant) - self.__contravariant__ = bool(contravariant) + super().__init__(bound, covariant, contravariant) if constraints and bound is not None: raise TypeError("Constraints cannot be combined with bound=...") if constraints and len(constraints) == 1: raise TypeError("A single constraint is not allowed") msg = "TypeVar(name, constraint, ...): constraints must be types." self.__constraints__ = tuple(_type_check(t, msg) for t in constraints) - if bound: - self.__bound__ = _type_check(bound, "Bound must be a type.") - else: - self.__bound__ = None try: def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') # for pickling except (AttributeError, ValueError): @@ -657,23 +725,68 @@ def __init__(self, name, *constraints, bound=None, if def_mod != 'typing': self.__module__ = def_mod - def __or__(self, right): - return Union[self, right] - def __ror__(self, right): - return Union[self, right] +class ParamSpec(_Final, _Immutable, _TypeVarLike, _root=True): + """Parameter specification variable. - def __repr__(self): - if self.__covariant__: - prefix = '+' - elif self.__contravariant__: - prefix = '-' - else: - prefix = '~' - return prefix + self.__name__ + Usage:: - def __reduce__(self): - return self.__name__ + P = ParamSpec('P') + + Parameter specification variables exist primarily for the benefit of static + type checkers. They are used to forward the parameter types of one + Callable to another Callable, a pattern commonly found in higher order + functions and decorators. They are only valid when used in Concatenate, or + as the first argument to Callable, or as parameters for user-defined Generics. + See class Generic for more information on generic types. An example for + annotating a decorator:: + + T = TypeVar('T') + P = ParamSpec('P') + + def add_logging(f: Callable[P, T]) -> Callable[P, T]: + '''A type-safe decorator to add logging to a function.''' + def inner(*args: P.args, **kwargs: P.kwargs) -> T: + logging.info(f'{f.__name__} was called') + return f(*args, **kwargs) + return inner + + @add_logging + def add_two(x: float, y: float) -> float: + '''Add two numbers together.''' + return x + y + + Parameter specification variables defined with covariant=True or + contravariant=True can be used to declare covariant or contravariant + generic types. These keyword arguments are valid, but their actual semantics + are yet to be decided. See PEP 612 for details. + + Parameter specification variables can be introspected. e.g.: + + P.__name__ == 'T' + P.__bound__ == None + P.__covariant__ == False + P.__contravariant__ == False + + Note that only parameter specification variables defined in global scope can + be pickled. + """ + + __slots__ = ('__name__', '__bound__', '__covariant__', '__contravariant__', + '__dict__') + + args = object() + kwargs = object() + + def __init__(self, name, bound=None, covariant=False, contravariant=False): + self.__name__ = name + super().__init__(bound, covariant, contravariant) + try: + def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + def_mod = None + if def_mod != 'typing': + self.__module__ = def_mod def _is_dunder(attr): @@ -783,21 +896,26 @@ def __getitem__(self, params): raise TypeError(f"Cannot subscript already-subscripted {self}") if not isinstance(params, tuple): params = (params,) - msg = "Parameters to generic types must be types." - params = tuple(_type_check(p, msg) for p in params) + params = tuple(_type_convert(p) for p in params) + if any(isinstance(t, ParamSpec) for t in self.__parameters__): + params = _prepare_paramspec_params(self, params) _check_generic(self, params, len(self.__parameters__)) subst = dict(zip(self.__parameters__, params)) new_args = [] for arg in self.__args__: - if isinstance(arg, TypeVar): + if isinstance(arg, _TypeVarLike): arg = subst[arg] elif isinstance(arg, (_GenericAlias, GenericAlias)): subparams = arg.__parameters__ if subparams: subargs = tuple(subst[x] for x in subparams) arg = arg[subargs] - new_args.append(arg) + # Required to flatten out the args for CallableGenericAlias + if self.__origin__ == collections.abc.Callable and isinstance(arg, tuple): + new_args.extend(arg) + else: + new_args.append(arg) return self.copy_with(tuple(new_args)) def copy_with(self, params): @@ -884,15 +1002,18 @@ def __ror__(self, right): class _CallableGenericAlias(_GenericAlias, _root=True): def __repr__(self): assert self._name == 'Callable' - if len(self.__args__) == 2 and self.__args__[0] is Ellipsis: + args = self.__args__ + if len(args) == 2 and (args[0] is Ellipsis + or isinstance(args[0], (ParamSpec, _ConcatenateGenericAlias))): return super().__repr__() return (f'typing.Callable' - f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], ' - f'{_type_repr(self.__args__[-1])}]') + f'[[{", ".join([_type_repr(a) for a in args[:-1]])}], ' + f'{_type_repr(args[-1])}]') def __reduce__(self): args = self.__args__ - if not (len(args) == 2 and args[0] is ...): + if not (len(args) == 2 and (args[0] is Ellipsis + or isinstance(args[0], (ParamSpec, _ConcatenateGenericAlias)))): args = list(args[:-1]), args[-1] return operator.getitem, (Callable, args) @@ -992,6 +1113,10 @@ def __hash__(self): return hash(frozenset(_value_and_type_iter(self.__args__))) +class _ConcatenateGenericAlias(_GenericAlias, _root=True): + pass + + class Generic: """Abstract base class for generic types. @@ -1022,18 +1147,20 @@ def __class_getitem__(cls, params): if not params and cls is not Tuple: raise TypeError( f"Parameter list to {cls.__qualname__}[...] cannot be empty") - msg = "Parameters to generic types must be types." - params = tuple(_type_check(p, msg) for p in params) + params = tuple(_type_convert(p) for p in params) if cls in (Generic, Protocol): # Generic and Protocol can only be subscripted with unique type variables. - if not all(isinstance(p, TypeVar) for p in params): + if not all(isinstance(p, _TypeVarLike) for p in params): raise TypeError( - f"Parameters to {cls.__name__}[...] must all be type variables") + f"Parameters to {cls.__name__}[...] must all be type variables " + f"or parameter specification variables.") if len(set(params)) != len(params): raise TypeError( f"Parameters to {cls.__name__}[...] must all be unique") else: # Subscripting a regular Generic subclass. + if any(isinstance(t, ParamSpec) for t in cls.__parameters__): + params = _prepare_paramspec_params(cls, params) _check_generic(cls, params, len(cls.__parameters__)) return _GenericAlias(cls, params) diff --git a/Misc/NEWS.d/next/Library/2020-12-10-00-09-40.bpo-41559.1l4yjP.rst b/Misc/NEWS.d/next/Library/2020-12-10-00-09-40.bpo-41559.1l4yjP.rst new file mode 100644 index 00000000000000..539fdeccd14b3c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-10-00-09-40.bpo-41559.1l4yjP.rst @@ -0,0 +1,2 @@ +Implemented :pep:`612`: added ``ParamSpec`` and ``Concatenate`` to +:mod:`typing`. Patch by Ken Jin. diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 756a7ce474aee9..4cc82ffcdf39a3 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -156,13 +156,24 @@ ga_repr(PyObject *self) return NULL; } -// isinstance(obj, TypeVar) without importing typing.py. -// Returns -1 for errors. -static int -is_typevar(PyObject *obj) +/* Checks if a variable number of names are from typing.py. +* If any one of the names are found, return 1, else 0. +**/ +static inline int +is_typing_name(PyObject *obj, int num, ...) { + va_list names; + va_start(names, num); + PyTypeObject *type = Py_TYPE(obj); - if (strcmp(type->tp_name, "TypeVar") != 0) { + int hit = 0; + for (int i = 0; i < num; ++i) { + if (!strcmp(type->tp_name, va_arg(names, const char *))) { + hit = 1; + break; + } + } + if (!hit) { return 0; } PyObject *module = PyObject_GetAttrString((PyObject *)type, "__module__"); @@ -172,9 +183,25 @@ is_typevar(PyObject *obj) int res = PyUnicode_Check(module) && _PyUnicode_EqualToASCIIString(module, "typing"); Py_DECREF(module); + + va_end(names); return res; } +// isinstance(obj, (TypeVar, ParamSpec)) without importing typing.py. +// Returns -1 for errors. +static inline int +is_typevarlike(PyObject *obj) +{ + return is_typing_name(obj, 2, "TypeVar", "ParamSpec"); +} + +static inline int +is_paramspec(PyObject *obj) +{ + return is_typing_name(obj, 1, "ParamSpec"); +} + // Index of item in self[:len], or -1 if not found (self is a tuple) static Py_ssize_t tuple_index(PyObject *self, Py_ssize_t len, PyObject *item) @@ -209,7 +236,7 @@ make_parameters(PyObject *args) Py_ssize_t iparam = 0; for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { PyObject *t = PyTuple_GET_ITEM(args, iarg); - int typevar = is_typevar(t); + int typevar = is_typevarlike(t); if (typevar < 0) { Py_DECREF(parameters); return NULL; @@ -279,7 +306,14 @@ subs_tvars(PyObject *obj, PyObject *params, PyObject **argitems) if (iparam >= 0) { arg = argitems[iparam]; } - Py_INCREF(arg); + // convert all the lists inside args to tuples to help + // with caching in other libaries + if (PyList_CheckExact(arg)) { + arg = PyList_AsTuple(arg); + } + else { + Py_INCREF(arg); + } PyTuple_SET_ITEM(subargs, i, arg); } @@ -314,11 +348,19 @@ ga_getitem(PyObject *self, PyObject *item) int is_tuple = PyTuple_Check(item); Py_ssize_t nitems = is_tuple ? PyTuple_GET_SIZE(item) : 1; PyObject **argitems = is_tuple ? &PyTuple_GET_ITEM(item, 0) : &item; - if (nitems != nparams) { - return PyErr_Format(PyExc_TypeError, - "Too %s arguments for %R", - nitems > nparams ? "many" : "few", - self); + // A special case in PEP 612 where if X = Callable[P, int], + // then X[int, str] == X[[int, str]]. + if (nparams == 1 && nitems > 1 && is_tuple && + is_paramspec(PyTuple_GET_ITEM(alias->parameters, 0))) { + argitems = &item; + } + else { + if (nitems != nparams) { + return PyErr_Format(PyExc_TypeError, + "Too %s arguments for %R", + nitems > nparams ? "many" : "few", + self); + } } /* Replace all type variables (specified by alias->parameters) with corresponding values specified by argitems. @@ -333,7 +375,7 @@ ga_getitem(PyObject *self, PyObject *item) } for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { PyObject *arg = PyTuple_GET_ITEM(alias->args, iarg); - int typevar = is_typevar(arg); + int typevar = is_typevarlike(arg); if (typevar < 0) { Py_DECREF(newargs); return NULL; @@ -342,7 +384,13 @@ ga_getitem(PyObject *self, PyObject *item) Py_ssize_t iparam = tuple_index(alias->parameters, nparams, arg); assert(iparam >= 0); arg = argitems[iparam]; - Py_INCREF(arg); + // convert lists to tuples to help with caching in other libaries. + if (PyList_CheckExact(arg)) { + arg = PyList_AsTuple(arg); + } + else { + Py_INCREF(arg); + } } else { arg = subs_tvars(arg, alias->parameters, argitems); From d443f268af41adc90c4c740b731f9189703b9201 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Thu, 24 Dec 2020 14:30:46 +0300 Subject: [PATCH 0867/1261] GH: Add isidentical to the CODEOWNERS (GH-23923) --- .github/CODEOWNERS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8c76f54af5504a..19ac3aac713fca 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -19,6 +19,7 @@ Objects/frameobject.c @markshannon Objects/call.c @markshannon Python/ceval.c @markshannon Python/compile.c @markshannon +Python/ast_opt.c @isidentical # Hashing **/*hashlib* @python/crypto-team @tiran @@ -84,6 +85,12 @@ Include/pytime.h @pganssle @abalkin /Lib/test/test_peg_generator/ @pablogsal @lysnikolaou /Grammar/python.gram @pablogsal @lysnikolaou +# AST +Python/ast.c @isidentical +Parser/asdl.py @isidentical +Parser/asdl_c.py @isidentical +Lib/ast.py @isidentical + # SQLite 3 **/*sqlite* @berkerpeksag From 2ec91878ba59cf2d6a7e1ff2654fa0f60235bdd1 Mon Sep 17 00:00:00 2001 From: Augusto Hack Date: Thu, 24 Dec 2020 18:16:04 +0100 Subject: [PATCH 0868/1261] closes bpo-42726: gdb libpython: InstanceProxy support for py3 (GH-23912) On Fedora 31 gdb is using python 3.7.9, calling `proxyval` on an instance with a dictionary fails because of the `dict.iteritems` usage. This PR changes the code to be compatible with py2 and py3. This changed seemed small enough to not need an issue and news blurb, if one is required please let me know. Automerge-Triggered-By: GH:benjaminp --- .../next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst | 2 ++ Tools/gdb/libpython.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst diff --git a/Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst b/Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst new file mode 100644 index 00000000000000..01a6e7fe55f5b3 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst @@ -0,0 +1,2 @@ +Fixed Python 3 compatibility issue with gdb/libpython.py handling of attribute +dictionaries. diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index e6555dd96a373b..e18ab0d873cce9 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -468,7 +468,7 @@ def __init__(self, cl_name, attrdict, address): def __repr__(self): if isinstance(self.attrdict, dict): kwargs = ', '.join(["%s=%r" % (arg, val) - for arg, val in self.attrdict.iteritems()]) + for arg, val in self.attrdict.items()]) return '<%s(%s) at remote 0x%x>' % (self.cl_name, kwargs, self.address) else: From 0c7e0708c389c3a2b9677b02930348da00c7efb4 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Thu, 24 Dec 2020 11:04:19 -0700 Subject: [PATCH 0869/1261] bpo-36876: [c-analyzer tool] Add a "capi" subcommand to the c-analyzer tool. (gh-23918) This will help identify which C-API items will need to be updated for subinterpreter support. https://bugs.python.org/issue36876 --- Tools/c-analyzer/c_analyzer/__main__.py | 9 +- Tools/c-analyzer/c_common/scriptutil.py | 24 +- Tools/c-analyzer/c_common/tables.py | 176 +++++++ Tools/c-analyzer/c_parser/__main__.py | 3 +- .../c_parser/preprocessor/__main__.py | 5 +- Tools/c-analyzer/check-c-globals.py | 1 + Tools/c-analyzer/cpython/__main__.py | 104 +++- Tools/c-analyzer/cpython/_capi.py | 479 ++++++++++++++++++ Tools/c-analyzer/cpython/_files.py | 69 +++ Tools/c-analyzer/cpython/_parser.py | 36 +- 10 files changed, 849 insertions(+), 57 deletions(-) create mode 100644 Tools/c-analyzer/cpython/_capi.py create mode 100644 Tools/c-analyzer/cpython/_files.py diff --git a/Tools/c-analyzer/c_analyzer/__main__.py b/Tools/c-analyzer/c_analyzer/__main__.py index 44325f2952e28c..24fc6cd182656b 100644 --- a/Tools/c-analyzer/c_analyzer/__main__.py +++ b/Tools/c-analyzer/c_analyzer/__main__.py @@ -263,7 +263,7 @@ def fmt_full(analysis): def add_output_cli(parser, *, default='summary'): parser.add_argument('--format', dest='fmt', default=default, choices=tuple(FORMATS)) - def process_args(args): + def process_args(args, *, argv=None): pass return process_args @@ -280,7 +280,7 @@ def _cli_check(parser, checks=None, **kwargs): process_checks = add_checks_cli(parser) elif len(checks) == 1 and type(checks) is not dict and re.match(r'^<.*>$', checks[0]): check = checks[0][1:-1] - def process_checks(args): + def process_checks(args, *, argv=None): args.checks = [check] else: process_checks = add_checks_cli(parser, checks=checks) @@ -428,9 +428,9 @@ def _cli_data(parser, filenames=None, known=None): if known is None: sub.add_argument('--known', required=True) - def process_args(args): + def process_args(args, *, argv): if args.datacmd == 'dump': - process_progress(args) + process_progress(args, argv) return process_args @@ -515,6 +515,7 @@ def parse_args(argv=sys.argv[1:], prog=sys.argv[0], *, subset=None): verbosity, traceback_cm = process_args_by_key( args, + argv, processors[cmd], ['verbosity', 'traceback_cm'], ) diff --git a/Tools/c-analyzer/c_common/scriptutil.py b/Tools/c-analyzer/c_common/scriptutil.py index 50dd7548869193..ce69af2b6bdee5 100644 --- a/Tools/c-analyzer/c_common/scriptutil.py +++ b/Tools/c-analyzer/c_common/scriptutil.py @@ -192,7 +192,7 @@ def add_verbosity_cli(parser): parser.add_argument('-q', '--quiet', action='count', default=0) parser.add_argument('-v', '--verbose', action='count', default=0) - def process_args(args): + def process_args(args, *, argv=None): ns = vars(args) key = 'verbosity' if key in ns: @@ -208,7 +208,7 @@ def add_traceback_cli(parser): parser.add_argument('--no-traceback', '--no-tb', dest='traceback', action='store_const', const=False) - def process_args(args): + def process_args(args, *, argv=None): ns = vars(args) key = 'traceback_cm' if key in ns: @@ -262,7 +262,7 @@ def add_sepval_cli(parser, opt, dest, choices, *, sep=',', **kwargs): #kwargs.setdefault('metavar', opt.upper()) parser.add_argument(opt, dest=dest, action='append', **kwargs) - def process_args(args): + def process_args(args, *, argv=None): ns = vars(args) # XXX Use normalize_selection()? @@ -293,7 +293,7 @@ def add_file_filtering_cli(parser, *, excluded=None): excluded = tuple(excluded or ()) - def process_args(args): + def process_args(args, *, argv=None): ns = vars(args) key = 'iter_filenames' if key in ns: @@ -323,7 +323,7 @@ def add_progress_cli(parser, *, threshold=VERBOSITY, **kwargs): parser.add_argument('--no-progress', dest='track_progress', action='store_false') parser.set_defaults(track_progress=True) - def process_args(args): + def process_args(args, *, argv=None): if args.track_progress: ns = vars(args) verbosity = ns.get('verbosity', VERBOSITY) @@ -339,7 +339,7 @@ def add_failure_filtering_cli(parser, pool, *, default=False): metavar=f'"{{all|{"|".join(sorted(pool))}}},..."') parser.add_argument('--no-fail', dest='fail', action='store_const', const=()) - def process_args(args): + def process_args(args, *, argv=None): ns = vars(args) fail = ns.pop('fail') @@ -371,7 +371,7 @@ def ignore_exc(exc): def add_kind_filtering_cli(parser, *, default=None): parser.add_argument('--kinds', action='append') - def process_args(args): + def process_args(args, *, argv=None): ns = vars(args) kinds = [] @@ -486,18 +486,18 @@ def _flatten_processors(processors): yield from _flatten_processors(proc) -def process_args(args, processors, *, keys=None): +def process_args(args, argv, processors, *, keys=None): processors = _flatten_processors(processors) ns = vars(args) extracted = {} if keys is None: for process_args in processors: - for key in process_args(args): + for key in process_args(args, argv=argv): extracted[key] = ns.pop(key) else: remainder = set(keys) for process_args in processors: - hanging = process_args(args) + hanging = process_args(args, argv=argv) if isinstance(hanging, str): hanging = [hanging] for key in hanging or (): @@ -510,8 +510,8 @@ def process_args(args, processors, *, keys=None): return extracted -def process_args_by_key(args, processors, keys): - extracted = process_args(args, processors, keys=keys) +def process_args_by_key(args, argv, processors, keys): + extracted = process_args(args, argv, processors, keys=keys) return [extracted[key] for key in keys] diff --git a/Tools/c-analyzer/c_common/tables.py b/Tools/c-analyzer/c_common/tables.py index 411152e3f9498f..85b501925715d3 100644 --- a/Tools/c-analyzer/c_common/tables.py +++ b/Tools/c-analyzer/c_common/tables.py @@ -1,4 +1,6 @@ import csv +import re +import textwrap from . import NOT_SET, strutil, fsutil @@ -212,3 +214,177 @@ def _normalize_table_file_props(header, sep): else: sep = None return header, sep + + +################################## +# stdout tables + +WIDTH = 20 + + +def resolve_columns(specs): + if isinstance(specs, str): + specs = specs.replace(',', ' ').strip().split() + return _resolve_colspecs(specs) + + +def build_table(specs, *, sep=' ', defaultwidth=None): + columns = resolve_columns(specs) + return _build_table(columns, sep=sep, defaultwidth=defaultwidth) + + +_COLSPEC_RE = re.compile(textwrap.dedent(r''' + ^ + (?: + [[] + ( + (?: [^\s\]] [^\]]* )? + [^\s\]] + ) #

    F`bGhwY+pe@HYZO?$VFpJ6O%>9s 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 literal 0 HcmV?d00001 diff --git a/Misc/NEWS.d/next/Library/2021-01-30-15-20-06.bpo-43077.Owk61z.rst b/Misc/NEWS.d/next/Library/2021-01-30-15-20-06.bpo-43077.Owk61z.rst new file mode 100644 index 00000000000000..e555002433b4de --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-01-30-15-20-06.bpo-43077.Owk61z.rst @@ -0,0 +1 @@ +Update the bundled pip to 21.0.1 and setuptools to 52.0.0. \ No newline at end of file From 35d56477b3cad617606acf728c2904a197e88ab9 Mon Sep 17 00:00:00 2001 From: L <3177243+LukeLR@users.noreply.github.com> Date: Sun, 31 Jan 2021 05:19:07 +0000 Subject: [PATCH 1089/1261] bpo-43059: Remove reference to legacy external sqlite3 repository (GH-24364) --- Doc/library/sqlite3.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index d80e952ce99243..c017dacff88976 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -100,10 +100,6 @@ This example uses the iterator form:: .. seealso:: - https://github.com/ghaering/pysqlite - The pysqlite web page -- sqlite3 is developed externally under the name - "pysqlite". - https://www.sqlite.org The SQLite web page; the documentation describes the syntax and the available data types for the supported SQL dialect. From d403bd25049bad1d92cad4ab341e02b3894aefc0 Mon Sep 17 00:00:00 2001 From: Adorilson Bezerra Date: Sun, 31 Jan 2021 03:07:11 -0300 Subject: [PATCH 1090/1261] Doc: errors tutorial improvements (GH-16269) Improvements: - Improvements in how try clause works section This suggestion is because the execution continues after *except*, not after *try* but before *except*. I guess this form more clear. - Surrounding some keywords with \*...\* For uniformity the highlighted terms - Adjust the number of chars per line to 80 --- Doc/tutorial/errors.rst | 42 ++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst index 4a25861a050e61..fd0477f078949a 100644 --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -101,29 +101,29 @@ The :keyword:`try` statement works as follows. * If no exception occurs, the *except clause* is skipped and execution of the :keyword:`try` statement is finished. -* If an exception occurs during execution of the try clause, the rest of the - clause is skipped. Then if its type matches the exception named after the - :keyword:`except` keyword, the except clause is executed, and then execution - continues after the :keyword:`try` statement. +* If an exception occurs during execution of the :keyword:`try` clause, the rest of the + clause is skipped. Then, if its type matches the exception named after the + :keyword:`except` keyword, the *except clause* is executed, and then execution + continues after the try/except block. -* If an exception occurs which does not match the exception named in the except - clause, it is passed on to outer :keyword:`try` statements; if no handler is +* If an exception occurs which does not match the exception named in the *except + clause*, it is passed on to outer :keyword:`try` statements; if no handler is found, it is an *unhandled exception* and execution stops with a message as shown above. -A :keyword:`try` statement may have more than one except clause, to specify +A :keyword:`try` statement may have more than one *except clause*, to specify handlers for different exceptions. At most one handler will be executed. -Handlers only handle exceptions that occur in the corresponding try clause, not -in other handlers of the same :keyword:`!try` statement. An except clause may -name multiple exceptions as a parenthesized tuple, for example:: +Handlers only handle exceptions that occur in the corresponding *try clause*, +not in other handlers of the same :keyword:`!try` statement. An *except clause* +may name multiple exceptions as a parenthesized tuple, for example:: ... except (RuntimeError, TypeError, NameError): ... pass A class in an :keyword:`except` clause is compatible with an exception if it is the same class or a base class thereof (but not the other way around --- an -except clause listing a derived class is not compatible with a base class). For -example, the following code will print B, C, D in that order:: +*except clause* listing a derived class is not compatible with a base class). +For example, the following code will print B, C, D in that order:: class B(Exception): pass @@ -144,10 +144,10 @@ example, the following code will print B, C, D in that order:: except B: print("B") -Note that if the except clauses were reversed (with ``except B`` first), it -would have printed B, B, B --- the first matching except clause is triggered. +Note that if the *except clauses* were reversed (with ``except B`` first), it +would have printed B, B, B --- the first matching *except clause* is triggered. -The last except clause may omit the exception name(s), to serve as a wildcard. +The last *except clause* may omit the exception name(s), to serve as a wildcard. Use this with extreme caution, since it is easy to mask a real programming error in this way! It can also be used to print an error message and then re-raise the exception (allowing a caller to handle the exception as well):: @@ -167,9 +167,9 @@ the exception (allowing a caller to handle the exception as well):: raise The :keyword:`try` ... :keyword:`except` statement has an optional *else -clause*, which, when present, must follow all except clauses. It is useful for -code that must be executed if the try clause does not raise an exception. For -example:: +clause*, which, when present, must follow all *except clauses*. It is useful +for code that must be executed if the *try clause* does not raise an exception. +For example:: for arg in sys.argv[1:]: try: @@ -189,7 +189,7 @@ When an exception occurs, it may have an associated value, also known as the exception's *argument*. The presence and type of the argument depend on the exception type. -The except clause may specify a variable after the exception name. The +The *except clause* may specify a variable after the exception name. The variable is bound to an exception instance with the arguments stored in ``instance.args``. For convenience, the exception instance defines :meth:`__str__` so the arguments can be printed directly without having to @@ -217,8 +217,8 @@ If an exception has arguments, they are printed as the last part ('detail') of the message for unhandled exceptions. Exception handlers don't just handle exceptions if they occur immediately in the -try clause, but also if they occur inside functions that are called (even -indirectly) in the try clause. For example:: +*try clause*, but also if they occur inside functions that are called (even +indirectly) in the *try clause*. For example:: >>> def this_fails(): ... x = 1/0 From fb0957ebcce6adbc174777d9a6a6892463562fcf Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 31 Jan 2021 15:55:13 +0200 Subject: [PATCH 1091/1261] bpo-43030: Fixed a compiler warning in Py_UNICODE_ISSPACE with signed wchar_t (GH-24350) --- Include/cpython/unicodeobject.h | 2 +- Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index f1b44554e3078d..a4057fd2a13edb 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -22,7 +22,7 @@ */ #define Py_UNICODE_ISSPACE(ch) \ - ((ch) < 128U ? _Py_ascii_whitespace[(ch)] : _PyUnicode_IsWhitespace(ch)) + ((Py_UCS4)(ch) < 128U ? _Py_ascii_whitespace[(ch)] : _PyUnicode_IsWhitespace(ch)) #define Py_UNICODE_ISLOWER(ch) _PyUnicode_IsLowercase(ch) #define Py_UNICODE_ISUPPER(ch) _PyUnicode_IsUppercase(ch) diff --git a/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst b/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst new file mode 100644 index 00000000000000..7a432522db8a12 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst @@ -0,0 +1,2 @@ +Fixed a compiler warning in :c:func:`Py_UNICODE_ISSPACE()` on platforms with +signed ``wchar_t``. From 47120d29a64419d90da67b8e68a4073c34744878 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 31 Jan 2021 17:22:27 +0200 Subject: [PATCH 1092/1261] bpo-43016: Rewrite tests for curses (GH-24312) --- Lib/test/test_curses.py | 1002 ++++++++++++++++++++++++++++++--------- 1 file changed, 787 insertions(+), 215 deletions(-) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index f2cad05b2c92e6..29286bce99e893 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -1,18 +1,9 @@ -# -# Test script for the curses module -# -# This script doesn't actually display anything very coherent. but it -# does call (nearly) every method and function. -# -# Functions not tested: {def,reset}_{shell,prog}_mode, getch(), getstr() -# Only called, not tested: getmouse(), ungetmouse() -# - +import functools +import inspect import os import string import sys import tempfile -import functools import unittest from test.support import requires, verbose, SaveSignals @@ -21,7 +12,6 @@ # Optionally test curses module. This currently requires that the # 'curses' resource be given on the regrtest command line using the -u # option. If not available, nothing after this line will be executed. -import inspect requires('curses') # If either of these don't exist, skip the tests. @@ -37,6 +27,17 @@ def requires_curses_func(name): return unittest.skipUnless(hasattr(curses, name), 'requires curses.%s' % name) +def requires_curses_window_meth(name): + def deco(test): + @functools.wraps(test) + def wrapped(self, *args, **kwargs): + if not hasattr(self.stdscr, name): + raise unittest.SkipTest('requires curses.window.%s' % name) + test(self, *args, **kwargs) + return wrapped + return deco + + def requires_colors(test): @functools.wraps(test) def wrapped(self, *args, **kwargs): @@ -111,213 +112,732 @@ def setUp(self): curses.savetty() self.addCleanup(curses.endwin) self.addCleanup(curses.resetty) + self.stdscr.erase() + + @requires_curses_func('filter') + def test_filter(self): + # TODO: Should be called before initscr() or newterm() are called. + # TODO: nofilter() + curses.filter() + + @requires_curses_func('use_env') + def test_use_env(self): + # TODO: Should be called before initscr() or newterm() are called. + # TODO: use_tioctl() + curses.use_env(False) + curses.use_env(True) + + def test_create_windows(self): + win = curses.newwin(5, 10) + self.assertEqual(win.getbegyx(), (0, 0)) + self.assertEqual(win.getparyx(), (-1, -1)) + self.assertEqual(win.getmaxyx(), (5, 10)) + + win = curses.newwin(10, 15, 2, 5) + self.assertEqual(win.getbegyx(), (2, 5)) + self.assertEqual(win.getparyx(), (-1, -1)) + self.assertEqual(win.getmaxyx(), (10, 15)) + + win2 = win.subwin(3, 7) + self.assertEqual(win2.getbegyx(), (3, 7)) + self.assertEqual(win2.getparyx(), (1, 2)) + self.assertEqual(win2.getmaxyx(), (9, 13)) + + win2 = win.subwin(5, 10, 3, 7) + self.assertEqual(win2.getbegyx(), (3, 7)) + self.assertEqual(win2.getparyx(), (1, 2)) + self.assertEqual(win2.getmaxyx(), (5, 10)) + + win3 = win.derwin(2, 3) + self.assertEqual(win3.getbegyx(), (4, 8)) + self.assertEqual(win3.getparyx(), (2, 3)) + self.assertEqual(win3.getmaxyx(), (8, 12)) + + win3 = win.derwin(6, 11, 2, 3) + self.assertEqual(win3.getbegyx(), (4, 8)) + self.assertEqual(win3.getparyx(), (2, 3)) + self.assertEqual(win3.getmaxyx(), (6, 11)) + + win.mvwin(0, 1) + self.assertEqual(win.getbegyx(), (0, 1)) + self.assertEqual(win.getparyx(), (-1, -1)) + self.assertEqual(win.getmaxyx(), (10, 15)) + self.assertEqual(win2.getbegyx(), (3, 7)) + self.assertEqual(win2.getparyx(), (1, 2)) + self.assertEqual(win2.getmaxyx(), (5, 10)) + self.assertEqual(win3.getbegyx(), (4, 8)) + self.assertEqual(win3.getparyx(), (2, 3)) + self.assertEqual(win3.getmaxyx(), (6, 11)) + + win2.mvderwin(2, 1) + self.assertEqual(win2.getbegyx(), (3, 7)) + self.assertEqual(win2.getparyx(), (2, 1)) + self.assertEqual(win2.getmaxyx(), (5, 10)) + + win3.mvderwin(2, 1) + self.assertEqual(win3.getbegyx(), (4, 8)) + self.assertEqual(win3.getparyx(), (2, 1)) + self.assertEqual(win3.getmaxyx(), (6, 11)) + + def test_move_cursor(self): + stdscr = self.stdscr + win = stdscr.subwin(10, 15, 2, 5) + stdscr.move(1, 2) + win.move(2, 4) + self.assertEqual(stdscr.getyx(), (1, 2)) + self.assertEqual(win.getyx(), (2, 4)) + + win.cursyncup() + self.assertEqual(stdscr.getyx(), (4, 9)) - def test_window_funcs(self): - "Test the methods of windows" + def test_refresh_control(self): + stdscr = self.stdscr + # touchwin()/untouchwin()/is_wintouched() + stdscr.refresh() + self.assertIs(stdscr.is_wintouched(), False) + stdscr.touchwin() + self.assertIs(stdscr.is_wintouched(), True) + stdscr.refresh() + self.assertIs(stdscr.is_wintouched(), False) + stdscr.touchwin() + self.assertIs(stdscr.is_wintouched(), True) + stdscr.untouchwin() + self.assertIs(stdscr.is_wintouched(), False) + + # touchline()/untouchline()/is_linetouched() + stdscr.touchline(5, 2) + self.assertIs(stdscr.is_linetouched(5), True) + self.assertIs(stdscr.is_linetouched(6), True) + self.assertIs(stdscr.is_wintouched(), True) + stdscr.touchline(5, 1, False) + self.assertIs(stdscr.is_linetouched(5), False) + + # syncup() + win = stdscr.subwin(10, 15, 2, 5) + win2 = win.subwin(5, 10, 3, 7) + win2.touchwin() + stdscr.untouchwin() + win2.syncup() + self.assertIs(win.is_wintouched(), True) + self.assertIs(stdscr.is_wintouched(), True) + + # syncdown() + stdscr.touchwin() + win.untouchwin() + win2.untouchwin() + win2.syncdown() + self.assertIs(win2.is_wintouched(), True) + + # syncok() + if hasattr(stdscr, 'syncok') and not sys.platform.startswith("sunos"): + win.untouchwin() + stdscr.untouchwin() + for syncok in [False, True]: + win2.syncok(syncok) + win2.addch('a') + self.assertIs(win.is_wintouched(), syncok) + self.assertIs(stdscr.is_wintouched(), syncok) + + def test_output_character(self): + stdscr = self.stdscr + # addch() + stdscr.refresh() + stdscr.move(0, 0) + stdscr.addch('A') + stdscr.addch(b'A') + stdscr.addch(65) + stdscr.addch('\u20ac') + stdscr.addch('A', curses.A_BOLD) + stdscr.addch(1, 2, 'A') + stdscr.addch(2, 3, 'A', curses.A_BOLD) + self.assertIs(stdscr.is_wintouched(), True) + + # echochar() + stdscr.refresh() + stdscr.move(0, 0) + stdscr.echochar('A') + stdscr.echochar(b'A') + stdscr.echochar(65) + self.assertRaises(OverflowError, stdscr.echochar, '\u20ac') + stdscr.echochar('A', curses.A_BOLD) + self.assertIs(stdscr.is_wintouched(), False) + + def test_output_string(self): + stdscr = self.stdscr + # addstr()/insstr() + for func in [stdscr.addstr, stdscr.insstr]: + with self.subTest(func.__qualname__): + stdscr.move(0, 0) + func('abcd') + func(b'abcd') + func('àßçđ') + func('abcd', curses.A_BOLD) + func(1, 2, 'abcd') + func(2, 3, 'abcd', curses.A_BOLD) + + # addnstr()/insnstr() + for func in [stdscr.addnstr, stdscr.insnstr]: + with self.subTest(func.__qualname__): + stdscr.move(0, 0) + func('1234', 3) + func(b'1234', 3) + func('\u0661\u0662\u0663\u0664', 3) + func('1234', 5) + func('1234', 3, curses.A_BOLD) + func(1, 2, '1234', 3) + func(2, 3, '1234', 3, curses.A_BOLD) + + def test_output_string_embedded_null_chars(self): + # reject embedded null bytes and characters stdscr = self.stdscr - win = curses.newwin(10,10) - win = curses.newwin(5,5, 5,5) - win2 = curses.newwin(15,15, 5,5) - - for meth in [stdscr.addch, stdscr.addstr]: - for args in [('a',), ('a', curses.A_BOLD), - (4,4, 'a'), (5,5, 'a', curses.A_BOLD)]: - with self.subTest(meth=meth.__qualname__, args=args): - meth(*args) - - for meth in [stdscr.clear, stdscr.clrtobot, - stdscr.clrtoeol, stdscr.cursyncup, stdscr.delch, - stdscr.deleteln, stdscr.erase, stdscr.getbegyx, - stdscr.getbkgd, stdscr.getmaxyx, - stdscr.getparyx, stdscr.getyx, stdscr.inch, - stdscr.insertln, stdscr.instr, stdscr.is_wintouched, - win.noutrefresh, stdscr.redrawwin, stdscr.refresh, - stdscr.standout, stdscr.standend, stdscr.syncdown, - stdscr.syncup, stdscr.touchwin, stdscr.untouchwin]: - with self.subTest(meth=meth.__qualname__): - meth() - - stdscr.addnstr('1234', 3) - stdscr.addnstr('1234', 3, curses.A_BOLD) - stdscr.addnstr(4,4, '1234', 3) - stdscr.addnstr(5,5, '1234', 3, curses.A_BOLD) - - stdscr.attron(curses.A_BOLD) - stdscr.attroff(curses.A_BOLD) - stdscr.attrset(curses.A_BOLD) - stdscr.bkgd(' ') - stdscr.bkgd(' ', curses.A_REVERSE) - stdscr.bkgdset(' ') - stdscr.bkgdset(' ', curses.A_REVERSE) + for arg in ['a\0', b'a\0']: + with self.subTest(arg=arg): + self.assertRaises(ValueError, stdscr.addstr, arg) + self.assertRaises(ValueError, stdscr.addnstr, arg, 1) + self.assertRaises(ValueError, stdscr.insstr, arg) + self.assertRaises(ValueError, stdscr.insnstr, arg, 1) - win.border(65, 66, 67, 68, - 69, 70, 71, 72) + def test_read_from_window(self): + stdscr = self.stdscr + stdscr.addstr(0, 1, 'ABCD', curses.A_BOLD) + # inch() + stdscr.move(0, 1) + self.assertEqual(stdscr.inch(), 65 | curses.A_BOLD) + self.assertEqual(stdscr.inch(0, 3), 67 | curses.A_BOLD) + stdscr.move(0, 0) + # instr() + self.assertEqual(stdscr.instr()[:6], b' ABCD ') + self.assertEqual(stdscr.instr(3)[:6], b' AB') + self.assertEqual(stdscr.instr(0, 2)[:4], b'BCD ') + self.assertEqual(stdscr.instr(0, 2, 4), b'BCD ') + self.assertRaises(ValueError, stdscr.instr, -2) + self.assertRaises(ValueError, stdscr.instr, 0, 2, -2) + + def test_getch(self): + win = curses.newwin(5, 12, 5, 2) + + # TODO: Test with real input by writing to master fd. + for c in 'spam\n'[::-1]: + curses.ungetch(c) + self.assertEqual(win.getch(3, 1), b's'[0]) + self.assertEqual(win.getyx(), (3, 1)) + self.assertEqual(win.getch(3, 4), b'p'[0]) + self.assertEqual(win.getyx(), (3, 4)) + self.assertEqual(win.getch(), b'a'[0]) + self.assertEqual(win.getyx(), (3, 4)) + self.assertEqual(win.getch(), b'm'[0]) + self.assertEqual(win.getch(), b'\n'[0]) + + def test_getstr(self): + win = curses.newwin(5, 12, 5, 2) + curses.echo() + self.addCleanup(curses.noecho) + + self.assertRaises(ValueError, win.getstr, -400) + self.assertRaises(ValueError, win.getstr, 2, 3, -400) + + # TODO: Test with real input by writing to master fd. + for c in 'Lorem\nipsum\ndolor\nsit\namet\n'[::-1]: + curses.ungetch(c) + self.assertEqual(win.getstr(3, 1, 2), b'Lo') + self.assertEqual(win.instr(3, 0), b' Lo ') + self.assertEqual(win.getstr(3, 5, 10), b'ipsum') + self.assertEqual(win.instr(3, 0), b' Lo ipsum ') + self.assertEqual(win.getstr(1, 5), b'dolor') + self.assertEqual(win.instr(1, 0), b' dolor ') + self.assertEqual(win.getstr(2), b'si') + self.assertEqual(win.instr(1, 0), b'si dolor ') + self.assertEqual(win.getstr(), b'amet') + self.assertEqual(win.instr(1, 0), b'amet dolor ') + + def test_clear(self): + win = curses.newwin(5, 15, 5, 2) + lorem_ipsum(win) + + win.move(0, 8) + win.clrtoeol() + self.assertEqual(win.instr(0, 0).rstrip(), b'Lorem ip') + self.assertEqual(win.instr(1, 0).rstrip(), b'dolor sit amet,') + + win.move(0, 3) + win.clrtobot() + self.assertEqual(win.instr(0, 0).rstrip(), b'Lor') + self.assertEqual(win.instr(1, 0).rstrip(), b'') + + for func in [win.erase, win.clear]: + lorem_ipsum(win) + func() + self.assertEqual(win.instr(0, 0).rstrip(), b'') + self.assertEqual(win.instr(1, 0).rstrip(), b'') + + def test_insert_delete(self): + win = curses.newwin(5, 15, 5, 2) + lorem_ipsum(win) + + win.move(0, 2) + win.delch() + self.assertEqual(win.instr(0, 0), b'Loem ipsum ') + win.delch(0, 7) + self.assertEqual(win.instr(0, 0), b'Loem ipum ') + + win.move(1, 5) + win.deleteln() + self.assertEqual(win.instr(0, 0), b'Loem ipum ') + self.assertEqual(win.instr(1, 0), b'consectetur ') + self.assertEqual(win.instr(2, 0), b'adipiscing elit') + self.assertEqual(win.instr(3, 0), b'sed do eiusmod ') + self.assertEqual(win.instr(4, 0), b' ') + + win.move(1, 5) + win.insertln() + self.assertEqual(win.instr(0, 0), b'Loem ipum ') + self.assertEqual(win.instr(1, 0), b' ') + self.assertEqual(win.instr(2, 0), b'consectetur ') + + win.clear() + lorem_ipsum(win) + win.move(1, 5) + win.insdelln(2) + self.assertEqual(win.instr(0, 0), b'Lorem ipsum ') + self.assertEqual(win.instr(1, 0), b' ') + self.assertEqual(win.instr(2, 0), b' ') + self.assertEqual(win.instr(3, 0), b'dolor sit amet,') + + win.clear() + lorem_ipsum(win) + win.move(1, 5) + win.insdelln(-2) + self.assertEqual(win.instr(0, 0), b'Lorem ipsum ') + self.assertEqual(win.instr(1, 0), b'adipiscing elit') + self.assertEqual(win.instr(2, 0), b'sed do eiusmod ') + self.assertEqual(win.instr(3, 0), b' ') + + def test_scroll(self): + win = curses.newwin(5, 15, 5, 2) + lorem_ipsum(win) + win.scrollok(True) + win.scroll() + self.assertEqual(win.instr(0, 0), b'dolor sit amet,') + win.scroll(2) + self.assertEqual(win.instr(0, 0), b'adipiscing elit') + win.scroll(-3) + self.assertEqual(win.instr(0, 0), b' ') + self.assertEqual(win.instr(2, 0), b' ') + self.assertEqual(win.instr(3, 0), b'adipiscing elit') + win.scrollok(False) + + def test_attributes(self): + # TODO: attr_get(), attr_set(), ... + win = curses.newwin(5, 15, 5, 2) + win.attron(curses.A_BOLD) + win.attroff(curses.A_BOLD) + win.attrset(curses.A_BOLD) + + win.standout() + win.standend() + + @requires_curses_window_meth('chgat') + def test_chgat(self): + win = curses.newwin(5, 15, 5, 2) + win.addstr(2, 0, 'Lorem ipsum') + win.addstr(3, 0, 'dolor sit amet') + + win.move(2, 8) + win.chgat(curses.A_BLINK) + self.assertEqual(win.inch(2, 7), b'p'[0]) + self.assertEqual(win.inch(2, 8), b's'[0] | curses.A_BLINK) + self.assertEqual(win.inch(2, 14), b' '[0] | curses.A_BLINK) + + win.move(2, 1) + win.chgat(3, curses.A_BOLD) + self.assertEqual(win.inch(2, 0), b'L'[0]) + self.assertEqual(win.inch(2, 1), b'o'[0] | curses.A_BOLD) + self.assertEqual(win.inch(2, 3), b'e'[0] | curses.A_BOLD) + self.assertEqual(win.inch(2, 4), b'm'[0]) + + win.chgat(3, 2, curses.A_UNDERLINE) + self.assertEqual(win.inch(3, 1), b'o'[0]) + self.assertEqual(win.inch(3, 2), b'l'[0] | curses.A_UNDERLINE) + self.assertEqual(win.inch(3, 14), b' '[0] | curses.A_UNDERLINE) + + win.chgat(3, 4, 7, curses.A_BLINK) + self.assertEqual(win.inch(3, 3), b'o'[0] | curses.A_UNDERLINE) + self.assertEqual(win.inch(3, 4), b'r'[0] | curses.A_BLINK) + self.assertEqual(win.inch(3, 10), b'a'[0] | curses.A_BLINK) + self.assertEqual(win.inch(3, 11), b'm'[0] | curses.A_UNDERLINE) + self.assertEqual(win.inch(3, 14), b' '[0] | curses.A_UNDERLINE) + + def test_background(self): + win = curses.newwin(5, 15, 5, 2) + win.addstr(0, 0, 'Lorem ipsum') + + self.assertEqual(win.getbkgd(), 0) + + # bkgdset() + win.bkgdset('_') + self.assertEqual(win.getbkgd(), b'_'[0]) + win.bkgdset(b'#') + self.assertEqual(win.getbkgd(), b'#'[0]) + win.bkgdset(65) + self.assertEqual(win.getbkgd(), 65) + win.bkgdset(0) + self.assertEqual(win.getbkgd(), 32) + + win.bkgdset('#', curses.A_REVERSE) + self.assertEqual(win.getbkgd(), b'#'[0] | curses.A_REVERSE) + self.assertEqual(win.inch(0, 0), b'L'[0]) + self.assertEqual(win.inch(0, 5), b' '[0]) + win.bkgdset(0) + + # bkgd() + win.bkgd('_') + self.assertEqual(win.getbkgd(), b'_'[0]) + self.assertEqual(win.inch(0, 0), b'L'[0]) + self.assertEqual(win.inch(0, 5), b'_'[0]) + + win.bkgd('#', curses.A_REVERSE) + self.assertEqual(win.getbkgd(), b'#'[0] | curses.A_REVERSE) + self.assertEqual(win.inch(0, 0), b'L'[0] | curses.A_REVERSE) + self.assertEqual(win.inch(0, 5), b'#'[0] | curses.A_REVERSE) + + def test_overlay(self): + srcwin = curses.newwin(5, 18, 3, 4) + lorem_ipsum(srcwin) + dstwin = curses.newwin(7, 17, 5, 7) + for i in range(6): + dstwin.addstr(i, 0, '_'*17) + + srcwin.overlay(dstwin) + self.assertEqual(dstwin.instr(0, 0), b'sectetur_________') + self.assertEqual(dstwin.instr(1, 0), b'piscing_elit,____') + self.assertEqual(dstwin.instr(2, 0), b'_do_eiusmod______') + self.assertEqual(dstwin.instr(3, 0), b'_________________') + + srcwin.overwrite(dstwin) + self.assertEqual(dstwin.instr(0, 0), b'sectetur __') + self.assertEqual(dstwin.instr(1, 0), b'piscing elit, __') + self.assertEqual(dstwin.instr(2, 0), b' do eiusmod __') + self.assertEqual(dstwin.instr(3, 0), b'_________________') + + srcwin.overlay(dstwin, 1, 4, 3, 2, 4, 11) + self.assertEqual(dstwin.instr(3, 0), b'__r_sit_amet_____') + self.assertEqual(dstwin.instr(4, 0), b'__ectetur________') + self.assertEqual(dstwin.instr(5, 0), b'_________________') + + srcwin.overwrite(dstwin, 1, 4, 3, 2, 4, 11) + self.assertEqual(dstwin.instr(3, 0), b'__r sit amet_____') + self.assertEqual(dstwin.instr(4, 0), b'__ectetur _____') + self.assertEqual(dstwin.instr(5, 0), b'_________________') + + def test_refresh(self): + win = curses.newwin(5, 15, 2, 5) + win.noutrefresh() + win.redrawln(1, 2) + win.redrawwin() + win.refresh() + curses.doupdate() + + @requires_curses_window_meth('resize') + def test_resize(self): + win = curses.newwin(5, 15, 2, 5) + win.resize(4, 20) + self.assertEqual(win.getmaxyx(), (4, 20)) + win.resize(5, 15) + self.assertEqual(win.getmaxyx(), (5, 15)) + + @requires_curses_window_meth('enclose') + def test_enclose(self): + win = curses.newwin(5, 15, 2, 5) + # TODO: Return bool instead of 1/0 + self.assertTrue(win.enclose(2, 5)) + self.assertFalse(win.enclose(1, 5)) + self.assertFalse(win.enclose(2, 4)) + self.assertTrue(win.enclose(6, 19)) + self.assertFalse(win.enclose(7, 19)) + self.assertFalse(win.enclose(6, 20)) + + def test_putwin(self): + win = curses.newwin(5, 12, 1, 2) + win.addstr(2, 1, 'Lorem ipsum') + with tempfile.TemporaryFile() as f: + win.putwin(f) + del win + f.seek(0) + win = curses.getwin(f) + self.assertEqual(win.getbegyx(), (1, 2)) + self.assertEqual(win.getmaxyx(), (5, 12)) + self.assertEqual(win.instr(2, 0), b' Lorem ipsum') + + def test_borders_and_lines(self): + win = curses.newwin(5, 10, 5, 2) win.border('|', '!', '-', '_', '+', '\\', '#', '/') - with self.assertRaises(TypeError, - msg="Expected win.border() to raise TypeError"): - win.border(65, 66, 67, 68, - 69, [], 71, 72) - - win.box(65, 67) - win.box('!', '_') + self.assertEqual(win.instr(0, 0), b'+--------\\') + self.assertEqual(win.instr(1, 0), b'| !') + self.assertEqual(win.instr(4, 0), b'#________/') + win.border(b'|', b'!', b'-', b'_', + b'+', b'\\', b'#', b'/') + win.border(65, 66, 67, 68, + 69, 70, 71, 72) + self.assertRaises(TypeError, win.border, + 65, 66, 67, 68, 69, [], 71, 72) + self.assertRaises(TypeError, win.border, + 65, 66, 67, 68, 69, 70, 71, 72, 73) + self.assertRaises(TypeError, win.border, + 65, 66, 67, 68, 69, 70, 71, 72, 73) + win.border(65, 66, 67, 68, 69, 70, 71) + win.border(65, 66, 67, 68, 69, 70) + win.border(65, 66, 67, 68, 69) + win.border(65, 66, 67, 68) + win.border(65, 66, 67) + win.border(65, 66) + win.border(65) + win.border() + + win.box(':', '~') + self.assertEqual(win.instr(0, 1, 8), b'~~~~~~~~') + self.assertEqual(win.instr(1, 0), b': :') + self.assertEqual(win.instr(4, 1, 8), b'~~~~~~~~') win.box(b':', b'~') + win.box(65, 67) self.assertRaises(TypeError, win.box, 65, 66, 67) self.assertRaises(TypeError, win.box, 65) win.box() - stdscr.clearok(1) + win.move(1, 2) + win.hline('-', 5) + self.assertEqual(win.instr(1, 1, 7), b' ----- ') + win.hline(b'-', 5) + win.hline(45, 5) + win.hline('-', 5, curses.A_BOLD) + win.hline(1, 1, '-', 5) + win.hline(1, 1, '-', 5, curses.A_BOLD) + + win.move(1, 2) + win.vline('a', 3) + win.vline(b'a', 3) + win.vline(97, 3) + win.vline('a', 3, curses.A_STANDOUT) + win.vline(1, 1, 'a', 3) + win.vline(1, 1, ';', 2, curses.A_STANDOUT) + self.assertEqual(win.inch(1, 1), b';'[0] | curses.A_STANDOUT) + self.assertEqual(win.inch(2, 1), b';'[0] | curses.A_STANDOUT) + self.assertEqual(win.inch(3, 1), b'a'[0]) + + def test_unctrl(self): + # TODO: wunctrl() + self.assertEqual(curses.unctrl(b'A'), b'A') + self.assertEqual(curses.unctrl('A'), b'A') + self.assertEqual(curses.unctrl(65), b'A') + self.assertEqual(curses.unctrl(b'\n'), b'^J') + self.assertEqual(curses.unctrl('\n'), b'^J') + self.assertEqual(curses.unctrl(10), b'^J') + self.assertRaises(TypeError, curses.unctrl, b'') + self.assertRaises(TypeError, curses.unctrl, b'AB') + self.assertRaises(TypeError, curses.unctrl, '') + self.assertRaises(TypeError, curses.unctrl, 'AB') + self.assertRaises(OverflowError, curses.unctrl, 2**64) + + def test_endwin(self): + if not self.isatty: + self.skipTest('requires terminal') + self.assertIs(curses.isendwin(), False) + curses.endwin() + self.assertIs(curses.isendwin(), True) + curses.doupdate() + self.assertIs(curses.isendwin(), False) + + def test_terminfo(self): + self.assertIsInstance(curses.tigetflag('hc'), int) + self.assertEqual(curses.tigetflag('cols'), -1) + self.assertEqual(curses.tigetflag('cr'), -1) + + self.assertIsInstance(curses.tigetnum('cols'), int) + self.assertEqual(curses.tigetnum('hc'), -2) + self.assertEqual(curses.tigetnum('cr'), -2) + + self.assertIsInstance(curses.tigetstr('cr'), (bytes, type(None))) + self.assertIsNone(curses.tigetstr('hc')) + self.assertIsNone(curses.tigetstr('cols')) + + cud = curses.tigetstr('cud') + if cud is not None: + # See issue10570. + self.assertIsInstance(cud, bytes) + curses.tparm(cud, 2) + cud_2 = curses.tparm(cud, 2) + self.assertIsInstance(cud_2, bytes) + curses.putp(cud_2) + + curses.putp(b'abc\n') + + def test_misc_module_funcs(self): + curses.delay_output(1) + curses.flushinp() - win4 = stdscr.derwin(2,2) - win4 = stdscr.derwin(1,1, 5,5) - win4.mvderwin(9,9) + curses.doupdate() + self.assertIs(curses.isendwin(), False) - stdscr.echochar('a') - stdscr.echochar('a', curses.A_BOLD) - stdscr.hline('-', 5) - stdscr.hline('-', 5, curses.A_BOLD) - stdscr.hline(1,1,'-', 5) - stdscr.hline(1,1,'-', 5, curses.A_BOLD) + curses.napms(100) + + curses.newpad(50, 50) + + def test_env_queries(self): + # TODO: term_attrs(), erasewchar(), killwchar() + self.assertIsInstance(curses.termname(), bytes) + self.assertIsInstance(curses.longname(), bytes) + self.assertIsInstance(curses.baudrate(), int) + self.assertIsInstance(curses.has_ic(), bool) + self.assertIsInstance(curses.has_il(), bool) + self.assertIsInstance(curses.termattrs(), int) + + c = curses.killchar() + self.assertIsInstance(c, bytes) + self.assertEqual(len(c), 1) + c = curses.erasechar() + self.assertIsInstance(c, bytes) + self.assertEqual(len(c), 1) + + def test_output_options(self): + stdscr = self.stdscr + + stdscr.clearok(True) + stdscr.clearok(False) + + stdscr.idcok(True) + stdscr.idcok(False) + + stdscr.idlok(False) + stdscr.idlok(True) - stdscr.idcok(1) - stdscr.idlok(1) if hasattr(stdscr, 'immedok'): - stdscr.immedok(1) - stdscr.immedok(0) - stdscr.insch('c') - stdscr.insdelln(1) - stdscr.insnstr('abc', 3) - stdscr.insnstr('abc', 3, curses.A_BOLD) - stdscr.insnstr(5, 5, 'abc', 3) - stdscr.insnstr(5, 5, 'abc', 3, curses.A_BOLD) - - stdscr.insstr('def') - stdscr.insstr('def', curses.A_BOLD) - stdscr.insstr(5, 5, 'def') - stdscr.insstr(5, 5, 'def', curses.A_BOLD) - stdscr.is_linetouched(0) - stdscr.keypad(1) - stdscr.leaveok(1) - stdscr.move(3,3) - win.mvwin(2,2) - stdscr.nodelay(1) - stdscr.notimeout(1) - win2.overlay(win) - win2.overwrite(win) - win2.overlay(win, 1, 2, 2, 1, 3, 3) - win2.overwrite(win, 1, 2, 2, 1, 3, 3) - stdscr.redrawln(1,2) - - stdscr.scrollok(1) - stdscr.scroll() - stdscr.scroll(2) - stdscr.scroll(-3) - - stdscr.move(12, 2) - stdscr.setscrreg(10,15) - win3 = stdscr.subwin(10,10) - win3 = stdscr.subwin(10,10, 5,5) - if hasattr(stdscr, 'syncok') and not sys.platform.startswith("sunos"): - stdscr.syncok(1) - stdscr.timeout(5) - stdscr.touchline(5,5) - stdscr.touchline(5,5,0) - stdscr.vline('a', 3) - stdscr.vline('a', 3, curses.A_STANDOUT) - if hasattr(stdscr, 'chgat'): - stdscr.chgat(5, 2, 3, curses.A_BLINK) - stdscr.chgat(3, curses.A_BOLD) - stdscr.chgat(5, 8, curses.A_UNDERLINE) - stdscr.chgat(curses.A_BLINK) - stdscr.refresh() + stdscr.immedok(True) + stdscr.immedok(False) - stdscr.vline(1,1, 'a', 3) - stdscr.vline(1,1, 'a', 3, curses.A_STANDOUT) + stdscr.leaveok(True) + stdscr.leaveok(False) - if hasattr(stdscr, 'resize'): - stdscr.resize(25, 80) - if hasattr(stdscr, 'enclose'): - stdscr.enclose(10, 10) + stdscr.scrollok(True) + stdscr.scrollok(False) - with tempfile.TemporaryFile() as f: - self.stdscr.putwin(f) - f.seek(0) - curses.getwin(f) + stdscr.setscrreg(5, 10) - self.assertRaises(ValueError, stdscr.getstr, -400) - self.assertRaises(ValueError, stdscr.getstr, 2, 3, -400) - self.assertRaises(ValueError, stdscr.instr, -2) - self.assertRaises(ValueError, stdscr.instr, 2, 3, -2) + curses.nonl() + curses.nl(True) + curses.nl(False) + curses.nl() - def test_embedded_null_chars(self): - # reject embedded null bytes and characters + + def test_input_options(self): stdscr = self.stdscr - for arg in ['a', b'a']: - with self.subTest(arg=arg): - self.assertRaises(ValueError, stdscr.addstr, 'a\0') - self.assertRaises(ValueError, stdscr.addnstr, 'a\0', 1) - self.assertRaises(ValueError, stdscr.insstr, 'a\0') - self.assertRaises(ValueError, stdscr.insnstr, 'a\0', 1) - - def test_module_funcs(self): - "Test module-level functions" - for func in [curses.baudrate, curses.beep, curses.can_change_color, - curses.doupdate, curses.flash, curses.flushinp, - curses.has_colors, curses.has_ic, curses.has_il, - curses.isendwin, curses.killchar, curses.longname, - curses.noecho, curses.nonl, curses.noqiflush, - curses.termattrs, curses.termname, curses.erasechar, - curses.has_extended_color_support]: - with self.subTest(func=func.__qualname__): - func() + if self.isatty: - for func in [curses.cbreak, curses.def_prog_mode, - curses.nocbreak, curses.noraw, - curses.reset_prog_mode]: - with self.subTest(func=func.__qualname__): - func() - if hasattr(curses, 'filter'): - curses.filter() - if hasattr(curses, 'getsyx'): - curses.getsyx() - - # Functions that actually need arguments - if curses.tigetstr("cnorm"): - curses.curs_set(1) - curses.delay_output(1) - curses.echo() ; curses.echo(1) + curses.nocbreak() + curses.cbreak() + curses.cbreak(False) + curses.cbreak(True) + + curses.intrflush(True) + curses.intrflush(False) + + curses.raw() + curses.raw(False) + curses.raw(True) + curses.noraw() + curses.noecho() + curses.echo() + curses.echo(False) + curses.echo(True) + + curses.halfdelay(255) curses.halfdelay(1) - if self.isatty: - curses.intrflush(1) - curses.meta(1) - curses.napms(100) - curses.newpad(50,50) - win = curses.newwin(5,5) - win = curses.newwin(5,5, 1,1) - curses.nl() ; curses.nl(1) - curses.putp(b'abc') + + stdscr.keypad(True) + stdscr.keypad(False) + + curses.meta(True) + curses.meta(False) + + stdscr.nodelay(True) + stdscr.nodelay(False) + + curses.noqiflush() + curses.qiflush(True) + curses.qiflush(False) curses.qiflush() - if self.isatty: - curses.raw() ; curses.raw(1) + + stdscr.notimeout(True) + stdscr.notimeout(False) + + stdscr.timeout(-1) + stdscr.timeout(0) + stdscr.timeout(5) + + @requires_curses_func('typeahead') + def test_typeahead(self): + curses.typeahead(sys.__stdin__.fileno()) + curses.typeahead(-1) + + def test_prog_mode(self): + if not self.isatty: + self.skipTest('requires terminal') + curses.def_prog_mode() + curses.reset_prog_mode() + + def test_beep(self): + if (curses.tigetstr("bel") is not None + or curses.tigetstr("flash") is not None): + curses.beep() + else: + try: + curses.beep() + except curses.error: + self.skipTest('beep() failed') + + def test_flash(self): + if (curses.tigetstr("bel") is not None + or curses.tigetstr("flash") is not None): + curses.flash() + else: + try: + curses.flash() + except curses.error: + self.skipTest('flash() failed') + + def test_curs_set(self): + for vis, cap in [(0, 'civis'), (2, 'cvvis'), (1, 'cnorm')]: + if curses.tigetstr(cap) is not None: + curses.curs_set(vis) + else: + try: + curses.curs_set(vis) + except curses.error: + pass + + @requires_curses_func('get_escdelay') + def test_escdelay(self): + escdelay = curses.get_escdelay() + self.assertIsInstance(escdelay, int) curses.set_escdelay(25) self.assertEqual(curses.get_escdelay(), 25) + curses.set_escdelay(escdelay) + + @requires_curses_func('get_tabsize') + def test_tabsize(self): + tabsize = curses.get_tabsize() + self.assertIsInstance(tabsize, int) curses.set_tabsize(4) self.assertEqual(curses.get_tabsize(), 4) - if hasattr(curses, 'setsyx'): - curses.setsyx(5,5) - curses.tigetflag('hc') - curses.tigetnum('co') - curses.tigetstr('cr') - curses.tparm(b'cr') - if hasattr(curses, 'typeahead'): - curses.typeahead(sys.__stdin__.fileno()) - curses.unctrl('a') - curses.ungetch('a') - if hasattr(curses, 'use_env'): - curses.use_env(1) - - # Functions only available on a few platforms + curses.set_tabsize(tabsize) + + @requires_curses_func('getsyx') + def test_getsyx(self): + y, x = curses.getsyx() + self.assertIsInstance(y, int) + self.assertIsInstance(x, int) + curses.setsyx(4, 5) + self.assertEqual(curses.getsyx(), (4, 5)) def bad_colors(self): return (-1, curses.COLORS, -2**31 - 1, 2**31, -2**63 - 1, 2**63, 2**64) @@ -328,6 +848,10 @@ def bad_colors2(self): def bad_pairs(self): return (-1, -2**31 - 1, 2**31, -2**63 - 1, 2**63, 2**64) + def test_has_colors(self): + self.assertIsInstance(curses.has_colors(), bool) + self.assertIsInstance(curses.can_change_color(), bool) + def test_start_color(self): if not curses.has_colors(): self.skipTest('requires colors support') @@ -348,7 +872,7 @@ def test_color_content(self): @requires_colors def test_init_color(self): - if not curses.can_change_color: + if not curses.can_change_color(): self.skipTest('cannot change color') old = curses.color_content(0) @@ -435,14 +959,22 @@ def test_color_attrs(self): @requires_curses_func('use_default_colors') @requires_colors def test_use_default_colors(self): - self.assertIn(curses.pair_content(0), - ((curses.COLOR_WHITE, curses.COLOR_BLACK), (-1, -1))) - curses.use_default_colors() + old = curses.pair_content(0) + try: + curses.use_default_colors() + except curses.error: + self.skipTest('cannot change color (use_default_colors() failed)') self.assertEqual(curses.pair_content(0), (-1, -1)) + self.assertIn(old, [(curses.COLOR_WHITE, curses.COLOR_BLACK), (-1, -1), (0, 0)]) - @requires_curses_func('keyname') def test_keyname(self): - curses.keyname(13) + # TODO: key_name() + self.assertEqual(curses.keyname(65), b'A') + self.assertEqual(curses.keyname(13), b'^M') + self.assertEqual(curses.keyname(127), b'^?') + self.assertEqual(curses.keyname(0), b'^@') + self.assertRaises(ValueError, curses.keyname, -1) + self.assertIsInstance(curses.keyname(256), bytes) @requires_curses_func('has_key') def test_has_key(self): @@ -498,22 +1030,46 @@ def test_new_curses_panel(self): @requires_curses_func('is_term_resized') def test_is_term_resized(self): - curses.is_term_resized(*self.stdscr.getmaxyx()) + lines, cols = curses.LINES, curses.COLS + self.assertIs(curses.is_term_resized(lines, cols), False) + self.assertIs(curses.is_term_resized(lines-1, cols-1), True) @requires_curses_func('resize_term') def test_resize_term(self): - curses.resize_term(*self.stdscr.getmaxyx()) + curses.update_lines_cols() + lines, cols = curses.LINES, curses.COLS + new_lines = lines - 1 + new_cols = cols + 1 + curses.resize_term(new_lines, new_cols) + self.assertEqual(curses.LINES, new_lines) + self.assertEqual(curses.COLS, new_cols) + + curses.resize_term(lines, cols) + self.assertEqual(curses.LINES, lines) + self.assertEqual(curses.COLS, cols) @requires_curses_func('resizeterm') def test_resizeterm(self): + curses.update_lines_cols() lines, cols = curses.LINES, curses.COLS new_lines = lines - 1 new_cols = cols + 1 curses.resizeterm(new_lines, new_cols) - self.assertEqual(curses.LINES, new_lines) self.assertEqual(curses.COLS, new_cols) + curses.resizeterm(lines, cols) + self.assertEqual(curses.LINES, lines) + self.assertEqual(curses.COLS, cols) + + def test_ungetch(self): + curses.ungetch(b'A') + self.assertEqual(self.stdscr.getkey(), 'A') + curses.ungetch('B') + self.assertEqual(self.stdscr.getkey(), 'B') + curses.ungetch(67) + self.assertEqual(self.stdscr.getkey(), 'C') + def test_issue6243(self): curses.ungetch(1025) self.stdscr.getkey() @@ -542,10 +1098,6 @@ def test_unget_wch(self): read = stdscr.get_wch() self.assertEqual(read, ch) - def test_issue10570(self): - b = curses.tparm(curses.tigetstr("cup"), 5, 3) - self.assertIs(type(b), bytes) - def test_encoding(self): stdscr = self.stdscr import codecs @@ -585,26 +1137,25 @@ def test_issue21088(self): human_readable_signature = stdscr.addch.__doc__.split("\n")[0] self.assertIn("[y, x,]", human_readable_signature) + @requires_curses_window_meth('resize') def test_issue13051(self): - stdscr = self.stdscr - if not hasattr(stdscr, 'resize'): - raise unittest.SkipTest('requires curses.window.resize') - box = curses.textpad.Textbox(stdscr, insert_mode=True) - lines, cols = stdscr.getmaxyx() - stdscr.resize(lines-2, cols-2) + win = curses.newwin(5, 15, 2, 5) + box = curses.textpad.Textbox(win, insert_mode=True) + lines, cols = win.getmaxyx() + win.resize(lines-2, cols-2) # this may cause infinite recursion, leading to a RuntimeError box._insert_printable_char('a') class MiscTests(unittest.TestCase): - @requires_curses_func('update_lines_cols') def test_update_lines_cols(self): - # this doesn't actually test that LINES and COLS are updated, - # because we can't automate changing them. See Issue #4254 for - # a manual test script. We can only test that the function - # can be called. curses.update_lines_cols() + lines, cols = curses.LINES, curses.COLS + curses.LINES = curses.COLS = 0 + curses.update_lines_cols() + self.assertEqual(curses.LINES, lines) + self.assertEqual(curses.COLS, cols) @requires_curses_func('ncurses_version') def test_ncurses_version(self): @@ -626,6 +1177,11 @@ def test_ncurses_version(self): self.assertGreaterEqual(v.minor, 0) self.assertGreaterEqual(v.patch, 0) + def test_has_extended_color_support(self): + r = curses.has_extended_color_support() + self.assertIsInstance(r, bool) + + class TestAscii(unittest.TestCase): def test_controlnames(self): @@ -714,5 +1270,21 @@ def test_unctrl(self): self.assertEqual(unctrl(ord('\xc1')), '!A') +def lorem_ipsum(win): + text = [ + 'Lorem ipsum', + 'dolor sit amet,', + 'consectetur', + 'adipiscing elit,', + 'sed do eiusmod', + 'tempor incididunt', + 'ut labore et', + 'dolore magna', + 'aliqua.', + ] + maxy, maxx = win.getmaxyx() + for y, line in enumerate(text[:maxy]): + win.addstr(y, 0, line[:maxx - (y == maxy - 1)]) + if __name__ == '__main__': unittest.main() From fd43bbf5195c18279ceb0125e76704878f3f81d7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 31 Jan 2021 17:42:38 +0200 Subject: [PATCH 1093/1261] bpo-43083: Fix error handling in _sqlite3 (GH-24395) --- Modules/_sqlite/connection.c | 6 +++++- Modules/_sqlite/cursor.c | 20 ++++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index dbe5dd1ec13fae..370dc1a30e46a1 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -1772,7 +1772,11 @@ pysqlite_connection_create_collation_impl(pysqlite_Connection *self, (callable != Py_None) ? callable : NULL, (callable != Py_None) ? pysqlite_collation_callback : NULL); if (rc != SQLITE_OK) { - PyDict_DelItem(self->collations, uppercase_name); + if (callable != Py_None) { + if (PyDict_DelItem(self->collations, uppercase_name) < 0) { + PyErr_Clear(); + } + } _pysqlite_seterror(self->db, NULL); goto finally; } diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 0852aa940264a2..f8fe11ed1ea75b 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -567,11 +567,13 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation } if (!multiple) { - Py_DECREF(self->lastrowid); Py_BEGIN_ALLOW_THREADS lastrowid = sqlite3_last_insert_rowid(self->connection->db); Py_END_ALLOW_THREADS - self->lastrowid = PyLong_FromLongLong(lastrowid); + Py_SETREF(self->lastrowid, PyLong_FromLongLong(lastrowid)); + if (self->lastrowid == NULL) { + goto error; + } } if (rc == SQLITE_ROW) { @@ -842,8 +844,11 @@ pysqlite_cursor_fetchmany_impl(pysqlite_Cursor *self, int maxrows) } while ((row = pysqlite_cursor_iternext(self))) { - PyList_Append(list, row); - Py_XDECREF(row); + if (PyList_Append(list, row) < 0) { + Py_DECREF(row); + break; + } + Py_DECREF(row); if (++counter == maxrows) { break; @@ -877,8 +882,11 @@ pysqlite_cursor_fetchall_impl(pysqlite_Cursor *self) } while ((row = pysqlite_cursor_iternext(self))) { - PyList_Append(list, row); - Py_XDECREF(row); + if (PyList_Append(list, row) < 0) { + Py_DECREF(row); + break; + } + Py_DECREF(row); } if (PyErr_Occurred()) { From 78c649180a5e759740fd1eeddcb8aebcee50c4cb Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Sun, 31 Jan 2021 18:55:15 +0100 Subject: [PATCH 1094/1261] bpo-41604: Don't decrement the reference count of the previous user_ptr when set_panel_usertpr fails (GH-21933) --- .../next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst | 2 ++ Modules/_curses_panel.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst diff --git a/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst b/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst new file mode 100644 index 00000000000000..0f9794cbdb321e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst @@ -0,0 +1,2 @@ +Don't decrement the reference count of the previous user_ptr when +set_panel_userptr fails. diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c index d782ccd0867986..94caf8c93bc8c3 100644 --- a/Modules/_curses_panel.c +++ b/Modules/_curses_panel.c @@ -456,7 +456,9 @@ _curses_panel_panel_set_userptr_impl(PyCursesPanelObject *self, /* In case of an ncurses error, decref the new object again */ Py_DECREF(obj); } - Py_XDECREF(oldobj); + else { + Py_XDECREF(oldobj); + } _curses_panel_state *state = PyType_GetModuleState(cls); return PyCursesCheckERR(state, rc, "set_panel_userptr"); From 266a2a051db3f5f8f38e21eab3305bbf50fdc0b4 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 31 Jan 2021 23:21:55 +0200 Subject: [PATCH 1095/1261] bpo-43016: Fix test_curses on platform without cursesw (GH-24405) --- Lib/test/test_curses.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index 29286bce99e893..a9f7001d39f08d 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -240,13 +240,21 @@ def test_refresh_control(self): def test_output_character(self): stdscr = self.stdscr + encoding = stdscr.encoding # addch() stdscr.refresh() stdscr.move(0, 0) stdscr.addch('A') stdscr.addch(b'A') stdscr.addch(65) - stdscr.addch('\u20ac') + c = '\u20ac' + try: + stdscr.addch(c) + except UnicodeEncodeError: + self.assertRaises(UnicodeEncodeError, c.encode, encoding) + except OverflowError: + encoded = c.encode(encoding) + self.assertNotEqual(len(encoded), 1, repr(encoded)) stdscr.addch('A', curses.A_BOLD) stdscr.addch(1, 2, 'A') stdscr.addch(2, 3, 'A', curses.A_BOLD) @@ -258,19 +266,25 @@ def test_output_character(self): stdscr.echochar('A') stdscr.echochar(b'A') stdscr.echochar(65) - self.assertRaises(OverflowError, stdscr.echochar, '\u20ac') + with self.assertRaises((UnicodeEncodeError, OverflowError)): + stdscr.echochar('\u20ac') stdscr.echochar('A', curses.A_BOLD) self.assertIs(stdscr.is_wintouched(), False) def test_output_string(self): stdscr = self.stdscr + encoding = stdscr.encoding # addstr()/insstr() for func in [stdscr.addstr, stdscr.insstr]: with self.subTest(func.__qualname__): stdscr.move(0, 0) func('abcd') func(b'abcd') - func('àßçđ') + s = 'àßçđ' + try: + func(s) + except UnicodeEncodeError: + self.assertRaises(UnicodeEncodeError, s.encode, encoding) func('abcd', curses.A_BOLD) func(1, 2, 'abcd') func(2, 3, 'abcd', curses.A_BOLD) @@ -281,7 +295,11 @@ def test_output_string(self): stdscr.move(0, 0) func('1234', 3) func(b'1234', 3) - func('\u0661\u0662\u0663\u0664', 3) + s = '\u0661\u0662\u0663\u0664' + try: + func(s, 3) + except UnicodeEncodeError: + self.assertRaises(UnicodeEncodeError, s.encode, encoding) func('1234', 5) func('1234', 3, curses.A_BOLD) func(1, 2, '1234', 3) @@ -471,7 +489,7 @@ def test_background(self): win = curses.newwin(5, 15, 5, 2) win.addstr(0, 0, 'Lorem ipsum') - self.assertEqual(win.getbkgd(), 0) + self.assertIn(win.getbkgd(), (0, 32)) # bkgdset() win.bkgdset('_') From e52d3cc292d9702f8359df502eed5e7a6db08c74 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 31 Jan 2021 22:48:23 +0000 Subject: [PATCH 1096/1261] bpo-42986: Fix parser crash when reporting syntax errors in f-string with newlines (GH-24279) --- Lib/test/test_fstring.py | 3 +++ .../Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst | 2 ++ Parser/pegen.c | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 7ca1512ebbf1bf..d7143d154a1bc1 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -664,6 +664,9 @@ def test_parens_in_expressions(self): self.assertAllRaise(SyntaxError, 'unterminated string literal', ["f'{\n}'", ]) + def test_newlines_before_syntax_error(self): + self.assertAllRaise(SyntaxError, "invalid syntax", + ["f'{.}'", "\nf'{.}'", "\n\nf'{.}'"]) def test_backslashes_in_string_part(self): self.assertEqual(f'\t', '\t') diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst new file mode 100644 index 00000000000000..6e4ed60bf224d6 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst @@ -0,0 +1,2 @@ +Fix parser crash when reporting syntax errors in f-string with newlines. +Patch by Pablo Galindo. diff --git a/Parser/pegen.c b/Parser/pegen.c index 0e7f86bc99e451..2554273877f783 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -454,7 +454,7 @@ _PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, does not physically exist */ assert(p->tok->fp == NULL || p->tok->fp == stdin || p->tok->done == E_EOF); - if (p->tok->lineno == lineno) { + if (p->tok->lineno <= lineno) { Py_ssize_t size = p->tok->inp - p->tok->buf; error_line = PyUnicode_DecodeUTF8(p->tok->buf, size, "replace"); } From 96f922e4e0f42e2ef99dd7ee746cf4ab19957f9b Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 31 Jan 2021 22:52:56 +0000 Subject: [PATCH 1097/1261] bpo-43017: Improve error message for unparenthesised tuples in comprehensions (GH24314) --- Grammar/python.gram | 8 +- Lib/test/test_named_expressions.py | 3 +- Lib/test/test_syntax.py | 15 + .../2021-01-24-18-02-05.bpo-43017.emEcXX.rst | 2 + Parser/parser.c | 566 ++++++++++-------- 5 files changed, 343 insertions(+), 251 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index 05ddce520fbae1..e72158be22380a 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -507,7 +507,7 @@ strings[expr_ty] (memo): a=STRING+ { _PyPegen_concatenate_strings(p, a) } list[expr_ty]: | '[' a=[star_named_expressions] ']' { _Py_List(a, Load, EXTRA) } listcomp[expr_ty]: - | '[' a=named_expression ~ b=for_if_clauses ']' { _Py_ListComp(a, b, EXTRA) } + | '[' a=named_expression b=for_if_clauses ']' { _Py_ListComp(a, b, EXTRA) } | invalid_comprehension tuple[expr_ty]: | '(' a=[y=star_named_expression ',' z=[star_named_expressions] { _PyPegen_seq_insert_in_front(p, y, z) } ] ')' { @@ -516,11 +516,11 @@ group[expr_ty]: | '(' a=(yield_expr | named_expression) ')' { a } | invalid_group genexp[expr_ty]: - | '(' a=named_expression ~ b=for_if_clauses ')' { _Py_GeneratorExp(a, b, EXTRA) } + | '(' a=named_expression b=for_if_clauses ')' { _Py_GeneratorExp(a, b, EXTRA) } | invalid_comprehension set[expr_ty]: '{' a=star_named_expressions '}' { _Py_Set(a, EXTRA) } setcomp[expr_ty]: - | '{' a=named_expression ~ b=for_if_clauses '}' { _Py_SetComp(a, b, EXTRA) } + | '{' a=named_expression b=for_if_clauses '}' { _Py_SetComp(a, b, EXTRA) } | invalid_comprehension dict[expr_ty]: | '{' a=[double_starred_kvpairs] '}' { @@ -692,6 +692,8 @@ invalid_primary: invalid_comprehension: | ('[' | '(' | '{') a=starred_expression for_if_clauses { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable unpacking cannot be used in comprehension") } + | ('[' | '{') a=star_named_expression ',' [star_named_expressions] { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "did you forget parentheses around the comprehension target?") } invalid_dict_comprehension: | '{' a='**' bitwise_or for_if_clauses '}' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "dict unpacking cannot be used in dict comprehension") } diff --git a/Lib/test/test_named_expressions.py b/Lib/test/test_named_expressions.py index 5908f1210857a3..20ac2e699f0c35 100644 --- a/Lib/test/test_named_expressions.py +++ b/Lib/test/test_named_expressions.py @@ -101,7 +101,8 @@ def test_named_expression_invalid_16(self): def test_named_expression_invalid_17(self): code = "[i := 0, j := 1 for i, j in [(1, 2), (3, 4)]]" - with self.assertRaisesRegex(SyntaxError, "invalid syntax"): + with self.assertRaisesRegex(SyntaxError, + "did you forget parentheses around the comprehension target?"): exec(code, {}, {}) def test_named_expression_invalid_in_class_body(self): diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index c8d191df4cc495..604474f1e83870 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -235,6 +235,21 @@ Traceback (most recent call last): SyntaxError: invalid syntax +Comprehensions creating tuples without parentheses +should produce a specialized error message: + +>>> [x,y for x,y in range(100)] +Traceback (most recent call last): +SyntaxError: did you forget parentheses around the comprehension target? + +>>> {x,y for x,y in range(100)} +Traceback (most recent call last): +SyntaxError: did you forget parentheses around the comprehension target? + +>>> {x,y: None for x,y in range(100)} +Traceback (most recent call last): +SyntaxError: did you forget parentheses around the comprehension target? + From compiler_complex_args(): >>> def f(None=1): diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst new file mode 100644 index 00000000000000..a809f5cbb1de14 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst @@ -0,0 +1,2 @@ +Improve error message in the parser when using un-parenthesised tuples in +comprehensions. Patch by Pablo Galindo. diff --git a/Parser/parser.c b/Parser/parser.c index f7794e715b918f..d333accf71ccaf 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -362,11 +362,11 @@ static KeywordToken *reserved_keywords[] = { #define _loop0_129_type 1293 #define _tmp_130_type 1294 #define _tmp_131_type 1295 -#define _loop0_132_type 1296 -#define _loop1_133_type 1297 -#define _loop0_134_type 1298 -#define _loop1_135_type 1299 -#define _tmp_136_type 1300 +#define _tmp_132_type 1296 +#define _loop0_133_type 1297 +#define _loop1_134_type 1298 +#define _loop0_135_type 1299 +#define _loop1_136_type 1300 #define _tmp_137_type 1301 #define _tmp_138_type 1302 #define _tmp_139_type 1303 @@ -385,6 +385,7 @@ static KeywordToken *reserved_keywords[] = { #define _tmp_152_type 1316 #define _tmp_153_type 1317 #define _tmp_154_type 1318 +#define _tmp_155_type 1319 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -682,11 +683,11 @@ static asdl_seq *_loop0_128_rule(Parser *p); static asdl_seq *_loop0_129_rule(Parser *p); static void *_tmp_130_rule(Parser *p); static void *_tmp_131_rule(Parser *p); -static asdl_seq *_loop0_132_rule(Parser *p); -static asdl_seq *_loop1_133_rule(Parser *p); -static asdl_seq *_loop0_134_rule(Parser *p); -static asdl_seq *_loop1_135_rule(Parser *p); -static void *_tmp_136_rule(Parser *p); +static void *_tmp_132_rule(Parser *p); +static asdl_seq *_loop0_133_rule(Parser *p); +static asdl_seq *_loop1_134_rule(Parser *p); +static asdl_seq *_loop0_135_rule(Parser *p); +static asdl_seq *_loop1_136_rule(Parser *p); static void *_tmp_137_rule(Parser *p); static void *_tmp_138_rule(Parser *p); static void *_tmp_139_rule(Parser *p); @@ -705,6 +706,7 @@ static void *_tmp_151_rule(Parser *p); static void *_tmp_152_rule(Parser *p); static void *_tmp_153_rule(Parser *p); static void *_tmp_154_rule(Parser *p); +static void *_tmp_155_rule(Parser *p); // file: statements? $ @@ -11089,7 +11091,7 @@ list_rule(Parser *p) return _res; } -// listcomp: '[' named_expression ~ for_if_clauses ']' | invalid_comprehension +// listcomp: '[' named_expression for_if_clauses ']' | invalid_comprehension static expr_ty listcomp_rule(Parser *p) { @@ -11109,13 +11111,12 @@ listcomp_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // '[' named_expression ~ for_if_clauses ']' + { // '[' named_expression for_if_clauses ']' if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> listcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' named_expression ~ for_if_clauses ']'")); - int _cut_var = 0; + D(fprintf(stderr, "%*c> listcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' named_expression for_if_clauses ']'")); Token * _literal; Token * _literal_1; expr_ty a; @@ -11125,14 +11126,12 @@ listcomp_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_cut_var = 1) - && (b = for_if_clauses_rule(p)) // for_if_clauses && (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' ) { - D(fprintf(stderr, "%*c+ listcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' named_expression ~ for_if_clauses ']'")); + D(fprintf(stderr, "%*c+ listcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' named_expression for_if_clauses ']'")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -11152,11 +11151,7 @@ listcomp_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s listcomp[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' named_expression ~ for_if_clauses ']'")); - if (_cut_var) { - D(p->level--); - return NULL; - } + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' named_expression for_if_clauses ']'")); } if (p->call_invalid_rules) { // invalid_comprehension if (p->error_indicator) { @@ -11314,7 +11309,7 @@ group_rule(Parser *p) return _res; } -// genexp: '(' named_expression ~ for_if_clauses ')' | invalid_comprehension +// genexp: '(' named_expression for_if_clauses ')' | invalid_comprehension static expr_ty genexp_rule(Parser *p) { @@ -11334,13 +11329,12 @@ genexp_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // '(' named_expression ~ for_if_clauses ')' + { // '(' named_expression for_if_clauses ')' if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> genexp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' named_expression ~ for_if_clauses ')'")); - int _cut_var = 0; + D(fprintf(stderr, "%*c> genexp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' named_expression for_if_clauses ')'")); Token * _literal; Token * _literal_1; expr_ty a; @@ -11350,14 +11344,12 @@ genexp_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_cut_var = 1) - && (b = for_if_clauses_rule(p)) // for_if_clauses && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ genexp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' named_expression ~ for_if_clauses ')'")); + D(fprintf(stderr, "%*c+ genexp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' named_expression for_if_clauses ')'")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -11377,11 +11369,7 @@ genexp_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s genexp[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' named_expression ~ for_if_clauses ')'")); - if (_cut_var) { - D(p->level--); - return NULL; - } + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' named_expression for_if_clauses ')'")); } if (p->call_invalid_rules) { // invalid_comprehension if (p->error_indicator) { @@ -11473,7 +11461,7 @@ set_rule(Parser *p) return _res; } -// setcomp: '{' named_expression ~ for_if_clauses '}' | invalid_comprehension +// setcomp: '{' named_expression for_if_clauses '}' | invalid_comprehension static expr_ty setcomp_rule(Parser *p) { @@ -11493,13 +11481,12 @@ setcomp_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // '{' named_expression ~ for_if_clauses '}' + { // '{' named_expression for_if_clauses '}' if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> setcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' named_expression ~ for_if_clauses '}'")); - int _cut_var = 0; + D(fprintf(stderr, "%*c> setcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' named_expression for_if_clauses '}'")); Token * _literal; Token * _literal_1; expr_ty a; @@ -11509,14 +11496,12 @@ setcomp_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_cut_var = 1) - && (b = for_if_clauses_rule(p)) // for_if_clauses && (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ setcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' named_expression ~ for_if_clauses '}'")); + D(fprintf(stderr, "%*c+ setcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' named_expression for_if_clauses '}'")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -11536,11 +11521,7 @@ setcomp_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s setcomp[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' named_expression ~ for_if_clauses '}'")); - if (_cut_var) { - D(p->level--); - return NULL; - } + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' named_expression for_if_clauses '}'")); } if (p->call_invalid_rules) { // invalid_comprehension if (p->error_indicator) { @@ -15194,7 +15175,9 @@ invalid_primary_rule(Parser *p) return _res; } -// invalid_comprehension: ('[' | '(' | '{') starred_expression for_if_clauses +// invalid_comprehension: +// | ('[' | '(' | '{') starred_expression for_if_clauses +// | ('[' | '{') star_named_expression ',' star_named_expressions? static void * invalid_comprehension_rule(Parser *p) { @@ -15235,6 +15218,40 @@ invalid_comprehension_rule(Parser *p) D(fprintf(stderr, "%*c%s invalid_comprehension[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); } + { // ('[' | '{') star_named_expression ',' star_named_expressions? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions?")); + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + void *_tmp_132_var; + expr_ty a; + if ( + (_tmp_132_var = _tmp_132_rule(p)) // '[' | '{' + && + (a = star_named_expression_rule(p)) // star_named_expression + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_opt_var = star_named_expressions_rule(p), 1) // star_named_expressions? + ) + { + D(fprintf(stderr, "%*c+ invalid_comprehension[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions?")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "did you forget parentheses around the comprehension target?" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_comprehension[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions?")); + } _res = NULL; done: D(p->level--); @@ -15311,11 +15328,11 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* invalid_parameters_helper param_no_default")); - asdl_seq * _loop0_132_var; + asdl_seq * _loop0_133_var; void *invalid_parameters_helper_var; arg_ty param_no_default_var; if ( - (_loop0_132_var = _loop0_132_rule(p)) // param_no_default* + (_loop0_133_var = _loop0_133_rule(p)) // param_no_default* && (invalid_parameters_helper_var = invalid_parameters_helper_rule(p)) // invalid_parameters_helper && @@ -15382,13 +15399,13 @@ invalid_parameters_helper_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters_helper[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - asdl_seq * _loop1_133_var; + asdl_seq * _loop1_134_var; if ( - (_loop1_133_var = _loop1_133_rule(p)) // param_with_default+ + (_loop1_134_var = _loop1_134_rule(p)) // param_with_default+ ) { D(fprintf(stderr, "%*c+ invalid_parameters_helper[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - _res = _loop1_133_var; + _res = _loop1_134_var; goto done; } p->mark = _mark; @@ -15419,11 +15436,11 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* invalid_lambda_parameters_helper lambda_param_no_default")); - asdl_seq * _loop0_134_var; + asdl_seq * _loop0_135_var; void *invalid_lambda_parameters_helper_var; arg_ty lambda_param_no_default_var; if ( - (_loop0_134_var = _loop0_134_rule(p)) // lambda_param_no_default* + (_loop0_135_var = _loop0_135_rule(p)) // lambda_param_no_default* && (invalid_lambda_parameters_helper_var = invalid_lambda_parameters_helper_rule(p)) // invalid_lambda_parameters_helper && @@ -15492,13 +15509,13 @@ invalid_lambda_parameters_helper_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters_helper[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - asdl_seq * _loop1_135_var; + asdl_seq * _loop1_136_var; if ( - (_loop1_135_var = _loop1_135_rule(p)) // lambda_param_with_default+ + (_loop1_136_var = _loop1_136_rule(p)) // lambda_param_with_default+ ) { D(fprintf(stderr, "%*c+ invalid_lambda_parameters_helper[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - _res = _loop1_135_var; + _res = _loop1_136_var; goto done; } p->mark = _mark; @@ -15529,11 +15546,11 @@ invalid_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); Token * _literal; - void *_tmp_136_var; + void *_tmp_137_var; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_136_var = _tmp_136_rule(p)) // ')' | ',' (')' | '**') + (_tmp_137_var = _tmp_137_rule(p)) // ')' | ',' (')' | '**') ) { D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); @@ -15603,11 +15620,11 @@ invalid_lambda_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); Token * _literal; - void *_tmp_137_var; + void *_tmp_138_var; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_137_var = _tmp_137_rule(p)) // ':' | ',' (':' | '**') + (_tmp_138_var = _tmp_138_rule(p)) // ':' | ',' (':' | '**') ) { D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); @@ -17116,12 +17133,12 @@ _loop1_22_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_138_var; + void *_tmp_139_var; while ( - (_tmp_138_var = _tmp_138_rule(p)) // star_targets '=' + (_tmp_139_var = _tmp_139_rule(p)) // star_targets '=' ) { - _res = _tmp_138_var; + _res = _tmp_139_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17624,12 +17641,12 @@ _loop0_31_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_139_var; + void *_tmp_140_var; while ( - (_tmp_139_var = _tmp_139_rule(p)) // '.' | '...' + (_tmp_140_var = _tmp_140_rule(p)) // '.' | '...' ) { - _res = _tmp_139_var; + _res = _tmp_140_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17690,12 +17707,12 @@ _loop1_32_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_140_var; + void *_tmp_141_var; while ( - (_tmp_140_var = _tmp_140_rule(p)) // '.' | '...' + (_tmp_141_var = _tmp_141_rule(p)) // '.' | '...' ) { - _res = _tmp_140_var; + _res = _tmp_141_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19852,12 +19869,12 @@ _loop1_68_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); - void *_tmp_141_var; + void *_tmp_142_var; while ( - (_tmp_141_var = _tmp_141_rule(p)) // '@' named_expression NEWLINE + (_tmp_142_var = _tmp_142_rule(p)) // '@' named_expression NEWLINE ) { - _res = _tmp_141_var; + _res = _tmp_142_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19970,12 +19987,12 @@ _loop1_70_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); - void *_tmp_142_var; + void *_tmp_143_var; while ( - (_tmp_142_var = _tmp_142_rule(p)) // ',' star_expression + (_tmp_143_var = _tmp_143_rule(p)) // ',' star_expression ) { - _res = _tmp_142_var; + _res = _tmp_143_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -20155,12 +20172,12 @@ _loop1_73_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); - void *_tmp_143_var; + void *_tmp_144_var; while ( - (_tmp_143_var = _tmp_143_rule(p)) // ',' expression + (_tmp_144_var = _tmp_144_rule(p)) // ',' expression ) { - _res = _tmp_143_var; + _res = _tmp_144_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21185,12 +21202,12 @@ _loop1_88_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); - void *_tmp_144_var; + void *_tmp_145_var; while ( - (_tmp_144_var = _tmp_144_rule(p)) // 'or' conjunction + (_tmp_145_var = _tmp_145_rule(p)) // 'or' conjunction ) { - _res = _tmp_144_var; + _res = _tmp_145_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21256,12 +21273,12 @@ _loop1_89_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); - void *_tmp_145_var; + void *_tmp_146_var; while ( - (_tmp_145_var = _tmp_145_rule(p)) // 'and' inversion + (_tmp_146_var = _tmp_146_rule(p)) // 'and' inversion ) { - _res = _tmp_145_var; + _res = _tmp_146_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22177,12 +22194,12 @@ _loop0_104_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_146_var; + void *_tmp_147_var; while ( - (_tmp_146_var = _tmp_146_rule(p)) // 'if' disjunction + (_tmp_147_var = _tmp_147_rule(p)) // 'if' disjunction ) { - _res = _tmp_146_var; + _res = _tmp_147_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22243,12 +22260,12 @@ _loop0_105_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_147_var; + void *_tmp_148_var; while ( - (_tmp_147_var = _tmp_147_rule(p)) // 'if' disjunction + (_tmp_148_var = _tmp_148_rule(p)) // 'if' disjunction ) { - _res = _tmp_147_var; + _res = _tmp_148_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22314,7 +22331,7 @@ _loop0_107_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_148_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' ) { _res = elem; @@ -22377,7 +22394,7 @@ _gather_106_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_148_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' && (seq = _loop0_107_rule(p)) // _loop0_107 ) @@ -22923,12 +22940,12 @@ _loop0_117_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_149_var; + void *_tmp_150_var; while ( - (_tmp_149_var = _tmp_149_rule(p)) // ',' star_target + (_tmp_150_var = _tmp_150_rule(p)) // ',' star_target ) { - _res = _tmp_149_var; + _res = _tmp_150_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23103,12 +23120,12 @@ _loop1_120_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_150_var; + void *_tmp_151_var; while ( - (_tmp_150_var = _tmp_150_rule(p)) // ',' star_target + (_tmp_151_var = _tmp_151_rule(p)) // ',' star_target ) { - _res = _tmp_150_var; + _res = _tmp_151_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23564,12 +23581,12 @@ _loop0_128_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_151_var; + void *_tmp_152_var; while ( - (_tmp_151_var = _tmp_151_rule(p)) // star_targets '=' + (_tmp_152_var = _tmp_152_rule(p)) // star_targets '=' ) { - _res = _tmp_151_var; + _res = _tmp_152_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23630,12 +23647,12 @@ _loop0_129_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_152_var; + void *_tmp_153_var; while ( - (_tmp_152_var = _tmp_152_rule(p)) // star_targets '=' + (_tmp_153_var = _tmp_153_rule(p)) // star_targets '=' ) { - _res = _tmp_152_var; + _res = _tmp_153_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23798,9 +23815,64 @@ _tmp_131_rule(Parser *p) return _res; } -// _loop0_132: param_no_default +// _tmp_132: '[' | '{' +static void * +_tmp_132_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '[' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + ) + { + D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); + } + { // '{' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + ) + { + D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_133: param_no_default static asdl_seq * -_loop0_132_rule(Parser *p) +_loop0_133_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23824,7 +23896,7 @@ _loop0_132_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -23846,7 +23918,7 @@ _loop0_132_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_132[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_133[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -23859,14 +23931,14 @@ _loop0_132_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_132_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_133_type, _seq); D(p->level--); return _seq; } -// _loop1_133: param_with_default +// _loop1_134: param_with_default static asdl_seq * -_loop1_133_rule(Parser *p) +_loop1_134_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23890,7 +23962,7 @@ _loop1_133_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -23912,7 +23984,7 @@ _loop1_133_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_133[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_134[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -23930,14 +24002,14 @@ _loop1_133_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_133_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_134_type, _seq); D(p->level--); return _seq; } -// _loop0_134: lambda_param_no_default +// _loop0_135: lambda_param_no_default static asdl_seq * -_loop0_134_rule(Parser *p) +_loop0_135_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -23961,7 +24033,7 @@ _loop0_134_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -23983,7 +24055,7 @@ _loop0_134_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_134[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_135[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -23996,14 +24068,14 @@ _loop0_134_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop0_134_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop0_135_type, _seq); D(p->level--); return _seq; } -// _loop1_135: lambda_param_with_default +// _loop1_136: lambda_param_with_default static asdl_seq * -_loop1_135_rule(Parser *p) +_loop1_136_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24027,7 +24099,7 @@ _loop1_135_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop1_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -24049,7 +24121,7 @@ _loop1_135_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_135[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_136[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -24067,14 +24139,14 @@ _loop1_135_rule(Parser *p) } for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); PyMem_Free(_children); - _PyPegen_insert_memo(p, _start_mark, _loop1_135_type, _seq); + _PyPegen_insert_memo(p, _start_mark, _loop1_136_type, _seq); D(p->level--); return _seq; } -// _tmp_136: ')' | ',' (')' | '**') +// _tmp_137: ')' | ',' (')' | '**') static void * -_tmp_136_rule(Parser *p) +_tmp_137_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24088,18 +24160,18 @@ _tmp_136_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ',' (')' | '**') @@ -24107,21 +24179,21 @@ _tmp_136_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); Token * _literal; - void *_tmp_153_var; + void *_tmp_154_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_153_var = _tmp_153_rule(p)) // ')' | '**' + (_tmp_154_var = _tmp_154_rule(p)) // ')' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_153_var); + D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_154_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (')' | '**')")); } _res = NULL; @@ -24130,9 +24202,9 @@ _tmp_136_rule(Parser *p) return _res; } -// _tmp_137: ':' | ',' (':' | '**') +// _tmp_138: ':' | ',' (':' | '**') static void * -_tmp_137_rule(Parser *p) +_tmp_138_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24146,18 +24218,18 @@ _tmp_137_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // ',' (':' | '**') @@ -24165,21 +24237,21 @@ _tmp_137_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); Token * _literal; - void *_tmp_154_var; + void *_tmp_155_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_154_var = _tmp_154_rule(p)) // ':' | '**' + (_tmp_155_var = _tmp_155_rule(p)) // ':' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_154_var); + D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_155_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (':' | '**')")); } _res = NULL; @@ -24188,9 +24260,9 @@ _tmp_137_rule(Parser *p) return _res; } -// _tmp_138: star_targets '=' +// _tmp_139: star_targets '=' static void * -_tmp_138_rule(Parser *p) +_tmp_139_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24204,7 +24276,7 @@ _tmp_138_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty z; if ( @@ -24213,7 +24285,7 @@ _tmp_138_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24223,7 +24295,7 @@ _tmp_138_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24232,9 +24304,9 @@ _tmp_138_rule(Parser *p) return _res; } -// _tmp_139: '.' | '...' +// _tmp_140: '.' | '...' static void * -_tmp_139_rule(Parser *p) +_tmp_140_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24248,18 +24320,18 @@ _tmp_139_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -24267,18 +24339,18 @@ _tmp_139_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -24287,9 +24359,9 @@ _tmp_139_rule(Parser *p) return _res; } -// _tmp_140: '.' | '...' +// _tmp_141: '.' | '...' static void * -_tmp_140_rule(Parser *p) +_tmp_141_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24303,18 +24375,18 @@ _tmp_140_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -24322,18 +24394,18 @@ _tmp_140_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -24342,9 +24414,9 @@ _tmp_140_rule(Parser *p) return _res; } -// _tmp_141: '@' named_expression NEWLINE +// _tmp_142: '@' named_expression NEWLINE static void * -_tmp_141_rule(Parser *p) +_tmp_142_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24358,7 +24430,7 @@ _tmp_141_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); Token * _literal; expr_ty f; Token * newline_var; @@ -24370,7 +24442,7 @@ _tmp_141_rule(Parser *p) (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); _res = f; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24380,7 +24452,7 @@ _tmp_141_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_142[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); } _res = NULL; @@ -24389,9 +24461,9 @@ _tmp_141_rule(Parser *p) return _res; } -// _tmp_142: ',' star_expression +// _tmp_143: ',' star_expression static void * -_tmp_142_rule(Parser *p) +_tmp_143_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24405,7 +24477,7 @@ _tmp_142_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); Token * _literal; expr_ty c; if ( @@ -24414,7 +24486,7 @@ _tmp_142_rule(Parser *p) (c = star_expression_rule(p)) // star_expression ) { - D(fprintf(stderr, "%*c+ _tmp_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24424,7 +24496,7 @@ _tmp_142_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_142[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } _res = NULL; @@ -24433,9 +24505,9 @@ _tmp_142_rule(Parser *p) return _res; } -// _tmp_143: ',' expression +// _tmp_144: ',' expression static void * -_tmp_143_rule(Parser *p) +_tmp_144_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24449,7 +24521,7 @@ _tmp_143_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty c; if ( @@ -24458,7 +24530,7 @@ _tmp_143_rule(Parser *p) (c = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24468,7 +24540,7 @@ _tmp_143_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -24477,9 +24549,9 @@ _tmp_143_rule(Parser *p) return _res; } -// _tmp_144: 'or' conjunction +// _tmp_145: 'or' conjunction static void * -_tmp_144_rule(Parser *p) +_tmp_145_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24493,7 +24565,7 @@ _tmp_144_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); Token * _keyword; expr_ty c; if ( @@ -24502,7 +24574,7 @@ _tmp_144_rule(Parser *p) (c = conjunction_rule(p)) // conjunction ) { - D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24512,7 +24584,7 @@ _tmp_144_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); } _res = NULL; @@ -24521,9 +24593,9 @@ _tmp_144_rule(Parser *p) return _res; } -// _tmp_145: 'and' inversion +// _tmp_146: 'and' inversion static void * -_tmp_145_rule(Parser *p) +_tmp_146_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24537,7 +24609,7 @@ _tmp_145_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); Token * _keyword; expr_ty c; if ( @@ -24546,7 +24618,7 @@ _tmp_145_rule(Parser *p) (c = inversion_rule(p)) // inversion ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24556,7 +24628,7 @@ _tmp_145_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); } _res = NULL; @@ -24565,9 +24637,9 @@ _tmp_145_rule(Parser *p) return _res; } -// _tmp_146: 'if' disjunction +// _tmp_147: 'if' disjunction static void * -_tmp_146_rule(Parser *p) +_tmp_147_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24581,7 +24653,7 @@ _tmp_146_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -24590,7 +24662,7 @@ _tmp_146_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24600,7 +24672,7 @@ _tmp_146_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -24609,9 +24681,9 @@ _tmp_146_rule(Parser *p) return _res; } -// _tmp_147: 'if' disjunction +// _tmp_148: 'if' disjunction static void * -_tmp_147_rule(Parser *p) +_tmp_148_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24625,7 +24697,7 @@ _tmp_147_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -24634,7 +24706,7 @@ _tmp_147_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24644,7 +24716,7 @@ _tmp_147_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -24653,9 +24725,9 @@ _tmp_147_rule(Parser *p) return _res; } -// _tmp_148: starred_expression | named_expression !'=' +// _tmp_149: starred_expression | named_expression !'=' static void * -_tmp_148_rule(Parser *p) +_tmp_149_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24669,18 +24741,18 @@ _tmp_148_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } { // named_expression !'=' @@ -24688,7 +24760,7 @@ _tmp_148_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); expr_ty named_expression_var; if ( (named_expression_var = named_expression_rule(p)) // named_expression @@ -24696,12 +24768,12 @@ _tmp_148_rule(Parser *p) _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); _res = named_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression !'='")); } _res = NULL; @@ -24710,9 +24782,9 @@ _tmp_148_rule(Parser *p) return _res; } -// _tmp_149: ',' star_target +// _tmp_150: ',' star_target static void * -_tmp_149_rule(Parser *p) +_tmp_150_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24726,7 +24798,7 @@ _tmp_149_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -24735,7 +24807,7 @@ _tmp_149_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24745,7 +24817,7 @@ _tmp_149_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -24754,9 +24826,9 @@ _tmp_149_rule(Parser *p) return _res; } -// _tmp_150: ',' star_target +// _tmp_151: ',' star_target static void * -_tmp_150_rule(Parser *p) +_tmp_151_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24770,7 +24842,7 @@ _tmp_150_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -24779,7 +24851,7 @@ _tmp_150_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24789,7 +24861,7 @@ _tmp_150_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -24798,9 +24870,9 @@ _tmp_150_rule(Parser *p) return _res; } -// _tmp_151: star_targets '=' +// _tmp_152: star_targets '=' static void * -_tmp_151_rule(Parser *p) +_tmp_152_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24814,7 +24886,7 @@ _tmp_151_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -24823,12 +24895,12 @@ _tmp_151_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24837,9 +24909,9 @@ _tmp_151_rule(Parser *p) return _res; } -// _tmp_152: star_targets '=' +// _tmp_153: star_targets '=' static void * -_tmp_152_rule(Parser *p) +_tmp_153_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24853,7 +24925,7 @@ _tmp_152_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -24862,12 +24934,12 @@ _tmp_152_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24876,9 +24948,9 @@ _tmp_152_rule(Parser *p) return _res; } -// _tmp_153: ')' | '**' +// _tmp_154: ')' | '**' static void * -_tmp_153_rule(Parser *p) +_tmp_154_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24892,18 +24964,18 @@ _tmp_153_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // '**' @@ -24911,18 +24983,18 @@ _tmp_153_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -24931,9 +25003,9 @@ _tmp_153_rule(Parser *p) return _res; } -// _tmp_154: ':' | '**' +// _tmp_155: ':' | '**' static void * -_tmp_154_rule(Parser *p) +_tmp_155_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24947,18 +25019,18 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '**' @@ -24966,18 +25038,18 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; From 22fcd7879da56397d5020db619b4543792ba6310 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 31 Jan 2021 22:55:48 +0000 Subject: [PATCH 1098/1261] bpo-42927: Update the What's new entry for LOAD_ATTR optimizations (GH-24383) --- Doc/whatsnew/3.10.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index cf7d1e80758a07..3dccb7c50019b4 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -556,10 +556,10 @@ Optimizations (Contributed by Victor Stinner in :issue:`41006`.) * The ``LOAD_ATTR`` instruction now uses new "per opcode cache" mechanism. It - is about 36% faster now. This makes optimized ``LOAD_ATTR`` instructions the - current most performance attribute access method (faster than slots). - (Contributed by Pablo Galindo and Yury Selivanov in :issue:`42093`, based on - ideas implemented originally in PyPy and MicroPython.) + is about 36% faster now for regular attributes and 44% faster for slots. + (Contributed by Pablo Galindo and Yury Selivanov in :issue:`42093` and Guido + van Rossum in :issue:`42927`, based on ideas implemented originally in PyPy + and MicroPython.) * When building Python with ``--enable-optimizations`` now ``-fno-semantic-interposition`` is added to both the compile and link line. From 4806a64be3cb54cf2fe48ded6ed80434cd68c140 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Mon, 1 Feb 2021 04:29:44 +0100 Subject: [PATCH 1099/1261] bpo-42504: Ensure that get_config_var('MACOSX_DEPLOYMENT_TARGET') is a string (GH-24341) * bpo-42504: Ensure that get_config_var('MACOSX_DEPLOYMENT_TARGET') is a string --- Lib/distutils/spawn.py | 4 ++-- Lib/distutils/tests/test_build_ext.py | 4 ++-- Lib/sysconfig.py | 12 ++++++++++++ Lib/test/test_posix.py | 2 +- .../macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst | 3 +++ setup.py | 2 +- 6 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst diff --git a/Lib/distutils/spawn.py b/Lib/distutils/spawn.py index f50edd2da97100..0d1bd0391e6f11 100644 --- a/Lib/distutils/spawn.py +++ b/Lib/distutils/spawn.py @@ -54,8 +54,8 @@ def spawn(cmd, search_path=1, verbose=0, dry_run=0): global _cfg_target, _cfg_target_split if _cfg_target is None: from distutils import sysconfig - _cfg_target = str(sysconfig.get_config_var( - 'MACOSX_DEPLOYMENT_TARGET') or '') + _cfg_target = sysconfig.get_config_var( + 'MACOSX_DEPLOYMENT_TARGET') or '' if _cfg_target: _cfg_target_split = [int(x) for x in _cfg_target.split('.')] if _cfg_target: diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py index a3055c19840326..90f7bb066917bc 100644 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -456,7 +456,7 @@ def test_deployment_target_higher_ok(self): deptarget = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') if deptarget: # increment the minor version number (i.e. 10.6 -> 10.7) - deptarget = [int(x) for x in str(deptarget).split('.')] + deptarget = [int(x) for x in deptarget.split('.')] deptarget[-1] += 1 deptarget = '.'.join(str(i) for i in deptarget) self._try_compile_deployment_target('<', deptarget) @@ -489,7 +489,7 @@ def _try_compile_deployment_target(self, operator, target): # get the deployment target that the interpreter was built with target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') - target = tuple(map(int, str(target).split('.')[0:2])) + target = tuple(map(int, target.split('.')[0:2])) # format the target value as defined in the Apple # Availability Macros. We can't use the macro names since # at least one value we test with will not exist yet. diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index c1aaf79a677ba2..507c51f7642376 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -18,6 +18,11 @@ 'parse_config_h', ] +# Keys for get_config_var() that are never converted to Python integers. +_ALWAYS_STR = { + 'MACOSX_DEPLOYMENT_TARGET', +} + _INSTALL_SCHEMES = { 'posix_prefix': { 'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}', @@ -252,6 +257,9 @@ def _parse_makefile(filename, vars=None): notdone[n] = v else: try: + if n in _ALWAYS_STR: + raise ValueError + v = int(v) except ValueError: # insert literal `$' @@ -310,6 +318,8 @@ def _parse_makefile(filename, vars=None): notdone[name] = value else: try: + if name in _ALWAYS_STR: + raise ValueError value = int(value) except ValueError: done[name] = value.strip() @@ -472,6 +482,8 @@ def parse_config_h(fp, vars=None): if m: n, v = m.group(1, 2) try: + if n in _ALWAYS_STR: + raise ValueError v = int(v) except ValueError: pass diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 588c86994b4bd2..53a4c5f84d7be8 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1071,7 +1071,7 @@ def test_getgroups(self): if sys.platform == 'darwin': import sysconfig dt = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') or '10.0' - if tuple(int(n) for n in str(dt).split('.')[0:2]) < (10, 6): + if tuple(int(n) for n in dt.split('.')[0:2]) < (10, 6): raise unittest.SkipTest("getgroups(2) is broken prior to 10.6") # 'id -G' and 'os.getgroups()' should return the same diff --git a/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst b/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst new file mode 100644 index 00000000000000..a47776effe905e --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst @@ -0,0 +1,3 @@ +Ensure that the value of +sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') is always a string, +even in when the value is parsable as an integer. diff --git a/setup.py b/setup.py index 8445546c0116ff..c6a4e9bf415068 100644 --- a/setup.py +++ b/setup.py @@ -1072,7 +1072,7 @@ def detect_readline_curses(self): os_release = int(os.uname()[2].split('.')[0]) dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') if (dep_target and - (tuple(int(n) for n in str(dep_target).split('.')[0:2]) + (tuple(int(n) for n in dep_target.split('.')[0:2]) < (10, 5) ) ): os_release = 8 if os_release < 9: From 4432a0f356fdf074abaed17b9737b9b1fc6a73a1 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Mon, 1 Feb 2021 10:42:03 +0000 Subject: [PATCH 1100/1261] bpo-42990: Further refactoring of PyEval_ functions. (GH-24368) * Further refactoring of PyEval_EvalCode and friends. Break into make-frame, and eval-frame parts. * Simplify function vector call using new _PyEval_Vector. * Remove unused internal functions: _PyEval_EvalCodeWithName and _PyEval_EvalCode. * Don't use legacy function PyEval_EvalCodeEx. --- Include/cpython/frameobject.h | 4 +- Include/eval.h | 10 - Include/internal/pycore_ceval.h | 11 +- .../2021-01-30-11-31-44.bpo-42990.69h_zK.rst | 5 + Objects/call.c | 77 +---- Objects/frameobject.c | 51 ++- Objects/funcobject.c | 4 +- Python/bltinmodule.c | 7 +- Python/ceval.c | 323 +++++++++++------- 9 files changed, 247 insertions(+), 245 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst diff --git a/Include/cpython/frameobject.h b/Include/cpython/frameobject.h index f162e2465f3a47..5a19c006d91531 100644 --- a/Include/cpython/frameobject.h +++ b/Include/cpython/frameobject.h @@ -71,8 +71,8 @@ PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, PyObject *, PyObject *); /* only internal use */ -PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, - PyObject *, PyObject *, PyObject *); +PyFrameObject* +_PyFrame_New_NoTrack(PyThreadState *, PyFrameConstructor *, PyObject *); /* The rest of the interface is specific for frame objects */ diff --git a/Include/eval.h b/Include/eval.h index 2c1c2d0549a9a4..eda28df8f65281 100644 --- a/Include/eval.h +++ b/Include/eval.h @@ -18,16 +18,6 @@ PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyObject *co, PyObject *kwdefs, PyObject *closure); #ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyEval_EvalCodeWithName( - PyObject *co, - PyObject *globals, PyObject *locals, - PyObject *const *args, Py_ssize_t argcount, - PyObject *const *kwnames, PyObject *const *kwargs, - Py_ssize_t kwcount, int kwstep, - PyObject *const *defs, Py_ssize_t defcount, - PyObject *kwdefs, PyObject *closure, - PyObject *name, PyObject *qualname); - PyAPI_FUNC(PyObject *) _PyEval_CallTracing(PyObject *func, PyObject *args); #endif diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index a9da8b8f450736..0491d48a789ebf 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -40,12 +40,11 @@ _PyEval_EvalFrame(PyThreadState *tstate, PyFrameObject *f, int throwflag) return tstate->interp->eval_frame(tstate, f, throwflag); } -extern PyObject *_PyEval_EvalCode( - PyThreadState *tstate, - PyFrameConstructor *desc, PyObject *locals, - PyObject *const *args, Py_ssize_t argcount, - PyObject *const *kwnames, PyObject *const *kwargs, - Py_ssize_t kwcount, int kwstep); +extern PyObject * +_PyEval_Vector(PyThreadState *tstate, + PyFrameConstructor *desc, PyObject *locals, + PyObject* const* args, size_t argcount, + PyObject *kwnames); #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp); diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst new file mode 100644 index 00000000000000..8ac39713e116a1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst @@ -0,0 +1,5 @@ +Refactor the ``PyEval_`` family of functions. + +* An new function ``_PyEval_Vector`` is added to simplify calls to Python from C. +* ``_PyEval_EvalCodeWithName`` is removed +* ``PyEval_EvalCodeEx`` is retained as part of the API, but is not used internally diff --git a/Objects/call.c b/Objects/call.c index 7972693918bbbe..960c37e1961f0a 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -328,87 +328,24 @@ PyCFunction_Call(PyObject *callable, PyObject *args, PyObject *kwargs) /* --- PyFunction call functions ---------------------------------- */ -static PyObject* _Py_HOT_FUNCTION -function_code_fastcall(PyThreadState *tstate, PyCodeObject *co, - PyObject *const *args, Py_ssize_t nargs, - PyFunctionObject *func) -{ - assert(tstate != NULL); - assert(func != NULL); - - /* XXX Perhaps we should create a specialized - _PyFrame_New_NoTrack() that doesn't take locals, but does - take builtins without sanity checking them. - */ - PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, func->func_globals, func->func_builtins, NULL); - if (f == NULL) { - return NULL; - } - - PyObject **fastlocals = f->f_localsplus; - - for (Py_ssize_t i = 0; i < nargs; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; - } - PyObject *result = _PyEval_EvalFrame(tstate, f, 0); - - if (Py_REFCNT(f) > 1) { - Py_DECREF(f); - _PyObject_GC_TRACK(f); - } - else { - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - } - return result; -} - - PyObject * _PyFunction_Vectorcall(PyObject *func, PyObject* const* stack, size_t nargsf, PyObject *kwnames) { assert(PyFunction_Check(func)); - assert(kwnames == NULL || PyTuple_CheckExact(kwnames)); - + PyFrameConstructor *f = PyFunction_AS_FRAME_CONSTRUCTOR(func); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); assert(nargs >= 0); - Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); - assert((nargs == 0 && nkwargs == 0) || stack != NULL); - /* kwnames must only contain strings and all keys must be unique */ - PyThreadState *tstate = _PyThreadState_GET(); - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - - if (co->co_kwonlyargcount == 0 && nkwargs == 0 && - (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) - { - if (argdefs == NULL && co->co_argcount == nargs) { - return function_code_fastcall(tstate, co, stack, nargs, (PyFunctionObject *)func); - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == PyTuple_GET_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - stack = _PyTuple_ITEMS(argdefs); - return function_code_fastcall(tstate, co, - stack, PyTuple_GET_SIZE(argdefs), - (PyFunctionObject *)func); - } + assert(nargs == 0 || stack != NULL); + if (((PyCodeObject *)f->fc_code)->co_flags & CO_OPTIMIZED) { + return _PyEval_Vector(tstate, f, NULL, stack, nargs, kwnames); + } + else { + return _PyEval_Vector(tstate, f, f->fc_globals, stack, nargs, kwnames); } - - return _PyEval_EvalCode(tstate, - PyFunction_AS_FRAME_CONSTRUCTOR(func), (PyObject *)NULL, - stack, nargs, - nkwargs ? _PyTuple_ITEMS(kwnames) : NULL, - stack + nargs, - nkwargs, 1); } - /* --- More complex call functions -------------------------------- */ /* External interface to call any callable object. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 45a275bd901240..57105e1a9eb1e0 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -816,11 +816,10 @@ frame_alloc(PyCodeObject *code) PyFrameObject* _Py_HOT_FUNCTION -_PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, - PyObject *globals, PyObject *builtins, PyObject *locals) +_PyFrame_New_NoTrack(PyThreadState *tstate, PyFrameConstructor *con, PyObject *locals) { #ifdef Py_DEBUG - if (code == NULL || globals == NULL || builtins == NULL || + if (con == NULL || con->fc_code == NULL || (locals != NULL && !PyMapping_Check(locals))) { PyErr_BadInternalCall(); return NULL; @@ -829,38 +828,21 @@ _PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, PyFrameObject *back = tstate->frame; - PyFrameObject *f = frame_alloc(code); + PyFrameObject *f = frame_alloc((PyCodeObject *)con->fc_code); if (f == NULL) { return NULL; } f->f_stackdepth = 0; - Py_INCREF(builtins); - f->f_builtins = builtins; + Py_INCREF(con->fc_builtins); + f->f_builtins = con->fc_builtins; Py_XINCREF(back); f->f_back = back; - Py_INCREF(code); - Py_INCREF(globals); - f->f_globals = globals; - /* Most functions have CO_NEWLOCALS and CO_OPTIMIZED set. */ - if ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == - (CO_NEWLOCALS | CO_OPTIMIZED)) - ; /* f_locals = NULL; will be set by PyFrame_FastToLocals() */ - else if (code->co_flags & CO_NEWLOCALS) { - locals = PyDict_New(); - if (locals == NULL) { - Py_DECREF(f); - return NULL; - } - f->f_locals = locals; - } - else { - if (locals == NULL) { - locals = globals; - } - Py_INCREF(locals); - f->f_locals = locals; - } + Py_INCREF(con->fc_code); + Py_INCREF(con->fc_globals); + f->f_globals = con->fc_globals; + Py_XINCREF(locals); + f->f_locals = locals; f->f_lasti = -1; f->f_lineno = 0; @@ -875,12 +857,23 @@ _PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, return f; } +/* Legacy API */ PyFrameObject* PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals, PyObject *locals) { PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); - PyFrameObject *f = _PyFrame_New_NoTrack(tstate, code, globals, builtins, locals); + PyFrameConstructor desc = { + .fc_globals = globals, + .fc_builtins = builtins, + .fc_name = code->co_name, + .fc_qualname = code->co_name, + .fc_code = (PyObject *)code, + .fc_defaults = NULL, + .fc_kwdefaults = NULL, + .fc_closure = NULL + }; + PyFrameObject *f = _PyFrame_New_NoTrack(tstate, &desc, locals); Py_DECREF(builtins); if (f) _PyObject_GC_TRACK(f); diff --git a/Objects/funcobject.c b/Objects/funcobject.c index f839d7b429e0bc..b331c4c4d6e351 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -575,9 +575,9 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals, newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code, globals); - if (newfunc == NULL) + if (newfunc == NULL) { return NULL; - + } if (name != Py_None) { Py_INCREF(name); Py_SETREF(newfunc->func_name, name); diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 352fb83d55e053..8c4e6e5107f9e0 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -8,6 +8,7 @@ #include "pycore_pyerrors.h" // _PyErr_NoMemory() #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tuple.h" // _PyTuple_FromArray() +#include "pycore_ceval.h" // _PyEval_Vector() _Py_IDENTIFIER(__builtins__); _Py_IDENTIFIER(__dict__); @@ -219,9 +220,9 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, Py_TYPE(ns)->tp_name); goto error; } - cell = PyEval_EvalCodeEx(PyFunction_GET_CODE(func), PyFunction_GET_GLOBALS(func), ns, - NULL, 0, NULL, 0, NULL, 0, NULL, - PyFunction_GET_CLOSURE(func)); + PyFrameConstructor *f = PyFunction_AS_FRAME_CONSTRUCTOR(func); + PyThreadState *tstate = PyThreadState_GET(); + cell = _PyEval_Vector(tstate, f, ns, NULL, 0, NULL); if (cell != NULL) { if (bases != orig_bases) { if (PyMapping_SetItemString(ns, "__orig_bases__", orig_bases) < 0) { diff --git a/Python/ceval.c b/Python/ceval.c index 3aa2aa2c9bc198..3b67a6b79bfb76 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -890,12 +890,27 @@ static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **); PyObject * PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) { - return PyEval_EvalCodeEx(co, - globals, locals, - (PyObject **)NULL, 0, - (PyObject **)NULL, 0, - (PyObject **)NULL, 0, - NULL, NULL); + if (locals == NULL) { + locals = globals; + } + PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); + if (builtins == NULL) { + return NULL; + } + PyFrameConstructor desc = { + .fc_globals = globals, + .fc_builtins = builtins, + .fc_name = ((PyCodeObject *)co)->co_name, + .fc_qualname = ((PyCodeObject *)co)->co_name, + .fc_code = co, + .fc_defaults = NULL, + .fc_kwdefaults = NULL, + .fc_closure = NULL + }; + PyThreadState *tstate = PyThreadState_GET(); + PyObject *res =_PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL); + Py_DECREF(builtins); + return res; } @@ -4343,7 +4358,7 @@ too_many_positional(PyThreadState *tstate, PyCodeObject *co, static int positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co, - Py_ssize_t kwcount, PyObject* const* kwnames, + Py_ssize_t kwcount, PyObject* kwnames, PyObject *qualname) { int posonly_conflicts = 0; @@ -4354,7 +4369,7 @@ positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co, for (int k2=0; k2fc_code; assert(con->fc_defaults == NULL || PyTuple_CheckExact(con->fc_defaults)); - PyObject *retval = NULL; const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount; /* Create the frame */ - PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, con->fc_globals, con->fc_builtins, locals); + PyFrameObject *f = _PyFrame_New_NoTrack(tstate, con, locals); if (f == NULL) { return NULL; } @@ -4469,74 +4479,76 @@ _PyEval_EvalCode(PyThreadState *tstate, SETLOCAL(total_args, u); } - /* Handle keyword arguments passed as two strided arrays */ - kwcount *= kwstep; - for (i = 0; i < kwcount; i += kwstep) { - PyObject **co_varnames; - PyObject *keyword = kwnames[i]; - PyObject *value = kwargs[i]; - Py_ssize_t j; + /* Handle keyword arguments */ + if (kwnames != NULL) { + Py_ssize_t kwcount = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < kwcount; i++) { + PyObject **co_varnames; + PyObject *keyword = PyTuple_GET_ITEM(kwnames, i); + PyObject *value = args[i+argcount]; + Py_ssize_t j; - if (keyword == NULL || !PyUnicode_Check(keyword)) { - _PyErr_Format(tstate, PyExc_TypeError, - "%U() keywords must be strings", + if (keyword == NULL || !PyUnicode_Check(keyword)) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U() keywords must be strings", con->fc_qualname); - goto fail; - } - - /* Speed hack: do raw pointer compares. As names are - normally interned this should almost always hit. */ - co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item; - for (j = co->co_posonlyargcount; j < total_args; j++) { - PyObject *varname = co_varnames[j]; - if (varname == keyword) { - goto kw_found; + goto fail; } - } - /* Slow fallback, just in case */ - for (j = co->co_posonlyargcount; j < total_args; j++) { - PyObject *varname = co_varnames[j]; - int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ); - if (cmp > 0) { - goto kw_found; + /* Speed hack: do raw pointer compares. As names are + normally interned this should almost always hit. */ + co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item; + for (j = co->co_posonlyargcount; j < total_args; j++) { + PyObject *varname = co_varnames[j]; + if (varname == keyword) { + goto kw_found; + } } - else if (cmp < 0) { - goto fail; + + /* Slow fallback, just in case */ + for (j = co->co_posonlyargcount; j < total_args; j++) { + PyObject *varname = co_varnames[j]; + int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ); + if (cmp > 0) { + goto kw_found; + } + else if (cmp < 0) { + goto fail; + } } - } - assert(j >= total_args); - if (kwdict == NULL) { + assert(j >= total_args); + if (kwdict == NULL) { - if (co->co_posonlyargcount - && positional_only_passed_as_keyword(tstate, co, - kwcount, kwnames, + if (co->co_posonlyargcount + && positional_only_passed_as_keyword(tstate, co, + kwcount, kwnames, con->fc_qualname)) - { - goto fail; - } + { + goto fail; + } - _PyErr_Format(tstate, PyExc_TypeError, - "%U() got an unexpected keyword argument '%S'", + _PyErr_Format(tstate, PyExc_TypeError, + "%U() got an unexpected keyword argument '%S'", con->fc_qualname, keyword); - goto fail; - } + goto fail; + } - if (PyDict_SetItem(kwdict, keyword, value) == -1) { - goto fail; - } - continue; + if (PyDict_SetItem(kwdict, keyword, value) == -1) { + goto fail; + } + continue; - kw_found: - if (GETLOCAL(j) != NULL) { - _PyErr_Format(tstate, PyExc_TypeError, - "%U() got multiple values for argument '%S'", + kw_found: + if (GETLOCAL(j) != NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U() got multiple values for argument '%S'", con->fc_qualname, keyword); - goto fail; + goto fail; + } + Py_INCREF(value); + SETLOCAL(j, value); } - Py_INCREF(value); - SETLOCAL(j, value); } /* Check the number of positional arguments */ @@ -4631,36 +4643,71 @@ _PyEval_EvalCode(PyThreadState *tstate, freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o; } - /* Handle generator/coroutine/asynchronous generator */ - if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) { - PyObject *gen; - int is_coro = co->co_flags & CO_COROUTINE; + return f; + +fail: /* Jump here from prelude on failure */ + + /* decref'ing the frame can cause __del__ methods to get invoked, + which can call back into Python. While we're done with the + current Python frame (f), the associated C stack is still in use, + so recursion_depth must be boosted for the duration. + */ + if (Py_REFCNT(f) > 1) { + Py_DECREF(f); + _PyObject_GC_TRACK(f); + } + else { + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + } + return NULL; +} + +static PyObject * +make_coro(PyFrameConstructor *con, PyFrameObject *f) +{ + assert (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)); + PyObject *gen; + int is_coro = ((PyCodeObject *)con->fc_code)->co_flags & CO_COROUTINE; - /* Don't need to keep the reference to f_back, it will be set - * when the generator is resumed. */ - Py_CLEAR(f->f_back); + /* Don't need to keep the reference to f_back, it will be set + * when the generator is resumed. */ + Py_CLEAR(f->f_back); - /* Create a new generator that owns the ready to run frame - * and return that as the value. */ - if (is_coro) { + /* Create a new generator that owns the ready to run frame + * and return that as the value. */ + if (is_coro) { gen = PyCoro_New(f, con->fc_name, con->fc_qualname); - } else if (co->co_flags & CO_ASYNC_GENERATOR) { + } else if (((PyCodeObject *)con->fc_code)->co_flags & CO_ASYNC_GENERATOR) { gen = PyAsyncGen_New(f, con->fc_name, con->fc_qualname); - } else { + } else { gen = PyGen_NewWithQualName(f, con->fc_name, con->fc_qualname); - } - if (gen == NULL) { - return NULL; - } - - _PyObject_GC_TRACK(f); - - return gen; + } + if (gen == NULL) { + return NULL; } - retval = _PyEval_EvalFrame(tstate, f, 0); + _PyObject_GC_TRACK(f); -fail: /* Jump here from prelude on failure */ + return gen; +} + +PyObject * +_PyEval_Vector(PyThreadState *tstate, PyFrameConstructor *con, + PyObject *locals, + PyObject* const* args, size_t argcount, + PyObject *kwnames) +{ + PyFrameObject *f = _PyEval_MakeFrameVector( + tstate, con, locals, args, argcount, kwnames); + if (f == NULL) { + return NULL; + } + if (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) { + return make_coro(con, f); + } + PyObject *retval = _PyEval_EvalFrame(tstate, f, 0); /* decref'ing the frame can cause __del__ methods to get invoked, which can call back into Python. While we're done with the @@ -4681,14 +4728,13 @@ _PyEval_EvalCode(PyThreadState *tstate, /* Legacy API */ PyObject * -_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, - PyObject *const *args, Py_ssize_t argcount, - PyObject *const *kwnames, PyObject *const *kwargs, - Py_ssize_t kwcount, int kwstep, - PyObject *const *defs, Py_ssize_t defcount, - PyObject *kwdefs, PyObject *closure, - PyObject *name, PyObject *qualname) +PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, + PyObject *const *args, int argcount, + PyObject *const *kws, int kwcount, + PyObject *const *defs, int defcount, + PyObject *kwdefs, PyObject *closure) { + PyObject *res; PyObject *defaults = _PyTuple_FromArray(defs, defcount); if (defaults == NULL) { return NULL; @@ -4698,44 +4744,75 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, Py_DECREF(defaults); return NULL; } + PyCodeObject *code = (PyCodeObject *)_co; + assert ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == 0); + if (locals == NULL) { + locals = globals; + } + PyObject *kwnames; + PyObject *const *allargs; + PyObject **newargs; + if (kwcount == 0) { + allargs = args; + kwnames = NULL; + } + else { + kwnames = PyTuple_New(kwcount); + if (kwnames == NULL) { + res = NULL; + goto fail; + } + newargs = PyMem_Malloc(sizeof(PyObject *)*(kwcount+argcount)); + if (newargs == NULL) { + res = NULL; + Py_DECREF(kwnames); + goto fail; + } + for (int i = 0; i < argcount; i++) { + newargs[i] = args[i]; + } + for (int i = 0; i < kwcount; i++) { + Py_INCREF(kws[2*i]); + PyTuple_SET_ITEM(kwnames, i, kws[2*i]); + newargs[argcount+i] = kws[2*i+1]; + } + allargs = newargs; + } + PyObject **kwargs = PyMem_Malloc(sizeof(PyObject *)*kwcount); + if (kwargs == NULL) { + res = NULL; + Py_DECREF(kwnames); + goto fail; + } + for (int i = 0; i < kwcount; i++) { + Py_INCREF(kws[2*i]); + PyTuple_SET_ITEM(kwnames, i, kws[2*i]); + kwargs[i] = kws[2*i+1]; + } PyFrameConstructor constr = { .fc_globals = globals, .fc_builtins = builtins, - .fc_name = name, - .fc_qualname = qualname, + .fc_name = ((PyCodeObject *)_co)->co_name, + .fc_qualname = ((PyCodeObject *)_co)->co_name, .fc_code = _co, .fc_defaults = defaults, .fc_kwdefaults = kwdefs, .fc_closure = closure }; PyThreadState *tstate = _PyThreadState_GET(); - PyObject *res = _PyEval_EvalCode(tstate, &constr, locals, - args, argcount, - kwnames, kwargs, - kwcount, kwstep); + res = _PyEval_Vector(tstate, &constr, locals, + allargs, argcount, + kwnames); + if (kwcount) { + Py_DECREF(kwnames); + PyMem_Free(newargs); + } +fail: Py_DECREF(defaults); Py_DECREF(builtins); return res; } -/* Legacy API */ -PyObject * -PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, - PyObject *const *args, int argcount, - PyObject *const *kws, int kwcount, - PyObject *const *defs, int defcount, - PyObject *kwdefs, PyObject *closure) -{ - return _PyEval_EvalCodeWithName( - _co, globals, locals, - args, argcount, - kws, kws != NULL ? kws + 1 : NULL, - kwcount, 2, - defs, defcount, - kwdefs, closure, - ((PyCodeObject *)_co)->co_name, - ((PyCodeObject *)_co)->co_name); -} static PyObject * special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id) From 346562924461909888c4b524434dd24589fe5919 Mon Sep 17 00:00:00 2001 From: Yonatan Goldschmidt Date: Mon, 1 Feb 2021 17:46:38 +0200 Subject: [PATCH 1101/1261] Fix typo in Lib/trace.py (GH-24309) --- Lib/trace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/trace.py b/Lib/trace.py index c505d8bc72a98c..2cf3643878d4b8 100755 --- a/Lib/trace.py +++ b/Lib/trace.py @@ -116,7 +116,7 @@ def names(self, filename, modulename): return 0 def _modname(path): - """Return a plausible module name for the patch.""" + """Return a plausible module name for the path.""" base = os.path.basename(path) filename, ext = os.path.splitext(base) From ffa14829dad9498353a1389d8f7b1d701449dfb0 Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Tue, 2 Feb 2021 00:26:56 +0800 Subject: [PATCH 1102/1261] bpo-42834: Fix _json internal caches for subinterpreters (GH-24121) Make internal caches of the _json extension module compatible with subinterpreters. --- .../2021-01-05-23-55-24.bpo-42834.LxRnZC.rst | 1 + Modules/_json.c | 77 ++++++++++--------- 2 files changed, 40 insertions(+), 38 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst diff --git a/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst b/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst new file mode 100644 index 00000000000000..9e63a7e76062aa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst @@ -0,0 +1 @@ +Make internal caches of the ``_json`` module compatible with subinterpreters. diff --git a/Modules/_json.c b/Modules/_json.c index faa3944eedd74c..e10f83c96c565f 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -79,7 +79,6 @@ static PyObject * ascii_escape_unicode(PyObject *pystr); static PyObject * py_encode_basestring_ascii(PyObject* Py_UNUSED(self), PyObject *pystr); -void init_json(void); static PyObject * scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr); static PyObject * @@ -317,18 +316,22 @@ static void raise_errmsg(const char *msg, PyObject *s, Py_ssize_t end) { /* Use JSONDecodeError exception to raise a nice looking ValueError subclass */ - static PyObject *JSONDecodeError = NULL; - PyObject *exc; + _Py_static_string(PyId_decoder, "json.decoder"); + PyObject *decoder = _PyImport_GetModuleId(&PyId_decoder); + if (decoder == NULL) { + return; + } + + _Py_IDENTIFIER(JSONDecodeError); + PyObject *JSONDecodeError = _PyObject_GetAttrId(decoder, &PyId_JSONDecodeError); + Py_DECREF(decoder); if (JSONDecodeError == NULL) { - PyObject *decoder = PyImport_ImportModule("json.decoder"); - if (decoder == NULL) - return; - JSONDecodeError = PyObject_GetAttrString(decoder, "JSONDecodeError"); - Py_DECREF(decoder); - if (JSONDecodeError == NULL) - return; + return; } + + PyObject *exc; exc = PyObject_CallFunction(JSONDecodeError, "zOn", msg, s, end); + Py_DECREF(JSONDecodeError); if (exc) { PyErr_SetObject(JSONDecodeError, exc); Py_DECREF(exc); @@ -1308,28 +1311,28 @@ _encoded_const(PyObject *obj) { /* Return the JSON string representation of None, True, False */ if (obj == Py_None) { - static PyObject *s_null = NULL; + _Py_static_string(PyId_null, "null"); + PyObject *s_null = _PyUnicode_FromId(&PyId_null); if (s_null == NULL) { - s_null = PyUnicode_InternFromString("null"); + return NULL; } - Py_XINCREF(s_null); - return s_null; + return Py_NewRef(s_null); } else if (obj == Py_True) { - static PyObject *s_true = NULL; + _Py_static_string(PyId_true, "true"); + PyObject *s_true = _PyUnicode_FromId(&PyId_true); if (s_true == NULL) { - s_true = PyUnicode_InternFromString("true"); + return NULL; } - Py_XINCREF(s_true); - return s_true; + return Py_NewRef(s_true); } else if (obj == Py_False) { - static PyObject *s_false = NULL; + _Py_static_string(PyId_false, "false"); + PyObject *s_false = _PyUnicode_FromId(&PyId_false); if (s_false == NULL) { - s_false = PyUnicode_InternFromString("false"); + return NULL; } - Py_XINCREF(s_false); - return s_false; + return Py_NewRef(s_false); } else { PyErr_SetString(PyExc_ValueError, "not a const"); @@ -1493,9 +1496,12 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc, PyObject *dct, Py_ssize_t indent_level) { /* Encode Python dict dct a JSON term */ - static PyObject *open_dict = NULL; - static PyObject *close_dict = NULL; - static PyObject *empty_dict = NULL; + _Py_static_string(PyId_open_dict, "{"); + _Py_static_string(PyId_close_dict, "}"); + _Py_static_string(PyId_empty_dict, "{}"); + PyObject *open_dict = _PyUnicode_FromId(&PyId_open_dict); // borrowed ref + PyObject *close_dict = _PyUnicode_FromId(&PyId_close_dict); // borrowed ref + PyObject *empty_dict = _PyUnicode_FromId(&PyId_empty_dict); // borrowed ref PyObject *kstr = NULL; PyObject *ident = NULL; PyObject *it = NULL; @@ -1504,11 +1510,7 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc, Py_ssize_t idx; if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) { - open_dict = PyUnicode_InternFromString("{"); - close_dict = PyUnicode_InternFromString("}"); - empty_dict = PyUnicode_InternFromString("{}"); - if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) - return -1; + return -1; } if (PyDict_GET_SIZE(dct) == 0) /* Fast path */ return _PyAccu_Accumulate(acc, empty_dict); @@ -1650,19 +1652,18 @@ encoder_listencode_list(PyEncoderObject *s, _PyAccu *acc, PyObject *seq, Py_ssize_t indent_level) { /* Encode Python list seq to a JSON term */ - static PyObject *open_array = NULL; - static PyObject *close_array = NULL; - static PyObject *empty_array = NULL; + _Py_static_string(PyId_open_array, "["); + _Py_static_string(PyId_close_array, "]"); + _Py_static_string(PyId_empty_array, "[]"); + PyObject *open_array = _PyUnicode_FromId(&PyId_open_array); // borrowed ref + PyObject *close_array = _PyUnicode_FromId(&PyId_close_array); // borrowed ref + PyObject *empty_array = _PyUnicode_FromId(&PyId_empty_array); // borrowed ref PyObject *ident = NULL; PyObject *s_fast = NULL; Py_ssize_t i; if (open_array == NULL || close_array == NULL || empty_array == NULL) { - open_array = PyUnicode_InternFromString("["); - close_array = PyUnicode_InternFromString("]"); - empty_array = PyUnicode_InternFromString("[]"); - if (open_array == NULL || close_array == NULL || empty_array == NULL) - return -1; + return -1; } ident = NULL; s_fast = PySequence_Fast(seq, "_iterencode_list needs a sequence"); From d01ddfd91c1d3025a2b8ce63cc84655367eebbae Mon Sep 17 00:00:00 2001 From: Aviral Srivastava Date: Mon, 1 Feb 2021 09:38:44 -0800 Subject: [PATCH 1103/1261] bpo-38307: Add end_lineno attribute to pyclbr Objects (GH-24348) For back-compatibility, make the new constructor parameter for public classes Function and Class keyword-only with a default of None. Co-authored-by: Aviral Srivastava --- Doc/whatsnew/3.10.rst | 8 ++++ Lib/idlelib/idle_test/test_browser.py | 18 ++++----- Lib/pyclbr.py | 40 ++++++++++++------- Lib/test/test_pyclbr.py | 22 +++++----- .../2020-03-16-03-03-21.bpo-38307.2cmw2i.rst | 3 ++ 5 files changed, 56 insertions(+), 35 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 3dccb7c50019b4..d80ceeca85a895 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -435,6 +435,14 @@ py_compile Added ``--quiet`` option to command-line interface of :mod:`py_compile`. (Contributed by Gregory Schevchenko in :issue:`38731`.) +pyclbr +------ + +Added an ``end_lineno`` attribute to the ``Function`` and ``Class`` +objects in the tree returned by :func:`pyclbr.readline` and +:func:`pyclbr.readline_ex`. It matches the existing (start) ``lineno``. +(Contributed by Aviral Srivastava in :issue:`38307`.) + shelve ------ diff --git a/Lib/idlelib/idle_test/test_browser.py b/Lib/idlelib/idle_test/test_browser.py index 25d6dc6630364b..03a50f22ca1e82 100644 --- a/Lib/idlelib/idle_test/test_browser.py +++ b/Lib/idlelib/idle_test/test_browser.py @@ -61,15 +61,15 @@ def test_close(self): # Nested tree same as in test_pyclbr.py except for supers on C0. C1. mb = pyclbr module, fname = 'test', 'test.py' -C0 = mb.Class(module, 'C0', ['base'], fname, 1) -F1 = mb._nest_function(C0, 'F1', 3) -C1 = mb._nest_class(C0, 'C1', 6, ['']) -C2 = mb._nest_class(C1, 'C2', 7) -F3 = mb._nest_function(C2, 'F3', 9) -f0 = mb.Function(module, 'f0', fname, 11) -f1 = mb._nest_function(f0, 'f1', 12) -f2 = mb._nest_function(f1, 'f2', 13) -c1 = mb._nest_class(f0, 'c1', 15) +C0 = mb.Class(module, 'C0', ['base'], fname, 1, end_lineno=9) +F1 = mb._nest_function(C0, 'F1', 3, 5) +C1 = mb._nest_class(C0, 'C1', 6, 9, ['']) +C2 = mb._nest_class(C1, 'C2', 7, 9) +F3 = mb._nest_function(C2, 'F3', 9, 9) +f0 = mb.Function(module, 'f0', fname, 11, end_lineno=15) +f1 = mb._nest_function(f0, 'f1', 12, 14) +f2 = mb._nest_function(f1, 'f2', 13, 13) +c1 = mb._nest_class(f0, 'c1', 15, 15) mock_pyclbr_tree = {'C0': C0, 'f0': f0} # Adjust C0.name, C1.name so tests do not depend on order. diff --git a/Lib/pyclbr.py b/Lib/pyclbr.py index f0c8381946c614..ebcc23c29da215 100644 --- a/Lib/pyclbr.py +++ b/Lib/pyclbr.py @@ -21,6 +21,7 @@ name -- name of the object; file -- file in which the object is defined; lineno -- line in the file where the object's definition starts; + end_lineno -- line in the file where the object's definition ends; parent -- parent of this object, if any; children -- nested objects contained in this object. The 'children' attribute is a dictionary mapping names to objects. @@ -52,40 +53,50 @@ class _Object: "Information about Python class or function." - def __init__(self, module, name, file, lineno, parent): + def __init__(self, module, name, file, lineno, end_lineno, parent): self.module = module self.name = name self.file = file self.lineno = lineno + self.end_lineno = end_lineno self.parent = parent self.children = {} if parent is not None: parent.children[name] = self + +# Odd Function and Class signatures are for back-compatibility. class Function(_Object): "Information about a Python function, including methods." - def __init__(self, module, name, file, lineno, parent=None, is_async=False): - super().__init__(module, name, file, lineno, parent) + def __init__(self, module, name, file, lineno, + parent=None, is_async=False, *, end_lineno=None): + super().__init__(module, name, file, lineno, end_lineno, parent) self.is_async = is_async if isinstance(parent, Class): parent.methods[name] = lineno + class Class(_Object): "Information about a Python class." - def __init__(self, module, name, super_, file, lineno, parent=None): - super().__init__(module, name, file, lineno, parent) + def __init__(self, module, name, super_, file, lineno, + parent=None, *, end_lineno=None): + super().__init__(module, name, file, lineno, end_lineno, parent) self.super = super_ or [] self.methods = {} + # These 2 functions are used in these tests # Lib/test/test_pyclbr, Lib/idlelib/idle_test/test_browser.py -def _nest_function(ob, func_name, lineno, is_async=False): +def _nest_function(ob, func_name, lineno, end_lineno, is_async=False): "Return a Function after nesting within ob." - return Function(ob.module, func_name, ob.file, lineno, ob, is_async) + return Function(ob.module, func_name, ob.file, lineno, + parent=ob, is_async=is_async, end_lineno=end_lineno) -def _nest_class(ob, class_name, lineno, super=None): +def _nest_class(ob, class_name, lineno, end_lineno, super=None): "Return a Class after nesting within ob." - return Class(ob.module, class_name, super, ob.file, lineno, ob) + return Class(ob.module, class_name, super, ob.file, lineno, + parent=ob, end_lineno=end_lineno) + def readmodule(module, path=None): """Return Class objects for the top-level classes in module. @@ -108,6 +119,7 @@ def readmodule_ex(module, path=None): """ return _readmodule(module, path or []) + def _readmodule(module, path, inpackage=None): """Do the hard work for readmodule[_ex]. @@ -198,9 +210,8 @@ def visit_ClassDef(self, node): bases.append(name) parent = self.stack[-1] if self.stack else None - class_ = Class( - self.module, node.name, bases, self.file, node.lineno, parent - ) + class_ = Class(self.module, node.name, bases, self.file, node.lineno, + parent=parent, end_lineno=node.end_lineno) if parent is None: self.tree[node.name] = class_ self.stack.append(class_) @@ -209,9 +220,8 @@ def visit_ClassDef(self, node): def visit_FunctionDef(self, node, *, is_async=False): parent = self.stack[-1] if self.stack else None - function = Function( - self.module, node.name, self.file, node.lineno, parent, is_async - ) + function = Function(self.module, node.name, self.file, node.lineno, + parent, is_async, end_lineno=node.end_lineno) if parent is None: self.tree[node.name] = function self.stack.append(function) diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index 2c7afa994f3058..82c1ebb5b070fa 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -176,15 +176,15 @@ def F3(): return 1+1 actual = mb._create_tree(m, p, f, source, t, i) # Create descriptors, linked together, and expected dict. - f0 = mb.Function(m, 'f0', f, 1) - f1 = mb._nest_function(f0, 'f1', 2) - f2 = mb._nest_function(f1, 'f2', 3) - c1 = mb._nest_class(f0, 'c1', 5) - C0 = mb.Class(m, 'C0', None, f, 6) - F1 = mb._nest_function(C0, 'F1', 8) - C1 = mb._nest_class(C0, 'C1', 11) - C2 = mb._nest_class(C1, 'C2', 12) - F3 = mb._nest_function(C2, 'F3', 14) + f0 = mb.Function(m, 'f0', f, 1, end_lineno=5) + f1 = mb._nest_function(f0, 'f1', 2, 4) + f2 = mb._nest_function(f1, 'f2', 3, 3) + c1 = mb._nest_class(f0, 'c1', 5, 5) + C0 = mb.Class(m, 'C0', None, f, 6, end_lineno=14) + F1 = mb._nest_function(C0, 'F1', 8, 10) + C1 = mb._nest_class(C0, 'C1', 11, 14) + C2 = mb._nest_class(C1, 'C2', 12, 14) + F3 = mb._nest_function(C2, 'F3', 14, 14) expected = {'f0':f0, 'C0':C0} def compare(parent1, children1, parent2, children2): @@ -203,8 +203,8 @@ def compare(parent1, children1, parent2, children2): self.assertIs(ob.parent, parent2) for key in children1.keys(): o1, o2 = children1[key], children2[key] - t1 = type(o1), o1.name, o1.file, o1.module, o1.lineno - t2 = type(o2), o2.name, o2.file, o2.module, o2.lineno + t1 = type(o1), o1.name, o1.file, o1.module, o1.lineno, o1.end_lineno + t2 = type(o2), o2.name, o2.file, o2.module, o2.lineno, o2.end_lineno self.assertEqual(t1, t2) if type(o1) is mb.Class: self.assertEqual(o1.methods, o2.methods) diff --git a/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst b/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst new file mode 100644 index 00000000000000..358089915fb6c4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst @@ -0,0 +1,3 @@ +Add an 'end_lineno' attribute to the Class and Function objects that appear in the +tree returned by pyclbr functions. This and the existing 'lineno' +attribute define the extent of class and def statements. Patch by Aviral Srivastava. From 25eb657bd1fe76a3e3dc344e5bcbfa595655cc48 Mon Sep 17 00:00:00 2001 From: Karl Dubost Date: Tue, 2 Feb 2021 05:32:50 +0900 Subject: [PATCH 1104/1261] bpo-41748: Handles unquoted attributes with commas (#24072) * bpo-41748: Adds tests for unquoted attributes with comma * bpo-41748: Handles unquoted attributes with comma * bpo-41748: Addresses review comments * bpo-41748: Addresses review comments * Adds more test cases * Simplifies the regex for handling spaces * bpo-41748: Moves attributes tests under the right class * bpo-41748: Addresses review about duplicate attributes * bpo-41748: Adds NEWS.d entry for this patch --- Lib/html/parser.py | 2 +- Lib/test/test_htmlparser.py | 92 +++++++++++-------- .../2021-01-05-21-26-29.bpo-41748.KdC0w3.rst | 2 + 3 files changed, 59 insertions(+), 37 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst diff --git a/Lib/html/parser.py b/Lib/html/parser.py index 60830779816a03..9e49effca1fcc5 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -46,7 +46,7 @@ |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) - (?:\s*,)* # possibly followed by a comma + \s* # possibly followed by a space )?(?:\s|/(?!>))* )* )? diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index a2bfb39d16a571..12917755a56017 100644 --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -452,42 +452,6 @@ def test_illegal_declarations(self): self._run_check('', [('comment', 'spacer type="block" height="25"')]) - def test_with_unquoted_attributes(self): - # see #12008 - html = ("" - "" - "
    " - "- software-and-i" - "- library
    ") - expected = [ - ('starttag', 'html', []), - ('starttag', 'body', [('bgcolor', 'd0ca90'), ('text', '181008')]), - ('starttag', 'table', - [('cellspacing', '0'), ('cellpadding', '1'), ('width', '100%')]), - ('starttag', 'tr', []), - ('starttag', 'td', [('align', 'left')]), - ('starttag', 'font', [('size', '-1')]), - ('data', '- '), ('starttag', 'a', [('href', '/rabota/')]), - ('starttag', 'span', [('class', 'en')]), ('data', ' software-and-i'), - ('endtag', 'span'), ('endtag', 'a'), - ('data', '- '), ('starttag', 'a', [('href', '/1/')]), - ('starttag', 'span', [('class', 'en')]), ('data', ' library'), - ('endtag', 'span'), ('endtag', 'a'), ('endtag', 'table') - ] - self._run_check(html, expected) - - def test_comma_between_attributes(self): - self._run_check('
    ', [ - ('starttag', 'form', - [('action', '/xxx.php?a=1&b=2&'), - (',', None), ('method', 'post')])]) - - def test_weird_chars_in_unquoted_attribute_values(self): - self._run_check('', [ - ('starttag', 'form', - [('action', 'bogus|&#()value')])]) - def test_invalid_end_tags(self): # A collection of broken end tags.
    is used as separator. # see http://www.w3.org/TR/html5/tokenization.html#end-tag-open-state @@ -766,6 +730,62 @@ def test_end_tag_in_attribute_value(self): [("href", "http://www.example.org/\">;")]), ("data", "spam"), ("endtag", "a")]) + def test_with_unquoted_attributes(self): + # see #12008 + html = ("" + "" + "
    " + "- software-and-i" + "- library
    ") + expected = [ + ('starttag', 'html', []), + ('starttag', 'body', [('bgcolor', 'd0ca90'), ('text', '181008')]), + ('starttag', 'table', + [('cellspacing', '0'), ('cellpadding', '1'), ('width', '100%')]), + ('starttag', 'tr', []), + ('starttag', 'td', [('align', 'left')]), + ('starttag', 'font', [('size', '-1')]), + ('data', '- '), ('starttag', 'a', [('href', '/rabota/')]), + ('starttag', 'span', [('class', 'en')]), ('data', ' software-and-i'), + ('endtag', 'span'), ('endtag', 'a'), + ('data', '- '), ('starttag', 'a', [('href', '/1/')]), + ('starttag', 'span', [('class', 'en')]), ('data', ' library'), + ('endtag', 'span'), ('endtag', 'a'), ('endtag', 'table') + ] + self._run_check(html, expected) + + def test_comma_between_attributes(self): + # see bpo 41478 + # HTMLParser preserves duplicate attributes, leaving the task of + # removing duplicate attributes to a conformant html tree builder + html = ('
    ' # between attrs (unquoted) + '
    ' # between attrs (quoted) + '
    ' # after values (unquoted) + '
    ' # after values (quoted) + '
    ' # one comma values (quoted) + '
    ' # before values (unquoted) + '
    ' # before values (quoted) + '
    ' # before names + '
    ' # after names + ) + expected = [ + ('starttag', 'div', [('class', 'bar,baz=asd'),]), + ('starttag', 'div', [('class', 'bar'), (',baz', 'asd')]), + ('starttag', 'div', [('class', 'bar,'), ('baz', 'asd,')]), + ('starttag', 'div', [('class', 'bar'), (',', None), + ('baz', 'asd'), (',', None)]), + ('starttag', 'div', [('class', 'bar'), (',', None)]), + ('starttag', 'div', [('class', ',bar'), ('baz', ',asd')]), + ('starttag', 'div', [('class', ',"bar"'), ('baz', ',"asd"')]), + ('starttag', 'div', [(',class', 'bar'), (',baz', 'asd')]), + ('starttag', 'div', [('class,', 'bar'), ('baz,', 'asd')]), + ] + self._run_check(html, expected) + + def test_weird_chars_in_unquoted_attribute_values(self): + self._run_check('', [ + ('starttag', 'form', + [('action', 'bogus|&#()value')])]) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst new file mode 100644 index 00000000000000..52efa3ac3d40eb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst @@ -0,0 +1,2 @@ +Fix HTMLParser parsing rules for element attributes containing +commas with spaces. Patch by Karl Dubost. \ No newline at end of file From 17502145d50f8aca569c4192ebb93593b7f1c36a Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Tue, 2 Feb 2021 14:59:15 +0000 Subject: [PATCH 1105/1261] Only eliminate jumps to successor block if jump is unconditional. (GH-24417) * Prevents elimination of the sole test of a value in statements like: if x or True: ... --- Lib/test/test_bool.py | 16 ++++++++++++++++ Python/compile.c | 21 ++++----------------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/Lib/test/test_bool.py b/Lib/test/test_bool.py index 7b3a3859e08932..bec44d0b9c5915 100644 --- a/Lib/test/test_bool.py +++ b/Lib/test/test_bool.py @@ -354,6 +354,22 @@ def test_real_and_imag(self): self.assertIs(type(False.real), int) self.assertIs(type(False.imag), int) + def test_bool_called_at_least_once(self): + class X: + def __init__(self): + self.count = 0 + def __bool__(self): + self.count += 1 + return True + + def f(x): + if x or True: + pass + + x = X() + f(x) + self.assertGreaterEqual(x.count, 1) + def test_main(): support.run_unittest(BoolTest) diff --git a/Python/compile.c b/Python/compile.c index 9927f5abfb964c..a0a257fa6bafce 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -6586,27 +6586,14 @@ optimize_cfg(struct assembler *a, PyObject *consts) for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { if (b->b_iused > 0) { struct instr *b_last_instr = &b->b_instr[b->b_iused - 1]; - if (b_last_instr->i_opcode == POP_JUMP_IF_FALSE || - b_last_instr->i_opcode == POP_JUMP_IF_TRUE || - b_last_instr->i_opcode == JUMP_ABSOLUTE || + if (b_last_instr->i_opcode == JUMP_ABSOLUTE || b_last_instr->i_opcode == JUMP_FORWARD) { if (b_last_instr->i_target == b->b_next) { assert(b->b_next->b_iused); b->b_nofallthrough = 0; - switch(b_last_instr->i_opcode) { - case POP_JUMP_IF_FALSE: - case POP_JUMP_IF_TRUE: - b_last_instr->i_opcode = POP_TOP; - b_last_instr->i_target = NULL; - b_last_instr->i_oparg = 0; - break; - case JUMP_ABSOLUTE: - case JUMP_FORWARD: - b_last_instr->i_opcode = NOP; - clean_basic_block(b, -1); - maybe_empty_blocks = 1; - break; - } + b_last_instr->i_opcode = NOP; + clean_basic_block(b, -1); + maybe_empty_blocks = 1; } } } From c14a4eb34cf1fbfa584e9a55d32dcb4f1ebb8606 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 2 Feb 2021 19:54:22 +0000 Subject: [PATCH 1106/1261] bpo-42997: Improve error message for missing : before suites (GH-24292) * Add to the peg generator a new directive ('&&') that allows to expect a token and hard fail the parsing if the token is not found. This allows to quickly emmit syntax errors for missing tokens. * Use the new grammar element to hard-fail if the ':' is missing before suites. --- Doc/tools/extensions/peg_highlight.py | 6 + Grammar/python.gram | 38 +- Lib/test/test_syntax.py | 107 +- .../2021-01-24-20-19-55.bpo-42997.QUOPgP.rst | 1 + Parser/parser.c | 1493 ++++++++++++----- Parser/pegen.c | 23 +- Parser/pegen.h | 7 +- Tools/peg_generator/pegen/c_generator.py | 19 + Tools/peg_generator/pegen/grammar.py | 19 +- Tools/peg_generator/pegen/grammar_parser.py | 29 +- Tools/peg_generator/pegen/metagrammar.gram | 5 + 11 files changed, 1269 insertions(+), 478 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst diff --git a/Doc/tools/extensions/peg_highlight.py b/Doc/tools/extensions/peg_highlight.py index 9a2acb7f320ba6..4ade1bfeaa047f 100644 --- a/Doc/tools/extensions/peg_highlight.py +++ b/Doc/tools/extensions/peg_highlight.py @@ -27,6 +27,12 @@ class PEGLexer(RegexLexer): tokens = { "ws": [(r"\n", Text), (r"\s+", Text), (r"#.*$", Comment.Singleline),], "lookaheads": [ + # Forced tokens + (r"(&&)(?=\w+\s?)", bygroups(None)), + (r"(&&)(?='.+'\s?)", bygroups(None)), + (r'(&&)(?=".+"\s?)', bygroups(None)), + (r"(&&)(?=\(.+\)\s?)", bygroups(None)), + (r"(?<=\|\s)(&\w+\s?)", bygroups(None)), (r"(?<=\|\s)(&'.+'\s?)", bygroups(None)), (r'(?<=\|\s)(&".+"\s?)', bygroups(None)), diff --git a/Grammar/python.gram b/Grammar/python.gram index e72158be22380a..22f2b41b11ef6d 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -162,22 +162,22 @@ dotted_name[expr_ty]: | NAME if_stmt[stmt_ty]: - | 'if' a=named_expression ':' b=block c=elif_stmt { + | 'if' a=named_expression &&':' b=block c=elif_stmt { _Py_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) } - | 'if' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } + | 'if' a=named_expression &&':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } elif_stmt[stmt_ty]: - | 'elif' a=named_expression ':' b=block c=elif_stmt { + | 'elif' a=named_expression &&':' b=block c=elif_stmt { _Py_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) } - | 'elif' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } -else_block[asdl_stmt_seq*]: 'else' ':' b=block { b } + | 'elif' a=named_expression &&':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } +else_block[asdl_stmt_seq*]: 'else' &&':' b=block { b } while_stmt[stmt_ty]: - | 'while' a=named_expression ':' b=block c=[else_block] { _Py_While(a, b, c, EXTRA) } + | 'while' a=named_expression &&':' b=block c=[else_block] { _Py_While(a, b, c, EXTRA) } for_stmt[stmt_ty]: - | 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { + | 'for' t=star_targets 'in' ~ ex=star_expressions &&':' tc=[TYPE_COMMENT] b=block el=[else_block] { _Py_For(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA) } - | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { + | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions &&':' tc=[TYPE_COMMENT] b=block el=[else_block] { CHECK_VERSION(stmt_ty, 5, "Async for loops are", _Py_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) } | invalid_for_target @@ -190,18 +190,20 @@ with_stmt[stmt_ty]: CHECK_VERSION(stmt_ty, 5, "Async with statements are", _Py_AsyncWith(a, b, NULL, EXTRA)) } | ASYNC 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { CHECK_VERSION(stmt_ty, 5, "Async with statements are", _Py_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) } + | invalid_with_stmt + with_item[withitem_ty]: | e=expression 'as' t=star_target &(',' | ')' | ':') { _Py_withitem(e, t, p->arena) } | invalid_with_item | e=expression { _Py_withitem(e, NULL, p->arena) } try_stmt[stmt_ty]: - | 'try' ':' b=block f=finally_block { _Py_Try(b, NULL, NULL, f, EXTRA) } - | 'try' ':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] { _Py_Try(b, ex, el, f, EXTRA) } + | 'try' &&':' b=block f=finally_block { _Py_Try(b, NULL, NULL, f, EXTRA) } + | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] { _Py_Try(b, ex, el, f, EXTRA) } except_block[excepthandler_ty]: - | 'except' e=expression t=['as' z=NAME { z }] ':' b=block { + | 'except' e=expression t=['as' z=NAME { z }] &&':' b=block { _Py_ExceptHandler(e, (t) ? ((expr_ty) t)->v.Name.id : NULL, b, EXTRA) } - | 'except' ':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) } + | 'except' &&':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) } finally_block[asdl_stmt_seq*]: 'finally' ':' a=block { a } return_stmt[stmt_ty]: @@ -216,11 +218,11 @@ function_def[stmt_ty]: | function_def_raw function_def_raw[stmt_ty]: - | 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { + | 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] &&':' tc=[func_type_comment] b=block { _Py_FunctionDef(n->v.Name.id, (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)), b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA) } - | ASYNC 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { + | ASYNC 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] &&':' tc=[func_type_comment] b=block { CHECK_VERSION( stmt_ty, 5, @@ -300,7 +302,7 @@ class_def[stmt_ty]: | a=decorators b=class_def_raw { _PyPegen_class_def_decorators(p, a, b) } | class_def_raw class_def_raw[stmt_ty]: - | 'class' a=NAME b=['(' z=[arguments] ')' { z }] ':' c=block { + | 'class' a=NAME b=['(' z=[arguments] ')' { z }] &&':' c=block { _Py_ClassDef(a->v.Name.id, (b) ? ((expr_ty) b)->v.Call.args : NULL, (b) ? ((expr_ty) b)->v.Call.keywords : NULL, @@ -718,7 +720,7 @@ invalid_double_type_comments: | TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT { RAISE_SYNTAX_ERROR("Cannot have two type comments on def") } invalid_with_item: - | expression 'as' a=expression { + | expression 'as' a=expression &(',' | ')' | ':') { RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) } invalid_for_target: @@ -731,3 +733,7 @@ invalid_group: invalid_import_from_targets: | import_from_as_names ',' { RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") } + +invalid_with_stmt: + | [ASYNC] 'with' ','.(expression ['as' star_target])+ &&':' + | [ASYNC] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':' diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 604474f1e83870..6068dd9fc09e8e 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -229,7 +229,7 @@ >>> with a as b Traceback (most recent call last): -SyntaxError: invalid syntax +SyntaxError: expected ':' >>> p = p = Traceback (most recent call last): @@ -331,7 +331,7 @@ >>> class C(x for x in L): ... pass Traceback (most recent call last): -SyntaxError: invalid syntax +SyntaxError: expected ':' >>> def g(*args, **kwargs): ... print(args, sorted(kwargs.items())) @@ -708,6 +708,107 @@ ... SyntaxError: cannot assign to function call + Missing ':' before suites: + + >>> def f() + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> class A + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> if 1 + ... pass + ... elif 1: + ... pass + ... else: + ... x() = 1 + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> if 1: + ... pass + ... elif 1 + ... pass + ... else: + ... x() = 1 + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> if 1: + ... pass + ... elif 1: + ... pass + ... else + ... x() = 1 + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> for x in range(10) + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> while True + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with blech as something + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with blech + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with blech, block as something + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with blech, block as something, bluch + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with (blech as something) + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with (blech) + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with (blech, block as something) + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with (blech, block as something, bluch) + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> try + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> try: + ... pass + ... except + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + Make sure that the old "raise X, Y[, Z]" form is gone: >>> raise X, Y Traceback (most recent call last): @@ -992,7 +1093,7 @@ def func2(): finally: pass """ - self._check_error(code, "invalid syntax") + self._check_error(code, "expected ':'") def test_invalid_line_continuation_left_recursive(self): # Check bpo-42218: SyntaxErrors following left-recursive rules diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst new file mode 100644 index 00000000000000..889f4c5d99689a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst @@ -0,0 +1 @@ +Improve error message for missing ":" before blocks. Patch by Pablo Galindo. \ No newline at end of file diff --git a/Parser/parser.c b/Parser/parser.c index d333accf71ccaf..c709e45dae5659 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -231,161 +231,171 @@ static KeywordToken *reserved_keywords[] = { #define invalid_for_target_type 1162 #define invalid_group_type 1163 #define invalid_import_from_targets_type 1164 -#define _loop0_1_type 1165 -#define _loop0_2_type 1166 -#define _loop0_4_type 1167 -#define _gather_3_type 1168 -#define _loop0_6_type 1169 -#define _gather_5_type 1170 -#define _loop0_8_type 1171 -#define _gather_7_type 1172 -#define _loop0_10_type 1173 -#define _gather_9_type 1174 -#define _loop1_11_type 1175 -#define _loop0_13_type 1176 -#define _gather_12_type 1177 -#define _tmp_14_type 1178 -#define _tmp_15_type 1179 -#define _tmp_16_type 1180 -#define _tmp_17_type 1181 -#define _tmp_18_type 1182 -#define _tmp_19_type 1183 -#define _tmp_20_type 1184 -#define _tmp_21_type 1185 -#define _loop1_22_type 1186 -#define _tmp_23_type 1187 -#define _tmp_24_type 1188 -#define _loop0_26_type 1189 -#define _gather_25_type 1190 -#define _loop0_28_type 1191 -#define _gather_27_type 1192 -#define _tmp_29_type 1193 -#define _tmp_30_type 1194 -#define _loop0_31_type 1195 -#define _loop1_32_type 1196 -#define _loop0_34_type 1197 -#define _gather_33_type 1198 -#define _tmp_35_type 1199 -#define _loop0_37_type 1200 -#define _gather_36_type 1201 -#define _tmp_38_type 1202 -#define _loop0_40_type 1203 -#define _gather_39_type 1204 -#define _loop0_42_type 1205 -#define _gather_41_type 1206 -#define _loop0_44_type 1207 -#define _gather_43_type 1208 -#define _loop0_46_type 1209 -#define _gather_45_type 1210 -#define _tmp_47_type 1211 -#define _loop1_48_type 1212 -#define _tmp_49_type 1213 -#define _tmp_50_type 1214 -#define _tmp_51_type 1215 -#define _tmp_52_type 1216 -#define _tmp_53_type 1217 -#define _loop0_54_type 1218 -#define _loop0_55_type 1219 -#define _loop0_56_type 1220 -#define _loop1_57_type 1221 -#define _loop0_58_type 1222 -#define _loop1_59_type 1223 -#define _loop1_60_type 1224 -#define _loop1_61_type 1225 -#define _loop0_62_type 1226 -#define _loop1_63_type 1227 -#define _loop0_64_type 1228 -#define _loop1_65_type 1229 -#define _loop0_66_type 1230 -#define _loop1_67_type 1231 -#define _loop1_68_type 1232 -#define _tmp_69_type 1233 -#define _loop1_70_type 1234 -#define _loop0_72_type 1235 -#define _gather_71_type 1236 -#define _loop1_73_type 1237 -#define _loop0_74_type 1238 -#define _loop0_75_type 1239 -#define _loop0_76_type 1240 -#define _loop1_77_type 1241 -#define _loop0_78_type 1242 -#define _loop1_79_type 1243 -#define _loop1_80_type 1244 -#define _loop1_81_type 1245 -#define _loop0_82_type 1246 -#define _loop1_83_type 1247 -#define _loop0_84_type 1248 -#define _loop1_85_type 1249 -#define _loop0_86_type 1250 -#define _loop1_87_type 1251 -#define _loop1_88_type 1252 -#define _loop1_89_type 1253 -#define _loop1_90_type 1254 -#define _tmp_91_type 1255 -#define _loop0_93_type 1256 -#define _gather_92_type 1257 -#define _tmp_94_type 1258 -#define _tmp_95_type 1259 -#define _tmp_96_type 1260 -#define _tmp_97_type 1261 -#define _loop1_98_type 1262 -#define _tmp_99_type 1263 -#define _tmp_100_type 1264 -#define _loop0_102_type 1265 -#define _gather_101_type 1266 -#define _loop1_103_type 1267 -#define _loop0_104_type 1268 -#define _loop0_105_type 1269 -#define _loop0_107_type 1270 -#define _gather_106_type 1271 -#define _tmp_108_type 1272 -#define _loop0_110_type 1273 -#define _gather_109_type 1274 -#define _loop0_112_type 1275 -#define _gather_111_type 1276 -#define _loop0_114_type 1277 -#define _gather_113_type 1278 -#define _loop0_116_type 1279 -#define _gather_115_type 1280 -#define _loop0_117_type 1281 -#define _loop0_119_type 1282 -#define _gather_118_type 1283 -#define _loop1_120_type 1284 -#define _tmp_121_type 1285 -#define _loop0_123_type 1286 -#define _gather_122_type 1287 -#define _loop0_125_type 1288 -#define _gather_124_type 1289 -#define _tmp_126_type 1290 -#define _loop0_127_type 1291 -#define _loop0_128_type 1292 -#define _loop0_129_type 1293 -#define _tmp_130_type 1294 -#define _tmp_131_type 1295 -#define _tmp_132_type 1296 -#define _loop0_133_type 1297 -#define _loop1_134_type 1298 -#define _loop0_135_type 1299 -#define _loop1_136_type 1300 -#define _tmp_137_type 1301 -#define _tmp_138_type 1302 -#define _tmp_139_type 1303 -#define _tmp_140_type 1304 -#define _tmp_141_type 1305 -#define _tmp_142_type 1306 -#define _tmp_143_type 1307 -#define _tmp_144_type 1308 -#define _tmp_145_type 1309 -#define _tmp_146_type 1310 -#define _tmp_147_type 1311 -#define _tmp_148_type 1312 -#define _tmp_149_type 1313 -#define _tmp_150_type 1314 -#define _tmp_151_type 1315 -#define _tmp_152_type 1316 -#define _tmp_153_type 1317 -#define _tmp_154_type 1318 -#define _tmp_155_type 1319 +#define invalid_with_stmt_type 1165 +#define _loop0_1_type 1166 +#define _loop0_2_type 1167 +#define _loop0_4_type 1168 +#define _gather_3_type 1169 +#define _loop0_6_type 1170 +#define _gather_5_type 1171 +#define _loop0_8_type 1172 +#define _gather_7_type 1173 +#define _loop0_10_type 1174 +#define _gather_9_type 1175 +#define _loop1_11_type 1176 +#define _loop0_13_type 1177 +#define _gather_12_type 1178 +#define _tmp_14_type 1179 +#define _tmp_15_type 1180 +#define _tmp_16_type 1181 +#define _tmp_17_type 1182 +#define _tmp_18_type 1183 +#define _tmp_19_type 1184 +#define _tmp_20_type 1185 +#define _tmp_21_type 1186 +#define _loop1_22_type 1187 +#define _tmp_23_type 1188 +#define _tmp_24_type 1189 +#define _loop0_26_type 1190 +#define _gather_25_type 1191 +#define _loop0_28_type 1192 +#define _gather_27_type 1193 +#define _tmp_29_type 1194 +#define _tmp_30_type 1195 +#define _loop0_31_type 1196 +#define _loop1_32_type 1197 +#define _loop0_34_type 1198 +#define _gather_33_type 1199 +#define _tmp_35_type 1200 +#define _loop0_37_type 1201 +#define _gather_36_type 1202 +#define _tmp_38_type 1203 +#define _loop0_40_type 1204 +#define _gather_39_type 1205 +#define _loop0_42_type 1206 +#define _gather_41_type 1207 +#define _loop0_44_type 1208 +#define _gather_43_type 1209 +#define _loop0_46_type 1210 +#define _gather_45_type 1211 +#define _tmp_47_type 1212 +#define _loop1_48_type 1213 +#define _tmp_49_type 1214 +#define _tmp_50_type 1215 +#define _tmp_51_type 1216 +#define _tmp_52_type 1217 +#define _tmp_53_type 1218 +#define _loop0_54_type 1219 +#define _loop0_55_type 1220 +#define _loop0_56_type 1221 +#define _loop1_57_type 1222 +#define _loop0_58_type 1223 +#define _loop1_59_type 1224 +#define _loop1_60_type 1225 +#define _loop1_61_type 1226 +#define _loop0_62_type 1227 +#define _loop1_63_type 1228 +#define _loop0_64_type 1229 +#define _loop1_65_type 1230 +#define _loop0_66_type 1231 +#define _loop1_67_type 1232 +#define _loop1_68_type 1233 +#define _tmp_69_type 1234 +#define _loop1_70_type 1235 +#define _loop0_72_type 1236 +#define _gather_71_type 1237 +#define _loop1_73_type 1238 +#define _loop0_74_type 1239 +#define _loop0_75_type 1240 +#define _loop0_76_type 1241 +#define _loop1_77_type 1242 +#define _loop0_78_type 1243 +#define _loop1_79_type 1244 +#define _loop1_80_type 1245 +#define _loop1_81_type 1246 +#define _loop0_82_type 1247 +#define _loop1_83_type 1248 +#define _loop0_84_type 1249 +#define _loop1_85_type 1250 +#define _loop0_86_type 1251 +#define _loop1_87_type 1252 +#define _loop1_88_type 1253 +#define _loop1_89_type 1254 +#define _loop1_90_type 1255 +#define _tmp_91_type 1256 +#define _loop0_93_type 1257 +#define _gather_92_type 1258 +#define _tmp_94_type 1259 +#define _tmp_95_type 1260 +#define _tmp_96_type 1261 +#define _tmp_97_type 1262 +#define _loop1_98_type 1263 +#define _tmp_99_type 1264 +#define _tmp_100_type 1265 +#define _loop0_102_type 1266 +#define _gather_101_type 1267 +#define _loop1_103_type 1268 +#define _loop0_104_type 1269 +#define _loop0_105_type 1270 +#define _loop0_107_type 1271 +#define _gather_106_type 1272 +#define _tmp_108_type 1273 +#define _loop0_110_type 1274 +#define _gather_109_type 1275 +#define _loop0_112_type 1276 +#define _gather_111_type 1277 +#define _loop0_114_type 1278 +#define _gather_113_type 1279 +#define _loop0_116_type 1280 +#define _gather_115_type 1281 +#define _loop0_117_type 1282 +#define _loop0_119_type 1283 +#define _gather_118_type 1284 +#define _loop1_120_type 1285 +#define _tmp_121_type 1286 +#define _loop0_123_type 1287 +#define _gather_122_type 1288 +#define _loop0_125_type 1289 +#define _gather_124_type 1290 +#define _tmp_126_type 1291 +#define _loop0_127_type 1292 +#define _loop0_128_type 1293 +#define _loop0_129_type 1294 +#define _tmp_130_type 1295 +#define _tmp_131_type 1296 +#define _tmp_132_type 1297 +#define _loop0_133_type 1298 +#define _loop1_134_type 1299 +#define _loop0_135_type 1300 +#define _loop1_136_type 1301 +#define _tmp_137_type 1302 +#define _tmp_138_type 1303 +#define _tmp_139_type 1304 +#define _loop0_141_type 1305 +#define _gather_140_type 1306 +#define _loop0_143_type 1307 +#define _gather_142_type 1308 +#define _tmp_144_type 1309 +#define _tmp_145_type 1310 +#define _tmp_146_type 1311 +#define _tmp_147_type 1312 +#define _tmp_148_type 1313 +#define _tmp_149_type 1314 +#define _tmp_150_type 1315 +#define _tmp_151_type 1316 +#define _tmp_152_type 1317 +#define _tmp_153_type 1318 +#define _tmp_154_type 1319 +#define _tmp_155_type 1320 +#define _tmp_156_type 1321 +#define _tmp_157_type 1322 +#define _tmp_158_type 1323 +#define _tmp_159_type 1324 +#define _tmp_160_type 1325 +#define _tmp_161_type 1326 +#define _tmp_162_type 1327 +#define _tmp_163_type 1328 +#define _tmp_164_type 1329 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -552,6 +562,7 @@ static void *invalid_with_item_rule(Parser *p); static void *invalid_for_target_rule(Parser *p); static void *invalid_group_rule(Parser *p); static void *invalid_import_from_targets_rule(Parser *p); +static void *invalid_with_stmt_rule(Parser *p); static asdl_seq *_loop0_1_rule(Parser *p); static asdl_seq *_loop0_2_rule(Parser *p); static asdl_seq *_loop0_4_rule(Parser *p); @@ -691,10 +702,10 @@ static asdl_seq *_loop1_136_rule(Parser *p); static void *_tmp_137_rule(Parser *p); static void *_tmp_138_rule(Parser *p); static void *_tmp_139_rule(Parser *p); -static void *_tmp_140_rule(Parser *p); -static void *_tmp_141_rule(Parser *p); -static void *_tmp_142_rule(Parser *p); -static void *_tmp_143_rule(Parser *p); +static asdl_seq *_loop0_141_rule(Parser *p); +static asdl_seq *_gather_140_rule(Parser *p); +static asdl_seq *_loop0_143_rule(Parser *p); +static asdl_seq *_gather_142_rule(Parser *p); static void *_tmp_144_rule(Parser *p); static void *_tmp_145_rule(Parser *p); static void *_tmp_146_rule(Parser *p); @@ -707,6 +718,15 @@ static void *_tmp_152_rule(Parser *p); static void *_tmp_153_rule(Parser *p); static void *_tmp_154_rule(Parser *p); static void *_tmp_155_rule(Parser *p); +static void *_tmp_156_rule(Parser *p); +static void *_tmp_157_rule(Parser *p); +static void *_tmp_158_rule(Parser *p); +static void *_tmp_159_rule(Parser *p); +static void *_tmp_160_rule(Parser *p); +static void *_tmp_161_rule(Parser *p); +static void *_tmp_162_rule(Parser *p); +static void *_tmp_163_rule(Parser *p); +static void *_tmp_164_rule(Parser *p); // file: statements? $ @@ -3542,8 +3562,8 @@ dotted_name_raw(Parser *p) } // if_stmt: -// | 'if' named_expression ':' block elif_stmt -// | 'if' named_expression ':' block else_block? +// | 'if' named_expression &&':' block elif_stmt +// | 'if' named_expression &&':' block else_block? static stmt_ty if_stmt_rule(Parser *p) { @@ -3563,12 +3583,12 @@ if_stmt_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // 'if' named_expression ':' block elif_stmt + { // 'if' named_expression &&':' block elif_stmt if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> if_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block elif_stmt")); + D(fprintf(stderr, "%*c> if_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' named_expression &&':' block elif_stmt")); Token * _keyword; Token * _literal; expr_ty a; @@ -3579,14 +3599,14 @@ if_stmt_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && (c = elif_stmt_rule(p)) // elif_stmt ) { - D(fprintf(stderr, "%*c+ if_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block elif_stmt")); + D(fprintf(stderr, "%*c+ if_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' named_expression &&':' block elif_stmt")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -3606,14 +3626,14 @@ if_stmt_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s if_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' named_expression ':' block elif_stmt")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' named_expression &&':' block elif_stmt")); } - { // 'if' named_expression ':' block else_block? + { // 'if' named_expression &&':' block else_block? if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> if_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block else_block?")); + D(fprintf(stderr, "%*c> if_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' named_expression &&':' block else_block?")); Token * _keyword; Token * _literal; expr_ty a; @@ -3624,14 +3644,14 @@ if_stmt_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && (c = else_block_rule(p), 1) // else_block? ) { - D(fprintf(stderr, "%*c+ if_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block else_block?")); + D(fprintf(stderr, "%*c+ if_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' named_expression &&':' block else_block?")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -3651,7 +3671,7 @@ if_stmt_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s if_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' named_expression ':' block else_block?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' named_expression &&':' block else_block?")); } _res = NULL; done: @@ -3660,8 +3680,8 @@ if_stmt_rule(Parser *p) } // elif_stmt: -// | 'elif' named_expression ':' block elif_stmt -// | 'elif' named_expression ':' block else_block? +// | 'elif' named_expression &&':' block elif_stmt +// | 'elif' named_expression &&':' block else_block? static stmt_ty elif_stmt_rule(Parser *p) { @@ -3681,12 +3701,12 @@ elif_stmt_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // 'elif' named_expression ':' block elif_stmt + { // 'elif' named_expression &&':' block elif_stmt if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> elif_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block elif_stmt")); + D(fprintf(stderr, "%*c> elif_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'elif' named_expression &&':' block elif_stmt")); Token * _keyword; Token * _literal; expr_ty a; @@ -3697,14 +3717,14 @@ elif_stmt_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && (c = elif_stmt_rule(p)) // elif_stmt ) { - D(fprintf(stderr, "%*c+ elif_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block elif_stmt")); + D(fprintf(stderr, "%*c+ elif_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'elif' named_expression &&':' block elif_stmt")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -3724,14 +3744,14 @@ elif_stmt_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s elif_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'elif' named_expression ':' block elif_stmt")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'elif' named_expression &&':' block elif_stmt")); } - { // 'elif' named_expression ':' block else_block? + { // 'elif' named_expression &&':' block else_block? if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> elif_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block else_block?")); + D(fprintf(stderr, "%*c> elif_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'elif' named_expression &&':' block else_block?")); Token * _keyword; Token * _literal; expr_ty a; @@ -3742,14 +3762,14 @@ elif_stmt_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && (c = else_block_rule(p), 1) // else_block? ) { - D(fprintf(stderr, "%*c+ elif_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block else_block?")); + D(fprintf(stderr, "%*c+ elif_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'elif' named_expression &&':' block else_block?")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -3769,7 +3789,7 @@ elif_stmt_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s elif_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'elif' named_expression ':' block else_block?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'elif' named_expression &&':' block else_block?")); } _res = NULL; done: @@ -3777,7 +3797,7 @@ elif_stmt_rule(Parser *p) return _res; } -// else_block: 'else' ':' block +// else_block: 'else' &&':' block static asdl_stmt_seq* else_block_rule(Parser *p) { @@ -3788,24 +3808,24 @@ else_block_rule(Parser *p) } asdl_stmt_seq* _res = NULL; int _mark = p->mark; - { // 'else' ':' block + { // 'else' &&':' block if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> else_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else' ':' block")); + D(fprintf(stderr, "%*c> else_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else' &&':' block")); Token * _keyword; Token * _literal; asdl_stmt_seq* b; if ( (_keyword = _PyPegen_expect_token(p, 516)) // token='else' && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ else_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else' ':' block")); + D(fprintf(stderr, "%*c+ else_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else' &&':' block")); _res = b; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -3816,7 +3836,7 @@ else_block_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s else_block[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'else' ':' block")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'else' &&':' block")); } _res = NULL; done: @@ -3824,7 +3844,7 @@ else_block_rule(Parser *p) return _res; } -// while_stmt: 'while' named_expression ':' block else_block? +// while_stmt: 'while' named_expression &&':' block else_block? static stmt_ty while_stmt_rule(Parser *p) { @@ -3844,12 +3864,12 @@ while_stmt_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // 'while' named_expression ':' block else_block? + { // 'while' named_expression &&':' block else_block? if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> while_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'while' named_expression ':' block else_block?")); + D(fprintf(stderr, "%*c> while_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'while' named_expression &&':' block else_block?")); Token * _keyword; Token * _literal; expr_ty a; @@ -3860,14 +3880,14 @@ while_stmt_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && (c = else_block_rule(p), 1) // else_block? ) { - D(fprintf(stderr, "%*c+ while_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'while' named_expression ':' block else_block?")); + D(fprintf(stderr, "%*c+ while_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'while' named_expression &&':' block else_block?")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -3887,7 +3907,7 @@ while_stmt_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s while_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'while' named_expression ':' block else_block?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'while' named_expression &&':' block else_block?")); } _res = NULL; done: @@ -3896,8 +3916,8 @@ while_stmt_rule(Parser *p) } // for_stmt: -// | 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? -// | ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? +// | 'for' star_targets 'in' ~ star_expressions &&':' TYPE_COMMENT? block else_block? +// | ASYNC 'for' star_targets 'in' ~ star_expressions &&':' TYPE_COMMENT? block else_block? // | invalid_for_target static stmt_ty for_stmt_rule(Parser *p) @@ -3918,12 +3938,12 @@ for_stmt_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? + { // 'for' star_targets 'in' ~ star_expressions &&':' TYPE_COMMENT? block else_block? if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> for_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + D(fprintf(stderr, "%*c> for_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ star_expressions &&':' TYPE_COMMENT? block else_block?")); int _cut_var = 0; Token * _keyword; Token * _keyword_1; @@ -3944,7 +3964,7 @@ for_stmt_rule(Parser *p) && (ex = star_expressions_rule(p)) // star_expressions && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? && @@ -3953,7 +3973,7 @@ for_stmt_rule(Parser *p) (el = else_block_rule(p), 1) // else_block? ) { - D(fprintf(stderr, "%*c+ for_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + D(fprintf(stderr, "%*c+ for_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ star_expressions &&':' TYPE_COMMENT? block else_block?")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -3973,18 +3993,18 @@ for_stmt_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s for_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'for' star_targets 'in' ~ star_expressions &&':' TYPE_COMMENT? block else_block?")); if (_cut_var) { D(p->level--); return NULL; } } - { // ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? + { // ASYNC 'for' star_targets 'in' ~ star_expressions &&':' TYPE_COMMENT? block else_block? if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> for_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + D(fprintf(stderr, "%*c> for_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions &&':' TYPE_COMMENT? block else_block?")); int _cut_var = 0; Token * _keyword; Token * _keyword_1; @@ -4008,7 +4028,7 @@ for_stmt_rule(Parser *p) && (ex = star_expressions_rule(p)) // star_expressions && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? && @@ -4017,7 +4037,7 @@ for_stmt_rule(Parser *p) (el = else_block_rule(p), 1) // else_block? ) { - D(fprintf(stderr, "%*c+ for_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + D(fprintf(stderr, "%*c+ for_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions &&':' TYPE_COMMENT? block else_block?")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -4037,7 +4057,7 @@ for_stmt_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s for_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions &&':' TYPE_COMMENT? block else_block?")); if (_cut_var) { D(p->level--); return NULL; @@ -4073,6 +4093,7 @@ for_stmt_rule(Parser *p) // | 'with' ','.with_item+ ':' TYPE_COMMENT? block // | ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block // | ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block +// | invalid_with_stmt static stmt_ty with_stmt_rule(Parser *p) { @@ -4292,6 +4313,25 @@ with_stmt_rule(Parser *p) D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block")); } + if (p->call_invalid_rules) { // invalid_with_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_with_stmt")); + void *invalid_with_stmt_var; + if ( + (invalid_with_stmt_var = invalid_with_stmt_rule(p)) // invalid_with_stmt + ) + { + D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_with_stmt")); + _res = invalid_with_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_with_stmt")); + } _res = NULL; done: D(p->level--); @@ -4394,8 +4434,8 @@ with_item_rule(Parser *p) } // try_stmt: -// | 'try' ':' block finally_block -// | 'try' ':' block except_block+ else_block? finally_block? +// | 'try' &&':' block finally_block +// | 'try' &&':' block except_block+ else_block? finally_block? static stmt_ty try_stmt_rule(Parser *p) { @@ -4415,12 +4455,12 @@ try_stmt_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // 'try' ':' block finally_block + { // 'try' &&':' block finally_block if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' ':' block finally_block")); + D(fprintf(stderr, "%*c> try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' &&':' block finally_block")); Token * _keyword; Token * _literal; asdl_stmt_seq* b; @@ -4428,14 +4468,14 @@ try_stmt_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 511)) // token='try' && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && (f = finally_block_rule(p)) // finally_block ) { - D(fprintf(stderr, "%*c+ try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block finally_block")); + D(fprintf(stderr, "%*c+ try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' &&':' block finally_block")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -4455,14 +4495,14 @@ try_stmt_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s try_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'try' ':' block finally_block")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'try' &&':' block finally_block")); } - { // 'try' ':' block except_block+ else_block? finally_block? + { // 'try' &&':' block except_block+ else_block? finally_block? if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' ':' block except_block+ else_block? finally_block?")); + D(fprintf(stderr, "%*c> try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' &&':' block except_block+ else_block? finally_block?")); Token * _keyword; Token * _literal; asdl_stmt_seq* b; @@ -4472,7 +4512,7 @@ try_stmt_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 511)) // token='try' && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && @@ -4483,7 +4523,7 @@ try_stmt_rule(Parser *p) (f = finally_block_rule(p), 1) // finally_block? ) { - D(fprintf(stderr, "%*c+ try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block except_block+ else_block? finally_block?")); + D(fprintf(stderr, "%*c+ try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' &&':' block except_block+ else_block? finally_block?")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -4503,7 +4543,7 @@ try_stmt_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s try_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'try' ':' block except_block+ else_block? finally_block?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'try' &&':' block except_block+ else_block? finally_block?")); } _res = NULL; done: @@ -4511,7 +4551,7 @@ try_stmt_rule(Parser *p) return _res; } -// except_block: 'except' expression ['as' NAME] ':' block | 'except' ':' block +// except_block: 'except' expression ['as' NAME] &&':' block | 'except' &&':' block static excepthandler_ty except_block_rule(Parser *p) { @@ -4531,12 +4571,12 @@ except_block_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // 'except' expression ['as' NAME] ':' block + { // 'except' expression ['as' NAME] &&':' block if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] ':' block")); + D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] &&':' block")); Token * _keyword; Token * _literal; asdl_stmt_seq* b; @@ -4549,12 +4589,12 @@ except_block_rule(Parser *p) && (t = _tmp_49_rule(p), 1) // ['as' NAME] && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] ':' block")); + D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] &&':' block")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -4574,26 +4614,26 @@ except_block_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s except_block[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ['as' NAME] ':' block")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ['as' NAME] &&':' block")); } - { // 'except' ':' block + { // 'except' &&':' block if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' ':' block")); + D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' &&':' block")); Token * _keyword; Token * _literal; asdl_stmt_seq* b; if ( (_keyword = _PyPegen_expect_token(p, 521)) // token='except' && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' ':' block")); + D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' &&':' block")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -4613,7 +4653,7 @@ except_block_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s except_block[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' ':' block")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' &&':' block")); } _res = NULL; done: @@ -4892,8 +4932,8 @@ function_def_rule(Parser *p) } // function_def_raw: -// | 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block -// | ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block +// | 'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block +// | ASYNC 'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block static stmt_ty function_def_raw_rule(Parser *p) { @@ -4913,12 +4953,12 @@ function_def_raw_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block + { // 'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> function_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + D(fprintf(stderr, "%*c> function_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block")); Token * _keyword; Token * _literal; Token * _literal_1; @@ -4941,14 +4981,14 @@ function_def_raw_rule(Parser *p) && (a = _tmp_51_rule(p), 1) // ['->' expression] && - (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (tc = func_type_comment_rule(p), 1) // func_type_comment? && (b = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ function_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + D(fprintf(stderr, "%*c+ function_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -4968,14 +5008,14 @@ function_def_raw_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s function_def_raw[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block")); } - { // ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block + { // ASYNC 'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> function_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + D(fprintf(stderr, "%*c> function_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block")); Token * _keyword; Token * _literal; Token * _literal_1; @@ -5001,14 +5041,14 @@ function_def_raw_rule(Parser *p) && (a = _tmp_52_rule(p), 1) // ['->' expression] && - (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (tc = func_type_comment_rule(p), 1) // func_type_comment? && (b = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ function_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + D(fprintf(stderr, "%*c+ function_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -5028,7 +5068,7 @@ function_def_raw_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s function_def_raw[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block")); } _res = NULL; done: @@ -6174,7 +6214,7 @@ class_def_rule(Parser *p) return _res; } -// class_def_raw: 'class' NAME ['(' arguments? ')'] ':' block +// class_def_raw: 'class' NAME ['(' arguments? ')'] &&':' block static stmt_ty class_def_raw_rule(Parser *p) { @@ -6194,12 +6234,12 @@ class_def_raw_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // 'class' NAME ['(' arguments? ')'] ':' block + { // 'class' NAME ['(' arguments? ')'] &&':' block if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> class_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class' NAME ['(' arguments? ')'] ':' block")); + D(fprintf(stderr, "%*c> class_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class' NAME ['(' arguments? ')'] &&':' block")); Token * _keyword; Token * _literal; expr_ty a; @@ -6212,12 +6252,12 @@ class_def_raw_rule(Parser *p) && (b = _tmp_69_rule(p), 1) // ['(' arguments? ')'] && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (c = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ class_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class' NAME ['(' arguments? ')'] ':' block")); + D(fprintf(stderr, "%*c+ class_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class' NAME ['(' arguments? ')'] &&':' block")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -6237,7 +6277,7 @@ class_def_raw_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s class_def_raw[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'class' NAME ['(' arguments? ')'] ':' block")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'class' NAME ['(' arguments? ')'] &&':' block")); } _res = NULL; done: @@ -15699,7 +15739,7 @@ invalid_double_type_comments_rule(Parser *p) return _res; } -// invalid_with_item: expression 'as' expression +// invalid_with_item: expression 'as' expression &(',' | ')' | ':') static void * invalid_with_item_rule(Parser *p) { @@ -15710,12 +15750,12 @@ invalid_with_item_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // expression 'as' expression + { // expression 'as' expression &(',' | ')' | ':') if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> invalid_with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression 'as' expression")); + D(fprintf(stderr, "%*c> invalid_with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression 'as' expression &(',' | ')' | ':')")); Token * _keyword; expr_ty a; expr_ty expression_var; @@ -15725,9 +15765,11 @@ invalid_with_item_rule(Parser *p) (_keyword = _PyPegen_expect_token(p, 520)) // token='as' && (a = expression_rule(p)) // expression + && + _PyPegen_lookahead(1, _tmp_139_rule, p) ) { - D(fprintf(stderr, "%*c+ invalid_with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' expression")); + D(fprintf(stderr, "%*c+ invalid_with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' expression &(',' | ')' | ':')")); _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( STAR_TARGETS , a ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -15738,7 +15780,7 @@ invalid_with_item_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s invalid_with_item[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression 'as' expression")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression 'as' expression &(',' | ')' | ':')")); } _res = NULL; done: @@ -15885,6 +15927,93 @@ invalid_import_from_targets_rule(Parser *p) return _res; } +// invalid_with_stmt: +// | ASYNC? 'with' ','.(expression ['as' star_target])+ &&':' +// | ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':' +static void * +invalid_with_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ASYNC? 'with' ','.(expression ['as' star_target])+ &&':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' ','.(expression ['as' star_target])+ &&':'")); + asdl_seq * _gather_140_var; + Token * _keyword; + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + if ( + (_opt_var = _PyPegen_expect_token(p, ASYNC), 1) // ASYNC? + && + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (_gather_140_var = _gather_140_rule(p)) // ','.(expression ['as' star_target])+ + && + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' ','.(expression ['as' star_target])+ &&':'")); + _res = _PyPegen_dummy_name(p, _opt_var, _keyword, _gather_140_var, _literal); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC? 'with' ','.(expression ['as' star_target])+ &&':'")); + } + { // ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':'")); + asdl_seq * _gather_142_var; + Token * _keyword; + Token * _literal; + Token * _literal_1; + Token * _literal_2; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + void *_opt_var_1; + UNUSED(_opt_var_1); // Silence compiler warnings + if ( + (_opt_var = _PyPegen_expect_token(p, ASYNC), 1) // ASYNC? + && + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (_gather_142_var = _gather_142_rule(p)) // ','.(expressions ['as' star_target])+ + && + (_opt_var_1 = _PyPegen_expect_token(p, 12), 1) // ','? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':'")); + _res = _PyPegen_dummy_name(p, _opt_var, _keyword, _literal, _gather_142_var, _opt_var_1, _literal_1, _literal_2); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + // _loop0_1: NEWLINE static asdl_seq * _loop0_1_rule(Parser *p) @@ -17133,12 +17262,12 @@ _loop1_22_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_139_var; + void *_tmp_144_var; while ( - (_tmp_139_var = _tmp_139_rule(p)) // star_targets '=' + (_tmp_144_var = _tmp_144_rule(p)) // star_targets '=' ) { - _res = _tmp_139_var; + _res = _tmp_144_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17641,12 +17770,12 @@ _loop0_31_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_140_var; + void *_tmp_145_var; while ( - (_tmp_140_var = _tmp_140_rule(p)) // '.' | '...' + (_tmp_145_var = _tmp_145_rule(p)) // '.' | '...' ) { - _res = _tmp_140_var; + _res = _tmp_145_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17707,12 +17836,12 @@ _loop1_32_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_141_var; + void *_tmp_146_var; while ( - (_tmp_141_var = _tmp_141_rule(p)) // '.' | '...' + (_tmp_146_var = _tmp_146_rule(p)) // '.' | '...' ) { - _res = _tmp_141_var; + _res = _tmp_146_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19869,12 +19998,12 @@ _loop1_68_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); - void *_tmp_142_var; + void *_tmp_147_var; while ( - (_tmp_142_var = _tmp_142_rule(p)) // '@' named_expression NEWLINE + (_tmp_147_var = _tmp_147_rule(p)) // '@' named_expression NEWLINE ) { - _res = _tmp_142_var; + _res = _tmp_147_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19987,12 +20116,12 @@ _loop1_70_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); - void *_tmp_143_var; + void *_tmp_148_var; while ( - (_tmp_143_var = _tmp_143_rule(p)) // ',' star_expression + (_tmp_148_var = _tmp_148_rule(p)) // ',' star_expression ) { - _res = _tmp_143_var; + _res = _tmp_148_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -20172,12 +20301,12 @@ _loop1_73_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); - void *_tmp_144_var; + void *_tmp_149_var; while ( - (_tmp_144_var = _tmp_144_rule(p)) // ',' expression + (_tmp_149_var = _tmp_149_rule(p)) // ',' expression ) { - _res = _tmp_144_var; + _res = _tmp_149_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21202,12 +21331,12 @@ _loop1_88_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); - void *_tmp_145_var; + void *_tmp_150_var; while ( - (_tmp_145_var = _tmp_145_rule(p)) // 'or' conjunction + (_tmp_150_var = _tmp_150_rule(p)) // 'or' conjunction ) { - _res = _tmp_145_var; + _res = _tmp_150_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21273,12 +21402,12 @@ _loop1_89_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); - void *_tmp_146_var; + void *_tmp_151_var; while ( - (_tmp_146_var = _tmp_146_rule(p)) // 'and' inversion + (_tmp_151_var = _tmp_151_rule(p)) // 'and' inversion ) { - _res = _tmp_146_var; + _res = _tmp_151_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22194,12 +22323,12 @@ _loop0_104_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_147_var; + void *_tmp_152_var; while ( - (_tmp_147_var = _tmp_147_rule(p)) // 'if' disjunction + (_tmp_152_var = _tmp_152_rule(p)) // 'if' disjunction ) { - _res = _tmp_147_var; + _res = _tmp_152_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22260,12 +22389,12 @@ _loop0_105_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_148_var; + void *_tmp_153_var; while ( - (_tmp_148_var = _tmp_148_rule(p)) // 'if' disjunction + (_tmp_153_var = _tmp_153_rule(p)) // 'if' disjunction ) { - _res = _tmp_148_var; + _res = _tmp_153_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22331,7 +22460,7 @@ _loop0_107_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_154_rule(p)) // starred_expression | named_expression !'=' ) { _res = elem; @@ -22394,7 +22523,7 @@ _gather_106_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_154_rule(p)) // starred_expression | named_expression !'=' && (seq = _loop0_107_rule(p)) // _loop0_107 ) @@ -22940,12 +23069,12 @@ _loop0_117_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_150_var; + void *_tmp_155_var; while ( - (_tmp_150_var = _tmp_150_rule(p)) // ',' star_target + (_tmp_155_var = _tmp_155_rule(p)) // ',' star_target ) { - _res = _tmp_150_var; + _res = _tmp_155_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23120,12 +23249,12 @@ _loop1_120_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_151_var; + void *_tmp_156_var; while ( - (_tmp_151_var = _tmp_151_rule(p)) // ',' star_target + (_tmp_156_var = _tmp_156_rule(p)) // ',' star_target ) { - _res = _tmp_151_var; + _res = _tmp_156_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23581,12 +23710,12 @@ _loop0_128_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_152_var; + void *_tmp_157_var; while ( - (_tmp_152_var = _tmp_152_rule(p)) // star_targets '=' + (_tmp_157_var = _tmp_157_rule(p)) // star_targets '=' ) { - _res = _tmp_152_var; + _res = _tmp_157_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23647,12 +23776,12 @@ _loop0_129_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_153_var; + void *_tmp_158_var; while ( - (_tmp_153_var = _tmp_153_rule(p)) // star_targets '=' + (_tmp_158_var = _tmp_158_rule(p)) // star_targets '=' ) { - _res = _tmp_153_var; + _res = _tmp_158_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -24181,15 +24310,15 @@ _tmp_137_rule(Parser *p) } D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); Token * _literal; - void *_tmp_154_var; + void *_tmp_159_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_154_var = _tmp_154_rule(p)) // ')' | '**' + (_tmp_159_var = _tmp_159_rule(p)) // ')' | '**' ) { D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_154_var); + _res = _PyPegen_dummy_name(p, _literal, _tmp_159_var); goto done; } p->mark = _mark; @@ -24239,15 +24368,15 @@ _tmp_138_rule(Parser *p) } D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); Token * _literal; - void *_tmp_155_var; + void *_tmp_160_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_155_var = _tmp_155_rule(p)) // ':' | '**' + (_tmp_160_var = _tmp_160_rule(p)) // ':' | '**' ) { D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_155_var); + _res = _PyPegen_dummy_name(p, _literal, _tmp_160_var); goto done; } p->mark = _mark; @@ -24260,7 +24389,7 @@ _tmp_138_rule(Parser *p) return _res; } -// _tmp_139: star_targets '=' +// _tmp_139: ',' | ')' | ':' static void * _tmp_139_rule(Parser *p) { @@ -24271,87 +24400,62 @@ _tmp_139_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // star_targets '=' + { // ',' if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; - expr_ty z; if ( - (z = star_targets_rule(p)) // star_targets - && - (_literal = _PyPegen_expect_token(p, 22)) // token='=' + (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); - _res = z; - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - D(p->level--); - return NULL; - } + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + _res = _literal; goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); - } - _res = NULL; - done: - D(p->level--); - return _res; -} - -// _tmp_140: '.' | '...' -static void * -_tmp_140_rule(Parser *p) -{ - D(p->level++); - if (p->error_indicator) { - D(p->level--); - return NULL; + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } - void * _res = NULL; - int _mark = p->mark; - { // '.' + { // ')' if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( - (_literal = _PyPegen_expect_token(p, 23)) // token='.' + (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } - { // '...' + { // ':' if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( - (_literal = _PyPegen_expect_token(p, 52)) // token='...' + (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; done: @@ -24359,54 +24463,113 @@ _tmp_140_rule(Parser *p) return _res; } -// _tmp_141: '.' | '...' -static void * -_tmp_141_rule(Parser *p) +// _loop0_141: ',' (expression ['as' star_target]) +static asdl_seq * +_loop0_141_rule(Parser *p) { D(p->level++); if (p->error_indicator) { D(p->level--); return NULL; } - void * _res = NULL; + void *_res = NULL; int _mark = p->mark; - { // '.' + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' (expression ['as' star_target]) if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _loop0_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); Token * _literal; - if ( - (_literal = _PyPegen_expect_token(p, 23)) // token='.' + void *elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = _tmp_161_rule(p)) // expression ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); - _res = _literal; - goto done; + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c%s _loop0_141[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])")); } - { // '...' + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_141_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_140: (expression ['as' star_target]) _loop0_141 +static asdl_seq * +_gather_140_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // (expression ['as' star_target]) _loop0_141 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); - Token * _literal; + D(fprintf(stderr, "%*c> _gather_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_141")); + void *elem; + asdl_seq * seq; if ( - (_literal = _PyPegen_expect_token(p, 52)) // token='...' + (elem = _tmp_161_rule(p)) // expression ['as' star_target] + && + (seq = _loop0_141_rule(p)) // _loop0_141 ) { - D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); - _res = _literal; + D(fprintf(stderr, "%*c+ _gather_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_141")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c%s _gather_140[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_141")); } _res = NULL; done: @@ -24414,23 +24577,291 @@ _tmp_141_rule(Parser *p) return _res; } -// _tmp_142: '@' named_expression NEWLINE -static void * -_tmp_142_rule(Parser *p) +// _loop0_143: ',' (expressions ['as' star_target]) +static asdl_seq * +_loop0_143_rule(Parser *p) { D(p->level++); if (p->error_indicator) { D(p->level--); return NULL; } - void * _res = NULL; + void *_res = NULL; int _mark = p->mark; - { // '@' named_expression NEWLINE - if (p->error_indicator) { - D(p->level--); + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' (expressions ['as' star_target]) + if (p->error_indicator) { + D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c> _loop0_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); + Token * _literal; + void *elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = _tmp_162_rule(p)) // expressions ['as' star_target] + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_143[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_143_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_142: (expressions ['as' star_target]) _loop0_143 +static asdl_seq * +_gather_142_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // (expressions ['as' star_target]) _loop0_143 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_143")); + void *elem; + asdl_seq * seq; + if ( + (elem = _tmp_162_rule(p)) // expressions ['as' star_target] + && + (seq = _loop0_143_rule(p)) // _loop0_143 + ) + { + D(fprintf(stderr, "%*c+ _gather_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_143")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_142[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_143")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_144: star_targets '=' +static void * +_tmp_144_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // star_targets '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + Token * _literal; + expr_ty z; + if ( + (z = star_targets_rule(p)) // star_targets + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_145: '.' | '...' +static void * +_tmp_145_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '.' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + } + { // '...' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 52)) // token='...' + ) + { + D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_146: '.' | '...' +static void * +_tmp_146_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '.' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + } + { // '...' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 52)) // token='...' + ) + { + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_147: '@' named_expression NEWLINE +static void * +_tmp_147_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '@' named_expression NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); Token * _literal; expr_ty f; Token * newline_var; @@ -24442,7 +24873,7 @@ _tmp_142_rule(Parser *p) (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); _res = f; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24452,7 +24883,7 @@ _tmp_142_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_142[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); } _res = NULL; @@ -24461,9 +24892,9 @@ _tmp_142_rule(Parser *p) return _res; } -// _tmp_143: ',' star_expression +// _tmp_148: ',' star_expression static void * -_tmp_143_rule(Parser *p) +_tmp_148_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24477,7 +24908,7 @@ _tmp_143_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); Token * _literal; expr_ty c; if ( @@ -24486,7 +24917,7 @@ _tmp_143_rule(Parser *p) (c = star_expression_rule(p)) // star_expression ) { - D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24496,7 +24927,7 @@ _tmp_143_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } _res = NULL; @@ -24505,9 +24936,9 @@ _tmp_143_rule(Parser *p) return _res; } -// _tmp_144: ',' expression +// _tmp_149: ',' expression static void * -_tmp_144_rule(Parser *p) +_tmp_149_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24521,7 +24952,7 @@ _tmp_144_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty c; if ( @@ -24530,7 +24961,7 @@ _tmp_144_rule(Parser *p) (c = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24540,7 +24971,7 @@ _tmp_144_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -24549,9 +24980,9 @@ _tmp_144_rule(Parser *p) return _res; } -// _tmp_145: 'or' conjunction +// _tmp_150: 'or' conjunction static void * -_tmp_145_rule(Parser *p) +_tmp_150_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24565,7 +24996,7 @@ _tmp_145_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); Token * _keyword; expr_ty c; if ( @@ -24574,7 +25005,7 @@ _tmp_145_rule(Parser *p) (c = conjunction_rule(p)) // conjunction ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24584,7 +25015,7 @@ _tmp_145_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); } _res = NULL; @@ -24593,9 +25024,9 @@ _tmp_145_rule(Parser *p) return _res; } -// _tmp_146: 'and' inversion +// _tmp_151: 'and' inversion static void * -_tmp_146_rule(Parser *p) +_tmp_151_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24609,7 +25040,7 @@ _tmp_146_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); Token * _keyword; expr_ty c; if ( @@ -24618,7 +25049,7 @@ _tmp_146_rule(Parser *p) (c = inversion_rule(p)) // inversion ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24628,7 +25059,7 @@ _tmp_146_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); } _res = NULL; @@ -24637,9 +25068,9 @@ _tmp_146_rule(Parser *p) return _res; } -// _tmp_147: 'if' disjunction +// _tmp_152: 'if' disjunction static void * -_tmp_147_rule(Parser *p) +_tmp_152_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24653,7 +25084,7 @@ _tmp_147_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -24662,7 +25093,7 @@ _tmp_147_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24672,7 +25103,7 @@ _tmp_147_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -24681,9 +25112,9 @@ _tmp_147_rule(Parser *p) return _res; } -// _tmp_148: 'if' disjunction +// _tmp_153: 'if' disjunction static void * -_tmp_148_rule(Parser *p) +_tmp_153_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24697,7 +25128,7 @@ _tmp_148_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -24706,7 +25137,7 @@ _tmp_148_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24716,7 +25147,7 @@ _tmp_148_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -24725,9 +25156,9 @@ _tmp_148_rule(Parser *p) return _res; } -// _tmp_149: starred_expression | named_expression !'=' +// _tmp_154: starred_expression | named_expression !'=' static void * -_tmp_149_rule(Parser *p) +_tmp_154_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24741,18 +25172,18 @@ _tmp_149_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } { // named_expression !'=' @@ -24760,7 +25191,7 @@ _tmp_149_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); expr_ty named_expression_var; if ( (named_expression_var = named_expression_rule(p)) // named_expression @@ -24768,12 +25199,12 @@ _tmp_149_rule(Parser *p) _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); _res = named_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression !'='")); } _res = NULL; @@ -24782,9 +25213,9 @@ _tmp_149_rule(Parser *p) return _res; } -// _tmp_150: ',' star_target +// _tmp_155: ',' star_target static void * -_tmp_150_rule(Parser *p) +_tmp_155_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24798,7 +25229,7 @@ _tmp_150_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -24807,7 +25238,7 @@ _tmp_150_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24817,7 +25248,7 @@ _tmp_150_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -24826,9 +25257,9 @@ _tmp_150_rule(Parser *p) return _res; } -// _tmp_151: ',' star_target +// _tmp_156: ',' star_target static void * -_tmp_151_rule(Parser *p) +_tmp_156_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24842,7 +25273,7 @@ _tmp_151_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -24851,7 +25282,7 @@ _tmp_151_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24861,7 +25292,7 @@ _tmp_151_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -24870,9 +25301,9 @@ _tmp_151_rule(Parser *p) return _res; } -// _tmp_152: star_targets '=' +// _tmp_157: star_targets '=' static void * -_tmp_152_rule(Parser *p) +_tmp_157_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24886,7 +25317,7 @@ _tmp_152_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -24895,12 +25326,12 @@ _tmp_152_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24909,9 +25340,9 @@ _tmp_152_rule(Parser *p) return _res; } -// _tmp_153: star_targets '=' +// _tmp_158: star_targets '=' static void * -_tmp_153_rule(Parser *p) +_tmp_158_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24925,7 +25356,7 @@ _tmp_153_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -24934,12 +25365,12 @@ _tmp_153_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24948,9 +25379,9 @@ _tmp_153_rule(Parser *p) return _res; } -// _tmp_154: ')' | '**' +// _tmp_159: ')' | '**' static void * -_tmp_154_rule(Parser *p) +_tmp_159_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24964,18 +25395,18 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // '**' @@ -24983,18 +25414,18 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -25003,9 +25434,9 @@ _tmp_154_rule(Parser *p) return _res; } -// _tmp_155: ':' | '**' +// _tmp_160: ':' | '**' static void * -_tmp_155_rule(Parser *p) +_tmp_160_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25019,18 +25450,18 @@ _tmp_155_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '**' @@ -25038,18 +25469,18 @@ _tmp_155_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -25058,6 +25489,164 @@ _tmp_155_rule(Parser *p) return _res; } +// _tmp_161: expression ['as' star_target] +static void * +_tmp_161_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // expression ['as' star_target] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression + && + (_opt_var = _tmp_163_rule(p), 1) // ['as' star_target] + ) + { + D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + _res = _PyPegen_dummy_name(p, expression_var, _opt_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_162: expressions ['as' star_target] +static void * +_tmp_162_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // expressions ['as' star_target] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty expressions_var; + if ( + (expressions_var = expressions_rule(p)) // expressions + && + (_opt_var = _tmp_164_rule(p), 1) // ['as' star_target] + ) + { + D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + _res = _PyPegen_dummy_name(p, expressions_var, _opt_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions ['as' star_target]")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_163: 'as' star_target +static void * +_tmp_163_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' star_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + Token * _keyword; + expr_ty star_target_var; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (star_target_var = star_target_rule(p)) // star_target + ) + { + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + _res = _PyPegen_dummy_name(p, _keyword, star_target_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_164: 'as' star_target +static void * +_tmp_164_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' star_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + Token * _keyword; + expr_ty star_target_var; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (star_target_var = star_target_rule(p)) // star_target + ) + { + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + _res = _PyPegen_dummy_name(p, _keyword, star_target_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + void * _PyPegen_parse(Parser *p) { diff --git a/Parser/pegen.c b/Parser/pegen.c index 2554273877f783..68f0e329f083d1 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -782,7 +782,6 @@ _PyPegen_is_memoized(Parser *p, int type, void *pres) return 0; } - int _PyPegen_lookahead_with_name(int positive, expr_ty (func)(Parser *), Parser *p) { @@ -836,6 +835,28 @@ _PyPegen_expect_token(Parser *p, int type) return t; } +Token * +_PyPegen_expect_forced_token(Parser *p, int type, const char* expected) { + + if (p->error_indicator == 1) { + return NULL; + } + + if (p->mark == p->fill) { + if (_PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + return NULL; + } + } + Token *t = p->tokens[p->mark]; + if (t->type != type) { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(t, "expected '%s'", expected); + return NULL; + } + p->mark += 1; + return t; +} + expr_ty _PyPegen_expect_soft_keyword(Parser *p, const char *keyword) { diff --git a/Parser/pegen.h b/Parser/pegen.h index f82a3a00b2ba01..2a165c12d252c1 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -102,10 +102,7 @@ typedef struct { arg_ty kwarg; } StarEtc; -typedef struct { - operator_ty kind; -} AugOperator; - +typedef struct { operator_ty kind; } AugOperator; typedef struct { void *element; int is_keyword; @@ -118,12 +115,14 @@ int _PyPegen_insert_memo(Parser *p, int mark, int type, void *node); int _PyPegen_update_memo(Parser *p, int mark, int type, void *node); int _PyPegen_is_memoized(Parser *p, int type, void *pres); + int _PyPegen_lookahead_with_name(int, expr_ty (func)(Parser *), Parser *); int _PyPegen_lookahead_with_int(int, Token *(func)(Parser *, int), Parser *, int); int _PyPegen_lookahead_with_string(int , expr_ty (func)(Parser *, const char*), Parser *, const char*); int _PyPegen_lookahead(int, void *(func)(Parser *), Parser *); Token *_PyPegen_expect_token(Parser *p, int type); +Token *_PyPegen_expect_forced_token(Parser *p, int type, const char* expected); expr_ty _PyPegen_expect_soft_keyword(Parser *p, const char *keyword); Token *_PyPegen_get_last_nonnwhitespace_token(Parser *); int _PyPegen_fill_token(Parser *p); diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index 6af0d3f7a2a14d..f5ef5d8d3340ea 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -8,6 +8,7 @@ from pegen.grammar import ( Alt, Cut, + Forced, Gather, GrammarVisitor, Group, @@ -252,6 +253,24 @@ def visit_PositiveLookahead(self, node: PositiveLookahead) -> FunctionCall: def visit_NegativeLookahead(self, node: NegativeLookahead) -> FunctionCall: return self.lookahead_call_helper(node, 0) + def visit_Forced(self, node: Forced) -> FunctionCall: + call = self.generate_call(node.node) + if call.nodetype == NodeTypes.GENERIC_TOKEN: + val = ast.literal_eval(node.node.value) + assert val in self.exact_tokens, f"{node.value} is not a known literal" + type = self.exact_tokens[val] + return FunctionCall( + assigned_variable="_literal", + function=f"_PyPegen_expect_forced_token", + arguments=["p", type, f'"{val}"'], + nodetype=NodeTypes.GENERIC_TOKEN, + return_type="Token *", + comment=f"forced_token='{val}'", + ) + else: + raise NotImplementedError( + f"Forced tokens don't work with {call.nodetype} tokens") + def visit_Opt(self, node: Opt) -> FunctionCall: call = self.generate_call(node.node) return FunctionCall( diff --git a/Tools/peg_generator/pegen/grammar.py b/Tools/peg_generator/pegen/grammar.py index 332ee3c3eec5e2..66fd5b329a5136 100644 --- a/Tools/peg_generator/pegen/grammar.py +++ b/Tools/peg_generator/pegen/grammar.py @@ -288,6 +288,23 @@ def collect_todo(self, gen: ParserGenerator) -> None: gen.callmakervisitor.visit(self.item) +class Forced: + def __init__(self, node: Plain): + self.node = node + + def __str__(self) -> str: + return f"&&{self.node}" + + def __iter__(self) -> Iterator[Plain]: + yield self.node + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return True + + def initial_names(self) -> AbstractSet[str]: + return set() + + class Lookahead: def __init__(self, node: Plain, sign: str): self.node = node @@ -459,7 +476,7 @@ def initial_names(self) -> AbstractSet[str]: Plain = Union[Leaf, Group] -Item = Union[Plain, Opt, Repeat, Lookahead, Rhs, Cut] +Item = Union[Plain, Opt, Repeat, Forced, Lookahead, Rhs, Cut] RuleName = Tuple[str, str] MetaTuple = Tuple[str, Optional[str]] MetaList = List[MetaTuple] diff --git a/Tools/peg_generator/pegen/grammar_parser.py b/Tools/peg_generator/pegen/grammar_parser.py index 6e3bc5068f5a76..fde0145ee88912 100644 --- a/Tools/peg_generator/pegen/grammar_parser.py +++ b/Tools/peg_generator/pegen/grammar_parser.py @@ -13,6 +13,7 @@ from pegen.grammar import ( Alt, Cut, + Forced, Gather, Group, Item, @@ -402,7 +403,7 @@ def items(self) -> Optional[NamedItemList]: @memoize def named_item(self) -> Optional[NamedItem]: - # named_item: NAME '[' NAME '*' ']' '=' ~ item | NAME '[' NAME ']' '=' ~ item | NAME '=' ~ item | item | lookahead + # named_item: NAME '[' NAME '*' ']' '=' ~ item | NAME '[' NAME ']' '=' ~ item | NAME '=' ~ item | item | forced_atom | lookahead mark = self.mark() cut = False if ( @@ -465,6 +466,13 @@ def named_item(self) -> Optional[NamedItem]: self.reset(mark) if cut: return None cut = False + if ( + (it := self.forced_atom()) + ): + return NamedItem ( None , it ) + self.reset(mark) + if cut: return None + cut = False if ( (it := self.lookahead()) ): @@ -473,6 +481,25 @@ def named_item(self) -> Optional[NamedItem]: if cut: return None return None + @memoize + def forced_atom(self) -> Optional[NamedItem]: + # forced_atom: '&' '&' ~ atom + mark = self.mark() + cut = False + if ( + (literal := self.expect('&')) + and + (literal_1 := self.expect('&')) + and + (cut := True) + and + (atom := self.atom()) + ): + return Forced ( atom ) + self.reset(mark) + if cut: return None + return None + @memoize def lookahead(self) -> Optional[LookaheadOrCut]: # lookahead: '&' ~ atom | '!' ~ atom | '~' diff --git a/Tools/peg_generator/pegen/metagrammar.gram b/Tools/peg_generator/pegen/metagrammar.gram index 4802f56b68f7b6..bb4355fd189e05 100644 --- a/Tools/peg_generator/pegen/metagrammar.gram +++ b/Tools/peg_generator/pegen/metagrammar.gram @@ -4,6 +4,7 @@ from ast import literal_eval from pegen.grammar import ( Alt, Cut, + Forced, Gather, Group, Item, @@ -87,8 +88,12 @@ named_item[NamedItem]: | NAME '[' type=NAME ']' '=' ~ item {NamedItem(name.string, item, type.string)} | NAME '=' ~ item {NamedItem(name.string, item)} | item {NamedItem(None, item)} + | it=forced_atom {NamedItem(None, it)} | it=lookahead {NamedItem(None, it)} +forced_atom[NamedItem]: + | '&''&' ~ atom {Forced(atom)} + lookahead[LookaheadOrCut]: | '&' ~ atom {PositiveLookahead(atom)} | '!' ~ atom {NegativeLookahead(atom)} From 9df7daf7e833e4e4d48295516f7d08806b0b40a7 Mon Sep 17 00:00:00 2001 From: BarneyStratford Date: Tue, 2 Feb 2021 20:24:24 +0000 Subject: [PATCH 1107/1261] bpo-41149: Fix a bug in threading that causes fals-y threads callables to fail to start. (GH-21201) --- Lib/test/test_threading.py | 20 +++++++++++++++++++ Lib/threading.py | 2 +- .../2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 0a4372ec2df39f..a7a716ed59fc4c 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -855,6 +855,26 @@ def __del__(self): """) self.assertEqual(out.rstrip(), b"thread_dict.atexit = 'value'") + def test_boolean_target(self): + # bpo-41149: A thread that had a boolean value of False would not + # run, regardless of whether it was callable. The correct behaviour + # is for a thread to do nothing if its target is None, and to call + # the target otherwise. + class BooleanTarget(object): + def __init__(self): + self.ran = False + def __bool__(self): + return False + def __call__(self): + self.ran = True + + target = BooleanTarget() + thread = threading.Thread(target=target) + thread.start() + thread.join() + self.assertTrue(target.ran) + + class ThreadJoinOnShutdown(BaseTestCase): diff --git a/Lib/threading.py b/Lib/threading.py index 7b3d63dd211ea4..ff2624a3e1e49e 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -906,7 +906,7 @@ def run(self): """ try: - if self._target: + if self._target is not None: self._target(*self._args, **self._kwargs) finally: # Avoid a refcycle if the thread is running a function with diff --git a/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst b/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst new file mode 100644 index 00000000000000..abe09016a65251 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst @@ -0,0 +1 @@ +Allow executing callables that have a boolean value of ``False`` when passed to :class:`Threading.thread` as the target. Patch contributed by Barney Stratford. From c335205ee8e38efc229ac1446e1ac38664df80c4 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 2 Feb 2021 20:38:26 +0000 Subject: [PATCH 1108/1261] bpo-43108: Fix a reference leak in the curses module (GH-24420) --- .../next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst | 1 + Modules/_cursesmodule.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst diff --git a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst new file mode 100644 index 00000000000000..8e45640bceae13 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst @@ -0,0 +1 @@ +Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 4fcedc5fc4820f..3df9f506052d3a 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -388,6 +388,7 @@ PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj, *bytes = obj; /* check for embedded null bytes */ if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) { + Py_DECREF(obj); return 0; } return 1; @@ -828,8 +829,9 @@ _curses_window_addstr_impl(PyCursesWindowObject *self, int group_left_1, #else strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL); #endif - if (strtype == 0) + if (strtype == 0) { return NULL; + } if (use_attr) { attr_old = getattrs(self->win); (void)wattrset(self->win,attr); From 67cf266c023660520f64752143da3e541a299e12 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 2 Feb 2021 20:41:05 +0000 Subject: [PATCH 1109/1261] Python 3.10.0a5 --- Misc/NEWS.d/3.10.0a5.rst | 670 ++++++++++++++++++ .../2021-01-07-12-51-38.bpo-42856.n3cMHV.rst | 9 - .../2021-01-11-23-26-00.bpo-31904.ty8f3h.rst | 1 - .../2021-01-12-10-06-50.bpo-42874.XKK61g.rst | 3 - .../2021-01-18-20-52-06.bpo-36143.kgnIYo.rst | 1 - .../2021-01-26-14-48-40.bpo-43031.44nK9U.rst | 2 - .../2021-01-27-10-27-47.bpo-43030.loDcD_.rst | 2 - .../2021-01-28-01-11-59.bpo-42979.JrGkrm.rst | 5 - .../2018-12-20-23-59-23.bpo-27772.idHEcj.rst | 2 - .../2020-10-10-14-16-03.bpo-41994.Xop8sV.rst | 1 - .../2020-12-12-20-09-12.bpo-37324.jB-9_U.rst | 2 - .../2021-01-04-18-17-07.bpo-42823.dcSynu.rst | 1 - .../2021-01-06-17-06-37.bpo-42827.jtRR0D.rst | 2 - .../2021-01-11-17-58-52.bpo-42882.WfTdfg.rst | 3 - .../2021-01-13-14-06-01.bpo-42924._WS1Ok.rst | 1 - .../2021-01-14-23-15-34.bpo-42864.QgOAQ1.rst | 2 - .../2021-01-15-20-05-56.bpo-42927.GI-l-7.rst | 2 - .../2021-01-20-22-31-01.bpo-40176.anjyWw.rst | 2 - .../2021-01-20-23-44-15.bpo-42986.sWoaGf.rst | 2 - .../2021-01-24-18-02-05.bpo-43017.emEcXX.rst | 2 - .../2021-01-24-20-19-55.bpo-42997.QUOPgP.rst | 1 - .../2021-01-29-17-48-44.bpo-38631.jR-3kC.rst | 2 - .../2021-01-30-11-31-44.bpo-42990.69h_zK.rst | 5 - .../2021-01-04-22-14-22.bpo-42811.HY2beA.rst | 2 - .../2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst | 2 - .../2019-06-30-20-31-09.bpo-32631.e7_4BG.rst | 2 - .../2019-11-14-23-41-07.bpo-23544.3etemb.rst | 2 - .../2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst | 1 - .../2021-01-26-18-12-17.bpo-43008.mbQUc7.rst | 2 - .../2018-04-23-13-44-10.bpo-33289.anBnUr.rst | 2 - .../2020-01-13-23-37-58.bpo-39273.m5hzxV.rst | 2 - .../2020-03-16-03-03-21.bpo-38307.2cmw2i.rst | 3 - .../2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst | 1 - .../2020-08-21-15-24-14.bpo-41604.rTXleO.rst | 2 - .../2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst | 2 - .../2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst | 2 - .../2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst | 1 - .../2020-12-30-14-56-25.bpo-24464.vbNVHe.rst | 3 - .../2021-01-01-15-29-16.bpo-42802.Lw-bzl.rst | 3 - ...2021-01-04-15-05-40.bpo-1635741.EOCfZY.rst | 2 - .../2021-01-05-00-52-30.bpo-40810.JxQqPe.rst | 1 - .../2021-01-05-21-26-29.bpo-41748.KdC0w3.rst | 2 - .../2021-01-05-23-55-24.bpo-42834.LxRnZC.rst | 1 - .../2021-01-07-11-44-22.bpo-42851.uyQFyd.rst | 1 - .../2021-01-07-23-31-17.bpo-42846.kukDjw.rst | 3 - .../2021-01-08-10-57-21.bpo-42866.Y1DnrO.rst | 2 - .../2021-01-08-15-49-20.bpo-42780.rtqi6B.rst | 1 - .../2021-01-11-17-36-59.bpo-42901.gFd-ta.rst | 3 - .../2021-01-12-19-34-06.bpo-42848.5G8oBl.rst | 1 - .../2021-01-13-12-15-13.bpo-42923.zBiNls.rst | 2 - .../2021-01-13-12-55-41.bpo-42877.Fi1zEG.rst | 4 - .../2021-01-14-15-07-16.bpo-38250.1fvhOk.rst | 5 - .../2021-01-15-00-23-50.bpo-42931.QD6U2B.rst | 1 - .../2021-01-15-11-48-00.bpo-42934.ILKoOI.rst | 3 - .../2021-01-18-10-41-44.bpo-42944.RrONvy.rst | 1 - .../2021-01-18-11-59-46.bpo-42955.CSWLC9.rst | 2 - .../2021-01-20-12-10-47.bpo-42323.PONB8e.rst | 1 - .../2021-01-24-00-37-40.bpo-43014.BVPhEr.rst | 1 - .../2021-01-27-20-49-32.bpo-41282.SEPdV0.rst | 1 - .../2021-01-30-15-20-06.bpo-43077.Owk61z.rst | 1 - .../2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst | 1 - .../2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst | 2 - .../2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst | 1 - .../2020-05-30-13-39-22.bpo-40823.yB7K5w.rst | 2 - .../2020-12-07-11-40-52.bpo-42584.AsYnVX.rst | 1 - .../2021-01-05-20-36-40.bpo-41837.bmS7vB.rst | 1 - .../2021-01-26-14-36-11.bpo-42504.ZxWt71.rst | 3 - 67 files changed, 670 insertions(+), 135 deletions(-) create mode 100644 Misc/NEWS.d/3.10.0a5.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-01-07-12-51-38.bpo-42856.n3cMHV.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-01-11-23-26-00.bpo-31904.ty8f3h.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-01-12-10-06-50.bpo-42874.XKK61g.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-01-18-20-52-06.bpo-36143.kgnIYo.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-01-26-14-48-40.bpo-43031.44nK9U.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-01-28-01-11-59.bpo-42979.JrGkrm.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-10-14-16-03.bpo-41994.Xop8sV.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-12-12-20-09-12.bpo-37324.jB-9_U.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-04-18-17-07.bpo-42823.dcSynu.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-06-17-06-37.bpo-42827.jtRR0D.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-11-17-58-52.bpo-42882.WfTdfg.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-13-14-06-01.bpo-42924._WS1Ok.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-14-23-15-34.bpo-42864.QgOAQ1.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-15-20-05-56.bpo-42927.GI-l-7.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-20-22-31-01.bpo-40176.anjyWw.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-29-17-48-44.bpo-38631.jR-3kC.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-13-23-37-58.bpo-39273.m5hzxV.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-12-30-14-56-25.bpo-24464.vbNVHe.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-01-15-29-16.bpo-42802.Lw-bzl.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-04-15-05-40.bpo-1635741.EOCfZY.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-05-00-52-30.bpo-40810.JxQqPe.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-07-23-31-17.bpo-42846.kukDjw.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-08-10-57-21.bpo-42866.Y1DnrO.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-11-17-36-59.bpo-42901.gFd-ta.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-12-19-34-06.bpo-42848.5G8oBl.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-13-12-15-13.bpo-42923.zBiNls.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-13-12-55-41.bpo-42877.Fi1zEG.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-14-15-07-16.bpo-38250.1fvhOk.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-15-11-48-00.bpo-42934.ILKoOI.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-20-12-10-47.bpo-42323.PONB8e.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-24-00-37-40.bpo-43014.BVPhEr.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-27-20-49-32.bpo-41282.SEPdV0.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-30-15-20-06.bpo-43077.Owk61z.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst delete mode 100644 Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-05-30-13-39-22.bpo-40823.yB7K5w.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst delete mode 100644 Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst delete mode 100644 Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst diff --git a/Misc/NEWS.d/3.10.0a5.rst b/Misc/NEWS.d/3.10.0a5.rst new file mode 100644 index 00000000000000..3362d494602d4e --- /dev/null +++ b/Misc/NEWS.d/3.10.0a5.rst @@ -0,0 +1,670 @@ +.. bpo: 42938 +.. date: 2021-01-18-09-27-31 +.. nonce: 4Zn4Mp +.. release date: 2021-02-02 +.. section: Security + +Avoid static buffers when computing the repr of :class:`ctypes.c_double` and +:class:`ctypes.c_longdouble` values. + +.. + +.. bpo: 42990 +.. date: 2021-01-30-11-31-44 +.. nonce: 69h_zK +.. section: Core and Builtins + +Refactor the ``PyEval_`` family of functions. + +* An new function ``_PyEval_Vector`` is added to simplify calls to Python from C. +* ``_PyEval_EvalCodeWithName`` is removed +* ``PyEval_EvalCodeEx`` is retained as part of the API, but is not used internally + +.. + +.. bpo: 38631 +.. date: 2021-01-29-17-48-44 +.. nonce: jR-3kC +.. section: Core and Builtins + +Replace :c:func:`Py_FatalError` calls in the compiler with regular +:exc:`SystemError` exceptions. Patch by Victor Stinner. + +.. + +.. bpo: 42997 +.. date: 2021-01-24-20-19-55 +.. nonce: QUOPgP +.. section: Core and Builtins + +Improve error message for missing ":" before blocks. Patch by Pablo Galindo. + +.. + +.. bpo: 43017 +.. date: 2021-01-24-18-02-05 +.. nonce: emEcXX +.. section: Core and Builtins + +Improve error message in the parser when using un-parenthesised tuples in +comprehensions. Patch by Pablo Galindo. + +.. + +.. bpo: 42986 +.. date: 2021-01-20-23-44-15 +.. nonce: sWoaGf +.. section: Core and Builtins + +Fix parser crash when reporting syntax errors in f-string with newlines. +Patch by Pablo Galindo. + +.. + +.. bpo: 40176 +.. date: 2021-01-20-22-31-01 +.. nonce: anjyWw +.. section: Core and Builtins + +Syntax errors for unterminated string literals now point to the start of the +string instead of reporting EOF/EOL. + +.. + +.. bpo: 42927 +.. date: 2021-01-15-20-05-56 +.. nonce: GI-l-7 +.. section: Core and Builtins + +The inline cache for ``LOAD_ATTR`` now also optimizes access to attributes +defined by ``__slots__``. This makes reading such attribute up to 30% +faster. + +.. + +.. bpo: 42864 +.. date: 2021-01-14-23-15-34 +.. nonce: QgOAQ1 +.. section: Core and Builtins + +Improve error messages in the parser when parentheses are not closed. Patch +by Pablo Galindo. + +.. + +.. bpo: 42924 +.. date: 2021-01-13-14-06-01 +.. nonce: _WS1Ok +.. section: Core and Builtins + +Fix ``bytearray`` repetition incorrectly copying data from the start of the +buffer, even if the data is offset within the buffer (e.g. after reassigning +a slice at the start of the ``bytearray`` to a shorter byte string). + +.. + +.. bpo: 42882 +.. date: 2021-01-11-17-58-52 +.. nonce: WfTdfg +.. section: Core and Builtins + +Fix the :c:func:`_PyUnicode_FromId` function (_Py_IDENTIFIER(var) API) when +:c:func:`Py_Initialize` / :c:func:`Py_Finalize` is called multiple times: +preserve ``_PyRuntime.unicode_ids.next_index`` value. + +.. + +.. bpo: 42827 +.. date: 2021-01-06-17-06-37 +.. nonce: jtRR0D +.. section: Core and Builtins + +Fix a crash when working out the error line of a :exc:`SyntaxError` in some +multi-line expressions. + +.. + +.. bpo: 42823 +.. date: 2021-01-04-18-17-07 +.. nonce: dcSynu +.. section: Core and Builtins + +frame.f_lineno is correct even if frame.f_trace is set to True + +.. + +.. bpo: 37324 +.. date: 2020-12-12-20-09-12 +.. nonce: jB-9_U +.. section: Core and Builtins + +Remove deprecated aliases to :ref:`collections-abstract-base-classes` from +the :mod:`collections` module. + +.. + +.. bpo: 41994 +.. date: 2020-10-10-14-16-03 +.. nonce: Xop8sV +.. section: Core and Builtins + +Fixed possible leak in ``import`` when ``sys.modules`` is not a ``dict``. + +.. + +.. bpo: 27772 +.. date: 2018-12-20-23-59-23 +.. nonce: idHEcj +.. section: Core and Builtins + +In string formatting, preceding the *width* field by ``'0'`` no longer +affects the default alignment for strings. + +.. + +.. bpo: 43108 +.. date: 2021-02-02-20-23-31 +.. nonce: lqcCZ6 +.. section: Library + +Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo + +.. + +.. bpo: 43077 +.. date: 2021-01-30-15-20-06 +.. nonce: Owk61z +.. section: Library + +Update the bundled pip to 21.0.1 and setuptools to 52.0.0. + +.. + +.. bpo: 41282 +.. date: 2021-01-27-20-49-32 +.. nonce: SEPdV0 +.. section: Library + +Deprecate ``distutils`` in documentation and add warning on import. + +.. + +.. bpo: 43014 +.. date: 2021-01-24-00-37-40 +.. nonce: BVPhEr +.. section: Library + +Improve performance of :mod:`tokenize` by 20-30%. Patch by Anthony Sottile. + +.. + +.. bpo: 42323 +.. date: 2021-01-20-12-10-47 +.. nonce: PONB8e +.. section: Library + +Fix :func:`math.nextafter` for NaN on AIX. + +.. + +.. bpo: 42955 +.. date: 2021-01-18-11-59-46 +.. nonce: CSWLC9 +.. section: Library + +Add :data:`sys.stdlib_module_names`, containing the list of the standard +library module names. Patch by Victor Stinner. + +.. + +.. bpo: 42944 +.. date: 2021-01-18-10-41-44 +.. nonce: RrONvy +.. section: Library + +Fix ``random.Random.sample`` when ``counts`` argument is not ``None``. + +.. + +.. bpo: 42934 +.. date: 2021-01-15-11-48-00 +.. nonce: ILKoOI +.. section: Library + +Use :class:`~traceback.TracebackException`'s new ``compact`` param in +:class:`~unittest.TestResult` to reduce time and memory consumed by +traceback formatting. + +.. + +.. bpo: 42931 +.. date: 2021-01-15-00-23-50 +.. nonce: QD6U2B +.. section: Library + +Add :func:`randbytes` to ``random.__all__``. + +.. + +.. bpo: 38250 +.. date: 2021-01-14-15-07-16 +.. nonce: 1fvhOk +.. section: Library + +[Enum] Flags consisting of a single bit are now considered canonical, and +will be the only flags returned from listing and iterating over a Flag class +or a Flag member. Multi-bit flags are considered aliases; they will be +returned from lookups and operations that result in their value. Iteration +for both Flag and Flag members is in definition order. + +.. + +.. bpo: 42877 +.. date: 2021-01-13-12-55-41 +.. nonce: Fi1zEG +.. section: Library + +Added the ``compact`` parameter to the constructor of +:class:`traceback.TracebackException` to reduce time and memory for use +cases that only need to call :func:`TracebackException.format` and +:func:`TracebackException.format_exception_only`. + +.. + +.. bpo: 42923 +.. date: 2021-01-13-12-15-13 +.. nonce: zBiNls +.. section: Library + +The :c:func:`Py_FatalError` function and the :mod:`faulthandler` module now +dump the list of extension modules on a fatal error. + +.. + +.. bpo: 42848 +.. date: 2021-01-12-19-34-06 +.. nonce: 5G8oBl +.. section: Library + +Removed recursion from :class:`~traceback.TracebackException` to allow it to +handle long exception chains. + +.. + +.. bpo: 42901 +.. date: 2021-01-11-17-36-59 +.. nonce: gFd-ta +.. section: Library + +[Enum] move member creation from ``EnumMeta.__new__`` to +``_proto_member.__set_name__``, allowing members to be created and visible +in ``__init_subclass__``. + +.. + +.. bpo: 42780 +.. date: 2021-01-08-15-49-20 +.. nonce: rtqi6B +.. section: Library + +Fix os.set_inheritable() for O_PATH file descriptors on Linux. + +.. + +.. bpo: 42866 +.. date: 2021-01-08-10-57-21 +.. nonce: Y1DnrO +.. section: Library + +Fix a reference leak in the ``getcodec()`` function of CJK codecs. Patch by +Victor Stinner. + +.. + +.. bpo: 42846 +.. date: 2021-01-07-23-31-17 +.. nonce: kukDjw +.. section: Library + +Convert the 6 CJK codec extension modules (_codecs_cn, _codecs_hk, +_codecs_iso2022, _codecs_jp, _codecs_kr and _codecs_tw) to the multiphase +initialization API (:pep:`489`). Patch by Victor Stinner. + +.. + +.. bpo: 42851 +.. date: 2021-01-07-11-44-22 +.. nonce: uyQFyd +.. section: Library + +remove __init_subclass__ support for Enum members + +.. + +.. bpo: 42834 +.. date: 2021-01-05-23-55-24 +.. nonce: LxRnZC +.. section: Library + +Make internal caches of the ``_json`` module compatible with +subinterpreters. + +.. + +.. bpo: 41748 +.. date: 2021-01-05-21-26-29 +.. nonce: KdC0w3 +.. section: Library + +Fix HTMLParser parsing rules for element attributes containing commas with +spaces. Patch by Karl Dubost. + +.. + +.. bpo: 40810 +.. date: 2021-01-05-00-52-30 +.. nonce: JxQqPe +.. section: Library + +Require SQLite 3.7.15 or newer. Patch by Erlend E. Aasland. + +.. + +.. bpo: 1635741 +.. date: 2021-01-04-15-05-40 +.. nonce: EOCfZY +.. section: Library + +Convert the _multibytecodec extension module (CJK codecs) to multi-phase +initialization (:pep:`489`). Patch by Erlend E. Aasland. + +.. + +.. bpo: 42802 +.. date: 2021-01-01-15-29-16 +.. nonce: Lw-bzl +.. section: Library + +The distutils ``bdist_wininst`` command deprecated in Python 3.8 has been +removed. The distutils ``bidst_wheel`` command is now recommended to +distribute binary packages on Windows. + +.. + +.. bpo: 24464 +.. date: 2020-12-30-14-56-25 +.. nonce: vbNVHe +.. section: Library + +The undocumented built-in function ``sqlite3.enable_shared_cache`` is now +deprecated, scheduled for removal in Python 3.12. Its use is strongly +discouraged by the SQLite3 documentation. Patch by Erlend E. Aasland. + +.. + +.. bpo: 42384 +.. date: 2020-11-17-14-32-39 +.. nonce: 1ZnQSn +.. section: Library + +Make pdb populate sys.path[0] exactly the same as regular python execution. + +.. + +.. bpo: 42383 +.. date: 2020-11-17-14-30-12 +.. nonce: ubl0Y_ +.. section: Library + +Fix pdb: previously pdb would fail to restart the debugging target if it was +specified using a relative path and the current directory changed. + +.. + +.. bpo: 42005 +.. date: 2020-10-11-13-48-03 +.. nonce: Jq6Az- +.. section: Library + +Fix CLI of :mod:`cProfile` and :mod:`profile` to catch +:exc:`BrokenPipeError`. + +.. + +.. bpo: 41604 +.. date: 2020-08-21-15-24-14 +.. nonce: rTXleO +.. section: Library + +Don't decrement the reference count of the previous user_ptr when +set_panel_userptr fails. + +.. + +.. bpo: 41149 +.. date: 2020-06-28-16-13-02 +.. nonce: jiZWtJ +.. section: Library + +Allow executing callables that have a boolean value of ``False`` when passed +to :class:`Threading.thread` as the target. Patch contributed by Barney +Stratford. + +.. + +.. bpo: 38307 +.. date: 2020-03-16-03-03-21 +.. nonce: 2cmw2i +.. section: Library + +Add an 'end_lineno' attribute to the Class and Function objects that appear +in the tree returned by pyclbr functions. This and the existing 'lineno' +attribute define the extent of class and def statements. Patch by Aviral +Srivastava. + +.. + +.. bpo: 39273 +.. date: 2020-01-13-23-37-58 +.. nonce: m5hzxV +.. section: Library + +The ``BUTTON5_*`` constants are now exposed in the :mod:`curses` module if +available. + +.. + +.. bpo: 33289 +.. date: 2018-04-23-13-44-10 +.. nonce: anBnUr +.. section: Library + +Correct call to :mod:`tkinter.colorchooser` to return RGB triplet of ints +instead of floats. Patch by Cheryl Sabella. + +.. + +.. bpo: 40304 +.. date: 2021-01-20-23-03-49 +.. nonce: -LK7Ps +.. section: Documentation + +Fix doc for type(name, bases, dict). Patch by Boris Verkhovskiy and Éric +Araujo. + +.. + +.. bpo: 42811 +.. date: 2021-01-04-22-14-22 +.. nonce: HY2beA +.. section: Documentation + +Updated importlib.utils.resolve_name() doc to use __spec__.parent instead of +__package__. (Thanks Yair Frid.) + +.. + +.. bpo: 40823 +.. date: 2020-05-30-13-39-22 +.. nonce: yB7K5w +.. section: Tests + +Use :meth:`unittest.TestLoader().loadTestsFromTestCase` instead of +:meth:`unittest.makeSuite` in :mod:`sqlite3` tests. Patch by Erlend E. +Aasland. + +.. + +.. bpo: 40810 +.. date: 2020-05-30-10-56-38 +.. nonce: LPqDLQ +.. section: Tests + +In :mod:`sqlite3`, fix ``CheckTraceCallbackContent`` for SQLite pre 3.7.15. + +.. + +.. bpo: 43031 +.. date: 2021-01-26-14-48-40 +.. nonce: 44nK9U +.. section: Build + +Pass ``--timeout=$(TESTTIMEOUT)`` option to the default profile task +``./python -m test --pgo`` command. + +.. + +.. bpo: 36143 +.. date: 2021-01-18-20-52-06 +.. nonce: kgnIYo +.. section: Build + +``make regen-all`` now also runs ``regen-keyword``. Patch by Victor Stinner. + +.. + +.. bpo: 42874 +.. date: 2021-01-12-10-06-50 +.. nonce: XKK61g +.. section: Build + +Removed the grep -q and -E flags in the tzpath validation section of the +configure script to better accomodate users of some platforms (specifically +Solaris 10). + +.. + +.. bpo: 31904 +.. date: 2021-01-11-23-26-00 +.. nonce: ty8f3h +.. section: Build + +Add library search path by wr-cc in add_cross_compiling_paths() for VxWorks. + +.. + +.. bpo: 42856 +.. date: 2021-01-07-12-51-38 +.. nonce: n3cMHV +.. section: Build + +Add ``--with-wheel-pkg-dir=PATH`` option to the ``./configure`` script. If +specified, the :mod:`ensurepip` module looks for ``setuptools`` and ``pip`` +wheel packages in this directory: if both are present, these wheel packages +are used instead of ensurepip bundled wheel packages. + +Some Linux distribution packaging policies recommend against bundling +dependencies. For example, Fedora installs wheel packages in the +``/usr/share/python-wheels/`` directory and don't install the +``ensurepip._bundled`` package. + +.. + +.. bpo: 41837 +.. date: 2021-01-05-20-36-40 +.. nonce: bmS7vB +.. section: Windows + +Updated Windows installer to include OpenSSL 1.1.1i + +.. + +.. bpo: 42584 +.. date: 2020-12-07-11-40-52 +.. nonce: AsYnVX +.. section: Windows + +Upgrade Windows installer to use SQLite 3.34.0. + +.. + +.. bpo: 42504 +.. date: 2021-01-26-14-36-11 +.. nonce: ZxWt71 +.. section: macOS + +Ensure that the value of +sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') is always a string, +even in when the value is parsable as an integer. + +.. + +.. bpo: 43008 +.. date: 2021-01-26-18-12-17 +.. nonce: mbQUc7 +.. section: IDLE + +Make IDLE invoke :func:`sys.excepthook` in normal, 2-process mode. Patch by +Ken Hilton. + +.. + +.. bpo: 33065 +.. date: 2021-01-10-01-25-43 +.. nonce: zmyHYJ +.. section: IDLE + +Fix problem debugging user classes with __repr__ method. + +.. + +.. bpo: 23544 +.. date: 2019-11-14-23-41-07 +.. nonce: 3etemb +.. section: IDLE + +Disable Debug=>Stack Viewer when user code is running or Debugger is active, +to prevent hang or crash. Patch by Zackery Spytz. + +.. + +.. bpo: 32631 +.. date: 2019-06-30-20-31-09 +.. nonce: e7_4BG +.. section: IDLE + +Finish zzdummy example extension module: make menu entries work; add +docstrings and tests with 100% coverage. + +.. + +.. bpo: 42979 +.. date: 2021-01-28-01-11-59 +.. nonce: JrGkrm +.. section: C API + +When Python is built in debug mode (with C assertions), calling a type slot +like ``sq_length`` (``__len__()`` in Python) now fails with a fatal error if +the slot succeeded with an exception set, or failed with no exception set. +The error message contains the slot, the type name, and the current +exception (if an exception is set). Patch by Victor Stinner. + +.. + +.. bpo: 43030 +.. date: 2021-01-27-10-27-47 +.. nonce: loDcD_ +.. section: C API + +Fixed a compiler warning in :c:func:`Py_UNICODE_ISSPACE()` on platforms with +signed ``wchar_t``. diff --git a/Misc/NEWS.d/next/Build/2021-01-07-12-51-38.bpo-42856.n3cMHV.rst b/Misc/NEWS.d/next/Build/2021-01-07-12-51-38.bpo-42856.n3cMHV.rst deleted file mode 100644 index 6aab7a6e51d071..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-01-07-12-51-38.bpo-42856.n3cMHV.rst +++ /dev/null @@ -1,9 +0,0 @@ -Add ``--with-wheel-pkg-dir=PATH`` option to the ``./configure`` script. If -specified, the :mod:`ensurepip` module looks for ``setuptools`` and ``pip`` -wheel packages in this directory: if both are present, these wheel packages are -used instead of ensurepip bundled wheel packages. - -Some Linux distribution packaging policies recommend against bundling -dependencies. For example, Fedora installs wheel packages in the -``/usr/share/python-wheels/`` directory and don't install the -``ensurepip._bundled`` package. diff --git a/Misc/NEWS.d/next/Build/2021-01-11-23-26-00.bpo-31904.ty8f3h.rst b/Misc/NEWS.d/next/Build/2021-01-11-23-26-00.bpo-31904.ty8f3h.rst deleted file mode 100644 index bc02d0a04f5283..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-01-11-23-26-00.bpo-31904.ty8f3h.rst +++ /dev/null @@ -1 +0,0 @@ -Add library search path by wr-cc in add_cross_compiling_paths() for VxWorks. diff --git a/Misc/NEWS.d/next/Build/2021-01-12-10-06-50.bpo-42874.XKK61g.rst b/Misc/NEWS.d/next/Build/2021-01-12-10-06-50.bpo-42874.XKK61g.rst deleted file mode 100644 index c3ef7b34bc7d78..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-01-12-10-06-50.bpo-42874.XKK61g.rst +++ /dev/null @@ -1,3 +0,0 @@ -Removed the grep -q and -E flags in the tzpath validation section of the -configure script to better accomodate users of some platforms (specifically -Solaris 10). diff --git a/Misc/NEWS.d/next/Build/2021-01-18-20-52-06.bpo-36143.kgnIYo.rst b/Misc/NEWS.d/next/Build/2021-01-18-20-52-06.bpo-36143.kgnIYo.rst deleted file mode 100644 index 5ac3269d955408..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-01-18-20-52-06.bpo-36143.kgnIYo.rst +++ /dev/null @@ -1 +0,0 @@ -``make regen-all`` now also runs ``regen-keyword``. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Build/2021-01-26-14-48-40.bpo-43031.44nK9U.rst b/Misc/NEWS.d/next/Build/2021-01-26-14-48-40.bpo-43031.44nK9U.rst deleted file mode 100644 index 6e8377fb306127..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-01-26-14-48-40.bpo-43031.44nK9U.rst +++ /dev/null @@ -1,2 +0,0 @@ -Pass ``--timeout=$(TESTTIMEOUT)`` option to the default profile task -``./python -m test --pgo`` command. diff --git a/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst b/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst deleted file mode 100644 index 7a432522db8a12..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a compiler warning in :c:func:`Py_UNICODE_ISSPACE()` on platforms with -signed ``wchar_t``. diff --git a/Misc/NEWS.d/next/C API/2021-01-28-01-11-59.bpo-42979.JrGkrm.rst b/Misc/NEWS.d/next/C API/2021-01-28-01-11-59.bpo-42979.JrGkrm.rst deleted file mode 100644 index 15fd86bee9dba3..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-01-28-01-11-59.bpo-42979.JrGkrm.rst +++ /dev/null @@ -1,5 +0,0 @@ -When Python is built in debug mode (with C assertions), calling a type slot -like ``sq_length`` (``__len__()`` in Python) now fails with a fatal error if -the slot succeeded with an exception set, or failed with no exception set. The -error message contains the slot, the type name, and the current exception (if -an exception is set). Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst deleted file mode 100644 index 7345152fee3568..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst +++ /dev/null @@ -1,2 +0,0 @@ -In string formatting, preceding the *width* field by ``'0'`` no longer -affects the default alignment for strings. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-10-14-16-03.bpo-41994.Xop8sV.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-10-14-16-03.bpo-41994.Xop8sV.rst deleted file mode 100644 index 36d5011ee71a61..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-10-14-16-03.bpo-41994.Xop8sV.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed possible leak in ``import`` when ``sys.modules`` is not a ``dict``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-12-20-09-12.bpo-37324.jB-9_U.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-12-20-09-12.bpo-37324.jB-9_U.rst deleted file mode 100644 index 5b57da4de5a771..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-12-12-20-09-12.bpo-37324.jB-9_U.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove deprecated aliases to :ref:`collections-abstract-base-classes` from -the :mod:`collections` module. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-18-17-07.bpo-42823.dcSynu.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-18-17-07.bpo-42823.dcSynu.rst deleted file mode 100644 index 77dbc0262f46f8..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-18-17-07.bpo-42823.dcSynu.rst +++ /dev/null @@ -1 +0,0 @@ -frame.f_lineno is correct even if frame.f_trace is set to True diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-06-17-06-37.bpo-42827.jtRR0D.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-06-17-06-37.bpo-42827.jtRR0D.rst deleted file mode 100644 index 8e40ab6a65341a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-06-17-06-37.bpo-42827.jtRR0D.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a crash when working out the error line of a :exc:`SyntaxError` in some -multi-line expressions. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-11-17-58-52.bpo-42882.WfTdfg.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-11-17-58-52.bpo-42882.WfTdfg.rst deleted file mode 100644 index 6cc7c92194c268..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-11-17-58-52.bpo-42882.WfTdfg.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix the :c:func:`_PyUnicode_FromId` function (_Py_IDENTIFIER(var) API) when -:c:func:`Py_Initialize` / :c:func:`Py_Finalize` is called multiple times: -preserve ``_PyRuntime.unicode_ids.next_index`` value. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-13-14-06-01.bpo-42924._WS1Ok.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-13-14-06-01.bpo-42924._WS1Ok.rst deleted file mode 100644 index 33fbb5235ddb66..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-13-14-06-01.bpo-42924._WS1Ok.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``bytearray`` repetition incorrectly copying data from the start of the buffer, even if the data is offset within the buffer (e.g. after reassigning a slice at the start of the ``bytearray`` to a shorter byte string). diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-14-23-15-34.bpo-42864.QgOAQ1.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-14-23-15-34.bpo-42864.QgOAQ1.rst deleted file mode 100644 index 127a29f518d798..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-14-23-15-34.bpo-42864.QgOAQ1.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve error messages in the parser when parentheses are not closed. Patch -by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-15-20-05-56.bpo-42927.GI-l-7.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-15-20-05-56.bpo-42927.GI-l-7.rst deleted file mode 100644 index 8ee578e8162154..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-15-20-05-56.bpo-42927.GI-l-7.rst +++ /dev/null @@ -1,2 +0,0 @@ -The inline cache for ``LOAD_ATTR`` now also optimizes access to attributes defined by ``__slots__``. -This makes reading such attribute up to 30% faster. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-20-22-31-01.bpo-40176.anjyWw.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-20-22-31-01.bpo-40176.anjyWw.rst deleted file mode 100644 index df7de3bdf37bc2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-20-22-31-01.bpo-40176.anjyWw.rst +++ /dev/null @@ -1,2 +0,0 @@ -Syntax errors for unterminated string literals now point to the start -of the string instead of reporting EOF/EOL. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst deleted file mode 100644 index 6e4ed60bf224d6..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix parser crash when reporting syntax errors in f-string with newlines. -Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst deleted file mode 100644 index a809f5cbb1de14..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve error message in the parser when using un-parenthesised tuples in -comprehensions. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst deleted file mode 100644 index 889f4c5d99689a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst +++ /dev/null @@ -1 +0,0 @@ -Improve error message for missing ":" before blocks. Patch by Pablo Galindo. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-29-17-48-44.bpo-38631.jR-3kC.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-29-17-48-44.bpo-38631.jR-3kC.rst deleted file mode 100644 index 485607e66126d2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-29-17-48-44.bpo-38631.jR-3kC.rst +++ /dev/null @@ -1,2 +0,0 @@ -Replace :c:func:`Py_FatalError` calls in the compiler with regular -:exc:`SystemError` exceptions. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst deleted file mode 100644 index 8ac39713e116a1..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst +++ /dev/null @@ -1,5 +0,0 @@ -Refactor the ``PyEval_`` family of functions. - -* An new function ``_PyEval_Vector`` is added to simplify calls to Python from C. -* ``_PyEval_EvalCodeWithName`` is removed -* ``PyEval_EvalCodeEx`` is retained as part of the API, but is not used internally diff --git a/Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst b/Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst deleted file mode 100644 index 768508e0ce1c19..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst +++ /dev/null @@ -1,2 +0,0 @@ -Updated importlib.utils.resolve_name() doc to use __spec__.parent -instead of __package__. (Thanks Yair Frid.) diff --git a/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst b/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst deleted file mode 100644 index 3f2f14c2d7b893..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix doc for type(name, bases, dict). Patch by Boris Verkhovskiy and -Éric Araujo. diff --git a/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst b/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst deleted file mode 100644 index c422f43b6d6dd8..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Finish zzdummy example extension module: make menu entries work; -add docstrings and tests with 100% coverage. diff --git a/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst b/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst deleted file mode 100644 index eb4a56bf100b59..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Disable Debug=>Stack Viewer when user code is running or Debugger -is active, to prevent hang or crash. Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst b/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst deleted file mode 100644 index 87948f3cd1baa1..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst +++ /dev/null @@ -1 +0,0 @@ -Fix problem debugging user classes with __repr__ method. diff --git a/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst b/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst deleted file mode 100644 index 55ab67ca94959a..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make IDLE invoke :func:`sys.excepthook` in normal, 2-process mode. -Patch by Ken Hilton. diff --git a/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst b/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst deleted file mode 100644 index 52d9ac9dd902cd..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correct call to :mod:`tkinter.colorchooser` to return RGB triplet of ints -instead of floats. Patch by Cheryl Sabella. diff --git a/Misc/NEWS.d/next/Library/2020-01-13-23-37-58.bpo-39273.m5hzxV.rst b/Misc/NEWS.d/next/Library/2020-01-13-23-37-58.bpo-39273.m5hzxV.rst deleted file mode 100644 index c942da07da3779..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-13-23-37-58.bpo-39273.m5hzxV.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``BUTTON5_*`` constants are now exposed in the :mod:`curses` module if -available. diff --git a/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst b/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst deleted file mode 100644 index 358089915fb6c4..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add an 'end_lineno' attribute to the Class and Function objects that appear in the -tree returned by pyclbr functions. This and the existing 'lineno' -attribute define the extent of class and def statements. Patch by Aviral Srivastava. diff --git a/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst b/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst deleted file mode 100644 index abe09016a65251..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst +++ /dev/null @@ -1 +0,0 @@ -Allow executing callables that have a boolean value of ``False`` when passed to :class:`Threading.thread` as the target. Patch contributed by Barney Stratford. diff --git a/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst b/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst deleted file mode 100644 index 0f9794cbdb321e..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst +++ /dev/null @@ -1,2 +0,0 @@ -Don't decrement the reference count of the previous user_ptr when -set_panel_userptr fails. diff --git a/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst b/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst deleted file mode 100644 index be4ed7f55ffded..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix CLI of :mod:`cProfile` and :mod:`profile` to catch -:exc:`BrokenPipeError`. diff --git a/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst b/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst deleted file mode 100644 index ccf2106f28a93d..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix pdb: previously pdb would fail to restart the debugging target if it was -specified using a relative path and the current directory changed. diff --git a/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst b/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst deleted file mode 100644 index ae990162fbab75..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst +++ /dev/null @@ -1 +0,0 @@ -Make pdb populate sys.path[0] exactly the same as regular python execution. diff --git a/Misc/NEWS.d/next/Library/2020-12-30-14-56-25.bpo-24464.vbNVHe.rst b/Misc/NEWS.d/next/Library/2020-12-30-14-56-25.bpo-24464.vbNVHe.rst deleted file mode 100644 index 2039c1ca9c0c46..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-30-14-56-25.bpo-24464.vbNVHe.rst +++ /dev/null @@ -1,3 +0,0 @@ -The undocumented built-in function ``sqlite3.enable_shared_cache`` is now -deprecated, scheduled for removal in Python 3.12. Its use is strongly -discouraged by the SQLite3 documentation. Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-01-01-15-29-16.bpo-42802.Lw-bzl.rst b/Misc/NEWS.d/next/Library/2021-01-01-15-29-16.bpo-42802.Lw-bzl.rst deleted file mode 100644 index 9016cd02878cca..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-01-15-29-16.bpo-42802.Lw-bzl.rst +++ /dev/null @@ -1,3 +0,0 @@ -The distutils ``bdist_wininst`` command deprecated in Python 3.8 has been -removed. The distutils ``bidst_wheel`` command is now recommended to -distribute binary packages on Windows. diff --git a/Misc/NEWS.d/next/Library/2021-01-04-15-05-40.bpo-1635741.EOCfZY.rst b/Misc/NEWS.d/next/Library/2021-01-04-15-05-40.bpo-1635741.EOCfZY.rst deleted file mode 100644 index 7ba9a53ddf9009..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-04-15-05-40.bpo-1635741.EOCfZY.rst +++ /dev/null @@ -1,2 +0,0 @@ -Convert the _multibytecodec extension module (CJK codecs) to multi-phase -initialization (:pep:`489`). Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-01-05-00-52-30.bpo-40810.JxQqPe.rst b/Misc/NEWS.d/next/Library/2021-01-05-00-52-30.bpo-40810.JxQqPe.rst deleted file mode 100644 index 61d8780bb85ddd..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-05-00-52-30.bpo-40810.JxQqPe.rst +++ /dev/null @@ -1 +0,0 @@ -Require SQLite 3.7.15 or newer. Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst deleted file mode 100644 index 52efa3ac3d40eb..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix HTMLParser parsing rules for element attributes containing -commas with spaces. Patch by Karl Dubost. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst b/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst deleted file mode 100644 index 9e63a7e76062aa..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst +++ /dev/null @@ -1 +0,0 @@ -Make internal caches of the ``_json`` module compatible with subinterpreters. diff --git a/Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst b/Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst deleted file mode 100644 index 927283521e80e3..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst +++ /dev/null @@ -1 +0,0 @@ -remove __init_subclass__ support for Enum members diff --git a/Misc/NEWS.d/next/Library/2021-01-07-23-31-17.bpo-42846.kukDjw.rst b/Misc/NEWS.d/next/Library/2021-01-07-23-31-17.bpo-42846.kukDjw.rst deleted file mode 100644 index 6f8a739ec1da25..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-07-23-31-17.bpo-42846.kukDjw.rst +++ /dev/null @@ -1,3 +0,0 @@ -Convert the 6 CJK codec extension modules (_codecs_cn, _codecs_hk, -_codecs_iso2022, _codecs_jp, _codecs_kr and _codecs_tw) to the multiphase -initialization API (:pep:`489`). Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-01-08-10-57-21.bpo-42866.Y1DnrO.rst b/Misc/NEWS.d/next/Library/2021-01-08-10-57-21.bpo-42866.Y1DnrO.rst deleted file mode 100644 index 3ea6cc239aa694..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-08-10-57-21.bpo-42866.Y1DnrO.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a reference leak in the ``getcodec()`` function of CJK codecs. Patch by -Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst b/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst deleted file mode 100644 index a491690507129e..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst +++ /dev/null @@ -1 +0,0 @@ -Fix os.set_inheritable() for O_PATH file descriptors on Linux. diff --git a/Misc/NEWS.d/next/Library/2021-01-11-17-36-59.bpo-42901.gFd-ta.rst b/Misc/NEWS.d/next/Library/2021-01-11-17-36-59.bpo-42901.gFd-ta.rst deleted file mode 100644 index 206bca1fb634c8..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-11-17-36-59.bpo-42901.gFd-ta.rst +++ /dev/null @@ -1,3 +0,0 @@ -[Enum] move member creation from ``EnumMeta.__new__`` to -``_proto_member.__set_name__``, allowing members to be created and visible -in ``__init_subclass__``. diff --git a/Misc/NEWS.d/next/Library/2021-01-12-19-34-06.bpo-42848.5G8oBl.rst b/Misc/NEWS.d/next/Library/2021-01-12-19-34-06.bpo-42848.5G8oBl.rst deleted file mode 100644 index 4490b6ae3405e5..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-12-19-34-06.bpo-42848.5G8oBl.rst +++ /dev/null @@ -1 +0,0 @@ -Removed recursion from :class:`~traceback.TracebackException` to allow it to handle long exception chains. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-01-13-12-15-13.bpo-42923.zBiNls.rst b/Misc/NEWS.d/next/Library/2021-01-13-12-15-13.bpo-42923.zBiNls.rst deleted file mode 100644 index bb566f982b5ce1..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-13-12-15-13.bpo-42923.zBiNls.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :c:func:`Py_FatalError` function and the :mod:`faulthandler` module now -dump the list of extension modules on a fatal error. diff --git a/Misc/NEWS.d/next/Library/2021-01-13-12-55-41.bpo-42877.Fi1zEG.rst b/Misc/NEWS.d/next/Library/2021-01-13-12-55-41.bpo-42877.Fi1zEG.rst deleted file mode 100644 index 49bb74bc536653..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-13-12-55-41.bpo-42877.Fi1zEG.rst +++ /dev/null @@ -1,4 +0,0 @@ -Added the ``compact`` parameter to the constructor of -:class:`traceback.TracebackException` to reduce time and memory -for use cases that only need to call :func:`TracebackException.format` -and :func:`TracebackException.format_exception_only`. diff --git a/Misc/NEWS.d/next/Library/2021-01-14-15-07-16.bpo-38250.1fvhOk.rst b/Misc/NEWS.d/next/Library/2021-01-14-15-07-16.bpo-38250.1fvhOk.rst deleted file mode 100644 index e5a72468370fba..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-14-15-07-16.bpo-38250.1fvhOk.rst +++ /dev/null @@ -1,5 +0,0 @@ -[Enum] Flags consisting of a single bit are now considered canonical, and -will be the only flags returned from listing and iterating over a Flag class -or a Flag member. Multi-bit flags are considered aliases; they will be -returned from lookups and operations that result in their value. -Iteration for both Flag and Flag members is in definition order. diff --git a/Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst b/Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst deleted file mode 100644 index 01f8094944f70c..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`randbytes` to ``random.__all__``. diff --git a/Misc/NEWS.d/next/Library/2021-01-15-11-48-00.bpo-42934.ILKoOI.rst b/Misc/NEWS.d/next/Library/2021-01-15-11-48-00.bpo-42934.ILKoOI.rst deleted file mode 100644 index 92f2402d2324a3..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-15-11-48-00.bpo-42934.ILKoOI.rst +++ /dev/null @@ -1,3 +0,0 @@ -Use :class:`~traceback.TracebackException`'s new ``compact`` param in -:class:`~unittest.TestResult` to reduce time and memory consumed by -traceback formatting. diff --git a/Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst b/Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst deleted file mode 100644 index b78d10aa255454..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``random.Random.sample`` when ``counts`` argument is not ``None``. diff --git a/Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst b/Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst deleted file mode 100644 index 373b829b0fb76d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :data:`sys.stdlib_module_names`, containing the list of the standard library -module names. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-01-20-12-10-47.bpo-42323.PONB8e.rst b/Misc/NEWS.d/next/Library/2021-01-20-12-10-47.bpo-42323.PONB8e.rst deleted file mode 100644 index b2f7becee9d23c..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-20-12-10-47.bpo-42323.PONB8e.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :func:`math.nextafter` for NaN on AIX. diff --git a/Misc/NEWS.d/next/Library/2021-01-24-00-37-40.bpo-43014.BVPhEr.rst b/Misc/NEWS.d/next/Library/2021-01-24-00-37-40.bpo-43014.BVPhEr.rst deleted file mode 100644 index 02898e4a3a42e9..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-24-00-37-40.bpo-43014.BVPhEr.rst +++ /dev/null @@ -1 +0,0 @@ -Improve performance of :mod:`tokenize` by 20-30%. Patch by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Library/2021-01-27-20-49-32.bpo-41282.SEPdV0.rst b/Misc/NEWS.d/next/Library/2021-01-27-20-49-32.bpo-41282.SEPdV0.rst deleted file mode 100644 index c7b6b5233e8f21..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-27-20-49-32.bpo-41282.SEPdV0.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate ``distutils`` in documentation and add warning on import. diff --git a/Misc/NEWS.d/next/Library/2021-01-30-15-20-06.bpo-43077.Owk61z.rst b/Misc/NEWS.d/next/Library/2021-01-30-15-20-06.bpo-43077.Owk61z.rst deleted file mode 100644 index e555002433b4de..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-30-15-20-06.bpo-43077.Owk61z.rst +++ /dev/null @@ -1 +0,0 @@ -Update the bundled pip to 21.0.1 and setuptools to 52.0.0. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst deleted file mode 100644 index 8e45640bceae13..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst b/Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst deleted file mode 100644 index 7df65a156feabd..00000000000000 --- a/Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst +++ /dev/null @@ -1,2 +0,0 @@ -Avoid static buffers when computing the repr of :class:`ctypes.c_double` and -:class:`ctypes.c_longdouble` values. diff --git a/Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst b/Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst deleted file mode 100644 index eafd94cabede93..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst +++ /dev/null @@ -1 +0,0 @@ -In :mod:`sqlite3`, fix ``CheckTraceCallbackContent`` for SQLite pre 3.7.15. diff --git a/Misc/NEWS.d/next/Tests/2020-05-30-13-39-22.bpo-40823.yB7K5w.rst b/Misc/NEWS.d/next/Tests/2020-05-30-13-39-22.bpo-40823.yB7K5w.rst deleted file mode 100644 index 55919521cf8062..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-05-30-13-39-22.bpo-40823.yB7K5w.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use :meth:`unittest.TestLoader().loadTestsFromTestCase` instead of -:meth:`unittest.makeSuite` in :mod:`sqlite3` tests. Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst b/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst deleted file mode 100644 index afb6530c8f66d7..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst +++ /dev/null @@ -1 +0,0 @@ -Upgrade Windows installer to use SQLite 3.34.0. diff --git a/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst b/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst deleted file mode 100644 index 8d4bb34ff909c2..00000000000000 --- a/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst +++ /dev/null @@ -1 +0,0 @@ -Updated Windows installer to include OpenSSL 1.1.1i diff --git a/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst b/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst deleted file mode 100644 index a47776effe905e..00000000000000 --- a/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst +++ /dev/null @@ -1,3 +0,0 @@ -Ensure that the value of -sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') is always a string, -even in when the value is parsable as an integer. From b5a895ff338a4c26892de0beeb5840c87b736619 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 2 Feb 2021 20:43:11 +0000 Subject: [PATCH 1110/1261] Fix Sphynx syntax in the memory.rst document --- Doc/c-api/memory.rst | 2 +- Include/patchlevel.h | 4 ++-- Lib/pydoc_data/topics.py | 50 +++++++++++++++++++++++++++++++++------- README.rst | 2 +- 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst index 0597ef71366571..588668ee853c65 100644 --- a/Doc/c-api/memory.rst +++ b/Doc/c-api/memory.rst @@ -96,7 +96,7 @@ Allocator Domains ================= All allocating functions belong to one of three different "domains" (see also -:c:type`PyMemAllocatorDomain`). These domains represent different allocation +:c:type:`PyMemAllocatorDomain`). These domains represent different allocation strategies and are optimized for different purposes. The specific details on how every domain allocates memory or what internal functions each domain calls is considered an implementation detail, but for debugging purposes a simplified diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 806f7d279d128e..2cb634ea95ec63 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 10 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 4 +#define PY_RELEASE_SERIAL 5 /* Version as a string */ -#define PY_VERSION "3.10.0a4+" +#define PY_VERSION "3.10.0a5" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 93d2ddfba5d048..ba4e2902caad14 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Mon Jan 4 17:25:50 2021 +# Autogenerated by Sphinx on Tue Feb 2 20:44:10 2021 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -2561,8 +2561,10 @@ 'usage\n' 'patterns to be encapsulated for convenient reuse.\n' '\n' - ' with_stmt ::= "with" with_item ("," with_item)* ":" suite\n' - ' with_item ::= expression ["as" target]\n' + ' with_stmt ::= "with" ( "(" with_stmt_contents ","? ' + '")" | with_stmt_contents ) ":" suite\n' + ' with_stmt_contents ::= with_item ("," with_item)*\n' + ' with_item ::= expression ["as" target]\n' '\n' 'The execution of the "with" statement with one “item” proceeds ' 'as\n' @@ -2654,9 +2656,23 @@ ' with B() as b:\n' ' SUITE\n' '\n' + 'You can also write multi-item context managers in multiple lines ' + 'if\n' + 'the items are surrounded by parentheses. For example:\n' + '\n' + ' with (\n' + ' A() as a,\n' + ' B() as b,\n' + ' ):\n' + ' SUITE\n' + '\n' 'Changed in version 3.1: Support for multiple context ' 'expressions.\n' '\n' + 'Changed in version 3.10: Support for using grouping parentheses ' + 'to\n' + 'break the statement in multiple lines.\n' + '\n' 'See also:\n' '\n' ' **PEP 343** - The “with” statement\n' @@ -5268,9 +5284,9 @@ ' | | in the form ‘+000000120’. This alignment ' 'option is only |\n' ' | | valid for numeric types. It becomes the ' - 'default when ‘0’ |\n' - ' | | immediately precedes the field ' - 'width. |\n' + 'default for |\n' + ' | | numbers when ‘0’ immediately precedes the ' + 'field width. |\n' ' ' '+-----------+------------------------------------------------------------+\n' ' | "\'^\'" | Forces the field to be centered within ' @@ -5378,6 +5394,10 @@ 'with an\n' '*alignment* type of "\'=\'".\n' '\n' + 'Changed in version 3.10: Preceding the *width* field by ' + '"\'0\'" no\n' + 'longer affects the default alignment for strings.\n' + '\n' 'The *precision* is a decimal number indicating how many ' 'digits should\n' 'be displayed after the decimal point for a floating point ' @@ -13989,8 +14009,10 @@ 'usage\n' 'patterns to be encapsulated for convenient reuse.\n' '\n' - ' with_stmt ::= "with" with_item ("," with_item)* ":" suite\n' - ' with_item ::= expression ["as" target]\n' + ' with_stmt ::= "with" ( "(" with_stmt_contents ","? ")" | ' + 'with_stmt_contents ) ":" suite\n' + ' with_stmt_contents ::= with_item ("," with_item)*\n' + ' with_item ::= expression ["as" target]\n' '\n' 'The execution of the "with" statement with one “item” proceeds as\n' 'follows:\n' @@ -14076,8 +14098,20 @@ ' with B() as b:\n' ' SUITE\n' '\n' + 'You can also write multi-item context managers in multiple lines if\n' + 'the items are surrounded by parentheses. For example:\n' + '\n' + ' with (\n' + ' A() as a,\n' + ' B() as b,\n' + ' ):\n' + ' SUITE\n' + '\n' 'Changed in version 3.1: Support for multiple context expressions.\n' '\n' + 'Changed in version 3.10: Support for using grouping parentheses to\n' + 'break the statement in multiple lines.\n' + '\n' 'See also:\n' '\n' ' **PEP 343** - The “with” statement\n' diff --git a/README.rst b/README.rst index 3eae020b037b33..0d868c68614154 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.10.0 alpha 4 +This is Python version 3.10.0 alpha 5 ===================================== .. image:: https://travis-ci.com/python/cpython.svg?branch=master From 92dc5e93c369d6addad7213eab2acd4576b97d5e Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Wed, 3 Feb 2021 05:06:57 +0800 Subject: [PATCH 1111/1261] bpo-8264: Document hasattr and getattr behavior for private attributes (GH-23513) Clarify ``getattr`` and ``setattr`` requirements for accessing name-mangled attributes Co-Authored-By: Catalin Iacob --- Doc/library/functions.rst | 14 ++++++++++++++ Doc/reference/expressions.rst | 2 ++ 2 files changed, 16 insertions(+) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index f84353ce391d14..55dd3f03f929c7 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -693,6 +693,13 @@ are always available. They are listed here in alphabetical order. ``x.foobar``. If the named attribute does not exist, *default* is returned if provided, otherwise :exc:`AttributeError` is raised. + .. note:: + + Since :ref:`private name mangling ` happens at + compilation time, one must manually mangle a private attribute's + (attributes with two leading underscores) name in order to retrieve it with + :func:`getattr`. + .. function:: globals() @@ -1512,6 +1519,13 @@ are always available. They are listed here in alphabetical order. object allows it. For example, ``setattr(x, 'foobar', 123)`` is equivalent to ``x.foobar = 123``. + .. note:: + + Since :ref:`private name mangling ` happens at + compilation time, one must manually mangle a private attribute's + (attributes with two leading underscores) name in order to set it with + :func:`setattr`. + .. class:: slice(stop) slice(start, stop[, step]) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 8ac626444843d2..c8c9b4683e62d2 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -77,6 +77,8 @@ When the name is bound to an object, evaluation of the atom yields that object. When a name is not bound, an attempt to evaluate it raises a :exc:`NameError` exception. +.. _private-name-mangling: + .. index:: pair: name; mangling pair: private; names From 4b955f6e724fbc3e1c7f6c0fc3a38d01c918d9f2 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 3 Feb 2021 01:13:43 +0000 Subject: [PATCH 1112/1261] Add link to Microsoft docs for limitations in Windows Store package (GH-24422) --- Doc/using/windows.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 265c07c7099f35..0f713fcab4be8b 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -339,6 +339,11 @@ full write access to shared locations such as ``TEMP`` and the registry. Instead, it will write to a private copy. If your scripts must modify the shared locations, you will need to install the full installer. +For more detail on the technical basis for these limitations, please consult +Microsoft's documentation on packaged full-trust apps, currently available at +`docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-behind-the-scenes +`_ + .. _windows-nuget: From c3459e4f56aaff364d705af2c886618c7828f68b Mon Sep 17 00:00:00 2001 From: diegoe Date: Tue, 2 Feb 2021 22:28:36 -0500 Subject: [PATCH 1113/1261] bpo-43082: Remove redundant 'the' in Descriptor howto (GH-24394) --- Doc/howto/descriptor.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index d172c9b181c1ce..5455d914dce792 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -497,7 +497,7 @@ Definition and introduction In general, a descriptor is an attribute value that has one of the methods in the descriptor protocol. Those methods are :meth:`__get__`, :meth:`__set__`, -and :meth:`__delete__`. If any of those methods are defined for an the +and :meth:`__delete__`. If any of those methods are defined for an attribute, it is said to be a :term:`descriptor`. The default behavior for attribute access is to get, set, or delete the From 4c04445480454dda76ad857df3141dd17b269efe Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 3 Feb 2021 06:15:44 +0000 Subject: [PATCH 1114/1261] Post 3.10.0a5 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 2cb634ea95ec63..d6d5e11af250f3 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 5 /* Version as a string */ -#define PY_VERSION "3.10.0a5" +#define PY_VERSION "3.10.0a5+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. From 0f6b6b8e895158f2f9f106e499b6710a1ce0304c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Feb 2021 13:22:27 -0800 Subject: [PATCH 1115/1261] build(deps): bump actions/upload-artifact from v2.2.1 to v2.2.2 (GH-24411) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from v2.2.1 to v2.2.2. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v2.2.1...e448a9b857ee2131e752b06002bf0e093c65e571) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/doc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 82e9645b5b3377..864303bfff8505 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -38,7 +38,7 @@ jobs: - name: 'Build documentation' run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" doctest html - name: 'Upload' - uses: actions/upload-artifact@v2.2.1 + uses: actions/upload-artifact@v2.2.2 with: name: doc-html path: Doc/build/html From 5c32cdc426151193b8f6add9cdcabb10baa2927a Mon Sep 17 00:00:00 2001 From: Harry Date: Wed, 3 Feb 2021 21:25:28 +0000 Subject: [PATCH 1116/1261] Fix typo (GH-23019) Fixed possible typo in comment --- Lib/datetime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/datetime.py b/Lib/datetime.py index b896b94b0fe0e4..6bf37ccfab7ac8 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -2327,7 +2327,7 @@ def _name_from_offset(delta): # This is again a requirement for a sane tzinfo class. # # 4. (x+k).s = x.s -# This follows from #2, and that datimetimetz+timedelta preserves tzinfo. +# This follows from #2, and that datetime.timetz+timedelta preserves tzinfo. # # 5. (x+k).n = x.n + k # Again follows from how arithmetic is defined. From b9c033cb0db80dd2575c518c73f9b21b386ff2a4 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 3 Feb 2021 23:29:26 +0000 Subject: [PATCH 1117/1261] bpo-43121: Fix incorrect SyntaxError message for missing comma (GH-24436) --- Grammar/python.gram | 2 +- Lib/test/test_syntax.py | 20 +++++++++++++++++-- .../2021-02-03-22-33-05.bpo-43121.jqcViq.rst | 2 ++ Parser/parser.c | 13 +++++++----- 4 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-02-03-22-33-05.bpo-43121.jqcViq.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index 22f2b41b11ef6d..d1a36f0e4d0940 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -694,7 +694,7 @@ invalid_primary: invalid_comprehension: | ('[' | '(' | '{') a=starred_expression for_if_clauses { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable unpacking cannot be used in comprehension") } - | ('[' | '{') a=star_named_expression ',' [star_named_expressions] { + | ('[' | '{') a=star_named_expression ',' [star_named_expressions] for_if_clauses { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "did you forget parentheses around the comprehension target?") } invalid_dict_comprehension: | '{' a='**' bitwise_or for_if_clauses '}' { diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 6068dd9fc09e8e..70dd22c62aa215 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -246,9 +246,25 @@ Traceback (most recent call last): SyntaxError: did you forget parentheses around the comprehension target? ->>> {x,y: None for x,y in range(100)} +# Missing commas in literals collections should not +# produce special error messages regarding missing +# parentheses + +>>> [1, 2 3] Traceback (most recent call last): -SyntaxError: did you forget parentheses around the comprehension target? +SyntaxError: invalid syntax + +>>> {1, 2 3} +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> {1:2, 2:5 3:12} +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> (1, 2 3) +Traceback (most recent call last): +SyntaxError: invalid syntax From compiler_complex_args(): diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-03-22-33-05.bpo-43121.jqcViq.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-03-22-33-05.bpo-43121.jqcViq.rst new file mode 100644 index 00000000000000..5030bda133c8d3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-03-22-33-05.bpo-43121.jqcViq.rst @@ -0,0 +1,2 @@ +Fixed an incorrect :exc:`SyntaxError` message for missing comma in literals. +Patch by Pablo Galindo. diff --git a/Parser/parser.c b/Parser/parser.c index c709e45dae5659..f4501d3bca094b 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -15217,7 +15217,7 @@ invalid_primary_rule(Parser *p) // invalid_comprehension: // | ('[' | '(' | '{') starred_expression for_if_clauses -// | ('[' | '{') star_named_expression ',' star_named_expressions? +// | ('[' | '{') star_named_expression ',' star_named_expressions? for_if_clauses static void * invalid_comprehension_rule(Parser *p) { @@ -15258,17 +15258,18 @@ invalid_comprehension_rule(Parser *p) D(fprintf(stderr, "%*c%s invalid_comprehension[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); } - { // ('[' | '{') star_named_expression ',' star_named_expressions? + { // ('[' | '{') star_named_expression ',' star_named_expressions? for_if_clauses if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions?")); + D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions? for_if_clauses")); Token * _literal; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings void *_tmp_132_var; expr_ty a; + asdl_comprehension_seq* for_if_clauses_var; if ( (_tmp_132_var = _tmp_132_rule(p)) // '[' | '{' && @@ -15277,9 +15278,11 @@ invalid_comprehension_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 12)) // token=',' && (_opt_var = star_named_expressions_rule(p), 1) // star_named_expressions? + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses ) { - D(fprintf(stderr, "%*c+ invalid_comprehension[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions?")); + D(fprintf(stderr, "%*c+ invalid_comprehension[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions? for_if_clauses")); _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "did you forget parentheses around the comprehension target?" ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -15290,7 +15293,7 @@ invalid_comprehension_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s invalid_comprehension[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions? for_if_clauses")); } _res = NULL; done: From 7c6b0b20f776379eaf9b06928808fd01faacf5fd Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 4 Feb 2021 08:32:55 +0900 Subject: [PATCH 1118/1261] bpo-43106: Add os.O_EVTONLY/O_FSYNC/O_SYMLINK/O_NOFOLLOW_ANY (GH-24428) --- Doc/library/os.rst | 10 ++++++++++ Doc/whatsnew/3.10.rst | 4 ++++ .../2021-02-03-17-06-38.bpo-43106.SwcSuU.rst | 2 ++ Modules/posixmodule.c | 13 ++++++++++++- 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2021-02-03-17-06-38.bpo-43106.SwcSuU.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 35cf7c0a0ba5c3..371d59e9c31a45 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1090,6 +1090,16 @@ or `the MSDN `_ on Windo The above constants are only available on Windows. +.. data:: O_EVTONLY + O_FSYNC + O_SYMLINK + O_NOFOLLOW_ANY + + The above constants are only available on macOS. + + .. versionchanged:: 3.10 + Add :data:`O_EVTONLY`, :data:`O_FSYNC`, :data:`O_SYMLINK` + and :data:`O_NOFOLLOW_ANY` constants. .. data:: O_ASYNC O_DIRECT diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index d80ceeca85a895..fa8b6aa54fe902 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -411,6 +411,10 @@ descriptors without copying between kernel address space and user address space, where one of the file descriptors must refer to a pipe. (Contributed by Pablo Galindo in :issue:`41625`.) +Added :data:`~os.O_EVTONLY`, :data:`~os.O_FSYNC`, :data:`~os.O_SYMLINK` +and :data:`~os.O_NOFOLLOW_ANY` for macOS. +(Contributed by Dong-hee Na in :issue:`43106`.) + pathlib ------- diff --git a/Misc/NEWS.d/next/Library/2021-02-03-17-06-38.bpo-43106.SwcSuU.rst b/Misc/NEWS.d/next/Library/2021-02-03-17-06-38.bpo-43106.SwcSuU.rst new file mode 100644 index 00000000000000..a85d49437c4e54 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-03-17-06-38.bpo-43106.SwcSuU.rst @@ -0,0 +1,2 @@ +Added :data:`~os.O_EVTONLY`, :data:`~os.O_FSYNC`, :data:`~os.O_SYMLINK` +and :data:`~os.O_NOFOLLOW_ANY` for macOS. Patch by Dong-hee Na. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 4468fd08e17a53..b30ae80290535a 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -14901,7 +14901,15 @@ all_ins(PyObject *m) #ifdef O_ACCMODE if (PyModule_AddIntMacro(m, O_ACCMODE)) return -1; #endif - +#ifdef O_EVTONLY + if (PyModule_AddIntMacro(m, O_EVTONLY)) return -1; +#endif +#ifdef O_FSYNC + if (PyModule_AddIntMacro(m, O_FSYNC)) return -1; +#endif +#ifdef O_SYMLINK + if (PyModule_AddIntMacro(m, O_SYMLINK)) return -1; +#endif #ifdef SEEK_HOLE if (PyModule_AddIntMacro(m, SEEK_HOLE)) return -1; @@ -14951,6 +14959,9 @@ all_ins(PyObject *m) /* Do not follow links. */ if (PyModule_AddIntMacro(m, O_NOFOLLOW)) return -1; #endif +#ifdef O_NOFOLLOW_ANY + if (PyModule_AddIntMacro(m, O_NOFOLLOW_ANY)) return -1; +#endif #ifdef O_NOLINKS /* Fails if link count of the named file is greater than 1 */ if (PyModule_AddIntMacro(m, O_NOLINKS)) return -1; From da49ecb4f1ea3c3b6bb6b018428fd0ec70dc5557 Mon Sep 17 00:00:00 2001 From: Mariatta Wijaya Date: Thu, 4 Feb 2021 11:22:34 -0800 Subject: [PATCH 1119/1261] Fix dependabot.yml file (GH-24443) The `target-branch` field doesn't seem to support array. Since it defaults to the default branch anyway, we should just remove the `target-branch` field from the config. --- .github/dependabot.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d9cbb3c7ec3854..e90677b9f775a7 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,7 +7,3 @@ updates: labels: - "skip issue" - "skip news" - target_branch: - - "master" - - "3.9" - - "3.8" From ae6188f60887efb48864418e8c788d6dd58ac12b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Feb 2021 12:57:10 -0800 Subject: [PATCH 1120/1261] build(deps): bump actions/cache from v2.1.3 to v2.1.4 (#24446) Bumps [actions/cache](https://github.com/actions/cache) from v2.1.3 to v2.1.4. - [Release notes](https://github.com/actions/cache/releases) - [Commits](https://github.com/actions/cache/compare/v2.1.3...26968a09c0ea4f3e233fdddbafd1166051a095f6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- .github/workflows/coverage.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 48b5825db042f3..c674c5d606c546 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -140,7 +140,7 @@ jobs: run: sudo ./.github/workflows/posix-deps-apt.sh - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache@v2.1.3 + uses: actions/cache@v2.1.4 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 11748f0e449812..788d6ce047b4af 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -32,7 +32,7 @@ jobs: run: sudo ./.github/workflows/posix-deps-apt.sh - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache@v2.1.3 + uses: actions/cache@v2.1.4 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} From 96422010a15628c3aeb2ed23ea18133fe968ab1c Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 5 Feb 2021 05:38:18 +0800 Subject: [PATCH 1121/1261] Fix signed/unsigned comparison to avoid compilation warning (GH-24441) --- PC/winreg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/winreg.c b/PC/winreg.c index d62a7be28d3fab..fb488d8eb02960 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -680,7 +680,7 @@ _Py_COMP_DIAG_POP assert(size > 0); len = PyUnicode_AsWideChar(t, P, size); assert(len >= 0); - assert(len < size); + assert((unsigned)len < size); size -= (DWORD)len + 1; P += len + 1; } From dc0819b0ee591af4e81adab0c3019158e5316d18 Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 5 Feb 2021 06:08:03 +0800 Subject: [PATCH 1122/1261] bpo-42882: Fix MSVC warnings in pystate.c (GH-24440) _PyRuntimeState.unicode_ids.next_index type is Py_ssize_t. --- Python/pystate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/pystate.c b/Python/pystate.c index ebf76a058b6402..922e5bee2cbfca 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -56,7 +56,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) _Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head; // bpo-42882: Preserve next_index value if Py_Initialize()/Py_Finalize() // is called multiple times. - int64_t unicode_next_index = runtime->unicode_ids.next_index; + Py_ssize_t unicode_next_index = runtime->unicode_ids.next_index; memset(runtime, 0, sizeof(*runtime)); From c02709e3cf4fe029688543b7a593db0c27f21e6c Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 4 Feb 2021 15:52:16 -0800 Subject: [PATCH 1123/1261] bpo-43102: Set namedtuple __new__'s internal builtins to a dict. (GH-24439) --- Lib/collections/__init__.py | 2 +- Lib/test/test_collections.py | 5 +++++ .../next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 7d338131d6740d..6fe3c4c5aa541d 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -407,7 +407,7 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non namespace = { '_tuple_new': tuple_new, - '__builtins__': None, + '__builtins__': {}, '__name__': f'namedtuple_{typename}', } code = f'lambda _cls, {arg_list}: _tuple_new(_cls, ({arg_list}))' diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index a1ca958257adf6..befb7ab436c40a 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -681,6 +681,11 @@ class NewPoint(tuple): self.assertEqual(np.x, 1) self.assertEqual(np.y, 2) + def test_new_builtins_issue_43102(self): + self.assertEqual( + namedtuple('C', ()).__new__.__globals__['__builtins__'], + {}) + ################################################################################ ### Abstract Base Classes diff --git a/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst b/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst new file mode 100644 index 00000000000000..985fd68a03a935 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst @@ -0,0 +1,2 @@ +The namedtuple __new__ method had its __builtins__ set to None instead +of an actual dictionary. This created problems for introspection tools. From 85a8432b97061e5ca5f70e47b32e37f2f8d4c4d4 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Fri, 5 Feb 2021 13:21:28 +0900 Subject: [PATCH 1124/1261] bpo-35295: Remove outdated comment. (GH-24453) --- Include/cpython/unicodeobject.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index a4057fd2a13edb..30bf994cda35be 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -737,13 +737,6 @@ PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( Use of this API is DEPRECATED since no size information can be extracted from the returned data. - - *** This API is for interpreter INTERNAL USE ONLY and will likely - *** be removed or changed for Python 3.1. - - *** If you need to access the Unicode object as UTF-8 bytes string, - *** please use PyUnicode_AsUTF8String() instead. - */ PyAPI_FUNC(const char *) PyUnicode_AsUTF8(PyObject *unicode); From 3dba1c2a8d4f4d7308b8cea54458696ac2d18142 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 4 Feb 2021 21:36:03 -0800 Subject: [PATCH 1125/1261] Reduce overhead on random timings (GH-24455) --- Lib/random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/random.py b/Lib/random.py index 187b0a016947a8..0df26645d9e19e 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -881,7 +881,7 @@ def _test_generator(n, func, args): from time import perf_counter t0 = perf_counter() - data = [func(*args) for i in range(n)] + data = [func(*args) for i in _repeat(None, n)] t1 = perf_counter() xbar = mean(data) From 83f797972257f9c4833f16eef72db33dde2853fe Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 4 Feb 2021 22:05:42 -0800 Subject: [PATCH 1126/1261] Minor readability improvements. Also note performance impact of __slots__. (GH-24456) --- Doc/howto/descriptor.rst | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 5455d914dce792..94a8b4e6b40b96 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -42,8 +42,8 @@ add new capabilities one by one. Simple example: A descriptor that returns a constant ---------------------------------------------------- -The :class:`Ten` class is a descriptor that always returns the constant ``10`` -from its :meth:`__get__` method: +The :class:`Ten` class is a descriptor whose :meth:`__get__` method always +returns the constant ``10``: .. testcode:: @@ -70,10 +70,10 @@ and descriptor lookup: >>> a.y # Descriptor lookup 10 -In the ``a.x`` attribute lookup, the dot operator finds the key ``x`` and the -value ``5`` in the class dictionary. In the ``a.y`` lookup, the dot operator -finds a descriptor instance, recognized by its ``__get__`` method, and calls -that method which returns ``10``. +In the ``a.x`` attribute lookup, the dot operator finds ``'x': 5`` +in the class dictionary. In the ``a.y`` lookup, the dot operator +finds a descriptor instance, recognized by its ``__get__`` method. +Calling that method returns ``10``. Note that the value ``10`` is not stored in either the class dictionary or the instance dictionary. Instead, the value ``10`` is computed on demand. @@ -300,7 +300,7 @@ used in cases where a descriptor needs to know either the class where it was created or the name of class variable it was assigned to. (This method, if present, is called even if the class is not a descriptor.) -Descriptors get invoked by the dot "operator" during attribute lookup. If a +Descriptors get invoked by the dot operator during attribute lookup. If a descriptor is accessed indirectly with ``vars(some_class)[descriptor_name]``, the descriptor instance is returned without invoking it. @@ -1380,7 +1380,10 @@ takes 48 bytes with ``__slots__`` and 152 bytes without. This `flyweight design pattern `_ likely only matters when a large number of instances are going to be created. -4. Blocks tools like :func:`functools.cached_property` which require an +4. Improves speed. Reading instance variables is 35% faster with +``__slots__`` (as measured with Python 3.10 on an Apple M1 processor). + +5. Blocks tools like :func:`functools.cached_property` which require an instance dictionary to function correctly: .. testcode:: From f8bb6f7ef556f936ca297b6eecaed15158252a62 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Fri, 5 Feb 2021 01:25:30 -0700 Subject: [PATCH 1127/1261] bpo-43132: Fix incorrect handling of PyObject_RichCompareBool() in _zoneinfo (GH-24450) PyObject_RichCompareBool() returns -1 on error, but this case is not handled by the find_in_strong_cache() function. Any exception raised by PyObject_RichCompareBool() should be propagated. --- Modules/_zoneinfo.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c index d0c462fb86ab50..4726b82b6a42c4 100644 --- a/Modules/_zoneinfo.c +++ b/Modules/_zoneinfo.c @@ -164,7 +164,7 @@ is_leap_year(int year); static size_t _bisect(const int64_t value, const int64_t *arr, size_t size); -static void +static int eject_from_strong_cache(const PyTypeObject *const type, PyObject *key); static void clear_strong_cache(const PyTypeObject *const type); @@ -266,7 +266,7 @@ zoneinfo_new(PyTypeObject *type, PyObject *args, PyObject *kw) } PyObject *instance = zone_from_strong_cache(type, key); - if (instance != NULL) { + if (instance != NULL || PyErr_Occurred()) { return instance; } @@ -429,7 +429,10 @@ zoneinfo_clear_cache(PyObject *cls, PyObject *args, PyObject *kwargs) while ((item = PyIter_Next(iter))) { // Remove from strong cache - eject_from_strong_cache(type, item); + if (eject_from_strong_cache(type, item) < 0) { + Py_DECREF(item); + break; + } // Remove from weak cache PyObject *tmp = PyObject_CallMethodObjArgs(weak_cache, pop, item, @@ -2342,7 +2345,11 @@ find_in_strong_cache(const StrongCacheNode *const root, PyObject *const key) { const StrongCacheNode *node = root; while (node != NULL) { - if (PyObject_RichCompareBool(key, node->key, Py_EQ)) { + int rv = PyObject_RichCompareBool(key, node->key, Py_EQ); + if (rv < 0) { + return NULL; + } + if (rv) { return (StrongCacheNode *)node; } @@ -2356,11 +2363,11 @@ find_in_strong_cache(const StrongCacheNode *const root, PyObject *const key) * * This function is used to enable the per-key functionality in clear_cache. */ -static void +static int eject_from_strong_cache(const PyTypeObject *const type, PyObject *key) { if (type != &PyZoneInfo_ZoneInfoType) { - return; + return 0; } StrongCacheNode *node = find_in_strong_cache(ZONEINFO_STRONG_CACHE, key); @@ -2369,6 +2376,10 @@ eject_from_strong_cache(const PyTypeObject *const type, PyObject *key) strong_cache_node_free(node); } + else if (PyErr_Occurred()) { + return -1; + } + return 0; } /* Moves a node to the front of the LRU cache. From 0c2bb8058363a0e95d7a5d070b83560662a0e776 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Fri, 5 Feb 2021 06:09:17 -0700 Subject: [PATCH 1128/1261] Fix a typo in a deprecation warning (GH-24423) --- Lib/distutils/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py index 5ddb95923809c9..7b2b059b83dad1 100644 --- a/Lib/distutils/__init__.py +++ b/Lib/distutils/__init__.py @@ -13,7 +13,7 @@ __version__ = sys.version[:sys.version.index(' ')] -warnings.warn("The distutils package deprecated and slated for " +warnings.warn("The distutils package is deprecated and slated for " "removal in Python 3.12. Use setuptools or check " "PEP 632 for potential alternatives", DeprecationWarning) From b3cba504bc5d81ffa42421caba837ac95cd55b50 Mon Sep 17 00:00:00 2001 From: Andrew Tennikoff Date: Sat, 6 Feb 2021 05:17:01 +1100 Subject: [PATCH 1129/1261] Simple typo fix (GH-24448) --- Doc/howto/urllib2.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 046a88af62f0b3..12d525771ddc28 100644 --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -97,7 +97,7 @@ schemes. For example, you can make an FTP request like so:: In the case of HTTP, there are two extra things that Request objects allow you to do: First, you can pass data to be sent to the server. Second, you can pass -extra information ("metadata") *about* the data or the about request itself, to +extra information ("metadata") *about* the data or about the request itself, to the server - this information is sent as HTTP "headers". Let's look at each of these in turn. From 9f16613af650f148b10bf6fbaee86d8a6b88c58c Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sun, 7 Feb 2021 00:28:50 -0500 Subject: [PATCH 1130/1261] bpo-16781: In 'exec' doc, add 'nonlocal' to 'yield' and 'return' (GH-2446) These 3 statements cannot be used at module scope -- nor in exec with one namespace. --- Doc/library/functions.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 55dd3f03f929c7..e36a1695c2ad58 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -526,7 +526,8 @@ are always available. They are listed here in alphabetical order. occurs). [#]_ If it is a code object, it is simply executed. In all cases, the code that's executed is expected to be valid as file input (see the section "File input" in the Reference Manual). Be aware that the - :keyword:`return` and :keyword:`yield` statements may not be used outside of + :keyword:`nonlocal`, :keyword:`yield`, and :keyword:`return` + statements may not be used outside of function definitions even within the context of code passed to the :func:`exec` function. The return value is ``None``. From b66fff2a0124da10bc6b641cf83ed2e7ba83cdf4 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 7 Feb 2021 18:42:21 +0000 Subject: [PATCH 1131/1261] bpo-43149: Improve error message for exception group without parentheses (GH-24467) --- Grammar/python.gram | 11 +- Lib/test/test_syntax.py | 33 + .../2021-02-07-03-27-14.bpo-43149.0umPKD.rst | 2 + Parser/parser.c | 917 +++++++++++------- 4 files changed, 611 insertions(+), 352 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-02-07-03-27-14.bpo-43149.0umPKD.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index d1a36f0e4d0940..bb70bbb565d321 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -201,9 +201,10 @@ try_stmt[stmt_ty]: | 'try' &&':' b=block f=finally_block { _Py_Try(b, NULL, NULL, f, EXTRA) } | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] { _Py_Try(b, ex, el, f, EXTRA) } except_block[excepthandler_ty]: - | 'except' e=expression t=['as' z=NAME { z }] &&':' b=block { + | 'except' e=expression t=['as' z=NAME { z }] ':' b=block { _Py_ExceptHandler(e, (t) ? ((expr_ty) t)->v.Name.id : NULL, b, EXTRA) } - | 'except' &&':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) } + | 'except' ':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) } + | invalid_except_block finally_block[asdl_stmt_seq*]: 'finally' ':' a=block { a } return_stmt[stmt_ty]: @@ -737,3 +738,9 @@ invalid_import_from_targets: invalid_with_stmt: | [ASYNC] 'with' ','.(expression ['as' star_target])+ &&':' | [ASYNC] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':' + +invalid_except_block: + | 'except' a=expression ',' expressions ['as' NAME ] ':' { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "exception group must be parenthesized") } + | 'except' expression ['as' NAME ] &&':' + | 'except' &&':' diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 70dd22c62aa215..47df0579f1ea65 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -835,6 +835,39 @@ ... SyntaxError: invalid syntax +Check that an exception group with missing parentheses +raise a custom exception + + >>> try: + ... pass + ... except A, B: + ... pass + Traceback (most recent call last): + SyntaxError: exception group must be parenthesized + + >>> try: + ... pass + ... except A, B, C: + ... pass + Traceback (most recent call last): + SyntaxError: exception group must be parenthesized + + >>> try: + ... pass + ... except A, B, C as blech: + ... pass + Traceback (most recent call last): + SyntaxError: exception group must be parenthesized + + >>> try: + ... pass + ... except A, B, C as blech: + ... pass + ... finally: + ... pass + Traceback (most recent call last): + SyntaxError: exception group must be parenthesized + >>> f(a=23, a=234) Traceback (most recent call last): diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-07-03-27-14.bpo-43149.0umPKD.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-07-03-27-14.bpo-43149.0umPKD.rst new file mode 100644 index 00000000000000..35ef84cc1e231d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-07-03-27-14.bpo-43149.0umPKD.rst @@ -0,0 +1,2 @@ +Improve the error message in the parser for exception groups without +parentheses. Patch by Pablo Galindo. diff --git a/Parser/parser.c b/Parser/parser.c index f4501d3bca094b..3f0d06fc833e08 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -232,170 +232,173 @@ static KeywordToken *reserved_keywords[] = { #define invalid_group_type 1163 #define invalid_import_from_targets_type 1164 #define invalid_with_stmt_type 1165 -#define _loop0_1_type 1166 -#define _loop0_2_type 1167 -#define _loop0_4_type 1168 -#define _gather_3_type 1169 -#define _loop0_6_type 1170 -#define _gather_5_type 1171 -#define _loop0_8_type 1172 -#define _gather_7_type 1173 -#define _loop0_10_type 1174 -#define _gather_9_type 1175 -#define _loop1_11_type 1176 -#define _loop0_13_type 1177 -#define _gather_12_type 1178 -#define _tmp_14_type 1179 -#define _tmp_15_type 1180 -#define _tmp_16_type 1181 -#define _tmp_17_type 1182 -#define _tmp_18_type 1183 -#define _tmp_19_type 1184 -#define _tmp_20_type 1185 -#define _tmp_21_type 1186 -#define _loop1_22_type 1187 -#define _tmp_23_type 1188 -#define _tmp_24_type 1189 -#define _loop0_26_type 1190 -#define _gather_25_type 1191 -#define _loop0_28_type 1192 -#define _gather_27_type 1193 -#define _tmp_29_type 1194 -#define _tmp_30_type 1195 -#define _loop0_31_type 1196 -#define _loop1_32_type 1197 -#define _loop0_34_type 1198 -#define _gather_33_type 1199 -#define _tmp_35_type 1200 -#define _loop0_37_type 1201 -#define _gather_36_type 1202 -#define _tmp_38_type 1203 -#define _loop0_40_type 1204 -#define _gather_39_type 1205 -#define _loop0_42_type 1206 -#define _gather_41_type 1207 -#define _loop0_44_type 1208 -#define _gather_43_type 1209 -#define _loop0_46_type 1210 -#define _gather_45_type 1211 -#define _tmp_47_type 1212 -#define _loop1_48_type 1213 -#define _tmp_49_type 1214 -#define _tmp_50_type 1215 -#define _tmp_51_type 1216 -#define _tmp_52_type 1217 -#define _tmp_53_type 1218 -#define _loop0_54_type 1219 -#define _loop0_55_type 1220 -#define _loop0_56_type 1221 -#define _loop1_57_type 1222 -#define _loop0_58_type 1223 -#define _loop1_59_type 1224 -#define _loop1_60_type 1225 -#define _loop1_61_type 1226 -#define _loop0_62_type 1227 -#define _loop1_63_type 1228 -#define _loop0_64_type 1229 -#define _loop1_65_type 1230 -#define _loop0_66_type 1231 -#define _loop1_67_type 1232 -#define _loop1_68_type 1233 -#define _tmp_69_type 1234 -#define _loop1_70_type 1235 -#define _loop0_72_type 1236 -#define _gather_71_type 1237 -#define _loop1_73_type 1238 -#define _loop0_74_type 1239 -#define _loop0_75_type 1240 -#define _loop0_76_type 1241 -#define _loop1_77_type 1242 -#define _loop0_78_type 1243 -#define _loop1_79_type 1244 -#define _loop1_80_type 1245 -#define _loop1_81_type 1246 -#define _loop0_82_type 1247 -#define _loop1_83_type 1248 -#define _loop0_84_type 1249 -#define _loop1_85_type 1250 -#define _loop0_86_type 1251 -#define _loop1_87_type 1252 -#define _loop1_88_type 1253 -#define _loop1_89_type 1254 -#define _loop1_90_type 1255 -#define _tmp_91_type 1256 -#define _loop0_93_type 1257 -#define _gather_92_type 1258 -#define _tmp_94_type 1259 -#define _tmp_95_type 1260 -#define _tmp_96_type 1261 -#define _tmp_97_type 1262 -#define _loop1_98_type 1263 -#define _tmp_99_type 1264 -#define _tmp_100_type 1265 -#define _loop0_102_type 1266 -#define _gather_101_type 1267 -#define _loop1_103_type 1268 -#define _loop0_104_type 1269 -#define _loop0_105_type 1270 -#define _loop0_107_type 1271 -#define _gather_106_type 1272 -#define _tmp_108_type 1273 -#define _loop0_110_type 1274 -#define _gather_109_type 1275 -#define _loop0_112_type 1276 -#define _gather_111_type 1277 -#define _loop0_114_type 1278 -#define _gather_113_type 1279 -#define _loop0_116_type 1280 -#define _gather_115_type 1281 -#define _loop0_117_type 1282 -#define _loop0_119_type 1283 -#define _gather_118_type 1284 -#define _loop1_120_type 1285 -#define _tmp_121_type 1286 -#define _loop0_123_type 1287 -#define _gather_122_type 1288 -#define _loop0_125_type 1289 -#define _gather_124_type 1290 -#define _tmp_126_type 1291 -#define _loop0_127_type 1292 -#define _loop0_128_type 1293 -#define _loop0_129_type 1294 -#define _tmp_130_type 1295 -#define _tmp_131_type 1296 -#define _tmp_132_type 1297 -#define _loop0_133_type 1298 -#define _loop1_134_type 1299 -#define _loop0_135_type 1300 -#define _loop1_136_type 1301 -#define _tmp_137_type 1302 -#define _tmp_138_type 1303 -#define _tmp_139_type 1304 -#define _loop0_141_type 1305 -#define _gather_140_type 1306 -#define _loop0_143_type 1307 -#define _gather_142_type 1308 -#define _tmp_144_type 1309 -#define _tmp_145_type 1310 -#define _tmp_146_type 1311 -#define _tmp_147_type 1312 -#define _tmp_148_type 1313 -#define _tmp_149_type 1314 -#define _tmp_150_type 1315 -#define _tmp_151_type 1316 -#define _tmp_152_type 1317 -#define _tmp_153_type 1318 -#define _tmp_154_type 1319 -#define _tmp_155_type 1320 -#define _tmp_156_type 1321 -#define _tmp_157_type 1322 -#define _tmp_158_type 1323 -#define _tmp_159_type 1324 -#define _tmp_160_type 1325 -#define _tmp_161_type 1326 -#define _tmp_162_type 1327 -#define _tmp_163_type 1328 -#define _tmp_164_type 1329 +#define invalid_except_block_type 1166 +#define _loop0_1_type 1167 +#define _loop0_2_type 1168 +#define _loop0_4_type 1169 +#define _gather_3_type 1170 +#define _loop0_6_type 1171 +#define _gather_5_type 1172 +#define _loop0_8_type 1173 +#define _gather_7_type 1174 +#define _loop0_10_type 1175 +#define _gather_9_type 1176 +#define _loop1_11_type 1177 +#define _loop0_13_type 1178 +#define _gather_12_type 1179 +#define _tmp_14_type 1180 +#define _tmp_15_type 1181 +#define _tmp_16_type 1182 +#define _tmp_17_type 1183 +#define _tmp_18_type 1184 +#define _tmp_19_type 1185 +#define _tmp_20_type 1186 +#define _tmp_21_type 1187 +#define _loop1_22_type 1188 +#define _tmp_23_type 1189 +#define _tmp_24_type 1190 +#define _loop0_26_type 1191 +#define _gather_25_type 1192 +#define _loop0_28_type 1193 +#define _gather_27_type 1194 +#define _tmp_29_type 1195 +#define _tmp_30_type 1196 +#define _loop0_31_type 1197 +#define _loop1_32_type 1198 +#define _loop0_34_type 1199 +#define _gather_33_type 1200 +#define _tmp_35_type 1201 +#define _loop0_37_type 1202 +#define _gather_36_type 1203 +#define _tmp_38_type 1204 +#define _loop0_40_type 1205 +#define _gather_39_type 1206 +#define _loop0_42_type 1207 +#define _gather_41_type 1208 +#define _loop0_44_type 1209 +#define _gather_43_type 1210 +#define _loop0_46_type 1211 +#define _gather_45_type 1212 +#define _tmp_47_type 1213 +#define _loop1_48_type 1214 +#define _tmp_49_type 1215 +#define _tmp_50_type 1216 +#define _tmp_51_type 1217 +#define _tmp_52_type 1218 +#define _tmp_53_type 1219 +#define _loop0_54_type 1220 +#define _loop0_55_type 1221 +#define _loop0_56_type 1222 +#define _loop1_57_type 1223 +#define _loop0_58_type 1224 +#define _loop1_59_type 1225 +#define _loop1_60_type 1226 +#define _loop1_61_type 1227 +#define _loop0_62_type 1228 +#define _loop1_63_type 1229 +#define _loop0_64_type 1230 +#define _loop1_65_type 1231 +#define _loop0_66_type 1232 +#define _loop1_67_type 1233 +#define _loop1_68_type 1234 +#define _tmp_69_type 1235 +#define _loop1_70_type 1236 +#define _loop0_72_type 1237 +#define _gather_71_type 1238 +#define _loop1_73_type 1239 +#define _loop0_74_type 1240 +#define _loop0_75_type 1241 +#define _loop0_76_type 1242 +#define _loop1_77_type 1243 +#define _loop0_78_type 1244 +#define _loop1_79_type 1245 +#define _loop1_80_type 1246 +#define _loop1_81_type 1247 +#define _loop0_82_type 1248 +#define _loop1_83_type 1249 +#define _loop0_84_type 1250 +#define _loop1_85_type 1251 +#define _loop0_86_type 1252 +#define _loop1_87_type 1253 +#define _loop1_88_type 1254 +#define _loop1_89_type 1255 +#define _loop1_90_type 1256 +#define _tmp_91_type 1257 +#define _loop0_93_type 1258 +#define _gather_92_type 1259 +#define _tmp_94_type 1260 +#define _tmp_95_type 1261 +#define _tmp_96_type 1262 +#define _tmp_97_type 1263 +#define _loop1_98_type 1264 +#define _tmp_99_type 1265 +#define _tmp_100_type 1266 +#define _loop0_102_type 1267 +#define _gather_101_type 1268 +#define _loop1_103_type 1269 +#define _loop0_104_type 1270 +#define _loop0_105_type 1271 +#define _loop0_107_type 1272 +#define _gather_106_type 1273 +#define _tmp_108_type 1274 +#define _loop0_110_type 1275 +#define _gather_109_type 1276 +#define _loop0_112_type 1277 +#define _gather_111_type 1278 +#define _loop0_114_type 1279 +#define _gather_113_type 1280 +#define _loop0_116_type 1281 +#define _gather_115_type 1282 +#define _loop0_117_type 1283 +#define _loop0_119_type 1284 +#define _gather_118_type 1285 +#define _loop1_120_type 1286 +#define _tmp_121_type 1287 +#define _loop0_123_type 1288 +#define _gather_122_type 1289 +#define _loop0_125_type 1290 +#define _gather_124_type 1291 +#define _tmp_126_type 1292 +#define _loop0_127_type 1293 +#define _loop0_128_type 1294 +#define _loop0_129_type 1295 +#define _tmp_130_type 1296 +#define _tmp_131_type 1297 +#define _tmp_132_type 1298 +#define _loop0_133_type 1299 +#define _loop1_134_type 1300 +#define _loop0_135_type 1301 +#define _loop1_136_type 1302 +#define _tmp_137_type 1303 +#define _tmp_138_type 1304 +#define _tmp_139_type 1305 +#define _loop0_141_type 1306 +#define _gather_140_type 1307 +#define _loop0_143_type 1308 +#define _gather_142_type 1309 +#define _tmp_144_type 1310 +#define _tmp_145_type 1311 +#define _tmp_146_type 1312 +#define _tmp_147_type 1313 +#define _tmp_148_type 1314 +#define _tmp_149_type 1315 +#define _tmp_150_type 1316 +#define _tmp_151_type 1317 +#define _tmp_152_type 1318 +#define _tmp_153_type 1319 +#define _tmp_154_type 1320 +#define _tmp_155_type 1321 +#define _tmp_156_type 1322 +#define _tmp_157_type 1323 +#define _tmp_158_type 1324 +#define _tmp_159_type 1325 +#define _tmp_160_type 1326 +#define _tmp_161_type 1327 +#define _tmp_162_type 1328 +#define _tmp_163_type 1329 +#define _tmp_164_type 1330 +#define _tmp_165_type 1331 +#define _tmp_166_type 1332 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -563,6 +566,7 @@ static void *invalid_for_target_rule(Parser *p); static void *invalid_group_rule(Parser *p); static void *invalid_import_from_targets_rule(Parser *p); static void *invalid_with_stmt_rule(Parser *p); +static void *invalid_except_block_rule(Parser *p); static asdl_seq *_loop0_1_rule(Parser *p); static asdl_seq *_loop0_2_rule(Parser *p); static asdl_seq *_loop0_4_rule(Parser *p); @@ -727,6 +731,8 @@ static void *_tmp_161_rule(Parser *p); static void *_tmp_162_rule(Parser *p); static void *_tmp_163_rule(Parser *p); static void *_tmp_164_rule(Parser *p); +static void *_tmp_165_rule(Parser *p); +static void *_tmp_166_rule(Parser *p); // file: statements? $ @@ -4551,7 +4557,10 @@ try_stmt_rule(Parser *p) return _res; } -// except_block: 'except' expression ['as' NAME] &&':' block | 'except' &&':' block +// except_block: +// | 'except' expression ['as' NAME] ':' block +// | 'except' ':' block +// | invalid_except_block static excepthandler_ty except_block_rule(Parser *p) { @@ -4571,12 +4580,12 @@ except_block_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // 'except' expression ['as' NAME] &&':' block + { // 'except' expression ['as' NAME] ':' block if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] &&':' block")); + D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] ':' block")); Token * _keyword; Token * _literal; asdl_stmt_seq* b; @@ -4589,12 +4598,12 @@ except_block_rule(Parser *p) && (t = _tmp_49_rule(p), 1) // ['as' NAME] && - (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + (_literal = _PyPegen_expect_token(p, 11)) // token=':' && (b = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] &&':' block")); + D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] ':' block")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -4614,26 +4623,26 @@ except_block_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s except_block[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ['as' NAME] &&':' block")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ['as' NAME] ':' block")); } - { // 'except' &&':' block + { // 'except' ':' block if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' &&':' block")); + D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' ':' block")); Token * _keyword; Token * _literal; asdl_stmt_seq* b; if ( (_keyword = _PyPegen_expect_token(p, 521)) // token='except' && - (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + (_literal = _PyPegen_expect_token(p, 11)) // token=':' && (b = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' &&':' block")); + D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' ':' block")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -4653,7 +4662,26 @@ except_block_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s except_block[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' &&':' block")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' ':' block")); + } + if (p->call_invalid_rules) { // invalid_except_block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_except_block")); + void *invalid_except_block_var; + if ( + (invalid_except_block_var = invalid_except_block_rule(p)) // invalid_except_block + ) + { + D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_except_block")); + _res = invalid_except_block_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s except_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_except_block")); } _res = NULL; done: @@ -16017,6 +16045,117 @@ invalid_with_stmt_rule(Parser *p) return _res; } +// invalid_except_block: +// | 'except' expression ',' expressions ['as' NAME] ':' +// | 'except' expression ['as' NAME] &&':' +// | 'except' &&':' +static void * +invalid_except_block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'except' expression ',' expressions ['as' NAME] ':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression ',' expressions ['as' NAME] ':'")); + Token * _keyword; + Token * _literal; + Token * _literal_1; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + expr_ty expressions_var; + if ( + (_keyword = _PyPegen_expect_token(p, 521)) // token='except' + && + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (expressions_var = expressions_rule(p)) // expressions + && + (_opt_var = _tmp_144_rule(p), 1) // ['as' NAME] + && + (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression ',' expressions ['as' NAME] ':'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "exception group must be parenthesized" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_except_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ',' expressions ['as' NAME] ':'")); + } + { // 'except' expression ['as' NAME] &&':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] &&':'")); + Token * _keyword; + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty expression_var; + if ( + (_keyword = _PyPegen_expect_token(p, 521)) // token='except' + && + (expression_var = expression_rule(p)) // expression + && + (_opt_var = _tmp_145_rule(p), 1) // ['as' NAME] + && + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] &&':'")); + _res = _PyPegen_dummy_name(p, _keyword, expression_var, _opt_var, _literal); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_except_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ['as' NAME] &&':'")); + } + { // 'except' &&':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' &&':'")); + Token * _keyword; + Token * _literal; + if ( + (_keyword = _PyPegen_expect_token(p, 521)) // token='except' + && + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' &&':'")); + _res = _PyPegen_dummy_name(p, _keyword, _literal); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_except_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' &&':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + // _loop0_1: NEWLINE static asdl_seq * _loop0_1_rule(Parser *p) @@ -17265,12 +17404,12 @@ _loop1_22_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_144_var; + void *_tmp_146_var; while ( - (_tmp_144_var = _tmp_144_rule(p)) // star_targets '=' + (_tmp_146_var = _tmp_146_rule(p)) // star_targets '=' ) { - _res = _tmp_144_var; + _res = _tmp_146_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17773,12 +17912,12 @@ _loop0_31_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_145_var; + void *_tmp_147_var; while ( - (_tmp_145_var = _tmp_145_rule(p)) // '.' | '...' + (_tmp_147_var = _tmp_147_rule(p)) // '.' | '...' ) { - _res = _tmp_145_var; + _res = _tmp_147_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17839,12 +17978,12 @@ _loop1_32_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_146_var; + void *_tmp_148_var; while ( - (_tmp_146_var = _tmp_146_rule(p)) // '.' | '...' + (_tmp_148_var = _tmp_148_rule(p)) // '.' | '...' ) { - _res = _tmp_146_var; + _res = _tmp_148_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -20001,12 +20140,12 @@ _loop1_68_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); - void *_tmp_147_var; + void *_tmp_149_var; while ( - (_tmp_147_var = _tmp_147_rule(p)) // '@' named_expression NEWLINE + (_tmp_149_var = _tmp_149_rule(p)) // '@' named_expression NEWLINE ) { - _res = _tmp_147_var; + _res = _tmp_149_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -20119,12 +20258,12 @@ _loop1_70_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); - void *_tmp_148_var; + void *_tmp_150_var; while ( - (_tmp_148_var = _tmp_148_rule(p)) // ',' star_expression + (_tmp_150_var = _tmp_150_rule(p)) // ',' star_expression ) { - _res = _tmp_148_var; + _res = _tmp_150_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -20304,12 +20443,12 @@ _loop1_73_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); - void *_tmp_149_var; + void *_tmp_151_var; while ( - (_tmp_149_var = _tmp_149_rule(p)) // ',' expression + (_tmp_151_var = _tmp_151_rule(p)) // ',' expression ) { - _res = _tmp_149_var; + _res = _tmp_151_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21334,12 +21473,12 @@ _loop1_88_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); - void *_tmp_150_var; + void *_tmp_152_var; while ( - (_tmp_150_var = _tmp_150_rule(p)) // 'or' conjunction + (_tmp_152_var = _tmp_152_rule(p)) // 'or' conjunction ) { - _res = _tmp_150_var; + _res = _tmp_152_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21405,12 +21544,12 @@ _loop1_89_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); - void *_tmp_151_var; + void *_tmp_153_var; while ( - (_tmp_151_var = _tmp_151_rule(p)) // 'and' inversion + (_tmp_153_var = _tmp_153_rule(p)) // 'and' inversion ) { - _res = _tmp_151_var; + _res = _tmp_153_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22326,12 +22465,12 @@ _loop0_104_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_152_var; + void *_tmp_154_var; while ( - (_tmp_152_var = _tmp_152_rule(p)) // 'if' disjunction + (_tmp_154_var = _tmp_154_rule(p)) // 'if' disjunction ) { - _res = _tmp_152_var; + _res = _tmp_154_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22392,12 +22531,12 @@ _loop0_105_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_153_var; + void *_tmp_155_var; while ( - (_tmp_153_var = _tmp_153_rule(p)) // 'if' disjunction + (_tmp_155_var = _tmp_155_rule(p)) // 'if' disjunction ) { - _res = _tmp_153_var; + _res = _tmp_155_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22463,7 +22602,7 @@ _loop0_107_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_154_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_156_rule(p)) // starred_expression | named_expression !'=' ) { _res = elem; @@ -22526,7 +22665,7 @@ _gather_106_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_154_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_156_rule(p)) // starred_expression | named_expression !'=' && (seq = _loop0_107_rule(p)) // _loop0_107 ) @@ -23072,12 +23211,12 @@ _loop0_117_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_155_var; + void *_tmp_157_var; while ( - (_tmp_155_var = _tmp_155_rule(p)) // ',' star_target + (_tmp_157_var = _tmp_157_rule(p)) // ',' star_target ) { - _res = _tmp_155_var; + _res = _tmp_157_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23252,12 +23391,12 @@ _loop1_120_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_156_var; + void *_tmp_158_var; while ( - (_tmp_156_var = _tmp_156_rule(p)) // ',' star_target + (_tmp_158_var = _tmp_158_rule(p)) // ',' star_target ) { - _res = _tmp_156_var; + _res = _tmp_158_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23713,12 +23852,12 @@ _loop0_128_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_157_var; + void *_tmp_159_var; while ( - (_tmp_157_var = _tmp_157_rule(p)) // star_targets '=' + (_tmp_159_var = _tmp_159_rule(p)) // star_targets '=' ) { - _res = _tmp_157_var; + _res = _tmp_159_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23779,12 +23918,12 @@ _loop0_129_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_158_var; + void *_tmp_160_var; while ( - (_tmp_158_var = _tmp_158_rule(p)) // star_targets '=' + (_tmp_160_var = _tmp_160_rule(p)) // star_targets '=' ) { - _res = _tmp_158_var; + _res = _tmp_160_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -24313,15 +24452,15 @@ _tmp_137_rule(Parser *p) } D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); Token * _literal; - void *_tmp_159_var; + void *_tmp_161_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_159_var = _tmp_159_rule(p)) // ')' | '**' + (_tmp_161_var = _tmp_161_rule(p)) // ')' | '**' ) { D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_159_var); + _res = _PyPegen_dummy_name(p, _literal, _tmp_161_var); goto done; } p->mark = _mark; @@ -24371,15 +24510,15 @@ _tmp_138_rule(Parser *p) } D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); Token * _literal; - void *_tmp_160_var; + void *_tmp_162_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_160_var = _tmp_160_rule(p)) // ':' | '**' + (_tmp_162_var = _tmp_162_rule(p)) // ':' | '**' ) { D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_160_var); + _res = _PyPegen_dummy_name(p, _literal, _tmp_162_var); goto done; } p->mark = _mark; @@ -24498,7 +24637,7 @@ _loop0_141_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_161_rule(p)) // expression ['as' star_target] + (elem = _tmp_163_rule(p)) // expression ['as' star_target] ) { _res = elem; @@ -24561,7 +24700,7 @@ _gather_140_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_161_rule(p)) // expression ['as' star_target] + (elem = _tmp_163_rule(p)) // expression ['as' star_target] && (seq = _loop0_141_rule(p)) // _loop0_141 ) @@ -24612,7 +24751,7 @@ _loop0_143_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_162_rule(p)) // expressions ['as' star_target] + (elem = _tmp_164_rule(p)) // expressions ['as' star_target] ) { _res = elem; @@ -24675,7 +24814,7 @@ _gather_142_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_162_rule(p)) // expressions ['as' star_target] + (elem = _tmp_164_rule(p)) // expressions ['as' star_target] && (seq = _loop0_143_rule(p)) // _loop0_143 ) @@ -24694,9 +24833,87 @@ _gather_142_rule(Parser *p) return _res; } -// _tmp_144: star_targets '=' +// _tmp_144: 'as' NAME static void * _tmp_144_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + Token * _keyword; + expr_ty name_var; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + _res = _PyPegen_dummy_name(p, _keyword, name_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_145: 'as' NAME +static void * +_tmp_145_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + Token * _keyword; + expr_ty name_var; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + _res = _PyPegen_dummy_name(p, _keyword, name_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_146: star_targets '=' +static void * +_tmp_146_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24710,7 +24927,7 @@ _tmp_144_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty z; if ( @@ -24719,7 +24936,7 @@ _tmp_144_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24729,7 +24946,7 @@ _tmp_144_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24738,9 +24955,9 @@ _tmp_144_rule(Parser *p) return _res; } -// _tmp_145: '.' | '...' +// _tmp_147: '.' | '...' static void * -_tmp_145_rule(Parser *p) +_tmp_147_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24754,18 +24971,18 @@ _tmp_145_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -24773,18 +24990,18 @@ _tmp_145_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -24793,9 +25010,9 @@ _tmp_145_rule(Parser *p) return _res; } -// _tmp_146: '.' | '...' +// _tmp_148: '.' | '...' static void * -_tmp_146_rule(Parser *p) +_tmp_148_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24809,18 +25026,18 @@ _tmp_146_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -24828,18 +25045,18 @@ _tmp_146_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -24848,9 +25065,9 @@ _tmp_146_rule(Parser *p) return _res; } -// _tmp_147: '@' named_expression NEWLINE +// _tmp_149: '@' named_expression NEWLINE static void * -_tmp_147_rule(Parser *p) +_tmp_149_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24864,7 +25081,7 @@ _tmp_147_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); Token * _literal; expr_ty f; Token * newline_var; @@ -24876,7 +25093,7 @@ _tmp_147_rule(Parser *p) (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); _res = f; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24886,7 +25103,7 @@ _tmp_147_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); } _res = NULL; @@ -24895,9 +25112,9 @@ _tmp_147_rule(Parser *p) return _res; } -// _tmp_148: ',' star_expression +// _tmp_150: ',' star_expression static void * -_tmp_148_rule(Parser *p) +_tmp_150_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24911,7 +25128,7 @@ _tmp_148_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); Token * _literal; expr_ty c; if ( @@ -24920,7 +25137,7 @@ _tmp_148_rule(Parser *p) (c = star_expression_rule(p)) // star_expression ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24930,7 +25147,7 @@ _tmp_148_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } _res = NULL; @@ -24939,9 +25156,9 @@ _tmp_148_rule(Parser *p) return _res; } -// _tmp_149: ',' expression +// _tmp_151: ',' expression static void * -_tmp_149_rule(Parser *p) +_tmp_151_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24955,7 +25172,7 @@ _tmp_149_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty c; if ( @@ -24964,7 +25181,7 @@ _tmp_149_rule(Parser *p) (c = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24974,7 +25191,7 @@ _tmp_149_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -24983,9 +25200,9 @@ _tmp_149_rule(Parser *p) return _res; } -// _tmp_150: 'or' conjunction +// _tmp_152: 'or' conjunction static void * -_tmp_150_rule(Parser *p) +_tmp_152_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24999,7 +25216,7 @@ _tmp_150_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); Token * _keyword; expr_ty c; if ( @@ -25008,7 +25225,7 @@ _tmp_150_rule(Parser *p) (c = conjunction_rule(p)) // conjunction ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25018,7 +25235,7 @@ _tmp_150_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); } _res = NULL; @@ -25027,9 +25244,9 @@ _tmp_150_rule(Parser *p) return _res; } -// _tmp_151: 'and' inversion +// _tmp_153: 'and' inversion static void * -_tmp_151_rule(Parser *p) +_tmp_153_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25043,7 +25260,7 @@ _tmp_151_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); Token * _keyword; expr_ty c; if ( @@ -25052,7 +25269,7 @@ _tmp_151_rule(Parser *p) (c = inversion_rule(p)) // inversion ) { - D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25062,7 +25279,7 @@ _tmp_151_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); } _res = NULL; @@ -25071,9 +25288,9 @@ _tmp_151_rule(Parser *p) return _res; } -// _tmp_152: 'if' disjunction +// _tmp_154: 'if' disjunction static void * -_tmp_152_rule(Parser *p) +_tmp_154_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25087,7 +25304,7 @@ _tmp_152_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -25096,7 +25313,7 @@ _tmp_152_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25106,7 +25323,7 @@ _tmp_152_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -25115,9 +25332,9 @@ _tmp_152_rule(Parser *p) return _res; } -// _tmp_153: 'if' disjunction +// _tmp_155: 'if' disjunction static void * -_tmp_153_rule(Parser *p) +_tmp_155_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25131,7 +25348,7 @@ _tmp_153_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -25140,7 +25357,7 @@ _tmp_153_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25150,7 +25367,7 @@ _tmp_153_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -25159,9 +25376,9 @@ _tmp_153_rule(Parser *p) return _res; } -// _tmp_154: starred_expression | named_expression !'=' +// _tmp_156: starred_expression | named_expression !'=' static void * -_tmp_154_rule(Parser *p) +_tmp_156_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25175,18 +25392,18 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } { // named_expression !'=' @@ -25194,7 +25411,7 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); expr_ty named_expression_var; if ( (named_expression_var = named_expression_rule(p)) // named_expression @@ -25202,12 +25419,12 @@ _tmp_154_rule(Parser *p) _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); _res = named_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression !'='")); } _res = NULL; @@ -25216,9 +25433,9 @@ _tmp_154_rule(Parser *p) return _res; } -// _tmp_155: ',' star_target +// _tmp_157: ',' star_target static void * -_tmp_155_rule(Parser *p) +_tmp_157_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25232,7 +25449,7 @@ _tmp_155_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -25241,7 +25458,7 @@ _tmp_155_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25251,7 +25468,7 @@ _tmp_155_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -25260,9 +25477,9 @@ _tmp_155_rule(Parser *p) return _res; } -// _tmp_156: ',' star_target +// _tmp_158: ',' star_target static void * -_tmp_156_rule(Parser *p) +_tmp_158_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25276,7 +25493,7 @@ _tmp_156_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -25285,7 +25502,7 @@ _tmp_156_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25295,7 +25512,7 @@ _tmp_156_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -25304,9 +25521,9 @@ _tmp_156_rule(Parser *p) return _res; } -// _tmp_157: star_targets '=' +// _tmp_159: star_targets '=' static void * -_tmp_157_rule(Parser *p) +_tmp_159_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25320,7 +25537,7 @@ _tmp_157_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -25329,12 +25546,12 @@ _tmp_157_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -25343,9 +25560,9 @@ _tmp_157_rule(Parser *p) return _res; } -// _tmp_158: star_targets '=' +// _tmp_160: star_targets '=' static void * -_tmp_158_rule(Parser *p) +_tmp_160_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25359,7 +25576,7 @@ _tmp_158_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -25368,12 +25585,12 @@ _tmp_158_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -25382,9 +25599,9 @@ _tmp_158_rule(Parser *p) return _res; } -// _tmp_159: ')' | '**' +// _tmp_161: ')' | '**' static void * -_tmp_159_rule(Parser *p) +_tmp_161_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25398,18 +25615,18 @@ _tmp_159_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // '**' @@ -25417,18 +25634,18 @@ _tmp_159_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -25437,9 +25654,9 @@ _tmp_159_rule(Parser *p) return _res; } -// _tmp_160: ':' | '**' +// _tmp_162: ':' | '**' static void * -_tmp_160_rule(Parser *p) +_tmp_162_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25453,18 +25670,18 @@ _tmp_160_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '**' @@ -25472,18 +25689,18 @@ _tmp_160_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -25492,9 +25709,9 @@ _tmp_160_rule(Parser *p) return _res; } -// _tmp_161: expression ['as' star_target] +// _tmp_163: expression ['as' star_target] static void * -_tmp_161_rule(Parser *p) +_tmp_163_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25508,22 +25725,22 @@ _tmp_161_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_163_rule(p), 1) // ['as' star_target] + (_opt_var = _tmp_165_rule(p), 1) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]")); } _res = NULL; @@ -25532,9 +25749,9 @@ _tmp_161_rule(Parser *p) return _res; } -// _tmp_162: expressions ['as' star_target] +// _tmp_164: expressions ['as' star_target] static void * -_tmp_162_rule(Parser *p) +_tmp_164_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25548,22 +25765,22 @@ _tmp_162_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expressions_var; if ( (expressions_var = expressions_rule(p)) // expressions && - (_opt_var = _tmp_164_rule(p), 1) // ['as' star_target] + (_opt_var = _tmp_166_rule(p), 1) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); _res = _PyPegen_dummy_name(p, expressions_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions ['as' star_target]")); } _res = NULL; @@ -25572,9 +25789,9 @@ _tmp_162_rule(Parser *p) return _res; } -// _tmp_163: 'as' star_target +// _tmp_165: 'as' star_target static void * -_tmp_163_rule(Parser *p) +_tmp_165_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25588,7 +25805,7 @@ _tmp_163_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( @@ -25597,12 +25814,12 @@ _tmp_163_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; @@ -25611,9 +25828,9 @@ _tmp_163_rule(Parser *p) return _res; } -// _tmp_164: 'as' star_target +// _tmp_166: 'as' star_target static void * -_tmp_164_rule(Parser *p) +_tmp_166_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25627,7 +25844,7 @@ _tmp_164_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( @@ -25636,12 +25853,12 @@ _tmp_164_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; From 9922d00db4a307c9a871dee6d488240780463cda Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 7 Feb 2021 16:44:42 -0800 Subject: [PATCH 1132/1261] bpo-43147: Remove archaic terminology. (GH-24462) --- Doc/library/statistics.rst | 11 +++++------ Lib/statistics.py | 7 +++---- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 51b5e9c404c9c8..6b6d3154a28810 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -162,15 +162,14 @@ However, for reading convenience, most of the examples show sorted sequences. real-valued numbers. If *weights* is omitted or *None*, then equal weighting is assumed. - The harmonic mean, sometimes called the subcontrary mean, is the - reciprocal of the arithmetic :func:`mean` of the reciprocals of the - data. For example, the harmonic mean of three values *a*, *b* and *c* - will be equivalent to ``3/(1/a + 1/b + 1/c)``. If one of the values - is zero, the result will be zero. + The harmonic mean is the reciprocal of the arithmetic :func:`mean` of the + reciprocals of the data. For example, the harmonic mean of three values *a*, + *b* and *c* will be equivalent to ``3/(1/a + 1/b + 1/c)``. If one of the + values is zero, the result will be zero. The harmonic mean is a type of average, a measure of the central location of the data. It is often appropriate when averaging - rates or ratios, for example speeds. + ratios or rates, for example speeds. Suppose a car travels 10 km at 40 km/hr, then another 10 km at 60 km/hr. What is the average speed? diff --git a/Lib/statistics.py b/Lib/statistics.py index 4b054b961141b4..2414869a7e6dc6 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -367,10 +367,9 @@ def geometric_mean(data): def harmonic_mean(data, weights=None): """Return the harmonic mean of data. - The harmonic mean, sometimes called the subcontrary mean, is the - reciprocal of the arithmetic mean of the reciprocals of the data, - and is often appropriate when averaging quantities which are rates - or ratios, for example speeds. + The harmonic mean is the reciprocal of the arithmetic mean of the + reciprocals of the data. It can be used for averaging ratios or + rates, for example speeds. Suppose a car travels 40 km/hr for 5 km and then speeds-up to 60 km/hr for another 5 km. What is the average speed? From 593b5910fc7ec0c18214cfdbc5dc46ea447712c7 Mon Sep 17 00:00:00 2001 From: Asheesh Laroia Date: Sun, 7 Feb 2021 19:15:51 -0800 Subject: [PATCH 1133/1261] bpo-40692: Run more test_concurrent_futures tests (GH-20239) In the case of multiprocessing.synchronize() being missing, the test_concurrent_futures test suite now skips only the tests that require multiprocessing.synchronize(). Validate that multiprocessing.synchronize exists as part of _check_system_limits(), allowing ProcessPoolExecutor to raise NotImplementedError during __init__, rather than crashing with ImportError during __init__ when creating a lock imported from multiprocessing.synchronize. Use _check_system_limits() to disable tests of ProcessPoolExecutor on systems without multiprocessing.synchronize. Running the test suite without multiprocessing.synchronize reveals that Lib/compileall.py crashes when it uses a ProcessPoolExecutor. Therefore, change Lib/compileall.py to call _check_system_limits() before creating the ProcessPoolExecutor. Note that both Lib/compileall.py and Lib/test/test_compileall.py were attempting to sanity-check ProcessPoolExecutor by expecting ImportError. In multiprocessing.resource_tracker, sem_unlink() is also absent on platforms where POSIX semaphores aren't available. Avoid using sem_unlink() if it, too, does not exist. Co-authored-by: Pablo Galindo --- Lib/compileall.py | 10 ++++++---- Lib/concurrent/futures/process.py | 8 ++++++++ Lib/multiprocessing/resource_tracker.py | 10 +++++++++- Lib/test/test_compileall.py | 11 +++++++++-- Lib/test/test_concurrent_futures.py | 19 ++++++++++++++++--- .../2020-05-19-22-10-05.bpo-40692.ajEhrR.rst | 1 + 6 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-19-22-10-05.bpo-40692.ajEhrR.rst diff --git a/Lib/compileall.py b/Lib/compileall.py index fe7f450c55e1c5..672cb439718692 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -84,12 +84,14 @@ def compile_dir(dir, maxlevels=None, ddir=None, force=False, if workers < 0: raise ValueError('workers must be greater or equal to 0') if workers != 1: + # Check if this is a system where ProcessPoolExecutor can function. + from concurrent.futures.process import _check_system_limits try: - # Only import when needed, as low resource platforms may - # fail to import it - from concurrent.futures import ProcessPoolExecutor - except ImportError: + _check_system_limits() + except NotImplementedError: workers = 1 + else: + from concurrent.futures import ProcessPoolExecutor if maxlevels is None: maxlevels = sys.getrecursionlimit() files = _walk_dir(dir, quiet=quiet, maxlevels=maxlevels) diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 90bc98bf2ecd17..764719859f7cea 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -532,6 +532,14 @@ def _check_system_limits(): if _system_limited: raise NotImplementedError(_system_limited) _system_limits_checked = True + try: + import multiprocessing.synchronize + except ImportError: + _system_limited = ( + "This Python build lacks multiprocessing.synchronize, usually due " + "to named semaphores being unavailable on this platform." + ) + raise NotImplementedError(_system_limited) try: nsems_max = os.sysconf("SC_SEM_NSEMS_MAX") except (AttributeError, ValueError): diff --git a/Lib/multiprocessing/resource_tracker.py b/Lib/multiprocessing/resource_tracker.py index c9bfa9b82b6e6c..cc42dbdda05b91 100644 --- a/Lib/multiprocessing/resource_tracker.py +++ b/Lib/multiprocessing/resource_tracker.py @@ -37,8 +37,16 @@ import _multiprocessing import _posixshmem + # Use sem_unlink() to clean up named semaphores. + # + # sem_unlink() may be missing if the Python build process detected the + # absence of POSIX named semaphores. In that case, no named semaphores were + # ever opened, so no cleanup would be necessary. + if hasattr(_multiprocessing, 'sem_unlink'): + _CLEANUP_FUNCS.update({ + 'semaphore': _multiprocessing.sem_unlink, + }) _CLEANUP_FUNCS.update({ - 'semaphore': _multiprocessing.sem_unlink, 'shared_memory': _posixshmem.shm_unlink, }) diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index be1149a87faef1..fa24b3c5a11dd9 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -16,10 +16,14 @@ import unittest from unittest import mock, skipUnless +from concurrent.futures import ProcessPoolExecutor try: - from concurrent.futures import ProcessPoolExecutor + # compileall relies on ProcessPoolExecutor if ProcessPoolExecutor exists + # and it can function. + from concurrent.futures.process import _check_system_limits + _check_system_limits() _have_multiprocessing = True -except ImportError: +except NotImplementedError: _have_multiprocessing = False from test import support @@ -188,6 +192,7 @@ def test_compile_dir_pathlike(self): self.assertRegex(line, r'Listing ([^WindowsPath|PosixPath].*)') self.assertTrue(os.path.isfile(self.bc_path)) + @skipUnless(_have_multiprocessing, "requires multiprocessing") @mock.patch('concurrent.futures.ProcessPoolExecutor') def test_compile_pool_called(self, pool_mock): compileall.compile_dir(self.directory, quiet=True, workers=5) @@ -198,11 +203,13 @@ def test_compile_workers_non_positive(self): "workers must be greater or equal to 0"): compileall.compile_dir(self.directory, workers=-1) + @skipUnless(_have_multiprocessing, "requires multiprocessing") @mock.patch('concurrent.futures.ProcessPoolExecutor') def test_compile_workers_cpu_count(self, pool_mock): compileall.compile_dir(self.directory, quiet=True, workers=0) self.assertEqual(pool_mock.call_args[1]['max_workers'], None) + @skipUnless(_have_multiprocessing, "requires multiprocessing") @mock.patch('concurrent.futures.ProcessPoolExecutor') @mock.patch('compileall.compile_file') def test_compile_one_worker(self, compile_file_mock, pool_mock): diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index a182b14fb9bc05..99651f5f4ed4da 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -4,8 +4,6 @@ # Skip tests if _multiprocessing wasn't built. import_helper.import_module('_multiprocessing') -# Skip tests if sem_open implementation is broken. -support.skip_if_broken_multiprocessing_synchronize() from test.support import hashlib_helper from test.support.script_helper import assert_python_ok @@ -27,7 +25,7 @@ from concurrent.futures._base import ( PENDING, RUNNING, CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED, Future, BrokenExecutor) -from concurrent.futures.process import BrokenProcessPool +from concurrent.futures.process import BrokenProcessPool, _check_system_limits from multiprocessing import get_context import multiprocessing.process @@ -161,6 +159,10 @@ class ProcessPoolForkMixin(ExecutorMixin): ctx = "fork" def get_context(self): + try: + _check_system_limits() + except NotImplementedError: + self.skipTest("ProcessPoolExecutor unavailable on this system") if sys.platform == "win32": self.skipTest("require unix system") return super().get_context() @@ -170,12 +172,23 @@ class ProcessPoolSpawnMixin(ExecutorMixin): executor_type = futures.ProcessPoolExecutor ctx = "spawn" + def get_context(self): + try: + _check_system_limits() + except NotImplementedError: + self.skipTest("ProcessPoolExecutor unavailable on this system") + return super().get_context() + class ProcessPoolForkserverMixin(ExecutorMixin): executor_type = futures.ProcessPoolExecutor ctx = "forkserver" def get_context(self): + try: + _check_system_limits() + except NotImplementedError: + self.skipTest("ProcessPoolExecutor unavailable on this system") if sys.platform == "win32": self.skipTest("require unix system") return super().get_context() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-19-22-10-05.bpo-40692.ajEhrR.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-19-22-10-05.bpo-40692.ajEhrR.rst new file mode 100644 index 00000000000000..b92dcdd00affc7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-05-19-22-10-05.bpo-40692.ajEhrR.rst @@ -0,0 +1 @@ +In the :class:`concurrent.futures.ProcessPoolExecutor`, validate that :func:`multiprocess.synchronize` is available on a given platform and rely on that check in the :mod:`concurrent.futures` test suite so we can run tests that are unrelated to :class:`ProcessPoolExecutor` on those platforms. From a050fcd40424ae071b8b647335ccabc3aa181bd7 Mon Sep 17 00:00:00 2001 From: Roland Hieber Date: Tue, 9 Feb 2021 02:05:25 +0100 Subject: [PATCH 1134/1261] bpo-13501: allow choosing between readline and libedit (GH-24189) In contrast to macOS, libedit is available as its own include file and library on Linux systems to prevent file name clashes. So if both libraries are available on the system, readline is currently chosen by default; and if only libedit is available, it is not found at all. This patch adds a way to link against libedit by adding the following arguments to configure: --with-readline link against libreadline (the default) --with-readline=editline link against libeditline --with-readline=no disable building the readline module --without-readline (same) The runtime detection of libedit vs. readline was already done in commit 7105319ada2e66365902 (2019-12-04, serge-sans-paille: "bpo-38634: Allow non-apple build to cope with libedit (GH-16986)"). Fixes: GH-12076 ("bpo-13501 Build or disable readline with Editline") Fixes: bpo-13501 ("Make libedit support more generic; port readline / libedit to FreeBSD") Co-authored-by: Enji Cooper (ngie-eign) Co-authored-by: Martin Panter (vadmium) Co-authored-by: Robert Marshall (kellinm) --- .../2021-01-10-22-25-23.bpo-13501.g4L-6R.rst | 2 + Modules/readline.c | 10 +- configure | 266 ++++++++++-------- configure.ac | 186 +++++++----- pyconfig.h.in | 5 +- setup.py | 13 +- 6 files changed, 275 insertions(+), 207 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-01-10-22-25-23.bpo-13501.g4L-6R.rst diff --git a/Misc/NEWS.d/next/Build/2021-01-10-22-25-23.bpo-13501.g4L-6R.rst b/Misc/NEWS.d/next/Build/2021-01-10-22-25-23.bpo-13501.g4L-6R.rst new file mode 100644 index 00000000000000..8dc9442725e678 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-01-10-22-25-23.bpo-13501.g4L-6R.rst @@ -0,0 +1,2 @@ +The configure script can now use *libedit* instead of *readline* with the +command line option ``--with-readline=editline``. diff --git a/Modules/readline.c b/Modules/readline.c index 6cb3ee5c66a0d8..02b2c40e6b900e 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -26,10 +26,14 @@ # define RESTORE_LOCALE(sl) #endif +#ifdef WITH_EDITLINE +# include +#else /* GNU readline definitions */ -#undef HAVE_CONFIG_H /* Else readline/chardefs.h includes strings.h */ -#include -#include +# undef HAVE_CONFIG_H /* Else readline/chardefs.h includes strings.h */ +# include +# include +#endif #ifdef HAVE_RL_COMPLETION_MATCHES #define completion_matches(x, y) \ diff --git a/configure b/configure index 39fb15f5c7959d..8e0cc71a50480d 100755 --- a/configure +++ b/configure @@ -849,6 +849,7 @@ with_libc enable_big_digits with_platlibdir with_wheel_pkg_dir +with_readline with_computed_gotos with_ensurepip with_openssl @@ -1581,6 +1582,8 @@ Optional Packages: --with-wheel-pkg-dir=PATH Directory of wheel packages used by ensurepip (default: none) + --with(out)-readline[=editline] + use Editline for backend or disable readline module --with-computed-gotos enable computed gotos in evaluation loop (enabled by default on supported compilers) --with-ensurepip[=install|upgrade|no] @@ -15602,24 +15605,49 @@ $as_echo "#define HAVE_GETC_UNLOCKED 1" >>confdefs.h fi + +# Check whether --with-readline was given. +if test "${with_readline+set}" = set; then : + withval=$with_readline; +else + with_readline=yes +fi + + # check where readline lives +py_cv_lib_readline=no # save the value of LIBS so we don't actually link Python with readline LIBS_no_readline=$LIBS -# On some systems we need to link readline to a termcap compatible -# library. NOTE: Keep the precedence of listed libraries synchronised -# with setup.py. -py_cv_lib_readline=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link readline libs" >&5 +if test "$with_readline" != no; then + case "$with_readline" in + editline|edit) + LIBREADLINE=edit + +$as_echo "#define WITH_EDITLINE 1" >>confdefs.h + + ;; + yes|readline) + LIBREADLINE=readline + ;; + *) + as_fn_error $? "proper usage is --with(out)-readline[=editline]" "$LINENO" 5 + ;; + esac + + # On some systems we need to link readline to a termcap compatible + # library. NOTE: Keep the precedence of listed libraries synchronised + # with setup.py. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link readline libs" >&5 $as_echo_n "checking how to link readline libs... " >&6; } -for py_libtermcap in "" tinfo ncursesw ncurses curses termcap; do - if test -z "$py_libtermcap"; then - READLINE_LIBS="-lreadline" - else - READLINE_LIBS="-lreadline -l$py_libtermcap" - fi - LIBS="$READLINE_LIBS $LIBS_no_readline" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + for py_libtermcap in "" tinfo ncursesw ncurses curses termcap; do + if test -z "$py_libtermcap"; then + READLINE_LIBS="-l$LIBREADLINE" + else + READLINE_LIBS="-l$LIBREADLINE -l$py_libtermcap" + fi + LIBS="$READLINE_LIBS $LIBS_no_readline" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -15642,73 +15670,67 @@ if ac_fn_c_try_link "$LINENO"; then : fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext - if test $py_cv_lib_readline = yes; then - break - fi -done -# Uncomment this line if you want to use READINE_LIBS in Makefile or scripts -#AC_SUBST([READLINE_LIBS]) -if test $py_cv_lib_readline = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 + if test $py_cv_lib_readline = yes; then + break + fi + done + + # Uncomment this line if you want to use READLINE_LIBS in Makefile or scripts + #AC_SUBST([READLINE_LIBS]) + if test $py_cv_lib_readline = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_LIBS" >&5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_LIBS" >&5 $as_echo "$READLINE_LIBS" >&6; } $as_echo "#define HAVE_LIBREADLINE 1" >>confdefs.h + fi fi -# check for readline 2.2 -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - have_readline=yes -else - have_readline=no - -fi -rm -f conftest.err conftest.i conftest.$ac_ext -if test $have_readline = yes -then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include +if test "$py_cv_lib_readline" = yes; then + # check for readline 2.2 + ac_fn_c_check_decl "$LINENO" "rl_completion_append_character" "ac_cv_have_decl_rl_completion_append_character" " +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "extern int rl_completion_append_character;" >/dev/null 2>&1; then : +" +if test "x$ac_cv_have_decl_rl_completion_append_character" = xyes; then : $as_echo "#define HAVE_RL_COMPLETION_APPEND_CHARACTER 1" >>confdefs.h fi -rm -f conftest* - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include + ac_fn_c_check_decl "$LINENO" "rl_completion_suppress_append" "ac_cv_have_decl_rl_completion_suppress_append" " +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "extern int rl_completion_suppress_append;" >/dev/null 2>&1; then : +" +if test "x$ac_cv_have_decl_rl_completion_suppress_append" = xyes; then : $as_echo "#define HAVE_RL_COMPLETION_SUPPRESS_APPEND 1" >>confdefs.h fi -rm -f conftest* -fi -# check for readline 4.0 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_pre_input_hook in -lreadline" >&5 -$as_echo_n "checking for rl_pre_input_hook in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_pre_input_hook+:} false; then : + # check for readline 4.0 + as_ac_Lib=`$as_echo "ac_cv_lib_$LIBREADLINE''_rl_pre_input_hook" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_pre_input_hook in -l$LIBREADLINE" >&5 +$as_echo_n "checking for rl_pre_input_hook in -l$LIBREADLINE... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lreadline $READLINE_LIBS $LIBS" +LIBS="-l$LIBREADLINE $READLINE_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15728,31 +15750,33 @@ return rl_pre_input_hook (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_readline_rl_pre_input_hook=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_readline_rl_pre_input_hook=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_pre_input_hook" >&5 -$as_echo "$ac_cv_lib_readline_rl_pre_input_hook" >&6; } -if test "x$ac_cv_lib_readline_rl_pre_input_hook" = xyes; then : +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define HAVE_RL_PRE_INPUT_HOOK 1" >>confdefs.h fi -# also in 4.0 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_display_matches_hook in -lreadline" >&5 -$as_echo_n "checking for rl_completion_display_matches_hook in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_completion_display_matches_hook+:} false; then : + # also in 4.0 + as_ac_Lib=`$as_echo "ac_cv_lib_$LIBREADLINE''_rl_completion_display_matches_hook" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_display_matches_hook in -l$LIBREADLINE" >&5 +$as_echo_n "checking for rl_completion_display_matches_hook in -l$LIBREADLINE... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lreadline $READLINE_LIBS $LIBS" +LIBS="-l$LIBREADLINE $READLINE_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15772,31 +15796,33 @@ return rl_completion_display_matches_hook (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_readline_rl_completion_display_matches_hook=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_readline_rl_completion_display_matches_hook=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_completion_display_matches_hook" >&5 -$as_echo "$ac_cv_lib_readline_rl_completion_display_matches_hook" >&6; } -if test "x$ac_cv_lib_readline_rl_completion_display_matches_hook" = xyes; then : +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 1" >>confdefs.h fi -# also in 4.0, but not in editline -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_resize_terminal in -lreadline" >&5 -$as_echo_n "checking for rl_resize_terminal in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_resize_terminal+:} false; then : + # also in 4.0, but not in editline + as_ac_Lib=`$as_echo "ac_cv_lib_$LIBREADLINE''_rl_resize_terminal" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_resize_terminal in -l$LIBREADLINE" >&5 +$as_echo_n "checking for rl_resize_terminal in -l$LIBREADLINE... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lreadline $READLINE_LIBS $LIBS" +LIBS="-l$LIBREADLINE $READLINE_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15816,31 +15842,33 @@ return rl_resize_terminal (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_readline_rl_resize_terminal=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_readline_rl_resize_terminal=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_resize_terminal" >&5 -$as_echo "$ac_cv_lib_readline_rl_resize_terminal" >&6; } -if test "x$ac_cv_lib_readline_rl_resize_terminal" = xyes; then : +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define HAVE_RL_RESIZE_TERMINAL 1" >>confdefs.h fi -# check for readline 4.2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 -$as_echo_n "checking for rl_completion_matches in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_completion_matches+:} false; then : + # check for readline 4.2 + as_ac_Lib=`$as_echo "ac_cv_lib_$LIBREADLINE''_rl_completion_matches" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -l$LIBREADLINE" >&5 +$as_echo_n "checking for rl_completion_matches in -l$LIBREADLINE... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lreadline $READLINE_LIBS $LIBS" +LIBS="-l$LIBREADLINE $READLINE_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15860,59 +15888,49 @@ return rl_completion_matches (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_readline_rl_completion_matches=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_readline_rl_completion_matches=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_completion_matches" >&5 -$as_echo "$ac_cv_lib_readline_rl_completion_matches" >&6; } -if test "x$ac_cv_lib_readline_rl_completion_matches" = xyes; then : +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define HAVE_RL_COMPLETION_MATCHES 1" >>confdefs.h fi -# also in readline 4.2 -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - have_readline=yes -else - have_readline=no - -fi -rm -f conftest.err conftest.i conftest.$ac_ext -if test $have_readline = yes -then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include + # also in readline 4.2 + ac_fn_c_check_decl "$LINENO" "rl_catch_signals" "ac_cv_have_decl_rl_catch_signals" " +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "extern int rl_catch_signals;" >/dev/null 2>&1; then : +" +if test "x$ac_cv_have_decl_rl_catch_signals" = xyes; then : $as_echo "#define HAVE_RL_CATCH_SIGNAL 1" >>confdefs.h fi -rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for append_history in -lreadline" >&5 -$as_echo_n "checking for append_history in -lreadline... " >&6; } -if ${ac_cv_lib_readline_append_history+:} false; then : + as_ac_Lib=`$as_echo "ac_cv_lib_$LIBREADLINE''_append_history" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for append_history in -l$LIBREADLINE" >&5 +$as_echo_n "checking for append_history in -l$LIBREADLINE... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lreadline $READLINE_LIBS $LIBS" +LIBS="-l$LIBREADLINE $READLINE_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15932,22 +15950,24 @@ return append_history (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_readline_append_history=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_readline_append_history=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_append_history" >&5 -$as_echo "$ac_cv_lib_readline_append_history" >&6; } -if test "x$ac_cv_lib_readline_append_history" = xyes; then : +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define HAVE_RL_APPEND_HISTORY 1" >>confdefs.h fi +fi # End of readline checks: restore LIBS LIBS=$LIBS_no_readline diff --git a/configure.ac b/configure.ac index 1f5a008388a1e3..60c5d8e0b5b034 100644 --- a/configure.ac +++ b/configure.ac @@ -4891,92 +4891,124 @@ then [Define this if you have flockfile(), getc_unlocked(), and funlockfile()]) fi +AC_ARG_WITH([readline], + [AS_HELP_STRING([--with(out)-readline@<:@=editline@:>@], + [use Editline for backend or disable readline module])], + [], + [with_readline=yes]) + # check where readline lives +py_cv_lib_readline=no # save the value of LIBS so we don't actually link Python with readline LIBS_no_readline=$LIBS -# On some systems we need to link readline to a termcap compatible -# library. NOTE: Keep the precedence of listed libraries synchronised -# with setup.py. -py_cv_lib_readline=no -AC_MSG_CHECKING([how to link readline libs]) -for py_libtermcap in "" tinfo ncursesw ncurses curses termcap; do - if test -z "$py_libtermcap"; then - READLINE_LIBS="-lreadline" +if test "$with_readline" != no; then + case "$with_readline" in + editline|edit) + LIBREADLINE=edit + AC_DEFINE(WITH_EDITLINE, 1, + [Define to build the readline module against Editline.]) + ;; + yes|readline) + LIBREADLINE=readline + ;; + *) + AC_MSG_ERROR([proper usage is --with(out)-readline@<:@=editline@:>@]) + ;; + esac + + # On some systems we need to link readline to a termcap compatible + # library. NOTE: Keep the precedence of listed libraries synchronised + # with setup.py. + AC_MSG_CHECKING([how to link readline libs]) + for py_libtermcap in "" tinfo ncursesw ncurses curses termcap; do + if test -z "$py_libtermcap"; then + READLINE_LIBS="-l$LIBREADLINE" + else + READLINE_LIBS="-l$LIBREADLINE -l$py_libtermcap" + fi + LIBS="$READLINE_LIBS $LIBS_no_readline" + AC_LINK_IFELSE( + [AC_LANG_CALL([],[readline])], + [py_cv_lib_readline=yes]) + if test $py_cv_lib_readline = yes; then + break + fi + done + + # Uncomment this line if you want to use READLINE_LIBS in Makefile or scripts + #AC_SUBST([READLINE_LIBS]) + if test $py_cv_lib_readline = no; then + AC_MSG_RESULT([none]) else - READLINE_LIBS="-lreadline -l$py_libtermcap" + AC_MSG_RESULT([$READLINE_LIBS]) + AC_DEFINE(HAVE_LIBREADLINE, 1, + [Define to build the readline module.]) fi - LIBS="$READLINE_LIBS $LIBS_no_readline" - AC_LINK_IFELSE( - [AC_LANG_CALL([],[readline])], - [py_cv_lib_readline=yes]) - if test $py_cv_lib_readline = yes; then - break - fi -done -# Uncomment this line if you want to use READINE_LIBS in Makefile or scripts -#AC_SUBST([READLINE_LIBS]) -if test $py_cv_lib_readline = no; then - AC_MSG_RESULT([none]) -else - AC_MSG_RESULT([$READLINE_LIBS]) - AC_DEFINE(HAVE_LIBREADLINE, 1, - [Define if you have the readline library (-lreadline).]) fi -# check for readline 2.2 -AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include ]])], - [have_readline=yes], - [have_readline=no] -) -if test $have_readline = yes -then - AC_EGREP_HEADER([extern int rl_completion_append_character;], - [readline/readline.h], - AC_DEFINE(HAVE_RL_COMPLETION_APPEND_CHARACTER, 1, - [Define if you have readline 2.2]), ) - AC_EGREP_HEADER([extern int rl_completion_suppress_append;], - [readline/readline.h], - AC_DEFINE(HAVE_RL_COMPLETION_SUPPRESS_APPEND, 1, - [Define if you have rl_completion_suppress_append]), ) -fi - -# check for readline 4.0 -AC_CHECK_LIB(readline, rl_pre_input_hook, - AC_DEFINE(HAVE_RL_PRE_INPUT_HOOK, 1, - [Define if you have readline 4.0]), ,$READLINE_LIBS) - -# also in 4.0 -AC_CHECK_LIB(readline, rl_completion_display_matches_hook, - AC_DEFINE(HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK, 1, - [Define if you have readline 4.0]), ,$READLINE_LIBS) - -# also in 4.0, but not in editline -AC_CHECK_LIB(readline, rl_resize_terminal, - AC_DEFINE(HAVE_RL_RESIZE_TERMINAL, 1, - [Define if you have readline 4.0]), ,$READLINE_LIBS) - -# check for readline 4.2 -AC_CHECK_LIB(readline, rl_completion_matches, - AC_DEFINE(HAVE_RL_COMPLETION_MATCHES, 1, - [Define if you have readline 4.2]), ,$READLINE_LIBS) - -# also in readline 4.2 -AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include ]])], - [have_readline=yes], - [have_readline=no] -) -if test $have_readline = yes -then - AC_EGREP_HEADER([extern int rl_catch_signals;], - [readline/readline.h], - AC_DEFINE(HAVE_RL_CATCH_SIGNAL, 1, - [Define if you can turn off readline's signal handling.]), ) -fi +if test "$py_cv_lib_readline" = yes; then + # check for readline 2.2 + AC_CHECK_DECL(rl_completion_append_character, + AC_DEFINE(HAVE_RL_COMPLETION_APPEND_CHARACTER, 1, + [Define if you have readline 2.2]),, + [ +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif + ]) + AC_CHECK_DECL(rl_completion_suppress_append, + AC_DEFINE(HAVE_RL_COMPLETION_SUPPRESS_APPEND, 1, + [Define if you have rl_completion_suppress_append]),, + [ +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif + ]) -AC_CHECK_LIB(readline, append_history, - AC_DEFINE(HAVE_RL_APPEND_HISTORY, 1, - [Define if readline supports append_history]), ,$READLINE_LIBS) + # check for readline 4.0 + AC_CHECK_LIB($LIBREADLINE, rl_pre_input_hook, + AC_DEFINE(HAVE_RL_PRE_INPUT_HOOK, 1, + [Define if you have readline 4.0]),,$READLINE_LIBS) + + # also in 4.0 + AC_CHECK_LIB($LIBREADLINE, rl_completion_display_matches_hook, + AC_DEFINE(HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK, 1, + [Define if you have readline 4.0]),,$READLINE_LIBS) + + # also in 4.0, but not in editline + AC_CHECK_LIB($LIBREADLINE, rl_resize_terminal, + AC_DEFINE(HAVE_RL_RESIZE_TERMINAL, 1, + [Define if you have readline 4.0]),,$READLINE_LIBS) + + # check for readline 4.2 + AC_CHECK_LIB($LIBREADLINE, rl_completion_matches, + AC_DEFINE(HAVE_RL_COMPLETION_MATCHES, 1, + [Define if you have readline 4.2]),,$READLINE_LIBS) + + # also in readline 4.2 + AC_CHECK_DECL(rl_catch_signals, + AC_DEFINE(HAVE_RL_CATCH_SIGNAL, 1, + [Define if you can turn off readline's signal handling.]),, + [ +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif + ]) + + AC_CHECK_LIB($LIBREADLINE, append_history, + AC_DEFINE(HAVE_RL_APPEND_HISTORY, 1, + [Define if readline supports append_history]),,$READLINE_LIBS) +fi # End of readline checks: restore LIBS LIBS=$LIBS_no_readline diff --git a/pyconfig.h.in b/pyconfig.h.in index 045cbd53aee595..b65004ee2e88a9 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -610,7 +610,7 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H -/* Define if you have the readline library (-lreadline). */ +/* Define to build the readline module. */ #undef HAVE_LIBREADLINE /* Define to 1 if you have the `resolv' library (-lresolv). */ @@ -1554,6 +1554,9 @@ Dyld is necessary to support frameworks. */ #undef WITH_DYLD +/* Define to build the readline module against Editline. */ +#undef WITH_EDITLINE + /* Define to 1 if libintl is needed for locale functions. */ #undef WITH_LIBINTL diff --git a/setup.py b/setup.py index c6a4e9bf415068..0c4947fd762eed 100644 --- a/setup.py +++ b/setup.py @@ -1022,7 +1022,6 @@ def detect_test_extensions(self): def detect_readline_curses(self): # readline - do_readline = self.compiler.find_library_file(self.lib_dirs, 'readline') readline_termcap_library = "" curses_library = "" # Cannot use os.popen here in py3k. @@ -1030,7 +1029,13 @@ def detect_readline_curses(self): if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) # Determine if readline is already linked against curses or tinfo. - if do_readline: + if sysconfig.get_config_var('HAVE_LIBREADLINE'): + if sysconfig.get_config_var('WITH_EDITLINE'): + readline_lib = 'edit' + else: + readline_lib = 'readline' + do_readline = self.compiler.find_library_file(self.lib_dirs, + readline_lib) if CROSS_COMPILING: ret = run_command("%s -d %s | grep '(NEEDED)' > %s" % (sysconfig.get_config_var('READELF'), @@ -1053,6 +1058,8 @@ def detect_readline_curses(self): break if os.path.exists(tmpfile): os.unlink(tmpfile) + else: + do_readline = False # Issue 7384: If readline is already linked against curses, # use the same library for the readline and curses modules. if 'curses' in readline_termcap_library: @@ -1092,7 +1099,7 @@ def detect_readline_curses(self): else: readline_extra_link_args = () - readline_libs = ['readline'] + readline_libs = [readline_lib] if readline_termcap_library: pass # Issue 7384: Already linked against curses or tinfo. elif curses_library: From d31a56b204836db8d92a2f4b9dba01ac7dfbd66a Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Mon, 8 Feb 2021 17:32:38 -0800 Subject: [PATCH 1135/1261] bpo-43162: [Enum] deprecate enum member.member access (GH-24486) In 3.5 (?) a speed optimization made it possible to access members as attributes of other members, i.e. ``Color.RED.BLUE``. This was always discouraged in the docs, and other recent optimizations has made that one no longer necessary. Because some may be relying on it anyway, it is being deprecated in 3.10, and will be removed in 3.11. --- Lib/enum.py | 18 +++++++++++---- Lib/test/test_enum.py | 23 +++++++++++++++++++ .../2021-02-08-16-27-00.bpo-43162.t-W7h3.rst | 2 ++ 3 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-02-08-16-27-00.bpo-43162.t-W7h3.rst diff --git a/Lib/enum.py b/Lib/enum.py index d4b11521ab27f3..55299c57882446 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -139,12 +139,22 @@ def __get__(self, instance, ownerclass=None): return ownerclass._member_map_[self.name] except KeyError: raise AttributeError( - '%s: no attribute %r' % (ownerclass.__name__, self.name) + '%s: no class attribute %r' % (ownerclass.__name__, self.name) ) else: if self.fget is None: + # check for member + if self.name in ownerclass._member_map_: + import warnings + warnings.warn( + "accessing one member from another is not supported, " + " and will be disabled in 3.11", + DeprecationWarning, + stacklevel=2, + ) + return ownerclass._member_map_[self.name] raise AttributeError( - '%s: no attribute %r' % (ownerclass.__name__, self.name) + '%s: no instance attribute %r' % (ownerclass.__name__, self.name) ) else: return self.fget(instance) @@ -152,7 +162,7 @@ def __get__(self, instance, ownerclass=None): def __set__(self, instance, value): if self.fset is None: raise AttributeError( - "%s: cannot set attribute %r" % (self.clsname, self.name) + "%s: cannot set instance attribute %r" % (self.clsname, self.name) ) else: return self.fset(instance, value) @@ -160,7 +170,7 @@ def __set__(self, instance, value): def __delete__(self, instance): if self.fdel is None: raise AttributeError( - "%s: cannot delete attribute %r" % (self.clsname, self.name) + "%s: cannot delete instance attribute %r" % (self.clsname, self.name) ) else: return self.fdel(instance) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 96de878faf72d4..3982d1d6430430 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2185,6 +2185,29 @@ class Private(Enum): self.assertEqual(Private._Private__corporal, 'Radar') self.assertEqual(Private._Private__major_, 'Hoolihan') + @unittest.skipUnless( + sys.version_info[:2] == (3, 10), + 'member-member access now raises an exception', + ) + def test_warning_for_member_from_member_access(self): + with self.assertWarns(DeprecationWarning): + class Di(Enum): + YES = 1 + NO = 0 + nope = Di.YES.NO + self.assertIs(Di.NO, nope) + + @unittest.skipUnless( + sys.version_info[:2] > (3, 10), + 'member-member access currently issues a warning', + ) + def test_exception_for_member_from_member_access(self): + with self.assertRaisesRegex(AttributeError, "Di: no instance attribute .NO."): + class Di(Enum): + YES = 1 + NO = 0 + nope = Di.YES.NO + def test_strenum_auto(self): class Strings(StrEnum): ONE = auto() diff --git a/Misc/NEWS.d/next/Library/2021-02-08-16-27-00.bpo-43162.t-W7h3.rst b/Misc/NEWS.d/next/Library/2021-02-08-16-27-00.bpo-43162.t-W7h3.rst new file mode 100644 index 00000000000000..fef5915e762ee0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-08-16-27-00.bpo-43162.t-W7h3.rst @@ -0,0 +1,2 @@ +deprecate unsupported ability to access enum members as attributes of other +enum members From 3d535fc9f387445eefa348d1760b8e12a6c4aca7 Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Tue, 9 Feb 2021 09:57:11 +0800 Subject: [PATCH 1136/1261] Improve docs of PEP 604 Union (#24301) --- Doc/library/functions.rst | 12 ++++++++++-- Doc/library/stdtypes.rst | 19 +++---------------- Doc/whatsnew/3.10.rst | 8 +++++++- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index e36a1695c2ad58..370decc51087f2 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -870,19 +870,27 @@ are always available. They are listed here in alphabetical order. class>`) subclass thereof. If *object* is not an object of the given type, the function always returns ``False``. If *classinfo* is a tuple of type objects (or recursively, other such - tuples), return ``True`` if *object* is an instance of any of the types. + tuples) or a :ref:`types-union` of multiple types, return ``True`` if + *object* is an instance of any of the types. If *classinfo* is not a type or tuple of types and such tuples, a :exc:`TypeError` exception is raised. + .. versionchanged:: 3.10 + *classinfo* can be a :ref:`types-union`. + .. function:: issubclass(class, classinfo) Return ``True`` if *class* is a subclass (direct, indirect or :term:`virtual `) of *classinfo*. A class is considered a subclass of itself. *classinfo* may be a tuple of class - objects, in which case every entry in *classinfo* will be checked. In any other + objects or a :ref:`types-union`, in which case every entry in *classinfo* + will be checked. In any other case, a :exc:`TypeError` exception is raised. + .. versionchanged:: 3.10 + *classinfo* can be a :ref:`types-union`. + .. function:: iter(object[, sentinel]) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 2331849c02e982..0929f3271e0519 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -5022,8 +5022,10 @@ enables cleaner type hinting syntax compared to :data:`typing.Union`. str | None == typing.Optional[str] .. describe:: isinstance(obj, union_object) +.. describe:: issubclass(obj, union_object) - Calls to :func:`isinstance` are also supported with a union object:: + Calls to :func:`isinstance` and :func:`issubclass` are also supported with a + union object:: >>> isinstance("", int | str) True @@ -5036,21 +5038,6 @@ enables cleaner type hinting syntax compared to :data:`typing.Union`. File "", line 1, in TypeError: isinstance() argument 2 cannot contain a parameterized generic -.. describe:: issubclass(obj, union_object) - - Calls to :func:`issubclass` are also supported with a union object:: - - >>> issubclass(bool, int | str) - True - - However, union objects containing :ref:`parameterized generics - ` cannot be used:: - - >>> issubclass(bool, bool | list[str]) - Traceback (most recent call last): - File "", line 1, in - TypeError: issubclass() argument 2 cannot contain a parameterized generic - The user-exposed type for the union object can be accessed from :data:`types.Union` and used for :func:`isinstance` checks. An object cannot be instantiated from the type:: diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index fa8b6aa54fe902..96892ba3d37e10 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -193,7 +193,13 @@ Type hints can now be written in a more succinct manner:: return number ** 2 -See :pep:`604` for more details. +This new syntax is also accepted as the second argument to :func:`isinstance` +and :func:`issubclass`:: + + >>> isinstance(1, int | str) + True + +See :ref:`types-union` and :pep:`604` for more details. (Contributed by Maggie Moss and Philippe Prados in :issue:`41428`.) From 6f8e162866a0b85651eb63c60b8d767b2eaf85ad Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Tue, 9 Feb 2021 09:58:50 +0800 Subject: [PATCH 1137/1261] bpo-41824: Add versionadded for typing.ForwardRef docs (#24224) --- Doc/library/typing.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 3b4dba3e0e0a9d..7ef5b3971a91e8 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1950,6 +1950,8 @@ Introspection helpers ``list[ForwardRef("SomeClass")]``. This class should not be instantiated by a user, but may be used by introspection tools. + .. versionadded:: 3.7.4 + Constant -------- From 08ed5f5d0d072b0fa23fff96764a288fe7f00bad Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 9 Feb 2021 18:13:36 +0000 Subject: [PATCH 1138/1261] bpo-43166: Disable ceval.c optimisations for Windows debug builds (GH-24485) This ensures that ceval.c can be debugged. Also remove some irrelevant options from the pragma. --- Include/pyport.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/pyport.h b/Include/pyport.h index 6687849d844724..46bbef22d73968 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -180,9 +180,9 @@ typedef int Py_ssize_clean_t; */ #if defined(_MSC_VER) -# if defined(PY_LOCAL_AGGRESSIVE) - /* enable more aggressive optimization for visual studio */ -# pragma optimize("agtw", on) +# if defined(PY_LOCAL_AGGRESSIVE) && !defined(Py_DEBUG) + /* enable more aggressive optimization for MSVC */ +# pragma optimize("gt", on) #endif /* ignore warnings if the compiler decides not to inline a function */ # pragma warning(disable: 4710) From 6f17567e3f85a81682b1b47140515442b0e4b352 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 9 Feb 2021 20:07:38 +0000 Subject: [PATCH 1139/1261] bpo-43163: Handle unclosed parentheses in codeop (GH-24483) --- Lib/codeop.py | 11 ++++++++++- Lib/test/test_codeop.py | 4 ++++ .../Library/2021-02-08-21-13-51.bpo-43163.E2MgzH.rst | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2021-02-08-21-13-51.bpo-43163.E2MgzH.rst diff --git a/Lib/codeop.py b/Lib/codeop.py index 4c10470aee7b7c..7a08610239c357 100644 --- a/Lib/codeop.py +++ b/Lib/codeop.py @@ -102,11 +102,20 @@ def _maybe_compile(compiler, source, filename, symbol): try: if code: return code - if not code1 and repr(err1) == repr(err2): + if not code1 and _is_syntax_error(err1, err2): raise err1 finally: err1 = err2 = None +def _is_syntax_error(err1, err2): + rep1 = repr(err1) + rep2 = repr(err2) + if "was never closed" in rep1 and "was never closed" in rep2: + return False + if rep1 == rep2: + return True + return False + def _compile(source, filename, symbol): return compile(source, filename, symbol, PyCF_DONT_IMPLY_DEDENT) diff --git a/Lib/test/test_codeop.py b/Lib/test/test_codeop.py index 1da6ca55c48f72..ecc46affea2629 100644 --- a/Lib/test/test_codeop.py +++ b/Lib/test/test_codeop.py @@ -135,6 +135,10 @@ def test_incomplete(self): ai("a = {") ai("b + {") + ai("print([1,\n2,") + ai("print({1:1,\n2:3,") + ai("print((1,\n2,") + ai("if 9==3:\n pass\nelse:") ai("if 9==3:\n pass\nelse:\n") ai("if 9==3:\n pass\nelse:\n pass") diff --git a/Misc/NEWS.d/next/Library/2021-02-08-21-13-51.bpo-43163.E2MgzH.rst b/Misc/NEWS.d/next/Library/2021-02-08-21-13-51.bpo-43163.E2MgzH.rst new file mode 100644 index 00000000000000..ddd60ea3855960 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-08-21-13-51.bpo-43163.E2MgzH.rst @@ -0,0 +1,2 @@ +Fix a bug in :mod:`codeop` that was causing it to not ask for more input +when multi-line snippets have unclosed parentheses. Patch by Pablo Galindo From 532e7529466440603c65a3f95f0d2fdc13381141 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Wed, 10 Feb 2021 09:20:42 +0900 Subject: [PATCH 1140/1261] bpo-42217: compiler: merge same co_code and co_linetable objects (GH-23056) --- Lib/test/test_compile.py | 11 + .../2020-10-31-16-54-00.bpo-42217.GdcHe5.rst | 1 + Python/compile.c | 44 +- Python/importlib.h | 3144 ++++++------ Python/importlib_external.h | 4494 ++++++++--------- 5 files changed, 3847 insertions(+), 3847 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-31-16-54-00.bpo-42217.GdcHe5.rst diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 3e826b9accfb1b..1f125242e156f6 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -632,6 +632,17 @@ def check_same_constant(const): self.check_constant(f1, frozenset({0})) self.assertTrue(f1(0)) + # Merging equal co_linetable and co_code is not a strict requirement + # for the Python semantics, it's a more an implementation detail. + @support.cpython_only + def test_merge_code_attrs(self): + # See https://bugs.python.org/issue42217 + f1 = lambda x: x.y.z + f2 = lambda a: a.b.c + + self.assertIs(f1.__code__.co_linetable, f2.__code__.co_linetable) + self.assertIs(f1.__code__.co_code, f2.__code__.co_code) + # This is a regression test for a CPython specific peephole optimizer # implementation bug present in a few releases. It's assertion verifies # that peephole optimization was actually done though that isn't an diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-31-16-54-00.bpo-42217.GdcHe5.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-31-16-54-00.bpo-42217.GdcHe5.rst new file mode 100644 index 00000000000000..c50b69d18885a5 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-31-16-54-00.bpo-42217.GdcHe5.rst @@ -0,0 +1 @@ +Make the compiler merges same co_code and co_linetable objects in a module like already did for co_consts. diff --git a/Python/compile.c b/Python/compile.c index a0a257fa6bafce..386c552cd8d01b 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -5806,14 +5806,12 @@ compute_code_flags(struct compiler *c) return flags; } -// Merge *tuple* with constant cache. +// Merge *obj* with constant cache. // Unlike merge_consts_recursive(), this function doesn't work recursively. static int -merge_const_tuple(struct compiler *c, PyObject **tuple) +merge_const_one(struct compiler *c, PyObject **obj) { - assert(PyTuple_CheckExact(*tuple)); - - PyObject *key = _PyCode_ConstantKey(*tuple); + PyObject *key = _PyCode_ConstantKey(*obj); if (key == NULL) { return 0; } @@ -5824,14 +5822,18 @@ merge_const_tuple(struct compiler *c, PyObject **tuple) if (t == NULL) { return 0; } - if (t == key) { // tuple is new constant. + if (t == key) { // obj is new constant. return 1; } - PyObject *u = PyTuple_GET_ITEM(t, 1); - Py_INCREF(u); - Py_DECREF(*tuple); - *tuple = u; + if (PyTuple_CheckExact(t)) { + // t is still borrowed reference + t = PyTuple_GET_ITEM(t, 1); + } + + Py_INCREF(t); + Py_DECREF(*obj); + *obj = t; return 1; } @@ -5861,10 +5863,10 @@ makecode(struct compiler *c, struct assembler *a, PyObject *consts) if (!freevars) goto error; - if (!merge_const_tuple(c, &names) || - !merge_const_tuple(c, &varnames) || - !merge_const_tuple(c, &cellvars) || - !merge_const_tuple(c, &freevars)) + if (!merge_const_one(c, &names) || + !merge_const_one(c, &varnames) || + !merge_const_one(c, &cellvars) || + !merge_const_one(c, &freevars)) { goto error; } @@ -5881,7 +5883,7 @@ makecode(struct compiler *c, struct assembler *a, PyObject *consts) if (consts == NULL) { goto error; } - if (!merge_const_tuple(c, &consts)) { + if (!merge_const_one(c, &consts)) { Py_DECREF(consts); goto error; } @@ -6028,10 +6030,18 @@ assemble(struct compiler *c, int addNone) goto error; } - if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) + if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) { goto error; - if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0) + } + if (!merge_const_one(c, &a.a_lnotab)) { goto error; + } + if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0) { + goto error; + } + if (!merge_const_one(c, &a.a_bytecode)) { + goto error; + } co = makecode(c, &a, consts); error: diff --git a/Python/importlib.h b/Python/importlib.h index 6a0fc6e5af61a9..880343bcda308b 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -211,18 +211,18 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 1,10,1,36,128,255,128,122,19,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,0,0,0,0,1,0,0,0,5,0,0, - 0,67,0,0,0,115,18,0,0,0,100,1,160,0,124,0, + 0,67,0,0,0,243,18,0,0,0,100,1,160,0,124,0, 106,1,116,2,124,0,131,1,161,2,83,0,41,2,78,122, 23,95,77,111,100,117,108,101,76,111,99,107,40,123,33,114, 125,41,32,97,116,32,123,125,169,3,218,6,102,111,114,109, 97,116,114,20,0,0,0,218,2,105,100,169,1,114,33,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,8,95,95,114,101,112,114,95,95,138,0,0,0,115, + 0,218,8,95,95,114,101,112,114,95,95,138,0,0,0,243, 4,0,0,0,18,1,255,128,122,20,95,77,111,100,117,108, 101,76,111,99,107,46,95,95,114,101,112,114,95,95,78,41, 9,114,9,0,0,0,114,8,0,0,0,114,1,0,0,0, 114,10,0,0,0,114,34,0,0,0,114,41,0,0,0,114, - 43,0,0,0,114,44,0,0,0,114,52,0,0,0,114,5, + 43,0,0,0,114,44,0,0,0,114,53,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, 0,0,114,23,0,0,0,65,0,0,0,115,16,0,0,0, 8,0,4,1,8,5,8,8,8,21,8,25,12,13,255,128, @@ -243,14 +243,14 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,95,0,100,1,124,0,95,1,100,0,83,0,114,24,0, 0,0,41,2,114,20,0,0,0,114,30,0,0,0,114,32, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,34,0,0,0,146,0,0,0,115,6,0,0,0, + 0,0,114,34,0,0,0,146,0,0,0,243,6,0,0,0, 6,1,10,1,255,128,122,25,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,0,0,0,0,1,0, 0,0,3,0,0,0,67,0,0,0,115,18,0,0,0,124, 0,4,0,106,0,100,1,55,0,2,0,95,0,100,2,83, 0,41,3,78,114,42,0,0,0,84,41,1,114,30,0,0, - 0,114,51,0,0,0,114,5,0,0,0,114,5,0,0,0, + 0,114,52,0,0,0,114,5,0,0,0,114,5,0,0,0, 114,6,0,0,0,114,43,0,0,0,150,0,0,0,115,6, 0,0,0,14,1,4,1,255,128,122,24,95,68,117,109,109, 121,77,111,100,117,108,101,76,111,99,107,46,97,99,113,117, @@ -260,1601 +260,1593 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 1,130,1,124,0,4,0,106,0,100,3,56,0,2,0,95, 0,100,0,83,0,41,4,78,114,25,0,0,0,114,46,0, 0,0,114,42,0,0,0,41,2,114,30,0,0,0,114,47, - 0,0,0,114,51,0,0,0,114,5,0,0,0,114,5,0, + 0,0,0,114,52,0,0,0,114,5,0,0,0,114,5,0, 0,0,114,6,0,0,0,114,44,0,0,0,154,0,0,0, 115,8,0,0,0,10,1,8,1,18,1,255,128,122,24,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, 0,0,0,0,1,0,0,0,5,0,0,0,67,0,0,0, - 115,18,0,0,0,100,1,160,0,124,0,106,1,116,2,124, - 0,131,1,161,2,83,0,41,2,78,122,28,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,114,48,0,0,0,114,51,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,52,0,0,0,159,0,0,0,115,4,0,0,0,18, - 1,255,128,122,25,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,41, - 8,114,9,0,0,0,114,8,0,0,0,114,1,0,0,0, - 114,10,0,0,0,114,34,0,0,0,114,43,0,0,0,114, - 44,0,0,0,114,52,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,53,0, - 0,0,142,0,0,0,115,14,0,0,0,8,0,4,1,8, - 3,8,4,8,4,12,5,255,128,114,53,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,64,0,0,0,115,36,0,0,0,101,0,90,1, - 100,0,90,2,100,1,100,2,132,0,90,3,100,3,100,4, - 132,0,90,4,100,5,100,6,132,0,90,5,100,7,83,0, - 41,8,218,18,95,77,111,100,117,108,101,76,111,99,107,77, - 97,110,97,103,101,114,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, - 16,0,0,0,124,1,124,0,95,0,100,0,124,0,95,1, - 100,0,83,0,114,0,0,0,0,41,2,218,5,95,110,97, - 109,101,218,5,95,108,111,99,107,114,32,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,34,0, - 0,0,165,0,0,0,115,6,0,0,0,6,1,10,1,255, - 128,122,27,95,77,111,100,117,108,101,76,111,99,107,77,97, - 110,97,103,101,114,46,95,95,105,110,105,116,95,95,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, - 0,0,0,67,0,0,0,115,26,0,0,0,116,0,124,0, - 106,1,131,1,124,0,95,2,124,0,106,2,160,3,161,0, - 1,0,100,0,83,0,114,0,0,0,0,41,4,218,16,95, - 103,101,116,95,109,111,100,117,108,101,95,108,111,99,107,114, - 55,0,0,0,114,56,0,0,0,114,43,0,0,0,114,51, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,9,95,95,101,110,116,101,114,95,95,169,0,0, - 0,115,6,0,0,0,12,1,14,1,255,128,122,28,95,77, + 114,48,0,0,0,41,2,78,122,28,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,114,49,0,0,0,114,52,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 53,0,0,0,159,0,0,0,114,54,0,0,0,122,25,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,41,8,114,9,0,0,0, + 114,8,0,0,0,114,1,0,0,0,114,10,0,0,0,114, + 34,0,0,0,114,43,0,0,0,114,44,0,0,0,114,53, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,55,0,0,0,142,0,0,0, + 115,14,0,0,0,8,0,4,1,8,3,8,4,8,4,12, + 5,255,128,114,55,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, + 0,115,36,0,0,0,101,0,90,1,100,0,90,2,100,1, + 100,2,132,0,90,3,100,3,100,4,132,0,90,4,100,5, + 100,6,132,0,90,5,100,7,83,0,41,8,218,18,95,77, 111,100,117,108,101,76,111,99,107,77,97,110,97,103,101,114, - 46,95,95,101,110,116,101,114,95,95,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,79, - 0,0,0,115,14,0,0,0,124,0,106,0,160,1,161,0, - 1,0,100,0,83,0,114,0,0,0,0,41,2,114,56,0, - 0,0,114,44,0,0,0,41,3,114,33,0,0,0,218,4, - 97,114,103,115,90,6,107,119,97,114,103,115,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,8,95,95,101, - 120,105,116,95,95,173,0,0,0,115,4,0,0,0,14,1, - 255,128,122,27,95,77,111,100,117,108,101,76,111,99,107,77, - 97,110,97,103,101,114,46,95,95,101,120,105,116,95,95,78, - 41,6,114,9,0,0,0,114,8,0,0,0,114,1,0,0, - 0,114,34,0,0,0,114,58,0,0,0,114,60,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,54,0,0,0,163,0,0,0,115,10,0, - 0,0,8,0,8,2,8,4,12,4,255,128,114,54,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,8,0,0,0,67,0,0,0,115,132,0,0,0,116, - 0,160,1,161,0,1,0,122,110,122,14,116,2,124,0,25, - 0,131,0,125,1,87,0,110,18,4,0,116,3,121,130,1, - 0,1,0,1,0,100,1,125,1,89,0,124,1,100,1,117, - 0,114,106,116,4,100,1,117,0,114,70,116,5,124,0,131, - 1,125,1,110,8,116,6,124,0,131,1,125,1,124,0,102, - 1,100,2,100,3,132,1,125,2,116,7,160,8,124,1,124, - 2,161,2,116,2,124,0,60,0,87,0,116,0,160,9,161, - 0,1,0,124,1,83,0,116,0,160,9,161,0,1,0,119, - 0,119,0,41,4,122,139,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,65,99,113,117,105,114,101,47,114,101,108,101,97, - 115,101,32,105,110,116,101,114,110,97,108,108,121,32,116,104, - 101,32,103,108,111,98,97,108,32,105,109,112,111,114,116,32, - 108,111,99,107,32,116,111,32,112,114,111,116,101,99,116,10, - 32,32,32,32,95,109,111,100,117,108,101,95,108,111,99,107, - 115,46,78,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,8,0,0,0,83,0,0,0,115,54,0,0, - 0,116,0,160,1,161,0,1,0,122,34,116,2,160,3,124, - 1,161,1,124,0,117,0,114,30,116,2,124,1,61,0,87, - 0,116,0,160,4,161,0,1,0,100,0,83,0,116,0,160, - 4,161,0,1,0,119,0,114,0,0,0,0,41,5,218,4, - 95,105,109,112,218,12,97,99,113,117,105,114,101,95,108,111, - 99,107,218,13,95,109,111,100,117,108,101,95,108,111,99,107, - 115,114,38,0,0,0,218,12,114,101,108,101,97,115,101,95, - 108,111,99,107,41,2,218,3,114,101,102,114,20,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,2,0,0,0,67,0,0,0,115,16,0,0,0,124,1, + 124,0,95,0,100,0,124,0,95,1,100,0,83,0,114,0, + 0,0,0,41,2,218,5,95,110,97,109,101,218,5,95,108, + 111,99,107,114,32,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,34,0,0,0,165,0,0,0, + 114,56,0,0,0,122,27,95,77,111,100,117,108,101,76,111, + 99,107,77,97,110,97,103,101,114,46,95,95,105,110,105,116, + 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,2,0,0,0,67,0,0,0,115,26,0,0,0, + 116,0,124,0,106,1,131,1,124,0,95,2,124,0,106,2, + 160,3,161,0,1,0,100,0,83,0,114,0,0,0,0,41, + 4,218,16,95,103,101,116,95,109,111,100,117,108,101,95,108, + 111,99,107,114,58,0,0,0,114,59,0,0,0,114,43,0, + 0,0,114,52,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,9,95,95,101,110,116,101,114,95, + 95,169,0,0,0,115,6,0,0,0,12,1,14,1,255,128, + 122,28,95,77,111,100,117,108,101,76,111,99,107,77,97,110, + 97,103,101,114,46,95,95,101,110,116,101,114,95,95,99,1, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2, + 0,0,0,79,0,0,0,115,14,0,0,0,124,0,106,0, + 160,1,161,0,1,0,100,0,83,0,114,0,0,0,0,41, + 2,114,59,0,0,0,114,44,0,0,0,41,3,114,33,0, + 0,0,218,4,97,114,103,115,90,6,107,119,97,114,103,115, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 2,99,98,198,0,0,0,115,14,0,0,0,8,1,2,1, - 14,4,6,1,2,128,22,2,255,128,122,28,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,41,10,114,61,0,0,0,114, - 62,0,0,0,114,63,0,0,0,218,8,75,101,121,69,114, - 114,111,114,114,26,0,0,0,114,53,0,0,0,114,23,0, - 0,0,218,8,95,119,101,97,107,114,101,102,114,65,0,0, - 0,114,64,0,0,0,41,3,114,20,0,0,0,114,27,0, - 0,0,114,66,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,57,0,0,0,179,0,0,0,115, - 36,0,0,0,8,6,2,1,2,1,14,1,12,1,6,1, - 8,2,8,1,10,1,8,2,12,2,16,11,2,128,8,2, - 4,2,10,254,2,234,255,128,114,57,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0, - 0,0,67,0,0,0,115,54,0,0,0,116,0,124,0,131, - 1,125,1,122,12,124,1,160,1,161,0,1,0,87,0,110, - 18,4,0,116,2,121,52,1,0,1,0,1,0,89,0,100, - 1,83,0,124,1,160,3,161,0,1,0,100,1,83,0,119, - 0,41,2,122,189,65,99,113,117,105,114,101,115,32,116,104, - 101,110,32,114,101,108,101,97,115,101,115,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,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,32,32, - 32,32,78,41,4,114,57,0,0,0,114,43,0,0,0,114, - 22,0,0,0,114,44,0,0,0,41,2,114,20,0,0,0, - 114,27,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,19,95,108,111,99,107,95,117,110,108,111, - 99,107,95,109,111,100,117,108,101,216,0,0,0,115,16,0, - 0,0,8,6,2,1,12,1,12,1,6,3,12,2,2,251, - 255,128,114,69,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,4,0,0,0,79,0,0,0, - 115,14,0,0,0,124,0,124,1,105,0,124,2,164,1,142, - 1,83,0,41,2,97,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,78,114,5,0,0,0,41,3, - 218,1,102,114,59,0,0,0,90,4,107,119,100,115,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,25,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,233,0,0,0,115,4,0,0, - 0,14,8,255,128,114,71,0,0,0,114,42,0,0,0,41, - 1,218,9,118,101,114,98,111,115,105,116,121,99,1,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,4,0,0, - 0,71,0,0,0,115,58,0,0,0,116,0,106,1,106,2, - 124,1,107,5,114,54,124,0,160,3,100,1,161,1,115,30, - 100,2,124,0,23,0,125,0,116,4,124,0,106,5,124,2, - 142,0,116,0,106,6,100,3,141,2,1,0,100,4,83,0, - 100,4,83,0,41,5,122,61,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,41,2,250,1,35,122,7,105,109,112,111, - 114,116,32,122,2,35,32,41,1,90,4,102,105,108,101,78, - 41,7,114,18,0,0,0,218,5,102,108,97,103,115,218,7, - 118,101,114,98,111,115,101,218,10,115,116,97,114,116,115,119, - 105,116,104,218,5,112,114,105,110,116,114,49,0,0,0,218, - 6,115,116,100,101,114,114,41,3,218,7,109,101,115,115,97, - 103,101,114,72,0,0,0,114,59,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,16,95,118,101, - 114,98,111,115,101,95,109,101,115,115,97,103,101,244,0,0, - 0,115,12,0,0,0,12,2,10,1,8,1,24,1,4,253, - 255,128,114,80,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0, - 115,26,0,0,0,135,0,102,1,100,1,100,2,132,8,125, - 1,116,0,124,1,136,0,131,2,1,0,124,1,83,0,41, - 4,122,49,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,0,0,0, - 0,2,0,0,0,4,0,0,0,19,0,0,0,115,38,0, - 0,0,124,1,116,0,106,1,118,1,114,28,116,2,100,1, - 160,3,124,1,161,1,124,1,100,2,141,2,130,1,136,0, - 124,0,124,1,131,2,83,0,41,3,78,250,29,123,33,114, - 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,114,19,0,0,0,41, - 4,114,18,0,0,0,218,20,98,117,105,108,116,105,110,95, - 109,111,100,117,108,101,95,110,97,109,101,115,218,11,73,109, - 112,111,114,116,69,114,114,111,114,114,49,0,0,0,169,2, - 114,33,0,0,0,218,8,102,117,108,108,110,97,109,101,169, - 1,218,3,102,120,110,114,5,0,0,0,114,6,0,0,0, - 218,25,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,254,0,0,0,115, - 12,0,0,0,10,1,10,1,2,1,6,255,10,2,255,128, - 122,52,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,78,169,1,114,17,0,0,0,41,2, - 114,87,0,0,0,114,88,0,0,0,114,5,0,0,0,114, - 86,0,0,0,114,6,0,0,0,218,17,95,114,101,113,117, - 105,114,101,115,95,98,117,105,108,116,105,110,252,0,0,0, - 115,8,0,0,0,12,2,10,5,4,1,255,128,114,90,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,3,0,0,0,115,26,0,0,0, - 135,0,102,1,100,1,100,2,132,8,125,1,116,0,124,1, - 136,0,131,2,1,0,124,1,83,0,41,4,122,47,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,0,0,0,0,2,0,0,0,4,0, - 0,0,19,0,0,0,115,38,0,0,0,116,0,160,1,124, - 1,161,1,115,28,116,2,100,1,160,3,124,1,161,1,124, - 1,100,2,141,2,130,1,136,0,124,0,124,1,131,2,83, - 0,169,3,78,122,27,123,33,114,125,32,105,115,32,110,111, - 116,32,97,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,114,19,0,0,0,41,4,114,61,0,0,0,218,9,105, - 115,95,102,114,111,122,101,110,114,83,0,0,0,114,49,0, - 0,0,114,84,0,0,0,114,86,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,24,95,114,101,113,117,105,114,101, - 115,95,102,114,111,122,101,110,95,119,114,97,112,112,101,114, - 9,1,0,0,115,12,0,0,0,10,1,10,1,2,1,6, - 255,10,2,255,128,122,50,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,78,114,89,0,0,0,41, - 2,114,87,0,0,0,114,93,0,0,0,114,5,0,0,0, - 114,86,0,0,0,114,6,0,0,0,218,16,95,114,101,113, - 117,105,114,101,115,95,102,114,111,122,101,110,7,1,0,0, - 115,8,0,0,0,12,2,10,5,4,1,255,128,114,94,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,4,0,0,0,67,0,0,0,115,74,0,0,0, - 100,1,125,2,116,0,160,1,124,2,116,2,161,2,1,0, - 116,3,124,1,124,0,131,2,125,3,124,1,116,4,106,5, - 118,0,114,66,116,4,106,5,124,1,25,0,125,4,116,6, - 124,3,124,4,131,2,1,0,116,4,106,5,124,1,25,0, - 83,0,116,7,124,3,131,1,83,0,41,3,122,128,76,111, - 97,100,32,116,104,101,32,115,112,101,99,105,102,105,101,100, - 32,109,111,100,117,108,101,32,105,110,116,111,32,115,121,115, - 46,109,111,100,117,108,101,115,32,97,110,100,32,114,101,116, - 117,114,110,32,105,116,46,10,10,32,32,32,32,84,104,105, - 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,32,32,85,115,101,32,108,111,97, - 100,101,114,46,101,120,101,99,95,109,111,100,117,108,101,32, - 105,110,115,116,101,97,100,46,10,10,32,32,32,32,122,103, - 116,104,101,32,108,111,97,100,95,109,111,100,117,108,101,40, - 41,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,32,97,110,100,32,115,108,97,116,101, - 100,32,102,111,114,32,114,101,109,111,118,97,108,32,105,110, - 32,80,121,116,104,111,110,32,51,46,49,50,59,32,117,115, - 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, - 105,110,115,116,101,97,100,78,41,8,218,9,95,119,97,114, - 110,105,110,103,115,218,4,119,97,114,110,218,18,68,101,112, - 114,101,99,97,116,105,111,110,87,97,114,110,105,110,103,218, - 16,115,112,101,99,95,102,114,111,109,95,108,111,97,100,101, - 114,114,18,0,0,0,218,7,109,111,100,117,108,101,115,218, - 5,95,101,120,101,99,218,5,95,108,111,97,100,41,5,114, - 33,0,0,0,114,85,0,0,0,218,3,109,115,103,218,4, - 115,112,101,99,218,6,109,111,100,117,108,101,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,17,95,108,111, - 97,100,95,109,111,100,117,108,101,95,115,104,105,109,19,1, - 0,0,115,18,0,0,0,4,6,12,2,10,1,10,1,10, - 1,10,1,10,1,8,2,255,128,114,105,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,8, - 0,0,0,67,0,0,0,115,206,0,0,0,116,0,124,0, - 100,1,100,0,131,3,125,1,116,1,124,1,100,2,131,2, - 114,50,122,12,124,1,160,2,124,0,161,1,87,0,83,0, - 4,0,116,3,121,204,1,0,1,0,1,0,89,0,122,10, - 124,0,106,4,125,2,87,0,110,16,4,0,116,5,121,202, - 1,0,1,0,1,0,89,0,110,16,124,2,100,0,117,1, - 114,94,116,6,124,2,131,1,83,0,122,10,124,0,106,7, - 125,3,87,0,110,18,4,0,116,5,121,200,1,0,1,0, - 1,0,100,3,125,3,89,0,122,10,124,0,106,8,125,4, - 87,0,110,50,4,0,116,5,121,198,1,0,1,0,1,0, - 124,1,100,0,117,0,114,170,100,4,160,9,124,3,161,1, - 6,0,89,0,83,0,100,5,160,9,124,3,124,1,161,2, - 6,0,89,0,83,0,100,6,160,9,124,3,124,4,161,2, - 83,0,119,0,119,0,119,0,119,0,41,7,78,218,10,95, - 95,108,111,97,100,101,114,95,95,218,11,109,111,100,117,108, - 101,95,114,101,112,114,250,1,63,250,13,60,109,111,100,117, - 108,101,32,123,33,114,125,62,250,20,60,109,111,100,117,108, - 101,32,123,33,114,125,32,40,123,33,114,125,41,62,250,23, - 60,109,111,100,117,108,101,32,123,33,114,125,32,102,114,111, - 109,32,123,33,114,125,62,41,10,114,13,0,0,0,114,11, - 0,0,0,114,107,0,0,0,218,9,69,120,99,101,112,116, - 105,111,110,218,8,95,95,115,112,101,99,95,95,114,2,0, - 0,0,218,22,95,109,111,100,117,108,101,95,114,101,112,114, - 95,102,114,111,109,95,115,112,101,99,114,9,0,0,0,218, - 8,95,95,102,105,108,101,95,95,114,49,0,0,0,41,5, - 114,104,0,0,0,218,6,108,111,97,100,101,114,114,103,0, - 0,0,114,20,0,0,0,218,8,102,105,108,101,110,97,109, - 101,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,12,95,109,111,100,117,108,101,95,114,101,112,114,38,1, - 0,0,115,56,0,0,0,12,2,10,1,2,4,12,1,12, - 1,2,1,2,1,10,1,12,1,4,1,8,2,8,1,2, - 4,10,1,12,1,6,1,2,1,10,1,12,1,8,1,14, - 1,16,2,12,2,2,250,2,252,2,246,2,252,255,128,114, - 118,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,64,0,0,0,115,114,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 100,2,100,2,100,3,156,3,100,4,100,5,132,2,90,4, - 100,6,100,7,132,0,90,5,100,8,100,9,132,0,90,6, - 101,7,100,10,100,11,132,0,131,1,90,8,101,8,106,9, - 100,12,100,11,132,0,131,1,90,8,101,7,100,13,100,14, - 132,0,131,1,90,10,101,7,100,15,100,16,132,0,131,1, - 90,11,101,11,106,9,100,17,100,16,132,0,131,1,90,11, - 100,2,83,0,41,18,218,10,77,111,100,117,108,101,83,112, - 101,99,97,208,5,0,0,84,104,101,32,115,112,101,99,105, - 102,105,99,97,116,105,111,110,32,102,111,114,32,97,32,109, - 111,100,117,108,101,44,32,117,115,101,100,32,102,111,114,32, - 108,111,97,100,105,110,103,46,10,10,32,32,32,32,65,32, - 109,111,100,117,108,101,39,115,32,115,112,101,99,32,105,115, - 32,116,104,101,32,115,111,117,114,99,101,32,102,111,114,32, - 105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117, - 116,32,116,104,101,32,109,111,100,117,108,101,46,32,32,70, - 111,114,10,32,32,32,32,100,97,116,97,32,97,115,115,111, - 99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32, - 109,111,100,117,108,101,44,32,105,110,99,108,117,100,105,110, - 103,32,115,111,117,114,99,101,44,32,117,115,101,32,116,104, - 101,32,115,112,101,99,39,115,10,32,32,32,32,108,111,97, - 100,101,114,46,10,10,32,32,32,32,96,110,97,109,101,96, - 32,105,115,32,116,104,101,32,97,98,115,111,108,117,116,101, - 32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,100, - 117,108,101,46,32,32,96,108,111,97,100,101,114,96,32,105, - 115,32,116,104,101,32,108,111,97,100,101,114,10,32,32,32, - 32,116,111,32,117,115,101,32,119,104,101,110,32,108,111,97, - 100,105,110,103,32,116,104,101,32,109,111,100,117,108,101,46, - 32,32,96,112,97,114,101,110,116,96,32,105,115,32,116,104, - 101,32,110,97,109,101,32,111,102,32,116,104,101,10,32,32, - 32,32,112,97,99,107,97,103,101,32,116,104,101,32,109,111, - 100,117,108,101,32,105,115,32,105,110,46,32,32,84,104,101, - 32,112,97,114,101,110,116,32,105,115,32,100,101,114,105,118, - 101,100,32,102,114,111,109,32,116,104,101,32,110,97,109,101, - 46,10,10,32,32,32,32,96,105,115,95,112,97,99,107,97, - 103,101,96,32,100,101,116,101,114,109,105,110,101,115,32,105, - 102,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32, - 99,111,110,115,105,100,101,114,101,100,32,97,32,112,97,99, - 107,97,103,101,32,111,114,10,32,32,32,32,110,111,116,46, - 32,32,79,110,32,109,111,100,117,108,101,115,32,116,104,105, - 115,32,105,115,32,114,101,102,108,101,99,116,101,100,32,98, - 121,32,116,104,101,32,96,95,95,112,97,116,104,95,95,96, - 32,97,116,116,114,105,98,117,116,101,46,10,10,32,32,32, - 32,96,111,114,105,103,105,110,96,32,105,115,32,116,104,101, - 32,115,112,101,99,105,102,105,99,32,108,111,99,97,116,105, - 111,110,32,117,115,101,100,32,98,121,32,116,104,101,32,108, - 111,97,100,101,114,32,102,114,111,109,32,119,104,105,99,104, - 32,116,111,10,32,32,32,32,108,111,97,100,32,116,104,101, - 32,109,111,100,117,108,101,44,32,105,102,32,116,104,97,116, - 32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32, - 97,118,97,105,108,97,98,108,101,46,32,32,87,104,101,110, - 32,102,105,108,101,110,97,109,101,32,105,115,10,32,32,32, - 32,115,101,116,44,32,111,114,105,103,105,110,32,119,105,108, - 108,32,109,97,116,99,104,46,10,10,32,32,32,32,96,104, - 97,115,95,108,111,99,97,116,105,111,110,96,32,105,110,100, - 105,99,97,116,101,115,32,116,104,97,116,32,97,32,115,112, - 101,99,39,115,32,34,111,114,105,103,105,110,34,32,114,101, - 102,108,101,99,116,115,32,97,32,108,111,99,97,116,105,111, - 110,46,10,32,32,32,32,87,104,101,110,32,116,104,105,115, - 32,105,115,32,84,114,117,101,44,32,96,95,95,102,105,108, - 101,95,95,96,32,97,116,116,114,105,98,117,116,101,32,111, - 102,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32, - 115,101,116,46,10,10,32,32,32,32,96,99,97,99,104,101, - 100,96,32,105,115,32,116,104,101,32,108,111,99,97,116,105, - 111,110,32,111,102,32,116,104,101,32,99,97,99,104,101,100, - 32,98,121,116,101,99,111,100,101,32,102,105,108,101,44,32, - 105,102,32,97,110,121,46,32,32,73,116,10,32,32,32,32, - 99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116, - 104,101,32,96,95,95,99,97,99,104,101,100,95,95,96,32, - 97,116,116,114,105,98,117,116,101,46,10,10,32,32,32,32, - 96,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, - 104,95,108,111,99,97,116,105,111,110,115,96,32,105,115,32, - 116,104,101,32,115,101,113,117,101,110,99,101,32,111,102,32, - 112,97,116,104,32,101,110,116,114,105,101,115,32,116,111,10, - 32,32,32,32,115,101,97,114,99,104,32,119,104,101,110,32, - 105,109,112,111,114,116,105,110,103,32,115,117,98,109,111,100, - 117,108,101,115,46,32,32,73,102,32,115,101,116,44,32,105, - 115,95,112,97,99,107,97,103,101,32,115,104,111,117,108,100, - 32,98,101,10,32,32,32,32,84,114,117,101,45,45,97,110, - 100,32,70,97,108,115,101,32,111,116,104,101,114,119,105,115, - 101,46,10,10,32,32,32,32,80,97,99,107,97,103,101,115, - 32,97,114,101,32,115,105,109,112,108,121,32,109,111,100,117, - 108,101,115,32,116,104,97,116,32,40,109,97,121,41,32,104, - 97,118,101,32,115,117,98,109,111,100,117,108,101,115,46,32, - 32,73,102,32,97,32,115,112,101,99,10,32,32,32,32,104, - 97,115,32,97,32,110,111,110,45,78,111,110,101,32,118,97, - 108,117,101,32,105,110,32,96,115,117,98,109,111,100,117,108, - 101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111, - 110,115,96,44,32,116,104,101,32,105,109,112,111,114,116,10, - 32,32,32,32,115,121,115,116,101,109,32,119,105,108,108,32, - 99,111,110,115,105,100,101,114,32,109,111,100,117,108,101,115, - 32,108,111,97,100,101,100,32,102,114,111,109,32,116,104,101, - 32,115,112,101,99,32,97,115,32,112,97,99,107,97,103,101, - 115,46,10,10,32,32,32,32,79,110,108,121,32,102,105,110, - 100,101,114,115,32,40,115,101,101,32,105,109,112,111,114,116, - 108,105,98,46,97,98,99,46,77,101,116,97,80,97,116,104, - 70,105,110,100,101,114,32,97,110,100,10,32,32,32,32,105, - 109,112,111,114,116,108,105,98,46,97,98,99,46,80,97,116, - 104,69,110,116,114,121,70,105,110,100,101,114,41,32,115,104, - 111,117,108,100,32,109,111,100,105,102,121,32,77,111,100,117, - 108,101,83,112,101,99,32,105,110,115,116,97,110,99,101,115, - 46,10,10,32,32,32,32,78,41,3,218,6,111,114,105,103, - 105,110,218,12,108,111,97,100,101,114,95,115,116,97,116,101, - 218,10,105,115,95,112,97,99,107,97,103,101,99,3,0,0, - 0,0,0,0,0,3,0,0,0,6,0,0,0,2,0,0, - 0,67,0,0,0,115,54,0,0,0,124,1,124,0,95,0, - 124,2,124,0,95,1,124,3,124,0,95,2,124,4,124,0, - 95,3,124,5,114,32,103,0,110,2,100,0,124,0,95,4, - 100,1,124,0,95,5,100,0,124,0,95,6,100,0,83,0, - 41,2,78,70,41,7,114,20,0,0,0,114,116,0,0,0, - 114,120,0,0,0,114,121,0,0,0,218,26,115,117,98,109, - 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,218,13,95,115,101,116,95,102,105,108, - 101,97,116,116,114,218,7,95,99,97,99,104,101,100,41,6, - 114,33,0,0,0,114,20,0,0,0,114,116,0,0,0,114, - 120,0,0,0,114,121,0,0,0,114,122,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,34,0, - 0,0,111,1,0,0,115,16,0,0,0,6,2,6,1,6, - 1,6,1,14,1,6,3,10,1,255,128,122,19,77,111,100, - 117,108,101,83,112,101,99,46,95,95,105,110,105,116,95,95, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,6,0,0,0,67,0,0,0,115,102,0,0,0,100,1, - 160,0,124,0,106,1,161,1,100,2,160,0,124,0,106,2, - 161,1,103,2,125,1,124,0,106,3,100,0,117,1,114,52, - 124,1,160,4,100,3,160,0,124,0,106,3,161,1,161,1, - 1,0,124,0,106,5,100,0,117,1,114,80,124,1,160,4, - 100,4,160,0,124,0,106,5,161,1,161,1,1,0,100,5, - 160,0,124,0,106,6,106,7,100,6,160,8,124,1,161,1, - 161,2,83,0,41,7,78,122,9,110,97,109,101,61,123,33, - 114,125,122,11,108,111,97,100,101,114,61,123,33,114,125,122, - 11,111,114,105,103,105,110,61,123,33,114,125,122,29,115,117, - 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, - 111,99,97,116,105,111,110,115,61,123,125,122,6,123,125,40, - 123,125,41,122,2,44,32,41,9,114,49,0,0,0,114,20, - 0,0,0,114,116,0,0,0,114,120,0,0,0,218,6,97, - 112,112,101,110,100,114,123,0,0,0,218,9,95,95,99,108, - 97,115,115,95,95,114,9,0,0,0,218,4,106,111,105,110, - 41,2,114,33,0,0,0,114,59,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,52,0,0,0, - 123,1,0,0,115,22,0,0,0,10,1,10,1,4,255,10, - 2,18,1,10,1,8,1,4,1,6,255,22,2,255,128,122, - 19,77,111,100,117,108,101,83,112,101,99,46,95,95,114,101, - 112,114,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,8,0,0,0,67,0,0,0,115,102,0, - 0,0,124,0,106,0,125,2,122,72,124,0,106,1,124,1, - 106,1,107,2,111,76,124,0,106,2,124,1,106,2,107,2, - 111,76,124,0,106,3,124,1,106,3,107,2,111,76,124,2, - 124,1,106,0,107,2,111,76,124,0,106,4,124,1,106,4, - 107,2,111,76,124,0,106,5,124,1,106,5,107,2,87,0, - 83,0,4,0,116,6,121,100,1,0,1,0,1,0,116,7, - 6,0,89,0,83,0,119,0,114,0,0,0,0,41,8,114, - 123,0,0,0,114,20,0,0,0,114,116,0,0,0,114,120, - 0,0,0,218,6,99,97,99,104,101,100,218,12,104,97,115, - 95,108,111,99,97,116,105,111,110,114,2,0,0,0,218,14, - 78,111,116,73,109,112,108,101,109,101,110,116,101,100,41,3, - 114,33,0,0,0,90,5,111,116,104,101,114,90,4,115,109, - 115,108,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,6,95,95,101,113,95,95,133,1,0,0,115,34,0, - 0,0,6,1,2,1,12,1,10,1,2,255,10,2,2,254, - 8,3,2,253,10,4,2,252,10,5,4,251,12,6,8,1, - 2,255,255,128,122,17,77,111,100,117,108,101,83,112,101,99, - 46,95,95,101,113,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,58,0,0,0,124,0,106,0,100,0,117,0,114,52,124, - 0,106,1,100,0,117,1,114,52,124,0,106,2,114,52,116, - 3,100,0,117,0,114,38,116,4,130,1,116,3,160,5,124, - 0,106,1,161,1,124,0,95,0,124,0,106,0,83,0,114, - 0,0,0,0,41,6,114,125,0,0,0,114,120,0,0,0, - 114,124,0,0,0,218,19,95,98,111,111,116,115,116,114,97, - 112,95,101,120,116,101,114,110,97,108,218,19,78,111,116,73, - 109,112,108,101,109,101,110,116,101,100,69,114,114,111,114,90, - 11,95,103,101,116,95,99,97,99,104,101,100,114,51,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,129,0,0,0,145,1,0,0,115,14,0,0,0,10,2, - 16,1,8,1,4,1,14,1,6,1,255,128,122,17,77,111, - 100,117,108,101,83,112,101,99,46,99,97,99,104,101,100,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 2,0,0,0,67,0,0,0,115,10,0,0,0,124,1,124, - 0,95,0,100,0,83,0,114,0,0,0,0,41,1,114,125, - 0,0,0,41,2,114,33,0,0,0,114,129,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,129, - 0,0,0,154,1,0,0,115,4,0,0,0,10,2,255,128, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,32,0,0,0,124,0, - 106,0,100,1,117,0,114,26,124,0,106,1,160,2,100,2, - 161,1,100,3,25,0,83,0,124,0,106,1,83,0,41,4, - 122,32,84,104,101,32,110,97,109,101,32,111,102,32,116,104, - 101,32,109,111,100,117,108,101,39,115,32,112,97,114,101,110, - 116,46,78,218,1,46,114,25,0,0,0,41,3,114,123,0, - 0,0,114,20,0,0,0,218,10,114,112,97,114,116,105,116, - 105,111,110,114,51,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,6,112,97,114,101,110,116,158, - 1,0,0,115,8,0,0,0,10,3,16,1,6,2,255,128, - 122,17,77,111,100,117,108,101,83,112,101,99,46,112,97,114, - 101,110,116,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,1,0,0,0,67,0,0,0,115,6,0,0, - 0,124,0,106,0,83,0,114,0,0,0,0,41,1,114,124, - 0,0,0,114,51,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,130,0,0,0,166,1,0,0, - 115,4,0,0,0,6,2,255,128,122,23,77,111,100,117,108, - 101,83,112,101,99,46,104,97,115,95,108,111,99,97,116,105, - 111,110,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,2,0,0,0,67,0,0,0,115,14,0,0,0, - 116,0,124,1,131,1,124,0,95,1,100,0,83,0,114,0, - 0,0,0,41,2,218,4,98,111,111,108,114,124,0,0,0, - 41,2,114,33,0,0,0,218,5,118,97,108,117,101,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,130,0, - 0,0,170,1,0,0,115,4,0,0,0,14,2,255,128,41, - 12,114,9,0,0,0,114,8,0,0,0,114,1,0,0,0, - 114,10,0,0,0,114,34,0,0,0,114,52,0,0,0,114, - 132,0,0,0,218,8,112,114,111,112,101,114,116,121,114,129, - 0,0,0,218,6,115,101,116,116,101,114,114,137,0,0,0, - 114,130,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,119,0,0,0,74,1, - 0,0,115,36,0,0,0,8,0,4,1,4,36,2,1,12, - 255,8,12,8,10,2,12,10,1,4,8,10,1,2,3,10, - 1,2,7,10,1,4,3,14,1,255,128,114,119,0,0,0, - 169,2,114,120,0,0,0,114,122,0,0,0,99,2,0,0, - 0,0,0,0,0,2,0,0,0,6,0,0,0,8,0,0, - 0,67,0,0,0,115,150,0,0,0,116,0,124,1,100,1, - 131,2,114,74,116,1,100,2,117,0,114,22,116,2,130,1, - 116,1,106,3,125,4,124,3,100,2,117,0,114,48,124,4, - 124,0,124,1,100,3,141,2,83,0,124,3,114,56,103,0, - 110,2,100,2,125,5,124,4,124,0,124,1,124,5,100,4, - 141,3,83,0,124,3,100,2,117,0,114,132,116,0,124,1, - 100,5,131,2,114,128,122,14,124,1,160,4,124,0,161,1, - 125,3,87,0,110,24,4,0,116,5,121,148,1,0,1,0, - 1,0,100,2,125,3,89,0,110,4,100,6,125,3,116,6, - 124,0,124,1,124,2,124,3,100,7,141,4,83,0,119,0, - 41,8,122,53,82,101,116,117,114,110,32,97,32,109,111,100, - 117,108,101,32,115,112,101,99,32,98,97,115,101,100,32,111, - 110,32,118,97,114,105,111,117,115,32,108,111,97,100,101,114, - 32,109,101,116,104,111,100,115,46,90,12,103,101,116,95,102, - 105,108,101,110,97,109,101,78,41,1,114,116,0,0,0,41, - 2,114,116,0,0,0,114,123,0,0,0,114,122,0,0,0, - 70,114,142,0,0,0,41,7,114,11,0,0,0,114,133,0, - 0,0,114,134,0,0,0,218,23,115,112,101,99,95,102,114, - 111,109,95,102,105,108,101,95,108,111,99,97,116,105,111,110, - 114,122,0,0,0,114,83,0,0,0,114,119,0,0,0,41, - 6,114,20,0,0,0,114,116,0,0,0,114,120,0,0,0, - 114,122,0,0,0,114,143,0,0,0,90,6,115,101,97,114, - 99,104,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,98,0,0,0,175,1,0,0,115,40,0,0,0,10, - 2,8,1,4,1,6,1,8,2,12,1,12,1,6,1,2, - 1,6,255,8,3,10,1,2,1,14,1,12,1,8,1,4, - 3,16,2,2,250,255,128,114,98,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0, - 0,67,0,0,0,115,44,1,0,0,122,10,124,0,106,0, - 125,3,87,0,110,18,4,0,116,1,144,1,121,42,1,0, - 1,0,1,0,89,0,110,12,124,3,100,0,117,1,114,42, - 124,3,83,0,124,0,106,2,125,4,124,1,100,0,117,0, - 114,84,122,10,124,0,106,3,125,1,87,0,110,16,4,0, - 116,1,144,1,121,40,1,0,1,0,1,0,89,0,122,10, - 124,0,106,4,125,5,87,0,110,20,4,0,116,1,144,1, - 121,38,1,0,1,0,1,0,100,0,125,5,89,0,124,2, - 100,0,117,0,114,170,124,5,100,0,117,0,114,166,122,10, - 124,1,106,5,125,2,87,0,110,26,4,0,116,1,144,1, - 121,36,1,0,1,0,1,0,100,0,125,2,89,0,110,4, - 124,5,125,2,122,10,124,0,106,6,125,6,87,0,110,20, - 4,0,116,1,144,1,121,34,1,0,1,0,1,0,100,0, - 125,6,89,0,122,14,116,7,124,0,106,8,131,1,125,7, - 87,0,110,20,4,0,116,1,144,1,121,32,1,0,1,0, - 1,0,100,0,125,7,89,0,116,9,124,4,124,1,124,2, - 100,1,141,3,125,3,124,5,100,0,117,0,144,1,114,10, - 100,2,110,2,100,3,124,3,95,10,124,6,124,3,95,11, - 124,7,124,3,95,12,124,3,83,0,119,0,119,0,119,0, - 119,0,119,0,119,0,41,4,78,169,1,114,120,0,0,0, - 70,84,41,13,114,113,0,0,0,114,2,0,0,0,114,9, - 0,0,0,114,106,0,0,0,114,115,0,0,0,218,7,95, - 79,82,73,71,73,78,218,10,95,95,99,97,99,104,101,100, - 95,95,218,4,108,105,115,116,218,8,95,95,112,97,116,104, - 95,95,114,119,0,0,0,114,124,0,0,0,114,129,0,0, - 0,114,123,0,0,0,41,8,114,104,0,0,0,114,116,0, - 0,0,114,120,0,0,0,114,103,0,0,0,114,20,0,0, - 0,90,8,108,111,99,97,116,105,111,110,114,129,0,0,0, - 114,123,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,17,95,115,112,101,99,95,102,114,111,109, - 95,109,111,100,117,108,101,201,1,0,0,115,86,0,0,0, - 2,2,10,1,14,1,4,1,8,2,4,1,6,2,8,1, - 2,1,10,1,14,1,2,2,2,1,10,1,14,1,6,1, - 8,1,8,1,2,1,10,1,14,1,8,1,4,2,2,1, - 10,1,14,1,6,1,2,1,14,1,14,1,6,1,14,2, - 20,1,6,1,6,1,4,1,2,249,2,252,2,250,2,250, - 2,251,2,246,255,128,114,149,0,0,0,70,169,1,218,8, - 111,118,101,114,114,105,100,101,99,2,0,0,0,0,0,0, - 0,1,0,0,0,5,0,0,0,8,0,0,0,67,0,0, - 0,115,210,1,0,0,124,2,115,20,116,0,124,1,100,1, - 100,0,131,3,100,0,117,0,114,50,122,12,124,0,106,1, - 124,1,95,2,87,0,110,16,4,0,116,3,144,1,121,208, - 1,0,1,0,1,0,89,0,124,2,115,70,116,0,124,1, - 100,2,100,0,131,3,100,0,117,0,114,170,124,0,106,4, - 125,3,124,3,100,0,117,0,114,142,124,0,106,5,100,0, - 117,1,114,142,116,6,100,0,117,0,114,106,116,7,130,1, - 116,6,106,8,125,4,124,4,160,9,124,4,161,1,125,3, - 124,0,106,5,124,3,95,10,124,3,124,0,95,4,100,0, - 124,1,95,11,122,10,124,3,124,1,95,12,87,0,110,16, - 4,0,116,3,144,1,121,206,1,0,1,0,1,0,89,0, - 124,2,115,190,116,0,124,1,100,3,100,0,131,3,100,0, - 117,0,114,220,122,12,124,0,106,13,124,1,95,14,87,0, - 110,16,4,0,116,3,144,1,121,204,1,0,1,0,1,0, - 89,0,122,10,124,0,124,1,95,15,87,0,110,16,4,0, - 116,3,144,1,121,202,1,0,1,0,1,0,89,0,124,2, - 144,1,115,16,116,0,124,1,100,4,100,0,131,3,100,0, - 117,0,144,1,114,58,124,0,106,5,100,0,117,1,144,1, - 114,58,122,12,124,0,106,5,124,1,95,16,87,0,110,16, - 4,0,116,3,144,1,121,200,1,0,1,0,1,0,89,0, - 124,0,106,17,144,1,114,192,124,2,144,1,115,90,116,0, - 124,1,100,5,100,0,131,3,100,0,117,0,144,1,114,120, - 122,12,124,0,106,18,124,1,95,11,87,0,110,16,4,0, - 116,3,144,1,121,198,1,0,1,0,1,0,89,0,124,2, - 144,1,115,144,116,0,124,1,100,6,100,0,131,3,100,0, - 117,0,144,1,114,192,124,0,106,19,100,0,117,1,144,1, - 114,192,122,14,124,0,106,19,124,1,95,20,87,0,124,1, - 83,0,4,0,116,3,144,1,121,196,1,0,1,0,1,0, - 89,0,124,1,83,0,124,1,83,0,119,0,119,0,119,0, - 119,0,119,0,119,0,119,0,41,7,78,114,9,0,0,0, - 114,106,0,0,0,218,11,95,95,112,97,99,107,97,103,101, - 95,95,114,148,0,0,0,114,115,0,0,0,114,146,0,0, - 0,41,21,114,13,0,0,0,114,20,0,0,0,114,9,0, - 0,0,114,2,0,0,0,114,116,0,0,0,114,123,0,0, - 0,114,133,0,0,0,114,134,0,0,0,218,16,95,78,97, - 109,101,115,112,97,99,101,76,111,97,100,101,114,218,7,95, - 95,110,101,119,95,95,90,5,95,112,97,116,104,114,115,0, - 0,0,114,106,0,0,0,114,137,0,0,0,114,152,0,0, - 0,114,113,0,0,0,114,148,0,0,0,114,130,0,0,0, - 114,120,0,0,0,114,129,0,0,0,114,146,0,0,0,41, - 5,114,103,0,0,0,114,104,0,0,0,114,151,0,0,0, - 114,116,0,0,0,114,153,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,18,95,105,110,105,116, - 95,109,111,100,117,108,101,95,97,116,116,114,115,246,1,0, - 0,115,114,0,0,0,20,4,2,1,12,1,14,1,2,1, - 20,2,6,1,8,1,10,2,8,1,4,1,6,1,10,2, - 8,1,6,1,6,11,2,1,10,1,14,1,2,1,20,2, - 2,1,12,1,14,1,2,1,2,2,10,1,14,1,2,1, - 24,2,12,1,2,1,12,1,14,1,2,1,8,2,24,1, - 2,1,12,1,14,1,2,1,24,2,12,1,2,1,10,1, - 4,3,14,254,2,1,8,1,2,254,2,249,2,249,2,249, - 2,251,2,250,2,228,255,128,114,155,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,82,0,0,0,100,1,125,1,116, - 0,124,0,106,1,100,2,131,2,114,30,124,0,106,1,160, - 2,124,0,161,1,125,1,110,20,116,0,124,0,106,1,100, - 3,131,2,114,50,116,3,100,4,131,1,130,1,124,1,100, - 1,117,0,114,68,116,4,124,0,106,5,131,1,125,1,116, - 6,124,0,124,1,131,2,1,0,124,1,83,0,41,5,122, - 43,67,114,101,97,116,101,32,97,32,109,111,100,117,108,101, - 32,98,97,115,101,100,32,111,110,32,116,104,101,32,112,114, - 111,118,105,100,101,100,32,115,112,101,99,46,78,218,13,99, - 114,101,97,116,101,95,109,111,100,117,108,101,218,11,101,120, - 101,99,95,109,111,100,117,108,101,122,66,108,111,97,100,101, - 114,115,32,116,104,97,116,32,100,101,102,105,110,101,32,101, - 120,101,99,95,109,111,100,117,108,101,40,41,32,109,117,115, - 116,32,97,108,115,111,32,100,101,102,105,110,101,32,99,114, - 101,97,116,101,95,109,111,100,117,108,101,40,41,41,7,114, - 11,0,0,0,114,116,0,0,0,114,156,0,0,0,114,83, - 0,0,0,114,21,0,0,0,114,20,0,0,0,114,155,0, - 0,0,169,2,114,103,0,0,0,114,104,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,16,109, - 111,100,117,108,101,95,102,114,111,109,95,115,112,101,99,62, - 2,0,0,115,20,0,0,0,4,3,12,1,14,3,12,1, - 8,1,8,2,10,1,10,1,4,1,255,128,114,159,0,0, + 8,95,95,101,120,105,116,95,95,173,0,0,0,115,4,0, + 0,0,14,1,255,128,122,27,95,77,111,100,117,108,101,76, + 111,99,107,77,97,110,97,103,101,114,46,95,95,101,120,105, + 116,95,95,78,41,6,114,9,0,0,0,114,8,0,0,0, + 114,1,0,0,0,114,34,0,0,0,114,61,0,0,0,114, + 63,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,57,0,0,0,163,0,0, + 0,115,10,0,0,0,8,0,8,2,8,4,12,4,255,128, + 114,57,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,8,0,0,0,67,0,0,0,115,132, + 0,0,0,116,0,160,1,161,0,1,0,122,110,122,14,116, + 2,124,0,25,0,131,0,125,1,87,0,110,18,4,0,116, + 3,121,130,1,0,1,0,1,0,100,1,125,1,89,0,124, + 1,100,1,117,0,114,106,116,4,100,1,117,0,114,70,116, + 5,124,0,131,1,125,1,110,8,116,6,124,0,131,1,125, + 1,124,0,102,1,100,2,100,3,132,1,125,2,116,7,160, + 8,124,1,124,2,161,2,116,2,124,0,60,0,87,0,116, + 0,160,9,161,0,1,0,124,1,83,0,116,0,160,9,161, + 0,1,0,119,0,119,0,41,4,122,139,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,65,99,113,117,105,114,101,47,114, + 101,108,101,97,115,101,32,105,110,116,101,114,110,97,108,108, + 121,32,116,104,101,32,103,108,111,98,97,108,32,105,109,112, + 111,114,116,32,108,111,99,107,32,116,111,32,112,114,111,116, + 101,99,116,10,32,32,32,32,95,109,111,100,117,108,101,95, + 108,111,99,107,115,46,78,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,8,0,0,0,83,0,0,0, + 115,54,0,0,0,116,0,160,1,161,0,1,0,122,34,116, + 2,160,3,124,1,161,1,124,0,117,0,114,30,116,2,124, + 1,61,0,87,0,116,0,160,4,161,0,1,0,100,0,83, + 0,116,0,160,4,161,0,1,0,119,0,114,0,0,0,0, + 41,5,218,4,95,105,109,112,218,12,97,99,113,117,105,114, + 101,95,108,111,99,107,218,13,95,109,111,100,117,108,101,95, + 108,111,99,107,115,114,38,0,0,0,218,12,114,101,108,101, + 97,115,101,95,108,111,99,107,41,2,218,3,114,101,102,114, + 20,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,2,99,98,198,0,0,0,115,14,0,0,0, + 8,1,2,1,14,4,6,1,2,128,22,2,255,128,122,28, + 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,41,10,114,64, + 0,0,0,114,65,0,0,0,114,66,0,0,0,218,8,75, + 101,121,69,114,114,111,114,114,26,0,0,0,114,55,0,0, + 0,114,23,0,0,0,218,8,95,119,101,97,107,114,101,102, + 114,68,0,0,0,114,67,0,0,0,41,3,114,20,0,0, + 0,114,27,0,0,0,114,69,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,60,0,0,0,179, + 0,0,0,115,36,0,0,0,8,6,2,1,2,1,14,1, + 12,1,6,1,8,2,8,1,10,1,8,2,12,2,16,11, + 2,128,8,2,4,2,10,254,2,234,255,128,114,60,0,0, 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,4,0,0,0,67,0,0,0,115,100,0,0,0,124, - 0,106,0,100,1,117,0,114,14,100,2,110,4,124,0,106, - 0,125,1,124,0,106,1,100,1,117,0,114,64,124,0,106, - 2,100,1,117,0,114,50,100,3,160,3,124,1,161,1,83, - 0,100,4,160,3,124,1,124,0,106,2,161,2,83,0,124, - 0,106,4,114,84,100,5,160,3,124,1,124,0,106,1,161, - 2,83,0,100,6,160,3,124,0,106,0,124,0,106,1,161, - 2,83,0,41,7,122,38,82,101,116,117,114,110,32,116,104, - 101,32,114,101,112,114,32,116,111,32,117,115,101,32,102,111, - 114,32,116,104,101,32,109,111,100,117,108,101,46,78,114,108, - 0,0,0,114,109,0,0,0,114,110,0,0,0,114,111,0, - 0,0,250,18,60,109,111,100,117,108,101,32,123,33,114,125, - 32,40,123,125,41,62,41,5,114,20,0,0,0,114,120,0, - 0,0,114,116,0,0,0,114,49,0,0,0,114,130,0,0, - 0,41,2,114,103,0,0,0,114,20,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,114,0,0, - 0,79,2,0,0,115,18,0,0,0,20,3,10,1,10,1, - 10,1,14,2,6,2,14,1,16,2,255,128,114,114,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,10,0,0,0,67,0,0,0,115,26,1,0,0,124, - 0,106,0,125,2,116,1,124,2,131,1,143,246,1,0,116, - 2,106,3,160,4,124,2,161,1,124,1,117,1,114,54,100, - 1,160,5,124,2,161,1,125,3,116,6,124,3,124,2,100, - 2,141,2,130,1,122,160,124,0,106,7,100,3,117,0,114, - 106,124,0,106,8,100,3,117,0,114,90,116,6,100,4,124, - 0,106,0,100,2,141,2,130,1,116,9,124,0,124,1,100, - 5,100,6,141,3,1,0,110,80,116,9,124,0,124,1,100, - 5,100,6,141,3,1,0,116,10,124,0,106,7,100,7,131, - 2,115,174,116,11,124,0,106,7,131,1,155,0,100,8,157, - 2,125,3,116,12,160,13,124,3,116,14,161,2,1,0,124, - 0,106,7,160,15,124,2,161,1,1,0,110,12,124,0,106, - 7,160,16,124,1,161,1,1,0,87,0,116,2,106,3,160, - 17,124,0,106,0,161,1,125,1,124,1,116,2,106,3,124, - 0,106,0,60,0,110,28,116,2,106,3,160,17,124,0,106, - 0,161,1,125,1,124,1,116,2,106,3,124,0,106,0,60, - 0,119,0,87,0,100,3,4,0,4,0,131,3,1,0,124, - 1,83,0,49,0,144,1,115,12,119,1,1,0,1,0,1, - 0,89,0,1,0,124,1,83,0,41,9,122,70,69,120,101, - 99,117,116,101,32,116,104,101,32,115,112,101,99,39,115,32, - 115,112,101,99,105,102,105,101,100,32,109,111,100,117,108,101, - 32,105,110,32,97,110,32,101,120,105,115,116,105,110,103,32, - 109,111,100,117,108,101,39,115,32,110,97,109,101,115,112,97, - 99,101,46,122,30,109,111,100,117,108,101,32,123,33,114,125, - 32,110,111,116,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,114,19,0,0,0,78,250,14,109,105,115,115,105, - 110,103,32,108,111,97,100,101,114,84,114,150,0,0,0,114, - 157,0,0,0,250,55,46,101,120,101,99,95,109,111,100,117, - 108,101,40,41,32,110,111,116,32,102,111,117,110,100,59,32, - 102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32, - 108,111,97,100,95,109,111,100,117,108,101,40,41,41,18,114, - 20,0,0,0,114,54,0,0,0,114,18,0,0,0,114,99, - 0,0,0,114,38,0,0,0,114,49,0,0,0,114,83,0, - 0,0,114,116,0,0,0,114,123,0,0,0,114,155,0,0, - 0,114,11,0,0,0,114,7,0,0,0,114,95,0,0,0, - 114,96,0,0,0,218,13,73,109,112,111,114,116,87,97,114, - 110,105,110,103,218,11,108,111,97,100,95,109,111,100,117,108, - 101,114,157,0,0,0,218,3,112,111,112,41,4,114,103,0, - 0,0,114,104,0,0,0,114,20,0,0,0,114,102,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,100,0,0,0,96,2,0,0,115,50,0,0,0,6,2, - 10,1,16,1,10,1,12,1,2,1,10,1,10,1,14,1, - 16,2,14,2,12,1,16,1,12,2,14,1,12,2,2,128, - 14,4,14,1,14,255,26,1,4,1,18,128,4,0,255,128, - 114,100,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,18, - 1,0,0,122,18,124,0,106,0,160,1,124,0,106,2,161, - 1,1,0,87,0,110,46,1,0,1,0,1,0,124,0,106, - 2,116,3,106,4,118,0,114,64,116,3,106,4,160,5,124, - 0,106,2,161,1,125,1,124,1,116,3,106,4,124,0,106, - 2,60,0,130,0,116,3,106,4,160,5,124,0,106,2,161, - 1,125,1,124,1,116,3,106,4,124,0,106,2,60,0,116, - 6,124,1,100,1,100,0,131,3,100,0,117,0,114,138,122, - 12,124,0,106,0,124,1,95,7,87,0,110,16,4,0,116, - 8,144,1,121,16,1,0,1,0,1,0,89,0,116,6,124, - 1,100,2,100,0,131,3,100,0,117,0,114,212,122,40,124, - 1,106,9,124,1,95,10,116,11,124,1,100,3,131,2,115, - 192,124,0,106,2,160,12,100,4,161,1,100,5,25,0,124, - 1,95,10,87,0,110,16,4,0,116,8,144,1,121,14,1, - 0,1,0,1,0,89,0,116,6,124,1,100,6,100,0,131, - 3,100,0,117,0,144,1,114,8,122,12,124,0,124,1,95, - 13,87,0,124,1,83,0,4,0,116,8,144,1,121,12,1, - 0,1,0,1,0,89,0,124,1,83,0,124,1,83,0,119, - 0,119,0,119,0,41,7,78,114,106,0,0,0,114,152,0, - 0,0,114,148,0,0,0,114,135,0,0,0,114,25,0,0, - 0,114,113,0,0,0,41,14,114,116,0,0,0,114,164,0, - 0,0,114,20,0,0,0,114,18,0,0,0,114,99,0,0, - 0,114,165,0,0,0,114,13,0,0,0,114,106,0,0,0, - 114,2,0,0,0,114,9,0,0,0,114,152,0,0,0,114, - 11,0,0,0,114,136,0,0,0,114,113,0,0,0,114,158, + 0,0,8,0,0,0,67,0,0,0,115,54,0,0,0,116, + 0,124,0,131,1,125,1,122,12,124,1,160,1,161,0,1, + 0,87,0,110,18,4,0,116,2,121,52,1,0,1,0,1, + 0,89,0,100,1,83,0,124,1,160,3,161,0,1,0,100, + 1,83,0,119,0,41,2,122,189,65,99,113,117,105,114,101, + 115,32,116,104,101,110,32,114,101,108,101,97,115,101,115,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,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,32,32,32,32,78,41,4,114,60,0,0,0,114,43, + 0,0,0,114,22,0,0,0,114,44,0,0,0,41,2,114, + 20,0,0,0,114,27,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,19,95,108,111,99,107,95, + 117,110,108,111,99,107,95,109,111,100,117,108,101,216,0,0, + 0,115,16,0,0,0,8,6,2,1,12,1,12,1,6,3, + 12,2,2,251,255,128,114,72,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0, + 79,0,0,0,115,14,0,0,0,124,0,124,1,105,0,124, + 2,164,1,142,1,83,0,41,2,97,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,78,114,5,0, + 0,0,41,3,218,1,102,114,62,0,0,0,90,4,107,119, + 100,115,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,25,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,233,0,0,0, + 115,4,0,0,0,14,8,255,128,114,74,0,0,0,114,42, + 0,0,0,41,1,218,9,118,101,114,98,111,115,105,116,121, + 99,1,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,4,0,0,0,71,0,0,0,115,58,0,0,0,116,0, + 106,1,106,2,124,1,107,5,114,54,124,0,160,3,100,1, + 161,1,115,30,100,2,124,0,23,0,125,0,116,4,124,0, + 106,5,124,2,142,0,116,0,106,6,100,3,141,2,1,0, + 100,4,83,0,100,4,83,0,41,5,122,61,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,41,2,250,1,35,122,7, + 105,109,112,111,114,116,32,122,2,35,32,41,1,90,4,102, + 105,108,101,78,41,7,114,18,0,0,0,218,5,102,108,97, + 103,115,218,7,118,101,114,98,111,115,101,218,10,115,116,97, + 114,116,115,119,105,116,104,218,5,112,114,105,110,116,114,50, + 0,0,0,218,6,115,116,100,101,114,114,41,3,218,7,109, + 101,115,115,97,103,101,114,75,0,0,0,114,62,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 16,95,118,101,114,98,111,115,101,95,109,101,115,115,97,103, + 101,244,0,0,0,115,12,0,0,0,12,2,10,1,8,1, + 24,1,4,253,255,128,114,83,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 3,0,0,0,243,26,0,0,0,135,0,102,1,100,1,100, + 2,132,8,125,1,116,0,124,1,136,0,131,2,1,0,124, + 1,83,0,41,4,122,49,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,0,0,0,0,2,0,0,0,4,0,0,0,19,0,0, + 0,115,38,0,0,0,124,1,116,0,106,1,118,1,114,28, + 116,2,100,1,160,3,124,1,161,1,124,1,100,2,141,2, + 130,1,136,0,124,0,124,1,131,2,83,0,41,3,78,250, + 29,123,33,114,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,114,19, + 0,0,0,41,4,114,18,0,0,0,218,20,98,117,105,108, + 116,105,110,95,109,111,100,117,108,101,95,110,97,109,101,115, + 218,11,73,109,112,111,114,116,69,114,114,111,114,114,50,0, + 0,0,169,2,114,33,0,0,0,218,8,102,117,108,108,110, + 97,109,101,169,1,218,3,102,120,110,114,5,0,0,0,114, + 6,0,0,0,218,25,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,254, + 0,0,0,243,12,0,0,0,10,1,10,1,2,1,6,255, + 10,2,255,128,122,52,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,78,169,1,114,17,0, + 0,0,41,2,114,91,0,0,0,114,92,0,0,0,114,5, + 0,0,0,114,90,0,0,0,114,6,0,0,0,218,17,95, + 114,101,113,117,105,114,101,115,95,98,117,105,108,116,105,110, + 252,0,0,0,243,8,0,0,0,12,2,10,5,4,1,255, + 128,114,95,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,114, + 84,0,0,0,41,4,122,47,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, + 0,0,0,0,2,0,0,0,4,0,0,0,19,0,0,0, + 115,38,0,0,0,116,0,160,1,124,1,161,1,115,28,116, + 2,100,1,160,3,124,1,161,1,124,1,100,2,141,2,130, + 1,136,0,124,0,124,1,131,2,83,0,169,3,78,122,27, + 123,33,114,125,32,105,115,32,110,111,116,32,97,32,102,114, + 111,122,101,110,32,109,111,100,117,108,101,114,19,0,0,0, + 41,4,114,64,0,0,0,218,9,105,115,95,102,114,111,122, + 101,110,114,87,0,0,0,114,50,0,0,0,114,88,0,0, + 0,114,90,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,24,95,114,101,113,117,105,114,101,115,95,102,114,111,122, + 101,110,95,119,114,97,112,112,101,114,9,1,0,0,114,93, + 0,0,0,122,50,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,78,114,94,0,0,0,41,2,114, + 91,0,0,0,114,99,0,0,0,114,5,0,0,0,114,90, + 0,0,0,114,6,0,0,0,218,16,95,114,101,113,117,105, + 114,101,115,95,102,114,111,122,101,110,7,1,0,0,114,96, + 0,0,0,114,100,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,5,0,0,0,4,0,0,0,67,0,0, + 0,115,74,0,0,0,100,1,125,2,116,0,160,1,124,2, + 116,2,161,2,1,0,116,3,124,1,124,0,131,2,125,3, + 124,1,116,4,106,5,118,0,114,66,116,4,106,5,124,1, + 25,0,125,4,116,6,124,3,124,4,131,2,1,0,116,4, + 106,5,124,1,25,0,83,0,116,7,124,3,131,1,83,0, + 41,3,122,128,76,111,97,100,32,116,104,101,32,115,112,101, + 99,105,102,105,101,100,32,109,111,100,117,108,101,32,105,110, + 116,111,32,115,121,115,46,109,111,100,117,108,101,115,32,97, + 110,100,32,114,101,116,117,114,110,32,105,116,46,10,10,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,108,111,97,100,101,114,46,101,120,101,99,95,109, + 111,100,117,108,101,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,122,103,116,104,101,32,108,111,97,100,95,109, + 111,100,117,108,101,40,41,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,32,97,110,100, + 32,115,108,97,116,101,100,32,102,111,114,32,114,101,109,111, + 118,97,108,32,105,110,32,80,121,116,104,111,110,32,51,46, + 49,50,59,32,117,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,78,41,8, + 218,9,95,119,97,114,110,105,110,103,115,218,4,119,97,114, + 110,218,18,68,101,112,114,101,99,97,116,105,111,110,87,97, + 114,110,105,110,103,218,16,115,112,101,99,95,102,114,111,109, + 95,108,111,97,100,101,114,114,18,0,0,0,218,7,109,111, + 100,117,108,101,115,218,5,95,101,120,101,99,218,5,95,108, + 111,97,100,41,5,114,33,0,0,0,114,89,0,0,0,218, + 3,109,115,103,218,4,115,112,101,99,218,6,109,111,100,117, + 108,101,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,17,95,108,111,97,100,95,109,111,100,117,108,101,95, + 115,104,105,109,19,1,0,0,115,18,0,0,0,4,6,12, + 2,10,1,10,1,10,1,10,1,10,1,8,2,255,128,114, + 111,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,8,0,0,0,67,0,0,0,115,206,0, + 0,0,116,0,124,0,100,1,100,0,131,3,125,1,116,1, + 124,1,100,2,131,2,114,50,122,12,124,1,160,2,124,0, + 161,1,87,0,83,0,4,0,116,3,121,204,1,0,1,0, + 1,0,89,0,122,10,124,0,106,4,125,2,87,0,110,16, + 4,0,116,5,121,202,1,0,1,0,1,0,89,0,110,16, + 124,2,100,0,117,1,114,94,116,6,124,2,131,1,83,0, + 122,10,124,0,106,7,125,3,87,0,110,18,4,0,116,5, + 121,200,1,0,1,0,1,0,100,3,125,3,89,0,122,10, + 124,0,106,8,125,4,87,0,110,50,4,0,116,5,121,198, + 1,0,1,0,1,0,124,1,100,0,117,0,114,170,100,4, + 160,9,124,3,161,1,6,0,89,0,83,0,100,5,160,9, + 124,3,124,1,161,2,6,0,89,0,83,0,100,6,160,9, + 124,3,124,4,161,2,83,0,119,0,119,0,119,0,119,0, + 41,7,78,218,10,95,95,108,111,97,100,101,114,95,95,218, + 11,109,111,100,117,108,101,95,114,101,112,114,250,1,63,250, + 13,60,109,111,100,117,108,101,32,123,33,114,125,62,250,20, + 60,109,111,100,117,108,101,32,123,33,114,125,32,40,123,33, + 114,125,41,62,250,23,60,109,111,100,117,108,101,32,123,33, + 114,125,32,102,114,111,109,32,123,33,114,125,62,41,10,114, + 13,0,0,0,114,11,0,0,0,114,113,0,0,0,218,9, + 69,120,99,101,112,116,105,111,110,218,8,95,95,115,112,101, + 99,95,95,114,2,0,0,0,218,22,95,109,111,100,117,108, + 101,95,114,101,112,114,95,102,114,111,109,95,115,112,101,99, + 114,9,0,0,0,218,8,95,95,102,105,108,101,95,95,114, + 50,0,0,0,41,5,114,110,0,0,0,218,6,108,111,97, + 100,101,114,114,109,0,0,0,114,20,0,0,0,218,8,102, + 105,108,101,110,97,109,101,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,12,95,109,111,100,117,108,101,95, + 114,101,112,114,38,1,0,0,115,56,0,0,0,12,2,10, + 1,2,4,12,1,12,1,2,1,2,1,10,1,12,1,4, + 1,8,2,8,1,2,4,10,1,12,1,6,1,2,1,10, + 1,12,1,8,1,14,1,16,2,12,2,2,250,2,252,2, + 246,2,252,255,128,114,124,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, + 0,0,0,115,114,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,2,100,2,100,3,156,3,100,4, + 100,5,132,2,90,4,100,6,100,7,132,0,90,5,100,8, + 100,9,132,0,90,6,101,7,100,10,100,11,132,0,131,1, + 90,8,101,8,106,9,100,12,100,11,132,0,131,1,90,8, + 101,7,100,13,100,14,132,0,131,1,90,10,101,7,100,15, + 100,16,132,0,131,1,90,11,101,11,106,9,100,17,100,16, + 132,0,131,1,90,11,100,2,83,0,41,18,218,10,77,111, + 100,117,108,101,83,112,101,99,97,208,5,0,0,84,104,101, + 32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102, + 111,114,32,97,32,109,111,100,117,108,101,44,32,117,115,101, + 100,32,102,111,114,32,108,111,97,100,105,110,103,46,10,10, + 32,32,32,32,65,32,109,111,100,117,108,101,39,115,32,115, + 112,101,99,32,105,115,32,116,104,101,32,115,111,117,114,99, + 101,32,102,111,114,32,105,110,102,111,114,109,97,116,105,111, + 110,32,97,98,111,117,116,32,116,104,101,32,109,111,100,117, + 108,101,46,32,32,70,111,114,10,32,32,32,32,100,97,116, + 97,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116, + 104,32,116,104,101,32,109,111,100,117,108,101,44,32,105,110, + 99,108,117,100,105,110,103,32,115,111,117,114,99,101,44,32, + 117,115,101,32,116,104,101,32,115,112,101,99,39,115,10,32, + 32,32,32,108,111,97,100,101,114,46,10,10,32,32,32,32, + 96,110,97,109,101,96,32,105,115,32,116,104,101,32,97,98, + 115,111,108,117,116,101,32,110,97,109,101,32,111,102,32,116, + 104,101,32,109,111,100,117,108,101,46,32,32,96,108,111,97, + 100,101,114,96,32,105,115,32,116,104,101,32,108,111,97,100, + 101,114,10,32,32,32,32,116,111,32,117,115,101,32,119,104, + 101,110,32,108,111,97,100,105,110,103,32,116,104,101,32,109, + 111,100,117,108,101,46,32,32,96,112,97,114,101,110,116,96, + 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, + 116,104,101,10,32,32,32,32,112,97,99,107,97,103,101,32, + 116,104,101,32,109,111,100,117,108,101,32,105,115,32,105,110, + 46,32,32,84,104,101,32,112,97,114,101,110,116,32,105,115, + 32,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104, + 101,32,110,97,109,101,46,10,10,32,32,32,32,96,105,115, + 95,112,97,99,107,97,103,101,96,32,100,101,116,101,114,109, + 105,110,101,115,32,105,102,32,116,104,101,32,109,111,100,117, + 108,101,32,105,115,32,99,111,110,115,105,100,101,114,101,100, + 32,97,32,112,97,99,107,97,103,101,32,111,114,10,32,32, + 32,32,110,111,116,46,32,32,79,110,32,109,111,100,117,108, + 101,115,32,116,104,105,115,32,105,115,32,114,101,102,108,101, + 99,116,101,100,32,98,121,32,116,104,101,32,96,95,95,112, + 97,116,104,95,95,96,32,97,116,116,114,105,98,117,116,101, + 46,10,10,32,32,32,32,96,111,114,105,103,105,110,96,32, + 105,115,32,116,104,101,32,115,112,101,99,105,102,105,99,32, + 108,111,99,97,116,105,111,110,32,117,115,101,100,32,98,121, + 32,116,104,101,32,108,111,97,100,101,114,32,102,114,111,109, + 32,119,104,105,99,104,32,116,111,10,32,32,32,32,108,111, + 97,100,32,116,104,101,32,109,111,100,117,108,101,44,32,105, + 102,32,116,104,97,116,32,105,110,102,111,114,109,97,116,105, + 111,110,32,105,115,32,97,118,97,105,108,97,98,108,101,46, + 32,32,87,104,101,110,32,102,105,108,101,110,97,109,101,32, + 105,115,10,32,32,32,32,115,101,116,44,32,111,114,105,103, + 105,110,32,119,105,108,108,32,109,97,116,99,104,46,10,10, + 32,32,32,32,96,104,97,115,95,108,111,99,97,116,105,111, + 110,96,32,105,110,100,105,99,97,116,101,115,32,116,104,97, + 116,32,97,32,115,112,101,99,39,115,32,34,111,114,105,103, + 105,110,34,32,114,101,102,108,101,99,116,115,32,97,32,108, + 111,99,97,116,105,111,110,46,10,32,32,32,32,87,104,101, + 110,32,116,104,105,115,32,105,115,32,84,114,117,101,44,32, + 96,95,95,102,105,108,101,95,95,96,32,97,116,116,114,105, + 98,117,116,101,32,111,102,32,116,104,101,32,109,111,100,117, + 108,101,32,105,115,32,115,101,116,46,10,10,32,32,32,32, + 96,99,97,99,104,101,100,96,32,105,115,32,116,104,101,32, + 108,111,99,97,116,105,111,110,32,111,102,32,116,104,101,32, + 99,97,99,104,101,100,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,44,32,105,102,32,97,110,121,46,32,32,73, + 116,10,32,32,32,32,99,111,114,114,101,115,112,111,110,100, + 115,32,116,111,32,116,104,101,32,96,95,95,99,97,99,104, + 101,100,95,95,96,32,97,116,116,114,105,98,117,116,101,46, + 10,10,32,32,32,32,96,115,117,98,109,111,100,117,108,101, + 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, + 115,96,32,105,115,32,116,104,101,32,115,101,113,117,101,110, + 99,101,32,111,102,32,112,97,116,104,32,101,110,116,114,105, + 101,115,32,116,111,10,32,32,32,32,115,101,97,114,99,104, + 32,119,104,101,110,32,105,109,112,111,114,116,105,110,103,32, + 115,117,98,109,111,100,117,108,101,115,46,32,32,73,102,32, + 115,101,116,44,32,105,115,95,112,97,99,107,97,103,101,32, + 115,104,111,117,108,100,32,98,101,10,32,32,32,32,84,114, + 117,101,45,45,97,110,100,32,70,97,108,115,101,32,111,116, + 104,101,114,119,105,115,101,46,10,10,32,32,32,32,80,97, + 99,107,97,103,101,115,32,97,114,101,32,115,105,109,112,108, + 121,32,109,111,100,117,108,101,115,32,116,104,97,116,32,40, + 109,97,121,41,32,104,97,118,101,32,115,117,98,109,111,100, + 117,108,101,115,46,32,32,73,102,32,97,32,115,112,101,99, + 10,32,32,32,32,104,97,115,32,97,32,110,111,110,45,78, + 111,110,101,32,118,97,108,117,101,32,105,110,32,96,115,117, + 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, + 111,99,97,116,105,111,110,115,96,44,32,116,104,101,32,105, + 109,112,111,114,116,10,32,32,32,32,115,121,115,116,101,109, + 32,119,105,108,108,32,99,111,110,115,105,100,101,114,32,109, + 111,100,117,108,101,115,32,108,111,97,100,101,100,32,102,114, + 111,109,32,116,104,101,32,115,112,101,99,32,97,115,32,112, + 97,99,107,97,103,101,115,46,10,10,32,32,32,32,79,110, + 108,121,32,102,105,110,100,101,114,115,32,40,115,101,101,32, + 105,109,112,111,114,116,108,105,98,46,97,98,99,46,77,101, + 116,97,80,97,116,104,70,105,110,100,101,114,32,97,110,100, + 10,32,32,32,32,105,109,112,111,114,116,108,105,98,46,97, + 98,99,46,80,97,116,104,69,110,116,114,121,70,105,110,100, + 101,114,41,32,115,104,111,117,108,100,32,109,111,100,105,102, + 121,32,77,111,100,117,108,101,83,112,101,99,32,105,110,115, + 116,97,110,99,101,115,46,10,10,32,32,32,32,78,41,3, + 218,6,111,114,105,103,105,110,218,12,108,111,97,100,101,114, + 95,115,116,97,116,101,218,10,105,115,95,112,97,99,107,97, + 103,101,99,3,0,0,0,0,0,0,0,3,0,0,0,6, + 0,0,0,2,0,0,0,67,0,0,0,115,54,0,0,0, + 124,1,124,0,95,0,124,2,124,0,95,1,124,3,124,0, + 95,2,124,4,124,0,95,3,124,5,114,32,103,0,110,2, + 100,0,124,0,95,4,100,1,124,0,95,5,100,0,124,0, + 95,6,100,0,83,0,41,2,78,70,41,7,114,20,0,0, + 0,114,122,0,0,0,114,126,0,0,0,114,127,0,0,0, + 218,26,115,117,98,109,111,100,117,108,101,95,115,101,97,114, + 99,104,95,108,111,99,97,116,105,111,110,115,218,13,95,115, + 101,116,95,102,105,108,101,97,116,116,114,218,7,95,99,97, + 99,104,101,100,41,6,114,33,0,0,0,114,20,0,0,0, + 114,122,0,0,0,114,126,0,0,0,114,127,0,0,0,114, + 128,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,34,0,0,0,111,1,0,0,115,16,0,0, + 0,6,2,6,1,6,1,6,1,14,1,6,3,10,1,255, + 128,122,19,77,111,100,117,108,101,83,112,101,99,46,95,95, + 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,6,0,0,0,67,0,0,0,115, + 102,0,0,0,100,1,160,0,124,0,106,1,161,1,100,2, + 160,0,124,0,106,2,161,1,103,2,125,1,124,0,106,3, + 100,0,117,1,114,52,124,1,160,4,100,3,160,0,124,0, + 106,3,161,1,161,1,1,0,124,0,106,5,100,0,117,1, + 114,80,124,1,160,4,100,4,160,0,124,0,106,5,161,1, + 161,1,1,0,100,5,160,0,124,0,106,6,106,7,100,6, + 160,8,124,1,161,1,161,2,83,0,41,7,78,122,9,110, + 97,109,101,61,123,33,114,125,122,11,108,111,97,100,101,114, + 61,123,33,114,125,122,11,111,114,105,103,105,110,61,123,33, + 114,125,122,29,115,117,98,109,111,100,117,108,101,95,115,101, + 97,114,99,104,95,108,111,99,97,116,105,111,110,115,61,123, + 125,122,6,123,125,40,123,125,41,122,2,44,32,41,9,114, + 50,0,0,0,114,20,0,0,0,114,122,0,0,0,114,126, + 0,0,0,218,6,97,112,112,101,110,100,114,129,0,0,0, + 218,9,95,95,99,108,97,115,115,95,95,114,9,0,0,0, + 218,4,106,111,105,110,41,2,114,33,0,0,0,114,62,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,53,0,0,0,123,1,0,0,115,22,0,0,0,10, + 1,10,1,4,255,10,2,18,1,10,1,8,1,4,1,6, + 255,22,2,255,128,122,19,77,111,100,117,108,101,83,112,101, + 99,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,102,0,0,0,124,0,106,0,125,2,122,72, + 124,0,106,1,124,1,106,1,107,2,111,76,124,0,106,2, + 124,1,106,2,107,2,111,76,124,0,106,3,124,1,106,3, + 107,2,111,76,124,2,124,1,106,0,107,2,111,76,124,0, + 106,4,124,1,106,4,107,2,111,76,124,0,106,5,124,1, + 106,5,107,2,87,0,83,0,4,0,116,6,121,100,1,0, + 1,0,1,0,116,7,6,0,89,0,83,0,119,0,114,0, + 0,0,0,41,8,114,129,0,0,0,114,20,0,0,0,114, + 122,0,0,0,114,126,0,0,0,218,6,99,97,99,104,101, + 100,218,12,104,97,115,95,108,111,99,97,116,105,111,110,114, + 2,0,0,0,218,14,78,111,116,73,109,112,108,101,109,101, + 110,116,101,100,41,3,114,33,0,0,0,90,5,111,116,104, + 101,114,90,4,115,109,115,108,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,6,95,95,101,113,95,95,133, + 1,0,0,115,34,0,0,0,6,1,2,1,12,1,10,1, + 2,255,10,2,2,254,8,3,2,253,10,4,2,252,10,5, + 4,251,12,6,8,1,2,255,255,128,122,17,77,111,100,117, + 108,101,83,112,101,99,46,95,95,101,113,95,95,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,58,0,0,0,124,0,106,0,100, + 0,117,0,114,52,124,0,106,1,100,0,117,1,114,52,124, + 0,106,2,114,52,116,3,100,0,117,0,114,38,116,4,130, + 1,116,3,160,5,124,0,106,1,161,1,124,0,95,0,124, + 0,106,0,83,0,114,0,0,0,0,41,6,114,131,0,0, + 0,114,126,0,0,0,114,130,0,0,0,218,19,95,98,111, + 111,116,115,116,114,97,112,95,101,120,116,101,114,110,97,108, + 218,19,78,111,116,73,109,112,108,101,109,101,110,116,101,100, + 69,114,114,111,114,90,11,95,103,101,116,95,99,97,99,104, + 101,100,114,52,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,135,0,0,0,145,1,0,0,115, + 14,0,0,0,10,2,16,1,8,1,4,1,14,1,6,1, + 255,128,122,17,77,111,100,117,108,101,83,112,101,99,46,99, + 97,99,104,101,100,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,10, + 0,0,0,124,1,124,0,95,0,100,0,83,0,114,0,0, + 0,0,41,1,114,131,0,0,0,41,2,114,33,0,0,0, + 114,135,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,135,0,0,0,154,1,0,0,115,4,0, + 0,0,10,2,255,128,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 32,0,0,0,124,0,106,0,100,1,117,0,114,26,124,0, + 106,1,160,2,100,2,161,1,100,3,25,0,83,0,124,0, + 106,1,83,0,41,4,122,32,84,104,101,32,110,97,109,101, + 32,111,102,32,116,104,101,32,109,111,100,117,108,101,39,115, + 32,112,97,114,101,110,116,46,78,218,1,46,114,25,0,0, + 0,41,3,114,129,0,0,0,114,20,0,0,0,218,10,114, + 112,97,114,116,105,116,105,111,110,114,52,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,6,112, + 97,114,101,110,116,158,1,0,0,115,8,0,0,0,10,3, + 16,1,6,2,255,128,122,17,77,111,100,117,108,101,83,112, + 101,99,46,112,97,114,101,110,116,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,1,0,0,0,67,0, + 0,0,115,6,0,0,0,124,0,106,0,83,0,114,0,0, + 0,0,41,1,114,130,0,0,0,114,52,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,136,0, + 0,0,166,1,0,0,115,4,0,0,0,6,2,255,128,122, + 23,77,111,100,117,108,101,83,112,101,99,46,104,97,115,95, + 108,111,99,97,116,105,111,110,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,115,14,0,0,0,116,0,124,1,131,1,124,0,95,1, + 100,0,83,0,114,0,0,0,0,41,2,218,4,98,111,111, + 108,114,130,0,0,0,41,2,114,33,0,0,0,218,5,118, + 97,108,117,101,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,136,0,0,0,170,1,0,0,115,4,0,0, + 0,14,2,255,128,41,12,114,9,0,0,0,114,8,0,0, + 0,114,1,0,0,0,114,10,0,0,0,114,34,0,0,0, + 114,53,0,0,0,114,138,0,0,0,218,8,112,114,111,112, + 101,114,116,121,114,135,0,0,0,218,6,115,101,116,116,101, + 114,114,143,0,0,0,114,136,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 125,0,0,0,74,1,0,0,115,36,0,0,0,8,0,4, + 1,4,36,2,1,12,255,8,12,8,10,2,12,10,1,4, + 8,10,1,2,3,10,1,2,7,10,1,4,3,14,1,255, + 128,114,125,0,0,0,169,2,114,126,0,0,0,114,128,0, + 0,0,99,2,0,0,0,0,0,0,0,2,0,0,0,6, + 0,0,0,8,0,0,0,67,0,0,0,115,150,0,0,0, + 116,0,124,1,100,1,131,2,114,74,116,1,100,2,117,0, + 114,22,116,2,130,1,116,1,106,3,125,4,124,3,100,2, + 117,0,114,48,124,4,124,0,124,1,100,3,141,2,83,0, + 124,3,114,56,103,0,110,2,100,2,125,5,124,4,124,0, + 124,1,124,5,100,4,141,3,83,0,124,3,100,2,117,0, + 114,132,116,0,124,1,100,5,131,2,114,128,122,14,124,1, + 160,4,124,0,161,1,125,3,87,0,110,24,4,0,116,5, + 121,148,1,0,1,0,1,0,100,2,125,3,89,0,110,4, + 100,6,125,3,116,6,124,0,124,1,124,2,124,3,100,7, + 141,4,83,0,119,0,41,8,122,53,82,101,116,117,114,110, + 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, + 97,115,101,100,32,111,110,32,118,97,114,105,111,117,115,32, + 108,111,97,100,101,114,32,109,101,116,104,111,100,115,46,90, + 12,103,101,116,95,102,105,108,101,110,97,109,101,78,41,1, + 114,122,0,0,0,41,2,114,122,0,0,0,114,129,0,0, + 0,114,128,0,0,0,70,114,148,0,0,0,41,7,114,11, + 0,0,0,114,139,0,0,0,114,140,0,0,0,218,23,115, + 112,101,99,95,102,114,111,109,95,102,105,108,101,95,108,111, + 99,97,116,105,111,110,114,128,0,0,0,114,87,0,0,0, + 114,125,0,0,0,41,6,114,20,0,0,0,114,122,0,0, + 0,114,126,0,0,0,114,128,0,0,0,114,149,0,0,0, + 90,6,115,101,97,114,99,104,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,104,0,0,0,175,1,0,0, + 115,40,0,0,0,10,2,8,1,4,1,6,1,8,2,12, + 1,12,1,6,1,2,1,6,255,8,3,10,1,2,1,14, + 1,12,1,8,1,4,3,16,2,2,250,255,128,114,104,0, + 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,8, + 0,0,0,8,0,0,0,67,0,0,0,115,44,1,0,0, + 122,10,124,0,106,0,125,3,87,0,110,18,4,0,116,1, + 144,1,121,42,1,0,1,0,1,0,89,0,110,12,124,3, + 100,0,117,1,114,42,124,3,83,0,124,0,106,2,125,4, + 124,1,100,0,117,0,114,84,122,10,124,0,106,3,125,1, + 87,0,110,16,4,0,116,1,144,1,121,40,1,0,1,0, + 1,0,89,0,122,10,124,0,106,4,125,5,87,0,110,20, + 4,0,116,1,144,1,121,38,1,0,1,0,1,0,100,0, + 125,5,89,0,124,2,100,0,117,0,114,170,124,5,100,0, + 117,0,114,166,122,10,124,1,106,5,125,2,87,0,110,26, + 4,0,116,1,144,1,121,36,1,0,1,0,1,0,100,0, + 125,2,89,0,110,4,124,5,125,2,122,10,124,0,106,6, + 125,6,87,0,110,20,4,0,116,1,144,1,121,34,1,0, + 1,0,1,0,100,0,125,6,89,0,122,14,116,7,124,0, + 106,8,131,1,125,7,87,0,110,20,4,0,116,1,144,1, + 121,32,1,0,1,0,1,0,100,0,125,7,89,0,116,9, + 124,4,124,1,124,2,100,1,141,3,125,3,124,5,100,0, + 117,0,144,1,114,10,100,2,110,2,100,3,124,3,95,10, + 124,6,124,3,95,11,124,7,124,3,95,12,124,3,83,0, + 119,0,119,0,119,0,119,0,119,0,119,0,41,4,78,169, + 1,114,126,0,0,0,70,84,41,13,114,119,0,0,0,114, + 2,0,0,0,114,9,0,0,0,114,112,0,0,0,114,121, + 0,0,0,218,7,95,79,82,73,71,73,78,218,10,95,95, + 99,97,99,104,101,100,95,95,218,4,108,105,115,116,218,8, + 95,95,112,97,116,104,95,95,114,125,0,0,0,114,130,0, + 0,0,114,135,0,0,0,114,129,0,0,0,41,8,114,110, + 0,0,0,114,122,0,0,0,114,126,0,0,0,114,109,0, + 0,0,114,20,0,0,0,90,8,108,111,99,97,116,105,111, + 110,114,135,0,0,0,114,129,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,17,95,115,112,101, + 99,95,102,114,111,109,95,109,111,100,117,108,101,201,1,0, + 0,115,86,0,0,0,2,2,10,1,14,1,4,1,8,2, + 4,1,6,2,8,1,2,1,10,1,14,1,2,2,2,1, + 10,1,14,1,6,1,8,1,8,1,2,1,10,1,14,1, + 8,1,4,2,2,1,10,1,14,1,6,1,2,1,14,1, + 14,1,6,1,14,2,20,1,6,1,6,1,4,1,2,249, + 2,252,2,250,2,250,2,251,2,246,255,128,114,155,0,0, + 0,70,169,1,218,8,111,118,101,114,114,105,100,101,99,2, + 0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,8, + 0,0,0,67,0,0,0,115,210,1,0,0,124,2,115,20, + 116,0,124,1,100,1,100,0,131,3,100,0,117,0,114,50, + 122,12,124,0,106,1,124,1,95,2,87,0,110,16,4,0, + 116,3,144,1,121,208,1,0,1,0,1,0,89,0,124,2, + 115,70,116,0,124,1,100,2,100,0,131,3,100,0,117,0, + 114,170,124,0,106,4,125,3,124,3,100,0,117,0,114,142, + 124,0,106,5,100,0,117,1,114,142,116,6,100,0,117,0, + 114,106,116,7,130,1,116,6,106,8,125,4,124,4,160,9, + 124,4,161,1,125,3,124,0,106,5,124,3,95,10,124,3, + 124,0,95,4,100,0,124,1,95,11,122,10,124,3,124,1, + 95,12,87,0,110,16,4,0,116,3,144,1,121,206,1,0, + 1,0,1,0,89,0,124,2,115,190,116,0,124,1,100,3, + 100,0,131,3,100,0,117,0,114,220,122,12,124,0,106,13, + 124,1,95,14,87,0,110,16,4,0,116,3,144,1,121,204, + 1,0,1,0,1,0,89,0,122,10,124,0,124,1,95,15, + 87,0,110,16,4,0,116,3,144,1,121,202,1,0,1,0, + 1,0,89,0,124,2,144,1,115,16,116,0,124,1,100,4, + 100,0,131,3,100,0,117,0,144,1,114,58,124,0,106,5, + 100,0,117,1,144,1,114,58,122,12,124,0,106,5,124,1, + 95,16,87,0,110,16,4,0,116,3,144,1,121,200,1,0, + 1,0,1,0,89,0,124,0,106,17,144,1,114,192,124,2, + 144,1,115,90,116,0,124,1,100,5,100,0,131,3,100,0, + 117,0,144,1,114,120,122,12,124,0,106,18,124,1,95,11, + 87,0,110,16,4,0,116,3,144,1,121,198,1,0,1,0, + 1,0,89,0,124,2,144,1,115,144,116,0,124,1,100,6, + 100,0,131,3,100,0,117,0,144,1,114,192,124,0,106,19, + 100,0,117,1,144,1,114,192,122,14,124,0,106,19,124,1, + 95,20,87,0,124,1,83,0,4,0,116,3,144,1,121,196, + 1,0,1,0,1,0,89,0,124,1,83,0,124,1,83,0, + 119,0,119,0,119,0,119,0,119,0,119,0,119,0,41,7, + 78,114,9,0,0,0,114,112,0,0,0,218,11,95,95,112, + 97,99,107,97,103,101,95,95,114,154,0,0,0,114,121,0, + 0,0,114,152,0,0,0,41,21,114,13,0,0,0,114,20, + 0,0,0,114,9,0,0,0,114,2,0,0,0,114,122,0, + 0,0,114,129,0,0,0,114,139,0,0,0,114,140,0,0, + 0,218,16,95,78,97,109,101,115,112,97,99,101,76,111,97, + 100,101,114,218,7,95,95,110,101,119,95,95,90,5,95,112, + 97,116,104,114,121,0,0,0,114,112,0,0,0,114,143,0, + 0,0,114,158,0,0,0,114,119,0,0,0,114,154,0,0, + 0,114,136,0,0,0,114,126,0,0,0,114,135,0,0,0, + 114,152,0,0,0,41,5,114,109,0,0,0,114,110,0,0, + 0,114,157,0,0,0,114,122,0,0,0,114,159,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 18,95,105,110,105,116,95,109,111,100,117,108,101,95,97,116, + 116,114,115,246,1,0,0,115,114,0,0,0,20,4,2,1, + 12,1,14,1,2,1,20,2,6,1,8,1,10,2,8,1, + 4,1,6,1,10,2,8,1,6,1,6,11,2,1,10,1, + 14,1,2,1,20,2,2,1,12,1,14,1,2,1,2,2, + 10,1,14,1,2,1,24,2,12,1,2,1,12,1,14,1, + 2,1,8,2,24,1,2,1,12,1,14,1,2,1,24,2, + 12,1,2,1,10,1,4,3,14,254,2,1,8,1,2,254, + 2,249,2,249,2,249,2,251,2,250,2,228,255,128,114,161, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,82,0,0, + 0,100,1,125,1,116,0,124,0,106,1,100,2,131,2,114, + 30,124,0,106,1,160,2,124,0,161,1,125,1,110,20,116, + 0,124,0,106,1,100,3,131,2,114,50,116,3,100,4,131, + 1,130,1,124,1,100,1,117,0,114,68,116,4,124,0,106, + 5,131,1,125,1,116,6,124,0,124,1,131,2,1,0,124, + 1,83,0,41,5,122,43,67,114,101,97,116,101,32,97,32, + 109,111,100,117,108,101,32,98,97,115,101,100,32,111,110,32, + 116,104,101,32,112,114,111,118,105,100,101,100,32,115,112,101, + 99,46,78,218,13,99,114,101,97,116,101,95,109,111,100,117, + 108,101,218,11,101,120,101,99,95,109,111,100,117,108,101,122, + 66,108,111,97,100,101,114,115,32,116,104,97,116,32,100,101, + 102,105,110,101,32,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,109,117,115,116,32,97,108,115,111,32,100,101,102, + 105,110,101,32,99,114,101,97,116,101,95,109,111,100,117,108, + 101,40,41,41,7,114,11,0,0,0,114,122,0,0,0,114, + 162,0,0,0,114,87,0,0,0,114,21,0,0,0,114,20, + 0,0,0,114,161,0,0,0,169,2,114,109,0,0,0,114, + 110,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,16,109,111,100,117,108,101,95,102,114,111,109, + 95,115,112,101,99,62,2,0,0,115,20,0,0,0,4,3, + 12,1,14,3,12,1,8,1,8,2,10,1,10,1,4,1, + 255,128,114,165,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,4,0,0,0,67,0,0,0, + 115,100,0,0,0,124,0,106,0,100,1,117,0,114,14,100, + 2,110,4,124,0,106,0,125,1,124,0,106,1,100,1,117, + 0,114,64,124,0,106,2,100,1,117,0,114,50,100,3,160, + 3,124,1,161,1,83,0,100,4,160,3,124,1,124,0,106, + 2,161,2,83,0,124,0,106,4,114,84,100,5,160,3,124, + 1,124,0,106,1,161,2,83,0,100,6,160,3,124,0,106, + 0,124,0,106,1,161,2,83,0,41,7,122,38,82,101,116, + 117,114,110,32,116,104,101,32,114,101,112,114,32,116,111,32, + 117,115,101,32,102,111,114,32,116,104,101,32,109,111,100,117, + 108,101,46,78,114,114,0,0,0,114,115,0,0,0,114,116, + 0,0,0,114,117,0,0,0,250,18,60,109,111,100,117,108, + 101,32,123,33,114,125,32,40,123,125,41,62,41,5,114,20, + 0,0,0,114,126,0,0,0,114,122,0,0,0,114,50,0, + 0,0,114,136,0,0,0,41,2,114,109,0,0,0,114,20, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,25,95,108,111,97,100,95,98,97,99,107,119,97, - 114,100,95,99,111,109,112,97,116,105,98,108,101,126,2,0, - 0,115,66,0,0,0,2,3,18,1,6,1,12,1,14,1, - 12,1,2,1,14,3,12,1,16,1,2,1,12,1,14,1, - 2,1,16,1,2,1,8,4,10,1,18,1,4,128,14,1, - 2,1,18,1,2,1,8,1,4,3,14,254,2,1,8,1, - 2,254,2,251,2,246,255,128,114,166,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,11,0, - 0,0,67,0,0,0,115,242,0,0,0,124,0,106,0,100, - 0,117,1,114,58,116,1,124,0,106,0,100,1,131,2,115, - 58,116,2,124,0,106,0,131,1,155,0,100,2,157,2,125, - 1,116,3,160,4,124,1,116,5,161,2,1,0,116,6,124, - 0,131,1,83,0,116,7,124,0,131,1,125,2,100,3,124, - 0,95,8,122,158,124,2,116,9,106,10,124,0,106,11,60, - 0,122,52,124,0,106,0,100,0,117,0,114,124,124,0,106, - 12,100,0,117,0,114,122,116,13,100,4,124,0,106,11,100, - 5,141,2,130,1,110,12,124,0,106,0,160,14,124,2,161, - 1,1,0,87,0,110,38,1,0,1,0,1,0,122,14,116, - 9,106,10,124,0,106,11,61,0,87,0,130,0,4,0,116, - 15,121,240,1,0,1,0,1,0,89,0,130,0,116,9,106, - 10,160,16,124,0,106,11,161,1,125,2,124,2,116,9,106, - 10,124,0,106,11,60,0,116,17,100,6,124,0,106,11,124, - 0,106,0,131,3,1,0,87,0,100,7,124,0,95,8,124, - 2,83,0,100,7,124,0,95,8,119,0,119,0,41,8,78, - 114,157,0,0,0,114,162,0,0,0,84,114,161,0,0,0, - 114,19,0,0,0,122,18,105,109,112,111,114,116,32,123,33, - 114,125,32,35,32,123,33,114,125,70,41,18,114,116,0,0, - 0,114,11,0,0,0,114,7,0,0,0,114,95,0,0,0, - 114,96,0,0,0,114,163,0,0,0,114,166,0,0,0,114, - 159,0,0,0,90,13,95,105,110,105,116,105,97,108,105,122, - 105,110,103,114,18,0,0,0,114,99,0,0,0,114,20,0, - 0,0,114,123,0,0,0,114,83,0,0,0,114,157,0,0, - 0,114,67,0,0,0,114,165,0,0,0,114,80,0,0,0, - 41,3,114,103,0,0,0,114,102,0,0,0,114,104,0,0, + 0,0,114,120,0,0,0,79,2,0,0,115,18,0,0,0, + 20,3,10,1,10,1,10,1,14,2,6,2,14,1,16,2, + 255,128,114,120,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,10,0,0,0,67,0,0,0, + 115,26,1,0,0,124,0,106,0,125,2,116,1,124,2,131, + 1,143,246,1,0,116,2,106,3,160,4,124,2,161,1,124, + 1,117,1,114,54,100,1,160,5,124,2,161,1,125,3,116, + 6,124,3,124,2,100,2,141,2,130,1,122,160,124,0,106, + 7,100,3,117,0,114,106,124,0,106,8,100,3,117,0,114, + 90,116,6,100,4,124,0,106,0,100,2,141,2,130,1,116, + 9,124,0,124,1,100,5,100,6,141,3,1,0,110,80,116, + 9,124,0,124,1,100,5,100,6,141,3,1,0,116,10,124, + 0,106,7,100,7,131,2,115,174,116,11,124,0,106,7,131, + 1,155,0,100,8,157,2,125,3,116,12,160,13,124,3,116, + 14,161,2,1,0,124,0,106,7,160,15,124,2,161,1,1, + 0,110,12,124,0,106,7,160,16,124,1,161,1,1,0,87, + 0,116,2,106,3,160,17,124,0,106,0,161,1,125,1,124, + 1,116,2,106,3,124,0,106,0,60,0,110,28,116,2,106, + 3,160,17,124,0,106,0,161,1,125,1,124,1,116,2,106, + 3,124,0,106,0,60,0,119,0,87,0,100,3,4,0,4, + 0,131,3,1,0,124,1,83,0,49,0,144,1,115,12,119, + 1,1,0,1,0,1,0,89,0,1,0,124,1,83,0,41, + 9,122,70,69,120,101,99,117,116,101,32,116,104,101,32,115, + 112,101,99,39,115,32,115,112,101,99,105,102,105,101,100,32, + 109,111,100,117,108,101,32,105,110,32,97,110,32,101,120,105, + 115,116,105,110,103,32,109,111,100,117,108,101,39,115,32,110, + 97,109,101,115,112,97,99,101,46,122,30,109,111,100,117,108, + 101,32,123,33,114,125,32,110,111,116,32,105,110,32,115,121, + 115,46,109,111,100,117,108,101,115,114,19,0,0,0,78,250, + 14,109,105,115,115,105,110,103,32,108,111,97,100,101,114,84, + 114,156,0,0,0,114,163,0,0,0,250,55,46,101,120,101, + 99,95,109,111,100,117,108,101,40,41,32,110,111,116,32,102, + 111,117,110,100,59,32,102,97,108,108,105,110,103,32,98,97, + 99,107,32,116,111,32,108,111,97,100,95,109,111,100,117,108, + 101,40,41,41,18,114,20,0,0,0,114,57,0,0,0,114, + 18,0,0,0,114,105,0,0,0,114,38,0,0,0,114,50, + 0,0,0,114,87,0,0,0,114,122,0,0,0,114,129,0, + 0,0,114,161,0,0,0,114,11,0,0,0,114,7,0,0, + 0,114,101,0,0,0,114,102,0,0,0,218,13,73,109,112, + 111,114,116,87,97,114,110,105,110,103,218,11,108,111,97,100, + 95,109,111,100,117,108,101,114,163,0,0,0,218,3,112,111, + 112,41,4,114,109,0,0,0,114,110,0,0,0,114,20,0, + 0,0,114,108,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,106,0,0,0,96,2,0,0,115, + 50,0,0,0,6,2,10,1,16,1,10,1,12,1,2,1, + 10,1,10,1,14,1,16,2,14,2,12,1,16,1,12,2, + 14,1,12,2,2,128,14,4,14,1,14,255,26,1,4,1, + 18,128,4,0,255,128,114,106,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,8,0,0,0, + 67,0,0,0,115,18,1,0,0,122,18,124,0,106,0,160, + 1,124,0,106,2,161,1,1,0,87,0,110,46,1,0,1, + 0,1,0,124,0,106,2,116,3,106,4,118,0,114,64,116, + 3,106,4,160,5,124,0,106,2,161,1,125,1,124,1,116, + 3,106,4,124,0,106,2,60,0,130,0,116,3,106,4,160, + 5,124,0,106,2,161,1,125,1,124,1,116,3,106,4,124, + 0,106,2,60,0,116,6,124,1,100,1,100,0,131,3,100, + 0,117,0,114,138,122,12,124,0,106,0,124,1,95,7,87, + 0,110,16,4,0,116,8,144,1,121,16,1,0,1,0,1, + 0,89,0,116,6,124,1,100,2,100,0,131,3,100,0,117, + 0,114,212,122,40,124,1,106,9,124,1,95,10,116,11,124, + 1,100,3,131,2,115,192,124,0,106,2,160,12,100,4,161, + 1,100,5,25,0,124,1,95,10,87,0,110,16,4,0,116, + 8,144,1,121,14,1,0,1,0,1,0,89,0,116,6,124, + 1,100,6,100,0,131,3,100,0,117,0,144,1,114,8,122, + 12,124,0,124,1,95,13,87,0,124,1,83,0,4,0,116, + 8,144,1,121,12,1,0,1,0,1,0,89,0,124,1,83, + 0,124,1,83,0,119,0,119,0,119,0,41,7,78,114,112, + 0,0,0,114,158,0,0,0,114,154,0,0,0,114,141,0, + 0,0,114,25,0,0,0,114,119,0,0,0,41,14,114,122, + 0,0,0,114,170,0,0,0,114,20,0,0,0,114,18,0, + 0,0,114,105,0,0,0,114,171,0,0,0,114,13,0,0, + 0,114,112,0,0,0,114,2,0,0,0,114,9,0,0,0, + 114,158,0,0,0,114,11,0,0,0,114,142,0,0,0,114, + 119,0,0,0,114,164,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,25,95,108,111,97,100,95, + 98,97,99,107,119,97,114,100,95,99,111,109,112,97,116,105, + 98,108,101,126,2,0,0,115,66,0,0,0,2,3,18,1, + 6,1,12,1,14,1,12,1,2,1,14,3,12,1,16,1, + 2,1,12,1,14,1,2,1,16,1,2,1,8,4,10,1, + 18,1,4,128,14,1,2,1,18,1,2,1,8,1,4,3, + 14,254,2,1,8,1,2,254,2,251,2,246,255,128,114,172, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,11,0,0,0,67,0,0,0,115,242,0,0, + 0,124,0,106,0,100,0,117,1,114,58,116,1,124,0,106, + 0,100,1,131,2,115,58,116,2,124,0,106,0,131,1,155, + 0,100,2,157,2,125,1,116,3,160,4,124,1,116,5,161, + 2,1,0,116,6,124,0,131,1,83,0,116,7,124,0,131, + 1,125,2,100,3,124,0,95,8,122,158,124,2,116,9,106, + 10,124,0,106,11,60,0,122,52,124,0,106,0,100,0,117, + 0,114,124,124,0,106,12,100,0,117,0,114,122,116,13,100, + 4,124,0,106,11,100,5,141,2,130,1,110,12,124,0,106, + 0,160,14,124,2,161,1,1,0,87,0,110,38,1,0,1, + 0,1,0,122,14,116,9,106,10,124,0,106,11,61,0,87, + 0,130,0,4,0,116,15,121,240,1,0,1,0,1,0,89, + 0,130,0,116,9,106,10,160,16,124,0,106,11,161,1,125, + 2,124,2,116,9,106,10,124,0,106,11,60,0,116,17,100, + 6,124,0,106,11,124,0,106,0,131,3,1,0,87,0,100, + 7,124,0,95,8,124,2,83,0,100,7,124,0,95,8,119, + 0,119,0,41,8,78,114,163,0,0,0,114,168,0,0,0, + 84,114,167,0,0,0,114,19,0,0,0,122,18,105,109,112, + 111,114,116,32,123,33,114,125,32,35,32,123,33,114,125,70, + 41,18,114,122,0,0,0,114,11,0,0,0,114,7,0,0, + 0,114,101,0,0,0,114,102,0,0,0,114,169,0,0,0, + 114,172,0,0,0,114,165,0,0,0,90,13,95,105,110,105, + 116,105,97,108,105,122,105,110,103,114,18,0,0,0,114,105, + 0,0,0,114,20,0,0,0,114,129,0,0,0,114,87,0, + 0,0,114,163,0,0,0,114,70,0,0,0,114,171,0,0, + 0,114,83,0,0,0,41,3,114,109,0,0,0,114,108,0, + 0,0,114,110,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,14,95,108,111,97,100,95,117,110, + 108,111,99,107,101,100,162,2,0,0,115,62,0,0,0,10, + 2,12,2,16,1,12,2,8,1,8,2,6,5,2,1,12, + 1,2,1,10,1,10,1,14,1,2,255,12,4,4,128,6, + 1,2,1,12,1,2,3,12,254,2,1,2,1,14,5,12, + 1,18,1,6,2,4,2,8,254,2,245,255,128,114,173,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,8,0,0,0,67,0,0,0,115,54,0,0,0, + 116,0,124,0,106,1,131,1,143,24,1,0,116,2,124,0, + 131,1,87,0,2,0,100,1,4,0,4,0,131,3,1,0, + 83,0,49,0,115,40,119,1,1,0,1,0,1,0,89,0, + 1,0,100,1,83,0,41,2,122,191,82,101,116,117,114,110, + 32,97,32,110,101,119,32,109,111,100,117,108,101,32,111,98, + 106,101,99,116,44,32,108,111,97,100,101,100,32,98,121,32, + 116,104,101,32,115,112,101,99,39,115,32,108,111,97,100,101, + 114,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,97,100,100,101,100,32, + 116,111,32,105,116,115,32,112,97,114,101,110,116,46,10,10, + 32,32,32,32,73,102,32,97,32,109,111,100,117,108,101,32, + 105,115,32,97,108,114,101,97,100,121,32,105,110,32,115,121, + 115,46,109,111,100,117,108,101,115,44,32,116,104,97,116,32, + 101,120,105,115,116,105,110,103,32,109,111,100,117,108,101,32, + 103,101,116,115,10,32,32,32,32,99,108,111,98,98,101,114, + 101,100,46,10,10,32,32,32,32,78,41,3,114,57,0,0, + 0,114,20,0,0,0,114,173,0,0,0,169,1,114,109,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,107,0,0,0,207,2,0,0,115,8,0,0,0,12, + 9,22,1,20,128,255,128,114,107,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,64,0,0,0,115,140,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,90,4,101,5,100,3,100,4, + 132,0,131,1,90,6,101,7,100,20,100,6,100,7,132,1, + 131,1,90,8,101,7,100,21,100,8,100,9,132,1,131,1, + 90,9,101,5,100,10,100,11,132,0,131,1,90,10,101,5, + 100,12,100,13,132,0,131,1,90,11,101,7,101,12,100,14, + 100,15,132,0,131,1,131,1,90,13,101,7,101,12,100,16, + 100,17,132,0,131,1,131,1,90,14,101,7,101,12,100,18, + 100,19,132,0,131,1,131,1,90,15,101,7,101,16,131,1, + 90,17,100,5,83,0,41,22,218,15,66,117,105,108,116,105, + 110,73,109,112,111,114,116,101,114,122,144,77,101,116,97,32, + 112,97,116,104,32,105,109,112,111,114,116,32,102,111,114,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, + 46,10,10,32,32,32,32,65,108,108,32,109,101,116,104,111, + 100,115,32,97,114,101,32,101,105,116,104,101,114,32,99,108, + 97,115,115,32,111,114,32,115,116,97,116,105,99,32,109,101, + 116,104,111,100,115,32,116,111,32,97,118,111,105,100,32,116, + 104,101,32,110,101,101,100,32,116,111,10,32,32,32,32,105, + 110,115,116,97,110,116,105,97,116,101,32,116,104,101,32,99, + 108,97,115,115,46,10,10,32,32,32,32,122,8,98,117,105, + 108,116,45,105,110,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,5,0,0,0,67,0,0,0,115,22, + 0,0,0,100,1,124,0,106,0,155,2,100,2,116,1,106, + 2,155,0,100,3,157,5,83,0,41,5,250,115,82,101,116, + 117,114,110,32,114,101,112,114,32,102,111,114,32,116,104,101, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, + 32,32,84,104,101,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,84,104,101, + 32,105,109,112,111,114,116,32,109,97,99,104,105,110,101,114, + 121,32,100,111,101,115,32,116,104,101,32,106,111,98,32,105, + 116,115,101,108,102,46,10,10,32,32,32,32,32,32,32,32, + 122,8,60,109,111,100,117,108,101,32,122,2,32,40,122,2, + 41,62,78,41,3,114,9,0,0,0,114,175,0,0,0,114, + 151,0,0,0,169,1,114,110,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,113,0,0,0,233, + 2,0,0,115,4,0,0,0,22,7,255,128,122,27,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,4,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, + 0,0,0,115,42,0,0,0,124,2,100,0,117,1,114,12, + 100,0,83,0,116,0,160,1,124,1,161,1,114,38,116,2, + 124,1,124,0,124,0,106,3,100,1,141,3,83,0,100,0, + 83,0,169,2,78,114,150,0,0,0,41,4,114,64,0,0, + 0,90,10,105,115,95,98,117,105,108,116,105,110,114,104,0, + 0,0,114,151,0,0,0,169,4,218,3,99,108,115,114,89, + 0,0,0,218,4,112,97,116,104,218,6,116,97,114,103,101, + 116,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,9,102,105,110,100,95,115,112,101,99,242,2,0,0,115, + 12,0,0,0,8,2,4,1,10,1,16,1,4,2,255,128, + 122,25,66,117,105,108,116,105,110,73,109,112,111,114,116,101, + 114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, + 67,0,0,0,115,30,0,0,0,124,0,160,0,124,1,124, + 2,161,2,125,3,124,3,100,1,117,1,114,26,124,3,106, + 1,83,0,100,1,83,0,41,2,122,175,70,105,110,100,32, + 116,104,101,32,98,117,105,108,116,45,105,110,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,32,32,32,32,73,102, + 32,39,112,97,116,104,39,32,105,115,32,101,118,101,114,32, + 115,112,101,99,105,102,105,101,100,32,116,104,101,110,32,116, + 104,101,32,115,101,97,114,99,104,32,105,115,32,99,111,110, + 115,105,100,101,114,101,100,32,97,32,102,97,105,108,117,114, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,102,105,110,100, + 95,115,112,101,99,40,41,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,32,32,32,32,78,41,2,114,183,0, + 0,0,114,122,0,0,0,41,4,114,180,0,0,0,114,89, + 0,0,0,114,181,0,0,0,114,109,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,11,102,105, + 110,100,95,109,111,100,117,108,101,251,2,0,0,115,6,0, + 0,0,12,9,18,1,255,128,122,27,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,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,46, + 0,0,0,124,0,106,0,116,1,106,2,118,1,114,34,116, + 3,100,1,160,4,124,0,106,0,161,1,124,0,106,0,100, + 2,141,2,130,1,116,5,116,6,106,7,124,0,131,2,83, + 0,41,4,122,24,67,114,101,97,116,101,32,97,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,114,85,0, + 0,0,114,19,0,0,0,78,41,8,114,20,0,0,0,114, + 18,0,0,0,114,86,0,0,0,114,87,0,0,0,114,50, + 0,0,0,114,74,0,0,0,114,64,0,0,0,90,14,99, + 114,101,97,116,101,95,98,117,105,108,116,105,110,114,174,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,162,0,0,0,7,3,0,0,115,12,0,0,0,12, + 3,12,1,4,1,6,255,12,2,255,128,122,29,66,117,105, + 108,116,105,110,73,109,112,111,114,116,101,114,46,99,114,101, + 97,116,101,95,109,111,100,117,108,101,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, + 0,0,0,115,16,0,0,0,116,0,116,1,106,2,124,0, + 131,2,1,0,100,1,83,0,41,2,122,22,69,120,101,99, + 32,97,32,98,117,105,108,116,45,105,110,32,109,111,100,117, + 108,101,78,41,3,114,74,0,0,0,114,64,0,0,0,90, + 12,101,120,101,99,95,98,117,105,108,116,105,110,114,177,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,163,0,0,0,15,3,0,0,115,4,0,0,0,16, + 3,255,128,122,27,66,117,105,108,116,105,110,73,109,112,111, + 114,116,101,114,46,101,120,101,99,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,243,4,0,0,0,100,1, + 83,0,41,2,122,57,82,101,116,117,114,110,32,78,111,110, + 101,32,97,115,32,98,117,105,108,116,45,105,110,32,109,111, + 100,117,108,101,115,32,100,111,32,110,111,116,32,104,97,118, + 101,32,99,111,100,101,32,111,98,106,101,99,116,115,46,78, + 114,5,0,0,0,169,2,114,180,0,0,0,114,89,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,14,95,108,111,97,100,95,117,110,108,111,99,107,101,100, - 162,2,0,0,115,62,0,0,0,10,2,12,2,16,1,12, - 2,8,1,8,2,6,5,2,1,12,1,2,1,10,1,10, - 1,14,1,2,255,12,4,4,128,6,1,2,1,12,1,2, - 3,12,254,2,1,2,1,14,5,12,1,18,1,6,2,4, - 2,8,254,2,245,255,128,114,167,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,67,0,0,0,115,54,0,0,0,116,0,124,0,106,1, - 131,1,143,24,1,0,116,2,124,0,131,1,87,0,2,0, - 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,40, - 119,1,1,0,1,0,1,0,89,0,1,0,100,1,83,0, - 41,2,122,191,82,101,116,117,114,110,32,97,32,110,101,119, - 32,109,111,100,117,108,101,32,111,98,106,101,99,116,44,32, - 108,111,97,100,101,100,32,98,121,32,116,104,101,32,115,112, - 101,99,39,115,32,108,111,97,100,101,114,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,97,100,100,101,100,32,116,111,32,105,116,115, - 32,112,97,114,101,110,116,46,10,10,32,32,32,32,73,102, - 32,97,32,109,111,100,117,108,101,32,105,115,32,97,108,114, - 101,97,100,121,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,44,32,116,104,97,116,32,101,120,105,115,116,105, - 110,103,32,109,111,100,117,108,101,32,103,101,116,115,10,32, - 32,32,32,99,108,111,98,98,101,114,101,100,46,10,10,32, - 32,32,32,78,41,3,114,54,0,0,0,114,20,0,0,0, - 114,167,0,0,0,169,1,114,103,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,101,0,0,0, - 207,2,0,0,115,8,0,0,0,12,9,22,1,20,128,255, - 128,114,101,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 140,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,90,4,101,5,100,3,100,4,132,0,131,1,90,6, - 101,7,100,20,100,6,100,7,132,1,131,1,90,8,101,7, - 100,21,100,8,100,9,132,1,131,1,90,9,101,5,100,10, - 100,11,132,0,131,1,90,10,101,5,100,12,100,13,132,0, - 131,1,90,11,101,7,101,12,100,14,100,15,132,0,131,1, - 131,1,90,13,101,7,101,12,100,16,100,17,132,0,131,1, - 131,1,90,14,101,7,101,12,100,18,100,19,132,0,131,1, - 131,1,90,15,101,7,101,16,131,1,90,17,100,5,83,0, - 41,22,218,15,66,117,105,108,116,105,110,73,109,112,111,114, - 116,101,114,122,144,77,101,116,97,32,112,97,116,104,32,105, - 109,112,111,114,116,32,102,111,114,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,46,10,10,32,32,32, - 32,65,108,108,32,109,101,116,104,111,100,115,32,97,114,101, - 32,101,105,116,104,101,114,32,99,108,97,115,115,32,111,114, - 32,115,116,97,116,105,99,32,109,101,116,104,111,100,115,32, - 116,111,32,97,118,111,105,100,32,116,104,101,32,110,101,101, - 100,32,116,111,10,32,32,32,32,105,110,115,116,97,110,116, - 105,97,116,101,32,116,104,101,32,99,108,97,115,115,46,10, - 10,32,32,32,32,122,8,98,117,105,108,116,45,105,110,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 5,0,0,0,67,0,0,0,115,22,0,0,0,100,1,124, - 0,106,0,155,2,100,2,116,1,106,2,155,0,100,3,157, - 5,83,0,41,5,250,115,82,101,116,117,114,110,32,114,101, - 112,114,32,102,111,114,32,116,104,101,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,84,104,101,32,105,109,112,111,114, - 116,32,109,97,99,104,105,110,101,114,121,32,100,111,101,115, - 32,116,104,101,32,106,111,98,32,105,116,115,101,108,102,46, - 10,10,32,32,32,32,32,32,32,32,122,8,60,109,111,100, - 117,108,101,32,122,2,32,40,122,2,41,62,78,41,3,114, - 9,0,0,0,114,169,0,0,0,114,145,0,0,0,169,1, - 114,104,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,107,0,0,0,233,2,0,0,115,4,0, - 0,0,22,7,255,128,122,27,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,4,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,5,0,0,0,67,0,0,0,115,42,0, - 0,0,124,2,100,0,117,1,114,12,100,0,83,0,116,0, - 160,1,124,1,161,1,114,38,116,2,124,1,124,0,124,0, - 106,3,100,1,141,3,83,0,100,0,83,0,169,2,78,114, - 144,0,0,0,41,4,114,61,0,0,0,90,10,105,115,95, - 98,117,105,108,116,105,110,114,98,0,0,0,114,145,0,0, - 0,169,4,218,3,99,108,115,114,85,0,0,0,218,4,112, - 97,116,104,218,6,116,97,114,103,101,116,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,9,102,105,110,100, - 95,115,112,101,99,242,2,0,0,115,12,0,0,0,8,2, - 4,1,10,1,16,1,4,2,255,128,122,25,66,117,105,108, - 116,105,110,73,109,112,111,114,116,101,114,46,102,105,110,100, - 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,30, - 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, - 3,100,1,117,1,114,26,124,3,106,1,83,0,100,1,83, - 0,41,2,122,175,70,105,110,100,32,116,104,101,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,73,102,32,39,112,97,116,104, - 39,32,105,115,32,101,118,101,114,32,115,112,101,99,105,102, - 105,101,100,32,116,104,101,110,32,116,104,101,32,115,101,97, - 114,99,104,32,105,115,32,99,111,110,115,105,100,101,114,101, - 100,32,97,32,102,97,105,108,117,114,101,46,10,10,32,32, + 218,8,103,101,116,95,99,111,100,101,20,3,0,0,243,4, + 0,0,0,4,4,255,128,122,24,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,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,114,185,0,0,0,41, + 2,122,56,82,101,116,117,114,110,32,78,111,110,101,32,97, + 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, + 111,117,114,99,101,32,99,111,100,101,46,78,114,5,0,0, + 0,114,186,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,10,103,101,116,95,115,111,117,114,99, + 101,26,3,0,0,114,188,0,0,0,122,26,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,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,114, + 185,0,0,0,41,3,122,52,82,101,116,117,114,110,32,70, + 97,108,115,101,32,97,115,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,115,32,97,114,101,32,110,101,118, + 101,114,32,112,97,99,107,97,103,101,115,46,70,78,114,5, + 0,0,0,114,186,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,128,0,0,0,32,3,0,0, + 114,188,0,0,0,122,26,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,41,2,78,78,41,1,78,41,18,114,9,0,0,0,114, + 8,0,0,0,114,1,0,0,0,114,10,0,0,0,114,151, + 0,0,0,218,12,115,116,97,116,105,99,109,101,116,104,111, + 100,114,113,0,0,0,218,11,99,108,97,115,115,109,101,116, + 104,111,100,114,183,0,0,0,114,184,0,0,0,114,162,0, + 0,0,114,163,0,0,0,114,95,0,0,0,114,187,0,0, + 0,114,189,0,0,0,114,128,0,0,0,114,111,0,0,0, + 114,170,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,175,0,0,0,222,2, + 0,0,115,48,0,0,0,8,0,4,2,4,7,2,2,10, + 1,2,8,12,1,2,8,12,1,2,11,10,1,2,7,10, + 1,2,4,2,1,12,1,2,4,2,1,12,1,2,4,2, + 1,12,1,12,4,255,128,114,175,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,64,0,0,0,115,144,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,90,4,101,5,100,3,100,4, + 132,0,131,1,90,6,101,7,100,22,100,6,100,7,132,1, + 131,1,90,8,101,7,100,23,100,8,100,9,132,1,131,1, + 90,9,101,5,100,10,100,11,132,0,131,1,90,10,101,5, + 100,12,100,13,132,0,131,1,90,11,101,7,100,14,100,15, + 132,0,131,1,90,12,101,7,101,13,100,16,100,17,132,0, + 131,1,131,1,90,14,101,7,101,13,100,18,100,19,132,0, + 131,1,131,1,90,15,101,7,101,13,100,20,100,21,132,0, + 131,1,131,1,90,16,100,5,83,0,41,24,218,14,70,114, + 111,122,101,110,73,109,112,111,114,116,101,114,122,142,77,101, + 116,97,32,112,97,116,104,32,105,109,112,111,114,116,32,102, + 111,114,32,102,114,111,122,101,110,32,109,111,100,117,108,101, + 115,46,10,10,32,32,32,32,65,108,108,32,109,101,116,104, + 111,100,115,32,97,114,101,32,101,105,116,104,101,114,32,99, + 108,97,115,115,32,111,114,32,115,116,97,116,105,99,32,109, + 101,116,104,111,100,115,32,116,111,32,97,118,111,105,100,32, + 116,104,101,32,110,101,101,100,32,116,111,10,32,32,32,32, + 105,110,115,116,97,110,116,105,97,116,101,32,116,104,101,32, + 99,108,97,115,115,46,10,10,32,32,32,32,90,6,102,114, + 111,122,101,110,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,67,0,0,0,115,16,0, + 0,0,100,1,160,0,124,0,106,1,116,2,106,3,161,2, + 83,0,41,3,114,176,0,0,0,114,166,0,0,0,78,41, + 4,114,50,0,0,0,114,9,0,0,0,114,192,0,0,0, + 114,151,0,0,0,41,1,218,1,109,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,113,0,0,0,52,3, + 0,0,115,4,0,0,0,16,7,255,128,122,26,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,4,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, + 0,115,30,0,0,0,116,0,160,1,124,1,161,1,114,26, + 116,2,124,1,124,0,124,0,106,3,100,1,141,3,83,0, + 100,0,83,0,114,178,0,0,0,41,4,114,64,0,0,0, + 114,98,0,0,0,114,104,0,0,0,114,151,0,0,0,114, + 179,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,183,0,0,0,61,3,0,0,115,8,0,0, + 0,10,2,16,1,4,2,255,128,122,24,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,102,105,110,100,95,115, + 112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,3,0,0,0,67,0,0,0,115,18,0,0, + 0,116,0,160,1,124,1,161,1,114,14,124,0,83,0,100, + 1,83,0,41,2,122,93,70,105,110,100,32,97,32,102,114, + 111,122,101,110,32,109,111,100,117,108,101,46,10,10,32,32, 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, 32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40, 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, - 32,32,32,32,78,41,2,114,177,0,0,0,114,116,0,0, - 0,41,4,114,174,0,0,0,114,85,0,0,0,114,175,0, - 0,0,114,103,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,11,102,105,110,100,95,109,111,100, - 117,108,101,251,2,0,0,115,6,0,0,0,12,9,18,1, - 255,128,122,27,66,117,105,108,116,105,110,73,109,112,111,114, + 32,32,32,32,78,41,2,114,64,0,0,0,114,98,0,0, + 0,41,3,114,180,0,0,0,114,89,0,0,0,114,181,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,184,0,0,0,68,3,0,0,115,4,0,0,0,18, + 7,255,128,122,26,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, 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 4,0,0,0,67,0,0,0,115,46,0,0,0,124,0,106, - 0,116,1,106,2,118,1,114,34,116,3,100,1,160,4,124, - 0,106,0,161,1,124,0,106,0,100,2,141,2,130,1,116, - 5,116,6,106,7,124,0,131,2,83,0,41,4,122,24,67, - 114,101,97,116,101,32,97,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,114,81,0,0,0,114,19,0,0, - 0,78,41,8,114,20,0,0,0,114,18,0,0,0,114,82, - 0,0,0,114,83,0,0,0,114,49,0,0,0,114,71,0, - 0,0,114,61,0,0,0,90,14,99,114,101,97,116,101,95, - 98,117,105,108,116,105,110,114,168,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,156,0,0,0, - 7,3,0,0,115,12,0,0,0,12,3,12,1,4,1,6, - 255,12,2,255,128,122,29,66,117,105,108,116,105,110,73,109, - 112,111,114,116,101,114,46,99,114,101,97,116,101,95,109,111, - 100,117,108,101,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,16,0, - 0,0,116,0,116,1,106,2,124,0,131,2,1,0,100,1, - 83,0,41,2,122,22,69,120,101,99,32,97,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,78,41,3,114, - 71,0,0,0,114,61,0,0,0,90,12,101,120,101,99,95, - 98,117,105,108,116,105,110,114,171,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,157,0,0,0, - 15,3,0,0,115,4,0,0,0,16,3,255,128,122,27,66, - 117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,101, - 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,57, - 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, - 100,111,32,110,111,116,32,104,97,118,101,32,99,111,100,101, - 32,111,98,106,101,99,116,115,46,78,114,5,0,0,0,169, - 2,114,174,0,0,0,114,85,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,8,103,101,116,95, - 99,111,100,101,20,3,0,0,115,4,0,0,0,4,4,255, - 128,122,24,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,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, - 56,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, - 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, - 114,99,101,32,99,111,100,101,46,78,114,5,0,0,0,114, - 179,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,26, - 3,0,0,115,4,0,0,0,4,4,255,128,122,26,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,3,122,52,82,101, - 116,117,114,110,32,70,97,108,115,101,32,97,115,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,97, - 114,101,32,110,101,118,101,114,32,112,97,99,107,97,103,101, - 115,46,70,78,114,5,0,0,0,114,179,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,122,0, - 0,0,32,3,0,0,115,4,0,0,0,4,4,255,128,122, - 26,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,41,2,78,78,41, - 1,78,41,18,114,9,0,0,0,114,8,0,0,0,114,1, - 0,0,0,114,10,0,0,0,114,145,0,0,0,218,12,115, - 116,97,116,105,99,109,101,116,104,111,100,114,107,0,0,0, - 218,11,99,108,97,115,115,109,101,116,104,111,100,114,177,0, - 0,0,114,178,0,0,0,114,156,0,0,0,114,157,0,0, - 0,114,90,0,0,0,114,180,0,0,0,114,181,0,0,0, - 114,122,0,0,0,114,105,0,0,0,114,164,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,169,0,0,0,222,2,0,0,115,48,0,0, - 0,8,0,4,2,4,7,2,2,10,1,2,8,12,1,2, - 8,12,1,2,11,10,1,2,7,10,1,2,4,2,1,12, - 1,2,4,2,1,12,1,2,4,2,1,12,1,12,4,255, - 128,114,169,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 144,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,90,4,101,5,100,3,100,4,132,0,131,1,90,6, - 101,7,100,22,100,6,100,7,132,1,131,1,90,8,101,7, - 100,23,100,8,100,9,132,1,131,1,90,9,101,5,100,10, - 100,11,132,0,131,1,90,10,101,5,100,12,100,13,132,0, - 131,1,90,11,101,7,100,14,100,15,132,0,131,1,90,12, - 101,7,101,13,100,16,100,17,132,0,131,1,131,1,90,14, - 101,7,101,13,100,18,100,19,132,0,131,1,131,1,90,15, - 101,7,101,13,100,20,100,21,132,0,131,1,131,1,90,16, - 100,5,83,0,41,24,218,14,70,114,111,122,101,110,73,109, - 112,111,114,116,101,114,122,142,77,101,116,97,32,112,97,116, - 104,32,105,109,112,111,114,116,32,102,111,114,32,102,114,111, - 122,101,110,32,109,111,100,117,108,101,115,46,10,10,32,32, - 32,32,65,108,108,32,109,101,116,104,111,100,115,32,97,114, - 101,32,101,105,116,104,101,114,32,99,108,97,115,115,32,111, - 114,32,115,116,97,116,105,99,32,109,101,116,104,111,100,115, - 32,116,111,32,97,118,111,105,100,32,116,104,101,32,110,101, - 101,100,32,116,111,10,32,32,32,32,105,110,115,116,97,110, - 116,105,97,116,101,32,116,104,101,32,99,108,97,115,115,46, - 10,10,32,32,32,32,90,6,102,114,111,122,101,110,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, - 0,0,0,67,0,0,0,115,16,0,0,0,100,1,160,0, - 124,0,106,1,116,2,106,3,161,2,83,0,41,3,114,170, - 0,0,0,114,160,0,0,0,78,41,4,114,49,0,0,0, - 114,9,0,0,0,114,184,0,0,0,114,145,0,0,0,41, - 1,218,1,109,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,107,0,0,0,52,3,0,0,115,4,0,0, - 0,16,7,255,128,122,26,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,4,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,5,0,0,0,67,0,0,0,115,30,0,0,0, - 116,0,160,1,124,1,161,1,114,26,116,2,124,1,124,0, - 124,0,106,3,100,1,141,3,83,0,100,0,83,0,114,172, - 0,0,0,41,4,114,61,0,0,0,114,92,0,0,0,114, - 98,0,0,0,114,145,0,0,0,114,173,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,177,0, - 0,0,61,3,0,0,115,8,0,0,0,10,2,16,1,4, - 2,255,128,122,24,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, - 0,0,67,0,0,0,115,18,0,0,0,116,0,160,1,124, - 1,161,1,114,14,124,0,83,0,100,1,83,0,41,2,122, - 93,70,105,110,100,32,97,32,102,114,111,122,101,110,32,109, - 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, - 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, - 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, - 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,41, - 2,114,61,0,0,0,114,92,0,0,0,41,3,114,174,0, - 0,0,114,85,0,0,0,114,175,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,178,0,0,0, - 68,3,0,0,115,4,0,0,0,18,7,255,128,122,26,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,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,42,85, - 115,101,32,100,101,102,97,117,108,116,32,115,101,109,97,110, - 116,105,99,115,32,102,111,114,32,109,111,100,117,108,101,32, - 99,114,101,97,116,105,111,110,46,78,114,5,0,0,0,114, - 168,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,156,0,0,0,77,3,0,0,115,4,0,0, - 0,4,0,255,128,122,28,70,114,111,122,101,110,73,109,112, - 111,114,116,101,114,46,99,114,101,97,116,101,95,109,111,100, - 117,108,101,99,1,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,4,0,0,0,67,0,0,0,115,64,0,0, - 0,124,0,106,0,106,1,125,1,116,2,160,3,124,1,161, - 1,115,36,116,4,100,1,160,5,124,1,161,1,124,1,100, - 2,141,2,130,1,116,6,116,2,106,7,124,1,131,2,125, - 2,116,8,124,2,124,0,106,9,131,2,1,0,100,0,83, - 0,114,91,0,0,0,41,10,114,113,0,0,0,114,20,0, - 0,0,114,61,0,0,0,114,92,0,0,0,114,83,0,0, - 0,114,49,0,0,0,114,71,0,0,0,218,17,103,101,116, - 95,102,114,111,122,101,110,95,111,98,106,101,99,116,218,4, - 101,120,101,99,114,14,0,0,0,41,3,114,104,0,0,0, - 114,20,0,0,0,218,4,99,111,100,101,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,114,157,0,0,0,81, - 3,0,0,115,16,0,0,0,8,2,10,1,10,1,2,1, - 6,255,12,2,16,1,255,128,122,26,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,46,101,120,101,99,95,109,111, - 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,10,0, - 0,0,116,0,124,0,124,1,131,2,83,0,41,2,122,95, - 76,111,97,100,32,97,32,102,114,111,122,101,110,32,109,111, - 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101, - 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, - 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, - 41,1,114,105,0,0,0,114,179,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,164,0,0,0, - 90,3,0,0,115,4,0,0,0,10,8,255,128,122,26,70, - 114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, - 0,0,115,10,0,0,0,116,0,160,1,124,1,161,1,83, - 0,41,2,122,45,82,101,116,117,114,110,32,116,104,101,32, - 99,111,100,101,32,111,98,106,101,99,116,32,102,111,114,32, - 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,46,78,41,2,114,61,0,0,0,114,186,0,0,0,114, - 179,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,180,0,0,0,100,3,0,0,115,4,0,0, - 0,10,4,255,128,122,23,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,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, - 41,2,122,54,82,101,116,117,114,110,32,78,111,110,101,32, - 97,115,32,102,114,111,122,101,110,32,109,111,100,117,108,101, - 115,32,100,111,32,110,111,116,32,104,97,118,101,32,115,111, - 117,114,99,101,32,99,111,100,101,46,78,114,5,0,0,0, - 114,179,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,181,0,0,0,106,3,0,0,115,4,0, - 0,0,4,4,255,128,122,25,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,0,0,0,0,2,0, - 0,0,3,0,0,0,67,0,0,0,115,10,0,0,0,116, - 0,160,1,124,1,161,1,83,0,41,2,122,46,82,101,116, + 1,0,0,0,67,0,0,0,114,185,0,0,0,41,2,122, + 42,85,115,101,32,100,101,102,97,117,108,116,32,115,101,109, + 97,110,116,105,99,115,32,102,111,114,32,109,111,100,117,108, + 101,32,99,114,101,97,116,105,111,110,46,78,114,5,0,0, + 0,114,174,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,162,0,0,0,77,3,0,0,115,4, + 0,0,0,4,0,255,128,122,28,70,114,111,122,101,110,73, + 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, + 111,100,117,108,101,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,64, + 0,0,0,124,0,106,0,106,1,125,1,116,2,160,3,124, + 1,161,1,115,36,116,4,100,1,160,5,124,1,161,1,124, + 1,100,2,141,2,130,1,116,6,116,2,106,7,124,1,131, + 2,125,2,116,8,124,2,124,0,106,9,131,2,1,0,100, + 0,83,0,114,97,0,0,0,41,10,114,119,0,0,0,114, + 20,0,0,0,114,64,0,0,0,114,98,0,0,0,114,87, + 0,0,0,114,50,0,0,0,114,74,0,0,0,218,17,103, + 101,116,95,102,114,111,122,101,110,95,111,98,106,101,99,116, + 218,4,101,120,101,99,114,14,0,0,0,41,3,114,110,0, + 0,0,114,20,0,0,0,218,4,99,111,100,101,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,163,0,0, + 0,81,3,0,0,115,16,0,0,0,8,2,10,1,10,1, + 2,1,6,255,12,2,16,1,255,128,122,26,70,114,111,122, + 101,110,73,109,112,111,114,116,101,114,46,101,120,101,99,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 10,0,0,0,116,0,124,0,124,1,131,2,83,0,41,2, + 122,95,76,111,97,100,32,97,32,102,114,111,122,101,110,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,78,41,1,114,111,0,0,0,114,186,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,170,0, + 0,0,90,3,0,0,115,4,0,0,0,10,8,255,128,122, + 26,70,114,111,122,101,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,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,243,10,0,0,0,116,0,160,1,124,1,161, + 1,83,0,41,2,122,45,82,101,116,117,114,110,32,116,104, + 101,32,99,111,100,101,32,111,98,106,101,99,116,32,102,111, + 114,32,116,104,101,32,102,114,111,122,101,110,32,109,111,100, + 117,108,101,46,78,41,2,114,64,0,0,0,114,194,0,0, + 0,114,186,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,187,0,0,0,100,3,0,0,243,4, + 0,0,0,10,4,255,128,122,23,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,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,114,185,0,0,0,41,2, + 122,54,82,101,116,117,114,110,32,78,111,110,101,32,97,115, + 32,102,114,111,122,101,110,32,109,111,100,117,108,101,115,32, + 100,111,32,110,111,116,32,104,97,118,101,32,115,111,117,114, + 99,101,32,99,111,100,101,46,78,114,5,0,0,0,114,186, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,114,189,0,0,0,106,3,0,0,114,188,0,0,0, + 122,25,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,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,114,197,0,0,0,41,2,122,46,82,101,116, 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, 102,114,111,122,101,110,32,109,111,100,117,108,101,32,105,115, - 32,97,32,112,97,99,107,97,103,101,46,78,41,2,114,61, + 32,97,32,112,97,99,107,97,103,101,46,78,41,2,114,64, 0,0,0,90,17,105,115,95,102,114,111,122,101,110,95,112, - 97,99,107,97,103,101,114,179,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,114,122,0,0,0,112, - 3,0,0,115,4,0,0,0,10,4,255,128,122,25,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,41,2,78,78,41,1,78,41,17, - 114,9,0,0,0,114,8,0,0,0,114,1,0,0,0,114, - 10,0,0,0,114,145,0,0,0,114,182,0,0,0,114,107, - 0,0,0,114,183,0,0,0,114,177,0,0,0,114,178,0, - 0,0,114,156,0,0,0,114,157,0,0,0,114,164,0,0, - 0,114,94,0,0,0,114,180,0,0,0,114,181,0,0,0, - 114,122,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,184,0,0,0,41,3, - 0,0,115,50,0,0,0,8,0,4,2,4,7,2,2,10, - 1,2,8,12,1,2,6,12,1,2,8,10,1,2,3,10, - 1,2,8,10,1,2,9,2,1,12,1,2,4,2,1,12, - 1,2,4,2,1,16,1,255,128,114,184,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,64,0,0,0,115,32,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, - 100,4,100,5,132,0,90,5,100,6,83,0,41,7,218,18, - 95,73,109,112,111,114,116,76,111,99,107,67,111,110,116,101, - 120,116,122,36,67,111,110,116,101,120,116,32,109,97,110,97, - 103,101,114,32,102,111,114,32,116,104,101,32,105,109,112,111, - 114,116,32,108,111,99,107,46,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,0, - 0,115,12,0,0,0,116,0,160,1,161,0,1,0,100,1, - 83,0,41,2,122,24,65,99,113,117,105,114,101,32,116,104, - 101,32,105,109,112,111,114,116,32,108,111,99,107,46,78,41, - 2,114,61,0,0,0,114,62,0,0,0,114,51,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 58,0,0,0,125,3,0,0,115,4,0,0,0,12,2,255, - 128,122,28,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,0,0,0,0,4,0,0,0, - 2,0,0,0,67,0,0,0,115,12,0,0,0,116,0,160, - 1,161,0,1,0,100,1,83,0,41,2,122,60,82,101,108, + 97,99,107,97,103,101,114,186,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,128,0,0,0,112, + 3,0,0,114,198,0,0,0,122,25,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,41,2,78,78,41,1,78,41,17,114,9,0,0, + 0,114,8,0,0,0,114,1,0,0,0,114,10,0,0,0, + 114,151,0,0,0,114,190,0,0,0,114,113,0,0,0,114, + 191,0,0,0,114,183,0,0,0,114,184,0,0,0,114,162, + 0,0,0,114,163,0,0,0,114,170,0,0,0,114,100,0, + 0,0,114,187,0,0,0,114,189,0,0,0,114,128,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,192,0,0,0,41,3,0,0,115,50, + 0,0,0,8,0,4,2,4,7,2,2,10,1,2,8,12, + 1,2,6,12,1,2,8,10,1,2,3,10,1,2,8,10, + 1,2,9,2,1,12,1,2,4,2,1,12,1,2,4,2, + 1,16,1,255,128,114,192,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,100,6,83,0,41,7,218,18,95,73,109,112, + 111,114,116,76,111,99,107,67,111,110,116,101,120,116,122,36, + 67,111,110,116,101,120,116,32,109,97,110,97,103,101,114,32, + 102,111,114,32,116,104,101,32,105,109,112,111,114,116,32,108, + 111,99,107,46,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,2,0,0,0,67,0,0,0,243,12,0, + 0,0,116,0,160,1,161,0,1,0,100,1,83,0,41,2, + 122,24,65,99,113,117,105,114,101,32,116,104,101,32,105,109, + 112,111,114,116,32,108,111,99,107,46,78,41,2,114,64,0, + 0,0,114,65,0,0,0,114,52,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,61,0,0,0, + 125,3,0,0,243,4,0,0,0,12,2,255,128,122,28,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,0,0,0,0,4,0,0,0,2,0,0,0, + 67,0,0,0,114,200,0,0,0,41,2,122,60,82,101,108, 101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32, 108,111,99,107,32,114,101,103,97,114,100,108,101,115,115,32, 111,102,32,97,110,121,32,114,97,105,115,101,100,32,101,120, - 99,101,112,116,105,111,110,115,46,78,41,2,114,61,0,0, - 0,114,64,0,0,0,41,4,114,33,0,0,0,218,8,101, + 99,101,112,116,105,111,110,115,46,78,41,2,114,64,0,0, + 0,114,67,0,0,0,41,4,114,33,0,0,0,218,8,101, 120,99,95,116,121,112,101,218,9,101,120,99,95,118,97,108, 117,101,218,13,101,120,99,95,116,114,97,99,101,98,97,99, 107,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,60,0,0,0,129,3,0,0,115,4,0,0,0,12,2, - 255,128,122,27,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, - 41,6,114,9,0,0,0,114,8,0,0,0,114,1,0,0, - 0,114,10,0,0,0,114,58,0,0,0,114,60,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,189,0,0,0,121,3,0,0,115,10,0, - 0,0,8,0,4,2,8,2,12,4,255,128,114,189,0,0, - 0,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,5,0,0,0,67,0,0,0,115,64,0,0,0,124, - 1,160,0,100,1,124,2,100,2,24,0,161,2,125,3,116, - 1,124,3,131,1,124,2,107,0,114,36,116,2,100,3,131, - 1,130,1,124,3,100,4,25,0,125,4,124,0,114,60,100, - 5,160,3,124,4,124,0,161,2,83,0,124,4,83,0,41, - 7,122,50,82,101,115,111,108,118,101,32,97,32,114,101,108, - 97,116,105,118,101,32,109,111,100,117,108,101,32,110,97,109, - 101,32,116,111,32,97,110,32,97,98,115,111,108,117,116,101, - 32,111,110,101,46,114,135,0,0,0,114,42,0,0,0,122, - 50,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, - 105,118,101,32,105,109,112,111,114,116,32,98,101,121,111,110, - 100,32,116,111,112,45,108,101,118,101,108,32,112,97,99,107, - 97,103,101,114,25,0,0,0,250,5,123,125,46,123,125,78, - 41,4,218,6,114,115,112,108,105,116,218,3,108,101,110,114, - 83,0,0,0,114,49,0,0,0,41,5,114,20,0,0,0, - 218,7,112,97,99,107,97,103,101,218,5,108,101,118,101,108, - 90,4,98,105,116,115,90,4,98,97,115,101,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,13,95,114,101, - 115,111,108,118,101,95,110,97,109,101,134,3,0,0,115,12, - 0,0,0,16,2,12,1,8,1,8,1,20,1,255,128,114, - 198,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,4,0,0,0,67,0,0,0,115,34,0, - 0,0,124,0,160,0,124,1,124,2,161,2,125,3,124,3, - 100,0,117,0,114,24,100,0,83,0,116,1,124,1,124,3, - 131,2,83,0,114,0,0,0,0,41,2,114,178,0,0,0, - 114,98,0,0,0,41,4,218,6,102,105,110,100,101,114,114, - 20,0,0,0,114,175,0,0,0,114,116,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,17,95, - 102,105,110,100,95,115,112,101,99,95,108,101,103,97,99,121, - 143,3,0,0,115,10,0,0,0,12,3,8,1,4,1,10, - 1,255,128,114,200,0,0,0,99,3,0,0,0,0,0,0, - 0,0,0,0,0,10,0,0,0,10,0,0,0,67,0,0, - 0,115,36,1,0,0,116,0,106,1,125,3,124,3,100,1, - 117,0,114,22,116,2,100,2,131,1,130,1,124,3,115,38, - 116,3,160,4,100,3,116,5,161,2,1,0,124,0,116,0, - 106,6,118,0,125,4,124,3,68,0,93,230,125,5,116,7, - 131,0,143,94,1,0,122,10,124,5,106,8,125,6,87,0, - 110,54,4,0,116,9,144,1,121,34,1,0,1,0,1,0, - 116,10,124,5,124,0,124,1,131,3,125,7,124,7,100,1, - 117,0,114,126,89,0,87,0,100,1,4,0,4,0,131,3, - 1,0,113,52,89,0,110,12,124,6,124,0,124,1,124,2, - 131,3,125,7,87,0,100,1,4,0,4,0,131,3,1,0, - 110,16,49,0,115,162,119,1,1,0,1,0,1,0,89,0, - 1,0,124,7,100,1,117,1,144,1,114,26,124,4,144,1, - 115,18,124,0,116,0,106,6,118,0,144,1,114,18,116,0, - 106,6,124,0,25,0,125,8,122,10,124,8,106,11,125,9, - 87,0,110,26,4,0,116,9,144,1,121,32,1,0,1,0, - 1,0,124,7,6,0,89,0,2,0,1,0,83,0,124,9, - 100,1,117,0,144,1,114,10,124,7,2,0,1,0,83,0, - 124,9,2,0,1,0,83,0,124,7,2,0,1,0,83,0, - 113,52,100,1,83,0,119,0,119,0,41,4,122,21,70,105, - 110,100,32,97,32,109,111,100,117,108,101,39,115,32,115,112, - 101,99,46,78,122,53,115,121,115,46,109,101,116,97,95,112, - 97,116,104,32,105,115,32,78,111,110,101,44,32,80,121,116, - 104,111,110,32,105,115,32,108,105,107,101,108,121,32,115,104, - 117,116,116,105,110,103,32,100,111,119,110,122,22,115,121,115, - 46,109,101,116,97,95,112,97,116,104,32,105,115,32,101,109, - 112,116,121,41,12,114,18,0,0,0,218,9,109,101,116,97, - 95,112,97,116,104,114,83,0,0,0,114,95,0,0,0,114, - 96,0,0,0,114,163,0,0,0,114,99,0,0,0,114,189, - 0,0,0,114,177,0,0,0,114,2,0,0,0,114,200,0, - 0,0,114,113,0,0,0,41,10,114,20,0,0,0,114,175, - 0,0,0,114,176,0,0,0,114,201,0,0,0,90,9,105, - 115,95,114,101,108,111,97,100,114,199,0,0,0,114,177,0, - 0,0,114,103,0,0,0,114,104,0,0,0,114,113,0,0, + 114,63,0,0,0,129,3,0,0,114,201,0,0,0,122,27, + 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,41,6,114,9, + 0,0,0,114,8,0,0,0,114,1,0,0,0,114,10,0, + 0,0,114,61,0,0,0,114,63,0,0,0,114,5,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,10,95,102,105,110,100,95,115,112,101,99,152,3,0,0, - 115,66,0,0,0,6,2,8,1,8,2,4,3,12,1,10, - 5,8,1,8,1,2,1,10,1,14,1,12,1,8,1,16, - 1,4,255,12,3,30,128,10,1,18,2,10,1,2,1,10, - 1,14,1,12,4,10,2,8,1,8,2,8,2,2,239,4, - 19,2,243,2,244,255,128,114,202,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, - 0,67,0,0,0,115,110,0,0,0,116,0,124,0,116,1, - 131,2,115,28,116,2,100,1,160,3,116,4,124,0,131,1, - 161,1,131,1,130,1,124,2,100,2,107,0,114,44,116,5, - 100,3,131,1,130,1,124,2,100,2,107,4,114,82,116,0, - 124,1,116,1,131,2,115,70,116,2,100,4,131,1,130,1, - 124,1,115,82,116,6,100,5,131,1,130,1,124,0,115,106, - 124,2,100,2,107,2,114,102,116,5,100,6,131,1,130,1, - 100,7,83,0,100,7,83,0,41,8,122,28,86,101,114,105, - 102,121,32,97,114,103,117,109,101,110,116,115,32,97,114,101, - 32,34,115,97,110,101,34,46,122,31,109,111,100,117,108,101, - 32,110,97,109,101,32,109,117,115,116,32,98,101,32,115,116, - 114,44,32,110,111,116,32,123,125,114,25,0,0,0,122,18, - 108,101,118,101,108,32,109,117,115,116,32,98,101,32,62,61, - 32,48,122,31,95,95,112,97,99,107,97,103,101,95,95,32, - 110,111,116,32,115,101,116,32,116,111,32,97,32,115,116,114, - 105,110,103,122,54,97,116,116,101,109,112,116,101,100,32,114, - 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,119, - 105,116,104,32,110,111,32,107,110,111,119,110,32,112,97,114, - 101,110,116,32,112,97,99,107,97,103,101,122,17,69,109,112, - 116,121,32,109,111,100,117,108,101,32,110,97,109,101,78,41, - 7,218,10,105,115,105,110,115,116,97,110,99,101,218,3,115, - 116,114,218,9,84,121,112,101,69,114,114,111,114,114,49,0, - 0,0,114,3,0,0,0,218,10,86,97,108,117,101,69,114, - 114,111,114,114,83,0,0,0,169,3,114,20,0,0,0,114, - 196,0,0,0,114,197,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,13,95,115,97,110,105,116, - 121,95,99,104,101,99,107,199,3,0,0,115,26,0,0,0, - 10,2,18,1,8,1,8,1,8,1,10,1,8,1,4,1, - 8,1,12,2,8,1,8,255,255,128,114,208,0,0,0,122, - 16,78,111,32,109,111,100,117,108,101,32,110,97,109,101,100, - 32,122,4,123,33,114,125,99,2,0,0,0,0,0,0,0, - 0,0,0,0,9,0,0,0,8,0,0,0,67,0,0,0, - 115,22,1,0,0,100,0,125,2,124,0,160,0,100,1,161, - 1,100,2,25,0,125,3,124,3,114,128,124,3,116,1,106, - 2,118,1,114,42,116,3,124,1,124,3,131,2,1,0,124, - 0,116,1,106,2,118,0,114,62,116,1,106,2,124,0,25, - 0,83,0,116,1,106,2,124,3,25,0,125,4,122,10,124, - 4,106,4,125,2,87,0,110,44,4,0,116,5,144,1,121, - 20,1,0,1,0,1,0,116,6,100,3,23,0,160,7,124, - 0,124,3,161,2,125,5,116,8,124,5,124,0,100,4,141, - 2,100,0,130,2,116,9,124,0,124,2,131,2,125,6,124, - 6,100,0,117,0,114,164,116,8,116,6,160,7,124,0,161, - 1,124,0,100,4,141,2,130,1,116,10,124,6,131,1,125, - 7,124,3,144,1,114,14,116,1,106,2,124,3,25,0,125, - 4,124,0,160,0,100,1,161,1,100,5,25,0,125,8,122, - 18,116,11,124,4,124,8,124,7,131,3,1,0,87,0,124, - 7,83,0,4,0,116,5,144,1,121,18,1,0,1,0,1, - 0,100,6,124,3,155,2,100,7,124,8,155,2,157,4,125, - 5,116,12,160,13,124,5,116,14,161,2,1,0,89,0,124, - 7,83,0,124,7,83,0,119,0,119,0,41,8,78,114,135, - 0,0,0,114,25,0,0,0,122,23,59,32,123,33,114,125, - 32,105,115,32,110,111,116,32,97,32,112,97,99,107,97,103, - 101,114,19,0,0,0,233,2,0,0,0,122,27,67,97,110, - 110,111,116,32,115,101,116,32,97,110,32,97,116,116,114,105, - 98,117,116,101,32,111,110,32,122,18,32,102,111,114,32,99, - 104,105,108,100,32,109,111,100,117,108,101,32,41,15,114,136, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,71,0, - 0,0,114,148,0,0,0,114,2,0,0,0,218,8,95,69, - 82,82,95,77,83,71,114,49,0,0,0,218,19,77,111,100, - 117,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, - 114,202,0,0,0,114,167,0,0,0,114,12,0,0,0,114, - 95,0,0,0,114,96,0,0,0,114,163,0,0,0,41,9, - 114,20,0,0,0,218,7,105,109,112,111,114,116,95,114,175, - 0,0,0,114,137,0,0,0,90,13,112,97,114,101,110,116, - 95,109,111,100,117,108,101,114,102,0,0,0,114,103,0,0, - 0,114,104,0,0,0,90,5,99,104,105,108,100,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,23,95,102, - 105,110,100,95,97,110,100,95,108,111,97,100,95,117,110,108, - 111,99,107,101,100,218,3,0,0,115,60,0,0,0,4,1, - 14,1,4,1,10,1,10,1,10,2,10,1,10,1,2,1, - 10,1,14,1,16,1,14,1,10,1,8,1,18,1,8,2, - 6,1,10,2,14,1,2,1,14,1,4,4,14,253,16,1, - 14,1,8,1,2,253,2,242,255,128,114,213,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 8,0,0,0,67,0,0,0,115,128,0,0,0,116,0,124, - 0,131,1,143,62,1,0,116,1,106,2,160,3,124,0,116, - 4,161,2,125,2,124,2,116,4,117,0,114,56,116,5,124, - 0,124,1,131,2,87,0,2,0,100,1,4,0,4,0,131, - 3,1,0,83,0,87,0,100,1,4,0,4,0,131,3,1, - 0,110,16,49,0,115,76,119,1,1,0,1,0,1,0,89, - 0,1,0,124,2,100,1,117,0,114,116,100,2,160,6,124, - 0,161,1,125,3,116,7,124,3,124,0,100,3,141,2,130, - 1,116,8,124,0,131,1,1,0,124,2,83,0,41,4,122, - 25,70,105,110,100,32,97,110,100,32,108,111,97,100,32,116, - 104,101,32,109,111,100,117,108,101,46,78,122,40,105,109,112, - 111,114,116,32,111,102,32,123,125,32,104,97,108,116,101,100, - 59,32,78,111,110,101,32,105,110,32,115,121,115,46,109,111, - 100,117,108,101,115,114,19,0,0,0,41,9,114,54,0,0, - 0,114,18,0,0,0,114,99,0,0,0,114,38,0,0,0, - 218,14,95,78,69,69,68,83,95,76,79,65,68,73,78,71, - 114,213,0,0,0,114,49,0,0,0,114,211,0,0,0,114, - 69,0,0,0,41,4,114,20,0,0,0,114,212,0,0,0, - 114,104,0,0,0,114,79,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,14,95,102,105,110,100, - 95,97,110,100,95,108,111,97,100,253,3,0,0,115,28,0, - 0,0,10,2,14,1,8,1,24,1,14,255,16,128,8,3, - 4,1,2,1,4,255,12,2,8,2,4,1,255,128,114,215, - 0,0,0,114,25,0,0,0,99,3,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, - 0,115,42,0,0,0,116,0,124,0,124,1,124,2,131,3, - 1,0,124,2,100,1,107,4,114,32,116,1,124,0,124,1, - 124,2,131,3,125,0,116,2,124,0,116,3,131,2,83,0, - 41,3,97,50,1,0,0,73,109,112,111,114,116,32,97,110, - 100,32,114,101,116,117,114,110,32,116,104,101,32,109,111,100, - 117,108,101,32,98,97,115,101,100,32,111,110,32,105,116,115, - 32,110,97,109,101,44,32,116,104,101,32,112,97,99,107,97, - 103,101,32,116,104,101,32,99,97,108,108,32,105,115,10,32, - 32,32,32,98,101,105,110,103,32,109,97,100,101,32,102,114, - 111,109,44,32,97,110,100,32,116,104,101,32,108,101,118,101, - 108,32,97,100,106,117,115,116,109,101,110,116,46,10,10,32, - 32,32,32,84,104,105,115,32,102,117,110,99,116,105,111,110, - 32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32, - 103,114,101,97,116,101,115,116,32,99,111,109,109,111,110,32, - 100,101,110,111,109,105,110,97,116,111,114,32,111,102,32,102, - 117,110,99,116,105,111,110,97,108,105,116,121,10,32,32,32, - 32,98,101,116,119,101,101,110,32,105,109,112,111,114,116,95, - 109,111,100,117,108,101,32,97,110,100,32,95,95,105,109,112, - 111,114,116,95,95,46,32,84,104,105,115,32,105,110,99,108, - 117,100,101,115,32,115,101,116,116,105,110,103,32,95,95,112, - 97,99,107,97,103,101,95,95,32,105,102,10,32,32,32,32, - 116,104,101,32,108,111,97,100,101,114,32,100,105,100,32,110, - 111,116,46,10,10,32,32,32,32,114,25,0,0,0,78,41, - 4,114,208,0,0,0,114,198,0,0,0,114,215,0,0,0, - 218,11,95,103,99,100,95,105,109,112,111,114,116,114,207,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,216,0,0,0,13,4,0,0,115,10,0,0,0,12, - 9,8,1,12,1,10,1,255,128,114,216,0,0,0,169,1, - 218,9,114,101,99,117,114,115,105,118,101,99,3,0,0,0, - 0,0,0,0,1,0,0,0,8,0,0,0,11,0,0,0, - 67,0,0,0,115,218,0,0,0,124,1,68,0,93,206,125, - 4,116,0,124,4,116,1,131,2,115,64,124,3,114,34,124, - 0,106,2,100,1,23,0,125,5,110,4,100,2,125,5,116, - 3,100,3,124,5,155,0,100,4,116,4,124,4,131,1,106, - 2,155,0,157,4,131,1,130,1,124,4,100,5,107,2,114, - 106,124,3,115,104,116,5,124,0,100,6,131,2,114,104,116, - 6,124,0,124,0,106,7,124,2,100,7,100,8,141,4,1, - 0,113,4,116,5,124,0,124,4,131,2,115,210,100,9,160, - 8,124,0,106,2,124,4,161,2,125,6,122,14,116,9,124, - 2,124,6,131,2,1,0,87,0,113,4,4,0,116,10,121, - 216,1,0,125,7,1,0,122,42,124,7,106,11,124,6,107, - 2,114,200,116,12,106,13,160,14,124,6,116,15,161,2,100, - 10,117,1,114,200,87,0,89,0,100,10,125,7,126,7,113, - 4,130,0,100,10,125,7,126,7,119,1,113,4,124,0,83, - 0,119,0,41,11,122,238,70,105,103,117,114,101,32,111,117, - 116,32,119,104,97,116,32,95,95,105,109,112,111,114,116,95, - 95,32,115,104,111,117,108,100,32,114,101,116,117,114,110,46, - 10,10,32,32,32,32,84,104,101,32,105,109,112,111,114,116, - 95,32,112,97,114,97,109,101,116,101,114,32,105,115,32,97, - 32,99,97,108,108,97,98,108,101,32,119,104,105,99,104,32, - 116,97,107,101,115,32,116,104,101,32,110,97,109,101,32,111, - 102,32,109,111,100,117,108,101,32,116,111,10,32,32,32,32, - 105,109,112,111,114,116,46,32,73,116,32,105,115,32,114,101, - 113,117,105,114,101,100,32,116,111,32,100,101,99,111,117,112, - 108,101,32,116,104,101,32,102,117,110,99,116,105,111,110,32, - 102,114,111,109,32,97,115,115,117,109,105,110,103,32,105,109, - 112,111,114,116,108,105,98,39,115,10,32,32,32,32,105,109, - 112,111,114,116,32,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,32,105,115,32,100,101,115,105,114,101,100,46,10, - 10,32,32,32,32,122,8,46,95,95,97,108,108,95,95,122, - 13,96,96,102,114,111,109,32,108,105,115,116,39,39,122,8, - 73,116,101,109,32,105,110,32,122,18,32,109,117,115,116,32, - 98,101,32,115,116,114,44,32,110,111,116,32,250,1,42,218, - 7,95,95,97,108,108,95,95,84,114,217,0,0,0,114,193, - 0,0,0,78,41,16,114,203,0,0,0,114,204,0,0,0, - 114,9,0,0,0,114,205,0,0,0,114,3,0,0,0,114, - 11,0,0,0,218,16,95,104,97,110,100,108,101,95,102,114, - 111,109,108,105,115,116,114,220,0,0,0,114,49,0,0,0, - 114,71,0,0,0,114,211,0,0,0,114,20,0,0,0,114, - 18,0,0,0,114,99,0,0,0,114,38,0,0,0,114,214, - 0,0,0,41,8,114,104,0,0,0,218,8,102,114,111,109, - 108,105,115,116,114,212,0,0,0,114,218,0,0,0,218,1, - 120,90,5,119,104,101,114,101,90,9,102,114,111,109,95,110, - 97,109,101,90,3,101,120,99,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,221,0,0,0,28,4,0,0, - 115,58,0,0,0,8,10,10,1,4,1,12,1,4,2,10, - 1,8,1,8,255,8,2,14,1,10,1,2,1,6,255,2, - 128,10,2,14,1,2,1,14,1,14,1,10,4,16,1,2, - 255,12,2,2,1,8,128,2,245,4,12,2,248,255,128,114, - 221,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,6,0,0,0,67,0,0,0,115,146,0, - 0,0,124,0,160,0,100,1,161,1,125,1,124,0,160,0, - 100,2,161,1,125,2,124,1,100,3,117,1,114,82,124,2, - 100,3,117,1,114,78,124,1,124,2,106,1,107,3,114,78, - 116,2,106,3,100,4,124,1,155,2,100,5,124,2,106,1, - 155,2,100,6,157,5,116,4,100,7,100,8,141,3,1,0, - 124,1,83,0,124,2,100,3,117,1,114,96,124,2,106,1, - 83,0,116,2,106,3,100,9,116,4,100,7,100,8,141,3, - 1,0,124,0,100,10,25,0,125,1,100,11,124,0,118,1, - 114,142,124,1,160,5,100,12,161,1,100,13,25,0,125,1, - 124,1,83,0,41,14,122,167,67,97,108,99,117,108,97,116, - 101,32,119,104,97,116,32,95,95,112,97,99,107,97,103,101, - 95,95,32,115,104,111,117,108,100,32,98,101,46,10,10,32, - 32,32,32,95,95,112,97,99,107,97,103,101,95,95,32,105, - 115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100, - 32,116,111,32,98,101,32,100,101,102,105,110,101,100,32,111, - 114,32,99,111,117,108,100,32,98,101,32,115,101,116,32,116, - 111,32,78,111,110,101,10,32,32,32,32,116,111,32,114,101, - 112,114,101,115,101,110,116,32,116,104,97,116,32,105,116,115, - 32,112,114,111,112,101,114,32,118,97,108,117,101,32,105,115, - 32,117,110,107,110,111,119,110,46,10,10,32,32,32,32,114, - 152,0,0,0,114,113,0,0,0,78,122,32,95,95,112,97, - 99,107,97,103,101,95,95,32,33,61,32,95,95,115,112,101, - 99,95,95,46,112,97,114,101,110,116,32,40,122,4,32,33, - 61,32,250,1,41,233,3,0,0,0,41,1,90,10,115,116, - 97,99,107,108,101,118,101,108,122,89,99,97,110,39,116,32, - 114,101,115,111,108,118,101,32,112,97,99,107,97,103,101,32, - 102,114,111,109,32,95,95,115,112,101,99,95,95,32,111,114, - 32,95,95,112,97,99,107,97,103,101,95,95,44,32,102,97, - 108,108,105,110,103,32,98,97,99,107,32,111,110,32,95,95, - 110,97,109,101,95,95,32,97,110,100,32,95,95,112,97,116, - 104,95,95,114,9,0,0,0,114,148,0,0,0,114,135,0, - 0,0,114,25,0,0,0,41,6,114,38,0,0,0,114,137, - 0,0,0,114,95,0,0,0,114,96,0,0,0,114,163,0, - 0,0,114,136,0,0,0,41,3,218,7,103,108,111,98,97, - 108,115,114,196,0,0,0,114,103,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,17,95,99,97, - 108,99,95,95,95,112,97,99,107,97,103,101,95,95,65,4, - 0,0,115,44,0,0,0,10,7,10,1,8,1,18,1,6, - 1,2,1,4,255,4,1,6,255,4,2,6,254,4,3,8, - 1,6,1,6,2,4,2,6,254,8,3,8,1,14,1,4, - 1,255,128,114,227,0,0,0,114,5,0,0,0,99,5,0, - 0,0,0,0,0,0,0,0,0,0,9,0,0,0,5,0, - 0,0,67,0,0,0,115,174,0,0,0,124,4,100,1,107, - 2,114,18,116,0,124,0,131,1,125,5,110,36,124,1,100, - 2,117,1,114,30,124,1,110,2,105,0,125,6,116,1,124, - 6,131,1,125,7,116,0,124,0,124,7,124,4,131,3,125, - 5,124,3,115,148,124,4,100,1,107,2,114,84,116,0,124, - 0,160,2,100,3,161,1,100,1,25,0,131,1,83,0,124, - 0,115,92,124,5,83,0,116,3,124,0,131,1,116,3,124, - 0,160,2,100,3,161,1,100,1,25,0,131,1,24,0,125, - 8,116,4,106,5,124,5,106,6,100,2,116,3,124,5,106, - 6,131,1,124,8,24,0,133,2,25,0,25,0,83,0,116, - 7,124,5,100,4,131,2,114,170,116,8,124,5,124,3,116, - 0,131,3,83,0,124,5,83,0,41,5,97,215,1,0,0, - 73,109,112,111,114,116,32,97,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,84,104,101,32,39,103,108,111,98,97, - 108,115,39,32,97,114,103,117,109,101,110,116,32,105,115,32, - 117,115,101,100,32,116,111,32,105,110,102,101,114,32,119,104, - 101,114,101,32,116,104,101,32,105,109,112,111,114,116,32,105, - 115,32,111,99,99,117,114,114,105,110,103,32,102,114,111,109, - 10,32,32,32,32,116,111,32,104,97,110,100,108,101,32,114, - 101,108,97,116,105,118,101,32,105,109,112,111,114,116,115,46, - 32,84,104,101,32,39,108,111,99,97,108,115,39,32,97,114, - 103,117,109,101,110,116,32,105,115,32,105,103,110,111,114,101, - 100,46,32,84,104,101,10,32,32,32,32,39,102,114,111,109, - 108,105,115,116,39,32,97,114,103,117,109,101,110,116,32,115, - 112,101,99,105,102,105,101,115,32,119,104,97,116,32,115,104, - 111,117,108,100,32,101,120,105,115,116,32,97,115,32,97,116, - 116,114,105,98,117,116,101,115,32,111,110,32,116,104,101,32, - 109,111,100,117,108,101,10,32,32,32,32,98,101,105,110,103, - 32,105,109,112,111,114,116,101,100,32,40,101,46,103,46,32, - 96,96,102,114,111,109,32,109,111,100,117,108,101,32,105,109, - 112,111,114,116,32,60,102,114,111,109,108,105,115,116,62,96, - 96,41,46,32,32,84,104,101,32,39,108,101,118,101,108,39, - 10,32,32,32,32,97,114,103,117,109,101,110,116,32,114,101, - 112,114,101,115,101,110,116,115,32,116,104,101,32,112,97,99, - 107,97,103,101,32,108,111,99,97,116,105,111,110,32,116,111, - 32,105,109,112,111,114,116,32,102,114,111,109,32,105,110,32, - 97,32,114,101,108,97,116,105,118,101,10,32,32,32,32,105, - 109,112,111,114,116,32,40,101,46,103,46,32,96,96,102,114, - 111,109,32,46,46,112,107,103,32,105,109,112,111,114,116,32, - 109,111,100,96,96,32,119,111,117,108,100,32,104,97,118,101, - 32,97,32,39,108,101,118,101,108,39,32,111,102,32,50,41, - 46,10,10,32,32,32,32,114,25,0,0,0,78,114,135,0, - 0,0,114,148,0,0,0,41,9,114,216,0,0,0,114,227, - 0,0,0,218,9,112,97,114,116,105,116,105,111,110,114,195, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,9,0, - 0,0,114,11,0,0,0,114,221,0,0,0,41,9,114,20, - 0,0,0,114,226,0,0,0,218,6,108,111,99,97,108,115, - 114,222,0,0,0,114,197,0,0,0,114,104,0,0,0,90, - 8,103,108,111,98,97,108,115,95,114,196,0,0,0,90,7, - 99,117,116,95,111,102,102,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,10,95,95,105,109,112,111,114,116, - 95,95,92,4,0,0,115,32,0,0,0,8,11,10,1,16, - 2,8,1,12,1,4,1,8,3,18,1,4,1,4,1,26, - 4,30,3,10,1,12,1,4,2,255,128,114,230,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, - 160,1,124,0,161,1,125,1,124,1,100,0,117,0,114,30, - 116,2,100,1,124,0,23,0,131,1,130,1,116,3,124,1, - 131,1,83,0,41,2,78,122,25,110,111,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,32,110,97,109,101, - 100,32,41,4,114,169,0,0,0,114,177,0,0,0,114,83, - 0,0,0,114,167,0,0,0,41,2,114,20,0,0,0,114, - 103,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,18,95,98,117,105,108,116,105,110,95,102,114, - 111,109,95,110,97,109,101,129,4,0,0,115,10,0,0,0, - 10,1,8,1,12,1,8,1,255,128,114,231,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, - 5,0,0,0,67,0,0,0,115,166,0,0,0,124,1,97, - 0,124,0,97,1,116,2,116,1,131,1,125,2,116,1,106, - 3,160,4,161,0,68,0,93,72,92,2,125,3,125,4,116, - 5,124,4,124,2,131,2,114,98,124,3,116,1,106,6,118, - 0,114,60,116,7,125,5,110,18,116,0,160,8,124,3,161, - 1,114,76,116,9,125,5,110,2,113,26,116,10,124,4,124, - 5,131,2,125,6,116,11,124,6,124,4,131,2,1,0,113, - 26,116,1,106,3,116,12,25,0,125,7,100,1,68,0,93, - 46,125,8,124,8,116,1,106,3,118,1,114,138,116,13,124, - 8,131,1,125,9,110,10,116,1,106,3,124,8,25,0,125, - 9,116,14,124,7,124,8,124,9,131,3,1,0,113,114,100, - 2,83,0,41,3,122,250,83,101,116,117,112,32,105,109,112, - 111,114,116,108,105,98,32,98,121,32,105,109,112,111,114,116, - 105,110,103,32,110,101,101,100,101,100,32,98,117,105,108,116, - 45,105,110,32,109,111,100,117,108,101,115,32,97,110,100,32, - 105,110,106,101,99,116,105,110,103,32,116,104,101,109,10,32, - 32,32,32,105,110,116,111,32,116,104,101,32,103,108,111,98, - 97,108,32,110,97,109,101,115,112,97,99,101,46,10,10,32, - 32,32,32,65,115,32,115,121,115,32,105,115,32,110,101,101, - 100,101,100,32,102,111,114,32,115,121,115,46,109,111,100,117, - 108,101,115,32,97,99,99,101,115,115,32,97,110,100,32,95, - 105,109,112,32,105,115,32,110,101,101,100,101,100,32,116,111, - 32,108,111,97,100,32,98,117,105,108,116,45,105,110,10,32, - 32,32,32,109,111,100,117,108,101,115,44,32,116,104,111,115, - 101,32,116,119,111,32,109,111,100,117,108,101,115,32,109,117, - 115,116,32,98,101,32,101,120,112,108,105,99,105,116,108,121, - 32,112,97,115,115,101,100,32,105,110,46,10,10,32,32,32, - 32,41,3,114,26,0,0,0,114,95,0,0,0,114,68,0, - 0,0,78,41,15,114,61,0,0,0,114,18,0,0,0,114, - 3,0,0,0,114,99,0,0,0,218,5,105,116,101,109,115, - 114,203,0,0,0,114,82,0,0,0,114,169,0,0,0,114, - 92,0,0,0,114,184,0,0,0,114,149,0,0,0,114,155, - 0,0,0,114,9,0,0,0,114,231,0,0,0,114,12,0, - 0,0,41,10,218,10,115,121,115,95,109,111,100,117,108,101, - 218,11,95,105,109,112,95,109,111,100,117,108,101,90,11,109, - 111,100,117,108,101,95,116,121,112,101,114,20,0,0,0,114, - 104,0,0,0,114,116,0,0,0,114,103,0,0,0,90,11, - 115,101,108,102,95,109,111,100,117,108,101,90,12,98,117,105, - 108,116,105,110,95,110,97,109,101,90,14,98,117,105,108,116, - 105,110,95,109,111,100,117,108,101,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,6,95,115,101,116,117,112, - 136,4,0,0,115,42,0,0,0,4,9,4,1,8,3,18, - 1,10,1,10,1,6,1,10,1,6,1,2,2,10,1,10, - 1,2,128,10,3,8,1,10,1,10,1,10,2,14,1,4, - 251,255,128,114,235,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, - 0,115,38,0,0,0,116,0,124,0,124,1,131,2,1,0, - 116,1,106,2,160,3,116,4,161,1,1,0,116,1,106,2, - 160,3,116,5,161,1,1,0,100,1,83,0,41,2,122,48, - 73,110,115,116,97,108,108,32,105,109,112,111,114,116,101,114, - 115,32,102,111,114,32,98,117,105,108,116,105,110,32,97,110, - 100,32,102,114,111,122,101,110,32,109,111,100,117,108,101,115, - 78,41,6,114,235,0,0,0,114,18,0,0,0,114,201,0, - 0,0,114,126,0,0,0,114,169,0,0,0,114,184,0,0, - 0,41,2,114,233,0,0,0,114,234,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,8,95,105, - 110,115,116,97,108,108,171,4,0,0,115,8,0,0,0,10, - 2,12,2,16,1,255,128,114,236,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,67,0,0,0,115,32,0,0,0,100,1,100,2,108,0, - 125,0,124,0,97,1,124,0,160,2,116,3,106,4,116,5, - 25,0,161,1,1,0,100,2,83,0,41,3,122,57,73,110, - 115,116,97,108,108,32,105,109,112,111,114,116,101,114,115,32, - 116,104,97,116,32,114,101,113,117,105,114,101,32,101,120,116, - 101,114,110,97,108,32,102,105,108,101,115,121,115,116,101,109, - 32,97,99,99,101,115,115,114,25,0,0,0,78,41,6,218, - 26,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, - 105,98,95,101,120,116,101,114,110,97,108,114,133,0,0,0, - 114,236,0,0,0,114,18,0,0,0,114,99,0,0,0,114, - 9,0,0,0,41,1,114,237,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,27,95,105,110,115, - 116,97,108,108,95,101,120,116,101,114,110,97,108,95,105,109, - 112,111,114,116,101,114,115,179,4,0,0,115,8,0,0,0, - 8,3,4,1,20,1,255,128,114,238,0,0,0,41,2,78, - 78,41,1,78,41,2,78,114,25,0,0,0,41,4,78,78, - 114,5,0,0,0,114,25,0,0,0,41,54,114,10,0,0, - 0,114,7,0,0,0,114,26,0,0,0,114,95,0,0,0, - 114,68,0,0,0,114,133,0,0,0,114,17,0,0,0,114, - 21,0,0,0,114,63,0,0,0,114,37,0,0,0,114,47, - 0,0,0,114,22,0,0,0,114,23,0,0,0,114,53,0, - 0,0,114,54,0,0,0,114,57,0,0,0,114,69,0,0, - 0,114,71,0,0,0,114,80,0,0,0,114,90,0,0,0, - 114,94,0,0,0,114,105,0,0,0,114,118,0,0,0,114, - 119,0,0,0,114,98,0,0,0,114,149,0,0,0,114,155, - 0,0,0,114,159,0,0,0,114,114,0,0,0,114,100,0, - 0,0,114,166,0,0,0,114,167,0,0,0,114,101,0,0, - 0,114,169,0,0,0,114,184,0,0,0,114,189,0,0,0, - 114,198,0,0,0,114,200,0,0,0,114,202,0,0,0,114, - 208,0,0,0,90,15,95,69,82,82,95,77,83,71,95,80, - 82,69,70,73,88,114,210,0,0,0,114,213,0,0,0,218, - 6,111,98,106,101,99,116,114,214,0,0,0,114,215,0,0, - 0,114,216,0,0,0,114,221,0,0,0,114,227,0,0,0, - 114,230,0,0,0,114,231,0,0,0,114,235,0,0,0,114, - 236,0,0,0,114,238,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,8,60, - 109,111,100,117,108,101,62,1,0,0,0,115,106,0,0,0, - 4,0,8,22,4,9,4,1,4,1,4,3,8,3,8,8, - 4,8,4,2,16,3,14,4,14,77,14,21,8,16,8,37, - 8,17,14,11,8,8,8,11,8,12,8,19,14,36,16,101, - 10,26,14,45,8,72,8,17,8,17,8,30,8,36,8,45, - 14,15,14,75,14,80,8,13,8,9,10,9,8,47,4,16, - 8,1,8,2,6,32,8,3,10,16,14,15,8,37,10,27, - 8,37,8,7,8,35,12,8,255,128, + 114,199,0,0,0,121,3,0,0,115,10,0,0,0,8,0, + 4,2,8,2,12,4,255,128,114,199,0,0,0,99,3,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, + 0,0,67,0,0,0,115,64,0,0,0,124,1,160,0,100, + 1,124,2,100,2,24,0,161,2,125,3,116,1,124,3,131, + 1,124,2,107,0,114,36,116,2,100,3,131,1,130,1,124, + 3,100,4,25,0,125,4,124,0,114,60,100,5,160,3,124, + 4,124,0,161,2,83,0,124,4,83,0,41,7,122,50,82, + 101,115,111,108,118,101,32,97,32,114,101,108,97,116,105,118, + 101,32,109,111,100,117,108,101,32,110,97,109,101,32,116,111, + 32,97,110,32,97,98,115,111,108,117,116,101,32,111,110,101, + 46,114,141,0,0,0,114,42,0,0,0,122,50,97,116,116, + 101,109,112,116,101,100,32,114,101,108,97,116,105,118,101,32, + 105,109,112,111,114,116,32,98,101,121,111,110,100,32,116,111, + 112,45,108,101,118,101,108,32,112,97,99,107,97,103,101,114, + 25,0,0,0,250,5,123,125,46,123,125,78,41,4,218,6, + 114,115,112,108,105,116,218,3,108,101,110,114,87,0,0,0, + 114,50,0,0,0,41,5,114,20,0,0,0,218,7,112,97, + 99,107,97,103,101,218,5,108,101,118,101,108,90,4,98,105, + 116,115,90,4,98,97,115,101,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,13,95,114,101,115,111,108,118, + 101,95,110,97,109,101,134,3,0,0,115,12,0,0,0,16, + 2,12,1,8,1,8,1,20,1,255,128,114,210,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,34,0,0,0,124,0, + 160,0,124,1,124,2,161,2,125,3,124,3,100,0,117,0, + 114,24,100,0,83,0,116,1,124,1,124,3,131,2,83,0, + 114,0,0,0,0,41,2,114,184,0,0,0,114,104,0,0, + 0,41,4,218,6,102,105,110,100,101,114,114,20,0,0,0, + 114,181,0,0,0,114,122,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,17,95,102,105,110,100, + 95,115,112,101,99,95,108,101,103,97,99,121,143,3,0,0, + 115,10,0,0,0,12,3,8,1,4,1,10,1,255,128,114, + 212,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,10,0,0,0,10,0,0,0,67,0,0,0,115,36,1, + 0,0,116,0,106,1,125,3,124,3,100,1,117,0,114,22, + 116,2,100,2,131,1,130,1,124,3,115,38,116,3,160,4, + 100,3,116,5,161,2,1,0,124,0,116,0,106,6,118,0, + 125,4,124,3,68,0,93,230,125,5,116,7,131,0,143,94, + 1,0,122,10,124,5,106,8,125,6,87,0,110,54,4,0, + 116,9,144,1,121,34,1,0,1,0,1,0,116,10,124,5, + 124,0,124,1,131,3,125,7,124,7,100,1,117,0,114,126, + 89,0,87,0,100,1,4,0,4,0,131,3,1,0,113,52, + 89,0,110,12,124,6,124,0,124,1,124,2,131,3,125,7, + 87,0,100,1,4,0,4,0,131,3,1,0,110,16,49,0, + 115,162,119,1,1,0,1,0,1,0,89,0,1,0,124,7, + 100,1,117,1,144,1,114,26,124,4,144,1,115,18,124,0, + 116,0,106,6,118,0,144,1,114,18,116,0,106,6,124,0, + 25,0,125,8,122,10,124,8,106,11,125,9,87,0,110,26, + 4,0,116,9,144,1,121,32,1,0,1,0,1,0,124,7, + 6,0,89,0,2,0,1,0,83,0,124,9,100,1,117,0, + 144,1,114,10,124,7,2,0,1,0,83,0,124,9,2,0, + 1,0,83,0,124,7,2,0,1,0,83,0,113,52,100,1, + 83,0,119,0,119,0,41,4,122,21,70,105,110,100,32,97, + 32,109,111,100,117,108,101,39,115,32,115,112,101,99,46,78, + 122,53,115,121,115,46,109,101,116,97,95,112,97,116,104,32, + 105,115,32,78,111,110,101,44,32,80,121,116,104,111,110,32, + 105,115,32,108,105,107,101,108,121,32,115,104,117,116,116,105, + 110,103,32,100,111,119,110,122,22,115,121,115,46,109,101,116, + 97,95,112,97,116,104,32,105,115,32,101,109,112,116,121,41, + 12,114,18,0,0,0,218,9,109,101,116,97,95,112,97,116, + 104,114,87,0,0,0,114,101,0,0,0,114,102,0,0,0, + 114,169,0,0,0,114,105,0,0,0,114,199,0,0,0,114, + 183,0,0,0,114,2,0,0,0,114,212,0,0,0,114,119, + 0,0,0,41,10,114,20,0,0,0,114,181,0,0,0,114, + 182,0,0,0,114,213,0,0,0,90,9,105,115,95,114,101, + 108,111,97,100,114,211,0,0,0,114,183,0,0,0,114,109, + 0,0,0,114,110,0,0,0,114,119,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,10,95,102, + 105,110,100,95,115,112,101,99,152,3,0,0,115,66,0,0, + 0,6,2,8,1,8,2,4,3,12,1,10,5,8,1,8, + 1,2,1,10,1,14,1,12,1,8,1,16,1,4,255,12, + 3,30,128,10,1,18,2,10,1,2,1,10,1,14,1,12, + 4,10,2,8,1,8,2,8,2,2,239,4,19,2,243,2, + 244,255,128,114,214,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0, + 0,115,110,0,0,0,116,0,124,0,116,1,131,2,115,28, + 116,2,100,1,160,3,116,4,124,0,131,1,161,1,131,1, + 130,1,124,2,100,2,107,0,114,44,116,5,100,3,131,1, + 130,1,124,2,100,2,107,4,114,82,116,0,124,1,116,1, + 131,2,115,70,116,2,100,4,131,1,130,1,124,1,115,82, + 116,6,100,5,131,1,130,1,124,0,115,106,124,2,100,2, + 107,2,114,102,116,5,100,6,131,1,130,1,100,7,83,0, + 100,7,83,0,41,8,122,28,86,101,114,105,102,121,32,97, + 114,103,117,109,101,110,116,115,32,97,114,101,32,34,115,97, + 110,101,34,46,122,31,109,111,100,117,108,101,32,110,97,109, + 101,32,109,117,115,116,32,98,101,32,115,116,114,44,32,110, + 111,116,32,123,125,114,25,0,0,0,122,18,108,101,118,101, + 108,32,109,117,115,116,32,98,101,32,62,61,32,48,122,31, + 95,95,112,97,99,107,97,103,101,95,95,32,110,111,116,32, + 115,101,116,32,116,111,32,97,32,115,116,114,105,110,103,122, + 54,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, + 105,118,101,32,105,109,112,111,114,116,32,119,105,116,104,32, + 110,111,32,107,110,111,119,110,32,112,97,114,101,110,116,32, + 112,97,99,107,97,103,101,122,17,69,109,112,116,121,32,109, + 111,100,117,108,101,32,110,97,109,101,78,41,7,218,10,105, + 115,105,110,115,116,97,110,99,101,218,3,115,116,114,218,9, + 84,121,112,101,69,114,114,111,114,114,50,0,0,0,114,3, + 0,0,0,218,10,86,97,108,117,101,69,114,114,111,114,114, + 87,0,0,0,169,3,114,20,0,0,0,114,208,0,0,0, + 114,209,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,13,95,115,97,110,105,116,121,95,99,104, + 101,99,107,199,3,0,0,115,26,0,0,0,10,2,18,1, + 8,1,8,1,8,1,10,1,8,1,4,1,8,1,12,2, + 8,1,8,255,255,128,114,220,0,0,0,122,16,78,111,32, + 109,111,100,117,108,101,32,110,97,109,101,100,32,122,4,123, + 33,114,125,99,2,0,0,0,0,0,0,0,0,0,0,0, + 9,0,0,0,8,0,0,0,67,0,0,0,115,22,1,0, + 0,100,0,125,2,124,0,160,0,100,1,161,1,100,2,25, + 0,125,3,124,3,114,128,124,3,116,1,106,2,118,1,114, + 42,116,3,124,1,124,3,131,2,1,0,124,0,116,1,106, + 2,118,0,114,62,116,1,106,2,124,0,25,0,83,0,116, + 1,106,2,124,3,25,0,125,4,122,10,124,4,106,4,125, + 2,87,0,110,44,4,0,116,5,144,1,121,20,1,0,1, + 0,1,0,116,6,100,3,23,0,160,7,124,0,124,3,161, + 2,125,5,116,8,124,5,124,0,100,4,141,2,100,0,130, + 2,116,9,124,0,124,2,131,2,125,6,124,6,100,0,117, + 0,114,164,116,8,116,6,160,7,124,0,161,1,124,0,100, + 4,141,2,130,1,116,10,124,6,131,1,125,7,124,3,144, + 1,114,14,116,1,106,2,124,3,25,0,125,4,124,0,160, + 0,100,1,161,1,100,5,25,0,125,8,122,18,116,11,124, + 4,124,8,124,7,131,3,1,0,87,0,124,7,83,0,4, + 0,116,5,144,1,121,18,1,0,1,0,1,0,100,6,124, + 3,155,2,100,7,124,8,155,2,157,4,125,5,116,12,160, + 13,124,5,116,14,161,2,1,0,89,0,124,7,83,0,124, + 7,83,0,119,0,119,0,41,8,78,114,141,0,0,0,114, + 25,0,0,0,122,23,59,32,123,33,114,125,32,105,115,32, + 110,111,116,32,97,32,112,97,99,107,97,103,101,114,19,0, + 0,0,233,2,0,0,0,122,27,67,97,110,110,111,116,32, + 115,101,116,32,97,110,32,97,116,116,114,105,98,117,116,101, + 32,111,110,32,122,18,32,102,111,114,32,99,104,105,108,100, + 32,109,111,100,117,108,101,32,41,15,114,142,0,0,0,114, + 18,0,0,0,114,105,0,0,0,114,74,0,0,0,114,154, + 0,0,0,114,2,0,0,0,218,8,95,69,82,82,95,77, + 83,71,114,50,0,0,0,218,19,77,111,100,117,108,101,78, + 111,116,70,111,117,110,100,69,114,114,111,114,114,214,0,0, + 0,114,173,0,0,0,114,12,0,0,0,114,101,0,0,0, + 114,102,0,0,0,114,169,0,0,0,41,9,114,20,0,0, + 0,218,7,105,109,112,111,114,116,95,114,181,0,0,0,114, + 143,0,0,0,90,13,112,97,114,101,110,116,95,109,111,100, + 117,108,101,114,108,0,0,0,114,109,0,0,0,114,110,0, + 0,0,90,5,99,104,105,108,100,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,95, + 97,110,100,95,108,111,97,100,95,117,110,108,111,99,107,101, + 100,218,3,0,0,115,60,0,0,0,4,1,14,1,4,1, + 10,1,10,1,10,2,10,1,10,1,2,1,10,1,14,1, + 16,1,14,1,10,1,8,1,18,1,8,2,6,1,10,2, + 14,1,2,1,14,1,4,4,14,253,16,1,14,1,8,1, + 2,253,2,242,255,128,114,225,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,8,0,0,0, + 67,0,0,0,115,128,0,0,0,116,0,124,0,131,1,143, + 62,1,0,116,1,106,2,160,3,124,0,116,4,161,2,125, + 2,124,2,116,4,117,0,114,56,116,5,124,0,124,1,131, + 2,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, + 0,87,0,100,1,4,0,4,0,131,3,1,0,110,16,49, + 0,115,76,119,1,1,0,1,0,1,0,89,0,1,0,124, + 2,100,1,117,0,114,116,100,2,160,6,124,0,161,1,125, + 3,116,7,124,3,124,0,100,3,141,2,130,1,116,8,124, + 0,131,1,1,0,124,2,83,0,41,4,122,25,70,105,110, + 100,32,97,110,100,32,108,111,97,100,32,116,104,101,32,109, + 111,100,117,108,101,46,78,122,40,105,109,112,111,114,116,32, + 111,102,32,123,125,32,104,97,108,116,101,100,59,32,78,111, + 110,101,32,105,110,32,115,121,115,46,109,111,100,117,108,101, + 115,114,19,0,0,0,41,9,114,57,0,0,0,114,18,0, + 0,0,114,105,0,0,0,114,38,0,0,0,218,14,95,78, + 69,69,68,83,95,76,79,65,68,73,78,71,114,225,0,0, + 0,114,50,0,0,0,114,223,0,0,0,114,72,0,0,0, + 41,4,114,20,0,0,0,114,224,0,0,0,114,110,0,0, + 0,114,82,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,14,95,102,105,110,100,95,97,110,100, + 95,108,111,97,100,253,3,0,0,115,28,0,0,0,10,2, + 14,1,8,1,24,1,14,255,16,128,8,3,4,1,2,1, + 4,255,12,2,8,2,4,1,255,128,114,227,0,0,0,114, + 25,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,4,0,0,0,67,0,0,0,115,42,0, + 0,0,116,0,124,0,124,1,124,2,131,3,1,0,124,2, + 100,1,107,4,114,32,116,1,124,0,124,1,124,2,131,3, + 125,0,116,2,124,0,116,3,131,2,83,0,41,3,97,50, + 1,0,0,73,109,112,111,114,116,32,97,110,100,32,114,101, + 116,117,114,110,32,116,104,101,32,109,111,100,117,108,101,32, + 98,97,115,101,100,32,111,110,32,105,116,115,32,110,97,109, + 101,44,32,116,104,101,32,112,97,99,107,97,103,101,32,116, + 104,101,32,99,97,108,108,32,105,115,10,32,32,32,32,98, + 101,105,110,103,32,109,97,100,101,32,102,114,111,109,44,32, + 97,110,100,32,116,104,101,32,108,101,118,101,108,32,97,100, + 106,117,115,116,109,101,110,116,46,10,10,32,32,32,32,84, + 104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,112, + 114,101,115,101,110,116,115,32,116,104,101,32,103,114,101,97, + 116,101,115,116,32,99,111,109,109,111,110,32,100,101,110,111, + 109,105,110,97,116,111,114,32,111,102,32,102,117,110,99,116, + 105,111,110,97,108,105,116,121,10,32,32,32,32,98,101,116, + 119,101,101,110,32,105,109,112,111,114,116,95,109,111,100,117, + 108,101,32,97,110,100,32,95,95,105,109,112,111,114,116,95, + 95,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115, + 32,115,101,116,116,105,110,103,32,95,95,112,97,99,107,97, + 103,101,95,95,32,105,102,10,32,32,32,32,116,104,101,32, + 108,111,97,100,101,114,32,100,105,100,32,110,111,116,46,10, + 10,32,32,32,32,114,25,0,0,0,78,41,4,114,220,0, + 0,0,114,210,0,0,0,114,227,0,0,0,218,11,95,103, + 99,100,95,105,109,112,111,114,116,114,219,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,228,0, + 0,0,13,4,0,0,115,10,0,0,0,12,9,8,1,12, + 1,10,1,255,128,114,228,0,0,0,169,1,218,9,114,101, + 99,117,114,115,105,118,101,99,3,0,0,0,0,0,0,0, + 1,0,0,0,8,0,0,0,11,0,0,0,67,0,0,0, + 115,218,0,0,0,124,1,68,0,93,206,125,4,116,0,124, + 4,116,1,131,2,115,64,124,3,114,34,124,0,106,2,100, + 1,23,0,125,5,110,4,100,2,125,5,116,3,100,3,124, + 5,155,0,100,4,116,4,124,4,131,1,106,2,155,0,157, + 4,131,1,130,1,124,4,100,5,107,2,114,106,124,3,115, + 104,116,5,124,0,100,6,131,2,114,104,116,6,124,0,124, + 0,106,7,124,2,100,7,100,8,141,4,1,0,113,4,116, + 5,124,0,124,4,131,2,115,210,100,9,160,8,124,0,106, + 2,124,4,161,2,125,6,122,14,116,9,124,2,124,6,131, + 2,1,0,87,0,113,4,4,0,116,10,121,216,1,0,125, + 7,1,0,122,42,124,7,106,11,124,6,107,2,114,200,116, + 12,106,13,160,14,124,6,116,15,161,2,100,10,117,1,114, + 200,87,0,89,0,100,10,125,7,126,7,113,4,130,0,100, + 10,125,7,126,7,119,1,113,4,124,0,83,0,119,0,41, + 11,122,238,70,105,103,117,114,101,32,111,117,116,32,119,104, + 97,116,32,95,95,105,109,112,111,114,116,95,95,32,115,104, + 111,117,108,100,32,114,101,116,117,114,110,46,10,10,32,32, + 32,32,84,104,101,32,105,109,112,111,114,116,95,32,112,97, + 114,97,109,101,116,101,114,32,105,115,32,97,32,99,97,108, + 108,97,98,108,101,32,119,104,105,99,104,32,116,97,107,101, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,109,111, + 100,117,108,101,32,116,111,10,32,32,32,32,105,109,112,111, + 114,116,46,32,73,116,32,105,115,32,114,101,113,117,105,114, + 101,100,32,116,111,32,100,101,99,111,117,112,108,101,32,116, + 104,101,32,102,117,110,99,116,105,111,110,32,102,114,111,109, + 32,97,115,115,117,109,105,110,103,32,105,109,112,111,114,116, + 108,105,98,39,115,10,32,32,32,32,105,109,112,111,114,116, + 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, + 105,115,32,100,101,115,105,114,101,100,46,10,10,32,32,32, + 32,122,8,46,95,95,97,108,108,95,95,122,13,96,96,102, + 114,111,109,32,108,105,115,116,39,39,122,8,73,116,101,109, + 32,105,110,32,122,18,32,109,117,115,116,32,98,101,32,115, + 116,114,44,32,110,111,116,32,250,1,42,218,7,95,95,97, + 108,108,95,95,84,114,229,0,0,0,114,205,0,0,0,78, + 41,16,114,215,0,0,0,114,216,0,0,0,114,9,0,0, + 0,114,217,0,0,0,114,3,0,0,0,114,11,0,0,0, + 218,16,95,104,97,110,100,108,101,95,102,114,111,109,108,105, + 115,116,114,232,0,0,0,114,50,0,0,0,114,74,0,0, + 0,114,223,0,0,0,114,20,0,0,0,114,18,0,0,0, + 114,105,0,0,0,114,38,0,0,0,114,226,0,0,0,41, + 8,114,110,0,0,0,218,8,102,114,111,109,108,105,115,116, + 114,224,0,0,0,114,230,0,0,0,218,1,120,90,5,119, + 104,101,114,101,90,9,102,114,111,109,95,110,97,109,101,90, + 3,101,120,99,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,233,0,0,0,28,4,0,0,115,58,0,0, + 0,8,10,10,1,4,1,12,1,4,2,10,1,8,1,8, + 255,8,2,14,1,10,1,2,1,6,255,2,128,10,2,14, + 1,2,1,14,1,14,1,10,4,16,1,2,255,12,2,2, + 1,8,128,2,245,4,12,2,248,255,128,114,233,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,6,0,0,0,67,0,0,0,115,146,0,0,0,124,0, + 160,0,100,1,161,1,125,1,124,0,160,0,100,2,161,1, + 125,2,124,1,100,3,117,1,114,82,124,2,100,3,117,1, + 114,78,124,1,124,2,106,1,107,3,114,78,116,2,106,3, + 100,4,124,1,155,2,100,5,124,2,106,1,155,2,100,6, + 157,5,116,4,100,7,100,8,141,3,1,0,124,1,83,0, + 124,2,100,3,117,1,114,96,124,2,106,1,83,0,116,2, + 106,3,100,9,116,4,100,7,100,8,141,3,1,0,124,0, + 100,10,25,0,125,1,100,11,124,0,118,1,114,142,124,1, + 160,5,100,12,161,1,100,13,25,0,125,1,124,1,83,0, + 41,14,122,167,67,97,108,99,117,108,97,116,101,32,119,104, + 97,116,32,95,95,112,97,99,107,97,103,101,95,95,32,115, + 104,111,117,108,100,32,98,101,46,10,10,32,32,32,32,95, + 95,112,97,99,107,97,103,101,95,95,32,105,115,32,110,111, + 116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32, + 98,101,32,100,101,102,105,110,101,100,32,111,114,32,99,111, + 117,108,100,32,98,101,32,115,101,116,32,116,111,32,78,111, + 110,101,10,32,32,32,32,116,111,32,114,101,112,114,101,115, + 101,110,116,32,116,104,97,116,32,105,116,115,32,112,114,111, + 112,101,114,32,118,97,108,117,101,32,105,115,32,117,110,107, + 110,111,119,110,46,10,10,32,32,32,32,114,158,0,0,0, + 114,119,0,0,0,78,122,32,95,95,112,97,99,107,97,103, + 101,95,95,32,33,61,32,95,95,115,112,101,99,95,95,46, + 112,97,114,101,110,116,32,40,122,4,32,33,61,32,250,1, + 41,233,3,0,0,0,41,1,90,10,115,116,97,99,107,108, + 101,118,101,108,122,89,99,97,110,39,116,32,114,101,115,111, + 108,118,101,32,112,97,99,107,97,103,101,32,102,114,111,109, + 32,95,95,115,112,101,99,95,95,32,111,114,32,95,95,112, + 97,99,107,97,103,101,95,95,44,32,102,97,108,108,105,110, + 103,32,98,97,99,107,32,111,110,32,95,95,110,97,109,101, + 95,95,32,97,110,100,32,95,95,112,97,116,104,95,95,114, + 9,0,0,0,114,154,0,0,0,114,141,0,0,0,114,25, + 0,0,0,41,6,114,38,0,0,0,114,143,0,0,0,114, + 101,0,0,0,114,102,0,0,0,114,169,0,0,0,114,142, + 0,0,0,41,3,218,7,103,108,111,98,97,108,115,114,208, + 0,0,0,114,109,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,17,95,99,97,108,99,95,95, + 95,112,97,99,107,97,103,101,95,95,65,4,0,0,115,44, + 0,0,0,10,7,10,1,8,1,18,1,6,1,2,1,4, + 255,4,1,6,255,4,2,6,254,4,3,8,1,6,1,6, + 2,4,2,6,254,8,3,8,1,14,1,4,1,255,128,114, + 239,0,0,0,114,5,0,0,0,99,5,0,0,0,0,0, + 0,0,0,0,0,0,9,0,0,0,5,0,0,0,67,0, + 0,0,115,174,0,0,0,124,4,100,1,107,2,114,18,116, + 0,124,0,131,1,125,5,110,36,124,1,100,2,117,1,114, + 30,124,1,110,2,105,0,125,6,116,1,124,6,131,1,125, + 7,116,0,124,0,124,7,124,4,131,3,125,5,124,3,115, + 148,124,4,100,1,107,2,114,84,116,0,124,0,160,2,100, + 3,161,1,100,1,25,0,131,1,83,0,124,0,115,92,124, + 5,83,0,116,3,124,0,131,1,116,3,124,0,160,2,100, + 3,161,1,100,1,25,0,131,1,24,0,125,8,116,4,106, + 5,124,5,106,6,100,2,116,3,124,5,106,6,131,1,124, + 8,24,0,133,2,25,0,25,0,83,0,116,7,124,5,100, + 4,131,2,114,170,116,8,124,5,124,3,116,0,131,3,83, + 0,124,5,83,0,41,5,97,215,1,0,0,73,109,112,111, + 114,116,32,97,32,109,111,100,117,108,101,46,10,10,32,32, + 32,32,84,104,101,32,39,103,108,111,98,97,108,115,39,32, + 97,114,103,117,109,101,110,116,32,105,115,32,117,115,101,100, + 32,116,111,32,105,110,102,101,114,32,119,104,101,114,101,32, + 116,104,101,32,105,109,112,111,114,116,32,105,115,32,111,99, + 99,117,114,114,105,110,103,32,102,114,111,109,10,32,32,32, + 32,116,111,32,104,97,110,100,108,101,32,114,101,108,97,116, + 105,118,101,32,105,109,112,111,114,116,115,46,32,84,104,101, + 32,39,108,111,99,97,108,115,39,32,97,114,103,117,109,101, + 110,116,32,105,115,32,105,103,110,111,114,101,100,46,32,84, + 104,101,10,32,32,32,32,39,102,114,111,109,108,105,115,116, + 39,32,97,114,103,117,109,101,110,116,32,115,112,101,99,105, + 102,105,101,115,32,119,104,97,116,32,115,104,111,117,108,100, + 32,101,120,105,115,116,32,97,115,32,97,116,116,114,105,98, + 117,116,101,115,32,111,110,32,116,104,101,32,109,111,100,117, + 108,101,10,32,32,32,32,98,101,105,110,103,32,105,109,112, + 111,114,116,101,100,32,40,101,46,103,46,32,96,96,102,114, + 111,109,32,109,111,100,117,108,101,32,105,109,112,111,114,116, + 32,60,102,114,111,109,108,105,115,116,62,96,96,41,46,32, + 32,84,104,101,32,39,108,101,118,101,108,39,10,32,32,32, + 32,97,114,103,117,109,101,110,116,32,114,101,112,114,101,115, + 101,110,116,115,32,116,104,101,32,112,97,99,107,97,103,101, + 32,108,111,99,97,116,105,111,110,32,116,111,32,105,109,112, + 111,114,116,32,102,114,111,109,32,105,110,32,97,32,114,101, + 108,97,116,105,118,101,10,32,32,32,32,105,109,112,111,114, + 116,32,40,101,46,103,46,32,96,96,102,114,111,109,32,46, + 46,112,107,103,32,105,109,112,111,114,116,32,109,111,100,96, + 96,32,119,111,117,108,100,32,104,97,118,101,32,97,32,39, + 108,101,118,101,108,39,32,111,102,32,50,41,46,10,10,32, + 32,32,32,114,25,0,0,0,78,114,141,0,0,0,114,154, + 0,0,0,41,9,114,228,0,0,0,114,239,0,0,0,218, + 9,112,97,114,116,105,116,105,111,110,114,207,0,0,0,114, + 18,0,0,0,114,105,0,0,0,114,9,0,0,0,114,11, + 0,0,0,114,233,0,0,0,41,9,114,20,0,0,0,114, + 238,0,0,0,218,6,108,111,99,97,108,115,114,234,0,0, + 0,114,209,0,0,0,114,110,0,0,0,90,8,103,108,111, + 98,97,108,115,95,114,208,0,0,0,90,7,99,117,116,95, + 111,102,102,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,10,95,95,105,109,112,111,114,116,95,95,92,4, + 0,0,115,32,0,0,0,8,11,10,1,16,2,8,1,12, + 1,4,1,8,3,18,1,4,1,4,1,26,4,30,3,10, + 1,12,1,4,2,255,128,114,242,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,67,0,0,0,115,38,0,0,0,116,0,160,1,124,0, + 161,1,125,1,124,1,100,0,117,0,114,30,116,2,100,1, + 124,0,23,0,131,1,130,1,116,3,124,1,131,1,83,0, + 41,2,78,122,25,110,111,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,32,110,97,109,101,100,32,41,4, + 114,175,0,0,0,114,183,0,0,0,114,87,0,0,0,114, + 173,0,0,0,41,2,114,20,0,0,0,114,109,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 18,95,98,117,105,108,116,105,110,95,102,114,111,109,95,110, + 97,109,101,129,4,0,0,115,10,0,0,0,10,1,8,1, + 12,1,8,1,255,128,114,243,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,10,0,0,0,5,0,0,0, + 67,0,0,0,115,166,0,0,0,124,1,97,0,124,0,97, + 1,116,2,116,1,131,1,125,2,116,1,106,3,160,4,161, + 0,68,0,93,72,92,2,125,3,125,4,116,5,124,4,124, + 2,131,2,114,98,124,3,116,1,106,6,118,0,114,60,116, + 7,125,5,110,18,116,0,160,8,124,3,161,1,114,76,116, + 9,125,5,110,2,113,26,116,10,124,4,124,5,131,2,125, + 6,116,11,124,6,124,4,131,2,1,0,113,26,116,1,106, + 3,116,12,25,0,125,7,100,1,68,0,93,46,125,8,124, + 8,116,1,106,3,118,1,114,138,116,13,124,8,131,1,125, + 9,110,10,116,1,106,3,124,8,25,0,125,9,116,14,124, + 7,124,8,124,9,131,3,1,0,113,114,100,2,83,0,41, + 3,122,250,83,101,116,117,112,32,105,109,112,111,114,116,108, + 105,98,32,98,121,32,105,109,112,111,114,116,105,110,103,32, + 110,101,101,100,101,100,32,98,117,105,108,116,45,105,110,32, + 109,111,100,117,108,101,115,32,97,110,100,32,105,110,106,101, + 99,116,105,110,103,32,116,104,101,109,10,32,32,32,32,105, + 110,116,111,32,116,104,101,32,103,108,111,98,97,108,32,110, + 97,109,101,115,112,97,99,101,46,10,10,32,32,32,32,65, + 115,32,115,121,115,32,105,115,32,110,101,101,100,101,100,32, + 102,111,114,32,115,121,115,46,109,111,100,117,108,101,115,32, + 97,99,99,101,115,115,32,97,110,100,32,95,105,109,112,32, + 105,115,32,110,101,101,100,101,100,32,116,111,32,108,111,97, + 100,32,98,117,105,108,116,45,105,110,10,32,32,32,32,109, + 111,100,117,108,101,115,44,32,116,104,111,115,101,32,116,119, + 111,32,109,111,100,117,108,101,115,32,109,117,115,116,32,98, + 101,32,101,120,112,108,105,99,105,116,108,121,32,112,97,115, + 115,101,100,32,105,110,46,10,10,32,32,32,32,41,3,114, + 26,0,0,0,114,101,0,0,0,114,71,0,0,0,78,41, + 15,114,64,0,0,0,114,18,0,0,0,114,3,0,0,0, + 114,105,0,0,0,218,5,105,116,101,109,115,114,215,0,0, + 0,114,86,0,0,0,114,175,0,0,0,114,98,0,0,0, + 114,192,0,0,0,114,155,0,0,0,114,161,0,0,0,114, + 9,0,0,0,114,243,0,0,0,114,12,0,0,0,41,10, + 218,10,115,121,115,95,109,111,100,117,108,101,218,11,95,105, + 109,112,95,109,111,100,117,108,101,90,11,109,111,100,117,108, + 101,95,116,121,112,101,114,20,0,0,0,114,110,0,0,0, + 114,122,0,0,0,114,109,0,0,0,90,11,115,101,108,102, + 95,109,111,100,117,108,101,90,12,98,117,105,108,116,105,110, + 95,110,97,109,101,90,14,98,117,105,108,116,105,110,95,109, + 111,100,117,108,101,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,6,95,115,101,116,117,112,136,4,0,0, + 115,42,0,0,0,4,9,4,1,8,3,18,1,10,1,10, + 1,6,1,10,1,6,1,2,2,10,1,10,1,2,128,10, + 3,8,1,10,1,10,1,10,2,14,1,4,251,255,128,114, + 247,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,38,0, + 0,0,116,0,124,0,124,1,131,2,1,0,116,1,106,2, + 160,3,116,4,161,1,1,0,116,1,106,2,160,3,116,5, + 161,1,1,0,100,1,83,0,41,2,122,48,73,110,115,116, + 97,108,108,32,105,109,112,111,114,116,101,114,115,32,102,111, + 114,32,98,117,105,108,116,105,110,32,97,110,100,32,102,114, + 111,122,101,110,32,109,111,100,117,108,101,115,78,41,6,114, + 247,0,0,0,114,18,0,0,0,114,213,0,0,0,114,132, + 0,0,0,114,175,0,0,0,114,192,0,0,0,41,2,114, + 245,0,0,0,114,246,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,8,95,105,110,115,116,97, + 108,108,171,4,0,0,115,8,0,0,0,10,2,12,2,16, + 1,255,128,114,248,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, + 0,115,32,0,0,0,100,1,100,2,108,0,125,0,124,0, + 97,1,124,0,160,2,116,3,106,4,116,5,25,0,161,1, + 1,0,100,2,83,0,41,3,122,57,73,110,115,116,97,108, + 108,32,105,109,112,111,114,116,101,114,115,32,116,104,97,116, + 32,114,101,113,117,105,114,101,32,101,120,116,101,114,110,97, + 108,32,102,105,108,101,115,121,115,116,101,109,32,97,99,99, + 101,115,115,114,25,0,0,0,78,41,6,218,26,95,102,114, + 111,122,101,110,95,105,109,112,111,114,116,108,105,98,95,101, + 120,116,101,114,110,97,108,114,139,0,0,0,114,248,0,0, + 0,114,18,0,0,0,114,105,0,0,0,114,9,0,0,0, + 41,1,114,249,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,27,95,105,110,115,116,97,108,108, + 95,101,120,116,101,114,110,97,108,95,105,109,112,111,114,116, + 101,114,115,179,4,0,0,115,8,0,0,0,8,3,4,1, + 20,1,255,128,114,250,0,0,0,41,2,78,78,41,1,78, + 41,2,78,114,25,0,0,0,41,4,78,78,114,5,0,0, + 0,114,25,0,0,0,41,54,114,10,0,0,0,114,7,0, + 0,0,114,26,0,0,0,114,101,0,0,0,114,71,0,0, + 0,114,139,0,0,0,114,17,0,0,0,114,21,0,0,0, + 114,66,0,0,0,114,37,0,0,0,114,47,0,0,0,114, + 22,0,0,0,114,23,0,0,0,114,55,0,0,0,114,57, + 0,0,0,114,60,0,0,0,114,72,0,0,0,114,74,0, + 0,0,114,83,0,0,0,114,95,0,0,0,114,100,0,0, + 0,114,111,0,0,0,114,124,0,0,0,114,125,0,0,0, + 114,104,0,0,0,114,155,0,0,0,114,161,0,0,0,114, + 165,0,0,0,114,120,0,0,0,114,106,0,0,0,114,172, + 0,0,0,114,173,0,0,0,114,107,0,0,0,114,175,0, + 0,0,114,192,0,0,0,114,199,0,0,0,114,210,0,0, + 0,114,212,0,0,0,114,214,0,0,0,114,220,0,0,0, + 90,15,95,69,82,82,95,77,83,71,95,80,82,69,70,73, + 88,114,222,0,0,0,114,225,0,0,0,218,6,111,98,106, + 101,99,116,114,226,0,0,0,114,227,0,0,0,114,228,0, + 0,0,114,233,0,0,0,114,239,0,0,0,114,242,0,0, + 0,114,243,0,0,0,114,247,0,0,0,114,248,0,0,0, + 114,250,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,8,60,109,111,100,117, + 108,101,62,1,0,0,0,115,106,0,0,0,4,0,8,22, + 4,9,4,1,4,1,4,3,8,3,8,8,4,8,4,2, + 16,3,14,4,14,77,14,21,8,16,8,37,8,17,14,11, + 8,8,8,11,8,12,8,19,14,36,16,101,10,26,14,45, + 8,72,8,17,8,17,8,30,8,36,8,45,14,15,14,75, + 14,80,8,13,8,9,10,9,8,47,4,16,8,1,8,2, + 6,32,8,3,10,16,14,15,8,37,10,27,8,37,8,7, + 8,35,12,8,255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index bdfdaa1feb8ef9..32ed87dab396e8 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -87,7 +87,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 83,0,41,1,250,1,58,114,7,0,0,0,41,2,114,5, 0,0,0,218,1,115,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,9,60,115,101,116,99,111,109,112,62, - 49,0,0,0,115,4,0,0,0,22,0,255,128,114,13,0, + 49,0,0,0,243,4,0,0,0,22,0,255,128,114,13,0, 0,0,41,1,218,3,119,105,110,41,2,90,6,99,121,103, 119,105,110,90,6,100,97,114,119,105,110,99,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, @@ -112,29 +112,29 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 218,3,95,111,115,90,7,101,110,118,105,114,111,110,114,7, 0,0,0,169,1,218,3,107,101,121,114,7,0,0,0,114, 8,0,0,0,218,11,95,114,101,108,97,120,95,99,97,115, - 101,66,0,0,0,115,4,0,0,0,20,2,255,128,122,37, + 101,66,0,0,0,243,4,0,0,0,20,2,255,128,122,37, 95,109,97,107,101,95,114,101,108,97,120,95,99,97,115,101, 46,60,108,111,99,97,108,115,62,46,95,114,101,108,97,120, 95,99,97,115,101,99,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,83,0,0,0,115,4, + 0,0,0,0,0,0,1,0,0,0,83,0,0,0,243,4, 0,0,0,100,1,83,0,41,3,122,53,84,114,117,101,32, 105,102,32,102,105,108,101,110,97,109,101,115,32,109,117,115, 116,32,98,101,32,99,104,101,99,107,101,100,32,99,97,115, 101,45,105,110,115,101,110,115,105,116,105,118,101,108,121,46, 70,78,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,21,0,0,0, - 70,0,0,0,115,4,0,0,0,4,2,255,128,41,5,114, - 15,0,0,0,218,8,112,108,97,116,102,111,114,109,218,10, + 0,114,7,0,0,0,114,8,0,0,0,114,22,0,0,0, + 70,0,0,0,243,4,0,0,0,4,2,255,128,41,5,114, + 16,0,0,0,218,8,112,108,97,116,102,111,114,109,218,10, 115,116,97,114,116,115,119,105,116,104,218,27,95,67,65,83, 69,95,73,78,83,69,78,83,73,84,73,86,69,95,80,76, 65,84,70,79,82,77,83,218,35,95,67,65,83,69,95,73, 78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70, - 79,82,77,83,95,83,84,82,95,75,69,89,41,1,114,21, - 0,0,0,114,7,0,0,0,114,19,0,0,0,114,8,0, + 79,82,77,83,95,83,84,82,95,75,69,89,41,1,114,22, + 0,0,0,114,7,0,0,0,114,20,0,0,0,114,8,0, 0,0,218,16,95,109,97,107,101,95,114,101,108,97,120,95, 99,97,115,101,59,0,0,0,115,18,0,0,0,12,1,12, 1,6,1,4,2,12,2,4,7,8,253,4,3,255,128,114, - 26,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 30,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, 0,1,0,0,0,4,0,0,0,67,0,0,0,115,20,0, 0,0,116,0,124,0,131,1,100,1,64,0,160,1,100,2, 100,3,161,2,83,0,41,5,122,42,67,111,110,118,101,114, @@ -145,1892 +145,1879 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 3,105,110,116,218,8,116,111,95,98,121,116,101,115,41,1, 218,1,120,114,7,0,0,0,114,7,0,0,0,114,8,0, 0,0,218,12,95,112,97,99,107,95,117,105,110,116,51,50, - 78,0,0,0,115,4,0,0,0,20,2,255,128,114,33,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,4,0,0,0,67,0,0,0,115,28,0,0,0, - 116,0,124,0,131,1,100,1,107,2,115,16,74,0,130,1, - 116,1,160,2,124,0,100,2,161,2,83,0,41,4,122,47, - 67,111,110,118,101,114,116,32,52,32,98,121,116,101,115,32, - 105,110,32,108,105,116,116,108,101,45,101,110,100,105,97,110, - 32,116,111,32,97,110,32,105,110,116,101,103,101,114,46,114, - 28,0,0,0,114,29,0,0,0,78,169,3,114,4,0,0, - 0,114,30,0,0,0,218,10,102,114,111,109,95,98,121,116, - 101,115,169,1,218,4,100,97,116,97,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,14,95,117,110,112,97, - 99,107,95,117,105,110,116,51,50,83,0,0,0,115,6,0, - 0,0,16,2,12,1,255,128,114,38,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, - 0,0,67,0,0,0,115,28,0,0,0,116,0,124,0,131, - 1,100,1,107,2,115,16,74,0,130,1,116,1,160,2,124, - 0,100,2,161,2,83,0,41,4,122,47,67,111,110,118,101, + 78,0,0,0,114,23,0,0,0,114,37,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, + 0,0,0,67,0,0,0,243,28,0,0,0,116,0,124,0, + 131,1,100,1,107,2,115,16,74,0,130,1,116,1,160,2, + 124,0,100,2,161,2,83,0,41,4,122,47,67,111,110,118, + 101,114,116,32,52,32,98,121,116,101,115,32,105,110,32,108, + 105,116,116,108,101,45,101,110,100,105,97,110,32,116,111,32, + 97,110,32,105,110,116,101,103,101,114,46,114,32,0,0,0, + 114,33,0,0,0,78,169,3,114,4,0,0,0,114,34,0, + 0,0,218,10,102,114,111,109,95,98,121,116,101,115,169,1, + 218,4,100,97,116,97,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,14,95,117,110,112,97,99,107,95,117, + 105,110,116,51,50,83,0,0,0,243,6,0,0,0,16,2, + 12,1,255,128,114,43,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,4,0,0,0,67,0, + 0,0,114,38,0,0,0,41,4,122,47,67,111,110,118,101, 114,116,32,50,32,98,121,116,101,115,32,105,110,32,108,105, 116,116,108,101,45,101,110,100,105,97,110,32,116,111,32,97, 110,32,105,110,116,101,103,101,114,46,233,2,0,0,0,114, - 29,0,0,0,78,114,34,0,0,0,114,36,0,0,0,114, + 33,0,0,0,78,114,39,0,0,0,114,41,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,14, 95,117,110,112,97,99,107,95,117,105,110,116,49,54,88,0, - 0,0,115,6,0,0,0,16,2,12,1,255,128,114,40,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,4,0,0,0,71,0,0,0,115,20,0,0,0, - 116,0,160,1,100,1,100,2,132,0,124,0,68,0,131,1, - 161,1,83,0,41,4,122,31,82,101,112,108,97,99,101,109, - 101,110,116,32,102,111,114,32,111,115,46,112,97,116,104,46, - 106,111,105,110,40,41,46,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,5,0,0,0,83,0,0,0, - 115,26,0,0,0,103,0,124,0,93,18,125,1,124,1,114, - 4,124,1,160,0,116,1,161,1,145,2,113,4,83,0,114, - 7,0,0,0,41,2,218,6,114,115,116,114,105,112,218,15, - 112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,41, - 2,114,5,0,0,0,218,4,112,97,114,116,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,10,60,108,105, - 115,116,99,111,109,112,62,96,0,0,0,115,8,0,0,0, - 6,0,6,1,14,255,255,128,122,30,95,112,97,116,104,95, - 106,111,105,110,46,60,108,111,99,97,108,115,62,46,60,108, - 105,115,116,99,111,109,112,62,78,41,2,218,8,112,97,116, - 104,95,115,101,112,218,4,106,111,105,110,41,1,218,10,112, - 97,116,104,95,112,97,114,116,115,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,10,95,112,97,116,104,95, - 106,111,105,110,94,0,0,0,115,8,0,0,0,10,2,2, - 1,8,255,255,128,114,48,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, - 0,0,0,115,96,0,0,0,116,0,116,1,131,1,100,1, - 107,2,114,36,124,0,160,2,116,3,161,1,92,3,125,1, - 125,2,125,3,124,1,124,3,102,2,83,0,116,4,124,0, - 131,1,68,0,93,42,125,4,124,4,116,1,118,0,114,86, - 124,0,106,5,124,4,100,1,100,2,141,2,92,2,125,1, - 125,3,124,1,124,3,102,2,2,0,1,0,83,0,113,44, - 100,3,124,0,102,2,83,0,41,5,122,32,82,101,112,108, - 97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,112, - 97,116,104,46,115,112,108,105,116,40,41,46,114,3,0,0, - 0,41,1,90,8,109,97,120,115,112,108,105,116,114,10,0, - 0,0,78,41,6,114,4,0,0,0,114,42,0,0,0,218, - 10,114,112,97,114,116,105,116,105,111,110,114,45,0,0,0, - 218,8,114,101,118,101,114,115,101,100,218,6,114,115,112,108, - 105,116,41,5,218,4,112,97,116,104,90,5,102,114,111,110, - 116,218,1,95,218,4,116,97,105,108,114,32,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11, - 95,112,97,116,104,95,115,112,108,105,116,100,0,0,0,115, - 20,0,0,0,12,2,16,1,8,1,12,1,8,1,18,1, - 12,1,2,254,8,3,255,128,114,55,0,0,0,99,1,0, + 0,0,114,44,0,0,0,114,46,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, + 0,71,0,0,0,115,20,0,0,0,116,0,160,1,100,1, + 100,2,132,0,124,0,68,0,131,1,161,1,83,0,41,4, + 122,31,82,101,112,108,97,99,101,109,101,110,116,32,102,111, + 114,32,111,115,46,112,97,116,104,46,106,111,105,110,40,41, + 46,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,5,0,0,0,83,0,0,0,115,26,0,0,0,103, + 0,124,0,93,18,125,1,124,1,114,4,124,1,160,0,116, + 1,161,1,145,2,113,4,83,0,114,7,0,0,0,41,2, + 218,6,114,115,116,114,105,112,218,15,112,97,116,104,95,115, + 101,112,97,114,97,116,111,114,115,41,2,114,5,0,0,0, + 218,4,112,97,114,116,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,10,60,108,105,115,116,99,111,109,112, + 62,96,0,0,0,115,8,0,0,0,6,0,6,1,14,255, + 255,128,122,30,95,112,97,116,104,95,106,111,105,110,46,60, + 108,111,99,97,108,115,62,46,60,108,105,115,116,99,111,109, + 112,62,78,41,2,218,8,112,97,116,104,95,115,101,112,218, + 4,106,111,105,110,41,1,218,10,112,97,116,104,95,112,97, + 114,116,115,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,10,95,112,97,116,104,95,106,111,105,110,94,0, + 0,0,115,8,0,0,0,10,2,2,1,8,255,255,128,114, + 54,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,5,0,0,0,67,0,0,0,115,96,0, + 0,0,116,0,116,1,131,1,100,1,107,2,114,36,124,0, + 160,2,116,3,161,1,92,3,125,1,125,2,125,3,124,1, + 124,3,102,2,83,0,116,4,124,0,131,1,68,0,93,42, + 125,4,124,4,116,1,118,0,114,86,124,0,106,5,124,4, + 100,1,100,2,141,2,92,2,125,1,125,3,124,1,124,3, + 102,2,2,0,1,0,83,0,113,44,100,3,124,0,102,2, + 83,0,41,5,122,32,82,101,112,108,97,99,101,109,101,110, + 116,32,102,111,114,32,111,115,46,112,97,116,104,46,115,112, + 108,105,116,40,41,46,114,3,0,0,0,41,1,90,8,109, + 97,120,115,112,108,105,116,114,10,0,0,0,78,41,6,114, + 4,0,0,0,114,48,0,0,0,218,10,114,112,97,114,116, + 105,116,105,111,110,114,51,0,0,0,218,8,114,101,118,101, + 114,115,101,100,218,6,114,115,112,108,105,116,41,5,218,4, + 112,97,116,104,90,5,102,114,111,110,116,218,1,95,218,4, + 116,97,105,108,114,36,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, + 115,112,108,105,116,100,0,0,0,115,20,0,0,0,12,2, + 16,1,8,1,12,1,8,1,18,1,12,1,2,254,8,3, + 255,128,114,61,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,10,0,0,0,116,0,160,1,124,0,161,1,83,0,41, + 2,122,126,83,116,97,116,32,116,104,101,32,112,97,116,104, + 46,10,10,32,32,32,32,77,97,100,101,32,97,32,115,101, + 112,97,114,97,116,101,32,102,117,110,99,116,105,111,110,32, + 116,111,32,109,97,107,101,32,105,116,32,101,97,115,105,101, + 114,32,116,111,32,111,118,101,114,114,105,100,101,32,105,110, + 32,101,120,112,101,114,105,109,101,110,116,115,10,32,32,32, + 32,40,101,46,103,46,32,99,97,99,104,101,32,115,116,97, + 116,32,114,101,115,117,108,116,115,41,46,10,10,32,32,32, + 32,78,41,2,114,19,0,0,0,90,4,115,116,97,116,169, + 1,114,58,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,10,95,112,97,116,104,95,115,116,97, + 116,112,0,0,0,115,4,0,0,0,10,7,255,128,114,63, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,8,0,0,0,67,0,0,0,115,48,0,0, + 0,122,12,116,0,124,0,131,1,125,2,87,0,110,18,4, + 0,116,1,121,46,1,0,1,0,1,0,89,0,100,1,83, + 0,124,2,106,2,100,2,64,0,124,1,107,2,83,0,119, + 0,41,4,122,49,84,101,115,116,32,119,104,101,116,104,101, + 114,32,116,104,101,32,112,97,116,104,32,105,115,32,116,104, + 101,32,115,112,101,99,105,102,105,101,100,32,109,111,100,101, + 32,116,121,112,101,46,70,105,0,240,0,0,78,41,3,114, + 63,0,0,0,218,7,79,83,69,114,114,111,114,218,7,115, + 116,95,109,111,100,101,41,3,114,58,0,0,0,218,4,109, + 111,100,101,90,9,115,116,97,116,95,105,110,102,111,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,18,95, + 112,97,116,104,95,105,115,95,109,111,100,101,95,116,121,112, + 101,122,0,0,0,115,14,0,0,0,2,2,12,1,12,1, + 6,1,14,1,2,254,255,128,114,67,0,0,0,99,1,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, - 0,161,1,83,0,41,2,122,126,83,116,97,116,32,116,104, - 101,32,112,97,116,104,46,10,10,32,32,32,32,77,97,100, - 101,32,97,32,115,101,112,97,114,97,116,101,32,102,117,110, - 99,116,105,111,110,32,116,111,32,109,97,107,101,32,105,116, - 32,101,97,115,105,101,114,32,116,111,32,111,118,101,114,114, - 105,100,101,32,105,110,32,101,120,112,101,114,105,109,101,110, - 116,115,10,32,32,32,32,40,101,46,103,46,32,99,97,99, - 104,101,32,115,116,97,116,32,114,101,115,117,108,116,115,41, - 46,10,10,32,32,32,32,78,41,2,114,18,0,0,0,90, - 4,115,116,97,116,169,1,114,52,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,10,95,112,97, - 116,104,95,115,116,97,116,112,0,0,0,115,4,0,0,0, - 10,7,255,128,114,57,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0, - 0,0,115,48,0,0,0,122,12,116,0,124,0,131,1,125, - 2,87,0,110,18,4,0,116,1,121,46,1,0,1,0,1, - 0,89,0,100,1,83,0,124,2,106,2,100,2,64,0,124, - 1,107,2,83,0,119,0,41,4,122,49,84,101,115,116,32, - 119,104,101,116,104,101,114,32,116,104,101,32,112,97,116,104, - 32,105,115,32,116,104,101,32,115,112,101,99,105,102,105,101, - 100,32,109,111,100,101,32,116,121,112,101,46,70,105,0,240, - 0,0,78,41,3,114,57,0,0,0,218,7,79,83,69,114, - 114,111,114,218,7,115,116,95,109,111,100,101,41,3,114,52, - 0,0,0,218,4,109,111,100,101,90,9,115,116,97,116,95, - 105,110,102,111,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,18,95,112,97,116,104,95,105,115,95,109,111, - 100,101,95,116,121,112,101,122,0,0,0,115,14,0,0,0, - 2,2,12,1,12,1,6,1,14,1,2,254,255,128,114,61, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,10,0,0, - 0,116,0,124,0,100,1,131,2,83,0,41,3,122,31,82, - 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, - 115,46,112,97,116,104,46,105,115,102,105,108,101,46,105,0, - 128,0,0,78,41,1,114,61,0,0,0,114,56,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 12,95,112,97,116,104,95,105,115,102,105,108,101,131,0,0, - 0,115,4,0,0,0,10,2,255,128,114,62,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,22,0,0,0,124,0,115, - 12,116,0,160,1,161,0,125,0,116,2,124,0,100,1,131, - 2,83,0,41,3,122,30,82,101,112,108,97,99,101,109,101, - 110,116,32,102,111,114,32,111,115,46,112,97,116,104,46,105, - 115,100,105,114,46,105,0,64,0,0,78,41,3,114,18,0, - 0,0,218,6,103,101,116,99,119,100,114,61,0,0,0,114, - 56,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,11,95,112,97,116,104,95,105,115,100,105,114, - 136,0,0,0,115,8,0,0,0,4,2,8,1,10,1,255, - 128,114,64,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 26,0,0,0,124,0,160,0,116,1,161,1,112,24,124,0, - 100,1,100,2,133,2,25,0,116,2,118,0,83,0,41,4, - 122,142,82,101,112,108,97,99,101,109,101,110,116,32,102,111, - 114,32,111,115,46,112,97,116,104,46,105,115,97,98,115,46, - 10,10,32,32,32,32,67,111,110,115,105,100,101,114,115,32, - 97,32,87,105,110,100,111,119,115,32,100,114,105,118,101,45, - 114,101,108,97,116,105,118,101,32,112,97,116,104,32,40,110, - 111,32,100,114,105,118,101,44,32,98,117,116,32,115,116,97, - 114,116,115,32,119,105,116,104,32,115,108,97,115,104,41,32, - 116,111,10,32,32,32,32,115,116,105,108,108,32,98,101,32, - 34,97,98,115,111,108,117,116,101,34,46,10,32,32,32,32, - 114,3,0,0,0,233,3,0,0,0,78,41,3,114,23,0, - 0,0,114,42,0,0,0,218,20,95,112,97,116,104,115,101, - 112,115,95,119,105,116,104,95,99,111,108,111,110,114,56,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,95,112,97,116,104,95,105,115,97,98,115,143,0, - 0,0,115,4,0,0,0,26,6,255,128,114,67,0,0,0, - 233,182,1,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,6,0,0,0,11,0,0,0,67,0,0,0,115,170, - 0,0,0,100,1,160,0,124,0,116,1,124,0,131,1,161, - 2,125,3,116,2,160,3,124,3,116,2,106,4,116,2,106, - 5,66,0,116,2,106,6,66,0,124,2,100,2,64,0,161, - 3,125,4,122,72,116,7,160,8,124,4,100,3,161,2,143, - 26,125,5,124,5,160,9,124,1,161,1,1,0,87,0,100, - 4,4,0,4,0,131,3,1,0,110,16,49,0,115,94,119, - 1,1,0,1,0,1,0,89,0,1,0,116,2,160,10,124, - 3,124,0,161,2,1,0,87,0,100,4,83,0,4,0,116, - 11,121,168,1,0,1,0,1,0,122,14,116,2,160,12,124, - 3,161,1,1,0,87,0,130,0,4,0,116,11,121,166,1, - 0,1,0,1,0,89,0,130,0,119,0,119,0,41,5,122, - 162,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,250,5,123,125,46,123,125,114,68,0,0,0,90, - 2,119,98,78,41,13,218,6,102,111,114,109,97,116,218,2, - 105,100,114,18,0,0,0,90,4,111,112,101,110,90,6,79, - 95,69,88,67,76,90,7,79,95,67,82,69,65,84,90,8, - 79,95,87,82,79,78,76,89,218,3,95,105,111,218,6,70, - 105,108,101,73,79,218,5,119,114,105,116,101,218,7,114,101, - 112,108,97,99,101,114,58,0,0,0,90,6,117,110,108,105, - 110,107,41,6,114,52,0,0,0,114,37,0,0,0,114,60, - 0,0,0,90,8,112,97,116,104,95,116,109,112,90,2,102, - 100,218,4,102,105,108,101,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,13,95,119,114,105,116,101,95,97, - 116,111,109,105,99,152,0,0,0,115,38,0,0,0,16,5, - 6,1,22,1,4,255,2,2,14,3,24,1,16,128,18,1, - 12,1,2,1,12,1,2,3,12,254,2,1,2,1,2,254, - 2,253,255,128,114,77,0,0,0,105,105,13,0,0,114,39, - 0,0,0,114,29,0,0,0,115,2,0,0,0,13,10,90, - 11,95,95,112,121,99,97,99,104,101,95,95,122,4,111,112, - 116,45,122,3,46,112,121,122,4,46,112,121,119,122,4,46, - 112,121,99,41,1,218,12,111,112,116,105,109,105,122,97,116, - 105,111,110,99,2,0,0,0,0,0,0,0,1,0,0,0, - 12,0,0,0,5,0,0,0,67,0,0,0,115,88,1,0, - 0,124,1,100,1,117,1,114,52,116,0,160,1,100,2,116, - 2,161,2,1,0,124,2,100,1,117,1,114,40,100,3,125, - 3,116,3,124,3,131,1,130,1,124,1,114,48,100,4,110, - 2,100,5,125,2,116,4,160,5,124,0,161,1,125,0,116, - 6,124,0,131,1,92,2,125,4,125,5,124,5,160,7,100, - 6,161,1,92,3,125,6,125,7,125,8,116,8,106,9,106, - 10,125,9,124,9,100,1,117,0,114,114,116,11,100,7,131, - 1,130,1,100,4,160,12,124,6,114,126,124,6,110,2,124, - 8,124,7,124,9,103,3,161,1,125,10,124,2,100,1,117, - 0,114,172,116,8,106,13,106,14,100,8,107,2,114,164,100, - 4,125,2,110,8,116,8,106,13,106,14,125,2,116,15,124, - 2,131,1,125,2,124,2,100,4,107,3,114,224,124,2,160, - 16,161,0,115,210,116,17,100,9,160,18,124,2,161,1,131, - 1,130,1,100,10,160,18,124,10,116,19,124,2,161,3,125, - 10,124,10,116,20,100,8,25,0,23,0,125,11,116,8,106, - 21,100,1,117,1,144,1,114,76,116,22,124,4,131,1,144, - 1,115,16,116,23,116,4,160,24,161,0,124,4,131,2,125, - 4,124,4,100,5,25,0,100,11,107,2,144,1,114,56,124, - 4,100,8,25,0,116,25,118,1,144,1,114,56,124,4,100, - 12,100,1,133,2,25,0,125,4,116,23,116,8,106,21,124, - 4,160,26,116,25,161,1,124,11,131,3,83,0,116,23,124, - 4,116,27,124,11,131,3,83,0,41,13,97,254,2,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,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,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,10,10,32,32,32,32,84,104, - 101,32,39,111,112,116,105,109,105,122,97,116,105,111,110,39, - 32,112,97,114,97,109,101,116,101,114,32,99,111,110,116,114, - 111,108,115,32,116,104,101,32,112,114,101,115,117,109,101,100, - 32,111,112,116,105,109,105,122,97,116,105,111,110,32,108,101, - 118,101,108,32,111,102,10,32,32,32,32,116,104,101,32,98, - 121,116,101,99,111,100,101,32,102,105,108,101,46,32,73,102, - 32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,32, - 105,115,32,110,111,116,32,78,111,110,101,44,32,116,104,101, - 32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110, - 116,97,116,105,111,110,10,32,32,32,32,111,102,32,116,104, - 101,32,97,114,103,117,109,101,110,116,32,105,115,32,116,97, - 107,101,110,32,97,110,100,32,118,101,114,105,102,105,101,100, - 32,116,111,32,98,101,32,97,108,112,104,97,110,117,109,101, - 114,105,99,32,40,101,108,115,101,32,86,97,108,117,101,69, - 114,114,111,114,10,32,32,32,32,105,115,32,114,97,105,115, - 101,100,41,46,10,10,32,32,32,32,84,104,101,32,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,32,112,97,114, - 97,109,101,116,101,114,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,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,10,32,32,32,32,97,32,84,114,117,101,32, - 118,97,108,117,101,32,105,115,32,116,104,101,32,115,97,109, - 101,32,97,115,32,115,101,116,116,105,110,103,32,39,111,112, - 116,105,109,105,122,97,116,105,111,110,39,32,116,111,32,116, - 104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,10, - 32,32,32,32,119,104,105,108,101,32,97,32,70,97,108,115, - 101,32,118,97,108,117,101,32,105,115,32,101,113,117,105,118, - 97,108,101,110,116,32,116,111,32,115,101,116,116,105,110,103, - 32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,32, - 116,111,32,39,49,39,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,122, - 70,116,104,101,32,100,101,98,117,103,95,111,118,101,114,114, - 105,100,101,32,112,97,114,97,109,101,116,101,114,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,59,32,117,115,101, - 32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,32, - 105,110,115,116,101,97,100,122,50,100,101,98,117,103,95,111, - 118,101,114,114,105,100,101,32,111,114,32,111,112,116,105,109, - 105,122,97,116,105,111,110,32,109,117,115,116,32,98,101,32, - 115,101,116,32,116,111,32,78,111,110,101,114,10,0,0,0, - 114,3,0,0,0,218,1,46,250,36,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,114,0, - 0,0,0,122,24,123,33,114,125,32,105,115,32,110,111,116, - 32,97,108,112,104,97,110,117,109,101,114,105,99,122,7,123, - 125,46,123,125,123,125,114,11,0,0,0,114,39,0,0,0, - 41,28,218,9,95,119,97,114,110,105,110,103,115,218,4,119, - 97,114,110,218,18,68,101,112,114,101,99,97,116,105,111,110, - 87,97,114,110,105,110,103,218,9,84,121,112,101,69,114,114, - 111,114,114,18,0,0,0,218,6,102,115,112,97,116,104,114, - 55,0,0,0,114,49,0,0,0,114,15,0,0,0,218,14, - 105,109,112,108,101,109,101,110,116,97,116,105,111,110,218,9, - 99,97,99,104,101,95,116,97,103,218,19,78,111,116,73,109, - 112,108,101,109,101,110,116,101,100,69,114,114,111,114,114,46, - 0,0,0,114,16,0,0,0,218,8,111,112,116,105,109,105, - 122,101,218,3,115,116,114,218,7,105,115,97,108,110,117,109, - 218,10,86,97,108,117,101,69,114,114,111,114,114,70,0,0, - 0,218,4,95,79,80,84,218,17,66,89,84,69,67,79,68, - 69,95,83,85,70,70,73,88,69,83,218,14,112,121,99,97, - 99,104,101,95,112,114,101,102,105,120,114,67,0,0,0,114, - 48,0,0,0,114,63,0,0,0,114,42,0,0,0,218,6, - 108,115,116,114,105,112,218,8,95,80,89,67,65,67,72,69, - 41,12,114,52,0,0,0,90,14,100,101,98,117,103,95,111, - 118,101,114,114,105,100,101,114,78,0,0,0,218,7,109,101, - 115,115,97,103,101,218,4,104,101,97,100,114,54,0,0,0, - 90,4,98,97,115,101,114,6,0,0,0,218,4,114,101,115, - 116,90,3,116,97,103,90,15,97,108,109,111,115,116,95,102, - 105,108,101,110,97,109,101,218,8,102,105,108,101,110,97,109, + 0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,100, + 1,131,2,83,0,41,3,122,31,82,101,112,108,97,99,101, + 109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,104, + 46,105,115,102,105,108,101,46,105,0,128,0,0,78,41,1, + 114,67,0,0,0,114,62,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,12,95,112,97,116,104, + 95,105,115,102,105,108,101,131,0,0,0,243,4,0,0,0, + 10,2,255,128,114,68,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,22,0,0,0,124,0,115,12,116,0,160,1,161, + 0,125,0,116,2,124,0,100,1,131,2,83,0,41,3,122, + 30,82,101,112,108,97,99,101,109,101,110,116,32,102,111,114, + 32,111,115,46,112,97,116,104,46,105,115,100,105,114,46,105, + 0,64,0,0,78,41,3,114,19,0,0,0,218,6,103,101, + 116,99,119,100,114,67,0,0,0,114,62,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, + 112,97,116,104,95,105,115,100,105,114,136,0,0,0,115,8, + 0,0,0,4,2,8,1,10,1,255,128,114,71,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,3,0,0,0,67,0,0,0,115,26,0,0,0,124,0, + 160,0,116,1,161,1,112,24,124,0,100,1,100,2,133,2, + 25,0,116,2,118,0,83,0,41,4,122,142,82,101,112,108, + 97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,112, + 97,116,104,46,105,115,97,98,115,46,10,10,32,32,32,32, + 67,111,110,115,105,100,101,114,115,32,97,32,87,105,110,100, + 111,119,115,32,100,114,105,118,101,45,114,101,108,97,116,105, + 118,101,32,112,97,116,104,32,40,110,111,32,100,114,105,118, + 101,44,32,98,117,116,32,115,116,97,114,116,115,32,119,105, + 116,104,32,115,108,97,115,104,41,32,116,111,10,32,32,32, + 32,115,116,105,108,108,32,98,101,32,34,97,98,115,111,108, + 117,116,101,34,46,10,32,32,32,32,114,3,0,0,0,233, + 3,0,0,0,78,41,3,114,27,0,0,0,114,48,0,0, + 0,218,20,95,112,97,116,104,115,101,112,115,95,119,105,116, + 104,95,99,111,108,111,110,114,62,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,11,95,112,97, + 116,104,95,105,115,97,98,115,143,0,0,0,115,4,0,0, + 0,26,6,255,128,114,74,0,0,0,233,182,1,0,0,99, + 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, + 11,0,0,0,67,0,0,0,115,170,0,0,0,100,1,160, + 0,124,0,116,1,124,0,131,1,161,2,125,3,116,2,160, + 3,124,3,116,2,106,4,116,2,106,5,66,0,116,2,106, + 6,66,0,124,2,100,2,64,0,161,3,125,4,122,72,116, + 7,160,8,124,4,100,3,161,2,143,26,125,5,124,5,160, + 9,124,1,161,1,1,0,87,0,100,4,4,0,4,0,131, + 3,1,0,110,16,49,0,115,94,119,1,1,0,1,0,1, + 0,89,0,1,0,116,2,160,10,124,3,124,0,161,2,1, + 0,87,0,100,4,83,0,4,0,116,11,121,168,1,0,1, + 0,1,0,122,14,116,2,160,12,124,3,161,1,1,0,87, + 0,130,0,4,0,116,11,121,166,1,0,1,0,1,0,89, + 0,130,0,119,0,119,0,41,5,122,162,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,250,5,123, + 125,46,123,125,114,75,0,0,0,90,2,119,98,78,41,13, + 218,6,102,111,114,109,97,116,218,2,105,100,114,19,0,0, + 0,90,4,111,112,101,110,90,6,79,95,69,88,67,76,90, + 7,79,95,67,82,69,65,84,90,8,79,95,87,82,79,78, + 76,89,218,3,95,105,111,218,6,70,105,108,101,73,79,218, + 5,119,114,105,116,101,218,7,114,101,112,108,97,99,101,114, + 64,0,0,0,90,6,117,110,108,105,110,107,41,6,114,58, + 0,0,0,114,42,0,0,0,114,66,0,0,0,90,8,112, + 97,116,104,95,116,109,112,90,2,102,100,218,4,102,105,108, 101,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,17,99,97,99,104,101,95,102,114,111,109,95,115,111,117, - 114,99,101,85,1,0,0,115,74,0,0,0,8,18,6,1, - 2,1,4,255,8,2,4,1,8,1,12,1,10,1,12,1, - 16,1,8,1,8,1,8,1,24,1,8,1,12,1,6,1, - 8,2,8,1,8,1,8,1,14,1,14,1,12,1,12,1, - 10,9,14,1,28,5,12,1,2,4,4,1,8,1,2,1, - 4,253,12,5,255,128,114,102,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,10,0,0,0,5,0,0,0, - 67,0,0,0,115,44,1,0,0,116,0,106,1,106,2,100, - 1,117,0,114,20,116,3,100,2,131,1,130,1,116,4,160, - 5,124,0,161,1,125,0,116,6,124,0,131,1,92,2,125, - 1,125,2,100,3,125,3,116,0,106,7,100,1,117,1,114, - 102,116,0,106,7,160,8,116,9,161,1,125,4,124,1,160, - 10,124,4,116,11,23,0,161,1,114,102,124,1,116,12,124, - 4,131,1,100,1,133,2,25,0,125,1,100,4,125,3,124, - 3,115,144,116,6,124,1,131,1,92,2,125,1,125,5,124, - 5,116,13,107,3,114,144,116,14,116,13,155,0,100,5,124, - 0,155,2,157,3,131,1,130,1,124,2,160,15,100,6,161, - 1,125,6,124,6,100,7,118,1,114,176,116,14,100,8,124, - 2,155,2,157,2,131,1,130,1,124,6,100,9,107,2,144, - 1,114,12,124,2,160,16,100,6,100,10,161,2,100,11,25, - 0,125,7,124,7,160,10,116,17,161,1,115,226,116,14,100, - 12,116,17,155,2,157,2,131,1,130,1,124,7,116,12,116, - 17,131,1,100,1,133,2,25,0,125,8,124,8,160,18,161, - 0,144,1,115,12,116,14,100,13,124,7,155,2,100,14,157, - 3,131,1,130,1,124,2,160,19,100,6,161,1,100,15,25, - 0,125,9,116,20,124,1,124,9,116,21,100,15,25,0,23, - 0,131,2,83,0,41,16,97,110,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,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,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,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,47,52,56, - 56,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,114,80,0,0,0, - 70,84,122,31,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,114,79,0,0,0,62,2,0,0,0,114,39,0, - 0,0,114,65,0,0,0,122,29,101,120,112,101,99,116,101, - 100,32,111,110,108,121,32,50,32,111,114,32,51,32,100,111, - 116,115,32,105,110,32,114,65,0,0,0,114,39,0,0,0, - 233,254,255,255,255,122,53,111,112,116,105,109,105,122,97,116, - 105,111,110,32,112,111,114,116,105,111,110,32,111,102,32,102, - 105,108,101,110,97,109,101,32,100,111,101,115,32,110,111,116, - 32,115,116,97,114,116,32,119,105,116,104,32,122,19,111,112, - 116,105,109,105,122,97,116,105,111,110,32,108,101,118,101,108, - 32,122,29,32,105,115,32,110,111,116,32,97,110,32,97,108, - 112,104,97,110,117,109,101,114,105,99,32,118,97,108,117,101, - 114,0,0,0,0,41,22,114,15,0,0,0,114,86,0,0, - 0,114,87,0,0,0,114,88,0,0,0,114,18,0,0,0, - 114,85,0,0,0,114,55,0,0,0,114,95,0,0,0,114, - 41,0,0,0,114,42,0,0,0,114,23,0,0,0,114,45, - 0,0,0,114,4,0,0,0,114,97,0,0,0,114,92,0, - 0,0,218,5,99,111,117,110,116,114,51,0,0,0,114,93, - 0,0,0,114,91,0,0,0,218,9,112,97,114,116,105,116, - 105,111,110,114,48,0,0,0,218,15,83,79,85,82,67,69, - 95,83,85,70,70,73,88,69,83,41,10,114,52,0,0,0, - 114,99,0,0,0,90,16,112,121,99,97,99,104,101,95,102, - 105,108,101,110,97,109,101,90,23,102,111,117,110,100,95,105, - 110,95,112,121,99,97,99,104,101,95,112,114,101,102,105,120, - 90,13,115,116,114,105,112,112,101,100,95,112,97,116,104,90, - 7,112,121,99,97,99,104,101,90,9,100,111,116,95,99,111, - 117,110,116,114,78,0,0,0,90,9,111,112,116,95,108,101, - 118,101,108,90,13,98,97,115,101,95,102,105,108,101,110,97, - 109,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,17,115,111,117,114,99,101,95,102,114,111,109,95,99, - 97,99,104,101,156,1,0,0,115,62,0,0,0,12,9,8, - 1,10,1,12,1,4,1,10,1,12,1,14,1,16,1,4, - 1,4,1,12,1,8,1,8,1,2,1,8,255,10,2,8, - 1,14,1,10,1,16,1,10,1,4,1,2,1,8,255,16, - 2,10,1,16,1,14,2,18,1,255,128,114,107,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,9,0,0,0,67,0,0,0,115,122,0,0,0,116,0, - 124,0,131,1,100,1,107,2,114,16,100,2,83,0,124,0, - 160,1,100,3,161,1,92,3,125,1,125,2,125,3,124,1, - 114,56,124,3,160,2,161,0,100,4,100,5,133,2,25,0, - 100,6,107,3,114,60,124,0,83,0,122,12,116,3,124,0, - 131,1,125,4,87,0,110,30,4,0,116,4,116,5,102,2, - 121,120,1,0,1,0,1,0,124,0,100,2,100,5,133,2, - 25,0,125,4,89,0,116,6,124,4,131,1,114,116,124,4, - 83,0,124,0,83,0,119,0,41,7,122,188,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,114,0,0,0,0,78,114,79, - 0,0,0,233,253,255,255,255,233,255,255,255,255,90,2,112, - 121,41,7,114,4,0,0,0,114,49,0,0,0,218,5,108, - 111,119,101,114,114,107,0,0,0,114,88,0,0,0,114,92, - 0,0,0,114,62,0,0,0,41,5,218,13,98,121,116,101, - 99,111,100,101,95,112,97,116,104,114,100,0,0,0,114,53, - 0,0,0,90,9,101,120,116,101,110,115,105,111,110,218,11, - 115,111,117,114,99,101,95,112,97,116,104,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,15,95,103,101,116, - 95,115,111,117,114,99,101,102,105,108,101,196,1,0,0,115, - 24,0,0,0,12,7,4,1,16,1,24,1,4,1,2,1, - 12,1,16,1,14,1,16,1,2,254,255,128,114,113,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,8,0,0,0,67,0,0,0,115,68,0,0,0,124, - 0,160,0,116,1,116,2,131,1,161,1,114,44,122,10,116, - 3,124,0,131,1,87,0,83,0,4,0,116,4,121,66,1, - 0,1,0,1,0,89,0,100,0,83,0,124,0,160,0,116, - 1,116,5,131,1,161,1,114,62,124,0,83,0,100,0,83, - 0,119,0,169,1,78,41,6,218,8,101,110,100,115,119,105, - 116,104,218,5,116,117,112,108,101,114,106,0,0,0,114,102, - 0,0,0,114,88,0,0,0,114,94,0,0,0,41,1,114, - 101,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, - 215,1,0,0,115,20,0,0,0,14,1,2,1,10,1,12, - 1,6,1,14,1,4,1,4,2,2,251,255,128,114,117,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,67,0,0,0,115,48,0,0,0, - 122,14,116,0,124,0,131,1,106,1,125,1,87,0,110,18, - 4,0,116,2,121,46,1,0,1,0,1,0,100,1,125,1, - 89,0,124,1,100,2,79,0,125,1,124,1,83,0,119,0, - 41,4,122,51,67,97,108,99,117,108,97,116,101,32,116,104, - 101,32,109,111,100,101,32,112,101,114,109,105,115,115,105,111, - 110,115,32,102,111,114,32,97,32,98,121,116,101,99,111,100, - 101,32,102,105,108,101,46,114,68,0,0,0,233,128,0,0, - 0,78,41,3,114,57,0,0,0,114,59,0,0,0,114,58, - 0,0,0,41,2,114,52,0,0,0,114,60,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, - 95,99,97,108,99,95,109,111,100,101,227,1,0,0,115,16, - 0,0,0,2,2,14,1,12,1,6,1,8,3,4,1,2, - 251,255,128,114,119,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,4,0,0,0,3,0,0, - 0,115,52,0,0,0,100,6,135,0,102,1,100,2,100,3, - 132,9,125,1,116,0,100,1,117,1,114,30,116,0,106,1, - 125,2,110,8,100,4,100,5,132,0,125,2,124,2,124,1, - 136,0,131,2,1,0,124,1,83,0,41,7,122,252,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,0,0,0,0,4,0,0,0,4,0,0,0, - 31,0,0,0,115,72,0,0,0,124,1,100,0,117,0,114, - 16,124,0,106,0,125,1,110,32,124,0,106,0,124,1,107, - 3,114,48,116,1,100,1,124,0,106,0,124,1,102,2,22, - 0,124,1,100,2,141,2,130,1,136,0,124,0,124,1,103, - 2,124,2,162,1,82,0,105,0,124,3,164,1,142,1,83, - 0,41,3,78,122,30,108,111,97,100,101,114,32,102,111,114, - 32,37,115,32,99,97,110,110,111,116,32,104,97,110,100,108, - 101,32,37,115,169,1,218,4,110,97,109,101,41,2,114,121, - 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, - 41,4,218,4,115,101,108,102,114,121,0,0,0,218,4,97, - 114,103,115,218,6,107,119,97,114,103,115,169,1,218,6,109, - 101,116,104,111,100,114,7,0,0,0,114,8,0,0,0,218, - 19,95,99,104,101,99,107,95,110,97,109,101,95,119,114,97, - 112,112,101,114,247,1,0,0,115,20,0,0,0,8,1,8, - 1,10,1,4,1,8,1,2,255,2,1,6,255,24,2,255, - 128,122,40,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,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0, - 83,0,0,0,115,56,0,0,0,100,1,68,0,93,32,125, - 2,116,0,124,1,124,2,131,2,114,36,116,1,124,0,124, - 2,116,2,124,1,124,2,131,2,131,3,1,0,113,4,124, - 0,106,3,160,4,124,1,106,3,161,1,1,0,100,0,83, - 0,41,2,78,41,4,218,10,95,95,109,111,100,117,108,101, - 95,95,218,8,95,95,110,97,109,101,95,95,218,12,95,95, - 113,117,97,108,110,97,109,101,95,95,218,7,95,95,100,111, - 99,95,95,41,5,218,7,104,97,115,97,116,116,114,218,7, - 115,101,116,97,116,116,114,218,7,103,101,116,97,116,116,114, - 218,8,95,95,100,105,99,116,95,95,218,6,117,112,100,97, - 116,101,41,3,90,3,110,101,119,90,3,111,108,100,114,75, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,5,95,119,114,97,112,4,2,0,0,115,12,0, - 0,0,8,1,10,1,18,1,2,128,18,1,255,128,122,26, - 95,99,104,101,99,107,95,110,97,109,101,46,60,108,111,99, - 97,108,115,62,46,95,119,114,97,112,41,1,78,41,2,218, - 10,95,98,111,111,116,115,116,114,97,112,114,138,0,0,0, - 41,3,114,127,0,0,0,114,128,0,0,0,114,138,0,0, - 0,114,7,0,0,0,114,126,0,0,0,114,8,0,0,0, - 218,11,95,99,104,101,99,107,95,110,97,109,101,239,1,0, - 0,115,14,0,0,0,14,8,8,10,8,1,8,2,10,6, - 4,1,255,128,114,140,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,6,0,0,0,67,0, - 0,0,115,60,0,0,0,124,0,160,0,124,1,161,1,92, - 2,125,2,125,3,124,2,100,1,117,0,114,56,116,1,124, - 3,131,1,114,56,100,2,125,4,116,2,160,3,124,4,160, - 4,124,3,100,3,25,0,161,1,116,5,161,2,1,0,124, - 2,83,0,41,4,122,155,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,10,10,32, - 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, - 115,32,100,101,112,114,101,99,97,116,101,100,32,105,110,32, - 102,97,118,111,114,32,111,102,32,102,105,110,100,101,114,46, - 102,105,110,100,95,115,112,101,99,40,41,46,10,10,32,32, - 32,32,78,122,44,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,114,0,0,0,0,41,6,218,11,102,105,110,100,95,108, - 111,97,100,101,114,114,4,0,0,0,114,81,0,0,0,114, - 82,0,0,0,114,70,0,0,0,218,13,73,109,112,111,114, - 116,87,97,114,110,105,110,103,41,5,114,123,0,0,0,218, - 8,102,117,108,108,110,97,109,101,218,6,108,111,97,100,101, - 114,218,8,112,111,114,116,105,111,110,115,218,3,109,115,103, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 17,95,102,105,110,100,95,109,111,100,117,108,101,95,115,104, - 105,109,14,2,0,0,115,12,0,0,0,14,10,16,1,4, - 1,22,1,4,1,255,128,114,147,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, - 0,67,0,0,0,115,166,0,0,0,124,0,100,1,100,2, - 133,2,25,0,125,3,124,3,116,0,107,3,114,64,100,3, - 124,1,155,2,100,4,124,3,155,2,157,4,125,4,116,1, - 160,2,100,5,124,4,161,2,1,0,116,3,124,4,102,1, - 105,0,124,2,164,1,142,1,130,1,116,4,124,0,131,1, - 100,6,107,0,114,106,100,7,124,1,155,2,157,2,125,4, - 116,1,160,2,100,5,124,4,161,2,1,0,116,5,124,4, - 131,1,130,1,116,6,124,0,100,2,100,8,133,2,25,0, - 131,1,125,5,124,5,100,9,64,0,114,162,100,10,124,5, - 155,2,100,11,124,1,155,2,157,4,125,4,116,3,124,4, - 102,1,105,0,124,2,164,1,142,1,130,1,124,5,83,0, - 41,12,97,84,2,0,0,80,101,114,102,111,114,109,32,98, - 97,115,105,99,32,118,97,108,105,100,105,116,121,32,99,104, - 101,99,107,105,110,103,32,111,102,32,97,32,112,121,99,32, - 104,101,97,100,101,114,32,97,110,100,32,114,101,116,117,114, - 110,32,116,104,101,32,102,108,97,103,115,32,102,105,101,108, - 100,44,10,32,32,32,32,119,104,105,99,104,32,100,101,116, - 101,114,109,105,110,101,115,32,104,111,119,32,116,104,101,32, - 112,121,99,32,115,104,111,117,108,100,32,98,101,32,102,117, - 114,116,104,101,114,32,118,97,108,105,100,97,116,101,100,32, - 97,103,97,105,110,115,116,32,116,104,101,32,115,111,117,114, - 99,101,46,10,10,32,32,32,32,42,100,97,116,97,42,32, - 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32, - 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46, - 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116, - 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32, - 32,32,114,101,113,117,105,114,101,100,44,32,116,104,111,117, - 103,104,46,41,10,10,32,32,32,32,42,110,97,109,101,42, - 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, - 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103, - 32,105,109,112,111,114,116,101,100,46,32,73,116,32,105,115, - 32,117,115,101,100,32,102,111,114,32,108,111,103,103,105,110, - 103,46,10,10,32,32,32,32,42,101,120,99,95,100,101,116, - 97,105,108,115,42,32,105,115,32,97,32,100,105,99,116,105, - 111,110,97,114,121,32,112,97,115,115,101,100,32,116,111,32, - 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105, - 116,32,114,97,105,115,101,100,32,102,111,114,10,32,32,32, - 32,105,109,112,114,111,118,101,100,32,100,101,98,117,103,103, - 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,119,104,101,110,32,116,104,101,32,102, - 108,97,103,115,10,32,32,32,32,102,105,101,108,100,32,105, - 115,32,105,110,118,97,108,105,100,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,32,116,114,117,110,99, - 97,116,101,100,46,10,10,32,32,32,32,78,114,28,0,0, - 0,122,20,98,97,100,32,109,97,103,105,99,32,110,117,109, - 98,101,114,32,105,110,32,122,2,58,32,250,2,123,125,233, - 16,0,0,0,122,40,114,101,97,99,104,101,100,32,69,79, - 70,32,119,104,105,108,101,32,114,101,97,100,105,110,103,32, - 112,121,99,32,104,101,97,100,101,114,32,111,102,32,233,8, - 0,0,0,233,252,255,255,255,122,14,105,110,118,97,108,105, - 100,32,102,108,97,103,115,32,122,4,32,105,110,32,41,7, - 218,12,77,65,71,73,67,95,78,85,77,66,69,82,114,139, - 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, - 115,115,97,103,101,114,122,0,0,0,114,4,0,0,0,218, - 8,69,79,70,69,114,114,111,114,114,38,0,0,0,41,6, - 114,37,0,0,0,114,121,0,0,0,218,11,101,120,99,95, - 100,101,116,97,105,108,115,90,5,109,97,103,105,99,114,98, - 0,0,0,114,16,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,13,95,99,108,97,115,115,105, - 102,121,95,112,121,99,31,2,0,0,115,30,0,0,0,12, - 16,8,1,16,1,12,1,16,1,12,1,10,1,12,1,8, - 1,16,1,8,2,16,1,16,1,4,1,255,128,114,156,0, - 0,0,99,5,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,4,0,0,0,67,0,0,0,115,124,0,0,0, - 116,0,124,0,100,1,100,2,133,2,25,0,131,1,124,1, - 100,3,64,0,107,3,114,62,100,4,124,3,155,2,157,2, - 125,5,116,1,160,2,100,5,124,5,161,2,1,0,116,3, - 124,5,102,1,105,0,124,4,164,1,142,1,130,1,124,2, - 100,6,117,1,114,120,116,0,124,0,100,2,100,7,133,2, - 25,0,131,1,124,2,100,3,64,0,107,3,114,116,116,3, - 100,4,124,3,155,2,157,2,102,1,105,0,124,4,164,1, - 142,1,130,1,100,6,83,0,100,6,83,0,41,8,97,7, - 2,0,0,86,97,108,105,100,97,116,101,32,97,32,112,121, - 99,32,97,103,97,105,110,115,116,32,116,104,101,32,115,111, - 117,114,99,101,32,108,97,115,116,45,109,111,100,105,102,105, - 101,100,32,116,105,109,101,46,10,10,32,32,32,32,42,100, - 97,116,97,42,32,105,115,32,116,104,101,32,99,111,110,116, - 101,110,116,115,32,111,102,32,116,104,101,32,112,121,99,32, - 102,105,108,101,46,32,40,79,110,108,121,32,116,104,101,32, - 102,105,114,115,116,32,49,54,32,98,121,116,101,115,32,97, - 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,46, - 41,10,10,32,32,32,32,42,115,111,117,114,99,101,95,109, - 116,105,109,101,42,32,105,115,32,116,104,101,32,108,97,115, - 116,32,109,111,100,105,102,105,101,100,32,116,105,109,101,115, - 116,97,109,112,32,111,102,32,116,104,101,32,115,111,117,114, - 99,101,32,102,105,108,101,46,10,10,32,32,32,32,42,115, - 111,117,114,99,101,95,115,105,122,101,42,32,105,115,32,78, - 111,110,101,32,111,114,32,116,104,101,32,115,105,122,101,32, - 111,102,32,116,104,101,32,115,111,117,114,99,101,32,102,105, - 108,101,32,105,110,32,98,121,116,101,115,46,10,10,32,32, - 32,32,42,110,97,109,101,42,32,105,115,32,116,104,101,32, - 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, - 108,101,32,98,101,105,110,103,32,105,109,112,111,114,116,101, - 100,46,32,73,116,32,105,115,32,117,115,101,100,32,102,111, - 114,32,108,111,103,103,105,110,103,46,10,10,32,32,32,32, - 42,101,120,99,95,100,101,116,97,105,108,115,42,32,105,115, - 32,97,32,100,105,99,116,105,111,110,97,114,121,32,112,97, - 115,115,101,100,32,116,111,32,73,109,112,111,114,116,69,114, - 114,111,114,32,105,102,32,105,116,32,114,97,105,115,101,100, - 32,102,111,114,10,32,32,32,32,105,109,112,114,111,118,101, - 100,32,100,101,98,117,103,103,105,110,103,46,10,10,32,32, - 32,32,65,110,32,73,109,112,111,114,116,69,114,114,111,114, - 32,105,115,32,114,97,105,115,101,100,32,105,102,32,116,104, - 101,32,98,121,116,101,99,111,100,101,32,105,115,32,115,116, - 97,108,101,46,10,10,32,32,32,32,114,150,0,0,0,233, - 12,0,0,0,114,27,0,0,0,122,22,98,121,116,101,99, - 111,100,101,32,105,115,32,115,116,97,108,101,32,102,111,114, - 32,114,148,0,0,0,78,114,149,0,0,0,41,4,114,38, - 0,0,0,114,139,0,0,0,114,153,0,0,0,114,122,0, - 0,0,41,6,114,37,0,0,0,218,12,115,111,117,114,99, - 101,95,109,116,105,109,101,218,11,115,111,117,114,99,101,95, - 115,105,122,101,114,121,0,0,0,114,155,0,0,0,114,98, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,23,95,118,97,108,105,100,97,116,101,95,116,105, - 109,101,115,116,97,109,112,95,112,121,99,64,2,0,0,115, - 20,0,0,0,24,19,10,1,12,1,16,1,8,1,22,1, - 2,255,22,2,8,254,255,128,114,160,0,0,0,99,4,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, - 0,0,67,0,0,0,115,42,0,0,0,124,0,100,1,100, - 2,133,2,25,0,124,1,107,3,114,38,116,0,100,3,124, - 2,155,2,157,2,102,1,105,0,124,3,164,1,142,1,130, - 1,100,4,83,0,41,5,97,243,1,0,0,86,97,108,105, - 100,97,116,101,32,97,32,104,97,115,104,45,98,97,115,101, - 100,32,112,121,99,32,98,121,32,99,104,101,99,107,105,110, - 103,32,116,104,101,32,114,101,97,108,32,115,111,117,114,99, - 101,32,104,97,115,104,32,97,103,97,105,110,115,116,32,116, - 104,101,32,111,110,101,32,105,110,10,32,32,32,32,116,104, - 101,32,112,121,99,32,104,101,97,100,101,114,46,10,10,32, + 218,13,95,119,114,105,116,101,95,97,116,111,109,105,99,152, + 0,0,0,115,38,0,0,0,16,5,6,1,22,1,4,255, + 2,2,14,3,24,1,16,128,18,1,12,1,2,1,12,1, + 2,3,12,254,2,1,2,1,2,254,2,253,255,128,114,84, + 0,0,0,105,105,13,0,0,114,45,0,0,0,114,33,0, + 0,0,115,2,0,0,0,13,10,90,11,95,95,112,121,99, + 97,99,104,101,95,95,122,4,111,112,116,45,122,3,46,112, + 121,122,4,46,112,121,119,122,4,46,112,121,99,41,1,218, + 12,111,112,116,105,109,105,122,97,116,105,111,110,99,2,0, + 0,0,0,0,0,0,1,0,0,0,12,0,0,0,5,0, + 0,0,67,0,0,0,115,88,1,0,0,124,1,100,1,117, + 1,114,52,116,0,160,1,100,2,116,2,161,2,1,0,124, + 2,100,1,117,1,114,40,100,3,125,3,116,3,124,3,131, + 1,130,1,124,1,114,48,100,4,110,2,100,5,125,2,116, + 4,160,5,124,0,161,1,125,0,116,6,124,0,131,1,92, + 2,125,4,125,5,124,5,160,7,100,6,161,1,92,3,125, + 6,125,7,125,8,116,8,106,9,106,10,125,9,124,9,100, + 1,117,0,114,114,116,11,100,7,131,1,130,1,100,4,160, + 12,124,6,114,126,124,6,110,2,124,8,124,7,124,9,103, + 3,161,1,125,10,124,2,100,1,117,0,114,172,116,8,106, + 13,106,14,100,8,107,2,114,164,100,4,125,2,110,8,116, + 8,106,13,106,14,125,2,116,15,124,2,131,1,125,2,124, + 2,100,4,107,3,114,224,124,2,160,16,161,0,115,210,116, + 17,100,9,160,18,124,2,161,1,131,1,130,1,100,10,160, + 18,124,10,116,19,124,2,161,3,125,10,124,10,116,20,100, + 8,25,0,23,0,125,11,116,8,106,21,100,1,117,1,144, + 1,114,76,116,22,124,4,131,1,144,1,115,16,116,23,116, + 4,160,24,161,0,124,4,131,2,125,4,124,4,100,5,25, + 0,100,11,107,2,144,1,114,56,124,4,100,8,25,0,116, + 25,118,1,144,1,114,56,124,4,100,12,100,1,133,2,25, + 0,125,4,116,23,116,8,106,21,124,4,160,26,116,25,161, + 1,124,11,131,3,83,0,116,23,124,4,116,27,124,11,131, + 3,83,0,41,13,97,254,2,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,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, + 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,10,10,32,32,32,32,84,104,101,32,39,111,112,116, + 105,109,105,122,97,116,105,111,110,39,32,112,97,114,97,109, + 101,116,101,114,32,99,111,110,116,114,111,108,115,32,116,104, + 101,32,112,114,101,115,117,109,101,100,32,111,112,116,105,109, + 105,122,97,116,105,111,110,32,108,101,118,101,108,32,111,102, + 10,32,32,32,32,116,104,101,32,98,121,116,101,99,111,100, + 101,32,102,105,108,101,46,32,73,102,32,39,111,112,116,105, + 109,105,122,97,116,105,111,110,39,32,105,115,32,110,111,116, + 32,78,111,110,101,44,32,116,104,101,32,115,116,114,105,110, + 103,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110, + 10,32,32,32,32,111,102,32,116,104,101,32,97,114,103,117, + 109,101,110,116,32,105,115,32,116,97,107,101,110,32,97,110, + 100,32,118,101,114,105,102,105,101,100,32,116,111,32,98,101, + 32,97,108,112,104,97,110,117,109,101,114,105,99,32,40,101, + 108,115,101,32,86,97,108,117,101,69,114,114,111,114,10,32, + 32,32,32,105,115,32,114,97,105,115,101,100,41,46,10,10, + 32,32,32,32,84,104,101,32,100,101,98,117,103,95,111,118, + 101,114,114,105,100,101,32,112,97,114,97,109,101,116,101,114, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,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,10,32, + 32,32,32,97,32,84,114,117,101,32,118,97,108,117,101,32, + 105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,115, + 101,116,116,105,110,103,32,39,111,112,116,105,109,105,122,97, + 116,105,111,110,39,32,116,111,32,116,104,101,32,101,109,112, + 116,121,32,115,116,114,105,110,103,10,32,32,32,32,119,104, + 105,108,101,32,97,32,70,97,108,115,101,32,118,97,108,117, + 101,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32, + 116,111,32,115,101,116,116,105,110,103,32,39,111,112,116,105, + 109,105,122,97,116,105,111,110,39,32,116,111,32,39,49,39, + 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,122,70,116,104,101,32,100, + 101,98,117,103,95,111,118,101,114,114,105,100,101,32,112,97, + 114,97,109,101,116,101,114,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,59,32,117,115,101,32,39,111,112,116,105, + 109,105,122,97,116,105,111,110,39,32,105,110,115,116,101,97, + 100,122,50,100,101,98,117,103,95,111,118,101,114,114,105,100, + 101,32,111,114,32,111,112,116,105,109,105,122,97,116,105,111, + 110,32,109,117,115,116,32,98,101,32,115,101,116,32,116,111, + 32,78,111,110,101,114,10,0,0,0,114,3,0,0,0,218, + 1,46,250,36,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,114,0,0,0,0,122,24,123, + 33,114,125,32,105,115,32,110,111,116,32,97,108,112,104,97, + 110,117,109,101,114,105,99,122,7,123,125,46,123,125,123,125, + 114,11,0,0,0,114,45,0,0,0,41,28,218,9,95,119, + 97,114,110,105,110,103,115,218,4,119,97,114,110,218,18,68, + 101,112,114,101,99,97,116,105,111,110,87,97,114,110,105,110, + 103,218,9,84,121,112,101,69,114,114,111,114,114,19,0,0, + 0,218,6,102,115,112,97,116,104,114,61,0,0,0,114,55, + 0,0,0,114,16,0,0,0,218,14,105,109,112,108,101,109, + 101,110,116,97,116,105,111,110,218,9,99,97,99,104,101,95, + 116,97,103,218,19,78,111,116,73,109,112,108,101,109,101,110, + 116,101,100,69,114,114,111,114,114,52,0,0,0,114,17,0, + 0,0,218,8,111,112,116,105,109,105,122,101,218,3,115,116, + 114,218,7,105,115,97,108,110,117,109,218,10,86,97,108,117, + 101,69,114,114,111,114,114,77,0,0,0,218,4,95,79,80, + 84,218,17,66,89,84,69,67,79,68,69,95,83,85,70,70, + 73,88,69,83,218,14,112,121,99,97,99,104,101,95,112,114, + 101,102,105,120,114,74,0,0,0,114,54,0,0,0,114,70, + 0,0,0,114,48,0,0,0,218,6,108,115,116,114,105,112, + 218,8,95,80,89,67,65,67,72,69,41,12,114,58,0,0, + 0,90,14,100,101,98,117,103,95,111,118,101,114,114,105,100, + 101,114,85,0,0,0,218,7,109,101,115,115,97,103,101,218, + 4,104,101,97,100,114,60,0,0,0,90,4,98,97,115,101, + 114,6,0,0,0,218,4,114,101,115,116,90,3,116,97,103, + 90,15,97,108,109,111,115,116,95,102,105,108,101,110,97,109, + 101,218,8,102,105,108,101,110,97,109,101,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,17,99,97,99,104, + 101,95,102,114,111,109,95,115,111,117,114,99,101,85,1,0, + 0,115,74,0,0,0,8,18,6,1,2,1,4,255,8,2, + 4,1,8,1,12,1,10,1,12,1,16,1,8,1,8,1, + 8,1,24,1,8,1,12,1,6,1,8,2,8,1,8,1, + 8,1,14,1,14,1,12,1,12,1,10,9,14,1,28,5, + 12,1,2,4,4,1,8,1,2,1,4,253,12,5,255,128, + 114,109,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,10,0,0,0,5,0,0,0,67,0,0,0,115,44, + 1,0,0,116,0,106,1,106,2,100,1,117,0,114,20,116, + 3,100,2,131,1,130,1,116,4,160,5,124,0,161,1,125, + 0,116,6,124,0,131,1,92,2,125,1,125,2,100,3,125, + 3,116,0,106,7,100,1,117,1,114,102,116,0,106,7,160, + 8,116,9,161,1,125,4,124,1,160,10,124,4,116,11,23, + 0,161,1,114,102,124,1,116,12,124,4,131,1,100,1,133, + 2,25,0,125,1,100,4,125,3,124,3,115,144,116,6,124, + 1,131,1,92,2,125,1,125,5,124,5,116,13,107,3,114, + 144,116,14,116,13,155,0,100,5,124,0,155,2,157,3,131, + 1,130,1,124,2,160,15,100,6,161,1,125,6,124,6,100, + 7,118,1,114,176,116,14,100,8,124,2,155,2,157,2,131, + 1,130,1,124,6,100,9,107,2,144,1,114,12,124,2,160, + 16,100,6,100,10,161,2,100,11,25,0,125,7,124,7,160, + 10,116,17,161,1,115,226,116,14,100,12,116,17,155,2,157, + 2,131,1,130,1,124,7,116,12,116,17,131,1,100,1,133, + 2,25,0,125,8,124,8,160,18,161,0,144,1,115,12,116, + 14,100,13,124,7,155,2,100,14,157,3,131,1,130,1,124, + 2,160,19,100,6,161,1,100,15,25,0,125,9,116,20,124, + 1,124,9,116,21,100,15,25,0,23,0,131,2,83,0,41, + 16,97,110,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,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,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,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,47,52,56,56,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,114,87,0,0,0,70,84,122,31,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,114,86,0, + 0,0,62,2,0,0,0,114,45,0,0,0,114,72,0,0, + 0,122,29,101,120,112,101,99,116,101,100,32,111,110,108,121, + 32,50,32,111,114,32,51,32,100,111,116,115,32,105,110,32, + 114,72,0,0,0,114,45,0,0,0,233,254,255,255,255,122, + 53,111,112,116,105,109,105,122,97,116,105,111,110,32,112,111, + 114,116,105,111,110,32,111,102,32,102,105,108,101,110,97,109, + 101,32,100,111,101,115,32,110,111,116,32,115,116,97,114,116, + 32,119,105,116,104,32,122,19,111,112,116,105,109,105,122,97, + 116,105,111,110,32,108,101,118,101,108,32,122,29,32,105,115, + 32,110,111,116,32,97,110,32,97,108,112,104,97,110,117,109, + 101,114,105,99,32,118,97,108,117,101,114,0,0,0,0,41, + 22,114,16,0,0,0,114,93,0,0,0,114,94,0,0,0, + 114,95,0,0,0,114,19,0,0,0,114,92,0,0,0,114, + 61,0,0,0,114,102,0,0,0,114,47,0,0,0,114,48, + 0,0,0,114,27,0,0,0,114,51,0,0,0,114,4,0, + 0,0,114,104,0,0,0,114,99,0,0,0,218,5,99,111, + 117,110,116,114,57,0,0,0,114,100,0,0,0,114,98,0, + 0,0,218,9,112,97,114,116,105,116,105,111,110,114,54,0, + 0,0,218,15,83,79,85,82,67,69,95,83,85,70,70,73, + 88,69,83,41,10,114,58,0,0,0,114,106,0,0,0,90, + 16,112,121,99,97,99,104,101,95,102,105,108,101,110,97,109, + 101,90,23,102,111,117,110,100,95,105,110,95,112,121,99,97, + 99,104,101,95,112,114,101,102,105,120,90,13,115,116,114,105, + 112,112,101,100,95,112,97,116,104,90,7,112,121,99,97,99, + 104,101,90,9,100,111,116,95,99,111,117,110,116,114,85,0, + 0,0,90,9,111,112,116,95,108,101,118,101,108,90,13,98, + 97,115,101,95,102,105,108,101,110,97,109,101,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,17,115,111,117, + 114,99,101,95,102,114,111,109,95,99,97,99,104,101,156,1, + 0,0,115,62,0,0,0,12,9,8,1,10,1,12,1,4, + 1,10,1,12,1,14,1,16,1,4,1,4,1,12,1,8, + 1,8,1,2,1,8,255,10,2,8,1,14,1,10,1,16, + 1,10,1,4,1,2,1,8,255,16,2,10,1,16,1,14, + 2,18,1,255,128,114,114,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,9,0,0,0,67, + 0,0,0,115,122,0,0,0,116,0,124,0,131,1,100,1, + 107,2,114,16,100,2,83,0,124,0,160,1,100,3,161,1, + 92,3,125,1,125,2,125,3,124,1,114,56,124,3,160,2, + 161,0,100,4,100,5,133,2,25,0,100,6,107,3,114,60, + 124,0,83,0,122,12,116,3,124,0,131,1,125,4,87,0, + 110,30,4,0,116,4,116,5,102,2,121,120,1,0,1,0, + 1,0,124,0,100,2,100,5,133,2,25,0,125,4,89,0, + 116,6,124,4,131,1,114,116,124,4,83,0,124,0,83,0, + 119,0,41,7,122,188,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,114,0,0,0,0,78,114,86,0,0,0,233,253,255, + 255,255,233,255,255,255,255,90,2,112,121,41,7,114,4,0, + 0,0,114,55,0,0,0,218,5,108,111,119,101,114,114,114, + 0,0,0,114,95,0,0,0,114,99,0,0,0,114,68,0, + 0,0,41,5,218,13,98,121,116,101,99,111,100,101,95,112, + 97,116,104,114,107,0,0,0,114,59,0,0,0,90,9,101, + 120,116,101,110,115,105,111,110,218,11,115,111,117,114,99,101, + 95,112,97,116,104,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,15,95,103,101,116,95,115,111,117,114,99, + 101,102,105,108,101,196,1,0,0,115,24,0,0,0,12,7, + 4,1,16,1,24,1,4,1,2,1,12,1,16,1,14,1, + 16,1,2,254,255,128,114,120,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0, + 67,0,0,0,115,68,0,0,0,124,0,160,0,116,1,116, + 2,131,1,161,1,114,44,122,10,116,3,124,0,131,1,87, + 0,83,0,4,0,116,4,121,66,1,0,1,0,1,0,89, + 0,100,0,83,0,124,0,160,0,116,1,116,5,131,1,161, + 1,114,62,124,0,83,0,100,0,83,0,119,0,169,1,78, + 41,6,218,8,101,110,100,115,119,105,116,104,218,5,116,117, + 112,108,101,114,113,0,0,0,114,109,0,0,0,114,95,0, + 0,0,114,101,0,0,0,41,1,114,108,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, + 103,101,116,95,99,97,99,104,101,100,215,1,0,0,115,20, + 0,0,0,14,1,2,1,10,1,12,1,6,1,14,1,4, + 1,4,2,2,251,255,128,114,124,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,8,0,0, + 0,67,0,0,0,115,48,0,0,0,122,14,116,0,124,0, + 131,1,106,1,125,1,87,0,110,18,4,0,116,2,121,46, + 1,0,1,0,1,0,100,1,125,1,89,0,124,1,100,2, + 79,0,125,1,124,1,83,0,119,0,41,4,122,51,67,97, + 108,99,117,108,97,116,101,32,116,104,101,32,109,111,100,101, + 32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114, + 32,97,32,98,121,116,101,99,111,100,101,32,102,105,108,101, + 46,114,75,0,0,0,233,128,0,0,0,78,41,3,114,63, + 0,0,0,114,65,0,0,0,114,64,0,0,0,41,2,114, + 58,0,0,0,114,66,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,10,95,99,97,108,99,95, + 109,111,100,101,227,1,0,0,115,16,0,0,0,2,2,14, + 1,12,1,6,1,8,3,4,1,2,251,255,128,114,126,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,4,0,0,0,3,0,0,0,115,52,0,0,0, + 100,6,135,0,102,1,100,2,100,3,132,9,125,1,116,0, + 100,1,117,1,114,30,116,0,106,1,125,2,110,8,100,4, + 100,5,132,0,125,2,124,2,124,1,136,0,131,2,1,0, + 124,1,83,0,41,7,122,252,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,0,0, + 0,0,4,0,0,0,4,0,0,0,31,0,0,0,115,72, + 0,0,0,124,1,100,0,117,0,114,16,124,0,106,0,125, + 1,110,32,124,0,106,0,124,1,107,3,114,48,116,1,100, + 1,124,0,106,0,124,1,102,2,22,0,124,1,100,2,141, + 2,130,1,136,0,124,0,124,1,103,2,124,2,162,1,82, + 0,105,0,124,3,164,1,142,1,83,0,41,3,78,122,30, + 108,111,97,100,101,114,32,102,111,114,32,37,115,32,99,97, + 110,110,111,116,32,104,97,110,100,108,101,32,37,115,169,1, + 218,4,110,97,109,101,41,2,114,128,0,0,0,218,11,73, + 109,112,111,114,116,69,114,114,111,114,41,4,218,4,115,101, + 108,102,114,128,0,0,0,218,4,97,114,103,115,218,6,107, + 119,97,114,103,115,169,1,218,6,109,101,116,104,111,100,114, + 7,0,0,0,114,8,0,0,0,218,19,95,99,104,101,99, + 107,95,110,97,109,101,95,119,114,97,112,112,101,114,247,1, + 0,0,115,20,0,0,0,8,1,8,1,10,1,4,1,8, + 1,2,255,2,1,6,255,24,2,255,128,122,40,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,99,2,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,7,0,0,0,83,0,0,0,115,56, + 0,0,0,100,1,68,0,93,32,125,2,116,0,124,1,124, + 2,131,2,114,36,116,1,124,0,124,2,116,2,124,1,124, + 2,131,2,131,3,1,0,113,4,124,0,106,3,160,4,124, + 1,106,3,161,1,1,0,100,0,83,0,41,2,78,41,4, + 218,10,95,95,109,111,100,117,108,101,95,95,218,8,95,95, + 110,97,109,101,95,95,218,12,95,95,113,117,97,108,110,97, + 109,101,95,95,218,7,95,95,100,111,99,95,95,41,5,218, + 7,104,97,115,97,116,116,114,218,7,115,101,116,97,116,116, + 114,218,7,103,101,116,97,116,116,114,218,8,95,95,100,105, + 99,116,95,95,218,6,117,112,100,97,116,101,41,3,90,3, + 110,101,119,90,3,111,108,100,114,82,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,5,95,119, + 114,97,112,4,2,0,0,115,12,0,0,0,8,1,10,1, + 18,1,2,128,18,1,255,128,122,26,95,99,104,101,99,107, + 95,110,97,109,101,46,60,108,111,99,97,108,115,62,46,95, + 119,114,97,112,41,1,78,41,2,218,10,95,98,111,111,116, + 115,116,114,97,112,114,145,0,0,0,41,3,114,134,0,0, + 0,114,135,0,0,0,114,145,0,0,0,114,7,0,0,0, + 114,133,0,0,0,114,8,0,0,0,218,11,95,99,104,101, + 99,107,95,110,97,109,101,239,1,0,0,115,14,0,0,0, + 14,8,8,10,8,1,8,2,10,6,4,1,255,128,114,147, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 5,0,0,0,6,0,0,0,67,0,0,0,115,60,0,0, + 0,124,0,160,0,124,1,161,1,92,2,125,2,125,3,124, + 2,100,1,117,0,114,56,116,1,124,3,131,1,114,56,100, + 2,125,4,116,2,160,3,124,4,160,4,124,3,100,3,25, + 0,161,1,116,5,161,2,1,0,124,2,83,0,41,4,122, + 155,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,10,10,32,32,32,32,84,104,105, + 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, + 101,99,97,116,101,100,32,105,110,32,102,97,118,111,114,32, + 111,102,32,102,105,110,100,101,114,46,102,105,110,100,95,115, + 112,101,99,40,41,46,10,10,32,32,32,32,78,122,44,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,114,0,0,0,0, + 41,6,218,11,102,105,110,100,95,108,111,97,100,101,114,114, + 4,0,0,0,114,88,0,0,0,114,89,0,0,0,114,77, + 0,0,0,218,13,73,109,112,111,114,116,87,97,114,110,105, + 110,103,41,5,114,130,0,0,0,218,8,102,117,108,108,110, + 97,109,101,218,6,108,111,97,100,101,114,218,8,112,111,114, + 116,105,111,110,115,218,3,109,115,103,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,17,95,102,105,110,100, + 95,109,111,100,117,108,101,95,115,104,105,109,14,2,0,0, + 115,12,0,0,0,14,10,16,1,4,1,22,1,4,1,255, + 128,114,154,0,0,0,99,3,0,0,0,0,0,0,0,0, + 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, + 166,0,0,0,124,0,100,1,100,2,133,2,25,0,125,3, + 124,3,116,0,107,3,114,64,100,3,124,1,155,2,100,4, + 124,3,155,2,157,4,125,4,116,1,160,2,100,5,124,4, + 161,2,1,0,116,3,124,4,102,1,105,0,124,2,164,1, + 142,1,130,1,116,4,124,0,131,1,100,6,107,0,114,106, + 100,7,124,1,155,2,157,2,125,4,116,1,160,2,100,5, + 124,4,161,2,1,0,116,5,124,4,131,1,130,1,116,6, + 124,0,100,2,100,8,133,2,25,0,131,1,125,5,124,5, + 100,9,64,0,114,162,100,10,124,5,155,2,100,11,124,1, + 155,2,157,4,125,4,116,3,124,4,102,1,105,0,124,2, + 164,1,142,1,130,1,124,5,83,0,41,12,97,84,2,0, + 0,80,101,114,102,111,114,109,32,98,97,115,105,99,32,118, + 97,108,105,100,105,116,121,32,99,104,101,99,107,105,110,103, + 32,111,102,32,97,32,112,121,99,32,104,101,97,100,101,114, + 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32, + 102,108,97,103,115,32,102,105,101,108,100,44,10,32,32,32, + 32,119,104,105,99,104,32,100,101,116,101,114,109,105,110,101, + 115,32,104,111,119,32,116,104,101,32,112,121,99,32,115,104, + 111,117,108,100,32,98,101,32,102,117,114,116,104,101,114,32, + 118,97,108,105,100,97,116,101,100,32,97,103,97,105,110,115, + 116,32,116,104,101,32,115,111,117,114,99,101,46,10,10,32, 32,32,32,42,100,97,116,97,42,32,105,115,32,116,104,101, 32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101, 32,112,121,99,32,102,105,108,101,46,32,40,79,110,108,121, 32,116,104,101,32,102,105,114,115,116,32,49,54,32,98,121, 116,101,115,32,97,114,101,10,32,32,32,32,114,101,113,117, - 105,114,101,100,46,41,10,10,32,32,32,32,42,115,111,117, - 114,99,101,95,104,97,115,104,42,32,105,115,32,116,104,101, - 32,105,109,112,111,114,116,108,105,98,46,117,116,105,108,46, - 115,111,117,114,99,101,95,104,97,115,104,40,41,32,111,102, - 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, - 46,10,10,32,32,32,32,42,110,97,109,101,42,32,105,115, - 32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101, - 32,109,111,100,117,108,101,32,98,101,105,110,103,32,105,109, - 112,111,114,116,101,100,46,32,73,116,32,105,115,32,117,115, - 101,100,32,102,111,114,32,108,111,103,103,105,110,103,46,10, - 10,32,32,32,32,42,101,120,99,95,100,101,116,97,105,108, - 115,42,32,105,115,32,97,32,100,105,99,116,105,111,110,97, - 114,121,32,112,97,115,115,101,100,32,116,111,32,73,109,112, - 111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,114, - 97,105,115,101,100,32,102,111,114,10,32,32,32,32,105,109, - 112,114,111,118,101,100,32,100,101,98,117,103,103,105,110,103, - 46,10,10,32,32,32,32,65,110,32,73,109,112,111,114,116, - 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,32, - 105,102,32,116,104,101,32,98,121,116,101,99,111,100,101,32, - 105,115,32,115,116,97,108,101,46,10,10,32,32,32,32,114, - 150,0,0,0,114,149,0,0,0,122,46,104,97,115,104,32, - 105,110,32,98,121,116,101,99,111,100,101,32,100,111,101,115, - 110,39,116,32,109,97,116,99,104,32,104,97,115,104,32,111, - 102,32,115,111,117,114,99,101,32,78,41,1,114,122,0,0, - 0,41,4,114,37,0,0,0,218,11,115,111,117,114,99,101, - 95,104,97,115,104,114,121,0,0,0,114,155,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,18, - 95,118,97,108,105,100,97,116,101,95,104,97,115,104,95,112, - 121,99,92,2,0,0,115,16,0,0,0,16,17,2,1,8, - 1,4,255,2,2,6,254,4,255,255,128,114,162,0,0,0, - 99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,5,0,0,0,67,0,0,0,115,76,0,0,0,116,0, - 160,1,124,0,161,1,125,4,116,2,124,4,116,3,131,2, - 114,56,116,4,160,5,100,1,124,2,161,2,1,0,124,3, - 100,2,117,1,114,52,116,6,160,7,124,4,124,3,161,2, - 1,0,124,4,83,0,116,8,100,3,160,9,124,2,161,1, - 124,1,124,2,100,4,141,3,130,1,41,5,122,35,67,111, - 109,112,105,108,101,32,98,121,116,101,99,111,100,101,32,97, - 115,32,102,111,117,110,100,32,105,110,32,97,32,112,121,99, - 46,122,21,99,111,100,101,32,111,98,106,101,99,116,32,102, - 114,111,109,32,123,33,114,125,78,122,23,78,111,110,45,99, - 111,100,101,32,111,98,106,101,99,116,32,105,110,32,123,33, - 114,125,169,2,114,121,0,0,0,114,52,0,0,0,41,10, - 218,7,109,97,114,115,104,97,108,90,5,108,111,97,100,115, - 218,10,105,115,105,110,115,116,97,110,99,101,218,10,95,99, - 111,100,101,95,116,121,112,101,114,139,0,0,0,114,153,0, - 0,0,218,4,95,105,109,112,90,16,95,102,105,120,95,99, - 111,95,102,105,108,101,110,97,109,101,114,122,0,0,0,114, - 70,0,0,0,41,5,114,37,0,0,0,114,121,0,0,0, - 114,111,0,0,0,114,112,0,0,0,218,4,99,111,100,101, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 17,95,99,111,109,112,105,108,101,95,98,121,116,101,99,111, - 100,101,116,2,0,0,115,20,0,0,0,10,2,10,1,12, - 1,8,1,12,1,4,1,10,2,4,1,6,255,255,128,114, - 169,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,5,0,0,0,67,0,0,0,115,70,0, - 0,0,116,0,116,1,131,1,125,3,124,3,160,2,116,3, - 100,1,131,1,161,1,1,0,124,3,160,2,116,3,124,1, - 131,1,161,1,1,0,124,3,160,2,116,3,124,2,131,1, - 161,1,1,0,124,3,160,2,116,4,160,5,124,0,161,1, - 161,1,1,0,124,3,83,0,41,3,122,43,80,114,111,100, - 117,99,101,32,116,104,101,32,100,97,116,97,32,102,111,114, - 32,97,32,116,105,109,101,115,116,97,109,112,45,98,97,115, - 101,100,32,112,121,99,46,114,0,0,0,0,78,41,6,218, - 9,98,121,116,101,97,114,114,97,121,114,152,0,0,0,218, - 6,101,120,116,101,110,100,114,33,0,0,0,114,164,0,0, - 0,218,5,100,117,109,112,115,41,4,114,168,0,0,0,218, - 5,109,116,105,109,101,114,159,0,0,0,114,37,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 22,95,99,111,100,101,95,116,111,95,116,105,109,101,115,116, - 97,109,112,95,112,121,99,129,2,0,0,115,14,0,0,0, - 8,2,14,1,14,1,14,1,16,1,4,1,255,128,114,174, - 0,0,0,84,99,3,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,5,0,0,0,67,0,0,0,115,80,0, - 0,0,116,0,116,1,131,1,125,3,100,1,124,2,100,1, - 62,0,66,0,125,4,124,3,160,2,116,3,124,4,131,1, - 161,1,1,0,116,4,124,1,131,1,100,2,107,2,115,50, - 74,0,130,1,124,3,160,2,124,1,161,1,1,0,124,3, - 160,2,116,5,160,6,124,0,161,1,161,1,1,0,124,3, - 83,0,41,4,122,38,80,114,111,100,117,99,101,32,116,104, - 101,32,100,97,116,97,32,102,111,114,32,97,32,104,97,115, - 104,45,98,97,115,101,100,32,112,121,99,46,114,3,0,0, - 0,114,150,0,0,0,78,41,7,114,170,0,0,0,114,152, - 0,0,0,114,171,0,0,0,114,33,0,0,0,114,4,0, - 0,0,114,164,0,0,0,114,172,0,0,0,41,5,114,168, - 0,0,0,114,161,0,0,0,90,7,99,104,101,99,107,101, - 100,114,37,0,0,0,114,16,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,17,95,99,111,100, - 101,95,116,111,95,104,97,115,104,95,112,121,99,139,2,0, - 0,115,16,0,0,0,8,2,12,1,14,1,16,1,10,1, - 16,1,4,1,255,128,114,175,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0, - 67,0,0,0,115,62,0,0,0,100,1,100,2,108,0,125, - 1,116,1,160,2,124,0,161,1,106,3,125,2,124,1,160, - 4,124,2,161,1,125,3,116,1,160,5,100,2,100,3,161, - 2,125,4,124,4,160,6,124,0,160,6,124,3,100,1,25, - 0,161,1,161,1,83,0,41,4,122,121,68,101,99,111,100, - 101,32,98,121,116,101,115,32,114,101,112,114,101,115,101,110, - 116,105,110,103,32,115,111,117,114,99,101,32,99,111,100,101, - 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32, - 115,116,114,105,110,103,46,10,10,32,32,32,32,85,110,105, - 118,101,114,115,97,108,32,110,101,119,108,105,110,101,32,115, - 117,112,112,111,114,116,32,105,115,32,117,115,101,100,32,105, - 110,32,116,104,101,32,100,101,99,111,100,105,110,103,46,10, - 32,32,32,32,114,0,0,0,0,78,84,41,7,218,8,116, - 111,107,101,110,105,122,101,114,72,0,0,0,90,7,66,121, - 116,101,115,73,79,90,8,114,101,97,100,108,105,110,101,90, - 15,100,101,116,101,99,116,95,101,110,99,111,100,105,110,103, - 90,25,73,110,99,114,101,109,101,110,116,97,108,78,101,119, - 108,105,110,101,68,101,99,111,100,101,114,218,6,100,101,99, - 111,100,101,41,5,218,12,115,111,117,114,99,101,95,98,121, - 116,101,115,114,176,0,0,0,90,21,115,111,117,114,99,101, - 95,98,121,116,101,115,95,114,101,97,100,108,105,110,101,218, - 8,101,110,99,111,100,105,110,103,90,15,110,101,119,108,105, - 110,101,95,100,101,99,111,100,101,114,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,13,100,101,99,111,100, - 101,95,115,111,117,114,99,101,150,2,0,0,115,12,0,0, - 0,8,5,12,1,10,1,12,1,20,1,255,128,114,180,0, - 0,0,169,2,114,144,0,0,0,218,26,115,117,98,109,111, - 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, - 116,105,111,110,115,99,2,0,0,0,0,0,0,0,2,0, - 0,0,9,0,0,0,8,0,0,0,67,0,0,0,115,16, - 1,0,0,124,1,100,1,117,0,114,58,100,2,125,1,116, - 0,124,2,100,3,131,2,114,56,122,14,124,2,160,1,124, - 0,161,1,125,1,87,0,110,30,4,0,116,2,144,1,121, - 14,1,0,1,0,1,0,89,0,110,12,110,10,116,3,160, - 4,124,1,161,1,125,1,116,5,106,6,124,0,124,2,124, - 1,100,4,141,3,125,4,100,5,124,4,95,7,124,2,100, - 1,117,0,114,152,116,8,131,0,68,0,93,42,92,2,125, - 5,125,6,124,1,160,9,116,10,124,6,131,1,161,1,114, - 146,124,5,124,0,124,1,131,2,125,2,124,2,124,4,95, - 11,1,0,113,152,113,104,100,1,83,0,124,3,116,12,117, - 0,114,216,116,0,124,2,100,6,131,2,114,214,122,14,124, - 2,160,13,124,0,161,1,125,7,87,0,110,18,4,0,116, - 2,144,1,121,12,1,0,1,0,1,0,89,0,110,18,124, - 7,114,214,103,0,124,4,95,14,110,6,124,3,124,4,95, - 14,124,4,106,14,103,0,107,2,144,1,114,8,124,1,144, - 1,114,8,116,15,124,1,131,1,100,7,25,0,125,8,124, - 4,106,14,160,16,124,8,161,1,1,0,124,4,83,0,119, - 0,119,0,41,8,97,61,1,0,0,82,101,116,117,114,110, - 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, - 97,115,101,100,32,111,110,32,97,32,102,105,108,101,32,108, - 111,99,97,116,105,111,110,46,10,10,32,32,32,32,84,111, - 32,105,110,100,105,99,97,116,101,32,116,104,97,116,32,116, - 104,101,32,109,111,100,117,108,101,32,105,115,32,97,32,112, - 97,99,107,97,103,101,44,32,115,101,116,10,32,32,32,32, - 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, - 95,108,111,99,97,116,105,111,110,115,32,116,111,32,97,32, - 108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114, - 121,32,112,97,116,104,115,46,32,32,65,110,10,32,32,32, - 32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,115, - 117,102,102,105,99,105,101,110,116,44,32,116,104,111,117,103, - 104,32,105,116,115,32,110,111,116,32,111,116,104,101,114,119, - 105,115,101,32,117,115,101,102,117,108,32,116,111,32,116,104, - 101,10,32,32,32,32,105,109,112,111,114,116,32,115,121,115, - 116,101,109,46,10,10,32,32,32,32,84,104,101,32,108,111, - 97,100,101,114,32,109,117,115,116,32,116,97,107,101,32,97, - 32,115,112,101,99,32,97,115,32,105,116,115,32,111,110,108, - 121,32,95,95,105,110,105,116,95,95,40,41,32,97,114,103, - 46,10,10,32,32,32,32,78,122,9,60,117,110,107,110,111, - 119,110,62,218,12,103,101,116,95,102,105,108,101,110,97,109, - 101,169,1,218,6,111,114,105,103,105,110,84,218,10,105,115, - 95,112,97,99,107,97,103,101,114,0,0,0,0,41,17,114, - 133,0,0,0,114,183,0,0,0,114,122,0,0,0,114,18, - 0,0,0,114,85,0,0,0,114,139,0,0,0,218,10,77, - 111,100,117,108,101,83,112,101,99,90,13,95,115,101,116,95, - 102,105,108,101,97,116,116,114,218,27,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,114,115,0,0,0,114,116,0,0,0,114, - 144,0,0,0,218,9,95,80,79,80,85,76,65,84,69,114, - 186,0,0,0,114,182,0,0,0,114,55,0,0,0,218,6, - 97,112,112,101,110,100,41,9,114,121,0,0,0,90,8,108, - 111,99,97,116,105,111,110,114,144,0,0,0,114,182,0,0, - 0,218,4,115,112,101,99,218,12,108,111,97,100,101,114,95, - 99,108,97,115,115,218,8,115,117,102,102,105,120,101,115,114, - 186,0,0,0,90,7,100,105,114,110,97,109,101,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,23,115,112, - 101,99,95,102,114,111,109,95,102,105,108,101,95,108,111,99, - 97,116,105,111,110,167,2,0,0,115,74,0,0,0,8,12, - 4,4,10,1,2,2,14,1,14,1,4,1,2,251,10,7, - 16,8,6,1,8,3,14,1,14,1,10,1,6,1,4,1, - 2,253,4,5,8,3,10,2,2,1,14,1,14,1,4,1, - 4,2,6,1,2,128,6,2,12,1,6,1,12,1,12,1, - 4,2,2,244,2,226,255,128,114,194,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,64,0,0,0,115,88,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,90,4,100,3,90,5,101, - 6,111,30,100,4,101,7,118,0,90,8,101,9,100,5,100, - 6,132,0,131,1,90,10,101,11,100,7,100,8,132,0,131, - 1,90,12,101,11,100,14,100,10,100,11,132,1,131,1,90, - 13,101,11,100,15,100,12,100,13,132,1,131,1,90,14,100, - 9,83,0,41,16,218,21,87,105,110,100,111,119,115,82,101, - 103,105,115,116,114,121,70,105,110,100,101,114,122,62,77,101, - 116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,102, - 111,114,32,109,111,100,117,108,101,115,32,100,101,99,108,97, - 114,101,100,32,105,110,32,116,104,101,32,87,105,110,100,111, - 119,115,32,114,101,103,105,115,116,114,121,46,122,59,83,111, - 102,116,119,97,114,101,92,80,121,116,104,111,110,92,80,121, - 116,104,111,110,67,111,114,101,92,123,115,121,115,95,118,101, - 114,115,105,111,110,125,92,77,111,100,117,108,101,115,92,123, - 102,117,108,108,110,97,109,101,125,122,65,83,111,102,116,119, - 97,114,101,92,80,121,116,104,111,110,92,80,121,116,104,111, - 110,67,111,114,101,92,123,115,121,115,95,118,101,114,115,105, - 111,110,125,92,77,111,100,117,108,101,115,92,123,102,117,108, - 108,110,97,109,101,125,92,68,101,98,117,103,122,6,95,100, - 46,112,121,100,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,8,0,0,0,67,0,0,0,115,50,0, - 0,0,122,16,116,0,160,1,116,0,106,2,124,0,161,2, - 87,0,83,0,4,0,116,3,121,48,1,0,1,0,1,0, - 116,0,160,1,116,0,106,4,124,0,161,2,6,0,89,0, - 83,0,119,0,114,114,0,0,0,41,5,218,6,119,105,110, - 114,101,103,90,7,79,112,101,110,75,101,121,90,17,72,75, - 69,89,95,67,85,82,82,69,78,84,95,85,83,69,82,114, - 58,0,0,0,90,18,72,75,69,89,95,76,79,67,65,76, - 95,77,65,67,72,73,78,69,114,19,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,14,95,111, - 112,101,110,95,114,101,103,105,115,116,114,121,247,2,0,0, - 115,12,0,0,0,2,2,16,1,12,1,18,1,2,255,255, - 128,122,36,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,2,0,0,0,0,0,0,0, - 0,0,0,0,6,0,0,0,8,0,0,0,67,0,0,0, - 115,130,0,0,0,124,0,106,0,114,14,124,0,106,1,125, - 2,110,6,124,0,106,2,125,2,124,2,106,3,124,1,100, - 1,116,4,106,5,100,0,100,2,133,2,25,0,22,0,100, - 3,141,2,125,3,122,60,124,0,160,6,124,3,161,1,143, - 28,125,4,116,7,160,8,124,4,100,4,161,2,125,5,87, - 0,100,0,4,0,4,0,131,3,1,0,110,16,49,0,115, - 94,119,1,1,0,1,0,1,0,89,0,1,0,87,0,124, - 5,83,0,4,0,116,9,121,128,1,0,1,0,1,0,89, - 0,100,0,83,0,119,0,41,5,78,122,5,37,100,46,37, - 100,114,39,0,0,0,41,2,114,143,0,0,0,90,11,115, - 121,115,95,118,101,114,115,105,111,110,114,10,0,0,0,41, - 10,218,11,68,69,66,85,71,95,66,85,73,76,68,218,18, - 82,69,71,73,83,84,82,89,95,75,69,89,95,68,69,66, - 85,71,218,12,82,69,71,73,83,84,82,89,95,75,69,89, - 114,70,0,0,0,114,15,0,0,0,218,12,118,101,114,115, - 105,111,110,95,105,110,102,111,114,197,0,0,0,114,196,0, - 0,0,90,10,81,117,101,114,121,86,97,108,117,101,114,58, - 0,0,0,41,6,218,3,99,108,115,114,143,0,0,0,90, - 12,114,101,103,105,115,116,114,121,95,107,101,121,114,20,0, - 0,0,90,4,104,107,101,121,218,8,102,105,108,101,112,97, - 116,104,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,16,95,115,101,97,114,99,104,95,114,101,103,105,115, - 116,114,121,254,2,0,0,115,30,0,0,0,6,2,8,1, - 6,2,6,1,16,1,6,255,2,2,12,1,26,1,18,128, - 4,3,12,254,6,1,2,255,255,128,122,38,87,105,110,100, - 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, - 114,46,95,115,101,97,114,99,104,95,114,101,103,105,115,116, - 114,121,78,99,4,0,0,0,0,0,0,0,0,0,0,0, - 8,0,0,0,8,0,0,0,67,0,0,0,115,120,0,0, - 0,124,0,160,0,124,1,161,1,125,4,124,4,100,0,117, - 0,114,22,100,0,83,0,122,12,116,1,124,4,131,1,1, - 0,87,0,110,18,4,0,116,2,121,118,1,0,1,0,1, - 0,89,0,100,0,83,0,116,3,131,0,68,0,93,52,92, - 2,125,5,125,6,124,4,160,4,116,5,124,6,131,1,161, - 1,114,112,116,6,106,7,124,1,124,5,124,1,124,4,131, - 2,124,4,100,1,141,3,125,7,124,7,2,0,1,0,83, - 0,113,60,100,0,83,0,119,0,41,2,78,114,184,0,0, - 0,41,8,114,204,0,0,0,114,57,0,0,0,114,58,0, - 0,0,114,188,0,0,0,114,115,0,0,0,114,116,0,0, - 0,114,139,0,0,0,218,16,115,112,101,99,95,102,114,111, - 109,95,108,111,97,100,101,114,41,8,114,202,0,0,0,114, - 143,0,0,0,114,52,0,0,0,218,6,116,97,114,103,101, - 116,114,203,0,0,0,114,144,0,0,0,114,193,0,0,0, - 114,191,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,9,102,105,110,100,95,115,112,101,99,13, - 3,0,0,115,36,0,0,0,10,2,8,1,4,1,2,1, - 12,1,12,1,6,1,14,1,14,1,6,1,8,1,2,1, - 6,254,8,3,2,252,4,255,2,254,255,128,122,31,87,105, - 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, - 100,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, - 0,0,67,0,0,0,115,30,0,0,0,124,0,160,0,124, - 1,124,2,161,2,125,3,124,3,100,1,117,1,114,26,124, - 3,106,1,83,0,100,1,83,0,41,2,122,108,70,105,110, - 100,32,109,111,100,117,108,101,32,110,97,109,101,100,32,105, - 110,32,116,104,101,32,114,101,103,105,115,116,114,121,46,10, - 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,85,115,101,32,101,120,101,99,95,109,111, - 100,117,108,101,40,41,32,105,110,115,116,101,97,100,46,10, - 10,32,32,32,32,32,32,32,32,78,169,2,114,207,0,0, - 0,114,144,0,0,0,169,4,114,202,0,0,0,114,143,0, - 0,0,114,52,0,0,0,114,191,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,11,102,105,110, - 100,95,109,111,100,117,108,101,29,3,0,0,115,10,0,0, - 0,12,7,8,1,6,1,4,2,255,128,122,33,87,105,110, + 105,114,101,100,44,32,116,104,111,117,103,104,46,41,10,10, + 32,32,32,32,42,110,97,109,101,42,32,105,115,32,116,104, + 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, + 100,117,108,101,32,98,101,105,110,103,32,105,109,112,111,114, + 116,101,100,46,32,73,116,32,105,115,32,117,115,101,100,32, + 102,111,114,32,108,111,103,103,105,110,103,46,10,10,32,32, + 32,32,42,101,120,99,95,100,101,116,97,105,108,115,42,32, + 105,115,32,97,32,100,105,99,116,105,111,110,97,114,121,32, + 112,97,115,115,101,100,32,116,111,32,73,109,112,111,114,116, + 69,114,114,111,114,32,105,102,32,105,116,32,114,97,105,115, + 101,100,32,102,111,114,10,32,32,32,32,105,109,112,114,111, + 118,101,100,32,100,101,98,117,103,103,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, + 119,104,101,110,32,116,104,101,32,102,108,97,103,115,10,32, + 32,32,32,102,105,101,108,100,32,105,115,32,105,110,118,97, + 108,105,100,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,32,116,114,117,110,99,97,116,101,100,46,10, + 10,32,32,32,32,78,114,32,0,0,0,122,20,98,97,100, + 32,109,97,103,105,99,32,110,117,109,98,101,114,32,105,110, + 32,122,2,58,32,250,2,123,125,233,16,0,0,0,122,40, + 114,101,97,99,104,101,100,32,69,79,70,32,119,104,105,108, + 101,32,114,101,97,100,105,110,103,32,112,121,99,32,104,101, + 97,100,101,114,32,111,102,32,233,8,0,0,0,233,252,255, + 255,255,122,14,105,110,118,97,108,105,100,32,102,108,97,103, + 115,32,122,4,32,105,110,32,41,7,218,12,77,65,71,73, + 67,95,78,85,77,66,69,82,114,146,0,0,0,218,16,95, + 118,101,114,98,111,115,101,95,109,101,115,115,97,103,101,114, + 129,0,0,0,114,4,0,0,0,218,8,69,79,70,69,114, + 114,111,114,114,43,0,0,0,41,6,114,42,0,0,0,114, + 128,0,0,0,218,11,101,120,99,95,100,101,116,97,105,108, + 115,90,5,109,97,103,105,99,114,105,0,0,0,114,17,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,13,95,99,108,97,115,115,105,102,121,95,112,121,99, + 31,2,0,0,115,30,0,0,0,12,16,8,1,16,1,12, + 1,16,1,12,1,10,1,12,1,8,1,16,1,8,2,16, + 1,16,1,4,1,255,128,114,163,0,0,0,99,5,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, + 0,67,0,0,0,115,124,0,0,0,116,0,124,0,100,1, + 100,2,133,2,25,0,131,1,124,1,100,3,64,0,107,3, + 114,62,100,4,124,3,155,2,157,2,125,5,116,1,160,2, + 100,5,124,5,161,2,1,0,116,3,124,5,102,1,105,0, + 124,4,164,1,142,1,130,1,124,2,100,6,117,1,114,120, + 116,0,124,0,100,2,100,7,133,2,25,0,131,1,124,2, + 100,3,64,0,107,3,114,116,116,3,100,4,124,3,155,2, + 157,2,102,1,105,0,124,4,164,1,142,1,130,1,100,6, + 83,0,100,6,83,0,41,8,97,7,2,0,0,86,97,108, + 105,100,97,116,101,32,97,32,112,121,99,32,97,103,97,105, + 110,115,116,32,116,104,101,32,115,111,117,114,99,101,32,108, + 97,115,116,45,109,111,100,105,102,105,101,100,32,116,105,109, + 101,46,10,10,32,32,32,32,42,100,97,116,97,42,32,105, + 115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111, + 102,32,116,104,101,32,112,121,99,32,102,105,108,101,46,32, + 40,79,110,108,121,32,116,104,101,32,102,105,114,115,116,32, + 49,54,32,98,121,116,101,115,32,97,114,101,10,32,32,32, + 32,114,101,113,117,105,114,101,100,46,41,10,10,32,32,32, + 32,42,115,111,117,114,99,101,95,109,116,105,109,101,42,32, + 105,115,32,116,104,101,32,108,97,115,116,32,109,111,100,105, + 102,105,101,100,32,116,105,109,101,115,116,97,109,112,32,111, + 102,32,116,104,101,32,115,111,117,114,99,101,32,102,105,108, + 101,46,10,10,32,32,32,32,42,115,111,117,114,99,101,95, + 115,105,122,101,42,32,105,115,32,78,111,110,101,32,111,114, + 32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101, + 32,115,111,117,114,99,101,32,102,105,108,101,32,105,110,32, + 98,121,116,101,115,46,10,10,32,32,32,32,42,110,97,109, + 101,42,32,105,115,32,116,104,101,32,110,97,109,101,32,111, + 102,32,116,104,101,32,109,111,100,117,108,101,32,98,101,105, + 110,103,32,105,109,112,111,114,116,101,100,46,32,73,116,32, + 105,115,32,117,115,101,100,32,102,111,114,32,108,111,103,103, + 105,110,103,46,10,10,32,32,32,32,42,101,120,99,95,100, + 101,116,97,105,108,115,42,32,105,115,32,97,32,100,105,99, + 116,105,111,110,97,114,121,32,112,97,115,115,101,100,32,116, + 111,32,73,109,112,111,114,116,69,114,114,111,114,32,105,102, + 32,105,116,32,114,97,105,115,101,100,32,102,111,114,10,32, + 32,32,32,105,109,112,114,111,118,101,100,32,100,101,98,117, + 103,103,105,110,103,46,10,10,32,32,32,32,65,110,32,73, + 109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,97, + 105,115,101,100,32,105,102,32,116,104,101,32,98,121,116,101, + 99,111,100,101,32,105,115,32,115,116,97,108,101,46,10,10, + 32,32,32,32,114,157,0,0,0,233,12,0,0,0,114,31, + 0,0,0,122,22,98,121,116,101,99,111,100,101,32,105,115, + 32,115,116,97,108,101,32,102,111,114,32,114,155,0,0,0, + 78,114,156,0,0,0,41,4,114,43,0,0,0,114,146,0, + 0,0,114,160,0,0,0,114,129,0,0,0,41,6,114,42, + 0,0,0,218,12,115,111,117,114,99,101,95,109,116,105,109, + 101,218,11,115,111,117,114,99,101,95,115,105,122,101,114,128, + 0,0,0,114,162,0,0,0,114,105,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,23,95,118, + 97,108,105,100,97,116,101,95,116,105,109,101,115,116,97,109, + 112,95,112,121,99,64,2,0,0,115,20,0,0,0,24,19, + 10,1,12,1,16,1,8,1,22,1,2,255,22,2,8,254, + 255,128,114,167,0,0,0,99,4,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,42,0,0,0,124,0,100,1,100,2,133,2,25,0,124, + 1,107,3,114,38,116,0,100,3,124,2,155,2,157,2,102, + 1,105,0,124,3,164,1,142,1,130,1,100,4,83,0,41, + 5,97,243,1,0,0,86,97,108,105,100,97,116,101,32,97, + 32,104,97,115,104,45,98,97,115,101,100,32,112,121,99,32, + 98,121,32,99,104,101,99,107,105,110,103,32,116,104,101,32, + 114,101,97,108,32,115,111,117,114,99,101,32,104,97,115,104, + 32,97,103,97,105,110,115,116,32,116,104,101,32,111,110,101, + 32,105,110,10,32,32,32,32,116,104,101,32,112,121,99,32, + 104,101,97,100,101,114,46,10,10,32,32,32,32,42,100,97, + 116,97,42,32,105,115,32,116,104,101,32,99,111,110,116,101, + 110,116,115,32,111,102,32,116,104,101,32,112,121,99,32,102, + 105,108,101,46,32,40,79,110,108,121,32,116,104,101,32,102, + 105,114,115,116,32,49,54,32,98,121,116,101,115,32,97,114, + 101,10,32,32,32,32,114,101,113,117,105,114,101,100,46,41, + 10,10,32,32,32,32,42,115,111,117,114,99,101,95,104,97, + 115,104,42,32,105,115,32,116,104,101,32,105,109,112,111,114, + 116,108,105,98,46,117,116,105,108,46,115,111,117,114,99,101, + 95,104,97,115,104,40,41,32,111,102,32,116,104,101,32,115, + 111,117,114,99,101,32,102,105,108,101,46,10,10,32,32,32, + 32,42,110,97,109,101,42,32,105,115,32,116,104,101,32,110, + 97,109,101,32,111,102,32,116,104,101,32,109,111,100,117,108, + 101,32,98,101,105,110,103,32,105,109,112,111,114,116,101,100, + 46,32,73,116,32,105,115,32,117,115,101,100,32,102,111,114, + 32,108,111,103,103,105,110,103,46,10,10,32,32,32,32,42, + 101,120,99,95,100,101,116,97,105,108,115,42,32,105,115,32, + 97,32,100,105,99,116,105,111,110,97,114,121,32,112,97,115, + 115,101,100,32,116,111,32,73,109,112,111,114,116,69,114,114, + 111,114,32,105,102,32,105,116,32,114,97,105,115,101,100,32, + 102,111,114,10,32,32,32,32,105,109,112,114,111,118,101,100, + 32,100,101,98,117,103,103,105,110,103,46,10,10,32,32,32, + 32,65,110,32,73,109,112,111,114,116,69,114,114,111,114,32, + 105,115,32,114,97,105,115,101,100,32,105,102,32,116,104,101, + 32,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97, + 108,101,46,10,10,32,32,32,32,114,157,0,0,0,114,156, + 0,0,0,122,46,104,97,115,104,32,105,110,32,98,121,116, + 101,99,111,100,101,32,100,111,101,115,110,39,116,32,109,97, + 116,99,104,32,104,97,115,104,32,111,102,32,115,111,117,114, + 99,101,32,78,41,1,114,129,0,0,0,41,4,114,42,0, + 0,0,218,11,115,111,117,114,99,101,95,104,97,115,104,114, + 128,0,0,0,114,162,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,18,95,118,97,108,105,100, + 97,116,101,95,104,97,115,104,95,112,121,99,92,2,0,0, + 115,16,0,0,0,16,17,2,1,8,1,4,255,2,2,6, + 254,4,255,255,128,114,169,0,0,0,99,4,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, + 0,0,0,115,76,0,0,0,116,0,160,1,124,0,161,1, + 125,4,116,2,124,4,116,3,131,2,114,56,116,4,160,5, + 100,1,124,2,161,2,1,0,124,3,100,2,117,1,114,52, + 116,6,160,7,124,4,124,3,161,2,1,0,124,4,83,0, + 116,8,100,3,160,9,124,2,161,1,124,1,124,2,100,4, + 141,3,130,1,41,5,122,35,67,111,109,112,105,108,101,32, + 98,121,116,101,99,111,100,101,32,97,115,32,102,111,117,110, + 100,32,105,110,32,97,32,112,121,99,46,122,21,99,111,100, + 101,32,111,98,106,101,99,116,32,102,114,111,109,32,123,33, + 114,125,78,122,23,78,111,110,45,99,111,100,101,32,111,98, + 106,101,99,116,32,105,110,32,123,33,114,125,169,2,114,128, + 0,0,0,114,58,0,0,0,41,10,218,7,109,97,114,115, + 104,97,108,90,5,108,111,97,100,115,218,10,105,115,105,110, + 115,116,97,110,99,101,218,10,95,99,111,100,101,95,116,121, + 112,101,114,146,0,0,0,114,160,0,0,0,218,4,95,105, + 109,112,90,16,95,102,105,120,95,99,111,95,102,105,108,101, + 110,97,109,101,114,129,0,0,0,114,77,0,0,0,41,5, + 114,42,0,0,0,114,128,0,0,0,114,118,0,0,0,114, + 119,0,0,0,218,4,99,111,100,101,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,17,95,99,111,109,112, + 105,108,101,95,98,121,116,101,99,111,100,101,116,2,0,0, + 115,20,0,0,0,10,2,10,1,12,1,8,1,12,1,4, + 1,10,2,4,1,6,255,255,128,114,176,0,0,0,99,3, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5, + 0,0,0,67,0,0,0,115,70,0,0,0,116,0,116,1, + 131,1,125,3,124,3,160,2,116,3,100,1,131,1,161,1, + 1,0,124,3,160,2,116,3,124,1,131,1,161,1,1,0, + 124,3,160,2,116,3,124,2,131,1,161,1,1,0,124,3, + 160,2,116,4,160,5,124,0,161,1,161,1,1,0,124,3, + 83,0,41,3,122,43,80,114,111,100,117,99,101,32,116,104, + 101,32,100,97,116,97,32,102,111,114,32,97,32,116,105,109, + 101,115,116,97,109,112,45,98,97,115,101,100,32,112,121,99, + 46,114,0,0,0,0,78,41,6,218,9,98,121,116,101,97, + 114,114,97,121,114,159,0,0,0,218,6,101,120,116,101,110, + 100,114,37,0,0,0,114,171,0,0,0,218,5,100,117,109, + 112,115,41,4,114,175,0,0,0,218,5,109,116,105,109,101, + 114,166,0,0,0,114,42,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,22,95,99,111,100,101, + 95,116,111,95,116,105,109,101,115,116,97,109,112,95,112,121, + 99,129,2,0,0,115,14,0,0,0,8,2,14,1,14,1, + 14,1,16,1,4,1,255,128,114,181,0,0,0,84,99,3, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5, + 0,0,0,67,0,0,0,115,80,0,0,0,116,0,116,1, + 131,1,125,3,100,1,124,2,100,1,62,0,66,0,125,4, + 124,3,160,2,116,3,124,4,131,1,161,1,1,0,116,4, + 124,1,131,1,100,2,107,2,115,50,74,0,130,1,124,3, + 160,2,124,1,161,1,1,0,124,3,160,2,116,5,160,6, + 124,0,161,1,161,1,1,0,124,3,83,0,41,4,122,38, + 80,114,111,100,117,99,101,32,116,104,101,32,100,97,116,97, + 32,102,111,114,32,97,32,104,97,115,104,45,98,97,115,101, + 100,32,112,121,99,46,114,3,0,0,0,114,157,0,0,0, + 78,41,7,114,177,0,0,0,114,159,0,0,0,114,178,0, + 0,0,114,37,0,0,0,114,4,0,0,0,114,171,0,0, + 0,114,179,0,0,0,41,5,114,175,0,0,0,114,168,0, + 0,0,90,7,99,104,101,99,107,101,100,114,42,0,0,0, + 114,17,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,17,95,99,111,100,101,95,116,111,95,104, + 97,115,104,95,112,121,99,139,2,0,0,115,16,0,0,0, + 8,2,12,1,14,1,16,1,10,1,16,1,4,1,255,128, + 114,182,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,6,0,0,0,67,0,0,0,115,62, + 0,0,0,100,1,100,2,108,0,125,1,116,1,160,2,124, + 0,161,1,106,3,125,2,124,1,160,4,124,2,161,1,125, + 3,116,1,160,5,100,2,100,3,161,2,125,4,124,4,160, + 6,124,0,160,6,124,3,100,1,25,0,161,1,161,1,83, + 0,41,4,122,121,68,101,99,111,100,101,32,98,121,116,101, + 115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,115, + 111,117,114,99,101,32,99,111,100,101,32,97,110,100,32,114, + 101,116,117,114,110,32,116,104,101,32,115,116,114,105,110,103, + 46,10,10,32,32,32,32,85,110,105,118,101,114,115,97,108, + 32,110,101,119,108,105,110,101,32,115,117,112,112,111,114,116, + 32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32, + 100,101,99,111,100,105,110,103,46,10,32,32,32,32,114,0, + 0,0,0,78,84,41,7,218,8,116,111,107,101,110,105,122, + 101,114,79,0,0,0,90,7,66,121,116,101,115,73,79,90, + 8,114,101,97,100,108,105,110,101,90,15,100,101,116,101,99, + 116,95,101,110,99,111,100,105,110,103,90,25,73,110,99,114, + 101,109,101,110,116,97,108,78,101,119,108,105,110,101,68,101, + 99,111,100,101,114,218,6,100,101,99,111,100,101,41,5,218, + 12,115,111,117,114,99,101,95,98,121,116,101,115,114,183,0, + 0,0,90,21,115,111,117,114,99,101,95,98,121,116,101,115, + 95,114,101,97,100,108,105,110,101,218,8,101,110,99,111,100, + 105,110,103,90,15,110,101,119,108,105,110,101,95,100,101,99, + 111,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,13,100,101,99,111,100,101,95,115,111,117,114, + 99,101,150,2,0,0,115,12,0,0,0,8,5,12,1,10, + 1,12,1,20,1,255,128,114,187,0,0,0,169,2,114,151, + 0,0,0,218,26,115,117,98,109,111,100,117,108,101,95,115, + 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,99, + 2,0,0,0,0,0,0,0,2,0,0,0,9,0,0,0, + 8,0,0,0,67,0,0,0,115,16,1,0,0,124,1,100, + 1,117,0,114,58,100,2,125,1,116,0,124,2,100,3,131, + 2,114,56,122,14,124,2,160,1,124,0,161,1,125,1,87, + 0,110,30,4,0,116,2,144,1,121,14,1,0,1,0,1, + 0,89,0,110,12,110,10,116,3,160,4,124,1,161,1,125, + 1,116,5,106,6,124,0,124,2,124,1,100,4,141,3,125, + 4,100,5,124,4,95,7,124,2,100,1,117,0,114,152,116, + 8,131,0,68,0,93,42,92,2,125,5,125,6,124,1,160, + 9,116,10,124,6,131,1,161,1,114,146,124,5,124,0,124, + 1,131,2,125,2,124,2,124,4,95,11,1,0,113,152,113, + 104,100,1,83,0,124,3,116,12,117,0,114,216,116,0,124, + 2,100,6,131,2,114,214,122,14,124,2,160,13,124,0,161, + 1,125,7,87,0,110,18,4,0,116,2,144,1,121,12,1, + 0,1,0,1,0,89,0,110,18,124,7,114,214,103,0,124, + 4,95,14,110,6,124,3,124,4,95,14,124,4,106,14,103, + 0,107,2,144,1,114,8,124,1,144,1,114,8,116,15,124, + 1,131,1,100,7,25,0,125,8,124,4,106,14,160,16,124, + 8,161,1,1,0,124,4,83,0,119,0,119,0,41,8,97, + 61,1,0,0,82,101,116,117,114,110,32,97,32,109,111,100, + 117,108,101,32,115,112,101,99,32,98,97,115,101,100,32,111, + 110,32,97,32,102,105,108,101,32,108,111,99,97,116,105,111, + 110,46,10,10,32,32,32,32,84,111,32,105,110,100,105,99, + 97,116,101,32,116,104,97,116,32,116,104,101,32,109,111,100, + 117,108,101,32,105,115,32,97,32,112,97,99,107,97,103,101, + 44,32,115,101,116,10,32,32,32,32,115,117,98,109,111,100, + 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, + 105,111,110,115,32,116,111,32,97,32,108,105,115,116,32,111, + 102,32,100,105,114,101,99,116,111,114,121,32,112,97,116,104, + 115,46,32,32,65,110,10,32,32,32,32,101,109,112,116,121, + 32,108,105,115,116,32,105,115,32,115,117,102,102,105,99,105, + 101,110,116,44,32,116,104,111,117,103,104,32,105,116,115,32, + 110,111,116,32,111,116,104,101,114,119,105,115,101,32,117,115, + 101,102,117,108,32,116,111,32,116,104,101,10,32,32,32,32, + 105,109,112,111,114,116,32,115,121,115,116,101,109,46,10,10, + 32,32,32,32,84,104,101,32,108,111,97,100,101,114,32,109, + 117,115,116,32,116,97,107,101,32,97,32,115,112,101,99,32, + 97,115,32,105,116,115,32,111,110,108,121,32,95,95,105,110, + 105,116,95,95,40,41,32,97,114,103,46,10,10,32,32,32, + 32,78,122,9,60,117,110,107,110,111,119,110,62,218,12,103, + 101,116,95,102,105,108,101,110,97,109,101,169,1,218,6,111, + 114,105,103,105,110,84,218,10,105,115,95,112,97,99,107,97, + 103,101,114,0,0,0,0,41,17,114,140,0,0,0,114,190, + 0,0,0,114,129,0,0,0,114,19,0,0,0,114,92,0, + 0,0,114,146,0,0,0,218,10,77,111,100,117,108,101,83, + 112,101,99,90,13,95,115,101,116,95,102,105,108,101,97,116, + 116,114,218,27,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,114, + 122,0,0,0,114,123,0,0,0,114,151,0,0,0,218,9, + 95,80,79,80,85,76,65,84,69,114,193,0,0,0,114,189, + 0,0,0,114,61,0,0,0,218,6,97,112,112,101,110,100, + 41,9,114,128,0,0,0,90,8,108,111,99,97,116,105,111, + 110,114,151,0,0,0,114,189,0,0,0,218,4,115,112,101, + 99,218,12,108,111,97,100,101,114,95,99,108,97,115,115,218, + 8,115,117,102,102,105,120,101,115,114,193,0,0,0,90,7, + 100,105,114,110,97,109,101,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,23,115,112,101,99,95,102,114,111, + 109,95,102,105,108,101,95,108,111,99,97,116,105,111,110,167, + 2,0,0,115,74,0,0,0,8,12,4,4,10,1,2,2, + 14,1,14,1,4,1,2,251,10,7,16,8,6,1,8,3, + 14,1,14,1,10,1,6,1,4,1,2,253,4,5,8,3, + 10,2,2,1,14,1,14,1,4,1,4,2,6,1,2,128, + 6,2,12,1,6,1,12,1,12,1,4,2,2,244,2,226, + 255,128,114,201,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,64,0,0,0, + 115,88,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,90,4,100,3,90,5,101,6,111,30,100,4,101, + 7,118,0,90,8,101,9,100,5,100,6,132,0,131,1,90, + 10,101,11,100,7,100,8,132,0,131,1,90,12,101,11,100, + 14,100,10,100,11,132,1,131,1,90,13,101,11,100,15,100, + 12,100,13,132,1,131,1,90,14,100,9,83,0,41,16,218, + 21,87,105,110,100,111,119,115,82,101,103,105,115,116,114,121, + 70,105,110,100,101,114,122,62,77,101,116,97,32,112,97,116, + 104,32,102,105,110,100,101,114,32,102,111,114,32,109,111,100, + 117,108,101,115,32,100,101,99,108,97,114,101,100,32,105,110, + 32,116,104,101,32,87,105,110,100,111,119,115,32,114,101,103, + 105,115,116,114,121,46,122,59,83,111,102,116,119,97,114,101, + 92,80,121,116,104,111,110,92,80,121,116,104,111,110,67,111, + 114,101,92,123,115,121,115,95,118,101,114,115,105,111,110,125, + 92,77,111,100,117,108,101,115,92,123,102,117,108,108,110,97, + 109,101,125,122,65,83,111,102,116,119,97,114,101,92,80,121, + 116,104,111,110,92,80,121,116,104,111,110,67,111,114,101,92, + 123,115,121,115,95,118,101,114,115,105,111,110,125,92,77,111, + 100,117,108,101,115,92,123,102,117,108,108,110,97,109,101,125, + 92,68,101,98,117,103,122,6,95,100,46,112,121,100,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8, + 0,0,0,67,0,0,0,115,50,0,0,0,122,16,116,0, + 160,1,116,0,106,2,124,0,161,2,87,0,83,0,4,0, + 116,3,121,48,1,0,1,0,1,0,116,0,160,1,116,0, + 106,4,124,0,161,2,6,0,89,0,83,0,119,0,114,121, + 0,0,0,41,5,218,6,119,105,110,114,101,103,90,7,79, + 112,101,110,75,101,121,90,17,72,75,69,89,95,67,85,82, + 82,69,78,84,95,85,83,69,82,114,64,0,0,0,90,18, + 72,75,69,89,95,76,79,67,65,76,95,77,65,67,72,73, + 78,69,114,20,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,14,95,111,112,101,110,95,114,101, + 103,105,115,116,114,121,247,2,0,0,115,12,0,0,0,2, + 2,16,1,12,1,18,1,2,255,255,128,122,36,87,105,110, 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, - 101,114,46,102,105,110,100,95,109,111,100,117,108,101,41,2, - 78,78,41,1,78,41,15,114,130,0,0,0,114,129,0,0, - 0,114,131,0,0,0,114,132,0,0,0,114,200,0,0,0, - 114,199,0,0,0,218,11,95,77,83,95,87,73,78,68,79, - 87,83,218,18,69,88,84,69,78,83,73,79,78,95,83,85, - 70,70,73,88,69,83,114,198,0,0,0,218,12,115,116,97, - 116,105,99,109,101,116,104,111,100,114,197,0,0,0,218,11, - 99,108,97,115,115,109,101,116,104,111,100,114,204,0,0,0, - 114,207,0,0,0,114,210,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,195, - 0,0,0,235,2,0,0,115,32,0,0,0,8,0,4,2, - 2,3,2,255,2,4,2,255,12,3,2,2,10,1,2,6, - 10,1,2,14,12,1,2,15,16,1,255,128,114,195,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,64,0,0,0,115,48,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, - 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,132, - 0,90,6,100,8,100,9,132,0,90,7,100,10,83,0,41, - 11,218,13,95,76,111,97,100,101,114,66,97,115,105,99,115, - 122,83,66,97,115,101,32,99,108,97,115,115,32,111,102,32, - 99,111,109,109,111,110,32,99,111,100,101,32,110,101,101,100, - 101,100,32,98,121,32,98,111,116,104,32,83,111,117,114,99, - 101,76,111,97,100,101,114,32,97,110,100,10,32,32,32,32, - 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111, - 97,100,101,114,46,99,2,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,4,0,0,0,67,0,0,0,115,64, - 0,0,0,116,0,124,0,160,1,124,1,161,1,131,1,100, - 1,25,0,125,2,124,2,160,2,100,2,100,1,161,2,100, - 3,25,0,125,3,124,1,160,3,100,2,161,1,100,4,25, - 0,125,4,124,3,100,5,107,2,111,62,124,4,100,5,107, - 3,83,0,41,7,122,141,67,111,110,99,114,101,116,101,32, - 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111, - 102,32,73,110,115,112,101,99,116,76,111,97,100,101,114,46, - 105,115,95,112,97,99,107,97,103,101,32,98,121,32,99,104, - 101,99,107,105,110,103,32,105,102,10,32,32,32,32,32,32, - 32,32,116,104,101,32,112,97,116,104,32,114,101,116,117,114, - 110,101,100,32,98,121,32,103,101,116,95,102,105,108,101,110, - 97,109,101,32,104,97,115,32,97,32,102,105,108,101,110,97, - 109,101,32,111,102,32,39,95,95,105,110,105,116,95,95,46, - 112,121,39,46,114,3,0,0,0,114,79,0,0,0,114,0, - 0,0,0,114,39,0,0,0,218,8,95,95,105,110,105,116, - 95,95,78,41,4,114,55,0,0,0,114,183,0,0,0,114, - 51,0,0,0,114,49,0,0,0,41,5,114,123,0,0,0, - 114,143,0,0,0,114,101,0,0,0,90,13,102,105,108,101, - 110,97,109,101,95,98,97,115,101,90,9,116,97,105,108,95, - 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,186,0,0,0,48,3,0,0,115,10,0,0, - 0,18,3,16,1,14,1,16,1,255,128,122,24,95,76,111, - 97,100,101,114,66,97,115,105,99,115,46,105,115,95,112,97, - 99,107,97,103,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,169,2,122,42,85,115,101,32,100, - 101,102,97,117,108,116,32,115,101,109,97,110,116,105,99,115, - 32,102,111,114,32,109,111,100,117,108,101,32,99,114,101,97, - 116,105,111,110,46,78,114,7,0,0,0,169,2,114,123,0, - 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,13,99,114,101,97,116,101,95,109, - 111,100,117,108,101,56,3,0,0,115,4,0,0,0,4,0, - 255,128,122,27,95,76,111,97,100,101,114,66,97,115,105,99, - 115,46,99,114,101,97,116,101,95,109,111,100,117,108,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 5,0,0,0,67,0,0,0,115,56,0,0,0,124,0,160, - 0,124,1,106,1,161,1,125,2,124,2,100,1,117,0,114, - 36,116,2,100,2,160,3,124,1,106,1,161,1,131,1,130, - 1,116,4,160,5,116,6,124,2,124,1,106,7,161,3,1, - 0,100,1,83,0,41,3,122,19,69,120,101,99,117,116,101, - 32,116,104,101,32,109,111,100,117,108,101,46,78,122,52,99, - 97,110,110,111,116,32,108,111,97,100,32,109,111,100,117,108, - 101,32,123,33,114,125,32,119,104,101,110,32,103,101,116,95, - 99,111,100,101,40,41,32,114,101,116,117,114,110,115,32,78, - 111,110,101,41,8,218,8,103,101,116,95,99,111,100,101,114, - 130,0,0,0,114,122,0,0,0,114,70,0,0,0,114,139, - 0,0,0,218,25,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,218,4, - 101,120,101,99,114,136,0,0,0,41,3,114,123,0,0,0, - 218,6,109,111,100,117,108,101,114,168,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,11,101,120, - 101,99,95,109,111,100,117,108,101,59,3,0,0,115,14,0, - 0,0,12,2,8,1,6,1,4,1,6,255,20,2,255,128, - 122,25,95,76,111,97,100,101,114,66,97,115,105,99,115,46, - 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 67,0,0,0,115,12,0,0,0,116,0,160,1,124,0,124, - 1,161,2,83,0,41,2,122,26,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,78,41,2,114,139,0,0,0,218,17,95,108,111, - 97,100,95,109,111,100,117,108,101,95,115,104,105,109,169,2, - 114,123,0,0,0,114,143,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,11,108,111,97,100,95, - 109,111,100,117,108,101,67,3,0,0,115,4,0,0,0,12, - 3,255,128,122,25,95,76,111,97,100,101,114,66,97,115,105, - 99,115,46,108,111,97,100,95,109,111,100,117,108,101,78,41, - 8,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, - 114,132,0,0,0,114,186,0,0,0,114,219,0,0,0,114, - 224,0,0,0,114,227,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,215,0, - 0,0,43,3,0,0,115,14,0,0,0,8,0,4,2,8, - 3,8,8,8,3,12,8,255,128,114,215,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,64,0,0,0,115,74,0,0,0,101,0,90,1, - 100,0,90,2,100,1,100,2,132,0,90,3,100,3,100,4, - 132,0,90,4,100,5,100,6,132,0,90,5,100,7,100,8, - 132,0,90,6,100,9,100,10,132,0,90,7,100,11,100,12, - 156,1,100,13,100,14,132,2,90,8,100,15,100,16,132,0, - 90,9,100,17,83,0,41,18,218,12,83,111,117,114,99,101, - 76,111,97,100,101,114,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,116,0,130,1,41,2,122,165,79,112,116,105, - 111,110,97,108,32,109,101,116,104,111,100,32,116,104,97,116, - 32,114,101,116,117,114,110,115,32,116,104,101,32,109,111,100, - 105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,40, - 97,110,32,105,110,116,41,32,102,111,114,32,116,104,101,10, - 32,32,32,32,32,32,32,32,115,112,101,99,105,102,105,101, - 100,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, - 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32, - 79,83,69,114,114,111,114,32,119,104,101,110,32,116,104,101, - 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32, - 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32, - 32,78,41,1,114,58,0,0,0,169,2,114,123,0,0,0, - 114,52,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,10,112,97,116,104,95,109,116,105,109,101, - 75,3,0,0,115,4,0,0,0,4,6,255,128,122,23,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,0, - 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, - 14,0,0,0,100,1,124,0,160,0,124,1,161,1,105,1, - 83,0,41,3,97,158,1,0,0,79,112,116,105,111,110,97, - 108,32,109,101,116,104,111,100,32,114,101,116,117,114,110,105, - 110,103,32,97,32,109,101,116,97,100,97,116,97,32,100,105, - 99,116,32,102,111,114,32,116,104,101,32,115,112,101,99,105, - 102,105,101,100,10,32,32,32,32,32,32,32,32,112,97,116, - 104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,32, - 32,32,32,32,80,111,115,115,105,98,108,101,32,107,101,121, - 115,58,10,32,32,32,32,32,32,32,32,45,32,39,109,116, - 105,109,101,39,32,40,109,97,110,100,97,116,111,114,121,41, - 32,105,115,32,116,104,101,32,110,117,109,101,114,105,99,32, - 116,105,109,101,115,116,97,109,112,32,111,102,32,108,97,115, - 116,32,115,111,117,114,99,101,10,32,32,32,32,32,32,32, - 32,32,32,99,111,100,101,32,109,111,100,105,102,105,99,97, - 116,105,111,110,59,10,32,32,32,32,32,32,32,32,45,32, - 39,115,105,122,101,39,32,40,111,112,116,105,111,110,97,108, - 41,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110, - 32,98,121,116,101,115,32,111,102,32,116,104,101,32,115,111, - 117,114,99,101,32,99,111,100,101,46,10,10,32,32,32,32, - 32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,103, - 32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,108, - 111,119,115,32,116,104,101,32,108,111,97,100,101,114,32,116, - 111,32,114,101,97,100,32,98,121,116,101,99,111,100,101,32, - 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,82, + 101,114,46,95,111,112,101,110,95,114,101,103,105,115,116,114, + 121,99,2,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,8,0,0,0,67,0,0,0,115,130,0,0,0,124, + 0,106,0,114,14,124,0,106,1,125,2,110,6,124,0,106, + 2,125,2,124,2,106,3,124,1,100,1,116,4,106,5,100, + 0,100,2,133,2,25,0,22,0,100,3,141,2,125,3,122, + 60,124,0,160,6,124,3,161,1,143,28,125,4,116,7,160, + 8,124,4,100,4,161,2,125,5,87,0,100,0,4,0,4, + 0,131,3,1,0,110,16,49,0,115,94,119,1,1,0,1, + 0,1,0,89,0,1,0,87,0,124,5,83,0,4,0,116, + 9,121,128,1,0,1,0,1,0,89,0,100,0,83,0,119, + 0,41,5,78,122,5,37,100,46,37,100,114,45,0,0,0, + 41,2,114,150,0,0,0,90,11,115,121,115,95,118,101,114, + 115,105,111,110,114,10,0,0,0,41,10,218,11,68,69,66, + 85,71,95,66,85,73,76,68,218,18,82,69,71,73,83,84, + 82,89,95,75,69,89,95,68,69,66,85,71,218,12,82,69, + 71,73,83,84,82,89,95,75,69,89,114,77,0,0,0,114, + 16,0,0,0,218,12,118,101,114,115,105,111,110,95,105,110, + 102,111,114,204,0,0,0,114,203,0,0,0,90,10,81,117, + 101,114,121,86,97,108,117,101,114,64,0,0,0,41,6,218, + 3,99,108,115,114,150,0,0,0,90,12,114,101,103,105,115, + 116,114,121,95,107,101,121,114,21,0,0,0,90,4,104,107, + 101,121,218,8,102,105,108,101,112,97,116,104,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,16,95,115,101, + 97,114,99,104,95,114,101,103,105,115,116,114,121,254,2,0, + 0,115,30,0,0,0,6,2,8,1,6,2,6,1,16,1, + 6,255,2,2,12,1,26,1,18,128,4,3,12,254,6,1, + 2,255,255,128,122,38,87,105,110,100,111,119,115,82,101,103, + 105,115,116,114,121,70,105,110,100,101,114,46,95,115,101,97, + 114,99,104,95,114,101,103,105,115,116,114,121,78,99,4,0, + 0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0, + 0,0,67,0,0,0,115,120,0,0,0,124,0,160,0,124, + 1,161,1,125,4,124,4,100,0,117,0,114,22,100,0,83, + 0,122,12,116,1,124,4,131,1,1,0,87,0,110,18,4, + 0,116,2,121,118,1,0,1,0,1,0,89,0,100,0,83, + 0,116,3,131,0,68,0,93,52,92,2,125,5,125,6,124, + 4,160,4,116,5,124,6,131,1,161,1,114,112,116,6,106, + 7,124,1,124,5,124,1,124,4,131,2,124,4,100,1,141, + 3,125,7,124,7,2,0,1,0,83,0,113,60,100,0,83, + 0,119,0,41,2,78,114,191,0,0,0,41,8,114,211,0, + 0,0,114,63,0,0,0,114,64,0,0,0,114,195,0,0, + 0,114,122,0,0,0,114,123,0,0,0,114,146,0,0,0, + 218,16,115,112,101,99,95,102,114,111,109,95,108,111,97,100, + 101,114,41,8,114,209,0,0,0,114,150,0,0,0,114,58, + 0,0,0,218,6,116,97,114,103,101,116,114,210,0,0,0, + 114,151,0,0,0,114,200,0,0,0,114,198,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,9, + 102,105,110,100,95,115,112,101,99,13,3,0,0,115,36,0, + 0,0,10,2,8,1,4,1,2,1,12,1,12,1,6,1, + 14,1,14,1,6,1,8,1,2,1,6,254,8,3,2,252, + 4,255,2,254,255,128,122,31,87,105,110,100,111,119,115,82, + 101,103,105,115,116,114,121,70,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,30,0,0,0,124,0,160,0,124,1,124,2,161,2,125, + 3,124,3,100,1,117,1,114,26,124,3,106,1,83,0,100, + 1,83,0,41,2,122,108,70,105,110,100,32,109,111,100,117, + 108,101,32,110,97,109,101,100,32,105,110,32,116,104,101,32, + 114,101,103,105,115,116,114,121,46,10,10,32,32,32,32,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,101,120,101,99,95,109,111,100,117,108,101,40,41, + 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, + 32,32,32,78,169,2,114,214,0,0,0,114,151,0,0,0, + 169,4,114,209,0,0,0,114,150,0,0,0,114,58,0,0, + 0,114,198,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,11,102,105,110,100,95,109,111,100,117, + 108,101,29,3,0,0,115,10,0,0,0,12,7,8,1,6, + 1,4,2,255,128,122,33,87,105,110,100,111,119,115,82,101, + 103,105,115,116,114,121,70,105,110,100,101,114,46,102,105,110, + 100,95,109,111,100,117,108,101,41,2,78,78,41,1,78,41, + 15,114,137,0,0,0,114,136,0,0,0,114,138,0,0,0, + 114,139,0,0,0,114,207,0,0,0,114,206,0,0,0,218, + 11,95,77,83,95,87,73,78,68,79,87,83,218,18,69,88, + 84,69,78,83,73,79,78,95,83,85,70,70,73,88,69,83, + 114,205,0,0,0,218,12,115,116,97,116,105,99,109,101,116, + 104,111,100,114,204,0,0,0,218,11,99,108,97,115,115,109, + 101,116,104,111,100,114,211,0,0,0,114,214,0,0,0,114, + 217,0,0,0,114,7,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,202,0,0,0,235,2,0, + 0,115,32,0,0,0,8,0,4,2,2,3,2,255,2,4, + 2,255,12,3,2,2,10,1,2,6,10,1,2,14,12,1, + 2,15,16,1,255,128,114,202,0,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 64,0,0,0,115,48,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, + 5,132,0,90,5,100,6,100,7,132,0,90,6,100,8,100, + 9,132,0,90,7,100,10,83,0,41,11,218,13,95,76,111, + 97,100,101,114,66,97,115,105,99,115,122,83,66,97,115,101, + 32,99,108,97,115,115,32,111,102,32,99,111,109,109,111,110, + 32,99,111,100,101,32,110,101,101,100,101,100,32,98,121,32, + 98,111,116,104,32,83,111,117,114,99,101,76,111,97,100,101, + 114,32,97,110,100,10,32,32,32,32,83,111,117,114,99,101, + 108,101,115,115,70,105,108,101,76,111,97,100,101,114,46,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,124, + 0,160,1,124,1,161,1,131,1,100,1,25,0,125,2,124, + 2,160,2,100,2,100,1,161,2,100,3,25,0,125,3,124, + 1,160,3,100,2,161,1,100,4,25,0,125,4,124,3,100, + 5,107,2,111,62,124,4,100,5,107,3,83,0,41,7,122, + 141,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109, + 101,110,116,97,116,105,111,110,32,111,102,32,73,110,115,112, + 101,99,116,76,111,97,100,101,114,46,105,115,95,112,97,99, + 107,97,103,101,32,98,121,32,99,104,101,99,107,105,110,103, + 32,105,102,10,32,32,32,32,32,32,32,32,116,104,101,32, + 112,97,116,104,32,114,101,116,117,114,110,101,100,32,98,121, + 32,103,101,116,95,102,105,108,101,110,97,109,101,32,104,97, + 115,32,97,32,102,105,108,101,110,97,109,101,32,111,102,32, + 39,95,95,105,110,105,116,95,95,46,112,121,39,46,114,3, + 0,0,0,114,86,0,0,0,114,0,0,0,0,114,45,0, + 0,0,218,8,95,95,105,110,105,116,95,95,78,41,4,114, + 61,0,0,0,114,190,0,0,0,114,57,0,0,0,114,55, + 0,0,0,41,5,114,130,0,0,0,114,150,0,0,0,114, + 108,0,0,0,90,13,102,105,108,101,110,97,109,101,95,98, + 97,115,101,90,9,116,97,105,108,95,110,97,109,101,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,193,0, + 0,0,48,3,0,0,115,10,0,0,0,18,3,16,1,14, + 1,16,1,255,128,122,24,95,76,111,97,100,101,114,66,97, + 115,105,99,115,46,105,115,95,112,97,99,107,97,103,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,114,24,0,0,0,169,2,122, + 42,85,115,101,32,100,101,102,97,117,108,116,32,115,101,109, + 97,110,116,105,99,115,32,102,111,114,32,109,111,100,117,108, + 101,32,99,114,101,97,116,105,111,110,46,78,114,7,0,0, + 0,169,2,114,130,0,0,0,114,198,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,13,99,114, + 101,97,116,101,95,109,111,100,117,108,101,56,3,0,0,243, + 4,0,0,0,4,0,255,128,122,27,95,76,111,97,100,101, + 114,66,97,115,105,99,115,46,99,114,101,97,116,101,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,56, + 0,0,0,124,0,160,0,124,1,106,1,161,1,125,2,124, + 2,100,1,117,0,114,36,116,2,100,2,160,3,124,1,106, + 1,161,1,131,1,130,1,116,4,160,5,116,6,124,2,124, + 1,106,7,161,3,1,0,100,1,83,0,41,3,122,19,69, + 120,101,99,117,116,101,32,116,104,101,32,109,111,100,117,108, + 101,46,78,122,52,99,97,110,110,111,116,32,108,111,97,100, + 32,109,111,100,117,108,101,32,123,33,114,125,32,119,104,101, + 110,32,103,101,116,95,99,111,100,101,40,41,32,114,101,116, + 117,114,110,115,32,78,111,110,101,41,8,218,8,103,101,116, + 95,99,111,100,101,114,137,0,0,0,114,129,0,0,0,114, + 77,0,0,0,114,146,0,0,0,218,25,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,218,4,101,120,101,99,114,143,0,0,0,41, + 3,114,130,0,0,0,218,6,109,111,100,117,108,101,114,175, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,11,101,120,101,99,95,109,111,100,117,108,101,59, + 3,0,0,115,14,0,0,0,12,2,8,1,6,1,4,1, + 6,255,20,2,255,128,122,25,95,76,111,97,100,101,114,66, + 97,115,105,99,115,46,101,120,101,99,95,109,111,100,117,108, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,4,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,160,1,124,0,124,1,161,2,83,0,41,2,122,26,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,78,41,2,114,146,0,0, + 0,218,17,95,108,111,97,100,95,109,111,100,117,108,101,95, + 115,104,105,109,169,2,114,130,0,0,0,114,150,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 11,108,111,97,100,95,109,111,100,117,108,101,67,3,0,0, + 115,4,0,0,0,12,3,255,128,122,25,95,76,111,97,100, + 101,114,66,97,115,105,99,115,46,108,111,97,100,95,109,111, + 100,117,108,101,78,41,8,114,137,0,0,0,114,136,0,0, + 0,114,138,0,0,0,114,139,0,0,0,114,193,0,0,0, + 114,226,0,0,0,114,232,0,0,0,114,235,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,222,0,0,0,43,3,0,0,115,14,0,0, + 0,8,0,4,2,8,3,8,8,8,3,12,8,255,128,114, + 222,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,64,0,0,0,115,74,0, + 0,0,101,0,90,1,100,0,90,2,100,1,100,2,132,0, + 90,3,100,3,100,4,132,0,90,4,100,5,100,6,132,0, + 90,5,100,7,100,8,132,0,90,6,100,9,100,10,132,0, + 90,7,100,11,100,12,156,1,100,13,100,14,132,2,90,8, + 100,15,100,16,132,0,90,9,100,17,83,0,41,18,218,12, + 83,111,117,114,99,101,76,111,97,100,101,114,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,116,0,130,1,41,2, + 122,165,79,112,116,105,111,110,97,108,32,109,101,116,104,111, + 100,32,116,104,97,116,32,114,101,116,117,114,110,115,32,116, + 104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32, + 116,105,109,101,32,40,97,110,32,105,110,116,41,32,102,111, + 114,32,116,104,101,10,32,32,32,32,32,32,32,32,115,112, + 101,99,105,102,105,101,100,32,112,97,116,104,32,40,97,32, + 115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,82, 97,105,115,101,115,32,79,83,69,114,114,111,114,32,119,104, 101,110,32,116,104,101,32,112,97,116,104,32,99,97,110,110, 111,116,32,98,101,32,104,97,110,100,108,101,100,46,10,32, - 32,32,32,32,32,32,32,114,173,0,0,0,78,41,1,114, - 230,0,0,0,114,229,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,10,112,97,116,104,95,115, - 116,97,116,115,83,3,0,0,115,4,0,0,0,14,12,255, - 128,122,23,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,0,0,0,0,4,0,0,0,4,0,0,0,67, - 0,0,0,115,12,0,0,0,124,0,160,0,124,2,124,3, - 161,2,83,0,41,2,122,228,79,112,116,105,111,110,97,108, - 32,109,101,116,104,111,100,32,119,104,105,99,104,32,119,114, - 105,116,101,115,32,100,97,116,97,32,40,98,121,116,101,115, - 41,32,116,111,32,97,32,102,105,108,101,32,112,97,116,104, - 32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,32, - 32,32,32,73,109,112,108,101,109,101,110,116,105,110,103,32, - 116,104,105,115,32,109,101,116,104,111,100,32,97,108,108,111, - 119,115,32,102,111,114,32,116,104,101,32,119,114,105,116,105, - 110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,102, - 105,108,101,115,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,115,111,117,114,99,101,32,112,97,116,104,32,105, - 115,32,110,101,101,100,101,100,32,105,110,32,111,114,100,101, - 114,32,116,111,32,99,111,114,114,101,99,116,108,121,32,116, - 114,97,110,115,102,101,114,32,112,101,114,109,105,115,115,105, - 111,110,115,10,32,32,32,32,32,32,32,32,78,41,1,218, - 8,115,101,116,95,100,97,116,97,41,4,114,123,0,0,0, - 114,112,0,0,0,90,10,99,97,99,104,101,95,112,97,116, - 104,114,37,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,15,95,99,97,99,104,101,95,98,121, - 116,101,99,111,100,101,97,3,0,0,115,4,0,0,0,12, - 8,255,128,122,28,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,0,0,0,0,3,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,150,79,112,116,105,111,110,97,108,32, - 109,101,116,104,111,100,32,119,104,105,99,104,32,119,114,105, - 116,101,115,32,100,97,116,97,32,40,98,121,116,101,115,41, - 32,116,111,32,97,32,102,105,108,101,32,112,97,116,104,32, - 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, - 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, - 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, - 115,32,102,111,114,32,116,104,101,32,119,114,105,116,105,110, - 103,32,111,102,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,115,46,10,32,32,32,32,32,32,32,32,78,114,7, - 0,0,0,41,3,114,123,0,0,0,114,52,0,0,0,114, - 37,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,232,0,0,0,107,3,0,0,115,4,0,0, - 0,4,0,255,128,122,21,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,0,0,0,0,5,0,0,0,10,0,0, - 0,67,0,0,0,115,70,0,0,0,124,0,160,0,124,1, - 161,1,125,2,122,20,124,0,160,1,124,2,161,1,125,3, - 87,0,116,4,124,3,131,1,83,0,4,0,116,2,121,68, - 1,0,125,4,1,0,122,14,116,3,100,1,124,1,100,2, - 141,2,124,4,130,2,100,3,125,4,126,4,119,1,119,0, - 41,4,122,52,67,111,110,99,114,101,116,101,32,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73, - 110,115,112,101,99,116,76,111,97,100,101,114,46,103,101,116, - 95,115,111,117,114,99,101,46,122,39,115,111,117,114,99,101, - 32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,116, - 104,114,111,117,103,104,32,103,101,116,95,100,97,116,97,40, - 41,114,120,0,0,0,78,41,5,114,183,0,0,0,218,8, - 103,101,116,95,100,97,116,97,114,58,0,0,0,114,122,0, - 0,0,114,180,0,0,0,41,5,114,123,0,0,0,114,143, - 0,0,0,114,52,0,0,0,114,178,0,0,0,218,3,101, - 120,99,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,10,103,101,116,95,115,111,117,114,99,101,114,3,0, - 0,115,26,0,0,0,10,2,2,1,12,1,8,4,14,253, - 4,1,2,1,4,255,2,1,2,255,8,128,2,255,255,128, - 122,23,83,111,117,114,99,101,76,111,97,100,101,114,46,103, - 101,116,95,115,111,117,114,99,101,114,109,0,0,0,41,1, - 218,9,95,111,112,116,105,109,105,122,101,99,3,0,0,0, - 0,0,0,0,1,0,0,0,4,0,0,0,8,0,0,0, - 67,0,0,0,115,22,0,0,0,116,0,106,1,116,2,124, - 1,124,2,100,1,100,2,124,3,100,3,141,6,83,0,41, - 5,122,130,82,101,116,117,114,110,32,116,104,101,32,99,111, - 100,101,32,111,98,106,101,99,116,32,99,111,109,112,105,108, - 101,100,32,102,114,111,109,32,115,111,117,114,99,101,46,10, - 10,32,32,32,32,32,32,32,32,84,104,101,32,39,100,97, - 116,97,39,32,97,114,103,117,109,101,110,116,32,99,97,110, - 32,98,101,32,97,110,121,32,111,98,106,101,99,116,32,116, - 121,112,101,32,116,104,97,116,32,99,111,109,112,105,108,101, - 40,41,32,115,117,112,112,111,114,116,115,46,10,32,32,32, - 32,32,32,32,32,114,222,0,0,0,84,41,2,218,12,100, - 111,110,116,95,105,110,104,101,114,105,116,114,89,0,0,0, - 78,41,3,114,139,0,0,0,114,221,0,0,0,218,7,99, - 111,109,112,105,108,101,41,4,114,123,0,0,0,114,37,0, - 0,0,114,52,0,0,0,114,237,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,14,115,111,117, - 114,99,101,95,116,111,95,99,111,100,101,124,3,0,0,115, - 8,0,0,0,12,5,4,1,6,255,255,128,122,27,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,0,0,0,0,15,0,0,0,9,0,0,0,67,0, - 0,0,115,34,2,0,0,124,0,160,0,124,1,161,1,125, - 2,100,1,125,3,100,1,125,4,100,1,125,5,100,2,125, - 6,100,3,125,7,122,12,116,1,124,2,131,1,125,8,87, - 0,110,24,4,0,116,2,144,2,121,32,1,0,1,0,1, - 0,100,1,125,8,89,0,144,1,110,38,122,14,124,0,160, - 3,124,2,161,1,125,9,87,0,110,20,4,0,116,4,144, - 2,121,30,1,0,1,0,1,0,89,0,144,1,110,2,116, - 5,124,9,100,4,25,0,131,1,125,3,122,14,124,0,160, - 6,124,8,161,1,125,10,87,0,110,18,4,0,116,4,144, - 2,121,28,1,0,1,0,1,0,89,0,110,212,124,1,124, - 8,100,5,156,2,125,11,122,148,116,7,124,10,124,1,124, - 11,131,3,125,12,116,8,124,10,131,1,100,6,100,1,133, - 2,25,0,125,13,124,12,100,7,64,0,100,8,107,3,125, - 6,124,6,144,1,114,30,124,12,100,9,64,0,100,8,107, - 3,125,7,116,9,106,10,100,10,107,3,144,1,114,28,124, - 7,115,248,116,9,106,10,100,11,107,2,144,1,114,28,124, - 0,160,6,124,2,161,1,125,4,116,9,160,11,116,12,124, - 4,161,2,125,5,116,13,124,10,124,5,124,1,124,11,131, - 4,1,0,110,20,116,14,124,10,124,3,124,9,100,12,25, - 0,124,1,124,11,131,5,1,0,87,0,110,22,4,0,116, - 15,116,16,102,2,144,2,121,26,1,0,1,0,1,0,89, - 0,110,30,116,17,160,18,100,13,124,8,124,2,161,3,1, - 0,116,19,124,13,124,1,124,8,124,2,100,14,141,4,83, - 0,124,4,100,1,117,0,144,1,114,126,124,0,160,6,124, - 2,161,1,125,4,124,0,160,20,124,4,124,2,161,2,125, - 14,116,17,160,18,100,15,124,2,161,2,1,0,116,21,106, - 22,144,2,115,20,124,8,100,1,117,1,144,2,114,20,124, - 3,100,1,117,1,144,2,114,20,124,6,144,1,114,218,124, - 5,100,1,117,0,144,1,114,204,116,9,160,11,124,4,161, - 1,125,5,116,23,124,14,124,5,124,7,131,3,125,10,110, - 16,116,24,124,14,124,3,116,25,124,4,131,1,131,3,125, - 10,122,20,124,0,160,26,124,2,124,8,124,10,161,3,1, - 0,87,0,124,14,83,0,4,0,116,2,144,2,121,24,1, - 0,1,0,1,0,89,0,124,14,83,0,124,14,83,0,119, - 0,119,0,119,0,119,0,119,0,41,16,122,190,67,111,110, - 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, - 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76, - 111,97,100,101,114,46,103,101,116,95,99,111,100,101,46,10, - 10,32,32,32,32,32,32,32,32,82,101,97,100,105,110,103, - 32,111,102,32,98,121,116,101,99,111,100,101,32,114,101,113, - 117,105,114,101,115,32,112,97,116,104,95,115,116,97,116,115, - 32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116, - 101,100,46,32,84,111,32,119,114,105,116,101,10,32,32,32, - 32,32,32,32,32,98,121,116,101,99,111,100,101,44,32,115, - 101,116,95,100,97,116,97,32,109,117,115,116,32,97,108,115, - 111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100, - 46,10,10,32,32,32,32,32,32,32,32,78,70,84,114,173, - 0,0,0,114,163,0,0,0,114,149,0,0,0,114,3,0, - 0,0,114,0,0,0,0,114,39,0,0,0,90,5,110,101, - 118,101,114,90,6,97,108,119,97,121,115,218,4,115,105,122, - 101,122,13,123,125,32,109,97,116,99,104,101,115,32,123,125, - 41,3,114,121,0,0,0,114,111,0,0,0,114,112,0,0, - 0,122,19,99,111,100,101,32,111,98,106,101,99,116,32,102, - 114,111,109,32,123,125,41,27,114,183,0,0,0,114,102,0, - 0,0,114,88,0,0,0,114,231,0,0,0,114,58,0,0, - 0,114,30,0,0,0,114,234,0,0,0,114,156,0,0,0, - 218,10,109,101,109,111,114,121,118,105,101,119,114,167,0,0, - 0,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, - 115,101,100,95,112,121,99,115,114,161,0,0,0,218,17,95, - 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, - 114,162,0,0,0,114,160,0,0,0,114,122,0,0,0,114, - 154,0,0,0,114,139,0,0,0,114,153,0,0,0,114,169, - 0,0,0,114,240,0,0,0,114,15,0,0,0,218,19,100, - 111,110,116,95,119,114,105,116,101,95,98,121,116,101,99,111, - 100,101,114,175,0,0,0,114,174,0,0,0,114,4,0,0, - 0,114,233,0,0,0,41,15,114,123,0,0,0,114,143,0, - 0,0,114,112,0,0,0,114,158,0,0,0,114,178,0,0, - 0,114,161,0,0,0,90,10,104,97,115,104,95,98,97,115, - 101,100,90,12,99,104,101,99,107,95,115,111,117,114,99,101, - 114,111,0,0,0,218,2,115,116,114,37,0,0,0,114,155, - 0,0,0,114,16,0,0,0,90,10,98,121,116,101,115,95, - 100,97,116,97,90,11,99,111,100,101,95,111,98,106,101,99, - 116,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,220,0,0,0,132,3,0,0,115,170,0,0,0,10,7, - 4,1,4,1,4,1,4,1,4,1,2,1,12,1,14,1, - 10,1,2,2,14,1,14,1,6,1,12,2,2,1,14,1, - 14,1,4,1,2,3,2,1,6,254,2,4,12,1,16,1, - 12,1,6,1,12,1,12,1,2,1,2,255,8,2,4,254, - 10,3,4,1,2,1,2,1,4,254,8,4,2,1,4,255, - 2,128,2,3,2,1,2,1,6,1,2,1,2,1,4,251, - 4,128,18,7,4,1,8,2,2,1,4,255,6,2,2,1, - 2,1,6,254,10,3,10,1,12,1,12,1,18,1,6,1, - 4,255,6,2,10,1,10,1,14,1,6,2,6,1,4,255, - 2,2,16,1,4,3,14,254,2,1,8,1,2,254,2,233, - 2,225,2,250,2,251,255,128,122,21,83,111,117,114,99,101, - 76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,78, - 41,10,114,130,0,0,0,114,129,0,0,0,114,131,0,0, - 0,114,230,0,0,0,114,231,0,0,0,114,233,0,0,0, - 114,232,0,0,0,114,236,0,0,0,114,240,0,0,0,114, - 220,0,0,0,114,7,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,228,0,0,0,73,3,0, - 0,115,18,0,0,0,8,0,8,2,8,8,8,14,8,10, - 8,7,14,10,12,8,255,128,114,228,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,0,0,0,0,115,92,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,101, - 7,135,0,102,1,100,8,100,9,132,8,131,1,90,8,101, - 7,100,10,100,11,132,0,131,1,90,9,100,12,100,13,132, - 0,90,10,101,7,100,14,100,15,132,0,131,1,90,11,135, - 0,4,0,90,12,83,0,41,16,218,10,70,105,108,101,76, - 111,97,100,101,114,122,103,66,97,115,101,32,102,105,108,101, - 32,108,111,97,100,101,114,32,99,108,97,115,115,32,119,104, - 105,99,104,32,105,109,112,108,101,109,101,110,116,115,32,116, - 104,101,32,108,111,97,100,101,114,32,112,114,111,116,111,99, - 111,108,32,109,101,116,104,111,100,115,32,116,104,97,116,10, - 32,32,32,32,114,101,113,117,105,114,101,32,102,105,108,101, - 32,115,121,115,116,101,109,32,117,115,97,103,101,46,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2, - 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0, - 95,0,124,2,124,0,95,1,100,1,83,0,41,2,122,75, - 67,97,99,104,101,32,116,104,101,32,109,111,100,117,108,101, - 32,110,97,109,101,32,97,110,100,32,116,104,101,32,112,97, - 116,104,32,116,111,32,116,104,101,32,102,105,108,101,32,102, - 111,117,110,100,32,98,121,32,116,104,101,10,32,32,32,32, - 32,32,32,32,102,105,110,100,101,114,46,78,114,163,0,0, - 0,41,3,114,123,0,0,0,114,143,0,0,0,114,52,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,216,0,0,0,222,3,0,0,115,6,0,0,0,6, - 3,10,1,255,128,122,19,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,0,0,0,0,2,0,0,0,2,0,0,0,67, - 0,0,0,115,24,0,0,0,124,0,106,0,124,1,106,0, - 107,2,111,22,124,0,106,1,124,1,106,1,107,2,83,0, - 114,114,0,0,0,169,2,218,9,95,95,99,108,97,115,115, - 95,95,114,136,0,0,0,169,2,114,123,0,0,0,90,5, - 111,116,104,101,114,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,6,95,95,101,113,95,95,228,3,0,0, - 115,8,0,0,0,12,1,10,1,2,255,255,128,122,17,70, - 105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,95, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,20,0,0,0,116,0, - 124,0,106,1,131,1,116,0,124,0,106,2,131,1,65,0, - 83,0,114,114,0,0,0,169,3,218,4,104,97,115,104,114, - 121,0,0,0,114,52,0,0,0,169,1,114,123,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 8,95,95,104,97,115,104,95,95,232,3,0,0,115,4,0, - 0,0,20,1,255,128,122,19,70,105,108,101,76,111,97,100, - 101,114,46,95,95,104,97,115,104,95,95,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 3,0,0,0,115,16,0,0,0,116,0,116,1,124,0,131, - 2,160,2,124,1,161,1,83,0,41,2,122,100,76,111,97, - 100,32,97,32,109,111,100,117,108,101,32,102,114,111,109,32, - 97,32,102,105,108,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,105, - 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, - 32,78,41,3,218,5,115,117,112,101,114,114,246,0,0,0, - 114,227,0,0,0,114,226,0,0,0,169,1,114,248,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,227,0,0,0, - 235,3,0,0,115,4,0,0,0,16,10,255,128,122,22,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,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,6, - 0,0,0,124,0,106,0,83,0,169,2,122,58,82,101,116, - 117,114,110,32,116,104,101,32,112,97,116,104,32,116,111,32, - 116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,32, - 97,115,32,102,111,117,110,100,32,98,121,32,116,104,101,32, - 102,105,110,100,101,114,46,78,114,56,0,0,0,114,226,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,183,0,0,0,247,3,0,0,115,4,0,0,0,6, - 3,255,128,122,23,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,0,0,0,0,3,0,0,0,8,0,0, - 0,67,0,0,0,115,128,0,0,0,116,0,124,0,116,1, - 116,2,102,2,131,2,114,72,116,3,160,4,116,5,124,1, - 131,1,161,1,143,24,125,2,124,2,160,6,161,0,87,0, - 2,0,100,1,4,0,4,0,131,3,1,0,83,0,49,0, - 115,58,119,1,1,0,1,0,1,0,89,0,1,0,100,1, - 83,0,116,3,160,7,124,1,100,2,161,2,143,24,125,2, - 124,2,160,6,161,0,87,0,2,0,100,1,4,0,4,0, - 131,3,1,0,83,0,49,0,115,114,119,1,1,0,1,0, - 1,0,89,0,1,0,100,1,83,0,41,3,122,39,82,101, - 116,117,114,110,32,116,104,101,32,100,97,116,97,32,102,114, - 111,109,32,112,97,116,104,32,97,115,32,114,97,119,32,98, - 121,116,101,115,46,78,218,1,114,41,8,114,165,0,0,0, - 114,228,0,0,0,218,19,69,120,116,101,110,115,105,111,110, - 70,105,108,101,76,111,97,100,101,114,114,72,0,0,0,90, - 9,111,112,101,110,95,99,111,100,101,114,90,0,0,0,90, - 4,114,101,97,100,114,73,0,0,0,41,3,114,123,0,0, - 0,114,52,0,0,0,114,76,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,234,0,0,0,252, - 3,0,0,115,16,0,0,0,14,2,16,1,22,1,20,128, - 14,2,22,1,20,128,255,128,122,19,70,105,108,101,76,111, - 97,100,101,114,46,103,101,116,95,100,97,116,97,99,2,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0, - 0,0,67,0,0,0,115,20,0,0,0,100,1,100,2,108, - 0,109,1,125,2,1,0,124,2,124,0,131,1,83,0,41, - 3,78,114,0,0,0,0,41,1,218,10,70,105,108,101,82, - 101,97,100,101,114,41,2,90,17,105,109,112,111,114,116,108, - 105,98,46,114,101,97,100,101,114,115,114,4,1,0,0,41, - 3,114,123,0,0,0,114,223,0,0,0,114,4,1,0,0, + 32,32,32,32,32,32,32,78,41,1,114,64,0,0,0,169, + 2,114,130,0,0,0,114,58,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,10,112,97,116,104, + 95,109,116,105,109,101,75,3,0,0,115,4,0,0,0,4, + 6,255,128,122,23,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,0,0,0,0,2,0,0,0,4,0,0, + 0,67,0,0,0,115,14,0,0,0,100,1,124,0,160,0, + 124,1,161,1,105,1,83,0,41,3,97,158,1,0,0,79, + 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,114, + 101,116,117,114,110,105,110,103,32,97,32,109,101,116,97,100, + 97,116,97,32,100,105,99,116,32,102,111,114,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,10,32,32,32,32,32, + 32,32,32,112,97,116,104,32,40,97,32,115,116,114,41,46, + 10,10,32,32,32,32,32,32,32,32,80,111,115,115,105,98, + 108,101,32,107,101,121,115,58,10,32,32,32,32,32,32,32, + 32,45,32,39,109,116,105,109,101,39,32,40,109,97,110,100, + 97,116,111,114,121,41,32,105,115,32,116,104,101,32,110,117, + 109,101,114,105,99,32,116,105,109,101,115,116,97,109,112,32, + 111,102,32,108,97,115,116,32,115,111,117,114,99,101,10,32, + 32,32,32,32,32,32,32,32,32,99,111,100,101,32,109,111, + 100,105,102,105,99,97,116,105,111,110,59,10,32,32,32,32, + 32,32,32,32,45,32,39,115,105,122,101,39,32,40,111,112, + 116,105,111,110,97,108,41,32,105,115,32,116,104,101,32,115, + 105,122,101,32,105,110,32,98,121,116,101,115,32,111,102,32, + 116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,46, + 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, + 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, + 111,100,32,97,108,108,111,119,115,32,116,104,101,32,108,111, + 97,100,101,114,32,116,111,32,114,101,97,100,32,98,121,116, + 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, + 32,32,32,32,32,82,97,105,115,101,115,32,79,83,69,114, + 114,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116, + 104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100, + 108,101,100,46,10,32,32,32,32,32,32,32,32,114,180,0, + 0,0,78,41,1,114,238,0,0,0,114,237,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, + 112,97,116,104,95,115,116,97,116,115,83,3,0,0,115,4, + 0,0,0,14,12,255,128,122,23,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,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,12,0,0,0,124,0, + 160,0,124,2,124,3,161,2,83,0,41,2,122,228,79,112, + 116,105,111,110,97,108,32,109,101,116,104,111,100,32,119,104, + 105,99,104,32,119,114,105,116,101,115,32,100,97,116,97,32, + 40,98,121,116,101,115,41,32,116,111,32,97,32,102,105,108, + 101,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, + 10,32,32,32,32,32,32,32,32,73,109,112,108,101,109,101, + 110,116,105,110,103,32,116,104,105,115,32,109,101,116,104,111, + 100,32,97,108,108,111,119,115,32,102,111,114,32,116,104,101, + 32,119,114,105,116,105,110,103,32,111,102,32,98,121,116,101, + 99,111,100,101,32,102,105,108,101,115,46,10,10,32,32,32, + 32,32,32,32,32,84,104,101,32,115,111,117,114,99,101,32, + 112,97,116,104,32,105,115,32,110,101,101,100,101,100,32,105, + 110,32,111,114,100,101,114,32,116,111,32,99,111,114,114,101, + 99,116,108,121,32,116,114,97,110,115,102,101,114,32,112,101, + 114,109,105,115,115,105,111,110,115,10,32,32,32,32,32,32, + 32,32,78,41,1,218,8,115,101,116,95,100,97,116,97,41, + 4,114,130,0,0,0,114,119,0,0,0,90,10,99,97,99, + 104,101,95,112,97,116,104,114,42,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,15,95,99,97, + 99,104,101,95,98,121,116,101,99,111,100,101,97,3,0,0, + 115,4,0,0,0,12,8,255,128,122,28,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, + 0,0,0,0,3,0,0,0,1,0,0,0,67,0,0,0, + 114,24,0,0,0,41,2,122,150,79,112,116,105,111,110,97, + 108,32,109,101,116,104,111,100,32,119,104,105,99,104,32,119, + 114,105,116,101,115,32,100,97,116,97,32,40,98,121,116,101, + 115,41,32,116,111,32,97,32,102,105,108,101,32,112,97,116, + 104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,32, + 32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,103, + 32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,108, + 111,119,115,32,102,111,114,32,116,104,101,32,119,114,105,116, + 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,78, + 114,7,0,0,0,41,3,114,130,0,0,0,114,58,0,0, + 0,114,42,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,240,0,0,0,107,3,0,0,114,227, + 0,0,0,122,21,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,0,0,0,0,5,0,0,0,10,0,0,0,67, + 0,0,0,115,70,0,0,0,124,0,160,0,124,1,161,1, + 125,2,122,20,124,0,160,1,124,2,161,1,125,3,87,0, + 116,4,124,3,131,1,83,0,4,0,116,2,121,68,1,0, + 125,4,1,0,122,14,116,3,100,1,124,1,100,2,141,2, + 124,4,130,2,100,3,125,4,126,4,119,1,119,0,41,4, + 122,52,67,111,110,99,114,101,116,101,32,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,115, + 112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,115, + 111,117,114,99,101,46,122,39,115,111,117,114,99,101,32,110, + 111,116,32,97,118,97,105,108,97,98,108,101,32,116,104,114, + 111,117,103,104,32,103,101,116,95,100,97,116,97,40,41,114, + 127,0,0,0,78,41,5,114,190,0,0,0,218,8,103,101, + 116,95,100,97,116,97,114,64,0,0,0,114,129,0,0,0, + 114,187,0,0,0,41,5,114,130,0,0,0,114,150,0,0, + 0,114,58,0,0,0,114,185,0,0,0,218,3,101,120,99, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 19,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, - 97,100,101,114,5,4,0,0,115,6,0,0,0,12,2,8, - 1,255,128,122,30,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, - 100,101,114,41,13,114,130,0,0,0,114,129,0,0,0,114, - 131,0,0,0,114,132,0,0,0,114,216,0,0,0,114,250, - 0,0,0,114,254,0,0,0,114,140,0,0,0,114,227,0, - 0,0,114,183,0,0,0,114,234,0,0,0,114,5,1,0, - 0,90,13,95,95,99,108,97,115,115,99,101,108,108,95,95, - 114,7,0,0,0,114,7,0,0,0,114,0,1,0,0,114, - 8,0,0,0,114,246,0,0,0,217,3,0,0,115,26,0, - 0,0,8,0,4,2,8,3,8,6,8,4,2,3,14,1, - 2,11,10,1,8,4,2,9,18,1,255,128,114,246,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,64,0,0,0,115,46,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, - 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,156, - 1,100,8,100,9,132,2,90,6,100,10,83,0,41,11,218, - 16,83,111,117,114,99,101,70,105,108,101,76,111,97,100,101, - 114,122,62,67,111,110,99,114,101,116,101,32,105,109,112,108, - 101,109,101,110,116,97,116,105,111,110,32,111,102,32,83,111, - 117,114,99,101,76,111,97,100,101,114,32,117,115,105,110,103, - 32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109, - 46,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,3,0,0,0,67,0,0,0,115,22,0,0,0,116, - 0,124,1,131,1,125,2,124,2,106,1,124,2,106,2,100, - 1,156,2,83,0,41,3,122,33,82,101,116,117,114,110,32, - 116,104,101,32,109,101,116,97,100,97,116,97,32,102,111,114, - 32,116,104,101,32,112,97,116,104,46,41,2,114,173,0,0, - 0,114,241,0,0,0,78,41,3,114,57,0,0,0,218,8, - 115,116,95,109,116,105,109,101,90,7,115,116,95,115,105,122, - 101,41,3,114,123,0,0,0,114,52,0,0,0,114,245,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,231,0,0,0,15,4,0,0,115,6,0,0,0,8, - 2,14,1,255,128,122,27,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,0,0,0,0,0,5, - 0,0,0,5,0,0,0,67,0,0,0,115,24,0,0,0, - 116,0,124,1,131,1,125,4,124,0,106,1,124,2,124,3, - 124,4,100,1,141,3,83,0,41,2,78,169,1,218,5,95, - 109,111,100,101,41,2,114,119,0,0,0,114,232,0,0,0, - 41,5,114,123,0,0,0,114,112,0,0,0,114,111,0,0, - 0,114,37,0,0,0,114,60,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,233,0,0,0,20, - 4,0,0,115,6,0,0,0,8,2,16,1,255,128,122,32, - 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,99,111,100,101, - 114,68,0,0,0,114,8,1,0,0,99,3,0,0,0,0, - 0,0,0,1,0,0,0,9,0,0,0,11,0,0,0,67, - 0,0,0,115,254,0,0,0,116,0,124,1,131,1,92,2, - 125,4,125,5,103,0,125,6,124,4,114,62,116,1,124,4, - 131,1,115,62,116,0,124,4,131,1,92,2,125,4,125,7, - 124,6,160,2,124,7,161,1,1,0,124,4,114,62,116,1, - 124,4,131,1,114,28,116,3,124,6,131,1,68,0,93,96, - 125,7,116,4,124,4,124,7,131,2,125,4,122,14,116,5, - 160,6,124,4,161,1,1,0,87,0,113,70,4,0,116,7, - 121,116,1,0,1,0,1,0,89,0,113,70,4,0,116,8, - 121,252,1,0,125,8,1,0,122,30,116,9,160,10,100,1, - 124,4,124,8,161,3,1,0,87,0,89,0,100,2,125,8, - 126,8,1,0,100,2,83,0,100,2,125,8,126,8,119,1, - 122,30,116,11,124,1,124,2,124,3,131,3,1,0,116,9, - 160,10,100,3,124,1,161,2,1,0,87,0,100,2,83,0, - 4,0,116,8,121,250,1,0,125,8,1,0,122,28,116,9, - 160,10,100,1,124,1,124,8,161,3,1,0,87,0,89,0, - 100,2,125,8,126,8,100,2,83,0,100,2,125,8,126,8, - 119,1,119,0,119,0,41,4,122,27,87,114,105,116,101,32, - 98,121,116,101,115,32,100,97,116,97,32,116,111,32,97,32, - 102,105,108,101,46,122,27,99,111,117,108,100,32,110,111,116, - 32,99,114,101,97,116,101,32,123,33,114,125,58,32,123,33, - 114,125,78,122,12,99,114,101,97,116,101,100,32,123,33,114, - 125,41,12,114,55,0,0,0,114,64,0,0,0,114,190,0, - 0,0,114,50,0,0,0,114,48,0,0,0,114,18,0,0, - 0,90,5,109,107,100,105,114,218,15,70,105,108,101,69,120, - 105,115,116,115,69,114,114,111,114,114,58,0,0,0,114,139, - 0,0,0,114,153,0,0,0,114,77,0,0,0,41,9,114, - 123,0,0,0,114,52,0,0,0,114,37,0,0,0,114,9, - 1,0,0,218,6,112,97,114,101,110,116,114,101,0,0,0, - 114,47,0,0,0,114,43,0,0,0,114,235,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,232, - 0,0,0,25,4,0,0,115,58,0,0,0,12,2,4,1, - 12,2,12,1,10,1,12,254,12,4,10,1,2,1,14,1, - 12,1,4,2,14,1,6,3,4,1,4,255,16,2,8,128, - 2,1,12,1,18,1,14,1,8,2,2,1,18,255,8,128, - 2,254,2,247,255,128,122,25,83,111,117,114,99,101,70,105, - 108,101,76,111,97,100,101,114,46,115,101,116,95,100,97,116, - 97,78,41,7,114,130,0,0,0,114,129,0,0,0,114,131, - 0,0,0,114,132,0,0,0,114,231,0,0,0,114,233,0, - 0,0,114,232,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,6,1,0,0, - 11,4,0,0,115,12,0,0,0,8,0,4,2,8,2,8, - 5,18,5,255,128,114,6,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114, - 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, - 122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104, - 97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115, - 115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160, - 0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125, - 3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124, - 1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100, - 2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83, - 0,41,4,78,114,163,0,0,0,114,149,0,0,0,41,2, - 114,121,0,0,0,114,111,0,0,0,41,5,114,183,0,0, - 0,114,234,0,0,0,114,156,0,0,0,114,169,0,0,0, - 114,242,0,0,0,41,5,114,123,0,0,0,114,143,0,0, - 0,114,52,0,0,0,114,37,0,0,0,114,155,0,0,0, + 10,103,101,116,95,115,111,117,114,99,101,114,3,0,0,115, + 26,0,0,0,10,2,2,1,12,1,8,4,14,253,4,1, + 2,1,4,255,2,1,2,255,8,128,2,255,255,128,122,23, + 83,111,117,114,99,101,76,111,97,100,101,114,46,103,101,116, + 95,115,111,117,114,99,101,114,116,0,0,0,41,1,218,9, + 95,111,112,116,105,109,105,122,101,99,3,0,0,0,0,0, + 0,0,1,0,0,0,4,0,0,0,8,0,0,0,67,0, + 0,0,115,22,0,0,0,116,0,106,1,116,2,124,1,124, + 2,100,1,100,2,124,3,100,3,141,6,83,0,41,5,122, + 130,82,101,116,117,114,110,32,116,104,101,32,99,111,100,101, + 32,111,98,106,101,99,116,32,99,111,109,112,105,108,101,100, + 32,102,114,111,109,32,115,111,117,114,99,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,101,32,39,100,97,116,97, + 39,32,97,114,103,117,109,101,110,116,32,99,97,110,32,98, + 101,32,97,110,121,32,111,98,106,101,99,116,32,116,121,112, + 101,32,116,104,97,116,32,99,111,109,112,105,108,101,40,41, + 32,115,117,112,112,111,114,116,115,46,10,32,32,32,32,32, + 32,32,32,114,230,0,0,0,84,41,2,218,12,100,111,110, + 116,95,105,110,104,101,114,105,116,114,96,0,0,0,78,41, + 3,114,146,0,0,0,114,229,0,0,0,218,7,99,111,109, + 112,105,108,101,41,4,114,130,0,0,0,114,42,0,0,0, + 114,58,0,0,0,114,245,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,14,115,111,117,114,99, + 101,95,116,111,95,99,111,100,101,124,3,0,0,115,8,0, + 0,0,12,5,4,1,6,255,255,128,122,27,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, + 0,0,0,0,15,0,0,0,9,0,0,0,67,0,0,0, + 115,34,2,0,0,124,0,160,0,124,1,161,1,125,2,100, + 1,125,3,100,1,125,4,100,1,125,5,100,2,125,6,100, + 3,125,7,122,12,116,1,124,2,131,1,125,8,87,0,110, + 24,4,0,116,2,144,2,121,32,1,0,1,0,1,0,100, + 1,125,8,89,0,144,1,110,38,122,14,124,0,160,3,124, + 2,161,1,125,9,87,0,110,20,4,0,116,4,144,2,121, + 30,1,0,1,0,1,0,89,0,144,1,110,2,116,5,124, + 9,100,4,25,0,131,1,125,3,122,14,124,0,160,6,124, + 8,161,1,125,10,87,0,110,18,4,0,116,4,144,2,121, + 28,1,0,1,0,1,0,89,0,110,212,124,1,124,8,100, + 5,156,2,125,11,122,148,116,7,124,10,124,1,124,11,131, + 3,125,12,116,8,124,10,131,1,100,6,100,1,133,2,25, + 0,125,13,124,12,100,7,64,0,100,8,107,3,125,6,124, + 6,144,1,114,30,124,12,100,9,64,0,100,8,107,3,125, + 7,116,9,106,10,100,10,107,3,144,1,114,28,124,7,115, + 248,116,9,106,10,100,11,107,2,144,1,114,28,124,0,160, + 6,124,2,161,1,125,4,116,9,160,11,116,12,124,4,161, + 2,125,5,116,13,124,10,124,5,124,1,124,11,131,4,1, + 0,110,20,116,14,124,10,124,3,124,9,100,12,25,0,124, + 1,124,11,131,5,1,0,87,0,110,22,4,0,116,15,116, + 16,102,2,144,2,121,26,1,0,1,0,1,0,89,0,110, + 30,116,17,160,18,100,13,124,8,124,2,161,3,1,0,116, + 19,124,13,124,1,124,8,124,2,100,14,141,4,83,0,124, + 4,100,1,117,0,144,1,114,126,124,0,160,6,124,2,161, + 1,125,4,124,0,160,20,124,4,124,2,161,2,125,14,116, + 17,160,18,100,15,124,2,161,2,1,0,116,21,106,22,144, + 2,115,20,124,8,100,1,117,1,144,2,114,20,124,3,100, + 1,117,1,144,2,114,20,124,6,144,1,114,218,124,5,100, + 1,117,0,144,1,114,204,116,9,160,11,124,4,161,1,125, + 5,116,23,124,14,124,5,124,7,131,3,125,10,110,16,116, + 24,124,14,124,3,116,25,124,4,131,1,131,3,125,10,122, + 20,124,0,160,26,124,2,124,8,124,10,161,3,1,0,87, + 0,124,14,83,0,4,0,116,2,144,2,121,24,1,0,1, + 0,1,0,89,0,124,14,83,0,124,14,83,0,119,0,119, + 0,119,0,119,0,119,0,41,16,122,190,67,111,110,99,114, + 101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,32,111,102,32,73,110,115,112,101,99,116,76,111,97, + 100,101,114,46,103,101,116,95,99,111,100,101,46,10,10,32, + 32,32,32,32,32,32,32,82,101,97,100,105,110,103,32,111, + 102,32,98,121,116,101,99,111,100,101,32,114,101,113,117,105, + 114,101,115,32,112,97,116,104,95,115,116,97,116,115,32,116, + 111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100, + 46,32,84,111,32,119,114,105,116,101,10,32,32,32,32,32, + 32,32,32,98,121,116,101,99,111,100,101,44,32,115,101,116, + 95,100,97,116,97,32,109,117,115,116,32,97,108,115,111,32, + 98,101,32,105,109,112,108,101,109,101,110,116,101,100,46,10, + 10,32,32,32,32,32,32,32,32,78,70,84,114,180,0,0, + 0,114,170,0,0,0,114,156,0,0,0,114,3,0,0,0, + 114,0,0,0,0,114,45,0,0,0,90,5,110,101,118,101, + 114,90,6,97,108,119,97,121,115,218,4,115,105,122,101,122, + 13,123,125,32,109,97,116,99,104,101,115,32,123,125,41,3, + 114,128,0,0,0,114,118,0,0,0,114,119,0,0,0,122, + 19,99,111,100,101,32,111,98,106,101,99,116,32,102,114,111, + 109,32,123,125,41,27,114,190,0,0,0,114,109,0,0,0, + 114,95,0,0,0,114,239,0,0,0,114,64,0,0,0,114, + 34,0,0,0,114,242,0,0,0,114,163,0,0,0,218,10, + 109,101,109,111,114,121,118,105,101,119,114,174,0,0,0,90, + 21,99,104,101,99,107,95,104,97,115,104,95,98,97,115,101, + 100,95,112,121,99,115,114,168,0,0,0,218,17,95,82,65, + 87,95,77,65,71,73,67,95,78,85,77,66,69,82,114,169, + 0,0,0,114,167,0,0,0,114,129,0,0,0,114,161,0, + 0,0,114,146,0,0,0,114,160,0,0,0,114,176,0,0, + 0,114,248,0,0,0,114,16,0,0,0,218,19,100,111,110, + 116,95,119,114,105,116,101,95,98,121,116,101,99,111,100,101, + 114,182,0,0,0,114,181,0,0,0,114,4,0,0,0,114, + 241,0,0,0,41,15,114,130,0,0,0,114,150,0,0,0, + 114,119,0,0,0,114,165,0,0,0,114,185,0,0,0,114, + 168,0,0,0,90,10,104,97,115,104,95,98,97,115,101,100, + 90,12,99,104,101,99,107,95,115,111,117,114,99,101,114,118, + 0,0,0,218,2,115,116,114,42,0,0,0,114,162,0,0, + 0,114,17,0,0,0,90,10,98,121,116,101,115,95,100,97, + 116,97,90,11,99,111,100,101,95,111,98,106,101,99,116,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,228, + 0,0,0,132,3,0,0,115,170,0,0,0,10,7,4,1, + 4,1,4,1,4,1,4,1,2,1,12,1,14,1,10,1, + 2,2,14,1,14,1,6,1,12,2,2,1,14,1,14,1, + 4,1,2,3,2,1,6,254,2,4,12,1,16,1,12,1, + 6,1,12,1,12,1,2,1,2,255,8,2,4,254,10,3, + 4,1,2,1,2,1,4,254,8,4,2,1,4,255,2,128, + 2,3,2,1,2,1,6,1,2,1,2,1,4,251,4,128, + 18,7,4,1,8,2,2,1,4,255,6,2,2,1,2,1, + 6,254,10,3,10,1,12,1,12,1,18,1,6,1,4,255, + 6,2,10,1,10,1,14,1,6,2,6,1,4,255,2,2, + 16,1,4,3,14,254,2,1,8,1,2,254,2,233,2,225, + 2,250,2,251,255,128,122,21,83,111,117,114,99,101,76,111, + 97,100,101,114,46,103,101,116,95,99,111,100,101,78,41,10, + 114,137,0,0,0,114,136,0,0,0,114,138,0,0,0,114, + 238,0,0,0,114,239,0,0,0,114,241,0,0,0,114,240, + 0,0,0,114,244,0,0,0,114,248,0,0,0,114,228,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,236,0,0,0,73,3,0,0,115, + 18,0,0,0,8,0,8,2,8,8,8,14,8,10,8,7, + 14,10,12,8,255,128,114,236,0,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 0,0,0,0,115,92,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, + 5,132,0,90,5,100,6,100,7,132,0,90,6,101,7,135, + 0,102,1,100,8,100,9,132,8,131,1,90,8,101,7,100, + 10,100,11,132,0,131,1,90,9,100,12,100,13,132,0,90, + 10,101,7,100,14,100,15,132,0,131,1,90,11,135,0,4, + 0,90,12,83,0,41,16,218,10,70,105,108,101,76,111,97, + 100,101,114,122,103,66,97,115,101,32,102,105,108,101,32,108, + 111,97,100,101,114,32,99,108,97,115,115,32,119,104,105,99, + 104,32,105,109,112,108,101,109,101,110,116,115,32,116,104,101, + 32,108,111,97,100,101,114,32,112,114,111,116,111,99,111,108, + 32,109,101,116,104,111,100,115,32,116,104,97,116,10,32,32, + 32,32,114,101,113,117,105,114,101,32,102,105,108,101,32,115, + 121,115,116,101,109,32,117,115,97,103,101,46,99,3,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0, + 0,67,0,0,0,115,16,0,0,0,124,1,124,0,95,0, + 124,2,124,0,95,1,100,1,83,0,41,2,122,75,67,97, + 99,104,101,32,116,104,101,32,109,111,100,117,108,101,32,110, + 97,109,101,32,97,110,100,32,116,104,101,32,112,97,116,104, + 32,116,111,32,116,104,101,32,102,105,108,101,32,102,111,117, + 110,100,32,98,121,32,116,104,101,10,32,32,32,32,32,32, + 32,32,102,105,110,100,101,114,46,78,114,170,0,0,0,41, + 3,114,130,0,0,0,114,150,0,0,0,114,58,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 220,0,0,0,60,4,0,0,115,24,0,0,0,10,1,10, - 1,2,4,2,1,6,254,12,4,2,1,14,1,2,1,2, - 1,6,253,255,128,122,29,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,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,41,2,122,39,82,101,116,117,114,110, - 32,78,111,110,101,32,97,115,32,116,104,101,114,101,32,105, - 115,32,110,111,32,115,111,117,114,99,101,32,99,111,100,101, - 46,78,114,7,0,0,0,114,226,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,236,0,0,0, - 76,4,0,0,115,4,0,0,0,4,2,255,128,122,31,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,41, - 6,114,130,0,0,0,114,129,0,0,0,114,131,0,0,0, - 114,132,0,0,0,114,220,0,0,0,114,236,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,12,1,0,0,56,4,0,0,115,10,0,0, - 0,8,0,4,2,8,2,12,16,255,128,114,12,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,64,0,0,0,115,92,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, - 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, - 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, - 90,10,100,16,100,17,132,0,90,11,101,12,100,18,100,19, - 132,0,131,1,90,13,100,20,83,0,41,21,114,3,1,0, - 0,122,93,76,111,97,100,101,114,32,102,111,114,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,46, - 10,10,32,32,32,32,84,104,101,32,99,111,110,115,116,114, - 117,99,116,111,114,32,105,115,32,100,101,115,105,103,110,101, - 100,32,116,111,32,119,111,114,107,32,119,105,116,104,32,70, - 105,108,101,70,105,110,100,101,114,46,10,10,32,32,32,32, - 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,2,0,0,0,67,0,0,0,115,16,0,0,0,124,1, - 124,0,95,0,124,2,124,0,95,1,100,0,83,0,114,114, - 0,0,0,114,163,0,0,0,41,3,114,123,0,0,0,114, - 121,0,0,0,114,52,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,216,0,0,0,89,4,0, - 0,115,6,0,0,0,6,1,10,1,255,128,122,28,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,0,0,0,0,2,0,0,0,2,0,0,0,67, - 0,0,0,115,24,0,0,0,124,0,106,0,124,1,106,0, - 107,2,111,22,124,0,106,1,124,1,106,1,107,2,83,0, - 114,114,0,0,0,114,247,0,0,0,114,249,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,250, - 0,0,0,93,4,0,0,115,8,0,0,0,12,1,10,1, - 2,255,255,128,122,26,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,95, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,20,0,0,0,116,0, - 124,0,106,1,131,1,116,0,124,0,106,2,131,1,65,0, - 83,0,114,114,0,0,0,114,251,0,0,0,114,253,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,254,0,0,0,97,4,0,0,115,4,0,0,0,20,1, + 223,0,0,0,222,3,0,0,115,6,0,0,0,6,3,10, + 1,255,128,122,19,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,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,243,24,0,0,0,124,0,106,0,124,1,106,0,107,2, + 111,22,124,0,106,1,124,1,106,1,107,2,83,0,114,121, + 0,0,0,169,2,218,9,95,95,99,108,97,115,115,95,95, + 114,143,0,0,0,169,2,114,130,0,0,0,90,5,111,116, + 104,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,6,95,95,101,113,95,95,228,3,0,0,243,8, + 0,0,0,12,1,10,1,2,255,255,128,122,17,70,105,108, + 101,76,111,97,100,101,114,46,95,95,101,113,95,95,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, + 0,0,0,67,0,0,0,243,20,0,0,0,116,0,124,0, + 106,1,131,1,116,0,124,0,106,2,131,1,65,0,83,0, + 114,121,0,0,0,169,3,218,4,104,97,115,104,114,128,0, + 0,0,114,58,0,0,0,169,1,114,130,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,95, + 95,104,97,115,104,95,95,232,3,0,0,243,4,0,0,0, + 20,1,255,128,122,19,70,105,108,101,76,111,97,100,101,114, + 46,95,95,104,97,115,104,95,95,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,3,0,0,0,3,0, + 0,0,115,16,0,0,0,116,0,116,1,124,0,131,2,160, + 2,124,1,161,1,83,0,41,2,122,100,76,111,97,100,32, + 97,32,109,111,100,117,108,101,32,102,114,111,109,32,97,32, + 102,105,108,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101, + 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, + 41,3,218,5,115,117,112,101,114,114,254,0,0,0,114,235, + 0,0,0,114,234,0,0,0,169,1,114,1,1,0,0,114, + 7,0,0,0,114,8,0,0,0,114,235,0,0,0,235,3, + 0,0,115,4,0,0,0,16,10,255,128,122,22,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,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,243,6,0,0, + 0,124,0,106,0,83,0,169,2,122,58,82,101,116,117,114, + 110,32,116,104,101,32,112,97,116,104,32,116,111,32,116,104, + 101,32,115,111,117,114,99,101,32,102,105,108,101,32,97,115, + 32,102,111,117,110,100,32,98,121,32,116,104,101,32,102,105, + 110,100,101,114,46,78,114,62,0,0,0,114,234,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 190,0,0,0,247,3,0,0,243,4,0,0,0,6,3,255, + 128,122,23,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,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,128,0,0,0,116,0,124,0,116,1,116,2, + 102,2,131,2,114,72,116,3,160,4,116,5,124,1,131,1, + 161,1,143,24,125,2,124,2,160,6,161,0,87,0,2,0, + 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,58, + 119,1,1,0,1,0,1,0,89,0,1,0,100,1,83,0, + 116,3,160,7,124,1,100,2,161,2,143,24,125,2,124,2, + 160,6,161,0,87,0,2,0,100,1,4,0,4,0,131,3, + 1,0,83,0,49,0,115,114,119,1,1,0,1,0,1,0, + 89,0,1,0,100,1,83,0,41,3,122,39,82,101,116,117, + 114,110,32,116,104,101,32,100,97,116,97,32,102,114,111,109, + 32,112,97,116,104,32,97,115,32,114,97,119,32,98,121,116, + 101,115,46,78,218,1,114,41,8,114,172,0,0,0,114,236, + 0,0,0,218,19,69,120,116,101,110,115,105,111,110,70,105, + 108,101,76,111,97,100,101,114,114,79,0,0,0,90,9,111, + 112,101,110,95,99,111,100,101,114,97,0,0,0,90,4,114, + 101,97,100,114,80,0,0,0,41,3,114,130,0,0,0,114, + 58,0,0,0,114,83,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,242,0,0,0,252,3,0, + 0,115,16,0,0,0,14,2,16,1,22,1,20,128,14,2, + 22,1,20,128,255,128,122,19,70,105,108,101,76,111,97,100, + 101,114,46,103,101,116,95,100,97,116,97,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0, + 67,0,0,0,115,20,0,0,0,100,1,100,2,108,0,109, + 1,125,2,1,0,124,2,124,0,131,1,83,0,41,3,78, + 114,0,0,0,0,41,1,218,10,70,105,108,101,82,101,97, + 100,101,114,41,2,90,17,105,109,112,111,114,116,108,105,98, + 46,114,101,97,100,101,114,115,114,18,1,0,0,41,3,114, + 130,0,0,0,114,231,0,0,0,114,18,1,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,19,103, + 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, + 101,114,5,4,0,0,115,6,0,0,0,12,2,8,1,255, + 128,122,30,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,101, + 114,41,13,114,137,0,0,0,114,136,0,0,0,114,138,0, + 0,0,114,139,0,0,0,114,223,0,0,0,114,3,1,0, + 0,114,9,1,0,0,114,147,0,0,0,114,235,0,0,0, + 114,190,0,0,0,114,242,0,0,0,114,19,1,0,0,90, + 13,95,95,99,108,97,115,115,99,101,108,108,95,95,114,7, + 0,0,0,114,7,0,0,0,114,12,1,0,0,114,8,0, + 0,0,114,254,0,0,0,217,3,0,0,115,26,0,0,0, + 8,0,4,2,8,3,8,6,8,4,2,3,14,1,2,11, + 10,1,8,4,2,9,18,1,255,128,114,254,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,64,0,0,0,115,46,0,0,0,101,0,90, + 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, + 4,100,4,100,5,132,0,90,5,100,6,100,7,156,1,100, + 8,100,9,132,2,90,6,100,10,83,0,41,11,218,16,83, + 111,117,114,99,101,70,105,108,101,76,111,97,100,101,114,122, + 62,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109, + 101,110,116,97,116,105,111,110,32,111,102,32,83,111,117,114, + 99,101,76,111,97,100,101,114,32,117,115,105,110,103,32,116, + 104,101,32,102,105,108,101,32,115,121,115,116,101,109,46,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,22,0,0,0,116,0,124, + 1,131,1,125,2,124,2,106,1,124,2,106,2,100,1,156, + 2,83,0,41,3,122,33,82,101,116,117,114,110,32,116,104, + 101,32,109,101,116,97,100,97,116,97,32,102,111,114,32,116, + 104,101,32,112,97,116,104,46,41,2,114,180,0,0,0,114, + 249,0,0,0,78,41,3,114,63,0,0,0,218,8,115,116, + 95,109,116,105,109,101,90,7,115,116,95,115,105,122,101,41, + 3,114,130,0,0,0,114,58,0,0,0,114,253,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 239,0,0,0,15,4,0,0,115,6,0,0,0,8,2,14, + 1,255,128,122,27,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,0,0,0,0,0,5,0,0, + 0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,0, + 124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,4, + 100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,111, + 100,101,41,2,114,126,0,0,0,114,240,0,0,0,41,5, + 114,130,0,0,0,114,119,0,0,0,114,118,0,0,0,114, + 42,0,0,0,114,66,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,241,0,0,0,20,4,0, + 0,115,6,0,0,0,8,2,16,1,255,128,122,32,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,99,111,100,101,114,75, + 0,0,0,114,22,1,0,0,99,3,0,0,0,0,0,0, + 0,1,0,0,0,9,0,0,0,11,0,0,0,67,0,0, + 0,115,254,0,0,0,116,0,124,1,131,1,92,2,125,4, + 125,5,103,0,125,6,124,4,114,62,116,1,124,4,131,1, + 115,62,116,0,124,4,131,1,92,2,125,4,125,7,124,6, + 160,2,124,7,161,1,1,0,124,4,114,62,116,1,124,4, + 131,1,114,28,116,3,124,6,131,1,68,0,93,96,125,7, + 116,4,124,4,124,7,131,2,125,4,122,14,116,5,160,6, + 124,4,161,1,1,0,87,0,113,70,4,0,116,7,121,116, + 1,0,1,0,1,0,89,0,113,70,4,0,116,8,121,252, + 1,0,125,8,1,0,122,30,116,9,160,10,100,1,124,4, + 124,8,161,3,1,0,87,0,89,0,100,2,125,8,126,8, + 1,0,100,2,83,0,100,2,125,8,126,8,119,1,122,30, + 116,11,124,1,124,2,124,3,131,3,1,0,116,9,160,10, + 100,3,124,1,161,2,1,0,87,0,100,2,83,0,4,0, + 116,8,121,250,1,0,125,8,1,0,122,28,116,9,160,10, + 100,1,124,1,124,8,161,3,1,0,87,0,89,0,100,2, + 125,8,126,8,100,2,83,0,100,2,125,8,126,8,119,1, + 119,0,119,0,41,4,122,27,87,114,105,116,101,32,98,121, + 116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,105, + 108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,99, + 114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,125, + 78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,41, + 12,114,61,0,0,0,114,71,0,0,0,114,197,0,0,0, + 114,56,0,0,0,114,54,0,0,0,114,19,0,0,0,90, + 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115, + 116,115,69,114,114,111,114,114,64,0,0,0,114,146,0,0, + 0,114,160,0,0,0,114,84,0,0,0,41,9,114,130,0, + 0,0,114,58,0,0,0,114,42,0,0,0,114,23,1,0, + 0,218,6,112,97,114,101,110,116,114,108,0,0,0,114,53, + 0,0,0,114,49,0,0,0,114,243,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,240,0,0, + 0,25,4,0,0,115,58,0,0,0,12,2,4,1,12,2, + 12,1,10,1,12,254,12,4,10,1,2,1,14,1,12,1, + 4,2,14,1,6,3,4,1,4,255,16,2,8,128,2,1, + 12,1,18,1,14,1,8,2,2,1,18,255,8,128,2,254, + 2,247,255,128,122,25,83,111,117,114,99,101,70,105,108,101, + 76,111,97,100,101,114,46,115,101,116,95,100,97,116,97,78, + 41,7,114,137,0,0,0,114,136,0,0,0,114,138,0,0, + 0,114,139,0,0,0,114,239,0,0,0,114,241,0,0,0, + 114,240,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,20,1,0,0,11,4, + 0,0,115,12,0,0,0,8,0,4,2,8,2,8,5,18, + 5,255,128,114,20,1,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, + 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, + 90,5,100,6,83,0,41,7,218,20,83,111,117,114,99,101, + 108,101,115,115,70,105,108,101,76,111,97,100,101,114,122,45, + 76,111,97,100,101,114,32,119,104,105,99,104,32,104,97,110, + 100,108,101,115,32,115,111,117,114,99,101,108,101,115,115,32, + 102,105,108,101,32,105,109,112,111,114,116,115,46,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, + 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,124, + 1,161,1,125,2,124,0,160,1,124,2,161,1,125,3,124, + 1,124,2,100,1,156,2,125,4,116,2,124,3,124,1,124, + 4,131,3,1,0,116,3,116,4,124,3,131,1,100,2,100, + 0,133,2,25,0,124,1,124,2,100,3,141,3,83,0,41, + 4,78,114,170,0,0,0,114,156,0,0,0,41,2,114,128, + 0,0,0,114,118,0,0,0,41,5,114,190,0,0,0,114, + 242,0,0,0,114,163,0,0,0,114,176,0,0,0,114,250, + 0,0,0,41,5,114,130,0,0,0,114,150,0,0,0,114, + 58,0,0,0,114,42,0,0,0,114,162,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,228,0, + 0,0,60,4,0,0,115,24,0,0,0,10,1,10,1,2, + 4,2,1,6,254,12,4,2,1,14,1,2,1,2,1,6, + 253,255,128,122,29,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,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,114,24,0,0,0, + 41,2,122,39,82,101,116,117,114,110,32,78,111,110,101,32, + 97,115,32,116,104,101,114,101,32,105,115,32,110,111,32,115, + 111,117,114,99,101,32,99,111,100,101,46,78,114,7,0,0, + 0,114,234,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,244,0,0,0,76,4,0,0,114,25, + 0,0,0,122,31,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,41,6,114,137,0,0,0,114,136,0,0, + 0,114,138,0,0,0,114,139,0,0,0,114,228,0,0,0, + 114,244,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,26,1,0,0,56,4, + 0,0,115,10,0,0,0,8,0,4,2,8,2,12,16,255, + 128,114,26,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, + 92,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, + 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, + 100,10,100,11,132,0,90,8,100,12,100,13,132,0,90,9, + 100,14,100,15,132,0,90,10,100,16,100,17,132,0,90,11, + 101,12,100,18,100,19,132,0,131,1,90,13,100,20,83,0, + 41,21,114,17,1,0,0,122,93,76,111,97,100,101,114,32, + 102,111,114,32,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,115,46,10,10,32,32,32,32,84,104,101,32, + 99,111,110,115,116,114,117,99,116,111,114,32,105,115,32,100, + 101,115,105,103,110,101,100,32,116,111,32,119,111,114,107,32, + 119,105,116,104,32,70,105,108,101,70,105,110,100,101,114,46, + 10,10,32,32,32,32,99,3,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, + 16,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, + 100,0,83,0,114,121,0,0,0,114,170,0,0,0,41,3, + 114,130,0,0,0,114,128,0,0,0,114,58,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,223, + 0,0,0,89,4,0,0,115,6,0,0,0,6,1,10,1, 255,128,122,28,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,46,95,95,104,97,115,104,95,95, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,5,0,0,0,67,0,0,0,115,36,0,0,0,116,0, - 160,1,116,2,106,3,124,1,161,2,125,2,116,0,160,4, - 100,1,124,1,106,5,124,0,106,6,161,3,1,0,124,2, - 83,0,41,3,122,38,67,114,101,97,116,101,32,97,110,32, - 117,110,105,116,105,97,108,105,122,101,100,32,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,122,38,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,123, - 33,114,125,32,108,111,97,100,101,100,32,102,114,111,109,32, - 123,33,114,125,78,41,7,114,139,0,0,0,114,221,0,0, - 0,114,167,0,0,0,90,14,99,114,101,97,116,101,95,100, - 121,110,97,109,105,99,114,153,0,0,0,114,121,0,0,0, - 114,52,0,0,0,41,3,114,123,0,0,0,114,191,0,0, - 0,114,223,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,219,0,0,0,100,4,0,0,115,16, - 0,0,0,4,2,6,1,4,255,6,2,8,1,4,255,4, - 2,255,128,122,33,69,120,116,101,110,115,105,111,110,70,105, - 108,101,76,111,97,100,101,114,46,99,114,101,97,116,101,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,5,0,0,0,67,0,0,0,115, - 36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,2, - 1,0,116,0,160,4,100,1,124,0,106,5,124,0,106,6, - 161,3,1,0,100,2,83,0,41,3,122,30,73,110,105,116, - 105,97,108,105,122,101,32,97,110,32,101,120,116,101,110,115, - 105,111,110,32,109,111,100,117,108,101,122,40,101,120,116,101, + 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,0,0,0,0,2,0,0, + 0,2,0,0,0,67,0,0,0,114,255,0,0,0,114,121, + 0,0,0,114,0,1,0,0,114,2,1,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,3,1,0, + 0,93,4,0,0,114,4,1,0,0,122,26,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, + 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,114, + 5,1,0,0,114,121,0,0,0,114,6,1,0,0,114,8, + 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,9,1,0,0,97,4,0,0,114,10,1,0,0, + 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76, + 111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, + 0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1, + 116,2,106,3,124,1,161,2,125,2,116,0,160,4,100,1, + 124,1,106,5,124,0,106,6,161,3,1,0,124,2,83,0, + 41,3,122,38,67,114,101,97,116,101,32,97,110,32,117,110, + 105,116,105,97,108,105,122,101,100,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,122,38,101,120,116,101, 110,115,105,111,110,32,109,111,100,117,108,101,32,123,33,114, - 125,32,101,120,101,99,117,116,101,100,32,102,114,111,109,32, - 123,33,114,125,78,41,7,114,139,0,0,0,114,221,0,0, - 0,114,167,0,0,0,90,12,101,120,101,99,95,100,121,110, - 97,109,105,99,114,153,0,0,0,114,121,0,0,0,114,52, - 0,0,0,169,2,114,123,0,0,0,114,223,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,224, - 0,0,0,108,4,0,0,115,10,0,0,0,14,2,6,1, - 8,1,8,255,255,128,122,31,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,99, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0, - 115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,25, - 0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,116, - 3,68,0,131,1,131,1,83,0,41,5,122,49,82,101,116, - 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, + 125,32,108,111,97,100,101,100,32,102,114,111,109,32,123,33, + 114,125,78,41,7,114,146,0,0,0,114,229,0,0,0,114, + 174,0,0,0,90,14,99,114,101,97,116,101,95,100,121,110, + 97,109,105,99,114,160,0,0,0,114,128,0,0,0,114,58, + 0,0,0,41,3,114,130,0,0,0,114,198,0,0,0,114, + 231,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,226,0,0,0,100,4,0,0,115,16,0,0, + 0,4,2,6,1,4,255,6,2,8,1,4,255,4,2,255, + 128,122,33,69,120,116,101,110,115,105,111,110,70,105,108,101, + 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,5,0,0,0,67,0,0,0,115,36,0, + 0,0,116,0,160,1,116,2,106,3,124,1,161,2,1,0, + 116,0,160,4,100,1,124,0,106,5,124,0,106,6,161,3, + 1,0,100,2,83,0,41,3,122,30,73,110,105,116,105,97, + 108,105,122,101,32,97,110,32,101,120,116,101,110,115,105,111, + 110,32,109,111,100,117,108,101,122,40,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,32,123,33,114,125,32, + 101,120,101,99,117,116,101,100,32,102,114,111,109,32,123,33, + 114,125,78,41,7,114,146,0,0,0,114,229,0,0,0,114, + 174,0,0,0,90,12,101,120,101,99,95,100,121,110,97,109, + 105,99,114,160,0,0,0,114,128,0,0,0,114,58,0,0, + 0,169,2,114,130,0,0,0,114,231,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,232,0,0, + 0,108,4,0,0,115,10,0,0,0,14,2,6,1,8,1, + 8,255,255,128,122,31,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,36, + 0,0,0,116,0,124,0,106,1,131,1,100,1,25,0,137, + 0,116,2,135,0,102,1,100,2,100,3,132,8,116,3,68, + 0,131,1,131,1,83,0,41,5,122,49,82,101,116,117,114, + 110,32,84,114,117,101,32,105,102,32,116,104,101,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,105, + 115,32,97,32,112,97,99,107,97,103,101,46,114,3,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,4,0,0,0,51,0,0,0,115,26,0,0,0,124, + 0,93,18,125,1,136,0,100,0,124,1,23,0,107,2,86, + 0,1,0,113,2,100,1,83,0,41,2,114,223,0,0,0, + 78,114,7,0,0,0,169,2,114,5,0,0,0,218,6,115, + 117,102,102,105,120,169,1,90,9,102,105,108,101,95,110,97, + 109,101,114,7,0,0,0,114,8,0,0,0,114,9,0,0, + 0,117,4,0,0,115,8,0,0,0,4,0,2,1,20,255, + 255,128,122,49,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,111,99,97,108,115,62,46,60,103,101,110, + 101,120,112,114,62,78,41,4,114,61,0,0,0,114,58,0, + 0,0,218,3,97,110,121,114,219,0,0,0,114,234,0,0, + 0,114,7,0,0,0,114,30,1,0,0,114,8,0,0,0, + 114,193,0,0,0,114,4,0,0,115,10,0,0,0,14,2, + 12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,114,24,0,0,0,41,2,122,63,82,101,116,117,114,110, + 32,78,111,110,101,32,97,115,32,97,110,32,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,32,99,97,110, + 110,111,116,32,99,114,101,97,116,101,32,97,32,99,111,100, + 101,32,111,98,106,101,99,116,46,78,114,7,0,0,0,114, + 234,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,228,0,0,0,120,4,0,0,114,25,0,0, + 0,122,28,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,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,114,24,0,0,0,41,2,122, + 53,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,3, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,0, - 0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,107, - 2,86,0,1,0,113,2,100,1,83,0,41,2,114,216,0, - 0,0,78,114,7,0,0,0,169,2,114,5,0,0,0,218, - 6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,95, - 110,97,109,101,114,7,0,0,0,114,8,0,0,0,114,9, - 0,0,0,117,4,0,0,115,8,0,0,0,4,0,2,1, - 20,255,255,128,122,49,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,111,99,97,108,115,62,46,60,103, - 101,110,101,120,112,114,62,78,41,4,114,55,0,0,0,114, - 52,0,0,0,218,3,97,110,121,114,212,0,0,0,114,226, - 0,0,0,114,7,0,0,0,114,16,1,0,0,114,8,0, - 0,0,114,186,0,0,0,114,4,0,0,115,10,0,0,0, - 14,2,12,1,2,1,8,255,255,128,122,30,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,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,63, - 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,97, - 110,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,32,99,97,110,110,111,116,32,99,114,101,97,116,101, - 32,97,32,99,111,100,101,32,111,98,106,101,99,116,46,78, - 114,7,0,0,0,114,226,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,220,0,0,0,120,4, - 0,0,115,4,0,0,0,4,2,255,128,122,28,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,53,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,32, - 104,97,118,101,32,110,111,32,115,111,117,114,99,101,32,99, - 111,100,101,46,78,114,7,0,0,0,114,226,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,236, - 0,0,0,124,4,0,0,115,4,0,0,0,4,2,255,128, - 122,30,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, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,6,0,0,0,124,0, - 106,0,83,0,114,1,1,0,0,114,56,0,0,0,114,226, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,183,0,0,0,128,4,0,0,115,4,0,0,0, - 6,3,255,128,122,32,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,103,101,116,95,102,105, - 108,101,110,97,109,101,78,41,14,114,130,0,0,0,114,129, - 0,0,0,114,131,0,0,0,114,132,0,0,0,114,216,0, - 0,0,114,250,0,0,0,114,254,0,0,0,114,219,0,0, - 0,114,224,0,0,0,114,186,0,0,0,114,220,0,0,0, - 114,236,0,0,0,114,140,0,0,0,114,183,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,3,1,0,0,81,4,0,0,115,26,0,0, - 0,8,0,4,2,8,6,8,4,8,4,8,3,8,8,8, - 6,8,6,8,4,2,4,14,1,255,128,114,3,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,64,0,0,0,115,104,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, - 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, - 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, - 90,10,100,16,100,17,132,0,90,11,100,18,100,19,132,0, - 90,12,100,20,100,21,132,0,90,13,100,22,100,23,132,0, - 90,14,100,24,83,0,41,25,218,14,95,78,97,109,101,115, - 112,97,99,101,80,97,116,104,97,38,1,0,0,82,101,112, - 114,101,115,101,110,116,115,32,97,32,110,97,109,101,115,112, - 97,99,101,32,112,97,99,107,97,103,101,39,115,32,112,97, - 116,104,46,32,32,73,116,32,117,115,101,115,32,116,104,101, - 32,109,111,100,117,108,101,32,110,97,109,101,10,32,32,32, - 32,116,111,32,102,105,110,100,32,105,116,115,32,112,97,114, - 101,110,116,32,109,111,100,117,108,101,44,32,97,110,100,32, - 102,114,111,109,32,116,104,101,114,101,32,105,116,32,108,111, - 111,107,115,32,117,112,32,116,104,101,32,112,97,114,101,110, - 116,39,115,10,32,32,32,32,95,95,112,97,116,104,95,95, - 46,32,32,87,104,101,110,32,116,104,105,115,32,99,104,97, - 110,103,101,115,44,32,116,104,101,32,109,111,100,117,108,101, - 39,115,32,111,119,110,32,112,97,116,104,32,105,115,32,114, - 101,99,111,109,112,117,116,101,100,44,10,32,32,32,32,117, - 115,105,110,103,32,112,97,116,104,95,102,105,110,100,101,114, - 46,32,32,70,111,114,32,116,111,112,45,108,101,118,101,108, - 32,109,111,100,117,108,101,115,44,32,116,104,101,32,112,97, - 114,101,110,116,32,109,111,100,117,108,101,39,115,32,112,97, - 116,104,10,32,32,32,32,105,115,32,115,121,115,46,112,97, - 116,104,46,99,4,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,3,0,0,0,67,0,0,0,115,36,0,0, - 0,124,1,124,0,95,0,124,2,124,0,95,1,116,2,124, - 0,160,3,161,0,131,1,124,0,95,4,124,3,124,0,95, - 5,100,0,83,0,114,114,0,0,0,41,6,218,5,95,110, - 97,109,101,218,5,95,112,97,116,104,114,116,0,0,0,218, - 16,95,103,101,116,95,112,97,114,101,110,116,95,112,97,116, - 104,218,17,95,108,97,115,116,95,112,97,114,101,110,116,95, - 112,97,116,104,218,12,95,112,97,116,104,95,102,105,110,100, - 101,114,169,4,114,123,0,0,0,114,121,0,0,0,114,52, - 0,0,0,90,11,112,97,116,104,95,102,105,110,100,101,114, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 216,0,0,0,141,4,0,0,115,10,0,0,0,6,1,6, - 1,14,1,10,1,255,128,122,23,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,0,0,0,0,4,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, - 106,0,160,1,100,1,161,1,92,3,125,1,125,2,125,3, - 124,2,100,2,107,2,114,30,100,3,83,0,124,1,100,4, - 102,2,83,0,41,6,122,62,82,101,116,117,114,110,115,32, - 97,32,116,117,112,108,101,32,111,102,32,40,112,97,114,101, - 110,116,45,109,111,100,117,108,101,45,110,97,109,101,44,32, - 112,97,114,101,110,116,45,112,97,116,104,45,97,116,116,114, - 45,110,97,109,101,41,114,79,0,0,0,114,10,0,0,0, - 41,2,114,15,0,0,0,114,52,0,0,0,90,8,95,95, - 112,97,116,104,95,95,78,41,2,114,19,1,0,0,114,49, - 0,0,0,41,4,114,123,0,0,0,114,11,1,0,0,218, - 3,100,111,116,90,2,109,101,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,23,95,102,105,110,100,95,112, - 97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,115, - 147,4,0,0,115,10,0,0,0,18,2,8,1,4,2,8, - 3,255,128,122,38,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,101,115,99,1,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,28,0,0,0,124,0,160,0,161,0,92, - 2,125,1,125,2,116,1,116,2,106,3,124,1,25,0,124, - 2,131,2,83,0,114,114,0,0,0,41,4,114,26,1,0, - 0,114,135,0,0,0,114,15,0,0,0,218,7,109,111,100, - 117,108,101,115,41,3,114,123,0,0,0,90,18,112,97,114, - 101,110,116,95,109,111,100,117,108,101,95,110,97,109,101,90, - 14,112,97,116,104,95,97,116,116,114,95,110,97,109,101,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,21, - 1,0,0,157,4,0,0,115,6,0,0,0,12,1,16,1, - 255,128,122,31,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,0,0,0,0, - 3,0,0,0,4,0,0,0,67,0,0,0,115,80,0,0, - 0,116,0,124,0,160,1,161,0,131,1,125,1,124,1,124, - 0,106,2,107,3,114,74,124,0,160,3,124,0,106,4,124, - 1,161,2,125,2,124,2,100,0,117,1,114,68,124,2,106, - 5,100,0,117,0,114,68,124,2,106,6,114,68,124,2,106, - 6,124,0,95,7,124,1,124,0,95,2,124,0,106,7,83, - 0,114,114,0,0,0,41,8,114,116,0,0,0,114,21,1, - 0,0,114,22,1,0,0,114,23,1,0,0,114,19,1,0, - 0,114,144,0,0,0,114,182,0,0,0,114,20,1,0,0, - 41,3,114,123,0,0,0,90,11,112,97,114,101,110,116,95, - 112,97,116,104,114,191,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,12,95,114,101,99,97,108, - 99,117,108,97,116,101,161,4,0,0,115,18,0,0,0,12, - 2,10,1,14,1,18,3,6,1,8,1,6,1,6,1,255, - 128,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,114,101,99,97,108,99,117,108,97,116,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,12,0,0,0,116,0,124,0, - 160,1,161,0,131,1,83,0,114,114,0,0,0,41,2,218, - 4,105,116,101,114,114,28,1,0,0,114,253,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,8, - 95,95,105,116,101,114,95,95,174,4,0,0,115,4,0,0, - 0,12,1,255,128,122,23,95,78,97,109,101,115,112,97,99, - 101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, - 0,0,0,67,0,0,0,115,12,0,0,0,124,0,160,0, - 161,0,124,1,25,0,83,0,114,114,0,0,0,169,1,114, - 28,1,0,0,41,2,114,123,0,0,0,218,5,105,110,100, - 101,120,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,95,95,103,101,116,105,116,101,109,95,95,177,4, - 0,0,115,4,0,0,0,12,1,255,128,122,26,95,78,97, + 115,32,104,97,118,101,32,110,111,32,115,111,117,114,99,101, + 32,99,111,100,101,46,78,114,7,0,0,0,114,234,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,244,0,0,0,124,4,0,0,114,25,0,0,0,122,30, + 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,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, + 0,0,0,67,0,0,0,114,13,1,0,0,114,14,1,0, + 0,114,62,0,0,0,114,234,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,190,0,0,0,128, + 4,0,0,114,15,1,0,0,122,32,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,102,105,108,101,110,97,109,101,78,41,14,114,137,0, + 0,0,114,136,0,0,0,114,138,0,0,0,114,139,0,0, + 0,114,223,0,0,0,114,3,1,0,0,114,9,1,0,0, + 114,226,0,0,0,114,232,0,0,0,114,193,0,0,0,114, + 228,0,0,0,114,244,0,0,0,114,147,0,0,0,114,190, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,17,1,0,0,81,4,0,0, + 115,26,0,0,0,8,0,4,2,8,6,8,4,8,4,8, + 3,8,8,8,6,8,6,8,4,2,4,14,1,255,128,114, + 17,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, + 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, + 100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,14, + 100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,18, + 100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,22, + 100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,0, + 0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,97, + 109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,39, + 115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,115, + 32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101, + 10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,115, + 32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,32, + 97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,105, + 116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,112, + 97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,97, + 116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,115, + 32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,111, + 100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,32, + 105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,32, + 32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,105, + 110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,108, + 101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,104, + 101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,39, + 115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,121, + 115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, + 115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,95, + 1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,124, + 3,124,0,95,5,100,0,83,0,114,121,0,0,0,41,6, + 218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,123, + 0,0,0,218,16,95,103,101,116,95,112,97,114,101,110,116, + 95,112,97,116,104,218,17,95,108,97,115,116,95,112,97,114, + 101,110,116,95,112,97,116,104,218,12,95,112,97,116,104,95, + 102,105,110,100,101,114,169,4,114,130,0,0,0,114,128,0, + 0,0,114,58,0,0,0,90,11,112,97,116,104,95,102,105, + 110,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,223,0,0,0,141,4,0,0,115,10,0,0, + 0,6,1,6,1,14,1,10,1,255,128,122,23,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,0,0,0, + 0,4,0,0,0,3,0,0,0,67,0,0,0,115,38,0, + 0,0,124,0,106,0,160,1,100,1,161,1,92,3,125,1, + 125,2,125,3,124,2,100,2,107,2,114,30,100,3,83,0, + 124,1,100,4,102,2,83,0,41,6,122,62,82,101,116,117, + 114,110,115,32,97,32,116,117,112,108,101,32,111,102,32,40, + 112,97,114,101,110,116,45,109,111,100,117,108,101,45,110,97, + 109,101,44,32,112,97,114,101,110,116,45,112,97,116,104,45, + 97,116,116,114,45,110,97,109,101,41,114,86,0,0,0,114, + 10,0,0,0,41,2,114,16,0,0,0,114,58,0,0,0, + 90,8,95,95,112,97,116,104,95,95,78,41,2,114,33,1, + 0,0,114,55,0,0,0,41,4,114,130,0,0,0,114,25, + 1,0,0,218,3,100,111,116,90,2,109,101,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,23,95,102,105, + 110,100,95,112,97,114,101,110,116,95,112,97,116,104,95,110, + 97,109,101,115,147,4,0,0,115,10,0,0,0,18,2,8, + 1,4,2,8,3,255,128,122,38,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,101,115,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,28,0,0,0,124,0,160, + 0,161,0,92,2,125,1,125,2,116,1,116,2,106,3,124, + 1,25,0,124,2,131,2,83,0,114,121,0,0,0,41,4, + 114,40,1,0,0,114,142,0,0,0,114,16,0,0,0,218, + 7,109,111,100,117,108,101,115,41,3,114,130,0,0,0,90, + 18,112,97,114,101,110,116,95,109,111,100,117,108,101,95,110, + 97,109,101,90,14,112,97,116,104,95,97,116,116,114,95,110, + 97,109,101,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,35,1,0,0,157,4,0,0,115,6,0,0,0, + 12,1,16,1,255,128,122,31,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, + 0,0,0,0,3,0,0,0,4,0,0,0,67,0,0,0, + 115,80,0,0,0,116,0,124,0,160,1,161,0,131,1,125, + 1,124,1,124,0,106,2,107,3,114,74,124,0,160,3,124, + 0,106,4,124,1,161,2,125,2,124,2,100,0,117,1,114, + 68,124,2,106,5,100,0,117,0,114,68,124,2,106,6,114, + 68,124,2,106,6,124,0,95,7,124,1,124,0,95,2,124, + 0,106,7,83,0,114,121,0,0,0,41,8,114,123,0,0, + 0,114,35,1,0,0,114,36,1,0,0,114,37,1,0,0, + 114,33,1,0,0,114,151,0,0,0,114,189,0,0,0,114, + 34,1,0,0,41,3,114,130,0,0,0,90,11,112,97,114, + 101,110,116,95,112,97,116,104,114,198,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,12,95,114, + 101,99,97,108,99,117,108,97,116,101,161,4,0,0,115,18, + 0,0,0,12,2,10,1,14,1,18,3,6,1,8,1,6, + 1,6,1,255,128,122,27,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,114,101,99,97,108,99,117,108,97, + 116,101,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,243,12,0,0,0, + 116,0,124,0,160,1,161,0,131,1,83,0,114,121,0,0, + 0,41,2,218,4,105,116,101,114,114,42,1,0,0,114,8, + 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,8,95,95,105,116,101,114,95,95,174,4,0,0, + 243,4,0,0,0,12,1,255,128,122,23,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,105,116,101,114, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,12,0,0,0, + 124,0,160,0,161,0,124,1,25,0,83,0,114,121,0,0, + 0,169,1,114,42,1,0,0,41,2,114,130,0,0,0,218, + 5,105,110,100,101,120,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,11,95,95,103,101,116,105,116,101,109, + 95,95,177,4,0,0,114,46,1,0,0,122,26,95,78,97, 109,101,115,112,97,99,101,80,97,116,104,46,95,95,103,101, 116,105,116,101,109,95,95,99,3,0,0,0,0,0,0,0, 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, 115,14,0,0,0,124,2,124,0,106,0,124,1,60,0,100, - 0,83,0,114,114,0,0,0,41,1,114,20,1,0,0,41, - 3,114,123,0,0,0,114,32,1,0,0,114,52,0,0,0, + 0,83,0,114,121,0,0,0,41,1,114,34,1,0,0,41, + 3,114,130,0,0,0,114,48,1,0,0,114,58,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, 11,95,95,115,101,116,105,116,101,109,95,95,180,4,0,0, 115,4,0,0,0,14,1,255,128,122,26,95,78,97,109,101, 115,112,97,99,101,80,97,116,104,46,95,95,115,101,116,105, 116,101,109,95,95,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,116,0,124,0,160,1,161,0,131,1,83,0,114, - 114,0,0,0,41,2,114,4,0,0,0,114,28,1,0,0, - 114,253,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,7,95,95,108,101,110,95,95,183,4,0, - 0,115,4,0,0,0,12,1,255,128,122,22,95,78,97,109, + 0,0,1,0,0,0,3,0,0,0,67,0,0,0,114,43, + 1,0,0,114,121,0,0,0,41,2,114,4,0,0,0,114, + 42,1,0,0,114,8,1,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,7,95,95,108,101,110,95, + 95,183,4,0,0,114,46,1,0,0,122,22,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,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, + 0,0,0,3,0,0,0,67,0,0,0,243,12,0,0,0, 100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122, 20,95,78,97,109,101,115,112,97,99,101,80,97,116,104,40, - 123,33,114,125,41,41,2,114,70,0,0,0,114,20,1,0, - 0,114,253,0,0,0,114,7,0,0,0,114,7,0,0,0, + 123,33,114,125,41,41,2,114,77,0,0,0,114,34,1,0, + 0,114,8,1,0,0,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,8,95,95,114,101,112,114,95,95,186, - 4,0,0,115,4,0,0,0,12,1,255,128,122,23,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,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,124,1,124,0,160,0,161,0,118,0,83,0,114, - 114,0,0,0,114,31,1,0,0,169,2,114,123,0,0,0, - 218,4,105,116,101,109,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,12,95,95,99,111,110,116,97,105,110, - 115,95,95,189,4,0,0,115,4,0,0,0,12,1,255,128, - 122,27,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,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,16,0,0,0,124,0,106,0,160, - 1,124,1,161,1,1,0,100,0,83,0,114,114,0,0,0, - 41,2,114,20,1,0,0,114,190,0,0,0,114,37,1,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,190,0,0,0,192,4,0,0,115,4,0,0,0,16,1, - 255,128,122,21,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,97,112,112,101,110,100,78,41,15,114,130,0,0, - 0,114,129,0,0,0,114,131,0,0,0,114,132,0,0,0, - 114,216,0,0,0,114,26,1,0,0,114,21,1,0,0,114, - 28,1,0,0,114,30,1,0,0,114,33,1,0,0,114,34, - 1,0,0,114,35,1,0,0,114,36,1,0,0,114,39,1, - 0,0,114,190,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,18,1,0,0, - 134,4,0,0,115,28,0,0,0,8,0,4,1,8,6,8, - 6,8,10,8,4,8,13,8,3,8,3,8,3,8,3,8, - 3,12,3,255,128,114,18,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, - 0,0,0,115,80,0,0,0,101,0,90,1,100,0,90,2, - 100,1,100,2,132,0,90,3,101,4,100,3,100,4,132,0, - 131,1,90,5,100,5,100,6,132,0,90,6,100,7,100,8, - 132,0,90,7,100,9,100,10,132,0,90,8,100,11,100,12, - 132,0,90,9,100,13,100,14,132,0,90,10,100,15,100,16, - 132,0,90,11,100,17,83,0,41,18,218,16,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,99,4,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, - 0,67,0,0,0,115,18,0,0,0,116,0,124,1,124,2, - 124,3,131,3,124,0,95,1,100,0,83,0,114,114,0,0, - 0,41,2,114,18,1,0,0,114,20,1,0,0,114,24,1, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,216,0,0,0,198,4,0,0,115,4,0,0,0,18, - 1,255,128,122,25,95,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,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,12,0,0,0,100,1,160,0, - 124,0,106,1,161,1,83,0,41,3,122,115,82,101,116,117, - 114,110,32,114,101,112,114,32,102,111,114,32,116,104,101,32, - 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,101,32,109,101,116,104,111,100,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,32,84,104,101,32, - 105,109,112,111,114,116,32,109,97,99,104,105,110,101,114,121, - 32,100,111,101,115,32,116,104,101,32,106,111,98,32,105,116, - 115,101,108,102,46,10,10,32,32,32,32,32,32,32,32,122, - 25,60,109,111,100,117,108,101,32,123,33,114,125,32,40,110, - 97,109,101,115,112,97,99,101,41,62,78,41,2,114,70,0, - 0,0,114,130,0,0,0,41,1,114,223,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,109, - 111,100,117,108,101,95,114,101,112,114,201,4,0,0,115,4, - 0,0,0,12,7,255,128,122,28,95,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,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,78,84,114,7,0,0,0, - 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,186,0,0,0,210,4,0,0,115,4,0, - 0,0,4,1,255,128,122,27,95,78,97,109,101,115,112,97, - 99,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,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,78,114,10,0,0,0,114,7,0, - 0,0,114,226,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,236,0,0,0,213,4,0,0,115, - 4,0,0,0,4,1,255,128,122,27,95,78,97,109,101,115, + 4,0,0,114,46,1,0,0,122,23,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,0,0,0,0,2,0, + 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,124, + 1,124,0,160,0,161,0,118,0,83,0,114,121,0,0,0, + 114,47,1,0,0,169,2,114,130,0,0,0,218,4,105,116, + 101,109,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,12,95,95,99,111,110,116,97,105,110,115,95,95,189, + 4,0,0,114,46,1,0,0,122,27,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,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,16, + 0,0,0,124,0,106,0,160,1,124,1,161,1,1,0,100, + 0,83,0,114,121,0,0,0,41,2,114,34,1,0,0,114, + 197,0,0,0,114,54,1,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,197,0,0,0,192,4,0, + 0,243,4,0,0,0,16,1,255,128,122,21,95,78,97,109, + 101,115,112,97,99,101,80,97,116,104,46,97,112,112,101,110, + 100,78,41,15,114,137,0,0,0,114,136,0,0,0,114,138, + 0,0,0,114,139,0,0,0,114,223,0,0,0,114,40,1, + 0,0,114,35,1,0,0,114,42,1,0,0,114,45,1,0, + 0,114,49,1,0,0,114,50,1,0,0,114,51,1,0,0, + 114,53,1,0,0,114,56,1,0,0,114,197,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,32,1,0,0,134,4,0,0,115,28,0,0, + 0,8,0,4,1,8,6,8,6,8,10,8,4,8,13,8, + 3,8,3,8,3,8,3,8,3,12,3,255,128,114,32,1, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,64,0,0,0,115,80,0,0,0, + 101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3, + 101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,6, + 132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10, + 132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14, + 132,0,90,10,100,15,100,16,132,0,90,11,100,17,83,0, + 41,18,218,16,95,78,97,109,101,115,112,97,99,101,76,111, + 97,100,101,114,99,4,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,4,0,0,0,67,0,0,0,115,18,0, + 0,0,116,0,124,1,124,2,124,3,131,3,124,0,95,1, + 100,0,83,0,114,121,0,0,0,41,2,114,32,1,0,0, + 114,34,1,0,0,114,38,1,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,223,0,0,0,198,4, + 0,0,115,4,0,0,0,18,1,255,128,122,25,95,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,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,114, + 52,1,0,0,41,3,122,115,82,101,116,117,114,110,32,114, + 101,112,114,32,102,111,114,32,116,104,101,32,109,111,100,117, + 108,101,46,10,10,32,32,32,32,32,32,32,32,84,104,101, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,84,104,101,32,105,109,112,111, + 114,116,32,109,97,99,104,105,110,101,114,121,32,100,111,101, + 115,32,116,104,101,32,106,111,98,32,105,116,115,101,108,102, + 46,10,10,32,32,32,32,32,32,32,32,122,25,60,109,111, + 100,117,108,101,32,123,33,114,125,32,40,110,97,109,101,115, + 112,97,99,101,41,62,78,41,2,114,77,0,0,0,114,137, + 0,0,0,41,1,114,231,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,11,109,111,100,117,108, + 101,95,114,101,112,114,201,4,0,0,115,4,0,0,0,12, + 7,255,128,122,28,95,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,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,114,24,0,0,0,41, + 2,78,84,114,7,0,0,0,114,234,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,193,0,0, + 0,210,4,0,0,243,4,0,0,0,4,1,255,128,122,27, + 95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,114,24,0,0,0,41,2,78,114,10,0,0, + 0,114,7,0,0,0,114,234,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,244,0,0,0,213, + 4,0,0,114,60,1,0,0,122,27,95,78,97,109,101,115, 112,97,99,101,76,111,97,100,101,114,46,103,101,116,95,115, 111,117,114,99,101,99,2,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,0,6,0,0,0,67,0,0,0,115,16, 0,0,0,116,0,100,1,100,2,100,3,100,4,100,5,141, 4,83,0,41,6,78,114,10,0,0,0,122,8,60,115,116, - 114,105,110,103,62,114,222,0,0,0,84,41,1,114,238,0, - 0,0,41,1,114,239,0,0,0,114,226,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,220,0, - 0,0,216,4,0,0,115,4,0,0,0,16,1,255,128,122, - 25,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,114,217,0,0, - 0,114,7,0,0,0,114,218,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,219,0,0,0,219, - 4,0,0,115,4,0,0,0,4,0,255,128,122,30,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,99, - 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,114, - 0,0,0,114,7,0,0,0,114,13,1,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,224,0,0, - 0,222,4,0,0,115,4,0,0,0,4,1,255,128,122,28, + 114,105,110,103,62,114,230,0,0,0,84,41,1,114,246,0, + 0,0,41,1,114,247,0,0,0,114,234,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,228,0, + 0,0,216,4,0,0,114,57,1,0,0,122,25,95,78,97, + 109,101,115,112,97,99,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,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,114, + 24,0,0,0,114,224,0,0,0,114,7,0,0,0,114,225, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,226,0,0,0,219,4,0,0,114,227,0,0,0, + 122,30,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,0, + 83,0,114,121,0,0,0,114,7,0,0,0,114,27,1,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,232,0,0,0,222,4,0,0,114,60,1,0,0,122,28, 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, @@ -2045,20 +2032,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 10,10,32,32,32,32,32,32,32,32,122,38,110,97,109,101, 115,112,97,99,101,32,109,111,100,117,108,101,32,108,111,97, 100,101,100,32,119,105,116,104,32,112,97,116,104,32,123,33, - 114,125,78,41,4,114,139,0,0,0,114,153,0,0,0,114, - 20,1,0,0,114,225,0,0,0,114,226,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,227,0, + 114,125,78,41,4,114,146,0,0,0,114,160,0,0,0,114, + 34,1,0,0,114,233,0,0,0,114,234,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,235,0, 0,0,225,4,0,0,115,10,0,0,0,6,7,4,1,4, 255,12,3,255,128,122,28,95,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,41,12,114,130,0,0,0,114,129,0,0,0, - 114,131,0,0,0,114,216,0,0,0,114,213,0,0,0,114, - 41,1,0,0,114,186,0,0,0,114,236,0,0,0,114,220, - 0,0,0,114,219,0,0,0,114,224,0,0,0,114,227,0, + 117,108,101,78,41,12,114,137,0,0,0,114,136,0,0,0, + 114,138,0,0,0,114,223,0,0,0,114,220,0,0,0,114, + 59,1,0,0,114,193,0,0,0,114,244,0,0,0,114,228, + 0,0,0,114,226,0,0,0,114,232,0,0,0,114,235,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,40,1,0,0,197,4,0,0,115, + 0,114,8,0,0,0,114,58,1,0,0,197,4,0,0,115, 22,0,0,0,8,0,8,1,2,3,10,1,8,8,8,3, - 8,3,8,3,8,3,12,3,255,128,114,40,1,0,0,99, + 8,3,8,3,8,3,12,3,255,128,114,58,1,0,0,99, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 4,0,0,0,64,0,0,0,115,118,0,0,0,101,0,90, 1,100,0,90,2,100,1,90,3,101,4,100,2,100,3,132, @@ -2088,12 +2075,12 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,116,101,114,95,99,97,99,104,101,115,32,40,119,104,101, 114,101,32,105,109,112,108,101,109,101,110,116,101,100,41,46, 78,218,17,105,110,118,97,108,105,100,97,116,101,95,99,97, - 99,104,101,115,41,6,218,4,108,105,115,116,114,15,0,0, + 99,104,101,115,41,6,218,4,108,105,115,116,114,16,0,0, 0,218,19,112,97,116,104,95,105,109,112,111,114,116,101,114, - 95,99,97,99,104,101,218,5,105,116,101,109,115,114,133,0, - 0,0,114,43,1,0,0,41,2,114,121,0,0,0,218,6, + 95,99,97,99,104,101,218,5,105,116,101,109,115,114,140,0, + 0,0,114,62,1,0,0,41,2,114,128,0,0,0,218,6, 102,105,110,100,101,114,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,43,1,0,0,244,4,0,0,115,16, + 114,8,0,0,0,114,62,1,0,0,244,4,0,0,115,16, 0,0,0,22,4,8,1,10,1,10,1,8,1,2,128,4, 252,255,128,122,28,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, @@ -2108,10 +2095,10 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,111,107,115,32,102,111,114,32,97,32,102,105,110,100,101, 114,32,102,111,114,32,39,112,97,116,104,39,46,78,122,23, 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,105, - 115,32,101,109,112,116,121,41,6,114,15,0,0,0,218,10, - 112,97,116,104,95,104,111,111,107,115,114,81,0,0,0,114, - 82,0,0,0,114,142,0,0,0,114,122,0,0,0,41,2, - 114,52,0,0,0,90,4,104,111,111,107,114,7,0,0,0, + 115,32,101,109,112,116,121,41,6,114,16,0,0,0,218,10, + 112,97,116,104,95,104,111,111,107,115,114,88,0,0,0,114, + 89,0,0,0,114,149,0,0,0,114,129,0,0,0,41,2, + 114,58,0,0,0,90,4,104,111,111,107,114,7,0,0,0, 114,7,0,0,0,114,8,0,0,0,218,11,95,112,97,116, 104,95,104,111,111,107,115,254,4,0,0,115,20,0,0,0, 16,3,12,1,10,1,2,1,14,1,12,1,4,1,4,2, @@ -2138,11 +2125,11 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 105,116,46,32,73,102,32,110,111,32,102,105,110,100,101,114, 32,105,115,32,97,118,97,105,108,97,98,108,101,44,32,115, 116,111,114,101,32,78,111,110,101,46,10,10,32,32,32,32, - 32,32,32,32,114,10,0,0,0,78,41,7,114,18,0,0, - 0,114,63,0,0,0,218,17,70,105,108,101,78,111,116,70, - 111,117,110,100,69,114,114,111,114,114,15,0,0,0,114,45, - 1,0,0,218,8,75,101,121,69,114,114,111,114,114,49,1, - 0,0,41,3,114,202,0,0,0,114,52,0,0,0,114,47, + 32,32,32,32,114,10,0,0,0,78,41,7,114,19,0,0, + 0,114,70,0,0,0,218,17,70,105,108,101,78,111,116,70, + 111,117,110,100,69,114,114,111,114,114,16,0,0,0,114,64, + 1,0,0,218,8,75,101,121,69,114,114,111,114,114,68,1, + 0,0,41,3,114,209,0,0,0,114,58,0,0,0,114,66, 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, 0,0,218,20,95,112,97,116,104,95,105,109,112,111,114,116, 101,114,95,99,97,99,104,101,11,5,0,0,115,30,0,0, @@ -2157,11 +2144,11 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 125,3,103,0,125,4,124,3,100,0,117,1,114,60,116,3, 160,4,124,1,124,3,161,2,83,0,116,3,160,5,124,1, 100,0,161,2,125,5,124,4,124,5,95,6,124,5,83,0, - 41,2,78,114,141,0,0,0,41,7,114,133,0,0,0,114, - 141,0,0,0,114,210,0,0,0,114,139,0,0,0,114,205, - 0,0,0,114,187,0,0,0,114,182,0,0,0,41,6,114, - 202,0,0,0,114,143,0,0,0,114,47,1,0,0,114,144, - 0,0,0,114,145,0,0,0,114,191,0,0,0,114,7,0, + 41,2,78,114,148,0,0,0,41,7,114,140,0,0,0,114, + 148,0,0,0,114,217,0,0,0,114,146,0,0,0,114,212, + 0,0,0,114,194,0,0,0,114,189,0,0,0,41,6,114, + 209,0,0,0,114,150,0,0,0,114,66,1,0,0,114,151, + 0,0,0,114,152,0,0,0,114,198,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,16,95,108, 101,103,97,99,121,95,103,101,116,95,115,112,101,99,33,5, 0,0,115,20,0,0,0,10,4,16,1,10,2,4,1,8, @@ -2184,16 +2171,16 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,111,114,32,110,97,109,101,115,112,97,99,101,95,112,97, 116,104,32,102,111,114,32,116,104,105,115,32,109,111,100,117, 108,101,47,112,97,99,107,97,103,101,32,110,97,109,101,46, - 78,114,207,0,0,0,122,19,115,112,101,99,32,109,105,115, - 115,105,110,103,32,108,111,97,100,101,114,41,13,114,165,0, - 0,0,114,90,0,0,0,218,5,98,121,116,101,115,114,52, - 1,0,0,114,133,0,0,0,114,207,0,0,0,114,53,1, - 0,0,114,144,0,0,0,114,182,0,0,0,114,122,0,0, - 0,114,171,0,0,0,114,139,0,0,0,114,187,0,0,0, - 41,9,114,202,0,0,0,114,143,0,0,0,114,52,0,0, - 0,114,206,0,0,0,218,14,110,97,109,101,115,112,97,99, - 101,95,112,97,116,104,90,5,101,110,116,114,121,114,47,1, - 0,0,114,191,0,0,0,114,145,0,0,0,114,7,0,0, + 78,114,214,0,0,0,122,19,115,112,101,99,32,109,105,115, + 115,105,110,103,32,108,111,97,100,101,114,41,13,114,172,0, + 0,0,114,97,0,0,0,218,5,98,121,116,101,115,114,71, + 1,0,0,114,140,0,0,0,114,214,0,0,0,114,72,1, + 0,0,114,151,0,0,0,114,189,0,0,0,114,129,0,0, + 0,114,178,0,0,0,114,146,0,0,0,114,194,0,0,0, + 41,9,114,209,0,0,0,114,150,0,0,0,114,58,0,0, + 0,114,213,0,0,0,218,14,110,97,109,101,115,112,97,99, + 101,95,112,97,116,104,90,5,101,110,116,114,121,114,66,1, + 0,0,114,198,0,0,0,114,152,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,9,95,103,101, 116,95,115,112,101,99,48,5,0,0,115,44,0,0,0,4, 5,8,1,14,1,2,1,10,1,8,1,10,1,14,1,12, @@ -2217,12 +2204,12 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,104,95,104,111,111,107,115,32,97,110,100,32,115,121,115, 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, 97,99,104,101,46,10,32,32,32,32,32,32,32,32,78,41, - 7,114,15,0,0,0,114,52,0,0,0,114,56,1,0,0, - 114,144,0,0,0,114,182,0,0,0,114,185,0,0,0,114, - 18,1,0,0,41,6,114,202,0,0,0,114,143,0,0,0, - 114,52,0,0,0,114,206,0,0,0,114,191,0,0,0,114, - 55,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,207,0,0,0,80,5,0,0,115,28,0,0, + 7,114,16,0,0,0,114,58,0,0,0,114,75,1,0,0, + 114,151,0,0,0,114,189,0,0,0,114,192,0,0,0,114, + 32,1,0,0,41,6,114,209,0,0,0,114,150,0,0,0, + 114,58,0,0,0,114,213,0,0,0,114,198,0,0,0,114, + 74,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,214,0,0,0,80,5,0,0,115,28,0,0, 0,8,6,6,1,14,1,8,1,4,1,10,1,6,1,4, 1,6,3,16,1,4,1,4,2,4,2,255,128,122,20,80, 97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,115, @@ -2240,9 +2227,9 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,32,32,32,32,78,114,208, - 0,0,0,114,209,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,210,0,0,0,104,5,0,0, + 97,100,46,10,10,32,32,32,32,32,32,32,32,78,114,215, + 0,0,0,114,216,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,217,0,0,0,104,5,0,0, 115,10,0,0,0,12,8,8,1,4,1,6,1,255,128,122, 22,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, 95,109,111,100,117,108,101,99,0,0,0,0,0,0,0,0, @@ -2270,24 +2257,24 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,32,32,32,114,0,0,0,0,41,1,218, 18,77,101,116,97,100,97,116,97,80,97,116,104,70,105,110, 100,101,114,78,41,3,90,18,105,109,112,111,114,116,108,105, - 98,46,109,101,116,97,100,97,116,97,114,57,1,0,0,218, + 98,46,109,101,116,97,100,97,116,97,114,76,1,0,0,218, 18,102,105,110,100,95,100,105,115,116,114,105,98,117,116,105, - 111,110,115,41,3,114,124,0,0,0,114,125,0,0,0,114, - 57,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,58,1,0,0,117,5,0,0,115,6,0,0, + 111,110,115,41,3,114,131,0,0,0,114,132,0,0,0,114, + 76,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,77,1,0,0,117,5,0,0,115,6,0,0, 0,12,10,16,1,255,128,122,29,80,97,116,104,70,105,110, 100,101,114,46,102,105,110,100,95,100,105,115,116,114,105,98, 117,116,105,111,110,115,41,1,78,41,2,78,78,41,1,78, - 41,14,114,130,0,0,0,114,129,0,0,0,114,131,0,0, - 0,114,132,0,0,0,114,213,0,0,0,114,43,1,0,0, - 114,49,1,0,0,114,214,0,0,0,114,52,1,0,0,114, - 53,1,0,0,114,56,1,0,0,114,207,0,0,0,114,210, - 0,0,0,114,58,1,0,0,114,7,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,42,1,0, + 41,14,114,137,0,0,0,114,136,0,0,0,114,138,0,0, + 0,114,139,0,0,0,114,220,0,0,0,114,62,1,0,0, + 114,68,1,0,0,114,221,0,0,0,114,71,1,0,0,114, + 72,1,0,0,114,75,1,0,0,114,214,0,0,0,114,217, + 0,0,0,114,77,1,0,0,114,7,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,61,1,0, 0,240,4,0,0,115,38,0,0,0,8,0,4,2,2,2, 10,1,2,9,10,1,2,12,10,1,2,21,10,1,2,14, 12,1,2,31,12,1,2,23,12,1,2,12,14,1,255,128, - 114,42,1,0,0,99,0,0,0,0,0,0,0,0,0,0, + 114,61,1,0,0,99,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,90, 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, 2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,101, @@ -2326,348 +2313,347 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,111,103,110,105,122,101,115,46,99,1,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,3,0,0,0,51,0, 0,0,115,22,0,0,0,124,0,93,14,125,1,124,1,136, - 0,102,2,86,0,1,0,113,2,100,0,83,0,114,114,0, - 0,0,114,7,0,0,0,114,14,1,0,0,169,1,114,144, + 0,102,2,86,0,1,0,113,2,100,0,83,0,114,121,0, + 0,0,114,7,0,0,0,114,28,1,0,0,169,1,114,151, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,9,0, - 0,0,146,5,0,0,115,4,0,0,0,22,0,255,128,122, - 38,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,114,79,0,0,0,114,109,0,0, - 0,78,41,7,114,171,0,0,0,218,8,95,108,111,97,100, - 101,114,115,114,52,0,0,0,218,11,95,112,97,116,104,95, - 109,116,105,109,101,218,3,115,101,116,218,11,95,112,97,116, - 104,95,99,97,99,104,101,218,19,95,114,101,108,97,120,101, - 100,95,112,97,116,104,95,99,97,99,104,101,41,5,114,123, - 0,0,0,114,52,0,0,0,218,14,108,111,97,100,101,114, - 95,100,101,116,97,105,108,115,90,7,108,111,97,100,101,114, - 115,114,193,0,0,0,114,7,0,0,0,114,60,1,0,0, - 114,8,0,0,0,114,216,0,0,0,140,5,0,0,115,18, - 0,0,0,4,4,12,1,26,1,6,1,10,2,6,1,8, - 1,12,1,255,128,122,19,70,105,108,101,70,105,110,100,101, - 114,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, - 0,0,0,115,10,0,0,0,100,1,124,0,95,0,100,2, - 83,0,41,3,122,31,73,110,118,97,108,105,100,97,116,101, - 32,116,104,101,32,100,105,114,101,99,116,111,114,121,32,109, - 116,105,109,101,46,114,109,0,0,0,78,41,1,114,62,1, - 0,0,114,253,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,43,1,0,0,154,5,0,0,115, - 4,0,0,0,10,2,255,128,122,28,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,0,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, - 42,0,0,0,124,0,160,0,124,1,161,1,125,2,124,2, - 100,1,117,0,114,26,100,1,103,0,102,2,83,0,124,2, - 106,1,124,2,106,2,112,38,103,0,102,2,83,0,41,2, - 122,197,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,44, - 32,111,114,32,116,104,101,32,110,97,109,101,115,112,97,99, - 101,10,32,32,32,32,32,32,32,32,112,97,99,107,97,103, - 101,32,112,111,114,116,105,111,110,115,46,32,82,101,116,117, - 114,110,115,32,40,108,111,97,100,101,114,44,32,108,105,115, - 116,45,111,102,45,112,111,114,116,105,111,110,115,41,46,10, - 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,85,115,101,32,102,105,110,100,95,115,112, - 101,99,40,41,32,105,110,115,116,101,97,100,46,10,10,32, - 32,32,32,32,32,32,32,78,41,3,114,207,0,0,0,114, - 144,0,0,0,114,182,0,0,0,41,3,114,123,0,0,0, - 114,143,0,0,0,114,191,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,141,0,0,0,160,5, - 0,0,115,10,0,0,0,10,7,8,1,8,1,16,1,255, - 128,122,22,70,105,108,101,70,105,110,100,101,114,46,102,105, - 110,100,95,108,111,97,100,101,114,99,6,0,0,0,0,0, - 0,0,0,0,0,0,7,0,0,0,6,0,0,0,67,0, - 0,0,115,26,0,0,0,124,1,124,2,124,3,131,2,125, - 6,116,0,124,2,124,3,124,6,124,4,100,1,141,4,83, - 0,41,2,78,114,181,0,0,0,41,1,114,194,0,0,0, - 41,7,114,123,0,0,0,114,192,0,0,0,114,143,0,0, - 0,114,52,0,0,0,90,4,115,109,115,108,114,206,0,0, - 0,114,144,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,56,1,0,0,172,5,0,0,115,10, - 0,0,0,10,1,8,1,2,1,6,255,255,128,122,20,70, - 105,108,101,70,105,110,100,101,114,46,95,103,101,116,95,115, - 112,101,99,78,99,3,0,0,0,0,0,0,0,0,0,0, - 0,14,0,0,0,8,0,0,0,67,0,0,0,115,100,1, - 0,0,100,1,125,3,124,1,160,0,100,2,161,1,100,3, - 25,0,125,4,122,24,116,1,124,0,106,2,112,34,116,3, - 160,4,161,0,131,1,106,5,125,5,87,0,110,20,4,0, - 116,6,144,1,121,98,1,0,1,0,1,0,100,4,125,5, - 89,0,124,5,124,0,106,7,107,3,114,88,124,0,160,8, - 161,0,1,0,124,5,124,0,95,7,116,9,131,0,114,110, - 124,0,106,10,125,6,124,4,160,11,161,0,125,7,110,10, - 124,0,106,12,125,6,124,4,125,7,124,7,124,6,118,0, - 114,214,116,13,124,0,106,2,124,4,131,2,125,8,124,0, - 106,14,68,0,93,58,92,2,125,9,125,10,100,5,124,9, - 23,0,125,11,116,13,124,8,124,11,131,2,125,12,116,15, - 124,12,131,1,114,204,124,0,160,16,124,10,124,1,124,12, - 124,8,103,1,124,2,161,5,2,0,1,0,83,0,113,146, - 116,17,124,8,131,1,125,3,124,0,106,14,68,0,93,86, - 92,2,125,9,125,10,116,13,124,0,106,2,124,4,124,9, - 23,0,131,2,125,12,116,18,106,19,100,6,124,12,100,3, - 100,7,141,3,1,0,124,7,124,9,23,0,124,6,118,0, - 144,1,114,50,116,15,124,12,131,1,144,1,114,50,124,0, - 160,16,124,10,124,1,124,12,100,8,124,2,161,5,2,0, - 1,0,83,0,113,220,124,3,144,1,114,94,116,18,160,19, - 100,9,124,8,161,2,1,0,116,18,160,20,124,1,100,8, - 161,2,125,13,124,8,103,1,124,13,95,21,124,13,83,0, - 100,8,83,0,119,0,41,10,122,111,84,114,121,32,116,111, - 32,102,105,110,100,32,97,32,115,112,101,99,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,46,10,10,32,32,32,32,32,32,32,32, - 82,101,116,117,114,110,115,32,116,104,101,32,109,97,116,99, - 104,105,110,103,32,115,112,101,99,44,32,111,114,32,78,111, - 110,101,32,105,102,32,110,111,116,32,102,111,117,110,100,46, - 10,32,32,32,32,32,32,32,32,70,114,79,0,0,0,114, - 39,0,0,0,114,109,0,0,0,114,216,0,0,0,122,9, - 116,114,121,105,110,103,32,123,125,41,1,90,9,118,101,114, - 98,111,115,105,116,121,78,122,25,112,111,115,115,105,98,108, - 101,32,110,97,109,101,115,112,97,99,101,32,102,111,114,32, - 123,125,41,22,114,49,0,0,0,114,57,0,0,0,114,52, - 0,0,0,114,18,0,0,0,114,63,0,0,0,114,7,1, - 0,0,114,58,0,0,0,114,62,1,0,0,218,11,95,102, - 105,108,108,95,99,97,99,104,101,114,21,0,0,0,114,65, - 1,0,0,114,110,0,0,0,114,64,1,0,0,114,48,0, - 0,0,114,61,1,0,0,114,62,0,0,0,114,56,1,0, - 0,114,64,0,0,0,114,139,0,0,0,114,153,0,0,0, - 114,187,0,0,0,114,182,0,0,0,41,14,114,123,0,0, - 0,114,143,0,0,0,114,206,0,0,0,90,12,105,115,95, - 110,97,109,101,115,112,97,99,101,90,11,116,97,105,108,95, - 109,111,100,117,108,101,114,173,0,0,0,90,5,99,97,99, - 104,101,90,12,99,97,99,104,101,95,109,111,100,117,108,101, - 90,9,98,97,115,101,95,112,97,116,104,114,15,1,0,0, - 114,192,0,0,0,90,13,105,110,105,116,95,102,105,108,101, - 110,97,109,101,90,9,102,117,108,108,95,112,97,116,104,114, - 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,207,0,0,0,177,5,0,0,115,80,0,0, - 0,4,5,14,1,2,1,24,1,14,1,6,1,10,1,8, - 1,6,1,6,2,6,1,10,1,6,2,4,1,8,2,12, - 1,14,1,8,1,10,1,8,1,24,1,2,255,8,5,14, - 2,16,1,16,1,14,1,10,1,10,1,4,1,8,255,2, - 128,6,2,12,1,12,1,8,1,4,1,4,1,2,219,255, - 128,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105, - 110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0, - 0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0, - 115,190,0,0,0,124,0,106,0,125,1,122,22,116,1,160, - 2,124,1,112,22,116,1,160,3,161,0,161,1,125,2,87, - 0,110,24,4,0,116,4,116,5,116,6,102,3,121,188,1, - 0,1,0,1,0,103,0,125,2,89,0,116,7,106,8,160, - 9,100,1,161,1,115,78,116,10,124,2,131,1,124,0,95, - 11,110,74,116,10,131,0,125,3,124,2,68,0,93,56,125, - 4,124,4,160,12,100,2,161,1,92,3,125,5,125,6,125, - 7,124,6,114,130,100,3,160,13,124,5,124,7,160,14,161, - 0,161,2,125,8,110,4,124,5,125,8,124,3,160,15,124, - 8,161,1,1,0,113,88,124,3,124,0,95,11,116,7,106, - 8,160,9,116,16,161,1,114,184,100,4,100,5,132,0,124, - 2,68,0,131,1,124,0,95,17,100,6,83,0,100,6,83, - 0,119,0,41,7,122,68,70,105,108,108,32,116,104,101,32, - 99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,105, - 97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,112, - 97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,115, - 32,100,105,114,101,99,116,111,114,121,46,114,14,0,0,0, - 114,79,0,0,0,114,69,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,83, - 0,0,0,115,20,0,0,0,104,0,124,0,93,12,125,1, - 124,1,160,0,161,0,146,2,113,4,83,0,114,7,0,0, - 0,41,1,114,110,0,0,0,41,2,114,5,0,0,0,90, - 2,102,110,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,13,0,0,0,254,5,0,0,115,4,0,0,0, - 20,0,255,128,122,41,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,115,101,116,99,111,109,112,62,78, - 41,18,114,52,0,0,0,114,18,0,0,0,90,7,108,105, - 115,116,100,105,114,114,63,0,0,0,114,50,1,0,0,218, - 15,80,101,114,109,105,115,115,105,111,110,69,114,114,111,114, - 218,18,78,111,116,65,68,105,114,101,99,116,111,114,121,69, - 114,114,111,114,114,15,0,0,0,114,22,0,0,0,114,23, - 0,0,0,114,63,1,0,0,114,64,1,0,0,114,105,0, - 0,0,114,70,0,0,0,114,110,0,0,0,218,3,97,100, - 100,114,24,0,0,0,114,65,1,0,0,41,9,114,123,0, - 0,0,114,52,0,0,0,90,8,99,111,110,116,101,110,116, - 115,90,21,108,111,119,101,114,95,115,117,102,102,105,120,95, - 99,111,110,116,101,110,116,115,114,38,1,0,0,114,121,0, - 0,0,114,25,1,0,0,114,15,1,0,0,90,8,110,101, - 119,95,110,97,109,101,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,67,1,0,0,225,5,0,0,115,40, - 0,0,0,6,2,2,1,22,1,18,1,6,3,12,3,12, - 1,6,7,8,1,16,1,4,1,18,1,4,2,12,1,6, - 1,12,1,20,1,4,255,2,233,255,128,122,22,70,105,108, - 101,70,105,110,100,101,114,46,95,102,105,108,108,95,99,97, - 99,104,101,99,1,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,3,0,0,0,7,0,0,0,115,18,0,0, - 0,135,0,135,1,102,2,100,1,100,2,132,8,125,2,124, - 2,83,0,41,4,97,20,1,0,0,65,32,99,108,97,115, - 115,32,109,101,116,104,111,100,32,119,104,105,99,104,32,114, - 101,116,117,114,110,115,32,97,32,99,108,111,115,117,114,101, - 32,116,111,32,117,115,101,32,111,110,32,115,121,115,46,112, - 97,116,104,95,104,111,111,107,10,32,32,32,32,32,32,32, - 32,119,104,105,99,104,32,119,105,108,108,32,114,101,116,117, - 114,110,32,97,110,32,105,110,115,116,97,110,99,101,32,117, - 115,105,110,103,32,116,104,101,32,115,112,101,99,105,102,105, - 101,100,32,108,111,97,100,101,114,115,32,97,110,100,32,116, - 104,101,32,112,97,116,104,10,32,32,32,32,32,32,32,32, - 99,97,108,108,101,100,32,111,110,32,116,104,101,32,99,108, - 111,115,117,114,101,46,10,10,32,32,32,32,32,32,32,32, - 73,102,32,116,104,101,32,112,97,116,104,32,99,97,108,108, - 101,100,32,111,110,32,116,104,101,32,99,108,111,115,117,114, - 101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99, - 116,111,114,121,44,32,73,109,112,111,114,116,69,114,114,111, - 114,32,105,115,10,32,32,32,32,32,32,32,32,114,97,105, - 115,101,100,46,10,10,32,32,32,32,32,32,32,32,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, - 0,0,0,19,0,0,0,115,36,0,0,0,116,0,124,0, - 131,1,115,20,116,1,100,1,124,0,100,2,141,2,130,1, - 136,0,124,0,103,1,136,1,162,1,82,0,142,0,83,0, - 41,4,122,45,80,97,116,104,32,104,111,111,107,32,102,111, - 114,32,105,109,112,111,114,116,108,105,98,46,109,97,99,104, - 105,110,101,114,121,46,70,105,108,101,70,105,110,100,101,114, - 46,122,30,111,110,108,121,32,100,105,114,101,99,116,111,114, - 105,101,115,32,97,114,101,32,115,117,112,112,111,114,116,101, - 100,114,56,0,0,0,78,41,2,114,64,0,0,0,114,122, - 0,0,0,114,56,0,0,0,169,2,114,202,0,0,0,114, - 66,1,0,0,114,7,0,0,0,114,8,0,0,0,218,24, - 112,97,116,104,95,104,111,111,107,95,102,111,114,95,70,105, - 108,101,70,105,110,100,101,114,10,6,0,0,115,8,0,0, - 0,8,2,12,1,16,1,255,128,122,54,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,107,95,102,111,114,95,70,105,108,101,70,105,110,100,101, - 114,78,114,7,0,0,0,41,3,114,202,0,0,0,114,66, - 1,0,0,114,72,1,0,0,114,7,0,0,0,114,71,1, - 0,0,114,8,0,0,0,218,9,112,97,116,104,95,104,111, - 111,107,0,6,0,0,115,6,0,0,0,14,10,4,6,255, - 128,122,20,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, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,100,1,160,0,124,0,106,1,161,1,83, - 0,41,2,78,122,16,70,105,108,101,70,105,110,100,101,114, - 40,123,33,114,125,41,41,2,114,70,0,0,0,114,52,0, - 0,0,114,253,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,36,1,0,0,18,6,0,0,115, - 4,0,0,0,12,1,255,128,122,19,70,105,108,101,70,105, - 110,100,101,114,46,95,95,114,101,112,114,95,95,41,1,78, - 41,15,114,130,0,0,0,114,129,0,0,0,114,131,0,0, - 0,114,132,0,0,0,114,216,0,0,0,114,43,1,0,0, - 114,147,0,0,0,114,210,0,0,0,114,141,0,0,0,114, - 56,1,0,0,114,207,0,0,0,114,67,1,0,0,114,214, - 0,0,0,114,73,1,0,0,114,36,1,0,0,114,7,0, + 0,0,146,5,0,0,114,14,0,0,0,122,38,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,114,86,0,0,0,114,116,0,0,0,78,41,7, + 114,178,0,0,0,218,8,95,108,111,97,100,101,114,115,114, + 58,0,0,0,218,11,95,112,97,116,104,95,109,116,105,109, + 101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,97, + 99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,97, + 116,104,95,99,97,99,104,101,41,5,114,130,0,0,0,114, + 58,0,0,0,218,14,108,111,97,100,101,114,95,100,101,116, + 97,105,108,115,90,7,108,111,97,100,101,114,115,114,200,0, + 0,0,114,7,0,0,0,114,79,1,0,0,114,8,0,0, + 0,114,223,0,0,0,140,5,0,0,115,18,0,0,0,4, + 4,12,1,26,1,6,1,10,2,6,1,8,1,12,1,255, + 128,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, + 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, + 10,0,0,0,100,1,124,0,95,0,100,2,83,0,41,3, + 122,31,73,110,118,97,108,105,100,97,116,101,32,116,104,101, + 32,100,105,114,101,99,116,111,114,121,32,109,116,105,109,101, + 46,114,116,0,0,0,78,41,1,114,81,1,0,0,114,8, + 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,62,1,0,0,154,5,0,0,114,69,0,0,0, + 122,28,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,0,0,0,0,0,0,0,0,3,0,0,0,3, + 0,0,0,67,0,0,0,115,42,0,0,0,124,0,160,0, + 124,1,161,1,125,2,124,2,100,1,117,0,114,26,100,1, + 103,0,102,2,83,0,124,2,106,1,124,2,106,2,112,38, + 103,0,102,2,83,0,41,2,122,197,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,44,32,111,114,32,116,104,101,32, + 110,97,109,101,115,112,97,99,101,10,32,32,32,32,32,32, + 32,32,112,97,99,107,97,103,101,32,112,111,114,116,105,111, + 110,115,46,32,82,101,116,117,114,110,115,32,40,108,111,97, + 100,101,114,44,32,108,105,115,116,45,111,102,45,112,111,114, + 116,105,111,110,115,41,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, + 41,3,114,214,0,0,0,114,151,0,0,0,114,189,0,0, + 0,41,3,114,130,0,0,0,114,150,0,0,0,114,198,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,59,1,0,0,131,5,0,0,115,26,0,0,0,8, - 0,4,2,8,7,8,14,4,4,8,2,8,12,10,5,8, - 48,2,31,10,1,12,17,255,128,114,59,1,0,0,99,4, - 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,144,0,0,0,124,0,160,0, - 100,1,161,1,125,4,124,0,160,0,100,2,161,1,125,5, - 124,4,115,66,124,5,114,36,124,5,106,1,125,4,110,30, - 124,2,124,3,107,2,114,56,116,2,124,1,124,2,131,2, - 125,4,110,10,116,3,124,1,124,2,131,2,125,4,124,5, - 115,84,116,4,124,1,124,2,124,4,100,3,141,3,125,5, - 122,38,124,5,124,0,100,2,60,0,124,4,124,0,100,1, - 60,0,124,2,124,0,100,4,60,0,124,3,124,0,100,5, - 60,0,87,0,100,0,83,0,4,0,116,5,121,142,1,0, - 1,0,1,0,89,0,100,0,83,0,119,0,41,6,78,218, - 10,95,95,108,111,97,100,101,114,95,95,218,8,95,95,115, - 112,101,99,95,95,114,60,1,0,0,90,8,95,95,102,105, - 108,101,95,95,90,10,95,95,99,97,99,104,101,100,95,95, - 41,6,218,3,103,101,116,114,144,0,0,0,114,12,1,0, - 0,114,6,1,0,0,114,194,0,0,0,218,9,69,120,99, - 101,112,116,105,111,110,41,6,90,2,110,115,114,121,0,0, - 0,90,8,112,97,116,104,110,97,109,101,90,9,99,112,97, - 116,104,110,97,109,101,114,144,0,0,0,114,191,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 14,95,102,105,120,95,117,112,95,109,111,100,117,108,101,24, - 6,0,0,115,38,0,0,0,10,2,10,1,4,1,4,1, - 8,1,8,1,12,1,10,2,4,1,14,1,2,1,8,1, - 8,1,8,1,14,1,12,1,6,2,2,254,255,128,114,78, - 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, - 0,116,0,116,1,160,2,161,0,102,2,125,0,116,3,116, - 4,102,2,125,1,116,5,116,6,102,2,125,2,124,0,124, - 1,124,2,103,3,83,0,41,2,122,95,82,101,116,117,114, - 110,115,32,97,32,108,105,115,116,32,111,102,32,102,105,108, - 101,45,98,97,115,101,100,32,109,111,100,117,108,101,32,108, - 111,97,100,101,114,115,46,10,10,32,32,32,32,69,97,99, - 104,32,105,116,101,109,32,105,115,32,97,32,116,117,112,108, - 101,32,40,108,111,97,100,101,114,44,32,115,117,102,102,105, - 120,101,115,41,46,10,32,32,32,32,78,41,7,114,3,1, - 0,0,114,167,0,0,0,218,18,101,120,116,101,110,115,105, - 111,110,95,115,117,102,102,105,120,101,115,114,6,1,0,0, - 114,106,0,0,0,114,12,1,0,0,114,94,0,0,0,41, - 3,90,10,101,120,116,101,110,115,105,111,110,115,90,6,115, - 111,117,114,99,101,90,8,98,121,116,101,99,111,100,101,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,188, - 0,0,0,47,6,0,0,115,10,0,0,0,12,5,8,1, - 8,1,10,1,255,128,114,188,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0, - 67,0,0,0,115,8,0,0,0,124,0,97,0,100,0,83, - 0,114,114,0,0,0,41,1,114,139,0,0,0,41,1,218, - 17,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, - 108,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,21,95,115,101,116,95,98,111,111,116,115,116,114,97, - 112,95,109,111,100,117,108,101,58,6,0,0,115,4,0,0, - 0,8,2,255,128,114,81,1,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,50,0,0,0,116,0,124,0,131,1,1,0, - 116,1,131,0,125,1,116,2,106,3,160,4,116,5,106,6, - 124,1,142,0,103,1,161,1,1,0,116,2,106,7,160,8, - 116,9,161,1,1,0,100,1,83,0,41,2,122,41,73,110, - 115,116,97,108,108,32,116,104,101,32,112,97,116,104,45,98, - 97,115,101,100,32,105,109,112,111,114,116,32,99,111,109,112, - 111,110,101,110,116,115,46,78,41,10,114,81,1,0,0,114, - 188,0,0,0,114,15,0,0,0,114,48,1,0,0,114,171, - 0,0,0,114,59,1,0,0,114,73,1,0,0,218,9,109, - 101,116,97,95,112,97,116,104,114,190,0,0,0,114,42,1, - 0,0,41,2,114,80,1,0,0,90,17,115,117,112,112,111, - 114,116,101,100,95,108,111,97,100,101,114,115,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,8,95,105,110, - 115,116,97,108,108,63,6,0,0,115,10,0,0,0,8,2, - 6,1,20,1,16,1,255,128,114,83,1,0,0,41,1,114, - 68,0,0,0,41,1,78,41,3,78,78,78,41,2,114,0, - 0,0,0,114,0,0,0,0,41,1,84,41,1,78,41,1, - 78,41,83,114,132,0,0,0,114,139,0,0,0,114,167,0, - 0,0,114,72,0,0,0,114,15,0,0,0,114,81,0,0, - 0,114,164,0,0,0,114,22,0,0,0,114,211,0,0,0, - 90,2,110,116,114,18,0,0,0,114,196,0,0,0,90,5, - 112,111,115,105,120,114,42,0,0,0,218,3,97,108,108,114, - 45,0,0,0,114,46,0,0,0,114,66,0,0,0,114,25, - 0,0,0,90,37,95,67,65,83,69,95,73,78,83,69,78, - 83,73,84,73,86,69,95,80,76,65,84,70,79,82,77,83, - 95,66,89,84,69,83,95,75,69,89,114,24,0,0,0,114, - 26,0,0,0,114,21,0,0,0,114,33,0,0,0,114,38, - 0,0,0,114,40,0,0,0,114,48,0,0,0,114,55,0, - 0,0,114,57,0,0,0,114,61,0,0,0,114,62,0,0, - 0,114,64,0,0,0,114,67,0,0,0,114,77,0,0,0, - 218,4,116,121,112,101,218,8,95,95,99,111,100,101,95,95, - 114,166,0,0,0,114,31,0,0,0,114,152,0,0,0,114, - 30,0,0,0,114,35,0,0,0,114,243,0,0,0,114,97, - 0,0,0,114,93,0,0,0,114,106,0,0,0,114,190,0, - 0,0,114,79,1,0,0,114,212,0,0,0,114,94,0,0, - 0,90,23,68,69,66,85,71,95,66,89,84,69,67,79,68, - 69,95,83,85,70,70,73,88,69,83,90,27,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,114,102,0,0,0,114,107,0,0, - 0,114,113,0,0,0,114,117,0,0,0,114,119,0,0,0, - 114,140,0,0,0,114,147,0,0,0,114,156,0,0,0,114, - 160,0,0,0,114,162,0,0,0,114,169,0,0,0,114,174, - 0,0,0,114,175,0,0,0,114,180,0,0,0,218,6,111, - 98,106,101,99,116,114,189,0,0,0,114,194,0,0,0,114, - 195,0,0,0,114,215,0,0,0,114,228,0,0,0,114,246, - 0,0,0,114,6,1,0,0,114,12,1,0,0,114,3,1, - 0,0,114,18,1,0,0,114,40,1,0,0,114,42,1,0, - 0,114,59,1,0,0,114,78,1,0,0,114,188,0,0,0, - 114,81,1,0,0,114,83,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,8, - 60,109,111,100,117,108,101,62,1,0,0,0,115,172,0,0, - 0,4,0,4,22,8,3,8,1,8,1,8,1,8,1,10, - 3,4,1,8,1,10,1,8,2,4,3,10,1,6,2,22, - 2,8,1,10,1,14,1,4,4,4,1,2,1,2,1,4, - 255,8,4,6,16,8,3,8,5,8,5,8,6,8,6,8, - 12,8,10,8,9,8,5,8,7,10,9,10,22,0,127,16, - 24,12,1,4,2,4,1,6,2,6,1,10,1,8,2,6, - 2,8,2,16,2,8,71,8,40,8,19,8,12,8,12,8, - 31,8,17,8,33,8,28,10,24,10,13,10,10,8,11,6, - 14,4,3,2,1,12,255,14,68,14,64,16,30,0,127,14, - 17,18,50,18,45,18,25,14,53,14,63,14,43,0,127,14, - 20,0,127,10,22,8,23,8,11,12,5,255,128, + 0,114,148,0,0,0,160,5,0,0,115,10,0,0,0,10, + 7,8,1,8,1,16,1,255,128,122,22,70,105,108,101,70, + 105,110,100,101,114,46,102,105,110,100,95,108,111,97,100,101, + 114,99,6,0,0,0,0,0,0,0,0,0,0,0,7,0, + 0,0,6,0,0,0,67,0,0,0,115,26,0,0,0,124, + 1,124,2,124,3,131,2,125,6,116,0,124,2,124,3,124, + 6,124,4,100,1,141,4,83,0,41,2,78,114,188,0,0, + 0,41,1,114,201,0,0,0,41,7,114,130,0,0,0,114, + 199,0,0,0,114,150,0,0,0,114,58,0,0,0,90,4, + 115,109,115,108,114,213,0,0,0,114,151,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,75,1, + 0,0,172,5,0,0,115,10,0,0,0,10,1,8,1,2, + 1,6,255,255,128,122,20,70,105,108,101,70,105,110,100,101, + 114,46,95,103,101,116,95,115,112,101,99,78,99,3,0,0, + 0,0,0,0,0,0,0,0,0,14,0,0,0,8,0,0, + 0,67,0,0,0,115,100,1,0,0,100,1,125,3,124,1, + 160,0,100,2,161,1,100,3,25,0,125,4,122,24,116,1, + 124,0,106,2,112,34,116,3,160,4,161,0,131,1,106,5, + 125,5,87,0,110,20,4,0,116,6,144,1,121,98,1,0, + 1,0,1,0,100,4,125,5,89,0,124,5,124,0,106,7, + 107,3,114,88,124,0,160,8,161,0,1,0,124,5,124,0, + 95,7,116,9,131,0,114,110,124,0,106,10,125,6,124,4, + 160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,4, + 125,7,124,7,124,6,118,0,114,214,116,13,124,0,106,2, + 124,4,131,2,125,8,124,0,106,14,68,0,93,58,92,2, + 125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,8, + 124,11,131,2,125,12,116,15,124,12,131,1,114,204,124,0, + 160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,5, + 2,0,1,0,83,0,113,146,116,17,124,8,131,1,125,3, + 124,0,106,14,68,0,93,86,92,2,125,9,125,10,116,13, + 124,0,106,2,124,4,124,9,23,0,131,2,125,12,116,18, + 106,19,100,6,124,12,100,3,100,7,141,3,1,0,124,7, + 124,9,23,0,124,6,118,0,144,1,114,50,116,15,124,12, + 131,1,144,1,114,50,124,0,160,16,124,10,124,1,124,12, + 100,8,124,2,161,5,2,0,1,0,83,0,113,220,124,3, + 144,1,114,94,116,18,160,19,100,9,124,8,161,2,1,0, + 116,18,160,20,124,1,100,8,161,2,125,13,124,8,103,1, + 124,13,95,21,124,13,83,0,100,8,83,0,119,0,41,10, + 122,111,84,114,121,32,116,111,32,102,105,110,100,32,97,32, + 115,112,101,99,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,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,115,32, + 116,104,101,32,109,97,116,99,104,105,110,103,32,115,112,101, + 99,44,32,111,114,32,78,111,110,101,32,105,102,32,110,111, + 116,32,102,111,117,110,100,46,10,32,32,32,32,32,32,32, + 32,70,114,86,0,0,0,114,45,0,0,0,114,116,0,0, + 0,114,223,0,0,0,122,9,116,114,121,105,110,103,32,123, + 125,41,1,90,9,118,101,114,98,111,115,105,116,121,78,122, + 25,112,111,115,115,105,98,108,101,32,110,97,109,101,115,112, + 97,99,101,32,102,111,114,32,123,125,41,22,114,55,0,0, + 0,114,63,0,0,0,114,58,0,0,0,114,19,0,0,0, + 114,70,0,0,0,114,21,1,0,0,114,64,0,0,0,114, + 81,1,0,0,218,11,95,102,105,108,108,95,99,97,99,104, + 101,114,22,0,0,0,114,84,1,0,0,114,117,0,0,0, + 114,83,1,0,0,114,54,0,0,0,114,80,1,0,0,114, + 68,0,0,0,114,75,1,0,0,114,71,0,0,0,114,146, + 0,0,0,114,160,0,0,0,114,194,0,0,0,114,189,0, + 0,0,41,14,114,130,0,0,0,114,150,0,0,0,114,213, + 0,0,0,90,12,105,115,95,110,97,109,101,115,112,97,99, + 101,90,11,116,97,105,108,95,109,111,100,117,108,101,114,180, + 0,0,0,90,5,99,97,99,104,101,90,12,99,97,99,104, + 101,95,109,111,100,117,108,101,90,9,98,97,115,101,95,112, + 97,116,104,114,29,1,0,0,114,199,0,0,0,90,13,105, + 110,105,116,95,102,105,108,101,110,97,109,101,90,9,102,117, + 108,108,95,112,97,116,104,114,198,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,214,0,0,0, + 177,5,0,0,115,80,0,0,0,4,5,14,1,2,1,24, + 1,14,1,6,1,10,1,8,1,6,1,6,2,6,1,10, + 1,6,2,4,1,8,2,12,1,14,1,8,1,10,1,8, + 1,24,1,2,255,8,5,14,2,16,1,16,1,14,1,10, + 1,10,1,4,1,8,255,2,128,6,2,12,1,12,1,8, + 1,4,1,4,1,2,219,255,128,122,20,70,105,108,101,70, + 105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,99, + 1,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, + 10,0,0,0,67,0,0,0,115,190,0,0,0,124,0,106, + 0,125,1,122,22,116,1,160,2,124,1,112,22,116,1,160, + 3,161,0,161,1,125,2,87,0,110,24,4,0,116,4,116, + 5,116,6,102,3,121,188,1,0,1,0,1,0,103,0,125, + 2,89,0,116,7,106,8,160,9,100,1,161,1,115,78,116, + 10,124,2,131,1,124,0,95,11,110,74,116,10,131,0,125, + 3,124,2,68,0,93,56,125,4,124,4,160,12,100,2,161, + 1,92,3,125,5,125,6,125,7,124,6,114,130,100,3,160, + 13,124,5,124,7,160,14,161,0,161,2,125,8,110,4,124, + 5,125,8,124,3,160,15,124,8,161,1,1,0,113,88,124, + 3,124,0,95,11,116,7,106,8,160,9,116,16,161,1,114, + 184,100,4,100,5,132,0,124,2,68,0,131,1,124,0,95, + 17,100,6,83,0,100,6,83,0,119,0,41,7,122,68,70, + 105,108,108,32,116,104,101,32,99,97,99,104,101,32,111,102, + 32,112,111,116,101,110,116,105,97,108,32,109,111,100,117,108, + 101,115,32,97,110,100,32,112,97,99,107,97,103,101,115,32, + 102,111,114,32,116,104,105,115,32,100,105,114,101,99,116,111, + 114,121,46,114,15,0,0,0,114,86,0,0,0,114,76,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,4,0,0,0,83,0,0,0,115,20,0,0,0, + 104,0,124,0,93,12,125,1,124,1,160,0,161,0,146,2, + 113,4,83,0,114,7,0,0,0,41,1,114,117,0,0,0, + 41,2,114,5,0,0,0,90,2,102,110,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,13,0,0,0,254, + 5,0,0,115,4,0,0,0,20,0,255,128,122,41,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,115, + 101,116,99,111,109,112,62,78,41,18,114,58,0,0,0,114, + 19,0,0,0,90,7,108,105,115,116,100,105,114,114,70,0, + 0,0,114,69,1,0,0,218,15,80,101,114,109,105,115,115, + 105,111,110,69,114,114,111,114,218,18,78,111,116,65,68,105, + 114,101,99,116,111,114,121,69,114,114,111,114,114,16,0,0, + 0,114,26,0,0,0,114,27,0,0,0,114,82,1,0,0, + 114,83,1,0,0,114,112,0,0,0,114,77,0,0,0,114, + 117,0,0,0,218,3,97,100,100,114,28,0,0,0,114,84, + 1,0,0,41,9,114,130,0,0,0,114,58,0,0,0,90, + 8,99,111,110,116,101,110,116,115,90,21,108,111,119,101,114, + 95,115,117,102,102,105,120,95,99,111,110,116,101,110,116,115, + 114,55,1,0,0,114,128,0,0,0,114,39,1,0,0,114, + 29,1,0,0,90,8,110,101,119,95,110,97,109,101,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,86,1, + 0,0,225,5,0,0,115,40,0,0,0,6,2,2,1,22, + 1,18,1,6,3,12,3,12,1,6,7,8,1,16,1,4, + 1,18,1,4,2,12,1,6,1,12,1,20,1,4,255,2, + 233,255,128,122,22,70,105,108,101,70,105,110,100,101,114,46, + 95,102,105,108,108,95,99,97,99,104,101,99,1,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 7,0,0,0,115,18,0,0,0,135,0,135,1,102,2,100, + 1,100,2,132,8,125,2,124,2,83,0,41,4,97,20,1, + 0,0,65,32,99,108,97,115,115,32,109,101,116,104,111,100, + 32,119,104,105,99,104,32,114,101,116,117,114,110,115,32,97, + 32,99,108,111,115,117,114,101,32,116,111,32,117,115,101,32, + 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107, + 10,32,32,32,32,32,32,32,32,119,104,105,99,104,32,119, + 105,108,108,32,114,101,116,117,114,110,32,97,110,32,105,110, + 115,116,97,110,99,101,32,117,115,105,110,103,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,32,108,111,97,100,101, + 114,115,32,97,110,100,32,116,104,101,32,112,97,116,104,10, + 32,32,32,32,32,32,32,32,99,97,108,108,101,100,32,111, + 110,32,116,104,101,32,99,108,111,115,117,114,101,46,10,10, + 32,32,32,32,32,32,32,32,73,102,32,116,104,101,32,112, + 97,116,104,32,99,97,108,108,101,100,32,111,110,32,116,104, + 101,32,99,108,111,115,117,114,101,32,105,115,32,110,111,116, + 32,97,32,100,105,114,101,99,116,111,114,121,44,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,115,10,32,32,32, + 32,32,32,32,32,114,97,105,115,101,100,46,10,10,32,32, + 32,32,32,32,32,32,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,4,0,0,0,19,0,0,0,115, + 36,0,0,0,116,0,124,0,131,1,115,20,116,1,100,1, + 124,0,100,2,141,2,130,1,136,0,124,0,103,1,136,1, + 162,1,82,0,142,0,83,0,41,4,122,45,80,97,116,104, + 32,104,111,111,107,32,102,111,114,32,105,109,112,111,114,116, + 108,105,98,46,109,97,99,104,105,110,101,114,121,46,70,105, + 108,101,70,105,110,100,101,114,46,122,30,111,110,108,121,32, + 100,105,114,101,99,116,111,114,105,101,115,32,97,114,101,32, + 115,117,112,112,111,114,116,101,100,114,62,0,0,0,78,41, + 2,114,71,0,0,0,114,129,0,0,0,114,62,0,0,0, + 169,2,114,209,0,0,0,114,85,1,0,0,114,7,0,0, + 0,114,8,0,0,0,218,24,112,97,116,104,95,104,111,111, + 107,95,102,111,114,95,70,105,108,101,70,105,110,100,101,114, + 10,6,0,0,115,8,0,0,0,8,2,12,1,16,1,255, + 128,122,54,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,107,95,102,111,114,95,70, + 105,108,101,70,105,110,100,101,114,78,114,7,0,0,0,41, + 3,114,209,0,0,0,114,85,1,0,0,114,91,1,0,0, + 114,7,0,0,0,114,90,1,0,0,114,8,0,0,0,218, + 9,112,97,116,104,95,104,111,111,107,0,6,0,0,115,6, + 0,0,0,14,10,4,6,255,128,122,20,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,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,114,52,1,0,0,41,2,78, + 122,16,70,105,108,101,70,105,110,100,101,114,40,123,33,114, + 125,41,41,2,114,77,0,0,0,114,58,0,0,0,114,8, + 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,53,1,0,0,18,6,0,0,114,46,1,0,0, + 122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,114, + 101,112,114,95,95,41,1,78,41,15,114,137,0,0,0,114, + 136,0,0,0,114,138,0,0,0,114,139,0,0,0,114,223, + 0,0,0,114,62,1,0,0,114,154,0,0,0,114,217,0, + 0,0,114,148,0,0,0,114,75,1,0,0,114,214,0,0, + 0,114,86,1,0,0,114,221,0,0,0,114,92,1,0,0, + 114,53,1,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,78,1,0,0,131,5, + 0,0,115,26,0,0,0,8,0,4,2,8,7,8,14,4, + 4,8,2,8,12,10,5,8,48,2,31,10,1,12,17,255, + 128,114,78,1,0,0,99,4,0,0,0,0,0,0,0,0, + 0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,115, + 144,0,0,0,124,0,160,0,100,1,161,1,125,4,124,0, + 160,0,100,2,161,1,125,5,124,4,115,66,124,5,114,36, + 124,5,106,1,125,4,110,30,124,2,124,3,107,2,114,56, + 116,2,124,1,124,2,131,2,125,4,110,10,116,3,124,1, + 124,2,131,2,125,4,124,5,115,84,116,4,124,1,124,2, + 124,4,100,3,141,3,125,5,122,38,124,5,124,0,100,2, + 60,0,124,4,124,0,100,1,60,0,124,2,124,0,100,4, + 60,0,124,3,124,0,100,5,60,0,87,0,100,0,83,0, + 4,0,116,5,121,142,1,0,1,0,1,0,89,0,100,0, + 83,0,119,0,41,6,78,218,10,95,95,108,111,97,100,101, + 114,95,95,218,8,95,95,115,112,101,99,95,95,114,79,1, + 0,0,90,8,95,95,102,105,108,101,95,95,90,10,95,95, + 99,97,99,104,101,100,95,95,41,6,218,3,103,101,116,114, + 151,0,0,0,114,26,1,0,0,114,20,1,0,0,114,201, + 0,0,0,218,9,69,120,99,101,112,116,105,111,110,41,6, + 90,2,110,115,114,128,0,0,0,90,8,112,97,116,104,110, + 97,109,101,90,9,99,112,97,116,104,110,97,109,101,114,151, + 0,0,0,114,198,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,14,95,102,105,120,95,117,112, + 95,109,111,100,117,108,101,24,6,0,0,115,38,0,0,0, + 10,2,10,1,4,1,4,1,8,1,8,1,12,1,10,2, + 4,1,14,1,2,1,8,1,8,1,8,1,14,1,12,1, + 6,2,2,254,255,128,114,97,1,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,38,0,0,0,116,0,116,1,160,2,161, + 0,102,2,125,0,116,3,116,4,102,2,125,1,116,5,116, + 6,102,2,125,2,124,0,124,1,124,2,103,3,83,0,41, + 2,122,95,82,101,116,117,114,110,115,32,97,32,108,105,115, + 116,32,111,102,32,102,105,108,101,45,98,97,115,101,100,32, + 109,111,100,117,108,101,32,108,111,97,100,101,114,115,46,10, + 10,32,32,32,32,69,97,99,104,32,105,116,101,109,32,105, + 115,32,97,32,116,117,112,108,101,32,40,108,111,97,100,101, + 114,44,32,115,117,102,102,105,120,101,115,41,46,10,32,32, + 32,32,78,41,7,114,17,1,0,0,114,174,0,0,0,218, + 18,101,120,116,101,110,115,105,111,110,95,115,117,102,102,105, + 120,101,115,114,20,1,0,0,114,113,0,0,0,114,26,1, + 0,0,114,101,0,0,0,41,3,90,10,101,120,116,101,110, + 115,105,111,110,115,90,6,115,111,117,114,99,101,90,8,98, + 121,116,101,99,111,100,101,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,195,0,0,0,47,6,0,0,115, + 10,0,0,0,12,5,8,1,8,1,10,1,255,128,114,195, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,1,0,0,0,67,0,0,0,115,8,0,0, + 0,124,0,97,0,100,0,83,0,114,121,0,0,0,41,1, + 114,146,0,0,0,41,1,218,17,95,98,111,111,116,115,116, + 114,97,112,95,109,111,100,117,108,101,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,21,95,115,101,116,95, + 98,111,111,116,115,116,114,97,112,95,109,111,100,117,108,101, + 58,6,0,0,115,4,0,0,0,8,2,255,128,114,100,1, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,0, + 116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,2, + 106,3,160,4,116,5,106,6,124,1,142,0,103,1,161,1, + 1,0,116,2,106,7,160,8,116,9,161,1,1,0,100,1, + 83,0,41,2,122,41,73,110,115,116,97,108,108,32,116,104, + 101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112, + 111,114,116,32,99,111,109,112,111,110,101,110,116,115,46,78, + 41,10,114,100,1,0,0,114,195,0,0,0,114,16,0,0, + 0,114,67,1,0,0,114,178,0,0,0,114,78,1,0,0, + 114,92,1,0,0,218,9,109,101,116,97,95,112,97,116,104, + 114,197,0,0,0,114,61,1,0,0,41,2,114,99,1,0, + 0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,97, + 100,101,114,115,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,8,95,105,110,115,116,97,108,108,63,6,0, + 0,115,10,0,0,0,8,2,6,1,20,1,16,1,255,128, + 114,102,1,0,0,41,1,114,75,0,0,0,41,1,78,41, + 3,78,78,78,41,2,114,0,0,0,0,114,0,0,0,0, + 41,1,84,41,1,78,41,1,78,41,83,114,139,0,0,0, + 114,146,0,0,0,114,174,0,0,0,114,79,0,0,0,114, + 16,0,0,0,114,88,0,0,0,114,171,0,0,0,114,26, + 0,0,0,114,218,0,0,0,90,2,110,116,114,19,0,0, + 0,114,203,0,0,0,90,5,112,111,115,105,120,114,48,0, + 0,0,218,3,97,108,108,114,51,0,0,0,114,52,0,0, + 0,114,73,0,0,0,114,29,0,0,0,90,37,95,67,65, + 83,69,95,73,78,83,69,78,83,73,84,73,86,69,95,80, + 76,65,84,70,79,82,77,83,95,66,89,84,69,83,95,75, + 69,89,114,28,0,0,0,114,30,0,0,0,114,22,0,0, + 0,114,37,0,0,0,114,43,0,0,0,114,46,0,0,0, + 114,54,0,0,0,114,61,0,0,0,114,63,0,0,0,114, + 67,0,0,0,114,68,0,0,0,114,71,0,0,0,114,74, + 0,0,0,114,84,0,0,0,218,4,116,121,112,101,218,8, + 95,95,99,111,100,101,95,95,114,173,0,0,0,114,35,0, + 0,0,114,159,0,0,0,114,34,0,0,0,114,40,0,0, + 0,114,251,0,0,0,114,104,0,0,0,114,100,0,0,0, + 114,113,0,0,0,114,197,0,0,0,114,98,1,0,0,114, + 219,0,0,0,114,101,0,0,0,90,23,68,69,66,85,71, + 95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88, + 69,83,90,27,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,114, + 109,0,0,0,114,114,0,0,0,114,120,0,0,0,114,124, + 0,0,0,114,126,0,0,0,114,147,0,0,0,114,154,0, + 0,0,114,163,0,0,0,114,167,0,0,0,114,169,0,0, + 0,114,176,0,0,0,114,181,0,0,0,114,182,0,0,0, + 114,187,0,0,0,218,6,111,98,106,101,99,116,114,196,0, + 0,0,114,201,0,0,0,114,202,0,0,0,114,222,0,0, + 0,114,236,0,0,0,114,254,0,0,0,114,20,1,0,0, + 114,26,1,0,0,114,17,1,0,0,114,32,1,0,0,114, + 58,1,0,0,114,61,1,0,0,114,78,1,0,0,114,97, + 1,0,0,114,195,0,0,0,114,100,1,0,0,114,102,1, + 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,8,60,109,111,100,117,108,101,62, + 1,0,0,0,115,172,0,0,0,4,0,4,22,8,3,8, + 1,8,1,8,1,8,1,10,3,4,1,8,1,10,1,8, + 2,4,3,10,1,6,2,22,2,8,1,10,1,14,1,4, + 4,4,1,2,1,2,1,4,255,8,4,6,16,8,3,8, + 5,8,5,8,6,8,6,8,12,8,10,8,9,8,5,8, + 7,10,9,10,22,0,127,16,24,12,1,4,2,4,1,6, + 2,6,1,10,1,8,2,6,2,8,2,16,2,8,71,8, + 40,8,19,8,12,8,12,8,31,8,17,8,33,8,28,10, + 24,10,13,10,10,8,11,6,14,4,3,2,1,12,255,14, + 68,14,64,16,30,0,127,14,17,18,50,18,45,18,25,14, + 53,14,63,14,43,0,127,14,20,0,127,10,22,8,23,8, + 11,12,5,255,128, }; From 9a792f790a2390f15b111ee3be23920168fe76ee Mon Sep 17 00:00:00 2001 From: Tom Forbes Date: Wed, 10 Feb 2021 17:56:16 +0000 Subject: [PATCH 1141/1261] Fix link to sqlite3 enable_shared_cache documentation (GH-24496) --- Doc/whatsnew/3.10.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 96892ba3d37e10..ed2fd0eb0dda66 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -644,7 +644,7 @@ Deprecated * The undocumented built-in function ``sqlite3.enable_shared_cache`` is now deprecated, scheduled for removal in Python 3.12. Its use is strongly discouraged by the SQLite3 documentation. See `the SQLite3 docs - `_ for more details. + `_ for more details. If shared cache must be used, open the database in URI mode using the ``cache=shared`` query parameter. (Contributed by Erlend E. Aasland in :issue:`24464`.) From 1bb62811169b78416a81c11f10ee4a6b7f5a3f9b Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Thu, 11 Feb 2021 00:04:02 +0100 Subject: [PATCH 1142/1261] bpo-40956: Fix segfault when Connection.backup is called without target (GH-24503) --- Lib/sqlite3/test/backup.py | 4 ++- .../2021-02-10-23-29-50.bpo-40956.LcAbwG.rst | 3 ++ Modules/_sqlite/clinic/connection.c.h | 29 +++++++------------ Modules/_sqlite/connection.c | 4 +-- 4 files changed, 18 insertions(+), 22 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-02-10-23-29-50.bpo-40956.LcAbwG.rst diff --git a/Lib/sqlite3/test/backup.py b/Lib/sqlite3/test/backup.py index ddff78c7607b27..cbe24df2e9c96c 100644 --- a/Lib/sqlite3/test/backup.py +++ b/Lib/sqlite3/test/backup.py @@ -17,9 +17,11 @@ def verify_backup(self, bckcx): self.assertEqual(result[0][0], 3) self.assertEqual(result[1][0], 4) - def test_bad_target_none(self): + def test_bad_target(self): with self.assertRaises(TypeError): self.cx.backup(None) + with self.assertRaises(TypeError): + self.cx.backup() def test_bad_target_filename(self): with self.assertRaises(TypeError): diff --git a/Misc/NEWS.d/next/Library/2021-02-10-23-29-50.bpo-40956.LcAbwG.rst b/Misc/NEWS.d/next/Library/2021-02-10-23-29-50.bpo-40956.LcAbwG.rst new file mode 100644 index 00000000000000..e81922c0315671 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-10-23-29-50.bpo-40956.LcAbwG.rst @@ -0,0 +1,3 @@ +Fix segfault in :meth:`sqlite3.Connection.backup` if no argument was +provided. The regression was introduced by GH-23838. Patch by +Erlend E. Aasland. diff --git a/Modules/_sqlite/clinic/connection.c.h b/Modules/_sqlite/clinic/connection.c.h index 01b8e37a957fc2..f231ecc2ae78be 100644 --- a/Modules/_sqlite/clinic/connection.c.h +++ b/Modules/_sqlite/clinic/connection.c.h @@ -519,8 +519,8 @@ pysqlite_connection_iterdump(pysqlite_Connection *self, PyObject *Py_UNUSED(igno } PyDoc_STRVAR(pysqlite_connection_backup__doc__, -"backup($self, /, target=, *, pages=-1, progress=None,\n" -" name=\'main\', sleep=0.25)\n" +"backup($self, /, target, *, pages=-1, progress=None, name=\'main\',\n" +" sleep=0.25)\n" "--\n" "\n" "Makes a backup of the database. Non-standard."); @@ -541,31 +541,22 @@ pysqlite_connection_backup(pysqlite_Connection *self, PyObject *const *args, Py_ static const char * const _keywords[] = {"target", "pages", "progress", "name", "sleep", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "backup", 0}; PyObject *argsbuf[5]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; - pysqlite_Connection *target = NULL; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + pysqlite_Connection *target; int pages = -1; PyObject *progress = Py_None; const char *name = "main"; double sleep = 0.25; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); if (!args) { goto exit; } - if (!noptargs) { - goto skip_optional_pos; - } - if (args[0]) { - if (!PyObject_TypeCheck(args[0], pysqlite_ConnectionType)) { - _PyArg_BadArgument("backup", "argument 'target'", (pysqlite_ConnectionType)->tp_name, args[0]); - goto exit; - } - target = (pysqlite_Connection *)args[0]; - if (!--noptargs) { - goto skip_optional_pos; - } + if (!PyObject_TypeCheck(args[0], pysqlite_ConnectionType)) { + _PyArg_BadArgument("backup", "argument 'target'", (pysqlite_ConnectionType)->tp_name, args[0]); + goto exit; } -skip_optional_pos: + target = (pysqlite_Connection *)args[0]; if (!noptargs) { goto skip_optional_kwonly; } @@ -719,4 +710,4 @@ pysqlite_connection_exit(pysqlite_Connection *self, PyObject *const *args, Py_ss #ifndef PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF #define PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF #endif /* !defined(PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF) */ -/*[clinic end generated code: output=7cb13d491a5970aa input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c1bf09db3bcd0105 input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 370dc1a30e46a1..63fcb0055de2c9 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -1582,7 +1582,7 @@ pysqlite_connection_iterdump_impl(pysqlite_Connection *self) /*[clinic input] _sqlite3.Connection.backup as pysqlite_connection_backup - target: object(type='pysqlite_Connection *', subclass_of='pysqlite_ConnectionType') = NULL + target: object(type='pysqlite_Connection *', subclass_of='pysqlite_ConnectionType') * pages: int = -1 progress: object = None @@ -1597,7 +1597,7 @@ pysqlite_connection_backup_impl(pysqlite_Connection *self, pysqlite_Connection *target, int pages, PyObject *progress, const char *name, double sleep) -/*[clinic end generated code: output=306a3e6a38c36334 input=2f3497ea530144b1]*/ +/*[clinic end generated code: output=306a3e6a38c36334 input=30ae45fc420bfd3b]*/ { int rc; int callback_error = 0; From 5ca5efe0d5f86fa6b541f6a6f64973888bf60905 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Fri, 12 Feb 2021 09:06:47 +0900 Subject: [PATCH 1143/1261] bpo-43174: Windows: Use /utf-8 compiler option. (GH-24498) --- Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst | 1 + PCbuild/pyproject.props | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst diff --git a/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst b/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst new file mode 100644 index 00000000000000..64c80188d02f62 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst @@ -0,0 +1 @@ +Windows build now uses ``/utf-8`` compiler option. diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index d7762ca1bc685f..98e5ab030321db 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -46,6 +46,7 @@ true OnlyExplicitInline OnlyExplicitInline + /utf-8 %(AdditionalOptions) Disabled From 7be81b18d80371ee64ada98c403d54acf99296a0 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Thu, 11 Feb 2021 19:31:10 -0500 Subject: [PATCH 1144/1261] bpo-43202: Immediately return code object in codeop._maybe_compile (GH-24508) The return used to be after code that was ignored when there was a code object. --- Lib/codeop.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Lib/codeop.py b/Lib/codeop.py index 7a08610239c357..b3af93f1e18f59 100644 --- a/Lib/codeop.py +++ b/Lib/codeop.py @@ -77,10 +77,10 @@ def _maybe_compile(compiler, source, filename, symbol): source = "pass" # Replace it with a 'pass' statement err = err1 = err2 = None - code = code1 = code2 = None + code1 = code2 = None try: - code = compiler(source, filename, symbol) + return compiler(source, filename, symbol) except SyntaxError: pass @@ -100,8 +100,6 @@ def _maybe_compile(compiler, source, filename, symbol): err2 = e try: - if code: - return code if not code1 and _is_syntax_error(err1, err2): raise err1 finally: From 95e1c52e7bebfe0fbaf3e60a848384f34fec11fe Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Fri, 12 Feb 2021 11:34:11 +0100 Subject: [PATCH 1145/1261] bpo-43204: Fix LibTomCrypt URL in md5module.c and sha*module.c comments (GH-24507) Automerge-Triggered-By: GH:tiran --- Modules/md5module.c | 2 +- Modules/sha1module.c | 2 +- Modules/sha256module.c | 2 +- Modules/sha512module.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index 1c401e884389f3..b2e65a0a5ffd22 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -74,7 +74,7 @@ typedef struct { * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + * Tom St Denis, tomstdenis@gmail.com, https://www.libtom.net */ /* rotate the hard way (platform optimizations could be done) */ diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 5209857041d908..7126db93b1a3fc 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -74,7 +74,7 @@ typedef struct { * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + * Tom St Denis, tomstdenis@gmail.com, https://www.libtom.net */ /* rotate the hard way (platform optimizations could be done) */ diff --git a/Modules/sha256module.c b/Modules/sha256module.c index 6b8bd8f1d27fb1..b90e5df7826740 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -106,7 +106,7 @@ static void SHAcopy(SHAobject *src, SHAobject *dest) * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@iahu.ca, http://libtom.org + * Tom St Denis, tomstdenis@iahu.ca, https://www.libtom.net */ diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 3fd9fa4c8d16f8..062343e71ff144 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -94,7 +94,7 @@ static void SHAcopy(SHAobject *src, SHAobject *dest) * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@iahu.ca, http://libtom.org + * Tom St Denis, tomstdenis@iahu.ca, https://www.libtom.net */ From dce878f39ba8f2f05c0ef97e3b6bd1ed68e45e94 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Fri, 12 Feb 2021 12:04:46 -0800 Subject: [PATCH 1146/1261] bpo-43172: readline now passes its tests when built against libedit (GH-24499) bpo-43172: readline now passes its tests when built against libedit. Existing irreconcilable API differences remain in readline.get_begidx and readline.get_endidx behavior based on libreadline vs libedit use. A note about that has been documented. --- Doc/library/readline.rst | 4 +- Lib/test/test_readline.py | 21 +++++++++- .../2021-02-10-06-00-53.bpo-43172.ZMCJni.rst | 4 ++ Modules/clinic/readline.c.h | 10 +++-- Modules/readline.c | 38 +++++++++++++++---- 5 files changed, 62 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-02-10-06-00-53.bpo-43172.ZMCJni.rst diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst index eae0a6df45f30e..3ff64885f7fced 100644 --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -258,7 +258,9 @@ with a custom completer, a different set of word delimiters should be set. Get the beginning or ending index of the completion scope. These indexes are the *start* and *end* arguments passed to the :c:data:`rl_attempted_completion_function` callback of the - underlying library. + underlying library. The values may be different in the same + input editing scenario based on the underlying C readline implemtation. + Ex: libedit is known to behave differently than libreadline. .. function:: set_completer_delims(string) diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py index de573bef9f9632..f3e404da6f0b87 100644 --- a/Lib/test/test_readline.py +++ b/Lib/test/test_readline.py @@ -102,8 +102,15 @@ def test_write_read_append(self): # test 'no such file' behaviour os.unlink(hfilename) - with self.assertRaises(FileNotFoundError): + try: readline.append_history_file(1, hfilename) + except FileNotFoundError: + pass # Some implementations return this error (libreadline). + else: + os.unlink(hfilename) # Some create it anyways (libedit). + # If the file wasn't created, unlink will fail. + # We're just testing that one of the two expected behaviors happens + # instead of an incorrect error. # write_history_file can create the target readline.write_history_file(hfilename) @@ -228,7 +235,17 @@ def display(substitution, matches, longest_match_length): output = run_pty(script, input) self.assertIn(b"text 't\\xeb'\r\n", output) self.assertIn(b"line '[\\xefnserted]|t\\xeb[after]'\r\n", output) - self.assertIn(b"indexes 11 13\r\n", output) + if sys.platform == "darwin" or not is_editline: + self.assertIn(b"indexes 11 13\r\n", output) + # Non-macOS libedit does not handle non-ASCII bytes + # the same way and generates character indices + # rather than byte indices via get_begidx() and + # get_endidx(). Ex: libedit2 3.1-20191231-2 on Debian + # winds up with "indexes 10 12". Stemming from the + # start and end values calls back into readline.c's + # rl_attempted_completion_function = flex_complete with: + # (11, 13) instead of libreadline's (12, 15). + if not is_editline and hasattr(readline, "set_pre_input_hook"): self.assertIn(b"substitution 't\\xeb'\r\n", output) self.assertIn(b"matches ['t\\xebnt', 't\\xebxt']\r\n", output) diff --git a/Misc/NEWS.d/next/Library/2021-02-10-06-00-53.bpo-43172.ZMCJni.rst b/Misc/NEWS.d/next/Library/2021-02-10-06-00-53.bpo-43172.ZMCJni.rst new file mode 100644 index 00000000000000..dc756606d8bb0f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-10-06-00-53.bpo-43172.ZMCJni.rst @@ -0,0 +1,4 @@ +The readline module now passes its tests when built directly against +libedit. Existing irreconcilable API differences remain in +:func:`readline.get_begidx` and :func:`readline.get_endidx` behavior based +on libreadline vs libedit use. diff --git a/Modules/clinic/readline.c.h b/Modules/clinic/readline.c.h index 80207caf071100..d1ee8089f73f04 100644 --- a/Modules/clinic/readline.c.h +++ b/Modules/clinic/readline.c.h @@ -384,7 +384,7 @@ PyDoc_STRVAR(readline_remove_history_item__doc__, "remove_history_item($module, pos, /)\n" "--\n" "\n" -"Remove history item given by its position."); +"Remove history item given by its zero-based position."); #define READLINE_REMOVE_HISTORY_ITEM_METHODDEF \ {"remove_history_item", (PyCFunction)readline_remove_history_item, METH_O, readline_remove_history_item__doc__}, @@ -412,7 +412,9 @@ PyDoc_STRVAR(readline_replace_history_item__doc__, "replace_history_item($module, pos, line, /)\n" "--\n" "\n" -"Replaces history item given by its position with contents of line."); +"Replaces history item given by its position with contents of line.\n" +"\n" +"pos is zero-based."); #define READLINE_REPLACE_HISTORY_ITEM_METHODDEF \ {"replace_history_item", (PyCFunction)(void(*)(void))readline_replace_history_item, METH_FASTCALL, readline_replace_history_item__doc__}, @@ -563,7 +565,7 @@ PyDoc_STRVAR(readline_get_history_item__doc__, "get_history_item($module, index, /)\n" "--\n" "\n" -"Return the current contents of history item at index."); +"Return the current contents of history item at one-based index."); #define READLINE_GET_HISTORY_ITEM_METHODDEF \ {"get_history_item", (PyCFunction)readline_get_history_item, METH_O, readline_get_history_item__doc__}, @@ -683,4 +685,4 @@ readline_redisplay(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef READLINE_CLEAR_HISTORY_METHODDEF #define READLINE_CLEAR_HISTORY_METHODDEF #endif /* !defined(READLINE_CLEAR_HISTORY_METHODDEF) */ -/*[clinic end generated code: output=cb44f391ccbfb565 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=f7d390113b27989f input=a9049054013a1b77]*/ diff --git a/Modules/readline.c b/Modules/readline.c index 02b2c40e6b900e..c900e079543c4f 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -67,7 +67,8 @@ extern char **completion_matches(char *, CPFunction *); static int using_libedit_emulation = 0; static const char libedit_version_tag[] = "EditLine wrapper"; -static int libedit_history_start = 0; +static int8_t libedit_history_start = 0; +static int8_t libedit_append_replace_history_offset = 0; #ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK static void @@ -320,7 +321,8 @@ readline_append_history_file_impl(PyObject *module, int nelements, filename_bytes = NULL; filename = NULL; } - errno = err = append_history(nelements, filename); + errno = err = append_history( + nelements - libedit_append_replace_history_offset, filename); if (!err && _history_length >= 0) history_truncate_file(filename, _history_length); Py_XDECREF(filename_bytes); @@ -592,12 +594,12 @@ readline.remove_history_item pos as entry_number: int / -Remove history item given by its position. +Remove history item given by its zero-based position. [clinic start generated code]*/ static PyObject * readline_remove_history_item_impl(PyObject *module, int entry_number) -/*[clinic end generated code: output=ab114f029208c7e8 input=c8520ac3da50224e]*/ +/*[clinic end generated code: output=ab114f029208c7e8 input=f248beb720ff1838]*/ { HIST_ENTRY *entry; @@ -626,12 +628,14 @@ readline.replace_history_item / Replaces history item given by its position with contents of line. + +pos is zero-based. [clinic start generated code]*/ static PyObject * readline_replace_history_item_impl(PyObject *module, int entry_number, PyObject *line) -/*[clinic end generated code: output=f8cec2770ca125eb input=b7ccef0780ae041b]*/ +/*[clinic end generated code: output=f8cec2770ca125eb input=368bb66fe5ee5222]*/ { PyObject *encoded; HIST_ENTRY *old_entry; @@ -645,7 +649,9 @@ readline_replace_history_item_impl(PyObject *module, int entry_number, if (encoded == NULL) { return NULL; } - old_entry = replace_history_entry(entry_number, PyBytes_AS_STRING(encoded), (void *)NULL); + old_entry = replace_history_entry( + entry_number + libedit_append_replace_history_offset, + PyBytes_AS_STRING(encoded), (void *)NULL); Py_DECREF(encoded); if (!old_entry) { PyErr_Format(PyExc_ValueError, @@ -786,12 +792,12 @@ readline.get_history_item index as idx: int / -Return the current contents of history item at index. +Return the current contents of history item at one-based index. [clinic start generated code]*/ static PyObject * readline_get_history_item_impl(PyObject *module, int idx) -/*[clinic end generated code: output=83d3e53ea5f34b3d input=63fff0c3c4323269]*/ +/*[clinic end generated code: output=83d3e53ea5f34b3d input=8adf5c80e6c7ff2b]*/ { HIST_ENTRY *hist_ent; @@ -1191,6 +1197,22 @@ setup_readline(readlinestate *mod_state) } else { libedit_history_start = 1; } + /* Some libedit implementations use 1 based indexing on + * replace_history_entry where libreadline uses 0 based. + * The API our module presents is supposed to be 0 based. + * It's a mad mad mad mad world. + */ + { + add_history("2"); + HIST_ENTRY *old_entry = replace_history_entry(1, "X", NULL); + _py_free_history_entry(old_entry); + HIST_ENTRY *item = history_get(libedit_history_start); + if (item && item->line && strcmp(item->line, "X")) { + libedit_append_replace_history_offset = 0; + } else { + libedit_append_replace_history_offset = 1; + } + } clear_history(); using_history(); From 4a571d953f2709d3dbf520a77834eee54f0bf912 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Fri, 12 Feb 2021 21:57:12 -0700 Subject: [PATCH 1147/1261] bpo-43200: Fix link to shutil.copy() in the shutil doc (GH-24505) Co-authored-by: Terry Jan Reedy --- Doc/library/shutil.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 435787c27661d5..d5080da15bba41 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -443,8 +443,9 @@ Directory and files operations Platform-dependent efficient copy operations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Starting from Python 3.8 all functions involving a file copy (:func:`copyfile`, -:func:`copy`, :func:`copy2`, :func:`copytree`, and :func:`move`) may use +Starting from Python 3.8, all functions involving a file copy +(:func:`copyfile`, :func:`~shutil.copy`, :func:`copy2`, +:func:`copytree`, and :func:`move`) may use platform-specific "fast-copy" syscalls in order to copy the file more efficiently (see :issue:`33671`). "fast-copy" means that the copying operation occurs within the kernel, avoiding From 693594aa04411a6edfb16ffc9b410dc49e564aea Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sat, 13 Feb 2021 01:49:18 -0500 Subject: [PATCH 1148/1261] bpo-43202: More codeop._maybe_compile clean-ups (GH-24512) Add comment, end others with period, remove unused variables, initialize others only when needed, and add explicit return. --- Lib/codeop.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Lib/codeop.py b/Lib/codeop.py index b3af93f1e18f59..6b56be488eeb03 100644 --- a/Lib/codeop.py +++ b/Lib/codeop.py @@ -64,24 +64,21 @@ __all__ = ["compile_command", "Compile", "CommandCompiler"] -PyCF_DONT_IMPLY_DEDENT = 0x200 # Matches pythonrun.h +PyCF_DONT_IMPLY_DEDENT = 0x200 # Matches pythonrun.h. def _maybe_compile(compiler, source, filename, symbol): - # Check for source consisting of only blank lines and comments + # Check for source consisting of only blank lines and comments. for line in source.split("\n"): line = line.strip() if line and line[0] != '#': - break # Leave it alone + break # Leave it alone. else: if symbol != "eval": source = "pass" # Replace it with a 'pass' statement - err = err1 = err2 = None - code1 = code2 = None - try: return compiler(source, filename, symbol) - except SyntaxError: + except SyntaxError: # Let other compile() errors propagate. pass # Catch syntax warnings after the first compile @@ -89,6 +86,7 @@ def _maybe_compile(compiler, source, filename, symbol): with warnings.catch_warnings(): warnings.simplefilter("error") + code1 = err1 = err2 = None try: code1 = compiler(source + "\n", filename, symbol) except SyntaxError as e: @@ -102,6 +100,8 @@ def _maybe_compile(compiler, source, filename, symbol): try: if not code1 and _is_syntax_error(err1, err2): raise err1 + else: + return None finally: err1 = err2 = None From 5f100d26974a8ab6c690fd5908fbc9f05ec06505 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 14 Feb 2021 15:54:39 +0900 Subject: [PATCH 1149/1261] bpo-43152: Update assert statement to remove unused warning (GH-24473) --- Python/ceval.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index 3b67a6b79bfb76..9e4c2666ac6f74 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4744,8 +4744,7 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, Py_DECREF(defaults); return NULL; } - PyCodeObject *code = (PyCodeObject *)_co; - assert ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == 0); + assert ((((PyCodeObject *)_co)->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == 0); if (locals == NULL) { locals = globals; } From 113e1effb41c7ce74be176666e87f5dcc347156c Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Sun, 14 Feb 2021 15:14:26 +0100 Subject: [PATCH 1150/1261] bpo-43210: Fix byteswap comment in sha512.module.c (GH-24518) --- Modules/sha512module.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 062343e71ff144..0d8f51e5ae5e00 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -17,7 +17,7 @@ /* SHA objects */ #include "Python.h" -#include "pycore_bitutils.h" // _Py_bswap32() +#include "pycore_bitutils.h" // _Py_bswap64() #include "structmember.h" // PyMemberDef #include "hashlib.h" #include "pystrhex.h" From e4d7adcf5bbaa34bd7df76c0f94e2b3292d8176a Mon Sep 17 00:00:00 2001 From: Adam Goldschmidt Date: Mon, 15 Feb 2021 00:41:57 +0200 Subject: [PATCH 1151/1261] bpo-42967: only use '&' as a query string separator (#24297) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bpo-42967: [security] Address a web cache-poisoning issue reported in urllib.parse.parse_qsl(). urllib.parse will only us "&" as query string separator by default instead of both ";" and "&" as allowed in earlier versions. An optional argument seperator with default value "&" is added to specify the separator. Co-authored-by: Éric Araujo Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Co-authored-by: Éric Araujo --- Doc/library/cgi.rst | 9 ++- Doc/library/urllib.parse.rst | 16 ++++- Doc/whatsnew/3.10.rst | 13 ++++ Doc/whatsnew/3.6.rst | 13 ++++ Doc/whatsnew/3.7.rst | 13 ++++ Doc/whatsnew/3.8.rst | 13 ++++ Doc/whatsnew/3.9.rst | 15 +++- Lib/cgi.py | 23 ++++--- Lib/test/test_cgi.py | 29 ++++++-- Lib/test/test_urlparse.py | 68 +++++++++++++------ Lib/urllib/parse.py | 20 ++++-- .../2021-02-14-15-59-16.bpo-42967.YApqDS.rst | 1 + 12 files changed, 186 insertions(+), 47 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 4048592e7361f7..05d9cdf424073f 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -277,14 +277,14 @@ These are useful if you want more control, or if you want to employ some of the algorithms implemented in this module in other circumstances. -.. function:: parse(fp=None, environ=os.environ, keep_blank_values=False, strict_parsing=False) +.. function:: parse(fp=None, environ=os.environ, keep_blank_values=False, strict_parsing=False, separator="&") Parse a query in the environment or from a file (the file defaults to - ``sys.stdin``). The *keep_blank_values* and *strict_parsing* parameters are + ``sys.stdin``). The *keep_blank_values*, *strict_parsing* and *separator* parameters are passed to :func:`urllib.parse.parse_qs` unchanged. -.. function:: parse_multipart(fp, pdict, encoding="utf-8", errors="replace") +.. function:: parse_multipart(fp, pdict, encoding="utf-8", errors="replace", separator="&") Parse input of type :mimetype:`multipart/form-data` (for file uploads). Arguments are *fp* for the input file, *pdict* for a dictionary containing @@ -303,6 +303,9 @@ algorithms implemented in this module in other circumstances. Added the *encoding* and *errors* parameters. For non-file fields, the value is now a list of strings, not bytes. + .. versionchanged:: 3.10 + Added the *separator* parameter. + .. function:: parse_header(string) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index f9c8ba7398f66f..1a7907823929dc 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -165,7 +165,7 @@ or on combining URL components into a URL string. now raise :exc:`ValueError`. -.. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None) +.. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&') Parse a query string given as a string argument (data of type :mimetype:`application/x-www-form-urlencoded`). Data are returned as a @@ -190,6 +190,8 @@ or on combining URL components into a URL string. read. If set, then throws a :exc:`ValueError` if there are more than *max_num_fields* fields read. + The optional argument *separator* is the symbol to use for separating the query arguments. It defaults to `&`. + Use the :func:`urllib.parse.urlencode` function (with the ``doseq`` parameter set to ``True``) to convert such dictionaries into query strings. @@ -201,8 +203,12 @@ or on combining URL components into a URL string. .. versionchanged:: 3.8 Added *max_num_fields* parameter. + .. versionchanged:: 3.10 + Added *separator* parameter with the default value of `&`. Python versions earlier than Python 3.10 allowed using both ";" and "&" as + query parameter separator. This has been changed to allow only a single separator key, with "&" as the default separator. + -.. function:: parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None) +.. function:: parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&') Parse a query string given as a string argument (data of type :mimetype:`application/x-www-form-urlencoded`). Data are returned as a list of @@ -226,6 +232,8 @@ or on combining URL components into a URL string. read. If set, then throws a :exc:`ValueError` if there are more than *max_num_fields* fields read. + The optional argument *separator* is the symbol to use for separating the query arguments. It defaults to `&`. + Use the :func:`urllib.parse.urlencode` function to convert such lists of pairs into query strings. @@ -235,6 +243,10 @@ or on combining URL components into a URL string. .. versionchanged:: 3.8 Added *max_num_fields* parameter. + .. versionchanged:: 3.10 + Added *separator* parameter with the default value of `&`. Python versions earlier than Python 3.10 allowed using both ";" and "&" as + query parameter separator. This has been changed to allow only a single separator key, with "&" as the default separator. + .. function:: urlunparse(parts) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index ed2fd0eb0dda66..c282edcc9d8f0e 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -546,6 +546,19 @@ Add new method :meth:`~unittest.TestCase.assertNoLogs` to complement the existing :meth:`~unittest.TestCase.assertLogs`. (Contributed by Kit Yan Choi in :issue:`39385`.) +urllib.parse +------------ + +Python versions earlier than Python 3.10 allowed using both ``;`` and ``&`` as +query parameter separators in :func:`urllib.parse.parse_qs` and +:func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with +newer W3C recommendations, this has been changed to allow only a single +separator key, with ``&`` as the default. This change also affects +:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +functions internally. For more details, please see their respective +documentation. +(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) + xml --- diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 85a6657fdfbdac..8a64da1b249d7d 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -2443,3 +2443,16 @@ because of the behavior of the socket option ``SO_REUSEADDR`` in UDP. For more details, see the documentation for ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in :issue:`37228`.) + +Notable changes in Python 3.6.13 +================================ + +Earlier Python versions allowed using both ";" and "&" as +query parameter separators in :func:`urllib.parse.parse_qs` and +:func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with +newer W3C recommendations, this has been changed to allow only a single +separator key, with "&" as the default. This change also affects +:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +functions internally. For more details, please see their respective +documentation. +(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 7590af35e2838c..75e1973b3e1b72 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -2557,3 +2557,16 @@ because of the behavior of the socket option ``SO_REUSEADDR`` in UDP. For more details, see the documentation for ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in :issue:`37228`.) + +Notable changes in Python 3.7.10 +================================ + +Earlier Python versions allowed using both ``;`` and ``&`` as +query parameter separators in :func:`urllib.parse.parse_qs` and +:func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with +newer W3C recommendations, this has been changed to allow only a single +separator key, with ``&`` as the default. This change also affects +:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +functions internally. For more details, please see their respective +documentation. +(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 0b4820f3333e13..d21921d3dd51e7 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -2234,3 +2234,16 @@ because of the behavior of the socket option ``SO_REUSEADDR`` in UDP. For more details, see the documentation for ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in :issue:`37228`.) + +Notable changes in Python 3.8.8 +=============================== + +Earlier Python versions allowed using both ";" and "&" as +query parameter separators in :func:`urllib.parse.parse_qs` and +:func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with +newer W3C recommendations, this has been changed to allow only a single +separator key, with "&" as the default. This change also affects +:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +functions internally. For more details, please see their respective +documentation. +(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) \ No newline at end of file diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index b94f1bfaddf6f1..5f4f8ba211b180 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -1515,4 +1515,17 @@ need to account for this change. A :exc:`DeprecationWarning` may be emitted for invalid forms of parameterizing :class:`collections.abc.Callable` which may have passed silently in Python 3.9.1. This :exc:`DeprecationWarning` will become a :exc:`TypeError` in Python 3.10. -(Contributed by Ken Jin in :issue:`42195`.) \ No newline at end of file +(Contributed by Ken Jin in :issue:`42195`.) + +urllib.parse +------------ + +Earlier Python versions allowed using both ";" and "&" as +query parameter separators in :func:`urllib.parse.parse_qs` and +:func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with +newer W3C recommendations, this has been changed to allow only a single +separator key, with "&" as the default. This change also affects +:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +functions internally. For more details, please see their respective +documentation. +(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) diff --git a/Lib/cgi.py b/Lib/cgi.py index 6018c3608697af..6c72507c2087de 100755 --- a/Lib/cgi.py +++ b/Lib/cgi.py @@ -115,7 +115,8 @@ def closelog(): # 0 ==> unlimited input maxlen = 0 -def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0): +def parse(fp=None, environ=os.environ, keep_blank_values=0, + strict_parsing=0, separator='&'): """Parse a query in the environment or from a file (default stdin) Arguments, all optional: @@ -134,6 +135,9 @@ def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0): strict_parsing: flag indicating what to do with parsing errors. If false (the default), errors are silently ignored. If true, errors raise a ValueError exception. + + separator: str. The symbol to use for separating the query arguments. + Defaults to &. """ if fp is None: fp = sys.stdin @@ -154,7 +158,7 @@ def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0): if environ['REQUEST_METHOD'] == 'POST': ctype, pdict = parse_header(environ['CONTENT_TYPE']) if ctype == 'multipart/form-data': - return parse_multipart(fp, pdict) + return parse_multipart(fp, pdict, separator=separator) elif ctype == 'application/x-www-form-urlencoded': clength = int(environ['CONTENT_LENGTH']) if maxlen and clength > maxlen: @@ -178,10 +182,10 @@ def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0): qs = "" environ['QUERY_STRING'] = qs # XXX Shouldn't, really return urllib.parse.parse_qs(qs, keep_blank_values, strict_parsing, - encoding=encoding) + encoding=encoding, separator=separator) -def parse_multipart(fp, pdict, encoding="utf-8", errors="replace"): +def parse_multipart(fp, pdict, encoding="utf-8", errors="replace", separator='&'): """Parse multipart input. Arguments: @@ -205,7 +209,7 @@ def parse_multipart(fp, pdict, encoding="utf-8", errors="replace"): except KeyError: pass fs = FieldStorage(fp, headers=headers, encoding=encoding, errors=errors, - environ={'REQUEST_METHOD': 'POST'}) + environ={'REQUEST_METHOD': 'POST'}, separator=separator) return {k: fs.getlist(k) for k in fs} def _parseparam(s): @@ -315,7 +319,7 @@ class FieldStorage: def __init__(self, fp=None, headers=None, outerboundary=b'', environ=os.environ, keep_blank_values=0, strict_parsing=0, limit=None, encoding='utf-8', errors='replace', - max_num_fields=None): + max_num_fields=None, separator='&'): """Constructor. Read multipart/* until last part. Arguments, all optional: @@ -363,6 +367,7 @@ def __init__(self, fp=None, headers=None, outerboundary=b'', self.keep_blank_values = keep_blank_values self.strict_parsing = strict_parsing self.max_num_fields = max_num_fields + self.separator = separator if 'REQUEST_METHOD' in environ: method = environ['REQUEST_METHOD'].upper() self.qs_on_post = None @@ -589,7 +594,7 @@ def read_urlencoded(self): query = urllib.parse.parse_qsl( qs, self.keep_blank_values, self.strict_parsing, encoding=self.encoding, errors=self.errors, - max_num_fields=self.max_num_fields) + max_num_fields=self.max_num_fields, separator=self.separator) self.list = [MiniFieldStorage(key, value) for key, value in query] self.skip_lines() @@ -605,7 +610,7 @@ def read_multi(self, environ, keep_blank_values, strict_parsing): query = urllib.parse.parse_qsl( self.qs_on_post, self.keep_blank_values, self.strict_parsing, encoding=self.encoding, errors=self.errors, - max_num_fields=self.max_num_fields) + max_num_fields=self.max_num_fields, separator=self.separator) self.list.extend(MiniFieldStorage(key, value) for key, value in query) klass = self.FieldStorageClass or self.__class__ @@ -649,7 +654,7 @@ def read_multi(self, environ, keep_blank_values, strict_parsing): else self.limit - self.bytes_read part = klass(self.fp, headers, ib, environ, keep_blank_values, strict_parsing, limit, - self.encoding, self.errors, max_num_fields) + self.encoding, self.errors, max_num_fields, self.separator) if max_num_fields is not None: max_num_fields -= 1 diff --git a/Lib/test/test_cgi.py b/Lib/test/test_cgi.py index 6b29759da44d01..239d97589cac26 100644 --- a/Lib/test/test_cgi.py +++ b/Lib/test/test_cgi.py @@ -53,12 +53,9 @@ def do_test(buf, method): ("", ValueError("bad query field: ''")), ("&", ValueError("bad query field: ''")), ("&&", ValueError("bad query field: ''")), - (";", ValueError("bad query field: ''")), - (";&;", ValueError("bad query field: ''")), # Should the next few really be valid? ("=", {}), ("=&=", {}), - ("=;=", {}), # This rest seem to make sense ("=a", {'': ['a']}), ("&=a", ValueError("bad query field: ''")), @@ -73,8 +70,6 @@ def do_test(buf, method): ("a=a+b&b=b+c", {'a': ['a b'], 'b': ['b c']}), ("a=a+b&a=b+a", {'a': ['a b', 'b a']}), ("x=1&y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), ("Hbc5161168c542333633315dee1182227:key_store_seqid=400006&cuyer=r&view=bustomer&order_id=0bb2e248638833d48cb7fed300000f1b&expire=964546263&lobale=en-US&kid=130003.300038&ss=env", {'Hbc5161168c542333633315dee1182227:key_store_seqid': ['400006'], 'cuyer': ['r'], @@ -201,6 +196,30 @@ def test_strict(self): else: self.assertEqual(fs.getvalue(key), expect_val[0]) + def test_separator(self): + parse_semicolon = [ + ("x=1;y=2.0", {'x': ['1'], 'y': ['2.0']}), + ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), + (";", ValueError("bad query field: ''")), + (";;", ValueError("bad query field: ''")), + ("=;a", ValueError("bad query field: 'a'")), + (";b=a", ValueError("bad query field: ''")), + ("b;=a", ValueError("bad query field: 'b'")), + ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), + ("a=a+b;a=b+a", {'a': ['a b', 'b a']}), + ] + for orig, expect in parse_semicolon: + env = {'QUERY_STRING': orig} + fs = cgi.FieldStorage(separator=';', environ=env) + if isinstance(expect, dict): + for key in expect.keys(): + expect_val = expect[key] + self.assertIn(key, fs) + if len(expect_val) > 1: + self.assertEqual(fs.getvalue(key), expect_val) + else: + self.assertEqual(fs.getvalue(key), expect_val[0]) + def test_log(self): cgi.log("Testing") diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 762500789f73ac..3b1c360625b5a6 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -32,16 +32,10 @@ (b"&a=b", [(b'a', b'b')]), (b"a=a+b&b=b+c", [(b'a', b'a b'), (b'b', b'b c')]), (b"a=1&a=2", [(b'a', b'1'), (b'a', b'2')]), - (";", []), - (";;", []), - (";a=b", [('a', 'b')]), - ("a=a+b;b=b+c", [('a', 'a b'), ('b', 'b c')]), - ("a=1;a=2", [('a', '1'), ('a', '2')]), - (b";", []), - (b";;", []), - (b";a=b", [(b'a', b'b')]), - (b"a=a+b;b=b+c", [(b'a', b'a b'), (b'b', b'b c')]), - (b"a=1;a=2", [(b'a', b'1'), (b'a', b'2')]), + (";a=b", [(';a', 'b')]), + ("a=a+b;b=b+c", [('a', 'a b;b=b c')]), + (b";a=b", [(b';a', b'b')]), + (b"a=a+b;b=b+c", [(b'a', b'a b;b=b c')]), ] # Each parse_qs testcase is a two-tuple that contains @@ -68,16 +62,10 @@ (b"&a=b", {b'a': [b'b']}), (b"a=a+b&b=b+c", {b'a': [b'a b'], b'b': [b'b c']}), (b"a=1&a=2", {b'a': [b'1', b'2']}), - (";", {}), - (";;", {}), - (";a=b", {'a': ['b']}), - ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), - ("a=1;a=2", {'a': ['1', '2']}), - (b";", {}), - (b";;", {}), - (b";a=b", {b'a': [b'b']}), - (b"a=a+b;b=b+c", {b'a': [b'a b'], b'b': [b'b c']}), - (b"a=1;a=2", {b'a': [b'1', b'2']}), + (";a=b", {';a': ['b']}), + ("a=a+b;b=b+c", {'a': ['a b;b=b c']}), + (b";a=b", {b';a': [b'b']}), + (b"a=a+b;b=b+c", {b'a':[ b'a b;b=b c']}), ] class UrlParseTestCase(unittest.TestCase): @@ -886,10 +874,46 @@ def test_parse_qsl_encoding(self): def test_parse_qsl_max_num_fields(self): with self.assertRaises(ValueError): urllib.parse.parse_qs('&'.join(['a=a']*11), max_num_fields=10) - with self.assertRaises(ValueError): - urllib.parse.parse_qs(';'.join(['a=a']*11), max_num_fields=10) urllib.parse.parse_qs('&'.join(['a=a']*10), max_num_fields=10) + def test_parse_qs_separator(self): + parse_qs_semicolon_cases = [ + (";", {}), + (";;", {}), + (";a=b", {'a': ['b']}), + ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), + ("a=1;a=2", {'a': ['1', '2']}), + (b";", {}), + (b";;", {}), + (b";a=b", {b'a': [b'b']}), + (b"a=a+b;b=b+c", {b'a': [b'a b'], b'b': [b'b c']}), + (b"a=1;a=2", {b'a': [b'1', b'2']}), + ] + for orig, expect in parse_qs_semicolon_cases: + with self.subTest(f"Original: {orig!r}, Expected: {expect!r}"): + result = urllib.parse.parse_qs(orig, separator=';') + self.assertEqual(result, expect, "Error parsing %r" % orig) + + + def test_parse_qsl_separator(self): + parse_qsl_semicolon_cases = [ + (";", []), + (";;", []), + (";a=b", [('a', 'b')]), + ("a=a+b;b=b+c", [('a', 'a b'), ('b', 'b c')]), + ("a=1;a=2", [('a', '1'), ('a', '2')]), + (b";", []), + (b";;", []), + (b";a=b", [(b'a', b'b')]), + (b"a=a+b;b=b+c", [(b'a', b'a b'), (b'b', b'b c')]), + (b"a=1;a=2", [(b'a', b'1'), (b'a', b'2')]), + ] + for orig, expect in parse_qsl_semicolon_cases: + with self.subTest(f"Original: {orig!r}, Expected: {expect!r}"): + result = urllib.parse.parse_qsl(orig, separator=';') + self.assertEqual(result, expect, "Error parsing %r" % orig) + + def test_urlencode_sequences(self): # Other tests incidentally urlencode things; test non-covered cases: # Sequence and object values. diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index ea897c3032257b..5bd067895bfa3d 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -662,7 +662,7 @@ def unquote(string, encoding='utf-8', errors='replace'): def parse_qs(qs, keep_blank_values=False, strict_parsing=False, - encoding='utf-8', errors='replace', max_num_fields=None): + encoding='utf-8', errors='replace', max_num_fields=None, separator='&'): """Parse a query given as a string argument. Arguments: @@ -686,12 +686,15 @@ def parse_qs(qs, keep_blank_values=False, strict_parsing=False, max_num_fields: int. If set, then throws a ValueError if there are more than n fields read by parse_qsl(). + separator: str. The symbol to use for separating the query arguments. + Defaults to &. + Returns a dictionary. """ parsed_result = {} pairs = parse_qsl(qs, keep_blank_values, strict_parsing, encoding=encoding, errors=errors, - max_num_fields=max_num_fields) + max_num_fields=max_num_fields, separator=separator) for name, value in pairs: if name in parsed_result: parsed_result[name].append(value) @@ -701,7 +704,7 @@ def parse_qs(qs, keep_blank_values=False, strict_parsing=False, def parse_qsl(qs, keep_blank_values=False, strict_parsing=False, - encoding='utf-8', errors='replace', max_num_fields=None): + encoding='utf-8', errors='replace', max_num_fields=None, separator='&'): """Parse a query given as a string argument. Arguments: @@ -724,19 +727,26 @@ def parse_qsl(qs, keep_blank_values=False, strict_parsing=False, max_num_fields: int. If set, then throws a ValueError if there are more than n fields read by parse_qsl(). + separator: str. The symbol to use for separating the query arguments. + Defaults to &. + Returns a list, as G-d intended. """ qs, _coerce_result = _coerce_args(qs) + if not separator or (not isinstance(separator, str) + and not isinstance(separator, bytes)): + raise ValueError("Separator must be of type string or bytes.") + # If max_num_fields is defined then check that the number of fields # is less than max_num_fields. This prevents a memory exhaustion DOS # attack via post bodies with many fields. if max_num_fields is not None: - num_fields = 1 + qs.count('&') + qs.count(';') + num_fields = 1 + qs.count(separator) if max_num_fields < num_fields: raise ValueError('Max number of fields exceeded') - pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] + pairs = [s1 for s1 in qs.split(separator)] r = [] for name_value in pairs: if not name_value and not strict_parsing: diff --git a/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst new file mode 100644 index 00000000000000..f08489b41494ea --- /dev/null +++ b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst @@ -0,0 +1 @@ +Fix web cache poisoning vulnerability by defaulting the query args separator to ``&``, and allowing the user to choose a custom separator. From 50002fc20e81aaed6129aac3c2263d91412eb376 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Mon, 15 Feb 2021 17:19:24 +0100 Subject: [PATCH 1152/1261] bpo-43181: Convert PyObject_TypeCheck to static inline function (GH-24533) --- Doc/c-api/object.rst | 4 ++-- Include/object.h | 7 +++++-- .../2021-02-11-11-37-14.bpo-43181.ydv33S.rst | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index a387b4a2df1342..1100af1df2928c 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -297,8 +297,8 @@ Object Protocol .. c:function:: int PyObject_TypeCheck(PyObject *o, PyTypeObject *type) - Return true if the object *o* is of type *type* or a subtype of *type*. Both - parameters must be non-``NULL``. + Return non-zero if the object *o* is of type *type* or a subtype of *type*, and + ``0`` otherwise. Both parameters must be non-``NULL``. .. c:function:: Py_ssize_t PyObject_Size(PyObject *o) diff --git a/Include/object.h b/Include/object.h index 8d0039428e73af..0870e4c6f854c3 100644 --- a/Include/object.h +++ b/Include/object.h @@ -235,8 +235,11 @@ PyAPI_FUNC(void *) PyType_GetModuleState(struct _typeobject *); /* Generic type check */ PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); -#define PyObject_TypeCheck(ob, tp) \ - (Py_IS_TYPE(ob, tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) + +static inline int _PyObject_TypeCheck(PyObject *ob, PyTypeObject *type) { + return Py_IS_TYPE(ob, type) || PyType_IsSubtype(Py_TYPE(ob), type); +} +#define PyObject_TypeCheck(ob, type) _PyObject_TypeCheck(_PyObject_CAST(ob), type) PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst new file mode 100644 index 00000000000000..0e0a5712930d7f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst @@ -0,0 +1,2 @@ +Convert :c:func:`PyObject_TypeCheck` macro to a static inline function. Patch by +Erlend E. Aasland. From 8041fc1be501f0bcb4f205abd7dcd4d234c9a6f1 Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Tue, 16 Feb 2021 01:00:20 +0800 Subject: [PATCH 1153/1261] bpo-42967: Fix urllib.parse docs and make logic clearer (GH-24536) --- Doc/library/urllib.parse.rst | 18 ++++++++++++------ Doc/whatsnew/3.6.rst | 4 ++-- Doc/whatsnew/3.8.rst | 4 ++-- Doc/whatsnew/3.9.rst | 4 ++-- Lib/urllib/parse.py | 3 +-- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 1a7907823929dc..67c21208196b84 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -190,7 +190,8 @@ or on combining URL components into a URL string. read. If set, then throws a :exc:`ValueError` if there are more than *max_num_fields* fields read. - The optional argument *separator* is the symbol to use for separating the query arguments. It defaults to `&`. + The optional argument *separator* is the symbol to use for separating the + query arguments. It defaults to ``&``. Use the :func:`urllib.parse.urlencode` function (with the ``doseq`` parameter set to ``True``) to convert such dictionaries into query @@ -204,8 +205,10 @@ or on combining URL components into a URL string. Added *max_num_fields* parameter. .. versionchanged:: 3.10 - Added *separator* parameter with the default value of `&`. Python versions earlier than Python 3.10 allowed using both ";" and "&" as - query parameter separator. This has been changed to allow only a single separator key, with "&" as the default separator. + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.10 allowed using both ``;`` and ``&`` as + query parameter separator. This has been changed to allow only a single + separator key, with ``&`` as the default separator. .. function:: parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&') @@ -232,7 +235,8 @@ or on combining URL components into a URL string. read. If set, then throws a :exc:`ValueError` if there are more than *max_num_fields* fields read. - The optional argument *separator* is the symbol to use for separating the query arguments. It defaults to `&`. + The optional argument *separator* is the symbol to use for separating the + query arguments. It defaults to ``&``. Use the :func:`urllib.parse.urlencode` function to convert such lists of pairs into query strings. @@ -244,8 +248,10 @@ or on combining URL components into a URL string. Added *max_num_fields* parameter. .. versionchanged:: 3.10 - Added *separator* parameter with the default value of `&`. Python versions earlier than Python 3.10 allowed using both ";" and "&" as - query parameter separator. This has been changed to allow only a single separator key, with "&" as the default separator. + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.10 allowed using both ``;`` and ``&`` as + query parameter separator. This has been changed to allow only a single + separator key, with ``&`` as the default separator. .. function:: urlunparse(parts) diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 8a64da1b249d7d..03a877a3d91785 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -2447,11 +2447,11 @@ details, see the documentation for ``loop.create_datagram_endpoint()``. Notable changes in Python 3.6.13 ================================ -Earlier Python versions allowed using both ";" and "&" as +Earlier Python versions allowed using both ``;`` and ``&`` as query parameter separators in :func:`urllib.parse.parse_qs` and :func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single -separator key, with "&" as the default. This change also affects +separator key, with ``&`` as the default. This change also affects :func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected functions internally. For more details, please see their respective documentation. diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index d21921d3dd51e7..91afffb58a7e6e 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -2238,11 +2238,11 @@ details, see the documentation for ``loop.create_datagram_endpoint()``. Notable changes in Python 3.8.8 =============================== -Earlier Python versions allowed using both ";" and "&" as +Earlier Python versions allowed using both ``;`` and ``&`` as query parameter separators in :func:`urllib.parse.parse_qs` and :func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single -separator key, with "&" as the default. This change also affects +separator key, with ``&`` as the default. This change also affects :func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected functions internally. For more details, please see their respective documentation. diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 5f4f8ba211b180..3086930569dc98 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -1520,11 +1520,11 @@ become a :exc:`TypeError` in Python 3.10. urllib.parse ------------ -Earlier Python versions allowed using both ";" and "&" as +Earlier Python versions allowed using both ``;`` and ``&`` as query parameter separators in :func:`urllib.parse.parse_qs` and :func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single -separator key, with "&" as the default. This change also affects +separator key, with ``&`` as the default. This change also affects :func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected functions internally. For more details, please see their respective documentation. diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 5bd067895bfa3d..335e183498d8bd 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -734,8 +734,7 @@ def parse_qsl(qs, keep_blank_values=False, strict_parsing=False, """ qs, _coerce_result = _coerce_args(qs) - if not separator or (not isinstance(separator, str) - and not isinstance(separator, bytes)): + if not separator or (not isinstance(separator, (str, bytes))): raise ValueError("Separator must be of type string or bytes.") # If max_num_fields is defined then check that the number of fields From ee942af60634c78e3031526d93c9ed31107c53f3 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 15 Feb 2021 21:35:48 +0000 Subject: [PATCH 1154/1261] bpo-43231: Fix test.test_curses.TestCurses.test_init_pair when running under -R (GH-24539) --- Lib/test/test_curses.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index a9f7001d39f08d..f6bd27d02e4315 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -926,6 +926,13 @@ def get_pair_limit(self): if (not curses.has_extended_color_support() or (6, 1) <= curses.ncurses_version < (6, 2)): pair_limit = min(pair_limit, SHORT_MAX) + # If use_default_colors() is called, the upper limit of the extended + # range may be restricted, so we need to check if the limit is still + # correct + try: + curses.init_pair(pair_limit, 0, 0) + except ValueError: + pair_limit = curses.COLOR_PAIRS return pair_limit @requires_colors From abadf472c3dcebad5b5c87c3cc2882dcc984d8c9 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 15 Feb 2021 22:15:49 +0000 Subject: [PATCH 1155/1261] bpo-43231: Correctly calculate the curses color pair limit when checking for it (GH-24541) --- Lib/test/test_curses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index f6bd27d02e4315..0833c86115ebd9 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -930,7 +930,7 @@ def get_pair_limit(self): # range may be restricted, so we need to check if the limit is still # correct try: - curses.init_pair(pair_limit, 0, 0) + curses.init_pair(pair_limit - 1, 0, 0) except ValueError: pair_limit = curses.COLOR_PAIRS return pair_limit From 8a979387feffe870c89073b1eeff56c75ee27538 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 15 Feb 2021 23:03:38 +0000 Subject: [PATCH 1156/1261] Add a warning block around the get_referrers() documentation (GH-24511) --- Doc/library/gc.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index 2d85cd3431711a..a3d201d5055c8e 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -135,10 +135,11 @@ The :mod:`gc` module provides the following functions: resulting referrers. To get only currently live objects, call :func:`collect` before calling :func:`get_referrers`. - Care must be taken when using objects returned by :func:`get_referrers` because - some of them could still be under construction and hence in a temporarily - invalid state. Avoid using :func:`get_referrers` for any purpose other than - debugging. + .. warning:: + Care must be taken when using objects returned by :func:`get_referrers` because + some of them could still be under construction and hence in a temporarily + invalid state. Avoid using :func:`get_referrers` for any purpose other than + debugging. .. function:: get_referents(*objs) From bf7569c365a651437527d669403c92c6756f9143 Mon Sep 17 00:00:00 2001 From: Dustin Rodrigues Date: Mon, 15 Feb 2021 18:28:24 -0500 Subject: [PATCH 1157/1261] bpo-42819, readline: Disable bracketed paste (GH-24108) --- Misc/ACKS | 1 + .../2021-01-04-23-54-34.bpo-42819.4KO6wU.rst | 8 +++++++ Modules/readline.c | 23 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst diff --git a/Misc/ACKS b/Misc/ACKS index 29ef9864f98271..ca222e4371f5e4 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1461,6 +1461,7 @@ Mark Roddy Kevin Rodgers Sean Rodman Giampaolo Rodola +Dustin Rodrigues Mauro S. M. Rodrigues Elson Rodriguez Adi Roiban diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst new file mode 100644 index 00000000000000..d067f0bfa76448 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst @@ -0,0 +1,8 @@ +:mod:`readline`: Explicitly disable bracketed paste in the interactive +interpreter, even if it's set in the inputrc, is enabled by default (eg GNU +Readline 8.1), or a user calls ``readline.read_init_file()``. The Python REPL +has not implemented bracketed paste support. Also, bracketed mode writes the +``"\x1b[?2004h"`` escape sequence into stdout which causes test failures in +applications that don't support it. It can still be explicitly enabled by +calling ``readline.parse_and_bind("set enable-bracketed-paste on")``. Patch by +Dustin Rodrigues. diff --git a/Modules/readline.c b/Modules/readline.c index c900e079543c4f..c79d22f85f84ea 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -156,6 +156,26 @@ decode(const char *s) } +/* +Explicitly disable bracketed paste in the interactive interpreter, even if it's +set in the inputrc, is enabled by default (eg GNU Readline 8.1), or a user calls +readline.read_init_file(). The Python REPL has not implemented bracketed +paste support. Also, bracketed mode writes the "\x1b[?2004h" escape sequence +into stdout which causes test failures in applications that don't support it. +It can still be explicitly enabled by calling readline.parse_and_bind("set +enable-bracketed-paste on"). See bpo-42819 for more details. + +This should be removed if bracketed paste mode is implemented (bpo-39820). +*/ + +static void +disable_bracketed_paste(void) +{ + if (!using_libedit_emulation) { + rl_variable_bind ("enable-bracketed-paste", "off"); + } +} + /* Exported function to send one line to readline's init file parser */ /*[clinic input] @@ -217,6 +237,7 @@ readline_read_init_file_impl(PyObject *module, PyObject *filename_obj) errno = rl_read_init_file(NULL); if (errno) return PyErr_SetFromErrno(PyExc_OSError); + disable_bracketed_paste(); Py_RETURN_NONE; } @@ -1267,6 +1288,8 @@ setup_readline(readlinestate *mod_state) else rl_initialize(); + disable_bracketed_paste(); + RESTORE_LOCALE(saved_locale) return 0; } From 6f9c56e6d5276b3b05e127facc5e7d6eacafc9a9 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Mon, 15 Feb 2021 17:14:13 -0700 Subject: [PATCH 1158/1261] bpo-43155: Add PyCMethod_New to PC/python3dll.c (GH-24500) --- .../NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst | 1 + PC/python3dll.c | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst diff --git a/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst b/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst new file mode 100644 index 00000000000000..2eeef2b0ea27a6 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst @@ -0,0 +1 @@ +:c:func:`PyCMethod_New` is now present in ``python3.lib``. diff --git a/PC/python3dll.c b/PC/python3dll.c index 542853abc894d5..3f87b70b448481 100644 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -128,6 +128,7 @@ EXPORT_FUNC(PyCFunction_GetFunction) EXPORT_FUNC(PyCFunction_GetSelf) EXPORT_FUNC(PyCFunction_New) EXPORT_FUNC(PyCFunction_NewEx) +EXPORT_FUNC(PyCMethod_New) EXPORT_FUNC(PyCodec_BackslashReplaceErrors) EXPORT_FUNC(PyCodec_Decode) EXPORT_FUNC(PyCodec_Decoder) From b415fbd04f889869e6ba0a977e9445cc6e550ce5 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Tue, 16 Feb 2021 08:50:00 +0100 Subject: [PATCH 1159/1261] bpo-40170: Convert PyDescr_IsData() to static inline function (GH-24535) --- Doc/c-api/descriptor.rst | 4 ++-- Include/descrobject.h | 2 +- .../2021-02-15-13-41-14.bpo-40170.r2FAtl.rst | 3 +++ Objects/descrobject.c | 5 +++++ 4 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst diff --git a/Doc/c-api/descriptor.rst b/Doc/c-api/descriptor.rst index 1005140c7acb3a..b32c113e5f0457 100644 --- a/Doc/c-api/descriptor.rst +++ b/Doc/c-api/descriptor.rst @@ -32,8 +32,8 @@ found in the dictionary of type objects. .. c:function:: int PyDescr_IsData(PyObject *descr) - Return true if the descriptor objects *descr* describes a data attribute, or - false if it describes a method. *descr* must be a descriptor object; there is + Return non-zero if the descriptor objects *descr* describes a data attribute, or + ``0`` if it describes a method. *descr* must be a descriptor object; there is no error checking. diff --git a/Include/descrobject.h b/Include/descrobject.h index ead269d1d2f796..703bc8fd6df213 100644 --- a/Include/descrobject.h +++ b/Include/descrobject.h @@ -93,7 +93,7 @@ PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *, #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *, struct wrapperbase *, void *); -#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL) +PyAPI_FUNC(int) PyDescr_IsData(PyObject *); #endif PyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *); diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst new file mode 100644 index 00000000000000..82e844bc284092 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst @@ -0,0 +1,3 @@ +Convert :c:func:`PyDescr_IsData` macro to a function to hide implementation +details: The macro accessed :c:member:`PyTypeObject.tp_descr_set` directly. +Patch by Erlend E. Aasland. diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 16c695a08f47d9..35fbffd914a94c 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -995,6 +995,11 @@ PyDescr_NewWrapper(PyTypeObject *type, struct wrapperbase *base, void *wrapped) return (PyObject *)descr; } +int +PyDescr_IsData(PyObject *ob) +{ + return Py_TYPE(ob)->tp_descr_set != NULL; +} /* --- mappingproxy: read-only proxy for mappings --- */ From 343112b1de791f5df02f6429d5493159e94700dc Mon Sep 17 00:00:00 2001 From: Nicholas Sim Date: Tue, 16 Feb 2021 20:04:38 +0800 Subject: [PATCH 1160/1261] bpo-35134, Include: Move pytime.h to cpython/pytime.h (GH-23988) This change is backward compatible since C extension modules must not include "pytime.h" directly, but only include "Python.h". --- Include/Python.h | 2 +- Include/{ => cpython}/pytime.h | 3 --- Makefile.pre.in | 2 +- Modules/gcmodule.c | 1 - PCbuild/pythoncore.vcxproj | 2 +- PCbuild/pythoncore.vcxproj.filters | 6 +++--- 6 files changed, 6 insertions(+), 10 deletions(-) rename Include/{ => cpython}/pytime.h (99%) diff --git a/Include/Python.h b/Include/Python.h index 57f71d41d8d477..76ead9e5765ec8 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -82,7 +82,6 @@ #error "PYMALLOC_DEBUG requires WITH_PYMALLOC" #endif #include "pymath.h" -#include "pytime.h" #include "pymem.h" #include "object.h" @@ -128,6 +127,7 @@ #include "structseq.h" #include "namespaceobject.h" #include "picklebufobject.h" +#include "cpython/pytime.h" #include "codecs.h" #include "pyerrors.h" diff --git a/Include/pytime.h b/Include/cpython/pytime.h similarity index 99% rename from Include/pytime.h rename to Include/cpython/pytime.h index 944170f7d0c4c3..56607d199ed542 100644 --- a/Include/pytime.h +++ b/Include/cpython/pytime.h @@ -2,9 +2,6 @@ #ifndef Py_PYTIME_H #define Py_PYTIME_H -#include "pyconfig.h" /* include for defines */ -#include "object.h" - /************************************************************************** Symbols and macros to supply platform-independent interfaces to time related functions and constants diff --git a/Makefile.pre.in b/Makefile.pre.in index 0b22bdd5591b9d..0d9fdc713406c0 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1075,7 +1075,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/pystrtod.h \ $(srcdir)/Include/pythonrun.h \ $(srcdir)/Include/pythread.h \ - $(srcdir)/Include/pytime.h \ $(srcdir)/Include/rangeobject.h \ $(srcdir)/Include/setobject.h \ $(srcdir)/Include/sliceobject.h \ @@ -1116,6 +1115,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/pymem.h \ $(srcdir)/Include/cpython/pystate.h \ $(srcdir)/Include/cpython/pythonrun.h \ + $(srcdir)/Include/cpython/pytime.h \ $(srcdir)/Include/cpython/sysmodule.h \ $(srcdir)/Include/cpython/traceback.h \ $(srcdir)/Include/cpython/tupleobject.h \ diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index fdbba6a7afc29d..f0d56994908233 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -31,7 +31,6 @@ #include "pycore_pyerrors.h" #include "pycore_pystate.h" // _PyThreadState_GET() #include "pydtrace.h" -#include "pytime.h" // _PyTime_GetMonotonicClock() typedef struct _gc_runtime_state GCState; diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index f172f2a5786c63..711a68fcc5c7ad 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -147,6 +147,7 @@ + @@ -245,7 +246,6 @@ - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 3bafdb8d297117..ab826427acc688 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -204,9 +204,6 @@ Include - - Include - Include @@ -450,6 +447,9 @@ Include\cpython + + Include\cpython + Include\cpython From a64877a9127e95210b1664e215037bc97e8fcc28 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Tue, 16 Feb 2021 16:05:58 +0100 Subject: [PATCH 1161/1261] bpo-40170: Always define PyIter_Check() as a function (GH-24548) --- Doc/c-api/iter.rst | 4 ++-- Include/abstract.h | 2 +- Include/cpython/abstract.h | 6 ------ .../2021-02-15-15-06-43.bpo-40170.ZYeSii.rst | 3 +++ Objects/abstract.c | 10 +++++----- 5 files changed, 11 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst index 74fb5578abd6e1..5706777c41db48 100644 --- a/Doc/c-api/iter.rst +++ b/Doc/c-api/iter.rst @@ -9,8 +9,8 @@ There are two functions specifically for working with iterators. .. c:function:: int PyIter_Check(PyObject *o) - Return true if the object *o* supports the iterator protocol. This - function always succeeds. + Return non-zero if the object *o* supports the iterator protocol, and ``0`` + otherwise. This function always succeeds. .. c:function:: PyObject* PyIter_Next(PyObject *o) diff --git a/Include/abstract.h b/Include/abstract.h index 0bd1ca936846fe..a47c944060d3d0 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -324,7 +324,7 @@ PyAPI_FUNC(PyObject *) PyObject_Format(PyObject *obj, returns itself. */ PyAPI_FUNC(PyObject *) PyObject_GetIter(PyObject *); -/* Returns 1 if the object 'obj' provides iterator protocols, and 0 otherwise. +/* Returns non-zero if the object 'obj' provides iterator protocols, and 0 otherwise. This function always succeeds. */ PyAPI_FUNC(int) PyIter_Check(PyObject *); diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 7a4219c8b338b4..db5055d201107e 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -325,12 +325,6 @@ PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf, /* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */ PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); -/* ==== Iterators ================================================ */ - -#define PyIter_Check(obj) \ - (Py_TYPE(obj)->tp_iternext != NULL && \ - Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented) - /* === Sequence protocol ================================================ */ /* Assume tp_as_sequence and sq_item exist and that 'i' does not diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst new file mode 100644 index 00000000000000..df6f3dcfc14b6f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst @@ -0,0 +1,3 @@ +:c:func:`PyIter_Check` is now always declared as a function, in order to hide implementation +details. The macro accessed :c:member:`PyTypeObject.tp_iternext` directly. +Patch by Erlend E. Aasland. diff --git a/Objects/abstract.c b/Objects/abstract.c index 74a73ee469866d..c93309b352774c 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2732,12 +2732,12 @@ PyObject_GetIter(PyObject *o) } } -#undef PyIter_Check - -int PyIter_Check(PyObject *obj) +int +PyIter_Check(PyObject *obj) { - return Py_TYPE(obj)->tp_iternext != NULL && - Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented; + PyTypeObject *tp = Py_TYPE(obj); + return (tp->tp_iternext != NULL && + tp->tp_iternext != &_PyObject_NextNotImplemented); } /* Return next item. From d8b82f2f1a53b11c4aac37bff9ca46da3377bf5c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 17 Feb 2021 11:14:42 +0100 Subject: [PATCH 1162/1261] bpo-43103: Add configure --without-static-libpython (GH-24418) Add a new configure --without-static-libpython option to not build the libpythonMAJOR.MINOR.a static library and not install the python.o object file. Fix smelly.py and stable_abi.py tools when libpython3.10.a is missing. --- Doc/whatsnew/3.10.rst | 6 +++ Makefile.pre.in | 51 +++++++++++-------- .../2021-02-02-16-26-44.bpo-43103.VWeyP_.rst | 3 ++ Tools/scripts/smelly.py | 5 +- Tools/scripts/stable_abi.py | 6 ++- configure | 40 +++++++++++++++ configure.ac | 27 ++++++++++ 7 files changed, 113 insertions(+), 25 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-02-02-16-26-44.bpo-43103.VWeyP_.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index c282edcc9d8f0e..0fba27c7d5845c 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -820,6 +820,12 @@ Build Changes (Contributed by Victor Stinner in :issue:`42856`.) +* Add a new configure ``--without-static-libpython`` option to not build the + ``libpythonMAJOR.MINOR.a`` static library and not install the ``python.o`` + object file. + + (Contributed by Victor Stinner in :issue:`43103`.) + C API Changes ============= diff --git a/Makefile.pre.in b/Makefile.pre.in index 0d9fdc713406c0..d3ac2dab893f0b 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -236,6 +236,9 @@ PY3LIBRARY= @PY3LIBRARY@ DLLLIBRARY= @DLLLIBRARY@ LDLIBRARYDIR= @LDLIBRARYDIR@ INSTSONAME= @INSTSONAME@ +LIBRARY_DEPS= @LIBRARY_DEPS@ +PY_ENABLE_SHARED= @PY_ENABLE_SHARED@ +STATIC_LIBPYTHON= @STATIC_LIBPYTHON@ LIBS= @LIBS@ @@ -578,7 +581,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c $(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir) # Build the interpreter -$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) $(EXPORTSYMS) +$(BUILDPYTHON): Programs/python.o $(LIBRARY_DEPS) $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) platform: $(BUILDPYTHON) pybuilddir.txt @@ -713,7 +716,7 @@ Makefile Modules/config.c: Makefile.pre \ @echo "The Makefile was updated, you may need to re-run make." -Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) $(EXPORTSYMS) +Programs/_testembed: Programs/_testembed.o $(LIBRARY_DEPS) $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) ############################################################################ @@ -1305,19 +1308,21 @@ altbininstall: $(BUILDPYTHON) @FRAMEWORKPYTHONW@ fi; \ (cd $(DESTDIR)$(BINDIR); $(LN) python$(LDVERSION)$(EXE) python$(VERSION)$(EXE)); \ fi - if test -f $(LDLIBRARY) && test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \ - if test -n "$(DLLLIBRARY)" ; then \ - $(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \ - else \ - $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(LIBDIR)/$(INSTSONAME); \ - if test $(LDLIBRARY) != $(INSTSONAME); then \ - (cd $(DESTDIR)$(LIBDIR); $(LN) -sf $(INSTSONAME) $(LDLIBRARY)) \ - fi \ - fi; \ - if test -n "$(PY3LIBRARY)"; then \ - $(INSTALL_SHARED) $(PY3LIBRARY) $(DESTDIR)$(LIBDIR)/$(PY3LIBRARY); \ + @if test "$(PY_ENABLE_SHARED)" = 1 -o "$(STATIC_LIBPYTHON)" = 1; then \ + if test -f $(LDLIBRARY) && test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \ + if test -n "$(DLLLIBRARY)" ; then \ + $(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \ + else \ + $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(LIBDIR)/$(INSTSONAME); \ + if test $(LDLIBRARY) != $(INSTSONAME); then \ + (cd $(DESTDIR)$(LIBDIR); $(LN) -sf $(INSTSONAME) $(LDLIBRARY)) \ + fi \ + fi; \ + if test -n "$(PY3LIBRARY)"; then \ + $(INSTALL_SHARED) $(PY3LIBRARY) $(DESTDIR)$(LIBDIR)/$(PY3LIBRARY); \ + fi; \ + else true; \ fi; \ - else true; \ fi if test "x$(LIPO_32BIT_FLAGS)" != "x" ; then \ rm -f $(DESTDIR)$(BINDIR)python$(VERSION)-32$(EXE); \ @@ -1661,19 +1666,21 @@ libainstall: @DEF_MAKE_RULE@ python-config else true; \ fi; \ done - @if test -d $(LIBRARY); then :; else \ - if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \ - if test "$(SHLIB_SUFFIX)" = .dll; then \ - $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \ + @if test "$(STATIC_LIBPYTHON)" = 1; then \ + if test -d $(LIBRARY); then :; else \ + if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \ + if test "$(SHLIB_SUFFIX)" = .dll; then \ + $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \ + else \ + $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \ + fi; \ else \ - $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \ + echo Skip install of $(LIBRARY) - use make frameworkinstall; \ fi; \ - else \ - echo Skip install of $(LIBRARY) - use make frameworkinstall; \ fi; \ + $(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o; \ fi $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c - $(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in $(INSTALL_DATA) Makefile $(DESTDIR)$(LIBPL)/Makefile $(INSTALL_DATA) $(srcdir)/Modules/Setup $(DESTDIR)$(LIBPL)/Setup diff --git a/Misc/NEWS.d/next/Build/2021-02-02-16-26-44.bpo-43103.VWeyP_.rst b/Misc/NEWS.d/next/Build/2021-02-02-16-26-44.bpo-43103.VWeyP_.rst new file mode 100644 index 00000000000000..edf04c126897ad --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-02-02-16-26-44.bpo-43103.VWeyP_.rst @@ -0,0 +1,3 @@ +Add a new configure ``--without-static-libpython`` option to not build the +``libpythonMAJOR.MINOR.a`` static library and not install the ``python.o`` +object file. diff --git a/Tools/scripts/smelly.py b/Tools/scripts/smelly.py index e8a375c808cdaa..fb01660dea33ae 100755 --- a/Tools/scripts/smelly.py +++ b/Tools/scripts/smelly.py @@ -136,11 +136,14 @@ def check_extensions(): def main(): + nsymbol = 0 + # static library LIBRARY = sysconfig.get_config_var('LIBRARY') if not LIBRARY: raise Exception("failed to get LIBRARY variable from sysconfig") - nsymbol = check_library(LIBRARY) + if os.path.exists(LIBRARY): + nsymbol += check_library(LIBRARY) # dynamic library LDLIBRARY = sysconfig.get_config_var('LDLIBRARY') diff --git a/Tools/scripts/stable_abi.py b/Tools/scripts/stable_abi.py index 47547a97bfd318..117dfeb3cb57aa 100755 --- a/Tools/scripts/stable_abi.py +++ b/Tools/scripts/stable_abi.py @@ -2,8 +2,9 @@ import argparse import glob -import re +import os.path import pathlib +import re import subprocess import sys import sysconfig @@ -213,7 +214,8 @@ def check_symbols(parser_args): LIBRARY = sysconfig.get_config_var("LIBRARY") if not LIBRARY: raise Exception("failed to get LIBRARY variable from sysconfig") - check_library(parser_args.stable_abi_file, LIBRARY, abi_funcs) + if os.path.exists(LIBRARY): + check_library(parser_args.stable_abi_file, LIBRARY, abi_funcs) # dynamic library LDLIBRARY = sysconfig.get_config_var("LDLIBRARY") diff --git a/configure b/configure index 8e0cc71a50480d..8c948250e41e47 100755 --- a/configure +++ b/configure @@ -624,6 +624,8 @@ ac_includes_default="\ ac_subst_vars='LTLIBOBJS TEST_MODULES +LIBRARY_DEPS +STATIC_LIBPYTHON OPENSSL_LDFLAGS OPENSSL_LIBS OPENSSL_INCLUDES @@ -856,6 +858,7 @@ with_openssl with_ssl_default_suites with_builtin_hashlib_hashes with_experimental_isolated_subinterpreters +with_static_libpython enable_test_modules ' ac_precious_vars='build_alias @@ -1602,6 +1605,9 @@ Optional Packages: --with-experimental-isolated-subinterpreters better isolate subinterpreters, experimental build mode (default is no) + --without-static-libpython + do not build libpythonMAJOR.MINOR.a and do not + install python.o (default is yes) Some influential environment variables: MACHDEP name for machine-dependent library files @@ -17776,6 +17782,40 @@ $as_echo "no" >&6; } fi +# --with-static-libpython +STATIC_LIBPYTHON=1 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-static-libpython" >&5 +$as_echo_n "checking for --with-static-libpython... " >&6; } + +# Check whether --with-static-libpython was given. +if test "${with_static_libpython+set}" = set; then : + withval=$with_static_libpython; +if test "$withval" = no +then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; }; + STATIC_LIBPYTHON=0 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; }; +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi + +LIBRARY_DEPS='$(PY3LIBRARY) $(EXPORTSYMS)' +if test "$PY_ENABLE_SHARED" = 1; then + LIBRARY_DEPS="\$(LDLIBRARY) $LIBRARY_DEPS" + if test "$STATIC_LIBPYTHON" = 1; then + LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS" + fi +else + LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS" +fi + + + # Check whether to disable test modules. Once set, setup.py will not build # test extension modules and "make install" will not install test suites. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --disable-test-modules" >&5 diff --git a/configure.ac b/configure.ac index 60c5d8e0b5b034..29957935e9b2aa 100644 --- a/configure.ac +++ b/configure.ac @@ -5882,6 +5882,33 @@ else fi], [AC_MSG_RESULT(no)]) +# --with-static-libpython +STATIC_LIBPYTHON=1 +AC_MSG_CHECKING(for --with-static-libpython) +AC_ARG_WITH(static-libpython, + AS_HELP_STRING([--without-static-libpython], + [do not build libpythonMAJOR.MINOR.a and do not install python.o (default is yes)]), +[ +if test "$withval" = no +then + AC_MSG_RESULT(no); + STATIC_LIBPYTHON=0 +else + AC_MSG_RESULT(yes); +fi], +[AC_MSG_RESULT(yes)]) +LIBRARY_DEPS='$(PY3LIBRARY) $(EXPORTSYMS)' +if test "$PY_ENABLE_SHARED" = 1; then + LIBRARY_DEPS="\$(LDLIBRARY) $LIBRARY_DEPS" + if test "$STATIC_LIBPYTHON" = 1; then + LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS" + fi +else + LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS" +fi +AC_SUBST(STATIC_LIBPYTHON) +AC_SUBST(LIBRARY_DEPS) + # Check whether to disable test modules. Once set, setup.py will not build # test extension modules and "make install" will not install test suites. AC_MSG_CHECKING(for --disable-test-modules) From e9facf7d4ff942ed0c3d4e8a7292bae41f9eac5b Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Wed, 17 Feb 2021 11:51:08 +0100 Subject: [PATCH 1163/1261] bpo-40170: Always define PyExceptionClass_Name() as a function (GH-24553) Remove macro variant of PyExceptionClass_Name(). --- Include/cpython/pyerrors.h | 4 ---- .../next/C API/2021-02-16-22-29-39.bpo-40170.ahHmOo.rst | 3 +++ Objects/exceptions.c | 2 -- 3 files changed, 3 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2021-02-16-22-29-39.bpo-40170.ahHmOo.rst diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index c2500d927bf7f0..6711e8be68ffeb 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -78,10 +78,6 @@ PyAPI_FUNC(void) _PyErr_GetExcInfo(PyThreadState *, PyObject **, PyObject **, Py PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *); -/* */ - -#define PyExceptionClass_Name(x) (((PyTypeObject*)(x))->tp_name) - /* Convenience functions */ #ifdef MS_WINDOWS diff --git a/Misc/NEWS.d/next/C API/2021-02-16-22-29-39.bpo-40170.ahHmOo.rst b/Misc/NEWS.d/next/C API/2021-02-16-22-29-39.bpo-40170.ahHmOo.rst new file mode 100644 index 00000000000000..348fcce98e6310 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-02-16-22-29-39.bpo-40170.ahHmOo.rst @@ -0,0 +1,3 @@ +:c:func:`PyExceptionClass_Name` is now always declared as a function, in +order to hide implementation details. The macro accessed +:c:member:`PyTypeObject.tp_name` directly. Patch by Erlend E. Aasland. diff --git a/Objects/exceptions.c b/Objects/exceptions.c index d4824938a0f507..62cec9a90f5804 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -364,8 +364,6 @@ PyException_SetContext(PyObject *self, PyObject *context) Py_XSETREF(_PyBaseExceptionObject_cast(self)->context, context); } -#undef PyExceptionClass_Name - const char * PyExceptionClass_Name(PyObject *ob) { From 9e4674bcfbff3a34607fe7c7d4a086fab7efadb5 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Wed, 17 Feb 2021 19:15:39 +0100 Subject: [PATCH 1164/1261] bpo-40170: Move 3 NEWS entries to the C API section (GH-24555) --- .../2021-02-11-11-37-14.bpo-43181.ydv33S.rst | 0 .../2021-02-15-13-41-14.bpo-40170.r2FAtl.rst | 0 .../2021-02-15-15-06-43.bpo-40170.ZYeSii.rst | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Misc/NEWS.d/next/{Core and Builtins => C API}/2021-02-11-11-37-14.bpo-43181.ydv33S.rst (100%) rename Misc/NEWS.d/next/{Core and Builtins => C API}/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst (100%) rename Misc/NEWS.d/next/{Core and Builtins => C API}/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst (100%) diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst b/Misc/NEWS.d/next/C API/2021-02-11-11-37-14.bpo-43181.ydv33S.rst similarity index 100% rename from Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst rename to Misc/NEWS.d/next/C API/2021-02-11-11-37-14.bpo-43181.ydv33S.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst b/Misc/NEWS.d/next/C API/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst similarity index 100% rename from Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst rename to Misc/NEWS.d/next/C API/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst b/Misc/NEWS.d/next/C API/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst similarity index 100% rename from Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst rename to Misc/NEWS.d/next/C API/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst From 39537501daaaaf63145a522a241f24f84a4d625b Mon Sep 17 00:00:00 2001 From: Nicholas Sim Date: Thu, 18 Feb 2021 02:30:31 +0800 Subject: [PATCH 1165/1261] bpo-35134: Move Include/{pyarena.h,pyctype.h} to Include/cpython/ (GH-24550) Move non-limited C API headers pyarena.h and pyctype.h into Include/cpython/ directory. --- Include/Python.h | 4 ++-- Include/{ => cpython}/pyarena.h | 0 Include/{ => cpython}/pyctype.h | 0 Makefile.pre.in | 4 ++-- .../C API/2021-02-17-18-51-26.bpo-35134.YoQdk8.rst | 3 +++ PCbuild/pythoncore.vcxproj | 4 ++-- PCbuild/pythoncore.vcxproj.filters | 12 ++++++------ Parser/pegen.h | 1 - Tools/scripts/stable_abi.py | 2 -- 9 files changed, 15 insertions(+), 15 deletions(-) rename Include/{ => cpython}/pyarena.h (100%) rename Include/{ => cpython}/pyctype.h (100%) create mode 100644 Misc/NEWS.d/next/C API/2021-02-17-18-51-26.bpo-35134.YoQdk8.rst diff --git a/Include/Python.h b/Include/Python.h index 76ead9e5765ec8..c71a71f875e3e4 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -137,7 +137,7 @@ #include "pystate.h" #include "context.h" -#include "pyarena.h" +#include "cpython/pyarena.h" #include "modsupport.h" #include "compile.h" #include "pythonrun.h" @@ -154,7 +154,7 @@ #include "eval.h" -#include "pyctype.h" +#include "cpython/pyctype.h" #include "pystrtod.h" #include "pystrcmp.h" #include "fileutils.h" diff --git a/Include/pyarena.h b/Include/cpython/pyarena.h similarity index 100% rename from Include/pyarena.h rename to Include/cpython/pyarena.h diff --git a/Include/pyctype.h b/Include/cpython/pyctype.h similarity index 100% rename from Include/pyctype.h rename to Include/cpython/pyctype.h diff --git a/Makefile.pre.in b/Makefile.pre.in index d3ac2dab893f0b..593da93a6bc2aa 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1057,9 +1057,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/osmodule.h \ $(srcdir)/Include/patchlevel.h \ $(srcdir)/Include/picklebufobject.h \ - $(srcdir)/Include/pyarena.h \ $(srcdir)/Include/pycapsule.h \ - $(srcdir)/Include/pyctype.h \ $(srcdir)/Include/pydebug.h \ $(srcdir)/Include/pydtrace.h \ $(srcdir)/Include/pyerrors.h \ @@ -1113,6 +1111,8 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/methodobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ + $(srcdir)/Include/cpython/pyarena.h \ + $(srcdir)/Include/cpython/pyctype.h \ $(srcdir)/Include/cpython/pyerrors.h \ $(srcdir)/Include/cpython/pylifecycle.h \ $(srcdir)/Include/cpython/pymem.h \ diff --git a/Misc/NEWS.d/next/C API/2021-02-17-18-51-26.bpo-35134.YoQdk8.rst b/Misc/NEWS.d/next/C API/2021-02-17-18-51-26.bpo-35134.YoQdk8.rst new file mode 100644 index 00000000000000..c3534fce68f83f --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-02-17-18-51-26.bpo-35134.YoQdk8.rst @@ -0,0 +1,3 @@ +Move pyarena.h, pyctype.h, and pytime.h into the cpython/ directory. They +must not be included directly, as they are already included by Python.h: +:ref:`Include Files `. diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 711a68fcc5c7ad..89b6218a2739a5 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -142,6 +142,8 @@ + + @@ -226,9 +228,7 @@ - - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index ab826427acc688..bd8fd3433bce0a 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -177,15 +177,9 @@ Include - - Include - Include - - Include - Include @@ -438,6 +432,12 @@ Include\cpython + + Include + + + Include + Include\cpython diff --git a/Parser/pegen.h b/Parser/pegen.h index 2a165c12d252c1..3765b2425fff7e 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -5,7 +5,6 @@ #include #include #include -#include #if 0 #define PyPARSE_YIELD_IS_KEYWORD 0x0001 diff --git a/Tools/scripts/stable_abi.py b/Tools/scripts/stable_abi.py index 117dfeb3cb57aa..44f426e096adcf 100755 --- a/Tools/scripts/stable_abi.py +++ b/Tools/scripts/stable_abi.py @@ -22,9 +22,7 @@ "genobject.h", "longintrepr.h", "parsetok.h", - "pyarena.h", "pyatomic.h", - "pyctype.h", "pydebug.h", "pytime.h", "symtable.h", From 2d00e2bfe1998b36f6665aa590b5dfae49146387 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 18 Feb 2021 12:35:37 +0100 Subject: [PATCH 1166/1261] bpo-42990: Add __builtins__ attribute to functions (GH-24559) Expose the new PyFunctionObject.func_builtins member in Python as a new __builtins__ attribute on functions. Document also the behavior change in What's New in Python 3.10. --- Doc/library/inspect.rst | 6 ++++++ Doc/whatsnew/3.10.rst | 5 +++++ Lib/test/test_collections.py | 7 ++++--- Lib/test/test_funcattrs.py | 5 +++++ .../2021-02-17-19-02-21.bpo-42990.SKXHiI.rst | 3 +++ Objects/funcobject.c | 1 + 6 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 850d6018bab1f9..10339641c3b435 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -95,6 +95,8 @@ attributes: | | __globals__ | global namespace in which | | | | this function was defined | +-----------+-------------------+---------------------------+ +| | __builtins__ | builtins namespace | ++-----------+-------------------+---------------------------+ | | __annotations__ | mapping of parameters | | | | names to annotations; | | | | ``"return"`` key is | @@ -251,6 +253,10 @@ attributes: Add ``cr_origin`` attribute to coroutines. +.. versionchanged:: 3.10 + + Add ``__builtins__`` attribute to functions. + .. function:: getmembers(object[, predicate]) Return all the members of an object in a list of ``(name, value)`` diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 0fba27c7d5845c..b903b3e0b81d9f 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -280,6 +280,11 @@ Other Language Changes * Assignment expressions can now be used unparenthesized within set literals and set comprehensions, as well as in sequence indexes (but not slices). +* Functions have a new ``__builtins__`` attribute which is used to look for + builtin symbols when a function is executed, instead of looking into + ``__globals__['__builtins__']``. + (Contributed by Mark Shannon in :issue:`42990`.) + New Modules =========== diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index befb7ab436c40a..54a4cbed44e379 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -682,9 +682,10 @@ class NewPoint(tuple): self.assertEqual(np.y, 2) def test_new_builtins_issue_43102(self): - self.assertEqual( - namedtuple('C', ()).__new__.__globals__['__builtins__'], - {}) + obj = namedtuple('C', ()) + new_func = obj.__new__ + self.assertEqual(new_func.__globals__['__builtins__'], {}) + self.assertEqual(new_func.__builtins__, {}) ################################################################################ diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py index 11d68cc75e2089..15cf250f192a95 100644 --- a/Lib/test/test_funcattrs.py +++ b/Lib/test/test_funcattrs.py @@ -73,6 +73,11 @@ def test___globals__(self): self.cannot_set_attr(self.b, '__globals__', 2, (AttributeError, TypeError)) + def test___builtins__(self): + self.assertIs(self.b.__builtins__, __builtins__) + self.cannot_set_attr(self.b, '__builtins__', 2, + (AttributeError, TypeError)) + def test___closure__(self): a = 12 def f(): print(a) diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst new file mode 100644 index 00000000000000..cc17154762a917 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst @@ -0,0 +1,3 @@ +Functions have a new ``__builtins__`` attribute which is used to look for +builtin symbols when a function is executed, instead of looking into +``__globals__['__builtins__']``. Patch by Mark Shannon and Victor Stinner. diff --git a/Objects/funcobject.c b/Objects/funcobject.c index b331c4c4d6e351..523930da8dc624 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -250,6 +250,7 @@ static PyMemberDef func_memberlist[] = { {"__doc__", T_OBJECT, OFF(func_doc), 0}, {"__globals__", T_OBJECT, OFF(func_globals), READONLY}, {"__module__", T_OBJECT, OFF(func_module), 0}, + {"__builtins__", T_OBJECT, OFF(func_builtins), READONLY}, {NULL} /* Sentinel */ }; From 7fb1192881ad4aa92052fbfe6a2dca3607a32f3b Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Thu, 18 Feb 2021 15:26:20 +0000 Subject: [PATCH 1167/1261] bpo-42960: Add resource.RLIMIT_KQUEUES constant from FreeBSD (GH-24251) --- Doc/library/resource.rst | 8 ++++++++ .../next/Library/2021-01-18-21-07-20.bpo-42960.a7Dote.rst | 1 + Modules/resource.c | 4 ++++ 3 files changed, 13 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2021-01-18-21-07-20.bpo-42960.a7Dote.rst diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst index e4eac43642d14d..00ff3b5dd3b6a3 100644 --- a/Doc/library/resource.rst +++ b/Doc/library/resource.rst @@ -255,6 +255,14 @@ platform. .. versionadded:: 3.4 +.. data:: RLIMIT_KQUEUES + + The maximum number of kqueues this user id is allowed to create. + + .. availability:: FreeBSD 11 or later. + + .. versionadded:: 3.10 + Resource Usage -------------- diff --git a/Misc/NEWS.d/next/Library/2021-01-18-21-07-20.bpo-42960.a7Dote.rst b/Misc/NEWS.d/next/Library/2021-01-18-21-07-20.bpo-42960.a7Dote.rst new file mode 100644 index 00000000000000..58c1bcc85ef703 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-01-18-21-07-20.bpo-42960.a7Dote.rst @@ -0,0 +1 @@ +Adds :data:`resource.RLIMIT_KQUEUES` constant from FreeBSD to the :mod:`resource` module. diff --git a/Modules/resource.c b/Modules/resource.c index f10a80f4776863..0d69c2983b4d18 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -480,6 +480,10 @@ resource_exec(PyObject *module) ADD_INT(module, RLIMIT_NPTS); #endif +#ifdef RLIMIT_KQUEUES + ADD_INT(module, RLIMIT_KQUEUES); +#endif + PyObject *v; if (sizeof(RLIM_INFINITY) > sizeof(long)) { v = PyLong_FromLongLong((long long) RLIM_INFINITY); From 4417d7c4545c8941408d3a67c62551a04f44b528 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Thu, 18 Feb 2021 16:44:43 +0100 Subject: [PATCH 1168/1261] bpo-43249: sqlite3_column_bytes() must follow sqlite_column_blob() (GH-24562) --- Modules/_sqlite/cursor.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index f8fe11ed1ea75b..63176b81b10efb 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -278,9 +278,15 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) converter = Py_None; } + /* + * Note, sqlite3_column_bytes() must come after sqlite3_column_blob() + * or sqlite3_column_text(). + * + * See https://sqlite.org/c3ref/column_blob.html for details. + */ if (converter != Py_None) { - nbytes = sqlite3_column_bytes(self->statement->st, i); val_str = (const char*)sqlite3_column_blob(self->statement->st, i); + nbytes = sqlite3_column_bytes(self->statement->st, i); if (!val_str) { converted = Py_NewRef(Py_None); } else { @@ -330,9 +336,13 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) } } else { /* coltype == SQLITE_BLOB */ - nbytes = sqlite3_column_bytes(self->statement->st, i); - converted = PyBytes_FromStringAndSize( - sqlite3_column_blob(self->statement->st, i), nbytes); + const char *blob = sqlite3_column_blob(self->statement->st, i); + if (!blob) { + converted = Py_NewRef(Py_None); + } else { + nbytes = sqlite3_column_bytes(self->statement->st, i); + converted = PyBytes_FromStringAndSize(blob, nbytes); + } } } From f5ab25577cdde1da54a348b9dc370dd928f230f6 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Thu, 18 Feb 2021 18:13:14 +0100 Subject: [PATCH 1169/1261] bpo-43249: Improve scoping in _pysqlite_fetch_one_row() (GH-24565) --- Modules/_sqlite/cursor.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 63176b81b10efb..d1578ad6aafb81 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -249,7 +249,6 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) PyObject* converter; PyObject* converted; Py_ssize_t nbytes; - const char* val_str; char buf[200]; const char* colname; PyObject* error_msg; @@ -285,12 +284,12 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) * See https://sqlite.org/c3ref/column_blob.html for details. */ if (converter != Py_None) { - val_str = (const char*)sqlite3_column_blob(self->statement->st, i); + const char *blob = (const char*)sqlite3_column_blob(self->statement->st, i); nbytes = sqlite3_column_bytes(self->statement->st, i); - if (!val_str) { + if (!blob) { converted = Py_NewRef(Py_None); } else { - item = PyBytes_FromStringAndSize(val_str, nbytes); + item = PyBytes_FromStringAndSize(blob, nbytes); if (!item) goto error; converted = PyObject_CallOneArg(converter, item); @@ -307,10 +306,10 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) } else if (coltype == SQLITE_FLOAT) { converted = PyFloat_FromDouble(sqlite3_column_double(self->statement->st, i)); } else if (coltype == SQLITE_TEXT) { - val_str = (const char*)sqlite3_column_text(self->statement->st, i); + const char *text = (const char*)sqlite3_column_text(self->statement->st, i); nbytes = sqlite3_column_bytes(self->statement->st, i); if (self->connection->text_factory == (PyObject*)&PyUnicode_Type) { - converted = PyUnicode_FromStringAndSize(val_str, nbytes); + converted = PyUnicode_FromStringAndSize(text, nbytes); if (!converted && PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { PyErr_Clear(); colname = sqlite3_column_name(self->statement->st, i); @@ -318,7 +317,7 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) colname = ""; } PyOS_snprintf(buf, sizeof(buf) - 1, "Could not decode to UTF-8 column '%s' with text '%s'", - colname , val_str); + colname , text); error_msg = PyUnicode_Decode(buf, strlen(buf), "ascii", "replace"); if (!error_msg) { PyErr_SetString(pysqlite_OperationalError, "Could not decode to UTF-8"); @@ -328,11 +327,11 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) } } } else if (self->connection->text_factory == (PyObject*)&PyBytes_Type) { - converted = PyBytes_FromStringAndSize(val_str, nbytes); + converted = PyBytes_FromStringAndSize(text, nbytes); } else if (self->connection->text_factory == (PyObject*)&PyByteArray_Type) { - converted = PyByteArray_FromStringAndSize(val_str, nbytes); + converted = PyByteArray_FromStringAndSize(text, nbytes); } else { - converted = PyObject_CallFunction(self->connection->text_factory, "y#", val_str, nbytes); + converted = PyObject_CallFunction(self->connection->text_factory, "y#", text, nbytes); } } else { /* coltype == SQLITE_BLOB */ From d54f79054384f4ec4d585d7be0102f2f3b2dcaf9 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 18 Feb 2021 19:20:16 +0100 Subject: [PATCH 1170/1261] bpo-42990: Refactor _PyFrame_New_NoTrack() (GH-24566) * Refactor _PyFrame_New_NoTrack() and PyFunction_NewWithQualName() code. * PyFrame_New() checks for _PyEval_BuiltinsFromGlobals() failure. * Fix a ref leak in _PyEval_BuiltinsFromGlobals() error path. * Complete PyFunction_GetModule() documentation: it returns a borrowed reference and it can return NULL. * Move _PyEval_BuiltinsFromGlobals() definition to the internal C API. * PyFunction_NewWithQualName() uses _Py_IDENTIFIER() API for the "__name__" string to make it compatible with subinterpreters. --- Doc/c-api/function.rst | 8 ++- Include/cpython/frameobject.h | 2 - Include/internal/pycore_ceval.h | 5 +- Objects/frameobject.c | 94 +++++++++++++-------------- Objects/funcobject.c | 111 +++++++++++++++++--------------- Python/ceval.c | 6 +- 6 files changed, 114 insertions(+), 112 deletions(-) diff --git a/Doc/c-api/function.rst b/Doc/c-api/function.rst index 20968828e0bb36..ad008425f38116 100644 --- a/Doc/c-api/function.rst +++ b/Doc/c-api/function.rst @@ -61,9 +61,11 @@ There are a few functions specific to Python functions. .. c:function:: PyObject* PyFunction_GetModule(PyObject *op) - Return the *__module__* attribute of the function object *op*. This is normally - a string containing the module name, but can be set to any other object by - Python code. + Return a :term:`borrowed reference` to the *__module__* attribute of the + function object *op*. It can be *NULL*. + + This is normally a string containing the module name, but can be set to any + other object by Python code. .. c:function:: PyObject* PyFunction_GetDefaults(PyObject *op) diff --git a/Include/cpython/frameobject.h b/Include/cpython/frameobject.h index 5a19c006d91531..5122ec41a3d22a 100644 --- a/Include/cpython/frameobject.h +++ b/Include/cpython/frameobject.h @@ -92,5 +92,3 @@ PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); PyAPI_FUNC(PyFrameObject *) PyFrame_GetBack(PyFrameObject *frame); - -PyObject *_PyEval_BuiltinsFromGlobals(PyObject *globals); diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 0491d48a789ebf..bb22322114ecb0 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -31,9 +31,12 @@ PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth( PyThreadState *tstate, int new_depth); -/* Private function */ void _PyEval_Fini(void); + +extern PyObject *_PyEval_BuiltinsFromGlobals(PyObject *globals); + + static inline PyObject* _PyEval_EvalFrame(PyThreadState *tstate, PyFrameObject *f, int throwflag) { diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 57105e1a9eb1e0..5f7fa40ff6e0e4 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -1,12 +1,11 @@ /* Frame object implementation */ #include "Python.h" -#include "pycore_object.h" -#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_ceval.h" // _PyEval_BuiltinsFromGlobals() +#include "pycore_object.h" // _PyObject_GC_UNTRACK() -#include "code.h" -#include "frameobject.h" -#include "opcode.h" +#include "frameobject.h" // PyFrameObject +#include "opcode.h" // EXTENDED_ARG #include "structmember.h" // PyMemberDef #define OFF(x) offsetof(PyFrameObject, x) @@ -762,9 +761,7 @@ _Py_IDENTIFIER(__builtins__); static inline PyFrameObject* frame_alloc(PyCodeObject *code) { - PyFrameObject *f; - - f = code->co_zombieframe; + PyFrameObject *f = code->co_zombieframe; if (f != NULL) { code->co_zombieframe = NULL; _Py_NewReference((PyObject *)f); @@ -803,14 +800,11 @@ frame_alloc(PyCodeObject *code) _Py_NewReference((PyObject *)f); } - f->f_code = code; extras = code->co_nlocals + ncells + nfrees; f->f_valuestack = f->f_localsplus + extras; - for (Py_ssize_t i=0; if_localsplus[i] = NULL; } - f->f_locals = NULL; - f->f_trace = NULL; return f; } @@ -818,42 +812,33 @@ frame_alloc(PyCodeObject *code) PyFrameObject* _Py_HOT_FUNCTION _PyFrame_New_NoTrack(PyThreadState *tstate, PyFrameConstructor *con, PyObject *locals) { -#ifdef Py_DEBUG - if (con == NULL || con->fc_code == NULL || - (locals != NULL && !PyMapping_Check(locals))) { - PyErr_BadInternalCall(); - return NULL; - } -#endif - - PyFrameObject *back = tstate->frame; + assert(con != NULL); + assert(con->fc_globals != NULL); + assert(con->fc_builtins != NULL); + assert(con->fc_code != NULL); + assert(locals == NULL || PyMapping_Check(locals)); PyFrameObject *f = frame_alloc((PyCodeObject *)con->fc_code); if (f == NULL) { return NULL; } + f->f_back = (PyFrameObject*)Py_XNewRef(tstate->frame); + f->f_code = (PyCodeObject *)Py_NewRef(con->fc_code); + f->f_builtins = Py_NewRef(con->fc_builtins); + f->f_globals = Py_NewRef(con->fc_globals); + f->f_locals = Py_XNewRef(locals); + // f_valuestack initialized by frame_alloc() + f->f_trace = NULL; f->f_stackdepth = 0; - Py_INCREF(con->fc_builtins); - f->f_builtins = con->fc_builtins; - Py_XINCREF(back); - f->f_back = back; - Py_INCREF(con->fc_code); - Py_INCREF(con->fc_globals); - f->f_globals = con->fc_globals; - Py_XINCREF(locals); - f->f_locals = locals; - + f->f_trace_lines = 1; + f->f_trace_opcodes = 0; + f->f_gen = NULL; f->f_lasti = -1; f->f_lineno = 0; f->f_iblock = 0; f->f_state = FRAME_CREATED; - f->f_gen = NULL; - f->f_trace_opcodes = 0; - f->f_trace_lines = 1; - - assert(f->f_code != NULL); - + // f_blockstack and f_localsplus initialized by frame_alloc() return f; } @@ -863,6 +848,9 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals, PyObject *locals) { PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); + if (builtins == NULL) { + return NULL; + } PyFrameConstructor desc = { .fc_globals = globals, .fc_builtins = builtins, @@ -875,8 +863,9 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, }; PyFrameObject *f = _PyFrame_New_NoTrack(tstate, &desc, locals); Py_DECREF(builtins); - if (f) + if (f) { _PyObject_GC_TRACK(f); + } return f; } @@ -1173,27 +1162,30 @@ PyFrame_GetBack(PyFrameObject *frame) return back; } -PyObject *_PyEval_BuiltinsFromGlobals(PyObject *globals) { +PyObject* +_PyEval_BuiltinsFromGlobals(PyObject *globals) +{ PyObject *builtins = _PyDict_GetItemIdWithError(globals, &PyId___builtins__); if (builtins) { if (PyModule_Check(builtins)) { builtins = PyModule_GetDict(builtins); assert(builtins != NULL); } + return Py_NewRef(builtins); } + + if (PyErr_Occurred()) { + return NULL; + } + + /* No builtins! Make up a minimal one. Give them 'None', at least. */ + builtins = PyDict_New(); if (builtins == NULL) { - if (PyErr_Occurred()) { - return NULL; - } - /* No builtins! Make up a minimal one - Give them 'None', at least. */ - builtins = PyDict_New(); - if (builtins == NULL || - PyDict_SetItemString( - builtins, "None", Py_None) < 0) - return NULL; + return NULL; + } + if (PyDict_SetItemString(builtins, "None", Py_None) < 0) { + Py_DECREF(builtins); + return NULL; } - else - Py_INCREF(builtins); return builtins; } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 523930da8dc624..4b92f6c0342d92 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -2,83 +2,90 @@ /* Function object implementation */ #include "Python.h" -#include "pycore_object.h" -#include "frameobject.h" -#include "code.h" +#include "pycore_ceval.h" // _PyEval_BuiltinsFromGlobals() +#include "pycore_object.h" // _PyObject_GC_UNTRACK() #include "structmember.h" // PyMemberDef PyObject * PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname) { - PyFunctionObject *op; - PyObject *doc, *consts, *module; - static PyObject *__name__ = NULL; + assert(globals != NULL); + assert(PyDict_Check(globals)); + Py_INCREF(globals); - if (__name__ == NULL) { - __name__ = PyUnicode_InternFromString("__name__"); - if (__name__ == NULL) - return NULL; + PyCodeObject *code_obj = (PyCodeObject *)code; + Py_INCREF(code_obj); + + PyObject *name = code_obj->co_name; + assert(name != NULL); + Py_INCREF(name); + if (!qualname) { + qualname = name; } + Py_INCREF(qualname); - /* __module__: If module name is in globals, use it. - Otherwise, use None. */ - module = PyDict_GetItemWithError(globals, __name__); - if (module) { - Py_INCREF(module); + PyObject *consts = code_obj->co_consts; + assert(PyTuple_Check(consts)); + PyObject *doc; + if (PyTuple_Size(consts) >= 1) { + doc = PyTuple_GetItem(consts, 0); + if (!PyUnicode_Check(doc)) { + doc = Py_None; + } } - else if (PyErr_Occurred()) { - return NULL; + else { + doc = Py_None; + } + Py_INCREF(doc); + + // __module__: Use globals['__name__'] if it exists, or NULL. + _Py_IDENTIFIER(__name__); + PyObject *module = _PyDict_GetItemIdWithError(globals, &PyId___name__); + PyObject *builtins = NULL; + if (module == NULL && PyErr_Occurred()) { + goto error; + } + Py_XINCREF(module); + + builtins = _PyEval_BuiltinsFromGlobals(globals); + if (builtins == NULL) { + goto error; } - op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type); + PyFunctionObject *op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type); if (op == NULL) { - Py_XDECREF(module); - return NULL; + goto error; } /* Note: No failures from this point on, since func_dealloc() does not expect a partially-created object. */ - op->func_weakreflist = NULL; - Py_INCREF(code); - op->func_code = code; - assert(globals != NULL); - Py_INCREF(globals); op->func_globals = globals; - PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); - if (builtins == NULL) { - return NULL; - } op->func_builtins = builtins; - op->func_name = ((PyCodeObject *)code)->co_name; - Py_INCREF(op->func_name); - op->func_defaults = NULL; /* No default arguments */ - op->func_kwdefaults = NULL; /* No keyword only defaults */ + op->func_name = name; + op->func_qualname = qualname; + op->func_code = (PyObject*)code_obj; + op->func_defaults = NULL; // No default positional arguments + op->func_kwdefaults = NULL; // No default keyword arguments op->func_closure = NULL; - op->vectorcall = _PyFunction_Vectorcall; - op->func_module = module; - - consts = ((PyCodeObject *)code)->co_consts; - if (PyTuple_Size(consts) >= 1) { - doc = PyTuple_GetItem(consts, 0); - if (!PyUnicode_Check(doc)) - doc = Py_None; - } - else - doc = Py_None; - Py_INCREF(doc); op->func_doc = doc; - op->func_dict = NULL; + op->func_weakreflist = NULL; + op->func_module = module; op->func_annotations = NULL; - - if (qualname) - op->func_qualname = qualname; - else - op->func_qualname = op->func_name; - Py_INCREF(op->func_qualname); + op->vectorcall = _PyFunction_Vectorcall; _PyObject_GC_TRACK(op); return (PyObject *)op; + +error: + Py_DECREF(globals); + Py_DECREF(code_obj); + Py_DECREF(name); + Py_DECREF(qualname); + Py_DECREF(doc); + Py_XDECREF(module); + Py_XDECREF(builtins); + return NULL; } PyObject * diff --git a/Python/ceval.c b/Python/ceval.c index 9e4c2666ac6f74..0b7400359e001b 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -908,7 +908,7 @@ PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) .fc_closure = NULL }; PyThreadState *tstate = PyThreadState_GET(); - PyObject *res =_PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL); + PyObject *res = _PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL); Py_DECREF(builtins); return res; } @@ -4800,8 +4800,8 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, }; PyThreadState *tstate = _PyThreadState_GET(); res = _PyEval_Vector(tstate, &constr, locals, - allargs, argcount, - kwnames); + allargs, argcount, + kwnames); if (kwcount) { Py_DECREF(kwnames); PyMem_Free(newargs); From 35e1b3c6d64f99b1493f6634d2c4467354001ab3 Mon Sep 17 00:00:00 2001 From: Jeremy Paige Date: Thu, 18 Feb 2021 11:43:35 -0800 Subject: [PATCH 1171/1261] Remove all links to mingw.org (GH-24552) This lease on this domain has lapsed. This not only makes these dead links, but a potential attack vector for readers of python.org as the domain can be obtained by an untrustworthy party. I considered redirecting these links to http://mingw-w64.org/ which is a maintained fork of mingw, but beyond my unfamiliarity with the exact level of compatibility, at the time of this PR that site had an expired cert and so is not much of a vulnerability fix. Automerge-Triggered-By: GH:Mariatta --- Doc/install/index.rst | 3 +-- Doc/using/windows.rst | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Doc/install/index.rst b/Doc/install/index.rst index b6b7085fb35aa9..48c6e76a682a46 100644 --- a/Doc/install/index.rst +++ b/Doc/install/index.rst @@ -1071,8 +1071,7 @@ normal libraries do. .. [#] This also means you could replace all existing COFF-libraries with OMF-libraries of the same name. -.. [#] Check https://www.sourceware.org/cygwin/ and http://www.mingw.org/ for more - information +.. [#] Check https://www.sourceware.org/cygwin/ for more information .. [#] Then you have no POSIX emulation available, but you also don't need :file:`cygwin1.dll`. diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 0f713fcab4be8b..3d638642f30080 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -1149,8 +1149,6 @@ For extension modules, consult :ref:`building-on-windows`. MinGW gcc under Windows" or "Installing Python extension with distutils and without Microsoft Visual C++" by Sébastien Sauvage, 2003 - `MingW -- Python extensions `_ - Other Platforms =============== From af69662f19615e032bf5fa0a081e87d8a56fc9d2 Mon Sep 17 00:00:00 2001 From: Neil Schemenauer Date: Thu, 18 Feb 2021 16:49:12 -0800 Subject: [PATCH 1172/1261] bpo-39448: Add regen-frozen makefile target. (GH-18174) Add the "regen-frozen" makefile target that regenerates the code for the frozen __hello__ module. --- Lib/ctypes/test/test_values.py | 6 +-- Makefile.pre.in | 9 +++- .../2020-01-24-12-54-22.bpo-39448.k4pv14.rst | 2 + Python/frozen.c | 22 +++----- Python/frozen_hello.h | 13 +++++ Tools/freeze/regen_frozen.py | 51 +++++++++++++++++++ 6 files changed, 82 insertions(+), 21 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-01-24-12-54-22.bpo-39448.k4pv14.rst create mode 100644 Python/frozen_hello.h create mode 100644 Tools/freeze/regen_frozen.py diff --git a/Lib/ctypes/test/test_values.py b/Lib/ctypes/test/test_values.py index 87eb9198ade0c7..44128298390d98 100644 --- a/Lib/ctypes/test/test_values.py +++ b/Lib/ctypes/test/test_values.py @@ -80,9 +80,9 @@ class struct_frozen(Structure): continue items.append((entry.name.decode("ascii"), entry.size)) - expected = [("__hello__", 141), - ("__phello__", -141), - ("__phello__.spam", 141), + expected = [("__hello__", 125), + ("__phello__", -125), + ("__phello__.spam", 125), ] self.assertEqual(items, expected, "PyImport_FrozenModules example " "in Doc/library/ctypes.rst may be out of date") diff --git a/Makefile.pre.in b/Makefile.pre.in index 593da93a6bc2aa..e4ac248d1f02e8 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -761,7 +761,7 @@ regen-limited-abi: all regen-all: regen-opcode regen-opcode-targets regen-typeslots \ regen-token regen-ast regen-keyword regen-importlib clinic \ - regen-pegen-metaparser regen-pegen + regen-pegen-metaparser regen-pegen regen-frozen @echo @echo "Note: make regen-stdlib-module-names and autoconf should be run manually" @@ -870,6 +870,11 @@ regen-opcode: $(srcdir)/Include/opcode.h.new $(UPDATE_FILE) $(srcdir)/Include/opcode.h $(srcdir)/Include/opcode.h.new +.PHONY: regen-frozen +regen-frozen: + # Regenerate code for frozen module "__hello__". + $(PYTHON_FOR_REGEN) $(srcdir)/Tools/freeze/regen_frozen.py $(srcdir)/Python/frozen_hello.h + .PHONY: regen-token regen-token: # Regenerate Doc/library/token-list.inc from Grammar/Tokens @@ -974,7 +979,7 @@ Python/ceval.o: $(srcdir)/Python/opcode_targets.h $(srcdir)/Python/ceval_gil.h \ $(srcdir)/Python/condvar.h Python/frozen.o: $(srcdir)/Python/importlib.h $(srcdir)/Python/importlib_external.h \ - $(srcdir)/Python/importlib_zipimport.h + $(srcdir)/Python/importlib_zipimport.h $(srcdir)/Python/frozen_hello.h # Generate DTrace probe macros, then rename them (PYTHON_ -> PyDTrace_) to # follow our naming conventions. dtrace(1) uses the output filename to generate diff --git a/Misc/NEWS.d/next/Build/2020-01-24-12-54-22.bpo-39448.k4pv14.rst b/Misc/NEWS.d/next/Build/2020-01-24-12-54-22.bpo-39448.k4pv14.rst new file mode 100644 index 00000000000000..2a0dc0e2cd6cb5 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-01-24-12-54-22.bpo-39448.k4pv14.rst @@ -0,0 +1,2 @@ +Add the "regen-frozen" makefile target that regenerates the code for the +frozen ``__hello__`` module. diff --git a/Python/frozen.c b/Python/frozen.c index 228a11019cfa6a..d4104e166401ad 100644 --- a/Python/frozen.c +++ b/Python/frozen.c @@ -1,5 +1,5 @@ -/* Dummy frozen modules initializer */ +/* Frozen modules initializer */ #include "Python.h" #include "importlib.h" @@ -10,21 +10,11 @@ define a single frozen module, __hello__. Loading it will print some famous words... */ -/* To regenerate this data after the bytecode or marshal format has changed, - go to ../Tools/freeze/ and freeze the flag.py file; then copy and paste - the appropriate bytes from M___main__.c. */ - -static unsigned char M___hello__[] = { - 227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,64,0,0,0,115,16,0,0,0,100,0, - 90,0,101,1,100,1,131,1,1,0,100,2,83,0,41,3, - 84,122,12,72,101,108,108,111,32,119,111,114,108,100,33,78, - 41,2,218,11,105,110,105,116,105,97,108,105,122,101,100,218, - 5,112,114,105,110,116,169,0,114,3,0,0,0,114,3,0, - 0,0,250,20,84,111,111,108,115,47,102,114,101,101,122,101, - 47,102,108,97,103,46,112,121,218,8,60,109,111,100,117,108, - 101,62,1,0,0,0,115,2,0,0,0,4,1, -}; +/* Run "make regen-frozen" to regen the file below (e.g. after a bytecode + * format change). The file is created by Tools/frozen/regen_frozen.py. The + * include file defines M___hello__ as an array of bytes. + */ +#include "frozen_hello.h" #define SIZE (int)sizeof(M___hello__) diff --git a/Python/frozen_hello.h b/Python/frozen_hello.h new file mode 100644 index 00000000000000..9c566cc81ebf00 --- /dev/null +++ b/Python/frozen_hello.h @@ -0,0 +1,13 @@ +/* Generated with Tools/freeze/regen_frozen.py */ +static unsigned char M___hello__[] = { + 227,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,64,0,0,0,115, + 16,0,0,0,100,0,90,0,101,1,100,1,131, + 1,1,0,100,2,83,0,41,3,84,122,12,72, + 101,108,108,111,32,119,111,114,108,100,33,78,41, + 2,90,11,105,110,105,116,105,97,108,105,122,101, + 100,218,5,112,114,105,110,116,169,0,114,2,0, + 0,0,114,2,0,0,0,218,4,110,111,110,101, + 218,8,60,109,111,100,117,108,101,62,1,0,0, + 0,115,2,0,0,0,4,1, +}; diff --git a/Tools/freeze/regen_frozen.py b/Tools/freeze/regen_frozen.py new file mode 100644 index 00000000000000..391182ac88a385 --- /dev/null +++ b/Tools/freeze/regen_frozen.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +import sys +import os +import marshal + + +DIR = os.path.dirname(sys.argv[0]) +# source code for module to freeze +FILE = os.path.join(DIR, 'flag.py') +# C symbol to use for array holding frozen bytes +SYMBOL = 'M___hello__' + + +def get_module_code(filename): + """Compile 'filename' and return the module code as a marshalled byte + string. + """ + with open(filename, 'r') as fp: + src = fp.read() + co = compile(src, 'none', 'exec') + co_bytes = marshal.dumps(co) + return co_bytes + + +def gen_c_code(fp, co_bytes): + """Generate C code for the module code in 'co_bytes', write it to 'fp'. + """ + def write(*args, **kwargs): + print(*args, **kwargs, file=fp) + write('/* Generated with Tools/freeze/regen_frozen.py */') + write('static unsigned char %s[] = {' % SYMBOL, end='') + bytes_per_row = 13 + for i, opcode in enumerate(co_bytes): + if (i % bytes_per_row) == 0: + # start a new row + write() + write(' ', end='') + write('%d,' % opcode, end='') + write() + write('};') + + +def main(): + out_filename = sys.argv[1] + co_bytes = get_module_code(FILE) + with open(out_filename, 'w') as fp: + gen_c_code(fp, co_bytes) + + +if __name__ == '__main__': + main() From c563af5e6c02aff692ce6285e503144ef5cbde75 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Fri, 19 Feb 2021 02:53:33 +0100 Subject: [PATCH 1173/1261] closes bpo-43254: Fix *snprintf() man page refs. (GH-24563) --- Doc/c-api/conversion.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index efbaa52e2dc466..e47072f04747ab 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -11,14 +11,14 @@ Functions for number conversion and formatted string output. .. c:function:: int PyOS_snprintf(char *str, size_t size, const char *format, ...) Output not more than *size* bytes to *str* according to the format string - *format* and the extra arguments. See the Unix man page :manpage:`snprintf(2)`. + *format* and the extra arguments. See the Unix man page :manpage:`snprintf(3)`. .. c:function:: int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) Output not more than *size* bytes to *str* according to the format string *format* and the variable argument list *va*. Unix man page - :manpage:`vsnprintf(2)`. + :manpage:`vsnprintf(3)`. :c:func:`PyOS_snprintf` and :c:func:`PyOS_vsnprintf` wrap the Standard C library functions :c:func:`snprintf` and :c:func:`vsnprintf`. Their purpose is to From 21b91f3f8851792f2946b73b424294ab4a62b12a Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Fri, 19 Feb 2021 12:20:32 +0100 Subject: [PATCH 1174/1261] bpo-43258: Don't allocate sqlite3 aggregate context for empty queries (GH-24569) --- Lib/sqlite3/test/userfunctions.py | 5 +++++ .../next/Library/2021-02-18-23-30-52.bpo-43258.LeU-q8.rst | 2 ++ Modules/_sqlite/connection.c | 8 ++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-02-18-23-30-52.bpo-43258.LeU-q8.rst diff --git a/Lib/sqlite3/test/userfunctions.py b/Lib/sqlite3/test/userfunctions.py index 2285abd4fd8a57..749ea049c834a8 100644 --- a/Lib/sqlite3/test/userfunctions.py +++ b/Lib/sqlite3/test/userfunctions.py @@ -429,6 +429,11 @@ def test_aggr_check_aggr_sum(self): val = cur.fetchone()[0] self.assertEqual(val, 60) + def test_aggr_no_match(self): + cur = self.con.execute("select mysum(i) from (select 1 as i) where i == 0") + val = cur.fetchone()[0] + self.assertIsNone(val) + class AuthorizerTests(unittest.TestCase): @staticmethod def authorizer_cb(action, arg1, arg2, dbname, source): diff --git a/Misc/NEWS.d/next/Library/2021-02-18-23-30-52.bpo-43258.LeU-q8.rst b/Misc/NEWS.d/next/Library/2021-02-18-23-30-52.bpo-43258.LeU-q8.rst new file mode 100644 index 00000000000000..0529214718c445 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-18-23-30-52.bpo-43258.LeU-q8.rst @@ -0,0 +1,2 @@ +Prevent needless allocation of :mod:`sqlite3` aggregate function context +when no rows match an aggregate query. Patch by Erlend E. Aasland. diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 63fcb0055de2c9..39b55fc60da422 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -708,8 +708,12 @@ void _pysqlite_final_callback(sqlite3_context* context) threadstate = PyGILState_Ensure(); - aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*)); - if (!*aggregate_instance) { + aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, 0); + if (aggregate_instance == NULL) { + /* No rows matched the query; the step handler was never called. */ + goto error; + } + else if (!*aggregate_instance) { /* this branch is executed if there was an exception in the aggregate's * __init__ */ From b8ac4480c700846ec7974a1d3b068faf8321fc14 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Fri, 19 Feb 2021 12:59:24 +0100 Subject: [PATCH 1175/1261] bpo-43258: Make sqlite3 callback functions static (GH-24574) --- Modules/_sqlite/connection.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 39b55fc60da422..81f12e83c2fe11 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -600,7 +600,8 @@ PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_ return args; } -void _pysqlite_func_callback(sqlite3_context* context, int argc, sqlite3_value** argv) +static void +_pysqlite_func_callback(sqlite3_context *context, int argc, sqlite3_value **argv) { PyObject* args; PyObject* py_func; @@ -696,7 +697,8 @@ static void _pysqlite_step_callback(sqlite3_context *context, int argc, sqlite3_ PyGILState_Release(threadstate); } -void _pysqlite_final_callback(sqlite3_context* context) +static void +_pysqlite_final_callback(sqlite3_context *context) { PyObject* function_result; PyObject** aggregate_instance; From 33353c50995d3707513933010a82e5bc6a1a0cf7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 19 Feb 2021 13:21:28 +0100 Subject: [PATCH 1176/1261] bpo-43268: Replace _PyThreadState_GET() with _PyInterpreterState_GET() (GH-24576) Replace _PyThreadState_GET() with _PyInterpreterState_GET() in functions which only need the current interpreter, but don't need the current Python thread state. Replace also _PyThreadState_UncheckedGet() with _PyThreadState_GET() in faulthandler.c, since _PyThreadState_UncheckedGet() is just an alias to _PyThreadState_GET() in practice. --- Include/internal/pycore_long.h | 7 ++----- Include/internal/pycore_object.h | 10 +++++----- Modules/faulthandler.c | 3 ++- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index ec95786531c850..a785b23a92b8c1 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -14,13 +14,10 @@ extern "C" { // Don't call this function but _PyLong_GetZero() and _PyLong_GetOne() static inline PyObject* __PyLong_GetSmallInt_internal(int value) { - PyThreadState *tstate = _PyThreadState_GET(); -#ifdef Py_DEBUG - _Py_EnsureTstateNotNULL(tstate); -#endif + PyInterpreterState *interp = _PyInterpreterState_GET(); assert(-_PY_NSMALLNEGINTS <= value && value < _PY_NSMALLPOSINTS); size_t index = _PY_NSMALLNEGINTS + value; - PyObject *obj = (PyObject*)tstate->interp->small_ints[index]; + PyObject *obj = (PyObject*)interp->small_ints[index]; // _PyLong_GetZero() and _PyLong_GetOne() must not be called // before _PyLong_Init() nor after _PyLong_Fini() assert(obj != NULL); diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 3cd27b035c2c78..79c1c44ae72d60 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -8,9 +8,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() -#include "pycore_interp.h" // PyInterpreterState.gc -#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_interp.h" // PyInterpreterState.gc +#include "pycore_pystate.h" // _PyInterpreterState_GET() PyAPI_FUNC(int) _PyType_CheckConsistency(PyTypeObject *type); PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); @@ -85,8 +85,8 @@ static inline void _PyObject_GC_TRACK( "object is in generation which is garbage collected", filename, lineno, __func__); - PyThreadState *tstate = _PyThreadState_GET(); - PyGC_Head *generation0 = tstate->interp->gc.generation0; + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyGC_Head *generation0 = interp->gc.generation0; PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev); _PyGCHead_SET_NEXT(last, gc); _PyGCHead_SET_PREV(gc, last); diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index da8b7741345de0..350f4cf6b8edff 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1,6 +1,7 @@ #include "Python.h" #include "pycore_initconfig.h" // _PyStatus_ERR #include "pycore_pyerrors.h" // _Py_DumpExtensionModules +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_traceback.h" // _Py_DumpTracebackThreads #include #include @@ -208,7 +209,7 @@ faulthandler_get_fileno(PyObject **file_ptr) static PyThreadState* get_thread_state(void) { - PyThreadState *tstate = _PyThreadState_UncheckedGet(); + PyThreadState *tstate = _PyThreadState_GET(); if (tstate == NULL) { /* just in case but very unlikely... */ PyErr_SetString(PyExc_RuntimeError, From 4985de0fac2554cb46f25fc623e4f710d49b0e78 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 19 Feb 2021 13:21:51 +0100 Subject: [PATCH 1177/1261] bpo-40522: Replace PyThreadState_GET() with PyThreadState_Get() (GH-24575) Use directly the PyThreadState_Get() function in public header files, since PyThreadState_GET() macro is just an alias to it in pratice in these files. --- Include/cpython/abstract.h | 8 ++++---- Include/cpython/object.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index db5055d201107e..db850219645281 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -119,7 +119,7 @@ static inline PyObject * PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) { - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *tstate = PyThreadState_Get(); return _PyObject_VectorcallTstate(tstate, callable, args, nargsf, kwnames); } @@ -155,7 +155,7 @@ _PyObject_FastCallTstate(PyThreadState *tstate, PyObject *func, PyObject *const static inline PyObject * _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) { - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *tstate = PyThreadState_Get(); return _PyObject_FastCallTstate(tstate, func, args, nargs); } @@ -164,7 +164,7 @@ _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) PyObject_CallNoArgs(). */ static inline PyObject * _PyObject_CallNoArg(PyObject *func) { - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *tstate = PyThreadState_Get(); return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); } @@ -179,7 +179,7 @@ PyObject_CallOneArg(PyObject *func, PyObject *arg) assert(arg != NULL); args = _args + 1; // For PY_VECTORCALL_ARGUMENTS_OFFSET args[0] = arg; - tstate = PyThreadState_GET(); + tstate = PyThreadState_Get(); nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET; return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL); } diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 86889f857689c4..58e4d2b11b93f9 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -528,7 +528,7 @@ PyAPI_FUNC(int) _PyTrash_cond(PyObject *op, destructor dealloc); /* If "cond" is false, then _tstate remains NULL and the deallocator \ * is run normally without involving the trashcan */ \ if (cond) { \ - _tstate = PyThreadState_GET(); \ + _tstate = PyThreadState_Get(); \ if (_PyTrash_begin(_tstate, _PyObject_CAST(op))) { \ break; \ } \ From 54eb259956d33bf17e5a686ca14b05a3264f24b1 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 19 Feb 2021 13:33:31 +0100 Subject: [PATCH 1178/1261] bpo-43268: _Py_IsMainInterpreter() now expects interp (GH-24577) The _Py_IsMainInterpreter() function now expects interp rather than tstate. --- Include/internal/pycore_pystate.h | 4 ++-- Objects/longobject.c | 2 +- Objects/typeobject.c | 2 +- Objects/unicodeobject.c | 2 +- Python/ceval.c | 4 ++-- Python/context.c | 2 +- Python/import.c | 2 +- Python/pylifecycle.c | 10 +++++----- Python/pystate.c | 2 +- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 0cd5550cfda5c4..4b894f3eff4967 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -22,11 +22,11 @@ _Py_IsMainThread(void) static inline int -_Py_IsMainInterpreter(PyThreadState* tstate) +_Py_IsMainInterpreter(PyInterpreterState *interp) { /* Use directly _PyRuntime rather than tstate->interp->runtime, since this function is used in performance critical code path (ceval) */ - return (tstate->interp == _PyRuntime.interpreters.main); + return (interp == _PyRuntime.interpreters.main); } diff --git a/Objects/longobject.c b/Objects/longobject.c index 240e92a41e0ec0..c0b4ce079e46aa 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5719,7 +5719,7 @@ _PyLong_Init(PyThreadState *tstate) tstate->interp->small_ints[i] = v; } - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { /* initialize int_info */ if (Int_InfoType.tp_name == NULL) { if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) { diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 3498f0d484e01e..9dbb7bed50b3f9 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -286,7 +286,7 @@ void _PyType_Fini(PyThreadState *tstate) { _PyType_ClearCache(&tstate->interp->type_cache); - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { clear_slotdefs(); } } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 64fd408085d5e5..498f3933dec6a3 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -15701,7 +15701,7 @@ _PyUnicode_Init(PyThreadState *tstate) return _PyStatus_NO_MEMORY(); } - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { /* initialize the linebreak bloom filter */ bloom_linebreak = make_bloom_mask( PyUnicode_2BYTE_KIND, linebreak, diff --git a/Python/ceval.c b/Python/ceval.c index 0b7400359e001b..81a21c9a0f5343 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -298,7 +298,7 @@ PyStatus _PyEval_InitGIL(PyThreadState *tstate) { #ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - if (!_Py_IsMainInterpreter(tstate)) { + if (!_Py_IsMainInterpreter(tstate->interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ @@ -326,7 +326,7 @@ void _PyEval_FiniGIL(PyThreadState *tstate) { #ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - if (!_Py_IsMainInterpreter(tstate)) { + if (!_Py_IsMainInterpreter(tstate->interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ diff --git a/Python/context.c b/Python/context.c index 82826bf928fa05..6a4562149cbec0 100644 --- a/Python/context.c +++ b/Python/context.c @@ -1302,7 +1302,7 @@ _PyContext_ClearFreeList(PyThreadState *tstate) void _PyContext_Fini(PyThreadState *tstate) { - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { Py_CLEAR(_token_missing); } _PyContext_ClearFreeList(tstate); diff --git a/Python/import.c b/Python/import.c index 75ac21df82da94..6189dcfbe0eca0 100644 --- a/Python/import.c +++ b/Python/import.c @@ -441,7 +441,7 @@ _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, return -1; } - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { if (def->m_size == -1) { if (def->m_base.m_copy) { /* Somebody already imported the module, diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index bf5dcdd107e20f..f990fa6f1db3e7 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -430,7 +430,7 @@ interpreter_update_config(PyThreadState *tstate, int only_update_path_config) } } - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { PyStatus status = _PyConfig_WritePathConfig(config); if (_PyStatus_EXCEPTION(status)) { _PyErr_SetFromPyStatus(status); @@ -627,7 +627,7 @@ static PyStatus pycore_init_types(PyThreadState *tstate) { PyStatus status; - int is_main_interp = _Py_IsMainInterpreter(tstate); + int is_main_interp = _Py_IsMainInterpreter(tstate->interp); status = _PyGC_Init(tstate); if (_PyStatus_EXCEPTION(status)) { @@ -1003,7 +1003,7 @@ init_interp_main(PyThreadState *tstate) assert(!_PyErr_Occurred(tstate)); PyStatus status; - int is_main_interp = _Py_IsMainInterpreter(tstate); + int is_main_interp = _Py_IsMainInterpreter(tstate->interp); PyInterpreterState *interp = tstate->interp; const PyConfig *config = _PyInterpreterState_GetConfig(interp); @@ -1597,7 +1597,7 @@ finalize_interp_types(PyThreadState *tstate) static void finalize_interp_clear(PyThreadState *tstate) { - int is_main_interp = _Py_IsMainInterpreter(tstate); + int is_main_interp = _Py_IsMainInterpreter(tstate->interp); /* Clear interpreter state and all thread states */ _PyInterpreterState_Clear(tstate); @@ -1622,7 +1622,7 @@ finalize_interp_clear(PyThreadState *tstate) static void finalize_interp_delete(PyThreadState *tstate) { - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { /* Cleanup auto-thread-state */ _PyGILState_Fini(tstate); } diff --git a/Python/pystate.c b/Python/pystate.c index 922e5bee2cbfca..f4fd03982181b8 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1327,7 +1327,7 @@ PyThreadState_IsCurrent(PyThreadState *tstate) PyStatus _PyGILState_Init(PyThreadState *tstate) { - if (!_Py_IsMainInterpreter(tstate)) { + if (!_Py_IsMainInterpreter(tstate->interp)) { /* Currently, PyGILState is shared by all interpreters. The main * interpreter is responsible to initialize it. */ return _PyStatus_OK(); From b0c712dc73de031d653212d5cc83cc1b486cf6bf Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 19 Feb 2021 15:07:59 +0100 Subject: [PATCH 1179/1261] bpo-43268: Remove abusive usage of tstate in sysmodule.c (#24581) Remove explicit tstate usage in sysmodule.c when it's only used raise exceptions: get it implicitly using PyErr_XXX() functions. --- Python/sysmodule.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/Python/sysmodule.c b/Python/sysmodule.c index b9349effe3c87b..33d4e2bbb6eac8 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -838,8 +838,7 @@ sys_exit_impl(PyObject *module, PyObject *status) /*[clinic end generated code: output=13870986c1ab2ec0 input=b86ca9497baa94f2]*/ { /* Raise SystemExit so callers may catch it or clean up. */ - PyThreadState *tstate = _PyThreadState_GET(); - _PyErr_SetObject(tstate, PyExc_SystemExit, status); + PyErr_SetObject(PyExc_SystemExit, status); return NULL; } @@ -905,15 +904,14 @@ static PyObject * sys_intern_impl(PyObject *module, PyObject *s) /*[clinic end generated code: output=be680c24f5c9e5d6 input=849483c006924e2f]*/ { - PyThreadState *tstate = _PyThreadState_GET(); if (PyUnicode_CheckExact(s)) { Py_INCREF(s); PyUnicode_InternInPlace(&s); return s; } else { - _PyErr_Format(tstate, PyExc_TypeError, - "can't intern %.400s", Py_TYPE(s)->tp_name); + PyErr_Format(PyExc_TypeError, + "can't intern %.400s", Py_TYPE(s)->tp_name); return NULL; } } @@ -1141,10 +1139,9 @@ static PyObject * sys_setswitchinterval_impl(PyObject *module, double interval) /*[clinic end generated code: output=65a19629e5153983 input=561b477134df91d9]*/ { - PyThreadState *tstate = _PyThreadState_GET(); if (interval <= 0.0) { - _PyErr_SetString(tstate, PyExc_ValueError, - "switch interval must be strictly positive"); + PyErr_SetString(PyExc_ValueError, + "switch interval must be strictly positive"); return NULL; } _PyEval_SetSwitchInterval((unsigned long) (1e6 * interval)); @@ -1277,7 +1274,6 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) static char *keywords[] = {"firstiter", "finalizer", NULL}; PyObject *firstiter = NULL; PyObject *finalizer = NULL; - PyThreadState *tstate = _PyThreadState_GET(); if (!PyArg_ParseTupleAndKeywords( args, kw, "|OO", keywords, @@ -1287,9 +1283,9 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) if (finalizer && finalizer != Py_None) { if (!PyCallable_Check(finalizer)) { - _PyErr_Format(tstate, PyExc_TypeError, - "callable finalizer expected, got %.50s", - Py_TYPE(finalizer)->tp_name); + PyErr_Format(PyExc_TypeError, + "callable finalizer expected, got %.50s", + Py_TYPE(finalizer)->tp_name); return NULL; } if (_PyEval_SetAsyncGenFinalizer(finalizer) < 0) { @@ -1302,9 +1298,9 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) if (firstiter && firstiter != Py_None) { if (!PyCallable_Check(firstiter)) { - _PyErr_Format(tstate, PyExc_TypeError, - "callable firstiter expected, got %.50s", - Py_TYPE(firstiter)->tp_name); + PyErr_Format(PyExc_TypeError, + "callable firstiter expected, got %.50s", + Py_TYPE(firstiter)->tp_name); return NULL; } if (_PyEval_SetAsyncGenFirstiter(firstiter) < 0) { @@ -1505,7 +1501,6 @@ sys_getwindowsversion_impl(PyObject *module) wchar_t kernel32_path[MAX_PATH]; LPVOID verblock; DWORD verblock_size; - PyThreadState *tstate = _PyThreadState_GET(); ver.dwOSVersionInfoSize = sizeof(ver); if (!GetVersionExW((OSVERSIONINFOW*) &ver)) @@ -1556,11 +1551,10 @@ sys_getwindowsversion_impl(PyObject *module) realBuild )); - if (_PyErr_Occurred(tstate)) { + if (PyErr_Occurred()) { Py_DECREF(version); return NULL; } - return version; } From a33fcf3ccd9a06b97e1e5466e8f84158fdc21cd6 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 19 Feb 2021 15:08:54 +0100 Subject: [PATCH 1180/1261] bpo-43270: Remove private _PyErr_OCCURRED() macro (GH-24579) Remove the private _PyErr_OCCURRED() macro: use the public PyErr_Occurred() function instead. CPython internals must use the internal _PyErr_Occurred(tstate) function instead: it is the most efficient way to check if an exception was raised. --- Include/pyerrors.h | 6 ------ .../next/C API/2021-02-19-14-28-26.bpo-43270.UKx4XN.rst | 2 ++ Python/ceval.c | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2021-02-19-14-28-26.bpo-43270.UKx4XN.rst diff --git a/Include/pyerrors.h b/Include/pyerrors.h index 979a26ba68a033..692d67175741e5 100644 --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -30,12 +30,6 @@ PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *); macro is defined. */ PyAPI_FUNC(void) _Py_NO_RETURN Py_FatalError(const char *message); -#if defined(Py_DEBUG) || defined(Py_LIMITED_API) -#define _PyErr_OCCURRED() PyErr_Occurred() -#else -#define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type) -#endif - /* Error testing and normalization */ PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *); PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *); diff --git a/Misc/NEWS.d/next/C API/2021-02-19-14-28-26.bpo-43270.UKx4XN.rst b/Misc/NEWS.d/next/C API/2021-02-19-14-28-26.bpo-43270.UKx4XN.rst new file mode 100644 index 00000000000000..ab8c9772cb0f96 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-02-19-14-28-26.bpo-43270.UKx4XN.rst @@ -0,0 +1,2 @@ +Remove the private ``_PyErr_OCCURRED()`` macro: use the public +:c:func:`PyErr_Occurred` function instead. diff --git a/Python/ceval.c b/Python/ceval.c index 81a21c9a0f5343..4771a516a96e8f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2750,7 +2750,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) (PyDictObject *)f->f_builtins, name); if (v == NULL) { - if (!_PyErr_OCCURRED()) { + if (!_PyErr_Occurred(tstate)) { /* _PyDict_LoadGlobal() returns NULL without raising * an exception if the key doesn't exist */ format_exc_check_arg(tstate, PyExc_NameError, From 897aa400dd058436e881e076df02e7dc54ef7365 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 19 Feb 2021 15:10:45 +0100 Subject: [PATCH 1181/1261] bpo-43268: Pass interp rather than tstate to internal functions (GH-24580) Pass the current interpreter (interp) rather than the current Python thread state (tstate) to internal functions which only use the interpreter. Modified functions: * _PyXXX_Fini() and _PyXXX_ClearFreeList() functions * _PyEval_SignalAsyncExc(), make_pending_calls() * _PySys_GetObject(), sys_set_object(), sys_set_object_id(), sys_set_object_str() * should_audit(), set_flags_from_config(), make_flags() * _PyAtExit_Call() * init_stdio_encoding() * etc. --- Include/internal/pycore_ceval.h | 4 +- Include/internal/pycore_context.h | 2 +- Include/internal/pycore_gc.h | 14 ++--- Include/internal/pycore_pylifecycle.h | 50 +++++++-------- Include/internal/pycore_warnings.h | 2 +- Modules/atexitmodule.c | 8 +-- Modules/gcmodule.c | 30 ++++----- Objects/bytesobject.c | 8 +-- Objects/dictobject.c | 10 +-- Objects/exceptions.c | 8 +-- Objects/floatobject.c | 10 +-- Objects/frameobject.c | 10 +-- Objects/genobject.c | 10 +-- Objects/listobject.c | 10 +-- Objects/longobject.c | 10 +-- Objects/sliceobject.c | 3 +- Objects/tupleobject.c | 14 ++--- Objects/typeobject.c | 6 +- Objects/unicodeobject.c | 20 +++--- Python/_warnings.c | 4 +- Python/bltinmodule.c | 4 +- Python/ceval.c | 31 +++++----- Python/ceval_gil.h | 2 +- Python/context.c | 12 ++-- Python/import.c | 15 +++-- Python/initconfig.c | 6 +- Python/pylifecycle.c | 89 +++++++++++++-------------- Python/pystate.c | 8 +-- Python/sysmodule.c | 85 +++++++++++++------------ 29 files changed, 240 insertions(+), 245 deletions(-) diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index bb22322114ecb0..78a7056f2e7c3e 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -23,7 +23,7 @@ PyAPI_FUNC(int) _PyEval_AddPendingCall( PyInterpreterState *interp, int (*func)(void *), void *arg); -PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyThreadState *tstate); +PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyInterpreterState *interp); #ifdef HAVE_FORK extern PyStatus _PyEval_ReInitThreads(PyThreadState *tstate); #endif @@ -55,7 +55,7 @@ extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp); extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime); #endif extern PyStatus _PyEval_InitGIL(PyThreadState *tstate); -extern void _PyEval_FiniGIL(PyThreadState *tstate); +extern void _PyEval_FiniGIL(PyInterpreterState *interp); extern void _PyEval_ReleaseLock(PyThreadState *tstate); diff --git a/Include/internal/pycore_context.h b/Include/internal/pycore_context.h index ea4b3c8ea738f0..a482dd42122872 100644 --- a/Include/internal/pycore_context.h +++ b/Include/internal/pycore_context.h @@ -37,6 +37,6 @@ struct _pycontexttokenobject { int _PyContext_Init(void); -void _PyContext_Fini(PyThreadState *tstate); +void _PyContext_Fini(PyInterpreterState *interp); #endif /* !Py_INTERNAL_CONTEXT_H */ diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h index e2d47c90c10d80..9db4a4716fa588 100644 --- a/Include/internal/pycore_gc.h +++ b/Include/internal/pycore_gc.h @@ -167,13 +167,13 @@ extern Py_ssize_t _PyGC_CollectNoFail(PyThreadState *tstate); // Functions to clear types free lists -extern void _PyFrame_ClearFreeList(PyThreadState *tstate); -extern void _PyTuple_ClearFreeList(PyThreadState *tstate); -extern void _PyFloat_ClearFreeList(PyThreadState *tstate); -extern void _PyList_ClearFreeList(PyThreadState *tstate); -extern void _PyDict_ClearFreeList(PyThreadState *tstate); -extern void _PyAsyncGen_ClearFreeLists(PyThreadState *tstate); -extern void _PyContext_ClearFreeList(PyThreadState *tstate); +extern void _PyFrame_ClearFreeList(PyInterpreterState *interp); +extern void _PyTuple_ClearFreeList(PyInterpreterState *interp); +extern void _PyFloat_ClearFreeList(PyInterpreterState *interp); +extern void _PyList_ClearFreeList(PyInterpreterState *interp); +extern void _PyDict_ClearFreeList(PyInterpreterState *interp); +extern void _PyAsyncGen_ClearFreeLists(PyInterpreterState *interp); +extern void _PyContext_ClearFreeList(PyInterpreterState *interp); #ifdef __cplusplus } diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index c9e6947ae6cfc2..75f4cdbf9a7357 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -31,21 +31,21 @@ PyAPI_FUNC(int) _Py_IsLocaleCoercionTarget(const char *ctype_loc); /* Various one-time initializers */ -extern PyStatus _PyUnicode_Init(PyThreadState *tstate); -extern PyStatus _PyBytes_Init(PyThreadState *tstate); +extern PyStatus _PyUnicode_Init(PyInterpreterState *interp); +extern PyStatus _PyBytes_Init(PyInterpreterState *interp); extern int _PyStructSequence_Init(void); -extern int _PyLong_Init(PyThreadState *tstate); -extern PyStatus _PyTuple_Init(PyThreadState *tstate); +extern int _PyLong_Init(PyInterpreterState *interp); +extern PyStatus _PyTuple_Init(PyInterpreterState *interp); extern PyStatus _PyFaulthandler_Init(int enable); extern int _PyTraceMalloc_Init(int enable); -extern PyObject * _PyBuiltin_Init(PyThreadState *tstate); +extern PyObject * _PyBuiltin_Init(PyInterpreterState *interp); extern PyStatus _PySys_Create( PyThreadState *tstate, PyObject **sysmod_p); extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options); extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config); extern int _PySys_UpdateConfig(PyThreadState *tstate); -extern PyStatus _PyExc_Init(PyThreadState *tstate); +extern PyStatus _PyExc_Init(PyInterpreterState *interp); extern PyStatus _PyErr_Init(void); extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod); extern int _PyFloat_Init(void); @@ -54,33 +54,33 @@ extern PyStatus _Py_HashRandomization_Init(const PyConfig *); extern PyStatus _PyTypes_Init(void); extern PyStatus _PyTypes_InitSlotDefs(void); extern PyStatus _PyImportZip_Init(PyThreadState *tstate); -extern PyStatus _PyGC_Init(PyThreadState *tstate); -extern PyStatus _PyAtExit_Init(PyThreadState *tstate); +extern PyStatus _PyGC_Init(PyInterpreterState *interp); +extern PyStatus _PyAtExit_Init(PyInterpreterState *interp); /* Various internal finalizers */ -extern void _PyFrame_Fini(PyThreadState *tstate); -extern void _PyDict_Fini(PyThreadState *tstate); -extern void _PyTuple_Fini(PyThreadState *tstate); -extern void _PyList_Fini(PyThreadState *tstate); -extern void _PyBytes_Fini(PyThreadState *tstate); -extern void _PyFloat_Fini(PyThreadState *tstate); -extern void _PySlice_Fini(PyThreadState *tstate); -extern void _PyAsyncGen_Fini(PyThreadState *tstate); +extern void _PyFrame_Fini(PyInterpreterState *interp); +extern void _PyDict_Fini(PyInterpreterState *interp); +extern void _PyTuple_Fini(PyInterpreterState *interp); +extern void _PyList_Fini(PyInterpreterState *interp); +extern void _PyBytes_Fini(PyInterpreterState *interp); +extern void _PyFloat_Fini(PyInterpreterState *interp); +extern void _PySlice_Fini(PyInterpreterState *interp); +extern void _PyAsyncGen_Fini(PyInterpreterState *interp); extern int _PySignal_Init(int install_signal_handlers); extern void _PySignal_Fini(void); -extern void _PyExc_Fini(PyThreadState *tstate); +extern void _PyExc_Fini(PyInterpreterState *interp); extern void _PyImport_Fini(void); extern void _PyImport_Fini2(void); -extern void _PyGC_Fini(PyThreadState *tstate); -extern void _PyType_Fini(PyThreadState *tstate); +extern void _PyGC_Fini(PyInterpreterState *interp); +extern void _PyType_Fini(PyInterpreterState *interp); extern void _Py_HashRandomization_Fini(void); -extern void _PyUnicode_Fini(PyThreadState *tstate); -extern void _PyUnicode_ClearInterned(PyThreadState *tstate); -extern void _PyLong_Fini(PyThreadState *tstate); +extern void _PyUnicode_Fini(PyInterpreterState *interp); +extern void _PyUnicode_ClearInterned(PyInterpreterState *interp); +extern void _PyLong_Fini(PyInterpreterState *interp); extern void _PyFaulthandler_Fini(void); extern void _PyHash_Fini(void); extern void _PyTraceMalloc_Fini(void); @@ -89,9 +89,9 @@ extern void _PyAST_Fini(PyInterpreterState *interp); extern void _PyAtExit_Fini(PyInterpreterState *interp); extern PyStatus _PyGILState_Init(PyThreadState *tstate); -extern void _PyGILState_Fini(PyThreadState *tstate); +extern void _PyGILState_Fini(PyInterpreterState *interp); -PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyThreadState *tstate); +PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyInterpreterState *interp); PyAPI_FUNC(PyStatus) _Py_PreInitializeFromPyArgv( const PyPreConfig *src_config, @@ -111,7 +111,7 @@ PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception, PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate); -extern void _PyAtExit_Call(PyThreadState *tstate); +extern void _PyAtExit_Call(PyInterpreterState *interp); #ifdef __cplusplus } diff --git a/Include/internal/pycore_warnings.h b/Include/internal/pycore_warnings.h index 2a473b860c47d4..f728ec3077b3c5 100644 --- a/Include/internal/pycore_warnings.h +++ b/Include/internal/pycore_warnings.h @@ -17,7 +17,7 @@ struct _warnings_runtime_state { long filters_version; }; -extern int _PyWarnings_InitState(PyThreadState *tstate); +extern int _PyWarnings_InitState(PyInterpreterState *interp); #ifdef __cplusplus } diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index 49e2a75137e4ab..e536b4abe295f0 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -52,9 +52,9 @@ atexit_cleanup(struct atexit_state *state) PyStatus -_PyAtExit_Init(PyThreadState *tstate) +_PyAtExit_Init(PyInterpreterState *interp) { - struct atexit_state *state = &tstate->interp->atexit; + struct atexit_state *state = &interp->atexit; // _PyAtExit_Init() must only be called once assert(state->callbacks == NULL); @@ -109,9 +109,9 @@ atexit_callfuncs(struct atexit_state *state) void -_PyAtExit_Call(PyThreadState *tstate) +_PyAtExit_Call(PyInterpreterState *interp) { - struct atexit_state *state = &tstate->interp->atexit; + struct atexit_state *state = &interp->atexit; atexit_callfuncs(state); } diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index f0d56994908233..21f6bd1a9b6d0e 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -161,9 +161,9 @@ _PyGC_InitState(GCState *gcstate) PyStatus -_PyGC_Init(PyThreadState *tstate) +_PyGC_Init(PyInterpreterState *interp) { - GCState *gcstate = &tstate->interp->gc; + GCState *gcstate = &interp->gc; gcstate->garbage = PyList_New(0); if (gcstate->garbage == NULL) { @@ -1036,15 +1036,15 @@ delete_garbage(PyThreadState *tstate, GCState *gcstate, * Clearing the free lists may give back memory to the OS earlier. */ static void -clear_freelists(PyThreadState *tstate) +clear_freelists(PyInterpreterState *interp) { - _PyFrame_ClearFreeList(tstate); - _PyTuple_ClearFreeList(tstate); - _PyFloat_ClearFreeList(tstate); - _PyList_ClearFreeList(tstate); - _PyDict_ClearFreeList(tstate); - _PyAsyncGen_ClearFreeLists(tstate); - _PyContext_ClearFreeList(tstate); + _PyFrame_ClearFreeList(interp); + _PyTuple_ClearFreeList(interp); + _PyFloat_ClearFreeList(interp); + _PyList_ClearFreeList(interp); + _PyDict_ClearFreeList(interp); + _PyAsyncGen_ClearFreeLists(interp); + _PyContext_ClearFreeList(interp); } // Show stats for objects in each generations @@ -1323,7 +1323,7 @@ gc_collect_main(PyThreadState *tstate, int generation, /* Clear free list only during the collection of the highest * generation */ if (generation == NUM_GENERATIONS-1) { - clear_freelists(tstate); + clear_freelists(tstate->interp); } if (_PyErr_Occurred(tstate)) { @@ -2092,9 +2092,9 @@ _PyGC_CollectNoFail(PyThreadState *tstate) } void -_PyGC_DumpShutdownStats(PyThreadState *tstate) +_PyGC_DumpShutdownStats(PyInterpreterState *interp) { - GCState *gcstate = &tstate->interp->gc; + GCState *gcstate = &interp->gc; if (!(gcstate->debug & DEBUG_SAVEALL) && gcstate->garbage != NULL && PyList_GET_SIZE(gcstate->garbage) > 0) { const char *message; @@ -2129,9 +2129,9 @@ _PyGC_DumpShutdownStats(PyThreadState *tstate) } void -_PyGC_Fini(PyThreadState *tstate) +_PyGC_Fini(PyInterpreterState *interp) { - GCState *gcstate = &tstate->interp->gc; + GCState *gcstate = &interp->gc; Py_CLEAR(gcstate->garbage); Py_CLEAR(gcstate->callbacks); } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index ccabbdca1d5624..5814e8a54c7d4c 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -3063,9 +3063,9 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) PyStatus -_PyBytes_Init(PyThreadState *tstate) +_PyBytes_Init(PyInterpreterState *interp) { - struct _Py_bytes_state *state = &tstate->interp->bytes; + struct _Py_bytes_state *state = &interp->bytes; if (bytes_create_empty_string_singleton(state) < 0) { return _PyStatus_NO_MEMORY(); } @@ -3074,9 +3074,9 @@ _PyBytes_Init(PyThreadState *tstate) void -_PyBytes_Fini(PyThreadState *tstate) +_PyBytes_Fini(PyInterpreterState *interp) { - struct _Py_bytes_state* state = &tstate->interp->bytes; + struct _Py_bytes_state* state = &interp->bytes; for (int i = 0; i < UCHAR_MAX + 1; i++) { Py_CLEAR(state->characters[i]); } diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 35e881fe272308..9b5898d13a880f 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -260,9 +260,9 @@ get_dict_state(void) void -_PyDict_ClearFreeList(PyThreadState *tstate) +_PyDict_ClearFreeList(PyInterpreterState *interp) { - struct _Py_dict_state *state = &tstate->interp->dict_state; + struct _Py_dict_state *state = &interp->dict_state; while (state->numfree) { PyDictObject *op = state->free_list[--state->numfree]; assert(PyDict_CheckExact(op)); @@ -275,11 +275,11 @@ _PyDict_ClearFreeList(PyThreadState *tstate) void -_PyDict_Fini(PyThreadState *tstate) +_PyDict_Fini(PyInterpreterState *interp) { - _PyDict_ClearFreeList(tstate); + _PyDict_ClearFreeList(interp); #ifdef Py_DEBUG - struct _Py_dict_state *state = get_dict_state(); + struct _Py_dict_state *state = &interp->dict_state; state->numfree = -1; state->keys_numfree = -1; #endif diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 62cec9a90f5804..88e2287b14354c 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2529,9 +2529,9 @@ SimpleExtendsException(PyExc_Warning, ResourceWarning, #endif /* MS_WINDOWS */ PyStatus -_PyExc_Init(PyThreadState *tstate) +_PyExc_Init(PyInterpreterState *interp) { - struct _Py_exc_state *state = &tstate->interp->exc_state; + struct _Py_exc_state *state = &interp->exc_state; #define PRE_INIT(TYPE) \ if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \ @@ -2766,9 +2766,9 @@ _PyBuiltins_AddExceptions(PyObject *bltinmod) } void -_PyExc_Fini(PyThreadState *tstate) +_PyExc_Fini(PyInterpreterState *interp) { - struct _Py_exc_state *state = &tstate->interp->exc_state; + struct _Py_exc_state *state = &interp->exc_state; free_preallocated_memerrors(state); Py_CLEAR(state->errnomap); } diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 34fb57a946afa5..fdeb1896ffaeeb 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -2026,9 +2026,9 @@ _PyFloat_Init(void) } void -_PyFloat_ClearFreeList(PyThreadState *tstate) +_PyFloat_ClearFreeList(PyInterpreterState *interp) { - struct _Py_float_state *state = &tstate->interp->float_state; + struct _Py_float_state *state = &interp->float_state; PyFloatObject *f = state->free_list; while (f != NULL) { PyFloatObject *next = (PyFloatObject*) Py_TYPE(f); @@ -2040,11 +2040,11 @@ _PyFloat_ClearFreeList(PyThreadState *tstate) } void -_PyFloat_Fini(PyThreadState *tstate) +_PyFloat_Fini(PyInterpreterState *interp) { - _PyFloat_ClearFreeList(tstate); + _PyFloat_ClearFreeList(interp); #ifdef Py_DEBUG - struct _Py_float_state *state = &tstate->interp->float_state; + struct _Py_float_state *state = &interp->float_state; state->numfree = -1; #endif } diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 5f7fa40ff6e0e4..0571bfed9c0766 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -1109,9 +1109,9 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear) /* Clear out the free list */ void -_PyFrame_ClearFreeList(PyThreadState *tstate) +_PyFrame_ClearFreeList(PyInterpreterState *interp) { - struct _Py_frame_state *state = &tstate->interp->frame; + struct _Py_frame_state *state = &interp->frame; while (state->free_list != NULL) { PyFrameObject *f = state->free_list; state->free_list = state->free_list->f_back; @@ -1122,11 +1122,11 @@ _PyFrame_ClearFreeList(PyThreadState *tstate) } void -_PyFrame_Fini(PyThreadState *tstate) +_PyFrame_Fini(PyInterpreterState *interp) { - _PyFrame_ClearFreeList(tstate); + _PyFrame_ClearFreeList(interp); #ifdef Py_DEBUG - struct _Py_frame_state *state = &tstate->interp->frame; + struct _Py_frame_state *state = &interp->frame; state->numfree = -1; #endif } diff --git a/Objects/genobject.c b/Objects/genobject.c index bde92b462da199..26e27cc84c8712 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1489,9 +1489,9 @@ PyAsyncGen_New(PyFrameObject *f, PyObject *name, PyObject *qualname) void -_PyAsyncGen_ClearFreeLists(PyThreadState *tstate) +_PyAsyncGen_ClearFreeLists(PyInterpreterState *interp) { - struct _Py_async_gen_state *state = &tstate->interp->async_gen; + struct _Py_async_gen_state *state = &interp->async_gen; while (state->value_numfree) { _PyAsyncGenWrappedValue *o; @@ -1509,11 +1509,11 @@ _PyAsyncGen_ClearFreeLists(PyThreadState *tstate) } void -_PyAsyncGen_Fini(PyThreadState *tstate) +_PyAsyncGen_Fini(PyInterpreterState *interp) { - _PyAsyncGen_ClearFreeLists(tstate); + _PyAsyncGen_ClearFreeLists(interp); #ifdef Py_DEBUG - struct _Py_async_gen_state *state = &tstate->interp->async_gen; + struct _Py_async_gen_state *state = &interp->async_gen; state->value_numfree = -1; state->asend_numfree = -1; #endif diff --git a/Objects/listobject.c b/Objects/listobject.c index ca9df599a0bd44..415f9a27dde39f 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -106,9 +106,9 @@ list_preallocate_exact(PyListObject *self, Py_ssize_t size) } void -_PyList_ClearFreeList(PyThreadState *tstate) +_PyList_ClearFreeList(PyInterpreterState *interp) { - struct _Py_list_state *state = &tstate->interp->list; + struct _Py_list_state *state = &interp->list; while (state->numfree) { PyListObject *op = state->free_list[--state->numfree]; assert(PyList_CheckExact(op)); @@ -117,11 +117,11 @@ _PyList_ClearFreeList(PyThreadState *tstate) } void -_PyList_Fini(PyThreadState *tstate) +_PyList_Fini(PyInterpreterState *interp) { - _PyList_ClearFreeList(tstate); + _PyList_ClearFreeList(interp); #ifdef Py_DEBUG - struct _Py_list_state *state = &tstate->interp->list; + struct _Py_list_state *state = &interp->list; state->numfree = -1; #endif } diff --git a/Objects/longobject.c b/Objects/longobject.c index c0b4ce079e46aa..02b3603115602c 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5702,7 +5702,7 @@ PyLong_GetInfo(void) } int -_PyLong_Init(PyThreadState *tstate) +_PyLong_Init(PyInterpreterState *interp) { for (Py_ssize_t i=0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { sdigit ival = (sdigit)i - NSMALLNEGINTS; @@ -5716,10 +5716,10 @@ _PyLong_Init(PyThreadState *tstate) Py_SET_SIZE(v, size); v->ob_digit[0] = (digit)abs(ival); - tstate->interp->small_ints[i] = v; + interp->small_ints[i] = v; } - if (_Py_IsMainInterpreter(tstate->interp)) { + if (_Py_IsMainInterpreter(interp)) { /* initialize int_info */ if (Int_InfoType.tp_name == NULL) { if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) { @@ -5732,9 +5732,9 @@ _PyLong_Init(PyThreadState *tstate) } void -_PyLong_Fini(PyThreadState *tstate) +_PyLong_Fini(PyInterpreterState *interp) { for (Py_ssize_t i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { - Py_CLEAR(tstate->interp->small_ints[i]); + Py_CLEAR(interp->small_ints[i]); } } diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 02ba033a62a494..22fb7c61c354f9 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -97,9 +97,8 @@ PyObject _Py_EllipsisObject = { /* Slice object implementation */ -void _PySlice_Fini(PyThreadState *tstate) +void _PySlice_Fini(PyInterpreterState *interp) { - PyInterpreterState *interp = tstate->interp; PySliceObject *obj = interp->slice_cache; if (obj != NULL) { interp->slice_cache = NULL; diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 41677d7e710aa6..becdf705985fe2 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -1007,10 +1007,10 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) } void -_PyTuple_ClearFreeList(PyThreadState *tstate) +_PyTuple_ClearFreeList(PyInterpreterState *interp) { #if PyTuple_MAXSAVESIZE > 0 - struct _Py_tuple_state *state = &tstate->interp->tuple; + struct _Py_tuple_state *state = &interp->tuple; for (Py_ssize_t i = 1; i < PyTuple_MAXSAVESIZE; i++) { PyTupleObject *p = state->free_list[i]; state->free_list[i] = NULL; @@ -1027,9 +1027,9 @@ _PyTuple_ClearFreeList(PyThreadState *tstate) PyStatus -_PyTuple_Init(PyThreadState *tstate) +_PyTuple_Init(PyInterpreterState *interp) { - struct _Py_tuple_state *state = &tstate->interp->tuple; + struct _Py_tuple_state *state = &interp->tuple; if (tuple_create_empty_tuple_singleton(state) < 0) { return _PyStatus_NO_MEMORY(); } @@ -1038,14 +1038,14 @@ _PyTuple_Init(PyThreadState *tstate) void -_PyTuple_Fini(PyThreadState *tstate) +_PyTuple_Fini(PyInterpreterState *interp) { #if PyTuple_MAXSAVESIZE > 0 - struct _Py_tuple_state *state = &tstate->interp->tuple; + struct _Py_tuple_state *state = &interp->tuple; // The empty tuple singleton must not be tracked by the GC assert(!_PyObject_GC_IS_TRACKED(state->free_list[0])); Py_CLEAR(state->free_list[0]); - _PyTuple_ClearFreeList(tstate); + _PyTuple_ClearFreeList(interp); #ifdef Py_DEBUG state->numfree[0] = -1; #endif diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 9dbb7bed50b3f9..33a7872ecc45c6 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -283,10 +283,10 @@ PyType_ClearCache(void) void -_PyType_Fini(PyThreadState *tstate) +_PyType_Fini(PyInterpreterState *interp) { - _PyType_ClearCache(&tstate->interp->type_cache); - if (_Py_IsMainInterpreter(tstate->interp)) { + _PyType_ClearCache(&interp->type_cache); + if (_Py_IsMainInterpreter(interp)) { clear_slotdefs(); } } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 498f3933dec6a3..5e1b6b0531241a 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -15682,7 +15682,7 @@ PyTypeObject PyUnicode_Type = { /* Initialize the Unicode implementation */ PyStatus -_PyUnicode_Init(PyThreadState *tstate) +_PyUnicode_Init(PyInterpreterState *interp) { /* XXX - move this array to unicodectype.c ? */ const Py_UCS2 linebreak[] = { @@ -15696,12 +15696,12 @@ _PyUnicode_Init(PyThreadState *tstate) 0x2029, /* PARAGRAPH SEPARATOR */ }; - struct _Py_unicode_state *state = &tstate->interp->unicode; + struct _Py_unicode_state *state = &interp->unicode; if (unicode_create_empty_string_singleton(state) < 0) { return _PyStatus_NO_MEMORY(); } - if (_Py_IsMainInterpreter(tstate->interp)) { + if (_Py_IsMainInterpreter(interp)) { /* initialize the linebreak bloom filter */ bloom_linebreak = make_bloom_mask( PyUnicode_2BYTE_KIND, linebreak, @@ -15813,9 +15813,9 @@ PyUnicode_InternFromString(const char *cp) void -_PyUnicode_ClearInterned(PyThreadState *tstate) +_PyUnicode_ClearInterned(PyInterpreterState *interp) { - struct _Py_unicode_state *state = &tstate->interp->unicode; + struct _Py_unicode_state *state = &interp->unicode; if (state->interned == NULL) { return; } @@ -16093,10 +16093,10 @@ config_get_codec_name(wchar_t **config_encoding) static PyStatus -init_stdio_encoding(PyThreadState *tstate) +init_stdio_encoding(PyInterpreterState *interp) { /* Update the stdio encoding to the normalized Python codec name. */ - PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(tstate->interp); + PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(interp); if (config_get_codec_name(&config->stdio_encoding) < 0) { return _PyStatus_ERR("failed to get the Python codec name " "of the stdio encoding"); @@ -16189,7 +16189,7 @@ _PyUnicode_InitEncodings(PyThreadState *tstate) return status; } - return init_stdio_encoding(tstate); + return init_stdio_encoding(tstate->interp); } @@ -16233,9 +16233,9 @@ _PyUnicode_EnableLegacyWindowsFSEncoding(void) void -_PyUnicode_Fini(PyThreadState *tstate) +_PyUnicode_Fini(PyInterpreterState *interp) { - struct _Py_unicode_state *state = &tstate->interp->unicode; + struct _Py_unicode_state *state = &interp->unicode; // _PyUnicode_ClearInterned() must be called before assert(state->interned == NULL); diff --git a/Python/_warnings.c b/Python/_warnings.c index 021400f5580d6a..2c9a2a76872676 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -114,9 +114,9 @@ init_filters(void) /* Initialize the given warnings module state. */ int -_PyWarnings_InitState(PyThreadState *tstate) +_PyWarnings_InitState(PyInterpreterState *interp) { - WarningsState *st = &tstate->interp->warnings; + WarningsState *st = &interp->warnings; if (st->filters == NULL) { st->filters = init_filters(); diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 8c4e6e5107f9e0..dec2984a068df2 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2853,11 +2853,11 @@ static struct PyModuleDef builtinsmodule = { PyObject * -_PyBuiltin_Init(PyThreadState *tstate) +_PyBuiltin_Init(PyInterpreterState *interp) { PyObject *mod, *dict, *debug; - const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); if (PyType_Ready(&PyFilter_Type) < 0 || PyType_Ready(&PyMap_Type) < 0 || diff --git a/Python/ceval.c b/Python/ceval.c index 4771a516a96e8f..7ccb8fcf5ae541 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -323,10 +323,10 @@ _PyEval_InitGIL(PyThreadState *tstate) } void -_PyEval_FiniGIL(PyThreadState *tstate) +_PyEval_FiniGIL(PyInterpreterState *interp) { #ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - if (!_Py_IsMainInterpreter(tstate->interp)) { + if (!_Py_IsMainInterpreter(interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ @@ -335,9 +335,9 @@ _PyEval_FiniGIL(PyThreadState *tstate) #endif #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &tstate->interp->ceval.gil; + struct _gil_runtime_state *gil = &interp->ceval.gil; #else - struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil; + struct _gil_runtime_state *gil = &interp->runtime->ceval.gil; #endif if (!gil_created(gil)) { /* First Py_InitializeFromConfig() call: the GIL doesn't exist @@ -502,10 +502,9 @@ _PyEval_ReInitThreads(PyThreadState *tstate) raised. */ void -_PyEval_SignalAsyncExc(PyThreadState *tstate) +_PyEval_SignalAsyncExc(PyInterpreterState *interp) { - assert(is_tstate_valid(tstate)); - SIGNAL_ASYNC_EXC(tstate->interp); + SIGNAL_ASYNC_EXC(interp); } PyThreadState * @@ -690,10 +689,8 @@ handle_signals(PyThreadState *tstate) } static int -make_pending_calls(PyThreadState *tstate) +make_pending_calls(PyInterpreterState *interp) { - assert(is_tstate_valid(tstate)); - /* only execute pending calls on main thread */ if (!_Py_ThreadCanHandlePendingCalls()) { return 0; @@ -708,11 +705,11 @@ make_pending_calls(PyThreadState *tstate) /* unsignal before starting to call callbacks, so that any callback added in-between re-signals */ - UNSIGNAL_PENDING_CALLS(tstate->interp); + UNSIGNAL_PENDING_CALLS(interp); int res = 0; /* perform a bounded number of calls, in case of recursion */ - struct _pending_calls *pending = &tstate->interp->ceval.pending; + struct _pending_calls *pending = &interp->ceval.pending; for (int i=0; iinterp); + SIGNAL_PENDING_CALLS(interp); return res; } @@ -745,6 +742,7 @@ void _Py_FinishPendingCalls(PyThreadState *tstate) { assert(PyGILState_Check()); + assert(is_tstate_valid(tstate)); struct _pending_calls *pending = &tstate->interp->ceval.pending; @@ -752,7 +750,7 @@ _Py_FinishPendingCalls(PyThreadState *tstate) return; } - if (make_pending_calls(tstate) < 0) { + if (make_pending_calls(tstate->interp) < 0) { PyObject *exc, *val, *tb; _PyErr_Fetch(tstate, &exc, &val, &tb); PyErr_BadInternalCall(); @@ -769,6 +767,7 @@ Py_MakePendingCalls(void) assert(PyGILState_Check()); PyThreadState *tstate = _PyThreadState_GET(); + assert(is_tstate_valid(tstate)); /* Python signal handler doesn't really queue a callback: it only signals that a signal was received, see _PyEval_SignalReceived(). */ @@ -777,7 +776,7 @@ Py_MakePendingCalls(void) return res; } - res = make_pending_calls(tstate); + res = make_pending_calls(tstate->interp); if (res != 0) { return res; } @@ -950,7 +949,7 @@ eval_frame_handle_pending(PyThreadState *tstate) /* Pending calls */ struct _ceval_state *ceval2 = &tstate->interp->ceval; if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) { - if (make_pending_calls(tstate) != 0) { + if (make_pending_calls(tstate->interp) != 0) { return -1; } } diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index 56944b89237fb4..9b8b43253f04d2 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -318,7 +318,7 @@ take_gil(PyThreadState *tstate) /* Don't access tstate if the thread must exit */ if (tstate->async_exc != NULL) { - _PyEval_SignalAsyncExc(tstate); + _PyEval_SignalAsyncExc(tstate->interp); } MUTEX_UNLOCK(gil->mutex); diff --git a/Python/context.c b/Python/context.c index 6a4562149cbec0..bf2ba93c14eb8f 100644 --- a/Python/context.c +++ b/Python/context.c @@ -1287,9 +1287,9 @@ get_token_missing(void) void -_PyContext_ClearFreeList(PyThreadState *tstate) +_PyContext_ClearFreeList(PyInterpreterState *interp) { - struct _Py_context_state *state = &tstate->interp->context; + struct _Py_context_state *state = &interp->context; for (; state->numfree; state->numfree--) { PyContext *ctx = state->freelist; state->freelist = (PyContext *)ctx->ctx_weakreflist; @@ -1300,14 +1300,14 @@ _PyContext_ClearFreeList(PyThreadState *tstate) void -_PyContext_Fini(PyThreadState *tstate) +_PyContext_Fini(PyInterpreterState *interp) { - if (_Py_IsMainInterpreter(tstate->interp)) { + if (_Py_IsMainInterpreter(interp)) { Py_CLEAR(_token_missing); } - _PyContext_ClearFreeList(tstate); + _PyContext_ClearFreeList(interp); #ifdef Py_DEBUG - struct _Py_context_state *state = &tstate->interp->context; + struct _Py_context_state *state = &interp->context; state->numfree = -1; #endif _PyHamt_Fini(); diff --git a/Python/import.c b/Python/import.c index 6189dcfbe0eca0..538db69af6e0f3 100644 --- a/Python/import.c +++ b/Python/import.c @@ -301,16 +301,16 @@ _PyImport_GetModuleId(struct _Py_Identifier *nameid) int _PyImport_SetModule(PyObject *name, PyObject *m) { - PyThreadState *tstate = _PyThreadState_GET(); - PyObject *modules = tstate->interp->modules; + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyObject *modules = interp->modules; return PyObject_SetItem(modules, name, m); } int _PyImport_SetModuleString(const char *name, PyObject *m) { - PyThreadState *tstate = _PyThreadState_GET(); - PyObject *modules = tstate->interp->modules; + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyObject *modules = interp->modules; return PyMapping_SetItemString(modules, name, m); } @@ -342,9 +342,8 @@ import_get_module(PyThreadState *tstate, PyObject *name) static int -import_ensure_initialized(PyThreadState *tstate, PyObject *mod, PyObject *name) +import_ensure_initialized(PyInterpreterState *interp, PyObject *mod, PyObject *name) { - PyInterpreterState *interp = tstate->interp; PyObject *spec; _Py_IDENTIFIER(_lock_unlock_module); @@ -1530,7 +1529,7 @@ PyImport_GetModule(PyObject *name) mod = import_get_module(tstate, name); if (mod != NULL && mod != Py_None) { - if (import_ensure_initialized(tstate, mod, name) < 0) { + if (import_ensure_initialized(tstate->interp, mod, name) < 0) { Py_DECREF(mod); remove_importlib_frames(tstate); return NULL; @@ -1594,7 +1593,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, } if (mod != NULL && mod != Py_None) { - if (import_ensure_initialized(tstate, mod, name) < 0) { + if (import_ensure_initialized(tstate->interp, mod, name) < 0) { goto error; } } diff --git a/Python/initconfig.c b/Python/initconfig.c index 62087fb4208dd4..7886d09f7a027a 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -2909,8 +2909,8 @@ _Py_GetConfigsAsDict(void) Py_CLEAR(dict); /* pre config */ - PyThreadState *tstate = _PyThreadState_GET(); - const PyPreConfig *pre_config = &tstate->interp->runtime->preconfig; + PyInterpreterState *interp = _PyInterpreterState_GET(); + const PyPreConfig *pre_config = &interp->runtime->preconfig; dict = _PyPreConfig_AsDict(pre_config); if (dict == NULL) { goto error; @@ -2921,7 +2921,7 @@ _Py_GetConfigsAsDict(void) Py_CLEAR(dict); /* core config */ - const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); dict = _PyConfig_AsDict(config); if (dict == NULL) { goto error; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index f990fa6f1db3e7..ec770841c8de3a 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -574,7 +574,7 @@ init_interp_create_gil(PyThreadState *tstate) /* finalize_interp_delete() comment explains why _PyEval_FiniGIL() is only called here. */ - _PyEval_FiniGIL(tstate); + _PyEval_FiniGIL(tstate->interp); /* Auto-thread-state API */ status = _PyGILState_Init(tstate); @@ -624,12 +624,12 @@ pycore_create_interpreter(_PyRuntimeState *runtime, static PyStatus -pycore_init_types(PyThreadState *tstate) +pycore_init_types(PyInterpreterState *interp) { PyStatus status; - int is_main_interp = _Py_IsMainInterpreter(tstate->interp); + int is_main_interp = _Py_IsMainInterpreter(interp); - status = _PyGC_Init(tstate); + status = _PyGC_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -637,7 +637,7 @@ pycore_init_types(PyThreadState *tstate) // Create the empty tuple singleton. It must be created before the first // PyType_Ready() call since PyType_Ready() creates tuples, for tp_bases // for example. - status = _PyTuple_Init(tstate); + status = _PyTuple_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -649,21 +649,21 @@ pycore_init_types(PyThreadState *tstate) } } - if (!_PyLong_Init(tstate)) { + if (!_PyLong_Init(interp)) { return _PyStatus_ERR("can't init longs"); } - status = _PyUnicode_Init(tstate); + status = _PyUnicode_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } - status = _PyBytes_Init(tstate); + status = _PyBytes_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } - status = _PyExc_Init(tstate); + status = _PyExc_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -689,11 +689,11 @@ pycore_init_types(PyThreadState *tstate) } } - if (_PyWarnings_InitState(tstate) < 0) { + if (_PyWarnings_InitState(interp) < 0) { return _PyStatus_ERR("can't initialize warnings"); } - status = _PyAtExit_Init(tstate); + status = _PyAtExit_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -703,16 +703,13 @@ pycore_init_types(PyThreadState *tstate) static PyStatus -pycore_init_builtins(PyThreadState *tstate) +pycore_init_builtins(PyInterpreterState *interp) { - assert(!_PyErr_Occurred(tstate)); - - PyObject *bimod = _PyBuiltin_Init(tstate); + PyObject *bimod = _PyBuiltin_Init(interp); if (bimod == NULL) { goto error; } - PyInterpreterState *interp = tstate->interp; if (_PyImport_FixupBuiltin(bimod, "builtins", interp->modules) < 0) { goto error; } @@ -743,8 +740,6 @@ pycore_init_builtins(PyThreadState *tstate) } interp->import_func = Py_NewRef(import_func); - assert(!_PyErr_Occurred(tstate)); - return _PyStatus_OK(); error: @@ -759,7 +754,7 @@ pycore_interp_init(PyThreadState *tstate) PyStatus status; PyObject *sysmod = NULL; - status = pycore_init_types(tstate); + status = pycore_init_types(tstate->interp); if (_PyStatus_EXCEPTION(status)) { goto done; } @@ -769,11 +764,15 @@ pycore_interp_init(PyThreadState *tstate) goto done; } - status = pycore_init_builtins(tstate); + assert(!_PyErr_Occurred(tstate)); + + status = pycore_init_builtins(tstate->interp); if (_PyStatus_EXCEPTION(status)) { goto done; } + assert(!_PyErr_Occurred(tstate)); + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); if (config->_install_importlib) { /* This call sets up builtin and frozen import support */ @@ -1464,7 +1463,7 @@ finalize_modules(PyThreadState *tstate) // Dump GC stats before it's too late, since it uses the warnings // machinery. - _PyGC_DumpShutdownStats(tstate); + _PyGC_DumpShutdownStats(interp); if (weaklist != NULL) { // Now, if there are any modules left alive, clear their globals to @@ -1570,27 +1569,27 @@ flush_std_files(void) static void -finalize_interp_types(PyThreadState *tstate) +finalize_interp_types(PyInterpreterState *interp) { - _PyExc_Fini(tstate); - _PyFrame_Fini(tstate); - _PyAsyncGen_Fini(tstate); - _PyContext_Fini(tstate); - _PyType_Fini(tstate); + _PyExc_Fini(interp); + _PyFrame_Fini(interp); + _PyAsyncGen_Fini(interp); + _PyContext_Fini(interp); + _PyType_Fini(interp); // Call _PyUnicode_ClearInterned() before _PyDict_Fini() since it uses // a dict internally. - _PyUnicode_ClearInterned(tstate); + _PyUnicode_ClearInterned(interp); - _PyDict_Fini(tstate); - _PyList_Fini(tstate); - _PyTuple_Fini(tstate); + _PyDict_Fini(interp); + _PyList_Fini(interp); + _PyTuple_Fini(interp); - _PySlice_Fini(tstate); + _PySlice_Fini(interp); - _PyBytes_Fini(tstate); - _PyUnicode_Fini(tstate); - _PyFloat_Fini(tstate); - _PyLong_Fini(tstate); + _PyBytes_Fini(interp); + _PyUnicode_Fini(interp); + _PyFloat_Fini(interp); + _PyLong_Fini(interp); } @@ -1615,16 +1614,16 @@ finalize_interp_clear(PyThreadState *tstate) _Py_ClearFileSystemEncoding(); } - finalize_interp_types(tstate); + finalize_interp_types(tstate->interp); } static void -finalize_interp_delete(PyThreadState *tstate) +finalize_interp_delete(PyInterpreterState *interp) { - if (_Py_IsMainInterpreter(tstate->interp)) { + if (_Py_IsMainInterpreter(interp)) { /* Cleanup auto-thread-state */ - _PyGILState_Fini(tstate); + _PyGILState_Fini(interp); } /* We can't call _PyEval_FiniGIL() here because destroying the GIL lock can @@ -1633,7 +1632,7 @@ finalize_interp_delete(PyThreadState *tstate) created GIL, which ensures that Py_Initialize / Py_FinalizeEx can be called multiple times. */ - PyInterpreterState_Delete(tstate->interp); + PyInterpreterState_Delete(interp); } @@ -1666,7 +1665,7 @@ Py_FinalizeEx(void) * the threads created via Threading. */ - _PyAtExit_Call(tstate); + _PyAtExit_Call(tstate->interp); /* Copy the core config, PyInterpreterState_Delete() free the core config memory */ @@ -1779,7 +1778,7 @@ Py_FinalizeEx(void) #endif /* Py_TRACE_REFS */ finalize_interp_clear(tstate); - finalize_interp_delete(tstate); + finalize_interp_delete(tstate->interp); #ifdef Py_TRACE_REFS /* Display addresses (& refcnts) of all objects still alive. @@ -1954,7 +1953,7 @@ Py_EndInterpreter(PyThreadState *tstate) // Wrap up existing "threading"-module-created, non-daemon threads. wait_for_thread_shutdown(tstate); - _PyAtExit_Call(tstate); + _PyAtExit_Call(tstate->interp); if (tstate != interp->tstate_head || tstate->next != NULL) { Py_FatalError("not the last thread"); @@ -1963,7 +1962,7 @@ Py_EndInterpreter(PyThreadState *tstate) finalize_modules(tstate); finalize_interp_clear(tstate); - finalize_interp_delete(tstate); + finalize_interp_delete(tstate->interp); } /* Add the __main__ module */ diff --git a/Python/pystate.c b/Python/pystate.c index f4fd03982181b8..1623babeff4b2d 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -324,7 +324,7 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate) /* Last garbage collection on this interpreter */ _PyGC_CollectNoFail(tstate); - _PyGC_Fini(tstate); + _PyGC_Fini(interp); /* We don't clear sysdict and builtins until the end of this function. Because clearing other attributes can execute arbitrary Python code @@ -1146,7 +1146,7 @@ PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) HEAD_UNLOCK(runtime); Py_XDECREF(old_exc); - _PyEval_SignalAsyncExc(tstate); + _PyEval_SignalAsyncExc(tstate->interp); return 1; } HEAD_UNLOCK(runtime); @@ -1357,9 +1357,9 @@ _PyGILState_GetInterpreterStateUnsafe(void) } void -_PyGILState_Fini(PyThreadState *tstate) +_PyGILState_Fini(PyInterpreterState *interp) { - struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; + struct _gilstate_runtime_state *gilstate = &interp->runtime->gilstate; PyThread_tss_delete(&gilstate->autoTSSkey); gilstate->autoInterpreterState = NULL; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 33d4e2bbb6eac8..13b9034bf7369d 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -86,9 +86,9 @@ _PySys_GetObjectId(_Py_Identifier *key) } static PyObject * -_PySys_GetObject(PyThreadState *tstate, const char *name) +_PySys_GetObject(PyInterpreterState *interp, const char *name) { - PyObject *sysdict = tstate->interp->sysdict; + PyObject *sysdict = interp->sysdict; if (sysdict == NULL) { return NULL; } @@ -102,7 +102,7 @@ PySys_GetObject(const char *name) PyObject *exc_type, *exc_value, *exc_tb; _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); - PyObject *value = _PySys_GetObject(tstate, name); + PyObject *value = _PySys_GetObject(tstate->interp, name); /* XXX Suppress a new exception if it was raised and restore * the old one. */ _PyErr_Restore(tstate, exc_type, exc_value, exc_tb); @@ -110,12 +110,12 @@ PySys_GetObject(const char *name) } static int -sys_set_object(PyThreadState *tstate, PyObject *key, PyObject *v) +sys_set_object(PyInterpreterState *interp, PyObject *key, PyObject *v) { if (key == NULL) { return -1; } - PyObject *sd = tstate->interp->sysdict; + PyObject *sd = interp->sysdict; if (v == NULL) { v = _PyDict_Pop(sd, key, Py_None); if (v == NULL) { @@ -130,24 +130,24 @@ sys_set_object(PyThreadState *tstate, PyObject *key, PyObject *v) } static int -sys_set_object_id(PyThreadState *tstate, _Py_Identifier *key, PyObject *v) +sys_set_object_id(PyInterpreterState *interp, _Py_Identifier *key, PyObject *v) { - return sys_set_object(tstate, _PyUnicode_FromId(key), v); + return sys_set_object(interp, _PyUnicode_FromId(key), v); } int _PySys_SetObjectId(_Py_Identifier *key, PyObject *v) { - PyThreadState *tstate = _PyThreadState_GET(); - return sys_set_object_id(tstate, key, v); + PyInterpreterState *interp = _PyInterpreterState_GET(); + return sys_set_object_id(interp, key, v); } static int -sys_set_object_str(PyThreadState *tstate, const char *name, PyObject *v) +sys_set_object_str(PyInterpreterState *interp, const char *name, PyObject *v) { PyObject *key = v ? PyUnicode_InternFromString(name) : PyUnicode_FromString(name); - int r = sys_set_object(tstate, key, v); + int r = sys_set_object(interp, key, v); Py_XDECREF(key); return r; } @@ -155,22 +155,21 @@ sys_set_object_str(PyThreadState *tstate, const char *name, PyObject *v) int PySys_SetObject(const char *name, PyObject *v) { - PyThreadState *tstate = _PyThreadState_GET(); - return sys_set_object_str(tstate, name, v); + PyInterpreterState *interp = _PyInterpreterState_GET(); + return sys_set_object_str(interp, name, v); } static int -should_audit(PyInterpreterState *is) +should_audit(PyInterpreterState *interp) { - /* tstate->interp cannot be NULL, but test it just in case - for extra safety */ - assert(is != NULL); - if (!is) { + /* interp must not be NULL, but test it just in case for extra safety */ + assert(interp != NULL); + if (!interp) { return 0; } - return (is->runtime->audit_hook_head - || is->audit_hooks + return (interp->runtime->audit_hook_head + || interp->audit_hooks || PyDTrace_AUDIT_ENABLED()); } @@ -455,15 +454,15 @@ sys_addaudithook_impl(PyObject *module, PyObject *hook) return NULL; } - PyInterpreterState *is = tstate->interp; - if (is->audit_hooks == NULL) { - is->audit_hooks = PyList_New(0); - if (is->audit_hooks == NULL) { + PyInterpreterState *interp = tstate->interp; + if (interp->audit_hooks == NULL) { + interp->audit_hooks = PyList_New(0); + if (interp->audit_hooks == NULL) { return NULL; } } - if (PyList_Append(is->audit_hooks, hook) < 0) { + if (PyList_Append(interp->audit_hooks, hook) < 0) { return NULL; } @@ -1607,8 +1606,8 @@ static PyObject * sys_setdlopenflags_impl(PyObject *module, int new_val) /*[clinic end generated code: output=ec918b7fe0a37281 input=4c838211e857a77f]*/ { - PyThreadState *tstate = _PyThreadState_GET(); - tstate->interp->dlopenflags = new_val; + PyInterpreterState *interp = _PyInterpreterState_GET(); + interp->dlopenflags = new_val; Py_RETURN_NONE; } @@ -1625,8 +1624,8 @@ static PyObject * sys_getdlopenflags_impl(PyObject *module) /*[clinic end generated code: output=e92cd1bc5005da6e input=dc4ea0899c53b4b6]*/ { - PyThreadState *tstate = _PyThreadState_GET(); - return PyLong_FromLong(tstate->interp->dlopenflags); + PyInterpreterState *interp = _PyInterpreterState_GET(); + return PyLong_FromLong(interp->dlopenflags); } #endif /* HAVE_DLOPEN */ @@ -2217,7 +2216,7 @@ get_warnoptions(PyThreadState *tstate) if (warnoptions == NULL) { return NULL; } - if (sys_set_object_id(tstate, &PyId_warnoptions, warnoptions)) { + if (sys_set_object_id(tstate->interp, &PyId_warnoptions, warnoptions)) { Py_DECREF(warnoptions); return NULL; } @@ -2310,7 +2309,7 @@ get_xoptions(PyThreadState *tstate) if (xoptions == NULL) { return NULL; } - if (sys_set_object_id(tstate, &PyId__xoptions, xoptions)) { + if (sys_set_object_id(tstate->interp, &PyId__xoptions, xoptions)) { Py_DECREF(xoptions); return NULL; } @@ -2511,9 +2510,8 @@ static PyStructSequence_Desc flags_desc = { }; static int -set_flags_from_config(PyObject *flags, PyThreadState *tstate) +set_flags_from_config(PyInterpreterState *interp, PyObject *flags) { - PyInterpreterState *interp = tstate->interp; const PyPreConfig *preconfig = &interp->runtime->preconfig; const PyConfig *config = _PyInterpreterState_GetConfig(interp); @@ -2554,14 +2552,14 @@ set_flags_from_config(PyObject *flags, PyThreadState *tstate) static PyObject* -make_flags(PyThreadState *tstate) +make_flags(PyInterpreterState *interp) { PyObject *flags = PyStructSequence_New(&FlagsType); if (flags == NULL) { return NULL; } - if (set_flags_from_config(flags, tstate) < 0) { + if (set_flags_from_config(interp, flags) < 0) { Py_DECREF(flags); return NULL; } @@ -2819,7 +2817,7 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) goto type_init_failed; } } - SET_SYS("flags", make_flags(tstate)); + SET_SYS("flags", make_flags(tstate->interp)); /* prevent user from creating new instances */ FlagsType.tp_init = NULL; FlagsType.tp_new = NULL; @@ -2941,8 +2939,9 @@ sys_create_xoptions_dict(const PyConfig *config) int _PySys_UpdateConfig(PyThreadState *tstate) { - PyObject *sysdict = tstate->interp->sysdict; - const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); + PyInterpreterState *interp = tstate->interp; + PyObject *sysdict = interp->sysdict; + const PyConfig *config = _PyInterpreterState_GetConfig(interp); int res; #define COPY_LIST(KEY, VALUE) \ @@ -2985,11 +2984,11 @@ _PySys_UpdateConfig(PyThreadState *tstate) #undef COPY_WSTR // sys.flags - PyObject *flags = _PySys_GetObject(tstate, "flags"); // borrowed ref + PyObject *flags = _PySys_GetObject(interp, "flags"); // borrowed ref if (flags == NULL) { return -1; } - if (set_flags_from_config(flags, tstate) < 0) { + if (set_flags_from_config(interp, flags) < 0) { return -1; } @@ -3129,8 +3128,8 @@ PySys_SetPath(const wchar_t *path) PyObject *v; if ((v = makepathobject(path, DELIM)) == NULL) Py_FatalError("can't create sys.path"); - PyThreadState *tstate = _PyThreadState_GET(); - if (sys_set_object_id(tstate, &PyId_path, v) != 0) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (sys_set_object_id(interp, &PyId_path, v) != 0) { Py_FatalError("can't assign sys.path"); } Py_DECREF(v); @@ -3171,7 +3170,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) if (av == NULL) { Py_FatalError("no mem for sys.argv"); } - if (sys_set_object_str(tstate, "argv", av) != 0) { + if (sys_set_object_str(tstate->interp, "argv", av) != 0) { Py_DECREF(av); Py_FatalError("can't assign sys.argv"); } From 5d96295e23f71a118678fe14fb194d8233dc0714 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 19 Feb 2021 15:51:36 +0100 Subject: [PATCH 1182/1261] bpo-43268: local_clear() uses _PyInterpreterState_GET() (GH-24583) Cleanup also the code. --- Modules/_threadmodule.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 9b8757715a0b9b..f6217e672f7aa6 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -828,27 +828,26 @@ local_traverse(localobject *self, visitproc visit, void *arg) static int local_clear(localobject *self) { - PyThreadState *tstate; Py_CLEAR(self->args); Py_CLEAR(self->kw); Py_CLEAR(self->dummies); Py_CLEAR(self->wr_callback); /* Remove all strong references to dummies from the thread states */ - if (self->key - && (tstate = PyThreadState_Get()) - && tstate->interp) { - for(tstate = PyInterpreterState_ThreadHead(tstate->interp); - tstate; - tstate = PyThreadState_Next(tstate)) - if (tstate->dict) { - PyObject *v = _PyDict_Pop(tstate->dict, self->key, Py_None); - if (v == NULL) { - PyErr_Clear(); - } - else { - Py_DECREF(v); - } + if (self->key) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); + for(; tstate; tstate = PyThreadState_Next(tstate)) { + if (tstate->dict == NULL) { + continue; } + PyObject *v = _PyDict_Pop(tstate->dict, self->key, Py_None); + if (v != NULL) { + Py_DECREF(v); + } + else { + PyErr_Clear(); + } + } } return 0; } From ffd6c4d55236189db7a866f4d94a54b74ef02373 Mon Sep 17 00:00:00 2001 From: Nicholas Sim Date: Fri, 19 Feb 2021 22:55:46 +0800 Subject: [PATCH 1183/1261] bpo-35134: Move non-limited C API files to Include/cpython/ (GH-24561) Include/{odictobject.h,parser_interface.h,picklebufobject.h,pydebug.h,pyfpe.h} into Include/cpython/. Parser: peg_api: include Python.h instead of parser_interface.h. --- Doc/whatsnew/3.10.rst | 8 +++++ Include/Python.h | 10 +++---- Include/{ => cpython}/odictobject.h | 0 Include/{ => cpython}/parser_interface.h | 0 Include/{ => cpython}/picklebufobject.h | 0 Include/{ => cpython}/pydebug.h | 0 Include/{ => cpython}/pyfpe.h | 0 Makefile.pre.in | 10 +++---- .../2021-02-18-18-46-42.bpo-35134.dFpEDT.rst | 3 ++ PCbuild/pythoncore.vcxproj | 10 +++---- PCbuild/pythoncore.vcxproj.filters | 30 +++++++++---------- Parser/peg_api.c | 2 +- Python/pythonrun.c | 2 -- Tools/scripts/stable_abi.py | 1 - 14 files changed, 42 insertions(+), 34 deletions(-) rename Include/{ => cpython}/odictobject.h (100%) rename Include/{ => cpython}/parser_interface.h (100%) rename Include/{ => cpython}/picklebufobject.h (100%) rename Include/{ => cpython}/pydebug.h (100%) rename Include/{ => cpython}/pyfpe.h (100%) create mode 100644 Misc/NEWS.d/next/C API/2021-02-18-18-46-42.bpo-35134.dFpEDT.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index b903b3e0b81d9f..c4a79b6a1e98fa 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -934,6 +934,14 @@ Porting to Python 3.10 bugs like ``if (PyList_SET_ITEM (a, b, c) < 0) ...`` test. (Contributed by Zackery Spytz and Victor Stinner in :issue:`30459`.) +* The non-limited API files ``odictobject.h``, ``parser_interface.h``, + ``picklebufobject.h``, ``pyarena.h``, ``pyctype.h``, ``pydebug.h``, + ``pyfpe.h``, and ``pytime.h`` have been moved to the ``Include/cpython`` + directory. These files must not be included directly, as they are already + included in ``Python.h``: :ref:`Include Files `. If they have + been included directly, consider including ``Python.h`` instead. + (Contributed by Nicholas Sim in :issue:`35134`) + Deprecated ---------- diff --git a/Include/Python.h b/Include/Python.h index c71a71f875e3e4..86dbbcf6bd85da 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -89,7 +89,7 @@ #include "typeslots.h" #include "pyhash.h" -#include "pydebug.h" +#include "cpython/pydebug.h" #include "bytearrayobject.h" #include "bytesobject.h" @@ -104,7 +104,7 @@ #include "tupleobject.h" #include "listobject.h" #include "dictobject.h" -#include "odictobject.h" +#include "cpython/odictobject.h" #include "enumobject.h" #include "setobject.h" #include "methodobject.h" @@ -126,7 +126,7 @@ #include "weakrefobject.h" #include "structseq.h" #include "namespaceobject.h" -#include "picklebufobject.h" +#include "cpython/picklebufobject.h" #include "cpython/pytime.h" #include "codecs.h" @@ -141,7 +141,7 @@ #include "modsupport.h" #include "compile.h" #include "pythonrun.h" -#include "parser_interface.h" +#include "cpython/parser_interface.h" #include "pylifecycle.h" #include "ceval.h" #include "sysmodule.h" @@ -158,7 +158,7 @@ #include "pystrtod.h" #include "pystrcmp.h" #include "fileutils.h" -#include "pyfpe.h" +#include "cpython/pyfpe.h" #include "tracemalloc.h" #endif /* !Py_PYTHON_H */ diff --git a/Include/odictobject.h b/Include/cpython/odictobject.h similarity index 100% rename from Include/odictobject.h rename to Include/cpython/odictobject.h diff --git a/Include/parser_interface.h b/Include/cpython/parser_interface.h similarity index 100% rename from Include/parser_interface.h rename to Include/cpython/parser_interface.h diff --git a/Include/picklebufobject.h b/Include/cpython/picklebufobject.h similarity index 100% rename from Include/picklebufobject.h rename to Include/cpython/picklebufobject.h diff --git a/Include/pydebug.h b/Include/cpython/pydebug.h similarity index 100% rename from Include/pydebug.h rename to Include/cpython/pydebug.h diff --git a/Include/pyfpe.h b/Include/cpython/pyfpe.h similarity index 100% rename from Include/pyfpe.h rename to Include/cpython/pyfpe.h diff --git a/Makefile.pre.in b/Makefile.pre.in index e4ac248d1f02e8..0f59700952989e 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -316,7 +316,7 @@ PEGEN_OBJS= \ PEGEN_HEADERS= \ - $(srcdir)/Include/parser_interface.h \ + $(srcdir)/Include/cpython/parser_interface.h \ $(srcdir)/Parser/pegen.h \ $(srcdir)/Parser/string_parser.h @@ -1056,17 +1056,13 @@ PYTHON_HEADERS= \ $(srcdir)/Include/namespaceobject.h \ $(srcdir)/Include/object.h \ $(srcdir)/Include/objimpl.h \ - $(srcdir)/Include/odictobject.h \ $(srcdir)/Include/opcode.h \ $(srcdir)/Include/osdefs.h \ $(srcdir)/Include/osmodule.h \ $(srcdir)/Include/patchlevel.h \ - $(srcdir)/Include/picklebufobject.h \ $(srcdir)/Include/pycapsule.h \ - $(srcdir)/Include/pydebug.h \ $(srcdir)/Include/pydtrace.h \ $(srcdir)/Include/pyerrors.h \ - $(srcdir)/Include/pyfpe.h \ $(srcdir)/Include/pyframe.h \ $(srcdir)/Include/pyhash.h \ $(srcdir)/Include/pylifecycle.h \ @@ -1116,9 +1112,13 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/methodobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ + $(srcdir)/Include/cpython/odictobject.h \ + $(srcdir)/Include/cpython/picklebufobject.h \ $(srcdir)/Include/cpython/pyarena.h \ $(srcdir)/Include/cpython/pyctype.h \ + $(srcdir)/Include/cpython/pydebug.h \ $(srcdir)/Include/cpython/pyerrors.h \ + $(srcdir)/Include/cpython/pyfpe.h \ $(srcdir)/Include/cpython/pylifecycle.h \ $(srcdir)/Include/cpython/pymem.h \ $(srcdir)/Include/cpython/pystate.h \ diff --git a/Misc/NEWS.d/next/C API/2021-02-18-18-46-42.bpo-35134.dFpEDT.rst b/Misc/NEWS.d/next/C API/2021-02-18-18-46-42.bpo-35134.dFpEDT.rst new file mode 100644 index 00000000000000..5384cb8288f330 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-02-18-18-46-42.bpo-35134.dFpEDT.rst @@ -0,0 +1,3 @@ +Move odictobject.h, parser_interface.h, picklebufobject.h, pydebug.h, and +pyfpe.h into the cpython/ directory. They must not be included directly, as +they are already included by Python.h: :ref:`Include Files `. diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 89b6218a2739a5..92355a886d91a7 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -142,9 +142,14 @@ + + + + + @@ -220,19 +225,14 @@ - - - - - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index bd8fd3433bce0a..d0b69dbc5b64fd 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -171,27 +171,18 @@ Include - - Include - Include Include - - Include - Include Include - - Include - Include @@ -378,9 +369,6 @@ Modules - - Include - Parser @@ -420,6 +408,9 @@ Include\cpython + + Include + Include\cpython @@ -432,15 +423,27 @@ Include\cpython + + Include + + + Include + Include Include + + Include + Include\cpython + + Include + Include\cpython @@ -474,9 +477,6 @@ Include\cpython - - Include - Include\internal diff --git a/Parser/peg_api.c b/Parser/peg_api.c index 8381d5e86b0db5..1555dea51c2d97 100644 --- a/Parser/peg_api.c +++ b/Parser/peg_api.c @@ -1,4 +1,4 @@ -#include "parser_interface.h" +#include "Python.h" #include "tokenizer.h" #include "pegen.h" diff --git a/Python/pythonrun.c b/Python/pythonrun.c index dacf1a647106fb..338a1b96d39e1b 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -26,8 +26,6 @@ #include "symtable.h" // PySymtable_BuildObject() #include "marshal.h" // PyMarshal_ReadLongFromFile() -#include "parser_interface.h" // PyParser_ASTFrom* - #ifdef MS_WINDOWS # include "malloc.h" // alloca() #endif diff --git a/Tools/scripts/stable_abi.py b/Tools/scripts/stable_abi.py index 44f426e096adcf..cc1009da1bde25 100755 --- a/Tools/scripts/stable_abi.py +++ b/Tools/scripts/stable_abi.py @@ -23,7 +23,6 @@ "longintrepr.h", "parsetok.h", "pyatomic.h", - "pydebug.h", "pytime.h", "symtable.h", "token.h", From 7567f36b210f2b18c157918df8a82548740b687f Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Fri, 19 Feb 2021 16:32:31 +0100 Subject: [PATCH 1184/1261] closes bpo-43266: Improve array formatting. (GH-24573) --- Doc/c-api/conversion.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index e47072f04747ab..7b4cc1cacdd4ab 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -25,7 +25,7 @@ functions :c:func:`snprintf` and :c:func:`vsnprintf`. Their purpose is to guarantee consistent behavior in corner cases, which the Standard C functions do not. -The wrappers ensure that *str*[*size*-1] is always ``'\0'`` upon return. They +The wrappers ensure that ``str[size-1]`` is always ``'\0'`` upon return. They never write more than *size* bytes (including the trailing ``'\0'``) into str. Both functions require that ``str != NULL``, ``size > 0``, ``format != NULL`` and ``size < INT_MAX``. @@ -34,13 +34,13 @@ The return value (*rv*) for these functions should be interpreted as follows: * When ``0 <= rv < size``, the output conversion was successful and *rv* characters were written to *str* (excluding the trailing ``'\0'`` byte at - *str*[*rv*]). + ``str[rv]``). * When ``rv >= size``, the output conversion was truncated and a buffer with - ``rv + 1`` bytes would have been needed to succeed. *str*[*size*-1] is ``'\0'`` + ``rv + 1`` bytes would have been needed to succeed. ``str[size-1]`` is ``'\0'`` in this case. -* When ``rv < 0``, "something bad happened." *str*[*size*-1] is ``'\0'`` in +* When ``rv < 0``, "something bad happened." ``str[size-1]`` is ``'\0'`` in this case too, but the rest of *str* is undefined. The exact cause of the error depends on the underlying platform. From 176b0e8ded80ab7293438d88bae7c4952b0bf6d9 Mon Sep 17 00:00:00 2001 From: Austin Lamb Date: Fri, 19 Feb 2021 15:27:01 -0800 Subject: [PATCH 1185/1261] bpo-42825: Enable /OPT:REF (GH-24098) We explicitly disable /OPT:ICF as some manual optimisations depend on some functions still having distinct pointers (such as wrap_binary_func and wrap_binary_func_l). --- PCbuild/pyproject.props | 1 + 1 file changed, 1 insertion(+) diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 98e5ab030321db..834b27c86d42c8 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -74,6 +74,7 @@ PGInstrument PGUpdate advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;%(AdditionalDependencies) + /OPT:REF,NOICF %(AdditionalOptions) true From 7cf29190ef5f6a95623b7fa8af417348c2211842 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Fri, 19 Feb 2021 19:26:21 -0500 Subject: [PATCH 1186/1261] bpo-43042: Augment tutorial sentence (GH-24514) Calling same function also gets new local namespace. --- Doc/tutorial/controlflow.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index b8aec2b04f13fb..9ee18f75847e7b 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -297,7 +297,8 @@ referenced. The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are passed using *call by value* (where the *value* is always an object *reference*, -not the value of the object). [#]_ When a function calls another function, a new +not the value of the object). [#]_ When a function calls another function, +or calls itself recursively, a new local symbol table is created for that call. A function definition associates the function name with the function object in From 6e8fadcd3728c8eb2bcef22dfe71dd9057551d0a Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Sat, 20 Feb 2021 04:22:37 +0000 Subject: [PATCH 1187/1261] Fix typo in dis module doc (GH-24509) --- Doc/library/dis.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index f3b25383c53d1e..dad836997c0af0 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -346,7 +346,7 @@ The Python compiler currently generates the following bytecode instructions. .. opcode:: ROT_FOUR - Lifts second, third and forth stack items one position up, moves top down + Lifts second, third and fourth stack items one position up, moves top down to position four. .. versionadded:: 3.8 From 116b71e25c1062450f0bab5f0453858f88b01cb7 Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Sat, 20 Feb 2021 19:03:50 +0900 Subject: [PATCH 1188/1261] Fix typo in launcher.c (GH-24497) --- PC/launcher.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PC/launcher.c b/PC/launcher.c index cc2d35b2c4cb7c..f5b225ac08cfe1 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -1552,8 +1552,8 @@ Launcher arguments:\n\n\ fputws(L"\nany of the following, (in priority order):", stdout); fputws(L"\n An active virtual environment", stdout); fputws(L"\n A shebang line in the script (if present)", stdout); - fputws(L"\n With -2 or -3 flag a matching PY_PYTHON2 or PY_PYTHON3 Enviroment variable", stdout); - fputws(L"\n A PY_PYTHON Enviroment variable", stdout); + fputws(L"\n With -2 or -3 flag a matching PY_PYTHON2 or PY_PYTHON3 Environment variable", stdout); + fputws(L"\n A PY_PYTHON Environment variable", stdout); fputws(L"\n From [defaults] in py.ini in your %LOCALAPPDATA%\\py.ini", stdout); fputws(L"\n From [defaults] in py.ini beside py.exe (use `where py` to locate)", stdout); fputws(L"\n\nThe following help text is from Python:\n\n", stdout); From 3e7db1a1cac46ece3279511a45a81003fdba0bb0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 20 Feb 2021 15:17:18 +0100 Subject: [PATCH 1189/1261] bpo-42990: Functions inherit current builtins (GH-24564) The types.FunctionType constructor now inherits the current builtins if the globals dictionary has no "__builtins__" key, rather than using {"None": None} as builtins: same behavior as eval() and exec() functions. Defining a function with "def function(...): ..." in Python is not affected, globals cannot be overriden with this syntax: it also inherits the current builtins. PyFrame_New(), PyEval_EvalCode(), PyEval_EvalCodeEx(), PyFunction_New() and PyFunction_NewWithQualName() now inherits the current builtins namespace if the globals dictionary has no "__builtins__" key. * Add _PyEval_GetBuiltins() function. * _PyEval_BuiltinsFromGlobals() now uses _PyEval_GetBuiltins() if builtins cannot be found in globals. * Add tstate parameter to _PyEval_BuiltinsFromGlobals(). --- Doc/whatsnew/3.10.rst | 11 +++++++- Include/internal/pycore_ceval.h | 5 +++- Lib/test/test_funcattrs.py | 27 ++++++++++++++++++ .../2021-02-18-15-12-30.bpo-42990.toAqBH.rst | 7 +++++ Objects/frameobject.c | 19 +++---------- Objects/funcobject.c | 8 ++++-- Python/ceval.c | 28 +++++++++++-------- 7 files changed, 74 insertions(+), 31 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-02-18-15-12-30.bpo-42990.toAqBH.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index c4a79b6a1e98fa..2ceb26fabb8e74 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -282,7 +282,8 @@ Other Language Changes * Functions have a new ``__builtins__`` attribute which is used to look for builtin symbols when a function is executed, instead of looking into - ``__globals__['__builtins__']``. + ``__globals__['__builtins__']``. The attribute is initialized from + ``__globals__["__builtins__"]`` if it exists, else from the current builtins. (Contributed by Mark Shannon in :issue:`42990`.) @@ -789,6 +790,14 @@ Changes in the Python API (Contributed by Yurii Karabas, Andrew Svetlov, Yury Selivanov and Kyle Stanley in :issue:`42392`.) +* The :data:`types.FunctionType` constructor now inherits the current builtins + if the *globals* dictionary has no ``"__builtins__"`` key, rather than using + ``{"None": None}`` as builtins: same behavior as :func:`eval` and + :func:`exec` functions. Defining a function with ``def function(...): ...`` + in Python is not affected, globals cannot be overriden with this syntax: it + also inherits the current builtins. + (Contributed by Victor Stinner in :issue:`42990`.) + CPython bytecode changes ======================== diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 78a7056f2e7c3e..f07959da770d96 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -34,7 +34,10 @@ PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth( void _PyEval_Fini(void); -extern PyObject *_PyEval_BuiltinsFromGlobals(PyObject *globals); +extern PyObject* _PyEval_GetBuiltins(PyThreadState *tstate); +extern PyObject *_PyEval_BuiltinsFromGlobals( + PyThreadState *tstate, + PyObject *globals); static inline PyObject* diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py index 15cf250f192a95..77977d0ae966f8 100644 --- a/Lib/test/test_funcattrs.py +++ b/Lib/test/test_funcattrs.py @@ -1,3 +1,4 @@ +import textwrap import types import unittest @@ -78,6 +79,32 @@ def test___builtins__(self): self.cannot_set_attr(self.b, '__builtins__', 2, (AttributeError, TypeError)) + # bpo-42990: If globals is specified and has no "__builtins__" key, + # a function inherits the current builtins namespace. + def func(s): return len(s) + ns = {} + func2 = type(func)(func.__code__, ns) + self.assertIs(func2.__globals__, ns) + self.assertIs(func2.__builtins__, __builtins__) + + # Make sure that the function actually works. + self.assertEqual(func2("abc"), 3) + self.assertEqual(ns, {}) + + # Define functions using exec() with different builtins, + # and test inheritance when globals has no "__builtins__" key + code = textwrap.dedent(""" + def func3(s): pass + func4 = type(func3)(func3.__code__, {}) + """) + safe_builtins = {'None': None} + ns = {'type': type, '__builtins__': safe_builtins} + exec(code, ns) + self.assertIs(ns['func3'].__builtins__, safe_builtins) + self.assertIs(ns['func4'].__builtins__, safe_builtins) + self.assertIs(ns['func3'].__globals__['__builtins__'], safe_builtins) + self.assertNotIn('__builtins__', ns['func4'].__globals__) + def test___closure__(self): a = 12 def f(): print(a) diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-18-15-12-30.bpo-42990.toAqBH.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-18-15-12-30.bpo-42990.toAqBH.rst new file mode 100644 index 00000000000000..b9e66471e6893c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-18-15-12-30.bpo-42990.toAqBH.rst @@ -0,0 +1,7 @@ +The :data:`types.FunctionType` constructor now inherits the current builtins if +the *globals* dictionary has no ``"__builtins__"`` key, rather than using +``{"None": None}`` as builtins: same behavior as :func:`eval` and :func:`exec` +functions. Defining a function with ``def function(...): ...`` in Python is +not affected, globals cannot be overriden with this syntax: it also inherits +the current builtins. +Patch by Victor Stinner. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 0571bfed9c0766..056d42a0d9ebb4 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -847,7 +847,7 @@ PyFrameObject* PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals, PyObject *locals) { - PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); + PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); if (builtins == NULL) { return NULL; } @@ -862,7 +862,6 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, .fc_closure = NULL }; PyFrameObject *f = _PyFrame_New_NoTrack(tstate, &desc, locals); - Py_DECREF(builtins); if (f) { _PyObject_GC_TRACK(f); } @@ -1163,7 +1162,7 @@ PyFrame_GetBack(PyFrameObject *frame) } PyObject* -_PyEval_BuiltinsFromGlobals(PyObject *globals) +_PyEval_BuiltinsFromGlobals(PyThreadState *tstate, PyObject *globals) { PyObject *builtins = _PyDict_GetItemIdWithError(globals, &PyId___builtins__); if (builtins) { @@ -1171,21 +1170,11 @@ _PyEval_BuiltinsFromGlobals(PyObject *globals) builtins = PyModule_GetDict(builtins); assert(builtins != NULL); } - return Py_NewRef(builtins); + return builtins; } - if (PyErr_Occurred()) { return NULL; } - /* No builtins! Make up a minimal one. Give them 'None', at least. */ - builtins = PyDict_New(); - if (builtins == NULL) { - return NULL; - } - if (PyDict_SetItemString(builtins, "None", Py_None) < 0) { - Py_DECREF(builtins); - return NULL; - } - return builtins; + return _PyEval_GetBuiltins(tstate); } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 4b92f6c0342d92..36df88a28100d0 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -4,6 +4,7 @@ #include "Python.h" #include "pycore_ceval.h" // _PyEval_BuiltinsFromGlobals() #include "pycore_object.h" // _PyObject_GC_UNTRACK() +#include "pycore_pyerrors.h" // _PyErr_Occurred() #include "structmember.h" // PyMemberDef PyObject * @@ -13,6 +14,8 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname assert(PyDict_Check(globals)); Py_INCREF(globals); + PyThreadState *tstate = _PyThreadState_GET(); + PyCodeObject *code_obj = (PyCodeObject *)code; Py_INCREF(code_obj); @@ -42,15 +45,16 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname _Py_IDENTIFIER(__name__); PyObject *module = _PyDict_GetItemIdWithError(globals, &PyId___name__); PyObject *builtins = NULL; - if (module == NULL && PyErr_Occurred()) { + if (module == NULL && _PyErr_Occurred(tstate)) { goto error; } Py_XINCREF(module); - builtins = _PyEval_BuiltinsFromGlobals(globals); + builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); if (builtins == NULL) { goto error; } + Py_INCREF(builtins); PyFunctionObject *op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type); if (op == NULL) { diff --git a/Python/ceval.c b/Python/ceval.c index 7ccb8fcf5ae541..e2b2d211fb3408 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -889,10 +889,11 @@ static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **); PyObject * PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) { + PyThreadState *tstate = PyThreadState_GET(); if (locals == NULL) { locals = globals; } - PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); + PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); if (builtins == NULL) { return NULL; } @@ -906,10 +907,7 @@ PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) .fc_kwdefaults = NULL, .fc_closure = NULL }; - PyThreadState *tstate = PyThreadState_GET(); - PyObject *res = _PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL); - Py_DECREF(builtins); - return res; + return _PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL); } @@ -4733,12 +4731,13 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, PyObject *const *defs, int defcount, PyObject *kwdefs, PyObject *closure) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject *res; PyObject *defaults = _PyTuple_FromArray(defs, defcount); if (defaults == NULL) { return NULL; } - PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); + PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); if (builtins == NULL) { Py_DECREF(defaults); return NULL; @@ -4797,7 +4796,6 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, .fc_kwdefaults = kwdefs, .fc_closure = closure }; - PyThreadState *tstate = _PyThreadState_GET(); res = _PyEval_Vector(tstate, &constr, locals, allargs, argcount, kwnames); @@ -5315,15 +5313,21 @@ PyEval_GetFrame(void) return tstate->frame; } +PyObject * +_PyEval_GetBuiltins(PyThreadState *tstate) +{ + PyFrameObject *frame = tstate->frame; + if (frame != NULL) { + return frame->f_builtins; + } + return tstate->interp->builtins; +} + PyObject * PyEval_GetBuiltins(void) { PyThreadState *tstate = _PyThreadState_GET(); - PyFrameObject *current_frame = tstate->frame; - if (current_frame == NULL) - return tstate->interp->builtins; - else - return current_frame->f_builtins; + return _PyEval_GetBuiltins(tstate); } /* Convenience function to get a builtin from its name */ From e71b7712a9941b6dcf040eb3331b36f94183ff08 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sat, 20 Feb 2021 18:03:08 +0000 Subject: [PATCH 1190/1261] bpo-43277: Add PySet_CheckExact to the C-API (GH-24598) For some mysterious reason we have PySet_Check, PyFrozenSet_Check, PyAnySet_Check, PyAnySet_CheckExact and PyFrozenSet_CheckExact but no PySet_CheckExact. --- Doc/c-api/set.rst | 6 ++++++ Doc/whatsnew/3.10.rst | 3 +++ Include/setobject.h | 9 ++++++--- .../2021-02-20-16-50-22.bpo-43277.FXkRXk.rst | 3 +++ Objects/dictobject.c | 2 +- Objects/setobject.c | 2 +- 6 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-02-20-16-50-22.bpo-43277.FXkRXk.rst diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst index 84f34e7dae80be..eca19c4d816474 100644 --- a/Doc/c-api/set.rst +++ b/Doc/c-api/set.rst @@ -65,6 +65,12 @@ the constructor functions work with any iterable Python object. Return true if *p* is a :class:`set` object, a :class:`frozenset` object, or an instance of a subtype. This function always succeeds. +.. c:function:: int PySet_CheckExact(PyObject *p) + + Return true if *p* is a :class:`set` object but not an instance of a + subtype. This function always succeeds. + + .. versionadded:: 3.10 .. c:function:: int PyAnySet_CheckExact(PyObject *p) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 2ceb26fabb8e74..d353f33c718019 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -893,6 +893,9 @@ New Features * The :c:func:`PyType_GetSlot` function can accept static types. (Contributed by Hai Shi and Petr Viktorin in :issue:`41073`.) +* Add a new :c:func:`PySet_CheckExact` function to the C-API to check if an + object is an instance of :class:`set` but not an instance of a subtype. + (Contributed by Pablo Galindo in :issue:`43277`.) Porting to Python 3.10 ---------------------- diff --git a/Include/setobject.h b/Include/setobject.h index 119619ebe72994..62516be5ab29be 100644 --- a/Include/setobject.h +++ b/Include/setobject.h @@ -88,18 +88,21 @@ PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set); PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); #define PyFrozenSet_CheckExact(ob) Py_IS_TYPE(ob, &PyFrozenSet_Type) +#define PyFrozenSet_Check(ob) \ + (Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) + #define PyAnySet_CheckExact(ob) \ (Py_IS_TYPE(ob, &PySet_Type) || Py_IS_TYPE(ob, &PyFrozenSet_Type)) #define PyAnySet_Check(ob) \ (Py_IS_TYPE(ob, &PySet_Type) || Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) + +#define PySet_CheckExact(op) Py_IS_TYPE(op, &PySet_Type) #define PySet_Check(ob) \ (Py_IS_TYPE(ob, &PySet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) -#define PyFrozenSet_Check(ob) \ - (Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ - PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) #ifdef __cplusplus } diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-20-16-50-22.bpo-43277.FXkRXk.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-20-16-50-22.bpo-43277.FXkRXk.rst new file mode 100644 index 00000000000000..64e57911bbe7e6 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-20-16-50-22.bpo-43277.FXkRXk.rst @@ -0,0 +1,3 @@ +Add a new :c:func:`PySet_CheckExact` function to the C-API to check if an +object is an instance of :class:`set` but not an instance of a subtype. +Patch by Pablo Galindo. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 9b5898d13a880f..773eda0d75a9c8 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -4482,7 +4482,7 @@ _PyDictView_Intersect(PyObject* self, PyObject *other) /* if other is a set and self is smaller than other, reuse set intersection logic */ - if (Py_IS_TYPE(other, &PySet_Type) && len_self <= PyObject_Size(other)) { + if (PySet_CheckExact(other) && len_self <= PyObject_Size(other)) { _Py_IDENTIFIER(intersection); return _PyObject_CallMethodIdObjArgs(other, &PyId_intersection, self, NULL); } diff --git a/Objects/setobject.c b/Objects/setobject.c index 79e84511926e15..bfe6917b79b7a9 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -522,7 +522,7 @@ set_repr(PySetObject *so) goto done; listrepr = tmp; - if (!Py_IS_TYPE(so, &PySet_Type)) + if (!PySet_CheckExact(so)) result = PyUnicode_FromFormat("%s({%U})", Py_TYPE(so)->tp_name, listrepr); From c10eb82fed5868f97466fccff036b097cb94a034 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Sun, 21 Feb 2021 01:29:19 +0100 Subject: [PATCH 1191/1261] bpo-43269: Clean up sqlite3 file scope (GH-24578) --- Modules/_sqlite/cache.c | 15 ++++++++++----- Modules/_sqlite/connection.c | 20 ++++++++++++++------ Modules/_sqlite/cursor.c | 5 ++--- Modules/_sqlite/prepare_protocol.c | 7 +++++-- Modules/_sqlite/row.c | 6 ++++-- Modules/_sqlite/statement.c | 3 ++- 6 files changed, 37 insertions(+), 19 deletions(-) diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c index 078a484b86cee6..ec4a22fb7a2d80 100644 --- a/Modules/_sqlite/cache.c +++ b/Modules/_sqlite/cache.c @@ -25,7 +25,8 @@ #include /* only used internally */ -pysqlite_Node* pysqlite_new_node(PyObject* key, PyObject* data) +static pysqlite_Node * +pysqlite_new_node(PyObject *key, PyObject *data) { pysqlite_Node* node; @@ -43,7 +44,8 @@ pysqlite_Node* pysqlite_new_node(PyObject* key, PyObject* data) return node; } -void pysqlite_node_dealloc(pysqlite_Node* self) +static void +pysqlite_node_dealloc(pysqlite_Node *self) { PyTypeObject *tp = Py_TYPE(self); @@ -54,7 +56,8 @@ void pysqlite_node_dealloc(pysqlite_Node* self) Py_DECREF(tp); } -int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs) +static int +pysqlite_cache_init(pysqlite_Cache *self, PyObject *args, PyObject *kwargs) { PyObject* factory; int size = 10; @@ -85,7 +88,8 @@ int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs) return 0; } -void pysqlite_cache_dealloc(pysqlite_Cache* self) +static void +pysqlite_cache_dealloc(pysqlite_Cache *self) { PyTypeObject *tp = Py_TYPE(self); pysqlite_Node* node; @@ -217,7 +221,8 @@ PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* key) return Py_NewRef(node->data); } -PyObject* pysqlite_cache_display(pysqlite_Cache* self, PyObject* args) +static PyObject * +pysqlite_cache_display(pysqlite_Cache *self, PyObject *args) { pysqlite_Node* ptr; PyObject* prevkey; diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 81f12e83c2fe11..34ba29be3497f0 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -57,8 +57,9 @@ static const char * const begin_statements[] = { static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level, void *Py_UNUSED(ignored)); static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self); - -int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) +static int +pysqlite_connection_init(pysqlite_Connection *self, PyObject *args, + PyObject *kwargs) { static char *kwlist[] = { "database", "timeout", "detect_types", "isolation_level", @@ -193,7 +194,9 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject } /* action in (ACTION_RESET, ACTION_FINALIZE) */ -void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset_cursors) +static void +pysqlite_do_all_statements(pysqlite_Connection *self, int action, + int reset_cursors) { int i; PyObject* weakref; @@ -225,7 +228,8 @@ void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset } } -void pysqlite_connection_dealloc(pysqlite_Connection* self) +static void +pysqlite_connection_dealloc(pysqlite_Connection *self) { PyTypeObject *tp = Py_TYPE(self); @@ -546,7 +550,9 @@ _pysqlite_set_result(sqlite3_context* context, PyObject* py_val) return 0; } -PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_value** argv) +static PyObject * +_pysqlite_build_py_params(sqlite3_context *context, int argc, + sqlite3_value **argv) { PyObject* args; int i; @@ -1288,7 +1294,9 @@ pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* iso return 0; } -PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) +static PyObject * +pysqlite_connection_call(pysqlite_Connection *self, PyObject *args, + PyObject *kwargs) { PyObject* sql; pysqlite_Statement* statement; diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index d1578ad6aafb81..9058aabb5fc067 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -32,8 +32,6 @@ class _sqlite3.Cursor "pysqlite_Cursor *" "pysqlite_CursorType" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=b2072d8db95411d5]*/ -PyObject* pysqlite_cursor_iternext(pysqlite_Cursor* self); - static const char errmsg_fetch_across_rollback[] = "Cursor needed to be reset because of commit/rollback and can no longer be fetched from."; /*[clinic input] @@ -746,7 +744,8 @@ pysqlite_cursor_executescript(pysqlite_Cursor *self, PyObject *script_obj) } } -PyObject* pysqlite_cursor_iternext(pysqlite_Cursor *self) +static PyObject * +pysqlite_cursor_iternext(pysqlite_Cursor *self) { PyObject* next_row_tuple; PyObject* next_row; diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c index 089d66b9810857..ad793324b94b5b 100644 --- a/Modules/_sqlite/prepare_protocol.c +++ b/Modules/_sqlite/prepare_protocol.c @@ -23,12 +23,15 @@ #include "prepare_protocol.h" -int pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol* self, PyObject* args, PyObject* kwargs) +static int +pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol *self, PyObject *args, + PyObject *kwargs) { return 0; } -void pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol* self) +static void +pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol *self) { PyTypeObject *tp = Py_TYPE(self); diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c index 04e308fa1c350c..97a5a17ada9d0b 100644 --- a/Modules/_sqlite/row.c +++ b/Modules/_sqlite/row.c @@ -31,7 +31,8 @@ class _sqlite3.Row "pysqlite_Row *" "pysqlite_RowType" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=384227da65f250fd]*/ -void pysqlite_row_dealloc(pysqlite_Row* self) +static void +pysqlite_row_dealloc(pysqlite_Row *self) { PyTypeObject *tp = Py_TYPE(self); @@ -105,7 +106,8 @@ equal_ignore_case(PyObject *left, PyObject *right) return 1; } -PyObject* pysqlite_row_subscript(pysqlite_Row* self, PyObject* idx) +static PyObject * +pysqlite_row_subscript(pysqlite_Row *self, PyObject *idx) { Py_ssize_t _idx; Py_ssize_t nitems, i; diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index b62de58109eddc..f179eee16f4d40 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -368,7 +368,8 @@ void pysqlite_statement_mark_dirty(pysqlite_Statement* self) self->in_use = 1; } -void pysqlite_statement_dealloc(pysqlite_Statement* self) +static void +pysqlite_statement_dealloc(pysqlite_Statement *self) { PyTypeObject *tp = Py_TYPE(self); From fba7b0885cfe44e59844fb2f28185e656af37c5a Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sat, 20 Feb 2021 21:33:25 -0500 Subject: [PATCH 1192/1261] bpo-27646: Say that 'yield from' expression can be any iterable (GH-24595) Previously, the doc at least strongly implied that it had to be an iterator. --- Doc/reference/expressions.rst | 4 ++-- .../Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index c8c9b4683e62d2..17705b117c372b 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -478,8 +478,8 @@ allowing any pending :keyword:`finally` clauses to execute. .. index:: single: from; yield from expression -When ``yield from `` is used, it treats the supplied expression as -a subiterator. All values produced by that subiterator are passed directly +When ``yield from `` is used, the supplied expression must be an +iterable. The values produced by iterating that iterable are passed directly to the caller of the current generator's methods. Any values passed in with :meth:`~generator.send` and any exceptions passed in with :meth:`~generator.throw` are passed to the underlying iterator if it has the diff --git a/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst b/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst new file mode 100644 index 00000000000000..8ba398adf61826 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst @@ -0,0 +1,2 @@ +Clarify that 'yield from ' works with any iterable, not just +iterators. From c89b7ffb89d9881b25972a20f8475a6d02543372 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sun, 21 Feb 2021 02:44:11 -0500 Subject: [PATCH 1193/1261] bpo-43283: Rearrange some IDLE doc paragraphs. (GH-24604) In the Running User Code section, gather together paragraphs about two processes and the sys.stdstream replacements, preparing to add another. --- Doc/library/idle.rst | 29 ++++++++++++++-------------- Lib/idlelib/help.html | 44 +++++++++++++++++++++---------------------- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index e7eaabd8bfa25a..fc45e3161bc6d5 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -726,28 +726,29 @@ with objects that get input from and send output to the Shell window. The original values stored in ``sys.__stdin__``, ``sys.__stdout__``, and ``sys.__stderr__`` are not touched, but may be ``None``. -When Shell has the focus, it controls the keyboard and screen. This is -normally transparent, but functions that directly access the keyboard -and screen will not work. These include system-specific functions that -determine whether a key has been pressed and if so, which. - IDLE's standard stream replacements are not inherited by subprocesses -created in the execution process, whether directly by user code or by modules -such as multiprocessing. If such subprocess use ``input`` from sys.stdin -or ``print`` or ``write`` to sys.stdout or sys.stderr, +created in the execution process, whether directly by user code or by +modules such as multiprocessing. If such subprocess use ``input`` from +sys.stdin or ``print`` or ``write`` to sys.stdout or sys.stderr, IDLE should be started in a command line window. The secondary subprocess will then be attached to that window for input and output. -The IDLE code running in the execution process adds frames to the call stack -that would not be there otherwise. IDLE wraps ``sys.getrecursionlimit`` and -``sys.setrecursionlimit`` to reduce the effect of the additional stack frames. - If ``sys`` is reset by user code, such as with ``importlib.reload(sys)``, IDLE's changes are lost and input from the keyboard and output to the screen will not work correctly. -When user code raises SystemExit either directly or by calling sys.exit, IDLE -returns to a Shell prompt instead of exiting. +When Shell has the focus, it controls the keyboard and screen. This is +normally transparent, but functions that directly access the keyboard +and screen will not work. These include system-specific functions that +determine whether a key has been pressed and if so, which. + +The IDLE code running in the execution process adds frames to the call stack +that would not be there otherwise. IDLE wraps ``sys.getrecursionlimit`` and +``sys.setrecursionlimit`` to reduce the effect of the additional stack +frames. + +When user code raises SystemExit either directly or by calling sys.exit, +IDLE returns to a Shell prompt instead of exiting. User output in Shell ^^^^^^^^^^^^^^^^^^^^ diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 170999e1280173..1eefa506e2c8d9 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -5,7 +5,7 @@ - IDLE — Python 3.10.0a1 documentation + IDLE — Python 3.10.0a5 documentation @@ -18,7 +18,7 @@ @@ -32,7 +32,6 @@ -